summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:49:51 +0100
committerLorry <lorry@roadtrain.codethink.co.uk>2012-08-22 14:49:51 +0100
commita498da43c7fdb9f24b73680c02a4a3588cc62d9a (patch)
treedaf8119dae1749b5165b68033a1b23a7375ce9ce
downloadmercurial-tarball-a498da43c7fdb9f24b73680c02a4a3588cc62d9a.tar.gz
Tarball conversion
-rw-r--r--.hgignore57
-rw-r--r--.hgsigs58
-rw-r--r--.hgtags71
-rw-r--r--CONTRIBUTORS41
-rw-r--r--COPYING339
-rw-r--r--Makefile118
-rw-r--r--PKG-INFO10
-rw-r--r--README20
-rw-r--r--contrib/bash_completion593
-rwxr-xr-xcontrib/buildrpm110
-rw-r--r--contrib/casesmash.py34
-rwxr-xr-xcontrib/check-code.py450
-rwxr-xr-xcontrib/convert-repo27
-rwxr-xr-xcontrib/debugcmdserver.py47
-rw-r--r--contrib/debugshell.py21
-rwxr-xr-xcontrib/dumprevlog25
-rwxr-xr-xcontrib/hg-ssh86
-rw-r--r--contrib/hgfixes/__init__.py0
-rw-r--r--contrib/hgfixes/fix_bytes.py97
-rw-r--r--contrib/hgfixes/fix_bytesmod.py63
-rw-r--r--contrib/hgfixes/fix_leftover_imports.py108
-rwxr-xr-xcontrib/hgk4061
-rw-r--r--contrib/hgsh/Makefile13
-rw-r--r--contrib/hgsh/hgsh.c440
-rwxr-xr-xcontrib/hgweb.fcgi19
-rw-r--r--contrib/hgweb.wsgi18
-rw-r--r--contrib/logo-droplets.svg5
-rw-r--r--contrib/macosx/Readme.html37
-rw-r--r--contrib/macosx/Welcome.html20
-rw-r--r--contrib/macosx/macosx-build.txt11
-rw-r--r--contrib/memory.py36
-rw-r--r--contrib/mercurial.el1293
-rwxr-xr-xcontrib/mercurial.spec87
-rw-r--r--contrib/mergetools.hgrc123
-rw-r--r--contrib/mq.el417
-rw-r--r--contrib/perf.py252
-rwxr-xr-xcontrib/plan9/9diff42
-rw-r--r--contrib/plan9/README39
-rw-r--r--contrib/plan9/hgrc.d/9diff.rc7
-rw-r--r--contrib/plan9/hgrc.d/factotum.rc4
-rw-r--r--contrib/plan9/mkfile37
-rw-r--r--contrib/plan9/proto24
-rw-r--r--contrib/pylintrc313
-rw-r--r--contrib/python-hook-examples.py22
-rw-r--r--contrib/sample.hgrc133
-rw-r--r--contrib/setup3k.py373
-rw-r--r--contrib/shrink-revlog.py294
-rwxr-xr-xcontrib/simplemerge67
-rw-r--r--contrib/tcsh_completion50
-rwxr-xr-xcontrib/tcsh_completion_build.sh74
-rwxr-xr-xcontrib/tmplrewrite.py23
-rwxr-xr-xcontrib/undumprevlog37
-rw-r--r--contrib/vim/HGAnnotate.vim27
-rw-r--r--contrib/vim/hg-menu.vim93
-rw-r--r--contrib/vim/hgcommand.vim1703
-rw-r--r--contrib/vim/hgtest.vim41
-rw-r--r--contrib/vim/patchreview.txt97
-rw-r--r--contrib/vim/patchreview.vim868
-rw-r--r--contrib/win32/ReadMe.html162
-rw-r--r--contrib/win32/buildlocal.bat9
-rw-r--r--contrib/win32/hg.bat12
-rw-r--r--contrib/win32/hgwebdir_wsgi.py95
-rw-r--r--contrib/win32/mercurial.icobin0 -> 2238 bytes
-rw-r--r--contrib/win32/mercurial.ini97
-rw-r--r--contrib/win32/mercurial.iss148
-rw-r--r--contrib/win32/postinstall.txt9
-rw-r--r--contrib/win32/win32-build.txt133
-rw-r--r--contrib/wix/COPYING.rtfbin0 -> 1686 bytes
-rw-r--r--contrib/wix/README.txt31
-rw-r--r--contrib/wix/contrib.wxs44
-rw-r--r--contrib/wix/defines.wxi9
-rw-r--r--contrib/wix/dist.wxs31
-rw-r--r--contrib/wix/doc.wxs50
-rw-r--r--contrib/wix/guids.wxi51
-rw-r--r--contrib/wix/help.wxs34
-rw-r--r--contrib/wix/hg.cmd3
-rw-r--r--contrib/wix/i18n.wxs26
-rw-r--r--contrib/wix/locale.wxs34
-rw-r--r--contrib/wix/mercurial.wxs172
-rw-r--r--contrib/wix/templates.wxs222
-rw-r--r--contrib/xml.rnc41
-rw-r--r--contrib/zsh_completion1077
-rw-r--r--doc/Makefile55
-rw-r--r--doc/README11
-rw-r--r--doc/common.txt8
-rw-r--r--doc/gendoc.py168
-rw-r--r--doc/hg.111408
-rw-r--r--doc/hg.1.html8975
-rw-r--r--doc/hg.1.txt119
-rw-r--r--doc/hgignore.5151
-rw-r--r--doc/hgignore.5.html129
-rw-r--r--doc/hgignore.5.txt34
-rw-r--r--doc/hgmanpage.py1110
-rw-r--r--doc/hgrc.51793
-rw-r--r--doc/hgrc.5.html1366
-rw-r--r--doc/hgrc.5.txt41
-rwxr-xr-xdoc/runrst49
-rw-r--r--doc/style.css309
-rwxr-xr-xhg38
-rwxr-xr-xhgeditor56
-rw-r--r--hgext/__init__.py1
-rw-r--r--hgext/acl.py316
-rw-r--r--hgext/bugzilla.py915
-rw-r--r--hgext/children.py50
-rw-r--r--hgext/churn.py199
-rw-r--r--hgext/color.py503
-rw-r--r--hgext/convert/__init__.py370
-rw-r--r--hgext/convert/bzr.py285
-rw-r--r--hgext/convert/common.py445
-rw-r--r--hgext/convert/convcmd.py470
-rw-r--r--hgext/convert/cvs.py272
-rw-r--r--hgext/convert/cvsps.py853
-rw-r--r--hgext/convert/darcs.py200
-rw-r--r--hgext/convert/filemap.py391
-rw-r--r--hgext/convert/git.py217
-rw-r--r--hgext/convert/gnuarch.py338
-rw-r--r--hgext/convert/hg.py395
-rw-r--r--hgext/convert/monotone.py360
-rw-r--r--hgext/convert/p4.py203
-rw-r--r--hgext/convert/subversion.py1251
-rw-r--r--hgext/convert/transport.py128
-rw-r--r--hgext/eol.py349
-rw-r--r--hgext/extdiff.py331
-rw-r--r--hgext/factotum.py120
-rw-r--r--hgext/fetch.py158
-rw-r--r--hgext/gpg.py289
-rw-r--r--hgext/graphlog.py54
-rw-r--r--hgext/hgcia.py277
-rw-r--r--hgext/hgk.py352
-rw-r--r--hgext/highlight/__init__.py64
-rw-r--r--hgext/highlight/highlight.py61
-rw-r--r--hgext/histedit.py715
-rw-r--r--hgext/inotify/__init__.py93
-rw-r--r--hgext/inotify/client.py172
-rw-r--r--hgext/inotify/common.py53
-rw-r--r--hgext/inotify/linux/__init__.py44
-rw-r--r--hgext/inotify/linux/_inotify.c649
-rw-r--r--hgext/inotify/linux/watcher.py335
-rw-r--r--hgext/inotify/linuxserver.py444
-rw-r--r--hgext/inotify/server.py492
-rw-r--r--hgext/interhg.py83
-rw-r--r--hgext/keyword.py730
-rw-r--r--hgext/largefiles/CONTRIBUTORS4
-rw-r--r--hgext/largefiles/__init__.py102
-rw-r--r--hgext/largefiles/basestore.py195
-rw-r--r--hgext/largefiles/lfcommands.py549
-rw-r--r--hgext/largefiles/lfutil.py467
-rw-r--r--hgext/largefiles/localstore.py82
-rw-r--r--hgext/largefiles/overrides.py1080
-rw-r--r--hgext/largefiles/proto.py173
-rw-r--r--hgext/largefiles/remotestore.py110
-rw-r--r--hgext/largefiles/reposetup.py475
-rw-r--r--hgext/largefiles/uisetup.py167
-rw-r--r--hgext/largefiles/wirestore.py37
-rw-r--r--hgext/mq.py3597
-rw-r--r--hgext/notify.py382
-rw-r--r--hgext/pager.py140
-rw-r--r--hgext/patchbomb.py558
-rw-r--r--hgext/progress.py295
-rw-r--r--hgext/purge.py110
-rw-r--r--hgext/rebase.py708
-rw-r--r--hgext/record.py666
-rw-r--r--hgext/relink.py184
-rw-r--r--hgext/schemes.py101
-rw-r--r--hgext/share.py75
-rw-r--r--hgext/transplant.py676
-rw-r--r--hgext/win32mbcs.py167
-rw-r--r--hgext/win32text.py172
-rw-r--r--hgext/zeroconf/Zeroconf.py1582
-rw-r--r--hgext/zeroconf/__init__.py188
-rwxr-xr-xhgweb.cgi19
-rw-r--r--i18n/da.po18328
-rw-r--r--i18n/de.po21662
-rw-r--r--i18n/el.po14801
-rw-r--r--i18n/fr.po11459
-rwxr-xr-xi18n/hggettext137
-rw-r--r--i18n/it.po14232
-rw-r--r--i18n/ja.po24050
-rw-r--r--i18n/polib.LICENSE19
-rw-r--r--i18n/polib.py1639
-rwxr-xr-xi18n/posplit56
-rw-r--r--i18n/pt_BR.po24585
-rw-r--r--i18n/ro.po16116
-rw-r--r--i18n/ru.po25398
-rw-r--r--i18n/sv.po20113
-rw-r--r--i18n/zh_CN.po11357
-rw-r--r--i18n/zh_TW.po12930
-rw-r--r--mercurial/__init__.py0
-rw-r--r--mercurial/__version__.py2
-rw-r--r--mercurial/ancestor.py91
-rw-r--r--mercurial/archival.py291
-rw-r--r--mercurial/base85.c185
-rw-r--r--mercurial/bdiff.c483
-rw-r--r--mercurial/bookmarks.py254
-rw-r--r--mercurial/bundlerepo.py387
-rw-r--r--mercurial/byterange.py460
-rw-r--r--mercurial/changegroup.py256
-rw-r--r--mercurial/changelog.py254
-rw-r--r--mercurial/cmdutil.py1931
-rw-r--r--mercurial/commands.py5895
-rw-r--r--mercurial/commandserver.py238
-rw-r--r--mercurial/config.py183
-rw-r--r--mercurial/context.py1314
-rw-r--r--mercurial/copies.py372
-rw-r--r--mercurial/dagparser.py479
-rw-r--r--mercurial/dagutil.py277
-rw-r--r--mercurial/demandimport.py155
-rw-r--r--mercurial/diffhelpers.c197
-rw-r--r--mercurial/dirstate.py797
-rw-r--r--mercurial/discovery.py369
-rw-r--r--mercurial/dispatch.py830
-rw-r--r--mercurial/encoding.py287
-rw-r--r--mercurial/error.py90
-rw-r--r--mercurial/exewrapper.c101
-rw-r--r--mercurial/extensions.py361
-rw-r--r--mercurial/fancyopts.py117
-rw-r--r--mercurial/filelog.py92
-rw-r--r--mercurial/filemerge.py369
-rw-r--r--mercurial/fileset.py465
-rw-r--r--mercurial/formatter.py71
-rw-r--r--mercurial/graphmod.py368
-rw-r--r--mercurial/hbisect.py258
-rw-r--r--mercurial/help.py203
-rw-r--r--mercurial/help/config.txt1441
-rw-r--r--mercurial/help/dates.txt36
-rw-r--r--mercurial/help/diffs.txt29
-rw-r--r--mercurial/help/environment.txt101
-rw-r--r--mercurial/help/extensions.txt33
-rw-r--r--mercurial/help/filesets.txt65
-rw-r--r--mercurial/help/glossary.txt407
-rw-r--r--mercurial/help/hgignore.txt89
-rw-r--r--mercurial/help/hgweb.txt50
-rw-r--r--mercurial/help/merge-tools.txt84
-rw-r--r--mercurial/help/multirevs.txt13
-rw-r--r--mercurial/help/patterns.txt57
-rw-r--r--mercurial/help/phases.txt84
-rw-r--r--mercurial/help/revisions.txt29
-rw-r--r--mercurial/help/revsets.txt121
-rw-r--r--mercurial/help/subrepos.txt142
-rw-r--r--mercurial/help/templates.txt40
-rw-r--r--mercurial/help/urls.txt66
-rw-r--r--mercurial/hg.py598
-rw-r--r--mercurial/hgweb/__init__.py31
-rw-r--r--mercurial/hgweb/common.py186
-rw-r--r--mercurial/hgweb/hgweb_mod.py306
-rw-r--r--mercurial/hgweb/hgwebdir_mod.py449
-rw-r--r--mercurial/hgweb/protocol.py97
-rw-r--r--mercurial/hgweb/request.py147
-rw-r--r--mercurial/hgweb/server.py320
-rw-r--r--mercurial/hgweb/webcommands.py970
-rw-r--r--mercurial/hgweb/webutil.py331
-rw-r--r--mercurial/hgweb/wsgicgi.py81
-rw-r--r--mercurial/hook.py188
-rw-r--r--mercurial/httpclient/__init__.py674
-rw-r--r--mercurial/httpclient/_readers.py195
-rw-r--r--mercurial/httpclient/socketutil.py127
-rw-r--r--mercurial/httpconnection.py284
-rw-r--r--mercurial/httppeer.py248
-rw-r--r--mercurial/i18n.py63
-rw-r--r--mercurial/ignore.py105
-rw-r--r--mercurial/keepalive.py764
-rw-r--r--mercurial/localrepo.py2605
-rw-r--r--mercurial/lock.py143
-rw-r--r--mercurial/lsprof.py109
-rw-r--r--mercurial/lsprofcalltree.py86
-rw-r--r--mercurial/mail.py255
-rw-r--r--mercurial/manifest.py206
-rw-r--r--mercurial/match.py352
-rw-r--r--mercurial/mdiff.py342
-rw-r--r--mercurial/merge.py622
-rw-r--r--mercurial/minirst.py677
-rw-r--r--mercurial/mpatch.c429
-rw-r--r--mercurial/node.py18
-rw-r--r--mercurial/obsolete.py331
-rw-r--r--mercurial/osutil.c581
-rw-r--r--mercurial/parser.py95
-rw-r--r--mercurial/parsers.c1552
-rw-r--r--mercurial/patch.py1899
-rw-r--r--mercurial/peer.py46
-rw-r--r--mercurial/phases.py387
-rw-r--r--mercurial/posix.py470
-rw-r--r--mercurial/pure/__init__.py0
-rw-r--r--mercurial/pure/base85.py75
-rw-r--r--mercurial/pure/bdiff.py87
-rw-r--r--mercurial/pure/diffhelpers.py60
-rw-r--r--mercurial/pure/mpatch.py118
-rw-r--r--mercurial/pure/osutil.py170
-rw-r--r--mercurial/pure/parsers.py89
-rw-r--r--mercurial/pushkey.py39
-rw-r--r--mercurial/pvec.py210
-rw-r--r--mercurial/py3kcompat.py72
-rw-r--r--mercurial/repair.py201
-rw-r--r--mercurial/revlog.py1312
-rw-r--r--mercurial/revset.py1856
-rw-r--r--mercurial/scmutil.py921
-rw-r--r--mercurial/setdiscovery.py199
-rw-r--r--mercurial/similar.py104
-rw-r--r--mercurial/simplemerge.py453
-rw-r--r--mercurial/sshpeer.py239
-rw-r--r--mercurial/sshserver.py151
-rw-r--r--mercurial/sslutil.py143
-rw-r--r--mercurial/statichttprepo.py154
-rw-r--r--mercurial/store.py430
-rw-r--r--mercurial/strutil.py34
-rw-r--r--mercurial/subrepo.py1273
-rw-r--r--mercurial/tags.py297
-rw-r--r--mercurial/templatefilters.py395
-rw-r--r--mercurial/templatekw.py341
-rw-r--r--mercurial/templater.py392
-rw-r--r--mercurial/templates/atom/bookmarkentry.tmpl8
-rw-r--r--mercurial/templates/atom/bookmarks.tmpl11
-rw-r--r--mercurial/templates/atom/changelog.tmpl10
-rw-r--r--mercurial/templates/atom/changelogentry.tmpl16
-rw-r--r--mercurial/templates/atom/error.tmpl17
-rw-r--r--mercurial/templates/atom/filelog.tmpl8
-rw-r--r--mercurial/templates/atom/header.tmpl2
-rw-r--r--mercurial/templates/atom/map13
-rw-r--r--mercurial/templates/atom/tagentry.tmpl8
-rw-r--r--mercurial/templates/atom/tags.tmpl11
-rw-r--r--mercurial/templates/coal/header.tmpl7
-rw-r--r--mercurial/templates/coal/map225
-rw-r--r--mercurial/templates/gitweb/bookmarks.tmpl32
-rw-r--r--mercurial/templates/gitweb/branches.tmpl32
-rw-r--r--mercurial/templates/gitweb/changelog.tmpl41
-rw-r--r--mercurial/templates/gitweb/changelogentry.tmpl14
-rw-r--r--mercurial/templates/gitweb/changeset.tmpl53
-rw-r--r--mercurial/templates/gitweb/error.tmpl33
-rw-r--r--mercurial/templates/gitweb/fileannotate.tmpl66
-rw-r--r--mercurial/templates/gitweb/filecomparison.tmpl71
-rw-r--r--mercurial/templates/gitweb/filediff.tmpl52
-rw-r--r--mercurial/templates/gitweb/filelog.tmpl43
-rw-r--r--mercurial/templates/gitweb/filerevision.tmpl65
-rw-r--r--mercurial/templates/gitweb/footer.tmpl12
-rw-r--r--mercurial/templates/gitweb/graph.tmpl118
-rw-r--r--mercurial/templates/gitweb/header.tmpl8
-rw-r--r--mercurial/templates/gitweb/help.tmpl33
-rw-r--r--mercurial/templates/gitweb/helptopics.tmpl39
-rw-r--r--mercurial/templates/gitweb/index.tmpl26
-rw-r--r--mercurial/templates/gitweb/manifest.tmpl41
-rw-r--r--mercurial/templates/gitweb/map302
-rw-r--r--mercurial/templates/gitweb/notfound.tmpl18
-rw-r--r--mercurial/templates/gitweb/search.tmpl39
-rw-r--r--mercurial/templates/gitweb/shortlog.tmpl42
-rw-r--r--mercurial/templates/gitweb/summary.tmpl66
-rw-r--r--mercurial/templates/gitweb/tags.tmpl32
-rw-r--r--mercurial/templates/map-cmdline.bisect25
-rw-r--r--mercurial/templates/map-cmdline.changelog17
-rw-r--r--mercurial/templates/map-cmdline.compact12
-rw-r--r--mercurial/templates/map-cmdline.default25
-rw-r--r--mercurial/templates/map-cmdline.xml20
-rw-r--r--mercurial/templates/monoblue/bookmarks.tmpl38
-rw-r--r--mercurial/templates/monoblue/branches.tmpl38
-rw-r--r--mercurial/templates/monoblue/changelog.tmpl42
-rw-r--r--mercurial/templates/monoblue/changelogentry.tmpl6
-rw-r--r--mercurial/templates/monoblue/changeset.tmpl65
-rw-r--r--mercurial/templates/monoblue/error.tmpl36
-rw-r--r--mercurial/templates/monoblue/fileannotate.tmpl66
-rw-r--r--mercurial/templates/monoblue/filecomparison.tmpl72
-rw-r--r--mercurial/templates/monoblue/filediff.tmpl57
-rw-r--r--mercurial/templates/monoblue/filelog.tmpl52
-rw-r--r--mercurial/templates/monoblue/filerevision.tmpl66
-rw-r--r--mercurial/templates/monoblue/footer.tmpl23
-rw-r--r--mercurial/templates/monoblue/graph.tmpl115
-rw-r--r--mercurial/templates/monoblue/header.tmpl7
-rw-r--r--mercurial/templates/monoblue/help.tmpl38
-rw-r--r--mercurial/templates/monoblue/helptopics.tmpl45
-rw-r--r--mercurial/templates/monoblue/index.tmpl39
-rw-r--r--mercurial/templates/monoblue/manifest.tmpl53
-rw-r--r--mercurial/templates/monoblue/map260
-rw-r--r--mercurial/templates/monoblue/notfound.tmpl37
-rw-r--r--mercurial/templates/monoblue/search.tmpl36
-rw-r--r--mercurial/templates/monoblue/shortlog.tmpl44
-rw-r--r--mercurial/templates/monoblue/summary.tmpl76
-rw-r--r--mercurial/templates/monoblue/tags.tmpl38
-rw-r--r--mercurial/templates/paper/bookmarks.tmpl49
-rw-r--r--mercurial/templates/paper/branches.tmpl60
-rw-r--r--mercurial/templates/paper/changeset.tmpl87
-rw-r--r--mercurial/templates/paper/diffstat.tmpl8
-rw-r--r--mercurial/templates/paper/error.tmpl47
-rw-r--r--mercurial/templates/paper/fileannotate.tmpl83
-rw-r--r--mercurial/templates/paper/filecomparison.tmpl93
-rw-r--r--mercurial/templates/paper/filediff.tmpl78
-rw-r--r--mercurial/templates/paper/filelog.tmpl74
-rw-r--r--mercurial/templates/paper/filelogentry.tmpl5
-rw-r--r--mercurial/templates/paper/filerevision.tmpl77
-rw-r--r--mercurial/templates/paper/footer.tmpl5
-rw-r--r--mercurial/templates/paper/graph.tmpl131
-rw-r--r--mercurial/templates/paper/header.tmpl7
-rw-r--r--mercurial/templates/paper/help.tmpl44
-rw-r--r--mercurial/templates/paper/helptopics.tmpl49
-rw-r--r--mercurial/templates/paper/index.tmpl26
-rw-r--r--mercurial/templates/paper/manifest.tmpl58
-rw-r--r--mercurial/templates/paper/map224
-rw-r--r--mercurial/templates/paper/notfound.tmpl12
-rw-r--r--mercurial/templates/paper/search.tmpl55
-rw-r--r--mercurial/templates/paper/shortlog.tmpl70
-rw-r--r--mercurial/templates/paper/shortlogentry.tmpl5
-rw-r--r--mercurial/templates/paper/tags.tmpl49
-rw-r--r--mercurial/templates/raw/changeset.tmpl9
-rw-r--r--mercurial/templates/raw/error.tmpl2
-rw-r--r--mercurial/templates/raw/fileannotate.tmpl5
-rw-r--r--mercurial/templates/raw/filediff.tmpl5
-rw-r--r--mercurial/templates/raw/graph.tmpl6
-rw-r--r--mercurial/templates/raw/graphedge.tmpl1
-rw-r--r--mercurial/templates/raw/graphnode.tmpl7
-rw-r--r--mercurial/templates/raw/index.tmpl2
-rw-r--r--mercurial/templates/raw/manifest.tmpl3
-rw-r--r--mercurial/templates/raw/map38
-rw-r--r--mercurial/templates/raw/notfound.tmpl2
-rw-r--r--mercurial/templates/rss/bookmarkentry.tmpl6
-rw-r--r--mercurial/templates/rss/bookmarks.tmpl6
-rw-r--r--mercurial/templates/rss/changelog.tmpl6
-rw-r--r--mercurial/templates/rss/changelogentry.tmpl7
-rw-r--r--mercurial/templates/rss/error.tmpl10
-rw-r--r--mercurial/templates/rss/filelog.tmpl6
-rw-r--r--mercurial/templates/rss/filelogentry.tmpl7
-rw-r--r--mercurial/templates/rss/header.tmpl5
-rw-r--r--mercurial/templates/rss/map12
-rw-r--r--mercurial/templates/rss/tagentry.tmpl6
-rw-r--r--mercurial/templates/rss/tags.tmpl6
-rw-r--r--mercurial/templates/spartan/branches.tmpl27
-rw-r--r--mercurial/templates/spartan/changelog.tmpl44
-rw-r--r--mercurial/templates/spartan/changelogentry.tmpl25
-rw-r--r--mercurial/templates/spartan/changeset.tmpl52
-rw-r--r--mercurial/templates/spartan/error.tmpl15
-rw-r--r--mercurial/templates/spartan/fileannotate.tmpl49
-rw-r--r--mercurial/templates/spartan/filediff.tmpl37
-rw-r--r--mercurial/templates/spartan/filelog.tmpl29
-rw-r--r--mercurial/templates/spartan/filelogentry.tmpl25
-rw-r--r--mercurial/templates/spartan/filerevision.tmpl47
-rw-r--r--mercurial/templates/spartan/footer.tmpl9
-rw-r--r--mercurial/templates/spartan/graph.tmpl86
-rw-r--r--mercurial/templates/spartan/header.tmpl7
-rw-r--r--mercurial/templates/spartan/index.tmpl19
-rw-r--r--mercurial/templates/spartan/manifest.tmpl29
-rw-r--r--mercurial/templates/spartan/map183
-rw-r--r--mercurial/templates/spartan/notfound.tmpl12
-rw-r--r--mercurial/templates/spartan/search.tmpl37
-rw-r--r--mercurial/templates/spartan/shortlog.tmpl44
-rw-r--r--mercurial/templates/spartan/shortlogentry.tmpl7
-rw-r--r--mercurial/templates/spartan/tags.tmpl27
-rw-r--r--mercurial/templates/static/background.pngbin0 -> 603 bytes
-rw-r--r--mercurial/templates/static/coal-file.pngbin0 -> 273 bytes
-rw-r--r--mercurial/templates/static/coal-folder.pngbin0 -> 284 bytes
-rw-r--r--mercurial/templates/static/excanvas.js19
-rw-r--r--mercurial/templates/static/hgicon.pngbin0 -> 792 bytes
-rw-r--r--mercurial/templates/static/hglogo.pngbin0 -> 4123 bytes
-rw-r--r--mercurial/templates/static/mercurial.js276
-rw-r--r--mercurial/templates/static/style-coal.css325
-rw-r--r--mercurial/templates/static/style-gitweb.css169
-rw-r--r--mercurial/templates/static/style-monoblue.css526
-rw-r--r--mercurial/templates/static/style-paper.css314
-rw-r--r--mercurial/templates/static/style.css105
-rw-r--r--mercurial/templates/template-vars.txt42
-rw-r--r--mercurial/transaction.py183
-rw-r--r--mercurial/treediscovery.py150
-rw-r--r--mercurial/ui.py761
-rw-r--r--mercurial/url.py474
-rw-r--r--mercurial/util.h166
-rw-r--r--mercurial/util.py1801
-rw-r--r--mercurial/verify.py303
-rw-r--r--mercurial/win32.py393
-rw-r--r--mercurial/windows.py329
-rw-r--r--mercurial/wireproto.py619
-rw-r--r--setup.py534
-rw-r--r--tests/README7
-rw-r--r--tests/autodiff.py46
-rw-r--r--tests/binfile.binbin0 -> 593 bytes
-rw-r--r--tests/blacklists/README14
-rw-r--r--tests/blacklists/inotify-failures21
-rw-r--r--tests/blacklists/linux-vfat35
-rw-r--r--tests/bundles/darcs1.hgbin0 -> 1314 bytes
-rw-r--r--tests/bundles/legacy-encoding.hgbin0 -> 548 bytes
-rw-r--r--tests/bundles/rebase-revset.hgbin0 -> 1844 bytes
-rw-r--r--tests/bundles/rebase.hgbin0 -> 1663 bytes
-rwxr-xr-xtests/bundles/rebase.sh44
-rw-r--r--tests/bundles/remote.hgbin0 -> 1768 bytes
-rwxr-xr-xtests/bundles/remote.sh32
-rwxr-xr-xtests/bundles/rename.sh30
-rw-r--r--tests/bundles/renames.hgbin0 -> 1600 bytes
-rw-r--r--tests/bundles/tampered.hgbin0 -> 1171 bytes
-rw-r--r--tests/bundles/test-keyword.hgbin0 -> 302 bytes
-rw-r--r--tests/bundles/test-manifest.hgbin0 -> 596 bytes
-rw-r--r--tests/bundles/test-merge-symlinks.hgbin0 -> 947 bytes
-rw-r--r--tests/bundles/test-no-symlinks.hgbin0 -> 558 bytes
-rw-r--r--tests/bzr-definitions19
-rw-r--r--tests/cgienv29
-rwxr-xr-xtests/dummyssh24
-rwxr-xr-xtests/filtercr.py10
-rwxr-xr-xtests/filterpyflakes.py38
-rwxr-xr-xtests/get-with-headers.py53
-rw-r--r--tests/gpg/pubring.gpgbin0 -> 597 bytes
-rw-r--r--tests/gpg/random_seedbin0 -> 600 bytes
-rw-r--r--tests/gpg/secring.gpgbin0 -> 1248 bytes
-rw-r--r--tests/gpg/trustdb.gpgbin0 -> 1280 bytes
-rw-r--r--tests/heredoctest.py19
-rwxr-xr-xtests/hghave77
-rwxr-xr-xtests/hghave.py308
-rw-r--r--tests/hgterm.ti27
-rw-r--r--tests/histedit-helpers.sh6
-rwxr-xr-xtests/killdaemons.py25
-rwxr-xr-xtests/md5sum.py42
-rw-r--r--tests/missing-comment.hgbin0 -> 1077 bytes
-rw-r--r--tests/notcapable24
-rw-r--r--tests/printenv.py49
-rwxr-xr-xtests/readlink.py13
-rwxr-xr-xtests/revlog-formatv0.py60
-rwxr-xr-xtests/run-tests.py1324
-rw-r--r--tests/sitecustomize.py5
-rwxr-xr-xtests/svn-safe-append.py25
-rw-r--r--tests/svn/branches.svndump416
-rw-r--r--tests/svn/empty.svndump129
-rw-r--r--tests/svn/encoding.svndump280
-rw-r--r--tests/svn/move.svndump569
-rw-r--r--tests/svn/replace.svndump367
-rw-r--r--tests/svn/startrev.svndump240
-rwxr-xr-xtests/svn/svndump-branches.sh73
-rwxr-xr-xtests/svn/svndump-empty.sh47
-rwxr-xr-xtests/svn/svndump-encoding.sh57
-rwxr-xr-xtests/svn/svndump-move.sh83
-rwxr-xr-xtests/svn/svndump-replace.sh81
-rwxr-xr-xtests/svn/svndump-startrev.sh45
-rwxr-xr-xtests/svn/svndump-tags.sh57
-rw-r--r--tests/svn/tags.svndump364
-rw-r--r--tests/svnxml.py51
-rw-r--r--tests/test-1102.t17
-rw-r--r--tests/test-1993.t48
-rw-r--r--tests/test-586.t92
-rw-r--r--tests/test-abort-checkin.t35
-rw-r--r--tests/test-acl.t2133
-rw-r--r--tests/test-add.t140
-rw-r--r--tests/test-addremove-similar.t102
-rw-r--r--tests/test-addremove.t48
-rw-r--r--tests/test-alias.t428
-rw-r--r--tests/test-annotate.t322
-rw-r--r--tests/test-archive-symlinks.t40
-rw-r--r--tests/test-archive.t272
-rw-r--r--tests/test-atomictempfile.py48
-rw-r--r--tests/test-atomictempfile.py.out3
-rw-r--r--tests/test-audit-path.t92
-rw-r--r--tests/test-backout.t294
-rw-r--r--tests/test-backwards-remove.t16
-rw-r--r--tests/test-bad-extension.t15
-rw-r--r--tests/test-bad-pull.t33
-rw-r--r--tests/test-basic.t57
-rw-r--r--tests/test-batching.py175
-rw-r--r--tests/test-batching.py.out32
-rw-r--r--tests/test-bdiff.py66
-rw-r--r--tests/test-bdiff.py.out24
-rw-r--r--tests/test-bheads.t375
-rw-r--r--tests/test-bisect.t510
-rw-r--r--tests/test-bisect2.t795
-rw-r--r--tests/test-bisect3.t232
-rw-r--r--tests/test-bookmarks-current.t170
-rw-r--r--tests/test-bookmarks-merge.t93
-rw-r--r--tests/test-bookmarks-pushpull.t298
-rw-r--r--tests/test-bookmarks-rebase.t66
-rw-r--r--tests/test-bookmarks-strip.t116
-rw-r--r--tests/test-bookmarks.t459
-rw-r--r--tests/test-branch-option.t132
-rw-r--r--tests/test-branch-tag-confict.t65
-rw-r--r--tests/test-branches.t412
-rw-r--r--tests/test-bundle-r.t328
-rw-r--r--tests/test-bundle-type.t100
-rw-r--r--tests/test-bundle-vs-outgoing.t145
-rw-r--r--tests/test-bundle.t603
-rw-r--r--tests/test-casecollision-merge.t209
-rw-r--r--tests/test-casecollision.t71
-rw-r--r--tests/test-casefolding.t163
-rw-r--r--tests/test-cat.t23
-rw-r--r--tests/test-changelog-exec.t55
-rw-r--r--tests/test-check-code-hg.t183
-rw-r--r--tests/test-check-code.t142
-rw-r--r--tests/test-check-pyflakes.t6
-rw-r--r--tests/test-children.t125
-rw-r--r--tests/test-churn.t162
-rw-r--r--tests/test-clone-cgi.t31
-rw-r--r--tests/test-clone-pull-corruption.t52
-rw-r--r--tests/test-clone-r.t220
-rw-r--r--tests/test-clone-update-order.t105
-rw-r--r--tests/test-clone.t567
-rw-r--r--tests/test-command-template.t1383
-rw-r--r--tests/test-commandserver.py260
-rw-r--r--tests/test-commandserver.py.out165
-rw-r--r--tests/test-commit-amend.t357
-rw-r--r--tests/test-commit-multiple.t133
-rw-r--r--tests/test-commit-unresolved.t49
-rw-r--r--tests/test-commit.t307
-rw-r--r--tests/test-committer.t65
-rw-r--r--tests/test-config-case.t11
-rw-r--r--tests/test-conflict.t33
-rw-r--r--tests/test-confused-revert.t82
-rw-r--r--tests/test-context.py32
-rw-r--r--tests/test-context.py.out4
-rw-r--r--tests/test-contrib.t306
-rw-r--r--tests/test-convert-authormap.t58
-rw-r--r--tests/test-convert-baz.t163
-rw-r--r--tests/test-convert-bzr-114.t39
-rw-r--r--tests/test-convert-bzr-directories.t193
-rw-r--r--tests/test-convert-bzr-ghosts.t38
-rw-r--r--tests/test-convert-bzr-merges.t70
-rw-r--r--tests/test-convert-bzr-treeroot.t35
-rw-r--r--tests/test-convert-bzr.t286
-rw-r--r--tests/test-convert-clonebranches.t88
-rw-r--r--tests/test-convert-cvs-branch.t193
-rw-r--r--tests/test-convert-cvs-detectmerge.t233
-rw-r--r--tests/test-convert-cvs-synthetic.t217
-rw-r--r--tests/test-convert-cvs.t461
-rw-r--r--tests/test-convert-cvsnt-mergepoints.rlog42
-rw-r--r--tests/test-convert-cvsnt-mergepoints.t207
-rw-r--r--tests/test-convert-darcs.t110
-rw-r--r--tests/test-convert-datesort.t119
-rw-r--r--tests/test-convert-filemap.t596
-rw-r--r--tests/test-convert-git.t300
-rw-r--r--tests/test-convert-hg-sink.t124
-rw-r--r--tests/test-convert-hg-source.t149
-rw-r--r--tests/test-convert-hg-startrev.t174
-rw-r--r--tests/test-convert-hg-svn.t105
-rw-r--r--tests/test-convert-mtn-rename-directory.out23
-rw-r--r--tests/test-convert-mtn.t388
-rw-r--r--tests/test-convert-p4-filetypes.t733
-rw-r--r--tests/test-convert-p4.t152
-rw-r--r--tests/test-convert-splicemap.t222
-rw-r--r--tests/test-convert-svn-branches.t103
-rw-r--r--tests/test-convert-svn-encoding.t135
-rw-r--r--tests/test-convert-svn-move.t243
-rw-r--r--tests/test-convert-svn-sink.t432
-rw-r--r--tests/test-convert-svn-source.t203
-rw-r--r--tests/test-convert-svn-startrev.t90
-rw-r--r--tests/test-convert-svn-tags.t67
-rw-r--r--tests/test-convert-tagsbranch-topology.t90
-rw-r--r--tests/test-convert-tla.t135
-rw-r--r--tests/test-convert.t447
-rw-r--r--tests/test-copy-move-merge.t64
-rw-r--r--tests/test-copy.t216
-rw-r--r--tests/test-custom-filters.t66
-rw-r--r--tests/test-debugbuilddag.t350
-rw-r--r--tests/test-debugbundle.t37
-rw-r--r--tests/test-debugcommands.t25
-rw-r--r--tests/test-debugcomplete.t276
-rw-r--r--tests/test-debugindexdot.t25
-rw-r--r--tests/test-debugrename.t18
-rw-r--r--tests/test-default-push.t38
-rw-r--r--tests/test-demandimport.py39
-rw-r--r--tests/test-demandimport.py.out15
-rw-r--r--tests/test-diff-binary-file.t40
-rw-r--r--tests/test-diff-change.t93
-rw-r--r--tests/test-diff-color.t130
-rw-r--r--tests/test-diff-copy-depth.t51
-rw-r--r--tests/test-diff-hashes.t46
-rw-r--r--tests/test-diff-ignore-whitespace.t500
-rw-r--r--tests/test-diff-issue2761.t23
-rw-r--r--tests/test-diff-newlines.t18
-rw-r--r--tests/test-diff-reverse.t44
-rw-r--r--tests/test-diff-subdir.t47
-rw-r--r--tests/test-diff-unified.t198
-rw-r--r--tests/test-diff-upgrade.t283
-rw-r--r--tests/test-diffdir.t40
-rw-r--r--tests/test-diffstat.t72
-rw-r--r--tests/test-dirstate-race.t33
-rw-r--r--tests/test-dirstate.t56
-rw-r--r--tests/test-dispatch.py33
-rw-r--r--tests/test-dispatch.py.out23
-rw-r--r--tests/test-dispatch.t58
-rw-r--r--tests/test-doctest.py44
-rw-r--r--tests/test-double-merge.t67
-rw-r--r--tests/test-duplicateoptions.py36
-rw-r--r--tests/test-empty-dir.t23
-rw-r--r--tests/test-empty-file.t47
-rw-r--r--tests/test-empty-group.t127
-rw-r--r--tests/test-empty.t55
-rw-r--r--tests/test-encode.t63
-rw-r--r--tests/test-encoding-align.t145
-rw-r--r--tests/test-encoding-textwrap.t259
-rw-r--r--tests/test-encoding.t252
-rw-r--r--tests/test-eol-add.t125
-rw-r--r--tests/test-eol-clone.t76
-rw-r--r--tests/test-eol-hook.t218
-rw-r--r--tests/test-eol-patch.t400
-rw-r--r--tests/test-eol-tag.t39
-rw-r--r--tests/test-eol-update.t152
-rw-r--r--tests/test-eol.t528
-rw-r--r--tests/test-eolfilename.t72
-rw-r--r--tests/test-excessive-merge.t101
-rw-r--r--tests/test-execute-bit.t28
-rw-r--r--tests/test-export.t147
-rw-r--r--tests/test-extdiff.t204
-rw-r--r--tests/test-extension.t561
-rw-r--r--tests/test-extra-filelog-entry.t21
-rw-r--r--tests/test-fetch.t414
-rw-r--r--tests/test-filebranch.t149
-rw-r--r--tests/test-filecache.py95
-rw-r--r--tests/test-filecache.py.out15
-rwxr-xr-xtests/test-filelog.py55
-rw-r--r--tests/test-filelog.py.out2
-rw-r--r--tests/test-flags.t151
-rw-r--r--tests/test-fncache.t119
-rw-r--r--tests/test-gendoc.t57
-rw-r--r--tests/test-getbundle.t254
-rw-r--r--tests/test-git-export.t362
-rw-r--r--tests/test-globalopts.t449
-rw-r--r--tests/test-glog.t2088
-rw-r--r--tests/test-gpg.t34
-rw-r--r--tests/test-graft.t535
-rw-r--r--tests/test-grep.t176
-rw-r--r--tests/test-hardlinks.t352
-rw-r--r--tests/test-help.t804
-rw-r--r--tests/test-hg-parseurl.py13
-rw-r--r--tests/test-hg-parseurl.py.out8
-rw-r--r--tests/test-hgcia.t94
-rw-r--r--tests/test-hghave.t3
-rw-r--r--tests/test-hgignore.t126
-rw-r--r--tests/test-hgk.t20
-rw-r--r--tests/test-hgrc.t203
-rw-r--r--tests/test-hgweb-auth.py107
-rw-r--r--tests/test-hgweb-auth.py.out196
-rw-r--r--tests/test-hgweb-commands.t1363
-rw-r--r--tests/test-hgweb-descend-empties.t144
-rw-r--r--tests/test-hgweb-diffs.t986
-rw-r--r--tests/test-hgweb-empty.t399
-rw-r--r--tests/test-hgweb-filelog.t765
-rw-r--r--tests/test-hgweb-no-path-info.t109
-rw-r--r--tests/test-hgweb-no-request-uri.t143
-rw-r--r--tests/test-hgweb-non-interactive.t82
-rw-r--r--tests/test-hgweb-raw.t58
-rw-r--r--tests/test-hgweb-removed.t236
-rw-r--r--tests/test-hgweb.t492
-rw-r--r--tests/test-hgwebdir-paths.py40
-rw-r--r--tests/test-hgwebdir.t1015
-rw-r--r--tests/test-hgwebdirsym.t80
-rw-r--r--tests/test-highlight.t609
-rw-r--r--tests/test-histedit-bookmark-motion.t187
-rw-r--r--tests/test-histedit-commute.t359
-rw-r--r--tests/test-histedit-drop.t107
-rw-r--r--tests/test-histedit-edit.t178
-rw-r--r--tests/test-histedit-fold-non-commute.t147
-rw-r--r--tests/test-histedit-fold.t238
-rw-r--r--tests/test-histedit-no-change.t187
-rw-r--r--tests/test-histedit-non-commute-abort.t131
-rw-r--r--tests/test-histedit-non-commute.t244
-rw-r--r--tests/test-histedit-outgoing.t84
-rw-r--r--tests/test-histedit-revspec.t62
-rw-r--r--tests/test-hook.t644
-rw-r--r--tests/test-http-branchmap.t94
-rw-r--r--tests/test-http-clone-r.t200
-rw-r--r--tests/test-http-proxy.t124
-rw-r--r--tests/test-http.t207
-rw-r--r--tests/test-https.t281
-rw-r--r--tests/test-hup.t28
-rw-r--r--tests/test-hybridencode.py27
-rw-r--r--tests/test-hybridencode.py.out21
-rw-r--r--tests/test-i18n.t40
-rw-r--r--tests/test-identify.t124
-rw-r--r--tests/test-impexp-branch.t73
-rw-r--r--tests/test-import-bypass.t270
-rw-r--r--tests/test-import-context.t126
-rw-r--r--tests/test-import-eol.t146
-rw-r--r--tests/test-import-git.t611
-rw-r--r--tests/test-import-merge.t115
-rw-r--r--tests/test-import-unknown.t69
-rw-r--r--tests/test-import.t1155
-rw-r--r--tests/test-incoming-outgoing.t491
-rw-r--r--tests/test-inherit-mode.t152
-rw-r--r--tests/test-init.t199
-rw-r--r--tests/test-inotify-debuginotify.t41
-rw-r--r--tests/test-inotify-dirty-dirstate.t72
-rw-r--r--tests/test-inotify-issue1208.t38
-rw-r--r--tests/test-inotify-issue1371.t44
-rw-r--r--tests/test-inotify-issue1542.t36
-rw-r--r--tests/test-inotify-issue1556.t31
-rw-r--r--tests/test-inotify-lookup.t14
-rw-r--r--tests/test-inotify.t162
-rw-r--r--tests/test-install.t20
-rw-r--r--tests/test-interhg.t33
-rw-r--r--tests/test-issue1089.t26
-rw-r--r--tests/test-issue1175.t53
-rw-r--r--tests/test-issue1306.t96
-rw-r--r--tests/test-issue1438.t23
-rw-r--r--tests/test-issue1502.t41
-rw-r--r--tests/test-issue1802.t73
-rw-r--r--tests/test-issue1877.t46
-rw-r--r--tests/test-issue2137.t56
-rw-r--r--tests/test-issue3084.t110
-rw-r--r--tests/test-issue522.t56
-rw-r--r--tests/test-issue612.t34
-rw-r--r--tests/test-issue619.t30
-rw-r--r--tests/test-issue660.t145
-rw-r--r--tests/test-issue672.t101
-rw-r--r--tests/test-issue842.t39
-rw-r--r--tests/test-journal-exists.t36
-rw-r--r--tests/test-keyword.t1139
-rw-r--r--tests/test-known.t38
-rw-r--r--tests/test-largefiles-cache.t125
-rw-r--r--tests/test-largefiles-small-disk.t67
-rw-r--r--tests/test-largefiles.t1447
-rw-r--r--tests/test-lfconvert.t272
-rw-r--r--tests/test-locate.t121
-rw-r--r--tests/test-lock-badness.t24
-rw-r--r--tests/test-log.t1215
-rw-r--r--tests/test-mactext.t38
-rw-r--r--tests/test-manifest-merging.t37
-rw-r--r--tests/test-manifest.t69
-rw-r--r--tests/test-merge-closedheads.t87
-rw-r--r--tests/test-merge-commit.t184
-rw-r--r--tests/test-merge-default.t111
-rw-r--r--tests/test-merge-force.t45
-rw-r--r--tests/test-merge-internal-tools-pattern.t112
-rw-r--r--tests/test-merge-local.t138
-rw-r--r--tests/test-merge-prompt.t142
-rw-r--r--tests/test-merge-remove.t87
-rw-r--r--tests/test-merge-revert.t74
-rw-r--r--tests/test-merge-revert2.t94
-rw-r--r--tests/test-merge-subrepos.t25
-rw-r--r--tests/test-merge-symlinks.t63
-rw-r--r--tests/test-merge-tools.t806
-rw-r--r--tests/test-merge-types.t110
-rw-r--r--tests/test-merge1.t176
-rw-r--r--tests/test-merge10.t53
-rw-r--r--tests/test-merge2.t53
-rw-r--r--tests/test-merge4.t25
-rw-r--r--tests/test-merge5.t37
-rw-r--r--tests/test-merge6.t70
-rw-r--r--tests/test-merge7.t147
-rw-r--r--tests/test-merge8.t29
-rw-r--r--tests/test-merge9.t94
-rw-r--r--tests/test-minirst.py245
-rw-r--r--tests/test-minirst.py.out766
-rw-r--r--tests/test-mq-caches.t126
-rw-r--r--tests/test-mq-eol.t207
-rw-r--r--tests/test-mq-git.t210
-rw-r--r--tests/test-mq-guards.t509
-rw-r--r--tests/test-mq-header-date.t902
-rw-r--r--tests/test-mq-header-from.t971
-rw-r--r--tests/test-mq-merge.t173
-rw-r--r--tests/test-mq-missingfiles.t195
-rw-r--r--tests/test-mq-pull-from-bundle.t135
-rw-r--r--tests/test-mq-qclone-http.t153
-rw-r--r--tests/test-mq-qdelete.t197
-rw-r--r--tests/test-mq-qdiff.t177
-rw-r--r--tests/test-mq-qfold.t144
-rw-r--r--tests/test-mq-qgoto.t78
-rw-r--r--tests/test-mq-qimport-fail-cleanup.t42
-rw-r--r--tests/test-mq-qimport.t280
-rw-r--r--tests/test-mq-qnew.t235
-rw-r--r--tests/test-mq-qpush-exact.t289
-rw-r--r--tests/test-mq-qpush-fail.t426
-rw-r--r--tests/test-mq-qqueue.t188
-rw-r--r--tests/test-mq-qrefresh-interactive.t350
-rw-r--r--tests/test-mq-qrefresh-replace-log-message.t61
-rw-r--r--tests/test-mq-qrefresh.t546
-rw-r--r--tests/test-mq-qrename.t125
-rw-r--r--tests/test-mq-qsave.t15
-rw-r--r--tests/test-mq-safety.t216
-rw-r--r--tests/test-mq-strip.t468
-rw-r--r--tests/test-mq-subrepo-svn.t54
-rw-r--r--tests/test-mq-subrepo.t514
-rw-r--r--tests/test-mq-symlinks.t108
-rw-r--r--tests/test-mq.t1552
-rw-r--r--tests/test-mv-cp-st-diff.t1348
-rw-r--r--tests/test-nested-repo.t41
-rw-r--r--tests/test-newbranch.t330
-rw-r--r--tests/test-newcgi.t66
-rw-r--r--tests/test-newercgi.t60
-rw-r--r--tests/test-no-symlinks.t59
-rw-r--r--tests/test-notify-changegroup.t214
-rw-r--r--tests/test-notify.t475
-rw-r--r--tests/test-obsolete-changeset-exchange.t55
-rw-r--r--tests/test-obsolete.t508
-rw-r--r--tests/test-oldcgi.t76
-rw-r--r--tests/test-parents.t154
-rw-r--r--tests/test-parse-date.t236
-rw-r--r--tests/test-parseindex.t61
-rw-r--r--tests/test-parseindex2.py126
-rw-r--r--tests/test-parseindex2.py.out1
-rw-r--r--tests/test-patch-offset.t79
-rw-r--r--tests/test-patch.t89
-rw-r--r--tests/test-patchbomb.t2351
-rw-r--r--tests/test-paths.t65
-rw-r--r--tests/test-pending.t115
-rw-r--r--tests/test-permissions.t72
-rw-r--r--tests/test-phases-exchange.t1065
-rw-r--r--tests/test-phases.t479
-rw-r--r--tests/test-profile.t31
-rw-r--r--tests/test-progress.t216
-rw-r--r--tests/test-pull-branch.t216
-rw-r--r--tests/test-pull-http.t65
-rw-r--r--tests/test-pull-permission.t32
-rw-r--r--tests/test-pull-pull-corruption.t72
-rw-r--r--tests/test-pull-r.t104
-rw-r--r--tests/test-pull-update.t62
-rw-r--r--tests/test-pull.t92
-rw-r--r--tests/test-purge.t218
-rw-r--r--tests/test-push-cgi.t92
-rw-r--r--tests/test-push-hook-lock.t31
-rw-r--r--tests/test-push-http.t123
-rw-r--r--tests/test-push-r.t149
-rw-r--r--tests/test-push-validation.t53
-rw-r--r--tests/test-push-warn.t732
-rw-r--r--tests/test-qrecord.t402
-rw-r--r--tests/test-rebase-abort.t158
-rw-r--r--tests/test-rebase-bookmarks.t113
-rw-r--r--tests/test-rebase-cache.t387
-rw-r--r--tests/test-rebase-check-restore.t150
-rw-r--r--tests/test-rebase-collapse.t722
-rw-r--r--tests/test-rebase-conflicts.t121
-rw-r--r--tests/test-rebase-detach.t400
-rw-r--r--tests/test-rebase-interruptions.t268
-rw-r--r--tests/test-rebase-issue-noparam-single-rev.t128
-rw-r--r--tests/test-rebase-mq-skip.t139
-rw-r--r--tests/test-rebase-mq.t343
-rw-r--r--tests/test-rebase-named-branches.t243
-rw-r--r--tests/test-rebase-newancestor.t56
-rw-r--r--tests/test-rebase-parameters.t430
-rw-r--r--tests/test-rebase-pull.t116
-rw-r--r--tests/test-rebase-rename.t171
-rw-r--r--tests/test-rebase-scenario-global.t547
-rw-r--r--tests/test-rebuildstate.t30
-rw-r--r--tests/test-record.t1221
-rw-r--r--tests/test-relink.t100
-rw-r--r--tests/test-remove.t268
-rw-r--r--tests/test-rename-after-merge.t121
-rw-r--r--tests/test-rename-dir-merge.t159
-rw-r--r--tests/test-rename-merge1.t195
-rw-r--r--tests/test-rename-merge2.t754
-rw-r--r--tests/test-rename.t637
-rw-r--r--tests/test-repair-strip.t132
-rw-r--r--tests/test-requires.t19
-rw-r--r--tests/test-resolve.t46
-rw-r--r--tests/test-revert-flags.t23
-rw-r--r--tests/test-revert-unknown.t29
-rw-r--r--tests/test-revert.t278
-rw-r--r--tests/test-revlog-ancestry.py77
-rw-r--r--tests/test-revlog-ancestry.py.out15
-rw-r--r--tests/test-revlog-group-emptyiter.t35
-rw-r--r--tests/test-revlog-packentry.t23
-rw-r--r--tests/test-revset-dirstate-parents.t60
-rw-r--r--tests/test-revset-outgoing.t94
-rw-r--r--tests/test-revset.t817
-rw-r--r--tests/test-rollback.t187
-rw-r--r--tests/test-run-tests.t99
-rw-r--r--tests/test-schemes.t50
-rw-r--r--tests/test-serve.t84
-rw-r--r--tests/test-setdiscovery.t327
-rw-r--r--tests/test-share.t129
-rw-r--r--tests/test-simple-update.t58
-rw-r--r--tests/test-simplemerge.py415
-rw-r--r--tests/test-simplemerge.py.out5
-rw-r--r--tests/test-ssh-clone-r.t195
-rw-r--r--tests/test-ssh.t376
-rw-r--r--tests/test-static-http.t174
-rw-r--r--tests/test-status-color.t300
-rwxr-xr-xtests/test-status-inprocess.py31
-rw-r--r--tests/test-status-inprocess.py.out5
-rw-r--r--tests/test-status.t333
-rw-r--r--tests/test-strict.t49
-rw-r--r--tests/test-strip-cross.t143
-rw-r--r--tests/test-subrepo-deep-nested-change.t264
-rw-r--r--tests/test-subrepo-git.t534
-rw-r--r--tests/test-subrepo-missing.t71
-rw-r--r--tests/test-subrepo-paths.t61
-rw-r--r--tests/test-subrepo-recursion.t494
-rw-r--r--tests/test-subrepo-relative-path.t105
-rw-r--r--tests/test-subrepo-svn.t625
-rw-r--r--tests/test-subrepo.t1023
-rw-r--r--tests/test-symlink-os-yes-fs-no.py45
-rw-r--r--tests/test-symlink-os-yes-fs-no.py.out14
-rw-r--r--tests/test-symlink-placeholder.t72
-rw-r--r--tests/test-symlinks.t256
-rw-r--r--tests/test-tag.t319
-rw-r--r--tests/test-tags.t384
-rw-r--r--tests/test-template-engine.t39
-rw-r--r--tests/test-transplant.t634
-rw-r--r--tests/test-treediscovery-legacy.t371
-rw-r--r--tests/test-treediscovery.t504
-rw-r--r--tests/test-trusted.py197
-rw-r--r--tests/test-trusted.py.out179
-rw-r--r--tests/test-ui-color.py33
-rw-r--r--tests/test-ui-color.py.out5
-rw-r--r--tests/test-ui-config.py98
-rw-r--r--tests/test-ui-config.py.out49
-rw-r--r--tests/test-ui-verbosity.py47
-rw-r--r--tests/test-ui-verbosity.py.out66
-rw-r--r--tests/test-unbundlehash.t32
-rw-r--r--tests/test-unrelated-pull.t45
-rw-r--r--tests/test-up-local-change.t238
-rw-r--r--tests/test-update-branches.t156
-rw-r--r--tests/test-update-issue1456.t36
-rw-r--r--tests/test-update-renames.t27
-rw-r--r--tests/test-update-reverse.t85
-rw-r--r--tests/test-url-rev.t210
-rw-r--r--tests/test-url.py246
-rw-r--r--tests/test-username-newline.t25
-rw-r--r--tests/test-verify.t103
-rw-r--r--tests/test-walk.t333
-rw-r--r--tests/test-walkrepo.py55
-rw-r--r--tests/test-win32text.t426
-rw-r--r--tests/test-wireproto.py45
-rw-r--r--tests/test-wireproto.py.out2
-rw-r--r--tests/test-wireproto.t114
-rwxr-xr-xtests/tinyproxy.py147
1000 files changed, 453733 insertions, 0 deletions
diff --git a/.hgignore b/.hgignore
new file mode 100644
index 0000000..9762593
--- /dev/null
+++ b/.hgignore
@@ -0,0 +1,57 @@
+syntax: glob
+
+*.elc
+*.orig
+*.rej
+*~
+*.mergebackup
+*.o
+*.so
+*.dll
+*.exe
+*.pyd
+*.pyc
+*.pyo
+*$py.class
+*.swp
+*.prof
+*.zip
+\#*\#
+.\#*
+tests/.coverage*
+tests/annotated
+tests/*.err
+tests/htmlcov
+build
+contrib/hgsh/hgsh
+dist
+doc/*.[0-9]
+doc/*.[0-9].gendoc.txt
+doc/*.[0-9].{x,ht}ml
+MANIFEST
+MANIFEST.in
+patches
+mercurial/__version__.py
+mercurial.egg-info
+.DS_Store
+tags
+cscope.*
+i18n/hg.pot
+locale/*/LC_MESSAGES/hg.mo
+hgext/__index__.py
+
+# files installed with a local --pure build
+mercurial/base85.py
+mercurial/bdiff.py
+mercurial/diffhelpers.py
+mercurial/mpatch.py
+mercurial/osutil.py
+mercurial/parsers.py
+
+syntax: regexp
+^\.pc/
+^\.(pydev)?project
+
+# hackable windows distribution additions
+^hg-python
+^hg.py$
diff --git a/.hgsigs b/.hgsigs
new file mode 100644
index 0000000..9ab4cf8
--- /dev/null
+++ b/.hgsigs
@@ -0,0 +1,58 @@
+35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0 iD8DBQBEYmO2ywK+sNU5EO8RAnaYAKCO7x15xUn5mnhqWNXqk/ehlhRt2QCfRDfY0LrUq2q4oK/KypuJYPHgq1A=
+2be3001847cb18a23c403439d9e7d0ace30804e9 0 iD8DBQBExUbjywK+sNU5EO8RAhzxAKCtyHAQUzcTSZTqlfJ0by6vhREwWQCghaQFHfkfN0l9/40EowNhuMOKnJk=
+36a957364b1b89c150f2d0e60a99befe0ee08bd3 0 iD8DBQBFfL2QywK+sNU5EO8RAjYFAKCoGlaWRTeMsjdmxAjUYx6diZxOBwCfY6IpBYsKvPTwB3oktnPt5Rmrlys=
+27230c29bfec36d5540fbe1c976810aefecfd1d2 0 iD8DBQBFheweywK+sNU5EO8RAt7VAKCrqJQWT2/uo2RWf0ZI4bLp6v82jACgjrMdsaTbxRsypcmEsdPhlG6/8F4=
+fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0 iD8DBQBGgHicywK+sNU5EO8RAgNxAJ0VG8ixAaeudx4sZbhngI1syu49HQCeNUJQfWBgA8bkJ2pvsFpNxwYaX3I=
+23889160905a1b09fffe1c07378e9fc1827606eb 0 iD8DBQBHGTzoywK+sNU5EO8RAr/UAJ0Y8s4jQtzgS+G9vM8z6CWBThZ8fwCcCT5XDj2XwxKkz/0s6UELwjsO3LU=
+bae2e9c838e90a393bae3973a7850280413e091a 0 iD8DBQBH6DO5ywK+sNU5EO8RAsfrAJ0e4r9c9GF/MJsM7Xjd3NesLRC3+ACffj6+6HXdZf8cswAoFPO+DY00oD0=
+d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 0 iD8DBQBINdwsywK+sNU5EO8RAjIUAKCPmlFJSpsPAAUKF+iNHAwVnwmzeQCdEXrL27CWclXuUKdbQC8De7LICtE=
+d2375bbee6d47e62ba8e415c86e83a465dc4dce9 0 iD8DBQBIo1wpywK+sNU5EO8RAmRNAJ94x3OFt6blbqu/yBoypm/AJ44fuACfUaldXcV5z9tht97hSp22DVTEPGc=
+2a67430f92f15ea5159c26b09ec4839a0c549a26 0 iEYEABECAAYFAkk1hykACgkQywK+sNU5EO85QACeNJNUanjc2tl4wUoPHNuv+lSj0ZMAoIm93wSTc/feyYnO2YCaQ1iyd9Nu
+3773e510d433969e277b1863c317b674cbee2065 0 iEYEABECAAYFAklNbbAACgkQywK+sNU5EO8o+gCfeb2/lfIJZMvyDA1m+G1CsBAxfFsAoIa6iAMG8SBY7hW1Q85Yf/LXEvaE
+11a4eb81fb4f4742451591489e2797dc47903277 0 iEYEABECAAYFAklcAnsACgkQywK+sNU5EO+uXwCbBVHNNsLy1g7BlAyQJwadYVyHOXoAoKvtAVO71+bv7EbVoukwTzT+P4Sx
+11efa41037e280d08cfb07c09ad485df30fb0ea8 0 iEYEABECAAYFAkmvJRQACgkQywK+sNU5EO9XZwCeLMgDgPSMWMm6vgjL4lDs2pEc5+0AnRxfiFbpbBfuEFTqKz9nbzeyoBlx
+02981000012e3adf40c4849bd7b3d5618f9ce82d 0 iEYEABECAAYFAknEH3wACgkQywK+sNU5EO+uXwCeI+LbLMmhjU1lKSfU3UWJHjjUC7oAoIZLvYDGOL/tNZFUuatc3RnZ2eje
+196d40e7c885fa6e95f89134809b3ec7bdbca34b 0 iEYEABECAAYFAkpL2X4ACgkQywK+sNU5EO9FOwCfXJycjyKJXsvQqKkHrglwOQhEKS4An36GfKzptfN8b1qNc3+ya/5c2WOM
+3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 0 iEYEABECAAYFAkpopLIACgkQywK+sNU5EO8QSgCfZ0ztsd071rOa2lhmp9Fyue/WoI0AoLTei80/xrhRlB8L/rZEf2KBl8dA
+31ec469f9b556f11819937cf68ee53f2be927ebf 0 iEYEABECAAYFAksBuxAACgkQywK+sNU5EO+mBwCfagB+A0txzWZ6dRpug3LEoK7Z1QsAoKpbk8vsLjv6/oRDicSk/qBu33+m
+439d7ea6fe3aa4ab9ec274a68846779153789de9 0 iEYEABECAAYFAksVw0kACgkQywK+sNU5EO/oZwCfdfBEkgp38xq6wN2F4nj+SzofrJIAnjmxt04vaJSeOOeHylHvk6lzuQsw
+296a0b14a68621f6990c54fdba0083f6f20935bf 0 iEYEABECAAYFAks+jCoACgkQywK+sNU5EO9J8wCeMUGF9E/gS2UBsqIz56WS4HMPRPUAoI5J95mwEIK8Clrl7qFRidNI6APq
+4aa619c4c2c09907034d9824ebb1dd0e878206eb 0 iEYEABECAAYFAktm9IsACgkQywK+sNU5EO9XGgCgk4HclRQhexEtooPE5GcUCdB6M8EAn2ptOhMVbIoO+JncA+tNACPFXh0O
+ff2704a8ded37fbebd8b6eb5ec733731d725da8a 0 iEYEABECAAYFAkuRoSQACgkQywK+sNU5EO//3QCeJDc5r2uFyFCtAlpSA27DEE5rrxAAn2FSwTy9fhrB3QAdDQlwkEZcQzDh
+2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 0 iEYEABECAAYFAku1IwIACgkQywK+sNU5EO9MjgCdHLVwkTZlNHxhcznZKBL1rjN+J7cAoLLWi9LTL6f/TgBaPSKOy1ublbaW
+39f725929f0c48c5fb3b90c071fc3066012456ca 0 iEYEABECAAYFAkvclvsACgkQywK+sNU5EO9FSwCeL9i5x8ALW/LE5+lCX6MFEAe4MhwAn1ev5o6SX6GrNdDfKweiemfO2VBk
+fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 0 iEYEABECAAYFAkvsKTkACgkQywK+sNU5EO9qEACgiSiRGvTG2vXGJ65tUSOIYihTuFAAnRzRIqEVSw8M8/RGeUXRps0IzaCO
+24fe2629c6fd0c74c90bd066e77387c2b02e8437 0 iEYEABECAAYFAkwFLRsACgkQywK+sNU5EO+pJACgp13tPI+pbwKZV+LeMjcQ4H6tCZYAoJebzhd6a8yYx6qiwpJxA9BXZNXy
+f786fc4b8764cd2a5526d259cf2f94d8a66924d9 0 iEYEABECAAYFAkwsyxcACgkQywK+sNU5EO+crACfUpNAF57PmClkSri9nJcBjb2goN4AniPCNaKvnki7TnUsi1u2oxltpKKL
+bf1774d95bde614af3956d92b20e2a0c68c5fec7 0 iEYEABECAAYFAkxVwccACgkQywK+sNU5EO+oFQCeJzwZ+we1fIIyBGCddHceOUAN++cAnjvT6A8ZWW0zV21NXIFF1qQmjxJd
+c00f03a4982e467fb6b6bd45908767db6df4771d 0 iEYEABECAAYFAkxXDqsACgkQywK+sNU5EO/GJACfT9Rz4hZOxPQEs91JwtmfjevO84gAmwSmtfo5mmWSm8gtTUebCcdTv0Kf
+ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 0 iD8DBQBMdo+qywK+sNU5EO8RAqQpAJ975BL2CCAiWMz9SXthNQ9xG181IwCgp4O+KViHPkufZVFn2aTKMNvcr1A=
+93d8bff78c96fe7e33237b257558ee97290048a4 0 iD8DBQBMpfvdywK+sNU5EO8RAsxVAJ0UaL1XB51C76JUBhafc9GBefuMxwCdEWkTOzwvE0SarJBe9i008jhbqW4=
+333421b9e0f96c7bc788e5667c146a58a9440a55 0 iD8DBQBMz0HOywK+sNU5EO8RAlsEAJ0USh6yOG7OrWkADGunVt9QimBQnwCbBqeMnKgSbwEw8jZwE3Iz1mdrYlo=
+4438875ec01bd0fc32be92b0872eb6daeed4d44f 0 iD8DBQBM4WYUywK+sNU5EO8RAhCVAJ0dJswachwFAHALmk1x0RJehxzqPQCbBNskP9n/X689jB+btNTZTyKU/fw=
+6aff4f144ad356311318b0011df0bb21f2c97429 0 iD8DBQBM9uxXywK+sNU5EO8RAv+4AKCDj4qKP16GdPaq1tP6BUwpM/M1OACfRyzLPp/qiiN8xJTWoWYSe/XjJug=
+e3bf16703e2601de99e563cdb3a5d50b64e6d320 0 iD8DBQBNH8WqywK+sNU5EO8RAiQTAJ9sBO+TeiGro4si77VVaQaA6jcRUgCfSA28dBbjj0oFoQwvPoZjANiZBH8=
+a6c855c32ea081da3c3b8ff628f1847ff271482f 0 iD8DBQBNSJJ+ywK+sNU5EO8RAoJaAKCweDEF70fu+r1Zn7pYDXdlk5RuSgCeO9gK/eit8Lin/1n3pO7aYguFLok=
+2b2155623ee2559caf288fd333f30475966c4525 0 iD8DBQBNSJeBywK+sNU5EO8RAm1KAJ4hW9Cm9nHaaGJguchBaPLlAr+O3wCgqgmMok8bdAS06N6PL60PSTM//Gg=
+2616325766e3504c8ae7c84bd15ee610901fe91d 0 iD8DBQBNbWy9ywK+sNU5EO8RAlWCAJ4mW8HbzjJj9GpK98muX7k+7EvEHwCfaTLbC/DH3QEsZBhEP+M8tzL6RU4=
+aa1f3be38ab127280761889d2dca906ca465b5f4 0 iD8DBQBNeQq7ywK+sNU5EO8RAlEOAJ4tlEDdetE9lKfjGgjbkcR8PrC3egCfXCfF3qNVvU/2YYjpgvRwevjvDy0=
+b032bec2c0a651ca0ddecb65714bfe6770f67d70 0 iD8DBQBNlg5kywK+sNU5EO8RAnGEAJ9gmEx6MfaR4XcG2m/93vwtfyzs3gCgltzx8/YdHPwqDwRX/WbpYgi33is=
+3cb1e95676ad089596bd81d0937cad37d6e3b7fb 0 iD8DBQBNvTy4ywK+sNU5EO8RAmp8AJ9QnxK4jTJ7G722MyeBxf0UXEdGwACgtlM7BKtNQfbEH/fOW5y+45W88VI=
+733af5d9f6b22387913e1d11350fb8cb7c1487dd 0 iD8DBQBN5q/8ywK+sNU5EO8RArRGAKCNGT94GKIYtSuwZ57z1sQbcw6uLACfffpbMV4NAPMl8womAwg+7ZPKnIU=
+de9eb6b1da4fc522b1cab16d86ca166204c24f25 0 iD8DBQBODhfhywK+sNU5EO8RAr2+AJ4ugbAj8ae8/K0bYZzx3sascIAg1QCeK3b+zbbVVqd3b7CDpwFnaX8kTd4=
+4a43e23b8c55b4566b8200bf69fe2158485a2634 0 iD8DBQBONzIMywK+sNU5EO8RAj5SAJ0aPS3+JHnyI6bHB2Fl0LImbDmagwCdGbDLp1S7TFobxXudOH49bX45Iik=
+d629f1e89021103f1753addcef6b310e4435b184 0 iD8DBQBOWAsBywK+sNU5EO8RAht4AJwJl9oNFopuGkj5m8aKuf7bqPkoAQCeNrEm7UhFsZKYT5iUOjnMV7s2LaM=
+351a9292e430e35766c552066ed3e87c557b803b 0 iD8DBQBOh3zUywK+sNU5EO8RApFMAKCD3Y/u3avDFndznwqfG5UeTHMlvACfUivPIVQZyDZnhZMq0UhC6zhCEQg=
+384082750f2c51dc917d85a7145748330fa6ef4d 0 iD8DBQBOmd+OywK+sNU5EO8RAgDgAJ9V/X+G7VLwhTpHrZNiOHabzSyzYQCdE2kKfIevJUYB9QLAWCWP6DPwrwI=
+41453d55b481ddfcc1dacb445179649e24ca861d 0 iD8DBQBOsFhpywK+sNU5EO8RAqM6AKCyfxUae3/zLuiLdQz+JR78690eMACfQ6JTBQib4AbE+rUDdkeFYg9K/+4=
+195dbd1cef0c2f9f8bcf4ea303238105f716bda3 0 iD8DBQBO1/fWywK+sNU5EO8RAmoPAKCR5lpv1D6JLURHD8KVLSV4GRVEBgCgnd0Sy78ligNfqAMafmACRDvj7vo=
+6344043924497cd06d781d9014c66802285072e4 0 iD8DBQBPALgmywK+sNU5EO8RAlfhAJ9nYOdWnhfVDHYtDTJAyJtXBAQS9wCgnefoSQt7QABkbGxM+Q85UYEBuD0=
+db33555eafeaf9df1e18950e29439eaa706d399b 0 iD8DBQBPGdzxywK+sNU5EO8RAppkAJ9jOXhUVE/97CPgiMA0pMGiIYnesQCfengAszcBiSiKGugiI8Okc9ghU+Y=
+2aa5b51f310fb3befd26bed99c02267f5c12c734 0 iD8DBQBPKZ9bywK+sNU5EO8RAt1TAJ45r1eJ0YqSkInzrrayg4TVCh0SnQCgm0GA/Ua74jnnDwVQ60lAwROuz1Q=
+53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 0 iD8DBQBPT/fvywK+sNU5EO8RAnfYAKCn7d0vwqIb100YfWm1F7nFD5B+FACeM02YHpQLSNsztrBCObtqcnfod7Q=
+b9bd95e61b49c221c4cca24e6da7c946fc02f992 0 iD8DBQBPeLsIywK+sNU5EO8RAvpNAKCtKe2gitz8dYn52IRF0hFOPCR7AQCfRJL/RWCFweu2T1vH/mUOCf8SXXc=
+d9e2f09d5488c395ae9ddbb320ceacd24757e055 0 iD8DBQBPju/dywK+sNU5EO8RArBYAJ9xtifdbk+hCOJO8OZa4JfHX8OYZQCeKPMBaBWiT8N/WHoOm1XU0q+iono=
+00182b3d087909e3c3ae44761efecdde8f319ef3 0 iD8DBQBPoFhIywK+sNU5EO8RAhzhAKCBj1n2jxPTkZNJJ5pSp3soa+XHIgCgsZZpAQxOpXwCp0eCdNGe0+pmxmg=
+5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 0 iD8DBQBPovNWywK+sNU5EO8RAhgiAJ980T91FdPTRMmVONDhpkMsZwVIMACgg3bKvoWSeuCW28llUhAJtUjrMv0=
+85a358df5bbbe404ca25730c9c459b34263441dc 0 iD8DBQBPyZsWywK+sNU5EO8RAnpLAJ48qrGDJRT+pteS0mSQ11haqHstPwCdG4ccGbk+0JHb7aNy8/NRGAOqn9w=
+b013baa3898e117959984fc64c29d8c784d2f28b 0 iD8DBQBP8QOPywK+sNU5EO8RAqimAKCFRSx0lvG6y8vne2IhNG062Hn0dACeMLI5/zhpWpHBIVeAAquYfx2XFeA=
diff --git a/.hgtags b/.hgtags
new file mode 100644
index 0000000..373c0b6
--- /dev/null
+++ b/.hgtags
@@ -0,0 +1,71 @@
+d40cc5aacc31ed673d9b5b24f98bee78c283062c 0.4f
+1c590d34bf61e2ea12c71738e5a746cd74586157 0.4e
+7eca4cfa8aad5fce9a04f7d8acadcd0452e2f34e 0.4d
+b4d0c3786ad3e47beacf8412157326a32b6d25a4 0.4c
+f40273b0ad7b3a6d3012fd37736d0611f41ecf54 0.5
+0a28dfe59f8fab54a5118c5be4f40da34a53cdb7 0.5b
+12e0fdbc57a0be78f0e817fd1d170a3615cd35da 0.6
+4ccf3de52989b14c3d84e1097f59e39a992e00bd 0.6b
+eac9c8efcd9bd8244e72fb6821f769f450457a32 0.6c
+979c049974485125e1f9357f6bbe9c1b548a64c3 0.7
+3a56574f329a368d645853e0f9e09472aee62349 0.8
+6a03cff2b0f5d30281e6addefe96b993582f2eac 0.8.1
+35fb62a3a673d5322f6274a44ba6456e5e4b3b37 0.9
+2be3001847cb18a23c403439d9e7d0ace30804e9 0.9.1
+36a957364b1b89c150f2d0e60a99befe0ee08bd3 0.9.2
+27230c29bfec36d5540fbe1c976810aefecfd1d2 0.9.3
+fb4b6d5fe100b0886f8bc3d6731ec0e5ed5c4694 0.9.4
+23889160905a1b09fffe1c07378e9fc1827606eb 0.9.5
+bae2e9c838e90a393bae3973a7850280413e091a 1.0
+d5cbbe2c49cee22a9fbeb9ea41daa0ac4e26b846 1.0.1
+d2375bbee6d47e62ba8e415c86e83a465dc4dce9 1.0.2
+2a67430f92f15ea5159c26b09ec4839a0c549a26 1.1
+3773e510d433969e277b1863c317b674cbee2065 1.1.1
+11a4eb81fb4f4742451591489e2797dc47903277 1.1.2
+11efa41037e280d08cfb07c09ad485df30fb0ea8 1.2
+02981000012e3adf40c4849bd7b3d5618f9ce82d 1.2.1
+196d40e7c885fa6e95f89134809b3ec7bdbca34b 1.3
+3ef6c14a1e8e83a31226f5881b7fe6095bbfa6f6 1.3.1
+31ec469f9b556f11819937cf68ee53f2be927ebf 1.4
+439d7ea6fe3aa4ab9ec274a68846779153789de9 1.4.1
+296a0b14a68621f6990c54fdba0083f6f20935bf 1.4.2
+4aa619c4c2c09907034d9824ebb1dd0e878206eb 1.4.3
+ff2704a8ded37fbebd8b6eb5ec733731d725da8a 1.5
+2b01dab594167bc0dd33331dbaa6dca3dca1b3aa 1.5.1
+39f725929f0c48c5fb3b90c071fc3066012456ca 1.5.2
+fdcf80f26604f233dc4d8f0a5ef9d7470e317e8a 1.5.3
+24fe2629c6fd0c74c90bd066e77387c2b02e8437 1.5.4
+f786fc4b8764cd2a5526d259cf2f94d8a66924d9 1.6
+bf1774d95bde614af3956d92b20e2a0c68c5fec7 1.6.1
+c00f03a4982e467fb6b6bd45908767db6df4771d 1.6.2
+ff5cec76b1c5b6be9c3bb923aae8c3c6d079d6b9 1.6.3
+93d8bff78c96fe7e33237b257558ee97290048a4 1.6.4
+333421b9e0f96c7bc788e5667c146a58a9440a55 1.7
+4438875ec01bd0fc32be92b0872eb6daeed4d44f 1.7.1
+6aff4f144ad356311318b0011df0bb21f2c97429 1.7.2
+e3bf16703e2601de99e563cdb3a5d50b64e6d320 1.7.3
+a6c855c32ea081da3c3b8ff628f1847ff271482f 1.7.4
+2b2155623ee2559caf288fd333f30475966c4525 1.7.5
+2616325766e3504c8ae7c84bd15ee610901fe91d 1.8
+aa1f3be38ab127280761889d2dca906ca465b5f4 1.8.1
+b032bec2c0a651ca0ddecb65714bfe6770f67d70 1.8.2
+3cb1e95676ad089596bd81d0937cad37d6e3b7fb 1.8.3
+733af5d9f6b22387913e1d11350fb8cb7c1487dd 1.8.4
+de9eb6b1da4fc522b1cab16d86ca166204c24f25 1.9
+4a43e23b8c55b4566b8200bf69fe2158485a2634 1.9.1
+d629f1e89021103f1753addcef6b310e4435b184 1.9.2
+351a9292e430e35766c552066ed3e87c557b803b 1.9.3
+384082750f2c51dc917d85a7145748330fa6ef4d 2.0-rc
+41453d55b481ddfcc1dacb445179649e24ca861d 2.0
+195dbd1cef0c2f9f8bcf4ea303238105f716bda3 2.0.1
+6344043924497cd06d781d9014c66802285072e4 2.0.2
+db33555eafeaf9df1e18950e29439eaa706d399b 2.1-rc
+2aa5b51f310fb3befd26bed99c02267f5c12c734 2.1
+53e2cd303ecf8ca7c7eeebd785c34e5ed6b0f4a4 2.1.1
+b9bd95e61b49c221c4cca24e6da7c946fc02f992 2.1.2
+d9e2f09d5488c395ae9ddbb320ceacd24757e055 2.2-rc
+00182b3d087909e3c3ae44761efecdde8f319ef3 2.2
+5983de86462c5a9f42a3ad0f5e90ce5b1d221d25 2.2.1
+85a358df5bbbe404ca25730c9c459b34263441dc 2.2.2
+b013baa3898e117959984fc64c29d8c784d2f28b 2.2.3
+a06e2681dd1786e2354d84a5fa9c1c88dd4fa3e0 2.3-rc
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
new file mode 100644
index 0000000..81f8143
--- /dev/null
+++ b/CONTRIBUTORS
@@ -0,0 +1,41 @@
+[This file is here for historical purposes, all recent contributors
+should appear in the changelog directly]
+
+Andrea Arcangeli <andrea at suse.de>
+Thomas Arendsen Hein <thomas at intevation.de>
+Goffredo Baroncelli <kreijack at libero.it>
+Muli Ben-Yehuda <mulix at mulix.org>
+Mikael Berthe <mikael at lilotux.net>
+Benoit Boissinot <bboissin at gmail.com>
+Brendan Cully <brendan at kublai.com>
+Vincent Danjean <vdanjean.ml at free.fr>
+Jake Edge <jake at edge2.net>
+Michael Fetterman <michael.fetterman at intel.com>
+Edouard Gomez <ed.gomez at free.fr>
+Eric Hopper <hopper at omnifarious.org>
+Alecs King <alecsk at gmail.com>
+Volker Kleinfeld <Volker.Kleinfeld at gmx.de>
+Vadim Lebedev <vadim at mbdsys.com>
+Christopher Li <hg at chrisli.org>
+Chris Mason <mason at suse.com>
+Colin McMillen <mcmillen at cs.cmu.edu>
+Wojciech Milkowski <wmilkowski at interia.pl>
+Chad Netzer <chad.netzer at gmail.com>
+Bryan O'Sullivan <bos at serpentine.com>
+Vicent Seguí Pascual <vseguip at gmail.com>
+Sean Perry <shaleh at speakeasy.net>
+Nguyen Anh Quynh <aquynh at gmail.com>
+Ollivier Robert <roberto at keltia.freenix.fr>
+Alexander Schremmer <alex at alexanderweb.de>
+Arun Sharma <arun at sharma-home.net>
+Josef "Jeff" Sipek <jeffpc at optonline.net>
+Kevin Smith <yarcs at qualitycode.com>
+TK Soh <teekaysoh at yahoo.com>
+Radoslaw Szkodzinski <astralstorm at gorzow.mm.pl>
+Samuel Tardieu <sam at rfc1149.net>
+K Thananchayan <thananck at yahoo.com>
+Andrew Thompson <andrewkt at aktzero.com>
+Michael S. Tsirkin <mst at mellanox.co.il>
+Rafael Villar Burke <pachi at mmn-arquitectos.com>
+Tristan Wibberley <tristan at wibberley.org>
+Mark Williamson <mark.williamson at cl.cam.ac.uk>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..190f04d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,118 @@
+# If you want to change PREFIX, do not just edit it below. The changed
+# value wont get passed on to recursive make calls. You should instead
+# override the variable on the command like:
+#
+# % make PREFIX=/opt/ install
+
+PREFIX=/usr/local
+export PREFIX
+PYTHON=python
+PURE=
+PYFILES:=$(shell find mercurial hgext doc -name '*.py')
+DOCFILES=mercurial/help/*.txt
+
+help:
+ @echo 'Commonly used make targets:'
+ @echo ' all - build program and documentation'
+ @echo ' install - install program and man pages to PREFIX ($(PREFIX))'
+ @echo ' install-home - install with setup.py install --home=HOME ($(HOME))'
+ @echo ' local - build for inplace usage'
+ @echo ' tests - run all tests in the automatic test suite'
+ @echo ' test-foo - run only specified tests (e.g. test-merge1.t)'
+ @echo ' dist - run all tests and create a source tarball in dist/'
+ @echo ' clean - remove files created by other targets'
+ @echo ' (except installed files or dist source tarball)'
+ @echo ' update-pot - update i18n/hg.pot'
+ @echo
+ @echo 'Example for a system-wide installation under /usr/local:'
+ @echo ' make all && su -c "make install" && hg version'
+ @echo
+ @echo 'Example for a local installation (usable in this directory):'
+ @echo ' make local && ./hg version'
+
+all: build doc
+
+local:
+ $(PYTHON) setup.py $(PURE) build_py -c -d . build_ext -i build_hgexe -i build_mo
+ $(PYTHON) hg version
+
+build:
+ $(PYTHON) setup.py $(PURE) build
+
+doc:
+ $(MAKE) -C doc
+
+clean:
+ -$(PYTHON) setup.py clean --all # ignore errors from this command
+ find . \( -name '*.py[cdo]' -o -name '*.so' \) -exec rm -f '{}' ';'
+ rm -f $(addprefix mercurial/,$(notdir $(wildcard mercurial/pure/[a-z]*.py)))
+ rm -f MANIFEST MANIFEST.in mercurial/__version__.py tests/*.err
+ rm -rf build mercurial/locale
+ $(MAKE) -C doc clean
+
+install: install-bin install-doc
+
+install-bin: build
+ $(PYTHON) setup.py $(PURE) install --root="$(DESTDIR)/" --prefix="$(PREFIX)" --force
+
+install-doc: doc
+ cd doc && $(MAKE) $(MFLAGS) install
+
+install-home: install-home-bin install-home-doc
+
+install-home-bin: build
+ $(PYTHON) setup.py $(PURE) install --home="$(HOME)" --force
+
+install-home-doc: doc
+ cd doc && $(MAKE) $(MFLAGS) PREFIX="$(HOME)" install
+
+MANIFEST-doc:
+ $(MAKE) -C doc MANIFEST
+
+MANIFEST.in: MANIFEST-doc
+ hg manifest | sed -e 's/^/include /' > MANIFEST.in
+ echo include mercurial/__version__.py >> MANIFEST.in
+ sed -e 's/^/include /' < doc/MANIFEST >> MANIFEST.in
+
+dist: tests dist-notests
+
+dist-notests: doc MANIFEST.in
+ TAR_OPTIONS="--owner=root --group=root --mode=u+w,go-w,a+rX-s" $(PYTHON) setup.py -q sdist
+
+check: tests
+
+tests:
+ cd tests && $(PYTHON) run-tests.py $(TESTFLAGS)
+
+test-%:
+ cd tests && $(PYTHON) run-tests.py $(TESTFLAGS) $@
+
+update-pot: i18n/hg.pot
+
+i18n/hg.pot: $(PYFILES) $(DOCFILES)
+ $(PYTHON) i18n/hggettext mercurial/commands.py \
+ hgext/*.py hgext/*/__init__.py \
+ mercurial/fileset.py mercurial/revset.py \
+ mercurial/templatefilters.py mercurial/templatekw.py \
+ mercurial/filemerge.py \
+ $(DOCFILES) > i18n/hg.pot
+ # All strings marked for translation in Mercurial contain
+ # ASCII characters only. But some files contain string
+ # literals like this '\037\213'. xgettext thinks it has to
+ # parse them even though they are not marked for translation.
+ # Extracting with an explicit encoding of ISO-8859-1 will make
+ # xgettext "parse" and ignore them.
+ echo $(PYFILES) | xargs \
+ xgettext --package-name "Mercurial" \
+ --msgid-bugs-address "<mercurial-devel@selenic.com>" \
+ --copyright-holder "Matt Mackall <mpm@selenic.com> and others" \
+ --from-code ISO-8859-1 --join --sort-by-file --add-comments=i18n: \
+ -d hg -p i18n -o hg.pot
+ $(PYTHON) i18n/posplit i18n/hg.pot
+
+%.po: i18n/hg.pot
+ msgmerge --no-location --update $@ $^
+
+.PHONY: help all local build doc clean install install-bin install-doc \
+ install-home install-home-bin install-home-doc dist dist-notests tests \
+ update-pot
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..1f6bd8e
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: mercurial
+Version: 2.3
+Summary: Scalable distributed SCM
+Home-page: http://mercurial.selenic.com/
+Author: Matt Mackall
+Author-email: mpm@selenic.com
+License: GNU GPLv2+
+Description: UNKNOWN
+Platform: UNKNOWN
diff --git a/README b/README
new file mode 100644
index 0000000..3f22324
--- /dev/null
+++ b/README
@@ -0,0 +1,20 @@
+Mercurial
+=========
+
+Mercurial is a fast, easy to use, distributed revision control tool
+for software developers.
+
+Basic install:
+
+ $ make # see install targets
+ $ make install # do a system-wide install
+ $ hg debuginstall # sanity-check setup
+ $ hg # see help
+
+Running without installing:
+
+ $ make local # build for inplace usage
+ $ ./hg --version # should show the latest version
+
+See http://mercurial.selenic.com/ for detailed installation
+instructions, platform-specific notes, and Mercurial user information.
diff --git a/contrib/bash_completion b/contrib/bash_completion
new file mode 100644
index 0000000..dfd149d
--- /dev/null
+++ b/contrib/bash_completion
@@ -0,0 +1,593 @@
+# bash completion for the Mercurial distributed SCM
+
+# Docs:
+#
+# If you source this file from your .bashrc, bash should be able to
+# complete a command line that uses hg with all the available commands
+# and options and sometimes even arguments.
+#
+# Mercurial allows you to define additional commands through extensions.
+# Bash should be able to automatically figure out the name of these new
+# commands and their options. See below for how to define _hg_opt_foo
+# and _hg_cmd_foo functions to fine-tune the completion for option and
+# non-option arguments, respectively.
+#
+#
+# Notes about completion for specific commands:
+#
+# - the completion function for the email command from the patchbomb
+# extension will try to call _hg_emails to get a list of e-mail
+# addresses. It's up to the user to define this function. For
+# example, put the addresses of the lists that you usually patchbomb
+# in ~/.patchbomb-to and the addresses that you usually use to send
+# the patchbombs in ~/.patchbomb-from and use something like this:
+#
+# _hg_emails()
+# {
+# if [ -r ~/.patchbomb-$1 ]; then
+# cat ~/.patchbomb-$1
+# fi
+# }
+#
+#
+# Writing completion functions for additional commands:
+#
+# If it exists, the function _hg_cmd_foo will be called without
+# arguments to generate the completion candidates for the hg command
+# "foo". If the command receives some arguments that aren't options
+# even though they start with a "-", you can define a function called
+# _hg_opt_foo to generate the completion candidates. If _hg_opt_foo
+# doesn't return 0, regular completion for options is attempted.
+#
+# In addition to the regular completion variables provided by bash,
+# the following variables are also set:
+# - $hg - the hg program being used (e.g. /usr/bin/hg)
+# - $cmd - the name of the hg command being completed
+# - $cmd_index - the index of $cmd in $COMP_WORDS
+# - $cur - the current argument being completed
+# - $prev - the argument before $cur
+# - $global_args - "|"-separated list of global options that accept
+# an argument (e.g. '--cwd|-R|--repository')
+# - $canonical - 1 if we canonicalized $cmd before calling the function
+# 0 otherwise
+#
+
+shopt -s extglob
+
+_hg_cmd()
+{
+ HGPLAIN=1 "$hg" "$@" 2>/dev/null
+}
+
+_hg_commands()
+{
+ local commands
+ commands="$(HGPLAINEXCEPT=alias _hg_cmd debugcomplete "$cur")" || commands=""
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$commands' -- "$cur"))
+}
+
+_hg_paths()
+{
+ local paths="$(_hg_cmd paths -q)"
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$paths' -- "$cur"))
+}
+
+_hg_repos()
+{
+ local i
+ for i in $(compgen -d -- "$cur"); do
+ test ! -d "$i"/.hg || COMPREPLY=(${COMPREPLY[@]:-} "$i")
+ done
+}
+
+_hg_status()
+{
+ local files="$(_hg_cmd status -n$1 .)"
+ local IFS=$'\n'
+ compopt -o filenames 2>/dev/null
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$files' -- "$cur"))
+}
+
+_hg_tags()
+{
+ local tags="$(_hg_cmd tags -q)"
+ local IFS=$'\n'
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$tags' -- "$cur"))
+}
+
+_hg_branches()
+{
+ local branches="$(_hg_cmd branches -q)"
+ local IFS=$'\n'
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$branches' -- "$cur"))
+}
+
+_hg_bookmarks()
+{
+ local bookmarks="$(_hg_cmd bookmarks -q)"
+ local IFS=$'\n'
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$bookmarks' -- "$cur"))
+}
+
+_hg_labels()
+{
+ _hg_tags
+ _hg_branches
+ _hg_bookmarks
+}
+
+# this is "kind of" ugly...
+_hg_count_non_option()
+{
+ local i count=0
+ local filters="$1"
+
+ for ((i=1; $i<=$COMP_CWORD; i++)); do
+ if [[ "${COMP_WORDS[i]}" != -* ]]; then
+ if [[ ${COMP_WORDS[i-1]} == @($filters|$global_args) ]]; then
+ continue
+ fi
+ count=$(($count + 1))
+ fi
+ done
+
+ echo $(($count - 1))
+}
+
+_hg()
+{
+ local cur prev cmd cmd_index opts i
+ # global options that receive an argument
+ local global_args='--cwd|-R|--repository'
+ local hg="$1"
+ local canonical=0
+
+ COMPREPLY=()
+ cur="$2"
+ prev="$3"
+
+ # searching for the command
+ # (first non-option argument that doesn't follow a global option that
+ # receives an argument)
+ for ((i=1; $i<=$COMP_CWORD; i++)); do
+ if [[ ${COMP_WORDS[i]} != -* ]]; then
+ if [[ ${COMP_WORDS[i-1]} != @($global_args) ]]; then
+ cmd="${COMP_WORDS[i]}"
+ cmd_index=$i
+ break
+ fi
+ fi
+ done
+
+ if [[ "$cur" == -* ]]; then
+ if [ "$(type -t "_hg_opt_$cmd")" = function ] && "_hg_opt_$cmd"; then
+ return
+ fi
+
+ opts=$(_hg_cmd debugcomplete --options "$cmd")
+
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$opts' -- "$cur"))
+ return
+ fi
+
+ # global options
+ case "$prev" in
+ -R|--repository)
+ _hg_paths
+ _hg_repos
+ return
+ ;;
+ --cwd)
+ # Stick with default bash completion
+ return
+ ;;
+ esac
+
+ if [ -z "$cmd" ] || [ $COMP_CWORD -eq $i ]; then
+ _hg_commands
+ return
+ fi
+
+ # try to generate completion candidates for whatever command the user typed
+ local help
+ if _hg_command_specific; then
+ return
+ fi
+
+ # canonicalize the command name and try again
+ help=$(_hg_cmd help "$cmd")
+ if [ $? -ne 0 ]; then
+ # Probably either the command doesn't exist or it's ambiguous
+ return
+ fi
+ cmd=${help#hg }
+ cmd=${cmd%%[$' \n']*}
+ canonical=1
+ _hg_command_specific
+}
+
+_hg_command_specific()
+{
+ if [ "$(type -t "_hg_cmd_$cmd")" = function ]; then
+ "_hg_cmd_$cmd"
+ return 0
+ fi
+
+ if [ "$cmd" != status ] && [ "$prev" = -r ] || [ "$prev" == --rev ]; then
+ if [ $canonical = 1 ]; then
+ _hg_labels
+ return 0
+ elif [[ status != "$cmd"* ]]; then
+ _hg_labels
+ return 0
+ else
+ return 1
+ fi
+ fi
+
+ case "$cmd" in
+ help)
+ _hg_commands
+ ;;
+ export)
+ if _hg_ext_mq_patchlist qapplied && [ "${COMPREPLY[*]}" ]; then
+ return 0
+ fi
+ _hg_labels
+ ;;
+ manifest|update)
+ _hg_labels
+ ;;
+ pull|push|outgoing|incoming)
+ _hg_paths
+ _hg_repos
+ ;;
+ paths)
+ _hg_paths
+ ;;
+ add)
+ _hg_status "u"
+ ;;
+ merge)
+ _hg_labels
+ ;;
+ commit|record)
+ _hg_status "mar"
+ ;;
+ remove)
+ _hg_status "d"
+ ;;
+ forget)
+ _hg_status "a"
+ ;;
+ diff)
+ _hg_status "mar"
+ ;;
+ revert)
+ _hg_status "mard"
+ ;;
+ clone)
+ local count=$(_hg_count_non_option)
+ if [ $count = 1 ]; then
+ _hg_paths
+ fi
+ _hg_repos
+ ;;
+ debugindex|debugindexdot)
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -f -X "!*.i" -- "$cur"))
+ ;;
+ debugdata)
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -f -X "!*.d" -- "$cur"))
+ ;;
+ *)
+ return 1
+ ;;
+ esac
+
+ return 0
+}
+
+complete -o bashdefault -o default -F _hg hg \
+ || complete -o default -F _hg hg
+
+
+# Completion for commands provided by extensions
+
+# bookmarks
+_hg_bookmarks()
+{
+ local bookmarks="$(_hg_cmd bookmarks --quiet )"
+ local IFS=$'\n'
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$bookmarks' -- "$cur"))
+}
+
+_hg_cmd_bookmarks()
+{
+ if [[ "$prev" = @(-d|--delete|-m|--rename) ]]; then
+ _hg_bookmarks
+ return
+ fi
+}
+
+# mq
+_hg_ext_mq_patchlist()
+{
+ local patches
+ patches=$(_hg_cmd $1)
+ if [ $? -eq 0 ] && [ "$patches" ]; then
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$patches' -- "$cur"))
+ return 0
+ fi
+ return 1
+}
+
+_hg_ext_mq_queues()
+{
+ local root=$(_hg_cmd root)
+ local n
+ for n in $(cd "$root"/.hg && compgen -d -- "$cur"); do
+ # I think we're usually not interested in the regular "patches" queue
+ # so just filter it.
+ if [ "$n" != patches ] && [ -e "$root/.hg/$n/series" ]; then
+ COMPREPLY=(${COMPREPLY[@]:-} "$n")
+ fi
+ done
+}
+
+_hg_cmd_qpop()
+{
+ if [[ "$prev" = @(-n|--name) ]]; then
+ _hg_ext_mq_queues
+ return
+ fi
+ _hg_ext_mq_patchlist qapplied
+}
+
+_hg_cmd_qpush()
+{
+ if [[ "$prev" = @(-n|--name) ]]; then
+ _hg_ext_mq_queues
+ return
+ fi
+ _hg_ext_mq_patchlist qunapplied
+}
+
+_hg_cmd_qgoto()
+{
+ if [[ "$prev" = @(-n|--name) ]]; then
+ _hg_ext_mq_queues
+ return
+ fi
+ _hg_ext_mq_patchlist qseries
+}
+
+_hg_cmd_qdelete()
+{
+ local qcmd=qunapplied
+ if [[ "$prev" = @(-r|--rev) ]]; then
+ qcmd=qapplied
+ fi
+ _hg_ext_mq_patchlist $qcmd
+}
+
+_hg_cmd_qfinish()
+{
+ if [[ "$prev" = @(-a|--applied) ]]; then
+ return
+ fi
+ _hg_ext_mq_patchlist qapplied
+}
+
+_hg_cmd_qsave()
+{
+ if [[ "$prev" = @(-n|--name) ]]; then
+ _hg_ext_mq_queues
+ return
+ fi
+}
+
+_hg_cmd_strip()
+{
+ _hg_labels
+}
+
+_hg_cmd_qcommit()
+{
+ local root=$(_hg_cmd root)
+ # this is run in a sub-shell, so we can't use _hg_status
+ local files=$(cd "$root/.hg/patches" && _hg_cmd status -nmar)
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$files' -- "$cur"))
+}
+
+_hg_cmd_qfold()
+{
+ _hg_ext_mq_patchlist qunapplied
+}
+
+_hg_cmd_qrename()
+{
+ _hg_ext_mq_patchlist qseries
+}
+
+_hg_cmd_qheader()
+{
+ _hg_ext_mq_patchlist qseries
+}
+
+_hg_cmd_qclone()
+{
+ local count=$(_hg_count_non_option)
+ if [ $count = 1 ]; then
+ _hg_paths
+ fi
+ _hg_repos
+}
+
+_hg_ext_mq_guards()
+{
+ _hg_cmd qselect --series | sed -e 's/^.//'
+}
+
+_hg_cmd_qselect()
+{
+ local guards=$(_hg_ext_mq_guards)
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$guards' -- "$cur"))
+}
+
+_hg_cmd_qguard()
+{
+ local prefix=''
+
+ if [[ "$cur" == +* ]]; then
+ prefix=+
+ elif [[ "$cur" == -* ]]; then
+ prefix=-
+ fi
+ local ncur=${cur#[-+]}
+
+ if ! [ "$prefix" ]; then
+ _hg_ext_mq_patchlist qseries
+ return
+ fi
+
+ local guards=$(_hg_ext_mq_guards)
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -P $prefix -W '$guards' -- "$ncur"))
+}
+
+_hg_opt_qguard()
+{
+ local i
+ for ((i=cmd_index+1; i<=COMP_CWORD; i++)); do
+ if [[ ${COMP_WORDS[i]} != -* ]]; then
+ if [[ ${COMP_WORDS[i-1]} != @($global_args) ]]; then
+ _hg_cmd_qguard
+ return 0
+ fi
+ elif [ "${COMP_WORDS[i]}" = -- ]; then
+ _hg_cmd_qguard
+ return 0
+ fi
+ done
+ return 1
+}
+
+_hg_cmd_qqueue()
+{
+ local q
+ local queues
+ local opts="--list --create --rename --delete --purge"
+
+ queues=$( _hg_cmd qqueue --quiet )
+
+ COMPREPLY=( $( compgen -W "${opts} ${queues}" "${cur}" ) )
+}
+
+
+# hbisect
+_hg_cmd_bisect()
+{
+ local i subcmd
+
+ # find the sub-command
+ for ((i=cmd_index+1; i<=COMP_CWORD; i++)); do
+ if [[ ${COMP_WORDS[i]} != -* ]]; then
+ if [[ ${COMP_WORDS[i-1]} != @($global_args) ]]; then
+ subcmd="${COMP_WORDS[i]}"
+ break
+ fi
+ fi
+ done
+
+ if [ -z "$subcmd" ] || [ $COMP_CWORD -eq $i ] || [ "$subcmd" = help ]; then
+ COMPREPLY=(${COMPREPLY[@]:-}
+ $(compgen -W 'bad good help init next reset' -- "$cur"))
+ return
+ fi
+
+ case "$subcmd" in
+ good|bad)
+ _hg_labels
+ ;;
+ esac
+
+ return
+}
+
+
+# patchbomb
+_hg_cmd_email()
+{
+ case "$prev" in
+ -c|--cc|-t|--to|-f|--from|--bcc)
+ # we need an e-mail address. let the user provide a function
+ # to get them
+ if [ "$(type -t _hg_emails)" = function ]; then
+ local arg=to
+ if [[ "$prev" == @(-f|--from) ]]; then
+ arg=from
+ fi
+ local addresses=$(_hg_emails $arg)
+ COMPREPLY=(${COMPREPLY[@]:-}
+ $(compgen -W '$addresses' -- "$cur"))
+ fi
+ return
+ ;;
+ -m|--mbox)
+ # fallback to standard filename completion
+ return
+ ;;
+ -s|--subject)
+ # free form string
+ return
+ ;;
+ esac
+
+ _hg_labels
+ return
+}
+
+
+# gpg
+_hg_cmd_sign()
+{
+ _hg_labels
+}
+
+
+# transplant
+_hg_cmd_transplant()
+{
+ case "$prev" in
+ -s|--source)
+ _hg_paths
+ _hg_repos
+ return
+ ;;
+ --filter)
+ # standard filename completion
+ return
+ ;;
+ esac
+
+ # all other transplant options values and command parameters are revisions
+ _hg_labels
+ return
+}
+
+# shelve
+_hg_shelves()
+{
+ local shelves="$(_hg_cmd unshelve -l .)"
+ local IFS=$'\n'
+ COMPREPLY=(${COMPREPLY[@]:-} $(compgen -W '$shelves' -- "$cur"))
+}
+
+_hg_cmd_shelve()
+{
+ _hg_status "mard"
+}
+
+_hg_cmd_unshelve()
+{
+ _hg_shelves
+}
diff --git a/contrib/buildrpm b/contrib/buildrpm
new file mode 100755
index 0000000..6fedb03
--- /dev/null
+++ b/contrib/buildrpm
@@ -0,0 +1,110 @@
+#!/bin/sh
+#
+# Build a Mercurial RPM in place.
+#
+# Tested on
+# - Fedora 8 (with docutils 0.5)
+# - Fedora 11
+# - OpenSuse 11.2
+
+cd "`dirname $0`/.."
+HG="$PWD/hg"
+PYTHONPATH="$PWD/mercurial/pure"
+export PYTHONPATH
+
+specfile=contrib/mercurial.spec
+if [ ! -f $specfile ]; then
+ echo "Cannot find $specfile!" 1>&2
+ exit 1
+fi
+
+if [ ! -d .hg ]; then
+ echo 'You are not inside a Mercurial repository!' 1>&2
+ exit 1
+fi
+
+if $HG id -i | grep '+$' > /dev/null 2>&1; then
+ echo -n "Your local changes will NOT be in the RPM. Continue [y/n] ? "
+ read answer
+ if echo $answer | grep -iv '^y'; then
+ exit
+ fi
+fi
+
+rpmdir="$PWD/rpmbuild"
+
+rm -rf $rpmdir
+mkdir -p $rpmdir/SOURCES $rpmdir/SPECS $rpmdir/RPMS $rpmdir/SRPMS $rpmdir/BUILD
+
+# make setup.py build the version string
+python setup.py build_py -c -d .
+hgversion=`$HG version | sed -ne 's/.*(version \(.*\))$/\1/p'`
+
+if echo $hgversion | grep -- '-' > /dev/null 2>&1; then
+ # nightly build case, version is like 1.3.1+250-20b91f91f9ca
+ version=`echo $hgversion | cut -d- -f1`
+ release=`echo $hgversion | cut -d- -f2 | sed -e 's/+.*//'`
+else
+ # official tag, version is like 1.3.1
+ version=`echo $hgversion | sed -e 's/+.*//'`
+ release='0'
+fi
+
+$HG archive -t tgz $rpmdir/SOURCES/mercurial-$version.tar.gz
+rpmspec=$rpmdir/SPECS/mercurial-$version.spec
+
+sed -e "s,^Version:.*,Version: $version," \
+ -e "s,^Release:.*,Release: $release," \
+ $specfile > $rpmspec
+
+echo >> $rpmspec
+echo "%changelog" >> $rpmspec
+
+if echo $version | grep '+' > /dev/null 2>&1; then
+ latesttag="`echo $version | sed -e 's/+.*//'`"
+ $HG log -r .:"$latesttag" -fM \
+ --template '{date|hgdate}\t{author}\t{desc|firstline}\n' | python -c '
+import sys, time
+
+def datestr(date, format):
+ return time.strftime(format, time.gmtime(float(date[0]) - date[1]))
+
+changelog = []
+for l in sys.stdin.readlines():
+ tok = l.split("\t")
+ hgdate = tuple(int(v) for v in tok[0].split())
+ changelog.append((datestr(hgdate, "%F"), tok[1], hgdate, tok[2]))
+prevtitle = ""
+for l in sorted(changelog, reverse=True):
+ title = "* %s %s" % (datestr(l[2], "%a %b %d %Y"), l[1])
+ if prevtitle != title:
+ prevtitle = title
+ print
+ print title
+ print "- %s" % l[3].strip()
+' >> $rpmspec
+
+else
+
+ $HG log \
+ --template '{date|hgdate}\t{author}\t{desc|firstline}\n' \
+ .hgtags | python -c '
+import sys, time
+
+def datestr(date, format):
+ return time.strftime(format, time.gmtime(float(date[0]) - date[1]))
+
+for l in sys.stdin.readlines():
+ tok = l.split("\t")
+ hgdate = tuple(int(v) for v in tok[0].split())
+ print "* %s %s\n- %s" % (datestr(hgdate, "%a %b %d %Y"), tok[1], tok[2])
+' >> $rpmspec
+
+fi
+
+rpmbuild --define "_topdir $rpmdir" -ba $rpmspec --clean
+if [ $? = 0 ]; then
+ echo
+ echo "Packages are in $rpmdir:"
+ ls -l $rpmdir/*RPMS/*
+fi
diff --git a/contrib/casesmash.py b/contrib/casesmash.py
new file mode 100644
index 0000000..071e014
--- /dev/null
+++ b/contrib/casesmash.py
@@ -0,0 +1,34 @@
+import sys, os, __builtin__
+from mercurial import util
+
+def lowerwrap(scope, funcname):
+ f = getattr(scope, funcname)
+ def wrap(fname, *args, **kwargs):
+ d, base = os.path.split(fname)
+ try:
+ files = os.listdir(d or '.')
+ except OSError, inst:
+ files = []
+ if base in files:
+ return f(fname, *args, **kwargs)
+ for fn in files:
+ if fn.lower() == base.lower():
+ return f(os.path.join(d, fn), *args, **kwargs)
+ return f(fname, *args, **kwargs)
+ scope.__dict__[funcname] = wrap
+
+def normcase(path):
+ return path.lower()
+
+os.path.normcase = normcase
+
+for f in 'file open'.split():
+ lowerwrap(__builtin__, f)
+
+for f in "chmod chown open lstat stat remove unlink".split():
+ lowerwrap(os, f)
+
+for f in "exists lexists".split():
+ lowerwrap(os.path, f)
+
+lowerwrap(util, 'posixfile')
diff --git a/contrib/check-code.py b/contrib/check-code.py
new file mode 100755
index 0000000..b8f714c
--- /dev/null
+++ b/contrib/check-code.py
@@ -0,0 +1,450 @@
+#!/usr/bin/env python
+#
+# check-code - a style and portability checker for Mercurial
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import re, glob, os, sys
+import keyword
+import optparse
+
+def repquote(m):
+ t = re.sub(r"\w", "x", m.group('text'))
+ t = re.sub(r"[^\s\nx]", "o", t)
+ return m.group('quote') + t + m.group('quote')
+
+def reppython(m):
+ comment = m.group('comment')
+ if comment:
+ return "#" * len(comment)
+ return repquote(m)
+
+def repcomment(m):
+ return m.group(1) + "#" * len(m.group(2))
+
+def repccomment(m):
+ t = re.sub(r"((?<=\n) )|\S", "x", m.group(2))
+ return m.group(1) + t + "*/"
+
+def repcallspaces(m):
+ t = re.sub(r"\n\s+", "\n", m.group(2))
+ return m.group(1) + t
+
+def repinclude(m):
+ return m.group(1) + "<foo>"
+
+def rephere(m):
+ t = re.sub(r"\S", "x", m.group(2))
+ return m.group(1) + t
+
+
+testpats = [
+ [
+ (r'pushd|popd', "don't use 'pushd' or 'popd', use 'cd'"),
+ (r'\W\$?\(\([^\)\n]*\)\)', "don't use (()) or $(()), use 'expr'"),
+ (r'grep.*-q', "don't use 'grep -q', redirect to /dev/null"),
+ (r'sed.*-i', "don't use 'sed -i', use a temporary file"),
+ (r'\becho\b.*\\n', "don't use 'echo \\n', use printf"),
+ (r'echo -n', "don't use 'echo -n', use printf"),
+ (r'(^| )wc[^|]*$\n(?!.*\(re\))', "filter wc output"),
+ (r'head -c', "don't use 'head -c', use 'dd'"),
+ (r'sha1sum', "don't use sha1sum, use $TESTDIR/md5sum.py"),
+ (r'ls.*-\w*R', "don't use 'ls -R', use 'find'"),
+ (r'printf.*\\([1-9]|0\d)', "don't use 'printf \NNN', use Python"),
+ (r'printf.*\\x', "don't use printf \\x, use Python"),
+ (r'\$\(.*\)', "don't use $(expr), use `expr`"),
+ (r'rm -rf \*', "don't use naked rm -rf, target a directory"),
+ (r'(^|\|\s*)grep (-\w\s+)*[^|]*[(|]\w',
+ "use egrep for extended grep syntax"),
+ (r'/bin/', "don't use explicit paths for tools"),
+ (r'[^\n]\Z', "no trailing newline"),
+ (r'export.*=', "don't export and assign at once"),
+ (r'^source\b', "don't use 'source', use '.'"),
+ (r'touch -d', "don't use 'touch -d', use 'touch -t' instead"),
+ (r'ls +[^|\n-]+ +-', "options to 'ls' must come before filenames"),
+ (r'[^>\n]>\s*\$HGRCPATH', "don't overwrite $HGRCPATH, append to it"),
+ (r'^stop\(\)', "don't use 'stop' as a shell function name"),
+ (r'(\[|\btest\b).*-e ', "don't use 'test -e', use 'test -f'"),
+ (r'^alias\b.*=', "don't use alias, use a function"),
+ (r'if\s*!', "don't use '!' to negate exit status"),
+ (r'/dev/u?random', "don't use entropy, use /dev/zero"),
+ (r'do\s*true;\s*done', "don't use true as loop body, use sleep 0"),
+ (r'^( *)\t', "don't use tabs to indent"),
+ ],
+ # warnings
+ [
+ (r'^function', "don't use 'function', use old style"),
+ (r'^diff.*-\w*N', "don't use 'diff -N'"),
+ (r'\$PWD', "don't use $PWD, use `pwd`"),
+ (r'^([^"\'\n]|("[^"\n]*")|(\'[^\'\n]*\'))*\^', "^ must be quoted"),
+ ]
+]
+
+testfilters = [
+ (r"( *)(#([^\n]*\S)?)", repcomment),
+ (r"<<(\S+)((.|\n)*?\n\1)", rephere),
+]
+
+uprefix = r"^ \$ "
+utestpats = [
+ [
+ (r'^(\S| $ ).*(\S[ \t]+|^[ \t]+)\n', "trailing whitespace on non-output"),
+ (uprefix + r'.*\|\s*sed[^|>\n]*\n',
+ "use regex test output patterns instead of sed"),
+ (uprefix + r'(true|exit 0)', "explicit zero exit unnecessary"),
+ (uprefix + r'.*(?<!\[)\$\?', "explicit exit code checks unnecessary"),
+ (uprefix + r'.*\|\| echo.*(fail|error)',
+ "explicit exit code checks unnecessary"),
+ (uprefix + r'set -e', "don't use set -e"),
+ (uprefix + r'\s', "don't indent commands, use > for continued lines"),
+ (r'^ saved backup bundle to \$TESTTMP.*\.hg$',
+ "use (glob) to match Windows paths too"),
+ ],
+ # warnings
+ []
+]
+
+for i in [0, 1]:
+ for p, m in testpats[i]:
+ if p.startswith(r'^'):
+ p = r"^ [$>] (%s)" % p[1:]
+ else:
+ p = r"^ [$>] .*(%s)" % p
+ utestpats[i].append((p, m))
+
+utestfilters = [
+ (r"( *)(#([^\n]*\S)?)", repcomment),
+]
+
+pypats = [
+ [
+ (r'^\s*def\s*\w+\s*\(.*,\s*\(',
+ "tuple parameter unpacking not available in Python 3+"),
+ (r'lambda\s*\(.*,.*\)',
+ "tuple parameter unpacking not available in Python 3+"),
+ (r'(?<!def)\s+(cmp)\(', "cmp is not available in Python 3+"),
+ (r'\breduce\s*\(.*', "reduce is not available in Python 3+"),
+ (r'\.has_key\b', "dict.has_key is not available in Python 3+"),
+ (r'^\s*\t', "don't use tabs"),
+ (r'\S;\s*\n', "semicolon"),
+ (r'[^_]_\("[^"]+"\s*%', "don't use % inside _()"),
+ (r"[^_]_\('[^']+'\s*%", "don't use % inside _()"),
+ (r'\w,\w', "missing whitespace after ,"),
+ (r'\w[+/*\-<>]\w', "missing whitespace in expression"),
+ (r'^\s+\w+=\w+[^,)\n]$', "missing whitespace in assignment"),
+ (r'(\s+)try:\n((?:\n|\1\s.*\n)+?)\1except.*?:\n'
+ r'((?:\n|\1\s.*\n)+?)\1finally:', 'no try/except/finally in Py2.4'),
+ (r'.{81}', "line too long"),
+ (r' x+[xo][\'"]\n\s+[\'"]x', 'string join across lines with no space'),
+ (r'[^\n]\Z', "no trailing newline"),
+ (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
+# (r'^\s+[^_ \n][^_. \n]+_[^_\n]+\s*=',
+# "don't use underbars in identifiers"),
+ (r'^\s+(self\.)?[A-za-z][a-z0-9]+[A-Z]\w* = ',
+ "don't use camelcase in identifiers"),
+ (r'^\s*(if|while|def|class|except|try)\s[^[\n]*:\s*[^\\n]#\s]+',
+ "linebreak after :"),
+ (r'class\s[^( \n]+:', "old-style class, use class foo(object)"),
+ (r'class\s[^( \n]+\(\):',
+ "class foo() not available in Python 2.4, use class foo(object)"),
+ (r'\b(%s)\(' % '|'.join(keyword.kwlist),
+ "Python keyword is not a function"),
+ (r',]', "unneeded trailing ',' in list"),
+# (r'class\s[A-Z][^\(]*\((?!Exception)',
+# "don't capitalize non-exception classes"),
+# (r'in range\(', "use xrange"),
+# (r'^\s*print\s+', "avoid using print in core and extensions"),
+ (r'[\x80-\xff]', "non-ASCII character literal"),
+ (r'("\')\.format\(', "str.format() not available in Python 2.4"),
+ (r'^\s*with\s+', "with not available in Python 2.4"),
+ (r'\.isdisjoint\(', "set.isdisjoint not available in Python 2.4"),
+ (r'^\s*except.* as .*:', "except as not available in Python 2.4"),
+ (r'^\s*os\.path\.relpath', "relpath not available in Python 2.4"),
+ (r'(?<!def)\s+(any|all|format)\(',
+ "any/all/format not available in Python 2.4"),
+ (r'(?<!def)\s+(callable)\(',
+ "callable not available in Python 3, use getattr(f, '__call__', None)"),
+ (r'if\s.*\selse', "if ... else form not available in Python 2.4"),
+ (r'^\s*(%s)\s\s' % '|'.join(keyword.kwlist),
+ "gratuitous whitespace after Python keyword"),
+ (r'([\(\[][ \t]\S)|(\S[ \t][\)\]])', "gratuitous whitespace in () or []"),
+# (r'\s\s=', "gratuitous whitespace before ="),
+ (r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S',
+ "missing whitespace around operator"),
+ (r'[^>< ](\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\s',
+ "missing whitespace around operator"),
+ (r'\s(\+=|-=|!=|<>|<=|>=|<<=|>>=|%=)\S',
+ "missing whitespace around operator"),
+ (r'[^^+=*/!<>&| %-](\s=|=\s)[^= ]',
+ "wrong whitespace around ="),
+ (r'raise Exception', "don't raise generic exceptions"),
+ (r' is\s+(not\s+)?["\'0-9-]', "object comparison with literal"),
+ (r' [=!]=\s+(True|False|None)',
+ "comparison with singleton, use 'is' or 'is not' instead"),
+ (r'^\s*(while|if) [01]:',
+ "use True/False for constant Boolean expression"),
+ (r'(?:(?<!def)\s+|\()hasattr',
+ 'hasattr(foo, bar) is broken, use util.safehasattr(foo, bar) instead'),
+ (r'opener\([^)]*\).read\(',
+ "use opener.read() instead"),
+ (r'BaseException', 'not in Py2.4, use Exception'),
+ (r'os\.path\.relpath', 'os.path.relpath is not in Py2.5'),
+ (r'opener\([^)]*\).write\(',
+ "use opener.write() instead"),
+ (r'[\s\(](open|file)\([^)]*\)\.read\(',
+ "use util.readfile() instead"),
+ (r'[\s\(](open|file)\([^)]*\)\.write\(',
+ "use util.readfile() instead"),
+ (r'^[\s\(]*(open(er)?|file)\([^)]*\)',
+ "always assign an opened file to a variable, and close it afterwards"),
+ (r'[\s\(](open|file)\([^)]*\)\.',
+ "always assign an opened file to a variable, and close it afterwards"),
+ (r'(?i)descendent', "the proper spelling is descendAnt"),
+ (r'\.debug\(\_', "don't mark debug messages for translation"),
+ (r'\.strip\(\)\.split\(\)', "no need to strip before splitting"),
+ (r'^\s*except\s*:', "warning: naked except clause", r'#.*re-raises'),
+ (r':\n( )*( ){1,3}[^ ]', "must indent 4 spaces"),
+ ],
+ # warnings
+ [
+ (r'ui\.(status|progress|write|note|warn)\([\'\"]x',
+ "warning: unwrapped ui message"),
+ ]
+]
+
+pyfilters = [
+ (r"""(?msx)(?P<comment>\#.*?$)|
+ ((?P<quote>('''|\"\"\"|(?<!')'(?!')|(?<!")"(?!")))
+ (?P<text>(([^\\]|\\.)*?))
+ (?P=quote))""", reppython),
+]
+
+cpats = [
+ [
+ (r'//', "don't use //-style comments"),
+ (r'^ ', "don't use spaces to indent"),
+ (r'\S\t', "don't use tabs except for indent"),
+ (r'(\S[ \t]+|^[ \t]+)\n', "trailing whitespace"),
+ (r'.{81}', "line too long"),
+ (r'(while|if|do|for)\(', "use space after while/if/do/for"),
+ (r'return\(', "return is not a function"),
+ (r' ;', "no space before ;"),
+ (r'\w+\* \w+', "use int *foo, not int* foo"),
+ (r'\([^\)]+\) \w+', "use (int)foo, not (int) foo"),
+ (r'\w+ (\+\+|--)', "use foo++, not foo ++"),
+ (r'\w,\w', "missing whitespace after ,"),
+ (r'^[^#]\w[+/*]\w', "missing whitespace in expression"),
+ (r'^#\s+\w', "use #foo, not # foo"),
+ (r'[^\n]\Z', "no trailing newline"),
+ (r'^\s*#import\b', "use only #include in standard C code"),
+ ],
+ # warnings
+ []
+]
+
+cfilters = [
+ (r'(/\*)(((\*(?!/))|[^*])*)\*/', repccomment),
+ (r'''(?P<quote>(?<!")")(?P<text>([^"]|\\")+)"(?!")''', repquote),
+ (r'''(#\s*include\s+<)([^>]+)>''', repinclude),
+ (r'(\()([^)]+\))', repcallspaces),
+]
+
+inutilpats = [
+ [
+ (r'\bui\.', "don't use ui in util"),
+ ],
+ # warnings
+ []
+]
+
+inrevlogpats = [
+ [
+ (r'\brepo\.', "don't use repo in revlog"),
+ ],
+ # warnings
+ []
+]
+
+checks = [
+ ('python', r'.*\.(py|cgi)$', pyfilters, pypats),
+ ('test script', r'(.*/)?test-[^.~]*$', testfilters, testpats),
+ ('c', r'.*\.c$', cfilters, cpats),
+ ('unified test', r'.*\.t$', utestfilters, utestpats),
+ ('layering violation repo in revlog', r'mercurial/revlog\.py', pyfilters,
+ inrevlogpats),
+ ('layering violation ui in util', r'mercurial/util\.py', pyfilters,
+ inutilpats),
+]
+
+class norepeatlogger(object):
+ def __init__(self):
+ self._lastseen = None
+
+ def log(self, fname, lineno, line, msg, blame):
+ """print error related a to given line of a given file.
+
+ The faulty line will also be printed but only once in the case
+ of multiple errors.
+
+ :fname: filename
+ :lineno: line number
+ :line: actual content of the line
+ :msg: error message
+ """
+ msgid = fname, lineno, line
+ if msgid != self._lastseen:
+ if blame:
+ print "%s:%d (%s):" % (fname, lineno, blame)
+ else:
+ print "%s:%d:" % (fname, lineno)
+ print " > %s" % line
+ self._lastseen = msgid
+ print " " + msg
+
+_defaultlogger = norepeatlogger()
+
+def getblame(f):
+ lines = []
+ for l in os.popen('hg annotate -un %s' % f):
+ start, line = l.split(':', 1)
+ user, rev = start.split()
+ lines.append((line[1:-1], user, rev))
+ return lines
+
+def checkfile(f, logfunc=_defaultlogger.log, maxerr=None, warnings=False,
+ blame=False, debug=False, lineno=True):
+ """checks style and portability of a given file
+
+ :f: filepath
+ :logfunc: function used to report error
+ logfunc(filename, linenumber, linecontent, errormessage)
+ :maxerr: number of error to display before arborting.
+ Set to false (default) to report all errors
+
+ return True if no error is found, False otherwise.
+ """
+ blamecache = None
+ result = True
+ for name, match, filters, pats in checks:
+ if debug:
+ print name, f
+ fc = 0
+ if not re.match(match, f):
+ if debug:
+ print "Skipping %s for %s it doesn't match %s" % (
+ name, match, f)
+ continue
+ fp = open(f)
+ pre = post = fp.read()
+ fp.close()
+ if "no-" + "check-code" in pre:
+ if debug:
+ print "Skipping %s for %s it has no- and check-code" % (
+ name, f)
+ break
+ for p, r in filters:
+ post = re.sub(p, r, post)
+ if warnings:
+ pats = pats[0] + pats[1]
+ else:
+ pats = pats[0]
+ # print post # uncomment to show filtered version
+
+ if debug:
+ print "Checking %s for %s" % (name, f)
+
+ prelines = None
+ errors = []
+ for pat in pats:
+ if len(pat) == 3:
+ p, msg, ignore = pat
+ else:
+ p, msg = pat
+ ignore = None
+
+ # fix-up regexes for multiline searches
+ po = p
+ # \s doesn't match \n
+ p = re.sub(r'(?<!\\)\\s', r'[ \\t]', p)
+ # [^...] doesn't match newline
+ p = re.sub(r'(?<!\\)\[\^', r'[^\\n', p)
+
+ #print po, '=>', p
+
+ pos = 0
+ n = 0
+ for m in re.finditer(p, post, re.MULTILINE):
+ if prelines is None:
+ prelines = pre.splitlines()
+ postlines = post.splitlines(True)
+
+ start = m.start()
+ while n < len(postlines):
+ step = len(postlines[n])
+ if pos + step > start:
+ break
+ pos += step
+ n += 1
+ l = prelines[n]
+
+ if "check-code" + "-ignore" in l:
+ if debug:
+ print "Skipping %s for %s:%s (check-code -ignore)" % (
+ name, f, n)
+ continue
+ elif ignore and re.search(ignore, l, re.MULTILINE):
+ continue
+ bd = ""
+ if blame:
+ bd = 'working directory'
+ if not blamecache:
+ blamecache = getblame(f)
+ if n < len(blamecache):
+ bl, bu, br = blamecache[n]
+ if bl == l:
+ bd = '%s@%s' % (bu, br)
+ errors.append((f, lineno and n + 1, l, msg, bd))
+ result = False
+
+ errors.sort()
+ for e in errors:
+ logfunc(*e)
+ fc += 1
+ if maxerr and fc >= maxerr:
+ print " (too many errors, giving up)"
+ break
+
+ return result
+
+if __name__ == "__main__":
+ parser = optparse.OptionParser("%prog [options] [files]")
+ parser.add_option("-w", "--warnings", action="store_true",
+ help="include warning-level checks")
+ parser.add_option("-p", "--per-file", type="int",
+ help="max warnings per file")
+ parser.add_option("-b", "--blame", action="store_true",
+ help="use annotate to generate blame info")
+ parser.add_option("", "--debug", action="store_true",
+ help="show debug information")
+ parser.add_option("", "--nolineno", action="store_false",
+ dest='lineno', help="don't show line numbers")
+
+ parser.set_defaults(per_file=15, warnings=False, blame=False, debug=False,
+ lineno=True)
+ (options, args) = parser.parse_args()
+
+ if len(args) == 0:
+ check = glob.glob("*")
+ else:
+ check = args
+
+ ret = 0
+ for f in check:
+ if not checkfile(f, maxerr=options.per_file, warnings=options.warnings,
+ blame=options.blame, debug=options.debug,
+ lineno=options.lineno):
+ ret = 1
+ sys.exit(ret)
diff --git a/contrib/convert-repo b/contrib/convert-repo
new file mode 100755
index 0000000..4113f40
--- /dev/null
+++ b/contrib/convert-repo
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+#
+# Wrapper script around the convert.py hgext extension
+# for foreign SCM conversion to mercurial format.
+#
+
+import sys
+from mercurial import ui, fancyopts
+from hgext import convert
+
+# Options extracted from the cmdtable
+func, options, help = convert.cmdtable['convert']
+
+# An ui instance
+u = ui.ui()
+
+opts = {}
+args = []
+try:
+ args = list(fancyopts.fancyopts(sys.argv[1:], options, opts))
+ args += [None]*(3 - len(args))
+ src, dest, revmapfile = args
+except (fancyopts.getopt.GetoptError, ValueError), inst:
+ u.warn('Usage:\n%s\n' % help)
+ sys.exit(-1)
+
+convert.convert(u, src, dest, revmapfile, **opts)
diff --git a/contrib/debugcmdserver.py b/contrib/debugcmdserver.py
new file mode 100755
index 0000000..859ee9a
--- /dev/null
+++ b/contrib/debugcmdserver.py
@@ -0,0 +1,47 @@
+#!/usr/bin/env python
+#
+# Dumps output generated by Mercurial's command server in a formatted style to a
+# given file or stderr if '-' is specified. Output is also written in its raw
+# format to stdout.
+#
+# $ ./hg serve --cmds pipe | ./contrib/debugcmdserver.py -
+# o, 52 -> 'capabilities: getencoding runcommand\nencoding: UTF-8'
+
+import sys, struct
+
+if len(sys.argv) != 2:
+ print 'usage: debugcmdserver.py FILE'
+ sys.exit(1)
+
+outputfmt = '>cI'
+outputfmtsize = struct.calcsize(outputfmt)
+
+if sys.argv[1] == '-':
+ log = sys.stderr
+else:
+ log = open(sys.argv[1], 'a')
+
+def read(size):
+ data = sys.stdin.read(size)
+ if not data:
+ raise EOFError
+ sys.stdout.write(data)
+ sys.stdout.flush()
+ return data
+
+try:
+ while True:
+ header = read(outputfmtsize)
+ channel, length = struct.unpack(outputfmt, header)
+ log.write('%s, %-4d' % (channel, length))
+ if channel in 'IL':
+ log.write(' -> waiting for input\n')
+ else:
+ data = read(length)
+ log.write(' -> %r\n' % data)
+ log.flush()
+except EOFError:
+ pass
+finally:
+ if log != sys.stderr:
+ log.close()
diff --git a/contrib/debugshell.py b/contrib/debugshell.py
new file mode 100644
index 0000000..6ca4999
--- /dev/null
+++ b/contrib/debugshell.py
@@ -0,0 +1,21 @@
+# debugshell extension
+"""a python shell with repo, changelog & manifest objects"""
+
+import mercurial
+import code
+
+def debugshell(ui, repo, **opts):
+ objects = {
+ 'mercurial': mercurial,
+ 'repo': repo,
+ 'cl': repo.changelog,
+ 'mf': repo.manifest,
+ }
+ bannermsg = "loaded repo : %s\n" \
+ "using source: %s" % (repo.root,
+ mercurial.__path__[0])
+ code.interact(bannermsg, local=objects)
+
+cmdtable = {
+ "debugshell|dbsh": (debugshell, [])
+}
diff --git a/contrib/dumprevlog b/contrib/dumprevlog
new file mode 100755
index 0000000..8bb9c4e
--- /dev/null
+++ b/contrib/dumprevlog
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# Dump revlogs as raw data stream
+# $ find .hg/store/ -name "*.i" | xargs dumprevlog > repo.dump
+
+import sys
+from mercurial import revlog, node, util
+
+for fp in (sys.stdin, sys.stdout, sys.stderr):
+ util.setbinary(fp)
+
+for f in sys.argv[1:]:
+ binopen = lambda fn: open(fn, 'rb')
+ r = revlog.revlog(binopen, f)
+ print "file:", f
+ for i in r:
+ n = r.node(i)
+ p = r.parents(n)
+ d = r.revision(n)
+ print "node:", node.hex(n)
+ print "linkrev:", r.linkrev(i)
+ print "parents:", node.hex(p[0]), node.hex(p[1])
+ print "length:", len(d)
+ print "-start-"
+ print d
+ print "-end-"
diff --git a/contrib/hg-ssh b/contrib/hg-ssh
new file mode 100755
index 0000000..5021958
--- /dev/null
+++ b/contrib/hg-ssh
@@ -0,0 +1,86 @@
+#!/usr/bin/env python
+#
+# Copyright 2005-2007 by Intevation GmbH <intevation@intevation.de>
+#
+# Author(s):
+# Thomas Arendsen Hein <thomas@intevation.de>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""
+hg-ssh - a wrapper for ssh access to a limited set of mercurial repos
+
+To be used in ~/.ssh/authorized_keys with the "command" option, see sshd(8):
+command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ...
+(probably together with these other useful options:
+ no-port-forwarding,no-X11-forwarding,no-agent-forwarding)
+
+This allows pull/push over ssh from/to the repositories given as arguments.
+
+If all your repositories are subdirectories of a common directory, you can
+allow shorter paths with:
+command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2"
+
+You can use pattern matching of your normal shell, e.g.:
+command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"
+
+You can also add a --read-only flag to allow read-only access to a key, e.g.:
+command="hg-ssh --read-only repos/*"
+"""
+
+# enable importing on demand to reduce startup time
+from mercurial import demandimport; demandimport.enable()
+
+from mercurial import dispatch
+
+import sys, os, shlex
+
+def main():
+ cwd = os.getcwd()
+ readonly = False
+ args = sys.argv[1:]
+ while len(args):
+ if args[0] == '--read-only':
+ readonly = True
+ args.pop(0)
+ else:
+ break
+ allowed_paths = [os.path.normpath(os.path.join(cwd,
+ os.path.expanduser(path)))
+ for path in args]
+ orig_cmd = os.getenv('SSH_ORIGINAL_COMMAND', '?')
+ try:
+ cmdargv = shlex.split(orig_cmd)
+ except ValueError, e:
+ sys.stderr.write('Illegal command "%s": %s\n' % (orig_cmd, e))
+ sys.exit(255)
+
+ if cmdargv[:2] == ['hg', '-R'] and cmdargv[3:] == ['serve', '--stdio']:
+ path = cmdargv[2]
+ repo = os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
+ if repo in allowed_paths:
+ cmd = ['-R', repo, 'serve', '--stdio']
+ if readonly:
+ cmd += [
+ '--config',
+ 'hooks.prechangegroup.hg-ssh=python:__main__.rejectpush',
+ '--config',
+ 'hooks.prepushkey.hg-ssh=python:__main__.rejectpush'
+ ]
+ dispatch.dispatch(dispatch.request(cmd))
+ else:
+ sys.stderr.write('Illegal repository "%s"\n' % repo)
+ sys.exit(255)
+ else:
+ sys.stderr.write('Illegal command "%s"\n' % orig_cmd)
+ sys.exit(255)
+
+def rejectpush(ui, **kwargs):
+ ui.warn("Permission denied\n")
+ # mercurial hooks use unix process conventions for hook return values
+ # so a truthy return means failure
+ return True
+
+if __name__ == '__main__':
+ main()
diff --git a/contrib/hgfixes/__init__.py b/contrib/hgfixes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/contrib/hgfixes/__init__.py
diff --git a/contrib/hgfixes/fix_bytes.py b/contrib/hgfixes/fix_bytes.py
new file mode 100644
index 0000000..0890c21
--- /dev/null
+++ b/contrib/hgfixes/fix_bytes.py
@@ -0,0 +1,97 @@
+"""Fixer that changes plain strings to bytes strings."""
+
+import re
+
+from lib2to3 import fixer_base
+from lib2to3.pgen2 import token
+from lib2to3.fixer_util import Name
+from lib2to3.pygram import python_symbols as syms
+
+_re = re.compile(r'[rR]?[\'\"]')
+
+# XXX: Implementing a blacklist in 2to3 turned out to be more troublesome than
+# blacklisting some modules inside the fixers. So, this is what I came with.
+
+blacklist = ['mercurial/demandimport.py',
+ 'mercurial/py3kcompat.py', # valid python 3 already
+ 'mercurial/i18n.py',
+ ]
+
+def isdocstring(node):
+ def isclassorfunction(ancestor):
+ symbols = (syms.funcdef, syms.classdef)
+ # if the current node is a child of a function definition, a class
+ # definition or a file, then it is a docstring
+ if ancestor.type == syms.simple_stmt:
+ try:
+ while True:
+ if ancestor.type in symbols:
+ return True
+ ancestor = ancestor.parent
+ except AttributeError:
+ return False
+ return False
+
+ def ismodule(ancestor):
+ # Our child is a docstring if we are a simple statement, and our
+ # ancestor is file_input. In other words, our child is a lone string in
+ # the source file.
+ try:
+ if (ancestor.type == syms.simple_stmt and
+ ancestor.parent.type == syms.file_input):
+ return True
+ except AttributeError:
+ return False
+
+ def isdocassignment(ancestor):
+ # Assigning to __doc__, definitely a string
+ try:
+ while True:
+ if (ancestor.type == syms.expr_stmt and
+ Name('__doc__') in ancestor.children):
+ return True
+ ancestor = ancestor.parent
+ except AttributeError:
+ return False
+
+ if ismodule(node.parent) or \
+ isdocassignment(node.parent) or \
+ isclassorfunction(node.parent):
+ return True
+ return False
+
+def shouldtransform(node):
+ specialnames = ['__main__']
+
+ if node.value in specialnames:
+ return False
+
+ ggparent = node.parent.parent.parent
+ sggparent = str(ggparent)
+
+ if 'getattr' in sggparent or \
+ 'hasattr' in sggparent or \
+ 'setattr' in sggparent or \
+ 'encode' in sggparent or \
+ 'decode' in sggparent:
+ return False
+
+ return True
+
+class FixBytes(fixer_base.BaseFix):
+
+ PATTERN = 'STRING'
+
+ def transform(self, node, results):
+ if self.filename in blacklist:
+ return
+ if node.type == token.STRING:
+ if _re.match(node.value):
+ if isdocstring(node):
+ return
+ if not shouldtransform(node):
+ return
+ new = node.clone()
+ new.value = 'b' + new.value
+ return new
+
diff --git a/contrib/hgfixes/fix_bytesmod.py b/contrib/hgfixes/fix_bytesmod.py
new file mode 100644
index 0000000..a72037b
--- /dev/null
+++ b/contrib/hgfixes/fix_bytesmod.py
@@ -0,0 +1,63 @@
+"""Fixer that changes bytes % whatever to a function that actually formats
+it."""
+
+from lib2to3 import fixer_base
+from lib2to3.fixer_util import is_tuple, Call, Comma, Name, touch_import
+
+# XXX: Implementing a blacklist in 2to3 turned out to be more troublesome than
+# blacklisting some modules inside the fixers. So, this is what I came with.
+
+blacklist = ['mercurial/demandimport.py',
+ 'mercurial/py3kcompat.py',
+ 'mercurial/i18n.py',
+ ]
+
+def isnumberremainder(formatstr, data):
+ try:
+ if data.value.isdigit():
+ return True
+ except AttributeError:
+ return False
+
+class FixBytesmod(fixer_base.BaseFix):
+ # XXX: There's one case (I suppose) I can't handle: when a remainder
+ # operation like foo % bar is performed, I can't really know what the
+ # contents of foo and bar are. I believe the best approach is to "correct"
+ # the to-be-converted code and let bytesformatter handle that case in
+ # runtime.
+ PATTERN = '''
+ term< formatstr=STRING '%' data=STRING > |
+ term< formatstr=STRING '%' data=atom > |
+ term< formatstr=NAME '%' data=any > |
+ term< formatstr=any '%' data=any >
+ '''
+
+ def transform(self, node, results):
+ if self.filename in blacklist:
+ return
+ elif self.filename == 'mercurial/util.py':
+ touch_import('.', 'py3kcompat', node=node)
+
+ formatstr = results['formatstr'].clone()
+ data = results['data'].clone()
+ formatstr.prefix = '' # remove spaces from start
+
+ if isnumberremainder(formatstr, data):
+ return
+
+ # We have two possibilities:
+ # 1- An identifier or name is passed, it is going to be a leaf, thus, we
+ # just need to copy its value as an argument to the formatter;
+ # 2- A tuple is explicitly passed. In this case, we're gonna explode it
+ # to pass to the formatter
+ # TODO: Check for normal strings. They don't need to be translated
+
+ if is_tuple(data):
+ args = [formatstr, Comma().clone()] + \
+ [c.clone() for c in data.children[:]]
+ else:
+ args = [formatstr, Comma().clone(), data]
+
+ call = Call(Name('bytesformatter', prefix = ' '), args)
+ return call
+
diff --git a/contrib/hgfixes/fix_leftover_imports.py b/contrib/hgfixes/fix_leftover_imports.py
new file mode 100644
index 0000000..d6b7de0
--- /dev/null
+++ b/contrib/hgfixes/fix_leftover_imports.py
@@ -0,0 +1,108 @@
+"Fixer that translates some APIs ignored by the default 2to3 fixers."
+
+# FIXME: This fixer has some ugly hacks. Its main design is based on that of
+# fix_imports, from lib2to3. Unfortunately, the fix_imports framework only
+# changes module names "without dots", meaning it won't work for some changes
+# in the email module/package. Thus this fixer was born. I believe that with a
+# bit more thinking, a more generic fixer can be implemented, but I'll leave
+# that as future work.
+
+from lib2to3.fixer_util import Name
+from lib2to3.fixes import fix_imports
+
+# This maps the old names to the new names. Note that a drawback of the current
+# design is that the dictionary keys MUST have EXACTLY one dot (.) in them,
+# otherwise things will break. (If you don't need a module hierarchy, you're
+# better of just inherit from fix_imports and overriding the MAPPING dict.)
+
+MAPPING = {'email.Utils': 'email.utils',
+ 'email.Errors': 'email.errors',
+ 'email.Header': 'email.header',
+ 'email.Parser': 'email.parser',
+ 'email.Encoders': 'email.encoders',
+ 'email.MIMEText': 'email.mime.text',
+ 'email.MIMEBase': 'email.mime.base',
+ 'email.Generator': 'email.generator',
+ 'email.MIMEMultipart': 'email.mime.multipart',
+}
+
+def alternates(members):
+ return "(" + "|".join(map(repr, members)) + ")"
+
+def build_pattern(mapping=MAPPING):
+ packages = {}
+ for key in mapping:
+ # What we are doing here is the following: with dotted names, we'll
+ # have something like package_name <trailer '.' module>. Then, we are
+ # making a dictionary to copy this structure. For example, if
+ # mapping={'A.B': 'a.b', 'A.C': 'a.c'}, it will generate the dictionary
+ # {'A': ['b', 'c']} to, then, generate something like "A <trailer '.'
+ # ('b' | 'c')".
+ name = key.split('.')
+ prefix = name[0]
+ if prefix in packages:
+ packages[prefix].append(name[1:][0])
+ else:
+ packages[prefix] = name[1:]
+
+ mod_list = ' | '.join(["'%s' '.' ('%s')" %
+ (key, "' | '".join(packages[key])) for key in packages])
+ mod_list = '(' + mod_list + ' )'
+ bare_names = alternates(mapping.keys())
+
+ yield """name_import=import_name< 'import' module_name=dotted_name< %s > >
+ """ % mod_list
+
+ yield """name_import=import_name< 'import'
+ multiple_imports=dotted_as_names< any*
+ module_name=dotted_name< %s >
+ any* >
+ >""" % mod_list
+
+ packs = ' | '.join(["'%s' trailer<'.' ('%s')>" % (key,
+ "' | '".join(packages[key])) for key in packages])
+
+ yield "power< package=(%s) trailer<'.' any > any* >" % packs
+
+class FixLeftoverImports(fix_imports.FixImports):
+ # We want to run this fixer after fix_import has run (this shouldn't matter
+ # for hg, though, as setup3k prefers to run the default fixers first)
+ mapping = MAPPING
+
+ def build_pattern(self):
+ return "|".join(build_pattern(self.mapping))
+
+ def transform(self, node, results):
+ # Mostly copied from fix_imports.py
+ import_mod = results.get("module_name")
+ if import_mod:
+ try:
+ mod_name = import_mod.value
+ except AttributeError:
+ # XXX: A hack to remove whitespace prefixes and suffixes
+ mod_name = str(import_mod).strip()
+ new_name = self.mapping[mod_name]
+ import_mod.replace(Name(new_name, prefix=import_mod.prefix))
+ if "name_import" in results:
+ # If it's not a "from x import x, y" or "import x as y" import,
+ # marked its usage to be replaced.
+ self.replace[mod_name] = new_name
+ if "multiple_imports" in results:
+ # This is a nasty hack to fix multiple imports on a line (e.g.,
+ # "import StringIO, urlparse"). The problem is that I can't
+ # figure out an easy way to make a pattern recognize the keys of
+ # MAPPING randomly sprinkled in an import statement.
+ results = self.match(node)
+ if results:
+ self.transform(node, results)
+ else:
+ # Replace usage of the module.
+ # Now this is, mostly, a hack
+ bare_name = results["package"][0]
+ bare_name_text = ''.join(map(str, results['package'])).strip()
+ new_name = self.replace.get(bare_name_text)
+ prefix = results['package'][0].prefix
+ if new_name:
+ bare_name.replace(Name(new_name, prefix=prefix))
+ results["package"][1].replace(Name(''))
+
diff --git a/contrib/hgk b/contrib/hgk
new file mode 100755
index 0000000..337b241
--- /dev/null
+++ b/contrib/hgk
@@ -0,0 +1,4061 @@
+#!/usr/bin/env wish
+
+# Copyright (C) 2005 Paul Mackerras. All rights reserved.
+# This program is free software; it may be used, copied, modified
+# and distributed under the terms of the GNU General Public Licence,
+# either version 2, or (at your option) any later version.
+#
+# See hgk.py for extension usage and configuration.
+
+
+# Modified version of Tip 171:
+# http://www.tcl.tk/cgi-bin/tct/tip/171.html
+#
+# The in_mousewheel global was added to fix strange reentrancy issues.
+# The whole snipped is activated only under windows, mouse wheel
+# bindings working already under MacOSX and Linux.
+
+if {[tk windowingsystem] eq "win32"} {
+
+set mw_classes [list Text Listbox Table TreeCtrl]
+ foreach class $mw_classes { bind $class <MouseWheel> {} }
+
+set in_mousewheel 0
+
+proc ::tk::MouseWheel {wFired X Y D {shifted 0}} {
+ global in_mousewheel
+ if { $in_mousewheel != 0 } { return }
+ # Set event to check based on call
+ set evt "<[expr {$shifted?{Shift-}:{}}]MouseWheel>"
+ # do not double-fire in case the class already has a binding
+ if {[bind [winfo class $wFired] $evt] ne ""} { return }
+ # obtain the window the mouse is over
+ set w [winfo containing $X $Y]
+ # if we are outside the app, try and scroll the focus widget
+ if {![winfo exists $w]} { catch {set w [focus]} }
+ if {[winfo exists $w]} {
+
+ if {[bind $w $evt] ne ""} {
+ # Awkward ... this widget has a MouseWheel binding, but to
+ # trigger successfully in it, we must give it focus.
+ catch {focus} old
+ if {$w ne $old} { focus $w }
+ set in_mousewheel 1
+ event generate $w $evt -rootx $X -rooty $Y -delta $D
+ set in_mousewheel 0
+ if {$w ne $old} { focus $old }
+ return
+ }
+
+ # aqua and x11/win32 have different delta handling
+ if {[tk windowingsystem] ne "aqua"} {
+ set delta [expr {- ($D / 30)}]
+ } else {
+ set delta [expr {- ($D)}]
+ }
+ # scrollbars have different call conventions
+ if {[string match "*Scrollbar" [winfo class $w]]} {
+ catch {tk::ScrollByUnits $w \
+ [string index [$w cget -orient] 0] $delta}
+ } else {
+ set cmd [list $w [expr {$shifted ? "xview" : "yview"}] \
+ scroll $delta units]
+ # Walking up to find the proper widget (handles cases like
+ # embedded widgets in a canvas)
+ while {[catch $cmd] && [winfo toplevel $w] ne $w} {
+ set w [winfo parent $w]
+ }
+ }
+ }
+}
+
+bind all <MouseWheel> [list ::tk::MouseWheel %W %X %Y %D 0]
+
+# end of win32 section
+}
+
+
+# Unify right mouse button handling.
+# See "mouse buttons on macintosh" thread on comp.lang.tcl
+if {[tk windowingsystem] eq "aqua"} {
+ event add <<B3>> <Control-ButtonPress-1>
+ event add <<B3>> <Button-2>
+} else {
+ event add <<B3>> <Button-3>
+}
+
+proc gitdir {} {
+ global env
+ if {[info exists env(GIT_DIR)]} {
+ return $env(GIT_DIR)
+ } else {
+ return ".hg"
+ }
+}
+
+proc getcommits {rargs} {
+ global commits commfd phase canv mainfont env
+ global startmsecs nextupdate ncmupdate
+ global ctext maincursor textcursor leftover
+
+ # check that we can find a .git directory somewhere...
+ set gitdir [gitdir]
+ if {![file isdirectory $gitdir]} {
+ error_popup "Cannot find the git directory \"$gitdir\"."
+ exit 1
+ }
+ set commits {}
+ set phase getcommits
+ set startmsecs [clock clicks -milliseconds]
+ set nextupdate [expr $startmsecs + 100]
+ set ncmupdate 1
+ set limit 0
+ set revargs {}
+ for {set i 0} {$i < [llength $rargs]} {incr i} {
+ set opt [lindex $rargs $i]
+ if {$opt == "--limit"} {
+ incr i
+ set limit [lindex $rargs $i]
+ } else {
+ lappend revargs $opt
+ }
+ }
+ if [catch {
+ set parse_args [concat --default HEAD $revargs]
+ set parse_temp [eval exec {$env(HG)} --config ui.report_untrusted=false debug-rev-parse $parse_args]
+ regsub -all "\r\n" $parse_temp "\n" parse_temp
+ set parsed_args [split $parse_temp "\n"]
+ } err] {
+ # if git-rev-parse failed for some reason...
+ if {$rargs == {}} {
+ set revargs HEAD
+ }
+ set parsed_args $revargs
+ }
+ if {$limit > 0} {
+ set parsed_args [concat -n $limit $parsed_args]
+ }
+ if [catch {
+ set commfd [open "|{$env(HG)} --config ui.report_untrusted=false debug-rev-list --header --topo-order --parents $parsed_args" r]
+ } err] {
+ puts stderr "Error executing hg debug-rev-list: $err"
+ exit 1
+ }
+ set leftover {}
+ fconfigure $commfd -blocking 0 -translation lf
+ fileevent $commfd readable [list getcommitlines $commfd]
+ $canv delete all
+ $canv create text 3 3 -anchor nw -text "Reading commits..." \
+ -font $mainfont -tags textitems
+ . config -cursor watch
+ settextcursor watch
+}
+
+proc getcommitlines {commfd} {
+ global commits parents cdate children
+ global commitlisted phase commitinfo nextupdate
+ global stopped redisplaying leftover
+
+ set stuff [read $commfd]
+ if {$stuff == {}} {
+ if {![eof $commfd]} return
+ # set it blocking so we wait for the process to terminate
+ fconfigure $commfd -blocking 1
+ if {![catch {close $commfd} err]} {
+ after idle finishcommits
+ return
+ }
+ if {[string range $err 0 4] == "usage"} {
+ set err \
+{Gitk: error reading commits: bad arguments to git-rev-list.
+(Note: arguments to gitk are passed to git-rev-list
+to allow selection of commits to be displayed.)}
+ } else {
+ set err "Error reading commits: $err"
+ }
+ error_popup $err
+ exit 1
+ }
+ set start 0
+ while 1 {
+ set i [string first "\0" $stuff $start]
+ if {$i < 0} {
+ append leftover [string range $stuff $start end]
+ return
+ }
+ set cmit [string range $stuff $start [expr {$i - 1}]]
+ if {$start == 0} {
+ set cmit "$leftover$cmit"
+ set leftover {}
+ }
+ set start [expr {$i + 1}]
+ regsub -all "\r\n" $cmit "\n" cmit
+ set j [string first "\n" $cmit]
+ set ok 0
+ if {$j >= 0} {
+ set ids [string range $cmit 0 [expr {$j - 1}]]
+ set ok 1
+ foreach id $ids {
+ if {![regexp {^[0-9a-f]{12}$} $id]} {
+ set ok 0
+ break
+ }
+ }
+ }
+ if {!$ok} {
+ set shortcmit $cmit
+ if {[string length $shortcmit] > 80} {
+ set shortcmit "[string range $shortcmit 0 80]..."
+ }
+ error_popup "Can't parse hg debug-rev-list output: {$shortcmit}"
+ exit 1
+ }
+ set id [lindex $ids 0]
+ set olds [lrange $ids 1 end]
+ set cmit [string range $cmit [expr {$j + 1}] end]
+ lappend commits $id
+ set commitlisted($id) 1
+ parsecommit $id $cmit 1 [lrange $ids 1 end]
+ drawcommit $id
+ if {[clock clicks -milliseconds] >= $nextupdate} {
+ doupdate 1
+ }
+ while {$redisplaying} {
+ set redisplaying 0
+ if {$stopped == 1} {
+ set stopped 0
+ set phase "getcommits"
+ foreach id $commits {
+ drawcommit $id
+ if {$stopped} break
+ if {[clock clicks -milliseconds] >= $nextupdate} {
+ doupdate 1
+ }
+ }
+ }
+ }
+ }
+}
+
+proc doupdate {reading} {
+ global commfd nextupdate numcommits ncmupdate
+
+ if {$reading} {
+ fileevent $commfd readable {}
+ }
+ update
+ set nextupdate [expr {[clock clicks -milliseconds] + 100}]
+ if {$numcommits < 100} {
+ set ncmupdate [expr {$numcommits + 1}]
+ } elseif {$numcommits < 10000} {
+ set ncmupdate [expr {$numcommits + 10}]
+ } else {
+ set ncmupdate [expr {$numcommits + 100}]
+ }
+ if {$reading} {
+ fileevent $commfd readable [list getcommitlines $commfd]
+ }
+}
+
+proc readcommit {id} {
+ global env
+ if [catch {set contents [exec $env(HG) --config ui.report_untrusted=false debug-cat-file commit $id]}] return
+ parsecommit $id $contents 0 {}
+}
+
+proc parsecommit {id contents listed olds} {
+ global commitinfo children nchildren parents nparents cdate ncleft
+ global firstparents
+
+ set inhdr 1
+ set comment {}
+ set headline {}
+ set auname {}
+ set audate {}
+ set comname {}
+ set comdate {}
+ set rev {}
+ set branch {}
+ set bookmark {}
+ if {![info exists nchildren($id)]} {
+ set children($id) {}
+ set nchildren($id) 0
+ set ncleft($id) 0
+ }
+ set parents($id) $olds
+ set nparents($id) [llength $olds]
+ foreach p $olds {
+ if {![info exists nchildren($p)]} {
+ set children($p) [list $id]
+ set nchildren($p) 1
+ set ncleft($p) 1
+ } elseif {[lsearch -exact $children($p) $id] < 0} {
+ lappend children($p) $id
+ incr nchildren($p)
+ incr ncleft($p)
+ }
+ }
+ regsub -all "\r\n" $contents "\n" contents
+ foreach line [split $contents "\n"] {
+ if {$inhdr} {
+ set line [split $line]
+ if {$line == {}} {
+ set inhdr 0
+ } else {
+ set tag [lindex $line 0]
+ if {$tag == "author"} {
+ set x [expr {[llength $line] - 2}]
+ set audate [lindex $line $x]
+ set auname [join [lrange $line 1 [expr {$x - 1}]]]
+ } elseif {$tag == "committer"} {
+ set x [expr {[llength $line] - 2}]
+ set comdate [lindex $line $x]
+ set comname [join [lrange $line 1 [expr {$x - 1}]]]
+ } elseif {$tag == "revision"} {
+ set rev [lindex $line 1]
+ } elseif {$tag == "branch"} {
+ set branch [join [lrange $line 1 end]]
+ } elseif {$tag == "bookmark"} {
+ set bookmark [join [lrange $line 1 end]]
+ }
+ }
+ } else {
+ if {$comment == {}} {
+ set headline [string trim $line]
+ } else {
+ append comment "\n"
+ }
+ if {!$listed} {
+ # git-rev-list indents the comment by 4 spaces;
+ # if we got this via git-cat-file, add the indentation
+ append comment " "
+ }
+ append comment $line
+ }
+ }
+ if {$audate != {}} {
+ set audate [clock format $audate -format "%Y-%m-%d %H:%M:%S"]
+ }
+ if {$comdate != {}} {
+ set cdate($id) $comdate
+ set comdate [clock format $comdate -format "%Y-%m-%d %H:%M:%S"]
+ }
+ set commitinfo($id) [list $headline $auname $audate \
+ $comname $comdate $comment $rev $branch $bookmark]
+
+ if {[info exists firstparents]} {
+ set i [lsearch $firstparents $id]
+ if {$i != -1} {
+ # remove the parent from firstparents, possible building
+ # an empty list
+ set firstparents [concat \
+ [lrange $firstparents 0 [expr $i - 1]] \
+ [lrange $firstparents [expr $i + 1] end]]
+ if {$firstparents eq {}} {
+ # we have found all parents of the first changeset
+ # which means that we can safely select the first line
+ after idle {
+ selectline 0 0
+ }
+ }
+ }
+ } else {
+ # this is the first changeset, save the parents
+ set firstparents $olds
+ if {$firstparents eq {}} {
+ # a repository with a single changeset
+ after idle {
+ selectline 0 0
+ }
+ }
+ }
+}
+
+proc readrefs {} {
+ global bookmarkcurrent bookmarkids tagids idtags idbookmarks headids idheads tagcontents env curid
+
+ set status [catch {exec $env(HG) --config ui.report_untrusted=false id} curid]
+ if { $status != 0 } {
+ puts $::errorInfo
+ if { ![string equal $::errorCode NONE] } {
+ exit 2
+ }
+ }
+ regexp -- {[[:xdigit:]]+} $curid curid
+
+ set status [catch {exec $env(HG) --config ui.report_untrusted=false tags} tags]
+ if { $status != 0 } {
+ puts $::errorInfo
+ if { ![string equal $::errorCode NONE] } {
+ exit 2
+ }
+ }
+ regsub -all "\r\n" $tags "\n" tags
+
+ set lines [split $tags "\n"]
+ foreach f $lines {
+ regexp {(\S+)$} $f full
+ regsub {\s+(\S+)$} $f "" direct
+ set sha [split $full ':']
+ set tag [lindex $sha 1]
+ lappend tagids($direct) $tag
+ lappend idtags($tag) $direct
+ }
+
+ set status [catch {exec $env(HG) --config ui.report_untrusted=false heads} heads]
+ if { $status != 0 } {
+ puts $::errorInfo
+ if { ![string equal $::errorCode NONE] } {
+ exit 2
+ }
+ }
+ regsub -all "\r\n" $heads "\n" heads
+
+ set lines [split $heads "\n"]
+ foreach f $lines {
+ set match ""
+ regexp {changeset:\s+(\S+):(\S+)$} $f match id sha
+ if {$match != ""} {
+ lappend idheads($sha) $id
+ }
+ }
+
+ set status [catch {exec $env(HG) --config ui.report_untrusted=false bookmarks} bookmarks]
+ if { $status != 0 } {
+ puts $::errorInfo
+ if { ![string equal $::errorCode NONE] } {
+ exit 2
+ }
+ }
+ set lines [split $bookmarks "\n"]
+ set bookmarkcurrent 0
+ foreach f $lines {
+ regexp {(\S+)$} $f full
+ regsub {\s+(\S+)$} $f "" direct
+ set sha [split $full ':']
+ set bookmark [lindex $sha 1]
+ set current [string first " * " $direct)]
+ regsub {^\s(\*|\s)\s} $direct "" direct
+ lappend bookmarkids($direct) $bookmark
+ lappend idbookmarks($bookmark) $direct
+ if {$current >= 0} {
+ set bookmarkcurrent $direct
+ }
+ }
+}
+
+proc readotherrefs {base dname excl} {
+ global otherrefids idotherrefs
+
+ set git [gitdir]
+ set files [glob -nocomplain -types f [file join $git $base *]]
+ foreach f $files {
+ catch {
+ set fd [open $f r]
+ set line [read $fd 40]
+ if {[regexp {^[0-9a-f]{12}} $line id]} {
+ set name "$dname[file tail $f]"
+ set otherrefids($name) $id
+ lappend idotherrefs($id) $name
+ }
+ close $fd
+ }
+ }
+ set dirs [glob -nocomplain -types d [file join $git $base *]]
+ foreach d $dirs {
+ set dir [file tail $d]
+ if {[lsearch -exact $excl $dir] >= 0} continue
+ readotherrefs [file join $base $dir] "$dname$dir/" {}
+ }
+}
+
+proc allcansmousewheel {delta} {
+ set delta [expr -5*(int($delta)/abs($delta))]
+ allcanvs yview scroll $delta units
+}
+
+proc error_popup msg {
+ set w .error
+ toplevel $w
+ wm transient $w .
+ message $w.m -text $msg -justify center -aspect 400
+ pack $w.m -side top -fill x -padx 20 -pady 20
+ button $w.ok -text OK -command "destroy $w"
+ pack $w.ok -side bottom -fill x
+ bind $w <Visibility> "grab $w; focus $w"
+ tkwait window $w
+}
+
+proc makewindow {} {
+ global canv canv2 canv3 linespc charspc ctext cflist textfont
+ global findtype findtypemenu findloc findstring fstring geometry
+ global entries sha1entry sha1string sha1but
+ global maincursor textcursor curtextcursor
+ global rowctxmenu gaudydiff mergemax
+ global hgvdiff bgcolor fgcolor diffremcolor diffaddcolor diffmerge1color
+ global diffmerge2color hunksepcolor
+ global posx posy
+
+ if {[info exists posx]} {
+ wm geometry . +$posx+$posy
+ }
+
+ menu .bar
+ .bar add cascade -label "File" -menu .bar.file
+ menu .bar.file
+ .bar.file add command -label "Reread references" -command rereadrefs
+ .bar.file add command -label "Quit" -command doquit
+ menu .bar.help
+ .bar add cascade -label "Help" -menu .bar.help
+ .bar.help add command -label "About hgk" -command about
+ . configure -menu .bar
+
+ if {![info exists geometry(canv1)]} {
+ set geometry(canv1) [expr 45 * $charspc]
+ set geometry(canv2) [expr 30 * $charspc]
+ set geometry(canv3) [expr 15 * $charspc]
+ set geometry(canvh) [expr 25 * $linespc + 4]
+ set geometry(ctextw) 80
+ set geometry(ctexth) 30
+ set geometry(cflistw) 30
+ }
+ panedwindow .ctop -orient vertical
+ if {[info exists geometry(width)]} {
+ .ctop conf -width $geometry(width) -height $geometry(height)
+ set texth [expr {$geometry(height) - $geometry(canvh) - 56}]
+ set geometry(ctexth) [expr {($texth - 8) /
+ [font metrics $textfont -linespace]}]
+ }
+ frame .ctop.top
+ frame .ctop.top.bar
+ pack .ctop.top.bar -side bottom -fill x
+ set cscroll .ctop.top.csb
+ scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0
+ pack $cscroll -side right -fill y
+ panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4
+ pack .ctop.top.clist -side top -fill both -expand 1
+ .ctop add .ctop.top
+ set canv .ctop.top.clist.canv
+ canvas $canv -height $geometry(canvh) -width $geometry(canv1) \
+ -bg $bgcolor -bd 0 \
+ -yscrollincr $linespc -yscrollcommand "$cscroll set" -selectbackground grey
+ .ctop.top.clist add $canv
+ set canv2 .ctop.top.clist.canv2
+ canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \
+ -bg $bgcolor -bd 0 -yscrollincr $linespc -selectbackground grey
+ .ctop.top.clist add $canv2
+ set canv3 .ctop.top.clist.canv3
+ canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \
+ -bg $bgcolor -bd 0 -yscrollincr $linespc -selectbackground grey
+ .ctop.top.clist add $canv3
+ bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}
+
+ set sha1entry .ctop.top.bar.sha1
+ set entries $sha1entry
+ set sha1but .ctop.top.bar.sha1label
+ button $sha1but -text "SHA1 ID: " -state disabled -relief flat \
+ -command gotocommit -width 8
+ $sha1but conf -disabledforeground [$sha1but cget -foreground]
+ pack .ctop.top.bar.sha1label -side left
+ entry $sha1entry -width 40 -font $textfont -textvariable sha1string
+ trace add variable sha1string write sha1change
+ pack $sha1entry -side left -pady 2
+
+ image create bitmap bm-left -data {
+ #define left_width 16
+ #define left_height 16
+ static unsigned char left_bits[] = {
+ 0x00, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1c, 0x00,
+ 0x0e, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x0e, 0x00, 0x1c, 0x00,
+ 0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01};
+ }
+ image create bitmap bm-right -data {
+ #define right_width 16
+ #define right_height 16
+ static unsigned char right_bits[] = {
+ 0x00, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x1c,
+ 0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
+ 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
+ }
+ button .ctop.top.bar.leftbut -image bm-left -command goback \
+ -state disabled -width 26
+ pack .ctop.top.bar.leftbut -side left -fill y
+ button .ctop.top.bar.rightbut -image bm-right -command goforw \
+ -state disabled -width 26
+ pack .ctop.top.bar.rightbut -side left -fill y
+
+ button .ctop.top.bar.findbut -text "Find" -command dofind
+ pack .ctop.top.bar.findbut -side left
+ set findstring {}
+ set fstring .ctop.top.bar.findstring
+ lappend entries $fstring
+ entry $fstring -width 30 -font $textfont -textvariable findstring
+ pack $fstring -side left -expand 1 -fill x
+ set findtype Exact
+ set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \
+ findtype Exact IgnCase Regexp]
+ set findloc "All fields"
+ tk_optionMenu .ctop.top.bar.findloc findloc "All fields" Headline \
+ Comments Author Committer Files Pickaxe
+ pack .ctop.top.bar.findloc -side right
+ pack .ctop.top.bar.findtype -side right
+ # for making sure type==Exact whenever loc==Pickaxe
+ trace add variable findloc write findlocchange
+
+ panedwindow .ctop.cdet -orient horizontal
+ .ctop add .ctop.cdet
+ frame .ctop.cdet.left
+ set ctext .ctop.cdet.left.ctext
+ text $ctext -fg $fgcolor -bg $bgcolor -state disabled -font $textfont \
+ -width $geometry(ctextw) -height $geometry(ctexth) \
+ -yscrollcommand ".ctop.cdet.left.sb set" \
+ -xscrollcommand ".ctop.cdet.left.hb set" -wrap none
+ scrollbar .ctop.cdet.left.sb -command "$ctext yview"
+ scrollbar .ctop.cdet.left.hb -orient horizontal -command "$ctext xview"
+ pack .ctop.cdet.left.sb -side right -fill y
+ pack .ctop.cdet.left.hb -side bottom -fill x
+ pack $ctext -side left -fill both -expand 1
+ .ctop.cdet add .ctop.cdet.left
+
+ $ctext tag conf filesep -font [concat $textfont bold] -back "#aaaaaa"
+ if {$gaudydiff} {
+ $ctext tag conf hunksep -back blue -fore white
+ $ctext tag conf d0 -back "#ff8080"
+ $ctext tag conf d1 -back green
+ } else {
+ $ctext tag conf hunksep -fore $hunksepcolor
+ $ctext tag conf d0 -fore $diffremcolor
+ $ctext tag conf d1 -fore $diffaddcolor
+
+ # The mX colours seem to be used in merge changesets, where m0
+ # is first parent, m1 is second parent and so on. Git can have
+ # several parents, Hg cannot, so I think the m2..mmax would be
+ # unused.
+ $ctext tag conf m0 -fore $diffmerge1color
+ $ctext tag conf m1 -fore $diffmerge2color
+ $ctext tag conf m2 -fore green
+ $ctext tag conf m3 -fore purple
+ $ctext tag conf m4 -fore brown
+ $ctext tag conf mmax -fore darkgrey
+ set mergemax 5
+ $ctext tag conf mresult -font [concat $textfont bold]
+ $ctext tag conf msep -font [concat $textfont bold]
+ $ctext tag conf found -back yellow
+ }
+
+ frame .ctop.cdet.right
+ set cflist .ctop.cdet.right.cfiles
+ listbox $cflist -fg $fgcolor -bg $bgcolor \
+ -selectmode extended -width $geometry(cflistw) \
+ -yscrollcommand ".ctop.cdet.right.sb set"
+ scrollbar .ctop.cdet.right.sb -command "$cflist yview"
+ pack .ctop.cdet.right.sb -side right -fill y
+ pack $cflist -side left -fill both -expand 1
+ .ctop.cdet add .ctop.cdet.right
+ bind .ctop.cdet <Configure> {resizecdetpanes %W %w}
+
+ pack .ctop -side top -fill both -expand 1
+
+ bindall <1> {selcanvline %W %x %y}
+ #bindall <B1-Motion> {selcanvline %W %x %y}
+ bindall <MouseWheel> "allcansmousewheel %D"
+ bindall <ButtonRelease-4> "allcanvs yview scroll -5 units"
+ bindall <ButtonRelease-5> "allcanvs yview scroll 5 units"
+ bindall <2> "allcanvs scan mark 0 %y"
+ bindall <B2-Motion> "allcanvs scan dragto 0 %y"
+ bind . <Key-Up> "selnextline -1"
+ bind . <Key-Down> "selnextline 1"
+ bind . <Key-Prior> "allcanvs yview scroll -1 pages"
+ bind . <Key-Next> "allcanvs yview scroll 1 pages"
+ bindkey <Key-Delete> "$ctext yview scroll -1 pages"
+ bindkey <Key-BackSpace> "$ctext yview scroll -1 pages"
+ bindkey <Key-space> "$ctext yview scroll 1 pages"
+ bindkey p "selnextline -1"
+ bindkey n "selnextline 1"
+ bindkey b "$ctext yview scroll -1 pages"
+ bindkey d "$ctext yview scroll 18 units"
+ bindkey u "$ctext yview scroll -18 units"
+ bindkey / {findnext 1}
+ bindkey <Key-Return> {findnext 0}
+ bindkey ? findprev
+ bindkey f nextfile
+ bind . <Control-q> doquit
+ bind . <Control-w> doquit
+ bind . <Control-f> dofind
+ bind . <Control-g> {findnext 0}
+ bind . <Control-r> findprev
+ bind . <Control-equal> {incrfont 1}
+ bind . <Control-KP_Add> {incrfont 1}
+ bind . <Control-minus> {incrfont -1}
+ bind . <Control-KP_Subtract> {incrfont -1}
+ bind $cflist <<ListboxSelect>> listboxsel
+ bind . <Destroy> {savestuff %W}
+ bind . <Button-1> "click %W"
+ bind $fstring <Key-Return> dofind
+ bind $sha1entry <Key-Return> gotocommit
+ bind $sha1entry <<PasteSelection>> clearsha1
+
+ set maincursor [. cget -cursor]
+ set textcursor [$ctext cget -cursor]
+ set curtextcursor $textcursor
+
+ set rowctxmenu .rowctxmenu
+ menu $rowctxmenu -tearoff 0
+ $rowctxmenu add command -label "Diff this -> selected" \
+ -command {diffvssel 0}
+ $rowctxmenu add command -label "Diff selected -> this" \
+ -command {diffvssel 1}
+ $rowctxmenu add command -label "Make patch" -command mkpatch
+ $rowctxmenu add command -label "Create tag" -command mktag
+ $rowctxmenu add command -label "Write commit to file" -command writecommit
+ if { $hgvdiff ne "" } {
+ $rowctxmenu add command -label "Visual diff with parent" \
+ -command {vdiff 1}
+ $rowctxmenu add command -label "Visual diff with selected" \
+ -command {vdiff 0}
+ }
+}
+
+# when we make a key binding for the toplevel, make sure
+# it doesn't get triggered when that key is pressed in the
+# find string entry widget.
+proc bindkey {ev script} {
+ global entries
+ bind . $ev $script
+ set escript [bind Entry $ev]
+ if {$escript == {}} {
+ set escript [bind Entry <Key>]
+ }
+ foreach e $entries {
+ bind $e $ev "$escript; break"
+ }
+}
+
+# set the focus back to the toplevel for any click outside
+# the entry widgets
+proc click {w} {
+ global entries
+ foreach e $entries {
+ if {$w == $e} return
+ }
+ focus .
+}
+
+proc savestuff {w} {
+ global canv canv2 canv3 ctext cflist mainfont textfont
+ global stuffsaved findmergefiles gaudydiff maxgraphpct
+ global maxwidth authorcolors curidfont bgcolor fgcolor
+ global diffremcolor diffaddcolor hunksepcolor
+ global diffmerge1color diffmerge2color
+
+ if {$stuffsaved} return
+ if {![winfo viewable .]} return
+ catch {
+ set f [open "~/.hgk-new" w]
+ puts $f [list set mainfont $mainfont]
+ puts $f [list set curidfont $curidfont]
+ puts $f [list set textfont $textfont]
+ puts $f [list set findmergefiles $findmergefiles]
+ puts $f [list set gaudydiff $gaudydiff]
+ puts $f [list set maxgraphpct $maxgraphpct]
+ puts $f [list set maxwidth $maxwidth]
+ puts $f "set geometry(width) [winfo width .ctop]"
+ puts $f "set geometry(height) [winfo height .ctop]"
+ puts $f "set geometry(canv1) [expr [winfo width $canv]-2]"
+ puts $f "set geometry(canv2) [expr [winfo width $canv2]-2]"
+ puts $f "set geometry(canv3) [expr [winfo width $canv3]-2]"
+ puts $f "set geometry(canvh) [expr [winfo height $canv]-2]"
+ set wid [expr {([winfo width $ctext] - 8) \
+ / [font measure $textfont "0"]}]
+ puts $f "set geometry(ctextw) $wid"
+ set wid [expr {([winfo width $cflist] - 11) \
+ / [font measure [$cflist cget -font] "0"]}]
+ puts $f "set geometry(cflistw) $wid"
+ puts $f "#"
+ puts $f "# main window position:"
+ puts $f "set posx [winfo x .]"
+ puts $f "set posy [winfo y .]"
+ puts $f "#"
+ puts $f "# authorcolors format:"
+ puts $f "#"
+ puts $f "# zero or more sublists of"
+ puts $f "#"
+ puts $f "# { regex color }"
+ puts $f "#"
+ puts $f "# followed by a list of colors"
+ puts $f "#"
+ puts $f "# If the commit author matches a regex in a sublist,"
+ puts $f "# the commit will be colored by that color"
+ puts $f "# otherwise the next unused entry from the list of colors"
+ puts $f "# will be assigned to this commit and also all other commits"
+ puts $f "# of the same author. When the list of colors is exhausted,"
+ puts $f "# the last entry will be reused."
+ puts $f "#"
+ puts $f "set authorcolors {$authorcolors}"
+ puts $f "#"
+ puts $f "# The background color in the text windows"
+ puts $f "set bgcolor $bgcolor"
+ puts $f "#"
+ puts $f "# The text color used in the diff and file list view"
+ puts $f "set fgcolor $fgcolor"
+ puts $f "#"
+ puts $f "# Color to display + lines in diffs"
+ puts $f "set diffaddcolor $diffaddcolor"
+ puts $f "#"
+ puts $f "# Color to display - lines in diffs"
+ puts $f "set diffremcolor $diffremcolor"
+ puts $f "#"
+ puts $f "# Merge diffs: Color to signal lines from first parent"
+ puts $f "set diffmerge1color $diffmerge1color"
+ puts $f "#"
+ puts $f "# Merge diffs: Color to signal lines from second parent"
+ puts $f "set diffmerge2color $diffmerge2color"
+ puts $f "#"
+ puts $f "# Hunkseparator (@@ -lineno,lines +lineno,lines @@) color"
+ puts $f "set hunksepcolor $hunksepcolor"
+ close $f
+ file rename -force "~/.hgk-new" "~/.hgk"
+ }
+ set stuffsaved 1
+}
+
+proc resizeclistpanes {win w} {
+ global oldwidth
+ if [info exists oldwidth($win)] {
+ set s0 [$win sash coord 0]
+ set s1 [$win sash coord 1]
+ if {$w < 60} {
+ set sash0 [expr {int($w/2 - 2)}]
+ set sash1 [expr {int($w*5/6 - 2)}]
+ } else {
+ set factor [expr {1.0 * $w / $oldwidth($win)}]
+ set sash0 [expr {int($factor * [lindex $s0 0])}]
+ set sash1 [expr {int($factor * [lindex $s1 0])}]
+ if {$sash0 < 30} {
+ set sash0 30
+ }
+ if {$sash1 < $sash0 + 20} {
+ set sash1 [expr $sash0 + 20]
+ }
+ if {$sash1 > $w - 10} {
+ set sash1 [expr $w - 10]
+ if {$sash0 > $sash1 - 20} {
+ set sash0 [expr $sash1 - 20]
+ }
+ }
+ }
+ $win sash place 0 $sash0 [lindex $s0 1]
+ $win sash place 1 $sash1 [lindex $s1 1]
+ }
+ set oldwidth($win) $w
+}
+
+proc resizecdetpanes {win w} {
+ global oldwidth
+ if [info exists oldwidth($win)] {
+ set s0 [$win sash coord 0]
+ if {$w < 60} {
+ set sash0 [expr {int($w*3/4 - 2)}]
+ } else {
+ set factor [expr {1.0 * $w / $oldwidth($win)}]
+ set sash0 [expr {int($factor * [lindex $s0 0])}]
+ if {$sash0 < 45} {
+ set sash0 45
+ }
+ if {$sash0 > $w - 15} {
+ set sash0 [expr $w - 15]
+ }
+ }
+ $win sash place 0 $sash0 [lindex $s0 1]
+ }
+ set oldwidth($win) $w
+}
+
+proc allcanvs args {
+ global canv canv2 canv3
+ eval $canv $args
+ eval $canv2 $args
+ eval $canv3 $args
+}
+
+proc bindall {event action} {
+ global canv canv2 canv3
+ bind $canv $event $action
+ bind $canv2 $event $action
+ bind $canv3 $event $action
+}
+
+proc about {} {
+ set w .about
+ if {[winfo exists $w]} {
+ raise $w
+ return
+ }
+ toplevel $w
+ wm title $w "About hgk"
+ message $w.m -text {
+Hgk version 1.2
+
+Copyright © 2005 Paul Mackerras
+
+Use and redistribute under the terms of the GNU General Public License} \
+ -justify center -aspect 400
+ pack $w.m -side top -fill x -padx 20 -pady 20
+ button $w.ok -text Close -command "destroy $w"
+ pack $w.ok -side bottom
+}
+
+set aunextcolor 0
+proc assignauthorcolor {name} {
+ global authorcolors aucolormap aunextcolor
+ if [info exists aucolormap($name)] return
+
+ set randomcolors {black}
+ for {set i 0} {$i < [llength $authorcolors]} {incr i} {
+ set col [lindex $authorcolors $i]
+ if {[llength $col] > 1} {
+ set re [lindex $col 0]
+ set c [lindex $col 1]
+ if {[regexp -- $re $name]} {
+ set aucolormap($name) $c
+ return
+ }
+ } else {
+ set randomcolors [lrange $authorcolors $i end]
+ break
+ }
+ }
+
+ set ncolors [llength $randomcolors]
+ set c [lindex $randomcolors $aunextcolor]
+ if {[incr aunextcolor] >= $ncolors} {
+ incr aunextcolor -1
+ }
+ set aucolormap($name) $c
+}
+
+proc assigncolor {id} {
+ global commitinfo colormap commcolors colors nextcolor
+ global parents nparents children nchildren
+ global cornercrossings crossings
+
+ if [info exists colormap($id)] return
+ set ncolors [llength $colors]
+ if {$nparents($id) <= 1 && $nchildren($id) == 1} {
+ set child [lindex $children($id) 0]
+ if {[info exists colormap($child)]
+ && $nparents($child) == 1} {
+ set colormap($id) $colormap($child)
+ return
+ }
+ }
+ set badcolors {}
+ if {[info exists cornercrossings($id)]} {
+ foreach x $cornercrossings($id) {
+ if {[info exists colormap($x)]
+ && [lsearch -exact $badcolors $colormap($x)] < 0} {
+ lappend badcolors $colormap($x)
+ }
+ }
+ if {[llength $badcolors] >= $ncolors} {
+ set badcolors {}
+ }
+ }
+ set origbad $badcolors
+ if {[llength $badcolors] < $ncolors - 1} {
+ if {[info exists crossings($id)]} {
+ foreach x $crossings($id) {
+ if {[info exists colormap($x)]
+ && [lsearch -exact $badcolors $colormap($x)] < 0} {
+ lappend badcolors $colormap($x)
+ }
+ }
+ if {[llength $badcolors] >= $ncolors} {
+ set badcolors $origbad
+ }
+ }
+ set origbad $badcolors
+ }
+ if {[llength $badcolors] < $ncolors - 1} {
+ foreach child $children($id) {
+ if {[info exists colormap($child)]
+ && [lsearch -exact $badcolors $colormap($child)] < 0} {
+ lappend badcolors $colormap($child)
+ }
+ if {[info exists parents($child)]} {
+ foreach p $parents($child) {
+ if {[info exists colormap($p)]
+ && [lsearch -exact $badcolors $colormap($p)] < 0} {
+ lappend badcolors $colormap($p)
+ }
+ }
+ }
+ }
+ if {[llength $badcolors] >= $ncolors} {
+ set badcolors $origbad
+ }
+ }
+ for {set i 0} {$i <= $ncolors} {incr i} {
+ set c [lindex $colors $nextcolor]
+ if {[incr nextcolor] >= $ncolors} {
+ set nextcolor 0
+ }
+ if {[lsearch -exact $badcolors $c]} break
+ }
+ set colormap($id) $c
+}
+
+proc initgraph {} {
+ global canvy canvy0 lineno numcommits nextcolor linespc
+ global mainline mainlinearrow sidelines
+ global nchildren ncleft
+ global displist nhyperspace
+
+ allcanvs delete all
+ set nextcolor 0
+ set canvy $canvy0
+ set lineno -1
+ set numcommits 0
+ catch {unset mainline}
+ catch {unset mainlinearrow}
+ catch {unset sidelines}
+ foreach id [array names nchildren] {
+ set ncleft($id) $nchildren($id)
+ }
+ set displist {}
+ set nhyperspace 0
+}
+
+proc bindline {t id} {
+ global canv
+
+ $canv bind $t <Enter> "lineenter %x %y $id"
+ $canv bind $t <Motion> "linemotion %x %y $id"
+ $canv bind $t <Leave> "lineleave $id"
+ $canv bind $t <Button-1> "lineclick %x %y $id 1"
+}
+
+proc drawlines {id xtra} {
+ global mainline mainlinearrow sidelines lthickness colormap canv
+
+ $canv delete lines.$id
+ if {[info exists mainline($id)]} {
+ set t [$canv create line $mainline($id) \
+ -width [expr {($xtra + 1) * $lthickness}] \
+ -fill $colormap($id) -tags lines.$id \
+ -arrow $mainlinearrow($id)]
+ $canv lower $t
+ bindline $t $id
+ }
+ if {[info exists sidelines($id)]} {
+ foreach ls $sidelines($id) {
+ set coords [lindex $ls 0]
+ set thick [lindex $ls 1]
+ set arrow [lindex $ls 2]
+ set t [$canv create line $coords -fill $colormap($id) \
+ -width [expr {($thick + $xtra) * $lthickness}] \
+ -arrow $arrow -tags lines.$id]
+ $canv lower $t
+ bindline $t $id
+ }
+ }
+}
+
+# level here is an index in displist
+proc drawcommitline {level} {
+ global parents children nparents displist
+ global canv canv2 canv3 mainfont namefont canvy linespc
+ global lineid linehtag linentag linedtag commitinfo
+ global colormap numcommits currentparents dupparents
+ global idtags idline idheads idotherrefs idbookmarks
+ global lineno lthickness mainline mainlinearrow sidelines
+ global commitlisted rowtextx idpos lastuse displist
+ global oldnlines olddlevel olddisplist
+ global aucolormap curid curidfont
+
+ incr numcommits
+ incr lineno
+ set id [lindex $displist $level]
+ set lastuse($id) $lineno
+ set lineid($lineno) $id
+ set idline($id) $lineno
+ set ofill [expr {[info exists commitlisted($id)]? "blue": "white"}]
+ if {![info exists commitinfo($id)]} {
+ readcommit $id
+ if {![info exists commitinfo($id)]} {
+ set commitinfo($id) {"No commit information available"}
+ set nparents($id) 0
+ }
+ }
+ assigncolor $id
+ set currentparents {}
+ set dupparents {}
+ if {[info exists commitlisted($id)] && [info exists parents($id)]} {
+ foreach p $parents($id) {
+ if {[lsearch -exact $currentparents $p] < 0} {
+ lappend currentparents $p
+ } else {
+ # remember that this parent was listed twice
+ lappend dupparents $p
+ }
+ }
+ }
+ set x [xcoord $level $level $lineno]
+ set y1 $canvy
+ set canvy [expr $canvy + $linespc]
+ allcanvs conf -scrollregion \
+ [list 0 0 0 [expr $y1 + 0.5 * $linespc + 2]]
+ if {[info exists mainline($id)]} {
+ lappend mainline($id) $x $y1
+ if {$mainlinearrow($id) ne "none"} {
+ set mainline($id) [trimdiagstart $mainline($id)]
+ }
+ }
+ drawlines $id 0
+ set orad [expr {$linespc / 3}]
+ set t [$canv create oval [expr $x - $orad] [expr $y1 - $orad] \
+ [expr $x + $orad - 1] [expr $y1 + $orad - 1] \
+ -fill $ofill -outline black -width 1]
+ $canv raise $t
+ $canv bind $t <1> {selcanvline {} %x %y}
+ set xt [xcoord [llength $displist] $level $lineno]
+ if {[llength $currentparents] > 2} {
+ set xt [expr {$xt + ([llength $currentparents] - 2) * $linespc}]
+ }
+ set rowtextx($lineno) $xt
+ set idpos($id) [list $x $xt $y1]
+ if {[info exists idtags($id)] || [info exists idheads($id)]
+ || [info exists idotherrefs($id)] || [info exists idbookmarks($id)]} {
+ set xt [drawtags $id $x $xt $y1]
+ }
+ set headline [lindex $commitinfo($id) 0]
+ set name [lindex $commitinfo($id) 1]
+ assignauthorcolor $name
+ set fg $aucolormap($name)
+ if {$id == $curid} {
+ set fn $curidfont
+ } else {
+ set fn $mainfont
+ }
+
+ set date [lindex $commitinfo($id) 2]
+ set linehtag($lineno) [$canv create text $xt $y1 -anchor w \
+ -text $headline -font $fn \
+ -fill $fg]
+ $canv bind $linehtag($lineno) <<B3>> "rowmenu %X %Y $id"
+ set linentag($lineno) [$canv2 create text 3 $y1 -anchor w \
+ -text $name -font $namefont \
+ -fill $fg]
+ set linedtag($lineno) [$canv3 create text 3 $y1 -anchor w \
+ -text $date -font $mainfont \
+ -fill $fg]
+
+ set olddlevel $level
+ set olddisplist $displist
+ set oldnlines [llength $displist]
+}
+
+proc drawtags {id x xt y1} {
+ global bookmarkcurrent idtags idbookmarks idheads idotherrefs commitinfo
+ global linespc lthickness
+ global canv mainfont idline rowtextx
+
+ set marks {}
+ set nbookmarks 0
+ set ntags 0
+ set nheads 0
+ if {[info exists idtags($id)]} {
+ set marks $idtags($id)
+ set ntags [llength $marks]
+ }
+ if {[info exists idbookmarks($id)]} {
+ set marks [concat $marks $idbookmarks($id)]
+ set nbookmarks [llength $idbookmarks($id)]
+ }
+ if {[info exists idheads($id)]} {
+ set headmark [lindex $commitinfo($id) 7]
+ if {$headmark ne "default"} {
+ lappend marks $headmark
+ set nheads 1
+ }
+ }
+ if {$marks eq {}} {
+ return $xt
+ }
+
+ set delta [expr {int(0.5 * ($linespc - $lthickness))}]
+ set yt [expr $y1 - 0.5 * $linespc]
+ set yb [expr $yt + $linespc - 1]
+ set xvals {}
+ set wvals {}
+ foreach tag $marks {
+ set wid [font measure $mainfont $tag]
+ lappend xvals $xt
+ lappend wvals $wid
+ set xt [expr {$xt + $delta + $wid + $lthickness + $linespc}]
+ }
+ set t [$canv create line $x $y1 [lindex $xvals end] $y1 \
+ -width $lthickness -fill black -tags tag.$id]
+ $canv lower $t
+ foreach tag $marks x $xvals wid $wvals {
+ set xl [expr $x + $delta]
+ set xr [expr $x + $delta + $wid + $lthickness]
+ if {[incr ntags -1] >= 0} {
+ # draw a tag
+ set t [$canv create polygon $x [expr $yt + $delta] $xl $yt \
+ $xr $yt $xr $yb $xl $yb $x [expr $yb - $delta] \
+ -width 1 -outline black -fill yellow -tags tag.$id]
+ $canv bind $t <1> [list showtag $tag 1]
+ set rowtextx($idline($id)) [expr {$xr + $linespc}]
+ } elseif {[incr nbookmarks -1] >= 0} {
+ # draw a tag
+ set col gray50
+ if {[string compare $bookmarkcurrent $tag] == 0} {
+ set col gray
+ }
+ set xl [expr $xl - $delta/2]
+ $canv create polygon $x $yt $xr $yt $xr $yb $x $yb \
+ -width 1 -outline black -fill $col -tags tag.$id
+ } else {
+ # draw a head or other ref
+ if {[incr nheads -1] >= 0} {
+ set col green
+ } else {
+ set col "#ddddff"
+ }
+ set xl [expr $xl - $delta/2]
+ $canv create polygon $x $yt $xr $yt $xr $yb $x $yb \
+ -width 1 -outline black -fill $col -tags tag.$id
+ }
+ set t [$canv create text $xl $y1 -anchor w -text $tag \
+ -font $mainfont -tags tag.$id]
+ if {$ntags >= 0} {
+ $canv bind $t <1> [list showtag $tag 1]
+ }
+ }
+ return $xt
+}
+
+proc notecrossings {id lo hi corner} {
+ global olddisplist crossings cornercrossings
+
+ for {set i $lo} {[incr i] < $hi} {} {
+ set p [lindex $olddisplist $i]
+ if {$p == {}} continue
+ if {$i == $corner} {
+ if {![info exists cornercrossings($id)]
+ || [lsearch -exact $cornercrossings($id) $p] < 0} {
+ lappend cornercrossings($id) $p
+ }
+ if {![info exists cornercrossings($p)]
+ || [lsearch -exact $cornercrossings($p) $id] < 0} {
+ lappend cornercrossings($p) $id
+ }
+ } else {
+ if {![info exists crossings($id)]
+ || [lsearch -exact $crossings($id) $p] < 0} {
+ lappend crossings($id) $p
+ }
+ if {![info exists crossings($p)]
+ || [lsearch -exact $crossings($p) $id] < 0} {
+ lappend crossings($p) $id
+ }
+ }
+ }
+}
+
+proc xcoord {i level ln} {
+ global canvx0 xspc1 xspc2
+
+ set x [expr {$canvx0 + $i * $xspc1($ln)}]
+ if {$i > 0 && $i == $level} {
+ set x [expr {$x + 0.5 * ($xspc2 - $xspc1($ln))}]
+ } elseif {$i > $level} {
+ set x [expr {$x + $xspc2 - $xspc1($ln)}]
+ }
+ return $x
+}
+
+# it seems Tk can't draw arrows on the end of diagonal line segments...
+proc trimdiagend {line} {
+ while {[llength $line] > 4} {
+ set x1 [lindex $line end-3]
+ set y1 [lindex $line end-2]
+ set x2 [lindex $line end-1]
+ set y2 [lindex $line end]
+ if {($x1 == $x2) != ($y1 == $y2)} break
+ set line [lreplace $line end-1 end]
+ }
+ return $line
+}
+
+proc trimdiagstart {line} {
+ while {[llength $line] > 4} {
+ set x1 [lindex $line 0]
+ set y1 [lindex $line 1]
+ set x2 [lindex $line 2]
+ set y2 [lindex $line 3]
+ if {($x1 == $x2) != ($y1 == $y2)} break
+ set line [lreplace $line 0 1]
+ }
+ return $line
+}
+
+proc drawslants {id needonscreen nohs} {
+ global canv mainline mainlinearrow sidelines
+ global canvx0 canvy xspc1 xspc2 lthickness
+ global currentparents dupparents
+ global lthickness linespc canvy colormap lineno geometry
+ global maxgraphpct maxwidth
+ global displist onscreen lastuse
+ global parents commitlisted
+ global oldnlines olddlevel olddisplist
+ global nhyperspace numcommits nnewparents
+
+ if {$lineno < 0} {
+ lappend displist $id
+ set onscreen($id) 1
+ return 0
+ }
+
+ set y1 [expr {$canvy - $linespc}]
+ set y2 $canvy
+
+ # work out what we need to get back on screen
+ set reins {}
+ if {$onscreen($id) < 0} {
+ # next to do isn't displayed, better get it on screen...
+ lappend reins [list $id 0]
+ }
+ # make sure all the previous commits's parents are on the screen
+ foreach p $currentparents {
+ if {$onscreen($p) < 0} {
+ lappend reins [list $p 0]
+ }
+ }
+ # bring back anything requested by caller
+ if {$needonscreen ne {}} {
+ lappend reins $needonscreen
+ }
+
+ # try the shortcut
+ if {$currentparents == $id && $onscreen($id) == 0 && $reins eq {}} {
+ set dlevel $olddlevel
+ set x [xcoord $dlevel $dlevel $lineno]
+ set mainline($id) [list $x $y1]
+ set mainlinearrow($id) none
+ set lastuse($id) $lineno
+ set displist [lreplace $displist $dlevel $dlevel $id]
+ set onscreen($id) 1
+ set xspc1([expr {$lineno + 1}]) $xspc1($lineno)
+ return $dlevel
+ }
+
+ # update displist
+ set displist [lreplace $displist $olddlevel $olddlevel]
+ set j $olddlevel
+ foreach p $currentparents {
+ set lastuse($p) $lineno
+ if {$onscreen($p) == 0} {
+ set displist [linsert $displist $j $p]
+ set onscreen($p) 1
+ incr j
+ }
+ }
+ if {$onscreen($id) == 0} {
+ lappend displist $id
+ set onscreen($id) 1
+ }
+
+ # remove the null entry if present
+ set nullentry [lsearch -exact $displist {}]
+ if {$nullentry >= 0} {
+ set displist [lreplace $displist $nullentry $nullentry]
+ }
+
+ # bring back the ones we need now (if we did it earlier
+ # it would change displist and invalidate olddlevel)
+ foreach pi $reins {
+ # test again in case of duplicates in reins
+ set p [lindex $pi 0]
+ if {$onscreen($p) < 0} {
+ set onscreen($p) 1
+ set lastuse($p) $lineno
+ set displist [linsert $displist [lindex $pi 1] $p]
+ incr nhyperspace -1
+ }
+ }
+
+ set lastuse($id) $lineno
+
+ # see if we need to make any lines jump off into hyperspace
+ set displ [llength $displist]
+ if {$displ > $maxwidth} {
+ set ages {}
+ foreach x $displist {
+ lappend ages [list $lastuse($x) $x]
+ }
+ set ages [lsort -integer -index 0 $ages]
+ set k 0
+ while {$displ > $maxwidth} {
+ set use [lindex $ages $k 0]
+ set victim [lindex $ages $k 1]
+ if {$use >= $lineno - 5} break
+ incr k
+ if {[lsearch -exact $nohs $victim] >= 0} continue
+ set i [lsearch -exact $displist $victim]
+ set displist [lreplace $displist $i $i]
+ set onscreen($victim) -1
+ incr nhyperspace
+ incr displ -1
+ if {$i < $nullentry} {
+ incr nullentry -1
+ }
+ set x [lindex $mainline($victim) end-1]
+ lappend mainline($victim) $x $y1
+ set line [trimdiagend $mainline($victim)]
+ set arrow "last"
+ if {$mainlinearrow($victim) ne "none"} {
+ set line [trimdiagstart $line]
+ set arrow "both"
+ }
+ lappend sidelines($victim) [list $line 1 $arrow]
+ unset mainline($victim)
+ }
+ }
+
+ set dlevel [lsearch -exact $displist $id]
+
+ # If we are reducing, put in a null entry
+ if {$displ < $oldnlines} {
+ # does the next line look like a merge?
+ # i.e. does it have > 1 new parent?
+ if {$nnewparents($id) > 1} {
+ set i [expr {$dlevel + 1}]
+ } elseif {$nnewparents([lindex $olddisplist $olddlevel]) == 0} {
+ set i $olddlevel
+ if {$nullentry >= 0 && $nullentry < $i} {
+ incr i -1
+ }
+ } elseif {$nullentry >= 0} {
+ set i $nullentry
+ while {$i < $displ
+ && [lindex $olddisplist $i] == [lindex $displist $i]} {
+ incr i
+ }
+ } else {
+ set i $olddlevel
+ if {$dlevel >= $i} {
+ incr i
+ }
+ }
+ if {$i < $displ} {
+ set displist [linsert $displist $i {}]
+ incr displ
+ if {$dlevel >= $i} {
+ incr dlevel
+ }
+ }
+ }
+
+ # decide on the line spacing for the next line
+ set lj [expr {$lineno + 1}]
+ set maxw [expr {$maxgraphpct * $geometry(canv1) / 100}]
+ if {$displ <= 1 || $canvx0 + $displ * $xspc2 <= $maxw} {
+ set xspc1($lj) $xspc2
+ } else {
+ set xspc1($lj) [expr {($maxw - $canvx0 - $xspc2) / ($displ - 1)}]
+ if {$xspc1($lj) < $lthickness} {
+ set xspc1($lj) $lthickness
+ }
+ }
+
+ foreach idi $reins {
+ set id [lindex $idi 0]
+ set j [lsearch -exact $displist $id]
+ set xj [xcoord $j $dlevel $lj]
+ set mainline($id) [list $xj $y2]
+ set mainlinearrow($id) first
+ }
+
+ set i -1
+ foreach id $olddisplist {
+ incr i
+ if {$id == {}} continue
+ if {$onscreen($id) <= 0} continue
+ set xi [xcoord $i $olddlevel $lineno]
+ if {$i == $olddlevel} {
+ foreach p $currentparents {
+ set j [lsearch -exact $displist $p]
+ set coords [list $xi $y1]
+ set xj [xcoord $j $dlevel $lj]
+ if {$xj < $xi - $linespc} {
+ lappend coords [expr {$xj + $linespc}] $y1
+ notecrossings $p $j $i [expr {$j + 1}]
+ } elseif {$xj > $xi + $linespc} {
+ lappend coords [expr {$xj - $linespc}] $y1
+ notecrossings $p $i $j [expr {$j - 1}]
+ }
+ if {[lsearch -exact $dupparents $p] >= 0} {
+ # draw a double-width line to indicate the doubled parent
+ lappend coords $xj $y2
+ lappend sidelines($p) [list $coords 2 none]
+ if {![info exists mainline($p)]} {
+ set mainline($p) [list $xj $y2]
+ set mainlinearrow($p) none
+ }
+ } else {
+ # normal case, no parent duplicated
+ set yb $y2
+ set dx [expr {abs($xi - $xj)}]
+ if {0 && $dx < $linespc} {
+ set yb [expr {$y1 + $dx}]
+ }
+ if {![info exists mainline($p)]} {
+ if {$xi != $xj} {
+ lappend coords $xj $yb
+ }
+ set mainline($p) $coords
+ set mainlinearrow($p) none
+ } else {
+ lappend coords $xj $yb
+ if {$yb < $y2} {
+ lappend coords $xj $y2
+ }
+ lappend sidelines($p) [list $coords 1 none]
+ }
+ }
+ }
+ } else {
+ set j $i
+ if {[lindex $displist $i] != $id} {
+ set j [lsearch -exact $displist $id]
+ }
+ if {$j != $i || $xspc1($lineno) != $xspc1($lj)
+ || ($olddlevel < $i && $i < $dlevel)
+ || ($dlevel < $i && $i < $olddlevel)} {
+ set xj [xcoord $j $dlevel $lj]
+ lappend mainline($id) $xi $y1 $xj $y2
+ }
+ }
+ }
+ return $dlevel
+}
+
+# search for x in a list of lists
+proc llsearch {llist x} {
+ set i 0
+ foreach l $llist {
+ if {$l == $x || [lsearch -exact $l $x] >= 0} {
+ return $i
+ }
+ incr i
+ }
+ return -1
+}
+
+proc drawmore {reading} {
+ global displayorder numcommits ncmupdate nextupdate
+ global stopped nhyperspace parents commitlisted
+ global maxwidth onscreen displist currentparents olddlevel
+
+ set n [llength $displayorder]
+ while {$numcommits < $n} {
+ set id [lindex $displayorder $numcommits]
+ set ctxend [expr {$numcommits + 10}]
+ if {!$reading && $ctxend > $n} {
+ set ctxend $n
+ }
+ set dlist {}
+ if {$numcommits > 0} {
+ set dlist [lreplace $displist $olddlevel $olddlevel]
+ set i $olddlevel
+ foreach p $currentparents {
+ if {$onscreen($p) == 0} {
+ set dlist [linsert $dlist $i $p]
+ incr i
+ }
+ }
+ }
+ set nohs {}
+ set reins {}
+ set isfat [expr {[llength $dlist] > $maxwidth}]
+ if {$nhyperspace > 0 || $isfat} {
+ if {$ctxend > $n} break
+ # work out what to bring back and
+ # what we want to don't want to send into hyperspace
+ set room 1
+ for {set k $numcommits} {$k < $ctxend} {incr k} {
+ set x [lindex $displayorder $k]
+ set i [llsearch $dlist $x]
+ if {$i < 0} {
+ set i [llength $dlist]
+ lappend dlist $x
+ }
+ if {[lsearch -exact $nohs $x] < 0} {
+ lappend nohs $x
+ }
+ if {$reins eq {} && $onscreen($x) < 0 && $room} {
+ set reins [list $x $i]
+ }
+ set newp {}
+ if {[info exists commitlisted($x)]} {
+ set right 0
+ foreach p $parents($x) {
+ if {[llsearch $dlist $p] < 0} {
+ lappend newp $p
+ if {[lsearch -exact $nohs $p] < 0} {
+ lappend nohs $p
+ }
+ if {$reins eq {} && $onscreen($p) < 0 && $room} {
+ set reins [list $p [expr {$i + $right}]]
+ }
+ }
+ set right 1
+ }
+ }
+ set l [lindex $dlist $i]
+ if {[llength $l] == 1} {
+ set l $newp
+ } else {
+ set j [lsearch -exact $l $x]
+ set l [concat [lreplace $l $j $j] $newp]
+ }
+ set dlist [lreplace $dlist $i $i $l]
+ if {$room && $isfat && [llength $newp] <= 1} {
+ set room 0
+ }
+ }
+ }
+
+ set dlevel [drawslants $id $reins $nohs]
+ drawcommitline $dlevel
+ if {[clock clicks -milliseconds] >= $nextupdate
+ && $numcommits >= $ncmupdate} {
+ doupdate $reading
+ if {$stopped} break
+ }
+ }
+}
+
+# level here is an index in todo
+proc updatetodo {level noshortcut} {
+ global ncleft todo nnewparents
+ global commitlisted parents onscreen
+
+ set id [lindex $todo $level]
+ set olds {}
+ if {[info exists commitlisted($id)]} {
+ foreach p $parents($id) {
+ if {[lsearch -exact $olds $p] < 0} {
+ lappend olds $p
+ }
+ }
+ }
+ if {!$noshortcut && [llength $olds] == 1} {
+ set p [lindex $olds 0]
+ if {$ncleft($p) == 1 && [lsearch -exact $todo $p] < 0} {
+ set ncleft($p) 0
+ set todo [lreplace $todo $level $level $p]
+ set onscreen($p) 0
+ set nnewparents($id) 1
+ return 0
+ }
+ }
+
+ set todo [lreplace $todo $level $level]
+ set i $level
+ set n 0
+ foreach p $olds {
+ incr ncleft($p) -1
+ set k [lsearch -exact $todo $p]
+ if {$k < 0} {
+ set todo [linsert $todo $i $p]
+ set onscreen($p) 0
+ incr i
+ incr n
+ }
+ }
+ set nnewparents($id) $n
+
+ return 1
+}
+
+proc decidenext {{noread 0}} {
+ global ncleft todo
+ global datemode cdate
+ global commitinfo
+
+ # choose which one to do next time around
+ set todol [llength $todo]
+ set level -1
+ set latest {}
+ for {set k $todol} {[incr k -1] >= 0} {} {
+ set p [lindex $todo $k]
+ if {$ncleft($p) == 0} {
+ if {$datemode} {
+ if {![info exists commitinfo($p)]} {
+ if {$noread} {
+ return {}
+ }
+ readcommit $p
+ }
+ if {$latest == {} || $cdate($p) > $latest} {
+ set level $k
+ set latest $cdate($p)
+ }
+ } else {
+ set level $k
+ break
+ }
+ }
+ }
+ if {$level < 0} {
+ if {$todo != {}} {
+ puts "ERROR: none of the pending commits can be done yet:"
+ foreach p $todo {
+ puts " $p ($ncleft($p))"
+ }
+ }
+ return -1
+ }
+
+ return $level
+}
+
+proc drawcommit {id} {
+ global phase todo nchildren datemode nextupdate
+ global numcommits ncmupdate displayorder todo onscreen
+
+ if {$phase != "incrdraw"} {
+ set phase incrdraw
+ set displayorder {}
+ set todo {}
+ initgraph
+ }
+ if {$nchildren($id) == 0} {
+ lappend todo $id
+ set onscreen($id) 0
+ }
+ set level [decidenext 1]
+ if {$level == {} || $id != [lindex $todo $level]} {
+ return
+ }
+ while 1 {
+ lappend displayorder [lindex $todo $level]
+ if {[updatetodo $level $datemode]} {
+ set level [decidenext 1]
+ if {$level == {}} break
+ }
+ set id [lindex $todo $level]
+ if {![info exists commitlisted($id)]} {
+ break
+ }
+ }
+ drawmore 1
+}
+
+proc finishcommits {} {
+ global phase
+ global canv mainfont ctext maincursor textcursor
+
+ if {$phase != "incrdraw"} {
+ $canv delete all
+ $canv create text 3 3 -anchor nw -text "No commits selected" \
+ -font $mainfont -tags textitems
+ set phase {}
+ } else {
+ drawrest
+ }
+ . config -cursor $maincursor
+ settextcursor $textcursor
+}
+
+# Don't change the text pane cursor if it is currently the hand cursor,
+# showing that we are over a sha1 ID link.
+proc settextcursor {c} {
+ global ctext curtextcursor
+
+ if {[$ctext cget -cursor] == $curtextcursor} {
+ $ctext config -cursor $c
+ }
+ set curtextcursor $c
+}
+
+proc drawgraph {} {
+ global nextupdate startmsecs ncmupdate
+ global displayorder onscreen
+
+ if {$displayorder == {}} return
+ set startmsecs [clock clicks -milliseconds]
+ set nextupdate [expr $startmsecs + 100]
+ set ncmupdate 1
+ initgraph
+ foreach id $displayorder {
+ set onscreen($id) 0
+ }
+ drawmore 0
+}
+
+proc drawrest {} {
+ global phase stopped redisplaying selectedline
+ global datemode todo displayorder
+ global numcommits ncmupdate
+ global nextupdate startmsecs
+
+ set level [decidenext]
+ if {$level >= 0} {
+ set phase drawgraph
+ while 1 {
+ lappend displayorder [lindex $todo $level]
+ set hard [updatetodo $level $datemode]
+ if {$hard} {
+ set level [decidenext]
+ if {$level < 0} break
+ }
+ }
+ drawmore 0
+ }
+ set phase {}
+ set drawmsecs [expr [clock clicks -milliseconds] - $startmsecs]
+ #puts "overall $drawmsecs ms for $numcommits commits"
+ if {$redisplaying} {
+ if {$stopped == 0 && [info exists selectedline]} {
+ selectline $selectedline 0
+ }
+ if {$stopped == 1} {
+ set stopped 0
+ after idle drawgraph
+ } else {
+ set redisplaying 0
+ }
+ }
+}
+
+proc findmatches {f} {
+ global findtype foundstring foundstrlen
+ if {$findtype == "Regexp"} {
+ set matches [regexp -indices -all -inline $foundstring $f]
+ } else {
+ if {$findtype == "IgnCase"} {
+ set str [string tolower $f]
+ } else {
+ set str $f
+ }
+ set matches {}
+ set i 0
+ while {[set j [string first $foundstring $str $i]] >= 0} {
+ lappend matches [list $j [expr $j+$foundstrlen-1]]
+ set i [expr $j + $foundstrlen]
+ }
+ }
+ return $matches
+}
+
+proc dofind {} {
+ global findtype findloc findstring markedmatches commitinfo
+ global numcommits lineid linehtag linentag linedtag
+ global mainfont namefont canv canv2 canv3 selectedline
+ global matchinglines foundstring foundstrlen
+
+ stopfindproc
+ unmarkmatches
+ focus .
+ set matchinglines {}
+ if {$findloc == "Pickaxe"} {
+ findpatches
+ return
+ }
+ if {$findtype == "IgnCase"} {
+ set foundstring [string tolower $findstring]
+ } else {
+ set foundstring $findstring
+ }
+ set foundstrlen [string length $findstring]
+ if {$foundstrlen == 0} return
+ if {$findloc == "Files"} {
+ findfiles
+ return
+ }
+ if {![info exists selectedline]} {
+ set oldsel -1
+ } else {
+ set oldsel $selectedline
+ }
+ set didsel 0
+ set fldtypes {Headline Author Date Committer CDate Comment}
+ for {set l 0} {$l < $numcommits} {incr l} {
+ set id $lineid($l)
+ set info $commitinfo($id)
+ set doesmatch 0
+ foreach f $info ty $fldtypes {
+ if {$findloc != "All fields" && $findloc != $ty} {
+ continue
+ }
+ set matches [findmatches $f]
+ if {$matches == {}} continue
+ set doesmatch 1
+ if {$ty == "Headline"} {
+ markmatches $canv $l $f $linehtag($l) $matches $mainfont
+ } elseif {$ty == "Author"} {
+ markmatches $canv2 $l $f $linentag($l) $matches $namefont
+ } elseif {$ty == "Date"} {
+ markmatches $canv3 $l $f $linedtag($l) $matches $mainfont
+ }
+ }
+ if {$doesmatch} {
+ lappend matchinglines $l
+ if {!$didsel && $l > $oldsel} {
+ findselectline $l
+ set didsel 1
+ }
+ }
+ }
+ if {$matchinglines == {}} {
+ bell
+ } elseif {!$didsel} {
+ findselectline [lindex $matchinglines 0]
+ }
+}
+
+proc findselectline {l} {
+ global findloc commentend ctext
+ selectline $l 1
+ if {$findloc == "All fields" || $findloc == "Comments"} {
+ # highlight the matches in the comments
+ set f [$ctext get 1.0 $commentend]
+ set matches [findmatches $f]
+ foreach match $matches {
+ set start [lindex $match 0]
+ set end [expr [lindex $match 1] + 1]
+ $ctext tag add found "1.0 + $start c" "1.0 + $end c"
+ }
+ }
+}
+
+proc findnext {restart} {
+ global matchinglines selectedline
+ if {![info exists matchinglines]} {
+ if {$restart} {
+ dofind
+ }
+ return
+ }
+ if {![info exists selectedline]} return
+ foreach l $matchinglines {
+ if {$l > $selectedline} {
+ findselectline $l
+ return
+ }
+ }
+ bell
+}
+
+proc findprev {} {
+ global matchinglines selectedline
+ if {![info exists matchinglines]} {
+ dofind
+ return
+ }
+ if {![info exists selectedline]} return
+ set prev {}
+ foreach l $matchinglines {
+ if {$l >= $selectedline} break
+ set prev $l
+ }
+ if {$prev != {}} {
+ findselectline $prev
+ } else {
+ bell
+ }
+}
+
+proc findlocchange {name ix op} {
+ global findloc findtype findtypemenu
+ if {$findloc == "Pickaxe"} {
+ set findtype Exact
+ set state disabled
+ } else {
+ set state normal
+ }
+ $findtypemenu entryconf 1 -state $state
+ $findtypemenu entryconf 2 -state $state
+}
+
+proc stopfindproc {{done 0}} {
+ global findprocpid findprocfile findids
+ global ctext findoldcursor phase maincursor textcursor
+ global findinprogress
+
+ catch {unset findids}
+ if {[info exists findprocpid]} {
+ if {!$done} {
+ catch {exec kill $findprocpid}
+ }
+ catch {close $findprocfile}
+ unset findprocpid
+ }
+ if {[info exists findinprogress]} {
+ unset findinprogress
+ if {$phase != "incrdraw"} {
+ . config -cursor $maincursor
+ settextcursor $textcursor
+ }
+ }
+}
+
+proc findpatches {} {
+ global findstring selectedline numcommits
+ global findprocpid findprocfile
+ global finddidsel ctext lineid findinprogress
+ global findinsertpos
+ global env
+
+ if {$numcommits == 0} return
+
+ # make a list of all the ids to search, starting at the one
+ # after the selected line (if any)
+ if {[info exists selectedline]} {
+ set l $selectedline
+ } else {
+ set l -1
+ }
+ set inputids {}
+ for {set i 0} {$i < $numcommits} {incr i} {
+ if {[incr l] >= $numcommits} {
+ set l 0
+ }
+ append inputids $lineid($l) "\n"
+ }
+
+ if {[catch {
+ set f [open [list | $env(HG) --config ui.report_untrusted=false debug-diff-tree --stdin -s -r -S$findstring << $inputids] r]
+ } err]} {
+ error_popup "Error starting search process: $err"
+ return
+ }
+
+ set findinsertpos end
+ set findprocfile $f
+ set findprocpid [pid $f]
+ fconfigure $f -blocking 0
+ fileevent $f readable readfindproc
+ set finddidsel 0
+ . config -cursor watch
+ settextcursor watch
+ set findinprogress 1
+}
+
+proc readfindproc {} {
+ global findprocfile finddidsel
+ global idline matchinglines findinsertpos
+
+ set n [gets $findprocfile line]
+ if {$n < 0} {
+ if {[eof $findprocfile]} {
+ stopfindproc 1
+ if {!$finddidsel} {
+ bell
+ }
+ }
+ return
+ }
+ if {![regexp {^[0-9a-f]{12}} $line id]} {
+ error_popup "Can't parse git-diff-tree output: $line"
+ stopfindproc
+ return
+ }
+ if {![info exists idline($id)]} {
+ puts stderr "spurious id: $id"
+ return
+ }
+ set l $idline($id)
+ insertmatch $l $id
+}
+
+proc insertmatch {l id} {
+ global matchinglines findinsertpos finddidsel
+
+ if {$findinsertpos == "end"} {
+ if {$matchinglines != {} && $l < [lindex $matchinglines 0]} {
+ set matchinglines [linsert $matchinglines 0 $l]
+ set findinsertpos 1
+ } else {
+ lappend matchinglines $l
+ }
+ } else {
+ set matchinglines [linsert $matchinglines $findinsertpos $l]
+ incr findinsertpos
+ }
+ markheadline $l $id
+ if {!$finddidsel} {
+ findselectline $l
+ set finddidsel 1
+ }
+}
+
+proc findfiles {} {
+ global selectedline numcommits lineid ctext
+ global ffileline finddidsel parents nparents
+ global findinprogress findstartline findinsertpos
+ global treediffs fdiffids fdiffsneeded fdiffpos
+ global findmergefiles
+ global env
+
+ if {$numcommits == 0} return
+
+ if {[info exists selectedline]} {
+ set l [expr {$selectedline + 1}]
+ } else {
+ set l 0
+ }
+ set ffileline $l
+ set findstartline $l
+ set diffsneeded {}
+ set fdiffsneeded {}
+ while 1 {
+ set id $lineid($l)
+ if {$findmergefiles || $nparents($id) == 1} {
+ foreach p $parents($id) {
+ if {![info exists treediffs([list $id $p])]} {
+ append diffsneeded "$id $p\n"
+ lappend fdiffsneeded [list $id $p]
+ }
+ }
+ }
+ if {[incr l] >= $numcommits} {
+ set l 0
+ }
+ if {$l == $findstartline} break
+ }
+
+ # start off a git-diff-tree process if needed
+ if {$diffsneeded ne {}} {
+ if {[catch {
+ set df [open [list | $env(HG) --config ui.report_untrusted=false debug-diff-tree -r --stdin << $diffsneeded] r]
+ } err ]} {
+ error_popup "Error starting search process: $err"
+ return
+ }
+ catch {unset fdiffids}
+ set fdiffpos 0
+ fconfigure $df -blocking 0
+ fileevent $df readable [list readfilediffs $df]
+ }
+
+ set finddidsel 0
+ set findinsertpos end
+ set id $lineid($l)
+ set p [lindex $parents($id) 0]
+ . config -cursor watch
+ settextcursor watch
+ set findinprogress 1
+ findcont [list $id $p]
+ update
+}
+
+proc readfilediffs {df} {
+ global findids fdiffids fdiffs
+
+ set n [gets $df line]
+ if {$n < 0} {
+ if {[eof $df]} {
+ donefilediff
+ if {[catch {close $df} err]} {
+ stopfindproc
+ bell
+ error_popup "Error in hg debug-diff-tree: $err"
+ } elseif {[info exists findids]} {
+ set ids $findids
+ stopfindproc
+ bell
+ error_popup "Couldn't find diffs for {$ids}"
+ }
+ }
+ return
+ }
+ if {[regexp {^([0-9a-f]{12}) \(from ([0-9a-f]{12})\)} $line match id p]} {
+ # start of a new string of diffs
+ donefilediff
+ set fdiffids [list $id $p]
+ set fdiffs {}
+ } elseif {[string match ":*" $line]} {
+ lappend fdiffs [lindex $line 5]
+ }
+}
+
+proc donefilediff {} {
+ global fdiffids fdiffs treediffs findids
+ global fdiffsneeded fdiffpos
+
+ if {[info exists fdiffids]} {
+ while {[lindex $fdiffsneeded $fdiffpos] ne $fdiffids
+ && $fdiffpos < [llength $fdiffsneeded]} {
+ # git-diff-tree doesn't output anything for a commit
+ # which doesn't change anything
+ set nullids [lindex $fdiffsneeded $fdiffpos]
+ set treediffs($nullids) {}
+ if {[info exists findids] && $nullids eq $findids} {
+ unset findids
+ findcont $nullids
+ }
+ incr fdiffpos
+ }
+ incr fdiffpos
+
+ if {![info exists treediffs($fdiffids)]} {
+ set treediffs($fdiffids) $fdiffs
+ }
+ if {[info exists findids] && $fdiffids eq $findids} {
+ unset findids
+ findcont $fdiffids
+ }
+ }
+}
+
+proc findcont {ids} {
+ global findids treediffs parents nparents
+ global ffileline findstartline finddidsel
+ global lineid numcommits matchinglines findinprogress
+ global findmergefiles
+
+ set id [lindex $ids 0]
+ set p [lindex $ids 1]
+ set pi [lsearch -exact $parents($id) $p]
+ set l $ffileline
+ while 1 {
+ if {$findmergefiles || $nparents($id) == 1} {
+ if {![info exists treediffs($ids)]} {
+ set findids $ids
+ set ffileline $l
+ return
+ }
+ set doesmatch 0
+ foreach f $treediffs($ids) {
+ set x [findmatches $f]
+ if {$x != {}} {
+ set doesmatch 1
+ break
+ }
+ }
+ if {$doesmatch} {
+ insertmatch $l $id
+ set pi $nparents($id)
+ }
+ } else {
+ set pi $nparents($id)
+ }
+ if {[incr pi] >= $nparents($id)} {
+ set pi 0
+ if {[incr l] >= $numcommits} {
+ set l 0
+ }
+ if {$l == $findstartline} break
+ set id $lineid($l)
+ }
+ set p [lindex $parents($id) $pi]
+ set ids [list $id $p]
+ }
+ stopfindproc
+ if {!$finddidsel} {
+ bell
+ }
+}
+
+# mark a commit as matching by putting a yellow background
+# behind the headline
+proc markheadline {l id} {
+ global canv mainfont linehtag commitinfo
+
+ set bbox [$canv bbox $linehtag($l)]
+ set t [$canv create rect $bbox -outline {} -tags matches -fill yellow]
+ $canv lower $t
+}
+
+# mark the bits of a headline, author or date that match a find string
+proc markmatches {canv l str tag matches font} {
+ set bbox [$canv bbox $tag]
+ set x0 [lindex $bbox 0]
+ set y0 [lindex $bbox 1]
+ set y1 [lindex $bbox 3]
+ foreach match $matches {
+ set start [lindex $match 0]
+ set end [lindex $match 1]
+ if {$start > $end} continue
+ set xoff [font measure $font [string range $str 0 [expr $start-1]]]
+ set xlen [font measure $font [string range $str 0 [expr $end]]]
+ set t [$canv create rect [expr $x0+$xoff] $y0 [expr $x0+$xlen+2] $y1 \
+ -outline {} -tags matches -fill yellow]
+ $canv lower $t
+ }
+}
+
+proc unmarkmatches {} {
+ global matchinglines findids
+ allcanvs delete matches
+ catch {unset matchinglines}
+ catch {unset findids}
+}
+
+proc selcanvline {w x y} {
+ global canv canvy0 ctext linespc
+ global lineid linehtag linentag linedtag rowtextx
+ set ymax [lindex [$canv cget -scrollregion] 3]
+ if {$ymax == {}} return
+ set yfrac [lindex [$canv yview] 0]
+ set y [expr {$y + $yfrac * $ymax}]
+ set l [expr {int(($y - $canvy0) / $linespc + 0.5)}]
+ if {$l < 0} {
+ set l 0
+ }
+ if {$w eq $canv} {
+ if {![info exists rowtextx($l)] || $x < $rowtextx($l)} return
+ }
+ unmarkmatches
+ selectline $l 1
+}
+
+proc commit_descriptor {p} {
+ global commitinfo
+ set l "..."
+ if {[info exists commitinfo($p)]} {
+ set l [lindex $commitinfo($p) 0]
+ set r [lindex $commitinfo($p) 6]
+ }
+ return "$r:$p ($l)"
+}
+
+# append some text to the ctext widget, and make any SHA1 ID
+# that we know about be a clickable link.
+proc appendwithlinks {text} {
+ global ctext idline linknum
+
+ set start [$ctext index "end - 1c"]
+ $ctext insert end $text
+ $ctext insert end "\n"
+ set links [regexp -indices -all -inline {[0-9a-f]{12}} $text]
+ foreach l $links {
+ set s [lindex $l 0]
+ set e [lindex $l 1]
+ set linkid [string range $text $s $e]
+ if {![info exists idline($linkid)]} continue
+ incr e
+ $ctext tag add link "$start + $s c" "$start + $e c"
+ $ctext tag add link$linknum "$start + $s c" "$start + $e c"
+ $ctext tag bind link$linknum <1> [list selectline $idline($linkid) 1]
+ incr linknum
+ }
+ $ctext tag conf link -foreground blue -underline 1
+ $ctext tag bind link <Enter> { %W configure -cursor hand2 }
+ $ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
+}
+
+proc selectline {l isnew} {
+ global canv canv2 canv3 ctext commitinfo selectedline
+ global lineid linehtag linentag linedtag
+ global canvy0 linespc parents nparents children
+ global cflist currentid sha1entry
+ global commentend idtags idbookmarks idline linknum
+
+ $canv delete hover
+ normalline
+ if {![info exists lineid($l)] || ![info exists linehtag($l)]} return
+ $canv delete secsel
+ set t [eval $canv create rect [$canv bbox $linehtag($l)] -outline {{}} \
+ -tags secsel -fill [$canv cget -selectbackground]]
+ $canv lower $t
+ $canv2 delete secsel
+ set t [eval $canv2 create rect [$canv2 bbox $linentag($l)] -outline {{}} \
+ -tags secsel -fill [$canv2 cget -selectbackground]]
+ $canv2 lower $t
+ $canv3 delete secsel
+ set t [eval $canv3 create rect [$canv3 bbox $linedtag($l)] -outline {{}} \
+ -tags secsel -fill [$canv3 cget -selectbackground]]
+ $canv3 lower $t
+ set y [expr {$canvy0 + $l * $linespc}]
+ set ymax [lindex [$canv cget -scrollregion] 3]
+ set ytop [expr {$y - $linespc - 1}]
+ set ybot [expr {$y + $linespc + 1}]
+ set wnow [$canv yview]
+ set wtop [expr [lindex $wnow 0] * $ymax]
+ set wbot [expr [lindex $wnow 1] * $ymax]
+ set wh [expr {$wbot - $wtop}]
+ set newtop $wtop
+ if {$ytop < $wtop} {
+ if {$ybot < $wtop} {
+ set newtop [expr {$y - $wh / 2.0}]
+ } else {
+ set newtop $ytop
+ if {$newtop > $wtop - $linespc} {
+ set newtop [expr {$wtop - $linespc}]
+ }
+ }
+ } elseif {$ybot > $wbot} {
+ if {$ytop > $wbot} {
+ set newtop [expr {$y - $wh / 2.0}]
+ } else {
+ set newtop [expr {$ybot - $wh}]
+ if {$newtop < $wtop + $linespc} {
+ set newtop [expr {$wtop + $linespc}]
+ }
+ }
+ }
+ if {$newtop != $wtop} {
+ if {$newtop < 0} {
+ set newtop 0
+ }
+ allcanvs yview moveto [expr $newtop * 1.0 / $ymax]
+ }
+
+ if {$isnew} {
+ addtohistory [list selectline $l 0]
+ }
+
+ set selectedline $l
+
+ set id $lineid($l)
+ set currentid $id
+ $sha1entry delete 0 end
+ $sha1entry insert 0 $id
+ $sha1entry selection from 0
+ $sha1entry selection to end
+
+ $ctext conf -state normal
+ $ctext delete 0.0 end
+ set linknum 0
+ $ctext mark set fmark.0 0.0
+ $ctext mark gravity fmark.0 left
+ set info $commitinfo($id)
+ $ctext insert end "Revision: [lindex $info 6]\n"
+ if {[llength [lindex $info 7]] > 0} {
+ $ctext insert end "Branch: [lindex $info 7]\n"
+ }
+ $ctext insert end "Author: [lindex $info 1] [lindex $info 2]\n"
+ $ctext insert end "Committer: [lindex $info 3] [lindex $info 4]\n"
+ if {[info exists idbookmarks($id)]} {
+ $ctext insert end "Bookmarks:"
+ foreach bookmark $idbookmarks($id) {
+ $ctext insert end " $bookmark"
+ }
+ $ctext insert end "\n"
+ }
+
+ if {[info exists idtags($id)]} {
+ $ctext insert end "Tags:"
+ foreach tag $idtags($id) {
+ $ctext insert end " $tag"
+ }
+ $ctext insert end "\n"
+ }
+
+ set comment {}
+ if {[info exists parents($id)]} {
+ foreach p $parents($id) {
+ append comment "Parent: [commit_descriptor $p]\n"
+ }
+ }
+ if {[info exists children($id)]} {
+ foreach c $children($id) {
+ append comment "Child: [commit_descriptor $c]\n"
+ }
+ }
+ append comment "\n"
+ append comment [lindex $info 5]
+
+ # make anything that looks like a SHA1 ID be a clickable link
+ appendwithlinks $comment
+
+ $ctext tag delete Comments
+ $ctext tag remove found 1.0 end
+ $ctext conf -state disabled
+ set commentend [$ctext index "end - 1c"]
+
+ $cflist delete 0 end
+ $cflist insert end "Comments"
+ if {$nparents($id) <= 1} {
+ set parent "null"
+ if {$nparents($id) == 1} {
+ set parent $parents($id)
+ }
+ startdiff [concat $id $parent]
+ } elseif {$nparents($id) > 1} {
+ mergediff $id
+ }
+}
+
+proc selnextline {dir} {
+ global selectedline
+ if {![info exists selectedline]} return
+ set l [expr $selectedline + $dir]
+ unmarkmatches
+ selectline $l 1
+}
+
+proc unselectline {} {
+ global selectedline
+
+ catch {unset selectedline}
+ allcanvs delete secsel
+}
+
+proc addtohistory {cmd} {
+ global history historyindex
+
+ if {$historyindex > 0
+ && [lindex $history [expr {$historyindex - 1}]] == $cmd} {
+ return
+ }
+
+ if {$historyindex < [llength $history]} {
+ set history [lreplace $history $historyindex end $cmd]
+ } else {
+ lappend history $cmd
+ }
+ incr historyindex
+ if {$historyindex > 1} {
+ .ctop.top.bar.leftbut conf -state normal
+ } else {
+ .ctop.top.bar.leftbut conf -state disabled
+ }
+ .ctop.top.bar.rightbut conf -state disabled
+}
+
+proc goback {} {
+ global history historyindex
+
+ if {$historyindex > 1} {
+ incr historyindex -1
+ set cmd [lindex $history [expr {$historyindex - 1}]]
+ eval $cmd
+ .ctop.top.bar.rightbut conf -state normal
+ }
+ if {$historyindex <= 1} {
+ .ctop.top.bar.leftbut conf -state disabled
+ }
+}
+
+proc goforw {} {
+ global history historyindex
+
+ if {$historyindex < [llength $history]} {
+ set cmd [lindex $history $historyindex]
+ incr historyindex
+ eval $cmd
+ .ctop.top.bar.leftbut conf -state normal
+ }
+ if {$historyindex >= [llength $history]} {
+ .ctop.top.bar.rightbut conf -state disabled
+ }
+}
+
+proc mergediff {id} {
+ global parents diffmergeid diffmergegca mergefilelist diffpindex
+
+ set diffmergeid $id
+ set diffpindex -1
+ set diffmergegca [findgca $parents($id)]
+ if {[info exists mergefilelist($id)]} {
+ if {$mergefilelist($id) ne {}} {
+ showmergediff
+ }
+ } else {
+ contmergediff {}
+ }
+}
+
+proc findgca {ids} {
+ global env
+ set gca {}
+ foreach id $ids {
+ if {$gca eq {}} {
+ set gca $id
+ } else {
+ if {[catch {
+ set gca [exec $env(HG) --config ui.report_untrusted=false debug-merge-base $gca $id]
+ } err]} {
+ return {}
+ }
+ }
+ }
+ return $gca
+}
+
+proc contmergediff {ids} {
+ global diffmergeid diffpindex parents nparents diffmergegca
+ global treediffs mergefilelist diffids treepending
+
+ # diff the child against each of the parents, and diff
+ # each of the parents against the GCA.
+ while 1 {
+ if {[lindex $ids 0] == $diffmergeid && $diffmergegca ne {}} {
+ set ids [list [lindex $ids 1] $diffmergegca]
+ } else {
+ if {[incr diffpindex] >= $nparents($diffmergeid)} break
+ set p [lindex $parents($diffmergeid) $diffpindex]
+ set ids [list $diffmergeid $p]
+ }
+ if {![info exists treediffs($ids)]} {
+ set diffids $ids
+ if {![info exists treepending]} {
+ gettreediffs $ids
+ }
+ return
+ }
+ }
+
+ # If a file in some parent is different from the child and also
+ # different from the GCA, then it's interesting.
+ # If we don't have a GCA, then a file is interesting if it is
+ # different from the child in all the parents.
+ if {$diffmergegca ne {}} {
+ set files {}
+ foreach p $parents($diffmergeid) {
+ set gcadiffs $treediffs([list $p $diffmergegca])
+ foreach f $treediffs([list $diffmergeid $p]) {
+ if {[lsearch -exact $files $f] < 0
+ && [lsearch -exact $gcadiffs $f] >= 0} {
+ lappend files $f
+ }
+ }
+ }
+ set files [lsort $files]
+ } else {
+ set p [lindex $parents($diffmergeid) 0]
+ set files $treediffs([list $diffmergeid $p])
+ for {set i 1} {$i < $nparents($diffmergeid) && $files ne {}} {incr i} {
+ set p [lindex $parents($diffmergeid) $i]
+ set df $treediffs([list $diffmergeid $p])
+ set nf {}
+ foreach f $files {
+ if {[lsearch -exact $df $f] >= 0} {
+ lappend nf $f
+ }
+ }
+ set files $nf
+ }
+ }
+
+ set mergefilelist($diffmergeid) $files
+ if {$files ne {}} {
+ showmergediff
+ }
+}
+
+proc showmergediff {} {
+ global cflist diffmergeid mergefilelist parents
+ global diffopts diffinhunk currentfile currenthunk filelines
+ global diffblocked groupfilelast mergefds groupfilenum grouphunks
+ global env
+
+ set files $mergefilelist($diffmergeid)
+ foreach f $files {
+ $cflist insert end $f
+ }
+ set env(GIT_DIFF_OPTS) $diffopts
+ set flist {}
+ catch {unset currentfile}
+ catch {unset currenthunk}
+ catch {unset filelines}
+ catch {unset groupfilenum}
+ catch {unset grouphunks}
+ set groupfilelast -1
+ foreach p $parents($diffmergeid) {
+ set cmd [list | $env(HG) --config ui.report_untrusted=false debug-diff-tree -p $p $diffmergeid]
+ set cmd [concat $cmd $mergefilelist($diffmergeid)]
+ if {[catch {set f [open $cmd r]} err]} {
+ error_popup "Error getting diffs: $err"
+ foreach f $flist {
+ catch {close $f}
+ }
+ return
+ }
+ lappend flist $f
+ set ids [list $diffmergeid $p]
+ set mergefds($ids) $f
+ set diffinhunk($ids) 0
+ set diffblocked($ids) 0
+ fconfigure $f -blocking 0
+ fileevent $f readable [list getmergediffline $f $ids $diffmergeid]
+ }
+}
+
+proc getmergediffline {f ids id} {
+ global diffmergeid diffinhunk diffoldlines diffnewlines
+ global currentfile currenthunk
+ global diffoldstart diffnewstart diffoldlno diffnewlno
+ global diffblocked mergefilelist
+ global noldlines nnewlines difflcounts filelines
+
+ set n [gets $f line]
+ if {$n < 0} {
+ if {![eof $f]} return
+ }
+
+ if {!([info exists diffmergeid] && $diffmergeid == $id)} {
+ if {$n < 0} {
+ close $f
+ }
+ return
+ }
+
+ if {$diffinhunk($ids) != 0} {
+ set fi $currentfile($ids)
+ if {$n > 0 && [regexp {^[-+ \\]} $line match]} {
+ # continuing an existing hunk
+ set line [string range $line 1 end]
+ set p [lindex $ids 1]
+ if {$match eq "-" || $match eq " "} {
+ set filelines($p,$fi,$diffoldlno($ids)) $line
+ incr diffoldlno($ids)
+ }
+ if {$match eq "+" || $match eq " "} {
+ set filelines($id,$fi,$diffnewlno($ids)) $line
+ incr diffnewlno($ids)
+ }
+ if {$match eq " "} {
+ if {$diffinhunk($ids) == 2} {
+ lappend difflcounts($ids) \
+ [list $noldlines($ids) $nnewlines($ids)]
+ set noldlines($ids) 0
+ set diffinhunk($ids) 1
+ }
+ incr noldlines($ids)
+ } elseif {$match eq "-" || $match eq "+"} {
+ if {$diffinhunk($ids) == 1} {
+ lappend difflcounts($ids) [list $noldlines($ids)]
+ set noldlines($ids) 0
+ set nnewlines($ids) 0
+ set diffinhunk($ids) 2
+ }
+ if {$match eq "-"} {
+ incr noldlines($ids)
+ } else {
+ incr nnewlines($ids)
+ }
+ }
+ # and if it's \ No newline at end of line, then what?
+ return
+ }
+ # end of a hunk
+ if {$diffinhunk($ids) == 1 && $noldlines($ids) != 0} {
+ lappend difflcounts($ids) [list $noldlines($ids)]
+ } elseif {$diffinhunk($ids) == 2
+ && ($noldlines($ids) != 0 || $nnewlines($ids) != 0)} {
+ lappend difflcounts($ids) [list $noldlines($ids) $nnewlines($ids)]
+ }
+ set currenthunk($ids) [list $currentfile($ids) \
+ $diffoldstart($ids) $diffnewstart($ids) \
+ $diffoldlno($ids) $diffnewlno($ids) \
+ $difflcounts($ids)]
+ set diffinhunk($ids) 0
+ # -1 = need to block, 0 = unblocked, 1 = is blocked
+ set diffblocked($ids) -1
+ processhunks
+ if {$diffblocked($ids) == -1} {
+ fileevent $f readable {}
+ set diffblocked($ids) 1
+ }
+ }
+
+ if {$n < 0} {
+ # eof
+ if {!$diffblocked($ids)} {
+ close $f
+ set currentfile($ids) [llength $mergefilelist($diffmergeid)]
+ set currenthunk($ids) [list $currentfile($ids) 0 0 0 0 {}]
+ processhunks
+ }
+ } elseif {[regexp {^diff --git a/(.*) b/} $line match fname]} {
+ # start of a new file
+ set currentfile($ids) \
+ [lsearch -exact $mergefilelist($diffmergeid) $fname]
+ } elseif {[regexp {^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@(.*)} \
+ $line match f1l f1c f2l f2c rest]} {
+ if {[info exists currentfile($ids)] && $currentfile($ids) >= 0} {
+ # start of a new hunk
+ if {$f1l == 0 && $f1c == 0} {
+ set f1l 1
+ }
+ if {$f2l == 0 && $f2c == 0} {
+ set f2l 1
+ }
+ set diffinhunk($ids) 1
+ set diffoldstart($ids) $f1l
+ set diffnewstart($ids) $f2l
+ set diffoldlno($ids) $f1l
+ set diffnewlno($ids) $f2l
+ set difflcounts($ids) {}
+ set noldlines($ids) 0
+ set nnewlines($ids) 0
+ }
+ }
+}
+
+proc processhunks {} {
+ global diffmergeid parents nparents currenthunk
+ global mergefilelist diffblocked mergefds
+ global grouphunks grouplinestart grouplineend groupfilenum
+
+ set nfiles [llength $mergefilelist($diffmergeid)]
+ while 1 {
+ set fi $nfiles
+ set lno 0
+ # look for the earliest hunk
+ foreach p $parents($diffmergeid) {
+ set ids [list $diffmergeid $p]
+ if {![info exists currenthunk($ids)]} return
+ set i [lindex $currenthunk($ids) 0]
+ set l [lindex $currenthunk($ids) 2]
+ if {$i < $fi || ($i == $fi && $l < $lno)} {
+ set fi $i
+ set lno $l
+ set pi $p
+ }
+ }
+
+ if {$fi < $nfiles} {
+ set ids [list $diffmergeid $pi]
+ set hunk $currenthunk($ids)
+ unset currenthunk($ids)
+ if {$diffblocked($ids) > 0} {
+ fileevent $mergefds($ids) readable \
+ [list getmergediffline $mergefds($ids) $ids $diffmergeid]
+ }
+ set diffblocked($ids) 0
+
+ if {[info exists groupfilenum] && $groupfilenum == $fi
+ && $lno <= $grouplineend} {
+ # add this hunk to the pending group
+ lappend grouphunks($pi) $hunk
+ set endln [lindex $hunk 4]
+ if {$endln > $grouplineend} {
+ set grouplineend $endln
+ }
+ continue
+ }
+ }
+
+ # succeeding stuff doesn't belong in this group, so
+ # process the group now
+ if {[info exists groupfilenum]} {
+ processgroup
+ unset groupfilenum
+ unset grouphunks
+ }
+
+ if {$fi >= $nfiles} break
+
+ # start a new group
+ set groupfilenum $fi
+ set grouphunks($pi) [list $hunk]
+ set grouplinestart $lno
+ set grouplineend [lindex $hunk 4]
+ }
+}
+
+proc processgroup {} {
+ global groupfilelast groupfilenum difffilestart
+ global mergefilelist diffmergeid ctext filelines
+ global parents diffmergeid diffoffset
+ global grouphunks grouplinestart grouplineend nparents
+ global mergemax
+
+ $ctext conf -state normal
+ set id $diffmergeid
+ set f $groupfilenum
+ if {$groupfilelast != $f} {
+ $ctext insert end "\n"
+ set here [$ctext index "end - 1c"]
+ set difffilestart($f) $here
+ set mark fmark.[expr {$f + 1}]
+ $ctext mark set $mark $here
+ $ctext mark gravity $mark left
+ set header [lindex $mergefilelist($id) $f]
+ set l [expr {(78 - [string length $header]) / 2}]
+ set pad [string range "----------------------------------------" 1 $l]
+ $ctext insert end "$pad $header $pad\n" filesep
+ set groupfilelast $f
+ foreach p $parents($id) {
+ set diffoffset($p) 0
+ }
+ }
+
+ $ctext insert end "@@" msep
+ set nlines [expr {$grouplineend - $grouplinestart}]
+ set events {}
+ set pnum 0
+ foreach p $parents($id) {
+ set startline [expr {$grouplinestart + $diffoffset($p)}]
+ set ol $startline
+ set nl $grouplinestart
+ if {[info exists grouphunks($p)]} {
+ foreach h $grouphunks($p) {
+ set l [lindex $h 2]
+ if {$nl < $l} {
+ for {} {$nl < $l} {incr nl} {
+ set filelines($p,$f,$ol) $filelines($id,$f,$nl)
+ incr ol
+ }
+ }
+ foreach chunk [lindex $h 5] {
+ if {[llength $chunk] == 2} {
+ set olc [lindex $chunk 0]
+ set nlc [lindex $chunk 1]
+ set nnl [expr {$nl + $nlc}]
+ lappend events [list $nl $nnl $pnum $olc $nlc]
+ incr ol $olc
+ set nl $nnl
+ } else {
+ incr ol [lindex $chunk 0]
+ incr nl [lindex $chunk 0]
+ }
+ }
+ }
+ }
+ if {$nl < $grouplineend} {
+ for {} {$nl < $grouplineend} {incr nl} {
+ set filelines($p,$f,$ol) $filelines($id,$f,$nl)
+ incr ol
+ }
+ }
+ set nlines [expr {$ol - $startline}]
+ $ctext insert end " -$startline,$nlines" msep
+ incr pnum
+ }
+
+ set nlines [expr {$grouplineend - $grouplinestart}]
+ $ctext insert end " +$grouplinestart,$nlines @@\n" msep
+
+ set events [lsort -integer -index 0 $events]
+ set nevents [llength $events]
+ set nmerge $nparents($diffmergeid)
+ set l $grouplinestart
+ for {set i 0} {$i < $nevents} {set i $j} {
+ set nl [lindex $events $i 0]
+ while {$l < $nl} {
+ $ctext insert end " $filelines($id,$f,$l)\n"
+ incr l
+ }
+ set e [lindex $events $i]
+ set enl [lindex $e 1]
+ set j $i
+ set active {}
+ while 1 {
+ set pnum [lindex $e 2]
+ set olc [lindex $e 3]
+ set nlc [lindex $e 4]
+ if {![info exists delta($pnum)]} {
+ set delta($pnum) [expr {$olc - $nlc}]
+ lappend active $pnum
+ } else {
+ incr delta($pnum) [expr {$olc - $nlc}]
+ }
+ if {[incr j] >= $nevents} break
+ set e [lindex $events $j]
+ if {[lindex $e 0] >= $enl} break
+ if {[lindex $e 1] > $enl} {
+ set enl [lindex $e 1]
+ }
+ }
+ set nlc [expr {$enl - $l}]
+ set ncol mresult
+ set bestpn -1
+ if {[llength $active] == $nmerge - 1} {
+ # no diff for one of the parents, i.e. it's identical
+ for {set pnum 0} {$pnum < $nmerge} {incr pnum} {
+ if {![info exists delta($pnum)]} {
+ if {$pnum < $mergemax} {
+ lappend ncol m$pnum
+ } else {
+ lappend ncol mmax
+ }
+ break
+ }
+ }
+ } elseif {[llength $active] == $nmerge} {
+ # all parents are different, see if one is very similar
+ set bestsim 30
+ for {set pnum 0} {$pnum < $nmerge} {incr pnum} {
+ set sim [similarity $pnum $l $nlc $f \
+ [lrange $events $i [expr {$j-1}]]]
+ if {$sim > $bestsim} {
+ set bestsim $sim
+ set bestpn $pnum
+ }
+ }
+ if {$bestpn >= 0} {
+ lappend ncol m$bestpn
+ }
+ }
+ set pnum -1
+ foreach p $parents($id) {
+ incr pnum
+ if {![info exists delta($pnum)] || $pnum == $bestpn} continue
+ set olc [expr {$nlc + $delta($pnum)}]
+ set ol [expr {$l + $diffoffset($p)}]
+ incr diffoffset($p) $delta($pnum)
+ unset delta($pnum)
+ for {} {$olc > 0} {incr olc -1} {
+ $ctext insert end "-$filelines($p,$f,$ol)\n" m$pnum
+ incr ol
+ }
+ }
+ set endl [expr {$l + $nlc}]
+ if {$bestpn >= 0} {
+ # show this pretty much as a normal diff
+ set p [lindex $parents($id) $bestpn]
+ set ol [expr {$l + $diffoffset($p)}]
+ incr diffoffset($p) $delta($bestpn)
+ unset delta($bestpn)
+ for {set k $i} {$k < $j} {incr k} {
+ set e [lindex $events $k]
+ if {[lindex $e 2] != $bestpn} continue
+ set nl [lindex $e 0]
+ set ol [expr {$ol + $nl - $l}]
+ for {} {$l < $nl} {incr l} {
+ $ctext insert end "+$filelines($id,$f,$l)\n" $ncol
+ }
+ set c [lindex $e 3]
+ for {} {$c > 0} {incr c -1} {
+ $ctext insert end "-$filelines($p,$f,$ol)\n" m$bestpn
+ incr ol
+ }
+ set nl [lindex $e 1]
+ for {} {$l < $nl} {incr l} {
+ $ctext insert end "+$filelines($id,$f,$l)\n" mresult
+ }
+ }
+ }
+ for {} {$l < $endl} {incr l} {
+ $ctext insert end "+$filelines($id,$f,$l)\n" $ncol
+ }
+ }
+ while {$l < $grouplineend} {
+ $ctext insert end " $filelines($id,$f,$l)\n"
+ incr l
+ }
+ $ctext conf -state disabled
+}
+
+proc similarity {pnum l nlc f events} {
+ global diffmergeid parents diffoffset filelines
+
+ set id $diffmergeid
+ set p [lindex $parents($id) $pnum]
+ set ol [expr {$l + $diffoffset($p)}]
+ set endl [expr {$l + $nlc}]
+ set same 0
+ set diff 0
+ foreach e $events {
+ if {[lindex $e 2] != $pnum} continue
+ set nl [lindex $e 0]
+ set ol [expr {$ol + $nl - $l}]
+ for {} {$l < $nl} {incr l} {
+ incr same [string length $filelines($id,$f,$l)]
+ incr same
+ }
+ set oc [lindex $e 3]
+ for {} {$oc > 0} {incr oc -1} {
+ incr diff [string length $filelines($p,$f,$ol)]
+ incr diff
+ incr ol
+ }
+ set nl [lindex $e 1]
+ for {} {$l < $nl} {incr l} {
+ incr diff [string length $filelines($id,$f,$l)]
+ incr diff
+ }
+ }
+ for {} {$l < $endl} {incr l} {
+ incr same [string length $filelines($id,$f,$l)]
+ incr same
+ }
+ if {$same == 0} {
+ return 0
+ }
+ return [expr {200 * $same / (2 * $same + $diff)}]
+}
+
+proc startdiff {ids} {
+ global treediffs diffids treepending diffmergeid
+
+ set diffids $ids
+ catch {unset diffmergeid}
+ if {![info exists treediffs($ids)]} {
+ if {![info exists treepending]} {
+ gettreediffs $ids
+ }
+ } else {
+ addtocflist $ids
+ }
+}
+
+proc addtocflist {ids} {
+ global treediffs cflist
+ foreach f $treediffs($ids) {
+ $cflist insert end $f
+ }
+ getblobdiffs $ids
+}
+
+proc gettreediffs {ids} {
+ global treediff parents treepending env
+ set treepending $ids
+ set treediff {}
+ set id [lindex $ids 0]
+ set p [lindex $ids 1]
+ if [catch {set gdtf [open "|{$env(HG)} --config ui.report_untrusted=false debug-diff-tree -r $p $id" r]}] return
+ fconfigure $gdtf -blocking 0
+ fileevent $gdtf readable [list gettreediffline $gdtf $ids]
+}
+
+proc gettreediffline {gdtf ids} {
+ global treediff treediffs treepending diffids diffmergeid
+
+ set n [gets $gdtf line]
+ if {$n < 0} {
+ if {![eof $gdtf]} return
+ close $gdtf
+ set treediffs($ids) $treediff
+ unset treepending
+ if {$ids != $diffids} {
+ gettreediffs $diffids
+ } else {
+ if {[info exists diffmergeid]} {
+ contmergediff $ids
+ } else {
+ addtocflist $ids
+ }
+ }
+ return
+ }
+ set tab1 [expr [string first "\t" $line] + 1]
+ set tab2 [expr [string first "\t" $line $tab1] - 1]
+ set file [string range $line $tab1 $tab2]
+ lappend treediff $file
+}
+
+proc getblobdiffs {ids} {
+ global diffopts blobdifffd diffids env curdifftag curtagstart
+ global difffilestart nextupdate diffinhdr treediffs
+
+ set id [lindex $ids 0]
+ set p [lindex $ids 1]
+ set env(GIT_DIFF_OPTS) $diffopts
+ set cmd [list | $env(HG) --config ui.report_untrusted=false debug-diff-tree -r -p -C $p $id]
+ if {[catch {set bdf [open $cmd r]} err]} {
+ puts "error getting diffs: $err"
+ return
+ }
+ set diffinhdr 0
+ fconfigure $bdf -blocking 0
+ set blobdifffd($ids) $bdf
+ set curdifftag Comments
+ set curtagstart 0.0
+ catch {unset difffilestart}
+ fileevent $bdf readable [list getblobdiffline $bdf $diffids]
+ set nextupdate [expr {[clock clicks -milliseconds] + 100}]
+}
+
+proc getblobdiffline {bdf ids} {
+ global diffids blobdifffd ctext curdifftag curtagstart
+ global diffnexthead diffnextnote difffilestart
+ global nextupdate diffinhdr treediffs
+ global gaudydiff
+
+ set n [gets $bdf line]
+ if {$n < 0} {
+ if {[eof $bdf]} {
+ close $bdf
+ if {$ids == $diffids && $bdf == $blobdifffd($ids)} {
+ $ctext tag add $curdifftag $curtagstart end
+ }
+ }
+ return
+ }
+ if {$ids != $diffids || $bdf != $blobdifffd($ids)} {
+ return
+ }
+ regsub -all "\r" $line "" line
+ $ctext conf -state normal
+ if {[regexp {^diff --git a/(.*) b/(.*)} $line match fname newname]} {
+ # start of a new file
+ $ctext insert end "\n"
+ $ctext tag add $curdifftag $curtagstart end
+ set curtagstart [$ctext index "end - 1c"]
+ set header $newname
+ set here [$ctext index "end - 1c"]
+ set i [lsearch -exact $treediffs($diffids) $fname]
+ if {$i >= 0} {
+ set difffilestart($i) $here
+ incr i
+ $ctext mark set fmark.$i $here
+ $ctext mark gravity fmark.$i left
+ }
+ if {$newname != $fname} {
+ set i [lsearch -exact $treediffs($diffids) $newname]
+ if {$i >= 0} {
+ set difffilestart($i) $here
+ incr i
+ $ctext mark set fmark.$i $here
+ $ctext mark gravity fmark.$i left
+ }
+ }
+ set curdifftag "f:$fname"
+ $ctext tag delete $curdifftag
+ set l [expr {(78 - [string length $header]) / 2}]
+ set pad [string range "----------------------------------------" 1 $l]
+ $ctext insert end "$pad $header $pad\n" filesep
+ set diffinhdr 1
+ } elseif {[regexp {^(---|\+\+\+) } $line] && $diffinhdr} {
+ set diffinhdr 1
+ } elseif {[regexp {^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@(.*)} \
+ $line match f1l f1c f2l f2c rest]} {
+ if {$gaudydiff} {
+ $ctext insert end "\t" hunksep
+ $ctext insert end " $f1l " d0 " $f2l " d1
+ $ctext insert end " $rest \n" hunksep
+ } else {
+ $ctext insert end "$line\n" hunksep
+ }
+ set diffinhdr 0
+ } else {
+ set x [string range $line 0 0]
+ if {$x == "-" || $x == "+"} {
+ set tag [expr {$x == "+"}]
+ if {$gaudydiff} {
+ set line [string range $line 1 end]
+ }
+ $ctext insert end "$line\n" d$tag
+ } elseif {$x == " "} {
+ if {$gaudydiff} {
+ set line [string range $line 1 end]
+ }
+ $ctext insert end "$line\n"
+ } elseif {$diffinhdr || $x == "\\"} {
+ # e.g. "\ No newline at end of file"
+ $ctext insert end "$line\n" filesep
+ } elseif {$line != ""} {
+ # Something else we don't recognize
+ if {$curdifftag != "Comments"} {
+ $ctext insert end "\n"
+ $ctext tag add $curdifftag $curtagstart end
+ set curtagstart [$ctext index "end - 1c"]
+ set curdifftag Comments
+ }
+ $ctext insert end "$line\n" filesep
+ }
+ }
+ $ctext conf -state disabled
+ if {[clock clicks -milliseconds] >= $nextupdate} {
+ incr nextupdate 100
+ fileevent $bdf readable {}
+ update
+ fileevent $bdf readable "getblobdiffline $bdf {$ids}"
+ }
+}
+
+proc nextfile {} {
+ global difffilestart ctext
+ set here [$ctext index @0,0]
+ for {set i 0} {[info exists difffilestart($i)]} {incr i} {
+ if {[$ctext compare $difffilestart($i) > $here]} {
+ if {![info exists pos]
+ || [$ctext compare $difffilestart($i) < $pos]} {
+ set pos $difffilestart($i)
+ }
+ }
+ }
+ if {[info exists pos]} {
+ $ctext yview $pos
+ }
+}
+
+proc listboxsel {} {
+ global ctext cflist currentid
+ if {![info exists currentid]} return
+ set sel [lsort [$cflist curselection]]
+ if {$sel eq {}} return
+ set first [lindex $sel 0]
+ catch {$ctext yview fmark.$first}
+}
+
+proc setcoords {} {
+ global linespc charspc canvx0 canvy0 mainfont
+ global xspc1 xspc2 lthickness
+
+ set linespc [font metrics $mainfont -linespace]
+ set charspc [font measure $mainfont "m"]
+ set canvy0 [expr 3 + 0.5 * $linespc]
+ set canvx0 [expr 3 + 0.5 * $linespc]
+ set lthickness [expr {int($linespc / 9) + 1}]
+ set xspc1(0) $linespc
+ set xspc2 $linespc
+}
+
+proc redisplay {} {
+ global stopped redisplaying phase
+ if {$stopped > 1} return
+ if {$phase == "getcommits"} return
+ set redisplaying 1
+ if {$phase == "drawgraph" || $phase == "incrdraw"} {
+ set stopped 1
+ } else {
+ drawgraph
+ }
+}
+
+proc incrfont {inc} {
+ global mainfont namefont textfont ctext canv phase
+ global stopped entries curidfont
+ unmarkmatches
+ set mainfont [lreplace $mainfont 1 1 [expr {[lindex $mainfont 1] + $inc}]]
+ set curidfont [lreplace $curidfont 1 1 [expr {[lindex $curidfont 1] + $inc}]]
+ set namefont [lreplace $namefont 1 1 [expr {[lindex $namefont 1] + $inc}]]
+ set textfont [lreplace $textfont 1 1 [expr {[lindex $textfont 1] + $inc}]]
+ setcoords
+ $ctext conf -font $textfont
+ $ctext tag conf filesep -font [concat $textfont bold]
+ foreach e $entries {
+ $e conf -font $mainfont
+ }
+ if {$phase == "getcommits"} {
+ $canv itemconf textitems -font $mainfont
+ }
+ redisplay
+}
+
+proc clearsha1 {} {
+ global sha1entry sha1string
+ if {[string length $sha1string] == 40} {
+ $sha1entry delete 0 end
+ }
+}
+
+proc sha1change {n1 n2 op} {
+ global sha1string currentid sha1but
+ if {$sha1string == {}
+ || ([info exists currentid] && $sha1string == $currentid)} {
+ set state disabled
+ } else {
+ set state normal
+ }
+ if {[$sha1but cget -state] == $state} return
+ if {$state == "normal"} {
+ $sha1but conf -state normal -relief raised -text "Goto: "
+ } else {
+ $sha1but conf -state disabled -relief flat -text "SHA1 ID: "
+ }
+}
+
+proc gotocommit {} {
+ global sha1string currentid idline tagids
+ global lineid numcommits
+
+ if {$sha1string == {}
+ || ([info exists currentid] && $sha1string == $currentid)} return
+ if {[info exists tagids($sha1string)]} {
+ set id $tagids($sha1string)
+ } else {
+ set id [string tolower $sha1string]
+ if {[regexp {^[0-9a-f]{4,39}$} $id]} {
+ set matches {}
+ for {set l 0} {$l < $numcommits} {incr l} {
+ if {[string match $id* $lineid($l)]} {
+ lappend matches $lineid($l)
+ }
+ }
+ if {$matches ne {}} {
+ if {[llength $matches] > 1} {
+ error_popup "Short SHA1 id $id is ambiguous"
+ return
+ }
+ set id [lindex $matches 0]
+ }
+ }
+ }
+ if {[info exists idline($id)]} {
+ selectline $idline($id) 1
+ return
+ }
+ if {[regexp {^[0-9a-fA-F]{4,}$} $sha1string]} {
+ set type "SHA1 id"
+ } else {
+ set type "Tag"
+ }
+ error_popup "$type $sha1string is not known"
+}
+
+proc lineenter {x y id} {
+ global hoverx hovery hoverid hovertimer
+ global commitinfo canv
+
+ if {![info exists commitinfo($id)]} return
+ set hoverx $x
+ set hovery $y
+ set hoverid $id
+ if {[info exists hovertimer]} {
+ after cancel $hovertimer
+ }
+ set hovertimer [after 500 linehover]
+ $canv delete hover
+}
+
+proc linemotion {x y id} {
+ global hoverx hovery hoverid hovertimer
+
+ if {[info exists hoverid] && $id == $hoverid} {
+ set hoverx $x
+ set hovery $y
+ if {[info exists hovertimer]} {
+ after cancel $hovertimer
+ }
+ set hovertimer [after 500 linehover]
+ }
+}
+
+proc lineleave {id} {
+ global hoverid hovertimer canv
+
+ if {[info exists hoverid] && $id == $hoverid} {
+ $canv delete hover
+ if {[info exists hovertimer]} {
+ after cancel $hovertimer
+ unset hovertimer
+ }
+ unset hoverid
+ }
+}
+
+proc linehover {} {
+ global hoverx hovery hoverid hovertimer
+ global canv linespc lthickness
+ global commitinfo mainfont
+
+ set text [lindex $commitinfo($hoverid) 0]
+ set ymax [lindex [$canv cget -scrollregion] 3]
+ if {$ymax == {}} return
+ set yfrac [lindex [$canv yview] 0]
+ set x [expr {$hoverx + 2 * $linespc}]
+ set y [expr {$hovery + $yfrac * $ymax - $linespc / 2}]
+ set x0 [expr {$x - 2 * $lthickness}]
+ set y0 [expr {$y - 2 * $lthickness}]
+ set x1 [expr {$x + [font measure $mainfont $text] + 2 * $lthickness}]
+ set y1 [expr {$y + $linespc + 2 * $lthickness}]
+ set t [$canv create rectangle $x0 $y0 $x1 $y1 \
+ -fill \#ffff80 -outline black -width 1 -tags hover]
+ $canv raise $t
+ set t [$canv create text $x $y -anchor nw -text $text -tags hover]
+ $canv raise $t
+}
+
+proc clickisonarrow {id y} {
+ global mainline mainlinearrow sidelines lthickness
+
+ set thresh [expr {2 * $lthickness + 6}]
+ if {[info exists mainline($id)]} {
+ if {$mainlinearrow($id) ne "none"} {
+ if {abs([lindex $mainline($id) 1] - $y) < $thresh} {
+ return "up"
+ }
+ }
+ }
+ if {[info exists sidelines($id)]} {
+ foreach ls $sidelines($id) {
+ set coords [lindex $ls 0]
+ set arrow [lindex $ls 2]
+ if {$arrow eq "first" || $arrow eq "both"} {
+ if {abs([lindex $coords 1] - $y) < $thresh} {
+ return "up"
+ }
+ }
+ if {$arrow eq "last" || $arrow eq "both"} {
+ if {abs([lindex $coords end] - $y) < $thresh} {
+ return "down"
+ }
+ }
+ }
+ }
+ return {}
+}
+
+proc arrowjump {id dirn y} {
+ global mainline sidelines canv
+
+ set yt {}
+ if {$dirn eq "down"} {
+ if {[info exists mainline($id)]} {
+ set y1 [lindex $mainline($id) 1]
+ if {$y1 > $y} {
+ set yt $y1
+ }
+ }
+ if {[info exists sidelines($id)]} {
+ foreach ls $sidelines($id) {
+ set y1 [lindex $ls 0 1]
+ if {$y1 > $y && ($yt eq {} || $y1 < $yt)} {
+ set yt $y1
+ }
+ }
+ }
+ } else {
+ if {[info exists sidelines($id)]} {
+ foreach ls $sidelines($id) {
+ set y1 [lindex $ls 0 end]
+ if {$y1 < $y && ($yt eq {} || $y1 > $yt)} {
+ set yt $y1
+ }
+ }
+ }
+ }
+ if {$yt eq {}} return
+ set ymax [lindex [$canv cget -scrollregion] 3]
+ if {$ymax eq {} || $ymax <= 0} return
+ set view [$canv yview]
+ set yspan [expr {[lindex $view 1] - [lindex $view 0]}]
+ set yfrac [expr {$yt / $ymax - $yspan / 2}]
+ if {$yfrac < 0} {
+ set yfrac 0
+ }
+ $canv yview moveto $yfrac
+}
+
+proc lineclick {x y id isnew} {
+ global ctext commitinfo children cflist canv thickerline
+
+ unmarkmatches
+ unselectline
+ normalline
+ $canv delete hover
+ # draw this line thicker than normal
+ drawlines $id 1
+ set thickerline $id
+ if {$isnew} {
+ set ymax [lindex [$canv cget -scrollregion] 3]
+ if {$ymax eq {}} return
+ set yfrac [lindex [$canv yview] 0]
+ set y [expr {$y + $yfrac * $ymax}]
+ }
+ set dirn [clickisonarrow $id $y]
+ if {$dirn ne {}} {
+ arrowjump $id $dirn $y
+ return
+ }
+
+ if {$isnew} {
+ addtohistory [list lineclick $x $y $id 0]
+ }
+ # fill the details pane with info about this line
+ $ctext conf -state normal
+ $ctext delete 0.0 end
+ $ctext tag conf link -foreground blue -underline 1
+ $ctext tag bind link <Enter> { %W configure -cursor hand2 }
+ $ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
+ $ctext insert end "Parent:\t"
+ $ctext insert end $id [list link link0]
+ $ctext tag bind link0 <1> [list selbyid $id]
+ set info $commitinfo($id)
+ $ctext insert end "\n\t[lindex $info 0]\n"
+ $ctext insert end "\tAuthor:\t[lindex $info 1]\n"
+ $ctext insert end "\tDate:\t[lindex $info 2]\n"
+ if {[info exists children($id)]} {
+ $ctext insert end "\nChildren:"
+ set i 0
+ foreach child $children($id) {
+ incr i
+ set info $commitinfo($child)
+ $ctext insert end "\n\t"
+ $ctext insert end $child [list link link$i]
+ $ctext tag bind link$i <1> [list selbyid $child]
+ $ctext insert end "\n\t[lindex $info 0]"
+ $ctext insert end "\n\tAuthor:\t[lindex $info 1]"
+ $ctext insert end "\n\tDate:\t[lindex $info 2]\n"
+ }
+ }
+ $ctext conf -state disabled
+
+ $cflist delete 0 end
+}
+
+proc normalline {} {
+ global thickerline
+ if {[info exists thickerline]} {
+ drawlines $thickerline 0
+ unset thickerline
+ }
+}
+
+proc selbyid {id} {
+ global idline
+ if {[info exists idline($id)]} {
+ selectline $idline($id) 1
+ }
+}
+
+proc mstime {} {
+ global startmstime
+ if {![info exists startmstime]} {
+ set startmstime [clock clicks -milliseconds]
+ }
+ return [format "%.3f" [expr {([clock click -milliseconds] - $startmstime) / 1000.0}]]
+}
+
+proc rowmenu {x y id} {
+ global rowctxmenu idline selectedline rowmenuid hgvdiff
+
+ if {![info exists selectedline] || $idline($id) eq $selectedline} {
+ set state disabled
+ } else {
+ set state normal
+ }
+ $rowctxmenu entryconfigure 0 -state $state
+ $rowctxmenu entryconfigure 1 -state $state
+ $rowctxmenu entryconfigure 2 -state $state
+ if { $hgvdiff ne "" } {
+ $rowctxmenu entryconfigure 6 -state $state
+ }
+ set rowmenuid $id
+ tk_popup $rowctxmenu $x $y
+}
+
+proc diffvssel {dirn} {
+ global rowmenuid selectedline lineid
+
+ if {![info exists selectedline]} return
+ if {$dirn} {
+ set oldid $lineid($selectedline)
+ set newid $rowmenuid
+ } else {
+ set oldid $rowmenuid
+ set newid $lineid($selectedline)
+ }
+ addtohistory [list doseldiff $oldid $newid]
+ doseldiff $oldid $newid
+}
+
+proc doseldiff {oldid newid} {
+ global ctext cflist
+ global commitinfo
+
+ $ctext conf -state normal
+ $ctext delete 0.0 end
+ $ctext mark set fmark.0 0.0
+ $ctext mark gravity fmark.0 left
+ $cflist delete 0 end
+ $cflist insert end "Top"
+ $ctext insert end "From "
+ $ctext tag conf link -foreground blue -underline 1
+ $ctext tag bind link <Enter> { %W configure -cursor hand2 }
+ $ctext tag bind link <Leave> { %W configure -cursor $curtextcursor }
+ $ctext tag bind link0 <1> [list selbyid $oldid]
+ $ctext insert end $oldid [list link link0]
+ $ctext insert end "\n "
+ $ctext insert end [lindex $commitinfo($oldid) 0]
+ $ctext insert end "\n\nTo "
+ $ctext tag bind link1 <1> [list selbyid $newid]
+ $ctext insert end $newid [list link link1]
+ $ctext insert end "\n "
+ $ctext insert end [lindex $commitinfo($newid) 0]
+ $ctext insert end "\n"
+ $ctext conf -state disabled
+ $ctext tag delete Comments
+ $ctext tag remove found 1.0 end
+ startdiff [list $newid $oldid]
+}
+
+proc mkpatch {} {
+ global rowmenuid currentid commitinfo patchtop patchnum
+
+ if {![info exists currentid]} return
+ set oldid $currentid
+ set oldhead [lindex $commitinfo($oldid) 0]
+ set newid $rowmenuid
+ set newhead [lindex $commitinfo($newid) 0]
+ set top .patch
+ set patchtop $top
+ catch {destroy $top}
+ toplevel $top
+ label $top.title -text "Generate patch"
+ grid $top.title - -pady 10
+ label $top.from -text "From:"
+ entry $top.fromsha1 -width 40 -relief flat
+ $top.fromsha1 insert 0 $oldid
+ $top.fromsha1 conf -state readonly
+ grid $top.from $top.fromsha1 -sticky w
+ entry $top.fromhead -width 60 -relief flat
+ $top.fromhead insert 0 $oldhead
+ $top.fromhead conf -state readonly
+ grid x $top.fromhead -sticky w
+ label $top.to -text "To:"
+ entry $top.tosha1 -width 40 -relief flat
+ $top.tosha1 insert 0 $newid
+ $top.tosha1 conf -state readonly
+ grid $top.to $top.tosha1 -sticky w
+ entry $top.tohead -width 60 -relief flat
+ $top.tohead insert 0 $newhead
+ $top.tohead conf -state readonly
+ grid x $top.tohead -sticky w
+ button $top.rev -text "Reverse" -command mkpatchrev -padx 5
+ grid $top.rev x -pady 10
+ label $top.flab -text "Output file:"
+ entry $top.fname -width 60
+ $top.fname insert 0 [file normalize "patch$patchnum.patch"]
+ incr patchnum
+ grid $top.flab $top.fname -sticky w
+ frame $top.buts
+ button $top.buts.gen -text "Generate" -command mkpatchgo
+ button $top.buts.can -text "Cancel" -command mkpatchcan
+ grid $top.buts.gen $top.buts.can
+ grid columnconfigure $top.buts 0 -weight 1 -uniform a
+ grid columnconfigure $top.buts 1 -weight 1 -uniform a
+ grid $top.buts - -pady 10 -sticky ew
+ focus $top.fname
+}
+
+proc mkpatchrev {} {
+ global patchtop
+
+ set oldid [$patchtop.fromsha1 get]
+ set oldhead [$patchtop.fromhead get]
+ set newid [$patchtop.tosha1 get]
+ set newhead [$patchtop.tohead get]
+ foreach e [list fromsha1 fromhead tosha1 tohead] \
+ v [list $newid $newhead $oldid $oldhead] {
+ $patchtop.$e conf -state normal
+ $patchtop.$e delete 0 end
+ $patchtop.$e insert 0 $v
+ $patchtop.$e conf -state readonly
+ }
+}
+
+proc mkpatchgo {} {
+ global patchtop env
+
+ set oldid [$patchtop.fromsha1 get]
+ set newid [$patchtop.tosha1 get]
+ set fname [$patchtop.fname get]
+ if {[catch {exec $env(HG) --config ui.report_untrusted=false debug-diff-tree -p $oldid $newid >$fname &} err]} {
+ error_popup "Error creating patch: $err"
+ }
+ catch {destroy $patchtop}
+ unset patchtop
+}
+
+proc mkpatchcan {} {
+ global patchtop
+
+ catch {destroy $patchtop}
+ unset patchtop
+}
+
+proc mktag {} {
+ global rowmenuid mktagtop commitinfo
+
+ set top .maketag
+ set mktagtop $top
+ catch {destroy $top}
+ toplevel $top
+ label $top.title -text "Create tag"
+ grid $top.title - -pady 10
+ label $top.id -text "ID:"
+ entry $top.sha1 -width 40 -relief flat
+ $top.sha1 insert 0 $rowmenuid
+ $top.sha1 conf -state readonly
+ grid $top.id $top.sha1 -sticky w
+ entry $top.head -width 60 -relief flat
+ $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
+ $top.head conf -state readonly
+ grid x $top.head -sticky w
+ label $top.tlab -text "Tag name:"
+ entry $top.tag -width 60
+ grid $top.tlab $top.tag -sticky w
+ frame $top.buts
+ button $top.buts.gen -text "Create" -command mktaggo
+ button $top.buts.can -text "Cancel" -command mktagcan
+ grid $top.buts.gen $top.buts.can
+ grid columnconfigure $top.buts 0 -weight 1 -uniform a
+ grid columnconfigure $top.buts 1 -weight 1 -uniform a
+ grid $top.buts - -pady 10 -sticky ew
+ focus $top.tag
+}
+
+proc domktag {} {
+ global mktagtop env tagids idtags
+
+ set id [$mktagtop.sha1 get]
+ set tag [$mktagtop.tag get]
+ if {$tag == {}} {
+ error_popup "No tag name specified"
+ return
+ }
+ if {[info exists tagids($tag)]} {
+ error_popup "Tag \"$tag\" already exists"
+ return
+ }
+ if {[catch {
+ set out [exec $env(HG) --config ui.report_untrusted=false tag -r $id $tag]
+ } err]} {
+ error_popup "Error creating tag: $err"
+ return
+ }
+
+ set tagids($tag) $id
+ lappend idtags($id) $tag
+ redrawtags $id
+}
+
+proc redrawtags {id} {
+ global canv linehtag idline idpos selectedline
+
+ if {![info exists idline($id)]} return
+ $canv delete tag.$id
+ set xt [eval drawtags $id $idpos($id)]
+ $canv coords $linehtag($idline($id)) $xt [lindex $idpos($id) 2]
+ if {[info exists selectedline] && $selectedline == $idline($id)} {
+ selectline $selectedline 0
+ }
+}
+
+proc mktagcan {} {
+ global mktagtop
+
+ catch {destroy $mktagtop}
+ unset mktagtop
+}
+
+proc mktaggo {} {
+ domktag
+ mktagcan
+}
+
+proc writecommit {} {
+ global rowmenuid wrcomtop commitinfo wrcomcmd
+
+ set top .writecommit
+ set wrcomtop $top
+ catch {destroy $top}
+ toplevel $top
+ label $top.title -text "Write commit to file"
+ grid $top.title - -pady 10
+ label $top.id -text "ID:"
+ entry $top.sha1 -width 40 -relief flat
+ $top.sha1 insert 0 $rowmenuid
+ $top.sha1 conf -state readonly
+ grid $top.id $top.sha1 -sticky w
+ entry $top.head -width 60 -relief flat
+ $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]
+ $top.head conf -state readonly
+ grid x $top.head -sticky w
+ label $top.clab -text "Command:"
+ entry $top.cmd -width 60 -textvariable wrcomcmd
+ grid $top.clab $top.cmd -sticky w -pady 10
+ label $top.flab -text "Output file:"
+ entry $top.fname -width 60
+ $top.fname insert 0 [file normalize "commit-[string range $rowmenuid 0 6]"]
+ grid $top.flab $top.fname -sticky w
+ frame $top.buts
+ button $top.buts.gen -text "Write" -command wrcomgo
+ button $top.buts.can -text "Cancel" -command wrcomcan
+ grid $top.buts.gen $top.buts.can
+ grid columnconfigure $top.buts 0 -weight 1 -uniform a
+ grid columnconfigure $top.buts 1 -weight 1 -uniform a
+ grid $top.buts - -pady 10 -sticky ew
+ focus $top.fname
+}
+
+proc wrcomgo {} {
+ global wrcomtop
+
+ set id [$wrcomtop.sha1 get]
+ set cmd "echo $id | [$wrcomtop.cmd get]"
+ set fname [$wrcomtop.fname get]
+ if {[catch {exec sh -c $cmd > $fname &} err]} {
+ error_popup "Error writing commit: $err"
+ }
+ catch {destroy $wrcomtop}
+ unset wrcomtop
+}
+
+proc wrcomcan {} {
+ global wrcomtop
+
+ catch {destroy $wrcomtop}
+ unset wrcomtop
+}
+
+proc listrefs {id} {
+ global idtags idheads idotherrefs idbookmarks
+
+ set w {}
+ if {[info exists idbookmarks($id)]} {
+ set w $idbookmarks($id)
+ }
+ set x {}
+ if {[info exists idtags($id)]} {
+ set x $idtags($id)
+ }
+ set y {}
+ if {[info exists idheads($id)]} {
+ set y $idheads($id)
+ }
+ set z {}
+ if {[info exists idotherrefs($id)]} {
+ set z $idotherrefs($id)
+ }
+ return [list $w $x $y $z]
+}
+
+proc rereadrefs {} {
+ global idbookmarks idtags idheads idotherrefs
+ global bookmarkids tagids headids otherrefids
+
+ set refids [concat [array names idtags] \
+ [array names idheads] [array names idotherrefs] \
+ [array names idbookmarks]]
+ foreach id $refids {
+ if {![info exists ref($id)]} {
+ set ref($id) [listrefs $id]
+ }
+ }
+ foreach v {tagids idtags headids idheads otherrefids idotherrefs \
+ bookmarkids idbookmarks} {
+ catch {unset $v}
+ }
+ readrefs
+ set refids [lsort -unique [concat $refids [array names idtags] \
+ [array names idheads] [array names idotherrefs] \
+ [array names idbookmarks]]]
+ foreach id $refids {
+ set v [listrefs $id]
+ if {![info exists ref($id)] || $ref($id) != $v} {
+ redrawtags $id
+ }
+ }
+}
+
+proc vdiff {withparent} {
+ global env rowmenuid selectedline lineid hgvdiff
+
+ if {![info exists rowmenuid]} return
+ set curid $rowmenuid
+
+ if {$withparent} {
+ set parents [exec $env(HG) --config ui.report_untrusted=false parents --rev $curid --template "{node}\n"]
+ set firstparent [lindex [split $parents "\n"] 0]
+ set otherid $firstparent
+ } else {
+ if {![info exists selectedline]} return
+ set otherid $lineid($selectedline)
+ }
+ set range "$otherid:$curid"
+ if {[catch {exec $env(HG) --config ui.report_untrusted=false $hgvdiff -r $range} err]} {
+ # Ignore errors, this is just visualization
+ }
+}
+
+proc showtag {tag isnew} {
+ global ctext cflist tagcontents tagids linknum
+
+ if {$isnew} {
+ addtohistory [list showtag $tag 0]
+ }
+ $ctext conf -state normal
+ $ctext delete 0.0 end
+ set linknum 0
+ if {[info exists tagcontents($tag)]} {
+ set text $tagcontents($tag)
+ } else {
+ set text "Tag: $tag\nId: $tagids($tag)"
+ }
+ appendwithlinks $text
+ $ctext conf -state disabled
+ $cflist delete 0 end
+}
+
+proc doquit {} {
+ global stopped
+ set stopped 100
+ destroy .
+}
+
+proc getconfig {} {
+ global env
+
+ set lines [exec $env(HG) debug-config]
+ regsub -all "\r\n" $lines "\n" config
+ set config {}
+ foreach line [split $lines "\n"] {
+ regsub "^(k|v)=" $line "" line
+ lappend config $line
+ }
+ return $config
+}
+
+# defaults...
+set datemode 0
+set boldnames 0
+set diffopts "-U 5 -p"
+set wrcomcmd "\"\$HG\" --config ui.report_untrusted=false debug-diff-tree --stdin -p --pretty"
+
+set mainfont {Helvetica 9}
+set curidfont {}
+set textfont {Courier 9}
+set findmergefiles 0
+set gaudydiff 0
+set maxgraphpct 50
+set maxwidth 16
+
+set colors {green red blue magenta darkgrey brown orange}
+set authorcolors {
+ black blue deeppink mediumorchid blue burlywood4 goldenrod slateblue red2 navy dimgrey
+}
+set bgcolor white
+
+# This color should probably be some system color (provided by tk),
+# but as the bgcolor has always been set to white, I choose to ignore
+set fgcolor black
+set diffaddcolor "#00a000"
+set diffremcolor red
+set diffmerge1color red
+set diffmerge2color blue
+set hunksepcolor blue
+
+catch {source ~/.hgk}
+
+if {$curidfont == ""} { # initialize late based on current mainfont
+ set curidfont "$mainfont bold italic underline"
+}
+
+set namefont $mainfont
+if {$boldnames} {
+ lappend namefont bold
+}
+
+set revtreeargs {}
+foreach arg $argv {
+ switch -regexp -- $arg {
+ "^$" { }
+ "^-b" { set boldnames 1 }
+ "^-d" { set datemode 1 }
+ default {
+ lappend revtreeargs $arg
+ }
+ }
+}
+
+set history {}
+set historyindex 0
+
+set stopped 0
+set redisplaying 0
+set stuffsaved 0
+set patchnum 0
+
+array set config [getconfig]
+set hgvdiff $config(vdiff)
+setcoords
+makewindow
+readrefs
+set hgroot [exec $env(HG) root]
+wm title . "hgk $hgroot"
+getcommits $revtreeargs
diff --git a/contrib/hgsh/Makefile b/contrib/hgsh/Makefile
new file mode 100644
index 0000000..966158f
--- /dev/null
+++ b/contrib/hgsh/Makefile
@@ -0,0 +1,13 @@
+CC := gcc
+CFLAGS := -g -O2 -Wall -Werror
+
+prefix ?= /usr/bin
+
+hgsh: hgsh.o
+ $(CC) -o $@ $<
+
+install: hgsh
+ install -m755 hgsh $(prefix)
+
+clean:
+ rm -f *.o hgsh
diff --git a/contrib/hgsh/hgsh.c b/contrib/hgsh/hgsh.c
new file mode 100644
index 0000000..5446107
--- /dev/null
+++ b/contrib/hgsh/hgsh.c
@@ -0,0 +1,440 @@
+/*
+ * hgsh.c - restricted login shell for mercurial
+ *
+ * Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+ *
+ * This software may be used and distributed according to the terms of the
+ * GNU General Public License, incorporated herein by reference.
+ *
+ * this program is login shell for dedicated mercurial user account. it
+ * only allows few actions:
+ *
+ * 1. run hg in server mode on specific repository. no other hg commands
+ * are allowed. we try to verify that repo to be accessed exists under
+ * given top-level directory.
+ *
+ * 2. (optional) forward ssh connection from firewall/gateway machine to
+ * "real" mercurial host, to let users outside intranet pull and push
+ * changes through firewall.
+ *
+ * 3. (optional) run normal shell, to allow to "su" to mercurial user, use
+ * "sudo" to run programs as that user, or run cron jobs as that user.
+ *
+ * only tested on linux yet. patches for non-linux systems welcome.
+ */
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE /* for asprintf */
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+/*
+ * user config.
+ *
+ * if you see a hostname below, just use first part of hostname. example,
+ * if you have host named foo.bar.com, use "foo".
+ */
+
+/*
+ * HG_GATEWAY: hostname of gateway/firewall machine that people outside your
+ * intranet ssh into if they need to ssh to other machines. if you do not
+ * have such machine, set to NULL.
+ */
+#ifndef HG_GATEWAY
+#define HG_GATEWAY "gateway"
+#endif
+
+/*
+ * HG_HOST: hostname of mercurial server. if any machine is allowed, set to
+ * NULL.
+ */
+#ifndef HG_HOST
+#define HG_HOST "mercurial"
+#endif
+
+/*
+ * HG_USER: username to log in from HG_GATEWAY to HG_HOST. if gateway and
+ * host username are same, set to NULL.
+ */
+#ifndef HG_USER
+#define HG_USER "hg"
+#endif
+
+/*
+ * HG_ROOT: root of tree full of mercurial repos. if you do not want to
+ * validate location of repo when someone is try to access, set to NULL.
+ */
+#ifndef HG_ROOT
+#define HG_ROOT "/home/hg/repos"
+#endif
+
+/*
+ * HG: path to the mercurial executable to run.
+ */
+#ifndef HG
+#define HG "/home/hg/bin/hg"
+#endif
+
+/*
+ * HG_SHELL: shell to use for actions like "sudo" and "su" access to
+ * mercurial user, and cron jobs. if you want to make these things
+ * impossible, set to NULL.
+ */
+#ifndef HG_SHELL
+#define HG_SHELL NULL
+/* #define HG_SHELL "/bin/bash" */
+#endif
+
+/*
+ * HG_HELP: some way for users to get support if they have problem. if they
+ * should not get helpful message, set to NULL.
+ */
+#ifndef HG_HELP
+#define HG_HELP "please contact support@example.com for help."
+#endif
+
+/*
+ * SSH: path to ssh executable to run, if forwarding from HG_GATEWAY to
+ * HG_HOST. if you want to use rsh instead (why?), you need to modify
+ * arguments it is called with. see forward_through_gateway.
+ */
+#ifndef SSH
+#define SSH "/usr/bin/ssh"
+#endif
+
+/*
+ * tell whether to print command that is to be executed. useful for
+ * debugging. should not interfere with mercurial operation, since
+ * mercurial only cares about stdin and stdout, and this prints to stderr.
+ */
+static const int debug = 0;
+
+static void print_cmdline(int argc, char **argv)
+{
+ FILE *fp = stderr;
+ int i;
+
+ fputs("command: ", fp);
+
+ for (i = 0; i < argc; i++) {
+ char *spc = strpbrk(argv[i], " \t\r\n");
+ if (spc) {
+ fputc('\'', fp);
+ }
+ fputs(argv[i], fp);
+ if (spc) {
+ fputc('\'', fp);
+ }
+ if (i < argc - 1) {
+ fputc(' ', fp);
+ }
+ }
+ fputc('\n', fp);
+ fflush(fp);
+}
+
+static void usage(const char *reason, int exitcode)
+{
+ char *hg_help = HG_HELP;
+
+ if (reason) {
+ fprintf(stderr, "*** Error: %s.\n", reason);
+ }
+ fprintf(stderr, "*** This program has been invoked incorrectly.\n");
+ if (hg_help) {
+ fprintf(stderr, "*** %s\n", hg_help);
+ }
+ exit(exitcode ? exitcode : EX_USAGE);
+}
+
+/*
+ * run on gateway host to make another ssh connection, to "real" mercurial
+ * server. it sends its command line unmodified to far end.
+ *
+ * never called if HG_GATEWAY is NULL.
+ */
+static void forward_through_gateway(int argc, char **argv)
+{
+ char *ssh = SSH;
+ char *hg_host = HG_HOST;
+ char *hg_user = HG_USER;
+ char **nargv = alloca((10 + argc) * sizeof(char *));
+ int i = 0, j;
+
+ nargv[i++] = ssh;
+ nargv[i++] = "-q";
+ nargv[i++] = "-T";
+ nargv[i++] = "-x";
+ if (hg_user) {
+ nargv[i++] = "-l";
+ nargv[i++] = hg_user;
+ }
+ nargv[i++] = hg_host;
+
+ /*
+ * sshd called us with added "-c", because it thinks we are a shell.
+ * drop it if we find it.
+ */
+ j = 1;
+ if (j < argc && strcmp(argv[j], "-c") == 0) {
+ j++;
+ }
+
+ for (; j < argc; i++, j++) {
+ nargv[i] = argv[j];
+ }
+ nargv[i] = NULL;
+
+ if (debug) {
+ print_cmdline(i, nargv);
+ }
+
+ execv(ssh, nargv);
+ perror(ssh);
+ exit(EX_UNAVAILABLE);
+}
+
+/*
+ * run shell. let administrator "su" to mercurial user's account to do
+ * administrative works.
+ *
+ * never called if HG_SHELL is NULL.
+ */
+static void run_shell(int argc, char **argv)
+{
+ char *hg_shell = HG_SHELL;
+ char **nargv;
+ char *c;
+ int i;
+
+ nargv = alloca((argc + 3) * sizeof(char *));
+ c = strrchr(hg_shell, '/');
+
+ /* tell "real" shell it is login shell, if needed. */
+
+ if (argv[0][0] == '-' && c) {
+ nargv[0] = strdup(c);
+ if (nargv[0] == NULL) {
+ perror("malloc");
+ exit(EX_OSERR);
+ }
+ nargv[0][0] = '-';
+ } else {
+ nargv[0] = hg_shell;
+ }
+
+ for (i = 1; i < argc; i++) {
+ nargv[i] = argv[i];
+ }
+ nargv[i] = NULL;
+
+ if (debug) {
+ print_cmdline(i, nargv);
+ }
+
+ execv(hg_shell, nargv);
+ perror(hg_shell);
+ exit(EX_OSFILE);
+}
+
+enum cmdline {
+ hg_init,
+ hg_serve,
+};
+
+
+/*
+ * attempt to verify that a directory is really a hg repo, by testing
+ * for the existence of a subdirectory.
+ */
+static int validate_repo(const char *repo_root, const char *subdir)
+{
+ char *abs_path;
+ struct stat st;
+ int ret;
+
+ if (asprintf(&abs_path, "%s.hg/%s", repo_root, subdir) == -1) {
+ ret = -1;
+ goto bail;
+ }
+
+ /* verify that we really are looking at valid repo. */
+
+ if (stat(abs_path, &st) == -1) {
+ ret = 0;
+ } else {
+ ret = 1;
+ }
+
+bail:
+ return ret;
+}
+
+/*
+ * paranoid wrapper, runs hg executable in server mode.
+ */
+static void serve_data(int argc, char **argv)
+{
+ char *hg_root = HG_ROOT;
+ char *repo, *repo_root;
+ enum cmdline cmd;
+ char *nargv[6];
+ size_t repolen;
+ int i;
+
+ /*
+ * check argv for looking okay. we should be invoked with argv
+ * resembling like this:
+ *
+ * hgsh
+ * -c
+ * hg -R some/path serve --stdio
+ *
+ * the "-c" is added by sshd, because it thinks we are login shell.
+ */
+
+ if (argc != 3) {
+ goto badargs;
+ }
+
+ if (strcmp(argv[1], "-c") != 0) {
+ goto badargs;
+ }
+
+ if (sscanf(argv[2], "hg init %as", &repo) == 1) {
+ cmd = hg_init;
+ }
+ else if (sscanf(argv[2], "hg -R %as serve --stdio", &repo) == 1) {
+ cmd = hg_serve;
+ } else {
+ goto badargs;
+ }
+
+ repolen = repo ? strlen(repo) : 0;
+
+ if (repolen == 0) {
+ goto badargs;
+ }
+
+ if (hg_root) {
+ if (asprintf(&repo_root, "%s/%s/", hg_root, repo) == -1) {
+ goto badargs;
+ }
+
+ /*
+ * attempt to stop break out from inside the
+ * repository tree. could do something more clever
+ * here, because e.g. we could traverse a symlink that
+ * looks safe, but really breaks us out of tree.
+ */
+
+ if (strstr(repo_root, "/../") != NULL) {
+ goto badargs;
+ }
+
+ /* only hg init expects no repo. */
+
+ if (cmd != hg_init) {
+ int valid;
+
+ valid = validate_repo(repo_root, "data");
+
+ if (valid == -1) {
+ goto badargs;
+ }
+
+ if (valid == 0) {
+ valid = validate_repo(repo_root, "store");
+
+ if (valid == -1) {
+ goto badargs;
+ }
+ }
+
+ if (valid == 0) {
+ perror(repo);
+ exit(EX_DATAERR);
+ }
+ }
+
+ if (chdir(hg_root) == -1) {
+ perror(hg_root);
+ exit(EX_SOFTWARE);
+ }
+ }
+
+ i = 0;
+
+ switch (cmd) {
+ case hg_serve:
+ nargv[i++] = HG;
+ nargv[i++] = "-R";
+ nargv[i++] = repo;
+ nargv[i++] = "serve";
+ nargv[i++] = "--stdio";
+ break;
+ case hg_init:
+ nargv[i++] = HG;
+ nargv[i++] = "init";
+ nargv[i++] = repo;
+ break;
+ }
+
+ nargv[i] = NULL;
+
+ if (debug) {
+ print_cmdline(i, nargv);
+ }
+
+ execv(HG, nargv);
+ perror(HG);
+ exit(EX_UNAVAILABLE);
+
+badargs:
+ /* print useless error message. */
+
+ usage("invalid arguments", EX_DATAERR);
+}
+
+int main(int argc, char **argv)
+{
+ char host[1024];
+ char *c;
+
+ if (gethostname(host, sizeof(host)) == -1) {
+ perror("gethostname");
+ exit(EX_OSERR);
+ }
+
+ if ((c = strchr(host, '.')) != NULL) {
+ *c = '\0';
+ }
+
+ if (getenv("SSH_CLIENT")) {
+ char *hg_gateway = HG_GATEWAY;
+ char *hg_host = HG_HOST;
+
+ if (hg_gateway && strcmp(host, hg_gateway) == 0) {
+ forward_through_gateway(argc, argv);
+ }
+
+ if (hg_host && strcmp(host, hg_host) != 0) {
+ usage("invoked on unexpected host", EX_USAGE);
+ }
+
+ serve_data(argc, argv);
+ } else if (HG_SHELL) {
+ run_shell(argc, argv);
+ } else {
+ usage("invalid arguments", EX_DATAERR);
+ }
+
+ return 0;
+}
diff --git a/contrib/hgweb.fcgi b/contrib/hgweb.fcgi
new file mode 100755
index 0000000..dc62e71
--- /dev/null
+++ b/contrib/hgweb.fcgi
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+#
+# An example FastCGI script for use with flup, edit as necessary
+
+# Path to repo or hgweb config to serve (see 'hg help hgweb')
+config = "/path/to/repo/or/config"
+
+# Uncomment and adjust if Mercurial is not installed system-wide
+# (consult "installed modules" path from 'hg debuginstall'):
+#import sys; sys.path.insert(0, "/path/to/python/lib")
+
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb; cgitb.enable()
+
+from mercurial import demandimport; demandimport.enable()
+from mercurial.hgweb import hgweb
+from flup.server.fcgi import WSGIServer
+application = hgweb(config)
+WSGIServer(application).run()
diff --git a/contrib/hgweb.wsgi b/contrib/hgweb.wsgi
new file mode 100644
index 0000000..c2baf84
--- /dev/null
+++ b/contrib/hgweb.wsgi
@@ -0,0 +1,18 @@
+# An example WSGI for use with mod_wsgi, edit as necessary
+# See http://mercurial.selenic.com/wiki/modwsgi for more information
+
+# Path to repo or hgweb config to serve (see 'hg help hgweb')
+config = "/path/to/repo/or/config"
+
+# Uncomment and adjust if Mercurial is not installed system-wide
+# (consult "installed modules" path from 'hg debuginstall'):
+#import sys; sys.path.insert(0, "/path/to/python/lib")
+
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb; cgitb.enable()
+
+# enable demandloading to reduce startup time
+from mercurial import demandimport; demandimport.enable()
+
+from mercurial.hgweb import hgweb
+application = hgweb(config)
diff --git a/contrib/logo-droplets.svg b/contrib/logo-droplets.svg
new file mode 100644
index 0000000..b104beb
--- /dev/null
+++ b/contrib/logo-droplets.svg
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="Layer_1" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="120" width="100" version="1.0" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 124.766 152.099"><metadata id="metadata6845"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title>Mercurial &quot;droplets&quot; logo</dc:title><dc:creator><cc:Agent><dc:title>Cali Mastny and Matt Mackall</dc:title></cc:Agent></dc:creator><cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"/><dc:date>Feb 12 2008</dc:date></cc:Work><cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/"><cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/><cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/><cc:requires rdf:resource="http://web.resource.org/cc/Notice"/><cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/><cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/><cc:requires rdf:resource="http://web.resource.org/cc/SourceCode"/></cc:License></rdf:RDF></metadata>
+<rect id="rect6847" stroke-linejoin="miter" style="stroke-dasharray:none;" height="150.12" width="124.77" stroke="#000" stroke-miterlimit="4" y="0.98776" x="0.3169" stroke-width="1.9755" fill="#FFF"/><path id="text2611" style="stroke-dasharray:none;" d="M9.848,124.61c1.777-0.79,3.665-1.18,5.479-1.18,1.74,0,2.851,0.43,3.48,1.32,1.332-0.89,3.146-1.32,4.553-1.32,4.221,0,4.369,1.71,4.369,6.73v11.11c0,0.49,0.074,0.49-2.036,0.49v-11.81c0-3.63-0.074-4.74-2.48-4.74-1.073,0-2.184,0.25-3.369,1.03v15.27c-0.037,0.15-0.111,0.18-0.369,0.22-0.038,0-0.074,0.03-0.112,0.03h-1.555v-11.81c0-3.49,0-4.77-2.517-4.77-1.074,0-2.147,0.21-3.406,0.82v15.27c0,0.49,0.074,0.49-2.0361,0.49v-17.15m27.831-1.18c-3.146,0-6.626,0.89-6.626,10.4,0,7.33,2.554,8.47,6.071,8.47,2.701,0,5.034-0.89,5.034-1.32,0-0.53-0.074-1.35-0.259-1.82-1.148,0.79-2.777,1.21-4.59,1.21-2.48,0-4.146-0.71-4.184-6.22,1.629,0,5.776-0.04,8.848-0.65,0.259-1.17,0.37-2.88,0.37-4.37,0-3.56-1.444-5.7-4.664-5.7m-0.185,1.78c2.221,0,2.813,1.46,2.85,4.31,0,0.75-0.037,1.64-0.148,2.49-2.073,0.5-5.591,0.5-7.072,0.5,0.261-6.48,2.481-7.3,4.37-7.3m8.07-0.21c1.739-1.14,3.332-1.57,4.961-1.57,1.814,0,2.666,0.5,2.666,1.11,0,0.35-0.112,0.96-0.297,1.31-0.519-0.28-1.11-0.53-2.074-0.53-1.184,0-2.295,0.32-3.183,1.1v14.85c0,0.49,0.037,0.49-2.073,0.49v-16.76m18.69-0.39c0-0.47-1.554-1.18-3.11-1.18-2.999,0-6.664,1.03-6.664,9.83,0,8.33,2.222,9.07,6.109,9.07,1.924,0,3.665-1.03,3.665-1.6,0-0.32-0.074-0.82-0.26-1.24-0.778,0.56-1.962,1.1-3.22,1.1-2.665,0-4.22-0.75-4.22-7.23,0-7.15,2.554-8.15,4.775-8.15,1.258,0,1.962,0.36,2.665,0.82,0.186-0.43,0.26-1.03,0.26-1.42m14.181,16.55c-1.63,0.82-3.776,1.14-5.627,1.14-4.739,0-5.442-1.99-5.442-6.73v-11.14c0-0.46-0.037-0.46,2.074-0.46v11.82c0,3.56,0.517,4.77,3.294,4.77,1.073,0,2.554-0.22,3.665-0.86v-15.27c0-0.46-0.074-0.46,2.036-0.46v17.19m4.221-16.16c1.739-1.14,3.332-1.57,4.96-1.57,1.814,0,2.666,0.5,2.666,1.11,0,0.35-0.111,0.96-0.296,1.31-0.519-0.28-1.111-0.53-2.074-0.53-1.184,0-2.295,0.32-3.183,1.1v14.85c0,0.49,0.037,0.49-2.073,0.49v-16.76m12.379-1.03c-1.629,0-2.11,0-2.11,0.96v16.83c2.073,0,2.11,0,2.11-0.49v-17.3m-2.184-6.27c0,1.18,0.37,1.6,1.11,1.64,0.851,0,1.259-0.61,1.259-1.67,0.037-1.11-0.26-1.61-1.111-1.61-0.814,0-1.221,0.61-1.258,1.64m5.696,7.3c0-0.39,0.074-0.61,0.222-0.71,0.704-0.39,3.41-0.86,6.48-0.86,2.33,0,3.81,1.11,3.81,4.31v2.31c0,6.34-0.18,11.07-0.18,11.07-0.85,0.47-2.45,1.18-5.04,1.18-2.66,0.03-5.329-0.22-5.329-5.48,0-5.02,2.739-5.81,5.479-5.81,1.04,0,2.26,0.11,3.07,0.43v-3.31c0-2.31-1.18-2.81-2.59-2.81-1.89,0-4.514,0.35-5.662,0.89-0.222-0.39-0.26-1-0.26-1.21m8.512,7.9c-0.7-0.25-1.7-0.35-2.4-0.35-2.11,0-4.04,0.42-4.04,4.34,0,3.66,1.59,3.7,3.48,3.7,1.19,0,2.37-0.32,2.78-0.75,0,0,0.18-4.27,0.18-6.94m7.86,8.37c0,0.49,0.04,0.49-2.04,0.49v-25.2c0-0.96,0.41-0.96,2.04-0.96v25.67" stroke-miterlimit="4" stroke-width="2.02999997" fill="#010101"/><g id="g4503" transform="matrix(0.9351326,0,0,0.9351326,150.39508,-1.251766)"><path id="path2339" fill="#1b1a1b" d="M-45.75,92.692c20.04-33.321-4.232-87.363-48.614-81.873-40.096,4.958-40.746,47.165-5.405,57.191,30.583,8.685,6.318,28.084,7.027,41,0.712,12.92,26.587,17.6,46.992-16.318z"/><circle id="circle2341" transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)" cy="85.364" cx="33.728" r="15.414" fill="#1b1a1b"/><path id="path2343" fill="#1b1a1b" d="M-140.06,48.936c-6.26,0.606-10.84,6.164-10.24,12.422,0.61,6.262,6.17,10.847,12.43,10.241,6.26-0.614,10.84-6.171,10.23-12.43-0.61-6.253-6.16-10.839-12.42-10.233z"/><path id="path2561" fill="#bfbfbf" d="M-44.993,91.34c20.041-33.321-4.231-87.363-48.613-81.873-40.104,4.9568-40.744,47.166-5.406,57.193,30.583,8.684,6.318,28.083,7.027,41,0.713,12.92,26.587,17.6,46.992-16.32z"/><path id="path2563" fill="#000" d="M-86.842,112.76c-1.215-1.97,0.642-4.16,2.551-3.99,3.039,0.26,9.655-0.04,14.876-3,13.043-7.39,33.114-42.966,23.019-65.405-4.519-10.044-6.72-12.92-11.374-17.833-0.95-1.002-0.405-0.948,0.238-0.609,2.517,1.321,6.94,6.437,11.477,14.765,7.664,14.069,7.267,30.795,4.416,41.287-1.986,7.299-8.825,23.815-18.842,30.955-10.039,7.15-21.785,11.26-26.361,3.83z"/><path id="path2565" fill="#000" d="M-95.93,66.591c-6.83-2.028-15.64-4.853-20.74-11.517-3.75-4.914-5.66-10.277-6.15-13.318-0.17-1.085-0.32-1.991-0.01-2.24,0.15-0.117,2.81,5.896,6.79,10.936,3.97,5.04,9.53,7.988,14.16,9.059,4.117,0.952,12.646,3.044,15.532,5.503,2.967,2.527,3.215,7.987,2.216,8.603-1.006,0.62-3.048-4.429-11.798-7.026z"/><path id="path2567" fill="#FFF" d="M-81.841,113.72c-0.132,1.57,1.665,1.87,4.083,1.51,3.099-0.46,5.72-0.81,9.287-2.6,4.835-2.42,9.728-5.89,13.312-10.57,10.692-13.945,14.478-30.45,13.895-32.824-0.195,1.961-2.776,12.253-8.679,21.532-7.582,11.922-13.079,18.262-25.758,21.342-3.529,0.86-5.967-0.45-6.14,1.61z"/><path id="path2569" fill="#FFF" d="M-109.96,59.479c1.44,1.225,4.4,2.857,10.223,4.767,7.031,2.305,10.455,4.304,11.888,5.262,1.52,1.018,2.483,3.288,2.578,1.272,0.099-2.019-1.145-3.755-3.921-4.675-1.878-0.624-5.038-2.109-8.067-2.707-1.946-0.384-5.111-1.146-7.831-1.978-1.48-0.457-3-1.258-4.87-1.941z"/><circle id="circle2577" transform="matrix(1.0917947,-0.2858168,0.2858168,1.0917947,-180.30817,13.494135)" cy="84.375" cx="34.681" r="15.414" fill="#bfbfbf"/><path id="path2579" fill="#000" d="M-128.68,108.38c13.53,12.54,33.894-4.69,24.93-19.897-1.01-1.708-2.32-3.009-1.89-1.7,2.87,8.747,0.22,15.667-4.72,19.227-4.85,3.5-11.51,4.09-16.84,1.32-1.57-0.81-2.22,0.37-1.48,1.05z"/><path id="path2585" fill="#FFF" d="M-118.07,110.95c1.73-0.36,11.75-2.95,14.1-11.194,0.73-2.569,0.86-2.053,0.66-0.661-1.06,7.105-7.78,12.345-13.49,12.545-1.16,0.12-2.68-0.39-1.27-0.69z"/><path id="path2589" fill="#bfbfbf" d="M-139.3,47.584c-6.26,0.605-10.84,6.164-10.24,12.422,0.61,6.261,6.17,10.847,12.43,10.241,6.25-0.614,10.84-6.173,10.23-12.431-0.61-6.254-6.17-10.838-12.42-10.232z"/><path id="path2591" fill="#000" d="M-144.47,67.571c0.07,0.805,1.17,1.838,2.9,2.312,1.49,0.408,5.32,1.45,10.25-1.658,4.92-3.108,5.49-11.421,3.25-13.865-0.69-1.239-1.59-2.14-0.88-0.164,1.81,4.99-1.7,9.659-4.74,11.82-3.03,2.162-6.88,1.139-8.45,0.66s-2.4,0.064-2.33,0.895z"/><path id="path2597" fill="#FFF" d="M-138.11,68.688c0.45-0.406,2.73-0.24,4.79-1.35,2.07-1.109,4.52-3.54,4.95-6.994,0.26-2.029,0.34-1.519,0.44-0.415-0.32,5.743-5.6,8.916-8.62,9.334-0.82,0.113-2.25,0.044-1.56-0.575z"/><path id="path2561_1_" fill="#999" d="M-47.767,69.694c8.532-24.594-9.323-61.736-45.446-57.268-32.637,4.035-33.167,38.389-4.4,46.55,32.582,4.933,12.962,29.512,10.179,41.904-2.495,11.11,26.331,12.94,39.667-31.186z"/><path id="path2571" fill="#f3f3f3" d="M-70.093,88.904c-8.827-1.092-21.529,18.836-9.552,16.506,5.756-0.86,10.525-2.89,14.794-7.762,5.567-6.353,13.883-20.074,16.288-28.94,2.025-7.476,1.007-19.057-1.081-8.175-2.142,11.167-11.623,29.464-20.449,28.371z"/><path id="path2581" fill="#999" d="M-129.39,104.85c2.05,0.03,3.28,0.32,5.35,1.77,4.09,1.7,11.61,0.62,15.09-3.95,3.47-4.57,3.58-10.868,2.26-14.674-3.24-9.314-16.99-9.149-23.13-1.417-6.64,8.636-1.61,18.231,0.43,18.271z"/><path id="path2593_2_" fill="#999" d="M-147.64,61.684c0.41,1.282,1.45,3.154,3.65,3.466,2.94,0.417,3.54,1.743,7,1.055,3.47-0.688,6.09-3.528,7.14-6.67,1.21-4.347-0.59-6.591-3.31-8.595-2.71-2.003-8.67-1.788-12.23,1.458-2.53,2.305-3.24,6.163-2.25,9.286z"/><path id="path256" fill="#f3f3f3" d="M-136.11,64.558c2.66-0.697,6.18-4.325,4.44-7.096-2.16-3.413-8.17-0.491-8.37,3.309-0.21,3.802,1.11,4.526,3.93,3.787z"/><path id="path258" fill="#f3f3f3" d="M-116.12,105.51c2.28-0.6,9.24-3.43,7.93-13.547-0.66-5.126-3.46,6.361-8.63,8.077-7.85,2.61-6.97,7.48,0.7,5.47z"/></g>
+</svg>
diff --git a/contrib/macosx/Readme.html b/contrib/macosx/Readme.html
new file mode 100644
index 0000000..f8302d5
--- /dev/null
+++ b/contrib/macosx/Readme.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!-- This is the second screen displayed during the install. -->
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta http-equiv="Content-Style-Type" content="text/css">
+ <title></title>
+ <style type="text/css">
+ p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
+ p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+ p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
+ p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; color: #000fed}
+ span.s1 {text-decoration: underline}
+ span.s2 {font: 12.0px Courier}
+ </style>
+</head>
+<body>
+<p class="p1"><b>Before you install</b></p>
+<p class="p2"><br></p>
+<p class="p3">This is an OS X 10.6 version of Mercurial that depends on the default Python 2.6 installation.</p>
+<p class="p2"><br></p>
+<p class="p1"><b>After you install</b></p>
+<p class="p2"><br></p>
+<p class="p3">This package installs the <span class="s2">hg</span> executable in <span class="s2">/usr/local/bin</span> and the Mercurial files in <span class="s2">/Library/Python/2.6/site-packages/mercurial.</span></p>
+<p class="p2"><br></p>
+<p class="p1"><b>Documentation</b></p>
+<p class="p2"><br></p>
+<p class="p3">Visit the <a href="http://mercurial.selenic.com/">Mercurial web site and wiki</a></p>
+<p class="p2"><br></p>
+<p class="p3">There's also a free book, <a href="http://hgbook.red-bean.com/">Distributed revision control with Mercurial</a></p>
+<p class="p2"><br></p>
+<p class="p1"><b>Reporting problems</b></p>
+<p class="p2"><br></p>
+<p class="p3">If you run into any problems, please file a bug online:</p>
+<p class="p3"><a href="http://mercurial.selenic.com/bts/">http://mercurial.selenic.com/bts/</a></p>
+</body>
+</html>
diff --git a/contrib/macosx/Welcome.html b/contrib/macosx/Welcome.html
new file mode 100644
index 0000000..61ebabc
--- /dev/null
+++ b/contrib/macosx/Welcome.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!-- This is the second screen displayed during the install. -->
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <meta http-equiv="Content-Style-Type" content="text/css">
+ <title></title>
+ <style type="text/css">
+ p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Helvetica}
+ p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica; min-height: 14.0px}
+ </style>
+</head>
+<body>
+<p class="p1">This is a prepackaged release of <a href="http://mercurial.selenic.com/">Mercurial</a> for Mac OS X.</p>
+<p class="p2"><br></p>
+<br>
+<p>
+Please be sure to read the latest <a href="http://mercurial.selenic.com/wiki/WhatsNew">release notes</a>.</p>
+</body>
+</html>
diff --git a/contrib/macosx/macosx-build.txt b/contrib/macosx/macosx-build.txt
new file mode 100644
index 0000000..f67ca53
--- /dev/null
+++ b/contrib/macosx/macosx-build.txt
@@ -0,0 +1,11 @@
+to build a new macosx binary package:
+
+install macpython from http://www.python.org/download/mac
+
+install py2app from http://pythonmac.org/packages/
+
+make sure /usr/local/bin is in your path
+
+run bdist_mpkg in top-level hg directory
+
+find packaged stuff in dist directory
diff --git a/contrib/memory.py b/contrib/memory.py
new file mode 100644
index 0000000..5ea38a1
--- /dev/null
+++ b/contrib/memory.py
@@ -0,0 +1,36 @@
+# memory.py - track memory usage
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''helper extension to measure memory usage
+
+Reads current and peak memory usage from ``/proc/self/status`` and
+prints it to ``stderr`` on exit.
+'''
+
+import atexit
+
+def memusage(ui):
+ """Report memory usage of the current process."""
+ status = None
+ result = {'peak': 0, 'rss': 0}
+ try:
+ # This will only work on systems with a /proc file system
+ # (like Linux).
+ status = open('/proc/self/status', 'r')
+ for line in status:
+ parts = line.split()
+ key = parts[0][2:-1].lower()
+ if key in result:
+ result[key] = int(parts[1])
+ finally:
+ if status is not None:
+ status.close()
+ ui.write_err(", ".join(["%s: %.1f MiB" % (key, value / 1024.0)
+ for key, value in result.iteritems()]) + "\n")
+
+def extsetup(ui):
+ atexit.register(memusage, ui)
diff --git a/contrib/mercurial.el b/contrib/mercurial.el
new file mode 100644
index 0000000..c3ad538
--- /dev/null
+++ b/contrib/mercurial.el
@@ -0,0 +1,1293 @@
+;;; mercurial.el --- Emacs support for the Mercurial distributed SCM
+
+;; Copyright (C) 2005, 2006 Bryan O'Sullivan
+
+;; Author: Bryan O'Sullivan <bos@serpentine.com>
+
+;; mercurial.el is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License version
+;; 2 or any later version.
+
+;; mercurial.el is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with mercurial.el, GNU Emacs, or XEmacs; see the file COPYING
+;; (`C-h C-l'). If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; mercurial.el builds upon Emacs's VC mode to provide flexible
+;; integration with the Mercurial distributed SCM tool.
+
+;; To get going as quickly as possible, load mercurial.el into Emacs and
+;; type `C-c h h'; this runs hg-help-overview, which prints a helpful
+;; usage overview.
+
+;; Much of the inspiration for mercurial.el comes from Rajesh
+;; Vaidheeswarran's excellent p4.el, which does an admirably thorough
+;; job for the commercial Perforce SCM product. In fact, substantial
+;; chunks of code are adapted from p4.el.
+
+;; This code has been developed under XEmacs 21.5, and may not work as
+;; well under GNU Emacs (albeit tested under 21.4). Patches to
+;; enhance the portability of this code, fix bugs, and add features
+;; are most welcome.
+
+;; As of version 22.3, GNU Emacs's VC mode has direct support for
+;; Mercurial, so this package may not prove as useful there.
+
+;; Please send problem reports and suggestions to bos@serpentine.com.
+
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+(require 'diff-mode)
+(require 'easymenu)
+(require 'executable)
+(require 'vc)
+
+(defmacro hg-feature-cond (&rest clauses)
+ "Test CLAUSES for feature at compile time.
+Each clause is (FEATURE BODY...)."
+ (dolist (x clauses)
+ (let ((feature (car x))
+ (body (cdr x)))
+ (when (or (eq feature t)
+ (featurep feature))
+ (return (cons 'progn body))))))
+
+
+;;; XEmacs has view-less, while GNU Emacs has view. Joy.
+
+(hg-feature-cond
+ (xemacs (require 'view-less))
+ (t (require 'view)))
+
+
+;;; Variables accessible through the custom system.
+
+(defgroup mercurial nil
+ "Mercurial distributed SCM."
+ :group 'tools)
+
+(defcustom hg-binary
+ (or (executable-find "hg")
+ (dolist (path '("~/bin/hg" "/usr/bin/hg" "/usr/local/bin/hg"))
+ (when (file-executable-p path)
+ (return path))))
+ "The path to Mercurial's hg executable."
+ :type '(file :must-match t)
+ :group 'mercurial)
+
+(defcustom hg-mode-hook nil
+ "Hook run when a buffer enters hg-mode."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom hg-commit-mode-hook nil
+ "Hook run when a buffer is created to prepare a commit."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom hg-pre-commit-hook nil
+ "Hook run before a commit is performed.
+If you want to prevent the commit from proceeding, raise an error."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom hg-log-mode-hook nil
+ "Hook run after a buffer is filled with log information."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom hg-global-prefix "\C-ch"
+ "The global prefix for Mercurial keymap bindings."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom hg-commit-allow-empty-message nil
+ "Whether to allow changes to be committed with empty descriptions."
+ :type 'boolean
+ :group 'mercurial)
+
+(defcustom hg-commit-allow-empty-file-list nil
+ "Whether to allow changes to be committed without any modified files."
+ :type 'boolean
+ :group 'mercurial)
+
+(defcustom hg-rev-completion-limit 100
+ "The maximum number of revisions that hg-read-rev will offer to complete.
+This affects memory usage and performance when prompting for revisions
+in a repository with a lot of history."
+ :type 'integer
+ :group 'mercurial)
+
+(defcustom hg-log-limit 50
+ "The maximum number of revisions that hg-log will display."
+ :type 'integer
+ :group 'mercurial)
+
+(defcustom hg-update-modeline t
+ "Whether to update the modeline with the status of a file after every save.
+Set this to nil on platforms with poor process management, such as Windows."
+ :type 'boolean
+ :group 'mercurial)
+
+(defcustom hg-incoming-repository "default"
+ "The repository from which changes are pulled from by default.
+This should be a symbolic repository name, since it is used for all
+repository-related commands."
+ :type 'string
+ :group 'mercurial)
+
+(defcustom hg-outgoing-repository ""
+ "The repository to which changes are pushed to by default.
+This should be a symbolic repository name, since it is used for all
+repository-related commands."
+ :type 'string
+ :group 'mercurial)
+
+
+;;; Other variables.
+
+(defvar hg-mode nil
+ "Is this file managed by Mercurial?")
+(make-variable-buffer-local 'hg-mode)
+(put 'hg-mode 'permanent-local t)
+
+(defvar hg-status nil)
+(make-variable-buffer-local 'hg-status)
+(put 'hg-status 'permanent-local t)
+
+(defvar hg-prev-buffer nil)
+(make-variable-buffer-local 'hg-prev-buffer)
+(put 'hg-prev-buffer 'permanent-local t)
+
+(defvar hg-root nil)
+(make-variable-buffer-local 'hg-root)
+(put 'hg-root 'permanent-local t)
+
+(defvar hg-view-mode nil)
+(make-variable-buffer-local 'hg-view-mode)
+(put 'hg-view-mode 'permanent-local t)
+
+(defvar hg-view-file-name nil)
+(make-variable-buffer-local 'hg-view-file-name)
+(put 'hg-view-file-name 'permanent-local t)
+
+(defvar hg-output-buffer-name "*Hg*"
+ "The name to use for Mercurial output buffers.")
+
+(defvar hg-file-history nil)
+(defvar hg-repo-history nil)
+(defvar hg-rev-history nil)
+(defvar hg-repo-completion-table nil) ; shut up warnings
+
+
+;;; Random constants.
+
+(defconst hg-commit-message-start
+ "--- Enter your commit message. Type `C-c C-c' to commit. ---\n")
+
+(defconst hg-commit-message-end
+ "--- Files in bold will be committed. Click to toggle selection. ---\n")
+
+(defconst hg-state-alist
+ '((?M . modified)
+ (?A . added)
+ (?R . removed)
+ (?! . deleted)
+ (?C . normal)
+ (?I . ignored)
+ (?? . nil)))
+
+;;; hg-mode keymap.
+
+(defvar hg-prefix-map
+ (let ((map (make-sparse-keymap)))
+ (hg-feature-cond (xemacs (set-keymap-name map 'hg-prefix-map))) ; XEmacs
+ (set-keymap-parent map vc-prefix-map)
+ (define-key map "=" 'hg-diff)
+ (define-key map "c" 'hg-undo)
+ (define-key map "g" 'hg-annotate)
+ (define-key map "i" 'hg-add)
+ (define-key map "l" 'hg-log)
+ (define-key map "n" 'hg-commit-start)
+ ;; (define-key map "r" 'hg-update)
+ (define-key map "u" 'hg-revert-buffer)
+ (define-key map "~" 'hg-version-other-window)
+ map)
+ "This keymap overrides some default vc-mode bindings.")
+
+(defvar hg-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "\C-xv" hg-prefix-map)
+ map))
+
+(add-minor-mode 'hg-mode 'hg-mode hg-mode-map)
+
+
+;;; Global keymap.
+
+(defvar hg-global-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "," 'hg-incoming)
+ (define-key map "." 'hg-outgoing)
+ (define-key map "<" 'hg-pull)
+ (define-key map "=" 'hg-diff-repo)
+ (define-key map ">" 'hg-push)
+ (define-key map "?" 'hg-help-overview)
+ (define-key map "A" 'hg-addremove)
+ (define-key map "U" 'hg-revert)
+ (define-key map "a" 'hg-add)
+ (define-key map "c" 'hg-commit-start)
+ (define-key map "f" 'hg-forget)
+ (define-key map "h" 'hg-help-overview)
+ (define-key map "i" 'hg-init)
+ (define-key map "l" 'hg-log-repo)
+ (define-key map "r" 'hg-root)
+ (define-key map "s" 'hg-status)
+ (define-key map "u" 'hg-update)
+ map))
+
+(global-set-key hg-global-prefix hg-global-map)
+
+;;; View mode keymap.
+
+(defvar hg-view-mode-map
+ (let ((map (make-sparse-keymap)))
+ (hg-feature-cond (xemacs (set-keymap-name map 'hg-view-mode-map))) ; XEmacs
+ (define-key map (hg-feature-cond (xemacs [button2])
+ (t [mouse-2]))
+ 'hg-buffer-mouse-clicked)
+ map))
+
+(add-minor-mode 'hg-view-mode "" hg-view-mode-map)
+
+
+;;; Commit mode keymaps.
+
+(defvar hg-commit-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "\C-c\C-c" 'hg-commit-finish)
+ (define-key map "\C-c\C-k" 'hg-commit-kill)
+ (define-key map "\C-xv=" 'hg-diff-repo)
+ map))
+
+(defvar hg-commit-mode-file-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map (hg-feature-cond (xemacs [button2])
+ (t [mouse-2]))
+ 'hg-commit-mouse-clicked)
+ (define-key map " " 'hg-commit-toggle-file)
+ (define-key map "\r" 'hg-commit-toggle-file)
+ map))
+
+
+;;; Convenience functions.
+
+(defsubst hg-binary ()
+ (if hg-binary
+ hg-binary
+ (error "No `hg' executable found!")))
+
+(defsubst hg-replace-in-string (str regexp newtext &optional literal)
+ "Replace all matches in STR for REGEXP with NEWTEXT string.
+Return the new string. Optional LITERAL non-nil means do a literal
+replacement.
+
+This function bridges yet another pointless impedance gap between
+XEmacs and GNU Emacs."
+ (hg-feature-cond
+ (xemacs (replace-in-string str regexp newtext literal))
+ (t (replace-regexp-in-string regexp newtext str nil literal))))
+
+(defsubst hg-strip (str)
+ "Strip leading and trailing blank lines from a string."
+ (hg-replace-in-string (hg-replace-in-string str "[\r\n][ \t\r\n]*\\'" "")
+ "\\`[ \t\r\n]*[\r\n]" ""))
+
+(defsubst hg-chomp (str)
+ "Strip trailing newlines from a string."
+ (hg-replace-in-string str "[\r\n]+\\'" ""))
+
+(defun hg-run-command (command &rest args)
+ "Run the shell command COMMAND, returning (EXIT-CODE . COMMAND-OUTPUT).
+The list ARGS contains a list of arguments to pass to the command."
+ (let* (exit-code
+ (output
+ (with-output-to-string
+ (with-current-buffer
+ standard-output
+ (setq exit-code
+ (apply 'call-process command nil t nil args))))))
+ (cons exit-code output)))
+
+(defun hg-run (command &rest args)
+ "Run the Mercurial command COMMAND, returning (EXIT-CODE . COMMAND-OUTPUT)."
+ (apply 'hg-run-command (hg-binary) command args))
+
+(defun hg-run0 (command &rest args)
+ "Run the Mercurial command COMMAND, returning its output.
+If the command does not exit with a zero status code, raise an error."
+ (let ((res (apply 'hg-run-command (hg-binary) command args)))
+ (if (not (eq (car res) 0))
+ (error "Mercurial command failed %s - exit code %s"
+ (cons command args)
+ (car res))
+ (cdr res))))
+
+(defmacro hg-do-across-repo (path &rest body)
+ (let ((root-name (make-symbol "root-"))
+ (buf-name (make-symbol "buf-")))
+ `(let ((,root-name (hg-root ,path)))
+ (save-excursion
+ (dolist (,buf-name (buffer-list))
+ (set-buffer ,buf-name)
+ (when (and hg-status (equal (hg-root buffer-file-name) ,root-name))
+ ,@body))))))
+
+(put 'hg-do-across-repo 'lisp-indent-function 1)
+
+(defun hg-sync-buffers (path)
+ "Sync buffers visiting PATH with their on-disk copies.
+If PATH is not being visited, but is under the repository root, sync
+all buffers visiting files in the repository."
+ (let ((buf (find-buffer-visiting path)))
+ (if buf
+ (with-current-buffer buf
+ (vc-buffer-sync))
+ (hg-do-across-repo path
+ (vc-buffer-sync)))))
+
+(defun hg-buffer-commands (pnt)
+ "Use the properties of a character to do something sensible."
+ (interactive "d")
+ (let ((rev (get-char-property pnt 'rev))
+ (file (get-char-property pnt 'file)))
+ (cond
+ (file
+ (find-file-other-window file))
+ (rev
+ (hg-diff hg-view-file-name rev rev))
+ ((message "I don't know how to do that yet")))))
+
+(defsubst hg-event-point (event)
+ "Return the character position of the mouse event EVENT."
+ (hg-feature-cond (xemacs (event-point event))
+ (t (posn-point (event-start event)))))
+
+(defsubst hg-event-window (event)
+ "Return the window over which mouse event EVENT occurred."
+ (hg-feature-cond (xemacs (event-window event))
+ (t (posn-window (event-start event)))))
+
+(defun hg-buffer-mouse-clicked (event)
+ "Translate the mouse clicks in a HG log buffer to character events.
+These are then handed off to `hg-buffer-commands'.
+
+Handle frickin' frackin' gratuitous event-related incompatibilities."
+ (interactive "e")
+ (select-window (hg-event-window event))
+ (hg-buffer-commands (hg-event-point event)))
+
+(defsubst hg-abbrev-file-name (file)
+ "Portable wrapper around abbreviate-file-name."
+ (hg-feature-cond (xemacs (abbreviate-file-name file t))
+ (t (abbreviate-file-name file))))
+
+(defun hg-read-file-name (&optional prompt default)
+ "Read a file or directory name, or a pattern, to use with a command."
+ (save-excursion
+ (while hg-prev-buffer
+ (set-buffer hg-prev-buffer))
+ (let ((path (or default
+ (buffer-file-name)
+ (expand-file-name default-directory))))
+ (if (or (not path) current-prefix-arg)
+ (expand-file-name
+ (eval (list* 'read-file-name
+ (format "File, directory or pattern%s: "
+ (or prompt ""))
+ (and path (file-name-directory path))
+ nil nil
+ (and path (file-name-nondirectory path))
+ (hg-feature-cond
+ (xemacs (cons (quote 'hg-file-history) nil))
+ (t nil)))))
+ path))))
+
+(defun hg-read-number (&optional prompt default)
+ "Read a integer value."
+ (save-excursion
+ (if (or (not default) current-prefix-arg)
+ (string-to-number
+ (eval (list* 'read-string
+ (or prompt "")
+ (if default (cons (format "%d" default) nil) nil))))
+ default)))
+
+(defun hg-read-config ()
+ "Return an alist of (key . value) pairs of Mercurial config data.
+Each key is of the form (section . name)."
+ (let (items)
+ (dolist (line (split-string (hg-chomp (hg-run0 "debugconfig")) "\n") items)
+ (string-match "^\\([^=]*\\)=\\(.*\\)" line)
+ (let* ((left (substring line (match-beginning 1) (match-end 1)))
+ (right (substring line (match-beginning 2) (match-end 2)))
+ (key (split-string left "\\."))
+ (value (hg-replace-in-string right "\\\\n" "\n" t)))
+ (setq items (cons (cons (cons (car key) (cadr key)) value) items))))))
+
+(defun hg-config-section (section config)
+ "Return an alist of (name . value) pairs for SECTION of CONFIG."
+ (let (items)
+ (dolist (item config items)
+ (when (equal (caar item) section)
+ (setq items (cons (cons (cdar item) (cdr item)) items))))))
+
+(defun hg-string-starts-with (sub str)
+ "Indicate whether string STR starts with the substring or character SUB."
+ (if (not (stringp sub))
+ (and (> (length str) 0) (equal (elt str 0) sub))
+ (let ((sub-len (length sub)))
+ (and (<= sub-len (length str))
+ (string= sub (substring str 0 sub-len))))))
+
+(defun hg-complete-repo (string predicate all)
+ "Attempt to complete a repository name.
+We complete on either symbolic names from Mercurial's config or real
+directory names from the file system. We do not penalise URLs."
+ (or (if all
+ (all-completions string hg-repo-completion-table predicate)
+ (try-completion string hg-repo-completion-table predicate))
+ (let* ((str (expand-file-name string))
+ (dir (file-name-directory str))
+ (file (file-name-nondirectory str)))
+ (if all
+ (let (completions)
+ (dolist (name (delete "./" (file-name-all-completions file dir))
+ completions)
+ (let ((path (concat dir name)))
+ (when (file-directory-p path)
+ (setq completions (cons name completions))))))
+ (let ((comp (file-name-completion file dir)))
+ (if comp
+ (hg-abbrev-file-name (concat dir comp))))))))
+
+(defun hg-read-repo-name (&optional prompt initial-contents default)
+ "Read the location of a repository."
+ (save-excursion
+ (while hg-prev-buffer
+ (set-buffer hg-prev-buffer))
+ (let (hg-repo-completion-table)
+ (if current-prefix-arg
+ (progn
+ (dolist (path (hg-config-section "paths" (hg-read-config)))
+ (setq hg-repo-completion-table
+ (cons (cons (car path) t) hg-repo-completion-table))
+ (unless (hg-string-starts-with (hg-feature-cond
+ (xemacs directory-sep-char)
+ (t ?/))
+ (cdr path))
+ (setq hg-repo-completion-table
+ (cons (cons (cdr path) t) hg-repo-completion-table))))
+ (completing-read (format "Repository%s: " (or prompt ""))
+ 'hg-complete-repo
+ nil
+ nil
+ initial-contents
+ 'hg-repo-history
+ default))
+ default))))
+
+(defun hg-read-rev (&optional prompt default)
+ "Read a revision or tag, offering completions."
+ (save-excursion
+ (while hg-prev-buffer
+ (set-buffer hg-prev-buffer))
+ (let ((rev (or default "tip")))
+ (if current-prefix-arg
+ (let ((revs (split-string
+ (hg-chomp
+ (hg-run0 "-q" "log" "-l"
+ (format "%d" hg-rev-completion-limit)))
+ "[\n:]")))
+ (dolist (line (split-string (hg-chomp (hg-run0 "tags")) "\n"))
+ (setq revs (cons (car (split-string line "\\s-")) revs)))
+ (completing-read (format "Revision%s (%s): "
+ (or prompt "")
+ (or default "tip"))
+ (mapcar (lambda (x) (cons x x)) revs)
+ nil
+ nil
+ nil
+ 'hg-rev-history
+ (or default "tip")))
+ rev))))
+
+(defun hg-parents-for-mode-line (root)
+ "Format the parents of the working directory for the mode line."
+ (let ((parents (split-string (hg-chomp
+ (hg-run0 "--cwd" root "parents" "--template"
+ "{rev}\n")) "\n")))
+ (mapconcat 'identity parents "+")))
+
+(defun hg-buffers-visiting-repo (&optional path)
+ "Return a list of buffers visiting the repository containing PATH."
+ (let ((root-name (hg-root (or path (buffer-file-name))))
+ bufs)
+ (save-excursion
+ (dolist (buf (buffer-list) bufs)
+ (set-buffer buf)
+ (let ((name (buffer-file-name)))
+ (when (and hg-status name (equal (hg-root name) root-name))
+ (setq bufs (cons buf bufs))))))))
+
+(defun hg-update-mode-lines (path)
+ "Update the mode lines of all buffers visiting the same repository as PATH."
+ (let* ((root (hg-root path))
+ (parents (hg-parents-for-mode-line root)))
+ (save-excursion
+ (dolist (info (hg-path-status
+ root
+ (mapcar
+ (function
+ (lambda (buf)
+ (substring (buffer-file-name buf) (length root))))
+ (hg-buffers-visiting-repo root))))
+ (let* ((name (car info))
+ (status (cdr info))
+ (buf (find-buffer-visiting (concat root name))))
+ (when buf
+ (set-buffer buf)
+ (hg-mode-line-internal status parents)))))))
+
+
+;;; View mode bits.
+
+(defun hg-exit-view-mode (buf)
+ "Exit from hg-view-mode.
+We delete the current window if entering hg-view-mode split the
+current frame."
+ (when (and (eq buf (current-buffer))
+ (> (length (window-list)) 1))
+ (delete-window))
+ (when (buffer-live-p buf)
+ (kill-buffer buf)))
+
+(defun hg-view-mode (prev-buffer &optional file-name)
+ (goto-char (point-min))
+ (set-buffer-modified-p nil)
+ (toggle-read-only t)
+ (hg-feature-cond (xemacs (view-minor-mode prev-buffer 'hg-exit-view-mode))
+ (t (view-mode-enter nil 'hg-exit-view-mode)))
+ (setq hg-view-mode t)
+ (setq truncate-lines t)
+ (when file-name
+ (setq hg-view-file-name
+ (hg-abbrev-file-name file-name))))
+
+(defun hg-file-status (file)
+ "Return status of FILE, or nil if FILE does not exist or is unmanaged."
+ (let* ((s (hg-run "status" file))
+ (exit (car s))
+ (output (cdr s)))
+ (if (= exit 0)
+ (let ((state (and (>= (length output) 2)
+ (= (aref output 1) ? )
+ (assq (aref output 0) hg-state-alist))))
+ (if state
+ (cdr state)
+ 'normal)))))
+
+(defun hg-path-status (root paths)
+ "Return status of PATHS in repo ROOT as an alist.
+Each entry is a pair (FILE-NAME . STATUS)."
+ (let ((s (apply 'hg-run "--cwd" root "status" "-marduc" paths))
+ result)
+ (dolist (entry (split-string (hg-chomp (cdr s)) "\n") (nreverse result))
+ (let (state name)
+ (cond ((= (aref entry 1) ? )
+ (setq state (assq (aref entry 0) hg-state-alist)
+ name (substring entry 2)))
+ ((string-match "\\(.*\\): " entry)
+ (setq name (match-string 1 entry))))
+ (setq result (cons (cons name state) result))))))
+
+(defmacro hg-view-output (args &rest body)
+ "Execute BODY in a clean buffer, then quickly display that buffer.
+If the buffer contains one line, its contents are displayed in the
+minibuffer. Otherwise, the buffer is displayed in view-mode.
+ARGS is of the form (BUFFER-NAME &optional FILE), where BUFFER-NAME is
+the name of the buffer to create, and FILE is the name of the file
+being viewed."
+ (let ((prev-buf (make-symbol "prev-buf-"))
+ (v-b-name (car args))
+ (v-m-rest (cdr args)))
+ `(let ((view-buf-name ,v-b-name)
+ (,prev-buf (current-buffer)))
+ (get-buffer-create view-buf-name)
+ (kill-buffer view-buf-name)
+ (get-buffer-create view-buf-name)
+ (set-buffer view-buf-name)
+ (save-excursion
+ ,@body)
+ (case (count-lines (point-min) (point-max))
+ ((0)
+ (kill-buffer view-buf-name)
+ (message "(No output)"))
+ ((1)
+ (let ((msg (hg-chomp (buffer-substring (point-min) (point-max)))))
+ (kill-buffer view-buf-name)
+ (message "%s" msg)))
+ (t
+ (pop-to-buffer view-buf-name)
+ (setq hg-prev-buffer ,prev-buf)
+ (hg-view-mode ,prev-buf ,@v-m-rest))))))
+
+(put 'hg-view-output 'lisp-indent-function 1)
+
+;;; Context save and restore across revert and other operations.
+
+(defun hg-position-context (pos)
+ "Return information to help find the given position again."
+ (let* ((end (min (point-max) (+ pos 98))))
+ (list pos
+ (buffer-substring (max (point-min) (- pos 2)) end)
+ (- end pos))))
+
+(defun hg-buffer-context ()
+ "Return information to help restore a user's editing context.
+This is useful across reverts and merges, where a context is likely
+to have moved a little, but not really changed."
+ (let ((point-context (hg-position-context (point)))
+ (mark-context (let ((mark (mark-marker)))
+ (and mark
+ ;; make sure active mark
+ (marker-buffer mark)
+ (marker-position mark)
+ (hg-position-context mark)))))
+ (list point-context mark-context)))
+
+(defun hg-find-context (ctx)
+ "Attempt to find a context in the given buffer.
+Always returns a valid, hopefully sane, position."
+ (let ((pos (nth 0 ctx))
+ (str (nth 1 ctx))
+ (fixup (nth 2 ctx)))
+ (save-excursion
+ (goto-char (max (point-min) (- pos 15000)))
+ (if (and (not (equal str ""))
+ (search-forward str nil t))
+ (- (point) fixup)
+ (max pos (point-min))))))
+
+(defun hg-restore-context (ctx)
+ "Attempt to restore the user's editing context."
+ (let ((point-context (nth 0 ctx))
+ (mark-context (nth 1 ctx)))
+ (goto-char (hg-find-context point-context))
+ (when mark-context
+ (set-mark (hg-find-context mark-context)))))
+
+
+;;; Hooks.
+
+(defun hg-mode-line-internal (status parents)
+ (setq hg-status status
+ hg-mode (and status (concat " Hg:"
+ parents
+ (cdr (assq status
+ '((normal . "")
+ (removed . "r")
+ (added . "a")
+ (deleted . "!")
+ (modified . "m"))))))))
+
+(defun hg-mode-line (&optional force)
+ "Update the modeline with the current status of a file.
+An update occurs if optional argument FORCE is non-nil,
+hg-update-modeline is non-nil, or we have not yet checked the state of
+the file."
+ (let ((root (hg-root)))
+ (when (and root (or force hg-update-modeline (not hg-mode)))
+ (let ((status (hg-file-status buffer-file-name))
+ (parents (hg-parents-for-mode-line root)))
+ (hg-mode-line-internal status parents)
+ status))))
+
+(defun hg-mode (&optional toggle)
+ "Minor mode for Mercurial distributed SCM integration.
+
+The Mercurial mode user interface is based on that of VC mode, so if
+you're already familiar with VC, the same keybindings and functions
+will generally work.
+
+Below is a list of many common SCM tasks. In the list, `G/L\'
+indicates whether a key binding is global (G) to a repository or
+local (L) to a file. Many commands take a prefix argument.
+
+SCM Task G/L Key Binding Command Name
+-------- --- ----------- ------------
+Help overview (what you are reading) G C-c h h hg-help-overview
+
+Tell Mercurial to manage a file G C-c h a hg-add
+Commit changes to current file only L C-x v n hg-commit-start
+Undo changes to file since commit L C-x v u hg-revert-buffer
+
+Diff file vs last checkin L C-x v = hg-diff
+
+View file change history L C-x v l hg-log
+View annotated file L C-x v a hg-annotate
+
+Diff repo vs last checkin G C-c h = hg-diff-repo
+View status of files in repo G C-c h s hg-status
+Commit all changes G C-c h c hg-commit-start
+
+Undo all changes since last commit G C-c h U hg-revert
+View repo change history G C-c h l hg-log-repo
+
+See changes that can be pulled G C-c h , hg-incoming
+Pull changes G C-c h < hg-pull
+Update working directory after pull G C-c h u hg-update
+See changes that can be pushed G C-c h . hg-outgoing
+Push changes G C-c h > hg-push"
+ (unless vc-make-backup-files
+ (set (make-local-variable 'backup-inhibited) t))
+ (run-hooks 'hg-mode-hook))
+
+(defun hg-find-file-hook ()
+ (ignore-errors
+ (when (hg-mode-line)
+ (hg-mode))))
+
+(add-hook 'find-file-hooks 'hg-find-file-hook)
+
+(defun hg-after-save-hook ()
+ (ignore-errors
+ (let ((old-status hg-status))
+ (hg-mode-line)
+ (if (and (not old-status) hg-status)
+ (hg-mode)))))
+
+(add-hook 'after-save-hook 'hg-after-save-hook)
+
+
+;;; User interface functions.
+
+(defun hg-help-overview ()
+ "This is an overview of the Mercurial SCM mode for Emacs.
+
+You can find the source code, license (GPLv2+), and credits for this
+code by typing `M-x find-library mercurial RET'."
+ (interactive)
+ (hg-view-output ("Mercurial Help Overview")
+ (insert (documentation 'hg-help-overview))
+ (let ((pos (point)))
+ (insert (documentation 'hg-mode))
+ (goto-char pos)
+ (end-of-line 1)
+ (delete-region pos (point)))
+ (let ((hg-root-dir (hg-root)))
+ (if (not hg-root-dir)
+ (error "error: %s: directory is not part of a Mercurial repository."
+ default-directory)
+ (cd hg-root-dir)))))
+
+(defun hg-fix-paths ()
+ "Fix paths reported by some Mercurial commands."
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward " \\.\\.." nil t)
+ (replace-match " " nil nil))))
+
+(defun hg-add (path)
+ "Add PATH to the Mercurial repository on the next commit.
+With a prefix argument, prompt for the path to add."
+ (interactive (list (hg-read-file-name " to add")))
+ (let ((buf (current-buffer))
+ (update (equal buffer-file-name path)))
+ (hg-view-output (hg-output-buffer-name)
+ (apply 'call-process (hg-binary) nil t nil (list "add" path))
+ (hg-fix-paths)
+ (goto-char (point-min))
+ (cd (hg-root path)))
+ (when update
+ (unless vc-make-backup-files
+ (set (make-local-variable 'backup-inhibited) t))
+ (with-current-buffer buf
+ (hg-mode-line)))))
+
+(defun hg-addremove ()
+ (interactive)
+ (error "not implemented"))
+
+(defun hg-annotate ()
+ (interactive)
+ (error "not implemented"))
+
+(defun hg-commit-toggle-file (pos)
+ "Toggle whether or not the file at POS will be committed."
+ (interactive "d")
+ (save-excursion
+ (goto-char pos)
+ (let (face
+ (inhibit-read-only t)
+ bol)
+ (beginning-of-line)
+ (setq bol (+ (point) 4))
+ (setq face (get-text-property bol 'face))
+ (end-of-line)
+ (if (eq face 'bold)
+ (progn
+ (remove-text-properties bol (point) '(face nil))
+ (message "%s will not be committed"
+ (buffer-substring bol (point))))
+ (add-text-properties bol (point) '(face bold))
+ (message "%s will be committed"
+ (buffer-substring bol (point)))))))
+
+(defun hg-commit-mouse-clicked (event)
+ "Toggle whether or not the file at POS will be committed."
+ (interactive "@e")
+ (hg-commit-toggle-file (hg-event-point event)))
+
+(defun hg-commit-kill ()
+ "Kill the commit currently being prepared."
+ (interactive)
+ (when (or (not (buffer-modified-p)) (y-or-n-p "Really kill this commit? "))
+ (let ((buf hg-prev-buffer))
+ (kill-buffer nil)
+ (switch-to-buffer buf))))
+
+(defun hg-commit-finish ()
+ "Finish preparing a commit, and perform the actual commit.
+The hook hg-pre-commit-hook is run before anything else is done. If
+the commit message is empty and hg-commit-allow-empty-message is nil,
+an error is raised. If the list of files to commit is empty and
+hg-commit-allow-empty-file-list is nil, an error is raised."
+ (interactive)
+ (let ((root hg-root))
+ (save-excursion
+ (run-hooks 'hg-pre-commit-hook)
+ (goto-char (point-min))
+ (search-forward hg-commit-message-start)
+ (let (message files)
+ (let ((start (point)))
+ (goto-char (point-max))
+ (search-backward hg-commit-message-end)
+ (setq message (hg-strip (buffer-substring start (point)))))
+ (when (and (= (length message) 0)
+ (not hg-commit-allow-empty-message))
+ (error "Cannot proceed - commit message is empty"))
+ (forward-line 1)
+ (beginning-of-line)
+ (while (< (point) (point-max))
+ (let ((pos (+ (point) 4)))
+ (end-of-line)
+ (when (eq (get-text-property pos 'face) 'bold)
+ (end-of-line)
+ (setq files (cons (buffer-substring pos (point)) files))))
+ (forward-line 1))
+ (when (and (= (length files) 0)
+ (not hg-commit-allow-empty-file-list))
+ (error "Cannot proceed - no files to commit"))
+ (setq message (concat message "\n"))
+ (apply 'hg-run0 "--cwd" hg-root "commit" "-m" message files))
+ (let ((buf hg-prev-buffer))
+ (kill-buffer nil)
+ (switch-to-buffer buf))
+ (hg-update-mode-lines root))))
+
+(defun hg-commit-mode ()
+ "Mode for describing a commit of changes to a Mercurial repository.
+This involves two actions: describing the changes with a commit
+message, and choosing the files to commit.
+
+To describe the commit, simply type some text in the designated area.
+
+By default, all modified, added and removed files are selected for
+committing. Files that will be committed are displayed in bold face\;
+those that will not are displayed in normal face.
+
+To toggle whether a file will be committed, move the cursor over a
+particular file and hit space or return. Alternatively, middle click
+on the file.
+
+Key bindings
+------------
+\\[hg-commit-finish] proceed with commit
+\\[hg-commit-kill] kill commit
+
+\\[hg-diff-repo] view diff of pending changes"
+ (interactive)
+ (use-local-map hg-commit-mode-map)
+ (set-syntax-table text-mode-syntax-table)
+ (setq local-abbrev-table text-mode-abbrev-table
+ major-mode 'hg-commit-mode
+ mode-name "Hg-Commit")
+ (set-buffer-modified-p nil)
+ (setq buffer-undo-list nil)
+ (run-hooks 'text-mode-hook 'hg-commit-mode-hook))
+
+(defun hg-commit-start ()
+ "Prepare a commit of changes to the repository containing the current file."
+ (interactive)
+ (while hg-prev-buffer
+ (set-buffer hg-prev-buffer))
+ (let ((root (hg-root))
+ (prev-buffer (current-buffer))
+ modified-files)
+ (unless root
+ (error "Cannot commit outside a repository!"))
+ (hg-sync-buffers root)
+ (setq modified-files (hg-chomp (hg-run0 "--cwd" root "status" "-arm")))
+ (when (and (= (length modified-files) 0)
+ (not hg-commit-allow-empty-file-list))
+ (error "No pending changes to commit"))
+ (let* ((buf-name (format "*Mercurial: Commit %s*" root)))
+ (pop-to-buffer (get-buffer-create buf-name))
+ (when (= (point-min) (point-max))
+ (set (make-local-variable 'hg-root) root)
+ (setq hg-prev-buffer prev-buffer)
+ (insert "\n")
+ (let ((bol (point)))
+ (insert hg-commit-message-end)
+ (add-text-properties bol (point) '(face bold-italic)))
+ (let ((file-area (point)))
+ (insert modified-files)
+ (goto-char file-area)
+ (while (< (point) (point-max))
+ (let ((bol (point)))
+ (forward-char 1)
+ (insert " ")
+ (end-of-line)
+ (add-text-properties (+ bol 4) (point)
+ '(face bold mouse-face highlight)))
+ (forward-line 1))
+ (goto-char file-area)
+ (add-text-properties (point) (point-max)
+ `(keymap ,hg-commit-mode-file-map))
+ (goto-char (point-min))
+ (insert hg-commit-message-start)
+ (add-text-properties (point-min) (point) '(face bold-italic))
+ (insert "\n\n")
+ (forward-line -1)
+ (save-excursion
+ (goto-char (point-max))
+ (search-backward hg-commit-message-end)
+ (add-text-properties (match-beginning 0) (point-max)
+ '(read-only t))
+ (goto-char (point-min))
+ (search-forward hg-commit-message-start)
+ (add-text-properties (match-beginning 0) (match-end 0)
+ '(read-only t)))
+ (hg-commit-mode)
+ (cd root))))))
+
+(defun hg-diff (path &optional rev1 rev2)
+ "Show the differences between REV1 and REV2 of PATH.
+When called interactively, the default behaviour is to treat REV1 as
+the \"parent\" revision, REV2 as the current edited version of the file, and
+PATH as the file edited in the current buffer.
+With a prefix argument, prompt for all of these."
+ (interactive (list (hg-read-file-name " to diff")
+ (let ((rev1 (hg-read-rev " to start with" 'parent)))
+ (and (not (eq rev1 'parent)) rev1))
+ (let ((rev2 (hg-read-rev " to end with" 'working-dir)))
+ (and (not (eq rev2 'working-dir)) rev2))))
+ (hg-sync-buffers path)
+ (let ((a-path (hg-abbrev-file-name path))
+ ;; none revision is specified explicitly
+ (none (and (not rev1) (not rev2)))
+ ;; only one revision is specified explicitly
+ (one (or (and (or (equal rev1 rev2) (not rev2)) rev1)
+ (and (not rev1) rev2)))
+ diff)
+ (hg-view-output ((cond
+ (none
+ (format "Mercurial: Diff against parent of %s" a-path))
+ (one
+ (format "Mercurial: Diff of rev %s of %s" one a-path))
+ (t
+ (format "Mercurial: Diff from rev %s to %s of %s"
+ rev1 rev2 a-path))))
+ (cond
+ (none
+ (call-process (hg-binary) nil t nil "diff" path))
+ (one
+ (call-process (hg-binary) nil t nil "diff" "-r" one path))
+ (t
+ (call-process (hg-binary) nil t nil "diff" "-r" rev1 "-r" rev2 path)))
+ (diff-mode)
+ (setq diff (not (= (point-min) (point-max))))
+ (font-lock-fontify-buffer)
+ (cd (hg-root path)))
+ diff))
+
+(defun hg-diff-repo (path &optional rev1 rev2)
+ "Show the differences between REV1 and REV2 of repository containing PATH.
+When called interactively, the default behaviour is to treat REV1 as
+the \"parent\" revision, REV2 as the current edited version of the file, and
+PATH as the `hg-root' of the current buffer.
+With a prefix argument, prompt for all of these."
+ (interactive (list (hg-read-file-name " to diff")
+ (let ((rev1 (hg-read-rev " to start with" 'parent)))
+ (and (not (eq rev1 'parent)) rev1))
+ (let ((rev2 (hg-read-rev " to end with" 'working-dir)))
+ (and (not (eq rev2 'working-dir)) rev2))))
+ (hg-diff (hg-root path) rev1 rev2))
+
+(defun hg-forget (path)
+ "Lose track of PATH, which has been added, but not yet committed.
+This will prevent the file from being incorporated into the Mercurial
+repository on the next commit.
+With a prefix argument, prompt for the path to forget."
+ (interactive (list (hg-read-file-name " to forget")))
+ (let ((buf (current-buffer))
+ (update (equal buffer-file-name path)))
+ (hg-view-output (hg-output-buffer-name)
+ (apply 'call-process (hg-binary) nil t nil (list "forget" path))
+ ;; "hg forget" shows pathes relative NOT TO ROOT BUT TO REPOSITORY
+ (hg-fix-paths)
+ (goto-char (point-min))
+ (cd (hg-root path)))
+ (when update
+ (with-current-buffer buf
+ (when (local-variable-p 'backup-inhibited)
+ (kill-local-variable 'backup-inhibited))
+ (hg-mode-line)))))
+
+(defun hg-incoming (&optional repo)
+ "Display changesets present in REPO that are not present locally."
+ (interactive (list (hg-read-repo-name " where changes would come from")))
+ (hg-view-output ((format "Mercurial: Incoming from %s to %s"
+ (hg-abbrev-file-name (hg-root))
+ (hg-abbrev-file-name
+ (or repo hg-incoming-repository))))
+ (call-process (hg-binary) nil t nil "incoming"
+ (or repo hg-incoming-repository))
+ (hg-log-mode)
+ (cd (hg-root))))
+
+(defun hg-init ()
+ (interactive)
+ (error "not implemented"))
+
+(defun hg-log-mode ()
+ "Mode for viewing a Mercurial change log."
+ (goto-char (point-min))
+ (when (looking-at "^searching for changes.*$")
+ (delete-region (match-beginning 0) (match-end 0)))
+ (run-hooks 'hg-log-mode-hook))
+
+(defun hg-log (path &optional rev1 rev2 log-limit)
+ "Display the revision history of PATH.
+History is displayed between REV1 and REV2.
+Number of displayed changesets is limited to LOG-LIMIT.
+REV1 defaults to the tip, while REV2 defaults to 0.
+LOG-LIMIT defaults to `hg-log-limit'.
+With a prefix argument, prompt for each parameter."
+ (interactive (list (hg-read-file-name " to log")
+ (hg-read-rev " to start with"
+ "tip")
+ (hg-read-rev " to end with"
+ "0")
+ (hg-read-number "Output limited to: "
+ hg-log-limit)))
+ (let ((a-path (hg-abbrev-file-name path))
+ (r1 (or rev1 "tip"))
+ (r2 (or rev2 "0"))
+ (limit (format "%d" (or log-limit hg-log-limit))))
+ (hg-view-output ((if (equal r1 r2)
+ (format "Mercurial: Log of rev %s of %s" rev1 a-path)
+ (format
+ "Mercurial: at most %s log(s) from rev %s to %s of %s"
+ limit r1 r2 a-path)))
+ (eval (list* 'call-process (hg-binary) nil t nil
+ "log"
+ "-r" (format "%s:%s" r1 r2)
+ "-l" limit
+ (if (> (length path) (length (hg-root path)))
+ (cons path nil)
+ nil)))
+ (hg-log-mode)
+ (cd (hg-root path)))))
+
+(defun hg-log-repo (path &optional rev1 rev2 log-limit)
+ "Display the revision history of the repository containing PATH.
+History is displayed between REV1 and REV2.
+Number of displayed changesets is limited to LOG-LIMIT,
+REV1 defaults to the tip, while REV2 defaults to 0.
+LOG-LIMIT defaults to `hg-log-limit'.
+With a prefix argument, prompt for each parameter."
+ (interactive (list (hg-read-file-name " to log")
+ (hg-read-rev " to start with"
+ "tip")
+ (hg-read-rev " to end with"
+ "0")
+ (hg-read-number "Output limited to: "
+ hg-log-limit)))
+ (hg-log (hg-root path) rev1 rev2 log-limit))
+
+(defun hg-outgoing (&optional repo)
+ "Display changesets present locally that are not present in REPO."
+ (interactive (list (hg-read-repo-name " where changes would go to" nil
+ hg-outgoing-repository)))
+ (hg-view-output ((format "Mercurial: Outgoing from %s to %s"
+ (hg-abbrev-file-name (hg-root))
+ (hg-abbrev-file-name
+ (or repo hg-outgoing-repository))))
+ (call-process (hg-binary) nil t nil "outgoing"
+ (or repo hg-outgoing-repository))
+ (hg-log-mode)
+ (cd (hg-root))))
+
+(defun hg-pull (&optional repo)
+ "Pull changes from repository REPO.
+This does not update the working directory."
+ (interactive (list (hg-read-repo-name " to pull from")))
+ (hg-view-output ((format "Mercurial: Pull to %s from %s"
+ (hg-abbrev-file-name (hg-root))
+ (hg-abbrev-file-name
+ (or repo hg-incoming-repository))))
+ (call-process (hg-binary) nil t nil "pull"
+ (or repo hg-incoming-repository))
+ (cd (hg-root))))
+
+(defun hg-push (&optional repo)
+ "Push changes to repository REPO."
+ (interactive (list (hg-read-repo-name " to push to")))
+ (hg-view-output ((format "Mercurial: Push from %s to %s"
+ (hg-abbrev-file-name (hg-root))
+ (hg-abbrev-file-name
+ (or repo hg-outgoing-repository))))
+ (call-process (hg-binary) nil t nil "push"
+ (or repo hg-outgoing-repository))
+ (cd (hg-root))))
+
+(defun hg-revert-buffer-internal ()
+ (let ((ctx (hg-buffer-context)))
+ (message "Reverting %s..." buffer-file-name)
+ (hg-run0 "revert" buffer-file-name)
+ (revert-buffer t t t)
+ (hg-restore-context ctx)
+ (hg-mode-line)
+ (message "Reverting %s...done" buffer-file-name)))
+
+(defun hg-revert-buffer ()
+ "Revert current buffer's file back to the latest committed version.
+If the file has not changed, nothing happens. Otherwise, this
+displays a diff and asks for confirmation before reverting."
+ (interactive)
+ (let ((vc-suppress-confirm nil)
+ (obuf (current-buffer))
+ diff)
+ (vc-buffer-sync)
+ (unwind-protect
+ (setq diff (hg-diff buffer-file-name))
+ (when diff
+ (unless (yes-or-no-p "Discard changes? ")
+ (error "Revert cancelled")))
+ (when diff
+ (let ((buf (current-buffer)))
+ (delete-window (selected-window))
+ (kill-buffer buf))))
+ (set-buffer obuf)
+ (when diff
+ (hg-revert-buffer-internal))))
+
+(defun hg-root (&optional path)
+ "Return the root of the repository that contains the given path.
+If the path is outside a repository, return nil.
+When called interactively, the root is printed. A prefix argument
+prompts for a path to check."
+ (interactive (list (hg-read-file-name)))
+ (if (or path (not hg-root))
+ (let ((root (do ((prev nil dir)
+ (dir (file-name-directory
+ (or
+ path
+ buffer-file-name
+ (expand-file-name default-directory)))
+ (file-name-directory (directory-file-name dir))))
+ ((equal prev dir))
+ (when (file-directory-p (concat dir ".hg"))
+ (return dir)))))
+ (when (interactive-p)
+ (if root
+ (message "The root of this repository is `%s'." root)
+ (message "The path `%s' is not in a Mercurial repository."
+ (hg-abbrev-file-name path))))
+ root)
+ hg-root))
+
+(defun hg-cwd (&optional path)
+ "Return the current directory of PATH within the repository."
+ (do ((stack nil (cons (file-name-nondirectory
+ (directory-file-name dir))
+ stack))
+ (prev nil dir)
+ (dir (file-name-directory (or path buffer-file-name
+ (expand-file-name default-directory)))
+ (file-name-directory (directory-file-name dir))))
+ ((equal prev dir))
+ (when (file-directory-p (concat dir ".hg"))
+ (let ((cwd (mapconcat 'identity stack "/")))
+ (unless (equal cwd "")
+ (return (file-name-as-directory cwd)))))))
+
+(defun hg-status (path)
+ "Print revision control status of a file or directory.
+With prefix argument, prompt for the path to give status for.
+Names are displayed relative to the repository root."
+ (interactive (list (hg-read-file-name " for status" (hg-root))))
+ (let ((root (hg-root)))
+ (hg-view-output ((format "Mercurial: Status of %s in %s"
+ (let ((name (substring (expand-file-name path)
+ (length root))))
+ (if (> (length name) 0)
+ name
+ "*"))
+ (hg-abbrev-file-name root)))
+ (apply 'call-process (hg-binary) nil t nil
+ (list "--cwd" root "status" path))
+ (cd (hg-root path)))))
+
+(defun hg-undo ()
+ (interactive)
+ (error "not implemented"))
+
+(defun hg-update ()
+ (interactive)
+ (error "not implemented"))
+
+(defun hg-version-other-window (rev)
+ "Visit version REV of the current file in another window.
+If the current file is named `F', the version is named `F.~REV~'.
+If `F.~REV~' already exists, use it instead of checking it out again."
+ (interactive "sVersion to visit (default is workfile version): ")
+ (let* ((file buffer-file-name)
+ (version (if (string-equal rev "")
+ "tip"
+ rev))
+ (automatic-backup (vc-version-backup-file-name file version))
+ (manual-backup (vc-version-backup-file-name file version 'manual)))
+ (unless (file-exists-p manual-backup)
+ (if (file-exists-p automatic-backup)
+ (rename-file automatic-backup manual-backup nil)
+ (hg-run0 "-q" "cat" "-r" version "-o" manual-backup file)))
+ (find-file-other-window manual-backup)))
+
+
+(provide 'mercurial)
+
+
+;;; Local Variables:
+;;; prompt-to-byte-compile: nil
+;;; end:
diff --git a/contrib/mercurial.spec b/contrib/mercurial.spec
new file mode 100755
index 0000000..853eac5
--- /dev/null
+++ b/contrib/mercurial.spec
@@ -0,0 +1,87 @@
+Summary: A fast, lightweight Source Control Management system
+Name: mercurial
+Version: snapshot
+Release: 0
+License: GPLv2+
+Group: Development/Tools
+URL: http://mercurial.selenic.com/
+Source0: http://mercurial.selenic.com/release/%{name}-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
+
+# From the README:
+#
+# Note: some distributions fails to include bits of distutils by
+# default, you'll need python-dev to install. You'll also need a C
+# compiler and a 3-way merge tool like merge, tkdiff, or kdiff3.
+#
+# python-devel provides an adequate python-dev. The merge tool is a
+# run-time dependency.
+#
+BuildRequires: python >= 2.4, python-devel, make, gcc, python-docutils >= 0.5, gettext
+Provides: hg = %{version}-%{release}
+Requires: python >= 2.4
+# The hgk extension uses the wish tcl interpreter, but we don't enforce it
+#Requires: tk
+
+%define pythonver %(python -c 'import sys;print ".".join(map(str, sys.version_info[:2]))')
+%define emacs_lispdir %{_datadir}/emacs/site-lisp
+
+%description
+Mercurial is a fast, lightweight source control management system designed
+for efficient handling of very large distributed projects.
+
+%prep
+%setup -q
+
+%build
+make all
+
+%install
+rm -rf $RPM_BUILD_ROOT
+make install DESTDIR=$RPM_BUILD_ROOT PREFIX=%{_prefix} MANDIR=%{_mandir}
+
+install -m 755 contrib/hgk $RPM_BUILD_ROOT%{_bindir}
+install -m 755 contrib/hg-ssh $RPM_BUILD_ROOT%{_bindir}
+
+bash_completion_dir=$RPM_BUILD_ROOT%{_sysconfdir}/bash_completion.d
+mkdir -p $bash_completion_dir
+install -m 644 contrib/bash_completion $bash_completion_dir/mercurial.sh
+
+zsh_completion_dir=$RPM_BUILD_ROOT%{_datadir}/zsh/site-functions
+mkdir -p $zsh_completion_dir
+install -m 644 contrib/zsh_completion $zsh_completion_dir/_mercurial
+
+mkdir -p $RPM_BUILD_ROOT%{emacs_lispdir}
+install -m 644 contrib/mercurial.el $RPM_BUILD_ROOT%{emacs_lispdir}
+install -m 644 contrib/mq.el $RPM_BUILD_ROOT%{emacs_lispdir}
+
+mkdir -p $RPM_BUILD_ROOT/%{_sysconfdir}/mercurial/hgrc.d
+install -m 644 contrib/mergetools.hgrc $RPM_BUILD_ROOT%{_sysconfdir}/mercurial/hgrc.d/mergetools.rc
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root,-)
+%doc CONTRIBUTORS COPYING doc/README doc/hg*.txt doc/hg*.html *.cgi contrib/*.fcgi
+%doc %attr(644,root,root) %{_mandir}/man?/hg*
+%doc %attr(644,root,root) contrib/*.svg contrib/sample.hgrc
+%dir %{_datadir}/zsh/
+%dir %{_datadir}/zsh/site-functions/
+%{_datadir}/zsh/site-functions/_mercurial
+%dir %{_datadir}/emacs/site-lisp/
+%{_datadir}/emacs/site-lisp/mercurial.el
+%{_datadir}/emacs/site-lisp/mq.el
+%{_bindir}/hg
+%{_bindir}/hgk
+%{_bindir}/hg-ssh
+%dir %{_sysconfdir}/bash_completion.d/
+%config(noreplace) %{_sysconfdir}/bash_completion.d/mercurial.sh
+%dir %{_sysconfdir}/mercurial
+%dir %{_sysconfdir}/mercurial/hgrc.d
+%config(noreplace) %{_sysconfdir}/mercurial/hgrc.d/mergetools.rc
+%if "%{?pythonver}" != "2.4"
+%{_libdir}/python%{pythonver}/site-packages/%{name}-*-py%{pythonver}.egg-info
+%endif
+%{_libdir}/python%{pythonver}/site-packages/%{name}
+%{_libdir}/python%{pythonver}/site-packages/hgext
diff --git a/contrib/mergetools.hgrc b/contrib/mergetools.hgrc
new file mode 100644
index 0000000..b2c2e31
--- /dev/null
+++ b/contrib/mergetools.hgrc
@@ -0,0 +1,123 @@
+# Some default global settings for common merge tools
+
+[merge-tools]
+kdiff3.args=--auto --L1 base --L2 local --L3 other $base $local $other -o $output
+kdiff3.regkey=Software\KDiff3
+kdiff3.regkeyalt=Software\Wow6432Node\KDiff3
+kdiff3.regappend=\kdiff3.exe
+kdiff3.fixeol=True
+kdiff3.gui=True
+kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
+
+gvimdiff.args=--nofork -d -g -O $local $other $base
+gvimdiff.regkey=Software\Vim\GVim
+gvimdiff.regkeyalt=Software\Wow6432Node\Vim\GVim
+gvimdiff.regname=path
+gvimdiff.priority=-9
+
+vimdiff.args=$local $other $base
+vimdiff.priority=-10
+
+merge.checkconflicts=True
+merge.priority=-100
+
+gpyfm.gui=True
+
+meld.gui=True
+meld.args=--label='local' $local --label='base' $base --label='other' $other
+meld.diffargs=-a --label='$plabel1' $parent --label='$clabel' $child
+
+tkdiff.args=$local $other -a $base -o $output
+tkdiff.gui=True
+tkdiff.priority=-8
+tkdiff.diffargs=-L '$plabel1' $parent -L '$clabel' $child
+
+xxdiff.args=--show-merged-pane --exit-with-merge-status --title1 local --title2 base --title3 other --merged-filename $output --merge $local $base $other
+xxdiff.gui=True
+xxdiff.priority=-8
+xxdiff.diffargs=--title1 '$plabel1' $parent --title2 '$clabel' $child
+
+diffmerge.regkey=Software\SourceGear\SourceGear DiffMerge\
+diffmerge.regkeyalt=Software\Wow6432Node\SourceGear\SourceGear DiffMerge\
+diffmerge.regname=Location
+diffmerge.priority=-7
+diffmerge.args=-nosplash -merge -title1=local -title2=merged -title3=other $local $base $other -result=$output
+diffmerge.checkchanged=True
+diffmerge.gui=True
+diffmerge.diffargs=--nosplash --title1='$plabel1' --title2='$clabel' $parent $child
+
+p4merge.args=$base $local $other $output
+p4merge.regkey=Software\Perforce\Environment
+p4merge.regkeyalt=Software\Wow6432Node\Perforce\Environment
+p4merge.regname=P4INSTROOT
+p4merge.regappend=\p4merge.exe
+p4merge.gui=True
+p4merge.priority=-8
+p4merge.diffargs=$parent $child
+
+tortoisemerge.args=/base:$base /mine:$local /theirs:$other /merged:$output
+tortoisemerge.regkey=Software\TortoiseSVN
+tortoisemerge.regkeyalt=Software\Wow6432Node\TortoiseSVN
+tortoisemerge.checkchanged=True
+tortoisemerge.gui=True
+tortoisemerge.priority=-8
+tortoisemerge.diffargs=/base:$parent /mine:$child /basename:'$plabel1' /minename:'$clabel'
+
+ecmerge.args=$base $local $other --mode=merge3 --title0=base --title1=local --title2=other --to=$output
+ecmerge.regkey=Software\Elli\xc3\xa9 Computing\Merge
+ecmerge.regkeyalt=Software\Wow6432Node\Elli\xc3\xa9 Computing\Merge
+ecmerge.gui=True
+ecmerge.diffargs=$parent $child --mode=diff2 --title1='$plabel1' --title2='$clabel'
+
+filemerge.executable=/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge
+filemerge.args=-left $other -right $local -ancestor $base -merge $output
+filemerge.gui=True
+
+; Windows version of Beyond Compare
+beyondcompare3.args=$local $other $base $output /ro /lefttitle=local /centertitle=base /righttitle=other /automerge /reviewconflicts /solo
+beyondcompare3.regkey=Software\Scooter Software\Beyond Compare 3
+beyondcompare3.regname=ExePath
+beyondcompare3.gui=True
+beyondcompare3.priority=-2
+beyondcompare3.diffargs=/lro /lefttitle='$plabel1' /righttitle='$clabel' /solo /expandall $parent $child
+
+; Linux version of Beyond Compare
+bcompare.args=$local $other $base -mergeoutput=$output -ro -lefttitle=parent1 -centertitle=base -righttitle=parent2 -outputtitle=merged -automerge -reviewconflicts -solo
+bcompare.premerge=False
+bcompare.gui=True
+bcompare.priority=-1
+bcompare.diffargs=-lro -lefttitle='$plabel1' -righttitle='$clabel' -solo -expandall $parent $child
+
+winmerge.args=/e /x /wl /ub /dl other /dr local $other $local $output
+winmerge.regkey=Software\Thingamahoochie\WinMerge
+winmerge.regkeyalt=Software\Wow6432Node\Thingamahoochie\WinMerge\
+winmerge.regname=Executable
+winmerge.checkchanged=True
+winmerge.gui=True
+winmerge.priority=-10
+winmerge.diffargs=/r /e /x /ub /wl /dl '$plabel1' /dr '$clabel' $parent $child
+
+araxis.regkey=SOFTWARE\Classes\TypeLib\{46799e0a-7bd1-4330-911c-9660bb964ea2}\7.0\HELPDIR
+araxis.regappend=\ConsoleCompare.exe
+araxis.priority=-2
+araxis.args=/3 /a2 /wait /merge /title1:"Other" /title2:"Base" /title3:"Local :"$local $other $base $local $output
+araxis.premerge=False
+araxis.checkconflict=True
+araxis.binary=True
+araxis.gui=True
+araxis.diffargs=/2 /wait /title1:"$plabel1" /title2:"$clabel" $parent $child
+
+diffuse.priority=-3
+diffuse.args=$local $base $other
+diffuse.gui=True
+diffuse.diffargs=$parent $child
+
+UltraCompare.regkey=Software\Microsoft\Windows\CurrentVersion\App Paths\UC.exe
+UltraCompare.regkeyalt=Software\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths\UC.exe
+UltraCompare.args = $base $local $other -title1 base -title3 other
+UltraCompare.priority = -2
+UltraCompare.gui = True
+UltraCompare.binary = True
+UltraCompare.checkconflicts = True
+UltraCompare.checkchanged = True
+UltraCompare.diffargs=$child $parent -title1 $clabel -title2 $plabel1
diff --git a/contrib/mq.el b/contrib/mq.el
new file mode 100644
index 0000000..dbc9165
--- /dev/null
+++ b/contrib/mq.el
@@ -0,0 +1,417 @@
+;;; mq.el --- Emacs support for Mercurial Queues
+
+;; Copyright (C) 2006 Bryan O'Sullivan
+
+;; Author: Bryan O'Sullivan <bos@serpentine.com>
+
+;; mq.el is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License version 2 or any
+;; later version.
+
+;; mq.el is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with mq.el, GNU Emacs, or XEmacs; see the file COPYING (`C-h
+;; C-l'). If not, see <http://www.gnu.org/licenses/>.
+
+(eval-when-compile (require 'cl))
+(require 'mercurial)
+
+
+(defcustom mq-mode-hook nil
+ "Hook run when a buffer enters mq-mode."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom mq-global-prefix "\C-cq"
+ "The global prefix for Mercurial Queues keymap bindings."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom mq-edit-mode-hook nil
+ "Hook run after a buffer is populated to edit a patch description."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom mq-edit-finish-hook nil
+ "Hook run before a patch description is finished up with."
+ :type 'sexp
+ :group 'mercurial)
+
+(defcustom mq-signoff-address nil
+ "Address with which to sign off on a patch."
+ :type 'string
+ :group 'mercurial)
+
+
+;;; Internal variables.
+
+(defvar mq-mode nil
+ "Is this file managed by MQ?")
+(make-variable-buffer-local 'mq-mode)
+(put 'mq-mode 'permanent-local t)
+
+(defvar mq-patch-history nil)
+
+(defvar mq-top-patch '(nil))
+
+(defvar mq-prev-buffer nil)
+(make-variable-buffer-local 'mq-prev-buffer)
+(put 'mq-prev-buffer 'permanent-local t)
+
+(defvar mq-top nil)
+(make-variable-buffer-local 'mq-top)
+(put 'mq-top 'permanent-local t)
+
+;;; Global keymap.
+
+(defvar mq-global-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "." 'mq-push)
+ (define-key map ">" 'mq-push-all)
+ (define-key map "," 'mq-pop)
+ (define-key map "<" 'mq-pop-all)
+ (define-key map "=" 'mq-diff)
+ (define-key map "r" 'mq-refresh)
+ (define-key map "e" 'mq-refresh-edit)
+ (define-key map "i" 'mq-new)
+ (define-key map "n" 'mq-next)
+ (define-key map "o" 'mq-signoff)
+ (define-key map "p" 'mq-previous)
+ (define-key map "s" 'mq-edit-series)
+ (define-key map "t" 'mq-top)
+ map))
+
+(global-set-key mq-global-prefix mq-global-map)
+
+(add-minor-mode 'mq-mode 'mq-mode)
+
+
+;;; Refresh edit mode keymap.
+
+(defvar mq-edit-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "\C-c\C-c" 'mq-edit-finish)
+ (define-key map "\C-c\C-k" 'mq-edit-kill)
+ (define-key map "\C-c\C-s" 'mq-signoff)
+ map))
+
+
+;;; Helper functions.
+
+(defun mq-read-patch-name (&optional source prompt force)
+ "Read a patch name to use with a command.
+May return nil, meaning \"use the default\"."
+ (let ((patches (split-string
+ (hg-chomp (hg-run0 (or source "qseries"))) "\n")))
+ (when force
+ (completing-read (format "Patch%s: " (or prompt ""))
+ (mapcar (lambda (x) (cons x x)) patches)
+ nil
+ nil
+ nil
+ 'mq-patch-history))))
+
+(defun mq-refresh-buffers (root)
+ (save-excursion
+ (dolist (buf (hg-buffers-visiting-repo root))
+ (when (not (verify-visited-file-modtime buf))
+ (set-buffer buf)
+ (let ((ctx (hg-buffer-context)))
+ (message "Refreshing %s..." (buffer-name))
+ (revert-buffer t t t)
+ (hg-restore-context ctx)
+ (message "Refreshing %s...done" (buffer-name))))))
+ (hg-update-mode-lines root)
+ (mq-update-mode-lines root))
+
+(defun mq-last-line ()
+ (goto-char (point-max))
+ (beginning-of-line)
+ (when (looking-at "^$")
+ (forward-line -1))
+ (let ((bol (point)))
+ (end-of-line)
+ (let ((line (buffer-substring bol (point))))
+ (when (> (length line) 0)
+ line))))
+
+(defun mq-push (&optional patch)
+ "Push patches until PATCH is reached.
+If PATCH is nil, push at most one patch."
+ (interactive (list (mq-read-patch-name "qunapplied" " to push"
+ current-prefix-arg)))
+ (let ((root (hg-root))
+ (prev-buf (current-buffer))
+ last-line ok)
+ (unless root
+ (error "Cannot push outside a repository!"))
+ (hg-sync-buffers root)
+ (let ((buf-name (format "MQ: Push %s" (or patch "next patch"))))
+ (kill-buffer (get-buffer-create buf-name))
+ (split-window-vertically)
+ (other-window 1)
+ (switch-to-buffer (get-buffer-create buf-name))
+ (cd root)
+ (message "Pushing...")
+ (setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpush"
+ (if patch (list patch))))
+ last-line (mq-last-line))
+ (let ((lines (count-lines (point-min) (point-max))))
+ (if (or (<= lines 1)
+ (and (equal lines 2) (string-match "Now at:" last-line)))
+ (progn
+ (kill-buffer (current-buffer))
+ (delete-window))
+ (hg-view-mode prev-buf))))
+ (mq-refresh-buffers root)
+ (sit-for 0)
+ (when last-line
+ (if ok
+ (message "Pushing... %s" last-line)
+ (error "Pushing... %s" last-line)))))
+
+(defun mq-push-all ()
+ "Push patches until all are applied."
+ (interactive)
+ (mq-push "-a"))
+
+(defun mq-pop (&optional patch)
+ "Pop patches until PATCH is reached.
+If PATCH is nil, pop at most one patch."
+ (interactive (list (mq-read-patch-name "qapplied" " to pop to"
+ current-prefix-arg)))
+ (let ((root (hg-root))
+ last-line ok)
+ (unless root
+ (error "Cannot pop outside a repository!"))
+ (hg-sync-buffers root)
+ (set-buffer (generate-new-buffer "qpop"))
+ (cd root)
+ (message "Popping...")
+ (setq ok (= 0 (apply 'call-process (hg-binary) nil t t "qpop"
+ (if patch (list patch))))
+ last-line (mq-last-line))
+ (kill-buffer (current-buffer))
+ (mq-refresh-buffers root)
+ (sit-for 0)
+ (when last-line
+ (if ok
+ (message "Popping... %s" last-line)
+ (error "Popping... %s" last-line)))))
+
+(defun mq-pop-all ()
+ "Push patches until none are applied."
+ (interactive)
+ (mq-pop "-a"))
+
+(defun mq-refresh-internal (root &rest args)
+ (hg-sync-buffers root)
+ (let ((patch (mq-patch-info "qtop")))
+ (message "Refreshing %s..." patch)
+ (let ((ret (apply 'hg-run "qrefresh" args)))
+ (if (equal (car ret) 0)
+ (message "Refreshing %s... done." patch)
+ (error "Refreshing %s... %s" patch (hg-chomp (cdr ret)))))))
+
+(defun mq-refresh (&optional git)
+ "Refresh the topmost applied patch.
+With a prefix argument, generate a git-compatible patch."
+ (interactive "P")
+ (let ((root (hg-root)))
+ (unless root
+ (error "Cannot refresh outside of a repository!"))
+ (apply 'mq-refresh-internal root (if git '("--git")))))
+
+(defun mq-patch-info (cmd &optional msg)
+ (let* ((ret (hg-run cmd))
+ (info (hg-chomp (cdr ret))))
+ (if (equal (car ret) 0)
+ (if msg
+ (message "%s patch: %s" msg info)
+ info)
+ (error "%s" info))))
+
+(defun mq-top ()
+ "Print the name of the topmost applied patch."
+ (interactive)
+ (mq-patch-info "qtop" "Top"))
+
+(defun mq-next ()
+ "Print the name of the next patch to be pushed."
+ (interactive)
+ (mq-patch-info "qnext" "Next"))
+
+(defun mq-previous ()
+ "Print the name of the first patch below the topmost applied patch.
+This would become the active patch if popped to."
+ (interactive)
+ (mq-patch-info "qprev" "Previous"))
+
+(defun mq-edit-finish ()
+ "Finish editing the description of this patch, and refresh the patch."
+ (interactive)
+ (unless (equal (mq-patch-info "qtop") mq-top)
+ (error "Topmost patch has changed!"))
+ (hg-sync-buffers hg-root)
+ (run-hooks 'mq-edit-finish-hook)
+ (mq-refresh-internal hg-root "-m" (buffer-substring (point-min) (point-max)))
+ (let ((buf mq-prev-buffer))
+ (kill-buffer nil)
+ (switch-to-buffer buf)))
+
+(defun mq-edit-kill ()
+ "Kill the edit currently being prepared."
+ (interactive)
+ (when (or (not (buffer-modified-p)) (y-or-n-p "Really kill this edit? "))
+ (let ((buf mq-prev-buffer))
+ (kill-buffer nil)
+ (switch-to-buffer buf))))
+
+(defun mq-get-top (root)
+ (let ((entry (assoc root mq-top-patch)))
+ (if entry
+ (cdr entry))))
+
+(defun mq-set-top (root patch)
+ (let ((entry (assoc root mq-top-patch)))
+ (if entry
+ (if patch
+ (setcdr entry patch)
+ (setq mq-top-patch (delq entry mq-top-patch)))
+ (setq mq-top-patch (cons (cons root patch) mq-top-patch)))))
+
+(defun mq-update-mode-lines (root)
+ (let ((cwd default-directory))
+ (cd root)
+ (condition-case nil
+ (mq-set-top root (mq-patch-info "qtop"))
+ (error (mq-set-top root nil)))
+ (cd cwd))
+ (let ((patch (mq-get-top root)))
+ (save-excursion
+ (dolist (buf (hg-buffers-visiting-repo root))
+ (set-buffer buf)
+ (if mq-mode
+ (setq mq-mode (or (and patch (concat " MQ:" patch)) " MQ")))))))
+
+(defun mq-mode (&optional arg)
+ "Minor mode for Mercurial repositories with an MQ patch queue"
+ (interactive "i")
+ (cond ((hg-root)
+ (setq mq-mode (if (null arg) (not mq-mode)
+ arg))
+ (mq-update-mode-lines (hg-root))))
+ (run-hooks 'mq-mode-hook))
+
+(defun mq-edit-mode ()
+ "Mode for editing the description of a patch.
+
+Key bindings
+------------
+\\[mq-edit-finish] use this description
+\\[mq-edit-kill] abandon this description"
+ (interactive)
+ (use-local-map mq-edit-mode-map)
+ (set-syntax-table text-mode-syntax-table)
+ (setq local-abbrev-table text-mode-abbrev-table
+ major-mode 'mq-edit-mode
+ mode-name "MQ-Edit")
+ (set-buffer-modified-p nil)
+ (setq buffer-undo-list nil)
+ (run-hooks 'text-mode-hook 'mq-edit-mode-hook))
+
+(defun mq-refresh-edit ()
+ "Refresh the topmost applied patch, editing the patch description."
+ (interactive)
+ (while mq-prev-buffer
+ (set-buffer mq-prev-buffer))
+ (let ((root (hg-root))
+ (prev-buffer (current-buffer))
+ (patch (mq-patch-info "qtop")))
+ (hg-sync-buffers root)
+ (let ((buf-name (format "*MQ: Edit description of %s*" patch)))
+ (switch-to-buffer (get-buffer-create buf-name))
+ (when (= (point-min) (point-max))
+ (set (make-local-variable 'hg-root) root)
+ (set (make-local-variable 'mq-top) patch)
+ (setq mq-prev-buffer prev-buffer)
+ (insert (hg-run0 "qheader"))
+ (goto-char (point-min)))
+ (mq-edit-mode)
+ (cd root)))
+ (message "Type `C-c C-c' to finish editing and refresh the patch."))
+
+(defun mq-new (name)
+ "Create a new empty patch named NAME.
+The patch is applied on top of the current topmost patch.
+With a prefix argument, forcibly create the patch even if the working
+directory is modified."
+ (interactive (list (mq-read-patch-name "qseries" " to create" t)))
+ (message "Creating patch...")
+ (let ((ret (if current-prefix-arg
+ (hg-run "qnew" "-f" name)
+ (hg-run "qnew" name))))
+ (if (equal (car ret) 0)
+ (progn
+ (hg-update-mode-lines (buffer-file-name))
+ (message "Creating patch... done."))
+ (error "Creating patch... %s" (hg-chomp (cdr ret))))))
+
+(defun mq-edit-series ()
+ "Edit the MQ series file directly."
+ (interactive)
+ (let ((root (hg-root)))
+ (unless root
+ (error "Not in an MQ repository!"))
+ (find-file (concat root ".hg/patches/series"))))
+
+(defun mq-diff (&optional git)
+ "Display a diff of the topmost applied patch.
+With a prefix argument, display a git-compatible diff."
+ (interactive "P")
+ (hg-view-output ((format "MQ: Diff of %s" (mq-patch-info "qtop")))
+ (if git
+ (call-process (hg-binary) nil t nil "qdiff" "--git")
+ (call-process (hg-binary) nil t nil "qdiff"))
+ (diff-mode)
+ (font-lock-fontify-buffer)))
+
+(defun mq-signoff ()
+ "Sign off on the current patch, in the style used by the Linux kernel.
+If the variable mq-signoff-address is non-nil, it will be used, otherwise
+the value of the ui.username item from your hgrc will be used."
+ (interactive)
+ (let ((was-editing (eq major-mode 'mq-edit-mode))
+ signed)
+ (unless was-editing
+ (mq-refresh-edit))
+ (save-excursion
+ (let* ((user (or mq-signoff-address
+ (hg-run0 "debugconfig" "ui.username")))
+ (signoff (concat "Signed-off-by: " user)))
+ (if (search-forward signoff nil t)
+ (message "You have already signed off on this patch.")
+ (goto-char (point-max))
+ (let ((case-fold-search t))
+ (if (re-search-backward "^Signed-off-by: " nil t)
+ (forward-line 1)
+ (insert "\n")))
+ (insert signoff)
+ (message "%s" signoff)
+ (setq signed t))))
+ (unless was-editing
+ (if signed
+ (mq-edit-finish)
+ (mq-edit-kill)))))
+
+
+(provide 'mq)
+
+
+;;; Local Variables:
+;;; prompt-to-byte-compile: nil
+;;; end:
diff --git a/contrib/perf.py b/contrib/perf.py
new file mode 100644
index 0000000..574e899
--- /dev/null
+++ b/contrib/perf.py
@@ -0,0 +1,252 @@
+# perf.py - performance test routines
+'''helper extension to measure performance'''
+
+from mercurial import cmdutil, scmutil, util, match, commands
+import time, os, sys
+
+def timer(func, title=None):
+ results = []
+ begin = time.time()
+ count = 0
+ while True:
+ ostart = os.times()
+ cstart = time.time()
+ r = func()
+ cstop = time.time()
+ ostop = os.times()
+ count += 1
+ a, b = ostart, ostop
+ results.append((cstop - cstart, b[0] - a[0], b[1]-a[1]))
+ if cstop - begin > 3 and count >= 100:
+ break
+ if cstop - begin > 10 and count >= 3:
+ break
+ if title:
+ sys.stderr.write("! %s\n" % title)
+ if r:
+ sys.stderr.write("! result: %s\n" % r)
+ m = min(results)
+ sys.stderr.write("! wall %f comb %f user %f sys %f (best of %d)\n"
+ % (m[0], m[1] + m[2], m[1], m[2], count))
+
+def perfwalk(ui, repo, *pats):
+ try:
+ m = scmutil.match(repo[None], pats, {})
+ timer(lambda: len(list(repo.dirstate.walk(m, [], True, False))))
+ except Exception:
+ try:
+ m = scmutil.match(repo[None], pats, {})
+ timer(lambda: len([b for a, b, c in repo.dirstate.statwalk([], m)]))
+ except Exception:
+ timer(lambda: len(list(cmdutil.walk(repo, pats, {}))))
+
+def perfstatus(ui, repo, *pats):
+ #m = match.always(repo.root, repo.getcwd())
+ #timer(lambda: sum(map(len, repo.dirstate.status(m, [], False, False,
+ # False))))
+ timer(lambda: sum(map(len, repo.status())))
+
+def clearcaches(cl):
+ # behave somewhat consistently across internal API changes
+ if util.safehasattr(cl, 'clearcaches'):
+ cl.clearcaches()
+ elif util.safehasattr(cl, '_nodecache'):
+ from mercurial.node import nullid, nullrev
+ cl._nodecache = {nullid: nullrev}
+ cl._nodepos = None
+
+def perfheads(ui, repo):
+ cl = repo.changelog
+ def d():
+ len(cl.headrevs())
+ clearcaches(cl)
+ timer(d)
+
+def perftags(ui, repo):
+ import mercurial.changelog, mercurial.manifest
+ def t():
+ repo.changelog = mercurial.changelog.changelog(repo.sopener)
+ repo.manifest = mercurial.manifest.manifest(repo.sopener)
+ repo._tags = None
+ return len(repo.tags())
+ timer(t)
+
+def perfancestors(ui, repo):
+ heads = repo.changelog.headrevs()
+ def d():
+ for a in repo.changelog.ancestors(heads):
+ pass
+ timer(d)
+
+def perfdirstate(ui, repo):
+ "a" in repo.dirstate
+ def d():
+ repo.dirstate.invalidate()
+ "a" in repo.dirstate
+ timer(d)
+
+def perfdirstatedirs(ui, repo):
+ "a" in repo.dirstate
+ def d():
+ "a" in repo.dirstate._dirs
+ del repo.dirstate._dirs
+ timer(d)
+
+def perfdirstatewrite(ui, repo):
+ ds = repo.dirstate
+ "a" in ds
+ def d():
+ ds._dirty = True
+ ds.write()
+ timer(d)
+
+def perfmanifest(ui, repo):
+ def d():
+ t = repo.manifest.tip()
+ m = repo.manifest.read(t)
+ repo.manifest.mapcache = None
+ repo.manifest._cache = None
+ timer(d)
+
+def perfchangeset(ui, repo, rev):
+ n = repo[rev].node()
+ def d():
+ c = repo.changelog.read(n)
+ #repo.changelog._cache = None
+ timer(d)
+
+def perfindex(ui, repo):
+ import mercurial.revlog
+ mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
+ n = repo["tip"].node()
+ def d():
+ cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
+ cl.rev(n)
+ timer(d)
+
+def perfstartup(ui, repo):
+ cmd = sys.argv[0]
+ def d():
+ os.system("HGRCPATH= %s version -q > /dev/null" % cmd)
+ timer(d)
+
+def perfparents(ui, repo):
+ nl = [repo.changelog.node(i) for i in xrange(1000)]
+ def d():
+ for n in nl:
+ repo.changelog.parents(n)
+ timer(d)
+
+def perflookup(ui, repo, rev):
+ timer(lambda: len(repo.lookup(rev)))
+
+def perfrevrange(ui, repo, *specs):
+ revrange = scmutil.revrange
+ timer(lambda: len(revrange(repo, specs)))
+
+def perfnodelookup(ui, repo, rev):
+ import mercurial.revlog
+ mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
+ n = repo[rev].node()
+ def d():
+ cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
+ cl.rev(n)
+ timer(d)
+
+def perfnodelookup(ui, repo, rev):
+ import mercurial.revlog
+ mercurial.revlog._prereadsize = 2**24 # disable lazy parser in old hg
+ n = repo[rev].node()
+ cl = mercurial.revlog.revlog(repo.sopener, "00changelog.i")
+ def d():
+ cl.rev(n)
+ clearcaches(cl)
+ timer(d)
+
+def perflog(ui, repo, **opts):
+ ui.pushbuffer()
+ timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
+ copies=opts.get('rename')))
+ ui.popbuffer()
+
+def perftemplating(ui, repo):
+ ui.pushbuffer()
+ timer(lambda: commands.log(ui, repo, rev=[], date='', user='',
+ template='{date|shortdate} [{rev}:{node|short}]'
+ ' {author|person}: {desc|firstline}\n'))
+ ui.popbuffer()
+
+def perfcca(ui, repo):
+ timer(lambda: scmutil.casecollisionauditor(ui, False, repo.dirstate))
+
+def perffncacheload(ui, repo):
+ from mercurial import scmutil, store
+ s = store.store(set(['store','fncache']), repo.path, scmutil.opener)
+ def d():
+ s.fncache._load()
+ timer(d)
+
+def perffncachewrite(ui, repo):
+ from mercurial import scmutil, store
+ s = store.store(set(['store','fncache']), repo.path, scmutil.opener)
+ s.fncache._load()
+ def d():
+ s.fncache._dirty = True
+ s.fncache.write()
+ timer(d)
+
+def perfdiffwd(ui, repo):
+ """Profile diff of working directory changes"""
+ options = {
+ 'w': 'ignore_all_space',
+ 'b': 'ignore_space_change',
+ 'B': 'ignore_blank_lines',
+ }
+
+ for diffopt in ('', 'w', 'b', 'B', 'wB'):
+ opts = dict((options[c], '1') for c in diffopt)
+ def d():
+ ui.pushbuffer()
+ commands.diff(ui, repo, **opts)
+ ui.popbuffer()
+ title = 'diffopts: %s' % (diffopt and ('-' + diffopt) or 'none')
+ timer(d, title)
+
+def perfrevlog(ui, repo, file_, **opts):
+ from mercurial import revlog
+ dist = opts['dist']
+ def d():
+ r = revlog.revlog(lambda fn: open(fn, 'rb'), file_)
+ for x in xrange(0, len(r), dist):
+ r.revision(r.node(x))
+
+ timer(d)
+
+cmdtable = {
+ 'perfcca': (perfcca, []),
+ 'perffncacheload': (perffncacheload, []),
+ 'perffncachewrite': (perffncachewrite, []),
+ 'perflookup': (perflookup, []),
+ 'perfrevrange': (perfrevrange, []),
+ 'perfnodelookup': (perfnodelookup, []),
+ 'perfparents': (perfparents, []),
+ 'perfstartup': (perfstartup, []),
+ 'perfstatus': (perfstatus, []),
+ 'perfwalk': (perfwalk, []),
+ 'perfmanifest': (perfmanifest, []),
+ 'perfchangeset': (perfchangeset, []),
+ 'perfindex': (perfindex, []),
+ 'perfheads': (perfheads, []),
+ 'perftags': (perftags, []),
+ 'perfancestors': (perfancestors, []),
+ 'perfdirstate': (perfdirstate, []),
+ 'perfdirstatedirs': (perfdirstate, []),
+ 'perfdirstatewrite': (perfdirstatewrite, []),
+ 'perflog': (perflog,
+ [('', 'rename', False, 'ask log to follow renames')]),
+ 'perftemplating': (perftemplating, []),
+ 'perfdiffwd': (perfdiffwd, []),
+ 'perfrevlog': (perfrevlog,
+ [('d', 'dist', 100, 'distance between the revisions')],
+ "[INDEXFILE]"),
+}
diff --git a/contrib/plan9/9diff b/contrib/plan9/9diff
new file mode 100755
index 0000000..02af2a9
--- /dev/null
+++ b/contrib/plan9/9diff
@@ -0,0 +1,42 @@
+#!/bin/rc
+# 9diff - Mercurial extdiff wrapper for diff(1)
+
+rfork e
+
+fn getfiles {
+ cd $1 &&
+ for(f in `{du -as | awk '{print $2}'})
+ test -f $f && echo `{cleanname $f}
+}
+
+fn usage {
+ echo >[1=2] usage: 9diff [diff options] parent child root
+ exit usage
+}
+
+opts=()
+while(~ $1 -*){
+ opts=($opts $1)
+ shift
+}
+if(! ~ $#* 3)
+ usage
+
+# extdiff will set the parent and child to a single file if there is
+# only one change. If there are multiple changes, directories will be
+# set. diff(1) does not cope particularly with directories; instead we
+# do the recursion ourselves and diff each file individually.
+if(test -f $1)
+ diff $opts $1 $2
+if not{
+ # extdiff will create a snapshot of the working copy to prevent
+ # conflicts during the diff. We circumvent this behavior by
+ # diffing against the repository root to produce plumbable
+ # output. This is antisocial.
+ for(f in `{sort -u <{getfiles $1} <{getfiles $2}}){
+ file1=$1/$f; test -f $file1 || file1=/dev/null
+ file2=$3/$f; test -f $file2 || file2=/dev/null
+ diff $opts $file1 $file2
+ }
+}
+exit ''
diff --git a/contrib/plan9/README b/contrib/plan9/README
new file mode 100644
index 0000000..6adbf53
--- /dev/null
+++ b/contrib/plan9/README
@@ -0,0 +1,39 @@
+Mercurial for Plan 9 from Bell Labs
+===================================
+
+This directory contains support for Mercurial on Plan 9 from Bell Labs
+platforms. It is assumed that the version of Python running on these
+systems supports the ANSI/POSIX Environment (APE). At the time of this
+writing, the bichued/python port is the most commonly installed version
+of Python on these platforms. If a native port of Python is ever made,
+some minor modification will need to be made to support some of the more
+esoteric requirements of the platform rather than those currently made
+(cf. posix.py).
+
+By default, installations will have the factotum extension enabled; this
+extension permits factotum(4) to act as an authentication agent for
+HTTP repositories. Additionally, an extdiff command named 9diff is
+enabled which generates diff(1) compatible output suitable for use with
+the plumber(4).
+
+Commit messages are plumbed using E if no editor is defined; users must
+update the plumbed file to continue, otherwise the hg process must be
+interrupted.
+
+Some work remains with regard to documentation. Section 5 manual page
+references for hgignore and hgrc need to be re-numbered to section 6 (file
+formats) and a new man page writer should be written to support the
+Plan 9 man macro set. Until these issues can be resolved, manual pages
+are elided from the installation.
+
+Basic install:
+
+ % mk install # do a system-wide install
+ % hg debuginstall # sanity-check setup
+ % hg # see help
+
+A proto(2) file is included in this directory as an example of how a
+binary distribution could be packaged, ostensibly with contrib(1).
+
+See http://mercurial.selenic.com/ for detailed installation
+instructions, platform-specific notes, and Mercurial user information.
diff --git a/contrib/plan9/hgrc.d/9diff.rc b/contrib/plan9/hgrc.d/9diff.rc
new file mode 100644
index 0000000..757e24c
--- /dev/null
+++ b/contrib/plan9/hgrc.d/9diff.rc
@@ -0,0 +1,7 @@
+# The 9diff extdiff command generates diff(1) compatible output
+# suitable for use with the plumber(4).
+[extensions]
+extdiff =
+
+[extdiff]
+9diff = 9diff -cm $parent $child $root
diff --git a/contrib/plan9/hgrc.d/factotum.rc b/contrib/plan9/hgrc.d/factotum.rc
new file mode 100644
index 0000000..0fa2334
--- /dev/null
+++ b/contrib/plan9/hgrc.d/factotum.rc
@@ -0,0 +1,4 @@
+# The factotum extension permits factotum(4) to act as an
+# authentication agent for HTTP repositories.
+[extensions]
+factotum =
diff --git a/contrib/plan9/mkfile b/contrib/plan9/mkfile
new file mode 100644
index 0000000..6d8e8c2
--- /dev/null
+++ b/contrib/plan9/mkfile
@@ -0,0 +1,37 @@
+APE=/sys/src/ape
+<$APE/config
+
+PYTHON=python
+PYTHONBIN=/rc/bin
+SH=ape/psh
+
+PURE=--pure
+ROOT=../..
+
+# This is slightly underhanded; Plan 9 does not support GNU gettext nor
+# does it support dynamically loaded extension modules. We work around
+# this by calling build_py and build_scripts directly; this avoids
+# additional platform hacks in setup.py.
+build:VQ:
+ @{
+ cd $ROOT
+ $SH -c '$PYTHON setup.py $PURE build_py build_scripts'
+ }
+
+clean:VQ:
+ @{
+ cd $ROOT
+ $SH -c '$PYTHON setup.py $PURE clean --all'
+ }
+
+install:VQ: build
+ @{
+ cd $ROOT
+ $SH -c '$PYTHON setup.py $PURE install \
+ --install-scripts $PYTHONBIN \
+ --skip-build \
+ --force'
+ }
+ mkdir -p /lib/mercurial/hgrc.d
+ dircp hgrc.d /lib/mercurial/hgrc.d/
+ cp 9diff /rc/bin/
diff --git a/contrib/plan9/proto b/contrib/plan9/proto
new file mode 100644
index 0000000..4355209
--- /dev/null
+++ b/contrib/plan9/proto
@@ -0,0 +1,24 @@
+lib - sys sys
+ mercurial - sys sys
+ hgrc.d - sys sys
+ 9diff.rc - sys sys
+ factotum.rc - sys sys
+rc - sys sys
+ bin - sys sys
+ 9diff - sys sys
+ hg - sys sys
+sys - sys sys
+ lib - sys sys
+ python - sys sys
+ lib - sys sys
+ python2.5 - sys sys
+ site-packages - sys sys
+ hgext - sys sys
+ + - sys sys
+ mercurial - sys sys
+ + - sys sys
+ mercurial-VERSION-py2.5.egg-info - sys sys
+ src - sys sys
+ cmd - sys sys
+ hg - sys sys
+ + - sys sys
diff --git a/contrib/pylintrc b/contrib/pylintrc
new file mode 100644
index 0000000..5e5c237
--- /dev/null
+++ b/contrib/pylintrc
@@ -0,0 +1,313 @@
+# lint Python modules using external checkers.
+#
+# This is the main checker controlling the other ones and the reports
+# generation. It is itself both a raw checker and an astng checker in order
+# to:
+# * handle message activation / deactivation at the module level
+# * handle some basic but necessary stats'data (number of classes, methods...)
+#
+[MASTER]
+
+# Specify a configuration file.
+#rcfile=
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Profiled execution.
+profile=no
+
+# Add <file or directory> to the black list. It should be a base name, not a
+# path. You may set this option multiple times.
+ignore=CVS
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Set the cache size for astng objects.
+cache-size=500
+
+# List of plugins (as comma separated values of python modules names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+
+[MESSAGES CONTROL]
+
+# Enable only checker(s) with the given id(s). This option conflicts with the
+# disable-checker option
+#enable-checker=
+
+# Enable all checker(s) except those with the given id(s). This option
+# conflicts with the enable-checker option
+#disable-checker=
+
+# Enable all messages in the listed categories (IRCWEF).
+#enable-msg-cat=
+
+# Disable all messages in the listed categories (IRCWEF).
+disable-msg-cat=I
+
+# Enable the message(s) with the given id(s).
+#enable-msg=
+
+# Disable the message(s) with the given id(s).
+# W0704: except: pass
+# C0111: missing docstring
+# W0403: for the time being absolute imports don't play nice with demandimport
+disable-msg=W0704,C0111,W0403
+
+
+[REPORTS]
+
+# Set the output format. Available formats are text, parseable, colorized, msvs
+# (visual studio) and html
+output-format=text
+
+# Include message's id in output
+include-ids=yes
+
+# Put messages in a separate file for each module / package specified on the
+# command line instead of printing them on stdout. Reports (if any) will be
+# written in a file name "pylint_global.[txt|html]".
+files-output=no
+
+# Tells whether to display a full report or only the messages
+reports=yes
+
+# Python expression which should return a note less than 10 (10 is the highest
+# note). You have access to the variables errors warning, statement which
+# respectively contain the number of errors / warnings messages and the total
+# number of statements analyzed. This is used by the global evaluation report
+# (R0004).
+evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
+
+# Add a comment according to your evaluation note. This is used by the global
+# evaluation report (R0004).
+comment=no
+
+# Enable the report(s) with the given id(s).
+#enable-report=
+
+# Disable the report(s) with the given id(s).
+#disable-report=
+
+
+# try to find bugs in the code using type inference
+#
+[TYPECHECK]
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# mixin class is detected if its name ends with "mixin" (case insensitive).
+ignore-mixin-members=yes
+
+# List of classes names for which member attributes should not be checked
+# (useful for classes with attributes dynamically set).
+ignored-classes=SQLObject
+
+# When zope mode is activated, add a predefined set of Zope acquired attributes
+# to generated-members.
+zope=no
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E0201 when accessed.
+generated-members=REQUEST,acl_users,aq_parent
+
+
+# checks for
+# * unused variables / imports
+# * undefined variables
+# * redefinition of variable from builtins or from an outer scope
+# * use of variable before assignment
+#
+[VARIABLES]
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=yes
+
+# A regular expression matching names used for dummy variables (i.e. not used).
+dummy-variables-rgx=dummy
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid to define new builtins when possible.
+additional-builtins=
+
+
+# checks for :
+# * doc strings
+# * modules / classes / functions / methods / arguments / variables name
+# * number of arguments, local variables, branches, returns and statements in
+# functions, methods
+# * required module attributes
+# * dangerous default values as arguments
+# * redefinition of function / method / class
+# * uses of the global statement
+#
+[BASIC]
+
+# Required attributes for module, separated by a comma
+required-attributes=
+
+# Regular expression which should only match functions or classes name which do
+# not require a docstring
+no-docstring-rgx=__.*__
+
+# Regular expression which should only match correct module names
+module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
+
+# Regular expression which should only match correct module level names
+const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$
+
+# Regular expression which should only match correct class names
+class-rgx=[a-zA-Z_][a-zA-Z0-9]+$
+
+# Regular expression which should only match correct function names
+function-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct method names
+method-rgx=[a-z_][a-z0-9_]{2,30}$
+
+# Regular expression which should only match correct instance attribute names
+attr-rgx=[a-z_][a-z0-9_]{1,30}$
+
+# Regular expression which should only match correct argument names
+argument-rgx=[a-z_][a-z0-9_]{0,30}$
+
+# Regular expression which should only match correct variable names
+variable-rgx=[a-z_][a-z0-9_]{0,30}$
+
+# Regular expression which should only match correct list comprehension /
+# generator expression variable names
+inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
+
+# Good variable names which should always be accepted, separated by a comma
+good-names=i,j,k,ex,Run,_,ui,c,fn,f,fd,l
+
+# Bad variable names which should always be refused, separated by a comma
+bad-names=foo,bar,baz,toto,tutu,tata
+
+# List of builtins function names that should not be used, separated by a comma
+#bad-functions=map,filter,apply,input
+bad-functions=map,filter,apply,input
+
+
+# checks for
+# * external modules dependencies
+# * relative / wildcard imports
+# * cyclic imports
+# * uses of deprecated modules
+#
+[IMPORTS]
+
+# Deprecated modules which should not be used, separated by a comma
+deprecated-modules=regsub,TERMIOS,Bastion,rexec
+
+# Create a graph of every (i.e. internal and external) dependencies in the
+# given file (report R0402 must not be disabled)
+import-graph=
+
+# Create a graph of external dependencies in the given file (report R0402 must
+# not be disabled)
+ext-import-graph=
+
+# Create a graph of internal dependencies in the given file (report R0402 must
+# not be disabled)
+int-import-graph=
+
+
+# checks for sign of poor/misdesign:
+# * number of methods, attributes, local variables...
+# * size, complexity of functions, methods
+#
+[DESIGN]
+
+# Maximum number of arguments for function / method
+max-args=5
+
+# Maximum number of locals for function / method body
+max-locals=15
+
+# Maximum number of return / yield for function / method body
+max-returns=6
+
+# Maximum number of branch for function / method body
+max-branchs=12
+
+# Maximum number of statements in function / method body
+max-statements=50
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+
+# checks for :
+# * methods without self as first argument
+# * overridden methods signature
+# * access only to existent members via self
+# * attributes not defined in the __init__ method
+# * supported interfaces implementation
+# * unreachable code
+#
+[CLASSES]
+
+# List of interface methods to ignore, separated by a comma. This is used for
+# instance to not check methods defines in Zope's Interface base class.
+ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,__new__,setUp
+
+
+# checks for :
+# * unauthorized constructions
+# * strict indentation
+# * line length
+# * use of <> instead of !=
+#
+[FORMAT]
+
+# Maximum number of characters on a single line.
+max-line-length=80
+
+# Maximum number of lines in a module
+max-module-lines=1000
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+
+# checks for:
+# * warning notes in the code like FIXME, XXX
+# * PEP 263: source code with non ascii character but no encoding declaration
+#
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,XXX,TODO
+
+
+# checks for similarities and duplicated code. This computation may be
+# memory / CPU intensive, so you should disable it if you experiments some
+# problems.
+#
+[SIMILARITIES]
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+# Ignore comments when computing similarities.
+ignore-comments=yes
+
+# Ignore docstrings when computing similarities.
+ignore-docstrings=yes
diff --git a/contrib/python-hook-examples.py b/contrib/python-hook-examples.py
new file mode 100644
index 0000000..b38df97
--- /dev/null
+++ b/contrib/python-hook-examples.py
@@ -0,0 +1,22 @@
+'''
+Examples of useful python hooks for Mercurial.
+'''
+from mercurial import patch, util
+
+def diffstat(ui, repo, **kwargs):
+ '''Example usage:
+
+ [hooks]
+ commit.diffstat = python:/path/to/this/file.py:diffstat
+ changegroup.diffstat = python:/path/to/this/file.py:diffstat
+ '''
+ if kwargs.get('parent2'):
+ return
+ node = kwargs['node']
+ first = repo[node].p1().node()
+ if 'url' in kwargs:
+ last = repo['tip'].node()
+ else:
+ last = node
+ diff = patch.diff(repo, first, last)
+ ui.write(patch.diffstat(util.iterlines(diff)))
diff --git a/contrib/sample.hgrc b/contrib/sample.hgrc
new file mode 100644
index 0000000..4493727
--- /dev/null
+++ b/contrib/sample.hgrc
@@ -0,0 +1,133 @@
+### --- User interface
+
+[ui]
+
+### show changed files and be a bit more verbose if True
+
+# verbose = True
+
+### username data to appear in comits
+### it usually takes the form: Joe User <joe.user@host.com>
+
+# username = Joe User <j.user@example.com>
+
+### --- Extensions
+
+[extensions]
+
+### each extension has its own 'extension_name=path' line
+### the default python library path is used when path is left blank
+### the hgext dir is used when 'hgext.extension_name=' is written
+
+### acl - Access control lists
+### hg help acl
+
+# hgext.acl =
+
+### bisect - binary search changesets to detect bugs
+### hg help bisect
+
+# hgext.hbisect =
+
+### bugzilla - update bugzilla bugs when changesets mention them
+### hg help bugzilla
+
+# hgext.bugzilla =
+
+### extdiff - Use external diff application instead of builtin one
+
+# hgext.extdiff =
+
+### gpg - GPG checks and signing
+### hg help gpg
+
+# hgext.gpg =
+
+### graphlog - ASCII graph log
+### hg help glog
+
+# hgext.graphlog =
+
+### hgk - GUI repository browser
+### hg help view
+
+# hgext.hgk =
+
+### mq - Mercurial patch queues
+### hg help mq
+
+# hgext.mq =
+
+### notify - Template driven e-mail notifications
+### hg help notify
+
+# hgext.notify =
+
+### patchbomb - send changesets as a series of patch emails
+### hg help email
+
+# hgext.patchbomb =
+
+### churn - create a graph showing who changed the most lines
+### hg help churn
+
+# hgext.churn = /home/user/hg/hg/contrib/churn.py
+
+### eol - automatic management of line endings
+
+# hgext.eol =
+
+### --- hgk additional configuration
+
+[hgk]
+
+### set executable path
+
+# path = /home/user/hg/hg/contrib/hgk
+
+### --- Hook to Mercurial actions - See hgrc man page for avaliable hooks
+
+[hooks]
+
+### Example notify hooks (load hgext.notify extension before use)
+
+# incoming.notify = python:hgext.notify.hook
+# changegroup.notify = python:hgext.notify.hook
+
+### Email configuration for the notify and patchbomb extensions
+
+[email]
+
+### Your email address
+
+# from = user@example.com
+
+### Method to send email - smtp or /usr/sbin/sendmail or other program name
+
+# method = smtp
+
+### smtp server to send email to
+
+[smtp]
+
+# host = mail
+# port = 25
+# tls = false
+# username = user
+# password = blivet
+# local_hostname = myhost
+
+### --- Email notification hook for server
+
+[notify]
+### multiple sources can be specified as a whitespace or comma separated list
+
+# sources = serve push pull bundle
+
+### set this to False when you're ready for mail to start sending
+
+# test = True
+
+### path to config file with names of subscribers
+
+# config = /path/to/subscription/file
diff --git a/contrib/setup3k.py b/contrib/setup3k.py
new file mode 100644
index 0000000..55cf36f
--- /dev/null
+++ b/contrib/setup3k.py
@@ -0,0 +1,373 @@
+#
+# This is an experimental py3k-enabled mercurial setup script.
+#
+# 'python setup.py install', or
+# 'python setup.py --help' for more options
+
+from distutils.command.build_py import build_py_2to3
+from lib2to3.refactor import get_fixers_from_package as getfixers
+
+import sys
+if getattr(sys, 'version_info', (0, 0, 0)) < (2, 4, 0, 'final'):
+ raise SystemExit("Mercurial requires Python 2.4 or later.")
+
+if sys.version_info[0] >= 3:
+ def b(s):
+ '''A helper function to emulate 2.6+ bytes literals using string
+ literals.'''
+ return s.encode('latin1')
+else:
+ def b(s):
+ '''A helper function to emulate 2.6+ bytes literals using string
+ literals.'''
+ return s
+
+# Solaris Python packaging brain damage
+try:
+ import hashlib
+ sha = hashlib.sha1()
+except ImportError:
+ try:
+ import sha
+ except ImportError:
+ raise SystemExit(
+ "Couldn't import standard hashlib (incomplete Python install).")
+
+try:
+ import zlib
+except ImportError:
+ raise SystemExit(
+ "Couldn't import standard zlib (incomplete Python install).")
+
+try:
+ import bz2
+except ImportError:
+ raise SystemExit(
+ "Couldn't import standard bz2 (incomplete Python install).")
+
+import os, subprocess, time
+import shutil
+import tempfile
+from distutils import log
+from distutils.core import setup, Extension
+from distutils.dist import Distribution
+from distutils.command.build import build
+from distutils.command.build_ext import build_ext
+from distutils.command.build_py import build_py
+from distutils.spawn import spawn, find_executable
+from distutils.ccompiler import new_compiler
+from distutils.errors import CCompilerError
+
+scripts = ['hg']
+if os.name == 'nt':
+ scripts.append('contrib/win32/hg.bat')
+
+# simplified version of distutils.ccompiler.CCompiler.has_function
+# that actually removes its temporary files.
+def hasfunction(cc, funcname):
+ tmpdir = tempfile.mkdtemp(prefix='hg-install-')
+ devnull = oldstderr = None
+ try:
+ try:
+ fname = os.path.join(tmpdir, 'funcname.c')
+ f = open(fname, 'w')
+ f.write('int main(void) {\n')
+ f.write(' %s();\n' % funcname)
+ f.write('}\n')
+ f.close()
+ # Redirect stderr to /dev/null to hide any error messages
+ # from the compiler.
+ # This will have to be changed if we ever have to check
+ # for a function on Windows.
+ devnull = open('/dev/null', 'w')
+ oldstderr = os.dup(sys.stderr.fileno())
+ os.dup2(devnull.fileno(), sys.stderr.fileno())
+ objects = cc.compile([fname], output_dir=tmpdir)
+ cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
+ except Exception:
+ return False
+ return True
+ finally:
+ if oldstderr is not None:
+ os.dup2(oldstderr, sys.stderr.fileno())
+ if devnull is not None:
+ devnull.close()
+ shutil.rmtree(tmpdir)
+
+# py2exe needs to be installed to work
+try:
+ import py2exe
+ py2exeloaded = True
+
+ # Help py2exe to find win32com.shell
+ try:
+ import modulefinder
+ import win32com
+ for p in win32com.__path__[1:]: # Take the path to win32comext
+ modulefinder.AddPackagePath("win32com", p)
+ pn = "win32com.shell"
+ __import__(pn)
+ m = sys.modules[pn]
+ for p in m.__path__[1:]:
+ modulefinder.AddPackagePath(pn, p)
+ except ImportError:
+ pass
+
+except ImportError:
+ py2exeloaded = False
+ pass
+
+def runcmd(cmd, env):
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, env=env)
+ out, err = p.communicate()
+ # If root is executing setup.py, but the repository is owned by
+ # another user (as in "sudo python setup.py install") we will get
+ # trust warnings since the .hg/hgrc file is untrusted. That is
+ # fine, we don't want to load it anyway. Python may warn about
+ # a missing __init__.py in mercurial/locale, we also ignore that.
+ err = [e for e in err.splitlines()
+ if not e.startswith(b('Not trusting file')) \
+ and not e.startswith(b('warning: Not importing'))]
+ if err:
+ return ''
+ return out
+
+version = ''
+
+if os.path.isdir('.hg'):
+ # Execute hg out of this directory with a custom environment which
+ # includes the pure Python modules in mercurial/pure. We also take
+ # care to not use any hgrc files and do no localization.
+ pypath = ['mercurial', os.path.join('mercurial', 'pure')]
+ env = {'PYTHONPATH': os.pathsep.join(pypath),
+ 'HGRCPATH': '',
+ 'LANGUAGE': 'C'}
+ if 'LD_LIBRARY_PATH' in os.environ:
+ env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
+ if 'SystemRoot' in os.environ:
+ # Copy SystemRoot into the custom environment for Python 2.6
+ # under Windows. Otherwise, the subprocess will fail with
+ # error 0xc0150004. See: http://bugs.python.org/issue3440
+ env['SystemRoot'] = os.environ['SystemRoot']
+ cmd = [sys.executable, 'hg', 'id', '-i', '-t']
+ l = runcmd(cmd, env).split()
+ while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
+ l.pop()
+ if len(l) > 1: # tag found
+ version = l[-1]
+ if l[0].endswith('+'): # propagate the dirty status to the tag
+ version += '+'
+ elif len(l) == 1: # no tag found
+ cmd = [sys.executable, 'hg', 'parents', '--template',
+ '{latesttag}+{latesttagdistance}-']
+ version = runcmd(cmd, env) + l[0]
+ if version.endswith('+'):
+ version += time.strftime('%Y%m%d')
+elif os.path.exists('.hg_archival.txt'):
+ kw = dict([[t.strip() for t in l.split(':', 1)]
+ for l in open('.hg_archival.txt')])
+ if 'tag' in kw:
+ version = kw['tag']
+ elif 'latesttag' in kw:
+ version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
+ else:
+ version = kw.get('node', '')[:12]
+
+if version:
+ f = open("mercurial/__version__.py", "w")
+ f.write('# this file is autogenerated by setup.py\n')
+ f.write('version = "%s"\n' % version)
+ f.close()
+
+
+try:
+ from mercurial import __version__
+ version = __version__.version
+except ImportError:
+ version = 'unknown'
+
+class hgbuildmo(build):
+
+ description = "build translations (.mo files)"
+
+ def run(self):
+ if not find_executable('msgfmt'):
+ self.warn("could not find msgfmt executable, no translations "
+ "will be built")
+ return
+
+ podir = 'i18n'
+ if not os.path.isdir(podir):
+ self.warn("could not find %s/ directory" % podir)
+ return
+
+ join = os.path.join
+ for po in os.listdir(podir):
+ if not po.endswith('.po'):
+ continue
+ pofile = join(podir, po)
+ modir = join('locale', po[:-3], 'LC_MESSAGES')
+ mofile = join(modir, 'hg.mo')
+ mobuildfile = join('mercurial', mofile)
+ cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
+ if sys.platform != 'sunos5':
+ # msgfmt on Solaris does not know about -c
+ cmd.append('-c')
+ self.mkpath(join('mercurial', modir))
+ self.make_file([pofile], mobuildfile, spawn, (cmd,))
+
+# Insert hgbuildmo first so that files in mercurial/locale/ are found
+# when build_py is run next.
+build.sub_commands.insert(0, ('build_mo', None))
+# We also need build_ext before build_py. Otherwise, when 2to3 is called (in
+# build_py), it will not find osutil & friends, thinking that those modules are
+# global and, consequently, making a mess, now that all module imports are
+# global.
+build.sub_commands.insert(1, ('build_ext', None))
+
+Distribution.pure = 0
+Distribution.global_options.append(('pure', None, "use pure (slow) Python "
+ "code instead of C extensions"))
+
+class hgbuildext(build_ext):
+
+ def build_extension(self, ext):
+ try:
+ build_ext.build_extension(self, ext)
+ except CCompilerError:
+ if getattr(ext, 'optional', False):
+ raise
+ log.warn("Failed to build optional extension '%s' (skipping)",
+ ext.name)
+
+class hgbuildpy(build_py_2to3):
+ fixer_names = sorted(set(getfixers("lib2to3.fixes") +
+ getfixers("hgfixes")))
+
+ def finalize_options(self):
+ build_py.finalize_options(self)
+
+ if self.distribution.pure:
+ if self.py_modules is None:
+ self.py_modules = []
+ for ext in self.distribution.ext_modules:
+ if ext.name.startswith("mercurial."):
+ self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
+ self.distribution.ext_modules = []
+
+ def find_modules(self):
+ modules = build_py.find_modules(self)
+ for module in modules:
+ if module[0] == "mercurial.pure":
+ if module[1] != "__init__":
+ yield ("mercurial", module[1], module[2])
+ else:
+ yield module
+
+ def run(self):
+ # In the build_py_2to3 class, self.updated_files = [], but I couldn't
+ # see when that variable was updated to point to the updated files, as
+ # its names suggests. Thus, I decided to just find_all_modules and feed
+ # them to 2to3. Unfortunately, subsequent calls to setup3k.py will
+ # incur in 2to3 analysis overhead.
+ self.updated_files = [i[2] for i in self.find_all_modules()]
+
+ # Base class code
+ if self.py_modules:
+ self.build_modules()
+ if self.packages:
+ self.build_packages()
+ self.build_package_data()
+
+ # 2to3
+ self.run_2to3(self.updated_files)
+
+ # Remaining base class code
+ self.byte_compile(self.get_outputs(include_bytecode=0))
+
+cmdclass = {'build_mo': hgbuildmo,
+ 'build_ext': hgbuildext,
+ 'build_py': hgbuildpy}
+
+packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
+ 'hgext.highlight', 'hgext.zeroconf']
+
+pymodules = []
+
+extmodules = [
+ Extension('mercurial.base85', ['mercurial/base85.c']),
+ Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
+ Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']),
+ Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
+ Extension('mercurial.parsers', ['mercurial/parsers.c']),
+ ]
+
+# disable osutil.c under windows + python 2.4 (issue1364)
+if sys.platform == 'win32' and sys.version_info < (2, 5, 0, 'final'):
+ pymodules.append('mercurial.pure.osutil')
+else:
+ extmodules.append(Extension('mercurial.osutil', ['mercurial/osutil.c']))
+
+if sys.platform.startswith('linux') and os.uname()[2] > '2.6':
+ # The inotify extension is only usable with Linux 2.6 kernels.
+ # You also need a reasonably recent C library.
+ # In any case, if it fails to build the error will be skipped ('optional').
+ cc = new_compiler()
+ if hasfunction(cc, 'inotify_add_watch'):
+ inotify = Extension('hgext.inotify.linux._inotify',
+ ['hgext/inotify/linux/_inotify.c'],
+ ['mercurial'])
+ inotify.optional = True
+ extmodules.append(inotify)
+ packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
+
+packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
+ 'help/*.txt']}
+
+def ordinarypath(p):
+ return p and p[0] != '.' and p[-1] != '~'
+
+for root in ('templates',):
+ for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
+ curdir = curdir.split(os.sep, 1)[1]
+ dirs[:] = filter(ordinarypath, dirs)
+ for f in filter(ordinarypath, files):
+ f = os.path.join(curdir, f)
+ packagedata['mercurial'].append(f)
+
+datafiles = []
+setupversion = version
+extra = {}
+
+if py2exeloaded:
+ extra['console'] = [
+ {'script':'hg',
+ 'copyright':'Copyright (C) 2005-2010 Matt Mackall and others',
+ 'product_version':version}]
+
+if os.name == 'nt':
+ # Windows binary file versions for exe/dll files must have the
+ # form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535
+ setupversion = version.split('+', 1)[0]
+
+setup(name='mercurial',
+ version=setupversion,
+ author='Matt Mackall',
+ author_email='mpm@selenic.com',
+ url='http://mercurial.selenic.com/',
+ description='Scalable distributed SCM',
+ license='GNU GPLv2+',
+ scripts=scripts,
+ packages=packages,
+ py_modules=pymodules,
+ ext_modules=extmodules,
+ data_files=datafiles,
+ package_data=packagedata,
+ cmdclass=cmdclass,
+ options=dict(py2exe=dict(packages=['hgext', 'email']),
+ bdist_mpkg=dict(zipdist=True,
+ license='COPYING',
+ readme='contrib/macosx/Readme.html',
+ welcome='contrib/macosx/Welcome.html')),
+ **extra)
diff --git a/contrib/shrink-revlog.py b/contrib/shrink-revlog.py
new file mode 100644
index 0000000..6bd006d
--- /dev/null
+++ b/contrib/shrink-revlog.py
@@ -0,0 +1,294 @@
+"""reorder a revlog (the manifest by default) to save space
+
+Specifically, this topologically sorts the revisions in the revlog so that
+revisions on the same branch are adjacent as much as possible. This is a
+workaround for the fact that Mercurial computes deltas relative to the
+previous revision rather than relative to a parent revision.
+
+This is *not* safe to run on a changelog.
+"""
+
+# Originally written by Benoit Boissinot <benoit.boissinot at ens-lyon.org>
+# as a patch to rewrite-log. Cleaned up, refactored, documented, and
+# renamed by Greg Ward <greg at gerg.ca>.
+
+# XXX would be nice to have a way to verify the repository after shrinking,
+# e.g. by comparing "before" and "after" states of random changesets
+# (maybe: export before, shrink, export after, diff).
+
+import os, errno
+from mercurial import revlog, transaction, node, util, scmutil
+from mercurial import changegroup
+from mercurial.i18n import _
+
+
+def postorder(start, edges):
+ result = []
+ visit = list(start)
+ finished = set()
+
+ while visit:
+ cur = visit[-1]
+ for p in edges[cur]:
+ # defend against node.nullrev because it's occasionally
+ # possible for a node to have parents (null, something)
+ # rather than (something, null)
+ if p not in finished and p != node.nullrev:
+ visit.append(p)
+ break
+ else:
+ result.append(cur)
+ finished.add(cur)
+ visit.pop()
+
+ return result
+
+def toposort_reversepostorder(ui, rl):
+ # postorder of the reverse directed graph
+
+ # map rev to list of parent revs (p2 first)
+ parents = {}
+ heads = set()
+ ui.status(_('reading revs\n'))
+ try:
+ for rev in rl:
+ ui.progress(_('reading'), rev, total=len(rl))
+ (p1, p2) = rl.parentrevs(rev)
+ if p1 == p2 == node.nullrev:
+ parents[rev] = () # root node
+ elif p1 == p2 or p2 == node.nullrev:
+ parents[rev] = (p1,) # normal node
+ else:
+ parents[rev] = (p2, p1) # merge node
+ heads.add(rev)
+ for p in parents[rev]:
+ heads.discard(p)
+ finally:
+ ui.progress(_('reading'), None)
+
+ heads = list(heads)
+ heads.sort(reverse=True)
+
+ ui.status(_('sorting revs\n'))
+ return postorder(heads, parents)
+
+def toposort_postorderreverse(ui, rl):
+ # reverse-postorder of the reverse directed graph
+
+ children = {}
+ roots = set()
+ ui.status(_('reading revs\n'))
+ try:
+ for rev in rl:
+ ui.progress(_('reading'), rev, total=len(rl))
+ (p1, p2) = rl.parentrevs(rev)
+ if p1 == p2 == node.nullrev:
+ roots.add(rev)
+ children[rev] = []
+ if p1 != node.nullrev:
+ children[p1].append(rev)
+ if p2 != node.nullrev:
+ children[p2].append(rev)
+ finally:
+ ui.progress(_('reading'), None)
+
+ roots = list(roots)
+ roots.sort()
+
+ ui.status(_('sorting revs\n'))
+ result = postorder(roots, children)
+ result.reverse()
+ return result
+
+def writerevs(ui, r1, r2, order, tr):
+
+ ui.status(_('writing revs\n'))
+
+
+ order = [r1.node(r) for r in order]
+
+ # this is a bit ugly, but it works
+ count = [0]
+ def lookup(revl, x):
+ count[0] += 1
+ ui.progress(_('writing'), count[0], total=len(order))
+ return "%020d" % revl.linkrev(revl.rev(x))
+
+ unlookup = lambda x: int(x, 10)
+
+ try:
+ bundler = changegroup.bundle10(lookup)
+ group = util.chunkbuffer(r1.group(order, bundler))
+ group = changegroup.unbundle10(group, "UN")
+ r2.addgroup(group, unlookup, tr)
+ finally:
+ ui.progress(_('writing'), None)
+
+def report(ui, r1, r2):
+ def getsize(r):
+ s = 0
+ for fn in (r.indexfile, r.datafile):
+ try:
+ s += os.stat(fn).st_size
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return s
+
+ oldsize = float(getsize(r1))
+ newsize = float(getsize(r2))
+
+ # argh: have to pass an int to %d, because a float >= 2^32
+ # blows up under Python 2.5 or earlier
+ ui.write(_('old file size: %12d bytes (%6.1f MiB)\n')
+ % (int(oldsize), oldsize / 1024 / 1024))
+ ui.write(_('new file size: %12d bytes (%6.1f MiB)\n')
+ % (int(newsize), newsize / 1024 / 1024))
+
+ shrink_percent = (oldsize - newsize) / oldsize * 100
+ shrink_factor = oldsize / newsize
+ ui.write(_('shrinkage: %.1f%% (%.1fx)\n')
+ % (shrink_percent, shrink_factor))
+
+def shrink(ui, repo, **opts):
+ """shrink a revlog by reordering revisions
+
+ Rewrites all the entries in some revlog of the current repository
+ (by default, the manifest log) to save space.
+
+ Different sort algorithms have different performance
+ characteristics. Use ``--sort`` to select a sort algorithm so you
+ can determine which works best for your data.
+ """
+
+ if not repo.local():
+ raise util.Abort(_('not a local repository: %s') % repo.root)
+
+ fn = opts.get('revlog')
+ if not fn:
+ indexfn = repo.sjoin('00manifest.i')
+ else:
+ if not fn.endswith('.i'):
+ raise util.Abort(_('--revlog option must specify the revlog index '
+ 'file (*.i), not %s') % opts.get('revlog'))
+
+ indexfn = os.path.realpath(fn)
+ store = repo.sjoin('')
+ if not indexfn.startswith(store):
+ raise util.Abort(_('--revlog option must specify a revlog in %s, '
+ 'not %s') % (store, indexfn))
+
+ sortname = opts['sort']
+ try:
+ toposort = globals()['toposort_' + sortname]
+ except KeyError:
+ raise util.Abort(_('no such toposort algorithm: %s') % sortname)
+
+ if not os.path.exists(indexfn):
+ raise util.Abort(_('no such file: %s') % indexfn)
+ if '00changelog' in indexfn:
+ raise util.Abort(_('shrinking the changelog '
+ 'will corrupt your repository'))
+
+ ui.write(_('shrinking %s\n') % indexfn)
+ tmpindexfn = util.mktempcopy(indexfn, emptyok=True)
+
+ r1 = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), indexfn)
+ r2 = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), tmpindexfn)
+
+ datafn, tmpdatafn = r1.datafile, r2.datafile
+
+ oldindexfn = indexfn + '.old'
+ olddatafn = datafn + '.old'
+ if os.path.exists(oldindexfn) or os.path.exists(olddatafn):
+ raise util.Abort(_('one or both of\n'
+ ' %s\n'
+ ' %s\n'
+ 'exists from a previous run; please clean up '
+ 'before running again') % (oldindexfn, olddatafn))
+
+ # Don't use repo.transaction(), because then things get hairy with
+ # paths: some need to be relative to .hg, and some need to be
+ # absolute. Doing it this way keeps things simple: everything is an
+ # absolute path.
+ lock = repo.lock(wait=False)
+ tr = transaction.transaction(ui.warn,
+ open,
+ repo.sjoin('journal'))
+
+ def ignoremissing(func):
+ def f(*args, **kw):
+ try:
+ return func(*args, **kw)
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return f
+
+ try:
+ try:
+ order = toposort(ui, r1)
+
+ suboptimal = 0
+ for i in xrange(1, len(order)):
+ parents = [p for p in r1.parentrevs(order[i])
+ if p != node.nullrev]
+ if parents and order[i - 1] not in parents:
+ suboptimal += 1
+ ui.note(_('%d suboptimal nodes\n') % suboptimal)
+
+ writerevs(ui, r1, r2, order, tr)
+ report(ui, r1, r2)
+ tr.close()
+ except: # re-raises
+ # Abort transaction first, so we truncate the files before
+ # deleting them.
+ tr.abort()
+ for fn in (tmpindexfn, tmpdatafn):
+ ignoremissing(os.unlink)(fn)
+ raise
+ if not opts.get('dry_run'):
+ # racy, both files cannot be renamed atomically
+ # copy files
+ util.oslink(indexfn, oldindexfn)
+ ignoremissing(util.oslink)(datafn, olddatafn)
+
+ # rename
+ util.rename(tmpindexfn, indexfn)
+ try:
+ os.chmod(tmpdatafn, os.stat(datafn).st_mode)
+ util.rename(tmpdatafn, datafn)
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ ignoremissing(os.unlink)(datafn)
+ else:
+ for fn in (tmpindexfn, tmpdatafn):
+ ignoremissing(os.unlink)(fn)
+ finally:
+ lock.release()
+
+ if not opts.get('dry_run'):
+ ui.write(
+ _('note: old revlog saved in:\n'
+ ' %s\n'
+ ' %s\n'
+ '(You can delete those files when you are satisfied that your\n'
+ 'repository is still sane. '
+ 'Running \'hg verify\' is strongly recommended.)\n')
+ % (oldindexfn, olddatafn))
+
+cmdtable = {
+ 'shrink': (shrink,
+ [('', 'revlog', '',
+ _('the revlog to shrink (.i)')),
+ ('n', 'dry-run', None,
+ _('do not shrink, simulate only')),
+ ('', 'sort', 'reversepostorder',
+ _('name of sort algorithm to use')),
+ ],
+ _('hg shrink [--revlog PATH]'))
+}
+
+if __name__ == "__main__":
+ print "shrink-revlog.py is now an extension (see hg help extensions)"
diff --git a/contrib/simplemerge b/contrib/simplemerge
new file mode 100755
index 0000000..0c54814
--- /dev/null
+++ b/contrib/simplemerge
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+
+from mercurial import demandimport
+demandimport.enable()
+
+import os, sys
+from mercurial.i18n import _
+from mercurial import simplemerge, fancyopts, util, ui
+
+options = [('L', 'label', [], _('labels to use on conflict markers')),
+ ('a', 'text', None, _('treat all files as text')),
+ ('p', 'print', None,
+ _('print results instead of overwriting LOCAL')),
+ ('', 'no-minimal', None,
+ _('do not try to minimize conflict regions')),
+ ('h', 'help', None, _('display help and exit')),
+ ('q', 'quiet', None, _('suppress output'))]
+
+usage = _('''simplemerge [OPTS] LOCAL BASE OTHER
+
+ Simple three-way file merge utility with a minimal feature set.
+
+ Apply to LOCAL the changes necessary to go from BASE to OTHER.
+
+ By default, LOCAL is overwritten with the results of this operation.
+''')
+
+class ParseError(Exception):
+ """Exception raised on errors in parsing the command line."""
+
+def showhelp():
+ sys.stdout.write(usage)
+ sys.stdout.write('\noptions:\n')
+
+ out_opts = []
+ for shortopt, longopt, default, desc in options:
+ out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
+ longopt and ' --%s' % longopt),
+ '%s' % desc))
+ opts_len = max([len(opt[0]) for opt in out_opts])
+ for first, second in out_opts:
+ sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
+
+try:
+ for fp in (sys.stdin, sys.stdout, sys.stderr):
+ util.setbinary(fp)
+
+ opts = {}
+ try:
+ args = fancyopts.fancyopts(sys.argv[1:], options, opts)
+ except fancyopts.getopt.GetoptError, e:
+ raise ParseError(e)
+ if opts['help']:
+ showhelp()
+ sys.exit(0)
+ if len(args) != 3:
+ raise ParseError(_('wrong number of arguments'))
+ sys.exit(simplemerge.simplemerge(ui.ui(), *args, **opts))
+except ParseError, e:
+ sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
+ showhelp()
+ sys.exit(1)
+except util.Abort, e:
+ sys.stderr.write("abort: %s\n" % e)
+ sys.exit(255)
+except KeyboardInterrupt:
+ sys.exit(255)
diff --git a/contrib/tcsh_completion b/contrib/tcsh_completion
new file mode 100644
index 0000000..da96e6e
--- /dev/null
+++ b/contrib/tcsh_completion
@@ -0,0 +1,50 @@
+#
+# tcsh completion for Mercurial
+#
+# This file has been auto-generated by tcsh_completion_build.sh for
+# Mercurial Distributed SCM (version 1.7.5+157-8a220ae0b2ba)
+#
+# Copyright (C) 2005 TK Soh.
+#
+# This is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+
+complete hg \
+ 'n/--cwd/d/' 'n/-R/d/' 'n/--repository/d/' \
+ 'C/-/( -R --repository \
+ --cwd \
+ -y --noninteractive \
+ -q --quiet \
+ -v --verbose \
+ --config \
+ --debug \
+ --debugger \
+ --encoding \
+ --encodingmode \
+ --traceback \
+ --time \
+ --profile \
+ --version \
+ -h --help)/' \
+ 'p/1/(add addremove annotate blame archive \
+ backout bisect bookmarks branch branches \
+ bundle cat clone commit ci \
+ copy cp debugancestor debugbuilddag debugcheckstate \
+ debugcommands debugcomplete debugdag debugdata debugdate \
+ debugfsinfo debugignore debugindex debugindexdot debuginstall \
+ debugpushkey debugrebuildstate debugrename debugrevspec debugsetparents \
+ debugstate debugsub debugwalk diff export \
+ forget grep heads help identify \
+ id import patch incoming in \
+ init locate log history manifest \
+ merge outgoing out parents paths \
+ pull push recover remove rm \
+ rename move mv resolve revert \
+ rollback root serve showconfig debugconfig \
+ status st summary sum tag \
+ tags tip unbundle update up \
+ checkout co verify version)/'
+
diff --git a/contrib/tcsh_completion_build.sh b/contrib/tcsh_completion_build.sh
new file mode 100755
index 0000000..4e29a0e
--- /dev/null
+++ b/contrib/tcsh_completion_build.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+#
+# tcsh_completion_build.sh - script to generate tcsh completion
+#
+#
+# Copyright (C) 2005 TK Soh.
+#
+# This is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+#
+# Description
+# -----------
+# This script generates a tcsh source file to support completion
+# of Mercurial commands and options.
+#
+# Instruction:
+# -----------
+# Run this script to generate the tcsh source file, and source
+# the file to add command completion support for Mercurial.
+#
+# tcsh% tcsh_completion.sh FILE
+# tcsh% source FILE
+#
+# If FILE is not specified, tcsh_completion will be generated.
+#
+# Bugs:
+# ----
+# 1. command specific options are not supported
+# 2. hg commands must be specified immediately after 'hg'.
+#
+
+tcsh_file=${1-tcsh_completion}
+
+hg_commands=`hg --debug help | \
+ sed -e '1,/^list of commands:/d' \
+ -e '/^enabled extensions:/,$d' \
+ -e '/^additional help topics:/,$d' \
+ -e '/^ [^ ]/!d; s/[,:]//g;' | \
+ xargs -n5 | \
+ sed -e '$!s/$/ \\\\/g; 2,$s/^ */ /g'`
+
+hg_global_options=`hg -v help | \
+ sed -e '1,/global/d;/^ *-/!d; s/ [^- ].*//' | \
+ sed -e 's/ *$//; $!s/$/ \\\\/g; 2,$s/^ */ /g'`
+
+hg_version=`hg version | sed -e '1q'`
+
+script_name=`basename $0`
+
+cat > $tcsh_file <<END
+#
+# tcsh completion for Mercurial
+#
+# This file has been auto-generated by $script_name for
+# $hg_version
+#
+# Copyright (C) 2005 TK Soh.
+#
+# This is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+
+complete hg \\
+ 'n/--cwd/d/' 'n/-R/d/' 'n/--repository/d/' \\
+ 'C/-/($hg_global_options)/' \\
+ 'p/1/($hg_commands)/'
+
+END
diff --git a/contrib/tmplrewrite.py b/contrib/tmplrewrite.py
new file mode 100755
index 0000000..eb16003
--- /dev/null
+++ b/contrib/tmplrewrite.py
@@ -0,0 +1,23 @@
+#!/usr/bin/python
+import sys, os, re
+
+IGNORE = ['.css', '.py']
+oldre = re.compile('#([\w\|%]+)#')
+
+def rewrite(fn):
+ f = open(fn)
+ new = open(fn + '.new', 'wb')
+ for ln in f:
+ new.write(oldre.sub('{\\1}', ln))
+ new.close()
+ f.close()
+ os.rename(new.name, f.name)
+
+if __name__ == '__main__':
+ if len(sys.argv) < 2:
+ print 'usage: python tmplrewrite.py [file [file [file]]]'
+ for fn in sys.argv[1:]:
+ if os.path.splitext(fn) in IGNORE:
+ continue
+ print 'rewriting %s...' % fn
+ rewrite(fn)
diff --git a/contrib/undumprevlog b/contrib/undumprevlog
new file mode 100755
index 0000000..3e074d4
--- /dev/null
+++ b/contrib/undumprevlog
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+# Undump a dump from dumprevlog
+# $ hg init
+# $ undumprevlog < repo.dump
+
+import sys
+from mercurial import revlog, node, scmutil, util, transaction
+
+for fp in (sys.stdin, sys.stdout, sys.stderr):
+ util.setbinary(fp)
+
+opener = scmutil.opener('.', False)
+tr = transaction.transaction(sys.stderr.write, opener, "undump.journal")
+while 1:
+ l = sys.stdin.readline()
+ if not l:
+ break
+ if l.startswith("file:"):
+ f = l[6:-1]
+ r = revlog.revlog(opener, f)
+ print f
+ elif l.startswith("node:"):
+ n = node.bin(l[6:-1])
+ elif l.startswith("linkrev:"):
+ lr = int(l[9:-1])
+ elif l.startswith("parents:"):
+ p = l[9:-1].split()
+ p1 = node.bin(p[0])
+ p2 = node.bin(p[1])
+ elif l.startswith("length:"):
+ length = int(l[8:-1])
+ sys.stdin.readline() # start marker
+ d = sys.stdin.read(length)
+ sys.stdin.readline() # end marker
+ r.addrevision(d, tr, lr, p1, p2)
+
+tr.close()
diff --git a/contrib/vim/HGAnnotate.vim b/contrib/vim/HGAnnotate.vim
new file mode 100644
index 0000000..5b5ab95
--- /dev/null
+++ b/contrib/vim/HGAnnotate.vim
@@ -0,0 +1,27 @@
+" $Id: CVSAnnotate.vim,v 1.5 2002/10/01 21:34:02 rhiestan Exp $
+" Vim syntax file
+" Language: CVS annotate output
+" Maintainer: Bob Hiestand <bob@hiestandfamily.org>
+" Last Change: $Date: 2002/10/01 21:34:02 $
+" Remark: Used by the cvscommand plugin. Originally written by Mathieu
+" Clabaut
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+syn match cvsDate /\S\S\S \S\+ \d\+ \d\+:\d\+:\d\+ \d\+ [+-]\?\d\+/ contained
+syn match cvsName /^\s*\S\+ / contained nextgroup=cvsVer
+syn match cvsVer /\d\+ / contained nextgroup=cvsDate
+syn region cvsHead start="^" end=":" contains=cvsVer,cvsName,cvsDate
+
+if !exists("did_cvsannotate_syntax_inits")
+let did_cvsannotate_syntax_inits = 1
+hi link cvsText String
+hi link cvsDate Comment
+hi link cvsName Type
+hi link cvsVer Statement
+endif
+
+let b:current_syntax="CVSAnnotate"
diff --git a/contrib/vim/hg-menu.vim b/contrib/vim/hg-menu.vim
new file mode 100644
index 0000000..1664ecb
--- /dev/null
+++ b/contrib/vim/hg-menu.vim
@@ -0,0 +1,93 @@
+" vim600: set foldmethod=marker:
+" =============================================================================
+" Name Of File: hg-menu.vim
+" Description: Interface to Mercurial Version Control.
+" Author: Steve Borho (modified Jeff Lanzarotta's RCS script)
+" Date: Wednesday, October 5, 2005
+" Version: 0.1.0
+" Copyright: None.
+" Usage: These command and gui menu displays useful hg functions
+" Configuration: Your hg executable must be in your path.
+" =============================================================================
+
+" Section: Init {{{1
+if exists("loaded_hg_menu")
+ finish
+endif
+let loaded_hg_menu = 1
+
+" Section: Menu Options {{{1
+if has("gui")
+" amenu H&G.Commit\ File<Tab>,ci :!hg commit %<CR>:e!<CR>
+" amenu H&G.Commit\ All<Tab>,call :!hg commit<CR>:e!<CR>
+" amenu H&G.-SEP1- <nul>
+ amenu H&G.Add<Tab>\\add :!hg add %<CR><CR>
+ amenu H&G.Forget\ Add<Tab>\\fgt :!hg forget %<CR><CR>
+ amenu H&G.Show\ Differences<Tab>\\diff :call ShowResults("FileDiff", "hg\ diff")<CR><CR>
+ amenu H&G.Revert\ to\ Last\ Version<Tab>\\revert :!hg revert %<CR>:e!<CR>
+ amenu H&G.Show\ History<Tab>\\log :call ShowResults("FileLog", "hg\ log")<CR><CR>
+ amenu H&G.Annotate<Tab>\\an :call ShowResults("annotate", "hg\ annotate")<CR><CR>
+ amenu H&G.-SEP1- <nul>
+ amenu H&G.Repo\ Status<Tab>\\stat :call ShowResults("RepoStatus", "hg\ status")<CR><CR>
+ amenu H&G.Pull<Tab>\\pull :!hg pull<CR>:e!<CR>
+ amenu H&G.Update<Tab>\\upd :!hg update<CR>:e!<CR>
+endif
+
+" Section: Mappings {{{1
+if(v:version >= 600)
+ " The default Leader is \ 'backslash'
+ map <Leader>add :!hg add %<CR><CR>
+ map <Leader>fgt :!hg forget %<CR><CR>
+ map <Leader>diff :call ShowResults("FileDiff", "hg\ diff")<CR><CR>
+ map <Leader>revert :!hg revert %<CR>:e!<CR>
+ map <Leader>log :call ShowResults("FileLog", "hg\ log")<CR><CR>
+ map <Leader>an :call ShowResults("annotate", "hg\ annotate")<CR><CR>
+ map <Leader>stat :call ShowResults("RepoStatus", "hg\ status")<CR><CR>
+ map <Leader>upd :!hg update<CR>:e!<CR>
+ map <Leader>pull :!hg pull<CR>:e!<CR>
+else
+ " pre 6.0, the default Leader was a comma
+ map ,add :!hg add %<CR><CR>
+ map ,fgt :!hg forget %<CR><CR>
+ map ,diff :call ShowResults("FileDiff", "hg\ diff")<CR><CR>
+ map ,revert :!hg revert<CR>:e!<CR>
+ map ,log :call ShowResults("FileLog", "hg\ log")<CR><CR>
+ map ,an :call ShowResults("annotate", "hg\ annotate")<CR><CR>
+ map ,stat :call ShowResults("RepoStatus", "hg\ status")<CR><CR>
+ map ,upd :!hg update<CR>:e!<CR>
+ map ,pull :!hg pull<CR>:e!<CR>
+endif
+
+" Section: Functions {{{1
+" Show the log results of the current file with a revision control system.
+function! ShowResults(bufferName, cmdName)
+ " Modify the shortmess option:
+ " A don't give the "ATTENTION" message when an existing swap file is
+ " found.
+ set shortmess+=A
+
+ " Get the name of the current buffer.
+ let currentBuffer = bufname("%")
+
+ " If a buffer with the name rlog exists, delete it.
+ if bufexists(a:bufferName)
+ execute 'bd! ' a:bufferName
+ endif
+
+ " Create a new buffer.
+ execute 'new ' a:bufferName
+
+ " Execute the command.
+ execute 'r!' a:cmdName ' ' currentBuffer
+
+ " Make is so that the file can't be edited.
+ setlocal nomodified
+ setlocal nomodifiable
+ setlocal readonly
+
+ " Go to the beginning of the buffer.
+ execute "normal 1G"
+
+ " Restore the shortmess option.
+ set shortmess-=A
+endfunction
diff --git a/contrib/vim/hgcommand.vim b/contrib/vim/hgcommand.vim
new file mode 100644
index 0000000..9cbb579
--- /dev/null
+++ b/contrib/vim/hgcommand.vim
@@ -0,0 +1,1703 @@
+" vim600: set foldmethod=marker:
+"
+" Vim plugin to assist in working with HG-controlled files.
+"
+" Last Change: 2006/02/22
+" Version: 1.77
+" Maintainer: Mathieu Clabaut <mathieu.clabaut@gmail.com>
+" License: This file is placed in the public domain.
+" Credits:
+" Bob Hiestand <bob.hiestand@gmail.com> for the fabulous
+" cvscommand.vim from which this script was directly created by
+" means of sed commands and minor tweaks.
+" Note:
+" For Vim7 the use of Bob Hiestand's vcscommand.vim
+" <http://www.vim.org/scripts/script.php?script_id=90>
+" in conjunction with Vladmir Marek's Hg backend
+" <http://www.vim.org/scripts/script.php?script_id=1898>
+" is recommended.
+
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+"
+" Section: Documentation
+"----------------------------
+"
+" Documentation should be available by ":help hgcommand" command, once the
+" script has been copied in you .vim/plugin directory.
+"
+" You still can read the documentation at the end of this file. Locate it by
+" searching the "hgcommand-contents" string (and set ft=help to have
+" appropriate syntaxic coloration).
+
+" Section: Plugin header {{{1
+
+" loaded_hgcommand is set to 1 when the initialization begins, and 2 when it
+" completes. This allows various actions to only be taken by functions after
+" system initialization.
+
+if exists("g:loaded_hgcommand")
+ finish
+endif
+let g:loaded_hgcommand = 1
+
+" store 'compatible' settings
+let s:save_cpo = &cpo
+set cpo&vim
+
+" run checks
+let s:script_name = expand("<sfile>:t:r")
+
+function! s:HGCleanupOnFailure(err)
+ echohl WarningMsg
+ echomsg s:script_name . ":" a:err "Plugin not loaded"
+ echohl None
+ let g:loaded_hgcommand = "no"
+ unlet s:save_cpo s:script_name
+endfunction
+
+if v:version < 602
+ call <SID>HGCleanupOnFailure("VIM 6.2 or later required.")
+ finish
+endif
+
+if !exists("*system")
+ call <SID>HGCleanupOnFailure("builtin system() function required.")
+ finish
+endif
+
+let s:script_version = "v0.2"
+
+" Section: Event group setup {{{1
+
+augroup HGCommand
+augroup END
+
+" Section: Plugin initialization {{{1
+silent do HGCommand User HGPluginInit
+
+" Section: Script variable initialization {{{1
+
+let s:HGCommandEditFileRunning = 0
+unlet! s:vimDiffRestoreCmd
+unlet! s:vimDiffSourceBuffer
+unlet! s:vimDiffBufferCount
+unlet! s:vimDiffScratchList
+
+" Section: Utility functions {{{1
+
+" Function: s:HGResolveLink() {{{2
+" Fully resolve the given file name to remove shortcuts or symbolic links.
+
+function! s:HGResolveLink(fileName)
+ let resolved = resolve(a:fileName)
+ if resolved != a:fileName
+ let resolved = <SID>HGResolveLink(resolved)
+ endif
+ return resolved
+endfunction
+
+" Function: s:HGChangeToCurrentFileDir() {{{2
+" Go to the directory in which the current HG-controlled file is located.
+" If this is a HG command buffer, first switch to the original file.
+
+function! s:HGChangeToCurrentFileDir(fileName)
+ let oldCwd=getcwd()
+ let fileName=<SID>HGResolveLink(a:fileName)
+ let newCwd=fnamemodify(fileName, ':h')
+ if strlen(newCwd) > 0
+ execute 'cd' escape(newCwd, ' ')
+ endif
+ return oldCwd
+endfunction
+
+" Function: <SID>HGGetOption(name, default) {{{2
+" Grab a user-specified option to override the default provided. Options are
+" searched in the window, buffer, then global spaces.
+
+function! s:HGGetOption(name, default)
+ if exists("s:" . a:name . "Override")
+ execute "return s:".a:name."Override"
+ elseif exists("w:" . a:name)
+ execute "return w:".a:name
+ elseif exists("b:" . a:name)
+ execute "return b:".a:name
+ elseif exists("g:" . a:name)
+ execute "return g:".a:name
+ else
+ return a:default
+ endif
+endfunction
+
+" Function: s:HGEditFile(name, origBuffNR) {{{2
+" Wrapper around the 'edit' command to provide some helpful error text if the
+" current buffer can't be abandoned. If name is provided, it is used;
+" otherwise, a nameless scratch buffer is used.
+" Returns: 0 if successful, -1 if an error occurs.
+
+function! s:HGEditFile(name, origBuffNR)
+ "Name parameter will be pasted into expression.
+ let name = escape(a:name, ' *?\')
+
+ let editCommand = <SID>HGGetOption('HGCommandEdit', 'edit')
+ if editCommand != 'edit'
+ if <SID>HGGetOption('HGCommandSplit', 'horizontal') == 'horizontal'
+ if name == ""
+ let editCommand = 'rightbelow new'
+ else
+ let editCommand = 'rightbelow split ' . name
+ endif
+ else
+ if name == ""
+ let editCommand = 'vert rightbelow new'
+ else
+ let editCommand = 'vert rightbelow split ' . name
+ endif
+ endif
+ else
+ if name == ""
+ let editCommand = 'enew'
+ else
+ let editCommand = 'edit ' . name
+ endif
+ endif
+
+ " Protect against useless buffer set-up
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning + 1
+ try
+ execute editCommand
+ finally
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning - 1
+ endtry
+
+ let b:HGOrigBuffNR=a:origBuffNR
+ let b:HGCommandEdit='split'
+endfunction
+
+" Function: s:HGCreateCommandBuffer(cmd, cmdName, statusText, filename) {{{2
+" Creates a new scratch buffer and captures the output from execution of the
+" given command. The name of the scratch buffer is returned.
+
+function! s:HGCreateCommandBuffer(cmd, cmdName, statusText, origBuffNR)
+ let fileName=bufname(a:origBuffNR)
+
+ let resultBufferName=''
+
+ if <SID>HGGetOption("HGCommandNameResultBuffers", 0)
+ let nameMarker = <SID>HGGetOption("HGCommandNameMarker", '_')
+ if strlen(a:statusText) > 0
+ let bufName=a:cmdName . ' -- ' . a:statusText
+ else
+ let bufName=a:cmdName
+ endif
+ let bufName=fileName . ' ' . nameMarker . bufName . nameMarker
+ let counter=0
+ let resultBufferName = bufName
+ while buflisted(resultBufferName)
+ let counter=counter + 1
+ let resultBufferName=bufName . ' (' . counter . ')'
+ endwhile
+ endif
+
+ let hgCommand = <SID>HGGetOption("HGCommandHGExec", "hg") . " " . a:cmd
+ "echomsg "DBG :".hgCommand
+ let hgOut = system(hgCommand)
+ " HACK: diff command does not return proper error codes
+ if v:shell_error && a:cmdName != 'hgdiff'
+ if strlen(hgOut) == 0
+ echoerr "HG command failed"
+ else
+ echoerr "HG command failed: " . hgOut
+ endif
+ return -1
+ endif
+ if strlen(hgOut) == 0
+ " Handle case of no output. In this case, it is important to check the
+ " file status, especially since hg edit/unedit may change the attributes
+ " of the file with no visible output.
+
+ echomsg "No output from HG command"
+ checktime
+ return -1
+ endif
+
+ if <SID>HGEditFile(resultBufferName, a:origBuffNR) == -1
+ return -1
+ endif
+
+ set buftype=nofile
+ set noswapfile
+ set filetype=
+
+ if <SID>HGGetOption("HGCommandDeleteOnHide", 0)
+ set bufhidden=delete
+ endif
+
+ silent 0put=hgOut
+
+ " The last command left a blank line at the end of the buffer. If the
+ " last line is folded (a side effect of the 'put') then the attempt to
+ " remove the blank line will kill the last fold.
+ "
+ " This could be fixed by explicitly detecting whether the last line is
+ " within a fold, but I prefer to simply unfold the result buffer altogether.
+
+ if has("folding")
+ setlocal nofoldenable
+ endif
+
+ $d
+ 1
+
+ " Define the environment and execute user-defined hooks.
+
+ let b:HGSourceFile=fileName
+ let b:HGCommand=a:cmdName
+ if a:statusText != ""
+ let b:HGStatusText=a:statusText
+ endif
+
+ silent do HGCommand User HGBufferCreated
+ return bufnr("%")
+endfunction
+
+" Function: s:HGBufferCheck(hgBuffer) {{{2
+" Attempts to locate the original file to which HG operations were applied
+" for a given buffer.
+
+function! s:HGBufferCheck(hgBuffer)
+ let origBuffer = getbufvar(a:hgBuffer, "HGOrigBuffNR")
+ if origBuffer
+ if bufexists(origBuffer)
+ return origBuffer
+ else
+ " Original buffer no longer exists.
+ return -1
+ endif
+ else
+ " No original buffer
+ return a:hgBuffer
+ endif
+endfunction
+
+" Function: s:HGCurrentBufferCheck() {{{2
+" Attempts to locate the original file to which HG operations were applied
+" for the current buffer.
+
+function! s:HGCurrentBufferCheck()
+ return <SID>HGBufferCheck(bufnr("%"))
+endfunction
+
+" Function: s:HGToggleDeleteOnHide() {{{2
+" Toggles on and off the delete-on-hide behavior of HG buffers
+
+function! s:HGToggleDeleteOnHide()
+ if exists("g:HGCommandDeleteOnHide")
+ unlet g:HGCommandDeleteOnHide
+ else
+ let g:HGCommandDeleteOnHide=1
+ endif
+endfunction
+
+" Function: s:HGDoCommand(hgcmd, cmdName, statusText) {{{2
+" General skeleton for HG function execution.
+" Returns: name of the new command buffer containing the command results
+
+function! s:HGDoCommand(cmd, cmdName, statusText)
+ let hgBufferCheck=<SID>HGCurrentBufferCheck()
+ if hgBufferCheck == -1
+ echo "Original buffer no longer exists, aborting."
+ return -1
+ endif
+
+ let fileName=bufname(hgBufferCheck)
+ if isdirectory(fileName)
+ let fileName=fileName . "/" . getline(".")
+ endif
+ let realFileName = fnamemodify(<SID>HGResolveLink(fileName), ':t')
+ let oldCwd=<SID>HGChangeToCurrentFileDir(fileName)
+ try
+ " TODO
+ "if !filereadable('HG/Root')
+ "throw fileName . ' is not a HG-controlled file.'
+ "endif
+ let fullCmd = a:cmd . ' "' . realFileName . '"'
+ "echomsg "DEBUG".fullCmd
+ let resultBuffer=<SID>HGCreateCommandBuffer(fullCmd, a:cmdName, a:statusText, hgBufferCheck)
+ return resultBuffer
+ catch
+ echoerr v:exception
+ return -1
+ finally
+ execute 'cd' escape(oldCwd, ' ')
+ endtry
+endfunction
+
+
+" Function: s:HGGetStatusVars(revision, branch, repository) {{{2
+"
+" Obtains a HG revision number and branch name. The 'revisionVar',
+" 'branchVar'and 'repositoryVar' arguments, if non-empty, contain the names of variables to hold
+" the corresponding results.
+"
+" Returns: string to be exec'd that sets the multiple return values.
+
+function! s:HGGetStatusVars(revisionVar, branchVar, repositoryVar)
+ let hgBufferCheck=<SID>HGCurrentBufferCheck()
+ "echomsg "DBG : in HGGetStatusVars"
+ if hgBufferCheck == -1
+ return ""
+ endif
+ let fileName=bufname(hgBufferCheck)
+ let fileNameWithoutLink=<SID>HGResolveLink(fileName)
+ let realFileName = fnamemodify(fileNameWithoutLink, ':t')
+ let oldCwd=<SID>HGChangeToCurrentFileDir(realFileName)
+ try
+ let hgCommand = <SID>HGGetOption("HGCommandHGExec", "hg") . " root "
+ let roottext=system(hgCommand)
+ " Suppress ending null char ! Does it work in window ?
+ let roottext=substitute(roottext,'^.*/\([^/\n\r]*\)\n\_.*$','\1','')
+ if match(getcwd()."/".fileNameWithoutLink, roottext) == -1
+ return ""
+ endif
+ let returnExpression = ""
+ if a:repositoryVar != ""
+ let returnExpression=returnExpression . " | let " . a:repositoryVar . "='" . roottext . "'"
+ endif
+ let hgCommand = <SID>HGGetOption("HGCommandHGExec", "hg") . " status -mardui " . realFileName
+ let statustext=system(hgCommand)
+ if(v:shell_error)
+ return ""
+ endif
+ if match(statustext, '^[?I]') >= 0
+ let revision="NEW"
+ elseif match(statustext, '^[R]') >= 0
+ let revision="REMOVED"
+ elseif match(statustext, '^[D]') >= 0
+ let revision="DELETED"
+ elseif match(statustext, '^[A]') >= 0
+ let revision="ADDED"
+ else
+ " The file is tracked, we can try to get is revision number
+ let hgCommand = <SID>HGGetOption("HGCommandHGExec", "hg") . " parents "
+ let statustext=system(hgCommand)
+ if(v:shell_error)
+ return ""
+ endif
+ let revision=substitute(statustext, '^changeset:\s*\(\d\+\):.*\_$\_.*$', '\1', "")
+
+ if a:branchVar != "" && match(statustext, '^\_.*\_^branch:') >= 0
+ let branch=substitute(statustext, '^\_.*\_^branch:\s*\(\S\+\)\n\_.*$', '\1', "")
+ let returnExpression=returnExpression . " | let " . a:branchVar . "='" . branch . "'"
+ endif
+ endif
+ if (exists('revision'))
+ let returnExpression = "let " . a:revisionVar . "='" . revision . "' " . returnExpression
+ endif
+
+ return returnExpression
+ finally
+ execute 'cd' escape(oldCwd, ' ')
+ endtry
+endfunction
+
+" Function: s:HGSetupBuffer() {{{2
+" Attempts to set the b:HGBranch, b:HGRevision and b:HGRepository variables.
+
+function! s:HGSetupBuffer(...)
+ if (exists("b:HGBufferSetup") && b:HGBufferSetup && !exists('a:1'))
+ " This buffer is already set up.
+ return
+ endif
+
+ if !<SID>HGGetOption("HGCommandEnableBufferSetup", 0)
+ \ || @% == ""
+ \ || s:HGCommandEditFileRunning > 0
+ \ || exists("b:HGOrigBuffNR")
+ unlet! b:HGRevision
+ unlet! b:HGBranch
+ unlet! b:HGRepository
+ return
+ endif
+
+ if !filereadable(expand("%"))
+ return -1
+ endif
+
+ let revision=""
+ let branch=""
+ let repository=""
+
+ exec <SID>HGGetStatusVars('revision', 'branch', 'repository')
+ "echomsg "DBG ".revision."#".branch."#".repository
+ if revision != ""
+ let b:HGRevision=revision
+ else
+ unlet! b:HGRevision
+ endif
+ if branch != ""
+ let b:HGBranch=branch
+ else
+ unlet! b:HGBranch
+ endif
+ if repository != ""
+ let b:HGRepository=repository
+ else
+ unlet! b:HGRepository
+ endif
+ silent do HGCommand User HGBufferSetup
+ let b:HGBufferSetup=1
+endfunction
+
+" Function: s:HGMarkOrigBufferForSetup(hgbuffer) {{{2
+" Resets the buffer setup state of the original buffer for a given HG buffer.
+" Returns: The HG buffer number in a passthrough mode.
+
+function! s:HGMarkOrigBufferForSetup(hgBuffer)
+ checktime
+ if a:hgBuffer != -1
+ let origBuffer = <SID>HGBufferCheck(a:hgBuffer)
+ "This should never not work, but I'm paranoid
+ if origBuffer != a:hgBuffer
+ call setbufvar(origBuffer, "HGBufferSetup", 0)
+ endif
+ else
+ "We are presumably in the original buffer
+ let b:HGBufferSetup = 0
+ "We do the setup now as now event will be triggered allowing it later.
+ call <SID>HGSetupBuffer()
+ endif
+ return a:hgBuffer
+endfunction
+
+" Function: s:HGOverrideOption(option, [value]) {{{2
+" Provides a temporary override for the given HG option. If no value is
+" passed, the override is disabled.
+
+function! s:HGOverrideOption(option, ...)
+ if a:0 == 0
+ unlet! s:{a:option}Override
+ else
+ let s:{a:option}Override = a:1
+ endif
+endfunction
+
+" Function: s:HGWipeoutCommandBuffers() {{{2
+" Clears all current HG buffers of the specified type for a given source.
+
+function! s:HGWipeoutCommandBuffers(originalBuffer, hgCommand)
+ let buffer = 1
+ while buffer <= bufnr('$')
+ if getbufvar(buffer, 'HGOrigBuffNR') == a:originalBuffer
+ if getbufvar(buffer, 'HGCommand') == a:hgCommand
+ execute 'bw' buffer
+ endif
+ endif
+ let buffer = buffer + 1
+ endwhile
+endfunction
+
+" Function: s:HGInstallDocumentation(full_name, revision) {{{2
+" Install help documentation.
+" Arguments:
+" full_name: Full name of this vim plugin script, including path name.
+" revision: Revision of the vim script. #version# mark in the document file
+" will be replaced with this string with 'v' prefix.
+" Return:
+" 1 if new document installed, 0 otherwise.
+" Note: Cleaned and generalized by guo-peng Wen
+"'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+" Helper function to make mkdir as portable as possible
+function! s:HGFlexiMkdir(dir)
+ if exists("*mkdir") " we can use Vim's own mkdir()
+ call mkdir(a:dir)
+ elseif !exists("+shellslash")
+ call system("mkdir -p '".a:dir."'")
+ else " M$
+ let l:ssl = &shellslash
+ try
+ set shellslash
+ " no single quotes?
+ call system('mkdir "'.a:dir.'"')
+ finally
+ let &shellslash = l:ssl
+ endtry
+ endif
+endfunction
+
+function! s:HGInstallDocumentation(full_name)
+ " Figure out document path based on full name of this script:
+ let l:vim_doc_path = fnamemodify(a:full_name, ":h:h") . "/doc"
+ if filewritable(l:vim_doc_path) != 2
+ echomsg s:script_name . ": Trying to update docs at" l:vim_doc_path
+ silent! call <SID>HGFlexiMkdir(l:vim_doc_path)
+ if filewritable(l:vim_doc_path) != 2
+ " Try first item in 'runtimepath':
+ let l:vim_doc_path =
+ \ substitute(&runtimepath, '^\([^,]*\).*', '\1/doc', 'e')
+ if filewritable(l:vim_doc_path) != 2
+ echomsg s:script_name . ": Trying to update docs at" l:vim_doc_path
+ silent! call <SID>HGFlexiMkdir(l:vim_doc_path)
+ if filewritable(l:vim_doc_path) != 2
+ " Put a warning:
+ echomsg "Unable to open documentation directory"
+ echomsg " type `:help add-local-help' for more information."
+ return 0
+ endif
+ endif
+ endif
+ endif
+
+ " Full name of documentation file:
+ let l:doc_file =
+ \ l:vim_doc_path . "/" . s:script_name . ".txt"
+ " Bail out if document file is still up to date:
+ if filereadable(l:doc_file) &&
+ \ getftime(a:full_name) < getftime(l:doc_file)
+ return 0
+ endif
+
+ " temporary global settings
+ let l:lz = &lazyredraw
+ let l:hls = &hlsearch
+ set lazyredraw nohlsearch
+ " Create a new buffer & read in the plugin file (me):
+ 1 new
+ setlocal noswapfile modifiable nomodeline
+ if has("folding")
+ setlocal nofoldenable
+ endif
+ silent execute "read" escape(a:full_name, " ")
+ let l:doc_buf = bufnr("%")
+
+ 1
+ " Delete from first line to a line starts with
+ " === START_DOC
+ silent 1,/^=\{3,}\s\+START_DOC\C/ delete _
+ " Delete from a line starts with
+ " === END_DOC
+ " to the end of the documents:
+ silent /^=\{3,}\s\+END_DOC\C/,$ delete _
+
+ " Add modeline for help doc: the modeline string is mangled intentionally
+ " to avoid it be recognized by VIM:
+ call append(line("$"), "")
+ call append(line("$"), " v" . "im:tw=78:ts=8:ft=help:norl:")
+
+ " Replace revision:
+ silent execute "normal :1s/#version#/" . s:script_version . "/\<CR>"
+ " Save the help document and wipe out buffer:
+ silent execute "wq!" escape(l:doc_file, " ") "| bw" l:doc_buf
+ " Build help tags:
+ silent execute "helptags" l:vim_doc_path
+
+ let &hlsearch = l:hls
+ let &lazyredraw = l:lz
+ return 1
+endfunction
+
+" Section: Public functions {{{1
+
+" Function: HGGetRevision() {{{2
+" Global function for retrieving the current buffer's HG revision number.
+" Returns: Revision number or an empty string if an error occurs.
+
+function! HGGetRevision()
+ let revision=""
+ exec <SID>HGGetStatusVars('revision', '', '')
+ return revision
+endfunction
+
+" Function: HGDisableBufferSetup() {{{2
+" Global function for deactivating the buffer autovariables.
+
+function! HGDisableBufferSetup()
+ let g:HGCommandEnableBufferSetup=0
+ silent! augroup! HGCommandPlugin
+endfunction
+
+" Function: HGEnableBufferSetup() {{{2
+" Global function for activating the buffer autovariables.
+
+function! HGEnableBufferSetup()
+ let g:HGCommandEnableBufferSetup=1
+ augroup HGCommandPlugin
+ au!
+ au BufEnter * call <SID>HGSetupBuffer()
+ au BufWritePost * call <SID>HGSetupBuffer()
+ " Force resetting up buffer on external file change (HG update)
+ au FileChangedShell * call <SID>HGSetupBuffer(1)
+ augroup END
+
+ " Only auto-load if the plugin is fully loaded. This gives other plugins a
+ " chance to run.
+ if g:loaded_hgcommand == 2
+ call <SID>HGSetupBuffer()
+ endif
+endfunction
+
+" Function: HGGetStatusLine() {{{2
+" Default (sample) status line entry for HG files. This is only useful if
+" HG-managed buffer mode is on (see the HGCommandEnableBufferSetup variable
+" for how to do this).
+
+function! HGGetStatusLine()
+ if exists('b:HGSourceFile')
+ " This is a result buffer
+ let value='[' . b:HGCommand . ' ' . b:HGSourceFile
+ if exists('b:HGStatusText')
+ let value=value . ' ' . b:HGStatusText
+ endif
+ let value = value . ']'
+ return value
+ endif
+
+ if exists('b:HGRevision')
+ \ && b:HGRevision != ''
+ \ && exists('b:HGRepository')
+ \ && b:HGRepository != ''
+ \ && exists('g:HGCommandEnableBufferSetup')
+ \ && g:HGCommandEnableBufferSetup
+ if !exists('b:HGBranch')
+ let l:branch=''
+ else
+ let l:branch=b:HGBranch
+ endif
+ return '[HG ' . b:HGRepository . '/' . l:branch .'/' . b:HGRevision . ']'
+ else
+ return ''
+ endif
+endfunction
+
+" Section: HG command functions {{{1
+
+" Function: s:HGAdd() {{{2
+function! s:HGAdd()
+ return <SID>HGMarkOrigBufferForSetup(<SID>HGDoCommand('add', 'hgadd', ''))
+endfunction
+
+" Function: s:HGAnnotate(...) {{{2
+function! s:HGAnnotate(...)
+ if a:0 == 0
+ if &filetype == "HGAnnotate"
+ " This is a HGAnnotate buffer. Perform annotation of the version
+ " indicated by the current line.
+ let revision = substitute(getline("."),'\(^[0-9]*\):.*','\1','')
+ if <SID>HGGetOption('HGCommandAnnotateParent', 0) != 0 && revision > 0
+ let revision = revision - 1
+ endif
+ else
+ let revision=HGGetRevision()
+ if revision == ""
+ echoerr "Unable to obtain HG version information."
+ return -1
+ endif
+ endif
+ else
+ let revision=a:1
+ endif
+
+ if revision == "NEW"
+ echo "No annotatation available for new file."
+ return -1
+ endif
+
+ let resultBuffer=<SID>HGDoCommand('annotate -ndu -r ' . revision, 'hgannotate', revision)
+ "echomsg "DBG: ".resultBuffer
+ if resultBuffer != -1
+ set filetype=HGAnnotate
+ endif
+
+ return resultBuffer
+endfunction
+
+" Function: s:HGCommit() {{{2
+function! s:HGCommit(...)
+ " Handle the commit message being specified. If a message is supplied, it
+ " is used; if bang is supplied, an empty message is used; otherwise, the
+ " user is provided a buffer from which to edit the commit message.
+ if a:2 != "" || a:1 == "!"
+ return <SID>HGMarkOrigBufferForSetup(<SID>HGDoCommand('commit -m "' . a:2 . '"', 'hgcommit', ''))
+ endif
+
+ let hgBufferCheck=<SID>HGCurrentBufferCheck()
+ if hgBufferCheck == -1
+ echo "Original buffer no longer exists, aborting."
+ return -1
+ endif
+
+ " Protect against windows' backslashes in paths. They confuse exec'd
+ " commands.
+
+ let shellSlashBak = &shellslash
+ try
+ set shellslash
+
+ let messageFileName = tempname()
+
+ let fileName=bufname(hgBufferCheck)
+ let realFilePath=<SID>HGResolveLink(fileName)
+ let newCwd=fnamemodify(realFilePath, ':h')
+ if strlen(newCwd) == 0
+ " Account for autochdir being in effect, which will make this blank, but
+ " we know we'll be in the current directory for the original file.
+ let newCwd = getcwd()
+ endif
+
+ let realFileName=fnamemodify(realFilePath, ':t')
+
+ if <SID>HGEditFile(messageFileName, hgBufferCheck) == -1
+ return
+ endif
+
+ " Protect against case and backslash issues in Windows.
+ let autoPattern = '\c' . messageFileName
+
+ " Ensure existance of group
+ augroup HGCommit
+ augroup END
+
+ execute 'au HGCommit BufDelete' autoPattern 'call delete("' . messageFileName . '")'
+ execute 'au HGCommit BufDelete' autoPattern 'au! HGCommit * ' autoPattern
+
+ " Create a commit mapping. The mapping must clear all autocommands in case
+ " it is invoked when HGCommandCommitOnWrite is active, as well as to not
+ " invoke the buffer deletion autocommand.
+
+ execute 'nnoremap <silent> <buffer> <Plug>HGCommit '.
+ \ ':au! HGCommit * ' . autoPattern . '<CR>'.
+ \ ':g/^HG:/d<CR>'.
+ \ ':update<CR>'.
+ \ ':call <SID>HGFinishCommit("' . messageFileName . '",' .
+ \ '"' . newCwd . '",' .
+ \ '"' . realFileName . '",' .
+ \ hgBufferCheck . ')<CR>'
+
+ silent 0put ='HG: ----------------------------------------------------------------------'
+ silent put =\"HG: Enter Log. Lines beginning with `HG:' are removed automatically\"
+ silent put ='HG: Type <leader>cc (or your own <Plug>HGCommit mapping)'
+
+ if <SID>HGGetOption('HGCommandCommitOnWrite', 1) == 1
+ execute 'au HGCommit BufWritePre' autoPattern 'g/^HG:/d'
+ execute 'au HGCommit BufWritePost' autoPattern 'call <SID>HGFinishCommit("' . messageFileName . '", "' . newCwd . '", "' . realFileName . '", ' . hgBufferCheck . ') | au! * ' autoPattern
+ silent put ='HG: or write this buffer'
+ endif
+
+ silent put ='HG: to finish this commit operation'
+ silent put ='HG: ----------------------------------------------------------------------'
+ $
+ let b:HGSourceFile=fileName
+ let b:HGCommand='HGCommit'
+ set filetype=hg
+ finally
+ let &shellslash = shellSlashBak
+ endtry
+
+endfunction
+
+" Function: s:HGDiff(...) {{{2
+function! s:HGDiff(...)
+ if a:0 == 1
+ let revOptions = '-r' . a:1
+ let caption = a:1 . ' -> current'
+ elseif a:0 == 2
+ let revOptions = '-r' . a:1 . ' -r' . a:2
+ let caption = a:1 . ' -> ' . a:2
+ else
+ let revOptions = ''
+ let caption = ''
+ endif
+
+ let hgdiffopt=<SID>HGGetOption('HGCommandDiffOpt', 'w')
+
+ if hgdiffopt == ""
+ let diffoptionstring=""
+ else
+ let diffoptionstring=" -" . hgdiffopt . " "
+ endif
+
+ let resultBuffer = <SID>HGDoCommand('diff ' . diffoptionstring . revOptions , 'hgdiff', caption)
+ if resultBuffer != -1
+ set filetype=diff
+ endif
+ return resultBuffer
+endfunction
+
+
+" Function: s:HGGotoOriginal(["!]) {{{2
+function! s:HGGotoOriginal(...)
+ let origBuffNR = <SID>HGCurrentBufferCheck()
+ if origBuffNR > 0
+ let origWinNR = bufwinnr(origBuffNR)
+ if origWinNR == -1
+ execute 'buffer' origBuffNR
+ else
+ execute origWinNR . 'wincmd w'
+ endif
+ if a:0 == 1
+ if a:1 == "!"
+ let buffnr = 1
+ let buffmaxnr = bufnr("$")
+ while buffnr <= buffmaxnr
+ if getbufvar(buffnr, "HGOrigBuffNR") == origBuffNR
+ execute "bw" buffnr
+ endif
+ let buffnr = buffnr + 1
+ endwhile
+ endif
+ endif
+ endif
+endfunction
+
+" Function: s:HGFinishCommit(messageFile, targetDir, targetFile) {{{2
+function! s:HGFinishCommit(messageFile, targetDir, targetFile, origBuffNR)
+ if filereadable(a:messageFile)
+ let oldCwd=getcwd()
+ if strlen(a:targetDir) > 0
+ execute 'cd' escape(a:targetDir, ' ')
+ endif
+ let resultBuffer=<SID>HGCreateCommandBuffer('commit -l "' . a:messageFile . '" "'. a:targetFile . '"', 'hgcommit', '', a:origBuffNR)
+ execute 'cd' escape(oldCwd, ' ')
+ execute 'bw' escape(a:messageFile, ' *?\')
+ silent execute 'call delete("' . a:messageFile . '")'
+ return <SID>HGMarkOrigBufferForSetup(resultBuffer)
+ else
+ echoerr "Can't read message file; no commit is possible."
+ return -1
+ endif
+endfunction
+
+" Function: s:HGLog() {{{2
+function! s:HGLog(...)
+ if a:0 == 0
+ let versionOption = ""
+ let caption = ''
+ else
+ let versionOption=" -r" . a:1
+ let caption = a:1
+ endif
+
+ let resultBuffer=<SID>HGDoCommand('log' . versionOption, 'hglog', caption)
+ if resultBuffer != ""
+ set filetype=rcslog
+ endif
+ return resultBuffer
+endfunction
+
+" Function: s:HGRevert() {{{2
+function! s:HGRevert()
+ return <SID>HGMarkOrigBufferForSetup(<SID>HGDoCommand('revert', 'hgrevert', ''))
+endfunction
+
+" Function: s:HGReview(...) {{{2
+function! s:HGReview(...)
+ if a:0 == 0
+ let versiontag=""
+ if <SID>HGGetOption('HGCommandInteractive', 0)
+ let versiontag=input('Revision: ')
+ endif
+ if versiontag == ""
+ let versiontag="(current)"
+ let versionOption=""
+ else
+ let versionOption=" -r " . versiontag . " "
+ endif
+ else
+ let versiontag=a:1
+ let versionOption=" -r " . versiontag . " "
+ endif
+
+ let resultBuffer = <SID>HGDoCommand('cat' . versionOption, 'hgreview', versiontag)
+ if resultBuffer > 0
+ let &filetype=getbufvar(b:HGOrigBuffNR, '&filetype')
+ endif
+
+ return resultBuffer
+endfunction
+
+" Function: s:HGStatus() {{{2
+function! s:HGStatus()
+ return <SID>HGDoCommand('status', 'hgstatus', '')
+endfunction
+
+
+" Function: s:HGUpdate() {{{2
+function! s:HGUpdate()
+ return <SID>HGMarkOrigBufferForSetup(<SID>HGDoCommand('update', 'update', ''))
+endfunction
+
+" Function: s:HGVimDiff(...) {{{2
+function! s:HGVimDiff(...)
+ let originalBuffer = <SID>HGCurrentBufferCheck()
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning + 1
+ try
+ " If there's already a VimDiff'ed window, restore it.
+ " There may only be one HGVimDiff original window at a time.
+
+ if exists("s:vimDiffSourceBuffer") && s:vimDiffSourceBuffer != originalBuffer
+ " Clear the existing vimdiff setup by removing the result buffers.
+ call <SID>HGWipeoutCommandBuffers(s:vimDiffSourceBuffer, 'vimdiff')
+ endif
+
+ " Split and diff
+ if(a:0 == 2)
+ " Reset the vimdiff system, as 2 explicit versions were provided.
+ if exists('s:vimDiffSourceBuffer')
+ call <SID>HGWipeoutCommandBuffers(s:vimDiffSourceBuffer, 'vimdiff')
+ endif
+ let resultBuffer = <SID>HGReview(a:1)
+ if resultBuffer < 0
+ echomsg "Can't open HG revision " . a:1
+ return resultBuffer
+ endif
+ let b:HGCommand = 'vimdiff'
+ diffthis
+ let s:vimDiffBufferCount = 1
+ let s:vimDiffScratchList = '{'. resultBuffer . '}'
+ " If no split method is defined, cheat, and set it to vertical.
+ try
+ call <SID>HGOverrideOption('HGCommandSplit', <SID>HGGetOption('HGCommandDiffSplit', <SID>HGGetOption('HGCommandSplit', 'vertical')))
+ let resultBuffer=<SID>HGReview(a:2)
+ finally
+ call <SID>HGOverrideOption('HGCommandSplit')
+ endtry
+ if resultBuffer < 0
+ echomsg "Can't open HG revision " . a:1
+ return resultBuffer
+ endif
+ let b:HGCommand = 'vimdiff'
+ diffthis
+ let s:vimDiffBufferCount = 2
+ let s:vimDiffScratchList = s:vimDiffScratchList . '{'. resultBuffer . '}'
+ else
+ " Add new buffer
+ try
+ " Force splitting behavior, otherwise why use vimdiff?
+ call <SID>HGOverrideOption("HGCommandEdit", "split")
+ call <SID>HGOverrideOption("HGCommandSplit", <SID>HGGetOption('HGCommandDiffSplit', <SID>HGGetOption('HGCommandSplit', 'vertical')))
+ if(a:0 == 0)
+ let resultBuffer=<SID>HGReview()
+ else
+ let resultBuffer=<SID>HGReview(a:1)
+ endif
+ finally
+ call <SID>HGOverrideOption("HGCommandEdit")
+ call <SID>HGOverrideOption("HGCommandSplit")
+ endtry
+ if resultBuffer < 0
+ echomsg "Can't open current HG revision"
+ return resultBuffer
+ endif
+ let b:HGCommand = 'vimdiff'
+ diffthis
+
+ if !exists('s:vimDiffBufferCount')
+ " New instance of vimdiff.
+ let s:vimDiffBufferCount = 2
+ let s:vimDiffScratchList = '{' . resultBuffer . '}'
+
+ " This could have been invoked on a HG result buffer, not the
+ " original buffer.
+ wincmd W
+ execute 'buffer' originalBuffer
+ " Store info for later original buffer restore
+ let s:vimDiffRestoreCmd =
+ \ "call setbufvar(".originalBuffer.", \"&diff\", ".getbufvar(originalBuffer, '&diff').")"
+ \ . "|call setbufvar(".originalBuffer.", \"&foldcolumn\", ".getbufvar(originalBuffer, '&foldcolumn').")"
+ \ . "|call setbufvar(".originalBuffer.", \"&foldenable\", ".getbufvar(originalBuffer, '&foldenable').")"
+ \ . "|call setbufvar(".originalBuffer.", \"&foldmethod\", '".getbufvar(originalBuffer, '&foldmethod')."')"
+ \ . "|call setbufvar(".originalBuffer.", \"&scrollbind\", ".getbufvar(originalBuffer, '&scrollbind').")"
+ \ . "|call setbufvar(".originalBuffer.", \"&wrap\", ".getbufvar(originalBuffer, '&wrap').")"
+ \ . "|if &foldmethod=='manual'|execute 'normal! zE'|endif"
+ diffthis
+ wincmd w
+ else
+ " Adding a window to an existing vimdiff
+ let s:vimDiffBufferCount = s:vimDiffBufferCount + 1
+ let s:vimDiffScratchList = s:vimDiffScratchList . '{' . resultBuffer . '}'
+ endif
+ endif
+
+ let s:vimDiffSourceBuffer = originalBuffer
+
+ " Avoid executing the modeline in the current buffer after the autocommand.
+
+ let currentBuffer = bufnr('%')
+ let saveModeline = getbufvar(currentBuffer, '&modeline')
+ try
+ call setbufvar(currentBuffer, '&modeline', 0)
+ silent do HGCommand User HGVimDiffFinish
+ finally
+ call setbufvar(currentBuffer, '&modeline', saveModeline)
+ endtry
+ return resultBuffer
+ finally
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning - 1
+ endtry
+endfunction
+
+" Section: Command definitions {{{1
+" Section: Primary commands {{{2
+com! HGAdd call <SID>HGAdd()
+com! -nargs=? HGAnnotate call <SID>HGAnnotate(<f-args>)
+com! -bang -nargs=? HGCommit call <SID>HGCommit(<q-bang>, <q-args>)
+com! -nargs=* HGDiff call <SID>HGDiff(<f-args>)
+com! -bang HGGotoOriginal call <SID>HGGotoOriginal(<q-bang>)
+com! -nargs=? HGLog call <SID>HGLog(<f-args>)
+com! HGRevert call <SID>HGRevert()
+com! -nargs=? HGReview call <SID>HGReview(<f-args>)
+com! HGStatus call <SID>HGStatus()
+com! HGUpdate call <SID>HGUpdate()
+com! -nargs=* HGVimDiff call <SID>HGVimDiff(<f-args>)
+
+" Section: HG buffer management commands {{{2
+com! HGDisableBufferSetup call HGDisableBufferSetup()
+com! HGEnableBufferSetup call HGEnableBufferSetup()
+
+" Allow reloading hgcommand.vim
+com! HGReload unlet! g:loaded_hgcommand | runtime plugin/hgcommand.vim
+
+" Section: Plugin command mappings {{{1
+nnoremap <silent> <Plug>HGAdd :HGAdd<CR>
+nnoremap <silent> <Plug>HGAnnotate :HGAnnotate<CR>
+nnoremap <silent> <Plug>HGCommit :HGCommit<CR>
+nnoremap <silent> <Plug>HGDiff :HGDiff<CR>
+nnoremap <silent> <Plug>HGGotoOriginal :HGGotoOriginal<CR>
+nnoremap <silent> <Plug>HGClearAndGotoOriginal :HGGotoOriginal!<CR>
+nnoremap <silent> <Plug>HGLog :HGLog<CR>
+nnoremap <silent> <Plug>HGRevert :HGRevert<CR>
+nnoremap <silent> <Plug>HGReview :HGReview<CR>
+nnoremap <silent> <Plug>HGStatus :HGStatus<CR>
+nnoremap <silent> <Plug>HGUpdate :HGUpdate<CR>
+nnoremap <silent> <Plug>HGVimDiff :HGVimDiff<CR>
+
+" Section: Default mappings {{{1
+if !hasmapto('<Plug>HGAdd')
+ nmap <unique> <Leader>hga <Plug>HGAdd
+endif
+if !hasmapto('<Plug>HGAnnotate')
+ nmap <unique> <Leader>hgn <Plug>HGAnnotate
+endif
+if !hasmapto('<Plug>HGClearAndGotoOriginal')
+ nmap <unique> <Leader>hgG <Plug>HGClearAndGotoOriginal
+endif
+if !hasmapto('<Plug>HGCommit')
+ nmap <unique> <Leader>hgc <Plug>HGCommit
+endif
+if !hasmapto('<Plug>HGDiff')
+ nmap <unique> <Leader>hgd <Plug>HGDiff
+endif
+if !hasmapto('<Plug>HGGotoOriginal')
+ nmap <unique> <Leader>hgg <Plug>HGGotoOriginal
+endif
+if !hasmapto('<Plug>HGLog')
+ nmap <unique> <Leader>hgl <Plug>HGLog
+endif
+if !hasmapto('<Plug>HGRevert')
+ nmap <unique> <Leader>hgq <Plug>HGRevert
+endif
+if !hasmapto('<Plug>HGReview')
+ nmap <unique> <Leader>hgr <Plug>HGReview
+endif
+if !hasmapto('<Plug>HGStatus')
+ nmap <unique> <Leader>hgs <Plug>HGStatus
+endif
+if !hasmapto('<Plug>HGUpdate')
+ nmap <unique> <Leader>hgu <Plug>HGUpdate
+endif
+if !hasmapto('<Plug>HGVimDiff')
+ nmap <unique> <Leader>hgv <Plug>HGVimDiff
+endif
+
+" Section: Menu items {{{1
+silent! aunmenu Plugin.HG
+amenu <silent> &Plugin.HG.&Add <Plug>HGAdd
+amenu <silent> &Plugin.HG.A&nnotate <Plug>HGAnnotate
+amenu <silent> &Plugin.HG.&Commit <Plug>HGCommit
+amenu <silent> &Plugin.HG.&Diff <Plug>HGDiff
+amenu <silent> &Plugin.HG.&Log <Plug>HGLog
+amenu <silent> &Plugin.HG.Revert <Plug>HGRevert
+amenu <silent> &Plugin.HG.&Review <Plug>HGReview
+amenu <silent> &Plugin.HG.&Status <Plug>HGStatus
+amenu <silent> &Plugin.HG.&Update <Plug>HGUpdate
+amenu <silent> &Plugin.HG.&VimDiff <Plug>HGVimDiff
+
+" Section: Autocommands to restore vimdiff state {{{1
+function! s:HGVimDiffRestore(vimDiffBuff)
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning + 1
+ try
+ if exists("s:vimDiffSourceBuffer")
+ if a:vimDiffBuff == s:vimDiffSourceBuffer
+ " Original file is being removed.
+ unlet! s:vimDiffSourceBuffer
+ unlet! s:vimDiffBufferCount
+ unlet! s:vimDiffRestoreCmd
+ unlet! s:vimDiffScratchList
+ elseif match(s:vimDiffScratchList, '{' . a:vimDiffBuff . '}') >= 0
+ let s:vimDiffScratchList = substitute(s:vimDiffScratchList, '{' . a:vimDiffBuff . '}', '', '')
+ let s:vimDiffBufferCount = s:vimDiffBufferCount - 1
+ if s:vimDiffBufferCount == 1 && exists('s:vimDiffRestoreCmd')
+ " All scratch buffers are gone, reset the original.
+ " Only restore if the source buffer is still in Diff mode
+
+ let sourceWinNR=bufwinnr(s:vimDiffSourceBuffer)
+ if sourceWinNR != -1
+ " The buffer is visible in at least one window
+ let currentWinNR = winnr()
+ while winbufnr(sourceWinNR) != -1
+ if winbufnr(sourceWinNR) == s:vimDiffSourceBuffer
+ execute sourceWinNR . 'wincmd w'
+ if getwinvar('', "&diff")
+ execute s:vimDiffRestoreCmd
+ endif
+ endif
+ let sourceWinNR = sourceWinNR + 1
+ endwhile
+ execute currentWinNR . 'wincmd w'
+ else
+ " The buffer is hidden. It must be visible in order to set the
+ " diff option.
+ let currentBufNR = bufnr('')
+ execute "hide buffer" s:vimDiffSourceBuffer
+ if getwinvar('', "&diff")
+ execute s:vimDiffRestoreCmd
+ endif
+ execute "hide buffer" currentBufNR
+ endif
+
+ unlet s:vimDiffRestoreCmd
+ unlet s:vimDiffSourceBuffer
+ unlet s:vimDiffBufferCount
+ unlet s:vimDiffScratchList
+ elseif s:vimDiffBufferCount == 0
+ " All buffers are gone.
+ unlet s:vimDiffSourceBuffer
+ unlet s:vimDiffBufferCount
+ unlet s:vimDiffScratchList
+ endif
+ endif
+ endif
+ finally
+ let s:HGCommandEditFileRunning = s:HGCommandEditFileRunning - 1
+ endtry
+endfunction
+
+augroup HGVimDiffRestore
+ au!
+ au BufUnload * call <SID>HGVimDiffRestore(expand("<abuf>"))
+augroup END
+
+" Section: Optional activation of buffer management {{{1
+
+if s:HGGetOption('HGCommandEnableBufferSetup', 1)
+ call HGEnableBufferSetup()
+endif
+
+" Section: Doc installation {{{1
+
+if <SID>HGInstallDocumentation(expand("<sfile>:p"))
+ echomsg s:script_name s:script_version . ": updated documentation"
+endif
+
+" Section: Plugin completion {{{1
+
+" delete one-time vars and functions
+delfunction <SID>HGInstallDocumentation
+delfunction <SID>HGFlexiMkdir
+delfunction <SID>HGCleanupOnFailure
+unlet s:script_version s:script_name
+
+let g:loaded_hgcommand=2
+silent do HGCommand User HGPluginFinish
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+" vim:se expandtab sts=2 sw=2:
+finish
+
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" Section: Documentation content {{{1
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+=== START_DOC
+*hgcommand.txt* Mercurial vim integration #version#
+
+
+ HGCOMMAND REFERENCE MANUAL~
+
+
+Author: Mathieu Clabaut <mathieu.clabaut@gmail.com>
+Credits: Bob Hiestand <bob.hiestand@gmail.com>
+Mercurial: http://mercurial.selenic.com/
+ Mercurial (noted Hg) is a fast, lightweight Source Control Management
+ system designed for efficient handling of very large distributed projects.
+
+==============================================================================
+1. Contents *hgcommand-contents*
+
+ Installation : |hgcommand-install|
+ HGCommand Intro : |hgcommand|
+ HGCommand Manual : |hgcommand-manual|
+ Customization : |hgcommand-customize|
+ Bugs : |hgcommand-bugs|
+
+==============================================================================
+2. HGCommand Installation *hgcommand-install*
+
+ In order to install the plugin, place the hgcommand.vim file into a plugin'
+ directory in your runtime path (please see |add-global-plugin| and
+ |'runtimepath'|.
+
+ HGCommand may be customized by setting variables, creating maps, and
+ specifying event handlers. Please see |hgcommand-customize| for more
+ details.
+
+ *hgcommand-auto-help*
+ The help file is automagically generated when the |hgcommand| script is
+ loaded for the first time.
+
+==============================================================================
+
+3. HGCommand Intro *hgcommand*
+ *hgcommand-intro*
+
+ The HGCommand plugin provides global ex commands for manipulating
+ HG-controlled source files. In general, each command operates on the
+ current buffer and accomplishes a separate hg function, such as update,
+ commit, log, and others (please see |hgcommand-commands| for a list of all
+ available commands). The results of each operation are displayed in a
+ scratch buffer. Several buffer variables are defined for those scratch
+ buffers (please see |hgcommand-buffer-variables|).
+
+ The notion of "current file" means either the current buffer, or, in the
+ case of a directory buffer, the file on the current line within the buffer.
+
+ For convenience, any HGCommand invoked on a HGCommand scratch buffer acts
+ as though it was invoked on the original file and splits the screen so that
+ the output appears in a new window.
+
+ Many of the commands accept revisions as arguments. By default, most
+ operate on the most recent revision on the current branch if no revision is
+ specified (though see |HGCommandInteractive| to prompt instead).
+
+ Each HGCommand is mapped to a key sequence starting with the <Leader>
+ keystroke. The default mappings may be overridden by supplying different
+ mappings before the plugin is loaded, such as in the vimrc, in the standard
+ fashion for plugin mappings. For examples, please see
+ |hgcommand-mappings-override|.
+
+ The HGCommand plugin may be configured in several ways. For more details,
+ please see |hgcommand-customize|.
+
+==============================================================================
+4. HGCommand Manual *hgcommand-manual*
+
+4.1 HGCommand commands *hgcommand-commands*
+
+ HGCommand defines the following commands:
+
+ |:HGAdd|
+ |:HGAnnotate|
+ |:HGCommit|
+ |:HGDiff|
+ |:HGGotoOriginal|
+ |:HGLog|
+ |:HGRevert|
+ |:HGReview|
+ |:HGStatus|
+ |:HGUpdate|
+ |:HGVimDiff|
+
+:HGAdd *:HGAdd*
+
+ This command performs "hg add" on the current file. Please note, this does
+ not commit the newly-added file.
+
+:HGAnnotate *:HGAnnotate*
+
+ This command performs "hg annotate" on the current file. If an argument is
+ given, the argument is used as a revision number to display. If not given
+ an argument, it uses the most recent version of the file on the current
+ branch. Additionally, if the current buffer is a HGAnnotate buffer
+ already, the version number on the current line is used.
+
+ If the |HGCommandAnnotateParent| variable is set to a non-zero value, the
+ version previous to the one on the current line is used instead. This
+ allows one to navigate back to examine the previous version of a line.
+
+ The filetype of the HGCommand scratch buffer is set to 'HGAnnotate', to
+ take advantage of the bundled syntax file.
+
+
+:HGCommit[!] *:HGCommit*
+
+ If called with arguments, this performs "hg commit" using the arguments as
+ the log message.
+
+ If '!' is used with no arguments, an empty log message is committed.
+
+ If called with no arguments, this is a two-step command. The first step
+ opens a buffer to accept a log message. When that buffer is written, it is
+ automatically closed and the file is committed using the information from
+ that log message. The commit can be abandoned if the log message buffer is
+ deleted or wiped before being written.
+
+ Alternatively, the mapping that is used to invoke :HGCommit (by default
+ <Leader>hgc) can be used in the log message buffer to immediately commit.
+ This is useful if the |HGCommandCommitOnWrite| variable is set to 0 to
+ disable the normal commit-on-write behavior.
+
+:HGDiff *:HGDiff*
+
+ With no arguments, this performs "hg diff" on the current file against the
+ current repository version.
+
+ With one argument, "hg diff" is performed on the current file against the
+ specified revision.
+
+ With two arguments, hg diff is performed between the specified revisions of
+ the current file.
+
+ This command uses the 'HGCommandDiffOpt' variable to specify diff options.
+ If that variable does not exist, then 'wbBc' is assumed. If you wish to
+ have no options, then set it to the empty string.
+
+
+:HGGotoOriginal *:HGGotoOriginal*
+
+ This command returns the current window to the source buffer, if the
+ current buffer is a HG command output buffer.
+
+:HGGotoOriginal!
+
+ Like ":HGGotoOriginal" but also executes :bufwipeout on all HG command
+ output buffers for the source buffer.
+
+:HGLog *:HGLog*
+
+ Performs "hg log" on the current file.
+
+ If an argument is given, it is passed as an argument to the "-r" option of
+ "hg log".
+
+:HGRevert *:HGRevert*
+
+ Replaces the current file with the most recent version from the repository
+ in order to wipe out any undesired changes.
+
+:HGReview *:HGReview*
+
+ Retrieves a particular version of the current file. If no argument is
+ given, the most recent version of the file on the current branch is
+ retrieved. Otherwise, the specified version is retrieved.
+
+:HGStatus *:HGStatus*
+
+ Performs "hg status" on the current file.
+
+:HGUpdate *:HGUpdate*
+
+ Performs "hg update" on the current file. This intentionally does not
+ automatically reload the current buffer, though vim should prompt the user
+ to do so if the underlying file is altered by this command.
+
+:HGVimDiff *:HGVimDiff*
+
+ With no arguments, this prompts the user for a revision and then uses
+ vimdiff to display the differences between the current file and the
+ specified revision. If no revision is specified, the most recent version
+ of the file on the current branch is used.
+
+ With one argument, that argument is used as the revision as above. With
+ two arguments, the differences between the two revisions is displayed using
+ vimdiff.
+
+ With either zero or one argument, the original buffer is used to perform
+ the vimdiff. When the other buffer is closed, the original buffer will be
+ returned to normal mode.
+
+ Once vimdiff mode is started using the above methods, additional vimdiff
+ buffers may be added by passing a single version argument to the command.
+ There may be up to 4 vimdiff buffers total.
+
+ Using the 2-argument form of the command resets the vimdiff to only those 2
+ versions. Additionally, invoking the command on a different file will
+ close the previous vimdiff buffers.
+
+
+4.2 Mappings *hgcommand-mappings*
+
+ By default, a mapping is defined for each command. These mappings execute
+ the default (no-argument) form of each command.
+
+ <Leader>hga HGAdd
+ <Leader>hgn HGAnnotate
+ <Leader>hgc HGCommit
+ <Leader>hgd HGDiff
+ <Leader>hgg HGGotoOriginal
+ <Leader>hgG HGGotoOriginal!
+ <Leader>hgl HGLog
+ <Leader>hgr HGReview
+ <Leader>hgs HGStatus
+ <Leader>hgu HGUpdate
+ <Leader>hgv HGVimDiff
+
+ *hgcommand-mappings-override*
+
+ The default mappings can be overriden by user-provided instead by mapping
+ to <Plug>CommandName. This is especially useful when these mappings
+ collide with other existing mappings (vim will warn of this during plugin
+ initialization, but will not clobber the existing mappings).
+
+ For instance, to override the default mapping for :HGAdd to set it to
+ '\add', add the following to the vimrc: >
+
+ nmap \add <Plug>HGAdd
+<
+4.3 Automatic buffer variables *hgcommand-buffer-variables*
+
+ Several buffer variables are defined in each HGCommand result buffer.
+ These may be useful for additional customization in callbacks defined in
+ the event handlers (please see |hgcommand-events|).
+
+ The following variables are automatically defined:
+
+b:hgOrigBuffNR *b:hgOrigBuffNR*
+
+ This variable is set to the buffer number of the source file.
+
+b:hgcmd *b:hgcmd*
+
+ This variable is set to the name of the hg command that created the result
+ buffer.
+==============================================================================
+
+5. Configuration and customization *hgcommand-customize*
+ *hgcommand-config*
+
+ The HGCommand plugin can be configured in two ways: by setting
+ configuration variables (see |hgcommand-options|) or by defining HGCommand
+ event handlers (see |hgcommand-events|). Additionally, the HGCommand
+ plugin provides several option for naming the HG result buffers (see
+ |hgcommand-naming|) and supported a customized status line (see
+ |hgcommand-statusline| and |hgcommand-buffer-management|).
+
+5.1 HGCommand configuration variables *hgcommand-options*
+
+ Several variables affect the plugin's behavior. These variables are
+ checked at time of execution, and may be defined at the window, buffer, or
+ global level and are checked in that order of precedence.
+
+
+ The following variables are available:
+
+ |HGCommandAnnotateParent|
+ |HGCommandCommitOnWrite|
+ |HGCommandHGExec|
+ |HGCommandDeleteOnHide|
+ |HGCommandDiffOpt|
+ |HGCommandDiffSplit|
+ |HGCommandEdit|
+ |HGCommandEnableBufferSetup|
+ |HGCommandInteractive|
+ |HGCommandNameMarker|
+ |HGCommandNameResultBuffers|
+ |HGCommandSplit|
+
+HGCommandAnnotateParent *HGCommandAnnotateParent*
+
+ This variable, if set to a non-zero value, causes the zero-argument form of
+ HGAnnotate when invoked on a HGAnnotate buffer to go to the version
+ previous to that displayed on the current line. If not set, it defaults to
+ 0.
+
+HGCommandCommitOnWrite *HGCommandCommitOnWrite*
+
+ This variable, if set to a non-zero value, causes the pending hg commit to
+ take place immediately as soon as the log message buffer is written. If
+ set to zero, only the HGCommit mapping will cause the pending commit to
+ occur. If not set, it defaults to 1.
+
+HGCommandHGExec *HGCommandHGExec*
+
+ This variable controls the executable used for all HG commands. If not
+ set, it defaults to "hg".
+
+HGCommandDeleteOnHide *HGCommandDeleteOnHide*
+
+ This variable, if set to a non-zero value, causes the temporary HG result
+ buffers to automatically delete themselves when hidden.
+
+HGCommandDiffOpt *HGCommandDiffOpt*
+
+ This variable, if set, determines the options passed to the diff command of
+ HG. If not set, it defaults to 'w'.
+
+HGCommandDiffSplit *HGCommandDiffSplit*
+
+ This variable overrides the |HGCommandSplit| variable, but only for buffers
+ created with |:HGVimDiff|.
+
+HGCommandEdit *HGCommandEdit*
+
+ This variable controls whether the original buffer is replaced ('edit') or
+ split ('split'). If not set, it defaults to 'edit'.
+
+HGCommandEnableBufferSetup *HGCommandEnableBufferSetup*
+
+ This variable, if set to a non-zero value, activates HG buffer management
+ mode see (|hgcommand-buffer-management|). This mode means that three
+ buffer variables, 'HGRepository', 'HGRevision' and 'HGBranch', are set if
+ the file is HG-controlled. This is useful for displaying version
+ information in the status bar.
+
+HGCommandInteractive *HGCommandInteractive*
+
+ This variable, if set to a non-zero value, causes appropriate commands (for
+ the moment, only |:HGReview|) to query the user for a revision to use
+ instead of the current revision if none is specified.
+
+HGCommandNameMarker *HGCommandNameMarker*
+
+ This variable, if set, configures the special attention-getting characters
+ that appear on either side of the hg buffer type in the buffer name. This
+ has no effect unless |HGCommandNameResultBuffers| is set to a true value.
+ If not set, it defaults to '_'.
+
+HGCommandNameResultBuffers *HGCommandNameResultBuffers*
+
+ This variable, if set to a true value, causes the hg result buffers to be
+ named in the old way ('<source file name> _<hg command>_'). If not set or
+ set to a false value, the result buffer is nameless.
+
+HGCommandSplit *HGCommandSplit*
+
+ This variable controls the orientation of the various window splits that
+ may occur (such as with HGVimDiff, when using a HG command on a HG command
+ buffer, or when the |HGCommandEdit| variable is set to 'split'. If set to
+ 'horizontal', the resulting windows will be on stacked on top of one
+ another. If set to 'vertical', the resulting windows will be side-by-side.
+ If not set, it defaults to 'horizontal' for all but HGVimDiff windows.
+
+5.2 HGCommand events *hgcommand-events*
+
+ For additional customization, HGCommand can trigger user-defined events.
+ Event handlers are provided by defining User event autocommands (see
+ |autocommand|, |User|) in the HGCommand group with patterns matching the
+ event name.
+
+ For instance, the following could be added to the vimrc to provide a 'q'
+ mapping to quit a HGCommand scratch buffer: >
+
+ augroup HGCommand
+ au HGCommand User HGBufferCreated silent! nmap <unique> <buffer> q:
+ bwipeout<cr>
+ augroup END
+<
+
+ The following hooks are available:
+
+HGBufferCreated This event is fired just after a hg command result
+ buffer is created and filled with the result of a hg
+ command. It is executed within the context of the HG
+ command buffer. The HGCommand buffer variables may be
+ useful for handlers of this event (please see
+ |hgcommand-buffer-variables|).
+
+HGBufferSetup This event is fired just after HG buffer setup occurs,
+ if enabled.
+
+HGPluginInit This event is fired when the HGCommand plugin first
+ loads.
+
+HGPluginFinish This event is fired just after the HGCommand plugin
+ loads.
+
+HGVimDiffFinish This event is fired just after the HGVimDiff command
+ executes to allow customization of, for instance,
+ window placement and focus.
+
+5.3 HGCommand buffer naming *hgcommand-naming*
+
+ By default, the buffers containing the result of HG commands are nameless
+ scratch buffers. It is intended that buffer variables of those buffers be
+ used to customize the statusline option so that the user may fully control
+ the display of result buffers.
+
+ If the old-style naming is desired, please enable the
+ |HGCommandNameResultBuffers| variable. Then, each result buffer will
+ receive a unique name that includes the source file name, the HG command,
+ and any extra data (such as revision numbers) that were part of the
+ command.
+
+5.4 HGCommand status line support *hgcommand-statusline*
+
+ It is intended that the user will customize the |'statusline'| option to
+ include HG result buffer attributes. A sample function that may be used in
+ the |'statusline'| option is provided by the plugin, HGGetStatusLine(). In
+ order to use that function in the status line, do something like the
+ following: >
+
+ set statusline=%<%f\ %{HGGetStatusLine()}\ %h%m%r%=%l,%c%V\ %P
+<
+ of which %{HGGetStatusLine()} is the relevant portion.
+
+ The sample HGGetStatusLine() function handles both HG result buffers and
+ HG-managed files if HGCommand buffer management is enabled (please see
+ |hgcommand-buffer-management|).
+
+5.5 HGCommand buffer management *hgcommand-buffer-management*
+
+ The HGCommand plugin can operate in buffer management mode, which means
+ that it attempts to set two buffer variables ('HGRevision' and 'HGBranch')
+ upon entry into a buffer. This is rather slow because it means that 'hg
+ status' will be invoked at each entry into a buffer (during the |BufEnter|
+ autocommand).
+
+ This mode is enabled by default. In order to disable it, set the
+ |HGCommandEnableBufferSetup| variable to a false (zero) value. Enabling
+ this mode simply provides the buffer variables mentioned above. The user
+ must explicitly include those in the |'statusline'| option if they are to
+ appear in the status line (but see |hgcommand-statusline| for a simple way
+ to do that).
+
+==============================================================================
+9. Tips *hgcommand-tips*
+
+9.1 Split window annotation, by Michael Anderson >
+
+ :nmap <Leader>hgN :vs<CR><C-w>h<Leader>hgn:vertical res 40<CR>
+ \ggdddd:set scb<CR>:set nowrap<CR><C-w>lgg:set scb<CR>
+ \:set nowrap<CR>
+<
+
+ This splits the buffer vertically, puts an annotation on the left (minus
+ the header) with the width set to 40. An editable/normal copy is placed on
+ the right. The two versions are scroll locked so they move as one. and
+ wrapping is turned off so that the lines line up correctly. The advantages
+ are...
+
+ 1) You get a versioning on the right.
+ 2) You can still edit your own code.
+ 3) Your own code still has syntax highlighting.
+
+==============================================================================
+
+8. Known bugs *hgcommand-bugs*
+
+ Please let me know if you run across any.
+
+ HGVimDiff, when using the original (real) source buffer as one of the diff
+ buffers, uses some hacks to try to restore the state of the original buffer
+ when the scratch buffer containing the other version is destroyed. There
+ may still be bugs in here, depending on many configuration details.
+
+==============================================================================
+
+9. TODO *hgcommand-todo*
+
+ Integrate symlink tracking once HG will support them.
+==============================================================================
+=== END_DOC
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+" v im:tw=78:ts=8:ft=help:norl:
+" vim600: set foldmethod=marker tabstop=8 shiftwidth=2 softtabstop=2 smartindent smarttab :
+"fileencoding=iso-8859-15
diff --git a/contrib/vim/hgtest.vim b/contrib/vim/hgtest.vim
new file mode 100644
index 0000000..8ed24c0
--- /dev/null
+++ b/contrib/vim/hgtest.vim
@@ -0,0 +1,41 @@
+" Vim syntax file
+" Language: Mercurial unified tests
+" Author: Steve Losh (steve@stevelosh.com)
+"
+" Add the following line to your ~/.vimrc to enable:
+" au BufNewFile,BufRead *.t set filetype=hgtest
+"
+" If you want folding you'll need the following line as well:
+" let hgtest_fold=1
+"
+" You might also want to set the starting foldlevel for hgtest files:
+" autocmd Syntax hgtest setlocal foldlevel=1
+
+if exists("b:current_syntax")
+ finish
+endif
+
+syn include @Shell syntax/sh.vim
+
+syn match hgtestComment /^[^ ].*$/
+syn region hgtestOutput start=/^ [^$>]/ start=/^ $/ end=/\v.(\n\n*[^ ])\@=/me=s end=/^ [$>]/me=e-3 end=/^$/ fold containedin=hgtestBlock
+syn match hgtestCommandStart /^ \$ / containedin=hgtestCommand
+syn region hgtestCommand start=/^ \$ /hs=s+4,rs=s+4 end=/^ [^>]/me=e-3 end=/^ $/me=e-2 containedin=hgtestBlock contains=@Shell keepend
+syn region hgtestBlock start=/^ /ms=e-2 end=/\v.(\n\n*[^ ])\@=/me=s end=/^$/me=e-1 fold keepend
+
+hi link hgtestCommandStart Keyword
+hi link hgtestComment Normal
+hi link hgtestOutput Comment
+
+if exists("hgtest_fold")
+ setlocal foldmethod=syntax
+endif
+
+syn sync match hgtestSync grouphere NONE "^$"
+syn sync maxlines=200
+
+" It's okay to set tab settings here, because an indent of two spaces is specified
+" by the file format.
+setlocal tabstop=2 softtabstop=2 shiftwidth=2 expandtab
+
+let b:current_syntax = "hgtest"
diff --git a/contrib/vim/patchreview.txt b/contrib/vim/patchreview.txt
new file mode 100644
index 0000000..78511f9
--- /dev/null
+++ b/contrib/vim/patchreview.txt
@@ -0,0 +1,97 @@
+*patchreview.txt* Vim global plugin for doing single, multi-patch or diff code reviews
+ Version v0.2.2 (for Vim version 7.0 or higher)
+
+ Author: Manpreet Singh < junkblocker@yahoo.com >
+ Copyright (C) 2006-2010 by Manpreet Singh
+ License : This file is placed in the public domain.
+
+=============================================================================
+
+CONTENTS *patchreview* *diffreview* *patchreview-contents*
+
+ 1. Contents.........................................: |patchreview-contents|
+ 2. Introduction.....................................: |patchreview-intro|
+ 3. PatchReview options..............................: |patchreview-options|
+ 4. PatchReview Usage................................: |patchreview-usage|
+ 4.1 DiffReview Usage.............................: |:DiffReview|
+ 4.2 PatchReview Usage............................: |:PatchReview|
+
+=============================================================================
+
+PatchReview Introduction *patchreview-intro*
+
+The Patch Review plugin allows easy single or multipatch code or diff reviews.
+
+It opens each affected file in the patch or in a workspace diff in a diff view
+in a separate tab.
+
+VIM provides the |:diffpatch| and related commands to do single file reviews
+but can not handle patch files containing multiple patches as is common with
+software development projects. This plugin provides that missing
+functionality.
+
+It also improves on |:diffpatch|'s behaviour of creating the patched files in
+the same directory as original file which can lead to project workspace
+pollution.
+
+It does automatic diff generation for various version control systems by
+running their diff command.
+
+=============================================================================
+
+PatchReview Options *patchreview-options*
+
+ g:patchreview_patch = {string}
+ Optional path to patch binary. PatchReview tries to locate patch on
+ system path automatically. If the binary is not on system path, this
+ option tell PatchReview the full path to the binary. This option, if
+ specified, overrides the default patch binary on the path.
+
+ examples:
+ (On Windows with Cygwin) >
+ let g:patchreview_patch = 'c:\\cygwin\\bin\\patch.exe'
+<
+ (On *nix systems) >
+ let g:patchreview_patch = '/usr/bin/gpatch'
+<
+
+ g:patchreview_filterdiff = {string}
+ Optional path to filterdiff binary. PatchReview tries to locate
+ filterdiff on system path automatically. If the binary is not on system
+ path, this option tell PatchReview the full path to the binary. This
+ option, if specified, overrides the default filterdiff binary on the
+ path.
+
+ examples:
+ (On Windows with Cygwin)
+>
+ let g:patchreview_filterdiff = 'c:\\cygwin\\bin\\filterdiff.exe'
+<
+ (On *nix systems)
+>
+ let g:patchreview_filterdiff = '/usr/bin/filterdiff'
+<
+=============================================================================
+
+PatchReview Usage *patchreview-usage*
+ *:DiffReview*
+
+ :DiffReview
+
+ Perform a diff review in the current directory under version control.
+ Currently supports Mercurial (hg), Subversion (svn), CVS, Bazaar (bzr) and
+ Monotone.
+
+ *:PatchReview*
+
+ :PatchReview patchfile_path [optional_source_directory]
+
+ Perform a patch review in the current directory based on the supplied
+ patchfile_path. If optional_source_directory is specified, patchreview is
+ done on that directory. Otherwise, the current directory is assumed to be
+ the source directory.
+
+ Only supports context or unified format patches.
+
+------------------------------------------------------------------------------
+ vim: ft=help:ts=2:sts=2:sw=2:tw=78:norl:
diff --git a/contrib/vim/patchreview.vim b/contrib/vim/patchreview.vim
new file mode 100644
index 0000000..e655889
--- /dev/null
+++ b/contrib/vim/patchreview.vim
@@ -0,0 +1,868 @@
+" VIM plugin for doing single, multi-patch or diff code reviews {{{
+" Home: http://www.vim.org/scripts/script.php?script_id=1563
+
+" Version : 0.2.2 "{{{
+" Author : Manpreet Singh < junkblocker@yahoo.com >
+" Copyright : 2006-2010 by Manpreet Singh
+" License : This file is placed in the public domain.
+" No warranties express or implied. Use at your own risk.
+"
+" Changelog :
+"
+" 0.2.2 - Security fixes by removing custom tempfile creation
+" - Removed need for DiffReviewCleanup/PatchReviewCleanup
+" - Better command execution error detection and display
+" - Improved diff view and folding by ignoring modelines
+" - Improved tab labels display
+"
+" 0.2.1 - Minor temp directory autodetection logic and cleanup
+"
+" 0.2 - Removed the need for filterdiff by implemeting it in pure vim script
+" - Added DiffReview command for reverse (changed repository to
+" pristine state) reviews.
+" (PatchReview does pristine repository to patch review)
+" - DiffReview does automatic detection and generation of diffs for
+" various Source Control systems
+" - Skip load if VIM 7.0 or higher unavailable
+"
+" 0.1 - First released
+"}}}
+
+" Documentation: "{{{
+" ===========================================================================
+" This plugin allows single or multiple, patch or diff based code reviews to
+" be easily done in VIM. VIM has :diffpatch command to do single file reviews
+" but a) can not handle patch files containing multiple patches or b) do
+" automated diff generation for various version control systems. This plugin
+" attempts to provide those functionalities. It opens each changed / added or
+" removed file diff in new tabs.
+"
+" Installing:
+"
+" For a quick start, unzip patchreview.zip into your ~/.vim directory and
+" restart Vim.
+"
+" Details:
+"
+" Requirements:
+"
+" 1) VIM 7.0 or higher built with +diff option.
+"
+" 2) A gnu compatible patch command installed. This is the standard patch
+" command on Linux, Mac OS X, *BSD, Cygwin or /usr/bin/gpatch on newer
+" Solaris.
+"
+" 3) Optional (but recommended for speed)
+"
+" Install patchutils ( http://cyberelk.net/tim/patchutils/ ) for your
+" OS. For windows it is availble from Cygwin
+"
+" http://www.cygwin.com
+"
+" or GnuWin32
+"
+" http://gnuwin32.sourceforge.net/
+"
+" Install:
+"
+" 1) Extract the zip in your $HOME/.vim or $VIM/vimfiles directory and
+" restart vim. The directory location relevant to your platform can be
+" seen by running :help add-global-plugin in vim.
+"
+" 2) Restart vim.
+"
+" Configuration:
+"
+" Optionally, specify the locations to these filterdiff and patch commands
+" and location of a temporary directory to use in your .vimrc.
+"
+" let g:patchreview_patch = '/path/to/gnu/patch'
+"
+" " If you are using filterdiff
+" let g:patchreview_filterdiff = '/path/to/filterdiff'
+"
+"
+" Usage:
+"
+" Please see :help patchreview or :help diffreview for details.
+"
+""}}}
+
+" Enabled only during development
+" unlet! g:loaded_patchreview " DEBUG
+" unlet! g:patchreview_patch " DEBUG
+" unlet! g:patchreview_filterdiff " DEBUG
+" let g:patchreview_patch = 'patch' " DEBUG
+
+if v:version < 700
+ finish
+endif
+if ! has('diff')
+ call confirm('patchreview.vim plugin needs (G)VIM built with +diff support to work.')
+ finish
+endif
+
+" load only once
+if (! exists('g:patchreview_debug') && exists('g:loaded_patchreview')) || &compatible
+ finish
+endif
+let g:loaded_patchreview="0.2.2"
+
+let s:msgbufname = '-PatchReviewMessages-'
+
+function! <SID>Debug(str) "{{{
+ if exists('g:patchreview_debug')
+ Pecho 'DEBUG: ' . a:str
+ endif
+endfunction
+command! -nargs=+ -complete=expression Debug call s:Debug(<args>)
+"}}}
+
+function! <SID>PR_wipeMsgBuf() "{{{
+ let winnum = bufwinnr(s:msgbufname)
+ if winnum != -1 " If the window is already open, jump to it
+ let cur_winnr = winnr()
+ if winnr() != winnum
+ exe winnum . 'wincmd w'
+ exe 'bw'
+ exe cur_winnr . 'wincmd w'
+ endif
+ endif
+endfunction
+"}}}
+
+function! <SID>Pecho(...) "{{{
+ " Usage: Pecho(msg, [return_to_original_window_flag])
+ " default return_to_original_window_flag = 0
+ "
+ let cur_winnr = winnr()
+ let winnum = bufwinnr(s:msgbufname)
+ if winnum != -1 " If the window is already open, jump to it
+ if winnr() != winnum
+ exe winnum . 'wincmd w'
+ endif
+ else
+ let bufnum = bufnr(s:msgbufname)
+ if bufnum == -1
+ let wcmd = s:msgbufname
+ else
+ let wcmd = '+buffer' . bufnum
+ endif
+ exe 'silent! botright 5split ' . wcmd
+ endif
+ setlocal modifiable
+ setlocal buftype=nofile
+ setlocal bufhidden=delete
+ setlocal noswapfile
+ setlocal nowrap
+ setlocal nobuflisted
+ if a:0 != 0
+ silent! $put =a:1
+ endif
+ exe ':$'
+ setlocal nomodifiable
+ if a:0 > 1 && a:2
+ exe cur_winnr . 'wincmd w'
+ endif
+endfunction
+
+command! -nargs=+ -complete=expression Pecho call s:Pecho(<args>)
+"}}}
+
+function! <SID>PR_checkBinary(BinaryName) "{{{
+ " Verify that BinaryName is specified or available
+ if ! exists('g:patchreview_' . a:BinaryName)
+ if executable(a:BinaryName)
+ let g:patchreview_{a:BinaryName} = a:BinaryName
+ return 1
+ else
+ Pecho 'g:patchreview_' . a:BinaryName . ' is not defined and ' . a:BinaryName . ' command could not be found on path.'
+ Pecho 'Please define it in your .vimrc.'
+ return 0
+ endif
+ elseif ! executable(g:patchreview_{a:BinaryName})
+ Pecho 'Specified g:patchreview_' . a:BinaryName . ' [' . g:patchreview_{a:BinaryName} . '] is not executable.'
+ return 0
+ else
+ return 1
+ endif
+endfunction
+"}}}
+
+function! <SID>ExtractDiffsNative(...) "{{{
+ " Sets g:patches = {'reason':'', 'patch':[
+ " {
+ " 'filename': filepath
+ " 'type' : '+' | '-' | '!'
+ " 'content' : patch text for this file
+ " },
+ " ...
+ " ]}
+ let g:patches = {'reason' : '', 'patch' : []}
+ " TODO : User pointers into lines list rather then use collect
+ if a:0 == 0
+ let g:patches['reason'] = "ExtractDiffsNative expects at least a patchfile argument"
+ return
+ endif
+ let patchfile = expand(a:1, ':p')
+ if a:0 > 1
+ let patch = a:2
+ endif
+ if ! filereadable(patchfile)
+ let g:patches['reason'] = "File " . patchfile . " is not readable"
+ return
+ endif
+ unlet! filterdiffcmd
+ let filterdiffcmd = '' . g:patchreview_filterdiff . ' --list -s ' . patchfile
+ let fileslist = split(system(filterdiffcmd), '[\r\n]')
+ for filewithchangetype in fileslist
+ if filewithchangetype !~ '^[!+-] '
+ Pecho '*** Skipping review generation due to unknown change for [' . filewithchangetype . ']'
+ continue
+ endif
+
+ unlet! this_patch
+ let this_patch = {}
+
+ unlet! relpath
+ let relpath = substitute(filewithchangetype, '^. ', '', '')
+
+ let this_patch['filename'] = relpath
+
+ if filewithchangetype =~ '^! '
+ let this_patch['type'] = '!'
+ elseif filewithchangetype =~ '^+ '
+ let this_patch['type'] = '+'
+ elseif filewithchangetype =~ '^- '
+ let this_patch['type'] = '-'
+ endif
+
+ unlet! filterdiffcmd
+ let filterdiffcmd = '' . g:patchreview_filterdiff . ' -i ' . relpath . ' ' . patchfile
+ let this_patch['content'] = split(system(filterdiffcmd), '[\n\r]')
+ let g:patches['patch'] += [this_patch]
+ Debug "Patch collected for " . relpath
+ endfor
+endfunction
+"}}}
+
+function! <SID>ExtractDiffsPureVim(...) "{{{
+ " Sets g:patches = {'reason':'', 'patch':[
+ " {
+ " 'filename': filepath
+ " 'type' : '+' | '-' | '!'
+ " 'content' : patch text for this file
+ " },
+ " ...
+ " ]}
+ let g:patches = {'reason' : '', 'patch' : []}
+ " TODO : User pointers into lines list rather then use collect
+ if a:0 == 0
+ let g:patches['reason'] = "ExtractDiffsPureVim expects at least a patchfile argument"
+ return
+ endif
+ let patchfile = expand(a:1, ':p')
+ if a:0 > 1
+ let patch = a:2
+ endif
+ if ! filereadable(patchfile)
+ let g:patches['reason'] = "File " . patchfile . " is not readable"
+ return
+ endif
+ call s:PR_wipeMsgBuf()
+ let collect = []
+ let linum = 0
+ let lines = readfile(patchfile)
+ let linescount = len(lines)
+ State 'START'
+ while linum < linescount
+ let line = lines[linum]
+ let linum += 1
+ if State() == 'START'
+ let mat = matchlist(line, '^--- \([^\t]\+\).*$')
+ if ! empty(mat) && mat[1] != ''
+ State 'MAYBE_UNIFIED_DIFF'
+ let p_first_file = mat[1]
+ let collect = [line]
+ Debug line . State()
+ continue
+ endif
+ let mat = matchlist(line, '^\*\*\* \([^\t]\+\).*$')
+ if ! empty(mat) && mat[1] != ''
+ State 'MAYBE_CONTEXT_DIFF'
+ let p_first_file = mat[1]
+ let collect = [line]
+ Debug line . State()
+ continue
+ endif
+ continue
+ elseif State() == 'MAYBE_CONTEXT_DIFF'
+ let mat = matchlist(line, '^--- \([^\t]\+\).*$')
+ if empty(mat) || mat[1] == ''
+ State 'START'
+ let linum -= 1
+ continue
+ Debug 'Back to square one ' . line()
+ endif
+ let p_second_file = mat[1]
+ if p_first_file == '/dev/null'
+ if p_second_file == '/dev/null'
+ let g:patches['reason'] = "Malformed diff found at line " . linum
+ return
+ endif
+ let p_type = '+'
+ let filepath = p_second_file
+ else
+ if p_second_file == '/dev/null'
+ let p_type = '-'
+ let filepath = p_first_file
+ else
+ let p_type = '!'
+ let filepath = p_first_file
+ endif
+ endif
+ State 'EXPECT_15_STARS'
+ let collect += [line]
+ Debug line . State()
+ elseif State() == 'EXPECT_15_STARS'
+ if line !~ '^*\{15}$'
+ State 'START'
+ let linum -= 1
+ Debug line . State()
+ continue
+ endif
+ State 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+ let collect += [line]
+ Debug line . State()
+ elseif State() == 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+ let mat = matchlist(line, '^\*\*\* \(\d\+,\)\?\(\d\+\) \*\*\*\*$')
+ if empty(mat) || mat[1] == ''
+ State 'START'
+ let linum -= 1
+ Debug line . State()
+ continue
+ endif
+ let collect += [line]
+ State 'SKIP_CONTEXT_STUFF_1'
+ Debug line . State()
+ continue
+ elseif State() == 'SKIP_CONTEXT_STUFF_1'
+ if line !~ '^[ !+].*$'
+ let mat = matchlist(line, '^--- \(\d\+\),\(\d\+\) ----$')
+ if ! empty(mat) && mat[1] != '' && mat[2] != ''
+ let goal_count = mat[2] - mat[1] + 1
+ let c_count = 0
+ State 'READ_CONTEXT_CHUNK'
+ let collect += [line]
+ Debug line . State() . " Goal count set to " . goal_count
+ continue
+ endif
+ State 'START'
+ let linum -= 1
+ Debug line . State()
+ continue
+ endif
+ let collect += [line]
+ continue
+ elseif State() == 'READ_CONTEXT_CHUNK'
+ let c_count += 1
+ if c_count == goal_count
+ let collect += [line]
+ State 'BACKSLASH_OR_CRANGE_EOF'
+ continue
+ else " goal not met yet
+ let mat = matchlist(line, '^\([\\!+ ]\).*$')
+ if empty(mat) || mat[1] == ''
+ let linum -= 1
+ State 'START'
+ Debug line . State()
+ continue
+ endif
+ let collect += [line]
+ continue
+ endif
+ elseif State() == 'BACKSLASH_OR_CRANGE_EOF'
+ if line =~ '^\\ No newline.*$' " XXX: Can we go to another chunk from here??
+ let collect += [line]
+ let this_patch = {}
+ let this_patch['filename'] = filepath
+ let this_patch['type'] = p_type
+ let this_patch['content'] = collect
+ let g:patches['patch'] += [this_patch]
+ Debug "Patch collected for " . filepath
+ State 'START'
+ continue
+ endif
+ if line =~ '^\*\{15}$'
+ let collect += [line]
+ State 'EXPECT_CONTEXT_CHUNK_HEADER_1'
+ Debug line . State()
+ continue
+ endif
+ let this_patch = {}
+ let this_patch['filename'] = filepath
+ let this_patch['type'] = p_type
+ let this_patch['content'] = collect
+ let g:patches['patch'] += [this_patch]
+ let linum -= 1
+ State 'START'
+ Debug "Patch collected for " . filepath
+ Debug line . State()
+ continue
+ elseif State() == 'MAYBE_UNIFIED_DIFF'
+ let mat = matchlist(line, '^+++ \([^\t]\+\).*$')
+ if empty(mat) || mat[1] == ''
+ State 'START'
+ let linum -= 1
+ Debug line . State()
+ continue
+ endif
+ let p_second_file = mat[1]
+ if p_first_file == '/dev/null'
+ if p_second_file == '/dev/null'
+ let g:patches['reason'] = "Malformed diff found at line " . linum
+ return
+ endif
+ let p_type = '+'
+ let filepath = p_second_file
+ else
+ if p_second_file == '/dev/null'
+ let p_type = '-'
+ let filepath = p_first_file
+ else
+ let p_type = '!'
+ let filepath = p_first_file
+ endif
+ endif
+ State 'EXPECT_UNIFIED_RANGE_CHUNK'
+ let collect += [line]
+ Debug line . State()
+ continue
+ elseif State() == 'EXPECT_UNIFIED_RANGE_CHUNK'
+ let mat = matchlist(line, '^@@ -\(\d\+,\)\?\(\d\+\) +\(\d\+,\)\?\(\d\+\) @@$')
+ if ! empty(mat)
+ let old_goal_count = mat[2]
+ let new_goal_count = mat[4]
+ let o_count = 0
+ let n_count = 0
+ Debug "Goal count set to " . old_goal_count . ', ' . new_goal_count
+ State 'READ_UNIFIED_CHUNK'
+ let collect += [line]
+ Debug line . State()
+ continue
+ endif
+ State 'START'
+ Debug line . State()
+ continue
+ elseif State() == 'READ_UNIFIED_CHUNK'
+ if o_count == old_goal_count && n_count == new_goal_count
+ if line =~ '^\\.*$' " XXX: Can we go to another chunk from here??
+ let collect += [line]
+ let this_patch = {}
+ let this_patch['filename'] = filepath
+ let this_patch['type'] = p_type
+ let this_patch['content'] = collect
+ let g:patches['patch'] += [this_patch]
+ Debug "Patch collected for " . filepath
+ State 'START'
+ continue
+ endif
+ let mat = matchlist(line, '^@@ -\(\d\+,\)\?\(\d\+\) +\(\d\+,\)\?\(\d\+\) @@$')
+ if ! empty(mat)
+ let old_goal_count = mat[2]
+ let new_goal_count = mat[4]
+ let o_count = 0
+ let n_count = 0
+ Debug "Goal count set to " . old_goal_count . ', ' . new_goal_count
+ let collect += [line]
+ Debug line . State()
+ continue
+ endif
+ let this_patch = {}
+ let this_patch['filename'] = filepath
+ let this_patch['type'] = p_type
+ let this_patch['content'] = collect
+ let g:patches['patch'] += [this_patch]
+ Debug "Patch collected for " . filepath
+ let linum -= 1
+ State 'START'
+ Debug line . State()
+ continue
+ else " goal not met yet
+ let mat = matchlist(line, '^\([\\+ -]\).*$')
+ if empty(mat) || mat[1] == ''
+ let linum -= 1
+ State 'START'
+ continue
+ endif
+ let chr = mat[1]
+ if chr == '+'
+ let n_count += 1
+ endif
+ if chr == ' '
+ let o_count += 1
+ let n_count += 1
+ endif
+ if chr == '-'
+ let o_count += 1
+ endif
+ let collect += [line]
+ Debug line . State()
+ continue
+ endif
+ else
+ let g:patches['reason'] = "Internal error: Do not use the plugin anymore and if possible please send the diff or patch file you tried it with to Manpreet Singh <junkblocker@yahoo.com>"
+ return
+ endif
+ endwhile
+ "Pecho State()
+ if (State() == 'READ_CONTEXT_CHUNK' && c_count == goal_count) || (State() == 'READ_UNIFIED_CHUNK' && n_count == new_goal_count && o_count == old_goal_count)
+ let this_patch = {}
+ let this_patch['filename'] = filepath
+ let this_patch['type'] = p_type
+ let this_patch['content'] = collect
+ let g:patches['patch'] += [this_patch]
+ Debug "Patch collected for " . filepath
+ endif
+ return
+endfunction
+"}}}
+
+function! State(...) " For easy manipulation of diff extraction state "{{{
+ if a:0 != 0
+ let s:STATE = a:1
+ else
+ if ! exists('s:STATE')
+ let s:STATE = 'START'
+ endif
+ return s:STATE
+ endif
+endfunction
+com! -nargs=+ -complete=expression State call State(<args>)
+"}}}
+
+function! <SID>PatchReview(...) "{{{
+ let s:save_shortmess = &shortmess
+ let s:save_aw = &autowrite
+ let s:save_awa = &autowriteall
+ set shortmess=aW
+ call s:PR_wipeMsgBuf()
+ let s:reviewmode = 'patch'
+ call s:_GenericReview(a:000)
+ let &autowriteall = s:save_awa
+ let &autowrite = s:save_aw
+ let &shortmess = s:save_shortmess
+endfunction
+"}}}
+
+function! <SID>_GenericReview(argslist) "{{{
+ " diff mode:
+ " arg1 = patchfile
+ " arg2 = strip count
+ " patch mode:
+ " arg1 = patchfile
+ " arg2 = strip count
+ " arg3 = directory
+
+ " VIM 7+ required
+ if version < 700
+ Pecho 'This plugin needs VIM 7 or higher'
+ return
+ endif
+
+ " +diff required
+ if ! has('diff')
+ Pecho 'This plugin needs VIM built with +diff feature.'
+ return
+ endif
+
+
+ if s:reviewmode == 'diff'
+ let patch_R_option = ' -t -R '
+ elseif s:reviewmode == 'patch'
+ let patch_R_option = ''
+ else
+ Pecho 'Fatal internal error in patchreview.vim plugin'
+ return
+ endif
+
+ " Check passed arguments
+ if len(a:argslist) == 0
+ Pecho 'PatchReview command needs at least one argument specifying a patchfile path.'
+ return
+ endif
+ let StripCount = 0
+ if len(a:argslist) >= 1 && ((s:reviewmode == 'patch' && len(a:argslist) <= 3) || (s:reviewmode == 'diff' && len(a:argslist) == 2))
+ let PatchFilePath = expand(a:argslist[0], ':p')
+ if ! filereadable(PatchFilePath)
+ Pecho 'File [' . PatchFilePath . '] is not accessible.'
+ return
+ endif
+ if len(a:argslist) >= 2 && s:reviewmode == 'patch'
+ let s:SrcDirectory = expand(a:argslist[1], ':p')
+ if ! isdirectory(s:SrcDirectory)
+ Pecho '[' . s:SrcDirectory . '] is not a directory'
+ return
+ endif
+ try
+ " Command line has already escaped the path
+ exe 'cd ' . s:SrcDirectory
+ catch /^.*E344.*/
+ Pecho 'Could not change to directory [' . s:SrcDirectory . ']'
+ return
+ endtry
+ endif
+ if s:reviewmode == 'diff'
+ " passed in by default
+ let StripCount = eval(a:argslist[1])
+ elseif s:reviewmode == 'patch'
+ let StripCount = 1
+ " optional strip count
+ if len(a:argslist) == 3
+ let StripCount = eval(a:argslist[2])
+ endif
+ endif
+ else
+ if s:reviewmode == 'patch'
+ Pecho 'PatchReview command needs at most three arguments: patchfile path, optional source directory path and optional strip count.'
+ elseif s:reviewmode == 'diff'
+ Pecho 'DiffReview command accepts no arguments.'
+ endif
+ return
+ endif
+
+ " Verify that patch command and temporary directory are available or specified
+ if ! s:PR_checkBinary('patch')
+ return
+ endif
+
+ " Requirements met, now execute
+ let PatchFilePath = fnamemodify(PatchFilePath, ':p')
+ if s:reviewmode == 'patch'
+ Pecho 'Patch file : ' . PatchFilePath
+ endif
+ Pecho 'Source directory: ' . getcwd()
+ Pecho '------------------'
+ if s:PR_checkBinary('filterdiff')
+ Debug "Using filterdiff"
+ call s:ExtractDiffsNative(PatchFilePath)
+ else
+ Debug "Using own diff extraction (slower)"
+ call s:ExtractDiffsPureVim(PatchFilePath)
+ endif
+ for patch in g:patches['patch']
+ if patch.type !~ '^[!+-]$'
+ Pecho '*** Skipping review generation due to unknown change [' . patch.type . ']', 1
+ continue
+ endif
+ unlet! relpath
+ let relpath = patch.filename
+ " XXX: svn diff and hg diff produce different kind of outputs, one requires
+ " XXX: stripping but the other doesn't. We need to take care of that
+ let stripmore = StripCount
+ let StrippedRelativeFilePath = relpath
+ while stripmore > 0
+ " strip one
+ let StrippedRelativeFilePath = substitute(StrippedRelativeFilePath, '^[^\\\/]\+[^\\\/]*[\\\/]' , '' , '')
+ let stripmore -= 1
+ endwhile
+ if patch.type == '!'
+ if s:reviewmode == 'patch'
+ let msgtype = 'Patch modifies file: '
+ elseif s:reviewmode == 'diff'
+ let msgtype = 'File has changes: '
+ endif
+ elseif patch.type == '+'
+ if s:reviewmode == 'patch'
+ let msgtype = 'Patch adds file : '
+ elseif s:reviewmode == 'diff'
+ let msgtype = 'New file : '
+ endif
+ elseif patch.type == '-'
+ if s:reviewmode == 'patch'
+ let msgtype = 'Patch removes file : '
+ elseif s:reviewmode == 'diff'
+ let msgtype = 'Removed file : '
+ endif
+ endif
+ let bufnum = bufnr(relpath)
+ if buflisted(bufnum) && getbufvar(bufnum, '&mod')
+ Pecho 'Old buffer for file [' . relpath . '] exists in modified state. Skipping review.', 1
+ continue
+ endif
+ let tmpname = tempname()
+
+ " write patch for patch.filename into tmpname
+ call writefile(patch.content, tmpname)
+ if patch.type == '+' && s:reviewmode == 'patch'
+ let inputfile = ''
+ let patchcmd = '!' . g:patchreview_patch . patch_R_option . ' -o "' . tmpname . '.file" "' . inputfile . '" < "' . tmpname . '"'
+ elseif patch.type == '+' && s:reviewmode == 'diff'
+ let inputfile = ''
+ unlet! patchcmd
+ else
+ let inputfile = expand(StrippedRelativeFilePath, ':p')
+ let patchcmd = '!' . g:patchreview_patch . patch_R_option . ' -o "' . tmpname . '.file" "' . inputfile . '" < "' . tmpname . '"'
+ endif
+ if exists('patchcmd')
+ let v:errmsg = ''
+ Debug patchcmd
+ silent exe patchcmd
+ if v:errmsg != '' || v:shell_error
+ Pecho 'ERROR: Could not execute patch command.'
+ Pecho 'ERROR: ' . patchcmd
+ Pecho 'ERROR: ' . v:errmsg
+ Pecho 'ERROR: Diff skipped.'
+ continue
+ endif
+ endif
+ call delete(tmpname)
+ let s:origtabpagenr = tabpagenr()
+ silent! exe 'tabedit ' . StrippedRelativeFilePath
+ if exists('patchcmd')
+ " modelines in loaded files mess with diff comparision
+ let s:keep_modeline=&modeline
+ let &modeline=0
+ silent! exe 'vert diffsplit ' . tmpname . '.file'
+ setlocal buftype=nofile
+ setlocal noswapfile
+ setlocal syntax=none
+ setlocal bufhidden=delete
+ setlocal nobuflisted
+ setlocal modifiable
+ setlocal nowrap
+ " Remove buffer name
+ silent! 0f
+ " Switch to original to get a nice tab title
+ silent! wincmd p
+ let &modeline=s:keep_modeline
+ else
+ silent! exe 'vnew'
+ endif
+ if filereadable(tmpname . '.file.rej')
+ silent! exe 'topleft 5split ' . tmpname . '.file.rej'
+ Pecho msgtype . '*** REJECTED *** ' . relpath, 1
+ else
+ Pecho msgtype . ' ' . relpath, 1
+ endif
+ silent! exe 'tabn ' . s:origtabpagenr
+ endfor
+ Pecho '-----'
+ Pecho 'Done.'
+
+endfunction
+"}}}
+
+function! <SID>DiffReview(...) "{{{
+ let s:save_shortmess = &shortmess
+ set shortmess=aW
+ call s:PR_wipeMsgBuf()
+
+ let vcsdict = {
+ \'Mercurial' : {'dir' : '.hg', 'binary' : 'hg', 'diffargs' : 'diff' , 'strip' : 1},
+ \'Bazaar-NG' : {'dir' : '.bzr', 'binary' : 'bzr', 'diffargs' : 'diff' , 'strip' : 0},
+ \'monotone' : {'dir' : '_MTN', 'binary' : 'mtn', 'diffargs' : 'diff --unified', 'strip' : 0},
+ \'Subversion' : {'dir' : '.svn', 'binary' : 'svn', 'diffargs' : 'diff' , 'strip' : 0},
+ \'cvs' : {'dir' : 'CVS', 'binary' : 'cvs', 'diffargs' : '-q diff -u' , 'strip' : 0},
+ \}
+
+ unlet! s:theDiffCmd
+ unlet! l:vcs
+ if ! exists('g:patchreview_diffcmd')
+ for key in keys(vcsdict)
+ if isdirectory(vcsdict[key]['dir'])
+ if ! s:PR_checkBinary(vcsdict[key]['binary'])
+ Pecho 'Current directory looks like a ' . vcsdict[key] . ' repository but ' . vcsdist[key]['binary'] . ' command was not found on path.'
+ let &shortmess = s:save_shortmess
+ return
+ else
+ let s:theDiffCmd = vcsdict[key]['binary'] . ' ' . vcsdict[key]['diffargs']
+ let strip = vcsdict[key]['strip']
+
+ Pecho 'Using [' . s:theDiffCmd . '] to generate diffs for this ' . key . ' review.'
+ let &shortmess = s:save_shortmess
+ let l:vcs = vcsdict[key]['binary']
+ break
+ endif
+ else
+ continue
+ endif
+ endfor
+ else
+ let s:theDiffCmd = g:patchreview_diffcmd
+ let strip = 0
+ endif
+ if ! exists('s:theDiffCmd')
+ Pecho 'Please define g:patchreview_diffcmd and make sure you are in a VCS controlled top directory.'
+ let &shortmess = s:save_shortmess
+ return
+ endif
+
+ let outfile = tempname()
+ let cmd = s:theDiffCmd . ' > "' . outfile . '"'
+ let v:errmsg = ''
+ let cout = system(cmd)
+ if v:errmsg == '' && exists('l:vcs') && l:vcs == 'cvs' && v:shell_error == 1
+ " Ignoring CVS non-error
+ elseif v:errmsg != '' || v:shell_error
+ Pecho v:errmsg
+ Pecho 'Could not execute [' . s:theDiffCmd . ']'
+ Pecho 'Error code: ' . v:shell_error
+ Pecho cout
+ Pecho 'Diff review aborted.'
+ let &shortmess = s:save_shortmess
+ return
+ endif
+ let s:reviewmode = 'diff'
+ call s:_GenericReview([outfile, strip])
+ let &shortmess = s:save_shortmess
+endfunction
+"}}}
+
+" End user commands "{{{
+"============================================================================
+" :PatchReview
+command! -nargs=* -complete=file PatchReview call s:PatchReview (<f-args>)
+
+" :DiffReview
+command! -nargs=0 DiffReview call s:DiffReview()
+"}}}
+
+" Development "{{{
+if exists('g:patchreview_debug')
+ " Tests
+ function! <SID>PRExtractTestNative(...)
+ "let patchfiles = glob(expand(a:1) . '/?*')
+ "for fname in split(patchfiles)
+ call s:PR_wipeMsgBuf()
+ let fname = a:1
+ call s:ExtractDiffsNative(fname)
+ for patch in g:patches['patch']
+ for line in patch.content
+ Pecho line
+ endfor
+ endfor
+ "endfor
+ endfunction
+
+ function! <SID>PRExtractTestVim(...)
+ "let patchfiles = glob(expand(a:1) . '/?*')
+ "for fname in split(patchfiles)
+ call s:PR_wipeMsgBuf()
+ let fname = a:1
+ call s:ExtractDiffsPureVim(fname)
+ for patch in g:patches['patch']
+ for line in patch.content
+ Pecho line
+ endfor
+ endfor
+ "endfor
+ endfunction
+
+ command! -nargs=+ -complete=file PRTestVim call s:PRExtractTestVim(<f-args>)
+ command! -nargs=+ -complete=file PRTestNative call s:PRExtractTestNative(<f-args>)
+endif
+"}}}
+
+" modeline
+" vim: set et fdl=0 fdm=marker fenc=latin ff=unix ft=vim sw=2 sts=0 ts=2 textwidth=78 nowrap :
diff --git a/contrib/win32/ReadMe.html b/contrib/win32/ReadMe.html
new file mode 100644
index 0000000..d5d30cc
--- /dev/null
+++ b/contrib/win32/ReadMe.html
@@ -0,0 +1,162 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>Mercurial for Windows</title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
+ <style type="text/css">
+ <!--
+ html {
+ font-family: sans-serif;
+ margin: 1em 2em;
+ }
+
+ p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+ }
+
+ pre {
+ margin: 0.25em 0em;
+ padding: 0.5em;
+ background-color: #EEE;
+ border: thin solid #CCC;
+ }
+
+ .indented {
+ padding-left: 10pt;
+ }
+ -->
+ </style>
+ </head>
+
+ <body>
+ <h1>Mercurial for Windows</h1>
+
+ <p>Welcome to Mercurial for Windows!</p>
+
+ <p>
+ Mercurial is a command-line application. You must run it from
+ the Windows command prompt (or if you're hard core, a <a
+ href="http://www.mingw.org/">MinGW</a> shell).
+ </p>
+
+ <p class="indented">
+ <i>Note: the standard <a href="http://www.mingw.org/">MinGW</a>
+ msys startup script uses rxvt which has problems setting up
+ standard input and output. Running bash directly works
+ correctly.</i>
+ </p>
+
+ <p>
+ For documentation, please visit the <a
+ href="http://mercurial.selenic.com/">Mercurial web site</a>.
+ You can also download a free book, <a
+ href="http://hgbook.red-bean.com/">Mercurial: The Definitive
+ Guide</a>.
+ </p>
+
+ <p>
+ By default, Mercurial installs to <tt>C:\Program
+ Files\Mercurial</tt>. The Mercurial command is called
+ <tt>hg.exe</tt>.
+ </p>
+
+ <h1>Testing Mercurial after you've installed it</h1>
+
+ <p>
+ The easiest way to check that Mercurial is installed properly is
+ to just type the following at the command prompt:
+ </p>
+
+ <pre>
+hg
+</pre>
+
+ <p>
+ This command should print a useful help message. If it does,
+ other Mercurial commands should work fine for you.
+ </p>
+
+ <h1>Configuration notes</h1>
+ <h4>Default editor</h4>
+ <p>
+ The default editor for commit messages is 'notepad'. You can set
+ the <tt>EDITOR</tt> (or <tt>HGEDITOR</tt>) environment variable
+ to specify your preference or set it in <tt>mercurial.ini</tt>:
+ </p>
+ <pre>
+[ui]
+editor = whatever
+</pre>
+
+ <h4>Configuring a Merge program</h4>
+ <p>
+ It should be emphasized that Mercurial by itself doesn't attempt
+ to do a Merge at the file level, neither does it make any
+ attempt to Resolve the conflicts.
+ </p>
+
+ <p>
+ By default, Mercurial will use the merge program defined by the
+ <tt>HGMERGE</tt> environment variable, or uses the one defined
+ in the <tt>mercurial.ini</tt> file. (see <a
+ href="http://mercurial.selenic.com/wiki/MergeProgram">MergeProgram</a>
+ on the Mercurial Wiki for more information)
+ </p>
+
+ <h1>Reporting problems</h1>
+
+ <p>
+ Before you report any problems, please consult the <a
+ href="http://mercurial.selenic.com/">Mercurial web site</a>
+ and see if your question is already in our list of <a
+ href="http://mercurial.selenic.com/wiki/FAQ">Frequently
+ Answered Questions</a> (the "FAQ").
+ </p>
+
+ <p>
+ If you cannot find an answer to your question, please feel free
+ to send mail to the Mercurial mailing list, at <a
+ href="mailto:mercurial@selenic.com">mercurial@selenic.com</a>.
+ <b>Remember</b>, the more useful information you include in your
+ report, the easier it will be for us to help you!
+ </p>
+
+ <p>
+ If you are IRC-savvy, that's usually the fastest way to get
+ help. Go to <tt>#mercurial</tt> on <tt>irc.freenode.net</tt>.
+ </p>
+
+ <h1>Author and copyright information</h1>
+
+ <p>
+ Mercurial was written by <a href="http://www.selenic.com">Matt
+ Mackall</a>, and is maintained by Matt and a team of volunteers.
+ </p>
+
+ <p>
+ The Windows installer was written by <a
+ href="http://www.serpentine.com/blog">Bryan O'Sullivan</a>.
+ </p>
+
+ <p>
+ Mercurial is Copyright 2005-2012 Matt Mackall and others. See
+ the <tt>Contributors.txt</tt> file for a list of contributors.
+ </p>
+
+ <p>
+ Mercurial is free software; you can redistribute it and/or
+ modify it under the terms of the <a
+ href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt">GNU
+ General Public License version 2</a> or any later version.
+ </p>
+
+ <p>
+ Mercurial is distributed in the hope that it will be useful, but
+ <b>without any warranty</b>; without even the implied warranty
+ of <b>merchantability</b> or <b>fitness for a particular
+ purpose</b>. See the GNU General Public License for more
+ details.
+ </p>
+ </body>
+</html>
diff --git a/contrib/win32/buildlocal.bat b/contrib/win32/buildlocal.bat
new file mode 100644
index 0000000..b161d3e
--- /dev/null
+++ b/contrib/win32/buildlocal.bat
@@ -0,0 +1,9 @@
+@echo off
+rem Double-click this file to (re)build Mercurial for Windows in place.
+rem Useful for testing and development.
+cd ..\..
+del /Q mercurial\*.pyd
+del /Q mercurial\*.pyc
+rmdir /Q /S mercurial\locale
+python setup.py build_py -c -d . build_ext -i build_mo
+pause
diff --git a/contrib/win32/hg.bat b/contrib/win32/hg.bat
new file mode 100644
index 0000000..511a4e7
--- /dev/null
+++ b/contrib/win32/hg.bat
@@ -0,0 +1,12 @@
+@echo off
+rem Windows Driver script for Mercurial
+
+setlocal
+set HG=%~f0
+
+rem Use a full path to Python (relative to this script) as the standard Python
+rem install does not put python.exe on the PATH...
+rem %~dp0 is the directory of this script
+
+"%~dp0..\python" "%~dp0hg" %*
+endlocal
diff --git a/contrib/win32/hgwebdir_wsgi.py b/contrib/win32/hgwebdir_wsgi.py
new file mode 100644
index 0000000..efa866e
--- /dev/null
+++ b/contrib/win32/hgwebdir_wsgi.py
@@ -0,0 +1,95 @@
+# An example WSGI script for IIS/isapi-wsgi to export multiple hgweb repos
+# Copyright 2010 Sune Foldager <cryo@cyanite.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# Requirements:
+# - Python 2.6
+# - PyWin32 build 214 or newer
+# - Mercurial installed from source (python setup.py install)
+# - IIS 7
+#
+# Earlier versions will in general work as well, but the PyWin32 version is
+# necessary for win32traceutil to work correctly.
+#
+#
+# Installation and use:
+#
+# - Download the isapi-wsgi source and run python setup.py install:
+# http://code.google.com/p/isapi-wsgi/
+#
+# - Run this script (i.e. python hgwebdir_wsgi.py) to get a shim dll. The
+# shim is identical for all scripts, so you can just copy and rename one
+# from an earlier run, if you wish.
+#
+# - Setup an IIS application where your hgwebdir is to be served from.
+# On 64-bit systems, make sure it's assigned a 32-bit app pool.
+#
+# - In the application, setup a wildcard script handler mapping of type
+# IpsapiModule with the shim dll as its executable. This file MUST reside
+# in the same directory as the shim. Remove all other handlers, if you wish.
+#
+# - Make sure the ISAPI and CGI restrictions (configured globally on the
+# web server) includes the shim dll, to allow it to run.
+#
+# - Adjust the configuration variables below to match your needs.
+#
+
+# Configuration file location
+hgweb_config = r'c:\src\iis\hg\hgweb.config'
+
+# Global settings for IIS path translation
+path_strip = 0 # Strip this many path elements off (when using url rewrite)
+path_prefix = 1 # This many path elements are prefixes (depends on the
+ # virtual path of the IIS application).
+
+import sys
+
+# Adjust python path if this is not a system-wide install
+#sys.path.insert(0, r'c:\path\to\python\lib')
+
+# Enable tracing. Run 'python -m win32traceutil' to debug
+if getattr(sys, 'isapidllhandle', None) is not None:
+ import win32traceutil
+
+# To serve pages in local charset instead of UTF-8, remove the two lines below
+import os
+os.environ['HGENCODING'] = 'UTF-8'
+
+
+import isapi_wsgi
+from mercurial import demandimport; demandimport.enable()
+from mercurial.hgweb.hgwebdir_mod import hgwebdir
+
+# Example tweak: Replace isapi_wsgi's handler to provide better error message
+# Other stuff could also be done here, like logging errors etc.
+class WsgiHandler(isapi_wsgi.IsapiWsgiHandler):
+ error_status = '500 Internal Server Error' # less silly error message
+
+isapi_wsgi.IsapiWsgiHandler = WsgiHandler
+
+# Only create the hgwebdir instance once
+application = hgwebdir(hgweb_config)
+
+def handler(environ, start_response):
+
+ # Translate IIS's weird URLs
+ url = environ['SCRIPT_NAME'] + environ['PATH_INFO']
+ paths = url[1:].split('/')[path_strip:]
+ script_name = '/' + '/'.join(paths[:path_prefix])
+ path_info = '/'.join(paths[path_prefix:])
+ if path_info:
+ path_info = '/' + path_info
+ environ['SCRIPT_NAME'] = script_name
+ environ['PATH_INFO'] = path_info
+
+ return application(environ, start_response)
+
+def __ExtensionFactory__():
+ return isapi_wsgi.ISAPISimpleHandler(handler)
+
+if __name__=='__main__':
+ from isapi.install import *
+ params = ISAPIParameters()
+ HandleCommandLine(params)
diff --git a/contrib/win32/mercurial.ico b/contrib/win32/mercurial.ico
new file mode 100644
index 0000000..046808d
--- /dev/null
+++ b/contrib/win32/mercurial.ico
Binary files differ
diff --git a/contrib/win32/mercurial.ini b/contrib/win32/mercurial.ini
new file mode 100644
index 0000000..b8eac56
--- /dev/null
+++ b/contrib/win32/mercurial.ini
@@ -0,0 +1,97 @@
+; System-wide Mercurial config file.
+;
+; !!! Do Not Edit This File !!!
+;
+; This file will be replaced by the installer on every upgrade.
+; Editing this file can cause strange side effects on Vista.
+;
+; http://bitbucket.org/tortoisehg/stable/issue/135
+;
+; To change settings you see in this file, override (or enable) them in
+; your user Mercurial.ini file, where USERNAME is your Windows user name:
+;
+; XP or older - C:\Documents and Settings\USERNAME\Mercurial.ini
+; Vista or later - C:\Users\USERNAME\Mercurial.ini
+
+
+[ui]
+; editor used to enter commit logs, etc. Most text editors will work.
+editor = notepad
+; show changed files and be a bit more verbose if True
+; verbose = True
+
+; username data to appear in commits
+; it usually takes the form: Joe User <joe.user@host.com>
+; username = Joe User <j.user@example.com>
+
+; In order to push/pull over ssh you must specify an ssh tool
+;ssh = "C:\Progra~1\TortoiseSVN\bin\TortoisePlink.exe" -ssh -2
+;ssh = C:\cygwin\bin\ssh
+
+;
+; For more information about mercurial extensions, start here
+; http://www.selenic.com/mercurial/wiki/index.cgi/UsingExtensions
+;
+; Extensions shipped with Mercurial
+;
+[extensions]
+;acl =
+;bugzilla =
+;children =
+;churn =
+;color =
+;convert =
+;eol =
+;extdiff =
+;fetch =
+;gpg =
+;graphlog =
+;hgcia =
+;hgk =
+;highlight =
+;histedit =
+;interhg =
+;largefiles =
+;keyword =
+;mq =
+;notify =
+;pager =
+;patchbomb =
+;progress =
+;purge =
+;rebase =
+;record =
+;relink =
+;schemes =
+;share =
+;transplant =
+;win32mbcs =
+;zeroconf =
+
+;
+; Define external diff commands
+;
+[extdiff]
+;cmd.bc3diff = C:\Program Files\Beyond Compare 3\BCompare.exe
+;cmd.vdiff = C:\Progra~1\TortoiseSVN\bin\TortoiseMerge.exe
+;cmd.vimdiff = gvim.exe
+;opts.vimdiff = -f "+next" "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
+
+
+[hgk]
+; Replace the following with your path to hgk, uncomment it and
+; install ActiveTcl (or another win32 port like tclkit)
+; path="C:\Program Files\Mercurial\Contrib\hgk.tcl"
+; vdiff=vdiff
+
+
+;
+; The git extended diff format can represent binary files, file
+; permission changes, and rename information that the normal patch format
+; cannot describe. However it is also not compatible with tools which
+; expect normal patches. so enable git patches at your own risk.
+;
+[diff]
+;git = false
+;nodates = false
+
diff --git a/contrib/win32/mercurial.iss b/contrib/win32/mercurial.iss
new file mode 100644
index 0000000..855218a
--- /dev/null
+++ b/contrib/win32/mercurial.iss
@@ -0,0 +1,148 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#ifndef VERSION
+#define FileHandle
+#define FileLine
+#define VERSION = "unknown"
+#if FileHandle = FileOpen(SourcePath + "\..\..\mercurial\__version__.py")
+ #expr FileLine = FileRead(FileHandle)
+ #expr FileLine = FileRead(FileHandle)
+ #define VERSION = Copy(FileLine, Pos('"', FileLine)+1, Len(FileLine)-Pos('"', FileLine)-1)
+#endif
+#if FileHandle
+ #expr FileClose(FileHandle)
+#endif
+#pragma message "Detected Version: " + VERSION
+#endif
+
+#ifndef ARCH
+#define ARCH = "x86"
+#endif
+
+[Setup]
+AppCopyright=Copyright 2005-2010 Matt Mackall and others
+AppName=Mercurial
+#if ARCH == "x64"
+AppVerName=Mercurial {#VERSION} (64-bit)
+OutputBaseFilename=Mercurial-{#VERSION}-x64
+ArchitecturesAllowed=x64
+ArchitecturesInstallIn64BitMode=x64
+#else
+AppVerName=Mercurial {#VERSION}
+OutputBaseFilename=Mercurial-{#VERSION}
+#endif
+InfoAfterFile=contrib/win32/postinstall.txt
+LicenseFile=COPYING
+ShowLanguageDialog=yes
+AppPublisher=Matt Mackall and others
+AppPublisherURL=http://mercurial.selenic.com/
+AppSupportURL=http://mercurial.selenic.com/
+AppUpdatesURL=http://mercurial.selenic.com/
+AppID={{4B95A5F1-EF59-4B08-BED8-C891C46121B3}
+AppContact=mercurial@selenic.com
+DefaultDirName={pf}\Mercurial
+SourceDir=..\..
+VersionInfoDescription=Mercurial distributed SCM (version {#VERSION})
+VersionInfoCopyright=Copyright 2005-2010 Matt Mackall and others
+VersionInfoCompany=Matt Mackall and others
+InternalCompressLevel=max
+SolidCompression=true
+SetupIconFile=contrib\win32\mercurial.ico
+AllowNoIcons=true
+DefaultGroupName=Mercurial
+PrivilegesRequired=none
+
+[Files]
+Source: contrib\mercurial.el; DestDir: {app}/Contrib
+Source: contrib\vim\*.*; DestDir: {app}/Contrib/Vim
+Source: contrib\zsh_completion; DestDir: {app}/Contrib
+Source: contrib\bash_completion; DestDir: {app}/Contrib
+Source: contrib\tcsh_completion; DestDir: {app}/Contrib
+Source: contrib\tcsh_completion_build.sh; DestDir: {app}/Contrib
+Source: contrib\hgk; DestDir: {app}/Contrib; DestName: hgk.tcl
+Source: contrib\xml.rnc; DestDir: {app}/Contrib
+Source: contrib\shrink-revlog.py; DestDir: {app}/Contrib
+Source: contrib\mercurial.el; DestDir: {app}/Contrib
+Source: contrib\mq.el; DestDir: {app}/Contrib
+Source: contrib\hgweb.fcgi; DestDir: {app}/Contrib
+Source: contrib\hgweb.wsgi; DestDir: {app}/Contrib
+Source: contrib\win32\ReadMe.html; DestDir: {app}; Flags: isreadme
+Source: contrib\mergetools.hgrc; DestDir: {tmp};
+Source: contrib\win32\mercurial.ini; DestDir: {app}; DestName: Mercurial.ini; Check: CheckFile; AfterInstall: ConcatenateFiles;
+Source: contrib\win32\postinstall.txt; DestDir: {app}; DestName: ReleaseNotes.txt
+Source: dist\hg.exe; DestDir: {app}; AfterInstall: Touch('{app}\hg.exe.local')
+#if ARCH == "x64"
+Source: dist\*.dll; Destdir: {app}
+Source: dist\*.pyd; Destdir: {app}
+#else
+Source: dist\python*.dll; Destdir: {app}; Flags: skipifsourcedoesntexist
+Source: dist\msvc*.dll; DestDir: {app}; Flags: skipifsourcedoesntexist
+Source: dist\w9xpopen.exe; DestDir: {app}
+#endif
+Source: dist\Microsoft.VC*.CRT.manifest; DestDir: {app}; Flags: skipifsourcedoesntexist
+Source: dist\library.zip; DestDir: {app}
+Source: dist\add_path.exe; DestDir: {app}
+Source: dist\cacert.pem; Destdir: {app}
+Source: doc\*.html; DestDir: {app}\Docs
+Source: doc\style.css; DestDir: {app}\Docs
+Source: mercurial\help\*.txt; DestDir: {app}\help
+Source: mercurial\locale\*.*; DestDir: {app}\locale; Flags: recursesubdirs createallsubdirs skipifsourcedoesntexist
+Source: mercurial\templates\*.*; DestDir: {app}\Templates; Flags: recursesubdirs createallsubdirs
+Source: CONTRIBUTORS; DestDir: {app}; DestName: Contributors.txt
+Source: COPYING; DestDir: {app}; DestName: Copying.txt
+
+[INI]
+Filename: {app}\Mercurial.url; Section: InternetShortcut; Key: URL; String: http://mercurial.selenic.com/
+Filename: {app}\Mercurial.ini; Section: web; Key: cacerts; String: {app}\cacert.pem
+
+[UninstallDelete]
+Type: files; Name: {app}\Mercurial.url
+Type: files; Name: {app}\Contrib\shrink-revlog.pyc
+
+[Icons]
+Name: {group}\Uninstall Mercurial; Filename: {uninstallexe}
+Name: {group}\Mercurial Command Reference; Filename: {app}\Docs\hg.1.html
+Name: {group}\Mercurial Configuration Files; Filename: {app}\Docs\hgrc.5.html
+Name: {group}\Mercurial Ignore Files; Filename: {app}\Docs\hgignore.5.html
+Name: {group}\Mercurial Web Site; Filename: {app}\Mercurial.url
+
+[Run]
+Filename: "{app}\add_path.exe"; Parameters: "{app}"; Flags: postinstall; Description: "Add the installation path to the search path"
+
+[UninstallRun]
+Filename: "{app}\add_path.exe"; Parameters: "/del {app}"
+
+[UninstallDelete]
+Type: files; Name: "{app}\hg.exe.local"
+
+[Code]
+var
+ WriteFile: Boolean;
+ CheckDone: Boolean;
+
+function CheckFile(): Boolean;
+begin
+ if not CheckDone then begin
+ WriteFile := True;
+ if FileExists(ExpandConstant(CurrentFileName)) then begin
+ WriteFile := MsgBox('' + ExpandConstant(CurrentFileName) + '' #13#13 'The file already exists.' #13#13 'Would you like Setup to overwrite it?', mbConfirmation, MB_YESNO) = idYes;
+ end;
+ CheckDone := True;
+ end;
+ Result := WriteFile;
+end;
+
+procedure ConcatenateFiles();
+var
+ MergeConfigs: TArrayOfString;
+begin
+ if LoadStringsFromFile(ExpandConstant('{tmp}\mergetools.hgrc'),MergeConfigs) then begin
+ SaveStringsToFile(ExpandConstant(CurrentFileName),MergeConfigs,True);
+ end;
+end;
+
+procedure Touch(fn: String);
+begin
+ SaveStringToFile(ExpandConstant(fn), '', False);
+end;
diff --git a/contrib/win32/postinstall.txt b/contrib/win32/postinstall.txt
new file mode 100644
index 0000000..786dc48
--- /dev/null
+++ b/contrib/win32/postinstall.txt
@@ -0,0 +1,9 @@
+Welcome to Mercurial for Windows!
+---------------------------------
+
+For configuration and usage directions, please read the ReadMe.html
+file that comes with this package.
+
+Also check the release notes at:
+
+ http://mercurial.selenic.com/wiki/WhatsNew
diff --git a/contrib/win32/win32-build.txt b/contrib/win32/win32-build.txt
new file mode 100644
index 0000000..e0f2143
--- /dev/null
+++ b/contrib/win32/win32-build.txt
@@ -0,0 +1,133 @@
+The standalone Windows installer for Mercurial is built in a somewhat
+jury-rigged fashion.
+
+It has the following prerequisites. Ensure to take the packages
+matching the mercurial version you want to build (32-bit or 64-bit).
+
+ Python 2.6 for Windows
+ http://www.python.org/download/releases/
+
+ A compiler:
+ either MinGW
+ http://www.mingw.org/
+ or Microsoft Visual C++ 2008 SP1 Express Edition
+ http://www.microsoft.com/express/Downloads/Download-2008.aspx
+
+ Python for Windows Extensions
+ http://sourceforge.net/projects/pywin32/
+
+ mfc71.dll (just download, don't install; not needed for Python 2.6)
+ http://starship.python.net/crew/mhammond/win32/
+
+ Visual C++ 2008 redistributable package (needed for >= Python 2.6 or if you compile with MSVC)
+ for 32-bit:
+ http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf
+ for 64-bit:
+ http://www.microsoft.com/downloads/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6
+
+ The py2exe distutils extension
+ http://sourceforge.net/projects/py2exe/
+
+ GnuWin32 gettext utility (if you want to build translations)
+ http://gnuwin32.sourceforge.net/packages/gettext.htm
+
+ Inno Setup
+ http://www.jrsoftware.org/isdl.php#qsp
+
+ Get and install ispack-5.3.10.exe or later (includes Inno Setup Processor),
+ which is necessary to package Mercurial.
+
+ ISTool - optional
+ http://www.istool.org/default.aspx/
+
+ add_path (you need only add_path.exe in the zip file)
+ http://www.barisione.org/apps.html#add_path
+
+ Docutils
+ http://docutils.sourceforge.net/
+
+ CA Certs file
+ http://curl.haxx.se/ca/cacert.pem
+
+And, of course, Mercurial itself.
+
+Once you have all this installed and built, clone a copy of the
+Mercurial repository you want to package, and name the repo
+C:\hg\hg-release.
+
+In a shell, build a standalone copy of the hg.exe program.
+
+Building instructions for MinGW:
+ python setup.py build -c mingw32
+ python setup.py py2exe -b 2
+Note: the previously suggested combined command of "python setup.py build -c
+mingw32 py2exe -b 2" doesn't work correctly anymore as it doesn't include the
+extensions in the mercurial subdirectory.
+If you want to create a file named setup.cfg with the contents:
+[build]
+compiler=mingw32
+you can skip the first build step.
+
+Building instructions with MSVC 2008 Express Edition:
+ for 32-bit:
+ "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
+ python setup.py py2exe -b 2
+ for 64-bit:
+ "C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86_amd64
+ python setup.py py2exe -b 3
+
+Copy add_path.exe and cacert.pem files into the dist directory that just got created.
+
+If you are using Python up to version 2.5.4, copy mfc71.dll into the dist
+directory that just got created.
+
+If you are using Python 2.6 or later, or if you are using MSVC 2008 to compile
+mercurial, you must include the C runtime libraries in the installer. To do so,
+install the Visual C++ 2008 redistributable package. Then in your windows\winsxs
+folder, locate the folder containing the dlls version 9.0.21022.8.
+For x86, it should be named like x86_Microsoft.VC90.CRT_(...)_9.0.21022.8(...).
+For x64, it should be named like amd64_Microsoft.VC90.CRT_(...)_9.0.21022.8(...).
+Copy the files named msvcm90.dll, msvcp90.dll and msvcr90.dll into the dist
+directory.
+Then in the windows\winsxs\manifests folder, locate the corresponding manifest
+file (x86_Microsoft.VC90.CRT_(...)_9.0.21022.8(...).manifest for x86,
+amd64_Microsoft.VC90.CRT_(...)_9.0.21022.8(...).manifest for x64), copy it in the
+dist directory and rename it to Microsoft.VC90.CRT.manifest.
+
+Before building the installer, you have to build Mercurial HTML documentation
+(or fix mercurial.iss to not reference the doc directory):
+
+ cd doc
+ mingw32-make html
+ cd ..
+
+If you use ISTool, you open the C:\hg\hg-release\contrib\win32\mercurial.iss
+file and type Ctrl-F9 to compile the installer file.
+
+Otherwise you run the Inno Setup compiler. Assuming it's in the path
+you should execute:
+
+ iscc contrib\win32\mercurial.iss /dVERSION=foo
+
+Where 'foo' is the version number you would like to see in the
+'Add/Remove Applications' tool. The installer will be placed into
+a directory named Output/ at the root of your repository.
+If the /dVERSION=foo parameter is not given in the command line, the
+installer will retrieve the version information from the __version__.py file.
+
+If you want to build an installer for a 64-bit mercurial, add /dARCH=x64 to
+your command line:
+ iscc contrib\win32\mercurial.iss /dARCH=x64
+
+To automate the steps above you may want to create a batchfile based on the
+following (MinGW build chain):
+
+ echo [build] > setup.cfg
+ echo compiler=mingw32 >> setup.cfg
+ python setup.py py2exe -b 2
+ cd doc
+ mingw32-make html
+ cd ..
+ iscc contrib\win32\mercurial.iss /dVERSION=snapshot
+
+and run it from the root of the hg repository (c:\hg\hg-release).
diff --git a/contrib/wix/COPYING.rtf b/contrib/wix/COPYING.rtf
new file mode 100644
index 0000000..3174226
--- /dev/null
+++ b/contrib/wix/COPYING.rtf
Binary files differ
diff --git a/contrib/wix/README.txt b/contrib/wix/README.txt
new file mode 100644
index 0000000..8d9ec37
--- /dev/null
+++ b/contrib/wix/README.txt
@@ -0,0 +1,31 @@
+WiX installer source files
+==========================
+
+The files in this folder are used by the thg-winbuild [1] package
+building architecture to create a Mercurial MSI installer. These files
+are versioned within the Mercurial source tree because the WXS files
+must kept up to date with distribution changes within their branch. In
+other words, the default branch WXS files are expected to diverge from
+the stable branch WXS files. Storing them within the same repository is
+the only sane way to keep the source tree and the installer in sync.
+
+The MSI installer builder uses only the mercurial.ini file from the
+contrib/win32 folder, the contents of which have been historically used
+to create an InnoSetup based installer. The rest of the files there are
+ignored.
+
+The MSI packages built by thg-winbuild require elevated (admin)
+privileges to be installed due to the installation of MSVC CRT libraries
+under the C:\WINDOWS\WinSxS folder. Thus the InnoSetup installers may
+still be useful to some users.
+
+To build your own MSI packages, clone the thg-winbuild [1] repository
+and follow the README.txt [2] instructions closely. There are fewer
+prerequisites for a WiX [3] installer than an InnoSetup installer, but
+they are more specific.
+
+Direct questions or comments to Steve Borho <steve@borho.org>
+
+[1] http://bitbucket.org/tortoisehg/thg-winbuild
+[2] http://bitbucket.org/tortoisehg/thg-winbuild/src/tip/README.txt
+[3] http://wix.sourceforge.net/
diff --git a/contrib/wix/contrib.wxs b/contrib/wix/contrib.wxs
new file mode 100644
index 0000000..9dde6c4
--- /dev/null
+++ b/contrib/wix/contrib.wxs
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <Fragment>
+ <ComponentGroup Id="contribFolder">
+ <ComponentRef Id="contrib" />
+ <ComponentRef Id="contrib.vim" />
+ </ComponentGroup>
+ </Fragment>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="contribdir" Name="contrib" FileSource="$(var.SourceDir)">
+ <Component Id="contrib" Guid="$(var.contrib.guid)" Win64='$(var.IsX64)'>
+ <File Name="bash_completion" KeyPath="yes" />
+ <File Name="hgk" />
+ <File Name="hgweb.fcgi" />
+ <File Name="hgweb.wsgi" />
+ <File Name="logo-droplets.svg" />
+ <File Name="mercurial.el" />
+ <File Name="sample.hgrc" />
+ <File Name="tcsh_completion" />
+ <File Name="tcsh_completion_build.sh" />
+ <File Name="xml.rnc" />
+ <File Name="zsh_completion" />
+ </Component>
+ <Directory Id="vimdir" Name="vim">
+ <Component Id="contrib.vim" Guid="$(var.contrib.vim.guid)" Win64='$(var.IsX64)'>
+ <File Name="hg-menu.vim" KeyPath="yes" />
+ <File Name="HGAnnotate.vim" />
+ <File Name="hgcommand.vim" />
+ <File Name="patchreview.txt" />
+ <File Name="patchreview.vim" />
+ <File Name="hgtest.vim" />
+ </Component>
+ </Directory>
+ </Directory>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/defines.wxi b/contrib/wix/defines.wxi
new file mode 100644
index 0000000..b0a7860
--- /dev/null
+++ b/contrib/wix/defines.wxi
@@ -0,0 +1,9 @@
+<Include>
+
+ <?if $(var.Platform) = "x64" ?>
+ <?define IsX64 = yes ?>
+ <?else?>
+ <?define IsX64 = no ?>
+ <?endif?>
+
+</Include>
diff --git a/contrib/wix/dist.wxs b/contrib/wix/dist.wxs
new file mode 100644
index 0000000..6aa9ef7
--- /dev/null
+++ b/contrib/wix/dist.wxs
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR" FileSource="$(var.SourceDir)">
+ <Component Id="distOutput" Guid="$(var.dist.guid)" Win64='$(var.IsX64)'>
+ <File Name="library.zip" KeyPath="yes" />
+ <File Name="mercurial.base85.pyd" />
+ <File Name="mercurial.bdiff.pyd" />
+ <File Name="mercurial.diffhelpers.pyd" />
+ <File Name="mercurial.mpatch.pyd" />
+ <File Name="mercurial.osutil.pyd" />
+ <File Name="mercurial.parsers.pyd" />
+ <File Name="pyexpat.pyd" />
+ <File Name="python26.dll" />
+ <File Name="bz2.pyd" />
+ <File Name="select.pyd" />
+ <File Name="unicodedata.pyd" />
+ <File Name="_ctypes.pyd" />
+ <File Name="_elementtree.pyd" />
+ <File Name="_hashlib.pyd" />
+ <File Name="_socket.pyd" />
+ <File Name="_ssl.pyd" />
+ </Component>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/doc.wxs b/contrib/wix/doc.wxs
new file mode 100644
index 0000000..c8bcdd0
--- /dev/null
+++ b/contrib/wix/doc.wxs
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <Fragment>
+ <ComponentGroup Id="docFolder">
+ <ComponentRef Id="doc.hg.1.html" />
+ <ComponentRef Id="doc.hgignore.5.html" />
+ <ComponentRef Id="doc.hgrc.5.html" />
+ <ComponentRef Id="doc.style.css" />
+ </ComponentGroup>
+ </Fragment>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="docdir" Name="doc" FileSource="$(var.SourceDir)">
+ <Component Id="doc.hg.1.html" Guid="$(var.doc.hg.1.html.guid)" Win64='$(var.IsX64)'>
+ <File Name="hg.1.html" KeyPath="yes">
+ <Shortcut Id="hg1StartMenu" Directory="ProgramMenuDir"
+ Name="Mercurial Command Reference"
+ Icon="hgIcon.ico" IconIndex="0" Advertise="yes"
+ />
+ </File>
+ </Component>
+ <Component Id="doc.hgignore.5.html" Guid="$(var.doc.hgignore.5.html.guid)" Win64='$(var.IsX64)'>
+ <File Name="hgignore.5.html" KeyPath="yes">
+ <Shortcut Id="hgignore5StartMenu" Directory="ProgramMenuDir"
+ Name="Mercurial Ignore Files"
+ Icon="hgIcon.ico" IconIndex="0" Advertise="yes"
+ />
+ </File>
+ </Component>
+ <Component Id="doc.hgrc.5.html" Guid="$(var.doc.hgrc.5.html)" Win64='$(var.IsX64)'>
+ <File Name="hgrc.5.html" KeyPath="yes">
+ <Shortcut Id="hgrc5StartMenu" Directory="ProgramMenuDir"
+ Name="Mercurial Configuration Files"
+ Icon="hgIcon.ico" IconIndex="0" Advertise="yes"
+ />
+ </File>
+ </Component>
+ <Component Id="doc.style.css" Guid="$(var.doc.style.css)" Win64='$(var.IsX64)'>
+ <File Name="style.css" KeyPath="yes" />
+ </Component>
+ </Directory>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/guids.wxi b/contrib/wix/guids.wxi
new file mode 100644
index 0000000..d4360a4
--- /dev/null
+++ b/contrib/wix/guids.wxi
@@ -0,0 +1,51 @@
+<Include>
+ <!-- These are component GUIDs used for Mercurial installers.
+ YOU MUST CHANGE ALL GUIDs below when copying this file
+ and replace 'Mercurial' in this notice with the name of
+ your project. Component GUIDs have global namespace! -->
+
+ <!-- contrib.wxs -->
+ <?define contrib.guid = {F17D27B7-4A6B-4cd2-AE72-FED3CFAA585E} ?>
+ <?define contrib.vim.guid = {BB04903A-652D-4C4F-9590-2BD07A2304F2} ?>
+
+ <!-- dist.wxs -->
+ <?define dist.guid = {C3B634A4-1B05-4A40-94A9-38EE853CF693} ?>
+
+ <!-- doc.wxs -->
+ <?define doc.hg.1.html.guid = {AAAA3FDA-EDC5-4220-B59D-D342722358A2} ?>
+ <?define doc.hgignore.5.html.guid = {AA9118C4-F3A0-4429-A5F4-5A1906B2D67F} ?>
+ <?define doc.hgrc.5.html = {E0CEA1EB-FA01-408c-844B-EE5965165BAE} ?>
+ <?define doc.style.css = {172F8262-98E0-4711-BD39-4DAE0D77EF05} ?>
+
+ <!-- help.wxs -->
+ <?define helpFolder.guid = {9FA957DB-6DFE-44f2-AD03-293B2791CF17} ?>
+
+ <!-- i18n.wxs -->
+ <?define i18nFolder.guid = {1BF8026D-CF7C-4174-AEE6-D6B7BF119248} ?>
+
+ <!-- templates.wxs -->
+ <?define templates.root.guid = {8DF97574-33E9-412F-8414-65B48BB18783} ?>
+ <?define templates.atom.guid = {AB5D2908-BC95-44BE-9D79-069EF43D93E2} ?>
+ <?define templates.coal.guid = {B63CCAAB-4EAF-43b4-901E-4BD13F5B78FC} ?>
+ <?define templates.gitweb.guid = {6A33D168-F84E-45AA-912C-23CAC2D66BCA} ?>
+ <?define templates.monoblue.guid = {D27AA750-9394-4DAC-84FC-A546CE8F347A} ?>
+ <?define templates.paper.guid = {D2591E56-709E-49F9-8A5F-1359E1CCD7E0} ?>
+ <?define templates.raw.guid = {04DE03A2-FBFD-4c5f-8DEA-5436DDF4689D} ?>
+ <?define templates.rss.guid = {36069748-1E2A-472B-A212-506CB656A9C1} ?>
+ <?define templates.spartan.guid = {80222625-FA8F-44b1-86CE-1781EF375D09} ?>
+ <?define templates.static.guid = {B27D7311-050A-4A96-9971-B674A0EA21D0} ?>
+
+ <!-- mercurial.wxs -->
+ <?define ProductUpgradeCode = {A1CC6134-E945-4399-BE36-EB0017FDF7CF} ?>
+
+ <?define ComponentMainExecutableGUID = {D102B8FA-059B-4ACC-9FA3-8C78C3B58EEF} ?>
+
+ <?define ReadMe.guid = {56A8E372-991D-4DCA-B91D-93D775974CF5} ?>
+ <?define COPYING.guid = {B7801DBA-1C49-4BF4-91AD-33C65F5C7895} ?>
+ <?define mercurial.rc.guid = {1D5FAEEE-7E6E-43B1-9F7F-802714316B15} ?>
+ <?define mergetools.rc.guid = {E8A1DC29-FF40-4B5F-BD12-80B9F7BF0CCD} ?>
+ <?define paths.rc.guid = {F9ADF21D-5F0B-4934-8CD9-14BE63664721} ?>
+ <?define cacert.pem.guid = {EC1B2630-FE21-46E6-915B-A6545AF703D4} ?>
+ <?define ProgramMenuDir.guid = {D5A63320-1238-489B-B68B-CF053E9577CA} ?>
+
+</Include>
diff --git a/contrib/wix/help.wxs b/contrib/wix/help.wxs
new file mode 100644
index 0000000..601ecdc
--- /dev/null
+++ b/contrib/wix/help.wxs
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="helpdir" Name="help" FileSource="$(var.SourceDir)">
+ <Component Id="helpFolder" Guid="$(var.helpFolder.guid)" Win64='$(var.IsX64)'>
+ <File Name="config.txt" KeyPath="yes" />
+ <File Name="dates.txt" />
+ <File Name="diffs.txt" />
+ <File Name="environment.txt" />
+ <File Name="extensions.txt" />
+ <File Name="filesets.txt" />
+ <File Name="glossary.txt" />
+ <File Name="hgignore.txt" />
+ <File Name="hgweb.txt" />
+ <File Name="merge-tools.txt" />
+ <File Name="multirevs.txt" />
+ <File Name="patterns.txt" />
+ <File Name="phases.txt" />
+ <File Name="revisions.txt" />
+ <File Name="revsets.txt" />
+ <File Name="subrepos.txt" />
+ <File Name="templates.txt" />
+ <File Name="urls.txt" />
+ </Component>
+ </Directory>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/hg.cmd b/contrib/wix/hg.cmd
new file mode 100644
index 0000000..7e4c897
--- /dev/null
+++ b/contrib/wix/hg.cmd
@@ -0,0 +1,3 @@
+@echo off
+rem launch hg.exe from parent folder
+"%~dp0\..\hg.exe" %*
diff --git a/contrib/wix/i18n.wxs b/contrib/wix/i18n.wxs
new file mode 100644
index 0000000..4c97ca4
--- /dev/null
+++ b/contrib/wix/i18n.wxs
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <?define hg_po_langs =
+ da;de;el;fr;it;ja;pt_BR;ro;ru;sv;zh_CN;zh_TW
+ ?>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="i18ndir" Name="i18n" FileSource="$(var.SourceDir)">
+ <Component Id="i18nFolder" Guid="$(var.i18nFolder.guid)" Win64='$(var.IsX64)'>
+ <File Name="hggettext" KeyPath="yes" />
+ <?foreach LANG in $(var.hg_po_langs) ?>
+ <File Id="hg.$(var.LANG).po"
+ Name="$(var.LANG).po"
+ />
+ <?endforeach?>
+ </Component>
+ </Directory>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/locale.wxs b/contrib/wix/locale.wxs
new file mode 100644
index 0000000..52b66d4
--- /dev/null
+++ b/contrib/wix/locale.wxs
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include defines.wxi ?>
+
+ <?define hglocales =
+ da;de;el;fr;it;ja;pt_BR;sv;zh_CN;zh_TW
+ ?>
+
+ <Fragment>
+ <ComponentGroup Id="localeFolder">
+ <?foreach LOC in $(var.hglocales) ?>
+ <ComponentRef Id="hg.locale.$(var.LOC)"/>
+ <?endforeach?>
+ </ComponentGroup>
+ </Fragment>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+ <Directory Id="localedir" Name="locale" FileSource="$(var.SourceDir)">
+ <?foreach LOC in $(var.hglocales) ?>
+ <Directory Id="hg.locale.$(var.LOC)" Name="$(var.LOC)">
+ <Directory Id="hg.locale.$(var.LOC).LC_MESSAGES" Name="LC_MESSAGES">
+ <Component Id="hg.locale.$(var.LOC)" Guid="*" Win64='$(var.IsX64)'>
+ <File Id="hg.mo.$(var.LOC)" Name="hg.mo" KeyPath="yes" />
+ </Component>
+ </Directory>
+ </Directory>
+ <?endforeach?>
+ </Directory>
+ </DirectoryRef>
+ </Fragment>
+
+</Wix>
diff --git a/contrib/wix/mercurial.wxs b/contrib/wix/mercurial.wxs
new file mode 100644
index 0000000..fdd47e0
--- /dev/null
+++ b/contrib/wix/mercurial.wxs
@@ -0,0 +1,172 @@
+<?xml version='1.0' encoding='windows-1252'?>
+<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
+
+ <!-- Copyright 2010 Steve Borho <steve@borho.org>
+
+ This software may be used and distributed according to the terms of the
+ GNU General Public License version 2 or any later version. -->
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <?if $(var.Platform) = "x64" ?>
+ <?define PFolder = ProgramFiles64Folder ?>
+ <?else?>
+ <?define PFolder = ProgramFilesFolder ?>
+ <?endif?>
+
+ <Product Id='*'
+ Name='Mercurial $(var.Version) ($(var.Platform))'
+ UpgradeCode='$(var.ProductUpgradeCode)'
+ Language='1033' Codepage='1252' Version='$(var.Version)'
+ Manufacturer='Matt Mackall and others'>
+
+ <Package Id='*'
+ Keywords='Installer'
+ Description="Mercurial distributed SCM (version $(var.Version))"
+ Comments='$(var.Comments)'
+ Platform='$(var.Platform)'
+ Manufacturer='Matt Mackall and others'
+ InstallerVersion='300' Languages='1033' Compressed='yes' SummaryCodepage='1252' />
+
+ <Media Id='1' Cabinet='mercurial.cab' EmbedCab='yes' DiskPrompt='CD-ROM #1'
+ CompressionLevel='high' />
+ <Property Id='DiskPrompt' Value="Mercurial $(var.Version) Installation [1]" />
+
+ <Condition Message='Mercurial MSI installers require Windows XP or higher'>
+ VersionNT >= 501
+ </Condition>
+
+ <Property Id="INSTALLDIR">
+ <ComponentSearch Id='SearchForMainExecutableComponent'
+ Guid='$(var.ComponentMainExecutableGUID)' />
+ </Property>
+
+ <!--Property Id='ARPCOMMENTS'>any comments</Property-->
+ <Property Id='ARPCONTACT'>mercurial@selenic.com</Property>
+ <Property Id='ARPHELPLINK'>http://mercurial.selenic.com/wiki/</Property>
+ <Property Id='ARPURLINFOABOUT'>http://mercurial.selenic.com/about/</Property>
+ <Property Id='ARPURLUPDATEINFO'>http://mercurial.selenic.com/downloads/</Property>
+ <Property Id='ARPHELPTELEPHONE'>http://mercurial.selenic.com/wiki/Support</Property>
+ <Property Id='ARPPRODUCTICON'>hgIcon.ico</Property>
+
+ <Property Id='INSTALLEDMERCURIALPRODUCTS' Secure='yes'></Property>
+ <Property Id='REINSTALLMODE'>amus</Property>
+
+ <!--Auto-accept the license page-->
+ <Property Id='LicenseAccepted'>1</Property>
+
+ <Directory Id='TARGETDIR' Name='SourceDir'>
+ <Directory Id='$(var.PFolder)' Name='PFiles'>
+ <Directory Id='INSTALLDIR' Name='Mercurial'>
+ <Component Id='MainExecutable' Guid='$(var.ComponentMainExecutableGUID)' Win64='$(var.IsX64)'>
+ <File Id='hgEXE' Name='hg.exe' Source='dist\hg.exe' KeyPath='yes' />
+ <Environment Id="Environment" Name="PATH" Part="last" System="yes"
+ Permanent="no" Value="[INSTALLDIR]" Action="set" />
+ </Component>
+ <Component Id='ReadMe' Guid='$(var.ReadMe.guid)' Win64='$(var.IsX64)'>
+ <File Id='ReadMe' Name='ReadMe.html' Source='contrib\win32\ReadMe.html'
+ KeyPath='yes'/>
+ </Component>
+ <Component Id='COPYING' Guid='$(var.COPYING.guid)' Win64='$(var.IsX64)'>
+ <File Id='COPYING' Name='COPYING.rtf' Source='contrib\wix\COPYING.rtf'
+ KeyPath='yes'/>
+ </Component>
+
+ <Directory Id='HGRCD' Name='hgrc.d'>
+ <Component Id='mercurial.rc' Guid='$(var.mercurial.rc.guid)' Win64='$(var.IsX64)'>
+ <File Id='mercurial.rc' Name='Mercurial.rc' Source='contrib\win32\mercurial.ini'
+ ReadOnly='yes' KeyPath='yes'/>
+ </Component>
+ <Component Id='mergetools.rc' Guid='$(var.mergetools.rc.guid)' Win64='$(var.IsX64)'>
+ <File Id='mergetools.rc' Name='MergeTools.rc' Source='contrib\mergetools.hgrc'
+ ReadOnly='yes' KeyPath='yes'/>
+ </Component>
+ <Component Id='paths.rc' Guid='$(var.paths.rc.guid)' Win64='$(var.IsX64)'>
+ <CreateFolder/>
+ <IniFile Id="ini0" Action="createLine" Directory="HGRCD" Name="Paths.rc"
+ Section="web" Key="cacerts" Value="[INSTALLDIR]hgrc.d\cacert.pem" />
+ </Component>
+ <Component Id='cacert.pem' Guid='$(var.cacert.pem.guid)' Win64='$(var.IsX64)'>
+ <File Id='cacert.pem' Name='cacert.pem' Source='..\misc\cacert.pem'
+ ReadOnly='yes' KeyPath='yes'/>
+ </Component>
+ </Directory>
+
+ </Directory>
+ </Directory>
+
+ <Directory Id="ProgramMenuFolder" Name="Programs">
+ <Directory Id="ProgramMenuDir" Name="Mercurial $(var.Version)">
+ <Component Id="ProgramMenuDir" Guid="$(var.ProgramMenuDir.guid)" Win64='$(var.IsX64)'>
+ <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
+ <RegistryValue Root='HKCU' Key='Software\Mercurial\InstallDir' Type='string'
+ Value='[INSTALLDIR]' KeyPath='yes' />
+ <Shortcut Id='UrlShortcut' Directory='ProgramMenuDir' Name='Mercurial Web Site'
+ Target='[ARPHELPLINK]' Icon="hgIcon.ico" IconIndex='0' />
+ </Component>
+ </Directory>
+ </Directory>
+
+ <?if $(var.Platform) = "x86" ?>
+ <Merge Id='VCRuntime' DiskId='1' Language='1033'
+ SourceFile='$(var.VCRedistSrcDir)\microsoft.vcxx.crt.x86_msm.msm' />
+ <Merge Id='VCRuntimePolicy' DiskId='1' Language='1033'
+ SourceFile='$(var.VCRedistSrcDir)\policy.x.xx.microsoft.vcxx.crt.x86_msm.msm' />
+ <?else?>
+ <Merge Id='VCRuntime' DiskId='1' Language='1033'
+ SourceFile='$(var.VCRedistSrcDir)\microsoft.vcxx.crt.x64_msm.msm' />
+ <Merge Id='VCRuntimePolicy' DiskId='1' Language='1033'
+ SourceFile='$(var.VCRedistSrcDir)\policy.x.xx.microsoft.vcxx.crt.x64_msm.msm' />
+ <?endif?>
+ </Directory>
+
+ <Feature Id='Complete' Title='Mercurial' Description='The complete package'
+ Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR' >
+ <Feature Id='MainProgram' Title='Program' Description='Mercurial command line app'
+ Level='1' Absent='disallow' >
+ <ComponentRef Id='MainExecutable' />
+ <ComponentRef Id='distOutput' />
+ <ComponentRef Id='ProgramMenuDir' />
+ <ComponentRef Id='ReadMe' />
+ <ComponentRef Id='COPYING' />
+ <ComponentRef Id='mercurial.rc' />
+ <ComponentRef Id='mergetools.rc' />
+ <ComponentRef Id='paths.rc' />
+ <ComponentRef Id='cacert.pem' />
+ <ComponentRef Id='helpFolder' />
+ <ComponentGroupRef Id='templatesFolder' />
+ <MergeRef Id='VCRuntime' />
+ <MergeRef Id='VCRuntimePolicy' />
+ </Feature>
+ <Feature Id='Locales' Title='Translations' Description='Translations' Level='1'>
+ <ComponentGroupRef Id='localeFolder' />
+ <ComponentRef Id='i18nFolder' />
+ </Feature>
+ <Feature Id='Documentation' Title='Documentation' Description='HTML man pages' Level='1'>
+ <ComponentGroupRef Id='docFolder' />
+ </Feature>
+ <Feature Id='Misc' Title='Miscellaneous' Description='Contributed scripts' Level='1'>
+ <ComponentGroupRef Id='contribFolder' />
+ </Feature>
+ </Feature>
+
+ <UIRef Id="WixUI_FeatureTree" />
+ <UIRef Id="WixUI_ErrorProgressText" />
+
+ <WixVariable Id="WixUILicenseRtf" Value="contrib\wix\COPYING.rtf" />
+
+ <Icon Id="hgIcon.ico" SourceFile="contrib/win32/mercurial.ico" />
+
+ <Upgrade Id='$(var.ProductUpgradeCode)'>
+ <UpgradeVersion
+ IncludeMinimum='yes' Minimum='0.0.0' IncludeMaximum='no' OnlyDetect='no'
+ Property='INSTALLEDMERCURIALPRODUCTS' />
+ </Upgrade>
+
+ <InstallExecuteSequence>
+ <RemoveExistingProducts After='InstallInitialize'/>
+ </InstallExecuteSequence>
+
+ </Product>
+</Wix>
diff --git a/contrib/wix/templates.wxs b/contrib/wix/templates.wxs
new file mode 100644
index 0000000..ac2eacc
--- /dev/null
+++ b/contrib/wix/templates.wxs
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
+
+ <?include guids.wxi ?>
+ <?include defines.wxi ?>
+
+ <Fragment>
+ <ComponentGroup Id="templatesFolder">
+
+ <ComponentRef Id="templates.root" />
+
+ <ComponentRef Id="templates.atom" />
+ <ComponentRef Id="templates.coal" />
+ <ComponentRef Id="templates.gitweb" />
+ <ComponentRef Id="templates.monoblue" />
+ <ComponentRef Id="templates.paper" />
+ <ComponentRef Id="templates.raw" />
+ <ComponentRef Id="templates.rss" />
+ <ComponentRef Id="templates.spartan" />
+ <ComponentRef Id="templates.static" />
+
+ </ComponentGroup>
+ </Fragment>
+
+ <Fragment>
+ <DirectoryRef Id="INSTALLDIR">
+
+ <Directory Id="templatesdir" Name="templates" FileSource="$(var.SourceDir)">
+
+ <Component Id="templates.root" Guid="$(var.templates.root.guid)" Win64='$(var.IsX64)'>
+ <File Name="map-cmdline.changelog" KeyPath="yes" />
+ <File Name="map-cmdline.compact" />
+ <File Name="map-cmdline.default" />
+ <File Name="map-cmdline.bisect" />
+ <File Name="map-cmdline.xml" />
+ <File Name="template-vars.txt" />
+ </Component>
+
+ <Directory Id="templates.atomdir" Name="atom">
+ <Component Id="templates.atom" Guid="$(var.templates.atom.guid)" Win64='$(var.IsX64)'>
+ <File Id="atom.changelog.tmpl" Name="changelog.tmpl" KeyPath="yes" />
+ <File Id="atom.changelogentry.tmpl" Name="changelogentry.tmpl" />
+ <File Id="atom.error.tmpl" Name="error.tmpl" />
+ <File Id="atom.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="atom.header.tmpl" Name="header.tmpl" />
+ <File Id="atom.map" Name="map" />
+ <File Id="atom.tagentry.tmpl" Name="tagentry.tmpl" />
+ <File Id="atom.tags.tmpl" Name="tags.tmpl" />
+ <File Id="atom.bookmarks.tmpl" Name="bookmarks.tmpl" />
+ <File Id="atom.bookmarkentry.tmpl" Name="bookmarkentry.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.coaldir" Name="coal">
+ <Component Id="templates.coal" Guid="$(var.templates.coal.guid)" Win64='$(var.IsX64)'>
+ <File Id="coal.header.tmpl" Name="header.tmpl" KeyPath="yes" />
+ <File Id="coal.map" Name="map" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.gitwebdir" Name="gitweb">
+ <Component Id="templates.gitweb" Guid="$(var.templates.gitweb.guid)" Win64='$(var.IsX64)'>
+ <File Id="gitweb.branches.tmpl" Name="branches.tmpl" KeyPath="yes" />
+ <File Id="gitweb.bookmarks.tmpl" Name="bookmarks.tmpl" />
+ <File Id="gitweb.changelog.tmpl" Name="changelog.tmpl" />
+ <File Id="gitweb.changelogentry.tmpl" Name="changelogentry.tmpl" />
+ <File Id="gitweb.changeset.tmpl" Name="changeset.tmpl" />
+ <File Id="gitweb.error.tmpl" Name="error.tmpl" />
+ <File Id="gitweb.fileannotate.tmpl" Name="fileannotate.tmpl" />
+ <File Id="gitweb.filediff.tmpl" Name="filediff.tmpl" />
+ <File Id="gitweb.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="gitweb.filerevision.tmpl" Name="filerevision.tmpl" />
+ <File Id="gitweb.footer.tmpl" Name="footer.tmpl" />
+ <File Id="gitweb.graph.tmpl" Name="graph.tmpl" />
+ <File Id="gitweb.header.tmpl" Name="header.tmpl" />
+ <File Id="gitweb.index.tmpl" Name="index.tmpl" />
+ <File Id="gitweb.manifest.tmpl" Name="manifest.tmpl" />
+ <File Id="gitweb.map" Name="map" />
+ <File Id="gitweb.notfound.tmpl" Name="notfound.tmpl" />
+ <File Id="gitweb.search.tmpl" Name="search.tmpl" />
+ <File Id="gitweb.shortlog.tmpl" Name="shortlog.tmpl" />
+ <File Id="gitweb.summary.tmpl" Name="summary.tmpl" />
+ <File Id="gitweb.tags.tmpl" Name="tags.tmpl" />
+ <File Id="gitweb.help.tmpl" Name="help.tmpl" />
+ <File Id="gitweb.helptopics.tmpl" Name="helptopics.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.monobluedir" Name="monoblue">
+ <Component Id="templates.monoblue" Guid="$(var.templates.monoblue.guid)" Win64='$(var.IsX64)'>
+ <File Id="monoblue.branches.tmpl" Name="branches.tmpl" KeyPath="yes" />
+ <File Id="monoblue.bookmarks.tmpl" Name="bookmarks.tmpl" />
+ <File Id="monoblue.changelog.tmpl" Name="changelog.tmpl" />
+ <File Id="monoblue.changelogentry.tmpl" Name="changelogentry.tmpl" />
+ <File Id="monoblue.changeset.tmpl" Name="changeset.tmpl" />
+ <File Id="monoblue.error.tmpl" Name="error.tmpl" />
+ <File Id="monoblue.fileannotate.tmpl" Name="fileannotate.tmpl" />
+ <File Id="monoblue.filediff.tmpl" Name="filediff.tmpl" />
+ <File Id="monoblue.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="monoblue.filerevision.tmpl" Name="filerevision.tmpl" />
+ <File Id="monoblue.footer.tmpl" Name="footer.tmpl" />
+ <File Id="monoblue.graph.tmpl" Name="graph.tmpl" />
+ <File Id="monoblue.header.tmpl" Name="header.tmpl" />
+ <File Id="monoblue.index.tmpl" Name="index.tmpl" />
+ <File Id="monoblue.manifest.tmpl" Name="manifest.tmpl" />
+ <File Id="monoblue.map" Name="map" />
+ <File Id="monoblue.notfound.tmpl" Name="notfound.tmpl" />
+ <File Id="monoblue.search.tmpl" Name="search.tmpl" />
+ <File Id="monoblue.shortlog.tmpl" Name="shortlog.tmpl" />
+ <File Id="monoblue.summary.tmpl" Name="summary.tmpl" />
+ <File Id="monoblue.tags.tmpl" Name="tags.tmpl" />
+ <File Id="monoblue.help.tmpl" Name="help.tmpl" />
+ <File Id="monoblue.helptopics.tmpl" Name="helptopics.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.paperdir" Name="paper">
+ <Component Id="templates.paper" Guid="$(var.templates.paper.guid)" Win64='$(var.IsX64)'>
+ <File Id="paper.branches.tmpl" Name="branches.tmpl" KeyPath="yes" />
+ <File Id="paper.bookmarks.tmpl" Name="bookmarks.tmpl" />
+ <File Id="paper.changeset.tmpl" Name="changeset.tmpl" />
+ <File Id="paper.diffstat.tmpl" Name="diffstat.tmpl" />
+ <File Id="paper.error.tmpl" Name="error.tmpl" />
+ <File Id="paper.fileannotate.tmpl" Name="fileannotate.tmpl" />
+ <File Id="paper.filediff.tmpl" Name="filediff.tmpl" />
+ <File Id="paper.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="paper.filelogentry.tmpl" Name="filelogentry.tmpl" />
+ <File Id="paper.filerevision.tmpl" Name="filerevision.tmpl" />
+ <File Id="paper.footer.tmpl" Name="footer.tmpl" />
+ <File Id="paper.graph.tmpl" Name="graph.tmpl" />
+ <File Id="paper.header.tmpl" Name="header.tmpl" />
+ <File Id="paper.index.tmpl" Name="index.tmpl" />
+ <File Id="paper.manifest.tmpl" Name="manifest.tmpl" />
+ <File Id="paper.map" Name="map" />
+ <File Id="paper.notfound.tmpl" Name="notfound.tmpl" />
+ <File Id="paper.search.tmpl" Name="search.tmpl" />
+ <File Id="paper.shortlog.tmpl" Name="shortlog.tmpl" />
+ <File Id="paper.shortlogentry.tmpl" Name="shortlogentry.tmpl" />
+ <File Id="paper.tags.tmpl" Name="tags.tmpl" />
+ <File Id="paper.help.tmpl" Name="help.tmpl" />
+ <File Id="paper.helptopics.tmpl" Name="helptopics.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.rawdir" Name="raw">
+ <Component Id="templates.raw" Guid="$(var.templates.raw.guid)" Win64='$(var.IsX64)'>
+ <File Id="raw.changeset.tmpl" Name="changeset.tmpl" KeyPath="yes" />
+ <File Id="raw.error.tmpl" Name="error.tmpl" />
+ <File Id="raw.fileannotate.tmpl" Name="fileannotate.tmpl" />
+ <File Id="raw.filediff.tmpl" Name="filediff.tmpl" />
+ <File Id="raw.index.tmpl" Name="index.tmpl" />
+ <File Id="raw.manifest.tmpl" Name="manifest.tmpl" />
+ <File Id="raw.map" Name="map" />
+ <File Id="raw.notfound.tmpl" Name="notfound.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.rssdir" Name="rss">
+ <Component Id="templates.rss" Guid="$(var.templates.rss.guid)" Win64='$(var.IsX64)'>
+ <File Id="rss.changelog.tmpl" Name="changelog.tmpl" KeyPath="yes" />
+ <File Id="rss.changelogentry.tmpl" Name="changelogentry.tmpl" />
+ <File Id="rss.error.tmpl" Name="error.tmpl" />
+ <File Id="rss.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="rss.filelogentry.tmpl" Name="filelogentry.tmpl" />
+ <File Id="rss.header.tmpl" Name="header.tmpl" />
+ <File Id="rss.map" Name="map" />
+ <File Id="rss.tagentry.tmpl" Name="tagentry.tmpl" />
+ <File Id="rss.tags.tmpl" Name="tags.tmpl" />
+ <File Id="rss.bookmarks.tmpl" Name="bookmarks.tmpl" />
+ <File Id="rss.bookmarkentry.tmpl" Name="bookmarkentry.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.spartandir" Name="spartan">
+ <Component Id="templates.spartan" Guid="$(var.templates.spartan.guid)" Win64='$(var.IsX64)'>
+ <File Id="spartan.branches.tmpl" Name="branches.tmpl" KeyPath="yes" />
+ <File Id="spartan.changelog.tmpl" Name="changelog.tmpl" />
+ <File Id="spartan.changelogentry.tmpl" Name="changelogentry.tmpl" />
+ <File Id="spartan.changeset.tmpl" Name="changeset.tmpl" />
+ <File Id="spartan.error.tmpl" Name="error.tmpl" />
+ <File Id="spartan.fileannotate.tmpl" Name="fileannotate.tmpl" />
+ <File Id="spartan.filediff.tmpl" Name="filediff.tmpl" />
+ <File Id="spartan.filelog.tmpl" Name="filelog.tmpl" />
+ <File Id="spartan.filelogentry.tmpl" Name="filelogentry.tmpl" />
+ <File Id="spartan.filerevision.tmpl" Name="filerevision.tmpl" />
+ <File Id="spartan.footer.tmpl" Name="footer.tmpl" />
+ <File Id="spartan.graph.tmpl" Name="graph.tmpl" />
+ <File Id="spartan.header.tmpl" Name="header.tmpl" />
+ <File Id="spartan.index.tmpl" Name="index.tmpl" />
+ <File Id="spartan.manifest.tmpl" Name="manifest.tmpl" />
+ <File Id="spartan.map" Name="map" />
+ <File Id="spartan.notfound.tmpl" Name="notfound.tmpl" />
+ <File Id="spartan.search.tmpl" Name="search.tmpl" />
+ <File Id="spartan.shortlog.tmpl" Name="shortlog.tmpl" />
+ <File Id="spartan.shortlogentry.tmpl" Name="shortlogentry.tmpl" />
+ <File Id="spartan.tags.tmpl" Name="tags.tmpl" />
+ </Component>
+ </Directory>
+
+ <Directory Id="templates.staticdir" Name="static">
+ <Component Id="templates.static" Guid="$(var.templates.static.guid)" Win64='$(var.IsX64)'>
+ <File Id="static.background.png" Name="background.png" KeyPath="yes" />
+ <File Id="static.coal.file.png" Name="coal-file.png" />
+ <File Id="static.coal.folder.png" Name="coal-folder.png" />
+ <File Id="static.excanvas.js" Name="excanvas.js" />
+ <File Id="static.mercurial.js" Name="mercurial.js" />
+ <File Id="static.hgicon.png" Name="hgicon.png" />
+ <File Id="static.hglogo.png" Name="hglogo.png" />
+ <File Id="static.style.coal.css" Name="style-coal.css" />
+ <File Id="static.style.gitweb.css" Name="style-gitweb.css" />
+ <File Id="static.style.monoblue.css" Name="style-monoblue.css" />
+ <File Id="static.style.paper.css" Name="style-paper.css" />
+ <File Id="static.style.css" Name="style.css" />
+ </Component>
+ </Directory>
+
+ </Directory>
+
+ </DirectoryRef>
+ </Fragment>
+
+ </Wix>
diff --git a/contrib/xml.rnc b/contrib/xml.rnc
new file mode 100644
index 0000000..3426887
--- /dev/null
+++ b/contrib/xml.rnc
@@ -0,0 +1,41 @@
+# RelaxNG schema for "xml" log style
+# Inspired by Subversion's XML log format.
+
+start = log
+node.type = xsd:string {minLength = "40" maxLength = "40"}
+
+log = element log { logentry+ }
+logentry = element logentry {
+ logentry.attlist,
+ branch*, tag*, hgparent*,
+ author, date,
+ msg, paths?, copies?, extra*
+}
+logentry.attlist =
+ attribute revision {xsd:nonNegativeInteger}
+ & attribute node {node.type}
+branch = element branch { text }
+tag = element tag { text }
+hgparent = element parent {hgparent.attlist, text}
+hgparent.attlist =
+ attribute revision {xsd:integer {minInclusive = "-1"} }
+ & attribute node {node.type}
+author = element author { author.attlist, text }
+author.attlist =
+ attribute email {text}
+date = element date {xsd:dateTime}
+msg = element msg {msg.attlist, text}
+msg.attlist =
+ attribute xml:space {"preserve"}
+paths = element paths { path* }
+path = element path { path.attlist, text }
+path.attlist =
+ # Action: (A)dd, (M)odify, (R)emove
+ attribute action {"A"|"M"|"R"}
+copies = element copies { copy+ }
+copy = element copy { copy.attlist, text }
+copy.attlist =
+ attribute source {text}
+extra = element extra {extra.attlist, text}
+extra.attlist =
+ attribute key {text}
diff --git a/contrib/zsh_completion b/contrib/zsh_completion
new file mode 100644
index 0000000..6cbafb2
--- /dev/null
+++ b/contrib/zsh_completion
@@ -0,0 +1,1077 @@
+#compdef hg
+
+# Zsh completion script for mercurial. Rename this file to _hg and copy
+# it into your zsh function path (/usr/share/zsh/site-functions for
+# instance)
+#
+# If you do not want to install it globally, you can copy it somewhere
+# else and add that directory to $fpath. This must be done before
+# compinit is called. If the file is copied to ~/.zsh.d, your ~/.zshrc
+# file could look like this:
+#
+# fpath=("$HOME/.zsh.d" $fpath)
+# autoload -U compinit
+# compinit
+#
+# Copyright (C) 2005, 2006 Steve Borho <steve@borho.org>
+# Copyright (C) 2006-10 Brendan Cully <brendan@kublai.com>
+#
+# Permission is hereby granted, without written agreement and without
+# licence or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall the authors be liable to any party for direct,
+# indirect, special, incidental, or consequential damages arising out of
+# the use of this software and its documentation, even if the authors
+# have been advised of the possibility of such damage.
+#
+# The authors specifically disclaim any warranties, including, but not
+# limited to, the implied warranties of merchantability and fitness for
+# a particular purpose. The software provided hereunder is on an "as
+# is" basis, and the authors have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+
+emulate -LR zsh
+setopt extendedglob
+
+local curcontext="$curcontext" state line
+typeset -A _hg_cmd_globals
+
+_hg() {
+ local cmd _hg_root
+ integer i=2
+ _hg_cmd_globals=()
+
+ while (( i < $#words ))
+ do
+ case "$words[$i]" in
+ -R|--repository)
+ eval _hg_root="$words[$i+1]"
+ _hg_cmd_globals+=("$words[$i]" "$_hg_root")
+ (( i += 2 ))
+ continue
+ ;;
+ -R*)
+ _hg_cmd_globals+="$words[$i]"
+ eval _hg_root="${words[$i]#-R}"
+ (( i++ ))
+ continue
+ ;;
+ --cwd|--config)
+ # pass along arguments to hg completer
+ _hg_cmd_globals+=("$words[$i]" "$words[$i+1]")
+ (( i += 2 ))
+ continue
+ ;;
+ -*)
+ # skip option
+ (( i++ ))
+ continue
+ ;;
+ esac
+ if [[ -z "$cmd" ]]
+ then
+ cmd="$words[$i]"
+ words[$i]=()
+ (( CURRENT-- ))
+ fi
+ (( i++ ))
+ done
+
+ if [[ -z "$cmd" ]]
+ then
+ _arguments -s -w : $_hg_global_opts \
+ ':mercurial command:_hg_commands'
+ return
+ fi
+
+ # resolve abbreviations and aliases
+ if ! (( $+functions[_hg_cmd_${cmd}] ))
+ then
+ local cmdexp
+ (( $#_hg_cmd_list )) || _hg_get_commands
+
+ cmdexp=$_hg_cmd_list[(r)${cmd}*]
+ if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
+ then
+ # might be nice to rewrite the command line with the expansion
+ cmd="$cmdexp"
+ fi
+ if [[ -n $_hg_alias_list[$cmd] ]]
+ then
+ cmd=$_hg_alias_list[$cmd]
+ fi
+ fi
+
+ curcontext="${curcontext%:*:*}:hg-${cmd}:"
+
+ zstyle -s ":completion:$curcontext:" cache-policy update_policy
+
+ if [[ -z "$update_policy" ]]
+ then
+ zstyle ":completion:$curcontext:" cache-policy _hg_cache_policy
+ fi
+
+ if (( $+functions[_hg_cmd_${cmd}] ))
+ then
+ _hg_cmd_${cmd}
+ else
+ # complete unknown commands normally
+ _arguments -s -w : $_hg_global_opts \
+ '*:files:_hg_files'
+ fi
+}
+
+_hg_cache_policy() {
+ typeset -a old
+
+ # cache for a minute
+ old=( "$1"(mm+10) )
+ (( $#old )) && return 0
+
+ return 1
+}
+
+_hg_get_commands() {
+ typeset -ga _hg_cmd_list
+ typeset -gA _hg_alias_list
+ local hline cmd cmdalias
+
+ _call_program hg hg debugcomplete -v | while read -A hline
+ do
+ cmd=$hline[1]
+ _hg_cmd_list+=($cmd)
+
+ for cmdalias in $hline[2,-1]
+ do
+ _hg_cmd_list+=($cmdalias)
+ _hg_alias_list+=($cmdalias $cmd)
+ done
+ done
+}
+
+_hg_commands() {
+ (( $#_hg_cmd_list )) || _hg_get_commands
+ _describe -t commands 'mercurial command' _hg_cmd_list
+}
+
+_hg_revrange() {
+ compset -P 1 '*:'
+ _hg_labels "$@"
+}
+
+_hg_labels() {
+ _hg_tags "$@"
+ _hg_bookmarks "$@"
+ _hg_branches "$@"
+}
+
+_hg_tags() {
+ typeset -a tags
+ local tag rev
+
+ _hg_cmd tags | while read tag
+ do
+ tags+=(${tag/ # [0-9]#:*})
+ done
+ (( $#tags )) && _describe -t tags 'tags' tags
+}
+
+_hg_bookmarks() {
+ typeset -a bookmark bookmarks
+
+ _hg_cmd bookmarks | while read -A bookmark
+ do
+ if test -z ${bookmark[-1]:#[0-9]*}
+ then
+ bookmarks+=($bookmark[-2])
+ fi
+ done
+ (( $#bookmarks )) && _describe -t bookmarks 'bookmarks' bookmarks
+}
+
+_hg_branches() {
+ typeset -a branches
+ local branch
+
+ _hg_cmd branches | while read branch
+ do
+ branches+=(${branch/ # [0-9]#:*})
+ done
+ (( $#branches )) && _describe -t branches 'branches' branches
+}
+
+# likely merge candidates
+_hg_mergerevs() {
+ typeset -a heads
+ local myrev
+
+ heads=(${(f)"$(_hg_cmd heads --template '{rev}\\n')"})
+ # exclude own revision
+ myrev=$(_hg_cmd log -r . --template '{rev}\\n')
+ heads=(${heads:#$myrev})
+
+ (( $#heads )) && _describe -t heads 'heads' heads
+}
+
+_hg_files() {
+ if [[ -n "$_hg_root" ]]
+ then
+ [[ -d "$_hg_root/.hg" ]] || return
+ case "$_hg_root" in
+ /*)
+ _files -W $_hg_root
+ ;;
+ *)
+ _files -W $PWD/$_hg_root
+ ;;
+ esac
+ else
+ _files
+ fi
+}
+
+_hg_status() {
+ [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
+ status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 ./$PREFIX)"})
+}
+
+_hg_unknown() {
+ typeset -a status_files
+ _hg_status u
+ _wanted files expl 'unknown files' _multi_parts / status_files
+}
+
+_hg_missing() {
+ typeset -a status_files
+ _hg_status d
+ _wanted files expl 'missing files' _multi_parts / status_files
+}
+
+_hg_modified() {
+ typeset -a status_files
+ _hg_status m
+ _wanted files expl 'modified files' _multi_parts / status_files
+}
+
+_hg_resolve() {
+ local rstate rpath
+
+ [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
+
+ _hg_cmd resolve -l ./$PREFIX | while read rstate rpath
+ do
+ [[ $rstate == 'R' ]] && resolved_files+=($rpath)
+ [[ $rstate == 'U' ]] && unresolved_files+=($rpath)
+ done
+}
+
+_hg_resolved() {
+ typeset -a resolved_files unresolved_files
+ _hg_resolve
+ _wanted files expl 'resolved files' _multi_parts / resolved_files
+}
+
+_hg_unresolved() {
+ typeset -a resolved_files unresolved_files
+ _hg_resolve
+ _wanted files expl 'unresolved files' _multi_parts / unresolved_files
+}
+
+_hg_config() {
+ typeset -a items
+ items=(${${(%f)"$(_call_program hg hg showconfig)"}%%\=*})
+ (( $#items )) && _describe -t config 'config item' items
+}
+
+_hg_addremove() {
+ _alternative 'files:unknown files:_hg_unknown' \
+ 'files:missing files:_hg_missing'
+}
+
+_hg_ssh_urls() {
+ if [[ -prefix */ ]]
+ then
+ if zstyle -T ":completion:${curcontext}:files" remote-access
+ then
+ local host=${PREFIX%%/*}
+ typeset -a remdirs
+ compset -p $(( $#host + 1 ))
+ local rempath=${(M)PREFIX##*/}
+ local cacheid="hg:${host}-${rempath//\//_}"
+ cacheid=${cacheid%[-_]}
+ compset -P '*/'
+ if _cache_invalid "$cacheid" || ! _retrieve_cache "$cacheid"
+ then
+ remdirs=(${${(M)${(f)"$(_call_program files ssh -a -x $host ls -1FL "${(q)rempath}")"}##*/}%/})
+ _store_cache "$cacheid" remdirs
+ fi
+ _describe -t directories 'remote directory' remdirs -S/
+ else
+ _message 'remote directory'
+ fi
+ else
+ if compset -P '*@'
+ then
+ _hosts -S/
+ else
+ _alternative 'hosts:remote host name:_hosts -S/' \
+ 'users:user:_users -S@'
+ fi
+ fi
+}
+
+_hg_urls() {
+ if compset -P bundle://
+ then
+ _files
+ elif compset -P ssh://
+ then
+ _hg_ssh_urls
+ elif [[ -prefix *: ]]
+ then
+ _urls
+ else
+ local expl
+ compset -S '[^:]*'
+ _wanted url-schemas expl 'URL schema' compadd -S '' - \
+ http:// https:// ssh:// bundle://
+ fi
+}
+
+_hg_paths() {
+ typeset -a paths pnames
+ _hg_cmd paths | while read -A pnames
+ do
+ paths+=($pnames[1])
+ done
+ (( $#paths )) && _describe -t path-aliases 'repository alias' paths
+}
+
+_hg_remote() {
+ _alternative 'path-aliases:repository alias:_hg_paths' \
+ 'directories:directory:_files -/' \
+ 'urls:URL:_hg_urls'
+}
+
+_hg_clone_dest() {
+ _alternative 'directories:directory:_files -/' \
+ 'urls:URL:_hg_urls'
+}
+
+# Common options
+_hg_global_opts=(
+ '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
+ '--cwd[change working directory]:new working directory:_files -/'
+ '(--noninteractive -y)'{-y,--noninteractive}'[do not prompt, assume yes for any required answers]'
+ '(--verbose -v)'{-v,--verbose}'[enable additional output]'
+ '*--config[set/override config option]:defined config items:_hg_config'
+ '(--quiet -q)'{-q,--quiet}'[suppress output]'
+ '(--help -h)'{-h,--help}'[display help and exit]'
+ '--debug[debug mode]'
+ '--debugger[start debugger]'
+ '--encoding[set the charset encoding]'
+ '--encodingmode[set the charset encoding mode]'
+ '--lsprof[print improved command execution profile]'
+ '--traceback[print traceback on exception]'
+ '--time[time how long the command takes]'
+ '--profile[profile]'
+ '--version[output version information and exit]'
+)
+
+_hg_pat_opts=(
+ '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
+ '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
+
+_hg_diff_opts=(
+ '(--text -a)'{-a,--text}'[treat all files as text]'
+ '(--git -g)'{-g,--git}'[use git extended diff format]'
+ "--nodates[omit dates from diff headers]")
+
+_hg_dryrun_opts=(
+ '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
+
+_hg_style_opts=(
+ '--style[display using template map file]:'
+ '--template[display with template]:')
+
+_hg_commit_opts=(
+ '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
+ '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
+ '(-e --edit -m --message --logfile -l)'{-l+,--logfile}'[read the commit message from <file>]:log file:_files')
+
+_hg_remote_opts=(
+ '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
+ '--remotecmd[specify hg command to run on the remote side]:')
+
+_hg_cmd() {
+ _call_program hg HGPLAIN=1 hg "$_hg_cmd_globals[@]" "$@" 2> /dev/null
+}
+
+_hg_cmd_add() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+ '*:unknown files:_hg_unknown'
+}
+
+_hg_cmd_addremove() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+ '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
+ '*:unknown or missing files:_hg_addremove'
+}
+
+_hg_cmd_annotate() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--rev -r)'{-r+,--rev}'[annotate the specified revision]:revision:_hg_labels' \
+ '(--follow -f)'{-f,--follow}'[follow file copies and renames]' \
+ '(--text -a)'{-a,--text}'[treat all files as text]' \
+ '(--user -u)'{-u,--user}'[list the author]' \
+ '(--date -d)'{-d,--date}'[list the date]' \
+ '(--number -n)'{-n,--number}'[list the revision number (default)]' \
+ '(--changeset -c)'{-c,--changeset}'[list the changeset]' \
+ '*:files:_hg_files'
+}
+
+_hg_cmd_archive() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '--no-decode[do not pass files through decoders]' \
+ '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
+ '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_labels' \
+ '(--type -t)'{-t+,--type}'[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
+ '*:destination:_files'
+}
+
+_hg_cmd_backout() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '--merge[merge with old dirstate parent after backout]' \
+ '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
+ '--parent[parent to choose when backing out merge]' \
+ '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
+ '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+ '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
+ '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt'
+}
+
+_hg_cmd_bisect() {
+ _arguments -s -w : $_hg_global_opts \
+ '(-)'{-r,--reset}'[reset bisect state]' \
+ '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_labels \
+ '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_labels \
+ '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
+ '(--command -c --noupdate -U)'{-c+,--command}'[use command to check changeset state]':commands:_command_names \
+ '(--command -c --noupdate -U)'{-U,--noupdate}'[do not update to target]'
+}
+
+_hg_cmd_bookmarks() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--force -f)'{-f,--force}'[force]' \
+ '(--rev -r --delete -d --rename -m)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+ '(--rev -r --delete -d --rename -m)'{-d,--delete}'[delete a given bookmark]' \
+ '(--rev -r --delete -d --rename -m)'{-m+,--rename}'[rename a given bookmark]:bookmark:_hg_bookmarks' \
+ ':bookmark:_hg_bookmarks'
+}
+
+_hg_cmd_branch() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--force -f)'{-f,--force}'[set branch name even if it shadows an existing branch]' \
+ '(--clean -C)'{-C,--clean}'[reset branch name to parent branch name]'
+}
+
+_hg_cmd_branches() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
+}
+
+_hg_cmd_bundle() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
+ '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_labels' \
+ ':output file:_files' \
+ ':destination repository:_files -/'
+}
+
+_hg_cmd_cat() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
+ '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+ '*:file:_hg_files'
+}
+
+_hg_cmd_clone() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
+ '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
+ '--uncompressed[use uncompressed transfer (fast over LAN)]' \
+ ':source repository:_hg_remote' \
+ ':destination:_hg_clone_dest'
+}
+
+_hg_cmd_commit() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
+ '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
+ '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
+ '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
+ '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
+ '--amend[amend the parent of the working dir]' \
+ '*:file:_hg_files'
+}
+
+_hg_cmd_copy() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+ '(--after -A)'{-A,--after}'[record a copy that has already occurred]' \
+ '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
+ '*:file:_hg_files'
+}
+
+_hg_cmd_diff() {
+ typeset -A opt_args
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
+ '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
+ '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
+ '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
+ '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
+ '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
+ '*:file:->diff_files'
+
+ if [[ $state == 'diff_files' ]]
+ then
+ if [[ -n $opt_args[-r] ]]
+ then
+ _hg_files
+ else
+ _hg_modified
+ fi
+ fi
+}
+
+_hg_cmd_export() {
+ _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
+ '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
+ '--switch-parent[diff against the second parent]' \
+ '*:revision:_hg_labels'
+}
+
+_hg_cmd_graft() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--continue -c)'{-c,--continue}'[resume interrupted graft]' \
+ '(--edit -e)'{-e,--edit}'[invoke editor on commit messages]' \
+ '--log[append graft info to log message]' \
+ '(--currentdate -D)'{-D,--currentdate}'[record the current date as commit date]' \
+ '(--currentuser -U)'{-U,--currentuser}'[record the current user as committer]' \
+ '(--date -d)'{-d,--date}'[record the specified date as commit date]' \
+ '(--user -u)'{-u,--user}'[record the specified user as committer]' \
+ '(--tool -t)'{-t,--tool}'[specify merge tool]' \
+ '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]' \
+ '*:revision:_hg_labels'
+}
+
+_hg_cmd_grep() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--print0 -0)'{-0,--print0}'[end filenames with NUL]' \
+ '--all[print all revisions with matches]' \
+ '(--follow -f)'{-f,--follow}'[follow changeset or file history]' \
+ '(--ignore-case -i)'{-i,--ignore-case}'[ignore case when matching]' \
+ '(--files-with-matches -l)'{-l,--files-with-matches}'[print only filenames and revs that match]' \
+ '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
+ '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
+ '(--user -u)'{-u,--user}'[print user who committed change]' \
+ '1:search pattern:' \
+ '*:files:_hg_files'
+}
+
+_hg_cmd_heads() {
+ _arguments -s -w : $_hg_global_opts $_hg_style_opts \
+ '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_labels'
+}
+
+_hg_cmd_help() {
+ _arguments -s -w : $_hg_global_opts \
+ '*:mercurial command:_hg_commands'
+}
+
+_hg_cmd_identify() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_labels' \
+ '(--num -n)'{-n+,--num}'[show local revision number]' \
+ '(--id -i)'{-i+,--id}'[show global revision id]' \
+ '(--branch -b)'{-b+,--branch}'[show branch]' \
+ '(--tags -t)'{-t+,--tags}'[show tags]'
+}
+
+_hg_cmd_import() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
+ '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
+ '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
+ '--bypass[apply patch without touching the working directory]' \
+ '*:patch:_files'
+}
+
+_hg_cmd_incoming() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
+ '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
+ '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
+ '(--patch -p)'{-p,--patch}'[show patch]' \
+ '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
+ '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
+ '--bundle[file to store the bundles into]:bundle file:_files' \
+ ':source:_hg_remote'
+}
+
+_hg_cmd_init() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ ':dir:_files -/'
+}
+
+_hg_cmd_locate() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--rev -r)'{-r+,--rev}'[search repository as it stood at revision]:revision:_hg_labels' \
+ '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
+ '(--fullpath -f)'{-f,--fullpath}'[print complete paths]' \
+ '*:search pattern:_hg_files'
+}
+
+_hg_cmd_log() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
+ '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
+ '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
+ '(--copies -C)'{-C,--copies}'[show copied files]' \
+ '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
+ '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
+ '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
+ '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
+ '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
+ '(--patch -p)'{-p,--patch}'[show patch]' \
+ '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_labels' \
+ '(--branch -b)'{-b+,--branch}'[show changesets within the given named branch]:branch:_hg_branches' \
+ '*:files:_hg_files'
+}
+
+_hg_cmd_manifest() {
+ _arguments -s -w : $_hg_global_opts \
+ '--all[list files from all revisions]' \
+ ':revision:_hg_labels'
+}
+
+_hg_cmd_merge() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
+ '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
+ '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
+ '(--tool -t)'{-t,--tool}'[specify merge tool]' \
+ ':revision:_hg_mergerevs'
+}
+
+_hg_cmd_outgoing() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
+ '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
+ '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
+ '(--patch -p)'{-p,--patch}'[show patch]' \
+ '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
+ '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
+ ':destination:_hg_remote'
+}
+
+_hg_cmd_parents() {
+ _arguments -s -w : $_hg_global_opts $_hg_style_opts \
+ '(--rev -r)'{-r+,--rev}'[show parents of the specified rev]:revision:_hg_labels' \
+ ':last modified file:_hg_files'
+}
+
+_hg_cmd_paths() {
+ _arguments -s -w : $_hg_global_opts \
+ ':path:_hg_paths'
+}
+
+_hg_cmd_phase() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--public -p)'{-p,--public}'[set changeset phase to public]' \
+ '(--draft -d)'{-d,--draft}'[set changeset phase to draft]' \
+ '(--secret -s)'{-s,--secret}'[set changeset phase to secret]' \
+ '(--force -f)'{-f,--force}'[allow to move boundary backward]' \
+ '(--rev -r)'{-r+,--rev}'[target revision]:revision:_hg_labels' \
+ ':revision:_hg_labels'
+}
+
+_hg_cmd_pull() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
+ '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
+ '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
+ ':source:_hg_remote'
+}
+
+_hg_cmd_push() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ '(--force -f)'{-f,--force}'[force push]' \
+ '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_labels' \
+ ':destination:_hg_remote'
+}
+
+_hg_cmd_remove() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--after -A)'{-A,--after}'[record remove that has already occurred]' \
+ '(--force -f)'{-f,--force}'[remove file even if modified]' \
+ '*:file:_hg_files'
+}
+
+_hg_cmd_rename() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+ '(--after -A)'{-A,--after}'[record a rename that has already occurred]' \
+ '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
+ '*:file:_hg_files'
+}
+
+_hg_cmd_resolve() {
+ local context state line
+ typeset -A opt_args
+
+ _arguments -s -w : $_hg_global_opts \
+ '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
+ '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
+ '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
+ '*:file:_hg_unresolved'
+
+ if [[ $state == 'resolve_files' ]]
+ then
+ _alternative 'files:resolved files:_hg_resolved' \
+ 'files:unresolved files:_hg_unresolved'
+ fi
+}
+
+_hg_cmd_revert() {
+ local context state line
+ typeset -A opt_args
+
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
+ '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
+ '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_labels' \
+ '(--no-backup -C)'{-C,--no-backup}'[do not save backup copies of files]' \
+ '*:file:->diff_files'
+
+ if [[ $state == 'diff_files' ]]
+ then
+ if [[ -n $opt_args[-r] ]]
+ then
+ _hg_files
+ else
+ typeset -a status_files
+ _hg_status mard
+ _wanted files expl 'modified, added, removed or deleted file' _multi_parts / status_files
+ fi
+ fi
+}
+
+_hg_cmd_serve() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
+ '(--errorlog -E)'{-E+,--errorlog}'[name of error log file]:log file:_files' \
+ '(--daemon -d)'{-d,--daemon}'[run server in background]' \
+ '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
+ '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
+ '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
+ '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
+ '--style[web template style]:style' \
+ '--stdio[for remote clients]' \
+ '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
+}
+
+_hg_cmd_showconfig() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--untrusted -u)'{-u+,--untrusted}'[show untrusted configuration options]' \
+ ':config item:_hg_config'
+}
+
+_hg_cmd_status() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '(--all -A)'{-A,--all}'[show status of all files]' \
+ '(--modified -m)'{-m,--modified}'[show only modified files]' \
+ '(--added -a)'{-a,--added}'[show only added files]' \
+ '(--removed -r)'{-r,--removed}'[show only removed files]' \
+ '(--deleted -d)'{-d,--deleted}'[show only deleted (but tracked) files]' \
+ '(--clean -c)'{-c,--clean}'[show only files without changes]' \
+ '(--unknown -u)'{-u,--unknown}'[show only unknown files]' \
+ '(--ignored -i)'{-i,--ignored}'[show ignored files]' \
+ '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
+ '(--copies -C)'{-C,--copies}'[show source of copied files]' \
+ '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
+ '--rev[show difference from revision]:revision:_hg_labels' \
+ '*:files:_files'
+}
+
+_hg_cmd_summary() {
+ _arguments -s -w : $_hg_global_opts \
+ '--remote[check for push and pull]'
+}
+
+_hg_cmd_tag() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--local -l)'{-l,--local}'[make the tag local]' \
+ '(--message -m)'{-m+,--message}'[message for tag commit log entry]:message:' \
+ '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
+ '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
+ '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_labels' \
+ ':tag name:'
+}
+
+_hg_cmd_tip() {
+ _arguments -s -w : $_hg_global_opts $_hg_style_opts \
+ '(--patch -p)'{-p,--patch}'[show patch]'
+}
+
+_hg_cmd_unbundle() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--update -u)'{-u,--update}'[update to new tip if changesets were unbundled]' \
+ ':files:_files'
+}
+
+_hg_cmd_update() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
+ '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_labels' \
+ ':revision:_hg_labels'
+}
+
+## extensions ##
+
+# HGK
+_hg_cmd_view() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
+ ':revision range:_hg_tags'
+}
+
+# MQ
+_hg_qseries() {
+ typeset -a patches
+ patches=(${(f)"$(_hg_cmd qseries)"})
+ (( $#patches )) && _describe -t hg-patches 'patches' patches
+}
+
+_hg_qapplied() {
+ typeset -a patches
+ patches=(${(f)"$(_hg_cmd qapplied)"})
+ if (( $#patches ))
+ then
+ patches+=(qbase qtip)
+ _describe -t hg-applied-patches 'applied patches' patches
+ fi
+}
+
+_hg_qunapplied() {
+ typeset -a patches
+ patches=(${(f)"$(_hg_cmd qunapplied)"})
+ (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
+}
+
+# unapplied, including guarded patches
+_hg_qdeletable() {
+ typeset -a unapplied
+ unapplied=(${(f)"$(_hg_cmd qseries)"})
+ for p in $(_hg_cmd qapplied)
+ do
+ unapplied=(${unapplied:#$p})
+ done
+
+ (( $#unapplied )) && _describe -t hg-allunapplied-patches 'all unapplied patches' unapplied
+}
+
+_hg_qguards() {
+ typeset -a guards
+ local guard
+ compset -P "+|-"
+ _hg_cmd qselect -s | while read guard
+ do
+ guards+=(${guard#(+|-)})
+ done
+ (( $#guards )) && _describe -t hg-guards 'guards' guards
+}
+
+_hg_qseries_opts=(
+ '(--summary -s)'{-s,--summary}'[print first line of patch header]')
+
+_hg_cmd_qapplied() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+}
+
+_hg_cmd_qdelete() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--keep -k)'{-k,--keep}'[keep patch file]' \
+ '*'{-r+,--rev}'[stop managing a revision]:applied patch:_hg_revrange' \
+ '*:unapplied patch:_hg_qdeletable'
+}
+
+_hg_cmd_qdiff() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
+ '*:pattern:_hg_files'
+}
+
+_hg_cmd_qfinish() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--applied -a)'{-a,--applied}'[finish all applied patches]' \
+ '*:patch:_hg_qapplied'
+}
+
+_hg_cmd_qfold() {
+ _arguments -s -w : $_hg_global_opts $_h_commit_opts \
+ '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
+ '*:unapplied patch:_hg_qunapplied'
+}
+
+_hg_cmd_qgoto() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--force -f)'{-f,--force}'[overwrite any local changes]' \
+ ':patch:_hg_qseries'
+}
+
+_hg_cmd_qguard() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--list -l)'{-l,--list}'[list all patches and guards]' \
+ '(--none -n)'{-n,--none}'[drop all guards]' \
+ ':patch:_hg_qseries' \
+ '*:guards:_hg_qguards'
+}
+
+_hg_cmd_qheader() {
+ _arguments -s -w : $_hg_global_opts \
+ ':patch:_hg_qseries'
+}
+
+_hg_cmd_qimport() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
+ '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
+ '(--force -f)'{-f,--force}'[overwrite existing files]' \
+ '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
+ '*:patch:_files'
+}
+
+_hg_cmd_qnew() {
+ _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
+ '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
+ ':patch:'
+}
+
+_hg_cmd_qnext() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+}
+
+_hg_cmd_qpop() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--all -a :)'{-a,--all}'[pop all patches]' \
+ '(--name -n)'{-n+,--name}'[queue name to pop]:' \
+ '(--force -f)'{-f,--force}'[forget any local changes]' \
+ ':patch:_hg_qapplied'
+}
+
+_hg_cmd_qprev() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+}
+
+_hg_cmd_qpush() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--all -a :)'{-a,--all}'[apply all patches]' \
+ '(--list -l)'{-l,--list}'[list patch name in commit text]' \
+ '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
+ '(--name -n)'{-n+,--name}'[merge queue name]:' \
+ '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
+ '(--exact -e)'{-e,--exact}'[apply the target patch to its recorded parent]' \
+ '--move[reorder patch series and apply only the patch]' \
+ ':patch:_hg_qunapplied'
+}
+
+_hg_cmd_qrefresh() {
+ _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
+ '(--git -g)'{-g,--git}'[use git extended diff format]' \
+ '(--short -s)'{-s,--short}'[short refresh]' \
+ '*:files:_hg_files'
+}
+
+_hg_cmd_qrename() {
+ _arguments -s -w : $_hg_global_opts \
+ ':patch:_hg_qseries' \
+ ':destination:'
+}
+
+_hg_cmd_qselect() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--none -n :)'{-n,--none}'[disable all guards]' \
+ '(--series -s :)'{-s,--series}'[list all guards in series file]' \
+ '--pop[pop to before first guarded applied patch]' \
+ '--reapply[pop and reapply patches]' \
+ '*:guards:_hg_qguards'
+}
+
+_hg_cmd_qseries() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
+ '(--missing -m)'{-m,--missing}'[print patches not in series]'
+}
+
+_hg_cmd_qunapplied() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+}
+
+_hg_cmd_qtop() {
+ _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
+}
+
+_hg_cmd_strip() {
+ _arguments -s -w : $_hg_global_opts \
+ '(--force -f)'{-f,--force}'[force multi-head removal]' \
+ '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
+ '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
+ ':revision:_hg_labels'
+}
+
+# Patchbomb
+_hg_cmd_email() {
+ _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
+ '(--git -g)'{-g,--git}'[use git extended diff format]' \
+ '--plain[omit hg patch header]' \
+ '--body[send patches as inline message text (default)]' \
+ '(--outgoing -o)'{-o,--outgoing}'[send changes not found in the target repository]' \
+ '(--bundle -b)'{-b,--bundle}'[send changes not in target as a binary bundle]' \
+ '--bundlename[name of the bundle attachment file (default: bundle)]:' \
+ '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
+ '--force[run even when remote repository is unrelated (with -b/--bundle)]' \
+ '*--base[a base changeset to specify instead of a destination (with -b/--bundle)]:revision:_hg_labels' \
+ '--intro[send an introduction email for a single patch]' \
+ '(--inline -i --attach -a)'{-a,--attach}'[send patches as attachments]' \
+ '(--attach -a --inline -i)'{-i,--inline}'[send patches as inline attachments]' \
+ '*--bcc[email addresses of blind carbon copy recipients]:email:' \
+ '*'{-c+,--cc}'[email addresses of copy recipients]:email:' \
+ '(--diffstat -d)'{-d,--diffstat}'[add diffstat output to messages]' \
+ '--date[use the given date as the sending date]:date:' \
+ '--desc[use the given file as the series description]:files:_files' \
+ '(--from -f)'{-f,--from}'[email address of sender]:email:' \
+ '(--test -n)'{-n,--test}'[print messages that would be sent]' \
+ '(--mbox -m)'{-m,--mbox}'[write messages to mbox file instead of sending them]:file:' \
+ '*--reply-to[email addresses replies should be sent to]:email:' \
+ '(--subject -s)'{-s,--subject}'[subject of first message (intro or single patch)]:subject:' \
+ '--in-reply-to[message identifier to reply to]:msgid:' \
+ '*--flag[flags to add in subject prefixes]:flag:' \
+ '*'{-t,--to}'[email addresses of recipients]:email:' \
+ ':revision:_hg_revrange'
+}
+
+# Rebase
+_hg_cmd_rebase() {
+ _arguments -s -w : $_hg_global_opts \
+ '*'{-r,--rev}'[rebase these revisions]:revision:_hg_revrange' \
+ '(--source -s)'{-s,--source}'[rebase from the specified changeset]:revision:_hg_labels' \
+ '(--base -b)'{-b,--base}'[rebase from the base of the specified changeset]:revision:_hg_labels' \
+ '(--dest -d)'{-d,--dest}'[rebase onto the specified changeset]' \
+ '--collapse[collapse the rebased changeset]' \
+ '(--message -m)'{-m+,--message}'[use <text> as collapse commit message]:text:' \
+ '(--edit -e)'{-e,--edit}'[invoke editor on commit messages]' \
+ '(--logfile -l)'{-l+,--logfile}'[read collapse commit message from <file>]:log file:_files -g \*.txt' \
+ '--keep[keep original changeset]' \
+ '--keepbranches[keep original branch name]' \
+ '(--tool -t)'{-t,--tool}'[specify merge tool]' \
+ '(--continue -c)'{-c,--continue}'[continue an interrupted rebase]' \
+ '(--abort -a)'{-a,--abort}'[abort an interrupted rebase]' \
+}
+
+_hg "$@"
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 0000000..fbf7a1f
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,55 @@
+SOURCES=$(wildcard *.[0-9].txt)
+MAN=$(SOURCES:%.txt=%)
+HTML=$(SOURCES:%.txt=%.html)
+GENDOC=gendoc.py ../mercurial/commands.py ../mercurial/help.py \
+ ../mercurial/help/*.txt ../hgext/*.py ../hgext/*/__init__.py
+PREFIX=/usr/local
+MANDIR=$(PREFIX)/share/man
+INSTALL=install -c -m 644
+PYTHON=python
+RSTARGS=
+
+export LANGUAGE=C
+export LC_ALL=C
+
+all: man html
+
+man: $(MAN)
+
+html: $(HTML)
+
+hg.1.txt: hg.1.gendoc.txt
+ touch hg.1.txt
+
+hg.1.gendoc.txt: $(GENDOC)
+ ${PYTHON} gendoc.py > $@.tmp
+ mv $@.tmp $@
+
+hgrc.5: ../mercurial/help/config.txt
+
+hgrc.5.html: ../mercurial/help/config.txt
+
+%: %.txt common.txt
+ $(PYTHON) runrst hgmanpage $(RSTARGS) --halt warning \
+ --strip-elements-with-class htmlonly $*.txt $*
+
+%.html: %.txt common.txt
+ $(PYTHON) runrst html $(RSTARGS) --halt warning \
+ --link-stylesheet --stylesheet-path style.css $*.txt $*.html
+
+MANIFEST: man html
+# tracked files are already in the main MANIFEST
+ $(RM) $@
+ for i in $(MAN) $(HTML); do \
+ echo "doc/$$i" >> $@ ; \
+ done
+
+install: man
+ for i in $(MAN) ; do \
+ subdir=`echo $$i | sed -n 's/^.*\.\([0-9]\)$$/man\1/p'` ; \
+ mkdir -p $(DESTDIR)$(MANDIR)/$$subdir ; \
+ $(INSTALL) $$i $(DESTDIR)$(MANDIR)/$$subdir ; \
+ done
+
+clean:
+ $(RM) $(MAN) $(HTML) hg.1.gendoc.txt MANIFEST
diff --git a/doc/README b/doc/README
new file mode 100644
index 0000000..d7ff31b
--- /dev/null
+++ b/doc/README
@@ -0,0 +1,11 @@
+Mercurial's documentation is kept in reStructuredText format, which is
+a simple plain text format that's easy to read and edit:
+
+ http://docutils.sourceforge.net/rst.html
+
+It's also convertible to a variety of other formats including standard
+UNIX man page format and HTML. You'll need to install Docutils:
+
+ http://docutils.sourceforge.net/
+
+Use the Makefile in this directory to generate the man and HTML pages.
diff --git a/doc/common.txt b/doc/common.txt
new file mode 100644
index 0000000..936fc20
--- /dev/null
+++ b/doc/common.txt
@@ -0,0 +1,8 @@
+.. Common link and substitution definitions.
+
+.. |hg(1)| replace:: **hg**\ (1)
+.. _hg(1): hg.1.html
+.. |hgrc(5)| replace:: **hgrc**\ (5)
+.. _hgrc(5): hgrc.5.html
+.. |hgignore(5)| replace:: **hgignore**\ (5)
+.. _hgignore(5): hgignore.5.html
diff --git a/doc/gendoc.py b/doc/gendoc.py
new file mode 100644
index 0000000..ab8e9b6
--- /dev/null
+++ b/doc/gendoc.py
@@ -0,0 +1,168 @@
+import os, sys, textwrap
+# import from the live mercurial repo
+sys.path.insert(0, "..")
+# fall back to pure modules if required C extensions are not available
+sys.path.append(os.path.join('..', 'mercurial', 'pure'))
+from mercurial import demandimport; demandimport.enable()
+from mercurial import encoding
+from mercurial.commands import table, globalopts
+from mercurial.i18n import _
+from mercurial.help import helptable
+from mercurial import extensions
+from mercurial import util
+
+def get_desc(docstr):
+ if not docstr:
+ return "", ""
+ # sanitize
+ docstr = docstr.strip("\n")
+ docstr = docstr.rstrip()
+ shortdesc = docstr.splitlines()[0].strip()
+
+ i = docstr.find("\n")
+ if i != -1:
+ desc = docstr[i + 2:]
+ else:
+ desc = shortdesc
+
+ desc = textwrap.dedent(desc)
+
+ return (shortdesc, desc)
+
+def get_opts(opts):
+ for opt in opts:
+ if len(opt) == 5:
+ shortopt, longopt, default, desc, optlabel = opt
+ else:
+ shortopt, longopt, default, desc = opt
+ allopts = []
+ if shortopt:
+ allopts.append("-%s" % shortopt)
+ if longopt:
+ allopts.append("--%s" % longopt)
+ desc += default and _(" (default: %s)") % default or ""
+ yield (", ".join(allopts), desc)
+
+def get_cmd(cmd, cmdtable):
+ d = {}
+ attr = cmdtable[cmd]
+ cmds = cmd.lstrip("^").split("|")
+
+ d['cmd'] = cmds[0]
+ d['aliases'] = cmd.split("|")[1:]
+ d['desc'] = get_desc(attr[0].__doc__)
+ d['opts'] = list(get_opts(attr[1]))
+
+ s = 'hg ' + cmds[0]
+ if len(attr) > 2:
+ if not attr[2].startswith('hg'):
+ s += ' ' + attr[2]
+ else:
+ s = attr[2]
+ d['synopsis'] = s.strip()
+
+ return d
+
+def section(ui, s):
+ ui.write("%s\n%s\n\n" % (s, "\"" * encoding.colwidth(s)))
+
+def subsection(ui, s):
+ ui.write("%s\n%s\n\n" % (s, '=' * encoding.colwidth(s)))
+
+def subsubsection(ui, s):
+ ui.write("%s\n%s\n\n" % (s, "-" * encoding.colwidth(s)))
+
+def subsubsubsection(ui, s):
+ ui.write("%s\n%s\n\n" % (s, "." * encoding.colwidth(s)))
+
+
+def show_doc(ui):
+ # print options
+ section(ui, _("Options"))
+ for optstr, desc in get_opts(globalopts):
+ ui.write("%s\n %s\n\n" % (optstr, desc))
+
+ # print cmds
+ section(ui, _("Commands"))
+ commandprinter(ui, table, subsection)
+
+ # print topics
+ for names, sec, doc in helptable:
+ if names[0] == "config":
+ # The config help topic is included in the hgrc.5 man
+ # page.
+ continue
+ for name in names:
+ ui.write(".. _%s:\n" % name)
+ ui.write("\n")
+ section(ui, sec)
+ if util.safehasattr(doc, '__call__'):
+ doc = doc()
+ ui.write(doc)
+ ui.write("\n")
+
+ section(ui, _("Extensions"))
+ ui.write(_("This section contains help for extensions that are "
+ "distributed together with Mercurial. Help for other "
+ "extensions is available in the help system."))
+ ui.write("\n\n"
+ ".. contents::\n"
+ " :class: htmlonly\n"
+ " :local:\n"
+ " :depth: 1\n\n")
+
+ for extensionname in sorted(allextensionnames()):
+ mod = extensions.load(None, extensionname, None)
+ subsection(ui, extensionname)
+ ui.write("%s\n\n" % mod.__doc__)
+ cmdtable = getattr(mod, 'cmdtable', None)
+ if cmdtable:
+ subsubsection(ui, _('Commands'))
+ commandprinter(ui, cmdtable, subsubsubsection)
+
+def commandprinter(ui, cmdtable, sectionfunc):
+ h = {}
+ for c, attr in cmdtable.items():
+ f = c.split("|")[0]
+ f = f.lstrip("^")
+ h[f] = c
+ cmds = h.keys()
+ cmds.sort()
+
+ for f in cmds:
+ if f.startswith("debug"):
+ continue
+ d = get_cmd(h[f], cmdtable)
+ sectionfunc(ui, d['cmd'])
+ # synopsis
+ ui.write("::\n\n")
+ synopsislines = d['synopsis'].splitlines()
+ for line in synopsislines:
+ # some commands (such as rebase) have a multi-line
+ # synopsis
+ ui.write(" %s\n" % line)
+ ui.write('\n')
+ # description
+ ui.write("%s\n\n" % d['desc'][1])
+ # options
+ opt_output = list(d['opts'])
+ if opt_output:
+ opts_len = max([len(line[0]) for line in opt_output])
+ ui.write(_("Options:\n\n"))
+ for optstr, desc in opt_output:
+ if desc:
+ s = "%-*s %s" % (opts_len, optstr, desc)
+ else:
+ s = optstr
+ ui.write("%s\n" % s)
+ ui.write("\n")
+ # aliases
+ if d['aliases']:
+ ui.write(_(" aliases: %s\n\n") % " ".join(d['aliases']))
+
+
+def allextensionnames():
+ return extensions.enabled().keys() + extensions.disabled().keys()
+
+if __name__ == "__main__":
+ show_doc(sys.stdout)
diff --git a/doc/hg.1 b/doc/hg.1
new file mode 100644
index 0000000..fe7865d
--- /dev/null
+++ b/doc/hg.1
@@ -0,0 +1,11408 @@
+.\" Man page generated from reStructeredText.
+.
+.TH HG 1 "" "" "Mercurial Manual"
+.SH NAME
+hg \- Mercurial source code management system
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.sp
+\fBhg\fP \fIcommand\fP [\fIoption\fP]... [\fIargument\fP]...
+.SH DESCRIPTION
+.sp
+The \fBhg\fP command provides a command line interface to the Mercurial
+system.
+.SH COMMAND ELEMENTS
+.INDENT 0.0
+.TP
+.B files...
+.
+indicates one or more filename or relative path filenames; see
+\%File Name Patterns\: for information on pattern matching
+.TP
+.B path
+.
+indicates a path on the local machine
+.TP
+.B revision
+.
+indicates a changeset which can be specified as a changeset
+revision number, a tag, or a unique substring of the changeset
+hash value
+.TP
+.B repository path
+.
+either the pathname of a local repository or the URI of a remote
+repository.
+.UNINDENT
+.SH OPTIONS
+.INDENT 0.0
+.TP
+.B \-R, \-\-repository
+.
+repository root directory or name of overlay bundle file
+.TP
+.B \-\-cwd
+.
+change working directory
+.TP
+.B \-y, \-\-noninteractive
+.
+do not prompt, automatically pick the first choice for all prompts
+.TP
+.B \-q, \-\-quiet
+.
+suppress output
+.TP
+.B \-v, \-\-verbose
+.
+enable additional output
+.TP
+.B \-\-config
+.
+set/override config option (use \(aqsection.name=value\(aq)
+.TP
+.B \-\-debug
+.
+enable debugging output
+.TP
+.B \-\-debugger
+.
+start debugger
+.TP
+.B \-\-encoding
+.
+set the charset encoding (default: ascii)
+.TP
+.B \-\-encodingmode
+.
+set the charset encoding mode (default: strict)
+.TP
+.B \-\-traceback
+.
+always print a traceback on exception
+.TP
+.B \-\-time
+.
+time how long the command takes
+.TP
+.B \-\-profile
+.
+print command execution profile
+.TP
+.B \-\-version
+.
+output version information and exit
+.TP
+.B \-h, \-\-help
+.
+display help and exit
+.UNINDENT
+.SH COMMANDS
+.SS add
+.sp
+.nf
+.ft C
+hg add [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Schedule files to be version controlled and added to the
+repository.
+.sp
+The files will be added to the repository at the next commit. To
+undo an add before that, see \%\fBhg forget\fP\:.
+.sp
+If no names are given, add all files to the repository.
+.sp
+An example showing how new (unknown) files are added
+automatically by \%\fBhg add\fP\::
+.sp
+.nf
+.ft C
+$ ls
+foo.c
+$ hg status
+? foo.c
+$ hg add
+adding foo.c
+$ hg status
+A foo.c
+.ft P
+.fi
+.sp
+Returns 0 if all files are successfully added.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.UNINDENT
+.SS addremove
+.sp
+.nf
+.ft C
+hg addremove [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Add all new files and remove all missing files from the
+repository.
+.sp
+New files are ignored if they match any of the patterns in
+\fB.hgignore\fP. As with add, these changes take effect at the next
+commit.
+.sp
+Use the \-s/\-\-similarity option to detect renamed files. This
+option takes a percentage between 0 (disabled) and 100 (files must
+be identical) as its parameter. With a parameter greater than 0,
+this compares every removed file with every added file and records
+those similar enough as renames. Detecting renamed files this way
+can be expensive. After using this option, \%\fBhg status \-C\fP\: can be
+used to check which files were identified as moved or renamed. If
+not specified, \-s/\-\-similarity defaults to 100 and only renames of
+identical files are detected.
+.sp
+Returns 0 if all files are successfully added.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-similarity
+.
+guess renamed files by similarity (0<=s<=100)
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.UNINDENT
+.SS annotate
+.sp
+.nf
+.ft C
+hg annotate [\-r REV] [\-f] [\-a] [\-u] [\-d] [\-n] [\-c] [\-l] FILE...
+.ft P
+.fi
+.sp
+List changes in files, showing the revision id responsible for
+each line
+.sp
+This command is useful for discovering when a change was made and
+by whom.
+.sp
+Without the \-a/\-\-text option, annotate will avoid processing files
+it detects as binary. With \-a, annotate will annotate the file
+anyway, although the results will probably be neither useful
+nor desirable.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+annotate the specified revision
+.TP
+.B \-\-follow
+.
+follow copies/renames and list the filename (DEPRECATED)
+.TP
+.B \-\-no\-follow
+.
+don\(aqt follow copies and renames
+.TP
+.B \-a, \-\-text
+.
+treat all files as text
+.TP
+.B \-u, \-\-user
+.
+list the author (long with \-v)
+.TP
+.B \-f, \-\-file
+.
+list the filename
+.TP
+.B \-d, \-\-date
+.
+list the date (short with \-q)
+.TP
+.B \-n, \-\-number
+.
+list the revision number (default)
+.TP
+.B \-c, \-\-changeset
+.
+list the changeset
+.TP
+.B \-l, \-\-line\-number
+.
+show line number at the first appearance
+.TP
+.B \-w, \-\-ignore\-all\-space
+.
+ignore white space when comparing lines
+.TP
+.B \-b, \-\-ignore\-space\-change
+.
+ignore changes in the amount of white space
+.TP
+.B \-B, \-\-ignore\-blank\-lines
+.
+ignore changes whose lines are all blank
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.sp
+aliases: blame
+.UNINDENT
+.SS archive
+.sp
+.nf
+.ft C
+hg archive [OPTION]... DEST
+.ft P
+.fi
+.sp
+By default, the revision used is the parent of the working
+directory; use \-r/\-\-rev to specify a different revision.
+.sp
+The archive type is automatically detected based on file
+extension (or override using \-t/\-\-type).
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+create a zip file containing the 1.0 release:
+.sp
+.nf
+.ft C
+hg archive \-r 1.0 project\-1.0.zip
+.ft P
+.fi
+.IP \(bu 2
+.
+create a tarball excluding .hg files:
+.sp
+.nf
+.ft C
+hg archive project.tar.gz \-X ".hg*"
+.ft P
+.fi
+.UNINDENT
+.sp
+Valid types are:
+.INDENT 0.0
+.TP
+.B \fBfiles\fP
+.sp
+a directory full of files (default)
+.TP
+.B \fBtar\fP
+.sp
+tar archive, uncompressed
+.TP
+.B \fBtbz2\fP
+.sp
+tar archive, compressed using bzip2
+.TP
+.B \fBtgz\fP
+.sp
+tar archive, compressed using gzip
+.TP
+.B \fBuzip\fP
+.sp
+zip archive, uncompressed
+.TP
+.B \fBzip\fP
+.sp
+zip archive, compressed using deflate
+.UNINDENT
+.sp
+The exact name of the destination archive or directory is given
+using a format string; see \%\fBhg help export\fP\: for details.
+.sp
+Each member added to an archive file has a directory prefix
+prepended. Use \-p/\-\-prefix to specify a format string for the
+prefix. The default is the basename of the archive, with suffixes
+removed.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-no\-decode
+.
+do not pass files through decoders
+.TP
+.B \-p, \-\-prefix
+.
+directory prefix for files in archive
+.TP
+.B \-r, \-\-rev
+.
+revision to distribute
+.TP
+.B \-t, \-\-type
+.
+type of distribution to create
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS backout
+.sp
+.nf
+.ft C
+hg backout [OPTION]... [\-r] REV
+.ft P
+.fi
+.sp
+Prepare a new changeset with the effect of REV undone in the
+current working directory.
+.sp
+If REV is the parent of the working directory, then this new changeset
+is committed automatically. Otherwise, hg needs to merge the
+changes and the merged result is left uncommitted.
+.IP Note
+.
+backout cannot be used to fix either an unwanted or
+incorrect merge.
+.RE
+.sp
+By default, the pending changeset will have one parent,
+maintaining a linear history. With \-\-merge, the pending
+changeset will instead have two parents: the old parent of the
+working directory and a new child of REV that simply undoes REV.
+.sp
+Before version 1.7, the behavior without \-\-merge was equivalent
+to specifying \-\-merge followed by \%\fBhg update \-\-clean .\fP\: to
+cancel the merge and leave the child of REV as a head to be
+merged separately.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-merge
+.
+merge with old dirstate parent after backout
+.TP
+.B \-\-parent
+.
+parent to choose when backing out merge (DEPRECATED)
+.TP
+.B \-r, \-\-rev
+.
+revision to backout
+.TP
+.B \-t, \-\-tool
+.
+specify merge tool
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.UNINDENT
+.SS bisect
+.sp
+.nf
+.ft C
+hg bisect [\-gbsr] [\-U] [\-c CMD] [REV]
+.ft P
+.fi
+.sp
+This command helps to find changesets which introduce problems. To
+use, mark the earliest changeset you know exhibits the problem as
+bad, then mark the latest changeset which is free from the problem
+as good. Bisect will update your working directory to a revision
+for testing (unless the \-U/\-\-noupdate option is specified). Once
+you have performed tests, mark the working directory as good or
+bad, and bisect will either update to another candidate changeset
+or announce that it has found the bad revision.
+.sp
+As a shortcut, you can also use the revision argument to mark a
+revision as good or bad without checking it out first.
+.sp
+If you supply a command, it will be used for automatic bisection.
+The environment variable HG_NODE will contain the ID of the
+changeset being tested. The exit status of the command will be
+used to mark revisions as good or bad: status 0 means good, 125
+means to skip the revision, 127 (command not found) will abort the
+bisection, and any other non\-zero exit status means the revision
+is bad.
+.sp
+Some examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+start a bisection with known bad revision 12, and good revision 34:
+.sp
+.nf
+.ft C
+hg bisect \-\-bad 34
+hg bisect \-\-good 12
+.ft P
+.fi
+.IP \(bu 2
+.
+advance the current bisection by marking current revision as good or
+bad:
+.sp
+.nf
+.ft C
+hg bisect \-\-good
+hg bisect \-\-bad
+.ft P
+.fi
+.IP \(bu 2
+.
+mark the current revision, or a known revision, to be skipped (eg. if
+that revision is not usable because of another issue):
+.sp
+.nf
+.ft C
+hg bisect \-\-skip
+hg bisect \-\-skip 23
+.ft P
+.fi
+.IP \(bu 2
+.
+forget the current bisection:
+.sp
+.nf
+.ft C
+hg bisect \-\-reset
+.ft P
+.fi
+.IP \(bu 2
+.
+use \(aqmake && make tests\(aq to automatically find the first broken
+revision:
+.sp
+.nf
+.ft C
+hg bisect \-\-reset
+hg bisect \-\-bad 34
+hg bisect \-\-good 12
+hg bisect \-\-command \(aqmake && make tests\(aq
+.ft P
+.fi
+.IP \(bu 2
+.
+see all changesets whose states are already known in the current
+bisection:
+.sp
+.nf
+.ft C
+hg log \-r "bisect(pruned)"
+.ft P
+.fi
+.IP \(bu 2
+.
+see the changeset currently being bisected (especially useful
+if running with \-U/\-\-noupdate):
+.sp
+.nf
+.ft C
+hg log \-r "bisect(current)"
+.ft P
+.fi
+.IP \(bu 2
+.
+see all changesets that took part in the current bisection:
+.sp
+.nf
+.ft C
+hg log \-r "bisect(range)"
+.ft P
+.fi
+.IP \(bu 2
+.
+with the graphlog extension, you can even get a nice graph:
+.sp
+.nf
+.ft C
+hg log \-\-graph \-r "bisect(range)"
+.ft P
+.fi
+.UNINDENT
+.sp
+See \%\fBhg help revsets\fP\: for more about the \fIbisect()\fP keyword.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-reset
+.
+reset bisect state
+.TP
+.B \-g, \-\-good
+.
+mark changeset good
+.TP
+.B \-b, \-\-bad
+.
+mark changeset bad
+.TP
+.B \-s, \-\-skip
+.
+skip testing changeset
+.TP
+.B \-e, \-\-extend
+.
+extend the bisect range
+.TP
+.B \-c, \-\-command
+.
+use command to check changeset state
+.TP
+.B \-U, \-\-noupdate
+.
+do not update to target
+.UNINDENT
+.SS bookmarks
+.sp
+.nf
+.ft C
+hg bookmarks [\-f] [\-d] [\-i] [\-m NAME] [\-r REV] [NAME]
+.ft P
+.fi
+.sp
+Bookmarks are pointers to certain commits that move when committing.
+Bookmarks are local. They can be renamed, copied and deleted. It is
+possible to use \%\fBhg merge NAME\fP\: to merge from a given bookmark, and
+\%\fBhg update NAME\fP\: to update to a given bookmark.
+.sp
+You can use \%\fBhg bookmark NAME\fP\: to set a bookmark on the working
+directory\(aqs parent revision with the given name. If you specify
+a revision using \-r REV (where REV may be an existing bookmark),
+the bookmark is assigned to that revision.
+.sp
+Bookmarks can be pushed and pulled between repositories (see \%\fBhg help
+push\fP\: and \%\fBhg help pull\fP\:). This requires both the local and remote
+repositories to support bookmarks. For versions prior to 1.8, this means
+the bookmarks extension must be enabled.
+.sp
+With \-i/\-\-inactive, the new bookmark will not be made the active
+bookmark. If \-r/\-\-rev is given, the new bookmark will not be made
+active even if \-i/\-\-inactive is not given. If no NAME is given, the
+current active bookmark will be marked inactive.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+force
+.TP
+.B \-r, \-\-rev
+.
+revision
+.TP
+.B \-d, \-\-delete
+.
+delete a given bookmark
+.TP
+.B \-m, \-\-rename
+.
+rename a given bookmark
+.TP
+.B \-i, \-\-inactive
+.
+mark a bookmark inactive
+.UNINDENT
+.SS branch
+.sp
+.nf
+.ft C
+hg branch [\-fC] [NAME]
+.ft P
+.fi
+.IP Note
+.
+Branch names are permanent and global. Use \%\fBhg bookmark\fP\: to create a
+light\-weight bookmark instead. See \%\fBhg help glossary\fP\: for more
+information about named branches and bookmarks.
+.RE
+.sp
+With no argument, show the current branch name. With one argument,
+set the working directory branch name (the branch will not exist
+in the repository until the next commit). Standard practice
+recommends that primary development take place on the \(aqdefault\(aq
+branch.
+.sp
+Unless \-f/\-\-force is specified, branch will not let you set a
+branch name that already exists, even if it\(aqs inactive.
+.sp
+Use \-C/\-\-clean to reset the working directory branch to that of
+the parent of the working directory, negating a previous branch
+change.
+.sp
+Use the command \%\fBhg update\fP\: to switch to an existing branch. Use
+\%\fBhg commit \-\-close\-branch\fP\: to mark this branch as closed.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+set branch name even if it shadows an existing branch
+.TP
+.B \-C, \-\-clean
+.
+reset branch name to parent branch name
+.UNINDENT
+.SS branches
+.sp
+.nf
+.ft C
+hg branches [\-ac]
+.ft P
+.fi
+.sp
+List the repository\(aqs named branches, indicating which ones are
+inactive. If \-c/\-\-closed is specified, also list branches which have
+been marked closed (see \%\fBhg commit \-\-close\-branch\fP\:).
+.sp
+If \-a/\-\-active is specified, only show active branches. A branch
+is considered active if it contains repository heads.
+.sp
+Use the command \%\fBhg update\fP\: to switch to an existing branch.
+.sp
+Returns 0.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-active
+.
+show only branches that have unmerged heads
+.TP
+.B \-c, \-\-closed
+.
+show normal and closed branches
+.UNINDENT
+.SS bundle
+.sp
+.nf
+.ft C
+hg bundle [\-f] [\-t TYPE] [\-a] [\-r REV]... [\-\-base REV]... FILE [DEST]
+.ft P
+.fi
+.sp
+Generate a compressed changegroup file collecting changesets not
+known to be in another repository.
+.sp
+If you omit the destination repository, then hg assumes the
+destination will have all the nodes you specify with \-\-base
+parameters. To create a bundle containing all changesets, use
+\-a/\-\-all (or \-\-base null).
+.sp
+You can change compression method with the \-t/\-\-type option.
+The available compression methods are: none, bzip2, and
+gzip (by default, bundles are compressed using bzip2).
+.sp
+The bundle file can then be transferred using conventional means
+and applied to another repository with the unbundle or pull
+command. This is useful when direct push and pull are not
+available or when exporting an entire repository is undesirable.
+.sp
+Applying bundles preserves all changeset contents including
+permissions, copy/rename information, and revision history.
+.sp
+Returns 0 on success, 1 if no changes found.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+run even when the destination is unrelated
+.TP
+.B \-r, \-\-rev
+.
+a changeset intended to be added to the destination
+.TP
+.B \-b, \-\-branch
+.
+a specific branch you would like to bundle
+.TP
+.B \-\-base
+.
+a base changeset assumed to be available at the destination
+.TP
+.B \-a, \-\-all
+.
+bundle all changesets in the repository
+.TP
+.B \-t, \-\-type
+.
+bundle compression type to use (default: bzip2)
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS cat
+.sp
+.nf
+.ft C
+hg cat [OPTION]... FILE...
+.ft P
+.fi
+.sp
+Print the specified files as they were at the given revision. If
+no revision is given, the parent of the working directory is used,
+or tip if no revision is checked out.
+.sp
+Output may be to a file, in which case the name of the file is
+given using a format string. The formatting rules are the same as
+for the export command, with the following additions:
+.INDENT 0.0
+.TP
+.B \fB%s\fP
+.sp
+basename of file being printed
+.TP
+.B \fB%d\fP
+.sp
+dirname of file being printed, or \(aq.\(aq if in repository root
+.TP
+.B \fB%p\fP
+.sp
+root\-relative path name of file being printed
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-o, \-\-output
+.
+print output to file with formatted name
+.TP
+.B \-r, \-\-rev
+.
+print the given revision
+.TP
+.B \-\-decode
+.
+apply any matching decode filter
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS clone
+.sp
+.nf
+.ft C
+hg clone [OPTION]... SOURCE [DEST]
+.ft P
+.fi
+.sp
+Create a copy of an existing repository in a new directory.
+.sp
+If no destination directory name is specified, it defaults to the
+basename of the source.
+.sp
+The location of the source is added to the new repository\(aqs
+\fB.hg/hgrc\fP file, as the default to be used for future pulls.
+.sp
+Only local paths and \fBssh://\fP URLs are supported as
+destinations. For \fBssh://\fP destinations, no working directory or
+\fB.hg/hgrc\fP will be created on the remote side.
+.sp
+To pull only a subset of changesets, specify one or more revisions
+identifiers with \-r/\-\-rev or branches with \-b/\-\-branch. The
+resulting clone will contain only the specified changesets and
+their ancestors. These options (or \(aqclone src#rev dest\(aq) imply
+\-\-pull, even for local source repositories. Note that specifying a
+tag will include the tagged changeset but not the changeset
+containing the tag.
+.sp
+To check out a particular version, use \-u/\-\-update, or
+\-U/\-\-noupdate to create a clone with no working directory.
+.sp
+For efficiency, hardlinks are used for cloning whenever the
+source and destination are on the same filesystem (note this
+applies only to the repository data, not to the working
+directory). Some filesystems, such as AFS, implement hardlinking
+incorrectly, but do not report errors. In these cases, use the
+\-\-pull option to avoid hardlinking.
+.sp
+In some cases, you can clone repositories and the working
+directory using full hardlinks with
+.sp
+.nf
+.ft C
+$ cp \-al REPO REPOCLONE
+.ft P
+.fi
+.sp
+This is the fastest way to clone, but it is not always safe. The
+operation is not atomic (making sure REPO is not modified during
+the operation is up to you) and you have to make sure your
+editor breaks hardlinks (Emacs and most Linux Kernel tools do
+so). Also, this is not compatible with certain extensions that
+place their metadata under the .hg directory, such as mq.
+.sp
+Mercurial will update the working directory to the first applicable
+revision from this list:
+.INDENT 0.0
+.IP a. 3
+.
+null if \-U or the source repository has no changesets
+.IP b. 3
+.
+if \-u . and the source repository is local, the first parent of
+the source repository\(aqs working directory
+.IP c. 3
+.
+the changeset specified with \-u (if a branch name, this means the
+latest head of that branch)
+.IP d. 3
+.
+the changeset specified with \-r
+.IP e. 3
+.
+the tipmost head specified with \-b
+.IP f. 3
+.
+the tipmost head specified with the url#branch source syntax
+.IP g. 3
+.
+the tipmost head of the default branch
+.IP h. 3
+.
+tip
+.UNINDENT
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+clone a remote repository to a new directory named hg/:
+.sp
+.nf
+.ft C
+hg clone http://selenic.com/hg
+.ft P
+.fi
+.IP \(bu 2
+.
+create a lightweight local clone:
+.sp
+.nf
+.ft C
+hg clone project/ project\-feature/
+.ft P
+.fi
+.IP \(bu 2
+.
+clone from an absolute path on an ssh server (note double\-slash):
+.sp
+.nf
+.ft C
+hg clone ssh://user@server//home/projects/alpha/
+.ft P
+.fi
+.IP \(bu 2
+.
+do a high\-speed clone over a LAN while checking out a
+specified version:
+.sp
+.nf
+.ft C
+hg clone \-\-uncompressed http://server/repo \-u 1.5
+.ft P
+.fi
+.IP \(bu 2
+.
+create a repository without changesets after a particular revision:
+.sp
+.nf
+.ft C
+hg clone \-r 04e544 experimental/ good/
+.ft P
+.fi
+.IP \(bu 2
+.
+clone (and track) a particular named branch:
+.sp
+.nf
+.ft C
+hg clone http://selenic.com/hg#stable
+.ft P
+.fi
+.UNINDENT
+.sp
+See \%\fBhg help urls\fP\: for details on specifying URLs.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-U, \-\-noupdate
+.
+the clone will include an empty working copy (only a repository)
+.TP
+.B \-u, \-\-updaterev
+.
+revision, tag or branch to check out
+.TP
+.B \-r, \-\-rev
+.
+include the specified changeset
+.TP
+.B \-b, \-\-branch
+.
+clone only the specified branch
+.TP
+.B \-\-pull
+.
+use pull protocol to copy metadata
+.TP
+.B \-\-uncompressed
+.
+use uncompressed transfer (fast over LAN)
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS commit
+.sp
+.nf
+.ft C
+hg commit [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Commit changes to the given files into the repository. Unlike a
+centralized SCM, this operation is a local operation. See
+\%\fBhg push\fP\: for a way to actively distribute your changes.
+.sp
+If a list of files is omitted, all changes reported by \%\fBhg status\fP\:
+will be committed.
+.sp
+If you are committing the result of a merge, do not provide any
+filenames or \-I/\-X filters.
+.sp
+If no commit message is specified, Mercurial starts your
+configured editor where you can enter a message. In case your
+commit fails, you will find a backup of your message in
+\fB.hg/last\-message.txt\fP.
+.sp
+The \-\-amend flag can be used to amend the parent of the
+working directory with a new commit that contains the changes
+in the parent in addition to those currently reported by \%\fBhg status\fP\:,
+if there are any. The old commit is stored in a backup bundle in
+\fB.hg/strip\-backup\fP (see \%\fBhg help bundle\fP\: and \%\fBhg help unbundle\fP\:
+on how to restore it).
+.sp
+Message, user and date are taken from the amended commit unless
+specified. When a message isn\(aqt specified on the command line,
+the editor will open with the message of the amended commit.
+.sp
+It is not possible to amend public changesets (see \%\fBhg help phases\fP\:)
+or changesets that have children.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Returns 0 on success, 1 if nothing changed.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-addremove
+.
+mark new/missing files as added/removed before committing
+.TP
+.B \-\-close\-branch
+.
+mark a branch as closed, hiding it from the branch list
+.TP
+.B \-\-amend
+.
+amend the parent of the working dir
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.sp
+aliases: ci
+.UNINDENT
+.SS copy
+.sp
+.nf
+.ft C
+hg copy [OPTION]... [SOURCE]... DEST
+.ft P
+.fi
+.sp
+Mark dest as having copies of source files. If dest is a
+directory, copies are put in that directory. If dest is a file,
+the source must be a single file.
+.sp
+By default, this command copies the contents of files as they
+exist in the working directory. If invoked with \-A/\-\-after, the
+operation is recorded, but no copying is performed.
+.sp
+This command takes effect with the next commit. To undo a copy
+before that, see \%\fBhg revert\fP\:.
+.sp
+Returns 0 on success, 1 if errors are encountered.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-after
+.
+record a copy that has already occurred
+.TP
+.B \-f, \-\-force
+.
+forcibly copy over an existing managed file
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.sp
+aliases: cp
+.UNINDENT
+.SS diff
+.sp
+.nf
+.ft C
+hg diff [OPTION]... ([\-c REV] | [\-r REV1 [\-r REV2]]) [FILE]...
+.ft P
+.fi
+.sp
+Show differences between revisions for the specified files.
+.sp
+Differences between files are shown using the unified diff format.
+.IP Note
+.
+diff may generate unexpected results for merges, as it will
+default to comparing against the working directory\(aqs first
+parent changeset if no revisions are specified.
+.RE
+.sp
+When two revision arguments are given, then changes are shown
+between those revisions. If only one revision is specified then
+that revision is compared to the working directory, and, when no
+revisions are specified, the working directory files are compared
+to its parent.
+.sp
+Alternatively you can specify \-c/\-\-change with a revision to see
+the changes in that changeset relative to its first parent.
+.sp
+Without the \-a/\-\-text option, diff will avoid generating diffs of
+files it detects as binary. With \-a, diff will generate a diff
+anyway, probably with undesirable results.
+.sp
+Use the \-g/\-\-git option to generate diffs in the git extended diff
+format. For more information, read \%\fBhg help diffs\fP\:.
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+compare a file in the current working directory to its parent:
+.sp
+.nf
+.ft C
+hg diff foo.c
+.ft P
+.fi
+.IP \(bu 2
+.
+compare two historical versions of a directory, with rename info:
+.sp
+.nf
+.ft C
+hg diff \-\-git \-r 1.0:1.2 lib/
+.ft P
+.fi
+.IP \(bu 2
+.
+get change stats relative to the last change on some date:
+.sp
+.nf
+.ft C
+hg diff \-\-stat \-r "date(\(aqmay 2\(aq)"
+.ft P
+.fi
+.IP \(bu 2
+.
+diff all newly\-added files that contain a keyword:
+.sp
+.nf
+.ft C
+hg diff "set:added() and grep(GNU)"
+.ft P
+.fi
+.IP \(bu 2
+.
+compare a revision and its parents:
+.sp
+.nf
+.ft C
+hg diff \-c 9353 # compare against first parent
+hg diff \-r 9353^:9353 # same using revset syntax
+hg diff \-r 9353^2:9353 # compare against the second parent
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+revision
+.TP
+.B \-c, \-\-change
+.
+change made by revision
+.TP
+.B \-a, \-\-text
+.
+treat all files as text
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-\-nodates
+.
+omit dates from diff headers
+.TP
+.B \-p, \-\-show\-function
+.
+show which function each change is in
+.TP
+.B \-\-reverse
+.
+produce a diff that undoes the changes
+.TP
+.B \-w, \-\-ignore\-all\-space
+.
+ignore white space when comparing lines
+.TP
+.B \-b, \-\-ignore\-space\-change
+.
+ignore changes in the amount of white space
+.TP
+.B \-B, \-\-ignore\-blank\-lines
+.
+ignore changes whose lines are all blank
+.TP
+.B \-U, \-\-unified
+.
+number of lines of context to show
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.UNINDENT
+.SS export
+.sp
+.nf
+.ft C
+hg export [OPTION]... [\-o OUTFILESPEC] [\-r] REV...
+.ft P
+.fi
+.sp
+Print the changeset header and diffs for one or more revisions.
+.sp
+The information shown in the changeset header is: author, date,
+branch name (if non\-default), changeset hash, parent(s) and commit
+comment.
+.IP Note
+.
+export may generate unexpected diff output for merge
+changesets, as it will compare the merge changeset against its
+first parent only.
+.RE
+.sp
+Output may be to a file, in which case the name of the file is
+given using a format string. The formatting rules are as follows:
+.INDENT 0.0
+.TP
+.B \fB%%\fP
+.sp
+literal "%" character
+.TP
+.B \fB%H\fP
+.sp
+changeset hash (40 hexadecimal digits)
+.TP
+.B \fB%N\fP
+.sp
+number of patches being generated
+.TP
+.B \fB%R\fP
+.sp
+changeset revision number
+.TP
+.B \fB%b\fP
+.sp
+basename of the exporting repository
+.TP
+.B \fB%h\fP
+.sp
+short\-form changeset hash (12 hexadecimal digits)
+.TP
+.B \fB%m\fP
+.sp
+first line of the commit message (only alphanumeric characters)
+.TP
+.B \fB%n\fP
+.sp
+zero\-padded sequence number, starting at 1
+.TP
+.B \fB%r\fP
+.sp
+zero\-padded changeset revision number
+.UNINDENT
+.sp
+Without the \-a/\-\-text option, export will avoid generating diffs
+of files it detects as binary. With \-a, export will generate a
+diff anyway, probably with undesirable results.
+.sp
+Use the \-g/\-\-git option to generate diffs in the git extended diff
+format. See \%\fBhg help diffs\fP\: for more information.
+.sp
+With the \-\-switch\-parent option, the diff will be against the
+second parent. It can be useful to review a merge.
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+use export and import to transplant a bugfix to the current
+branch:
+.sp
+.nf
+.ft C
+hg export \-r 9353 | hg import \-
+.ft P
+.fi
+.IP \(bu 2
+.
+export all the changesets between two revisions to a file with
+rename information:
+.sp
+.nf
+.ft C
+hg export \-\-git \-r 123:150 > changes.txt
+.ft P
+.fi
+.IP \(bu 2
+.
+split outgoing changes into a series of patches with
+descriptive names:
+.sp
+.nf
+.ft C
+hg export \-r "outgoing()" \-o "%n\-%m.patch"
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-o, \-\-output
+.
+print output to file with formatted name
+.TP
+.B \-\-switch\-parent
+.
+diff against the second parent
+.TP
+.B \-r, \-\-rev
+.
+revisions to export
+.TP
+.B \-a, \-\-text
+.
+treat all files as text
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-\-nodates
+.
+omit dates from diff headers
+.UNINDENT
+.SS forget
+.sp
+.nf
+.ft C
+hg forget [OPTION]... FILE...
+.ft P
+.fi
+.sp
+Mark the specified files so they will no longer be tracked
+after the next commit.
+.sp
+This only removes files from the current branch, not from the
+entire project history, and it does not delete them from the
+working directory.
+.sp
+To undo a forget before the next commit, see \%\fBhg add\fP\:.
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+forget newly\-added binary files:
+.sp
+.nf
+.ft C
+hg forget "set:added() and binary()"
+.ft P
+.fi
+.IP \(bu 2
+.
+forget files that would be excluded by .hgignore:
+.sp
+.nf
+.ft C
+hg forget "set:hgignore()"
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS graft
+.sp
+.nf
+.ft C
+hg graft [OPTION]... [\-r] REV...
+.ft P
+.fi
+.sp
+This command uses Mercurial\(aqs merge logic to copy individual
+changes from other branches without merging branches in the
+history graph. This is sometimes known as \(aqbackporting\(aq or
+\(aqcherry\-picking\(aq. By default, graft will copy user, date, and
+description from the source changesets.
+.sp
+Changesets that are ancestors of the current revision, that have
+already been grafted, or that are merges will be skipped.
+.sp
+If \-\-log is specified, log messages will have a comment appended
+of the form:
+.sp
+.nf
+.ft C
+(grafted from CHANGESETHASH)
+.ft P
+.fi
+.sp
+If a graft merge results in conflicts, the graft process is
+interrupted so that the current merge can be manually resolved.
+Once all conflicts are addressed, the graft process can be
+continued with the \-c/\-\-continue option.
+.IP Note
+.
+The \-c/\-\-continue option does not reapply earlier options.
+.RE
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+copy a single change to the stable branch and edit its description:
+.sp
+.nf
+.ft C
+hg update stable
+hg graft \-\-edit 9393
+.ft P
+.fi
+.IP \(bu 2
+.
+graft a range of changesets with one exception, updating dates:
+.sp
+.nf
+.ft C
+hg graft \-D "2085::2093 and not 2091"
+.ft P
+.fi
+.IP \(bu 2
+.
+continue a graft after resolving conflicts:
+.sp
+.nf
+.ft C
+hg graft \-c
+.ft P
+.fi
+.IP \(bu 2
+.
+show the source of a grafted changeset:
+.sp
+.nf
+.ft C
+hg log \-\-debug \-r tip
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on successful completion.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+revisions to graft
+.TP
+.B \-c, \-\-continue
+.
+resume interrupted graft
+.TP
+.B \-e, \-\-edit
+.
+invoke editor on commit messages
+.TP
+.B \-\-log
+.
+append graft info to log message
+.TP
+.B \-D, \-\-currentdate
+.
+record the current date as commit date
+.TP
+.B \-U, \-\-currentuser
+.
+record the current user as committer
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-t, \-\-tool
+.
+specify merge tool
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.UNINDENT
+.SS grep
+.sp
+.nf
+.ft C
+hg grep [OPTION]... PATTERN [FILE]...
+.ft P
+.fi
+.sp
+Search revisions of files for a regular expression.
+.sp
+This command behaves differently than Unix grep. It only accepts
+Python/Perl regexps. It searches repository history, not the
+working directory. It always prints the revision number in which a
+match appears.
+.sp
+By default, grep only prints output for the first revision of a
+file in which it finds a match. To get it to print every revision
+that contains a change in match status ("\-" for a match that
+becomes a non\-match, or "+" for a non\-match that becomes a match),
+use the \-\-all flag.
+.sp
+Returns 0 if a match is found, 1 otherwise.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-0, \-\-print0
+.
+end fields with NUL
+.TP
+.B \-\-all
+.
+print all revisions that match
+.TP
+.B \-a, \-\-text
+.
+treat all files as text
+.TP
+.B \-f, \-\-follow
+.
+follow changeset history, or file history across copies and renames
+.TP
+.B \-i, \-\-ignore\-case
+.
+ignore case when matching
+.TP
+.B \-l, \-\-files\-with\-matches
+.
+print only filenames and revisions that match
+.TP
+.B \-n, \-\-line\-number
+.
+print matching line numbers
+.TP
+.B \-r, \-\-rev
+.
+only search files changed within revision range
+.TP
+.B \-u, \-\-user
+.
+list the author (long with \-v)
+.TP
+.B \-d, \-\-date
+.
+list the date (short with \-q)
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS heads
+.sp
+.nf
+.ft C
+hg heads [\-ct] [\-r STARTREV] [REV]...
+.ft P
+.fi
+.sp
+With no arguments, show all repository branch heads.
+.sp
+Repository "heads" are changesets with no child changesets. They are
+where development generally takes place and are the usual targets
+for update and merge operations. Branch heads are changesets that have
+no child changeset on the same branch.
+.sp
+If one or more REVs are given, only branch heads on the branches
+associated with the specified changesets are shown. This means
+that you can use \%\fBhg heads foo\fP\: to see the heads on a branch
+named \fBfoo\fP.
+.sp
+If \-c/\-\-closed is specified, also show branch heads marked closed
+(see \%\fBhg commit \-\-close\-branch\fP\:).
+.sp
+If STARTREV is specified, only those heads that are descendants of
+STARTREV will be displayed.
+.sp
+If \-t/\-\-topo is specified, named branch mechanics will be ignored and only
+changesets without children will be shown.
+.sp
+Returns 0 if matching heads are found, 1 if not.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+show only heads which are descendants of STARTREV
+.TP
+.B \-t, \-\-topo
+.
+show topological heads only
+.TP
+.B \-a, \-\-active
+.
+show active branchheads only (DEPRECATED)
+.TP
+.B \-c, \-\-closed
+.
+show normal and closed branch heads
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.UNINDENT
+.SS help
+.sp
+.nf
+.ft C
+hg help [\-ec] [TOPIC]
+.ft P
+.fi
+.sp
+With no arguments, print a list of commands with short help messages.
+.sp
+Given a topic, extension, or command name, print help for that
+topic.
+.sp
+Returns 0 if successful.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-extension
+.
+show only help for extensions
+.TP
+.B \-c, \-\-command
+.
+show only help for commands
+.TP
+.B \-k, \-\-keyword
+.
+show topics matching keyword
+.UNINDENT
+.SS identify
+.sp
+.nf
+.ft C
+hg identify [\-nibtB] [\-r REV] [SOURCE]
+.ft P
+.fi
+.sp
+Print a summary identifying the repository state at REV using one or
+two parent hash identifiers, followed by a "+" if the working
+directory has uncommitted changes, the branch name (if not default),
+a list of tags, and a list of bookmarks.
+.sp
+When REV is not given, print a summary of the current state of the
+repository.
+.sp
+Specifying a path to a repository root or Mercurial bundle will
+cause lookup to operate on that repository/bundle.
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+generate a build identifier for the working directory:
+.sp
+.nf
+.ft C
+hg id \-\-id > build\-id.dat
+.ft P
+.fi
+.IP \(bu 2
+.
+find the revision corresponding to a tag:
+.sp
+.nf
+.ft C
+hg id \-n \-r 1.3
+.ft P
+.fi
+.IP \(bu 2
+.
+check the most recent revision of a remote repository:
+.sp
+.nf
+.ft C
+hg id \-r tip http://selenic.com/hg/
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 if successful.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+identify the specified revision
+.TP
+.B \-n, \-\-num
+.
+show local revision number
+.TP
+.B \-i, \-\-id
+.
+show global revision id
+.TP
+.B \-b, \-\-branch
+.
+show branch
+.TP
+.B \-t, \-\-tags
+.
+show tags
+.TP
+.B \-B, \-\-bookmarks
+.
+show bookmarks
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.sp
+aliases: id
+.UNINDENT
+.SS import
+.sp
+.nf
+.ft C
+hg import [OPTION]... PATCH...
+.ft P
+.fi
+.sp
+Import a list of patches and commit them individually (unless
+\-\-no\-commit is specified).
+.sp
+If there are outstanding changes in the working directory, import
+will abort unless given the \-f/\-\-force flag.
+.sp
+You can import a patch straight from a mail message. Even patches
+as attachments work (to use the body part, it must have type
+text/plain or text/x\-patch). From and Subject headers of email
+message are used as default committer and commit message. All
+text/plain body parts before first diff are added to commit
+message.
+.sp
+If the imported patch was generated by \%\fBhg export\fP\:, user and
+description from patch override values from message headers and
+body. Values given on command line with \-m/\-\-message and \-u/\-\-user
+override these.
+.sp
+If \-\-exact is specified, import will set the working directory to
+the parent of each patch before applying it, and will abort if the
+resulting changeset has a different ID than the one recorded in
+the patch. This may happen due to character set problems or other
+deficiencies in the text patch format.
+.sp
+Use \-\-bypass to apply and commit patches directly to the
+repository, not touching the working directory. Without \-\-exact,
+patches will be applied on top of the working directory parent
+revision.
+.sp
+With \-s/\-\-similarity, hg will attempt to discover renames and
+copies in the patch in the same way as \%\fBhg addremove\fP\:.
+.sp
+To read a patch from standard input, use "\-" as the patch name. If
+a URL is specified, the patch will be downloaded from it.
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+import a traditional patch from a website and detect renames:
+.sp
+.nf
+.ft C
+hg import \-s 80 http://example.com/bugfix.patch
+.ft P
+.fi
+.IP \(bu 2
+.
+import a changeset from an hgweb server:
+.sp
+.nf
+.ft C
+hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
+.ft P
+.fi
+.IP \(bu 2
+.
+import all the patches in an Unix\-style mbox:
+.sp
+.nf
+.ft C
+hg import incoming\-patches.mbox
+.ft P
+.fi
+.IP \(bu 2
+.
+attempt to exactly restore an exported changeset (not always
+possible):
+.sp
+.nf
+.ft C
+hg import \-\-exact proposed\-fix.patch
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-p, \-\-strip
+.
+directory strip option for patch. This has the same meaning as the corresponding patch option (default: 1)
+.TP
+.B \-b, \-\-base
+.
+base path (DEPRECATED)
+.TP
+.B \-e, \-\-edit
+.
+invoke editor on commit messages
+.TP
+.B \-f, \-\-force
+.
+skip check for outstanding uncommitted changes
+.TP
+.B \-\-no\-commit
+.
+don\(aqt commit, just update the working directory
+.TP
+.B \-\-bypass
+.
+apply patch without touching the working directory
+.TP
+.B \-\-exact
+.
+apply patch to the nodes from which it was generated
+.TP
+.B \-\-import\-branch
+.
+use any branch information in patch (implied by \-\-exact)
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-s, \-\-similarity
+.
+guess renamed files by similarity (0<=s<=100)
+.sp
+aliases: patch
+.UNINDENT
+.SS incoming
+.sp
+.nf
+.ft C
+hg incoming [\-p] [\-n] [\-M] [\-f] [\-r REV]... [\-\-bundle FILENAME] [SOURCE]
+.ft P
+.fi
+.sp
+Show new changesets found in the specified path/URL or the default
+pull location. These are the changesets that would have been pulled
+if a pull at the time you issued this command.
+.sp
+For remote repository, using \-\-bundle avoids downloading the
+changesets twice if the incoming is followed by a pull.
+.sp
+See pull for valid source format details.
+.sp
+Returns 0 if there are incoming changes, 1 otherwise.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+run even if remote repository is unrelated
+.TP
+.B \-n, \-\-newest\-first
+.
+show newest record first
+.TP
+.B \-\-bundle
+.
+file to store the bundles into
+.TP
+.B \-r, \-\-rev
+.
+a remote changeset intended to be added
+.TP
+.B \-B, \-\-bookmarks
+.
+compare bookmarks
+.TP
+.B \-b, \-\-branch
+.
+a specific branch you would like to pull
+.TP
+.B \-p, \-\-patch
+.
+show patch
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-l, \-\-limit
+.
+limit number of changes displayed
+.TP
+.B \-M, \-\-no\-merges
+.
+do not show merges
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-G, \-\-graph
+.
+show the revision DAG
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.sp
+aliases: in
+.UNINDENT
+.SS init
+.sp
+.nf
+.ft C
+hg init [\-e CMD] [\-\-remotecmd CMD] [DEST]
+.ft P
+.fi
+.sp
+Initialize a new repository in the given directory. If the given
+directory does not exist, it will be created.
+.sp
+If no directory is given, the current directory is used.
+.sp
+It is possible to specify an \fBssh://\fP URL as the destination.
+See \%\fBhg help urls\fP\: for more information.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS locate
+.sp
+.nf
+.ft C
+hg locate [OPTION]... [PATTERN]...
+.ft P
+.fi
+.sp
+Print files under Mercurial control in the working directory whose
+names match the given patterns.
+.sp
+By default, this command searches all directories in the working
+directory. To search just the current directory and its
+subdirectories, use "\-\-include .".
+.sp
+If no patterns are given to match, this command prints the names
+of all files under Mercurial control in the working directory.
+.sp
+If you want to feed the output of this command into the "xargs"
+command, use the \-0 option to both this command and "xargs". This
+will avoid the problem of "xargs" treating single filenames that
+contain whitespace as multiple filenames.
+.sp
+Returns 0 if a match is found, 1 otherwise.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+search the repository as it is in REV
+.TP
+.B \-0, \-\-print0
+.
+end filenames with NUL, for use with xargs
+.TP
+.B \-f, \-\-fullpath
+.
+print complete paths from the filesystem root
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS log
+.sp
+.nf
+.ft C
+hg log [OPTION]... [FILE]
+.ft P
+.fi
+.sp
+Print the revision history of the specified files or the entire
+project.
+.sp
+If no revision range is specified, the default is \fBtip:0\fP unless
+\-\-follow is set, in which case the working directory parent is
+used as the starting revision.
+.sp
+File history is shown without following rename or copy history of
+files. Use \-f/\-\-follow with a filename to follow history across
+renames and copies. \-\-follow without a filename will only show
+ancestors or descendants of the starting revision.
+.sp
+By default this command prints revision number and changeset id,
+tags, non\-trivial parents, user, date and time, and a summary for
+each commit. When the \-v/\-\-verbose switch is used, the list of
+changed files and full commit message are shown.
+.IP Note
+.
+log \-p/\-\-patch may generate unexpected diff output for merge
+changesets, as it will only compare the merge changeset against
+its first parent. Also, only files different from BOTH parents
+will appear in files:.
+.RE
+.IP Note
+.
+for performance reasons, log FILE may omit duplicate changes
+made on branches and will not show deletions. To see all
+changes including duplicates and deletions, use the \-\-removed
+switch.
+.RE
+.sp
+Some examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+changesets with full descriptions and file lists:
+.sp
+.nf
+.ft C
+hg log \-v
+.ft P
+.fi
+.IP \(bu 2
+.
+changesets ancestral to the working directory:
+.sp
+.nf
+.ft C
+hg log \-f
+.ft P
+.fi
+.IP \(bu 2
+.
+last 10 commits on the current branch:
+.sp
+.nf
+.ft C
+hg log \-l 10 \-b .
+.ft P
+.fi
+.IP \(bu 2
+.
+changesets showing all modifications of a file, including removals:
+.sp
+.nf
+.ft C
+hg log \-\-removed file.c
+.ft P
+.fi
+.IP \(bu 2
+.
+all changesets that touch a directory, with diffs, excluding merges:
+.sp
+.nf
+.ft C
+hg log \-Mp lib/
+.ft P
+.fi
+.IP \(bu 2
+.
+all revision numbers that match a keyword:
+.sp
+.nf
+.ft C
+hg log \-k bug \-\-template "{rev}\en"
+.ft P
+.fi
+.IP \(bu 2
+.
+check if a given changeset is included is a tagged release:
+.sp
+.nf
+.ft C
+hg log \-r "a21ccf and ancestor(1.9)"
+.ft P
+.fi
+.IP \(bu 2
+.
+find all changesets by some user in a date range:
+.sp
+.nf
+.ft C
+hg log \-k alice \-d "may 2008 to jul 2008"
+.ft P
+.fi
+.IP \(bu 2
+.
+summary of all changesets after the last tag:
+.sp
+.nf
+.ft C
+hg log \-r "last(tagged())::" \-\-template "{desc|firstline}\en"
+.ft P
+.fi
+.UNINDENT
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+See \%\fBhg help revisions\fP\: and \%\fBhg help revsets\fP\: for more about
+specifying revisions.
+.sp
+See \%\fBhg help templates\fP\: for more about pre\-packaged styles and
+specifying custom templates.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-follow
+.
+follow changeset history, or file history across copies and renames
+.TP
+.B \-\-follow\-first
+.
+only follow the first parent of merge changesets (DEPRECATED)
+.TP
+.B \-d, \-\-date
+.
+show revisions matching date spec
+.TP
+.B \-C, \-\-copies
+.
+show copied files
+.TP
+.B \-k, \-\-keyword
+.
+do case\-insensitive search for a given text
+.TP
+.B \-r, \-\-rev
+.
+show the specified revision or range
+.TP
+.B \-\-removed
+.
+include revisions where files were removed
+.TP
+.B \-m, \-\-only\-merges
+.
+show only merges (DEPRECATED)
+.TP
+.B \-u, \-\-user
+.
+revisions committed by user
+.TP
+.B \-\-only\-branch
+.
+show only changesets within the given named branch (DEPRECATED)
+.TP
+.B \-b, \-\-branch
+.
+show changesets within the given named branch
+.TP
+.B \-P, \-\-prune
+.
+do not display revision or any of its ancestors
+.TP
+.B \-\-hidden
+.
+show hidden changesets (DEPRECATED)
+.TP
+.B \-p, \-\-patch
+.
+show patch
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-l, \-\-limit
+.
+limit number of changes displayed
+.TP
+.B \-M, \-\-no\-merges
+.
+do not show merges
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-G, \-\-graph
+.
+show the revision DAG
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.sp
+aliases: history
+.UNINDENT
+.SS manifest
+.sp
+.nf
+.ft C
+hg manifest [\-r REV]
+.ft P
+.fi
+.sp
+Print a list of version controlled files for the given revision.
+If no revision is given, the first parent of the working directory
+is used, or the null revision if no revision is checked out.
+.sp
+With \-v, print file permissions, symlink and executable bits.
+With \-\-debug, print file revision hashes.
+.sp
+If option \-\-all is specified, the list of all files from all revisions
+is printed. This includes deleted and renamed files.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+revision to display
+.TP
+.B \-\-all
+.
+list files from all revisions
+.UNINDENT
+.SS merge
+.sp
+.nf
+.ft C
+hg merge [\-P] [\-f] [[\-r] REV]
+.ft P
+.fi
+.sp
+The current working directory is updated with all changes made in
+the requested revision since the last common predecessor revision.
+.sp
+Files that changed between either parent are marked as changed for
+the next commit and a commit must be performed before any further
+updates to the repository are allowed. The next commit will have
+two parents.
+.sp
+\fB\-\-tool\fP can be used to specify the merge tool used for file
+merges. It overrides the HGMERGE environment variable and your
+configuration files. See \%\fBhg help merge\-tools\fP\: for options.
+.sp
+If no revision is specified, the working directory\(aqs parent is a
+head revision, and the current branch contains exactly one other
+head, the other head is merged with by default. Otherwise, an
+explicit revision with which to merge with must be provided.
+.sp
+\%\fBhg resolve\fP\: must be used to resolve unresolved files.
+.sp
+To undo an uncommitted merge, use \%\fBhg update \-\-clean .\fP\: which
+will check out a clean copy of the original merge parent, losing
+all changes.
+.sp
+Returns 0 on success, 1 if there are unresolved files.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+force a merge with outstanding changes
+.TP
+.B \-r, \-\-rev
+.
+revision to merge
+.TP
+.B \-P, \-\-preview
+.
+review revisions to merge (no merge is performed)
+.TP
+.B \-t, \-\-tool
+.
+specify merge tool
+.UNINDENT
+.SS outgoing
+.sp
+.nf
+.ft C
+hg outgoing [\-M] [\-p] [\-n] [\-f] [\-r REV]... [DEST]
+.ft P
+.fi
+.sp
+Show changesets not found in the specified destination repository
+or the default push location. These are the changesets that would
+be pushed if a push was requested.
+.sp
+See pull for details of valid destination formats.
+.sp
+Returns 0 if there are outgoing changes, 1 otherwise.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+run even when the destination is unrelated
+.TP
+.B \-r, \-\-rev
+.
+a changeset intended to be included in the destination
+.TP
+.B \-n, \-\-newest\-first
+.
+show newest record first
+.TP
+.B \-B, \-\-bookmarks
+.
+compare bookmarks
+.TP
+.B \-b, \-\-branch
+.
+a specific branch you would like to push
+.TP
+.B \-p, \-\-patch
+.
+show patch
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-l, \-\-limit
+.
+limit number of changes displayed
+.TP
+.B \-M, \-\-no\-merges
+.
+do not show merges
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-G, \-\-graph
+.
+show the revision DAG
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.sp
+aliases: out
+.UNINDENT
+.SS parents
+.sp
+.nf
+.ft C
+hg parents [\-r REV] [FILE]
+.ft P
+.fi
+.sp
+Print the working directory\(aqs parent revisions. If a revision is
+given via \-r/\-\-rev, the parent of that revision will be printed.
+If a file argument is given, the revision in which the file was
+last changed (before the working directory revision or the
+argument to \-\-rev if given) is printed.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+show parents of the specified revision
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.UNINDENT
+.SS paths
+.sp
+.nf
+.ft C
+hg paths [NAME]
+.ft P
+.fi
+.sp
+Show definition of symbolic path name NAME. If no name is given,
+show definition of all available names.
+.sp
+Option \-q/\-\-quiet suppresses all output when searching for NAME
+and shows only the path names when listing all definitions.
+.sp
+Path names are defined in the [paths] section of your
+configuration file and in \fB/etc/mercurial/hgrc\fP. If run inside a
+repository, \fB.hg/hgrc\fP is used, too.
+.sp
+The path names \fBdefault\fP and \fBdefault\-push\fP have a special
+meaning. When performing a push or pull operation, they are used
+as fallbacks if no location is specified on the command\-line.
+When \fBdefault\-push\fP is set, it will be used for push and
+\fBdefault\fP will be used for pull; otherwise \fBdefault\fP is used
+as the fallback for both. When cloning a repository, the clone
+source is written as \fBdefault\fP in \fB.hg/hgrc\fP. Note that
+\fBdefault\fP and \fBdefault\-push\fP apply to all inbound (e.g.
+\%\fBhg incoming\fP\:) and outbound (e.g. \%\fBhg outgoing\fP\:, \%\fBhg email\fP\: and
+\%\fBhg bundle\fP\:) operations.
+.sp
+See \%\fBhg help urls\fP\: for more information.
+.sp
+Returns 0 on success.
+.SS phase
+.sp
+.nf
+.ft C
+hg phase [\-p|\-d|\-s] [\-f] [\-r] REV...
+.ft P
+.fi
+.sp
+With no argument, show the phase name of specified revisions.
+.sp
+With one of \-p/\-\-public, \-d/\-\-draft or \-s/\-\-secret, change the
+phase value of the specified revisions.
+.sp
+Unless \-f/\-\-force is specified, \%\fBhg phase\fP\: won\(aqt move changeset from a
+lower phase to an higher phase. Phases are ordered as follows:
+.sp
+.nf
+.ft C
+public < draft < secret
+.ft P
+.fi
+.sp
+Return 0 on success, 1 if no phases were changed or some could not
+be changed.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-p, \-\-public
+.
+set changeset phase to public
+.TP
+.B \-d, \-\-draft
+.
+set changeset phase to draft
+.TP
+.B \-s, \-\-secret
+.
+set changeset phase to secret
+.TP
+.B \-f, \-\-force
+.
+allow to move boundary backward
+.TP
+.B \-r, \-\-rev
+.
+target revision
+.UNINDENT
+.SS pull
+.sp
+.nf
+.ft C
+hg pull [\-u] [\-f] [\-r REV]... [\-e CMD] [\-\-remotecmd CMD] [SOURCE]
+.ft P
+.fi
+.sp
+Pull changes from a remote repository to a local one.
+.sp
+This finds all changes from the repository at the specified path
+or URL and adds them to a local repository (the current one unless
+\-R is specified). By default, this does not update the copy of the
+project in the working directory.
+.sp
+Use \%\fBhg incoming\fP\: if you want to see what would have been added
+by a pull at the time you issued this command. If you then decide
+to add those changes to the repository, you should use \%\fBhg pull
+\-r X\fP\: where \fBX\fP is the last changeset listed by \%\fBhg incoming\fP\:.
+.sp
+If SOURCE is omitted, the \(aqdefault\(aq path will be used.
+See \%\fBhg help urls\fP\: for more information.
+.sp
+Returns 0 on success, 1 if an update had unresolved files.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-u, \-\-update
+.
+update to new branch head if changesets were pulled
+.TP
+.B \-f, \-\-force
+.
+run even when remote repository is unrelated
+.TP
+.B \-r, \-\-rev
+.
+a remote changeset intended to be added
+.TP
+.B \-B, \-\-bookmark
+.
+bookmark to pull
+.TP
+.B \-b, \-\-branch
+.
+a specific branch you would like to pull
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS push
+.sp
+.nf
+.ft C
+hg push [\-f] [\-r REV]... [\-e CMD] [\-\-remotecmd CMD] [DEST]
+.ft P
+.fi
+.sp
+Push changesets from the local repository to the specified
+destination.
+.sp
+This operation is symmetrical to pull: it is identical to a pull
+in the destination repository from the current one.
+.sp
+By default, push will not allow creation of new heads at the
+destination, since multiple heads would make it unclear which head
+to use. In this situation, it is recommended to pull and merge
+before pushing.
+.sp
+Use \-\-new\-branch if you want to allow push to create a new named
+branch that is not present at the destination. This allows you to
+only create a new branch without forcing other changes.
+.sp
+Use \-f/\-\-force to override the default behavior and push all
+changesets on all branches.
+.sp
+If \-r/\-\-rev is used, the specified revision and all its ancestors
+will be pushed to the remote repository.
+.sp
+If \-B/\-\-bookmark is used, the specified bookmarked revision, its
+ancestors, and the bookmark will be pushed to the remote
+repository.
+.sp
+Please see \%\fBhg help urls\fP\: for important details about \fBssh://\fP
+URLs. If DESTINATION is omitted, a default path will be used.
+.sp
+Returns 0 if push was successful, 1 if nothing to push.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+force push
+.TP
+.B \-r, \-\-rev
+.
+a changeset intended to be included in the destination
+.TP
+.B \-B, \-\-bookmark
+.
+bookmark to push
+.TP
+.B \-b, \-\-branch
+.
+a specific branch you would like to push
+.TP
+.B \-\-new\-branch
+.
+allow pushing a new branch
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS recover
+.sp
+.nf
+.ft C
+hg recover
+.ft P
+.fi
+.sp
+Recover from an interrupted commit or pull.
+.sp
+This command tries to fix the repository status after an
+interrupted operation. It should only be necessary when Mercurial
+suggests it.
+.sp
+Returns 0 if successful, 1 if nothing to recover or verify fails.
+.SS remove
+.sp
+.nf
+.ft C
+hg remove [OPTION]... FILE...
+.ft P
+.fi
+.sp
+Schedule the indicated files for removal from the current branch.
+.sp
+This command schedules the files to be removed at the next commit.
+To undo a remove before that, see \%\fBhg revert\fP\:. To undo added
+files, see \%\fBhg forget\fP\:.
+.sp
+\-A/\-\-after can be used to remove only files that have already
+been deleted, \-f/\-\-force can be used to force deletion, and \-Af
+can be used to remove files from the next revision without
+deleting them from the working directory.
+.sp
+The following table details the behavior of remove for different
+file states (columns) and option combinations (rows). The file
+states are Added [A], Clean [C], Modified [M] and Missing [!]
+(as reported by \%\fBhg status\fP\:). The actions are Warn, Remove
+(from branch) and Delete (from disk):
+.TS
+center;
+|l|l|l|l|l|.
+_
+T{
+T} T{
+T} T{
+T} T{
+T} T{
+T}
+_
+T{
+none
+T} T{
+W
+T} T{
+RD
+T} T{
+W
+T} T{
+R
+T}
+_
+T{
+\-f
+T} T{
+R
+T} T{
+RD
+T} T{
+RD
+T} T{
+R
+T}
+_
+T{
+\-A
+T} T{
+W
+T} T{
+W
+T} T{
+W
+T} T{
+R
+T}
+_
+T{
+\-Af
+T} T{
+R
+T} T{
+R
+T} T{
+R
+T} T{
+R
+T}
+_
+.TE
+.sp
+Note that remove never deletes files in Added [A] state from the
+working directory, not even if option \-\-force is specified.
+.sp
+Returns 0 on success, 1 if any warnings encountered.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-after
+.
+record delete for missing files
+.TP
+.B \-f, \-\-force
+.
+remove (and delete) file even if added or modified
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.sp
+aliases: rm
+.UNINDENT
+.SS rename
+.sp
+.nf
+.ft C
+hg rename [OPTION]... SOURCE... DEST
+.ft P
+.fi
+.sp
+Mark dest as copies of sources; mark sources for deletion. If dest
+is a directory, copies are put in that directory. If dest is a
+file, there can only be one source.
+.sp
+By default, this command copies the contents of files as they
+exist in the working directory. If invoked with \-A/\-\-after, the
+operation is recorded, but no copying is performed.
+.sp
+This command takes effect at the next commit. To undo a rename
+before that, see \%\fBhg revert\fP\:.
+.sp
+Returns 0 on success, 1 if errors are encountered.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-after
+.
+record a rename that has already occurred
+.TP
+.B \-f, \-\-force
+.
+forcibly copy over an existing managed file
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.sp
+aliases: move mv
+.UNINDENT
+.SS resolve
+.sp
+.nf
+.ft C
+hg resolve [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Merges with unresolved conflicts are often the result of
+non\-interactive merging using the \fBinternal:merge\fP configuration
+setting, or a command\-line merge tool like \fBdiff3\fP. The resolve
+command is used to manage the files involved in a merge, after
+\%\fBhg merge\fP\: has been run, and before \%\fBhg commit\fP\: is run (i.e. the
+working directory must have two parents). See \%\fBhg help
+merge\-tools\fP\: for information on configuring merge tools.
+.sp
+The resolve command can be used in the following ways:
+.INDENT 0.0
+.IP \(bu 2
+.
+\%\fBhg resolve [\-\-tool TOOL] FILE...\fP\:: attempt to re\-merge the specified
+files, discarding any previous merge attempts. Re\-merging is not
+performed for files already marked as resolved. Use \fB\-\-all/\-a\fP
+to select all unresolved files. \fB\-\-tool\fP can be used to specify
+the merge tool used for the given files. It overrides the HGMERGE
+environment variable and your configuration files. Previous file
+contents are saved with a \fB.orig\fP suffix.
+.IP \(bu 2
+.
+\%\fBhg resolve \-m [FILE]\fP\:: mark a file as having been resolved
+(e.g. after having manually fixed\-up the files). The default is
+to mark all unresolved files.
+.IP \(bu 2
+.
+\%\fBhg resolve \-u [FILE]...\fP\:: mark a file as unresolved. The
+default is to mark all resolved files.
+.IP \(bu 2
+.
+\%\fBhg resolve \-l\fP\:: list files which had or still have conflicts.
+In the printed list, \fBU\fP = unresolved and \fBR\fP = resolved.
+.UNINDENT
+.sp
+Note that Mercurial will not let you commit files with unresolved
+merge conflicts. You must use \%\fBhg resolve \-m ...\fP\: before you can
+commit after a conflicting merge.
+.sp
+Returns 0 on success, 1 if any files fail a resolve attempt.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-all
+.
+select all unresolved files
+.TP
+.B \-l, \-\-list
+.
+list state of files needing merge
+.TP
+.B \-m, \-\-mark
+.
+mark files as resolved
+.TP
+.B \-u, \-\-unmark
+.
+mark files as unresolved
+.TP
+.B \-n, \-\-no\-status
+.
+hide status prefix
+.TP
+.B \-t, \-\-tool
+.
+specify merge tool
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS revert
+.sp
+.nf
+.ft C
+hg revert [OPTION]... [\-r REV] [NAME]...
+.ft P
+.fi
+.IP Note
+.
+To check out earlier revisions, you should use \%\fBhg update REV\fP\:.
+To cancel an uncommitted merge (and lose your changes), use
+\%\fBhg update \-\-clean .\fP\:.
+.RE
+.sp
+With no revision specified, revert the specified files or directories
+to the contents they had in the parent of the working directory.
+This restores the contents of files to an unmodified
+state and unschedules adds, removes, copies, and renames. If the
+working directory has two parents, you must explicitly specify a
+revision.
+.sp
+Using the \-r/\-\-rev or \-d/\-\-date options, revert the given files or
+directories to their states as of a specific revision. Because
+revert does not change the working directory parents, this will
+cause these files to appear modified. This can be helpful to "back
+out" some or all of an earlier change. See \%\fBhg backout\fP\: for a
+related method.
+.sp
+Modified files are saved with a .orig suffix before reverting.
+To disable these backups, use \-\-no\-backup.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-all
+.
+revert all changes when no arguments given
+.TP
+.B \-d, \-\-date
+.
+tipmost revision matching date
+.TP
+.B \-r, \-\-rev
+.
+revert to the specified revision
+.TP
+.B \-C, \-\-no\-backup
+.
+do not save backup copies of files
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.UNINDENT
+.SS rollback
+.sp
+.nf
+.ft C
+hg rollback
+.ft P
+.fi
+.sp
+This command should be used with care. There is only one level of
+rollback, and there is no way to undo a rollback. It will also
+restore the dirstate at the time of the last transaction, losing
+any dirstate changes since that time. This command does not alter
+the working directory.
+.sp
+Transactions are used to encapsulate the effects of all commands
+that create new changesets or propagate existing changesets into a
+repository.
+.sp
+For example, the following commands are transactional, and their
+effects can be rolled back:
+.INDENT 0.0
+.IP \(bu 2
+.
+commit
+.IP \(bu 2
+.
+import
+.IP \(bu 2
+.
+pull
+.IP \(bu 2
+.
+push (with this repository as the destination)
+.IP \(bu 2
+.
+unbundle
+.UNINDENT
+.sp
+To avoid permanent data loss, rollback will refuse to rollback a
+commit transaction if it isn\(aqt checked out. Use \-\-force to
+override this protection.
+.sp
+This command is not intended for use on public repositories. Once
+changes are visible for pull by other users, rolling a transaction
+back locally is ineffective (someone else may already have pulled
+the changes). Furthermore, a race is possible with readers of the
+repository; for example an in\-progress pull from the repository
+may fail if a rollback is performed.
+.sp
+Returns 0 on success, 1 if no rollback data is available.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-n, \-\-dry\-run
+.
+do not perform actions, just print output
+.TP
+.B \-f, \-\-force
+.
+ignore safety measures
+.UNINDENT
+.SS root
+.sp
+.nf
+.ft C
+hg root
+.ft P
+.fi
+.sp
+Print the root directory of the current repository.
+.sp
+Returns 0 on success.
+.SS serve
+.sp
+.nf
+.ft C
+hg serve [OPTION]...
+.ft P
+.fi
+.sp
+Start a local HTTP repository browser and pull server. You can use
+this for ad\-hoc sharing and browsing of repositories. It is
+recommended to use a real web server to serve a repository for
+longer periods of time.
+.sp
+Please note that the server does not implement access control.
+This means that, by default, anybody can read from the server and
+nobody can write to it by default. Set the \fBweb.allow_push\fP
+option to \fB*\fP to allow everybody to push to the server. You
+should use a real web server if you need to authenticate users.
+.sp
+By default, the server logs accesses to stdout and errors to
+stderr. Use the \-A/\-\-accesslog and \-E/\-\-errorlog options to log to
+files.
+.sp
+To have the server choose a free port number to listen on, specify
+a port number of 0; in this case, the server will print the port
+number it uses.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-accesslog
+.
+name of access log file to write to
+.TP
+.B \-d, \-\-daemon
+.
+run server in background
+.TP
+.B \-\-daemon\-pipefds
+.
+used internally by daemon mode
+.TP
+.B \-E, \-\-errorlog
+.
+name of error log file to write to
+.TP
+.B \-p, \-\-port
+.
+port to listen on (default: 8000)
+.TP
+.B \-a, \-\-address
+.
+address to listen on (default: all interfaces)
+.TP
+.B \-\-prefix
+.
+prefix path to serve from (default: server root)
+.TP
+.B \-n, \-\-name
+.
+name to show in web pages (default: working directory)
+.TP
+.B \-\-web\-conf
+.
+name of the hgweb config file (see "hg help hgweb")
+.TP
+.B \-\-webdir\-conf
+.
+name of the hgweb config file (DEPRECATED)
+.TP
+.B \-\-pid\-file
+.
+name of file to write process ID to
+.TP
+.B \-\-stdio
+.
+for remote clients
+.TP
+.B \-\-cmdserver
+.
+for remote clients
+.TP
+.B \-t, \-\-templates
+.
+web templates to use
+.TP
+.B \-\-style
+.
+template style to use
+.TP
+.B \-6, \-\-ipv6
+.
+use IPv6 in addition to IPv4
+.TP
+.B \-\-certificate
+.
+SSL certificate file
+.UNINDENT
+.SS showconfig
+.sp
+.nf
+.ft C
+hg showconfig [\-u] [NAME]...
+.ft P
+.fi
+.sp
+With no arguments, print names and values of all config items.
+.sp
+With one argument of the form section.name, print just the value
+of that config item.
+.sp
+With multiple arguments, print names and values of all config
+items with matching section names.
+.sp
+With \-\-debug, the source (filename and line number) is printed
+for each config item.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-u, \-\-untrusted
+.
+show untrusted configuration options
+.sp
+aliases: debugconfig
+.UNINDENT
+.SS status
+.sp
+.nf
+.ft C
+hg status [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Show status of files in the repository. If names are given, only
+files that match are shown. Files that are clean or ignored or
+the source of a copy/move operation, are not listed unless
+\-c/\-\-clean, \-i/\-\-ignored, \-C/\-\-copies or \-A/\-\-all are given.
+Unless options described with "show only ..." are given, the
+options \-mardu are used.
+.sp
+Option \-q/\-\-quiet hides untracked (unknown and ignored) files
+unless explicitly requested with \-u/\-\-unknown or \-i/\-\-ignored.
+.IP Note
+.
+status may appear to disagree with diff if permissions have
+changed or a merge has occurred. The standard diff format does
+not report permission changes and diff only reports changes
+relative to one merge parent.
+.RE
+.sp
+If one revision is given, it is used as the base revision.
+If two revisions are given, the differences between them are
+shown. The \-\-change option can also be used as a shortcut to list
+the changed files of a revision from its first parent.
+.sp
+The codes used to show the status of files are:
+.sp
+.nf
+.ft C
+M = modified
+A = added
+R = removed
+C = clean
+! = missing (deleted by non\-hg command, but still tracked)
+? = not tracked
+I = ignored
+ = origin of the previous file listed as A (added)
+.ft P
+.fi
+.sp
+Examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+show changes in the working directory relative to a
+changeset:
+.sp
+.nf
+.ft C
+hg status \-\-rev 9353
+.ft P
+.fi
+.IP \(bu 2
+.
+show all changes including copies in an existing changeset:
+.sp
+.nf
+.ft C
+hg status \-\-copies \-\-change 9353
+.ft P
+.fi
+.IP \(bu 2
+.
+get a NUL separated list of added files, suitable for xargs:
+.sp
+.nf
+.ft C
+hg status \-an0
+.ft P
+.fi
+.UNINDENT
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-all
+.
+show status of all files
+.TP
+.B \-m, \-\-modified
+.
+show only modified files
+.TP
+.B \-a, \-\-added
+.
+show only added files
+.TP
+.B \-r, \-\-removed
+.
+show only removed files
+.TP
+.B \-d, \-\-deleted
+.
+show only deleted (but tracked) files
+.TP
+.B \-c, \-\-clean
+.
+show only files without changes
+.TP
+.B \-u, \-\-unknown
+.
+show only unknown (not tracked) files
+.TP
+.B \-i, \-\-ignored
+.
+show only ignored files
+.TP
+.B \-n, \-\-no\-status
+.
+hide status prefix
+.TP
+.B \-C, \-\-copies
+.
+show source of copied files
+.TP
+.B \-0, \-\-print0
+.
+end filenames with NUL, for use with xargs
+.TP
+.B \-\-rev
+.
+show difference from revision
+.TP
+.B \-\-change
+.
+list the changed files of a revision
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.sp
+aliases: st
+.UNINDENT
+.SS summary
+.sp
+.nf
+.ft C
+hg summary [\-\-remote]
+.ft P
+.fi
+.sp
+This generates a brief summary of the working directory state,
+including parents, branch, commit status, and available updates.
+.sp
+With the \-\-remote option, this will check the default paths for
+incoming and outgoing changes. This can be time\-consuming.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-remote
+.
+check for push and pull
+.sp
+aliases: sum
+.UNINDENT
+.SS tag
+.sp
+.nf
+.ft C
+hg tag [\-f] [\-l] [\-m TEXT] [\-d DATE] [\-u USER] [\-r REV] NAME...
+.ft P
+.fi
+.sp
+Name a particular revision using <name>.
+.sp
+Tags are used to name particular revisions of the repository and are
+very useful to compare different revisions, to go back to significant
+earlier versions or to mark branch points as releases, etc. Changing
+an existing tag is normally disallowed; use \-f/\-\-force to override.
+.sp
+If no revision is given, the parent of the working directory is
+used, or tip if no revision is checked out.
+.sp
+To facilitate version control, distribution, and merging of tags,
+they are stored as a file named ".hgtags" which is managed similarly
+to other project files and can be hand\-edited if necessary. This
+also means that tagging creates a new commit. The file
+".hg/localtags" is used for local tags (not shared among
+repositories).
+.sp
+Tag commits are usually made at the head of a branch. If the parent
+of the working directory is not a branch head, \%\fBhg tag\fP\: aborts; use
+\-f/\-\-force to force the tag commit to be based on a non\-head
+changeset.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Since tag names have priority over branch names during revision
+lookup, using an existing branch name as a tag name is discouraged.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-force
+.
+force tag
+.TP
+.B \-l, \-\-local
+.
+make the tag local
+.TP
+.B \-r, \-\-rev
+.
+revision to tag
+.TP
+.B \-\-remove
+.
+remove a tag
+.TP
+.B \-e, \-\-edit
+.
+edit commit message
+.TP
+.B \-m, \-\-message
+.
+use <text> as commit message
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.UNINDENT
+.SS tags
+.sp
+.nf
+.ft C
+hg tags
+.ft P
+.fi
+.sp
+This lists both regular and local tags. When the \-v/\-\-verbose
+switch is used, a third column "local" is printed for local tags.
+.sp
+Returns 0 on success.
+.SS tip
+.sp
+.nf
+.ft C
+hg tip [\-p] [\-g]
+.ft P
+.fi
+.sp
+The tip revision (usually just called the tip) is the changeset
+most recently added to the repository (and therefore the most
+recently changed head).
+.sp
+If you have just made a commit, that commit will be the tip. If
+you have just pulled changes from another repository, the tip of
+that repository becomes the current tip. The "tip" tag is special
+and cannot be renamed or assigned to a different changeset.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-p, \-\-patch
+.
+show patch
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.UNINDENT
+.SS unbundle
+.sp
+.nf
+.ft C
+hg unbundle [\-u] FILE...
+.ft P
+.fi
+.sp
+Apply one or more compressed changegroup files generated by the
+bundle command.
+.sp
+Returns 0 on success, 1 if an update has unresolved files.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-u, \-\-update
+.
+update to new branch head if changesets were unbundled
+.UNINDENT
+.SS update
+.sp
+.nf
+.ft C
+hg update [\-c] [\-C] [\-d DATE] [[\-r] REV]
+.ft P
+.fi
+.sp
+Update the repository\(aqs working directory to the specified
+changeset. If no changeset is specified, update to the tip of the
+current named branch and move the current bookmark (see \%\fBhg help
+bookmarks\fP\:).
+.sp
+Update sets the working directory\(aqs parent revison to the specified
+changeset (see \%\fBhg help parents\fP\:).
+.sp
+If the changeset is not a descendant or ancestor of the working
+directory\(aqs parent, the update is aborted. With the \-c/\-\-check
+option, the working directory is checked for uncommitted changes; if
+none are found, the working directory is updated to the specified
+changeset.
+.sp
+The following rules apply when the working directory contains
+uncommitted changes:
+.INDENT 0.0
+.IP 1. 3
+.
+If neither \-c/\-\-check nor \-C/\-\-clean is specified, and if
+the requested changeset is an ancestor or descendant of
+the working directory\(aqs parent, the uncommitted changes
+are merged into the requested changeset and the merged
+result is left uncommitted. If the requested changeset is
+not an ancestor or descendant (that is, it is on another
+branch), the update is aborted and the uncommitted changes
+are preserved.
+.IP 2. 3
+.
+With the \-c/\-\-check option, the update is aborted and the
+uncommitted changes are preserved.
+.IP 3. 3
+.
+With the \-C/\-\-clean option, uncommitted changes are discarded and
+the working directory is updated to the requested changeset.
+.UNINDENT
+.sp
+To cancel an uncommitted merge (and lose your changes), use
+\%\fBhg update \-\-clean .\fP\:.
+.sp
+Use null as the changeset to remove the working directory (like
+\%\fBhg clone \-U\fP\:).
+.sp
+If you want to revert just one file to an older revision, use
+\%\fBhg revert [\-r REV] NAME\fP\:.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Returns 0 on success, 1 if there are unresolved files.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-C, \-\-clean
+.
+discard uncommitted changes (no backup)
+.TP
+.B \-c, \-\-check
+.
+update across branches if no uncommitted changes
+.TP
+.B \-d, \-\-date
+.
+tipmost revision matching date
+.TP
+.B \-r, \-\-rev
+.
+revision
+.sp
+aliases: up checkout co
+.UNINDENT
+.SS verify
+.sp
+.nf
+.ft C
+hg verify
+.ft P
+.fi
+.sp
+Verify the integrity of the current repository.
+.sp
+This will perform an extensive check of the repository\(aqs
+integrity, validating the hashes and checksums of each entry in
+the changelog, manifest, and tracked files, as well as the
+integrity of their crosslinks and indices.
+.sp
+Returns 0 on success, 1 if errors are encountered.
+.SS version
+.sp
+.nf
+.ft C
+hg version
+.ft P
+.fi
+.sp
+output version and copyright information
+.SH DATE FORMATS
+.sp
+Some commands allow the user to specify a date, e.g.:
+.INDENT 0.0
+.IP \(bu 2
+.
+backout, commit, import, tag: Specify the commit date.
+.IP \(bu 2
+.
+log, revert, update: Select revision(s) by date.
+.UNINDENT
+.sp
+Many date formats are valid. Here are some examples:
+.INDENT 0.0
+.IP \(bu 2
+.
+\fBWed Dec 6 13:18:29 2006\fP (local timezone assumed)
+.IP \(bu 2
+.
+\fBDec 6 13:18 \-0600\fP (year assumed, time offset provided)
+.IP \(bu 2
+.
+\fBDec 6 13:18 UTC\fP (UTC and GMT are aliases for +0000)
+.IP \(bu 2
+.
+\fBDec 6\fP (midnight)
+.IP \(bu 2
+.
+\fB13:18\fP (today assumed)
+.IP \(bu 2
+.
+\fB3:39\fP (3:39AM assumed)
+.IP \(bu 2
+.
+\fB3:39pm\fP (15:39)
+.IP \(bu 2
+.
+\fB2006\-12\-06 13:18:29\fP (ISO 8601 format)
+.IP \(bu 2
+.
+\fB2006\-12\-6 13:18\fP
+.IP \(bu 2
+.
+\fB2006\-12\-6\fP
+.IP \(bu 2
+.
+\fB12\-6\fP
+.IP \(bu 2
+.
+\fB12/6\fP
+.IP \(bu 2
+.
+\fB12/6/6\fP (Dec 6 2006)
+.UNINDENT
+.sp
+Lastly, there is Mercurial\(aqs internal format:
+.INDENT 0.0
+.IP \(bu 2
+.
+\fB1165432709 0\fP (Wed Dec 6 13:18:29 2006 UTC)
+.UNINDENT
+.sp
+This is the internal representation format for dates. The first number
+is the number of seconds since the epoch (1970\-01\-01 00:00 UTC). The
+second is the offset of the local timezone, in seconds west of UTC
+(negative if the timezone is east of UTC).
+.sp
+The log command also accepts date ranges:
+.INDENT 0.0
+.IP \(bu 2
+.
+\fB<DATE\fP \- at or before a given date/time
+.IP \(bu 2
+.
+\fB>DATE\fP \- on or after a given date/time
+.IP \(bu 2
+.
+\fBDATE to DATE\fP \- a date range, inclusive
+.IP \(bu 2
+.
+\fB\-DAYS\fP \- within a given number of days of today
+.UNINDENT
+.SH DIFF FORMATS
+.sp
+Mercurial\(aqs default format for showing changes between two versions of
+a file is compatible with the unified format of GNU diff, which can be
+used by GNU patch and many other standard tools.
+.sp
+While this standard format is often enough, it does not encode the
+following information:
+.INDENT 0.0
+.IP \(bu 2
+.
+executable status and other permission bits
+.IP \(bu 2
+.
+copy or rename information
+.IP \(bu 2
+.
+changes in binary files
+.IP \(bu 2
+.
+creation or deletion of empty files
+.UNINDENT
+.sp
+Mercurial also supports the extended diff format from the git VCS
+which addresses these limitations. The git diff format is not produced
+by default because a few widespread tools still do not understand this
+format.
+.sp
+This means that when generating diffs from a Mercurial repository
+(e.g. with \%\fBhg export\fP\:), you should be careful about things like file
+copies and renames or other things mentioned above, because when
+applying a standard diff to a different repository, this extra
+information is lost. Mercurial\(aqs internal operations (like push and
+pull) are not affected by this, because they use an internal binary
+format for communicating changes.
+.sp
+To make Mercurial produce the git extended diff format, use the \-\-git
+option available for many commands, or set \(aqgit = True\(aq in the [diff]
+section of your configuration file. You do not need to set this option
+when importing diffs in this format or using them in the mq extension.
+.SH ENVIRONMENT VARIABLES
+.INDENT 0.0
+.TP
+.B HG
+.
+Path to the \(aqhg\(aq executable, automatically passed when running
+hooks, extensions or external tools. If unset or empty, this is
+the hg executable\(aqs name if it\(aqs frozen, or an executable named
+\(aqhg\(aq (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on
+Windows) is searched.
+.TP
+.B HGEDITOR
+.
+This is the name of the editor to run when committing. See EDITOR.
+.sp
+(deprecated, use configuration file)
+.TP
+.B HGENCODING
+.
+This overrides the default locale setting detected by Mercurial.
+This setting is used to convert data including usernames,
+changeset descriptions, tag names, and branches. This setting can
+be overridden with the \-\-encoding command\-line option.
+.TP
+.B HGENCODINGMODE
+.
+This sets Mercurial\(aqs behavior for handling unknown characters
+while transcoding user input. The default is "strict", which
+causes Mercurial to abort if it can\(aqt map a character. Other
+settings include "replace", which replaces unknown characters, and
+"ignore", which drops them. This setting can be overridden with
+the \-\-encodingmode command\-line option.
+.TP
+.B HGENCODINGAMBIGUOUS
+.
+This sets Mercurial\(aqs behavior for handling characters with
+"ambiguous" widths like accented Latin characters with East Asian
+fonts. By default, Mercurial assumes ambiguous characters are
+narrow, set this variable to "wide" if such characters cause
+formatting problems.
+.TP
+.B HGMERGE
+.
+An executable to use for resolving merge conflicts. The program
+will be executed with three arguments: local file, remote file,
+ancestor file.
+.sp
+(deprecated, use configuration file)
+.TP
+.B HGRCPATH
+.
+A list of files or directories to search for configuration
+files. Item separator is ":" on Unix, ";" on Windows. If HGRCPATH
+is not set, platform default search path is used. If empty, only
+the .hg/hgrc from the current repository is read.
+.sp
+For each element in HGRCPATH:
+.INDENT 7.0
+.IP \(bu 2
+.
+if it\(aqs a directory, all files ending with .rc are added
+.IP \(bu 2
+.
+otherwise, the file itself will be added
+.UNINDENT
+.TP
+.B HGPLAIN
+.
+When set, this disables any configuration settings that might
+change Mercurial\(aqs default output. This includes encoding,
+defaults, verbose mode, debug mode, quiet mode, tracebacks, and
+localization. This can be useful when scripting against Mercurial
+in the face of existing user configuration.
+.sp
+Equivalent options set via command line flags or environment
+variables are not overridden.
+.TP
+.B HGPLAINEXCEPT
+.
+This is a comma\-separated list of features to preserve when
+HGPLAIN is enabled. Currently the only value supported is "i18n",
+which preserves internationalization in plain mode.
+.sp
+Setting HGPLAINEXCEPT to anything (even an empty string) will
+enable plain mode.
+.TP
+.B HGUSER
+.
+This is the string used as the author of a commit. If not set,
+available values will be considered in this order:
+.INDENT 7.0
+.IP \(bu 2
+.
+HGUSER (deprecated)
+.IP \(bu 2
+.
+configuration files from the HGRCPATH
+.IP \(bu 2
+.
+EMAIL
+.IP \(bu 2
+.
+interactive prompt
+.IP \(bu 2
+.
+LOGNAME (with \fB@hostname\fP appended)
+.UNINDENT
+.sp
+(deprecated, use configuration file)
+.TP
+.B EMAIL
+.
+May be used as the author of a commit; see HGUSER.
+.TP
+.B LOGNAME
+.
+May be used as the author of a commit; see HGUSER.
+.TP
+.B VISUAL
+.
+This is the name of the editor to use when committing. See EDITOR.
+.TP
+.B EDITOR
+.
+Sometimes Mercurial needs to open a text file in an editor for a
+user to modify, for example when writing commit messages. The
+editor it uses is determined by looking at the environment
+variables HGEDITOR, VISUAL and EDITOR, in that order. The first
+non\-empty one is chosen. If all of them are empty, the editor
+defaults to \(aqvi\(aq.
+.TP
+.B PYTHONPATH
+.
+This is used by Python to find imported modules and may need to be
+set appropriately if this Mercurial is not installed system\-wide.
+.UNINDENT
+.SH USING ADDITIONAL FEATURES
+.sp
+Mercurial has the ability to add new features through the use of
+extensions. Extensions may add new commands, add options to
+existing commands, change the default behavior of commands, or
+implement hooks.
+.sp
+Extensions are not loaded by default for a variety of reasons:
+they can increase startup overhead; they may be meant for advanced
+usage only; they may provide potentially dangerous abilities (such
+as letting you destroy or modify history); they might not be ready
+for prime time; or they may alter some usual behaviors of stock
+Mercurial. It is thus up to the user to activate extensions as
+needed.
+.sp
+To enable the "foo" extension, either shipped with Mercurial or in the
+Python search path, create an entry for it in your configuration file,
+like this:
+.sp
+.nf
+.ft C
+[extensions]
+foo =
+.ft P
+.fi
+.sp
+You may also specify the full path to an extension:
+.sp
+.nf
+.ft C
+[extensions]
+myfeature = ~/.hgext/myfeature.py
+.ft P
+.fi
+.sp
+To explicitly disable an extension enabled in a configuration file of
+broader scope, prepend its path with !:
+.sp
+.nf
+.ft C
+[extensions]
+# disabling extension bar residing in /path/to/extension/bar.py
+bar = !/path/to/extension/bar.py
+# ditto, but no path was supplied for extension baz
+baz = !
+.ft P
+.fi
+.sp
+disabled extensions:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.TP
+.B acl
+.
+hooks for controlling repository access
+.TP
+.B bugzilla
+.
+hooks for integrating with the Bugzilla bug tracker
+.TP
+.B children
+.
+command to display child changesets (DEPRECATED)
+.TP
+.B churn
+.
+command to display statistics about repository history
+.TP
+.B color
+.
+colorize output from some commands
+.TP
+.B convert
+.
+import revisions from foreign VCS repositories into Mercurial
+.TP
+.B eol
+.
+automatically manage newlines in repository files
+.TP
+.B extdiff
+.
+command to allow external programs to compare revisions
+.TP
+.B factotum
+.
+http authentication with factotum
+.TP
+.B fetch
+.
+pull, update and merge in one command (DEPRECATED)
+.TP
+.B gpg
+.
+commands to sign and verify changesets
+.TP
+.B graphlog
+.
+command to view revision graphs from a shell
+.TP
+.B hgcia
+.
+hooks for integrating with the CIA.vc notification service
+.TP
+.B hgk
+.
+browse the repository in a graphical way
+.TP
+.B highlight
+.
+syntax highlighting for hgweb (requires Pygments)
+.TP
+.B histedit
+.
+interactive history editing
+.TP
+.B inotify
+.
+accelerate status report using Linux\(aqs inotify service
+.TP
+.B interhg
+.
+expand expressions into changelog and summaries
+.TP
+.B keyword
+.
+expand keywords in tracked files
+.TP
+.B largefiles
+.
+track large binary files
+.TP
+.B mq
+.
+manage a stack of patches
+.TP
+.B notify
+.
+hooks for sending email push notifications
+.TP
+.B pager
+.
+browse command output with an external pager
+.TP
+.B patchbomb
+.
+command to send changesets as (a series of) patch emails
+.TP
+.B progress
+.
+show progress bars for some actions
+.TP
+.B purge
+.
+command to delete untracked files from the working directory
+.TP
+.B rebase
+.
+command to move sets of revisions to a different ancestor
+.TP
+.B record
+.
+commands to interactively select changes for commit/qrefresh
+.TP
+.B relink
+.
+recreates hardlinks between repository clones
+.TP
+.B schemes
+.
+extend schemes with shortcuts to repository swarms
+.TP
+.B share
+.
+share a common history between several working directories
+.TP
+.B transplant
+.
+command to transplant changesets from another branch
+.TP
+.B win32mbcs
+.
+allow the use of MBCS paths with problematic encodings
+.TP
+.B win32text
+.
+perform automatic newline conversion
+.TP
+.B zeroconf
+.
+discover and advertise repositories on the local network
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.SH SPECIFYING FILE SETS
+.sp
+Mercurial supports a functional language for selecting a set of
+files.
+.sp
+Like other file patterns, this pattern type is indicated by a prefix,
+\(aqset:\(aq. The language supports a number of predicates which are joined
+by infix operators. Parenthesis can be used for grouping.
+.sp
+Identifiers such as filenames or patterns must be quoted with single
+or double quotes if they contain characters outside of
+\fB[.*{}[]?/\e_a\-zA\-Z0\-9\ex80\-\exff]\fP or if they match one of the
+predefined predicates. This generally applies to file patterns other
+than globs and arguments for predicates.
+.sp
+Special characters can be used in quoted identifiers by escaping them,
+e.g., \fB\en\fP is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with \fBr\fP, e.g. \fBr\(aq...\(aq\fP.
+.sp
+There is a single prefix operator:
+.INDENT 0.0
+.TP
+.B \fBnot x\fP
+.sp
+Files not in x. Short form is \fB! x\fP.
+.UNINDENT
+.sp
+These are the supported infix operators:
+.INDENT 0.0
+.TP
+.B \fBx and y\fP
+.sp
+The intersection of files in x and y. Short form is \fBx & y\fP.
+.TP
+.B \fBx or y\fP
+.sp
+The union of files in x and y. There are two alternative short
+forms: \fBx | y\fP and \fBx + y\fP.
+.TP
+.B \fBx \- y\fP
+.sp
+Files in x but not in y.
+.UNINDENT
+.sp
+The following predicates are supported:
+.INDENT 0.0
+.TP
+.B \fBadded()\fP
+.sp
+File that is added according to status.
+.TP
+.B \fBbinary()\fP
+.sp
+File that appears to be binary (contains NUL bytes).
+.TP
+.B \fBclean()\fP
+.sp
+File that is clean according to status.
+.TP
+.B \fBcopied()\fP
+.sp
+File that is recorded as being copied.
+.TP
+.B \fBdeleted()\fP
+.sp
+File that is deleted according to status.
+.TP
+.B \fBencoding(name)\fP
+.sp
+File can be successfully decoded with the given character
+encoding. May not be useful for encodings other than ASCII and
+UTF\-8.
+.TP
+.B \fBexec()\fP
+.sp
+File that is marked as executable.
+.TP
+.B \fBgrep(regex)\fP
+.sp
+File contains the given regular expression.
+.TP
+.B \fBhgignore()\fP
+.sp
+File that matches the active .hgignore pattern.
+.TP
+.B \fBignored()\fP
+.sp
+File that is ignored according to status. These files will only be
+considered if this predicate is used.
+.TP
+.B \fBmodified()\fP
+.sp
+File that is modified according to status.
+.TP
+.B \fBremoved()\fP
+.sp
+File that is removed according to status.
+.TP
+.B \fBresolved()\fP
+.sp
+File that is marked resolved according to the resolve state.
+.TP
+.B \fBsize(expression)\fP
+.sp
+File size matches the given expression. Examples:
+.INDENT 7.0
+.IP \(bu 2
+.
+1k (files from 1024 to 2047 bytes)
+.IP \(bu 2
+.
+< 20k (files less than 20480 bytes)
+.IP \(bu 2
+.
+>= .5MB (files at least 524288 bytes)
+.IP \(bu 2
+.
+4k \- 1MB (files from 4096 bytes to 1048576 bytes)
+.UNINDENT
+.TP
+.B \fBsubrepo([pattern])\fP
+.sp
+Subrepositories whose paths match the given pattern.
+.TP
+.B \fBsymlink()\fP
+.sp
+File that is marked as a symlink.
+.TP
+.B \fBunknown()\fP
+.sp
+File that is unknown according to status. These files will only be
+considered if this predicate is used.
+.TP
+.B \fBunresolved()\fP
+.sp
+File that is marked unresolved according to the resolve state.
+.UNINDENT
+.sp
+Some sample queries:
+.INDENT 0.0
+.IP \(bu 2
+.
+Show status of files that appear to be binary in the working directory:
+.sp
+.nf
+.ft C
+hg status \-A "set:binary()"
+.ft P
+.fi
+.IP \(bu 2
+.
+Forget files that are in .hgignore but are already tracked:
+.sp
+.nf
+.ft C
+hg forget "set:hgignore() and not ignored()"
+.ft P
+.fi
+.IP \(bu 2
+.
+Find text files that contain a string:
+.sp
+.nf
+.ft C
+hg locate "set:grep(magic) and not binary()"
+.ft P
+.fi
+.IP \(bu 2
+.
+Find C files in a non\-standard encoding:
+.sp
+.nf
+.ft C
+hg locate "set:**.c and not encoding(\(aqUTF\-8\(aq)"
+.ft P
+.fi
+.IP \(bu 2
+.
+Revert copies of large binary files:
+.sp
+.nf
+.ft C
+hg revert "set:copied() and binary() and size(\(aq>1M\(aq)"
+.ft P
+.fi
+.IP \(bu 2
+.
+Remove files listed in foo.lst that contain the letter a or b:
+.sp
+.nf
+.ft C
+hg remove "set: \(aqlistfile:foo.lst\(aq and (**a* or **b*)"
+.ft P
+.fi
+.UNINDENT
+.sp
+See also \%\fBhg help patterns\fP\:.
+.SH GLOSSARY
+.INDENT 0.0
+.TP
+.B Ancestor
+.
+Any changeset that can be reached by an unbroken chain of parent
+changesets from a given changeset. More precisely, the ancestors
+of a changeset can be defined by two properties: a parent of a
+changeset is an ancestor, and a parent of an ancestor is an
+ancestor. See also: \(aqDescendant\(aq.
+.TP
+.B Bookmark
+.
+Bookmarks are pointers to certain commits that move when
+committing. They are similar to tags in that it is possible to use
+bookmark names in all places where Mercurial expects a changeset
+ID, e.g., with \%\fBhg update\fP\:. Unlike tags, bookmarks move along
+when you make a commit.
+.sp
+Bookmarks can be renamed, copied and deleted. Bookmarks are local,
+unless they are explicitly pushed or pulled between repositories.
+Pushing and pulling bookmarks allow you to collaborate with others
+on a branch without creating a named branch.
+.TP
+.B Branch
+.
+(Noun) A child changeset that has been created from a parent that
+is not a head. These are known as topological branches, see
+\(aqBranch, topological\(aq. If a topological branch is named, it becomes
+a named branch. If a topological branch is not named, it becomes
+an anonymous branch. See \(aqBranch, anonymous\(aq and \(aqBranch, named\(aq.
+.sp
+Branches may be created when changes are pulled from or pushed to
+a remote repository, since new heads may be created by these
+operations. Note that the term branch can also be used informally
+to describe a development process in which certain development is
+done independently of other development. This is sometimes done
+explicitly with a named branch, but it can also be done locally,
+using bookmarks or clones and anonymous branches.
+.sp
+Example: "The experimental branch".
+.sp
+(Verb) The action of creating a child changeset which results in
+its parent having more than one child.
+.sp
+Example: "I\(aqm going to branch at X".
+.TP
+.B Branch, anonymous
+.
+Every time a new child changeset is created from a parent that is not
+a head and the name of the branch is not changed, a new anonymous
+branch is created.
+.TP
+.B Branch, closed
+.
+A named branch whose branch heads have all been closed.
+.TP
+.B Branch, default
+.
+The branch assigned to a changeset when no name has previously been
+assigned.
+.TP
+.B Branch head
+.
+See \(aqHead, branch\(aq.
+.TP
+.B Branch, inactive
+.
+If a named branch has no topological heads, it is considered to be
+inactive. As an example, a feature branch becomes inactive when it
+is merged into the default branch. The \%\fBhg branches\fP\: command
+shows inactive branches by default, though they can be hidden with
+\%\fBhg branches \-\-active\fP\:.
+.sp
+NOTE: this concept is deprecated because it is too implicit.
+Branches should now be explicitly closed using \%\fBhg commit
+\-\-close\-branch\fP\: when they are no longer needed.
+.TP
+.B Branch, named
+.
+A collection of changesets which have the same branch name. By
+default, children of a changeset in a named branch belong to the
+same named branch. A child can be explicitly assigned to a
+different branch. See \%\fBhg help branch\fP\:, \%\fBhg help branches\fP\: and
+\%\fBhg commit \-\-close\-branch\fP\: for more information on managing
+branches.
+.sp
+Named branches can be thought of as a kind of namespace, dividing
+the collection of changesets that comprise the repository into a
+collection of disjoint subsets. A named branch is not necessarily
+a topological branch. If a new named branch is created from the
+head of another named branch, or the default branch, but no
+further changesets are added to that previous branch, then that
+previous branch will be a branch in name only.
+.TP
+.B Branch tip
+.
+See \(aqTip, branch\(aq.
+.TP
+.B Branch, topological
+.
+Every time a new child changeset is created from a parent that is
+not a head, a new topological branch is created. If a topological
+branch is named, it becomes a named branch. If a topological
+branch is not named, it becomes an anonymous branch of the
+current, possibly default, branch.
+.TP
+.B Changelog
+.
+A record of the changesets in the order in which they were added
+to the repository. This includes details such as changeset id,
+author, commit message, date, and list of changed files.
+.TP
+.B Changeset
+.
+A snapshot of the state of the repository used to record a change.
+.TP
+.B Changeset, child
+.
+The converse of parent changeset: if P is a parent of C, then C is
+a child of P. There is no limit to the number of children that a
+changeset may have.
+.TP
+.B Changeset id
+.
+A SHA\-1 hash that uniquely identifies a changeset. It may be
+represented as either a "long" 40 hexadecimal digit string, or a
+"short" 12 hexadecimal digit string.
+.TP
+.B Changeset, merge
+.
+A changeset with two parents. This occurs when a merge is
+committed.
+.TP
+.B Changeset, parent
+.
+A revision upon which a child changeset is based. Specifically, a
+parent changeset of a changeset C is a changeset whose node
+immediately precedes C in the DAG. Changesets have at most two
+parents.
+.TP
+.B Checkout
+.
+(Noun) The working directory being updated to a specific
+revision. This use should probably be avoided where possible, as
+changeset is much more appropriate than checkout in this context.
+.sp
+Example: "I\(aqm using checkout X."
+.sp
+(Verb) Updating the working directory to a specific changeset. See
+\%\fBhg help update\fP\:.
+.sp
+Example: "I\(aqm going to check out changeset X."
+.TP
+.B Child changeset
+.
+See \(aqChangeset, child\(aq.
+.TP
+.B Close changeset
+.
+See \(aqHead, closed branch\(aq
+.TP
+.B Closed branch
+.
+See \(aqBranch, closed\(aq.
+.TP
+.B Clone
+.
+(Noun) An entire or partial copy of a repository. The partial
+clone must be in the form of a revision and its ancestors.
+.sp
+Example: "Is your clone up to date?".
+.sp
+(Verb) The process of creating a clone, using \%\fBhg clone\fP\:.
+.sp
+Example: "I\(aqm going to clone the repository".
+.TP
+.B Closed branch head
+.
+See \(aqHead, closed branch\(aq.
+.TP
+.B Commit
+.
+(Noun) A synonym for changeset.
+.sp
+Example: "Is the bug fixed in your recent commit?"
+.sp
+(Verb) The act of recording changes to a repository. When files
+are committed in a working directory, Mercurial finds the
+differences between the committed files and their parent
+changeset, creating a new changeset in the repository.
+.sp
+Example: "You should commit those changes now."
+.TP
+.B Cset
+.
+A common abbreviation of the term changeset.
+.TP
+.B DAG
+.
+The repository of changesets of a distributed version control
+system (DVCS) can be described as a directed acyclic graph (DAG),
+consisting of nodes and edges, where nodes correspond to
+changesets and edges imply a parent \-> child relation. This graph
+can be visualized by graphical tools such as \%\fBhg glog\fP\:
+(graphlog). In Mercurial, the DAG is limited by the requirement
+for children to have at most two parents.
+.TP
+.B Default branch
+.
+See \(aqBranch, default\(aq.
+.TP
+.B Descendant
+.
+Any changeset that can be reached by a chain of child changesets
+from a given changeset. More precisely, the descendants of a
+changeset can be defined by two properties: the child of a
+changeset is a descendant, and the child of a descendant is a
+descendant. See also: \(aqAncestor\(aq.
+.TP
+.B Diff
+.
+(Noun) The difference between the contents and attributes of files
+in two changesets or a changeset and the current working
+directory. The difference is usually represented in a standard
+form called a "diff" or "patch". The "git diff" format is used
+when the changes include copies, renames, or changes to file
+attributes, none of which can be represented/handled by classic
+"diff" and "patch".
+.sp
+Example: "Did you see my correction in the diff?"
+.sp
+(Verb) Diffing two changesets is the action of creating a diff or
+patch.
+.sp
+Example: "If you diff with changeset X, you will see what I mean."
+.TP
+.B Directory, working
+.
+The working directory represents the state of the files tracked by
+Mercurial, that will be recorded in the next commit. The working
+directory initially corresponds to the snapshot at an existing
+changeset, known as the parent of the working directory. See
+\(aqParent, working directory\(aq. The state may be modified by changes
+to the files introduced manually or by a merge. The repository
+metadata exists in the .hg directory inside the working directory.
+.TP
+.B Draft
+.
+Changesets in the draft phase have not been shared with publishing
+repositories and may thus be safely changed by history\-modifying
+extensions. See \%\fBhg help phases\fP\:.
+.TP
+.B Graph
+.
+See DAG and \%\fBhg help graphlog\fP\:.
+.TP
+.B Head
+.
+The term \(aqhead\(aq may be used to refer to both a branch head or a
+repository head, depending on the context. See \(aqHead, branch\(aq and
+\(aqHead, repository\(aq for specific definitions.
+.sp
+Heads are where development generally takes place and are the
+usual targets for update and merge operations.
+.TP
+.B Head, branch
+.
+A changeset with no descendants on the same named branch.
+.TP
+.B Head, closed branch
+.
+A changeset that marks a head as no longer interesting. The closed
+head is no longer listed by \%\fBhg heads\fP\:. A branch is considered
+closed when all its heads are closed and consequently is not
+listed by \%\fBhg branches\fP\:.
+.sp
+Closed heads can be re\-opened by committing new changeset as the
+child of the changeset that marks a head as closed.
+.TP
+.B Head, repository
+.
+A topological head which has not been closed.
+.TP
+.B Head, topological
+.
+A changeset with no children in the repository.
+.TP
+.B History, immutable
+.
+Once committed, changesets cannot be altered. Extensions which
+appear to change history actually create new changesets that
+replace existing ones, and then destroy the old changesets. Doing
+so in public repositories can result in old changesets being
+reintroduced to the repository.
+.TP
+.B History, rewriting
+.
+The changesets in a repository are immutable. However, extensions
+to Mercurial can be used to alter the repository, usually in such
+a way as to preserve changeset contents.
+.TP
+.B Immutable history
+.
+See \(aqHistory, immutable\(aq.
+.TP
+.B Merge changeset
+.
+See \(aqChangeset, merge\(aq.
+.TP
+.B Manifest
+.
+Each changeset has a manifest, which is the list of files that are
+tracked by the changeset.
+.TP
+.B Merge
+.
+Used to bring together divergent branches of work. When you update
+to a changeset and then merge another changeset, you bring the
+history of the latter changeset into your working directory. Once
+conflicts are resolved (and marked), this merge may be committed
+as a merge changeset, bringing two branches together in the DAG.
+.TP
+.B Named branch
+.
+See \(aqBranch, named\(aq.
+.TP
+.B Null changeset
+.
+The empty changeset. It is the parent state of newly\-initialized
+repositories and repositories with no checked out revision. It is
+thus the parent of root changesets and the effective ancestor when
+merging unrelated changesets. Can be specified by the alias \(aqnull\(aq
+or by the changeset ID \(aq000000000000\(aq.
+.TP
+.B Parent
+.
+See \(aqChangeset, parent\(aq.
+.TP
+.B Parent changeset
+.
+See \(aqChangeset, parent\(aq.
+.TP
+.B Parent, working directory
+.
+The working directory parent reflects a virtual revision which is
+the child of the changeset (or two changesets with an uncommitted
+merge) shown by \%\fBhg parents\fP\:. This is changed with
+\%\fBhg update\fP\:. Other commands to see the working directory parent
+are \%\fBhg summary\fP\: and \%\fBhg id\fP\:. Can be specified by the alias ".".
+.TP
+.B Patch
+.
+(Noun) The product of a diff operation.
+.sp
+Example: "I\(aqve sent you my patch."
+.sp
+(Verb) The process of using a patch file to transform one
+changeset into another.
+.sp
+Example: "You will need to patch that revision."
+.TP
+.B Phase
+.
+A per\-changeset state tracking how the changeset has been or
+should be shared. See \%\fBhg help phases\fP\:.
+.TP
+.B Public
+.
+Changesets in the public phase have been shared with publishing
+repositories and are therefore considered immutable. See \%\fBhg help
+phases\fP\:.
+.TP
+.B Pull
+.
+An operation in which changesets in a remote repository which are
+not in the local repository are brought into the local
+repository. Note that this operation without special arguments
+only updates the repository, it does not update the files in the
+working directory. See \%\fBhg help pull\fP\:.
+.TP
+.B Push
+.
+An operation in which changesets in a local repository which are
+not in a remote repository are sent to the remote repository. Note
+that this operation only adds changesets which have been committed
+locally to the remote repository. Uncommitted changes are not
+sent. See \%\fBhg help push\fP\:.
+.TP
+.B Repository
+.
+The metadata describing all recorded states of a collection of
+files. Each recorded state is represented by a changeset. A
+repository is usually (but not always) found in the \fB.hg\fP
+subdirectory of a working directory. Any recorded state can be
+recreated by "updating" a working directory to a specific
+changeset.
+.TP
+.B Repository head
+.
+See \(aqHead, repository\(aq.
+.TP
+.B Revision
+.
+A state of the repository at some point in time. Earlier revisions
+can be updated to by using \%\fBhg update\fP\:. See also \(aqRevision
+number\(aq; See also \(aqChangeset\(aq.
+.TP
+.B Revision number
+.
+This integer uniquely identifies a changeset in a specific
+repository. It represents the order in which changesets were added
+to a repository, starting with revision number 0. Note that the
+revision number may be different in each clone of a repository. To
+identify changesets uniquely between different clones, see
+\(aqChangeset id\(aq.
+.TP
+.B Revlog
+.
+History storage mechanism used by Mercurial. It is a form of delta
+encoding, with occasional full revision of data followed by delta
+of each successive revision. It includes data and an index
+pointing to the data.
+.TP
+.B Rewriting history
+.
+See \(aqHistory, rewriting\(aq.
+.TP
+.B Root
+.
+A changeset that has only the null changeset as its parent. Most
+repositories have only a single root changeset.
+.TP
+.B Secret
+.
+Changesets in the secret phase may not be shared via push, pull,
+or clone. See \%\fBhg help phases\fP\:.
+.TP
+.B Tag
+.
+An alternative name given to a changeset. Tags can be used in all
+places where Mercurial expects a changeset ID, e.g., with
+\%\fBhg update\fP\:. The creation of a tag is stored in the history and
+will thus automatically be shared with other using push and pull.
+.TP
+.B Tip
+.
+The changeset with the highest revision number. It is the changeset
+most recently added in a repository.
+.TP
+.B Tip, branch
+.
+The head of a given branch with the highest revision number. When
+a branch name is used as a revision identifier, it refers to the
+branch tip. See also \(aqBranch, head\(aq. Note that because revision
+numbers may be different in different repository clones, the
+branch tip may be different in different cloned repositories.
+.TP
+.B Update
+.
+(Noun) Another synonym of changeset.
+.sp
+Example: "I\(aqve pushed an update".
+.sp
+(Verb) This term is usually used to describe updating the state of
+the working directory to that of a specific changeset. See
+\%\fBhg help update\fP\:.
+.sp
+Example: "You should update".
+.TP
+.B Working directory
+.
+See \(aqDirectory, working\(aq.
+.TP
+.B Working directory parent
+.
+See \(aqParent, working directory\(aq.
+.UNINDENT
+.SH SYNTAX FOR MERCURIAL IGNORE FILES
+.SS Synopsis
+.sp
+The Mercurial system uses a file called \fB.hgignore\fP in the root
+directory of a repository to control its behavior when it searches
+for files that it is not currently tracking.
+.SS Description
+.sp
+The working directory of a Mercurial repository will often contain
+files that should not be tracked by Mercurial. These include backup
+files created by editors and build products created by compilers.
+These files can be ignored by listing them in a \fB.hgignore\fP file in
+the root of the working directory. The \fB.hgignore\fP file must be
+created manually. It is typically put under version control, so that
+the settings will propagate to other repositories with push and pull.
+.sp
+An untracked file is ignored if its path relative to the repository
+root directory, or any prefix path of that path, is matched against
+any pattern in \fB.hgignore\fP.
+.sp
+For example, say we have an untracked file, \fBfile.c\fP, at
+\fBa/b/file.c\fP inside our repository. Mercurial will ignore \fBfile.c\fP
+if any pattern in \fB.hgignore\fP matches \fBa/b/file.c\fP, \fBa/b\fP or \fBa\fP.
+.sp
+In addition, a Mercurial configuration file can reference a set of
+per\-user or global ignore files. See the \fBignore\fP configuration
+key on the \fB[ui]\fP section of \%\fBhg help config\fP\: for details of how to
+configure these files.
+.sp
+To control Mercurial\(aqs handling of files that it manages, many
+commands support the \fB\-I\fP and \fB\-X\fP options; see
+\%\fBhg help <command>\fP\: and \%\fBhg help patterns\fP\: for details.
+.sp
+Files that are already tracked are not affected by .hgignore, even
+if they appear in .hgignore. An untracked file X can be explicitly
+added with \%\fBhg add X\fP\:, even if X would be excluded by a pattern
+in .hgignore.
+.SS Syntax
+.sp
+An ignore file is a plain text file consisting of a list of patterns,
+with one pattern per line. Empty lines are skipped. The \fB#\fP
+character is treated as a comment character, and the \fB\e\fP character
+is treated as an escape character.
+.sp
+Mercurial supports several pattern syntaxes. The default syntax used
+is Python/Perl\-style regular expressions.
+.sp
+To change the syntax used, use a line of the following form:
+.sp
+.nf
+.ft C
+syntax: NAME
+.ft P
+.fi
+.sp
+where \fBNAME\fP is one of the following:
+.INDENT 0.0
+.TP
+.B \fBregexp\fP
+.sp
+Regular expression, Python/Perl syntax.
+.TP
+.B \fBglob\fP
+.sp
+Shell\-style glob.
+.UNINDENT
+.sp
+The chosen syntax stays in effect when parsing all patterns that
+follow, until another syntax is selected.
+.sp
+Neither glob nor regexp patterns are rooted. A glob\-syntax pattern of
+the form \fB*.c\fP will match a file ending in \fB.c\fP in any directory,
+and a regexp pattern of the form \fB\e.c$\fP will do the same. To root a
+regexp pattern, start it with \fB^\fP.
+.IP Note
+.
+Patterns specified in other than \fB.hgignore\fP are always rooted.
+Please see \%\fBhg help patterns\fP\: for details.
+.RE
+.SS Example
+.sp
+Here is an example ignore file.
+.sp
+.nf
+.ft C
+# use glob syntax.
+syntax: glob
+
+*.elc
+*.pyc
+*~
+
+# switch to regexp syntax.
+syntax: regexp
+^\e.pc/
+.ft P
+.fi
+.SH CONFIGURING HGWEB
+.sp
+Mercurial\(aqs internal web server, hgweb, can serve either a single
+repository, or a tree of repositories. In the second case, repository
+paths and global options can be defined using a dedicated
+configuration file common to \%\fBhg serve\fP\:, \fBhgweb.wsgi\fP,
+\fBhgweb.cgi\fP and \fBhgweb.fcgi\fP.
+.sp
+This file uses the same syntax as other Mercurial configuration files
+but recognizes only the following sections:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+.
+web
+.IP \(bu 2
+.
+paths
+.IP \(bu 2
+.
+collections
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+The \fBweb\fP options are thorougly described in \%\fBhg help config\fP\:.
+.sp
+The \fBpaths\fP section maps URL paths to paths of repositories in the
+filesystem. hgweb will not expose the filesystem directly \- only
+Mercurial repositories can be published and only according to the
+configuration.
+.sp
+The left hand side is the path in the URL. Note that hgweb reserves
+subpaths like \fBrev\fP or \fBfile\fP, try using different names for
+nested repositories to avoid confusing effects.
+.sp
+The right hand side is the path in the filesystem. If the specified
+path ends with \fB*\fP or \fB**\fP the filesystem will be searched
+recursively for repositories below that point.
+With \fB*\fP it will not recurse into the repositories it finds (except for
+\fB.hg/patches\fP).
+With \fB**\fP it will also search inside repository working directories
+and possibly find subrepositories.
+.sp
+In this example:
+.sp
+.nf
+.ft C
+[paths]
+/projects/a = /srv/tmprepos/a
+/projects/b = c:/repos/b
+/ = /srv/repos/*
+/user/bob = /home/bob/repos/**
+.ft P
+.fi
+.INDENT 0.0
+.IP \(bu 2
+.
+The first two entries make two repositories in different directories
+appear under the same directory in the web interface
+.IP \(bu 2
+.
+The third entry will publish every Mercurial repository found in
+\fB/srv/repos/\fP, for instance the repository \fB/srv/repos/quux/\fP
+will appear as \fBhttp://server/quux/\fP
+.IP \(bu 2
+.
+The fourth entry will publish both \fBhttp://server/user/bob/quux/\fP
+and \fBhttp://server/user/bob/quux/testsubrepo/\fP
+.UNINDENT
+.sp
+The \fBcollections\fP section is deprecated and has been superseeded by
+\fBpaths\fP.
+.SH MERGE TOOLS
+.sp
+To merge files Mercurial uses merge tools.
+.sp
+A merge tool combines two different versions of a file into a merged
+file. Merge tools are given the two files and the greatest common
+ancestor of the two file versions, so they can determine the changes
+made on both branches.
+.sp
+Merge tools are used both for \%\fBhg resolve\fP\:, \%\fBhg merge\fP\:, \%\fBhg update\fP\:,
+\%\fBhg backout\fP\: and in several extensions.
+.sp
+Usually, the merge tool tries to automatically reconcile the files by
+combining all non\-overlapping changes that occurred separately in
+the two different evolutions of the same initial base file. Furthermore, some
+interactive merge programs make it easier to manually resolve
+conflicting merges, either in a graphical way, or by inserting some
+conflict markers. Mercurial does not include any interactive merge
+programs but relies on external tools for that.
+.SS Available merge tools
+.sp
+External merge tools and their properties are configured in the
+merge\-tools configuration section \- see hgrc(5) \- but they can often just
+be named by their executable.
+.sp
+A merge tool is generally usable if its executable can be found on the
+system and if it can handle the merge. The executable is found if it
+is an absolute or relative executable path or the name of an
+application in the executable search path. The tool is assumed to be
+able to handle the merge if it can handle symlinks if the file is a
+symlink, if it can handle binary files if the file is binary, and if a
+GUI is available if the tool requires a GUI.
+.sp
+There are some internal merge tools which can be used. The internal
+merge tools are:
+.INDENT 0.0
+.TP
+.B \fBinternal:dump\fP
+.sp
+Creates three versions of the files to merge, containing the
+contents of local, other and base. These files can then be used to
+perform a merge manually. If the file to be merged is named
+\fBa.txt\fP, these files will accordingly be named \fBa.txt.local\fP,
+\fBa.txt.other\fP and \fBa.txt.base\fP and they will be placed in the
+same directory as \fBa.txt\fP.
+.TP
+.B \fBinternal:fail\fP
+.sp
+Rather than attempting to merge files that were modified on both
+branches, it marks them as unresolved. The resolve command must be
+used to resolve these conflicts.
+.TP
+.B \fBinternal:local\fP
+.sp
+Uses the local version of files as the merged version.
+.TP
+.B \fBinternal:merge\fP
+.sp
+Uses the internal non\-interactive simple merge algorithm for merging
+files. It will fail if there are any conflicts and leave markers in
+the partially merged file.
+.TP
+.B \fBinternal:other\fP
+.sp
+Uses the other version of files as the merged version.
+.TP
+.B \fBinternal:prompt\fP
+.sp
+Asks the user which of the local or the other version to keep as
+the merged version.
+.UNINDENT
+.sp
+Internal tools are always available and do not require a GUI but will by default
+not handle symlinks or binary files.
+.SS Choosing a merge tool
+.sp
+Mercurial uses these rules when deciding which merge tool to use:
+.INDENT 0.0
+.IP 1. 3
+.
+If a tool has been specified with the \-\-tool option to merge or resolve, it
+is used. If it is the name of a tool in the merge\-tools configuration, its
+configuration is used. Otherwise the specified tool must be executable by
+the shell.
+.IP 2. 3
+.
+If the \fBHGMERGE\fP environment variable is present, its value is used and
+must be executable by the shell.
+.IP 3. 3
+.
+If the filename of the file to be merged matches any of the patterns in the
+merge\-patterns configuration section, the first usable merge tool
+corresponding to a matching pattern is used. Here, binary capabilities of the
+merge tool are not considered.
+.IP 4. 3
+.
+If ui.merge is set it will be considered next. If the value is not the name
+of a configured tool, the specified value is used and must be executable by
+the shell. Otherwise the named tool is used if it is usable.
+.IP 5. 3
+.
+If any usable merge tools are present in the merge\-tools configuration
+section, the one with the highest priority is used.
+.IP 6. 3
+.
+If a program named \fBhgmerge\fP can be found on the system, it is used \- but
+it will by default not be used for symlinks and binary files.
+.IP 7. 3
+.
+If the file to be merged is not binary and is not a symlink, then
+\fBinternal:merge\fP is used.
+.IP 8. 3
+.
+The merge of the file fails and must be resolved before commit.
+.UNINDENT
+.IP Note
+.
+After selecting a merge program, Mercurial will by default attempt
+to merge the files using a simple merge algorithm first. Only if it doesn\(aqt
+succeed because of conflicting changes Mercurial will actually execute the
+merge program. Whether to use the simple merge algorithm first can be
+controlled by the premerge setting of the merge tool. Premerge is enabled by
+default unless the file is binary or a symlink.
+.RE
+.sp
+See the merge\-tools and ui sections of hgrc(5) for details on the
+configuration of merge tools.
+.SH SPECIFYING MULTIPLE REVISIONS
+.sp
+When Mercurial accepts more than one revision, they may be specified
+individually, or provided as a topologically continuous range,
+separated by the ":" character.
+.sp
+The syntax of range notation is [BEGIN]:[END], where BEGIN and END are
+revision identifiers. Both BEGIN and END are optional. If BEGIN is not
+specified, it defaults to revision number 0. If END is not specified,
+it defaults to the tip. The range ":" thus means "all revisions".
+.sp
+If BEGIN is greater than END, revisions are treated in reverse order.
+.sp
+A range acts as a closed interval. This means that a range of 3:5
+gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.
+.SH FILE NAME PATTERNS
+.sp
+Mercurial accepts several notations for identifying one or more files
+at a time.
+.sp
+By default, Mercurial treats filenames as shell\-style extended glob
+patterns.
+.sp
+Alternate pattern notations must be specified explicitly.
+.IP Note
+.
+Patterns specified in \fB.hgignore\fP are not rooted.
+Please see \%\fBhg help hgignore\fP\: for details.
+.RE
+.sp
+To use a plain path name without any pattern matching, start it with
+\fBpath:\fP. These path names must completely match starting at the
+current repository root.
+.sp
+To use an extended glob, start a name with \fBglob:\fP. Globs are rooted
+at the current directory; a glob such as \fB*.c\fP will only match files
+in the current directory ending with \fB.c\fP.
+.sp
+The supported glob syntax extensions are \fB**\fP to match any string
+across path separators and \fB{a,b}\fP to mean "a or b".
+.sp
+To use a Perl/Python regular expression, start a name with \fBre:\fP.
+Regexp pattern matching is anchored at the root of the repository.
+.sp
+To read name patterns from a file, use \fBlistfile:\fP or \fBlistfile0:\fP.
+The latter expects null delimited patterns while the former expects line
+feeds. Each string read from the file is itself treated as a file
+pattern.
+.sp
+Plain examples:
+.sp
+.nf
+.ft C
+path:foo/bar a name bar in a directory named foo in the root
+ of the repository
+path:path:name a file or directory named "path:name"
+.ft P
+.fi
+.sp
+Glob examples:
+.sp
+.nf
+.ft C
+glob:*.c any name ending in ".c" in the current directory
+*.c any name ending in ".c" in the current directory
+**.c any name ending in ".c" in any subdirectory of the
+ current directory including itself.
+foo/*.c any name ending in ".c" in the directory foo
+foo/**.c any name ending in ".c" in any subdirectory of foo
+ including itself.
+.ft P
+.fi
+.sp
+Regexp examples:
+.sp
+.nf
+.ft C
+re:.*\e.c$ any name ending in ".c", anywhere in the repository
+.ft P
+.fi
+.sp
+File examples:
+.sp
+.nf
+.ft C
+listfile:list.txt read list from list.txt with one file pattern per line
+listfile0:list.txt read list from list.txt with null byte delimiters
+.ft P
+.fi
+.sp
+See also \%\fBhg help filesets\fP\:.
+.SH WORKING WITH PHASES
+.SS What are phases?
+.sp
+Phases are a system for tracking which changesets have been or should
+be shared. This helps prevent common mistakes when modifying history
+(for instance, with the mq or rebase extensions).
+.sp
+Each changeset in a repository is in one of the following phases:
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+.
+public : changeset is visible on a public server
+.IP \(bu 2
+.
+draft : changeset is not yet published
+.IP \(bu 2
+.
+secret : changeset should not be pushed, pulled, or cloned
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+These phases are ordered (public < draft < secret) and no changeset
+can be in a lower phase than its ancestors. For instance, if a
+changeset is public, all its ancestors are also public. Lastly,
+changeset phases should only be changed towards the public phase.
+.SS How are phases managed?
+.sp
+For the most part, phases should work transparently. By default, a
+changeset is created in the draft phase and is moved into the public
+phase when it is pushed to another repository.
+.sp
+Once changesets become public, extensions like mq and rebase will
+refuse to operate on them to prevent creating duplicate changesets.
+Phases can also be manually manipulated with the \%\fBhg phase\fP\: command
+if needed. See \%\fBhg help \-v phase\fP\: for examples.
+.SS Phases and servers
+.sp
+Normally, all servers are \fBpublishing\fP by default. This means:
+.sp
+.nf
+.ft C
+\- all draft changesets that are pulled or cloned appear in phase
+public on the client
+
+\- all draft changesets that are pushed appear as public on both
+client and server
+
+\- secret changesets are neither pushed, pulled, or cloned
+.ft P
+.fi
+.IP Note
+.
+Pulling a draft changeset from a publishing server does not mark it
+as public on the server side due to the read\-only nature of pull.
+.RE
+.sp
+Sometimes it may be desirable to push and pull changesets in the draft
+phase to share unfinished work. This can be done by setting a
+repository to disable publishing in its configuration file:
+.sp
+.nf
+.ft C
+[phases]
+publish = False
+.ft P
+.fi
+.sp
+See \%\fBhg help config\fP\: for more information on config files.
+.IP Note
+.
+Servers running older versions of Mercurial are treated as
+publishing.
+.RE
+.SS Examples
+.INDENT 0.0
+.INDENT 3.5
+.INDENT 0.0
+.IP \(bu 2
+.
+list changesets in draft or secret phase:
+.sp
+.nf
+.ft C
+hg log \-r "not public()"
+.ft P
+.fi
+.IP \(bu 2
+.
+change all secret changesets to draft:
+.sp
+.nf
+.ft C
+hg phase \-\-draft "secret()"
+.ft P
+.fi
+.IP \(bu 2
+.
+forcibly move the current changeset and descendants from public to draft:
+.sp
+.nf
+.ft C
+hg phase \-\-force \-\-draft .
+.ft P
+.fi
+.IP \(bu 2
+.
+show a list of changeset revision and phase:
+.sp
+.nf
+.ft C
+hg log \-\-template "{rev} {phase}\en"
+.ft P
+.fi
+.IP \(bu 2
+.
+resynchronize draft changesets relative to a remote repository:
+.sp
+.nf
+.ft C
+hg phase \-fd \(aqoutgoing(URL)\(aq
+.ft P
+.fi
+.UNINDENT
+.UNINDENT
+.UNINDENT
+.sp
+See \%\fBhg help phase\fP\: for more information on manually manipulating phases.
+.SH SPECIFYING SINGLE REVISIONS
+.sp
+Mercurial supports several ways to specify individual revisions.
+.sp
+A plain integer is treated as a revision number. Negative integers are
+treated as sequential offsets from the tip, with \-1 denoting the tip,
+\-2 denoting the revision prior to the tip, and so forth.
+.sp
+A 40\-digit hexadecimal string is treated as a unique revision
+identifier.
+.sp
+A hexadecimal string less than 40 characters long is treated as a
+unique revision identifier and is referred to as a short\-form
+identifier. A short\-form identifier is only valid if it is the prefix
+of exactly one full\-length identifier.
+.sp
+Any other string is treated as a bookmark, tag, or branch name. A
+bookmark is a movable pointer to a revision. A tag is a permanent name
+associated with a revision. A branch name denotes the tipmost revision
+of that branch. Bookmark, tag, and branch names must not contain the ":"
+character.
+.sp
+The reserved name "tip" always identifies the most recent revision.
+.sp
+The reserved name "null" indicates the null revision. This is the
+revision of an empty repository, and the parent of revision 0.
+.sp
+The reserved name "." indicates the working directory parent. If no
+working directory is checked out, it is equivalent to null. If an
+uncommitted merge is in progress, "." is the revision of the first
+parent.
+.SH SPECIFYING REVISION SETS
+.sp
+Mercurial supports a functional language for selecting a set of
+revisions.
+.sp
+The language supports a number of predicates which are joined by infix
+operators. Parenthesis can be used for grouping.
+.sp
+Identifiers such as branch names may need quoting with single or
+double quotes if they contain characters like \fB\-\fP or if they match
+one of the predefined predicates.
+.sp
+Special characters can be used in quoted identifiers by escaping them,
+e.g., \fB\en\fP is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with \fBr\fP, e.g. \fBr\(aq...\(aq\fP.
+.sp
+There is a single prefix operator:
+.INDENT 0.0
+.TP
+.B \fBnot x\fP
+.sp
+Changesets not in x. Short form is \fB! x\fP.
+.UNINDENT
+.sp
+These are the supported infix operators:
+.INDENT 0.0
+.TP
+.B \fBx::y\fP
+.sp
+A DAG range, meaning all changesets that are descendants of x and
+ancestors of y, including x and y themselves. If the first endpoint
+is left out, this is equivalent to \fBancestors(y)\fP, if the second
+is left out it is equivalent to \fBdescendants(x)\fP.
+.sp
+An alternative syntax is \fBx..y\fP.
+.TP
+.B \fBx:y\fP
+.sp
+All changesets with revision numbers between x and y, both
+inclusive. Either endpoint can be left out, they default to 0 and
+tip.
+.TP
+.B \fBx and y\fP
+.sp
+The intersection of changesets in x and y. Short form is \fBx & y\fP.
+.TP
+.B \fBx or y\fP
+.sp
+The union of changesets in x and y. There are two alternative short
+forms: \fBx | y\fP and \fBx + y\fP.
+.TP
+.B \fBx \- y\fP
+.sp
+Changesets in x but not in y.
+.TP
+.B \fBx^n\fP
+.sp
+The nth parent of x, n == 0, 1, or 2.
+For n == 0, x; for n == 1, the first parent of each changeset in x;
+for n == 2, the second parent of changeset in x.
+.TP
+.B \fBx~n\fP
+.sp
+The nth first ancestor of x; \fBx~0\fP is x; \fBx~3\fP is \fBx^^^\fP.
+.UNINDENT
+.sp
+There is a single postfix operator:
+.INDENT 0.0
+.TP
+.B \fBx^\fP
+.sp
+Equivalent to \fBx^1\fP, the first parent of each changeset in x.
+.UNINDENT
+.sp
+The following predicates are supported:
+.INDENT 0.0
+.TP
+.B \fBadds(pattern)\fP
+.sp
+Changesets that add a file matching pattern.
+.TP
+.B \fBall()\fP
+.sp
+All changesets, the same as \fB0:tip\fP.
+.TP
+.B \fBancestor(single, single)\fP
+.sp
+Greatest common ancestor of the two changesets.
+.TP
+.B \fBancestors(set)\fP
+.sp
+Changesets that are ancestors of a changeset in set.
+.TP
+.B \fBauthor(string)\fP
+.sp
+Alias for \fBuser(string)\fP.
+.TP
+.B \fBbisect(string)\fP
+.sp
+Changesets marked in the specified bisect status:
+.INDENT 7.0
+.IP \(bu 2
+.
+\fBgood\fP, \fBbad\fP, \fBskip\fP: csets explicitly marked as good/bad/skip
+.IP \(bu 2
+.
+\fBgoods\fP, \fBbads\fP : csets topologicaly good/bad
+.IP \(bu 2
+.
+\fBrange\fP : csets taking part in the bisection
+.IP \(bu 2
+.
+\fBpruned\fP : csets that are goods, bads or skipped
+.IP \(bu 2
+.
+\fBuntested\fP : csets whose fate is yet unknown
+.IP \(bu 2
+.
+\fBignored\fP : csets ignored due to DAG topology
+.IP \(bu 2
+.
+\fBcurrent\fP : the cset currently being bisected
+.UNINDENT
+.TP
+.B \fBbookmark([name])\fP
+.sp
+The named bookmark or all bookmarks.
+.sp
+If \fIname\fP starts with \fIre:\fP, the remainder of the name is treated as
+a regular expression. To match a bookmark that actually starts with \fIre:\fP,
+use the prefix \fIliteral:\fP.
+.TP
+.B \fBbranch(string or set)\fP
+.sp
+All changesets belonging to the given branch or the branches of the given
+changesets.
+.sp
+If \fIstring\fP starts with \fIre:\fP, the remainder of the name is treated as
+a regular expression. To match a branch that actually starts with \fIre:\fP,
+use the prefix \fIliteral:\fP.
+.TP
+.B \fBchildren(set)\fP
+.sp
+Child changesets of changesets in set.
+.TP
+.B \fBclosed()\fP
+.sp
+Changeset is closed.
+.TP
+.B \fBcontains(pattern)\fP
+.sp
+Revision contains a file matching pattern. See \%\fBhg help patterns\fP\:
+for information about file patterns.
+.TP
+.B \fBconverted([id])\fP
+.sp
+Changesets converted from the given identifier in the old repository if
+present, or all converted changesets if no identifier is specified.
+.TP
+.B \fBdate(interval)\fP
+.sp
+Changesets within the interval, see \%\fBhg help dates\fP\:.
+.TP
+.B \fBdesc(string)\fP
+.sp
+Search commit message for string. The match is case\-insensitive.
+.TP
+.B \fBdescendants(set)\fP
+.sp
+Changesets which are descendants of changesets in set.
+.TP
+.B \fBdestination([set])\fP
+.sp
+Changesets that were created by a graft, transplant or rebase operation,
+with the given revisions specified as the source. Omitting the optional set
+is the same as passing all().
+.TP
+.B \fBdraft()\fP
+.sp
+Changeset in draft phase.
+.TP
+.B \fBextinct()\fP
+.sp
+Obsolete changesets with obsolete descendants only.
+.TP
+.B \fBextra(label, [value])\fP
+.sp
+Changesets with the given label in the extra metadata, with the given
+optional value.
+.sp
+If \fIvalue\fP starts with \fIre:\fP, the remainder of the value is treated as
+a regular expression. To match a value that actually starts with \fIre:\fP,
+use the prefix \fIliteral:\fP.
+.TP
+.B \fBfile(pattern)\fP
+.sp
+Changesets affecting files matched by pattern.
+.sp
+For a faster but less accurate result, consider using \fBfilelog()\fP
+instead.
+.TP
+.B \fBfilelog(pattern)\fP
+.sp
+Changesets connected to the specified filelog.
+.sp
+For performance reasons, \fBfilelog()\fP does not show every changeset
+that affects the requested file(s). See \%\fBhg help log\fP\: for details. For
+a slower, more accurate result, use \fBfile()\fP.
+.TP
+.B \fBfirst(set, [n])\fP
+.sp
+An alias for limit().
+.TP
+.B \fBfollow([file])\fP
+.sp
+An alias for \fB::.\fP (ancestors of the working copy\(aqs first parent).
+If a filename is specified, the history of the given file is followed,
+including copies.
+.TP
+.B \fBgrep(regex)\fP
+.sp
+Like \fBkeyword(string)\fP but accepts a regex. Use \fBgrep(r\(aq...\(aq)\fP
+to ensure special escape characters are handled correctly. Unlike
+\fBkeyword(string)\fP, the match is case\-sensitive.
+.TP
+.B \fBhead()\fP
+.sp
+Changeset is a named branch head.
+.TP
+.B \fBheads(set)\fP
+.sp
+Members of set with no children in set.
+.TP
+.B \fBid(string)\fP
+.sp
+Revision non\-ambiguously specified by the given hex string prefix.
+.TP
+.B \fBkeyword(string)\fP
+.sp
+Search commit message, user name, and names of changed files for
+string. The match is case\-insensitive.
+.TP
+.B \fBlast(set, [n])\fP
+.sp
+Last n members of set, defaulting to 1.
+.TP
+.B \fBlimit(set, [n])\fP
+.sp
+First n members of set, defaulting to 1.
+.TP
+.B \fBmatching(revision [, field])\fP
+.sp
+Changesets in which a given set of fields match the set of fields in the
+selected revision or set.
+.sp
+To match more than one field pass the list of fields to match separated
+by spaces (e.g. \fBauthor description\fP).
+.sp
+Valid fields are most regular revision fields and some special fields.
+.sp
+Regular revision fields are \fBdescription\fP, \fBauthor\fP, \fBbranch\fP,
+\fBdate\fP, \fBfiles\fP, \fBphase\fP, \fBparents\fP, \fBsubstate\fP, \fBuser\fP
+and \fBdiff\fP.
+Note that \fBauthor\fP and \fBuser\fP are synonyms. \fBdiff\fP refers to the
+contents of the revision. Two revisions matching their \fBdiff\fP will
+also match their \fBfiles\fP.
+.sp
+Special fields are \fBsummary\fP and \fBmetadata\fP:
+\fBsummary\fP matches the first line of the description.
+\fBmetadata\fP is equivalent to matching \fBdescription user date\fP
+(i.e. it matches the main metadata fields).
+.sp
+\fBmetadata\fP is the default field which is used when no fields are
+specified. You can match more than one field at a time.
+.TP
+.B \fBmax(set)\fP
+.sp
+Changeset with highest revision number in set.
+.TP
+.B \fBmerge()\fP
+.sp
+Changeset is a merge changeset.
+.TP
+.B \fBmin(set)\fP
+.sp
+Changeset with lowest revision number in set.
+.TP
+.B \fBmodifies(pattern)\fP
+.sp
+Changesets modifying files matched by pattern.
+.TP
+.B \fBobsolete()\fP
+.sp
+Mutable changeset with a newer version.
+.TP
+.B \fBorigin([set])\fP
+.sp
+Changesets that were specified as a source for the grafts, transplants or
+rebases that created the given revisions. Omitting the optional set is the
+same as passing all(). If a changeset created by these operations is itself
+specified as a source for one of these operations, only the source changeset
+for the first operation is selected.
+.TP
+.B \fBoutgoing([path])\fP
+.sp
+Changesets not found in the specified destination repository, or the
+default push location.
+.TP
+.B \fBp1([set])\fP
+.sp
+First parent of changesets in set, or the working directory.
+.TP
+.B \fBp2([set])\fP
+.sp
+Second parent of changesets in set, or the working directory.
+.TP
+.B \fBparents([set])\fP
+.sp
+The set of all parents for all changesets in set, or the working directory.
+.TP
+.B \fBpresent(set)\fP
+.sp
+An empty set, if any revision in set isn\(aqt found; otherwise,
+all revisions in set.
+.sp
+If any of specified revisions is not present in the local repository,
+the query is normally aborted. But this predicate allows the query
+to continue even in such cases.
+.TP
+.B \fBpublic()\fP
+.sp
+Changeset in public phase.
+.TP
+.B \fBremote([id [,path]])\fP
+.sp
+Local revision that corresponds to the given identifier in a
+remote repository, if present. Here, the \(aq.\(aq identifier is a
+synonym for the current local branch.
+.TP
+.B \fBremoves(pattern)\fP
+.sp
+Changesets which remove files matching pattern.
+.TP
+.B \fBrev(number)\fP
+.sp
+Revision with the given numeric identifier.
+.TP
+.B \fBreverse(set)\fP
+.sp
+Reverse order of set.
+.TP
+.B \fBroots(set)\fP
+.sp
+Changesets in set with no parent changeset in set.
+.TP
+.B \fBsecret()\fP
+.sp
+Changeset in secret phase.
+.TP
+.B \fBsort(set[, [\-]key...])\fP
+.sp
+Sort set by keys. The default sort order is ascending, specify a key
+as \fB\-key\fP to sort in descending order.
+.sp
+The keys can be:
+.INDENT 7.0
+.IP \(bu 2
+.
+\fBrev\fP for the revision number,
+.IP \(bu 2
+.
+\fBbranch\fP for the branch name,
+.IP \(bu 2
+.
+\fBdesc\fP for the commit message (description),
+.IP \(bu 2
+.
+\fBuser\fP for user name (\fBauthor\fP can be used as an alias),
+.IP \(bu 2
+.
+\fBdate\fP for the commit date
+.UNINDENT
+.TP
+.B \fBtag([name])\fP
+.sp
+The specified tag by name, or all tagged revisions if no name is given.
+.TP
+.B \fBunstable()\fP
+.sp
+Non\-obsolete changesets with obsolete ancestors.
+.TP
+.B \fBuser(string)\fP
+.sp
+User name contains string. The match is case\-insensitive.
+.sp
+If \fIstring\fP starts with \fIre:\fP, the remainder of the string is treated as
+a regular expression. To match a user that actually contains \fIre:\fP, use
+the prefix \fIliteral:\fP.
+.UNINDENT
+.sp
+New predicates (known as "aliases") can be defined, using any combination of
+existing predicates or other aliases. An alias definition looks like:
+.sp
+.nf
+.ft C
+<alias> = <definition>
+.ft P
+.fi
+.sp
+in the \fBrevsetalias\fP section of a Mercurial configuration file. Arguments
+of the form \fI$1\fP, \fI$2\fP, etc. are substituted from the alias into the
+definition.
+.sp
+For example,
+.sp
+.nf
+.ft C
+[revsetalias]
+h = heads()
+d($1) = sort($1, date)
+rs($1, $2) = reverse(sort($1, $2))
+.ft P
+.fi
+.sp
+defines three aliases, \fBh\fP, \fBd\fP, and \fBrs\fP. \fBrs(0:tip, author)\fP is
+exactly equivalent to \fBreverse(sort(0:tip, author))\fP.
+.sp
+Command line equivalents for \%\fBhg log\fP\::
+.sp
+.nf
+.ft C
+\-f \-> ::.
+\-d x \-> date(x)
+\-k x \-> keyword(x)
+\-m \-> merge()
+\-u x \-> user(x)
+\-b x \-> branch(x)
+\-P x \-> !::x
+\-l x \-> limit(expr, x)
+.ft P
+.fi
+.sp
+Some sample queries:
+.INDENT 0.0
+.IP \(bu 2
+.
+Changesets on the default branch:
+.sp
+.nf
+.ft C
+hg log \-r "branch(default)"
+.ft P
+.fi
+.IP \(bu 2
+.
+Changesets on the default branch since tag 1.5 (excluding merges):
+.sp
+.nf
+.ft C
+hg log \-r "branch(default) and 1.5:: and not merge()"
+.ft P
+.fi
+.IP \(bu 2
+.
+Open branch heads:
+.sp
+.nf
+.ft C
+hg log \-r "head() and not closed()"
+.ft P
+.fi
+.IP \(bu 2
+.
+Changesets between tags 1.3 and 1.5 mentioning "bug" that affect
+\fBhgext/*\fP:
+.sp
+.nf
+.ft C
+hg log \-r "1.3::1.5 and keyword(bug) and file(\(aqhgext/*\(aq)"
+.ft P
+.fi
+.IP \(bu 2
+.
+Changesets committed in May 2008, sorted by user:
+.sp
+.nf
+.ft C
+hg log \-r "sort(date(\(aqMay 2008\(aq), user)"
+.ft P
+.fi
+.IP \(bu 2
+.
+Changesets mentioning "bug" or "issue" that are not in a tagged
+release:
+.sp
+.nf
+.ft C
+hg log \-r "(keyword(bug) or keyword(issue)) and not ancestors(tagged())"
+.ft P
+.fi
+.UNINDENT
+.SH SUBREPOSITORIES
+.sp
+Subrepositories let you nest external repositories or projects into a
+parent Mercurial repository, and make commands operate on them as a
+group.
+.sp
+Mercurial currently supports Mercurial, Git, and Subversion
+subrepositories.
+.sp
+Subrepositories are made of three components:
+.INDENT 0.0
+.IP 1. 3
+.
+Nested repository checkouts. They can appear anywhere in the
+parent working directory.
+.IP 2. 3
+.
+Nested repository references. They are defined in \fB.hgsub\fP, which
+should be placed in the root of working directory, and
+tell where the subrepository checkouts come from. Mercurial
+subrepositories are referenced like:
+.INDENT 3.0
+.INDENT 3.5
+.sp
+path/to/nested = \%https://example.com/nested/repo/path\:
+.UNINDENT
+.UNINDENT
+.sp
+Git and Subversion subrepos are also supported:
+.INDENT 3.0
+.INDENT 3.5
+.sp
+path/to/nested = [git]git://example.com/nested/repo/path
+path/to/nested = [svn]https://example.com/nested/trunk/path
+.UNINDENT
+.UNINDENT
+.sp
+where \fBpath/to/nested\fP is the checkout location relatively to the
+parent Mercurial root, and \fBhttps://example.com/nested/repo/path\fP
+is the source repository path. The source can also reference a
+filesystem path.
+.sp
+Note that \fB.hgsub\fP does not exist by default in Mercurial
+repositories, you have to create and add it to the parent
+repository before using subrepositories.
+.IP 3. 3
+.
+Nested repository states. They are defined in \fB.hgsubstate\fP, which
+is placed in the root of working directory, and
+capture whatever information is required to restore the
+subrepositories to the state they were committed in a parent
+repository changeset. Mercurial automatically record the nested
+repositories states when committing in the parent repository.
+.IP Note
+.
+The \fB.hgsubstate\fP file should not be edited manually.
+.RE
+.UNINDENT
+.SS Adding a Subrepository
+.sp
+If \fB.hgsub\fP does not exist, create it and add it to the parent
+repository. Clone or checkout the external projects where you want it
+to live in the parent repository. Edit \fB.hgsub\fP and add the
+subrepository entry as described above. At this point, the
+subrepository is tracked and the next commit will record its state in
+\fB.hgsubstate\fP and bind it to the committed changeset.
+.SS Synchronizing a Subrepository
+.sp
+Subrepos do not automatically track the latest changeset of their
+sources. Instead, they are updated to the changeset that corresponds
+with the changeset checked out in the top\-level changeset. This is so
+developers always get a consistent set of compatible code and
+libraries when they update.
+.sp
+Thus, updating subrepos is a manual process. Simply check out target
+subrepo at the desired revision, test in the top\-level repo, then
+commit in the parent repository to record the new combination.
+.SS Deleting a Subrepository
+.sp
+To remove a subrepository from the parent repository, delete its
+reference from \fB.hgsub\fP, then remove its files.
+.SS Interaction with Mercurial Commands
+.INDENT 0.0
+.TP
+.B add
+.
+add does not recurse in subrepos unless \-S/\-\-subrepos is
+specified. However, if you specify the full path of a file in a
+subrepo, it will be added even without \-S/\-\-subrepos specified.
+Git and Subversion subrepositories are currently silently
+ignored.
+.TP
+.B archive
+.
+archive does not recurse in subrepositories unless
+\-S/\-\-subrepos is specified.
+.TP
+.B commit
+.
+commit creates a consistent snapshot of the state of the
+entire project and its subrepositories. If any subrepositories
+have been modified, Mercurial will abort. Mercurial can be made
+to instead commit all modified subrepositories by specifying
+\-S/\-\-subrepos, or setting "ui.commitsubrepos=True" in a
+configuration file (see \%\fBhg help config\fP\:). After there are no
+longer any modified subrepositories, it records their state and
+finally commits it in the parent repository.
+.TP
+.B diff
+.
+diff does not recurse in subrepos unless \-S/\-\-subrepos is
+specified. Changes are displayed as usual, on the subrepositories
+elements. Git and Subversion subrepositories are currently
+silently ignored.
+.TP
+.B forget
+.
+forget currently only handles exact file matches in subrepos.
+Git and Subversion subrepositories are currently silently ignored.
+.TP
+.B incoming
+.
+incoming does not recurse in subrepos unless \-S/\-\-subrepos
+is specified. Git and Subversion subrepositories are currently
+silently ignored.
+.TP
+.B outgoing
+.
+outgoing does not recurse in subrepos unless \-S/\-\-subrepos
+is specified. Git and Subversion subrepositories are currently
+silently ignored.
+.TP
+.B pull
+.
+pull is not recursive since it is not clear what to pull prior
+to running \%\fBhg update\fP\:. Listing and retrieving all
+subrepositories changes referenced by the parent repository pulled
+changesets is expensive at best, impossible in the Subversion
+case.
+.TP
+.B push
+.
+Mercurial will automatically push all subrepositories first
+when the parent repository is being pushed. This ensures new
+subrepository changes are available when referenced by top\-level
+repositories. Push is a no\-op for Subversion subrepositories.
+.TP
+.B status
+.
+status does not recurse into subrepositories unless
+\-S/\-\-subrepos is specified. Subrepository changes are displayed as
+regular Mercurial changes on the subrepository
+elements. Subversion subrepositories are currently silently
+ignored.
+.TP
+.B update
+.
+update restores the subrepos in the state they were
+originally committed in target changeset. If the recorded
+changeset is not available in the current subrepository, Mercurial
+will pull it in first before updating. This means that updating
+can require network access when using subrepositories.
+.UNINDENT
+.SS Remapping Subrepositories Sources
+.sp
+A subrepository source location may change during a project life,
+invalidating references stored in the parent repository history. To
+fix this, rewriting rules can be defined in parent repository \fBhgrc\fP
+file or in Mercurial configuration. See the \fB[subpaths]\fP section in
+hgrc(5) for more details.
+.SH TEMPLATE USAGE
+.sp
+Mercurial allows you to customize output of commands through
+templates. You can either pass in a template from the command
+line, via the \-\-template option, or select an existing
+template\-style (\-\-style).
+.sp
+You can customize output for any "log\-like" command: log,
+outgoing, incoming, tip, parents, heads and glog.
+.sp
+Four styles are packaged with Mercurial: default (the style used
+when no explicit preference is passed), compact, changelog,
+and xml.
+Usage:
+.sp
+.nf
+.ft C
+$ hg log \-r1 \-\-style changelog
+.ft P
+.fi
+.sp
+A template is a piece of text, with markup to invoke variable
+expansion:
+.sp
+.nf
+.ft C
+$ hg log \-r1 \-\-template "{node}\en"
+b56ce7b07c52de7d5fd79fb89701ea538af65746
+.ft P
+.fi
+.sp
+Strings in curly braces are called keywords. The availability of
+keywords depends on the exact context of the templater. These
+keywords are usually available for templating a log\-like command:
+.INDENT 0.0
+.TP
+.B author
+.
+String. The unmodified author of the changeset.
+.TP
+.B bisect
+.
+String. The changeset bisection status.
+.TP
+.B bookmarks
+.
+List of strings. Any bookmarks associated with the
+changeset.
+.TP
+.B branch
+.
+String. The name of the branch on which the changeset was
+committed.
+.TP
+.B branches
+.
+List of strings. The name of the branch on which the
+changeset was committed. Will be empty if the branch name was
+default.
+.TP
+.B children
+.
+List of strings. The children of the changeset.
+.TP
+.B date
+.
+Date information. The date when the changeset was committed.
+.TP
+.B desc
+.
+String. The text of the changeset description.
+.TP
+.B diffstat
+.
+String. Statistics of changes with the following format:
+"modified files: +added/\-removed lines"
+.TP
+.B file_adds
+.
+List of strings. Files added by this changeset.
+.TP
+.B file_copies
+.
+List of strings. Files copied in this changeset with
+their sources.
+.TP
+.B file_copies_switch
+.
+List of strings. Like "file_copies" but displayed
+only if the \-\-copied switch is set.
+.TP
+.B file_dels
+.
+List of strings. Files removed by this changeset.
+.TP
+.B file_mods
+.
+List of strings. Files modified by this changeset.
+.TP
+.B files
+.
+List of strings. All files modified, added, or removed by this
+changeset.
+.TP
+.B latesttag
+.
+String. Most recent global tag in the ancestors of this
+changeset.
+.TP
+.B latesttagdistance
+.
+Integer. Longest path to the latest tag.
+.TP
+.B node
+.
+String. The changeset identification hash, as a 40 hexadecimal
+digit string.
+.TP
+.B parents
+.
+List of strings. The parents of the changeset in "rev:node"
+format. If the changeset has only one "natural" parent (the predecessor
+revision) nothing is shown.
+.TP
+.B phase
+.
+String. The changeset phase name.
+.TP
+.B phaseidx
+.
+Integer. The changeset phase index.
+.TP
+.B rev
+.
+Integer. The repository\-local changeset revision number.
+.TP
+.B tags
+.
+List of strings. Any tags associated with the changeset.
+.UNINDENT
+.sp
+The "date" keyword does not produce human\-readable output. If you
+want to use a date in your output, you can use a filter to process
+it. Filters are functions which return a string based on the input
+variable. Be sure to use the stringify filter first when you\(aqre
+applying a string\-input filter to a list\-like input variable.
+You can also use a chain of filters to get the desired output:
+.sp
+.nf
+.ft C
+$ hg tip \-\-template "{date|isodate}\en"
+2008\-08\-21 18:22 +0000
+.ft P
+.fi
+.sp
+List of filters:
+.INDENT 0.0
+.TP
+.B addbreaks
+.
+Any text. Add an XHTML "<br />" tag before the end of
+every line except the last.
+.TP
+.B age
+.
+Date. Returns a human\-readable date/time difference between the
+given date/time and the current date/time.
+.TP
+.B basename
+.
+Any text. Treats the text as a path, and returns the last
+component of the path after splitting by the path separator
+(ignoring trailing separators). For example, "foo/bar/baz" becomes
+"baz" and "foo/bar//" becomes "bar".
+.TP
+.B date
+.
+Date. Returns a date in a Unix date format, including the
+timezone: "Mon Sep 04 15:13:13 2006 0700".
+.TP
+.B domain
+.
+Any text. Finds the first string that looks like an email
+address, and extracts just the domain component. Example: \fBUser
+<user@example.com>\fP becomes \fBexample.com\fP.
+.TP
+.B email
+.
+Any text. Extracts the first string that looks like an email
+address. Example: \fBUser <user@example.com>\fP becomes
+\fBuser@example.com\fP.
+.TP
+.B emailuser
+.
+Any text. Returns the user portion of an email address.
+.TP
+.B escape
+.
+Any text. Replaces the special XML/XHTML characters "&", "<"
+and ">" with XML entities.
+.TP
+.B fill68
+.
+Any text. Wraps the text to fit in 68 columns.
+.TP
+.B fill76
+.
+Any text. Wraps the text to fit in 76 columns.
+.TP
+.B firstline
+.
+Any text. Returns the first line of text.
+.TP
+.B hex
+.
+Any text. Convert a binary Mercurial node identifier into
+its long hexadecimal representation.
+.TP
+.B hgdate
+.
+Date. Returns the date as a pair of numbers: "1157407993
+25200" (Unix timestamp, timezone offset).
+.TP
+.B isodate
+.
+Date. Returns the date in ISO 8601 format: "2009\-08\-18 13:00
++0200".
+.TP
+.B isodatesec
+.
+Date. Returns the date in ISO 8601 format, including
+seconds: "2009\-08\-18 13:00:13 +0200". See also the rfc3339date
+filter.
+.TP
+.B localdate
+.
+Date. Converts a date to local date.
+.TP
+.B nonempty
+.
+Any text. Returns \(aq(none)\(aq if the string is empty.
+.TP
+.B obfuscate
+.
+Any text. Returns the input text rendered as a sequence of
+XML entities.
+.TP
+.B person
+.
+Any text. Returns the name before an email address,
+interpreting it as per RFC 5322.
+.TP
+.B rfc3339date
+.
+Date. Returns a date using the Internet date format
+specified in RFC 3339: "2009\-08\-18T13:00:13+02:00".
+.TP
+.B rfc822date
+.
+Date. Returns a date using the same format used in email
+headers: "Tue, 18 Aug 2009 13:00:13 +0200".
+.TP
+.B short
+.
+Changeset hash. Returns the short form of a changeset hash,
+i.e. a 12 hexadecimal digit string.
+.TP
+.B shortbisect
+.
+Any text. Treats \fItext\fP as a bisection status, and
+returns a single\-character representing the status (G: good, B: bad,
+S: skipped, U: untested, I: ignored). Returns single space if \fItext\fP
+is not a valid bisection status.
+.TP
+.B shortdate
+.
+Date. Returns a date like "2006\-09\-18".
+.TP
+.B stringify
+.
+Any type. Turns the value into text by converting values into
+text and concatenating them.
+.TP
+.B strip
+.
+Any text. Strips all leading and trailing whitespace.
+.TP
+.B stripdir
+.
+Treat the text as path and strip a directory level, if
+possible. For example, "foo" and "foo/bar" becomes "foo".
+.TP
+.B tabindent
+.
+Any text. Returns the text, with every line except the
+first starting with a tab character.
+.TP
+.B urlescape
+.
+Any text. Escapes all "special" characters. For example,
+"foo bar" becomes "foo%20bar".
+.TP
+.B user
+.
+Any text. Returns a short representation of a user name or email
+address.
+.UNINDENT
+.SH URL PATHS
+.sp
+Valid URLs are of the form:
+.sp
+.nf
+.ft C
+local/filesystem/path[#revision]
+file://local/filesystem/path[#revision]
+http://[user[:pass]@]host[:port]/[path][#revision]
+https://[user[:pass]@]host[:port]/[path][#revision]
+ssh://[user@]host[:port]/[path][#revision]
+.ft P
+.fi
+.sp
+Paths in the local filesystem can either point to Mercurial
+repositories or to bundle files (as created by \%\fBhg bundle\fP\: or :hg:\(ga
+incoming \-\-bundle\(ga). See also \%\fBhg help paths\fP\:.
+.sp
+An optional identifier after # indicates a particular branch, tag, or
+changeset to use from the remote repository. See also \%\fBhg help
+revisions\fP\:.
+.sp
+Some features, such as pushing to \%http://\: and \%https://\: URLs are only
+possible if the feature is explicitly enabled on the remote Mercurial
+server.
+.sp
+Note that the security of HTTPS URLs depends on proper configuration of
+web.cacerts.
+.sp
+Some notes about using SSH with Mercurial:
+.INDENT 0.0
+.IP \(bu 2
+.
+SSH requires an accessible shell account on the destination machine
+and a copy of hg in the remote path or specified with as remotecmd.
+.IP \(bu 2
+.
+path is relative to the remote user\(aqs home directory by default. Use
+an extra slash at the start of a path to specify an absolute path:
+.sp
+.nf
+.ft C
+ssh://example.com//tmp/repository
+.ft P
+.fi
+.IP \(bu 2
+.
+Mercurial doesn\(aqt use its own compression via SSH; the right thing
+to do is to configure it in your ~/.ssh/config, e.g.:
+.sp
+.nf
+.ft C
+Host *.mylocalnetwork.example.com
+ Compression no
+Host *
+ Compression yes
+.ft P
+.fi
+.sp
+Alternatively specify "ssh \-C" as your ssh command in your
+configuration file or with the \-\-ssh command line option.
+.UNINDENT
+.sp
+These URLs can all be stored in your configuration file with path
+aliases under the [paths] section like so:
+.sp
+.nf
+.ft C
+[paths]
+alias1 = URL1
+alias2 = URL2
+\&...
+.ft P
+.fi
+.sp
+You can then use the alias for any command that uses a URL (for
+example \%\fBhg pull alias1\fP\: will be treated as \%\fBhg pull URL1\fP\:).
+.sp
+Two path aliases are special because they are used as defaults when
+you do not provide the URL to a command:
+.INDENT 0.0
+.TP
+.B default:
+.
+When you create a repository with hg clone, the clone command saves
+the location of the source repository as the new repository\(aqs
+\(aqdefault\(aq path. This is then used when you omit path from push\- and
+pull\-like commands (including incoming and outgoing).
+.TP
+.B default\-push:
+.
+The push command will look for a path named \(aqdefault\-push\(aq, and
+prefer it over \(aqdefault\(aq if both are defined.
+.UNINDENT
+.SH EXTENSIONS
+.sp
+This section contains help for extensions that are distributed together with Mercurial. Help for other extensions is available in the help system.
+.SS acl
+.sp
+hooks for controlling repository access
+.sp
+This hook makes it possible to allow or deny write access to given
+branches and paths of a repository when receiving incoming changesets
+via pretxnchangegroup and pretxncommit.
+.sp
+The authorization is matched based on the local user name on the
+system where the hook runs, and not the committer of the original
+changeset (since the latter is merely informative).
+.sp
+The acl hook is best used along with a restricted shell like hgsh,
+preventing authenticating users from doing anything other than pushing
+or pulling. The hook is not safe to use if users have interactive
+shell access, as they can then disable the hook. Nor is it safe if
+remote users share an account, because then there is no way to
+distinguish them.
+.sp
+The order in which access checks are performed is:
+.INDENT 0.0
+.IP 1. 3
+.
+Deny list for branches (section \fBacl.deny.branches\fP)
+.IP 2. 3
+.
+Allow list for branches (section \fBacl.allow.branches\fP)
+.IP 3. 3
+.
+Deny list for paths (section \fBacl.deny\fP)
+.IP 4. 3
+.
+Allow list for paths (section \fBacl.allow\fP)
+.UNINDENT
+.sp
+The allow and deny sections take key\-value pairs.
+.SS Branch\-based Access Control
+.sp
+Use the \fBacl.deny.branches\fP and \fBacl.allow.branches\fP sections to
+have branch\-based access control. Keys in these sections can be
+either:
+.INDENT 0.0
+.IP \(bu 2
+.
+a branch name, or
+.IP \(bu 2
+.
+an asterisk, to match any branch;
+.UNINDENT
+.sp
+The corresponding values can be either:
+.INDENT 0.0
+.IP \(bu 2
+.
+a comma\-separated list containing users and groups, or
+.IP \(bu 2
+.
+an asterisk, to match anyone;
+.UNINDENT
+.sp
+You can add the "!" prefix to a user or group name to invert the sense
+of the match.
+.SS Path\-based Access Control
+.sp
+Use the \fBacl.deny\fP and \fBacl.allow\fP sections to have path\-based
+access control. Keys in these sections accept a subtree pattern (with
+a glob syntax by default). The corresponding values follow the same
+syntax as the other sections above.
+.SS Groups
+.sp
+Group names must be prefixed with an \fB@\fP symbol. Specifying a group
+name has the same effect as specifying all the users in that group.
+.sp
+You can define group members in the \fBacl.groups\fP section.
+If a group name is not defined there, and Mercurial is running under
+a Unix\-like system, the list of users will be taken from the OS.
+Otherwise, an exception will be raised.
+.SS Example Configuration
+.sp
+.nf
+.ft C
+[hooks]
+
+# Use this if you want to check access restrictions at commit time
+pretxncommit.acl = python:hgext.acl.hook
+
+# Use this if you want to check access restrictions for pull, push,
+# bundle and serve.
+pretxnchangegroup.acl = python:hgext.acl.hook
+
+[acl]
+# Allow or deny access for incoming changes only if their source is
+# listed here, let them pass otherwise. Source is "serve" for all
+# remote access (http or ssh), "push", "pull" or "bundle" when the
+# related commands are run locally.
+# Default: serve
+sources = serve
+
+[acl.deny.branches]
+
+# Everyone is denied to the frozen branch:
+frozen\-branch = *
+
+# A bad user is denied on all branches:
+* = bad\-user
+
+[acl.allow.branches]
+
+# A few users are allowed on branch\-a:
+branch\-a = user\-1, user\-2, user\-3
+
+# Only one user is allowed on branch\-b:
+branch\-b = user\-1
+
+# The super user is allowed on any branch:
+* = super\-user
+
+# Everyone is allowed on branch\-for\-tests:
+branch\-for\-tests = *
+
+[acl.deny]
+# This list is checked first. If a match is found, acl.allow is not
+# checked. All users are granted access if acl.deny is not present.
+# Format for both lists: glob pattern = user, ..., @group, ...
+
+# To match everyone, use an asterisk for the user:
+# my/glob/pattern = *
+
+# user6 will not have write access to any file:
+** = user6
+
+# Group "hg\-denied" will not have write access to any file:
+** = @hg\-denied
+
+# Nobody will be able to change "DONT\-TOUCH\-THIS.txt", despite
+# everyone being able to change all other files. See below.
+src/main/resources/DONT\-TOUCH\-THIS.txt = *
+
+[acl.allow]
+# if acl.allow is not present, all users are allowed by default
+# empty acl.allow = no users allowed
+
+# User "doc_writer" has write access to any file under the "docs"
+# folder:
+docs/** = doc_writer
+
+# User "jack" and group "designers" have write access to any file
+# under the "images" folder:
+images/** = jack, @designers
+
+# Everyone (except for "user6" and "@hg\-denied" \- see acl.deny above)
+# will have write access to any file under the "resources" folder
+# (except for 1 file. See acl.deny):
+src/main/resources/** = *
+
+\&.hgtags = release_engineer
+.ft P
+.fi
+.SS Examples using the "!" prefix
+.sp
+Suppose there\(aqs a branch that only a given user (or group) should be able to
+push to, and you don\(aqt want to restrict access to any other branch that may
+be created.
+.sp
+The "!" prefix allows you to prevent anyone except a given user or group to
+push changesets in a given branch or path.
+.sp
+In the examples below, we will:
+1) Deny access to branch "ring" to anyone but user "gollum"
+2) Deny access to branch "lake" to anyone but members of the group "hobbit"
+3) Deny access to a file to anyone but user "gollum"
+.sp
+.nf
+.ft C
+[acl.allow.branches]
+# Empty
+
+[acl.deny.branches]
+
+# 1) only \(aqgollum\(aq can commit to branch \(aqring\(aq;
+# \(aqgollum\(aq and anyone else can still commit to any other branch.
+ring = !gollum
+
+# 2) only members of the group \(aqhobbit\(aq can commit to branch \(aqlake\(aq;
+# \(aqhobbit\(aq members and anyone else can still commit to any other branch.
+lake = !@hobbit
+
+# You can also deny access based on file paths:
+
+[acl.allow]
+# Empty
+
+[acl.deny]
+# 3) only \(aqgollum\(aq can change the file below;
+# \(aqgollum\(aq and anyone else can still change any other file.
+/misty/mountains/cave/ring = !gollum
+.ft P
+.fi
+.SS bugzilla
+.sp
+hooks for integrating with the Bugzilla bug tracker
+.sp
+This hook extension adds comments on bugs in Bugzilla when changesets
+that refer to bugs by Bugzilla ID are seen. The comment is formatted using
+the Mercurial template mechanism.
+.sp
+The bug references can optionally include an update for Bugzilla of the
+hours spent working on the bug. Bugs can also be marked fixed.
+.sp
+Three basic modes of access to Bugzilla are provided:
+.INDENT 0.0
+.IP 1. 3
+.
+Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later.
+.IP 2. 3
+.
+Check data via the Bugzilla XMLRPC interface and submit bug change
+via email to Bugzilla email interface. Requires Bugzilla 3.4 or later.
+.IP 3. 3
+.
+Writing directly to the Bugzilla database. Only Bugzilla installations
+using MySQL are supported. Requires Python MySQLdb.
+.UNINDENT
+.sp
+Writing directly to the database is susceptible to schema changes, and
+relies on a Bugzilla contrib script to send out bug change
+notification emails. This script runs as the user running Mercurial,
+must be run on the host with the Bugzilla install, and requires
+permission to read Bugzilla configuration details and the necessary
+MySQL user and password to have full access rights to the Bugzilla
+database. For these reasons this access mode is now considered
+deprecated, and will not be updated for new Bugzilla versions going
+forward. Only adding comments is supported in this access mode.
+.sp
+Access via XMLRPC needs a Bugzilla username and password to be specified
+in the configuration. Comments are added under that username. Since the
+configuration must be readable by all Mercurial users, it is recommended
+that the rights of that user are restricted in Bugzilla to the minimum
+necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later.
+.sp
+Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends
+email to the Bugzilla email interface to submit comments to bugs.
+The From: address in the email is set to the email address of the Mercurial
+user, so the comment appears to come from the Mercurial user. In the event
+that the Mercurial user email is not recognised by Bugzilla as a Bugzilla
+user, the email associated with the Bugzilla username used to log into
+Bugzilla is used instead as the source of the comment. Marking bugs fixed
+works on all supported Bugzilla versions.
+.sp
+Configuration items common to all access modes:
+.INDENT 0.0
+.TP
+.B bugzilla.version
+.
+This access type to use. Values recognised are:
+.INDENT 7.0
+.TP
+.B \fBxmlrpc\fP
+.sp
+Bugzilla XMLRPC interface.
+.TP
+.B \fBxmlrpc+email\fP
+.sp
+Bugzilla XMLRPC and email interfaces.
+.TP
+.B \fB3.0\fP
+.sp
+MySQL access, Bugzilla 3.0 and later.
+.TP
+.B \fB2.18\fP
+.sp
+MySQL access, Bugzilla 2.18 and up to but not
+including 3.0.
+.TP
+.B \fB2.16\fP
+.sp
+MySQL access, Bugzilla 2.16 and up to but not
+including 2.18.
+.UNINDENT
+.TP
+.B bugzilla.regexp
+.
+Regular expression to match bug IDs for update in changeset commit message.
+It must contain one "()" named group \fB<ids>\fP containing the bug
+IDs separated by non\-digit characters. It may also contain
+a named group \fB<hours>\fP with a floating\-point number giving the
+hours worked on the bug. If no named groups are present, the first
+"()" group is assumed to contain the bug IDs, and work time is not
+updated. The default expression matches \fBBug 1234\fP, \fBBug no. 1234\fP,
+\fBBug number 1234\fP, \fBBugs 1234,5678\fP, \fBBug 1234 and 5678\fP and
+variations thereof, followed by an hours number prefixed by \fBh\fP or
+\fBhours\fP, e.g. \fBhours 1.5\fP. Matching is case insensitive.
+.TP
+.B bugzilla.fixregexp
+.
+Regular expression to match bug IDs for marking fixed in changeset
+commit message. This must contain a "()" named group \fB<ids>\(ga containing
+the bug IDs separated by non\-digit characters. It may also contain
+a named group \(ga\(ga<hours>\fP with a floating\-point number giving the
+hours worked on the bug. If no named groups are present, the first
+"()" group is assumed to contain the bug IDs, and work time is not
+updated. The default expression matches \fBFixes 1234\fP, \fBFixes bug 1234\fP,
+\fBFixes bugs 1234,5678\fP, \fBFixes 1234 and 5678\fP and
+variations thereof, followed by an hours number prefixed by \fBh\fP or
+\fBhours\fP, e.g. \fBhours 1.5\fP. Matching is case insensitive.
+.TP
+.B bugzilla.fixstatus
+.
+The status to set a bug to when marking fixed. Default \fBRESOLVED\fP.
+.TP
+.B bugzilla.fixresolution
+.
+The resolution to set a bug to when marking fixed. Default \fBFIXED\fP.
+.TP
+.B bugzilla.style
+.
+The style file to use when formatting comments.
+.TP
+.B bugzilla.template
+.
+Template to use when formatting comments. Overrides style if
+specified. In addition to the usual Mercurial keywords, the
+extension specifies:
+.INDENT 7.0
+.TP
+.B \fB{bug}\fP
+.sp
+The Bugzilla bug ID.
+.TP
+.B \fB{root}\fP
+.sp
+The full pathname of the Mercurial repository.
+.TP
+.B \fB{webroot}\fP
+.sp
+Stripped pathname of the Mercurial repository.
+.TP
+.B \fB{hgweb}\fP
+.sp
+Base URL for browsing Mercurial repositories.
+.UNINDENT
+.sp
+Default \fBchangeset {node|short} in repo {root} refers to bug
+{bug}.\endetails:\en\et{desc|tabindent}\fP
+.TP
+.B bugzilla.strip
+.
+The number of path separator characters to strip from the front of
+the Mercurial repository path (\fB{root}\fP in templates) to produce
+\fB{webroot}\fP. For example, a repository with \fB{root}\fP
+\fB/var/local/my\-project\fP with a strip of 2 gives a value for
+\fB{webroot}\fP of \fBmy\-project\fP. Default 0.
+.TP
+.B web.baseurl
+.
+Base URL for browsing Mercurial repositories. Referenced from
+templates as \fB{hgweb}\fP.
+.UNINDENT
+.sp
+Configuration items common to XMLRPC+email and MySQL access modes:
+.INDENT 0.0
+.TP
+.B bugzilla.usermap
+.
+Path of file containing Mercurial committer email to Bugzilla user email
+mappings. If specified, the file should contain one mapping per
+line:
+.sp
+.nf
+.ft C
+committer = Bugzilla user
+.ft P
+.fi
+.sp
+See also the \fB[usermap]\fP section.
+.UNINDENT
+.sp
+The \fB[usermap]\fP section is used to specify mappings of Mercurial
+committer email to Bugzilla user email. See also \fBbugzilla.usermap\fP.
+Contains entries of the form \fBcommitter = Bugzilla user\fP.
+.sp
+XMLRPC access mode configuration:
+.INDENT 0.0
+.TP
+.B bugzilla.bzurl
+.
+The base URL for the Bugzilla installation.
+Default \fBhttp://localhost/bugzilla\fP.
+.TP
+.B bugzilla.user
+.
+The username to use to log into Bugzilla via XMLRPC. Default
+\fBbugs\fP.
+.TP
+.B bugzilla.password
+.
+The password for Bugzilla login.
+.UNINDENT
+.sp
+XMLRPC+email access mode uses the XMLRPC access mode configuration items,
+and also:
+.INDENT 0.0
+.TP
+.B bugzilla.bzemail
+.
+The Bugzilla email address.
+.UNINDENT
+.sp
+In addition, the Mercurial email settings must be configured. See the
+documentation in hgrc(5), sections \fB[email]\fP and \fB[smtp]\fP.
+.sp
+MySQL access mode configuration:
+.INDENT 0.0
+.TP
+.B bugzilla.host
+.
+Hostname of the MySQL server holding the Bugzilla database.
+Default \fBlocalhost\fP.
+.TP
+.B bugzilla.db
+.
+Name of the Bugzilla database in MySQL. Default \fBbugs\fP.
+.TP
+.B bugzilla.user
+.
+Username to use to access MySQL server. Default \fBbugs\fP.
+.TP
+.B bugzilla.password
+.
+Password to use to access MySQL server.
+.TP
+.B bugzilla.timeout
+.
+Database connection timeout (seconds). Default 5.
+.TP
+.B bugzilla.bzuser
+.
+Fallback Bugzilla user name to record comments with, if changeset
+committer cannot be found as a Bugzilla user.
+.TP
+.B bugzilla.bzdir
+.
+Bugzilla install directory. Used by default notify. Default
+\fB/var/www/html/bugzilla\fP.
+.TP
+.B bugzilla.notify
+.
+The command to run to get Bugzilla to send bug change notification
+emails. Substitutes from a map with 3 keys, \fBbzdir\fP, \fBid\fP (bug
+id) and \fBuser\fP (committer bugzilla email). Default depends on
+version; from 2.18 it is "cd %(bzdir)s && perl \-T
+contrib/sendbugmail.pl %(id)s %(user)s".
+.UNINDENT
+.sp
+Activating the extension:
+.sp
+.nf
+.ft C
+[extensions]
+bugzilla =
+
+[hooks]
+# run bugzilla hook on every change pulled or pushed in here
+incoming.bugzilla = python:hgext.bugzilla.hook
+.ft P
+.fi
+.sp
+Example configurations:
+.sp
+XMLRPC example configuration. This uses the Bugzilla at
+\fBhttp://my\-project.org/bugzilla\fP, logging in as user
+\fBbugmail@my\-project.org\fP with password \fBplugh\fP. It is used with a
+collection of Mercurial repositories in \fB/var/local/hg/repos/\fP,
+with a web interface at \fBhttp://my\-project.org/hg\fP.
+.sp
+.nf
+.ft C
+[bugzilla]
+bzurl=http://my\-project.org/bugzilla
+user=bugmail@my\-project.org
+password=plugh
+version=xmlrpc
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\en
+ {desc}\en
+strip=5
+
+[web]
+baseurl=http://my\-project.org/hg
+.ft P
+.fi
+.sp
+XMLRPC+email example configuration. This uses the Bugzilla at
+\fBhttp://my\-project.org/bugzilla\fP, logging in as user
+\fBbugmail@my\-project.org\fP with password \fBplugh\fP. It is used with a
+collection of Mercurial repositories in \fB/var/local/hg/repos/\fP,
+with a web interface at \fBhttp://my\-project.org/hg\fP. Bug comments
+are sent to the Bugzilla email address
+\fBbugzilla@my\-project.org\fP.
+.sp
+.nf
+.ft C
+[bugzilla]
+bzurl=http://my\-project.org/bugzilla
+user=bugmail@my\-project.org
+password=plugh
+version=xmlrpc
+bzemail=bugzilla@my\-project.org
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\en
+ {desc}\en
+strip=5
+
+[web]
+baseurl=http://my\-project.org/hg
+
+[usermap]
+user@emaildomain.com=user.name@bugzilladomain.com
+.ft P
+.fi
+.sp
+MySQL example configuration. This has a local Bugzilla 3.2 installation
+in \fB/opt/bugzilla\-3.2\fP. The MySQL database is on \fBlocalhost\fP,
+the Bugzilla database name is \fBbugs\fP and MySQL is
+accessed with MySQL username \fBbugs\fP password \fBXYZZY\fP. It is used
+with a collection of Mercurial repositories in \fB/var/local/hg/repos/\fP,
+with a web interface at \fBhttp://my\-project.org/hg\fP.
+.sp
+.nf
+.ft C
+[bugzilla]
+host=localhost
+password=XYZZY
+version=3.0
+bzuser=unknown@domain.com
+bzdir=/opt/bugzilla\-3.2
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\en
+ {desc}\en
+strip=5
+
+[web]
+baseurl=http://my\-project.org/hg
+
+[usermap]
+user@emaildomain.com=user.name@bugzilladomain.com
+.ft P
+.fi
+.sp
+All the above add a comment to the Bugzilla bug record of the form:
+.sp
+.nf
+.ft C
+Changeset 3b16791d6642 in repository\-name.
+http://my\-project.org/hg/repository\-name/rev/3b16791d6642
+
+Changeset commit comment. Bug 1234.
+.ft P
+.fi
+.SS children
+.sp
+command to display child changesets (DEPRECATED)
+.sp
+This extension is deprecated. You should use \%\fBhg log \-r
+"children(REV)"\fP\: instead.
+.SS Commands
+.SS children
+.sp
+.nf
+.ft C
+hg children [\-r REV] [FILE]
+.ft P
+.fi
+.sp
+Print the children of the working directory\(aqs revisions. If a
+revision is given via \-r/\-\-rev, the children of that revision will
+be printed. If a file argument is given, revision in which the
+file was last changed (after the working directory revision or the
+argument to \-\-rev if given) is printed.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+show children of the specified revision
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.UNINDENT
+.SS churn
+.sp
+command to display statistics about repository history
+.SS Commands
+.SS churn
+.sp
+.nf
+.ft C
+hg churn [\-d DATE] [\-r REV] [\-\-aliases FILE] [FILE]
+.ft P
+.fi
+.sp
+This command will display a histogram representing the number
+of changed lines or revisions, grouped according to the given
+template. The default template will group changes by author.
+The \-\-dateformat option may be used to group the results by
+date instead.
+.sp
+Statistics are based on the number of changed lines, or
+alternatively the number of matching revisions if the
+\-\-changesets option is specified.
+.sp
+Examples:
+.sp
+.nf
+.ft C
+# display count of changed lines for every committer
+hg churn \-t \(aq{author|email}\(aq
+
+# display daily activity graph
+hg churn \-f \(aq%H\(aq \-s \-c
+
+# display activity of developers by month
+hg churn \-f \(aq%Y\-%m\(aq \-s \-c
+
+# display count of lines changed in every year
+hg churn \-f \(aq%Y\(aq \-s
+.ft P
+.fi
+.sp
+It is possible to map alternate email addresses to a main address
+by providing a file using the following format:
+.sp
+.nf
+.ft C
+<alias email> = <actual email>
+.ft P
+.fi
+.sp
+Such a file may be specified with the \-\-aliases option, otherwise
+a .hgchurn file will be looked for in the working directory root.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+count rate for the specified revision or range
+.TP
+.B \-d, \-\-date
+.
+count rate for revisions matching date spec
+.TP
+.B \-t, \-\-template
+.
+template to group changesets (default: {author|email})
+.TP
+.B \-f, \-\-dateformat
+.
+strftime\-compatible format for grouping by date
+.TP
+.B \-c, \-\-changesets
+.
+count rate by number of changesets
+.TP
+.B \-s, \-\-sort
+.
+sort by key (default: sort by count)
+.TP
+.B \-\-diffstat
+.
+display added/removed lines separately
+.TP
+.B \-\-aliases
+.
+file with email aliases
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS color
+.sp
+colorize output from some commands
+.sp
+This extension modifies the status and resolve commands to add color
+to their output to reflect file status, the qseries command to add
+color to reflect patch status (applied, unapplied, missing), and to
+diff\-related commands to highlight additions, removals, diff headers,
+and trailing whitespace.
+.sp
+Other effects in addition to color, like bold and underlined text, are
+also available. By default, the terminfo database is used to find the
+terminal codes used to change color and effect. If terminfo is not
+available, then effects are rendered with the ECMA\-48 SGR control
+function (aka ANSI escape codes).
+.sp
+Default effects may be overridden from your configuration file:
+.sp
+.nf
+.ft C
+[color]
+status.modified = blue bold underline red_background
+status.added = green bold
+status.removed = red bold blue_background
+status.deleted = cyan bold underline
+status.unknown = magenta bold underline
+status.ignored = black bold
+
+# \(aqnone\(aq turns off all effects
+status.clean = none
+status.copied = none
+
+qseries.applied = blue bold underline
+qseries.unapplied = black bold
+qseries.missing = red bold
+
+diff.diffline = bold
+diff.extended = cyan bold
+diff.file_a = red bold
+diff.file_b = green bold
+diff.hunk = magenta
+diff.deleted = red
+diff.inserted = green
+diff.changed = white
+diff.trailingwhitespace = bold red_background
+
+resolve.unresolved = red bold
+resolve.resolved = green bold
+
+bookmarks.current = green
+
+branches.active = none
+branches.closed = black bold
+branches.current = green
+branches.inactive = none
+
+tags.normal = green
+tags.local = black bold
+.ft P
+.fi
+.sp
+The available effects in terminfo mode are \(aqblink\(aq, \(aqbold\(aq, \(aqdim\(aq,
+\(aqinverse\(aq, \(aqinvisible\(aq, \(aqitalic\(aq, \(aqstandout\(aq, and \(aqunderline\(aq; in
+ECMA\-48 mode, the options are \(aqbold\(aq, \(aqinverse\(aq, \(aqitalic\(aq, and
+\(aqunderline\(aq. How each is rendered depends on the terminal emulator.
+Some may not be available for a given terminal type, and will be
+silently ignored.
+.sp
+Note that on some systems, terminfo mode may cause problems when using
+color with the pager extension and less \-R. less with the \-R option
+will only display ECMA\-48 color codes, and terminfo mode may sometimes
+emit codes that less doesn\(aqt understand. You can work around this by
+either using ansi mode (or auto mode), or by using less \-r (which will
+pass through all terminal control codes, not just color control
+codes).
+.sp
+Because there are only eight standard colors, this module allows you
+to define color names for other color slots which might be available
+for your terminal type, assuming terminfo mode. For instance:
+.sp
+.nf
+.ft C
+color.brightblue = 12
+color.pink = 207
+color.orange = 202
+.ft P
+.fi
+.sp
+to set \(aqbrightblue\(aq to color slot 12 (useful for 16 color terminals
+that have brighter colors defined in the upper eight) and, \(aqpink\(aq and
+\(aqorange\(aq to colors in 256\-color xterm\(aqs default color cube. These
+defined colors may then be used as any of the pre\-defined eight,
+including appending \(aq_background\(aq to set the background to that color.
+.sp
+By default, the color extension will use ANSI mode (or win32 mode on
+Windows) if it detects a terminal. To override auto mode (to enable
+terminfo mode, for example), set the following configuration option:
+.sp
+.nf
+.ft C
+[color]
+mode = terminfo
+.ft P
+.fi
+.sp
+Any value other than \(aqansi\(aq, \(aqwin32\(aq, \(aqterminfo\(aq, or \(aqauto\(aq will
+disable color.
+.SS convert
+.sp
+import revisions from foreign VCS repositories into Mercurial
+.SS Commands
+.SS convert
+.sp
+.nf
+.ft C
+hg convert [OPTION]... SOURCE [DEST [REVMAP]]
+.ft P
+.fi
+.sp
+Accepted source formats [identifiers]:
+.INDENT 0.0
+.IP \(bu 2
+.
+Mercurial [hg]
+.IP \(bu 2
+.
+CVS [cvs]
+.IP \(bu 2
+.
+Darcs [darcs]
+.IP \(bu 2
+.
+git [git]
+.IP \(bu 2
+.
+Subversion [svn]
+.IP \(bu 2
+.
+Monotone [mtn]
+.IP \(bu 2
+.
+GNU Arch [gnuarch]
+.IP \(bu 2
+.
+Bazaar [bzr]
+.IP \(bu 2
+.
+Perforce [p4]
+.UNINDENT
+.sp
+Accepted destination formats [identifiers]:
+.INDENT 0.0
+.IP \(bu 2
+.
+Mercurial [hg]
+.IP \(bu 2
+.
+Subversion [svn] (history on branches is not preserved)
+.UNINDENT
+.sp
+If no revision is given, all revisions will be converted.
+Otherwise, convert will only import up to the named revision
+(given in a format understood by the source).
+.sp
+If no destination directory name is specified, it defaults to the
+basename of the source with \fB\-hg\fP appended. If the destination
+repository doesn\(aqt exist, it will be created.
+.sp
+By default, all sources except Mercurial will use \-\-branchsort.
+Mercurial uses \-\-sourcesort to preserve original revision numbers
+order. Sort modes have the following effects:
+.INDENT 0.0
+.TP
+.B \-\-branchsort
+.
+convert from parent to child revision when possible,
+which means branches are usually converted one after
+the other. It generates more compact repositories.
+.TP
+.B \-\-datesort
+.
+sort revisions by date. Converted repositories have
+good\-looking changelogs but are often an order of
+magnitude larger than the same ones generated by
+\-\-branchsort.
+.TP
+.B \-\-sourcesort
+.
+try to preserve source revisions order, only
+supported by Mercurial sources.
+.UNINDENT
+.sp
+If \fBREVMAP\fP isn\(aqt given, it will be put in a default location
+(\fB<dest>/.hg/shamap\fP by default). The \fBREVMAP\fP is a simple
+text file that maps each source commit ID to the destination ID
+for that revision, like so:
+.sp
+.nf
+.ft C
+<source ID> <destination ID>
+.ft P
+.fi
+.sp
+If the file doesn\(aqt exist, it\(aqs automatically created. It\(aqs
+updated on each commit copied, so \%\fBhg convert\fP\: can be interrupted
+and can be run repeatedly to copy new commits.
+.sp
+The authormap is a simple text file that maps each source commit
+author to a destination commit author. It is handy for source SCMs
+that use unix logins to identify authors (eg: CVS). One line per
+author mapping and the line format is:
+.sp
+.nf
+.ft C
+source author = destination author
+.ft P
+.fi
+.sp
+Empty lines and lines starting with a \fB#\fP are ignored.
+.sp
+The filemap is a file that allows filtering and remapping of files
+and directories. Each line can contain one of the following
+directives:
+.sp
+.nf
+.ft C
+include path/to/file\-or\-dir
+
+exclude path/to/file\-or\-dir
+
+rename path/to/source path/to/destination
+.ft P
+.fi
+.sp
+Comment lines start with \fB#\fP. A specified path matches if it
+equals the full relative name of a file or one of its parent
+directories. The \fBinclude\fP or \fBexclude\fP directive with the
+longest matching path applies, so line order does not matter.
+.sp
+The \fBinclude\fP directive causes a file, or all files under a
+directory, to be included in the destination repository, and the
+exclusion of all other files and directories not explicitly
+included. The \fBexclude\fP directive causes files or directories to
+be omitted. The \fBrename\fP directive renames a file or directory if
+it is converted. To rename from a subdirectory into the root of
+the repository, use \fB.\fP as the path to rename to.
+.sp
+The splicemap is a file that allows insertion of synthetic
+history, letting you specify the parents of a revision. This is
+useful if you want to e.g. give a Subversion merge two parents, or
+graft two disconnected series of history together. Each entry
+contains a key, followed by a space, followed by one or two
+comma\-separated values:
+.sp
+.nf
+.ft C
+key parent1, parent2
+.ft P
+.fi
+.sp
+The key is the revision ID in the source
+revision control system whose parents should be modified (same
+format as a key in .hg/shamap). The values are the revision IDs
+(in either the source or destination revision control system) that
+should be used as the new parents for that node. For example, if
+you have merged "release\-1.0" into "trunk", then you should
+specify the revision on "trunk" as the first parent and the one on
+the "release\-1.0" branch as the second.
+.sp
+The branchmap is a file that allows you to rename a branch when it is
+being brought in from whatever external repository. When used in
+conjunction with a splicemap, it allows for a powerful combination
+to help fix even the most badly mismanaged repositories and turn them
+into nicely structured Mercurial repositories. The branchmap contains
+lines of the form:
+.sp
+.nf
+.ft C
+original_branch_name new_branch_name
+.ft P
+.fi
+.sp
+where "original_branch_name" is the name of the branch in the
+source repository, and "new_branch_name" is the name of the branch
+is the destination repository. No whitespace is allowed in the
+branch names. This can be used to (for instance) move code in one
+repository from "default" to a named branch.
+.SS Mercurial Source
+.sp
+The Mercurial source recognizes the following configuration
+options, which you can set on the command line with \fB\-\-config\fP:
+.INDENT 0.0
+.TP
+.B convert.hg.ignoreerrors
+.
+ignore integrity errors when reading.
+Use it to fix Mercurial repositories with missing revlogs, by
+converting from and to Mercurial. Default is False.
+.TP
+.B convert.hg.saverev
+.
+store original revision ID in changeset
+(forces target IDs to change). It takes a boolean argument and
+defaults to False.
+.TP
+.B convert.hg.startrev
+.
+convert start revision and its descendants.
+It takes a hg revision identifier and defaults to 0.
+.UNINDENT
+.SS CVS Source
+.sp
+CVS source will use a sandbox (i.e. a checked\-out copy) from CVS
+to indicate the starting point of what will be converted. Direct
+access to the repository files is not needed, unless of course the
+repository is \fB:local:\fP. The conversion uses the top level
+directory in the sandbox to find the CVS repository, and then uses
+CVS rlog commands to find files to convert. This means that unless
+a filemap is given, all files under the starting directory will be
+converted, and that any directory reorganization in the CVS
+sandbox is ignored.
+.sp
+The following options can be used with \fB\-\-config\fP:
+.INDENT 0.0
+.TP
+.B convert.cvsps.cache
+.
+Set to False to disable remote log caching,
+for testing and debugging purposes. Default is True.
+.TP
+.B convert.cvsps.fuzz
+.
+Specify the maximum time (in seconds) that is
+allowed between commits with identical user and log message in
+a single changeset. When very large files were checked in as
+part of a changeset then the default may not be long enough.
+The default is 60.
+.TP
+.B convert.cvsps.mergeto
+.
+Specify a regular expression to which
+commit log messages are matched. If a match occurs, then the
+conversion process will insert a dummy revision merging the
+branch on which this log message occurs to the branch
+indicated in the regex. Default is \fB{{mergetobranch
+([\-\ew]+)}}\fP
+.TP
+.B convert.cvsps.mergefrom
+.
+Specify a regular expression to which
+commit log messages are matched. If a match occurs, then the
+conversion process will add the most recent revision on the
+branch indicated in the regex as the second parent of the
+changeset. Default is \fB{{mergefrombranch ([\-\ew]+)}}\fP
+.TP
+.B hook.cvslog
+.
+Specify a Python function to be called at the end of
+gathering the CVS log. The function is passed a list with the
+log entries, and can modify the entries in\-place, or add or
+delete them.
+.TP
+.B hook.cvschangesets
+.
+Specify a Python function to be called after
+the changesets are calculated from the CVS log. The
+function is passed a list with the changeset entries, and can
+modify the changesets in\-place, or add or delete them.
+.UNINDENT
+.sp
+An additional "debugcvsps" Mercurial command allows the builtin
+changeset merging code to be run without doing a conversion. Its
+parameters and output are similar to that of cvsps 2.1. Please see
+the command help for more details.
+.SS Subversion Source
+.sp
+Subversion source detects classical trunk/branches/tags layouts.
+By default, the supplied \fBsvn://repo/path/\fP source URL is
+converted as a single branch. If \fBsvn://repo/path/trunk\fP exists
+it replaces the default branch. If \fBsvn://repo/path/branches\fP
+exists, its subdirectories are listed as possible branches. If
+\fBsvn://repo/path/tags\fP exists, it is looked for tags referencing
+converted branches. Default \fBtrunk\fP, \fBbranches\fP and \fBtags\fP
+values can be overridden with following options. Set them to paths
+relative to the source URL, or leave them blank to disable auto
+detection.
+.sp
+The following options can be set with \fB\-\-config\fP:
+.INDENT 0.0
+.TP
+.B convert.svn.branches
+.
+specify the directory containing branches.
+The default is \fBbranches\fP.
+.TP
+.B convert.svn.tags
+.
+specify the directory containing tags. The
+default is \fBtags\fP.
+.TP
+.B convert.svn.trunk
+.
+specify the name of the trunk branch. The
+default is \fBtrunk\fP.
+.UNINDENT
+.sp
+Source history can be retrieved starting at a specific revision,
+instead of being integrally converted. Only single branch
+conversions are supported.
+.INDENT 0.0
+.TP
+.B convert.svn.startrev
+.
+specify start Subversion revision number.
+The default is 0.
+.UNINDENT
+.SS Perforce Source
+.sp
+The Perforce (P4) importer can be given a p4 depot path or a
+client specification as source. It will convert all files in the
+source to a flat Mercurial repository, ignoring labels, branches
+and integrations. Note that when a depot path is given you then
+usually should specify a target directory, because otherwise the
+target may be named \fB...\-hg\fP.
+.sp
+It is possible to limit the amount of source history to be
+converted by specifying an initial Perforce revision:
+.INDENT 0.0
+.TP
+.B convert.p4.startrev
+.
+specify initial Perforce revision (a
+Perforce changelist number).
+.UNINDENT
+.SS Mercurial Destination
+.sp
+The following options are supported:
+.INDENT 0.0
+.TP
+.B convert.hg.clonebranches
+.
+dispatch source branches in separate
+clones. The default is False.
+.TP
+.B convert.hg.tagsbranch
+.
+branch name for tag revisions, defaults to
+\fBdefault\fP.
+.TP
+.B convert.hg.usebranchnames
+.
+preserve branch names. The default is
+True.
+.UNINDENT
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-authors
+.
+username mapping filename (DEPRECATED, use \-\-authormap instead)
+.TP
+.B \-s, \-\-source\-type
+.
+source repository type
+.TP
+.B \-d, \-\-dest\-type
+.
+destination repository type
+.TP
+.B \-r, \-\-rev
+.
+import up to target revision REV
+.TP
+.B \-A, \-\-authormap
+.
+remap usernames using this file
+.TP
+.B \-\-filemap
+.
+remap file names using contents of file
+.TP
+.B \-\-splicemap
+.
+splice synthesized history into place
+.TP
+.B \-\-branchmap
+.
+change branch names while converting
+.TP
+.B \-\-branchsort
+.
+try to sort changesets by branches
+.TP
+.B \-\-datesort
+.
+try to sort changesets by date
+.TP
+.B \-\-sourcesort
+.
+preserve source changesets order
+.UNINDENT
+.SS eol
+.sp
+automatically manage newlines in repository files
+.sp
+This extension allows you to manage the type of line endings (CRLF or
+LF) that are used in the repository and in the local working
+directory. That way you can get CRLF line endings on Windows and LF on
+Unix/Mac, thereby letting everybody use their OS native line endings.
+.sp
+The extension reads its configuration from a versioned \fB.hgeol\fP
+configuration file found in the root of the working copy. The
+\fB.hgeol\fP file use the same syntax as all other Mercurial
+configuration files. It uses two sections, \fB[patterns]\fP and
+\fB[repository]\fP.
+.sp
+The \fB[patterns]\fP section specifies how line endings should be
+converted between the working copy and the repository. The format is
+specified by a file pattern. The first match is used, so put more
+specific patterns first. The available line endings are \fBLF\fP,
+\fBCRLF\fP, and \fBBIN\fP.
+.sp
+Files with the declared format of \fBCRLF\fP or \fBLF\fP are always
+checked out and stored in the repository in that format and files
+declared to be binary (\fBBIN\fP) are left unchanged. Additionally,
+\fBnative\fP is an alias for checking out in the platform\(aqs default line
+ending: \fBLF\fP on Unix (including Mac OS X) and \fBCRLF\fP on
+Windows. Note that \fBBIN\fP (do nothing to line endings) is Mercurial\(aqs
+default behaviour; it is only needed if you need to override a later,
+more general pattern.
+.sp
+The optional \fB[repository]\fP section specifies the line endings to
+use for files stored in the repository. It has a single setting,
+\fBnative\fP, which determines the storage line endings for files
+declared as \fBnative\fP in the \fB[patterns]\fP section. It can be set to
+\fBLF\fP or \fBCRLF\fP. The default is \fBLF\fP. For example, this means
+that on Windows, files configured as \fBnative\fP (\fBCRLF\fP by default)
+will be converted to \fBLF\fP when stored in the repository. Files
+declared as \fBLF\fP, \fBCRLF\fP, or \fBBIN\fP in the \fB[patterns]\fP section
+are always stored as\-is in the repository.
+.sp
+Example versioned \fB.hgeol\fP file:
+.sp
+.nf
+.ft C
+[patterns]
+**.py = native
+**.vcproj = CRLF
+**.txt = native
+Makefile = LF
+**.jpg = BIN
+
+[repository]
+native = LF
+.ft P
+.fi
+.IP Note
+.
+The rules will first apply when files are touched in the working
+copy, e.g. by updating to null and back to tip to touch all files.
+.RE
+.sp
+The extension uses an optional \fB[eol]\fP section read from both the
+normal Mercurial configuration files and the \fB.hgeol\fP file, with the
+latter overriding the former. You can use that section to control the
+overall behavior. There are three settings:
+.INDENT 0.0
+.IP \(bu 2
+.
+\fBeol.native\fP (default \fBos.linesep\fP) can be set to \fBLF\fP or
+\fBCRLF\fP to override the default interpretation of \fBnative\fP for
+checkout. This can be used with \%\fBhg archive\fP\: on Unix, say, to
+generate an archive where files have line endings for Windows.
+.IP \(bu 2
+.
+\fBeol.only\-consistent\fP (default True) can be set to False to make
+the extension convert files with inconsistent EOLs. Inconsistent
+means that there is both \fBCRLF\fP and \fBLF\fP present in the file.
+Such files are normally not touched under the assumption that they
+have mixed EOLs on purpose.
+.IP \(bu 2
+.
+\fBeol.fix\-trailing\-newline\fP (default False) can be set to True to
+ensure that converted files end with a EOL character (either \fB\en\fP
+or \fB\er\en\fP as per the configured patterns).
+.UNINDENT
+.sp
+The extension provides \fBcleverencode:\fP and \fBcleverdecode:\fP filters
+like the deprecated win32text extension does. This means that you can
+disable win32text and enable eol and your filters will still work. You
+only need to these filters until you have prepared a \fB.hgeol\fP file.
+.sp
+The \fBwin32text.forbid*\fP hooks provided by the win32text extension
+have been unified into a single hook named \fBeol.checkheadshook\fP. The
+hook will lookup the expected line endings from the \fB.hgeol\fP file,
+which means you must migrate to a \fB.hgeol\fP file first before using
+the hook. \fBeol.checkheadshook\fP only checks heads, intermediate
+invalid revisions will be pushed. To forbid them completely, use the
+\fBeol.checkallhook\fP hook. These hooks are best used as
+\fBpretxnchangegroup\fP hooks.
+.sp
+See \%\fBhg help patterns\fP\: for more information about the glob patterns
+used.
+.SS extdiff
+.sp
+command to allow external programs to compare revisions
+.sp
+The extdiff Mercurial extension allows you to use external programs
+to compare revisions, or revision with working directory. The external
+diff programs are called with a configurable set of options and two
+non\-option arguments: paths to directories containing snapshots of
+files to compare.
+.sp
+The extdiff extension also allows you to configure new diff commands, so
+you do not need to type \%\fBhg extdiff \-p kdiff3\fP\: always.
+.sp
+.nf
+.ft C
+[extdiff]
+# add new command that runs GNU diff(1) in \(aqcontext diff\(aq mode
+cdiff = gdiff \-Nprc5
+## or the old way:
+#cmd.cdiff = gdiff
+#opts.cdiff = \-Nprc5
+
+# add new command called vdiff, runs kdiff3
+vdiff = kdiff3
+
+# add new command called meld, runs meld (no need to name twice)
+meld =
+
+# add new command called vimdiff, runs gvimdiff with DirDiff plugin
+# (see http://www.vim.org/scripts/script.php?script_id=102) Non
+# English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
+# your .vimrc
+vimdiff = gvim \-f "+next" \e
+ "+execute \(aqDirDiff\(aq fnameescape(argv(0)) fnameescape(argv(1))"
+.ft P
+.fi
+.sp
+Tool arguments can include variables that are expanded at runtime:
+.sp
+.nf
+.ft C
+$parent1, $plabel1 \- filename, descriptive label of first parent
+$child, $clabel \- filename, descriptive label of child revision
+$parent2, $plabel2 \- filename, descriptive label of second parent
+$root \- repository root
+$parent is an alias for $parent1.
+.ft P
+.fi
+.sp
+The extdiff extension will look in your [diff\-tools] and [merge\-tools]
+sections for diff tool arguments, when none are specified in [extdiff].
+.sp
+.nf
+.ft C
+[extdiff]
+kdiff3 =
+
+[diff\-tools]
+kdiff3.diffargs=\-\-L1 \(aq$plabel1\(aq \-\-L2 \(aq$clabel\(aq $parent $child
+.ft P
+.fi
+.sp
+You can use \-I/\-X and list of file or directory names like normal
+\%\fBhg diff\fP\: command. The extdiff extension makes snapshots of only
+needed files, so running the external diff program will actually be
+pretty fast (at least faster than having to compare the entire tree).
+.SS Commands
+.SS extdiff
+.sp
+.nf
+.ft C
+hg extdiff [OPT]... [FILE]...
+.ft P
+.fi
+.sp
+Show differences between revisions for the specified files, using
+an external program. The default program used is diff, with
+default options "\-Npru".
+.sp
+To select a different program, use the \-p/\-\-program option. The
+program will be passed the names of two directories to compare. To
+pass additional options to the program, use \-o/\-\-option. These
+will be passed before the names of the directories to compare.
+.sp
+When two revision arguments are given, then changes are shown
+between those revisions. If only one revision is specified then
+that revision is compared to the working directory, and, when no
+revisions are specified, the working directory files are compared
+to its parent.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-p, \-\-program
+.
+comparison program to run
+.TP
+.B \-o, \-\-option
+.
+pass option to comparison program
+.TP
+.B \-r, \-\-rev
+.
+revision
+.TP
+.B \-c, \-\-change
+.
+change made by revision
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS factotum
+.sp
+http authentication with factotum
+.sp
+This extension allows the factotum(4) facility on Plan 9 from Bell Labs
+platforms to provide authentication information for HTTP access. Configuration
+entries specified in the auth section as well as authentication information
+provided in the repository URL are fully supported. If no prefix is specified,
+a value of "*" will be assumed.
+.sp
+By default, keys are specified as:
+.sp
+.nf
+.ft C
+proto=pass service=hg prefix=<prefix> user=<username> !password=<password>
+.ft P
+.fi
+.sp
+If the factotum extension is unable to read the required key, one will be
+requested interactively.
+.sp
+A configuration section is available to customize runtime behavior. By
+default, these entries are:
+.sp
+.nf
+.ft C
+[factotum]
+executable = /bin/auth/factotum
+mountpoint = /mnt/factotum
+service = hg
+.ft P
+.fi
+.sp
+The executable entry defines the full path to the factotum binary. The
+mountpoint entry defines the path to the factotum file service. Lastly, the
+service entry controls the service name used when reading keys.
+.SS fetch
+.sp
+pull, update and merge in one command (DEPRECATED)
+.SS Commands
+.SS fetch
+.sp
+.nf
+.ft C
+hg fetch [SOURCE]
+.ft P
+.fi
+.sp
+This finds all changes from the repository at the specified path
+or URL and adds them to the local repository.
+.sp
+If the pulled changes add a new branch head, the head is
+automatically merged, and the result of the merge is committed.
+Otherwise, the working directory is updated to include the new
+changes.
+.sp
+When a merge is needed, the working directory is first updated to
+the newly pulled changes. Local changes are then merged into the
+pulled changes. To switch the merge order, use \-\-switch\-parent.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+a specific revision you would like to pull
+.TP
+.B \-e, \-\-edit
+.
+edit commit message
+.TP
+.B \-\-force\-editor
+.
+edit commit message (DEPRECATED)
+.TP
+.B \-\-switch\-parent
+.
+switch parents when merging
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS gpg
+.sp
+commands to sign and verify changesets
+.SS Commands
+.SS sigcheck
+.sp
+.nf
+.ft C
+hg sigcheck REV
+.ft P
+.fi
+.sp
+verify all the signatures there may be for a particular revision
+.SS sign
+.sp
+.nf
+.ft C
+hg sign [OPTION]... [REV]...
+.ft P
+.fi
+.sp
+If no revision is given, the parent of the working directory is used,
+or tip if no revision is checked out.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-l, \-\-local
+.
+make the signature local
+.TP
+.B \-f, \-\-force
+.
+sign even if the sigfile is modified
+.TP
+.B \-\-no\-commit
+.
+do not commit the sigfile after signing
+.TP
+.B \-k, \-\-key
+.
+the key id to sign with
+.TP
+.B \-m, \-\-message
+.
+commit message
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.UNINDENT
+.SS sigs
+.sp
+.nf
+.ft C
+hg sigs
+.ft P
+.fi
+.sp
+list signed changesets
+.SS graphlog
+.sp
+command to view revision graphs from a shell
+.sp
+This extension adds a \-\-graph option to the incoming, outgoing and log
+commands. When this options is given, an ASCII representation of the
+revision graph is also shown.
+.SS Commands
+.SS glog
+.sp
+.nf
+.ft C
+hg glog [OPTION]... [FILE]
+.ft P
+.fi
+.sp
+Print a revision history alongside a revision graph drawn with
+ASCII characters.
+.sp
+Nodes printed as an @ character are parents of the working
+directory.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-f, \-\-follow
+.
+follow changeset history, or file history across copies and renames
+.TP
+.B \-\-follow\-first
+.
+only follow the first parent of merge changesets (DEPRECATED)
+.TP
+.B \-d, \-\-date
+.
+show revisions matching date spec
+.TP
+.B \-C, \-\-copies
+.
+show copied files
+.TP
+.B \-k, \-\-keyword
+.
+do case\-insensitive search for a given text
+.TP
+.B \-r, \-\-rev
+.
+show the specified revision or range
+.TP
+.B \-\-removed
+.
+include revisions where files were removed
+.TP
+.B \-m, \-\-only\-merges
+.
+show only merges (DEPRECATED)
+.TP
+.B \-u, \-\-user
+.
+revisions committed by user
+.TP
+.B \-\-only\-branch
+.
+show only changesets within the given named branch (DEPRECATED)
+.TP
+.B \-b, \-\-branch
+.
+show changesets within the given named branch
+.TP
+.B \-P, \-\-prune
+.
+do not display revision or any of its ancestors
+.TP
+.B \-\-hidden
+.
+show hidden changesets (DEPRECATED)
+.TP
+.B \-p, \-\-patch
+.
+show patch
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-l, \-\-limit
+.
+limit number of changes displayed
+.TP
+.B \-M, \-\-no\-merges
+.
+do not show merges
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-G, \-\-graph
+.
+show the revision DAG
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS hgcia
+.sp
+hooks for integrating with the CIA.vc notification service
+.sp
+This is meant to be run as a changegroup or incoming hook. To
+configure it, set the following options in your hgrc:
+.sp
+.nf
+.ft C
+[cia]
+# your registered CIA user name
+user = foo
+# the name of the project in CIA
+project = foo
+# the module (subproject) (optional)
+#module = foo
+# Append a diffstat to the log message (optional)
+#diffstat = False
+# Template to use for log messages (optional)
+#template = {desc}\en{baseurl}{webroot}/rev/{node}\-\- {diffstat}
+# Style to use (optional)
+#style = foo
+# The URL of the CIA notification service (optional)
+# You can use mailto: URLs to send by email, eg
+# mailto:cia@cia.vc
+# Make sure to set email.from if you do this.
+#url = http://cia.vc/
+# print message instead of sending it (optional)
+#test = False
+# number of slashes to strip for url paths
+#strip = 0
+
+[hooks]
+# one of these:
+changegroup.cia = python:hgcia.hook
+#incoming.cia = python:hgcia.hook
+
+[web]
+# If you want hyperlinks (optional)
+baseurl = http://server/path/to/repo
+.ft P
+.fi
+.SS hgk
+.sp
+browse the repository in a graphical way
+.sp
+The hgk extension allows browsing the history of a repository in a
+graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
+distributed with Mercurial.)
+.sp
+hgk consists of two parts: a Tcl script that does the displaying and
+querying of information, and an extension to Mercurial named hgk.py,
+which provides hooks for hgk to get information. hgk can be found in
+the contrib directory, and the extension is shipped in the hgext
+repository, and needs to be enabled.
+.sp
+The \%\fBhg view\fP\: command will launch the hgk Tcl script. For this command
+to work, hgk must be in your search path. Alternately, you can specify
+the path to hgk in your configuration file:
+.sp
+.nf
+.ft C
+[hgk]
+path=/location/of/hgk
+.ft P
+.fi
+.sp
+hgk can make use of the extdiff extension to visualize revisions.
+Assuming you had already configured extdiff vdiff command, just add:
+.sp
+.nf
+.ft C
+[hgk]
+vdiff=vdiff
+.ft P
+.fi
+.sp
+Revisions context menu will now display additional entries to fire
+vdiff on hovered and selected revisions.
+.SS Commands
+.SS view
+.sp
+.nf
+.ft C
+hg view [\-l LIMIT] [REVRANGE]
+.ft P
+.fi
+.sp
+start interactive history viewer
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-l, \-\-limit
+.
+limit number of changes displayed
+.UNINDENT
+.SS highlight
+.sp
+syntax highlighting for hgweb (requires Pygments)
+.sp
+It depends on the Pygments syntax highlighting library:
+\%http://pygments.org/\:
+.sp
+There is a single configuration option:
+.sp
+.nf
+.ft C
+[web]
+pygments_style = <style>
+.ft P
+.fi
+.sp
+The default is \(aqcolorful\(aq.
+.SS histedit
+.sp
+interactive history editing
+.sp
+With this extension installed, Mercurial gains one new command: histedit. Usage
+is as follows, assuming the following history:
+.sp
+.nf
+.ft C
+@ 3[tip] 7c2fd3b9020c 2009\-04\-27 18:04 \-0500 durin42
+| Add delta
+|
+o 2 030b686bedc4 2009\-04\-27 18:04 \-0500 durin42
+| Add gamma
+|
+o 1 c561b4e977df 2009\-04\-27 18:04 \-0500 durin42
+| Add beta
+|
+o 0 d8d2fcd0e319 2009\-04\-27 18:04 \-0500 durin42
+ Add alpha
+.ft P
+.fi
+.sp
+If you were to run \fBhg histedit c561b4e977df\fP, you would see the following
+file open in your editor:
+.sp
+.nf
+.ft C
+pick c561b4e977df Add beta
+pick 030b686bedc4 Add gamma
+pick 7c2fd3b9020c Add delta
+
+# Edit history between 633536316234 and 7c2fd3b9020c
+#
+# Commands:
+# p, pick = use commit
+# e, edit = use commit, but stop for amending
+# f, fold = use commit, but fold into previous commit
+# d, drop = remove commit from history
+# m, mess = edit message without changing commit content
+#
+.ft P
+.fi
+.sp
+In this file, lines beginning with \fB#\fP are ignored. You must specify a rule
+for each revision in your history. For example, if you had meant to add gamma
+before beta, and then wanted to add delta in the same revision as beta, you
+would reorganize the file to look like this:
+.sp
+.nf
+.ft C
+pick 030b686bedc4 Add gamma
+pick c561b4e977df Add beta
+fold 7c2fd3b9020c Add delta
+
+# Edit history between 633536316234 and 7c2fd3b9020c
+#
+# Commands:
+# p, pick = use commit
+# e, edit = use commit, but stop for amending
+# f, fold = use commit, but fold into previous commit
+# d, drop = remove commit from history
+# m, mess = edit message without changing commit content
+#
+.ft P
+.fi
+.sp
+At which point you close the editor and \fBhistedit\fP starts working. When you
+specify a \fBfold\fP operation, \fBhistedit\fP will open an editor when it folds
+those revisions together, offering you a chance to clean up the commit message:
+.sp
+.nf
+.ft C
+Add beta
+***
+Add delta
+.ft P
+.fi
+.sp
+Edit the commit message to your liking, then close the editor. For
+this example, let\(aqs assume that the commit message was changed to
+\fBAdd beta and delta.\fP After histedit has run and had a chance to
+remove any old or temporary revisions it needed, the history looks
+like this:
+.sp
+.nf
+.ft C
+@ 2[tip] 989b4d060121 2009\-04\-27 18:04 \-0500 durin42
+| Add beta and delta.
+|
+o 1 081603921c3f 2009\-04\-27 18:04 \-0500 durin42
+| Add gamma
+|
+o 0 d8d2fcd0e319 2009\-04\-27 18:04 \-0500 durin42
+ Add alpha
+.ft P
+.fi
+.sp
+Note that \fBhistedit\fP does \fInot\fP remove any revisions (even its own temporary
+ones) until after it has completed all the editing operations, so it will
+probably perform several strip operations when it\(aqs done. For the above example,
+it had to run strip twice. Strip can be slow depending on a variety of factors,
+so you might need to be a little patient. You can choose to keep the original
+revisions by passing the \fB\-\-keep\fP flag.
+.sp
+The \fBedit\fP operation will drop you back to a command prompt,
+allowing you to edit files freely, or even use \fBhg record\fP to commit
+some changes as a separate commit. When you\(aqre done, any remaining
+uncommitted changes will be committed as well. When done, run \fBhg
+histedit \-\-continue\fP to finish this step. You\(aqll be prompted for a
+new commit message, but the default commit message will be the
+original message for the \fBedit\fP ed revision.
+.sp
+The \fBmessage\fP operation will give you a chance to revise a commit
+message without changing the contents. It\(aqs a shortcut for doing
+\fBedit\fP immediately followed by \fIhg histedit \-\-continue\(ga\fP.
+.sp
+If \fBhistedit\fP encounters a conflict when moving a revision (while
+handling \fBpick\fP or \fBfold\fP), it\(aqll stop in a similar manner to
+\fBedit\fP with the difference that it won\(aqt prompt you for a commit
+message when done. If you decide at this point that you don\(aqt like how
+much work it will be to rearrange history, or that you made a mistake,
+you can use \fBhg histedit \-\-abort\fP to abandon the new changes you
+have made and return to the state before you attempted to edit your
+history.
+.sp
+If we clone the example repository above and add three more changes, such that
+we have the following history:
+.sp
+.nf
+.ft C
+@ 6[tip] 038383181893 2009\-04\-27 18:04 \-0500 stefan
+| Add theta
+|
+o 5 140988835471 2009\-04\-27 18:04 \-0500 stefan
+| Add eta
+|
+o 4 122930637314 2009\-04\-27 18:04 \-0500 stefan
+| Add zeta
+|
+o 3 836302820282 2009\-04\-27 18:04 \-0500 stefan
+| Add epsilon
+|
+o 2 989b4d060121 2009\-04\-27 18:04 \-0500 durin42
+| Add beta and delta.
+|
+o 1 081603921c3f 2009\-04\-27 18:04 \-0500 durin42
+| Add gamma
+|
+o 0 d8d2fcd0e319 2009\-04\-27 18:04 \-0500 durin42
+ Add alpha
+.ft P
+.fi
+.sp
+If you run \fBhg histedit \-\-outgoing\fP on the clone then it is the same
+as running \fBhg histedit 836302820282\fP. If you need plan to push to a
+repository that Mercurial does not detect to be related to the source
+repo, you can add a \fB\-\-force\fP option.
+.SS Commands
+.SS histedit
+.sp
+.nf
+.ft C
+hg histedit [PARENT]
+.ft P
+.fi
+.sp
+interactively edit changeset history
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-commands
+.
+Read history edits from the specified file.
+.TP
+.B \-c, \-\-continue
+.
+continue an edit already in progress
+.TP
+.B \-k, \-\-keep
+.
+don\(aqt strip old nodes after edit is complete
+.TP
+.B \-\-abort
+.
+abort an edit in progress
+.TP
+.B \-o, \-\-outgoing
+.
+changesets not found in destination
+.TP
+.B \-f, \-\-force
+.
+force outgoing even for unrelated repositories
+.TP
+.B \-r, \-\-rev
+.
+first revision to be edited
+.UNINDENT
+.SS inotify
+.sp
+accelerate status report using Linux\(aqs inotify service
+.SS Commands
+.SS inserve
+.sp
+.nf
+.ft C
+hg inserve [OPTION]...
+.ft P
+.fi
+.sp
+start an inotify server for this repository
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-d, \-\-daemon
+.
+run server in background
+.TP
+.B \-\-daemon\-pipefds
+.
+used internally by daemon mode
+.TP
+.B \-t, \-\-idle\-timeout
+.
+minutes to sit idle before exiting
+.TP
+.B \-\-pid\-file
+.
+name of file to write process ID to
+.UNINDENT
+.SS interhg
+.sp
+expand expressions into changelog and summaries
+.sp
+This extension allows the use of a special syntax in summaries, which
+will be automatically expanded into links or any other arbitrary
+expression, much like InterWiki does.
+.sp
+A few example patterns (link to bug tracking, etc.) that may be used
+in your hgrc:
+.sp
+.nf
+.ft C
+[interhg]
+issues = s!issue(\ed+)!<a href="http://bts/issue\e1">issue\e1</a>!
+bugzilla = s!((?:bug|b=|(?=#?\ed{4,}))(?:\es*#?)(\ed+))!<a..=\e2">\e1</a>!i
+boldify = s!(^|\es)#(\ed+)\eb! <b>#\e2</b>!
+.ft P
+.fi
+.SS keyword
+.sp
+expand keywords in tracked files
+.sp
+This extension expands RCS/CVS\-like or self\-customized $Keywords$ in
+tracked text files selected by your configuration.
+.sp
+Keywords are only expanded in local repositories and not stored in the
+change history. The mechanism can be regarded as a convenience for the
+current user or for archive distribution.
+.sp
+Keywords expand to the changeset data pertaining to the latest change
+relative to the working directory parent of each file.
+.sp
+Configuration is done in the [keyword], [keywordset] and [keywordmaps]
+sections of hgrc files.
+.sp
+Example:
+.sp
+.nf
+.ft C
+[keyword]
+# expand keywords in every python file except those matching "x*"
+**.py =
+x* = ignore
+
+[keywordset]
+# prefer svn\- over cvs\-like default keywordmaps
+svn = True
+.ft P
+.fi
+.IP Note
+.
+The more specific you are in your filename patterns the less you
+lose speed in huge repositories.
+.RE
+.sp
+For [keywordmaps] template mapping and expansion demonstration and
+control run \%\fBhg kwdemo\fP\:. See \%\fBhg help templates\fP\: for a list of
+available templates and filters.
+.sp
+Three additional date template filters are provided:
+.INDENT 0.0
+.TP
+.B \fButcdate\fP
+.sp
+"2006/09/18 15:13:13"
+.TP
+.B \fBsvnutcdate\fP
+.sp
+"2006\-09\-18 15:13:13Z"
+.TP
+.B \fBsvnisodate\fP
+.sp
+"2006\-09\-18 08:13:13 \-700 (Mon, 18 Sep 2006)"
+.UNINDENT
+.sp
+The default template mappings (view with \%\fBhg kwdemo \-d\fP\:) can be
+replaced with customized keywords and templates. Again, run
+\%\fBhg kwdemo\fP\: to control the results of your configuration changes.
+.sp
+Before changing/disabling active keywords, you must run \%\fBhg kwshrink\fP\:
+to avoid storing expanded keywords in the change history.
+.sp
+To force expansion after enabling it, or a configuration change, run
+\%\fBhg kwexpand\fP\:.
+.sp
+Expansions spanning more than one line and incremental expansions,
+like CVS\(aq $Log$, are not supported. A keyword template map "Log =
+{desc}" expands to the first line of the changeset description.
+.SS Commands
+.SS kwdemo
+.sp
+.nf
+.ft C
+hg kwdemo [\-d] [\-f RCFILE] [TEMPLATEMAP]...
+.ft P
+.fi
+.sp
+Show current, custom, or default keyword template maps and their
+expansions.
+.sp
+Extend the current configuration by specifying maps as arguments
+and using \-f/\-\-rcfile to source an external hgrc file.
+.sp
+Use \-d/\-\-default to disable current configuration.
+.sp
+See \%\fBhg help templates\fP\: for information on templates and filters.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-d, \-\-default
+.
+show default keyword template maps
+.TP
+.B \-f, \-\-rcfile
+.
+read maps from rcfile
+.UNINDENT
+.SS kwexpand
+.sp
+.nf
+.ft C
+hg kwexpand [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Run after (re)enabling keyword expansion.
+.sp
+kwexpand refuses to run if given files contain local changes.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS kwfiles
+.sp
+.nf
+.ft C
+hg kwfiles [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+List which files in the working directory are matched by the
+[keyword] configuration patterns.
+.sp
+Useful to prevent inadvertent keyword expansion and to speed up
+execution by including only files that are actual candidates for
+expansion.
+.sp
+See \%\fBhg help keyword\fP\: on how to construct patterns both for
+inclusion and exclusion of files.
+.sp
+With \-A/\-\-all and \-v/\-\-verbose the codes used to show the status
+of files are:
+.sp
+.nf
+.ft C
+K = keyword expansion candidate
+k = keyword expansion candidate (not tracked)
+I = ignored
+i = ignored (not tracked)
+.ft P
+.fi
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-all
+.
+show keyword status flags of all files
+.TP
+.B \-i, \-\-ignore
+.
+show files excluded from expansion
+.TP
+.B \-u, \-\-unknown
+.
+only show unknown (not tracked) files
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS kwshrink
+.sp
+.nf
+.ft C
+hg kwshrink [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Must be run before changing/disabling active keywords.
+.sp
+kwshrink refuses to run if given files contain local changes.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS largefiles
+.sp
+track large binary files
+.sp
+Large binary files tend to be not very compressible, not very
+diffable, and not at all mergeable. Such files are not handled
+efficiently by Mercurial\(aqs storage format (revlog), which is based on
+compressed binary deltas; storing large binary files as regular
+Mercurial files wastes bandwidth and disk space and increases
+Mercurial\(aqs memory usage. The largefiles extension addresses these
+problems by adding a centralized client\-server layer on top of
+Mercurial: largefiles live in a \fIcentral store\fP out on the network
+somewhere, and you only fetch the revisions that you need when you
+need them.
+.sp
+largefiles works by maintaining a "standin file" in .hglf/ for each
+largefile. The standins are small (41 bytes: an SHA\-1 hash plus
+newline) and are tracked by Mercurial. Largefile revisions are
+identified by the SHA\-1 hash of their contents, which is written to
+the standin. largefiles uses that revision ID to get/put largefile
+revisions from/to the central store. This saves both disk space and
+bandwidth, since you don\(aqt need to retrieve all historical revisions
+of large files when you clone or pull.
+.sp
+To start a new repository or add new large binary files, just add
+\-\-large to your \%\fBhg add\fP\: command. For example:
+.sp
+.nf
+.ft C
+$ dd if=/dev/urandom of=randomdata count=2000
+$ hg add \-\-large randomdata
+$ hg commit \-m \(aqadd randomdata as a largefile\(aq
+.ft P
+.fi
+.sp
+When you push a changeset that adds/modifies largefiles to a remote
+repository, its largefile revisions will be uploaded along with it.
+Note that the remote Mercurial must also have the largefiles extension
+enabled for this to work.
+.sp
+When you pull a changeset that affects largefiles from a remote
+repository, Mercurial behaves as normal. However, when you update to
+such a revision, any largefiles needed by that revision are downloaded
+and cached (if they have never been downloaded before). This means
+that network access may be required to update to changesets you have
+not previously updated to.
+.sp
+If you already have large files tracked by Mercurial without the
+largefiles extension, you will need to convert your repository in
+order to benefit from largefiles. This is done with the
+\%\fBhg lfconvert\fP\: command:
+.sp
+.nf
+.ft C
+$ hg lfconvert \-\-size 10 oldrepo newrepo
+.ft P
+.fi
+.sp
+In repositories that already have largefiles in them, any new file
+over 10MB will automatically be added as a largefile. To change this
+threshold, set \fBlargefiles.minsize\fP in your Mercurial config file
+to the minimum size in megabytes to track as a largefile, or use the
+\-\-lfsize option to the add command (also in megabytes):
+.sp
+.nf
+.ft C
+[largefiles]
+minsize = 2
+
+$ hg add \-\-lfsize 2
+.ft P
+.fi
+.sp
+The \fBlargefiles.patterns\fP config option allows you to specify a list
+of filename patterns (see \%\fBhg help patterns\fP\:) that should always be
+tracked as largefiles:
+.sp
+.nf
+.ft C
+[largefiles]
+patterns =
+ *.jpg
+ re:.*\e.(png|bmp)$
+ library.zip
+ content/audio/*
+.ft P
+.fi
+.sp
+Files that match one of these patterns will be added as largefiles
+regardless of their size.
+.sp
+The \fBlargefiles.minsize\fP and \fBlargefiles.patterns\fP config options
+will be ignored for any repositories not already containing a
+largefile. To add the first largefile to a repository, you must
+explicitly do so with the \-\-large flag passed to the \%\fBhg add\fP\:
+command.
+.SS Commands
+.SS lfconvert
+.sp
+.nf
+.ft C
+hg lfconvert SOURCE DEST [FILE ...]
+.ft P
+.fi
+.sp
+Convert repository SOURCE to a new repository DEST, identical to
+SOURCE except that certain files will be converted as largefiles:
+specifically, any file that matches any PATTERN \fIor\fP whose size is
+above the minimum size threshold is converted as a largefile. The
+size used to determine whether or not to track a file as a
+largefile is the size of the first version of the file. The
+minimum size can be specified either with \-\-size or in
+configuration as \fBlargefiles.size\fP.
+.sp
+After running this command you will need to make sure that
+largefiles is enabled anywhere you intend to push the new
+repository.
+.sp
+Use \-\-to\-normal to convert largefiles back to normal files; after
+this, the DEST repository can be used without largefiles at all.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-size
+.
+minimum size (MB) for files to be converted as largefiles
+.TP
+.B \-\-to\-normal
+.
+convert from a largefiles repo to a normal repo
+.UNINDENT
+.SS mq
+.sp
+manage a stack of patches
+.sp
+This extension lets you work with a stack of patches in a Mercurial
+repository. It manages two stacks of patches \- all known patches, and
+applied patches (subset of known patches).
+.sp
+Known patches are represented as patch files in the .hg/patches
+directory. Applied patches are both patch files and changesets.
+.sp
+Common tasks (use \%\fBhg help command\fP\: for more details):
+.sp
+.nf
+.ft C
+create new patch qnew
+import existing patch qimport
+
+print patch series qseries
+print applied patches qapplied
+
+add known patch to applied stack qpush
+remove patch from applied stack qpop
+refresh contents of top applied patch qrefresh
+.ft P
+.fi
+.sp
+By default, mq will automatically use git patches when required to
+avoid losing file mode changes, copy records, binary files or empty
+files creations or deletions. This behaviour can be configured with:
+.sp
+.nf
+.ft C
+[mq]
+git = auto/keep/yes/no
+.ft P
+.fi
+.sp
+If set to \(aqkeep\(aq, mq will obey the [diff] section configuration while
+preserving existing git patches upon qrefresh. If set to \(aqyes\(aq or
+\(aqno\(aq, mq will override the [diff] section and always generate git or
+regular patches, possibly losing data in the second case.
+.sp
+It may be desirable for mq changesets to be kept in the secret phase (see
+\%\fBhg help phases\fP\:), which can be enabled with the following setting:
+.sp
+.nf
+.ft C
+[mq]
+secret = True
+.ft P
+.fi
+.sp
+You will by default be managing a patch queue named "patches". You can
+create other, independent patch queues with the \%\fBhg qqueue\fP\: command.
+.sp
+If the working directory contains uncommitted files, qpush, qpop and
+qgoto abort immediately. If \-f/\-\-force is used, the changes are
+discarded. Setting:
+.sp
+.nf
+.ft C
+[mq]
+keepchanges = True
+.ft P
+.fi
+.sp
+make them behave as if \-\-keep\-changes were passed, and non\-conflicting
+local changes will be tolerated and preserved. If incompatible options
+such as \-f/\-\-force or \-\-exact are passed, this setting is ignored.
+.SS Commands
+.SS qapplied
+.sp
+.nf
+.ft C
+hg qapplied [\-1] [\-s] [PATCH]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-1, \-\-last
+.
+show only the preceding applied patch
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS qclone
+.sp
+.nf
+.ft C
+hg qclone [OPTION]... SOURCE [DEST]
+.ft P
+.fi
+.sp
+If source is local, destination will have no patches applied. If
+source is remote, this command can not check if patches are
+applied in source, so cannot guarantee that patches are not
+applied in destination. If you clone remote repository, be sure
+before that it has no patches applied.
+.sp
+Source patch repository is looked for in <src>/.hg/patches by
+default. Use \-p <url> to change.
+.sp
+The patch directory must be a nested Mercurial repository, as
+would be created by \%\fBhg init \-\-mq\fP\:.
+.sp
+Return 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-pull
+.
+use pull protocol to copy metadata
+.TP
+.B \-U, \-\-noupdate
+.
+do not update the new working directories
+.TP
+.B \-\-uncompressed
+.
+use uncompressed transfer (fast over LAN)
+.TP
+.B \-p, \-\-patches
+.
+location of source patch repository
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS qcommit
+.sp
+.nf
+.ft C
+hg qcommit [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+This command is deprecated; use \%\fBhg commit \-\-mq\fP\: instead.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-addremove
+.
+mark new/missing files as added/removed before committing
+.TP
+.B \-\-close\-branch
+.
+mark a branch as closed, hiding it from the branch list
+.TP
+.B \-\-amend
+.
+amend the parent of the working dir
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.sp
+aliases: qci
+.UNINDENT
+.SS qdelete
+.sp
+.nf
+.ft C
+hg qdelete [\-k] [PATCH]...
+.ft P
+.fi
+.sp
+The patches must not be applied, and at least one patch is required. Exact
+patch identifiers must be given. With \-k/\-\-keep, the patch files are
+preserved in the patch directory.
+.sp
+To stop managing a patch and move it into permanent history,
+use the \%\fBhg qfinish\fP\: command.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-k, \-\-keep
+.
+keep patch file
+.TP
+.B \-r, \-\-rev
+.
+stop managing a revision (DEPRECATED)
+.sp
+aliases: qremove qrm
+.UNINDENT
+.SS qdiff
+.sp
+.nf
+.ft C
+hg qdiff [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+Shows a diff which includes the current patch as well as any
+changes which have been made in the working directory since the
+last refresh (thus showing what the current patch would become
+after a qrefresh).
+.sp
+Use \%\fBhg diff\fP\: if you only want to see the changes made since the
+last qrefresh, or \%\fBhg export qtip\fP\: if you want to see changes
+made by the current patch without including changes made since the
+qrefresh.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-text
+.
+treat all files as text
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-\-nodates
+.
+omit dates from diff headers
+.TP
+.B \-p, \-\-show\-function
+.
+show which function each change is in
+.TP
+.B \-\-reverse
+.
+produce a diff that undoes the changes
+.TP
+.B \-w, \-\-ignore\-all\-space
+.
+ignore white space when comparing lines
+.TP
+.B \-b, \-\-ignore\-space\-change
+.
+ignore changes in the amount of white space
+.TP
+.B \-B, \-\-ignore\-blank\-lines
+.
+ignore changes whose lines are all blank
+.TP
+.B \-U, \-\-unified
+.
+number of lines of context to show
+.TP
+.B \-\-stat
+.
+output diffstat\-style summary of changes
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.UNINDENT
+.SS qfinish
+.sp
+.nf
+.ft C
+hg qfinish [\-a] [REV]...
+.ft P
+.fi
+.sp
+Finishes the specified revisions (corresponding to applied
+patches) by moving them out of mq control into regular repository
+history.
+.sp
+Accepts a revision range or the \-a/\-\-applied option. If \-\-applied
+is specified, all applied mq revisions are removed from mq
+control. Otherwise, the given revisions must be at the base of the
+stack of applied patches.
+.sp
+This can be especially useful if your changes have been applied to
+an upstream repository, or if you are about to push your changes
+to upstream.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-applied
+.
+finish all applied changesets
+.UNINDENT
+.SS qfold
+.sp
+.nf
+.ft C
+hg qfold [\-e] [\-k] [\-m TEXT] [\-l FILE] PATCH...
+.ft P
+.fi
+.sp
+Patches must not yet be applied. Each patch will be successively
+applied to the current patch in the order given. If all the
+patches apply successfully, the current patch will be refreshed
+with the new cumulative patch, and the folded patches will be
+deleted. With \-k/\-\-keep, the folded patch files will not be
+removed afterwards.
+.sp
+The header for each folded patch will be concatenated with the
+current patch header, separated by a line of \fB* * *\fP.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-edit
+.
+edit patch header
+.TP
+.B \-k, \-\-keep
+.
+keep folded patch files
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.UNINDENT
+.SS qgoto
+.sp
+.nf
+.ft C
+hg qgoto [OPTION]... PATCH
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-keep\-changes
+.
+tolerate non\-conflicting local changes
+.TP
+.B \-f, \-\-force
+.
+overwrite any local changes
+.TP
+.B \-\-no\-backup
+.
+do not save backup copies of files
+.UNINDENT
+.SS qguard
+.sp
+.nf
+.ft C
+hg qguard [\-l] [\-n] [PATCH] [\-\- [+GUARD]... [\-GUARD]...]
+.ft P
+.fi
+.sp
+Guards control whether a patch can be pushed. A patch with no
+guards is always pushed. A patch with a positive guard ("+foo") is
+pushed only if the \%\fBhg qselect\fP\: command has activated it. A patch with
+a negative guard ("\-foo") is never pushed if the \%\fBhg qselect\fP\: command
+has activated it.
+.sp
+With no arguments, print the currently active guards.
+With arguments, set guards for the named patch.
+.IP Note
+.
+Specifying negative guards now requires \(aq\-\-\(aq.
+.RE
+.sp
+To set guards on another patch:
+.sp
+.nf
+.ft C
+hg qguard other.patch \-\- +2.6.17 \-stable
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-l, \-\-list
+.
+list all patches and guards
+.TP
+.B \-n, \-\-none
+.
+drop all guards
+.UNINDENT
+.SS qheader
+.sp
+.nf
+.ft C
+hg qheader [PATCH]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.SS qimport
+.sp
+.nf
+.ft C
+hg qimport [\-e] [\-n NAME] [\-f] [\-g] [\-P] [\-r REV]... [FILE]...
+.ft P
+.fi
+.sp
+The patch is inserted into the series after the last applied
+patch. If no patches have been applied, qimport prepends the patch
+to the series.
+.sp
+The patch will have the same name as its source file unless you
+give it a new one with \-n/\-\-name.
+.sp
+You can register an existing patch inside the patch directory with
+the \-e/\-\-existing flag.
+.sp
+With \-f/\-\-force, an existing patch of the same name will be
+overwritten.
+.sp
+An existing changeset may be placed under mq control with \-r/\-\-rev
+(e.g. qimport \-\-rev tip \-n patch will place tip under mq control).
+With \-g/\-\-git, patches imported with \-\-rev will use the git diff
+format. See the diffs help topic for information on why this is
+important for preserving rename/copy information and permission
+changes. Use \%\fBhg qfinish\fP\: to remove changesets from mq control.
+.sp
+To import a patch from standard input, pass \- as the patch file.
+When importing from standard input, a patch name must be specified
+using the \-\-name flag.
+.sp
+To import an existing patch while renaming it:
+.sp
+.nf
+.ft C
+hg qimport \-e existing\-patch \-n new\-name
+.ft P
+.fi
+.sp
+Returns 0 if import succeeded.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-existing
+.
+import file in patch directory
+.TP
+.B \-n, \-\-name
+.
+name of patch file
+.TP
+.B \-f, \-\-force
+.
+overwrite existing files
+.TP
+.B \-r, \-\-rev
+.
+place existing revisions under mq control
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-P, \-\-push
+.
+qpush after importing
+.UNINDENT
+.SS qinit
+.sp
+.nf
+.ft C
+hg qinit [\-c]
+.ft P
+.fi
+.sp
+The queue repository is unversioned by default. If
+\-c/\-\-create\-repo is specified, qinit will create a separate nested
+repository for patches (qinit \-c may also be run later to convert
+an unversioned patch repository into a versioned one). You can use
+qcommit to commit changes to this queue repository.
+.sp
+This command is deprecated. Without \-c, it\(aqs implied by other relevant
+commands. With \-c, use \%\fBhg init \-\-mq\fP\: instead.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-c, \-\-create\-repo
+.
+create queue repository
+.UNINDENT
+.SS qnew
+.sp
+.nf
+.ft C
+hg qnew [\-e] [\-m TEXT] [\-l FILE] PATCH [FILE]...
+.ft P
+.fi
+.sp
+qnew creates a new patch on top of the currently\-applied patch (if
+any). The patch will be initialized with any outstanding changes
+in the working directory. You may also use \-I/\-\-include,
+\-X/\-\-exclude, and/or a list of files after the patch name to add
+only changes to matching files to the new patch, leaving the rest
+as uncommitted modifications.
+.sp
+\-u/\-\-user and \-d/\-\-date can be used to set the (given) user and
+date, respectively. \-U/\-\-currentuser and \-D/\-\-currentdate set user
+to current user and date to current date.
+.sp
+\-e/\-\-edit, \-m/\-\-message or \-l/\-\-logfile set the patch header as
+well as the commit message. If none is specified, the header is
+empty and the commit message is \(aq[mq]: PATCH\(aq.
+.sp
+Use the \-g/\-\-git option to keep the patch in the git extended diff
+format. Read the diffs help topic for more information on why this
+is important for preserving permission changes and copy/rename
+information.
+.sp
+Returns 0 on successful creation of a new patch.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-edit
+.
+edit commit message
+.TP
+.B \-f, \-\-force
+.
+import uncommitted changes (DEPRECATED)
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-U, \-\-currentuser
+.
+add "From: <current user>" to patch
+.TP
+.B \-u, \-\-user
+.
+add "From: <USER>" to patch
+.TP
+.B \-D, \-\-currentdate
+.
+add "Date: <current date>" to patch
+.TP
+.B \-d, \-\-date
+.
+add "Date: <DATE>" to patch
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.UNINDENT
+.SS qnext
+.sp
+.nf
+.ft C
+hg qnext [\-s]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS qpop
+.sp
+.nf
+.ft C
+hg qpop [\-a] [\-f] [PATCH | INDEX]
+.ft P
+.fi
+.sp
+Without argument, pops off the top of the patch stack. If given a
+patch name, keeps popping off patches until the named patch is at
+the top of the stack.
+.sp
+By default, abort if the working directory contains uncommitted
+changes. With \-\-keep\-changes, abort only if the uncommitted files
+overlap with patched files. With \-f/\-\-force, backup and discard
+changes made to such files.
+.sp
+Return 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-all
+.
+pop all patches
+.TP
+.B \-n, \-\-name
+.
+queue name to pop (DEPRECATED)
+.TP
+.B \-\-keep\-changes
+.
+tolerate non\-conflicting local changes
+.TP
+.B \-f, \-\-force
+.
+forget any local changes to patched files
+.TP
+.B \-\-no\-backup
+.
+do not save backup copies of files
+.UNINDENT
+.SS qprev
+.sp
+.nf
+.ft C
+hg qprev [\-s]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS qpush
+.sp
+.nf
+.ft C
+hg qpush [\-f] [\-l] [\-a] [\-\-move] [PATCH | INDEX]
+.ft P
+.fi
+.sp
+By default, abort if the working directory contains uncommitted
+changes. With \-\-keep\-changes, abort only if the uncommitted files
+overlap with patched files. With \-f/\-\-force, backup and patch over
+uncommitted changes.
+.sp
+Return 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-\-keep\-changes
+.
+tolerate non\-conflicting local changes
+.TP
+.B \-f, \-\-force
+.
+apply on top of local changes
+.TP
+.B \-e, \-\-exact
+.
+apply the target patch to its recorded parent
+.TP
+.B \-l, \-\-list
+.
+list patch name in commit text
+.TP
+.B \-a, \-\-all
+.
+apply all patches
+.TP
+.B \-m, \-\-merge
+.
+merge from another queue (DEPRECATED)
+.TP
+.B \-n, \-\-name
+.
+merge queue name (DEPRECATED)
+.TP
+.B \-\-move
+.
+reorder patch series and apply only the patch
+.TP
+.B \-\-no\-backup
+.
+do not save backup copies of files
+.UNINDENT
+.SS qqueue
+.sp
+.nf
+.ft C
+hg qqueue [OPTION] [QUEUE]
+.ft P
+.fi
+.sp
+Supports switching between different patch queues, as well as creating
+new patch queues and deleting existing ones.
+.sp
+Omitting a queue name or specifying \-l/\-\-list will show you the registered
+queues \- by default the "normal" patches queue is registered. The currently
+active queue will be marked with "(active)". Specifying \-\-active will print
+only the name of the active queue.
+.sp
+To create a new queue, use \-c/\-\-create. The queue is automatically made
+active, except in the case where there are applied patches from the
+currently active queue in the repository. Then the queue will only be
+created and switching will fail.
+.sp
+To delete an existing queue, use \-\-delete. You cannot delete the currently
+active queue.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-l, \-\-list
+.
+list all available queues
+.TP
+.B \-\-active
+.
+print name of active queue
+.TP
+.B \-c, \-\-create
+.
+create new queue
+.TP
+.B \-\-rename
+.
+rename active queue
+.TP
+.B \-\-delete
+.
+delete reference to queue
+.TP
+.B \-\-purge
+.
+delete queue, and remove patch dir
+.UNINDENT
+.SS qrefresh
+.sp
+.nf
+.ft C
+hg qrefresh [\-I] [\-X] [\-e] [\-m TEXT] [\-l FILE] [\-s] [FILE]...
+.ft P
+.fi
+.sp
+If any file patterns are provided, the refreshed patch will
+contain only the modifications that match those patterns; the
+remaining modifications will remain in the working directory.
+.sp
+If \-s/\-\-short is specified, files currently included in the patch
+will be refreshed just like matched files and remain in the patch.
+.sp
+If \-e/\-\-edit is specified, Mercurial will start your configured editor for
+you to enter a message. In case qrefresh fails, you will find a backup of
+your message in \fB.hg/last\-message.txt\fP.
+.sp
+hg add/remove/copy/rename work as usual, though you might want to
+use git\-style patches (\-g/\-\-git or [diff] git=1) to track copies
+and renames. See the diffs help topic for more information on the
+git diff format.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-e, \-\-edit
+.
+edit commit message
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-s, \-\-short
+.
+refresh only files already in the patch and specified files
+.TP
+.B \-U, \-\-currentuser
+.
+add/update author field in patch with current user
+.TP
+.B \-u, \-\-user
+.
+add/update author field in patch with given user
+.TP
+.B \-D, \-\-currentdate
+.
+add/update date field in patch with current date
+.TP
+.B \-d, \-\-date
+.
+add/update date field in patch with given date
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.UNINDENT
+.SS qrename
+.sp
+.nf
+.ft C
+hg qrename PATCH1 [PATCH2]
+.ft P
+.fi
+.sp
+With one argument, renames the current patch to PATCH1.
+With two arguments, renames PATCH1 to PATCH2.
+.sp
+Returns 0 on success.
+.INDENT 0.0
+.INDENT 3.5
+.sp
+aliases: qmv
+.UNINDENT
+.UNINDENT
+.SS qrestore
+.sp
+.nf
+.ft C
+hg qrestore [\-d] [\-u] REV
+.ft P
+.fi
+.sp
+This command is deprecated, use \%\fBhg rebase\fP\: instead.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-d, \-\-delete
+.
+delete save entry
+.TP
+.B \-u, \-\-update
+.
+update queue working directory
+.UNINDENT
+.SS qsave
+.sp
+.nf
+.ft C
+hg qsave [\-m TEXT] [\-l FILE] [\-c] [\-n NAME] [\-e] [\-f]
+.ft P
+.fi
+.sp
+This command is deprecated, use \%\fBhg rebase\fP\: instead.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-c, \-\-copy
+.
+copy patch directory
+.TP
+.B \-n, \-\-name
+.
+copy directory name
+.TP
+.B \-e, \-\-empty
+.
+clear queue status file
+.TP
+.B \-f, \-\-force
+.
+force copy
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.UNINDENT
+.SS qselect
+.sp
+.nf
+.ft C
+hg qselect [OPTION]... [GUARD]...
+.ft P
+.fi
+.sp
+Use the \%\fBhg qguard\fP\: command to set or print guards on patch, then use
+qselect to tell mq which guards to use. A patch will be pushed if
+it has no guards or any positive guards match the currently
+selected guard, but will not be pushed if any negative guards
+match the current guard. For example:
+.sp
+.nf
+.ft C
+qguard foo.patch \-\- \-stable (negative guard)
+qguard bar.patch +stable (positive guard)
+qselect stable
+.ft P
+.fi
+.sp
+This activates the "stable" guard. mq will skip foo.patch (because
+it has a negative match) but push bar.patch (because it has a
+positive match).
+.sp
+With no arguments, prints the currently active guards.
+With one argument, sets the active guard.
+.sp
+Use \-n/\-\-none to deactivate guards (no other arguments needed).
+When no guards are active, patches with positive guards are
+skipped and patches with negative guards are pushed.
+.sp
+qselect can change the guards on applied patches. It does not pop
+guarded patches by default. Use \-\-pop to pop back to the last
+applied patch that is not guarded. Use \-\-reapply (which implies
+\-\-pop) to push back to the current patch afterwards, but skip
+guarded patches.
+.sp
+Use \-s/\-\-series to print a list of all guards in the series file
+(no other arguments needed). Use \-v for more information.
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-n, \-\-none
+.
+disable all guards
+.TP
+.B \-s, \-\-series
+.
+list all guards in series file
+.TP
+.B \-\-pop
+.
+pop to before first guarded applied patch
+.TP
+.B \-\-reapply
+.
+pop, then reapply patches
+.UNINDENT
+.SS qseries
+.sp
+.nf
+.ft C
+hg qseries [\-ms]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-m, \-\-missing
+.
+print patches not in series
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS qtop
+.sp
+.nf
+.ft C
+hg qtop [\-s]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS qunapplied
+.sp
+.nf
+.ft C
+hg qunapplied [\-1] [\-s] [PATCH]
+.ft P
+.fi
+.sp
+Returns 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-1, \-\-first
+.
+show only the first patch
+.TP
+.B \-s, \-\-summary
+.
+print first line of patch header
+.UNINDENT
+.SS strip
+.sp
+.nf
+.ft C
+hg strip [\-k] [\-f] [\-n] [\-B bookmark] [\-r] REV...
+.ft P
+.fi
+.sp
+The strip command removes the specified changesets and all their
+descendants. If the working directory has uncommitted changes, the
+operation is aborted unless the \-\-force flag is supplied, in which
+case changes will be discarded.
+.sp
+If a parent of the working directory is stripped, then the working
+directory will automatically be updated to the most recent
+available ancestor of the stripped parent after the operation
+completes.
+.sp
+Any stripped changesets are stored in \fB.hg/strip\-backup\fP as a
+bundle (see \%\fBhg help bundle\fP\: and \%\fBhg help unbundle\fP\:). They can
+be restored by running \%\fBhg unbundle .hg/strip\-backup/BUNDLE\fP\:,
+where BUNDLE is the bundle file created by the strip. Note that
+the local revision numbers will in general be different after the
+restore.
+.sp
+Use the \-\-no\-backup option to discard the backup bundle once the
+operation completes.
+.sp
+Strip is not a history\-rewriting operation and can be used on
+changesets in the public phase. But if the stripped changesets have
+been pushed to a remote repository you will likely pull them again.
+.sp
+Return 0 on success.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-r, \-\-rev
+.
+strip specified revision (optional, can specify revisions without this option)
+.TP
+.B \-f, \-\-force
+.
+force removal of changesets, discard uncommitted changes (no backup)
+.TP
+.B \-b, \-\-backup
+.
+bundle only changesets with local revision number greater than REV which are not descendants of REV (DEPRECATED)
+.TP
+.B \-\-no\-backup
+.
+no backups
+.TP
+.B \-\-nobackup
+.
+no backups (DEPRECATED)
+.TP
+.B \-n
+.
+ignored (DEPRECATED)
+.TP
+.B \-k, \-\-keep
+.
+do not modify working copy during strip
+.TP
+.B \-B, \-\-bookmark
+.
+remove revs only reachable from given bookmark
+.UNINDENT
+.SS notify
+.sp
+hooks for sending email push notifications
+.sp
+This extension implements hooks to send email notifications when
+changesets are sent from or received by the local repository.
+.sp
+First, enable the extension as explained in \%\fBhg help extensions\fP\:, and
+register the hook you want to run. \fBincoming\fP and \fBchangegroup\fP hooks
+are run when changesets are received, while \fBoutgoing\fP hooks are for
+changesets sent to another repository:
+.sp
+.nf
+.ft C
+[hooks]
+# one email for each incoming changeset
+incoming.notify = python:hgext.notify.hook
+# one email for all incoming changesets
+changegroup.notify = python:hgext.notify.hook
+
+# one email for all outgoing changesets
+outgoing.notify = python:hgext.notify.hook
+.ft P
+.fi
+.sp
+This registers the hooks. To enable notification, subscribers must
+be assigned to repositories. The \fB[usersubs]\fP section maps multiple
+repositories to a given recipient. The \fB[reposubs]\fP section maps
+multiple recipients to a single repository:
+.sp
+.nf
+.ft C
+[usersubs]
+# key is subscriber email, value is a comma\-separated list of repo glob
+# patterns
+user@host = pattern
+
+[reposubs]
+# key is glob pattern, value is a comma\-separated list of subscriber
+# emails
+pattern = user@host
+.ft P
+.fi
+.sp
+Glob patterns are matched against absolute path to repository
+root.
+.sp
+In order to place them under direct user management, \fB[usersubs]\fP and
+\fB[reposubs]\fP sections may be placed in a separate \fBhgrc\fP file and
+incorporated by reference:
+.sp
+.nf
+.ft C
+[notify]
+config = /path/to/subscriptionsfile
+.ft P
+.fi
+.sp
+Notifications will not be sent until the \fBnotify.test\fP value is set
+to \fBFalse\fP; see below.
+.sp
+Notifications content can be tweaked with the following configuration entries:
+.INDENT 0.0
+.TP
+.B notify.test
+.
+If \fBTrue\fP, print messages to stdout instead of sending them. Default: True.
+.TP
+.B notify.sources
+.
+Space\-separated list of change sources. Notifications are activated only
+when a changeset\(aqs source is in this list. Sources may be:
+.INDENT 7.0
+.TP
+.B \fBserve\fP
+.sp
+changesets received via http or ssh
+.TP
+.B \fBpull\fP
+.sp
+changesets received via \fBhg pull\fP
+.TP
+.B \fBunbundle\fP
+.sp
+changesets received via \fBhg unbundle\fP
+.TP
+.B \fBpush\fP
+.sp
+changesets sent or received via \fBhg push\fP
+.TP
+.B \fBbundle\fP
+.sp
+changesets sent via \fBhg unbundle\fP
+.UNINDENT
+.sp
+Default: serve.
+.TP
+.B notify.strip
+.
+Number of leading slashes to strip from url paths. By default, notifications
+reference repositories with their absolute path. \fBnotify.strip\fP lets you
+turn them into relative paths. For example, \fBnotify.strip=3\fP will change
+\fB/long/path/repository\fP into \fBrepository\fP. Default: 0.
+.TP
+.B notify.domain
+.
+Default email domain for sender or recipients with no explicit domain.
+.TP
+.B notify.style
+.
+Style file to use when formatting emails.
+.TP
+.B notify.template
+.
+Template to use when formatting emails.
+.TP
+.B notify.incoming
+.
+Template to use when run as an incoming hook, overriding \fBnotify.template\fP.
+.TP
+.B notify.outgoing
+.
+Template to use when run as an outgoing hook, overriding \fBnotify.template\fP.
+.TP
+.B notify.changegroup
+.
+Template to use when running as a changegroup hook, overriding
+\fBnotify.template\fP.
+.TP
+.B notify.maxdiff
+.
+Maximum number of diff lines to include in notification email. Set to 0
+to disable the diff, or \-1 to include all of it. Default: 300.
+.TP
+.B notify.maxsubject
+.
+Maximum number of characters in email\(aqs subject line. Default: 67.
+.TP
+.B notify.diffstat
+.
+Set to True to include a diffstat before diff content. Default: True.
+.TP
+.B notify.merge
+.
+If True, send notifications for merge changesets. Default: True.
+.TP
+.B notify.mbox
+.
+If set, append mails to this mbox file instead of sending. Default: None.
+.TP
+.B notify.fromauthor
+.
+If set, use the committer of the first changeset in a changegroup for
+the "From" field of the notification mail. If not set, take the user
+from the pushing repo. Default: False.
+.UNINDENT
+.sp
+If set, the following entries will also be used to customize the
+notifications:
+.INDENT 0.0
+.TP
+.B email.from
+.
+Email \fBFrom\fP address to use if none can be found in the generated
+email content.
+.TP
+.B web.baseurl
+.
+Root repository URL to combine with repository paths when making
+references. See also \fBnotify.strip\fP.
+.UNINDENT
+.SS pager
+.sp
+browse command output with an external pager
+.sp
+To set the pager that should be used, set the application variable:
+.sp
+.nf
+.ft C
+[pager]
+pager = less \-FRX
+.ft P
+.fi
+.sp
+If no pager is set, the pager extensions uses the environment variable
+$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used.
+.sp
+You can disable the pager for certain commands by adding them to the
+pager.ignore list:
+.sp
+.nf
+.ft C
+[pager]
+ignore = version, help, update
+.ft P
+.fi
+.sp
+You can also enable the pager only for certain commands using
+pager.attend. Below is the default list of commands to be paged:
+.sp
+.nf
+.ft C
+[pager]
+attend = annotate, cat, diff, export, glog, log, qdiff
+.ft P
+.fi
+.sp
+Setting pager.attend to an empty value will cause all commands to be
+paged.
+.sp
+If pager.attend is present, pager.ignore will be ignored.
+.sp
+To ignore global commands like \%\fBhg version\fP\: or \%\fBhg help\fP\:, you have
+to specify them in your user configuration file.
+.sp
+The \-\-pager=... option can also be used to control when the pager is
+used. Use a boolean value like yes, no, on, off, or use auto for
+normal behavior.
+.SS patchbomb
+.sp
+command to send changesets as (a series of) patch emails
+.sp
+The series is started off with a "[PATCH 0 of N]" introduction, which
+describes the series as a whole.
+.sp
+Each patch email has a Subject line of "[PATCH M of N] ...", using the
+first line of the changeset description as the subject text. The
+message contains two or three body parts:
+.INDENT 0.0
+.IP \(bu 2
+.
+The changeset description.
+.IP \(bu 2
+.
+[Optional] The result of running diffstat on the patch.
+.IP \(bu 2
+.
+The patch itself, as generated by \%\fBhg export\fP\:.
+.UNINDENT
+.sp
+Each message refers to the first in the series using the In\-Reply\-To
+and References headers, so they will show up as a sequence in threaded
+mail and news readers, and in mail archives.
+.sp
+To configure other defaults, add a section like this to your
+configuration file:
+.sp
+.nf
+.ft C
+[email]
+from = My Name <my@email>
+to = recipient1, recipient2, ...
+cc = cc1, cc2, ...
+bcc = bcc1, bcc2, ...
+reply\-to = address1, address2, ...
+.ft P
+.fi
+.sp
+Use \fB[patchbomb]\fP as configuration section name if you need to
+override global \fB[email]\fP address settings.
+.sp
+Then you can use the \%\fBhg email\fP\: command to mail a series of
+changesets as a patchbomb.
+.sp
+You can also either configure the method option in the email section
+to be a sendmail compatible mailer or fill out the [smtp] section so
+that the patchbomb extension can automatically send patchbombs
+directly from the commandline. See the [email] and [smtp] sections in
+hgrc(5) for details.
+.SS Commands
+.SS email
+.sp
+.nf
+.ft C
+hg email [OPTION]... [DEST]...
+.ft P
+.fi
+.sp
+By default, diffs are sent in the format generated by
+\%\fBhg export\fP\:, one per message. The series starts with a "[PATCH 0
+of N]" introduction, which describes the series as a whole.
+.sp
+Each patch email has a Subject line of "[PATCH M of N] ...", using
+the first line of the changeset description as the subject text.
+The message contains two or three parts. First, the changeset
+description.
+.sp
+With the \-d/\-\-diffstat option, if the diffstat program is
+installed, the result of running diffstat on the patch is inserted.
+.sp
+Finally, the patch itself, as generated by \%\fBhg export\fP\:.
+.sp
+With the \-d/\-\-diffstat or \-c/\-\-confirm options, you will be presented
+with a final summary of all messages and asked for confirmation before
+the messages are sent.
+.sp
+By default the patch is included as text in the email body for
+easy reviewing. Using the \-a/\-\-attach option will instead create
+an attachment for the patch. With \-i/\-\-inline an inline attachment
+will be created. You can include a patch both as text in the email
+body and as a regular or an inline attachment by combining the
+\-a/\-\-attach or \-i/\-\-inline with the \-\-body option.
+.sp
+With \-o/\-\-outgoing, emails will be generated for patches not found
+in the destination repository (or only those which are ancestors
+of the specified revisions if any are provided)
+.sp
+With \-b/\-\-bundle, changesets are selected as for \-\-outgoing, but a
+single email containing a binary Mercurial bundle as an attachment
+will be sent.
+.sp
+With \-m/\-\-mbox, instead of previewing each patchbomb message in a
+pager or sending the messages directly, it will create a UNIX
+mailbox file with the patch emails. This mailbox file can be
+previewed with any mail user agent which supports UNIX mbox
+files.
+.sp
+With \-n/\-\-test, all steps will run, but mail will not be sent.
+You will be prompted for an email recipient address, a subject and
+an introductory message describing the patches of your patchbomb.
+Then when all is done, patchbomb messages are displayed. If the
+PAGER environment variable is set, your pager will be fired up once
+for each patchbomb message, so you can verify everything is alright.
+.sp
+In case email sending fails, you will find a backup of your series
+introductory message in \fB.hg/last\-email.txt\fP.
+.sp
+Examples:
+.sp
+.nf
+.ft C
+hg email \-r 3000 # send patch 3000 only
+hg email \-r 3000 \-r 3001 # send patches 3000 and 3001
+hg email \-r 3000:3005 # send patches 3000 through 3005
+hg email 3000 # send patch 3000 (deprecated)
+
+hg email \-o # send all patches not in default
+hg email \-o DEST # send all patches not in DEST
+hg email \-o \-r 3000 # send all ancestors of 3000 not in default
+hg email \-o \-r 3000 DEST # send all ancestors of 3000 not in DEST
+
+hg email \-b # send bundle of all patches not in default
+hg email \-b DEST # send bundle of all patches not in DEST
+hg email \-b \-r 3000 # bundle of all ancestors of 3000 not in default
+hg email \-b \-r 3000 DEST # bundle of all ancestors of 3000 not in DEST
+
+hg email \-o \-m mbox && # generate an mbox file...
+ mutt \-R \-f mbox # ... and view it with mutt
+hg email \-o \-m mbox && # generate an mbox file ...
+ formail \-s sendmail \e # ... and use formail to send from the mbox
+ \-bm \-t < mbox # ... using sendmail
+.ft P
+.fi
+.sp
+Before using this command, you will need to enable email in your
+hgrc. See the [email] section in hgrc(5) for details.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-g, \-\-git
+.
+use git extended diff format
+.TP
+.B \-\-plain
+.
+omit hg patch header
+.TP
+.B \-o, \-\-outgoing
+.
+send changes not found in the target repository
+.TP
+.B \-b, \-\-bundle
+.
+send changes not in target as a binary bundle
+.TP
+.B \-\-bundlename
+.
+name of the bundle attachment file (default: bundle)
+.TP
+.B \-r, \-\-rev
+.
+a revision to send
+.TP
+.B \-\-force
+.
+run even when remote repository is unrelated (with \-b/\-\-bundle)
+.TP
+.B \-\-base
+.
+a base changeset to specify instead of a destination (with \-b/\-\-bundle)
+.TP
+.B \-\-intro
+.
+send an introduction email for a single patch
+.TP
+.B \-\-body
+.
+send patches as inline message text (default)
+.TP
+.B \-a, \-\-attach
+.
+send patches as attachments
+.TP
+.B \-i, \-\-inline
+.
+send patches as inline attachments
+.TP
+.B \-\-bcc
+.
+email addresses of blind carbon copy recipients
+.TP
+.B \-c, \-\-cc
+.
+email addresses of copy recipients
+.TP
+.B \-\-confirm
+.
+ask for confirmation before sending
+.TP
+.B \-d, \-\-diffstat
+.
+add diffstat output to messages
+.TP
+.B \-\-date
+.
+use the given date as the sending date
+.TP
+.B \-\-desc
+.
+use the given file as the series description
+.TP
+.B \-f, \-\-from
+.
+email address of sender
+.TP
+.B \-n, \-\-test
+.
+print messages that would be sent
+.TP
+.B \-m, \-\-mbox
+.
+write messages to mbox file instead of sending them
+.TP
+.B \-\-reply\-to
+.
+email addresses replies should be sent to
+.TP
+.B \-s, \-\-subject
+.
+subject of first message (intro or single patch)
+.TP
+.B \-\-in\-reply\-to
+.
+message identifier to reply to
+.TP
+.B \-\-flag
+.
+flags to add in subject prefixes
+.TP
+.B \-t, \-\-to
+.
+email addresses of recipients
+.TP
+.B \-e, \-\-ssh
+.
+specify ssh command to use
+.TP
+.B \-\-remotecmd
+.
+specify hg command to run on the remote side
+.TP
+.B \-\-insecure
+.
+do not verify server certificate (ignoring web.cacerts config)
+.UNINDENT
+.SS progress
+.sp
+show progress bars for some actions
+.sp
+This extension uses the progress information logged by hg commands
+to draw progress bars that are as informative as possible. Some progress
+bars only offer indeterminate information, while others have a definite
+end point.
+.sp
+The following settings are available:
+.sp
+.nf
+.ft C
+[progress]
+delay = 3 # number of seconds (float) before showing the progress bar
+changedelay = 1 # changedelay: minimum delay before showing a new topic.
+ # If set to less than 3 * refresh, that value will
+ # be used instead.
+refresh = 0.1 # time in seconds between refreshes of the progress bar
+format = topic bar number estimate # format of the progress bar
+width = <none> # if set, the maximum width of the progress information
+ # (that is, min(width, term width) will be used)
+clear\-complete = True # clear the progress bar after it\(aqs done
+disable = False # if true, don\(aqt show a progress bar
+assume\-tty = False # if true, ALWAYS show a progress bar, unless
+ # disable is given
+.ft P
+.fi
+.sp
+Valid entries for the format field are topic, bar, number, unit,
+estimate, speed, and item. item defaults to the last 20 characters of
+the item, but this can be changed by adding either \fB\-<num>\fP which
+would take the last num characters, or \fB+<num>\fP for the first num
+characters.
+.SS purge
+.sp
+command to delete untracked files from the working directory
+.SS Commands
+.SS purge
+.sp
+.nf
+.ft C
+hg purge [OPTION]... [DIR]...
+.ft P
+.fi
+.sp
+Delete files not known to Mercurial. This is useful to test local
+and uncommitted changes in an otherwise\-clean source tree.
+.sp
+This means that purge will delete:
+.INDENT 0.0
+.IP \(bu 2
+.
+Unknown files: files marked with "?" by \%\fBhg status\fP\:
+.IP \(bu 2
+.
+Empty directories: in fact Mercurial ignores directories unless
+they contain files under source control management
+.UNINDENT
+.sp
+But it will leave untouched:
+.INDENT 0.0
+.IP \(bu 2
+.
+Modified and unmodified tracked files
+.IP \(bu 2
+.
+Ignored files (unless \-\-all is specified)
+.IP \(bu 2
+.
+New files added to the repository (with \%\fBhg add\fP\:)
+.UNINDENT
+.sp
+If directories are given on the command line, only files in these
+directories are considered.
+.sp
+Be careful with purge, as you could irreversibly delete some files
+you forgot to add to the repository. If you only want to print the
+list of files that this program would delete, use the \-\-print
+option.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-a, \-\-abort\-on\-err
+.
+abort if an error occurs
+.TP
+.B \-\-all
+.
+purge ignored files too
+.TP
+.B \-p, \-\-print
+.
+print filenames instead of deleting them
+.TP
+.B \-0, \-\-print0
+.
+end filenames with NUL, for use with xargs (implies \-p/\-\-print)
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.sp
+aliases: clean
+.UNINDENT
+.SS rebase
+.sp
+command to move sets of revisions to a different ancestor
+.sp
+This extension lets you rebase changesets in an existing Mercurial
+repository.
+.sp
+For more information:
+\%http://mercurial.selenic.com/wiki/RebaseExtension\:
+.SS Commands
+.SS rebase
+.sp
+.nf
+.ft C
+hg rebase [\-s REV | \-b REV] [\-d REV] [OPTION]
+.ft P
+.fi
+.sp
+Rebase uses repeated merging to graft changesets from one part of
+history (the source) onto another (the destination). This can be
+useful for linearizing \fIlocal\fP changes relative to a master
+development tree.
+.sp
+You should not rebase changesets that have already been shared
+with others. Doing so will force everybody else to perform the
+same rebase or they will end up with duplicated changesets after
+pulling in your rebased changesets.
+.sp
+If you don\(aqt specify a destination changeset (\fB\-d/\-\-dest\fP),
+rebase uses the tipmost head of the current named branch as the
+destination. (The destination changeset is not modified by
+rebasing, but new changesets are added as its descendants.)
+.sp
+You can specify which changesets to rebase in two ways: as a
+"source" changeset or as a "base" changeset. Both are shorthand
+for a topologically related set of changesets (the "source
+branch"). If you specify source (\fB\-s/\-\-source\fP), rebase will
+rebase that changeset and all of its descendants onto dest. If you
+specify base (\fB\-b/\-\-base\fP), rebase will select ancestors of base
+back to but not including the common ancestor with dest. Thus,
+\fB\-b\fP is less precise but more convenient than \fB\-s\fP: you can
+specify any changeset in the source branch, and rebase will select
+the whole branch. If you specify neither \fB\-s\fP nor \fB\-b\fP, rebase
+uses the parent of the working directory as the base.
+.sp
+By default, rebase recreates the changesets in the source branch
+as descendants of dest and then destroys the originals. Use
+\fB\-\-keep\fP to preserve the original source changesets. Some
+changesets in the source branch (e.g. merges from the destination
+branch) may be dropped if they no longer contribute any change.
+.sp
+One result of the rules for selecting the destination changeset
+and source branch is that, unlike \fBmerge\fP, rebase will do
+nothing if you are at the latest (tipmost) head of a named branch
+with two heads. You need to explicitly specify source and/or
+destination (or \fBupdate\fP to the other head, if it\(aqs the head of
+the intended source branch).
+.sp
+If a rebase is interrupted to manually resolve a merge, it can be
+continued with \-\-continue/\-c or aborted with \-\-abort/\-a.
+.sp
+Returns 0 on success, 1 if nothing to rebase.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-source
+.
+rebase from the specified changeset
+.TP
+.B \-b, \-\-base
+.
+rebase from the base of the specified changeset (up to greatest common ancestor of base and dest)
+.TP
+.B \-r, \-\-rev
+.
+rebase these revisions
+.TP
+.B \-d, \-\-dest
+.
+rebase onto the specified changeset
+.TP
+.B \-\-collapse
+.
+collapse the rebased changesets
+.TP
+.B \-m, \-\-message
+.
+use text as collapse commit message
+.TP
+.B \-e, \-\-edit
+.
+invoke editor on commit messages
+.TP
+.B \-l, \-\-logfile
+.
+read collapse commit message from file
+.TP
+.B \-\-keep
+.
+keep original changesets
+.TP
+.B \-\-keepbranches
+.
+keep original branch names
+.TP
+.B \-D, \-\-detach
+.
+(DEPRECATED)
+.TP
+.B \-t, \-\-tool
+.
+specify merge tool
+.TP
+.B \-c, \-\-continue
+.
+continue an interrupted rebase
+.TP
+.B \-a, \-\-abort
+.
+abort an interrupted rebase
+.TP
+.B \-\-style
+.
+display using template map file
+.TP
+.B \-\-template
+.
+display with template
+.UNINDENT
+.SS record
+.sp
+commands to interactively select changes for commit/qrefresh
+.SS Commands
+.SS qrecord
+.sp
+.nf
+.ft C
+hg qrecord [OPTION]... PATCH [FILE]...
+.ft P
+.fi
+.sp
+See \%\fBhg help qnew\fP\: & \%\fBhg help record\fP\: for more information and
+usage.
+.SS record
+.sp
+.nf
+.ft C
+hg record [OPTION]... [FILE]...
+.ft P
+.fi
+.sp
+If a list of files is omitted, all changes reported by \%\fBhg status\fP\:
+will be candidates for recording.
+.sp
+See \%\fBhg help dates\fP\: for a list of formats valid for \-d/\-\-date.
+.sp
+You will be prompted for whether to record changes to each
+modified file, and for files with multiple changes, for each
+change to use. For each query, the following responses are
+possible:
+.sp
+.nf
+.ft C
+y \- record this change
+n \- skip this change
+e \- edit this change manually
+
+s \- skip remaining changes to this file
+f \- record remaining changes to this file
+
+d \- done, skip remaining changes and files
+a \- record all changes to all remaining files
+q \- quit, recording no changes
+
+? \- display help
+.ft P
+.fi
+.sp
+This command is not available when committing a merge.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-A, \-\-addremove
+.
+mark new/missing files as added/removed before committing
+.TP
+.B \-\-close\-branch
+.
+mark a branch as closed, hiding it from the branch list
+.TP
+.B \-\-amend
+.
+amend the parent of the working dir
+.TP
+.B \-I, \-\-include
+.
+include names matching the given patterns
+.TP
+.B \-X, \-\-exclude
+.
+exclude names matching the given patterns
+.TP
+.B \-m, \-\-message
+.
+use text as commit message
+.TP
+.B \-l, \-\-logfile
+.
+read commit message from file
+.TP
+.B \-d, \-\-date
+.
+record the specified date as commit date
+.TP
+.B \-u, \-\-user
+.
+record the specified user as committer
+.TP
+.B \-S, \-\-subrepos
+.
+recurse into subrepositories
+.TP
+.B \-w, \-\-ignore\-all\-space
+.
+ignore white space when comparing lines
+.TP
+.B \-b, \-\-ignore\-space\-change
+.
+ignore changes in the amount of white space
+.TP
+.B \-B, \-\-ignore\-blank\-lines
+.
+ignore changes whose lines are all blank
+.UNINDENT
+.SS relink
+.sp
+recreates hardlinks between repository clones
+.SS Commands
+.SS relink
+.sp
+.nf
+.ft C
+hg relink [ORIGIN]
+.ft P
+.fi
+.sp
+When repositories are cloned locally, their data files will be
+hardlinked so that they only use the space of a single repository.
+.sp
+Unfortunately, subsequent pulls into either repository will break
+hardlinks for any files touched by the new changesets, even if
+both repositories end up pulling the same changes.
+.sp
+Similarly, passing \-\-rev to "hg clone" will fail to use any
+hardlinks, falling back to a complete copy of the source
+repository.
+.sp
+This command lets you recreate those hardlinks and reclaim that
+wasted space.
+.sp
+This repository will be relinked to share space with ORIGIN, which
+must be on the same local disk. If ORIGIN is omitted, looks for
+"default\-relink", then "default", in [paths].
+.sp
+Do not attempt any read operations on this repository while the
+command is running. (Both repositories will be locked against
+writes.)
+.SS schemes
+.sp
+extend schemes with shortcuts to repository swarms
+.sp
+This extension allows you to specify shortcuts for parent URLs with a
+lot of repositories to act like a scheme, for example:
+.sp
+.nf
+.ft C
+[schemes]
+py = http://code.python.org/hg/
+.ft P
+.fi
+.sp
+After that you can use it like:
+.sp
+.nf
+.ft C
+hg clone py://trunk/
+.ft P
+.fi
+.sp
+Additionally there is support for some more complex schemas, for
+example used by Google Code:
+.sp
+.nf
+.ft C
+[schemes]
+gcode = http://{1}.googlecode.com/hg/
+.ft P
+.fi
+.sp
+The syntax is taken from Mercurial templates, and you have unlimited
+number of variables, starting with \fB{1}\fP and continuing with
+\fB{2}\fP, \fB{3}\fP and so on. This variables will receive parts of URL
+supplied, split by \fB/\fP. Anything not specified as \fB{part}\fP will be
+just appended to an URL.
+.sp
+For convenience, the extension adds these schemes by default:
+.sp
+.nf
+.ft C
+[schemes]
+py = http://hg.python.org/
+bb = https://bitbucket.org/
+bb+ssh = ssh://hg@bitbucket.org/
+gcode = https://{1}.googlecode.com/hg/
+kiln = https://{1}.kilnhg.com/Repo/
+.ft P
+.fi
+.sp
+You can override a predefined scheme by defining a new scheme with the
+same name.
+.SS share
+.sp
+share a common history between several working directories
+.SS Commands
+.SS share
+.sp
+.nf
+.ft C
+hg share [\-U] SOURCE [DEST]
+.ft P
+.fi
+.sp
+Initialize a new repository and working directory that shares its
+history with another repository.
+.IP Note
+.
+using rollback or extensions that destroy/modify history (mq,
+rebase, etc.) can cause considerable confusion with shared
+clones. In particular, if two shared clones are both updated to
+the same changeset, and one of them destroys that changeset
+with rollback, the other clone will suddenly stop working: all
+operations will fail with "abort: working directory has unknown
+parent". The only known workaround is to use debugsetparents on
+the broken clone to reset it to a changeset that still exists
+(e.g. tip).
+.RE
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-U, \-\-noupdate
+.
+do not create a working copy
+.UNINDENT
+.SS unshare
+.sp
+.nf
+.ft C
+hg unshare
+.ft P
+.fi
+.sp
+Copy the store data to the repo and remove the sharedpath data.
+.SS transplant
+.sp
+command to transplant changesets from another branch
+.sp
+This extension allows you to transplant patches from another branch.
+.sp
+Transplanted patches are recorded in .hg/transplant/transplants, as a
+map from a changeset hash to its hash in the source repository.
+.SS Commands
+.SS transplant
+.sp
+.nf
+.ft C
+hg transplant [\-s REPO] [\-b BRANCH [\-a]] [\-p REV] [\-m REV] [REV]...
+.ft P
+.fi
+.sp
+Selected changesets will be applied on top of the current working
+directory with the log of the original changeset. The changesets
+are copied and will thus appear twice in the history. Use the
+rebase extension instead if you want to move a whole branch of
+unpublished changesets.
+.sp
+If \-\-log is specified, log messages will have a comment appended
+of the form:
+.sp
+.nf
+.ft C
+(transplanted from CHANGESETHASH)
+.ft P
+.fi
+.sp
+You can rewrite the changelog message with the \-\-filter option.
+Its argument will be invoked with the current changelog message as
+$1 and the patch as $2.
+.sp
+If \-\-source/\-s is specified, selects changesets from the named
+repository. If \-\-branch/\-b is specified, selects changesets from
+the branch holding the named revision, up to that revision. If
+\-\-all/\-a is specified, all changesets on the branch will be
+transplanted, otherwise you will be prompted to select the
+changesets you want.
+.sp
+\%\fBhg transplant \-\-branch REV \-\-all\fP\: will transplant the
+selected branch (up to the named revision) onto your current
+working directory.
+.sp
+You can optionally mark selected transplanted changesets as merge
+changesets. You will not be prompted to transplant any ancestors
+of a merged transplant, and you can merge descendants of them
+normally instead of transplanting them.
+.sp
+Merge changesets may be transplanted directly by specifying the
+proper parent changeset by calling \%\fBhg transplant \-\-parent\fP\:.
+.sp
+If no merges or revisions are provided, \%\fBhg transplant\fP\: will
+start an interactive changeset browser.
+.sp
+If a changeset application fails, you can fix the merge by hand
+and then resume where you left off by calling \%\fBhg transplant
+\-\-continue/\-c\fP\:.
+.sp
+Options:
+.INDENT 0.0
+.TP
+.B \-s, \-\-source
+.
+pull patches from REPO
+.TP
+.B \-b, \-\-branch
+.
+pull patches from branch BRANCH
+.TP
+.B \-a, \-\-all
+.
+pull all changesets up to BRANCH
+.TP
+.B \-p, \-\-prune
+.
+skip over REV
+.TP
+.B \-m, \-\-merge
+.
+merge at REV
+.TP
+.B \-\-parent
+.
+parent to choose when transplanting merge
+.TP
+.B \-e, \-\-edit
+.
+invoke editor on commit messages
+.TP
+.B \-\-log
+.
+append transplant info to log message
+.TP
+.B \-c, \-\-continue
+.
+continue last transplant session after repair
+.TP
+.B \-\-filter
+.
+filter changesets through command
+.UNINDENT
+.SS win32mbcs
+.sp
+allow the use of MBCS paths with problematic encodings
+.sp
+Some MBCS encodings are not good for some path operations (i.e.
+splitting path, case conversion, etc.) with its encoded bytes. We call
+such a encoding (i.e. shift_jis and big5) as "problematic encoding".
+This extension can be used to fix the issue with those encodings by
+wrapping some functions to convert to Unicode string before path
+operation.
+.sp
+This extension is useful for:
+.INDENT 0.0
+.IP \(bu 2
+.
+Japanese Windows users using shift_jis encoding.
+.IP \(bu 2
+.
+Chinese Windows users using big5 encoding.
+.IP \(bu 2
+.
+All users who use a repository with one of problematic encodings on
+case\-insensitive file system.
+.UNINDENT
+.sp
+This extension is not needed for:
+.INDENT 0.0
+.IP \(bu 2
+.
+Any user who use only ASCII chars in path.
+.IP \(bu 2
+.
+Any user who do not use any of problematic encodings.
+.UNINDENT
+.sp
+Note that there are some limitations on using this extension:
+.INDENT 0.0
+.IP \(bu 2
+.
+You should use single encoding in one repository.
+.IP \(bu 2
+.
+If the repository path ends with 0x5c, .hg/hgrc cannot be read.
+.IP \(bu 2
+.
+win32mbcs is not compatible with fixutf8 extension.
+.UNINDENT
+.sp
+By default, win32mbcs uses encoding.encoding decided by Mercurial.
+You can specify the encoding by config option:
+.sp
+.nf
+.ft C
+[win32mbcs]
+encoding = sjis
+.ft P
+.fi
+.sp
+It is useful for the users who want to commit with UTF\-8 log message.
+.SS win32text
+.sp
+perform automatic newline conversion
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Deprecation: The win32text extension requires each user to configure
+the extension again and again for each clone since the configuration
+is not copied when cloning.
+.sp
+We have therefore made the \fBeol\fP as an alternative. The \fBeol\fP
+uses a version controlled file for its configuration and each clone
+will therefore use the right settings from the start.
+.UNINDENT
+.UNINDENT
+.sp
+To perform automatic newline conversion, use:
+.sp
+.nf
+.ft C
+[extensions]
+win32text =
+[encode]
+** = cleverencode:
+# or ** = macencode:
+
+[decode]
+** = cleverdecode:
+# or ** = macdecode:
+.ft P
+.fi
+.sp
+If not doing conversion, to make sure you do not commit CRLF/CR by accident:
+.sp
+.nf
+.ft C
+[hooks]
+pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+# or pretxncommit.cr = python:hgext.win32text.forbidcr
+.ft P
+.fi
+.sp
+To do the same check on a server to prevent CRLF/CR from being
+pushed or pulled:
+.sp
+.nf
+.ft C
+[hooks]
+pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf
+# or pretxnchangegroup.cr = python:hgext.win32text.forbidcr
+.ft P
+.fi
+.SS zeroconf
+.sp
+discover and advertise repositories on the local network
+.sp
+Zeroconf\-enabled repositories will be announced in a network without
+the need to configure a server or a service. They can be discovered
+without knowing their actual IP address.
+.sp
+To allow other people to discover your repository using run
+\%\fBhg serve\fP\: in your repository:
+.sp
+.nf
+.ft C
+$ cd test
+$ hg serve
+.ft P
+.fi
+.sp
+You can discover Zeroconf\-enabled repositories by running
+\%\fBhg paths\fP\::
+.sp
+.nf
+.ft C
+$ hg paths
+zc\-test = http://example.com:8000/test
+.ft P
+.fi
+.SH FILES
+.INDENT 0.0
+.TP
+.B \fB/etc/mercurial/hgrc\fP, \fB$HOME/.hgrc\fP, \fB.hg/hgrc\fP
+.sp
+This file contains defaults and configuration. Values in
+\fB.hg/hgrc\fP override those in \fB$HOME/.hgrc\fP, and these override
+settings made in the global \fB/etc/mercurial/hgrc\fP configuration.
+See \%\fBhgrc\fP(5)\: for details of the contents and format of these
+files.
+.TP
+.B \fB.hgignore\fP
+.sp
+This file contains regular expressions (one per line) that
+describe file names that should be ignored by \fBhg\fP. For details,
+see \%\fBhgignore\fP(5)\:.
+.TP
+.B \fB.hgsub\fP
+.sp
+This file defines the locations of all subrepositories, and
+tells where the subrepository checkouts came from. For details, see
+\%\fBhg help subrepos\fP\:.
+.TP
+.B \fB.hgsubstate\fP
+.sp
+This file is where Mercurial stores all nested repository states. \fINB: This
+file should not be edited manually.\fP
+.TP
+.B \fB.hgtags\fP
+.sp
+This file contains changeset hash values and text tag names (one
+of each separated by spaces) that correspond to tagged versions of
+the repository contents. The file content is encoded using UTF\-8.
+.TP
+.B \fB.hg/last\-message.txt\fP
+.sp
+This file is used by \%\fBhg commit\fP\: to store a backup of the commit message
+in case the commit fails.
+.TP
+.B \fB.hg/localtags\fP
+.sp
+This file can be used to define local tags which are not shared among
+repositories. The file format is the same as for \fB.hgtags\fP, but it is
+encoded using the local system encoding.
+.UNINDENT
+.sp
+Some commands (e.g. revert) produce backup files ending in \fB.orig\fP,
+if the \fB.orig\fP file already exists and is not tracked by Mercurial,
+it will be overwritten.
+.SH BUGS
+.sp
+Probably lots, please post them to the mailing list (see \%Resources\:
+below) when you find them.
+.SH SEE ALSO
+.sp
+\%\fBhgignore\fP(5)\:, \%\fBhgrc\fP(5)\:
+.SH AUTHOR
+.sp
+Written by Matt Mackall <\%mpm@selenic.com\:>
+.SH RESOURCES
+.sp
+Main Web Site: \%http://mercurial.selenic.com/\:
+.sp
+Source code repository: \%http://selenic.com/hg\:
+.sp
+Mailing list: \%http://selenic.com/mailman/listinfo/mercurial\:
+.SH COPYING
+.sp
+Copyright (C) 2005\-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+.\" Common link and substitution definitions.
+.
+.SH AUTHOR
+Matt Mackall <mpm@selenic.com>
+
+Organization: Mercurial
+.\" Generated by docutils manpage writer.
+.\"
+.
diff --git a/doc/hg.1.html b/doc/hg.1.html
new file mode 100644
index 0000000..9a0a22f
--- /dev/null
+++ b/doc/hg.1.html
@@ -0,0 +1,8975 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
+<title>hg</title>
+<meta name="author" content="Matt Mackall &lt;mpm&#64;selenic.com&gt;" />
+<meta name="organization" content="Mercurial" />
+<link rel="stylesheet" href="style.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="hg">
+<h1 class="title">hg</h1>
+<h2 class="subtitle" id="mercurial-source-code-management-system">Mercurial source code management system</h2>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Matt Mackall &lt;<a class="reference external" href="mailto:mpm&#64;selenic.com">mpm&#64;selenic.com</a>&gt;</td></tr>
+<tr><th class="docinfo-name">Organization:</th>
+<td>Mercurial</td></tr>
+<tr class="field"><th class="docinfo-name">Manual section:</th><td class="field-body">1</td>
+</tr>
+<tr class="field"><th class="docinfo-name">Manual group:</th><td class="field-body">Mercurial Manual</td>
+</tr>
+</tbody>
+</table>
+<div class="contents htmlonly topic" id="contents">
+<p class="topic-title first">Contents</p>
+<ul class="simple">
+<li><a class="reference internal" href="#synopsis" id="id39">Synopsis</a></li>
+<li><a class="reference internal" href="#description" id="id40">Description</a></li>
+<li><a class="reference internal" href="#command-elements" id="id41">Command Elements</a></li>
+<li><a class="reference internal" href="#options" id="id42">Options</a></li>
+<li><a class="reference internal" href="#commands" id="id43">Commands</a></li>
+<li><a class="reference internal" href="#date-formats" id="id44">Date Formats</a></li>
+<li><a class="reference internal" href="#diff-formats" id="id45">Diff Formats</a></li>
+<li><a class="reference internal" href="#environment-variables" id="id46">Environment Variables</a></li>
+<li><a class="reference internal" href="#using-additional-features" id="id47">Using Additional Features</a></li>
+<li><a class="reference internal" href="#specifying-file-sets" id="id48">Specifying File Sets</a></li>
+<li><a class="reference internal" href="#id1" id="id49">Glossary</a></li>
+<li><a class="reference internal" href="#syntax-for-mercurial-ignore-files" id="id50">Syntax for Mercurial Ignore Files</a></li>
+<li><a class="reference internal" href="#configuring-hgweb" id="id51">Configuring hgweb</a></li>
+<li><a class="reference internal" href="#id4" id="id52">Merge Tools</a></li>
+<li><a class="reference internal" href="#specifying-multiple-revisions" id="id53">Specifying Multiple Revisions</a></li>
+<li><a class="reference internal" href="#file-name-patterns" id="id54">File Name Patterns</a></li>
+<li><a class="reference internal" href="#working-with-phases" id="id55">Working with Phases</a></li>
+<li><a class="reference internal" href="#specifying-single-revisions" id="id56">Specifying Single Revisions</a></li>
+<li><a class="reference internal" href="#specifying-revision-sets" id="id57">Specifying Revision Sets</a></li>
+<li><a class="reference internal" href="#subrepositories" id="id58">Subrepositories</a></li>
+<li><a class="reference internal" href="#template-usage" id="id59">Template Usage</a></li>
+<li><a class="reference internal" href="#url-paths" id="id60">URL Paths</a></li>
+<li><a class="reference internal" href="#id5" id="id61">Extensions</a></li>
+<li><a class="reference internal" href="#files" id="id62">Files</a></li>
+<li><a class="reference internal" href="#bugs" id="id63">Bugs</a></li>
+<li><a class="reference internal" href="#see-also" id="id64">See Also</a></li>
+<li><a class="reference internal" href="#author" id="id65">Author</a></li>
+<li><a class="reference internal" href="#resources" id="id66">Resources</a></li>
+<li><a class="reference internal" href="#copying" id="id67">Copying</a></li>
+</ul>
+</div>
+<div class="section" id="synopsis">
+<h1><a class="toc-backref" href="#contents">Synopsis</a></h1>
+<p><strong>hg</strong> <em>command</em> [<em>option</em>]... [<em>argument</em>]...</p>
+</div>
+<div class="section" id="description">
+<h1><a class="toc-backref" href="#contents">Description</a></h1>
+<p>The <strong>hg</strong> command provides a command line interface to the Mercurial
+system.</p>
+</div>
+<div class="section" id="command-elements">
+<h1><a class="toc-backref" href="#contents">Command Elements</a></h1>
+<dl class="docutils">
+<dt>files...</dt>
+<dd>indicates one or more filename or relative path filenames; see
+<a class="reference internal" href="#file-name-patterns">File Name Patterns</a> for information on pattern matching</dd>
+<dt>path</dt>
+<dd>indicates a path on the local machine</dd>
+<dt>revision</dt>
+<dd>indicates a changeset which can be specified as a changeset
+revision number, a tag, or a unique substring of the changeset
+hash value</dd>
+<dt>repository path</dt>
+<dd>either the pathname of a local repository or the URI of a remote
+repository.</dd>
+</dl>
+</div>
+<div class="section" id="options">
+<h1><a class="toc-backref" href="#contents">Options</a></h1>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-R</span>, <span class="option">--repository</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>repository root directory or name of overlay bundle file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--cwd</span></kbd></td>
+<td>change working directory</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-y</span>, <span class="option">--noninteractive</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not prompt, automatically pick the first choice for all prompts</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-q</span>, <span class="option">--quiet</span></kbd></td>
+<td>suppress output</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-v</span>, <span class="option">--verbose</span></kbd></td>
+<td>enable additional output</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--config</span></kbd></td>
+<td>set/override config option (use 'section.name=value')</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--debug</span></kbd></td>
+<td>enable debugging output</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--debugger</span></kbd></td>
+<td>start debugger</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--encoding</span></kbd></td>
+<td>set the charset encoding (default: ascii)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--encodingmode</span></kbd></td>
+<td>set the charset encoding mode (default: strict)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--traceback</span></kbd></td>
+<td>always print a traceback on exception</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--time</span></kbd></td>
+<td>time how long the command takes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--profile</span></kbd></td>
+<td>print command execution profile</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--version</span></kbd></td>
+<td>output version information and exit</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-h</span>, <span class="option">--help</span></kbd></td>
+<td>display help and exit</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="commands">
+<h1><a class="toc-backref" href="#contents">Commands</a></h1>
+<div class="section" id="add">
+<h2>add</h2>
+<pre class="literal-block">
+hg add [OPTION]... [FILE]...
+</pre>
+<p>Schedule files to be version controlled and added to the
+repository.</p>
+<p>The files will be added to the repository at the next commit. To
+undo an add before that, see <a class="reference external" href="hg.1.html#forget"><tt class="docutils literal">hg forget</tt></a>.</p>
+<p>If no names are given, add all files to the repository.</p>
+<div class="verbose container">
+<p>An example showing how new (unknown) files are added
+automatically by <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add</tt></a>:</p>
+<pre class="literal-block">
+$ ls
+foo.c
+$ hg status
+? foo.c
+$ hg add
+adding foo.c
+$ hg status
+A foo.c
+</pre>
+</div>
+<p>Returns 0 if all files are successfully added.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td>recurse into subrepositories</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td>do not perform actions, just print output</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="addremove">
+<h2>addremove</h2>
+<pre class="literal-block">
+hg addremove [OPTION]... [FILE]...
+</pre>
+<p>Add all new files and remove all missing files from the
+repository.</p>
+<p>New files are ignored if they match any of the patterns in
+<tt class="docutils literal">.hgignore</tt>. As with add, these changes take effect at the next
+commit.</p>
+<p>Use the -s/--similarity option to detect renamed files. This
+option takes a percentage between 0 (disabled) and 100 (files must
+be identical) as its parameter. With a parameter greater than 0,
+this compares every removed file with every added file and records
+those similar enough as renames. Detecting renamed files this way
+can be expensive. After using this option, <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status <span class="pre">-C</span></tt></a> can be
+used to check which files were identified as moved or renamed. If
+not specified, -s/--similarity defaults to 100 and only renames of
+identical files are detected.</p>
+<p>Returns 0 if all files are successfully added.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-s</span>, <span class="option">--similarity</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>guess renamed files by similarity (0&lt;=s&lt;=100)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td>do not perform actions, just print output</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="annotate">
+<h2>annotate</h2>
+<pre class="literal-block">
+hg annotate [-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...
+</pre>
+<p>List changes in files, showing the revision id responsible for
+each line</p>
+<p>This command is useful for discovering when a change was made and
+by whom.</p>
+<p>Without the -a/--text option, annotate will avoid processing files
+it detects as binary. With -a, annotate will annotate the file
+anyway, although the results will probably be neither useful
+nor desirable.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>annotate the specified revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--follow</span></kbd></td>
+<td>follow copies/renames and list the filename (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-follow</span></kbd></td>
+<td>don't follow copies and renames</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--text</span></kbd></td>
+<td>treat all files as text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>list the author (long with -v)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--file</span></kbd></td>
+<td>list the filename</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>list the date (short with -q)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--number</span></kbd></td>
+<td>list the revision number (default)</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-c</span>, <span class="option">--changeset</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>list the changeset</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-l</span>, <span class="option">--line-number</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show line number at the first appearance</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-w</span>, <span class="option">--ignore-all-space</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore white space when comparing lines</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-b</span>, <span class="option">--ignore-space-change</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes in the amount of white space</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--ignore-blank-lines</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes whose lines are all blank</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td><p class="first">exclude names matching the given patterns</p>
+<p class="last">aliases: blame</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="archive">
+<h2>archive</h2>
+<pre class="literal-block">
+hg archive [OPTION]... DEST
+</pre>
+<p>By default, the revision used is the parent of the working
+directory; use -r/--rev to specify a different revision.</p>
+<p>The archive type is automatically detected based on file
+extension (or override using -t/--type).</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">create a zip file containing the 1.0 release:</p>
+<pre class="literal-block">
+hg archive -r 1.0 project-1.0.zip
+</pre>
+</li>
+<li><p class="first">create a tarball excluding .hg files:</p>
+<pre class="literal-block">
+hg archive project.tar.gz -X &quot;.hg*&quot;
+</pre>
+</li>
+</ul>
+</div>
+<p>Valid types are:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">files</tt>:</th><td class="field-body">a directory full of files (default)</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">tar</tt>:</th><td class="field-body">tar archive, uncompressed</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">tbz2</tt>:</th><td class="field-body">tar archive, compressed using bzip2</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">tgz</tt>:</th><td class="field-body">tar archive, compressed using gzip</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">uzip</tt>:</th><td class="field-body">zip archive, uncompressed</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">zip</tt>:</th><td class="field-body">zip archive, compressed using deflate</td>
+</tr>
+</tbody>
+</table>
+<p>The exact name of the destination archive or directory is given
+using a format string; see <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg help export</tt></a> for details.</p>
+<p>Each member added to an archive file has a directory prefix
+prepended. Use -p/--prefix to specify a format string for the
+prefix. The default is the basename of the archive, with suffixes
+removed.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--no-decode</span></kbd></td>
+<td>do not pass files through decoders</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--prefix</span></kbd></td>
+<td>directory prefix for files in archive</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision to distribute</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--type</span></kbd></td>
+<td>type of distribution to create</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td>recurse into subrepositories</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="backout">
+<h2>backout</h2>
+<pre class="literal-block">
+hg backout [OPTION]... [-r] REV
+</pre>
+<p>Prepare a new changeset with the effect of REV undone in the
+current working directory.</p>
+<p>If REV is the parent of the working directory, then this new changeset
+is committed automatically. Otherwise, hg needs to merge the
+changes and the merged result is left uncommitted.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">backout cannot be used to fix either an unwanted or
+incorrect merge.</p>
+</div>
+<div class="verbose container">
+<p>By default, the pending changeset will have one parent,
+maintaining a linear history. With --merge, the pending
+changeset will instead have two parents: the old parent of the
+working directory and a new child of REV that simply undoes REV.</p>
+<p>Before version 1.7, the behavior without --merge was equivalent
+to specifying --merge followed by <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update <span class="pre">--clean</span> .</tt></a> to
+cancel the merge and leave the child of REV as a head to be
+merged separately.</p>
+</div>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--merge</span></kbd></td>
+<td>merge with old dirstate parent after backout</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--parent</span></kbd></td>
+<td>parent to choose when backing out merge (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision to backout</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tool</span></kbd></td>
+<td>specify merge tool</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="bisect">
+<h2>bisect</h2>
+<pre class="literal-block">
+hg bisect [-gbsr] [-U] [-c CMD] [REV]
+</pre>
+<p>This command helps to find changesets which introduce problems. To
+use, mark the earliest changeset you know exhibits the problem as
+bad, then mark the latest changeset which is free from the problem
+as good. Bisect will update your working directory to a revision
+for testing (unless the -U/--noupdate option is specified). Once
+you have performed tests, mark the working directory as good or
+bad, and bisect will either update to another candidate changeset
+or announce that it has found the bad revision.</p>
+<p>As a shortcut, you can also use the revision argument to mark a
+revision as good or bad without checking it out first.</p>
+<p>If you supply a command, it will be used for automatic bisection.
+The environment variable HG_NODE will contain the ID of the
+changeset being tested. The exit status of the command will be
+used to mark revisions as good or bad: status 0 means good, 125
+means to skip the revision, 127 (command not found) will abort the
+bisection, and any other non-zero exit status means the revision
+is bad.</p>
+<div class="verbose container">
+<p>Some examples:</p>
+<ul>
+<li><p class="first">start a bisection with known bad revision 12, and good revision 34:</p>
+<pre class="literal-block">
+hg bisect --bad 34
+hg bisect --good 12
+</pre>
+</li>
+<li><p class="first">advance the current bisection by marking current revision as good or
+bad:</p>
+<pre class="literal-block">
+hg bisect --good
+hg bisect --bad
+</pre>
+</li>
+<li><p class="first">mark the current revision, or a known revision, to be skipped (eg. if
+that revision is not usable because of another issue):</p>
+<pre class="literal-block">
+hg bisect --skip
+hg bisect --skip 23
+</pre>
+</li>
+<li><p class="first">forget the current bisection:</p>
+<pre class="literal-block">
+hg bisect --reset
+</pre>
+</li>
+<li><p class="first">use 'make &amp;&amp; make tests' to automatically find the first broken
+revision:</p>
+<pre class="literal-block">
+hg bisect --reset
+hg bisect --bad 34
+hg bisect --good 12
+hg bisect --command 'make &amp;&amp; make tests'
+</pre>
+</li>
+<li><p class="first">see all changesets whose states are already known in the current
+bisection:</p>
+<pre class="literal-block">
+hg log -r &quot;bisect(pruned)&quot;
+</pre>
+</li>
+<li><p class="first">see the changeset currently being bisected (especially useful
+if running with -U/--noupdate):</p>
+<pre class="literal-block">
+hg log -r &quot;bisect(current)&quot;
+</pre>
+</li>
+<li><p class="first">see all changesets that took part in the current bisection:</p>
+<pre class="literal-block">
+hg log -r &quot;bisect(range)&quot;
+</pre>
+</li>
+<li><p class="first">with the graphlog extension, you can even get a nice graph:</p>
+<pre class="literal-block">
+hg log --graph -r &quot;bisect(range)&quot;
+</pre>
+</li>
+</ul>
+<p>See <a class="reference external" href="hg.1.html#revsets"><tt class="docutils literal">hg help revsets</tt></a> for more about the <cite>bisect()</cite> keyword.</p>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--reset</span></kbd></td>
+<td>reset bisect state</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--good</span></kbd></td>
+<td>mark changeset good</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--bad</span></kbd></td>
+<td>mark changeset bad</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--skip</span></kbd></td>
+<td>skip testing changeset</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--extend</span></kbd></td>
+<td>extend the bisect range</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--command</span></kbd></td>
+<td>use command to check changeset state</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--noupdate</span></kbd></td>
+<td>do not update to target</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="bookmarks">
+<h2>bookmarks</h2>
+<pre class="literal-block">
+hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]
+</pre>
+<p>Bookmarks are pointers to certain commits that move when committing.
+Bookmarks are local. They can be renamed, copied and deleted. It is
+possible to use <a class="reference external" href="hg.1.html#merge"><tt class="docutils literal">hg merge NAME</tt></a> to merge from a given bookmark, and
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update NAME</tt></a> to update to a given bookmark.</p>
+<p>You can use <a class="reference external" href="hg.1.html#bookmark"><tt class="docutils literal">hg bookmark NAME</tt></a> to set a bookmark on the working
+directory's parent revision with the given name. If you specify
+a revision using -r REV (where REV may be an existing bookmark),
+the bookmark is assigned to that revision.</p>
+<p>Bookmarks can be pushed and pulled between repositories (see <a class="reference external" href="hg.1.html#push"><tt class="docutils literal">hg help
+push</tt></a> and <a class="reference external" href="hg.1.html#pull"><tt class="docutils literal">hg help pull</tt></a>). This requires both the local and remote
+repositories to support bookmarks. For versions prior to 1.8, this means
+the bookmarks extension must be enabled.</p>
+<p>With -i/--inactive, the new bookmark will not be made the active
+bookmark. If -r/--rev is given, the new bookmark will not be made
+active even if -i/--inactive is not given. If no NAME is given, the
+current active bookmark will be marked inactive.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--delete</span></kbd></td>
+<td>delete a given bookmark</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--rename</span></kbd></td>
+<td>rename a given bookmark</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-i</span>, <span class="option">--inactive</span></kbd></td>
+<td>mark a bookmark inactive</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="branch">
+<h2>branch</h2>
+<pre class="literal-block">
+hg branch [-fC] [NAME]
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Branch names are permanent and global. Use <a class="reference external" href="hg.1.html#bookmark"><tt class="docutils literal">hg bookmark</tt></a> to create a
+light-weight bookmark instead. See <a class="reference external" href="hg.1.html#glossary"><tt class="docutils literal">hg help glossary</tt></a> for more
+information about named branches and bookmarks.</p>
+</div>
+<p>With no argument, show the current branch name. With one argument,
+set the working directory branch name (the branch will not exist
+in the repository until the next commit). Standard practice
+recommends that primary development take place on the 'default'
+branch.</p>
+<p>Unless -f/--force is specified, branch will not let you set a
+branch name that already exists, even if it's inactive.</p>
+<p>Use -C/--clean to reset the working directory branch to that of
+the parent of the working directory, negating a previous branch
+change.</p>
+<p>Use the command <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a> to switch to an existing branch. Use
+<a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit <span class="pre">--close-branch</span></tt></a> to mark this branch as closed.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>set branch name even if it shadows an existing branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-C</span>, <span class="option">--clean</span></kbd></td>
+<td>reset branch name to parent branch name</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="branches">
+<h2>branches</h2>
+<pre class="literal-block">
+hg branches [-ac]
+</pre>
+<p>List the repository's named branches, indicating which ones are
+inactive. If -c/--closed is specified, also list branches which have
+been marked closed (see <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit <span class="pre">--close-branch</span></tt></a>).</p>
+<p>If -a/--active is specified, only show active branches. A branch
+is considered active if it contains repository heads.</p>
+<p>Use the command <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a> to switch to an existing branch.</p>
+<p>Returns 0.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--active</span></kbd></td>
+<td>show only branches that have unmerged heads</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--closed</span></kbd></td>
+<td>show normal and closed branches</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="bundle">
+<h2>bundle</h2>
+<pre class="literal-block">
+hg bundle [-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]
+</pre>
+<p>Generate a compressed changegroup file collecting changesets not
+known to be in another repository.</p>
+<p>If you omit the destination repository, then hg assumes the
+destination will have all the nodes you specify with --base
+parameters. To create a bundle containing all changesets, use
+-a/--all (or --base null).</p>
+<p>You can change compression method with the -t/--type option.
+The available compression methods are: none, bzip2, and
+gzip (by default, bundles are compressed using bzip2).</p>
+<p>The bundle file can then be transferred using conventional means
+and applied to another repository with the unbundle or pull
+command. This is useful when direct push and pull are not
+available or when exporting an entire repository is undesirable.</p>
+<p>Applying bundles preserves all changeset contents including
+permissions, copy/rename information, and revision history.</p>
+<p>Returns 0 on success, 1 if no changes found.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>run even when the destination is unrelated</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a changeset intended to be added to the destination</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>a specific branch you would like to bundle</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--base</span></kbd></td>
+<td>a base changeset assumed to be available at the destination</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>bundle all changesets in the repository</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--type</span></kbd></td>
+<td>bundle compression type to use (default: bzip2)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="cat">
+<h2>cat</h2>
+<pre class="literal-block">
+hg cat [OPTION]... FILE...
+</pre>
+<p>Print the specified files as they were at the given revision. If
+no revision is given, the parent of the working directory is used,
+or tip if no revision is checked out.</p>
+<p>Output may be to a file, in which case the name of the file is
+given using a format string. The formatting rules are the same as
+for the export command, with the following additions:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">%s</tt>:</th><td class="field-body">basename of file being printed</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%d</tt>:</th><td class="field-body">dirname of file being printed, or '.' if in repository root</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%p</tt>:</th><td class="field-body">root-relative path name of file being printed</td>
+</tr>
+</tbody>
+</table>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-o</span>, <span class="option">--output</span></kbd></td>
+<td>print output to file with formatted name</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>print the given revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--decode</span></kbd></td>
+<td>apply any matching decode filter</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="clone">
+<h2>clone</h2>
+<pre class="literal-block">
+hg clone [OPTION]... SOURCE [DEST]
+</pre>
+<p>Create a copy of an existing repository in a new directory.</p>
+<p>If no destination directory name is specified, it defaults to the
+basename of the source.</p>
+<p>The location of the source is added to the new repository's
+<tt class="docutils literal">.hg/hgrc</tt> file, as the default to be used for future pulls.</p>
+<p>Only local paths and <tt class="docutils literal"><span class="pre">ssh://</span></tt> URLs are supported as
+destinations. For <tt class="docutils literal"><span class="pre">ssh://</span></tt> destinations, no working directory or
+<tt class="docutils literal">.hg/hgrc</tt> will be created on the remote side.</p>
+<p>To pull only a subset of changesets, specify one or more revisions
+identifiers with -r/--rev or branches with -b/--branch. The
+resulting clone will contain only the specified changesets and
+their ancestors. These options (or 'clone src#rev dest') imply
+--pull, even for local source repositories. Note that specifying a
+tag will include the tagged changeset but not the changeset
+containing the tag.</p>
+<p>To check out a particular version, use -u/--update, or
+-U/--noupdate to create a clone with no working directory.</p>
+<div class="verbose container">
+<p>For efficiency, hardlinks are used for cloning whenever the
+source and destination are on the same filesystem (note this
+applies only to the repository data, not to the working
+directory). Some filesystems, such as AFS, implement hardlinking
+incorrectly, but do not report errors. In these cases, use the
+--pull option to avoid hardlinking.</p>
+<p>In some cases, you can clone repositories and the working
+directory using full hardlinks with</p>
+<pre class="literal-block">
+$ cp -al REPO REPOCLONE
+</pre>
+<p>This is the fastest way to clone, but it is not always safe. The
+operation is not atomic (making sure REPO is not modified during
+the operation is up to you) and you have to make sure your
+editor breaks hardlinks (Emacs and most Linux Kernel tools do
+so). Also, this is not compatible with certain extensions that
+place their metadata under the .hg directory, such as mq.</p>
+<p>Mercurial will update the working directory to the first applicable
+revision from this list:</p>
+<ol class="loweralpha simple">
+<li>null if -U or the source repository has no changesets</li>
+<li>if -u . and the source repository is local, the first parent of
+the source repository's working directory</li>
+<li>the changeset specified with -u (if a branch name, this means the
+latest head of that branch)</li>
+<li>the changeset specified with -r</li>
+<li>the tipmost head specified with -b</li>
+<li>the tipmost head specified with the url#branch source syntax</li>
+<li>the tipmost head of the default branch</li>
+<li>tip</li>
+</ol>
+<p>Examples:</p>
+<ul>
+<li><p class="first">clone a remote repository to a new directory named hg/:</p>
+<pre class="literal-block">
+hg clone http://selenic.com/hg
+</pre>
+</li>
+<li><p class="first">create a lightweight local clone:</p>
+<pre class="literal-block">
+hg clone project/ project-feature/
+</pre>
+</li>
+<li><p class="first">clone from an absolute path on an ssh server (note double-slash):</p>
+<pre class="literal-block">
+hg clone ssh://user&#64;server//home/projects/alpha/
+</pre>
+</li>
+<li><p class="first">do a high-speed clone over a LAN while checking out a
+specified version:</p>
+<pre class="literal-block">
+hg clone --uncompressed http://server/repo -u 1.5
+</pre>
+</li>
+<li><p class="first">create a repository without changesets after a particular revision:</p>
+<pre class="literal-block">
+hg clone -r 04e544 experimental/ good/
+</pre>
+</li>
+<li><p class="first">clone (and track) a particular named branch:</p>
+<pre class="literal-block">
+hg clone http://selenic.com/hg#stable
+</pre>
+</li>
+</ul>
+</div>
+<p>See <a class="reference external" href="hg.1.html#urls"><tt class="docutils literal">hg help urls</tt></a> for details on specifying URLs.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--noupdate</span></kbd></td>
+<td>the clone will include an empty working copy (only a repository)</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-u</span>, <span class="option">--updaterev</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>revision, tag or branch to check out</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>include the specified changeset</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>clone only the specified branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--pull</span></kbd></td>
+<td>use pull protocol to copy metadata</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--uncompressed</span></kbd></td>
+<td>use uncompressed transfer (fast over LAN)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="commit">
+<h2>commit</h2>
+<pre class="literal-block">
+hg commit [OPTION]... [FILE]...
+</pre>
+<p>Commit changes to the given files into the repository. Unlike a
+centralized SCM, this operation is a local operation. See
+<a class="reference external" href="hg.1.html#push"><tt class="docutils literal">hg push</tt></a> for a way to actively distribute your changes.</p>
+<p>If a list of files is omitted, all changes reported by <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a>
+will be committed.</p>
+<p>If you are committing the result of a merge, do not provide any
+filenames or -I/-X filters.</p>
+<p>If no commit message is specified, Mercurial starts your
+configured editor where you can enter a message. In case your
+commit fails, you will find a backup of your message in
+<tt class="docutils literal"><span class="pre">.hg/last-message.txt</span></tt>.</p>
+<p>The --amend flag can be used to amend the parent of the
+working directory with a new commit that contains the changes
+in the parent in addition to those currently reported by <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a>,
+if there are any. The old commit is stored in a backup bundle in
+<tt class="docutils literal"><span class="pre">.hg/strip-backup</span></tt> (see <a class="reference external" href="hg.1.html#bundle"><tt class="docutils literal">hg help bundle</tt></a> and <a class="reference external" href="hg.1.html#unbundle"><tt class="docutils literal">hg help unbundle</tt></a>
+on how to restore it).</p>
+<p>Message, user and date are taken from the amended commit unless
+specified. When a message isn't specified on the command line,
+the editor will open with the message of the amended commit.</p>
+<p>It is not possible to amend public changesets (see <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a>)
+or changesets that have children.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Returns 0 on success, 1 if nothing changed.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-A</span>, <span class="option">--addremove</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>mark new/missing files as added/removed before committing</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--close-branch</span></kbd></td>
+<td>mark a branch as closed, hiding it from the branch list</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--amend</span></kbd></td>
+<td>amend the parent of the working dir</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td><p class="first">recurse into subrepositories</p>
+<p class="last">aliases: ci</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="copy">
+<h2>copy</h2>
+<pre class="literal-block">
+hg copy [OPTION]... [SOURCE]... DEST
+</pre>
+<p>Mark dest as having copies of source files. If dest is a
+directory, copies are put in that directory. If dest is a file,
+the source must be a single file.</p>
+<p>By default, this command copies the contents of files as they
+exist in the working directory. If invoked with -A/--after, the
+operation is recorded, but no copying is performed.</p>
+<p>This command takes effect with the next commit. To undo a copy
+before that, see <a class="reference external" href="hg.1.html#revert"><tt class="docutils literal">hg revert</tt></a>.</p>
+<p>Returns 0 on success, 1 if errors are encountered.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-A</span>, <span class="option">--after</span></kbd></td>
+<td>record a copy that has already occurred</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>forcibly copy over an existing managed file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td><p class="first">do not perform actions, just print output</p>
+<p class="last">aliases: cp</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="diff">
+<h2>diff</h2>
+<pre class="literal-block">
+hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
+</pre>
+<p>Show differences between revisions for the specified files.</p>
+<p>Differences between files are shown using the unified diff format.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">diff may generate unexpected results for merges, as it will
+default to comparing against the working directory's first
+parent changeset if no revisions are specified.</p>
+</div>
+<p>When two revision arguments are given, then changes are shown
+between those revisions. If only one revision is specified then
+that revision is compared to the working directory, and, when no
+revisions are specified, the working directory files are compared
+to its parent.</p>
+<p>Alternatively you can specify -c/--change with a revision to see
+the changes in that changeset relative to its first parent.</p>
+<p>Without the -a/--text option, diff will avoid generating diffs of
+files it detects as binary. With -a, diff will generate a diff
+anyway, probably with undesirable results.</p>
+<p>Use the -g/--git option to generate diffs in the git extended diff
+format. For more information, read <a class="reference external" href="hg.1.html#diffs"><tt class="docutils literal">hg help diffs</tt></a>.</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">compare a file in the current working directory to its parent:</p>
+<pre class="literal-block">
+hg diff foo.c
+</pre>
+</li>
+<li><p class="first">compare two historical versions of a directory, with rename info:</p>
+<pre class="literal-block">
+hg diff --git -r 1.0:1.2 lib/
+</pre>
+</li>
+<li><p class="first">get change stats relative to the last change on some date:</p>
+<pre class="literal-block">
+hg diff --stat -r &quot;date('may 2')&quot;
+</pre>
+</li>
+<li><p class="first">diff all newly-added files that contain a keyword:</p>
+<pre class="literal-block">
+hg diff &quot;set:added() and grep(GNU)&quot;
+</pre>
+</li>
+<li><p class="first">compare a revision and its parents:</p>
+<pre class="literal-block">
+hg diff -c 9353 # compare against first parent
+hg diff -r 9353^:9353 # same using revset syntax
+hg diff -r 9353^2:9353 # compare against the second parent
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--change</span></kbd></td>
+<td>change made by revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--text</span></kbd></td>
+<td>treat all files as text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--nodates</span></kbd></td>
+<td>omit dates from diff headers</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-p</span>, <span class="option">--show-function</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show which function each change is in</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--reverse</span></kbd></td>
+<td>produce a diff that undoes the changes</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-w</span>, <span class="option">--ignore-all-space</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore white space when comparing lines</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-b</span>, <span class="option">--ignore-space-change</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes in the amount of white space</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--ignore-blank-lines</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes whose lines are all blank</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--unified</span></kbd></td>
+<td>number of lines of context to show</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td>recurse into subrepositories</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="export">
+<h2>export</h2>
+<pre class="literal-block">
+hg export [OPTION]... [-o OUTFILESPEC] [-r] REV...
+</pre>
+<p>Print the changeset header and diffs for one or more revisions.</p>
+<p>The information shown in the changeset header is: author, date,
+branch name (if non-default), changeset hash, parent(s) and commit
+comment.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">export may generate unexpected diff output for merge
+changesets, as it will compare the merge changeset against its
+first parent only.</p>
+</div>
+<p>Output may be to a file, in which case the name of the file is
+given using a format string. The formatting rules are as follows:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">%%</tt>:</th><td class="field-body">literal &quot;%&quot; character</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%H</tt>:</th><td class="field-body">changeset hash (40 hexadecimal digits)</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%N</tt>:</th><td class="field-body">number of patches being generated</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%R</tt>:</th><td class="field-body">changeset revision number</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%b</tt>:</th><td class="field-body">basename of the exporting repository</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%h</tt>:</th><td class="field-body">short-form changeset hash (12 hexadecimal digits)</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%m</tt>:</th><td class="field-body">first line of the commit message (only alphanumeric characters)</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%n</tt>:</th><td class="field-body">zero-padded sequence number, starting at 1</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">%r</tt>:</th><td class="field-body">zero-padded changeset revision number</td>
+</tr>
+</tbody>
+</table>
+<p>Without the -a/--text option, export will avoid generating diffs
+of files it detects as binary. With -a, export will generate a
+diff anyway, probably with undesirable results.</p>
+<p>Use the -g/--git option to generate diffs in the git extended diff
+format. See <a class="reference external" href="hg.1.html#diffs"><tt class="docutils literal">hg help diffs</tt></a> for more information.</p>
+<p>With the --switch-parent option, the diff will be against the
+second parent. It can be useful to review a merge.</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">use export and import to transplant a bugfix to the current
+branch:</p>
+<pre class="literal-block">
+hg export -r 9353 | hg import -
+</pre>
+</li>
+<li><p class="first">export all the changesets between two revisions to a file with
+rename information:</p>
+<pre class="literal-block">
+hg export --git -r 123:150 &gt; changes.txt
+</pre>
+</li>
+<li><p class="first">split outgoing changes into a series of patches with
+descriptive names:</p>
+<pre class="literal-block">
+hg export -r &quot;outgoing()&quot; -o &quot;%n-%m.patch&quot;
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-o</span>, <span class="option">--output</span></kbd></td>
+<td>print output to file with formatted name</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">--switch-parent</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>diff against the second parent</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revisions to export</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--text</span></kbd></td>
+<td>treat all files as text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--nodates</span></kbd></td>
+<td>omit dates from diff headers</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="forget">
+<h2>forget</h2>
+<pre class="literal-block">
+hg forget [OPTION]... FILE...
+</pre>
+<p>Mark the specified files so they will no longer be tracked
+after the next commit.</p>
+<p>This only removes files from the current branch, not from the
+entire project history, and it does not delete them from the
+working directory.</p>
+<p>To undo a forget before the next commit, see <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add</tt></a>.</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">forget newly-added binary files:</p>
+<pre class="literal-block">
+hg forget &quot;set:added() and binary()&quot;
+</pre>
+</li>
+<li><p class="first">forget files that would be excluded by .hgignore:</p>
+<pre class="literal-block">
+hg forget &quot;set:hgignore()&quot;
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="graft">
+<h2>graft</h2>
+<pre class="literal-block">
+hg graft [OPTION]... [-r] REV...
+</pre>
+<p>This command uses Mercurial's merge logic to copy individual
+changes from other branches without merging branches in the
+history graph. This is sometimes known as 'backporting' or
+'cherry-picking'. By default, graft will copy user, date, and
+description from the source changesets.</p>
+<p>Changesets that are ancestors of the current revision, that have
+already been grafted, or that are merges will be skipped.</p>
+<p>If --log is specified, log messages will have a comment appended
+of the form:</p>
+<pre class="literal-block">
+(grafted from CHANGESETHASH)
+</pre>
+<p>If a graft merge results in conflicts, the graft process is
+interrupted so that the current merge can be manually resolved.
+Once all conflicts are addressed, the graft process can be
+continued with the -c/--continue option.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">The -c/--continue option does not reapply earlier options.</p>
+</div>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">copy a single change to the stable branch and edit its description:</p>
+<pre class="literal-block">
+hg update stable
+hg graft --edit 9393
+</pre>
+</li>
+<li><p class="first">graft a range of changesets with one exception, updating dates:</p>
+<pre class="literal-block">
+hg graft -D &quot;2085::2093 and not 2091&quot;
+</pre>
+</li>
+<li><p class="first">continue a graft after resolving conflicts:</p>
+<pre class="literal-block">
+hg graft -c
+</pre>
+</li>
+<li><p class="first">show the source of a grafted changeset:</p>
+<pre class="literal-block">
+hg log --debug -r tip
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on successful completion.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revisions to graft</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--continue</span></kbd></td>
+<td>resume interrupted graft</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>invoke editor on commit messages</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--log</span></kbd></td>
+<td>append graft info to log message</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-D</span>, <span class="option">--currentdate</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>record the current date as commit date</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-U</span>, <span class="option">--currentuser</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>record the current user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tool</span></kbd></td>
+<td>specify merge tool</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td>do not perform actions, just print output</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="grep">
+<h2>grep</h2>
+<pre class="literal-block">
+hg grep [OPTION]... PATTERN [FILE]...
+</pre>
+<p>Search revisions of files for a regular expression.</p>
+<p>This command behaves differently than Unix grep. It only accepts
+Python/Perl regexps. It searches repository history, not the
+working directory. It always prints the revision number in which a
+match appears.</p>
+<p>By default, grep only prints output for the first revision of a
+file in which it finds a match. To get it to print every revision
+that contains a change in match status (&quot;-&quot; for a match that
+becomes a non-match, or &quot;+&quot; for a non-match that becomes a match),
+use the --all flag.</p>
+<p>Returns 0 if a match is found, 1 otherwise.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-0</span>, <span class="option">--print0</span></kbd></td>
+<td>end fields with NUL</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--all</span></kbd></td>
+<td>print all revisions that match</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--text</span></kbd></td>
+<td>treat all files as text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--follow</span></kbd></td>
+<td>follow changeset history, or file history across copies and renames</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-i</span>, <span class="option">--ignore-case</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore case when matching</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-l</span>, <span class="option">--files-with-matches</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>print only filenames and revisions that match</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-n</span>, <span class="option">--line-number</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>print matching line numbers</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>only search files changed within revision range</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>list the author (long with -v)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>list the date (short with -q)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="heads">
+<h2>heads</h2>
+<pre class="literal-block">
+hg heads [-ct] [-r STARTREV] [REV]...
+</pre>
+<p>With no arguments, show all repository branch heads.</p>
+<p>Repository &quot;heads&quot; are changesets with no child changesets. They are
+where development generally takes place and are the usual targets
+for update and merge operations. Branch heads are changesets that have
+no child changeset on the same branch.</p>
+<p>If one or more REVs are given, only branch heads on the branches
+associated with the specified changesets are shown. This means
+that you can use <a class="reference external" href="hg.1.html#heads"><tt class="docutils literal">hg heads foo</tt></a> to see the heads on a branch
+named <tt class="docutils literal">foo</tt>.</p>
+<p>If -c/--closed is specified, also show branch heads marked closed
+(see <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit <span class="pre">--close-branch</span></tt></a>).</p>
+<p>If STARTREV is specified, only those heads that are descendants of
+STARTREV will be displayed.</p>
+<p>If -t/--topo is specified, named branch mechanics will be ignored and only
+changesets without children will be shown.</p>
+<p>Returns 0 if matching heads are found, 1 if not.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>show only heads which are descendants of STARTREV</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--topo</span></kbd></td>
+<td>show topological heads only</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--active</span></kbd></td>
+<td>show active branchheads only (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--closed</span></kbd></td>
+<td>show normal and closed branch heads</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="help">
+<h2>help</h2>
+<pre class="literal-block">
+hg help [-ec] [TOPIC]
+</pre>
+<p>With no arguments, print a list of commands with short help messages.</p>
+<p>Given a topic, extension, or command name, print help for that
+topic.</p>
+<p>Returns 0 if successful.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-e</span>, <span class="option">--extension</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show only help for extensions</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--command</span></kbd></td>
+<td>show only help for commands</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keyword</span></kbd></td>
+<td>show topics matching keyword</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="identify">
+<h2>identify</h2>
+<pre class="literal-block">
+hg identify [-nibtB] [-r REV] [SOURCE]
+</pre>
+<p>Print a summary identifying the repository state at REV using one or
+two parent hash identifiers, followed by a &quot;+&quot; if the working
+directory has uncommitted changes, the branch name (if not default),
+a list of tags, and a list of bookmarks.</p>
+<p>When REV is not given, print a summary of the current state of the
+repository.</p>
+<p>Specifying a path to a repository root or Mercurial bundle will
+cause lookup to operate on that repository/bundle.</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">generate a build identifier for the working directory:</p>
+<pre class="literal-block">
+hg id --id &gt; build-id.dat
+</pre>
+</li>
+<li><p class="first">find the revision corresponding to a tag:</p>
+<pre class="literal-block">
+hg id -n -r 1.3
+</pre>
+</li>
+<li><p class="first">check the most recent revision of a remote repository:</p>
+<pre class="literal-block">
+hg id -r tip http://selenic.com/hg/
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 if successful.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>identify the specified revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--num</span></kbd></td>
+<td>show local revision number</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-i</span>, <span class="option">--id</span></kbd></td>
+<td>show global revision id</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>show branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tags</span></kbd></td>
+<td>show tags</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--bookmarks</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show bookmarks</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td><p class="first">do not verify server certificate (ignoring web.cacerts config)</p>
+<p class="last">aliases: id</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="import">
+<h2>import</h2>
+<pre class="literal-block">
+hg import [OPTION]... PATCH...
+</pre>
+<p>Import a list of patches and commit them individually (unless
+--no-commit is specified).</p>
+<p>If there are outstanding changes in the working directory, import
+will abort unless given the -f/--force flag.</p>
+<p>You can import a patch straight from a mail message. Even patches
+as attachments work (to use the body part, it must have type
+text/plain or text/x-patch). From and Subject headers of email
+message are used as default committer and commit message. All
+text/plain body parts before first diff are added to commit
+message.</p>
+<p>If the imported patch was generated by <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export</tt></a>, user and
+description from patch override values from message headers and
+body. Values given on command line with -m/--message and -u/--user
+override these.</p>
+<p>If --exact is specified, import will set the working directory to
+the parent of each patch before applying it, and will abort if the
+resulting changeset has a different ID than the one recorded in
+the patch. This may happen due to character set problems or other
+deficiencies in the text patch format.</p>
+<p>Use --bypass to apply and commit patches directly to the
+repository, not touching the working directory. Without --exact,
+patches will be applied on top of the working directory parent
+revision.</p>
+<p>With -s/--similarity, hg will attempt to discover renames and
+copies in the patch in the same way as <a class="reference external" href="hg.1.html#addremove"><tt class="docutils literal">hg addremove</tt></a>.</p>
+<p>To read a patch from standard input, use &quot;-&quot; as the patch name. If
+a URL is specified, the patch will be downloaded from it.
+See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">import a traditional patch from a website and detect renames:</p>
+<pre class="literal-block">
+hg import -s 80 http://example.com/bugfix.patch
+</pre>
+</li>
+<li><p class="first">import a changeset from an hgweb server:</p>
+<pre class="literal-block">
+hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
+</pre>
+</li>
+<li><p class="first">import all the patches in an Unix-style mbox:</p>
+<pre class="literal-block">
+hg import incoming-patches.mbox
+</pre>
+</li>
+<li><p class="first">attempt to exactly restore an exported changeset (not always
+possible):</p>
+<pre class="literal-block">
+hg import --exact proposed-fix.patch
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--strip</span></kbd></td>
+<td>directory strip option for patch. This has the same meaning as the corresponding patch option (default: 1)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--base</span></kbd></td>
+<td>base path (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>invoke editor on commit messages</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>skip check for outstanding uncommitted changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-commit</span></kbd></td>
+<td>don't commit, just update the working directory</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--bypass</span></kbd></td>
+<td>apply patch without touching the working directory</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--exact</span></kbd></td>
+<td>apply patch to the nodes from which it was generated</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">--import-branch</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>use any branch information in patch (implied by --exact)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-s</span>, <span class="option">--similarity</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td><p class="first">guess renamed files by similarity (0&lt;=s&lt;=100)</p>
+<p class="last">aliases: patch</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="incoming">
+<h2>incoming</h2>
+<pre class="literal-block">
+hg incoming [-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]
+</pre>
+<p>Show new changesets found in the specified path/URL or the default
+pull location. These are the changesets that would have been pulled
+if a pull at the time you issued this command.</p>
+<p>For remote repository, using --bundle avoids downloading the
+changesets twice if the incoming is followed by a pull.</p>
+<p>See pull for valid source format details.</p>
+<p>Returns 0 if there are incoming changes, 1 otherwise.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>run even if remote repository is unrelated</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-n</span>, <span class="option">--newest-first</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show newest record first</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--bundle</span></kbd></td>
+<td>file to store the bundles into</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a remote changeset intended to be added</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--bookmarks</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>compare bookmarks</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>a specific branch you would like to pull</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patch</span></kbd></td>
+<td>show patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--limit</span></kbd></td>
+<td>limit number of changes displayed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-M</span>, <span class="option">--no-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not show merges</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-G</span>, <span class="option">--graph</span></kbd></td>
+<td>show the revision DAG</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td><p class="first">recurse into subrepositories</p>
+<p class="last">aliases: in</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="init">
+<h2>init</h2>
+<pre class="literal-block">
+hg init [-e CMD] [--remotecmd CMD] [DEST]
+</pre>
+<p>Initialize a new repository in the given directory. If the given
+directory does not exist, it will be created.</p>
+<p>If no directory is given, the current directory is used.</p>
+<p>It is possible to specify an <tt class="docutils literal"><span class="pre">ssh://</span></tt> URL as the destination.
+See <a class="reference external" href="hg.1.html#urls"><tt class="docutils literal">hg help urls</tt></a> for more information.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="locate">
+<h2>locate</h2>
+<pre class="literal-block">
+hg locate [OPTION]... [PATTERN]...
+</pre>
+<p>Print files under Mercurial control in the working directory whose
+names match the given patterns.</p>
+<p>By default, this command searches all directories in the working
+directory. To search just the current directory and its
+subdirectories, use &quot;--include .&quot;.</p>
+<p>If no patterns are given to match, this command prints the names
+of all files under Mercurial control in the working directory.</p>
+<p>If you want to feed the output of this command into the &quot;xargs&quot;
+command, use the -0 option to both this command and &quot;xargs&quot;. This
+will avoid the problem of &quot;xargs&quot; treating single filenames that
+contain whitespace as multiple filenames.</p>
+<p>Returns 0 if a match is found, 1 otherwise.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>search the repository as it is in REV</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-0</span>, <span class="option">--print0</span></kbd></td>
+<td>end filenames with NUL, for use with xargs</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--fullpath</span></kbd></td>
+<td>print complete paths from the filesystem root</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="log">
+<h2>log</h2>
+<pre class="literal-block">
+hg log [OPTION]... [FILE]
+</pre>
+<p>Print the revision history of the specified files or the entire
+project.</p>
+<p>If no revision range is specified, the default is <tt class="docutils literal">tip:0</tt> unless
+--follow is set, in which case the working directory parent is
+used as the starting revision.</p>
+<p>File history is shown without following rename or copy history of
+files. Use -f/--follow with a filename to follow history across
+renames and copies. --follow without a filename will only show
+ancestors or descendants of the starting revision.</p>
+<p>By default this command prints revision number and changeset id,
+tags, non-trivial parents, user, date and time, and a summary for
+each commit. When the -v/--verbose switch is used, the list of
+changed files and full commit message are shown.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">log -p/--patch may generate unexpected diff output for merge
+changesets, as it will only compare the merge changeset against
+its first parent. Also, only files different from BOTH parents
+will appear in files:.</p>
+</div>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">for performance reasons, log FILE may omit duplicate changes
+made on branches and will not show deletions. To see all
+changes including duplicates and deletions, use the --removed
+switch.</p>
+</div>
+<div class="verbose container">
+<p>Some examples:</p>
+<ul>
+<li><p class="first">changesets with full descriptions and file lists:</p>
+<pre class="literal-block">
+hg log -v
+</pre>
+</li>
+<li><p class="first">changesets ancestral to the working directory:</p>
+<pre class="literal-block">
+hg log -f
+</pre>
+</li>
+<li><p class="first">last 10 commits on the current branch:</p>
+<pre class="literal-block">
+hg log -l 10 -b .
+</pre>
+</li>
+<li><p class="first">changesets showing all modifications of a file, including removals:</p>
+<pre class="literal-block">
+hg log --removed file.c
+</pre>
+</li>
+<li><p class="first">all changesets that touch a directory, with diffs, excluding merges:</p>
+<pre class="literal-block">
+hg log -Mp lib/
+</pre>
+</li>
+<li><p class="first">all revision numbers that match a keyword:</p>
+<pre class="literal-block">
+hg log -k bug --template &quot;{rev}\n&quot;
+</pre>
+</li>
+<li><p class="first">check if a given changeset is included is a tagged release:</p>
+<pre class="literal-block">
+hg log -r &quot;a21ccf and ancestor(1.9)&quot;
+</pre>
+</li>
+<li><p class="first">find all changesets by some user in a date range:</p>
+<pre class="literal-block">
+hg log -k alice -d &quot;may 2008 to jul 2008&quot;
+</pre>
+</li>
+<li><p class="first">summary of all changesets after the last tag:</p>
+<pre class="literal-block">
+hg log -r &quot;last(tagged())::&quot; --template &quot;{desc|firstline}\n&quot;
+</pre>
+</li>
+</ul>
+</div>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>See <a class="reference external" href="hg.1.html#revisions"><tt class="docutils literal">hg help revisions</tt></a> and <a class="reference external" href="hg.1.html#revsets"><tt class="docutils literal">hg help revsets</tt></a> for more about
+specifying revisions.</p>
+<p>See <a class="reference external" href="hg.1.html#templates"><tt class="docutils literal">hg help templates</tt></a> for more about pre-packaged styles and
+specifying custom templates.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--follow</span></kbd></td>
+<td>follow changeset history, or file history across copies and renames</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--follow-first</span></kbd></td>
+<td>only follow the first parent of merge changesets (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>show revisions matching date spec</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-C</span>, <span class="option">--copies</span></kbd></td>
+<td>show copied files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keyword</span></kbd></td>
+<td>do case-insensitive search for a given text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>show the specified revision or range</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--removed</span></kbd></td>
+<td>include revisions where files were removed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-m</span>, <span class="option">--only-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show only merges (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>revisions committed by user</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--only-branch</span></kbd></td>
+<td>show only changesets within the given named branch (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>show changesets within the given named branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-P</span>, <span class="option">--prune</span></kbd></td>
+<td>do not display revision or any of its ancestors</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--hidden</span></kbd></td>
+<td>show hidden changesets (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patch</span></kbd></td>
+<td>show patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--limit</span></kbd></td>
+<td>limit number of changes displayed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-M</span>, <span class="option">--no-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not show merges</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-G</span>, <span class="option">--graph</span></kbd></td>
+<td>show the revision DAG</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td><p class="first">exclude names matching the given patterns</p>
+<p class="last">aliases: history</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="manifest">
+<h2>manifest</h2>
+<pre class="literal-block">
+hg manifest [-r REV]
+</pre>
+<p>Print a list of version controlled files for the given revision.
+If no revision is given, the first parent of the working directory
+is used, or the null revision if no revision is checked out.</p>
+<p>With -v, print file permissions, symlink and executable bits.
+With --debug, print file revision hashes.</p>
+<p>If option --all is specified, the list of all files from all revisions
+is printed. This includes deleted and renamed files.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision to display</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--all</span></kbd></td>
+<td>list files from all revisions</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="merge">
+<h2>merge</h2>
+<pre class="literal-block">
+hg merge [-P] [-f] [[-r] REV]
+</pre>
+<p>The current working directory is updated with all changes made in
+the requested revision since the last common predecessor revision.</p>
+<p>Files that changed between either parent are marked as changed for
+the next commit and a commit must be performed before any further
+updates to the repository are allowed. The next commit will have
+two parents.</p>
+<p><tt class="docutils literal"><span class="pre">--tool</span></tt> can be used to specify the merge tool used for file
+merges. It overrides the HGMERGE environment variable and your
+configuration files. See <a class="reference external" href="hg.1.html#merge-tools"><tt class="docutils literal">hg help <span class="pre">merge-tools</span></tt></a> for options.</p>
+<p>If no revision is specified, the working directory's parent is a
+head revision, and the current branch contains exactly one other
+head, the other head is merged with by default. Otherwise, an
+explicit revision with which to merge with must be provided.</p>
+<p><a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve</tt></a> must be used to resolve unresolved files.</p>
+<p>To undo an uncommitted merge, use <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update <span class="pre">--clean</span> .</tt></a> which
+will check out a clean copy of the original merge parent, losing
+all changes.</p>
+<p>Returns 0 on success, 1 if there are unresolved files.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force a merge with outstanding changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision to merge</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-P</span>, <span class="option">--preview</span></kbd></td>
+<td>review revisions to merge (no merge is performed)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tool</span></kbd></td>
+<td>specify merge tool</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="outgoing">
+<h2>outgoing</h2>
+<pre class="literal-block">
+hg outgoing [-M] [-p] [-n] [-f] [-r REV]... [DEST]
+</pre>
+<p>Show changesets not found in the specified destination repository
+or the default push location. These are the changesets that would
+be pushed if a push was requested.</p>
+<p>See pull for details of valid destination formats.</p>
+<p>Returns 0 if there are outgoing changes, 1 otherwise.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>run even when the destination is unrelated</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a changeset intended to be included in the destination</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-n</span>, <span class="option">--newest-first</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show newest record first</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--bookmarks</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>compare bookmarks</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>a specific branch you would like to push</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patch</span></kbd></td>
+<td>show patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--limit</span></kbd></td>
+<td>limit number of changes displayed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-M</span>, <span class="option">--no-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not show merges</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-G</span>, <span class="option">--graph</span></kbd></td>
+<td>show the revision DAG</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td><p class="first">recurse into subrepositories</p>
+<p class="last">aliases: out</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="parents">
+<h2>parents</h2>
+<pre class="literal-block">
+hg parents [-r REV] [FILE]
+</pre>
+<p>Print the working directory's parent revisions. If a revision is
+given via -r/--rev, the parent of that revision will be printed.
+If a file argument is given, the revision in which the file was
+last changed (before the working directory revision or the
+argument to --rev if given) is printed.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>show parents of the specified revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="paths">
+<h2>paths</h2>
+<pre class="literal-block">
+hg paths [NAME]
+</pre>
+<p>Show definition of symbolic path name NAME. If no name is given,
+show definition of all available names.</p>
+<p>Option -q/--quiet suppresses all output when searching for NAME
+and shows only the path names when listing all definitions.</p>
+<p>Path names are defined in the [paths] section of your
+configuration file and in <tt class="docutils literal">/etc/mercurial/hgrc</tt>. If run inside a
+repository, <tt class="docutils literal">.hg/hgrc</tt> is used, too.</p>
+<p>The path names <tt class="docutils literal">default</tt> and <tt class="docutils literal"><span class="pre">default-push</span></tt> have a special
+meaning. When performing a push or pull operation, they are used
+as fallbacks if no location is specified on the command-line.
+When <tt class="docutils literal"><span class="pre">default-push</span></tt> is set, it will be used for push and
+<tt class="docutils literal">default</tt> will be used for pull; otherwise <tt class="docutils literal">default</tt> is used
+as the fallback for both. When cloning a repository, the clone
+source is written as <tt class="docutils literal">default</tt> in <tt class="docutils literal">.hg/hgrc</tt>. Note that
+<tt class="docutils literal">default</tt> and <tt class="docutils literal"><span class="pre">default-push</span></tt> apply to all inbound (e.g.
+<a class="reference external" href="hg.1.html#incoming"><tt class="docutils literal">hg incoming</tt></a>) and outbound (e.g. <a class="reference external" href="hg.1.html#outgoing"><tt class="docutils literal">hg outgoing</tt></a>, <a class="reference external" href="hg.1.html#email"><tt class="docutils literal">hg email</tt></a> and
+<a class="reference external" href="hg.1.html#bundle"><tt class="docutils literal">hg bundle</tt></a>) operations.</p>
+<p>See <a class="reference external" href="hg.1.html#urls"><tt class="docutils literal">hg help urls</tt></a> for more information.</p>
+<p>Returns 0 on success.</p>
+</div>
+<div class="section" id="phase">
+<h2>phase</h2>
+<pre class="literal-block">
+hg phase [-p|-d|-s] [-f] [-r] REV...
+</pre>
+<p>With no argument, show the phase name of specified revisions.</p>
+<p>With one of -p/--public, -d/--draft or -s/--secret, change the
+phase value of the specified revisions.</p>
+<p>Unless -f/--force is specified, <a class="reference external" href="hg.1.html#phase"><tt class="docutils literal">hg phase</tt></a> won't move changeset from a
+lower phase to an higher phase. Phases are ordered as follows:</p>
+<pre class="literal-block">
+public &lt; draft &lt; secret
+</pre>
+<p>Return 0 on success, 1 if no phases were changed or some could not
+be changed.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--public</span></kbd></td>
+<td>set changeset phase to public</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--draft</span></kbd></td>
+<td>set changeset phase to draft</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--secret</span></kbd></td>
+<td>set changeset phase to secret</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>allow to move boundary backward</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>target revision</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="pull">
+<h2>pull</h2>
+<pre class="literal-block">
+hg pull [-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]
+</pre>
+<p>Pull changes from a remote repository to a local one.</p>
+<p>This finds all changes from the repository at the specified path
+or URL and adds them to a local repository (the current one unless
+-R is specified). By default, this does not update the copy of the
+project in the working directory.</p>
+<p>Use <a class="reference external" href="hg.1.html#incoming"><tt class="docutils literal">hg incoming</tt></a> if you want to see what would have been added
+by a pull at the time you issued this command. If you then decide
+to add those changes to the repository, you should use <a class="reference external" href="hg.1.html#pull"><tt class="docutils literal">hg pull
+<span class="pre">-r</span> X</tt></a> where <tt class="docutils literal">X</tt> is the last changeset listed by <a class="reference external" href="hg.1.html#incoming"><tt class="docutils literal">hg incoming</tt></a>.</p>
+<p>If SOURCE is omitted, the 'default' path will be used.
+See <a class="reference external" href="hg.1.html#urls"><tt class="docutils literal">hg help urls</tt></a> for more information.</p>
+<p>Returns 0 on success, 1 if an update had unresolved files.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--update</span></kbd></td>
+<td>update to new branch head if changesets were pulled</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>run even when remote repository is unrelated</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a remote changeset intended to be added</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-B</span>, <span class="option">--bookmark</span></kbd></td>
+<td>bookmark to pull</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>a specific branch you would like to pull</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="push">
+<h2>push</h2>
+<pre class="literal-block">
+hg push [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]
+</pre>
+<p>Push changesets from the local repository to the specified
+destination.</p>
+<p>This operation is symmetrical to pull: it is identical to a pull
+in the destination repository from the current one.</p>
+<p>By default, push will not allow creation of new heads at the
+destination, since multiple heads would make it unclear which head
+to use. In this situation, it is recommended to pull and merge
+before pushing.</p>
+<p>Use --new-branch if you want to allow push to create a new named
+branch that is not present at the destination. This allows you to
+only create a new branch without forcing other changes.</p>
+<p>Use -f/--force to override the default behavior and push all
+changesets on all branches.</p>
+<p>If -r/--rev is used, the specified revision and all its ancestors
+will be pushed to the remote repository.</p>
+<p>If -B/--bookmark is used, the specified bookmarked revision, its
+ancestors, and the bookmark will be pushed to the remote
+repository.</p>
+<p>Please see <a class="reference external" href="hg.1.html#urls"><tt class="docutils literal">hg help urls</tt></a> for important details about <tt class="docutils literal"><span class="pre">ssh://</span></tt>
+URLs. If DESTINATION is omitted, a default path will be used.</p>
+<p>Returns 0 if push was successful, 1 if nothing to push.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force push</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a changeset intended to be included in the destination</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-B</span>, <span class="option">--bookmark</span></kbd></td>
+<td>bookmark to push</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>a specific branch you would like to push</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--new-branch</span></kbd></td>
+<td>allow pushing a new branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="recover">
+<h2>recover</h2>
+<pre class="literal-block">
+hg recover
+</pre>
+<p>Recover from an interrupted commit or pull.</p>
+<p>This command tries to fix the repository status after an
+interrupted operation. It should only be necessary when Mercurial
+suggests it.</p>
+<p>Returns 0 if successful, 1 if nothing to recover or verify fails.</p>
+</div>
+<div class="section" id="remove">
+<h2>remove</h2>
+<pre class="literal-block">
+hg remove [OPTION]... FILE...
+</pre>
+<p>Schedule the indicated files for removal from the current branch.</p>
+<p>This command schedules the files to be removed at the next commit.
+To undo a remove before that, see <a class="reference external" href="hg.1.html#revert"><tt class="docutils literal">hg revert</tt></a>. To undo added
+files, see <a class="reference external" href="hg.1.html#forget"><tt class="docutils literal">hg forget</tt></a>.</p>
+<div class="verbose container">
+<p>-A/--after can be used to remove only files that have already
+been deleted, -f/--force can be used to force deletion, and -Af
+can be used to remove files from the next revision without
+deleting them from the working directory.</p>
+<p>The following table details the behavior of remove for different
+file states (columns) and option combinations (rows). The file
+states are Added [A], Clean [C], Modified [M] and Missing [!]
+(as reported by <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a>). The actions are Warn, Remove
+(from branch) and Delete (from disk):</p>
+<table border="1" class="docutils">
+<colgroup>
+<col width="47%" />
+<col width="13%" />
+<col width="13%" />
+<col width="13%" />
+<col width="13%" />
+</colgroup>
+<thead valign="bottom">
+<tr><th class="head">&nbsp;</th>
+<th class="head">&nbsp;</th>
+<th class="head">&nbsp;</th>
+<th class="head">&nbsp;</th>
+<th class="head">&nbsp;</th>
+</tr>
+</thead>
+<tbody valign="top">
+<tr><td>none</td>
+<td>W</td>
+<td>RD</td>
+<td>W</td>
+<td>R</td>
+</tr>
+<tr><td>-f</td>
+<td>R</td>
+<td>RD</td>
+<td>RD</td>
+<td>R</td>
+</tr>
+<tr><td>-A</td>
+<td>W</td>
+<td>W</td>
+<td>W</td>
+<td>R</td>
+</tr>
+<tr><td>-Af</td>
+<td>R</td>
+<td>R</td>
+<td>R</td>
+<td>R</td>
+</tr>
+</tbody>
+</table>
+<p>Note that remove never deletes files in Added [A] state from the
+working directory, not even if option --force is specified.</p>
+</div>
+<p>Returns 0 on success, 1 if any warnings encountered.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-A</span>, <span class="option">--after</span></kbd></td>
+<td>record delete for missing files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>remove (and delete) file even if added or modified</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td><p class="first">exclude names matching the given patterns</p>
+<p class="last">aliases: rm</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="rename">
+<h2>rename</h2>
+<pre class="literal-block">
+hg rename [OPTION]... SOURCE... DEST
+</pre>
+<p>Mark dest as copies of sources; mark sources for deletion. If dest
+is a directory, copies are put in that directory. If dest is a
+file, there can only be one source.</p>
+<p>By default, this command copies the contents of files as they
+exist in the working directory. If invoked with -A/--after, the
+operation is recorded, but no copying is performed.</p>
+<p>This command takes effect at the next commit. To undo a rename
+before that, see <a class="reference external" href="hg.1.html#revert"><tt class="docutils literal">hg revert</tt></a>.</p>
+<p>Returns 0 on success, 1 if errors are encountered.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-A</span>, <span class="option">--after</span></kbd></td>
+<td>record a rename that has already occurred</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>forcibly copy over an existing managed file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td><p class="first">do not perform actions, just print output</p>
+<p class="last">aliases: move mv</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="resolve">
+<h2>resolve</h2>
+<pre class="literal-block">
+hg resolve [OPTION]... [FILE]...
+</pre>
+<p>Merges with unresolved conflicts are often the result of
+non-interactive merging using the <tt class="docutils literal">internal:merge</tt> configuration
+setting, or a command-line merge tool like <tt class="docutils literal">diff3</tt>. The resolve
+command is used to manage the files involved in a merge, after
+<a class="reference external" href="hg.1.html#merge"><tt class="docutils literal">hg merge</tt></a> has been run, and before <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit</tt></a> is run (i.e. the
+working directory must have two parents). See <a class="reference external" href="hg.1.html#merge-tools"><tt class="docutils literal">hg help
+<span class="pre">merge-tools</span></tt></a> for information on configuring merge tools.</p>
+<p>The resolve command can be used in the following ways:</p>
+<ul class="simple">
+<li><a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve <span class="pre">[--tool</span> TOOL] <span class="pre">FILE...</span></tt></a>: attempt to re-merge the specified
+files, discarding any previous merge attempts. Re-merging is not
+performed for files already marked as resolved. Use <tt class="docutils literal"><span class="pre">--all/-a</span></tt>
+to select all unresolved files. <tt class="docutils literal"><span class="pre">--tool</span></tt> can be used to specify
+the merge tool used for the given files. It overrides the HGMERGE
+environment variable and your configuration files. Previous file
+contents are saved with a <tt class="docutils literal">.orig</tt> suffix.</li>
+<li><a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve <span class="pre">-m</span> [FILE]</tt></a>: mark a file as having been resolved
+(e.g. after having manually fixed-up the files). The default is
+to mark all unresolved files.</li>
+<li><a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve <span class="pre">-u</span> <span class="pre">[FILE]...</span></tt></a>: mark a file as unresolved. The
+default is to mark all resolved files.</li>
+<li><a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve <span class="pre">-l</span></tt></a>: list files which had or still have conflicts.
+In the printed list, <tt class="docutils literal">U</tt> = unresolved and <tt class="docutils literal">R</tt> = resolved.</li>
+</ul>
+<p>Note that Mercurial will not let you commit files with unresolved
+merge conflicts. You must use <a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve <span class="pre">-m</span> ...</tt></a> before you can
+commit after a conflicting merge.</p>
+<p>Returns 0 on success, 1 if any files fail a resolve attempt.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>select all unresolved files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--list</span></kbd></td>
+<td>list state of files needing merge</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--mark</span></kbd></td>
+<td>mark files as resolved</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--unmark</span></kbd></td>
+<td>mark files as unresolved</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-n</span>, <span class="option">--no-status</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>hide status prefix</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tool</span></kbd></td>
+<td>specify merge tool</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="revert">
+<h2>revert</h2>
+<pre class="literal-block">
+hg revert [OPTION]... [-r REV] [NAME]...
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">To check out earlier revisions, you should use <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update REV</tt></a>.
+To cancel an uncommitted merge (and lose your changes), use
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update <span class="pre">--clean</span> .</tt></a>.</p>
+</div>
+<p>With no revision specified, revert the specified files or directories
+to the contents they had in the parent of the working directory.
+This restores the contents of files to an unmodified
+state and unschedules adds, removes, copies, and renames. If the
+working directory has two parents, you must explicitly specify a
+revision.</p>
+<p>Using the -r/--rev or -d/--date options, revert the given files or
+directories to their states as of a specific revision. Because
+revert does not change the working directory parents, this will
+cause these files to appear modified. This can be helpful to &quot;back
+out&quot; some or all of an earlier change. See <a class="reference external" href="hg.1.html#backout"><tt class="docutils literal">hg backout</tt></a> for a
+related method.</p>
+<p>Modified files are saved with a .orig suffix before reverting.
+To disable these backups, use --no-backup.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>revert all changes when no arguments given</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>tipmost revision matching date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revert to the specified revision</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-C</span>, <span class="option">--no-backup</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not save backup copies of files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td>do not perform actions, just print output</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="rollback">
+<h2>rollback</h2>
+<pre class="literal-block">
+hg rollback
+</pre>
+<p>This command should be used with care. There is only one level of
+rollback, and there is no way to undo a rollback. It will also
+restore the dirstate at the time of the last transaction, losing
+any dirstate changes since that time. This command does not alter
+the working directory.</p>
+<p>Transactions are used to encapsulate the effects of all commands
+that create new changesets or propagate existing changesets into a
+repository.</p>
+<div class="verbose container">
+<p>For example, the following commands are transactional, and their
+effects can be rolled back:</p>
+<ul class="simple">
+<li>commit</li>
+<li>import</li>
+<li>pull</li>
+<li>push (with this repository as the destination)</li>
+<li>unbundle</li>
+</ul>
+<p>To avoid permanent data loss, rollback will refuse to rollback a
+commit transaction if it isn't checked out. Use --force to
+override this protection.</p>
+</div>
+<p>This command is not intended for use on public repositories. Once
+changes are visible for pull by other users, rolling a transaction
+back locally is ineffective (someone else may already have pulled
+the changes). Furthermore, a race is possible with readers of the
+repository; for example an in-progress pull from the repository
+may fail if a rollback is performed.</p>
+<p>Returns 0 on success, 1 if no rollback data is available.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--dry-run</span></kbd></td>
+<td>do not perform actions, just print output</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>ignore safety measures</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="root">
+<h2>root</h2>
+<pre class="literal-block">
+hg root
+</pre>
+<p>Print the root directory of the current repository.</p>
+<p>Returns 0 on success.</p>
+</div>
+<div class="section" id="serve">
+<h2>serve</h2>
+<pre class="literal-block">
+hg serve [OPTION]...
+</pre>
+<p>Start a local HTTP repository browser and pull server. You can use
+this for ad-hoc sharing and browsing of repositories. It is
+recommended to use a real web server to serve a repository for
+longer periods of time.</p>
+<p>Please note that the server does not implement access control.
+This means that, by default, anybody can read from the server and
+nobody can write to it by default. Set the <tt class="docutils literal">web.allow_push</tt>
+option to <tt class="docutils literal">*</tt> to allow everybody to push to the server. You
+should use a real web server if you need to authenticate users.</p>
+<p>By default, the server logs accesses to stdout and errors to
+stderr. Use the -A/--accesslog and -E/--errorlog options to log to
+files.</p>
+<p>To have the server choose a free port number to listen on, specify
+a port number of 0; in this case, the server will print the port
+number it uses.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-A</span>, <span class="option">--accesslog</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>name of access log file to write to</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--daemon</span></kbd></td>
+<td>run server in background</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">--daemon-pipefds</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>used internally by daemon mode</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-E</span>, <span class="option">--errorlog</span></kbd></td>
+<td>name of error log file to write to</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--port</span></kbd></td>
+<td>port to listen on (default: 8000)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--address</span></kbd></td>
+<td>address to listen on (default: all interfaces)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--prefix</span></kbd></td>
+<td>prefix path to serve from (default: server root)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--name</span></kbd></td>
+<td>name to show in web pages (default: working directory)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--web-conf</span></kbd></td>
+<td>name of the hgweb config file (see &quot;hg help hgweb&quot;)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--webdir-conf</span></kbd></td>
+<td>name of the hgweb config file (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--pid-file</span></kbd></td>
+<td>name of file to write process ID to</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stdio</span></kbd></td>
+<td>for remote clients</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--cmdserver</span></kbd></td>
+<td>for remote clients</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-t</span>, <span class="option">--templates</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>web templates to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>template style to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-6</span>, <span class="option">--ipv6</span></kbd></td>
+<td>use IPv6 in addition to IPv4</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--certificate</span></kbd></td>
+<td>SSL certificate file</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="showconfig">
+<h2>showconfig</h2>
+<pre class="literal-block">
+hg showconfig [-u] [NAME]...
+</pre>
+<p>With no arguments, print names and values of all config items.</p>
+<p>With one argument of the form section.name, print just the value
+of that config item.</p>
+<p>With multiple arguments, print names and values of all config
+items with matching section names.</p>
+<p>With --debug, the source (filename and line number) is printed
+for each config item.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-u</span>, <span class="option">--untrusted</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td><p class="first">show untrusted configuration options</p>
+<p class="last">aliases: debugconfig</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="status">
+<h2>status</h2>
+<pre class="literal-block">
+hg status [OPTION]... [FILE]...
+</pre>
+<p>Show status of files in the repository. If names are given, only
+files that match are shown. Files that are clean or ignored or
+the source of a copy/move operation, are not listed unless
+-c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
+Unless options described with &quot;show only ...&quot; are given, the
+options -mardu are used.</p>
+<p>Option -q/--quiet hides untracked (unknown and ignored) files
+unless explicitly requested with -u/--unknown or -i/--ignored.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">status may appear to disagree with diff if permissions have
+changed or a merge has occurred. The standard diff format does
+not report permission changes and diff only reports changes
+relative to one merge parent.</p>
+</div>
+<p>If one revision is given, it is used as the base revision.
+If two revisions are given, the differences between them are
+shown. The --change option can also be used as a shortcut to list
+the changed files of a revision from its first parent.</p>
+<p>The codes used to show the status of files are:</p>
+<pre class="literal-block">
+M = modified
+A = added
+R = removed
+C = clean
+! = missing (deleted by non-hg command, but still tracked)
+? = not tracked
+I = ignored
+ = origin of the previous file listed as A (added)
+</pre>
+<div class="verbose container">
+<p>Examples:</p>
+<ul>
+<li><p class="first">show changes in the working directory relative to a
+changeset:</p>
+<pre class="literal-block">
+hg status --rev 9353
+</pre>
+</li>
+<li><p class="first">show all changes including copies in an existing changeset:</p>
+<pre class="literal-block">
+hg status --copies --change 9353
+</pre>
+</li>
+<li><p class="first">get a NUL separated list of added files, suitable for xargs:</p>
+<pre class="literal-block">
+hg status -an0
+</pre>
+</li>
+</ul>
+</div>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-A</span>, <span class="option">--all</span></kbd></td>
+<td>show status of all files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--modified</span></kbd></td>
+<td>show only modified files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--added</span></kbd></td>
+<td>show only added files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--removed</span></kbd></td>
+<td>show only removed files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--deleted</span></kbd></td>
+<td>show only deleted (but tracked) files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--clean</span></kbd></td>
+<td>show only files without changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--unknown</span></kbd></td>
+<td>show only unknown (not tracked) files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-i</span>, <span class="option">--ignored</span></kbd></td>
+<td>show only ignored files</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-n</span>, <span class="option">--no-status</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>hide status prefix</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-C</span>, <span class="option">--copies</span></kbd></td>
+<td>show source of copied files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-0</span>, <span class="option">--print0</span></kbd></td>
+<td>end filenames with NUL, for use with xargs</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--rev</span></kbd></td>
+<td>show difference from revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--change</span></kbd></td>
+<td>list the changed files of a revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td><p class="first">recurse into subrepositories</p>
+<p class="last">aliases: st</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="summary">
+<h2>summary</h2>
+<pre class="literal-block">
+hg summary [--remote]
+</pre>
+<p>This generates a brief summary of the working directory state,
+including parents, branch, commit status, and available updates.</p>
+<p>With the --remote option, this will check the default paths for
+incoming and outgoing changes. This can be time-consuming.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--remote</span></kbd></td>
+<td><p class="first">check for push and pull</p>
+<p class="last">aliases: sum</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="tag">
+<h2>tag</h2>
+<pre class="literal-block">
+hg tag [-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...
+</pre>
+<p>Name a particular revision using &lt;name&gt;.</p>
+<p>Tags are used to name particular revisions of the repository and are
+very useful to compare different revisions, to go back to significant
+earlier versions or to mark branch points as releases, etc. Changing
+an existing tag is normally disallowed; use -f/--force to override.</p>
+<p>If no revision is given, the parent of the working directory is
+used, or tip if no revision is checked out.</p>
+<p>To facilitate version control, distribution, and merging of tags,
+they are stored as a file named &quot;.hgtags&quot; which is managed similarly
+to other project files and can be hand-edited if necessary. This
+also means that tagging creates a new commit. The file
+&quot;.hg/localtags&quot; is used for local tags (not shared among
+repositories).</p>
+<p>Tag commits are usually made at the head of a branch. If the parent
+of the working directory is not a branch head, <a class="reference external" href="hg.1.html#tag"><tt class="docutils literal">hg tag</tt></a> aborts; use
+-f/--force to force the tag commit to be based on a non-head
+changeset.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Since tag names have priority over branch names during revision
+lookup, using an existing branch name as a tag name is discouraged.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force tag</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--local</span></kbd></td>
+<td>make the tag local</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision to tag</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remove</span></kbd></td>
+<td>remove a tag</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>edit commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use &lt;text&gt; as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="tags">
+<h2>tags</h2>
+<pre class="literal-block">
+hg tags
+</pre>
+<p>This lists both regular and local tags. When the -v/--verbose
+switch is used, a third column &quot;local&quot; is printed for local tags.</p>
+<p>Returns 0 on success.</p>
+</div>
+<div class="section" id="tip">
+<h2>tip</h2>
+<pre class="literal-block">
+hg tip [-p] [-g]
+</pre>
+<p>The tip revision (usually just called the tip) is the changeset
+most recently added to the repository (and therefore the most
+recently changed head).</p>
+<p>If you have just made a commit, that commit will be the tip. If
+you have just pulled changes from another repository, the tip of
+that repository becomes the current tip. The &quot;tip&quot; tag is special
+and cannot be renamed or assigned to a different changeset.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patch</span></kbd></td>
+<td>show patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="unbundle">
+<h2>unbundle</h2>
+<pre class="literal-block">
+hg unbundle [-u] FILE...
+</pre>
+<p>Apply one or more compressed changegroup files generated by the
+bundle command.</p>
+<p>Returns 0 on success, 1 if an update has unresolved files.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--update</span></kbd></td>
+<td>update to new branch head if changesets were unbundled</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="update">
+<h2>update</h2>
+<pre class="literal-block">
+hg update [-c] [-C] [-d DATE] [[-r] REV]
+</pre>
+<p>Update the repository's working directory to the specified
+changeset. If no changeset is specified, update to the tip of the
+current named branch and move the current bookmark (see <a class="reference external" href="hg.1.html#bookmarks"><tt class="docutils literal">hg help
+bookmarks</tt></a>).</p>
+<p>Update sets the working directory's parent revison to the specified
+changeset (see <a class="reference external" href="hg.1.html#parents"><tt class="docutils literal">hg help parents</tt></a>).</p>
+<p>If the changeset is not a descendant or ancestor of the working
+directory's parent, the update is aborted. With the -c/--check
+option, the working directory is checked for uncommitted changes; if
+none are found, the working directory is updated to the specified
+changeset.</p>
+<div class="verbose container">
+<p>The following rules apply when the working directory contains
+uncommitted changes:</p>
+<ol class="arabic simple">
+<li>If neither -c/--check nor -C/--clean is specified, and if
+the requested changeset is an ancestor or descendant of
+the working directory's parent, the uncommitted changes
+are merged into the requested changeset and the merged
+result is left uncommitted. If the requested changeset is
+not an ancestor or descendant (that is, it is on another
+branch), the update is aborted and the uncommitted changes
+are preserved.</li>
+<li>With the -c/--check option, the update is aborted and the
+uncommitted changes are preserved.</li>
+<li>With the -C/--clean option, uncommitted changes are discarded and
+the working directory is updated to the requested changeset.</li>
+</ol>
+</div>
+<p>To cancel an uncommitted merge (and lose your changes), use
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update <span class="pre">--clean</span> .</tt></a>.</p>
+<p>Use null as the changeset to remove the working directory (like
+<a class="reference external" href="hg.1.html#clone"><tt class="docutils literal">hg clone <span class="pre">-U</span></tt></a>).</p>
+<p>If you want to revert just one file to an older revision, use
+<a class="reference external" href="hg.1.html#revert"><tt class="docutils literal">hg revert <span class="pre">[-r</span> REV] NAME</tt></a>.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Returns 0 on success, 1 if there are unresolved files.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-C</span>, <span class="option">--clean</span></kbd></td>
+<td>discard uncommitted changes (no backup)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--check</span></kbd></td>
+<td>update across branches if no uncommitted changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>tipmost revision matching date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td><p class="first">revision</p>
+<p class="last">aliases: up checkout co</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="verify">
+<h2>verify</h2>
+<pre class="literal-block">
+hg verify
+</pre>
+<p>Verify the integrity of the current repository.</p>
+<p>This will perform an extensive check of the repository's
+integrity, validating the hashes and checksums of each entry in
+the changelog, manifest, and tracked files, as well as the
+integrity of their crosslinks and indices.</p>
+<p>Returns 0 on success, 1 if errors are encountered.</p>
+</div>
+<div class="section" id="version">
+<h2>version</h2>
+<pre class="literal-block">
+hg version
+</pre>
+<p>output version and copyright information</p>
+</div>
+</div>
+<div class="section" id="date-formats">
+<span id="dates"></span><h1><a class="toc-backref" href="#contents">Date Formats</a></h1>
+<p>Some commands allow the user to specify a date, e.g.:</p>
+<ul class="simple">
+<li>backout, commit, import, tag: Specify the commit date.</li>
+<li>log, revert, update: Select revision(s) by date.</li>
+</ul>
+<p>Many date formats are valid. Here are some examples:</p>
+<ul class="simple">
+<li><tt class="docutils literal">Wed Dec 6 13:18:29 2006</tt> (local timezone assumed)</li>
+<li><tt class="docutils literal">Dec 6 13:18 <span class="pre">-0600</span></tt> (year assumed, time offset provided)</li>
+<li><tt class="docutils literal">Dec 6 13:18 UTC</tt> (UTC and GMT are aliases for +0000)</li>
+<li><tt class="docutils literal">Dec 6</tt> (midnight)</li>
+<li><tt class="docutils literal">13:18</tt> (today assumed)</li>
+<li><tt class="docutils literal">3:39</tt> (3:39AM assumed)</li>
+<li><tt class="docutils literal">3:39pm</tt> (15:39)</li>
+<li><tt class="docutils literal"><span class="pre">2006-12-06</span> 13:18:29</tt> (ISO 8601 format)</li>
+<li><tt class="docutils literal"><span class="pre">2006-12-6</span> 13:18</tt></li>
+<li><tt class="docutils literal"><span class="pre">2006-12-6</span></tt></li>
+<li><tt class="docutils literal"><span class="pre">12-6</span></tt></li>
+<li><tt class="docutils literal">12/6</tt></li>
+<li><tt class="docutils literal">12/6/6</tt> (Dec 6 2006)</li>
+</ul>
+<p>Lastly, there is Mercurial's internal format:</p>
+<ul class="simple">
+<li><tt class="docutils literal">1165432709 0</tt> (Wed Dec 6 13:18:29 2006 UTC)</li>
+</ul>
+<p>This is the internal representation format for dates. The first number
+is the number of seconds since the epoch (1970-01-01 00:00 UTC). The
+second is the offset of the local timezone, in seconds west of UTC
+(negative if the timezone is east of UTC).</p>
+<p>The log command also accepts date ranges:</p>
+<ul class="simple">
+<li><tt class="docutils literal">&lt;DATE</tt> - at or before a given date/time</li>
+<li><tt class="docutils literal">&gt;DATE</tt> - on or after a given date/time</li>
+<li><tt class="docutils literal">DATE to DATE</tt> - a date range, inclusive</li>
+<li><tt class="docutils literal"><span class="pre">-DAYS</span></tt> - within a given number of days of today</li>
+</ul>
+</div>
+<div class="section" id="diff-formats">
+<span id="diffs"></span><h1><a class="toc-backref" href="#contents">Diff Formats</a></h1>
+<p>Mercurial's default format for showing changes between two versions of
+a file is compatible with the unified format of GNU diff, which can be
+used by GNU patch and many other standard tools.</p>
+<p>While this standard format is often enough, it does not encode the
+following information:</p>
+<ul class="simple">
+<li>executable status and other permission bits</li>
+<li>copy or rename information</li>
+<li>changes in binary files</li>
+<li>creation or deletion of empty files</li>
+</ul>
+<p>Mercurial also supports the extended diff format from the git VCS
+which addresses these limitations. The git diff format is not produced
+by default because a few widespread tools still do not understand this
+format.</p>
+<p>This means that when generating diffs from a Mercurial repository
+(e.g. with <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export</tt></a>), you should be careful about things like file
+copies and renames or other things mentioned above, because when
+applying a standard diff to a different repository, this extra
+information is lost. Mercurial's internal operations (like push and
+pull) are not affected by this, because they use an internal binary
+format for communicating changes.</p>
+<p>To make Mercurial produce the git extended diff format, use the --git
+option available for many commands, or set 'git = True' in the [diff]
+section of your configuration file. You do not need to set this option
+when importing diffs in this format or using them in the mq extension.</p>
+</div>
+<div class="section" id="environment-variables">
+<span id="env"></span><span id="environment"></span><h1><a class="toc-backref" href="#contents">Environment Variables</a></h1>
+<dl class="docutils">
+<dt>HG</dt>
+<dd>Path to the 'hg' executable, automatically passed when running
+hooks, extensions or external tools. If unset or empty, this is
+the hg executable's name if it's frozen, or an executable named
+'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on
+Windows) is searched.</dd>
+<dt>HGEDITOR</dt>
+<dd><p class="first">This is the name of the editor to run when committing. See EDITOR.</p>
+<p class="last">(deprecated, use configuration file)</p>
+</dd>
+<dt>HGENCODING</dt>
+<dd>This overrides the default locale setting detected by Mercurial.
+This setting is used to convert data including usernames,
+changeset descriptions, tag names, and branches. This setting can
+be overridden with the --encoding command-line option.</dd>
+<dt>HGENCODINGMODE</dt>
+<dd>This sets Mercurial's behavior for handling unknown characters
+while transcoding user input. The default is &quot;strict&quot;, which
+causes Mercurial to abort if it can't map a character. Other
+settings include &quot;replace&quot;, which replaces unknown characters, and
+&quot;ignore&quot;, which drops them. This setting can be overridden with
+the --encodingmode command-line option.</dd>
+<dt>HGENCODINGAMBIGUOUS</dt>
+<dd>This sets Mercurial's behavior for handling characters with
+&quot;ambiguous&quot; widths like accented Latin characters with East Asian
+fonts. By default, Mercurial assumes ambiguous characters are
+narrow, set this variable to &quot;wide&quot; if such characters cause
+formatting problems.</dd>
+<dt>HGMERGE</dt>
+<dd><p class="first">An executable to use for resolving merge conflicts. The program
+will be executed with three arguments: local file, remote file,
+ancestor file.</p>
+<p class="last">(deprecated, use configuration file)</p>
+</dd>
+<dt>HGRCPATH</dt>
+<dd><p class="first">A list of files or directories to search for configuration
+files. Item separator is &quot;:&quot; on Unix, &quot;;&quot; on Windows. If HGRCPATH
+is not set, platform default search path is used. If empty, only
+the .hg/hgrc from the current repository is read.</p>
+<p>For each element in HGRCPATH:</p>
+<ul class="last simple">
+<li>if it's a directory, all files ending with .rc are added</li>
+<li>otherwise, the file itself will be added</li>
+</ul>
+</dd>
+<dt>HGPLAIN</dt>
+<dd><p class="first">When set, this disables any configuration settings that might
+change Mercurial's default output. This includes encoding,
+defaults, verbose mode, debug mode, quiet mode, tracebacks, and
+localization. This can be useful when scripting against Mercurial
+in the face of existing user configuration.</p>
+<p class="last">Equivalent options set via command line flags or environment
+variables are not overridden.</p>
+</dd>
+<dt>HGPLAINEXCEPT</dt>
+<dd><p class="first">This is a comma-separated list of features to preserve when
+HGPLAIN is enabled. Currently the only value supported is &quot;i18n&quot;,
+which preserves internationalization in plain mode.</p>
+<p class="last">Setting HGPLAINEXCEPT to anything (even an empty string) will
+enable plain mode.</p>
+</dd>
+<dt>HGUSER</dt>
+<dd><p class="first">This is the string used as the author of a commit. If not set,
+available values will be considered in this order:</p>
+<ul class="simple">
+<li>HGUSER (deprecated)</li>
+<li>configuration files from the HGRCPATH</li>
+<li>EMAIL</li>
+<li>interactive prompt</li>
+<li>LOGNAME (with <tt class="docutils literal">&#64;hostname</tt> appended)</li>
+</ul>
+<p class="last">(deprecated, use configuration file)</p>
+</dd>
+<dt>EMAIL</dt>
+<dd>May be used as the author of a commit; see HGUSER.</dd>
+<dt>LOGNAME</dt>
+<dd>May be used as the author of a commit; see HGUSER.</dd>
+<dt>VISUAL</dt>
+<dd>This is the name of the editor to use when committing. See EDITOR.</dd>
+<dt>EDITOR</dt>
+<dd>Sometimes Mercurial needs to open a text file in an editor for a
+user to modify, for example when writing commit messages. The
+editor it uses is determined by looking at the environment
+variables HGEDITOR, VISUAL and EDITOR, in that order. The first
+non-empty one is chosen. If all of them are empty, the editor
+defaults to 'vi'.</dd>
+<dt>PYTHONPATH</dt>
+<dd>This is used by Python to find imported modules and may need to be
+set appropriately if this Mercurial is not installed system-wide.</dd>
+</dl>
+</div>
+<div class="section" id="using-additional-features">
+<span id="extensions"></span><h1><a class="toc-backref" href="#contents">Using Additional Features</a></h1>
+<p>Mercurial has the ability to add new features through the use of
+extensions. Extensions may add new commands, add options to
+existing commands, change the default behavior of commands, or
+implement hooks.</p>
+<p>Extensions are not loaded by default for a variety of reasons:
+they can increase startup overhead; they may be meant for advanced
+usage only; they may provide potentially dangerous abilities (such
+as letting you destroy or modify history); they might not be ready
+for prime time; or they may alter some usual behaviors of stock
+Mercurial. It is thus up to the user to activate extensions as
+needed.</p>
+<p>To enable the &quot;foo&quot; extension, either shipped with Mercurial or in the
+Python search path, create an entry for it in your configuration file,
+like this:</p>
+<pre class="literal-block">
+[extensions]
+foo =
+</pre>
+<p>You may also specify the full path to an extension:</p>
+<pre class="literal-block">
+[extensions]
+myfeature = ~/.hgext/myfeature.py
+</pre>
+<p>To explicitly disable an extension enabled in a configuration file of
+broader scope, prepend its path with !:</p>
+<pre class="literal-block">
+[extensions]
+# disabling extension bar residing in /path/to/extension/bar.py
+bar = !/path/to/extension/bar.py
+# ditto, but no path was supplied for extension baz
+baz = !
+</pre>
+<p>disabled extensions:</p>
+<blockquote>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">acl:</th><td class="field-body">hooks for controlling repository access</td>
+</tr>
+<tr class="field"><th class="field-name">bugzilla:</th><td class="field-body">hooks for integrating with the Bugzilla bug tracker</td>
+</tr>
+<tr class="field"><th class="field-name">children:</th><td class="field-body">command to display child changesets (DEPRECATED)</td>
+</tr>
+<tr class="field"><th class="field-name">churn:</th><td class="field-body">command to display statistics about repository history</td>
+</tr>
+<tr class="field"><th class="field-name">color:</th><td class="field-body">colorize output from some commands</td>
+</tr>
+<tr class="field"><th class="field-name">convert:</th><td class="field-body">import revisions from foreign VCS repositories into Mercurial</td>
+</tr>
+<tr class="field"><th class="field-name">eol:</th><td class="field-body">automatically manage newlines in repository files</td>
+</tr>
+<tr class="field"><th class="field-name">extdiff:</th><td class="field-body">command to allow external programs to compare revisions</td>
+</tr>
+<tr class="field"><th class="field-name">factotum:</th><td class="field-body">http authentication with factotum</td>
+</tr>
+<tr class="field"><th class="field-name">fetch:</th><td class="field-body">pull, update and merge in one command (DEPRECATED)</td>
+</tr>
+<tr class="field"><th class="field-name">gpg:</th><td class="field-body">commands to sign and verify changesets</td>
+</tr>
+<tr class="field"><th class="field-name">graphlog:</th><td class="field-body">command to view revision graphs from a shell</td>
+</tr>
+<tr class="field"><th class="field-name">hgcia:</th><td class="field-body">hooks for integrating with the CIA.vc notification service</td>
+</tr>
+<tr class="field"><th class="field-name">hgk:</th><td class="field-body">browse the repository in a graphical way</td>
+</tr>
+<tr class="field"><th class="field-name">highlight:</th><td class="field-body">syntax highlighting for hgweb (requires Pygments)</td>
+</tr>
+<tr class="field"><th class="field-name">histedit:</th><td class="field-body">interactive history editing</td>
+</tr>
+<tr class="field"><th class="field-name">inotify:</th><td class="field-body">accelerate status report using Linux's inotify service</td>
+</tr>
+<tr class="field"><th class="field-name">interhg:</th><td class="field-body">expand expressions into changelog and summaries</td>
+</tr>
+<tr class="field"><th class="field-name">keyword:</th><td class="field-body">expand keywords in tracked files</td>
+</tr>
+<tr class="field"><th class="field-name">largefiles:</th><td class="field-body">track large binary files</td>
+</tr>
+<tr class="field"><th class="field-name">mq:</th><td class="field-body">manage a stack of patches</td>
+</tr>
+<tr class="field"><th class="field-name">notify:</th><td class="field-body">hooks for sending email push notifications</td>
+</tr>
+<tr class="field"><th class="field-name">pager:</th><td class="field-body">browse command output with an external pager</td>
+</tr>
+<tr class="field"><th class="field-name">patchbomb:</th><td class="field-body">command to send changesets as (a series of) patch emails</td>
+</tr>
+<tr class="field"><th class="field-name">progress:</th><td class="field-body">show progress bars for some actions</td>
+</tr>
+<tr class="field"><th class="field-name">purge:</th><td class="field-body">command to delete untracked files from the working directory</td>
+</tr>
+<tr class="field"><th class="field-name">rebase:</th><td class="field-body">command to move sets of revisions to a different ancestor</td>
+</tr>
+<tr class="field"><th class="field-name">record:</th><td class="field-body">commands to interactively select changes for commit/qrefresh</td>
+</tr>
+<tr class="field"><th class="field-name">relink:</th><td class="field-body">recreates hardlinks between repository clones</td>
+</tr>
+<tr class="field"><th class="field-name">schemes:</th><td class="field-body">extend schemes with shortcuts to repository swarms</td>
+</tr>
+<tr class="field"><th class="field-name">share:</th><td class="field-body">share a common history between several working directories</td>
+</tr>
+<tr class="field"><th class="field-name">transplant:</th><td class="field-body">command to transplant changesets from another branch</td>
+</tr>
+<tr class="field"><th class="field-name">win32mbcs:</th><td class="field-body">allow the use of MBCS paths with problematic encodings</td>
+</tr>
+<tr class="field"><th class="field-name">win32text:</th><td class="field-body">perform automatic newline conversion</td>
+</tr>
+<tr class="field"><th class="field-name">zeroconf:</th><td class="field-body">discover and advertise repositories on the local network</td>
+</tr>
+</tbody>
+</table>
+</blockquote>
+</div>
+<div class="section" id="specifying-file-sets">
+<span id="fileset"></span><span id="filesets"></span><h1><a class="toc-backref" href="#contents">Specifying File Sets</a></h1>
+<p>Mercurial supports a functional language for selecting a set of
+files.</p>
+<p>Like other file patterns, this pattern type is indicated by a prefix,
+'set:'. The language supports a number of predicates which are joined
+by infix operators. Parenthesis can be used for grouping.</p>
+<p>Identifiers such as filenames or patterns must be quoted with single
+or double quotes if they contain characters outside of
+<tt class="docutils literal"><span class="pre">[.*{}[]?/\_a-zA-Z0-9\x80-\xff]</span></tt> or if they match one of the
+predefined predicates. This generally applies to file patterns other
+than globs and arguments for predicates.</p>
+<p>Special characters can be used in quoted identifiers by escaping them,
+e.g., <tt class="docutils literal">\n</tt> is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with <tt class="docutils literal">r</tt>, e.g. <tt class="docutils literal"><span class="pre">r'...'</span></tt>.</p>
+<p>There is a single prefix operator:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">not x</tt></dt>
+<dd>Files not in x. Short form is <tt class="docutils literal">! x</tt>.</dd>
+</dl>
+<p>These are the supported infix operators:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">x and y</tt></dt>
+<dd>The intersection of files in x and y. Short form is <tt class="docutils literal">x &amp; y</tt>.</dd>
+<dt><tt class="docutils literal">x or y</tt></dt>
+<dd>The union of files in x and y. There are two alternative short
+forms: <tt class="docutils literal">x | y</tt> and <tt class="docutils literal">x + y</tt>.</dd>
+<dt><tt class="docutils literal">x - y</tt></dt>
+<dd>Files in x but not in y.</dd>
+</dl>
+<p>The following predicates are supported:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">added()</tt></dt>
+<dd>File that is added according to status.</dd>
+<dt><tt class="docutils literal">binary()</tt></dt>
+<dd>File that appears to be binary (contains NUL bytes).</dd>
+<dt><tt class="docutils literal">clean()</tt></dt>
+<dd>File that is clean according to status.</dd>
+<dt><tt class="docutils literal">copied()</tt></dt>
+<dd>File that is recorded as being copied.</dd>
+<dt><tt class="docutils literal">deleted()</tt></dt>
+<dd>File that is deleted according to status.</dd>
+<dt><tt class="docutils literal">encoding(name)</tt></dt>
+<dd>File can be successfully decoded with the given character
+encoding. May not be useful for encodings other than ASCII and
+UTF-8.</dd>
+<dt><tt class="docutils literal">exec()</tt></dt>
+<dd>File that is marked as executable.</dd>
+<dt><tt class="docutils literal">grep(regex)</tt></dt>
+<dd>File contains the given regular expression.</dd>
+<dt><tt class="docutils literal">hgignore()</tt></dt>
+<dd>File that matches the active .hgignore pattern.</dd>
+<dt><tt class="docutils literal">ignored()</tt></dt>
+<dd>File that is ignored according to status. These files will only be
+considered if this predicate is used.</dd>
+<dt><tt class="docutils literal">modified()</tt></dt>
+<dd>File that is modified according to status.</dd>
+<dt><tt class="docutils literal">removed()</tt></dt>
+<dd>File that is removed according to status.</dd>
+<dt><tt class="docutils literal">resolved()</tt></dt>
+<dd>File that is marked resolved according to the resolve state.</dd>
+<dt><tt class="docutils literal">size(expression)</tt></dt>
+<dd><p class="first">File size matches the given expression. Examples:</p>
+<ul class="last simple">
+<li>1k (files from 1024 to 2047 bytes)</li>
+<li>&lt; 20k (files less than 20480 bytes)</li>
+<li>&gt;= .5MB (files at least 524288 bytes)</li>
+<li>4k - 1MB (files from 4096 bytes to 1048576 bytes)</li>
+</ul>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">subrepo([pattern])</span></tt></dt>
+<dd>Subrepositories whose paths match the given pattern.</dd>
+<dt><tt class="docutils literal">symlink()</tt></dt>
+<dd>File that is marked as a symlink.</dd>
+<dt><tt class="docutils literal">unknown()</tt></dt>
+<dd>File that is unknown according to status. These files will only be
+considered if this predicate is used.</dd>
+<dt><tt class="docutils literal">unresolved()</tt></dt>
+<dd>File that is marked unresolved according to the resolve state.</dd>
+</dl>
+<p>Some sample queries:</p>
+<ul>
+<li><p class="first">Show status of files that appear to be binary in the working directory:</p>
+<pre class="literal-block">
+hg status -A &quot;set:binary()&quot;
+</pre>
+</li>
+<li><p class="first">Forget files that are in .hgignore but are already tracked:</p>
+<pre class="literal-block">
+hg forget &quot;set:hgignore() and not ignored()&quot;
+</pre>
+</li>
+<li><p class="first">Find text files that contain a string:</p>
+<pre class="literal-block">
+hg locate &quot;set:grep(magic) and not binary()&quot;
+</pre>
+</li>
+<li><p class="first">Find C files in a non-standard encoding:</p>
+<pre class="literal-block">
+hg locate &quot;set:**.c and not encoding('UTF-8')&quot;
+</pre>
+</li>
+<li><p class="first">Revert copies of large binary files:</p>
+<pre class="literal-block">
+hg revert &quot;set:copied() and binary() and size('&gt;1M')&quot;
+</pre>
+</li>
+<li><p class="first">Remove files listed in foo.lst that contain the letter a or b:</p>
+<pre class="literal-block">
+hg remove &quot;set: 'listfile:foo.lst' and (**a* or **b*)&quot;
+</pre>
+</li>
+</ul>
+<p>See also <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a>.</p>
+</div>
+<div class="section" id="id1">
+<span id="glossary"></span><h1><a class="toc-backref" href="#contents">Glossary</a></h1>
+<dl class="docutils">
+<dt>Ancestor</dt>
+<dd>Any changeset that can be reached by an unbroken chain of parent
+changesets from a given changeset. More precisely, the ancestors
+of a changeset can be defined by two properties: a parent of a
+changeset is an ancestor, and a parent of an ancestor is an
+ancestor. See also: 'Descendant'.</dd>
+<dt>Bookmark</dt>
+<dd><p class="first">Bookmarks are pointers to certain commits that move when
+committing. They are similar to tags in that it is possible to use
+bookmark names in all places where Mercurial expects a changeset
+ID, e.g., with <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>. Unlike tags, bookmarks move along
+when you make a commit.</p>
+<p class="last">Bookmarks can be renamed, copied and deleted. Bookmarks are local,
+unless they are explicitly pushed or pulled between repositories.
+Pushing and pulling bookmarks allow you to collaborate with others
+on a branch without creating a named branch.</p>
+</dd>
+<dt>Branch</dt>
+<dd><p class="first">(Noun) A child changeset that has been created from a parent that
+is not a head. These are known as topological branches, see
+'Branch, topological'. If a topological branch is named, it becomes
+a named branch. If a topological branch is not named, it becomes
+an anonymous branch. See 'Branch, anonymous' and 'Branch, named'.</p>
+<p>Branches may be created when changes are pulled from or pushed to
+a remote repository, since new heads may be created by these
+operations. Note that the term branch can also be used informally
+to describe a development process in which certain development is
+done independently of other development. This is sometimes done
+explicitly with a named branch, but it can also be done locally,
+using bookmarks or clones and anonymous branches.</p>
+<p>Example: &quot;The experimental branch&quot;.</p>
+<p>(Verb) The action of creating a child changeset which results in
+its parent having more than one child.</p>
+<p class="last">Example: &quot;I'm going to branch at X&quot;.</p>
+</dd>
+<dt>Branch, anonymous</dt>
+<dd>Every time a new child changeset is created from a parent that is not
+a head and the name of the branch is not changed, a new anonymous
+branch is created.</dd>
+<dt>Branch, closed</dt>
+<dd>A named branch whose branch heads have all been closed.</dd>
+<dt>Branch, default</dt>
+<dd>The branch assigned to a changeset when no name has previously been
+assigned.</dd>
+<dt>Branch head</dt>
+<dd>See 'Head, branch'.</dd>
+<dt>Branch, inactive</dt>
+<dd><p class="first">If a named branch has no topological heads, it is considered to be
+inactive. As an example, a feature branch becomes inactive when it
+is merged into the default branch. The <a class="reference external" href="hg.1.html#branches"><tt class="docutils literal">hg branches</tt></a> command
+shows inactive branches by default, though they can be hidden with
+<a class="reference external" href="hg.1.html#branches"><tt class="docutils literal">hg branches <span class="pre">--active</span></tt></a>.</p>
+<p class="last">NOTE: this concept is deprecated because it is too implicit.
+Branches should now be explicitly closed using <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit
+<span class="pre">--close-branch</span></tt></a> when they are no longer needed.</p>
+</dd>
+<dt>Branch, named</dt>
+<dd><p class="first">A collection of changesets which have the same branch name. By
+default, children of a changeset in a named branch belong to the
+same named branch. A child can be explicitly assigned to a
+different branch. See <a class="reference external" href="hg.1.html#branch"><tt class="docutils literal">hg help branch</tt></a>, <a class="reference external" href="hg.1.html#branches"><tt class="docutils literal">hg help branches</tt></a> and
+<a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit <span class="pre">--close-branch</span></tt></a> for more information on managing
+branches.</p>
+<p class="last">Named branches can be thought of as a kind of namespace, dividing
+the collection of changesets that comprise the repository into a
+collection of disjoint subsets. A named branch is not necessarily
+a topological branch. If a new named branch is created from the
+head of another named branch, or the default branch, but no
+further changesets are added to that previous branch, then that
+previous branch will be a branch in name only.</p>
+</dd>
+<dt>Branch tip</dt>
+<dd>See 'Tip, branch'.</dd>
+<dt>Branch, topological</dt>
+<dd>Every time a new child changeset is created from a parent that is
+not a head, a new topological branch is created. If a topological
+branch is named, it becomes a named branch. If a topological
+branch is not named, it becomes an anonymous branch of the
+current, possibly default, branch.</dd>
+<dt>Changelog</dt>
+<dd>A record of the changesets in the order in which they were added
+to the repository. This includes details such as changeset id,
+author, commit message, date, and list of changed files.</dd>
+<dt>Changeset</dt>
+<dd>A snapshot of the state of the repository used to record a change.</dd>
+<dt>Changeset, child</dt>
+<dd>The converse of parent changeset: if P is a parent of C, then C is
+a child of P. There is no limit to the number of children that a
+changeset may have.</dd>
+<dt>Changeset id</dt>
+<dd>A SHA-1 hash that uniquely identifies a changeset. It may be
+represented as either a &quot;long&quot; 40 hexadecimal digit string, or a
+&quot;short&quot; 12 hexadecimal digit string.</dd>
+<dt>Changeset, merge</dt>
+<dd>A changeset with two parents. This occurs when a merge is
+committed.</dd>
+<dt>Changeset, parent</dt>
+<dd>A revision upon which a child changeset is based. Specifically, a
+parent changeset of a changeset C is a changeset whose node
+immediately precedes C in the DAG. Changesets have at most two
+parents.</dd>
+<dt>Checkout</dt>
+<dd><p class="first">(Noun) The working directory being updated to a specific
+revision. This use should probably be avoided where possible, as
+changeset is much more appropriate than checkout in this context.</p>
+<p>Example: &quot;I'm using checkout X.&quot;</p>
+<p>(Verb) Updating the working directory to a specific changeset. See
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg help update</tt></a>.</p>
+<p class="last">Example: &quot;I'm going to check out changeset X.&quot;</p>
+</dd>
+<dt>Child changeset</dt>
+<dd>See 'Changeset, child'.</dd>
+<dt>Close changeset</dt>
+<dd>See 'Head, closed branch'</dd>
+<dt>Closed branch</dt>
+<dd>See 'Branch, closed'.</dd>
+<dt>Clone</dt>
+<dd><p class="first">(Noun) An entire or partial copy of a repository. The partial
+clone must be in the form of a revision and its ancestors.</p>
+<p>Example: &quot;Is your clone up to date?&quot;.</p>
+<p>(Verb) The process of creating a clone, using <a class="reference external" href="hg.1.html#clone"><tt class="docutils literal">hg clone</tt></a>.</p>
+<p class="last">Example: &quot;I'm going to clone the repository&quot;.</p>
+</dd>
+<dt>Closed branch head</dt>
+<dd>See 'Head, closed branch'.</dd>
+<dt>Commit</dt>
+<dd><p class="first">(Noun) A synonym for changeset.</p>
+<p>Example: &quot;Is the bug fixed in your recent commit?&quot;</p>
+<p>(Verb) The act of recording changes to a repository. When files
+are committed in a working directory, Mercurial finds the
+differences between the committed files and their parent
+changeset, creating a new changeset in the repository.</p>
+<p class="last">Example: &quot;You should commit those changes now.&quot;</p>
+</dd>
+<dt>Cset</dt>
+<dd>A common abbreviation of the term changeset.</dd>
+<dt>DAG</dt>
+<dd>The repository of changesets of a distributed version control
+system (DVCS) can be described as a directed acyclic graph (DAG),
+consisting of nodes and edges, where nodes correspond to
+changesets and edges imply a parent -&gt; child relation. This graph
+can be visualized by graphical tools such as <a class="reference external" href="hg.1.html#glog"><tt class="docutils literal">hg glog</tt></a>
+(graphlog). In Mercurial, the DAG is limited by the requirement
+for children to have at most two parents.</dd>
+<dt>Default branch</dt>
+<dd>See 'Branch, default'.</dd>
+<dt>Descendant</dt>
+<dd>Any changeset that can be reached by a chain of child changesets
+from a given changeset. More precisely, the descendants of a
+changeset can be defined by two properties: the child of a
+changeset is a descendant, and the child of a descendant is a
+descendant. See also: 'Ancestor'.</dd>
+<dt>Diff</dt>
+<dd><p class="first">(Noun) The difference between the contents and attributes of files
+in two changesets or a changeset and the current working
+directory. The difference is usually represented in a standard
+form called a &quot;diff&quot; or &quot;patch&quot;. The &quot;git diff&quot; format is used
+when the changes include copies, renames, or changes to file
+attributes, none of which can be represented/handled by classic
+&quot;diff&quot; and &quot;patch&quot;.</p>
+<p>Example: &quot;Did you see my correction in the diff?&quot;</p>
+<p>(Verb) Diffing two changesets is the action of creating a diff or
+patch.</p>
+<p class="last">Example: &quot;If you diff with changeset X, you will see what I mean.&quot;</p>
+</dd>
+<dt>Directory, working</dt>
+<dd>The working directory represents the state of the files tracked by
+Mercurial, that will be recorded in the next commit. The working
+directory initially corresponds to the snapshot at an existing
+changeset, known as the parent of the working directory. See
+'Parent, working directory'. The state may be modified by changes
+to the files introduced manually or by a merge. The repository
+metadata exists in the .hg directory inside the working directory.</dd>
+<dt>Draft</dt>
+<dd>Changesets in the draft phase have not been shared with publishing
+repositories and may thus be safely changed by history-modifying
+extensions. See <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a>.</dd>
+<dt>Graph</dt>
+<dd>See DAG and <a class="reference external" href="hg.1.html#graphlog"><tt class="docutils literal">hg help graphlog</tt></a>.</dd>
+<dt>Head</dt>
+<dd><p class="first">The term 'head' may be used to refer to both a branch head or a
+repository head, depending on the context. See 'Head, branch' and
+'Head, repository' for specific definitions.</p>
+<p class="last">Heads are where development generally takes place and are the
+usual targets for update and merge operations.</p>
+</dd>
+<dt>Head, branch</dt>
+<dd>A changeset with no descendants on the same named branch.</dd>
+<dt>Head, closed branch</dt>
+<dd><p class="first">A changeset that marks a head as no longer interesting. The closed
+head is no longer listed by <a class="reference external" href="hg.1.html#heads"><tt class="docutils literal">hg heads</tt></a>. A branch is considered
+closed when all its heads are closed and consequently is not
+listed by <a class="reference external" href="hg.1.html#branches"><tt class="docutils literal">hg branches</tt></a>.</p>
+<p class="last">Closed heads can be re-opened by committing new changeset as the
+child of the changeset that marks a head as closed.</p>
+</dd>
+<dt>Head, repository</dt>
+<dd>A topological head which has not been closed.</dd>
+<dt>Head, topological</dt>
+<dd>A changeset with no children in the repository.</dd>
+<dt>History, immutable</dt>
+<dd>Once committed, changesets cannot be altered. Extensions which
+appear to change history actually create new changesets that
+replace existing ones, and then destroy the old changesets. Doing
+so in public repositories can result in old changesets being
+reintroduced to the repository.</dd>
+<dt>History, rewriting</dt>
+<dd>The changesets in a repository are immutable. However, extensions
+to Mercurial can be used to alter the repository, usually in such
+a way as to preserve changeset contents.</dd>
+<dt>Immutable history</dt>
+<dd>See 'History, immutable'.</dd>
+<dt>Merge changeset</dt>
+<dd>See 'Changeset, merge'.</dd>
+<dt>Manifest</dt>
+<dd>Each changeset has a manifest, which is the list of files that are
+tracked by the changeset.</dd>
+<dt>Merge</dt>
+<dd>Used to bring together divergent branches of work. When you update
+to a changeset and then merge another changeset, you bring the
+history of the latter changeset into your working directory. Once
+conflicts are resolved (and marked), this merge may be committed
+as a merge changeset, bringing two branches together in the DAG.</dd>
+<dt>Named branch</dt>
+<dd>See 'Branch, named'.</dd>
+<dt>Null changeset</dt>
+<dd>The empty changeset. It is the parent state of newly-initialized
+repositories and repositories with no checked out revision. It is
+thus the parent of root changesets and the effective ancestor when
+merging unrelated changesets. Can be specified by the alias 'null'
+or by the changeset ID '000000000000'.</dd>
+<dt>Parent</dt>
+<dd>See 'Changeset, parent'.</dd>
+<dt>Parent changeset</dt>
+<dd>See 'Changeset, parent'.</dd>
+<dt>Parent, working directory</dt>
+<dd>The working directory parent reflects a virtual revision which is
+the child of the changeset (or two changesets with an uncommitted
+merge) shown by <a class="reference external" href="hg.1.html#parents"><tt class="docutils literal">hg parents</tt></a>. This is changed with
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>. Other commands to see the working directory parent
+are <a class="reference external" href="hg.1.html#summary"><tt class="docutils literal">hg summary</tt></a> and <a class="reference external" href="hg.1.html#id"><tt class="docutils literal">hg id</tt></a>. Can be specified by the alias &quot;.&quot;.</dd>
+<dt>Patch</dt>
+<dd><p class="first">(Noun) The product of a diff operation.</p>
+<p>Example: &quot;I've sent you my patch.&quot;</p>
+<p>(Verb) The process of using a patch file to transform one
+changeset into another.</p>
+<p class="last">Example: &quot;You will need to patch that revision.&quot;</p>
+</dd>
+<dt>Phase</dt>
+<dd>A per-changeset state tracking how the changeset has been or
+should be shared. See <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a>.</dd>
+<dt>Public</dt>
+<dd>Changesets in the public phase have been shared with publishing
+repositories and are therefore considered immutable. See <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help
+phases</tt></a>.</dd>
+<dt>Pull</dt>
+<dd>An operation in which changesets in a remote repository which are
+not in the local repository are brought into the local
+repository. Note that this operation without special arguments
+only updates the repository, it does not update the files in the
+working directory. See <a class="reference external" href="hg.1.html#pull"><tt class="docutils literal">hg help pull</tt></a>.</dd>
+<dt>Push</dt>
+<dd>An operation in which changesets in a local repository which are
+not in a remote repository are sent to the remote repository. Note
+that this operation only adds changesets which have been committed
+locally to the remote repository. Uncommitted changes are not
+sent. See <a class="reference external" href="hg.1.html#push"><tt class="docutils literal">hg help push</tt></a>.</dd>
+<dt>Repository</dt>
+<dd>The metadata describing all recorded states of a collection of
+files. Each recorded state is represented by a changeset. A
+repository is usually (but not always) found in the <tt class="docutils literal">.hg</tt>
+subdirectory of a working directory. Any recorded state can be
+recreated by &quot;updating&quot; a working directory to a specific
+changeset.</dd>
+<dt>Repository head</dt>
+<dd>See 'Head, repository'.</dd>
+<dt>Revision</dt>
+<dd>A state of the repository at some point in time. Earlier revisions
+can be updated to by using <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>. See also 'Revision
+number'; See also 'Changeset'.</dd>
+<dt>Revision number</dt>
+<dd>This integer uniquely identifies a changeset in a specific
+repository. It represents the order in which changesets were added
+to a repository, starting with revision number 0. Note that the
+revision number may be different in each clone of a repository. To
+identify changesets uniquely between different clones, see
+'Changeset id'.</dd>
+<dt>Revlog</dt>
+<dd>History storage mechanism used by Mercurial. It is a form of delta
+encoding, with occasional full revision of data followed by delta
+of each successive revision. It includes data and an index
+pointing to the data.</dd>
+<dt>Rewriting history</dt>
+<dd>See 'History, rewriting'.</dd>
+<dt>Root</dt>
+<dd>A changeset that has only the null changeset as its parent. Most
+repositories have only a single root changeset.</dd>
+<dt>Secret</dt>
+<dd>Changesets in the secret phase may not be shared via push, pull,
+or clone. See <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a>.</dd>
+<dt>Tag</dt>
+<dd>An alternative name given to a changeset. Tags can be used in all
+places where Mercurial expects a changeset ID, e.g., with
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>. The creation of a tag is stored in the history and
+will thus automatically be shared with other using push and pull.</dd>
+<dt>Tip</dt>
+<dd>The changeset with the highest revision number. It is the changeset
+most recently added in a repository.</dd>
+<dt>Tip, branch</dt>
+<dd>The head of a given branch with the highest revision number. When
+a branch name is used as a revision identifier, it refers to the
+branch tip. See also 'Branch, head'. Note that because revision
+numbers may be different in different repository clones, the
+branch tip may be different in different cloned repositories.</dd>
+<dt>Update</dt>
+<dd><p class="first">(Noun) Another synonym of changeset.</p>
+<p>Example: &quot;I've pushed an update&quot;.</p>
+<p>(Verb) This term is usually used to describe updating the state of
+the working directory to that of a specific changeset. See
+<a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg help update</tt></a>.</p>
+<p class="last">Example: &quot;You should update&quot;.</p>
+</dd>
+<dt>Working directory</dt>
+<dd>See 'Directory, working'.</dd>
+<dt>Working directory parent</dt>
+<dd>See 'Parent, working directory'.</dd>
+</dl>
+</div>
+<div class="section" id="syntax-for-mercurial-ignore-files">
+<span id="ignore"></span><span id="hgignore"></span><h1><a class="toc-backref" href="#contents">Syntax for Mercurial Ignore Files</a></h1>
+<div class="section" id="id2">
+<h2>Synopsis</h2>
+<p>The Mercurial system uses a file called <tt class="docutils literal">.hgignore</tt> in the root
+directory of a repository to control its behavior when it searches
+for files that it is not currently tracking.</p>
+</div>
+<div class="section" id="id3">
+<h2>Description</h2>
+<p>The working directory of a Mercurial repository will often contain
+files that should not be tracked by Mercurial. These include backup
+files created by editors and build products created by compilers.
+These files can be ignored by listing them in a <tt class="docutils literal">.hgignore</tt> file in
+the root of the working directory. The <tt class="docutils literal">.hgignore</tt> file must be
+created manually. It is typically put under version control, so that
+the settings will propagate to other repositories with push and pull.</p>
+<p>An untracked file is ignored if its path relative to the repository
+root directory, or any prefix path of that path, is matched against
+any pattern in <tt class="docutils literal">.hgignore</tt>.</p>
+<p>For example, say we have an untracked file, <tt class="docutils literal">file.c</tt>, at
+<tt class="docutils literal">a/b/file.c</tt> inside our repository. Mercurial will ignore <tt class="docutils literal">file.c</tt>
+if any pattern in <tt class="docutils literal">.hgignore</tt> matches <tt class="docutils literal">a/b/file.c</tt>, <tt class="docutils literal">a/b</tt> or <tt class="docutils literal">a</tt>.</p>
+<p>In addition, a Mercurial configuration file can reference a set of
+per-user or global ignore files. See the <tt class="docutils literal">ignore</tt> configuration
+key on the <tt class="docutils literal">[ui]</tt> section of <a class="reference external" href="hg.1.html#config"><tt class="docutils literal">hg help config</tt></a> for details of how to
+configure these files.</p>
+<p>To control Mercurial's handling of files that it manages, many
+commands support the <tt class="docutils literal"><span class="pre">-I</span></tt> and <tt class="docutils literal"><span class="pre">-X</span></tt> options; see
+<a class="reference external" href="hg.1.html#&lt;command&gt;"><tt class="docutils literal">hg help &lt;command&gt;</tt></a> and <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a> for details.</p>
+<p>Files that are already tracked are not affected by .hgignore, even
+if they appear in .hgignore. An untracked file X can be explicitly
+added with <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add X</tt></a>, even if X would be excluded by a pattern
+in .hgignore.</p>
+</div>
+<div class="section" id="syntax">
+<h2>Syntax</h2>
+<p>An ignore file is a plain text file consisting of a list of patterns,
+with one pattern per line. Empty lines are skipped. The <tt class="docutils literal">#</tt>
+character is treated as a comment character, and the <tt class="docutils literal">\</tt> character
+is treated as an escape character.</p>
+<p>Mercurial supports several pattern syntaxes. The default syntax used
+is Python/Perl-style regular expressions.</p>
+<p>To change the syntax used, use a line of the following form:</p>
+<pre class="literal-block">
+syntax: NAME
+</pre>
+<p>where <tt class="docutils literal">NAME</tt> is one of the following:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">regexp</tt></dt>
+<dd>Regular expression, Python/Perl syntax.</dd>
+<dt><tt class="docutils literal">glob</tt></dt>
+<dd>Shell-style glob.</dd>
+</dl>
+<p>The chosen syntax stays in effect when parsing all patterns that
+follow, until another syntax is selected.</p>
+<p>Neither glob nor regexp patterns are rooted. A glob-syntax pattern of
+the form <tt class="docutils literal">*.c</tt> will match a file ending in <tt class="docutils literal">.c</tt> in any directory,
+and a regexp pattern of the form <tt class="docutils literal">\.c$</tt> will do the same. To root a
+regexp pattern, start it with <tt class="docutils literal">^</tt>.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Patterns specified in other than <tt class="docutils literal">.hgignore</tt> are always rooted.
+Please see <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a> for details.</p>
+</div>
+</div>
+<div class="section" id="example">
+<h2>Example</h2>
+<p>Here is an example ignore file.</p>
+<pre class="literal-block">
+# use glob syntax.
+syntax: glob
+
+*.elc
+*.pyc
+*~
+
+# switch to regexp syntax.
+syntax: regexp
+^\.pc/
+</pre>
+</div>
+</div>
+<div class="section" id="configuring-hgweb">
+<span id="hgweb"></span><h1><a class="toc-backref" href="#contents">Configuring hgweb</a></h1>
+<p>Mercurial's internal web server, hgweb, can serve either a single
+repository, or a tree of repositories. In the second case, repository
+paths and global options can be defined using a dedicated
+configuration file common to <a class="reference external" href="hg.1.html#serve"><tt class="docutils literal">hg serve</tt></a>, <tt class="docutils literal">hgweb.wsgi</tt>,
+<tt class="docutils literal">hgweb.cgi</tt> and <tt class="docutils literal">hgweb.fcgi</tt>.</p>
+<p>This file uses the same syntax as other Mercurial configuration files
+but recognizes only the following sections:</p>
+<blockquote>
+<ul class="simple">
+<li>web</li>
+<li>paths</li>
+<li>collections</li>
+</ul>
+</blockquote>
+<p>The <tt class="docutils literal">web</tt> options are thorougly described in <a class="reference external" href="hg.1.html#config"><tt class="docutils literal">hg help config</tt></a>.</p>
+<p>The <tt class="docutils literal">paths</tt> section maps URL paths to paths of repositories in the
+filesystem. hgweb will not expose the filesystem directly - only
+Mercurial repositories can be published and only according to the
+configuration.</p>
+<p>The left hand side is the path in the URL. Note that hgweb reserves
+subpaths like <tt class="docutils literal">rev</tt> or <tt class="docutils literal">file</tt>, try using different names for
+nested repositories to avoid confusing effects.</p>
+<p>The right hand side is the path in the filesystem. If the specified
+path ends with <tt class="docutils literal">*</tt> or <tt class="docutils literal">**</tt> the filesystem will be searched
+recursively for repositories below that point.
+With <tt class="docutils literal">*</tt> it will not recurse into the repositories it finds (except for
+<tt class="docutils literal">.hg/patches</tt>).
+With <tt class="docutils literal">**</tt> it will also search inside repository working directories
+and possibly find subrepositories.</p>
+<p>In this example:</p>
+<pre class="literal-block">
+[paths]
+/projects/a = /srv/tmprepos/a
+/projects/b = c:/repos/b
+/ = /srv/repos/*
+/user/bob = /home/bob/repos/**
+</pre>
+<ul class="simple">
+<li>The first two entries make two repositories in different directories
+appear under the same directory in the web interface</li>
+<li>The third entry will publish every Mercurial repository found in
+<tt class="docutils literal">/srv/repos/</tt>, for instance the repository <tt class="docutils literal">/srv/repos/quux/</tt>
+will appear as <tt class="docutils literal"><span class="pre">http://server/quux/</span></tt></li>
+<li>The fourth entry will publish both <tt class="docutils literal"><span class="pre">http://server/user/bob/quux/</span></tt>
+and <tt class="docutils literal"><span class="pre">http://server/user/bob/quux/testsubrepo/</span></tt></li>
+</ul>
+<p>The <tt class="docutils literal">collections</tt> section is deprecated and has been superseeded by
+<tt class="docutils literal">paths</tt>.</p>
+</div>
+<div class="section" id="id4">
+<span id="mergetools"></span><span id="merge-tools"></span><h1><a class="toc-backref" href="#contents">Merge Tools</a></h1>
+<p>To merge files Mercurial uses merge tools.</p>
+<p>A merge tool combines two different versions of a file into a merged
+file. Merge tools are given the two files and the greatest common
+ancestor of the two file versions, so they can determine the changes
+made on both branches.</p>
+<p>Merge tools are used both for <a class="reference external" href="hg.1.html#resolve"><tt class="docutils literal">hg resolve</tt></a>, <a class="reference external" href="hg.1.html#merge"><tt class="docutils literal">hg merge</tt></a>, <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>,
+<a class="reference external" href="hg.1.html#backout"><tt class="docutils literal">hg backout</tt></a> and in several extensions.</p>
+<p>Usually, the merge tool tries to automatically reconcile the files by
+combining all non-overlapping changes that occurred separately in
+the two different evolutions of the same initial base file. Furthermore, some
+interactive merge programs make it easier to manually resolve
+conflicting merges, either in a graphical way, or by inserting some
+conflict markers. Mercurial does not include any interactive merge
+programs but relies on external tools for that.</p>
+<div class="section" id="available-merge-tools">
+<h2>Available merge tools</h2>
+<p>External merge tools and their properties are configured in the
+merge-tools configuration section - see hgrc(5) - but they can often just
+be named by their executable.</p>
+<p>A merge tool is generally usable if its executable can be found on the
+system and if it can handle the merge. The executable is found if it
+is an absolute or relative executable path or the name of an
+application in the executable search path. The tool is assumed to be
+able to handle the merge if it can handle symlinks if the file is a
+symlink, if it can handle binary files if the file is binary, and if a
+GUI is available if the tool requires a GUI.</p>
+<p>There are some internal merge tools which can be used. The internal
+merge tools are:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">internal:dump</tt></dt>
+<dd>Creates three versions of the files to merge, containing the
+contents of local, other and base. These files can then be used to
+perform a merge manually. If the file to be merged is named
+<tt class="docutils literal">a.txt</tt>, these files will accordingly be named <tt class="docutils literal">a.txt.local</tt>,
+<tt class="docutils literal">a.txt.other</tt> and <tt class="docutils literal">a.txt.base</tt> and they will be placed in the
+same directory as <tt class="docutils literal">a.txt</tt>.</dd>
+<dt><tt class="docutils literal">internal:fail</tt></dt>
+<dd>Rather than attempting to merge files that were modified on both
+branches, it marks them as unresolved. The resolve command must be
+used to resolve these conflicts.</dd>
+<dt><tt class="docutils literal">internal:local</tt></dt>
+<dd>Uses the local version of files as the merged version.</dd>
+<dt><tt class="docutils literal">internal:merge</tt></dt>
+<dd>Uses the internal non-interactive simple merge algorithm for merging
+files. It will fail if there are any conflicts and leave markers in
+the partially merged file.</dd>
+<dt><tt class="docutils literal">internal:other</tt></dt>
+<dd>Uses the other version of files as the merged version.</dd>
+<dt><tt class="docutils literal">internal:prompt</tt></dt>
+<dd>Asks the user which of the local or the other version to keep as
+the merged version.</dd>
+</dl>
+<p>Internal tools are always available and do not require a GUI but will by default
+not handle symlinks or binary files.</p>
+</div>
+<div class="section" id="choosing-a-merge-tool">
+<h2>Choosing a merge tool</h2>
+<p>Mercurial uses these rules when deciding which merge tool to use:</p>
+<ol class="arabic simple">
+<li>If a tool has been specified with the --tool option to merge or resolve, it
+is used. If it is the name of a tool in the merge-tools configuration, its
+configuration is used. Otherwise the specified tool must be executable by
+the shell.</li>
+<li>If the <tt class="docutils literal">HGMERGE</tt> environment variable is present, its value is used and
+must be executable by the shell.</li>
+<li>If the filename of the file to be merged matches any of the patterns in the
+merge-patterns configuration section, the first usable merge tool
+corresponding to a matching pattern is used. Here, binary capabilities of the
+merge tool are not considered.</li>
+<li>If ui.merge is set it will be considered next. If the value is not the name
+of a configured tool, the specified value is used and must be executable by
+the shell. Otherwise the named tool is used if it is usable.</li>
+<li>If any usable merge tools are present in the merge-tools configuration
+section, the one with the highest priority is used.</li>
+<li>If a program named <tt class="docutils literal">hgmerge</tt> can be found on the system, it is used - but
+it will by default not be used for symlinks and binary files.</li>
+<li>If the file to be merged is not binary and is not a symlink, then
+<tt class="docutils literal">internal:merge</tt> is used.</li>
+<li>The merge of the file fails and must be resolved before commit.</li>
+</ol>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">After selecting a merge program, Mercurial will by default attempt
+to merge the files using a simple merge algorithm first. Only if it doesn't
+succeed because of conflicting changes Mercurial will actually execute the
+merge program. Whether to use the simple merge algorithm first can be
+controlled by the premerge setting of the merge tool. Premerge is enabled by
+default unless the file is binary or a symlink.</p>
+</div>
+<p>See the merge-tools and ui sections of hgrc(5) for details on the
+configuration of merge tools.</p>
+</div>
+</div>
+<div class="section" id="specifying-multiple-revisions">
+<span id="mrevs"></span><span id="multirevs"></span><h1><a class="toc-backref" href="#contents">Specifying Multiple Revisions</a></h1>
+<p>When Mercurial accepts more than one revision, they may be specified
+individually, or provided as a topologically continuous range,
+separated by the &quot;:&quot; character.</p>
+<p>The syntax of range notation is [BEGIN]:[END], where BEGIN and END are
+revision identifiers. Both BEGIN and END are optional. If BEGIN is not
+specified, it defaults to revision number 0. If END is not specified,
+it defaults to the tip. The range &quot;:&quot; thus means &quot;all revisions&quot;.</p>
+<p>If BEGIN is greater than END, revisions are treated in reverse order.</p>
+<p>A range acts as a closed interval. This means that a range of 3:5
+gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.</p>
+</div>
+<div class="section" id="file-name-patterns">
+<span id="patterns"></span><h1><a class="toc-backref" href="#contents">File Name Patterns</a></h1>
+<p>Mercurial accepts several notations for identifying one or more files
+at a time.</p>
+<p>By default, Mercurial treats filenames as shell-style extended glob
+patterns.</p>
+<p>Alternate pattern notations must be specified explicitly.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Patterns specified in <tt class="docutils literal">.hgignore</tt> are not rooted.
+Please see <a class="reference external" href="hg.1.html#hgignore"><tt class="docutils literal">hg help hgignore</tt></a> for details.</p>
+</div>
+<p>To use a plain path name without any pattern matching, start it with
+<tt class="docutils literal">path:</tt>. These path names must completely match starting at the
+current repository root.</p>
+<p>To use an extended glob, start a name with <tt class="docutils literal">glob:</tt>. Globs are rooted
+at the current directory; a glob such as <tt class="docutils literal">*.c</tt> will only match files
+in the current directory ending with <tt class="docutils literal">.c</tt>.</p>
+<p>The supported glob syntax extensions are <tt class="docutils literal">**</tt> to match any string
+across path separators and <tt class="docutils literal">{a,b}</tt> to mean &quot;a or b&quot;.</p>
+<p>To use a Perl/Python regular expression, start a name with <tt class="docutils literal">re:</tt>.
+Regexp pattern matching is anchored at the root of the repository.</p>
+<p>To read name patterns from a file, use <tt class="docutils literal">listfile:</tt> or <tt class="docutils literal">listfile0:</tt>.
+The latter expects null delimited patterns while the former expects line
+feeds. Each string read from the file is itself treated as a file
+pattern.</p>
+<p>Plain examples:</p>
+<pre class="literal-block">
+path:foo/bar a name bar in a directory named foo in the root
+ of the repository
+path:path:name a file or directory named &quot;path:name&quot;
+</pre>
+<p>Glob examples:</p>
+<pre class="literal-block">
+glob:*.c any name ending in &quot;.c&quot; in the current directory
+*.c any name ending in &quot;.c&quot; in the current directory
+**.c any name ending in &quot;.c&quot; in any subdirectory of the
+ current directory including itself.
+foo/*.c any name ending in &quot;.c&quot; in the directory foo
+foo/**.c any name ending in &quot;.c&quot; in any subdirectory of foo
+ including itself.
+</pre>
+<p>Regexp examples:</p>
+<pre class="literal-block">
+re:.*\.c$ any name ending in &quot;.c&quot;, anywhere in the repository
+</pre>
+<p>File examples:</p>
+<pre class="literal-block">
+listfile:list.txt read list from list.txt with one file pattern per line
+listfile0:list.txt read list from list.txt with null byte delimiters
+</pre>
+<p>See also <a class="reference external" href="hg.1.html#filesets"><tt class="docutils literal">hg help filesets</tt></a>.</p>
+</div>
+<div class="section" id="working-with-phases">
+<span id="phases"></span><h1><a class="toc-backref" href="#contents">Working with Phases</a></h1>
+<div class="section" id="what-are-phases">
+<h2>What are phases?</h2>
+<p>Phases are a system for tracking which changesets have been or should
+be shared. This helps prevent common mistakes when modifying history
+(for instance, with the mq or rebase extensions).</p>
+<p>Each changeset in a repository is in one of the following phases:</p>
+<blockquote>
+<ul class="simple">
+<li>public : changeset is visible on a public server</li>
+<li>draft : changeset is not yet published</li>
+<li>secret : changeset should not be pushed, pulled, or cloned</li>
+</ul>
+</blockquote>
+<p>These phases are ordered (public &lt; draft &lt; secret) and no changeset
+can be in a lower phase than its ancestors. For instance, if a
+changeset is public, all its ancestors are also public. Lastly,
+changeset phases should only be changed towards the public phase.</p>
+</div>
+<div class="section" id="how-are-phases-managed">
+<h2>How are phases managed?</h2>
+<p>For the most part, phases should work transparently. By default, a
+changeset is created in the draft phase and is moved into the public
+phase when it is pushed to another repository.</p>
+<p>Once changesets become public, extensions like mq and rebase will
+refuse to operate on them to prevent creating duplicate changesets.
+Phases can also be manually manipulated with the <a class="reference external" href="hg.1.html#phase"><tt class="docutils literal">hg phase</tt></a> command
+if needed. See <a class="reference external" href="hg.1.html#-v"><tt class="docutils literal">hg help <span class="pre">-v</span> phase</tt></a> for examples.</p>
+</div>
+<div class="section" id="phases-and-servers">
+<h2>Phases and servers</h2>
+<p>Normally, all servers are <tt class="docutils literal">publishing</tt> by default. This means:</p>
+<pre class="literal-block">
+- all draft changesets that are pulled or cloned appear in phase
+public on the client
+
+- all draft changesets that are pushed appear as public on both
+client and server
+
+- secret changesets are neither pushed, pulled, or cloned
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Pulling a draft changeset from a publishing server does not mark it
+as public on the server side due to the read-only nature of pull.</p>
+</div>
+<p>Sometimes it may be desirable to push and pull changesets in the draft
+phase to share unfinished work. This can be done by setting a
+repository to disable publishing in its configuration file:</p>
+<pre class="literal-block">
+[phases]
+publish = False
+</pre>
+<p>See <a class="reference external" href="hg.1.html#config"><tt class="docutils literal">hg help config</tt></a> for more information on config files.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Servers running older versions of Mercurial are treated as
+publishing.</p>
+</div>
+</div>
+<div class="section" id="examples">
+<h2>Examples</h2>
+<blockquote>
+<ul>
+<li><p class="first">list changesets in draft or secret phase:</p>
+<pre class="literal-block">
+hg log -r &quot;not public()&quot;
+</pre>
+</li>
+<li><p class="first">change all secret changesets to draft:</p>
+<pre class="literal-block">
+hg phase --draft &quot;secret()&quot;
+</pre>
+</li>
+<li><p class="first">forcibly move the current changeset and descendants from public to draft:</p>
+<pre class="literal-block">
+hg phase --force --draft .
+</pre>
+</li>
+<li><p class="first">show a list of changeset revision and phase:</p>
+<pre class="literal-block">
+hg log --template &quot;{rev} {phase}\n&quot;
+</pre>
+</li>
+<li><p class="first">resynchronize draft changesets relative to a remote repository:</p>
+<pre class="literal-block">
+hg phase -fd 'outgoing(URL)'
+</pre>
+</li>
+</ul>
+</blockquote>
+<p>See <a class="reference external" href="hg.1.html#phase"><tt class="docutils literal">hg help phase</tt></a> for more information on manually manipulating phases.</p>
+</div>
+</div>
+<div class="section" id="specifying-single-revisions">
+<span id="revs"></span><span id="revisions"></span><h1><a class="toc-backref" href="#contents">Specifying Single Revisions</a></h1>
+<p>Mercurial supports several ways to specify individual revisions.</p>
+<p>A plain integer is treated as a revision number. Negative integers are
+treated as sequential offsets from the tip, with -1 denoting the tip,
+-2 denoting the revision prior to the tip, and so forth.</p>
+<p>A 40-digit hexadecimal string is treated as a unique revision
+identifier.</p>
+<p>A hexadecimal string less than 40 characters long is treated as a
+unique revision identifier and is referred to as a short-form
+identifier. A short-form identifier is only valid if it is the prefix
+of exactly one full-length identifier.</p>
+<p>Any other string is treated as a bookmark, tag, or branch name. A
+bookmark is a movable pointer to a revision. A tag is a permanent name
+associated with a revision. A branch name denotes the tipmost revision
+of that branch. Bookmark, tag, and branch names must not contain the &quot;:&quot;
+character.</p>
+<p>The reserved name &quot;tip&quot; always identifies the most recent revision.</p>
+<p>The reserved name &quot;null&quot; indicates the null revision. This is the
+revision of an empty repository, and the parent of revision 0.</p>
+<p>The reserved name &quot;.&quot; indicates the working directory parent. If no
+working directory is checked out, it is equivalent to null. If an
+uncommitted merge is in progress, &quot;.&quot; is the revision of the first
+parent.</p>
+</div>
+<div class="section" id="specifying-revision-sets">
+<span id="revset"></span><span id="revsets"></span><h1><a class="toc-backref" href="#contents">Specifying Revision Sets</a></h1>
+<p>Mercurial supports a functional language for selecting a set of
+revisions.</p>
+<p>The language supports a number of predicates which are joined by infix
+operators. Parenthesis can be used for grouping.</p>
+<p>Identifiers such as branch names may need quoting with single or
+double quotes if they contain characters like <tt class="docutils literal">-</tt> or if they match
+one of the predefined predicates.</p>
+<p>Special characters can be used in quoted identifiers by escaping them,
+e.g., <tt class="docutils literal">\n</tt> is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with <tt class="docutils literal">r</tt>, e.g. <tt class="docutils literal"><span class="pre">r'...'</span></tt>.</p>
+<p>There is a single prefix operator:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">not x</tt></dt>
+<dd>Changesets not in x. Short form is <tt class="docutils literal">! x</tt>.</dd>
+</dl>
+<p>These are the supported infix operators:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal"><span class="pre">x::y</span></tt></dt>
+<dd><p class="first">A DAG range, meaning all changesets that are descendants of x and
+ancestors of y, including x and y themselves. If the first endpoint
+is left out, this is equivalent to <tt class="docutils literal">ancestors(y)</tt>, if the second
+is left out it is equivalent to <tt class="docutils literal">descendants(x)</tt>.</p>
+<p class="last">An alternative syntax is <tt class="docutils literal"><span class="pre">x..y</span></tt>.</p>
+</dd>
+<dt><tt class="docutils literal">x:y</tt></dt>
+<dd>All changesets with revision numbers between x and y, both
+inclusive. Either endpoint can be left out, they default to 0 and
+tip.</dd>
+<dt><tt class="docutils literal">x and y</tt></dt>
+<dd>The intersection of changesets in x and y. Short form is <tt class="docutils literal">x &amp; y</tt>.</dd>
+<dt><tt class="docutils literal">x or y</tt></dt>
+<dd>The union of changesets in x and y. There are two alternative short
+forms: <tt class="docutils literal">x | y</tt> and <tt class="docutils literal">x + y</tt>.</dd>
+<dt><tt class="docutils literal">x - y</tt></dt>
+<dd>Changesets in x but not in y.</dd>
+<dt><tt class="docutils literal">x^n</tt></dt>
+<dd>The nth parent of x, n == 0, 1, or 2.
+For n == 0, x; for n == 1, the first parent of each changeset in x;
+for n == 2, the second parent of changeset in x.</dd>
+<dt><tt class="docutils literal">x~n</tt></dt>
+<dd>The nth first ancestor of x; <tt class="docutils literal">x~0</tt> is x; <tt class="docutils literal">x~3</tt> is <tt class="docutils literal"><span class="pre">x^^^</span></tt>.</dd>
+</dl>
+<p>There is a single postfix operator:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">x^</tt></dt>
+<dd>Equivalent to <tt class="docutils literal">x^1</tt>, the first parent of each changeset in x.</dd>
+</dl>
+<p>The following predicates are supported:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">adds(pattern)</tt></dt>
+<dd>Changesets that add a file matching pattern.</dd>
+<dt><tt class="docutils literal">all()</tt></dt>
+<dd>All changesets, the same as <tt class="docutils literal">0:tip</tt>.</dd>
+<dt><tt class="docutils literal">ancestor(single, single)</tt></dt>
+<dd>Greatest common ancestor of the two changesets.</dd>
+<dt><tt class="docutils literal">ancestors(set)</tt></dt>
+<dd>Changesets that are ancestors of a changeset in set.</dd>
+<dt><tt class="docutils literal">author(string)</tt></dt>
+<dd>Alias for <tt class="docutils literal">user(string)</tt>.</dd>
+<dt><tt class="docutils literal">bisect(string)</tt></dt>
+<dd><p class="first">Changesets marked in the specified bisect status:</p>
+<ul class="last simple">
+<li><tt class="docutils literal">good</tt>, <tt class="docutils literal">bad</tt>, <tt class="docutils literal">skip</tt>: csets explicitly marked as good/bad/skip</li>
+<li><tt class="docutils literal">goods</tt>, <tt class="docutils literal">bads</tt> : csets topologicaly good/bad</li>
+<li><tt class="docutils literal">range</tt> : csets taking part in the bisection</li>
+<li><tt class="docutils literal">pruned</tt> : csets that are goods, bads or skipped</li>
+<li><tt class="docutils literal">untested</tt> : csets whose fate is yet unknown</li>
+<li><tt class="docutils literal">ignored</tt> : csets ignored due to DAG topology</li>
+<li><tt class="docutils literal">current</tt> : the cset currently being bisected</li>
+</ul>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">bookmark([name])</span></tt></dt>
+<dd><p class="first">The named bookmark or all bookmarks.</p>
+<p class="last">If <cite>name</cite> starts with <cite>re:</cite>, the remainder of the name is treated as
+a regular expression. To match a bookmark that actually starts with <cite>re:</cite>,
+use the prefix <cite>literal:</cite>.</p>
+</dd>
+<dt><tt class="docutils literal">branch(string or set)</tt></dt>
+<dd><p class="first">All changesets belonging to the given branch or the branches of the given
+changesets.</p>
+<p class="last">If <cite>string</cite> starts with <cite>re:</cite>, the remainder of the name is treated as
+a regular expression. To match a branch that actually starts with <cite>re:</cite>,
+use the prefix <cite>literal:</cite>.</p>
+</dd>
+<dt><tt class="docutils literal">children(set)</tt></dt>
+<dd>Child changesets of changesets in set.</dd>
+<dt><tt class="docutils literal">closed()</tt></dt>
+<dd>Changeset is closed.</dd>
+<dt><tt class="docutils literal">contains(pattern)</tt></dt>
+<dd>Revision contains a file matching pattern. See <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a>
+for information about file patterns.</dd>
+<dt><tt class="docutils literal"><span class="pre">converted([id])</span></tt></dt>
+<dd>Changesets converted from the given identifier in the old repository if
+present, or all converted changesets if no identifier is specified.</dd>
+<dt><tt class="docutils literal">date(interval)</tt></dt>
+<dd>Changesets within the interval, see <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a>.</dd>
+<dt><tt class="docutils literal">desc(string)</tt></dt>
+<dd>Search commit message for string. The match is case-insensitive.</dd>
+<dt><tt class="docutils literal">descendants(set)</tt></dt>
+<dd>Changesets which are descendants of changesets in set.</dd>
+<dt><tt class="docutils literal"><span class="pre">destination([set])</span></tt></dt>
+<dd>Changesets that were created by a graft, transplant or rebase operation,
+with the given revisions specified as the source. Omitting the optional set
+is the same as passing all().</dd>
+<dt><tt class="docutils literal">draft()</tt></dt>
+<dd>Changeset in draft phase.</dd>
+<dt><tt class="docutils literal">extinct()</tt></dt>
+<dd>Obsolete changesets with obsolete descendants only.</dd>
+<dt><tt class="docutils literal">extra(label, [value])</tt></dt>
+<dd><p class="first">Changesets with the given label in the extra metadata, with the given
+optional value.</p>
+<p class="last">If <cite>value</cite> starts with <cite>re:</cite>, the remainder of the value is treated as
+a regular expression. To match a value that actually starts with <cite>re:</cite>,
+use the prefix <cite>literal:</cite>.</p>
+</dd>
+<dt><tt class="docutils literal">file(pattern)</tt></dt>
+<dd><p class="first">Changesets affecting files matched by pattern.</p>
+<p class="last">For a faster but less accurate result, consider using <tt class="docutils literal">filelog()</tt>
+instead.</p>
+</dd>
+<dt><tt class="docutils literal">filelog(pattern)</tt></dt>
+<dd><p class="first">Changesets connected to the specified filelog.</p>
+<p class="last">For performance reasons, <tt class="docutils literal">filelog()</tt> does not show every changeset
+that affects the requested file(s). See <a class="reference external" href="hg.1.html#log"><tt class="docutils literal">hg help log</tt></a> for details. For
+a slower, more accurate result, use <tt class="docutils literal">file()</tt>.</p>
+</dd>
+<dt><tt class="docutils literal">first(set, [n])</tt></dt>
+<dd>An alias for limit().</dd>
+<dt><tt class="docutils literal"><span class="pre">follow([file])</span></tt></dt>
+<dd>An alias for <tt class="docutils literal">::.</tt> (ancestors of the working copy's first parent).
+If a filename is specified, the history of the given file is followed,
+including copies.</dd>
+<dt><tt class="docutils literal">grep(regex)</tt></dt>
+<dd>Like <tt class="docutils literal">keyword(string)</tt> but accepts a regex. Use <tt class="docutils literal"><span class="pre">grep(r'...')</span></tt>
+to ensure special escape characters are handled correctly. Unlike
+<tt class="docutils literal">keyword(string)</tt>, the match is case-sensitive.</dd>
+<dt><tt class="docutils literal">head()</tt></dt>
+<dd>Changeset is a named branch head.</dd>
+<dt><tt class="docutils literal">heads(set)</tt></dt>
+<dd>Members of set with no children in set.</dd>
+<dt><tt class="docutils literal">id(string)</tt></dt>
+<dd>Revision non-ambiguously specified by the given hex string prefix.</dd>
+<dt><tt class="docutils literal">keyword(string)</tt></dt>
+<dd>Search commit message, user name, and names of changed files for
+string. The match is case-insensitive.</dd>
+<dt><tt class="docutils literal">last(set, [n])</tt></dt>
+<dd>Last n members of set, defaulting to 1.</dd>
+<dt><tt class="docutils literal">limit(set, [n])</tt></dt>
+<dd>First n members of set, defaulting to 1.</dd>
+<dt><tt class="docutils literal">matching(revision [, field])</tt></dt>
+<dd><p class="first">Changesets in which a given set of fields match the set of fields in the
+selected revision or set.</p>
+<p>To match more than one field pass the list of fields to match separated
+by spaces (e.g. <tt class="docutils literal">author description</tt>).</p>
+<p>Valid fields are most regular revision fields and some special fields.</p>
+<p>Regular revision fields are <tt class="docutils literal">description</tt>, <tt class="docutils literal">author</tt>, <tt class="docutils literal">branch</tt>,
+<tt class="docutils literal">date</tt>, <tt class="docutils literal">files</tt>, <tt class="docutils literal">phase</tt>, <tt class="docutils literal">parents</tt>, <tt class="docutils literal">substate</tt>, <tt class="docutils literal">user</tt>
+and <tt class="docutils literal">diff</tt>.
+Note that <tt class="docutils literal">author</tt> and <tt class="docutils literal">user</tt> are synonyms. <tt class="docutils literal">diff</tt> refers to the
+contents of the revision. Two revisions matching their <tt class="docutils literal">diff</tt> will
+also match their <tt class="docutils literal">files</tt>.</p>
+<p>Special fields are <tt class="docutils literal">summary</tt> and <tt class="docutils literal">metadata</tt>:
+<tt class="docutils literal">summary</tt> matches the first line of the description.
+<tt class="docutils literal">metadata</tt> is equivalent to matching <tt class="docutils literal">description user date</tt>
+(i.e. it matches the main metadata fields).</p>
+<p class="last"><tt class="docutils literal">metadata</tt> is the default field which is used when no fields are
+specified. You can match more than one field at a time.</p>
+</dd>
+<dt><tt class="docutils literal">max(set)</tt></dt>
+<dd>Changeset with highest revision number in set.</dd>
+<dt><tt class="docutils literal">merge()</tt></dt>
+<dd>Changeset is a merge changeset.</dd>
+<dt><tt class="docutils literal">min(set)</tt></dt>
+<dd>Changeset with lowest revision number in set.</dd>
+<dt><tt class="docutils literal">modifies(pattern)</tt></dt>
+<dd>Changesets modifying files matched by pattern.</dd>
+<dt><tt class="docutils literal">obsolete()</tt></dt>
+<dd>Mutable changeset with a newer version.</dd>
+<dt><tt class="docutils literal"><span class="pre">origin([set])</span></tt></dt>
+<dd>Changesets that were specified as a source for the grafts, transplants or
+rebases that created the given revisions. Omitting the optional set is the
+same as passing all(). If a changeset created by these operations is itself
+specified as a source for one of these operations, only the source changeset
+for the first operation is selected.</dd>
+<dt><tt class="docutils literal"><span class="pre">outgoing([path])</span></tt></dt>
+<dd>Changesets not found in the specified destination repository, or the
+default push location.</dd>
+<dt><tt class="docutils literal"><span class="pre">p1([set])</span></tt></dt>
+<dd>First parent of changesets in set, or the working directory.</dd>
+<dt><tt class="docutils literal"><span class="pre">p2([set])</span></tt></dt>
+<dd>Second parent of changesets in set, or the working directory.</dd>
+<dt><tt class="docutils literal"><span class="pre">parents([set])</span></tt></dt>
+<dd>The set of all parents for all changesets in set, or the working directory.</dd>
+<dt><tt class="docutils literal">present(set)</tt></dt>
+<dd><p class="first">An empty set, if any revision in set isn't found; otherwise,
+all revisions in set.</p>
+<p class="last">If any of specified revisions is not present in the local repository,
+the query is normally aborted. But this predicate allows the query
+to continue even in such cases.</p>
+</dd>
+<dt><tt class="docutils literal">public()</tt></dt>
+<dd>Changeset in public phase.</dd>
+<dt><tt class="docutils literal"><span class="pre">remote([id</span> <span class="pre">[,path]])</span></tt></dt>
+<dd>Local revision that corresponds to the given identifier in a
+remote repository, if present. Here, the '.' identifier is a
+synonym for the current local branch.</dd>
+<dt><tt class="docutils literal">removes(pattern)</tt></dt>
+<dd>Changesets which remove files matching pattern.</dd>
+<dt><tt class="docutils literal">rev(number)</tt></dt>
+<dd>Revision with the given numeric identifier.</dd>
+<dt><tt class="docutils literal">reverse(set)</tt></dt>
+<dd>Reverse order of set.</dd>
+<dt><tt class="docutils literal">roots(set)</tt></dt>
+<dd>Changesets in set with no parent changeset in set.</dd>
+<dt><tt class="docutils literal">secret()</tt></dt>
+<dd>Changeset in secret phase.</dd>
+<dt><tt class="docutils literal">sort(set[, <span class="pre">[-]key...])</span></tt></dt>
+<dd><p class="first">Sort set by keys. The default sort order is ascending, specify a key
+as <tt class="docutils literal"><span class="pre">-key</span></tt> to sort in descending order.</p>
+<p>The keys can be:</p>
+<ul class="last simple">
+<li><tt class="docutils literal">rev</tt> for the revision number,</li>
+<li><tt class="docutils literal">branch</tt> for the branch name,</li>
+<li><tt class="docutils literal">desc</tt> for the commit message (description),</li>
+<li><tt class="docutils literal">user</tt> for user name (<tt class="docutils literal">author</tt> can be used as an alias),</li>
+<li><tt class="docutils literal">date</tt> for the commit date</li>
+</ul>
+</dd>
+<dt><tt class="docutils literal"><span class="pre">tag([name])</span></tt></dt>
+<dd>The specified tag by name, or all tagged revisions if no name is given.</dd>
+<dt><tt class="docutils literal">unstable()</tt></dt>
+<dd>Non-obsolete changesets with obsolete ancestors.</dd>
+<dt><tt class="docutils literal">user(string)</tt></dt>
+<dd><p class="first">User name contains string. The match is case-insensitive.</p>
+<p class="last">If <cite>string</cite> starts with <cite>re:</cite>, the remainder of the string is treated as
+a regular expression. To match a user that actually contains <cite>re:</cite>, use
+the prefix <cite>literal:</cite>.</p>
+</dd>
+</dl>
+<p>New predicates (known as &quot;aliases&quot;) can be defined, using any combination of
+existing predicates or other aliases. An alias definition looks like:</p>
+<pre class="literal-block">
+&lt;alias&gt; = &lt;definition&gt;
+</pre>
+<p>in the <tt class="docutils literal">revsetalias</tt> section of a Mercurial configuration file. Arguments
+of the form <cite>$1</cite>, <cite>$2</cite>, etc. are substituted from the alias into the
+definition.</p>
+<p>For example,</p>
+<pre class="literal-block">
+[revsetalias]
+h = heads()
+d($1) = sort($1, date)
+rs($1, $2) = reverse(sort($1, $2))
+</pre>
+<p>defines three aliases, <tt class="docutils literal">h</tt>, <tt class="docutils literal">d</tt>, and <tt class="docutils literal">rs</tt>. <tt class="docutils literal">rs(0:tip, author)</tt> is
+exactly equivalent to <tt class="docutils literal">reverse(sort(0:tip, author))</tt>.</p>
+<p>Command line equivalents for <a class="reference external" href="hg.1.html#log"><tt class="docutils literal">hg log</tt></a>:</p>
+<pre class="literal-block">
+-f -&gt; ::.
+-d x -&gt; date(x)
+-k x -&gt; keyword(x)
+-m -&gt; merge()
+-u x -&gt; user(x)
+-b x -&gt; branch(x)
+-P x -&gt; !::x
+-l x -&gt; limit(expr, x)
+</pre>
+<p>Some sample queries:</p>
+<ul>
+<li><p class="first">Changesets on the default branch:</p>
+<pre class="literal-block">
+hg log -r &quot;branch(default)&quot;
+</pre>
+</li>
+<li><p class="first">Changesets on the default branch since tag 1.5 (excluding merges):</p>
+<pre class="literal-block">
+hg log -r &quot;branch(default) and 1.5:: and not merge()&quot;
+</pre>
+</li>
+<li><p class="first">Open branch heads:</p>
+<pre class="literal-block">
+hg log -r &quot;head() and not closed()&quot;
+</pre>
+</li>
+<li><p class="first">Changesets between tags 1.3 and 1.5 mentioning &quot;bug&quot; that affect
+<tt class="docutils literal">hgext/*</tt>:</p>
+<pre class="literal-block">
+hg log -r &quot;1.3::1.5 and keyword(bug) and file('hgext/*')&quot;
+</pre>
+</li>
+<li><p class="first">Changesets committed in May 2008, sorted by user:</p>
+<pre class="literal-block">
+hg log -r &quot;sort(date('May 2008'), user)&quot;
+</pre>
+</li>
+<li><p class="first">Changesets mentioning &quot;bug&quot; or &quot;issue&quot; that are not in a tagged
+release:</p>
+<pre class="literal-block">
+hg log -r &quot;(keyword(bug) or keyword(issue)) and not ancestors(tagged())&quot;
+</pre>
+</li>
+</ul>
+</div>
+<div class="section" id="subrepositories">
+<span id="subrepo"></span><span id="subrepos"></span><h1><a class="toc-backref" href="#contents">Subrepositories</a></h1>
+<p>Subrepositories let you nest external repositories or projects into a
+parent Mercurial repository, and make commands operate on them as a
+group.</p>
+<p>Mercurial currently supports Mercurial, Git, and Subversion
+subrepositories.</p>
+<p>Subrepositories are made of three components:</p>
+<ol class="arabic">
+<li><p class="first">Nested repository checkouts. They can appear anywhere in the
+parent working directory.</p>
+</li>
+<li><p class="first">Nested repository references. They are defined in <tt class="docutils literal">.hgsub</tt>, which
+should be placed in the root of working directory, and
+tell where the subrepository checkouts come from. Mercurial
+subrepositories are referenced like:</p>
+<blockquote>
+<p>path/to/nested = <a class="reference external" href="https://example.com/nested/repo/path">https://example.com/nested/repo/path</a></p>
+</blockquote>
+<p>Git and Subversion subrepos are also supported:</p>
+<blockquote>
+<p>path/to/nested = [git]git://example.com/nested/repo/path
+path/to/nested = [svn]https://example.com/nested/trunk/path</p>
+</blockquote>
+<p>where <tt class="docutils literal">path/to/nested</tt> is the checkout location relatively to the
+parent Mercurial root, and <tt class="docutils literal"><span class="pre">https://example.com/nested/repo/path</span></tt>
+is the source repository path. The source can also reference a
+filesystem path.</p>
+<p>Note that <tt class="docutils literal">.hgsub</tt> does not exist by default in Mercurial
+repositories, you have to create and add it to the parent
+repository before using subrepositories.</p>
+</li>
+<li><p class="first">Nested repository states. They are defined in <tt class="docutils literal">.hgsubstate</tt>, which
+is placed in the root of working directory, and
+capture whatever information is required to restore the
+subrepositories to the state they were committed in a parent
+repository changeset. Mercurial automatically record the nested
+repositories states when committing in the parent repository.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">The <tt class="docutils literal">.hgsubstate</tt> file should not be edited manually.</p>
+</div>
+</li>
+</ol>
+<div class="section" id="adding-a-subrepository">
+<h2>Adding a Subrepository</h2>
+<p>If <tt class="docutils literal">.hgsub</tt> does not exist, create it and add it to the parent
+repository. Clone or checkout the external projects where you want it
+to live in the parent repository. Edit <tt class="docutils literal">.hgsub</tt> and add the
+subrepository entry as described above. At this point, the
+subrepository is tracked and the next commit will record its state in
+<tt class="docutils literal">.hgsubstate</tt> and bind it to the committed changeset.</p>
+</div>
+<div class="section" id="synchronizing-a-subrepository">
+<h2>Synchronizing a Subrepository</h2>
+<p>Subrepos do not automatically track the latest changeset of their
+sources. Instead, they are updated to the changeset that corresponds
+with the changeset checked out in the top-level changeset. This is so
+developers always get a consistent set of compatible code and
+libraries when they update.</p>
+<p>Thus, updating subrepos is a manual process. Simply check out target
+subrepo at the desired revision, test in the top-level repo, then
+commit in the parent repository to record the new combination.</p>
+</div>
+<div class="section" id="deleting-a-subrepository">
+<h2>Deleting a Subrepository</h2>
+<p>To remove a subrepository from the parent repository, delete its
+reference from <tt class="docutils literal">.hgsub</tt>, then remove its files.</p>
+</div>
+<div class="section" id="interaction-with-mercurial-commands">
+<h2>Interaction with Mercurial Commands</h2>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">add:</th><td class="field-body">add does not recurse in subrepos unless -S/--subrepos is
+specified. However, if you specify the full path of a file in a
+subrepo, it will be added even without -S/--subrepos specified.
+Git and Subversion subrepositories are currently silently
+ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">archive:</th><td class="field-body">archive does not recurse in subrepositories unless
+-S/--subrepos is specified.</td>
+</tr>
+<tr class="field"><th class="field-name">commit:</th><td class="field-body">commit creates a consistent snapshot of the state of the
+entire project and its subrepositories. If any subrepositories
+have been modified, Mercurial will abort. Mercurial can be made
+to instead commit all modified subrepositories by specifying
+-S/--subrepos, or setting &quot;ui.commitsubrepos=True&quot; in a
+configuration file (see <a class="reference external" href="hg.1.html#config"><tt class="docutils literal">hg help config</tt></a>). After there are no
+longer any modified subrepositories, it records their state and
+finally commits it in the parent repository.</td>
+</tr>
+<tr class="field"><th class="field-name">diff:</th><td class="field-body">diff does not recurse in subrepos unless -S/--subrepos is
+specified. Changes are displayed as usual, on the subrepositories
+elements. Git and Subversion subrepositories are currently
+silently ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">forget:</th><td class="field-body">forget currently only handles exact file matches in subrepos.
+Git and Subversion subrepositories are currently silently ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">incoming:</th><td class="field-body">incoming does not recurse in subrepos unless -S/--subrepos
+is specified. Git and Subversion subrepositories are currently
+silently ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">outgoing:</th><td class="field-body">outgoing does not recurse in subrepos unless -S/--subrepos
+is specified. Git and Subversion subrepositories are currently
+silently ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">pull:</th><td class="field-body">pull is not recursive since it is not clear what to pull prior
+to running <a class="reference external" href="hg.1.html#update"><tt class="docutils literal">hg update</tt></a>. Listing and retrieving all
+subrepositories changes referenced by the parent repository pulled
+changesets is expensive at best, impossible in the Subversion
+case.</td>
+</tr>
+<tr class="field"><th class="field-name">push:</th><td class="field-body">Mercurial will automatically push all subrepositories first
+when the parent repository is being pushed. This ensures new
+subrepository changes are available when referenced by top-level
+repositories. Push is a no-op for Subversion subrepositories.</td>
+</tr>
+<tr class="field"><th class="field-name">status:</th><td class="field-body">status does not recurse into subrepositories unless
+-S/--subrepos is specified. Subrepository changes are displayed as
+regular Mercurial changes on the subrepository
+elements. Subversion subrepositories are currently silently
+ignored.</td>
+</tr>
+<tr class="field"><th class="field-name">update:</th><td class="field-body">update restores the subrepos in the state they were
+originally committed in target changeset. If the recorded
+changeset is not available in the current subrepository, Mercurial
+will pull it in first before updating. This means that updating
+can require network access when using subrepositories.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="remapping-subrepositories-sources">
+<h2>Remapping Subrepositories Sources</h2>
+<p>A subrepository source location may change during a project life,
+invalidating references stored in the parent repository history. To
+fix this, rewriting rules can be defined in parent repository <tt class="docutils literal">hgrc</tt>
+file or in Mercurial configuration. See the <tt class="docutils literal">[subpaths]</tt> section in
+hgrc(5) for more details.</p>
+</div>
+</div>
+<div class="section" id="template-usage">
+<span id="style"></span><span id="template"></span><span id="templates"></span><span id="templating"></span><h1><a class="toc-backref" href="#contents">Template Usage</a></h1>
+<p>Mercurial allows you to customize output of commands through
+templates. You can either pass in a template from the command
+line, via the --template option, or select an existing
+template-style (--style).</p>
+<p>You can customize output for any &quot;log-like&quot; command: log,
+outgoing, incoming, tip, parents, heads and glog.</p>
+<p>Four styles are packaged with Mercurial: default (the style used
+when no explicit preference is passed), compact, changelog,
+and xml.
+Usage:</p>
+<pre class="literal-block">
+$ hg log -r1 --style changelog
+</pre>
+<p>A template is a piece of text, with markup to invoke variable
+expansion:</p>
+<pre class="literal-block">
+$ hg log -r1 --template &quot;{node}\n&quot;
+b56ce7b07c52de7d5fd79fb89701ea538af65746
+</pre>
+<p>Strings in curly braces are called keywords. The availability of
+keywords depends on the exact context of the templater. These
+keywords are usually available for templating a log-like command:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">author:</th><td class="field-body">String. The unmodified author of the changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">bisect:</th><td class="field-body">String. The changeset bisection status.</td>
+</tr>
+<tr class="field"><th class="field-name">bookmarks:</th><td class="field-body">List of strings. Any bookmarks associated with the
+changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">branch:</th><td class="field-body">String. The name of the branch on which the changeset was
+committed.</td>
+</tr>
+<tr class="field"><th class="field-name">branches:</th><td class="field-body">List of strings. The name of the branch on which the
+changeset was committed. Will be empty if the branch name was
+default.</td>
+</tr>
+<tr class="field"><th class="field-name">children:</th><td class="field-body">List of strings. The children of the changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">Date information. The date when the changeset was committed.</td>
+</tr>
+<tr class="field"><th class="field-name">desc:</th><td class="field-body">String. The text of the changeset description.</td>
+</tr>
+<tr class="field"><th class="field-name">diffstat:</th><td class="field-body">String. Statistics of changes with the following format:
+&quot;modified files: +added/-removed lines&quot;</td>
+</tr>
+<tr class="field"><th class="field-name">file_adds:</th><td class="field-body">List of strings. Files added by this changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">file_copies:</th><td class="field-body">List of strings. Files copied in this changeset with
+their sources.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">file_copies_switch:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">List of strings. Like &quot;file_copies&quot; but displayed
+only if the --copied switch is set.</td>
+</tr>
+<tr class="field"><th class="field-name">file_dels:</th><td class="field-body">List of strings. Files removed by this changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">file_mods:</th><td class="field-body">List of strings. Files modified by this changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">files:</th><td class="field-body">List of strings. All files modified, added, or removed by this
+changeset.</td>
+</tr>
+<tr class="field"><th class="field-name">latesttag:</th><td class="field-body">String. Most recent global tag in the ancestors of this
+changeset.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">latesttagdistance:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Integer. Longest path to the latest tag.</td>
+</tr>
+<tr class="field"><th class="field-name">node:</th><td class="field-body">String. The changeset identification hash, as a 40 hexadecimal
+digit string.</td>
+</tr>
+<tr class="field"><th class="field-name">parents:</th><td class="field-body">List of strings. The parents of the changeset in &quot;rev:node&quot;
+format. If the changeset has only one &quot;natural&quot; parent (the predecessor
+revision) nothing is shown.</td>
+</tr>
+<tr class="field"><th class="field-name">phase:</th><td class="field-body">String. The changeset phase name.</td>
+</tr>
+<tr class="field"><th class="field-name">phaseidx:</th><td class="field-body">Integer. The changeset phase index.</td>
+</tr>
+<tr class="field"><th class="field-name">rev:</th><td class="field-body">Integer. The repository-local changeset revision number.</td>
+</tr>
+<tr class="field"><th class="field-name">tags:</th><td class="field-body">List of strings. Any tags associated with the changeset.</td>
+</tr>
+</tbody>
+</table>
+<p>The &quot;date&quot; keyword does not produce human-readable output. If you
+want to use a date in your output, you can use a filter to process
+it. Filters are functions which return a string based on the input
+variable. Be sure to use the stringify filter first when you're
+applying a string-input filter to a list-like input variable.
+You can also use a chain of filters to get the desired output:</p>
+<pre class="literal-block">
+$ hg tip --template &quot;{date|isodate}\n&quot;
+2008-08-21 18:22 +0000
+</pre>
+<p>List of filters:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name">addbreaks:</th><td class="field-body">Any text. Add an XHTML &quot;&lt;br /&gt;&quot; tag before the end of
+every line except the last.</td>
+</tr>
+<tr class="field"><th class="field-name">age:</th><td class="field-body">Date. Returns a human-readable date/time difference between the
+given date/time and the current date/time.</td>
+</tr>
+<tr class="field"><th class="field-name">basename:</th><td class="field-body">Any text. Treats the text as a path, and returns the last
+component of the path after splitting by the path separator
+(ignoring trailing separators). For example, &quot;foo/bar/baz&quot; becomes
+&quot;baz&quot; and &quot;foo/bar//&quot; becomes &quot;bar&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">date:</th><td class="field-body">Date. Returns a date in a Unix date format, including the
+timezone: &quot;Mon Sep 04 15:13:13 2006 0700&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">domain:</th><td class="field-body">Any text. Finds the first string that looks like an email
+address, and extracts just the domain component. Example: <tt class="docutils literal">User
+&lt;user&#64;example.com&gt;</tt> becomes <tt class="docutils literal">example.com</tt>.</td>
+</tr>
+<tr class="field"><th class="field-name">email:</th><td class="field-body">Any text. Extracts the first string that looks like an email
+address. Example: <tt class="docutils literal">User &lt;user&#64;example.com&gt;</tt> becomes
+<tt class="docutils literal">user&#64;example.com</tt>.</td>
+</tr>
+<tr class="field"><th class="field-name">emailuser:</th><td class="field-body">Any text. Returns the user portion of an email address.</td>
+</tr>
+<tr class="field"><th class="field-name">escape:</th><td class="field-body">Any text. Replaces the special XML/XHTML characters &quot;&amp;&quot;, &quot;&lt;&quot;
+and &quot;&gt;&quot; with XML entities.</td>
+</tr>
+<tr class="field"><th class="field-name">fill68:</th><td class="field-body">Any text. Wraps the text to fit in 68 columns.</td>
+</tr>
+<tr class="field"><th class="field-name">fill76:</th><td class="field-body">Any text. Wraps the text to fit in 76 columns.</td>
+</tr>
+<tr class="field"><th class="field-name">firstline:</th><td class="field-body">Any text. Returns the first line of text.</td>
+</tr>
+<tr class="field"><th class="field-name">hex:</th><td class="field-body">Any text. Convert a binary Mercurial node identifier into
+its long hexadecimal representation.</td>
+</tr>
+<tr class="field"><th class="field-name">hgdate:</th><td class="field-body">Date. Returns the date as a pair of numbers: &quot;1157407993
+25200&quot; (Unix timestamp, timezone offset).</td>
+</tr>
+<tr class="field"><th class="field-name">isodate:</th><td class="field-body">Date. Returns the date in ISO 8601 format: &quot;2009-08-18 13:00
++0200&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">isodatesec:</th><td class="field-body">Date. Returns the date in ISO 8601 format, including
+seconds: &quot;2009-08-18 13:00:13 +0200&quot;. See also the rfc3339date
+filter.</td>
+</tr>
+<tr class="field"><th class="field-name">localdate:</th><td class="field-body">Date. Converts a date to local date.</td>
+</tr>
+<tr class="field"><th class="field-name">nonempty:</th><td class="field-body">Any text. Returns '(none)' if the string is empty.</td>
+</tr>
+<tr class="field"><th class="field-name">obfuscate:</th><td class="field-body">Any text. Returns the input text rendered as a sequence of
+XML entities.</td>
+</tr>
+<tr class="field"><th class="field-name">person:</th><td class="field-body">Any text. Returns the name before an email address,
+interpreting it as per RFC 5322.</td>
+</tr>
+<tr class="field"><th class="field-name">rfc3339date:</th><td class="field-body">Date. Returns a date using the Internet date format
+specified in RFC 3339: &quot;2009-08-18T13:00:13+02:00&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">rfc822date:</th><td class="field-body">Date. Returns a date using the same format used in email
+headers: &quot;Tue, 18 Aug 2009 13:00:13 +0200&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">short:</th><td class="field-body">Changeset hash. Returns the short form of a changeset hash,
+i.e. a 12 hexadecimal digit string.</td>
+</tr>
+<tr class="field"><th class="field-name">shortbisect:</th><td class="field-body">Any text. Treats <cite>text</cite> as a bisection status, and
+returns a single-character representing the status (G: good, B: bad,
+S: skipped, U: untested, I: ignored). Returns single space if <cite>text</cite>
+is not a valid bisection status.</td>
+</tr>
+<tr class="field"><th class="field-name">shortdate:</th><td class="field-body">Date. Returns a date like &quot;2006-09-18&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">stringify:</th><td class="field-body">Any type. Turns the value into text by converting values into
+text and concatenating them.</td>
+</tr>
+<tr class="field"><th class="field-name">strip:</th><td class="field-body">Any text. Strips all leading and trailing whitespace.</td>
+</tr>
+<tr class="field"><th class="field-name">stripdir:</th><td class="field-body">Treat the text as path and strip a directory level, if
+possible. For example, &quot;foo&quot; and &quot;foo/bar&quot; becomes &quot;foo&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">tabindent:</th><td class="field-body">Any text. Returns the text, with every line except the
+first starting with a tab character.</td>
+</tr>
+<tr class="field"><th class="field-name">urlescape:</th><td class="field-body">Any text. Escapes all &quot;special&quot; characters. For example,
+&quot;foo bar&quot; becomes &quot;foo%20bar&quot;.</td>
+</tr>
+<tr class="field"><th class="field-name">user:</th><td class="field-body">Any text. Returns a short representation of a user name or email
+address.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="url-paths">
+<span id="urls"></span><h1><a class="toc-backref" href="#contents">URL Paths</a></h1>
+<p>Valid URLs are of the form:</p>
+<pre class="literal-block">
+local/filesystem/path[#revision]
+file://local/filesystem/path[#revision]
+http://[user[:pass]&#64;]host[:port]/[path][#revision]
+https://[user[:pass]&#64;]host[:port]/[path][#revision]
+ssh://[user&#64;]host[:port]/[path][#revision]
+</pre>
+<p>Paths in the local filesystem can either point to Mercurial
+repositories or to bundle files (as created by <a class="reference external" href="hg.1.html#bundle"><tt class="docutils literal">hg bundle</tt></a> or :hg:`
+incoming --bundle`). See also <a class="reference external" href="hg.1.html#paths"><tt class="docutils literal">hg help paths</tt></a>.</p>
+<p>An optional identifier after # indicates a particular branch, tag, or
+changeset to use from the remote repository. See also <a class="reference external" href="hg.1.html#revisions"><tt class="docutils literal">hg help
+revisions</tt></a>.</p>
+<p>Some features, such as pushing to <a class="reference external" href="http://">http://</a> and <a class="reference external" href="https://">https://</a> URLs are only
+possible if the feature is explicitly enabled on the remote Mercurial
+server.</p>
+<p>Note that the security of HTTPS URLs depends on proper configuration of
+web.cacerts.</p>
+<p>Some notes about using SSH with Mercurial:</p>
+<ul>
+<li><p class="first">SSH requires an accessible shell account on the destination machine
+and a copy of hg in the remote path or specified with as remotecmd.</p>
+</li>
+<li><p class="first">path is relative to the remote user's home directory by default. Use
+an extra slash at the start of a path to specify an absolute path:</p>
+<pre class="literal-block">
+ssh://example.com//tmp/repository
+</pre>
+</li>
+<li><p class="first">Mercurial doesn't use its own compression via SSH; the right thing
+to do is to configure it in your ~/.ssh/config, e.g.:</p>
+<pre class="literal-block">
+Host *.mylocalnetwork.example.com
+ Compression no
+Host *
+ Compression yes
+</pre>
+<p>Alternatively specify &quot;ssh -C&quot; as your ssh command in your
+configuration file or with the --ssh command line option.</p>
+</li>
+</ul>
+<p>These URLs can all be stored in your configuration file with path
+aliases under the [paths] section like so:</p>
+<pre class="literal-block">
+[paths]
+alias1 = URL1
+alias2 = URL2
+...
+</pre>
+<p>You can then use the alias for any command that uses a URL (for
+example <a class="reference external" href="hg.1.html#pull"><tt class="docutils literal">hg pull alias1</tt></a> will be treated as <a class="reference external" href="hg.1.html#pull"><tt class="docutils literal">hg pull URL1</tt></a>).</p>
+<p>Two path aliases are special because they are used as defaults when
+you do not provide the URL to a command:</p>
+<dl class="docutils">
+<dt>default:</dt>
+<dd>When you create a repository with hg clone, the clone command saves
+the location of the source repository as the new repository's
+'default' path. This is then used when you omit path from push- and
+pull-like commands (including incoming and outgoing).</dd>
+<dt>default-push:</dt>
+<dd>The push command will look for a path named 'default-push', and
+prefer it over 'default' if both are defined.</dd>
+</dl>
+</div>
+<div class="section" id="id5">
+<h1><a class="toc-backref" href="#contents">Extensions</a></h1>
+<p>This section contains help for extensions that are distributed together with Mercurial. Help for other extensions is available in the help system.</p>
+<div class="contents htmlonly local topic" id="id6">
+<ul class="simple">
+<li><a class="reference internal" href="#acl" id="id68">acl</a></li>
+<li><a class="reference internal" href="#bugzilla" id="id69">bugzilla</a></li>
+<li><a class="reference internal" href="#children" id="id70">children</a></li>
+<li><a class="reference internal" href="#churn" id="id71">churn</a></li>
+<li><a class="reference internal" href="#color" id="id72">color</a></li>
+<li><a class="reference internal" href="#convert" id="id73">convert</a></li>
+<li><a class="reference internal" href="#eol" id="id74">eol</a></li>
+<li><a class="reference internal" href="#extdiff" id="id75">extdiff</a></li>
+<li><a class="reference internal" href="#factotum" id="id76">factotum</a></li>
+<li><a class="reference internal" href="#fetch" id="id77">fetch</a></li>
+<li><a class="reference internal" href="#gpg" id="id78">gpg</a></li>
+<li><a class="reference internal" href="#graphlog" id="id79">graphlog</a></li>
+<li><a class="reference internal" href="#hgcia" id="id80">hgcia</a></li>
+<li><a class="reference internal" href="#hgk" id="id81">hgk</a></li>
+<li><a class="reference internal" href="#highlight" id="id82">highlight</a></li>
+<li><a class="reference internal" href="#histedit" id="id83">histedit</a></li>
+<li><a class="reference internal" href="#inotify" id="id84">inotify</a></li>
+<li><a class="reference internal" href="#interhg" id="id85">interhg</a></li>
+<li><a class="reference internal" href="#keyword" id="id86">keyword</a></li>
+<li><a class="reference internal" href="#largefiles" id="id87">largefiles</a></li>
+<li><a class="reference internal" href="#mq" id="id88">mq</a></li>
+<li><a class="reference internal" href="#notify" id="id89">notify</a></li>
+<li><a class="reference internal" href="#pager" id="id90">pager</a></li>
+<li><a class="reference internal" href="#patchbomb" id="id91">patchbomb</a></li>
+<li><a class="reference internal" href="#progress" id="id92">progress</a></li>
+<li><a class="reference internal" href="#purge" id="id93">purge</a></li>
+<li><a class="reference internal" href="#rebase" id="id94">rebase</a></li>
+<li><a class="reference internal" href="#record" id="id95">record</a></li>
+<li><a class="reference internal" href="#relink" id="id96">relink</a></li>
+<li><a class="reference internal" href="#schemes" id="id97">schemes</a></li>
+<li><a class="reference internal" href="#share" id="id98">share</a></li>
+<li><a class="reference internal" href="#transplant" id="id99">transplant</a></li>
+<li><a class="reference internal" href="#win32mbcs" id="id100">win32mbcs</a></li>
+<li><a class="reference internal" href="#win32text" id="id101">win32text</a></li>
+<li><a class="reference internal" href="#zeroconf" id="id102">zeroconf</a></li>
+</ul>
+</div>
+<div class="section" id="acl">
+<h2><a class="toc-backref" href="#id68">acl</a></h2>
+<p>hooks for controlling repository access</p>
+<p>This hook makes it possible to allow or deny write access to given
+branches and paths of a repository when receiving incoming changesets
+via pretxnchangegroup and pretxncommit.</p>
+<p>The authorization is matched based on the local user name on the
+system where the hook runs, and not the committer of the original
+changeset (since the latter is merely informative).</p>
+<p>The acl hook is best used along with a restricted shell like hgsh,
+preventing authenticating users from doing anything other than pushing
+or pulling. The hook is not safe to use if users have interactive
+shell access, as they can then disable the hook. Nor is it safe if
+remote users share an account, because then there is no way to
+distinguish them.</p>
+<p>The order in which access checks are performed is:</p>
+<ol class="arabic simple">
+<li>Deny list for branches (section <tt class="docutils literal">acl.deny.branches</tt>)</li>
+<li>Allow list for branches (section <tt class="docutils literal">acl.allow.branches</tt>)</li>
+<li>Deny list for paths (section <tt class="docutils literal">acl.deny</tt>)</li>
+<li>Allow list for paths (section <tt class="docutils literal">acl.allow</tt>)</li>
+</ol>
+<p>The allow and deny sections take key-value pairs.</p>
+<div class="section" id="branch-based-access-control">
+<h3>Branch-based Access Control</h3>
+<p>Use the <tt class="docutils literal">acl.deny.branches</tt> and <tt class="docutils literal">acl.allow.branches</tt> sections to
+have branch-based access control. Keys in these sections can be
+either:</p>
+<ul class="simple">
+<li>a branch name, or</li>
+<li>an asterisk, to match any branch;</li>
+</ul>
+<p>The corresponding values can be either:</p>
+<ul class="simple">
+<li>a comma-separated list containing users and groups, or</li>
+<li>an asterisk, to match anyone;</li>
+</ul>
+<p>You can add the &quot;!&quot; prefix to a user or group name to invert the sense
+of the match.</p>
+</div>
+<div class="section" id="path-based-access-control">
+<h3>Path-based Access Control</h3>
+<p>Use the <tt class="docutils literal">acl.deny</tt> and <tt class="docutils literal">acl.allow</tt> sections to have path-based
+access control. Keys in these sections accept a subtree pattern (with
+a glob syntax by default). The corresponding values follow the same
+syntax as the other sections above.</p>
+</div>
+<div class="section" id="groups">
+<h3>Groups</h3>
+<p>Group names must be prefixed with an <tt class="docutils literal">&#64;</tt> symbol. Specifying a group
+name has the same effect as specifying all the users in that group.</p>
+<p>You can define group members in the <tt class="docutils literal">acl.groups</tt> section.
+If a group name is not defined there, and Mercurial is running under
+a Unix-like system, the list of users will be taken from the OS.
+Otherwise, an exception will be raised.</p>
+</div>
+<div class="section" id="example-configuration">
+<h3>Example Configuration</h3>
+<pre class="literal-block">
+[hooks]
+
+# Use this if you want to check access restrictions at commit time
+pretxncommit.acl = python:hgext.acl.hook
+
+# Use this if you want to check access restrictions for pull, push,
+# bundle and serve.
+pretxnchangegroup.acl = python:hgext.acl.hook
+
+[acl]
+# Allow or deny access for incoming changes only if their source is
+# listed here, let them pass otherwise. Source is &quot;serve&quot; for all
+# remote access (http or ssh), &quot;push&quot;, &quot;pull&quot; or &quot;bundle&quot; when the
+# related commands are run locally.
+# Default: serve
+sources = serve
+
+[acl.deny.branches]
+
+# Everyone is denied to the frozen branch:
+frozen-branch = *
+
+# A bad user is denied on all branches:
+* = bad-user
+
+[acl.allow.branches]
+
+# A few users are allowed on branch-a:
+branch-a = user-1, user-2, user-3
+
+# Only one user is allowed on branch-b:
+branch-b = user-1
+
+# The super user is allowed on any branch:
+* = super-user
+
+# Everyone is allowed on branch-for-tests:
+branch-for-tests = *
+
+[acl.deny]
+# This list is checked first. If a match is found, acl.allow is not
+# checked. All users are granted access if acl.deny is not present.
+# Format for both lists: glob pattern = user, ..., &#64;group, ...
+
+# To match everyone, use an asterisk for the user:
+# my/glob/pattern = *
+
+# user6 will not have write access to any file:
+** = user6
+
+# Group &quot;hg-denied&quot; will not have write access to any file:
+** = &#64;hg-denied
+
+# Nobody will be able to change &quot;DONT-TOUCH-THIS.txt&quot;, despite
+# everyone being able to change all other files. See below.
+src/main/resources/DONT-TOUCH-THIS.txt = *
+
+[acl.allow]
+# if acl.allow is not present, all users are allowed by default
+# empty acl.allow = no users allowed
+
+# User &quot;doc_writer&quot; has write access to any file under the &quot;docs&quot;
+# folder:
+docs/** = doc_writer
+
+# User &quot;jack&quot; and group &quot;designers&quot; have write access to any file
+# under the &quot;images&quot; folder:
+images/** = jack, &#64;designers
+
+# Everyone (except for &quot;user6&quot; and &quot;&#64;hg-denied&quot; - see acl.deny above)
+# will have write access to any file under the &quot;resources&quot; folder
+# (except for 1 file. See acl.deny):
+src/main/resources/** = *
+
+.hgtags = release_engineer
+</pre>
+<div class="section" id="examples-using-the-prefix">
+<h4>Examples using the &quot;!&quot; prefix</h4>
+<p>Suppose there's a branch that only a given user (or group) should be able to
+push to, and you don't want to restrict access to any other branch that may
+be created.</p>
+<p>The &quot;!&quot; prefix allows you to prevent anyone except a given user or group to
+push changesets in a given branch or path.</p>
+<p>In the examples below, we will:
+1) Deny access to branch &quot;ring&quot; to anyone but user &quot;gollum&quot;
+2) Deny access to branch &quot;lake&quot; to anyone but members of the group &quot;hobbit&quot;
+3) Deny access to a file to anyone but user &quot;gollum&quot;</p>
+<pre class="literal-block">
+[acl.allow.branches]
+# Empty
+
+[acl.deny.branches]
+
+# 1) only 'gollum' can commit to branch 'ring';
+# 'gollum' and anyone else can still commit to any other branch.
+ring = !gollum
+
+# 2) only members of the group 'hobbit' can commit to branch 'lake';
+# 'hobbit' members and anyone else can still commit to any other branch.
+lake = !&#64;hobbit
+
+# You can also deny access based on file paths:
+
+[acl.allow]
+# Empty
+
+[acl.deny]
+# 3) only 'gollum' can change the file below;
+# 'gollum' and anyone else can still change any other file.
+/misty/mountains/cave/ring = !gollum
+</pre>
+</div>
+</div>
+</div>
+<div class="section" id="bugzilla">
+<h2><a class="toc-backref" href="#id69">bugzilla</a></h2>
+<p>hooks for integrating with the Bugzilla bug tracker</p>
+<p>This hook extension adds comments on bugs in Bugzilla when changesets
+that refer to bugs by Bugzilla ID are seen. The comment is formatted using
+the Mercurial template mechanism.</p>
+<p>The bug references can optionally include an update for Bugzilla of the
+hours spent working on the bug. Bugs can also be marked fixed.</p>
+<p>Three basic modes of access to Bugzilla are provided:</p>
+<ol class="arabic simple">
+<li>Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later.</li>
+<li>Check data via the Bugzilla XMLRPC interface and submit bug change
+via email to Bugzilla email interface. Requires Bugzilla 3.4 or later.</li>
+<li>Writing directly to the Bugzilla database. Only Bugzilla installations
+using MySQL are supported. Requires Python MySQLdb.</li>
+</ol>
+<p>Writing directly to the database is susceptible to schema changes, and
+relies on a Bugzilla contrib script to send out bug change
+notification emails. This script runs as the user running Mercurial,
+must be run on the host with the Bugzilla install, and requires
+permission to read Bugzilla configuration details and the necessary
+MySQL user and password to have full access rights to the Bugzilla
+database. For these reasons this access mode is now considered
+deprecated, and will not be updated for new Bugzilla versions going
+forward. Only adding comments is supported in this access mode.</p>
+<p>Access via XMLRPC needs a Bugzilla username and password to be specified
+in the configuration. Comments are added under that username. Since the
+configuration must be readable by all Mercurial users, it is recommended
+that the rights of that user are restricted in Bugzilla to the minimum
+necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later.</p>
+<p>Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends
+email to the Bugzilla email interface to submit comments to bugs.
+The From: address in the email is set to the email address of the Mercurial
+user, so the comment appears to come from the Mercurial user. In the event
+that the Mercurial user email is not recognised by Bugzilla as a Bugzilla
+user, the email associated with the Bugzilla username used to log into
+Bugzilla is used instead as the source of the comment. Marking bugs fixed
+works on all supported Bugzilla versions.</p>
+<p>Configuration items common to all access modes:</p>
+<dl class="docutils">
+<dt>bugzilla.version</dt>
+<dd><p class="first">This access type to use. Values recognised are:</p>
+<table class="last docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">xmlrpc</tt>:</th><td class="field-body">Bugzilla XMLRPC interface.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">xmlrpc+email</tt>:</th><td class="field-body">Bugzilla XMLRPC and email interfaces.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">3.0</tt>:</th><td class="field-body">MySQL access, Bugzilla 3.0 and later.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">2.18</tt>:</th><td class="field-body">MySQL access, Bugzilla 2.18 and up to but not
+including 3.0.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">2.16</tt>:</th><td class="field-body">MySQL access, Bugzilla 2.16 and up to but not
+including 2.18.</td>
+</tr>
+</tbody>
+</table>
+</dd>
+<dt>bugzilla.regexp</dt>
+<dd>Regular expression to match bug IDs for update in changeset commit message.
+It must contain one &quot;()&quot; named group <tt class="docutils literal">&lt;ids&gt;</tt> containing the bug
+IDs separated by non-digit characters. It may also contain
+a named group <tt class="docutils literal">&lt;hours&gt;</tt> with a floating-point number giving the
+hours worked on the bug. If no named groups are present, the first
+&quot;()&quot; group is assumed to contain the bug IDs, and work time is not
+updated. The default expression matches <tt class="docutils literal">Bug 1234</tt>, <tt class="docutils literal">Bug no. 1234</tt>,
+<tt class="docutils literal">Bug number 1234</tt>, <tt class="docutils literal">Bugs 1234,5678</tt>, <tt class="docutils literal">Bug 1234 and 5678</tt> and
+variations thereof, followed by an hours number prefixed by <tt class="docutils literal">h</tt> or
+<tt class="docutils literal">hours</tt>, e.g. <tt class="docutils literal">hours 1.5</tt>. Matching is case insensitive.</dd>
+<dt>bugzilla.fixregexp</dt>
+<dd>Regular expression to match bug IDs for marking fixed in changeset
+commit message. This must contain a &quot;()&quot; named group <tt class="docutils literal">&lt;ids&gt;` containing
+the bug IDs separated by <span class="pre">non-digit</span> characters. It may also contain
+a named group <span class="pre">``&lt;hours&gt;</span></tt> with a floating-point number giving the
+hours worked on the bug. If no named groups are present, the first
+&quot;()&quot; group is assumed to contain the bug IDs, and work time is not
+updated. The default expression matches <tt class="docutils literal">Fixes 1234</tt>, <tt class="docutils literal">Fixes bug 1234</tt>,
+<tt class="docutils literal">Fixes bugs 1234,5678</tt>, <tt class="docutils literal">Fixes 1234 and 5678</tt> and
+variations thereof, followed by an hours number prefixed by <tt class="docutils literal">h</tt> or
+<tt class="docutils literal">hours</tt>, e.g. <tt class="docutils literal">hours 1.5</tt>. Matching is case insensitive.</dd>
+<dt>bugzilla.fixstatus</dt>
+<dd>The status to set a bug to when marking fixed. Default <tt class="docutils literal">RESOLVED</tt>.</dd>
+<dt>bugzilla.fixresolution</dt>
+<dd>The resolution to set a bug to when marking fixed. Default <tt class="docutils literal">FIXED</tt>.</dd>
+<dt>bugzilla.style</dt>
+<dd>The style file to use when formatting comments.</dd>
+<dt>bugzilla.template</dt>
+<dd><p class="first">Template to use when formatting comments. Overrides style if
+specified. In addition to the usual Mercurial keywords, the
+extension specifies:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">{bug}</tt>:</th><td class="field-body">The Bugzilla bug ID.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">{root}</tt>:</th><td class="field-body">The full pathname of the Mercurial repository.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">{webroot}</tt>:</th><td class="field-body">Stripped pathname of the Mercurial repository.</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">{hgweb}</tt>:</th><td class="field-body">Base URL for browsing Mercurial repositories.</td>
+</tr>
+</tbody>
+</table>
+<p class="last">Default <tt class="docutils literal">changeset {node|short} in repo {root} refers to bug
+<span class="pre">{bug}.\ndetails:\n\t{desc|tabindent}</span></tt></p>
+</dd>
+<dt>bugzilla.strip</dt>
+<dd>The number of path separator characters to strip from the front of
+the Mercurial repository path (<tt class="docutils literal">{root}</tt> in templates) to produce
+<tt class="docutils literal">{webroot}</tt>. For example, a repository with <tt class="docutils literal">{root}</tt>
+<tt class="docutils literal"><span class="pre">/var/local/my-project</span></tt> with a strip of 2 gives a value for
+<tt class="docutils literal">{webroot}</tt> of <tt class="docutils literal"><span class="pre">my-project</span></tt>. Default 0.</dd>
+<dt>web.baseurl</dt>
+<dd>Base URL for browsing Mercurial repositories. Referenced from
+templates as <tt class="docutils literal">{hgweb}</tt>.</dd>
+</dl>
+<p>Configuration items common to XMLRPC+email and MySQL access modes:</p>
+<dl class="docutils">
+<dt>bugzilla.usermap</dt>
+<dd><p class="first">Path of file containing Mercurial committer email to Bugzilla user email
+mappings. If specified, the file should contain one mapping per
+line:</p>
+<pre class="literal-block">
+committer = Bugzilla user
+</pre>
+<p class="last">See also the <tt class="docutils literal">[usermap]</tt> section.</p>
+</dd>
+</dl>
+<p>The <tt class="docutils literal">[usermap]</tt> section is used to specify mappings of Mercurial
+committer email to Bugzilla user email. See also <tt class="docutils literal">bugzilla.usermap</tt>.
+Contains entries of the form <tt class="docutils literal">committer = Bugzilla user</tt>.</p>
+<p>XMLRPC access mode configuration:</p>
+<dl class="docutils">
+<dt>bugzilla.bzurl</dt>
+<dd>The base URL for the Bugzilla installation.
+Default <tt class="docutils literal"><span class="pre">http://localhost/bugzilla</span></tt>.</dd>
+<dt>bugzilla.user</dt>
+<dd>The username to use to log into Bugzilla via XMLRPC. Default
+<tt class="docutils literal">bugs</tt>.</dd>
+<dt>bugzilla.password</dt>
+<dd>The password for Bugzilla login.</dd>
+</dl>
+<p>XMLRPC+email access mode uses the XMLRPC access mode configuration items,
+and also:</p>
+<dl class="docutils">
+<dt>bugzilla.bzemail</dt>
+<dd>The Bugzilla email address.</dd>
+</dl>
+<p>In addition, the Mercurial email settings must be configured. See the
+documentation in hgrc(5), sections <tt class="docutils literal">[email]</tt> and <tt class="docutils literal">[smtp]</tt>.</p>
+<p>MySQL access mode configuration:</p>
+<dl class="docutils">
+<dt>bugzilla.host</dt>
+<dd>Hostname of the MySQL server holding the Bugzilla database.
+Default <tt class="docutils literal">localhost</tt>.</dd>
+<dt>bugzilla.db</dt>
+<dd>Name of the Bugzilla database in MySQL. Default <tt class="docutils literal">bugs</tt>.</dd>
+<dt>bugzilla.user</dt>
+<dd>Username to use to access MySQL server. Default <tt class="docutils literal">bugs</tt>.</dd>
+<dt>bugzilla.password</dt>
+<dd>Password to use to access MySQL server.</dd>
+<dt>bugzilla.timeout</dt>
+<dd>Database connection timeout (seconds). Default 5.</dd>
+<dt>bugzilla.bzuser</dt>
+<dd>Fallback Bugzilla user name to record comments with, if changeset
+committer cannot be found as a Bugzilla user.</dd>
+<dt>bugzilla.bzdir</dt>
+<dd>Bugzilla install directory. Used by default notify. Default
+<tt class="docutils literal">/var/www/html/bugzilla</tt>.</dd>
+<dt>bugzilla.notify</dt>
+<dd>The command to run to get Bugzilla to send bug change notification
+emails. Substitutes from a map with 3 keys, <tt class="docutils literal">bzdir</tt>, <tt class="docutils literal">id</tt> (bug
+id) and <tt class="docutils literal">user</tt> (committer bugzilla email). Default depends on
+version; from 2.18 it is &quot;cd %(bzdir)s &amp;&amp; perl -T
+contrib/sendbugmail.pl %(id)s %(user)s&quot;.</dd>
+</dl>
+<p>Activating the extension:</p>
+<pre class="literal-block">
+[extensions]
+bugzilla =
+
+[hooks]
+# run bugzilla hook on every change pulled or pushed in here
+incoming.bugzilla = python:hgext.bugzilla.hook
+</pre>
+<p>Example configurations:</p>
+<p>XMLRPC example configuration. This uses the Bugzilla at
+<tt class="docutils literal"><span class="pre">http://my-project.org/bugzilla</span></tt>, logging in as user
+<tt class="docutils literal"><span class="pre">bugmail&#64;my-project.org</span></tt> with password <tt class="docutils literal">plugh</tt>. It is used with a
+collection of Mercurial repositories in <tt class="docutils literal">/var/local/hg/repos/</tt>,
+with a web interface at <tt class="docutils literal"><span class="pre">http://my-project.org/hg</span></tt>.</p>
+<pre class="literal-block">
+[bugzilla]
+bzurl=http://my-project.org/bugzilla
+user=bugmail&#64;my-project.org
+password=plugh
+version=xmlrpc
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\n
+ {desc}\n
+strip=5
+
+[web]
+baseurl=http://my-project.org/hg
+</pre>
+<p>XMLRPC+email example configuration. This uses the Bugzilla at
+<tt class="docutils literal"><span class="pre">http://my-project.org/bugzilla</span></tt>, logging in as user
+<tt class="docutils literal"><span class="pre">bugmail&#64;my-project.org</span></tt> with password <tt class="docutils literal">plugh</tt>. It is used with a
+collection of Mercurial repositories in <tt class="docutils literal">/var/local/hg/repos/</tt>,
+with a web interface at <tt class="docutils literal"><span class="pre">http://my-project.org/hg</span></tt>. Bug comments
+are sent to the Bugzilla email address
+<tt class="docutils literal"><span class="pre">bugzilla&#64;my-project.org</span></tt>.</p>
+<pre class="literal-block">
+[bugzilla]
+bzurl=http://my-project.org/bugzilla
+user=bugmail&#64;my-project.org
+password=plugh
+version=xmlrpc
+bzemail=bugzilla&#64;my-project.org
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\n
+ {desc}\n
+strip=5
+
+[web]
+baseurl=http://my-project.org/hg
+
+[usermap]
+user&#64;emaildomain.com=user.name&#64;bugzilladomain.com
+</pre>
+<p>MySQL example configuration. This has a local Bugzilla 3.2 installation
+in <tt class="docutils literal"><span class="pre">/opt/bugzilla-3.2</span></tt>. The MySQL database is on <tt class="docutils literal">localhost</tt>,
+the Bugzilla database name is <tt class="docutils literal">bugs</tt> and MySQL is
+accessed with MySQL username <tt class="docutils literal">bugs</tt> password <tt class="docutils literal">XYZZY</tt>. It is used
+with a collection of Mercurial repositories in <tt class="docutils literal">/var/local/hg/repos/</tt>,
+with a web interface at <tt class="docutils literal"><span class="pre">http://my-project.org/hg</span></tt>.</p>
+<pre class="literal-block">
+[bugzilla]
+host=localhost
+password=XYZZY
+version=3.0
+bzuser=unknown&#64;domain.com
+bzdir=/opt/bugzilla-3.2
+template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\n
+ {desc}\n
+strip=5
+
+[web]
+baseurl=http://my-project.org/hg
+
+[usermap]
+user&#64;emaildomain.com=user.name&#64;bugzilladomain.com
+</pre>
+<p>All the above add a comment to the Bugzilla bug record of the form:</p>
+<pre class="literal-block">
+Changeset 3b16791d6642 in repository-name.
+http://my-project.org/hg/repository-name/rev/3b16791d6642
+
+Changeset commit comment. Bug 1234.
+</pre>
+</div>
+<div class="section" id="children">
+<h2><a class="toc-backref" href="#id70">children</a></h2>
+<p>command to display child changesets (DEPRECATED)</p>
+<p>This extension is deprecated. You should use <a class="reference external" href="hg.1.html#log"><tt class="docutils literal">hg log <span class="pre">-r</span>
+&quot;children(REV)&quot;</tt></a> instead.</p>
+<div class="section" id="id7">
+<h3>Commands</h3>
+<div class="section" id="id8">
+<h4>children</h4>
+<pre class="literal-block">
+hg children [-r REV] [FILE]
+</pre>
+<p>Print the children of the working directory's revisions. If a
+revision is given via -r/--rev, the children of that revision will
+be printed. If a file argument is given, revision in which the
+file was last changed (after the working directory revision or the
+argument to --rev if given) is printed.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>show children of the specified revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="churn">
+<h2><a class="toc-backref" href="#id71">churn</a></h2>
+<p>command to display statistics about repository history</p>
+<div class="section" id="id9">
+<h3>Commands</h3>
+<div class="section" id="id10">
+<h4>churn</h4>
+<pre class="literal-block">
+hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]
+</pre>
+<p>This command will display a histogram representing the number
+of changed lines or revisions, grouped according to the given
+template. The default template will group changes by author.
+The --dateformat option may be used to group the results by
+date instead.</p>
+<p>Statistics are based on the number of changed lines, or
+alternatively the number of matching revisions if the
+--changesets option is specified.</p>
+<p>Examples:</p>
+<pre class="literal-block">
+# display count of changed lines for every committer
+hg churn -t '{author|email}'
+
+# display daily activity graph
+hg churn -f '%H' -s -c
+
+# display activity of developers by month
+hg churn -f '%Y-%m' -s -c
+
+# display count of lines changed in every year
+hg churn -f '%Y' -s
+</pre>
+<p>It is possible to map alternate email addresses to a main address
+by providing a file using the following format:</p>
+<pre class="literal-block">
+&lt;alias email&gt; = &lt;actual email&gt;
+</pre>
+<p>Such a file may be specified with the --aliases option, otherwise
+a .hgchurn file will be looked for in the working directory root.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>count rate for the specified revision or range</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>count rate for revisions matching date spec</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--template</span></kbd></td>
+<td>template to group changesets (default: {author|email})</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-f</span>, <span class="option">--dateformat</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>strftime-compatible format for grouping by date</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-c</span>, <span class="option">--changesets</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>count rate by number of changesets</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--sort</span></kbd></td>
+<td>sort by key (default: sort by count)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--diffstat</span></kbd></td>
+<td>display added/removed lines separately</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--aliases</span></kbd></td>
+<td>file with email aliases</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="color">
+<h2><a class="toc-backref" href="#id72">color</a></h2>
+<p>colorize output from some commands</p>
+<p>This extension modifies the status and resolve commands to add color
+to their output to reflect file status, the qseries command to add
+color to reflect patch status (applied, unapplied, missing), and to
+diff-related commands to highlight additions, removals, diff headers,
+and trailing whitespace.</p>
+<p>Other effects in addition to color, like bold and underlined text, are
+also available. By default, the terminfo database is used to find the
+terminal codes used to change color and effect. If terminfo is not
+available, then effects are rendered with the ECMA-48 SGR control
+function (aka ANSI escape codes).</p>
+<p>Default effects may be overridden from your configuration file:</p>
+<pre class="literal-block">
+[color]
+status.modified = blue bold underline red_background
+status.added = green bold
+status.removed = red bold blue_background
+status.deleted = cyan bold underline
+status.unknown = magenta bold underline
+status.ignored = black bold
+
+# 'none' turns off all effects
+status.clean = none
+status.copied = none
+
+qseries.applied = blue bold underline
+qseries.unapplied = black bold
+qseries.missing = red bold
+
+diff.diffline = bold
+diff.extended = cyan bold
+diff.file_a = red bold
+diff.file_b = green bold
+diff.hunk = magenta
+diff.deleted = red
+diff.inserted = green
+diff.changed = white
+diff.trailingwhitespace = bold red_background
+
+resolve.unresolved = red bold
+resolve.resolved = green bold
+
+bookmarks.current = green
+
+branches.active = none
+branches.closed = black bold
+branches.current = green
+branches.inactive = none
+
+tags.normal = green
+tags.local = black bold
+</pre>
+<p>The available effects in terminfo mode are 'blink', 'bold', 'dim',
+'inverse', 'invisible', 'italic', 'standout', and 'underline'; in
+ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and
+'underline'. How each is rendered depends on the terminal emulator.
+Some may not be available for a given terminal type, and will be
+silently ignored.</p>
+<p>Note that on some systems, terminfo mode may cause problems when using
+color with the pager extension and less -R. less with the -R option
+will only display ECMA-48 color codes, and terminfo mode may sometimes
+emit codes that less doesn't understand. You can work around this by
+either using ansi mode (or auto mode), or by using less -r (which will
+pass through all terminal control codes, not just color control
+codes).</p>
+<p>Because there are only eight standard colors, this module allows you
+to define color names for other color slots which might be available
+for your terminal type, assuming terminfo mode. For instance:</p>
+<pre class="literal-block">
+color.brightblue = 12
+color.pink = 207
+color.orange = 202
+</pre>
+<p>to set 'brightblue' to color slot 12 (useful for 16 color terminals
+that have brighter colors defined in the upper eight) and, 'pink' and
+'orange' to colors in 256-color xterm's default color cube. These
+defined colors may then be used as any of the pre-defined eight,
+including appending '_background' to set the background to that color.</p>
+<p>By default, the color extension will use ANSI mode (or win32 mode on
+Windows) if it detects a terminal. To override auto mode (to enable
+terminfo mode, for example), set the following configuration option:</p>
+<pre class="literal-block">
+[color]
+mode = terminfo
+</pre>
+<p>Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will
+disable color.</p>
+</div>
+<div class="section" id="convert">
+<h2><a class="toc-backref" href="#id73">convert</a></h2>
+<p>import revisions from foreign VCS repositories into Mercurial</p>
+<div class="section" id="id11">
+<h3>Commands</h3>
+<div class="section" id="id12">
+<h4>convert</h4>
+<pre class="literal-block">
+hg convert [OPTION]... SOURCE [DEST [REVMAP]]
+</pre>
+<p>Accepted source formats [identifiers]:</p>
+<ul class="simple">
+<li>Mercurial [hg]</li>
+<li>CVS [cvs]</li>
+<li>Darcs [darcs]</li>
+<li>git [git]</li>
+<li>Subversion [svn]</li>
+<li>Monotone [mtn]</li>
+<li>GNU Arch [gnuarch]</li>
+<li>Bazaar [bzr]</li>
+<li>Perforce [p4]</li>
+</ul>
+<p>Accepted destination formats [identifiers]:</p>
+<ul class="simple">
+<li>Mercurial [hg]</li>
+<li>Subversion [svn] (history on branches is not preserved)</li>
+</ul>
+<p>If no revision is given, all revisions will be converted.
+Otherwise, convert will only import up to the named revision
+(given in a format understood by the source).</p>
+<p>If no destination directory name is specified, it defaults to the
+basename of the source with <tt class="docutils literal"><span class="pre">-hg</span></tt> appended. If the destination
+repository doesn't exist, it will be created.</p>
+<p>By default, all sources except Mercurial will use --branchsort.
+Mercurial uses --sourcesort to preserve original revision numbers
+order. Sort modes have the following effects:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--branchsort</span></kbd></td>
+<td>convert from parent to child revision when possible,
+which means branches are usually converted one after
+the other. It generates more compact repositories.</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--datesort</span></kbd></td>
+<td>sort revisions by date. Converted repositories have
+good-looking changelogs but are often an order of
+magnitude larger than the same ones generated by
+--branchsort.</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--sourcesort</span></kbd></td>
+<td>try to preserve source revisions order, only
+supported by Mercurial sources.</td></tr>
+</tbody>
+</table>
+<p>If <tt class="docutils literal">REVMAP</tt> isn't given, it will be put in a default location
+(<tt class="docutils literal"><span class="pre">&lt;dest&gt;/.hg/shamap</span></tt> by default). The <tt class="docutils literal">REVMAP</tt> is a simple
+text file that maps each source commit ID to the destination ID
+for that revision, like so:</p>
+<pre class="literal-block">
+&lt;source ID&gt; &lt;destination ID&gt;
+</pre>
+<p>If the file doesn't exist, it's automatically created. It's
+updated on each commit copied, so <a class="reference external" href="hg.1.html#convert"><tt class="docutils literal">hg convert</tt></a> can be interrupted
+and can be run repeatedly to copy new commits.</p>
+<p>The authormap is a simple text file that maps each source commit
+author to a destination commit author. It is handy for source SCMs
+that use unix logins to identify authors (eg: CVS). One line per
+author mapping and the line format is:</p>
+<pre class="literal-block">
+source author = destination author
+</pre>
+<p>Empty lines and lines starting with a <tt class="docutils literal">#</tt> are ignored.</p>
+<p>The filemap is a file that allows filtering and remapping of files
+and directories. Each line can contain one of the following
+directives:</p>
+<pre class="literal-block">
+include path/to/file-or-dir
+
+exclude path/to/file-or-dir
+
+rename path/to/source path/to/destination
+</pre>
+<p>Comment lines start with <tt class="docutils literal">#</tt>. A specified path matches if it
+equals the full relative name of a file or one of its parent
+directories. The <tt class="docutils literal">include</tt> or <tt class="docutils literal">exclude</tt> directive with the
+longest matching path applies, so line order does not matter.</p>
+<p>The <tt class="docutils literal">include</tt> directive causes a file, or all files under a
+directory, to be included in the destination repository, and the
+exclusion of all other files and directories not explicitly
+included. The <tt class="docutils literal">exclude</tt> directive causes files or directories to
+be omitted. The <tt class="docutils literal">rename</tt> directive renames a file or directory if
+it is converted. To rename from a subdirectory into the root of
+the repository, use <tt class="docutils literal">.</tt> as the path to rename to.</p>
+<p>The splicemap is a file that allows insertion of synthetic
+history, letting you specify the parents of a revision. This is
+useful if you want to e.g. give a Subversion merge two parents, or
+graft two disconnected series of history together. Each entry
+contains a key, followed by a space, followed by one or two
+comma-separated values:</p>
+<pre class="literal-block">
+key parent1, parent2
+</pre>
+<p>The key is the revision ID in the source
+revision control system whose parents should be modified (same
+format as a key in .hg/shamap). The values are the revision IDs
+(in either the source or destination revision control system) that
+should be used as the new parents for that node. For example, if
+you have merged &quot;release-1.0&quot; into &quot;trunk&quot;, then you should
+specify the revision on &quot;trunk&quot; as the first parent and the one on
+the &quot;release-1.0&quot; branch as the second.</p>
+<p>The branchmap is a file that allows you to rename a branch when it is
+being brought in from whatever external repository. When used in
+conjunction with a splicemap, it allows for a powerful combination
+to help fix even the most badly mismanaged repositories and turn them
+into nicely structured Mercurial repositories. The branchmap contains
+lines of the form:</p>
+<pre class="literal-block">
+original_branch_name new_branch_name
+</pre>
+<p>where &quot;original_branch_name&quot; is the name of the branch in the
+source repository, and &quot;new_branch_name&quot; is the name of the branch
+is the destination repository. No whitespace is allowed in the
+branch names. This can be used to (for instance) move code in one
+repository from &quot;default&quot; to a named branch.</p>
+<div class="section" id="mercurial-source">
+<h5>Mercurial Source</h5>
+<p>The Mercurial source recognizes the following configuration
+options, which you can set on the command line with <tt class="docutils literal"><span class="pre">--config</span></tt>:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.hg.ignoreerrors:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">ignore integrity errors when reading.
+Use it to fix Mercurial repositories with missing revlogs, by
+converting from and to Mercurial. Default is False.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.hg.saverev:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">store original revision ID in changeset
+(forces target IDs to change). It takes a boolean argument and
+defaults to False.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.hg.startrev:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">convert start revision and its descendants.
+It takes a hg revision identifier and defaults to 0.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="cvs-source">
+<h5>CVS Source</h5>
+<p>CVS source will use a sandbox (i.e. a checked-out copy) from CVS
+to indicate the starting point of what will be converted. Direct
+access to the repository files is not needed, unless of course the
+repository is <tt class="docutils literal">:local:</tt>. The conversion uses the top level
+directory in the sandbox to find the CVS repository, and then uses
+CVS rlog commands to find files to convert. This means that unless
+a filemap is given, all files under the starting directory will be
+converted, and that any directory reorganization in the CVS
+sandbox is ignored.</p>
+<p>The following options can be used with <tt class="docutils literal"><span class="pre">--config</span></tt>:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.cvsps.cache:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Set to False to disable remote log caching,
+for testing and debugging purposes. Default is True.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.cvsps.fuzz:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Specify the maximum time (in seconds) that is
+allowed between commits with identical user and log message in
+a single changeset. When very large files were checked in as
+part of a changeset then the default may not be long enough.
+The default is 60.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.cvsps.mergeto:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Specify a regular expression to which
+commit log messages are matched. If a match occurs, then the
+conversion process will insert a dummy revision merging the
+branch on which this log message occurs to the branch
+indicated in the regex. Default is <tt class="docutils literal">{{mergetobranch
+<span class="pre">([-\w]+)}}</span></tt></td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.cvsps.mergefrom:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Specify a regular expression to which
+commit log messages are matched. If a match occurs, then the
+conversion process will add the most recent revision on the
+branch indicated in the regex as the second parent of the
+changeset. Default is <tt class="docutils literal">{{mergefrombranch <span class="pre">([-\w]+)}}</span></tt></td>
+</tr>
+<tr class="field"><th class="field-name">hook.cvslog:</th><td class="field-body">Specify a Python function to be called at the end of
+gathering the CVS log. The function is passed a list with the
+log entries, and can modify the entries in-place, or add or
+delete them.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">hook.cvschangesets:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">Specify a Python function to be called after
+the changesets are calculated from the CVS log. The
+function is passed a list with the changeset entries, and can
+modify the changesets in-place, or add or delete them.</td>
+</tr>
+</tbody>
+</table>
+<p>An additional &quot;debugcvsps&quot; Mercurial command allows the builtin
+changeset merging code to be run without doing a conversion. Its
+parameters and output are similar to that of cvsps 2.1. Please see
+the command help for more details.</p>
+</div>
+<div class="section" id="subversion-source">
+<h5>Subversion Source</h5>
+<p>Subversion source detects classical trunk/branches/tags layouts.
+By default, the supplied <tt class="docutils literal"><span class="pre">svn://repo/path/</span></tt> source URL is
+converted as a single branch. If <tt class="docutils literal"><span class="pre">svn://repo/path/trunk</span></tt> exists
+it replaces the default branch. If <tt class="docutils literal"><span class="pre">svn://repo/path/branches</span></tt>
+exists, its subdirectories are listed as possible branches. If
+<tt class="docutils literal"><span class="pre">svn://repo/path/tags</span></tt> exists, it is looked for tags referencing
+converted branches. Default <tt class="docutils literal">trunk</tt>, <tt class="docutils literal">branches</tt> and <tt class="docutils literal">tags</tt>
+values can be overridden with following options. Set them to paths
+relative to the source URL, or leave them blank to disable auto
+detection.</p>
+<p>The following options can be set with <tt class="docutils literal"><span class="pre">--config</span></tt>:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.svn.branches:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">specify the directory containing branches.
+The default is <tt class="docutils literal">branches</tt>.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.svn.tags:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">specify the directory containing tags. The
+default is <tt class="docutils literal">tags</tt>.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.svn.trunk:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">specify the name of the trunk branch. The
+default is <tt class="docutils literal">trunk</tt>.</td>
+</tr>
+</tbody>
+</table>
+<p>Source history can be retrieved starting at a specific revision,
+instead of being integrally converted. Only single branch
+conversions are supported.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.svn.startrev:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">specify start Subversion revision number.
+The default is 0.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="perforce-source">
+<h5>Perforce Source</h5>
+<p>The Perforce (P4) importer can be given a p4 depot path or a
+client specification as source. It will convert all files in the
+source to a flat Mercurial repository, ignoring labels, branches
+and integrations. Note that when a depot path is given you then
+usually should specify a target directory, because otherwise the
+target may be named <tt class="docutils literal"><span class="pre">...-hg</span></tt>.</p>
+<p>It is possible to limit the amount of source history to be
+converted by specifying an initial Perforce revision:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.p4.startrev:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">specify initial Perforce revision (a
+Perforce changelist number).</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="mercurial-destination">
+<h5>Mercurial Destination</h5>
+<p>The following options are supported:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name" colspan="2">convert.hg.clonebranches:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">dispatch source branches in separate
+clones. The default is False.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.hg.tagsbranch:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">branch name for tag revisions, defaults to
+<tt class="docutils literal">default</tt>.</td>
+</tr>
+<tr class="field"><th class="field-name" colspan="2">convert.hg.usebranchnames:</th></tr>
+<tr class="field"><td>&nbsp;</td><td class="field-body">preserve branch names. The default is
+True.</td>
+</tr>
+</tbody>
+</table>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--authors</span></kbd></td>
+<td>username mapping filename (DEPRECATED, use --authormap instead)</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-s</span>, <span class="option">--source-type</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>source repository type</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-d</span>, <span class="option">--dest-type</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>destination repository type</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>import up to target revision REV</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-A</span>, <span class="option">--authormap</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>remap usernames using this file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--filemap</span></kbd></td>
+<td>remap file names using contents of file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--splicemap</span></kbd></td>
+<td>splice synthesized history into place</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--branchmap</span></kbd></td>
+<td>change branch names while converting</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--branchsort</span></kbd></td>
+<td>try to sort changesets by branches</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--datesort</span></kbd></td>
+<td>try to sort changesets by date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--sourcesort</span></kbd></td>
+<td>preserve source changesets order</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+</div>
+<div class="section" id="eol">
+<h2><a class="toc-backref" href="#id74">eol</a></h2>
+<p>automatically manage newlines in repository files</p>
+<p>This extension allows you to manage the type of line endings (CRLF or
+LF) that are used in the repository and in the local working
+directory. That way you can get CRLF line endings on Windows and LF on
+Unix/Mac, thereby letting everybody use their OS native line endings.</p>
+<p>The extension reads its configuration from a versioned <tt class="docutils literal">.hgeol</tt>
+configuration file found in the root of the working copy. The
+<tt class="docutils literal">.hgeol</tt> file use the same syntax as all other Mercurial
+configuration files. It uses two sections, <tt class="docutils literal">[patterns]</tt> and
+<tt class="docutils literal">[repository]</tt>.</p>
+<p>The <tt class="docutils literal">[patterns]</tt> section specifies how line endings should be
+converted between the working copy and the repository. The format is
+specified by a file pattern. The first match is used, so put more
+specific patterns first. The available line endings are <tt class="docutils literal">LF</tt>,
+<tt class="docutils literal">CRLF</tt>, and <tt class="docutils literal">BIN</tt>.</p>
+<p>Files with the declared format of <tt class="docutils literal">CRLF</tt> or <tt class="docutils literal">LF</tt> are always
+checked out and stored in the repository in that format and files
+declared to be binary (<tt class="docutils literal">BIN</tt>) are left unchanged. Additionally,
+<tt class="docutils literal">native</tt> is an alias for checking out in the platform's default line
+ending: <tt class="docutils literal">LF</tt> on Unix (including Mac OS X) and <tt class="docutils literal">CRLF</tt> on
+Windows. Note that <tt class="docutils literal">BIN</tt> (do nothing to line endings) is Mercurial's
+default behaviour; it is only needed if you need to override a later,
+more general pattern.</p>
+<p>The optional <tt class="docutils literal">[repository]</tt> section specifies the line endings to
+use for files stored in the repository. It has a single setting,
+<tt class="docutils literal">native</tt>, which determines the storage line endings for files
+declared as <tt class="docutils literal">native</tt> in the <tt class="docutils literal">[patterns]</tt> section. It can be set to
+<tt class="docutils literal">LF</tt> or <tt class="docutils literal">CRLF</tt>. The default is <tt class="docutils literal">LF</tt>. For example, this means
+that on Windows, files configured as <tt class="docutils literal">native</tt> (<tt class="docutils literal">CRLF</tt> by default)
+will be converted to <tt class="docutils literal">LF</tt> when stored in the repository. Files
+declared as <tt class="docutils literal">LF</tt>, <tt class="docutils literal">CRLF</tt>, or <tt class="docutils literal">BIN</tt> in the <tt class="docutils literal">[patterns]</tt> section
+are always stored as-is in the repository.</p>
+<p>Example versioned <tt class="docutils literal">.hgeol</tt> file:</p>
+<pre class="literal-block">
+[patterns]
+**.py = native
+**.vcproj = CRLF
+**.txt = native
+Makefile = LF
+**.jpg = BIN
+
+[repository]
+native = LF
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">The rules will first apply when files are touched in the working
+copy, e.g. by updating to null and back to tip to touch all files.</p>
+</div>
+<p>The extension uses an optional <tt class="docutils literal">[eol]</tt> section read from both the
+normal Mercurial configuration files and the <tt class="docutils literal">.hgeol</tt> file, with the
+latter overriding the former. You can use that section to control the
+overall behavior. There are three settings:</p>
+<ul class="simple">
+<li><tt class="docutils literal">eol.native</tt> (default <tt class="docutils literal">os.linesep</tt>) can be set to <tt class="docutils literal">LF</tt> or
+<tt class="docutils literal">CRLF</tt> to override the default interpretation of <tt class="docutils literal">native</tt> for
+checkout. This can be used with <a class="reference external" href="hg.1.html#archive"><tt class="docutils literal">hg archive</tt></a> on Unix, say, to
+generate an archive where files have line endings for Windows.</li>
+<li><tt class="docutils literal"><span class="pre">eol.only-consistent</span></tt> (default True) can be set to False to make
+the extension convert files with inconsistent EOLs. Inconsistent
+means that there is both <tt class="docutils literal">CRLF</tt> and <tt class="docutils literal">LF</tt> present in the file.
+Such files are normally not touched under the assumption that they
+have mixed EOLs on purpose.</li>
+<li><tt class="docutils literal"><span class="pre">eol.fix-trailing-newline</span></tt> (default False) can be set to True to
+ensure that converted files end with a EOL character (either <tt class="docutils literal">\n</tt>
+or <tt class="docutils literal">\r\n</tt> as per the configured patterns).</li>
+</ul>
+<p>The extension provides <tt class="docutils literal">cleverencode:</tt> and <tt class="docutils literal">cleverdecode:</tt> filters
+like the deprecated win32text extension does. This means that you can
+disable win32text and enable eol and your filters will still work. You
+only need to these filters until you have prepared a <tt class="docutils literal">.hgeol</tt> file.</p>
+<p>The <tt class="docutils literal">win32text.forbid*</tt> hooks provided by the win32text extension
+have been unified into a single hook named <tt class="docutils literal">eol.checkheadshook</tt>. The
+hook will lookup the expected line endings from the <tt class="docutils literal">.hgeol</tt> file,
+which means you must migrate to a <tt class="docutils literal">.hgeol</tt> file first before using
+the hook. <tt class="docutils literal">eol.checkheadshook</tt> only checks heads, intermediate
+invalid revisions will be pushed. To forbid them completely, use the
+<tt class="docutils literal">eol.checkallhook</tt> hook. These hooks are best used as
+<tt class="docutils literal">pretxnchangegroup</tt> hooks.</p>
+<p>See <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a> for more information about the glob patterns
+used.</p>
+</div>
+<div class="section" id="extdiff">
+<h2><a class="toc-backref" href="#id75">extdiff</a></h2>
+<p>command to allow external programs to compare revisions</p>
+<p>The extdiff Mercurial extension allows you to use external programs
+to compare revisions, or revision with working directory. The external
+diff programs are called with a configurable set of options and two
+non-option arguments: paths to directories containing snapshots of
+files to compare.</p>
+<p>The extdiff extension also allows you to configure new diff commands, so
+you do not need to type <a class="reference external" href="hg.1.html#extdiff"><tt class="docutils literal">hg extdiff <span class="pre">-p</span> kdiff3</tt></a> always.</p>
+<pre class="literal-block">
+[extdiff]
+# add new command that runs GNU diff(1) in 'context diff' mode
+cdiff = gdiff -Nprc5
+## or the old way:
+#cmd.cdiff = gdiff
+#opts.cdiff = -Nprc5
+
+# add new command called vdiff, runs kdiff3
+vdiff = kdiff3
+
+# add new command called meld, runs meld (no need to name twice)
+meld =
+
+# add new command called vimdiff, runs gvimdiff with DirDiff plugin
+# (see http://www.vim.org/scripts/script.php?script_id=102) Non
+# English user, be sure to put &quot;let g:DirDiffDynamicDiffText = 1&quot; in
+# your .vimrc
+vimdiff = gvim -f &quot;+next&quot; \
+ &quot;+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))&quot;
+</pre>
+<p>Tool arguments can include variables that are expanded at runtime:</p>
+<pre class="literal-block">
+$parent1, $plabel1 - filename, descriptive label of first parent
+$child, $clabel - filename, descriptive label of child revision
+$parent2, $plabel2 - filename, descriptive label of second parent
+$root - repository root
+$parent is an alias for $parent1.
+</pre>
+<p>The extdiff extension will look in your [diff-tools] and [merge-tools]
+sections for diff tool arguments, when none are specified in [extdiff].</p>
+<pre class="literal-block">
+[extdiff]
+kdiff3 =
+
+[diff-tools]
+kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
+</pre>
+<p>You can use -I/-X and list of file or directory names like normal
+<a class="reference external" href="hg.1.html#diff"><tt class="docutils literal">hg diff</tt></a> command. The extdiff extension makes snapshots of only
+needed files, so running the external diff program will actually be
+pretty fast (at least faster than having to compare the entire tree).</p>
+<div class="section" id="id13">
+<h3>Commands</h3>
+<div class="section" id="id14">
+<h4>extdiff</h4>
+<pre class="literal-block">
+hg extdiff [OPT]... [FILE]...
+</pre>
+<p>Show differences between revisions for the specified files, using
+an external program. The default program used is diff, with
+default options &quot;-Npru&quot;.</p>
+<p>To select a different program, use the -p/--program option. The
+program will be passed the names of two directories to compare. To
+pass additional options to the program, use -o/--option. These
+will be passed before the names of the directories to compare.</p>
+<p>When two revision arguments are given, then changes are shown
+between those revisions. If only one revision is specified then
+that revision is compared to the working directory, and, when no
+revisions are specified, the working directory files are compared
+to its parent.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--program</span></kbd></td>
+<td>comparison program to run</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-o</span>, <span class="option">--option</span></kbd></td>
+<td>pass option to comparison program</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--change</span></kbd></td>
+<td>change made by revision</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="factotum">
+<h2><a class="toc-backref" href="#id76">factotum</a></h2>
+<p>http authentication with factotum</p>
+<p>This extension allows the factotum(4) facility on Plan 9 from Bell Labs
+platforms to provide authentication information for HTTP access. Configuration
+entries specified in the auth section as well as authentication information
+provided in the repository URL are fully supported. If no prefix is specified,
+a value of &quot;*&quot; will be assumed.</p>
+<p>By default, keys are specified as:</p>
+<pre class="literal-block">
+proto=pass service=hg prefix=&lt;prefix&gt; user=&lt;username&gt; !password=&lt;password&gt;
+</pre>
+<p>If the factotum extension is unable to read the required key, one will be
+requested interactively.</p>
+<p>A configuration section is available to customize runtime behavior. By
+default, these entries are:</p>
+<pre class="literal-block">
+[factotum]
+executable = /bin/auth/factotum
+mountpoint = /mnt/factotum
+service = hg
+</pre>
+<p>The executable entry defines the full path to the factotum binary. The
+mountpoint entry defines the path to the factotum file service. Lastly, the
+service entry controls the service name used when reading keys.</p>
+</div>
+<div class="section" id="fetch">
+<h2><a class="toc-backref" href="#id77">fetch</a></h2>
+<p>pull, update and merge in one command (DEPRECATED)</p>
+<div class="section" id="id15">
+<h3>Commands</h3>
+<div class="section" id="id16">
+<h4>fetch</h4>
+<pre class="literal-block">
+hg fetch [SOURCE]
+</pre>
+<p>This finds all changes from the repository at the specified path
+or URL and adds them to the local repository.</p>
+<p>If the pulled changes add a new branch head, the head is
+automatically merged, and the result of the merge is committed.
+Otherwise, the working directory is updated to include the new
+changes.</p>
+<p>When a merge is needed, the working directory is first updated to
+the newly pulled changes. Local changes are then merged into the
+pulled changes. To switch the merge order, use --switch-parent.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a specific revision you would like to pull</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>edit commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--force-editor</span></kbd></td>
+<td>edit commit message (DEPRECATED)</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">--switch-parent</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>switch parents when merging</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="gpg">
+<h2><a class="toc-backref" href="#id78">gpg</a></h2>
+<p>commands to sign and verify changesets</p>
+<div class="section" id="id17">
+<h3>Commands</h3>
+<div class="section" id="sigcheck">
+<h4>sigcheck</h4>
+<pre class="literal-block">
+hg sigcheck REV
+</pre>
+<p>verify all the signatures there may be for a particular revision</p>
+</div>
+<div class="section" id="sign">
+<h4>sign</h4>
+<pre class="literal-block">
+hg sign [OPTION]... [REV]...
+</pre>
+<p>If no revision is given, the parent of the working directory is used,
+or tip if no revision is checked out.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--local</span></kbd></td>
+<td>make the signature local</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>sign even if the sigfile is modified</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-commit</span></kbd></td>
+<td>do not commit the sigfile after signing</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--key</span></kbd></td>
+<td>the key id to sign with</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="sigs">
+<h4>sigs</h4>
+<pre class="literal-block">
+hg sigs
+</pre>
+<p>list signed changesets</p>
+</div>
+</div>
+</div>
+<div class="section" id="graphlog">
+<h2><a class="toc-backref" href="#id79">graphlog</a></h2>
+<p>command to view revision graphs from a shell</p>
+<p>This extension adds a --graph option to the incoming, outgoing and log
+commands. When this options is given, an ASCII representation of the
+revision graph is also shown.</p>
+<div class="section" id="id18">
+<h3>Commands</h3>
+<div class="section" id="glog">
+<h4>glog</h4>
+<pre class="literal-block">
+hg glog [OPTION]... [FILE]
+</pre>
+<p>Print a revision history alongside a revision graph drawn with
+ASCII characters.</p>
+<p>Nodes printed as an &#64; character are parents of the working
+directory.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--follow</span></kbd></td>
+<td>follow changeset history, or file history across copies and renames</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--follow-first</span></kbd></td>
+<td>only follow the first parent of merge changesets (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>show revisions matching date spec</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-C</span>, <span class="option">--copies</span></kbd></td>
+<td>show copied files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keyword</span></kbd></td>
+<td>do case-insensitive search for a given text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>show the specified revision or range</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--removed</span></kbd></td>
+<td>include revisions where files were removed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-m</span>, <span class="option">--only-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show only merges (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>revisions committed by user</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--only-branch</span></kbd></td>
+<td>show only changesets within the given named branch (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>show changesets within the given named branch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-P</span>, <span class="option">--prune</span></kbd></td>
+<td>do not display revision or any of its ancestors</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--hidden</span></kbd></td>
+<td>show hidden changesets (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patch</span></kbd></td>
+<td>show patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--limit</span></kbd></td>
+<td>limit number of changes displayed</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-M</span>, <span class="option">--no-merges</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>do not show merges</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-G</span>, <span class="option">--graph</span></kbd></td>
+<td>show the revision DAG</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="hgcia">
+<h2><a class="toc-backref" href="#id80">hgcia</a></h2>
+<p>hooks for integrating with the CIA.vc notification service</p>
+<p>This is meant to be run as a changegroup or incoming hook. To
+configure it, set the following options in your hgrc:</p>
+<pre class="literal-block">
+[cia]
+# your registered CIA user name
+user = foo
+# the name of the project in CIA
+project = foo
+# the module (subproject) (optional)
+#module = foo
+# Append a diffstat to the log message (optional)
+#diffstat = False
+# Template to use for log messages (optional)
+#template = {desc}\n{baseurl}{webroot}/rev/{node}-- {diffstat}
+# Style to use (optional)
+#style = foo
+# The URL of the CIA notification service (optional)
+# You can use mailto: URLs to send by email, eg
+# mailto:cia&#64;cia.vc
+# Make sure to set email.from if you do this.
+#url = http://cia.vc/
+# print message instead of sending it (optional)
+#test = False
+# number of slashes to strip for url paths
+#strip = 0
+
+[hooks]
+# one of these:
+changegroup.cia = python:hgcia.hook
+#incoming.cia = python:hgcia.hook
+
+[web]
+# If you want hyperlinks (optional)
+baseurl = http://server/path/to/repo
+</pre>
+</div>
+<div class="section" id="hgk">
+<h2><a class="toc-backref" href="#id81">hgk</a></h2>
+<p>browse the repository in a graphical way</p>
+<p>The hgk extension allows browsing the history of a repository in a
+graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
+distributed with Mercurial.)</p>
+<p>hgk consists of two parts: a Tcl script that does the displaying and
+querying of information, and an extension to Mercurial named hgk.py,
+which provides hooks for hgk to get information. hgk can be found in
+the contrib directory, and the extension is shipped in the hgext
+repository, and needs to be enabled.</p>
+<p>The <a class="reference external" href="hg.1.html#view"><tt class="docutils literal">hg view</tt></a> command will launch the hgk Tcl script. For this command
+to work, hgk must be in your search path. Alternately, you can specify
+the path to hgk in your configuration file:</p>
+<pre class="literal-block">
+[hgk]
+path=/location/of/hgk
+</pre>
+<p>hgk can make use of the extdiff extension to visualize revisions.
+Assuming you had already configured extdiff vdiff command, just add:</p>
+<pre class="literal-block">
+[hgk]
+vdiff=vdiff
+</pre>
+<p>Revisions context menu will now display additional entries to fire
+vdiff on hovered and selected revisions.</p>
+<div class="section" id="id19">
+<h3>Commands</h3>
+<div class="section" id="view">
+<h4>view</h4>
+<pre class="literal-block">
+hg view [-l LIMIT] [REVRANGE]
+</pre>
+<p>start interactive history viewer</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--limit</span></kbd></td>
+<td>limit number of changes displayed</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="highlight">
+<h2><a class="toc-backref" href="#id82">highlight</a></h2>
+<p>syntax highlighting for hgweb (requires Pygments)</p>
+<p>It depends on the Pygments syntax highlighting library:
+<a class="reference external" href="http://pygments.org/">http://pygments.org/</a></p>
+<p>There is a single configuration option:</p>
+<pre class="literal-block">
+[web]
+pygments_style = &lt;style&gt;
+</pre>
+<p>The default is 'colorful'.</p>
+</div>
+<div class="section" id="histedit">
+<h2><a class="toc-backref" href="#id83">histedit</a></h2>
+<p>interactive history editing</p>
+<p>With this extension installed, Mercurial gains one new command: histedit. Usage
+is as follows, assuming the following history:</p>
+<pre class="literal-block">
+&#64; 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42
+| Add delta
+|
+o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42
+| Add gamma
+|
+o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42
+| Add beta
+|
+o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+</pre>
+<p>If you were to run <tt class="docutils literal">hg histedit c561b4e977df</tt>, you would see the following
+file open in your editor:</p>
+<pre class="literal-block">
+pick c561b4e977df Add beta
+pick 030b686bedc4 Add gamma
+pick 7c2fd3b9020c Add delta
+
+# Edit history between 633536316234 and 7c2fd3b9020c
+#
+# Commands:
+# p, pick = use commit
+# e, edit = use commit, but stop for amending
+# f, fold = use commit, but fold into previous commit
+# d, drop = remove commit from history
+# m, mess = edit message without changing commit content
+#
+</pre>
+<p>In this file, lines beginning with <tt class="docutils literal">#</tt> are ignored. You must specify a rule
+for each revision in your history. For example, if you had meant to add gamma
+before beta, and then wanted to add delta in the same revision as beta, you
+would reorganize the file to look like this:</p>
+<pre class="literal-block">
+pick 030b686bedc4 Add gamma
+pick c561b4e977df Add beta
+fold 7c2fd3b9020c Add delta
+
+# Edit history between 633536316234 and 7c2fd3b9020c
+#
+# Commands:
+# p, pick = use commit
+# e, edit = use commit, but stop for amending
+# f, fold = use commit, but fold into previous commit
+# d, drop = remove commit from history
+# m, mess = edit message without changing commit content
+#
+</pre>
+<p>At which point you close the editor and <tt class="docutils literal">histedit</tt> starts working. When you
+specify a <tt class="docutils literal">fold</tt> operation, <tt class="docutils literal">histedit</tt> will open an editor when it folds
+those revisions together, offering you a chance to clean up the commit message:</p>
+<pre class="literal-block">
+Add beta
+***
+Add delta
+</pre>
+<p>Edit the commit message to your liking, then close the editor. For
+this example, let's assume that the commit message was changed to
+<tt class="docutils literal">Add beta and delta.</tt> After histedit has run and had a chance to
+remove any old or temporary revisions it needed, the history looks
+like this:</p>
+<pre class="literal-block">
+&#64; 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42
+| Add beta and delta.
+|
+o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
+| Add gamma
+|
+o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+</pre>
+<p>Note that <tt class="docutils literal">histedit</tt> does <em>not</em> remove any revisions (even its own temporary
+ones) until after it has completed all the editing operations, so it will
+probably perform several strip operations when it's done. For the above example,
+it had to run strip twice. Strip can be slow depending on a variety of factors,
+so you might need to be a little patient. You can choose to keep the original
+revisions by passing the <tt class="docutils literal"><span class="pre">--keep</span></tt> flag.</p>
+<p>The <tt class="docutils literal">edit</tt> operation will drop you back to a command prompt,
+allowing you to edit files freely, or even use <tt class="docutils literal">hg record</tt> to commit
+some changes as a separate commit. When you're done, any remaining
+uncommitted changes will be committed as well. When done, run <tt class="docutils literal">hg
+histedit <span class="pre">--continue</span></tt> to finish this step. You'll be prompted for a
+new commit message, but the default commit message will be the
+original message for the <tt class="docutils literal">edit</tt> ed revision.</p>
+<p>The <tt class="docutils literal">message</tt> operation will give you a chance to revise a commit
+message without changing the contents. It's a shortcut for doing
+<tt class="docutils literal">edit</tt> immediately followed by <cite>hg histedit --continue`</cite>.</p>
+<p>If <tt class="docutils literal">histedit</tt> encounters a conflict when moving a revision (while
+handling <tt class="docutils literal">pick</tt> or <tt class="docutils literal">fold</tt>), it'll stop in a similar manner to
+<tt class="docutils literal">edit</tt> with the difference that it won't prompt you for a commit
+message when done. If you decide at this point that you don't like how
+much work it will be to rearrange history, or that you made a mistake,
+you can use <tt class="docutils literal">hg histedit <span class="pre">--abort</span></tt> to abandon the new changes you
+have made and return to the state before you attempted to edit your
+history.</p>
+<p>If we clone the example repository above and add three more changes, such that
+we have the following history:</p>
+<pre class="literal-block">
+&#64; 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan
+| Add theta
+|
+o 5 140988835471 2009-04-27 18:04 -0500 stefan
+| Add eta
+|
+o 4 122930637314 2009-04-27 18:04 -0500 stefan
+| Add zeta
+|
+o 3 836302820282 2009-04-27 18:04 -0500 stefan
+| Add epsilon
+|
+o 2 989b4d060121 2009-04-27 18:04 -0500 durin42
+| Add beta and delta.
+|
+o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
+| Add gamma
+|
+o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+</pre>
+<p>If you run <tt class="docutils literal">hg histedit <span class="pre">--outgoing</span></tt> on the clone then it is the same
+as running <tt class="docutils literal">hg histedit 836302820282</tt>. If you need plan to push to a
+repository that Mercurial does not detect to be related to the source
+repo, you can add a <tt class="docutils literal"><span class="pre">--force</span></tt> option.</p>
+<div class="section" id="id20">
+<h3>Commands</h3>
+<div class="section" id="id21">
+<h4>histedit</h4>
+<pre class="literal-block">
+hg histedit [PARENT]
+</pre>
+<p>interactively edit changeset history</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--commands</span></kbd></td>
+<td>Read history edits from the specified file.</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--continue</span></kbd></td>
+<td>continue an edit already in progress</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keep</span></kbd></td>
+<td>don't strip old nodes after edit is complete</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--abort</span></kbd></td>
+<td>abort an edit in progress</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-o</span>, <span class="option">--outgoing</span></kbd></td>
+<td>changesets not found in destination</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force outgoing even for unrelated repositories</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>first revision to be edited</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="inotify">
+<h2><a class="toc-backref" href="#id84">inotify</a></h2>
+<p>accelerate status report using Linux's inotify service</p>
+<div class="section" id="id22">
+<h3>Commands</h3>
+<div class="section" id="inserve">
+<h4>inserve</h4>
+<pre class="literal-block">
+hg inserve [OPTION]...
+</pre>
+<p>start an inotify server for this repository</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--daemon</span></kbd></td>
+<td>run server in background</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">--daemon-pipefds</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>used internally by daemon mode</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-t</span>, <span class="option">--idle-timeout</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>minutes to sit idle before exiting</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--pid-file</span></kbd></td>
+<td>name of file to write process ID to</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="interhg">
+<h2><a class="toc-backref" href="#id85">interhg</a></h2>
+<p>expand expressions into changelog and summaries</p>
+<p>This extension allows the use of a special syntax in summaries, which
+will be automatically expanded into links or any other arbitrary
+expression, much like InterWiki does.</p>
+<p>A few example patterns (link to bug tracking, etc.) that may be used
+in your hgrc:</p>
+<pre class="literal-block">
+[interhg]
+issues = s!issue(\d+)!&lt;a href=&quot;http://bts/issue\1&quot;&gt;issue\1&lt;/a&gt;!
+bugzilla = s!((?:bug|b=|(?=#?\d{4,}))(?:\s*#?)(\d+))!&lt;a..=\2&quot;&gt;\1&lt;/a&gt;!i
+boldify = s!(^|\s)#(\d+)\b! &lt;b&gt;#\2&lt;/b&gt;!
+</pre>
+</div>
+<div class="section" id="keyword">
+<h2><a class="toc-backref" href="#id86">keyword</a></h2>
+<p>expand keywords in tracked files</p>
+<p>This extension expands RCS/CVS-like or self-customized $Keywords$ in
+tracked text files selected by your configuration.</p>
+<p>Keywords are only expanded in local repositories and not stored in the
+change history. The mechanism can be regarded as a convenience for the
+current user or for archive distribution.</p>
+<p>Keywords expand to the changeset data pertaining to the latest change
+relative to the working directory parent of each file.</p>
+<p>Configuration is done in the [keyword], [keywordset] and [keywordmaps]
+sections of hgrc files.</p>
+<p>Example:</p>
+<pre class="literal-block">
+[keyword]
+# expand keywords in every python file except those matching &quot;x*&quot;
+**.py =
+x* = ignore
+
+[keywordset]
+# prefer svn- over cvs-like default keywordmaps
+svn = True
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">The more specific you are in your filename patterns the less you
+lose speed in huge repositories.</p>
+</div>
+<p>For [keywordmaps] template mapping and expansion demonstration and
+control run <a class="reference external" href="hg.1.html#kwdemo"><tt class="docutils literal">hg kwdemo</tt></a>. See <a class="reference external" href="hg.1.html#templates"><tt class="docutils literal">hg help templates</tt></a> for a list of
+available templates and filters.</p>
+<p>Three additional date template filters are provided:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">utcdate</tt>:</th><td class="field-body">&quot;2006/09/18 15:13:13&quot;</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">svnutcdate</tt>:</th><td class="field-body">&quot;2006-09-18 15:13:13Z&quot;</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">svnisodate</tt>:</th><td class="field-body">&quot;2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)&quot;</td>
+</tr>
+</tbody>
+</table>
+<p>The default template mappings (view with <a class="reference external" href="hg.1.html#kwdemo"><tt class="docutils literal">hg kwdemo <span class="pre">-d</span></tt></a>) can be
+replaced with customized keywords and templates. Again, run
+<a class="reference external" href="hg.1.html#kwdemo"><tt class="docutils literal">hg kwdemo</tt></a> to control the results of your configuration changes.</p>
+<p>Before changing/disabling active keywords, you must run <a class="reference external" href="hg.1.html#kwshrink"><tt class="docutils literal">hg kwshrink</tt></a>
+to avoid storing expanded keywords in the change history.</p>
+<p>To force expansion after enabling it, or a configuration change, run
+<a class="reference external" href="hg.1.html#kwexpand"><tt class="docutils literal">hg kwexpand</tt></a>.</p>
+<p>Expansions spanning more than one line and incremental expansions,
+like CVS' $Log$, are not supported. A keyword template map &quot;Log =
+{desc}&quot; expands to the first line of the changeset description.</p>
+<div class="section" id="id23">
+<h3>Commands</h3>
+<div class="section" id="kwdemo">
+<h4>kwdemo</h4>
+<pre class="literal-block">
+hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...
+</pre>
+<p>Show current, custom, or default keyword template maps and their
+expansions.</p>
+<p>Extend the current configuration by specifying maps as arguments
+and using -f/--rcfile to source an external hgrc file.</p>
+<p>Use -d/--default to disable current configuration.</p>
+<p>See <a class="reference external" href="hg.1.html#templates"><tt class="docutils literal">hg help templates</tt></a> for information on templates and filters.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--default</span></kbd></td>
+<td>show default keyword template maps</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--rcfile</span></kbd></td>
+<td>read maps from rcfile</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="kwexpand">
+<h4>kwexpand</h4>
+<pre class="literal-block">
+hg kwexpand [OPTION]... [FILE]...
+</pre>
+<p>Run after (re)enabling keyword expansion.</p>
+<p>kwexpand refuses to run if given files contain local changes.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="kwfiles">
+<h4>kwfiles</h4>
+<pre class="literal-block">
+hg kwfiles [OPTION]... [FILE]...
+</pre>
+<p>List which files in the working directory are matched by the
+[keyword] configuration patterns.</p>
+<p>Useful to prevent inadvertent keyword expansion and to speed up
+execution by including only files that are actual candidates for
+expansion.</p>
+<p>See <a class="reference external" href="hg.1.html#keyword"><tt class="docutils literal">hg help keyword</tt></a> on how to construct patterns both for
+inclusion and exclusion of files.</p>
+<p>With -A/--all and -v/--verbose the codes used to show the status
+of files are:</p>
+<pre class="literal-block">
+K = keyword expansion candidate
+k = keyword expansion candidate (not tracked)
+I = ignored
+i = ignored (not tracked)
+</pre>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-A</span>, <span class="option">--all</span></kbd></td>
+<td>show keyword status flags of all files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-i</span>, <span class="option">--ignore</span></kbd></td>
+<td>show files excluded from expansion</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--unknown</span></kbd></td>
+<td>only show unknown (not tracked) files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="kwshrink">
+<h4>kwshrink</h4>
+<pre class="literal-block">
+hg kwshrink [OPTION]... [FILE]...
+</pre>
+<p>Must be run before changing/disabling active keywords.</p>
+<p>kwshrink refuses to run if given files contain local changes.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="largefiles">
+<h2><a class="toc-backref" href="#id87">largefiles</a></h2>
+<p>track large binary files</p>
+<p>Large binary files tend to be not very compressible, not very
+diffable, and not at all mergeable. Such files are not handled
+efficiently by Mercurial's storage format (revlog), which is based on
+compressed binary deltas; storing large binary files as regular
+Mercurial files wastes bandwidth and disk space and increases
+Mercurial's memory usage. The largefiles extension addresses these
+problems by adding a centralized client-server layer on top of
+Mercurial: largefiles live in a <em>central store</em> out on the network
+somewhere, and you only fetch the revisions that you need when you
+need them.</p>
+<p>largefiles works by maintaining a &quot;standin file&quot; in .hglf/ for each
+largefile. The standins are small (41 bytes: an SHA-1 hash plus
+newline) and are tracked by Mercurial. Largefile revisions are
+identified by the SHA-1 hash of their contents, which is written to
+the standin. largefiles uses that revision ID to get/put largefile
+revisions from/to the central store. This saves both disk space and
+bandwidth, since you don't need to retrieve all historical revisions
+of large files when you clone or pull.</p>
+<p>To start a new repository or add new large binary files, just add
+--large to your <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add</tt></a> command. For example:</p>
+<pre class="literal-block">
+$ dd if=/dev/urandom of=randomdata count=2000
+$ hg add --large randomdata
+$ hg commit -m 'add randomdata as a largefile'
+</pre>
+<p>When you push a changeset that adds/modifies largefiles to a remote
+repository, its largefile revisions will be uploaded along with it.
+Note that the remote Mercurial must also have the largefiles extension
+enabled for this to work.</p>
+<p>When you pull a changeset that affects largefiles from a remote
+repository, Mercurial behaves as normal. However, when you update to
+such a revision, any largefiles needed by that revision are downloaded
+and cached (if they have never been downloaded before). This means
+that network access may be required to update to changesets you have
+not previously updated to.</p>
+<p>If you already have large files tracked by Mercurial without the
+largefiles extension, you will need to convert your repository in
+order to benefit from largefiles. This is done with the
+<a class="reference external" href="hg.1.html#lfconvert"><tt class="docutils literal">hg lfconvert</tt></a> command:</p>
+<pre class="literal-block">
+$ hg lfconvert --size 10 oldrepo newrepo
+</pre>
+<p>In repositories that already have largefiles in them, any new file
+over 10MB will automatically be added as a largefile. To change this
+threshold, set <tt class="docutils literal">largefiles.minsize</tt> in your Mercurial config file
+to the minimum size in megabytes to track as a largefile, or use the
+--lfsize option to the add command (also in megabytes):</p>
+<pre class="literal-block">
+[largefiles]
+minsize = 2
+
+$ hg add --lfsize 2
+</pre>
+<p>The <tt class="docutils literal">largefiles.patterns</tt> config option allows you to specify a list
+of filename patterns (see <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a>) that should always be
+tracked as largefiles:</p>
+<pre class="literal-block">
+[largefiles]
+patterns =
+ *.jpg
+ re:.*\.(png|bmp)$
+ library.zip
+ content/audio/*
+</pre>
+<p>Files that match one of these patterns will be added as largefiles
+regardless of their size.</p>
+<p>The <tt class="docutils literal">largefiles.minsize</tt> and <tt class="docutils literal">largefiles.patterns</tt> config options
+will be ignored for any repositories not already containing a
+largefile. To add the first largefile to a repository, you must
+explicitly do so with the --large flag passed to the <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add</tt></a>
+command.</p>
+<div class="section" id="id24">
+<h3>Commands</h3>
+<div class="section" id="lfconvert">
+<h4>lfconvert</h4>
+<pre class="literal-block">
+hg lfconvert SOURCE DEST [FILE ...]
+</pre>
+<p>Convert repository SOURCE to a new repository DEST, identical to
+SOURCE except that certain files will be converted as largefiles:
+specifically, any file that matches any PATTERN <em>or</em> whose size is
+above the minimum size threshold is converted as a largefile. The
+size used to determine whether or not to track a file as a
+largefile is the size of the first version of the file. The
+minimum size can be specified either with --size or in
+configuration as <tt class="docutils literal">largefiles.size</tt>.</p>
+<p>After running this command you will need to make sure that
+largefiles is enabled anywhere you intend to push the new
+repository.</p>
+<p>Use --to-normal to convert largefiles back to normal files; after
+this, the DEST repository can be used without largefiles at all.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--size</span></kbd></td>
+<td>minimum size (MB) for files to be converted as largefiles</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--to-normal</span></kbd></td>
+<td>convert from a largefiles repo to a normal repo</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="mq">
+<h2><a class="toc-backref" href="#id88">mq</a></h2>
+<p>manage a stack of patches</p>
+<p>This extension lets you work with a stack of patches in a Mercurial
+repository. It manages two stacks of patches - all known patches, and
+applied patches (subset of known patches).</p>
+<p>Known patches are represented as patch files in the .hg/patches
+directory. Applied patches are both patch files and changesets.</p>
+<p>Common tasks (use <a class="reference external" href="hg.1.html#command"><tt class="docutils literal">hg help command</tt></a> for more details):</p>
+<pre class="literal-block">
+create new patch qnew
+import existing patch qimport
+
+print patch series qseries
+print applied patches qapplied
+
+add known patch to applied stack qpush
+remove patch from applied stack qpop
+refresh contents of top applied patch qrefresh
+</pre>
+<p>By default, mq will automatically use git patches when required to
+avoid losing file mode changes, copy records, binary files or empty
+files creations or deletions. This behaviour can be configured with:</p>
+<pre class="literal-block">
+[mq]
+git = auto/keep/yes/no
+</pre>
+<p>If set to 'keep', mq will obey the [diff] section configuration while
+preserving existing git patches upon qrefresh. If set to 'yes' or
+'no', mq will override the [diff] section and always generate git or
+regular patches, possibly losing data in the second case.</p>
+<p>It may be desirable for mq changesets to be kept in the secret phase (see
+<a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a>), which can be enabled with the following setting:</p>
+<pre class="literal-block">
+[mq]
+secret = True
+</pre>
+<p>You will by default be managing a patch queue named &quot;patches&quot;. You can
+create other, independent patch queues with the <a class="reference external" href="hg.1.html#qqueue"><tt class="docutils literal">hg qqueue</tt></a> command.</p>
+<p>If the working directory contains uncommitted files, qpush, qpop and
+qgoto abort immediately. If -f/--force is used, the changes are
+discarded. Setting:</p>
+<pre class="literal-block">
+[mq]
+keepchanges = True
+</pre>
+<p>make them behave as if --keep-changes were passed, and non-conflicting
+local changes will be tolerated and preserved. If incompatible options
+such as -f/--force or --exact are passed, this setting is ignored.</p>
+<div class="section" id="id25">
+<h3>Commands</h3>
+<div class="section" id="qapplied">
+<h4>qapplied</h4>
+<pre class="literal-block">
+hg qapplied [-1] [-s] [PATCH]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-1</span>, <span class="option">--last</span></kbd></td>
+<td>show only the preceding applied patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qclone">
+<h4>qclone</h4>
+<pre class="literal-block">
+hg qclone [OPTION]... SOURCE [DEST]
+</pre>
+<p>If source is local, destination will have no patches applied. If
+source is remote, this command can not check if patches are
+applied in source, so cannot guarantee that patches are not
+applied in destination. If you clone remote repository, be sure
+before that it has no patches applied.</p>
+<p>Source patch repository is looked for in &lt;src&gt;/.hg/patches by
+default. Use -p &lt;url&gt; to change.</p>
+<p>The patch directory must be a nested Mercurial repository, as
+would be created by <a class="reference external" href="hg.1.html#init"><tt class="docutils literal">hg init <span class="pre">--mq</span></tt></a>.</p>
+<p>Return 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--pull</span></kbd></td>
+<td>use pull protocol to copy metadata</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--noupdate</span></kbd></td>
+<td>do not update the new working directories</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--uncompressed</span></kbd></td>
+<td>use uncompressed transfer (fast over LAN)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--patches</span></kbd></td>
+<td>location of source patch repository</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qcommit">
+<h4>qcommit</h4>
+<pre class="literal-block">
+hg qcommit [OPTION]... [FILE]...
+</pre>
+<p>This command is deprecated; use <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit <span class="pre">--mq</span></tt></a> instead.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-A</span>, <span class="option">--addremove</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>mark new/missing files as added/removed before committing</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--close-branch</span></kbd></td>
+<td>mark a branch as closed, hiding it from the branch list</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--amend</span></kbd></td>
+<td>amend the parent of the working dir</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td><p class="first">recurse into subrepositories</p>
+<p class="last">aliases: qci</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qdelete">
+<h4>qdelete</h4>
+<pre class="literal-block">
+hg qdelete [-k] [PATCH]...
+</pre>
+<p>The patches must not be applied, and at least one patch is required. Exact
+patch identifiers must be given. With -k/--keep, the patch files are
+preserved in the patch directory.</p>
+<p>To stop managing a patch and move it into permanent history,
+use the <a class="reference external" href="hg.1.html#qfinish"><tt class="docutils literal">hg qfinish</tt></a> command.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keep</span></kbd></td>
+<td>keep patch file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td><p class="first">stop managing a revision (DEPRECATED)</p>
+<p class="last">aliases: qremove qrm</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qdiff">
+<h4>qdiff</h4>
+<pre class="literal-block">
+hg qdiff [OPTION]... [FILE]...
+</pre>
+<p>Shows a diff which includes the current patch as well as any
+changes which have been made in the working directory since the
+last refresh (thus showing what the current patch would become
+after a qrefresh).</p>
+<p>Use <a class="reference external" href="hg.1.html#diff"><tt class="docutils literal">hg diff</tt></a> if you only want to see the changes made since the
+last qrefresh, or <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export qtip</tt></a> if you want to see changes
+made by the current patch without including changes made since the
+qrefresh.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--text</span></kbd></td>
+<td>treat all files as text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--nodates</span></kbd></td>
+<td>omit dates from diff headers</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-p</span>, <span class="option">--show-function</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>show which function each change is in</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--reverse</span></kbd></td>
+<td>produce a diff that undoes the changes</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-w</span>, <span class="option">--ignore-all-space</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore white space when comparing lines</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-b</span>, <span class="option">--ignore-space-change</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes in the amount of white space</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--ignore-blank-lines</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes whose lines are all blank</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--unified</span></kbd></td>
+<td>number of lines of context to show</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--stat</span></kbd></td>
+<td>output diffstat-style summary of changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qfinish">
+<h4>qfinish</h4>
+<pre class="literal-block">
+hg qfinish [-a] [REV]...
+</pre>
+<p>Finishes the specified revisions (corresponding to applied
+patches) by moving them out of mq control into regular repository
+history.</p>
+<p>Accepts a revision range or the -a/--applied option. If --applied
+is specified, all applied mq revisions are removed from mq
+control. Otherwise, the given revisions must be at the base of the
+stack of applied patches.</p>
+<p>This can be especially useful if your changes have been applied to
+an upstream repository, or if you are about to push your changes
+to upstream.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--applied</span></kbd></td>
+<td>finish all applied changesets</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qfold">
+<h4>qfold</h4>
+<pre class="literal-block">
+hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH...
+</pre>
+<p>Patches must not yet be applied. Each patch will be successively
+applied to the current patch in the order given. If all the
+patches apply successfully, the current patch will be refreshed
+with the new cumulative patch, and the folded patches will be
+deleted. With -k/--keep, the folded patch files will not be
+removed afterwards.</p>
+<p>The header for each folded patch will be concatenated with the
+current patch header, separated by a line of <tt class="docutils literal">* * *</tt>.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>edit patch header</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keep</span></kbd></td>
+<td>keep folded patch files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qgoto">
+<h4>qgoto</h4>
+<pre class="literal-block">
+hg qgoto [OPTION]... PATCH
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--keep-changes</span></kbd></td>
+<td>tolerate non-conflicting local changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>overwrite any local changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-backup</span></kbd></td>
+<td>do not save backup copies of files</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qguard">
+<h4>qguard</h4>
+<pre class="literal-block">
+hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]
+</pre>
+<p>Guards control whether a patch can be pushed. A patch with no
+guards is always pushed. A patch with a positive guard (&quot;+foo&quot;) is
+pushed only if the <a class="reference external" href="hg.1.html#qselect"><tt class="docutils literal">hg qselect</tt></a> command has activated it. A patch with
+a negative guard (&quot;-foo&quot;) is never pushed if the <a class="reference external" href="hg.1.html#qselect"><tt class="docutils literal">hg qselect</tt></a> command
+has activated it.</p>
+<p>With no arguments, print the currently active guards.
+With arguments, set guards for the named patch.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Specifying negative guards now requires '--'.</p>
+</div>
+<p>To set guards on another patch:</p>
+<pre class="literal-block">
+hg qguard other.patch -- +2.6.17 -stable
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--list</span></kbd></td>
+<td>list all patches and guards</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--none</span></kbd></td>
+<td>drop all guards</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qheader">
+<h4>qheader</h4>
+<pre class="literal-block">
+hg qheader [PATCH]
+</pre>
+<p>Returns 0 on success.</p>
+</div>
+<div class="section" id="qimport">
+<h4>qimport</h4>
+<pre class="literal-block">
+hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]...
+</pre>
+<p>The patch is inserted into the series after the last applied
+patch. If no patches have been applied, qimport prepends the patch
+to the series.</p>
+<p>The patch will have the same name as its source file unless you
+give it a new one with -n/--name.</p>
+<p>You can register an existing patch inside the patch directory with
+the -e/--existing flag.</p>
+<p>With -f/--force, an existing patch of the same name will be
+overwritten.</p>
+<p>An existing changeset may be placed under mq control with -r/--rev
+(e.g. qimport --rev tip -n patch will place tip under mq control).
+With -g/--git, patches imported with --rev will use the git diff
+format. See the diffs help topic for information on why this is
+important for preserving rename/copy information and permission
+changes. Use <a class="reference external" href="hg.1.html#qfinish"><tt class="docutils literal">hg qfinish</tt></a> to remove changesets from mq control.</p>
+<p>To import a patch from standard input, pass - as the patch file.
+When importing from standard input, a patch name must be specified
+using the --name flag.</p>
+<p>To import an existing patch while renaming it:</p>
+<pre class="literal-block">
+hg qimport -e existing-patch -n new-name
+</pre>
+<p>Returns 0 if import succeeded.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--existing</span></kbd></td>
+<td>import file in patch directory</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--name</span></kbd></td>
+<td>name of patch file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>overwrite existing files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>place existing revisions under mq control</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-P</span>, <span class="option">--push</span></kbd></td>
+<td>qpush after importing</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qinit">
+<h4>qinit</h4>
+<pre class="literal-block">
+hg qinit [-c]
+</pre>
+<p>The queue repository is unversioned by default. If
+-c/--create-repo is specified, qinit will create a separate nested
+repository for patches (qinit -c may also be run later to convert
+an unversioned patch repository into a versioned one). You can use
+qcommit to commit changes to this queue repository.</p>
+<p>This command is deprecated. Without -c, it's implied by other relevant
+commands. With -c, use <a class="reference external" href="hg.1.html#init"><tt class="docutils literal">hg init <span class="pre">--mq</span></tt></a> instead.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-c</span>, <span class="option">--create-repo</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>create queue repository</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qnew">
+<h4>qnew</h4>
+<pre class="literal-block">
+hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]...
+</pre>
+<p>qnew creates a new patch on top of the currently-applied patch (if
+any). The patch will be initialized with any outstanding changes
+in the working directory. You may also use -I/--include,
+-X/--exclude, and/or a list of files after the patch name to add
+only changes to matching files to the new patch, leaving the rest
+as uncommitted modifications.</p>
+<p>-u/--user and -d/--date can be used to set the (given) user and
+date, respectively. -U/--currentuser and -D/--currentdate set user
+to current user and date to current date.</p>
+<p>-e/--edit, -m/--message or -l/--logfile set the patch header as
+well as the commit message. If none is specified, the header is
+empty and the commit message is '[mq]: PATCH'.</p>
+<p>Use the -g/--git option to keep the patch in the git extended diff
+format. Read the diffs help topic for more information on why this
+is important for preserving permission changes and copy/rename
+information.</p>
+<p>Returns 0 on successful creation of a new patch.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>edit commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>import uncommitted changes (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-U</span>, <span class="option">--currentuser</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>add &quot;From: &lt;current user&gt;&quot; to patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>add &quot;From: &lt;USER&gt;&quot; to patch</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-D</span>, <span class="option">--currentdate</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>add &quot;Date: &lt;current date&gt;&quot; to patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>add &quot;Date: &lt;DATE&gt;&quot; to patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qnext">
+<h4>qnext</h4>
+<pre class="literal-block">
+hg qnext [-s]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qpop">
+<h4>qpop</h4>
+<pre class="literal-block">
+hg qpop [-a] [-f] [PATCH | INDEX]
+</pre>
+<p>Without argument, pops off the top of the patch stack. If given a
+patch name, keeps popping off patches until the named patch is at
+the top of the stack.</p>
+<p>By default, abort if the working directory contains uncommitted
+changes. With --keep-changes, abort only if the uncommitted files
+overlap with patched files. With -f/--force, backup and discard
+changes made to such files.</p>
+<p>Return 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>pop all patches</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--name</span></kbd></td>
+<td>queue name to pop (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--keep-changes</span></kbd></td>
+<td>tolerate non-conflicting local changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>forget any local changes to patched files</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-backup</span></kbd></td>
+<td>do not save backup copies of files</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qprev">
+<h4>qprev</h4>
+<pre class="literal-block">
+hg qprev [-s]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qpush">
+<h4>qpush</h4>
+<pre class="literal-block">
+hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]
+</pre>
+<p>By default, abort if the working directory contains uncommitted
+changes. With --keep-changes, abort only if the uncommitted files
+overlap with patched files. With -f/--force, backup and patch over
+uncommitted changes.</p>
+<p>Return 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">--keep-changes</span></kbd></td>
+<td>tolerate non-conflicting local changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>apply on top of local changes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--exact</span></kbd></td>
+<td>apply the target patch to its recorded parent</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--list</span></kbd></td>
+<td>list patch name in commit text</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>apply all patches</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--merge</span></kbd></td>
+<td>merge from another queue (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--name</span></kbd></td>
+<td>merge queue name (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--move</span></kbd></td>
+<td>reorder patch series and apply only the patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-backup</span></kbd></td>
+<td>do not save backup copies of files</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qqueue">
+<h4>qqueue</h4>
+<pre class="literal-block">
+hg qqueue [OPTION] [QUEUE]
+</pre>
+<p>Supports switching between different patch queues, as well as creating
+new patch queues and deleting existing ones.</p>
+<p>Omitting a queue name or specifying -l/--list will show you the registered
+queues - by default the &quot;normal&quot; patches queue is registered. The currently
+active queue will be marked with &quot;(active)&quot;. Specifying --active will print
+only the name of the active queue.</p>
+<p>To create a new queue, use -c/--create. The queue is automatically made
+active, except in the case where there are applied patches from the
+currently active queue in the repository. Then the queue will only be
+created and switching will fail.</p>
+<p>To delete an existing queue, use --delete. You cannot delete the currently
+active queue.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--list</span></kbd></td>
+<td>list all available queues</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--active</span></kbd></td>
+<td>print name of active queue</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--create</span></kbd></td>
+<td>create new queue</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--rename</span></kbd></td>
+<td>rename active queue</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--delete</span></kbd></td>
+<td>delete reference to queue</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--purge</span></kbd></td>
+<td>delete queue, and remove patch dir</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qrefresh">
+<h4>qrefresh</h4>
+<pre class="literal-block">
+hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...
+</pre>
+<p>If any file patterns are provided, the refreshed patch will
+contain only the modifications that match those patterns; the
+remaining modifications will remain in the working directory.</p>
+<p>If -s/--short is specified, files currently included in the patch
+will be refreshed just like matched files and remain in the patch.</p>
+<p>If -e/--edit is specified, Mercurial will start your configured editor for
+you to enter a message. In case qrefresh fails, you will find a backup of
+your message in <tt class="docutils literal"><span class="pre">.hg/last-message.txt</span></tt>.</p>
+<p>hg add/remove/copy/rename work as usual, though you might want to
+use git-style patches (-g/--git or [diff] git=1) to track copies
+and renames. See the diffs help topic for more information on the
+git diff format.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>edit commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--short</span></kbd></td>
+<td>refresh only files already in the patch and specified files</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-U</span>, <span class="option">--currentuser</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>add/update author field in patch with current user</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>add/update author field in patch with given user</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-D</span>, <span class="option">--currentdate</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>add/update date field in patch with current date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>add/update date field in patch with given date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qrename">
+<h4>qrename</h4>
+<pre class="literal-block">
+hg qrename PATCH1 [PATCH2]
+</pre>
+<p>With one argument, renames the current patch to PATCH1.
+With two arguments, renames PATCH1 to PATCH2.</p>
+<p>Returns 0 on success.</p>
+<blockquote>
+aliases: qmv</blockquote>
+</div>
+<div class="section" id="qrestore">
+<h4>qrestore</h4>
+<pre class="literal-block">
+hg qrestore [-d] [-u] REV
+</pre>
+<p>This command is deprecated, use <a class="reference external" href="hg.1.html#rebase"><tt class="docutils literal">hg rebase</tt></a> instead.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--delete</span></kbd></td>
+<td>delete save entry</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--update</span></kbd></td>
+<td>update queue working directory</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qsave">
+<h4>qsave</h4>
+<pre class="literal-block">
+hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]
+</pre>
+<p>This command is deprecated, use <a class="reference external" href="hg.1.html#rebase"><tt class="docutils literal">hg rebase</tt></a> instead.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--copy</span></kbd></td>
+<td>copy patch directory</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--name</span></kbd></td>
+<td>copy directory name</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--empty</span></kbd></td>
+<td>clear queue status file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force copy</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qselect">
+<h4>qselect</h4>
+<pre class="literal-block">
+hg qselect [OPTION]... [GUARD]...
+</pre>
+<p>Use the <a class="reference external" href="hg.1.html#qguard"><tt class="docutils literal">hg qguard</tt></a> command to set or print guards on patch, then use
+qselect to tell mq which guards to use. A patch will be pushed if
+it has no guards or any positive guards match the currently
+selected guard, but will not be pushed if any negative guards
+match the current guard. For example:</p>
+<pre class="literal-block">
+qguard foo.patch -- -stable (negative guard)
+qguard bar.patch +stable (positive guard)
+qselect stable
+</pre>
+<p>This activates the &quot;stable&quot; guard. mq will skip foo.patch (because
+it has a negative match) but push bar.patch (because it has a
+positive match).</p>
+<p>With no arguments, prints the currently active guards.
+With one argument, sets the active guard.</p>
+<p>Use -n/--none to deactivate guards (no other arguments needed).
+When no guards are active, patches with positive guards are
+skipped and patches with negative guards are pushed.</p>
+<p>qselect can change the guards on applied patches. It does not pop
+guarded patches by default. Use --pop to pop back to the last
+applied patch that is not guarded. Use --reapply (which implies
+--pop) to push back to the current patch afterwards, but skip
+guarded patches.</p>
+<p>Use -s/--series to print a list of all guards in the series file
+(no other arguments needed). Use -v for more information.</p>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--none</span></kbd></td>
+<td>disable all guards</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--series</span></kbd></td>
+<td>list all guards in series file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--pop</span></kbd></td>
+<td>pop to before first guarded applied patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--reapply</span></kbd></td>
+<td>pop, then reapply patches</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qseries">
+<h4>qseries</h4>
+<pre class="literal-block">
+hg qseries [-ms]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--missing</span></kbd></td>
+<td>print patches not in series</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qtop">
+<h4>qtop</h4>
+<pre class="literal-block">
+hg qtop [-s]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="qunapplied">
+<h4>qunapplied</h4>
+<pre class="literal-block">
+hg qunapplied [-1] [-s] [PATCH]
+</pre>
+<p>Returns 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-1</span>, <span class="option">--first</span></kbd></td>
+<td>show only the first patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--summary</span></kbd></td>
+<td>print first line of patch header</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="strip">
+<h4>strip</h4>
+<pre class="literal-block">
+hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...
+</pre>
+<p>The strip command removes the specified changesets and all their
+descendants. If the working directory has uncommitted changes, the
+operation is aborted unless the --force flag is supplied, in which
+case changes will be discarded.</p>
+<p>If a parent of the working directory is stripped, then the working
+directory will automatically be updated to the most recent
+available ancestor of the stripped parent after the operation
+completes.</p>
+<p>Any stripped changesets are stored in <tt class="docutils literal"><span class="pre">.hg/strip-backup</span></tt> as a
+bundle (see <a class="reference external" href="hg.1.html#bundle"><tt class="docutils literal">hg help bundle</tt></a> and <a class="reference external" href="hg.1.html#unbundle"><tt class="docutils literal">hg help unbundle</tt></a>). They can
+be restored by running <a class="reference external" href="hg.1.html#unbundle"><tt class="docutils literal">hg unbundle <span class="pre">.hg/strip-backup/BUNDLE</span></tt></a>,
+where BUNDLE is the bundle file created by the strip. Note that
+the local revision numbers will in general be different after the
+restore.</p>
+<p>Use the --no-backup option to discard the backup bundle once the
+operation completes.</p>
+<p>Strip is not a history-rewriting operation and can be used on
+changesets in the public phase. But if the stripped changesets have
+been pushed to a remote repository you will likely pull them again.</p>
+<p>Return 0 on success.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>strip specified revision (optional, can specify revisions without this option)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--force</span></kbd></td>
+<td>force removal of changesets, discard uncommitted changes (no backup)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--backup</span></kbd></td>
+<td>bundle only changesets with local revision number greater than REV which are not descendants of REV (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--no-backup</span></kbd></td>
+<td>no backups</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--nobackup</span></kbd></td>
+<td>no backups (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span></kbd></td>
+<td>ignored (DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-k</span>, <span class="option">--keep</span></kbd></td>
+<td>do not modify working copy during strip</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-B</span>, <span class="option">--bookmark</span></kbd></td>
+<td>remove revs only reachable from given bookmark</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="notify">
+<h2><a class="toc-backref" href="#id89">notify</a></h2>
+<p>hooks for sending email push notifications</p>
+<p>This extension implements hooks to send email notifications when
+changesets are sent from or received by the local repository.</p>
+<p>First, enable the extension as explained in <a class="reference external" href="hg.1.html#extensions"><tt class="docutils literal">hg help extensions</tt></a>, and
+register the hook you want to run. <tt class="docutils literal">incoming</tt> and <tt class="docutils literal">changegroup</tt> hooks
+are run when changesets are received, while <tt class="docutils literal">outgoing</tt> hooks are for
+changesets sent to another repository:</p>
+<pre class="literal-block">
+[hooks]
+# one email for each incoming changeset
+incoming.notify = python:hgext.notify.hook
+# one email for all incoming changesets
+changegroup.notify = python:hgext.notify.hook
+
+# one email for all outgoing changesets
+outgoing.notify = python:hgext.notify.hook
+</pre>
+<p>This registers the hooks. To enable notification, subscribers must
+be assigned to repositories. The <tt class="docutils literal">[usersubs]</tt> section maps multiple
+repositories to a given recipient. The <tt class="docutils literal">[reposubs]</tt> section maps
+multiple recipients to a single repository:</p>
+<pre class="literal-block">
+[usersubs]
+# key is subscriber email, value is a comma-separated list of repo glob
+# patterns
+user&#64;host = pattern
+
+[reposubs]
+# key is glob pattern, value is a comma-separated list of subscriber
+# emails
+pattern = user&#64;host
+</pre>
+<p>Glob patterns are matched against absolute path to repository
+root.</p>
+<p>In order to place them under direct user management, <tt class="docutils literal">[usersubs]</tt> and
+<tt class="docutils literal">[reposubs]</tt> sections may be placed in a separate <tt class="docutils literal">hgrc</tt> file and
+incorporated by reference:</p>
+<pre class="literal-block">
+[notify]
+config = /path/to/subscriptionsfile
+</pre>
+<p>Notifications will not be sent until the <tt class="docutils literal">notify.test</tt> value is set
+to <tt class="docutils literal">False</tt>; see below.</p>
+<p>Notifications content can be tweaked with the following configuration entries:</p>
+<dl class="docutils">
+<dt>notify.test</dt>
+<dd>If <tt class="docutils literal">True</tt>, print messages to stdout instead of sending them. Default: True.</dd>
+<dt>notify.sources</dt>
+<dd><p class="first">Space-separated list of change sources. Notifications are activated only
+when a changeset's source is in this list. Sources may be:</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field"><th class="field-name"><tt class="docutils literal">serve</tt>:</th><td class="field-body">changesets received via http or ssh</td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">pull</tt>:</th><td class="field-body">changesets received via <tt class="docutils literal">hg pull</tt></td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">unbundle</tt>:</th><td class="field-body">changesets received via <tt class="docutils literal">hg unbundle</tt></td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">push</tt>:</th><td class="field-body">changesets sent or received via <tt class="docutils literal">hg push</tt></td>
+</tr>
+<tr class="field"><th class="field-name"><tt class="docutils literal">bundle</tt>:</th><td class="field-body">changesets sent via <tt class="docutils literal">hg unbundle</tt></td>
+</tr>
+</tbody>
+</table>
+<p class="last">Default: serve.</p>
+</dd>
+<dt>notify.strip</dt>
+<dd>Number of leading slashes to strip from url paths. By default, notifications
+reference repositories with their absolute path. <tt class="docutils literal">notify.strip</tt> lets you
+turn them into relative paths. For example, <tt class="docutils literal">notify.strip=3</tt> will change
+<tt class="docutils literal">/long/path/repository</tt> into <tt class="docutils literal">repository</tt>. Default: 0.</dd>
+<dt>notify.domain</dt>
+<dd>Default email domain for sender or recipients with no explicit domain.</dd>
+<dt>notify.style</dt>
+<dd>Style file to use when formatting emails.</dd>
+<dt>notify.template</dt>
+<dd>Template to use when formatting emails.</dd>
+<dt>notify.incoming</dt>
+<dd>Template to use when run as an incoming hook, overriding <tt class="docutils literal">notify.template</tt>.</dd>
+<dt>notify.outgoing</dt>
+<dd>Template to use when run as an outgoing hook, overriding <tt class="docutils literal">notify.template</tt>.</dd>
+<dt>notify.changegroup</dt>
+<dd>Template to use when running as a changegroup hook, overriding
+<tt class="docutils literal">notify.template</tt>.</dd>
+<dt>notify.maxdiff</dt>
+<dd>Maximum number of diff lines to include in notification email. Set to 0
+to disable the diff, or -1 to include all of it. Default: 300.</dd>
+<dt>notify.maxsubject</dt>
+<dd>Maximum number of characters in email's subject line. Default: 67.</dd>
+<dt>notify.diffstat</dt>
+<dd>Set to True to include a diffstat before diff content. Default: True.</dd>
+<dt>notify.merge</dt>
+<dd>If True, send notifications for merge changesets. Default: True.</dd>
+<dt>notify.mbox</dt>
+<dd>If set, append mails to this mbox file instead of sending. Default: None.</dd>
+<dt>notify.fromauthor</dt>
+<dd>If set, use the committer of the first changeset in a changegroup for
+the &quot;From&quot; field of the notification mail. If not set, take the user
+from the pushing repo. Default: False.</dd>
+</dl>
+<p>If set, the following entries will also be used to customize the
+notifications:</p>
+<dl class="docutils">
+<dt>email.from</dt>
+<dd>Email <tt class="docutils literal">From</tt> address to use if none can be found in the generated
+email content.</dd>
+<dt>web.baseurl</dt>
+<dd>Root repository URL to combine with repository paths when making
+references. See also <tt class="docutils literal">notify.strip</tt>.</dd>
+</dl>
+</div>
+<div class="section" id="pager">
+<h2><a class="toc-backref" href="#id90">pager</a></h2>
+<p>browse command output with an external pager</p>
+<p>To set the pager that should be used, set the application variable:</p>
+<pre class="literal-block">
+[pager]
+pager = less -FRX
+</pre>
+<p>If no pager is set, the pager extensions uses the environment variable
+$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used.</p>
+<p>You can disable the pager for certain commands by adding them to the
+pager.ignore list:</p>
+<pre class="literal-block">
+[pager]
+ignore = version, help, update
+</pre>
+<p>You can also enable the pager only for certain commands using
+pager.attend. Below is the default list of commands to be paged:</p>
+<pre class="literal-block">
+[pager]
+attend = annotate, cat, diff, export, glog, log, qdiff
+</pre>
+<p>Setting pager.attend to an empty value will cause all commands to be
+paged.</p>
+<p>If pager.attend is present, pager.ignore will be ignored.</p>
+<p>To ignore global commands like <a class="reference external" href="hg.1.html#version"><tt class="docutils literal">hg version</tt></a> or <a class="reference external" href="hg.1.html#help"><tt class="docutils literal">hg help</tt></a>, you have
+to specify them in your user configuration file.</p>
+<p>The --pager=... option can also be used to control when the pager is
+used. Use a boolean value like yes, no, on, off, or use auto for
+normal behavior.</p>
+</div>
+<div class="section" id="patchbomb">
+<h2><a class="toc-backref" href="#id91">patchbomb</a></h2>
+<p>command to send changesets as (a series of) patch emails</p>
+<p>The series is started off with a &quot;[PATCH 0 of N]&quot; introduction, which
+describes the series as a whole.</p>
+<p>Each patch email has a Subject line of &quot;[PATCH M of N] ...&quot;, using the
+first line of the changeset description as the subject text. The
+message contains two or three body parts:</p>
+<ul class="simple">
+<li>The changeset description.</li>
+<li>[Optional] The result of running diffstat on the patch.</li>
+<li>The patch itself, as generated by <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export</tt></a>.</li>
+</ul>
+<p>Each message refers to the first in the series using the In-Reply-To
+and References headers, so they will show up as a sequence in threaded
+mail and news readers, and in mail archives.</p>
+<p>To configure other defaults, add a section like this to your
+configuration file:</p>
+<pre class="literal-block">
+[email]
+from = My Name &lt;my&#64;email&gt;
+to = recipient1, recipient2, ...
+cc = cc1, cc2, ...
+bcc = bcc1, bcc2, ...
+reply-to = address1, address2, ...
+</pre>
+<p>Use <tt class="docutils literal">[patchbomb]</tt> as configuration section name if you need to
+override global <tt class="docutils literal">[email]</tt> address settings.</p>
+<p>Then you can use the <a class="reference external" href="hg.1.html#email"><tt class="docutils literal">hg email</tt></a> command to mail a series of
+changesets as a patchbomb.</p>
+<p>You can also either configure the method option in the email section
+to be a sendmail compatible mailer or fill out the [smtp] section so
+that the patchbomb extension can automatically send patchbombs
+directly from the commandline. See the [email] and [smtp] sections in
+hgrc(5) for details.</p>
+<div class="section" id="id26">
+<h3>Commands</h3>
+<div class="section" id="email">
+<h4>email</h4>
+<pre class="literal-block">
+hg email [OPTION]... [DEST]...
+</pre>
+<p>By default, diffs are sent in the format generated by
+<a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export</tt></a>, one per message. The series starts with a &quot;[PATCH 0
+of N]&quot; introduction, which describes the series as a whole.</p>
+<p>Each patch email has a Subject line of &quot;[PATCH M of N] ...&quot;, using
+the first line of the changeset description as the subject text.
+The message contains two or three parts. First, the changeset
+description.</p>
+<p>With the -d/--diffstat option, if the diffstat program is
+installed, the result of running diffstat on the patch is inserted.</p>
+<p>Finally, the patch itself, as generated by <a class="reference external" href="hg.1.html#export"><tt class="docutils literal">hg export</tt></a>.</p>
+<p>With the -d/--diffstat or -c/--confirm options, you will be presented
+with a final summary of all messages and asked for confirmation before
+the messages are sent.</p>
+<p>By default the patch is included as text in the email body for
+easy reviewing. Using the -a/--attach option will instead create
+an attachment for the patch. With -i/--inline an inline attachment
+will be created. You can include a patch both as text in the email
+body and as a regular or an inline attachment by combining the
+-a/--attach or -i/--inline with the --body option.</p>
+<p>With -o/--outgoing, emails will be generated for patches not found
+in the destination repository (or only those which are ancestors
+of the specified revisions if any are provided)</p>
+<p>With -b/--bundle, changesets are selected as for --outgoing, but a
+single email containing a binary Mercurial bundle as an attachment
+will be sent.</p>
+<p>With -m/--mbox, instead of previewing each patchbomb message in a
+pager or sending the messages directly, it will create a UNIX
+mailbox file with the patch emails. This mailbox file can be
+previewed with any mail user agent which supports UNIX mbox
+files.</p>
+<p>With -n/--test, all steps will run, but mail will not be sent.
+You will be prompted for an email recipient address, a subject and
+an introductory message describing the patches of your patchbomb.
+Then when all is done, patchbomb messages are displayed. If the
+PAGER environment variable is set, your pager will be fired up once
+for each patchbomb message, so you can verify everything is alright.</p>
+<p>In case email sending fails, you will find a backup of your series
+introductory message in <tt class="docutils literal"><span class="pre">.hg/last-email.txt</span></tt>.</p>
+<p>Examples:</p>
+<pre class="literal-block">
+hg email -r 3000 # send patch 3000 only
+hg email -r 3000 -r 3001 # send patches 3000 and 3001
+hg email -r 3000:3005 # send patches 3000 through 3005
+hg email 3000 # send patch 3000 (deprecated)
+
+hg email -o # send all patches not in default
+hg email -o DEST # send all patches not in DEST
+hg email -o -r 3000 # send all ancestors of 3000 not in default
+hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST
+
+hg email -b # send bundle of all patches not in default
+hg email -b DEST # send bundle of all patches not in DEST
+hg email -b -r 3000 # bundle of all ancestors of 3000 not in default
+hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST
+
+hg email -o -m mbox &amp;&amp; # generate an mbox file...
+ mutt -R -f mbox # ... and view it with mutt
+hg email -o -m mbox &amp;&amp; # generate an mbox file ...
+ formail -s sendmail \ # ... and use formail to send from the mbox
+ -bm -t &lt; mbox # ... using sendmail
+</pre>
+<p>Before using this command, you will need to enable email in your
+hgrc. See the [email] section in hgrc(5) for details.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-g</span>, <span class="option">--git</span></kbd></td>
+<td>use git extended diff format</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--plain</span></kbd></td>
+<td>omit hg patch header</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-o</span>, <span class="option">--outgoing</span></kbd></td>
+<td>send changes not found in the target repository</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--bundle</span></kbd></td>
+<td>send changes not in target as a binary bundle</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--bundlename</span></kbd></td>
+<td>name of the bundle attachment file (default: bundle)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>a revision to send</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--force</span></kbd></td>
+<td>run even when remote repository is unrelated (with -b/--bundle)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--base</span></kbd></td>
+<td>a base changeset to specify instead of a destination (with -b/--bundle)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--intro</span></kbd></td>
+<td>send an introduction email for a single patch</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--body</span></kbd></td>
+<td>send patches as inline message text (default)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--attach</span></kbd></td>
+<td>send patches as attachments</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-i</span>, <span class="option">--inline</span></kbd></td>
+<td>send patches as inline attachments</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--bcc</span></kbd></td>
+<td>email addresses of blind carbon copy recipients</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--cc</span></kbd></td>
+<td>email addresses of copy recipients</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--confirm</span></kbd></td>
+<td>ask for confirmation before sending</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--diffstat</span></kbd></td>
+<td>add diffstat output to messages</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--date</span></kbd></td>
+<td>use the given date as the sending date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--desc</span></kbd></td>
+<td>use the given file as the series description</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-f</span>, <span class="option">--from</span></kbd></td>
+<td>email address of sender</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-n</span>, <span class="option">--test</span></kbd></td>
+<td>print messages that would be sent</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--mbox</span></kbd></td>
+<td>write messages to mbox file instead of sending them</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--reply-to</span></kbd></td>
+<td>email addresses replies should be sent to</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--subject</span></kbd></td>
+<td>subject of first message (intro or single patch)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--in-reply-to</span></kbd></td>
+<td>message identifier to reply to</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--flag</span></kbd></td>
+<td>flags to add in subject prefixes</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--to</span></kbd></td>
+<td>email addresses of recipients</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--ssh</span></kbd></td>
+<td>specify ssh command to use</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--remotecmd</span></kbd></td>
+<td>specify hg command to run on the remote side</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--insecure</span></kbd></td>
+<td>do not verify server certificate (ignoring web.cacerts config)</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="progress">
+<h2><a class="toc-backref" href="#id92">progress</a></h2>
+<p>show progress bars for some actions</p>
+<p>This extension uses the progress information logged by hg commands
+to draw progress bars that are as informative as possible. Some progress
+bars only offer indeterminate information, while others have a definite
+end point.</p>
+<p>The following settings are available:</p>
+<pre class="literal-block">
+[progress]
+delay = 3 # number of seconds (float) before showing the progress bar
+changedelay = 1 # changedelay: minimum delay before showing a new topic.
+ # If set to less than 3 * refresh, that value will
+ # be used instead.
+refresh = 0.1 # time in seconds between refreshes of the progress bar
+format = topic bar number estimate # format of the progress bar
+width = &lt;none&gt; # if set, the maximum width of the progress information
+ # (that is, min(width, term width) will be used)
+clear-complete = True # clear the progress bar after it's done
+disable = False # if true, don't show a progress bar
+assume-tty = False # if true, ALWAYS show a progress bar, unless
+ # disable is given
+</pre>
+<p>Valid entries for the format field are topic, bar, number, unit,
+estimate, speed, and item. item defaults to the last 20 characters of
+the item, but this can be changed by adding either <tt class="docutils literal"><span class="pre">-&lt;num&gt;</span></tt> which
+would take the last num characters, or <tt class="docutils literal">+&lt;num&gt;</tt> for the first num
+characters.</p>
+</div>
+<div class="section" id="purge">
+<h2><a class="toc-backref" href="#id93">purge</a></h2>
+<p>command to delete untracked files from the working directory</p>
+<div class="section" id="id27">
+<h3>Commands</h3>
+<div class="section" id="id28">
+<h4>purge</h4>
+<pre class="literal-block">
+hg purge [OPTION]... [DIR]...
+</pre>
+<p>Delete files not known to Mercurial. This is useful to test local
+and uncommitted changes in an otherwise-clean source tree.</p>
+<p>This means that purge will delete:</p>
+<ul class="simple">
+<li>Unknown files: files marked with &quot;?&quot; by <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a></li>
+<li>Empty directories: in fact Mercurial ignores directories unless
+they contain files under source control management</li>
+</ul>
+<p>But it will leave untouched:</p>
+<ul class="simple">
+<li>Modified and unmodified tracked files</li>
+<li>Ignored files (unless --all is specified)</li>
+<li>New files added to the repository (with <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add</tt></a>)</li>
+</ul>
+<p>If directories are given on the command line, only files in these
+directories are considered.</p>
+<p>Be careful with purge, as you could irreversibly delete some files
+you forgot to add to the repository. If you only want to print the
+list of files that this program would delete, use the --print
+option.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-a</span>, <span class="option">--abort-on-err</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>abort if an error occurs</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--all</span></kbd></td>
+<td>purge ignored files too</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--print</span></kbd></td>
+<td>print filenames instead of deleting them</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-0</span>, <span class="option">--print0</span></kbd></td>
+<td>end filenames with NUL, for use with xargs (implies -p/--print)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td><p class="first">exclude names matching the given patterns</p>
+<p class="last">aliases: clean</p>
+</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="rebase">
+<h2><a class="toc-backref" href="#id94">rebase</a></h2>
+<p>command to move sets of revisions to a different ancestor</p>
+<p>This extension lets you rebase changesets in an existing Mercurial
+repository.</p>
+<p>For more information:
+<a class="reference external" href="http://mercurial.selenic.com/wiki/RebaseExtension">http://mercurial.selenic.com/wiki/RebaseExtension</a></p>
+<div class="section" id="id29">
+<h3>Commands</h3>
+<div class="section" id="id30">
+<h4>rebase</h4>
+<pre class="literal-block">
+hg rebase [-s REV | -b REV] [-d REV] [OPTION]
+</pre>
+<p>Rebase uses repeated merging to graft changesets from one part of
+history (the source) onto another (the destination). This can be
+useful for linearizing <em>local</em> changes relative to a master
+development tree.</p>
+<p>You should not rebase changesets that have already been shared
+with others. Doing so will force everybody else to perform the
+same rebase or they will end up with duplicated changesets after
+pulling in your rebased changesets.</p>
+<p>If you don't specify a destination changeset (<tt class="docutils literal"><span class="pre">-d/--dest</span></tt>),
+rebase uses the tipmost head of the current named branch as the
+destination. (The destination changeset is not modified by
+rebasing, but new changesets are added as its descendants.)</p>
+<p>You can specify which changesets to rebase in two ways: as a
+&quot;source&quot; changeset or as a &quot;base&quot; changeset. Both are shorthand
+for a topologically related set of changesets (the &quot;source
+branch&quot;). If you specify source (<tt class="docutils literal"><span class="pre">-s/--source</span></tt>), rebase will
+rebase that changeset and all of its descendants onto dest. If you
+specify base (<tt class="docutils literal"><span class="pre">-b/--base</span></tt>), rebase will select ancestors of base
+back to but not including the common ancestor with dest. Thus,
+<tt class="docutils literal"><span class="pre">-b</span></tt> is less precise but more convenient than <tt class="docutils literal"><span class="pre">-s</span></tt>: you can
+specify any changeset in the source branch, and rebase will select
+the whole branch. If you specify neither <tt class="docutils literal"><span class="pre">-s</span></tt> nor <tt class="docutils literal"><span class="pre">-b</span></tt>, rebase
+uses the parent of the working directory as the base.</p>
+<p>By default, rebase recreates the changesets in the source branch
+as descendants of dest and then destroys the originals. Use
+<tt class="docutils literal"><span class="pre">--keep</span></tt> to preserve the original source changesets. Some
+changesets in the source branch (e.g. merges from the destination
+branch) may be dropped if they no longer contribute any change.</p>
+<p>One result of the rules for selecting the destination changeset
+and source branch is that, unlike <tt class="docutils literal">merge</tt>, rebase will do
+nothing if you are at the latest (tipmost) head of a named branch
+with two heads. You need to explicitly specify source and/or
+destination (or <tt class="docutils literal">update</tt> to the other head, if it's the head of
+the intended source branch).</p>
+<p>If a rebase is interrupted to manually resolve a merge, it can be
+continued with --continue/-c or aborted with --abort/-a.</p>
+<p>Returns 0 on success, 1 if nothing to rebase.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--source</span></kbd></td>
+<td>rebase from the specified changeset</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--base</span></kbd></td>
+<td>rebase from the base of the specified changeset (up to greatest common ancestor of base and dest)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-r</span>, <span class="option">--rev</span></kbd></td>
+<td>rebase these revisions</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--dest</span></kbd></td>
+<td>rebase onto the specified changeset</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--collapse</span></kbd></td>
+<td>collapse the rebased changesets</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as collapse commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>invoke editor on commit messages</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read collapse commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--keep</span></kbd></td>
+<td>keep original changesets</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--keepbranches</span></kbd></td>
+<td>keep original branch names</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-D</span>, <span class="option">--detach</span></kbd></td>
+<td>(DEPRECATED)</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-t</span>, <span class="option">--tool</span></kbd></td>
+<td>specify merge tool</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--continue</span></kbd></td>
+<td>continue an interrupted rebase</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--abort</span></kbd></td>
+<td>abort an interrupted rebase</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--style</span></kbd></td>
+<td>display using template map file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--template</span></kbd></td>
+<td>display with template</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="record">
+<h2><a class="toc-backref" href="#id95">record</a></h2>
+<p>commands to interactively select changes for commit/qrefresh</p>
+<div class="section" id="id31">
+<h3>Commands</h3>
+<div class="section" id="qrecord">
+<h4>qrecord</h4>
+<pre class="literal-block">
+hg qrecord [OPTION]... PATCH [FILE]...
+</pre>
+<p>See <a class="reference external" href="hg.1.html#qnew"><tt class="docutils literal">hg help qnew</tt></a> &amp; <a class="reference external" href="hg.1.html#record"><tt class="docutils literal">hg help record</tt></a> for more information and
+usage.</p>
+</div>
+<div class="section" id="id32">
+<h4>record</h4>
+<pre class="literal-block">
+hg record [OPTION]... [FILE]...
+</pre>
+<p>If a list of files is omitted, all changes reported by <a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a>
+will be candidates for recording.</p>
+<p>See <a class="reference external" href="hg.1.html#dates"><tt class="docutils literal">hg help dates</tt></a> for a list of formats valid for -d/--date.</p>
+<p>You will be prompted for whether to record changes to each
+modified file, and for files with multiple changes, for each
+change to use. For each query, the following responses are
+possible:</p>
+<pre class="literal-block">
+y - record this change
+n - skip this change
+e - edit this change manually
+
+s - skip remaining changes to this file
+f - record remaining changes to this file
+
+d - done, skip remaining changes and files
+a - record all changes to all remaining files
+q - quit, recording no changes
+
+? - display help
+</pre>
+<p>This command is not available when committing a merge.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-A</span>, <span class="option">--addremove</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>mark new/missing files as added/removed before committing</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--close-branch</span></kbd></td>
+<td>mark a branch as closed, hiding it from the branch list</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--amend</span></kbd></td>
+<td>amend the parent of the working dir</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-I</span>, <span class="option">--include</span></kbd></td>
+<td>include names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-X</span>, <span class="option">--exclude</span></kbd></td>
+<td>exclude names matching the given patterns</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--message</span></kbd></td>
+<td>use text as commit message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-l</span>, <span class="option">--logfile</span></kbd></td>
+<td>read commit message from file</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-d</span>, <span class="option">--date</span></kbd></td>
+<td>record the specified date as commit date</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-u</span>, <span class="option">--user</span></kbd></td>
+<td>record the specified user as committer</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-S</span>, <span class="option">--subrepos</span></kbd></td>
+<td>recurse into subrepositories</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-w</span>, <span class="option">--ignore-all-space</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore white space when comparing lines</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-b</span>, <span class="option">--ignore-space-change</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes in the amount of white space</td></tr>
+<tr><td class="option-group" colspan="2">
+<kbd><span class="option">-B</span>, <span class="option">--ignore-blank-lines</span></kbd></td>
+</tr>
+<tr><td>&nbsp;</td><td>ignore changes whose lines are all blank</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="relink">
+<h2><a class="toc-backref" href="#id96">relink</a></h2>
+<p>recreates hardlinks between repository clones</p>
+<div class="section" id="id33">
+<h3>Commands</h3>
+<div class="section" id="id34">
+<h4>relink</h4>
+<pre class="literal-block">
+hg relink [ORIGIN]
+</pre>
+<p>When repositories are cloned locally, their data files will be
+hardlinked so that they only use the space of a single repository.</p>
+<p>Unfortunately, subsequent pulls into either repository will break
+hardlinks for any files touched by the new changesets, even if
+both repositories end up pulling the same changes.</p>
+<p>Similarly, passing --rev to &quot;hg clone&quot; will fail to use any
+hardlinks, falling back to a complete copy of the source
+repository.</p>
+<p>This command lets you recreate those hardlinks and reclaim that
+wasted space.</p>
+<p>This repository will be relinked to share space with ORIGIN, which
+must be on the same local disk. If ORIGIN is omitted, looks for
+&quot;default-relink&quot;, then &quot;default&quot;, in [paths].</p>
+<p>Do not attempt any read operations on this repository while the
+command is running. (Both repositories will be locked against
+writes.)</p>
+</div>
+</div>
+</div>
+<div class="section" id="schemes">
+<h2><a class="toc-backref" href="#id97">schemes</a></h2>
+<p>extend schemes with shortcuts to repository swarms</p>
+<p>This extension allows you to specify shortcuts for parent URLs with a
+lot of repositories to act like a scheme, for example:</p>
+<pre class="literal-block">
+[schemes]
+py = http://code.python.org/hg/
+</pre>
+<p>After that you can use it like:</p>
+<pre class="literal-block">
+hg clone py://trunk/
+</pre>
+<p>Additionally there is support for some more complex schemas, for
+example used by Google Code:</p>
+<pre class="literal-block">
+[schemes]
+gcode = http://{1}.googlecode.com/hg/
+</pre>
+<p>The syntax is taken from Mercurial templates, and you have unlimited
+number of variables, starting with <tt class="docutils literal">{1}</tt> and continuing with
+<tt class="docutils literal">{2}</tt>, <tt class="docutils literal">{3}</tt> and so on. This variables will receive parts of URL
+supplied, split by <tt class="docutils literal">/</tt>. Anything not specified as <tt class="docutils literal">{part}</tt> will be
+just appended to an URL.</p>
+<p>For convenience, the extension adds these schemes by default:</p>
+<pre class="literal-block">
+[schemes]
+py = http://hg.python.org/
+bb = https://bitbucket.org/
+bb+ssh = ssh://hg&#64;bitbucket.org/
+gcode = https://{1}.googlecode.com/hg/
+kiln = https://{1}.kilnhg.com/Repo/
+</pre>
+<p>You can override a predefined scheme by defining a new scheme with the
+same name.</p>
+</div>
+<div class="section" id="share">
+<h2><a class="toc-backref" href="#id98">share</a></h2>
+<p>share a common history between several working directories</p>
+<div class="section" id="id35">
+<h3>Commands</h3>
+<div class="section" id="id36">
+<h4>share</h4>
+<pre class="literal-block">
+hg share [-U] SOURCE [DEST]
+</pre>
+<p>Initialize a new repository and working directory that shares its
+history with another repository.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">using rollback or extensions that destroy/modify history (mq,
+rebase, etc.) can cause considerable confusion with shared
+clones. In particular, if two shared clones are both updated to
+the same changeset, and one of them destroys that changeset
+with rollback, the other clone will suddenly stop working: all
+operations will fail with &quot;abort: working directory has unknown
+parent&quot;. The only known workaround is to use debugsetparents on
+the broken clone to reset it to a changeset that still exists
+(e.g. tip).</p>
+</div>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-U</span>, <span class="option">--noupdate</span></kbd></td>
+<td>do not create a working copy</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="unshare">
+<h4>unshare</h4>
+<pre class="literal-block">
+hg unshare
+</pre>
+<p>Copy the store data to the repo and remove the sharedpath data.</p>
+</div>
+</div>
+</div>
+<div class="section" id="transplant">
+<h2><a class="toc-backref" href="#id99">transplant</a></h2>
+<p>command to transplant changesets from another branch</p>
+<p>This extension allows you to transplant patches from another branch.</p>
+<p>Transplanted patches are recorded in .hg/transplant/transplants, as a
+map from a changeset hash to its hash in the source repository.</p>
+<div class="section" id="id37">
+<h3>Commands</h3>
+<div class="section" id="id38">
+<h4>transplant</h4>
+<pre class="literal-block">
+hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]...
+</pre>
+<p>Selected changesets will be applied on top of the current working
+directory with the log of the original changeset. The changesets
+are copied and will thus appear twice in the history. Use the
+rebase extension instead if you want to move a whole branch of
+unpublished changesets.</p>
+<p>If --log is specified, log messages will have a comment appended
+of the form:</p>
+<pre class="literal-block">
+(transplanted from CHANGESETHASH)
+</pre>
+<p>You can rewrite the changelog message with the --filter option.
+Its argument will be invoked with the current changelog message as
+$1 and the patch as $2.</p>
+<p>If --source/-s is specified, selects changesets from the named
+repository. If --branch/-b is specified, selects changesets from
+the branch holding the named revision, up to that revision. If
+--all/-a is specified, all changesets on the branch will be
+transplanted, otherwise you will be prompted to select the
+changesets you want.</p>
+<p><a class="reference external" href="hg.1.html#transplant"><tt class="docutils literal">hg transplant <span class="pre">--branch</span> REV <span class="pre">--all</span></tt></a> will transplant the
+selected branch (up to the named revision) onto your current
+working directory.</p>
+<p>You can optionally mark selected transplanted changesets as merge
+changesets. You will not be prompted to transplant any ancestors
+of a merged transplant, and you can merge descendants of them
+normally instead of transplanting them.</p>
+<p>Merge changesets may be transplanted directly by specifying the
+proper parent changeset by calling <a class="reference external" href="hg.1.html#transplant"><tt class="docutils literal">hg transplant <span class="pre">--parent</span></tt></a>.</p>
+<p>If no merges or revisions are provided, <a class="reference external" href="hg.1.html#transplant"><tt class="docutils literal">hg transplant</tt></a> will
+start an interactive changeset browser.</p>
+<p>If a changeset application fails, you can fix the merge by hand
+and then resume where you left off by calling <a class="reference external" href="hg.1.html#transplant"><tt class="docutils literal">hg transplant
+<span class="pre">--continue/-c</span></tt></a>.</p>
+<p>Options:</p>
+<table class="docutils option-list" frame="void" rules="none">
+<col class="option" />
+<col class="description" />
+<tbody valign="top">
+<tr><td class="option-group">
+<kbd><span class="option">-s</span>, <span class="option">--source</span></kbd></td>
+<td>pull patches from REPO</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-b</span>, <span class="option">--branch</span></kbd></td>
+<td>pull patches from branch BRANCH</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-a</span>, <span class="option">--all</span></kbd></td>
+<td>pull all changesets up to BRANCH</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-p</span>, <span class="option">--prune</span></kbd></td>
+<td>skip over REV</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-m</span>, <span class="option">--merge</span></kbd></td>
+<td>merge at REV</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--parent</span></kbd></td>
+<td>parent to choose when transplanting merge</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-e</span>, <span class="option">--edit</span></kbd></td>
+<td>invoke editor on commit messages</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--log</span></kbd></td>
+<td>append transplant info to log message</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">-c</span>, <span class="option">--continue</span></kbd></td>
+<td>continue last transplant session after repair</td></tr>
+<tr><td class="option-group">
+<kbd><span class="option">--filter</span></kbd></td>
+<td>filter changesets through command</td></tr>
+</tbody>
+</table>
+</div>
+</div>
+</div>
+<div class="section" id="win32mbcs">
+<h2><a class="toc-backref" href="#id100">win32mbcs</a></h2>
+<p>allow the use of MBCS paths with problematic encodings</p>
+<p>Some MBCS encodings are not good for some path operations (i.e.
+splitting path, case conversion, etc.) with its encoded bytes. We call
+such a encoding (i.e. shift_jis and big5) as &quot;problematic encoding&quot;.
+This extension can be used to fix the issue with those encodings by
+wrapping some functions to convert to Unicode string before path
+operation.</p>
+<p>This extension is useful for:</p>
+<ul class="simple">
+<li>Japanese Windows users using shift_jis encoding.</li>
+<li>Chinese Windows users using big5 encoding.</li>
+<li>All users who use a repository with one of problematic encodings on
+case-insensitive file system.</li>
+</ul>
+<p>This extension is not needed for:</p>
+<ul class="simple">
+<li>Any user who use only ASCII chars in path.</li>
+<li>Any user who do not use any of problematic encodings.</li>
+</ul>
+<p>Note that there are some limitations on using this extension:</p>
+<ul class="simple">
+<li>You should use single encoding in one repository.</li>
+<li>If the repository path ends with 0x5c, .hg/hgrc cannot be read.</li>
+<li>win32mbcs is not compatible with fixutf8 extension.</li>
+</ul>
+<p>By default, win32mbcs uses encoding.encoding decided by Mercurial.
+You can specify the encoding by config option:</p>
+<pre class="literal-block">
+[win32mbcs]
+encoding = sjis
+</pre>
+<p>It is useful for the users who want to commit with UTF-8 log message.</p>
+</div>
+<div class="section" id="win32text">
+<h2><a class="toc-backref" href="#id101">win32text</a></h2>
+<p>perform automatic newline conversion</p>
+<blockquote>
+<p>Deprecation: The win32text extension requires each user to configure
+the extension again and again for each clone since the configuration
+is not copied when cloning.</p>
+<p>We have therefore made the <tt class="docutils literal">eol</tt> as an alternative. The <tt class="docutils literal">eol</tt>
+uses a version controlled file for its configuration and each clone
+will therefore use the right settings from the start.</p>
+</blockquote>
+<p>To perform automatic newline conversion, use:</p>
+<pre class="literal-block">
+[extensions]
+win32text =
+[encode]
+** = cleverencode:
+# or ** = macencode:
+
+[decode]
+** = cleverdecode:
+# or ** = macdecode:
+</pre>
+<p>If not doing conversion, to make sure you do not commit CRLF/CR by accident:</p>
+<pre class="literal-block">
+[hooks]
+pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+# or pretxncommit.cr = python:hgext.win32text.forbidcr
+</pre>
+<p>To do the same check on a server to prevent CRLF/CR from being
+pushed or pulled:</p>
+<pre class="literal-block">
+[hooks]
+pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf
+# or pretxnchangegroup.cr = python:hgext.win32text.forbidcr
+</pre>
+</div>
+<div class="section" id="zeroconf">
+<h2><a class="toc-backref" href="#id102">zeroconf</a></h2>
+<p>discover and advertise repositories on the local network</p>
+<p>Zeroconf-enabled repositories will be announced in a network without
+the need to configure a server or a service. They can be discovered
+without knowing their actual IP address.</p>
+<p>To allow other people to discover your repository using run
+<a class="reference external" href="hg.1.html#serve"><tt class="docutils literal">hg serve</tt></a> in your repository:</p>
+<pre class="literal-block">
+$ cd test
+$ hg serve
+</pre>
+<p>You can discover Zeroconf-enabled repositories by running
+<a class="reference external" href="hg.1.html#paths"><tt class="docutils literal">hg paths</tt></a>:</p>
+<pre class="literal-block">
+$ hg paths
+zc-test = http://example.com:8000/test
+</pre>
+</div>
+</div>
+<div class="section" id="files">
+<h1><a class="toc-backref" href="#contents">Files</a></h1>
+<dl class="docutils">
+<dt><tt class="docutils literal">/etc/mercurial/hgrc</tt>, <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt>, <tt class="docutils literal">.hg/hgrc</tt></dt>
+<dd>This file contains defaults and configuration. Values in
+<tt class="docutils literal">.hg/hgrc</tt> override those in <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt>, and these override
+settings made in the global <tt class="docutils literal">/etc/mercurial/hgrc</tt> configuration.
+See <a class="reference external" href="hgrc.5.html"><strong>hgrc</strong>(5)</a> for details of the contents and format of these
+files.</dd>
+<dt><tt class="docutils literal">.hgignore</tt></dt>
+<dd>This file contains regular expressions (one per line) that
+describe file names that should be ignored by <strong>hg</strong>. For details,
+see <a class="reference external" href="hgignore.5.html"><strong>hgignore</strong>(5)</a>.</dd>
+<dt><tt class="docutils literal">.hgsub</tt></dt>
+<dd>This file defines the locations of all subrepositories, and
+tells where the subrepository checkouts came from. For details, see
+<a class="reference external" href="hg.1.html#subrepos"><tt class="docutils literal">hg help subrepos</tt></a>.</dd>
+<dt><tt class="docutils literal">.hgsubstate</tt></dt>
+<dd>This file is where Mercurial stores all nested repository states. <em>NB: This
+file should not be edited manually.</em></dd>
+<dt><tt class="docutils literal">.hgtags</tt></dt>
+<dd>This file contains changeset hash values and text tag names (one
+of each separated by spaces) that correspond to tagged versions of
+the repository contents. The file content is encoded using UTF-8.</dd>
+<dt><tt class="docutils literal"><span class="pre">.hg/last-message.txt</span></tt></dt>
+<dd>This file is used by <a class="reference external" href="hg.1.html#commit"><tt class="docutils literal">hg commit</tt></a> to store a backup of the commit message
+in case the commit fails.</dd>
+<dt><tt class="docutils literal">.hg/localtags</tt></dt>
+<dd>This file can be used to define local tags which are not shared among
+repositories. The file format is the same as for <tt class="docutils literal">.hgtags</tt>, but it is
+encoded using the local system encoding.</dd>
+</dl>
+<p>Some commands (e.g. revert) produce backup files ending in <tt class="docutils literal">.orig</tt>,
+if the <tt class="docutils literal">.orig</tt> file already exists and is not tracked by Mercurial,
+it will be overwritten.</p>
+</div>
+<div class="section" id="bugs">
+<h1><a class="toc-backref" href="#contents">Bugs</a></h1>
+<p>Probably lots, please post them to the mailing list (see <a class="reference internal" href="#resources">Resources</a>
+below) when you find them.</p>
+</div>
+<div class="section" id="see-also">
+<h1><a class="toc-backref" href="#contents">See Also</a></h1>
+<p><a class="reference external" href="hgignore.5.html"><strong>hgignore</strong>(5)</a>, <a class="reference external" href="hgrc.5.html"><strong>hgrc</strong>(5)</a></p>
+</div>
+<div class="section" id="author">
+<h1><a class="toc-backref" href="#contents">Author</a></h1>
+<p>Written by Matt Mackall &lt;<a class="reference external" href="mailto:mpm&#64;selenic.com">mpm&#64;selenic.com</a>&gt;</p>
+</div>
+<div class="section" id="resources">
+<h1><a class="toc-backref" href="#contents">Resources</a></h1>
+<p>Main Web Site: <a class="reference external" href="http://mercurial.selenic.com/">http://mercurial.selenic.com/</a></p>
+<p>Source code repository: <a class="reference external" href="http://selenic.com/hg">http://selenic.com/hg</a></p>
+<p>Mailing list: <a class="reference external" href="http://selenic.com/mailman/listinfo/mercurial">http://selenic.com/mailman/listinfo/mercurial</a></p>
+</div>
+<div class="section" id="copying">
+<h1><a class="toc-backref" href="#contents">Copying</a></h1>
+<p>Copyright (C) 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.</p>
+<!-- Common link and substitution definitions. -->
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/hg.1.txt b/doc/hg.1.txt
new file mode 100644
index 0000000..f88ce38
--- /dev/null
+++ b/doc/hg.1.txt
@@ -0,0 +1,119 @@
+====
+ hg
+====
+
+---------------------------------------
+Mercurial source code management system
+---------------------------------------
+
+:Author: Matt Mackall <mpm@selenic.com>
+:Organization: Mercurial
+:Manual section: 1
+:Manual group: Mercurial Manual
+
+.. contents::
+ :backlinks: top
+ :class: htmlonly
+ :depth: 1
+
+
+Synopsis
+""""""""
+**hg** *command* [*option*]... [*argument*]...
+
+Description
+"""""""""""
+The **hg** command provides a command line interface to the Mercurial
+system.
+
+Command Elements
+""""""""""""""""
+
+files...
+ indicates one or more filename or relative path filenames; see
+ `File Name Patterns`_ for information on pattern matching
+
+path
+ indicates a path on the local machine
+
+revision
+ indicates a changeset which can be specified as a changeset
+ revision number, a tag, or a unique substring of the changeset
+ hash value
+
+repository path
+ either the pathname of a local repository or the URI of a remote
+ repository.
+
+.. include:: hg.1.gendoc.txt
+
+Files
+"""""
+
+``/etc/mercurial/hgrc``, ``$HOME/.hgrc``, ``.hg/hgrc``
+ This file contains defaults and configuration. Values in
+ ``.hg/hgrc`` override those in ``$HOME/.hgrc``, and these override
+ settings made in the global ``/etc/mercurial/hgrc`` configuration.
+ See |hgrc(5)|_ for details of the contents and format of these
+ files.
+
+``.hgignore``
+ This file contains regular expressions (one per line) that
+ describe file names that should be ignored by **hg**. For details,
+ see |hgignore(5)|_.
+
+``.hgsub``
+ This file defines the locations of all subrepositories, and
+ tells where the subrepository checkouts came from. For details, see
+ :hg:`help subrepos`.
+
+``.hgsubstate``
+ This file is where Mercurial stores all nested repository states. *NB: This
+ file should not be edited manually.*
+
+``.hgtags``
+ This file contains changeset hash values and text tag names (one
+ of each separated by spaces) that correspond to tagged versions of
+ the repository contents. The file content is encoded using UTF-8.
+
+``.hg/last-message.txt``
+ This file is used by :hg:`commit` to store a backup of the commit message
+ in case the commit fails.
+
+``.hg/localtags``
+ This file can be used to define local tags which are not shared among
+ repositories. The file format is the same as for ``.hgtags``, but it is
+ encoded using the local system encoding.
+
+Some commands (e.g. revert) produce backup files ending in ``.orig``,
+if the ``.orig`` file already exists and is not tracked by Mercurial,
+it will be overwritten.
+
+Bugs
+""""
+Probably lots, please post them to the mailing list (see Resources_
+below) when you find them.
+
+See Also
+""""""""
+|hgignore(5)|_, |hgrc(5)|_
+
+Author
+""""""
+Written by Matt Mackall <mpm@selenic.com>
+
+Resources
+"""""""""
+Main Web Site: http://mercurial.selenic.com/
+
+Source code repository: http://selenic.com/hg
+
+Mailing list: http://selenic.com/mailman/listinfo/mercurial
+
+Copying
+"""""""
+Copyright (C) 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+
+.. include:: common.txt
diff --git a/doc/hgignore.5 b/doc/hgignore.5
new file mode 100644
index 0000000..3535da7
--- /dev/null
+++ b/doc/hgignore.5
@@ -0,0 +1,151 @@
+.\" Man page generated from reStructeredText.
+.
+.TH HGIGNORE 5 "" "" "Mercurial Manual"
+.SH NAME
+hgignore \- syntax for Mercurial ignore files
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.sp
+The Mercurial system uses a file called \fB.hgignore\fP in the root
+directory of a repository to control its behavior when it searches
+for files that it is not currently tracking.
+.SH DESCRIPTION
+.sp
+The working directory of a Mercurial repository will often contain
+files that should not be tracked by Mercurial. These include backup
+files created by editors and build products created by compilers.
+These files can be ignored by listing them in a \fB.hgignore\fP file in
+the root of the working directory. The \fB.hgignore\fP file must be
+created manually. It is typically put under version control, so that
+the settings will propagate to other repositories with push and pull.
+.sp
+An untracked file is ignored if its path relative to the repository
+root directory, or any prefix path of that path, is matched against
+any pattern in \fB.hgignore\fP.
+.sp
+For example, say we have an untracked file, \fBfile.c\fP, at
+\fBa/b/file.c\fP inside our repository. Mercurial will ignore \fBfile.c\fP
+if any pattern in \fB.hgignore\fP matches \fBa/b/file.c\fP, \fBa/b\fP or \fBa\fP.
+.sp
+In addition, a Mercurial configuration file can reference a set of
+per\-user or global ignore files. See the \fBignore\fP configuration
+key on the \fB[ui]\fP section of \%\fBhg help config\fP\: for details of how to
+configure these files.
+.sp
+To control Mercurial\(aqs handling of files that it manages, many
+commands support the \fB\-I\fP and \fB\-X\fP options; see
+\%\fBhg help <command>\fP\: and \%\fBhg help patterns\fP\: for details.
+.sp
+Files that are already tracked are not affected by .hgignore, even
+if they appear in .hgignore. An untracked file X can be explicitly
+added with \%\fBhg add X\fP\:, even if X would be excluded by a pattern
+in .hgignore.
+.SH SYNTAX
+.sp
+An ignore file is a plain text file consisting of a list of patterns,
+with one pattern per line. Empty lines are skipped. The \fB#\fP
+character is treated as a comment character, and the \fB\e\fP character
+is treated as an escape character.
+.sp
+Mercurial supports several pattern syntaxes. The default syntax used
+is Python/Perl\-style regular expressions.
+.sp
+To change the syntax used, use a line of the following form:
+.sp
+.nf
+.ft C
+syntax: NAME
+.ft P
+.fi
+.sp
+where \fBNAME\fP is one of the following:
+.INDENT 0.0
+.TP
+.B \fBregexp\fP
+.sp
+Regular expression, Python/Perl syntax.
+.TP
+.B \fBglob\fP
+.sp
+Shell\-style glob.
+.UNINDENT
+.sp
+The chosen syntax stays in effect when parsing all patterns that
+follow, until another syntax is selected.
+.sp
+Neither glob nor regexp patterns are rooted. A glob\-syntax pattern of
+the form \fB*.c\fP will match a file ending in \fB.c\fP in any directory,
+and a regexp pattern of the form \fB\e.c$\fP will do the same. To root a
+regexp pattern, start it with \fB^\fP.
+.IP Note
+.
+Patterns specified in other than \fB.hgignore\fP are always rooted.
+Please see \%\fBhg help patterns\fP\: for details.
+.RE
+.SH EXAMPLE
+.sp
+Here is an example ignore file.
+.sp
+.nf
+.ft C
+# use glob syntax.
+syntax: glob
+
+*.elc
+*.pyc
+*~
+
+# switch to regexp syntax.
+syntax: regexp
+^\e.pc/
+.ft P
+.fi
+.SH AUTHOR
+.sp
+Vadim Gelfer <\%vadim.gelfer@gmail.com\:>
+.sp
+Mercurial was written by Matt Mackall <\%mpm@selenic.com\:>.
+.SH SEE ALSO
+.sp
+\%\fBhg\fP(1)\:, \%\fBhgrc\fP(5)\:
+.SH COPYING
+.sp
+This manual page is copyright 2006 Vadim Gelfer.
+Mercurial is copyright 2005\-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+.\" Common link and substitution definitions.
+.
+.SH AUTHOR
+Vadim Gelfer <vadim.gelfer@gmail.com>
+
+Organization: Mercurial
+.\" Generated by docutils manpage writer.
+.\"
+.
diff --git a/doc/hgignore.5.html b/doc/hgignore.5.html
new file mode 100644
index 0000000..d760dba
--- /dev/null
+++ b/doc/hgignore.5.html
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
+<title>hgignore</title>
+<meta name="author" content="Vadim Gelfer &lt;vadim.gelfer&#64;gmail.com&gt;" />
+<meta name="organization" content="Mercurial" />
+<link rel="stylesheet" href="style.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="hgignore">
+<h1 class="title">hgignore</h1>
+<h2 class="subtitle" id="syntax-for-mercurial-ignore-files">syntax for Mercurial ignore files</h2>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Vadim Gelfer &lt;<a class="reference external" href="mailto:vadim.gelfer&#64;gmail.com">vadim.gelfer&#64;gmail.com</a>&gt;</td></tr>
+<tr><th class="docinfo-name">Organization:</th>
+<td>Mercurial</td></tr>
+<tr class="field"><th class="docinfo-name">Manual section:</th><td class="field-body">5</td>
+</tr>
+<tr class="field"><th class="docinfo-name">Manual group:</th><td class="field-body">Mercurial Manual</td>
+</tr>
+</tbody>
+</table>
+<div class="section" id="synopsis">
+<h1>Synopsis</h1>
+<p>The Mercurial system uses a file called <tt class="docutils literal">.hgignore</tt> in the root
+directory of a repository to control its behavior when it searches
+for files that it is not currently tracking.</p>
+</div>
+<div class="section" id="description">
+<h1>Description</h1>
+<p>The working directory of a Mercurial repository will often contain
+files that should not be tracked by Mercurial. These include backup
+files created by editors and build products created by compilers.
+These files can be ignored by listing them in a <tt class="docutils literal">.hgignore</tt> file in
+the root of the working directory. The <tt class="docutils literal">.hgignore</tt> file must be
+created manually. It is typically put under version control, so that
+the settings will propagate to other repositories with push and pull.</p>
+<p>An untracked file is ignored if its path relative to the repository
+root directory, or any prefix path of that path, is matched against
+any pattern in <tt class="docutils literal">.hgignore</tt>.</p>
+<p>For example, say we have an untracked file, <tt class="docutils literal">file.c</tt>, at
+<tt class="docutils literal">a/b/file.c</tt> inside our repository. Mercurial will ignore <tt class="docutils literal">file.c</tt>
+if any pattern in <tt class="docutils literal">.hgignore</tt> matches <tt class="docutils literal">a/b/file.c</tt>, <tt class="docutils literal">a/b</tt> or <tt class="docutils literal">a</tt>.</p>
+<p>In addition, a Mercurial configuration file can reference a set of
+per-user or global ignore files. See the <tt class="docutils literal">ignore</tt> configuration
+key on the <tt class="docutils literal">[ui]</tt> section of <a class="reference external" href="hg.1.html#config"><tt class="docutils literal">hg help config</tt></a> for details of how to
+configure these files.</p>
+<p>To control Mercurial's handling of files that it manages, many
+commands support the <tt class="docutils literal"><span class="pre">-I</span></tt> and <tt class="docutils literal"><span class="pre">-X</span></tt> options; see
+<a class="reference external" href="hg.1.html#&lt;command&gt;"><tt class="docutils literal">hg help &lt;command&gt;</tt></a> and <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a> for details.</p>
+<p>Files that are already tracked are not affected by .hgignore, even
+if they appear in .hgignore. An untracked file X can be explicitly
+added with <a class="reference external" href="hg.1.html#add"><tt class="docutils literal">hg add X</tt></a>, even if X would be excluded by a pattern
+in .hgignore.</p>
+</div>
+<div class="section" id="syntax">
+<h1>Syntax</h1>
+<p>An ignore file is a plain text file consisting of a list of patterns,
+with one pattern per line. Empty lines are skipped. The <tt class="docutils literal">#</tt>
+character is treated as a comment character, and the <tt class="docutils literal">\</tt> character
+is treated as an escape character.</p>
+<p>Mercurial supports several pattern syntaxes. The default syntax used
+is Python/Perl-style regular expressions.</p>
+<p>To change the syntax used, use a line of the following form:</p>
+<pre class="literal-block">
+syntax: NAME
+</pre>
+<p>where <tt class="docutils literal">NAME</tt> is one of the following:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">regexp</tt></dt>
+<dd>Regular expression, Python/Perl syntax.</dd>
+<dt><tt class="docutils literal">glob</tt></dt>
+<dd>Shell-style glob.</dd>
+</dl>
+<p>The chosen syntax stays in effect when parsing all patterns that
+follow, until another syntax is selected.</p>
+<p>Neither glob nor regexp patterns are rooted. A glob-syntax pattern of
+the form <tt class="docutils literal">*.c</tt> will match a file ending in <tt class="docutils literal">.c</tt> in any directory,
+and a regexp pattern of the form <tt class="docutils literal">\.c$</tt> will do the same. To root a
+regexp pattern, start it with <tt class="docutils literal">^</tt>.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Patterns specified in other than <tt class="docutils literal">.hgignore</tt> are always rooted.
+Please see <a class="reference external" href="hg.1.html#patterns"><tt class="docutils literal">hg help patterns</tt></a> for details.</p>
+</div>
+</div>
+<div class="section" id="example">
+<h1>Example</h1>
+<p>Here is an example ignore file.</p>
+<pre class="literal-block">
+# use glob syntax.
+syntax: glob
+
+*.elc
+*.pyc
+*~
+
+# switch to regexp syntax.
+syntax: regexp
+^\.pc/
+</pre>
+</div>
+<div class="section" id="author">
+<h1>Author</h1>
+<p>Vadim Gelfer &lt;<a class="reference external" href="mailto:vadim.gelfer&#64;gmail.com">vadim.gelfer&#64;gmail.com</a>&gt;</p>
+<p>Mercurial was written by Matt Mackall &lt;<a class="reference external" href="mailto:mpm&#64;selenic.com">mpm&#64;selenic.com</a>&gt;.</p>
+</div>
+<div class="section" id="see-also">
+<h1>See Also</h1>
+<p><a class="reference external" href="hg.1.html"><strong>hg</strong>(1)</a>, <a class="reference external" href="hgrc.5.html"><strong>hgrc</strong>(5)</a></p>
+</div>
+<div class="section" id="copying">
+<h1>Copying</h1>
+<p>This manual page is copyright 2006 Vadim Gelfer.
+Mercurial is copyright 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.</p>
+<!-- Common link and substitution definitions. -->
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/hgignore.5.txt b/doc/hgignore.5.txt
new file mode 100644
index 0000000..7e39f3e
--- /dev/null
+++ b/doc/hgignore.5.txt
@@ -0,0 +1,34 @@
+==========
+ hgignore
+==========
+
+---------------------------------
+syntax for Mercurial ignore files
+---------------------------------
+
+:Author: Vadim Gelfer <vadim.gelfer@gmail.com>
+:Organization: Mercurial
+:Manual section: 5
+:Manual group: Mercurial Manual
+
+.. include:: ../mercurial/help/hgignore.txt
+
+Author
+======
+Vadim Gelfer <vadim.gelfer@gmail.com>
+
+Mercurial was written by Matt Mackall <mpm@selenic.com>.
+
+See Also
+========
+|hg(1)|_, |hgrc(5)|_
+
+Copying
+=======
+This manual page is copyright 2006 Vadim Gelfer.
+Mercurial is copyright 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+
+.. include:: common.txt
+
diff --git a/doc/hgmanpage.py b/doc/hgmanpage.py
new file mode 100644
index 0000000..1d824b1
--- /dev/null
+++ b/doc/hgmanpage.py
@@ -0,0 +1,1110 @@
+# -*- coding: utf-8 -*-
+# $Id: manpage.py 6110 2009-08-31 14:40:33Z grubert $
+# Author: Engelbert Gruber <grubert@users.sourceforge.net>
+# Copyright: This module is put into the public domain.
+
+"""
+Simple man page writer for reStructuredText.
+
+Man pages (short for "manual pages") contain system documentation on unix-like
+systems. The pages are grouped in numbered sections:
+
+ 1 executable programs and shell commands
+ 2 system calls
+ 3 library functions
+ 4 special files
+ 5 file formats
+ 6 games
+ 7 miscellaneous
+ 8 system administration
+
+Man pages are written *troff*, a text file formatting system.
+
+See http://www.tldp.org/HOWTO/Man-Page for a start.
+
+Man pages have no subsection only parts.
+Standard parts
+
+ NAME ,
+ SYNOPSIS ,
+ DESCRIPTION ,
+ OPTIONS ,
+ FILES ,
+ SEE ALSO ,
+ BUGS ,
+
+and
+
+ AUTHOR .
+
+A unix-like system keeps an index of the DESCRIPTIONs, which is accesable
+by the command whatis or apropos.
+
+"""
+
+__docformat__ = 'reStructuredText'
+
+import re
+
+from docutils import nodes, writers, languages
+try:
+ import roman
+except ImportError:
+ from docutils.utils import roman
+import inspect
+
+FIELD_LIST_INDENT = 7
+DEFINITION_LIST_INDENT = 7
+OPTION_LIST_INDENT = 7
+BLOCKQOUTE_INDENT = 3.5
+
+# Define two macros so man/roff can calculate the
+# indent/unindent margins by itself
+MACRO_DEF = (r""".
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+""")
+
+class Writer(writers.Writer):
+
+ supported = ('manpage')
+ """Formats this writer supports."""
+
+ output = None
+ """Final translated form of `document`."""
+
+ def __init__(self):
+ writers.Writer.__init__(self)
+ self.translator_class = Translator
+
+ def translate(self):
+ visitor = self.translator_class(self.document)
+ self.document.walkabout(visitor)
+ self.output = visitor.astext()
+
+
+class Table(object):
+ def __init__(self):
+ self._rows = []
+ self._options = ['center']
+ self._tab_char = '\t'
+ self._coldefs = []
+ def new_row(self):
+ self._rows.append([])
+ def append_separator(self, separator):
+ """Append the separator for table head."""
+ self._rows.append([separator])
+ def append_cell(self, cell_lines):
+ """cell_lines is an array of lines"""
+ start = 0
+ if len(cell_lines) > 0 and cell_lines[0] == '.sp\n':
+ start = 1
+ self._rows[-1].append(cell_lines[start:])
+ if len(self._coldefs) < len(self._rows[-1]):
+ self._coldefs.append('l')
+ def _minimize_cell(self, cell_lines):
+ """Remove leading and trailing blank and ``.sp`` lines"""
+ while (cell_lines and cell_lines[0] in ('\n', '.sp\n')):
+ del cell_lines[0]
+ while (cell_lines and cell_lines[-1] in ('\n', '.sp\n')):
+ del cell_lines[-1]
+ def as_list(self):
+ text = ['.TS\n']
+ text.append(' '.join(self._options) + ';\n')
+ text.append('|%s|.\n' % ('|'.join(self._coldefs)))
+ for row in self._rows:
+ # row = array of cells. cell = array of lines.
+ text.append('_\n') # line above
+ text.append('T{\n')
+ for i in range(len(row)):
+ cell = row[i]
+ self._minimize_cell(cell)
+ text.extend(cell)
+ if not text[-1].endswith('\n'):
+ text[-1] += '\n'
+ if i < len(row)-1:
+ text.append('T}'+self._tab_char+'T{\n')
+ else:
+ text.append('T}\n')
+ text.append('_\n')
+ text.append('.TE\n')
+ return text
+
+class Translator(nodes.NodeVisitor):
+ """"""
+
+ words_and_spaces = re.compile(r'\S+| +|\n')
+ document_start = """Man page generated from reStructeredText."""
+
+ def __init__(self, document):
+ nodes.NodeVisitor.__init__(self, document)
+ self.settings = settings = document.settings
+ lcode = settings.language_code
+ arglen = len(inspect.getargspec(languages.get_language)[0])
+ if arglen == 2:
+ self.language = languages.get_language(lcode,
+ self.document.reporter)
+ else:
+ self.language = languages.get_language(lcode)
+ self.head = []
+ self.body = []
+ self.foot = []
+ self.section_level = 0
+ self.context = []
+ self.topic_class = ''
+ self.colspecs = []
+ self.compact_p = 1
+ self.compact_simple = None
+ # the list style "*" bullet or "#" numbered
+ self._list_char = []
+ # writing the header .TH and .SH NAME is postboned after
+ # docinfo.
+ self._docinfo = {
+ "title" : "", "title_upper": "",
+ "subtitle" : "",
+ "manual_section" : "", "manual_group" : "",
+ "author" : [],
+ "date" : "",
+ "copyright" : "",
+ "version" : "",
+ }
+ self._docinfo_keys = [] # a list to keep the sequence as in source.
+ self._docinfo_names = {} # to get name from text not normalized.
+ self._in_docinfo = None
+ self._active_table = None
+ self._in_literal = False
+ self.header_written = 0
+ self._line_block = 0
+ self.authors = []
+ self.section_level = 0
+ self._indent = [0]
+ # central definition of simple processing rules
+ # what to output on : visit, depart
+ # Do not use paragraph requests ``.PP`` because these set indentation.
+ # use ``.sp``. Remove superfluous ``.sp`` in ``astext``.
+ #
+ # Fonts are put on a stack, the top one is used.
+ # ``.ft P`` or ``\\fP`` pop from stack.
+ # ``B`` bold, ``I`` italic, ``R`` roman should be available.
+ # Hopefully ``C`` courier too.
+ self.defs = {
+ 'indent' : ('.INDENT %.1f\n', '.UNINDENT\n'),
+ 'definition_list_item' : ('.TP', ''),
+ 'field_name' : ('.TP\n.B ', '\n'),
+ 'literal' : ('\\fB', '\\fP'),
+ 'literal_block' : ('.sp\n.nf\n.ft C\n', '\n.ft P\n.fi\n'),
+
+ 'option_list_item' : ('.TP\n', ''),
+
+ 'reference' : (r'\%', r'\:'),
+ 'emphasis': ('\\fI', '\\fP'),
+ 'strong' : ('\\fB', '\\fP'),
+ 'term' : ('\n.B ', '\n'),
+ 'title_reference' : ('\\fI', '\\fP'),
+
+ 'topic-title' : ('.SS ',),
+ 'sidebar-title' : ('.SS ',),
+
+ 'problematic' : ('\n.nf\n', '\n.fi\n'),
+ }
+ # NOTE don't specify the newline before a dot-command, but ensure
+ # it is there.
+
+ def comment_begin(self, text):
+ """Return commented version of the passed text WITHOUT end of
+ line/comment."""
+ prefix = '.\\" '
+ out_text = ''.join(
+ [(prefix + in_line + '\n')
+ for in_line in text.split('\n')])
+ return out_text
+
+ def comment(self, text):
+ """Return commented version of the passed text."""
+ return self.comment_begin(text)+'.\n'
+
+ def ensure_eol(self):
+ """Ensure the last line in body is terminated by new line."""
+ if self.body[-1][-1] != '\n':
+ self.body.append('\n')
+
+ def astext(self):
+ """Return the final formatted document as a string."""
+ if not self.header_written:
+ # ensure we get a ".TH" as viewers require it.
+ self.head.append(self.header())
+ # filter body
+ for i in xrange(len(self.body)-1, 0, -1):
+ # remove superfluous vertical gaps.
+ if self.body[i] == '.sp\n':
+ if self.body[i - 1][:4] in ('.BI ','.IP '):
+ self.body[i] = '.\n'
+ elif (self.body[i - 1][:3] == '.B ' and
+ self.body[i - 2][:4] == '.TP\n'):
+ self.body[i] = '.\n'
+ elif (self.body[i - 1] == '\n' and
+ self.body[i - 2][0] != '.' and
+ (self.body[i - 3][:7] == '.TP\n.B '
+ or self.body[i - 3][:4] == '\n.B ')
+ ):
+ self.body[i] = '.\n'
+ return ''.join(self.head + self.body + self.foot)
+
+ def deunicode(self, text):
+ text = text.replace(u'\xa0', '\\ ')
+ text = text.replace(u'\u2020', '\\(dg')
+ return text
+
+ def visit_Text(self, node):
+ text = node.astext()
+ text = text.replace('\\','\\e')
+ replace_pairs = [
+ (u'-', ur'\-'),
+ (u'\'', ur'\(aq'),
+ (u'´', ur'\''),
+ (u'`', ur'\(ga'),
+ ]
+ for (in_char, out_markup) in replace_pairs:
+ text = text.replace(in_char, out_markup)
+ # unicode
+ text = self.deunicode(text)
+ if self._in_literal:
+ # prevent interpretation of "." at line start
+ if text[0] == '.':
+ text = '\\&' + text
+ text = text.replace('\n.', '\n\\&.')
+ self.body.append(text)
+
+ def depart_Text(self, node):
+ pass
+
+ def list_start(self, node):
+ class enum_char(object):
+ enum_style = {
+ 'bullet' : '\\(bu',
+ 'emdash' : '\\(em',
+ }
+
+ def __init__(self, style):
+ self._style = style
+ if 'start' in node:
+ self._cnt = node['start'] - 1
+ else:
+ self._cnt = 0
+ self._indent = 2
+ if style == 'arabic':
+ # indentation depends on number of childrens
+ # and start value.
+ self._indent = len(str(len(node.children)))
+ self._indent += len(str(self._cnt)) + 1
+ elif style == 'loweralpha':
+ self._cnt += ord('a') - 1
+ self._indent = 3
+ elif style == 'upperalpha':
+ self._cnt += ord('A') - 1
+ self._indent = 3
+ elif style.endswith('roman'):
+ self._indent = 5
+
+ def next(self):
+ if self._style == 'bullet':
+ return self.enum_style[self._style]
+ elif self._style == 'emdash':
+ return self.enum_style[self._style]
+ self._cnt += 1
+ # TODO add prefix postfix
+ if self._style == 'arabic':
+ return "%d." % self._cnt
+ elif self._style in ('loweralpha', 'upperalpha'):
+ return "%c." % self._cnt
+ elif self._style.endswith('roman'):
+ res = roman.toRoman(self._cnt) + '.'
+ if self._style.startswith('upper'):
+ return res.upper()
+ return res.lower()
+ else:
+ return "%d." % self._cnt
+ def get_width(self):
+ return self._indent
+ def __repr__(self):
+ return 'enum_style-%s' % list(self._style)
+
+ if 'enumtype' in node:
+ self._list_char.append(enum_char(node['enumtype']))
+ else:
+ self._list_char.append(enum_char('bullet'))
+ if len(self._list_char) > 1:
+ # indent nested lists
+ self.indent(self._list_char[-2].get_width())
+ else:
+ self.indent(self._list_char[-1].get_width())
+
+ def list_end(self):
+ self.dedent()
+ self._list_char.pop()
+
+ def header(self):
+ tmpl = (".TH %(title_upper)s %(manual_section)s"
+ " \"%(date)s\" \"%(version)s\" \"%(manual_group)s\"\n"
+ ".SH NAME\n"
+ "%(title)s \- %(subtitle)s\n")
+ return tmpl % self._docinfo
+
+ def append_header(self):
+ """append header with .TH and .SH NAME"""
+ # NOTE before everything
+ # .TH title_upper section date source manual
+ if self.header_written:
+ return
+ self.body.append(self.header())
+ self.body.append(MACRO_DEF)
+ self.header_written = 1
+
+ def visit_address(self, node):
+ self.visit_docinfo_item(node, 'address')
+
+ def depart_address(self, node):
+ pass
+
+ def visit_admonition(self, node, name=None):
+ if name:
+ self.body.append('.IP %s\n' %
+ self.language.labels.get(name, name))
+
+ def depart_admonition(self, node):
+ self.body.append('.RE\n')
+
+ def visit_attention(self, node):
+ self.visit_admonition(node, 'attention')
+
+ depart_attention = depart_admonition
+
+ def visit_docinfo_item(self, node, name):
+ if name == 'author':
+ self._docinfo[name].append(node.astext())
+ else:
+ self._docinfo[name] = node.astext()
+ self._docinfo_keys.append(name)
+ raise nodes.SkipNode
+
+ def depart_docinfo_item(self, node):
+ pass
+
+ def visit_author(self, node):
+ self.visit_docinfo_item(node, 'author')
+
+ depart_author = depart_docinfo_item
+
+ def visit_authors(self, node):
+ # _author is called anyway.
+ pass
+
+ def depart_authors(self, node):
+ pass
+
+ def visit_block_quote(self, node):
+ # BUG/HACK: indent alway uses the _last_ indention,
+ # thus we need two of them.
+ self.indent(BLOCKQOUTE_INDENT)
+ self.indent(0)
+
+ def depart_block_quote(self, node):
+ self.dedent()
+ self.dedent()
+
+ def visit_bullet_list(self, node):
+ self.list_start(node)
+
+ def depart_bullet_list(self, node):
+ self.list_end()
+
+ def visit_caption(self, node):
+ pass
+
+ def depart_caption(self, node):
+ pass
+
+ def visit_caution(self, node):
+ self.visit_admonition(node, 'caution')
+
+ depart_caution = depart_admonition
+
+ def visit_citation(self, node):
+ num, text = node.astext().split(None, 1)
+ num = num.strip()
+ self.body.append('.IP [%s] 5\n' % num)
+
+ def depart_citation(self, node):
+ pass
+
+ def visit_citation_reference(self, node):
+ self.body.append('['+node.astext()+']')
+ raise nodes.SkipNode
+
+ def visit_classifier(self, node):
+ pass
+
+ def depart_classifier(self, node):
+ pass
+
+ def visit_colspec(self, node):
+ self.colspecs.append(node)
+
+ def depart_colspec(self, node):
+ pass
+
+ def write_colspecs(self):
+ self.body.append("%s.\n" % ('L '*len(self.colspecs)))
+
+ def visit_comment(self, node,
+ sub=re.compile('-(?=-)').sub):
+ self.body.append(self.comment(node.astext()))
+ raise nodes.SkipNode
+
+ def visit_contact(self, node):
+ self.visit_docinfo_item(node, 'contact')
+
+ depart_contact = depart_docinfo_item
+
+ def visit_container(self, node):
+ pass
+
+ def depart_container(self, node):
+ pass
+
+ def visit_compound(self, node):
+ pass
+
+ def depart_compound(self, node):
+ pass
+
+ def visit_copyright(self, node):
+ self.visit_docinfo_item(node, 'copyright')
+
+ def visit_danger(self, node):
+ self.visit_admonition(node, 'danger')
+
+ depart_danger = depart_admonition
+
+ def visit_date(self, node):
+ self.visit_docinfo_item(node, 'date')
+
+ def visit_decoration(self, node):
+ pass
+
+ def depart_decoration(self, node):
+ pass
+
+ def visit_definition(self, node):
+ pass
+
+ def depart_definition(self, node):
+ pass
+
+ def visit_definition_list(self, node):
+ self.indent(DEFINITION_LIST_INDENT)
+
+ def depart_definition_list(self, node):
+ self.dedent()
+
+ def visit_definition_list_item(self, node):
+ self.body.append(self.defs['definition_list_item'][0])
+
+ def depart_definition_list_item(self, node):
+ self.body.append(self.defs['definition_list_item'][1])
+
+ def visit_description(self, node):
+ pass
+
+ def depart_description(self, node):
+ pass
+
+ def visit_docinfo(self, node):
+ self._in_docinfo = 1
+
+ def depart_docinfo(self, node):
+ self._in_docinfo = None
+ # NOTE nothing should be written before this
+ self.append_header()
+
+ def visit_doctest_block(self, node):
+ self.body.append(self.defs['literal_block'][0])
+ self._in_literal = True
+
+ def depart_doctest_block(self, node):
+ self._in_literal = False
+ self.body.append(self.defs['literal_block'][1])
+
+ def visit_document(self, node):
+ # no blank line between comment and header.
+ self.body.append(self.comment(self.document_start).rstrip()+'\n')
+ # writing header is postboned
+ self.header_written = 0
+
+ def depart_document(self, node):
+ if self._docinfo['author']:
+ self.body.append('.SH AUTHOR\n%s\n'
+ % ', '.join(self._docinfo['author']))
+ skip = ('author', 'copyright', 'date',
+ 'manual_group', 'manual_section',
+ 'subtitle',
+ 'title', 'title_upper', 'version')
+ for name in self._docinfo_keys:
+ if name == 'address':
+ self.body.append("\n%s:\n%s%s.nf\n%s\n.fi\n%s%s" % (
+ self.language.labels.get(name, name),
+ self.defs['indent'][0] % 0,
+ self.defs['indent'][0] % BLOCKQOUTE_INDENT,
+ self._docinfo[name],
+ self.defs['indent'][1],
+ self.defs['indent'][1]))
+ elif name not in skip:
+ if name in self._docinfo_names:
+ label = self._docinfo_names[name]
+ else:
+ label = self.language.labels.get(name, name)
+ self.body.append("\n%s: %s\n" % (label, self._docinfo[name]))
+ if self._docinfo['copyright']:
+ self.body.append('.SH COPYRIGHT\n%s\n'
+ % self._docinfo['copyright'])
+ self.body.append(self.comment(
+ 'Generated by docutils manpage writer.\n'))
+
+ def visit_emphasis(self, node):
+ self.body.append(self.defs['emphasis'][0])
+
+ def depart_emphasis(self, node):
+ self.body.append(self.defs['emphasis'][1])
+
+ def visit_entry(self, node):
+ # a cell in a table row
+ if 'morerows' in node:
+ self.document.reporter.warning('"table row spanning" not supported',
+ base_node=node)
+ if 'morecols' in node:
+ self.document.reporter.warning(
+ '"table cell spanning" not supported', base_node=node)
+ self.context.append(len(self.body))
+
+ def depart_entry(self, node):
+ start = self.context.pop()
+ self._active_table.append_cell(self.body[start:])
+ del self.body[start:]
+
+ def visit_enumerated_list(self, node):
+ self.list_start(node)
+
+ def depart_enumerated_list(self, node):
+ self.list_end()
+
+ def visit_error(self, node):
+ self.visit_admonition(node, 'error')
+
+ depart_error = depart_admonition
+
+ def visit_field(self, node):
+ pass
+
+ def depart_field(self, node):
+ pass
+
+ def visit_field_body(self, node):
+ if self._in_docinfo:
+ name_normalized = self._field_name.lower().replace(" ","_")
+ self._docinfo_names[name_normalized] = self._field_name
+ self.visit_docinfo_item(node, name_normalized)
+ raise nodes.SkipNode
+
+ def depart_field_body(self, node):
+ pass
+
+ def visit_field_list(self, node):
+ self.indent(FIELD_LIST_INDENT)
+
+ def depart_field_list(self, node):
+ self.dedent()
+
+ def visit_field_name(self, node):
+ if self._in_docinfo:
+ self._field_name = node.astext()
+ raise nodes.SkipNode
+ else:
+ self.body.append(self.defs['field_name'][0])
+
+ def depart_field_name(self, node):
+ self.body.append(self.defs['field_name'][1])
+
+ def visit_figure(self, node):
+ self.indent(2.5)
+ self.indent(0)
+
+ def depart_figure(self, node):
+ self.dedent()
+ self.dedent()
+
+ def visit_footer(self, node):
+ self.document.reporter.warning('"footer" not supported',
+ base_node=node)
+
+ def depart_footer(self, node):
+ pass
+
+ def visit_footnote(self, node):
+ num, text = node.astext().split(None, 1)
+ num = num.strip()
+ self.body.append('.IP [%s] 5\n' % self.deunicode(num))
+
+ def depart_footnote(self, node):
+ pass
+
+ def footnote_backrefs(self, node):
+ self.document.reporter.warning('"footnote_backrefs" not supported',
+ base_node=node)
+
+ def visit_footnote_reference(self, node):
+ self.body.append('['+self.deunicode(node.astext())+']')
+ raise nodes.SkipNode
+
+ def depart_footnote_reference(self, node):
+ pass
+
+ def visit_generated(self, node):
+ pass
+
+ def depart_generated(self, node):
+ pass
+
+ def visit_header(self, node):
+ raise NotImplementedError, node.astext()
+
+ def depart_header(self, node):
+ pass
+
+ def visit_hint(self, node):
+ self.visit_admonition(node, 'hint')
+
+ depart_hint = depart_admonition
+
+ def visit_subscript(self, node):
+ self.body.append('\\s-2\\d')
+
+ def depart_subscript(self, node):
+ self.body.append('\\u\\s0')
+
+ def visit_superscript(self, node):
+ self.body.append('\\s-2\\u')
+
+ def depart_superscript(self, node):
+ self.body.append('\\d\\s0')
+
+ def visit_attribution(self, node):
+ self.body.append('\\(em ')
+
+ def depart_attribution(self, node):
+ self.body.append('\n')
+
+ def visit_image(self, node):
+ self.document.reporter.warning('"image" not supported',
+ base_node=node)
+ text = []
+ if 'alt' in node.attributes:
+ text.append(node.attributes['alt'])
+ if 'uri' in node.attributes:
+ text.append(node.attributes['uri'])
+ self.body.append('[image: %s]\n' % ('/'.join(text)))
+ raise nodes.SkipNode
+
+ def visit_important(self, node):
+ self.visit_admonition(node, 'important')
+
+ depart_important = depart_admonition
+
+ def visit_label(self, node):
+ # footnote and citation
+ if (isinstance(node.parent, nodes.footnote)
+ or isinstance(node.parent, nodes.citation)):
+ raise nodes.SkipNode
+ self.document.reporter.warning('"unsupported "label"',
+ base_node=node)
+ self.body.append('[')
+
+ def depart_label(self, node):
+ self.body.append(']\n')
+
+ def visit_legend(self, node):
+ pass
+
+ def depart_legend(self, node):
+ pass
+
+ # WHAT should we use .INDENT, .UNINDENT ?
+ def visit_line_block(self, node):
+ self._line_block += 1
+ if self._line_block == 1:
+ self.body.append('.sp\n')
+ self.body.append('.nf\n')
+ else:
+ self.body.append('.in +2\n')
+
+ def depart_line_block(self, node):
+ self._line_block -= 1
+ if self._line_block == 0:
+ self.body.append('.fi\n')
+ self.body.append('.sp\n')
+ else:
+ self.body.append('.in -2\n')
+
+ def visit_line(self, node):
+ pass
+
+ def depart_line(self, node):
+ self.body.append('\n')
+
+ def visit_list_item(self, node):
+ # man 7 man argues to use ".IP" instead of ".TP"
+ self.body.append('.IP %s %d\n' % (
+ self._list_char[-1].next(),
+ self._list_char[-1].get_width(),))
+
+ def depart_list_item(self, node):
+ pass
+
+ def visit_literal(self, node):
+ self.body.append(self.defs['literal'][0])
+
+ def depart_literal(self, node):
+ self.body.append(self.defs['literal'][1])
+
+ def visit_literal_block(self, node):
+ self.body.append(self.defs['literal_block'][0])
+ self._in_literal = True
+
+ def depart_literal_block(self, node):
+ self._in_literal = False
+ self.body.append(self.defs['literal_block'][1])
+
+ def visit_meta(self, node):
+ raise NotImplementedError, node.astext()
+
+ def depart_meta(self, node):
+ pass
+
+ def visit_note(self, node):
+ self.visit_admonition(node, 'note')
+
+ depart_note = depart_admonition
+
+ def indent(self, by=0.5):
+ # if we are in a section ".SH" there already is a .RS
+ step = self._indent[-1]
+ self._indent.append(by)
+ self.body.append(self.defs['indent'][0] % step)
+
+ def dedent(self):
+ self._indent.pop()
+ self.body.append(self.defs['indent'][1])
+
+ def visit_option_list(self, node):
+ self.indent(OPTION_LIST_INDENT)
+
+ def depart_option_list(self, node):
+ self.dedent()
+
+ def visit_option_list_item(self, node):
+ # one item of the list
+ self.body.append(self.defs['option_list_item'][0])
+
+ def depart_option_list_item(self, node):
+ self.body.append(self.defs['option_list_item'][1])
+
+ def visit_option_group(self, node):
+ # as one option could have several forms it is a group
+ # options without parameter bold only, .B, -v
+ # options with parameter bold italic, .BI, -f file
+ #
+ # we do not know if .B or .BI
+ self.context.append('.B') # blind guess
+ self.context.append(len(self.body)) # to be able to insert later
+ self.context.append(0) # option counter
+
+ def depart_option_group(self, node):
+ self.context.pop() # the counter
+ start_position = self.context.pop()
+ text = self.body[start_position:]
+ del self.body[start_position:]
+ self.body.append('%s%s\n' % (self.context.pop(), ''.join(text)))
+
+ def visit_option(self, node):
+ # each form of the option will be presented separately
+ if self.context[-1] > 0:
+ self.body.append(', ')
+ if self.context[-3] == '.BI':
+ self.body.append('\\')
+ self.body.append(' ')
+
+ def depart_option(self, node):
+ self.context[-1] += 1
+
+ def visit_option_string(self, node):
+ # do not know if .B or .BI
+ pass
+
+ def depart_option_string(self, node):
+ pass
+
+ def visit_option_argument(self, node):
+ self.context[-3] = '.BI' # bold/italic alternate
+ if node['delimiter'] != ' ':
+ self.body.append('\\fB%s ' % node['delimiter'])
+ elif self.body[len(self.body)-1].endswith('='):
+ # a blank only means no blank in output, just changing font
+ self.body.append(' ')
+ else:
+ # blank backslash blank, switch font then a blank
+ self.body.append(' \\ ')
+
+ def depart_option_argument(self, node):
+ pass
+
+ def visit_organization(self, node):
+ self.visit_docinfo_item(node, 'organization')
+
+ def depart_organization(self, node):
+ pass
+
+ def visit_paragraph(self, node):
+ # ``.PP`` : Start standard indented paragraph.
+ # ``.LP`` : Start block paragraph, all except the first.
+ # ``.P [type]`` : Start paragraph type.
+ # NOTE dont use paragraph starts because they reset indentation.
+ # ``.sp`` is only vertical space
+ self.ensure_eol()
+ self.body.append('.sp\n')
+
+ def depart_paragraph(self, node):
+ self.body.append('\n')
+
+ def visit_problematic(self, node):
+ self.body.append(self.defs['problematic'][0])
+
+ def depart_problematic(self, node):
+ self.body.append(self.defs['problematic'][1])
+
+ def visit_raw(self, node):
+ if node.get('format') == 'manpage':
+ self.body.append(node.astext() + "\n")
+ # Keep non-manpage raw text out of output:
+ raise nodes.SkipNode
+
+ def visit_reference(self, node):
+ """E.g. link or email address."""
+ self.body.append(self.defs['reference'][0])
+
+ def depart_reference(self, node):
+ self.body.append(self.defs['reference'][1])
+
+ def visit_revision(self, node):
+ self.visit_docinfo_item(node, 'revision')
+
+ depart_revision = depart_docinfo_item
+
+ def visit_row(self, node):
+ self._active_table.new_row()
+
+ def depart_row(self, node):
+ pass
+
+ def visit_section(self, node):
+ self.section_level += 1
+
+ def depart_section(self, node):
+ self.section_level -= 1
+
+ def visit_status(self, node):
+ self.visit_docinfo_item(node, 'status')
+
+ depart_status = depart_docinfo_item
+
+ def visit_strong(self, node):
+ self.body.append(self.defs['strong'][0])
+
+ def depart_strong(self, node):
+ self.body.append(self.defs['strong'][1])
+
+ def visit_substitution_definition(self, node):
+ """Internal only."""
+ raise nodes.SkipNode
+
+ def visit_substitution_reference(self, node):
+ self.document.reporter.warning('"substitution_reference" not supported',
+ base_node=node)
+
+ def visit_subtitle(self, node):
+ if isinstance(node.parent, nodes.sidebar):
+ self.body.append(self.defs['strong'][0])
+ elif isinstance(node.parent, nodes.document):
+ self.visit_docinfo_item(node, 'subtitle')
+ elif isinstance(node.parent, nodes.section):
+ self.body.append(self.defs['strong'][0])
+
+ def depart_subtitle(self, node):
+ # document subtitle calls SkipNode
+ self.body.append(self.defs['strong'][1]+'\n.PP\n')
+
+ def visit_system_message(self, node):
+ # TODO add report_level
+ #if node['level'] < self.document.reporter['writer'].report_level:
+ # Level is too low to display:
+ # raise nodes.SkipNode
+ attr = {}
+ backref_text = ''
+ if node.hasattr('id'):
+ attr['name'] = node['id']
+ if node.hasattr('line'):
+ line = ', line %s' % node['line']
+ else:
+ line = ''
+ self.body.append('.IP "System Message: %s/%s (%s:%s)"\n'
+ % (node['type'], node['level'], node['source'], line))
+
+ def depart_system_message(self, node):
+ pass
+
+ def visit_table(self, node):
+ self._active_table = Table()
+
+ def depart_table(self, node):
+ self.ensure_eol()
+ self.body.extend(self._active_table.as_list())
+ self._active_table = None
+
+ def visit_target(self, node):
+ # targets are in-document hyper targets, without any use for man-pages.
+ raise nodes.SkipNode
+
+ def visit_tbody(self, node):
+ pass
+
+ def depart_tbody(self, node):
+ pass
+
+ def visit_term(self, node):
+ self.body.append(self.defs['term'][0])
+
+ def depart_term(self, node):
+ self.body.append(self.defs['term'][1])
+
+ def visit_tgroup(self, node):
+ pass
+
+ def depart_tgroup(self, node):
+ pass
+
+ def visit_thead(self, node):
+ # MAYBE double line '='
+ pass
+
+ def depart_thead(self, node):
+ # MAYBE double line '='
+ pass
+
+ def visit_tip(self, node):
+ self.visit_admonition(node, 'tip')
+
+ depart_tip = depart_admonition
+
+ def visit_title(self, node):
+ if isinstance(node.parent, nodes.topic):
+ self.body.append(self.defs['topic-title'][0])
+ elif isinstance(node.parent, nodes.sidebar):
+ self.body.append(self.defs['sidebar-title'][0])
+ elif isinstance(node.parent, nodes.admonition):
+ self.body.append('.IP "')
+ elif self.section_level == 0:
+ self._docinfo['title'] = node.astext()
+ # document title for .TH
+ self._docinfo['title_upper'] = node.astext().upper()
+ raise nodes.SkipNode
+ elif self.section_level == 1:
+ self.body.append('.SH ')
+ for n in node.traverse(nodes.Text):
+ n.parent.replace(n, nodes.Text(n.astext().upper()))
+ else:
+ self.body.append('.SS ')
+
+ def depart_title(self, node):
+ if isinstance(node.parent, nodes.admonition):
+ self.body.append('"')
+ self.body.append('\n')
+
+ def visit_title_reference(self, node):
+ """inline citation reference"""
+ self.body.append(self.defs['title_reference'][0])
+
+ def depart_title_reference(self, node):
+ self.body.append(self.defs['title_reference'][1])
+
+ def visit_topic(self, node):
+ pass
+
+ def depart_topic(self, node):
+ pass
+
+ def visit_sidebar(self, node):
+ pass
+
+ def depart_sidebar(self, node):
+ pass
+
+ def visit_rubric(self, node):
+ pass
+
+ def depart_rubric(self, node):
+ pass
+
+ def visit_transition(self, node):
+ # .PP Begin a new paragraph and reset prevailing indent.
+ # .sp N leaves N lines of blank space.
+ # .ce centers the next line
+ self.body.append('\n.sp\n.ce\n----\n')
+
+ def depart_transition(self, node):
+ self.body.append('\n.ce 0\n.sp\n')
+
+ def visit_version(self, node):
+ self.visit_docinfo_item(node, 'version')
+
+ def visit_warning(self, node):
+ self.visit_admonition(node, 'warning')
+
+ depart_warning = depart_admonition
+
+ def unimplemented_visit(self, node):
+ raise NotImplementedError('visiting unimplemented node type: %s'
+ % node.__class__.__name__)
+
+# vim: set fileencoding=utf-8 et ts=4 ai :
diff --git a/doc/hgrc.5 b/doc/hgrc.5
new file mode 100644
index 0000000..8d17bef
--- /dev/null
+++ b/doc/hgrc.5
@@ -0,0 +1,1793 @@
+.\" Man page generated from reStructeredText.
+.
+.TH HGRC 5 "" "" "Mercurial Manual"
+.SH NAME
+hgrc \- configuration files for Mercurial
+.
+.nr rst2man-indent-level 0
+.
+.de1 rstReportMargin
+\\$1 \\n[an-margin]
+level \\n[rst2man-indent-level]
+level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
+-
+\\n[rst2man-indent0]
+\\n[rst2man-indent1]
+\\n[rst2man-indent2]
+..
+.de1 INDENT
+.\" .rstReportMargin pre:
+. RS \\$1
+. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
+. nr rst2man-indent-level +1
+.\" .rstReportMargin post:
+..
+.de UNINDENT
+. RE
+.\" indent \\n[an-margin]
+.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.nr rst2man-indent-level -1
+.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
+.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
+..
+.SH SYNOPSIS
+.sp
+The Mercurial system uses a set of configuration files to control
+aspects of its behavior.
+.sp
+The configuration files use a simple ini\-file format. A configuration
+file consists of sections, led by a \fB[section]\fP header and followed
+by \fBname = value\fP entries:
+.sp
+.nf
+.ft C
+[ui]
+username = Firstname Lastname <firstname.lastname@example.net>
+verbose = True
+.ft P
+.fi
+.sp
+The above entries will be referred to as \fBui.username\fP and
+\fBui.verbose\fP, respectively. See the Syntax section below.
+.SH FILES
+.sp
+Mercurial reads configuration data from several files, if they exist.
+These files do not exist by default and you will have to create the
+appropriate configuration files yourself: global configuration like
+the username setting is typically put into
+\fB%USERPROFILE%\emercurial.ini\fP or \fB$HOME/.hgrc\fP and local
+configuration is put into the per\-repository \fB<repo>/.hg/hgrc\fP file.
+.sp
+The names of these files depend on the system on which Mercurial is
+installed. \fB*.rc\fP files from a single directory are read in
+alphabetical order, later ones overriding earlier ones. Where multiple
+paths are given below, settings from earlier paths override later
+ones.
+.sp
+.nf
+(All) \fB<repo>/.hg/hgrc\fP
+.fi
+.sp
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Per\-repository configuration options that only apply in a
+particular repository. This file is not version\-controlled, and
+will not get transferred during a "clone" operation. Options in
+this file override options in all other configuration files. On
+Plan 9 and Unix, most of this file will be ignored if it doesn\(aqt
+belong to a trusted user or to a trusted group. See the documentation
+for the \fB[trusted]\fP section below for more details.
+.UNINDENT
+.UNINDENT
+.sp
+.nf
+(Plan 9) \fB$home/lib/hgrc\fP
+(Unix) \fB$HOME/.hgrc\fP
+(Windows) \fB%USERPROFILE%\e.hgrc\fP
+(Windows) \fB%USERPROFILE%\eMercurial.ini\fP
+(Windows) \fB%HOME%\e.hgrc\fP
+(Windows) \fB%HOME%\eMercurial.ini\fP
+.fi
+.sp
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Per\-user configuration file(s), for the user running Mercurial. On
+Windows 9x, \fB%HOME%\fP is replaced by \fB%APPDATA%\fP. Options in these
+files apply to all Mercurial commands executed by this user in any
+directory. Options in these files override per\-system and per\-installation
+options.
+.UNINDENT
+.UNINDENT
+.sp
+.nf
+(Plan 9) \fB/lib/mercurial/hgrc\fP
+(Plan 9) \fB/lib/mercurial/hgrc.d/*.rc\fP
+(Unix) \fB/etc/mercurial/hgrc\fP
+(Unix) \fB/etc/mercurial/hgrc.d/*.rc\fP
+.fi
+.sp
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Per\-system configuration files, for the system on which Mercurial
+is running. Options in these files apply to all Mercurial commands
+executed by any user in any directory. Options in these files
+override per\-installation options.
+.UNINDENT
+.UNINDENT
+.sp
+.nf
+(Plan 9) \fB<install\-root>/lib/mercurial/hgrc\fP
+(Plan 9) \fB<install\-root>/lib/mercurial/hgrc.d/*.rc\fP
+(Unix) \fB<install\-root>/etc/mercurial/hgrc\fP
+(Unix) \fB<install\-root>/etc/mercurial/hgrc.d/*.rc\fP
+.fi
+.sp
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Per\-installation configuration files, searched for in the
+directory where Mercurial is installed. \fB<install\-root>\fP is the
+parent directory of the \fBhg\fP executable (or symlink) being run. For
+example, if installed in \fB/shared/tools/bin/hg\fP, Mercurial will look
+in \fB/shared/tools/etc/mercurial/hgrc\fP. Options in these files apply
+to all Mercurial commands executed by any user in any directory.
+.UNINDENT
+.UNINDENT
+.sp
+.nf
+(Windows) \fB<install\-dir>\eMercurial.ini\fP \fBor\fP
+(Windows) \fB<install\-dir>\ehgrc.d\e*.rc\fP \fBor\fP
+(Windows) \fBHKEY_LOCAL_MACHINE\eSOFTWARE\eMercurial\fP
+.fi
+.sp
+.INDENT 0.0
+.INDENT 3.5
+.sp
+Per\-installation/system configuration files, for the system on
+which Mercurial is running. Options in these files apply to all
+Mercurial commands executed by any user in any directory. Registry
+keys contain PATH\-like strings, every part of which must reference
+a \fBMercurial.ini\fP file or be a directory where \fB*.rc\fP files will
+be read. Mercurial checks each of these locations in the specified
+order until one or more configuration files are detected.
+.UNINDENT
+.UNINDENT
+.SH SYNTAX
+.sp
+A configuration file consists of sections, led by a \fB[section]\fP header
+and followed by \fBname = value\fP entries (sometimes called
+\fBconfiguration keys\fP):
+.sp
+.nf
+.ft C
+[spam]
+eggs=ham
+green=
+ eggs
+.ft P
+.fi
+.sp
+Each line contains one entry. If the lines that follow are indented,
+they are treated as continuations of that entry. Leading whitespace is
+removed from values. Empty lines are skipped. Lines beginning with
+\fB#\fP or \fB;\fP are ignored and may be used to provide comments.
+.sp
+Configuration keys can be set multiple times, in which case Mercurial
+will use the value that was configured last. As an example:
+.sp
+.nf
+.ft C
+[spam]
+eggs=large
+ham=serrano
+eggs=small
+.ft P
+.fi
+.sp
+This would set the configuration key named \fBeggs\fP to \fBsmall\fP.
+.sp
+It is also possible to define a section multiple times. A section can
+be redefined on the same and/or on different configuration files. For
+example:
+.sp
+.nf
+.ft C
+[foo]
+eggs=large
+ham=serrano
+eggs=small
+
+[bar]
+eggs=ham
+green=
+ eggs
+
+[foo]
+ham=prosciutto
+eggs=medium
+bread=toasted
+.ft P
+.fi
+.sp
+This would set the \fBeggs\fP, \fBham\fP, and \fBbread\fP configuration keys
+of the \fBfoo\fP section to \fBmedium\fP, \fBprosciutto\fP, and \fBtoasted\fP,
+respectively. As you can see there only thing that matters is the last
+value that was set for each of the configuration keys.
+.sp
+If a configuration key is set multiple times in different
+configuration files the final value will depend on the order in which
+the different configuration files are read, with settings from earlier
+paths overriding later ones as described on the \fBFiles\fP section
+above.
+.sp
+A line of the form \fB%include file\fP will include \fBfile\fP into the
+current configuration file. The inclusion is recursive, which means
+that included files can include other files. Filenames are relative to
+the configuration file in which the \fB%include\fP directive is found.
+Environment variables and \fB~user\fP constructs are expanded in
+\fBfile\fP. This lets you do something like:
+.sp
+.nf
+.ft C
+%include ~/.hgrc.d/$HOST.rc
+.ft P
+.fi
+.sp
+to include a different configuration file on each computer you use.
+.sp
+A line with \fB%unset name\fP will remove \fBname\fP from the current
+section, if it has been set previously.
+.sp
+The values are either free\-form text strings, lists of text strings,
+or Boolean values. Boolean values can be set to true using any of "1",
+"yes", "true", or "on" and to false using "0", "no", "false", or "off"
+(all case insensitive).
+.sp
+List values are separated by whitespace or comma, except when values are
+placed in double quotation marks:
+.sp
+.nf
+.ft C
+allow_read = "John Doe, PhD", brian, betty
+.ft P
+.fi
+.sp
+Quotation marks can be escaped by prefixing them with a backslash. Only
+quotation marks at the beginning of a word is counted as a quotation
+(e.g., \fBfoo"bar baz\fP is the list of \fBfoo"bar\fP and \fBbaz\fP).
+.SH SECTIONS
+.sp
+This section describes the different sections that may appear in a
+Mercurial configuration file, the purpose of each section, its possible
+keys, and their possible values.
+.SS \fBalias\fP
+.sp
+Defines command aliases.
+Aliases allow you to define your own commands in terms of other
+commands (or aliases), optionally including arguments. Positional
+arguments in the form of \fB$1\fP, \fB$2\fP, etc in the alias definition
+are expanded by Mercurial before execution. Positional arguments not
+already used by \fB$N\fP in the definition are put at the end of the
+command to be executed.
+.sp
+Alias definitions consist of lines of the form:
+.sp
+.nf
+.ft C
+<alias> = <command> [<argument>]...
+.ft P
+.fi
+.sp
+For example, this definition:
+.sp
+.nf
+.ft C
+latest = log \-\-limit 5
+.ft P
+.fi
+.sp
+creates a new command \fBlatest\fP that shows only the five most recent
+changesets. You can define subsequent aliases using earlier ones:
+.sp
+.nf
+.ft C
+stable5 = latest \-b stable
+.ft P
+.fi
+.IP Note
+.
+It is possible to create aliases with the same names as
+existing commands, which will then override the original
+definitions. This is almost always a bad idea!
+.RE
+.sp
+An alias can start with an exclamation point (\fB!\fP) to make it a
+shell alias. A shell alias is executed with the shell and will let you
+run arbitrary commands. As an example,
+.sp
+.nf
+.ft C
+echo = !echo $@
+.ft P
+.fi
+.sp
+will let you do \fBhg echo foo\fP to have \fBfoo\fP printed in your
+terminal. A better example might be:
+.sp
+.nf
+.ft C
+purge = !$HG status \-\-no\-status \-\-unknown \-0 | xargs \-0 rm
+.ft P
+.fi
+.sp
+which will make \fBhg purge\fP delete all unknown files in the
+repository in the same manner as the purge extension.
+.sp
+Positional arguments like \fB$1\fP, \fB$2\fP, etc. in the alias definition
+expand to the command arguments. Unmatched arguments are
+removed. \fB$0\fP expands to the alias name and \fB$@\fP expands to all
+arguments separated by a space. These expansions happen before the
+command is passed to the shell.
+.sp
+Shell aliases are executed in an environment where \fB$HG\fP expands to
+the path of the Mercurial that was used to execute the alias. This is
+useful when you want to call further Mercurial commands in a shell
+alias, as was done above for the purge alias. In addition,
+\fB$HG_ARGS\fP expands to the arguments given to Mercurial. In the \fBhg
+echo foo\fP call above, \fB$HG_ARGS\fP would expand to \fBecho foo\fP.
+.IP Note
+.
+Some global configuration options such as \fB\-R\fP are
+processed before shell aliases and will thus not be passed to
+aliases.
+.RE
+.SS \fBannotate\fP
+.sp
+Settings used when displaying file annotations. All values are
+Booleans and default to False. See \fBdiff\fP section for related
+options for the diff command.
+.INDENT 0.0
+.TP
+.B \fBignorews\fP
+.sp
+Ignore white space when comparing lines.
+.TP
+.B \fBignorewsamount\fP
+.sp
+Ignore changes in the amount of white space.
+.TP
+.B \fBignoreblanklines\fP
+.sp
+Ignore changes whose lines are all blank.
+.UNINDENT
+.SS \fBauth\fP
+.sp
+Authentication credentials for HTTP authentication. This section
+allows you to store usernames and passwords for use when logging
+\fIinto\fP HTTP servers. See the \fB[web]\fP configuration section if
+you want to configure \fIwho\fP can login to your HTTP server.
+.sp
+Each line has the following format:
+.sp
+.nf
+.ft C
+<name>.<argument> = <value>
+.ft P
+.fi
+.sp
+where \fB<name>\fP is used to group arguments into authentication
+entries. Example:
+.sp
+.nf
+.ft C
+foo.prefix = hg.intevation.org/mercurial
+foo.username = foo
+foo.password = bar
+foo.schemes = http https
+
+bar.prefix = secure.example.org
+bar.key = path/to/file.key
+bar.cert = path/to/file.cert
+bar.schemes = https
+.ft P
+.fi
+.sp
+Supported arguments:
+.INDENT 0.0
+.TP
+.B \fBprefix\fP
+.sp
+Either \fB*\fP or a URI prefix with or without the scheme part.
+The authentication entry with the longest matching prefix is used
+(where \fB*\fP matches everything and counts as a match of length
+1). If the prefix doesn\(aqt include a scheme, the match is performed
+against the URI with its scheme stripped as well, and the schemes
+argument, q.v., is then subsequently consulted.
+.TP
+.B \fBusername\fP
+.sp
+Optional. Username to authenticate with. If not given, and the
+remote site requires basic or digest authentication, the user will
+be prompted for it. Environment variables are expanded in the
+username letting you do \fBfoo.username = $USER\fP. If the URI
+includes a username, only \fB[auth]\fP entries with a matching
+username or without a username will be considered.
+.TP
+.B \fBpassword\fP
+.sp
+Optional. Password to authenticate with. If not given, and the
+remote site requires basic or digest authentication, the user
+will be prompted for it.
+.TP
+.B \fBkey\fP
+.sp
+Optional. PEM encoded client certificate key file. Environment
+variables are expanded in the filename.
+.TP
+.B \fBcert\fP
+.sp
+Optional. PEM encoded client certificate chain file. Environment
+variables are expanded in the filename.
+.TP
+.B \fBschemes\fP
+.sp
+Optional. Space separated list of URI schemes to use this
+authentication entry with. Only used if the prefix doesn\(aqt include
+a scheme. Supported schemes are http and https. They will match
+static\-http and static\-https respectively, as well.
+Default: https.
+.UNINDENT
+.sp
+If no suitable authentication entry is found, the user is prompted
+for credentials as usual if required by the remote.
+.SS \fBdecode/encode\fP
+.sp
+Filters for transforming files on checkout/checkin. This would
+typically be used for newline processing or other
+localization/canonicalization of files.
+.sp
+Filters consist of a filter pattern followed by a filter command.
+Filter patterns are globs by default, rooted at the repository root.
+For example, to match any file ending in \fB.txt\fP in the root
+directory only, use the pattern \fB*.txt\fP. To match any file ending
+in \fB.c\fP anywhere in the repository, use the pattern \fB**.c\fP.
+For each file only the first matching filter applies.
+.sp
+The filter command can start with a specifier, either \fBpipe:\fP or
+\fBtempfile:\fP. If no specifier is given, \fBpipe:\fP is used by default.
+.sp
+A \fBpipe:\fP command must accept data on stdin and return the transformed
+data on stdout.
+.sp
+Pipe example:
+.sp
+.nf
+.ft C
+[encode]
+# uncompress gzip files on checkin to improve delta compression
+# note: not necessarily a good idea, just an example
+*.gz = pipe: gunzip
+
+[decode]
+# recompress gzip files when writing them to the working dir (we
+# can safely omit "pipe:", because it\(aqs the default)
+*.gz = gzip
+.ft P
+.fi
+.sp
+A \fBtempfile:\fP command is a template. The string \fBINFILE\fP is replaced
+with the name of a temporary file that contains the data to be
+filtered by the command. The string \fBOUTFILE\fP is replaced with the name
+of an empty temporary file, where the filtered data must be written by
+the command.
+.IP Note
+.
+The tempfile mechanism is recommended for Windows systems,
+where the standard shell I/O redirection operators often have
+strange effects and may corrupt the contents of your files.
+.RE
+.sp
+This filter mechanism is used internally by the \fBeol\fP extension to
+translate line ending characters between Windows (CRLF) and Unix (LF)
+format. We suggest you use the \fBeol\fP extension for convenience.
+.SS \fBdefaults\fP
+.sp
+(defaults are deprecated. Don\(aqt use them. Use aliases instead)
+.sp
+Use the \fB[defaults]\fP section to define command defaults, i.e. the
+default options/arguments to pass to the specified commands.
+.sp
+The following example makes \%\fBhg log\fP\: run in verbose mode, and
+\%\fBhg status\fP\: show only the modified files, by default:
+.sp
+.nf
+.ft C
+[defaults]
+log = \-v
+status = \-m
+.ft P
+.fi
+.sp
+The actual commands, instead of their aliases, must be used when
+defining command defaults. The command defaults will also be applied
+to the aliases of the commands defined.
+.SS \fBdiff\fP
+.sp
+Settings used when displaying diffs. Everything except for \fBunified\fP
+is a Boolean and defaults to False. See \fBannotate\fP section for
+related options for the annotate command.
+.INDENT 0.0
+.TP
+.B \fBgit\fP
+.sp
+Use git extended diff format.
+.TP
+.B \fBnodates\fP
+.sp
+Don\(aqt include dates in diff headers.
+.TP
+.B \fBshowfunc\fP
+.sp
+Show which function each change is in.
+.TP
+.B \fBignorews\fP
+.sp
+Ignore white space when comparing lines.
+.TP
+.B \fBignorewsamount\fP
+.sp
+Ignore changes in the amount of white space.
+.TP
+.B \fBignoreblanklines\fP
+.sp
+Ignore changes whose lines are all blank.
+.TP
+.B \fBunified\fP
+.sp
+Number of lines of context to show.
+.UNINDENT
+.SS \fBemail\fP
+.sp
+Settings for extensions that send email messages.
+.INDENT 0.0
+.TP
+.B \fBfrom\fP
+.sp
+Optional. Email address to use in "From" header and SMTP envelope
+of outgoing messages.
+.TP
+.B \fBto\fP
+.sp
+Optional. Comma\-separated list of recipients\(aq email addresses.
+.TP
+.B \fBcc\fP
+.sp
+Optional. Comma\-separated list of carbon copy recipients\(aq
+email addresses.
+.TP
+.B \fBbcc\fP
+.sp
+Optional. Comma\-separated list of blind carbon copy recipients\(aq
+email addresses.
+.TP
+.B \fBmethod\fP
+.sp
+Optional. Method to use to send email messages. If value is \fBsmtp\fP
+(default), use SMTP (see the \fB[smtp]\fP section for configuration).
+Otherwise, use as name of program to run that acts like sendmail
+(takes \fB\-f\fP option for sender, list of recipients on command line,
+message on stdin). Normally, setting this to \fBsendmail\fP or
+\fB/usr/sbin/sendmail\fP is enough to use sendmail to send messages.
+.TP
+.B \fBcharsets\fP
+.sp
+Optional. Comma\-separated list of character sets considered
+convenient for recipients. Addresses, headers, and parts not
+containing patches of outgoing messages will be encoded in the
+first character set to which conversion from local encoding
+(\fB$HGENCODING\fP, \fBui.fallbackencoding\fP) succeeds. If correct
+conversion fails, the text in question is sent as is. Defaults to
+empty (explicit) list.
+.sp
+Order of outgoing email character sets:
+.INDENT 7.0
+.IP 1. 3
+.
+\fBus\-ascii\fP: always first, regardless of settings
+.IP 2. 3
+.
+\fBemail.charsets\fP: in order given by user
+.IP 3. 3
+.
+\fBui.fallbackencoding\fP: if not in email.charsets
+.IP 4. 3
+.
+\fB$HGENCODING\fP: if not in email.charsets
+.IP 5. 3
+.
+\fButf\-8\fP: always last, regardless of settings
+.UNINDENT
+.UNINDENT
+.sp
+Email example:
+.sp
+.nf
+.ft C
+[email]
+from = Joseph User <joe.user@example.com>
+method = /usr/sbin/sendmail
+# charsets for western Europeans
+# us\-ascii, utf\-8 omitted, as they are tried first and last
+charsets = iso\-8859\-1, iso\-8859\-15, windows\-1252
+.ft P
+.fi
+.SS \fBextensions\fP
+.sp
+Mercurial has an extension mechanism for adding new features. To
+enable an extension, create an entry for it in this section.
+.sp
+If you know that the extension is already in Python\(aqs search path,
+you can give the name of the module, followed by \fB=\fP, with nothing
+after the \fB=\fP.
+.sp
+Otherwise, give a name that you choose, followed by \fB=\fP, followed by
+the path to the \fB.py\fP file (including the file name extension) that
+defines the extension.
+.sp
+To explicitly disable an extension that is enabled in an hgrc of
+broader scope, prepend its path with \fB!\fP, as in \fBfoo = !/ext/path\fP
+or \fBfoo = !\fP when path is not supplied.
+.sp
+Example for \fB~/.hgrc\fP:
+.sp
+.nf
+.ft C
+[extensions]
+# (the mq extension will get loaded from Mercurial\(aqs path)
+mq =
+# (this extension will get loaded from the file specified)
+myfeature = ~/.hgext/myfeature.py
+.ft P
+.fi
+.SS \fBformat\fP
+.INDENT 0.0
+.TP
+.B \fBusestore\fP
+.sp
+Enable or disable the "store" repository format which improves
+compatibility with systems that fold case or otherwise mangle
+filenames. Enabled by default. Disabling this option will allow
+you to store longer filenames in some situations at the expense of
+compatibility and ensures that the on\-disk format of newly created
+repositories will be compatible with Mercurial before version 0.9.4.
+.TP
+.B \fBusefncache\fP
+.sp
+Enable or disable the "fncache" repository format which enhances
+the "store" repository format (which has to be enabled to use
+fncache) to allow longer filenames and avoids using Windows
+reserved names, e.g. "nul". Enabled by default. Disabling this
+option ensures that the on\-disk format of newly created
+repositories will be compatible with Mercurial before version 1.1.
+.TP
+.B \fBdotencode\fP
+.sp
+Enable or disable the "dotencode" repository format which enhances
+the "fncache" repository format (which has to be enabled to use
+dotencode) to avoid issues with filenames starting with ._ on
+Mac OS X and spaces on Windows. Enabled by default. Disabling this
+option ensures that the on\-disk format of newly created
+repositories will be compatible with Mercurial before version 1.7.
+.UNINDENT
+.SS \fBgraph\fP
+.sp
+Web graph view configuration. This section let you change graph
+elements display properties by branches, for instance to make the
+\fBdefault\fP branch stand out.
+.sp
+Each line has the following format:
+.sp
+.nf
+.ft C
+<branch>.<argument> = <value>
+.ft P
+.fi
+.sp
+where \fB<branch>\fP is the name of the branch being
+customized. Example:
+.sp
+.nf
+.ft C
+[graph]
+# 2px width
+default.width = 2
+# red color
+default.color = FF0000
+.ft P
+.fi
+.sp
+Supported arguments:
+.INDENT 0.0
+.TP
+.B \fBwidth\fP
+.sp
+Set branch edges width in pixels.
+.TP
+.B \fBcolor\fP
+.sp
+Set branch edges color in hexadecimal RGB notation.
+.UNINDENT
+.SS \fBhooks\fP
+.sp
+Commands or Python functions that get automatically executed by
+various actions such as starting or finishing a commit. Multiple
+hooks can be run for the same action by appending a suffix to the
+action. Overriding a site\-wide hook can be done by changing its
+value or setting it to an empty string. Hooks can be prioritized
+by adding a prefix of \fBpriority\fP to the hook name on a new line
+and setting the priority. The default priority is 0 if
+not specified.
+.sp
+Example \fB.hg/hgrc\fP:
+.sp
+.nf
+.ft C
+[hooks]
+# update working directory after adding changesets
+changegroup.update = hg update
+# do not use the site\-wide hook
+incoming =
+incoming.email = /my/email/hook
+incoming.autobuild = /my/build/hook
+# force autobuild hook to run before other incoming hooks
+priority.incoming.autobuild = 1
+.ft P
+.fi
+.sp
+Most hooks are run with environment variables set that give useful
+additional information. For each hook below, the environment
+variables it is passed are listed with names of the form \fB$HG_foo\fP.
+.INDENT 0.0
+.TP
+.B \fBchangegroup\fP
+.sp
+Run after a changegroup has been added via push, pull or unbundle.
+ID of the first new changeset is in \fB$HG_NODE\fP. URL from which
+changes came is in \fB$HG_URL\fP.
+.TP
+.B \fBcommit\fP
+.sp
+Run after a changeset has been created in the local repository. ID
+of the newly created changeset is in \fB$HG_NODE\fP. Parent changeset
+IDs are in \fB$HG_PARENT1\fP and \fB$HG_PARENT2\fP.
+.TP
+.B \fBincoming\fP
+.sp
+Run after a changeset has been pulled, pushed, or unbundled into
+the local repository. The ID of the newly arrived changeset is in
+\fB$HG_NODE\fP. URL that was source of changes came is in \fB$HG_URL\fP.
+.TP
+.B \fBoutgoing\fP
+.sp
+Run after sending changes from local repository to another. ID of
+first changeset sent is in \fB$HG_NODE\fP. Source of operation is in
+\fB$HG_SOURCE\fP; see "preoutgoing" hook for description.
+.TP
+.B \fBpost\-<command>\fP
+.sp
+Run after successful invocations of the associated command. The
+contents of the command line are passed as \fB$HG_ARGS\fP and the result
+code in \fB$HG_RESULT\fP. Parsed command line arguments are passed as
+\fB$HG_PATS\fP and \fB$HG_OPTS\fP. These contain string representations of
+the python data internally passed to <command>. \fB$HG_OPTS\fP is a
+dictionary of options (with unspecified options set to their defaults).
+\fB$HG_PATS\fP is a list of arguments. Hook failure is ignored.
+.TP
+.B \fBpre\-<command>\fP
+.sp
+Run before executing the associated command. The contents of the
+command line are passed as \fB$HG_ARGS\fP. Parsed command line arguments
+are passed as \fB$HG_PATS\fP and \fB$HG_OPTS\fP. These contain string
+representations of the data internally passed to <command>. \fB$HG_OPTS\fP
+is a dictionary of options (with unspecified options set to their
+defaults). \fB$HG_PATS\fP is a list of arguments. If the hook returns
+failure, the command doesn\(aqt execute and Mercurial returns the failure
+code.
+.TP
+.B \fBprechangegroup\fP
+.sp
+Run before a changegroup is added via push, pull or unbundle. Exit
+status 0 allows the changegroup to proceed. Non\-zero status will
+cause the push, pull or unbundle to fail. URL from which changes
+will come is in \fB$HG_URL\fP.
+.TP
+.B \fBprecommit\fP
+.sp
+Run before starting a local commit. Exit status 0 allows the
+commit to proceed. Non\-zero status will cause the commit to fail.
+Parent changeset IDs are in \fB$HG_PARENT1\fP and \fB$HG_PARENT2\fP.
+.TP
+.B \fBprelistkeys\fP
+.sp
+Run before listing pushkeys (like bookmarks) in the
+repository. Non\-zero status will cause failure. The key namespace is
+in \fB$HG_NAMESPACE\fP.
+.TP
+.B \fBpreoutgoing\fP
+.sp
+Run before collecting changes to send from the local repository to
+another. Non\-zero status will cause failure. This lets you prevent
+pull over HTTP or SSH. Also prevents against local pull, push
+(outbound) or bundle commands, but not effective, since you can
+just copy files instead then. Source of operation is in
+\fB$HG_SOURCE\fP. If "serve", operation is happening on behalf of remote
+SSH or HTTP repository. If "push", "pull" or "bundle", operation
+is happening on behalf of repository on same system.
+.TP
+.B \fBprepushkey\fP
+.sp
+Run before a pushkey (like a bookmark) is added to the
+repository. Non\-zero status will cause the key to be rejected. The
+key namespace is in \fB$HG_NAMESPACE\fP, the key is in \fB$HG_KEY\fP,
+the old value (if any) is in \fB$HG_OLD\fP, and the new value is in
+\fB$HG_NEW\fP.
+.TP
+.B \fBpretag\fP
+.sp
+Run before creating a tag. Exit status 0 allows the tag to be
+created. Non\-zero status will cause the tag to fail. ID of
+changeset to tag is in \fB$HG_NODE\fP. Name of tag is in \fB$HG_TAG\fP. Tag is
+local if \fB$HG_LOCAL=1\fP, in repository if \fB$HG_LOCAL=0\fP.
+.TP
+.B \fBpretxnchangegroup\fP
+.sp
+Run after a changegroup has been added via push, pull or unbundle,
+but before the transaction has been committed. Changegroup is
+visible to hook program. This lets you validate incoming changes
+before accepting them. Passed the ID of the first new changeset in
+\fB$HG_NODE\fP. Exit status 0 allows the transaction to commit. Non\-zero
+status will cause the transaction to be rolled back and the push,
+pull or unbundle will fail. URL that was source of changes is in
+\fB$HG_URL\fP.
+.TP
+.B \fBpretxncommit\fP
+.sp
+Run after a changeset has been created but the transaction not yet
+committed. Changeset is visible to hook program. This lets you
+validate commit message and changes. Exit status 0 allows the
+commit to proceed. Non\-zero status will cause the transaction to
+be rolled back. ID of changeset is in \fB$HG_NODE\fP. Parent changeset
+IDs are in \fB$HG_PARENT1\fP and \fB$HG_PARENT2\fP.
+.TP
+.B \fBpreupdate\fP
+.sp
+Run before updating the working directory. Exit status 0 allows
+the update to proceed. Non\-zero status will prevent the update.
+Changeset ID of first new parent is in \fB$HG_PARENT1\fP. If merge, ID
+of second new parent is in \fB$HG_PARENT2\fP.
+.TP
+.B \fBlistkeys\fP
+.sp
+Run after listing pushkeys (like bookmarks) in the repository. The
+key namespace is in \fB$HG_NAMESPACE\fP. \fB$HG_VALUES\fP is a
+dictionary containing the keys and values.
+.TP
+.B \fBpushkey\fP
+.sp
+Run after a pushkey (like a bookmark) is added to the
+repository. The key namespace is in \fB$HG_NAMESPACE\fP, the key is in
+\fB$HG_KEY\fP, the old value (if any) is in \fB$HG_OLD\fP, and the new
+value is in \fB$HG_NEW\fP.
+.TP
+.B \fBtag\fP
+.sp
+Run after a tag is created. ID of tagged changeset is in \fB$HG_NODE\fP.
+Name of tag is in \fB$HG_TAG\fP. Tag is local if \fB$HG_LOCAL=1\fP, in
+repository if \fB$HG_LOCAL=0\fP.
+.TP
+.B \fBupdate\fP
+.sp
+Run after updating the working directory. Changeset ID of first
+new parent is in \fB$HG_PARENT1\fP. If merge, ID of second new parent is
+in \fB$HG_PARENT2\fP. If the update succeeded, \fB$HG_ERROR=0\fP. If the
+update failed (e.g. because conflicts not resolved), \fB$HG_ERROR=1\fP.
+.UNINDENT
+.IP Note
+.
+It is generally better to use standard hooks rather than the
+generic pre\- and post\- command hooks as they are guaranteed to be
+called in the appropriate contexts for influencing transactions.
+Also, hooks like "commit" will be called in all contexts that
+generate a commit (e.g. tag) and not just the commit command.
+.RE
+.IP Note
+.
+Environment variables with empty values may not be passed to
+hooks on platforms such as Windows. As an example, \fB$HG_PARENT2\fP
+will have an empty value under Unix\-like platforms for non\-merge
+changesets, while it will not be available at all under Windows.
+.RE
+.sp
+The syntax for Python hooks is as follows:
+.sp
+.nf
+.ft C
+hookname = python:modulename.submodule.callable
+hookname = python:/path/to/python/module.py:callable
+.ft P
+.fi
+.sp
+Python hooks are run within the Mercurial process. Each hook is
+called with at least three keyword arguments: a ui object (keyword
+\fBui\fP), a repository object (keyword \fBrepo\fP), and a \fBhooktype\fP
+keyword that tells what kind of hook is used. Arguments listed as
+environment variables above are passed as keyword arguments, with no
+\fBHG_\fP prefix, and names in lower case.
+.sp
+If a Python hook returns a "true" value or raises an exception, this
+is treated as a failure.
+.SS \fBhostfingerprints\fP
+.sp
+Fingerprints of the certificates of known HTTPS servers.
+A HTTPS connection to a server with a fingerprint configured here will
+only succeed if the servers certificate matches the fingerprint.
+This is very similar to how ssh known hosts works.
+The fingerprint is the SHA\-1 hash value of the DER encoded certificate.
+The CA chain and web.cacerts is not used for servers with a fingerprint.
+.sp
+For example:
+.sp
+.nf
+.ft C
+[hostfingerprints]
+hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc
+.ft P
+.fi
+.sp
+This feature is only supported when using Python 2.6 or later.
+.SS \fBhttp_proxy\fP
+.sp
+Used to access web\-based Mercurial repositories through a HTTP
+proxy.
+.INDENT 0.0
+.TP
+.B \fBhost\fP
+.sp
+Host name and (optional) port of the proxy server, for example
+"myproxy:8000".
+.TP
+.B \fBno\fP
+.sp
+Optional. Comma\-separated list of host names that should bypass
+the proxy.
+.TP
+.B \fBpasswd\fP
+.sp
+Optional. Password to authenticate with at the proxy server.
+.TP
+.B \fBuser\fP
+.sp
+Optional. User name to authenticate with at the proxy server.
+.TP
+.B \fBalways\fP
+.sp
+Optional. Always use the proxy, even for localhost and any entries
+in \fBhttp_proxy.no\fP. True or False. Default: False.
+.UNINDENT
+.SS \fBmerge\-patterns\fP
+.sp
+This section specifies merge tools to associate with particular file
+patterns. Tools matched here will take precedence over the default
+merge tool. Patterns are globs by default, rooted at the repository
+root.
+.sp
+Example:
+.sp
+.nf
+.ft C
+[merge\-patterns]
+**.c = kdiff3
+**.jpg = myimgmerge
+.ft P
+.fi
+.SS \fBmerge\-tools\fP
+.sp
+This section configures external merge tools to use for file\-level
+merges.
+.sp
+Example \fB~/.hgrc\fP:
+.sp
+.nf
+.ft C
+[merge\-tools]
+# Override stock tool location
+kdiff3.executable = ~/bin/kdiff3
+# Specify command line
+kdiff3.args = $base $local $other \-o $output
+# Give higher priority
+kdiff3.priority = 1
+
+# Define new tool
+myHtmlTool.args = \-m $local $other $base $output
+myHtmlTool.regkey = Software\eFooSoftware\eHtmlMerge
+myHtmlTool.priority = 1
+.ft P
+.fi
+.sp
+Supported arguments:
+.INDENT 0.0
+.TP
+.B \fBpriority\fP
+.sp
+The priority in which to evaluate this tool.
+Default: 0.
+.TP
+.B \fBexecutable\fP
+.sp
+Either just the name of the executable or its pathname. On Windows,
+the path can use environment variables with ${ProgramFiles} syntax.
+Default: the tool name.
+.TP
+.B \fBargs\fP
+.sp
+The arguments to pass to the tool executable. You can refer to the
+files being merged as well as the output file through these
+variables: \fB$base\fP, \fB$local\fP, \fB$other\fP, \fB$output\fP.
+Default: \fB$local $base $other\fP
+.TP
+.B \fBpremerge\fP
+.sp
+Attempt to run internal non\-interactive 3\-way merge tool before
+launching external tool. Options are \fBtrue\fP, \fBfalse\fP, or \fBkeep\fP
+to leave markers in the file if the premerge fails.
+Default: True
+.TP
+.B \fBbinary\fP
+.sp
+This tool can merge binary files. Defaults to False, unless tool
+was selected by file pattern match.
+.TP
+.B \fBsymlink\fP
+.sp
+This tool can merge symlinks. Defaults to False, even if tool was
+selected by file pattern match.
+.TP
+.B \fBcheck\fP
+.sp
+A list of merge success\-checking options:
+.INDENT 7.0
+.TP
+.B \fBchanged\fP
+.sp
+Ask whether merge was successful when the merged file shows no changes.
+.TP
+.B \fBconflicts\fP
+.sp
+Check whether there are conflicts even though the tool reported success.
+.TP
+.B \fBprompt\fP
+.sp
+Always prompt for merge success, regardless of success reported by tool.
+.UNINDENT
+.TP
+.B \fBcheckchanged\fP
+.sp
+True is equivalent to \fBcheck = changed\fP.
+Default: False
+.TP
+.B \fBcheckconflicts\fP
+.sp
+True is equivalent to \fBcheck = conflicts\fP.
+Default: False
+.TP
+.B \fBfixeol\fP
+.sp
+Attempt to fix up EOL changes caused by the merge tool.
+Default: False
+.TP
+.B \fBgui\fP
+.sp
+This tool requires a graphical interface to run. Default: False
+.TP
+.B \fBregkey\fP
+.sp
+Windows registry key which describes install location of this
+tool. Mercurial will search for this key first under
+\fBHKEY_CURRENT_USER\fP and then under \fBHKEY_LOCAL_MACHINE\fP.
+Default: None
+.TP
+.B \fBregkeyalt\fP
+.sp
+An alternate Windows registry key to try if the first key is not
+found. The alternate key uses the same \fBregname\fP and \fBregappend\fP
+semantics of the primary key. The most common use for this key
+is to search for 32bit applications on 64bit operating systems.
+Default: None
+.TP
+.B \fBregname\fP
+.sp
+Name of value to read from specified registry key. Defaults to the
+unnamed (default) value.
+.TP
+.B \fBregappend\fP
+.sp
+String to append to the value read from the registry, typically
+the executable name of the tool.
+Default: None
+.UNINDENT
+.SS \fBpatch\fP
+.sp
+Settings used when applying patches, for instance through the \(aqimport\(aq
+command or with Mercurial Queues extension.
+.INDENT 0.0
+.TP
+.B \fBeol\fP
+.sp
+When set to \(aqstrict\(aq patch content and patched files end of lines
+are preserved. When set to \fBlf\fP or \fBcrlf\fP, both files end of
+lines are ignored when patching and the result line endings are
+normalized to either LF (Unix) or CRLF (Windows). When set to
+\fBauto\fP, end of lines are again ignored while patching but line
+endings in patched files are normalized to their original setting
+on a per\-file basis. If target file does not exist or has no end
+of line, patch line endings are preserved.
+Default: strict.
+.UNINDENT
+.SS \fBpaths\fP
+.sp
+Assigns symbolic names to repositories. The left side is the
+symbolic name, and the right gives the directory or URL that is the
+location of the repository. Default paths can be declared by setting
+the following entries.
+.INDENT 0.0
+.TP
+.B \fBdefault\fP
+.sp
+Directory or URL to use when pulling if no source is specified.
+Default is set to repository from which the current repository was
+cloned.
+.TP
+.B \fBdefault\-push\fP
+.sp
+Optional. Directory or URL to use when pushing if no destination
+is specified.
+.UNINDENT
+.SS \fBphases\fP
+.sp
+Specifies default handling of phases. See \%\fBhg help phases\fP\: for more
+information about working with phases.
+.INDENT 0.0
+.TP
+.B \fBpublish\fP
+.sp
+Controls draft phase behavior when working as a server. When true,
+pushed changesets are set to public in both client and server and
+pulled or cloned changesets are set to public in the client.
+Default: True
+.TP
+.B \fBnew\-commit\fP
+.sp
+Phase of newly\-created commits.
+Default: draft
+.UNINDENT
+.SS \fBprofiling\fP
+.sp
+Specifies profiling type, format, and file output. Two profilers are
+supported: an instrumenting profiler (named \fBls\fP), and a sampling
+profiler (named \fBstat\fP).
+.sp
+In this section description, \(aqprofiling data\(aq stands for the raw data
+collected during profiling, while \(aqprofiling report\(aq stands for a
+statistical text report generated from the profiling data. The
+profiling is done using lsprof.
+.INDENT 0.0
+.TP
+.B \fBtype\fP
+.sp
+The type of profiler to use.
+Default: ls.
+.INDENT 7.0
+.TP
+.B \fBls\fP
+.sp
+Use Python\(aqs built\-in instrumenting profiler. This profiler
+works on all platforms, but each line number it reports is the
+first line of a function. This restriction makes it difficult to
+identify the expensive parts of a non\-trivial function.
+.TP
+.B \fBstat\fP
+.sp
+Use a third\-party statistical profiler, statprof. This profiler
+currently runs only on Unix systems, and is most useful for
+profiling commands that run for longer than about 0.1 seconds.
+.UNINDENT
+.TP
+.B \fBformat\fP
+.sp
+Profiling format. Specific to the \fBls\fP instrumenting profiler.
+Default: text.
+.INDENT 7.0
+.TP
+.B \fBtext\fP
+.sp
+Generate a profiling report. When saving to a file, it should be
+noted that only the report is saved, and the profiling data is
+not kept.
+.TP
+.B \fBkcachegrind\fP
+.sp
+Format profiling data for kcachegrind use: when saving to a
+file, the generated file can directly be loaded into
+kcachegrind.
+.UNINDENT
+.TP
+.B \fBfrequency\fP
+.sp
+Sampling frequency. Specific to the \fBstat\fP sampling profiler.
+Default: 1000.
+.TP
+.B \fBoutput\fP
+.sp
+File path where profiling data or report should be saved. If the
+file exists, it is replaced. Default: None, data is printed on
+stderr
+.UNINDENT
+.SS \fBrevsetalias\fP
+.sp
+Alias definitions for revsets. See \%\fBhg help revsets\fP\: for details.
+.SS \fBserver\fP
+.sp
+Controls generic server settings.
+.INDENT 0.0
+.TP
+.B \fBuncompressed\fP
+.sp
+Whether to allow clients to clone a repository using the
+uncompressed streaming protocol. This transfers about 40% more
+data than a regular clone, but uses less memory and CPU on both
+server and client. Over a LAN (100 Mbps or better) or a very fast
+WAN, an uncompressed streaming clone is a lot faster (~10x) than a
+regular clone. Over most WAN connections (anything slower than
+about 6 Mbps), uncompressed streaming is slower, because of the
+extra data transfer overhead. This mode will also temporarily hold
+the write lock while determining what data to transfer.
+Default is True.
+.TP
+.B \fBpreferuncompressed\fP
+.sp
+When set, clients will try to use the uncompressed streaming
+protocol. Default is False.
+.TP
+.B \fBvalidate\fP
+.sp
+Whether to validate the completeness of pushed changesets by
+checking that all new file revisions specified in manifests are
+present. Default is False.
+.UNINDENT
+.SS \fBsmtp\fP
+.sp
+Configuration for extensions that need to send email messages.
+.INDENT 0.0
+.TP
+.B \fBhost\fP
+.sp
+Host name of mail server, e.g. "mail.example.com".
+.TP
+.B \fBport\fP
+.sp
+Optional. Port to connect to on mail server. Default: 25.
+.TP
+.B \fBtls\fP
+.sp
+Optional. Method to enable TLS when connecting to mail server: starttls,
+smtps or none. Default: none.
+.TP
+.B \fBusername\fP
+.sp
+Optional. User name for authenticating with the SMTP server.
+Default: none.
+.TP
+.B \fBpassword\fP
+.sp
+Optional. Password for authenticating with the SMTP server. If not
+specified, interactive sessions will prompt the user for a
+password; non\-interactive sessions will fail. Default: none.
+.TP
+.B \fBlocal_hostname\fP
+.sp
+Optional. It\(aqs the hostname that the sender can use to identify
+itself to the MTA.
+.UNINDENT
+.SS \fBsubpaths\fP
+.sp
+Subrepository source URLs can go stale if a remote server changes name
+or becomes temporarily unavailable. This section lets you define
+rewrite rules of the form:
+.sp
+.nf
+.ft C
+<pattern> = <replacement>
+.ft P
+.fi
+.sp
+where \fBpattern\fP is a regular expression matching a subrepository
+source URL and \fBreplacement\fP is the replacement string used to
+rewrite it. Groups can be matched in \fBpattern\fP and referenced in
+\fBreplacements\fP. For instance:
+.sp
+.nf
+.ft C
+http://server/(.*)\-hg/ = http://hg.server/\e1/
+.ft P
+.fi
+.sp
+rewrites \fBhttp://server/foo\-hg/\fP into \fBhttp://hg.server/foo/\fP.
+.sp
+Relative subrepository paths are first made absolute, and the
+rewrite rules are then applied on the full (absolute) path. The rules
+are applied in definition order.
+.SS \fBtrusted\fP
+.sp
+Mercurial will not use the settings in the
+\fB.hg/hgrc\fP file from a repository if it doesn\(aqt belong to a trusted
+user or to a trusted group, as various hgrc features allow arbitrary
+commands to be run. This issue is often encountered when configuring
+hooks or extensions for shared repositories or servers. However,
+the web interface will use some safe settings from the \fB[web]\fP
+section.
+.sp
+This section specifies what users and groups are trusted. The
+current user is always trusted. To trust everybody, list a user or a
+group with name \fB*\fP. These settings must be placed in an
+\fIalready\-trusted file\fP to take effect, such as \fB$HOME/.hgrc\fP of the
+user or service running Mercurial.
+.INDENT 0.0
+.TP
+.B \fBusers\fP
+.sp
+Comma\-separated list of trusted users.
+.TP
+.B \fBgroups\fP
+.sp
+Comma\-separated list of trusted groups.
+.UNINDENT
+.SS \fBui\fP
+.sp
+User interface controls.
+.INDENT 0.0
+.TP
+.B \fBarchivemeta\fP
+.sp
+Whether to include the .hg_archival.txt file containing meta data
+(hashes for the repository base and for tip) in archives created
+by the \%\fBhg archive\fP\: command or downloaded via hgweb.
+Default is True.
+.TP
+.B \fBaskusername\fP
+.sp
+Whether to prompt for a username when committing. If True, and
+neither \fB$HGUSER\fP nor \fB$EMAIL\fP has been specified, then the user will
+be prompted to enter a username. If no username is entered, the
+default \fBUSER@HOST\fP is used instead.
+Default is False.
+.TP
+.B \fBcommitsubrepos\fP
+.sp
+Whether to commit modified subrepositories when committing the
+parent repository. If False and one subrepository has uncommitted
+changes, abort the commit.
+Default is False.
+.TP
+.B \fBdebug\fP
+.sp
+Print debugging information. True or False. Default is False.
+.TP
+.B \fBeditor\fP
+.sp
+The editor to use during a commit. Default is \fB$EDITOR\fP or \fBvi\fP.
+.TP
+.B \fBfallbackencoding\fP
+.sp
+Encoding to try if it\(aqs not possible to decode the changelog using
+UTF\-8. Default is ISO\-8859\-1.
+.TP
+.B \fBignore\fP
+.sp
+A file to read per\-user ignore patterns from. This file should be
+in the same format as a repository\-wide .hgignore file. This
+option supports hook syntax, so if you want to specify multiple
+ignore files, you can do so by setting something like
+\fBignore.other = ~/.hgignore2\fP. For details of the ignore file
+format, see the \fBhgignore(5)\fP man page.
+.TP
+.B \fBinteractive\fP
+.sp
+Allow to prompt the user. True or False. Default is True.
+.TP
+.B \fBlogtemplate\fP
+.sp
+Template string for commands that print changesets.
+.TP
+.B \fBmerge\fP
+.sp
+The conflict resolution program to use during a manual merge.
+For more information on merge tools see \%\fBhg help merge\-tools\fP\:.
+For configuring merge tools see the \fB[merge\-tools]\fP section.
+.TP
+.B \fBportablefilenames\fP
+.sp
+Check for portable filenames. Can be \fBwarn\fP, \fBignore\fP or \fBabort\fP.
+Default is \fBwarn\fP.
+If set to \fBwarn\fP (or \fBtrue\fP), a warning message is printed on POSIX
+platforms, if a file with a non\-portable filename is added (e.g. a file
+with a name that can\(aqt be created on Windows because it contains reserved
+parts like \fBAUX\fP, reserved characters like \fB:\fP, or would cause a case
+collision with an existing file).
+If set to \fBignore\fP (or \fBfalse\fP), no warning is printed.
+If set to \fBabort\fP, the command is aborted.
+On Windows, this configuration option is ignored and the command aborted.
+.TP
+.B \fBquiet\fP
+.sp
+Reduce the amount of output printed. True or False. Default is False.
+.TP
+.B \fBremotecmd\fP
+.sp
+remote command to use for clone/push/pull operations. Default is \fBhg\fP.
+.TP
+.B \fBreportoldssl\fP
+.sp
+Warn if an SSL certificate is unable to be due to using Python
+2.5 or earlier. True or False. Default is True.
+.TP
+.B \fBreport_untrusted\fP
+.sp
+Warn if a \fB.hg/hgrc\fP file is ignored due to not being owned by a
+trusted user or group. True or False. Default is True.
+.TP
+.B \fBslash\fP
+.sp
+Display paths using a slash (\fB/\fP) as the path separator. This
+only makes a difference on systems where the default path
+separator is not the slash character (e.g. Windows uses the
+backslash character (\fB\e\fP)).
+Default is False.
+.TP
+.B \fBssh\fP
+.sp
+command to use for SSH connections. Default is \fBssh\fP.
+.TP
+.B \fBstrict\fP
+.sp
+Require exact command names, instead of allowing unambiguous
+abbreviations. True or False. Default is False.
+.TP
+.B \fBstyle\fP
+.sp
+Name of style to use for command output.
+.TP
+.B \fBtimeout\fP
+.sp
+The timeout used when a lock is held (in seconds), a negative value
+means no timeout. Default is 600.
+.TP
+.B \fBtraceback\fP
+.sp
+Mercurial always prints a traceback when an unknown exception
+occurs. Setting this to True will make Mercurial print a traceback
+on all exceptions, even those recognized by Mercurial (such as
+IOError or MemoryError). Default is False.
+.TP
+.B \fBusername\fP
+.sp
+The committer of a changeset created when running "commit".
+Typically a person\(aqs name and email address, e.g. \fBFred Widget
+<fred@example.com>\fP. Default is \fB$EMAIL\fP or \fBusername@hostname\fP. If
+the username in hgrc is empty, it has to be specified manually or
+in a different hgrc file (e.g. \fB$HOME/.hgrc\fP, if the admin set
+\fBusername =\fP in the system hgrc). Environment variables in the
+username are expanded.
+.TP
+.B \fBverbose\fP
+.sp
+Increase the amount of output printed. True or False. Default is False.
+.UNINDENT
+.SS \fBweb\fP
+.sp
+Web interface configuration. The settings in this section apply to
+both the builtin webserver (started by \%\fBhg serve\fP\:) and the script you
+run through a webserver (\fBhgweb.cgi\fP and the derivatives for FastCGI
+and WSGI).
+.sp
+The Mercurial webserver does no authentication (it does not prompt for
+usernames and passwords to validate \fIwho\fP users are), but it does do
+authorization (it grants or denies access for \fIauthenticated users\fP
+based on settings in this section). You must either configure your
+webserver to do authentication for you, or disable the authorization
+checks.
+.sp
+For a quick setup in a trusted environment, e.g., a private LAN, where
+you want it to accept pushes from anybody, you can use the following
+command line:
+.sp
+.nf
+.ft C
+$ hg \-\-config web.allow_push=* \-\-config web.push_ssl=False serve
+.ft P
+.fi
+.sp
+Note that this will allow anybody to push anything to the server and
+that this should not be used for public servers.
+.sp
+The full set of options is:
+.INDENT 0.0
+.TP
+.B \fBaccesslog\fP
+.sp
+Where to output the access log. Default is stdout.
+.TP
+.B \fBaddress\fP
+.sp
+Interface address to bind to. Default is all.
+.TP
+.B \fBallow_archive\fP
+.sp
+List of archive format (bz2, gz, zip) allowed for downloading.
+Default is empty.
+.TP
+.B \fBallowbz2\fP
+.sp
+(DEPRECATED) Whether to allow .tar.bz2 downloading of repository
+revisions.
+Default is False.
+.TP
+.B \fBallowgz\fP
+.sp
+(DEPRECATED) Whether to allow .tar.gz downloading of repository
+revisions.
+Default is False.
+.TP
+.B \fBallowpull\fP
+.sp
+Whether to allow pulling from the repository. Default is True.
+.TP
+.B \fBallow_push\fP
+.sp
+Whether to allow pushing to the repository. If empty or not set,
+push is not allowed. If the special value \fB*\fP, any remote user can
+push, including unauthenticated users. Otherwise, the remote user
+must have been authenticated, and the authenticated user name must
+be present in this list. The contents of the allow_push list are
+examined after the deny_push list.
+.TP
+.B \fBallow_read\fP
+.sp
+If the user has not already been denied repository access due to
+the contents of deny_read, this list determines whether to grant
+repository access to the user. If this list is not empty, and the
+user is unauthenticated or not present in the list, then access is
+denied for the user. If the list is empty or not set, then access
+is permitted to all users by default. Setting allow_read to the
+special value \fB*\fP is equivalent to it not being set (i.e. access
+is permitted to all users). The contents of the allow_read list are
+examined after the deny_read list.
+.TP
+.B \fBallowzip\fP
+.sp
+(DEPRECATED) Whether to allow .zip downloading of repository
+revisions. Default is False. This feature creates temporary files.
+.TP
+.B \fBbaseurl\fP
+.sp
+Base URL to use when publishing URLs in other locations, so
+third\-party tools like email notification hooks can construct
+URLs. Example: \fBhttp://hgserver/repos/\fP.
+.TP
+.B \fBcacerts\fP
+.sp
+Path to file containing a list of PEM encoded certificate
+authority certificates. Environment variables and \fB~user\fP
+constructs are expanded in the filename. If specified on the
+client, then it will verify the identity of remote HTTPS servers
+with these certificates.
+.sp
+This feature is only supported when using Python 2.6 or later. If you wish
+to use it with earlier versions of Python, install the backported
+version of the ssl library that is available from
+\fBhttp://pypi.python.org\fP.
+.sp
+To disable SSL verification temporarily, specify \fB\-\-insecure\fP from
+command line.
+.sp
+You can use OpenSSL\(aqs CA certificate file if your platform has
+one. On most Linux systems this will be
+\fB/etc/ssl/certs/ca\-certificates.crt\fP. Otherwise you will have to
+generate this file manually. The form must be as follows:
+.sp
+.nf
+.ft C
+\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\-
+\&... (certificate in base64 PEM encoding) ...
+\-\-\-\-\-END CERTIFICATE\-\-\-\-\-
+\-\-\-\-\-BEGIN CERTIFICATE\-\-\-\-\-
+\&... (certificate in base64 PEM encoding) ...
+\-\-\-\-\-END CERTIFICATE\-\-\-\-\-
+.ft P
+.fi
+.TP
+.B \fBcache\fP
+.sp
+Whether to support caching in hgweb. Defaults to True.
+.TP
+.B \fBcollapse\fP
+.sp
+With \fBdescend\fP enabled, repositories in subdirectories are shown at
+a single level alongside repositories in the current path. With
+\fBcollapse\fP also enabled, repositories residing at a deeper level than
+the current path are grouped behind navigable directory entries that
+lead to the locations of these repositories. In effect, this setting
+collapses each collection of repositories found within a subdirectory
+into a single entry for that subdirectory. Default is False.
+.TP
+.B \fBcomparisoncontext\fP
+.sp
+Number of lines of context to show in side\-by\-side file comparison. If
+negative or the value \fBfull\fP, whole files are shown. Default is 5.
+This setting can be overridden by a \fBcontext\fP request parameter to the
+\fBcomparison\fP command, taking the same values.
+.TP
+.B \fBcontact\fP
+.sp
+Name or email address of the person in charge of the repository.
+Defaults to ui.username or \fB$EMAIL\fP or "unknown" if unset or empty.
+.TP
+.B \fBdeny_push\fP
+.sp
+Whether to deny pushing to the repository. If empty or not set,
+push is not denied. If the special value \fB*\fP, all remote users are
+denied push. Otherwise, unauthenticated users are all denied, and
+any authenticated user name present in this list is also denied. The
+contents of the deny_push list are examined before the allow_push list.
+.TP
+.B \fBdeny_read\fP
+.sp
+Whether to deny reading/viewing of the repository. If this list is
+not empty, unauthenticated users are all denied, and any
+authenticated user name present in this list is also denied access to
+the repository. If set to the special value \fB*\fP, all remote users
+are denied access (rarely needed ;). If deny_read is empty or not set,
+the determination of repository access depends on the presence and
+content of the allow_read list (see description). If both
+deny_read and allow_read are empty or not set, then access is
+permitted to all users by default. If the repository is being
+served via hgwebdir, denied users will not be able to see it in
+the list of repositories. The contents of the deny_read list have
+priority over (are examined before) the contents of the allow_read
+list.
+.TP
+.B \fBdescend\fP
+.sp
+hgwebdir indexes will not descend into subdirectories. Only repositories
+directly in the current path will be shown (other repositories are still
+available from the index corresponding to their containing path).
+.TP
+.B \fBdescription\fP
+.sp
+Textual description of the repository\(aqs purpose or contents.
+Default is "unknown".
+.TP
+.B \fBencoding\fP
+.sp
+Character encoding name. Default is the current locale charset.
+Example: "UTF\-8"
+.TP
+.B \fBerrorlog\fP
+.sp
+Where to output the error log. Default is stderr.
+.TP
+.B \fBguessmime\fP
+.sp
+Control MIME types for raw download of file content.
+Set to True to let hgweb guess the content type from the file
+extension. This will serve HTML files as \fBtext/html\fP and might
+allow cross\-site scripting attacks when serving untrusted
+repositories. Default is False.
+.TP
+.B \fBhidden\fP
+.sp
+Whether to hide the repository in the hgwebdir index.
+Default is False.
+.TP
+.B \fBipv6\fP
+.sp
+Whether to use IPv6. Default is False.
+.TP
+.B \fBlogoimg\fP
+.sp
+File name of the logo image that some templates display on each page.
+The file name is relative to \fBstaticurl\fP. That is, the full path to
+the logo image is "staticurl/logoimg".
+If unset, \fBhglogo.png\fP will be used.
+.TP
+.B \fBlogourl\fP
+.sp
+Base URL to use for logos. If unset, \fBhttp://mercurial.selenic.com/\fP
+will be used.
+.TP
+.B \fBmaxchanges\fP
+.sp
+Maximum number of changes to list on the changelog. Default is 10.
+.TP
+.B \fBmaxfiles\fP
+.sp
+Maximum number of files to list per changeset. Default is 10.
+.TP
+.B \fBmaxshortchanges\fP
+.sp
+Maximum number of changes to list on the shortlog, graph or filelog
+pages. Default is 60.
+.TP
+.B \fBname\fP
+.sp
+Repository name to use in the web interface. Default is current
+working directory.
+.TP
+.B \fBport\fP
+.sp
+Port to listen on. Default is 8000.
+.TP
+.B \fBprefix\fP
+.sp
+Prefix path to serve from. Default is \(aq\(aq (server root).
+.TP
+.B \fBpush_ssl\fP
+.sp
+Whether to require that inbound pushes be transported over SSL to
+prevent password sniffing. Default is True.
+.TP
+.B \fBstaticurl\fP
+.sp
+Base URL to use for static files. If unset, static files (e.g. the
+hgicon.png favicon) will be served by the CGI script itself. Use
+this setting to serve them directly with the HTTP server.
+Example: \fBhttp://hgserver/static/\fP.
+.TP
+.B \fBstripes\fP
+.sp
+How many lines a "zebra stripe" should span in multiline output.
+Default is 1; set to 0 to disable.
+.TP
+.B \fBstyle\fP
+.sp
+Which template map style to use.
+.TP
+.B \fBtemplates\fP
+.sp
+Where to find the HTML templates. Default is install path.
+.UNINDENT
+.SH AUTHOR
+.sp
+Bryan O\(aqSullivan <\%bos@serpentine.com\:>.
+.sp
+Mercurial was written by Matt Mackall <\%mpm@selenic.com\:>.
+.SH SEE ALSO
+.sp
+\%\fBhg\fP(1)\:, \%\fBhgignore\fP(5)\:
+.SH COPYING
+.sp
+This manual page is copyright 2005 Bryan O\(aqSullivan.
+Mercurial is copyright 2005\-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+.\" Common link and substitution definitions.
+.
+.SH AUTHOR
+Bryan O'Sullivan <bos@serpentine.com>
+
+Organization: Mercurial
+.\" Generated by docutils manpage writer.
+.\"
+.
diff --git a/doc/hgrc.5.html b/doc/hgrc.5.html
new file mode 100644
index 0000000..c9c0222
--- /dev/null
+++ b/doc/hgrc.5.html
@@ -0,0 +1,1366 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.8.1: http://docutils.sourceforge.net/" />
+<title>hgrc</title>
+<meta name="author" content="Bryan O'Sullivan &lt;bos&#64;serpentine.com&gt;" />
+<meta name="organization" content="Mercurial" />
+<link rel="stylesheet" href="style.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="hgrc">
+<h1 class="title">hgrc</h1>
+<h2 class="subtitle" id="configuration-files-for-mercurial">configuration files for Mercurial</h2>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Bryan O'Sullivan &lt;<a class="reference external" href="mailto:bos&#64;serpentine.com">bos&#64;serpentine.com</a>&gt;</td></tr>
+<tr><th class="docinfo-name">Organization:</th>
+<td>Mercurial</td></tr>
+<tr class="field"><th class="docinfo-name">Manual section:</th><td class="field-body">5</td>
+</tr>
+<tr class="field"><th class="docinfo-name">Manual group:</th><td class="field-body">Mercurial Manual</td>
+</tr>
+</tbody>
+</table>
+<div class="contents htmlonly topic" id="contents">
+<p class="topic-title first">Contents</p>
+<ul class="simple">
+<li><a class="reference internal" href="#synopsis" id="id1">Synopsis</a></li>
+<li><a class="reference internal" href="#files" id="id2">Files</a></li>
+<li><a class="reference internal" href="#syntax" id="id3">Syntax</a></li>
+<li><a class="reference internal" href="#sections" id="id4">Sections</a><ul>
+<li><a class="reference internal" href="#alias" id="id5"><tt class="docutils literal">alias</tt></a></li>
+<li><a class="reference internal" href="#annotate" id="id6"><tt class="docutils literal">annotate</tt></a></li>
+<li><a class="reference internal" href="#auth" id="id7"><tt class="docutils literal">auth</tt></a></li>
+<li><a class="reference internal" href="#decode-encode" id="id8"><tt class="docutils literal">decode/encode</tt></a></li>
+<li><a class="reference internal" href="#defaults" id="id9"><tt class="docutils literal">defaults</tt></a></li>
+<li><a class="reference internal" href="#diff" id="id10"><tt class="docutils literal">diff</tt></a></li>
+<li><a class="reference internal" href="#email" id="id11"><tt class="docutils literal">email</tt></a></li>
+<li><a class="reference internal" href="#extensions" id="id12"><tt class="docutils literal">extensions</tt></a></li>
+<li><a class="reference internal" href="#format" id="id13"><tt class="docutils literal">format</tt></a></li>
+<li><a class="reference internal" href="#graph" id="id14"><tt class="docutils literal">graph</tt></a></li>
+<li><a class="reference internal" href="#hooks" id="id15"><tt class="docutils literal">hooks</tt></a></li>
+<li><a class="reference internal" href="#hostfingerprints" id="id16"><tt class="docutils literal">hostfingerprints</tt></a></li>
+<li><a class="reference internal" href="#http-proxy" id="id17"><tt class="docutils literal">http_proxy</tt></a></li>
+<li><a class="reference internal" href="#merge-patterns" id="id18"><tt class="docutils literal"><span class="pre">merge-patterns</span></tt></a></li>
+<li><a class="reference internal" href="#merge-tools" id="id19"><tt class="docutils literal"><span class="pre">merge-tools</span></tt></a></li>
+<li><a class="reference internal" href="#patch" id="id20"><tt class="docutils literal">patch</tt></a></li>
+<li><a class="reference internal" href="#paths" id="id21"><tt class="docutils literal">paths</tt></a></li>
+<li><a class="reference internal" href="#phases" id="id22"><tt class="docutils literal">phases</tt></a></li>
+<li><a class="reference internal" href="#profiling" id="id23"><tt class="docutils literal">profiling</tt></a></li>
+<li><a class="reference internal" href="#revsetalias" id="id24"><tt class="docutils literal">revsetalias</tt></a></li>
+<li><a class="reference internal" href="#server" id="id25"><tt class="docutils literal">server</tt></a></li>
+<li><a class="reference internal" href="#smtp" id="id26"><tt class="docutils literal">smtp</tt></a></li>
+<li><a class="reference internal" href="#subpaths" id="id27"><tt class="docutils literal">subpaths</tt></a></li>
+<li><a class="reference internal" href="#trusted" id="id28"><tt class="docutils literal">trusted</tt></a></li>
+<li><a class="reference internal" href="#ui" id="id29"><tt class="docutils literal">ui</tt></a></li>
+<li><a class="reference internal" href="#web" id="id30"><tt class="docutils literal">web</tt></a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#author" id="id31">Author</a></li>
+<li><a class="reference internal" href="#see-also" id="id32">See Also</a></li>
+<li><a class="reference internal" href="#copying" id="id33">Copying</a></li>
+</ul>
+</div>
+<div class="section" id="synopsis">
+<h1><a class="toc-backref" href="#contents">Synopsis</a></h1>
+<p>The Mercurial system uses a set of configuration files to control
+aspects of its behavior.</p>
+<p>The configuration files use a simple ini-file format. A configuration
+file consists of sections, led by a <tt class="docutils literal">[section]</tt> header and followed
+by <tt class="docutils literal">name = value</tt> entries:</p>
+<pre class="literal-block">
+[ui]
+username = Firstname Lastname &lt;firstname.lastname&#64;example.net&gt;
+verbose = True
+</pre>
+<p>The above entries will be referred to as <tt class="docutils literal">ui.username</tt> and
+<tt class="docutils literal">ui.verbose</tt>, respectively. See the Syntax section below.</p>
+</div>
+<div class="section" id="files">
+<h1><a class="toc-backref" href="#contents">Files</a></h1>
+<p>Mercurial reads configuration data from several files, if they exist.
+These files do not exist by default and you will have to create the
+appropriate configuration files yourself: global configuration like
+the username setting is typically put into
+<tt class="docutils literal"><span class="pre">%USERPROFILE%\mercurial.ini</span></tt> or <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt> and local
+configuration is put into the per-repository <tt class="docutils literal"><span class="pre">&lt;repo&gt;/.hg/hgrc</span></tt> file.</p>
+<p>The names of these files depend on the system on which Mercurial is
+installed. <tt class="docutils literal">*.rc</tt> files from a single directory are read in
+alphabetical order, later ones overriding earlier ones. Where multiple
+paths are given below, settings from earlier paths override later
+ones.</p>
+<div class="line-block">
+<div class="line">(All) <tt class="docutils literal"><span class="pre">&lt;repo&gt;/.hg/hgrc</span></tt></div>
+</div>
+<blockquote>
+Per-repository configuration options that only apply in a
+particular repository. This file is not version-controlled, and
+will not get transferred during a &quot;clone&quot; operation. Options in
+this file override options in all other configuration files. On
+Plan 9 and Unix, most of this file will be ignored if it doesn't
+belong to a trusted user or to a trusted group. See the documentation
+for the <tt class="docutils literal">[trusted]</tt> section below for more details.</blockquote>
+<div class="line-block">
+<div class="line">(Plan 9) <tt class="docutils literal">$home/lib/hgrc</tt></div>
+<div class="line">(Unix) <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt></div>
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">%USERPROFILE%\.hgrc</span></tt></div>
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">%USERPROFILE%\Mercurial.ini</span></tt></div>
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">%HOME%\.hgrc</span></tt></div>
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">%HOME%\Mercurial.ini</span></tt></div>
+</div>
+<blockquote>
+Per-user configuration file(s), for the user running Mercurial. On
+Windows 9x, <tt class="docutils literal">%HOME%</tt> is replaced by <tt class="docutils literal">%APPDATA%</tt>. Options in these
+files apply to all Mercurial commands executed by this user in any
+directory. Options in these files override per-system and per-installation
+options.</blockquote>
+<div class="line-block">
+<div class="line">(Plan 9) <tt class="docutils literal">/lib/mercurial/hgrc</tt></div>
+<div class="line">(Plan 9) <tt class="docutils literal"><span class="pre">/lib/mercurial/hgrc.d/*.rc</span></tt></div>
+<div class="line">(Unix) <tt class="docutils literal">/etc/mercurial/hgrc</tt></div>
+<div class="line">(Unix) <tt class="docutils literal"><span class="pre">/etc/mercurial/hgrc.d/*.rc</span></tt></div>
+</div>
+<blockquote>
+Per-system configuration files, for the system on which Mercurial
+is running. Options in these files apply to all Mercurial commands
+executed by any user in any directory. Options in these files
+override per-installation options.</blockquote>
+<div class="line-block">
+<div class="line">(Plan 9) <tt class="docutils literal"><span class="pre">&lt;install-root&gt;/lib/mercurial/hgrc</span></tt></div>
+<div class="line">(Plan 9) <tt class="docutils literal"><span class="pre">&lt;install-root&gt;/lib/mercurial/hgrc.d/*.rc</span></tt></div>
+<div class="line">(Unix) <tt class="docutils literal"><span class="pre">&lt;install-root&gt;/etc/mercurial/hgrc</span></tt></div>
+<div class="line">(Unix) <tt class="docutils literal"><span class="pre">&lt;install-root&gt;/etc/mercurial/hgrc.d/*.rc</span></tt></div>
+</div>
+<blockquote>
+Per-installation configuration files, searched for in the
+directory where Mercurial is installed. <tt class="docutils literal"><span class="pre">&lt;install-root&gt;</span></tt> is the
+parent directory of the <strong>hg</strong> executable (or symlink) being run. For
+example, if installed in <tt class="docutils literal">/shared/tools/bin/hg</tt>, Mercurial will look
+in <tt class="docutils literal">/shared/tools/etc/mercurial/hgrc</tt>. Options in these files apply
+to all Mercurial commands executed by any user in any directory.</blockquote>
+<div class="line-block">
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">&lt;install-dir&gt;\Mercurial.ini</span></tt> <strong>or</strong></div>
+<div class="line">(Windows) <tt class="docutils literal"><span class="pre">&lt;install-dir&gt;\hgrc.d\*.rc</span></tt> <strong>or</strong></div>
+<div class="line">(Windows) <tt class="docutils literal">HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial</tt></div>
+</div>
+<blockquote>
+Per-installation/system configuration files, for the system on
+which Mercurial is running. Options in these files apply to all
+Mercurial commands executed by any user in any directory. Registry
+keys contain PATH-like strings, every part of which must reference
+a <tt class="docutils literal">Mercurial.ini</tt> file or be a directory where <tt class="docutils literal">*.rc</tt> files will
+be read. Mercurial checks each of these locations in the specified
+order until one or more configuration files are detected.</blockquote>
+</div>
+<div class="section" id="syntax">
+<h1><a class="toc-backref" href="#contents">Syntax</a></h1>
+<p>A configuration file consists of sections, led by a <tt class="docutils literal">[section]</tt> header
+and followed by <tt class="docutils literal">name = value</tt> entries (sometimes called
+<tt class="docutils literal">configuration keys</tt>):</p>
+<pre class="literal-block">
+[spam]
+eggs=ham
+green=
+ eggs
+</pre>
+<p>Each line contains one entry. If the lines that follow are indented,
+they are treated as continuations of that entry. Leading whitespace is
+removed from values. Empty lines are skipped. Lines beginning with
+<tt class="docutils literal">#</tt> or <tt class="docutils literal">;</tt> are ignored and may be used to provide comments.</p>
+<p>Configuration keys can be set multiple times, in which case Mercurial
+will use the value that was configured last. As an example:</p>
+<pre class="literal-block">
+[spam]
+eggs=large
+ham=serrano
+eggs=small
+</pre>
+<p>This would set the configuration key named <tt class="docutils literal">eggs</tt> to <tt class="docutils literal">small</tt>.</p>
+<p>It is also possible to define a section multiple times. A section can
+be redefined on the same and/or on different configuration files. For
+example:</p>
+<pre class="literal-block">
+[foo]
+eggs=large
+ham=serrano
+eggs=small
+
+[bar]
+eggs=ham
+green=
+ eggs
+
+[foo]
+ham=prosciutto
+eggs=medium
+bread=toasted
+</pre>
+<p>This would set the <tt class="docutils literal">eggs</tt>, <tt class="docutils literal">ham</tt>, and <tt class="docutils literal">bread</tt> configuration keys
+of the <tt class="docutils literal">foo</tt> section to <tt class="docutils literal">medium</tt>, <tt class="docutils literal">prosciutto</tt>, and <tt class="docutils literal">toasted</tt>,
+respectively. As you can see there only thing that matters is the last
+value that was set for each of the configuration keys.</p>
+<p>If a configuration key is set multiple times in different
+configuration files the final value will depend on the order in which
+the different configuration files are read, with settings from earlier
+paths overriding later ones as described on the <tt class="docutils literal">Files</tt> section
+above.</p>
+<p>A line of the form <tt class="docutils literal">%include file</tt> will include <tt class="docutils literal">file</tt> into the
+current configuration file. The inclusion is recursive, which means
+that included files can include other files. Filenames are relative to
+the configuration file in which the <tt class="docutils literal">%include</tt> directive is found.
+Environment variables and <tt class="docutils literal">~user</tt> constructs are expanded in
+<tt class="docutils literal">file</tt>. This lets you do something like:</p>
+<pre class="literal-block">
+%include ~/.hgrc.d/$HOST.rc
+</pre>
+<p>to include a different configuration file on each computer you use.</p>
+<p>A line with <tt class="docutils literal">%unset name</tt> will remove <tt class="docutils literal">name</tt> from the current
+section, if it has been set previously.</p>
+<p>The values are either free-form text strings, lists of text strings,
+or Boolean values. Boolean values can be set to true using any of &quot;1&quot;,
+&quot;yes&quot;, &quot;true&quot;, or &quot;on&quot; and to false using &quot;0&quot;, &quot;no&quot;, &quot;false&quot;, or &quot;off&quot;
+(all case insensitive).</p>
+<p>List values are separated by whitespace or comma, except when values are
+placed in double quotation marks:</p>
+<pre class="literal-block">
+allow_read = &quot;John Doe, PhD&quot;, brian, betty
+</pre>
+<p>Quotation marks can be escaped by prefixing them with a backslash. Only
+quotation marks at the beginning of a word is counted as a quotation
+(e.g., <tt class="docutils literal">foo&quot;bar baz</tt> is the list of <tt class="docutils literal">foo&quot;bar</tt> and <tt class="docutils literal">baz</tt>).</p>
+</div>
+<div class="section" id="sections">
+<h1><a class="toc-backref" href="#contents">Sections</a></h1>
+<p>This section describes the different sections that may appear in a
+Mercurial configuration file, the purpose of each section, its possible
+keys, and their possible values.</p>
+<div class="section" id="alias">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">alias</tt></a></h2>
+<p>Defines command aliases.
+Aliases allow you to define your own commands in terms of other
+commands (or aliases), optionally including arguments. Positional
+arguments in the form of <tt class="docutils literal">$1</tt>, <tt class="docutils literal">$2</tt>, etc in the alias definition
+are expanded by Mercurial before execution. Positional arguments not
+already used by <tt class="docutils literal">$N</tt> in the definition are put at the end of the
+command to be executed.</p>
+<p>Alias definitions consist of lines of the form:</p>
+<pre class="literal-block">
+&lt;alias&gt; = &lt;command&gt; [&lt;argument&gt;]...
+</pre>
+<p>For example, this definition:</p>
+<pre class="literal-block">
+latest = log --limit 5
+</pre>
+<p>creates a new command <tt class="docutils literal">latest</tt> that shows only the five most recent
+changesets. You can define subsequent aliases using earlier ones:</p>
+<pre class="literal-block">
+stable5 = latest -b stable
+</pre>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">It is possible to create aliases with the same names as
+existing commands, which will then override the original
+definitions. This is almost always a bad idea!</p>
+</div>
+<p>An alias can start with an exclamation point (<tt class="docutils literal">!</tt>) to make it a
+shell alias. A shell alias is executed with the shell and will let you
+run arbitrary commands. As an example,</p>
+<pre class="literal-block">
+echo = !echo $&#64;
+</pre>
+<p>will let you do <tt class="docutils literal">hg echo foo</tt> to have <tt class="docutils literal">foo</tt> printed in your
+terminal. A better example might be:</p>
+<pre class="literal-block">
+purge = !$HG status --no-status --unknown -0 | xargs -0 rm
+</pre>
+<p>which will make <tt class="docutils literal">hg purge</tt> delete all unknown files in the
+repository in the same manner as the purge extension.</p>
+<p>Positional arguments like <tt class="docutils literal">$1</tt>, <tt class="docutils literal">$2</tt>, etc. in the alias definition
+expand to the command arguments. Unmatched arguments are
+removed. <tt class="docutils literal">$0</tt> expands to the alias name and <tt class="docutils literal">$&#64;</tt> expands to all
+arguments separated by a space. These expansions happen before the
+command is passed to the shell.</p>
+<p>Shell aliases are executed in an environment where <tt class="docutils literal">$HG</tt> expands to
+the path of the Mercurial that was used to execute the alias. This is
+useful when you want to call further Mercurial commands in a shell
+alias, as was done above for the purge alias. In addition,
+<tt class="docutils literal">$HG_ARGS</tt> expands to the arguments given to Mercurial. In the <tt class="docutils literal">hg
+echo foo</tt> call above, <tt class="docutils literal">$HG_ARGS</tt> would expand to <tt class="docutils literal">echo foo</tt>.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Some global configuration options such as <tt class="docutils literal"><span class="pre">-R</span></tt> are
+processed before shell aliases and will thus not be passed to
+aliases.</p>
+</div>
+</div>
+<div class="section" id="annotate">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">annotate</tt></a></h2>
+<p>Settings used when displaying file annotations. All values are
+Booleans and default to False. See <tt class="docutils literal">diff</tt> section for related
+options for the diff command.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">ignorews</tt></dt>
+<dd>Ignore white space when comparing lines.</dd>
+<dt><tt class="docutils literal">ignorewsamount</tt></dt>
+<dd>Ignore changes in the amount of white space.</dd>
+<dt><tt class="docutils literal">ignoreblanklines</tt></dt>
+<dd>Ignore changes whose lines are all blank.</dd>
+</dl>
+</div>
+<div class="section" id="auth">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">auth</tt></a></h2>
+<p>Authentication credentials for HTTP authentication. This section
+allows you to store usernames and passwords for use when logging
+<em>into</em> HTTP servers. See the <tt class="docutils literal">[web]</tt> configuration section if
+you want to configure <em>who</em> can login to your HTTP server.</p>
+<p>Each line has the following format:</p>
+<pre class="literal-block">
+&lt;name&gt;.&lt;argument&gt; = &lt;value&gt;
+</pre>
+<p>where <tt class="docutils literal">&lt;name&gt;</tt> is used to group arguments into authentication
+entries. Example:</p>
+<pre class="literal-block">
+foo.prefix = hg.intevation.org/mercurial
+foo.username = foo
+foo.password = bar
+foo.schemes = http https
+
+bar.prefix = secure.example.org
+bar.key = path/to/file.key
+bar.cert = path/to/file.cert
+bar.schemes = https
+</pre>
+<p>Supported arguments:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">prefix</tt></dt>
+<dd>Either <tt class="docutils literal">*</tt> or a URI prefix with or without the scheme part.
+The authentication entry with the longest matching prefix is used
+(where <tt class="docutils literal">*</tt> matches everything and counts as a match of length
+1). If the prefix doesn't include a scheme, the match is performed
+against the URI with its scheme stripped as well, and the schemes
+argument, q.v., is then subsequently consulted.</dd>
+<dt><tt class="docutils literal">username</tt></dt>
+<dd>Optional. Username to authenticate with. If not given, and the
+remote site requires basic or digest authentication, the user will
+be prompted for it. Environment variables are expanded in the
+username letting you do <tt class="docutils literal">foo.username = $USER</tt>. If the URI
+includes a username, only <tt class="docutils literal">[auth]</tt> entries with a matching
+username or without a username will be considered.</dd>
+<dt><tt class="docutils literal">password</tt></dt>
+<dd>Optional. Password to authenticate with. If not given, and the
+remote site requires basic or digest authentication, the user
+will be prompted for it.</dd>
+<dt><tt class="docutils literal">key</tt></dt>
+<dd>Optional. PEM encoded client certificate key file. Environment
+variables are expanded in the filename.</dd>
+<dt><tt class="docutils literal">cert</tt></dt>
+<dd>Optional. PEM encoded client certificate chain file. Environment
+variables are expanded in the filename.</dd>
+<dt><tt class="docutils literal">schemes</tt></dt>
+<dd>Optional. Space separated list of URI schemes to use this
+authentication entry with. Only used if the prefix doesn't include
+a scheme. Supported schemes are http and https. They will match
+static-http and static-https respectively, as well.
+Default: https.</dd>
+</dl>
+<p>If no suitable authentication entry is found, the user is prompted
+for credentials as usual if required by the remote.</p>
+</div>
+<div class="section" id="decode-encode">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">decode/encode</tt></a></h2>
+<p>Filters for transforming files on checkout/checkin. This would
+typically be used for newline processing or other
+localization/canonicalization of files.</p>
+<p>Filters consist of a filter pattern followed by a filter command.
+Filter patterns are globs by default, rooted at the repository root.
+For example, to match any file ending in <tt class="docutils literal">.txt</tt> in the root
+directory only, use the pattern <tt class="docutils literal">*.txt</tt>. To match any file ending
+in <tt class="docutils literal">.c</tt> anywhere in the repository, use the pattern <tt class="docutils literal"><span class="pre">**.c</span></tt>.
+For each file only the first matching filter applies.</p>
+<p>The filter command can start with a specifier, either <tt class="docutils literal">pipe:</tt> or
+<tt class="docutils literal">tempfile:</tt>. If no specifier is given, <tt class="docutils literal">pipe:</tt> is used by default.</p>
+<p>A <tt class="docutils literal">pipe:</tt> command must accept data on stdin and return the transformed
+data on stdout.</p>
+<p>Pipe example:</p>
+<pre class="literal-block">
+[encode]
+# uncompress gzip files on checkin to improve delta compression
+# note: not necessarily a good idea, just an example
+*.gz = pipe: gunzip
+
+[decode]
+# recompress gzip files when writing them to the working dir (we
+# can safely omit &quot;pipe:&quot;, because it's the default)
+*.gz = gzip
+</pre>
+<p>A <tt class="docutils literal">tempfile:</tt> command is a template. The string <tt class="docutils literal">INFILE</tt> is replaced
+with the name of a temporary file that contains the data to be
+filtered by the command. The string <tt class="docutils literal">OUTFILE</tt> is replaced with the name
+of an empty temporary file, where the filtered data must be written by
+the command.</p>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">The tempfile mechanism is recommended for Windows systems,
+where the standard shell I/O redirection operators often have
+strange effects and may corrupt the contents of your files.</p>
+</div>
+<p>This filter mechanism is used internally by the <tt class="docutils literal">eol</tt> extension to
+translate line ending characters between Windows (CRLF) and Unix (LF)
+format. We suggest you use the <tt class="docutils literal">eol</tt> extension for convenience.</p>
+</div>
+<div class="section" id="defaults">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">defaults</tt></a></h2>
+<p>(defaults are deprecated. Don't use them. Use aliases instead)</p>
+<p>Use the <tt class="docutils literal">[defaults]</tt> section to define command defaults, i.e. the
+default options/arguments to pass to the specified commands.</p>
+<p>The following example makes <a class="reference external" href="hg.1.html#log"><tt class="docutils literal">hg log</tt></a> run in verbose mode, and
+<a class="reference external" href="hg.1.html#status"><tt class="docutils literal">hg status</tt></a> show only the modified files, by default:</p>
+<pre class="literal-block">
+[defaults]
+log = -v
+status = -m
+</pre>
+<p>The actual commands, instead of their aliases, must be used when
+defining command defaults. The command defaults will also be applied
+to the aliases of the commands defined.</p>
+</div>
+<div class="section" id="diff">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">diff</tt></a></h2>
+<p>Settings used when displaying diffs. Everything except for <tt class="docutils literal">unified</tt>
+is a Boolean and defaults to False. See <tt class="docutils literal">annotate</tt> section for
+related options for the annotate command.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">git</tt></dt>
+<dd>Use git extended diff format.</dd>
+<dt><tt class="docutils literal">nodates</tt></dt>
+<dd>Don't include dates in diff headers.</dd>
+<dt><tt class="docutils literal">showfunc</tt></dt>
+<dd>Show which function each change is in.</dd>
+<dt><tt class="docutils literal">ignorews</tt></dt>
+<dd>Ignore white space when comparing lines.</dd>
+<dt><tt class="docutils literal">ignorewsamount</tt></dt>
+<dd>Ignore changes in the amount of white space.</dd>
+<dt><tt class="docutils literal">ignoreblanklines</tt></dt>
+<dd>Ignore changes whose lines are all blank.</dd>
+<dt><tt class="docutils literal">unified</tt></dt>
+<dd>Number of lines of context to show.</dd>
+</dl>
+</div>
+<div class="section" id="email">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">email</tt></a></h2>
+<p>Settings for extensions that send email messages.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">from</tt></dt>
+<dd>Optional. Email address to use in &quot;From&quot; header and SMTP envelope
+of outgoing messages.</dd>
+<dt><tt class="docutils literal">to</tt></dt>
+<dd>Optional. Comma-separated list of recipients' email addresses.</dd>
+<dt><tt class="docutils literal">cc</tt></dt>
+<dd>Optional. Comma-separated list of carbon copy recipients'
+email addresses.</dd>
+<dt><tt class="docutils literal">bcc</tt></dt>
+<dd>Optional. Comma-separated list of blind carbon copy recipients'
+email addresses.</dd>
+<dt><tt class="docutils literal">method</tt></dt>
+<dd>Optional. Method to use to send email messages. If value is <tt class="docutils literal">smtp</tt>
+(default), use SMTP (see the <tt class="docutils literal">[smtp]</tt> section for configuration).
+Otherwise, use as name of program to run that acts like sendmail
+(takes <tt class="docutils literal"><span class="pre">-f</span></tt> option for sender, list of recipients on command line,
+message on stdin). Normally, setting this to <tt class="docutils literal">sendmail</tt> or
+<tt class="docutils literal">/usr/sbin/sendmail</tt> is enough to use sendmail to send messages.</dd>
+<dt><tt class="docutils literal">charsets</tt></dt>
+<dd><p class="first">Optional. Comma-separated list of character sets considered
+convenient for recipients. Addresses, headers, and parts not
+containing patches of outgoing messages will be encoded in the
+first character set to which conversion from local encoding
+(<tt class="docutils literal">$HGENCODING</tt>, <tt class="docutils literal">ui.fallbackencoding</tt>) succeeds. If correct
+conversion fails, the text in question is sent as is. Defaults to
+empty (explicit) list.</p>
+<p>Order of outgoing email character sets:</p>
+<ol class="last arabic simple">
+<li><tt class="docutils literal"><span class="pre">us-ascii</span></tt>: always first, regardless of settings</li>
+<li><tt class="docutils literal">email.charsets</tt>: in order given by user</li>
+<li><tt class="docutils literal">ui.fallbackencoding</tt>: if not in email.charsets</li>
+<li><tt class="docutils literal">$HGENCODING</tt>: if not in email.charsets</li>
+<li><tt class="docutils literal"><span class="pre">utf-8</span></tt>: always last, regardless of settings</li>
+</ol>
+</dd>
+</dl>
+<p>Email example:</p>
+<pre class="literal-block">
+[email]
+from = Joseph User &lt;joe.user&#64;example.com&gt;
+method = /usr/sbin/sendmail
+# charsets for western Europeans
+# us-ascii, utf-8 omitted, as they are tried first and last
+charsets = iso-8859-1, iso-8859-15, windows-1252
+</pre>
+</div>
+<div class="section" id="extensions">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">extensions</tt></a></h2>
+<p>Mercurial has an extension mechanism for adding new features. To
+enable an extension, create an entry for it in this section.</p>
+<p>If you know that the extension is already in Python's search path,
+you can give the name of the module, followed by <tt class="docutils literal">=</tt>, with nothing
+after the <tt class="docutils literal">=</tt>.</p>
+<p>Otherwise, give a name that you choose, followed by <tt class="docutils literal">=</tt>, followed by
+the path to the <tt class="docutils literal">.py</tt> file (including the file name extension) that
+defines the extension.</p>
+<p>To explicitly disable an extension that is enabled in an hgrc of
+broader scope, prepend its path with <tt class="docutils literal">!</tt>, as in <tt class="docutils literal">foo = !/ext/path</tt>
+or <tt class="docutils literal">foo = !</tt> when path is not supplied.</p>
+<p>Example for <tt class="docutils literal"><span class="pre">~/.hgrc</span></tt>:</p>
+<pre class="literal-block">
+[extensions]
+# (the mq extension will get loaded from Mercurial's path)
+mq =
+# (this extension will get loaded from the file specified)
+myfeature = ~/.hgext/myfeature.py
+</pre>
+</div>
+<div class="section" id="format">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">format</tt></a></h2>
+<dl class="docutils">
+<dt><tt class="docutils literal">usestore</tt></dt>
+<dd>Enable or disable the &quot;store&quot; repository format which improves
+compatibility with systems that fold case or otherwise mangle
+filenames. Enabled by default. Disabling this option will allow
+you to store longer filenames in some situations at the expense of
+compatibility and ensures that the on-disk format of newly created
+repositories will be compatible with Mercurial before version 0.9.4.</dd>
+<dt><tt class="docutils literal">usefncache</tt></dt>
+<dd>Enable or disable the &quot;fncache&quot; repository format which enhances
+the &quot;store&quot; repository format (which has to be enabled to use
+fncache) to allow longer filenames and avoids using Windows
+reserved names, e.g. &quot;nul&quot;. Enabled by default. Disabling this
+option ensures that the on-disk format of newly created
+repositories will be compatible with Mercurial before version 1.1.</dd>
+<dt><tt class="docutils literal">dotencode</tt></dt>
+<dd>Enable or disable the &quot;dotencode&quot; repository format which enhances
+the &quot;fncache&quot; repository format (which has to be enabled to use
+dotencode) to avoid issues with filenames starting with ._ on
+Mac OS X and spaces on Windows. Enabled by default. Disabling this
+option ensures that the on-disk format of newly created
+repositories will be compatible with Mercurial before version 1.7.</dd>
+</dl>
+</div>
+<div class="section" id="graph">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">graph</tt></a></h2>
+<p>Web graph view configuration. This section let you change graph
+elements display properties by branches, for instance to make the
+<tt class="docutils literal">default</tt> branch stand out.</p>
+<p>Each line has the following format:</p>
+<pre class="literal-block">
+&lt;branch&gt;.&lt;argument&gt; = &lt;value&gt;
+</pre>
+<p>where <tt class="docutils literal">&lt;branch&gt;</tt> is the name of the branch being
+customized. Example:</p>
+<pre class="literal-block">
+[graph]
+# 2px width
+default.width = 2
+# red color
+default.color = FF0000
+</pre>
+<p>Supported arguments:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">width</tt></dt>
+<dd>Set branch edges width in pixels.</dd>
+<dt><tt class="docutils literal">color</tt></dt>
+<dd>Set branch edges color in hexadecimal RGB notation.</dd>
+</dl>
+</div>
+<div class="section" id="hooks">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">hooks</tt></a></h2>
+<p>Commands or Python functions that get automatically executed by
+various actions such as starting or finishing a commit. Multiple
+hooks can be run for the same action by appending a suffix to the
+action. Overriding a site-wide hook can be done by changing its
+value or setting it to an empty string. Hooks can be prioritized
+by adding a prefix of <tt class="docutils literal">priority</tt> to the hook name on a new line
+and setting the priority. The default priority is 0 if
+not specified.</p>
+<p>Example <tt class="docutils literal">.hg/hgrc</tt>:</p>
+<pre class="literal-block">
+[hooks]
+# update working directory after adding changesets
+changegroup.update = hg update
+# do not use the site-wide hook
+incoming =
+incoming.email = /my/email/hook
+incoming.autobuild = /my/build/hook
+# force autobuild hook to run before other incoming hooks
+priority.incoming.autobuild = 1
+</pre>
+<p>Most hooks are run with environment variables set that give useful
+additional information. For each hook below, the environment
+variables it is passed are listed with names of the form <tt class="docutils literal">$HG_foo</tt>.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">changegroup</tt></dt>
+<dd>Run after a changegroup has been added via push, pull or unbundle.
+ID of the first new changeset is in <tt class="docutils literal">$HG_NODE</tt>. URL from which
+changes came is in <tt class="docutils literal">$HG_URL</tt>.</dd>
+<dt><tt class="docutils literal">commit</tt></dt>
+<dd>Run after a changeset has been created in the local repository. ID
+of the newly created changeset is in <tt class="docutils literal">$HG_NODE</tt>. Parent changeset
+IDs are in <tt class="docutils literal">$HG_PARENT1</tt> and <tt class="docutils literal">$HG_PARENT2</tt>.</dd>
+<dt><tt class="docutils literal">incoming</tt></dt>
+<dd>Run after a changeset has been pulled, pushed, or unbundled into
+the local repository. The ID of the newly arrived changeset is in
+<tt class="docutils literal">$HG_NODE</tt>. URL that was source of changes came is in <tt class="docutils literal">$HG_URL</tt>.</dd>
+<dt><tt class="docutils literal">outgoing</tt></dt>
+<dd>Run after sending changes from local repository to another. ID of
+first changeset sent is in <tt class="docutils literal">$HG_NODE</tt>. Source of operation is in
+<tt class="docutils literal">$HG_SOURCE</tt>; see &quot;preoutgoing&quot; hook for description.</dd>
+<dt><tt class="docutils literal"><span class="pre">post-&lt;command&gt;</span></tt></dt>
+<dd>Run after successful invocations of the associated command. The
+contents of the command line are passed as <tt class="docutils literal">$HG_ARGS</tt> and the result
+code in <tt class="docutils literal">$HG_RESULT</tt>. Parsed command line arguments are passed as
+<tt class="docutils literal">$HG_PATS</tt> and <tt class="docutils literal">$HG_OPTS</tt>. These contain string representations of
+the python data internally passed to &lt;command&gt;. <tt class="docutils literal">$HG_OPTS</tt> is a
+dictionary of options (with unspecified options set to their defaults).
+<tt class="docutils literal">$HG_PATS</tt> is a list of arguments. Hook failure is ignored.</dd>
+<dt><tt class="docutils literal"><span class="pre">pre-&lt;command&gt;</span></tt></dt>
+<dd>Run before executing the associated command. The contents of the
+command line are passed as <tt class="docutils literal">$HG_ARGS</tt>. Parsed command line arguments
+are passed as <tt class="docutils literal">$HG_PATS</tt> and <tt class="docutils literal">$HG_OPTS</tt>. These contain string
+representations of the data internally passed to &lt;command&gt;. <tt class="docutils literal">$HG_OPTS</tt>
+is a dictionary of options (with unspecified options set to their
+defaults). <tt class="docutils literal">$HG_PATS</tt> is a list of arguments. If the hook returns
+failure, the command doesn't execute and Mercurial returns the failure
+code.</dd>
+<dt><tt class="docutils literal">prechangegroup</tt></dt>
+<dd>Run before a changegroup is added via push, pull or unbundle. Exit
+status 0 allows the changegroup to proceed. Non-zero status will
+cause the push, pull or unbundle to fail. URL from which changes
+will come is in <tt class="docutils literal">$HG_URL</tt>.</dd>
+<dt><tt class="docutils literal">precommit</tt></dt>
+<dd>Run before starting a local commit. Exit status 0 allows the
+commit to proceed. Non-zero status will cause the commit to fail.
+Parent changeset IDs are in <tt class="docutils literal">$HG_PARENT1</tt> and <tt class="docutils literal">$HG_PARENT2</tt>.</dd>
+<dt><tt class="docutils literal">prelistkeys</tt></dt>
+<dd>Run before listing pushkeys (like bookmarks) in the
+repository. Non-zero status will cause failure. The key namespace is
+in <tt class="docutils literal">$HG_NAMESPACE</tt>.</dd>
+<dt><tt class="docutils literal">preoutgoing</tt></dt>
+<dd>Run before collecting changes to send from the local repository to
+another. Non-zero status will cause failure. This lets you prevent
+pull over HTTP or SSH. Also prevents against local pull, push
+(outbound) or bundle commands, but not effective, since you can
+just copy files instead then. Source of operation is in
+<tt class="docutils literal">$HG_SOURCE</tt>. If &quot;serve&quot;, operation is happening on behalf of remote
+SSH or HTTP repository. If &quot;push&quot;, &quot;pull&quot; or &quot;bundle&quot;, operation
+is happening on behalf of repository on same system.</dd>
+<dt><tt class="docutils literal">prepushkey</tt></dt>
+<dd>Run before a pushkey (like a bookmark) is added to the
+repository. Non-zero status will cause the key to be rejected. The
+key namespace is in <tt class="docutils literal">$HG_NAMESPACE</tt>, the key is in <tt class="docutils literal">$HG_KEY</tt>,
+the old value (if any) is in <tt class="docutils literal">$HG_OLD</tt>, and the new value is in
+<tt class="docutils literal">$HG_NEW</tt>.</dd>
+<dt><tt class="docutils literal">pretag</tt></dt>
+<dd>Run before creating a tag. Exit status 0 allows the tag to be
+created. Non-zero status will cause the tag to fail. ID of
+changeset to tag is in <tt class="docutils literal">$HG_NODE</tt>. Name of tag is in <tt class="docutils literal">$HG_TAG</tt>. Tag is
+local if <tt class="docutils literal">$HG_LOCAL=1</tt>, in repository if <tt class="docutils literal">$HG_LOCAL=0</tt>.</dd>
+<dt><tt class="docutils literal">pretxnchangegroup</tt></dt>
+<dd>Run after a changegroup has been added via push, pull or unbundle,
+but before the transaction has been committed. Changegroup is
+visible to hook program. This lets you validate incoming changes
+before accepting them. Passed the ID of the first new changeset in
+<tt class="docutils literal">$HG_NODE</tt>. Exit status 0 allows the transaction to commit. Non-zero
+status will cause the transaction to be rolled back and the push,
+pull or unbundle will fail. URL that was source of changes is in
+<tt class="docutils literal">$HG_URL</tt>.</dd>
+<dt><tt class="docutils literal">pretxncommit</tt></dt>
+<dd>Run after a changeset has been created but the transaction not yet
+committed. Changeset is visible to hook program. This lets you
+validate commit message and changes. Exit status 0 allows the
+commit to proceed. Non-zero status will cause the transaction to
+be rolled back. ID of changeset is in <tt class="docutils literal">$HG_NODE</tt>. Parent changeset
+IDs are in <tt class="docutils literal">$HG_PARENT1</tt> and <tt class="docutils literal">$HG_PARENT2</tt>.</dd>
+<dt><tt class="docutils literal">preupdate</tt></dt>
+<dd>Run before updating the working directory. Exit status 0 allows
+the update to proceed. Non-zero status will prevent the update.
+Changeset ID of first new parent is in <tt class="docutils literal">$HG_PARENT1</tt>. If merge, ID
+of second new parent is in <tt class="docutils literal">$HG_PARENT2</tt>.</dd>
+<dt><tt class="docutils literal">listkeys</tt></dt>
+<dd>Run after listing pushkeys (like bookmarks) in the repository. The
+key namespace is in <tt class="docutils literal">$HG_NAMESPACE</tt>. <tt class="docutils literal">$HG_VALUES</tt> is a
+dictionary containing the keys and values.</dd>
+<dt><tt class="docutils literal">pushkey</tt></dt>
+<dd>Run after a pushkey (like a bookmark) is added to the
+repository. The key namespace is in <tt class="docutils literal">$HG_NAMESPACE</tt>, the key is in
+<tt class="docutils literal">$HG_KEY</tt>, the old value (if any) is in <tt class="docutils literal">$HG_OLD</tt>, and the new
+value is in <tt class="docutils literal">$HG_NEW</tt>.</dd>
+<dt><tt class="docutils literal">tag</tt></dt>
+<dd>Run after a tag is created. ID of tagged changeset is in <tt class="docutils literal">$HG_NODE</tt>.
+Name of tag is in <tt class="docutils literal">$HG_TAG</tt>. Tag is local if <tt class="docutils literal">$HG_LOCAL=1</tt>, in
+repository if <tt class="docutils literal">$HG_LOCAL=0</tt>.</dd>
+<dt><tt class="docutils literal">update</tt></dt>
+<dd>Run after updating the working directory. Changeset ID of first
+new parent is in <tt class="docutils literal">$HG_PARENT1</tt>. If merge, ID of second new parent is
+in <tt class="docutils literal">$HG_PARENT2</tt>. If the update succeeded, <tt class="docutils literal">$HG_ERROR=0</tt>. If the
+update failed (e.g. because conflicts not resolved), <tt class="docutils literal">$HG_ERROR=1</tt>.</dd>
+</dl>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">It is generally better to use standard hooks rather than the
+generic pre- and post- command hooks as they are guaranteed to be
+called in the appropriate contexts for influencing transactions.
+Also, hooks like &quot;commit&quot; will be called in all contexts that
+generate a commit (e.g. tag) and not just the commit command.</p>
+</div>
+<div class="note">
+<p class="first admonition-title">Note</p>
+<p class="last">Environment variables with empty values may not be passed to
+hooks on platforms such as Windows. As an example, <tt class="docutils literal">$HG_PARENT2</tt>
+will have an empty value under Unix-like platforms for non-merge
+changesets, while it will not be available at all under Windows.</p>
+</div>
+<p>The syntax for Python hooks is as follows:</p>
+<pre class="literal-block">
+hookname = python:modulename.submodule.callable
+hookname = python:/path/to/python/module.py:callable
+</pre>
+<p>Python hooks are run within the Mercurial process. Each hook is
+called with at least three keyword arguments: a ui object (keyword
+<tt class="docutils literal">ui</tt>), a repository object (keyword <tt class="docutils literal">repo</tt>), and a <tt class="docutils literal">hooktype</tt>
+keyword that tells what kind of hook is used. Arguments listed as
+environment variables above are passed as keyword arguments, with no
+<tt class="docutils literal">HG_</tt> prefix, and names in lower case.</p>
+<p>If a Python hook returns a &quot;true&quot; value or raises an exception, this
+is treated as a failure.</p>
+</div>
+<div class="section" id="hostfingerprints">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">hostfingerprints</tt></a></h2>
+<p>Fingerprints of the certificates of known HTTPS servers.
+A HTTPS connection to a server with a fingerprint configured here will
+only succeed if the servers certificate matches the fingerprint.
+This is very similar to how ssh known hosts works.
+The fingerprint is the SHA-1 hash value of the DER encoded certificate.
+The CA chain and web.cacerts is not used for servers with a fingerprint.</p>
+<p>For example:</p>
+<pre class="literal-block">
+[hostfingerprints]
+hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc
+</pre>
+<p>This feature is only supported when using Python 2.6 or later.</p>
+</div>
+<div class="section" id="http-proxy">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">http_proxy</tt></a></h2>
+<p>Used to access web-based Mercurial repositories through a HTTP
+proxy.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">host</tt></dt>
+<dd>Host name and (optional) port of the proxy server, for example
+&quot;myproxy:8000&quot;.</dd>
+<dt><tt class="docutils literal">no</tt></dt>
+<dd>Optional. Comma-separated list of host names that should bypass
+the proxy.</dd>
+<dt><tt class="docutils literal">passwd</tt></dt>
+<dd>Optional. Password to authenticate with at the proxy server.</dd>
+<dt><tt class="docutils literal">user</tt></dt>
+<dd>Optional. User name to authenticate with at the proxy server.</dd>
+<dt><tt class="docutils literal">always</tt></dt>
+<dd>Optional. Always use the proxy, even for localhost and any entries
+in <tt class="docutils literal">http_proxy.no</tt>. True or False. Default: False.</dd>
+</dl>
+</div>
+<div class="section" id="merge-patterns">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal"><span class="pre">merge-patterns</span></tt></a></h2>
+<p>This section specifies merge tools to associate with particular file
+patterns. Tools matched here will take precedence over the default
+merge tool. Patterns are globs by default, rooted at the repository
+root.</p>
+<p>Example:</p>
+<pre class="literal-block">
+[merge-patterns]
+**.c = kdiff3
+**.jpg = myimgmerge
+</pre>
+</div>
+<div class="section" id="merge-tools">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal"><span class="pre">merge-tools</span></tt></a></h2>
+<p>This section configures external merge tools to use for file-level
+merges.</p>
+<p>Example <tt class="docutils literal"><span class="pre">~/.hgrc</span></tt>:</p>
+<pre class="literal-block">
+[merge-tools]
+# Override stock tool location
+kdiff3.executable = ~/bin/kdiff3
+# Specify command line
+kdiff3.args = $base $local $other -o $output
+# Give higher priority
+kdiff3.priority = 1
+
+# Define new tool
+myHtmlTool.args = -m $local $other $base $output
+myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
+myHtmlTool.priority = 1
+</pre>
+<p>Supported arguments:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">priority</tt></dt>
+<dd>The priority in which to evaluate this tool.
+Default: 0.</dd>
+<dt><tt class="docutils literal">executable</tt></dt>
+<dd>Either just the name of the executable or its pathname. On Windows,
+the path can use environment variables with ${ProgramFiles} syntax.
+Default: the tool name.</dd>
+<dt><tt class="docutils literal">args</tt></dt>
+<dd>The arguments to pass to the tool executable. You can refer to the
+files being merged as well as the output file through these
+variables: <tt class="docutils literal">$base</tt>, <tt class="docutils literal">$local</tt>, <tt class="docutils literal">$other</tt>, <tt class="docutils literal">$output</tt>.
+Default: <tt class="docutils literal">$local $base $other</tt></dd>
+<dt><tt class="docutils literal">premerge</tt></dt>
+<dd>Attempt to run internal non-interactive 3-way merge tool before
+launching external tool. Options are <tt class="docutils literal">true</tt>, <tt class="docutils literal">false</tt>, or <tt class="docutils literal">keep</tt>
+to leave markers in the file if the premerge fails.
+Default: True</dd>
+<dt><tt class="docutils literal">binary</tt></dt>
+<dd>This tool can merge binary files. Defaults to False, unless tool
+was selected by file pattern match.</dd>
+<dt><tt class="docutils literal">symlink</tt></dt>
+<dd>This tool can merge symlinks. Defaults to False, even if tool was
+selected by file pattern match.</dd>
+<dt><tt class="docutils literal">check</tt></dt>
+<dd><p class="first">A list of merge success-checking options:</p>
+<dl class="last docutils">
+<dt><tt class="docutils literal">changed</tt></dt>
+<dd>Ask whether merge was successful when the merged file shows no changes.</dd>
+<dt><tt class="docutils literal">conflicts</tt></dt>
+<dd>Check whether there are conflicts even though the tool reported success.</dd>
+<dt><tt class="docutils literal">prompt</tt></dt>
+<dd>Always prompt for merge success, regardless of success reported by tool.</dd>
+</dl>
+</dd>
+<dt><tt class="docutils literal">checkchanged</tt></dt>
+<dd>True is equivalent to <tt class="docutils literal">check = changed</tt>.
+Default: False</dd>
+<dt><tt class="docutils literal">checkconflicts</tt></dt>
+<dd>True is equivalent to <tt class="docutils literal">check = conflicts</tt>.
+Default: False</dd>
+<dt><tt class="docutils literal">fixeol</tt></dt>
+<dd>Attempt to fix up EOL changes caused by the merge tool.
+Default: False</dd>
+<dt><tt class="docutils literal">gui</tt></dt>
+<dd>This tool requires a graphical interface to run. Default: False</dd>
+<dt><tt class="docutils literal">regkey</tt></dt>
+<dd>Windows registry key which describes install location of this
+tool. Mercurial will search for this key first under
+<tt class="docutils literal">HKEY_CURRENT_USER</tt> and then under <tt class="docutils literal">HKEY_LOCAL_MACHINE</tt>.
+Default: None</dd>
+<dt><tt class="docutils literal">regkeyalt</tt></dt>
+<dd>An alternate Windows registry key to try if the first key is not
+found. The alternate key uses the same <tt class="docutils literal">regname</tt> and <tt class="docutils literal">regappend</tt>
+semantics of the primary key. The most common use for this key
+is to search for 32bit applications on 64bit operating systems.
+Default: None</dd>
+<dt><tt class="docutils literal">regname</tt></dt>
+<dd>Name of value to read from specified registry key. Defaults to the
+unnamed (default) value.</dd>
+<dt><tt class="docutils literal">regappend</tt></dt>
+<dd>String to append to the value read from the registry, typically
+the executable name of the tool.
+Default: None</dd>
+</dl>
+</div>
+<div class="section" id="patch">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">patch</tt></a></h2>
+<p>Settings used when applying patches, for instance through the 'import'
+command or with Mercurial Queues extension.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">eol</tt></dt>
+<dd>When set to 'strict' patch content and patched files end of lines
+are preserved. When set to <tt class="docutils literal">lf</tt> or <tt class="docutils literal">crlf</tt>, both files end of
+lines are ignored when patching and the result line endings are
+normalized to either LF (Unix) or CRLF (Windows). When set to
+<tt class="docutils literal">auto</tt>, end of lines are again ignored while patching but line
+endings in patched files are normalized to their original setting
+on a per-file basis. If target file does not exist or has no end
+of line, patch line endings are preserved.
+Default: strict.</dd>
+</dl>
+</div>
+<div class="section" id="paths">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">paths</tt></a></h2>
+<p>Assigns symbolic names to repositories. The left side is the
+symbolic name, and the right gives the directory or URL that is the
+location of the repository. Default paths can be declared by setting
+the following entries.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">default</tt></dt>
+<dd>Directory or URL to use when pulling if no source is specified.
+Default is set to repository from which the current repository was
+cloned.</dd>
+<dt><tt class="docutils literal"><span class="pre">default-push</span></tt></dt>
+<dd>Optional. Directory or URL to use when pushing if no destination
+is specified.</dd>
+</dl>
+</div>
+<div class="section" id="phases">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">phases</tt></a></h2>
+<p>Specifies default handling of phases. See <a class="reference external" href="hg.1.html#phases"><tt class="docutils literal">hg help phases</tt></a> for more
+information about working with phases.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">publish</tt></dt>
+<dd>Controls draft phase behavior when working as a server. When true,
+pushed changesets are set to public in both client and server and
+pulled or cloned changesets are set to public in the client.
+Default: True</dd>
+<dt><tt class="docutils literal"><span class="pre">new-commit</span></tt></dt>
+<dd>Phase of newly-created commits.
+Default: draft</dd>
+</dl>
+</div>
+<div class="section" id="profiling">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">profiling</tt></a></h2>
+<p>Specifies profiling type, format, and file output. Two profilers are
+supported: an instrumenting profiler (named <tt class="docutils literal">ls</tt>), and a sampling
+profiler (named <tt class="docutils literal">stat</tt>).</p>
+<p>In this section description, 'profiling data' stands for the raw data
+collected during profiling, while 'profiling report' stands for a
+statistical text report generated from the profiling data. The
+profiling is done using lsprof.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">type</tt></dt>
+<dd><p class="first">The type of profiler to use.
+Default: ls.</p>
+<dl class="last docutils">
+<dt><tt class="docutils literal">ls</tt></dt>
+<dd>Use Python's built-in instrumenting profiler. This profiler
+works on all platforms, but each line number it reports is the
+first line of a function. This restriction makes it difficult to
+identify the expensive parts of a non-trivial function.</dd>
+<dt><tt class="docutils literal">stat</tt></dt>
+<dd>Use a third-party statistical profiler, statprof. This profiler
+currently runs only on Unix systems, and is most useful for
+profiling commands that run for longer than about 0.1 seconds.</dd>
+</dl>
+</dd>
+<dt><tt class="docutils literal">format</tt></dt>
+<dd><p class="first">Profiling format. Specific to the <tt class="docutils literal">ls</tt> instrumenting profiler.
+Default: text.</p>
+<dl class="last docutils">
+<dt><tt class="docutils literal">text</tt></dt>
+<dd>Generate a profiling report. When saving to a file, it should be
+noted that only the report is saved, and the profiling data is
+not kept.</dd>
+<dt><tt class="docutils literal">kcachegrind</tt></dt>
+<dd>Format profiling data for kcachegrind use: when saving to a
+file, the generated file can directly be loaded into
+kcachegrind.</dd>
+</dl>
+</dd>
+<dt><tt class="docutils literal">frequency</tt></dt>
+<dd>Sampling frequency. Specific to the <tt class="docutils literal">stat</tt> sampling profiler.
+Default: 1000.</dd>
+<dt><tt class="docutils literal">output</tt></dt>
+<dd>File path where profiling data or report should be saved. If the
+file exists, it is replaced. Default: None, data is printed on
+stderr</dd>
+</dl>
+</div>
+<div class="section" id="revsetalias">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">revsetalias</tt></a></h2>
+<p>Alias definitions for revsets. See <a class="reference external" href="hg.1.html#revsets"><tt class="docutils literal">hg help revsets</tt></a> for details.</p>
+</div>
+<div class="section" id="server">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">server</tt></a></h2>
+<p>Controls generic server settings.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">uncompressed</tt></dt>
+<dd>Whether to allow clients to clone a repository using the
+uncompressed streaming protocol. This transfers about 40% more
+data than a regular clone, but uses less memory and CPU on both
+server and client. Over a LAN (100 Mbps or better) or a very fast
+WAN, an uncompressed streaming clone is a lot faster (~10x) than a
+regular clone. Over most WAN connections (anything slower than
+about 6 Mbps), uncompressed streaming is slower, because of the
+extra data transfer overhead. This mode will also temporarily hold
+the write lock while determining what data to transfer.
+Default is True.</dd>
+<dt><tt class="docutils literal">preferuncompressed</tt></dt>
+<dd>When set, clients will try to use the uncompressed streaming
+protocol. Default is False.</dd>
+<dt><tt class="docutils literal">validate</tt></dt>
+<dd>Whether to validate the completeness of pushed changesets by
+checking that all new file revisions specified in manifests are
+present. Default is False.</dd>
+</dl>
+</div>
+<div class="section" id="smtp">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">smtp</tt></a></h2>
+<p>Configuration for extensions that need to send email messages.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">host</tt></dt>
+<dd>Host name of mail server, e.g. &quot;mail.example.com&quot;.</dd>
+<dt><tt class="docutils literal">port</tt></dt>
+<dd>Optional. Port to connect to on mail server. Default: 25.</dd>
+<dt><tt class="docutils literal">tls</tt></dt>
+<dd>Optional. Method to enable TLS when connecting to mail server: starttls,
+smtps or none. Default: none.</dd>
+<dt><tt class="docutils literal">username</tt></dt>
+<dd>Optional. User name for authenticating with the SMTP server.
+Default: none.</dd>
+<dt><tt class="docutils literal">password</tt></dt>
+<dd>Optional. Password for authenticating with the SMTP server. If not
+specified, interactive sessions will prompt the user for a
+password; non-interactive sessions will fail. Default: none.</dd>
+<dt><tt class="docutils literal">local_hostname</tt></dt>
+<dd>Optional. It's the hostname that the sender can use to identify
+itself to the MTA.</dd>
+</dl>
+</div>
+<div class="section" id="subpaths">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">subpaths</tt></a></h2>
+<p>Subrepository source URLs can go stale if a remote server changes name
+or becomes temporarily unavailable. This section lets you define
+rewrite rules of the form:</p>
+<pre class="literal-block">
+&lt;pattern&gt; = &lt;replacement&gt;
+</pre>
+<p>where <tt class="docutils literal">pattern</tt> is a regular expression matching a subrepository
+source URL and <tt class="docutils literal">replacement</tt> is the replacement string used to
+rewrite it. Groups can be matched in <tt class="docutils literal">pattern</tt> and referenced in
+<tt class="docutils literal">replacements</tt>. For instance:</p>
+<pre class="literal-block">
+http://server/(.*)-hg/ = http://hg.server/\1/
+</pre>
+<p>rewrites <tt class="docutils literal"><span class="pre">http://server/foo-hg/</span></tt> into <tt class="docutils literal"><span class="pre">http://hg.server/foo/</span></tt>.</p>
+<p>Relative subrepository paths are first made absolute, and the
+rewrite rules are then applied on the full (absolute) path. The rules
+are applied in definition order.</p>
+</div>
+<div class="section" id="trusted">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">trusted</tt></a></h2>
+<p>Mercurial will not use the settings in the
+<tt class="docutils literal">.hg/hgrc</tt> file from a repository if it doesn't belong to a trusted
+user or to a trusted group, as various hgrc features allow arbitrary
+commands to be run. This issue is often encountered when configuring
+hooks or extensions for shared repositories or servers. However,
+the web interface will use some safe settings from the <tt class="docutils literal">[web]</tt>
+section.</p>
+<p>This section specifies what users and groups are trusted. The
+current user is always trusted. To trust everybody, list a user or a
+group with name <tt class="docutils literal">*</tt>. These settings must be placed in an
+<em>already-trusted file</em> to take effect, such as <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt> of the
+user or service running Mercurial.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">users</tt></dt>
+<dd>Comma-separated list of trusted users.</dd>
+<dt><tt class="docutils literal">groups</tt></dt>
+<dd>Comma-separated list of trusted groups.</dd>
+</dl>
+</div>
+<div class="section" id="ui">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">ui</tt></a></h2>
+<p>User interface controls.</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">archivemeta</tt></dt>
+<dd>Whether to include the .hg_archival.txt file containing meta data
+(hashes for the repository base and for tip) in archives created
+by the <a class="reference external" href="hg.1.html#archive"><tt class="docutils literal">hg archive</tt></a> command or downloaded via hgweb.
+Default is True.</dd>
+<dt><tt class="docutils literal">askusername</tt></dt>
+<dd>Whether to prompt for a username when committing. If True, and
+neither <tt class="docutils literal">$HGUSER</tt> nor <tt class="docutils literal">$EMAIL</tt> has been specified, then the user will
+be prompted to enter a username. If no username is entered, the
+default <tt class="docutils literal">USER&#64;HOST</tt> is used instead.
+Default is False.</dd>
+<dt><tt class="docutils literal">commitsubrepos</tt></dt>
+<dd>Whether to commit modified subrepositories when committing the
+parent repository. If False and one subrepository has uncommitted
+changes, abort the commit.
+Default is False.</dd>
+<dt><tt class="docutils literal">debug</tt></dt>
+<dd>Print debugging information. True or False. Default is False.</dd>
+<dt><tt class="docutils literal">editor</tt></dt>
+<dd>The editor to use during a commit. Default is <tt class="docutils literal">$EDITOR</tt> or <tt class="docutils literal">vi</tt>.</dd>
+<dt><tt class="docutils literal">fallbackencoding</tt></dt>
+<dd>Encoding to try if it's not possible to decode the changelog using
+UTF-8. Default is ISO-8859-1.</dd>
+<dt><tt class="docutils literal">ignore</tt></dt>
+<dd>A file to read per-user ignore patterns from. This file should be
+in the same format as a repository-wide .hgignore file. This
+option supports hook syntax, so if you want to specify multiple
+ignore files, you can do so by setting something like
+<tt class="docutils literal">ignore.other = <span class="pre">~/.hgignore2</span></tt>. For details of the ignore file
+format, see the <tt class="docutils literal">hgignore(5)</tt> man page.</dd>
+<dt><tt class="docutils literal">interactive</tt></dt>
+<dd>Allow to prompt the user. True or False. Default is True.</dd>
+<dt><tt class="docutils literal">logtemplate</tt></dt>
+<dd>Template string for commands that print changesets.</dd>
+<dt><tt class="docutils literal">merge</tt></dt>
+<dd>The conflict resolution program to use during a manual merge.
+For more information on merge tools see <a class="reference external" href="hg.1.html#merge-tools"><tt class="docutils literal">hg help <span class="pre">merge-tools</span></tt></a>.
+For configuring merge tools see the <tt class="docutils literal"><span class="pre">[merge-tools]</span></tt> section.</dd>
+<dt><tt class="docutils literal">portablefilenames</tt></dt>
+<dd>Check for portable filenames. Can be <tt class="docutils literal">warn</tt>, <tt class="docutils literal">ignore</tt> or <tt class="docutils literal">abort</tt>.
+Default is <tt class="docutils literal">warn</tt>.
+If set to <tt class="docutils literal">warn</tt> (or <tt class="docutils literal">true</tt>), a warning message is printed on POSIX
+platforms, if a file with a non-portable filename is added (e.g. a file
+with a name that can't be created on Windows because it contains reserved
+parts like <tt class="docutils literal">AUX</tt>, reserved characters like <tt class="docutils literal">:</tt>, or would cause a case
+collision with an existing file).
+If set to <tt class="docutils literal">ignore</tt> (or <tt class="docutils literal">false</tt>), no warning is printed.
+If set to <tt class="docutils literal">abort</tt>, the command is aborted.
+On Windows, this configuration option is ignored and the command aborted.</dd>
+<dt><tt class="docutils literal">quiet</tt></dt>
+<dd>Reduce the amount of output printed. True or False. Default is False.</dd>
+<dt><tt class="docutils literal">remotecmd</tt></dt>
+<dd>remote command to use for clone/push/pull operations. Default is <tt class="docutils literal">hg</tt>.</dd>
+<dt><tt class="docutils literal">reportoldssl</tt></dt>
+<dd>Warn if an SSL certificate is unable to be due to using Python
+2.5 or earlier. True or False. Default is True.</dd>
+<dt><tt class="docutils literal">report_untrusted</tt></dt>
+<dd>Warn if a <tt class="docutils literal">.hg/hgrc</tt> file is ignored due to not being owned by a
+trusted user or group. True or False. Default is True.</dd>
+<dt><tt class="docutils literal">slash</tt></dt>
+<dd>Display paths using a slash (<tt class="docutils literal">/</tt>) as the path separator. This
+only makes a difference on systems where the default path
+separator is not the slash character (e.g. Windows uses the
+backslash character (<tt class="docutils literal">\</tt>)).
+Default is False.</dd>
+<dt><tt class="docutils literal">ssh</tt></dt>
+<dd>command to use for SSH connections. Default is <tt class="docutils literal">ssh</tt>.</dd>
+<dt><tt class="docutils literal">strict</tt></dt>
+<dd>Require exact command names, instead of allowing unambiguous
+abbreviations. True or False. Default is False.</dd>
+<dt><tt class="docutils literal">style</tt></dt>
+<dd>Name of style to use for command output.</dd>
+<dt><tt class="docutils literal">timeout</tt></dt>
+<dd>The timeout used when a lock is held (in seconds), a negative value
+means no timeout. Default is 600.</dd>
+<dt><tt class="docutils literal">traceback</tt></dt>
+<dd>Mercurial always prints a traceback when an unknown exception
+occurs. Setting this to True will make Mercurial print a traceback
+on all exceptions, even those recognized by Mercurial (such as
+IOError or MemoryError). Default is False.</dd>
+<dt><tt class="docutils literal">username</tt></dt>
+<dd>The committer of a changeset created when running &quot;commit&quot;.
+Typically a person's name and email address, e.g. <tt class="docutils literal">Fred Widget
+&lt;fred&#64;example.com&gt;</tt>. Default is <tt class="docutils literal">$EMAIL</tt> or <tt class="docutils literal">username&#64;hostname</tt>. If
+the username in hgrc is empty, it has to be specified manually or
+in a different hgrc file (e.g. <tt class="docutils literal"><span class="pre">$HOME/.hgrc</span></tt>, if the admin set
+<tt class="docutils literal">username =</tt> in the system hgrc). Environment variables in the
+username are expanded.</dd>
+<dt><tt class="docutils literal">verbose</tt></dt>
+<dd>Increase the amount of output printed. True or False. Default is False.</dd>
+</dl>
+</div>
+<div class="section" id="web">
+<h2><a class="toc-backref" href="#contents"><tt class="docutils literal">web</tt></a></h2>
+<p>Web interface configuration. The settings in this section apply to
+both the builtin webserver (started by <a class="reference external" href="hg.1.html#serve"><tt class="docutils literal">hg serve</tt></a>) and the script you
+run through a webserver (<tt class="docutils literal">hgweb.cgi</tt> and the derivatives for FastCGI
+and WSGI).</p>
+<p>The Mercurial webserver does no authentication (it does not prompt for
+usernames and passwords to validate <em>who</em> users are), but it does do
+authorization (it grants or denies access for <em>authenticated users</em>
+based on settings in this section). You must either configure your
+webserver to do authentication for you, or disable the authorization
+checks.</p>
+<p>For a quick setup in a trusted environment, e.g., a private LAN, where
+you want it to accept pushes from anybody, you can use the following
+command line:</p>
+<pre class="literal-block">
+$ hg --config web.allow_push=* --config web.push_ssl=False serve
+</pre>
+<p>Note that this will allow anybody to push anything to the server and
+that this should not be used for public servers.</p>
+<p>The full set of options is:</p>
+<dl class="docutils">
+<dt><tt class="docutils literal">accesslog</tt></dt>
+<dd>Where to output the access log. Default is stdout.</dd>
+<dt><tt class="docutils literal">address</tt></dt>
+<dd>Interface address to bind to. Default is all.</dd>
+<dt><tt class="docutils literal">allow_archive</tt></dt>
+<dd>List of archive format (bz2, gz, zip) allowed for downloading.
+Default is empty.</dd>
+<dt><tt class="docutils literal">allowbz2</tt></dt>
+<dd>(DEPRECATED) Whether to allow .tar.bz2 downloading of repository
+revisions.
+Default is False.</dd>
+<dt><tt class="docutils literal">allowgz</tt></dt>
+<dd>(DEPRECATED) Whether to allow .tar.gz downloading of repository
+revisions.
+Default is False.</dd>
+<dt><tt class="docutils literal">allowpull</tt></dt>
+<dd>Whether to allow pulling from the repository. Default is True.</dd>
+<dt><tt class="docutils literal">allow_push</tt></dt>
+<dd>Whether to allow pushing to the repository. If empty or not set,
+push is not allowed. If the special value <tt class="docutils literal">*</tt>, any remote user can
+push, including unauthenticated users. Otherwise, the remote user
+must have been authenticated, and the authenticated user name must
+be present in this list. The contents of the allow_push list are
+examined after the deny_push list.</dd>
+<dt><tt class="docutils literal">allow_read</tt></dt>
+<dd>If the user has not already been denied repository access due to
+the contents of deny_read, this list determines whether to grant
+repository access to the user. If this list is not empty, and the
+user is unauthenticated or not present in the list, then access is
+denied for the user. If the list is empty or not set, then access
+is permitted to all users by default. Setting allow_read to the
+special value <tt class="docutils literal">*</tt> is equivalent to it not being set (i.e. access
+is permitted to all users). The contents of the allow_read list are
+examined after the deny_read list.</dd>
+<dt><tt class="docutils literal">allowzip</tt></dt>
+<dd>(DEPRECATED) Whether to allow .zip downloading of repository
+revisions. Default is False. This feature creates temporary files.</dd>
+<dt><tt class="docutils literal">baseurl</tt></dt>
+<dd>Base URL to use when publishing URLs in other locations, so
+third-party tools like email notification hooks can construct
+URLs. Example: <tt class="docutils literal"><span class="pre">http://hgserver/repos/</span></tt>.</dd>
+<dt><tt class="docutils literal">cacerts</tt></dt>
+<dd><p class="first">Path to file containing a list of PEM encoded certificate
+authority certificates. Environment variables and <tt class="docutils literal">~user</tt>
+constructs are expanded in the filename. If specified on the
+client, then it will verify the identity of remote HTTPS servers
+with these certificates.</p>
+<p>This feature is only supported when using Python 2.6 or later. If you wish
+to use it with earlier versions of Python, install the backported
+version of the ssl library that is available from
+<tt class="docutils literal"><span class="pre">http://pypi.python.org</span></tt>.</p>
+<p>To disable SSL verification temporarily, specify <tt class="docutils literal"><span class="pre">--insecure</span></tt> from
+command line.</p>
+<p>You can use OpenSSL's CA certificate file if your platform has
+one. On most Linux systems this will be
+<tt class="docutils literal"><span class="pre">/etc/ssl/certs/ca-certificates.crt</span></tt>. Otherwise you will have to
+generate this file manually. The form must be as follows:</p>
+<pre class="last literal-block">
+-----BEGIN CERTIFICATE-----
+... (certificate in base64 PEM encoding) ...
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+... (certificate in base64 PEM encoding) ...
+-----END CERTIFICATE-----
+</pre>
+</dd>
+<dt><tt class="docutils literal">cache</tt></dt>
+<dd>Whether to support caching in hgweb. Defaults to True.</dd>
+<dt><tt class="docutils literal">collapse</tt></dt>
+<dd>With <tt class="docutils literal">descend</tt> enabled, repositories in subdirectories are shown at
+a single level alongside repositories in the current path. With
+<tt class="docutils literal">collapse</tt> also enabled, repositories residing at a deeper level than
+the current path are grouped behind navigable directory entries that
+lead to the locations of these repositories. In effect, this setting
+collapses each collection of repositories found within a subdirectory
+into a single entry for that subdirectory. Default is False.</dd>
+<dt><tt class="docutils literal">comparisoncontext</tt></dt>
+<dd>Number of lines of context to show in side-by-side file comparison. If
+negative or the value <tt class="docutils literal">full</tt>, whole files are shown. Default is 5.
+This setting can be overridden by a <tt class="docutils literal">context</tt> request parameter to the
+<tt class="docutils literal">comparison</tt> command, taking the same values.</dd>
+<dt><tt class="docutils literal">contact</tt></dt>
+<dd>Name or email address of the person in charge of the repository.
+Defaults to ui.username or <tt class="docutils literal">$EMAIL</tt> or &quot;unknown&quot; if unset or empty.</dd>
+<dt><tt class="docutils literal">deny_push</tt></dt>
+<dd>Whether to deny pushing to the repository. If empty or not set,
+push is not denied. If the special value <tt class="docutils literal">*</tt>, all remote users are
+denied push. Otherwise, unauthenticated users are all denied, and
+any authenticated user name present in this list is also denied. The
+contents of the deny_push list are examined before the allow_push list.</dd>
+<dt><tt class="docutils literal">deny_read</tt></dt>
+<dd>Whether to deny reading/viewing of the repository. If this list is
+not empty, unauthenticated users are all denied, and any
+authenticated user name present in this list is also denied access to
+the repository. If set to the special value <tt class="docutils literal">*</tt>, all remote users
+are denied access (rarely needed ;). If deny_read is empty or not set,
+the determination of repository access depends on the presence and
+content of the allow_read list (see description). If both
+deny_read and allow_read are empty or not set, then access is
+permitted to all users by default. If the repository is being
+served via hgwebdir, denied users will not be able to see it in
+the list of repositories. The contents of the deny_read list have
+priority over (are examined before) the contents of the allow_read
+list.</dd>
+<dt><tt class="docutils literal">descend</tt></dt>
+<dd>hgwebdir indexes will not descend into subdirectories. Only repositories
+directly in the current path will be shown (other repositories are still
+available from the index corresponding to their containing path).</dd>
+<dt><tt class="docutils literal">description</tt></dt>
+<dd>Textual description of the repository's purpose or contents.
+Default is &quot;unknown&quot;.</dd>
+<dt><tt class="docutils literal">encoding</tt></dt>
+<dd>Character encoding name. Default is the current locale charset.
+Example: &quot;UTF-8&quot;</dd>
+<dt><tt class="docutils literal">errorlog</tt></dt>
+<dd>Where to output the error log. Default is stderr.</dd>
+<dt><tt class="docutils literal">guessmime</tt></dt>
+<dd>Control MIME types for raw download of file content.
+Set to True to let hgweb guess the content type from the file
+extension. This will serve HTML files as <tt class="docutils literal">text/html</tt> and might
+allow cross-site scripting attacks when serving untrusted
+repositories. Default is False.</dd>
+<dt><tt class="docutils literal">hidden</tt></dt>
+<dd>Whether to hide the repository in the hgwebdir index.
+Default is False.</dd>
+<dt><tt class="docutils literal">ipv6</tt></dt>
+<dd>Whether to use IPv6. Default is False.</dd>
+<dt><tt class="docutils literal">logoimg</tt></dt>
+<dd>File name of the logo image that some templates display on each page.
+The file name is relative to <tt class="docutils literal">staticurl</tt>. That is, the full path to
+the logo image is &quot;staticurl/logoimg&quot;.
+If unset, <tt class="docutils literal">hglogo.png</tt> will be used.</dd>
+<dt><tt class="docutils literal">logourl</tt></dt>
+<dd>Base URL to use for logos. If unset, <tt class="docutils literal"><span class="pre">http://mercurial.selenic.com/</span></tt>
+will be used.</dd>
+<dt><tt class="docutils literal">maxchanges</tt></dt>
+<dd>Maximum number of changes to list on the changelog. Default is 10.</dd>
+<dt><tt class="docutils literal">maxfiles</tt></dt>
+<dd>Maximum number of files to list per changeset. Default is 10.</dd>
+<dt><tt class="docutils literal">maxshortchanges</tt></dt>
+<dd>Maximum number of changes to list on the shortlog, graph or filelog
+pages. Default is 60.</dd>
+<dt><tt class="docutils literal">name</tt></dt>
+<dd>Repository name to use in the web interface. Default is current
+working directory.</dd>
+<dt><tt class="docutils literal">port</tt></dt>
+<dd>Port to listen on. Default is 8000.</dd>
+<dt><tt class="docutils literal">prefix</tt></dt>
+<dd>Prefix path to serve from. Default is '' (server root).</dd>
+<dt><tt class="docutils literal">push_ssl</tt></dt>
+<dd>Whether to require that inbound pushes be transported over SSL to
+prevent password sniffing. Default is True.</dd>
+<dt><tt class="docutils literal">staticurl</tt></dt>
+<dd>Base URL to use for static files. If unset, static files (e.g. the
+hgicon.png favicon) will be served by the CGI script itself. Use
+this setting to serve them directly with the HTTP server.
+Example: <tt class="docutils literal"><span class="pre">http://hgserver/static/</span></tt>.</dd>
+<dt><tt class="docutils literal">stripes</tt></dt>
+<dd>How many lines a &quot;zebra stripe&quot; should span in multiline output.
+Default is 1; set to 0 to disable.</dd>
+<dt><tt class="docutils literal">style</tt></dt>
+<dd>Which template map style to use.</dd>
+<dt><tt class="docutils literal">templates</tt></dt>
+<dd>Where to find the HTML templates. Default is install path.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="author">
+<h1><a class="toc-backref" href="#contents">Author</a></h1>
+<p>Bryan O'Sullivan &lt;<a class="reference external" href="mailto:bos&#64;serpentine.com">bos&#64;serpentine.com</a>&gt;.</p>
+<p>Mercurial was written by Matt Mackall &lt;<a class="reference external" href="mailto:mpm&#64;selenic.com">mpm&#64;selenic.com</a>&gt;.</p>
+</div>
+<div class="section" id="see-also">
+<h1><a class="toc-backref" href="#contents">See Also</a></h1>
+<p><a class="reference external" href="hg.1.html"><strong>hg</strong>(1)</a>, <a class="reference external" href="hgignore.5.html"><strong>hgignore</strong>(5)</a></p>
+</div>
+<div class="section" id="copying">
+<h1><a class="toc-backref" href="#contents">Copying</a></h1>
+<p>This manual page is copyright 2005 Bryan O'Sullivan.
+Mercurial is copyright 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.</p>
+<!-- Common link and substitution definitions. -->
+</div>
+</div>
+</body>
+</html>
diff --git a/doc/hgrc.5.txt b/doc/hgrc.5.txt
new file mode 100644
index 0000000..e6adaf3
--- /dev/null
+++ b/doc/hgrc.5.txt
@@ -0,0 +1,41 @@
+======
+ hgrc
+======
+
+---------------------------------
+configuration files for Mercurial
+---------------------------------
+
+:Author: Bryan O'Sullivan <bos@serpentine.com>
+:Organization: Mercurial
+:Manual section: 5
+:Manual group: Mercurial Manual
+
+.. contents::
+ :backlinks: top
+ :class: htmlonly
+
+
+Synopsis
+========
+
+.. include:: ../mercurial/help/config.txt
+
+Author
+======
+Bryan O'Sullivan <bos@serpentine.com>.
+
+Mercurial was written by Matt Mackall <mpm@selenic.com>.
+
+See Also
+========
+|hg(1)|_, |hgignore(5)|_
+
+Copying
+=======
+This manual page is copyright 2005 Bryan O'Sullivan.
+Mercurial is copyright 2005-2012 Matt Mackall.
+Free use of this software is granted under the terms of the GNU General
+Public License version 2 or any later version.
+
+.. include:: common.txt
diff --git a/doc/runrst b/doc/runrst
new file mode 100755
index 0000000..8c9d222
--- /dev/null
+++ b/doc/runrst
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+#
+# runrst - register custom roles and run correct writer
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""usage: %s WRITER args...
+
+where WRITER is the name of a Docutils writer such as 'html' or 'manpage'
+"""
+
+import sys
+try:
+ from docutils.parsers.rst import roles
+ from docutils.core import publish_cmdline
+ from docutils import nodes, utils
+except ImportError:
+ sys.stderr.write("abort: couldn't generate documentation: docutils "
+ "module is missing\n")
+ sys.stderr.write("please install python-docutils or see "
+ "http://docutils.sourceforge.net/\n")
+ sys.exit(-1)
+
+def role_hg(name, rawtext, text, lineno, inliner,
+ options={}, content=[]):
+ text = "hg " + utils.unescape(text)
+ linktext = nodes.literal(rawtext, text)
+ parts = text.split()
+ cmd, args = parts[1], parts[2:]
+ if cmd == 'help' and args:
+ cmd = args[0] # link to 'dates' for 'hg help dates'
+ node = nodes.reference(rawtext, '', linktext,
+ refuri="hg.1.html#%s" % cmd)
+ return [node], []
+
+roles.register_local_role("hg", role_hg)
+
+if __name__ == "__main__":
+ if len(sys.argv) < 2:
+ sys.stderr.write(__doc__ % sys.argv[0])
+ sys.exit(1)
+
+ writer = sys.argv[1]
+ del sys.argv[1]
+
+ publish_cmdline(writer_name=writer)
diff --git a/doc/style.css b/doc/style.css
new file mode 100644
index 0000000..a35be2b
--- /dev/null
+++ b/doc/style.css
@@ -0,0 +1,309 @@
+/*
+ * Styles for man pages, which match with http://mercurial.selenic.com/
+ *
+ * Color scheme & layout are borrowed from
+ * http://mercurial.selenic.com/css/styles.css
+ *
+ * Some styles are from html4css1.css from Docutils, which is in the
+ * public domain.
+ */
+
+body {
+ margin: 0;
+ padding: 0;
+ font-family: sans-serif;
+}
+
+.document {
+ position: relative; /* be a top of absolute positioning */
+ margin: 1.5em 1.8em;
+ padding: 0;
+ line-height: 1.3;
+}
+
+/* layout: toc to right */
+#contents {
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 26%;
+}
+
+/* layout: others to left */
+h1.title, h2.subtitle, .section { width: 72%; }
+.section .section { width: auto; }
+table.docinfo { max-width: 72%; }
+
+/* headings */
+h1, h2, .topic-title, .admonition-title {
+ font-family: "MgOpen Cosmetica", "Lucida Sans Unicode", sans-serif;
+ font-weight: normal;
+}
+h1, h2, .topic-title, .admonition-title {
+ margin: 1em 0 0.5em;
+}
+h1.title { font-size: 300%; }
+h2.subtitle, h1 { font-size: 200%; }
+h2, .topic-title, .admonition-title { font-size: 140%; }
+
+/* subtitle starts with lowercase in man pages, but not in HTML */
+h2.subtitle:first-letter { text-transform: uppercase; }
+
+/* override first/last margin */
+.first, h1.title, h2.subtitle { margin-top: 0 !important; }
+.last, .with-subtitle { margin-bottom: 0 !important; }
+
+blockquote, pre, dd .option-list, .field-list {
+ margin: 0.2em 0 1em 2em;
+}
+
+kbd, tt, pre { font-family: monospace; }
+
+dt { font-weight: bold; }
+dd { margin-bottom: 0.5em; }
+
+th, td { padding: 0.1em 0.2em; border: 0 none; }
+th { font-weight: bold; text-align: left; }
+
+a:link, a:visited { text-decoration: underline; }
+a:hover, a:focus { text-decoration: none; }
+a:link { color: #00b5f1; }
+a:visited { color: #5c9caf; }
+a:link.toc-backref, a:visited.toc-backref {
+ text-decoration: none;
+ color: inherit; /* NOTE: `inherit' is not supported by IE6 */
+}
+
+div.admonition, div.attention, div.caution,
+div.danger, div.error, div.hint, div.important,
+div.note, div.tip, div.warning {
+ border-top: 1px #ccc solid;
+ border-bottom: 1px #ccc solid;
+ padding: 0.3em 1em;
+ margin: 1em;
+}
+
+div.note {
+ border-color: #fcc200;
+}
+
+
+/*
+ * The following styles are from Docutils.
+ * Please refine if necessary.
+ */
+
+table.borderless td, table.borderless th {
+ /* Override padding for "table.docutils td" with "! important".
+ The right padding separates the table cells. */
+ padding: 0 0.5em 0 0 ! important;
+}
+
+.hidden {
+ display: none;
+}
+
+blockquote.epigraph {
+ margin: 2em 5em;
+}
+
+div.abstract {
+ margin: 2em 5em;
+}
+
+div.dedication {
+ margin: 2em 5em;
+ text-align: center;
+ font-style: italic;
+}
+
+div.figure {
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+div.footer, div.header {
+ clear: both;
+ font-size: smaller;
+}
+
+div.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+div.line-block div.line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: medium outset;
+ padding: 1em;
+ background-color: #ffffee;
+ width: 40%;
+ float: right;
+ clear: right;
+}
+
+div.sidebar p.rubric {
+ font-family: sans-serif;
+ font-size: medium;
+}
+
+div.system-messages {
+ margin: 5em;
+}
+
+div.system-messages h1 {
+ color: red;
+}
+
+div.system-message {
+ border: medium outset;
+ padding: 1em;
+}
+
+div.system-message p.system-message-title {
+ color: red;
+ font-weight: bold;
+}
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+ margin-top: 0.4em;
+}
+
+hr.docutils {
+ width: 75%;
+}
+
+img.align-left {
+ clear: left;
+}
+
+img.align-right {
+ clear: right;
+}
+
+ol.simple, ul.simple {
+ margin-bottom: 1em;
+}
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+p.attribution {
+ text-align: right;
+ margin-left: 50%;
+}
+
+p.caption {
+ font-style: italic;
+}
+
+p.credits {
+ font-style: italic;
+ font-size: smaller;
+}
+
+p.label {
+ white-space: nowrap;
+}
+
+p.rubric {
+ font-weight: bold;
+ font-size: larger;
+ color: maroon;
+ text-align: center;
+}
+
+pre.address {
+ margin-bottom: 0;
+ margin-top: 0;
+ font-family: serif;
+ font-size: 100%;
+}
+
+pre.literal-block, pre.doctest-block {
+ margin-left: 2em;
+ margin-right: 2em;
+}
+
+span.classifier {
+ font-family: sans-serif;
+ font-style: oblique;
+}
+
+span.classifier-delimiter {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+
+span.interpreted {
+ font-family: sans-serif;
+}
+
+span.option {
+ white-space: nowrap;
+}
+
+span.pre {
+ white-space: pre;
+}
+
+span.problematic {
+ color: red;
+}
+
+span.section-subtitle {
+ /* font-size relative to parent (h1..h6 element) */
+ font-size: 80%;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.footnote {
+ border-left: solid 1px black;
+ margin-left: 1px;
+}
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+ font-size: 100%;
+}
+
+ul.auto-toc {
+ list-style-type: none;
+}
+
+div.contents.local {
+ -moz-column-width: 10em;
+ -moz-column-gap: 1em;
+
+ -webkit-column-width: 10em;
+ -webkit-column-gap: 1em;
+}
diff --git a/hg b/hg
new file mode 100755
index 0000000..712b33f
--- /dev/null
+++ b/hg
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+#
+# mercurial - scalable distributed SCM
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+import sys
+
+libdir = '@LIBDIR@'
+
+if libdir != '@' 'LIBDIR' '@':
+ if not os.path.isabs(libdir):
+ libdir = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+ libdir)
+ libdir = os.path.abspath(libdir)
+ sys.path.insert(0, libdir)
+
+# enable importing on demand to reduce startup time
+try:
+ from mercurial import demandimport; demandimport.enable()
+except ImportError:
+ import sys
+ sys.stderr.write("abort: couldn't find mercurial libraries in [%s]\n" %
+ ' '.join(sys.path))
+ sys.stderr.write("(check your install and PYTHONPATH)\n")
+ sys.exit(-1)
+
+import mercurial.util
+import mercurial.dispatch
+
+for fp in (sys.stdin, sys.stdout, sys.stderr):
+ mercurial.util.setbinary(fp)
+
+mercurial.dispatch.run()
diff --git a/hgeditor b/hgeditor
new file mode 100755
index 0000000..e8fce73
--- /dev/null
+++ b/hgeditor
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# This is an example of using HGEDITOR to create of diff to review the
+# changes while commiting.
+
+# If you want to pass your favourite editor some other parameters
+# only for Mercurial, modify this:
+case "${EDITOR}" in
+ "")
+ EDITOR="vi"
+ ;;
+ emacs)
+ EDITOR="$EDITOR -nw"
+ ;;
+ gvim|vim)
+ EDITOR="$EDITOR -f -o"
+ ;;
+esac
+
+
+HGTMP=""
+cleanup_exit() {
+ rm -rf "$HGTMP"
+}
+
+# Remove temporary files even if we get interrupted
+trap "cleanup_exit" 0 # normal exit
+trap "exit 255" HUP INT QUIT ABRT TERM
+
+HGTMP=$(mktemp -d ${TMPDIR-/tmp}/hgeditor.XXXXXX)
+[ x$HGTMP != x -a -d $HGTMP ] || {
+ echo "Could not create temporary directory! Exiting." 1>&2
+ exit 1
+}
+
+(
+ grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
+ "$HG" diff "$changed" >> "$HGTMP/diff"
+ done
+)
+
+cat "$1" > "$HGTMP/msg"
+
+MD5=$(which md5sum 2>/dev/null) || \
+ MD5=$(which md5 2>/dev/null)
+[ -x "${MD5}" ] && CHECKSUM=`${MD5} "$HGTMP/msg"`
+if [ -s "$HGTMP/diff" ]; then
+ $EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $?
+else
+ $EDITOR "$HGTMP/msg" || exit $?
+fi
+[ -x "${MD5}" ] && (echo "$CHECKSUM" | ${MD5} -c >/dev/null 2>&1 && exit 13)
+
+mv "$HGTMP/msg" "$1"
+
+exit $?
diff --git a/hgext/__init__.py b/hgext/__init__.py
new file mode 100644
index 0000000..fdffa2a
--- /dev/null
+++ b/hgext/__init__.py
@@ -0,0 +1 @@
+# placeholder
diff --git a/hgext/acl.py b/hgext/acl.py
new file mode 100644
index 0000000..2bf41aa
--- /dev/null
+++ b/hgext/acl.py
@@ -0,0 +1,316 @@
+# acl.py - changeset access control for mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''hooks for controlling repository access
+
+This hook makes it possible to allow or deny write access to given
+branches and paths of a repository when receiving incoming changesets
+via pretxnchangegroup and pretxncommit.
+
+The authorization is matched based on the local user name on the
+system where the hook runs, and not the committer of the original
+changeset (since the latter is merely informative).
+
+The acl hook is best used along with a restricted shell like hgsh,
+preventing authenticating users from doing anything other than pushing
+or pulling. The hook is not safe to use if users have interactive
+shell access, as they can then disable the hook. Nor is it safe if
+remote users share an account, because then there is no way to
+distinguish them.
+
+The order in which access checks are performed is:
+
+1) Deny list for branches (section ``acl.deny.branches``)
+2) Allow list for branches (section ``acl.allow.branches``)
+3) Deny list for paths (section ``acl.deny``)
+4) Allow list for paths (section ``acl.allow``)
+
+The allow and deny sections take key-value pairs.
+
+Branch-based Access Control
+---------------------------
+
+Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to
+have branch-based access control. Keys in these sections can be
+either:
+
+- a branch name, or
+- an asterisk, to match any branch;
+
+The corresponding values can be either:
+
+- a comma-separated list containing users and groups, or
+- an asterisk, to match anyone;
+
+You can add the "!" prefix to a user or group name to invert the sense
+of the match.
+
+Path-based Access Control
+-------------------------
+
+Use the ``acl.deny`` and ``acl.allow`` sections to have path-based
+access control. Keys in these sections accept a subtree pattern (with
+a glob syntax by default). The corresponding values follow the same
+syntax as the other sections above.
+
+Groups
+------
+
+Group names must be prefixed with an ``@`` symbol. Specifying a group
+name has the same effect as specifying all the users in that group.
+
+You can define group members in the ``acl.groups`` section.
+If a group name is not defined there, and Mercurial is running under
+a Unix-like system, the list of users will be taken from the OS.
+Otherwise, an exception will be raised.
+
+Example Configuration
+---------------------
+
+::
+
+ [hooks]
+
+ # Use this if you want to check access restrictions at commit time
+ pretxncommit.acl = python:hgext.acl.hook
+
+ # Use this if you want to check access restrictions for pull, push,
+ # bundle and serve.
+ pretxnchangegroup.acl = python:hgext.acl.hook
+
+ [acl]
+ # Allow or deny access for incoming changes only if their source is
+ # listed here, let them pass otherwise. Source is "serve" for all
+ # remote access (http or ssh), "push", "pull" or "bundle" when the
+ # related commands are run locally.
+ # Default: serve
+ sources = serve
+
+ [acl.deny.branches]
+
+ # Everyone is denied to the frozen branch:
+ frozen-branch = *
+
+ # A bad user is denied on all branches:
+ * = bad-user
+
+ [acl.allow.branches]
+
+ # A few users are allowed on branch-a:
+ branch-a = user-1, user-2, user-3
+
+ # Only one user is allowed on branch-b:
+ branch-b = user-1
+
+ # The super user is allowed on any branch:
+ * = super-user
+
+ # Everyone is allowed on branch-for-tests:
+ branch-for-tests = *
+
+ [acl.deny]
+ # This list is checked first. If a match is found, acl.allow is not
+ # checked. All users are granted access if acl.deny is not present.
+ # Format for both lists: glob pattern = user, ..., @group, ...
+
+ # To match everyone, use an asterisk for the user:
+ # my/glob/pattern = *
+
+ # user6 will not have write access to any file:
+ ** = user6
+
+ # Group "hg-denied" will not have write access to any file:
+ ** = @hg-denied
+
+ # Nobody will be able to change "DONT-TOUCH-THIS.txt", despite
+ # everyone being able to change all other files. See below.
+ src/main/resources/DONT-TOUCH-THIS.txt = *
+
+ [acl.allow]
+ # if acl.allow is not present, all users are allowed by default
+ # empty acl.allow = no users allowed
+
+ # User "doc_writer" has write access to any file under the "docs"
+ # folder:
+ docs/** = doc_writer
+
+ # User "jack" and group "designers" have write access to any file
+ # under the "images" folder:
+ images/** = jack, @designers
+
+ # Everyone (except for "user6" and "@hg-denied" - see acl.deny above)
+ # will have write access to any file under the "resources" folder
+ # (except for 1 file. See acl.deny):
+ src/main/resources/** = *
+
+ .hgtags = release_engineer
+
+Examples using the "!" prefix
+.............................
+
+Suppose there's a branch that only a given user (or group) should be able to
+push to, and you don't want to restrict access to any other branch that may
+be created.
+
+The "!" prefix allows you to prevent anyone except a given user or group to
+push changesets in a given branch or path.
+
+In the examples below, we will:
+1) Deny access to branch "ring" to anyone but user "gollum"
+2) Deny access to branch "lake" to anyone but members of the group "hobbit"
+3) Deny access to a file to anyone but user "gollum"
+
+::
+
+ [acl.allow.branches]
+ # Empty
+
+ [acl.deny.branches]
+
+ # 1) only 'gollum' can commit to branch 'ring';
+ # 'gollum' and anyone else can still commit to any other branch.
+ ring = !gollum
+
+ # 2) only members of the group 'hobbit' can commit to branch 'lake';
+ # 'hobbit' members and anyone else can still commit to any other branch.
+ lake = !@hobbit
+
+ # You can also deny access based on file paths:
+
+ [acl.allow]
+ # Empty
+
+ [acl.deny]
+ # 3) only 'gollum' can change the file below;
+ # 'gollum' and anyone else can still change any other file.
+ /misty/mountains/cave/ring = !gollum
+
+'''
+
+from mercurial.i18n import _
+from mercurial import util, match
+import getpass, urllib
+
+testedwith = 'internal'
+
+def _getusers(ui, group):
+
+ # First, try to use group definition from section [acl.groups]
+ hgrcusers = ui.configlist('acl.groups', group)
+ if hgrcusers:
+ return hgrcusers
+
+ ui.debug('acl: "%s" not defined in [acl.groups]\n' % group)
+ # If no users found in group definition, get users from OS-level group
+ try:
+ return util.groupmembers(group)
+ except KeyError:
+ raise util.Abort(_("group '%s' is undefined") % group)
+
+def _usermatch(ui, user, usersorgroups):
+
+ if usersorgroups == '*':
+ return True
+
+ for ug in usersorgroups.replace(',', ' ').split():
+
+ if ug.startswith('!'):
+ # Test for excluded user or group. Format:
+ # if ug is a user name: !username
+ # if ug is a group name: !@groupname
+ ug = ug[1:]
+ if not ug.startswith('@') and user != ug \
+ or ug.startswith('@') and user not in _getusers(ui, ug[1:]):
+ return True
+
+ # Test for user or group. Format:
+ # if ug is a user name: username
+ # if ug is a group name: @groupname
+ elif user == ug \
+ or ug.startswith('@') and user in _getusers(ui, ug[1:]):
+ return True
+
+ return False
+
+def buildmatch(ui, repo, user, key):
+ '''return tuple of (match function, list enabled).'''
+ if not ui.has_section(key):
+ ui.debug('acl: %s not enabled\n' % key)
+ return None
+
+ pats = [pat for pat, users in ui.configitems(key)
+ if _usermatch(ui, user, users)]
+ ui.debug('acl: %s enabled, %d entries for user %s\n' %
+ (key, len(pats), user))
+
+ # Branch-based ACL
+ if not repo:
+ if pats:
+ # If there's an asterisk (meaning "any branch"), always return True;
+ # Otherwise, test if b is in pats
+ if '*' in pats:
+ return util.always
+ return lambda b: b in pats
+ return util.never
+
+ # Path-based ACL
+ if pats:
+ return match.match(repo.root, '', pats)
+ return util.never
+
+def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
+ if hooktype not in ['pretxnchangegroup', 'pretxncommit']:
+ raise util.Abort(_('config error - hook type "%s" cannot stop '
+ 'incoming changesets nor commits') % hooktype)
+ if (hooktype == 'pretxnchangegroup' and
+ source not in ui.config('acl', 'sources', 'serve').split()):
+ ui.debug('acl: changes have source "%s" - skipping\n' % source)
+ return
+
+ user = None
+ if source == 'serve' and 'url' in kwargs:
+ url = kwargs['url'].split(':')
+ if url[0] == 'remote' and url[1].startswith('http'):
+ user = urllib.unquote(url[3])
+
+ if user is None:
+ user = getpass.getuser()
+
+ ui.debug('acl: checking access for user "%s"\n' % user)
+
+ cfg = ui.config('acl', 'config')
+ if cfg:
+ ui.readconfig(cfg, sections = ['acl.groups', 'acl.allow.branches',
+ 'acl.deny.branches', 'acl.allow', 'acl.deny'])
+
+ allowbranches = buildmatch(ui, None, user, 'acl.allow.branches')
+ denybranches = buildmatch(ui, None, user, 'acl.deny.branches')
+ allow = buildmatch(ui, repo, user, 'acl.allow')
+ deny = buildmatch(ui, repo, user, 'acl.deny')
+
+ for rev in xrange(repo[node], len(repo)):
+ ctx = repo[rev]
+ branch = ctx.branch()
+ if denybranches and denybranches(branch):
+ raise util.Abort(_('acl: user "%s" denied on branch "%s"'
+ ' (changeset "%s")')
+ % (user, branch, ctx))
+ if allowbranches and not allowbranches(branch):
+ raise util.Abort(_('acl: user "%s" not allowed on branch "%s"'
+ ' (changeset "%s")')
+ % (user, branch, ctx))
+ ui.debug('acl: branch access granted: "%s" on branch "%s"\n'
+ % (ctx, branch))
+
+ for f in ctx.files():
+ if deny and deny(f):
+ raise util.Abort(_('acl: user "%s" denied on "%s"'
+ ' (changeset "%s")') % (user, f, ctx))
+ if allow and not allow(f):
+ raise util.Abort(_('acl: user "%s" not allowed on "%s"'
+ ' (changeset "%s")') % (user, f, ctx))
+ ui.debug('acl: path access granted: "%s"\n' % ctx)
diff --git a/hgext/bugzilla.py b/hgext/bugzilla.py
new file mode 100644
index 0000000..42eef74
--- /dev/null
+++ b/hgext/bugzilla.py
@@ -0,0 +1,915 @@
+# bugzilla.py - bugzilla integration for mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+# Copyright 2011-2 Jim Hague <jim.hague@acm.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''hooks for integrating with the Bugzilla bug tracker
+
+This hook extension adds comments on bugs in Bugzilla when changesets
+that refer to bugs by Bugzilla ID are seen. The comment is formatted using
+the Mercurial template mechanism.
+
+The bug references can optionally include an update for Bugzilla of the
+hours spent working on the bug. Bugs can also be marked fixed.
+
+Three basic modes of access to Bugzilla are provided:
+
+1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later.
+
+2. Check data via the Bugzilla XMLRPC interface and submit bug change
+ via email to Bugzilla email interface. Requires Bugzilla 3.4 or later.
+
+3. Writing directly to the Bugzilla database. Only Bugzilla installations
+ using MySQL are supported. Requires Python MySQLdb.
+
+Writing directly to the database is susceptible to schema changes, and
+relies on a Bugzilla contrib script to send out bug change
+notification emails. This script runs as the user running Mercurial,
+must be run on the host with the Bugzilla install, and requires
+permission to read Bugzilla configuration details and the necessary
+MySQL user and password to have full access rights to the Bugzilla
+database. For these reasons this access mode is now considered
+deprecated, and will not be updated for new Bugzilla versions going
+forward. Only adding comments is supported in this access mode.
+
+Access via XMLRPC needs a Bugzilla username and password to be specified
+in the configuration. Comments are added under that username. Since the
+configuration must be readable by all Mercurial users, it is recommended
+that the rights of that user are restricted in Bugzilla to the minimum
+necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later.
+
+Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends
+email to the Bugzilla email interface to submit comments to bugs.
+The From: address in the email is set to the email address of the Mercurial
+user, so the comment appears to come from the Mercurial user. In the event
+that the Mercurial user email is not recognised by Bugzilla as a Bugzilla
+user, the email associated with the Bugzilla username used to log into
+Bugzilla is used instead as the source of the comment. Marking bugs fixed
+works on all supported Bugzilla versions.
+
+Configuration items common to all access modes:
+
+bugzilla.version
+ This access type to use. Values recognised are:
+
+ :``xmlrpc``: Bugzilla XMLRPC interface.
+ :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.
+ :``3.0``: MySQL access, Bugzilla 3.0 and later.
+ :``2.18``: MySQL access, Bugzilla 2.18 and up to but not
+ including 3.0.
+ :``2.16``: MySQL access, Bugzilla 2.16 and up to but not
+ including 2.18.
+
+bugzilla.regexp
+ Regular expression to match bug IDs for update in changeset commit message.
+ It must contain one "()" named group ``<ids>`` containing the bug
+ IDs separated by non-digit characters. It may also contain
+ a named group ``<hours>`` with a floating-point number giving the
+ hours worked on the bug. If no named groups are present, the first
+ "()" group is assumed to contain the bug IDs, and work time is not
+ updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,
+ ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and
+ variations thereof, followed by an hours number prefixed by ``h`` or
+ ``hours``, e.g. ``hours 1.5``. Matching is case insensitive.
+
+bugzilla.fixregexp
+ Regular expression to match bug IDs for marking fixed in changeset
+ commit message. This must contain a "()" named group ``<ids>` containing
+ the bug IDs separated by non-digit characters. It may also contain
+ a named group ``<hours>`` with a floating-point number giving the
+ hours worked on the bug. If no named groups are present, the first
+ "()" group is assumed to contain the bug IDs, and work time is not
+ updated. The default expression matches ``Fixes 1234``, ``Fixes bug 1234``,
+ ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and
+ variations thereof, followed by an hours number prefixed by ``h`` or
+ ``hours``, e.g. ``hours 1.5``. Matching is case insensitive.
+
+bugzilla.fixstatus
+ The status to set a bug to when marking fixed. Default ``RESOLVED``.
+
+bugzilla.fixresolution
+ The resolution to set a bug to when marking fixed. Default ``FIXED``.
+
+bugzilla.style
+ The style file to use when formatting comments.
+
+bugzilla.template
+ Template to use when formatting comments. Overrides style if
+ specified. In addition to the usual Mercurial keywords, the
+ extension specifies:
+
+ :``{bug}``: The Bugzilla bug ID.
+ :``{root}``: The full pathname of the Mercurial repository.
+ :``{webroot}``: Stripped pathname of the Mercurial repository.
+ :``{hgweb}``: Base URL for browsing Mercurial repositories.
+
+ Default ``changeset {node|short} in repo {root} refers to bug
+ {bug}.\\ndetails:\\n\\t{desc|tabindent}``
+
+bugzilla.strip
+ The number of path separator characters to strip from the front of
+ the Mercurial repository path (``{root}`` in templates) to produce
+ ``{webroot}``. For example, a repository with ``{root}``
+ ``/var/local/my-project`` with a strip of 2 gives a value for
+ ``{webroot}`` of ``my-project``. Default 0.
+
+web.baseurl
+ Base URL for browsing Mercurial repositories. Referenced from
+ templates as ``{hgweb}``.
+
+Configuration items common to XMLRPC+email and MySQL access modes:
+
+bugzilla.usermap
+ Path of file containing Mercurial committer email to Bugzilla user email
+ mappings. If specified, the file should contain one mapping per
+ line::
+
+ committer = Bugzilla user
+
+ See also the ``[usermap]`` section.
+
+The ``[usermap]`` section is used to specify mappings of Mercurial
+committer email to Bugzilla user email. See also ``bugzilla.usermap``.
+Contains entries of the form ``committer = Bugzilla user``.
+
+XMLRPC access mode configuration:
+
+bugzilla.bzurl
+ The base URL for the Bugzilla installation.
+ Default ``http://localhost/bugzilla``.
+
+bugzilla.user
+ The username to use to log into Bugzilla via XMLRPC. Default
+ ``bugs``.
+
+bugzilla.password
+ The password for Bugzilla login.
+
+XMLRPC+email access mode uses the XMLRPC access mode configuration items,
+and also:
+
+bugzilla.bzemail
+ The Bugzilla email address.
+
+In addition, the Mercurial email settings must be configured. See the
+documentation in hgrc(5), sections ``[email]`` and ``[smtp]``.
+
+MySQL access mode configuration:
+
+bugzilla.host
+ Hostname of the MySQL server holding the Bugzilla database.
+ Default ``localhost``.
+
+bugzilla.db
+ Name of the Bugzilla database in MySQL. Default ``bugs``.
+
+bugzilla.user
+ Username to use to access MySQL server. Default ``bugs``.
+
+bugzilla.password
+ Password to use to access MySQL server.
+
+bugzilla.timeout
+ Database connection timeout (seconds). Default 5.
+
+bugzilla.bzuser
+ Fallback Bugzilla user name to record comments with, if changeset
+ committer cannot be found as a Bugzilla user.
+
+bugzilla.bzdir
+ Bugzilla install directory. Used by default notify. Default
+ ``/var/www/html/bugzilla``.
+
+bugzilla.notify
+ The command to run to get Bugzilla to send bug change notification
+ emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug
+ id) and ``user`` (committer bugzilla email). Default depends on
+ version; from 2.18 it is "cd %(bzdir)s && perl -T
+ contrib/sendbugmail.pl %(id)s %(user)s".
+
+Activating the extension::
+
+ [extensions]
+ bugzilla =
+
+ [hooks]
+ # run bugzilla hook on every change pulled or pushed in here
+ incoming.bugzilla = python:hgext.bugzilla.hook
+
+Example configurations:
+
+XMLRPC example configuration. This uses the Bugzilla at
+``http://my-project.org/bugzilla``, logging in as user
+``bugmail@my-project.org`` with password ``plugh``. It is used with a
+collection of Mercurial repositories in ``/var/local/hg/repos/``,
+with a web interface at ``http://my-project.org/hg``. ::
+
+ [bugzilla]
+ bzurl=http://my-project.org/bugzilla
+ user=bugmail@my-project.org
+ password=plugh
+ version=xmlrpc
+ template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\\n
+ {desc}\\n
+ strip=5
+
+ [web]
+ baseurl=http://my-project.org/hg
+
+XMLRPC+email example configuration. This uses the Bugzilla at
+``http://my-project.org/bugzilla``, logging in as user
+``bugmail@my-project.org`` with password ``plugh``. It is used with a
+collection of Mercurial repositories in ``/var/local/hg/repos/``,
+with a web interface at ``http://my-project.org/hg``. Bug comments
+are sent to the Bugzilla email address
+``bugzilla@my-project.org``. ::
+
+ [bugzilla]
+ bzurl=http://my-project.org/bugzilla
+ user=bugmail@my-project.org
+ password=plugh
+ version=xmlrpc
+ bzemail=bugzilla@my-project.org
+ template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\\n
+ {desc}\\n
+ strip=5
+
+ [web]
+ baseurl=http://my-project.org/hg
+
+ [usermap]
+ user@emaildomain.com=user.name@bugzilladomain.com
+
+MySQL example configuration. This has a local Bugzilla 3.2 installation
+in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,
+the Bugzilla database name is ``bugs`` and MySQL is
+accessed with MySQL username ``bugs`` password ``XYZZY``. It is used
+with a collection of Mercurial repositories in ``/var/local/hg/repos/``,
+with a web interface at ``http://my-project.org/hg``. ::
+
+ [bugzilla]
+ host=localhost
+ password=XYZZY
+ version=3.0
+ bzuser=unknown@domain.com
+ bzdir=/opt/bugzilla-3.2
+ template=Changeset {node|short} in {root|basename}.
+ {hgweb}/{webroot}/rev/{node|short}\\n
+ {desc}\\n
+ strip=5
+
+ [web]
+ baseurl=http://my-project.org/hg
+
+ [usermap]
+ user@emaildomain.com=user.name@bugzilladomain.com
+
+All the above add a comment to the Bugzilla bug record of the form::
+
+ Changeset 3b16791d6642 in repository-name.
+ http://my-project.org/hg/repository-name/rev/3b16791d6642
+
+ Changeset commit comment. Bug 1234.
+'''
+
+from mercurial.i18n import _
+from mercurial.node import short
+from mercurial import cmdutil, mail, templater, util
+import re, time, urlparse, xmlrpclib
+
+testedwith = 'internal'
+
+class bzaccess(object):
+ '''Base class for access to Bugzilla.'''
+
+ def __init__(self, ui):
+ self.ui = ui
+ usermap = self.ui.config('bugzilla', 'usermap')
+ if usermap:
+ self.ui.readconfig(usermap, sections=['usermap'])
+
+ def map_committer(self, user):
+ '''map name of committer to Bugzilla user name.'''
+ for committer, bzuser in self.ui.configitems('usermap'):
+ if committer.lower() == user.lower():
+ return bzuser
+ return user
+
+ # Methods to be implemented by access classes.
+ #
+ # 'bugs' is a dict keyed on bug id, where values are a dict holding
+ # updates to bug state. Recognised dict keys are:
+ #
+ # 'hours': Value, float containing work hours to be updated.
+ # 'fix': If key present, bug is to be marked fixed. Value ignored.
+
+ def filter_real_bug_ids(self, bugs):
+ '''remove bug IDs that do not exist in Bugzilla from bugs.'''
+ pass
+
+ def filter_cset_known_bug_ids(self, node, bugs):
+ '''remove bug IDs where node occurs in comment text from bugs.'''
+ pass
+
+ def updatebug(self, bugid, newstate, text, committer):
+ '''update the specified bug. Add comment text and set new states.
+
+ If possible add the comment as being from the committer of
+ the changeset. Otherwise use the default Bugzilla user.
+ '''
+ pass
+
+ def notify(self, bugs, committer):
+ '''Force sending of Bugzilla notification emails.
+
+ Only required if the access method does not trigger notification
+ emails automatically.
+ '''
+ pass
+
+# Bugzilla via direct access to MySQL database.
+class bzmysql(bzaccess):
+ '''Support for direct MySQL access to Bugzilla.
+
+ The earliest Bugzilla version this is tested with is version 2.16.
+
+ If your Bugzilla is version 3.4 or above, you are strongly
+ recommended to use the XMLRPC access method instead.
+ '''
+
+ @staticmethod
+ def sql_buglist(ids):
+ '''return SQL-friendly list of bug ids'''
+ return '(' + ','.join(map(str, ids)) + ')'
+
+ _MySQLdb = None
+
+ def __init__(self, ui):
+ try:
+ import MySQLdb as mysql
+ bzmysql._MySQLdb = mysql
+ except ImportError, err:
+ raise util.Abort(_('python mysql support not available: %s') % err)
+
+ bzaccess.__init__(self, ui)
+
+ host = self.ui.config('bugzilla', 'host', 'localhost')
+ user = self.ui.config('bugzilla', 'user', 'bugs')
+ passwd = self.ui.config('bugzilla', 'password')
+ db = self.ui.config('bugzilla', 'db', 'bugs')
+ timeout = int(self.ui.config('bugzilla', 'timeout', 5))
+ self.ui.note(_('connecting to %s:%s as %s, password %s\n') %
+ (host, db, user, '*' * len(passwd)))
+ self.conn = bzmysql._MySQLdb.connect(host=host,
+ user=user, passwd=passwd,
+ db=db,
+ connect_timeout=timeout)
+ self.cursor = self.conn.cursor()
+ self.longdesc_id = self.get_longdesc_id()
+ self.user_ids = {}
+ self.default_notify = "cd %(bzdir)s && ./processmail %(id)s %(user)s"
+
+ def run(self, *args, **kwargs):
+ '''run a query.'''
+ self.ui.note(_('query: %s %s\n') % (args, kwargs))
+ try:
+ self.cursor.execute(*args, **kwargs)
+ except bzmysql._MySQLdb.MySQLError:
+ self.ui.note(_('failed query: %s %s\n') % (args, kwargs))
+ raise
+
+ def get_longdesc_id(self):
+ '''get identity of longdesc field'''
+ self.run('select fieldid from fielddefs where name = "longdesc"')
+ ids = self.cursor.fetchall()
+ if len(ids) != 1:
+ raise util.Abort(_('unknown database schema'))
+ return ids[0][0]
+
+ def filter_real_bug_ids(self, bugs):
+ '''filter not-existing bugs from set.'''
+ self.run('select bug_id from bugs where bug_id in %s' %
+ bzmysql.sql_buglist(bugs.keys()))
+ existing = [id for (id,) in self.cursor.fetchall()]
+ for id in bugs.keys():
+ if id not in existing:
+ self.ui.status(_('bug %d does not exist\n') % id)
+ del bugs[id]
+
+ def filter_cset_known_bug_ids(self, node, bugs):
+ '''filter bug ids that already refer to this changeset from set.'''
+ self.run('''select bug_id from longdescs where
+ bug_id in %s and thetext like "%%%s%%"''' %
+ (bzmysql.sql_buglist(bugs.keys()), short(node)))
+ for (id,) in self.cursor.fetchall():
+ self.ui.status(_('bug %d already knows about changeset %s\n') %
+ (id, short(node)))
+ del bugs[id]
+
+ def notify(self, bugs, committer):
+ '''tell bugzilla to send mail.'''
+ self.ui.status(_('telling bugzilla to send mail:\n'))
+ (user, userid) = self.get_bugzilla_user(committer)
+ for id in bugs.keys():
+ self.ui.status(_(' bug %s\n') % id)
+ cmdfmt = self.ui.config('bugzilla', 'notify', self.default_notify)
+ bzdir = self.ui.config('bugzilla', 'bzdir',
+ '/var/www/html/bugzilla')
+ try:
+ # Backwards-compatible with old notify string, which
+ # took one string. This will throw with a new format
+ # string.
+ cmd = cmdfmt % id
+ except TypeError:
+ cmd = cmdfmt % {'bzdir': bzdir, 'id': id, 'user': user}
+ self.ui.note(_('running notify command %s\n') % cmd)
+ fp = util.popen('(%s) 2>&1' % cmd)
+ out = fp.read()
+ ret = fp.close()
+ if ret:
+ self.ui.warn(out)
+ raise util.Abort(_('bugzilla notify command %s') %
+ util.explainexit(ret)[0])
+ self.ui.status(_('done\n'))
+
+ def get_user_id(self, user):
+ '''look up numeric bugzilla user id.'''
+ try:
+ return self.user_ids[user]
+ except KeyError:
+ try:
+ userid = int(user)
+ except ValueError:
+ self.ui.note(_('looking up user %s\n') % user)
+ self.run('''select userid from profiles
+ where login_name like %s''', user)
+ all = self.cursor.fetchall()
+ if len(all) != 1:
+ raise KeyError(user)
+ userid = int(all[0][0])
+ self.user_ids[user] = userid
+ return userid
+
+ def get_bugzilla_user(self, committer):
+ '''See if committer is a registered bugzilla user. Return
+ bugzilla username and userid if so. If not, return default
+ bugzilla username and userid.'''
+ user = self.map_committer(committer)
+ try:
+ userid = self.get_user_id(user)
+ except KeyError:
+ try:
+ defaultuser = self.ui.config('bugzilla', 'bzuser')
+ if not defaultuser:
+ raise util.Abort(_('cannot find bugzilla user id for %s') %
+ user)
+ userid = self.get_user_id(defaultuser)
+ user = defaultuser
+ except KeyError:
+ raise util.Abort(_('cannot find bugzilla user id for %s or %s')
+ % (user, defaultuser))
+ return (user, userid)
+
+ def updatebug(self, bugid, newstate, text, committer):
+ '''update bug state with comment text.
+
+ Try adding comment as committer of changeset, otherwise as
+ default bugzilla user.'''
+ if len(newstate) > 0:
+ self.ui.warn(_("Bugzilla/MySQL cannot update bug state\n"))
+
+ (user, userid) = self.get_bugzilla_user(committer)
+ now = time.strftime('%Y-%m-%d %H:%M:%S')
+ self.run('''insert into longdescs
+ (bug_id, who, bug_when, thetext)
+ values (%s, %s, %s, %s)''',
+ (bugid, userid, now, text))
+ self.run('''insert into bugs_activity (bug_id, who, bug_when, fieldid)
+ values (%s, %s, %s, %s)''',
+ (bugid, userid, now, self.longdesc_id))
+ self.conn.commit()
+
+class bzmysql_2_18(bzmysql):
+ '''support for bugzilla 2.18 series.'''
+
+ def __init__(self, ui):
+ bzmysql.__init__(self, ui)
+ self.default_notify = \
+ "cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s"
+
+class bzmysql_3_0(bzmysql_2_18):
+ '''support for bugzilla 3.0 series.'''
+
+ def __init__(self, ui):
+ bzmysql_2_18.__init__(self, ui)
+
+ def get_longdesc_id(self):
+ '''get identity of longdesc field'''
+ self.run('select id from fielddefs where name = "longdesc"')
+ ids = self.cursor.fetchall()
+ if len(ids) != 1:
+ raise util.Abort(_('unknown database schema'))
+ return ids[0][0]
+
+# Buzgilla via XMLRPC interface.
+
+class cookietransportrequest(object):
+ """A Transport request method that retains cookies over its lifetime.
+
+ The regular xmlrpclib transports ignore cookies. Which causes
+ a bit of a problem when you need a cookie-based login, as with
+ the Bugzilla XMLRPC interface.
+
+ So this is a helper for defining a Transport which looks for
+ cookies being set in responses and saves them to add to all future
+ requests.
+ """
+
+ # Inspiration drawn from
+ # http://blog.godson.in/2010/09/how-to-make-python-xmlrpclib-client.html
+ # http://www.itkovian.net/base/transport-class-for-pythons-xml-rpc-lib/
+
+ cookies = []
+ def send_cookies(self, connection):
+ if self.cookies:
+ for cookie in self.cookies:
+ connection.putheader("Cookie", cookie)
+
+ def request(self, host, handler, request_body, verbose=0):
+ self.verbose = verbose
+ self.accept_gzip_encoding = False
+
+ # issue XML-RPC request
+ h = self.make_connection(host)
+ if verbose:
+ h.set_debuglevel(1)
+
+ self.send_request(h, handler, request_body)
+ self.send_host(h, host)
+ self.send_cookies(h)
+ self.send_user_agent(h)
+ self.send_content(h, request_body)
+
+ # Deal with differences between Python 2.4-2.6 and 2.7.
+ # In the former h is a HTTP(S). In the latter it's a
+ # HTTP(S)Connection. Luckily, the 2.4-2.6 implementation of
+ # HTTP(S) has an underlying HTTP(S)Connection, so extract
+ # that and use it.
+ try:
+ response = h.getresponse()
+ except AttributeError:
+ response = h._conn.getresponse()
+
+ # Add any cookie definitions to our list.
+ for header in response.msg.getallmatchingheaders("Set-Cookie"):
+ val = header.split(": ", 1)[1]
+ cookie = val.split(";", 1)[0]
+ self.cookies.append(cookie)
+
+ if response.status != 200:
+ raise xmlrpclib.ProtocolError(host + handler, response.status,
+ response.reason, response.msg.headers)
+
+ payload = response.read()
+ parser, unmarshaller = self.getparser()
+ parser.feed(payload)
+ parser.close()
+
+ return unmarshaller.close()
+
+# The explicit calls to the underlying xmlrpclib __init__() methods are
+# necessary. The xmlrpclib.Transport classes are old-style classes, and
+# it turns out their __init__() doesn't get called when doing multiple
+# inheritance with a new-style class.
+class cookietransport(cookietransportrequest, xmlrpclib.Transport):
+ def __init__(self, use_datetime=0):
+ if util.safehasattr(xmlrpclib.Transport, "__init__"):
+ xmlrpclib.Transport.__init__(self, use_datetime)
+
+class cookiesafetransport(cookietransportrequest, xmlrpclib.SafeTransport):
+ def __init__(self, use_datetime=0):
+ if util.safehasattr(xmlrpclib.Transport, "__init__"):
+ xmlrpclib.SafeTransport.__init__(self, use_datetime)
+
+class bzxmlrpc(bzaccess):
+ """Support for access to Bugzilla via the Bugzilla XMLRPC API.
+
+ Requires a minimum Bugzilla version 3.4.
+ """
+
+ def __init__(self, ui):
+ bzaccess.__init__(self, ui)
+
+ bzweb = self.ui.config('bugzilla', 'bzurl',
+ 'http://localhost/bugzilla/')
+ bzweb = bzweb.rstrip("/") + "/xmlrpc.cgi"
+
+ user = self.ui.config('bugzilla', 'user', 'bugs')
+ passwd = self.ui.config('bugzilla', 'password')
+
+ self.fixstatus = self.ui.config('bugzilla', 'fixstatus', 'RESOLVED')
+ self.fixresolution = self.ui.config('bugzilla', 'fixresolution',
+ 'FIXED')
+
+ self.bzproxy = xmlrpclib.ServerProxy(bzweb, self.transport(bzweb))
+ ver = self.bzproxy.Bugzilla.version()['version'].split('.')
+ self.bzvermajor = int(ver[0])
+ self.bzverminor = int(ver[1])
+ self.bzproxy.User.login(dict(login=user, password=passwd))
+
+ def transport(self, uri):
+ if urlparse.urlparse(uri, "http")[0] == "https":
+ return cookiesafetransport()
+ else:
+ return cookietransport()
+
+ def get_bug_comments(self, id):
+ """Return a string with all comment text for a bug."""
+ c = self.bzproxy.Bug.comments(dict(ids=[id], include_fields=['text']))
+ return ''.join([t['text'] for t in c['bugs'][str(id)]['comments']])
+
+ def filter_real_bug_ids(self, bugs):
+ probe = self.bzproxy.Bug.get(dict(ids=sorted(bugs.keys()),
+ include_fields=[],
+ permissive=True))
+ for badbug in probe['faults']:
+ id = badbug['id']
+ self.ui.status(_('bug %d does not exist\n') % id)
+ del bugs[id]
+
+ def filter_cset_known_bug_ids(self, node, bugs):
+ for id in sorted(bugs.keys()):
+ if self.get_bug_comments(id).find(short(node)) != -1:
+ self.ui.status(_('bug %d already knows about changeset %s\n') %
+ (id, short(node)))
+ del bugs[id]
+
+ def updatebug(self, bugid, newstate, text, committer):
+ args = {}
+ if 'hours' in newstate:
+ args['work_time'] = newstate['hours']
+
+ if self.bzvermajor >= 4:
+ args['ids'] = [bugid]
+ args['comment'] = {'body' : text}
+ if 'fix' in newstate:
+ args['status'] = self.fixstatus
+ args['resolution'] = self.fixresolution
+ self.bzproxy.Bug.update(args)
+ else:
+ if 'fix' in newstate:
+ self.ui.warn(_("Bugzilla/XMLRPC needs Bugzilla 4.0 or later "
+ "to mark bugs fixed\n"))
+ args['id'] = bugid
+ args['comment'] = text
+ self.bzproxy.Bug.add_comment(args)
+
+class bzxmlrpcemail(bzxmlrpc):
+ """Read data from Bugzilla via XMLRPC, send updates via email.
+
+ Advantages of sending updates via email:
+ 1. Comments can be added as any user, not just logged in user.
+ 2. Bug statuses or other fields not accessible via XMLRPC can
+ potentially be updated.
+
+ There is no XMLRPC function to change bug status before Bugzilla
+ 4.0, so bugs cannot be marked fixed via XMLRPC before Bugzilla 4.0.
+ But bugs can be marked fixed via email from 3.4 onwards.
+ """
+
+ # The email interface changes subtly between 3.4 and 3.6. In 3.4,
+ # in-email fields are specified as '@<fieldname> = <value>'. In
+ # 3.6 this becomes '@<fieldname> <value>'. And fieldname @bug_id
+ # in 3.4 becomes @id in 3.6. 3.6 and 4.0 both maintain backwards
+ # compatibility, but rather than rely on this use the new format for
+ # 4.0 onwards.
+
+ def __init__(self, ui):
+ bzxmlrpc.__init__(self, ui)
+
+ self.bzemail = self.ui.config('bugzilla', 'bzemail')
+ if not self.bzemail:
+ raise util.Abort(_("configuration 'bzemail' missing"))
+ mail.validateconfig(self.ui)
+
+ def makecommandline(self, fieldname, value):
+ if self.bzvermajor >= 4:
+ return "@%s %s" % (fieldname, str(value))
+ else:
+ if fieldname == "id":
+ fieldname = "bug_id"
+ return "@%s = %s" % (fieldname, str(value))
+
+ def send_bug_modify_email(self, bugid, commands, comment, committer):
+ '''send modification message to Bugzilla bug via email.
+
+ The message format is documented in the Bugzilla email_in.pl
+ specification. commands is a list of command lines, comment is the
+ comment text.
+
+ To stop users from crafting commit comments with
+ Bugzilla commands, specify the bug ID via the message body, rather
+ than the subject line, and leave a blank line after it.
+ '''
+ user = self.map_committer(committer)
+ matches = self.bzproxy.User.get(dict(match=[user]))
+ if not matches['users']:
+ user = self.ui.config('bugzilla', 'user', 'bugs')
+ matches = self.bzproxy.User.get(dict(match=[user]))
+ if not matches['users']:
+ raise util.Abort(_("default bugzilla user %s email not found") %
+ user)
+ user = matches['users'][0]['email']
+ commands.append(self.makecommandline("id", bugid))
+
+ text = "\n".join(commands) + "\n\n" + comment
+
+ _charsets = mail._charsets(self.ui)
+ user = mail.addressencode(self.ui, user, _charsets)
+ bzemail = mail.addressencode(self.ui, self.bzemail, _charsets)
+ msg = mail.mimeencode(self.ui, text, _charsets)
+ msg['From'] = user
+ msg['To'] = bzemail
+ msg['Subject'] = mail.headencode(self.ui, "Bug modification", _charsets)
+ sendmail = mail.connect(self.ui)
+ sendmail(user, bzemail, msg.as_string())
+
+ def updatebug(self, bugid, newstate, text, committer):
+ cmds = []
+ if 'hours' in newstate:
+ cmds.append(self.makecommandline("work_time", newstate['hours']))
+ if 'fix' in newstate:
+ cmds.append(self.makecommandline("bug_status", self.fixstatus))
+ cmds.append(self.makecommandline("resolution", self.fixresolution))
+ self.send_bug_modify_email(bugid, cmds, text, committer)
+
+class bugzilla(object):
+ # supported versions of bugzilla. different versions have
+ # different schemas.
+ _versions = {
+ '2.16': bzmysql,
+ '2.18': bzmysql_2_18,
+ '3.0': bzmysql_3_0,
+ 'xmlrpc': bzxmlrpc,
+ 'xmlrpc+email': bzxmlrpcemail
+ }
+
+ _default_bug_re = (r'bugs?\s*,?\s*(?:#|nos?\.?|num(?:ber)?s?)?\s*'
+ r'(?P<ids>(?:\d+\s*(?:,?\s*(?:and)?)?\s*)+)'
+ r'\.?\s*(?:h(?:ours?)?\s*(?P<hours>\d*(?:\.\d+)?))?')
+
+ _default_fix_re = (r'fix(?:es)?\s*(?:bugs?\s*)?,?\s*'
+ r'(?:nos?\.?|num(?:ber)?s?)?\s*'
+ r'(?P<ids>(?:#?\d+\s*(?:,?\s*(?:and)?)?\s*)+)'
+ r'\.?\s*(?:h(?:ours?)?\s*(?P<hours>\d*(?:\.\d+)?))?')
+
+ _bz = None
+
+ def __init__(self, ui, repo):
+ self.ui = ui
+ self.repo = repo
+
+ def bz(self):
+ '''return object that knows how to talk to bugzilla version in
+ use.'''
+
+ if bugzilla._bz is None:
+ bzversion = self.ui.config('bugzilla', 'version')
+ try:
+ bzclass = bugzilla._versions[bzversion]
+ except KeyError:
+ raise util.Abort(_('bugzilla version %s not supported') %
+ bzversion)
+ bugzilla._bz = bzclass(self.ui)
+ return bugzilla._bz
+
+ def __getattr__(self, key):
+ return getattr(self.bz(), key)
+
+ _bug_re = None
+ _fix_re = None
+ _split_re = None
+
+ def find_bugs(self, ctx):
+ '''return bugs dictionary created from commit comment.
+
+ Extract bug info from changeset comments. Filter out any that are
+ not known to Bugzilla, and any that already have a reference to
+ the given changeset in their comments.
+ '''
+ if bugzilla._bug_re is None:
+ bugzilla._bug_re = re.compile(
+ self.ui.config('bugzilla', 'regexp',
+ bugzilla._default_bug_re), re.IGNORECASE)
+ bugzilla._fix_re = re.compile(
+ self.ui.config('bugzilla', 'fixregexp',
+ bugzilla._default_fix_re), re.IGNORECASE)
+ bugzilla._split_re = re.compile(r'\D+')
+ start = 0
+ hours = 0.0
+ bugs = {}
+ bugmatch = bugzilla._bug_re.search(ctx.description(), start)
+ fixmatch = bugzilla._fix_re.search(ctx.description(), start)
+ while True:
+ bugattribs = {}
+ if not bugmatch and not fixmatch:
+ break
+ if not bugmatch:
+ m = fixmatch
+ elif not fixmatch:
+ m = bugmatch
+ else:
+ if bugmatch.start() < fixmatch.start():
+ m = bugmatch
+ else:
+ m = fixmatch
+ start = m.end()
+ if m is bugmatch:
+ bugmatch = bugzilla._bug_re.search(ctx.description(), start)
+ if 'fix' in bugattribs:
+ del bugattribs['fix']
+ else:
+ fixmatch = bugzilla._fix_re.search(ctx.description(), start)
+ bugattribs['fix'] = None
+
+ try:
+ ids = m.group('ids')
+ except IndexError:
+ ids = m.group(1)
+ try:
+ hours = float(m.group('hours'))
+ bugattribs['hours'] = hours
+ except IndexError:
+ pass
+ except TypeError:
+ pass
+ except ValueError:
+ self.ui.status(_("%s: invalid hours\n") % m.group('hours'))
+
+ for id in bugzilla._split_re.split(ids):
+ if not id:
+ continue
+ bugs[int(id)] = bugattribs
+ if bugs:
+ self.filter_real_bug_ids(bugs)
+ if bugs:
+ self.filter_cset_known_bug_ids(ctx.node(), bugs)
+ return bugs
+
+ def update(self, bugid, newstate, ctx):
+ '''update bugzilla bug with reference to changeset.'''
+
+ def webroot(root):
+ '''strip leading prefix of repo root and turn into
+ url-safe path.'''
+ count = int(self.ui.config('bugzilla', 'strip', 0))
+ root = util.pconvert(root)
+ while count > 0:
+ c = root.find('/')
+ if c == -1:
+ break
+ root = root[c + 1:]
+ count -= 1
+ return root
+
+ mapfile = self.ui.config('bugzilla', 'style')
+ tmpl = self.ui.config('bugzilla', 'template')
+ t = cmdutil.changeset_templater(self.ui, self.repo,
+ False, None, mapfile, False)
+ if not mapfile and not tmpl:
+ tmpl = _('changeset {node|short} in repo {root} refers '
+ 'to bug {bug}.\ndetails:\n\t{desc|tabindent}')
+ if tmpl:
+ tmpl = templater.parsestring(tmpl, quoted=False)
+ t.use_template(tmpl)
+ self.ui.pushbuffer()
+ t.show(ctx, changes=ctx.changeset(),
+ bug=str(bugid),
+ hgweb=self.ui.config('web', 'baseurl'),
+ root=self.repo.root,
+ webroot=webroot(self.repo.root))
+ data = self.ui.popbuffer()
+ self.updatebug(bugid, newstate, data, util.email(ctx.user()))
+
+def hook(ui, repo, hooktype, node=None, **kwargs):
+ '''add comment to bugzilla for each changeset that refers to a
+ bugzilla bug id. only add a comment once per bug, so same change
+ seen multiple times does not fill bug with duplicate data.'''
+ if node is None:
+ raise util.Abort(_('hook type %s does not pass a changeset id') %
+ hooktype)
+ try:
+ bz = bugzilla(ui, repo)
+ ctx = repo[node]
+ bugs = bz.find_bugs(ctx)
+ if bugs:
+ for bug in bugs:
+ bz.update(bug, bugs[bug], ctx)
+ bz.notify(bugs, util.email(ctx.user()))
+ except Exception, e:
+ raise util.Abort(_('Bugzilla error: %s') % e)
diff --git a/hgext/children.py b/hgext/children.py
new file mode 100644
index 0000000..7b477aa
--- /dev/null
+++ b/hgext/children.py
@@ -0,0 +1,50 @@
+# Mercurial extension to provide the 'hg children' command
+#
+# Copyright 2007 by Intevation GmbH <intevation@intevation.de>
+#
+# Author(s):
+# Thomas Arendsen Hein <thomas@intevation.de>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to display child changesets (DEPRECATED)
+
+This extension is deprecated. You should use :hg:`log -r
+"children(REV)"` instead.
+'''
+
+from mercurial import cmdutil
+from mercurial.commands import templateopts
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+def children(ui, repo, file_=None, **opts):
+ """show the children of the given or working directory revision
+
+ Print the children of the working directory's revisions. If a
+ revision is given via -r/--rev, the children of that revision will
+ be printed. If a file argument is given, revision in which the
+ file was last changed (after the working directory revision or the
+ argument to --rev if given) is printed.
+ """
+ rev = opts.get('rev')
+ if file_:
+ ctx = repo.filectx(file_, changeid=rev)
+ else:
+ ctx = repo[rev]
+
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ for cctx in ctx.children():
+ displayer.show(cctx)
+ displayer.close()
+
+cmdtable = {
+ "children":
+ (children,
+ [('r', 'rev', '',
+ _('show children of the specified revision'), _('REV')),
+ ] + templateopts,
+ _('hg children [-r REV] [FILE]')),
+}
diff --git a/hgext/churn.py b/hgext/churn.py
new file mode 100644
index 0000000..29796f0
--- /dev/null
+++ b/hgext/churn.py
@@ -0,0 +1,199 @@
+# churn.py - create a graph of revisions count grouped by template
+#
+# Copyright 2006 Josef "Jeff" Sipek <jeffpc@josefsipek.net>
+# Copyright 2008 Alexander Solovyov <piranha@piranha.org.ua>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to display statistics about repository history'''
+
+from mercurial.i18n import _
+from mercurial import patch, cmdutil, scmutil, util, templater, commands
+import os
+import time, datetime
+
+testedwith = 'internal'
+
+def maketemplater(ui, repo, tmpl):
+ tmpl = templater.parsestring(tmpl, quoted=False)
+ try:
+ t = cmdutil.changeset_templater(ui, repo, False, None, None, False)
+ except SyntaxError, inst:
+ raise util.Abort(inst.args[0])
+ t.use_template(tmpl)
+ return t
+
+def changedlines(ui, repo, ctx1, ctx2, fns):
+ added, removed = 0, 0
+ fmatch = scmutil.matchfiles(repo, fns)
+ diff = ''.join(patch.diff(repo, ctx1.node(), ctx2.node(), fmatch))
+ for l in diff.split('\n'):
+ if l.startswith("+") and not l.startswith("+++ "):
+ added += 1
+ elif l.startswith("-") and not l.startswith("--- "):
+ removed += 1
+ return (added, removed)
+
+def countrate(ui, repo, amap, *pats, **opts):
+ """Calculate stats"""
+ if opts.get('dateformat'):
+ def getkey(ctx):
+ t, tz = ctx.date()
+ date = datetime.datetime(*time.gmtime(float(t) - tz)[:6])
+ return date.strftime(opts['dateformat'])
+ else:
+ tmpl = opts.get('template', '{author|email}')
+ tmpl = maketemplater(ui, repo, tmpl)
+ def getkey(ctx):
+ ui.pushbuffer()
+ tmpl.show(ctx)
+ return ui.popbuffer()
+
+ state = {'count': 0}
+ rate = {}
+ df = False
+ if opts.get('date'):
+ df = util.matchdate(opts['date'])
+
+ m = scmutil.match(repo[None], pats, opts)
+ def prep(ctx, fns):
+ rev = ctx.rev()
+ if df and not df(ctx.date()[0]): # doesn't match date format
+ return
+
+ key = getkey(ctx).strip()
+ key = amap.get(key, key) # alias remap
+ if opts.get('changesets'):
+ rate[key] = (rate.get(key, (0,))[0] + 1, 0)
+ else:
+ parents = ctx.parents()
+ if len(parents) > 1:
+ ui.note(_('revision %d is a merge, ignoring...\n') % (rev,))
+ return
+
+ ctx1 = parents[0]
+ lines = changedlines(ui, repo, ctx1, ctx, fns)
+ rate[key] = [r + l for r, l in zip(rate.get(key, (0, 0)), lines)]
+
+ state['count'] += 1
+ ui.progress(_('analyzing'), state['count'], total=len(repo))
+
+ for ctx in cmdutil.walkchangerevs(repo, m, opts, prep):
+ continue
+
+ ui.progress(_('analyzing'), None)
+
+ return rate
+
+
+def churn(ui, repo, *pats, **opts):
+ '''histogram of changes to the repository
+
+ This command will display a histogram representing the number
+ of changed lines or revisions, grouped according to the given
+ template. The default template will group changes by author.
+ The --dateformat option may be used to group the results by
+ date instead.
+
+ Statistics are based on the number of changed lines, or
+ alternatively the number of matching revisions if the
+ --changesets option is specified.
+
+ Examples::
+
+ # display count of changed lines for every committer
+ hg churn -t '{author|email}'
+
+ # display daily activity graph
+ hg churn -f '%H' -s -c
+
+ # display activity of developers by month
+ hg churn -f '%Y-%m' -s -c
+
+ # display count of lines changed in every year
+ hg churn -f '%Y' -s
+
+ It is possible to map alternate email addresses to a main address
+ by providing a file using the following format::
+
+ <alias email> = <actual email>
+
+ Such a file may be specified with the --aliases option, otherwise
+ a .hgchurn file will be looked for in the working directory root.
+ '''
+ def pad(s, l):
+ return (s + " " * l)[:l]
+
+ amap = {}
+ aliases = opts.get('aliases')
+ if not aliases and os.path.exists(repo.wjoin('.hgchurn')):
+ aliases = repo.wjoin('.hgchurn')
+ if aliases:
+ for l in open(aliases, "r"):
+ try:
+ alias, actual = l.split('=' in l and '=' or None, 1)
+ amap[alias.strip()] = actual.strip()
+ except ValueError:
+ l = l.strip()
+ if l:
+ ui.warn(_("skipping malformed alias: %s\n") % l)
+ continue
+
+ rate = countrate(ui, repo, amap, *pats, **opts).items()
+ if not rate:
+ return
+
+ sortkey = ((not opts.get('sort')) and (lambda x: -sum(x[1])) or None)
+ rate.sort(key=sortkey)
+
+ # Be careful not to have a zero maxcount (issue833)
+ maxcount = float(max(sum(v) for k, v in rate)) or 1.0
+ maxname = max(len(k) for k, v in rate)
+
+ ttywidth = ui.termwidth()
+ ui.debug("assuming %i character terminal\n" % ttywidth)
+ width = ttywidth - maxname - 2 - 2 - 2
+
+ if opts.get('diffstat'):
+ width -= 15
+ def format(name, diffstat):
+ added, removed = diffstat
+ return "%s %15s %s%s\n" % (pad(name, maxname),
+ '+%d/-%d' % (added, removed),
+ ui.label('+' * charnum(added),
+ 'diffstat.inserted'),
+ ui.label('-' * charnum(removed),
+ 'diffstat.deleted'))
+ else:
+ width -= 6
+ def format(name, count):
+ return "%s %6d %s\n" % (pad(name, maxname), sum(count),
+ '*' * charnum(sum(count)))
+
+ def charnum(count):
+ return int(round(count * width / maxcount))
+
+ for name, count in rate:
+ ui.write(format(name, count))
+
+
+cmdtable = {
+ "churn":
+ (churn,
+ [('r', 'rev', [],
+ _('count rate for the specified revision or range'), _('REV')),
+ ('d', 'date', '',
+ _('count rate for revisions matching date spec'), _('DATE')),
+ ('t', 'template', '{author|email}',
+ _('template to group changesets'), _('TEMPLATE')),
+ ('f', 'dateformat', '',
+ _('strftime-compatible format for grouping by date'), _('FORMAT')),
+ ('c', 'changesets', False, _('count rate by number of changesets')),
+ ('s', 'sort', False, _('sort by key (default: sort by count)')),
+ ('', 'diffstat', False, _('display added/removed lines separately')),
+ ('', 'aliases', '',
+ _('file with email aliases'), _('FILE')),
+ ] + commands.walkopts,
+ _("hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]")),
+}
diff --git a/hgext/color.py b/hgext/color.py
new file mode 100644
index 0000000..22ef360
--- /dev/null
+++ b/hgext/color.py
@@ -0,0 +1,503 @@
+# color.py color output for the status and qseries commands
+#
+# Copyright (C) 2007 Kevin Christen <kevin.christen@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''colorize output from some commands
+
+This extension modifies the status and resolve commands to add color
+to their output to reflect file status, the qseries command to add
+color to reflect patch status (applied, unapplied, missing), and to
+diff-related commands to highlight additions, removals, diff headers,
+and trailing whitespace.
+
+Other effects in addition to color, like bold and underlined text, are
+also available. By default, the terminfo database is used to find the
+terminal codes used to change color and effect. If terminfo is not
+available, then effects are rendered with the ECMA-48 SGR control
+function (aka ANSI escape codes).
+
+Default effects may be overridden from your configuration file::
+
+ [color]
+ status.modified = blue bold underline red_background
+ status.added = green bold
+ status.removed = red bold blue_background
+ status.deleted = cyan bold underline
+ status.unknown = magenta bold underline
+ status.ignored = black bold
+
+ # 'none' turns off all effects
+ status.clean = none
+ status.copied = none
+
+ qseries.applied = blue bold underline
+ qseries.unapplied = black bold
+ qseries.missing = red bold
+
+ diff.diffline = bold
+ diff.extended = cyan bold
+ diff.file_a = red bold
+ diff.file_b = green bold
+ diff.hunk = magenta
+ diff.deleted = red
+ diff.inserted = green
+ diff.changed = white
+ diff.trailingwhitespace = bold red_background
+
+ resolve.unresolved = red bold
+ resolve.resolved = green bold
+
+ bookmarks.current = green
+
+ branches.active = none
+ branches.closed = black bold
+ branches.current = green
+ branches.inactive = none
+
+ tags.normal = green
+ tags.local = black bold
+
+The available effects in terminfo mode are 'blink', 'bold', 'dim',
+'inverse', 'invisible', 'italic', 'standout', and 'underline'; in
+ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and
+'underline'. How each is rendered depends on the terminal emulator.
+Some may not be available for a given terminal type, and will be
+silently ignored.
+
+Note that on some systems, terminfo mode may cause problems when using
+color with the pager extension and less -R. less with the -R option
+will only display ECMA-48 color codes, and terminfo mode may sometimes
+emit codes that less doesn't understand. You can work around this by
+either using ansi mode (or auto mode), or by using less -r (which will
+pass through all terminal control codes, not just color control
+codes).
+
+Because there are only eight standard colors, this module allows you
+to define color names for other color slots which might be available
+for your terminal type, assuming terminfo mode. For instance::
+
+ color.brightblue = 12
+ color.pink = 207
+ color.orange = 202
+
+to set 'brightblue' to color slot 12 (useful for 16 color terminals
+that have brighter colors defined in the upper eight) and, 'pink' and
+'orange' to colors in 256-color xterm's default color cube. These
+defined colors may then be used as any of the pre-defined eight,
+including appending '_background' to set the background to that color.
+
+By default, the color extension will use ANSI mode (or win32 mode on
+Windows) if it detects a terminal. To override auto mode (to enable
+terminfo mode, for example), set the following configuration option::
+
+ [color]
+ mode = terminfo
+
+Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will
+disable color.
+'''
+
+import os
+
+from mercurial import commands, dispatch, extensions, ui as uimod, util
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+# start and stop parameters for effects
+_effects = {'none': 0, 'black': 30, 'red': 31, 'green': 32, 'yellow': 33,
+ 'blue': 34, 'magenta': 35, 'cyan': 36, 'white': 37, 'bold': 1,
+ 'italic': 3, 'underline': 4, 'inverse': 7,
+ 'black_background': 40, 'red_background': 41,
+ 'green_background': 42, 'yellow_background': 43,
+ 'blue_background': 44, 'purple_background': 45,
+ 'cyan_background': 46, 'white_background': 47}
+
+def _terminfosetup(ui, mode):
+ '''Initialize terminfo data and the terminal if we're in terminfo mode.'''
+
+ global _terminfo_params
+ # If we failed to load curses, we go ahead and return.
+ if not _terminfo_params:
+ return
+ # Otherwise, see what the config file says.
+ if mode not in ('auto', 'terminfo'):
+ return
+
+ _terminfo_params.update((key[6:], (False, int(val)))
+ for key, val in ui.configitems('color')
+ if key.startswith('color.'))
+
+ try:
+ curses.setupterm()
+ except curses.error, e:
+ _terminfo_params = {}
+ return
+
+ for key, (b, e) in _terminfo_params.items():
+ if not b:
+ continue
+ if not curses.tigetstr(e):
+ # Most terminals don't support dim, invis, etc, so don't be
+ # noisy and use ui.debug().
+ ui.debug("no terminfo entry for %s\n" % e)
+ del _terminfo_params[key]
+ if not curses.tigetstr('setaf') or not curses.tigetstr('setab'):
+ # Only warn about missing terminfo entries if we explicitly asked for
+ # terminfo mode.
+ if mode == "terminfo":
+ ui.warn(_("no terminfo entry for setab/setaf: reverting to "
+ "ECMA-48 color\n"))
+ _terminfo_params = {}
+
+def _modesetup(ui, opts):
+ global _terminfo_params
+
+ coloropt = opts['color']
+ auto = coloropt == 'auto'
+ always = not auto and util.parsebool(coloropt)
+ if not always and not auto:
+ return None
+
+ formatted = always or (os.environ.get('TERM') != 'dumb' and ui.formatted())
+
+ mode = ui.config('color', 'mode', 'auto')
+ realmode = mode
+ if mode == 'auto':
+ if os.name == 'nt' and 'TERM' not in os.environ:
+ # looks line a cmd.exe console, use win32 API or nothing
+ realmode = 'win32'
+ else:
+ realmode = 'ansi'
+
+ if realmode == 'win32':
+ _terminfo_params = {}
+ if not w32effects:
+ if mode == 'win32':
+ # only warn if color.mode is explicitly set to win32
+ ui.warn(_('warning: failed to set color mode to %s\n') % mode)
+ return None
+ _effects.update(w32effects)
+ elif realmode == 'ansi':
+ _terminfo_params = {}
+ elif realmode == 'terminfo':
+ _terminfosetup(ui, mode)
+ if not _terminfo_params:
+ if mode == 'terminfo':
+ ## FIXME Shouldn't we return None in this case too?
+ # only warn if color.mode is explicitly set to win32
+ ui.warn(_('warning: failed to set color mode to %s\n') % mode)
+ realmode = 'ansi'
+ else:
+ return None
+
+ if always or (auto and formatted):
+ return realmode
+ return None
+
+try:
+ import curses
+ # Mapping from effect name to terminfo attribute name or color number.
+ # This will also force-load the curses module.
+ _terminfo_params = {'none': (True, 'sgr0'),
+ 'standout': (True, 'smso'),
+ 'underline': (True, 'smul'),
+ 'reverse': (True, 'rev'),
+ 'inverse': (True, 'rev'),
+ 'blink': (True, 'blink'),
+ 'dim': (True, 'dim'),
+ 'bold': (True, 'bold'),
+ 'invisible': (True, 'invis'),
+ 'italic': (True, 'sitm'),
+ 'black': (False, curses.COLOR_BLACK),
+ 'red': (False, curses.COLOR_RED),
+ 'green': (False, curses.COLOR_GREEN),
+ 'yellow': (False, curses.COLOR_YELLOW),
+ 'blue': (False, curses.COLOR_BLUE),
+ 'magenta': (False, curses.COLOR_MAGENTA),
+ 'cyan': (False, curses.COLOR_CYAN),
+ 'white': (False, curses.COLOR_WHITE)}
+except ImportError:
+ _terminfo_params = False
+
+_styles = {'grep.match': 'red bold',
+ 'bookmarks.current': 'green',
+ 'branches.active': 'none',
+ 'branches.closed': 'black bold',
+ 'branches.current': 'green',
+ 'branches.inactive': 'none',
+ 'diff.changed': 'white',
+ 'diff.deleted': 'red',
+ 'diff.diffline': 'bold',
+ 'diff.extended': 'cyan bold',
+ 'diff.file_a': 'red bold',
+ 'diff.file_b': 'green bold',
+ 'diff.hunk': 'magenta',
+ 'diff.inserted': 'green',
+ 'diff.trailingwhitespace': 'bold red_background',
+ 'diffstat.deleted': 'red',
+ 'diffstat.inserted': 'green',
+ 'ui.prompt': 'yellow',
+ 'log.changeset': 'yellow',
+ 'resolve.resolved': 'green bold',
+ 'resolve.unresolved': 'red bold',
+ 'status.added': 'green bold',
+ 'status.clean': 'none',
+ 'status.copied': 'none',
+ 'status.deleted': 'cyan bold underline',
+ 'status.ignored': 'black bold',
+ 'status.modified': 'blue bold',
+ 'status.removed': 'red bold',
+ 'status.unknown': 'magenta bold underline',
+ 'tags.normal': 'green',
+ 'tags.local': 'black bold'}
+
+
+def _effect_str(effect):
+ '''Helper function for render_effects().'''
+
+ bg = False
+ if effect.endswith('_background'):
+ bg = True
+ effect = effect[:-11]
+ attr, val = _terminfo_params[effect]
+ if attr:
+ return curses.tigetstr(val)
+ elif bg:
+ return curses.tparm(curses.tigetstr('setab'), val)
+ else:
+ return curses.tparm(curses.tigetstr('setaf'), val)
+
+def render_effects(text, effects):
+ 'Wrap text in commands to turn on each effect.'
+ if not text:
+ return text
+ if not _terminfo_params:
+ start = [str(_effects[e]) for e in ['none'] + effects.split()]
+ start = '\033[' + ';'.join(start) + 'm'
+ stop = '\033[' + str(_effects['none']) + 'm'
+ else:
+ start = ''.join(_effect_str(effect)
+ for effect in ['none'] + effects.split())
+ stop = _effect_str('none')
+ return ''.join([start, text, stop])
+
+def extstyles():
+ for name, ext in extensions.extensions():
+ _styles.update(getattr(ext, 'colortable', {}))
+
+def configstyles(ui):
+ for status, cfgeffects in ui.configitems('color'):
+ if '.' not in status or status.startswith('color.'):
+ continue
+ cfgeffects = ui.configlist('color', status)
+ if cfgeffects:
+ good = []
+ for e in cfgeffects:
+ if not _terminfo_params and e in _effects:
+ good.append(e)
+ elif e in _terminfo_params or e[:-11] in _terminfo_params:
+ good.append(e)
+ else:
+ ui.warn(_("ignoring unknown color/effect %r "
+ "(configured in color.%s)\n")
+ % (e, status))
+ _styles[status] = ' '.join(good)
+
+class colorui(uimod.ui):
+ def popbuffer(self, labeled=False):
+ if labeled:
+ return ''.join(self.label(a, label) for a, label
+ in self._buffers.pop())
+ return ''.join(a for a, label in self._buffers.pop())
+
+ _colormode = 'ansi'
+ def write(self, *args, **opts):
+ label = opts.get('label', '')
+ if self._buffers:
+ self._buffers[-1].extend([(str(a), label) for a in args])
+ elif self._colormode == 'win32':
+ for a in args:
+ win32print(a, super(colorui, self).write, **opts)
+ else:
+ return super(colorui, self).write(
+ *[self.label(str(a), label) for a in args], **opts)
+
+ def write_err(self, *args, **opts):
+ label = opts.get('label', '')
+ if self._colormode == 'win32':
+ for a in args:
+ win32print(a, super(colorui, self).write_err, **opts)
+ else:
+ return super(colorui, self).write_err(
+ *[self.label(str(a), label) for a in args], **opts)
+
+ def label(self, msg, label):
+ effects = []
+ for l in label.split():
+ s = _styles.get(l, '')
+ if s:
+ effects.append(s)
+ effects = ' '.join(effects)
+ if effects:
+ return '\n'.join([render_effects(s, effects)
+ for s in msg.split('\n')])
+ return msg
+
+
+def uisetup(ui):
+ global _terminfo_params
+ if ui.plain():
+ return
+ def colorcmd(orig, ui_, opts, cmd, cmdfunc):
+ mode = _modesetup(ui_, opts)
+ if mode:
+ colorui._colormode = mode
+ if not issubclass(ui_.__class__, colorui):
+ colorui.__bases__ = (ui_.__class__,)
+ ui_.__class__ = colorui
+ extstyles()
+ configstyles(ui_)
+ return orig(ui_, opts, cmd, cmdfunc)
+ extensions.wrapfunction(dispatch, '_runcommand', colorcmd)
+
+def extsetup(ui):
+ commands.globalopts.append(
+ ('', 'color', 'auto',
+ # i18n: 'always', 'auto', and 'never' are keywords and should
+ # not be translated
+ _("when to colorize (boolean, always, auto, or never)"),
+ _('TYPE')))
+
+if os.name != 'nt':
+ w32effects = None
+else:
+ import re, ctypes
+
+ _kernel32 = ctypes.windll.kernel32
+
+ _WORD = ctypes.c_ushort
+
+ _INVALID_HANDLE_VALUE = -1
+
+ class _COORD(ctypes.Structure):
+ _fields_ = [('X', ctypes.c_short),
+ ('Y', ctypes.c_short)]
+
+ class _SMALL_RECT(ctypes.Structure):
+ _fields_ = [('Left', ctypes.c_short),
+ ('Top', ctypes.c_short),
+ ('Right', ctypes.c_short),
+ ('Bottom', ctypes.c_short)]
+
+ class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
+ _fields_ = [('dwSize', _COORD),
+ ('dwCursorPosition', _COORD),
+ ('wAttributes', _WORD),
+ ('srWindow', _SMALL_RECT),
+ ('dwMaximumWindowSize', _COORD)]
+
+ _STD_OUTPUT_HANDLE = 0xfffffff5L # (DWORD)-11
+ _STD_ERROR_HANDLE = 0xfffffff4L # (DWORD)-12
+
+ _FOREGROUND_BLUE = 0x0001
+ _FOREGROUND_GREEN = 0x0002
+ _FOREGROUND_RED = 0x0004
+ _FOREGROUND_INTENSITY = 0x0008
+
+ _BACKGROUND_BLUE = 0x0010
+ _BACKGROUND_GREEN = 0x0020
+ _BACKGROUND_RED = 0x0040
+ _BACKGROUND_INTENSITY = 0x0080
+
+ _COMMON_LVB_REVERSE_VIDEO = 0x4000
+ _COMMON_LVB_UNDERSCORE = 0x8000
+
+ # http://msdn.microsoft.com/en-us/library/ms682088%28VS.85%29.aspx
+ w32effects = {
+ 'none': -1,
+ 'black': 0,
+ 'red': _FOREGROUND_RED,
+ 'green': _FOREGROUND_GREEN,
+ 'yellow': _FOREGROUND_RED | _FOREGROUND_GREEN,
+ 'blue': _FOREGROUND_BLUE,
+ 'magenta': _FOREGROUND_BLUE | _FOREGROUND_RED,
+ 'cyan': _FOREGROUND_BLUE | _FOREGROUND_GREEN,
+ 'white': _FOREGROUND_RED | _FOREGROUND_GREEN | _FOREGROUND_BLUE,
+ 'bold': _FOREGROUND_INTENSITY,
+ 'black_background': 0x100, # unused value > 0x0f
+ 'red_background': _BACKGROUND_RED,
+ 'green_background': _BACKGROUND_GREEN,
+ 'yellow_background': _BACKGROUND_RED | _BACKGROUND_GREEN,
+ 'blue_background': _BACKGROUND_BLUE,
+ 'purple_background': _BACKGROUND_BLUE | _BACKGROUND_RED,
+ 'cyan_background': _BACKGROUND_BLUE | _BACKGROUND_GREEN,
+ 'white_background': (_BACKGROUND_RED | _BACKGROUND_GREEN |
+ _BACKGROUND_BLUE),
+ 'bold_background': _BACKGROUND_INTENSITY,
+ 'underline': _COMMON_LVB_UNDERSCORE, # double-byte charsets only
+ 'inverse': _COMMON_LVB_REVERSE_VIDEO, # double-byte charsets only
+ }
+
+ passthrough = set([_FOREGROUND_INTENSITY,
+ _BACKGROUND_INTENSITY,
+ _COMMON_LVB_UNDERSCORE,
+ _COMMON_LVB_REVERSE_VIDEO])
+
+ stdout = _kernel32.GetStdHandle(
+ _STD_OUTPUT_HANDLE) # don't close the handle returned
+ if stdout is None or stdout == _INVALID_HANDLE_VALUE:
+ w32effects = None
+ else:
+ csbi = _CONSOLE_SCREEN_BUFFER_INFO()
+ if not _kernel32.GetConsoleScreenBufferInfo(
+ stdout, ctypes.byref(csbi)):
+ # stdout may not support GetConsoleScreenBufferInfo()
+ # when called from subprocess or redirected
+ w32effects = None
+ else:
+ origattr = csbi.wAttributes
+ ansire = re.compile('\033\[([^m]*)m([^\033]*)(.*)',
+ re.MULTILINE | re.DOTALL)
+
+ def win32print(text, orig, **opts):
+ label = opts.get('label', '')
+ attr = origattr
+
+ def mapcolor(val, attr):
+ if val == -1:
+ return origattr
+ elif val in passthrough:
+ return attr | val
+ elif val > 0x0f:
+ return (val & 0x70) | (attr & 0x8f)
+ else:
+ return (val & 0x07) | (attr & 0xf8)
+
+ # determine console attributes based on labels
+ for l in label.split():
+ style = _styles.get(l, '')
+ for effect in style.split():
+ attr = mapcolor(w32effects[effect], attr)
+
+ # hack to ensure regexp finds data
+ if not text.startswith('\033['):
+ text = '\033[m' + text
+
+ # Look for ANSI-like codes embedded in text
+ m = re.match(ansire, text)
+
+ try:
+ while m:
+ for sattr in m.group(1).split(';'):
+ if sattr:
+ attr = mapcolor(int(sattr), attr)
+ _kernel32.SetConsoleTextAttribute(stdout, attr)
+ orig(m.group(2), **opts)
+ m = re.match(ansire, m.group(3))
+ finally:
+ # Explicity reset original attributes
+ _kernel32.SetConsoleTextAttribute(stdout, origattr)
diff --git a/hgext/convert/__init__.py b/hgext/convert/__init__.py
new file mode 100644
index 0000000..e53c82c
--- /dev/null
+++ b/hgext/convert/__init__.py
@@ -0,0 +1,370 @@
+# convert.py Foreign SCM converter
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''import revisions from foreign VCS repositories into Mercurial'''
+
+import convcmd
+import cvsps
+import subversion
+from mercurial import commands, templatekw
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+# Commands definition was moved elsewhere to ease demandload job.
+
+def convert(ui, src, dest=None, revmapfile=None, **opts):
+ """convert a foreign SCM repository to a Mercurial one.
+
+ Accepted source formats [identifiers]:
+
+ - Mercurial [hg]
+ - CVS [cvs]
+ - Darcs [darcs]
+ - git [git]
+ - Subversion [svn]
+ - Monotone [mtn]
+ - GNU Arch [gnuarch]
+ - Bazaar [bzr]
+ - Perforce [p4]
+
+ Accepted destination formats [identifiers]:
+
+ - Mercurial [hg]
+ - Subversion [svn] (history on branches is not preserved)
+
+ If no revision is given, all revisions will be converted.
+ Otherwise, convert will only import up to the named revision
+ (given in a format understood by the source).
+
+ If no destination directory name is specified, it defaults to the
+ basename of the source with ``-hg`` appended. If the destination
+ repository doesn't exist, it will be created.
+
+ By default, all sources except Mercurial will use --branchsort.
+ Mercurial uses --sourcesort to preserve original revision numbers
+ order. Sort modes have the following effects:
+
+ --branchsort convert from parent to child revision when possible,
+ which means branches are usually converted one after
+ the other. It generates more compact repositories.
+
+ --datesort sort revisions by date. Converted repositories have
+ good-looking changelogs but are often an order of
+ magnitude larger than the same ones generated by
+ --branchsort.
+
+ --sourcesort try to preserve source revisions order, only
+ supported by Mercurial sources.
+
+ If ``REVMAP`` isn't given, it will be put in a default location
+ (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple
+ text file that maps each source commit ID to the destination ID
+ for that revision, like so::
+
+ <source ID> <destination ID>
+
+ If the file doesn't exist, it's automatically created. It's
+ updated on each commit copied, so :hg:`convert` can be interrupted
+ and can be run repeatedly to copy new commits.
+
+ The authormap is a simple text file that maps each source commit
+ author to a destination commit author. It is handy for source SCMs
+ that use unix logins to identify authors (eg: CVS). One line per
+ author mapping and the line format is::
+
+ source author = destination author
+
+ Empty lines and lines starting with a ``#`` are ignored.
+
+ The filemap is a file that allows filtering and remapping of files
+ and directories. Each line can contain one of the following
+ directives::
+
+ include path/to/file-or-dir
+
+ exclude path/to/file-or-dir
+
+ rename path/to/source path/to/destination
+
+ Comment lines start with ``#``. A specified path matches if it
+ equals the full relative name of a file or one of its parent
+ directories. The ``include`` or ``exclude`` directive with the
+ longest matching path applies, so line order does not matter.
+
+ The ``include`` directive causes a file, or all files under a
+ directory, to be included in the destination repository, and the
+ exclusion of all other files and directories not explicitly
+ included. The ``exclude`` directive causes files or directories to
+ be omitted. The ``rename`` directive renames a file or directory if
+ it is converted. To rename from a subdirectory into the root of
+ the repository, use ``.`` as the path to rename to.
+
+ The splicemap is a file that allows insertion of synthetic
+ history, letting you specify the parents of a revision. This is
+ useful if you want to e.g. give a Subversion merge two parents, or
+ graft two disconnected series of history together. Each entry
+ contains a key, followed by a space, followed by one or two
+ comma-separated values::
+
+ key parent1, parent2
+
+ The key is the revision ID in the source
+ revision control system whose parents should be modified (same
+ format as a key in .hg/shamap). The values are the revision IDs
+ (in either the source or destination revision control system) that
+ should be used as the new parents for that node. For example, if
+ you have merged "release-1.0" into "trunk", then you should
+ specify the revision on "trunk" as the first parent and the one on
+ the "release-1.0" branch as the second.
+
+ The branchmap is a file that allows you to rename a branch when it is
+ being brought in from whatever external repository. When used in
+ conjunction with a splicemap, it allows for a powerful combination
+ to help fix even the most badly mismanaged repositories and turn them
+ into nicely structured Mercurial repositories. The branchmap contains
+ lines of the form::
+
+ original_branch_name new_branch_name
+
+ where "original_branch_name" is the name of the branch in the
+ source repository, and "new_branch_name" is the name of the branch
+ is the destination repository. No whitespace is allowed in the
+ branch names. This can be used to (for instance) move code in one
+ repository from "default" to a named branch.
+
+ Mercurial Source
+ ################
+
+ The Mercurial source recognizes the following configuration
+ options, which you can set on the command line with ``--config``:
+
+ :convert.hg.ignoreerrors: ignore integrity errors when reading.
+ Use it to fix Mercurial repositories with missing revlogs, by
+ converting from and to Mercurial. Default is False.
+
+ :convert.hg.saverev: store original revision ID in changeset
+ (forces target IDs to change). It takes a boolean argument and
+ defaults to False.
+
+ :convert.hg.startrev: convert start revision and its descendants.
+ It takes a hg revision identifier and defaults to 0.
+
+ CVS Source
+ ##########
+
+ CVS source will use a sandbox (i.e. a checked-out copy) from CVS
+ to indicate the starting point of what will be converted. Direct
+ access to the repository files is not needed, unless of course the
+ repository is ``:local:``. The conversion uses the top level
+ directory in the sandbox to find the CVS repository, and then uses
+ CVS rlog commands to find files to convert. This means that unless
+ a filemap is given, all files under the starting directory will be
+ converted, and that any directory reorganization in the CVS
+ sandbox is ignored.
+
+ The following options can be used with ``--config``:
+
+ :convert.cvsps.cache: Set to False to disable remote log caching,
+ for testing and debugging purposes. Default is True.
+
+ :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is
+ allowed between commits with identical user and log message in
+ a single changeset. When very large files were checked in as
+ part of a changeset then the default may not be long enough.
+ The default is 60.
+
+ :convert.cvsps.mergeto: Specify a regular expression to which
+ commit log messages are matched. If a match occurs, then the
+ conversion process will insert a dummy revision merging the
+ branch on which this log message occurs to the branch
+ indicated in the regex. Default is ``{{mergetobranch
+ ([-\\w]+)}}``
+
+ :convert.cvsps.mergefrom: Specify a regular expression to which
+ commit log messages are matched. If a match occurs, then the
+ conversion process will add the most recent revision on the
+ branch indicated in the regex as the second parent of the
+ changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``
+
+ :hook.cvslog: Specify a Python function to be called at the end of
+ gathering the CVS log. The function is passed a list with the
+ log entries, and can modify the entries in-place, or add or
+ delete them.
+
+ :hook.cvschangesets: Specify a Python function to be called after
+ the changesets are calculated from the CVS log. The
+ function is passed a list with the changeset entries, and can
+ modify the changesets in-place, or add or delete them.
+
+ An additional "debugcvsps" Mercurial command allows the builtin
+ changeset merging code to be run without doing a conversion. Its
+ parameters and output are similar to that of cvsps 2.1. Please see
+ the command help for more details.
+
+ Subversion Source
+ #################
+
+ Subversion source detects classical trunk/branches/tags layouts.
+ By default, the supplied ``svn://repo/path/`` source URL is
+ converted as a single branch. If ``svn://repo/path/trunk`` exists
+ it replaces the default branch. If ``svn://repo/path/branches``
+ exists, its subdirectories are listed as possible branches. If
+ ``svn://repo/path/tags`` exists, it is looked for tags referencing
+ converted branches. Default ``trunk``, ``branches`` and ``tags``
+ values can be overridden with following options. Set them to paths
+ relative to the source URL, or leave them blank to disable auto
+ detection.
+
+ The following options can be set with ``--config``:
+
+ :convert.svn.branches: specify the directory containing branches.
+ The default is ``branches``.
+
+ :convert.svn.tags: specify the directory containing tags. The
+ default is ``tags``.
+
+ :convert.svn.trunk: specify the name of the trunk branch. The
+ default is ``trunk``.
+
+ Source history can be retrieved starting at a specific revision,
+ instead of being integrally converted. Only single branch
+ conversions are supported.
+
+ :convert.svn.startrev: specify start Subversion revision number.
+ The default is 0.
+
+ Perforce Source
+ ###############
+
+ The Perforce (P4) importer can be given a p4 depot path or a
+ client specification as source. It will convert all files in the
+ source to a flat Mercurial repository, ignoring labels, branches
+ and integrations. Note that when a depot path is given you then
+ usually should specify a target directory, because otherwise the
+ target may be named ``...-hg``.
+
+ It is possible to limit the amount of source history to be
+ converted by specifying an initial Perforce revision:
+
+ :convert.p4.startrev: specify initial Perforce revision (a
+ Perforce changelist number).
+
+ Mercurial Destination
+ #####################
+
+ The following options are supported:
+
+ :convert.hg.clonebranches: dispatch source branches in separate
+ clones. The default is False.
+
+ :convert.hg.tagsbranch: branch name for tag revisions, defaults to
+ ``default``.
+
+ :convert.hg.usebranchnames: preserve branch names. The default is
+ True.
+ """
+ return convcmd.convert(ui, src, dest, revmapfile, **opts)
+
+def debugsvnlog(ui, **opts):
+ return subversion.debugsvnlog(ui, **opts)
+
+def debugcvsps(ui, *args, **opts):
+ '''create changeset information from CVS
+
+ This command is intended as a debugging tool for the CVS to
+ Mercurial converter, and can be used as a direct replacement for
+ cvsps.
+
+ Hg debugcvsps reads the CVS rlog for current directory (or any
+ named directory) in the CVS repository, and converts the log to a
+ series of changesets based on matching commit log entries and
+ dates.'''
+ return cvsps.debugcvsps(ui, *args, **opts)
+
+commands.norepo += " convert debugsvnlog debugcvsps"
+
+cmdtable = {
+ "convert":
+ (convert,
+ [('', 'authors', '',
+ _('username mapping filename (DEPRECATED, use --authormap instead)'),
+ _('FILE')),
+ ('s', 'source-type', '',
+ _('source repository type'), _('TYPE')),
+ ('d', 'dest-type', '',
+ _('destination repository type'), _('TYPE')),
+ ('r', 'rev', '',
+ _('import up to target revision REV'), _('REV')),
+ ('A', 'authormap', '',
+ _('remap usernames using this file'), _('FILE')),
+ ('', 'filemap', '',
+ _('remap file names using contents of file'), _('FILE')),
+ ('', 'splicemap', '',
+ _('splice synthesized history into place'), _('FILE')),
+ ('', 'branchmap', '',
+ _('change branch names while converting'), _('FILE')),
+ ('', 'branchsort', None, _('try to sort changesets by branches')),
+ ('', 'datesort', None, _('try to sort changesets by date')),
+ ('', 'sourcesort', None, _('preserve source changesets order'))],
+ _('hg convert [OPTION]... SOURCE [DEST [REVMAP]]')),
+ "debugsvnlog":
+ (debugsvnlog,
+ [],
+ 'hg debugsvnlog'),
+ "debugcvsps":
+ (debugcvsps,
+ [
+ # Main options shared with cvsps-2.1
+ ('b', 'branches', [], _('only return changes on specified branches')),
+ ('p', 'prefix', '', _('prefix to remove from file names')),
+ ('r', 'revisions', [],
+ _('only return changes after or between specified tags')),
+ ('u', 'update-cache', None, _("update cvs log cache")),
+ ('x', 'new-cache', None, _("create new cvs log cache")),
+ ('z', 'fuzz', 60, _('set commit time fuzz in seconds')),
+ ('', 'root', '', _('specify cvsroot')),
+ # Options specific to builtin cvsps
+ ('', 'parents', '', _('show parent changesets')),
+ ('', 'ancestors', '',
+ _('show current changeset in ancestor branches')),
+ # Options that are ignored for compatibility with cvsps-2.1
+ ('A', 'cvs-direct', None, _('ignored for compatibility')),
+ ],
+ _('hg debugcvsps [OPTION]... [PATH]...')),
+}
+
+def kwconverted(ctx, name):
+ rev = ctx.extra().get('convert_revision', '')
+ if rev.startswith('svn:'):
+ if name == 'svnrev':
+ return str(subversion.revsplit(rev)[2])
+ elif name == 'svnpath':
+ return subversion.revsplit(rev)[1]
+ elif name == 'svnuuid':
+ return subversion.revsplit(rev)[0]
+ return rev
+
+def kwsvnrev(repo, ctx, **args):
+ """:svnrev: String. Converted subversion revision number."""
+ return kwconverted(ctx, 'svnrev')
+
+def kwsvnpath(repo, ctx, **args):
+ """:svnpath: String. Converted subversion revision project path."""
+ return kwconverted(ctx, 'svnpath')
+
+def kwsvnuuid(repo, ctx, **args):
+ """:svnuuid: String. Converted subversion revision repository identifier."""
+ return kwconverted(ctx, 'svnuuid')
+
+def extsetup(ui):
+ templatekw.keywords['svnrev'] = kwsvnrev
+ templatekw.keywords['svnpath'] = kwsvnpath
+ templatekw.keywords['svnuuid'] = kwsvnuuid
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = [kwsvnrev, kwsvnpath, kwsvnuuid]
diff --git a/hgext/convert/bzr.py b/hgext/convert/bzr.py
new file mode 100644
index 0000000..5eef902
--- /dev/null
+++ b/hgext/convert/bzr.py
@@ -0,0 +1,285 @@
+# bzr.py - bzr support for the convert extension
+#
+# Copyright 2008, 2009 Marek Kubica <marek@xivilization.net> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# This module is for handling 'bzr', that was formerly known as Bazaar-NG;
+# it cannot access 'bar' repositories, but they were never used very much
+
+import os
+from mercurial import demandimport
+# these do not work with demandimport, blacklist
+demandimport.ignore.extend([
+ 'bzrlib.transactions',
+ 'bzrlib.urlutils',
+ 'ElementPath',
+ ])
+
+from mercurial.i18n import _
+from mercurial import util
+from common import NoRepo, commit, converter_source
+
+try:
+ # bazaar imports
+ from bzrlib import bzrdir, revision, errors
+ from bzrlib.revisionspec import RevisionSpec
+except ImportError:
+ pass
+
+supportedkinds = ('file', 'symlink')
+
+class bzr_source(converter_source):
+ """Reads Bazaar repositories by using the Bazaar Python libraries"""
+
+ def __init__(self, ui, path, rev=None):
+ super(bzr_source, self).__init__(ui, path, rev=rev)
+
+ if not os.path.exists(os.path.join(path, '.bzr')):
+ raise NoRepo(_('%s does not look like a Bazaar repository')
+ % path)
+
+ try:
+ # access bzrlib stuff
+ bzrdir
+ except NameError:
+ raise NoRepo(_('Bazaar modules could not be loaded'))
+
+ path = os.path.abspath(path)
+ self._checkrepotype(path)
+ try:
+ self.sourcerepo = bzrdir.BzrDir.open(path).open_repository()
+ except errors.NoRepositoryPresent:
+ raise NoRepo(_('%s does not look like a Bazaar repository')
+ % path)
+ self._parentids = {}
+
+ def _checkrepotype(self, path):
+ # Lightweight checkouts detection is informational but probably
+ # fragile at API level. It should not terminate the conversion.
+ try:
+ from bzrlib import bzrdir
+ dir = bzrdir.BzrDir.open_containing(path)[0]
+ try:
+ tree = dir.open_workingtree(recommend_upgrade=False)
+ branch = tree.branch
+ except (errors.NoWorkingTree, errors.NotLocalUrl):
+ tree = None
+ branch = dir.open_branch()
+ if (tree is not None and tree.bzrdir.root_transport.base !=
+ branch.bzrdir.root_transport.base):
+ self.ui.warn(_('warning: lightweight checkouts may cause '
+ 'conversion failures, try with a regular '
+ 'branch instead.\n'))
+ except Exception:
+ self.ui.note(_('bzr source type could not be determined\n'))
+
+ def before(self):
+ """Before the conversion begins, acquire a read lock
+ for all the operations that might need it. Fortunately
+ read locks don't block other reads or writes to the
+ repository, so this shouldn't have any impact on the usage of
+ the source repository.
+
+ The alternative would be locking on every operation that
+ needs locks (there are currently two: getting the file and
+ getting the parent map) and releasing immediately after,
+ but this approach can take even 40% longer."""
+ self.sourcerepo.lock_read()
+
+ def after(self):
+ self.sourcerepo.unlock()
+
+ def _bzrbranches(self):
+ return self.sourcerepo.find_branches(using=True)
+
+ def getheads(self):
+ if not self.rev:
+ # Set using=True to avoid nested repositories (see issue3254)
+ heads = sorted([b.last_revision() for b in self._bzrbranches()])
+ else:
+ revid = None
+ for branch in self._bzrbranches():
+ try:
+ r = RevisionSpec.from_string(self.rev)
+ info = r.in_history(branch)
+ except errors.BzrError:
+ pass
+ revid = info.rev_id
+ if revid is None:
+ raise util.Abort(_('%s is not a valid revision') % self.rev)
+ heads = [revid]
+ # Empty repositories return 'null:', which cannot be retrieved
+ heads = [h for h in heads if h != 'null:']
+ return heads
+
+ def getfile(self, name, rev):
+ revtree = self.sourcerepo.revision_tree(rev)
+ fileid = revtree.path2id(name.decode(self.encoding or 'utf-8'))
+ kind = None
+ if fileid is not None:
+ kind = revtree.kind(fileid)
+ if kind not in supportedkinds:
+ # the file is not available anymore - was deleted
+ raise IOError(_('%s is not available in %s anymore') %
+ (name, rev))
+ mode = self._modecache[(name, rev)]
+ if kind == 'symlink':
+ target = revtree.get_symlink_target(fileid)
+ if target is None:
+ raise util.Abort(_('%s.%s symlink has no target')
+ % (name, rev))
+ return target, mode
+ else:
+ sio = revtree.get_file(fileid)
+ return sio.read(), mode
+
+ def getchanges(self, version):
+ # set up caches: modecache and revtree
+ self._modecache = {}
+ self._revtree = self.sourcerepo.revision_tree(version)
+ # get the parentids from the cache
+ parentids = self._parentids.pop(version)
+ # only diff against first parent id
+ prevtree = self.sourcerepo.revision_tree(parentids[0])
+ return self._gettreechanges(self._revtree, prevtree)
+
+ def getcommit(self, version):
+ rev = self.sourcerepo.get_revision(version)
+ # populate parent id cache
+ if not rev.parent_ids:
+ parents = []
+ self._parentids[version] = (revision.NULL_REVISION,)
+ else:
+ parents = self._filterghosts(rev.parent_ids)
+ self._parentids[version] = parents
+
+ branch = self.recode(rev.properties.get('branch-nick', u'default'))
+ if branch == 'trunk':
+ branch = 'default'
+ return commit(parents=parents,
+ date='%d %d' % (rev.timestamp, -rev.timezone),
+ author=self.recode(rev.committer),
+ desc=self.recode(rev.message),
+ branch=branch,
+ rev=version)
+
+ def gettags(self):
+ bytetags = {}
+ for branch in self._bzrbranches():
+ if not branch.supports_tags():
+ return {}
+ tagdict = branch.tags.get_tag_dict()
+ for name, rev in tagdict.iteritems():
+ bytetags[self.recode(name)] = rev
+ return bytetags
+
+ def getchangedfiles(self, rev, i):
+ self._modecache = {}
+ curtree = self.sourcerepo.revision_tree(rev)
+ if i is not None:
+ parentid = self._parentids[rev][i]
+ else:
+ # no parent id, get the empty revision
+ parentid = revision.NULL_REVISION
+
+ prevtree = self.sourcerepo.revision_tree(parentid)
+ changes = [e[0] for e in self._gettreechanges(curtree, prevtree)[0]]
+ return changes
+
+ def _gettreechanges(self, current, origin):
+ revid = current._revision_id
+ changes = []
+ renames = {}
+ seen = set()
+ # Process the entries by reverse lexicographic name order to
+ # handle nested renames correctly, most specific first.
+ curchanges = sorted(current.iter_changes(origin),
+ key=lambda c: c[1][0] or c[1][1],
+ reverse=True)
+ for (fileid, paths, changed_content, versioned, parent, name,
+ kind, executable) in curchanges:
+
+ if paths[0] == u'' or paths[1] == u'':
+ # ignore changes to tree root
+ continue
+
+ # bazaar tracks directories, mercurial does not, so
+ # we have to rename the directory contents
+ if kind[1] == 'directory':
+ if kind[0] not in (None, 'directory'):
+ # Replacing 'something' with a directory, record it
+ # so it can be removed.
+ changes.append((self.recode(paths[0]), revid))
+
+ if kind[0] == 'directory' and None not in paths:
+ renaming = paths[0] != paths[1]
+ # neither an add nor an delete - a move
+ # rename all directory contents manually
+ subdir = origin.inventory.path2id(paths[0])
+ # get all child-entries of the directory
+ for name, entry in origin.inventory.iter_entries(subdir):
+ # hg does not track directory renames
+ if entry.kind == 'directory':
+ continue
+ frompath = self.recode(paths[0] + '/' + name)
+ if frompath in seen:
+ # Already handled by a more specific change entry
+ # This is important when you have:
+ # a => b
+ # a/c => a/c
+ # Here a/c must not be renamed into b/c
+ continue
+ seen.add(frompath)
+ if not renaming:
+ continue
+ topath = self.recode(paths[1] + '/' + name)
+ # register the files as changed
+ changes.append((frompath, revid))
+ changes.append((topath, revid))
+ # add to mode cache
+ mode = ((entry.executable and 'x')
+ or (entry.kind == 'symlink' and 's')
+ or '')
+ self._modecache[(topath, revid)] = mode
+ # register the change as move
+ renames[topath] = frompath
+
+ # no futher changes, go to the next change
+ continue
+
+ # we got unicode paths, need to convert them
+ path, topath = paths
+ if path is not None:
+ path = self.recode(path)
+ if topath is not None:
+ topath = self.recode(topath)
+ seen.add(path or topath)
+
+ if topath is None:
+ # file deleted
+ changes.append((path, revid))
+ continue
+
+ # renamed
+ if path and path != topath:
+ renames[topath] = path
+ changes.append((path, revid))
+
+ # populate the mode cache
+ kind, executable = [e[1] for e in (kind, executable)]
+ mode = ((executable and 'x') or (kind == 'symlink' and 'l')
+ or '')
+ self._modecache[(topath, revid)] = mode
+ changes.append((topath, revid))
+
+ return changes, renames
+
+ def _filterghosts(self, ids):
+ """Filters out ghost revisions which hg does not support, see
+ <http://bazaar-vcs.org/GhostRevision>
+ """
+ parentmap = self.sourcerepo.get_parent_map(ids)
+ parents = tuple([parent for parent in ids if parent in parentmap])
+ return parents
diff --git a/hgext/convert/common.py b/hgext/convert/common.py
new file mode 100644
index 0000000..e30ef2d
--- /dev/null
+++ b/hgext/convert/common.py
@@ -0,0 +1,445 @@
+# common.py - common code for the convert extension
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import base64, errno
+import os
+import cPickle as pickle
+from mercurial import util
+from mercurial.i18n import _
+
+propertycache = util.propertycache
+
+def encodeargs(args):
+ def encodearg(s):
+ lines = base64.encodestring(s)
+ lines = [l.splitlines()[0] for l in lines]
+ return ''.join(lines)
+
+ s = pickle.dumps(args)
+ return encodearg(s)
+
+def decodeargs(s):
+ s = base64.decodestring(s)
+ return pickle.loads(s)
+
+class MissingTool(Exception):
+ pass
+
+def checktool(exe, name=None, abort=True):
+ name = name or exe
+ if not util.findexe(exe):
+ exc = abort and util.Abort or MissingTool
+ raise exc(_('cannot find required "%s" tool') % name)
+
+class NoRepo(Exception):
+ pass
+
+SKIPREV = 'SKIP'
+
+class commit(object):
+ def __init__(self, author, date, desc, parents, branch=None, rev=None,
+ extra={}, sortkey=None):
+ self.author = author or 'unknown'
+ self.date = date or '0 0'
+ self.desc = desc
+ self.parents = parents
+ self.branch = branch
+ self.rev = rev
+ self.extra = extra
+ self.sortkey = sortkey
+
+class converter_source(object):
+ """Conversion source interface"""
+
+ def __init__(self, ui, path=None, rev=None):
+ """Initialize conversion source (or raise NoRepo("message")
+ exception if path is not a valid repository)"""
+ self.ui = ui
+ self.path = path
+ self.rev = rev
+
+ self.encoding = 'utf-8'
+
+ def before(self):
+ pass
+
+ def after(self):
+ pass
+
+ def setrevmap(self, revmap):
+ """set the map of already-converted revisions"""
+ pass
+
+ def getheads(self):
+ """Return a list of this repository's heads"""
+ raise NotImplementedError
+
+ def getfile(self, name, rev):
+ """Return a pair (data, mode) where data is the file content
+ as a string and mode one of '', 'x' or 'l'. rev is the
+ identifier returned by a previous call to getchanges(). Raise
+ IOError to indicate that name was deleted in rev.
+ """
+ raise NotImplementedError
+
+ def getchanges(self, version):
+ """Returns a tuple of (files, copies).
+
+ files is a sorted list of (filename, id) tuples for all files
+ changed between version and its first parent returned by
+ getcommit(). id is the source revision id of the file.
+
+ copies is a dictionary of dest: source
+ """
+ raise NotImplementedError
+
+ def getcommit(self, version):
+ """Return the commit object for version"""
+ raise NotImplementedError
+
+ def gettags(self):
+ """Return the tags as a dictionary of name: revision
+
+ Tag names must be UTF-8 strings.
+ """
+ raise NotImplementedError
+
+ def recode(self, s, encoding=None):
+ if not encoding:
+ encoding = self.encoding or 'utf-8'
+
+ if isinstance(s, unicode):
+ return s.encode("utf-8")
+ try:
+ return s.decode(encoding).encode("utf-8")
+ except UnicodeError:
+ try:
+ return s.decode("latin-1").encode("utf-8")
+ except UnicodeError:
+ return s.decode(encoding, "replace").encode("utf-8")
+
+ def getchangedfiles(self, rev, i):
+ """Return the files changed by rev compared to parent[i].
+
+ i is an index selecting one of the parents of rev. The return
+ value should be the list of files that are different in rev and
+ this parent.
+
+ If rev has no parents, i is None.
+
+ This function is only needed to support --filemap
+ """
+ raise NotImplementedError
+
+ def converted(self, rev, sinkrev):
+ '''Notify the source that a revision has been converted.'''
+ pass
+
+ def hasnativeorder(self):
+ """Return true if this source has a meaningful, native revision
+ order. For instance, Mercurial revisions are store sequentially
+ while there is no such global ordering with Darcs.
+ """
+ return False
+
+ def lookuprev(self, rev):
+ """If rev is a meaningful revision reference in source, return
+ the referenced identifier in the same format used by getcommit().
+ return None otherwise.
+ """
+ return None
+
+ def getbookmarks(self):
+ """Return the bookmarks as a dictionary of name: revision
+
+ Bookmark names are to be UTF-8 strings.
+ """
+ return {}
+
+class converter_sink(object):
+ """Conversion sink (target) interface"""
+
+ def __init__(self, ui, path):
+ """Initialize conversion sink (or raise NoRepo("message")
+ exception if path is not a valid repository)
+
+ created is a list of paths to remove if a fatal error occurs
+ later"""
+ self.ui = ui
+ self.path = path
+ self.created = []
+
+ def getheads(self):
+ """Return a list of this repository's heads"""
+ raise NotImplementedError
+
+ def revmapfile(self):
+ """Path to a file that will contain lines
+ source_rev_id sink_rev_id
+ mapping equivalent revision identifiers for each system."""
+ raise NotImplementedError
+
+ def authorfile(self):
+ """Path to a file that will contain lines
+ srcauthor=dstauthor
+ mapping equivalent authors identifiers for each system."""
+ return None
+
+ def putcommit(self, files, copies, parents, commit, source, revmap):
+ """Create a revision with all changed files listed in 'files'
+ and having listed parents. 'commit' is a commit object
+ containing at a minimum the author, date, and message for this
+ changeset. 'files' is a list of (path, version) tuples,
+ 'copies' is a dictionary mapping destinations to sources,
+ 'source' is the source repository, and 'revmap' is a mapfile
+ of source revisions to converted revisions. Only getfile() and
+ lookuprev() should be called on 'source'.
+
+ Note that the sink repository is not told to update itself to
+ a particular revision (or even what that revision would be)
+ before it receives the file data.
+ """
+ raise NotImplementedError
+
+ def puttags(self, tags):
+ """Put tags into sink.
+
+ tags: {tagname: sink_rev_id, ...} where tagname is an UTF-8 string.
+ Return a pair (tag_revision, tag_parent_revision), or (None, None)
+ if nothing was changed.
+ """
+ raise NotImplementedError
+
+ def setbranch(self, branch, pbranches):
+ """Set the current branch name. Called before the first putcommit
+ on the branch.
+ branch: branch name for subsequent commits
+ pbranches: (converted parent revision, parent branch) tuples"""
+ pass
+
+ def setfilemapmode(self, active):
+ """Tell the destination that we're using a filemap
+
+ Some converter_sources (svn in particular) can claim that a file
+ was changed in a revision, even if there was no change. This method
+ tells the destination that we're using a filemap and that it should
+ filter empty revisions.
+ """
+ pass
+
+ def before(self):
+ pass
+
+ def after(self):
+ pass
+
+ def putbookmarks(self, bookmarks):
+ """Put bookmarks into sink.
+
+ bookmarks: {bookmarkname: sink_rev_id, ...}
+ where bookmarkname is an UTF-8 string.
+ """
+ pass
+
+ def hascommit(self, rev):
+ """Return True if the sink contains rev"""
+ raise NotImplementedError
+
+class commandline(object):
+ def __init__(self, ui, command):
+ self.ui = ui
+ self.command = command
+
+ def prerun(self):
+ pass
+
+ def postrun(self):
+ pass
+
+ def _cmdline(self, cmd, closestdin, *args, **kwargs):
+ cmdline = [self.command, cmd] + list(args)
+ for k, v in kwargs.iteritems():
+ if len(k) == 1:
+ cmdline.append('-' + k)
+ else:
+ cmdline.append('--' + k.replace('_', '-'))
+ try:
+ if len(k) == 1:
+ cmdline.append('' + v)
+ else:
+ cmdline[-1] += '=' + v
+ except TypeError:
+ pass
+ cmdline = [util.shellquote(arg) for arg in cmdline]
+ if not self.ui.debugflag:
+ cmdline += ['2>', util.nulldev]
+ if closestdin:
+ cmdline += ['<', util.nulldev]
+ cmdline = ' '.join(cmdline)
+ return cmdline
+
+ def _run(self, cmd, *args, **kwargs):
+ return self._dorun(util.popen, cmd, True, *args, **kwargs)
+
+ def _run2(self, cmd, *args, **kwargs):
+ return self._dorun(util.popen2, cmd, False, *args, **kwargs)
+
+ def _dorun(self, openfunc, cmd, closestdin, *args, **kwargs):
+ cmdline = self._cmdline(cmd, closestdin, *args, **kwargs)
+ self.ui.debug('running: %s\n' % (cmdline,))
+ self.prerun()
+ try:
+ return openfunc(cmdline)
+ finally:
+ self.postrun()
+
+ def run(self, cmd, *args, **kwargs):
+ fp = self._run(cmd, *args, **kwargs)
+ output = fp.read()
+ self.ui.debug(output)
+ return output, fp.close()
+
+ def runlines(self, cmd, *args, **kwargs):
+ fp = self._run(cmd, *args, **kwargs)
+ output = fp.readlines()
+ self.ui.debug(''.join(output))
+ return output, fp.close()
+
+ def checkexit(self, status, output=''):
+ if status:
+ if output:
+ self.ui.warn(_('%s error:\n') % self.command)
+ self.ui.warn(output)
+ msg = util.explainexit(status)[0]
+ raise util.Abort('%s %s' % (self.command, msg))
+
+ def run0(self, cmd, *args, **kwargs):
+ output, status = self.run(cmd, *args, **kwargs)
+ self.checkexit(status, output)
+ return output
+
+ def runlines0(self, cmd, *args, **kwargs):
+ output, status = self.runlines(cmd, *args, **kwargs)
+ self.checkexit(status, ''.join(output))
+ return output
+
+ @propertycache
+ def argmax(self):
+ # POSIX requires at least 4096 bytes for ARG_MAX
+ argmax = 4096
+ try:
+ argmax = os.sysconf("SC_ARG_MAX")
+ except (AttributeError, ValueError):
+ pass
+
+ # Windows shells impose their own limits on command line length,
+ # down to 2047 bytes for cmd.exe under Windows NT/2k and 2500 bytes
+ # for older 4nt.exe. See http://support.microsoft.com/kb/830473 for
+ # details about cmd.exe limitations.
+
+ # Since ARG_MAX is for command line _and_ environment, lower our limit
+ # (and make happy Windows shells while doing this).
+ return argmax // 2 - 1
+
+ def limit_arglist(self, arglist, cmd, closestdin, *args, **kwargs):
+ cmdlen = len(self._cmdline(cmd, closestdin, *args, **kwargs))
+ limit = self.argmax - cmdlen
+ bytes = 0
+ fl = []
+ for fn in arglist:
+ b = len(fn) + 3
+ if bytes + b < limit or len(fl) == 0:
+ fl.append(fn)
+ bytes += b
+ else:
+ yield fl
+ fl = [fn]
+ bytes = b
+ if fl:
+ yield fl
+
+ def xargs(self, arglist, cmd, *args, **kwargs):
+ for l in self.limit_arglist(arglist, cmd, True, *args, **kwargs):
+ self.run0(cmd, *(list(args) + l), **kwargs)
+
+class mapfile(dict):
+ def __init__(self, ui, path):
+ super(mapfile, self).__init__()
+ self.ui = ui
+ self.path = path
+ self.fp = None
+ self.order = []
+ self._read()
+
+ def _read(self):
+ if not self.path:
+ return
+ try:
+ fp = open(self.path, 'r')
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return
+ for i, line in enumerate(fp):
+ line = line.splitlines()[0].rstrip()
+ if not line:
+ # Ignore blank lines
+ continue
+ try:
+ key, value = line.rsplit(' ', 1)
+ except ValueError:
+ raise util.Abort(
+ _('syntax error in %s(%d): key/value pair expected')
+ % (self.path, i + 1))
+ if key not in self:
+ self.order.append(key)
+ super(mapfile, self).__setitem__(key, value)
+ fp.close()
+
+ def __setitem__(self, key, value):
+ if self.fp is None:
+ try:
+ self.fp = open(self.path, 'a')
+ except IOError, err:
+ raise util.Abort(_('could not open map file %r: %s') %
+ (self.path, err.strerror))
+ self.fp.write('%s %s\n' % (key, value))
+ self.fp.flush()
+ super(mapfile, self).__setitem__(key, value)
+
+ def close(self):
+ if self.fp:
+ self.fp.close()
+ self.fp = None
+
+def parsesplicemap(path):
+ """Parse a splicemap, return a child/parents dictionary."""
+ if not path:
+ return {}
+ m = {}
+ try:
+ fp = open(path, 'r')
+ for i, line in enumerate(fp):
+ line = line.splitlines()[0].rstrip()
+ if not line:
+ # Ignore blank lines
+ continue
+ try:
+ child, parents = line.split(' ', 1)
+ parents = parents.replace(',', ' ').split()
+ except ValueError:
+ raise util.Abort(_('syntax error in %s(%d): child parent1'
+ '[,parent2] expected') % (path, i + 1))
+ pp = []
+ for p in parents:
+ if p not in pp:
+ pp.append(p)
+ m[child] = pp
+ except IOError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ return m
diff --git a/hgext/convert/convcmd.py b/hgext/convert/convcmd.py
new file mode 100644
index 0000000..c8fe845
--- /dev/null
+++ b/hgext/convert/convcmd.py
@@ -0,0 +1,470 @@
+# convcmd - convert extension commands definition
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from common import NoRepo, MissingTool, SKIPREV, mapfile
+from cvs import convert_cvs
+from darcs import darcs_source
+from git import convert_git
+from hg import mercurial_source, mercurial_sink
+from subversion import svn_source, svn_sink
+from monotone import monotone_source
+from gnuarch import gnuarch_source
+from bzr import bzr_source
+from p4 import p4_source
+import filemap, common
+
+import os, shutil
+from mercurial import hg, util, encoding
+from mercurial.i18n import _
+
+orig_encoding = 'ascii'
+
+def recode(s):
+ if isinstance(s, unicode):
+ return s.encode(orig_encoding, 'replace')
+ else:
+ return s.decode('utf-8').encode(orig_encoding, 'replace')
+
+source_converters = [
+ ('cvs', convert_cvs, 'branchsort'),
+ ('git', convert_git, 'branchsort'),
+ ('svn', svn_source, 'branchsort'),
+ ('hg', mercurial_source, 'sourcesort'),
+ ('darcs', darcs_source, 'branchsort'),
+ ('mtn', monotone_source, 'branchsort'),
+ ('gnuarch', gnuarch_source, 'branchsort'),
+ ('bzr', bzr_source, 'branchsort'),
+ ('p4', p4_source, 'branchsort'),
+ ]
+
+sink_converters = [
+ ('hg', mercurial_sink),
+ ('svn', svn_sink),
+ ]
+
+def convertsource(ui, path, type, rev):
+ exceptions = []
+ if type and type not in [s[0] for s in source_converters]:
+ raise util.Abort(_('%s: invalid source repository type') % type)
+ for name, source, sortmode in source_converters:
+ try:
+ if not type or name == type:
+ return source(ui, path, rev), sortmode
+ except (NoRepo, MissingTool), inst:
+ exceptions.append(inst)
+ if not ui.quiet:
+ for inst in exceptions:
+ ui.write("%s\n" % inst)
+ raise util.Abort(_('%s: missing or unsupported repository') % path)
+
+def convertsink(ui, path, type):
+ if type and type not in [s[0] for s in sink_converters]:
+ raise util.Abort(_('%s: invalid destination repository type') % type)
+ for name, sink in sink_converters:
+ try:
+ if not type or name == type:
+ return sink(ui, path)
+ except NoRepo, inst:
+ ui.note(_("convert: %s\n") % inst)
+ except MissingTool, inst:
+ raise util.Abort('%s\n' % inst)
+ raise util.Abort(_('%s: unknown repository type') % path)
+
+class progresssource(object):
+ def __init__(self, ui, source, filecount):
+ self.ui = ui
+ self.source = source
+ self.filecount = filecount
+ self.retrieved = 0
+
+ def getfile(self, file, rev):
+ self.retrieved += 1
+ self.ui.progress(_('getting files'), self.retrieved,
+ item=file, total=self.filecount)
+ return self.source.getfile(file, rev)
+
+ def lookuprev(self, rev):
+ return self.source.lookuprev(rev)
+
+ def close(self):
+ self.ui.progress(_('getting files'), None)
+
+class converter(object):
+ def __init__(self, ui, source, dest, revmapfile, opts):
+
+ self.source = source
+ self.dest = dest
+ self.ui = ui
+ self.opts = opts
+ self.commitcache = {}
+ self.authors = {}
+ self.authorfile = None
+
+ # Record converted revisions persistently: maps source revision
+ # ID to target revision ID (both strings). (This is how
+ # incremental conversions work.)
+ self.map = mapfile(ui, revmapfile)
+
+ # Read first the dst author map if any
+ authorfile = self.dest.authorfile()
+ if authorfile and os.path.exists(authorfile):
+ self.readauthormap(authorfile)
+ # Extend/Override with new author map if necessary
+ if opts.get('authormap'):
+ self.readauthormap(opts.get('authormap'))
+ self.authorfile = self.dest.authorfile()
+
+ self.splicemap = common.parsesplicemap(opts.get('splicemap'))
+ self.branchmap = mapfile(ui, opts.get('branchmap'))
+
+ def walktree(self, heads):
+ '''Return a mapping that identifies the uncommitted parents of every
+ uncommitted changeset.'''
+ visit = heads
+ known = set()
+ parents = {}
+ while visit:
+ n = visit.pop(0)
+ if n in known or n in self.map:
+ continue
+ known.add(n)
+ self.ui.progress(_('scanning'), len(known), unit=_('revisions'))
+ commit = self.cachecommit(n)
+ parents[n] = []
+ for p in commit.parents:
+ parents[n].append(p)
+ visit.append(p)
+ self.ui.progress(_('scanning'), None)
+
+ return parents
+
+ def mergesplicemap(self, parents, splicemap):
+ """A splicemap redefines child/parent relationships. Check the
+ map contains valid revision identifiers and merge the new
+ links in the source graph.
+ """
+ for c in splicemap:
+ if c not in parents:
+ if not self.dest.hascommit(self.map.get(c, c)):
+ # Could be in source but not converted during this run
+ self.ui.warn(_('splice map revision %s is not being '
+ 'converted, ignoring\n') % c)
+ continue
+ pc = []
+ for p in splicemap[c]:
+ # We do not have to wait for nodes already in dest.
+ if self.dest.hascommit(self.map.get(p, p)):
+ continue
+ # Parent is not in dest and not being converted, not good
+ if p not in parents:
+ raise util.Abort(_('unknown splice map parent: %s') % p)
+ pc.append(p)
+ parents[c] = pc
+
+ def toposort(self, parents, sortmode):
+ '''Return an ordering such that every uncommitted changeset is
+ preceeded by all its uncommitted ancestors.'''
+
+ def mapchildren(parents):
+ """Return a (children, roots) tuple where 'children' maps parent
+ revision identifiers to children ones, and 'roots' is the list of
+ revisions without parents. 'parents' must be a mapping of revision
+ identifier to its parents ones.
+ """
+ visit = parents.keys()
+ seen = set()
+ children = {}
+ roots = []
+
+ while visit:
+ n = visit.pop(0)
+ if n in seen:
+ continue
+ seen.add(n)
+ # Ensure that nodes without parents are present in the
+ # 'children' mapping.
+ children.setdefault(n, [])
+ hasparent = False
+ for p in parents[n]:
+ if p not in self.map:
+ visit.append(p)
+ hasparent = True
+ children.setdefault(p, []).append(n)
+ if not hasparent:
+ roots.append(n)
+
+ return children, roots
+
+ # Sort functions are supposed to take a list of revisions which
+ # can be converted immediately and pick one
+
+ def makebranchsorter():
+ """If the previously converted revision has a child in the
+ eligible revisions list, pick it. Return the list head
+ otherwise. Branch sort attempts to minimize branch
+ switching, which is harmful for Mercurial backend
+ compression.
+ """
+ prev = [None]
+ def picknext(nodes):
+ next = nodes[0]
+ for n in nodes:
+ if prev[0] in parents[n]:
+ next = n
+ break
+ prev[0] = next
+ return next
+ return picknext
+
+ def makesourcesorter():
+ """Source specific sort."""
+ keyfn = lambda n: self.commitcache[n].sortkey
+ def picknext(nodes):
+ return sorted(nodes, key=keyfn)[0]
+ return picknext
+
+ def makedatesorter():
+ """Sort revisions by date."""
+ dates = {}
+ def getdate(n):
+ if n not in dates:
+ dates[n] = util.parsedate(self.commitcache[n].date)
+ return dates[n]
+
+ def picknext(nodes):
+ return min([(getdate(n), n) for n in nodes])[1]
+
+ return picknext
+
+ if sortmode == 'branchsort':
+ picknext = makebranchsorter()
+ elif sortmode == 'datesort':
+ picknext = makedatesorter()
+ elif sortmode == 'sourcesort':
+ picknext = makesourcesorter()
+ else:
+ raise util.Abort(_('unknown sort mode: %s') % sortmode)
+
+ children, actives = mapchildren(parents)
+
+ s = []
+ pendings = {}
+ while actives:
+ n = picknext(actives)
+ actives.remove(n)
+ s.append(n)
+
+ # Update dependents list
+ for c in children.get(n, []):
+ if c not in pendings:
+ pendings[c] = [p for p in parents[c] if p not in self.map]
+ try:
+ pendings[c].remove(n)
+ except ValueError:
+ raise util.Abort(_('cycle detected between %s and %s')
+ % (recode(c), recode(n)))
+ if not pendings[c]:
+ # Parents are converted, node is eligible
+ actives.insert(0, c)
+ pendings[c] = None
+
+ if len(s) != len(parents):
+ raise util.Abort(_("not all revisions were sorted"))
+
+ return s
+
+ def writeauthormap(self):
+ authorfile = self.authorfile
+ if authorfile:
+ self.ui.status(_('writing author map file %s\n') % authorfile)
+ ofile = open(authorfile, 'w+')
+ for author in self.authors:
+ ofile.write("%s=%s\n" % (author, self.authors[author]))
+ ofile.close()
+
+ def readauthormap(self, authorfile):
+ afile = open(authorfile, 'r')
+ for line in afile:
+
+ line = line.strip()
+ if not line or line.startswith('#'):
+ continue
+
+ try:
+ srcauthor, dstauthor = line.split('=', 1)
+ except ValueError:
+ msg = _('ignoring bad line in author map file %s: %s\n')
+ self.ui.warn(msg % (authorfile, line.rstrip()))
+ continue
+
+ srcauthor = srcauthor.strip()
+ dstauthor = dstauthor.strip()
+ if self.authors.get(srcauthor) in (None, dstauthor):
+ msg = _('mapping author %s to %s\n')
+ self.ui.debug(msg % (srcauthor, dstauthor))
+ self.authors[srcauthor] = dstauthor
+ continue
+
+ m = _('overriding mapping for author %s, was %s, will be %s\n')
+ self.ui.status(m % (srcauthor, self.authors[srcauthor], dstauthor))
+
+ afile.close()
+
+ def cachecommit(self, rev):
+ commit = self.source.getcommit(rev)
+ commit.author = self.authors.get(commit.author, commit.author)
+ commit.branch = self.branchmap.get(commit.branch, commit.branch)
+ self.commitcache[rev] = commit
+ return commit
+
+ def copy(self, rev):
+ commit = self.commitcache[rev]
+
+ changes = self.source.getchanges(rev)
+ if isinstance(changes, basestring):
+ if changes == SKIPREV:
+ dest = SKIPREV
+ else:
+ dest = self.map[changes]
+ self.map[rev] = dest
+ return
+ files, copies = changes
+ pbranches = []
+ if commit.parents:
+ for prev in commit.parents:
+ if prev not in self.commitcache:
+ self.cachecommit(prev)
+ pbranches.append((self.map[prev],
+ self.commitcache[prev].branch))
+ self.dest.setbranch(commit.branch, pbranches)
+ try:
+ parents = self.splicemap[rev]
+ self.ui.status(_('spliced in %s as parents of %s\n') %
+ (parents, rev))
+ parents = [self.map.get(p, p) for p in parents]
+ except KeyError:
+ parents = [b[0] for b in pbranches]
+ source = progresssource(self.ui, self.source, len(files))
+ newnode = self.dest.putcommit(files, copies, parents, commit,
+ source, self.map)
+ source.close()
+ self.source.converted(rev, newnode)
+ self.map[rev] = newnode
+
+ def convert(self, sortmode):
+ try:
+ self.source.before()
+ self.dest.before()
+ self.source.setrevmap(self.map)
+ self.ui.status(_("scanning source...\n"))
+ heads = self.source.getheads()
+ parents = self.walktree(heads)
+ self.mergesplicemap(parents, self.splicemap)
+ self.ui.status(_("sorting...\n"))
+ t = self.toposort(parents, sortmode)
+ num = len(t)
+ c = None
+
+ self.ui.status(_("converting...\n"))
+ for i, c in enumerate(t):
+ num -= 1
+ desc = self.commitcache[c].desc
+ if "\n" in desc:
+ desc = desc.splitlines()[0]
+ # convert log message to local encoding without using
+ # tolocal() because the encoding.encoding convert()
+ # uses is 'utf-8'
+ self.ui.status("%d %s\n" % (num, recode(desc)))
+ self.ui.note(_("source: %s\n") % recode(c))
+ self.ui.progress(_('converting'), i, unit=_('revisions'),
+ total=len(t))
+ self.copy(c)
+ self.ui.progress(_('converting'), None)
+
+ tags = self.source.gettags()
+ ctags = {}
+ for k in tags:
+ v = tags[k]
+ if self.map.get(v, SKIPREV) != SKIPREV:
+ ctags[k] = self.map[v]
+
+ if c and ctags:
+ nrev, tagsparent = self.dest.puttags(ctags)
+ if nrev and tagsparent:
+ # write another hash correspondence to override the previous
+ # one so we don't end up with extra tag heads
+ tagsparents = [e for e in self.map.iteritems()
+ if e[1] == tagsparent]
+ if tagsparents:
+ self.map[tagsparents[0][0]] = nrev
+
+ bookmarks = self.source.getbookmarks()
+ cbookmarks = {}
+ for k in bookmarks:
+ v = bookmarks[k]
+ if self.map.get(v, SKIPREV) != SKIPREV:
+ cbookmarks[k] = self.map[v]
+
+ if c and cbookmarks:
+ self.dest.putbookmarks(cbookmarks)
+
+ self.writeauthormap()
+ finally:
+ self.cleanup()
+
+ def cleanup(self):
+ try:
+ self.dest.after()
+ finally:
+ self.source.after()
+ self.map.close()
+
+def convert(ui, src, dest=None, revmapfile=None, **opts):
+ global orig_encoding
+ orig_encoding = encoding.encoding
+ encoding.encoding = 'UTF-8'
+
+ # support --authors as an alias for --authormap
+ if not opts.get('authormap'):
+ opts['authormap'] = opts.get('authors')
+
+ if not dest:
+ dest = hg.defaultdest(src) + "-hg"
+ ui.status(_("assuming destination %s\n") % dest)
+
+ destc = convertsink(ui, dest, opts.get('dest_type'))
+
+ try:
+ srcc, defaultsort = convertsource(ui, src, opts.get('source_type'),
+ opts.get('rev'))
+ except Exception:
+ for path in destc.created:
+ shutil.rmtree(path, True)
+ raise
+
+ sortmodes = ('branchsort', 'datesort', 'sourcesort')
+ sortmode = [m for m in sortmodes if opts.get(m)]
+ if len(sortmode) > 1:
+ raise util.Abort(_('more than one sort mode specified'))
+ sortmode = sortmode and sortmode[0] or defaultsort
+ if sortmode == 'sourcesort' and not srcc.hasnativeorder():
+ raise util.Abort(_('--sourcesort is not supported by this data source'))
+
+ fmap = opts.get('filemap')
+ if fmap:
+ srcc = filemap.filemap_source(ui, srcc, fmap)
+ destc.setfilemapmode(True)
+
+ if not revmapfile:
+ try:
+ revmapfile = destc.revmapfile()
+ except Exception:
+ revmapfile = os.path.join(destc, "map")
+
+ c = converter(ui, srcc, destc, revmapfile, opts)
+ c.convert(sortmode)
+
diff --git a/hgext/convert/cvs.py b/hgext/convert/cvs.py
new file mode 100644
index 0000000..38b1d34
--- /dev/null
+++ b/hgext/convert/cvs.py
@@ -0,0 +1,272 @@
+# cvs.py: CVS conversion code inspired by hg-cvs-import and git-cvsimport
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, re, socket, errno
+from cStringIO import StringIO
+from mercurial import encoding, util
+from mercurial.i18n import _
+
+from common import NoRepo, commit, converter_source, checktool
+import cvsps
+
+class convert_cvs(converter_source):
+ def __init__(self, ui, path, rev=None):
+ super(convert_cvs, self).__init__(ui, path, rev=rev)
+
+ cvs = os.path.join(path, "CVS")
+ if not os.path.exists(cvs):
+ raise NoRepo(_("%s does not look like a CVS checkout") % path)
+
+ checktool('cvs')
+
+ self.changeset = None
+ self.files = {}
+ self.tags = {}
+ self.lastbranch = {}
+ self.socket = None
+ self.cvsroot = open(os.path.join(cvs, "Root")).read()[:-1]
+ self.cvsrepo = open(os.path.join(cvs, "Repository")).read()[:-1]
+ self.encoding = encoding.encoding
+
+ self._connect()
+
+ def _parse(self):
+ if self.changeset is not None:
+ return
+ self.changeset = {}
+
+ maxrev = 0
+ if self.rev:
+ # TODO: handle tags
+ try:
+ # patchset number?
+ maxrev = int(self.rev)
+ except ValueError:
+ raise util.Abort(_('revision %s is not a patchset number')
+ % self.rev)
+
+ d = os.getcwd()
+ try:
+ os.chdir(self.path)
+ id = None
+
+ cache = 'update'
+ if not self.ui.configbool('convert', 'cvsps.cache', True):
+ cache = None
+ db = cvsps.createlog(self.ui, cache=cache)
+ db = cvsps.createchangeset(self.ui, db,
+ fuzz=int(self.ui.config('convert', 'cvsps.fuzz', 60)),
+ mergeto=self.ui.config('convert', 'cvsps.mergeto', None),
+ mergefrom=self.ui.config('convert', 'cvsps.mergefrom', None))
+
+ for cs in db:
+ if maxrev and cs.id > maxrev:
+ break
+ id = str(cs.id)
+ cs.author = self.recode(cs.author)
+ self.lastbranch[cs.branch] = id
+ cs.comment = self.recode(cs.comment)
+ date = util.datestr(cs.date, '%Y-%m-%d %H:%M:%S %1%2')
+ self.tags.update(dict.fromkeys(cs.tags, id))
+
+ files = {}
+ for f in cs.entries:
+ files[f.file] = "%s%s" % ('.'.join([str(x)
+ for x in f.revision]),
+ ['', '(DEAD)'][f.dead])
+
+ # add current commit to set
+ c = commit(author=cs.author, date=date,
+ parents=[str(p.id) for p in cs.parents],
+ desc=cs.comment, branch=cs.branch or '')
+ self.changeset[id] = c
+ self.files[id] = files
+
+ self.heads = self.lastbranch.values()
+ finally:
+ os.chdir(d)
+
+ def _connect(self):
+ root = self.cvsroot
+ conntype = None
+ user, host = None, None
+ cmd = ['cvs', 'server']
+
+ self.ui.status(_("connecting to %s\n") % root)
+
+ if root.startswith(":pserver:"):
+ root = root[9:]
+ m = re.match(r'(?:(.*?)(?::(.*?))?@)?([^:\/]*)(?::(\d*))?(.*)',
+ root)
+ if m:
+ conntype = "pserver"
+ user, passw, serv, port, root = m.groups()
+ if not user:
+ user = "anonymous"
+ if not port:
+ port = 2401
+ else:
+ port = int(port)
+ format0 = ":pserver:%s@%s:%s" % (user, serv, root)
+ format1 = ":pserver:%s@%s:%d%s" % (user, serv, port, root)
+
+ if not passw:
+ passw = "A"
+ cvspass = os.path.expanduser("~/.cvspass")
+ try:
+ pf = open(cvspass)
+ for line in pf.read().splitlines():
+ part1, part2 = line.split(' ', 1)
+ # /1 :pserver:user@example.com:2401/cvsroot/foo
+ # Ah<Z
+ if part1 == '/1':
+ part1, part2 = part2.split(' ', 1)
+ format = format1
+ # :pserver:user@example.com:/cvsroot/foo Ah<Z
+ else:
+ format = format0
+ if part1 == format:
+ passw = part2
+ break
+ pf.close()
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ if not getattr(inst, 'filename', None):
+ inst.filename = cvspass
+ raise
+
+ sck = socket.socket()
+ sck.connect((serv, port))
+ sck.send("\n".join(["BEGIN AUTH REQUEST", root, user, passw,
+ "END AUTH REQUEST", ""]))
+ if sck.recv(128) != "I LOVE YOU\n":
+ raise util.Abort(_("CVS pserver authentication failed"))
+
+ self.writep = self.readp = sck.makefile('r+')
+
+ if not conntype and root.startswith(":local:"):
+ conntype = "local"
+ root = root[7:]
+
+ if not conntype:
+ # :ext:user@host/home/user/path/to/cvsroot
+ if root.startswith(":ext:"):
+ root = root[5:]
+ m = re.match(r'(?:([^@:/]+)@)?([^:/]+):?(.*)', root)
+ # Do not take Windows path "c:\foo\bar" for a connection strings
+ if os.path.isdir(root) or not m:
+ conntype = "local"
+ else:
+ conntype = "rsh"
+ user, host, root = m.group(1), m.group(2), m.group(3)
+
+ if conntype != "pserver":
+ if conntype == "rsh":
+ rsh = os.environ.get("CVS_RSH") or "ssh"
+ if user:
+ cmd = [rsh, '-l', user, host] + cmd
+ else:
+ cmd = [rsh, host] + cmd
+
+ # popen2 does not support argument lists under Windows
+ cmd = [util.shellquote(arg) for arg in cmd]
+ cmd = util.quotecommand(' '.join(cmd))
+ self.writep, self.readp = util.popen2(cmd)
+
+ self.realroot = root
+
+ self.writep.write("Root %s\n" % root)
+ self.writep.write("Valid-responses ok error Valid-requests Mode"
+ " M Mbinary E Checked-in Created Updated"
+ " Merged Removed\n")
+ self.writep.write("valid-requests\n")
+ self.writep.flush()
+ r = self.readp.readline()
+ if not r.startswith("Valid-requests"):
+ raise util.Abort(_('unexpected response from CVS server '
+ '(expected "Valid-requests", but got %r)')
+ % r)
+ if "UseUnchanged" in r:
+ self.writep.write("UseUnchanged\n")
+ self.writep.flush()
+ r = self.readp.readline()
+
+ def getheads(self):
+ self._parse()
+ return self.heads
+
+ def getfile(self, name, rev):
+
+ def chunkedread(fp, count):
+ # file-objects returned by socked.makefile() do not handle
+ # large read() requests very well.
+ chunksize = 65536
+ output = StringIO()
+ while count > 0:
+ data = fp.read(min(count, chunksize))
+ if not data:
+ raise util.Abort(_("%d bytes missing from remote file")
+ % count)
+ count -= len(data)
+ output.write(data)
+ return output.getvalue()
+
+ self._parse()
+ if rev.endswith("(DEAD)"):
+ raise IOError
+
+ args = ("-N -P -kk -r %s --" % rev).split()
+ args.append(self.cvsrepo + '/' + name)
+ for x in args:
+ self.writep.write("Argument %s\n" % x)
+ self.writep.write("Directory .\n%s\nco\n" % self.realroot)
+ self.writep.flush()
+
+ data = ""
+ mode = None
+ while True:
+ line = self.readp.readline()
+ if line.startswith("Created ") or line.startswith("Updated "):
+ self.readp.readline() # path
+ self.readp.readline() # entries
+ mode = self.readp.readline()[:-1]
+ count = int(self.readp.readline()[:-1])
+ data = chunkedread(self.readp, count)
+ elif line.startswith(" "):
+ data += line[1:]
+ elif line.startswith("M "):
+ pass
+ elif line.startswith("Mbinary "):
+ count = int(self.readp.readline()[:-1])
+ data = chunkedread(self.readp, count)
+ else:
+ if line == "ok\n":
+ if mode is None:
+ raise util.Abort(_('malformed response from CVS'))
+ return (data, "x" in mode and "x" or "")
+ elif line.startswith("E "):
+ self.ui.warn(_("cvs server: %s\n") % line[2:])
+ elif line.startswith("Remove"):
+ self.readp.readline()
+ else:
+ raise util.Abort(_("unknown CVS response: %s") % line)
+
+ def getchanges(self, rev):
+ self._parse()
+ return sorted(self.files[rev].iteritems()), {}
+
+ def getcommit(self, rev):
+ self._parse()
+ return self.changeset[rev]
+
+ def gettags(self):
+ self._parse()
+ return self.tags
+
+ def getchangedfiles(self, rev, i):
+ self._parse()
+ return sorted(self.files[rev])
diff --git a/hgext/convert/cvsps.py b/hgext/convert/cvsps.py
new file mode 100644
index 0000000..97184d5
--- /dev/null
+++ b/hgext/convert/cvsps.py
@@ -0,0 +1,853 @@
+# Mercurial built-in replacement for cvsps.
+#
+# Copyright 2008, Frank Kingswood <frank@kingswood-consulting.co.uk>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+import re
+import cPickle as pickle
+from mercurial import util
+from mercurial.i18n import _
+from mercurial import hook
+from mercurial import util
+
+class logentry(object):
+ '''Class logentry has the following attributes:
+ .author - author name as CVS knows it
+ .branch - name of branch this revision is on
+ .branches - revision tuple of branches starting at this revision
+ .comment - commit message
+ .date - the commit date as a (time, tz) tuple
+ .dead - true if file revision is dead
+ .file - Name of file
+ .lines - a tuple (+lines, -lines) or None
+ .parent - Previous revision of this entry
+ .rcs - name of file as returned from CVS
+ .revision - revision number as tuple
+ .tags - list of tags on the file
+ .synthetic - is this a synthetic "file ... added on ..." revision?
+ .mergepoint- the branch that has been merged from
+ (if present in rlog output)
+ .branchpoints- the branches that start at the current entry
+ '''
+ def __init__(self, **entries):
+ self.synthetic = False
+ self.__dict__.update(entries)
+
+ def __repr__(self):
+ return "<%s at 0x%x: %s %s>" % (self.__class__.__name__,
+ id(self),
+ self.file,
+ ".".join(map(str, self.revision)))
+
+class logerror(Exception):
+ pass
+
+def getrepopath(cvspath):
+ """Return the repository path from a CVS path.
+
+ >>> getrepopath('/foo/bar')
+ '/foo/bar'
+ >>> getrepopath('c:/foo/bar')
+ 'c:/foo/bar'
+ >>> getrepopath(':pserver:10/foo/bar')
+ '/foo/bar'
+ >>> getrepopath(':pserver:10c:/foo/bar')
+ '/foo/bar'
+ >>> getrepopath(':pserver:/foo/bar')
+ '/foo/bar'
+ >>> getrepopath(':pserver:c:/foo/bar')
+ 'c:/foo/bar'
+ >>> getrepopath(':pserver:truc@foo.bar:/foo/bar')
+ '/foo/bar'
+ >>> getrepopath(':pserver:truc@foo.bar:c:/foo/bar')
+ 'c:/foo/bar'
+ """
+ # According to CVS manual, CVS paths are expressed like:
+ # [:method:][[user][:password]@]hostname[:[port]]/path/to/repository
+ #
+ # Unfortunately, Windows absolute paths start with a drive letter
+ # like 'c:' making it harder to parse. Here we assume that drive
+ # letters are only one character long and any CVS component before
+ # the repository path is at least 2 characters long, and use this
+ # to disambiguate.
+ parts = cvspath.split(':')
+ if len(parts) == 1:
+ return parts[0]
+ # Here there is an ambiguous case if we have a port number
+ # immediately followed by a Windows driver letter. We assume this
+ # never happens and decide it must be CVS path component,
+ # therefore ignoring it.
+ if len(parts[-2]) > 1:
+ return parts[-1].lstrip('0123456789')
+ return parts[-2] + ':' + parts[-1]
+
+def createlog(ui, directory=None, root="", rlog=True, cache=None):
+ '''Collect the CVS rlog'''
+
+ # Because we store many duplicate commit log messages, reusing strings
+ # saves a lot of memory and pickle storage space.
+ _scache = {}
+ def scache(s):
+ "return a shared version of a string"
+ return _scache.setdefault(s, s)
+
+ ui.status(_('collecting CVS rlog\n'))
+
+ log = [] # list of logentry objects containing the CVS state
+
+ # patterns to match in CVS (r)log output, by state of use
+ re_00 = re.compile('RCS file: (.+)$')
+ re_01 = re.compile('cvs \\[r?log aborted\\]: (.+)$')
+ re_02 = re.compile('cvs (r?log|server): (.+)\n$')
+ re_03 = re.compile("(Cannot access.+CVSROOT)|"
+ "(can't create temporary directory.+)$")
+ re_10 = re.compile('Working file: (.+)$')
+ re_20 = re.compile('symbolic names:')
+ re_30 = re.compile('\t(.+): ([\\d.]+)$')
+ re_31 = re.compile('----------------------------$')
+ re_32 = re.compile('======================================='
+ '======================================$')
+ re_50 = re.compile('revision ([\\d.]+)(\s+locked by:\s+.+;)?$')
+ re_60 = re.compile(r'date:\s+(.+);\s+author:\s+(.+);\s+state:\s+(.+?);'
+ r'(\s+lines:\s+(\+\d+)?\s+(-\d+)?;)?'
+ r'(.*mergepoint:\s+([^;]+);)?')
+ re_70 = re.compile('branches: (.+);$')
+
+ file_added_re = re.compile(r'file [^/]+ was (initially )?added on branch')
+
+ prefix = '' # leading path to strip of what we get from CVS
+
+ if directory is None:
+ # Current working directory
+
+ # Get the real directory in the repository
+ try:
+ prefix = open(os.path.join('CVS','Repository')).read().strip()
+ directory = prefix
+ if prefix == ".":
+ prefix = ""
+ except IOError:
+ raise logerror(_('not a CVS sandbox'))
+
+ if prefix and not prefix.endswith(os.sep):
+ prefix += os.sep
+
+ # Use the Root file in the sandbox, if it exists
+ try:
+ root = open(os.path.join('CVS','Root')).read().strip()
+ except IOError:
+ pass
+
+ if not root:
+ root = os.environ.get('CVSROOT', '')
+
+ # read log cache if one exists
+ oldlog = []
+ date = None
+
+ if cache:
+ cachedir = os.path.expanduser('~/.hg.cvsps')
+ if not os.path.exists(cachedir):
+ os.mkdir(cachedir)
+
+ # The cvsps cache pickle needs a uniquified name, based on the
+ # repository location. The address may have all sort of nasties
+ # in it, slashes, colons and such. So here we take just the
+ # alphanumerics, concatenated in a way that does not mix up the
+ # various components, so that
+ # :pserver:user@server:/path
+ # and
+ # /pserver/user/server/path
+ # are mapped to different cache file names.
+ cachefile = root.split(":") + [directory, "cache"]
+ cachefile = ['-'.join(re.findall(r'\w+', s)) for s in cachefile if s]
+ cachefile = os.path.join(cachedir,
+ '.'.join([s for s in cachefile if s]))
+
+ if cache == 'update':
+ try:
+ ui.note(_('reading cvs log cache %s\n') % cachefile)
+ oldlog = pickle.load(open(cachefile))
+ ui.note(_('cache has %d log entries\n') % len(oldlog))
+ except Exception, e:
+ ui.note(_('error reading cache: %r\n') % e)
+
+ if oldlog:
+ date = oldlog[-1].date # last commit date as a (time,tz) tuple
+ date = util.datestr(date, '%Y/%m/%d %H:%M:%S %1%2')
+
+ # build the CVS commandline
+ cmd = ['cvs', '-q']
+ if root:
+ cmd.append('-d%s' % root)
+ p = util.normpath(getrepopath(root))
+ if not p.endswith('/'):
+ p += '/'
+ if prefix:
+ # looks like normpath replaces "" by "."
+ prefix = p + util.normpath(prefix)
+ else:
+ prefix = p
+ cmd.append(['log', 'rlog'][rlog])
+ if date:
+ # no space between option and date string
+ cmd.append('-d>%s' % date)
+ cmd.append(directory)
+
+ # state machine begins here
+ tags = {} # dictionary of revisions on current file with their tags
+ branchmap = {} # mapping between branch names and revision numbers
+ state = 0
+ store = False # set when a new record can be appended
+
+ cmd = [util.shellquote(arg) for arg in cmd]
+ ui.note(_("running %s\n") % (' '.join(cmd)))
+ ui.debug("prefix=%r directory=%r root=%r\n" % (prefix, directory, root))
+
+ pfp = util.popen(' '.join(cmd))
+ peek = pfp.readline()
+ while True:
+ line = peek
+ if line == '':
+ break
+ peek = pfp.readline()
+ if line.endswith('\n'):
+ line = line[:-1]
+ #ui.debug('state=%d line=%r\n' % (state, line))
+
+ if state == 0:
+ # initial state, consume input until we see 'RCS file'
+ match = re_00.match(line)
+ if match:
+ rcs = match.group(1)
+ tags = {}
+ if rlog:
+ filename = util.normpath(rcs[:-2])
+ if filename.startswith(prefix):
+ filename = filename[len(prefix):]
+ if filename.startswith('/'):
+ filename = filename[1:]
+ if filename.startswith('Attic/'):
+ filename = filename[6:]
+ else:
+ filename = filename.replace('/Attic/', '/')
+ state = 2
+ continue
+ state = 1
+ continue
+ match = re_01.match(line)
+ if match:
+ raise logerror(match.group(1))
+ match = re_02.match(line)
+ if match:
+ raise logerror(match.group(2))
+ if re_03.match(line):
+ raise logerror(line)
+
+ elif state == 1:
+ # expect 'Working file' (only when using log instead of rlog)
+ match = re_10.match(line)
+ assert match, _('RCS file must be followed by working file')
+ filename = util.normpath(match.group(1))
+ state = 2
+
+ elif state == 2:
+ # expect 'symbolic names'
+ if re_20.match(line):
+ branchmap = {}
+ state = 3
+
+ elif state == 3:
+ # read the symbolic names and store as tags
+ match = re_30.match(line)
+ if match:
+ rev = [int(x) for x in match.group(2).split('.')]
+
+ # Convert magic branch number to an odd-numbered one
+ revn = len(rev)
+ if revn > 3 and (revn % 2) == 0 and rev[-2] == 0:
+ rev = rev[:-2] + rev[-1:]
+ rev = tuple(rev)
+
+ if rev not in tags:
+ tags[rev] = []
+ tags[rev].append(match.group(1))
+ branchmap[match.group(1)] = match.group(2)
+
+ elif re_31.match(line):
+ state = 5
+ elif re_32.match(line):
+ state = 0
+
+ elif state == 4:
+ # expecting '------' separator before first revision
+ if re_31.match(line):
+ state = 5
+ else:
+ assert not re_32.match(line), _('must have at least '
+ 'some revisions')
+
+ elif state == 5:
+ # expecting revision number and possibly (ignored) lock indication
+ # we create the logentry here from values stored in states 0 to 4,
+ # as this state is re-entered for subsequent revisions of a file.
+ match = re_50.match(line)
+ assert match, _('expected revision number')
+ e = logentry(rcs=scache(rcs), file=scache(filename),
+ revision=tuple([int(x) for x in match.group(1).split('.')]),
+ branches=[], parent=None)
+ state = 6
+
+ elif state == 6:
+ # expecting date, author, state, lines changed
+ match = re_60.match(line)
+ assert match, _('revision must be followed by date line')
+ d = match.group(1)
+ if d[2] == '/':
+ # Y2K
+ d = '19' + d
+
+ if len(d.split()) != 3:
+ # cvs log dates always in GMT
+ d = d + ' UTC'
+ e.date = util.parsedate(d, ['%y/%m/%d %H:%M:%S',
+ '%Y/%m/%d %H:%M:%S',
+ '%Y-%m-%d %H:%M:%S'])
+ e.author = scache(match.group(2))
+ e.dead = match.group(3).lower() == 'dead'
+
+ if match.group(5):
+ if match.group(6):
+ e.lines = (int(match.group(5)), int(match.group(6)))
+ else:
+ e.lines = (int(match.group(5)), 0)
+ elif match.group(6):
+ e.lines = (0, int(match.group(6)))
+ else:
+ e.lines = None
+
+ if match.group(7): # cvsnt mergepoint
+ myrev = match.group(8).split('.')
+ if len(myrev) == 2: # head
+ e.mergepoint = 'HEAD'
+ else:
+ myrev = '.'.join(myrev[:-2] + ['0', myrev[-2]])
+ branches = [b for b in branchmap if branchmap[b] == myrev]
+ assert len(branches) == 1, ('unknown branch: %s'
+ % e.mergepoint)
+ e.mergepoint = branches[0]
+ else:
+ e.mergepoint = None
+ e.comment = []
+ state = 7
+
+ elif state == 7:
+ # read the revision numbers of branches that start at this revision
+ # or store the commit log message otherwise
+ m = re_70.match(line)
+ if m:
+ e.branches = [tuple([int(y) for y in x.strip().split('.')])
+ for x in m.group(1).split(';')]
+ state = 8
+ elif re_31.match(line) and re_50.match(peek):
+ state = 5
+ store = True
+ elif re_32.match(line):
+ state = 0
+ store = True
+ else:
+ e.comment.append(line)
+
+ elif state == 8:
+ # store commit log message
+ if re_31.match(line):
+ cpeek = peek
+ if cpeek.endswith('\n'):
+ cpeek = cpeek[:-1]
+ if re_50.match(cpeek):
+ state = 5
+ store = True
+ else:
+ e.comment.append(line)
+ elif re_32.match(line):
+ state = 0
+ store = True
+ else:
+ e.comment.append(line)
+
+ # When a file is added on a branch B1, CVS creates a synthetic
+ # dead trunk revision 1.1 so that the branch has a root.
+ # Likewise, if you merge such a file to a later branch B2 (one
+ # that already existed when the file was added on B1), CVS
+ # creates a synthetic dead revision 1.1.x.1 on B2. Don't drop
+ # these revisions now, but mark them synthetic so
+ # createchangeset() can take care of them.
+ if (store and
+ e.dead and
+ e.revision[-1] == 1 and # 1.1 or 1.1.x.1
+ len(e.comment) == 1 and
+ file_added_re.match(e.comment[0])):
+ ui.debug('found synthetic revision in %s: %r\n'
+ % (e.rcs, e.comment[0]))
+ e.synthetic = True
+
+ if store:
+ # clean up the results and save in the log.
+ store = False
+ e.tags = sorted([scache(x) for x in tags.get(e.revision, [])])
+ e.comment = scache('\n'.join(e.comment))
+
+ revn = len(e.revision)
+ if revn > 3 and (revn % 2) == 0:
+ e.branch = tags.get(e.revision[:-1], [None])[0]
+ else:
+ e.branch = None
+
+ # find the branches starting from this revision
+ branchpoints = set()
+ for branch, revision in branchmap.iteritems():
+ revparts = tuple([int(i) for i in revision.split('.')])
+ if len(revparts) < 2: # bad tags
+ continue
+ if revparts[-2] == 0 and revparts[-1] % 2 == 0:
+ # normal branch
+ if revparts[:-2] == e.revision:
+ branchpoints.add(branch)
+ elif revparts == (1, 1, 1): # vendor branch
+ if revparts in e.branches:
+ branchpoints.add(branch)
+ e.branchpoints = branchpoints
+
+ log.append(e)
+
+ if len(log) % 100 == 0:
+ ui.status(util.ellipsis('%d %s' % (len(log), e.file), 80)+'\n')
+
+ log.sort(key=lambda x: (x.rcs, x.revision))
+
+ # find parent revisions of individual files
+ versions = {}
+ for e in log:
+ branch = e.revision[:-1]
+ p = versions.get((e.rcs, branch), None)
+ if p is None:
+ p = e.revision[:-2]
+ e.parent = p
+ versions[(e.rcs, branch)] = e.revision
+
+ # update the log cache
+ if cache:
+ if log:
+ # join up the old and new logs
+ log.sort(key=lambda x: x.date)
+
+ if oldlog and oldlog[-1].date >= log[0].date:
+ raise logerror(_('log cache overlaps with new log entries,'
+ ' re-run without cache.'))
+
+ log = oldlog + log
+
+ # write the new cachefile
+ ui.note(_('writing cvs log cache %s\n') % cachefile)
+ pickle.dump(log, open(cachefile, 'w'))
+ else:
+ log = oldlog
+
+ ui.status(_('%d log entries\n') % len(log))
+
+ hook.hook(ui, None, "cvslog", True, log=log)
+
+ return log
+
+
+class changeset(object):
+ '''Class changeset has the following attributes:
+ .id - integer identifying this changeset (list index)
+ .author - author name as CVS knows it
+ .branch - name of branch this changeset is on, or None
+ .comment - commit message
+ .date - the commit date as a (time,tz) tuple
+ .entries - list of logentry objects in this changeset
+ .parents - list of one or two parent changesets
+ .tags - list of tags on this changeset
+ .synthetic - from synthetic revision "file ... added on branch ..."
+ .mergepoint- the branch that has been merged from
+ (if present in rlog output)
+ .branchpoints- the branches that start at the current entry
+ '''
+ def __init__(self, **entries):
+ self.synthetic = False
+ self.__dict__.update(entries)
+
+ def __repr__(self):
+ return "<%s at 0x%x: %s>" % (self.__class__.__name__,
+ id(self),
+ getattr(self, 'id', "(no id)"))
+
+def createchangeset(ui, log, fuzz=60, mergefrom=None, mergeto=None):
+ '''Convert log into changesets.'''
+
+ ui.status(_('creating changesets\n'))
+
+ # Merge changesets
+
+ log.sort(key=lambda x: (x.comment, x.author, x.branch, x.date))
+
+ changesets = []
+ files = set()
+ c = None
+ for i, e in enumerate(log):
+
+ # Check if log entry belongs to the current changeset or not.
+
+ # Since CVS is file centric, two different file revisions with
+ # different branchpoints should be treated as belonging to two
+ # different changesets (and the ordering is important and not
+ # honoured by cvsps at this point).
+ #
+ # Consider the following case:
+ # foo 1.1 branchpoints: [MYBRANCH]
+ # bar 1.1 branchpoints: [MYBRANCH, MYBRANCH2]
+ #
+ # Here foo is part only of MYBRANCH, but not MYBRANCH2, e.g. a
+ # later version of foo may be in MYBRANCH2, so foo should be the
+ # first changeset and bar the next and MYBRANCH and MYBRANCH2
+ # should both start off of the bar changeset. No provisions are
+ # made to ensure that this is, in fact, what happens.
+ if not (c and
+ e.comment == c.comment and
+ e.author == c.author and
+ e.branch == c.branch and
+ (not util.safehasattr(e, 'branchpoints') or
+ not util.safehasattr (c, 'branchpoints') or
+ e.branchpoints == c.branchpoints) and
+ ((c.date[0] + c.date[1]) <=
+ (e.date[0] + e.date[1]) <=
+ (c.date[0] + c.date[1]) + fuzz) and
+ e.file not in files):
+ c = changeset(comment=e.comment, author=e.author,
+ branch=e.branch, date=e.date, entries=[],
+ mergepoint=getattr(e, 'mergepoint', None),
+ branchpoints=getattr(e, 'branchpoints', set()))
+ changesets.append(c)
+ files = set()
+ if len(changesets) % 100 == 0:
+ t = '%d %s' % (len(changesets), repr(e.comment)[1:-1])
+ ui.status(util.ellipsis(t, 80) + '\n')
+
+ c.entries.append(e)
+ files.add(e.file)
+ c.date = e.date # changeset date is date of latest commit in it
+
+ # Mark synthetic changesets
+
+ for c in changesets:
+ # Synthetic revisions always get their own changeset, because
+ # the log message includes the filename. E.g. if you add file3
+ # and file4 on a branch, you get four log entries and three
+ # changesets:
+ # "File file3 was added on branch ..." (synthetic, 1 entry)
+ # "File file4 was added on branch ..." (synthetic, 1 entry)
+ # "Add file3 and file4 to fix ..." (real, 2 entries)
+ # Hence the check for 1 entry here.
+ c.synthetic = len(c.entries) == 1 and c.entries[0].synthetic
+
+ # Sort files in each changeset
+
+ def entitycompare(l, r):
+ 'Mimic cvsps sorting order'
+ l = l.file.split('/')
+ r = r.file.split('/')
+ nl = len(l)
+ nr = len(r)
+ n = min(nl, nr)
+ for i in range(n):
+ if i + 1 == nl and nl < nr:
+ return -1
+ elif i + 1 == nr and nl > nr:
+ return +1
+ elif l[i] < r[i]:
+ return -1
+ elif l[i] > r[i]:
+ return +1
+ return 0
+
+ for c in changesets:
+ c.entries.sort(entitycompare)
+
+ # Sort changesets by date
+
+ def cscmp(l, r):
+ d = sum(l.date) - sum(r.date)
+ if d:
+ return d
+
+ # detect vendor branches and initial commits on a branch
+ le = {}
+ for e in l.entries:
+ le[e.rcs] = e.revision
+ re = {}
+ for e in r.entries:
+ re[e.rcs] = e.revision
+
+ d = 0
+ for e in l.entries:
+ if re.get(e.rcs, None) == e.parent:
+ assert not d
+ d = 1
+ break
+
+ for e in r.entries:
+ if le.get(e.rcs, None) == e.parent:
+ assert not d
+ d = -1
+ break
+
+ return d
+
+ changesets.sort(cscmp)
+
+ # Collect tags
+
+ globaltags = {}
+ for c in changesets:
+ for e in c.entries:
+ for tag in e.tags:
+ # remember which is the latest changeset to have this tag
+ globaltags[tag] = c
+
+ for c in changesets:
+ tags = set()
+ for e in c.entries:
+ tags.update(e.tags)
+ # remember tags only if this is the latest changeset to have it
+ c.tags = sorted(tag for tag in tags if globaltags[tag] is c)
+
+ # Find parent changesets, handle {{mergetobranch BRANCHNAME}}
+ # by inserting dummy changesets with two parents, and handle
+ # {{mergefrombranch BRANCHNAME}} by setting two parents.
+
+ if mergeto is None:
+ mergeto = r'{{mergetobranch ([-\w]+)}}'
+ if mergeto:
+ mergeto = re.compile(mergeto)
+
+ if mergefrom is None:
+ mergefrom = r'{{mergefrombranch ([-\w]+)}}'
+ if mergefrom:
+ mergefrom = re.compile(mergefrom)
+
+ versions = {} # changeset index where we saw any particular file version
+ branches = {} # changeset index where we saw a branch
+ n = len(changesets)
+ i = 0
+ while i < n:
+ c = changesets[i]
+
+ for f in c.entries:
+ versions[(f.rcs, f.revision)] = i
+
+ p = None
+ if c.branch in branches:
+ p = branches[c.branch]
+ else:
+ # first changeset on a new branch
+ # the parent is a changeset with the branch in its
+ # branchpoints such that it is the latest possible
+ # commit without any intervening, unrelated commits.
+
+ for candidate in xrange(i):
+ if c.branch not in changesets[candidate].branchpoints:
+ if p is not None:
+ break
+ continue
+ p = candidate
+
+ c.parents = []
+ if p is not None:
+ p = changesets[p]
+
+ # Ensure no changeset has a synthetic changeset as a parent.
+ while p.synthetic:
+ assert len(p.parents) <= 1, \
+ _('synthetic changeset cannot have multiple parents')
+ if p.parents:
+ p = p.parents[0]
+ else:
+ p = None
+ break
+
+ if p is not None:
+ c.parents.append(p)
+
+ if c.mergepoint:
+ if c.mergepoint == 'HEAD':
+ c.mergepoint = None
+ c.parents.append(changesets[branches[c.mergepoint]])
+
+ if mergefrom:
+ m = mergefrom.search(c.comment)
+ if m:
+ m = m.group(1)
+ if m == 'HEAD':
+ m = None
+ try:
+ candidate = changesets[branches[m]]
+ except KeyError:
+ ui.warn(_("warning: CVS commit message references "
+ "non-existent branch %r:\n%s\n")
+ % (m, c.comment))
+ if m in branches and c.branch != m and not candidate.synthetic:
+ c.parents.append(candidate)
+
+ if mergeto:
+ m = mergeto.search(c.comment)
+ if m:
+ if m.groups():
+ m = m.group(1)
+ if m == 'HEAD':
+ m = None
+ else:
+ m = None # if no group found then merge to HEAD
+ if m in branches and c.branch != m:
+ # insert empty changeset for merge
+ cc = changeset(
+ author=c.author, branch=m, date=c.date,
+ comment='convert-repo: CVS merge from branch %s'
+ % c.branch,
+ entries=[], tags=[],
+ parents=[changesets[branches[m]], c])
+ changesets.insert(i + 1, cc)
+ branches[m] = i + 1
+
+ # adjust our loop counters now we have inserted a new entry
+ n += 1
+ i += 2
+ continue
+
+ branches[c.branch] = i
+ i += 1
+
+ # Drop synthetic changesets (safe now that we have ensured no other
+ # changesets can have them as parents).
+ i = 0
+ while i < len(changesets):
+ if changesets[i].synthetic:
+ del changesets[i]
+ else:
+ i += 1
+
+ # Number changesets
+
+ for i, c in enumerate(changesets):
+ c.id = i + 1
+
+ ui.status(_('%d changeset entries\n') % len(changesets))
+
+ hook.hook(ui, None, "cvschangesets", True, changesets=changesets)
+
+ return changesets
+
+
+def debugcvsps(ui, *args, **opts):
+ '''Read CVS rlog for current directory or named path in
+ repository, and convert the log to changesets based on matching
+ commit log entries and dates.
+ '''
+ if opts["new_cache"]:
+ cache = "write"
+ elif opts["update_cache"]:
+ cache = "update"
+ else:
+ cache = None
+
+ revisions = opts["revisions"]
+
+ try:
+ if args:
+ log = []
+ for d in args:
+ log += createlog(ui, d, root=opts["root"], cache=cache)
+ else:
+ log = createlog(ui, root=opts["root"], cache=cache)
+ except logerror, e:
+ ui.write("%r\n"%e)
+ return
+
+ changesets = createchangeset(ui, log, opts["fuzz"])
+ del log
+
+ # Print changesets (optionally filtered)
+
+ off = len(revisions)
+ branches = {} # latest version number in each branch
+ ancestors = {} # parent branch
+ for cs in changesets:
+
+ if opts["ancestors"]:
+ if cs.branch not in branches and cs.parents and cs.parents[0].id:
+ ancestors[cs.branch] = (changesets[cs.parents[0].id - 1].branch,
+ cs.parents[0].id)
+ branches[cs.branch] = cs.id
+
+ # limit by branches
+ if opts["branches"] and (cs.branch or 'HEAD') not in opts["branches"]:
+ continue
+
+ if not off:
+ # Note: trailing spaces on several lines here are needed to have
+ # bug-for-bug compatibility with cvsps.
+ ui.write('---------------------\n')
+ ui.write('PatchSet %d \n' % cs.id)
+ ui.write('Date: %s\n' % util.datestr(cs.date,
+ '%Y/%m/%d %H:%M:%S %1%2'))
+ ui.write('Author: %s\n' % cs.author)
+ ui.write('Branch: %s\n' % (cs.branch or 'HEAD'))
+ ui.write('Tag%s: %s \n' % (['', 's'][len(cs.tags) > 1],
+ ','.join(cs.tags) or '(none)'))
+ branchpoints = getattr(cs, 'branchpoints', None)
+ if branchpoints:
+ ui.write('Branchpoints: %s \n' % ', '.join(branchpoints))
+ if opts["parents"] and cs.parents:
+ if len(cs.parents) > 1:
+ ui.write('Parents: %s\n' %
+ (','.join([str(p.id) for p in cs.parents])))
+ else:
+ ui.write('Parent: %d\n' % cs.parents[0].id)
+
+ if opts["ancestors"]:
+ b = cs.branch
+ r = []
+ while b:
+ b, c = ancestors[b]
+ r.append('%s:%d:%d' % (b or "HEAD", c, branches[b]))
+ if r:
+ ui.write('Ancestors: %s\n' % (','.join(r)))
+
+ ui.write('Log:\n')
+ ui.write('%s\n\n' % cs.comment)
+ ui.write('Members: \n')
+ for f in cs.entries:
+ fn = f.file
+ if fn.startswith(opts["prefix"]):
+ fn = fn[len(opts["prefix"]):]
+ ui.write('\t%s:%s->%s%s \n' % (
+ fn, '.'.join([str(x) for x in f.parent]) or 'INITIAL',
+ '.'.join([str(x) for x in f.revision]),
+ ['', '(DEAD)'][f.dead]))
+ ui.write('\n')
+
+ # have we seen the start tag?
+ if revisions and off:
+ if revisions[0] == str(cs.id) or \
+ revisions[0] in cs.tags:
+ off = False
+
+ # see if we reached the end tag
+ if len(revisions) > 1 and not off:
+ if revisions[1] == str(cs.id) or \
+ revisions[1] in cs.tags:
+ break
diff --git a/hgext/convert/darcs.py b/hgext/convert/darcs.py
new file mode 100644
index 0000000..b10a533
--- /dev/null
+++ b/hgext/convert/darcs.py
@@ -0,0 +1,200 @@
+# darcs.py - darcs support for the convert extension
+#
+# Copyright 2007-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from common import NoRepo, checktool, commandline, commit, converter_source
+from mercurial.i18n import _
+from mercurial import util
+import os, shutil, tempfile, re
+
+# The naming drift of ElementTree is fun!
+
+try:
+ from xml.etree.cElementTree import ElementTree, XMLParser
+except ImportError:
+ try:
+ from xml.etree.ElementTree import ElementTree, XMLParser
+ except ImportError:
+ try:
+ from elementtree.cElementTree import ElementTree, XMLParser
+ except ImportError:
+ try:
+ from elementtree.ElementTree import ElementTree, XMLParser
+ except ImportError:
+ pass
+
+class darcs_source(converter_source, commandline):
+ def __init__(self, ui, path, rev=None):
+ converter_source.__init__(self, ui, path, rev=rev)
+ commandline.__init__(self, ui, 'darcs')
+
+ # check for _darcs, ElementTree so that we can easily skip
+ # test-convert-darcs if ElementTree is not around
+ if not os.path.exists(os.path.join(path, '_darcs')):
+ raise NoRepo(_("%s does not look like a darcs repository") % path)
+
+ checktool('darcs')
+ version = self.run0('--version').splitlines()[0].strip()
+ if version < '2.1':
+ raise util.Abort(_('darcs version 2.1 or newer needed (found %r)') %
+ version)
+
+ if "ElementTree" not in globals():
+ raise util.Abort(_("Python ElementTree module is not available"))
+
+ self.path = os.path.realpath(path)
+
+ self.lastrev = None
+ self.changes = {}
+ self.parents = {}
+ self.tags = {}
+
+ # Check darcs repository format
+ format = self.format()
+ if format:
+ if format in ('darcs-1.0', 'hashed'):
+ raise NoRepo(_("%s repository format is unsupported, "
+ "please upgrade") % format)
+ else:
+ self.ui.warn(_('failed to detect repository format!'))
+
+ def before(self):
+ self.tmppath = tempfile.mkdtemp(
+ prefix='convert-' + os.path.basename(self.path) + '-')
+ output, status = self.run('init', repodir=self.tmppath)
+ self.checkexit(status)
+
+ tree = self.xml('changes', xml_output=True, summary=True,
+ repodir=self.path)
+ tagname = None
+ child = None
+ for elt in tree.findall('patch'):
+ node = elt.get('hash')
+ name = elt.findtext('name', '')
+ if name.startswith('TAG '):
+ tagname = name[4:].strip()
+ elif tagname is not None:
+ self.tags[tagname] = node
+ tagname = None
+ self.changes[node] = elt
+ self.parents[child] = [node]
+ child = node
+ self.parents[child] = []
+
+ def after(self):
+ self.ui.debug('cleaning up %s\n' % self.tmppath)
+ shutil.rmtree(self.tmppath, ignore_errors=True)
+
+ def recode(self, s, encoding=None):
+ if isinstance(s, unicode):
+ # XMLParser returns unicode objects for anything it can't
+ # encode into ASCII. We convert them back to str to get
+ # recode's normal conversion behavior.
+ s = s.encode('latin-1')
+ return super(darcs_source, self).recode(s, encoding)
+
+ def xml(self, cmd, **kwargs):
+ # NOTE: darcs is currently encoding agnostic and will print
+ # patch metadata byte-for-byte, even in the XML changelog.
+ etree = ElementTree()
+ # While we are decoding the XML as latin-1 to be as liberal as
+ # possible, etree will still raise an exception if any
+ # non-printable characters are in the XML changelog.
+ parser = XMLParser(encoding='latin-1')
+ fp = self._run(cmd, **kwargs)
+ etree.parse(fp, parser=parser)
+ self.checkexit(fp.close())
+ return etree.getroot()
+
+ def format(self):
+ output, status = self.run('show', 'repo', no_files=True,
+ repodir=self.path)
+ self.checkexit(status)
+ m = re.search(r'^\s*Format:\s*(.*)$', output, re.MULTILINE)
+ if not m:
+ return None
+ return ','.join(sorted(f.strip() for f in m.group(1).split(',')))
+
+ def manifest(self):
+ man = []
+ output, status = self.run('show', 'files', no_directories=True,
+ repodir=self.tmppath)
+ self.checkexit(status)
+ for line in output.split('\n'):
+ path = line[2:]
+ if path:
+ man.append(path)
+ return man
+
+ def getheads(self):
+ return self.parents[None]
+
+ def getcommit(self, rev):
+ elt = self.changes[rev]
+ date = util.strdate(elt.get('local_date'), '%a %b %d %H:%M:%S %Z %Y')
+ desc = elt.findtext('name') + '\n' + elt.findtext('comment', '')
+ # etree can return unicode objects for name, comment, and author,
+ # so recode() is used to ensure str objects are emitted.
+ return commit(author=self.recode(elt.get('author')),
+ date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
+ desc=self.recode(desc).strip(),
+ parents=self.parents[rev])
+
+ def pull(self, rev):
+ output, status = self.run('pull', self.path, all=True,
+ match='hash %s' % rev,
+ no_test=True, no_posthook=True,
+ external_merge='/bin/false',
+ repodir=self.tmppath)
+ if status:
+ if output.find('We have conflicts in') == -1:
+ self.checkexit(status, output)
+ output, status = self.run('revert', all=True, repodir=self.tmppath)
+ self.checkexit(status, output)
+
+ def getchanges(self, rev):
+ copies = {}
+ changes = []
+ man = None
+ for elt in self.changes[rev].find('summary').getchildren():
+ if elt.tag in ('add_directory', 'remove_directory'):
+ continue
+ if elt.tag == 'move':
+ if man is None:
+ man = self.manifest()
+ source, dest = elt.get('from'), elt.get('to')
+ if source in man:
+ # File move
+ changes.append((source, rev))
+ changes.append((dest, rev))
+ copies[dest] = source
+ else:
+ # Directory move, deduce file moves from manifest
+ source = source + '/'
+ for f in man:
+ if not f.startswith(source):
+ continue
+ fdest = dest + '/' + f[len(source):]
+ changes.append((f, rev))
+ changes.append((fdest, rev))
+ copies[fdest] = f
+ else:
+ changes.append((elt.text.strip(), rev))
+ self.pull(rev)
+ self.lastrev = rev
+ return sorted(changes), copies
+
+ def getfile(self, name, rev):
+ if rev != self.lastrev:
+ raise util.Abort(_('internal calling inconsistency'))
+ path = os.path.join(self.tmppath, name)
+ data = util.readfile(path)
+ mode = os.lstat(path).st_mode
+ mode = (mode & 0111) and 'x' or ''
+ return data, mode
+
+ def gettags(self):
+ return self.tags
diff --git a/hgext/convert/filemap.py b/hgext/convert/filemap.py
new file mode 100644
index 0000000..c14df16
--- /dev/null
+++ b/hgext/convert/filemap.py
@@ -0,0 +1,391 @@
+# Copyright 2007 Bryan O'Sullivan <bos@serpentine.com>
+# Copyright 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import shlex
+from mercurial.i18n import _
+from mercurial import util
+from common import SKIPREV, converter_source
+
+def rpairs(name):
+ e = len(name)
+ while e != -1:
+ yield name[:e], name[e + 1:]
+ e = name.rfind('/', 0, e)
+ yield '.', name
+
+class filemapper(object):
+ '''Map and filter filenames when importing.
+ A name can be mapped to itself, a new name, or None (omit from new
+ repository).'''
+
+ def __init__(self, ui, path=None):
+ self.ui = ui
+ self.include = {}
+ self.exclude = {}
+ self.rename = {}
+ if path:
+ if self.parse(path):
+ raise util.Abort(_('errors in filemap'))
+
+ def parse(self, path):
+ errs = 0
+ def check(name, mapping, listname):
+ if not name:
+ self.ui.warn(_('%s:%d: path to %s is missing\n') %
+ (lex.infile, lex.lineno, listname))
+ return 1
+ if name in mapping:
+ self.ui.warn(_('%s:%d: %r already in %s list\n') %
+ (lex.infile, lex.lineno, name, listname))
+ return 1
+ if (name.startswith('/') or
+ name.endswith('/') or
+ '//' in name):
+ self.ui.warn(_('%s:%d: superfluous / in %s %r\n') %
+ (lex.infile, lex.lineno, listname, name))
+ return 1
+ return 0
+ lex = shlex.shlex(open(path), path, True)
+ lex.wordchars += '!@#$%^&*()-=+[]{}|;:,./<>?'
+ cmd = lex.get_token()
+ while cmd:
+ if cmd == 'include':
+ name = lex.get_token()
+ errs += check(name, self.exclude, 'exclude')
+ self.include[name] = name
+ elif cmd == 'exclude':
+ name = lex.get_token()
+ errs += check(name, self.include, 'include')
+ errs += check(name, self.rename, 'rename')
+ self.exclude[name] = name
+ elif cmd == 'rename':
+ src = lex.get_token()
+ dest = lex.get_token()
+ errs += check(src, self.exclude, 'exclude')
+ self.rename[src] = dest
+ elif cmd == 'source':
+ errs += self.parse(lex.get_token())
+ else:
+ self.ui.warn(_('%s:%d: unknown directive %r\n') %
+ (lex.infile, lex.lineno, cmd))
+ errs += 1
+ cmd = lex.get_token()
+ return errs
+
+ def lookup(self, name, mapping):
+ for pre, suf in rpairs(name):
+ try:
+ return mapping[pre], pre, suf
+ except KeyError:
+ pass
+ return '', name, ''
+
+ def __call__(self, name):
+ if self.include:
+ inc = self.lookup(name, self.include)[0]
+ else:
+ inc = name
+ if self.exclude:
+ exc = self.lookup(name, self.exclude)[0]
+ else:
+ exc = ''
+ if (not self.include and exc) or (len(inc) <= len(exc)):
+ return None
+ newpre, pre, suf = self.lookup(name, self.rename)
+ if newpre:
+ if newpre == '.':
+ return suf
+ if suf:
+ if newpre.endswith('/'):
+ return newpre + suf
+ return newpre + '/' + suf
+ return newpre
+ return name
+
+ def active(self):
+ return bool(self.include or self.exclude or self.rename)
+
+# This class does two additional things compared to a regular source:
+#
+# - Filter and rename files. This is mostly wrapped by the filemapper
+# class above. We hide the original filename in the revision that is
+# returned by getchanges to be able to find things later in getfile.
+#
+# - Return only revisions that matter for the files we're interested in.
+# This involves rewriting the parents of the original revision to
+# create a graph that is restricted to those revisions.
+#
+# This set of revisions includes not only revisions that directly
+# touch files we're interested in, but also merges that merge two
+# or more interesting revisions.
+
+class filemap_source(converter_source):
+ def __init__(self, ui, baseconverter, filemap):
+ super(filemap_source, self).__init__(ui)
+ self.base = baseconverter
+ self.filemapper = filemapper(ui, filemap)
+ self.commits = {}
+ # if a revision rev has parent p in the original revision graph, then
+ # rev will have parent self.parentmap[p] in the restricted graph.
+ self.parentmap = {}
+ # self.wantedancestors[rev] is the set of all ancestors of rev that
+ # are in the restricted graph.
+ self.wantedancestors = {}
+ self.convertedorder = None
+ self._rebuilt = False
+ self.origparents = {}
+ self.children = {}
+ self.seenchildren = {}
+
+ def before(self):
+ self.base.before()
+
+ def after(self):
+ self.base.after()
+
+ def setrevmap(self, revmap):
+ # rebuild our state to make things restartable
+ #
+ # To avoid calling getcommit for every revision that has already
+ # been converted, we rebuild only the parentmap, delaying the
+ # rebuild of wantedancestors until we need it (i.e. until a
+ # merge).
+ #
+ # We assume the order argument lists the revisions in
+ # topological order, so that we can infer which revisions were
+ # wanted by previous runs.
+ self._rebuilt = not revmap
+ seen = {SKIPREV: SKIPREV}
+ dummyset = set()
+ converted = []
+ for rev in revmap.order:
+ mapped = revmap[rev]
+ wanted = mapped not in seen
+ if wanted:
+ seen[mapped] = rev
+ self.parentmap[rev] = rev
+ else:
+ self.parentmap[rev] = seen[mapped]
+ self.wantedancestors[rev] = dummyset
+ arg = seen[mapped]
+ if arg == SKIPREV:
+ arg = None
+ converted.append((rev, wanted, arg))
+ self.convertedorder = converted
+ return self.base.setrevmap(revmap)
+
+ def rebuild(self):
+ if self._rebuilt:
+ return True
+ self._rebuilt = True
+ self.parentmap.clear()
+ self.wantedancestors.clear()
+ self.seenchildren.clear()
+ for rev, wanted, arg in self.convertedorder:
+ if rev not in self.origparents:
+ self.origparents[rev] = self.getcommit(rev).parents
+ if arg is not None:
+ self.children[arg] = self.children.get(arg, 0) + 1
+
+ for rev, wanted, arg in self.convertedorder:
+ parents = self.origparents[rev]
+ if wanted:
+ self.mark_wanted(rev, parents)
+ else:
+ self.mark_not_wanted(rev, arg)
+ self._discard(arg, *parents)
+
+ return True
+
+ def getheads(self):
+ return self.base.getheads()
+
+ def getcommit(self, rev):
+ # We want to save a reference to the commit objects to be able
+ # to rewrite their parents later on.
+ c = self.commits[rev] = self.base.getcommit(rev)
+ for p in c.parents:
+ self.children[p] = self.children.get(p, 0) + 1
+ return c
+
+ def _cachedcommit(self, rev):
+ if rev in self.commits:
+ return self.commits[rev]
+ return self.base.getcommit(rev)
+
+ def _discard(self, *revs):
+ for r in revs:
+ if r is None:
+ continue
+ self.seenchildren[r] = self.seenchildren.get(r, 0) + 1
+ if self.seenchildren[r] == self.children[r]:
+ del self.wantedancestors[r]
+ del self.parentmap[r]
+ del self.seenchildren[r]
+ if self._rebuilt:
+ del self.children[r]
+
+ def wanted(self, rev, i):
+ # Return True if we're directly interested in rev.
+ #
+ # i is an index selecting one of the parents of rev (if rev
+ # has no parents, i is None). getchangedfiles will give us
+ # the list of files that are different in rev and in the parent
+ # indicated by i. If we're interested in any of these files,
+ # we're interested in rev.
+ try:
+ files = self.base.getchangedfiles(rev, i)
+ except NotImplementedError:
+ raise util.Abort(_("source repository doesn't support --filemap"))
+ for f in files:
+ if self.filemapper(f):
+ return True
+ return False
+
+ def mark_not_wanted(self, rev, p):
+ # Mark rev as not interesting and update data structures.
+
+ if p is None:
+ # A root revision. Use SKIPREV to indicate that it doesn't
+ # map to any revision in the restricted graph. Put SKIPREV
+ # in the set of wanted ancestors to simplify code elsewhere
+ self.parentmap[rev] = SKIPREV
+ self.wantedancestors[rev] = set((SKIPREV,))
+ return
+
+ # Reuse the data from our parent.
+ self.parentmap[rev] = self.parentmap[p]
+ self.wantedancestors[rev] = self.wantedancestors[p]
+
+ def mark_wanted(self, rev, parents):
+ # Mark rev ss wanted and update data structures.
+
+ # rev will be in the restricted graph, so children of rev in
+ # the original graph should still have rev as a parent in the
+ # restricted graph.
+ self.parentmap[rev] = rev
+
+ # The set of wanted ancestors of rev is the union of the sets
+ # of wanted ancestors of its parents. Plus rev itself.
+ wrev = set()
+ for p in parents:
+ wrev.update(self.wantedancestors[p])
+ wrev.add(rev)
+ self.wantedancestors[rev] = wrev
+
+ def getchanges(self, rev):
+ parents = self.commits[rev].parents
+ if len(parents) > 1:
+ self.rebuild()
+
+ # To decide whether we're interested in rev we:
+ #
+ # - calculate what parents rev will have if it turns out we're
+ # interested in it. If it's going to have more than 1 parent,
+ # we're interested in it.
+ #
+ # - otherwise, we'll compare it with the single parent we found.
+ # If any of the files we're interested in is different in the
+ # the two revisions, we're interested in rev.
+
+ # A parent p is interesting if its mapped version (self.parentmap[p]):
+ # - is not SKIPREV
+ # - is still not in the list of parents (we don't want duplicates)
+ # - is not an ancestor of the mapped versions of the other parents or
+ # there is no parent in the same branch than the current revision.
+ mparents = []
+ knownparents = set()
+ branch = self.commits[rev].branch
+ hasbranchparent = False
+ for i, p1 in enumerate(parents):
+ mp1 = self.parentmap[p1]
+ if mp1 == SKIPREV or mp1 in knownparents:
+ continue
+ isancestor = util.any(p2 for p2 in parents
+ if p1 != p2 and mp1 != self.parentmap[p2]
+ and mp1 in self.wantedancestors[p2])
+ if not isancestor and not hasbranchparent and len(parents) > 1:
+ # This could be expensive, avoid unnecessary calls.
+ if self._cachedcommit(p1).branch == branch:
+ hasbranchparent = True
+ mparents.append((p1, mp1, i, isancestor))
+ knownparents.add(mp1)
+ # Discard parents ancestors of other parents if there is a
+ # non-ancestor one on the same branch than current revision.
+ if hasbranchparent:
+ mparents = [p for p in mparents if not p[3]]
+ wp = None
+ if mparents:
+ wp = max(p[2] for p in mparents)
+ mparents = [p[1] for p in mparents]
+ elif parents:
+ wp = 0
+
+ self.origparents[rev] = parents
+
+ closed = False
+ if 'close' in self.commits[rev].extra:
+ # A branch closing revision is only useful if one of its
+ # parents belong to the branch being closed
+ pbranches = [self._cachedcommit(p).branch for p in mparents]
+ if branch in pbranches:
+ closed = True
+
+ if len(mparents) < 2 and not closed and not self.wanted(rev, wp):
+ # We don't want this revision.
+ # Update our state and tell the convert process to map this
+ # revision to the same revision its parent as mapped to.
+ p = None
+ if parents:
+ p = parents[wp]
+ self.mark_not_wanted(rev, p)
+ self.convertedorder.append((rev, False, p))
+ self._discard(*parents)
+ return self.parentmap[rev]
+
+ # We want this revision.
+ # Rewrite the parents of the commit object
+ self.commits[rev].parents = mparents
+ self.mark_wanted(rev, parents)
+ self.convertedorder.append((rev, True, None))
+ self._discard(*parents)
+
+ # Get the real changes and do the filtering/mapping. To be
+ # able to get the files later on in getfile, we hide the
+ # original filename in the rev part of the return value.
+ changes, copies = self.base.getchanges(rev)
+ files = {}
+ for f, r in changes:
+ newf = self.filemapper(f)
+ if newf and (newf != f or newf not in files):
+ files[newf] = (f, r)
+ files = sorted(files.items())
+
+ ncopies = {}
+ for c in copies:
+ newc = self.filemapper(c)
+ if newc:
+ newsource = self.filemapper(copies[c])
+ if newsource:
+ ncopies[newc] = newsource
+
+ return files, ncopies
+
+ def getfile(self, name, rev):
+ realname, realrev = rev
+ return self.base.getfile(realname, realrev)
+
+ def gettags(self):
+ return self.base.gettags()
+
+ def hasnativeorder(self):
+ return self.base.hasnativeorder()
+
+ def lookuprev(self, rev):
+ return self.base.lookuprev(rev)
+
+ def getbookmarks(self):
+ return self.base.getbookmarks()
diff --git a/hgext/convert/git.py b/hgext/convert/git.py
new file mode 100644
index 0000000..8058399
--- /dev/null
+++ b/hgext/convert/git.py
@@ -0,0 +1,217 @@
+# git.py - git support for the convert extension
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+from mercurial import util
+from mercurial.node import hex, nullid
+from mercurial.i18n import _
+
+from common import NoRepo, commit, converter_source, checktool
+
+class convert_git(converter_source):
+ # Windows does not support GIT_DIR= construct while other systems
+ # cannot remove environment variable. Just assume none have
+ # both issues.
+ if util.safehasattr(os, 'unsetenv'):
+ def gitopen(self, s, noerr=False):
+ prevgitdir = os.environ.get('GIT_DIR')
+ os.environ['GIT_DIR'] = self.path
+ try:
+ if noerr:
+ (stdin, stdout, stderr) = util.popen3(s)
+ return stdout
+ else:
+ return util.popen(s, 'rb')
+ finally:
+ if prevgitdir is None:
+ del os.environ['GIT_DIR']
+ else:
+ os.environ['GIT_DIR'] = prevgitdir
+ else:
+ def gitopen(self, s, noerr=False):
+ if noerr:
+ (sin, so, se) = util.popen3('GIT_DIR=%s %s' % (self.path, s))
+ return so
+ else:
+ return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
+
+ def gitread(self, s):
+ fh = self.gitopen(s)
+ data = fh.read()
+ return data, fh.close()
+
+ def __init__(self, ui, path, rev=None):
+ super(convert_git, self).__init__(ui, path, rev=rev)
+
+ if os.path.isdir(path + "/.git"):
+ path += "/.git"
+ if not os.path.exists(path + "/objects"):
+ raise NoRepo(_("%s does not look like a Git repository") % path)
+
+ checktool('git', 'git')
+
+ self.path = path
+
+ def getheads(self):
+ if not self.rev:
+ heads, ret = self.gitread('git rev-parse --branches --remotes')
+ heads = heads.splitlines()
+ else:
+ heads, ret = self.gitread("git rev-parse --verify %s" % self.rev)
+ heads = [heads[:-1]]
+ if ret:
+ raise util.Abort(_('cannot retrieve git heads'))
+ return heads
+
+ def catfile(self, rev, type):
+ if rev == hex(nullid):
+ raise IOError
+ data, ret = self.gitread("git cat-file %s %s" % (type, rev))
+ if ret:
+ raise util.Abort(_('cannot read %r object at %s') % (type, rev))
+ return data
+
+ def getfile(self, name, rev):
+ data = self.catfile(rev, "blob")
+ mode = self.modecache[(name, rev)]
+ return data, mode
+
+ def getchanges(self, version):
+ self.modecache = {}
+ fh = self.gitopen("git diff-tree -z --root -m -r %s" % version)
+ changes = []
+ seen = set()
+ entry = None
+ for l in fh.read().split('\x00'):
+ if not entry:
+ if not l.startswith(':'):
+ continue
+ entry = l
+ continue
+ f = l
+ if f not in seen:
+ seen.add(f)
+ entry = entry.split()
+ h = entry[3]
+ if entry[1] == '160000':
+ raise util.Abort('git submodules are not supported!')
+ p = (entry[1] == "100755")
+ s = (entry[1] == "120000")
+ self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
+ changes.append((f, h))
+ entry = None
+ if fh.close():
+ raise util.Abort(_('cannot read changes in %s') % version)
+ return (changes, {})
+
+ def getcommit(self, version):
+ c = self.catfile(version, "commit") # read the commit hash
+ end = c.find("\n\n")
+ message = c[end + 2:]
+ message = self.recode(message)
+ l = c[:end].splitlines()
+ parents = []
+ author = committer = None
+ for e in l[1:]:
+ n, v = e.split(" ", 1)
+ if n == "author":
+ p = v.split()
+ tm, tz = p[-2:]
+ author = " ".join(p[:-2])
+ if author[0] == "<": author = author[1:-1]
+ author = self.recode(author)
+ if n == "committer":
+ p = v.split()
+ tm, tz = p[-2:]
+ committer = " ".join(p[:-2])
+ if committer[0] == "<": committer = committer[1:-1]
+ committer = self.recode(committer)
+ if n == "parent":
+ parents.append(v)
+
+ if committer and committer != author:
+ message += "\ncommitter: %s\n" % committer
+ tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
+ tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
+ date = tm + " " + str(tz)
+
+ c = commit(parents=parents, date=date, author=author, desc=message,
+ rev=version)
+ return c
+
+ def gettags(self):
+ tags = {}
+ alltags = {}
+ fh = self.gitopen('git ls-remote --tags "%s"' % self.path)
+ prefix = 'refs/tags/'
+
+ # Build complete list of tags, both annotated and bare ones
+ for line in fh:
+ line = line.strip()
+ node, tag = line.split(None, 1)
+ if not tag.startswith(prefix):
+ continue
+ alltags[tag[len(prefix):]] = node
+ if fh.close():
+ raise util.Abort(_('cannot read tags from %s') % self.path)
+
+ # Filter out tag objects for annotated tag refs
+ for tag in alltags:
+ if tag.endswith('^{}'):
+ tags[tag[:-3]] = alltags[tag]
+ else:
+ if tag + '^{}' in alltags:
+ continue
+ else:
+ tags[tag] = alltags[tag]
+
+ return tags
+
+ def getchangedfiles(self, version, i):
+ changes = []
+ if i is None:
+ fh = self.gitopen("git diff-tree --root -m -r %s" % version)
+ for l in fh:
+ if "\t" not in l:
+ continue
+ m, f = l[:-1].split("\t")
+ changes.append(f)
+ else:
+ fh = self.gitopen('git diff-tree --name-only --root -r %s '
+ '"%s^%s" --' % (version, version, i + 1))
+ changes = [f.rstrip('\n') for f in fh]
+ if fh.close():
+ raise util.Abort(_('cannot read changes in %s') % version)
+
+ return changes
+
+ def getbookmarks(self):
+ bookmarks = {}
+
+ # Interesting references in git are prefixed
+ prefix = 'refs/heads/'
+ prefixlen = len(prefix)
+
+ # factor two commands
+ gitcmd = { 'remote/': 'git ls-remote --heads origin',
+ '': 'git show-ref'}
+
+ # Origin heads
+ for reftype in gitcmd:
+ try:
+ fh = self.gitopen(gitcmd[reftype], noerr=True)
+ for line in fh:
+ line = line.strip()
+ rev, name = line.split(None, 1)
+ if not name.startswith(prefix):
+ continue
+ name = '%s%s' % (reftype, name[prefixlen:])
+ bookmarks[name] = rev
+ except Exception:
+ pass
+
+ return bookmarks
diff --git a/hgext/convert/gnuarch.py b/hgext/convert/gnuarch.py
new file mode 100644
index 0000000..de8dc43
--- /dev/null
+++ b/hgext/convert/gnuarch.py
@@ -0,0 +1,338 @@
+# gnuarch.py - GNU Arch support for the convert extension
+#
+# Copyright 2008, 2009 Aleix Conchillo Flaque <aleix@member.fsf.org>
+# and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from common import NoRepo, commandline, commit, converter_source
+from mercurial.i18n import _
+from mercurial import encoding, util
+import os, shutil, tempfile, stat
+from email.Parser import Parser
+
+class gnuarch_source(converter_source, commandline):
+
+ class gnuarch_rev(object):
+ def __init__(self, rev):
+ self.rev = rev
+ self.summary = ''
+ self.date = None
+ self.author = ''
+ self.continuationof = None
+ self.add_files = []
+ self.mod_files = []
+ self.del_files = []
+ self.ren_files = {}
+ self.ren_dirs = {}
+
+ def __init__(self, ui, path, rev=None):
+ super(gnuarch_source, self).__init__(ui, path, rev=rev)
+
+ if not os.path.exists(os.path.join(path, '{arch}')):
+ raise NoRepo(_("%s does not look like a GNU Arch repository")
+ % path)
+
+ # Could use checktool, but we want to check for baz or tla.
+ self.execmd = None
+ if util.findexe('baz'):
+ self.execmd = 'baz'
+ else:
+ if util.findexe('tla'):
+ self.execmd = 'tla'
+ else:
+ raise util.Abort(_('cannot find a GNU Arch tool'))
+
+ commandline.__init__(self, ui, self.execmd)
+
+ self.path = os.path.realpath(path)
+ self.tmppath = None
+
+ self.treeversion = None
+ self.lastrev = None
+ self.changes = {}
+ self.parents = {}
+ self.tags = {}
+ self.catlogparser = Parser()
+ self.encoding = encoding.encoding
+ self.archives = []
+
+ def before(self):
+ # Get registered archives
+ self.archives = [i.rstrip('\n')
+ for i in self.runlines0('archives', '-n')]
+
+ if self.execmd == 'tla':
+ output = self.run0('tree-version', self.path)
+ else:
+ output = self.run0('tree-version', '-d', self.path)
+ self.treeversion = output.strip()
+
+ # Get name of temporary directory
+ version = self.treeversion.split('/')
+ self.tmppath = os.path.join(tempfile.gettempdir(),
+ 'hg-%s' % version[1])
+
+ # Generate parents dictionary
+ self.parents[None] = []
+ treeversion = self.treeversion
+ child = None
+ while treeversion:
+ self.ui.status(_('analyzing tree version %s...\n') % treeversion)
+
+ archive = treeversion.split('/')[0]
+ if archive not in self.archives:
+ self.ui.status(_('tree analysis stopped because it points to '
+ 'an unregistered archive %s...\n') % archive)
+ break
+
+ # Get the complete list of revisions for that tree version
+ output, status = self.runlines('revisions', '-r', '-f', treeversion)
+ self.checkexit(status, 'failed retrieveing revisions for %s'
+ % treeversion)
+
+ # No new iteration unless a revision has a continuation-of header
+ treeversion = None
+
+ for l in output:
+ rev = l.strip()
+ self.changes[rev] = self.gnuarch_rev(rev)
+ self.parents[rev] = []
+
+ # Read author, date and summary
+ catlog, status = self.run('cat-log', '-d', self.path, rev)
+ if status:
+ catlog = self.run0('cat-archive-log', rev)
+ self._parsecatlog(catlog, rev)
+
+ # Populate the parents map
+ self.parents[child].append(rev)
+
+ # Keep track of the current revision as the child of the next
+ # revision scanned
+ child = rev
+
+ # Check if we have to follow the usual incremental history
+ # or if we have to 'jump' to a different treeversion given
+ # by the continuation-of header.
+ if self.changes[rev].continuationof:
+ treeversion = '--'.join(
+ self.changes[rev].continuationof.split('--')[:-1])
+ break
+
+ # If we reached a base-0 revision w/o any continuation-of
+ # header, it means the tree history ends here.
+ if rev[-6:] == 'base-0':
+ break
+
+ def after(self):
+ self.ui.debug('cleaning up %s\n' % self.tmppath)
+ shutil.rmtree(self.tmppath, ignore_errors=True)
+
+ def getheads(self):
+ return self.parents[None]
+
+ def getfile(self, name, rev):
+ if rev != self.lastrev:
+ raise util.Abort(_('internal calling inconsistency'))
+
+ # Raise IOError if necessary (i.e. deleted files).
+ if not os.path.lexists(os.path.join(self.tmppath, name)):
+ raise IOError
+
+ return self._getfile(name, rev)
+
+ def getchanges(self, rev):
+ self._update(rev)
+ changes = []
+ copies = {}
+
+ for f in self.changes[rev].add_files:
+ changes.append((f, rev))
+
+ for f in self.changes[rev].mod_files:
+ changes.append((f, rev))
+
+ for f in self.changes[rev].del_files:
+ changes.append((f, rev))
+
+ for src in self.changes[rev].ren_files:
+ to = self.changes[rev].ren_files[src]
+ changes.append((src, rev))
+ changes.append((to, rev))
+ copies[to] = src
+
+ for src in self.changes[rev].ren_dirs:
+ to = self.changes[rev].ren_dirs[src]
+ chgs, cps = self._rendirchanges(src, to)
+ changes += [(f, rev) for f in chgs]
+ copies.update(cps)
+
+ self.lastrev = rev
+ return sorted(set(changes)), copies
+
+ def getcommit(self, rev):
+ changes = self.changes[rev]
+ return commit(author=changes.author, date=changes.date,
+ desc=changes.summary, parents=self.parents[rev], rev=rev)
+
+ def gettags(self):
+ return self.tags
+
+ def _execute(self, cmd, *args, **kwargs):
+ cmdline = [self.execmd, cmd]
+ cmdline += args
+ cmdline = [util.shellquote(arg) for arg in cmdline]
+ cmdline += ['>', util.nulldev, '2>', util.nulldev]
+ cmdline = util.quotecommand(' '.join(cmdline))
+ self.ui.debug(cmdline, '\n')
+ return os.system(cmdline)
+
+ def _update(self, rev):
+ self.ui.debug('applying revision %s...\n' % rev)
+ changeset, status = self.runlines('replay', '-d', self.tmppath,
+ rev)
+ if status:
+ # Something went wrong while merging (baz or tla
+ # issue?), get latest revision and try from there
+ shutil.rmtree(self.tmppath, ignore_errors=True)
+ self._obtainrevision(rev)
+ else:
+ old_rev = self.parents[rev][0]
+ self.ui.debug('computing changeset between %s and %s...\n'
+ % (old_rev, rev))
+ self._parsechangeset(changeset, rev)
+
+ def _getfile(self, name, rev):
+ mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
+ if stat.S_ISLNK(mode):
+ data = os.readlink(os.path.join(self.tmppath, name))
+ mode = mode and 'l' or ''
+ else:
+ data = open(os.path.join(self.tmppath, name), 'rb').read()
+ mode = (mode & 0111) and 'x' or ''
+ return data, mode
+
+ def _exclude(self, name):
+ exclude = ['{arch}', '.arch-ids', '.arch-inventory']
+ for exc in exclude:
+ if name.find(exc) != -1:
+ return True
+ return False
+
+ def _readcontents(self, path):
+ files = []
+ contents = os.listdir(path)
+ while len(contents) > 0:
+ c = contents.pop()
+ p = os.path.join(path, c)
+ # os.walk could be used, but here we avoid internal GNU
+ # Arch files and directories, thus saving a lot time.
+ if not self._exclude(p):
+ if os.path.isdir(p):
+ contents += [os.path.join(c, f) for f in os.listdir(p)]
+ else:
+ files.append(c)
+ return files
+
+ def _rendirchanges(self, src, dest):
+ changes = []
+ copies = {}
+ files = self._readcontents(os.path.join(self.tmppath, dest))
+ for f in files:
+ s = os.path.join(src, f)
+ d = os.path.join(dest, f)
+ changes.append(s)
+ changes.append(d)
+ copies[d] = s
+ return changes, copies
+
+ def _obtainrevision(self, rev):
+ self.ui.debug('obtaining revision %s...\n' % rev)
+ output = self._execute('get', rev, self.tmppath)
+ self.checkexit(output)
+ self.ui.debug('analyzing revision %s...\n' % rev)
+ files = self._readcontents(self.tmppath)
+ self.changes[rev].add_files += files
+
+ def _stripbasepath(self, path):
+ if path.startswith('./'):
+ return path[2:]
+ return path
+
+ def _parsecatlog(self, data, rev):
+ try:
+ catlog = self.catlogparser.parsestr(data)
+
+ # Commit date
+ self.changes[rev].date = util.datestr(
+ util.strdate(catlog['Standard-date'],
+ '%Y-%m-%d %H:%M:%S'))
+
+ # Commit author
+ self.changes[rev].author = self.recode(catlog['Creator'])
+
+ # Commit description
+ self.changes[rev].summary = '\n\n'.join((catlog['Summary'],
+ catlog.get_payload()))
+ self.changes[rev].summary = self.recode(self.changes[rev].summary)
+
+ # Commit revision origin when dealing with a branch or tag
+ if 'Continuation-of' in catlog:
+ self.changes[rev].continuationof = self.recode(
+ catlog['Continuation-of'])
+ except Exception:
+ raise util.Abort(_('could not parse cat-log of %s') % rev)
+
+ def _parsechangeset(self, data, rev):
+ for l in data:
+ l = l.strip()
+ # Added file (ignore added directory)
+ if l.startswith('A') and not l.startswith('A/'):
+ file = self._stripbasepath(l[1:].strip())
+ if not self._exclude(file):
+ self.changes[rev].add_files.append(file)
+ # Deleted file (ignore deleted directory)
+ elif l.startswith('D') and not l.startswith('D/'):
+ file = self._stripbasepath(l[1:].strip())
+ if not self._exclude(file):
+ self.changes[rev].del_files.append(file)
+ # Modified binary file
+ elif l.startswith('Mb'):
+ file = self._stripbasepath(l[2:].strip())
+ if not self._exclude(file):
+ self.changes[rev].mod_files.append(file)
+ # Modified link
+ elif l.startswith('M->'):
+ file = self._stripbasepath(l[3:].strip())
+ if not self._exclude(file):
+ self.changes[rev].mod_files.append(file)
+ # Modified file
+ elif l.startswith('M'):
+ file = self._stripbasepath(l[1:].strip())
+ if not self._exclude(file):
+ self.changes[rev].mod_files.append(file)
+ # Renamed file (or link)
+ elif l.startswith('=>'):
+ files = l[2:].strip().split(' ')
+ if len(files) == 1:
+ files = l[2:].strip().split('\t')
+ src = self._stripbasepath(files[0])
+ dst = self._stripbasepath(files[1])
+ if not self._exclude(src) and not self._exclude(dst):
+ self.changes[rev].ren_files[src] = dst
+ # Conversion from file to link or from link to file (modified)
+ elif l.startswith('ch'):
+ file = self._stripbasepath(l[2:].strip())
+ if not self._exclude(file):
+ self.changes[rev].mod_files.append(file)
+ # Renamed directory
+ elif l.startswith('/>'):
+ dirs = l[2:].strip().split(' ')
+ if len(dirs) == 1:
+ dirs = l[2:].strip().split('\t')
+ src = self._stripbasepath(dirs[0])
+ dst = self._stripbasepath(dirs[1])
+ if not self._exclude(src) and not self._exclude(dst):
+ self.changes[rev].ren_dirs[src] = dst
diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py
new file mode 100644
index 0000000..287c771
--- /dev/null
+++ b/hgext/convert/hg.py
@@ -0,0 +1,395 @@
+# hg.py - hg backend for convert extension
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# Notes for hg->hg conversion:
+#
+# * Old versions of Mercurial didn't trim the whitespace from the ends
+# of commit messages, but new versions do. Changesets created by
+# those older versions, then converted, may thus have different
+# hashes for changesets that are otherwise identical.
+#
+# * Using "--config convert.hg.saverev=true" will make the source
+# identifier to be stored in the converted revision. This will cause
+# the converted revision to have a different identity than the
+# source.
+
+
+import os, time, cStringIO
+from mercurial.i18n import _
+from mercurial.node import bin, hex, nullid
+from mercurial import hg, util, context, bookmarks, error
+
+from common import NoRepo, commit, converter_source, converter_sink
+
+class mercurial_sink(converter_sink):
+ def __init__(self, ui, path):
+ converter_sink.__init__(self, ui, path)
+ self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
+ self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
+ self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
+ self.lastbranch = None
+ if os.path.isdir(path) and len(os.listdir(path)) > 0:
+ try:
+ self.repo = hg.repository(self.ui, path)
+ if not self.repo.local():
+ raise NoRepo(_('%s is not a local Mercurial repository')
+ % path)
+ except error.RepoError, err:
+ ui.traceback()
+ raise NoRepo(err.args[0])
+ else:
+ try:
+ ui.status(_('initializing destination %s repository\n') % path)
+ self.repo = hg.repository(self.ui, path, create=True)
+ if not self.repo.local():
+ raise NoRepo(_('%s is not a local Mercurial repository')
+ % path)
+ self.created.append(path)
+ except error.RepoError:
+ ui.traceback()
+ raise NoRepo(_("could not create hg repository %s as sink")
+ % path)
+ self.lock = None
+ self.wlock = None
+ self.filemapmode = False
+
+ def before(self):
+ self.ui.debug('run hg sink pre-conversion action\n')
+ self.wlock = self.repo.wlock()
+ self.lock = self.repo.lock()
+
+ def after(self):
+ self.ui.debug('run hg sink post-conversion action\n')
+ if self.lock:
+ self.lock.release()
+ if self.wlock:
+ self.wlock.release()
+
+ def revmapfile(self):
+ return self.repo.join("shamap")
+
+ def authorfile(self):
+ return self.repo.join("authormap")
+
+ def getheads(self):
+ h = self.repo.changelog.heads()
+ return [hex(x) for x in h]
+
+ def setbranch(self, branch, pbranches):
+ if not self.clonebranches:
+ return
+
+ setbranch = (branch != self.lastbranch)
+ self.lastbranch = branch
+ if not branch:
+ branch = 'default'
+ pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
+ pbranch = pbranches and pbranches[0][1] or 'default'
+
+ branchpath = os.path.join(self.path, branch)
+ if setbranch:
+ self.after()
+ try:
+ self.repo = hg.repository(self.ui, branchpath)
+ except Exception:
+ self.repo = hg.repository(self.ui, branchpath, create=True)
+ self.before()
+
+ # pbranches may bring revisions from other branches (merge parents)
+ # Make sure we have them, or pull them.
+ missings = {}
+ for b in pbranches:
+ try:
+ self.repo.lookup(b[0])
+ except Exception:
+ missings.setdefault(b[1], []).append(b[0])
+
+ if missings:
+ self.after()
+ for pbranch, heads in missings.iteritems():
+ pbranchpath = os.path.join(self.path, pbranch)
+ prepo = hg.peer(self.ui, {}, pbranchpath)
+ self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch))
+ self.repo.pull(prepo, [prepo.lookup(h) for h in heads])
+ self.before()
+
+ def _rewritetags(self, source, revmap, data):
+ fp = cStringIO.StringIO()
+ for line in data.splitlines():
+ s = line.split(' ', 1)
+ if len(s) != 2:
+ continue
+ revid = revmap.get(source.lookuprev(s[0]))
+ if not revid:
+ continue
+ fp.write('%s %s\n' % (revid, s[1]))
+ return fp.getvalue()
+
+ def putcommit(self, files, copies, parents, commit, source, revmap):
+
+ files = dict(files)
+ def getfilectx(repo, memctx, f):
+ v = files[f]
+ data, mode = source.getfile(f, v)
+ if f == '.hgtags':
+ data = self._rewritetags(source, revmap, data)
+ return context.memfilectx(f, data, 'l' in mode, 'x' in mode,
+ copies.get(f))
+
+ pl = []
+ for p in parents:
+ if p not in pl:
+ pl.append(p)
+ parents = pl
+ nparents = len(parents)
+ if self.filemapmode and nparents == 1:
+ m1node = self.repo.changelog.read(bin(parents[0]))[0]
+ parent = parents[0]
+
+ if len(parents) < 2:
+ parents.append(nullid)
+ if len(parents) < 2:
+ parents.append(nullid)
+ p2 = parents.pop(0)
+
+ text = commit.desc
+ extra = commit.extra.copy()
+ if self.branchnames and commit.branch:
+ extra['branch'] = commit.branch
+ if commit.rev:
+ extra['convert_revision'] = commit.rev
+
+ while parents:
+ p1 = p2
+ p2 = parents.pop(0)
+ ctx = context.memctx(self.repo, (p1, p2), text, files.keys(),
+ getfilectx, commit.author, commit.date, extra)
+ self.repo.commitctx(ctx)
+ text = "(octopus merge fixup)\n"
+ p2 = hex(self.repo.changelog.tip())
+
+ if self.filemapmode and nparents == 1:
+ man = self.repo.manifest
+ mnode = self.repo.changelog.read(bin(p2))[0]
+ closed = 'close' in commit.extra
+ if not closed and not man.cmp(m1node, man.revision(mnode)):
+ self.ui.status(_("filtering out empty revision\n"))
+ self.repo.rollback(force=True)
+ return parent
+ return p2
+
+ def puttags(self, tags):
+ try:
+ parentctx = self.repo[self.tagsbranch]
+ tagparent = parentctx.node()
+ except error.RepoError:
+ parentctx = None
+ tagparent = nullid
+
+ try:
+ oldlines = sorted(parentctx['.hgtags'].data().splitlines(True))
+ except Exception:
+ oldlines = []
+
+ newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags])
+ if newlines == oldlines:
+ return None, None
+ data = "".join(newlines)
+ def getfilectx(repo, memctx, f):
+ return context.memfilectx(f, data, False, False, None)
+
+ self.ui.status(_("updating tags\n"))
+ date = "%s 0" % int(time.mktime(time.gmtime()))
+ extra = {'branch': self.tagsbranch}
+ ctx = context.memctx(self.repo, (tagparent, None), "update tags",
+ [".hgtags"], getfilectx, "convert-repo", date,
+ extra)
+ self.repo.commitctx(ctx)
+ return hex(self.repo.changelog.tip()), hex(tagparent)
+
+ def setfilemapmode(self, active):
+ self.filemapmode = active
+
+ def putbookmarks(self, updatedbookmark):
+ if not len(updatedbookmark):
+ return
+
+ self.ui.status(_("updating bookmarks\n"))
+ for bookmark in updatedbookmark:
+ self.repo._bookmarks[bookmark] = bin(updatedbookmark[bookmark])
+ bookmarks.write(self.repo)
+
+ def hascommit(self, rev):
+ if rev not in self.repo and self.clonebranches:
+ raise util.Abort(_('revision %s not found in destination '
+ 'repository (lookups with clonebranches=true '
+ 'are not implemented)') % rev)
+ return rev in self.repo
+
+class mercurial_source(converter_source):
+ def __init__(self, ui, path, rev=None):
+ converter_source.__init__(self, ui, path, rev)
+ self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False)
+ self.ignored = set()
+ self.saverev = ui.configbool('convert', 'hg.saverev', False)
+ try:
+ self.repo = hg.repository(self.ui, path)
+ # try to provoke an exception if this isn't really a hg
+ # repo, but some other bogus compatible-looking url
+ if not self.repo.local():
+ raise error.RepoError
+ except error.RepoError:
+ ui.traceback()
+ raise NoRepo(_("%s is not a local Mercurial repository") % path)
+ self.lastrev = None
+ self.lastctx = None
+ self._changescache = None
+ self.convertfp = None
+ # Restrict converted revisions to startrev descendants
+ startnode = ui.config('convert', 'hg.startrev')
+ if startnode is not None:
+ try:
+ startnode = self.repo.lookup(startnode)
+ except error.RepoError:
+ raise util.Abort(_('%s is not a valid start revision')
+ % startnode)
+ startrev = self.repo.changelog.rev(startnode)
+ children = {startnode: 1}
+ for rev in self.repo.changelog.descendants([startrev]):
+ children[self.repo.changelog.node(rev)] = 1
+ self.keep = children.__contains__
+ else:
+ self.keep = util.always
+
+ def changectx(self, rev):
+ if self.lastrev != rev:
+ self.lastctx = self.repo[rev]
+ self.lastrev = rev
+ return self.lastctx
+
+ def parents(self, ctx):
+ return [p for p in ctx.parents() if p and self.keep(p.node())]
+
+ def getheads(self):
+ if self.rev:
+ heads = [self.repo[self.rev].node()]
+ else:
+ heads = self.repo.heads()
+ return [hex(h) for h in heads if self.keep(h)]
+
+ def getfile(self, name, rev):
+ try:
+ fctx = self.changectx(rev)[name]
+ return fctx.data(), fctx.flags()
+ except error.LookupError, err:
+ raise IOError(err)
+
+ def getchanges(self, rev):
+ ctx = self.changectx(rev)
+ parents = self.parents(ctx)
+ if not parents:
+ files = sorted(ctx.manifest())
+ # getcopies() is not needed for roots, but it is a simple way to
+ # detect missing revlogs and abort on errors or populate
+ # self.ignored
+ self.getcopies(ctx, parents, files)
+ return [(f, rev) for f in files if f not in self.ignored], {}
+ if self._changescache and self._changescache[0] == rev:
+ m, a, r = self._changescache[1]
+ else:
+ m, a, r = self.repo.status(parents[0].node(), ctx.node())[:3]
+ # getcopies() detects missing revlogs early, run it before
+ # filtering the changes.
+ copies = self.getcopies(ctx, parents, m + a)
+ changes = [(name, rev) for name in m + a + r
+ if name not in self.ignored]
+ return sorted(changes), copies
+
+ def getcopies(self, ctx, parents, files):
+ copies = {}
+ for name in files:
+ if name in self.ignored:
+ continue
+ try:
+ copysource, copynode = ctx.filectx(name).renamed()
+ if copysource in self.ignored or not self.keep(copynode):
+ continue
+ # Ignore copy sources not in parent revisions
+ found = False
+ for p in parents:
+ if copysource in p:
+ found = True
+ break
+ if not found:
+ continue
+ copies[name] = copysource
+ except TypeError:
+ pass
+ except error.LookupError, e:
+ if not self.ignoreerrors:
+ raise
+ self.ignored.add(name)
+ self.ui.warn(_('ignoring: %s\n') % e)
+ return copies
+
+ def getcommit(self, rev):
+ ctx = self.changectx(rev)
+ parents = [p.hex() for p in self.parents(ctx)]
+ if self.saverev:
+ crev = rev
+ else:
+ crev = None
+ return commit(author=ctx.user(),
+ date=util.datestr(ctx.date(), '%Y-%m-%d %H:%M:%S %1%2'),
+ desc=ctx.description(), rev=crev, parents=parents,
+ branch=ctx.branch(), extra=ctx.extra(),
+ sortkey=ctx.rev())
+
+ def gettags(self):
+ tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
+ return dict([(name, hex(node)) for name, node in tags
+ if self.keep(node)])
+
+ def getchangedfiles(self, rev, i):
+ ctx = self.changectx(rev)
+ parents = self.parents(ctx)
+ if not parents and i is None:
+ i = 0
+ changes = [], ctx.manifest().keys(), []
+ else:
+ i = i or 0
+ changes = self.repo.status(parents[i].node(), ctx.node())[:3]
+ changes = [[f for f in l if f not in self.ignored] for l in changes]
+
+ if i == 0:
+ self._changescache = (rev, changes)
+
+ return changes[0] + changes[1] + changes[2]
+
+ def converted(self, rev, destrev):
+ if self.convertfp is None:
+ self.convertfp = open(self.repo.join('shamap'), 'a')
+ self.convertfp.write('%s %s\n' % (destrev, rev))
+ self.convertfp.flush()
+
+ def before(self):
+ self.ui.debug('run hg source pre-conversion action\n')
+
+ def after(self):
+ self.ui.debug('run hg source post-conversion action\n')
+
+ def hasnativeorder(self):
+ return True
+
+ def lookuprev(self, rev):
+ try:
+ return hex(self.repo.lookup(rev))
+ except error.RepoError:
+ return None
+
+ def getbookmarks(self):
+ return bookmarks.listbookmarks(self.repo)
diff --git a/hgext/convert/monotone.py b/hgext/convert/monotone.py
new file mode 100644
index 0000000..969e0e5
--- /dev/null
+++ b/hgext/convert/monotone.py
@@ -0,0 +1,360 @@
+# monotone.py - monotone support for the convert extension
+#
+# Copyright 2008, 2009 Mikkel Fahnoe Jorgensen <mikkel@dvide.com> and
+# others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, re
+from mercurial import util
+from common import NoRepo, commit, converter_source, checktool
+from common import commandline
+from mercurial.i18n import _
+
+class monotone_source(converter_source, commandline):
+ def __init__(self, ui, path=None, rev=None):
+ converter_source.__init__(self, ui, path, rev)
+ commandline.__init__(self, ui, 'mtn')
+
+ self.ui = ui
+ self.path = path
+ self.automatestdio = False
+ self.rev = rev
+
+ norepo = NoRepo(_("%s does not look like a monotone repository")
+ % path)
+ if not os.path.exists(os.path.join(path, '_MTN')):
+ # Could be a monotone repository (SQLite db file)
+ try:
+ f = file(path, 'rb')
+ header = f.read(16)
+ f.close()
+ except IOError:
+ header = ''
+ if header != 'SQLite format 3\x00':
+ raise norepo
+
+ # regular expressions for parsing monotone output
+ space = r'\s*'
+ name = r'\s+"((?:\\"|[^"])*)"\s*'
+ value = name
+ revision = r'\s+\[(\w+)\]\s*'
+ lines = r'(?:.|\n)+'
+
+ self.dir_re = re.compile(space + "dir" + name)
+ self.file_re = re.compile(space + "file" + name +
+ "content" + revision)
+ self.add_file_re = re.compile(space + "add_file" + name +
+ "content" + revision)
+ self.patch_re = re.compile(space + "patch" + name +
+ "from" + revision + "to" + revision)
+ self.rename_re = re.compile(space + "rename" + name + "to" + name)
+ self.delete_re = re.compile(space + "delete" + name)
+ self.tag_re = re.compile(space + "tag" + name + "revision" +
+ revision)
+ self.cert_re = re.compile(lines + space + "name" + name +
+ "value" + value)
+
+ attr = space + "file" + lines + space + "attr" + space
+ self.attr_execute_re = re.compile(attr + '"mtn:execute"' +
+ space + '"true"')
+
+ # cached data
+ self.manifest_rev = None
+ self.manifest = None
+ self.files = None
+ self.dirs = None
+
+ checktool('mtn', abort=False)
+
+ def mtnrun(self, *args, **kwargs):
+ if self.automatestdio:
+ return self.mtnrunstdio(*args, **kwargs)
+ else:
+ return self.mtnrunsingle(*args, **kwargs)
+
+ def mtnrunsingle(self, *args, **kwargs):
+ kwargs['d'] = self.path
+ return self.run0('automate', *args, **kwargs)
+
+ def mtnrunstdio(self, *args, **kwargs):
+ # Prepare the command in automate stdio format
+ command = []
+ for k, v in kwargs.iteritems():
+ command.append("%s:%s" % (len(k), k))
+ if v:
+ command.append("%s:%s" % (len(v), v))
+ if command:
+ command.insert(0, 'o')
+ command.append('e')
+
+ command.append('l')
+ for arg in args:
+ command += "%s:%s" % (len(arg), arg)
+ command.append('e')
+ command = ''.join(command)
+
+ self.ui.debug("mtn: sending '%s'\n" % command)
+ self.mtnwritefp.write(command)
+ self.mtnwritefp.flush()
+
+ return self.mtnstdioreadcommandoutput(command)
+
+ def mtnstdioreadpacket(self):
+ read = None
+ commandnbr = ''
+ while read != ':':
+ read = self.mtnreadfp.read(1)
+ if not read:
+ raise util.Abort(_('bad mtn packet - no end of commandnbr'))
+ commandnbr += read
+ commandnbr = commandnbr[:-1]
+
+ stream = self.mtnreadfp.read(1)
+ if stream not in 'mewptl':
+ raise util.Abort(_('bad mtn packet - bad stream type %s') % stream)
+
+ read = self.mtnreadfp.read(1)
+ if read != ':':
+ raise util.Abort(_('bad mtn packet - no divider before size'))
+
+ read = None
+ lengthstr = ''
+ while read != ':':
+ read = self.mtnreadfp.read(1)
+ if not read:
+ raise util.Abort(_('bad mtn packet - no end of packet size'))
+ lengthstr += read
+ try:
+ length = long(lengthstr[:-1])
+ except TypeError:
+ raise util.Abort(_('bad mtn packet - bad packet size %s')
+ % lengthstr)
+
+ read = self.mtnreadfp.read(length)
+ if len(read) != length:
+ raise util.Abort(_("bad mtn packet - unable to read full packet "
+ "read %s of %s") % (len(read), length))
+
+ return (commandnbr, stream, length, read)
+
+ def mtnstdioreadcommandoutput(self, command):
+ retval = []
+ while True:
+ commandnbr, stream, length, output = self.mtnstdioreadpacket()
+ self.ui.debug('mtn: read packet %s:%s:%s\n' %
+ (commandnbr, stream, length))
+
+ if stream == 'l':
+ # End of command
+ if output != '0':
+ raise util.Abort(_("mtn command '%s' returned %s") %
+ (command, output))
+ break
+ elif stream in 'ew':
+ # Error, warning output
+ self.ui.warn(_('%s error:\n') % self.command)
+ self.ui.warn(output)
+ elif stream == 'p':
+ # Progress messages
+ self.ui.debug('mtn: ' + output)
+ elif stream == 'm':
+ # Main stream - command output
+ retval.append(output)
+
+ return ''.join(retval)
+
+ def mtnloadmanifest(self, rev):
+ if self.manifest_rev == rev:
+ return
+ self.manifest = self.mtnrun("get_manifest_of", rev).split("\n\n")
+ self.manifest_rev = rev
+ self.files = {}
+ self.dirs = {}
+
+ for e in self.manifest:
+ m = self.file_re.match(e)
+ if m:
+ attr = ""
+ name = m.group(1)
+ node = m.group(2)
+ if self.attr_execute_re.match(e):
+ attr += "x"
+ self.files[name] = (node, attr)
+ m = self.dir_re.match(e)
+ if m:
+ self.dirs[m.group(1)] = True
+
+ def mtnisfile(self, name, rev):
+ # a non-file could be a directory or a deleted or renamed file
+ self.mtnloadmanifest(rev)
+ return name in self.files
+
+ def mtnisdir(self, name, rev):
+ self.mtnloadmanifest(rev)
+ return name in self.dirs
+
+ def mtngetcerts(self, rev):
+ certs = {"author":"<missing>", "date":"<missing>",
+ "changelog":"<missing>", "branch":"<missing>"}
+ certlist = self.mtnrun("certs", rev)
+ # mtn < 0.45:
+ # key "test@selenic.com"
+ # mtn >= 0.45:
+ # key [ff58a7ffb771907c4ff68995eada1c4da068d328]
+ certlist = re.split('\n\n key ["\[]', certlist)
+ for e in certlist:
+ m = self.cert_re.match(e)
+ if m:
+ name, value = m.groups()
+ value = value.replace(r'\"', '"')
+ value = value.replace(r'\\', '\\')
+ certs[name] = value
+ # Monotone may have subsecond dates: 2005-02-05T09:39:12.364306
+ # and all times are stored in UTC
+ certs["date"] = certs["date"].split('.')[0] + " UTC"
+ return certs
+
+ # implement the converter_source interface:
+
+ def getheads(self):
+ if not self.rev:
+ return self.mtnrun("leaves").splitlines()
+ else:
+ return [self.rev]
+
+ def getchanges(self, rev):
+ #revision = self.mtncmd("get_revision %s" % rev).split("\n\n")
+ revision = self.mtnrun("get_revision", rev).split("\n\n")
+ files = {}
+ ignoremove = {}
+ renameddirs = []
+ copies = {}
+ for e in revision:
+ m = self.add_file_re.match(e)
+ if m:
+ files[m.group(1)] = rev
+ ignoremove[m.group(1)] = rev
+ m = self.patch_re.match(e)
+ if m:
+ files[m.group(1)] = rev
+ # Delete/rename is handled later when the convert engine
+ # discovers an IOError exception from getfile,
+ # but only if we add the "from" file to the list of changes.
+ m = self.delete_re.match(e)
+ if m:
+ files[m.group(1)] = rev
+ m = self.rename_re.match(e)
+ if m:
+ toname = m.group(2)
+ fromname = m.group(1)
+ if self.mtnisfile(toname, rev):
+ ignoremove[toname] = 1
+ copies[toname] = fromname
+ files[toname] = rev
+ files[fromname] = rev
+ elif self.mtnisdir(toname, rev):
+ renameddirs.append((fromname, toname))
+
+ # Directory renames can be handled only once we have recorded
+ # all new files
+ for fromdir, todir in renameddirs:
+ renamed = {}
+ for tofile in self.files:
+ if tofile in ignoremove:
+ continue
+ if tofile.startswith(todir + '/'):
+ renamed[tofile] = fromdir + tofile[len(todir):]
+ # Avoid chained moves like:
+ # d1(/a) => d3/d1(/a)
+ # d2 => d3
+ ignoremove[tofile] = 1
+ for tofile, fromfile in renamed.items():
+ self.ui.debug (_("copying file in renamed directory "
+ "from '%s' to '%s'")
+ % (fromfile, tofile), '\n')
+ files[tofile] = rev
+ copies[tofile] = fromfile
+ for fromfile in renamed.values():
+ files[fromfile] = rev
+
+ return (files.items(), copies)
+
+ def getfile(self, name, rev):
+ if not self.mtnisfile(name, rev):
+ raise IOError # file was deleted or renamed
+ try:
+ data = self.mtnrun("get_file_of", name, r=rev)
+ except Exception:
+ raise IOError # file was deleted or renamed
+ self.mtnloadmanifest(rev)
+ node, attr = self.files.get(name, (None, ""))
+ return data, attr
+
+ def getcommit(self, rev):
+ extra = {}
+ certs = self.mtngetcerts(rev)
+ if certs.get('suspend') == certs["branch"]:
+ extra['close'] = '1'
+ return commit(
+ author=certs["author"],
+ date=util.datestr(util.strdate(certs["date"], "%Y-%m-%dT%H:%M:%S")),
+ desc=certs["changelog"],
+ rev=rev,
+ parents=self.mtnrun("parents", rev).splitlines(),
+ branch=certs["branch"],
+ extra=extra)
+
+ def gettags(self):
+ tags = {}
+ for e in self.mtnrun("tags").split("\n\n"):
+ m = self.tag_re.match(e)
+ if m:
+ tags[m.group(1)] = m.group(2)
+ return tags
+
+ def getchangedfiles(self, rev, i):
+ # This function is only needed to support --filemap
+ # ... and we don't support that
+ raise NotImplementedError
+
+ def before(self):
+ # Check if we have a new enough version to use automate stdio
+ version = 0.0
+ try:
+ versionstr = self.mtnrunsingle("interface_version")
+ version = float(versionstr)
+ except Exception:
+ raise util.Abort(_("unable to determine mtn automate interface "
+ "version"))
+
+ if version >= 12.0:
+ self.automatestdio = True
+ self.ui.debug("mtn automate version %s - using automate stdio\n" %
+ version)
+
+ # launch the long-running automate stdio process
+ self.mtnwritefp, self.mtnreadfp = self._run2('automate', 'stdio',
+ '-d', self.path)
+ # read the headers
+ read = self.mtnreadfp.readline()
+ if read != 'format-version: 2\n':
+ raise util.Abort(_('mtn automate stdio header unexpected: %s')
+ % read)
+ while read != '\n':
+ read = self.mtnreadfp.readline()
+ if not read:
+ raise util.Abort(_("failed to reach end of mtn automate "
+ "stdio headers"))
+ else:
+ self.ui.debug("mtn automate version %s - not using automate stdio "
+ "(automate >= 12.0 - mtn >= 0.46 is needed)\n" % version)
+
+ def after(self):
+ if self.automatestdio:
+ self.mtnwritefp.close()
+ self.mtnwritefp = None
+ self.mtnreadfp.close()
+ self.mtnreadfp = None
+
diff --git a/hgext/convert/p4.py b/hgext/convert/p4.py
new file mode 100644
index 0000000..76b28e7
--- /dev/null
+++ b/hgext/convert/p4.py
@@ -0,0 +1,203 @@
+# Perforce source for convert extension.
+#
+# Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial import util
+from mercurial.i18n import _
+
+from common import commit, converter_source, checktool, NoRepo
+import marshal
+import re
+
+def loaditer(f):
+ "Yield the dictionary objects generated by p4"
+ try:
+ while True:
+ d = marshal.load(f)
+ if not d:
+ break
+ yield d
+ except EOFError:
+ pass
+
+class p4_source(converter_source):
+ def __init__(self, ui, path, rev=None):
+ super(p4_source, self).__init__(ui, path, rev=rev)
+
+ if "/" in path and not path.startswith('//'):
+ raise NoRepo(_('%s does not look like a P4 repository') % path)
+
+ checktool('p4', abort=False)
+
+ self.p4changes = {}
+ self.heads = {}
+ self.changeset = {}
+ self.files = {}
+ self.tags = {}
+ self.lastbranch = {}
+ self.parent = {}
+ self.encoding = "latin_1"
+ self.depotname = {} # mapping from local name to depot name
+ self.re_type = re.compile(
+ "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
+ "(\+\w+)?$")
+ self.re_keywords = re.compile(
+ r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
+ r":[^$\n]*\$")
+ self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$")
+
+ self._parse(ui, path)
+
+ def _parse_view(self, path):
+ "Read changes affecting the path"
+ cmd = 'p4 -G changes -s submitted %s' % util.shellquote(path)
+ stdout = util.popen(cmd, mode='rb')
+ for d in loaditer(stdout):
+ c = d.get("change", None)
+ if c:
+ self.p4changes[c] = True
+
+ def _parse(self, ui, path):
+ "Prepare list of P4 filenames and revisions to import"
+ ui.status(_('reading p4 views\n'))
+
+ # read client spec or view
+ if "/" in path:
+ self._parse_view(path)
+ if path.startswith("//") and path.endswith("/..."):
+ views = {path[:-3]:""}
+ else:
+ views = {"//": ""}
+ else:
+ cmd = 'p4 -G client -o %s' % util.shellquote(path)
+ clientspec = marshal.load(util.popen(cmd, mode='rb'))
+
+ views = {}
+ for client in clientspec:
+ if client.startswith("View"):
+ sview, cview = clientspec[client].split()
+ self._parse_view(sview)
+ if sview.endswith("...") and cview.endswith("..."):
+ sview = sview[:-3]
+ cview = cview[:-3]
+ cview = cview[2:]
+ cview = cview[cview.find("/") + 1:]
+ views[sview] = cview
+
+ # list of changes that affect our source files
+ self.p4changes = self.p4changes.keys()
+ self.p4changes.sort(key=int)
+
+ # list with depot pathnames, longest first
+ vieworder = views.keys()
+ vieworder.sort(key=len, reverse=True)
+
+ # handle revision limiting
+ startrev = self.ui.config('convert', 'p4.startrev', default=0)
+ self.p4changes = [x for x in self.p4changes
+ if ((not startrev or int(x) >= int(startrev)) and
+ (not self.rev or int(x) <= int(self.rev)))]
+
+ # now read the full changelists to get the list of file revisions
+ ui.status(_('collecting p4 changelists\n'))
+ lastid = None
+ for change in self.p4changes:
+ cmd = "p4 -G describe -s %s" % change
+ stdout = util.popen(cmd, mode='rb')
+ d = marshal.load(stdout)
+ desc = self.recode(d["desc"])
+ shortdesc = desc.split("\n", 1)[0]
+ t = '%s %s' % (d["change"], repr(shortdesc)[1:-1])
+ ui.status(util.ellipsis(t, 80) + '\n')
+
+ if lastid:
+ parents = [lastid]
+ else:
+ parents = []
+
+ date = (int(d["time"]), 0) # timezone not set
+ c = commit(author=self.recode(d["user"]),
+ date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
+ parents=parents, desc=desc, branch='',
+ extra={"p4": change})
+
+ files = []
+ i = 0
+ while ("depotFile%d" % i) in d and ("rev%d" % i) in d:
+ oldname = d["depotFile%d" % i]
+ filename = None
+ for v in vieworder:
+ if oldname.startswith(v):
+ filename = views[v] + oldname[len(v):]
+ break
+ if filename:
+ files.append((filename, d["rev%d" % i]))
+ self.depotname[filename] = oldname
+ i += 1
+ self.changeset[change] = c
+ self.files[change] = files
+ lastid = change
+
+ if lastid:
+ self.heads = [lastid]
+
+ def getheads(self):
+ return self.heads
+
+ def getfile(self, name, rev):
+ cmd = 'p4 -G print %s' \
+ % util.shellquote("%s#%s" % (self.depotname[name], rev))
+ stdout = util.popen(cmd, mode='rb')
+
+ mode = None
+ contents = ""
+ keywords = None
+
+ for d in loaditer(stdout):
+ code = d["code"]
+ data = d.get("data")
+
+ if code == "error":
+ raise IOError(d["generic"], data)
+
+ elif code == "stat":
+ p4type = self.re_type.match(d["type"])
+ if p4type:
+ mode = ""
+ flags = (p4type.group(1) or "") + (p4type.group(3) or "")
+ if "x" in flags:
+ mode = "x"
+ if p4type.group(2) == "symlink":
+ mode = "l"
+ if "ko" in flags:
+ keywords = self.re_keywords_old
+ elif "k" in flags:
+ keywords = self.re_keywords
+
+ elif code == "text" or code == "binary":
+ contents += data
+
+ if mode is None:
+ raise IOError(0, "bad stat")
+
+ if keywords:
+ contents = keywords.sub("$\\1$", contents)
+ if mode == "l" and contents.endswith("\n"):
+ contents = contents[:-1]
+
+ return contents, mode
+
+ def getchanges(self, rev):
+ return self.files[rev], {}
+
+ def getcommit(self, rev):
+ return self.changeset[rev]
+
+ def gettags(self):
+ return self.tags
+
+ def getchangedfiles(self, rev, i):
+ return sorted([x[0] for x in self.files[rev]])
diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py
new file mode 100644
index 0000000..094988b
--- /dev/null
+++ b/hgext/convert/subversion.py
@@ -0,0 +1,1251 @@
+# Subversion 1.4/1.5 Python API backend
+#
+# Copyright(C) 2007 Daniel Holth et al
+
+import os, re, sys, tempfile, urllib, urllib2, xml.dom.minidom
+import cPickle as pickle
+
+from mercurial import strutil, scmutil, util, encoding
+from mercurial.i18n import _
+
+propertycache = util.propertycache
+
+# Subversion stuff. Works best with very recent Python SVN bindings
+# e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing
+# these bindings.
+
+from cStringIO import StringIO
+
+from common import NoRepo, MissingTool, commit, encodeargs, decodeargs
+from common import commandline, converter_source, converter_sink, mapfile
+
+try:
+ from svn.core import SubversionException, Pool
+ import svn
+ import svn.client
+ import svn.core
+ import svn.ra
+ import svn.delta
+ import transport
+ import warnings
+ warnings.filterwarnings('ignore',
+ module='svn.core',
+ category=DeprecationWarning)
+
+except ImportError:
+ svn = None
+
+class SvnPathNotFound(Exception):
+ pass
+
+def revsplit(rev):
+ """Parse a revision string and return (uuid, path, revnum)."""
+ url, revnum = rev.rsplit('@', 1)
+ parts = url.split('/', 1)
+ mod = ''
+ if len(parts) > 1:
+ mod = '/' + parts[1]
+ return parts[0][4:], mod, int(revnum)
+
+def quote(s):
+ # As of svn 1.7, many svn calls expect "canonical" paths. In
+ # theory, we should call svn.core.*canonicalize() on all paths
+ # before passing them to the API. Instead, we assume the base url
+ # is canonical and copy the behaviour of svn URL encoding function
+ # so we can extend it safely with new components. The "safe"
+ # characters were taken from the "svn_uri__char_validity" table in
+ # libsvn_subr/path.c.
+ return urllib.quote(s, "!$&'()*+,-./:=@_~")
+
+def geturl(path):
+ try:
+ return svn.client.url_from_path(svn.core.svn_path_canonicalize(path))
+ except SubversionException:
+ # svn.client.url_from_path() fails with local repositories
+ pass
+ if os.path.isdir(path):
+ path = os.path.normpath(os.path.abspath(path))
+ if os.name == 'nt':
+ path = '/' + util.normpath(path)
+ # Module URL is later compared with the repository URL returned
+ # by svn API, which is UTF-8.
+ path = encoding.tolocal(path)
+ path = 'file://%s' % quote(path)
+ return svn.core.svn_path_canonicalize(path)
+
+def optrev(number):
+ optrev = svn.core.svn_opt_revision_t()
+ optrev.kind = svn.core.svn_opt_revision_number
+ optrev.value.number = number
+ return optrev
+
+class changedpath(object):
+ def __init__(self, p):
+ self.copyfrom_path = p.copyfrom_path
+ self.copyfrom_rev = p.copyfrom_rev
+ self.action = p.action
+
+def get_log_child(fp, url, paths, start, end, limit=0,
+ discover_changed_paths=True, strict_node_history=False):
+ protocol = -1
+ def receiver(orig_paths, revnum, author, date, message, pool):
+ if orig_paths is not None:
+ for k, v in orig_paths.iteritems():
+ orig_paths[k] = changedpath(v)
+ pickle.dump((orig_paths, revnum, author, date, message),
+ fp, protocol)
+
+ try:
+ # Use an ra of our own so that our parent can consume
+ # our results without confusing the server.
+ t = transport.SvnRaTransport(url=url)
+ svn.ra.get_log(t.ra, paths, start, end, limit,
+ discover_changed_paths,
+ strict_node_history,
+ receiver)
+ except IOError:
+ # Caller may interrupt the iteration
+ pickle.dump(None, fp, protocol)
+ except Exception, inst:
+ pickle.dump(str(inst), fp, protocol)
+ else:
+ pickle.dump(None, fp, protocol)
+ fp.close()
+ # With large history, cleanup process goes crazy and suddenly
+ # consumes *huge* amount of memory. The output file being closed,
+ # there is no need for clean termination.
+ os._exit(0)
+
+def debugsvnlog(ui, **opts):
+ """Fetch SVN log in a subprocess and channel them back to parent to
+ avoid memory collection issues.
+ """
+ if svn is None:
+ raise util.Abort(_('debugsvnlog could not load Subversion python '
+ 'bindings'))
+
+ util.setbinary(sys.stdin)
+ util.setbinary(sys.stdout)
+ args = decodeargs(sys.stdin.read())
+ get_log_child(sys.stdout, *args)
+
+class logstream(object):
+ """Interruptible revision log iterator."""
+ def __init__(self, stdout):
+ self._stdout = stdout
+
+ def __iter__(self):
+ while True:
+ try:
+ entry = pickle.load(self._stdout)
+ except EOFError:
+ raise util.Abort(_('Mercurial failed to run itself, check'
+ ' hg executable is in PATH'))
+ try:
+ orig_paths, revnum, author, date, message = entry
+ except (TypeError, ValueError):
+ if entry is None:
+ break
+ raise util.Abort(_("log stream exception '%s'") % entry)
+ yield entry
+
+ def close(self):
+ if self._stdout:
+ self._stdout.close()
+ self._stdout = None
+
+
+# Check to see if the given path is a local Subversion repo. Verify this by
+# looking for several svn-specific files and directories in the given
+# directory.
+def filecheck(ui, path, proto):
+ for x in ('locks', 'hooks', 'format', 'db'):
+ if not os.path.exists(os.path.join(path, x)):
+ return False
+ return True
+
+# Check to see if a given path is the root of an svn repo over http. We verify
+# this by requesting a version-controlled URL we know can't exist and looking
+# for the svn-specific "not found" XML.
+def httpcheck(ui, path, proto):
+ try:
+ opener = urllib2.build_opener()
+ rsp = opener.open('%s://%s/!svn/ver/0/.svn' % (proto, path))
+ data = rsp.read()
+ except urllib2.HTTPError, inst:
+ if inst.code != 404:
+ # Except for 404 we cannot know for sure this is not an svn repo
+ ui.warn(_('svn: cannot probe remote repository, assume it could '
+ 'be a subversion repository. Use --source-type if you '
+ 'know better.\n'))
+ return True
+ data = inst.fp.read()
+ except Exception:
+ # Could be urllib2.URLError if the URL is invalid or anything else.
+ return False
+ return '<m:human-readable errcode="160013">' in data
+
+protomap = {'http': httpcheck,
+ 'https': httpcheck,
+ 'file': filecheck,
+ }
+def issvnurl(ui, url):
+ try:
+ proto, path = url.split('://', 1)
+ if proto == 'file':
+ if (os.name == 'nt' and path[:1] == '/' and path[1:2].isalpha()
+ and path[2:6].lower() == '%3a/'):
+ path = path[:2] + ':/' + path[6:]
+ path = urllib.url2pathname(path)
+ except ValueError:
+ proto = 'file'
+ path = os.path.abspath(url)
+ if proto == 'file':
+ path = util.pconvert(path)
+ check = protomap.get(proto, lambda *args: False)
+ while '/' in path:
+ if check(ui, path, proto):
+ return True
+ path = path.rsplit('/', 1)[0]
+ return False
+
+# SVN conversion code stolen from bzr-svn and tailor
+#
+# Subversion looks like a versioned filesystem, branches structures
+# are defined by conventions and not enforced by the tool. First,
+# we define the potential branches (modules) as "trunk" and "branches"
+# children directories. Revisions are then identified by their
+# module and revision number (and a repository identifier).
+#
+# The revision graph is really a tree (or a forest). By default, a
+# revision parent is the previous revision in the same module. If the
+# module directory is copied/moved from another module then the
+# revision is the module root and its parent the source revision in
+# the parent module. A revision has at most one parent.
+#
+class svn_source(converter_source):
+ def __init__(self, ui, url, rev=None):
+ super(svn_source, self).__init__(ui, url, rev=rev)
+
+ if not (url.startswith('svn://') or url.startswith('svn+ssh://') or
+ (os.path.exists(url) and
+ os.path.exists(os.path.join(url, '.svn'))) or
+ issvnurl(ui, url)):
+ raise NoRepo(_("%s does not look like a Subversion repository")
+ % url)
+ if svn is None:
+ raise MissingTool(_('could not load Subversion python bindings'))
+
+ try:
+ version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
+ if version < (1, 4):
+ raise MissingTool(_('Subversion python bindings %d.%d found, '
+ '1.4 or later required') % version)
+ except AttributeError:
+ raise MissingTool(_('Subversion python bindings are too old, 1.4 '
+ 'or later required'))
+
+ self.lastrevs = {}
+
+ latest = None
+ try:
+ # Support file://path@rev syntax. Useful e.g. to convert
+ # deleted branches.
+ at = url.rfind('@')
+ if at >= 0:
+ latest = int(url[at + 1:])
+ url = url[:at]
+ except ValueError:
+ pass
+ self.url = geturl(url)
+ self.encoding = 'UTF-8' # Subversion is always nominal UTF-8
+ try:
+ self.transport = transport.SvnRaTransport(url=self.url)
+ self.ra = self.transport.ra
+ self.ctx = self.transport.client
+ self.baseurl = svn.ra.get_repos_root(self.ra)
+ # Module is either empty or a repository path starting with
+ # a slash and not ending with a slash.
+ self.module = urllib.unquote(self.url[len(self.baseurl):])
+ self.prevmodule = None
+ self.rootmodule = self.module
+ self.commits = {}
+ self.paths = {}
+ self.uuid = svn.ra.get_uuid(self.ra)
+ except SubversionException:
+ ui.traceback()
+ raise NoRepo(_("%s does not look like a Subversion repository")
+ % self.url)
+
+ if rev:
+ try:
+ latest = int(rev)
+ except ValueError:
+ raise util.Abort(_('svn: revision %s is not an integer') % rev)
+
+ self.trunkname = self.ui.config('convert', 'svn.trunk',
+ 'trunk').strip('/')
+ self.startrev = self.ui.config('convert', 'svn.startrev', default=0)
+ try:
+ self.startrev = int(self.startrev)
+ if self.startrev < 0:
+ self.startrev = 0
+ except ValueError:
+ raise util.Abort(_('svn: start revision %s is not an integer')
+ % self.startrev)
+
+ try:
+ self.head = self.latest(self.module, latest)
+ except SvnPathNotFound:
+ self.head = None
+ if not self.head:
+ raise util.Abort(_('no revision found in module %s')
+ % self.module)
+ self.last_changed = self.revnum(self.head)
+
+ self._changescache = None
+
+ if os.path.exists(os.path.join(url, '.svn/entries')):
+ self.wc = url
+ else:
+ self.wc = None
+ self.convertfp = None
+
+ def setrevmap(self, revmap):
+ lastrevs = {}
+ for revid in revmap.iterkeys():
+ uuid, module, revnum = revsplit(revid)
+ lastrevnum = lastrevs.setdefault(module, revnum)
+ if revnum > lastrevnum:
+ lastrevs[module] = revnum
+ self.lastrevs = lastrevs
+
+ def exists(self, path, optrev):
+ try:
+ svn.client.ls(self.url.rstrip('/') + '/' + quote(path),
+ optrev, False, self.ctx)
+ return True
+ except SubversionException:
+ return False
+
+ def getheads(self):
+
+ def isdir(path, revnum):
+ kind = self._checkpath(path, revnum)
+ return kind == svn.core.svn_node_dir
+
+ def getcfgpath(name, rev):
+ cfgpath = self.ui.config('convert', 'svn.' + name)
+ if cfgpath is not None and cfgpath.strip() == '':
+ return None
+ path = (cfgpath or name).strip('/')
+ if not self.exists(path, rev):
+ if self.module.endswith(path) and name == 'trunk':
+ # we are converting from inside this directory
+ return None
+ if cfgpath:
+ raise util.Abort(_('expected %s to be at %r, but not found')
+ % (name, path))
+ return None
+ self.ui.note(_('found %s at %r\n') % (name, path))
+ return path
+
+ rev = optrev(self.last_changed)
+ oldmodule = ''
+ trunk = getcfgpath('trunk', rev)
+ self.tags = getcfgpath('tags', rev)
+ branches = getcfgpath('branches', rev)
+
+ # If the project has a trunk or branches, we will extract heads
+ # from them. We keep the project root otherwise.
+ if trunk:
+ oldmodule = self.module or ''
+ self.module += '/' + trunk
+ self.head = self.latest(self.module, self.last_changed)
+ if not self.head:
+ raise util.Abort(_('no revision found in module %s')
+ % self.module)
+
+ # First head in the list is the module's head
+ self.heads = [self.head]
+ if self.tags is not None:
+ self.tags = '%s/%s' % (oldmodule , (self.tags or 'tags'))
+
+ # Check if branches bring a few more heads to the list
+ if branches:
+ rpath = self.url.strip('/')
+ branchnames = svn.client.ls(rpath + '/' + quote(branches),
+ rev, False, self.ctx)
+ for branch in branchnames.keys():
+ module = '%s/%s/%s' % (oldmodule, branches, branch)
+ if not isdir(module, self.last_changed):
+ continue
+ brevid = self.latest(module, self.last_changed)
+ if not brevid:
+ self.ui.note(_('ignoring empty branch %s\n') % branch)
+ continue
+ self.ui.note(_('found branch %s at %d\n') %
+ (branch, self.revnum(brevid)))
+ self.heads.append(brevid)
+
+ if self.startrev and self.heads:
+ if len(self.heads) > 1:
+ raise util.Abort(_('svn: start revision is not supported '
+ 'with more than one branch'))
+ revnum = self.revnum(self.heads[0])
+ if revnum < self.startrev:
+ raise util.Abort(
+ _('svn: no revision found after start revision %d')
+ % self.startrev)
+
+ return self.heads
+
+ def getchanges(self, rev):
+ if self._changescache and self._changescache[0] == rev:
+ return self._changescache[1]
+ self._changescache = None
+ (paths, parents) = self.paths[rev]
+ if parents:
+ files, self.removed, copies = self.expandpaths(rev, paths, parents)
+ else:
+ # Perform a full checkout on roots
+ uuid, module, revnum = revsplit(rev)
+ entries = svn.client.ls(self.baseurl + quote(module),
+ optrev(revnum), True, self.ctx)
+ files = [n for n, e in entries.iteritems()
+ if e.kind == svn.core.svn_node_file]
+ copies = {}
+ self.removed = set()
+
+ files.sort()
+ files = zip(files, [rev] * len(files))
+
+ # caller caches the result, so free it here to release memory
+ del self.paths[rev]
+ return (files, copies)
+
+ def getchangedfiles(self, rev, i):
+ changes = self.getchanges(rev)
+ self._changescache = (rev, changes)
+ return [f[0] for f in changes[0]]
+
+ def getcommit(self, rev):
+ if rev not in self.commits:
+ uuid, module, revnum = revsplit(rev)
+ self.module = module
+ self.reparent(module)
+ # We assume that:
+ # - requests for revisions after "stop" come from the
+ # revision graph backward traversal. Cache all of them
+ # down to stop, they will be used eventually.
+ # - requests for revisions before "stop" come to get
+ # isolated branches parents. Just fetch what is needed.
+ stop = self.lastrevs.get(module, 0)
+ if revnum < stop:
+ stop = revnum + 1
+ self._fetch_revisions(revnum, stop)
+ if rev not in self.commits:
+ raise util.Abort(_('svn: revision %s not found') % revnum)
+ commit = self.commits[rev]
+ # caller caches the result, so free it here to release memory
+ del self.commits[rev]
+ return commit
+
+ def gettags(self):
+ tags = {}
+ if self.tags is None:
+ return tags
+
+ # svn tags are just a convention, project branches left in a
+ # 'tags' directory. There is no other relationship than
+ # ancestry, which is expensive to discover and makes them hard
+ # to update incrementally. Worse, past revisions may be
+ # referenced by tags far away in the future, requiring a deep
+ # history traversal on every calculation. Current code
+ # performs a single backward traversal, tracking moves within
+ # the tags directory (tag renaming) and recording a new tag
+ # everytime a project is copied from outside the tags
+ # directory. It also lists deleted tags, this behaviour may
+ # change in the future.
+ pendings = []
+ tagspath = self.tags
+ start = svn.ra.get_latest_revnum(self.ra)
+ stream = self._getlog([self.tags], start, self.startrev)
+ try:
+ for entry in stream:
+ origpaths, revnum, author, date, message = entry
+ copies = [(e.copyfrom_path, e.copyfrom_rev, p) for p, e
+ in origpaths.iteritems() if e.copyfrom_path]
+ # Apply moves/copies from more specific to general
+ copies.sort(reverse=True)
+
+ srctagspath = tagspath
+ if copies and copies[-1][2] == tagspath:
+ # Track tags directory moves
+ srctagspath = copies.pop()[0]
+
+ for source, sourcerev, dest in copies:
+ if not dest.startswith(tagspath + '/'):
+ continue
+ for tag in pendings:
+ if tag[0].startswith(dest):
+ tagpath = source + tag[0][len(dest):]
+ tag[:2] = [tagpath, sourcerev]
+ break
+ else:
+ pendings.append([source, sourcerev, dest])
+
+ # Filter out tags with children coming from different
+ # parts of the repository like:
+ # /tags/tag.1 (from /trunk:10)
+ # /tags/tag.1/foo (from /branches/foo:12)
+ # Here/tags/tag.1 discarded as well as its children.
+ # It happens with tools like cvs2svn. Such tags cannot
+ # be represented in mercurial.
+ addeds = dict((p, e.copyfrom_path) for p, e
+ in origpaths.iteritems()
+ if e.action == 'A' and e.copyfrom_path)
+ badroots = set()
+ for destroot in addeds:
+ for source, sourcerev, dest in pendings:
+ if (not dest.startswith(destroot + '/')
+ or source.startswith(addeds[destroot] + '/')):
+ continue
+ badroots.add(destroot)
+ break
+
+ for badroot in badroots:
+ pendings = [p for p in pendings if p[2] != badroot
+ and not p[2].startswith(badroot + '/')]
+
+ # Tell tag renamings from tag creations
+ renamings = []
+ for source, sourcerev, dest in pendings:
+ tagname = dest.split('/')[-1]
+ if source.startswith(srctagspath):
+ renamings.append([source, sourcerev, tagname])
+ continue
+ if tagname in tags:
+ # Keep the latest tag value
+ continue
+ # From revision may be fake, get one with changes
+ try:
+ tagid = self.latest(source, sourcerev)
+ if tagid and tagname not in tags:
+ tags[tagname] = tagid
+ except SvnPathNotFound:
+ # It happens when we are following directories
+ # we assumed were copied with their parents
+ # but were really created in the tag
+ # directory.
+ pass
+ pendings = renamings
+ tagspath = srctagspath
+ finally:
+ stream.close()
+ return tags
+
+ def converted(self, rev, destrev):
+ if not self.wc:
+ return
+ if self.convertfp is None:
+ self.convertfp = open(os.path.join(self.wc, '.svn', 'hg-shamap'),
+ 'a')
+ self.convertfp.write('%s %d\n' % (destrev, self.revnum(rev)))
+ self.convertfp.flush()
+
+ def revid(self, revnum, module=None):
+ return 'svn:%s%s@%s' % (self.uuid, module or self.module, revnum)
+
+ def revnum(self, rev):
+ return int(rev.split('@')[-1])
+
+ def latest(self, path, stop=None):
+ """Find the latest revid affecting path, up to stop revision
+ number. If stop is None, default to repository latest
+ revision. It may return a revision in a different module,
+ since a branch may be moved without a change being
+ reported. Return None if computed module does not belong to
+ rootmodule subtree.
+ """
+ def findchanges(path, start, stop=None):
+ stream = self._getlog([path], start, stop or 1)
+ try:
+ for entry in stream:
+ paths, revnum, author, date, message = entry
+ if stop is None and paths:
+ # We do not know the latest changed revision,
+ # keep the first one with changed paths.
+ break
+ if revnum <= stop:
+ break
+
+ for p in paths:
+ if (not path.startswith(p) or
+ not paths[p].copyfrom_path):
+ continue
+ newpath = paths[p].copyfrom_path + path[len(p):]
+ self.ui.debug("branch renamed from %s to %s at %d\n" %
+ (path, newpath, revnum))
+ path = newpath
+ break
+ if not paths:
+ revnum = None
+ return revnum, path
+ finally:
+ stream.close()
+
+ if not path.startswith(self.rootmodule):
+ # Requests on foreign branches may be forbidden at server level
+ self.ui.debug('ignoring foreign branch %r\n' % path)
+ return None
+
+ if stop is None:
+ stop = svn.ra.get_latest_revnum(self.ra)
+ try:
+ prevmodule = self.reparent('')
+ dirent = svn.ra.stat(self.ra, path.strip('/'), stop)
+ self.reparent(prevmodule)
+ except SubversionException:
+ dirent = None
+ if not dirent:
+ raise SvnPathNotFound(_('%s not found up to revision %d')
+ % (path, stop))
+
+ # stat() gives us the previous revision on this line of
+ # development, but it might be in *another module*. Fetch the
+ # log and detect renames down to the latest revision.
+ revnum, realpath = findchanges(path, stop, dirent.created_rev)
+ if revnum is None:
+ # Tools like svnsync can create empty revision, when
+ # synchronizing only a subtree for instance. These empty
+ # revisions created_rev still have their original values
+ # despite all changes having disappeared and can be
+ # returned by ra.stat(), at least when stating the root
+ # module. In that case, do not trust created_rev and scan
+ # the whole history.
+ revnum, realpath = findchanges(path, stop)
+ if revnum is None:
+ self.ui.debug('ignoring empty branch %r\n' % realpath)
+ return None
+
+ if not realpath.startswith(self.rootmodule):
+ self.ui.debug('ignoring foreign branch %r\n' % realpath)
+ return None
+ return self.revid(revnum, realpath)
+
+ def reparent(self, module):
+ """Reparent the svn transport and return the previous parent."""
+ if self.prevmodule == module:
+ return module
+ svnurl = self.baseurl + quote(module)
+ prevmodule = self.prevmodule
+ if prevmodule is None:
+ prevmodule = ''
+ self.ui.debug("reparent to %s\n" % svnurl)
+ svn.ra.reparent(self.ra, svnurl)
+ self.prevmodule = module
+ return prevmodule
+
+ def expandpaths(self, rev, paths, parents):
+ changed, removed = set(), set()
+ copies = {}
+
+ new_module, revnum = revsplit(rev)[1:]
+ if new_module != self.module:
+ self.module = new_module
+ self.reparent(self.module)
+
+ for i, (path, ent) in enumerate(paths):
+ self.ui.progress(_('scanning paths'), i, item=path,
+ total=len(paths))
+ entrypath = self.getrelpath(path)
+
+ kind = self._checkpath(entrypath, revnum)
+ if kind == svn.core.svn_node_file:
+ changed.add(self.recode(entrypath))
+ if not ent.copyfrom_path or not parents:
+ continue
+ # Copy sources not in parent revisions cannot be
+ # represented, ignore their origin for now
+ pmodule, prevnum = revsplit(parents[0])[1:]
+ if ent.copyfrom_rev < prevnum:
+ continue
+ copyfrom_path = self.getrelpath(ent.copyfrom_path, pmodule)
+ if not copyfrom_path:
+ continue
+ self.ui.debug("copied to %s from %s@%s\n" %
+ (entrypath, copyfrom_path, ent.copyfrom_rev))
+ copies[self.recode(entrypath)] = self.recode(copyfrom_path)
+ elif kind == 0: # gone, but had better be a deleted *file*
+ self.ui.debug("gone from %s\n" % ent.copyfrom_rev)
+ pmodule, prevnum = revsplit(parents[0])[1:]
+ parentpath = pmodule + "/" + entrypath
+ fromkind = self._checkpath(entrypath, prevnum, pmodule)
+
+ if fromkind == svn.core.svn_node_file:
+ removed.add(self.recode(entrypath))
+ elif fromkind == svn.core.svn_node_dir:
+ oroot = parentpath.strip('/')
+ nroot = path.strip('/')
+ children = self._iterfiles(oroot, prevnum)
+ for childpath in children:
+ childpath = childpath.replace(oroot, nroot)
+ childpath = self.getrelpath("/" + childpath, pmodule)
+ if childpath:
+ removed.add(self.recode(childpath))
+ else:
+ self.ui.debug('unknown path in revision %d: %s\n' % \
+ (revnum, path))
+ elif kind == svn.core.svn_node_dir:
+ if ent.action == 'M':
+ # If the directory just had a prop change,
+ # then we shouldn't need to look for its children.
+ continue
+ if ent.action == 'R' and parents:
+ # If a directory is replacing a file, mark the previous
+ # file as deleted
+ pmodule, prevnum = revsplit(parents[0])[1:]
+ pkind = self._checkpath(entrypath, prevnum, pmodule)
+ if pkind == svn.core.svn_node_file:
+ removed.add(self.recode(entrypath))
+ elif pkind == svn.core.svn_node_dir:
+ # We do not know what files were kept or removed,
+ # mark them all as changed.
+ for childpath in self._iterfiles(pmodule, prevnum):
+ childpath = self.getrelpath("/" + childpath)
+ if childpath:
+ changed.add(self.recode(childpath))
+
+ for childpath in self._iterfiles(path, revnum):
+ childpath = self.getrelpath("/" + childpath)
+ if childpath:
+ changed.add(self.recode(childpath))
+
+ # Handle directory copies
+ if not ent.copyfrom_path or not parents:
+ continue
+ # Copy sources not in parent revisions cannot be
+ # represented, ignore their origin for now
+ pmodule, prevnum = revsplit(parents[0])[1:]
+ if ent.copyfrom_rev < prevnum:
+ continue
+ copyfrompath = self.getrelpath(ent.copyfrom_path, pmodule)
+ if not copyfrompath:
+ continue
+ self.ui.debug("mark %s came from %s:%d\n"
+ % (path, copyfrompath, ent.copyfrom_rev))
+ children = self._iterfiles(ent.copyfrom_path, ent.copyfrom_rev)
+ for childpath in children:
+ childpath = self.getrelpath("/" + childpath, pmodule)
+ if not childpath:
+ continue
+ copytopath = path + childpath[len(copyfrompath):]
+ copytopath = self.getrelpath(copytopath)
+ copies[self.recode(copytopath)] = self.recode(childpath)
+
+ self.ui.progress(_('scanning paths'), None)
+ changed.update(removed)
+ return (list(changed), removed, copies)
+
+ def _fetch_revisions(self, from_revnum, to_revnum):
+ if from_revnum < to_revnum:
+ from_revnum, to_revnum = to_revnum, from_revnum
+
+ self.child_cset = None
+
+ def parselogentry(orig_paths, revnum, author, date, message):
+ """Return the parsed commit object or None, and True if
+ the revision is a branch root.
+ """
+ self.ui.debug("parsing revision %d (%d changes)\n" %
+ (revnum, len(orig_paths)))
+
+ branched = False
+ rev = self.revid(revnum)
+ # branch log might return entries for a parent we already have
+
+ if rev in self.commits or revnum < to_revnum:
+ return None, branched
+
+ parents = []
+ # check whether this revision is the start of a branch or part
+ # of a branch renaming
+ orig_paths = sorted(orig_paths.iteritems())
+ root_paths = [(p, e) for p, e in orig_paths
+ if self.module.startswith(p)]
+ if root_paths:
+ path, ent = root_paths[-1]
+ if ent.copyfrom_path:
+ branched = True
+ newpath = ent.copyfrom_path + self.module[len(path):]
+ # ent.copyfrom_rev may not be the actual last revision
+ previd = self.latest(newpath, ent.copyfrom_rev)
+ if previd is not None:
+ prevmodule, prevnum = revsplit(previd)[1:]
+ if prevnum >= self.startrev:
+ parents = [previd]
+ self.ui.note(
+ _('found parent of branch %s at %d: %s\n') %
+ (self.module, prevnum, prevmodule))
+ else:
+ self.ui.debug("no copyfrom path, don't know what to do.\n")
+
+ paths = []
+ # filter out unrelated paths
+ for path, ent in orig_paths:
+ if self.getrelpath(path) is None:
+ continue
+ paths.append((path, ent))
+
+ # Example SVN datetime. Includes microseconds.
+ # ISO-8601 conformant
+ # '2007-01-04T17:35:00.902377Z'
+ date = util.parsedate(date[:19] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
+
+ log = message and self.recode(message) or ''
+ author = author and self.recode(author) or ''
+ try:
+ branch = self.module.split("/")[-1]
+ if branch == self.trunkname:
+ branch = None
+ except IndexError:
+ branch = None
+
+ cset = commit(author=author,
+ date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
+ desc=log,
+ parents=parents,
+ branch=branch,
+ rev=rev)
+
+ self.commits[rev] = cset
+ # The parents list is *shared* among self.paths and the
+ # commit object. Both will be updated below.
+ self.paths[rev] = (paths, cset.parents)
+ if self.child_cset and not self.child_cset.parents:
+ self.child_cset.parents[:] = [rev]
+ self.child_cset = cset
+ return cset, branched
+
+ self.ui.note(_('fetching revision log for "%s" from %d to %d\n') %
+ (self.module, from_revnum, to_revnum))
+
+ try:
+ firstcset = None
+ lastonbranch = False
+ stream = self._getlog([self.module], from_revnum, to_revnum)
+ try:
+ for entry in stream:
+ paths, revnum, author, date, message = entry
+ if revnum < self.startrev:
+ lastonbranch = True
+ break
+ if not paths:
+ self.ui.debug('revision %d has no entries\n' % revnum)
+ # If we ever leave the loop on an empty
+ # revision, do not try to get a parent branch
+ lastonbranch = lastonbranch or revnum == 0
+ continue
+ cset, lastonbranch = parselogentry(paths, revnum, author,
+ date, message)
+ if cset:
+ firstcset = cset
+ if lastonbranch:
+ break
+ finally:
+ stream.close()
+
+ if not lastonbranch and firstcset and not firstcset.parents:
+ # The first revision of the sequence (the last fetched one)
+ # has invalid parents if not a branch root. Find the parent
+ # revision now, if any.
+ try:
+ firstrevnum = self.revnum(firstcset.rev)
+ if firstrevnum > 1:
+ latest = self.latest(self.module, firstrevnum - 1)
+ if latest:
+ firstcset.parents.append(latest)
+ except SvnPathNotFound:
+ pass
+ except SubversionException, (inst, num):
+ if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
+ raise util.Abort(_('svn: branch has no revision %s')
+ % to_revnum)
+ raise
+
+ def getfile(self, file, rev):
+ # TODO: ra.get_file transmits the whole file instead of diffs.
+ if file in self.removed:
+ raise IOError
+ mode = ''
+ try:
+ new_module, revnum = revsplit(rev)[1:]
+ if self.module != new_module:
+ self.module = new_module
+ self.reparent(self.module)
+ io = StringIO()
+ info = svn.ra.get_file(self.ra, file, revnum, io)
+ data = io.getvalue()
+ # ra.get_files() seems to keep a reference on the input buffer
+ # preventing collection. Release it explicitely.
+ io.close()
+ if isinstance(info, list):
+ info = info[-1]
+ mode = ("svn:executable" in info) and 'x' or ''
+ mode = ("svn:special" in info) and 'l' or mode
+ except SubversionException, e:
+ notfound = (svn.core.SVN_ERR_FS_NOT_FOUND,
+ svn.core.SVN_ERR_RA_DAV_PATH_NOT_FOUND)
+ if e.apr_err in notfound: # File not found
+ raise IOError
+ raise
+ if mode == 'l':
+ link_prefix = "link "
+ if data.startswith(link_prefix):
+ data = data[len(link_prefix):]
+ return data, mode
+
+ def _iterfiles(self, path, revnum):
+ """Enumerate all files in path at revnum, recursively."""
+ path = path.strip('/')
+ pool = Pool()
+ rpath = '/'.join([self.baseurl, quote(path)]).strip('/')
+ entries = svn.client.ls(rpath, optrev(revnum), True, self.ctx, pool)
+ if path:
+ path += '/'
+ return ((path + p) for p, e in entries.iteritems()
+ if e.kind == svn.core.svn_node_file)
+
+ def getrelpath(self, path, module=None):
+ if module is None:
+ module = self.module
+ # Given the repository url of this wc, say
+ # "http://server/plone/CMFPlone/branches/Plone-2_0-branch"
+ # extract the "entry" portion (a relative path) from what
+ # svn log --xml says, ie
+ # "/CMFPlone/branches/Plone-2_0-branch/tests/PloneTestCase.py"
+ # that is to say "tests/PloneTestCase.py"
+ if path.startswith(module):
+ relative = path.rstrip('/')[len(module):]
+ if relative.startswith('/'):
+ return relative[1:]
+ elif relative == '':
+ return relative
+
+ # The path is outside our tracked tree...
+ self.ui.debug('%r is not under %r, ignoring\n' % (path, module))
+ return None
+
+ def _checkpath(self, path, revnum, module=None):
+ if module is not None:
+ prevmodule = self.reparent('')
+ path = module + '/' + path
+ try:
+ # ra.check_path does not like leading slashes very much, it leads
+ # to PROPFIND subversion errors
+ return svn.ra.check_path(self.ra, path.strip('/'), revnum)
+ finally:
+ if module is not None:
+ self.reparent(prevmodule)
+
+ def _getlog(self, paths, start, end, limit=0, discover_changed_paths=True,
+ strict_node_history=False):
+ # Normalize path names, svn >= 1.5 only wants paths relative to
+ # supplied URL
+ relpaths = []
+ for p in paths:
+ if not p.startswith('/'):
+ p = self.module + '/' + p
+ relpaths.append(p.strip('/'))
+ args = [self.baseurl, relpaths, start, end, limit,
+ discover_changed_paths, strict_node_history]
+ arg = encodeargs(args)
+ hgexe = util.hgexecutable()
+ cmd = '%s debugsvnlog' % util.shellquote(hgexe)
+ stdin, stdout = util.popen2(util.quotecommand(cmd))
+ stdin.write(arg)
+ try:
+ stdin.close()
+ except IOError:
+ raise util.Abort(_('Mercurial failed to run itself, check'
+ ' hg executable is in PATH'))
+ return logstream(stdout)
+
+pre_revprop_change = '''#!/bin/sh
+
+REPOS="$1"
+REV="$2"
+USER="$3"
+PROPNAME="$4"
+ACTION="$5"
+
+if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
+if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
+if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
+
+echo "Changing prohibited revision property" >&2
+exit 1
+'''
+
+class svn_sink(converter_sink, commandline):
+ commit_re = re.compile(r'Committed revision (\d+).', re.M)
+ uuid_re = re.compile(r'Repository UUID:\s*(\S+)', re.M)
+
+ def prerun(self):
+ if self.wc:
+ os.chdir(self.wc)
+
+ def postrun(self):
+ if self.wc:
+ os.chdir(self.cwd)
+
+ def join(self, name):
+ return os.path.join(self.wc, '.svn', name)
+
+ def revmapfile(self):
+ return self.join('hg-shamap')
+
+ def authorfile(self):
+ return self.join('hg-authormap')
+
+ def __init__(self, ui, path):
+
+ converter_sink.__init__(self, ui, path)
+ commandline.__init__(self, ui, 'svn')
+ self.delete = []
+ self.setexec = []
+ self.delexec = []
+ self.copies = []
+ self.wc = None
+ self.cwd = os.getcwd()
+
+ created = False
+ if os.path.isfile(os.path.join(path, '.svn', 'entries')):
+ self.wc = os.path.realpath(path)
+ self.run0('update')
+ else:
+ if not re.search(r'^(file|http|https|svn|svn\+ssh)\://', path):
+ path = os.path.realpath(path)
+ if os.path.isdir(os.path.dirname(path)):
+ if not os.path.exists(os.path.join(path, 'db', 'fs-type')):
+ ui.status(_('initializing svn repository %r\n') %
+ os.path.basename(path))
+ commandline(ui, 'svnadmin').run0('create', path)
+ created = path
+ path = util.normpath(path)
+ if not path.startswith('/'):
+ path = '/' + path
+ path = 'file://' + path
+
+ wcpath = os.path.join(os.getcwd(), os.path.basename(path) + '-wc')
+ ui.status(_('initializing svn working copy %r\n')
+ % os.path.basename(wcpath))
+ self.run0('checkout', path, wcpath)
+
+ self.wc = wcpath
+ self.opener = scmutil.opener(self.wc)
+ self.wopener = scmutil.opener(self.wc)
+ self.childmap = mapfile(ui, self.join('hg-childmap'))
+ self.is_exec = util.checkexec(self.wc) and util.isexec or None
+
+ if created:
+ hook = os.path.join(created, 'hooks', 'pre-revprop-change')
+ fp = open(hook, 'w')
+ fp.write(pre_revprop_change)
+ fp.close()
+ util.setflags(hook, False, True)
+
+ output = self.run0('info')
+ self.uuid = self.uuid_re.search(output).group(1).strip()
+
+ def wjoin(self, *names):
+ return os.path.join(self.wc, *names)
+
+ @propertycache
+ def manifest(self):
+ # As of svn 1.7, the "add" command fails when receiving
+ # already tracked entries, so we have to track and filter them
+ # ourselves.
+ m = set()
+ output = self.run0('ls', recursive=True, xml=True)
+ doc = xml.dom.minidom.parseString(output)
+ for e in doc.getElementsByTagName('entry'):
+ for n in e.childNodes:
+ if n.nodeType != n.ELEMENT_NODE or n.tagName != 'name':
+ continue
+ name = ''.join(c.data for c in n.childNodes
+ if c.nodeType == c.TEXT_NODE)
+ # Entries are compared with names coming from
+ # mercurial, so bytes with undefined encoding. Our
+ # best bet is to assume they are in local
+ # encoding. They will be passed to command line calls
+ # later anyway, so they better be.
+ m.add(encoding.tolocal(name.encode('utf-8')))
+ break
+ return m
+
+ def putfile(self, filename, flags, data):
+ if 'l' in flags:
+ self.wopener.symlink(data, filename)
+ else:
+ try:
+ if os.path.islink(self.wjoin(filename)):
+ os.unlink(filename)
+ except OSError:
+ pass
+ self.wopener.write(filename, data)
+
+ if self.is_exec:
+ if self.is_exec(self.wjoin(filename)):
+ if 'x' not in flags:
+ self.delexec.append(filename)
+ else:
+ if 'x' in flags:
+ self.setexec.append(filename)
+ util.setflags(self.wjoin(filename), False, 'x' in flags)
+
+ def _copyfile(self, source, dest):
+ # SVN's copy command pukes if the destination file exists, but
+ # our copyfile method expects to record a copy that has
+ # already occurred. Cross the semantic gap.
+ wdest = self.wjoin(dest)
+ exists = os.path.lexists(wdest)
+ if exists:
+ fd, tempname = tempfile.mkstemp(
+ prefix='hg-copy-', dir=os.path.dirname(wdest))
+ os.close(fd)
+ os.unlink(tempname)
+ os.rename(wdest, tempname)
+ try:
+ self.run0('copy', source, dest)
+ finally:
+ self.manifest.add(dest)
+ if exists:
+ try:
+ os.unlink(wdest)
+ except OSError:
+ pass
+ os.rename(tempname, wdest)
+
+ def dirs_of(self, files):
+ dirs = set()
+ for f in files:
+ if os.path.isdir(self.wjoin(f)):
+ dirs.add(f)
+ for i in strutil.rfindall(f, '/'):
+ dirs.add(f[:i])
+ return dirs
+
+ def add_dirs(self, files):
+ add_dirs = [d for d in sorted(self.dirs_of(files))
+ if d not in self.manifest]
+ if add_dirs:
+ self.manifest.update(add_dirs)
+ self.xargs(add_dirs, 'add', non_recursive=True, quiet=True)
+ return add_dirs
+
+ def add_files(self, files):
+ files = [f for f in files if f not in self.manifest]
+ if files:
+ self.manifest.update(files)
+ self.xargs(files, 'add', quiet=True)
+ return files
+
+ def tidy_dirs(self, names):
+ deleted = []
+ for d in sorted(self.dirs_of(names), reverse=True):
+ wd = self.wjoin(d)
+ if os.listdir(wd) == '.svn':
+ self.run0('delete', d)
+ self.manifest.remove(d)
+ deleted.append(d)
+ return deleted
+
+ def addchild(self, parent, child):
+ self.childmap[parent] = child
+
+ def revid(self, rev):
+ return u"svn:%s@%s" % (self.uuid, rev)
+
+ def putcommit(self, files, copies, parents, commit, source, revmap):
+ for parent in parents:
+ try:
+ return self.revid(self.childmap[parent])
+ except KeyError:
+ pass
+
+ # Apply changes to working copy
+ for f, v in files:
+ try:
+ data, mode = source.getfile(f, v)
+ except IOError:
+ self.delete.append(f)
+ else:
+ self.putfile(f, mode, data)
+ if f in copies:
+ self.copies.append([copies[f], f])
+ files = [f[0] for f in files]
+
+ entries = set(self.delete)
+ files = frozenset(files)
+ entries.update(self.add_dirs(files.difference(entries)))
+ if self.copies:
+ for s, d in self.copies:
+ self._copyfile(s, d)
+ self.copies = []
+ if self.delete:
+ self.xargs(self.delete, 'delete')
+ for f in self.delete:
+ self.manifest.remove(f)
+ self.delete = []
+ entries.update(self.add_files(files.difference(entries)))
+ entries.update(self.tidy_dirs(entries))
+ if self.delexec:
+ self.xargs(self.delexec, 'propdel', 'svn:executable')
+ self.delexec = []
+ if self.setexec:
+ self.xargs(self.setexec, 'propset', 'svn:executable', '*')
+ self.setexec = []
+
+ fd, messagefile = tempfile.mkstemp(prefix='hg-convert-')
+ fp = os.fdopen(fd, 'w')
+ fp.write(commit.desc)
+ fp.close()
+ try:
+ output = self.run0('commit',
+ username=util.shortuser(commit.author),
+ file=messagefile,
+ encoding='utf-8')
+ try:
+ rev = self.commit_re.search(output).group(1)
+ except AttributeError:
+ if not files:
+ return parents[0]
+ self.ui.warn(_('unexpected svn output:\n'))
+ self.ui.warn(output)
+ raise util.Abort(_('unable to cope with svn output'))
+ if commit.rev:
+ self.run('propset', 'hg:convert-rev', commit.rev,
+ revprop=True, revision=rev)
+ if commit.branch and commit.branch != 'default':
+ self.run('propset', 'hg:convert-branch', commit.branch,
+ revprop=True, revision=rev)
+ for parent in parents:
+ self.addchild(parent, rev)
+ return self.revid(rev)
+ finally:
+ os.unlink(messagefile)
+
+ def puttags(self, tags):
+ self.ui.warn(_('writing Subversion tags is not yet implemented\n'))
+ return None, None
+
+ def hascommit(self, rev):
+ # This is not correct as one can convert to an existing subversion
+ # repository and childmap would not list all revisions. Too bad.
+ if rev in self.childmap:
+ return True
+ raise util.Abort(_('splice map revision %s not found in subversion '
+ 'child map (revision lookups are not implemented)')
+ % rev)
diff --git a/hgext/convert/transport.py b/hgext/convert/transport.py
new file mode 100644
index 0000000..6a8c565
--- /dev/null
+++ b/hgext/convert/transport.py
@@ -0,0 +1,128 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2007 Daniel Holth <dholth@fastmail.fm>
+# This is a stripped-down version of the original bzr-svn transport.py,
+# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+from mercurial import util
+from svn.core import SubversionException, Pool
+import svn.ra
+import svn.client
+import svn.core
+
+# Some older versions of the Python bindings need to be
+# explicitly initialized. But what we want to do probably
+# won't work worth a darn against those libraries anyway!
+svn.ra.initialize()
+
+svn_config = svn.core.svn_config_get_config(None)
+
+
+def _create_auth_baton(pool):
+ """Create a Subversion authentication baton. """
+ import svn.client
+ # Give the client context baton a suite of authentication
+ # providers.h
+ providers = [
+ svn.client.get_simple_provider(pool),
+ svn.client.get_username_provider(pool),
+ svn.client.get_ssl_client_cert_file_provider(pool),
+ svn.client.get_ssl_client_cert_pw_file_provider(pool),
+ svn.client.get_ssl_server_trust_file_provider(pool),
+ ]
+ # Platform-dependant authentication methods
+ getprovider = getattr(svn.core, 'svn_auth_get_platform_specific_provider',
+ None)
+ if getprovider:
+ # Available in svn >= 1.6
+ for name in ('gnome_keyring', 'keychain', 'kwallet', 'windows'):
+ for type in ('simple', 'ssl_client_cert_pw', 'ssl_server_trust'):
+ p = getprovider(name, type, pool)
+ if p:
+ providers.append(p)
+ else:
+ if util.safehasattr(svn.client, 'get_windows_simple_provider'):
+ providers.append(svn.client.get_windows_simple_provider(pool))
+
+ return svn.core.svn_auth_open(providers, pool)
+
+class NotBranchError(SubversionException):
+ pass
+
+class SvnRaTransport(object):
+ """
+ Open an ra connection to a Subversion repository.
+ """
+ def __init__(self, url="", ra=None):
+ self.pool = Pool()
+ self.svn_url = url
+ self.username = ''
+ self.password = ''
+
+ # Only Subversion 1.4 has reparent()
+ if ra is None or not util.safehasattr(svn.ra, 'reparent'):
+ self.client = svn.client.create_context(self.pool)
+ ab = _create_auth_baton(self.pool)
+ if False:
+ svn.core.svn_auth_set_parameter(
+ ab, svn.core.SVN_AUTH_PARAM_DEFAULT_USERNAME, self.username)
+ svn.core.svn_auth_set_parameter(
+ ab, svn.core.SVN_AUTH_PARAM_DEFAULT_PASSWORD, self.password)
+ self.client.auth_baton = ab
+ self.client.config = svn_config
+ try:
+ self.ra = svn.client.open_ra_session(
+ self.svn_url,
+ self.client, self.pool)
+ except SubversionException, (inst, num):
+ if num in (svn.core.SVN_ERR_RA_ILLEGAL_URL,
+ svn.core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED,
+ svn.core.SVN_ERR_BAD_URL):
+ raise NotBranchError(url)
+ raise
+ else:
+ self.ra = ra
+ svn.ra.reparent(self.ra, self.svn_url.encode('utf8'))
+
+ class Reporter(object):
+ def __init__(self, reporter_data):
+ self._reporter, self._baton = reporter_data
+
+ def set_path(self, path, revnum, start_empty, lock_token, pool=None):
+ svn.ra.reporter2_invoke_set_path(self._reporter, self._baton,
+ path, revnum, start_empty, lock_token, pool)
+
+ def delete_path(self, path, pool=None):
+ svn.ra.reporter2_invoke_delete_path(self._reporter, self._baton,
+ path, pool)
+
+ def link_path(self, path, url, revision, start_empty, lock_token,
+ pool=None):
+ svn.ra.reporter2_invoke_link_path(self._reporter, self._baton,
+ path, url, revision, start_empty, lock_token,
+ pool)
+
+ def finish_report(self, pool=None):
+ svn.ra.reporter2_invoke_finish_report(self._reporter,
+ self._baton, pool)
+
+ def abort_report(self, pool=None):
+ svn.ra.reporter2_invoke_abort_report(self._reporter,
+ self._baton, pool)
+
+ def do_update(self, revnum, path, *args, **kwargs):
+ return self.Reporter(svn.ra.do_update(self.ra, revnum, path,
+ *args, **kwargs))
diff --git a/hgext/eol.py b/hgext/eol.py
new file mode 100644
index 0000000..951922c
--- /dev/null
+++ b/hgext/eol.py
@@ -0,0 +1,349 @@
+"""automatically manage newlines in repository files
+
+This extension allows you to manage the type of line endings (CRLF or
+LF) that are used in the repository and in the local working
+directory. That way you can get CRLF line endings on Windows and LF on
+Unix/Mac, thereby letting everybody use their OS native line endings.
+
+The extension reads its configuration from a versioned ``.hgeol``
+configuration file found in the root of the working copy. The
+``.hgeol`` file use the same syntax as all other Mercurial
+configuration files. It uses two sections, ``[patterns]`` and
+``[repository]``.
+
+The ``[patterns]`` section specifies how line endings should be
+converted between the working copy and the repository. The format is
+specified by a file pattern. The first match is used, so put more
+specific patterns first. The available line endings are ``LF``,
+``CRLF``, and ``BIN``.
+
+Files with the declared format of ``CRLF`` or ``LF`` are always
+checked out and stored in the repository in that format and files
+declared to be binary (``BIN``) are left unchanged. Additionally,
+``native`` is an alias for checking out in the platform's default line
+ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on
+Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's
+default behaviour; it is only needed if you need to override a later,
+more general pattern.
+
+The optional ``[repository]`` section specifies the line endings to
+use for files stored in the repository. It has a single setting,
+``native``, which determines the storage line endings for files
+declared as ``native`` in the ``[patterns]`` section. It can be set to
+``LF`` or ``CRLF``. The default is ``LF``. For example, this means
+that on Windows, files configured as ``native`` (``CRLF`` by default)
+will be converted to ``LF`` when stored in the repository. Files
+declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section
+are always stored as-is in the repository.
+
+Example versioned ``.hgeol`` file::
+
+ [patterns]
+ **.py = native
+ **.vcproj = CRLF
+ **.txt = native
+ Makefile = LF
+ **.jpg = BIN
+
+ [repository]
+ native = LF
+
+.. note::
+ The rules will first apply when files are touched in the working
+ copy, e.g. by updating to null and back to tip to touch all files.
+
+The extension uses an optional ``[eol]`` section read from both the
+normal Mercurial configuration files and the ``.hgeol`` file, with the
+latter overriding the former. You can use that section to control the
+overall behavior. There are three settings:
+
+- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or
+ ``CRLF`` to override the default interpretation of ``native`` for
+ checkout. This can be used with :hg:`archive` on Unix, say, to
+ generate an archive where files have line endings for Windows.
+
+- ``eol.only-consistent`` (default True) can be set to False to make
+ the extension convert files with inconsistent EOLs. Inconsistent
+ means that there is both ``CRLF`` and ``LF`` present in the file.
+ Such files are normally not touched under the assumption that they
+ have mixed EOLs on purpose.
+
+- ``eol.fix-trailing-newline`` (default False) can be set to True to
+ ensure that converted files end with a EOL character (either ``\\n``
+ or ``\\r\\n`` as per the configured patterns).
+
+The extension provides ``cleverencode:`` and ``cleverdecode:`` filters
+like the deprecated win32text extension does. This means that you can
+disable win32text and enable eol and your filters will still work. You
+only need to these filters until you have prepared a ``.hgeol`` file.
+
+The ``win32text.forbid*`` hooks provided by the win32text extension
+have been unified into a single hook named ``eol.checkheadshook``. The
+hook will lookup the expected line endings from the ``.hgeol`` file,
+which means you must migrate to a ``.hgeol`` file first before using
+the hook. ``eol.checkheadshook`` only checks heads, intermediate
+invalid revisions will be pushed. To forbid them completely, use the
+``eol.checkallhook`` hook. These hooks are best used as
+``pretxnchangegroup`` hooks.
+
+See :hg:`help patterns` for more information about the glob patterns
+used.
+"""
+
+from mercurial.i18n import _
+from mercurial import util, config, extensions, match, error
+import re, os
+
+testedwith = 'internal'
+
+# Matches a lone LF, i.e., one that is not part of CRLF.
+singlelf = re.compile('(^|[^\r])\n')
+# Matches a single EOL which can either be a CRLF where repeated CR
+# are removed or a LF. We do not care about old Machintosh files, so a
+# stray CR is an error.
+eolre = re.compile('\r*\n')
+
+
+def inconsistenteol(data):
+ return '\r\n' in data and singlelf.search(data)
+
+def tolf(s, params, ui, **kwargs):
+ """Filter to convert to LF EOLs."""
+ if util.binary(s):
+ return s
+ if ui.configbool('eol', 'only-consistent', True) and inconsistenteol(s):
+ return s
+ if (ui.configbool('eol', 'fix-trailing-newline', False)
+ and s and s[-1] != '\n'):
+ s = s + '\n'
+ return eolre.sub('\n', s)
+
+def tocrlf(s, params, ui, **kwargs):
+ """Filter to convert to CRLF EOLs."""
+ if util.binary(s):
+ return s
+ if ui.configbool('eol', 'only-consistent', True) and inconsistenteol(s):
+ return s
+ if (ui.configbool('eol', 'fix-trailing-newline', False)
+ and s and s[-1] != '\n'):
+ s = s + '\n'
+ return eolre.sub('\r\n', s)
+
+def isbinary(s, params):
+ """Filter to do nothing with the file."""
+ return s
+
+filters = {
+ 'to-lf': tolf,
+ 'to-crlf': tocrlf,
+ 'is-binary': isbinary,
+ # The following provide backwards compatibility with win32text
+ 'cleverencode:': tolf,
+ 'cleverdecode:': tocrlf
+}
+
+class eolfile(object):
+ def __init__(self, ui, root, data):
+ self._decode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'}
+ self._encode = {'LF': 'to-lf', 'CRLF': 'to-crlf', 'BIN': 'is-binary'}
+
+ self.cfg = config.config()
+ # Our files should not be touched. The pattern must be
+ # inserted first override a '** = native' pattern.
+ self.cfg.set('patterns', '.hg*', 'BIN')
+ # We can then parse the user's patterns.
+ self.cfg.parse('.hgeol', data)
+
+ isrepolf = self.cfg.get('repository', 'native') != 'CRLF'
+ self._encode['NATIVE'] = isrepolf and 'to-lf' or 'to-crlf'
+ iswdlf = ui.config('eol', 'native', os.linesep) in ('LF', '\n')
+ self._decode['NATIVE'] = iswdlf and 'to-lf' or 'to-crlf'
+
+ include = []
+ exclude = []
+ for pattern, style in self.cfg.items('patterns'):
+ key = style.upper()
+ if key == 'BIN':
+ exclude.append(pattern)
+ else:
+ include.append(pattern)
+ # This will match the files for which we need to care
+ # about inconsistent newlines.
+ self.match = match.match(root, '', [], include, exclude)
+
+ def copytoui(self, ui):
+ for pattern, style in self.cfg.items('patterns'):
+ key = style.upper()
+ try:
+ ui.setconfig('decode', pattern, self._decode[key])
+ ui.setconfig('encode', pattern, self._encode[key])
+ except KeyError:
+ ui.warn(_("ignoring unknown EOL style '%s' from %s\n")
+ % (style, self.cfg.source('patterns', pattern)))
+ # eol.only-consistent can be specified in ~/.hgrc or .hgeol
+ for k, v in self.cfg.items('eol'):
+ ui.setconfig('eol', k, v)
+
+ def checkrev(self, repo, ctx, files):
+ failed = []
+ for f in (files or ctx.files()):
+ if f not in ctx:
+ continue
+ for pattern, style in self.cfg.items('patterns'):
+ if not match.match(repo.root, '', [pattern])(f):
+ continue
+ target = self._encode[style.upper()]
+ data = ctx[f].data()
+ if (target == "to-lf" and "\r\n" in data
+ or target == "to-crlf" and singlelf.search(data)):
+ failed.append((str(ctx), target, f))
+ break
+ return failed
+
+def parseeol(ui, repo, nodes):
+ try:
+ for node in nodes:
+ try:
+ if node is None:
+ # Cannot use workingctx.data() since it would load
+ # and cache the filters before we configure them.
+ data = repo.wfile('.hgeol').read()
+ else:
+ data = repo[node]['.hgeol'].data()
+ return eolfile(ui, repo.root, data)
+ except (IOError, LookupError):
+ pass
+ except error.ParseError, inst:
+ ui.warn(_("warning: ignoring .hgeol file due to parse error "
+ "at %s: %s\n") % (inst.args[1], inst.args[0]))
+ return None
+
+def _checkhook(ui, repo, node, headsonly):
+ # Get revisions to check and touched files at the same time
+ files = set()
+ revs = set()
+ for rev in xrange(repo[node].rev(), len(repo)):
+ revs.add(rev)
+ if headsonly:
+ ctx = repo[rev]
+ files.update(ctx.files())
+ for pctx in ctx.parents():
+ revs.discard(pctx.rev())
+ failed = []
+ for rev in revs:
+ ctx = repo[rev]
+ eol = parseeol(ui, repo, [ctx.node()])
+ if eol:
+ failed.extend(eol.checkrev(repo, ctx, files))
+
+ if failed:
+ eols = {'to-lf': 'CRLF', 'to-crlf': 'LF'}
+ msgs = []
+ for node, target, f in failed:
+ msgs.append(_(" %s in %s should not have %s line endings") %
+ (f, node, eols[target]))
+ raise util.Abort(_("end-of-line check failed:\n") + "\n".join(msgs))
+
+def checkallhook(ui, repo, node, hooktype, **kwargs):
+ """verify that files have expected EOLs"""
+ _checkhook(ui, repo, node, False)
+
+def checkheadshook(ui, repo, node, hooktype, **kwargs):
+ """verify that files have expected EOLs"""
+ _checkhook(ui, repo, node, True)
+
+# "checkheadshook" used to be called "hook"
+hook = checkheadshook
+
+def preupdate(ui, repo, hooktype, parent1, parent2):
+ repo.loadeol([parent1])
+ return False
+
+def uisetup(ui):
+ ui.setconfig('hooks', 'preupdate.eol', preupdate)
+
+def extsetup(ui):
+ try:
+ extensions.find('win32text')
+ ui.warn(_("the eol extension is incompatible with the "
+ "win32text extension\n"))
+ except KeyError:
+ pass
+
+
+def reposetup(ui, repo):
+ uisetup(repo.ui)
+
+ if not repo.local():
+ return
+ for name, fn in filters.iteritems():
+ repo.adddatafilter(name, fn)
+
+ ui.setconfig('patch', 'eol', 'auto')
+
+ class eolrepo(repo.__class__):
+
+ def loadeol(self, nodes):
+ eol = parseeol(self.ui, self, nodes)
+ if eol is None:
+ return None
+ eol.copytoui(self.ui)
+ return eol.match
+
+ def _hgcleardirstate(self):
+ self._eolfile = self.loadeol([None, 'tip'])
+ if not self._eolfile:
+ self._eolfile = util.never
+ return
+
+ try:
+ cachemtime = os.path.getmtime(self.join("eol.cache"))
+ except OSError:
+ cachemtime = 0
+
+ try:
+ eolmtime = os.path.getmtime(self.wjoin(".hgeol"))
+ except OSError:
+ eolmtime = 0
+
+ if eolmtime > cachemtime:
+ ui.debug("eol: detected change in .hgeol\n")
+ wlock = None
+ try:
+ wlock = self.wlock()
+ for f in self.dirstate:
+ if self.dirstate[f] == 'n':
+ # all normal files need to be looked at
+ # again since the new .hgeol file might no
+ # longer match a file it matched before
+ self.dirstate.normallookup(f)
+ # Create or touch the cache to update mtime
+ self.opener("eol.cache", "w").close()
+ wlock.release()
+ except error.LockUnavailable:
+ # If we cannot lock the repository and clear the
+ # dirstate, then a commit might not see all files
+ # as modified. But if we cannot lock the
+ # repository, then we can also not make a commit,
+ # so ignore the error.
+ pass
+
+ def commitctx(self, ctx, error=False):
+ for f in sorted(ctx.added() + ctx.modified()):
+ if not self._eolfile(f):
+ continue
+ try:
+ data = ctx[f].data()
+ except IOError:
+ continue
+ if util.binary(data):
+ # We should not abort here, since the user should
+ # be able to say "** = native" to automatically
+ # have all non-binary files taken care of.
+ continue
+ if inconsistenteol(data):
+ raise util.Abort(_("inconsistent newline style "
+ "in %s\n" % f))
+ return super(eolrepo, self).commitctx(ctx, error)
+ repo.__class__ = eolrepo
+ repo._hgcleardirstate()
diff --git a/hgext/extdiff.py b/hgext/extdiff.py
new file mode 100644
index 0000000..bae60e8
--- /dev/null
+++ b/hgext/extdiff.py
@@ -0,0 +1,331 @@
+# extdiff.py - external diff program support for mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to allow external programs to compare revisions
+
+The extdiff Mercurial extension allows you to use external programs
+to compare revisions, or revision with working directory. The external
+diff programs are called with a configurable set of options and two
+non-option arguments: paths to directories containing snapshots of
+files to compare.
+
+The extdiff extension also allows you to configure new diff commands, so
+you do not need to type :hg:`extdiff -p kdiff3` always. ::
+
+ [extdiff]
+ # add new command that runs GNU diff(1) in 'context diff' mode
+ cdiff = gdiff -Nprc5
+ ## or the old way:
+ #cmd.cdiff = gdiff
+ #opts.cdiff = -Nprc5
+
+ # add new command called vdiff, runs kdiff3
+ vdiff = kdiff3
+
+ # add new command called meld, runs meld (no need to name twice)
+ meld =
+
+ # add new command called vimdiff, runs gvimdiff with DirDiff plugin
+ # (see http://www.vim.org/scripts/script.php?script_id=102) Non
+ # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
+ # your .vimrc
+ vimdiff = gvim -f "+next" \\
+ "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
+
+Tool arguments can include variables that are expanded at runtime::
+
+ $parent1, $plabel1 - filename, descriptive label of first parent
+ $child, $clabel - filename, descriptive label of child revision
+ $parent2, $plabel2 - filename, descriptive label of second parent
+ $root - repository root
+ $parent is an alias for $parent1.
+
+The extdiff extension will look in your [diff-tools] and [merge-tools]
+sections for diff tool arguments, when none are specified in [extdiff].
+
+::
+
+ [extdiff]
+ kdiff3 =
+
+ [diff-tools]
+ kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
+
+You can use -I/-X and list of file or directory names like normal
+:hg:`diff` command. The extdiff extension makes snapshots of only
+needed files, so running the external diff program will actually be
+pretty fast (at least faster than having to compare the entire tree).
+'''
+
+from mercurial.i18n import _
+from mercurial.node import short, nullid
+from mercurial import scmutil, scmutil, util, commands, encoding
+import os, shlex, shutil, tempfile, re
+
+testedwith = 'internal'
+
+def snapshot(ui, repo, files, node, tmproot):
+ '''snapshot files as of some revision
+ if not using snapshot, -I/-X does not work and recursive diff
+ in tools like kdiff3 and meld displays too many files.'''
+ dirname = os.path.basename(repo.root)
+ if dirname == "":
+ dirname = "root"
+ if node is not None:
+ dirname = '%s.%s' % (dirname, short(node))
+ base = os.path.join(tmproot, dirname)
+ os.mkdir(base)
+ if node is not None:
+ ui.note(_('making snapshot of %d files from rev %s\n') %
+ (len(files), short(node)))
+ else:
+ ui.note(_('making snapshot of %d files from working directory\n') %
+ (len(files)))
+ wopener = scmutil.opener(base)
+ fns_and_mtime = []
+ ctx = repo[node]
+ for fn in files:
+ wfn = util.pconvert(fn)
+ if wfn not in ctx:
+ # File doesn't exist; could be a bogus modify
+ continue
+ ui.note(' %s\n' % wfn)
+ dest = os.path.join(base, wfn)
+ fctx = ctx[wfn]
+ data = repo.wwritedata(wfn, fctx.data())
+ if 'l' in fctx.flags():
+ wopener.symlink(data, wfn)
+ else:
+ wopener.write(wfn, data)
+ if 'x' in fctx.flags():
+ util.setflags(dest, False, True)
+ if node is None:
+ fns_and_mtime.append((dest, repo.wjoin(fn),
+ os.lstat(dest).st_mtime))
+ return dirname, fns_and_mtime
+
+def dodiff(ui, repo, diffcmd, diffopts, pats, opts):
+ '''Do the actuall diff:
+
+ - copy to a temp structure if diffing 2 internal revisions
+ - copy to a temp structure if diffing working revision with
+ another one and more than 1 file is changed
+ - just invoke the diff for a single file in the working dir
+ '''
+
+ revs = opts.get('rev')
+ change = opts.get('change')
+ args = ' '.join(diffopts)
+ do3way = '$parent2' in args
+
+ if revs and change:
+ msg = _('cannot specify --rev and --change at the same time')
+ raise util.Abort(msg)
+ elif change:
+ node2 = scmutil.revsingle(repo, change, None).node()
+ node1a, node1b = repo.changelog.parents(node2)
+ else:
+ node1a, node2 = scmutil.revpair(repo, revs)
+ if not revs:
+ node1b = repo.dirstate.p2()
+ else:
+ node1b = nullid
+
+ # Disable 3-way merge if there is only one parent
+ if do3way:
+ if node1b == nullid:
+ do3way = False
+
+ matcher = scmutil.match(repo[node2], pats, opts)
+ mod_a, add_a, rem_a = map(set, repo.status(node1a, node2, matcher)[:3])
+ if do3way:
+ mod_b, add_b, rem_b = map(set, repo.status(node1b, node2, matcher)[:3])
+ else:
+ mod_b, add_b, rem_b = set(), set(), set()
+ modadd = mod_a | add_a | mod_b | add_b
+ common = modadd | rem_a | rem_b
+ if not common:
+ return 0
+
+ tmproot = tempfile.mkdtemp(prefix='extdiff.')
+ try:
+ # Always make a copy of node1a (and node1b, if applicable)
+ dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
+ dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot)[0]
+ rev1a = '@%d' % repo[node1a].rev()
+ if do3way:
+ dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
+ dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot)[0]
+ rev1b = '@%d' % repo[node1b].rev()
+ else:
+ dir1b = None
+ rev1b = ''
+
+ fns_and_mtime = []
+
+ # If node2 in not the wc or there is >1 change, copy it
+ dir2root = ''
+ rev2 = ''
+ if node2:
+ dir2 = snapshot(ui, repo, modadd, node2, tmproot)[0]
+ rev2 = '@%d' % repo[node2].rev()
+ elif len(common) > 1:
+ #we only actually need to get the files to copy back to
+ #the working dir in this case (because the other cases
+ #are: diffing 2 revisions or single file -- in which case
+ #the file is already directly passed to the diff tool).
+ dir2, fns_and_mtime = snapshot(ui, repo, modadd, None, tmproot)
+ else:
+ # This lets the diff tool open the changed file directly
+ dir2 = ''
+ dir2root = repo.root
+
+ label1a = rev1a
+ label1b = rev1b
+ label2 = rev2
+
+ # If only one change, diff the files instead of the directories
+ # Handle bogus modifies correctly by checking if the files exist
+ if len(common) == 1:
+ common_file = util.localpath(common.pop())
+ dir1a = os.path.join(tmproot, dir1a, common_file)
+ label1a = common_file + rev1a
+ if not os.path.isfile(dir1a):
+ dir1a = os.devnull
+ if do3way:
+ dir1b = os.path.join(tmproot, dir1b, common_file)
+ label1b = common_file + rev1b
+ if not os.path.isfile(dir1b):
+ dir1b = os.devnull
+ dir2 = os.path.join(dir2root, dir2, common_file)
+ label2 = common_file + rev2
+
+ # Function to quote file/dir names in the argument string.
+ # When not operating in 3-way mode, an empty string is
+ # returned for parent2
+ replace = dict(parent=dir1a, parent1=dir1a, parent2=dir1b,
+ plabel1=label1a, plabel2=label1b,
+ clabel=label2, child=dir2,
+ root=repo.root)
+ def quote(match):
+ key = match.group()[1:]
+ if not do3way and key == 'parent2':
+ return ''
+ return util.shellquote(replace[key])
+
+ # Match parent2 first, so 'parent1?' will match both parent1 and parent
+ regex = '\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)'
+ if not do3way and not re.search(regex, args):
+ args += ' $parent1 $child'
+ args = re.sub(regex, quote, args)
+ cmdline = util.shellquote(diffcmd) + ' ' + args
+
+ ui.debug('running %r in %s\n' % (cmdline, tmproot))
+ util.system(cmdline, cwd=tmproot, out=ui.fout)
+
+ for copy_fn, working_fn, mtime in fns_and_mtime:
+ if os.lstat(copy_fn).st_mtime != mtime:
+ ui.debug('file changed while diffing. '
+ 'Overwriting: %s (src: %s)\n' % (working_fn, copy_fn))
+ util.copyfile(copy_fn, working_fn)
+
+ return 1
+ finally:
+ ui.note(_('cleaning up temp directory\n'))
+ shutil.rmtree(tmproot)
+
+def extdiff(ui, repo, *pats, **opts):
+ '''use external program to diff repository (or selected files)
+
+ Show differences between revisions for the specified files, using
+ an external program. The default program used is diff, with
+ default options "-Npru".
+
+ To select a different program, use the -p/--program option. The
+ program will be passed the names of two directories to compare. To
+ pass additional options to the program, use -o/--option. These
+ will be passed before the names of the directories to compare.
+
+ When two revision arguments are given, then changes are shown
+ between those revisions. If only one revision is specified then
+ that revision is compared to the working directory, and, when no
+ revisions are specified, the working directory files are compared
+ to its parent.'''
+ program = opts.get('program')
+ option = opts.get('option')
+ if not program:
+ program = 'diff'
+ option = option or ['-Npru']
+ return dodiff(ui, repo, program, option, pats, opts)
+
+cmdtable = {
+ "extdiff":
+ (extdiff,
+ [('p', 'program', '',
+ _('comparison program to run'), _('CMD')),
+ ('o', 'option', [],
+ _('pass option to comparison program'), _('OPT')),
+ ('r', 'rev', [],
+ _('revision'), _('REV')),
+ ('c', 'change', '',
+ _('change made by revision'), _('REV')),
+ ] + commands.walkopts,
+ _('hg extdiff [OPT]... [FILE]...')),
+ }
+
+def uisetup(ui):
+ for cmd, path in ui.configitems('extdiff'):
+ if cmd.startswith('cmd.'):
+ cmd = cmd[4:]
+ if not path:
+ path = cmd
+ diffopts = ui.config('extdiff', 'opts.' + cmd, '')
+ diffopts = diffopts and [diffopts] or []
+ elif cmd.startswith('opts.'):
+ continue
+ else:
+ # command = path opts
+ if path:
+ diffopts = shlex.split(path)
+ path = diffopts.pop(0)
+ else:
+ path, diffopts = cmd, []
+ # look for diff arguments in [diff-tools] then [merge-tools]
+ if diffopts == []:
+ args = ui.config('diff-tools', cmd+'.diffargs') or \
+ ui.config('merge-tools', cmd+'.diffargs')
+ if args:
+ diffopts = shlex.split(args)
+ def save(cmd, path, diffopts):
+ '''use closure to save diff command to use'''
+ def mydiff(ui, repo, *pats, **opts):
+ return dodiff(ui, repo, path, diffopts + opts['option'],
+ pats, opts)
+ doc = _('''\
+use %(path)s to diff repository (or selected files)
+
+ Show differences between revisions for the specified files, using
+ the %(path)s program.
+
+ When two revision arguments are given, then changes are shown
+ between those revisions. If only one revision is specified then
+ that revision is compared to the working directory, and, when no
+ revisions are specified, the working directory files are compared
+ to its parent.\
+''') % dict(path=util.uirepr(path))
+
+ # We must translate the docstring right away since it is
+ # used as a format string. The string will unfortunately
+ # be translated again in commands.helpcmd and this will
+ # fail when the docstring contains non-ASCII characters.
+ # Decoding the string to a Unicode string here (using the
+ # right encoding) prevents that.
+ mydiff.__doc__ = doc.decode(encoding.encoding)
+ return mydiff
+ cmdtable[cmd] = (save(cmd, path, diffopts),
+ cmdtable['extdiff'][1][1:],
+ _('hg %s [OPTION]... [FILE]...') % cmd)
diff --git a/hgext/factotum.py b/hgext/factotum.py
new file mode 100644
index 0000000..098c5a2
--- /dev/null
+++ b/hgext/factotum.py
@@ -0,0 +1,120 @@
+# factotum.py - Plan 9 factotum integration for Mercurial
+#
+# Copyright (C) 2012 Steven Stallion <sstallion@gmail.com>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+'''http authentication with factotum
+
+This extension allows the factotum(4) facility on Plan 9 from Bell Labs
+platforms to provide authentication information for HTTP access. Configuration
+entries specified in the auth section as well as authentication information
+provided in the repository URL are fully supported. If no prefix is specified,
+a value of "*" will be assumed.
+
+By default, keys are specified as::
+
+ proto=pass service=hg prefix=<prefix> user=<username> !password=<password>
+
+If the factotum extension is unable to read the required key, one will be
+requested interactively.
+
+A configuration section is available to customize runtime behavior. By
+default, these entries are::
+
+ [factotum]
+ executable = /bin/auth/factotum
+ mountpoint = /mnt/factotum
+ service = hg
+
+The executable entry defines the full path to the factotum binary. The
+mountpoint entry defines the path to the factotum file service. Lastly, the
+service entry controls the service name used when reading keys.
+
+'''
+
+from mercurial.i18n import _
+from mercurial.url import passwordmgr
+from mercurial import httpconnection, urllib2, util
+import os
+
+ERRMAX = 128
+
+def auth_getkey(self, params):
+ if not self.ui.interactive():
+ raise util.Abort(_('factotum not interactive'))
+ if 'user=' not in params:
+ params = '%s user?' % params
+ params = '%s !password?' % params
+ os.system("%s -g '%s'" % (_executable, params))
+
+def auth_getuserpasswd(self, getkey, params):
+ params = 'proto=pass %s' % params
+ while True:
+ fd = os.open('%s/rpc' % _mountpoint, os.O_RDWR)
+ try:
+ try:
+ os.write(fd, 'start %s' % params)
+ l = os.read(fd, ERRMAX).split()
+ if l[0] == 'ok':
+ os.write(fd, 'read')
+ l = os.read(fd, ERRMAX).split()
+ if l[0] == 'ok':
+ return l[1:]
+ except (OSError, IOError):
+ raise util.Abort(_('factotum not responding'))
+ finally:
+ os.close(fd)
+ getkey(self, params)
+
+def monkeypatch_method(cls):
+ def decorator(func):
+ setattr(cls, func.__name__, func)
+ return func
+ return decorator
+
+@monkeypatch_method(passwordmgr)
+def find_user_password(self, realm, authuri):
+ user, passwd = urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password(
+ self, realm, authuri)
+ if user and passwd:
+ self._writedebug(user, passwd)
+ return (user, passwd)
+
+ prefix = ''
+ res = httpconnection.readauthforuri(self.ui, authuri, user)
+ if res:
+ _, auth = res
+ prefix = auth.get('prefix')
+ user, passwd = auth.get('username'), auth.get('password')
+ if not user or not passwd:
+ if not prefix:
+ prefix = '*'
+ params = 'service=%s prefix=%s' % (_service, prefix)
+ if user:
+ params = '%s user=%s' % (params, user)
+ user, passwd = auth_getuserpasswd(self, auth_getkey, params)
+
+ self.add_password(realm, authuri, user, passwd)
+ self._writedebug(user, passwd)
+ return (user, passwd)
+
+def uisetup(ui):
+ global _executable
+ _executable = ui.config('factotum', 'executable', '/bin/auth/factotum')
+ global _mountpoint
+ _mountpoint = ui.config('factotum', 'mountpoint', '/mnt/factotum')
+ global _service
+ _service = ui.config('factotum', 'service', 'hg')
diff --git a/hgext/fetch.py b/hgext/fetch.py
new file mode 100644
index 0000000..491d8b2
--- /dev/null
+++ b/hgext/fetch.py
@@ -0,0 +1,158 @@
+# fetch.py - pull and merge remote changes
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''pull, update and merge in one command (DEPRECATED)'''
+
+from mercurial.i18n import _
+from mercurial.node import nullid, short
+from mercurial import commands, cmdutil, hg, util, error
+from mercurial.lock import release
+
+testedwith = 'internal'
+
+def fetch(ui, repo, source='default', **opts):
+ '''pull changes from a remote repository, merge new changes if needed.
+
+ This finds all changes from the repository at the specified path
+ or URL and adds them to the local repository.
+
+ If the pulled changes add a new branch head, the head is
+ automatically merged, and the result of the merge is committed.
+ Otherwise, the working directory is updated to include the new
+ changes.
+
+ When a merge is needed, the working directory is first updated to
+ the newly pulled changes. Local changes are then merged into the
+ pulled changes. To switch the merge order, use --switch-parent.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Returns 0 on success.
+ '''
+
+ date = opts.get('date')
+ if date:
+ opts['date'] = util.parsedate(date)
+
+ parent, p2 = repo.dirstate.parents()
+ branch = repo.dirstate.branch()
+ try:
+ branchnode = repo.branchtip(branch)
+ except error.RepoLookupError:
+ branchnode = None
+ if parent != branchnode:
+ raise util.Abort(_('working dir not at branch tip '
+ '(use "hg update" to check out branch tip)'))
+
+ if p2 != nullid:
+ raise util.Abort(_('outstanding uncommitted merge'))
+
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ mod, add, rem, del_ = repo.status()[:4]
+
+ if mod or add or rem:
+ raise util.Abort(_('outstanding uncommitted changes'))
+ if del_:
+ raise util.Abort(_('working directory is missing some files'))
+ bheads = repo.branchheads(branch)
+ bheads = [head for head in bheads if len(repo[head].children()) == 0]
+ if len(bheads) > 1:
+ raise util.Abort(_('multiple heads in this branch '
+ '(use "hg heads ." and "hg merge" to merge)'))
+
+ other = hg.peer(repo, opts, ui.expandpath(source))
+ ui.status(_('pulling from %s\n') %
+ util.hidepassword(ui.expandpath(source)))
+ revs = None
+ if opts['rev']:
+ try:
+ revs = [other.lookup(rev) for rev in opts['rev']]
+ except error.CapabilityError:
+ err = _("other repository doesn't support revision lookup, "
+ "so a rev cannot be specified.")
+ raise util.Abort(err)
+
+ # Are there any changes at all?
+ modheads = repo.pull(other, heads=revs)
+ if modheads == 0:
+ return 0
+
+ # Is this a simple fast-forward along the current branch?
+ newheads = repo.branchheads(branch)
+ newchildren = repo.changelog.nodesbetween([parent], newheads)[2]
+ if len(newheads) == 1 and len(newchildren):
+ if newchildren[0] != parent:
+ return hg.update(repo, newchildren[0])
+ else:
+ return 0
+
+ # Are there more than one additional branch heads?
+ newchildren = [n for n in newchildren if n != parent]
+ newparent = parent
+ if newchildren:
+ newparent = newchildren[0]
+ hg.clean(repo, newparent)
+ newheads = [n for n in newheads if n != newparent]
+ if len(newheads) > 1:
+ ui.status(_('not merging with %d other new branch heads '
+ '(use "hg heads ." and "hg merge" to merge them)\n') %
+ (len(newheads) - 1))
+ return 1
+
+ if not newheads:
+ return 0
+
+ # Otherwise, let's merge.
+ err = False
+ if newheads:
+ # By default, we consider the repository we're pulling
+ # *from* as authoritative, so we merge our changes into
+ # theirs.
+ if opts['switch_parent']:
+ firstparent, secondparent = newparent, newheads[0]
+ else:
+ firstparent, secondparent = newheads[0], newparent
+ ui.status(_('updating to %d:%s\n') %
+ (repo.changelog.rev(firstparent),
+ short(firstparent)))
+ hg.clean(repo, firstparent)
+ ui.status(_('merging with %d:%s\n') %
+ (repo.changelog.rev(secondparent), short(secondparent)))
+ err = hg.merge(repo, secondparent, remind=False)
+
+ if not err:
+ # we don't translate commit messages
+ message = (cmdutil.logmessage(ui, opts) or
+ ('Automated merge with %s' %
+ util.removeauth(other.url())))
+ editor = cmdutil.commiteditor
+ if opts.get('force_editor') or opts.get('edit'):
+ editor = cmdutil.commitforceeditor
+ n = repo.commit(message, opts['user'], opts['date'], editor=editor)
+ ui.status(_('new changeset %d:%s merges remote changes '
+ 'with local\n') % (repo.changelog.rev(n),
+ short(n)))
+
+ return err
+
+ finally:
+ release(lock, wlock)
+
+cmdtable = {
+ 'fetch':
+ (fetch,
+ [('r', 'rev', [],
+ _('a specific revision you would like to pull'), _('REV')),
+ ('e', 'edit', None, _('edit commit message')),
+ ('', 'force-editor', None, _('edit commit message (DEPRECATED)')),
+ ('', 'switch-parent', None, _('switch parents when merging')),
+ ] + commands.commitopts + commands.commitopts2 + commands.remoteopts,
+ _('hg fetch [SOURCE]')),
+}
diff --git a/hgext/gpg.py b/hgext/gpg.py
new file mode 100644
index 0000000..2ded54c
--- /dev/null
+++ b/hgext/gpg.py
@@ -0,0 +1,289 @@
+# Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''commands to sign and verify changesets'''
+
+import os, tempfile, binascii
+from mercurial import util, commands, match, cmdutil
+from mercurial import node as hgnode
+from mercurial.i18n import _
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+class gpg(object):
+ def __init__(self, path, key=None):
+ self.path = path
+ self.key = (key and " --local-user \"%s\"" % key) or ""
+
+ def sign(self, data):
+ gpgcmd = "%s --sign --detach-sign%s" % (self.path, self.key)
+ return util.filter(data, gpgcmd)
+
+ def verify(self, data, sig):
+ """ returns of the good and bad signatures"""
+ sigfile = datafile = None
+ try:
+ # create temporary files
+ fd, sigfile = tempfile.mkstemp(prefix="hg-gpg-", suffix=".sig")
+ fp = os.fdopen(fd, 'wb')
+ fp.write(sig)
+ fp.close()
+ fd, datafile = tempfile.mkstemp(prefix="hg-gpg-", suffix=".txt")
+ fp = os.fdopen(fd, 'wb')
+ fp.write(data)
+ fp.close()
+ gpgcmd = ("%s --logger-fd 1 --status-fd 1 --verify "
+ "\"%s\" \"%s\"" % (self.path, sigfile, datafile))
+ ret = util.filter("", gpgcmd)
+ finally:
+ for f in (sigfile, datafile):
+ try:
+ if f:
+ os.unlink(f)
+ except OSError:
+ pass
+ keys = []
+ key, fingerprint = None, None
+ err = ""
+ for l in ret.splitlines():
+ # see DETAILS in the gnupg documentation
+ # filter the logger output
+ if not l.startswith("[GNUPG:]"):
+ continue
+ l = l[9:]
+ if l.startswith("ERRSIG"):
+ err = _("error while verifying signature")
+ break
+ elif l.startswith("VALIDSIG"):
+ # fingerprint of the primary key
+ fingerprint = l.split()[10]
+ elif (l.startswith("GOODSIG") or
+ l.startswith("EXPSIG") or
+ l.startswith("EXPKEYSIG") or
+ l.startswith("BADSIG")):
+ if key is not None:
+ keys.append(key + [fingerprint])
+ key = l.split(" ", 2)
+ fingerprint = None
+ if err:
+ return err, []
+ if key is not None:
+ keys.append(key + [fingerprint])
+ return err, keys
+
+def newgpg(ui, **opts):
+ """create a new gpg instance"""
+ gpgpath = ui.config("gpg", "cmd", "gpg")
+ gpgkey = opts.get('key')
+ if not gpgkey:
+ gpgkey = ui.config("gpg", "key", None)
+ return gpg(gpgpath, gpgkey)
+
+def sigwalk(repo):
+ """
+ walk over every sigs, yields a couple
+ ((node, version, sig), (filename, linenumber))
+ """
+ def parsefile(fileiter, context):
+ ln = 1
+ for l in fileiter:
+ if not l:
+ continue
+ yield (l.split(" ", 2), (context, ln))
+ ln += 1
+
+ # read the heads
+ fl = repo.file(".hgsigs")
+ for r in reversed(fl.heads()):
+ fn = ".hgsigs|%s" % hgnode.short(r)
+ for item in parsefile(fl.read(r).splitlines(), fn):
+ yield item
+ try:
+ # read local signatures
+ fn = "localsigs"
+ for item in parsefile(repo.opener(fn), fn):
+ yield item
+ except IOError:
+ pass
+
+def getkeys(ui, repo, mygpg, sigdata, context):
+ """get the keys who signed a data"""
+ fn, ln = context
+ node, version, sig = sigdata
+ prefix = "%s:%d" % (fn, ln)
+ node = hgnode.bin(node)
+
+ data = node2txt(repo, node, version)
+ sig = binascii.a2b_base64(sig)
+ err, keys = mygpg.verify(data, sig)
+ if err:
+ ui.warn("%s:%d %s\n" % (fn, ln , err))
+ return None
+
+ validkeys = []
+ # warn for expired key and/or sigs
+ for key in keys:
+ if key[0] == "BADSIG":
+ ui.write(_("%s Bad signature from \"%s\"\n") % (prefix, key[2]))
+ continue
+ if key[0] == "EXPSIG":
+ ui.write(_("%s Note: Signature has expired"
+ " (signed by: \"%s\")\n") % (prefix, key[2]))
+ elif key[0] == "EXPKEYSIG":
+ ui.write(_("%s Note: This key has expired"
+ " (signed by: \"%s\")\n") % (prefix, key[2]))
+ validkeys.append((key[1], key[2], key[3]))
+ return validkeys
+
+@command("sigs", [], _('hg sigs'))
+def sigs(ui, repo):
+ """list signed changesets"""
+ mygpg = newgpg(ui)
+ revs = {}
+
+ for data, context in sigwalk(repo):
+ node, version, sig = data
+ fn, ln = context
+ try:
+ n = repo.lookup(node)
+ except KeyError:
+ ui.warn(_("%s:%d node does not exist\n") % (fn, ln))
+ continue
+ r = repo.changelog.rev(n)
+ keys = getkeys(ui, repo, mygpg, data, context)
+ if not keys:
+ continue
+ revs.setdefault(r, [])
+ revs[r].extend(keys)
+ for rev in sorted(revs, reverse=True):
+ for k in revs[rev]:
+ r = "%5d:%s" % (rev, hgnode.hex(repo.changelog.node(rev)))
+ ui.write("%-30s %s\n" % (keystr(ui, k), r))
+
+@command("sigcheck", [], _('hg sigcheck REV'))
+def check(ui, repo, rev):
+ """verify all the signatures there may be for a particular revision"""
+ mygpg = newgpg(ui)
+ rev = repo.lookup(rev)
+ hexrev = hgnode.hex(rev)
+ keys = []
+
+ for data, context in sigwalk(repo):
+ node, version, sig = data
+ if node == hexrev:
+ k = getkeys(ui, repo, mygpg, data, context)
+ if k:
+ keys.extend(k)
+
+ if not keys:
+ ui.write(_("no valid signature for %s\n") % hgnode.short(rev))
+ return
+
+ # print summary
+ ui.write("%s is signed by:\n" % hgnode.short(rev))
+ for key in keys:
+ ui.write(" %s\n" % keystr(ui, key))
+
+def keystr(ui, key):
+ """associate a string to a key (username, comment)"""
+ keyid, user, fingerprint = key
+ comment = ui.config("gpg", fingerprint, None)
+ if comment:
+ return "%s (%s)" % (user, comment)
+ else:
+ return user
+
+@command("sign",
+ [('l', 'local', None, _('make the signature local')),
+ ('f', 'force', None, _('sign even if the sigfile is modified')),
+ ('', 'no-commit', None, _('do not commit the sigfile after signing')),
+ ('k', 'key', '',
+ _('the key id to sign with'), _('ID')),
+ ('m', 'message', '',
+ _('commit message'), _('TEXT')),
+ ] + commands.commitopts2,
+ _('hg sign [OPTION]... [REV]...'))
+def sign(ui, repo, *revs, **opts):
+ """add a signature for the current or given revision
+
+ If no revision is given, the parent of the working directory is used,
+ or tip if no revision is checked out.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+ """
+
+ mygpg = newgpg(ui, **opts)
+ sigver = "0"
+ sigmessage = ""
+
+ date = opts.get('date')
+ if date:
+ opts['date'] = util.parsedate(date)
+
+ if revs:
+ nodes = [repo.lookup(n) for n in revs]
+ else:
+ nodes = [node for node in repo.dirstate.parents()
+ if node != hgnode.nullid]
+ if len(nodes) > 1:
+ raise util.Abort(_('uncommitted merge - please provide a '
+ 'specific revision'))
+ if not nodes:
+ nodes = [repo.changelog.tip()]
+
+ for n in nodes:
+ hexnode = hgnode.hex(n)
+ ui.write(_("signing %d:%s\n") % (repo.changelog.rev(n),
+ hgnode.short(n)))
+ # build data
+ data = node2txt(repo, n, sigver)
+ sig = mygpg.sign(data)
+ if not sig:
+ raise util.Abort(_("error while signing"))
+ sig = binascii.b2a_base64(sig)
+ sig = sig.replace("\n", "")
+ sigmessage += "%s %s %s\n" % (hexnode, sigver, sig)
+
+ # write it
+ if opts['local']:
+ repo.opener.append("localsigs", sigmessage)
+ return
+
+ msigs = match.exact(repo.root, '', ['.hgsigs'])
+ s = repo.status(match=msigs, unknown=True, ignored=True)[:6]
+ if util.any(s) and not opts["force"]:
+ raise util.Abort(_("working copy of .hgsigs is changed "
+ "(please commit .hgsigs manually "
+ "or use --force)"))
+
+ sigsfile = repo.wfile(".hgsigs", "ab")
+ sigsfile.write(sigmessage)
+ sigsfile.close()
+
+ if '.hgsigs' not in repo.dirstate:
+ repo[None].add([".hgsigs"])
+
+ if opts["no_commit"]:
+ return
+
+ message = opts['message']
+ if not message:
+ # we don't translate commit messages
+ message = "\n".join(["Added signature for changeset %s"
+ % hgnode.short(n)
+ for n in nodes])
+ try:
+ repo.commit(message, opts['user'], opts['date'], match=msigs)
+ except ValueError, inst:
+ raise util.Abort(str(inst))
+
+def node2txt(repo, node, ver):
+ """map a manifest into some text"""
+ if ver == "0":
+ return "%s\n" % hgnode.hex(node)
+ else:
+ raise util.Abort(_("unknown signature version"))
diff --git a/hgext/graphlog.py b/hgext/graphlog.py
new file mode 100644
index 0000000..9caed24
--- /dev/null
+++ b/hgext/graphlog.py
@@ -0,0 +1,54 @@
+# ASCII graph log extension for Mercurial
+#
+# Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to view revision graphs from a shell
+
+This extension adds a --graph option to the incoming, outgoing and log
+commands. When this options is given, an ASCII representation of the
+revision graph is also shown.
+'''
+
+from mercurial.i18n import _
+from mercurial import cmdutil, commands
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+@command('glog',
+ [('f', 'follow', None,
+ _('follow changeset history, or file history across copies and renames')),
+ ('', 'follow-first', None,
+ _('only follow the first parent of merge changesets (DEPRECATED)')),
+ ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
+ ('C', 'copies', None, _('show copied files')),
+ ('k', 'keyword', [],
+ _('do case-insensitive search for a given text'), _('TEXT')),
+ ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
+ ('', 'removed', None, _('include revisions where files were removed')),
+ ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
+ ('u', 'user', [], _('revisions committed by user'), _('USER')),
+ ('', 'only-branch', [],
+ _('show only changesets within the given named branch (DEPRECATED)'),
+ _('BRANCH')),
+ ('b', 'branch', [],
+ _('show changesets within the given named branch'), _('BRANCH')),
+ ('P', 'prune', [],
+ _('do not display revision or any of its ancestors'), _('REV')),
+ ('', 'hidden', False, _('show hidden changesets (DEPRECATED)')),
+ ] + commands.logopts + commands.walkopts,
+ _('[OPTION]... [FILE]'))
+def graphlog(ui, repo, *pats, **opts):
+ """show revision history alongside an ASCII revision graph
+
+ Print a revision history alongside a revision graph drawn with
+ ASCII characters.
+
+ Nodes printed as an @ character are parents of the working
+ directory.
+ """
+ return cmdutil.graphlog(ui, repo, *pats, **opts)
diff --git a/hgext/hgcia.py b/hgext/hgcia.py
new file mode 100644
index 0000000..075840a
--- /dev/null
+++ b/hgext/hgcia.py
@@ -0,0 +1,277 @@
+# Copyright (C) 2007-8 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""hooks for integrating with the CIA.vc notification service
+
+This is meant to be run as a changegroup or incoming hook. To
+configure it, set the following options in your hgrc::
+
+ [cia]
+ # your registered CIA user name
+ user = foo
+ # the name of the project in CIA
+ project = foo
+ # the module (subproject) (optional)
+ #module = foo
+ # Append a diffstat to the log message (optional)
+ #diffstat = False
+ # Template to use for log messages (optional)
+ #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}
+ # Style to use (optional)
+ #style = foo
+ # The URL of the CIA notification service (optional)
+ # You can use mailto: URLs to send by email, eg
+ # mailto:cia@cia.vc
+ # Make sure to set email.from if you do this.
+ #url = http://cia.vc/
+ # print message instead of sending it (optional)
+ #test = False
+ # number of slashes to strip for url paths
+ #strip = 0
+
+ [hooks]
+ # one of these:
+ changegroup.cia = python:hgcia.hook
+ #incoming.cia = python:hgcia.hook
+
+ [web]
+ # If you want hyperlinks (optional)
+ baseurl = http://server/path/to/repo
+"""
+
+from mercurial.i18n import _
+from mercurial.node import bin, short
+from mercurial import cmdutil, patch, templater, util, mail
+import email.Parser
+
+import socket, xmlrpclib
+from xml.sax import saxutils
+testedwith = 'internal'
+
+socket_timeout = 30 # seconds
+if util.safehasattr(socket, 'setdefaulttimeout'):
+ # set a timeout for the socket so you don't have to wait so looooong
+ # when cia.vc is having problems. requires python >= 2.3:
+ socket.setdefaulttimeout(socket_timeout)
+
+HGCIA_VERSION = '0.1'
+HGCIA_URL = 'http://hg.kublai.com/mercurial/hgcia'
+
+
+class ciamsg(object):
+ """ A CIA message """
+ def __init__(self, cia, ctx):
+ self.cia = cia
+ self.ctx = ctx
+ self.url = self.cia.url
+ if self.url:
+ self.url += self.cia.root
+
+ def fileelem(self, path, uri, action):
+ if uri:
+ uri = ' uri=%s' % saxutils.quoteattr(uri)
+ return '<file%s action=%s>%s</file>' % (
+ uri, saxutils.quoteattr(action), saxutils.escape(path))
+
+ def fileelems(self):
+ n = self.ctx.node()
+ f = self.cia.repo.status(self.ctx.p1().node(), n)
+ url = self.url or ''
+ if url and url[-1] == '/':
+ url = url[:-1]
+ elems = []
+ for path in f[0]:
+ uri = '%s/diff/%s/%s' % (url, short(n), path)
+ elems.append(self.fileelem(path, url and uri, 'modify'))
+ for path in f[1]:
+ # TODO: copy/rename ?
+ uri = '%s/file/%s/%s' % (url, short(n), path)
+ elems.append(self.fileelem(path, url and uri, 'add'))
+ for path in f[2]:
+ elems.append(self.fileelem(path, '', 'remove'))
+
+ return '\n'.join(elems)
+
+ def sourceelem(self, project, module=None, branch=None):
+ msg = ['<source>', '<project>%s</project>' % saxutils.escape(project)]
+ if module:
+ msg.append('<module>%s</module>' % saxutils.escape(module))
+ if branch:
+ msg.append('<branch>%s</branch>' % saxutils.escape(branch))
+ msg.append('</source>')
+
+ return '\n'.join(msg)
+
+ def diffstat(self):
+ class patchbuf(object):
+ def __init__(self):
+ self.lines = []
+ # diffstat is stupid
+ self.name = 'cia'
+ def write(self, data):
+ self.lines += data.splitlines(True)
+ def close(self):
+ pass
+
+ n = self.ctx.node()
+ pbuf = patchbuf()
+ cmdutil.export(self.cia.repo, [n], fp=pbuf)
+ return patch.diffstat(pbuf.lines) or ''
+
+ def logmsg(self):
+ diffstat = self.cia.diffstat and self.diffstat() or ''
+ self.cia.ui.pushbuffer()
+ self.cia.templater.show(self.ctx, changes=self.ctx.changeset(),
+ baseurl=self.cia.ui.config('web', 'baseurl'),
+ url=self.url, diffstat=diffstat,
+ webroot=self.cia.root)
+ return self.cia.ui.popbuffer()
+
+ def xml(self):
+ n = short(self.ctx.node())
+ src = self.sourceelem(self.cia.project, module=self.cia.module,
+ branch=self.ctx.branch())
+ # unix timestamp
+ dt = self.ctx.date()
+ timestamp = dt[0]
+
+ author = saxutils.escape(self.ctx.user())
+ rev = '%d:%s' % (self.ctx.rev(), n)
+ log = saxutils.escape(self.logmsg())
+
+ url = self.url
+ if url and url[-1] == '/':
+ url = url[:-1]
+ url = url and '<url>%s/rev/%s</url>' % (saxutils.escape(url), n) or ''
+
+ msg = """
+<message>
+ <generator>
+ <name>Mercurial (hgcia)</name>
+ <version>%s</version>
+ <url>%s</url>
+ <user>%s</user>
+ </generator>
+ %s
+ <body>
+ <commit>
+ <author>%s</author>
+ <version>%s</version>
+ <log>%s</log>
+ %s
+ <files>%s</files>
+ </commit>
+ </body>
+ <timestamp>%d</timestamp>
+</message>
+""" % \
+ (HGCIA_VERSION, saxutils.escape(HGCIA_URL),
+ saxutils.escape(self.cia.user), src, author, rev, log, url,
+ self.fileelems(), timestamp)
+
+ return msg
+
+
+class hgcia(object):
+ """ CIA notification class """
+
+ deftemplate = '{desc}'
+ dstemplate = '{desc}\n-- \n{diffstat}'
+
+ def __init__(self, ui, repo):
+ self.ui = ui
+ self.repo = repo
+
+ self.ciaurl = self.ui.config('cia', 'url', 'http://cia.vc')
+ self.user = self.ui.config('cia', 'user')
+ self.project = self.ui.config('cia', 'project')
+ self.module = self.ui.config('cia', 'module')
+ self.diffstat = self.ui.configbool('cia', 'diffstat')
+ self.emailfrom = self.ui.config('email', 'from')
+ self.dryrun = self.ui.configbool('cia', 'test')
+ self.url = self.ui.config('web', 'baseurl')
+ # Default to -1 for backward compatibility
+ self.stripcount = int(self.ui.config('cia', 'strip', -1))
+ self.root = self.strip(self.repo.root)
+
+ style = self.ui.config('cia', 'style')
+ template = self.ui.config('cia', 'template')
+ if not template:
+ template = self.diffstat and self.dstemplate or self.deftemplate
+ template = templater.parsestring(template, quoted=False)
+ t = cmdutil.changeset_templater(self.ui, self.repo, False, None,
+ style, False)
+ t.use_template(template)
+ self.templater = t
+
+ def strip(self, path):
+ '''strip leading slashes from local path, turn into web-safe path.'''
+
+ path = util.pconvert(path)
+ count = self.stripcount
+ if count < 0:
+ return ''
+ while count > 0:
+ c = path.find('/')
+ if c == -1:
+ break
+ path = path[c + 1:]
+ count -= 1
+ return path
+
+ def sendrpc(self, msg):
+ srv = xmlrpclib.Server(self.ciaurl)
+ res = srv.hub.deliver(msg)
+ if res is not True and res != 'queued.':
+ raise util.Abort(_('%s returned an error: %s') %
+ (self.ciaurl, res))
+
+ def sendemail(self, address, data):
+ p = email.Parser.Parser()
+ msg = p.parsestr(data)
+ msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2")
+ msg['To'] = address
+ msg['From'] = self.emailfrom
+ msg['Subject'] = 'DeliverXML'
+ msg['Content-type'] = 'text/xml'
+ msgtext = msg.as_string()
+
+ self.ui.status(_('hgcia: sending update to %s\n') % address)
+ mail.sendmail(self.ui, util.email(self.emailfrom),
+ [address], msgtext)
+
+
+def hook(ui, repo, hooktype, node=None, url=None, **kwargs):
+ """ send CIA notification """
+ def sendmsg(cia, ctx):
+ msg = ciamsg(cia, ctx).xml()
+ if cia.dryrun:
+ ui.write(msg)
+ elif cia.ciaurl.startswith('mailto:'):
+ if not cia.emailfrom:
+ raise util.Abort(_('email.from must be defined when '
+ 'sending by email'))
+ cia.sendemail(cia.ciaurl[7:], msg)
+ else:
+ cia.sendrpc(msg)
+
+ n = bin(node)
+ cia = hgcia(ui, repo)
+ if not cia.user:
+ ui.debug('cia: no user specified')
+ return
+ if not cia.project:
+ ui.debug('cia: no project specified')
+ return
+ if hooktype == 'changegroup':
+ start = repo.changelog.rev(n)
+ end = len(repo.changelog)
+ for rev in xrange(start, end):
+ n = repo.changelog.node(rev)
+ ctx = repo.changectx(n)
+ sendmsg(cia, ctx)
+ else:
+ ctx = repo.changectx(n)
+ sendmsg(cia, ctx)
diff --git a/hgext/hgk.py b/hgext/hgk.py
new file mode 100644
index 0000000..304b910
--- /dev/null
+++ b/hgext/hgk.py
@@ -0,0 +1,352 @@
+# Minimal support for git commands on an hg repository
+#
+# Copyright 2005, 2006 Chris Mason <mason@suse.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''browse the repository in a graphical way
+
+The hgk extension allows browsing the history of a repository in a
+graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not
+distributed with Mercurial.)
+
+hgk consists of two parts: a Tcl script that does the displaying and
+querying of information, and an extension to Mercurial named hgk.py,
+which provides hooks for hgk to get information. hgk can be found in
+the contrib directory, and the extension is shipped in the hgext
+repository, and needs to be enabled.
+
+The :hg:`view` command will launch the hgk Tcl script. For this command
+to work, hgk must be in your search path. Alternately, you can specify
+the path to hgk in your configuration file::
+
+ [hgk]
+ path=/location/of/hgk
+
+hgk can make use of the extdiff extension to visualize revisions.
+Assuming you had already configured extdiff vdiff command, just add::
+
+ [hgk]
+ vdiff=vdiff
+
+Revisions context menu will now display additional entries to fire
+vdiff on hovered and selected revisions.
+'''
+
+import os
+from mercurial import commands, util, patch, revlog, scmutil
+from mercurial.node import nullid, nullrev, short
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+def difftree(ui, repo, node1=None, node2=None, *files, **opts):
+ """diff trees from two commits"""
+ def __difftree(repo, node1, node2, files=[]):
+ assert node2 is not None
+ mmap = repo[node1].manifest()
+ mmap2 = repo[node2].manifest()
+ m = scmutil.match(repo[node1], files)
+ modified, added, removed = repo.status(node1, node2, m)[:3]
+ empty = short(nullid)
+
+ for f in modified:
+ # TODO get file permissions
+ ui.write(":100664 100664 %s %s M\t%s\t%s\n" %
+ (short(mmap[f]), short(mmap2[f]), f, f))
+ for f in added:
+ ui.write(":000000 100664 %s %s N\t%s\t%s\n" %
+ (empty, short(mmap2[f]), f, f))
+ for f in removed:
+ ui.write(":100664 000000 %s %s D\t%s\t%s\n" %
+ (short(mmap[f]), empty, f, f))
+ ##
+
+ while True:
+ if opts['stdin']:
+ try:
+ line = raw_input().split(' ')
+ node1 = line[0]
+ if len(line) > 1:
+ node2 = line[1]
+ else:
+ node2 = None
+ except EOFError:
+ break
+ node1 = repo.lookup(node1)
+ if node2:
+ node2 = repo.lookup(node2)
+ else:
+ node2 = node1
+ node1 = repo.changelog.parents(node1)[0]
+ if opts['patch']:
+ if opts['pretty']:
+ catcommit(ui, repo, node2, "")
+ m = scmutil.match(repo[node1], files)
+ chunks = patch.diff(repo, node1, node2, match=m,
+ opts=patch.diffopts(ui, {'git': True}))
+ for chunk in chunks:
+ ui.write(chunk)
+ else:
+ __difftree(repo, node1, node2, files=files)
+ if not opts['stdin']:
+ break
+
+def catcommit(ui, repo, n, prefix, ctx=None):
+ nlprefix = '\n' + prefix
+ if ctx is None:
+ ctx = repo[n]
+ # use ctx.node() instead ??
+ ui.write("tree %s\n" % short(ctx.changeset()[0]))
+ for p in ctx.parents():
+ ui.write("parent %s\n" % p)
+
+ date = ctx.date()
+ description = ctx.description().replace("\0", "")
+ lines = description.splitlines()
+ if lines and lines[-1].startswith('committer:'):
+ committer = lines[-1].split(': ')[1].rstrip()
+ else:
+ committer = ctx.user()
+
+ ui.write("author %s %s %s\n" % (ctx.user(), int(date[0]), date[1]))
+ ui.write("committer %s %s %s\n" % (committer, int(date[0]), date[1]))
+ ui.write("revision %d\n" % ctx.rev())
+ ui.write("branch %s\n\n" % ctx.branch())
+
+ if prefix != "":
+ ui.write("%s%s\n" % (prefix,
+ description.replace('\n', nlprefix).strip()))
+ else:
+ ui.write(description + "\n")
+ if prefix:
+ ui.write('\0')
+
+def base(ui, repo, node1, node2):
+ """output common ancestor information"""
+ node1 = repo.lookup(node1)
+ node2 = repo.lookup(node2)
+ n = repo.changelog.ancestor(node1, node2)
+ ui.write(short(n) + "\n")
+
+def catfile(ui, repo, type=None, r=None, **opts):
+ """cat a specific revision"""
+ # in stdin mode, every line except the commit is prefixed with two
+ # spaces. This way the our caller can find the commit without magic
+ # strings
+ #
+ prefix = ""
+ if opts['stdin']:
+ try:
+ (type, r) = raw_input().split(' ')
+ prefix = " "
+ except EOFError:
+ return
+
+ else:
+ if not type or not r:
+ ui.warn(_("cat-file: type or revision not supplied\n"))
+ commands.help_(ui, 'cat-file')
+
+ while r:
+ if type != "commit":
+ ui.warn(_("aborting hg cat-file only understands commits\n"))
+ return 1
+ n = repo.lookup(r)
+ catcommit(ui, repo, n, prefix)
+ if opts['stdin']:
+ try:
+ (type, r) = raw_input().split(' ')
+ except EOFError:
+ break
+ else:
+ break
+
+# git rev-tree is a confusing thing. You can supply a number of
+# commit sha1s on the command line, and it walks the commit history
+# telling you which commits are reachable from the supplied ones via
+# a bitmask based on arg position.
+# you can specify a commit to stop at by starting the sha1 with ^
+def revtree(ui, args, repo, full="tree", maxnr=0, parents=False):
+ def chlogwalk():
+ count = len(repo)
+ i = count
+ l = [0] * 100
+ chunk = 100
+ while True:
+ if chunk > i:
+ chunk = i
+ i = 0
+ else:
+ i -= chunk
+
+ for x in xrange(chunk):
+ if i + x >= count:
+ l[chunk - x:] = [0] * (chunk - x)
+ break
+ if full is not None:
+ l[x] = repo[i + x]
+ l[x].changeset() # force reading
+ else:
+ l[x] = 1
+ for x in xrange(chunk - 1, -1, -1):
+ if l[x] != 0:
+ yield (i + x, full is not None and l[x] or None)
+ if i == 0:
+ break
+
+ # calculate and return the reachability bitmask for sha
+ def is_reachable(ar, reachable, sha):
+ if len(ar) == 0:
+ return 1
+ mask = 0
+ for i in xrange(len(ar)):
+ if sha in reachable[i]:
+ mask |= 1 << i
+
+ return mask
+
+ reachable = []
+ stop_sha1 = []
+ want_sha1 = []
+ count = 0
+
+ # figure out which commits they are asking for and which ones they
+ # want us to stop on
+ for i, arg in enumerate(args):
+ if arg.startswith('^'):
+ s = repo.lookup(arg[1:])
+ stop_sha1.append(s)
+ want_sha1.append(s)
+ elif arg != 'HEAD':
+ want_sha1.append(repo.lookup(arg))
+
+ # calculate the graph for the supplied commits
+ for i, n in enumerate(want_sha1):
+ reachable.append(set())
+ visit = [n]
+ reachable[i].add(n)
+ while visit:
+ n = visit.pop(0)
+ if n in stop_sha1:
+ continue
+ for p in repo.changelog.parents(n):
+ if p not in reachable[i]:
+ reachable[i].add(p)
+ visit.append(p)
+ if p in stop_sha1:
+ continue
+
+ # walk the repository looking for commits that are in our
+ # reachability graph
+ for i, ctx in chlogwalk():
+ n = repo.changelog.node(i)
+ mask = is_reachable(want_sha1, reachable, n)
+ if mask:
+ parentstr = ""
+ if parents:
+ pp = repo.changelog.parents(n)
+ if pp[0] != nullid:
+ parentstr += " " + short(pp[0])
+ if pp[1] != nullid:
+ parentstr += " " + short(pp[1])
+ if not full:
+ ui.write("%s%s\n" % (short(n), parentstr))
+ elif full == "commit":
+ ui.write("%s%s\n" % (short(n), parentstr))
+ catcommit(ui, repo, n, ' ', ctx)
+ else:
+ (p1, p2) = repo.changelog.parents(n)
+ (h, h1, h2) = map(short, (n, p1, p2))
+ (i1, i2) = map(repo.changelog.rev, (p1, p2))
+
+ date = ctx.date()[0]
+ ui.write("%s %s:%s" % (date, h, mask))
+ mask = is_reachable(want_sha1, reachable, p1)
+ if i1 != nullrev and mask > 0:
+ ui.write("%s:%s " % (h1, mask)),
+ mask = is_reachable(want_sha1, reachable, p2)
+ if i2 != nullrev and mask > 0:
+ ui.write("%s:%s " % (h2, mask))
+ ui.write("\n")
+ if maxnr and count >= maxnr:
+ break
+ count += 1
+
+def revparse(ui, repo, *revs, **opts):
+ """parse given revisions"""
+ def revstr(rev):
+ if rev == 'HEAD':
+ rev = 'tip'
+ return revlog.hex(repo.lookup(rev))
+
+ for r in revs:
+ revrange = r.split(':', 1)
+ ui.write('%s\n' % revstr(revrange[0]))
+ if len(revrange) == 2:
+ ui.write('^%s\n' % revstr(revrange[1]))
+
+# git rev-list tries to order things by date, and has the ability to stop
+# at a given commit without walking the whole repo. TODO add the stop
+# parameter
+def revlist(ui, repo, *revs, **opts):
+ """print revisions"""
+ if opts['header']:
+ full = "commit"
+ else:
+ full = None
+ copy = [x for x in revs]
+ revtree(ui, copy, repo, full, opts['max_count'], opts['parents'])
+
+def config(ui, repo, **opts):
+ """print extension options"""
+ def writeopt(name, value):
+ ui.write('k=%s\nv=%s\n' % (name, value))
+
+ writeopt('vdiff', ui.config('hgk', 'vdiff', ''))
+
+
+def view(ui, repo, *etc, **opts):
+ "start interactive history viewer"
+ os.chdir(repo.root)
+ optstr = ' '.join(['--%s %s' % (k, v) for k, v in opts.iteritems() if v])
+ cmd = ui.config("hgk", "path", "hgk") + " %s %s" % (optstr, " ".join(etc))
+ ui.debug("running %s\n" % cmd)
+ util.system(cmd)
+
+cmdtable = {
+ "^view":
+ (view,
+ [('l', 'limit', '',
+ _('limit number of changes displayed'), _('NUM'))],
+ _('hg view [-l LIMIT] [REVRANGE]')),
+ "debug-diff-tree":
+ (difftree,
+ [('p', 'patch', None, _('generate patch')),
+ ('r', 'recursive', None, _('recursive')),
+ ('P', 'pretty', None, _('pretty')),
+ ('s', 'stdin', None, _('stdin')),
+ ('C', 'copy', None, _('detect copies')),
+ ('S', 'search', "", _('search'))],
+ _('hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]...')),
+ "debug-cat-file":
+ (catfile,
+ [('s', 'stdin', None, _('stdin'))],
+ _('hg debug-cat-file [OPTION]... TYPE FILE')),
+ "debug-config":
+ (config, [], _('hg debug-config')),
+ "debug-merge-base":
+ (base, [], _('hg debug-merge-base REV REV')),
+ "debug-rev-parse":
+ (revparse,
+ [('', 'default', '', _('ignored'))],
+ _('hg debug-rev-parse REV')),
+ "debug-rev-list":
+ (revlist,
+ [('H', 'header', None, _('header')),
+ ('t', 'topo-order', None, _('topo-order')),
+ ('p', 'parents', None, _('parents')),
+ ('n', 'max-count', 0, _('max-count'))],
+ _('hg debug-rev-list [OPTION]... REV...')),
+}
diff --git a/hgext/highlight/__init__.py b/hgext/highlight/__init__.py
new file mode 100644
index 0000000..fc47815
--- /dev/null
+++ b/hgext/highlight/__init__.py
@@ -0,0 +1,64 @@
+# highlight - syntax highlighting in hgweb, based on Pygments
+#
+# Copyright 2008, 2009 Patrick Mezard <pmezard@gmail.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# The original module was split in an interface and an implementation
+# file to defer pygments loading and speedup extension setup.
+
+"""syntax highlighting for hgweb (requires Pygments)
+
+It depends on the Pygments syntax highlighting library:
+http://pygments.org/
+
+There is a single configuration option::
+
+ [web]
+ pygments_style = <style>
+
+The default is 'colorful'.
+"""
+
+import highlight
+from mercurial.hgweb import webcommands, webutil, common
+from mercurial import extensions, encoding
+testedwith = 'internal'
+
+def filerevision_highlight(orig, web, tmpl, fctx):
+ mt = ''.join(tmpl('mimetype', encoding=encoding.encoding))
+ # only pygmentize for mimetype containing 'html' so we both match
+ # 'text/html' and possibly 'application/xhtml+xml' in the future
+ # so that we don't have to touch the extension when the mimetype
+ # for a template changes; also hgweb optimizes the case that a
+ # raw file is sent using rawfile() and doesn't call us, so we
+ # can't clash with the file's content-type here in case we
+ # pygmentize a html file
+ if 'html' in mt:
+ style = web.config('web', 'pygments_style', 'colorful')
+ highlight.pygmentize('fileline', fctx, style, tmpl)
+ return orig(web, tmpl, fctx)
+
+def annotate_highlight(orig, web, req, tmpl):
+ mt = ''.join(tmpl('mimetype', encoding=encoding.encoding))
+ if 'html' in mt:
+ fctx = webutil.filectx(web.repo, req)
+ style = web.config('web', 'pygments_style', 'colorful')
+ highlight.pygmentize('annotateline', fctx, style, tmpl)
+ return orig(web, req, tmpl)
+
+def generate_css(web, req, tmpl):
+ pg_style = web.config('web', 'pygments_style', 'colorful')
+ fmter = highlight.HtmlFormatter(style = pg_style)
+ req.respond(common.HTTP_OK, 'text/css')
+ return ['/* pygments_style = %s */\n\n' % pg_style,
+ fmter.get_style_defs('')]
+
+def extsetup():
+ # monkeypatch in the new version
+ extensions.wrapfunction(webcommands, '_filerevision',
+ filerevision_highlight)
+ extensions.wrapfunction(webcommands, 'annotate', annotate_highlight)
+ webcommands.highlightcss = generate_css
+ webcommands.__all__.append('highlightcss')
diff --git a/hgext/highlight/highlight.py b/hgext/highlight/highlight.py
new file mode 100644
index 0000000..a8265cf
--- /dev/null
+++ b/hgext/highlight/highlight.py
@@ -0,0 +1,61 @@
+# highlight.py - highlight extension implementation file
+#
+# Copyright 2007-2009 Adam Hupp <adam@hupp.org> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# The original module was split in an interface and an implementation
+# file to defer pygments loading and speedup extension setup.
+
+from mercurial import demandimport
+demandimport.ignore.extend(['pkgutil', 'pkg_resources', '__main__'])
+from mercurial import util, encoding
+
+from pygments import highlight
+from pygments.util import ClassNotFound
+from pygments.lexers import guess_lexer, guess_lexer_for_filename, TextLexer
+from pygments.formatters import HtmlFormatter
+
+SYNTAX_CSS = ('\n<link rel="stylesheet" href="{url}highlightcss" '
+ 'type="text/css" />')
+
+def pygmentize(field, fctx, style, tmpl):
+
+ # append a <link ...> to the syntax highlighting css
+ old_header = tmpl.load('header')
+ if SYNTAX_CSS not in old_header:
+ new_header = old_header + SYNTAX_CSS
+ tmpl.cache['header'] = new_header
+
+ text = fctx.data()
+ if util.binary(text):
+ return
+
+ # Pygments is best used with Unicode strings:
+ # <http://pygments.org/docs/unicode/>
+ text = text.decode(encoding.encoding, 'replace')
+
+ # To get multi-line strings right, we can't format line-by-line
+ try:
+ lexer = guess_lexer_for_filename(fctx.path(), text[:1024])
+ except (ClassNotFound, ValueError):
+ try:
+ lexer = guess_lexer(text[:1024])
+ except (ClassNotFound, ValueError):
+ lexer = TextLexer()
+
+ formatter = HtmlFormatter(style=style)
+
+ colorized = highlight(text, lexer, formatter)
+ # strip wrapping div
+ colorized = colorized[:colorized.find('\n</pre>')]
+ colorized = colorized[colorized.find('<pre>')+5:]
+ coloriter = (s.encode(encoding.encoding, 'replace')
+ for s in colorized.splitlines())
+
+ tmpl.filters['colorize'] = lambda x: coloriter.next()
+
+ oldl = tmpl.cache[field]
+ newl = oldl.replace('line|escape', 'line|colorize')
+ tmpl.cache[field] = newl
diff --git a/hgext/histedit.py b/hgext/histedit.py
new file mode 100644
index 0000000..88e0e93
--- /dev/null
+++ b/hgext/histedit.py
@@ -0,0 +1,715 @@
+# histedit.py - interactive history editing for mercurial
+#
+# Copyright 2009 Augie Fackler <raf@durin42.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+"""interactive history editing
+
+With this extension installed, Mercurial gains one new command: histedit. Usage
+is as follows, assuming the following history::
+
+ @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42
+ | Add delta
+ |
+ o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42
+ | Add gamma
+ |
+ o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42
+ | Add beta
+ |
+ o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+
+If you were to run ``hg histedit c561b4e977df``, you would see the following
+file open in your editor::
+
+ pick c561b4e977df Add beta
+ pick 030b686bedc4 Add gamma
+ pick 7c2fd3b9020c Add delta
+
+ # Edit history between 633536316234 and 7c2fd3b9020c
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+
+In this file, lines beginning with ``#`` are ignored. You must specify a rule
+for each revision in your history. For example, if you had meant to add gamma
+before beta, and then wanted to add delta in the same revision as beta, you
+would reorganize the file to look like this::
+
+ pick 030b686bedc4 Add gamma
+ pick c561b4e977df Add beta
+ fold 7c2fd3b9020c Add delta
+
+ # Edit history between 633536316234 and 7c2fd3b9020c
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+
+At which point you close the editor and ``histedit`` starts working. When you
+specify a ``fold`` operation, ``histedit`` will open an editor when it folds
+those revisions together, offering you a chance to clean up the commit message::
+
+ Add beta
+ ***
+ Add delta
+
+Edit the commit message to your liking, then close the editor. For
+this example, let's assume that the commit message was changed to
+``Add beta and delta.`` After histedit has run and had a chance to
+remove any old or temporary revisions it needed, the history looks
+like this::
+
+ @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42
+ | Add beta and delta.
+ |
+ o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
+ | Add gamma
+ |
+ o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+
+Note that ``histedit`` does *not* remove any revisions (even its own temporary
+ones) until after it has completed all the editing operations, so it will
+probably perform several strip operations when it's done. For the above example,
+it had to run strip twice. Strip can be slow depending on a variety of factors,
+so you might need to be a little patient. You can choose to keep the original
+revisions by passing the ``--keep`` flag.
+
+The ``edit`` operation will drop you back to a command prompt,
+allowing you to edit files freely, or even use ``hg record`` to commit
+some changes as a separate commit. When you're done, any remaining
+uncommitted changes will be committed as well. When done, run ``hg
+histedit --continue`` to finish this step. You'll be prompted for a
+new commit message, but the default commit message will be the
+original message for the ``edit`` ed revision.
+
+The ``message`` operation will give you a chance to revise a commit
+message without changing the contents. It's a shortcut for doing
+``edit`` immediately followed by `hg histedit --continue``.
+
+If ``histedit`` encounters a conflict when moving a revision (while
+handling ``pick`` or ``fold``), it'll stop in a similar manner to
+``edit`` with the difference that it won't prompt you for a commit
+message when done. If you decide at this point that you don't like how
+much work it will be to rearrange history, or that you made a mistake,
+you can use ``hg histedit --abort`` to abandon the new changes you
+have made and return to the state before you attempted to edit your
+history.
+
+If we clone the example repository above and add three more changes, such that
+we have the following history::
+
+ @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan
+ | Add theta
+ |
+ o 5 140988835471 2009-04-27 18:04 -0500 stefan
+ | Add eta
+ |
+ o 4 122930637314 2009-04-27 18:04 -0500 stefan
+ | Add zeta
+ |
+ o 3 836302820282 2009-04-27 18:04 -0500 stefan
+ | Add epsilon
+ |
+ o 2 989b4d060121 2009-04-27 18:04 -0500 durin42
+ | Add beta and delta.
+ |
+ o 1 081603921c3f 2009-04-27 18:04 -0500 durin42
+ | Add gamma
+ |
+ o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42
+ Add alpha
+
+If you run ``hg histedit --outgoing`` on the clone then it is the same
+as running ``hg histedit 836302820282``. If you need plan to push to a
+repository that Mercurial does not detect to be related to the source
+repo, you can add a ``--force`` option.
+"""
+
+try:
+ import cPickle as pickle
+except ImportError:
+ import pickle
+import tempfile
+import os
+
+from mercurial import bookmarks
+from mercurial import cmdutil
+from mercurial import discovery
+from mercurial import error
+from mercurial import hg
+from mercurial import lock as lockmod
+from mercurial import node
+from mercurial import patch
+from mercurial import repair
+from mercurial import scmutil
+from mercurial import util
+from mercurial.i18n import _
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
+testedwith = 'internal'
+
+editcomment = _("""# Edit history between %s and %s
+#
+# Commands:
+# p, pick = use commit
+# e, edit = use commit, but stop for amending
+# f, fold = use commit, but fold into previous commit (combines N and N-1)
+# d, drop = remove commit from history
+# m, mess = edit message without changing commit content
+#
+""")
+
+def between(repo, old, new, keep):
+ revs = [old]
+ current = old
+ while current != new:
+ ctx = repo[current]
+ if not keep and len(ctx.children()) > 1:
+ raise util.Abort(_('cannot edit history that would orphan nodes'))
+ if len(ctx.parents()) != 1 and ctx.parents()[1] != node.nullid:
+ raise util.Abort(_("can't edit history with merges"))
+ if not ctx.children():
+ current = new
+ else:
+ current = ctx.children()[0].node()
+ revs.append(current)
+ if len(repo[current].children()) and not keep:
+ raise util.Abort(_('cannot edit history that would orphan nodes'))
+ return revs
+
+
+def pick(ui, repo, ctx, ha, opts):
+ oldctx = repo[ha]
+ if oldctx.parents()[0] == ctx:
+ ui.debug('node %s unchanged\n' % ha)
+ return oldctx, [], [], []
+ hg.update(repo, ctx.node())
+ fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+ fp = os.fdopen(fd, 'w')
+ diffopts = patch.diffopts(ui, opts)
+ diffopts.git = True
+ diffopts.ignorews = False
+ diffopts.ignorewsamount = False
+ diffopts.ignoreblanklines = False
+ gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+ try:
+ files = set()
+ try:
+ patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+ if not files:
+ ui.warn(_('%s: empty changeset')
+ % node.hex(ha))
+ return ctx, [], [], []
+ finally:
+ os.unlink(patchfile)
+ except Exception:
+ raise util.Abort(_('Fix up the change and run '
+ 'hg histedit --continue'))
+ n = repo.commit(text=oldctx.description(), user=oldctx.user(),
+ date=oldctx.date(), extra=oldctx.extra())
+ return repo[n], [n], [oldctx.node()], []
+
+
+def edit(ui, repo, ctx, ha, opts):
+ oldctx = repo[ha]
+ hg.update(repo, ctx.node())
+ fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+ fp = os.fdopen(fd, 'w')
+ diffopts = patch.diffopts(ui, opts)
+ diffopts.git = True
+ diffopts.ignorews = False
+ diffopts.ignorewsamount = False
+ diffopts.ignoreblanklines = False
+ gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+ try:
+ files = set()
+ try:
+ patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+ finally:
+ os.unlink(patchfile)
+ except Exception:
+ pass
+ raise util.Abort(_('Make changes as needed, you may commit or record as '
+ 'needed now.\nWhen you are finished, run hg'
+ ' histedit --continue to resume.'))
+
+def fold(ui, repo, ctx, ha, opts):
+ oldctx = repo[ha]
+ hg.update(repo, ctx.node())
+ fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+ fp = os.fdopen(fd, 'w')
+ diffopts = patch.diffopts(ui, opts)
+ diffopts.git = True
+ diffopts.ignorews = False
+ diffopts.ignorewsamount = False
+ diffopts.ignoreblanklines = False
+ gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+ try:
+ files = set()
+ try:
+ patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+ if not files:
+ ui.warn(_('%s: empty changeset')
+ % node.hex(ha))
+ return ctx, [], [], []
+ finally:
+ os.unlink(patchfile)
+ except Exception:
+ raise util.Abort(_('Fix up the change and run '
+ 'hg histedit --continue'))
+ n = repo.commit(text='fold-temp-revision %s' % ha, user=oldctx.user(),
+ date=oldctx.date(), extra=oldctx.extra())
+ return finishfold(ui, repo, ctx, oldctx, n, opts, [])
+
+def finishfold(ui, repo, ctx, oldctx, newnode, opts, internalchanges):
+ parent = ctx.parents()[0].node()
+ hg.update(repo, parent)
+ fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+ fp = os.fdopen(fd, 'w')
+ diffopts = patch.diffopts(ui, opts)
+ diffopts.git = True
+ diffopts.ignorews = False
+ diffopts.ignorewsamount = False
+ diffopts.ignoreblanklines = False
+ gen = patch.diff(repo, parent, newnode, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+ files = set()
+ try:
+ patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+ finally:
+ os.unlink(patchfile)
+ newmessage = '\n***\n'.join(
+ [ctx.description()] +
+ [repo[r].description() for r in internalchanges] +
+ [oldctx.description()]) + '\n'
+ # If the changesets are from the same author, keep it.
+ if ctx.user() == oldctx.user():
+ username = ctx.user()
+ else:
+ username = ui.username()
+ newmessage = ui.edit(newmessage, username)
+ n = repo.commit(text=newmessage, user=username,
+ date=max(ctx.date(), oldctx.date()), extra=oldctx.extra())
+ return repo[n], [n], [oldctx.node(), ctx.node()], [newnode]
+
+def drop(ui, repo, ctx, ha, opts):
+ return ctx, [], [repo[ha].node()], []
+
+
+def message(ui, repo, ctx, ha, opts):
+ oldctx = repo[ha]
+ hg.update(repo, ctx.node())
+ fd, patchfile = tempfile.mkstemp(prefix='hg-histedit-')
+ fp = os.fdopen(fd, 'w')
+ diffopts = patch.diffopts(ui, opts)
+ diffopts.git = True
+ diffopts.ignorews = False
+ diffopts.ignorewsamount = False
+ diffopts.ignoreblanklines = False
+ gen = patch.diff(repo, oldctx.parents()[0].node(), ha, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+ try:
+ files = set()
+ try:
+ patch.patch(ui, repo, patchfile, files=files, eolmode=None)
+ finally:
+ os.unlink(patchfile)
+ except Exception:
+ raise util.Abort(_('Fix up the change and run '
+ 'hg histedit --continue'))
+ message = oldctx.description() + '\n'
+ message = ui.edit(message, ui.username())
+ new = repo.commit(text=message, user=oldctx.user(), date=oldctx.date(),
+ extra=oldctx.extra())
+ newctx = repo[new]
+ if oldctx.node() != newctx.node():
+ return newctx, [new], [oldctx.node()], []
+ # We didn't make an edit, so just indicate no replaced nodes
+ return newctx, [new], [], []
+
+
+def makedesc(c):
+ summary = ''
+ if c.description():
+ summary = c.description().splitlines()[0]
+ line = 'pick %s %d %s' % (c.hex()[:12], c.rev(), summary)
+ return line[:80] # trim to 80 chars so it's not stupidly wide in my editor
+
+actiontable = {'p': pick,
+ 'pick': pick,
+ 'e': edit,
+ 'edit': edit,
+ 'f': fold,
+ 'fold': fold,
+ 'd': drop,
+ 'drop': drop,
+ 'm': message,
+ 'mess': message,
+ }
+
+@command('histedit',
+ [('', 'commands', '',
+ _('Read history edits from the specified file.')),
+ ('c', 'continue', False, _('continue an edit already in progress')),
+ ('k', 'keep', False,
+ _("don't strip old nodes after edit is complete")),
+ ('', 'abort', False, _('abort an edit in progress')),
+ ('o', 'outgoing', False, _('changesets not found in destination')),
+ ('f', 'force', False,
+ _('force outgoing even for unrelated repositories')),
+ ('r', 'rev', [], _('first revision to be edited'))],
+ _("[PARENT]"))
+def histedit(ui, repo, *parent, **opts):
+ """interactively edit changeset history
+ """
+ # TODO only abort if we try and histedit mq patches, not just
+ # blanket if mq patches are applied somewhere
+ mq = getattr(repo, 'mq', None)
+ if mq and mq.applied:
+ raise util.Abort(_('source has mq patches applied'))
+
+ parent = list(parent) + opts.get('rev', [])
+ if opts.get('outgoing'):
+ if len(parent) > 1:
+ raise util.Abort(
+ _('only one repo argument allowed with --outgoing'))
+ elif parent:
+ parent = parent[0]
+
+ dest = ui.expandpath(parent or 'default-push', parent or 'default')
+ dest, revs = hg.parseurl(dest, None)[:2]
+ ui.status(_('comparing with %s\n') % util.hidepassword(dest))
+
+ revs, checkout = hg.addbranchrevs(repo, repo, revs, None)
+ other = hg.peer(repo, opts, dest)
+
+ if revs:
+ revs = [repo.lookup(rev) for rev in revs]
+
+ parent = discovery.findcommonoutgoing(
+ repo, other, [], force=opts.get('force')).missing[0:1]
+ else:
+ if opts.get('force'):
+ raise util.Abort(_('--force only allowed with --outgoing'))
+
+ if opts.get('continue', False):
+ if len(parent) != 0:
+ raise util.Abort(_('no arguments allowed with --continue'))
+ (parentctxnode, created, replaced,
+ tmpnodes, existing, rules, keep, tip, replacemap) = readstate(repo)
+ currentparent, wantnull = repo.dirstate.parents()
+ parentctx = repo[parentctxnode]
+ # existing is the list of revisions initially considered by
+ # histedit. Here we use it to list new changesets, descendants
+ # of parentctx without an 'existing' changeset in-between. We
+ # also have to exclude 'existing' changesets which were
+ # previously dropped.
+ descendants = set(c.node() for c in
+ repo.set('(%n::) - %n', parentctxnode, parentctxnode))
+ existing = set(existing)
+ notdropped = set(n for n in existing if n in descendants and
+ (n not in replacemap or replacemap[n] in descendants))
+ # Discover any nodes the user has added in the interim. We can
+ # miss changesets which were dropped and recreated the same.
+ newchildren = list(c.node() for c in repo.set(
+ 'sort(%ln - (%ln or %ln::))', descendants, existing, notdropped))
+ action, currentnode = rules.pop(0)
+ if action in ('f', 'fold'):
+ tmpnodes.extend(newchildren)
+ else:
+ created.extend(newchildren)
+
+ m, a, r, d = repo.status()[:4]
+ oldctx = repo[currentnode]
+ message = oldctx.description() + '\n'
+ if action in ('e', 'edit', 'm', 'mess'):
+ message = ui.edit(message, ui.username())
+ elif action in ('f', 'fold'):
+ message = 'fold-temp-revision %s' % currentnode
+ new = None
+ if m or a or r or d:
+ new = repo.commit(text=message, user=oldctx.user(),
+ date=oldctx.date(), extra=oldctx.extra())
+
+ # If we're resuming a fold and we have new changes, mark the
+ # replacements and finish the fold. If not, it's more like a
+ # drop of the changesets that disappeared, and we can skip
+ # this step.
+ if action in ('f', 'fold') and (new or newchildren):
+ if new:
+ tmpnodes.append(new)
+ else:
+ new = newchildren[-1]
+ (parentctx, created_, replaced_, tmpnodes_) = finishfold(
+ ui, repo, parentctx, oldctx, new, opts, newchildren)
+ replaced.extend(replaced_)
+ created.extend(created_)
+ tmpnodes.extend(tmpnodes_)
+ elif action not in ('d', 'drop'):
+ if new != oldctx.node():
+ replaced.append(oldctx.node())
+ if new:
+ if new != oldctx.node():
+ created.append(new)
+ parentctx = repo[new]
+
+ elif opts.get('abort', False):
+ if len(parent) != 0:
+ raise util.Abort(_('no arguments allowed with --abort'))
+ (parentctxnode, created, replaced, tmpnodes,
+ existing, rules, keep, tip, replacemap) = readstate(repo)
+ ui.debug('restore wc to old tip %s\n' % node.hex(tip))
+ hg.clean(repo, tip)
+ ui.debug('should strip created nodes %s\n' %
+ ', '.join([node.hex(n)[:12] for n in created]))
+ ui.debug('should strip temp nodes %s\n' %
+ ', '.join([node.hex(n)[:12] for n in tmpnodes]))
+ for nodes in (created, tmpnodes):
+ lock = None
+ try:
+ lock = repo.lock()
+ for n in reversed(nodes):
+ try:
+ repair.strip(ui, repo, n)
+ except error.LookupError:
+ pass
+ finally:
+ lockmod.release(lock)
+ os.unlink(os.path.join(repo.path, 'histedit-state'))
+ return
+ else:
+ cmdutil.bailifchanged(repo)
+ if os.path.exists(os.path.join(repo.path, 'histedit-state')):
+ raise util.Abort(_('history edit already in progress, try '
+ '--continue or --abort'))
+
+ tip, empty = repo.dirstate.parents()
+
+
+ if len(parent) != 1:
+ raise util.Abort(_('histedit requires exactly one parent revision'))
+ parent = scmutil.revsingle(repo, parent[0]).node()
+
+ keep = opts.get('keep', False)
+ revs = between(repo, parent, tip, keep)
+
+ ctxs = [repo[r] for r in revs]
+ existing = [r.node() for r in ctxs]
+ rules = opts.get('commands', '')
+ if not rules:
+ rules = '\n'.join([makedesc(c) for c in ctxs])
+ rules += '\n\n'
+ rules += editcomment % (node.hex(parent)[:12], node.hex(tip)[:12])
+ rules = ui.edit(rules, ui.username())
+ # Save edit rules in .hg/histedit-last-edit.txt in case
+ # the user needs to ask for help after something
+ # surprising happens.
+ f = open(repo.join('histedit-last-edit.txt'), 'w')
+ f.write(rules)
+ f.close()
+ else:
+ f = open(rules)
+ rules = f.read()
+ f.close()
+ rules = [l for l in (r.strip() for r in rules.splitlines())
+ if l and not l[0] == '#']
+ rules = verifyrules(rules, repo, ctxs)
+
+ parentctx = repo[parent].parents()[0]
+ keep = opts.get('keep', False)
+ replaced = []
+ replacemap = {}
+ tmpnodes = []
+ created = []
+
+
+ while rules:
+ writestate(repo, parentctx.node(), created, replaced,
+ tmpnodes, existing, rules, keep, tip, replacemap)
+ action, ha = rules.pop(0)
+ (parentctx, created_, replaced_, tmpnodes_) = actiontable[action](
+ ui, repo, parentctx, ha, opts)
+
+ if replaced_:
+ clen, rlen = len(created_), len(replaced_)
+ if clen == rlen == 1:
+ ui.debug('histedit: exact replacement of %s with %s\n' % (
+ node.short(replaced_[0]), node.short(created_[0])))
+
+ replacemap[replaced_[0]] = created_[0]
+ elif clen > rlen:
+ assert rlen == 1, ('unexpected replacement of '
+ '%d changes with %d changes' % (rlen, clen))
+ # made more changesets than we're replacing
+ # TODO synthesize patch names for created patches
+ replacemap[replaced_[0]] = created_[-1]
+ ui.debug('histedit: created many, assuming %s replaced by %s' %
+ (node.short(replaced_[0]), node.short(created_[-1])))
+ elif rlen > clen:
+ if not created_:
+ # This must be a drop. Try and put our metadata on
+ # the parent change.
+ assert rlen == 1
+ r = replaced_[0]
+ ui.debug('histedit: %s seems replaced with nothing, '
+ 'finding a parent\n' % (node.short(r)))
+ pctx = repo[r].parents()[0]
+ if pctx.node() in replacemap:
+ ui.debug('histedit: parent is already replaced\n')
+ replacemap[r] = replacemap[pctx.node()]
+ else:
+ replacemap[r] = pctx.node()
+ ui.debug('histedit: %s best replaced by %s\n' % (
+ node.short(r), node.short(replacemap[r])))
+ else:
+ assert len(created_) == 1
+ for r in replaced_:
+ ui.debug('histedit: %s replaced by %s\n' % (
+ node.short(r), node.short(created_[0])))
+ replacemap[r] = created_[0]
+ else:
+ assert False, (
+ 'Unhandled case in replacement mapping! '
+ 'replacing %d changes with %d changes' % (rlen, clen))
+ created.extend(created_)
+ replaced.extend(replaced_)
+ tmpnodes.extend(tmpnodes_)
+
+ hg.update(repo, parentctx.node())
+
+ if not keep:
+ if replacemap:
+ ui.note(_('histedit: Should update metadata for the following '
+ 'changes:\n'))
+
+ def copybms(old, new):
+ if old in tmpnodes or old in created:
+ # can't have any metadata we'd want to update
+ return
+ while new in replacemap:
+ new = replacemap[new]
+ ui.note(_('histedit: %s to %s\n') % (node.short(old),
+ node.short(new)))
+ octx = repo[old]
+ marks = octx.bookmarks()
+ if marks:
+ ui.note(_('histedit: moving bookmarks %s\n') %
+ ', '.join(marks))
+ for mark in marks:
+ repo._bookmarks[mark] = new
+ bookmarks.write(repo)
+
+ # We assume that bookmarks on the tip should remain
+ # tipmost, but bookmarks on non-tip changesets should go
+ # to their most reasonable successor. As a result, find
+ # the old tip and new tip and copy those bookmarks first,
+ # then do the rest of the bookmark copies.
+ oldtip = sorted(replacemap.keys(), key=repo.changelog.rev)[-1]
+ newtip = sorted(replacemap.values(), key=repo.changelog.rev)[-1]
+ copybms(oldtip, newtip)
+
+ for old, new in sorted(replacemap.iteritems()):
+ copybms(old, new)
+ # TODO update mq state
+
+ ui.debug('should strip replaced nodes %s\n' %
+ ', '.join([node.hex(n)[:12] for n in replaced]))
+ lock = None
+ try:
+ lock = repo.lock()
+ for n in sorted(replaced, key=lambda x: repo[x].rev()):
+ try:
+ repair.strip(ui, repo, n)
+ except error.LookupError:
+ pass
+ finally:
+ lockmod.release(lock)
+
+ ui.debug('should strip temp nodes %s\n' %
+ ', '.join([node.hex(n)[:12] for n in tmpnodes]))
+ lock = None
+ try:
+ lock = repo.lock()
+ for n in reversed(tmpnodes):
+ try:
+ repair.strip(ui, repo, n)
+ except error.LookupError:
+ pass
+ finally:
+ lockmod.release(lock)
+ os.unlink(os.path.join(repo.path, 'histedit-state'))
+ if os.path.exists(repo.sjoin('undo')):
+ os.unlink(repo.sjoin('undo'))
+
+
+def writestate(repo, parentctxnode, created, replaced,
+ tmpnodes, existing, rules, keep, oldtip, replacemap):
+ fp = open(os.path.join(repo.path, 'histedit-state'), 'w')
+ pickle.dump((parentctxnode, created, replaced,
+ tmpnodes, existing, rules, keep, oldtip, replacemap),
+ fp)
+ fp.close()
+
+def readstate(repo):
+ """Returns a tuple of (parentnode, created, replaced, tmp, existing, rules,
+ keep, oldtip, replacemap ).
+ """
+ fp = open(os.path.join(repo.path, 'histedit-state'))
+ return pickle.load(fp)
+
+
+def verifyrules(rules, repo, ctxs):
+ """Verify that there exists exactly one edit rule per given changeset.
+
+ Will abort if there are to many or too few rules, a malformed rule,
+ or a rule on a changeset outside of the user-given range.
+ """
+ parsed = []
+ if len(rules) != len(ctxs):
+ raise util.Abort(_('must specify a rule for each changeset once'))
+ for r in rules:
+ if ' ' not in r:
+ raise util.Abort(_('malformed line "%s"') % r)
+ action, rest = r.split(' ', 1)
+ if ' ' in rest.strip():
+ ha, rest = rest.split(' ', 1)
+ else:
+ ha = r.strip()
+ try:
+ if repo[ha] not in ctxs:
+ raise util.Abort(
+ _('may not use changesets other than the ones listed'))
+ except error.RepoError:
+ raise util.Abort(_('unknown changeset %s listed') % ha)
+ if action not in actiontable:
+ raise util.Abort(_('unknown action "%s"') % action)
+ parsed.append([action, ha])
+ return parsed
diff --git a/hgext/inotify/__init__.py b/hgext/inotify/__init__.py
new file mode 100644
index 0000000..09c8bef
--- /dev/null
+++ b/hgext/inotify/__init__.py
@@ -0,0 +1,93 @@
+# __init__.py - inotify-based status acceleration for Linux
+#
+# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
+# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''accelerate status report using Linux's inotify service'''
+
+# todo: socket permissions
+
+from mercurial.i18n import _
+from mercurial import util
+import server
+from client import client, QueryFailed
+
+testedwith = 'internal'
+
+def serve(ui, repo, **opts):
+ '''start an inotify server for this repository'''
+ server.start(ui, repo.dirstate, repo.root, opts)
+
+def debuginotify(ui, repo, **opts):
+ '''debugging information for inotify extension
+
+ Prints the list of directories being watched by the inotify server.
+ '''
+ cli = client(ui, repo)
+ response = cli.debugquery()
+
+ ui.write(_('directories being watched:\n'))
+ for path in response:
+ ui.write((' %s/\n') % path)
+
+def reposetup(ui, repo):
+ if not util.safehasattr(repo, 'dirstate'):
+ return
+
+ class inotifydirstate(repo.dirstate.__class__):
+
+ # We'll set this to false after an unsuccessful attempt so that
+ # next calls of status() within the same instance don't try again
+ # to start an inotify server if it won't start.
+ _inotifyon = True
+
+ def status(self, match, subrepos, ignored, clean, unknown):
+ files = match.files()
+ if '.' in files:
+ files = []
+ if (self._inotifyon and not ignored and not subrepos and
+ not self._dirty):
+ cli = client(ui, repo)
+ try:
+ result = cli.statusquery(files, match, False,
+ clean, unknown)
+ except QueryFailed, instr:
+ ui.debug(str(instr))
+ # don't retry within the same hg instance
+ inotifydirstate._inotifyon = False
+ pass
+ else:
+ if ui.config('inotify', 'debug'):
+ r2 = super(inotifydirstate, self).status(
+ match, [], False, clean, unknown)
+ for c, a, b in zip('LMARDUIC', result, r2):
+ for f in a:
+ if f not in b:
+ ui.warn('*** inotify: %s +%s\n' % (c, f))
+ for f in b:
+ if f not in a:
+ ui.warn('*** inotify: %s -%s\n' % (c, f))
+ result = r2
+ return result
+ return super(inotifydirstate, self).status(
+ match, subrepos, ignored, clean, unknown)
+
+ repo.dirstate.__class__ = inotifydirstate
+
+cmdtable = {
+ 'debuginotify':
+ (debuginotify, [], ('hg debuginotify')),
+ '^inserve':
+ (serve,
+ [('d', 'daemon', None, _('run server in background')),
+ ('', 'daemon-pipefds', '',
+ _('used internally by daemon mode'), _('NUM')),
+ ('t', 'idle-timeout', '',
+ _('minutes to sit idle before exiting'), _('NUM')),
+ ('', 'pid-file', '',
+ _('name of file to write process ID to'), _('FILE'))],
+ _('hg inserve [OPTION]...')),
+ }
diff --git a/hgext/inotify/client.py b/hgext/inotify/client.py
new file mode 100644
index 0000000..0142b18
--- /dev/null
+++ b/hgext/inotify/client.py
@@ -0,0 +1,172 @@
+# client.py - inotify status client
+#
+# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
+# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
+# Copyright 2009 Nicolas Dumazet <nicdumz@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.i18n import _
+import common, server
+import errno, os, socket, struct
+
+class QueryFailed(Exception):
+ pass
+
+def start_server(function):
+ """
+ Decorator.
+ Tries to call function, if it fails, try to (re)start inotify server.
+ Raise QueryFailed if something went wrong
+ """
+ def decorated_function(self, *args):
+ try:
+ return function(self, *args)
+ except (OSError, socket.error), err:
+ autostart = self.ui.configbool('inotify', 'autostart', True)
+
+ if err.args[0] == errno.ECONNREFUSED:
+ self.ui.warn(_('inotify-client: found dead inotify server '
+ 'socket; removing it\n'))
+ os.unlink(os.path.join(self.root, '.hg', 'inotify.sock'))
+ if err.args[0] in (errno.ECONNREFUSED, errno.ENOENT) and autostart:
+ try:
+ try:
+ server.start(self.ui, self.dirstate, self.root,
+ dict(daemon=True, daemon_pipefds=''))
+ except server.AlreadyStartedException, inst:
+ # another process may have started its own
+ # inotify server while this one was starting.
+ self.ui.debug(str(inst))
+ except Exception, inst:
+ self.ui.warn(_('inotify-client: could not start inotify '
+ 'server: %s\n') % inst)
+ else:
+ try:
+ return function(self, *args)
+ except socket.error, err:
+ self.ui.warn(_('inotify-client: could not talk to new '
+ 'inotify server: %s\n') % err.args[-1])
+ elif err.args[0] in (errno.ECONNREFUSED, errno.ENOENT):
+ # silently ignore normal errors if autostart is False
+ self.ui.debug('(inotify server not running)\n')
+ else:
+ self.ui.warn(_('inotify-client: failed to contact inotify '
+ 'server: %s\n') % err.args[-1])
+
+ self.ui.traceback()
+ raise QueryFailed('inotify query failed')
+
+ return decorated_function
+
+
+class client(object):
+ def __init__(self, ui, repo):
+ self.ui = ui
+ self.dirstate = repo.dirstate
+ self.root = repo.root
+ self.sock = socket.socket(socket.AF_UNIX)
+
+ def _connect(self):
+ sockpath = os.path.join(self.root, '.hg', 'inotify.sock')
+ try:
+ self.sock.connect(sockpath)
+ except socket.error, err:
+ if err.args[0] == "AF_UNIX path too long":
+ sockpath = os.readlink(sockpath)
+ self.sock.connect(sockpath)
+ else:
+ raise
+
+ def _send(self, type, data):
+ """Sends protocol version number, and the data"""
+ self.sock.sendall(chr(common.version) + type + data)
+
+ self.sock.shutdown(socket.SHUT_WR)
+
+ def _receive(self, type):
+ """
+ Read data, check version number, extract headers,
+ and returns a tuple (data descriptor, header)
+ Raises QueryFailed on error
+ """
+ cs = common.recvcs(self.sock)
+ try:
+ version = ord(cs.read(1))
+ except TypeError:
+ # empty answer, assume the server crashed
+ self.ui.warn(_('inotify-client: received empty answer from inotify '
+ 'server'))
+ raise QueryFailed('server crashed')
+
+ if version != common.version:
+ self.ui.warn(_('(inotify: received response from incompatible '
+ 'server version %d)\n') % version)
+ raise QueryFailed('incompatible server version')
+
+ readtype = cs.read(4)
+ if readtype != type:
+ self.ui.warn(_('(inotify: received \'%s\' response when expecting'
+ ' \'%s\')\n') % (readtype, type))
+ raise QueryFailed('wrong response type')
+
+ hdrfmt = common.resphdrfmts[type]
+ hdrsize = common.resphdrsizes[type]
+ try:
+ resphdr = struct.unpack(hdrfmt, cs.read(hdrsize))
+ except struct.error:
+ raise QueryFailed('unable to retrieve query response headers')
+
+ return cs, resphdr
+
+ def query(self, type, req):
+ self._connect()
+
+ self._send(type, req)
+
+ return self._receive(type)
+
+ @start_server
+ def statusquery(self, names, match, ignored, clean, unknown=True):
+
+ def genquery():
+ for n in names:
+ yield n
+ states = 'almrx!'
+ if ignored:
+ raise ValueError('this is insanity')
+ if clean:
+ states += 'c'
+ if unknown:
+ states += '?'
+ yield states
+
+ req = '\0'.join(genquery())
+
+ cs, resphdr = self.query('STAT', req)
+
+ def readnames(nbytes):
+ if nbytes:
+ names = cs.read(nbytes)
+ if names:
+ return filter(match, names.split('\0'))
+ return []
+ results = tuple(map(readnames, resphdr[:-1]))
+
+ if names:
+ nbytes = resphdr[-1]
+ vdirs = cs.read(nbytes)
+ if vdirs:
+ for vdir in vdirs.split('\0'):
+ match.dir(vdir)
+
+ return results
+
+ @start_server
+ def debugquery(self):
+ cs, resphdr = self.query('DBUG', '')
+
+ nbytes = resphdr[0]
+ names = cs.read(nbytes)
+ return names.split('\0')
diff --git a/hgext/inotify/common.py b/hgext/inotify/common.py
new file mode 100644
index 0000000..8a5ea1d
--- /dev/null
+++ b/hgext/inotify/common.py
@@ -0,0 +1,53 @@
+# server.py - inotify common protocol code
+#
+# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
+# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import cStringIO, socket, struct
+
+"""
+ Protocol between inotify clients and server:
+
+ Client sending query:
+ 1) send protocol version number
+ 2) send query type (string, 4 letters long)
+ 3) send query parameters:
+ - For STAT, N+1 \0-separated strings:
+ 1) N different names that need checking
+ 2) 1 string containing all the status types to match
+ - No parameter needed for DBUG
+
+ Server sending query answer:
+ 1) send protocol version number
+ 2) send query type
+ 3) send struct.pack'ed headers describing the length of the content:
+ e.g. for STAT, receive 9 integers describing the length of the
+ 9 \0-separated string lists to be read:
+ * one file list for each lmar!?ic status type
+ * one list containing the directories visited during lookup
+
+"""
+
+version = 3
+
+resphdrfmts = {
+ 'STAT': '>lllllllll', # status requests
+ 'DBUG': '>l' # debugging queries
+}
+resphdrsizes = dict((k, struct.calcsize(v))
+ for k, v in resphdrfmts.iteritems())
+
+def recvcs(sock):
+ cs = cStringIO.StringIO()
+ s = True
+ try:
+ while s:
+ s = sock.recv(65536)
+ cs.write(s)
+ finally:
+ sock.shutdown(socket.SHUT_RD)
+ cs.seek(0)
+ return cs
diff --git a/hgext/inotify/linux/__init__.py b/hgext/inotify/linux/__init__.py
new file mode 100644
index 0000000..8a1bafd
--- /dev/null
+++ b/hgext/inotify/linux/__init__.py
@@ -0,0 +1,44 @@
+# __init__.py - low-level interfaces to the Linux inotify subsystem
+
+# Copyright 2006 Bryan O'Sullivan <bos@serpentine.com>
+
+# This library is free software; you can redistribute it and/or modify
+# it under the terms of version 2.1 of the GNU Lesser General Public
+# License, or any later version.
+
+'''Low-level interface to the Linux inotify subsystem.
+
+The inotify subsystem provides an efficient mechanism for file status
+monitoring and change notification.
+
+This package provides the low-level inotify system call interface and
+associated constants and helper functions.
+
+For a higher-level interface that remains highly efficient, use the
+inotify.watcher package.'''
+
+__author__ = "Bryan O'Sullivan <bos@serpentine.com>"
+
+from _inotify import *
+
+procfs_path = '/proc/sys/fs/inotify'
+
+def _read_procfs_value(name):
+ def read_value():
+ try:
+ fp = open(procfs_path + '/' + name)
+ r = int(fp.read())
+ fp.close()
+ return r
+ except OSError:
+ return None
+
+ read_value.__doc__ = '''Return the value of the %s setting from /proc.
+
+ If inotify is not enabled on this system, return None.''' % name
+
+ return read_value
+
+max_queued_events = _read_procfs_value('max_queued_events')
+max_user_instances = _read_procfs_value('max_user_instances')
+max_user_watches = _read_procfs_value('max_user_watches')
diff --git a/hgext/inotify/linux/_inotify.c b/hgext/inotify/linux/_inotify.c
new file mode 100644
index 0000000..5e31b85
--- /dev/null
+++ b/hgext/inotify/linux/_inotify.c
@@ -0,0 +1,649 @@
+/*
+ * _inotify.c - Python extension interfacing to the Linux inotify subsystem
+ *
+ * Copyright 2006 Bryan O'Sullivan <bos@serpentine.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of version 2.1 of the GNU Lesser General
+ * Public License or any later version.
+ */
+
+#include <Python.h>
+#include <alloca.h>
+#include <sys/inotify.h>
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include <util.h>
+
+/* Variables used in the event string representation */
+static PyObject *join;
+static PyObject *er_wm;
+static PyObject *er_wmc;
+static PyObject *er_wmn;
+static PyObject *er_wmcn;
+
+static PyObject *init(PyObject *self, PyObject *args)
+{
+ PyObject *ret = NULL;
+ int fd = -1;
+
+ if (!PyArg_ParseTuple(args, ":init"))
+ goto bail;
+
+ Py_BEGIN_ALLOW_THREADS;
+ fd = inotify_init();
+ Py_END_ALLOW_THREADS;
+
+ if (fd == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ goto bail;
+ }
+
+ ret = PyInt_FromLong(fd);
+ if (ret == NULL)
+ goto bail;
+
+ goto done;
+
+bail:
+ if (fd != -1)
+ close(fd);
+
+ Py_CLEAR(ret);
+
+done:
+ return ret;
+}
+
+PyDoc_STRVAR(
+ init_doc,
+ "init() -> fd\n"
+ "\n"
+ "Initialise an inotify instance.\n"
+ "Return a file descriptor associated with a new inotify event queue.");
+
+static PyObject *add_watch(PyObject *self, PyObject *args)
+{
+ PyObject *ret = NULL;
+ uint32_t mask;
+ int wd = -1;
+ char *path;
+ int fd;
+
+ if (!PyArg_ParseTuple(args, "isI:add_watch", &fd, &path, &mask))
+ goto bail;
+
+ Py_BEGIN_ALLOW_THREADS;
+ wd = inotify_add_watch(fd, path, mask);
+ Py_END_ALLOW_THREADS;
+
+ if (wd == -1) {
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
+ goto bail;
+ }
+
+ ret = PyInt_FromLong(wd);
+ if (ret == NULL)
+ goto bail;
+
+ goto done;
+
+bail:
+ if (wd != -1)
+ inotify_rm_watch(fd, wd);
+
+ Py_CLEAR(ret);
+
+done:
+ return ret;
+}
+
+PyDoc_STRVAR(
+ add_watch_doc,
+ "add_watch(fd, path, mask) -> wd\n"
+ "\n"
+ "Add a watch to an inotify instance, or modify an existing watch.\n"
+ "\n"
+ " fd: file descriptor returned by init()\n"
+ " path: path to watch\n"
+ " mask: mask of events to watch for\n"
+ "\n"
+ "Return a unique numeric watch descriptor for the inotify instance\n"
+ "mapped by the file descriptor.");
+
+static PyObject *remove_watch(PyObject *self, PyObject *args)
+{
+ uint32_t wd;
+ int fd;
+ int r;
+
+ if (!PyArg_ParseTuple(args, "iI:remove_watch", &fd, &wd))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS;
+ r = inotify_rm_watch(fd, wd);
+ Py_END_ALLOW_THREADS;
+
+ if (r == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ return NULL;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+PyDoc_STRVAR(
+ remove_watch_doc,
+ "remove_watch(fd, wd)\n"
+ "\n"
+ " fd: file descriptor returned by init()\n"
+ " wd: watch descriptor returned by add_watch()\n"
+ "\n"
+ "Remove a watch associated with the watch descriptor wd from the\n"
+ "inotify instance associated with the file descriptor fd.\n"
+ "\n"
+ "Removing a watch causes an IN_IGNORED event to be generated for this\n"
+ "watch descriptor.");
+
+#define bit_name(x) {x, #x}
+
+static struct {
+ int bit;
+ const char *name;
+ PyObject *pyname;
+} bit_names[] = {
+ bit_name(IN_ACCESS),
+ bit_name(IN_MODIFY),
+ bit_name(IN_ATTRIB),
+ bit_name(IN_CLOSE_WRITE),
+ bit_name(IN_CLOSE_NOWRITE),
+ bit_name(IN_OPEN),
+ bit_name(IN_MOVED_FROM),
+ bit_name(IN_MOVED_TO),
+ bit_name(IN_CREATE),
+ bit_name(IN_DELETE),
+ bit_name(IN_DELETE_SELF),
+ bit_name(IN_MOVE_SELF),
+ bit_name(IN_UNMOUNT),
+ bit_name(IN_Q_OVERFLOW),
+ bit_name(IN_IGNORED),
+ bit_name(IN_ONLYDIR),
+ bit_name(IN_DONT_FOLLOW),
+ bit_name(IN_MASK_ADD),
+ bit_name(IN_ISDIR),
+ bit_name(IN_ONESHOT),
+ {0}
+};
+
+static PyObject *decode_mask(int mask)
+{
+ PyObject *ret = PyList_New(0);
+ int i;
+
+ if (ret == NULL)
+ goto bail;
+
+ for (i = 0; bit_names[i].bit; i++) {
+ if (mask & bit_names[i].bit) {
+ if (bit_names[i].pyname == NULL) {
+ bit_names[i].pyname = PyString_FromString(bit_names[i].name);
+ if (bit_names[i].pyname == NULL)
+ goto bail;
+ }
+ Py_INCREF(bit_names[i].pyname);
+ if (PyList_Append(ret, bit_names[i].pyname) == -1)
+ goto bail;
+ }
+ }
+
+ goto done;
+
+bail:
+ Py_CLEAR(ret);
+
+done:
+ return ret;
+}
+
+static PyObject *pydecode_mask(PyObject *self, PyObject *args)
+{
+ int mask;
+
+ if (!PyArg_ParseTuple(args, "i:decode_mask", &mask))
+ return NULL;
+
+ return decode_mask(mask);
+}
+
+PyDoc_STRVAR(
+ decode_mask_doc,
+ "decode_mask(mask) -> list_of_strings\n"
+ "\n"
+ "Decode an inotify mask value into a list of strings that give the\n"
+ "name of each bit set in the mask.");
+
+static char doc[] = "Low-level inotify interface wrappers.";
+
+static void define_const(PyObject *dict, const char *name, uint32_t val)
+{
+ PyObject *pyval = PyInt_FromLong(val);
+ PyObject *pyname = PyString_FromString(name);
+
+ if (!pyname || !pyval)
+ goto bail;
+
+ PyDict_SetItem(dict, pyname, pyval);
+
+bail:
+ Py_XDECREF(pyname);
+ Py_XDECREF(pyval);
+}
+
+static void define_consts(PyObject *dict)
+{
+ define_const(dict, "IN_ACCESS", IN_ACCESS);
+ define_const(dict, "IN_MODIFY", IN_MODIFY);
+ define_const(dict, "IN_ATTRIB", IN_ATTRIB);
+ define_const(dict, "IN_CLOSE_WRITE", IN_CLOSE_WRITE);
+ define_const(dict, "IN_CLOSE_NOWRITE", IN_CLOSE_NOWRITE);
+ define_const(dict, "IN_OPEN", IN_OPEN);
+ define_const(dict, "IN_MOVED_FROM", IN_MOVED_FROM);
+ define_const(dict, "IN_MOVED_TO", IN_MOVED_TO);
+
+ define_const(dict, "IN_CLOSE", IN_CLOSE);
+ define_const(dict, "IN_MOVE", IN_MOVE);
+
+ define_const(dict, "IN_CREATE", IN_CREATE);
+ define_const(dict, "IN_DELETE", IN_DELETE);
+ define_const(dict, "IN_DELETE_SELF", IN_DELETE_SELF);
+ define_const(dict, "IN_MOVE_SELF", IN_MOVE_SELF);
+ define_const(dict, "IN_UNMOUNT", IN_UNMOUNT);
+ define_const(dict, "IN_Q_OVERFLOW", IN_Q_OVERFLOW);
+ define_const(dict, "IN_IGNORED", IN_IGNORED);
+
+ define_const(dict, "IN_ONLYDIR", IN_ONLYDIR);
+ define_const(dict, "IN_DONT_FOLLOW", IN_DONT_FOLLOW);
+ define_const(dict, "IN_MASK_ADD", IN_MASK_ADD);
+ define_const(dict, "IN_ISDIR", IN_ISDIR);
+ define_const(dict, "IN_ONESHOT", IN_ONESHOT);
+ define_const(dict, "IN_ALL_EVENTS", IN_ALL_EVENTS);
+}
+
+struct event {
+ PyObject_HEAD
+ PyObject *wd;
+ PyObject *mask;
+ PyObject *cookie;
+ PyObject *name;
+};
+
+static PyObject *event_wd(PyObject *self, void *x)
+{
+ struct event *evt = (struct event *)self;
+ Py_INCREF(evt->wd);
+ return evt->wd;
+}
+
+static PyObject *event_mask(PyObject *self, void *x)
+{
+ struct event *evt = (struct event *)self;
+ Py_INCREF(evt->mask);
+ return evt->mask;
+}
+
+static PyObject *event_cookie(PyObject *self, void *x)
+{
+ struct event *evt = (struct event *)self;
+ Py_INCREF(evt->cookie);
+ return evt->cookie;
+}
+
+static PyObject *event_name(PyObject *self, void *x)
+{
+ struct event *evt = (struct event *)self;
+ Py_INCREF(evt->name);
+ return evt->name;
+}
+
+static struct PyGetSetDef event_getsets[] = {
+ {"wd", event_wd, NULL,
+ "watch descriptor"},
+ {"mask", event_mask, NULL,
+ "event mask"},
+ {"cookie", event_cookie, NULL,
+ "rename cookie, if rename-related event"},
+ {"name", event_name, NULL,
+ "file name"},
+ {NULL}
+};
+
+PyDoc_STRVAR(
+ event_doc,
+ "event: Structure describing an inotify event.");
+
+static PyObject *event_new(PyTypeObject *t, PyObject *a, PyObject *k)
+{
+ return (*t->tp_alloc)(t, 0);
+}
+
+static void event_dealloc(struct event *evt)
+{
+ Py_XDECREF(evt->wd);
+ Py_XDECREF(evt->mask);
+ Py_XDECREF(evt->cookie);
+ Py_XDECREF(evt->name);
+
+ Py_TYPE(evt)->tp_free(evt);
+}
+
+static PyObject *event_repr(struct event *evt)
+{
+ int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie);
+ PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL;
+ PyObject *tuple = NULL, *formatstr = NULL;
+
+ pymasks = decode_mask(PyInt_AsLong(evt->mask));
+ if (pymasks == NULL)
+ goto bail;
+
+ pymask = _PyString_Join(join, pymasks);
+ if (pymask == NULL)
+ goto bail;
+
+ if (evt->name != Py_None) {
+ if (cookie == -1) {
+ formatstr = er_wmn;
+ tuple = PyTuple_Pack(3, evt->wd, pymask, evt->name);
+ }
+ else {
+ formatstr = er_wmcn;
+ tuple = PyTuple_Pack(4, evt->wd, pymask,
+ evt->cookie, evt->name);
+ }
+ } else {
+ if (cookie == -1) {
+ formatstr = er_wm;
+ tuple = PyTuple_Pack(2, evt->wd, pymask);
+ }
+ else {
+ formatstr = er_wmc;
+ tuple = PyTuple_Pack(3, evt->wd, pymask, evt->cookie);
+ }
+ }
+
+ if (tuple == NULL)
+ goto bail;
+
+ ret = PyNumber_Remainder(formatstr, tuple);
+
+ if (ret == NULL)
+ goto bail;
+
+ goto done;
+bail:
+ Py_CLEAR(ret);
+
+done:
+ Py_XDECREF(pymask);
+ Py_XDECREF(pymasks);
+ Py_XDECREF(tuple);
+
+ return ret;
+}
+
+static PyTypeObject event_type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "_inotify.event", /*tp_name*/
+ sizeof(struct event), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)event_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ (reprfunc)event_repr, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ event_doc, /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ event_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ event_new, /* tp_new */
+};
+
+PyObject *read_events(PyObject *self, PyObject *args)
+{
+ PyObject *ctor_args = NULL;
+ PyObject *pybufsize = NULL;
+ PyObject *ret = NULL;
+ int bufsize = 65536;
+ char *buf = NULL;
+ int nread, pos;
+ int fd;
+
+ if (!PyArg_ParseTuple(args, "i|O:read", &fd, &pybufsize))
+ goto bail;
+
+ if (pybufsize && pybufsize != Py_None)
+ bufsize = PyInt_AsLong(pybufsize);
+
+ ret = PyList_New(0);
+ if (ret == NULL)
+ goto bail;
+
+ if (bufsize <= 0) {
+ int r;
+
+ Py_BEGIN_ALLOW_THREADS;
+ r = ioctl(fd, FIONREAD, &bufsize);
+ Py_END_ALLOW_THREADS;
+
+ if (r == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ goto bail;
+ }
+ if (bufsize == 0)
+ goto done;
+ }
+ else {
+ static long name_max;
+ static long name_fd = -1;
+ long min;
+
+ if (name_fd != fd) {
+ name_fd = fd;
+ Py_BEGIN_ALLOW_THREADS;
+ name_max = fpathconf(fd, _PC_NAME_MAX);
+ Py_END_ALLOW_THREADS;
+ }
+
+ min = sizeof(struct inotify_event) + name_max + 1;
+
+ if (bufsize < min) {
+ PyErr_Format(PyExc_ValueError,
+ "bufsize must be at least %d", (int)min);
+ goto bail;
+ }
+ }
+
+ buf = alloca(bufsize);
+
+ Py_BEGIN_ALLOW_THREADS;
+ nread = read(fd, buf, bufsize);
+ Py_END_ALLOW_THREADS;
+
+ if (nread == -1) {
+ PyErr_SetFromErrno(PyExc_OSError);
+ goto bail;
+ }
+
+ ctor_args = PyTuple_New(0);
+
+ if (ctor_args == NULL)
+ goto bail;
+
+ pos = 0;
+
+ while (pos < nread) {
+ struct inotify_event *in = (struct inotify_event *)(buf + pos);
+ struct event *evt;
+ PyObject *obj;
+
+ obj = PyObject_CallObject((PyObject *)&event_type, ctor_args);
+
+ if (obj == NULL)
+ goto bail;
+
+ evt = (struct event *)obj;
+
+ evt->wd = PyInt_FromLong(in->wd);
+ evt->mask = PyInt_FromLong(in->mask);
+ if (in->mask & IN_MOVE)
+ evt->cookie = PyInt_FromLong(in->cookie);
+ else {
+ Py_INCREF(Py_None);
+ evt->cookie = Py_None;
+ }
+ if (in->len)
+ evt->name = PyString_FromString(in->name);
+ else {
+ Py_INCREF(Py_None);
+ evt->name = Py_None;
+ }
+
+ if (!evt->wd || !evt->mask || !evt->cookie || !evt->name)
+ goto mybail;
+
+ if (PyList_Append(ret, obj) == -1)
+ goto mybail;
+
+ pos += sizeof(struct inotify_event) + in->len;
+ continue;
+
+ mybail:
+ Py_CLEAR(evt->wd);
+ Py_CLEAR(evt->mask);
+ Py_CLEAR(evt->cookie);
+ Py_CLEAR(evt->name);
+ Py_DECREF(obj);
+
+ goto bail;
+ }
+
+ goto done;
+
+bail:
+ Py_CLEAR(ret);
+
+done:
+ Py_XDECREF(ctor_args);
+
+ return ret;
+}
+
+static int init_globals(void)
+{
+ join = PyString_FromString("|");
+ er_wm = PyString_FromString("event(wd=%d, mask=%s)");
+ er_wmn = PyString_FromString("event(wd=%d, mask=%s, name=%s)");
+ er_wmc = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x)");
+ er_wmcn = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x, name=%s)");
+
+ return join && er_wm && er_wmn && er_wmc && er_wmcn;
+}
+
+PyDoc_STRVAR(
+ read_doc,
+ "read(fd, bufsize[=65536]) -> list_of_events\n"
+ "\n"
+ "\nRead inotify events from a file descriptor.\n"
+ "\n"
+ " fd: file descriptor returned by init()\n"
+ " bufsize: size of buffer to read into, in bytes\n"
+ "\n"
+ "Return a list of event objects.\n"
+ "\n"
+ "If bufsize is > 0, block until events are available to be read.\n"
+ "Otherwise, immediately return all events that can be read without\n"
+ "blocking.");
+
+static PyMethodDef methods[] = {
+ {"init", init, METH_VARARGS, init_doc},
+ {"add_watch", add_watch, METH_VARARGS, add_watch_doc},
+ {"remove_watch", remove_watch, METH_VARARGS, remove_watch_doc},
+ {"read", read_events, METH_VARARGS, read_doc},
+ {"decode_mask", pydecode_mask, METH_VARARGS, decode_mask_doc},
+ {NULL},
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef _inotify_module = {
+ PyModuleDef_HEAD_INIT,
+ "_inotify",
+ doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit__inotify(void)
+{
+ PyObject *mod, *dict;
+
+ mod = PyModule_Create(&_inotify_module);
+
+ if (mod == NULL)
+ return NULL;
+
+ if (!init_globals())
+ return;
+
+ dict = PyModule_GetDict(mod);
+
+ if (dict)
+ define_consts(dict);
+
+ return mod;
+}
+#else
+void init_inotify(void)
+{
+ PyObject *mod, *dict;
+
+ if (PyType_Ready(&event_type) == -1)
+ return;
+
+ if (!init_globals())
+ return;
+
+ mod = Py_InitModule3("_inotify", methods, doc);
+
+ dict = PyModule_GetDict(mod);
+
+ if (dict)
+ define_consts(dict);
+}
+#endif
diff --git a/hgext/inotify/linux/watcher.py b/hgext/inotify/linux/watcher.py
new file mode 100644
index 0000000..cd62006
--- /dev/null
+++ b/hgext/inotify/linux/watcher.py
@@ -0,0 +1,335 @@
+# watcher.py - high-level interfaces to the Linux inotify subsystem
+
+# Copyright 2006 Bryan O'Sullivan <bos@serpentine.com>
+
+# This library is free software; you can redistribute it and/or modify
+# it under the terms of version 2.1 of the GNU Lesser General Public
+# License, or any later version.
+
+'''High-level interfaces to the Linux inotify subsystem.
+
+The inotify subsystem provides an efficient mechanism for file status
+monitoring and change notification.
+
+The watcher class hides the low-level details of the inotify
+interface, and provides a Pythonic wrapper around it. It generates
+events that provide somewhat more information than raw inotify makes
+available.
+
+The autowatcher class is more useful, as it automatically watches
+newly-created directories on your behalf.'''
+
+__author__ = "Bryan O'Sullivan <bos@serpentine.com>"
+
+import _inotify as inotify
+import array
+import errno
+import fcntl
+import os
+import termios
+
+
+class event(object):
+ '''Derived inotify event class.
+
+ The following fields are available:
+
+ mask: event mask, indicating what kind of event this is
+
+ cookie: rename cookie, if a rename-related event
+
+ path: path of the directory in which the event occurred
+
+ name: name of the directory entry to which the event occurred
+ (may be None if the event happened to a watched directory)
+
+ fullpath: complete path at which the event occurred
+
+ wd: watch descriptor that triggered this event'''
+
+ __slots__ = (
+ 'cookie',
+ 'fullpath',
+ 'mask',
+ 'name',
+ 'path',
+ 'raw',
+ 'wd',
+ )
+
+ def __init__(self, raw, path):
+ self.path = path
+ self.raw = raw
+ if raw.name:
+ self.fullpath = path + '/' + raw.name
+ else:
+ self.fullpath = path
+
+ self.wd = raw.wd
+ self.mask = raw.mask
+ self.cookie = raw.cookie
+ self.name = raw.name
+
+ def __repr__(self):
+ r = repr(self.raw)
+ return 'event(path=' + repr(self.path) + ', ' + r[r.find('(')+1:]
+
+
+_event_props = {
+ 'access': 'File was accessed',
+ 'modify': 'File was modified',
+ 'attrib': 'Attribute of a directory entry was changed',
+ 'close_write': 'File was closed after being written to',
+ 'close_nowrite': 'File was closed without being written to',
+ 'open': 'File was opened',
+ 'moved_from': 'Directory entry was renamed from this name',
+ 'moved_to': 'Directory entry was renamed to this name',
+ 'create': 'Directory entry was created',
+ 'delete': 'Directory entry was deleted',
+ 'delete_self': 'The watched directory entry was deleted',
+ 'move_self': 'The watched directory entry was renamed',
+ 'unmount': 'Directory was unmounted, and can no longer be watched',
+ 'q_overflow': 'Kernel dropped events due to queue overflow',
+ 'ignored': 'Directory entry is no longer being watched',
+ 'isdir': 'Event occurred on a directory',
+ }
+
+for k, v in _event_props.iteritems():
+ mask = getattr(inotify, 'IN_' + k.upper())
+ def getter(self):
+ return self.mask & mask
+ getter.__name__ = k
+ getter.__doc__ = v
+ setattr(event, k, property(getter, doc=v))
+
+del _event_props
+
+
+class watcher(object):
+ '''Provide a Pythonic interface to the low-level inotify API.
+
+ Also adds derived information to each event that is not available
+ through the normal inotify API, such as directory name.'''
+
+ __slots__ = (
+ 'fd',
+ '_paths',
+ '_wds',
+ )
+
+ def __init__(self):
+ '''Create a new inotify instance.'''
+
+ self.fd = inotify.init()
+ self._paths = {}
+ self._wds = {}
+
+ def fileno(self):
+ '''Return the file descriptor this watcher uses.
+
+ Useful for passing to select and poll.'''
+
+ return self.fd
+
+ def add(self, path, mask):
+ '''Add or modify a watch.
+
+ Return the watch descriptor added or modified.'''
+
+ path = os.path.normpath(path)
+ wd = inotify.add_watch(self.fd, path, mask)
+ self._paths[path] = wd, mask
+ self._wds[wd] = path, mask
+ return wd
+
+ def remove(self, wd):
+ '''Remove the given watch.'''
+
+ inotify.remove_watch(self.fd, wd)
+ self._remove(wd)
+
+ def _remove(self, wd):
+ path_mask = self._wds.pop(wd, None)
+ if path_mask is not None:
+ self._paths.pop(path_mask[0])
+
+ def path(self, path):
+ '''Return a (watch descriptor, event mask) pair for the given path.
+
+ If the path is not being watched, return None.'''
+
+ return self._paths.get(path)
+
+ def wd(self, wd):
+ '''Return a (path, event mask) pair for the given watch descriptor.
+
+ If the watch descriptor is not valid or not associated with
+ this watcher, return None.'''
+
+ return self._wds.get(wd)
+
+ def read(self, bufsize=None):
+ '''Read a list of queued inotify events.
+
+ If bufsize is zero, only return those events that can be read
+ immediately without blocking. Otherwise, block until events are
+ available.'''
+
+ events = []
+ for evt in inotify.read(self.fd, bufsize):
+ events.append(event(evt, self._wds[evt.wd][0]))
+ if evt.mask & inotify.IN_IGNORED:
+ self._remove(evt.wd)
+ elif evt.mask & inotify.IN_UNMOUNT:
+ self.close()
+ return events
+
+ def close(self):
+ '''Shut down this watcher.
+
+ All subsequent method calls are likely to raise exceptions.'''
+
+ os.close(self.fd)
+ self.fd = None
+ self._paths = None
+ self._wds = None
+
+ def __len__(self):
+ '''Return the number of active watches.'''
+
+ return len(self._paths)
+
+ def __iter__(self):
+ '''Yield a (path, watch descriptor, event mask) tuple for each
+ entry being watched.'''
+
+ for path, (wd, mask) in self._paths.iteritems():
+ yield path, wd, mask
+
+ def __del__(self):
+ if self.fd is not None:
+ os.close(self.fd)
+
+ ignored_errors = [errno.ENOENT, errno.EPERM, errno.ENOTDIR]
+
+ def add_iter(self, path, mask, onerror=None):
+ '''Add or modify watches over path and its subdirectories.
+
+ Yield each added or modified watch descriptor.
+
+ To ensure that this method runs to completion, you must
+ iterate over all of its results, even if you do not care what
+ they are. For example:
+
+ for wd in w.add_iter(path, mask):
+ pass
+
+ By default, errors are ignored. If optional arg "onerror" is
+ specified, it should be a function; it will be called with one
+ argument, an OSError instance. It can report the error to
+ continue with the walk, or raise the exception to abort the
+ walk.'''
+
+ # Add the IN_ONLYDIR flag to the event mask, to avoid a possible
+ # race when adding a subdirectory. In the time between the
+ # event being queued by the kernel and us processing it, the
+ # directory may have been deleted, or replaced with a different
+ # kind of entry with the same name.
+
+ submask = mask | inotify.IN_ONLYDIR
+
+ try:
+ yield self.add(path, mask)
+ except OSError, err:
+ if onerror and err.errno not in self.ignored_errors:
+ onerror(err)
+ for root, dirs, names in os.walk(path, topdown=False, onerror=onerror):
+ for d in dirs:
+ try:
+ yield self.add(root + '/' + d, submask)
+ except OSError, err:
+ if onerror and err.errno not in self.ignored_errors:
+ onerror(err)
+
+ def add_all(self, path, mask, onerror=None):
+ '''Add or modify watches over path and its subdirectories.
+
+ Return a list of added or modified watch descriptors.
+
+ By default, errors are ignored. If optional arg "onerror" is
+ specified, it should be a function; it will be called with one
+ argument, an OSError instance. It can report the error to
+ continue with the walk, or raise the exception to abort the
+ walk.'''
+
+ return [w for w in self.add_iter(path, mask, onerror)]
+
+
+class autowatcher(watcher):
+ '''watcher class that automatically watches newly created directories.'''
+
+ __slots__ = (
+ 'addfilter',
+ )
+
+ def __init__(self, addfilter=None):
+ '''Create a new inotify instance.
+
+ This instance will automatically watch newly created
+ directories.
+
+ If the optional addfilter parameter is not None, it must be a
+ callable that takes one parameter. It will be called each time
+ a directory is about to be automatically watched. If it returns
+ True, the directory will be watched if it still exists,
+ otherwise, it will beb skipped.'''
+
+ super(autowatcher, self).__init__()
+ self.addfilter = addfilter
+
+ _dir_create_mask = inotify.IN_ISDIR | inotify.IN_CREATE
+
+ def read(self, bufsize=None):
+ events = super(autowatcher, self).read(bufsize)
+ for evt in events:
+ if evt.mask & self._dir_create_mask == self._dir_create_mask:
+ if self.addfilter is None or self.addfilter(evt):
+ parentmask = self._wds[evt.wd][1]
+ # See note about race avoidance via IN_ONLYDIR above.
+ mask = parentmask | inotify.IN_ONLYDIR
+ try:
+ self.add_all(evt.fullpath, mask)
+ except OSError, err:
+ if err.errno not in self.ignored_errors:
+ raise
+ return events
+
+
+class threshold(object):
+ '''Class that indicates whether a file descriptor has reached a
+ threshold of readable bytes available.
+
+ This class is not thread-safe.'''
+
+ __slots__ = (
+ 'fd',
+ 'threshold',
+ '_iocbuf',
+ )
+
+ def __init__(self, fd, threshold=1024):
+ self.fd = fd
+ self.threshold = threshold
+ self._iocbuf = array.array('i', [0])
+
+ def readable(self):
+ '''Return the number of bytes readable on this file descriptor.'''
+
+ fcntl.ioctl(self.fd, termios.FIONREAD, self._iocbuf, True)
+ return self._iocbuf[0]
+
+ def __call__(self):
+ '''Indicate whether the number of readable bytes has met or
+ exceeded the threshold.'''
+
+ return self.readable() >= self.threshold
diff --git a/hgext/inotify/linuxserver.py b/hgext/inotify/linuxserver.py
new file mode 100644
index 0000000..a92b540
--- /dev/null
+++ b/hgext/inotify/linuxserver.py
@@ -0,0 +1,444 @@
+# linuxserver.py - inotify status server for linux
+#
+# Copyright 2006, 2007, 2008 Bryan O'Sullivan <bos@serpentine.com>
+# Copyright 2007, 2008 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.i18n import _
+from mercurial import osutil, util, error
+import server
+import errno, os, select, stat, sys, time
+
+try:
+ import linux as inotify
+ from linux import watcher
+except ImportError:
+ raise
+
+def walkrepodirs(dirstate, absroot):
+ '''Iterate over all subdirectories of this repo.
+ Exclude the .hg directory, any nested repos, and ignored dirs.'''
+ def walkit(dirname, top):
+ fullpath = server.join(absroot, dirname)
+ try:
+ for name, kind in osutil.listdir(fullpath):
+ if kind == stat.S_IFDIR:
+ if name == '.hg':
+ if not top:
+ return
+ else:
+ d = server.join(dirname, name)
+ if dirstate._ignore(d):
+ continue
+ for subdir in walkit(d, False):
+ yield subdir
+ except OSError, err:
+ if err.errno not in server.walk_ignored_errors:
+ raise
+ yield fullpath
+
+ return walkit('', True)
+
+def _explain_watch_limit(ui, dirstate, rootabs):
+ path = '/proc/sys/fs/inotify/max_user_watches'
+ try:
+ limit = int(util.readfile(path))
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ raise util.Abort(_('this system does not seem to '
+ 'support inotify'))
+ ui.warn(_('*** the current per-user limit on the number '
+ 'of inotify watches is %s\n') % limit)
+ ui.warn(_('*** this limit is too low to watch every '
+ 'directory in this repository\n'))
+ ui.warn(_('*** counting directories: '))
+ ndirs = len(list(walkrepodirs(dirstate, rootabs)))
+ ui.warn(_('found %d\n') % ndirs)
+ newlimit = min(limit, 1024)
+ while newlimit < ((limit + ndirs) * 1.1):
+ newlimit *= 2
+ ui.warn(_('*** to raise the limit from %d to %d (run as root):\n') %
+ (limit, newlimit))
+ ui.warn(_('*** echo %d > %s\n') % (newlimit, path))
+ raise util.Abort(_('cannot watch %s until inotify watch limit is raised')
+ % rootabs)
+
+class pollable(object):
+ """
+ Interface to support polling.
+ The file descriptor returned by fileno() is registered to a polling
+ object.
+ Usage:
+ Every tick, check if an event has happened since the last tick:
+ * If yes, call handle_events
+ * If no, call handle_timeout
+ """
+ poll_events = select.POLLIN
+ instances = {}
+ poll = select.poll()
+
+ def fileno(self):
+ raise NotImplementedError
+
+ def handle_events(self, events):
+ raise NotImplementedError
+
+ def handle_timeout(self):
+ raise NotImplementedError
+
+ def shutdown(self):
+ raise NotImplementedError
+
+ def register(self, timeout):
+ fd = self.fileno()
+
+ pollable.poll.register(fd, pollable.poll_events)
+ pollable.instances[fd] = self
+
+ self.registered = True
+ self.timeout = timeout
+
+ def unregister(self):
+ pollable.poll.unregister(self)
+ self.registered = False
+
+ @classmethod
+ def run(cls):
+ while True:
+ timeout = None
+ timeobj = None
+ for obj in cls.instances.itervalues():
+ if obj.timeout is not None and (timeout is None
+ or obj.timeout < timeout):
+ timeout, timeobj = obj.timeout, obj
+ try:
+ events = cls.poll.poll(timeout)
+ except select.error, err:
+ if err.args[0] == errno.EINTR:
+ continue
+ raise
+ if events:
+ by_fd = {}
+ for fd, event in events:
+ by_fd.setdefault(fd, []).append(event)
+
+ for fd, events in by_fd.iteritems():
+ cls.instances[fd].handle_pollevents(events)
+
+ elif timeobj:
+ timeobj.handle_timeout()
+
+def eventaction(code):
+ """
+ Decorator to help handle events in repowatcher
+ """
+ def decorator(f):
+ def wrapper(self, wpath):
+ if code == 'm' and wpath in self.lastevent and \
+ self.lastevent[wpath] in 'cm':
+ return
+ self.lastevent[wpath] = code
+ self.timeout = 250
+
+ f(self, wpath)
+
+ wrapper.func_name = f.func_name
+ return wrapper
+ return decorator
+
+class repowatcher(server.repowatcher, pollable):
+ """
+ Watches inotify events
+ """
+ mask = (
+ inotify.IN_ATTRIB |
+ inotify.IN_CREATE |
+ inotify.IN_DELETE |
+ inotify.IN_DELETE_SELF |
+ inotify.IN_MODIFY |
+ inotify.IN_MOVED_FROM |
+ inotify.IN_MOVED_TO |
+ inotify.IN_MOVE_SELF |
+ inotify.IN_ONLYDIR |
+ inotify.IN_UNMOUNT |
+ 0)
+
+ def __init__(self, ui, dirstate, root):
+ server.repowatcher.__init__(self, ui, dirstate, root)
+
+ self.lastevent = {}
+ self.dirty = False
+ try:
+ self.watcher = watcher.watcher()
+ except OSError, err:
+ raise util.Abort(_('inotify service not available: %s') %
+ err.strerror)
+ self.threshold = watcher.threshold(self.watcher)
+ self.fileno = self.watcher.fileno
+ self.register(timeout=None)
+
+ self.handle_timeout()
+ self.scan()
+
+ def event_time(self):
+ last = self.last_event
+ now = time.time()
+ self.last_event = now
+
+ if last is None:
+ return 'start'
+ delta = now - last
+ if delta < 5:
+ return '+%.3f' % delta
+ if delta < 50:
+ return '+%.2f' % delta
+ return '+%.1f' % delta
+
+ def add_watch(self, path, mask):
+ if not path:
+ return
+ if self.watcher.path(path) is None:
+ if self.ui.debugflag:
+ self.ui.note(_('watching %r\n') % path[self.prefixlen:])
+ try:
+ self.watcher.add(path, mask)
+ except OSError, err:
+ if err.errno in (errno.ENOENT, errno.ENOTDIR):
+ return
+ if err.errno != errno.ENOSPC:
+ raise
+ _explain_watch_limit(self.ui, self.dirstate, self.wprefix)
+
+ def setup(self):
+ self.ui.note(_('watching directories under %r\n') % self.wprefix)
+ self.add_watch(self.wprefix + '.hg', inotify.IN_DELETE)
+
+ def scan(self, topdir=''):
+ ds = self.dirstate._map.copy()
+ self.add_watch(server.join(self.wprefix, topdir), self.mask)
+ for root, dirs, files in server.walk(self.dirstate, self.wprefix,
+ topdir):
+ for d in dirs:
+ self.add_watch(server.join(root, d), self.mask)
+ wroot = root[self.prefixlen:]
+ for fn in files:
+ wfn = server.join(wroot, fn)
+ self.updatefile(wfn, self.getstat(wfn))
+ ds.pop(wfn, None)
+ wtopdir = topdir
+ if wtopdir and wtopdir[-1] != '/':
+ wtopdir += '/'
+ for wfn, state in ds.iteritems():
+ if not wfn.startswith(wtopdir):
+ continue
+ try:
+ st = self.stat(wfn)
+ except OSError:
+ status = state[0]
+ self.deletefile(wfn, status)
+ else:
+ self.updatefile(wfn, st)
+ self.check_deleted('!')
+ self.check_deleted('r')
+
+ @eventaction('c')
+ def created(self, wpath):
+ if wpath == '.hgignore':
+ self.update_hgignore()
+ try:
+ st = self.stat(wpath)
+ if stat.S_ISREG(st[0]) or stat.S_ISLNK(st[0]):
+ self.updatefile(wpath, st)
+ except OSError:
+ pass
+
+ @eventaction('m')
+ def modified(self, wpath):
+ if wpath == '.hgignore':
+ self.update_hgignore()
+ try:
+ st = self.stat(wpath)
+ if stat.S_ISREG(st[0]):
+ if self.dirstate[wpath] in 'lmn':
+ self.updatefile(wpath, st)
+ except OSError:
+ pass
+
+ @eventaction('d')
+ def deleted(self, wpath):
+ if wpath == '.hgignore':
+ self.update_hgignore()
+ elif wpath.startswith('.hg/'):
+ return
+
+ self.deletefile(wpath, self.dirstate[wpath])
+
+ def process_create(self, wpath, evt):
+ if self.ui.debugflag:
+ self.ui.note(_('%s event: created %s\n') %
+ (self.event_time(), wpath))
+
+ if evt.mask & inotify.IN_ISDIR:
+ self.scan(wpath)
+ else:
+ self.created(wpath)
+
+ def process_delete(self, wpath, evt):
+ if self.ui.debugflag:
+ self.ui.note(_('%s event: deleted %s\n') %
+ (self.event_time(), wpath))
+
+ if evt.mask & inotify.IN_ISDIR:
+ tree = self.tree.dir(wpath)
+ todelete = [wfn for wfn, ignore in tree.walk('?')]
+ for fn in todelete:
+ self.deletefile(fn, '?')
+ self.scan(wpath)
+ else:
+ self.deleted(wpath)
+
+ def process_modify(self, wpath, evt):
+ if self.ui.debugflag:
+ self.ui.note(_('%s event: modified %s\n') %
+ (self.event_time(), wpath))
+
+ if not (evt.mask & inotify.IN_ISDIR):
+ self.modified(wpath)
+
+ def process_unmount(self, evt):
+ self.ui.warn(_('filesystem containing %s was unmounted\n') %
+ evt.fullpath)
+ sys.exit(0)
+
+ def handle_pollevents(self, events):
+ if self.ui.debugflag:
+ self.ui.note(_('%s readable: %d bytes\n') %
+ (self.event_time(), self.threshold.readable()))
+ if not self.threshold():
+ if self.registered:
+ if self.ui.debugflag:
+ self.ui.note(_('%s below threshold - unhooking\n') %
+ (self.event_time()))
+ self.unregister()
+ self.timeout = 250
+ else:
+ self.read_events()
+
+ def read_events(self, bufsize=None):
+ events = self.watcher.read(bufsize)
+ if self.ui.debugflag:
+ self.ui.note(_('%s reading %d events\n') %
+ (self.event_time(), len(events)))
+ for evt in events:
+ if evt.fullpath == self.wprefix[:-1]:
+ # events on the root of the repository
+ # itself, e.g. permission changes or repository move
+ continue
+ assert evt.fullpath.startswith(self.wprefix)
+ wpath = evt.fullpath[self.prefixlen:]
+
+ # paths have been normalized, wpath never ends with a '/'
+
+ if wpath.startswith('.hg/') and evt.mask & inotify.IN_ISDIR:
+ # ignore subdirectories of .hg/ (merge, patches...)
+ continue
+ if wpath == ".hg/wlock":
+ if evt.mask & inotify.IN_DELETE:
+ self.dirstate.invalidate()
+ self.dirty = False
+ self.scan()
+ elif evt.mask & inotify.IN_CREATE:
+ self.dirty = True
+ else:
+ if self.dirty:
+ continue
+
+ if evt.mask & inotify.IN_UNMOUNT:
+ self.process_unmount(wpath, evt)
+ elif evt.mask & (inotify.IN_MODIFY | inotify.IN_ATTRIB):
+ self.process_modify(wpath, evt)
+ elif evt.mask & (inotify.IN_DELETE | inotify.IN_DELETE_SELF |
+ inotify.IN_MOVED_FROM):
+ self.process_delete(wpath, evt)
+ elif evt.mask & (inotify.IN_CREATE | inotify.IN_MOVED_TO):
+ self.process_create(wpath, evt)
+
+ self.lastevent.clear()
+
+ def handle_timeout(self):
+ if not self.registered:
+ if self.ui.debugflag:
+ self.ui.note(_('%s hooking back up with %d bytes readable\n') %
+ (self.event_time(), self.threshold.readable()))
+ self.read_events(0)
+ self.register(timeout=None)
+
+ self.timeout = None
+
+ def shutdown(self):
+ self.watcher.close()
+
+ def debug(self):
+ """
+ Returns a sorted list of relatives paths currently watched,
+ for debugging purposes.
+ """
+ return sorted(tuple[0][self.prefixlen:] for tuple in self.watcher)
+
+class socketlistener(server.socketlistener, pollable):
+ """
+ Listens for client queries on unix socket inotify.sock
+ """
+ def __init__(self, ui, root, repowatcher, timeout):
+ server.socketlistener.__init__(self, ui, root, repowatcher, timeout)
+ self.register(timeout=timeout)
+
+ def handle_timeout(self):
+ raise server.TimeoutException
+
+ def handle_pollevents(self, events):
+ for e in events:
+ self.accept_connection()
+
+ def shutdown(self):
+ self.sock.close()
+ try:
+ os.unlink(self.sockpath)
+ if self.realsockpath:
+ os.unlink(self.realsockpath)
+ os.rmdir(os.path.dirname(self.realsockpath))
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+
+ def answer_stat_query(self, cs):
+ if self.repowatcher.timeout:
+ # We got a query while a rescan is pending. Make sure we
+ # rescan before responding, or we could give back a wrong
+ # answer.
+ self.repowatcher.handle_timeout()
+ return server.socketlistener.answer_stat_query(self, cs)
+
+class master(object):
+ def __init__(self, ui, dirstate, root, timeout=None):
+ self.ui = ui
+ self.repowatcher = repowatcher(ui, dirstate, root)
+ self.socketlistener = socketlistener(ui, root, self.repowatcher,
+ timeout)
+
+ def shutdown(self):
+ for obj in pollable.instances.itervalues():
+ try:
+ obj.shutdown()
+ except error.SignalInterrupt:
+ pass
+
+ def run(self):
+ self.repowatcher.setup()
+ self.ui.note(_('finished setup\n'))
+ if os.getenv('TIME_STARTUP'):
+ sys.exit(0)
+ pollable.run()
diff --git a/hgext/inotify/server.py b/hgext/inotify/server.py
new file mode 100644
index 0000000..b654b17
--- /dev/null
+++ b/hgext/inotify/server.py
@@ -0,0 +1,492 @@
+# server.py - common entry point for inotify status server
+#
+# Copyright 2009 Nicolas Dumazet <nicdumz@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.i18n import _
+from mercurial import cmdutil, osutil, util
+import common
+
+import errno
+import os
+import socket
+import stat
+import struct
+import sys
+import tempfile
+
+class AlreadyStartedException(Exception):
+ pass
+class TimeoutException(Exception):
+ pass
+
+def join(a, b):
+ if a:
+ if a[-1] == '/':
+ return a + b
+ return a + '/' + b
+ return b
+
+def split(path):
+ c = path.rfind('/')
+ if c == -1:
+ return '', path
+ return path[:c], path[c + 1:]
+
+walk_ignored_errors = (errno.ENOENT, errno.ENAMETOOLONG)
+
+def walk(dirstate, absroot, root):
+ '''Like os.walk, but only yields regular files.'''
+
+ # This function is critical to performance during startup.
+
+ def walkit(root, reporoot):
+ files, dirs = [], []
+
+ try:
+ fullpath = join(absroot, root)
+ for name, kind in osutil.listdir(fullpath):
+ if kind == stat.S_IFDIR:
+ if name == '.hg':
+ if not reporoot:
+ return
+ else:
+ dirs.append(name)
+ path = join(root, name)
+ if dirstate._ignore(path):
+ continue
+ for result in walkit(path, False):
+ yield result
+ elif kind in (stat.S_IFREG, stat.S_IFLNK):
+ files.append(name)
+ yield fullpath, dirs, files
+
+ except OSError, err:
+ if err.errno == errno.ENOTDIR:
+ # fullpath was a directory, but has since been replaced
+ # by a file.
+ yield fullpath, dirs, files
+ elif err.errno not in walk_ignored_errors:
+ raise
+
+ return walkit(root, root == '')
+
+class directory(object):
+ """
+ Representing a directory
+
+ * path is the relative path from repo root to this directory
+ * files is a dict listing the files in this directory
+ - keys are file names
+ - values are file status
+ * dirs is a dict listing the subdirectories
+ - key are subdirectories names
+ - values are directory objects
+ """
+ def __init__(self, relpath=''):
+ self.path = relpath
+ self.files = {}
+ self.dirs = {}
+
+ def dir(self, relpath):
+ """
+ Returns the directory contained at the relative path relpath.
+ Creates the intermediate directories if necessary.
+ """
+ if not relpath:
+ return self
+ l = relpath.split('/')
+ ret = self
+ while l:
+ next = l.pop(0)
+ try:
+ ret = ret.dirs[next]
+ except KeyError:
+ d = directory(join(ret.path, next))
+ ret.dirs[next] = d
+ ret = d
+ return ret
+
+ def walk(self, states, visited=None):
+ """
+ yield (filename, status) pairs for items in the trees
+ that have status in states.
+ filenames are relative to the repo root
+ """
+ for file, st in self.files.iteritems():
+ if st in states:
+ yield join(self.path, file), st
+ for dir in self.dirs.itervalues():
+ if visited is not None:
+ visited.add(dir.path)
+ for e in dir.walk(states):
+ yield e
+
+ def lookup(self, states, path, visited):
+ """
+ yield root-relative filenames that match path, and whose
+ status are in states:
+ * if path is a file, yield path
+ * if path is a directory, yield directory files
+ * if path is not tracked, yield nothing
+ """
+ if path[-1] == '/':
+ path = path[:-1]
+
+ paths = path.split('/')
+
+ # we need to check separately for last node
+ last = paths.pop()
+
+ tree = self
+ try:
+ for dir in paths:
+ tree = tree.dirs[dir]
+ except KeyError:
+ # path is not tracked
+ visited.add(tree.path)
+ return
+
+ try:
+ # if path is a directory, walk it
+ target = tree.dirs[last]
+ visited.add(target.path)
+ for file, st in target.walk(states, visited):
+ yield file
+ except KeyError:
+ try:
+ if tree.files[last] in states:
+ # path is a file
+ visited.add(tree.path)
+ yield path
+ except KeyError:
+ # path is not tracked
+ pass
+
+class repowatcher(object):
+ """
+ Watches inotify events
+ """
+ statuskeys = 'almr!?'
+
+ def __init__(self, ui, dirstate, root):
+ self.ui = ui
+ self.dirstate = dirstate
+
+ self.wprefix = join(root, '')
+ self.prefixlen = len(self.wprefix)
+
+ self.tree = directory()
+ self.statcache = {}
+ self.statustrees = dict([(s, directory()) for s in self.statuskeys])
+
+ self.ds_info = self.dirstate_info()
+
+ self.last_event = None
+
+
+ def handle_timeout(self):
+ pass
+
+ def dirstate_info(self):
+ try:
+ st = os.lstat(self.wprefix + '.hg/dirstate')
+ return st.st_mtime, st.st_ino
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return 0, 0
+
+ def filestatus(self, fn, st):
+ try:
+ type_, mode, size, time = self.dirstate._map[fn][:4]
+ except KeyError:
+ type_ = '?'
+ if type_ == 'n':
+ st_mode, st_size, st_mtime = st
+ if size == -1:
+ return 'l'
+ if size and (size != st_size or (mode ^ st_mode) & 0100):
+ return 'm'
+ if time != int(st_mtime):
+ return 'l'
+ return 'n'
+ if type_ == '?' and self.dirstate._dirignore(fn):
+ # we must check not only if the file is ignored, but if any part
+ # of its path match an ignore pattern
+ return 'i'
+ return type_
+
+ def updatefile(self, wfn, osstat):
+ '''
+ update the file entry of an existing file.
+
+ osstat: (mode, size, time) tuple, as returned by os.lstat(wfn)
+ '''
+
+ self._updatestatus(wfn, self.filestatus(wfn, osstat))
+
+ def deletefile(self, wfn, oldstatus):
+ '''
+ update the entry of a file which has been deleted.
+
+ oldstatus: char in statuskeys, status of the file before deletion
+ '''
+ if oldstatus == 'r':
+ newstatus = 'r'
+ elif oldstatus in 'almn':
+ newstatus = '!'
+ else:
+ newstatus = None
+
+ self.statcache.pop(wfn, None)
+ self._updatestatus(wfn, newstatus)
+
+ def _updatestatus(self, wfn, newstatus):
+ '''
+ Update the stored status of a file.
+
+ newstatus: - char in (statuskeys + 'ni'), new status to apply.
+ - or None, to stop tracking wfn
+ '''
+ root, fn = split(wfn)
+ d = self.tree.dir(root)
+
+ oldstatus = d.files.get(fn)
+ # oldstatus can be either:
+ # - None : fn is new
+ # - a char in statuskeys: fn is a (tracked) file
+
+ if self.ui.debugflag and oldstatus != newstatus:
+ self.ui.note(_('status: %r %s -> %s\n') %
+ (wfn, oldstatus, newstatus))
+
+ if oldstatus and oldstatus in self.statuskeys \
+ and oldstatus != newstatus:
+ del self.statustrees[oldstatus].dir(root).files[fn]
+
+ if newstatus in (None, 'i'):
+ d.files.pop(fn, None)
+ elif oldstatus != newstatus:
+ d.files[fn] = newstatus
+ if newstatus != 'n':
+ self.statustrees[newstatus].dir(root).files[fn] = newstatus
+
+ def check_deleted(self, key):
+ # Files that had been deleted but were present in the dirstate
+ # may have vanished from the dirstate; we must clean them up.
+ nuke = []
+ for wfn, ignore in self.statustrees[key].walk(key):
+ if wfn not in self.dirstate:
+ nuke.append(wfn)
+ for wfn in nuke:
+ root, fn = split(wfn)
+ del self.statustrees[key].dir(root).files[fn]
+ del self.tree.dir(root).files[fn]
+
+ def update_hgignore(self):
+ # An update of the ignore file can potentially change the
+ # states of all unknown and ignored files.
+
+ # XXX If the user has other ignore files outside the repo, or
+ # changes their list of ignore files at run time, we'll
+ # potentially never see changes to them. We could get the
+ # client to report to us what ignore data they're using.
+ # But it's easier to do nothing than to open that can of
+ # worms.
+
+ if '_ignore' in self.dirstate.__dict__:
+ delattr(self.dirstate, '_ignore')
+ self.ui.note(_('rescanning due to .hgignore change\n'))
+ self.handle_timeout()
+ self.scan()
+
+ def getstat(self, wpath):
+ try:
+ return self.statcache[wpath]
+ except KeyError:
+ try:
+ return self.stat(wpath)
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+
+ def stat(self, wpath):
+ try:
+ st = os.lstat(join(self.wprefix, wpath))
+ ret = st.st_mode, st.st_size, st.st_mtime
+ self.statcache[wpath] = ret
+ return ret
+ except OSError:
+ self.statcache.pop(wpath, None)
+ raise
+
+class socketlistener(object):
+ """
+ Listens for client queries on unix socket inotify.sock
+ """
+ def __init__(self, ui, root, repowatcher, timeout):
+ self.ui = ui
+ self.repowatcher = repowatcher
+ self.sock = socket.socket(socket.AF_UNIX)
+ self.sockpath = join(root, '.hg/inotify.sock')
+
+ self.realsockpath = self.sockpath
+ if os.path.islink(self.sockpath):
+ if os.path.exists(self.sockpath):
+ self.realsockpath = os.readlink(self.sockpath)
+ else:
+ raise util.Abort('inotify-server: cannot start: '
+ '.hg/inotify.sock is a broken symlink')
+ try:
+ self.sock.bind(self.realsockpath)
+ except socket.error, err:
+ if err.args[0] == errno.EADDRINUSE:
+ raise AlreadyStartedException(_('cannot start: socket is '
+ 'already bound'))
+ if err.args[0] == "AF_UNIX path too long":
+ tempdir = tempfile.mkdtemp(prefix="hg-inotify-")
+ self.realsockpath = os.path.join(tempdir, "inotify.sock")
+ try:
+ self.sock.bind(self.realsockpath)
+ os.symlink(self.realsockpath, self.sockpath)
+ except (OSError, socket.error), inst:
+ try:
+ os.unlink(self.realsockpath)
+ except OSError:
+ pass
+ os.rmdir(tempdir)
+ if inst.errno == errno.EEXIST:
+ raise AlreadyStartedException(_('cannot start: tried '
+ 'linking .hg/inotify.sock to a temporary socket but'
+ ' .hg/inotify.sock already exists'))
+ raise
+ else:
+ raise
+ self.sock.listen(5)
+ self.fileno = self.sock.fileno
+
+ def answer_stat_query(self, cs):
+ names = cs.read().split('\0')
+
+ states = names.pop()
+
+ self.ui.note(_('answering query for %r\n') % states)
+
+ visited = set()
+ if not names:
+ def genresult(states, tree):
+ for fn, state in tree.walk(states):
+ yield fn
+ else:
+ def genresult(states, tree):
+ for fn in names:
+ for f in tree.lookup(states, fn, visited):
+ yield f
+
+ return ['\0'.join(r) for r in [
+ genresult('l', self.repowatcher.statustrees['l']),
+ genresult('m', self.repowatcher.statustrees['m']),
+ genresult('a', self.repowatcher.statustrees['a']),
+ genresult('r', self.repowatcher.statustrees['r']),
+ genresult('!', self.repowatcher.statustrees['!']),
+ '?' in states
+ and genresult('?', self.repowatcher.statustrees['?'])
+ or [],
+ [],
+ 'c' in states and genresult('n', self.repowatcher.tree) or [],
+ visited
+ ]]
+
+ def answer_dbug_query(self):
+ return ['\0'.join(self.repowatcher.debug())]
+
+ def accept_connection(self):
+ sock, addr = self.sock.accept()
+
+ cs = common.recvcs(sock)
+ version = ord(cs.read(1))
+
+ if version != common.version:
+ self.ui.warn(_('received query from incompatible client '
+ 'version %d\n') % version)
+ try:
+ # try to send back our version to the client
+ # this way, the client too is informed of the mismatch
+ sock.sendall(chr(common.version))
+ except socket.error:
+ pass
+ return
+
+ type = cs.read(4)
+
+ if type == 'STAT':
+ results = self.answer_stat_query(cs)
+ elif type == 'DBUG':
+ results = self.answer_dbug_query()
+ else:
+ self.ui.warn(_('unrecognized query type: %s\n') % type)
+ return
+
+ try:
+ try:
+ v = chr(common.version)
+
+ sock.sendall(v + type + struct.pack(common.resphdrfmts[type],
+ *map(len, results)))
+ sock.sendall(''.join(results))
+ finally:
+ sock.shutdown(socket.SHUT_WR)
+ except socket.error, err:
+ if err.args[0] != errno.EPIPE:
+ raise
+
+if sys.platform.startswith('linux'):
+ import linuxserver as _server
+else:
+ raise ImportError
+
+master = _server.master
+
+def start(ui, dirstate, root, opts):
+ timeout = opts.get('idle_timeout')
+ if timeout:
+ timeout = float(timeout) * 60000
+ else:
+ timeout = None
+
+ class service(object):
+ def init(self):
+ try:
+ self.master = master(ui, dirstate, root, timeout)
+ except AlreadyStartedException, inst:
+ raise util.Abort("inotify-server: %s" % inst)
+
+ def run(self):
+ try:
+ try:
+ self.master.run()
+ except TimeoutException:
+ pass
+ finally:
+ self.master.shutdown()
+
+ if 'inserve' not in sys.argv:
+ runargs = util.hgcmd() + ['inserve', '-R', root]
+ else:
+ runargs = util.hgcmd() + sys.argv[1:]
+
+ pidfile = ui.config('inotify', 'pidfile')
+ if opts['daemon'] and pidfile is not None and 'pid-file' not in runargs:
+ runargs.append("--pid-file=%s" % pidfile)
+
+ service = service()
+ logfile = ui.config('inotify', 'log')
+
+ appendpid = ui.configbool('inotify', 'appendpid', False)
+
+ ui.debug('starting inotify server: %s\n' % ' '.join(runargs))
+ cmdutil.service(opts, initfn=service.init, runfn=service.run,
+ logfile=logfile, runargs=runargs, appendpid=appendpid)
diff --git a/hgext/interhg.py b/hgext/interhg.py
new file mode 100644
index 0000000..a998a35
--- /dev/null
+++ b/hgext/interhg.py
@@ -0,0 +1,83 @@
+# interhg.py - interhg
+#
+# Copyright 2007 OHASHI Hideya <ohachige@gmail.com>
+#
+# Contributor(s):
+# Edward Lee <edward.lee@engineering.uiuc.edu>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''expand expressions into changelog and summaries
+
+This extension allows the use of a special syntax in summaries, which
+will be automatically expanded into links or any other arbitrary
+expression, much like InterWiki does.
+
+A few example patterns (link to bug tracking, etc.) that may be used
+in your hgrc::
+
+ [interhg]
+ issues = s!issue(\\d+)!<a href="http://bts/issue\\1">issue\\1</a>!
+ bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2">\\1</a>!i
+ boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!
+'''
+
+import re
+from mercurial.hgweb import hgweb_mod
+from mercurial import templatefilters, extensions
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+interhg_table = []
+
+def uisetup(ui):
+ orig_escape = templatefilters.filters["escape"]
+
+ def interhg_escape(x):
+ escstr = orig_escape(x)
+ for regexp, format in interhg_table:
+ escstr = regexp.sub(format, escstr)
+ return escstr
+
+ templatefilters.filters["escape"] = interhg_escape
+
+def interhg_refresh(orig, self, *args, **kwargs):
+ interhg_table[:] = []
+ for key, pattern in self.repo.ui.configitems('interhg'):
+ # grab the delimiter from the character after the "s"
+ unesc = pattern[1]
+ delim = re.escape(unesc)
+
+ # identify portions of the pattern, taking care to avoid escaped
+ # delimiters. the replace format and flags are optional, but delimiters
+ # are required.
+ match = re.match(r'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
+ % (delim, delim, delim), pattern)
+ if not match:
+ self.repo.ui.warn(_("interhg: invalid pattern for %s: %s\n")
+ % (key, pattern))
+ continue
+
+ # we need to unescape the delimiter for regexp and format
+ delim_re = re.compile(r'(?<!\\)\\%s' % delim)
+ regexp = delim_re.sub(unesc, match.group(1))
+ format = delim_re.sub(unesc, match.group(2))
+
+ # the pattern allows for 6 regexp flags, so set them if necessary
+ flagin = match.group(3)
+ flags = 0
+ if flagin:
+ for flag in flagin.upper():
+ flags |= re.__dict__[flag]
+
+ try:
+ regexp = re.compile(regexp, flags)
+ interhg_table.append((regexp, format))
+ except re.error:
+ self.repo.ui.warn(_("interhg: invalid regexp for %s: %s\n")
+ % (key, regexp))
+ return orig(self, *args, **kwargs)
+
+extensions.wrapfunction(hgweb_mod.hgweb, 'refresh', interhg_refresh)
diff --git a/hgext/keyword.py b/hgext/keyword.py
new file mode 100644
index 0000000..54bab17
--- /dev/null
+++ b/hgext/keyword.py
@@ -0,0 +1,730 @@
+# keyword.py - $Keyword$ expansion for Mercurial
+#
+# Copyright 2007-2012 Christian Ebert <blacktrash@gmx.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# $Id$
+#
+# Keyword expansion hack against the grain of a DSCM
+#
+# There are many good reasons why this is not needed in a distributed
+# SCM, still it may be useful in very small projects based on single
+# files (like LaTeX packages), that are mostly addressed to an
+# audience not running a version control system.
+#
+# For in-depth discussion refer to
+# <http://mercurial.selenic.com/wiki/KeywordPlan>.
+#
+# Keyword expansion is based on Mercurial's changeset template mappings.
+#
+# Binary files are not touched.
+#
+# Files to act upon/ignore are specified in the [keyword] section.
+# Customized keyword template mappings in the [keywordmaps] section.
+#
+# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
+
+'''expand keywords in tracked files
+
+This extension expands RCS/CVS-like or self-customized $Keywords$ in
+tracked text files selected by your configuration.
+
+Keywords are only expanded in local repositories and not stored in the
+change history. The mechanism can be regarded as a convenience for the
+current user or for archive distribution.
+
+Keywords expand to the changeset data pertaining to the latest change
+relative to the working directory parent of each file.
+
+Configuration is done in the [keyword], [keywordset] and [keywordmaps]
+sections of hgrc files.
+
+Example::
+
+ [keyword]
+ # expand keywords in every python file except those matching "x*"
+ **.py =
+ x* = ignore
+
+ [keywordset]
+ # prefer svn- over cvs-like default keywordmaps
+ svn = True
+
+.. note::
+ The more specific you are in your filename patterns the less you
+ lose speed in huge repositories.
+
+For [keywordmaps] template mapping and expansion demonstration and
+control run :hg:`kwdemo`. See :hg:`help templates` for a list of
+available templates and filters.
+
+Three additional date template filters are provided:
+
+:``utcdate``: "2006/09/18 15:13:13"
+:``svnutcdate``: "2006-09-18 15:13:13Z"
+:``svnisodate``: "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)"
+
+The default template mappings (view with :hg:`kwdemo -d`) can be
+replaced with customized keywords and templates. Again, run
+:hg:`kwdemo` to control the results of your configuration changes.
+
+Before changing/disabling active keywords, you must run :hg:`kwshrink`
+to avoid storing expanded keywords in the change history.
+
+To force expansion after enabling it, or a configuration change, run
+:hg:`kwexpand`.
+
+Expansions spanning more than one line and incremental expansions,
+like CVS' $Log$, are not supported. A keyword template map "Log =
+{desc}" expands to the first line of the changeset description.
+'''
+
+from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
+from mercurial import localrepo, match, patch, templatefilters, templater, util
+from mercurial import scmutil
+from mercurial.hgweb import webcommands
+from mercurial.i18n import _
+import os, re, shutil, tempfile
+
+commands.optionalrepo += ' kwdemo'
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+# hg commands that do not act on keywords
+nokwcommands = ('add addremove annotate bundle export grep incoming init log'
+ ' outgoing push tip verify convert email glog')
+
+# hg commands that trigger expansion only when writing to working dir,
+# not when reading filelog, and unexpand when reading from working dir
+restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
+
+# names of extensions using dorecord
+recordextensions = 'record'
+
+colortable = {
+ 'kwfiles.enabled': 'green bold',
+ 'kwfiles.deleted': 'cyan bold underline',
+ 'kwfiles.enabledunknown': 'green',
+ 'kwfiles.ignored': 'bold',
+ 'kwfiles.ignoredunknown': 'none'
+}
+
+# date like in cvs' $Date
+def utcdate(text):
+ ''':utcdate: Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
+ '''
+ return util.datestr((text[0], 0), '%Y/%m/%d %H:%M:%S')
+# date like in svn's $Date
+def svnisodate(text):
+ ''':svnisodate: Date. Returns a date in this format: "2009-08-18 13:00:13
+ +0200 (Tue, 18 Aug 2009)".
+ '''
+ return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
+# date like in svn's $Id
+def svnutcdate(text):
+ ''':svnutcdate: Date. Returns a UTC-date in this format: "2009-08-18
+ 11:00:13Z".
+ '''
+ return util.datestr((text[0], 0), '%Y-%m-%d %H:%M:%SZ')
+
+templatefilters.filters.update({'utcdate': utcdate,
+ 'svnisodate': svnisodate,
+ 'svnutcdate': svnutcdate})
+
+# make keyword tools accessible
+kwtools = {'templater': None, 'hgcmd': ''}
+
+def _defaultkwmaps(ui):
+ '''Returns default keywordmaps according to keywordset configuration.'''
+ templates = {
+ 'Revision': '{node|short}',
+ 'Author': '{author|user}',
+ }
+ kwsets = ({
+ 'Date': '{date|utcdate}',
+ 'RCSfile': '{file|basename},v',
+ 'RCSFile': '{file|basename},v', # kept for backwards compatibility
+ # with hg-keyword
+ 'Source': '{root}/{file},v',
+ 'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
+ 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
+ }, {
+ 'Date': '{date|svnisodate}',
+ 'Id': '{file|basename},v {node|short} {date|svnutcdate} {author|user}',
+ 'LastChangedRevision': '{node|short}',
+ 'LastChangedBy': '{author|user}',
+ 'LastChangedDate': '{date|svnisodate}',
+ })
+ templates.update(kwsets[ui.configbool('keywordset', 'svn')])
+ return templates
+
+def _shrinktext(text, subfunc):
+ '''Helper for keyword expansion removal in text.
+ Depending on subfunc also returns number of substitutions.'''
+ return subfunc(r'$\1$', text)
+
+def _preselect(wstatus, changed):
+ '''Retrieves modfied and added files from a working directory state
+ and returns the subset of each contained in given changed files
+ retrieved from a change context.'''
+ modified, added = wstatus[:2]
+ modified = [f for f in modified if f in changed]
+ added = [f for f in added if f in changed]
+ return modified, added
+
+
+class kwtemplater(object):
+ '''
+ Sets up keyword templates, corresponding keyword regex, and
+ provides keyword substitution functions.
+ '''
+
+ def __init__(self, ui, repo, inc, exc):
+ self.ui = ui
+ self.repo = repo
+ self.match = match.match(repo.root, '', [], inc, exc)
+ self.restrict = kwtools['hgcmd'] in restricted.split()
+ self.postcommit = False
+
+ kwmaps = self.ui.configitems('keywordmaps')
+ if kwmaps: # override default templates
+ self.templates = dict((k, templater.parsestring(v, False))
+ for k, v in kwmaps)
+ else:
+ self.templates = _defaultkwmaps(self.ui)
+
+ @util.propertycache
+ def escape(self):
+ '''Returns bar-separated and escaped keywords.'''
+ return '|'.join(map(re.escape, self.templates.keys()))
+
+ @util.propertycache
+ def rekw(self):
+ '''Returns regex for unexpanded keywords.'''
+ return re.compile(r'\$(%s)\$' % self.escape)
+
+ @util.propertycache
+ def rekwexp(self):
+ '''Returns regex for expanded keywords.'''
+ return re.compile(r'\$(%s): [^$\n\r]*? \$' % self.escape)
+
+ def substitute(self, data, path, ctx, subfunc):
+ '''Replaces keywords in data with expanded template.'''
+ def kwsub(mobj):
+ kw = mobj.group(1)
+ ct = cmdutil.changeset_templater(self.ui, self.repo,
+ False, None, '', False)
+ ct.use_template(self.templates[kw])
+ self.ui.pushbuffer()
+ ct.show(ctx, root=self.repo.root, file=path)
+ ekw = templatefilters.firstline(self.ui.popbuffer())
+ return '$%s: %s $' % (kw, ekw)
+ return subfunc(kwsub, data)
+
+ def linkctx(self, path, fileid):
+ '''Similar to filelog.linkrev, but returns a changectx.'''
+ return self.repo.filectx(path, fileid=fileid).changectx()
+
+ def expand(self, path, node, data):
+ '''Returns data with keywords expanded.'''
+ if not self.restrict and self.match(path) and not util.binary(data):
+ ctx = self.linkctx(path, node)
+ return self.substitute(data, path, ctx, self.rekw.sub)
+ return data
+
+ def iskwfile(self, cand, ctx):
+ '''Returns subset of candidates which are configured for keyword
+ expansion but are not symbolic links.'''
+ return [f for f in cand if self.match(f) and 'l' not in ctx.flags(f)]
+
+ def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
+ '''Overwrites selected files expanding/shrinking keywords.'''
+ if self.restrict or lookup or self.postcommit: # exclude kw_copy
+ candidates = self.iskwfile(candidates, ctx)
+ if not candidates:
+ return
+ kwcmd = self.restrict and lookup # kwexpand/kwshrink
+ if self.restrict or expand and lookup:
+ mf = ctx.manifest()
+ if self.restrict or rekw:
+ re_kw = self.rekw
+ else:
+ re_kw = self.rekwexp
+ if expand:
+ msg = _('overwriting %s expanding keywords\n')
+ else:
+ msg = _('overwriting %s shrinking keywords\n')
+ for f in candidates:
+ if self.restrict:
+ data = self.repo.file(f).read(mf[f])
+ else:
+ data = self.repo.wread(f)
+ if util.binary(data):
+ continue
+ if expand:
+ if lookup:
+ ctx = self.linkctx(f, mf[f])
+ data, found = self.substitute(data, f, ctx, re_kw.subn)
+ elif self.restrict:
+ found = re_kw.search(data)
+ else:
+ data, found = _shrinktext(data, re_kw.subn)
+ if found:
+ self.ui.note(msg % f)
+ fp = self.repo.wopener(f, "wb", atomictemp=True)
+ fp.write(data)
+ fp.close()
+ if kwcmd:
+ self.repo.dirstate.normal(f)
+ elif self.postcommit:
+ self.repo.dirstate.normallookup(f)
+
+ def shrink(self, fname, text):
+ '''Returns text with all keyword substitutions removed.'''
+ if self.match(fname) and not util.binary(text):
+ return _shrinktext(text, self.rekwexp.sub)
+ return text
+
+ def shrinklines(self, fname, lines):
+ '''Returns lines with keyword substitutions removed.'''
+ if self.match(fname):
+ text = ''.join(lines)
+ if not util.binary(text):
+ return _shrinktext(text, self.rekwexp.sub).splitlines(True)
+ return lines
+
+ def wread(self, fname, data):
+ '''If in restricted mode returns data read from wdir with
+ keyword substitutions removed.'''
+ if self.restrict:
+ return self.shrink(fname, data)
+ return data
+
+class kwfilelog(filelog.filelog):
+ '''
+ Subclass of filelog to hook into its read, add, cmp methods.
+ Keywords are "stored" unexpanded, and processed on reading.
+ '''
+ def __init__(self, opener, kwt, path):
+ super(kwfilelog, self).__init__(opener, path)
+ self.kwt = kwt
+ self.path = path
+
+ def read(self, node):
+ '''Expands keywords when reading filelog.'''
+ data = super(kwfilelog, self).read(node)
+ if self.renamed(node):
+ return data
+ return self.kwt.expand(self.path, node, data)
+
+ def add(self, text, meta, tr, link, p1=None, p2=None):
+ '''Removes keyword substitutions when adding to filelog.'''
+ text = self.kwt.shrink(self.path, text)
+ return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
+
+ def cmp(self, node, text):
+ '''Removes keyword substitutions for comparison.'''
+ text = self.kwt.shrink(self.path, text)
+ return super(kwfilelog, self).cmp(node, text)
+
+def _status(ui, repo, wctx, kwt, *pats, **opts):
+ '''Bails out if [keyword] configuration is not active.
+ Returns status of working directory.'''
+ if kwt:
+ return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
+ unknown=opts.get('unknown') or opts.get('all'))
+ if ui.configitems('keyword'):
+ raise util.Abort(_('[keyword] patterns cannot match'))
+ raise util.Abort(_('no [keyword] patterns configured'))
+
+def _kwfwrite(ui, repo, expand, *pats, **opts):
+ '''Selects files and passes them to kwtemplater.overwrite.'''
+ wctx = repo[None]
+ if len(wctx.parents()) > 1:
+ raise util.Abort(_('outstanding uncommitted merge'))
+ kwt = kwtools['templater']
+ wlock = repo.wlock()
+ try:
+ status = _status(ui, repo, wctx, kwt, *pats, **opts)
+ modified, added, removed, deleted, unknown, ignored, clean = status
+ if modified or added or removed or deleted:
+ raise util.Abort(_('outstanding uncommitted changes'))
+ kwt.overwrite(wctx, clean, True, expand)
+ finally:
+ wlock.release()
+
+@command('kwdemo',
+ [('d', 'default', None, _('show default keyword template maps')),
+ ('f', 'rcfile', '',
+ _('read maps from rcfile'), _('FILE'))],
+ _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'))
+def demo(ui, repo, *args, **opts):
+ '''print [keywordmaps] configuration and an expansion example
+
+ Show current, custom, or default keyword template maps and their
+ expansions.
+
+ Extend the current configuration by specifying maps as arguments
+ and using -f/--rcfile to source an external hgrc file.
+
+ Use -d/--default to disable current configuration.
+
+ See :hg:`help templates` for information on templates and filters.
+ '''
+ def demoitems(section, items):
+ ui.write('[%s]\n' % section)
+ for k, v in sorted(items):
+ ui.write('%s = %s\n' % (k, v))
+
+ fn = 'demo.txt'
+ tmpdir = tempfile.mkdtemp('', 'kwdemo.')
+ ui.note(_('creating temporary repository at %s\n') % tmpdir)
+ repo = localrepo.localrepository(ui, tmpdir, True)
+ ui.setconfig('keyword', fn, '')
+ svn = ui.configbool('keywordset', 'svn')
+ # explicitly set keywordset for demo output
+ ui.setconfig('keywordset', 'svn', svn)
+
+ uikwmaps = ui.configitems('keywordmaps')
+ if args or opts.get('rcfile'):
+ ui.status(_('\n\tconfiguration using custom keyword template maps\n'))
+ if uikwmaps:
+ ui.status(_('\textending current template maps\n'))
+ if opts.get('default') or not uikwmaps:
+ if svn:
+ ui.status(_('\toverriding default svn keywordset\n'))
+ else:
+ ui.status(_('\toverriding default cvs keywordset\n'))
+ if opts.get('rcfile'):
+ ui.readconfig(opts.get('rcfile'))
+ if args:
+ # simulate hgrc parsing
+ rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
+ fp = repo.opener('hgrc', 'w')
+ fp.writelines(rcmaps)
+ fp.close()
+ ui.readconfig(repo.join('hgrc'))
+ kwmaps = dict(ui.configitems('keywordmaps'))
+ elif opts.get('default'):
+ if svn:
+ ui.status(_('\n\tconfiguration using default svn keywordset\n'))
+ else:
+ ui.status(_('\n\tconfiguration using default cvs keywordset\n'))
+ kwmaps = _defaultkwmaps(ui)
+ if uikwmaps:
+ ui.status(_('\tdisabling current template maps\n'))
+ for k, v in kwmaps.iteritems():
+ ui.setconfig('keywordmaps', k, v)
+ else:
+ ui.status(_('\n\tconfiguration using current keyword template maps\n'))
+ if uikwmaps:
+ kwmaps = dict(uikwmaps)
+ else:
+ kwmaps = _defaultkwmaps(ui)
+
+ uisetup(ui)
+ reposetup(ui, repo)
+ ui.write('[extensions]\nkeyword =\n')
+ demoitems('keyword', ui.configitems('keyword'))
+ demoitems('keywordset', ui.configitems('keywordset'))
+ demoitems('keywordmaps', kwmaps.iteritems())
+ keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
+ repo.wopener.write(fn, keywords)
+ repo[None].add([fn])
+ ui.note(_('\nkeywords written to %s:\n') % fn)
+ ui.note(keywords)
+ repo.dirstate.setbranch('demobranch')
+ for name, cmd in ui.configitems('hooks'):
+ if name.split('.', 1)[0].find('commit') > -1:
+ repo.ui.setconfig('hooks', name, '')
+ msg = _('hg keyword configuration and expansion example')
+ ui.note("hg ci -m '%s'\n" % msg) # check-code-ignore
+ repo.commit(text=msg)
+ ui.status(_('\n\tkeywords expanded\n'))
+ ui.write(repo.wread(fn))
+ shutil.rmtree(tmpdir, ignore_errors=True)
+
+@command('kwexpand', commands.walkopts, _('hg kwexpand [OPTION]... [FILE]...'))
+def expand(ui, repo, *pats, **opts):
+ '''expand keywords in the working directory
+
+ Run after (re)enabling keyword expansion.
+
+ kwexpand refuses to run if given files contain local changes.
+ '''
+ # 3rd argument sets expansion to True
+ _kwfwrite(ui, repo, True, *pats, **opts)
+
+@command('kwfiles',
+ [('A', 'all', None, _('show keyword status flags of all files')),
+ ('i', 'ignore', None, _('show files excluded from expansion')),
+ ('u', 'unknown', None, _('only show unknown (not tracked) files')),
+ ] + commands.walkopts,
+ _('hg kwfiles [OPTION]... [FILE]...'))
+def files(ui, repo, *pats, **opts):
+ '''show files configured for keyword expansion
+
+ List which files in the working directory are matched by the
+ [keyword] configuration patterns.
+
+ Useful to prevent inadvertent keyword expansion and to speed up
+ execution by including only files that are actual candidates for
+ expansion.
+
+ See :hg:`help keyword` on how to construct patterns both for
+ inclusion and exclusion of files.
+
+ With -A/--all and -v/--verbose the codes used to show the status
+ of files are::
+
+ K = keyword expansion candidate
+ k = keyword expansion candidate (not tracked)
+ I = ignored
+ i = ignored (not tracked)
+ '''
+ kwt = kwtools['templater']
+ wctx = repo[None]
+ status = _status(ui, repo, wctx, kwt, *pats, **opts)
+ cwd = pats and repo.getcwd() or ''
+ modified, added, removed, deleted, unknown, ignored, clean = status
+ files = []
+ if not opts.get('unknown') or opts.get('all'):
+ files = sorted(modified + added + clean)
+ kwfiles = kwt.iskwfile(files, wctx)
+ kwdeleted = kwt.iskwfile(deleted, wctx)
+ kwunknown = kwt.iskwfile(unknown, wctx)
+ if not opts.get('ignore') or opts.get('all'):
+ showfiles = kwfiles, kwdeleted, kwunknown
+ else:
+ showfiles = [], [], []
+ if opts.get('all') or opts.get('ignore'):
+ showfiles += ([f for f in files if f not in kwfiles],
+ [f for f in unknown if f not in kwunknown])
+ kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
+ kwstates = zip(kwlabels, 'K!kIi', showfiles)
+ fm = ui.formatter('kwfiles', opts)
+ fmt = '%.0s%s\n'
+ if opts.get('all') or ui.verbose:
+ fmt = '%s %s\n'
+ for kwstate, char, filenames in kwstates:
+ label = 'kwfiles.' + kwstate
+ for f in filenames:
+ fm.startitem()
+ fm.write('kwstatus path', fmt, char,
+ repo.pathto(f, cwd), label=label)
+ fm.end()
+
+@command('kwshrink', commands.walkopts, _('hg kwshrink [OPTION]... [FILE]...'))
+def shrink(ui, repo, *pats, **opts):
+ '''revert expanded keywords in the working directory
+
+ Must be run before changing/disabling active keywords.
+
+ kwshrink refuses to run if given files contain local changes.
+ '''
+ # 3rd argument sets expansion to False
+ _kwfwrite(ui, repo, False, *pats, **opts)
+
+
+def uisetup(ui):
+ ''' Monkeypatches dispatch._parse to retrieve user command.'''
+
+ def kwdispatch_parse(orig, ui, args):
+ '''Monkeypatch dispatch._parse to obtain running hg command.'''
+ cmd, func, args, options, cmdoptions = orig(ui, args)
+ kwtools['hgcmd'] = cmd
+ return cmd, func, args, options, cmdoptions
+
+ extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
+
+def reposetup(ui, repo):
+ '''Sets up repo as kwrepo for keyword substitution.
+ Overrides file method to return kwfilelog instead of filelog
+ if file matches user configuration.
+ Wraps commit to overwrite configured files with updated
+ keyword substitutions.
+ Monkeypatches patch and webcommands.'''
+
+ try:
+ if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
+ or '.hg' in util.splitpath(repo.root)
+ or repo._url.startswith('bundle:')):
+ return
+ except AttributeError:
+ pass
+
+ inc, exc = [], ['.hg*']
+ for pat, opt in ui.configitems('keyword'):
+ if opt != 'ignore':
+ inc.append(pat)
+ else:
+ exc.append(pat)
+ if not inc:
+ return
+
+ kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
+
+ class kwrepo(repo.__class__):
+ def file(self, f):
+ if f[0] == '/':
+ f = f[1:]
+ return kwfilelog(self.sopener, kwt, f)
+
+ def wread(self, filename):
+ data = super(kwrepo, self).wread(filename)
+ return kwt.wread(filename, data)
+
+ def commit(self, *args, **opts):
+ # use custom commitctx for user commands
+ # other extensions can still wrap repo.commitctx directly
+ self.commitctx = self.kwcommitctx
+ try:
+ return super(kwrepo, self).commit(*args, **opts)
+ finally:
+ del self.commitctx
+
+ def kwcommitctx(self, ctx, error=False):
+ n = super(kwrepo, self).commitctx(ctx, error)
+ # no lock needed, only called from repo.commit() which already locks
+ if not kwt.postcommit:
+ restrict = kwt.restrict
+ kwt.restrict = True
+ kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
+ False, True)
+ kwt.restrict = restrict
+ return n
+
+ def rollback(self, dryrun=False, force=False):
+ wlock = self.wlock()
+ try:
+ if not dryrun:
+ changed = self['.'].files()
+ ret = super(kwrepo, self).rollback(dryrun, force)
+ if not dryrun:
+ ctx = self['.']
+ modified, added = _preselect(self[None].status(), changed)
+ kwt.overwrite(ctx, modified, True, True)
+ kwt.overwrite(ctx, added, True, False)
+ return ret
+ finally:
+ wlock.release()
+
+ # monkeypatches
+ def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
+ '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
+ rejects or conflicts due to expanded keywords in working dir.'''
+ orig(self, ui, gp, backend, store, eolmode)
+ # shrink keywords read from working dir
+ self.lines = kwt.shrinklines(self.fname, self.lines)
+
+ def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
+ opts=None, prefix=''):
+ '''Monkeypatch patch.diff to avoid expansion.'''
+ kwt.restrict = True
+ return orig(repo, node1, node2, match, changes, opts, prefix)
+
+ def kwweb_skip(orig, web, req, tmpl):
+ '''Wraps webcommands.x turning off keyword expansion.'''
+ kwt.match = util.never
+ return orig(web, req, tmpl)
+
+ def kw_amend(orig, ui, repo, commitfunc, old, extra, pats, opts):
+ '''Wraps cmdutil.amend expanding keywords after amend.'''
+ wlock = repo.wlock()
+ try:
+ kwt.postcommit = True
+ newid = orig(ui, repo, commitfunc, old, extra, pats, opts)
+ if newid != old.node():
+ ctx = repo[newid]
+ kwt.restrict = True
+ kwt.overwrite(ctx, ctx.files(), False, True)
+ kwt.restrict = False
+ return newid
+ finally:
+ wlock.release()
+
+ def kw_copy(orig, ui, repo, pats, opts, rename=False):
+ '''Wraps cmdutil.copy so that copy/rename destinations do not
+ contain expanded keywords.
+ Note that the source of a regular file destination may also be a
+ symlink:
+ hg cp sym x -> x is symlink
+ cp sym x; hg cp -A sym x -> x is file (maybe expanded keywords)
+ For the latter we have to follow the symlink to find out whether its
+ target is configured for expansion and we therefore must unexpand the
+ keywords in the destination.'''
+ wlock = repo.wlock()
+ try:
+ orig(ui, repo, pats, opts, rename)
+ if opts.get('dry_run'):
+ return
+ wctx = repo[None]
+ cwd = repo.getcwd()
+
+ def haskwsource(dest):
+ '''Returns true if dest is a regular file and configured for
+ expansion or a symlink which points to a file configured for
+ expansion. '''
+ source = repo.dirstate.copied(dest)
+ if 'l' in wctx.flags(source):
+ source = scmutil.canonpath(repo.root, cwd,
+ os.path.realpath(source))
+ return kwt.match(source)
+
+ candidates = [f for f in repo.dirstate.copies() if
+ 'l' not in wctx.flags(f) and haskwsource(f)]
+ kwt.overwrite(wctx, candidates, False, False)
+ finally:
+ wlock.release()
+
+ def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
+ '''Wraps record.dorecord expanding keywords after recording.'''
+ wlock = repo.wlock()
+ try:
+ # record returns 0 even when nothing has changed
+ # therefore compare nodes before and after
+ kwt.postcommit = True
+ ctx = repo['.']
+ wstatus = repo[None].status()
+ ret = orig(ui, repo, commitfunc, *pats, **opts)
+ recctx = repo['.']
+ if ctx != recctx:
+ modified, added = _preselect(wstatus, recctx.files())
+ kwt.restrict = False
+ kwt.overwrite(recctx, modified, False, True)
+ kwt.overwrite(recctx, added, False, True, True)
+ kwt.restrict = True
+ return ret
+ finally:
+ wlock.release()
+
+ def kwfilectx_cmp(orig, self, fctx):
+ # keyword affects data size, comparing wdir and filelog size does
+ # not make sense
+ if (fctx._filerev is None and
+ (self._repo._encodefilterpats or
+ kwt.match(fctx.path()) and 'l' not in fctx.flags() or
+ self.size() - 4 == fctx.size()) or
+ self.size() == fctx.size()):
+ return self._filelog.cmp(self._filenode, fctx.data())
+ return True
+
+ extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
+ extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
+ extensions.wrapfunction(patch, 'diff', kw_diff)
+ extensions.wrapfunction(cmdutil, 'amend', kw_amend)
+ extensions.wrapfunction(cmdutil, 'copy', kw_copy)
+ for c in 'annotate changeset rev filediff diff'.split():
+ extensions.wrapfunction(webcommands, c, kwweb_skip)
+ for name in recordextensions.split():
+ try:
+ record = extensions.find(name)
+ extensions.wrapfunction(record, 'dorecord', kw_dorecord)
+ except KeyError:
+ pass
+
+ repo.__class__ = kwrepo
diff --git a/hgext/largefiles/CONTRIBUTORS b/hgext/largefiles/CONTRIBUTORS
new file mode 100644
index 0000000..9bef457
--- /dev/null
+++ b/hgext/largefiles/CONTRIBUTORS
@@ -0,0 +1,4 @@
+Greg Ward, author of the original bfiles extension
+Na'Tosha Bard of Unity Technologies
+Fog Creek Software
+Special thanks to the University of Toronto and the UCOSP program
diff --git a/hgext/largefiles/__init__.py b/hgext/largefiles/__init__.py
new file mode 100644
index 0000000..12c80fa
--- /dev/null
+++ b/hgext/largefiles/__init__.py
@@ -0,0 +1,102 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''track large binary files
+
+Large binary files tend to be not very compressible, not very
+diffable, and not at all mergeable. Such files are not handled
+efficiently by Mercurial's storage format (revlog), which is based on
+compressed binary deltas; storing large binary files as regular
+Mercurial files wastes bandwidth and disk space and increases
+Mercurial's memory usage. The largefiles extension addresses these
+problems by adding a centralized client-server layer on top of
+Mercurial: largefiles live in a *central store* out on the network
+somewhere, and you only fetch the revisions that you need when you
+need them.
+
+largefiles works by maintaining a "standin file" in .hglf/ for each
+largefile. The standins are small (41 bytes: an SHA-1 hash plus
+newline) and are tracked by Mercurial. Largefile revisions are
+identified by the SHA-1 hash of their contents, which is written to
+the standin. largefiles uses that revision ID to get/put largefile
+revisions from/to the central store. This saves both disk space and
+bandwidth, since you don't need to retrieve all historical revisions
+of large files when you clone or pull.
+
+To start a new repository or add new large binary files, just add
+--large to your :hg:`add` command. For example::
+
+ $ dd if=/dev/urandom of=randomdata count=2000
+ $ hg add --large randomdata
+ $ hg commit -m 'add randomdata as a largefile'
+
+When you push a changeset that adds/modifies largefiles to a remote
+repository, its largefile revisions will be uploaded along with it.
+Note that the remote Mercurial must also have the largefiles extension
+enabled for this to work.
+
+When you pull a changeset that affects largefiles from a remote
+repository, Mercurial behaves as normal. However, when you update to
+such a revision, any largefiles needed by that revision are downloaded
+and cached (if they have never been downloaded before). This means
+that network access may be required to update to changesets you have
+not previously updated to.
+
+If you already have large files tracked by Mercurial without the
+largefiles extension, you will need to convert your repository in
+order to benefit from largefiles. This is done with the
+:hg:`lfconvert` command::
+
+ $ hg lfconvert --size 10 oldrepo newrepo
+
+In repositories that already have largefiles in them, any new file
+over 10MB will automatically be added as a largefile. To change this
+threshold, set ``largefiles.minsize`` in your Mercurial config file
+to the minimum size in megabytes to track as a largefile, or use the
+--lfsize option to the add command (also in megabytes)::
+
+ [largefiles]
+ minsize = 2
+
+ $ hg add --lfsize 2
+
+The ``largefiles.patterns`` config option allows you to specify a list
+of filename patterns (see :hg:`help patterns`) that should always be
+tracked as largefiles::
+
+ [largefiles]
+ patterns =
+ *.jpg
+ re:.*\.(png|bmp)$
+ library.zip
+ content/audio/*
+
+Files that match one of these patterns will be added as largefiles
+regardless of their size.
+
+The ``largefiles.minsize`` and ``largefiles.patterns`` config options
+will be ignored for any repositories not already containing a
+largefile. To add the first largefile to a repository, you must
+explicitly do so with the --large flag passed to the :hg:`add`
+command.
+'''
+
+from mercurial import commands
+
+import lfcommands
+import reposetup
+import uisetup
+
+testedwith = 'internal'
+
+reposetup = reposetup.reposetup
+uisetup = uisetup.uisetup
+
+commands.norepo += " lfconvert"
+
+cmdtable = lfcommands.cmdtable
diff --git a/hgext/largefiles/basestore.py b/hgext/largefiles/basestore.py
new file mode 100644
index 0000000..55aa4a0
--- /dev/null
+++ b/hgext/largefiles/basestore.py
@@ -0,0 +1,195 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''base class for store implementations and store-related utility code'''
+
+import binascii
+import re
+
+from mercurial import util, node, hg
+from mercurial.i18n import _
+
+import lfutil
+
+class StoreError(Exception):
+ '''Raised when there is a problem getting files from or putting
+ files to a central store.'''
+ def __init__(self, filename, hash, url, detail):
+ self.filename = filename
+ self.hash = hash
+ self.url = url
+ self.detail = detail
+
+ def longmessage(self):
+ if self.url:
+ return ('%s: %s\n'
+ '(failed URL: %s)\n'
+ % (self.filename, self.detail, self.url))
+ else:
+ return ('%s: %s\n'
+ '(no default or default-push path set in hgrc)\n'
+ % (self.filename, self.detail))
+
+ def __str__(self):
+ return "%s: %s" % (self.url, self.detail)
+
+class basestore(object):
+ def __init__(self, ui, repo, url):
+ self.ui = ui
+ self.repo = repo
+ self.url = url
+
+ def put(self, source, hash):
+ '''Put source file into the store under <filename>/<hash>.'''
+ raise NotImplementedError('abstract method')
+
+ def exists(self, hashes):
+ '''Check to see if the store contains the given hashes.'''
+ raise NotImplementedError('abstract method')
+
+ def get(self, files):
+ '''Get the specified largefiles from the store and write to local
+ files under repo.root. files is a list of (filename, hash)
+ tuples. Return (success, missing), lists of files successfuly
+ downloaded and those not found in the store. success is a list
+ of (filename, hash) tuples; missing is a list of filenames that
+ we could not get. (The detailed error message will already have
+ been presented to the user, so missing is just supplied as a
+ summary.)'''
+ success = []
+ missing = []
+ ui = self.ui
+
+ at = 0
+ for filename, hash in files:
+ ui.progress(_('getting largefiles'), at, unit='lfile',
+ total=len(files))
+ at += 1
+ ui.note(_('getting %s:%s\n') % (filename, hash))
+
+ storefilename = lfutil.storepath(self.repo, hash)
+ tmpfile = util.atomictempfile(storefilename,
+ createmode=self.repo.store.createmode)
+
+ try:
+ hhash = binascii.hexlify(self._getfile(tmpfile, filename, hash))
+ except StoreError, err:
+ ui.warn(err.longmessage())
+ hhash = ""
+
+ if hhash != hash:
+ if hhash != "":
+ ui.warn(_('%s: data corruption (expected %s, got %s)\n')
+ % (filename, hash, hhash))
+ tmpfile.discard() # no-op if it's already closed
+ missing.append(filename)
+ continue
+
+ tmpfile.close()
+ lfutil.linktousercache(self.repo, hash)
+ success.append((filename, hhash))
+
+ ui.progress(_('getting largefiles'), None)
+ return (success, missing)
+
+ def verify(self, revs, contents=False):
+ '''Verify the existence (and, optionally, contents) of every big
+ file revision referenced by every changeset in revs.
+ Return 0 if all is well, non-zero on any errors.'''
+ write = self.ui.write
+ failed = False
+
+ write(_('searching %d changesets for largefiles\n') % len(revs))
+ verified = set() # set of (filename, filenode) tuples
+
+ for rev in revs:
+ cctx = self.repo[rev]
+ cset = "%d:%s" % (cctx.rev(), node.short(cctx.node()))
+
+ failed = util.any(self._verifyfile(
+ cctx, cset, contents, standin, verified) for standin in cctx)
+
+ numrevs = len(verified)
+ numlfiles = len(set([fname for (fname, fnode) in verified]))
+ if contents:
+ write(_('verified contents of %d revisions of %d largefiles\n')
+ % (numrevs, numlfiles))
+ else:
+ write(_('verified existence of %d revisions of %d largefiles\n')
+ % (numrevs, numlfiles))
+
+ return int(failed)
+
+ def _getfile(self, tmpfile, filename, hash):
+ '''Fetch one revision of one file from the store and write it
+ to tmpfile. Compute the hash of the file on-the-fly as it
+ downloads and return the binary hash. Close tmpfile. Raise
+ StoreError if unable to download the file (e.g. it does not
+ exist in the store).'''
+ raise NotImplementedError('abstract method')
+
+ def _verifyfile(self, cctx, cset, contents, standin, verified):
+ '''Perform the actual verification of a file in the store.
+ '''
+ raise NotImplementedError('abstract method')
+
+import localstore, wirestore
+
+_storeprovider = {
+ 'file': [localstore.localstore],
+ 'http': [wirestore.wirestore],
+ 'https': [wirestore.wirestore],
+ 'ssh': [wirestore.wirestore],
+ }
+
+_scheme_re = re.compile(r'^([a-zA-Z0-9+-.]+)://')
+
+# During clone this function is passed the src's ui object
+# but it needs the dest's ui object so it can read out of
+# the config file. Use repo.ui instead.
+def _openstore(repo, remote=None, put=False):
+ ui = repo.ui
+
+ if not remote:
+ lfpullsource = getattr(repo, 'lfpullsource', None)
+ if lfpullsource:
+ path = ui.expandpath(lfpullsource)
+ else:
+ path = ui.expandpath('default-push', 'default')
+
+ # ui.expandpath() leaves 'default-push' and 'default' alone if
+ # they cannot be expanded: fallback to the empty string,
+ # meaning the current directory.
+ if path == 'default-push' or path == 'default':
+ path = ''
+ remote = repo
+ else:
+ remote = hg.peer(repo, {}, path)
+
+ # The path could be a scheme so use Mercurial's normal functionality
+ # to resolve the scheme to a repository and use its path
+ path = util.safehasattr(remote, 'url') and remote.url() or remote.path
+
+ match = _scheme_re.match(path)
+ if not match: # regular filesystem path
+ scheme = 'file'
+ else:
+ scheme = match.group(1)
+
+ try:
+ storeproviders = _storeprovider[scheme]
+ except KeyError:
+ raise util.Abort(_('unsupported URL scheme %r') % scheme)
+
+ for classobj in storeproviders:
+ try:
+ return classobj(ui, repo, remote)
+ except lfutil.storeprotonotcapable:
+ pass
+
+ raise util.Abort(_('%s does not appear to be a largefile store') % path)
diff --git a/hgext/largefiles/lfcommands.py b/hgext/largefiles/lfcommands.py
new file mode 100644
index 0000000..de42edd
--- /dev/null
+++ b/hgext/largefiles/lfcommands.py
@@ -0,0 +1,549 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''High-level command function for lfconvert, plus the cmdtable.'''
+
+import os
+import shutil
+
+from mercurial import util, match as match_, hg, node, context, error, \
+ cmdutil, scmutil
+from mercurial.i18n import _
+from mercurial.lock import release
+
+import lfutil
+import basestore
+
+# -- Commands ----------------------------------------------------------
+
+def lfconvert(ui, src, dest, *pats, **opts):
+ '''convert a normal repository to a largefiles repository
+
+ Convert repository SOURCE to a new repository DEST, identical to
+ SOURCE except that certain files will be converted as largefiles:
+ specifically, any file that matches any PATTERN *or* whose size is
+ above the minimum size threshold is converted as a largefile. The
+ size used to determine whether or not to track a file as a
+ largefile is the size of the first version of the file. The
+ minimum size can be specified either with --size or in
+ configuration as ``largefiles.size``.
+
+ After running this command you will need to make sure that
+ largefiles is enabled anywhere you intend to push the new
+ repository.
+
+ Use --to-normal to convert largefiles back to normal files; after
+ this, the DEST repository can be used without largefiles at all.'''
+
+ if opts['to_normal']:
+ tolfile = False
+ else:
+ tolfile = True
+ size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
+
+ if not hg.islocal(src):
+ raise util.Abort(_('%s is not a local Mercurial repo') % src)
+ if not hg.islocal(dest):
+ raise util.Abort(_('%s is not a local Mercurial repo') % dest)
+
+ rsrc = hg.repository(ui, src)
+ ui.status(_('initializing destination %s\n') % dest)
+ rdst = hg.repository(ui, dest, create=True)
+
+ success = False
+ dstwlock = dstlock = None
+ try:
+ # Lock destination to prevent modification while it is converted to.
+ # Don't need to lock src because we are just reading from its history
+ # which can't change.
+ dstwlock = rdst.wlock()
+ dstlock = rdst.lock()
+
+ # Get a list of all changesets in the source. The easy way to do this
+ # is to simply walk the changelog, using changelog.nodesbewteen().
+ # Take a look at mercurial/revlog.py:639 for more details.
+ # Use a generator instead of a list to decrease memory usage
+ ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None,
+ rsrc.heads())[0])
+ revmap = {node.nullid: node.nullid}
+ if tolfile:
+ lfiles = set()
+ normalfiles = set()
+ if not pats:
+ pats = ui.configlist(lfutil.longname, 'patterns', default=[])
+ if pats:
+ matcher = match_.match(rsrc.root, '', list(pats))
+ else:
+ matcher = None
+
+ lfiletohash = {}
+ for ctx in ctxs:
+ ui.progress(_('converting revisions'), ctx.rev(),
+ unit=_('revision'), total=rsrc['tip'].rev())
+ _lfconvert_addchangeset(rsrc, rdst, ctx, revmap,
+ lfiles, normalfiles, matcher, size, lfiletohash)
+ ui.progress(_('converting revisions'), None)
+
+ if os.path.exists(rdst.wjoin(lfutil.shortname)):
+ shutil.rmtree(rdst.wjoin(lfutil.shortname))
+
+ for f in lfiletohash.keys():
+ if os.path.isfile(rdst.wjoin(f)):
+ os.unlink(rdst.wjoin(f))
+ try:
+ os.removedirs(os.path.dirname(rdst.wjoin(f)))
+ except OSError:
+ pass
+
+ # If there were any files converted to largefiles, add largefiles
+ # to the destination repository's requirements.
+ if lfiles:
+ rdst.requirements.add('largefiles')
+ rdst._writerequirements()
+ else:
+ for ctx in ctxs:
+ ui.progress(_('converting revisions'), ctx.rev(),
+ unit=_('revision'), total=rsrc['tip'].rev())
+ _addchangeset(ui, rsrc, rdst, ctx, revmap)
+
+ ui.progress(_('converting revisions'), None)
+ success = True
+ finally:
+ rdst.dirstate.clear()
+ release(dstlock, dstwlock)
+ if not success:
+ # we failed, remove the new directory
+ shutil.rmtree(rdst.root)
+
+def _addchangeset(ui, rsrc, rdst, ctx, revmap):
+ # Convert src parents to dst parents
+ parents = _convertparents(ctx, revmap)
+
+ # Generate list of changed files
+ files = _getchangedfiles(ctx, parents)
+
+ def getfilectx(repo, memctx, f):
+ if lfutil.standin(f) in files:
+ # if the file isn't in the manifest then it was removed
+ # or renamed, raise IOError to indicate this
+ try:
+ fctx = ctx.filectx(lfutil.standin(f))
+ except error.LookupError:
+ raise IOError
+ renamed = fctx.renamed()
+ if renamed:
+ renamed = lfutil.splitstandin(renamed[0])
+
+ hash = fctx.data().strip()
+ path = lfutil.findfile(rsrc, hash)
+ ### TODO: What if the file is not cached?
+ data = ''
+ fd = None
+ try:
+ fd = open(path, 'rb')
+ data = fd.read()
+ finally:
+ if fd:
+ fd.close()
+ return context.memfilectx(f, data, 'l' in fctx.flags(),
+ 'x' in fctx.flags(), renamed)
+ else:
+ return _getnormalcontext(repo.ui, ctx, f, revmap)
+
+ dstfiles = []
+ for file in files:
+ if lfutil.isstandin(file):
+ dstfiles.append(lfutil.splitstandin(file))
+ else:
+ dstfiles.append(file)
+ # Commit
+ _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
+
+def _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, lfiles, normalfiles,
+ matcher, size, lfiletohash):
+ # Convert src parents to dst parents
+ parents = _convertparents(ctx, revmap)
+
+ # Generate list of changed files
+ files = _getchangedfiles(ctx, parents)
+
+ dstfiles = []
+ for f in files:
+ if f not in lfiles and f not in normalfiles:
+ islfile = _islfile(f, ctx, matcher, size)
+ # If this file was renamed or copied then copy
+ # the lfileness of its predecessor
+ if f in ctx.manifest():
+ fctx = ctx.filectx(f)
+ renamed = fctx.renamed()
+ renamedlfile = renamed and renamed[0] in lfiles
+ islfile |= renamedlfile
+ if 'l' in fctx.flags():
+ if renamedlfile:
+ raise util.Abort(
+ _('renamed/copied largefile %s becomes symlink')
+ % f)
+ islfile = False
+ if islfile:
+ lfiles.add(f)
+ else:
+ normalfiles.add(f)
+
+ if f in lfiles:
+ dstfiles.append(lfutil.standin(f))
+ # largefile in manifest if it has not been removed/renamed
+ if f in ctx.manifest():
+ fctx = ctx.filectx(f)
+ if 'l' in fctx.flags():
+ renamed = fctx.renamed()
+ if renamed and renamed[0] in lfiles:
+ raise util.Abort(_('largefile %s becomes symlink') % f)
+
+ # largefile was modified, update standins
+ fullpath = rdst.wjoin(f)
+ util.makedirs(os.path.dirname(fullpath))
+ m = util.sha1('')
+ m.update(ctx[f].data())
+ hash = m.hexdigest()
+ if f not in lfiletohash or lfiletohash[f] != hash:
+ try:
+ fd = open(fullpath, 'wb')
+ fd.write(ctx[f].data())
+ finally:
+ if fd:
+ fd.close()
+ executable = 'x' in ctx[f].flags()
+ os.chmod(fullpath, lfutil.getmode(executable))
+ lfutil.writestandin(rdst, lfutil.standin(f), hash,
+ executable)
+ lfiletohash[f] = hash
+ else:
+ # normal file
+ dstfiles.append(f)
+
+ def getfilectx(repo, memctx, f):
+ if lfutil.isstandin(f):
+ # if the file isn't in the manifest then it was removed
+ # or renamed, raise IOError to indicate this
+ srcfname = lfutil.splitstandin(f)
+ try:
+ fctx = ctx.filectx(srcfname)
+ except error.LookupError:
+ raise IOError
+ renamed = fctx.renamed()
+ if renamed:
+ # standin is always a largefile because largefile-ness
+ # doesn't change after rename or copy
+ renamed = lfutil.standin(renamed[0])
+
+ return context.memfilectx(f, lfiletohash[srcfname] + '\n', 'l' in
+ fctx.flags(), 'x' in fctx.flags(), renamed)
+ else:
+ return _getnormalcontext(repo.ui, ctx, f, revmap)
+
+ # Commit
+ _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
+
+def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap):
+ mctx = context.memctx(rdst, parents, ctx.description(), dstfiles,
+ getfilectx, ctx.user(), ctx.date(), ctx.extra())
+ ret = rdst.commitctx(mctx)
+ rdst.setparents(ret)
+ revmap[ctx.node()] = rdst.changelog.tip()
+
+# Generate list of changed files
+def _getchangedfiles(ctx, parents):
+ files = set(ctx.files())
+ if node.nullid not in parents:
+ mc = ctx.manifest()
+ mp1 = ctx.parents()[0].manifest()
+ mp2 = ctx.parents()[1].manifest()
+ files |= (set(mp1) | set(mp2)) - set(mc)
+ for f in mc:
+ if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
+ files.add(f)
+ return files
+
+# Convert src parents to dst parents
+def _convertparents(ctx, revmap):
+ parents = []
+ for p in ctx.parents():
+ parents.append(revmap[p.node()])
+ while len(parents) < 2:
+ parents.append(node.nullid)
+ return parents
+
+# Get memfilectx for a normal file
+def _getnormalcontext(ui, ctx, f, revmap):
+ try:
+ fctx = ctx.filectx(f)
+ except error.LookupError:
+ raise IOError
+ renamed = fctx.renamed()
+ if renamed:
+ renamed = renamed[0]
+
+ data = fctx.data()
+ if f == '.hgtags':
+ data = _converttags (ui, revmap, data)
+ return context.memfilectx(f, data, 'l' in fctx.flags(),
+ 'x' in fctx.flags(), renamed)
+
+# Remap tag data using a revision map
+def _converttags(ui, revmap, data):
+ newdata = []
+ for line in data.splitlines():
+ try:
+ id, name = line.split(' ', 1)
+ except ValueError:
+ ui.warn(_('skipping incorrectly formatted tag %s\n'
+ % line))
+ continue
+ try:
+ newid = node.bin(id)
+ except TypeError:
+ ui.warn(_('skipping incorrectly formatted id %s\n'
+ % id))
+ continue
+ try:
+ newdata.append('%s %s\n' % (node.hex(revmap[newid]),
+ name))
+ except KeyError:
+ ui.warn(_('no mapping for id %s\n') % id)
+ continue
+ return ''.join(newdata)
+
+def _islfile(file, ctx, matcher, size):
+ '''Return true if file should be considered a largefile, i.e.
+ matcher matches it or it is larger than size.'''
+ # never store special .hg* files as largefiles
+ if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs':
+ return False
+ if matcher and matcher(file):
+ return True
+ try:
+ return ctx.filectx(file).size() >= size * 1024 * 1024
+ except error.LookupError:
+ return False
+
+def uploadlfiles(ui, rsrc, rdst, files):
+ '''upload largefiles to the central store'''
+
+ if not files:
+ return
+
+ store = basestore._openstore(rsrc, rdst, put=True)
+
+ at = 0
+ ui.debug("sending statlfile command for %d largefiles\n" % len(files))
+ retval = store.exists(files)
+ files = filter(lambda h: not retval[h], files)
+ ui.debug("%d largefiles need to be uploaded\n" % len(files))
+
+ for hash in files:
+ ui.progress(_('uploading largefiles'), at, unit='largefile',
+ total=len(files))
+ source = lfutil.findfile(rsrc, hash)
+ if not source:
+ raise util.Abort(_('largefile %s missing from store'
+ ' (needs to be uploaded)') % hash)
+ # XXX check for errors here
+ store.put(source, hash)
+ at += 1
+ ui.progress(_('uploading largefiles'), None)
+
+def verifylfiles(ui, repo, all=False, contents=False):
+ '''Verify that every big file revision in the current changeset
+ exists in the central store. With --contents, also verify that
+ the contents of each big file revision are correct (SHA-1 hash
+ matches the revision ID). With --all, check every changeset in
+ this repository.'''
+ if all:
+ # Pass a list to the function rather than an iterator because we know a
+ # list will work.
+ revs = range(len(repo))
+ else:
+ revs = ['.']
+
+ store = basestore._openstore(repo)
+ return store.verify(revs, contents=contents)
+
+def cachelfiles(ui, repo, node, filelist=None):
+ '''cachelfiles ensures that all largefiles needed by the specified revision
+ are present in the repository's largefile cache.
+
+ returns a tuple (cached, missing). cached is the list of files downloaded
+ by this operation; missing is the list of files that were needed but could
+ not be found.'''
+ lfiles = lfutil.listlfiles(repo, node)
+ if filelist:
+ lfiles = set(lfiles) & set(filelist)
+ toget = []
+
+ for lfile in lfiles:
+ # If we are mid-merge, then we have to trust the standin that is in the
+ # working copy to have the correct hashvalue. This is because the
+ # original hg.merge() already updated the standin as part of the normal
+ # merge process -- we just have to udpate the largefile to match.
+ if (getattr(repo, "_ismerging", False) and
+ os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
+ expectedhash = lfutil.readstandin(repo, lfile)
+ else:
+ expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
+
+ # if it exists and its hash matches, it might have been locally
+ # modified before updating and the user chose 'local'. in this case,
+ # it will not be in any store, so don't look for it.
+ if ((not os.path.exists(repo.wjoin(lfile)) or
+ expectedhash != lfutil.hashfile(repo.wjoin(lfile))) and
+ not lfutil.findfile(repo, expectedhash)):
+ toget.append((lfile, expectedhash))
+
+ if toget:
+ store = basestore._openstore(repo)
+ ret = store.get(toget)
+ return ret
+
+ return ([], [])
+
+def downloadlfiles(ui, repo, rev=None):
+ matchfn = scmutil.match(repo[None],
+ [repo.wjoin(lfutil.shortname)], {})
+ def prepare(ctx, fns):
+ pass
+ totalsuccess = 0
+ totalmissing = 0
+ for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
+ prepare):
+ success, missing = cachelfiles(ui, repo, ctx.node())
+ totalsuccess += len(success)
+ totalmissing += len(missing)
+ ui.status(_("%d additional largefiles cached\n") % totalsuccess)
+ if totalmissing > 0:
+ ui.status(_("%d largefiles failed to download\n") % totalmissing)
+ return totalsuccess, totalmissing
+
+def updatelfiles(ui, repo, filelist=None, printmessage=True):
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate)
+
+ if filelist is not None:
+ lfiles = [f for f in lfiles if f in filelist]
+
+ printed = False
+ if printmessage and lfiles:
+ ui.status(_('getting changed largefiles\n'))
+ printed = True
+ cachelfiles(ui, repo, '.', lfiles)
+
+ updated, removed = 0, 0
+ for i in map(lambda f: _updatelfile(repo, lfdirstate, f), lfiles):
+ # increment the appropriate counter according to _updatelfile's
+ # return value
+ updated += i > 0 and i or 0
+ removed -= i < 0 and i or 0
+ if printmessage and (removed or updated) and not printed:
+ ui.status(_('getting changed largefiles\n'))
+ printed = True
+
+ lfdirstate.write()
+ if printed and printmessage:
+ ui.status(_('%d largefiles updated, %d removed\n') % (updated,
+ removed))
+ finally:
+ wlock.release()
+
+def _updatelfile(repo, lfdirstate, lfile):
+ '''updates a single largefile and copies the state of its standin from
+ the repository's dirstate to its state in the lfdirstate.
+
+ returns 1 if the file was modified, -1 if the file was removed, 0 if the
+ file was unchanged, and None if the needed largefile was missing from the
+ cache.'''
+ ret = 0
+ abslfile = repo.wjoin(lfile)
+ absstandin = repo.wjoin(lfutil.standin(lfile))
+ if os.path.exists(absstandin):
+ if os.path.exists(absstandin+'.orig'):
+ shutil.copyfile(abslfile, abslfile+'.orig')
+ expecthash = lfutil.readstandin(repo, lfile)
+ if (expecthash != '' and
+ (not os.path.exists(abslfile) or
+ expecthash != lfutil.hashfile(abslfile))):
+ if not lfutil.copyfromcache(repo, expecthash, lfile):
+ # use normallookup() to allocate entry in largefiles dirstate,
+ # because lack of it misleads lfilesrepo.status() into
+ # recognition that such cache missing files are REMOVED.
+ lfdirstate.normallookup(lfile)
+ return None # don't try to set the mode
+ else:
+ # Synchronize largefile dirstate to the last modified time of
+ # the file
+ lfdirstate.normal(lfile)
+ ret = 1
+ mode = os.stat(absstandin).st_mode
+ if mode != os.stat(abslfile).st_mode:
+ os.chmod(abslfile, mode)
+ ret = 1
+ else:
+ # Remove lfiles for which the standin is deleted, unless the
+ # lfile is added to the repository again. This happens when a
+ # largefile is converted back to a normal file: the standin
+ # disappears, but a new (normal) file appears as the lfile.
+ if os.path.exists(abslfile) and lfile not in repo[None]:
+ util.unlinkpath(abslfile)
+ ret = -1
+ state = repo.dirstate[lfutil.standin(lfile)]
+ if state == 'n':
+ # When rebasing, we need to synchronize the standin and the largefile,
+ # because otherwise the largefile will get reverted. But for commit's
+ # sake, we have to mark the file as unclean.
+ if getattr(repo, "_isrebasing", False):
+ lfdirstate.normallookup(lfile)
+ else:
+ lfdirstate.normal(lfile)
+ elif state == 'r':
+ lfdirstate.remove(lfile)
+ elif state == 'a':
+ lfdirstate.add(lfile)
+ elif state == '?':
+ lfdirstate.drop(lfile)
+ return ret
+
+def catlfile(repo, lfile, rev, filename):
+ hash = lfutil.readstandin(repo, lfile, rev)
+ if not lfutil.inusercache(repo.ui, hash):
+ store = basestore._openstore(repo)
+ success, missing = store.get([(lfile, hash)])
+ if len(success) != 1:
+ raise util.Abort(
+ _('largefile %s is not in cache and could not be downloaded')
+ % lfile)
+ path = lfutil.usercachepath(repo.ui, hash)
+ fpout = cmdutil.makefileobj(repo, filename)
+ fpin = open(path, "rb")
+ fpout.write(fpin.read())
+ fpout.close()
+ fpin.close()
+ return 0
+
+# -- hg commands declarations ------------------------------------------------
+
+cmdtable = {
+ 'lfconvert': (lfconvert,
+ [('s', 'size', '',
+ _('minimum size (MB) for files to be converted '
+ 'as largefiles'),
+ 'SIZE'),
+ ('', 'to-normal', False,
+ _('convert from a largefiles repo to a normal repo')),
+ ],
+ _('hg lfconvert SOURCE DEST [FILE ...]')),
+ }
diff --git a/hgext/largefiles/lfutil.py b/hgext/largefiles/lfutil.py
new file mode 100644
index 0000000..6a64d89
--- /dev/null
+++ b/hgext/largefiles/lfutil.py
@@ -0,0 +1,467 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''largefiles utility code: must not import other modules in this package.'''
+
+import os
+import errno
+import platform
+import shutil
+import stat
+
+from mercurial import dirstate, httpconnection, match as match_, util, scmutil
+from mercurial.i18n import _
+
+shortname = '.hglf'
+longname = 'largefiles'
+
+
+# -- Portability wrappers ----------------------------------------------
+
+def dirstatewalk(dirstate, matcher, unknown=False, ignored=False):
+ return dirstate.walk(matcher, [], unknown, ignored)
+
+def repoadd(repo, list):
+ add = repo[None].add
+ return add(list)
+
+def reporemove(repo, list, unlink=False):
+ def remove(list, unlink):
+ wlock = repo.wlock()
+ try:
+ if unlink:
+ for f in list:
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ repo[None].forget(list)
+ finally:
+ wlock.release()
+ return remove(list, unlink=unlink)
+
+def repoforget(repo, list):
+ forget = repo[None].forget
+ return forget(list)
+
+def findoutgoing(repo, remote, force):
+ from mercurial import discovery
+ common, _anyinc, _heads = discovery.findcommonincoming(repo,
+ remote.peer(), force=force)
+ return repo.changelog.findmissing(common)
+
+# -- Private worker functions ------------------------------------------
+
+def getminsize(ui, assumelfiles, opt, default=10):
+ lfsize = opt
+ if not lfsize and assumelfiles:
+ lfsize = ui.config(longname, 'minsize', default=default)
+ if lfsize:
+ try:
+ lfsize = float(lfsize)
+ except ValueError:
+ raise util.Abort(_('largefiles: size must be number (not %s)\n')
+ % lfsize)
+ if lfsize is None:
+ raise util.Abort(_('minimum size for largefiles must be specified'))
+ return lfsize
+
+def link(src, dest):
+ try:
+ util.oslink(src, dest)
+ except OSError:
+ # if hardlinks fail, fallback on atomic copy
+ dst = util.atomictempfile(dest)
+ for chunk in util.filechunkiter(open(src, 'rb')):
+ dst.write(chunk)
+ dst.close()
+ os.chmod(dest, os.stat(src).st_mode)
+
+def usercachepath(ui, hash):
+ path = ui.configpath(longname, 'usercache', None)
+ if path:
+ path = os.path.join(path, hash)
+ else:
+ if os.name == 'nt':
+ appdata = os.getenv('LOCALAPPDATA', os.getenv('APPDATA'))
+ if appdata:
+ path = os.path.join(appdata, longname, hash)
+ elif platform.system() == 'Darwin':
+ home = os.getenv('HOME')
+ if home:
+ path = os.path.join(home, 'Library', 'Caches',
+ longname, hash)
+ elif os.name == 'posix':
+ path = os.getenv('XDG_CACHE_HOME')
+ if path:
+ path = os.path.join(path, longname, hash)
+ else:
+ home = os.getenv('HOME')
+ if home:
+ path = os.path.join(home, '.cache', longname, hash)
+ else:
+ raise util.Abort(_('unknown operating system: %s\n') % os.name)
+ return path
+
+def inusercache(ui, hash):
+ path = usercachepath(ui, hash)
+ return path and os.path.exists(path)
+
+def findfile(repo, hash):
+ if instore(repo, hash):
+ repo.ui.note(_('found %s in store\n') % hash)
+ return storepath(repo, hash)
+ elif inusercache(repo.ui, hash):
+ repo.ui.note(_('found %s in system cache\n') % hash)
+ path = storepath(repo, hash)
+ util.makedirs(os.path.dirname(path))
+ link(usercachepath(repo.ui, hash), path)
+ return path
+ return None
+
+class largefilesdirstate(dirstate.dirstate):
+ def __getitem__(self, key):
+ return super(largefilesdirstate, self).__getitem__(unixpath(key))
+ def normal(self, f):
+ return super(largefilesdirstate, self).normal(unixpath(f))
+ def remove(self, f):
+ return super(largefilesdirstate, self).remove(unixpath(f))
+ def add(self, f):
+ return super(largefilesdirstate, self).add(unixpath(f))
+ def drop(self, f):
+ return super(largefilesdirstate, self).drop(unixpath(f))
+ def forget(self, f):
+ return super(largefilesdirstate, self).forget(unixpath(f))
+ def normallookup(self, f):
+ return super(largefilesdirstate, self).normallookup(unixpath(f))
+
+def openlfdirstate(ui, repo):
+ '''
+ Return a dirstate object that tracks largefiles: i.e. its root is
+ the repo root, but it is saved in .hg/largefiles/dirstate.
+ '''
+ admin = repo.join(longname)
+ opener = scmutil.opener(admin)
+ lfdirstate = largefilesdirstate(opener, ui, repo.root,
+ repo.dirstate._validate)
+
+ # If the largefiles dirstate does not exist, populate and create
+ # it. This ensures that we create it on the first meaningful
+ # largefiles operation in a new clone.
+ if not os.path.exists(os.path.join(admin, 'dirstate')):
+ util.makedirs(admin)
+ matcher = getstandinmatcher(repo)
+ for standin in dirstatewalk(repo.dirstate, matcher):
+ lfile = splitstandin(standin)
+ hash = readstandin(repo, lfile)
+ lfdirstate.normallookup(lfile)
+ try:
+ if hash == hashfile(repo.wjoin(lfile)):
+ lfdirstate.normal(lfile)
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return lfdirstate
+
+def lfdirstatestatus(lfdirstate, repo, rev):
+ match = match_.always(repo.root, repo.getcwd())
+ s = lfdirstate.status(match, [], False, False, False)
+ unsure, modified, added, removed, missing, unknown, ignored, clean = s
+ for lfile in unsure:
+ if repo[rev][standin(lfile)].data().strip() != \
+ hashfile(repo.wjoin(lfile)):
+ modified.append(lfile)
+ else:
+ clean.append(lfile)
+ lfdirstate.normal(lfile)
+ return (modified, added, removed, missing, unknown, ignored, clean)
+
+def listlfiles(repo, rev=None, matcher=None):
+ '''return a list of largefiles in the working copy or the
+ specified changeset'''
+
+ if matcher is None:
+ matcher = getstandinmatcher(repo)
+
+ # ignore unknown files in working directory
+ return [splitstandin(f)
+ for f in repo[rev].walk(matcher)
+ if rev is not None or repo.dirstate[f] != '?']
+
+def instore(repo, hash):
+ return os.path.exists(storepath(repo, hash))
+
+def storepath(repo, hash):
+ return repo.join(os.path.join(longname, hash))
+
+def copyfromcache(repo, hash, filename):
+ '''Copy the specified largefile from the repo or system cache to
+ filename in the repository. Return true on success or false if the
+ file was not found in either cache (which should not happened:
+ this is meant to be called only after ensuring that the needed
+ largefile exists in the cache).'''
+ path = findfile(repo, hash)
+ if path is None:
+ return False
+ util.makedirs(os.path.dirname(repo.wjoin(filename)))
+ # The write may fail before the file is fully written, but we
+ # don't use atomic writes in the working copy.
+ shutil.copy(path, repo.wjoin(filename))
+ return True
+
+def copytostore(repo, rev, file, uploaded=False):
+ hash = readstandin(repo, file)
+ if instore(repo, hash):
+ return
+ copytostoreabsolute(repo, repo.wjoin(file), hash)
+
+def copyalltostore(repo, node):
+ '''Copy all largefiles in a given revision to the store'''
+
+ ctx = repo[node]
+ for filename in ctx.files():
+ if isstandin(filename) and filename in ctx.manifest():
+ realfile = splitstandin(filename)
+ copytostore(repo, ctx.node(), realfile)
+
+
+def copytostoreabsolute(repo, file, hash):
+ util.makedirs(os.path.dirname(storepath(repo, hash)))
+ if inusercache(repo.ui, hash):
+ link(usercachepath(repo.ui, hash), storepath(repo, hash))
+ else:
+ dst = util.atomictempfile(storepath(repo, hash),
+ createmode=repo.store.createmode)
+ for chunk in util.filechunkiter(open(file, 'rb')):
+ dst.write(chunk)
+ dst.close()
+ linktousercache(repo, hash)
+
+def linktousercache(repo, hash):
+ path = usercachepath(repo.ui, hash)
+ if path:
+ util.makedirs(os.path.dirname(path))
+ link(storepath(repo, hash), path)
+
+def getstandinmatcher(repo, pats=[], opts={}):
+ '''Return a match object that applies pats to the standin directory'''
+ standindir = repo.pathto(shortname)
+ if pats:
+ # patterns supplied: search standin directory relative to current dir
+ cwd = repo.getcwd()
+ if os.path.isabs(cwd):
+ # cwd is an absolute path for hg -R <reponame>
+ # work relative to the repository root in this case
+ cwd = ''
+ pats = [os.path.join(standindir, cwd, pat) for pat in pats]
+ elif os.path.isdir(standindir):
+ # no patterns: relative to repo root
+ pats = [standindir]
+ else:
+ # no patterns and no standin dir: return matcher that matches nothing
+ match = match_.match(repo.root, None, [], exact=True)
+ match.matchfn = lambda f: False
+ return match
+ return getmatcher(repo, pats, opts, showbad=False)
+
+def getmatcher(repo, pats=[], opts={}, showbad=True):
+ '''Wrapper around scmutil.match() that adds showbad: if false,
+ neuter the match object's bad() method so it does not print any
+ warnings about missing files or directories.'''
+ match = scmutil.match(repo[None], pats, opts)
+
+ if not showbad:
+ match.bad = lambda f, msg: None
+ return match
+
+def composestandinmatcher(repo, rmatcher):
+ '''Return a matcher that accepts standins corresponding to the
+ files accepted by rmatcher. Pass the list of files in the matcher
+ as the paths specified by the user.'''
+ smatcher = getstandinmatcher(repo, rmatcher.files())
+ isstandin = smatcher.matchfn
+ def composedmatchfn(f):
+ return isstandin(f) and rmatcher.matchfn(splitstandin(f))
+ smatcher.matchfn = composedmatchfn
+
+ return smatcher
+
+def standin(filename):
+ '''Return the repo-relative path to the standin for the specified big
+ file.'''
+ # Notes:
+ # 1) Most callers want an absolute path, but _createstandin() needs
+ # it repo-relative so lfadd() can pass it to repoadd(). So leave
+ # it up to the caller to use repo.wjoin() to get an absolute path.
+ # 2) Join with '/' because that's what dirstate always uses, even on
+ # Windows. Change existing separator to '/' first in case we are
+ # passed filenames from an external source (like the command line).
+ return shortname + '/' + util.pconvert(filename)
+
+def isstandin(filename):
+ '''Return true if filename is a big file standin. filename must be
+ in Mercurial's internal form (slash-separated).'''
+ return filename.startswith(shortname + '/')
+
+def splitstandin(filename):
+ # Split on / because that's what dirstate always uses, even on Windows.
+ # Change local separator to / first just in case we are passed filenames
+ # from an external source (like the command line).
+ bits = util.pconvert(filename).split('/', 1)
+ if len(bits) == 2 and bits[0] == shortname:
+ return bits[1]
+ else:
+ return None
+
+def updatestandin(repo, standin):
+ file = repo.wjoin(splitstandin(standin))
+ if os.path.exists(file):
+ hash = hashfile(file)
+ executable = getexecutable(file)
+ writestandin(repo, standin, hash, executable)
+
+def readstandin(repo, filename, node=None):
+ '''read hex hash from standin for filename at given node, or working
+ directory if no node is given'''
+ return repo[node][standin(filename)].data().strip()
+
+def writestandin(repo, standin, hash, executable):
+ '''write hash to <repo.root>/<standin>'''
+ writehash(hash, repo.wjoin(standin), executable)
+
+def copyandhash(instream, outfile):
+ '''Read bytes from instream (iterable) and write them to outfile,
+ computing the SHA-1 hash of the data along the way. Close outfile
+ when done and return the binary hash.'''
+ hasher = util.sha1('')
+ for data in instream:
+ hasher.update(data)
+ outfile.write(data)
+
+ # Blecch: closing a file that somebody else opened is rude and
+ # wrong. But it's so darn convenient and practical! After all,
+ # outfile was opened just to copy and hash.
+ outfile.close()
+
+ return hasher.digest()
+
+def hashrepofile(repo, file):
+ return hashfile(repo.wjoin(file))
+
+def hashfile(file):
+ if not os.path.exists(file):
+ return ''
+ hasher = util.sha1('')
+ fd = open(file, 'rb')
+ for data in blockstream(fd):
+ hasher.update(data)
+ fd.close()
+ return hasher.hexdigest()
+
+class limitreader(object):
+ def __init__(self, f, limit):
+ self.f = f
+ self.limit = limit
+
+ def read(self, length):
+ if self.limit == 0:
+ return ''
+ length = length > self.limit and self.limit or length
+ self.limit -= length
+ return self.f.read(length)
+
+ def close(self):
+ pass
+
+def blockstream(infile, blocksize=128 * 1024):
+ """Generator that yields blocks of data from infile and closes infile."""
+ while True:
+ data = infile.read(blocksize)
+ if not data:
+ break
+ yield data
+ # same blecch as copyandhash() above
+ infile.close()
+
+def writehash(hash, filename, executable):
+ util.makedirs(os.path.dirname(filename))
+ util.writefile(filename, hash + '\n')
+ os.chmod(filename, getmode(executable))
+
+def getexecutable(filename):
+ mode = os.stat(filename).st_mode
+ return ((mode & stat.S_IXUSR) and
+ (mode & stat.S_IXGRP) and
+ (mode & stat.S_IXOTH))
+
+def getmode(executable):
+ if executable:
+ return 0755
+ else:
+ return 0644
+
+def urljoin(first, second, *arg):
+ def join(left, right):
+ if not left.endswith('/'):
+ left += '/'
+ if right.startswith('/'):
+ right = right[1:]
+ return left + right
+
+ url = join(first, second)
+ for a in arg:
+ url = join(url, a)
+ return url
+
+def hexsha1(data):
+ """hexsha1 returns the hex-encoded sha1 sum of the data in the file-like
+ object data"""
+ h = util.sha1()
+ for chunk in util.filechunkiter(data):
+ h.update(chunk)
+ return h.hexdigest()
+
+def httpsendfile(ui, filename):
+ return httpconnection.httpsendfile(ui, filename, 'rb')
+
+def unixpath(path):
+ '''Return a version of path normalized for use with the lfdirstate.'''
+ return util.pconvert(os.path.normpath(path))
+
+def islfilesrepo(repo):
+ return ('largefiles' in repo.requirements and
+ util.any(shortname + '/' in f[0] for f in repo.store.datafiles()))
+
+class storeprotonotcapable(Exception):
+ def __init__(self, storetypes):
+ self.storetypes = storetypes
+
+def getcurrentheads(repo):
+ branches = repo.branchmap()
+ heads = []
+ for branch in branches:
+ newheads = repo.branchheads(branch)
+ heads = heads + newheads
+ return heads
+
+def getstandinsstate(repo):
+ standins = []
+ matcher = getstandinmatcher(repo)
+ for standin in dirstatewalk(repo.dirstate, matcher):
+ lfile = splitstandin(standin)
+ standins.append((lfile, readstandin(repo, lfile)))
+ return standins
+
+def getlfilestoupdate(oldstandins, newstandins):
+ changedstandins = set(oldstandins).symmetric_difference(set(newstandins))
+ filelist = []
+ for f in changedstandins:
+ if f[0] not in filelist:
+ filelist.append(f[0])
+ return filelist
diff --git a/hgext/largefiles/localstore.py b/hgext/largefiles/localstore.py
new file mode 100644
index 0000000..4995743
--- /dev/null
+++ b/hgext/largefiles/localstore.py
@@ -0,0 +1,82 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''store class for local filesystem'''
+
+import os
+
+from mercurial import util
+from mercurial.i18n import _
+
+import lfutil
+import basestore
+
+class localstore(basestore.basestore):
+ '''localstore first attempts to grab files out of the store in the remote
+ Mercurial repository. Failling that, it attempts to grab the files from
+ the user cache.'''
+
+ def __init__(self, ui, repo, remote):
+ url = os.path.join(remote.local().path, '.hg', lfutil.longname)
+ super(localstore, self).__init__(ui, repo, util.expandpath(url))
+ self.remote = remote.local()
+
+ def put(self, source, hash):
+ util.makedirs(os.path.dirname(lfutil.storepath(self.remote, hash)))
+ if lfutil.instore(self.remote, hash):
+ return
+ lfutil.link(lfutil.storepath(self.repo, hash),
+ lfutil.storepath(self.remote, hash))
+
+ def exists(self, hash):
+ return lfutil.instore(self.remote, hash)
+
+ def _getfile(self, tmpfile, filename, hash):
+ if lfutil.instore(self.remote, hash):
+ path = lfutil.storepath(self.remote, hash)
+ elif lfutil.inusercache(self.ui, hash):
+ path = lfutil.usercachepath(self.ui, hash)
+ else:
+ raise basestore.StoreError(filename, hash, '',
+ _("can't get file locally"))
+ fd = open(path, 'rb')
+ try:
+ return lfutil.copyandhash(fd, tmpfile)
+ finally:
+ fd.close()
+
+ def _verifyfile(self, cctx, cset, contents, standin, verified):
+ filename = lfutil.splitstandin(standin)
+ if not filename:
+ return False
+ fctx = cctx[standin]
+ key = (filename, fctx.filenode())
+ if key in verified:
+ return False
+
+ expecthash = fctx.data()[0:40]
+ verified.add(key)
+ if not lfutil.instore(self.remote, expecthash):
+ self.ui.warn(
+ _('changeset %s: %s missing\n'
+ ' (looked for hash %s)\n')
+ % (cset, filename, expecthash))
+ return True # failed
+
+ if contents:
+ storepath = lfutil.storepath(self.remote, expecthash)
+ actualhash = lfutil.hashfile(storepath)
+ if actualhash != expecthash:
+ self.ui.warn(
+ _('changeset %s: %s: contents differ\n'
+ ' (%s:\n'
+ ' expected hash %s,\n'
+ ' but got %s)\n')
+ % (cset, filename, storepath, expecthash, actualhash))
+ return True # failed
+ return False
diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py
new file mode 100644
index 0000000..3b42695
--- /dev/null
+++ b/hgext/largefiles/overrides.py
@@ -0,0 +1,1080 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''Overridden Mercurial commands and functions for the largefiles extension'''
+
+import os
+import copy
+
+from mercurial import hg, commands, util, cmdutil, scmutil, match as match_, \
+ node, archival, error, merge
+from mercurial.i18n import _
+from mercurial.node import hex
+from hgext import rebase
+
+import lfutil
+import lfcommands
+
+# -- Utility functions: commonly/repeatedly needed functionality ---------------
+
+def installnormalfilesmatchfn(manifest):
+ '''overrides scmutil.match so that the matcher it returns will ignore all
+ largefiles'''
+ oldmatch = None # for the closure
+ def overridematch(ctx, pats=[], opts={}, globbed=False,
+ default='relpath'):
+ match = oldmatch(ctx, pats, opts, globbed, default)
+ m = copy.copy(match)
+ notlfile = lambda f: not (lfutil.isstandin(f) or lfutil.standin(f) in
+ manifest)
+ m._files = filter(notlfile, m._files)
+ m._fmap = set(m._files)
+ origmatchfn = m.matchfn
+ m.matchfn = lambda f: notlfile(f) and origmatchfn(f) or None
+ return m
+ oldmatch = installmatchfn(overridematch)
+
+def installmatchfn(f):
+ oldmatch = scmutil.match
+ setattr(f, 'oldmatch', oldmatch)
+ scmutil.match = f
+ return oldmatch
+
+def restorematchfn():
+ '''restores scmutil.match to what it was before installnormalfilesmatchfn
+ was called. no-op if scmutil.match is its original function.
+
+ Note that n calls to installnormalfilesmatchfn will require n calls to
+ restore matchfn to reverse'''
+ scmutil.match = getattr(scmutil.match, 'oldmatch', scmutil.match)
+
+def addlargefiles(ui, repo, *pats, **opts):
+ large = opts.pop('large', None)
+ lfsize = lfutil.getminsize(
+ ui, lfutil.islfilesrepo(repo), opts.pop('lfsize', None))
+
+ lfmatcher = None
+ if lfutil.islfilesrepo(repo):
+ lfpats = ui.configlist(lfutil.longname, 'patterns', default=[])
+ if lfpats:
+ lfmatcher = match_.match(repo.root, '', list(lfpats))
+
+ lfnames = []
+ m = scmutil.match(repo[None], pats, opts)
+ m.bad = lambda x, y: None
+ wctx = repo[None]
+ for f in repo.walk(m):
+ exact = m.exact(f)
+ lfile = lfutil.standin(f) in wctx
+ nfile = f in wctx
+ exists = lfile or nfile
+
+ # Don't warn the user when they attempt to add a normal tracked file.
+ # The normal add code will do that for us.
+ if exact and exists:
+ if lfile:
+ ui.warn(_('%s already a largefile\n') % f)
+ continue
+
+ if (exact or not exists) and not lfutil.isstandin(f):
+ wfile = repo.wjoin(f)
+
+ # In case the file was removed previously, but not committed
+ # (issue3507)
+ if not os.path.exists(wfile):
+ continue
+
+ abovemin = (lfsize and
+ os.lstat(wfile).st_size >= lfsize * 1024 * 1024)
+ if large or abovemin or (lfmatcher and lfmatcher(f)):
+ lfnames.append(f)
+ if ui.verbose or not exact:
+ ui.status(_('adding %s as a largefile\n') % m.rel(f))
+
+ bad = []
+ standins = []
+
+ # Need to lock, otherwise there could be a race condition between
+ # when standins are created and added to the repo.
+ wlock = repo.wlock()
+ try:
+ if not opts.get('dry_run'):
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ for f in lfnames:
+ standinname = lfutil.standin(f)
+ lfutil.writestandin(repo, standinname, hash='',
+ executable=lfutil.getexecutable(repo.wjoin(f)))
+ standins.append(standinname)
+ if lfdirstate[f] == 'r':
+ lfdirstate.normallookup(f)
+ else:
+ lfdirstate.add(f)
+ lfdirstate.write()
+ bad += [lfutil.splitstandin(f)
+ for f in lfutil.repoadd(repo, standins)
+ if f in m.files()]
+ finally:
+ wlock.release()
+ return bad
+
+def removelargefiles(ui, repo, *pats, **opts):
+ after = opts.get('after')
+ if not pats and not after:
+ raise util.Abort(_('no files specified'))
+ m = scmutil.match(repo[None], pats, opts)
+ try:
+ repo.lfstatus = True
+ s = repo.status(match=m, clean=True)
+ finally:
+ repo.lfstatus = False
+ manifest = repo[None].manifest()
+ modified, added, deleted, clean = [[f for f in list
+ if lfutil.standin(f) in manifest]
+ for list in [s[0], s[1], s[3], s[6]]]
+
+ def warn(files, reason):
+ for f in files:
+ ui.warn(_('not removing %s: %s (use forget to undo)\n')
+ % (m.rel(f), reason))
+
+ if after:
+ remove, forget = deleted, []
+ warn(modified + added + clean, _('file still exists'))
+ else:
+ remove, forget = deleted + clean, []
+ warn(modified, _('file is modified'))
+ warn(added, _('file has been marked for add'))
+
+ for f in sorted(remove + forget):
+ if ui.verbose or not m.exact(f):
+ ui.status(_('removing %s\n') % m.rel(f))
+
+ # Need to lock because standin files are deleted then removed from the
+ # repository and we could race inbetween.
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ for f in remove:
+ if not after:
+ # If this is being called by addremove, notify the user that we
+ # are removing the file.
+ if getattr(repo, "_isaddremove", False):
+ ui.status(_('removing %s\n') % f)
+ if os.path.exists(repo.wjoin(f)):
+ util.unlinkpath(repo.wjoin(f))
+ lfdirstate.remove(f)
+ lfdirstate.write()
+ forget = [lfutil.standin(f) for f in forget]
+ remove = [lfutil.standin(f) for f in remove]
+ lfutil.repoforget(repo, forget)
+ # If this is being called by addremove, let the original addremove
+ # function handle this.
+ if not getattr(repo, "_isaddremove", False):
+ lfutil.reporemove(repo, remove, unlink=True)
+ else:
+ lfutil.reporemove(repo, remove, unlink=False)
+ finally:
+ wlock.release()
+
+# For overriding mercurial.hgweb.webcommands so that largefiles will
+# appear at their right place in the manifests.
+def decodepath(orig, path):
+ return lfutil.splitstandin(path) or path
+
+# -- Wrappers: modify existing commands --------------------------------
+
+# Add works by going through the files that the user wanted to add and
+# checking if they should be added as largefiles. Then it makes a new
+# matcher which matches only the normal files and runs the original
+# version of add.
+def overrideadd(orig, ui, repo, *pats, **opts):
+ normal = opts.pop('normal')
+ if normal:
+ if opts.get('large'):
+ raise util.Abort(_('--normal cannot be used with --large'))
+ return orig(ui, repo, *pats, **opts)
+ bad = addlargefiles(ui, repo, *pats, **opts)
+ installnormalfilesmatchfn(repo[None].manifest())
+ result = orig(ui, repo, *pats, **opts)
+ restorematchfn()
+
+ return (result == 1 or bad) and 1 or 0
+
+def overrideremove(orig, ui, repo, *pats, **opts):
+ installnormalfilesmatchfn(repo[None].manifest())
+ orig(ui, repo, *pats, **opts)
+ restorematchfn()
+ removelargefiles(ui, repo, *pats, **opts)
+
+def overridestatusfn(orig, repo, rev2, **opts):
+ try:
+ repo._repo.lfstatus = True
+ return orig(repo, rev2, **opts)
+ finally:
+ repo._repo.lfstatus = False
+
+def overridestatus(orig, ui, repo, *pats, **opts):
+ try:
+ repo.lfstatus = True
+ return orig(ui, repo, *pats, **opts)
+ finally:
+ repo.lfstatus = False
+
+def overridedirty(orig, repo, ignoreupdate=False):
+ try:
+ repo._repo.lfstatus = True
+ return orig(repo, ignoreupdate)
+ finally:
+ repo._repo.lfstatus = False
+
+def overridelog(orig, ui, repo, *pats, **opts):
+ try:
+ repo.lfstatus = True
+ orig(ui, repo, *pats, **opts)
+ finally:
+ repo.lfstatus = False
+
+def overrideverify(orig, ui, repo, *pats, **opts):
+ large = opts.pop('large', False)
+ all = opts.pop('lfa', False)
+ contents = opts.pop('lfc', False)
+
+ result = orig(ui, repo, *pats, **opts)
+ if large:
+ result = result or lfcommands.verifylfiles(ui, repo, all, contents)
+ return result
+
+# Override needs to refresh standins so that update's normal merge
+# will go through properly. Then the other update hook (overriding repo.update)
+# will get the new files. Filemerge is also overriden so that the merge
+# will merge standins correctly.
+def overrideupdate(orig, ui, repo, *pats, **opts):
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
+ False, False)
+ (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
+
+ # Need to lock between the standins getting updated and their
+ # largefiles getting updated
+ wlock = repo.wlock()
+ try:
+ if opts['check']:
+ mod = len(modified) > 0
+ for lfile in unsure:
+ standin = lfutil.standin(lfile)
+ if repo['.'][standin].data().strip() != \
+ lfutil.hashfile(repo.wjoin(lfile)):
+ mod = True
+ else:
+ lfdirstate.normal(lfile)
+ lfdirstate.write()
+ if mod:
+ raise util.Abort(_('uncommitted local changes'))
+ # XXX handle removed differently
+ if not opts['clean']:
+ for lfile in unsure + modified + added:
+ lfutil.updatestandin(repo, lfutil.standin(lfile))
+ finally:
+ wlock.release()
+ return orig(ui, repo, *pats, **opts)
+
+# Before starting the manifest merge, merge.updates will call
+# _checkunknown to check if there are any files in the merged-in
+# changeset that collide with unknown files in the working copy.
+#
+# The largefiles are seen as unknown, so this prevents us from merging
+# in a file 'foo' if we already have a largefile with the same name.
+#
+# The overridden function filters the unknown files by removing any
+# largefiles. This makes the merge proceed and we can then handle this
+# case further in the overridden manifestmerge function below.
+def overridecheckunknownfile(origfn, repo, wctx, mctx, f):
+ if lfutil.standin(f) in wctx:
+ return False
+ return origfn(repo, wctx, mctx, f)
+
+# The manifest merge handles conflicts on the manifest level. We want
+# to handle changes in largefile-ness of files at this level too.
+#
+# The strategy is to run the original manifestmerge and then process
+# the action list it outputs. There are two cases we need to deal with:
+#
+# 1. Normal file in p1, largefile in p2. Here the largefile is
+# detected via its standin file, which will enter the working copy
+# with a "get" action. It is not "merge" since the standin is all
+# Mercurial is concerned with at this level -- the link to the
+# existing normal file is not relevant here.
+#
+# 2. Largefile in p1, normal file in p2. Here we get a "merge" action
+# since the largefile will be present in the working copy and
+# different from the normal file in p2. Mercurial therefore
+# triggers a merge action.
+#
+# In both cases, we prompt the user and emit new actions to either
+# remove the standin (if the normal file was kept) or to remove the
+# normal file and get the standin (if the largefile was kept). The
+# default prompt answer is to use the largefile version since it was
+# presumably changed on purpose.
+#
+# Finally, the merge.applyupdates function will then take care of
+# writing the files into the working copy and lfcommands.updatelfiles
+# will update the largefiles.
+def overridemanifestmerge(origfn, repo, p1, p2, pa, overwrite, partial):
+ actions = origfn(repo, p1, p2, pa, overwrite, partial)
+ processed = []
+
+ for action in actions:
+ if overwrite:
+ processed.append(action)
+ continue
+ f, m = action[:2]
+
+ choices = (_('&Largefile'), _('&Normal file'))
+ if m == "g" and lfutil.splitstandin(f) in p1 and f in p2:
+ # Case 1: normal file in the working copy, largefile in
+ # the second parent
+ lfile = lfutil.splitstandin(f)
+ standin = f
+ msg = _('%s has been turned into a largefile\n'
+ 'use (l)argefile or keep as (n)ormal file?') % lfile
+ if repo.ui.promptchoice(msg, choices, 0) == 0:
+ processed.append((lfile, "r"))
+ processed.append((standin, "g", p2.flags(standin)))
+ else:
+ processed.append((standin, "r"))
+ elif m == "g" and lfutil.standin(f) in p1 and f in p2:
+ # Case 2: largefile in the working copy, normal file in
+ # the second parent
+ standin = lfutil.standin(f)
+ lfile = f
+ msg = _('%s has been turned into a normal file\n'
+ 'keep as (l)argefile or use (n)ormal file?') % lfile
+ if repo.ui.promptchoice(msg, choices, 0) == 0:
+ processed.append((lfile, "r"))
+ else:
+ processed.append((standin, "r"))
+ processed.append((lfile, "g", p2.flags(lfile)))
+ else:
+ processed.append(action)
+
+ return processed
+
+# Override filemerge to prompt the user about how they wish to merge
+# largefiles. This will handle identical edits, and copy/rename +
+# edit without prompting the user.
+def overridefilemerge(origfn, repo, mynode, orig, fcd, fco, fca):
+ # Use better variable names here. Because this is a wrapper we cannot
+ # change the variable names in the function declaration.
+ fcdest, fcother, fcancestor = fcd, fco, fca
+ if not lfutil.isstandin(orig):
+ return origfn(repo, mynode, orig, fcdest, fcother, fcancestor)
+ else:
+ if not fcother.cmp(fcdest): # files identical?
+ return None
+
+ # backwards, use working dir parent as ancestor
+ if fcancestor == fcother:
+ fcancestor = fcdest.parents()[0]
+
+ if orig != fcother.path():
+ repo.ui.status(_('merging %s and %s to %s\n')
+ % (lfutil.splitstandin(orig),
+ lfutil.splitstandin(fcother.path()),
+ lfutil.splitstandin(fcdest.path())))
+ else:
+ repo.ui.status(_('merging %s\n')
+ % lfutil.splitstandin(fcdest.path()))
+
+ if fcancestor.path() != fcother.path() and fcother.data() == \
+ fcancestor.data():
+ return 0
+ if fcancestor.path() != fcdest.path() and fcdest.data() == \
+ fcancestor.data():
+ repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
+ return 0
+
+ if repo.ui.promptchoice(_('largefile %s has a merge conflict\n'
+ 'keep (l)ocal or take (o)ther?') %
+ lfutil.splitstandin(orig),
+ (_('&Local'), _('&Other')), 0) == 0:
+ return 0
+ else:
+ repo.wwrite(fcdest.path(), fcother.data(), fcother.flags())
+ return 0
+
+# Copy first changes the matchers to match standins instead of
+# largefiles. Then it overrides util.copyfile in that function it
+# checks if the destination largefile already exists. It also keeps a
+# list of copied files so that the largefiles can be copied and the
+# dirstate updated.
+def overridecopy(orig, ui, repo, pats, opts, rename=False):
+ # doesn't remove largefile on rename
+ if len(pats) < 2:
+ # this isn't legal, let the original function deal with it
+ return orig(ui, repo, pats, opts, rename)
+
+ def makestandin(relpath):
+ path = scmutil.canonpath(repo.root, repo.getcwd(), relpath)
+ return os.path.join(repo.wjoin(lfutil.standin(path)))
+
+ fullpats = scmutil.expandpats(pats)
+ dest = fullpats[-1]
+
+ if os.path.isdir(dest):
+ if not os.path.isdir(makestandin(dest)):
+ os.makedirs(makestandin(dest))
+ # This could copy both lfiles and normal files in one command,
+ # but we don't want to do that. First replace their matcher to
+ # only match normal files and run it, then replace it to just
+ # match largefiles and run it again.
+ nonormalfiles = False
+ nolfiles = False
+ try:
+ try:
+ installnormalfilesmatchfn(repo[None].manifest())
+ result = orig(ui, repo, pats, opts, rename)
+ except util.Abort, e:
+ if str(e) != _('no files to copy'):
+ raise e
+ else:
+ nonormalfiles = True
+ result = 0
+ finally:
+ restorematchfn()
+
+ # The first rename can cause our current working directory to be removed.
+ # In that case there is nothing left to copy/rename so just quit.
+ try:
+ repo.getcwd()
+ except OSError:
+ return result
+
+ try:
+ try:
+ # When we call orig below it creates the standins but we don't add
+ # them to the dir state until later so lock during that time.
+ wlock = repo.wlock()
+
+ manifest = repo[None].manifest()
+ oldmatch = None # for the closure
+ def overridematch(ctx, pats=[], opts={}, globbed=False,
+ default='relpath'):
+ newpats = []
+ # The patterns were previously mangled to add the standin
+ # directory; we need to remove that now
+ for pat in pats:
+ if match_.patkind(pat) is None and lfutil.shortname in pat:
+ newpats.append(pat.replace(lfutil.shortname, ''))
+ else:
+ newpats.append(pat)
+ match = oldmatch(ctx, newpats, opts, globbed, default)
+ m = copy.copy(match)
+ lfile = lambda f: lfutil.standin(f) in manifest
+ m._files = [lfutil.standin(f) for f in m._files if lfile(f)]
+ m._fmap = set(m._files)
+ origmatchfn = m.matchfn
+ m.matchfn = lambda f: (lfutil.isstandin(f) and
+ (f in manifest) and
+ origmatchfn(lfutil.splitstandin(f)) or
+ None)
+ return m
+ oldmatch = installmatchfn(overridematch)
+ listpats = []
+ for pat in pats:
+ if match_.patkind(pat) is not None:
+ listpats.append(pat)
+ else:
+ listpats.append(makestandin(pat))
+
+ try:
+ origcopyfile = util.copyfile
+ copiedfiles = []
+ def overridecopyfile(src, dest):
+ if (lfutil.shortname in src and
+ dest.startswith(repo.wjoin(lfutil.shortname))):
+ destlfile = dest.replace(lfutil.shortname, '')
+ if not opts['force'] and os.path.exists(destlfile):
+ raise IOError('',
+ _('destination largefile already exists'))
+ copiedfiles.append((src, dest))
+ origcopyfile(src, dest)
+
+ util.copyfile = overridecopyfile
+ result += orig(ui, repo, listpats, opts, rename)
+ finally:
+ util.copyfile = origcopyfile
+
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ for (src, dest) in copiedfiles:
+ if (lfutil.shortname in src and
+ dest.startswith(repo.wjoin(lfutil.shortname))):
+ srclfile = src.replace(repo.wjoin(lfutil.standin('')), '')
+ destlfile = dest.replace(repo.wjoin(lfutil.standin('')), '')
+ destlfiledir = os.path.dirname(repo.wjoin(destlfile)) or '.'
+ if not os.path.isdir(destlfiledir):
+ os.makedirs(destlfiledir)
+ if rename:
+ os.rename(repo.wjoin(srclfile), repo.wjoin(destlfile))
+ lfdirstate.remove(srclfile)
+ else:
+ util.copyfile(repo.wjoin(srclfile),
+ repo.wjoin(destlfile))
+
+ lfdirstate.add(destlfile)
+ lfdirstate.write()
+ except util.Abort, e:
+ if str(e) != _('no files to copy'):
+ raise e
+ else:
+ nolfiles = True
+ finally:
+ restorematchfn()
+ wlock.release()
+
+ if nolfiles and nonormalfiles:
+ raise util.Abort(_('no files to copy'))
+
+ return result
+
+# When the user calls revert, we have to be careful to not revert any
+# changes to other largefiles accidentally. This means we have to keep
+# track of the largefiles that are being reverted so we only pull down
+# the necessary largefiles.
+#
+# Standins are only updated (to match the hash of largefiles) before
+# commits. Update the standins then run the original revert, changing
+# the matcher to hit standins instead of largefiles. Based on the
+# resulting standins update the largefiles. Then return the standins
+# to their proper state
+def overriderevert(orig, ui, repo, *pats, **opts):
+ # Because we put the standins in a bad state (by updating them)
+ # and then return them to a correct state we need to lock to
+ # prevent others from changing them in their incorrect state.
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ (modified, added, removed, missing, unknown, ignored, clean) = \
+ lfutil.lfdirstatestatus(lfdirstate, repo, repo['.'].rev())
+ for lfile in modified:
+ lfutil.updatestandin(repo, lfutil.standin(lfile))
+ for lfile in missing:
+ if (os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
+ os.unlink(repo.wjoin(lfutil.standin(lfile)))
+
+ try:
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ oldmatch = None # for the closure
+ def overridematch(ctx, pats=[], opts={}, globbed=False,
+ default='relpath'):
+ match = oldmatch(ctx, pats, opts, globbed, default)
+ m = copy.copy(match)
+ def tostandin(f):
+ if lfutil.standin(f) in ctx:
+ return lfutil.standin(f)
+ elif lfutil.standin(f) in repo[None]:
+ return None
+ return f
+ m._files = [tostandin(f) for f in m._files]
+ m._files = [f for f in m._files if f is not None]
+ m._fmap = set(m._files)
+ origmatchfn = m.matchfn
+ def matchfn(f):
+ if lfutil.isstandin(f):
+ # We need to keep track of what largefiles are being
+ # matched so we know which ones to update later --
+ # otherwise we accidentally revert changes to other
+ # largefiles. This is repo-specific, so duckpunch the
+ # repo object to keep the list of largefiles for us
+ # later.
+ if origmatchfn(lfutil.splitstandin(f)) and \
+ (f in repo[None] or f in ctx):
+ lfileslist = getattr(repo, '_lfilestoupdate', [])
+ lfileslist.append(lfutil.splitstandin(f))
+ repo._lfilestoupdate = lfileslist
+ return True
+ else:
+ return False
+ return origmatchfn(f)
+ m.matchfn = matchfn
+ return m
+ oldmatch = installmatchfn(overridematch)
+ scmutil.match
+ matches = overridematch(repo[None], pats, opts)
+ orig(ui, repo, *pats, **opts)
+ finally:
+ restorematchfn()
+ lfileslist = getattr(repo, '_lfilestoupdate', [])
+ lfcommands.updatelfiles(ui, repo, filelist=lfileslist,
+ printmessage=False)
+
+ # empty out the largefiles list so we start fresh next time
+ repo._lfilestoupdate = []
+ for lfile in modified:
+ if lfile in lfileslist:
+ if os.path.exists(repo.wjoin(lfutil.standin(lfile))) and lfile\
+ in repo['.']:
+ lfutil.writestandin(repo, lfutil.standin(lfile),
+ repo['.'][lfile].data().strip(),
+ 'x' in repo['.'][lfile].flags())
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ for lfile in added:
+ standin = lfutil.standin(lfile)
+ if standin not in ctx and (standin in matches or opts.get('all')):
+ if lfile in lfdirstate:
+ lfdirstate.drop(lfile)
+ util.unlinkpath(repo.wjoin(standin))
+ lfdirstate.write()
+ finally:
+ wlock.release()
+
+def hgupdate(orig, repo, node):
+ # Only call updatelfiles the standins that have changed to save time
+ oldstandins = lfutil.getstandinsstate(repo)
+ result = orig(repo, node)
+ newstandins = lfutil.getstandinsstate(repo)
+ filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
+ lfcommands.updatelfiles(repo.ui, repo, filelist=filelist, printmessage=True)
+ return result
+
+def hgclean(orig, repo, node, show_stats=True):
+ result = orig(repo, node, show_stats)
+ lfcommands.updatelfiles(repo.ui, repo)
+ return result
+
+def hgmerge(orig, repo, node, force=None, remind=True):
+ # Mark the repo as being in the middle of a merge, so that
+ # updatelfiles() will know that it needs to trust the standins in
+ # the working copy, not in the standins in the current node
+ repo._ismerging = True
+ try:
+ result = orig(repo, node, force, remind)
+ lfcommands.updatelfiles(repo.ui, repo)
+ finally:
+ repo._ismerging = False
+ return result
+
+# When we rebase a repository with remotely changed largefiles, we need to
+# take some extra care so that the largefiles are correctly updated in the
+# working copy
+def overridepull(orig, ui, repo, source=None, **opts):
+ revsprepull = len(repo)
+ if opts.get('rebase', False):
+ repo._isrebasing = True
+ try:
+ if opts.get('update'):
+ del opts['update']
+ ui.debug('--update and --rebase are not compatible, ignoring '
+ 'the update flag\n')
+ del opts['rebase']
+ cmdutil.bailifchanged(repo)
+ origpostincoming = commands.postincoming
+ def _dummy(*args, **kwargs):
+ pass
+ commands.postincoming = _dummy
+ repo.lfpullsource = source
+ if not source:
+ source = 'default'
+ try:
+ result = commands.pull(ui, repo, source, **opts)
+ finally:
+ commands.postincoming = origpostincoming
+ revspostpull = len(repo)
+ if revspostpull > revsprepull:
+ result = result or rebase.rebase(ui, repo)
+ finally:
+ repo._isrebasing = False
+ else:
+ repo.lfpullsource = source
+ if not source:
+ source = 'default'
+ oldheads = lfutil.getcurrentheads(repo)
+ result = orig(ui, repo, source, **opts)
+ # If we do not have the new largefiles for any new heads we pulled, we
+ # will run into a problem later if we try to merge or rebase with one of
+ # these heads, so cache the largefiles now direclty into the system
+ # cache.
+ ui.status(_("caching new largefiles\n"))
+ numcached = 0
+ heads = lfutil.getcurrentheads(repo)
+ newheads = set(heads).difference(set(oldheads))
+ for head in newheads:
+ (cached, missing) = lfcommands.cachelfiles(ui, repo, head)
+ numcached += len(cached)
+ ui.status(_("%d largefiles cached\n") % numcached)
+ if opts.get('all_largefiles'):
+ revspostpull = len(repo)
+ revs = []
+ for rev in xrange(revsprepull + 1, revspostpull):
+ revs.append(repo[rev].rev())
+ lfcommands.downloadlfiles(ui, repo, revs)
+ return result
+
+def overrideclone(orig, ui, source, dest=None, **opts):
+ if dest is None:
+ dest = hg.defaultdest(source)
+ if opts.get('all_largefiles') and not hg.islocal(dest):
+ raise util.Abort(_(
+ '--all-largefiles is incompatible with non-local destination %s' %
+ dest))
+ result = hg.clone(ui, opts, source, dest,
+ pull=opts.get('pull'),
+ stream=opts.get('uncompressed'),
+ rev=opts.get('rev'),
+ update=True, # required for successful walkchangerevs
+ branch=opts.get('branch'))
+ if result is None:
+ return True
+ if opts.get('all_largefiles'):
+ sourcerepo, destrepo = result
+ success, missing = lfcommands.downloadlfiles(ui, destrepo.local(), None)
+ return missing != 0
+ return result is None
+
+def overriderebase(orig, ui, repo, **opts):
+ repo._isrebasing = True
+ try:
+ orig(ui, repo, **opts)
+ finally:
+ repo._isrebasing = False
+
+def overridearchive(orig, repo, dest, node, kind, decode=True, matchfn=None,
+ prefix=None, mtime=None, subrepos=None):
+ # No need to lock because we are only reading history and
+ # largefile caches, neither of which are modified.
+ lfcommands.cachelfiles(repo.ui, repo, node)
+
+ if kind not in archival.archivers:
+ raise util.Abort(_("unknown archive type '%s'") % kind)
+
+ ctx = repo[node]
+
+ if kind == 'files':
+ if prefix:
+ raise util.Abort(
+ _('cannot give prefix when archiving to files'))
+ else:
+ prefix = archival.tidyprefix(dest, kind, prefix)
+
+ def write(name, mode, islink, getdata):
+ if matchfn and not matchfn(name):
+ return
+ data = getdata()
+ if decode:
+ data = repo.wwritedata(name, data)
+ archiver.addfile(prefix + name, mode, islink, data)
+
+ archiver = archival.archivers[kind](dest, mtime or ctx.date()[0])
+
+ if repo.ui.configbool("ui", "archivemeta", True):
+ def metadata():
+ base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
+ hex(repo.changelog.node(0)), hex(node), ctx.branch())
+
+ tags = ''.join('tag: %s\n' % t for t in ctx.tags()
+ if repo.tagtype(t) == 'global')
+ if not tags:
+ repo.ui.pushbuffer()
+ opts = {'template': '{latesttag}\n{latesttagdistance}',
+ 'style': '', 'patch': None, 'git': None}
+ cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
+ ltags, dist = repo.ui.popbuffer().split('\n')
+ tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
+ tags += 'latesttagdistance: %s\n' % dist
+
+ return base + tags
+
+ write('.hg_archival.txt', 0644, False, metadata)
+
+ for f in ctx:
+ ff = ctx.flags(f)
+ getdata = ctx[f].data
+ if lfutil.isstandin(f):
+ path = lfutil.findfile(repo, getdata().strip())
+ if path is None:
+ raise util.Abort(
+ _('largefile %s not found in repo store or system cache')
+ % lfutil.splitstandin(f))
+ f = lfutil.splitstandin(f)
+
+ def getdatafn():
+ fd = None
+ try:
+ fd = open(path, 'rb')
+ return fd.read()
+ finally:
+ if fd:
+ fd.close()
+
+ getdata = getdatafn
+ write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
+
+ if subrepos:
+ for subpath in ctx.substate:
+ sub = ctx.sub(subpath)
+ submatch = match_.narrowmatcher(subpath, matchfn)
+ sub.archive(repo.ui, archiver, prefix, submatch)
+
+ archiver.done()
+
+def hgsubrepoarchive(orig, repo, ui, archiver, prefix, match=None):
+ rev = repo._state[1]
+ ctx = repo._repo[rev]
+
+ lfcommands.cachelfiles(ui, repo._repo, ctx.node())
+
+ def write(name, mode, islink, getdata):
+ # At this point, the standin has been replaced with the largefile name,
+ # so the normal matcher works here without the lfutil variants.
+ if match and not match(f):
+ return
+ data = getdata()
+
+ archiver.addfile(prefix + repo._path + '/' + name, mode, islink, data)
+
+ for f in ctx:
+ ff = ctx.flags(f)
+ getdata = ctx[f].data
+ if lfutil.isstandin(f):
+ path = lfutil.findfile(repo._repo, getdata().strip())
+ if path is None:
+ raise util.Abort(
+ _('largefile %s not found in repo store or system cache')
+ % lfutil.splitstandin(f))
+ f = lfutil.splitstandin(f)
+
+ def getdatafn():
+ fd = None
+ try:
+ fd = open(os.path.join(prefix, path), 'rb')
+ return fd.read()
+ finally:
+ if fd:
+ fd.close()
+
+ getdata = getdatafn
+
+ write(f, 'x' in ff and 0755 or 0644, 'l' in ff, getdata)
+
+ for subpath in ctx.substate:
+ sub = ctx.sub(subpath)
+ submatch = match_.narrowmatcher(subpath, match)
+ sub.archive(ui, archiver, os.path.join(prefix, repo._path) + '/',
+ submatch)
+
+# If a largefile is modified, the change is not reflected in its
+# standin until a commit. cmdutil.bailifchanged() raises an exception
+# if the repo has uncommitted changes. Wrap it to also check if
+# largefiles were changed. This is used by bisect and backout.
+def overridebailifchanged(orig, repo):
+ orig(repo)
+ repo.lfstatus = True
+ modified, added, removed, deleted = repo.status()[:4]
+ repo.lfstatus = False
+ if modified or added or removed or deleted:
+ raise util.Abort(_('outstanding uncommitted changes'))
+
+# Fetch doesn't use cmdutil.bailifchanged so override it to add the check
+def overridefetch(orig, ui, repo, *pats, **opts):
+ repo.lfstatus = True
+ modified, added, removed, deleted = repo.status()[:4]
+ repo.lfstatus = False
+ if modified or added or removed or deleted:
+ raise util.Abort(_('outstanding uncommitted changes'))
+ return orig(ui, repo, *pats, **opts)
+
+def overrideforget(orig, ui, repo, *pats, **opts):
+ installnormalfilesmatchfn(repo[None].manifest())
+ orig(ui, repo, *pats, **opts)
+ restorematchfn()
+ m = scmutil.match(repo[None], pats, opts)
+
+ try:
+ repo.lfstatus = True
+ s = repo.status(match=m, clean=True)
+ finally:
+ repo.lfstatus = False
+ forget = sorted(s[0] + s[1] + s[3] + s[6])
+ forget = [f for f in forget if lfutil.standin(f) in repo[None].manifest()]
+
+ for f in forget:
+ if lfutil.standin(f) not in repo.dirstate and not \
+ os.path.isdir(m.rel(lfutil.standin(f))):
+ ui.warn(_('not removing %s: file is already untracked\n')
+ % m.rel(f))
+
+ for f in forget:
+ if ui.verbose or not m.exact(f):
+ ui.status(_('removing %s\n') % m.rel(f))
+
+ # Need to lock because standin files are deleted then removed from the
+ # repository and we could race inbetween.
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ for f in forget:
+ if lfdirstate[f] == 'a':
+ lfdirstate.drop(f)
+ else:
+ lfdirstate.remove(f)
+ lfdirstate.write()
+ lfutil.reporemove(repo, [lfutil.standin(f) for f in forget],
+ unlink=True)
+ finally:
+ wlock.release()
+
+def getoutgoinglfiles(ui, repo, dest=None, **opts):
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = hg.parseurl(dest, opts.get('branch'))
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
+ if revs:
+ revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
+
+ try:
+ remote = hg.peer(repo, opts, dest)
+ except error.RepoError:
+ return None
+ o = lfutil.findoutgoing(repo, remote, False)
+ if not o:
+ return None
+ o = repo.changelog.nodesbetween(o, revs)[0]
+ if opts.get('newest_first'):
+ o.reverse()
+
+ toupload = set()
+ for n in o:
+ parents = [p for p in repo.changelog.parents(n) if p != node.nullid]
+ ctx = repo[n]
+ files = set(ctx.files())
+ if len(parents) == 2:
+ mc = ctx.manifest()
+ mp1 = ctx.parents()[0].manifest()
+ mp2 = ctx.parents()[1].manifest()
+ for f in mp1:
+ if f not in mc:
+ files.add(f)
+ for f in mp2:
+ if f not in mc:
+ files.add(f)
+ for f in mc:
+ if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
+ files.add(f)
+ toupload = toupload.union(
+ set([f for f in files if lfutil.isstandin(f) and f in ctx]))
+ return toupload
+
+def overrideoutgoing(orig, ui, repo, dest=None, **opts):
+ orig(ui, repo, dest, **opts)
+
+ if opts.pop('large', None):
+ toupload = getoutgoinglfiles(ui, repo, dest, **opts)
+ if toupload is None:
+ ui.status(_('largefiles: No remote repo\n'))
+ else:
+ ui.status(_('largefiles to upload:\n'))
+ for file in toupload:
+ ui.status(lfutil.splitstandin(file) + '\n')
+ ui.status('\n')
+
+def overridesummary(orig, ui, repo, *pats, **opts):
+ try:
+ repo.lfstatus = True
+ orig(ui, repo, *pats, **opts)
+ finally:
+ repo.lfstatus = False
+
+ if opts.pop('large', None):
+ toupload = getoutgoinglfiles(ui, repo, None, **opts)
+ if toupload is None:
+ ui.status(_('largefiles: No remote repo\n'))
+ else:
+ ui.status(_('largefiles: %d to upload\n') % len(toupload))
+
+def overrideaddremove(orig, ui, repo, *pats, **opts):
+ if not lfutil.islfilesrepo(repo):
+ return orig(ui, repo, *pats, **opts)
+ # Get the list of missing largefiles so we can remove them
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ s = lfdirstate.status(match_.always(repo.root, repo.getcwd()), [], False,
+ False, False)
+ (unsure, modified, added, removed, missing, unknown, ignored, clean) = s
+
+ # Call into the normal remove code, but the removing of the standin, we want
+ # to have handled by original addremove. Monkey patching here makes sure
+ # we don't remove the standin in the largefiles code, preventing a very
+ # confused state later.
+ if missing:
+ m = [repo.wjoin(f) for f in missing]
+ repo._isaddremove = True
+ removelargefiles(ui, repo, *m, **opts)
+ repo._isaddremove = False
+ # Call into the normal add code, and any files that *should* be added as
+ # largefiles will be
+ addlargefiles(ui, repo, *pats, **opts)
+ # Now that we've handled largefiles, hand off to the original addremove
+ # function to take care of the rest. Make sure it doesn't do anything with
+ # largefiles by installing a matcher that will ignore them.
+ installnormalfilesmatchfn(repo[None].manifest())
+ result = orig(ui, repo, *pats, **opts)
+ restorematchfn()
+ return result
+
+# Calling purge with --all will cause the largefiles to be deleted.
+# Override repo.status to prevent this from happening.
+def overridepurge(orig, ui, repo, *dirs, **opts):
+ oldstatus = repo.status
+ def overridestatus(node1='.', node2=None, match=None, ignored=False,
+ clean=False, unknown=False, listsubrepos=False):
+ r = oldstatus(node1, node2, match, ignored, clean, unknown,
+ listsubrepos)
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ modified, added, removed, deleted, unknown, ignored, clean = r
+ unknown = [f for f in unknown if lfdirstate[f] == '?']
+ ignored = [f for f in ignored if lfdirstate[f] == '?']
+ return modified, added, removed, deleted, unknown, ignored, clean
+ repo.status = overridestatus
+ orig(ui, repo, *dirs, **opts)
+ repo.status = oldstatus
+
+def overriderollback(orig, ui, repo, **opts):
+ result = orig(ui, repo, **opts)
+ merge.update(repo, node=None, branchmerge=False, force=True,
+ partial=lfutil.isstandin)
+ wlock = repo.wlock()
+ try:
+ lfdirstate = lfutil.openlfdirstate(ui, repo)
+ lfiles = lfutil.listlfiles(repo)
+ oldlfiles = lfutil.listlfiles(repo, repo[None].parents()[0].rev())
+ for file in lfiles:
+ if file in oldlfiles:
+ lfdirstate.normallookup(file)
+ else:
+ lfdirstate.add(file)
+ lfdirstate.write()
+ finally:
+ wlock.release()
+ return result
+
+def overridetransplant(orig, ui, repo, *revs, **opts):
+ try:
+ oldstandins = lfutil.getstandinsstate(repo)
+ repo._istransplanting = True
+ result = orig(ui, repo, *revs, **opts)
+ newstandins = lfutil.getstandinsstate(repo)
+ filelist = lfutil.getlfilestoupdate(oldstandins, newstandins)
+ lfcommands.updatelfiles(repo.ui, repo, filelist=filelist,
+ printmessage=True)
+ finally:
+ repo._istransplanting = False
+ return result
+
+def overridecat(orig, ui, repo, file1, *pats, **opts):
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ if not lfutil.standin(file1) in ctx:
+ result = orig(ui, repo, file1, *pats, **opts)
+ return result
+ return lfcommands.catlfile(repo, file1, ctx.rev(), opts.get('output'))
diff --git a/hgext/largefiles/proto.py b/hgext/largefiles/proto.py
new file mode 100644
index 0000000..de89e32
--- /dev/null
+++ b/hgext/largefiles/proto.py
@@ -0,0 +1,173 @@
+# Copyright 2011 Fog Creek Software
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+import urllib2
+
+from mercurial import error, httppeer, util, wireproto
+from mercurial.wireproto import batchable, future
+from mercurial.i18n import _
+
+import lfutil
+
+LARGEFILES_REQUIRED_MSG = ('\nThis repository uses the largefiles extension.'
+ '\n\nPlease enable it in your Mercurial config '
+ 'file.\n')
+
+def putlfile(repo, proto, sha):
+ '''Put a largefile into a repository's local store and into the
+ user cache.'''
+ proto.redirect()
+
+ path = lfutil.storepath(repo, sha)
+ util.makedirs(os.path.dirname(path))
+ tmpfp = util.atomictempfile(path, createmode=repo.store.createmode)
+
+ try:
+ try:
+ proto.getfile(tmpfp)
+ tmpfp._fp.seek(0)
+ if sha != lfutil.hexsha1(tmpfp._fp):
+ raise IOError(0, _('largefile contents do not match hash'))
+ tmpfp.close()
+ lfutil.linktousercache(repo, sha)
+ except IOError, e:
+ repo.ui.warn(_('largefiles: failed to put %s into store: %s') %
+ (sha, e.strerror))
+ return wireproto.pushres(1)
+ finally:
+ tmpfp.discard()
+
+ return wireproto.pushres(0)
+
+def getlfile(repo, proto, sha):
+ '''Retrieve a largefile from the repository-local cache or system
+ cache.'''
+ filename = lfutil.findfile(repo, sha)
+ if not filename:
+ raise util.Abort(_('requested largefile %s not present in cache') % sha)
+ f = open(filename, 'rb')
+ length = os.fstat(f.fileno())[6]
+
+ # Since we can't set an HTTP content-length header here, and
+ # Mercurial core provides no way to give the length of a streamres
+ # (and reading the entire file into RAM would be ill-advised), we
+ # just send the length on the first line of the response, like the
+ # ssh proto does for string responses.
+ def generator():
+ yield '%d\n' % length
+ for chunk in f:
+ yield chunk
+ return wireproto.streamres(generator())
+
+def statlfile(repo, proto, sha):
+ '''Return '2\n' if the largefile is missing, '1\n' if it has a
+ mismatched checksum, or '0\n' if it is in good condition'''
+ filename = lfutil.findfile(repo, sha)
+ if not filename:
+ return '2\n'
+ fd = None
+ try:
+ fd = open(filename, 'rb')
+ return lfutil.hexsha1(fd) == sha and '0\n' or '1\n'
+ finally:
+ if fd:
+ fd.close()
+
+def wirereposetup(ui, repo):
+ class lfileswirerepository(repo.__class__):
+ def putlfile(self, sha, fd):
+ # unfortunately, httprepository._callpush tries to convert its
+ # input file-like into a bundle before sending it, so we can't use
+ # it ...
+ if issubclass(self.__class__, httppeer.httppeer):
+ res = None
+ try:
+ res = self._call('putlfile', data=fd, sha=sha,
+ headers={'content-type':'application/mercurial-0.1'})
+ d, output = res.split('\n', 1)
+ for l in output.splitlines(True):
+ self.ui.warn(_('remote: '), l, '\n')
+ return int(d)
+ except (ValueError, urllib2.HTTPError):
+ self.ui.warn(_('unexpected putlfile response: %s') % res)
+ return 1
+ # ... but we can't use sshrepository._call because the data=
+ # argument won't get sent, and _callpush does exactly what we want
+ # in this case: send the data straight through
+ else:
+ try:
+ ret, output = self._callpush("putlfile", fd, sha=sha)
+ if ret == "":
+ raise error.ResponseError(_('putlfile failed:'),
+ output)
+ return int(ret)
+ except IOError:
+ return 1
+ except ValueError:
+ raise error.ResponseError(
+ _('putlfile failed (unexpected response):'), ret)
+
+ def getlfile(self, sha):
+ stream = self._callstream("getlfile", sha=sha)
+ length = stream.readline()
+ try:
+ length = int(length)
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"),
+ length))
+ return (length, stream)
+
+ @batchable
+ def statlfile(self, sha):
+ f = future()
+ result = {'sha': sha}
+ yield result, f
+ try:
+ yield int(f.value)
+ except (ValueError, urllib2.HTTPError):
+ # If the server returns anything but an integer followed by a
+ # newline, newline, it's not speaking our language; if we get
+ # an HTTP error, we can't be sure the largefile is present;
+ # either way, consider it missing.
+ yield 2
+
+ repo.__class__ = lfileswirerepository
+
+# advertise the largefiles=serve capability
+def capabilities(repo, proto):
+ return capabilitiesorig(repo, proto) + ' largefiles=serve'
+
+# duplicate what Mercurial's new out-of-band errors mechanism does, because
+# clients old and new alike both handle it well
+def webprotorefuseclient(self, message):
+ self.req.header([('Content-Type', 'application/hg-error')])
+ return message
+
+def sshprotorefuseclient(self, message):
+ self.ui.write_err('%s\n-\n' % message)
+ self.fout.write('\n')
+ self.fout.flush()
+
+ return ''
+
+def heads(repo, proto):
+ if lfutil.islfilesrepo(repo):
+ return wireproto.ooberror(LARGEFILES_REQUIRED_MSG)
+ return wireproto.heads(repo, proto)
+
+def sshrepocallstream(self, cmd, **args):
+ if cmd == 'heads' and self.capable('largefiles'):
+ cmd = 'lheads'
+ if cmd == 'batch' and self.capable('largefiles'):
+ args['cmds'] = args['cmds'].replace('heads ', 'lheads ')
+ return ssholdcallstream(self, cmd, **args)
+
+def httprepocallstream(self, cmd, **args):
+ if cmd == 'heads' and self.capable('largefiles'):
+ cmd = 'lheads'
+ if cmd == 'batch' and self.capable('largefiles'):
+ args['cmds'] = args['cmds'].replace('heads ', 'lheads ')
+ return httpoldcallstream(self, cmd, **args)
diff --git a/hgext/largefiles/remotestore.py b/hgext/largefiles/remotestore.py
new file mode 100644
index 0000000..6c3d371
--- /dev/null
+++ b/hgext/largefiles/remotestore.py
@@ -0,0 +1,110 @@
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''remote largefile store; the base class for servestore'''
+
+import urllib2
+
+from mercurial import util
+from mercurial.i18n import _
+from mercurial.wireproto import remotebatch
+
+import lfutil
+import basestore
+
+class remotestore(basestore.basestore):
+ '''a largefile store accessed over a network'''
+ def __init__(self, ui, repo, url):
+ super(remotestore, self).__init__(ui, repo, url)
+
+ def put(self, source, hash):
+ if self.sendfile(source, hash):
+ raise util.Abort(
+ _('remotestore: could not put %s to remote store %s')
+ % (source, self.url))
+ self.ui.debug(
+ _('remotestore: put %s to remote store %s') % (source, self.url))
+
+ def exists(self, hashes):
+ return self._verify(hashes)
+
+ def sendfile(self, filename, hash):
+ self.ui.debug('remotestore: sendfile(%s, %s)\n' % (filename, hash))
+ fd = None
+ try:
+ try:
+ fd = lfutil.httpsendfile(self.ui, filename)
+ except IOError, e:
+ raise util.Abort(
+ _('remotestore: could not open file %s: %s')
+ % (filename, str(e)))
+ return self._put(hash, fd)
+ finally:
+ if fd:
+ fd.close()
+
+ def _getfile(self, tmpfile, filename, hash):
+ # quit if the largefile isn't there
+ stat = self._stat(hash)
+ if stat == 1:
+ raise util.Abort(_('remotestore: largefile %s is invalid') % hash)
+ elif stat == 2:
+ raise util.Abort(_('remotestore: largefile %s is missing') % hash)
+
+ try:
+ length, infile = self._get(hash)
+ except urllib2.HTTPError, e:
+ # 401s get converted to util.Aborts; everything else is fine being
+ # turned into a StoreError
+ raise basestore.StoreError(filename, hash, self.url, str(e))
+ except urllib2.URLError, e:
+ # This usually indicates a connection problem, so don't
+ # keep trying with the other files... they will probably
+ # all fail too.
+ raise util.Abort('%s: %s' % (self.url, e.reason))
+ except IOError, e:
+ raise basestore.StoreError(filename, hash, self.url, str(e))
+
+ # Mercurial does not close its SSH connections after writing a stream
+ if length is not None:
+ infile = lfutil.limitreader(infile, length)
+ return lfutil.copyandhash(lfutil.blockstream(infile), tmpfile)
+
+ def _verify(self, hashes):
+ return self._stat(hashes)
+
+ def _verifyfile(self, cctx, cset, contents, standin, verified):
+ filename = lfutil.splitstandin(standin)
+ if not filename:
+ return False
+ fctx = cctx[standin]
+ key = (filename, fctx.filenode())
+ if key in verified:
+ return False
+
+ verified.add(key)
+
+ stat = self._stat(hash)
+ if not stat:
+ return False
+ elif stat == 1:
+ self.ui.warn(
+ _('changeset %s: %s: contents differ\n')
+ % (cset, filename))
+ return True # failed
+ elif stat == 2:
+ self.ui.warn(
+ _('changeset %s: %s missing\n')
+ % (cset, filename))
+ return True # failed
+ else:
+ raise RuntimeError('verify failed: unexpected response from '
+ 'statlfile (%r)' % stat)
+
+ def batch(self):
+ '''Support for remote batching.'''
+ return remotebatch(self)
+
diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
new file mode 100644
index 0000000..04ab704
--- /dev/null
+++ b/hgext/largefiles/reposetup.py
@@ -0,0 +1,475 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''setup for largefiles repositories: reposetup'''
+import copy
+import types
+import os
+
+from mercurial import context, error, manifest, match as match_, util
+from mercurial import node as node_
+from mercurial.i18n import _
+
+import lfcommands
+import proto
+import lfutil
+
+def reposetup(ui, repo):
+ # wire repositories should be given new wireproto functions but not the
+ # other largefiles modifications
+ if not repo.local():
+ return proto.wirereposetup(ui, repo)
+
+ for name in ('status', 'commitctx', 'commit', 'push'):
+ method = getattr(repo, name)
+ if (isinstance(method, types.FunctionType) and
+ method.func_name == 'wrap'):
+ ui.warn(_('largefiles: repo method %r appears to have already been'
+ ' wrapped by another extension: '
+ 'largefiles may behave incorrectly\n')
+ % name)
+
+ class lfilesrepo(repo.__class__):
+ lfstatus = False
+ def status_nolfiles(self, *args, **kwargs):
+ return super(lfilesrepo, self).status(*args, **kwargs)
+
+ # When lfstatus is set, return a context that gives the names
+ # of largefiles instead of their corresponding standins and
+ # identifies the largefiles as always binary, regardless of
+ # their actual contents.
+ def __getitem__(self, changeid):
+ ctx = super(lfilesrepo, self).__getitem__(changeid)
+ if self.lfstatus:
+ class lfilesmanifestdict(manifest.manifestdict):
+ def __contains__(self, filename):
+ if super(lfilesmanifestdict,
+ self).__contains__(filename):
+ return True
+ return super(lfilesmanifestdict,
+ self).__contains__(lfutil.standin(filename))
+ class lfilesctx(ctx.__class__):
+ def files(self):
+ filenames = super(lfilesctx, self).files()
+ return [lfutil.splitstandin(f) or f for f in filenames]
+ def manifest(self):
+ man1 = super(lfilesctx, self).manifest()
+ man1.__class__ = lfilesmanifestdict
+ return man1
+ def filectx(self, path, fileid=None, filelog=None):
+ try:
+ if filelog is not None:
+ result = super(lfilesctx, self).filectx(
+ path, fileid, filelog)
+ else:
+ result = super(lfilesctx, self).filectx(
+ path, fileid)
+ except error.LookupError:
+ # Adding a null character will cause Mercurial to
+ # identify this as a binary file.
+ if filelog is not None:
+ result = super(lfilesctx, self).filectx(
+ lfutil.standin(path), fileid, filelog)
+ else:
+ result = super(lfilesctx, self).filectx(
+ lfutil.standin(path), fileid)
+ olddata = result.data
+ result.data = lambda: olddata() + '\0'
+ return result
+ ctx.__class__ = lfilesctx
+ return ctx
+
+ # Figure out the status of big files and insert them into the
+ # appropriate list in the result. Also removes standin files
+ # from the listing. Revert to the original status if
+ # self.lfstatus is False.
+ def status(self, node1='.', node2=None, match=None, ignored=False,
+ clean=False, unknown=False, listsubrepos=False):
+ listignored, listclean, listunknown = ignored, clean, unknown
+ if not self.lfstatus:
+ return super(lfilesrepo, self).status(node1, node2, match,
+ listignored, listclean, listunknown, listsubrepos)
+ else:
+ # some calls in this function rely on the old version of status
+ self.lfstatus = False
+ if isinstance(node1, context.changectx):
+ ctx1 = node1
+ else:
+ ctx1 = repo[node1]
+ if isinstance(node2, context.changectx):
+ ctx2 = node2
+ else:
+ ctx2 = repo[node2]
+ working = ctx2.rev() is None
+ parentworking = working and ctx1 == self['.']
+
+ def inctx(file, ctx):
+ try:
+ if ctx.rev() is None:
+ return file in ctx.manifest()
+ ctx[file]
+ return True
+ except KeyError:
+ return False
+
+ if match is None:
+ match = match_.always(self.root, self.getcwd())
+
+ # First check if there were files specified on the
+ # command line. If there were, and none of them were
+ # largefiles, we should just bail here and let super
+ # handle it -- thus gaining a big performance boost.
+ lfdirstate = lfutil.openlfdirstate(ui, self)
+ if match.files() and not match.anypats():
+ for f in lfdirstate:
+ if match(f):
+ break
+ else:
+ return super(lfilesrepo, self).status(node1, node2,
+ match, listignored, listclean,
+ listunknown, listsubrepos)
+
+ # Create a copy of match that matches standins instead
+ # of largefiles.
+ def tostandins(files):
+ if not working:
+ return files
+ newfiles = []
+ dirstate = repo.dirstate
+ for f in files:
+ sf = lfutil.standin(f)
+ if sf in dirstate:
+ newfiles.append(sf)
+ elif sf in dirstate.dirs():
+ # Directory entries could be regular or
+ # standin, check both
+ newfiles.extend((f, sf))
+ else:
+ newfiles.append(f)
+ return newfiles
+
+ # Create a function that we can use to override what is
+ # normally the ignore matcher. We've already checked
+ # for ignored files on the first dirstate walk, and
+ # unecessarily re-checking here causes a huge performance
+ # hit because lfdirstate only knows about largefiles
+ def _ignoreoverride(self):
+ return False
+
+ m = copy.copy(match)
+ m._files = tostandins(m._files)
+
+ # Get ignored files here even if we weren't asked for them; we
+ # must use the result here for filtering later
+ result = super(lfilesrepo, self).status(node1, node2, m,
+ True, clean, unknown, listsubrepos)
+ if working:
+ try:
+ # Any non-largefiles that were explicitly listed must be
+ # taken out or lfdirstate.status will report an error.
+ # The status of these files was already computed using
+ # super's status.
+ # Override lfdirstate's ignore matcher to not do
+ # anything
+ origignore = lfdirstate._ignore
+ lfdirstate._ignore = _ignoreoverride
+
+ def sfindirstate(f):
+ sf = lfutil.standin(f)
+ dirstate = repo.dirstate
+ return sf in dirstate or sf in dirstate.dirs()
+ match._files = [f for f in match._files
+ if sfindirstate(f)]
+ # Don't waste time getting the ignored and unknown
+ # files again; we already have them
+ s = lfdirstate.status(match, [], False,
+ listclean, False)
+ (unsure, modified, added, removed, missing, unknown,
+ ignored, clean) = s
+ # Replace the list of ignored and unknown files with
+ # the previously caclulated lists, and strip out the
+ # largefiles
+ lfiles = set(lfdirstate._map)
+ ignored = set(result[5]).difference(lfiles)
+ unknown = set(result[4]).difference(lfiles)
+ if parentworking:
+ for lfile in unsure:
+ standin = lfutil.standin(lfile)
+ if standin not in ctx1:
+ # from second parent
+ modified.append(lfile)
+ elif ctx1[standin].data().strip() \
+ != lfutil.hashfile(self.wjoin(lfile)):
+ modified.append(lfile)
+ else:
+ clean.append(lfile)
+ lfdirstate.normal(lfile)
+ else:
+ tocheck = unsure + modified + added + clean
+ modified, added, clean = [], [], []
+
+ for lfile in tocheck:
+ standin = lfutil.standin(lfile)
+ if inctx(standin, ctx1):
+ if ctx1[standin].data().strip() != \
+ lfutil.hashfile(self.wjoin(lfile)):
+ modified.append(lfile)
+ else:
+ clean.append(lfile)
+ else:
+ added.append(lfile)
+ finally:
+ # Replace the original ignore function
+ lfdirstate._ignore = origignore
+
+ for standin in ctx1.manifest():
+ if not lfutil.isstandin(standin):
+ continue
+ lfile = lfutil.splitstandin(standin)
+ if not match(lfile):
+ continue
+ if lfile not in lfdirstate:
+ removed.append(lfile)
+
+ # Filter result lists
+ result = list(result)
+
+ # Largefiles are not really removed when they're
+ # still in the normal dirstate. Likewise, normal
+ # files are not really removed if it's still in
+ # lfdirstate. This happens in merges where files
+ # change type.
+ removed = [f for f in removed if f not in repo.dirstate]
+ result[2] = [f for f in result[2] if f not in lfdirstate]
+
+ # Unknown files
+ unknown = set(unknown).difference(ignored)
+ result[4] = [f for f in unknown
+ if (repo.dirstate[f] == '?' and
+ not lfutil.isstandin(f))]
+ # Ignored files were calculated earlier by the dirstate,
+ # and we already stripped out the largefiles from the list
+ result[5] = ignored
+ # combine normal files and largefiles
+ normals = [[fn for fn in filelist
+ if not lfutil.isstandin(fn)]
+ for filelist in result]
+ lfiles = (modified, added, removed, missing, [], [], clean)
+ result = [sorted(list1 + list2)
+ for (list1, list2) in zip(normals, lfiles)]
+ else:
+ def toname(f):
+ if lfutil.isstandin(f):
+ return lfutil.splitstandin(f)
+ return f
+ result = [[toname(f) for f in items] for items in result]
+
+ if not listunknown:
+ result[4] = []
+ if not listignored:
+ result[5] = []
+ if not listclean:
+ result[6] = []
+ self.lfstatus = True
+ return result
+
+ # As part of committing, copy all of the largefiles into the
+ # cache.
+ def commitctx(self, *args, **kwargs):
+ node = super(lfilesrepo, self).commitctx(*args, **kwargs)
+ lfutil.copyalltostore(self, node)
+ return node
+
+ # Before commit, largefile standins have not had their
+ # contents updated to reflect the hash of their largefile.
+ # Do that here.
+ def commit(self, text="", user=None, date=None, match=None,
+ force=False, editor=False, extra={}):
+ orig = super(lfilesrepo, self).commit
+
+ wlock = repo.wlock()
+ try:
+ # Case 0: Rebase or Transplant
+ # We have to take the time to pull down the new largefiles now.
+ # Otherwise, any largefiles that were modified in the
+ # destination changesets get overwritten, either by the rebase
+ # or in the first commit after the rebase or transplant.
+ # updatelfiles will update the dirstate to mark any pulled
+ # largefiles as modified
+ if getattr(repo, "_isrebasing", False) or \
+ getattr(repo, "_istransplanting", False):
+ lfcommands.updatelfiles(repo.ui, repo, filelist=None,
+ printmessage=False)
+ result = orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+ return result
+ # Case 1: user calls commit with no specific files or
+ # include/exclude patterns: refresh and commit all files that
+ # are "dirty".
+ if ((match is None) or
+ (not match.anypats() and not match.files())):
+ # Spend a bit of time here to get a list of files we know
+ # are modified so we can compare only against those.
+ # It can cost a lot of time (several seconds)
+ # otherwise to update all standins if the largefiles are
+ # large.
+ lfdirstate = lfutil.openlfdirstate(ui, self)
+ dirtymatch = match_.always(repo.root, repo.getcwd())
+ s = lfdirstate.status(dirtymatch, [], False, False, False)
+ modifiedfiles = []
+ for i in s:
+ modifiedfiles.extend(i)
+ lfiles = lfutil.listlfiles(self)
+ # this only loops through largefiles that exist (not
+ # removed/renamed)
+ for lfile in lfiles:
+ if lfile in modifiedfiles:
+ if os.path.exists(
+ self.wjoin(lfutil.standin(lfile))):
+ # this handles the case where a rebase is being
+ # performed and the working copy is not updated
+ # yet.
+ if os.path.exists(self.wjoin(lfile)):
+ lfutil.updatestandin(self,
+ lfutil.standin(lfile))
+ lfdirstate.normal(lfile)
+
+ result = orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+
+ if result is not None:
+ for lfile in lfdirstate:
+ if lfile in modifiedfiles:
+ if (not os.path.exists(repo.wjoin(
+ lfutil.standin(lfile)))) or \
+ (not os.path.exists(repo.wjoin(lfile))):
+ lfdirstate.drop(lfile)
+
+ # This needs to be after commit; otherwise precommit hooks
+ # get the wrong status
+ lfdirstate.write()
+ return result
+
+ for f in match.files():
+ if lfutil.isstandin(f):
+ raise util.Abort(
+ _('file "%s" is a largefile standin') % f,
+ hint=('commit the largefile itself instead'))
+
+ # Case 2: user calls commit with specified patterns: refresh
+ # any matching big files.
+ smatcher = lfutil.composestandinmatcher(self, match)
+ standins = lfutil.dirstatewalk(self.dirstate, smatcher)
+
+ # No matching big files: get out of the way and pass control to
+ # the usual commit() method.
+ if not standins:
+ return orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+
+ # Refresh all matching big files. It's possible that the
+ # commit will end up failing, in which case the big files will
+ # stay refreshed. No harm done: the user modified them and
+ # asked to commit them, so sooner or later we're going to
+ # refresh the standins. Might as well leave them refreshed.
+ lfdirstate = lfutil.openlfdirstate(ui, self)
+ for standin in standins:
+ lfile = lfutil.splitstandin(standin)
+ if lfdirstate[lfile] <> 'r':
+ lfutil.updatestandin(self, standin)
+ lfdirstate.normal(lfile)
+ else:
+ lfdirstate.drop(lfile)
+
+ # Cook up a new matcher that only matches regular files or
+ # standins corresponding to the big files requested by the
+ # user. Have to modify _files to prevent commit() from
+ # complaining "not tracked" for big files.
+ lfiles = lfutil.listlfiles(repo)
+ match = copy.copy(match)
+ origmatchfn = match.matchfn
+
+ # Check both the list of largefiles and the list of
+ # standins because if a largefile was removed, it
+ # won't be in the list of largefiles at this point
+ match._files += sorted(standins)
+
+ actualfiles = []
+ for f in match._files:
+ fstandin = lfutil.standin(f)
+
+ # ignore known largefiles and standins
+ if f in lfiles or fstandin in standins:
+ continue
+
+ # append directory separator to avoid collisions
+ if not fstandin.endswith(os.sep):
+ fstandin += os.sep
+
+ actualfiles.append(f)
+ match._files = actualfiles
+
+ def matchfn(f):
+ if origmatchfn(f):
+ return f not in lfiles
+ else:
+ return f in standins
+
+ match.matchfn = matchfn
+ result = orig(text=text, user=user, date=date, match=match,
+ force=force, editor=editor, extra=extra)
+ # This needs to be after commit; otherwise precommit hooks
+ # get the wrong status
+ lfdirstate.write()
+ return result
+ finally:
+ wlock.release()
+
+ def push(self, remote, force=False, revs=None, newbranch=False):
+ o = lfutil.findoutgoing(repo, remote, force)
+ if o:
+ toupload = set()
+ o = repo.changelog.nodesbetween(o, revs)[0]
+ for n in o:
+ parents = [p for p in repo.changelog.parents(n)
+ if p != node_.nullid]
+ ctx = repo[n]
+ files = set(ctx.files())
+ if len(parents) == 2:
+ mc = ctx.manifest()
+ mp1 = ctx.parents()[0].manifest()
+ mp2 = ctx.parents()[1].manifest()
+ for f in mp1:
+ if f not in mc:
+ files.add(f)
+ for f in mp2:
+ if f not in mc:
+ files.add(f)
+ for f in mc:
+ if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f,
+ None):
+ files.add(f)
+
+ toupload = toupload.union(
+ set([ctx[f].data().strip()
+ for f in files
+ if lfutil.isstandin(f) and f in ctx]))
+ lfcommands.uploadlfiles(ui, self, remote, toupload)
+ return super(lfilesrepo, self).push(remote, force, revs,
+ newbranch)
+
+ repo.__class__ = lfilesrepo
+
+ def checkrequireslfiles(ui, repo, **kwargs):
+ if 'largefiles' not in repo.requirements and util.any(
+ lfutil.shortname+'/' in f[0] for f in repo.store.datafiles()):
+ repo.requirements.add('largefiles')
+ repo._writerequirements()
+
+ ui.setconfig('hooks', 'changegroup.lfiles', checkrequireslfiles)
+ ui.setconfig('hooks', 'commit.lfiles', checkrequireslfiles)
diff --git a/hgext/largefiles/uisetup.py b/hgext/largefiles/uisetup.py
new file mode 100644
index 0000000..e50190b
--- /dev/null
+++ b/hgext/largefiles/uisetup.py
@@ -0,0 +1,167 @@
+# Copyright 2009-2010 Gregory P. Ward
+# Copyright 2009-2010 Intelerad Medical Systems Incorporated
+# Copyright 2010-2011 Fog Creek Software
+# Copyright 2010-2011 Unity Technologies
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''setup for largefiles extension: uisetup'''
+
+from mercurial import archival, cmdutil, commands, extensions, filemerge, hg, \
+ httppeer, localrepo, merge, sshpeer, sshserver, wireproto
+from mercurial.i18n import _
+from mercurial.hgweb import hgweb_mod, protocol, webcommands
+from mercurial.subrepo import hgsubrepo
+
+import overrides
+import proto
+
+def uisetup(ui):
+ # Disable auto-status for some commands which assume that all
+ # files in the result are under Mercurial's control
+
+ entry = extensions.wrapcommand(commands.table, 'add',
+ overrides.overrideadd)
+ addopt = [('', 'large', None, _('add as largefile')),
+ ('', 'normal', None, _('add as normal file')),
+ ('', 'lfsize', '', _('add all files above this size '
+ '(in megabytes) as largefiles '
+ '(default: 10)'))]
+ entry[1].extend(addopt)
+
+ entry = extensions.wrapcommand(commands.table, 'addremove',
+ overrides.overrideaddremove)
+ entry = extensions.wrapcommand(commands.table, 'remove',
+ overrides.overrideremove)
+ entry = extensions.wrapcommand(commands.table, 'forget',
+ overrides.overrideforget)
+
+ # Subrepos call status function
+ entry = extensions.wrapcommand(commands.table, 'status',
+ overrides.overridestatus)
+ entry = extensions.wrapfunction(hgsubrepo, 'status',
+ overrides.overridestatusfn)
+
+ entry = extensions.wrapcommand(commands.table, 'log',
+ overrides.overridelog)
+ entry = extensions.wrapcommand(commands.table, 'rollback',
+ overrides.overriderollback)
+ entry = extensions.wrapcommand(commands.table, 'verify',
+ overrides.overrideverify)
+
+ verifyopt = [('', 'large', None, _('verify largefiles')),
+ ('', 'lfa', None,
+ _('verify all revisions of largefiles not just current')),
+ ('', 'lfc', None,
+ _('verify largefile contents not just existence'))]
+ entry[1].extend(verifyopt)
+
+ entry = extensions.wrapcommand(commands.table, 'outgoing',
+ overrides.overrideoutgoing)
+ outgoingopt = [('', 'large', None, _('display outgoing largefiles'))]
+ entry[1].extend(outgoingopt)
+ entry = extensions.wrapcommand(commands.table, 'summary',
+ overrides.overridesummary)
+ summaryopt = [('', 'large', None, _('display outgoing largefiles'))]
+ entry[1].extend(summaryopt)
+
+ entry = extensions.wrapcommand(commands.table, 'update',
+ overrides.overrideupdate)
+ entry = extensions.wrapcommand(commands.table, 'pull',
+ overrides.overridepull)
+ pullopt = [('', 'all-largefiles', None,
+ _('download all pulled versions of largefiles'))]
+ entry[1].extend(pullopt)
+ entry = extensions.wrapcommand(commands.table, 'clone',
+ overrides.overrideclone)
+ cloneopt = [('', 'all-largefiles', None,
+ _('download all versions of all largefiles'))]
+
+ entry[1].extend(cloneopt)
+ entry = extensions.wrapcommand(commands.table, 'cat',
+ overrides.overridecat)
+ entry = extensions.wrapfunction(merge, '_checkunknownfile',
+ overrides.overridecheckunknownfile)
+ entry = extensions.wrapfunction(merge, 'manifestmerge',
+ overrides.overridemanifestmerge)
+ entry = extensions.wrapfunction(filemerge, 'filemerge',
+ overrides.overridefilemerge)
+ entry = extensions.wrapfunction(cmdutil, 'copy',
+ overrides.overridecopy)
+
+ # Summary calls dirty on the subrepos
+ entry = extensions.wrapfunction(hgsubrepo, 'dirty',
+ overrides.overridedirty)
+
+ # Backout calls revert so we need to override both the command and the
+ # function
+ entry = extensions.wrapcommand(commands.table, 'revert',
+ overrides.overriderevert)
+ entry = extensions.wrapfunction(commands, 'revert',
+ overrides.overriderevert)
+
+ # clone uses hg._update instead of hg.update even though they are the
+ # same function... so wrap both of them)
+ extensions.wrapfunction(hg, 'update', overrides.hgupdate)
+ extensions.wrapfunction(hg, '_update', overrides.hgupdate)
+ extensions.wrapfunction(hg, 'clean', overrides.hgclean)
+ extensions.wrapfunction(hg, 'merge', overrides.hgmerge)
+
+ extensions.wrapfunction(archival, 'archive', overrides.overridearchive)
+ extensions.wrapfunction(hgsubrepo, 'archive', overrides.hgsubrepoarchive)
+ extensions.wrapfunction(cmdutil, 'bailifchanged',
+ overrides.overridebailifchanged)
+
+ # create the new wireproto commands ...
+ wireproto.commands['putlfile'] = (proto.putlfile, 'sha')
+ wireproto.commands['getlfile'] = (proto.getlfile, 'sha')
+ wireproto.commands['statlfile'] = (proto.statlfile, 'sha')
+
+ # ... and wrap some existing ones
+ wireproto.commands['capabilities'] = (proto.capabilities, '')
+ wireproto.commands['heads'] = (proto.heads, '')
+ wireproto.commands['lheads'] = (wireproto.heads, '')
+
+ # make putlfile behave the same as push and {get,stat}lfile behave
+ # the same as pull w.r.t. permissions checks
+ hgweb_mod.perms['putlfile'] = 'push'
+ hgweb_mod.perms['getlfile'] = 'pull'
+ hgweb_mod.perms['statlfile'] = 'pull'
+
+ extensions.wrapfunction(webcommands, 'decodepath', overrides.decodepath)
+
+ # the hello wireproto command uses wireproto.capabilities, so it won't see
+ # our largefiles capability unless we replace the actual function as well.
+ proto.capabilitiesorig = wireproto.capabilities
+ wireproto.capabilities = proto.capabilities
+
+ # these let us reject non-largefiles clients and make them display
+ # our error messages
+ protocol.webproto.refuseclient = proto.webprotorefuseclient
+ sshserver.sshserver.refuseclient = proto.sshprotorefuseclient
+
+ # can't do this in reposetup because it needs to have happened before
+ # wirerepo.__init__ is called
+ proto.ssholdcallstream = sshpeer.sshpeer._callstream
+ proto.httpoldcallstream = httppeer.httppeer._callstream
+ sshpeer.sshpeer._callstream = proto.sshrepocallstream
+ httppeer.httppeer._callstream = proto.httprepocallstream
+
+ # don't die on seeing a repo with the largefiles requirement
+ localrepo.localrepository.supported |= set(['largefiles'])
+
+ # override some extensions' stuff as well
+ for name, module in extensions.extensions():
+ if name == 'fetch':
+ extensions.wrapcommand(getattr(module, 'cmdtable'), 'fetch',
+ overrides.overridefetch)
+ if name == 'purge':
+ extensions.wrapcommand(getattr(module, 'cmdtable'), 'purge',
+ overrides.overridepurge)
+ if name == 'rebase':
+ extensions.wrapcommand(getattr(module, 'cmdtable'), 'rebase',
+ overrides.overriderebase)
+ if name == 'transplant':
+ extensions.wrapcommand(getattr(module, 'cmdtable'), 'transplant',
+ overrides.overridetransplant)
diff --git a/hgext/largefiles/wirestore.py b/hgext/largefiles/wirestore.py
new file mode 100644
index 0000000..a394cf0
--- /dev/null
+++ b/hgext/largefiles/wirestore.py
@@ -0,0 +1,37 @@
+# Copyright 2010-2011 Fog Creek Software
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''largefile store working over Mercurial's wire protocol'''
+
+import lfutil
+import remotestore
+
+class wirestore(remotestore.remotestore):
+ def __init__(self, ui, repo, remote):
+ cap = remote.capable('largefiles')
+ if not cap:
+ raise lfutil.storeprotonotcapable([])
+ storetypes = cap.split(',')
+ if 'serve' not in storetypes:
+ raise lfutil.storeprotonotcapable(storetypes)
+ self.remote = remote
+ super(wirestore, self).__init__(ui, repo, remote.url())
+
+ def _put(self, hash, fd):
+ return self.remote.putlfile(hash, fd)
+
+ def _get(self, hash):
+ return self.remote.getlfile(hash)
+
+ def _stat(self, hashes):
+ batch = self.remote.batch()
+ futures = {}
+ for hash in hashes:
+ futures[hash] = batch.statlfile(hash)
+ batch.submit()
+ retval = {}
+ for hash in hashes:
+ retval[hash] = not futures[hash].value
+ return retval
diff --git a/hgext/mq.py b/hgext/mq.py
new file mode 100644
index 0000000..33a31c4
--- /dev/null
+++ b/hgext/mq.py
@@ -0,0 +1,3597 @@
+# mq.py - patch queues for mercurial
+#
+# Copyright 2005, 2006 Chris Mason <mason@suse.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''manage a stack of patches
+
+This extension lets you work with a stack of patches in a Mercurial
+repository. It manages two stacks of patches - all known patches, and
+applied patches (subset of known patches).
+
+Known patches are represented as patch files in the .hg/patches
+directory. Applied patches are both patch files and changesets.
+
+Common tasks (use :hg:`help command` for more details)::
+
+ create new patch qnew
+ import existing patch qimport
+
+ print patch series qseries
+ print applied patches qapplied
+
+ add known patch to applied stack qpush
+ remove patch from applied stack qpop
+ refresh contents of top applied patch qrefresh
+
+By default, mq will automatically use git patches when required to
+avoid losing file mode changes, copy records, binary files or empty
+files creations or deletions. This behaviour can be configured with::
+
+ [mq]
+ git = auto/keep/yes/no
+
+If set to 'keep', mq will obey the [diff] section configuration while
+preserving existing git patches upon qrefresh. If set to 'yes' or
+'no', mq will override the [diff] section and always generate git or
+regular patches, possibly losing data in the second case.
+
+It may be desirable for mq changesets to be kept in the secret phase (see
+:hg:`help phases`), which can be enabled with the following setting::
+
+ [mq]
+ secret = True
+
+You will by default be managing a patch queue named "patches". You can
+create other, independent patch queues with the :hg:`qqueue` command.
+
+If the working directory contains uncommitted files, qpush, qpop and
+qgoto abort immediately. If -f/--force is used, the changes are
+discarded. Setting::
+
+ [mq]
+ keepchanges = True
+
+make them behave as if --keep-changes were passed, and non-conflicting
+local changes will be tolerated and preserved. If incompatible options
+such as -f/--force or --exact are passed, this setting is ignored.
+'''
+
+from mercurial.i18n import _
+from mercurial.node import bin, hex, short, nullid, nullrev
+from mercurial.lock import release
+from mercurial import commands, cmdutil, hg, scmutil, util, revset
+from mercurial import repair, extensions, url, error, phases
+from mercurial import patch as patchmod
+import os, re, errno, shutil
+
+commands.norepo += " qclone"
+
+seriesopts = [('s', 'summary', None, _('print first line of patch header'))]
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+# Patch names looks like unix-file names.
+# They must be joinable with queue directory and result in the patch path.
+normname = util.normpath
+
+class statusentry(object):
+ def __init__(self, node, name):
+ self.node, self.name = node, name
+ def __repr__(self):
+ return hex(self.node) + ':' + self.name
+
+class patchheader(object):
+ def __init__(self, pf, plainmode=False):
+ def eatdiff(lines):
+ while lines:
+ l = lines[-1]
+ if (l.startswith("diff -") or
+ l.startswith("Index:") or
+ l.startswith("===========")):
+ del lines[-1]
+ else:
+ break
+ def eatempty(lines):
+ while lines:
+ if not lines[-1].strip():
+ del lines[-1]
+ else:
+ break
+
+ message = []
+ comments = []
+ user = None
+ date = None
+ parent = None
+ format = None
+ subject = None
+ branch = None
+ nodeid = None
+ diffstart = 0
+
+ for line in file(pf):
+ line = line.rstrip()
+ if (line.startswith('diff --git')
+ or (diffstart and line.startswith('+++ '))):
+ diffstart = 2
+ break
+ diffstart = 0 # reset
+ if line.startswith("--- "):
+ diffstart = 1
+ continue
+ elif format == "hgpatch":
+ # parse values when importing the result of an hg export
+ if line.startswith("# User "):
+ user = line[7:]
+ elif line.startswith("# Date "):
+ date = line[7:]
+ elif line.startswith("# Parent "):
+ parent = line[9:].lstrip()
+ elif line.startswith("# Branch "):
+ branch = line[9:]
+ elif line.startswith("# Node ID "):
+ nodeid = line[10:]
+ elif not line.startswith("# ") and line:
+ message.append(line)
+ format = None
+ elif line == '# HG changeset patch':
+ message = []
+ format = "hgpatch"
+ elif (format != "tagdone" and (line.startswith("Subject: ") or
+ line.startswith("subject: "))):
+ subject = line[9:]
+ format = "tag"
+ elif (format != "tagdone" and (line.startswith("From: ") or
+ line.startswith("from: "))):
+ user = line[6:]
+ format = "tag"
+ elif (format != "tagdone" and (line.startswith("Date: ") or
+ line.startswith("date: "))):
+ date = line[6:]
+ format = "tag"
+ elif format == "tag" and line == "":
+ # when looking for tags (subject: from: etc) they
+ # end once you find a blank line in the source
+ format = "tagdone"
+ elif message or line:
+ message.append(line)
+ comments.append(line)
+
+ eatdiff(message)
+ eatdiff(comments)
+ # Remember the exact starting line of the patch diffs before consuming
+ # empty lines, for external use by TortoiseHg and others
+ self.diffstartline = len(comments)
+ eatempty(message)
+ eatempty(comments)
+
+ # make sure message isn't empty
+ if format and format.startswith("tag") and subject:
+ message.insert(0, "")
+ message.insert(0, subject)
+
+ self.message = message
+ self.comments = comments
+ self.user = user
+ self.date = date
+ self.parent = parent
+ # nodeid and branch are for external use by TortoiseHg and others
+ self.nodeid = nodeid
+ self.branch = branch
+ self.haspatch = diffstart > 1
+ self.plainmode = plainmode
+
+ def setuser(self, user):
+ if not self.updateheader(['From: ', '# User '], user):
+ try:
+ patchheaderat = self.comments.index('# HG changeset patch')
+ self.comments.insert(patchheaderat + 1, '# User ' + user)
+ except ValueError:
+ if self.plainmode or self._hasheader(['Date: ']):
+ self.comments = ['From: ' + user] + self.comments
+ else:
+ tmp = ['# HG changeset patch', '# User ' + user, '']
+ self.comments = tmp + self.comments
+ self.user = user
+
+ def setdate(self, date):
+ if not self.updateheader(['Date: ', '# Date '], date):
+ try:
+ patchheaderat = self.comments.index('# HG changeset patch')
+ self.comments.insert(patchheaderat + 1, '# Date ' + date)
+ except ValueError:
+ if self.plainmode or self._hasheader(['From: ']):
+ self.comments = ['Date: ' + date] + self.comments
+ else:
+ tmp = ['# HG changeset patch', '# Date ' + date, '']
+ self.comments = tmp + self.comments
+ self.date = date
+
+ def setparent(self, parent):
+ if not self.updateheader(['# Parent '], parent):
+ try:
+ patchheaderat = self.comments.index('# HG changeset patch')
+ self.comments.insert(patchheaderat + 1, '# Parent ' + parent)
+ except ValueError:
+ pass
+ self.parent = parent
+
+ def setmessage(self, message):
+ if self.comments:
+ self._delmsg()
+ self.message = [message]
+ self.comments += self.message
+
+ def updateheader(self, prefixes, new):
+ '''Update all references to a field in the patch header.
+ Return whether the field is present.'''
+ res = False
+ for prefix in prefixes:
+ for i in xrange(len(self.comments)):
+ if self.comments[i].startswith(prefix):
+ self.comments[i] = prefix + new
+ res = True
+ break
+ return res
+
+ def _hasheader(self, prefixes):
+ '''Check if a header starts with any of the given prefixes.'''
+ for prefix in prefixes:
+ for comment in self.comments:
+ if comment.startswith(prefix):
+ return True
+ return False
+
+ def __str__(self):
+ if not self.comments:
+ return ''
+ return '\n'.join(self.comments) + '\n\n'
+
+ def _delmsg(self):
+ '''Remove existing message, keeping the rest of the comments fields.
+ If comments contains 'subject: ', message will prepend
+ the field and a blank line.'''
+ if self.message:
+ subj = 'subject: ' + self.message[0].lower()
+ for i in xrange(len(self.comments)):
+ if subj == self.comments[i].lower():
+ del self.comments[i]
+ self.message = self.message[2:]
+ break
+ ci = 0
+ for mi in self.message:
+ while mi != self.comments[ci]:
+ ci += 1
+ del self.comments[ci]
+
+def newcommit(repo, phase, *args, **kwargs):
+ """helper dedicated to ensure a commit respect mq.secret setting
+
+ It should be used instead of repo.commit inside the mq source for operation
+ creating new changeset.
+ """
+ if phase is None:
+ if repo.ui.configbool('mq', 'secret', False):
+ phase = phases.secret
+ if phase is not None:
+ backup = repo.ui.backupconfig('phases', 'new-commit')
+ # Marking the repository as committing an mq patch can be used
+ # to optimize operations like _branchtags().
+ repo._committingpatch = True
+ try:
+ if phase is not None:
+ repo.ui.setconfig('phases', 'new-commit', phase)
+ return repo.commit(*args, **kwargs)
+ finally:
+ repo._committingpatch = False
+ if phase is not None:
+ repo.ui.restoreconfig(backup)
+
+class AbortNoCleanup(error.Abort):
+ pass
+
+class queue(object):
+ def __init__(self, ui, path, patchdir=None):
+ self.basepath = path
+ try:
+ fh = open(os.path.join(path, 'patches.queue'))
+ cur = fh.read().rstrip()
+ fh.close()
+ if not cur:
+ curpath = os.path.join(path, 'patches')
+ else:
+ curpath = os.path.join(path, 'patches-' + cur)
+ except IOError:
+ curpath = os.path.join(path, 'patches')
+ self.path = patchdir or curpath
+ self.opener = scmutil.opener(self.path)
+ self.ui = ui
+ self.applieddirty = False
+ self.seriesdirty = False
+ self.added = []
+ self.seriespath = "series"
+ self.statuspath = "status"
+ self.guardspath = "guards"
+ self.activeguards = None
+ self.guardsdirty = False
+ # Handle mq.git as a bool with extended values
+ try:
+ gitmode = ui.configbool('mq', 'git', None)
+ if gitmode is None:
+ raise error.ConfigError
+ self.gitmode = gitmode and 'yes' or 'no'
+ except error.ConfigError:
+ self.gitmode = ui.config('mq', 'git', 'auto').lower()
+ self.plainmode = ui.configbool('mq', 'plain', False)
+
+ @util.propertycache
+ def applied(self):
+ def parselines(lines):
+ for l in lines:
+ entry = l.split(':', 1)
+ if len(entry) > 1:
+ n, name = entry
+ yield statusentry(bin(n), name)
+ elif l.strip():
+ self.ui.warn(_('malformated mq status line: %s\n') % entry)
+ # else we ignore empty lines
+ try:
+ lines = self.opener.read(self.statuspath).splitlines()
+ return list(parselines(lines))
+ except IOError, e:
+ if e.errno == errno.ENOENT:
+ return []
+ raise
+
+ @util.propertycache
+ def fullseries(self):
+ try:
+ return self.opener.read(self.seriespath).splitlines()
+ except IOError, e:
+ if e.errno == errno.ENOENT:
+ return []
+ raise
+
+ @util.propertycache
+ def series(self):
+ self.parseseries()
+ return self.series
+
+ @util.propertycache
+ def seriesguards(self):
+ self.parseseries()
+ return self.seriesguards
+
+ def invalidate(self):
+ for a in 'applied fullseries series seriesguards'.split():
+ if a in self.__dict__:
+ delattr(self, a)
+ self.applieddirty = False
+ self.seriesdirty = False
+ self.guardsdirty = False
+ self.activeguards = None
+
+ def diffopts(self, opts={}, patchfn=None):
+ diffopts = patchmod.diffopts(self.ui, opts)
+ if self.gitmode == 'auto':
+ diffopts.upgrade = True
+ elif self.gitmode == 'keep':
+ pass
+ elif self.gitmode in ('yes', 'no'):
+ diffopts.git = self.gitmode == 'yes'
+ else:
+ raise util.Abort(_('mq.git option can be auto/keep/yes/no'
+ ' got %s') % self.gitmode)
+ if patchfn:
+ diffopts = self.patchopts(diffopts, patchfn)
+ return diffopts
+
+ def patchopts(self, diffopts, *patches):
+ """Return a copy of input diff options with git set to true if
+ referenced patch is a git patch and should be preserved as such.
+ """
+ diffopts = diffopts.copy()
+ if not diffopts.git and self.gitmode == 'keep':
+ for patchfn in patches:
+ patchf = self.opener(patchfn, 'r')
+ # if the patch was a git patch, refresh it as a git patch
+ for line in patchf:
+ if line.startswith('diff --git'):
+ diffopts.git = True
+ break
+ patchf.close()
+ return diffopts
+
+ def join(self, *p):
+ return os.path.join(self.path, *p)
+
+ def findseries(self, patch):
+ def matchpatch(l):
+ l = l.split('#', 1)[0]
+ return l.strip() == patch
+ for index, l in enumerate(self.fullseries):
+ if matchpatch(l):
+ return index
+ return None
+
+ guard_re = re.compile(r'\s?#([-+][^-+# \t\r\n\f][^# \t\r\n\f]*)')
+
+ def parseseries(self):
+ self.series = []
+ self.seriesguards = []
+ for l in self.fullseries:
+ h = l.find('#')
+ if h == -1:
+ patch = l
+ comment = ''
+ elif h == 0:
+ continue
+ else:
+ patch = l[:h]
+ comment = l[h:]
+ patch = patch.strip()
+ if patch:
+ if patch in self.series:
+ raise util.Abort(_('%s appears more than once in %s') %
+ (patch, self.join(self.seriespath)))
+ self.series.append(patch)
+ self.seriesguards.append(self.guard_re.findall(comment))
+
+ def checkguard(self, guard):
+ if not guard:
+ return _('guard cannot be an empty string')
+ bad_chars = '# \t\r\n\f'
+ first = guard[0]
+ if first in '-+':
+ return (_('guard %r starts with invalid character: %r') %
+ (guard, first))
+ for c in bad_chars:
+ if c in guard:
+ return _('invalid character in guard %r: %r') % (guard, c)
+
+ def setactive(self, guards):
+ for guard in guards:
+ bad = self.checkguard(guard)
+ if bad:
+ raise util.Abort(bad)
+ guards = sorted(set(guards))
+ self.ui.debug('active guards: %s\n' % ' '.join(guards))
+ self.activeguards = guards
+ self.guardsdirty = True
+
+ def active(self):
+ if self.activeguards is None:
+ self.activeguards = []
+ try:
+ guards = self.opener.read(self.guardspath).split()
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ guards = []
+ for i, guard in enumerate(guards):
+ bad = self.checkguard(guard)
+ if bad:
+ self.ui.warn('%s:%d: %s\n' %
+ (self.join(self.guardspath), i + 1, bad))
+ else:
+ self.activeguards.append(guard)
+ return self.activeguards
+
+ def setguards(self, idx, guards):
+ for g in guards:
+ if len(g) < 2:
+ raise util.Abort(_('guard %r too short') % g)
+ if g[0] not in '-+':
+ raise util.Abort(_('guard %r starts with invalid char') % g)
+ bad = self.checkguard(g[1:])
+ if bad:
+ raise util.Abort(bad)
+ drop = self.guard_re.sub('', self.fullseries[idx])
+ self.fullseries[idx] = drop + ''.join([' #' + g for g in guards])
+ self.parseseries()
+ self.seriesdirty = True
+
+ def pushable(self, idx):
+ if isinstance(idx, str):
+ idx = self.series.index(idx)
+ patchguards = self.seriesguards[idx]
+ if not patchguards:
+ return True, None
+ guards = self.active()
+ exactneg = [g for g in patchguards if g[0] == '-' and g[1:] in guards]
+ if exactneg:
+ return False, repr(exactneg[0])
+ pos = [g for g in patchguards if g[0] == '+']
+ exactpos = [g for g in pos if g[1:] in guards]
+ if pos:
+ if exactpos:
+ return True, repr(exactpos[0])
+ return False, ' '.join(map(repr, pos))
+ return True, ''
+
+ def explainpushable(self, idx, all_patches=False):
+ write = all_patches and self.ui.write or self.ui.warn
+ if all_patches or self.ui.verbose:
+ if isinstance(idx, str):
+ idx = self.series.index(idx)
+ pushable, why = self.pushable(idx)
+ if all_patches and pushable:
+ if why is None:
+ write(_('allowing %s - no guards in effect\n') %
+ self.series[idx])
+ else:
+ if not why:
+ write(_('allowing %s - no matching negative guards\n') %
+ self.series[idx])
+ else:
+ write(_('allowing %s - guarded by %s\n') %
+ (self.series[idx], why))
+ if not pushable:
+ if why:
+ write(_('skipping %s - guarded by %s\n') %
+ (self.series[idx], why))
+ else:
+ write(_('skipping %s - no matching guards\n') %
+ self.series[idx])
+
+ def savedirty(self):
+ def writelist(items, path):
+ fp = self.opener(path, 'w')
+ for i in items:
+ fp.write("%s\n" % i)
+ fp.close()
+ if self.applieddirty:
+ writelist(map(str, self.applied), self.statuspath)
+ self.applieddirty = False
+ if self.seriesdirty:
+ writelist(self.fullseries, self.seriespath)
+ self.seriesdirty = False
+ if self.guardsdirty:
+ writelist(self.activeguards, self.guardspath)
+ self.guardsdirty = False
+ if self.added:
+ qrepo = self.qrepo()
+ if qrepo:
+ qrepo[None].add(f for f in self.added if f not in qrepo[None])
+ self.added = []
+
+ def removeundo(self, repo):
+ undo = repo.sjoin('undo')
+ if not os.path.exists(undo):
+ return
+ try:
+ os.unlink(undo)
+ except OSError, inst:
+ self.ui.warn(_('error removing undo: %s\n') % str(inst))
+
+ def backup(self, repo, files, copy=False):
+ # backup local changes in --force case
+ for f in sorted(files):
+ absf = repo.wjoin(f)
+ if os.path.lexists(absf):
+ self.ui.note(_('saving current version of %s as %s\n') %
+ (f, f + '.orig'))
+ if copy:
+ util.copyfile(absf, absf + '.orig')
+ else:
+ util.rename(absf, absf + '.orig')
+
+ def printdiff(self, repo, diffopts, node1, node2=None, files=None,
+ fp=None, changes=None, opts={}):
+ stat = opts.get('stat')
+ m = scmutil.match(repo[node1], files, opts)
+ cmdutil.diffordiffstat(self.ui, repo, diffopts, node1, node2, m,
+ changes, stat, fp)
+
+ def mergeone(self, repo, mergeq, head, patch, rev, diffopts):
+ # first try just applying the patch
+ (err, n) = self.apply(repo, [patch], update_status=False,
+ strict=True, merge=rev)
+
+ if err == 0:
+ return (err, n)
+
+ if n is None:
+ raise util.Abort(_("apply failed for patch %s") % patch)
+
+ self.ui.warn(_("patch didn't work out, merging %s\n") % patch)
+
+ # apply failed, strip away that rev and merge.
+ hg.clean(repo, head)
+ self.strip(repo, [n], update=False, backup='strip')
+
+ ctx = repo[rev]
+ ret = hg.merge(repo, rev)
+ if ret:
+ raise util.Abort(_("update returned %d") % ret)
+ n = newcommit(repo, None, ctx.description(), ctx.user(), force=True)
+ if n is None:
+ raise util.Abort(_("repo commit failed"))
+ try:
+ ph = patchheader(mergeq.join(patch), self.plainmode)
+ except Exception:
+ raise util.Abort(_("unable to read %s") % patch)
+
+ diffopts = self.patchopts(diffopts, patch)
+ patchf = self.opener(patch, "w")
+ comments = str(ph)
+ if comments:
+ patchf.write(comments)
+ self.printdiff(repo, diffopts, head, n, fp=patchf)
+ patchf.close()
+ self.removeundo(repo)
+ return (0, n)
+
+ def qparents(self, repo, rev=None):
+ if rev is None:
+ (p1, p2) = repo.dirstate.parents()
+ if p2 == nullid:
+ return p1
+ if not self.applied:
+ return None
+ return self.applied[-1].node
+ p1, p2 = repo.changelog.parents(rev)
+ if p2 != nullid and p2 in [x.node for x in self.applied]:
+ return p2
+ return p1
+
+ def mergepatch(self, repo, mergeq, series, diffopts):
+ if not self.applied:
+ # each of the patches merged in will have two parents. This
+ # can confuse the qrefresh, qdiff, and strip code because it
+ # needs to know which parent is actually in the patch queue.
+ # so, we insert a merge marker with only one parent. This way
+ # the first patch in the queue is never a merge patch
+ #
+ pname = ".hg.patches.merge.marker"
+ n = newcommit(repo, None, '[mq]: merge marker', force=True)
+ self.removeundo(repo)
+ self.applied.append(statusentry(n, pname))
+ self.applieddirty = True
+
+ head = self.qparents(repo)
+
+ for patch in series:
+ patch = mergeq.lookup(patch, strict=True)
+ if not patch:
+ self.ui.warn(_("patch %s does not exist\n") % patch)
+ return (1, None)
+ pushable, reason = self.pushable(patch)
+ if not pushable:
+ self.explainpushable(patch, all_patches=True)
+ continue
+ info = mergeq.isapplied(patch)
+ if not info:
+ self.ui.warn(_("patch %s is not applied\n") % patch)
+ return (1, None)
+ rev = info[1]
+ err, head = self.mergeone(repo, mergeq, head, patch, rev, diffopts)
+ if head:
+ self.applied.append(statusentry(head, patch))
+ self.applieddirty = True
+ if err:
+ return (err, head)
+ self.savedirty()
+ return (0, head)
+
+ def patch(self, repo, patchfile):
+ '''Apply patchfile to the working directory.
+ patchfile: name of patch file'''
+ files = set()
+ try:
+ fuzz = patchmod.patch(self.ui, repo, patchfile, strip=1,
+ files=files, eolmode=None)
+ return (True, list(files), fuzz)
+ except Exception, inst:
+ self.ui.note(str(inst) + '\n')
+ if not self.ui.verbose:
+ self.ui.warn(_("patch failed, unable to continue (try -v)\n"))
+ self.ui.traceback()
+ return (False, list(files), False)
+
+ def apply(self, repo, series, list=False, update_status=True,
+ strict=False, patchdir=None, merge=None, all_files=None,
+ tobackup=None, keepchanges=False):
+ wlock = lock = tr = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ tr = repo.transaction("qpush")
+ try:
+ ret = self._apply(repo, series, list, update_status,
+ strict, patchdir, merge, all_files=all_files,
+ tobackup=tobackup, keepchanges=keepchanges)
+ tr.close()
+ self.savedirty()
+ return ret
+ except AbortNoCleanup:
+ tr.close()
+ self.savedirty()
+ return 2, repo.dirstate.p1()
+ except: # re-raises
+ try:
+ tr.abort()
+ finally:
+ repo.invalidate()
+ repo.dirstate.invalidate()
+ self.invalidate()
+ raise
+ finally:
+ release(tr, lock, wlock)
+ self.removeundo(repo)
+
+ def _apply(self, repo, series, list=False, update_status=True,
+ strict=False, patchdir=None, merge=None, all_files=None,
+ tobackup=None, keepchanges=False):
+ """returns (error, hash)
+
+ error = 1 for unable to read, 2 for patch failed, 3 for patch
+ fuzz. tobackup is None or a set of files to backup before they
+ are modified by a patch.
+ """
+ # TODO unify with commands.py
+ if not patchdir:
+ patchdir = self.path
+ err = 0
+ n = None
+ for patchname in series:
+ pushable, reason = self.pushable(patchname)
+ if not pushable:
+ self.explainpushable(patchname, all_patches=True)
+ continue
+ self.ui.status(_("applying %s\n") % patchname)
+ pf = os.path.join(patchdir, patchname)
+
+ try:
+ ph = patchheader(self.join(patchname), self.plainmode)
+ except IOError:
+ self.ui.warn(_("unable to read %s\n") % patchname)
+ err = 1
+ break
+
+ message = ph.message
+ if not message:
+ # The commit message should not be translated
+ message = "imported patch %s\n" % patchname
+ else:
+ if list:
+ # The commit message should not be translated
+ message.append("\nimported patch %s" % patchname)
+ message = '\n'.join(message)
+
+ if ph.haspatch:
+ if tobackup:
+ touched = patchmod.changedfiles(self.ui, repo, pf)
+ touched = set(touched) & tobackup
+ if touched and keepchanges:
+ raise AbortNoCleanup(
+ _("local changes found, refresh first"))
+ self.backup(repo, touched, copy=True)
+ tobackup = tobackup - touched
+ (patcherr, files, fuzz) = self.patch(repo, pf)
+ if all_files is not None:
+ all_files.update(files)
+ patcherr = not patcherr
+ else:
+ self.ui.warn(_("patch %s is empty\n") % patchname)
+ patcherr, files, fuzz = 0, [], 0
+
+ if merge and files:
+ # Mark as removed/merged and update dirstate parent info
+ removed = []
+ merged = []
+ for f in files:
+ if os.path.lexists(repo.wjoin(f)):
+ merged.append(f)
+ else:
+ removed.append(f)
+ for f in removed:
+ repo.dirstate.remove(f)
+ for f in merged:
+ repo.dirstate.merge(f)
+ p1, p2 = repo.dirstate.parents()
+ repo.setparents(p1, merge)
+
+ match = scmutil.matchfiles(repo, files or [])
+ oldtip = repo['tip']
+ n = newcommit(repo, None, message, ph.user, ph.date, match=match,
+ force=True)
+ if repo['tip'] == oldtip:
+ raise util.Abort(_("qpush exactly duplicates child changeset"))
+ if n is None:
+ raise util.Abort(_("repository commit failed"))
+
+ if update_status:
+ self.applied.append(statusentry(n, patchname))
+
+ if patcherr:
+ self.ui.warn(_("patch failed, rejects left in working dir\n"))
+ err = 2
+ break
+
+ if fuzz and strict:
+ self.ui.warn(_("fuzz found when applying patch, stopping\n"))
+ err = 3
+ break
+ return (err, n)
+
+ def _cleanup(self, patches, numrevs, keep=False):
+ if not keep:
+ r = self.qrepo()
+ if r:
+ r[None].forget(patches)
+ for p in patches:
+ os.unlink(self.join(p))
+
+ qfinished = []
+ if numrevs:
+ qfinished = self.applied[:numrevs]
+ del self.applied[:numrevs]
+ self.applieddirty = True
+
+ unknown = []
+
+ for (i, p) in sorted([(self.findseries(p), p) for p in patches],
+ reverse=True):
+ if i is not None:
+ del self.fullseries[i]
+ else:
+ unknown.append(p)
+
+ if unknown:
+ if numrevs:
+ rev = dict((entry.name, entry.node) for entry in qfinished)
+ for p in unknown:
+ msg = _('revision %s refers to unknown patches: %s\n')
+ self.ui.warn(msg % (short(rev[p]), p))
+ else:
+ msg = _('unknown patches: %s\n')
+ raise util.Abort(''.join(msg % p for p in unknown))
+
+ self.parseseries()
+ self.seriesdirty = True
+ return [entry.node for entry in qfinished]
+
+ def _revpatches(self, repo, revs):
+ firstrev = repo[self.applied[0].node].rev()
+ patches = []
+ for i, rev in enumerate(revs):
+
+ if rev < firstrev:
+ raise util.Abort(_('revision %d is not managed') % rev)
+
+ ctx = repo[rev]
+ base = self.applied[i].node
+ if ctx.node() != base:
+ msg = _('cannot delete revision %d above applied patches')
+ raise util.Abort(msg % rev)
+
+ patch = self.applied[i].name
+ for fmt in ('[mq]: %s', 'imported patch %s'):
+ if ctx.description() == fmt % patch:
+ msg = _('patch %s finalized without changeset message\n')
+ repo.ui.status(msg % patch)
+ break
+
+ patches.append(patch)
+ return patches
+
+ def finish(self, repo, revs):
+ # Manually trigger phase computation to ensure phasedefaults is
+ # executed before we remove the patches.
+ repo._phasecache
+ patches = self._revpatches(repo, sorted(revs))
+ qfinished = self._cleanup(patches, len(patches))
+ if qfinished and repo.ui.configbool('mq', 'secret', False):
+ # only use this logic when the secret option is added
+ oldqbase = repo[qfinished[0]]
+ tphase = repo.ui.config('phases', 'new-commit', phases.draft)
+ if oldqbase.phase() > tphase and oldqbase.p1().phase() <= tphase:
+ phases.advanceboundary(repo, tphase, qfinished)
+
+ def delete(self, repo, patches, opts):
+ if not patches and not opts.get('rev'):
+ raise util.Abort(_('qdelete requires at least one revision or '
+ 'patch name'))
+
+ realpatches = []
+ for patch in patches:
+ patch = self.lookup(patch, strict=True)
+ info = self.isapplied(patch)
+ if info:
+ raise util.Abort(_("cannot delete applied patch %s") % patch)
+ if patch not in self.series:
+ raise util.Abort(_("patch %s not in series file") % patch)
+ if patch not in realpatches:
+ realpatches.append(patch)
+
+ numrevs = 0
+ if opts.get('rev'):
+ if not self.applied:
+ raise util.Abort(_('no patches applied'))
+ revs = scmutil.revrange(repo, opts.get('rev'))
+ if len(revs) > 1 and revs[0] > revs[1]:
+ revs.reverse()
+ revpatches = self._revpatches(repo, revs)
+ realpatches += revpatches
+ numrevs = len(revpatches)
+
+ self._cleanup(realpatches, numrevs, opts.get('keep'))
+
+ def checktoppatch(self, repo):
+ if self.applied:
+ top = self.applied[-1].node
+ patch = self.applied[-1].name
+ pp = repo.dirstate.parents()
+ if top not in pp:
+ raise util.Abort(_("working directory revision is not qtip"))
+ return top, patch
+ return None, None
+
+ def checksubstate(self, repo, baserev=None):
+ '''return list of subrepos at a different revision than substate.
+ Abort if any subrepos have uncommitted changes.'''
+ inclsubs = []
+ wctx = repo[None]
+ if baserev:
+ bctx = repo[baserev]
+ else:
+ bctx = wctx.parents()[0]
+ for s in wctx.substate:
+ if wctx.sub(s).dirty(True):
+ raise util.Abort(
+ _("uncommitted changes in subrepository %s") % s)
+ elif s not in bctx.substate or bctx.sub(s).dirty():
+ inclsubs.append(s)
+ return inclsubs
+
+ def putsubstate2changes(self, substatestate, changes):
+ for files in changes[:3]:
+ if '.hgsubstate' in files:
+ return # already listed up
+ # not yet listed up
+ if substatestate in 'a?':
+ changes[1].append('.hgsubstate')
+ elif substatestate in 'r':
+ changes[2].append('.hgsubstate')
+ else: # modified
+ changes[0].append('.hgsubstate')
+
+ def localchangesfound(self, refresh=True):
+ if refresh:
+ raise util.Abort(_("local changes found, refresh first"))
+ else:
+ raise util.Abort(_("local changes found"))
+
+ def checklocalchanges(self, repo, force=False, refresh=True):
+ m, a, r, d = repo.status()[:4]
+ if (m or a or r or d) and not force:
+ self.localchangesfound(refresh)
+ return m, a, r, d
+
+ _reserved = ('series', 'status', 'guards', '.', '..')
+ def checkreservedname(self, name):
+ if name in self._reserved:
+ raise util.Abort(_('"%s" cannot be used as the name of a patch')
+ % name)
+ for prefix in ('.hg', '.mq'):
+ if name.startswith(prefix):
+ raise util.Abort(_('patch name cannot begin with "%s"')
+ % prefix)
+ for c in ('#', ':'):
+ if c in name:
+ raise util.Abort(_('"%s" cannot be used in the name of a patch')
+ % c)
+
+ def checkpatchname(self, name, force=False):
+ self.checkreservedname(name)
+ if not force and os.path.exists(self.join(name)):
+ if os.path.isdir(self.join(name)):
+ raise util.Abort(_('"%s" already exists as a directory')
+ % name)
+ else:
+ raise util.Abort(_('patch "%s" already exists') % name)
+
+ def checkkeepchanges(self, keepchanges, force):
+ if force and keepchanges:
+ raise util.Abort(_('cannot use both --force and --keep-changes'))
+
+ def new(self, repo, patchfn, *pats, **opts):
+ """options:
+ msg: a string or a no-argument function returning a string
+ """
+ msg = opts.get('msg')
+ user = opts.get('user')
+ date = opts.get('date')
+ if date:
+ date = util.parsedate(date)
+ diffopts = self.diffopts({'git': opts.get('git')})
+ if opts.get('checkname', True):
+ self.checkpatchname(patchfn)
+ inclsubs = self.checksubstate(repo)
+ if inclsubs:
+ inclsubs.append('.hgsubstate')
+ substatestate = repo.dirstate['.hgsubstate']
+ if opts.get('include') or opts.get('exclude') or pats:
+ if inclsubs:
+ pats = list(pats or []) + inclsubs
+ match = scmutil.match(repo[None], pats, opts)
+ # detect missing files in pats
+ def badfn(f, msg):
+ if f != '.hgsubstate': # .hgsubstate is auto-created
+ raise util.Abort('%s: %s' % (f, msg))
+ match.bad = badfn
+ changes = repo.status(match=match)
+ m, a, r, d = changes[:4]
+ else:
+ changes = self.checklocalchanges(repo, force=True)
+ m, a, r, d = changes
+ match = scmutil.matchfiles(repo, m + a + r + inclsubs)
+ if len(repo[None].parents()) > 1:
+ raise util.Abort(_('cannot manage merge changesets'))
+ commitfiles = m + a + r
+ self.checktoppatch(repo)
+ insert = self.fullseriesend()
+ wlock = repo.wlock()
+ try:
+ try:
+ # if patch file write fails, abort early
+ p = self.opener(patchfn, "w")
+ except IOError, e:
+ raise util.Abort(_('cannot write patch "%s": %s')
+ % (patchfn, e.strerror))
+ try:
+ if self.plainmode:
+ if user:
+ p.write("From: " + user + "\n")
+ if not date:
+ p.write("\n")
+ if date:
+ p.write("Date: %d %d\n\n" % date)
+ else:
+ p.write("# HG changeset patch\n")
+ p.write("# Parent "
+ + hex(repo[None].p1().node()) + "\n")
+ if user:
+ p.write("# User " + user + "\n")
+ if date:
+ p.write("# Date %s %s\n\n" % date)
+ if util.safehasattr(msg, '__call__'):
+ msg = msg()
+ commitmsg = msg and msg or ("[mq]: %s" % patchfn)
+ n = newcommit(repo, None, commitmsg, user, date, match=match,
+ force=True)
+ if n is None:
+ raise util.Abort(_("repo commit failed"))
+ try:
+ self.fullseries[insert:insert] = [patchfn]
+ self.applied.append(statusentry(n, patchfn))
+ self.parseseries()
+ self.seriesdirty = True
+ self.applieddirty = True
+ if msg:
+ msg = msg + "\n\n"
+ p.write(msg)
+ if commitfiles:
+ parent = self.qparents(repo, n)
+ if inclsubs:
+ self.putsubstate2changes(substatestate, changes)
+ chunks = patchmod.diff(repo, node1=parent, node2=n,
+ changes=changes, opts=diffopts)
+ for chunk in chunks:
+ p.write(chunk)
+ p.close()
+ r = self.qrepo()
+ if r:
+ r[None].add([patchfn])
+ except: # re-raises
+ repo.rollback()
+ raise
+ except Exception:
+ patchpath = self.join(patchfn)
+ try:
+ os.unlink(patchpath)
+ except OSError:
+ self.ui.warn(_('error unlinking %s\n') % patchpath)
+ raise
+ self.removeundo(repo)
+ finally:
+ release(wlock)
+
+ def strip(self, repo, revs, update=True, backup="all", force=None):
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+
+ if update:
+ self.checklocalchanges(repo, force=force, refresh=False)
+ urev = self.qparents(repo, revs[0])
+ hg.clean(repo, urev)
+ repo.dirstate.write()
+
+ repair.strip(self.ui, repo, revs, backup)
+ finally:
+ release(lock, wlock)
+
+ def isapplied(self, patch):
+ """returns (index, rev, patch)"""
+ for i, a in enumerate(self.applied):
+ if a.name == patch:
+ return (i, a.node, a.name)
+ return None
+
+ # if the exact patch name does not exist, we try a few
+ # variations. If strict is passed, we try only #1
+ #
+ # 1) a number (as string) to indicate an offset in the series file
+ # 2) a unique substring of the patch name was given
+ # 3) patchname[-+]num to indicate an offset in the series file
+ def lookup(self, patch, strict=False):
+ def partialname(s):
+ if s in self.series:
+ return s
+ matches = [x for x in self.series if s in x]
+ if len(matches) > 1:
+ self.ui.warn(_('patch name "%s" is ambiguous:\n') % s)
+ for m in matches:
+ self.ui.warn(' %s\n' % m)
+ return None
+ if matches:
+ return matches[0]
+ if self.series and self.applied:
+ if s == 'qtip':
+ return self.series[self.seriesend(True)-1]
+ if s == 'qbase':
+ return self.series[0]
+ return None
+
+ if patch in self.series:
+ return patch
+
+ if not os.path.isfile(self.join(patch)):
+ try:
+ sno = int(patch)
+ except (ValueError, OverflowError):
+ pass
+ else:
+ if -len(self.series) <= sno < len(self.series):
+ return self.series[sno]
+
+ if not strict:
+ res = partialname(patch)
+ if res:
+ return res
+ minus = patch.rfind('-')
+ if minus >= 0:
+ res = partialname(patch[:minus])
+ if res:
+ i = self.series.index(res)
+ try:
+ off = int(patch[minus + 1:] or 1)
+ except (ValueError, OverflowError):
+ pass
+ else:
+ if i - off >= 0:
+ return self.series[i - off]
+ plus = patch.rfind('+')
+ if plus >= 0:
+ res = partialname(patch[:plus])
+ if res:
+ i = self.series.index(res)
+ try:
+ off = int(patch[plus + 1:] or 1)
+ except (ValueError, OverflowError):
+ pass
+ else:
+ if i + off < len(self.series):
+ return self.series[i + off]
+ raise util.Abort(_("patch %s not in series") % patch)
+
+ def push(self, repo, patch=None, force=False, list=False, mergeq=None,
+ all=False, move=False, exact=False, nobackup=False,
+ keepchanges=False):
+ self.checkkeepchanges(keepchanges, force)
+ diffopts = self.diffopts()
+ wlock = repo.wlock()
+ try:
+ heads = []
+ for b, ls in repo.branchmap().iteritems():
+ heads += ls
+ if not heads:
+ heads = [nullid]
+ if repo.dirstate.p1() not in heads and not exact:
+ self.ui.status(_("(working directory not at a head)\n"))
+
+ if not self.series:
+ self.ui.warn(_('no patches in series\n'))
+ return 0
+
+ # Suppose our series file is: A B C and the current 'top'
+ # patch is B. qpush C should be performed (moving forward)
+ # qpush B is a NOP (no change) qpush A is an error (can't
+ # go backwards with qpush)
+ if patch:
+ patch = self.lookup(patch)
+ info = self.isapplied(patch)
+ if info and info[0] >= len(self.applied) - 1:
+ self.ui.warn(
+ _('qpush: %s is already at the top\n') % patch)
+ return 0
+
+ pushable, reason = self.pushable(patch)
+ if pushable:
+ if self.series.index(patch) < self.seriesend():
+ raise util.Abort(
+ _("cannot push to a previous patch: %s") % patch)
+ else:
+ if reason:
+ reason = _('guarded by %s') % reason
+ else:
+ reason = _('no matching guards')
+ self.ui.warn(_("cannot push '%s' - %s\n") % (patch, reason))
+ return 1
+ elif all:
+ patch = self.series[-1]
+ if self.isapplied(patch):
+ self.ui.warn(_('all patches are currently applied\n'))
+ return 0
+
+ # Following the above example, starting at 'top' of B:
+ # qpush should be performed (pushes C), but a subsequent
+ # qpush without an argument is an error (nothing to
+ # apply). This allows a loop of "...while hg qpush..." to
+ # work as it detects an error when done
+ start = self.seriesend()
+ if start == len(self.series):
+ self.ui.warn(_('patch series already fully applied\n'))
+ return 1
+ if not force and not keepchanges:
+ self.checklocalchanges(repo, refresh=self.applied)
+
+ if exact:
+ if keepchanges:
+ raise util.Abort(
+ _("cannot use --exact and --keep-changes together"))
+ if move:
+ raise util.Abort(_('cannot use --exact and --move '
+ 'together'))
+ if self.applied:
+ raise util.Abort(_('cannot push --exact with applied '
+ 'patches'))
+ root = self.series[start]
+ target = patchheader(self.join(root), self.plainmode).parent
+ if not target:
+ raise util.Abort(
+ _("%s does not have a parent recorded") % root)
+ if not repo[target] == repo['.']:
+ hg.update(repo, target)
+
+ if move:
+ if not patch:
+ raise util.Abort(_("please specify the patch to move"))
+ for fullstart, rpn in enumerate(self.fullseries):
+ # strip markers for patch guards
+ if self.guard_re.split(rpn, 1)[0] == self.series[start]:
+ break
+ for i, rpn in enumerate(self.fullseries[fullstart:]):
+ # strip markers for patch guards
+ if self.guard_re.split(rpn, 1)[0] == patch:
+ break
+ index = fullstart + i
+ assert index < len(self.fullseries)
+ fullpatch = self.fullseries[index]
+ del self.fullseries[index]
+ self.fullseries.insert(fullstart, fullpatch)
+ self.parseseries()
+ self.seriesdirty = True
+
+ self.applieddirty = True
+ if start > 0:
+ self.checktoppatch(repo)
+ if not patch:
+ patch = self.series[start]
+ end = start + 1
+ else:
+ end = self.series.index(patch, start) + 1
+
+ tobackup = set()
+ if (not nobackup and force) or keepchanges:
+ m, a, r, d = self.checklocalchanges(repo, force=True)
+ if keepchanges:
+ tobackup.update(m + a + r + d)
+ else:
+ tobackup.update(m + a)
+
+ s = self.series[start:end]
+ all_files = set()
+ try:
+ if mergeq:
+ ret = self.mergepatch(repo, mergeq, s, diffopts)
+ else:
+ ret = self.apply(repo, s, list, all_files=all_files,
+ tobackup=tobackup, keepchanges=keepchanges)
+ except: # re-raises
+ self.ui.warn(_('cleaning up working directory...'))
+ node = repo.dirstate.p1()
+ hg.revert(repo, node, None)
+ # only remove unknown files that we know we touched or
+ # created while patching
+ for f in all_files:
+ if f not in repo.dirstate:
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ self.ui.warn(_('done\n'))
+ raise
+
+ if not self.applied:
+ return ret[0]
+ top = self.applied[-1].name
+ if ret[0] and ret[0] > 1:
+ msg = _("errors during apply, please fix and refresh %s\n")
+ self.ui.write(msg % top)
+ else:
+ self.ui.write(_("now at: %s\n") % top)
+ return ret[0]
+
+ finally:
+ wlock.release()
+
+ def pop(self, repo, patch=None, force=False, update=True, all=False,
+ nobackup=False, keepchanges=False):
+ self.checkkeepchanges(keepchanges, force)
+ wlock = repo.wlock()
+ try:
+ if patch:
+ # index, rev, patch
+ info = self.isapplied(patch)
+ if not info:
+ patch = self.lookup(patch)
+ info = self.isapplied(patch)
+ if not info:
+ raise util.Abort(_("patch %s is not applied") % patch)
+
+ if not self.applied:
+ # Allow qpop -a to work repeatedly,
+ # but not qpop without an argument
+ self.ui.warn(_("no patches applied\n"))
+ return not all
+
+ if all:
+ start = 0
+ elif patch:
+ start = info[0] + 1
+ else:
+ start = len(self.applied) - 1
+
+ if start >= len(self.applied):
+ self.ui.warn(_("qpop: %s is already at the top\n") % patch)
+ return
+
+ if not update:
+ parents = repo.dirstate.parents()
+ rr = [x.node for x in self.applied]
+ for p in parents:
+ if p in rr:
+ self.ui.warn(_("qpop: forcing dirstate update\n"))
+ update = True
+ else:
+ parents = [p.node() for p in repo[None].parents()]
+ needupdate = False
+ for entry in self.applied[start:]:
+ if entry.node in parents:
+ needupdate = True
+ break
+ update = needupdate
+
+ tobackup = set()
+ if update:
+ m, a, r, d = self.checklocalchanges(
+ repo, force=force or keepchanges)
+ if force:
+ if not nobackup:
+ tobackup.update(m + a)
+ elif keepchanges:
+ tobackup.update(m + a + r + d)
+
+ self.applieddirty = True
+ end = len(self.applied)
+ rev = self.applied[start].node
+ if update:
+ top = self.checktoppatch(repo)[0]
+
+ try:
+ heads = repo.changelog.heads(rev)
+ except error.LookupError:
+ node = short(rev)
+ raise util.Abort(_('trying to pop unknown node %s') % node)
+
+ if heads != [self.applied[-1].node]:
+ raise util.Abort(_("popping would remove a revision not "
+ "managed by this patch queue"))
+ if not repo[self.applied[-1].node].mutable():
+ raise util.Abort(
+ _("popping would remove an immutable revision"),
+ hint=_('see "hg help phases" for details'))
+
+ # we know there are no local changes, so we can make a simplified
+ # form of hg.update.
+ if update:
+ qp = self.qparents(repo, rev)
+ ctx = repo[qp]
+ m, a, r, d = repo.status(qp, top)[:4]
+ if d:
+ raise util.Abort(_("deletions found between repo revs"))
+
+ tobackup = set(a + m + r) & tobackup
+ if keepchanges and tobackup:
+ self.localchangesfound()
+ self.backup(repo, tobackup)
+
+ for f in a:
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ repo.dirstate.drop(f)
+ for f in m + r:
+ fctx = ctx[f]
+ repo.wwrite(f, fctx.data(), fctx.flags())
+ repo.dirstate.normal(f)
+ repo.setparents(qp, nullid)
+ for patch in reversed(self.applied[start:end]):
+ self.ui.status(_("popping %s\n") % patch.name)
+ del self.applied[start:end]
+ self.strip(repo, [rev], update=False, backup='strip')
+ if self.applied:
+ self.ui.write(_("now at: %s\n") % self.applied[-1].name)
+ else:
+ self.ui.write(_("patch queue now empty\n"))
+ finally:
+ wlock.release()
+
+ def diff(self, repo, pats, opts):
+ top, patch = self.checktoppatch(repo)
+ if not top:
+ self.ui.write(_("no patches applied\n"))
+ return
+ qp = self.qparents(repo, top)
+ if opts.get('reverse'):
+ node1, node2 = None, qp
+ else:
+ node1, node2 = qp, None
+ diffopts = self.diffopts(opts, patch)
+ self.printdiff(repo, diffopts, node1, node2, files=pats, opts=opts)
+
+ def refresh(self, repo, pats=None, **opts):
+ if not self.applied:
+ self.ui.write(_("no patches applied\n"))
+ return 1
+ msg = opts.get('msg', '').rstrip()
+ newuser = opts.get('user')
+ newdate = opts.get('date')
+ if newdate:
+ newdate = '%d %d' % util.parsedate(newdate)
+ wlock = repo.wlock()
+
+ try:
+ self.checktoppatch(repo)
+ (top, patchfn) = (self.applied[-1].node, self.applied[-1].name)
+ if repo.changelog.heads(top) != [top]:
+ raise util.Abort(_("cannot refresh a revision with children"))
+ if not repo[top].mutable():
+ raise util.Abort(_("cannot refresh immutable revision"),
+ hint=_('see "hg help phases" for details'))
+
+ cparents = repo.changelog.parents(top)
+ patchparent = self.qparents(repo, top)
+
+ inclsubs = self.checksubstate(repo, hex(patchparent))
+ if inclsubs:
+ inclsubs.append('.hgsubstate')
+ substatestate = repo.dirstate['.hgsubstate']
+
+ ph = patchheader(self.join(patchfn), self.plainmode)
+ diffopts = self.diffopts({'git': opts.get('git')}, patchfn)
+ if msg:
+ ph.setmessage(msg)
+ if newuser:
+ ph.setuser(newuser)
+ if newdate:
+ ph.setdate(newdate)
+ ph.setparent(hex(patchparent))
+
+ # only commit new patch when write is complete
+ patchf = self.opener(patchfn, 'w', atomictemp=True)
+
+ comments = str(ph)
+ if comments:
+ patchf.write(comments)
+
+ # update the dirstate in place, strip off the qtip commit
+ # and then commit.
+ #
+ # this should really read:
+ # mm, dd, aa = repo.status(top, patchparent)[:3]
+ # but we do it backwards to take advantage of manifest/chlog
+ # caching against the next repo.status call
+ mm, aa, dd = repo.status(patchparent, top)[:3]
+ changes = repo.changelog.read(top)
+ man = repo.manifest.read(changes[0])
+ aaa = aa[:]
+ matchfn = scmutil.match(repo[None], pats, opts)
+ # in short mode, we only diff the files included in the
+ # patch already plus specified files
+ if opts.get('short'):
+ # if amending a patch, we start with existing
+ # files plus specified files - unfiltered
+ match = scmutil.matchfiles(repo, mm + aa + dd + matchfn.files())
+ # filter with inc/exl options
+ matchfn = scmutil.match(repo[None], opts=opts)
+ else:
+ match = scmutil.matchall(repo)
+ m, a, r, d = repo.status(match=match)[:4]
+ mm = set(mm)
+ aa = set(aa)
+ dd = set(dd)
+
+ # we might end up with files that were added between
+ # qtip and the dirstate parent, but then changed in the
+ # local dirstate. in this case, we want them to only
+ # show up in the added section
+ for x in m:
+ if x not in aa:
+ mm.add(x)
+ # we might end up with files added by the local dirstate that
+ # were deleted by the patch. In this case, they should only
+ # show up in the changed section.
+ for x in a:
+ if x in dd:
+ dd.remove(x)
+ mm.add(x)
+ else:
+ aa.add(x)
+ # make sure any files deleted in the local dirstate
+ # are not in the add or change column of the patch
+ forget = []
+ for x in d + r:
+ if x in aa:
+ aa.remove(x)
+ forget.append(x)
+ continue
+ else:
+ mm.discard(x)
+ dd.add(x)
+
+ m = list(mm)
+ r = list(dd)
+ a = list(aa)
+ c = [filter(matchfn, l) for l in (m, a, r)]
+ match = scmutil.matchfiles(repo, set(c[0] + c[1] + c[2] + inclsubs))
+
+ try:
+ if diffopts.git or diffopts.upgrade:
+ copies = {}
+ for dst in a:
+ src = repo.dirstate.copied(dst)
+ # during qfold, the source file for copies may
+ # be removed. Treat this as a simple add.
+ if src is not None and src in repo.dirstate:
+ copies.setdefault(src, []).append(dst)
+ repo.dirstate.add(dst)
+ # remember the copies between patchparent and qtip
+ for dst in aaa:
+ f = repo.file(dst)
+ src = f.renamed(man[dst])
+ if src:
+ copies.setdefault(src[0], []).extend(
+ copies.get(dst, []))
+ if dst in a:
+ copies[src[0]].append(dst)
+ # we can't copy a file created by the patch itself
+ if dst in copies:
+ del copies[dst]
+ for src, dsts in copies.iteritems():
+ for dst in dsts:
+ repo.dirstate.copy(src, dst)
+ else:
+ for dst in a:
+ repo.dirstate.add(dst)
+ # Drop useless copy information
+ for f in list(repo.dirstate.copies()):
+ repo.dirstate.copy(None, f)
+ for f in r:
+ repo.dirstate.remove(f)
+ # if the patch excludes a modified file, mark that
+ # file with mtime=0 so status can see it.
+ mm = []
+ for i in xrange(len(m)-1, -1, -1):
+ if not matchfn(m[i]):
+ mm.append(m[i])
+ del m[i]
+ for f in m:
+ repo.dirstate.normal(f)
+ for f in mm:
+ repo.dirstate.normallookup(f)
+ for f in forget:
+ repo.dirstate.drop(f)
+
+ if not msg:
+ if not ph.message:
+ message = "[mq]: %s\n" % patchfn
+ else:
+ message = "\n".join(ph.message)
+ else:
+ message = msg
+
+ user = ph.user or changes[1]
+
+ oldphase = repo[top].phase()
+
+ # assumes strip can roll itself back if interrupted
+ repo.setparents(*cparents)
+ self.applied.pop()
+ self.applieddirty = True
+ self.strip(repo, [top], update=False,
+ backup='strip')
+ except: # re-raises
+ repo.dirstate.invalidate()
+ raise
+
+ try:
+ # might be nice to attempt to roll back strip after this
+
+ # Ensure we create a new changeset in the same phase than
+ # the old one.
+ n = newcommit(repo, oldphase, message, user, ph.date,
+ match=match, force=True)
+ # only write patch after a successful commit
+ if inclsubs:
+ self.putsubstate2changes(substatestate, c)
+ chunks = patchmod.diff(repo, patchparent,
+ changes=c, opts=diffopts)
+ for chunk in chunks:
+ patchf.write(chunk)
+ patchf.close()
+ self.applied.append(statusentry(n, patchfn))
+ except: # re-raises
+ ctx = repo[cparents[0]]
+ repo.dirstate.rebuild(ctx.node(), ctx.manifest())
+ self.savedirty()
+ self.ui.warn(_('refresh interrupted while patch was popped! '
+ '(revert --all, qpush to recover)\n'))
+ raise
+ finally:
+ wlock.release()
+ self.removeundo(repo)
+
+ def init(self, repo, create=False):
+ if not create and os.path.isdir(self.path):
+ raise util.Abort(_("patch queue directory already exists"))
+ try:
+ os.mkdir(self.path)
+ except OSError, inst:
+ if inst.errno != errno.EEXIST or not create:
+ raise
+ if create:
+ return self.qrepo(create=True)
+
+ def unapplied(self, repo, patch=None):
+ if patch and patch not in self.series:
+ raise util.Abort(_("patch %s is not in series file") % patch)
+ if not patch:
+ start = self.seriesend()
+ else:
+ start = self.series.index(patch) + 1
+ unapplied = []
+ for i in xrange(start, len(self.series)):
+ pushable, reason = self.pushable(i)
+ if pushable:
+ unapplied.append((i, self.series[i]))
+ self.explainpushable(i)
+ return unapplied
+
+ def qseries(self, repo, missing=None, start=0, length=None, status=None,
+ summary=False):
+ def displayname(pfx, patchname, state):
+ if pfx:
+ self.ui.write(pfx)
+ if summary:
+ ph = patchheader(self.join(patchname), self.plainmode)
+ msg = ph.message and ph.message[0] or ''
+ if self.ui.formatted():
+ width = self.ui.termwidth() - len(pfx) - len(patchname) - 2
+ if width > 0:
+ msg = util.ellipsis(msg, width)
+ else:
+ msg = ''
+ self.ui.write(patchname, label='qseries.' + state)
+ self.ui.write(': ')
+ self.ui.write(msg, label='qseries.message.' + state)
+ else:
+ self.ui.write(patchname, label='qseries.' + state)
+ self.ui.write('\n')
+
+ applied = set([p.name for p in self.applied])
+ if length is None:
+ length = len(self.series) - start
+ if not missing:
+ if self.ui.verbose:
+ idxwidth = len(str(start + length - 1))
+ for i in xrange(start, start + length):
+ patch = self.series[i]
+ if patch in applied:
+ char, state = 'A', 'applied'
+ elif self.pushable(i)[0]:
+ char, state = 'U', 'unapplied'
+ else:
+ char, state = 'G', 'guarded'
+ pfx = ''
+ if self.ui.verbose:
+ pfx = '%*d %s ' % (idxwidth, i, char)
+ elif status and status != char:
+ continue
+ displayname(pfx, patch, state)
+ else:
+ msng_list = []
+ for root, dirs, files in os.walk(self.path):
+ d = root[len(self.path) + 1:]
+ for f in files:
+ fl = os.path.join(d, f)
+ if (fl not in self.series and
+ fl not in (self.statuspath, self.seriespath,
+ self.guardspath)
+ and not fl.startswith('.')):
+ msng_list.append(fl)
+ for x in sorted(msng_list):
+ pfx = self.ui.verbose and ('D ') or ''
+ displayname(pfx, x, 'missing')
+
+ def issaveline(self, l):
+ if l.name == '.hg.patches.save.line':
+ return True
+
+ def qrepo(self, create=False):
+ ui = self.ui.copy()
+ ui.setconfig('paths', 'default', '', overlay=False)
+ ui.setconfig('paths', 'default-push', '', overlay=False)
+ if create or os.path.isdir(self.join(".hg")):
+ return hg.repository(ui, path=self.path, create=create)
+
+ def restore(self, repo, rev, delete=None, qupdate=None):
+ desc = repo[rev].description().strip()
+ lines = desc.splitlines()
+ i = 0
+ datastart = None
+ series = []
+ applied = []
+ qpp = None
+ for i, line in enumerate(lines):
+ if line == 'Patch Data:':
+ datastart = i + 1
+ elif line.startswith('Dirstate:'):
+ l = line.rstrip()
+ l = l[10:].split(' ')
+ qpp = [bin(x) for x in l]
+ elif datastart is not None:
+ l = line.rstrip()
+ n, name = l.split(':', 1)
+ if n:
+ applied.append(statusentry(bin(n), name))
+ else:
+ series.append(l)
+ if datastart is None:
+ self.ui.warn(_("no saved patch data found\n"))
+ return 1
+ self.ui.warn(_("restoring status: %s\n") % lines[0])
+ self.fullseries = series
+ self.applied = applied
+ self.parseseries()
+ self.seriesdirty = True
+ self.applieddirty = True
+ heads = repo.changelog.heads()
+ if delete:
+ if rev not in heads:
+ self.ui.warn(_("save entry has children, leaving it alone\n"))
+ else:
+ self.ui.warn(_("removing save entry %s\n") % short(rev))
+ pp = repo.dirstate.parents()
+ if rev in pp:
+ update = True
+ else:
+ update = False
+ self.strip(repo, [rev], update=update, backup='strip')
+ if qpp:
+ self.ui.warn(_("saved queue repository parents: %s %s\n") %
+ (short(qpp[0]), short(qpp[1])))
+ if qupdate:
+ self.ui.status(_("updating queue directory\n"))
+ r = self.qrepo()
+ if not r:
+ self.ui.warn(_("unable to load queue repository\n"))
+ return 1
+ hg.clean(r, qpp[0])
+
+ def save(self, repo, msg=None):
+ if not self.applied:
+ self.ui.warn(_("save: no patches applied, exiting\n"))
+ return 1
+ if self.issaveline(self.applied[-1]):
+ self.ui.warn(_("status is already saved\n"))
+ return 1
+
+ if not msg:
+ msg = _("hg patches saved state")
+ else:
+ msg = "hg patches: " + msg.rstrip('\r\n')
+ r = self.qrepo()
+ if r:
+ pp = r.dirstate.parents()
+ msg += "\nDirstate: %s %s" % (hex(pp[0]), hex(pp[1]))
+ msg += "\n\nPatch Data:\n"
+ msg += ''.join('%s\n' % x for x in self.applied)
+ msg += ''.join(':%s\n' % x for x in self.fullseries)
+ n = repo.commit(msg, force=True)
+ if not n:
+ self.ui.warn(_("repo commit failed\n"))
+ return 1
+ self.applied.append(statusentry(n, '.hg.patches.save.line'))
+ self.applieddirty = True
+ self.removeundo(repo)
+
+ def fullseriesend(self):
+ if self.applied:
+ p = self.applied[-1].name
+ end = self.findseries(p)
+ if end is None:
+ return len(self.fullseries)
+ return end + 1
+ return 0
+
+ def seriesend(self, all_patches=False):
+ """If all_patches is False, return the index of the next pushable patch
+ in the series, or the series length. If all_patches is True, return the
+ index of the first patch past the last applied one.
+ """
+ end = 0
+ def next(start):
+ if all_patches or start >= len(self.series):
+ return start
+ for i in xrange(start, len(self.series)):
+ p, reason = self.pushable(i)
+ if p:
+ return i
+ self.explainpushable(i)
+ return len(self.series)
+ if self.applied:
+ p = self.applied[-1].name
+ try:
+ end = self.series.index(p)
+ except ValueError:
+ return 0
+ return next(end + 1)
+ return next(end)
+
+ def appliedname(self, index):
+ pname = self.applied[index].name
+ if not self.ui.verbose:
+ p = pname
+ else:
+ p = str(self.series.index(pname)) + " " + pname
+ return p
+
+ def qimport(self, repo, files, patchname=None, rev=None, existing=None,
+ force=None, git=False):
+ def checkseries(patchname):
+ if patchname in self.series:
+ raise util.Abort(_('patch %s is already in the series file')
+ % patchname)
+
+ if rev:
+ if files:
+ raise util.Abort(_('option "-r" not valid when importing '
+ 'files'))
+ rev = scmutil.revrange(repo, rev)
+ rev.sort(reverse=True)
+ elif not files:
+ raise util.Abort(_('no files or revisions specified'))
+ if (len(files) > 1 or len(rev) > 1) and patchname:
+ raise util.Abort(_('option "-n" not valid when importing multiple '
+ 'patches'))
+ imported = []
+ if rev:
+ # If mq patches are applied, we can only import revisions
+ # that form a linear path to qbase.
+ # Otherwise, they should form a linear path to a head.
+ heads = repo.changelog.heads(repo.changelog.node(rev[-1]))
+ if len(heads) > 1:
+ raise util.Abort(_('revision %d is the root of more than one '
+ 'branch') % rev[-1])
+ if self.applied:
+ base = repo.changelog.node(rev[0])
+ if base in [n.node for n in self.applied]:
+ raise util.Abort(_('revision %d is already managed')
+ % rev[0])
+ if heads != [self.applied[-1].node]:
+ raise util.Abort(_('revision %d is not the parent of '
+ 'the queue') % rev[0])
+ base = repo.changelog.rev(self.applied[0].node)
+ lastparent = repo.changelog.parentrevs(base)[0]
+ else:
+ if heads != [repo.changelog.node(rev[0])]:
+ raise util.Abort(_('revision %d has unmanaged children')
+ % rev[0])
+ lastparent = None
+
+ diffopts = self.diffopts({'git': git})
+ for r in rev:
+ if not repo[r].mutable():
+ raise util.Abort(_('revision %d is not mutable') % r,
+ hint=_('see "hg help phases" for details'))
+ p1, p2 = repo.changelog.parentrevs(r)
+ n = repo.changelog.node(r)
+ if p2 != nullrev:
+ raise util.Abort(_('cannot import merge revision %d') % r)
+ if lastparent and lastparent != r:
+ raise util.Abort(_('revision %d is not the parent of %d')
+ % (r, lastparent))
+ lastparent = p1
+
+ if not patchname:
+ patchname = normname('%d.diff' % r)
+ checkseries(patchname)
+ self.checkpatchname(patchname, force)
+ self.fullseries.insert(0, patchname)
+
+ patchf = self.opener(patchname, "w")
+ cmdutil.export(repo, [n], fp=patchf, opts=diffopts)
+ patchf.close()
+
+ se = statusentry(n, patchname)
+ self.applied.insert(0, se)
+
+ self.added.append(patchname)
+ imported.append(patchname)
+ patchname = None
+ if rev and repo.ui.configbool('mq', 'secret', False):
+ # if we added anything with --rev, we must move the secret root
+ phases.retractboundary(repo, phases.secret, [n])
+ self.parseseries()
+ self.applieddirty = True
+ self.seriesdirty = True
+
+ for i, filename in enumerate(files):
+ if existing:
+ if filename == '-':
+ raise util.Abort(_('-e is incompatible with import from -'))
+ filename = normname(filename)
+ self.checkreservedname(filename)
+ originpath = self.join(filename)
+ if not os.path.isfile(originpath):
+ raise util.Abort(_("patch %s does not exist") % filename)
+
+ if patchname:
+ self.checkpatchname(patchname, force)
+
+ self.ui.write(_('renaming %s to %s\n')
+ % (filename, patchname))
+ util.rename(originpath, self.join(patchname))
+ else:
+ patchname = filename
+
+ else:
+ if filename == '-' and not patchname:
+ raise util.Abort(_('need --name to import a patch from -'))
+ elif not patchname:
+ patchname = normname(os.path.basename(filename.rstrip('/')))
+ self.checkpatchname(patchname, force)
+ try:
+ if filename == '-':
+ text = self.ui.fin.read()
+ else:
+ fp = url.open(self.ui, filename)
+ text = fp.read()
+ fp.close()
+ except (OSError, IOError):
+ raise util.Abort(_("unable to read file %s") % filename)
+ patchf = self.opener(patchname, "w")
+ patchf.write(text)
+ patchf.close()
+ if not force:
+ checkseries(patchname)
+ if patchname not in self.series:
+ index = self.fullseriesend() + i
+ self.fullseries[index:index] = [patchname]
+ self.parseseries()
+ self.seriesdirty = True
+ self.ui.warn(_("adding %s to series file\n") % patchname)
+ self.added.append(patchname)
+ imported.append(patchname)
+ patchname = None
+
+ self.removeundo(repo)
+ return imported
+
+def fixkeepchangesopts(ui, opts):
+ if (not ui.configbool('mq', 'keepchanges') or opts.get('force')
+ or opts.get('exact')):
+ return opts
+ opts = dict(opts)
+ opts['keep_changes'] = True
+ return opts
+
+@command("qdelete|qremove|qrm",
+ [('k', 'keep', None, _('keep patch file')),
+ ('r', 'rev', [],
+ _('stop managing a revision (DEPRECATED)'), _('REV'))],
+ _('hg qdelete [-k] [PATCH]...'))
+def delete(ui, repo, *patches, **opts):
+ """remove patches from queue
+
+ The patches must not be applied, and at least one patch is required. Exact
+ patch identifiers must be given. With -k/--keep, the patch files are
+ preserved in the patch directory.
+
+ To stop managing a patch and move it into permanent history,
+ use the :hg:`qfinish` command."""
+ q = repo.mq
+ q.delete(repo, patches, opts)
+ q.savedirty()
+ return 0
+
+@command("qapplied",
+ [('1', 'last', None, _('show only the preceding applied patch'))
+ ] + seriesopts,
+ _('hg qapplied [-1] [-s] [PATCH]'))
+def applied(ui, repo, patch=None, **opts):
+ """print the patches already applied
+
+ Returns 0 on success."""
+
+ q = repo.mq
+
+ if patch:
+ if patch not in q.series:
+ raise util.Abort(_("patch %s is not in series file") % patch)
+ end = q.series.index(patch) + 1
+ else:
+ end = q.seriesend(True)
+
+ if opts.get('last') and not end:
+ ui.write(_("no patches applied\n"))
+ return 1
+ elif opts.get('last') and end == 1:
+ ui.write(_("only one patch applied\n"))
+ return 1
+ elif opts.get('last'):
+ start = end - 2
+ end = 1
+ else:
+ start = 0
+
+ q.qseries(repo, length=end, start=start, status='A',
+ summary=opts.get('summary'))
+
+
+@command("qunapplied",
+ [('1', 'first', None, _('show only the first patch'))] + seriesopts,
+ _('hg qunapplied [-1] [-s] [PATCH]'))
+def unapplied(ui, repo, patch=None, **opts):
+ """print the patches not yet applied
+
+ Returns 0 on success."""
+
+ q = repo.mq
+ if patch:
+ if patch not in q.series:
+ raise util.Abort(_("patch %s is not in series file") % patch)
+ start = q.series.index(patch) + 1
+ else:
+ start = q.seriesend(True)
+
+ if start == len(q.series) and opts.get('first'):
+ ui.write(_("all patches applied\n"))
+ return 1
+
+ length = opts.get('first') and 1 or None
+ q.qseries(repo, start=start, length=length, status='U',
+ summary=opts.get('summary'))
+
+@command("qimport",
+ [('e', 'existing', None, _('import file in patch directory')),
+ ('n', 'name', '',
+ _('name of patch file'), _('NAME')),
+ ('f', 'force', None, _('overwrite existing files')),
+ ('r', 'rev', [],
+ _('place existing revisions under mq control'), _('REV')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ('P', 'push', None, _('qpush after importing'))],
+ _('hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]...'))
+def qimport(ui, repo, *filename, **opts):
+ """import a patch or existing changeset
+
+ The patch is inserted into the series after the last applied
+ patch. If no patches have been applied, qimport prepends the patch
+ to the series.
+
+ The patch will have the same name as its source file unless you
+ give it a new one with -n/--name.
+
+ You can register an existing patch inside the patch directory with
+ the -e/--existing flag.
+
+ With -f/--force, an existing patch of the same name will be
+ overwritten.
+
+ An existing changeset may be placed under mq control with -r/--rev
+ (e.g. qimport --rev tip -n patch will place tip under mq control).
+ With -g/--git, patches imported with --rev will use the git diff
+ format. See the diffs help topic for information on why this is
+ important for preserving rename/copy information and permission
+ changes. Use :hg:`qfinish` to remove changesets from mq control.
+
+ To import a patch from standard input, pass - as the patch file.
+ When importing from standard input, a patch name must be specified
+ using the --name flag.
+
+ To import an existing patch while renaming it::
+
+ hg qimport -e existing-patch -n new-name
+
+ Returns 0 if import succeeded.
+ """
+ lock = repo.lock() # cause this may move phase
+ try:
+ q = repo.mq
+ try:
+ imported = q.qimport(
+ repo, filename, patchname=opts.get('name'),
+ existing=opts.get('existing'), force=opts.get('force'),
+ rev=opts.get('rev'), git=opts.get('git'))
+ finally:
+ q.savedirty()
+ finally:
+ lock.release()
+
+ if imported and opts.get('push') and not opts.get('rev'):
+ return q.push(repo, imported[-1])
+ return 0
+
+def qinit(ui, repo, create):
+ """initialize a new queue repository
+
+ This command also creates a series file for ordering patches, and
+ an mq-specific .hgignore file in the queue repository, to exclude
+ the status and guards files (these contain mostly transient state).
+
+ Returns 0 if initialization succeeded."""
+ q = repo.mq
+ r = q.init(repo, create)
+ q.savedirty()
+ if r:
+ if not os.path.exists(r.wjoin('.hgignore')):
+ fp = r.wopener('.hgignore', 'w')
+ fp.write('^\\.hg\n')
+ fp.write('^\\.mq\n')
+ fp.write('syntax: glob\n')
+ fp.write('status\n')
+ fp.write('guards\n')
+ fp.close()
+ if not os.path.exists(r.wjoin('series')):
+ r.wopener('series', 'w').close()
+ r[None].add(['.hgignore', 'series'])
+ commands.add(ui, r)
+ return 0
+
+@command("^qinit",
+ [('c', 'create-repo', None, _('create queue repository'))],
+ _('hg qinit [-c]'))
+def init(ui, repo, **opts):
+ """init a new queue repository (DEPRECATED)
+
+ The queue repository is unversioned by default. If
+ -c/--create-repo is specified, qinit will create a separate nested
+ repository for patches (qinit -c may also be run later to convert
+ an unversioned patch repository into a versioned one). You can use
+ qcommit to commit changes to this queue repository.
+
+ This command is deprecated. Without -c, it's implied by other relevant
+ commands. With -c, use :hg:`init --mq` instead."""
+ return qinit(ui, repo, create=opts.get('create_repo'))
+
+@command("qclone",
+ [('', 'pull', None, _('use pull protocol to copy metadata')),
+ ('U', 'noupdate', None,
+ _('do not update the new working directories')),
+ ('', 'uncompressed', None,
+ _('use uncompressed transfer (fast over LAN)')),
+ ('p', 'patches', '',
+ _('location of source patch repository'), _('REPO')),
+ ] + commands.remoteopts,
+ _('hg qclone [OPTION]... SOURCE [DEST]'))
+def clone(ui, source, dest=None, **opts):
+ '''clone main and patch repository at same time
+
+ If source is local, destination will have no patches applied. If
+ source is remote, this command can not check if patches are
+ applied in source, so cannot guarantee that patches are not
+ applied in destination. If you clone remote repository, be sure
+ before that it has no patches applied.
+
+ Source patch repository is looked for in <src>/.hg/patches by
+ default. Use -p <url> to change.
+
+ The patch directory must be a nested Mercurial repository, as
+ would be created by :hg:`init --mq`.
+
+ Return 0 on success.
+ '''
+ def patchdir(repo):
+ """compute a patch repo url from a repo object"""
+ url = repo.url()
+ if url.endswith('/'):
+ url = url[:-1]
+ return url + '/.hg/patches'
+
+ # main repo (destination and sources)
+ if dest is None:
+ dest = hg.defaultdest(source)
+ sr = hg.peer(ui, opts, ui.expandpath(source))
+
+ # patches repo (source only)
+ if opts.get('patches'):
+ patchespath = ui.expandpath(opts.get('patches'))
+ else:
+ patchespath = patchdir(sr)
+ try:
+ hg.peer(ui, opts, patchespath)
+ except error.RepoError:
+ raise util.Abort(_('versioned patch repository not found'
+ ' (see init --mq)'))
+ qbase, destrev = None, None
+ if sr.local():
+ repo = sr.local()
+ if repo.mq.applied and repo[qbase].phase() != phases.secret:
+ qbase = repo.mq.applied[0].node
+ if not hg.islocal(dest):
+ heads = set(repo.heads())
+ destrev = list(heads.difference(repo.heads(qbase)))
+ destrev.append(repo.changelog.parents(qbase)[0])
+ elif sr.capable('lookup'):
+ try:
+ qbase = sr.lookup('qbase')
+ except error.RepoError:
+ pass
+
+ ui.note(_('cloning main repository\n'))
+ sr, dr = hg.clone(ui, opts, sr.url(), dest,
+ pull=opts.get('pull'),
+ rev=destrev,
+ update=False,
+ stream=opts.get('uncompressed'))
+
+ ui.note(_('cloning patch repository\n'))
+ hg.clone(ui, opts, opts.get('patches') or patchdir(sr), patchdir(dr),
+ pull=opts.get('pull'), update=not opts.get('noupdate'),
+ stream=opts.get('uncompressed'))
+
+ if dr.local():
+ repo = dr.local()
+ if qbase:
+ ui.note(_('stripping applied patches from destination '
+ 'repository\n'))
+ repo.mq.strip(repo, [qbase], update=False, backup=None)
+ if not opts.get('noupdate'):
+ ui.note(_('updating destination repository\n'))
+ hg.update(repo, repo.changelog.tip())
+
+@command("qcommit|qci",
+ commands.table["^commit|ci"][1],
+ _('hg qcommit [OPTION]... [FILE]...'))
+def commit(ui, repo, *pats, **opts):
+ """commit changes in the queue repository (DEPRECATED)
+
+ This command is deprecated; use :hg:`commit --mq` instead."""
+ q = repo.mq
+ r = q.qrepo()
+ if not r:
+ raise util.Abort('no queue repository')
+ commands.commit(r.ui, r, *pats, **opts)
+
+@command("qseries",
+ [('m', 'missing', None, _('print patches not in series')),
+ ] + seriesopts,
+ _('hg qseries [-ms]'))
+def series(ui, repo, **opts):
+ """print the entire series file
+
+ Returns 0 on success."""
+ repo.mq.qseries(repo, missing=opts.get('missing'),
+ summary=opts.get('summary'))
+ return 0
+
+@command("qtop", seriesopts, _('hg qtop [-s]'))
+def top(ui, repo, **opts):
+ """print the name of the current patch
+
+ Returns 0 on success."""
+ q = repo.mq
+ t = q.applied and q.seriesend(True) or 0
+ if t:
+ q.qseries(repo, start=t - 1, length=1, status='A',
+ summary=opts.get('summary'))
+ else:
+ ui.write(_("no patches applied\n"))
+ return 1
+
+@command("qnext", seriesopts, _('hg qnext [-s]'))
+def next(ui, repo, **opts):
+ """print the name of the next pushable patch
+
+ Returns 0 on success."""
+ q = repo.mq
+ end = q.seriesend()
+ if end == len(q.series):
+ ui.write(_("all patches applied\n"))
+ return 1
+ q.qseries(repo, start=end, length=1, summary=opts.get('summary'))
+
+@command("qprev", seriesopts, _('hg qprev [-s]'))
+def prev(ui, repo, **opts):
+ """print the name of the preceding applied patch
+
+ Returns 0 on success."""
+ q = repo.mq
+ l = len(q.applied)
+ if l == 1:
+ ui.write(_("only one patch applied\n"))
+ return 1
+ if not l:
+ ui.write(_("no patches applied\n"))
+ return 1
+ idx = q.series.index(q.applied[-2].name)
+ q.qseries(repo, start=idx, length=1, status='A',
+ summary=opts.get('summary'))
+
+def setupheaderopts(ui, opts):
+ if not opts.get('user') and opts.get('currentuser'):
+ opts['user'] = ui.username()
+ if not opts.get('date') and opts.get('currentdate'):
+ opts['date'] = "%d %d" % util.makedate()
+
+@command("^qnew",
+ [('e', 'edit', None, _('edit commit message')),
+ ('f', 'force', None, _('import uncommitted changes (DEPRECATED)')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ('U', 'currentuser', None, _('add "From: <current user>" to patch')),
+ ('u', 'user', '',
+ _('add "From: <USER>" to patch'), _('USER')),
+ ('D', 'currentdate', None, _('add "Date: <current date>" to patch')),
+ ('d', 'date', '',
+ _('add "Date: <DATE>" to patch'), _('DATE'))
+ ] + commands.walkopts + commands.commitopts,
+ _('hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]...'))
+def new(ui, repo, patch, *args, **opts):
+ """create a new patch
+
+ qnew creates a new patch on top of the currently-applied patch (if
+ any). The patch will be initialized with any outstanding changes
+ in the working directory. You may also use -I/--include,
+ -X/--exclude, and/or a list of files after the patch name to add
+ only changes to matching files to the new patch, leaving the rest
+ as uncommitted modifications.
+
+ -u/--user and -d/--date can be used to set the (given) user and
+ date, respectively. -U/--currentuser and -D/--currentdate set user
+ to current user and date to current date.
+
+ -e/--edit, -m/--message or -l/--logfile set the patch header as
+ well as the commit message. If none is specified, the header is
+ empty and the commit message is '[mq]: PATCH'.
+
+ Use the -g/--git option to keep the patch in the git extended diff
+ format. Read the diffs help topic for more information on why this
+ is important for preserving permission changes and copy/rename
+ information.
+
+ Returns 0 on successful creation of a new patch.
+ """
+ msg = cmdutil.logmessage(ui, opts)
+ def getmsg():
+ return ui.edit(msg, opts.get('user') or ui.username())
+ q = repo.mq
+ opts['msg'] = msg
+ if opts.get('edit'):
+ opts['msg'] = getmsg
+ else:
+ opts['msg'] = msg
+ setupheaderopts(ui, opts)
+ q.new(repo, patch, *args, **opts)
+ q.savedirty()
+ return 0
+
+@command("^qrefresh",
+ [('e', 'edit', None, _('edit commit message')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ('s', 'short', None,
+ _('refresh only files already in the patch and specified files')),
+ ('U', 'currentuser', None,
+ _('add/update author field in patch with current user')),
+ ('u', 'user', '',
+ _('add/update author field in patch with given user'), _('USER')),
+ ('D', 'currentdate', None,
+ _('add/update date field in patch with current date')),
+ ('d', 'date', '',
+ _('add/update date field in patch with given date'), _('DATE'))
+ ] + commands.walkopts + commands.commitopts,
+ _('hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...'))
+def refresh(ui, repo, *pats, **opts):
+ """update the current patch
+
+ If any file patterns are provided, the refreshed patch will
+ contain only the modifications that match those patterns; the
+ remaining modifications will remain in the working directory.
+
+ If -s/--short is specified, files currently included in the patch
+ will be refreshed just like matched files and remain in the patch.
+
+ If -e/--edit is specified, Mercurial will start your configured editor for
+ you to enter a message. In case qrefresh fails, you will find a backup of
+ your message in ``.hg/last-message.txt``.
+
+ hg add/remove/copy/rename work as usual, though you might want to
+ use git-style patches (-g/--git or [diff] git=1) to track copies
+ and renames. See the diffs help topic for more information on the
+ git diff format.
+
+ Returns 0 on success.
+ """
+ q = repo.mq
+ message = cmdutil.logmessage(ui, opts)
+ if opts.get('edit'):
+ if not q.applied:
+ ui.write(_("no patches applied\n"))
+ return 1
+ if message:
+ raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
+ patch = q.applied[-1].name
+ ph = patchheader(q.join(patch), q.plainmode)
+ message = ui.edit('\n'.join(ph.message), ph.user or ui.username())
+ # We don't want to lose the patch message if qrefresh fails (issue2062)
+ repo.savecommitmessage(message)
+ setupheaderopts(ui, opts)
+ wlock = repo.wlock()
+ try:
+ ret = q.refresh(repo, pats, msg=message, **opts)
+ q.savedirty()
+ return ret
+ finally:
+ wlock.release()
+
+@command("^qdiff",
+ commands.diffopts + commands.diffopts2 + commands.walkopts,
+ _('hg qdiff [OPTION]... [FILE]...'))
+def diff(ui, repo, *pats, **opts):
+ """diff of the current patch and subsequent modifications
+
+ Shows a diff which includes the current patch as well as any
+ changes which have been made in the working directory since the
+ last refresh (thus showing what the current patch would become
+ after a qrefresh).
+
+ Use :hg:`diff` if you only want to see the changes made since the
+ last qrefresh, or :hg:`export qtip` if you want to see changes
+ made by the current patch without including changes made since the
+ qrefresh.
+
+ Returns 0 on success.
+ """
+ repo.mq.diff(repo, pats, opts)
+ return 0
+
+@command('qfold',
+ [('e', 'edit', None, _('edit patch header')),
+ ('k', 'keep', None, _('keep folded patch files')),
+ ] + commands.commitopts,
+ _('hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH...'))
+def fold(ui, repo, *files, **opts):
+ """fold the named patches into the current patch
+
+ Patches must not yet be applied. Each patch will be successively
+ applied to the current patch in the order given. If all the
+ patches apply successfully, the current patch will be refreshed
+ with the new cumulative patch, and the folded patches will be
+ deleted. With -k/--keep, the folded patch files will not be
+ removed afterwards.
+
+ The header for each folded patch will be concatenated with the
+ current patch header, separated by a line of ``* * *``.
+
+ Returns 0 on success."""
+ q = repo.mq
+ if not files:
+ raise util.Abort(_('qfold requires at least one patch name'))
+ if not q.checktoppatch(repo)[0]:
+ raise util.Abort(_('no patches applied'))
+ q.checklocalchanges(repo)
+
+ message = cmdutil.logmessage(ui, opts)
+ if opts.get('edit'):
+ if message:
+ raise util.Abort(_('option "-e" incompatible with "-m" or "-l"'))
+
+ parent = q.lookup('qtip')
+ patches = []
+ messages = []
+ for f in files:
+ p = q.lookup(f)
+ if p in patches or p == parent:
+ ui.warn(_('skipping already folded patch %s\n') % p)
+ if q.isapplied(p):
+ raise util.Abort(_('qfold cannot fold already applied patch %s')
+ % p)
+ patches.append(p)
+
+ for p in patches:
+ if not message:
+ ph = patchheader(q.join(p), q.plainmode)
+ if ph.message:
+ messages.append(ph.message)
+ pf = q.join(p)
+ (patchsuccess, files, fuzz) = q.patch(repo, pf)
+ if not patchsuccess:
+ raise util.Abort(_('error folding patch %s') % p)
+
+ if not message:
+ ph = patchheader(q.join(parent), q.plainmode)
+ message, user = ph.message, ph.user
+ for msg in messages:
+ message.append('* * *')
+ message.extend(msg)
+ message = '\n'.join(message)
+
+ if opts.get('edit'):
+ message = ui.edit(message, user or ui.username())
+
+ diffopts = q.patchopts(q.diffopts(), *patches)
+ wlock = repo.wlock()
+ try:
+ q.refresh(repo, msg=message, git=diffopts.git)
+ q.delete(repo, patches, opts)
+ q.savedirty()
+ finally:
+ wlock.release()
+
+@command("qgoto",
+ [('', 'keep-changes', None,
+ _('tolerate non-conflicting local changes')),
+ ('f', 'force', None, _('overwrite any local changes')),
+ ('', 'no-backup', None, _('do not save backup copies of files'))],
+ _('hg qgoto [OPTION]... PATCH'))
+def goto(ui, repo, patch, **opts):
+ '''push or pop patches until named patch is at top of stack
+
+ Returns 0 on success.'''
+ opts = fixkeepchangesopts(ui, opts)
+ q = repo.mq
+ patch = q.lookup(patch)
+ nobackup = opts.get('no_backup')
+ keepchanges = opts.get('keep_changes')
+ if q.isapplied(patch):
+ ret = q.pop(repo, patch, force=opts.get('force'), nobackup=nobackup,
+ keepchanges=keepchanges)
+ else:
+ ret = q.push(repo, patch, force=opts.get('force'), nobackup=nobackup,
+ keepchanges=keepchanges)
+ q.savedirty()
+ return ret
+
+@command("qguard",
+ [('l', 'list', None, _('list all patches and guards')),
+ ('n', 'none', None, _('drop all guards'))],
+ _('hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]'))
+def guard(ui, repo, *args, **opts):
+ '''set or print guards for a patch
+
+ Guards control whether a patch can be pushed. A patch with no
+ guards is always pushed. A patch with a positive guard ("+foo") is
+ pushed only if the :hg:`qselect` command has activated it. A patch with
+ a negative guard ("-foo") is never pushed if the :hg:`qselect` command
+ has activated it.
+
+ With no arguments, print the currently active guards.
+ With arguments, set guards for the named patch.
+
+ .. note::
+ Specifying negative guards now requires '--'.
+
+ To set guards on another patch::
+
+ hg qguard other.patch -- +2.6.17 -stable
+
+ Returns 0 on success.
+ '''
+ def status(idx):
+ guards = q.seriesguards[idx] or ['unguarded']
+ if q.series[idx] in applied:
+ state = 'applied'
+ elif q.pushable(idx)[0]:
+ state = 'unapplied'
+ else:
+ state = 'guarded'
+ label = 'qguard.patch qguard.%s qseries.%s' % (state, state)
+ ui.write('%s: ' % ui.label(q.series[idx], label))
+
+ for i, guard in enumerate(guards):
+ if guard.startswith('+'):
+ ui.write(guard, label='qguard.positive')
+ elif guard.startswith('-'):
+ ui.write(guard, label='qguard.negative')
+ else:
+ ui.write(guard, label='qguard.unguarded')
+ if i != len(guards) - 1:
+ ui.write(' ')
+ ui.write('\n')
+ q = repo.mq
+ applied = set(p.name for p in q.applied)
+ patch = None
+ args = list(args)
+ if opts.get('list'):
+ if args or opts.get('none'):
+ raise util.Abort(_('cannot mix -l/--list with options or '
+ 'arguments'))
+ for i in xrange(len(q.series)):
+ status(i)
+ return
+ if not args or args[0][0:1] in '-+':
+ if not q.applied:
+ raise util.Abort(_('no patches applied'))
+ patch = q.applied[-1].name
+ if patch is None and args[0][0:1] not in '-+':
+ patch = args.pop(0)
+ if patch is None:
+ raise util.Abort(_('no patch to work with'))
+ if args or opts.get('none'):
+ idx = q.findseries(patch)
+ if idx is None:
+ raise util.Abort(_('no patch named %s') % patch)
+ q.setguards(idx, args)
+ q.savedirty()
+ else:
+ status(q.series.index(q.lookup(patch)))
+
+@command("qheader", [], _('hg qheader [PATCH]'))
+def header(ui, repo, patch=None):
+ """print the header of the topmost or specified patch
+
+ Returns 0 on success."""
+ q = repo.mq
+
+ if patch:
+ patch = q.lookup(patch)
+ else:
+ if not q.applied:
+ ui.write(_('no patches applied\n'))
+ return 1
+ patch = q.lookup('qtip')
+ ph = patchheader(q.join(patch), q.plainmode)
+
+ ui.write('\n'.join(ph.message) + '\n')
+
+def lastsavename(path):
+ (directory, base) = os.path.split(path)
+ names = os.listdir(directory)
+ namere = re.compile("%s.([0-9]+)" % base)
+ maxindex = None
+ maxname = None
+ for f in names:
+ m = namere.match(f)
+ if m:
+ index = int(m.group(1))
+ if maxindex is None or index > maxindex:
+ maxindex = index
+ maxname = f
+ if maxname:
+ return (os.path.join(directory, maxname), maxindex)
+ return (None, None)
+
+def savename(path):
+ (last, index) = lastsavename(path)
+ if last is None:
+ index = 0
+ newpath = path + ".%d" % (index + 1)
+ return newpath
+
+@command("^qpush",
+ [('', 'keep-changes', None,
+ _('tolerate non-conflicting local changes')),
+ ('f', 'force', None, _('apply on top of local changes')),
+ ('e', 'exact', None,
+ _('apply the target patch to its recorded parent')),
+ ('l', 'list', None, _('list patch name in commit text')),
+ ('a', 'all', None, _('apply all patches')),
+ ('m', 'merge', None, _('merge from another queue (DEPRECATED)')),
+ ('n', 'name', '',
+ _('merge queue name (DEPRECATED)'), _('NAME')),
+ ('', 'move', None,
+ _('reorder patch series and apply only the patch')),
+ ('', 'no-backup', None, _('do not save backup copies of files'))],
+ _('hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]'))
+def push(ui, repo, patch=None, **opts):
+ """push the next patch onto the stack
+
+ By default, abort if the working directory contains uncommitted
+ changes. With --keep-changes, abort only if the uncommitted files
+ overlap with patched files. With -f/--force, backup and patch over
+ uncommitted changes.
+
+ Return 0 on success.
+ """
+ q = repo.mq
+ mergeq = None
+
+ opts = fixkeepchangesopts(ui, opts)
+ if opts.get('merge'):
+ if opts.get('name'):
+ newpath = repo.join(opts.get('name'))
+ else:
+ newpath, i = lastsavename(q.path)
+ if not newpath:
+ ui.warn(_("no saved queues found, please use -n\n"))
+ return 1
+ mergeq = queue(ui, repo.path, newpath)
+ ui.warn(_("merging with queue at: %s\n") % mergeq.path)
+ ret = q.push(repo, patch, force=opts.get('force'), list=opts.get('list'),
+ mergeq=mergeq, all=opts.get('all'), move=opts.get('move'),
+ exact=opts.get('exact'), nobackup=opts.get('no_backup'),
+ keepchanges=opts.get('keep_changes'))
+ return ret
+
+@command("^qpop",
+ [('a', 'all', None, _('pop all patches')),
+ ('n', 'name', '',
+ _('queue name to pop (DEPRECATED)'), _('NAME')),
+ ('', 'keep-changes', None,
+ _('tolerate non-conflicting local changes')),
+ ('f', 'force', None, _('forget any local changes to patched files')),
+ ('', 'no-backup', None, _('do not save backup copies of files'))],
+ _('hg qpop [-a] [-f] [PATCH | INDEX]'))
+def pop(ui, repo, patch=None, **opts):
+ """pop the current patch off the stack
+
+ Without argument, pops off the top of the patch stack. If given a
+ patch name, keeps popping off patches until the named patch is at
+ the top of the stack.
+
+ By default, abort if the working directory contains uncommitted
+ changes. With --keep-changes, abort only if the uncommitted files
+ overlap with patched files. With -f/--force, backup and discard
+ changes made to such files.
+
+ Return 0 on success.
+ """
+ opts = fixkeepchangesopts(ui, opts)
+ localupdate = True
+ if opts.get('name'):
+ q = queue(ui, repo.path, repo.join(opts.get('name')))
+ ui.warn(_('using patch queue: %s\n') % q.path)
+ localupdate = False
+ else:
+ q = repo.mq
+ ret = q.pop(repo, patch, force=opts.get('force'), update=localupdate,
+ all=opts.get('all'), nobackup=opts.get('no_backup'),
+ keepchanges=opts.get('keep_changes'))
+ q.savedirty()
+ return ret
+
+@command("qrename|qmv", [], _('hg qrename PATCH1 [PATCH2]'))
+def rename(ui, repo, patch, name=None, **opts):
+ """rename a patch
+
+ With one argument, renames the current patch to PATCH1.
+ With two arguments, renames PATCH1 to PATCH2.
+
+ Returns 0 on success."""
+ q = repo.mq
+ if not name:
+ name = patch
+ patch = None
+
+ if patch:
+ patch = q.lookup(patch)
+ else:
+ if not q.applied:
+ ui.write(_('no patches applied\n'))
+ return
+ patch = q.lookup('qtip')
+ absdest = q.join(name)
+ if os.path.isdir(absdest):
+ name = normname(os.path.join(name, os.path.basename(patch)))
+ absdest = q.join(name)
+ q.checkpatchname(name)
+
+ ui.note(_('renaming %s to %s\n') % (patch, name))
+ i = q.findseries(patch)
+ guards = q.guard_re.findall(q.fullseries[i])
+ q.fullseries[i] = name + ''.join([' #' + g for g in guards])
+ q.parseseries()
+ q.seriesdirty = True
+
+ info = q.isapplied(patch)
+ if info:
+ q.applied[info[0]] = statusentry(info[1], name)
+ q.applieddirty = True
+
+ destdir = os.path.dirname(absdest)
+ if not os.path.isdir(destdir):
+ os.makedirs(destdir)
+ util.rename(q.join(patch), absdest)
+ r = q.qrepo()
+ if r and patch in r.dirstate:
+ wctx = r[None]
+ wlock = r.wlock()
+ try:
+ if r.dirstate[patch] == 'a':
+ r.dirstate.drop(patch)
+ r.dirstate.add(name)
+ else:
+ wctx.copy(patch, name)
+ wctx.forget([patch])
+ finally:
+ wlock.release()
+
+ q.savedirty()
+
+@command("qrestore",
+ [('d', 'delete', None, _('delete save entry')),
+ ('u', 'update', None, _('update queue working directory'))],
+ _('hg qrestore [-d] [-u] REV'))
+def restore(ui, repo, rev, **opts):
+ """restore the queue state saved by a revision (DEPRECATED)
+
+ This command is deprecated, use :hg:`rebase` instead."""
+ rev = repo.lookup(rev)
+ q = repo.mq
+ q.restore(repo, rev, delete=opts.get('delete'),
+ qupdate=opts.get('update'))
+ q.savedirty()
+ return 0
+
+@command("qsave",
+ [('c', 'copy', None, _('copy patch directory')),
+ ('n', 'name', '',
+ _('copy directory name'), _('NAME')),
+ ('e', 'empty', None, _('clear queue status file')),
+ ('f', 'force', None, _('force copy'))] + commands.commitopts,
+ _('hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]'))
+def save(ui, repo, **opts):
+ """save current queue state (DEPRECATED)
+
+ This command is deprecated, use :hg:`rebase` instead."""
+ q = repo.mq
+ message = cmdutil.logmessage(ui, opts)
+ ret = q.save(repo, msg=message)
+ if ret:
+ return ret
+ q.savedirty() # save to .hg/patches before copying
+ if opts.get('copy'):
+ path = q.path
+ if opts.get('name'):
+ newpath = os.path.join(q.basepath, opts.get('name'))
+ if os.path.exists(newpath):
+ if not os.path.isdir(newpath):
+ raise util.Abort(_('destination %s exists and is not '
+ 'a directory') % newpath)
+ if not opts.get('force'):
+ raise util.Abort(_('destination %s exists, '
+ 'use -f to force') % newpath)
+ else:
+ newpath = savename(path)
+ ui.warn(_("copy %s to %s\n") % (path, newpath))
+ util.copyfiles(path, newpath)
+ if opts.get('empty'):
+ del q.applied[:]
+ q.applieddirty = True
+ q.savedirty()
+ return 0
+
+@command("strip",
+ [
+ ('r', 'rev', [], _('strip specified revision (optional, '
+ 'can specify revisions without this '
+ 'option)'), _('REV')),
+ ('f', 'force', None, _('force removal of changesets, discard '
+ 'uncommitted changes (no backup)')),
+ ('b', 'backup', None, _('bundle only changesets with local revision'
+ ' number greater than REV which are not'
+ ' descendants of REV (DEPRECATED)')),
+ ('', 'no-backup', None, _('no backups')),
+ ('', 'nobackup', None, _('no backups (DEPRECATED)')),
+ ('n', '', None, _('ignored (DEPRECATED)')),
+ ('k', 'keep', None, _("do not modify working copy during strip")),
+ ('B', 'bookmark', '', _("remove revs only reachable from given"
+ " bookmark"))],
+ _('hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV...'))
+def strip(ui, repo, *revs, **opts):
+ """strip changesets and all their descendants from the repository
+
+ The strip command removes the specified changesets and all their
+ descendants. If the working directory has uncommitted changes, the
+ operation is aborted unless the --force flag is supplied, in which
+ case changes will be discarded.
+
+ If a parent of the working directory is stripped, then the working
+ directory will automatically be updated to the most recent
+ available ancestor of the stripped parent after the operation
+ completes.
+
+ Any stripped changesets are stored in ``.hg/strip-backup`` as a
+ bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can
+ be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,
+ where BUNDLE is the bundle file created by the strip. Note that
+ the local revision numbers will in general be different after the
+ restore.
+
+ Use the --no-backup option to discard the backup bundle once the
+ operation completes.
+
+ Strip is not a history-rewriting operation and can be used on
+ changesets in the public phase. But if the stripped changesets have
+ been pushed to a remote repository you will likely pull them again.
+
+ Return 0 on success.
+ """
+ backup = 'all'
+ if opts.get('backup'):
+ backup = 'strip'
+ elif opts.get('no_backup') or opts.get('nobackup'):
+ backup = 'none'
+
+ cl = repo.changelog
+ revs = list(revs) + opts.get('rev')
+ revs = set(scmutil.revrange(repo, revs))
+
+ if opts.get('bookmark'):
+ mark = opts.get('bookmark')
+ marks = repo._bookmarks
+ if mark not in marks:
+ raise util.Abort(_("bookmark '%s' not found") % mark)
+
+ # If the requested bookmark is not the only one pointing to a
+ # a revision we have to only delete the bookmark and not strip
+ # anything. revsets cannot detect that case.
+ uniquebm = True
+ for m, n in marks.iteritems():
+ if m != mark and n == repo[mark].node():
+ uniquebm = False
+ break
+ if uniquebm:
+ rsrevs = repo.revs("ancestors(bookmark(%s)) - "
+ "ancestors(head() and not bookmark(%s)) - "
+ "ancestors(bookmark() and not bookmark(%s))",
+ mark, mark, mark)
+ revs.update(set(rsrevs))
+ if not revs:
+ del marks[mark]
+ repo._writebookmarks(mark)
+ ui.write(_("bookmark '%s' deleted\n") % mark)
+
+ if not revs:
+ raise util.Abort(_('empty revision set'))
+
+ descendants = set(cl.descendants(revs))
+ strippedrevs = revs.union(descendants)
+ roots = revs.difference(descendants)
+
+ update = False
+ # if one of the wdir parent is stripped we'll need
+ # to update away to an earlier revision
+ for p in repo.dirstate.parents():
+ if p != nullid and cl.rev(p) in strippedrevs:
+ update = True
+ break
+
+ rootnodes = set(cl.node(r) for r in roots)
+
+ q = repo.mq
+ if q.applied:
+ # refresh queue state if we're about to strip
+ # applied patches
+ if cl.rev(repo.lookup('qtip')) in strippedrevs:
+ q.applieddirty = True
+ start = 0
+ end = len(q.applied)
+ for i, statusentry in enumerate(q.applied):
+ if statusentry.node in rootnodes:
+ # if one of the stripped roots is an applied
+ # patch, only part of the queue is stripped
+ start = i
+ break
+ del q.applied[start:end]
+ q.savedirty()
+
+ revs = list(rootnodes)
+ if update and opts.get('keep'):
+ wlock = repo.wlock()
+ try:
+ urev = repo.mq.qparents(repo, revs[0])
+ repo.dirstate.rebuild(urev, repo[urev].manifest())
+ repo.dirstate.write()
+ update = False
+ finally:
+ wlock.release()
+
+ if opts.get('bookmark'):
+ del marks[mark]
+ repo._writebookmarks(marks)
+ ui.write(_("bookmark '%s' deleted\n") % mark)
+
+ repo.mq.strip(repo, revs, backup=backup, update=update,
+ force=opts.get('force'))
+
+ return 0
+
+@command("qselect",
+ [('n', 'none', None, _('disable all guards')),
+ ('s', 'series', None, _('list all guards in series file')),
+ ('', 'pop', None, _('pop to before first guarded applied patch')),
+ ('', 'reapply', None, _('pop, then reapply patches'))],
+ _('hg qselect [OPTION]... [GUARD]...'))
+def select(ui, repo, *args, **opts):
+ '''set or print guarded patches to push
+
+ Use the :hg:`qguard` command to set or print guards on patch, then use
+ qselect to tell mq which guards to use. A patch will be pushed if
+ it has no guards or any positive guards match the currently
+ selected guard, but will not be pushed if any negative guards
+ match the current guard. For example::
+
+ qguard foo.patch -- -stable (negative guard)
+ qguard bar.patch +stable (positive guard)
+ qselect stable
+
+ This activates the "stable" guard. mq will skip foo.patch (because
+ it has a negative match) but push bar.patch (because it has a
+ positive match).
+
+ With no arguments, prints the currently active guards.
+ With one argument, sets the active guard.
+
+ Use -n/--none to deactivate guards (no other arguments needed).
+ When no guards are active, patches with positive guards are
+ skipped and patches with negative guards are pushed.
+
+ qselect can change the guards on applied patches. It does not pop
+ guarded patches by default. Use --pop to pop back to the last
+ applied patch that is not guarded. Use --reapply (which implies
+ --pop) to push back to the current patch afterwards, but skip
+ guarded patches.
+
+ Use -s/--series to print a list of all guards in the series file
+ (no other arguments needed). Use -v for more information.
+
+ Returns 0 on success.'''
+
+ q = repo.mq
+ guards = q.active()
+ if args or opts.get('none'):
+ old_unapplied = q.unapplied(repo)
+ old_guarded = [i for i in xrange(len(q.applied)) if
+ not q.pushable(i)[0]]
+ q.setactive(args)
+ q.savedirty()
+ if not args:
+ ui.status(_('guards deactivated\n'))
+ if not opts.get('pop') and not opts.get('reapply'):
+ unapplied = q.unapplied(repo)
+ guarded = [i for i in xrange(len(q.applied))
+ if not q.pushable(i)[0]]
+ if len(unapplied) != len(old_unapplied):
+ ui.status(_('number of unguarded, unapplied patches has '
+ 'changed from %d to %d\n') %
+ (len(old_unapplied), len(unapplied)))
+ if len(guarded) != len(old_guarded):
+ ui.status(_('number of guarded, applied patches has changed '
+ 'from %d to %d\n') %
+ (len(old_guarded), len(guarded)))
+ elif opts.get('series'):
+ guards = {}
+ noguards = 0
+ for gs in q.seriesguards:
+ if not gs:
+ noguards += 1
+ for g in gs:
+ guards.setdefault(g, 0)
+ guards[g] += 1
+ if ui.verbose:
+ guards['NONE'] = noguards
+ guards = guards.items()
+ guards.sort(key=lambda x: x[0][1:])
+ if guards:
+ ui.note(_('guards in series file:\n'))
+ for guard, count in guards:
+ ui.note('%2d ' % count)
+ ui.write(guard, '\n')
+ else:
+ ui.note(_('no guards in series file\n'))
+ else:
+ if guards:
+ ui.note(_('active guards:\n'))
+ for g in guards:
+ ui.write(g, '\n')
+ else:
+ ui.write(_('no active guards\n'))
+ reapply = opts.get('reapply') and q.applied and q.appliedname(-1)
+ popped = False
+ if opts.get('pop') or opts.get('reapply'):
+ for i in xrange(len(q.applied)):
+ pushable, reason = q.pushable(i)
+ if not pushable:
+ ui.status(_('popping guarded patches\n'))
+ popped = True
+ if i == 0:
+ q.pop(repo, all=True)
+ else:
+ q.pop(repo, str(i - 1))
+ break
+ if popped:
+ try:
+ if reapply:
+ ui.status(_('reapplying unguarded patches\n'))
+ q.push(repo, reapply)
+ finally:
+ q.savedirty()
+
+@command("qfinish",
+ [('a', 'applied', None, _('finish all applied changesets'))],
+ _('hg qfinish [-a] [REV]...'))
+def finish(ui, repo, *revrange, **opts):
+ """move applied patches into repository history
+
+ Finishes the specified revisions (corresponding to applied
+ patches) by moving them out of mq control into regular repository
+ history.
+
+ Accepts a revision range or the -a/--applied option. If --applied
+ is specified, all applied mq revisions are removed from mq
+ control. Otherwise, the given revisions must be at the base of the
+ stack of applied patches.
+
+ This can be especially useful if your changes have been applied to
+ an upstream repository, or if you are about to push your changes
+ to upstream.
+
+ Returns 0 on success.
+ """
+ if not opts.get('applied') and not revrange:
+ raise util.Abort(_('no revisions specified'))
+ elif opts.get('applied'):
+ revrange = ('qbase::qtip',) + revrange
+
+ q = repo.mq
+ if not q.applied:
+ ui.status(_('no patches applied\n'))
+ return 0
+
+ revs = scmutil.revrange(repo, revrange)
+ if repo['.'].rev() in revs and repo[None].files():
+ ui.warn(_('warning: uncommitted changes in the working directory\n'))
+ # queue.finish may changes phases but leave the responsability to lock the
+ # repo to the caller to avoid deadlock with wlock. This command code is
+ # responsability for this locking.
+ lock = repo.lock()
+ try:
+ q.finish(repo, revs)
+ q.savedirty()
+ finally:
+ lock.release()
+ return 0
+
+@command("qqueue",
+ [('l', 'list', False, _('list all available queues')),
+ ('', 'active', False, _('print name of active queue')),
+ ('c', 'create', False, _('create new queue')),
+ ('', 'rename', False, _('rename active queue')),
+ ('', 'delete', False, _('delete reference to queue')),
+ ('', 'purge', False, _('delete queue, and remove patch dir')),
+ ],
+ _('[OPTION] [QUEUE]'))
+def qqueue(ui, repo, name=None, **opts):
+ '''manage multiple patch queues
+
+ Supports switching between different patch queues, as well as creating
+ new patch queues and deleting existing ones.
+
+ Omitting a queue name or specifying -l/--list will show you the registered
+ queues - by default the "normal" patches queue is registered. The currently
+ active queue will be marked with "(active)". Specifying --active will print
+ only the name of the active queue.
+
+ To create a new queue, use -c/--create. The queue is automatically made
+ active, except in the case where there are applied patches from the
+ currently active queue in the repository. Then the queue will only be
+ created and switching will fail.
+
+ To delete an existing queue, use --delete. You cannot delete the currently
+ active queue.
+
+ Returns 0 on success.
+ '''
+ q = repo.mq
+ _defaultqueue = 'patches'
+ _allqueues = 'patches.queues'
+ _activequeue = 'patches.queue'
+
+ def _getcurrent():
+ cur = os.path.basename(q.path)
+ if cur.startswith('patches-'):
+ cur = cur[8:]
+ return cur
+
+ def _noqueues():
+ try:
+ fh = repo.opener(_allqueues, 'r')
+ fh.close()
+ except IOError:
+ return True
+
+ return False
+
+ def _getqueues():
+ current = _getcurrent()
+
+ try:
+ fh = repo.opener(_allqueues, 'r')
+ queues = [queue.strip() for queue in fh if queue.strip()]
+ fh.close()
+ if current not in queues:
+ queues.append(current)
+ except IOError:
+ queues = [_defaultqueue]
+
+ return sorted(queues)
+
+ def _setactive(name):
+ if q.applied:
+ raise util.Abort(_('patches applied - cannot set new queue active'))
+ _setactivenocheck(name)
+
+ def _setactivenocheck(name):
+ fh = repo.opener(_activequeue, 'w')
+ if name != 'patches':
+ fh.write(name)
+ fh.close()
+
+ def _addqueue(name):
+ fh = repo.opener(_allqueues, 'a')
+ fh.write('%s\n' % (name,))
+ fh.close()
+
+ def _queuedir(name):
+ if name == 'patches':
+ return repo.join('patches')
+ else:
+ return repo.join('patches-' + name)
+
+ def _validname(name):
+ for n in name:
+ if n in ':\\/.':
+ return False
+ return True
+
+ def _delete(name):
+ if name not in existing:
+ raise util.Abort(_('cannot delete queue that does not exist'))
+
+ current = _getcurrent()
+
+ if name == current:
+ raise util.Abort(_('cannot delete currently active queue'))
+
+ fh = repo.opener('patches.queues.new', 'w')
+ for queue in existing:
+ if queue == name:
+ continue
+ fh.write('%s\n' % (queue,))
+ fh.close()
+ util.rename(repo.join('patches.queues.new'), repo.join(_allqueues))
+
+ if not name or opts.get('list') or opts.get('active'):
+ current = _getcurrent()
+ if opts.get('active'):
+ ui.write('%s\n' % (current,))
+ return
+ for queue in _getqueues():
+ ui.write('%s' % (queue,))
+ if queue == current and not ui.quiet:
+ ui.write(_(' (active)\n'))
+ else:
+ ui.write('\n')
+ return
+
+ if not _validname(name):
+ raise util.Abort(
+ _('invalid queue name, may not contain the characters ":\\/."'))
+
+ existing = _getqueues()
+
+ if opts.get('create'):
+ if name in existing:
+ raise util.Abort(_('queue "%s" already exists') % name)
+ if _noqueues():
+ _addqueue(_defaultqueue)
+ _addqueue(name)
+ _setactive(name)
+ elif opts.get('rename'):
+ current = _getcurrent()
+ if name == current:
+ raise util.Abort(_('can\'t rename "%s" to its current name') % name)
+ if name in existing:
+ raise util.Abort(_('queue "%s" already exists') % name)
+
+ olddir = _queuedir(current)
+ newdir = _queuedir(name)
+
+ if os.path.exists(newdir):
+ raise util.Abort(_('non-queue directory "%s" already exists') %
+ newdir)
+
+ fh = repo.opener('patches.queues.new', 'w')
+ for queue in existing:
+ if queue == current:
+ fh.write('%s\n' % (name,))
+ if os.path.exists(olddir):
+ util.rename(olddir, newdir)
+ else:
+ fh.write('%s\n' % (queue,))
+ fh.close()
+ util.rename(repo.join('patches.queues.new'), repo.join(_allqueues))
+ _setactivenocheck(name)
+ elif opts.get('delete'):
+ _delete(name)
+ elif opts.get('purge'):
+ if name in existing:
+ _delete(name)
+ qdir = _queuedir(name)
+ if os.path.exists(qdir):
+ shutil.rmtree(qdir)
+ else:
+ if name not in existing:
+ raise util.Abort(_('use --create to create a new queue'))
+ _setactive(name)
+
+def mqphasedefaults(repo, roots):
+ """callback used to set mq changeset as secret when no phase data exists"""
+ if repo.mq.applied:
+ if repo.ui.configbool('mq', 'secret', False):
+ mqphase = phases.secret
+ else:
+ mqphase = phases.draft
+ qbase = repo[repo.mq.applied[0].node]
+ roots[mqphase].add(qbase.node())
+ return roots
+
+def reposetup(ui, repo):
+ class mqrepo(repo.__class__):
+ @util.propertycache
+ def mq(self):
+ return queue(self.ui, self.path)
+
+ def abortifwdirpatched(self, errmsg, force=False):
+ if self.mq.applied and not force:
+ parents = self.dirstate.parents()
+ patches = [s.node for s in self.mq.applied]
+ if parents[0] in patches or parents[1] in patches:
+ raise util.Abort(errmsg)
+
+ def commit(self, text="", user=None, date=None, match=None,
+ force=False, editor=False, extra={}):
+ self.abortifwdirpatched(
+ _('cannot commit over an applied mq patch'),
+ force)
+
+ return super(mqrepo, self).commit(text, user, date, match, force,
+ editor, extra)
+
+ def checkpush(self, force, revs):
+ if self.mq.applied and not force:
+ outapplied = [e.node for e in self.mq.applied]
+ if revs:
+ # Assume applied patches have no non-patch descendants and
+ # are not on remote already. Filtering any changeset not
+ # pushed.
+ heads = set(revs)
+ for node in reversed(outapplied):
+ if node in heads:
+ break
+ else:
+ outapplied.pop()
+ # looking for pushed and shared changeset
+ for node in outapplied:
+ if repo[node].phase() < phases.secret:
+ raise util.Abort(_('source has mq patches applied'))
+ # no non-secret patches pushed
+ super(mqrepo, self).checkpush(force, revs)
+
+ def _findtags(self):
+ '''augment tags from base class with patch tags'''
+ result = super(mqrepo, self)._findtags()
+
+ q = self.mq
+ if not q.applied:
+ return result
+
+ mqtags = [(patch.node, patch.name) for patch in q.applied]
+
+ try:
+ self.changelog.rev(mqtags[-1][0])
+ except error.LookupError:
+ self.ui.warn(_('mq status file refers to unknown node %s\n')
+ % short(mqtags[-1][0]))
+ return result
+
+ mqtags.append((mqtags[-1][0], 'qtip'))
+ mqtags.append((mqtags[0][0], 'qbase'))
+ mqtags.append((self.changelog.parents(mqtags[0][0])[0], 'qparent'))
+ tags = result[0]
+ for patch in mqtags:
+ if patch[1] in tags:
+ self.ui.warn(_('tag %s overrides mq patch of the same '
+ 'name\n') % patch[1])
+ else:
+ tags[patch[1]] = patch[0]
+
+ return result
+
+ def _branchtags(self, partial, lrev):
+ q = self.mq
+ cl = self.changelog
+ qbase = None
+ if not q.applied:
+ if getattr(self, '_committingpatch', False):
+ # Committing a new patch, must be tip
+ qbase = len(cl) - 1
+ else:
+ qbasenode = q.applied[0].node
+ try:
+ qbase = cl.rev(qbasenode)
+ except error.LookupError:
+ self.ui.warn(_('mq status file refers to unknown node %s\n')
+ % short(qbasenode))
+ if qbase is None:
+ return super(mqrepo, self)._branchtags(partial, lrev)
+
+ start = lrev + 1
+ if start < qbase:
+ # update the cache (excluding the patches) and save it
+ ctxgen = (self[r] for r in xrange(lrev + 1, qbase))
+ self._updatebranchcache(partial, ctxgen)
+ self._writebranchcache(partial, cl.node(qbase - 1), qbase - 1)
+ start = qbase
+ # if start = qbase, the cache is as updated as it should be.
+ # if start > qbase, the cache includes (part of) the patches.
+ # we might as well use it, but we won't save it.
+
+ # update the cache up to the tip
+ ctxgen = (self[r] for r in xrange(start, len(cl)))
+ self._updatebranchcache(partial, ctxgen)
+
+ return partial
+
+ if repo.local():
+ repo.__class__ = mqrepo
+
+ repo._phasedefaults.append(mqphasedefaults)
+
+def mqimport(orig, ui, repo, *args, **kwargs):
+ if (util.safehasattr(repo, 'abortifwdirpatched')
+ and not kwargs.get('no_commit', False)):
+ repo.abortifwdirpatched(_('cannot import over an applied patch'),
+ kwargs.get('force'))
+ return orig(ui, repo, *args, **kwargs)
+
+def mqinit(orig, ui, *args, **kwargs):
+ mq = kwargs.pop('mq', None)
+
+ if not mq:
+ return orig(ui, *args, **kwargs)
+
+ if args:
+ repopath = args[0]
+ if not hg.islocal(repopath):
+ raise util.Abort(_('only a local queue repository '
+ 'may be initialized'))
+ else:
+ repopath = cmdutil.findrepo(os.getcwd())
+ if not repopath:
+ raise util.Abort(_('there is no Mercurial repository here '
+ '(.hg not found)'))
+ repo = hg.repository(ui, repopath)
+ return qinit(ui, repo, True)
+
+def mqcommand(orig, ui, repo, *args, **kwargs):
+ """Add --mq option to operate on patch repository instead of main"""
+
+ # some commands do not like getting unknown options
+ mq = kwargs.pop('mq', None)
+
+ if not mq:
+ return orig(ui, repo, *args, **kwargs)
+
+ q = repo.mq
+ r = q.qrepo()
+ if not r:
+ raise util.Abort(_('no queue repository'))
+ return orig(r.ui, r, *args, **kwargs)
+
+def summary(orig, ui, repo, *args, **kwargs):
+ r = orig(ui, repo, *args, **kwargs)
+ q = repo.mq
+ m = []
+ a, u = len(q.applied), len(q.unapplied(repo))
+ if a:
+ m.append(ui.label(_("%d applied"), 'qseries.applied') % a)
+ if u:
+ m.append(ui.label(_("%d unapplied"), 'qseries.unapplied') % u)
+ if m:
+ ui.write("mq: %s\n" % ', '.join(m))
+ else:
+ ui.note(_("mq: (empty queue)\n"))
+ return r
+
+def revsetmq(repo, subset, x):
+ """``mq()``
+ Changesets managed by MQ.
+ """
+ revset.getargs(x, 0, 0, _("mq takes no arguments"))
+ applied = set([repo[r.node].rev() for r in repo.mq.applied])
+ return [r for r in subset if r in applied]
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = [revsetmq]
+
+def extsetup(ui):
+ # Ensure mq wrappers are called first, regardless of extension load order by
+ # NOT wrapping in uisetup() and instead deferring to init stage two here.
+ mqopt = [('', 'mq', None, _("operate on patch repository"))]
+
+ extensions.wrapcommand(commands.table, 'import', mqimport)
+ extensions.wrapcommand(commands.table, 'summary', summary)
+
+ entry = extensions.wrapcommand(commands.table, 'init', mqinit)
+ entry[1].extend(mqopt)
+
+ nowrap = set(commands.norepo.split(" "))
+
+ def dotable(cmdtable):
+ for cmd in cmdtable.keys():
+ cmd = cmdutil.parsealiases(cmd)[0]
+ if cmd in nowrap:
+ continue
+ entry = extensions.wrapcommand(cmdtable, cmd, mqcommand)
+ entry[1].extend(mqopt)
+
+ dotable(commands.table)
+
+ for extname, extmodule in extensions.extensions():
+ if extmodule.__file__ != __file__:
+ dotable(getattr(extmodule, 'cmdtable', {}))
+
+ revset.symbols['mq'] = revsetmq
+
+colortable = {'qguard.negative': 'red',
+ 'qguard.positive': 'yellow',
+ 'qguard.unguarded': 'green',
+ 'qseries.applied': 'blue bold underline',
+ 'qseries.guarded': 'black bold',
+ 'qseries.missing': 'red bold',
+ 'qseries.unapplied': 'black bold'}
diff --git a/hgext/notify.py b/hgext/notify.py
new file mode 100644
index 0000000..b0fbcee
--- /dev/null
+++ b/hgext/notify.py
@@ -0,0 +1,382 @@
+# notify.py - email notifications for mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''hooks for sending email push notifications
+
+This extension implements hooks to send email notifications when
+changesets are sent from or received by the local repository.
+
+First, enable the extension as explained in :hg:`help extensions`, and
+register the hook you want to run. ``incoming`` and ``changegroup`` hooks
+are run when changesets are received, while ``outgoing`` hooks are for
+changesets sent to another repository::
+
+ [hooks]
+ # one email for each incoming changeset
+ incoming.notify = python:hgext.notify.hook
+ # one email for all incoming changesets
+ changegroup.notify = python:hgext.notify.hook
+
+ # one email for all outgoing changesets
+ outgoing.notify = python:hgext.notify.hook
+
+This registers the hooks. To enable notification, subscribers must
+be assigned to repositories. The ``[usersubs]`` section maps multiple
+repositories to a given recipient. The ``[reposubs]`` section maps
+multiple recipients to a single repository::
+
+ [usersubs]
+ # key is subscriber email, value is a comma-separated list of repo glob
+ # patterns
+ user@host = pattern
+
+ [reposubs]
+ # key is glob pattern, value is a comma-separated list of subscriber
+ # emails
+ pattern = user@host
+
+Glob patterns are matched against absolute path to repository
+root.
+
+In order to place them under direct user management, ``[usersubs]`` and
+``[reposubs]`` sections may be placed in a separate ``hgrc`` file and
+incorporated by reference::
+
+ [notify]
+ config = /path/to/subscriptionsfile
+
+Notifications will not be sent until the ``notify.test`` value is set
+to ``False``; see below.
+
+Notifications content can be tweaked with the following configuration entries:
+
+notify.test
+ If ``True``, print messages to stdout instead of sending them. Default: True.
+
+notify.sources
+ Space-separated list of change sources. Notifications are activated only
+ when a changeset's source is in this list. Sources may be:
+
+ :``serve``: changesets received via http or ssh
+ :``pull``: changesets received via ``hg pull``
+ :``unbundle``: changesets received via ``hg unbundle``
+ :``push``: changesets sent or received via ``hg push``
+ :``bundle``: changesets sent via ``hg unbundle``
+
+ Default: serve.
+
+notify.strip
+ Number of leading slashes to strip from url paths. By default, notifications
+ reference repositories with their absolute path. ``notify.strip`` lets you
+ turn them into relative paths. For example, ``notify.strip=3`` will change
+ ``/long/path/repository`` into ``repository``. Default: 0.
+
+notify.domain
+ Default email domain for sender or recipients with no explicit domain.
+
+notify.style
+ Style file to use when formatting emails.
+
+notify.template
+ Template to use when formatting emails.
+
+notify.incoming
+ Template to use when run as an incoming hook, overriding ``notify.template``.
+
+notify.outgoing
+ Template to use when run as an outgoing hook, overriding ``notify.template``.
+
+notify.changegroup
+ Template to use when running as a changegroup hook, overriding
+ ``notify.template``.
+
+notify.maxdiff
+ Maximum number of diff lines to include in notification email. Set to 0
+ to disable the diff, or -1 to include all of it. Default: 300.
+
+notify.maxsubject
+ Maximum number of characters in email's subject line. Default: 67.
+
+notify.diffstat
+ Set to True to include a diffstat before diff content. Default: True.
+
+notify.merge
+ If True, send notifications for merge changesets. Default: True.
+
+notify.mbox
+ If set, append mails to this mbox file instead of sending. Default: None.
+
+notify.fromauthor
+ If set, use the committer of the first changeset in a changegroup for
+ the "From" field of the notification mail. If not set, take the user
+ from the pushing repo. Default: False.
+
+If set, the following entries will also be used to customize the
+notifications:
+
+email.from
+ Email ``From`` address to use if none can be found in the generated
+ email content.
+
+web.baseurl
+ Root repository URL to combine with repository paths when making
+ references. See also ``notify.strip``.
+
+'''
+
+from mercurial.i18n import _
+from mercurial import patch, cmdutil, templater, util, mail
+import email.Parser, email.Errors, fnmatch, socket, time
+
+testedwith = 'internal'
+
+# template for single changeset can include email headers.
+single_template = '''
+Subject: changeset in {webroot}: {desc|firstline|strip}
+From: {author}
+
+changeset {node|short} in {root}
+details: {baseurl}{webroot}?cmd=changeset;node={node|short}
+description:
+\t{desc|tabindent|strip}
+'''.lstrip()
+
+# template for multiple changesets should not contain email headers,
+# because only first set of headers will be used and result will look
+# strange.
+multiple_template = '''
+changeset {node|short} in {root}
+details: {baseurl}{webroot}?cmd=changeset;node={node|short}
+summary: {desc|firstline}
+'''
+
+deftemplates = {
+ 'changegroup': multiple_template,
+}
+
+class notifier(object):
+ '''email notification class.'''
+
+ def __init__(self, ui, repo, hooktype):
+ self.ui = ui
+ cfg = self.ui.config('notify', 'config')
+ if cfg:
+ self.ui.readconfig(cfg, sections=['usersubs', 'reposubs'])
+ self.repo = repo
+ self.stripcount = int(self.ui.config('notify', 'strip', 0))
+ self.root = self.strip(self.repo.root)
+ self.domain = self.ui.config('notify', 'domain')
+ self.mbox = self.ui.config('notify', 'mbox')
+ self.test = self.ui.configbool('notify', 'test', True)
+ self.charsets = mail._charsets(self.ui)
+ self.subs = self.subscribers()
+ self.merge = self.ui.configbool('notify', 'merge', True)
+
+ mapfile = self.ui.config('notify', 'style')
+ template = (self.ui.config('notify', hooktype) or
+ self.ui.config('notify', 'template'))
+ self.t = cmdutil.changeset_templater(self.ui, self.repo,
+ False, None, mapfile, False)
+ if not mapfile and not template:
+ template = deftemplates.get(hooktype) or single_template
+ if template:
+ template = templater.parsestring(template, quoted=False)
+ self.t.use_template(template)
+
+ def strip(self, path):
+ '''strip leading slashes from local path, turn into web-safe path.'''
+
+ path = util.pconvert(path)
+ count = self.stripcount
+ while count > 0:
+ c = path.find('/')
+ if c == -1:
+ break
+ path = path[c + 1:]
+ count -= 1
+ return path
+
+ def fixmail(self, addr):
+ '''try to clean up email addresses.'''
+
+ addr = util.email(addr.strip())
+ if self.domain:
+ a = addr.find('@localhost')
+ if a != -1:
+ addr = addr[:a]
+ if '@' not in addr:
+ return addr + '@' + self.domain
+ return addr
+
+ def subscribers(self):
+ '''return list of email addresses of subscribers to this repo.'''
+ subs = set()
+ for user, pats in self.ui.configitems('usersubs'):
+ for pat in pats.split(','):
+ if fnmatch.fnmatch(self.repo.root, pat.strip()):
+ subs.add(self.fixmail(user))
+ for pat, users in self.ui.configitems('reposubs'):
+ if fnmatch.fnmatch(self.repo.root, pat):
+ for user in users.split(','):
+ subs.add(self.fixmail(user))
+ return [mail.addressencode(self.ui, s, self.charsets, self.test)
+ for s in sorted(subs)]
+
+ def node(self, ctx, **props):
+ '''format one changeset, unless it is a suppressed merge.'''
+ if not self.merge and len(ctx.parents()) > 1:
+ return False
+ self.t.show(ctx, changes=ctx.changeset(),
+ baseurl=self.ui.config('web', 'baseurl'),
+ root=self.repo.root, webroot=self.root, **props)
+ return True
+
+ def skipsource(self, source):
+ '''true if incoming changes from this source should be skipped.'''
+ ok_sources = self.ui.config('notify', 'sources', 'serve').split()
+ return source not in ok_sources
+
+ def send(self, ctx, count, data):
+ '''send message.'''
+
+ p = email.Parser.Parser()
+ try:
+ msg = p.parsestr(data)
+ except email.Errors.MessageParseError, inst:
+ raise util.Abort(inst)
+
+ # store sender and subject
+ sender, subject = msg['From'], msg['Subject']
+ del msg['From'], msg['Subject']
+
+ if not msg.is_multipart():
+ # create fresh mime message from scratch
+ # (multipart templates must take care of this themselves)
+ headers = msg.items()
+ payload = msg.get_payload()
+ # for notification prefer readability over data precision
+ msg = mail.mimeencode(self.ui, payload, self.charsets, self.test)
+ # reinstate custom headers
+ for k, v in headers:
+ msg[k] = v
+
+ msg['Date'] = util.datestr(format="%a, %d %b %Y %H:%M:%S %1%2")
+
+ # try to make subject line exist and be useful
+ if not subject:
+ if count > 1:
+ subject = _('%s: %d new changesets') % (self.root, count)
+ else:
+ s = ctx.description().lstrip().split('\n', 1)[0].rstrip()
+ subject = '%s: %s' % (self.root, s)
+ maxsubject = int(self.ui.config('notify', 'maxsubject', 67))
+ if maxsubject:
+ subject = util.ellipsis(subject, maxsubject)
+ msg['Subject'] = mail.headencode(self.ui, subject,
+ self.charsets, self.test)
+
+ # try to make message have proper sender
+ if not sender:
+ sender = self.ui.config('email', 'from') or self.ui.username()
+ if '@' not in sender or '@localhost' in sender:
+ sender = self.fixmail(sender)
+ msg['From'] = mail.addressencode(self.ui, sender,
+ self.charsets, self.test)
+
+ msg['X-Hg-Notification'] = 'changeset %s' % ctx
+ if not msg['Message-Id']:
+ msg['Message-Id'] = ('<hg.%s.%s.%s@%s>' %
+ (ctx, int(time.time()),
+ hash(self.repo.root), socket.getfqdn()))
+ msg['To'] = ', '.join(self.subs)
+
+ msgtext = msg.as_string()
+ if self.test:
+ self.ui.write(msgtext)
+ if not msgtext.endswith('\n'):
+ self.ui.write('\n')
+ else:
+ self.ui.status(_('notify: sending %d subscribers %d changes\n') %
+ (len(self.subs), count))
+ mail.sendmail(self.ui, util.email(msg['From']),
+ self.subs, msgtext, mbox=self.mbox)
+
+ def diff(self, ctx, ref=None):
+
+ maxdiff = int(self.ui.config('notify', 'maxdiff', 300))
+ prev = ctx.p1().node()
+ ref = ref and ref.node() or ctx.node()
+ chunks = patch.diff(self.repo, prev, ref, opts=patch.diffopts(self.ui))
+ difflines = ''.join(chunks).splitlines()
+
+ if self.ui.configbool('notify', 'diffstat', True):
+ s = patch.diffstat(difflines)
+ # s may be nil, don't include the header if it is
+ if s:
+ self.ui.write('\ndiffstat:\n\n%s' % s)
+
+ if maxdiff == 0:
+ return
+ elif maxdiff > 0 and len(difflines) > maxdiff:
+ msg = _('\ndiffs (truncated from %d to %d lines):\n\n')
+ self.ui.write(msg % (len(difflines), maxdiff))
+ difflines = difflines[:maxdiff]
+ elif difflines:
+ self.ui.write(_('\ndiffs (%d lines):\n\n') % len(difflines))
+
+ self.ui.write("\n".join(difflines))
+
+def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
+ '''send email notifications to interested subscribers.
+
+ if used as changegroup hook, send one email for all changesets in
+ changegroup. else send one email per changeset.'''
+
+ n = notifier(ui, repo, hooktype)
+ ctx = repo[node]
+
+ if not n.subs:
+ ui.debug('notify: no subscribers to repository %s\n' % n.root)
+ return
+ if n.skipsource(source):
+ ui.debug('notify: changes have source "%s" - skipping\n' % source)
+ return
+
+ ui.pushbuffer()
+ data = ''
+ count = 0
+ author = ''
+ if hooktype == 'changegroup' or hooktype == 'outgoing':
+ start, end = ctx.rev(), len(repo)
+ for rev in xrange(start, end):
+ if n.node(repo[rev]):
+ count += 1
+ if not author:
+ author = repo[rev].user()
+ else:
+ data += ui.popbuffer()
+ ui.note(_('notify: suppressing notification for merge %d:%s\n')
+ % (rev, repo[rev].hex()[:12]))
+ ui.pushbuffer()
+ if count:
+ n.diff(ctx, repo['tip'])
+ else:
+ if not n.node(ctx):
+ ui.popbuffer()
+ ui.note(_('notify: suppressing notification for merge %d:%s\n') %
+ (ctx.rev(), ctx.hex()[:12]))
+ return
+ count += 1
+ n.diff(ctx)
+
+ data += ui.popbuffer()
+ fromauthor = ui.config('notify', 'fromauthor')
+ if author and fromauthor:
+ data = '\n'.join(['From: %s' % author, data])
+
+ if count:
+ n.send(ctx, count, data)
diff --git a/hgext/pager.py b/hgext/pager.py
new file mode 100644
index 0000000..ae430ef
--- /dev/null
+++ b/hgext/pager.py
@@ -0,0 +1,140 @@
+# pager.py - display output using a pager
+#
+# Copyright 2008 David Soria Parra <dsp@php.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# To load the extension, add it to your configuration file:
+#
+# [extension]
+# pager =
+#
+# Run "hg help pager" to get info on configuration.
+
+'''browse command output with an external pager
+
+To set the pager that should be used, set the application variable::
+
+ [pager]
+ pager = less -FRX
+
+If no pager is set, the pager extensions uses the environment variable
+$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used.
+
+You can disable the pager for certain commands by adding them to the
+pager.ignore list::
+
+ [pager]
+ ignore = version, help, update
+
+You can also enable the pager only for certain commands using
+pager.attend. Below is the default list of commands to be paged::
+
+ [pager]
+ attend = annotate, cat, diff, export, glog, log, qdiff
+
+Setting pager.attend to an empty value will cause all commands to be
+paged.
+
+If pager.attend is present, pager.ignore will be ignored.
+
+To ignore global commands like :hg:`version` or :hg:`help`, you have
+to specify them in your user configuration file.
+
+The --pager=... option can also be used to control when the pager is
+used. Use a boolean value like yes, no, on, off, or use auto for
+normal behavior.
+'''
+
+import atexit, sys, os, signal, subprocess
+from mercurial import commands, dispatch, util, extensions
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+def _pagerfork(ui, p):
+ if not util.safehasattr(os, 'fork'):
+ sys.stdout = util.popen(p, 'wb')
+ if ui._isatty(sys.stderr):
+ sys.stderr = sys.stdout
+ return
+ fdin, fdout = os.pipe()
+ pid = os.fork()
+ if pid == 0:
+ os.close(fdin)
+ os.dup2(fdout, sys.stdout.fileno())
+ if ui._isatty(sys.stderr):
+ os.dup2(fdout, sys.stderr.fileno())
+ os.close(fdout)
+ return
+ os.dup2(fdin, sys.stdin.fileno())
+ os.close(fdin)
+ os.close(fdout)
+ try:
+ os.execvp('/bin/sh', ['/bin/sh', '-c', p])
+ except OSError, e:
+ if e.errno == errno.ENOENT:
+ # no /bin/sh, try executing the pager directly
+ args = shlex.split(p)
+ os.execvp(args[0], args)
+ else:
+ raise
+
+def _pagersubprocess(ui, p):
+ pager = subprocess.Popen(p, shell=True, bufsize=-1,
+ close_fds=util.closefds, stdin=subprocess.PIPE,
+ stdout=sys.stdout, stderr=sys.stderr)
+
+ stdout = os.dup(sys.stdout.fileno())
+ stderr = os.dup(sys.stderr.fileno())
+ os.dup2(pager.stdin.fileno(), sys.stdout.fileno())
+ if ui._isatty(sys.stderr):
+ os.dup2(pager.stdin.fileno(), sys.stderr.fileno())
+
+ @atexit.register
+ def killpager():
+ pager.stdin.close()
+ os.dup2(stdout, sys.stdout.fileno())
+ os.dup2(stderr, sys.stderr.fileno())
+ pager.wait()
+
+def _runpager(ui, p):
+ # The subprocess module shipped with Python <= 2.4 is buggy (issue3533).
+ # The compat version is buggy on Windows (issue3225), but has been shipping
+ # with hg for a long time. Preserve existing functionality.
+ if sys.version_info >= (2, 5):
+ _pagersubprocess(ui, p)
+ else:
+ _pagerfork(ui, p)
+
+def uisetup(ui):
+ if '--debugger' in sys.argv or not ui.formatted():
+ return
+
+ def pagecmd(orig, ui, options, cmd, cmdfunc):
+ p = ui.config("pager", "pager", os.environ.get("PAGER"))
+
+ if p:
+ attend = ui.configlist('pager', 'attend', attended)
+ auto = options['pager'] == 'auto'
+ always = util.parsebool(options['pager'])
+ if (always or auto and
+ (cmd in attend or
+ (cmd not in ui.configlist('pager', 'ignore') and not attend))):
+ ui.setconfig('ui', 'formatted', ui.formatted())
+ ui.setconfig('ui', 'interactive', False)
+ if util.safehasattr(signal, "SIGPIPE"):
+ signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+ _runpager(ui, p)
+ return orig(ui, options, cmd, cmdfunc)
+
+ extensions.wrapfunction(dispatch, '_runcommand', pagecmd)
+
+def extsetup(ui):
+ commands.globalopts.append(
+ ('', 'pager', 'auto',
+ _("when to paginate (boolean, always, auto, or never)"),
+ _('TYPE')))
+
+attended = ['annotate', 'cat', 'diff', 'export', 'glog', 'log', 'qdiff']
diff --git a/hgext/patchbomb.py b/hgext/patchbomb.py
new file mode 100644
index 0000000..7ac8e27
--- /dev/null
+++ b/hgext/patchbomb.py
@@ -0,0 +1,558 @@
+# patchbomb.py - sending Mercurial changesets as patch emails
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to send changesets as (a series of) patch emails
+
+The series is started off with a "[PATCH 0 of N]" introduction, which
+describes the series as a whole.
+
+Each patch email has a Subject line of "[PATCH M of N] ...", using the
+first line of the changeset description as the subject text. The
+message contains two or three body parts:
+
+- The changeset description.
+- [Optional] The result of running diffstat on the patch.
+- The patch itself, as generated by :hg:`export`.
+
+Each message refers to the first in the series using the In-Reply-To
+and References headers, so they will show up as a sequence in threaded
+mail and news readers, and in mail archives.
+
+To configure other defaults, add a section like this to your
+configuration file::
+
+ [email]
+ from = My Name <my@email>
+ to = recipient1, recipient2, ...
+ cc = cc1, cc2, ...
+ bcc = bcc1, bcc2, ...
+ reply-to = address1, address2, ...
+
+Use ``[patchbomb]`` as configuration section name if you need to
+override global ``[email]`` address settings.
+
+Then you can use the :hg:`email` command to mail a series of
+changesets as a patchbomb.
+
+You can also either configure the method option in the email section
+to be a sendmail compatible mailer or fill out the [smtp] section so
+that the patchbomb extension can automatically send patchbombs
+directly from the commandline. See the [email] and [smtp] sections in
+hgrc(5) for details.
+'''
+
+import os, errno, socket, tempfile, cStringIO
+import email.MIMEMultipart, email.MIMEBase
+import email.Utils, email.Encoders, email.Generator
+from mercurial import cmdutil, commands, hg, mail, patch, util
+from mercurial import scmutil
+from mercurial.i18n import _
+from mercurial.node import bin
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+def prompt(ui, prompt, default=None, rest=':'):
+ if default:
+ prompt += ' [%s]' % default
+ return ui.prompt(prompt + rest, default)
+
+def introwanted(opts, number):
+ '''is an introductory message apparently wanted?'''
+ return number > 1 or opts.get('intro') or opts.get('desc')
+
+def makepatch(ui, repo, patchlines, opts, _charsets, idx, total, numbered,
+ patchname=None):
+
+ desc = []
+ node = None
+ body = ''
+
+ for line in patchlines:
+ if line.startswith('#'):
+ if line.startswith('# Node ID'):
+ node = line.split()[-1]
+ continue
+ if line.startswith('diff -r') or line.startswith('diff --git'):
+ break
+ desc.append(line)
+
+ if not patchname and not node:
+ raise ValueError
+
+ if opts.get('attach') and not opts.get('body'):
+ body = ('\n'.join(desc[1:]).strip() or
+ 'Patch subject is complete summary.')
+ body += '\n\n\n'
+
+ if opts.get('plain'):
+ while patchlines and patchlines[0].startswith('# '):
+ patchlines.pop(0)
+ if patchlines:
+ patchlines.pop(0)
+ while patchlines and not patchlines[0].strip():
+ patchlines.pop(0)
+
+ ds = patch.diffstat(patchlines, git=opts.get('git'))
+ if opts.get('diffstat'):
+ body += ds + '\n\n'
+
+ addattachment = opts.get('attach') or opts.get('inline')
+ if not addattachment or opts.get('body'):
+ body += '\n'.join(patchlines)
+
+ if addattachment:
+ msg = email.MIMEMultipart.MIMEMultipart()
+ if body:
+ msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
+ p = mail.mimetextpatch('\n'.join(patchlines), 'x-patch',
+ opts.get('test'))
+ binnode = bin(node)
+ # if node is mq patch, it will have the patch file's name as a tag
+ if not patchname:
+ patchtags = [t for t in repo.nodetags(binnode)
+ if t.endswith('.patch') or t.endswith('.diff')]
+ if patchtags:
+ patchname = patchtags[0]
+ elif total > 1:
+ patchname = cmdutil.makefilename(repo, '%b-%n.patch',
+ binnode, seqno=idx,
+ total=total)
+ else:
+ patchname = cmdutil.makefilename(repo, '%b.patch', binnode)
+ disposition = 'inline'
+ if opts.get('attach'):
+ disposition = 'attachment'
+ p['Content-Disposition'] = disposition + '; filename=' + patchname
+ msg.attach(p)
+ else:
+ msg = mail.mimetextpatch(body, display=opts.get('test'))
+
+ flag = ' '.join(opts.get('flag'))
+ if flag:
+ flag = ' ' + flag
+
+ subj = desc[0].strip().rstrip('. ')
+ if not numbered:
+ subj = '[PATCH%s] %s' % (flag, opts.get('subject') or subj)
+ else:
+ tlen = len(str(total))
+ subj = '[PATCH %0*d of %d%s] %s' % (tlen, idx, total, flag, subj)
+ msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
+ msg['X-Mercurial-Node'] = node
+ return msg, subj, ds
+
+emailopts = [
+ ('', 'body', None, _('send patches as inline message text (default)')),
+ ('a', 'attach', None, _('send patches as attachments')),
+ ('i', 'inline', None, _('send patches as inline attachments')),
+ ('', 'bcc', [], _('email addresses of blind carbon copy recipients')),
+ ('c', 'cc', [], _('email addresses of copy recipients')),
+ ('', 'confirm', None, _('ask for confirmation before sending')),
+ ('d', 'diffstat', None, _('add diffstat output to messages')),
+ ('', 'date', '', _('use the given date as the sending date')),
+ ('', 'desc', '', _('use the given file as the series description')),
+ ('f', 'from', '', _('email address of sender')),
+ ('n', 'test', None, _('print messages that would be sent')),
+ ('m', 'mbox', '', _('write messages to mbox file instead of sending them')),
+ ('', 'reply-to', [], _('email addresses replies should be sent to')),
+ ('s', 'subject', '', _('subject of first message (intro or single patch)')),
+ ('', 'in-reply-to', '', _('message identifier to reply to')),
+ ('', 'flag', [], _('flags to add in subject prefixes')),
+ ('t', 'to', [], _('email addresses of recipients'))]
+
+@command('email',
+ [('g', 'git', None, _('use git extended diff format')),
+ ('', 'plain', None, _('omit hg patch header')),
+ ('o', 'outgoing', None,
+ _('send changes not found in the target repository')),
+ ('b', 'bundle', None, _('send changes not in target as a binary bundle')),
+ ('', 'bundlename', 'bundle',
+ _('name of the bundle attachment file'), _('NAME')),
+ ('r', 'rev', [], _('a revision to send'), _('REV')),
+ ('', 'force', None, _('run even when remote repository is unrelated '
+ '(with -b/--bundle)')),
+ ('', 'base', [], _('a base changeset to specify instead of a destination '
+ '(with -b/--bundle)'), _('REV')),
+ ('', 'intro', None, _('send an introduction email for a single patch')),
+ ] + emailopts + commands.remoteopts,
+ _('hg email [OPTION]... [DEST]...'))
+def patchbomb(ui, repo, *revs, **opts):
+ '''send changesets by email
+
+ By default, diffs are sent in the format generated by
+ :hg:`export`, one per message. The series starts with a "[PATCH 0
+ of N]" introduction, which describes the series as a whole.
+
+ Each patch email has a Subject line of "[PATCH M of N] ...", using
+ the first line of the changeset description as the subject text.
+ The message contains two or three parts. First, the changeset
+ description.
+
+ With the -d/--diffstat option, if the diffstat program is
+ installed, the result of running diffstat on the patch is inserted.
+
+ Finally, the patch itself, as generated by :hg:`export`.
+
+ With the -d/--diffstat or -c/--confirm options, you will be presented
+ with a final summary of all messages and asked for confirmation before
+ the messages are sent.
+
+ By default the patch is included as text in the email body for
+ easy reviewing. Using the -a/--attach option will instead create
+ an attachment for the patch. With -i/--inline an inline attachment
+ will be created. You can include a patch both as text in the email
+ body and as a regular or an inline attachment by combining the
+ -a/--attach or -i/--inline with the --body option.
+
+ With -o/--outgoing, emails will be generated for patches not found
+ in the destination repository (or only those which are ancestors
+ of the specified revisions if any are provided)
+
+ With -b/--bundle, changesets are selected as for --outgoing, but a
+ single email containing a binary Mercurial bundle as an attachment
+ will be sent.
+
+ With -m/--mbox, instead of previewing each patchbomb message in a
+ pager or sending the messages directly, it will create a UNIX
+ mailbox file with the patch emails. This mailbox file can be
+ previewed with any mail user agent which supports UNIX mbox
+ files.
+
+ With -n/--test, all steps will run, but mail will not be sent.
+ You will be prompted for an email recipient address, a subject and
+ an introductory message describing the patches of your patchbomb.
+ Then when all is done, patchbomb messages are displayed. If the
+ PAGER environment variable is set, your pager will be fired up once
+ for each patchbomb message, so you can verify everything is alright.
+
+ In case email sending fails, you will find a backup of your series
+ introductory message in ``.hg/last-email.txt``.
+
+ Examples::
+
+ hg email -r 3000 # send patch 3000 only
+ hg email -r 3000 -r 3001 # send patches 3000 and 3001
+ hg email -r 3000:3005 # send patches 3000 through 3005
+ hg email 3000 # send patch 3000 (deprecated)
+
+ hg email -o # send all patches not in default
+ hg email -o DEST # send all patches not in DEST
+ hg email -o -r 3000 # send all ancestors of 3000 not in default
+ hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST
+
+ hg email -b # send bundle of all patches not in default
+ hg email -b DEST # send bundle of all patches not in DEST
+ hg email -b -r 3000 # bundle of all ancestors of 3000 not in default
+ hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST
+
+ hg email -o -m mbox && # generate an mbox file...
+ mutt -R -f mbox # ... and view it with mutt
+ hg email -o -m mbox && # generate an mbox file ...
+ formail -s sendmail \\ # ... and use formail to send from the mbox
+ -bm -t < mbox # ... using sendmail
+
+ Before using this command, you will need to enable email in your
+ hgrc. See the [email] section in hgrc(5) for details.
+ '''
+
+ _charsets = mail._charsets(ui)
+
+ bundle = opts.get('bundle')
+ date = opts.get('date')
+ mbox = opts.get('mbox')
+ outgoing = opts.get('outgoing')
+ rev = opts.get('rev')
+ # internal option used by pbranches
+ patches = opts.get('patches')
+
+ def getoutgoing(dest, revs):
+ '''Return the revisions present locally but not in dest'''
+ url = ui.expandpath(dest or 'default-push', dest or 'default')
+ url = hg.parseurl(url)[0]
+ ui.status(_('comparing with %s\n') % util.hidepassword(url))
+
+ revs = [r for r in scmutil.revrange(repo, revs) if r >= 0]
+ if not revs:
+ revs = [len(repo) - 1]
+ revs = repo.revs('outgoing(%s) and ::%ld', dest or '', revs)
+ if not revs:
+ ui.status(_("no changes found\n"))
+ return []
+ return [str(r) for r in revs]
+
+ def getpatches(revs):
+ for r in scmutil.revrange(repo, revs):
+ output = cStringIO.StringIO()
+ cmdutil.export(repo, [r], fp=output,
+ opts=patch.diffopts(ui, opts))
+ yield output.getvalue().split('\n')
+
+ def getbundle(dest):
+ tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-')
+ tmpfn = os.path.join(tmpdir, 'bundle')
+ try:
+ commands.bundle(ui, repo, tmpfn, dest, **opts)
+ fp = open(tmpfn, 'rb')
+ data = fp.read()
+ fp.close()
+ return data
+ finally:
+ try:
+ os.unlink(tmpfn)
+ except OSError:
+ pass
+ os.rmdir(tmpdir)
+
+ if not (opts.get('test') or mbox):
+ # really sending
+ mail.validateconfig(ui)
+
+ if not (revs or rev or outgoing or bundle or patches):
+ raise util.Abort(_('specify at least one changeset with -r or -o'))
+
+ if outgoing and bundle:
+ raise util.Abort(_("--outgoing mode always on with --bundle;"
+ " do not re-specify --outgoing"))
+
+ if outgoing or bundle:
+ if len(revs) > 1:
+ raise util.Abort(_("too many destinations"))
+ dest = revs and revs[0] or None
+ revs = []
+
+ if rev:
+ if revs:
+ raise util.Abort(_('use only one form to specify the revision'))
+ revs = rev
+
+ if outgoing:
+ revs = getoutgoing(dest, rev)
+ if bundle:
+ opts['revs'] = revs
+
+ # start
+ if date:
+ start_time = util.parsedate(date)
+ else:
+ start_time = util.makedate()
+
+ def genmsgid(id):
+ return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
+
+ def getdescription(body, sender):
+ if opts.get('desc'):
+ body = open(opts.get('desc')).read()
+ else:
+ ui.write(_('\nWrite the introductory message for the '
+ 'patch series.\n\n'))
+ body = ui.edit(body, sender)
+ # Save series description in case sendmail fails
+ msgfile = repo.opener('last-email.txt', 'wb')
+ msgfile.write(body)
+ msgfile.close()
+ return body
+
+ def getpatchmsgs(patches, patchnames=None):
+ msgs = []
+
+ ui.write(_('this patch series consists of %d patches.\n\n')
+ % len(patches))
+
+ # build the intro message, or skip it if the user declines
+ if introwanted(opts, len(patches)):
+ msg = makeintro(patches)
+ if msg:
+ msgs.append(msg)
+
+ # are we going to send more than one message?
+ numbered = len(msgs) + len(patches) > 1
+
+ # now generate the actual patch messages
+ name = None
+ for i, p in enumerate(patches):
+ if patchnames:
+ name = patchnames[i]
+ msg = makepatch(ui, repo, p, opts, _charsets, i + 1,
+ len(patches), numbered, name)
+ msgs.append(msg)
+
+ return msgs
+
+ def makeintro(patches):
+ tlen = len(str(len(patches)))
+
+ flag = opts.get('flag') or ''
+ if flag:
+ flag = ' ' + ' '.join(flag)
+ prefix = '[PATCH %0*d of %d%s]' % (tlen, 0, len(patches), flag)
+
+ subj = (opts.get('subject') or
+ prompt(ui, '(optional) Subject: ', rest=prefix, default=''))
+ if not subj:
+ return None # skip intro if the user doesn't bother
+
+ subj = prefix + ' ' + subj
+
+ body = ''
+ if opts.get('diffstat'):
+ # generate a cumulative diffstat of the whole patch series
+ diffstat = patch.diffstat(sum(patches, []))
+ body = '\n' + diffstat
+ else:
+ diffstat = None
+
+ body = getdescription(body, sender)
+ msg = mail.mimeencode(ui, body, _charsets, opts.get('test'))
+ msg['Subject'] = mail.headencode(ui, subj, _charsets,
+ opts.get('test'))
+ return (msg, subj, diffstat)
+
+ def getbundlemsgs(bundle):
+ subj = (opts.get('subject')
+ or prompt(ui, 'Subject:', 'A bundle for your repository'))
+
+ body = getdescription('', sender)
+ msg = email.MIMEMultipart.MIMEMultipart()
+ if body:
+ msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
+ datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle')
+ datapart.set_payload(bundle)
+ bundlename = '%s.hg' % opts.get('bundlename', 'bundle')
+ datapart.add_header('Content-Disposition', 'attachment',
+ filename=bundlename)
+ email.Encoders.encode_base64(datapart)
+ msg.attach(datapart)
+ msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
+ return [(msg, subj, None)]
+
+ sender = (opts.get('from') or ui.config('email', 'from') or
+ ui.config('patchbomb', 'from') or
+ prompt(ui, 'From', ui.username()))
+
+ if patches:
+ msgs = getpatchmsgs(patches, opts.get('patchnames'))
+ elif bundle:
+ msgs = getbundlemsgs(getbundle(dest))
+ else:
+ msgs = getpatchmsgs(list(getpatches(revs)))
+
+ showaddrs = []
+
+ def getaddrs(header, ask=False, default=None):
+ configkey = header.lower()
+ opt = header.replace('-', '_').lower()
+ addrs = opts.get(opt)
+ if addrs:
+ showaddrs.append('%s: %s' % (header, ', '.join(addrs)))
+ return mail.addrlistencode(ui, addrs, _charsets, opts.get('test'))
+
+ # not on the command line: fallback to config and then maybe ask
+ addr = (ui.config('email', configkey) or
+ ui.config('patchbomb', configkey) or
+ '')
+ if not addr and ask:
+ addr = prompt(ui, header, default=default)
+ if addr:
+ showaddrs.append('%s: %s' % (header, addr))
+ return mail.addrlistencode(ui, [addr], _charsets, opts.get('test'))
+ else:
+ return default
+
+ to = getaddrs('To', ask=True)
+ if not to:
+ # we can get here in non-interactive mode
+ raise util.Abort(_('no recipient addresses provided'))
+ cc = getaddrs('Cc', ask=True, default='') or []
+ bcc = getaddrs('Bcc') or []
+ replyto = getaddrs('Reply-To')
+
+ if opts.get('diffstat') or opts.get('confirm'):
+ ui.write(_('\nFinal summary:\n\n'))
+ ui.write('From: %s\n' % sender)
+ for addr in showaddrs:
+ ui.write('%s\n' % addr)
+ for m, subj, ds in msgs:
+ ui.write('Subject: %s\n' % subj)
+ if ds:
+ ui.write(ds)
+ ui.write('\n')
+ if ui.promptchoice(_('are you sure you want to send (yn)?'),
+ (_('&Yes'), _('&No'))):
+ raise util.Abort(_('patchbomb canceled'))
+
+ ui.write('\n')
+
+ parent = opts.get('in_reply_to') or None
+ # angle brackets may be omitted, they're not semantically part of the msg-id
+ if parent is not None:
+ if not parent.startswith('<'):
+ parent = '<' + parent
+ if not parent.endswith('>'):
+ parent += '>'
+
+ first = True
+
+ sender_addr = email.Utils.parseaddr(sender)[1]
+ sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
+ sendmail = None
+ for i, (m, subj, ds) in enumerate(msgs):
+ try:
+ m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
+ except TypeError:
+ m['Message-Id'] = genmsgid('patchbomb')
+ if parent:
+ m['In-Reply-To'] = parent
+ m['References'] = parent
+ if first:
+ parent = m['Message-Id']
+ first = False
+
+ m['User-Agent'] = 'Mercurial-patchbomb/%s' % util.version()
+ m['Date'] = email.Utils.formatdate(start_time[0], localtime=True)
+
+ start_time = (start_time[0] + 1, start_time[1])
+ m['From'] = sender
+ m['To'] = ', '.join(to)
+ if cc:
+ m['Cc'] = ', '.join(cc)
+ if bcc:
+ m['Bcc'] = ', '.join(bcc)
+ if replyto:
+ m['Reply-To'] = ', '.join(replyto)
+ if opts.get('test'):
+ ui.status(_('displaying '), subj, ' ...\n')
+ ui.flush()
+ if 'PAGER' in os.environ and not ui.plain():
+ fp = util.popen(os.environ['PAGER'], 'w')
+ else:
+ fp = ui
+ generator = email.Generator.Generator(fp, mangle_from_=False)
+ try:
+ generator.flatten(m, 0)
+ fp.write('\n')
+ except IOError, inst:
+ if inst.errno != errno.EPIPE:
+ raise
+ if fp is not ui:
+ fp.close()
+ else:
+ if not sendmail:
+ sendmail = mail.connect(ui, mbox=mbox)
+ ui.status(_('sending '), subj, ' ...\n')
+ ui.progress(_('sending'), i, item=subj, total=len(msgs))
+ if not mbox:
+ # Exim does not remove the Bcc field
+ del m['Bcc']
+ fp = cStringIO.StringIO()
+ generator = email.Generator.Generator(fp, mangle_from_=False)
+ generator.flatten(m, 0)
+ sendmail(sender_addr, to + bcc + cc, fp.getvalue())
+
+ ui.progress(_('writing'), None)
+ ui.progress(_('sending'), None)
diff --git a/hgext/progress.py b/hgext/progress.py
new file mode 100644
index 0000000..3cc3747
--- /dev/null
+++ b/hgext/progress.py
@@ -0,0 +1,295 @@
+# progress.py show progress bars for some actions
+#
+# Copyright (C) 2010 Augie Fackler <durin42@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""show progress bars for some actions
+
+This extension uses the progress information logged by hg commands
+to draw progress bars that are as informative as possible. Some progress
+bars only offer indeterminate information, while others have a definite
+end point.
+
+The following settings are available::
+
+ [progress]
+ delay = 3 # number of seconds (float) before showing the progress bar
+ changedelay = 1 # changedelay: minimum delay before showing a new topic.
+ # If set to less than 3 * refresh, that value will
+ # be used instead.
+ refresh = 0.1 # time in seconds between refreshes of the progress bar
+ format = topic bar number estimate # format of the progress bar
+ width = <none> # if set, the maximum width of the progress information
+ # (that is, min(width, term width) will be used)
+ clear-complete = True # clear the progress bar after it's done
+ disable = False # if true, don't show a progress bar
+ assume-tty = False # if true, ALWAYS show a progress bar, unless
+ # disable is given
+
+Valid entries for the format field are topic, bar, number, unit,
+estimate, speed, and item. item defaults to the last 20 characters of
+the item, but this can be changed by adding either ``-<num>`` which
+would take the last num characters, or ``+<num>`` for the first num
+characters.
+"""
+
+import sys
+import time
+
+from mercurial.i18n import _
+testedwith = 'internal'
+
+def spacejoin(*args):
+ return ' '.join(s for s in args if s)
+
+def shouldprint(ui):
+ return ui._isatty(sys.stderr) or ui.configbool('progress', 'assume-tty')
+
+def fmtremaining(seconds):
+ if seconds < 60:
+ # i18n: format XX seconds as "XXs"
+ return _("%02ds") % (seconds)
+ minutes = seconds // 60
+ if minutes < 60:
+ seconds -= minutes * 60
+ # i18n: format X minutes and YY seconds as "XmYYs"
+ return _("%dm%02ds") % (minutes, seconds)
+ # we're going to ignore seconds in this case
+ minutes += 1
+ hours = minutes // 60
+ minutes -= hours * 60
+ if hours < 30:
+ # i18n: format X hours and YY minutes as "XhYYm"
+ return _("%dh%02dm") % (hours, minutes)
+ # we're going to ignore minutes in this case
+ hours += 1
+ days = hours // 24
+ hours -= days * 24
+ if days < 15:
+ # i18n: format X days and YY hours as "XdYYh"
+ return _("%dd%02dh") % (days, hours)
+ # we're going to ignore hours in this case
+ days += 1
+ weeks = days // 7
+ days -= weeks * 7
+ if weeks < 55:
+ # i18n: format X weeks and YY days as "XwYYd"
+ return _("%dw%02dd") % (weeks, days)
+ # we're going to ignore days and treat a year as 52 weeks
+ weeks += 1
+ years = weeks // 52
+ weeks -= years * 52
+ # i18n: format X years and YY weeks as "XyYYw"
+ return _("%dy%02dw") % (years, weeks)
+
+class progbar(object):
+ def __init__(self, ui):
+ self.ui = ui
+ self.resetstate()
+
+ def resetstate(self):
+ self.topics = []
+ self.topicstates = {}
+ self.starttimes = {}
+ self.startvals = {}
+ self.printed = False
+ self.lastprint = time.time() + float(self.ui.config(
+ 'progress', 'delay', default=3))
+ self.lasttopic = None
+ self.indetcount = 0
+ self.refresh = float(self.ui.config(
+ 'progress', 'refresh', default=0.1))
+ self.changedelay = max(3 * self.refresh,
+ float(self.ui.config(
+ 'progress', 'changedelay', default=1)))
+ self.order = self.ui.configlist(
+ 'progress', 'format',
+ default=['topic', 'bar', 'number', 'estimate'])
+
+ def show(self, now, topic, pos, item, unit, total):
+ if not shouldprint(self.ui):
+ return
+ termwidth = self.width()
+ self.printed = True
+ head = ''
+ needprogress = False
+ tail = ''
+ for indicator in self.order:
+ add = ''
+ if indicator == 'topic':
+ add = topic
+ elif indicator == 'number':
+ if total:
+ add = ('% ' + str(len(str(total))) +
+ 's/%s') % (pos, total)
+ else:
+ add = str(pos)
+ elif indicator.startswith('item') and item:
+ slice = 'end'
+ if '-' in indicator:
+ wid = int(indicator.split('-')[1])
+ elif '+' in indicator:
+ slice = 'beginning'
+ wid = int(indicator.split('+')[1])
+ else:
+ wid = 20
+ if slice == 'end':
+ add = item[-wid:]
+ else:
+ add = item[:wid]
+ add += (wid - len(add)) * ' '
+ elif indicator == 'bar':
+ add = ''
+ needprogress = True
+ elif indicator == 'unit' and unit:
+ add = unit
+ elif indicator == 'estimate':
+ add = self.estimate(topic, pos, total, now)
+ elif indicator == 'speed':
+ add = self.speed(topic, pos, unit, now)
+ if not needprogress:
+ head = spacejoin(head, add)
+ else:
+ tail = spacejoin(tail, add)
+ if needprogress:
+ used = 0
+ if head:
+ used += len(head) + 1
+ if tail:
+ used += len(tail) + 1
+ progwidth = termwidth - used - 3
+ if total and pos <= total:
+ amt = pos * progwidth // total
+ bar = '=' * (amt - 1)
+ if amt > 0:
+ bar += '>'
+ bar += ' ' * (progwidth - amt)
+ else:
+ progwidth -= 3
+ self.indetcount += 1
+ # mod the count by twice the width so we can make the
+ # cursor bounce between the right and left sides
+ amt = self.indetcount % (2 * progwidth)
+ amt -= progwidth
+ bar = (' ' * int(progwidth - abs(amt)) + '<=>' +
+ ' ' * int(abs(amt)))
+ prog = ''.join(('[', bar , ']'))
+ out = spacejoin(head, prog, tail)
+ else:
+ out = spacejoin(head, tail)
+ sys.stderr.write('\r' + out[:termwidth])
+ self.lasttopic = topic
+ sys.stderr.flush()
+
+ def clear(self):
+ if not shouldprint(self.ui):
+ return
+ sys.stderr.write('\r%s\r' % (' ' * self.width()))
+
+ def complete(self):
+ if not shouldprint(self.ui):
+ return
+ if self.ui.configbool('progress', 'clear-complete', default=True):
+ self.clear()
+ else:
+ sys.stderr.write('\n')
+ sys.stderr.flush()
+
+ def width(self):
+ tw = self.ui.termwidth()
+ return min(int(self.ui.config('progress', 'width', default=tw)), tw)
+
+ def estimate(self, topic, pos, total, now):
+ if total is None:
+ return ''
+ initialpos = self.startvals[topic]
+ target = total - initialpos
+ delta = pos - initialpos
+ if delta > 0:
+ elapsed = now - self.starttimes[topic]
+ if elapsed > float(
+ self.ui.config('progress', 'estimate', default=2)):
+ seconds = (elapsed * (target - delta)) // delta + 1
+ return fmtremaining(seconds)
+ return ''
+
+ def speed(self, topic, pos, unit, now):
+ initialpos = self.startvals[topic]
+ delta = pos - initialpos
+ elapsed = now - self.starttimes[topic]
+ if elapsed > float(
+ self.ui.config('progress', 'estimate', default=2)):
+ return _('%d %s/sec') % (delta / elapsed, unit)
+ return ''
+
+ def progress(self, topic, pos, item='', unit='', total=None):
+ now = time.time()
+ if pos is None:
+ self.starttimes.pop(topic, None)
+ self.startvals.pop(topic, None)
+ self.topicstates.pop(topic, None)
+ # reset the progress bar if this is the outermost topic
+ if self.topics and self.topics[0] == topic and self.printed:
+ self.complete()
+ self.resetstate()
+ # truncate the list of topics assuming all topics within
+ # this one are also closed
+ if topic in self.topics:
+ self.topics = self.topics[:self.topics.index(topic)]
+ else:
+ if topic not in self.topics:
+ self.starttimes[topic] = now
+ self.startvals[topic] = pos
+ self.topics.append(topic)
+ self.topicstates[topic] = pos, item, unit, total
+ if now - self.lastprint >= self.refresh and self.topics:
+ if (self.lasttopic is None # first time we printed
+ # not a topic change
+ or topic == self.lasttopic
+ # it's been long enough we should print anyway
+ or now - self.lastprint >= self.changedelay):
+ self.lastprint = now
+ self.show(now, topic, *self.topicstates[topic])
+
+_singleton = None
+
+def uisetup(ui):
+ global _singleton
+ class progressui(ui.__class__):
+ _progbar = None
+
+ def _quiet(self):
+ return self.debugflag or self.quiet
+
+ def progress(self, *args, **opts):
+ if not self._quiet():
+ self._progbar.progress(*args, **opts)
+ return super(progressui, self).progress(*args, **opts)
+
+ def write(self, *args, **opts):
+ if not self._quiet() and self._progbar.printed:
+ self._progbar.clear()
+ return super(progressui, self).write(*args, **opts)
+
+ def write_err(self, *args, **opts):
+ if not self._quiet() and self._progbar.printed:
+ self._progbar.clear()
+ return super(progressui, self).write_err(*args, **opts)
+
+ # Apps that derive a class from ui.ui() can use
+ # setconfig('progress', 'disable', 'True') to disable this extension
+ if ui.configbool('progress', 'disable'):
+ return
+ if shouldprint(ui) and not ui.debugflag and not ui.quiet:
+ ui.__class__ = progressui
+ # we instantiate one globally shared progress bar to avoid
+ # competing progress bars when multiple UI objects get created
+ if not progressui._progbar:
+ if _singleton is None:
+ _singleton = progbar(ui)
+ progressui._progbar = _singleton
+
+def reposetup(ui, repo):
+ uisetup(repo.ui)
diff --git a/hgext/purge.py b/hgext/purge.py
new file mode 100644
index 0000000..8ec0da4
--- /dev/null
+++ b/hgext/purge.py
@@ -0,0 +1,110 @@
+# Copyright (C) 2006 - Marco Barisione <marco@barisione.org>
+#
+# This is a small extension for Mercurial (http://mercurial.selenic.com/)
+# that removes files not known to mercurial
+#
+# This program was inspired by the "cvspurge" script contained in CVS
+# utilities (http://www.red-bean.com/cvsutils/).
+#
+# For help on the usage of "hg purge" use:
+# hg help purge
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+'''command to delete untracked files from the working directory'''
+
+from mercurial import util, commands, cmdutil, scmutil
+from mercurial.i18n import _
+import os, stat
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+@command('purge|clean',
+ [('a', 'abort-on-err', None, _('abort if an error occurs')),
+ ('', 'all', None, _('purge ignored files too')),
+ ('p', 'print', None, _('print filenames instead of deleting them')),
+ ('0', 'print0', None, _('end filenames with NUL, for use with xargs'
+ ' (implies -p/--print)')),
+ ] + commands.walkopts,
+ _('hg purge [OPTION]... [DIR]...'))
+def purge(ui, repo, *dirs, **opts):
+ '''removes files not tracked by Mercurial
+
+ Delete files not known to Mercurial. This is useful to test local
+ and uncommitted changes in an otherwise-clean source tree.
+
+ This means that purge will delete:
+
+ - Unknown files: files marked with "?" by :hg:`status`
+ - Empty directories: in fact Mercurial ignores directories unless
+ they contain files under source control management
+
+ But it will leave untouched:
+
+ - Modified and unmodified tracked files
+ - Ignored files (unless --all is specified)
+ - New files added to the repository (with :hg:`add`)
+
+ If directories are given on the command line, only files in these
+ directories are considered.
+
+ Be careful with purge, as you could irreversibly delete some files
+ you forgot to add to the repository. If you only want to print the
+ list of files that this program would delete, use the --print
+ option.
+ '''
+ act = not opts['print']
+ eol = '\n'
+ if opts['print0']:
+ eol = '\0'
+ act = False # --print0 implies --print
+
+ def remove(remove_func, name):
+ if act:
+ try:
+ remove_func(repo.wjoin(name))
+ except OSError:
+ m = _('%s cannot be removed') % name
+ if opts['abort_on_err']:
+ raise util.Abort(m)
+ ui.warn(_('warning: %s\n') % m)
+ else:
+ ui.write('%s%s' % (name, eol))
+
+ def removefile(path):
+ try:
+ os.remove(path)
+ except OSError:
+ # read-only files cannot be unlinked under Windows
+ s = os.stat(path)
+ if (s.st_mode & stat.S_IWRITE) != 0:
+ raise
+ os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE)
+ os.remove(path)
+
+ directories = []
+ match = scmutil.match(repo[None], dirs, opts)
+ match.dir = directories.append
+ status = repo.status(match=match, ignored=opts['all'], unknown=True)
+
+ for f in sorted(status[4] + status[5]):
+ ui.note(_('removing file %s\n') % f)
+ remove(removefile, f)
+
+ for f in sorted(directories, reverse=True):
+ if match(f) and not os.listdir(repo.wjoin(f)):
+ ui.note(_('removing directory %s\n') % f)
+ remove(os.rmdir, f)
diff --git a/hgext/rebase.py b/hgext/rebase.py
new file mode 100644
index 0000000..f276fcf
--- /dev/null
+++ b/hgext/rebase.py
@@ -0,0 +1,708 @@
+# rebase.py - rebasing feature for mercurial
+#
+# Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to move sets of revisions to a different ancestor
+
+This extension lets you rebase changesets in an existing Mercurial
+repository.
+
+For more information:
+http://mercurial.selenic.com/wiki/RebaseExtension
+'''
+
+from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks
+from mercurial import extensions, patch, scmutil, phases
+from mercurial.commands import templateopts
+from mercurial.node import nullrev
+from mercurial.lock import release
+from mercurial.i18n import _
+import os, errno
+
+nullmerge = -2
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+@command('rebase',
+ [('s', 'source', '',
+ _('rebase from the specified changeset'), _('REV')),
+ ('b', 'base', '',
+ _('rebase from the base of the specified changeset '
+ '(up to greatest common ancestor of base and dest)'),
+ _('REV')),
+ ('r', 'rev', [],
+ _('rebase these revisions'),
+ _('REV')),
+ ('d', 'dest', '',
+ _('rebase onto the specified changeset'), _('REV')),
+ ('', 'collapse', False, _('collapse the rebased changesets')),
+ ('m', 'message', '',
+ _('use text as collapse commit message'), _('TEXT')),
+ ('e', 'edit', False, _('invoke editor on commit messages')),
+ ('l', 'logfile', '',
+ _('read collapse commit message from file'), _('FILE')),
+ ('', 'keep', False, _('keep original changesets')),
+ ('', 'keepbranches', False, _('keep original branch names')),
+ ('D', 'detach', False, _('(DEPRECATED)')),
+ ('t', 'tool', '', _('specify merge tool')),
+ ('c', 'continue', False, _('continue an interrupted rebase')),
+ ('a', 'abort', False, _('abort an interrupted rebase'))] +
+ templateopts,
+ _('[-s REV | -b REV] [-d REV] [OPTION]'))
+def rebase(ui, repo, **opts):
+ """move changeset (and descendants) to a different branch
+
+ Rebase uses repeated merging to graft changesets from one part of
+ history (the source) onto another (the destination). This can be
+ useful for linearizing *local* changes relative to a master
+ development tree.
+
+ You should not rebase changesets that have already been shared
+ with others. Doing so will force everybody else to perform the
+ same rebase or they will end up with duplicated changesets after
+ pulling in your rebased changesets.
+
+ If you don't specify a destination changeset (``-d/--dest``),
+ rebase uses the tipmost head of the current named branch as the
+ destination. (The destination changeset is not modified by
+ rebasing, but new changesets are added as its descendants.)
+
+ You can specify which changesets to rebase in two ways: as a
+ "source" changeset or as a "base" changeset. Both are shorthand
+ for a topologically related set of changesets (the "source
+ branch"). If you specify source (``-s/--source``), rebase will
+ rebase that changeset and all of its descendants onto dest. If you
+ specify base (``-b/--base``), rebase will select ancestors of base
+ back to but not including the common ancestor with dest. Thus,
+ ``-b`` is less precise but more convenient than ``-s``: you can
+ specify any changeset in the source branch, and rebase will select
+ the whole branch. If you specify neither ``-s`` nor ``-b``, rebase
+ uses the parent of the working directory as the base.
+
+ By default, rebase recreates the changesets in the source branch
+ as descendants of dest and then destroys the originals. Use
+ ``--keep`` to preserve the original source changesets. Some
+ changesets in the source branch (e.g. merges from the destination
+ branch) may be dropped if they no longer contribute any change.
+
+ One result of the rules for selecting the destination changeset
+ and source branch is that, unlike ``merge``, rebase will do
+ nothing if you are at the latest (tipmost) head of a named branch
+ with two heads. You need to explicitly specify source and/or
+ destination (or ``update`` to the other head, if it's the head of
+ the intended source branch).
+
+ If a rebase is interrupted to manually resolve a merge, it can be
+ continued with --continue/-c or aborted with --abort/-a.
+
+ Returns 0 on success, 1 if nothing to rebase.
+ """
+ originalwd = target = None
+ external = nullrev
+ state = {}
+ skipped = set()
+ targetancestors = set()
+
+ editor = None
+ if opts.get('edit'):
+ editor = cmdutil.commitforceeditor
+
+ lock = wlock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+
+ # Validate input and define rebasing points
+ destf = opts.get('dest', None)
+ srcf = opts.get('source', None)
+ basef = opts.get('base', None)
+ revf = opts.get('rev', [])
+ contf = opts.get('continue')
+ abortf = opts.get('abort')
+ collapsef = opts.get('collapse', False)
+ collapsemsg = cmdutil.logmessage(ui, opts)
+ extrafn = opts.get('extrafn') # internal, used by e.g. hgsubversion
+ keepf = opts.get('keep', False)
+ keepbranchesf = opts.get('keepbranches', False)
+ # keepopen is not meant for use on the command line, but by
+ # other extensions
+ keepopen = opts.get('keepopen', False)
+
+ if collapsemsg and not collapsef:
+ raise util.Abort(
+ _('message can only be specified with collapse'))
+
+ if contf or abortf:
+ if contf and abortf:
+ raise util.Abort(_('cannot use both abort and continue'))
+ if collapsef:
+ raise util.Abort(
+ _('cannot use collapse with continue or abort'))
+ if srcf or basef or destf:
+ raise util.Abort(
+ _('abort and continue do not allow specifying revisions'))
+ if opts.get('tool', False):
+ ui.warn(_('tool option will be ignored\n'))
+
+ (originalwd, target, state, skipped, collapsef, keepf,
+ keepbranchesf, external) = restorestatus(repo)
+ if abortf:
+ return abort(repo, originalwd, target, state)
+ else:
+ if srcf and basef:
+ raise util.Abort(_('cannot specify both a '
+ 'source and a base'))
+ if revf and basef:
+ raise util.Abort(_('cannot specify both a '
+ 'revision and a base'))
+ if revf and srcf:
+ raise util.Abort(_('cannot specify both a '
+ 'revision and a source'))
+
+ cmdutil.bailifchanged(repo)
+
+ if not destf:
+ # Destination defaults to the latest revision in the
+ # current branch
+ branch = repo[None].branch()
+ dest = repo[branch]
+ else:
+ dest = scmutil.revsingle(repo, destf)
+
+ if revf:
+ rebaseset = repo.revs('%lr', revf)
+ elif srcf:
+ src = scmutil.revrange(repo, [srcf])
+ rebaseset = repo.revs('(%ld)::', src)
+ else:
+ base = scmutil.revrange(repo, [basef or '.'])
+ rebaseset = repo.revs(
+ '(children(ancestor(%ld, %d)) and ::(%ld))::',
+ base, dest, base)
+
+ if rebaseset:
+ root = min(rebaseset)
+ else:
+ root = None
+
+ if not rebaseset:
+ repo.ui.debug('base is ancestor of destination\n')
+ result = None
+ elif not keepf and list(repo.revs('first(children(%ld) - %ld)',
+ rebaseset, rebaseset)):
+ raise util.Abort(
+ _("can't remove original changesets with"
+ " unrebased descendants"),
+ hint=_('use --keep to keep original changesets'))
+ elif not keepf and not repo[root].mutable():
+ raise util.Abort(_("can't rebase immutable changeset %s")
+ % repo[root],
+ hint=_('see hg help phases for details'))
+ else:
+ result = buildstate(repo, dest, rebaseset, collapsef)
+
+ if not result:
+ # Empty state built, nothing to rebase
+ ui.status(_('nothing to rebase\n'))
+ return 1
+ else:
+ originalwd, target, state = result
+ if collapsef:
+ targetancestors = set(repo.changelog.ancestors([target]))
+ targetancestors.add(target)
+ external = checkexternal(repo, state, targetancestors)
+
+ if keepbranchesf:
+ assert not extrafn, 'cannot use both keepbranches and extrafn'
+ def extrafn(ctx, extra):
+ extra['branch'] = ctx.branch()
+ if collapsef:
+ branches = set()
+ for rev in state:
+ branches.add(repo[rev].branch())
+ if len(branches) > 1:
+ raise util.Abort(_('cannot collapse multiple named '
+ 'branches'))
+
+
+ # Rebase
+ if not targetancestors:
+ targetancestors = set(repo.changelog.ancestors([target]))
+ targetancestors.add(target)
+
+ # Keep track of the current bookmarks in order to reset them later
+ currentbookmarks = repo._bookmarks.copy()
+ activebookmark = repo._bookmarkcurrent
+ if activebookmark:
+ bookmarks.unsetcurrent(repo)
+
+ sortedstate = sorted(state)
+ total = len(sortedstate)
+ pos = 0
+ for rev in sortedstate:
+ pos += 1
+ if state[rev] == -1:
+ ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, repo[rev])),
+ _('changesets'), total)
+ storestatus(repo, originalwd, target, state, collapsef, keepf,
+ keepbranchesf, external)
+ p1, p2 = defineparents(repo, rev, target, state,
+ targetancestors)
+ if len(repo.parents()) == 2:
+ repo.ui.debug('resuming interrupted rebase\n')
+ else:
+ try:
+ ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ stats = rebasenode(repo, rev, p1, state, collapsef)
+ if stats and stats[3] > 0:
+ raise util.Abort(_('unresolved conflicts (see hg '
+ 'resolve, then hg rebase --continue)'))
+ finally:
+ ui.setconfig('ui', 'forcemerge', '')
+ cmdutil.duplicatecopies(repo, rev, target)
+ if not collapsef:
+ newrev = concludenode(repo, rev, p1, p2, extrafn=extrafn,
+ editor=editor)
+ else:
+ # Skip commit if we are collapsing
+ repo.setparents(repo[p1].node())
+ newrev = None
+ # Update the state
+ if newrev is not None:
+ state[rev] = repo[newrev].rev()
+ else:
+ if not collapsef:
+ ui.note(_('no changes, revision %d skipped\n') % rev)
+ ui.debug('next revision set to %s\n' % p1)
+ skipped.add(rev)
+ state[rev] = p1
+
+ ui.progress(_('rebasing'), None)
+ ui.note(_('rebase merging completed\n'))
+
+ if collapsef and not keepopen:
+ p1, p2 = defineparents(repo, min(state), target,
+ state, targetancestors)
+ if collapsemsg:
+ commitmsg = collapsemsg
+ else:
+ commitmsg = 'Collapsed revision'
+ for rebased in state:
+ if rebased not in skipped and state[rebased] != nullmerge:
+ commitmsg += '\n* %s' % repo[rebased].description()
+ commitmsg = ui.edit(commitmsg, repo.ui.username())
+ newrev = concludenode(repo, rev, p1, external, commitmsg=commitmsg,
+ extrafn=extrafn, editor=editor)
+
+ if 'qtip' in repo.tags():
+ updatemq(repo, state, skipped, **opts)
+
+ if currentbookmarks:
+ # Nodeids are needed to reset bookmarks
+ nstate = {}
+ for k, v in state.iteritems():
+ if v != nullmerge:
+ nstate[repo[k].node()] = repo[v].node()
+
+ if not keepf:
+ # Remove no more useful revisions
+ rebased = [rev for rev in state if state[rev] != nullmerge]
+ if rebased:
+ if set(repo.changelog.descendants([min(rebased)])) - set(state):
+ ui.warn(_("warning: new changesets detected "
+ "on source branch, not stripping\n"))
+ else:
+ # backup the old csets by default
+ repair.strip(ui, repo, repo[min(rebased)].node(), "all")
+
+ if currentbookmarks:
+ updatebookmarks(repo, nstate, currentbookmarks, **opts)
+
+ clearstatus(repo)
+ ui.note(_("rebase completed\n"))
+ if os.path.exists(repo.sjoin('undo')):
+ util.unlinkpath(repo.sjoin('undo'))
+ if skipped:
+ ui.note(_("%d revisions have been skipped\n") % len(skipped))
+
+ if (activebookmark and
+ repo['tip'].node() == repo._bookmarks[activebookmark]):
+ bookmarks.setcurrent(repo, activebookmark)
+
+ finally:
+ release(lock, wlock)
+
+def checkexternal(repo, state, targetancestors):
+ """Check whether one or more external revisions need to be taken in
+ consideration. In the latter case, abort.
+ """
+ external = nullrev
+ source = min(state)
+ for rev in state:
+ if rev == source:
+ continue
+ # Check externals and fail if there are more than one
+ for p in repo[rev].parents():
+ if (p.rev() not in state
+ and p.rev() not in targetancestors):
+ if external != nullrev:
+ raise util.Abort(_('unable to collapse, there is more '
+ 'than one external parent'))
+ external = p.rev()
+ return external
+
+def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None):
+ 'Commit the changes and store useful information in extra'
+ try:
+ repo.setparents(repo[p1].node(), repo[p2].node())
+ ctx = repo[rev]
+ if commitmsg is None:
+ commitmsg = ctx.description()
+ extra = {'rebase_source': ctx.hex()}
+ if extrafn:
+ extrafn(ctx, extra)
+ # Commit might fail if unresolved files exist
+ newrev = repo.commit(text=commitmsg, user=ctx.user(),
+ date=ctx.date(), extra=extra, editor=editor)
+ repo.dirstate.setbranch(repo[newrev].branch())
+ targetphase = max(ctx.phase(), phases.draft)
+ # retractboundary doesn't overwrite upper phase inherited from parent
+ newnode = repo[newrev].node()
+ if newnode:
+ phases.retractboundary(repo, targetphase, [newnode])
+ return newrev
+ except util.Abort:
+ # Invalidate the previous setparents
+ repo.dirstate.invalidate()
+ raise
+
+def rebasenode(repo, rev, p1, state, collapse):
+ 'Rebase a single revision'
+ # Merge phase
+ # Update to target and merge it with local
+ if repo['.'].rev() != repo[p1].rev():
+ repo.ui.debug(" update to %d:%s\n" % (repo[p1].rev(), repo[p1]))
+ merge.update(repo, p1, False, True, False)
+ else:
+ repo.ui.debug(" already in target\n")
+ repo.dirstate.write()
+ repo.ui.debug(" merge against %d:%s\n" % (repo[rev].rev(), repo[rev]))
+ base = None
+ if repo[rev].rev() != repo[min(state)].rev():
+ base = repo[rev].p1().node()
+ # When collapsing in-place, the parent is the common ancestor, we
+ # have to allow merging with it.
+ return merge.update(repo, rev, True, True, False, base, collapse)
+
+def defineparents(repo, rev, target, state, targetancestors):
+ 'Return the new parent relationship of the revision that will be rebased'
+ parents = repo[rev].parents()
+ p1 = p2 = nullrev
+
+ P1n = parents[0].rev()
+ if P1n in targetancestors:
+ p1 = target
+ elif P1n in state:
+ if state[P1n] == nullmerge:
+ p1 = target
+ else:
+ p1 = state[P1n]
+ else: # P1n external
+ p1 = target
+ p2 = P1n
+
+ if len(parents) == 2 and parents[1].rev() not in targetancestors:
+ P2n = parents[1].rev()
+ # interesting second parent
+ if P2n in state:
+ if p1 == target: # P1n in targetancestors or external
+ p1 = state[P2n]
+ else:
+ p2 = state[P2n]
+ else: # P2n external
+ if p2 != nullrev: # P1n external too => rev is a merged revision
+ raise util.Abort(_('cannot use revision %d as base, result '
+ 'would have 3 parents') % rev)
+ p2 = P2n
+ repo.ui.debug(" future parents are %d and %d\n" %
+ (repo[p1].rev(), repo[p2].rev()))
+ return p1, p2
+
+def isagitpatch(repo, patchname):
+ 'Return true if the given patch is in git format'
+ mqpatch = os.path.join(repo.mq.path, patchname)
+ for line in patch.linereader(file(mqpatch, 'rb')):
+ if line.startswith('diff --git'):
+ return True
+ return False
+
+def updatemq(repo, state, skipped, **opts):
+ 'Update rebased mq patches - finalize and then import them'
+ mqrebase = {}
+ mq = repo.mq
+ original_series = mq.fullseries[:]
+ skippedpatches = set()
+
+ for p in mq.applied:
+ rev = repo[p.node].rev()
+ if rev in state:
+ repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' %
+ (rev, p.name))
+ mqrebase[rev] = (p.name, isagitpatch(repo, p.name))
+ else:
+ # Applied but not rebased, not sure this should happen
+ skippedpatches.add(p.name)
+
+ if mqrebase:
+ mq.finish(repo, mqrebase.keys())
+
+ # We must start import from the newest revision
+ for rev in sorted(mqrebase, reverse=True):
+ if rev not in skipped:
+ name, isgit = mqrebase[rev]
+ repo.ui.debug('import mq patch %d (%s)\n' % (state[rev], name))
+ mq.qimport(repo, (), patchname=name, git=isgit,
+ rev=[str(state[rev])])
+ else:
+ # Rebased and skipped
+ skippedpatches.add(mqrebase[rev][0])
+
+ # Patches were either applied and rebased and imported in
+ # order, applied and removed or unapplied. Discard the removed
+ # ones while preserving the original series order and guards.
+ newseries = [s for s in original_series
+ if mq.guard_re.split(s, 1)[0] not in skippedpatches]
+ mq.fullseries[:] = newseries
+ mq.seriesdirty = True
+ mq.savedirty()
+
+def updatebookmarks(repo, nstate, originalbookmarks, **opts):
+ 'Move bookmarks to their correct changesets'
+ for k, v in originalbookmarks.iteritems():
+ if v in nstate:
+ if nstate[v] != nullmerge:
+ # update the bookmarks for revs that have moved
+ repo._bookmarks[k] = nstate[v]
+
+ bookmarks.write(repo)
+
+def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches,
+ external):
+ 'Store the current status to allow recovery'
+ f = repo.opener("rebasestate", "w")
+ f.write(repo[originalwd].hex() + '\n')
+ f.write(repo[target].hex() + '\n')
+ f.write(repo[external].hex() + '\n')
+ f.write('%d\n' % int(collapse))
+ f.write('%d\n' % int(keep))
+ f.write('%d\n' % int(keepbranches))
+ for d, v in state.iteritems():
+ oldrev = repo[d].hex()
+ if v != nullmerge:
+ newrev = repo[v].hex()
+ else:
+ newrev = v
+ f.write("%s:%s\n" % (oldrev, newrev))
+ f.close()
+ repo.ui.debug('rebase status stored\n')
+
+def clearstatus(repo):
+ 'Remove the status files'
+ if os.path.exists(repo.join("rebasestate")):
+ util.unlinkpath(repo.join("rebasestate"))
+
+def restorestatus(repo):
+ 'Restore a previously stored status'
+ try:
+ target = None
+ collapse = False
+ external = nullrev
+ state = {}
+ f = repo.opener("rebasestate")
+ for i, l in enumerate(f.read().splitlines()):
+ if i == 0:
+ originalwd = repo[l].rev()
+ elif i == 1:
+ target = repo[l].rev()
+ elif i == 2:
+ external = repo[l].rev()
+ elif i == 3:
+ collapse = bool(int(l))
+ elif i == 4:
+ keep = bool(int(l))
+ elif i == 5:
+ keepbranches = bool(int(l))
+ else:
+ oldrev, newrev = l.split(':')
+ if newrev != str(nullmerge):
+ state[repo[oldrev].rev()] = repo[newrev].rev()
+ else:
+ state[repo[oldrev].rev()] = int(newrev)
+ skipped = set()
+ # recompute the set of skipped revs
+ if not collapse:
+ seen = set([target])
+ for old, new in sorted(state.items()):
+ if new != nullrev and new in seen:
+ skipped.add(old)
+ seen.add(new)
+ repo.ui.debug('computed skipped revs: %s\n' % skipped)
+ repo.ui.debug('rebase status resumed\n')
+ return (originalwd, target, state, skipped,
+ collapse, keep, keepbranches, external)
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ raise util.Abort(_('no rebase in progress'))
+
+def abort(repo, originalwd, target, state):
+ 'Restore the repository to its original state'
+ dstates = [s for s in state.values() if s != nullrev]
+ immutable = [d for d in dstates if not repo[d].mutable()]
+ if immutable:
+ raise util.Abort(_("can't abort rebase due to immutable changesets %s")
+ % ', '.join(str(repo[r]) for r in immutable),
+ hint=_('see hg help phases for details'))
+
+ descendants = set()
+ if dstates:
+ descendants = set(repo.changelog.descendants(dstates))
+ if descendants - set(dstates):
+ repo.ui.warn(_("warning: new changesets detected on target branch, "
+ "can't abort\n"))
+ return -1
+ else:
+ # Strip from the first rebased revision
+ merge.update(repo, repo[originalwd].rev(), False, True, False)
+ rebased = filter(lambda x: x > -1 and x != target, state.values())
+ if rebased:
+ strippoint = min(rebased)
+ # no backup of rebased cset versions needed
+ repair.strip(repo.ui, repo, repo[strippoint].node())
+ clearstatus(repo)
+ repo.ui.warn(_('rebase aborted\n'))
+ return 0
+
+def buildstate(repo, dest, rebaseset, collapse):
+ '''Define which revisions are going to be rebased and where
+
+ repo: repo
+ dest: context
+ rebaseset: set of rev
+ '''
+
+ # This check isn't strictly necessary, since mq detects commits over an
+ # applied patch. But it prevents messing up the working directory when
+ # a partially completed rebase is blocked by mq.
+ if 'qtip' in repo.tags() and (dest.node() in
+ [s.node for s in repo.mq.applied]):
+ raise util.Abort(_('cannot rebase onto an applied mq patch'))
+
+ roots = list(repo.set('roots(%ld)', rebaseset))
+ if not roots:
+ raise util.Abort(_('no matching revisions'))
+ if len(roots) > 1:
+ raise util.Abort(_("can't rebase multiple roots"))
+ root = roots[0]
+
+ commonbase = root.ancestor(dest)
+ if commonbase == root:
+ raise util.Abort(_('source is ancestor of destination'))
+ if commonbase == dest:
+ samebranch = root.branch() == dest.branch()
+ if not collapse and samebranch and root in dest.children():
+ repo.ui.debug('source is a child of destination\n')
+ return None
+
+ repo.ui.debug('rebase onto %d starting from %d\n' % (dest, root))
+ state = dict.fromkeys(rebaseset, nullrev)
+ # Rebase tries to turn <dest> into a parent of <root> while
+ # preserving the number of parents of rebased changesets:
+ #
+ # - A changeset with a single parent will always be rebased as a
+ # changeset with a single parent.
+ #
+ # - A merge will be rebased as merge unless its parents are both
+ # ancestors of <dest> or are themselves in the rebased set and
+ # pruned while rebased.
+ #
+ # If one parent of <root> is an ancestor of <dest>, the rebased
+ # version of this parent will be <dest>. This is always true with
+ # --base option.
+ #
+ # Otherwise, we need to *replace* the original parents with
+ # <dest>. This "detaches" the rebased set from its former location
+ # and rebases it onto <dest>. Changes introduced by ancestors of
+ # <root> not common with <dest> (the detachset, marked as
+ # nullmerge) are "removed" from the rebased changesets.
+ #
+ # - If <root> has a single parent, set it to <dest>.
+ #
+ # - If <root> is a merge, we cannot decide which parent to
+ # replace, the rebase operation is not clearly defined.
+ #
+ # The table below sums up this behavior:
+ #
+ # +--------------------+----------------------+-------------------------+
+ # | | one parent | merge |
+ # +--------------------+----------------------+-------------------------+
+ # | parent in ::<dest> | new parent is <dest> | parents in ::<dest> are |
+ # | | | remapped to <dest> |
+ # +--------------------+----------------------+-------------------------+
+ # | unrelated source | new parent is <dest> | ambiguous, abort |
+ # +--------------------+----------------------+-------------------------+
+ #
+ # The actual abort is handled by `defineparents`
+ if len(root.parents()) <= 1:
+ # (strict) ancestors of <root> not ancestors of <dest>
+ detachset = repo.revs('::%d - ::%d - %d', root, commonbase, root)
+ state.update(dict.fromkeys(detachset, nullmerge))
+ return repo['.'].rev(), dest.rev(), state
+
+def pullrebase(orig, ui, repo, *args, **opts):
+ 'Call rebase after pull if the latter has been invoked with --rebase'
+ if opts.get('rebase'):
+ if opts.get('update'):
+ del opts['update']
+ ui.debug('--update and --rebase are not compatible, ignoring '
+ 'the update flag\n')
+
+ movemarkfrom = repo['.'].node()
+ cmdutil.bailifchanged(repo)
+ revsprepull = len(repo)
+ origpostincoming = commands.postincoming
+ def _dummy(*args, **kwargs):
+ pass
+ commands.postincoming = _dummy
+ try:
+ orig(ui, repo, *args, **opts)
+ finally:
+ commands.postincoming = origpostincoming
+ revspostpull = len(repo)
+ if revspostpull > revsprepull:
+ rebase(ui, repo, **opts)
+ branch = repo[None].branch()
+ dest = repo[branch].rev()
+ if dest != repo['.'].rev():
+ # there was nothing to rebase we force an update
+ hg.update(repo, dest)
+ if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
+ ui.status(_("updating bookmark %s\n")
+ % repo._bookmarkcurrent)
+ else:
+ if opts.get('tool'):
+ raise util.Abort(_('--tool can only be used with --rebase'))
+ orig(ui, repo, *args, **opts)
+
+def uisetup(ui):
+ 'Replace pull with a decorator to provide --rebase option'
+ entry = extensions.wrapcommand(commands.table, 'pull', pullrebase)
+ entry[1].append(('', 'rebase', None,
+ _("rebase working directory to branch head")))
+ entry[1].append(('t', 'tool', '',
+ _("specify merge tool for rebase")))
diff --git a/hgext/record.py b/hgext/record.py
new file mode 100644
index 0000000..ec9e384
--- /dev/null
+++ b/hgext/record.py
@@ -0,0 +1,666 @@
+# record.py
+#
+# Copyright 2007 Bryan O'Sullivan <bos@serpentine.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''commands to interactively select changes for commit/qrefresh'''
+
+from mercurial.i18n import gettext, _
+from mercurial import cmdutil, commands, extensions, hg, mdiff, patch
+from mercurial import util
+import copy, cStringIO, errno, os, re, shutil, tempfile
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+lines_re = re.compile(r'@@ -(\d+),(\d+) \+(\d+),(\d+) @@\s*(.*)')
+
+diffopts = [
+ ('w', 'ignore-all-space', False,
+ _('ignore white space when comparing lines')),
+ ('b', 'ignore-space-change', None,
+ _('ignore changes in the amount of white space')),
+ ('B', 'ignore-blank-lines', None,
+ _('ignore changes whose lines are all blank')),
+]
+
+def scanpatch(fp):
+ """like patch.iterhunks, but yield different events
+
+ - ('file', [header_lines + fromfile + tofile])
+ - ('context', [context_lines])
+ - ('hunk', [hunk_lines])
+ - ('range', (-start,len, +start,len, diffp))
+ """
+ lr = patch.linereader(fp)
+
+ def scanwhile(first, p):
+ """scan lr while predicate holds"""
+ lines = [first]
+ while True:
+ line = lr.readline()
+ if not line:
+ break
+ if p(line):
+ lines.append(line)
+ else:
+ lr.push(line)
+ break
+ return lines
+
+ while True:
+ line = lr.readline()
+ if not line:
+ break
+ if line.startswith('diff --git a/') or line.startswith('diff -r '):
+ def notheader(line):
+ s = line.split(None, 1)
+ return not s or s[0] not in ('---', 'diff')
+ header = scanwhile(line, notheader)
+ fromfile = lr.readline()
+ if fromfile.startswith('---'):
+ tofile = lr.readline()
+ header += [fromfile, tofile]
+ else:
+ lr.push(fromfile)
+ yield 'file', header
+ elif line[0] == ' ':
+ yield 'context', scanwhile(line, lambda l: l[0] in ' \\')
+ elif line[0] in '-+':
+ yield 'hunk', scanwhile(line, lambda l: l[0] in '-+\\')
+ else:
+ m = lines_re.match(line)
+ if m:
+ yield 'range', m.groups()
+ else:
+ raise patch.PatchError('unknown patch content: %r' % line)
+
+class header(object):
+ """patch header
+
+ XXX shoudn't we move this to mercurial/patch.py ?
+ """
+ diffgit_re = re.compile('diff --git a/(.*) b/(.*)$')
+ diff_re = re.compile('diff -r .* (.*)$')
+ allhunks_re = re.compile('(?:index|new file|deleted file) ')
+ pretty_re = re.compile('(?:new file|deleted file) ')
+ special_re = re.compile('(?:index|new|deleted|copy|rename) ')
+
+ def __init__(self, header):
+ self.header = header
+ self.hunks = []
+
+ def binary(self):
+ return util.any(h.startswith('index ') for h in self.header)
+
+ def pretty(self, fp):
+ for h in self.header:
+ if h.startswith('index '):
+ fp.write(_('this modifies a binary file (all or nothing)\n'))
+ break
+ if self.pretty_re.match(h):
+ fp.write(h)
+ if self.binary():
+ fp.write(_('this is a binary file\n'))
+ break
+ if h.startswith('---'):
+ fp.write(_('%d hunks, %d lines changed\n') %
+ (len(self.hunks),
+ sum([max(h.added, h.removed) for h in self.hunks])))
+ break
+ fp.write(h)
+
+ def write(self, fp):
+ fp.write(''.join(self.header))
+
+ def allhunks(self):
+ return util.any(self.allhunks_re.match(h) for h in self.header)
+
+ def files(self):
+ match = self.diffgit_re.match(self.header[0])
+ if match:
+ fromfile, tofile = match.groups()
+ if fromfile == tofile:
+ return [fromfile]
+ return [fromfile, tofile]
+ else:
+ return self.diff_re.match(self.header[0]).groups()
+
+ def filename(self):
+ return self.files()[-1]
+
+ def __repr__(self):
+ return '<header %s>' % (' '.join(map(repr, self.files())))
+
+ def special(self):
+ return util.any(self.special_re.match(h) for h in self.header)
+
+def countchanges(hunk):
+ """hunk -> (n+,n-)"""
+ add = len([h for h in hunk if h[0] == '+'])
+ rem = len([h for h in hunk if h[0] == '-'])
+ return add, rem
+
+class hunk(object):
+ """patch hunk
+
+ XXX shouldn't we merge this with patch.hunk ?
+ """
+ maxcontext = 3
+
+ def __init__(self, header, fromline, toline, proc, before, hunk, after):
+ def trimcontext(number, lines):
+ delta = len(lines) - self.maxcontext
+ if False and delta > 0:
+ return number + delta, lines[:self.maxcontext]
+ return number, lines
+
+ self.header = header
+ self.fromline, self.before = trimcontext(fromline, before)
+ self.toline, self.after = trimcontext(toline, after)
+ self.proc = proc
+ self.hunk = hunk
+ self.added, self.removed = countchanges(self.hunk)
+
+ def write(self, fp):
+ delta = len(self.before) + len(self.after)
+ if self.after and self.after[-1] == '\\ No newline at end of file\n':
+ delta -= 1
+ fromlen = delta + self.removed
+ tolen = delta + self.added
+ fp.write('@@ -%d,%d +%d,%d @@%s\n' %
+ (self.fromline, fromlen, self.toline, tolen,
+ self.proc and (' ' + self.proc)))
+ fp.write(''.join(self.before + self.hunk + self.after))
+
+ pretty = write
+
+ def filename(self):
+ return self.header.filename()
+
+ def __repr__(self):
+ return '<hunk %r@%d>' % (self.filename(), self.fromline)
+
+def parsepatch(fp):
+ """patch -> [] of headers -> [] of hunks """
+ class parser(object):
+ """patch parsing state machine"""
+ def __init__(self):
+ self.fromline = 0
+ self.toline = 0
+ self.proc = ''
+ self.header = None
+ self.context = []
+ self.before = []
+ self.hunk = []
+ self.headers = []
+
+ def addrange(self, limits):
+ fromstart, fromend, tostart, toend, proc = limits
+ self.fromline = int(fromstart)
+ self.toline = int(tostart)
+ self.proc = proc
+
+ def addcontext(self, context):
+ if self.hunk:
+ h = hunk(self.header, self.fromline, self.toline, self.proc,
+ self.before, self.hunk, context)
+ self.header.hunks.append(h)
+ self.fromline += len(self.before) + h.removed
+ self.toline += len(self.before) + h.added
+ self.before = []
+ self.hunk = []
+ self.proc = ''
+ self.context = context
+
+ def addhunk(self, hunk):
+ if self.context:
+ self.before = self.context
+ self.context = []
+ self.hunk = hunk
+
+ def newfile(self, hdr):
+ self.addcontext([])
+ h = header(hdr)
+ self.headers.append(h)
+ self.header = h
+
+ def finished(self):
+ self.addcontext([])
+ return self.headers
+
+ transitions = {
+ 'file': {'context': addcontext,
+ 'file': newfile,
+ 'hunk': addhunk,
+ 'range': addrange},
+ 'context': {'file': newfile,
+ 'hunk': addhunk,
+ 'range': addrange},
+ 'hunk': {'context': addcontext,
+ 'file': newfile,
+ 'range': addrange},
+ 'range': {'context': addcontext,
+ 'hunk': addhunk},
+ }
+
+ p = parser()
+
+ state = 'context'
+ for newstate, data in scanpatch(fp):
+ try:
+ p.transitions[state][newstate](p, data)
+ except KeyError:
+ raise patch.PatchError('unhandled transition: %s -> %s' %
+ (state, newstate))
+ state = newstate
+ return p.finished()
+
+def filterpatch(ui, headers):
+ """Interactively filter patch chunks into applied-only chunks"""
+
+ def prompt(skipfile, skipall, query, chunk):
+ """prompt query, and process base inputs
+
+ - y/n for the rest of file
+ - y/n for the rest
+ - ? (help)
+ - q (quit)
+
+ Return True/False and possibly updated skipfile and skipall.
+ """
+ newpatches = None
+ if skipall is not None:
+ return skipall, skipfile, skipall, newpatches
+ if skipfile is not None:
+ return skipfile, skipfile, skipall, newpatches
+ while True:
+ resps = _('[Ynesfdaq?]')
+ choices = (_('&Yes, record this change'),
+ _('&No, skip this change'),
+ _('&Edit the change manually'),
+ _('&Skip remaining changes to this file'),
+ _('Record remaining changes to this &file'),
+ _('&Done, skip remaining changes and files'),
+ _('Record &all changes to all remaining files'),
+ _('&Quit, recording no changes'),
+ _('&?'))
+ r = ui.promptchoice("%s %s" % (query, resps), choices)
+ ui.write("\n")
+ if r == 8: # ?
+ doc = gettext(record.__doc__)
+ c = doc.find('::') + 2
+ for l in doc[c:].splitlines():
+ if l.startswith(' '):
+ ui.write(l.strip(), '\n')
+ continue
+ elif r == 0: # yes
+ ret = True
+ elif r == 1: # no
+ ret = False
+ elif r == 2: # Edit patch
+ if chunk is None:
+ ui.write(_('cannot edit patch for whole file'))
+ ui.write("\n")
+ continue
+ if chunk.header.binary():
+ ui.write(_('cannot edit patch for binary file'))
+ ui.write("\n")
+ continue
+ # Patch comment based on the Git one (based on comment at end of
+ # http://mercurial.selenic.com/wiki/RecordExtension)
+ phelp = '---' + _("""
+To remove '-' lines, make them ' ' lines (context).
+To remove '+' lines, delete them.
+Lines starting with # will be removed from the patch.
+
+If the patch applies cleanly, the edited hunk will immediately be
+added to the record list. If it does not apply cleanly, a rejects
+file will be generated: you can use that when you try again. If
+all lines of the hunk are removed, then the edit is aborted and
+the hunk is left unchanged.
+""")
+ (patchfd, patchfn) = tempfile.mkstemp(prefix="hg-editor-",
+ suffix=".diff", text=True)
+ ncpatchfp = None
+ try:
+ # Write the initial patch
+ f = os.fdopen(patchfd, "w")
+ chunk.header.write(f)
+ chunk.write(f)
+ f.write('\n'.join(['# ' + i for i in phelp.splitlines()]))
+ f.close()
+ # Start the editor and wait for it to complete
+ editor = ui.geteditor()
+ util.system("%s \"%s\"" % (editor, patchfn),
+ environ={'HGUSER': ui.username()},
+ onerr=util.Abort, errprefix=_("edit failed"),
+ out=ui.fout)
+ # Remove comment lines
+ patchfp = open(patchfn)
+ ncpatchfp = cStringIO.StringIO()
+ for line in patchfp:
+ if not line.startswith('#'):
+ ncpatchfp.write(line)
+ patchfp.close()
+ ncpatchfp.seek(0)
+ newpatches = parsepatch(ncpatchfp)
+ finally:
+ os.unlink(patchfn)
+ del ncpatchfp
+ # Signal that the chunk shouldn't be applied as-is, but
+ # provide the new patch to be used instead.
+ ret = False
+ elif r == 3: # Skip
+ ret = skipfile = False
+ elif r == 4: # file (Record remaining)
+ ret = skipfile = True
+ elif r == 5: # done, skip remaining
+ ret = skipall = False
+ elif r == 6: # all
+ ret = skipall = True
+ elif r == 7: # quit
+ raise util.Abort(_('user quit'))
+ return ret, skipfile, skipall, newpatches
+
+ seen = set()
+ applied = {} # 'filename' -> [] of chunks
+ skipfile, skipall = None, None
+ pos, total = 1, sum(len(h.hunks) for h in headers)
+ for h in headers:
+ pos += len(h.hunks)
+ skipfile = None
+ fixoffset = 0
+ hdr = ''.join(h.header)
+ if hdr in seen:
+ continue
+ seen.add(hdr)
+ if skipall is None:
+ h.pretty(ui)
+ msg = (_('examine changes to %s?') %
+ _(' and ').join("'%s'" % f for f in h.files()))
+ r, skipfile, skipall, np = prompt(skipfile, skipall, msg, None)
+ if not r:
+ continue
+ applied[h.filename()] = [h]
+ if h.allhunks():
+ applied[h.filename()] += h.hunks
+ continue
+ for i, chunk in enumerate(h.hunks):
+ if skipfile is None and skipall is None:
+ chunk.pretty(ui)
+ if total == 1:
+ msg = _('record this change to %r?') % chunk.filename()
+ else:
+ idx = pos - len(h.hunks) + i
+ msg = _('record change %d/%d to %r?') % (idx, total,
+ chunk.filename())
+ r, skipfile, skipall, newpatches = prompt(skipfile,
+ skipall, msg, chunk)
+ if r:
+ if fixoffset:
+ chunk = copy.copy(chunk)
+ chunk.toline += fixoffset
+ applied[chunk.filename()].append(chunk)
+ elif newpatches is not None:
+ for newpatch in newpatches:
+ for newhunk in newpatch.hunks:
+ if fixoffset:
+ newhunk.toline += fixoffset
+ applied[newhunk.filename()].append(newhunk)
+ else:
+ fixoffset += chunk.removed - chunk.added
+ return sum([h for h in applied.itervalues()
+ if h[0].special() or len(h) > 1], [])
+
+@command("record",
+ # same options as commit + white space diff options
+ commands.table['^commit|ci'][1][:] + diffopts,
+ _('hg record [OPTION]... [FILE]...'))
+def record(ui, repo, *pats, **opts):
+ '''interactively select changes to commit
+
+ If a list of files is omitted, all changes reported by :hg:`status`
+ will be candidates for recording.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ You will be prompted for whether to record changes to each
+ modified file, and for files with multiple changes, for each
+ change to use. For each query, the following responses are
+ possible::
+
+ y - record this change
+ n - skip this change
+ e - edit this change manually
+
+ s - skip remaining changes to this file
+ f - record remaining changes to this file
+
+ d - done, skip remaining changes and files
+ a - record all changes to all remaining files
+ q - quit, recording no changes
+
+ ? - display help
+
+ This command is not available when committing a merge.'''
+
+ dorecord(ui, repo, commands.commit, 'commit', False, *pats, **opts)
+
+def qrefresh(origfn, ui, repo, *pats, **opts):
+ if not opts['interactive']:
+ return origfn(ui, repo, *pats, **opts)
+
+ mq = extensions.find('mq')
+
+ def committomq(ui, repo, *pats, **opts):
+ # At this point the working copy contains only changes that
+ # were accepted. All other changes were reverted.
+ # We can't pass *pats here since qrefresh will undo all other
+ # changed files in the patch that aren't in pats.
+ mq.refresh(ui, repo, **opts)
+
+ # backup all changed files
+ dorecord(ui, repo, committomq, 'qrefresh', True, *pats, **opts)
+
+def qrecord(ui, repo, patch, *pats, **opts):
+ '''interactively record a new patch
+
+ See :hg:`help qnew` & :hg:`help record` for more information and
+ usage.
+ '''
+
+ try:
+ mq = extensions.find('mq')
+ except KeyError:
+ raise util.Abort(_("'mq' extension not loaded"))
+
+ repo.mq.checkpatchname(patch)
+
+ def committomq(ui, repo, *pats, **opts):
+ opts['checkname'] = False
+ mq.new(ui, repo, patch, *pats, **opts)
+
+ dorecord(ui, repo, committomq, 'qnew', False, *pats, **opts)
+
+def qnew(origfn, ui, repo, patch, *args, **opts):
+ if opts['interactive']:
+ return qrecord(ui, repo, patch, *args, **opts)
+ return origfn(ui, repo, patch, *args, **opts)
+
+def dorecord(ui, repo, commitfunc, cmdsuggest, backupall, *pats, **opts):
+ if not ui.interactive():
+ raise util.Abort(_('running non-interactively, use %s instead') %
+ cmdsuggest)
+
+ def recordfunc(ui, repo, message, match, opts):
+ """This is generic record driver.
+
+ Its job is to interactively filter local changes, and
+ accordingly prepare working directory into a state in which the
+ job can be delegated to a non-interactive commit command such as
+ 'commit' or 'qrefresh'.
+
+ After the actual job is done by non-interactive command, the
+ working directory is restored to its original state.
+
+ In the end we'll record interesting changes, and everything else
+ will be left in place, so the user can continue working.
+ """
+
+ merge = len(repo[None].parents()) > 1
+ if merge:
+ raise util.Abort(_('cannot partially commit a merge '
+ '(use "hg commit" instead)'))
+
+ changes = repo.status(match=match)[:3]
+ diffopts = mdiff.diffopts(
+ git=True, nodates=True,
+ ignorews=opts.get('ignore_all_space'),
+ ignorewsamount=opts.get('ignore_space_change'),
+ ignoreblanklines=opts.get('ignore_blank_lines'))
+ chunks = patch.diff(repo, changes=changes, opts=diffopts)
+ fp = cStringIO.StringIO()
+ fp.write(''.join(chunks))
+ fp.seek(0)
+
+ # 1. filter patch, so we have intending-to apply subset of it
+ chunks = filterpatch(ui, parsepatch(fp))
+ del fp
+
+ contenders = set()
+ for h in chunks:
+ try:
+ contenders.update(set(h.files()))
+ except AttributeError:
+ pass
+
+ changed = changes[0] + changes[1] + changes[2]
+ newfiles = [f for f in changed if f in contenders]
+ if not newfiles:
+ ui.status(_('no changes to record\n'))
+ return 0
+
+ modified = set(changes[0])
+
+ # 2. backup changed files, so we can restore them in the end
+ if backupall:
+ tobackup = changed
+ else:
+ tobackup = [f for f in newfiles if f in modified]
+
+ backups = {}
+ if tobackup:
+ backupdir = repo.join('record-backups')
+ try:
+ os.mkdir(backupdir)
+ except OSError, err:
+ if err.errno != errno.EEXIST:
+ raise
+ try:
+ # backup continues
+ for f in tobackup:
+ fd, tmpname = tempfile.mkstemp(prefix=f.replace('/', '_')+'.',
+ dir=backupdir)
+ os.close(fd)
+ ui.debug('backup %r as %r\n' % (f, tmpname))
+ util.copyfile(repo.wjoin(f), tmpname)
+ shutil.copystat(repo.wjoin(f), tmpname)
+ backups[f] = tmpname
+
+ fp = cStringIO.StringIO()
+ for c in chunks:
+ if c.filename() in backups:
+ c.write(fp)
+ dopatch = fp.tell()
+ fp.seek(0)
+
+ # 3a. apply filtered patch to clean repo (clean)
+ if backups:
+ hg.revert(repo, repo.dirstate.p1(),
+ lambda key: key in backups)
+
+ # 3b. (apply)
+ if dopatch:
+ try:
+ ui.debug('applying patch\n')
+ ui.debug(fp.getvalue())
+ patch.internalpatch(ui, repo, fp, 1, eolmode=None)
+ except patch.PatchError, err:
+ raise util.Abort(str(err))
+ del fp
+
+ # 4. We prepared working directory according to filtered
+ # patch. Now is the time to delegate the job to
+ # commit/qrefresh or the like!
+
+ # it is important to first chdir to repo root -- we'll call
+ # a highlevel command with list of pathnames relative to
+ # repo root
+ cwd = os.getcwd()
+ os.chdir(repo.root)
+ try:
+ commitfunc(ui, repo, *newfiles, **opts)
+ finally:
+ os.chdir(cwd)
+
+ return 0
+ finally:
+ # 5. finally restore backed-up files
+ try:
+ for realname, tmpname in backups.iteritems():
+ ui.debug('restoring %r to %r\n' % (tmpname, realname))
+ util.copyfile(tmpname, repo.wjoin(realname))
+ # Our calls to copystat() here and above are a
+ # hack to trick any editors that have f open that
+ # we haven't modified them.
+ #
+ # Also note that this racy as an editor could
+ # notice the file's mtime before we've finished
+ # writing it.
+ shutil.copystat(tmpname, repo.wjoin(realname))
+ os.unlink(tmpname)
+ if tobackup:
+ os.rmdir(backupdir)
+ except OSError:
+ pass
+
+ # wrap ui.write so diff output can be labeled/colorized
+ def wrapwrite(orig, *args, **kw):
+ label = kw.pop('label', '')
+ for chunk, l in patch.difflabel(lambda: args):
+ orig(chunk, label=label + l)
+ oldwrite = ui.write
+ extensions.wrapfunction(ui, 'write', wrapwrite)
+ try:
+ return cmdutil.commit(ui, repo, recordfunc, pats, opts)
+ finally:
+ ui.write = oldwrite
+
+cmdtable["qrecord"] = \
+ (qrecord, [], # placeholder until mq is available
+ _('hg qrecord [OPTION]... PATCH [FILE]...'))
+
+def uisetup(ui):
+ try:
+ mq = extensions.find('mq')
+ except KeyError:
+ return
+
+ cmdtable["qrecord"] = \
+ (qrecord,
+ # same options as qnew, but copy them so we don't get
+ # -i/--interactive for qrecord and add white space diff options
+ mq.cmdtable['^qnew'][1][:] + diffopts,
+ _('hg qrecord [OPTION]... PATCH [FILE]...'))
+
+ _wrapcmd('qnew', mq.cmdtable, qnew, _("interactively record a new patch"))
+ _wrapcmd('qrefresh', mq.cmdtable, qrefresh,
+ _("interactively select changes to refresh"))
+
+def _wrapcmd(cmd, table, wrapfn, msg):
+ entry = extensions.wrapcommand(table, cmd, wrapfn)
+ entry[1].append(('i', 'interactive', None, msg))
diff --git a/hgext/relink.py b/hgext/relink.py
new file mode 100644
index 0000000..f2e6bf1
--- /dev/null
+++ b/hgext/relink.py
@@ -0,0 +1,184 @@
+# Mercurial extension to provide 'hg relink' command
+#
+# Copyright (C) 2007 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""recreates hardlinks between repository clones"""
+
+from mercurial import hg, util
+from mercurial.i18n import _
+import os, stat
+
+testedwith = 'internal'
+
+def relink(ui, repo, origin=None, **opts):
+ """recreate hardlinks between two repositories
+
+ When repositories are cloned locally, their data files will be
+ hardlinked so that they only use the space of a single repository.
+
+ Unfortunately, subsequent pulls into either repository will break
+ hardlinks for any files touched by the new changesets, even if
+ both repositories end up pulling the same changes.
+
+ Similarly, passing --rev to "hg clone" will fail to use any
+ hardlinks, falling back to a complete copy of the source
+ repository.
+
+ This command lets you recreate those hardlinks and reclaim that
+ wasted space.
+
+ This repository will be relinked to share space with ORIGIN, which
+ must be on the same local disk. If ORIGIN is omitted, looks for
+ "default-relink", then "default", in [paths].
+
+ Do not attempt any read operations on this repository while the
+ command is running. (Both repositories will be locked against
+ writes.)
+ """
+ if (not util.safehasattr(util, 'samefile') or
+ not util.safehasattr(util, 'samedevice')):
+ raise util.Abort(_('hardlinks are not supported on this system'))
+ src = hg.repository(ui, ui.expandpath(origin or 'default-relink',
+ origin or 'default'))
+ ui.status(_('relinking %s to %s\n') % (src.store.path, repo.store.path))
+ if repo.root == src.root:
+ ui.status(_('there is nothing to relink\n'))
+ return
+
+ locallock = repo.lock()
+ try:
+ remotelock = src.lock()
+ try:
+ candidates = sorted(collect(src, ui))
+ targets = prune(candidates, src.store.path, repo.store.path, ui)
+ do_relink(src.store.path, repo.store.path, targets, ui)
+ finally:
+ remotelock.release()
+ finally:
+ locallock.release()
+
+def collect(src, ui):
+ seplen = len(os.path.sep)
+ candidates = []
+ live = len(src['tip'].manifest())
+ # Your average repository has some files which were deleted before
+ # the tip revision. We account for that by assuming that there are
+ # 3 tracked files for every 2 live files as of the tip version of
+ # the repository.
+ #
+ # mozilla-central as of 2010-06-10 had a ratio of just over 7:5.
+ total = live * 3 // 2
+ src = src.store.path
+ pos = 0
+ ui.status(_("tip has %d files, estimated total number of files: %s\n")
+ % (live, total))
+ for dirpath, dirnames, filenames in os.walk(src):
+ dirnames.sort()
+ relpath = dirpath[len(src) + seplen:]
+ for filename in sorted(filenames):
+ if filename[-2:] not in ('.d', '.i'):
+ continue
+ st = os.stat(os.path.join(dirpath, filename))
+ if not stat.S_ISREG(st.st_mode):
+ continue
+ pos += 1
+ candidates.append((os.path.join(relpath, filename), st))
+ ui.progress(_('collecting'), pos, filename, _('files'), total)
+
+ ui.progress(_('collecting'), None)
+ ui.status(_('collected %d candidate storage files\n') % len(candidates))
+ return candidates
+
+def prune(candidates, src, dst, ui):
+ def linkfilter(src, dst, st):
+ try:
+ ts = os.stat(dst)
+ except OSError:
+ # Destination doesn't have this file?
+ return False
+ if util.samefile(src, dst):
+ return False
+ if not util.samedevice(src, dst):
+ # No point in continuing
+ raise util.Abort(
+ _('source and destination are on different devices'))
+ if st.st_size != ts.st_size:
+ return False
+ return st
+
+ targets = []
+ total = len(candidates)
+ pos = 0
+ for fn, st in candidates:
+ pos += 1
+ srcpath = os.path.join(src, fn)
+ tgt = os.path.join(dst, fn)
+ ts = linkfilter(srcpath, tgt, st)
+ if not ts:
+ ui.debug('not linkable: %s\n' % fn)
+ continue
+ targets.append((fn, ts.st_size))
+ ui.progress(_('pruning'), pos, fn, _('files'), total)
+
+ ui.progress(_('pruning'), None)
+ ui.status(_('pruned down to %d probably relinkable files\n') % len(targets))
+ return targets
+
+def do_relink(src, dst, files, ui):
+ def relinkfile(src, dst):
+ bak = dst + '.bak'
+ os.rename(dst, bak)
+ try:
+ util.oslink(src, dst)
+ except OSError:
+ os.rename(bak, dst)
+ raise
+ os.remove(bak)
+
+ CHUNKLEN = 65536
+ relinked = 0
+ savedbytes = 0
+
+ pos = 0
+ total = len(files)
+ for f, sz in files:
+ pos += 1
+ source = os.path.join(src, f)
+ tgt = os.path.join(dst, f)
+ # Binary mode, so that read() works correctly, especially on Windows
+ sfp = file(source, 'rb')
+ dfp = file(tgt, 'rb')
+ sin = sfp.read(CHUNKLEN)
+ while sin:
+ din = dfp.read(CHUNKLEN)
+ if sin != din:
+ break
+ sin = sfp.read(CHUNKLEN)
+ sfp.close()
+ dfp.close()
+ if sin:
+ ui.debug('not linkable: %s\n' % f)
+ continue
+ try:
+ relinkfile(source, tgt)
+ ui.progress(_('relinking'), pos, f, _('files'), total)
+ relinked += 1
+ savedbytes += sz
+ except OSError, inst:
+ ui.warn('%s: %s\n' % (tgt, str(inst)))
+
+ ui.progress(_('relinking'), None)
+
+ ui.status(_('relinked %d files (%s reclaimed)\n') %
+ (relinked, util.bytecount(savedbytes)))
+
+cmdtable = {
+ 'relink': (
+ relink,
+ [],
+ _('[ORIGIN]')
+ )
+}
diff --git a/hgext/schemes.py b/hgext/schemes.py
new file mode 100644
index 0000000..51ab3ed
--- /dev/null
+++ b/hgext/schemes.py
@@ -0,0 +1,101 @@
+# Copyright 2009, Alexander Solovyov <piranha@piranha.org.ua>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""extend schemes with shortcuts to repository swarms
+
+This extension allows you to specify shortcuts for parent URLs with a
+lot of repositories to act like a scheme, for example::
+
+ [schemes]
+ py = http://code.python.org/hg/
+
+After that you can use it like::
+
+ hg clone py://trunk/
+
+Additionally there is support for some more complex schemas, for
+example used by Google Code::
+
+ [schemes]
+ gcode = http://{1}.googlecode.com/hg/
+
+The syntax is taken from Mercurial templates, and you have unlimited
+number of variables, starting with ``{1}`` and continuing with
+``{2}``, ``{3}`` and so on. This variables will receive parts of URL
+supplied, split by ``/``. Anything not specified as ``{part}`` will be
+just appended to an URL.
+
+For convenience, the extension adds these schemes by default::
+
+ [schemes]
+ py = http://hg.python.org/
+ bb = https://bitbucket.org/
+ bb+ssh = ssh://hg@bitbucket.org/
+ gcode = https://{1}.googlecode.com/hg/
+ kiln = https://{1}.kilnhg.com/Repo/
+
+You can override a predefined scheme by defining a new scheme with the
+same name.
+"""
+
+import os, re
+from mercurial import extensions, hg, templater, util
+from mercurial.i18n import _
+
+testedwith = 'internal'
+
+
+class ShortRepository(object):
+ def __init__(self, url, scheme, templater):
+ self.scheme = scheme
+ self.templater = templater
+ self.url = url
+ try:
+ self.parts = max(map(int, re.findall(r'\{(\d+)\}', self.url)))
+ except ValueError:
+ self.parts = 0
+
+ def __repr__(self):
+ return '<ShortRepository: %s>' % self.scheme
+
+ def instance(self, ui, url, create):
+ # Should this use urlmod.url(), or is manual parsing better?
+ url = url.split('://', 1)[1]
+ parts = url.split('/', self.parts)
+ if len(parts) > self.parts:
+ tail = parts[-1]
+ parts = parts[:-1]
+ else:
+ tail = ''
+ context = dict((str(i + 1), v) for i, v in enumerate(parts))
+ url = ''.join(self.templater.process(self.url, context)) + tail
+ return hg._peerlookup(url).instance(ui, url, create)
+
+def hasdriveletter(orig, path):
+ if path:
+ for scheme in schemes:
+ if path.startswith(scheme + ':'):
+ return False
+ return orig(path)
+
+schemes = {
+ 'py': 'http://hg.python.org/',
+ 'bb': 'https://bitbucket.org/',
+ 'bb+ssh': 'ssh://hg@bitbucket.org/',
+ 'gcode': 'https://{1}.googlecode.com/hg/',
+ 'kiln': 'https://{1}.kilnhg.com/Repo/'
+ }
+
+def extsetup(ui):
+ schemes.update(dict(ui.configitems('schemes')))
+ t = templater.engine(lambda x: x)
+ for scheme, url in schemes.items():
+ if (os.name == 'nt' and len(scheme) == 1 and scheme.isalpha()
+ and os.path.exists('%s:\\' % scheme)):
+ raise util.Abort(_('custom scheme %s:// conflicts with drive '
+ 'letter %s:\\\n') % (scheme, scheme.upper()))
+ hg.schemes[scheme] = ShortRepository(url, scheme, t)
+
+ extensions.wrapfunction(util, 'hasdriveletter', hasdriveletter)
diff --git a/hgext/share.py b/hgext/share.py
new file mode 100644
index 0000000..fb11921
--- /dev/null
+++ b/hgext/share.py
@@ -0,0 +1,75 @@
+# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''share a common history between several working directories'''
+
+from mercurial.i18n import _
+from mercurial import hg, commands, util
+
+testedwith = 'internal'
+
+def share(ui, source, dest=None, noupdate=False):
+ """create a new shared repository
+
+ Initialize a new repository and working directory that shares its
+ history with another repository.
+
+ .. note::
+ using rollback or extensions that destroy/modify history (mq,
+ rebase, etc.) can cause considerable confusion with shared
+ clones. In particular, if two shared clones are both updated to
+ the same changeset, and one of them destroys that changeset
+ with rollback, the other clone will suddenly stop working: all
+ operations will fail with "abort: working directory has unknown
+ parent". The only known workaround is to use debugsetparents on
+ the broken clone to reset it to a changeset that still exists
+ (e.g. tip).
+ """
+
+ return hg.share(ui, source, dest, not noupdate)
+
+def unshare(ui, repo):
+ """convert a shared repository to a normal one
+
+ Copy the store data to the repo and remove the sharedpath data.
+ """
+
+ if repo.sharedpath == repo.path:
+ raise util.Abort(_("this is not a shared repo"))
+
+ destlock = lock = None
+ lock = repo.lock()
+ try:
+ # we use locks here because if we race with commit, we
+ # can end up with extra data in the cloned revlogs that's
+ # not pointed to by changesets, thus causing verify to
+ # fail
+
+ destlock = hg.copystore(ui, repo, repo.path)
+
+ sharefile = repo.join('sharedpath')
+ util.rename(sharefile, sharefile + '.old')
+
+ repo.requirements.discard('sharedpath')
+ repo._writerequirements()
+ finally:
+ destlock and destlock.release()
+ lock and lock.release()
+
+ # update store, spath, sopener and sjoin of repo
+ repo.__init__(ui, repo.root)
+
+cmdtable = {
+ "share":
+ (share,
+ [('U', 'noupdate', None, _('do not create a working copy'))],
+ _('[-U] SOURCE [DEST]')),
+ "unshare":
+ (unshare,
+ [],
+ ''),
+}
+
+commands.norepo += " share"
diff --git a/hgext/transplant.py b/hgext/transplant.py
new file mode 100644
index 0000000..a506c0c
--- /dev/null
+++ b/hgext/transplant.py
@@ -0,0 +1,676 @@
+# Patch transplanting extension for Mercurial
+#
+# Copyright 2006, 2007 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''command to transplant changesets from another branch
+
+This extension allows you to transplant patches from another branch.
+
+Transplanted patches are recorded in .hg/transplant/transplants, as a
+map from a changeset hash to its hash in the source repository.
+'''
+
+from mercurial.i18n import _
+import os, tempfile
+from mercurial.node import short
+from mercurial import bundlerepo, hg, merge, match
+from mercurial import patch, revlog, scmutil, util, error, cmdutil
+from mercurial import revset, templatekw
+
+class TransplantError(error.Abort):
+ pass
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+testedwith = 'internal'
+
+class transplantentry(object):
+ def __init__(self, lnode, rnode):
+ self.lnode = lnode
+ self.rnode = rnode
+
+class transplants(object):
+ def __init__(self, path=None, transplantfile=None, opener=None):
+ self.path = path
+ self.transplantfile = transplantfile
+ self.opener = opener
+
+ if not opener:
+ self.opener = scmutil.opener(self.path)
+ self.transplants = {}
+ self.dirty = False
+ self.read()
+
+ def read(self):
+ abspath = os.path.join(self.path, self.transplantfile)
+ if self.transplantfile and os.path.exists(abspath):
+ for line in self.opener.read(self.transplantfile).splitlines():
+ lnode, rnode = map(revlog.bin, line.split(':'))
+ list = self.transplants.setdefault(rnode, [])
+ list.append(transplantentry(lnode, rnode))
+
+ def write(self):
+ if self.dirty and self.transplantfile:
+ if not os.path.isdir(self.path):
+ os.mkdir(self.path)
+ fp = self.opener(self.transplantfile, 'w')
+ for list in self.transplants.itervalues():
+ for t in list:
+ l, r = map(revlog.hex, (t.lnode, t.rnode))
+ fp.write(l + ':' + r + '\n')
+ fp.close()
+ self.dirty = False
+
+ def get(self, rnode):
+ return self.transplants.get(rnode) or []
+
+ def set(self, lnode, rnode):
+ list = self.transplants.setdefault(rnode, [])
+ list.append(transplantentry(lnode, rnode))
+ self.dirty = True
+
+ def remove(self, transplant):
+ list = self.transplants.get(transplant.rnode)
+ if list:
+ del list[list.index(transplant)]
+ self.dirty = True
+
+class transplanter(object):
+ def __init__(self, ui, repo):
+ self.ui = ui
+ self.path = repo.join('transplant')
+ self.opener = scmutil.opener(self.path)
+ self.transplants = transplants(self.path, 'transplants',
+ opener=self.opener)
+ self.editor = None
+
+ def applied(self, repo, node, parent):
+ '''returns True if a node is already an ancestor of parent
+ or is parent or has already been transplanted'''
+ if hasnode(repo, parent):
+ parentrev = repo.changelog.rev(parent)
+ if hasnode(repo, node):
+ rev = repo.changelog.rev(node)
+ reachable = repo.changelog.incancestors([parentrev], rev)
+ if rev in reachable:
+ return True
+ for t in self.transplants.get(node):
+ # it might have been stripped
+ if not hasnode(repo, t.lnode):
+ self.transplants.remove(t)
+ return False
+ lnoderev = repo.changelog.rev(t.lnode)
+ if lnoderev in repo.changelog.incancestors([parentrev], lnoderev):
+ return True
+ return False
+
+ def apply(self, repo, source, revmap, merges, opts={}):
+ '''apply the revisions in revmap one by one in revision order'''
+ revs = sorted(revmap)
+ p1, p2 = repo.dirstate.parents()
+ pulls = []
+ diffopts = patch.diffopts(self.ui, opts)
+ diffopts.git = True
+
+ lock = wlock = tr = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ tr = repo.transaction('transplant')
+ for rev in revs:
+ node = revmap[rev]
+ revstr = '%s:%s' % (rev, short(node))
+
+ if self.applied(repo, node, p1):
+ self.ui.warn(_('skipping already applied revision %s\n') %
+ revstr)
+ continue
+
+ parents = source.changelog.parents(node)
+ if not (opts.get('filter') or opts.get('log')):
+ # If the changeset parent is the same as the
+ # wdir's parent, just pull it.
+ if parents[0] == p1:
+ pulls.append(node)
+ p1 = node
+ continue
+ if pulls:
+ if source != repo:
+ repo.pull(source.peer(), heads=pulls)
+ merge.update(repo, pulls[-1], False, False, None)
+ p1, p2 = repo.dirstate.parents()
+ pulls = []
+
+ domerge = False
+ if node in merges:
+ # pulling all the merge revs at once would mean we
+ # couldn't transplant after the latest even if
+ # transplants before them fail.
+ domerge = True
+ if not hasnode(repo, node):
+ repo.pull(source, heads=[node])
+
+ skipmerge = False
+ if parents[1] != revlog.nullid:
+ if not opts.get('parent'):
+ self.ui.note(_('skipping merge changeset %s:%s\n')
+ % (rev, short(node)))
+ skipmerge = True
+ else:
+ parent = source.lookup(opts['parent'])
+ if parent not in parents:
+ raise util.Abort(_('%s is not a parent of %s') %
+ (short(parent), short(node)))
+ else:
+ parent = parents[0]
+
+ if skipmerge:
+ patchfile = None
+ else:
+ fd, patchfile = tempfile.mkstemp(prefix='hg-transplant-')
+ fp = os.fdopen(fd, 'w')
+ gen = patch.diff(source, parent, node, opts=diffopts)
+ for chunk in gen:
+ fp.write(chunk)
+ fp.close()
+
+ del revmap[rev]
+ if patchfile or domerge:
+ try:
+ try:
+ n = self.applyone(repo, node,
+ source.changelog.read(node),
+ patchfile, merge=domerge,
+ log=opts.get('log'),
+ filter=opts.get('filter'))
+ except TransplantError:
+ # Do not rollback, it is up to the user to
+ # fix the merge or cancel everything
+ tr.close()
+ raise
+ if n and domerge:
+ self.ui.status(_('%s merged at %s\n') % (revstr,
+ short(n)))
+ elif n:
+ self.ui.status(_('%s transplanted to %s\n')
+ % (short(node),
+ short(n)))
+ finally:
+ if patchfile:
+ os.unlink(patchfile)
+ tr.close()
+ if pulls:
+ repo.pull(source.peer(), heads=pulls)
+ merge.update(repo, pulls[-1], False, False, None)
+ finally:
+ self.saveseries(revmap, merges)
+ self.transplants.write()
+ if tr:
+ tr.release()
+ lock.release()
+ wlock.release()
+
+ def filter(self, filter, node, changelog, patchfile):
+ '''arbitrarily rewrite changeset before applying it'''
+
+ self.ui.status(_('filtering %s\n') % patchfile)
+ user, date, msg = (changelog[1], changelog[2], changelog[4])
+ fd, headerfile = tempfile.mkstemp(prefix='hg-transplant-')
+ fp = os.fdopen(fd, 'w')
+ fp.write("# HG changeset patch\n")
+ fp.write("# User %s\n" % user)
+ fp.write("# Date %d %d\n" % date)
+ fp.write(msg + '\n')
+ fp.close()
+
+ try:
+ util.system('%s %s %s' % (filter, util.shellquote(headerfile),
+ util.shellquote(patchfile)),
+ environ={'HGUSER': changelog[1],
+ 'HGREVISION': revlog.hex(node),
+ },
+ onerr=util.Abort, errprefix=_('filter failed'),
+ out=self.ui.fout)
+ user, date, msg = self.parselog(file(headerfile))[1:4]
+ finally:
+ os.unlink(headerfile)
+
+ return (user, date, msg)
+
+ def applyone(self, repo, node, cl, patchfile, merge=False, log=False,
+ filter=None):
+ '''apply the patch in patchfile to the repository as a transplant'''
+ (manifest, user, (time, timezone), files, message) = cl[:5]
+ date = "%d %d" % (time, timezone)
+ extra = {'transplant_source': node}
+ if filter:
+ (user, date, message) = self.filter(filter, node, cl, patchfile)
+
+ if log:
+ # we don't translate messages inserted into commits
+ message += '\n(transplanted from %s)' % revlog.hex(node)
+
+ self.ui.status(_('applying %s\n') % short(node))
+ self.ui.note('%s %s\n%s\n' % (user, date, message))
+
+ if not patchfile and not merge:
+ raise util.Abort(_('can only omit patchfile if merging'))
+ if patchfile:
+ try:
+ files = set()
+ patch.patch(self.ui, repo, patchfile, files=files, eolmode=None)
+ files = list(files)
+ except Exception, inst:
+ seriespath = os.path.join(self.path, 'series')
+ if os.path.exists(seriespath):
+ os.unlink(seriespath)
+ p1 = repo.dirstate.p1()
+ p2 = node
+ self.log(user, date, message, p1, p2, merge=merge)
+ self.ui.write(str(inst) + '\n')
+ raise TransplantError(_('fix up the merge and run '
+ 'hg transplant --continue'))
+ else:
+ files = None
+ if merge:
+ p1, p2 = repo.dirstate.parents()
+ repo.setparents(p1, node)
+ m = match.always(repo.root, '')
+ else:
+ m = match.exact(repo.root, '', files)
+
+ n = repo.commit(message, user, date, extra=extra, match=m,
+ editor=self.editor)
+ if not n:
+ self.ui.warn(_('skipping emptied changeset %s\n') % short(node))
+ return None
+ if not merge:
+ self.transplants.set(n, node)
+
+ return n
+
+ def resume(self, repo, source, opts=None):
+ '''recover last transaction and apply remaining changesets'''
+ if os.path.exists(os.path.join(self.path, 'journal')):
+ n, node = self.recover(repo)
+ self.ui.status(_('%s transplanted as %s\n') % (short(node),
+ short(n)))
+ seriespath = os.path.join(self.path, 'series')
+ if not os.path.exists(seriespath):
+ self.transplants.write()
+ return
+ nodes, merges = self.readseries()
+ revmap = {}
+ for n in nodes:
+ revmap[source.changelog.rev(n)] = n
+ os.unlink(seriespath)
+
+ self.apply(repo, source, revmap, merges, opts)
+
+ def recover(self, repo):
+ '''commit working directory using journal metadata'''
+ node, user, date, message, parents = self.readlog()
+ merge = False
+
+ if not user or not date or not message or not parents[0]:
+ raise util.Abort(_('transplant log file is corrupt'))
+
+ parent = parents[0]
+ if len(parents) > 1:
+ if opts.get('parent'):
+ parent = source.lookup(opts['parent'])
+ if parent not in parents:
+ raise util.Abort(_('%s is not a parent of %s') %
+ (short(parent), short(node)))
+ else:
+ merge = True
+
+ extra = {'transplant_source': node}
+ wlock = repo.wlock()
+ try:
+ p1, p2 = repo.dirstate.parents()
+ if p1 != parent:
+ raise util.Abort(
+ _('working dir not at transplant parent %s') %
+ revlog.hex(parent))
+ if merge:
+ repo.setparents(p1, parents[1])
+ n = repo.commit(message, user, date, extra=extra,
+ editor=self.editor)
+ if not n:
+ raise util.Abort(_('commit failed'))
+ if not merge:
+ self.transplants.set(n, node)
+ self.unlog()
+
+ return n, node
+ finally:
+ wlock.release()
+
+ def readseries(self):
+ nodes = []
+ merges = []
+ cur = nodes
+ for line in self.opener.read('series').splitlines():
+ if line.startswith('# Merges'):
+ cur = merges
+ continue
+ cur.append(revlog.bin(line))
+
+ return (nodes, merges)
+
+ def saveseries(self, revmap, merges):
+ if not revmap:
+ return
+
+ if not os.path.isdir(self.path):
+ os.mkdir(self.path)
+ series = self.opener('series', 'w')
+ for rev in sorted(revmap):
+ series.write(revlog.hex(revmap[rev]) + '\n')
+ if merges:
+ series.write('# Merges\n')
+ for m in merges:
+ series.write(revlog.hex(m) + '\n')
+ series.close()
+
+ def parselog(self, fp):
+ parents = []
+ message = []
+ node = revlog.nullid
+ inmsg = False
+ user = None
+ date = None
+ for line in fp.read().splitlines():
+ if inmsg:
+ message.append(line)
+ elif line.startswith('# User '):
+ user = line[7:]
+ elif line.startswith('# Date '):
+ date = line[7:]
+ elif line.startswith('# Node ID '):
+ node = revlog.bin(line[10:])
+ elif line.startswith('# Parent '):
+ parents.append(revlog.bin(line[9:]))
+ elif not line.startswith('# '):
+ inmsg = True
+ message.append(line)
+ if None in (user, date):
+ raise util.Abort(_("filter corrupted changeset (no user or date)"))
+ return (node, user, date, '\n'.join(message), parents)
+
+ def log(self, user, date, message, p1, p2, merge=False):
+ '''journal changelog metadata for later recover'''
+
+ if not os.path.isdir(self.path):
+ os.mkdir(self.path)
+ fp = self.opener('journal', 'w')
+ fp.write('# User %s\n' % user)
+ fp.write('# Date %s\n' % date)
+ fp.write('# Node ID %s\n' % revlog.hex(p2))
+ fp.write('# Parent ' + revlog.hex(p1) + '\n')
+ if merge:
+ fp.write('# Parent ' + revlog.hex(p2) + '\n')
+ fp.write(message.rstrip() + '\n')
+ fp.close()
+
+ def readlog(self):
+ return self.parselog(self.opener('journal'))
+
+ def unlog(self):
+ '''remove changelog journal'''
+ absdst = os.path.join(self.path, 'journal')
+ if os.path.exists(absdst):
+ os.unlink(absdst)
+
+ def transplantfilter(self, repo, source, root):
+ def matchfn(node):
+ if self.applied(repo, node, root):
+ return False
+ if source.changelog.parents(node)[1] != revlog.nullid:
+ return False
+ extra = source.changelog.read(node)[5]
+ cnode = extra.get('transplant_source')
+ if cnode and self.applied(repo, cnode, root):
+ return False
+ return True
+
+ return matchfn
+
+def hasnode(repo, node):
+ try:
+ return repo.changelog.rev(node) is not None
+ except error.RevlogError:
+ return False
+
+def browserevs(ui, repo, nodes, opts):
+ '''interactively transplant changesets'''
+ def browsehelp(ui):
+ ui.write(_('y: transplant this changeset\n'
+ 'n: skip this changeset\n'
+ 'm: merge at this changeset\n'
+ 'p: show patch\n'
+ 'c: commit selected changesets\n'
+ 'q: cancel transplant\n'
+ '?: show this help\n'))
+
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ transplants = []
+ merges = []
+ for node in nodes:
+ displayer.show(repo[node])
+ action = None
+ while not action:
+ action = ui.prompt(_('apply changeset? [ynmpcq?]:'))
+ if action == '?':
+ browsehelp(ui)
+ action = None
+ elif action == 'p':
+ parent = repo.changelog.parents(node)[0]
+ for chunk in patch.diff(repo, parent, node):
+ ui.write(chunk)
+ action = None
+ elif action not in ('y', 'n', 'm', 'c', 'q'):
+ ui.write(_('no such option\n'))
+ action = None
+ if action == 'y':
+ transplants.append(node)
+ elif action == 'm':
+ merges.append(node)
+ elif action == 'c':
+ break
+ elif action == 'q':
+ transplants = ()
+ merges = ()
+ break
+ displayer.close()
+ return (transplants, merges)
+
+@command('transplant',
+ [('s', 'source', '', _('pull patches from REPO'), _('REPO')),
+ ('b', 'branch', [],
+ _('pull patches from branch BRANCH'), _('BRANCH')),
+ ('a', 'all', None, _('pull all changesets up to BRANCH')),
+ ('p', 'prune', [], _('skip over REV'), _('REV')),
+ ('m', 'merge', [], _('merge at REV'), _('REV')),
+ ('', 'parent', '',
+ _('parent to choose when transplanting merge'), _('REV')),
+ ('e', 'edit', False, _('invoke editor on commit messages')),
+ ('', 'log', None, _('append transplant info to log message')),
+ ('c', 'continue', None, _('continue last transplant session '
+ 'after repair')),
+ ('', 'filter', '',
+ _('filter changesets through command'), _('CMD'))],
+ _('hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] '
+ '[-m REV] [REV]...'))
+def transplant(ui, repo, *revs, **opts):
+ '''transplant changesets from another branch
+
+ Selected changesets will be applied on top of the current working
+ directory with the log of the original changeset. The changesets
+ are copied and will thus appear twice in the history. Use the
+ rebase extension instead if you want to move a whole branch of
+ unpublished changesets.
+
+ If --log is specified, log messages will have a comment appended
+ of the form::
+
+ (transplanted from CHANGESETHASH)
+
+ You can rewrite the changelog message with the --filter option.
+ Its argument will be invoked with the current changelog message as
+ $1 and the patch as $2.
+
+ If --source/-s is specified, selects changesets from the named
+ repository. If --branch/-b is specified, selects changesets from
+ the branch holding the named revision, up to that revision. If
+ --all/-a is specified, all changesets on the branch will be
+ transplanted, otherwise you will be prompted to select the
+ changesets you want.
+
+ :hg:`transplant --branch REV --all` will transplant the
+ selected branch (up to the named revision) onto your current
+ working directory.
+
+ You can optionally mark selected transplanted changesets as merge
+ changesets. You will not be prompted to transplant any ancestors
+ of a merged transplant, and you can merge descendants of them
+ normally instead of transplanting them.
+
+ Merge changesets may be transplanted directly by specifying the
+ proper parent changeset by calling :hg:`transplant --parent`.
+
+ If no merges or revisions are provided, :hg:`transplant` will
+ start an interactive changeset browser.
+
+ If a changeset application fails, you can fix the merge by hand
+ and then resume where you left off by calling :hg:`transplant
+ --continue/-c`.
+ '''
+ def incwalk(repo, csets, match=util.always):
+ for node in csets:
+ if match(node):
+ yield node
+
+ def transplantwalk(repo, root, branches, match=util.always):
+ if not branches:
+ branches = repo.heads()
+ ancestors = []
+ for branch in branches:
+ ancestors.append(repo.changelog.ancestor(root, branch))
+ for node in repo.changelog.nodesbetween(ancestors, branches)[0]:
+ if match(node):
+ yield node
+
+ def checkopts(opts, revs):
+ if opts.get('continue'):
+ if opts.get('branch') or opts.get('all') or opts.get('merge'):
+ raise util.Abort(_('--continue is incompatible with '
+ 'branch, all or merge'))
+ return
+ if not (opts.get('source') or revs or
+ opts.get('merge') or opts.get('branch')):
+ raise util.Abort(_('no source URL, branch tag or revision '
+ 'list provided'))
+ if opts.get('all'):
+ if not opts.get('branch'):
+ raise util.Abort(_('--all requires a branch revision'))
+ if revs:
+ raise util.Abort(_('--all is incompatible with a '
+ 'revision list'))
+
+ checkopts(opts, revs)
+
+ if not opts.get('log'):
+ opts['log'] = ui.config('transplant', 'log')
+ if not opts.get('filter'):
+ opts['filter'] = ui.config('transplant', 'filter')
+
+ tp = transplanter(ui, repo)
+ if opts.get('edit'):
+ tp.editor = cmdutil.commitforceeditor
+
+ p1, p2 = repo.dirstate.parents()
+ if len(repo) > 0 and p1 == revlog.nullid:
+ raise util.Abort(_('no revision checked out'))
+ if not opts.get('continue'):
+ if p2 != revlog.nullid:
+ raise util.Abort(_('outstanding uncommitted merges'))
+ m, a, r, d = repo.status()[:4]
+ if m or a or r or d:
+ raise util.Abort(_('outstanding local changes'))
+
+ sourcerepo = opts.get('source')
+ if sourcerepo:
+ peer = hg.peer(ui, opts, ui.expandpath(sourcerepo))
+ branches = map(peer.lookup, opts.get('branch', ()))
+ source, csets, cleanupfn = bundlerepo.getremotechanges(ui, repo, peer,
+ onlyheads=branches, force=True)
+ else:
+ source = repo
+ branches = map(source.lookup, opts.get('branch', ()))
+ cleanupfn = None
+
+ try:
+ if opts.get('continue'):
+ tp.resume(repo, source, opts)
+ return
+
+ tf = tp.transplantfilter(repo, source, p1)
+ if opts.get('prune'):
+ prune = [source.lookup(r)
+ for r in scmutil.revrange(source, opts.get('prune'))]
+ matchfn = lambda x: tf(x) and x not in prune
+ else:
+ matchfn = tf
+ merges = map(source.lookup, opts.get('merge', ()))
+ revmap = {}
+ if revs:
+ for r in scmutil.revrange(source, revs):
+ revmap[int(r)] = source.lookup(r)
+ elif opts.get('all') or not merges:
+ if source != repo:
+ alltransplants = incwalk(source, csets, match=matchfn)
+ else:
+ alltransplants = transplantwalk(source, p1, branches,
+ match=matchfn)
+ if opts.get('all'):
+ revs = alltransplants
+ else:
+ revs, newmerges = browserevs(ui, source, alltransplants, opts)
+ merges.extend(newmerges)
+ for r in revs:
+ revmap[source.changelog.rev(r)] = r
+ for r in merges:
+ revmap[source.changelog.rev(r)] = r
+
+ tp.apply(repo, source, revmap, merges, opts)
+ finally:
+ if cleanupfn:
+ cleanupfn()
+
+def revsettransplanted(repo, subset, x):
+ """``transplanted([set])``
+ Transplanted changesets in set, or all transplanted changesets.
+ """
+ if x:
+ s = revset.getset(repo, subset, x)
+ else:
+ s = subset
+ return [r for r in s if repo[r].extra().get('transplant_source')]
+
+def kwtransplanted(repo, ctx, **args):
+ """:transplanted: String. The node identifier of the transplanted
+ changeset if any."""
+ n = ctx.extra().get('transplant_source')
+ return n and revlog.hex(n) or ''
+
+def extsetup(ui):
+ revset.symbols['transplanted'] = revsettransplanted
+ templatekw.keywords['transplanted'] = kwtransplanted
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = [revsettransplanted, kwtransplanted]
diff --git a/hgext/win32mbcs.py b/hgext/win32mbcs.py
new file mode 100644
index 0000000..65f0854
--- /dev/null
+++ b/hgext/win32mbcs.py
@@ -0,0 +1,167 @@
+# win32mbcs.py -- MBCS filename support for Mercurial
+#
+# Copyright (c) 2008 Shun-ichi Goto <shunichi.goto@gmail.com>
+#
+# Version: 0.3
+# Author: Shun-ichi Goto <shunichi.goto@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+
+'''allow the use of MBCS paths with problematic encodings
+
+Some MBCS encodings are not good for some path operations (i.e.
+splitting path, case conversion, etc.) with its encoded bytes. We call
+such a encoding (i.e. shift_jis and big5) as "problematic encoding".
+This extension can be used to fix the issue with those encodings by
+wrapping some functions to convert to Unicode string before path
+operation.
+
+This extension is useful for:
+
+- Japanese Windows users using shift_jis encoding.
+- Chinese Windows users using big5 encoding.
+- All users who use a repository with one of problematic encodings on
+ case-insensitive file system.
+
+This extension is not needed for:
+
+- Any user who use only ASCII chars in path.
+- Any user who do not use any of problematic encodings.
+
+Note that there are some limitations on using this extension:
+
+- You should use single encoding in one repository.
+- If the repository path ends with 0x5c, .hg/hgrc cannot be read.
+- win32mbcs is not compatible with fixutf8 extension.
+
+By default, win32mbcs uses encoding.encoding decided by Mercurial.
+You can specify the encoding by config option::
+
+ [win32mbcs]
+ encoding = sjis
+
+It is useful for the users who want to commit with UTF-8 log message.
+'''
+
+import os, sys
+from mercurial.i18n import _
+from mercurial import util, encoding
+testedwith = 'internal'
+
+_encoding = None # see extsetup
+
+def decode(arg):
+ if isinstance(arg, str):
+ uarg = arg.decode(_encoding)
+ if arg == uarg.encode(_encoding):
+ return uarg
+ raise UnicodeError("Not local encoding")
+ elif isinstance(arg, tuple):
+ return tuple(map(decode, arg))
+ elif isinstance(arg, list):
+ return map(decode, arg)
+ elif isinstance(arg, dict):
+ for k, v in arg.items():
+ arg[k] = decode(v)
+ return arg
+
+def encode(arg):
+ if isinstance(arg, unicode):
+ return arg.encode(_encoding)
+ elif isinstance(arg, tuple):
+ return tuple(map(encode, arg))
+ elif isinstance(arg, list):
+ return map(encode, arg)
+ elif isinstance(arg, dict):
+ for k, v in arg.items():
+ arg[k] = encode(v)
+ return arg
+
+def appendsep(s):
+ # ensure the path ends with os.sep, appending it if necessary.
+ try:
+ us = decode(s)
+ except UnicodeError:
+ us = s
+ if us and us[-1] not in ':/\\':
+ s += os.sep
+ return s
+
+def wrapper(func, args, kwds):
+ # check argument is unicode, then call original
+ for arg in args:
+ if isinstance(arg, unicode):
+ return func(*args, **kwds)
+
+ try:
+ # convert arguments to unicode, call func, then convert back
+ return encode(func(*decode(args), **decode(kwds)))
+ except UnicodeError:
+ raise util.Abort(_("[win32mbcs] filename conversion failed with"
+ " %s encoding\n") % (_encoding))
+
+def wrapperforlistdir(func, args, kwds):
+ # Ensure 'path' argument ends with os.sep to avoids
+ # misinterpreting last 0x5c of MBCS 2nd byte as path separator.
+ if args:
+ args = list(args)
+ args[0] = appendsep(args[0])
+ if 'path' in kwds:
+ kwds['path'] = appendsep(kwds['path'])
+ return func(*args, **kwds)
+
+def wrapname(name, wrapper):
+ module, name = name.rsplit('.', 1)
+ module = sys.modules[module]
+ func = getattr(module, name)
+ def f(*args, **kwds):
+ return wrapper(func, args, kwds)
+ try:
+ f.__name__ = func.__name__ # fail with python23
+ except Exception:
+ pass
+ setattr(module, name, f)
+
+# List of functions to be wrapped.
+# NOTE: os.path.dirname() and os.path.basename() are safe because
+# they use result of os.path.split()
+funcs = '''os.path.join os.path.split os.path.splitext
+ os.path.normpath os.makedirs
+ mercurial.util.endswithsep mercurial.util.splitpath mercurial.util.checkcase
+ mercurial.util.fspath mercurial.util.pconvert mercurial.util.normpath
+ mercurial.util.checkwinfilename mercurial.util.checkosfilename'''
+
+# List of Windows specific functions to be wrapped.
+winfuncs = '''os.path.splitunc'''
+
+# codec and alias names of sjis and big5 to be faked.
+problematic_encodings = '''big5 big5-tw csbig5 big5hkscs big5-hkscs
+ hkscs cp932 932 ms932 mskanji ms-kanji shift_jis csshiftjis shiftjis
+ sjis s_jis shift_jis_2004 shiftjis2004 sjis_2004 sjis2004
+ shift_jisx0213 shiftjisx0213 sjisx0213 s_jisx0213 950 cp950 ms950 '''
+
+def extsetup(ui):
+ # TODO: decide use of config section for this extension
+ if ((not os.path.supports_unicode_filenames) and
+ (sys.platform != 'cygwin')):
+ ui.warn(_("[win32mbcs] cannot activate on this platform.\n"))
+ return
+ # determine encoding for filename
+ global _encoding
+ _encoding = ui.config('win32mbcs', 'encoding', encoding.encoding)
+ # fake is only for relevant environment.
+ if _encoding.lower() in problematic_encodings.split():
+ for f in funcs.split():
+ wrapname(f, wrapper)
+ if os.name == 'nt':
+ for f in winfuncs.split():
+ wrapname(f, wrapper)
+ wrapname("mercurial.osutil.listdir", wrapperforlistdir)
+ # Check sys.args manually instead of using ui.debug() because
+ # command line options is not yet applied when
+ # extensions.loadall() is called.
+ if '--debug' in sys.argv:
+ ui.write("[win32mbcs] activated with encoding: %s\n"
+ % _encoding)
diff --git a/hgext/win32text.py b/hgext/win32text.py
new file mode 100644
index 0000000..a26c997
--- /dev/null
+++ b/hgext/win32text.py
@@ -0,0 +1,172 @@
+# win32text.py - LF <-> CRLF/CR translation utilities for Windows/Mac users
+#
+# Copyright 2005, 2007-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''perform automatic newline conversion
+
+ Deprecation: The win32text extension requires each user to configure
+ the extension again and again for each clone since the configuration
+ is not copied when cloning.
+
+ We have therefore made the ``eol`` as an alternative. The ``eol``
+ uses a version controlled file for its configuration and each clone
+ will therefore use the right settings from the start.
+
+To perform automatic newline conversion, use::
+
+ [extensions]
+ win32text =
+ [encode]
+ ** = cleverencode:
+ # or ** = macencode:
+
+ [decode]
+ ** = cleverdecode:
+ # or ** = macdecode:
+
+If not doing conversion, to make sure you do not commit CRLF/CR by accident::
+
+ [hooks]
+ pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+ # or pretxncommit.cr = python:hgext.win32text.forbidcr
+
+To do the same check on a server to prevent CRLF/CR from being
+pushed or pulled::
+
+ [hooks]
+ pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf
+ # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr
+'''
+
+from mercurial.i18n import _
+from mercurial.node import short
+from mercurial import util
+import re
+
+testedwith = 'internal'
+
+# regexp for single LF without CR preceding.
+re_single_lf = re.compile('(^|[^\r])\n', re.MULTILINE)
+
+newlinestr = {'\r\n': 'CRLF', '\r': 'CR'}
+filterstr = {'\r\n': 'clever', '\r': 'mac'}
+
+def checknewline(s, newline, ui=None, repo=None, filename=None):
+ # warn if already has 'newline' in repository.
+ # it might cause unexpected eol conversion.
+ # see issue 302:
+ # http://mercurial.selenic.com/bts/issue302
+ if newline in s and ui and filename and repo:
+ ui.warn(_('WARNING: %s already has %s line endings\n'
+ 'and does not need EOL conversion by the win32text plugin.\n'
+ 'Before your next commit, please reconsider your '
+ 'encode/decode settings in \nMercurial.ini or %s.\n') %
+ (filename, newlinestr[newline], repo.join('hgrc')))
+
+def dumbdecode(s, cmd, **kwargs):
+ checknewline(s, '\r\n', **kwargs)
+ # replace single LF to CRLF
+ return re_single_lf.sub('\\1\r\n', s)
+
+def dumbencode(s, cmd):
+ return s.replace('\r\n', '\n')
+
+def macdumbdecode(s, cmd, **kwargs):
+ checknewline(s, '\r', **kwargs)
+ return s.replace('\n', '\r')
+
+def macdumbencode(s, cmd):
+ return s.replace('\r', '\n')
+
+def cleverdecode(s, cmd, **kwargs):
+ if not util.binary(s):
+ return dumbdecode(s, cmd, **kwargs)
+ return s
+
+def cleverencode(s, cmd):
+ if not util.binary(s):
+ return dumbencode(s, cmd)
+ return s
+
+def macdecode(s, cmd, **kwargs):
+ if not util.binary(s):
+ return macdumbdecode(s, cmd, **kwargs)
+ return s
+
+def macencode(s, cmd):
+ if not util.binary(s):
+ return macdumbencode(s, cmd)
+ return s
+
+_filters = {
+ 'dumbdecode:': dumbdecode,
+ 'dumbencode:': dumbencode,
+ 'cleverdecode:': cleverdecode,
+ 'cleverencode:': cleverencode,
+ 'macdumbdecode:': macdumbdecode,
+ 'macdumbencode:': macdumbencode,
+ 'macdecode:': macdecode,
+ 'macencode:': macencode,
+ }
+
+def forbidnewline(ui, repo, hooktype, node, newline, **kwargs):
+ halt = False
+ seen = set()
+ # we try to walk changesets in reverse order from newest to
+ # oldest, so that if we see a file multiple times, we take the
+ # newest version as canonical. this prevents us from blocking a
+ # changegroup that contains an unacceptable commit followed later
+ # by a commit that fixes the problem.
+ tip = repo['tip']
+ for rev in xrange(len(repo)-1, repo[node].rev()-1, -1):
+ c = repo[rev]
+ for f in c.files():
+ if f in seen or f not in tip or f not in c:
+ continue
+ seen.add(f)
+ data = c[f].data()
+ if not util.binary(data) and newline in data:
+ if not halt:
+ ui.warn(_('attempt to commit or push text file(s) '
+ 'using %s line endings\n') %
+ newlinestr[newline])
+ ui.warn(_('in %s: %s\n') % (short(c.node()), f))
+ halt = True
+ if halt and hooktype == 'pretxnchangegroup':
+ crlf = newlinestr[newline].lower()
+ filter = filterstr[newline]
+ ui.warn(_('\nTo prevent this mistake in your local repository,\n'
+ 'add to Mercurial.ini or .hg/hgrc:\n'
+ '\n'
+ '[hooks]\n'
+ 'pretxncommit.%s = python:hgext.win32text.forbid%s\n'
+ '\n'
+ 'and also consider adding:\n'
+ '\n'
+ '[extensions]\n'
+ 'win32text =\n'
+ '[encode]\n'
+ '** = %sencode:\n'
+ '[decode]\n'
+ '** = %sdecode:\n') % (crlf, crlf, filter, filter))
+ return halt
+
+def forbidcrlf(ui, repo, hooktype, node, **kwargs):
+ return forbidnewline(ui, repo, hooktype, node, '\r\n', **kwargs)
+
+def forbidcr(ui, repo, hooktype, node, **kwargs):
+ return forbidnewline(ui, repo, hooktype, node, '\r', **kwargs)
+
+def reposetup(ui, repo):
+ if not repo.local():
+ return
+ for name, fn in _filters.iteritems():
+ repo.adddatafilter(name, fn)
+
+def extsetup(ui):
+ if ui.configbool('win32text', 'warn', True):
+ ui.warn(_("win32text is deprecated: "
+ "http://mercurial.selenic.com/wiki/Win32TextExtension\n"))
diff --git a/hgext/zeroconf/Zeroconf.py b/hgext/zeroconf/Zeroconf.py
new file mode 100644
index 0000000..e8dfa14
--- /dev/null
+++ b/hgext/zeroconf/Zeroconf.py
@@ -0,0 +1,1582 @@
+""" Multicast DNS Service Discovery for Python, v0.12
+ Copyright (C) 2003, Paul Scott-Murphy
+
+ This module provides a framework for the use of DNS Service Discovery
+ using IP multicast. It has been tested against the JRendezvous
+ implementation from <a href="http://strangeberry.com">StrangeBerry</a>,
+ and against the mDNSResponder from Mac OS X 10.3.8.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, see
+ <http://www.gnu.org/licenses/>.
+
+"""
+
+"""0.12 update - allow selection of binding interface
+ typo fix - Thanks A. M. Kuchlingi
+ removed all use of word 'Rendezvous' - this is an API change"""
+
+"""0.11 update - correction to comments for addListener method
+ support for new record types seen from OS X
+ - IPv6 address
+ - hostinfo
+ ignore unknown DNS record types
+ fixes to name decoding
+ works alongside other processes using port 5353 (e.g. on Mac OS X)
+ tested against Mac OS X 10.3.2's mDNSResponder
+ corrections to removal of list entries for service browser"""
+
+"""0.10 update - Jonathon Paisley contributed these corrections:
+ always multicast replies, even when query is unicast
+ correct a pointer encoding problem
+ can now write records in any order
+ traceback shown on failure
+ better TXT record parsing
+ server is now separate from name
+ can cancel a service browser
+
+ modified some unit tests to accommodate these changes"""
+
+"""0.09 update - remove all records on service unregistration
+ fix DOS security problem with readName"""
+
+"""0.08 update - changed licensing to LGPL"""
+
+"""0.07 update - faster shutdown on engine
+ pointer encoding of outgoing names
+ ServiceBrowser now works
+ new unit tests"""
+
+"""0.06 update - small improvements with unit tests
+ added defined exception types
+ new style objects
+ fixed hostname/interface problem
+ fixed socket timeout problem
+ fixed addServiceListener() typo bug
+ using select() for socket reads
+ tested on Debian unstable with Python 2.2.2"""
+
+"""0.05 update - ensure case insensitivty on domain names
+ support for unicast DNS queries"""
+
+"""0.04 update - added some unit tests
+ added __ne__ adjuncts where required
+ ensure names end in '.local.'
+ timeout on receiving socket for clean shutdown"""
+
+__author__ = "Paul Scott-Murphy"
+__email__ = "paul at scott dash murphy dot com"
+__version__ = "0.12"
+
+import string
+import time
+import struct
+import socket
+import threading
+import select
+import traceback
+
+__all__ = ["Zeroconf", "ServiceInfo", "ServiceBrowser"]
+
+# hook for threads
+
+globals()['_GLOBAL_DONE'] = 0
+
+# Some timing constants
+
+_UNREGISTER_TIME = 125
+_CHECK_TIME = 175
+_REGISTER_TIME = 225
+_LISTENER_TIME = 200
+_BROWSER_TIME = 500
+
+# Some DNS constants
+
+_MDNS_ADDR = '224.0.0.251'
+_MDNS_PORT = 5353;
+_DNS_PORT = 53;
+_DNS_TTL = 60 * 60; # one hour default TTL
+
+_MAX_MSG_TYPICAL = 1460 # unused
+_MAX_MSG_ABSOLUTE = 8972
+
+_FLAGS_QR_MASK = 0x8000 # query response mask
+_FLAGS_QR_QUERY = 0x0000 # query
+_FLAGS_QR_RESPONSE = 0x8000 # response
+
+_FLAGS_AA = 0x0400 # Authorative answer
+_FLAGS_TC = 0x0200 # Truncated
+_FLAGS_RD = 0x0100 # Recursion desired
+_FLAGS_RA = 0x8000 # Recursion available
+
+_FLAGS_Z = 0x0040 # Zero
+_FLAGS_AD = 0x0020 # Authentic data
+_FLAGS_CD = 0x0010 # Checking disabled
+
+_CLASS_IN = 1
+_CLASS_CS = 2
+_CLASS_CH = 3
+_CLASS_HS = 4
+_CLASS_NONE = 254
+_CLASS_ANY = 255
+_CLASS_MASK = 0x7FFF
+_CLASS_UNIQUE = 0x8000
+
+_TYPE_A = 1
+_TYPE_NS = 2
+_TYPE_MD = 3
+_TYPE_MF = 4
+_TYPE_CNAME = 5
+_TYPE_SOA = 6
+_TYPE_MB = 7
+_TYPE_MG = 8
+_TYPE_MR = 9
+_TYPE_NULL = 10
+_TYPE_WKS = 11
+_TYPE_PTR = 12
+_TYPE_HINFO = 13
+_TYPE_MINFO = 14
+_TYPE_MX = 15
+_TYPE_TXT = 16
+_TYPE_AAAA = 28
+_TYPE_SRV = 33
+_TYPE_ANY = 255
+
+# Mapping constants to names
+
+_CLASSES = { _CLASS_IN : "in",
+ _CLASS_CS : "cs",
+ _CLASS_CH : "ch",
+ _CLASS_HS : "hs",
+ _CLASS_NONE : "none",
+ _CLASS_ANY : "any" }
+
+_TYPES = { _TYPE_A : "a",
+ _TYPE_NS : "ns",
+ _TYPE_MD : "md",
+ _TYPE_MF : "mf",
+ _TYPE_CNAME : "cname",
+ _TYPE_SOA : "soa",
+ _TYPE_MB : "mb",
+ _TYPE_MG : "mg",
+ _TYPE_MR : "mr",
+ _TYPE_NULL : "null",
+ _TYPE_WKS : "wks",
+ _TYPE_PTR : "ptr",
+ _TYPE_HINFO : "hinfo",
+ _TYPE_MINFO : "minfo",
+ _TYPE_MX : "mx",
+ _TYPE_TXT : "txt",
+ _TYPE_AAAA : "quada",
+ _TYPE_SRV : "srv",
+ _TYPE_ANY : "any" }
+
+# utility functions
+
+def currentTimeMillis():
+ """Current system time in milliseconds"""
+ return time.time() * 1000
+
+# Exceptions
+
+class NonLocalNameException(Exception):
+ pass
+
+class NonUniqueNameException(Exception):
+ pass
+
+class NamePartTooLongException(Exception):
+ pass
+
+class AbstractMethodException(Exception):
+ pass
+
+class BadTypeInNameException(Exception):
+ pass
+
+class BadDomainName(Exception):
+ def __init__(self, pos):
+ Exception.__init__(self, "at position %s" % pos)
+
+class BadDomainNameCircular(BadDomainName):
+ pass
+
+# implementation classes
+
+class DNSEntry(object):
+ """A DNS entry"""
+
+ def __init__(self, name, type, clazz):
+ self.key = string.lower(name)
+ self.name = name
+ self.type = type
+ self.clazz = clazz & _CLASS_MASK
+ self.unique = (clazz & _CLASS_UNIQUE) != 0
+
+ def __eq__(self, other):
+ """Equality test on name, type, and class"""
+ if isinstance(other, DNSEntry):
+ return self.name == other.name and self.type == other.type and self.clazz == other.clazz
+ return 0
+
+ def __ne__(self, other):
+ """Non-equality test"""
+ return not self.__eq__(other)
+
+ def getClazz(self, clazz):
+ """Class accessor"""
+ try:
+ return _CLASSES[clazz]
+ except KeyError:
+ return "?(%s)" % (clazz)
+
+ def getType(self, type):
+ """Type accessor"""
+ try:
+ return _TYPES[type]
+ except KeyError:
+ return "?(%s)" % (type)
+
+ def toString(self, hdr, other):
+ """String representation with additional information"""
+ result = "%s[%s,%s" % (hdr, self.getType(self.type), self.getClazz(self.clazz))
+ if self.unique:
+ result += "-unique,"
+ else:
+ result += ","
+ result += self.name
+ if other is not None:
+ result += ",%s]" % (other)
+ else:
+ result += "]"
+ return result
+
+class DNSQuestion(DNSEntry):
+ """A DNS question entry"""
+
+ def __init__(self, name, type, clazz):
+ if not name.endswith(".local."):
+ raise NonLocalNameException(name)
+ DNSEntry.__init__(self, name, type, clazz)
+
+ def answeredBy(self, rec):
+ """Returns true if the question is answered by the record"""
+ return self.clazz == rec.clazz and (self.type == rec.type or self.type == _TYPE_ANY) and self.name == rec.name
+
+ def __repr__(self):
+ """String representation"""
+ return DNSEntry.toString(self, "question", None)
+
+
+class DNSRecord(DNSEntry):
+ """A DNS record - like a DNS entry, but has a TTL"""
+
+ def __init__(self, name, type, clazz, ttl):
+ DNSEntry.__init__(self, name, type, clazz)
+ self.ttl = ttl
+ self.created = currentTimeMillis()
+
+ def __eq__(self, other):
+ """Tests equality as per DNSRecord"""
+ if isinstance(other, DNSRecord):
+ return DNSEntry.__eq__(self, other)
+ return 0
+
+ def suppressedBy(self, msg):
+ """Returns true if any answer in a message can suffice for the
+ information held in this record."""
+ for record in msg.answers:
+ if self.suppressedByAnswer(record):
+ return 1
+ return 0
+
+ def suppressedByAnswer(self, other):
+ """Returns true if another record has same name, type and class,
+ and if its TTL is at least half of this record's."""
+ if self == other and other.ttl > (self.ttl / 2):
+ return 1
+ return 0
+
+ def getExpirationTime(self, percent):
+ """Returns the time at which this record will have expired
+ by a certain percentage."""
+ return self.created + (percent * self.ttl * 10)
+
+ def getRemainingTTL(self, now):
+ """Returns the remaining TTL in seconds."""
+ return max(0, (self.getExpirationTime(100) - now) / 1000)
+
+ def isExpired(self, now):
+ """Returns true if this record has expired."""
+ return self.getExpirationTime(100) <= now
+
+ def isStale(self, now):
+ """Returns true if this record is at least half way expired."""
+ return self.getExpirationTime(50) <= now
+
+ def resetTTL(self, other):
+ """Sets this record's TTL and created time to that of
+ another record."""
+ self.created = other.created
+ self.ttl = other.ttl
+
+ def write(self, out):
+ """Abstract method"""
+ raise AbstractMethodException
+
+ def toString(self, other):
+ """String representation with addtional information"""
+ arg = "%s/%s,%s" % (self.ttl, self.getRemainingTTL(currentTimeMillis()), other)
+ return DNSEntry.toString(self, "record", arg)
+
+class DNSAddress(DNSRecord):
+ """A DNS address record"""
+
+ def __init__(self, name, type, clazz, ttl, address):
+ DNSRecord.__init__(self, name, type, clazz, ttl)
+ self.address = address
+
+ def write(self, out):
+ """Used in constructing an outgoing packet"""
+ out.writeString(self.address, len(self.address))
+
+ def __eq__(self, other):
+ """Tests equality on address"""
+ if isinstance(other, DNSAddress):
+ return self.address == other.address
+ return 0
+
+ def __repr__(self):
+ """String representation"""
+ try:
+ return socket.inet_ntoa(self.address)
+ except Exception:
+ return self.address
+
+class DNSHinfo(DNSRecord):
+ """A DNS host information record"""
+
+ def __init__(self, name, type, clazz, ttl, cpu, os):
+ DNSRecord.__init__(self, name, type, clazz, ttl)
+ self.cpu = cpu
+ self.os = os
+
+ def write(self, out):
+ """Used in constructing an outgoing packet"""
+ out.writeString(self.cpu, len(self.cpu))
+ out.writeString(self.os, len(self.os))
+
+ def __eq__(self, other):
+ """Tests equality on cpu and os"""
+ if isinstance(other, DNSHinfo):
+ return self.cpu == other.cpu and self.os == other.os
+ return 0
+
+ def __repr__(self):
+ """String representation"""
+ return self.cpu + " " + self.os
+
+class DNSPointer(DNSRecord):
+ """A DNS pointer record"""
+
+ def __init__(self, name, type, clazz, ttl, alias):
+ DNSRecord.__init__(self, name, type, clazz, ttl)
+ self.alias = alias
+
+ def write(self, out):
+ """Used in constructing an outgoing packet"""
+ out.writeName(self.alias)
+
+ def __eq__(self, other):
+ """Tests equality on alias"""
+ if isinstance(other, DNSPointer):
+ return self.alias == other.alias
+ return 0
+
+ def __repr__(self):
+ """String representation"""
+ return self.toString(self.alias)
+
+class DNSText(DNSRecord):
+ """A DNS text record"""
+
+ def __init__(self, name, type, clazz, ttl, text):
+ DNSRecord.__init__(self, name, type, clazz, ttl)
+ self.text = text
+
+ def write(self, out):
+ """Used in constructing an outgoing packet"""
+ out.writeString(self.text, len(self.text))
+
+ def __eq__(self, other):
+ """Tests equality on text"""
+ if isinstance(other, DNSText):
+ return self.text == other.text
+ return 0
+
+ def __repr__(self):
+ """String representation"""
+ if len(self.text) > 10:
+ return self.toString(self.text[:7] + "...")
+ else:
+ return self.toString(self.text)
+
+class DNSService(DNSRecord):
+ """A DNS service record"""
+
+ def __init__(self, name, type, clazz, ttl, priority, weight, port, server):
+ DNSRecord.__init__(self, name, type, clazz, ttl)
+ self.priority = priority
+ self.weight = weight
+ self.port = port
+ self.server = server
+
+ def write(self, out):
+ """Used in constructing an outgoing packet"""
+ out.writeShort(self.priority)
+ out.writeShort(self.weight)
+ out.writeShort(self.port)
+ out.writeName(self.server)
+
+ def __eq__(self, other):
+ """Tests equality on priority, weight, port and server"""
+ if isinstance(other, DNSService):
+ return self.priority == other.priority and self.weight == other.weight and self.port == other.port and self.server == other.server
+ return 0
+
+ def __repr__(self):
+ """String representation"""
+ return self.toString("%s:%s" % (self.server, self.port))
+
+class DNSIncoming(object):
+ """Object representation of an incoming DNS packet"""
+
+ def __init__(self, data):
+ """Constructor from string holding bytes of packet"""
+ self.offset = 0
+ self.data = data
+ self.questions = []
+ self.answers = []
+ self.numQuestions = 0
+ self.numAnswers = 0
+ self.numAuthorities = 0
+ self.numAdditionals = 0
+
+ self.readHeader()
+ self.readQuestions()
+ self.readOthers()
+
+ def readHeader(self):
+ """Reads header portion of packet"""
+ format = '!HHHHHH'
+ length = struct.calcsize(format)
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+
+ self.id = info[0]
+ self.flags = info[1]
+ self.numQuestions = info[2]
+ self.numAnswers = info[3]
+ self.numAuthorities = info[4]
+ self.numAdditionals = info[5]
+
+ def readQuestions(self):
+ """Reads questions section of packet"""
+ format = '!HH'
+ length = struct.calcsize(format)
+ for i in range(0, self.numQuestions):
+ name = self.readName()
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+
+ try:
+ question = DNSQuestion(name, info[0], info[1])
+ self.questions.append(question)
+ except NonLocalNameException:
+ pass
+
+ def readInt(self):
+ """Reads an integer from the packet"""
+ format = '!I'
+ length = struct.calcsize(format)
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+ return info[0]
+
+ def readCharacterString(self):
+ """Reads a character string from the packet"""
+ length = ord(self.data[self.offset])
+ self.offset += 1
+ return self.readString(length)
+
+ def readString(self, len):
+ """Reads a string of a given length from the packet"""
+ format = '!' + str(len) + 's'
+ length = struct.calcsize(format)
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+ return info[0]
+
+ def readUnsignedShort(self):
+ """Reads an unsigned short from the packet"""
+ format = '!H'
+ length = struct.calcsize(format)
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+ return info[0]
+
+ def readOthers(self):
+ """Reads the answers, authorities and additionals section of the packet"""
+ format = '!HHiH'
+ length = struct.calcsize(format)
+ n = self.numAnswers + self.numAuthorities + self.numAdditionals
+ for i in range(0, n):
+ domain = self.readName()
+ info = struct.unpack(format, self.data[self.offset:self.offset+length])
+ self.offset += length
+
+ rec = None
+ if info[0] == _TYPE_A:
+ rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(4))
+ elif info[0] == _TYPE_CNAME or info[0] == _TYPE_PTR:
+ rec = DNSPointer(domain, info[0], info[1], info[2], self.readName())
+ elif info[0] == _TYPE_TXT:
+ rec = DNSText(domain, info[0], info[1], info[2], self.readString(info[3]))
+ elif info[0] == _TYPE_SRV:
+ rec = DNSService(domain, info[0], info[1], info[2], self.readUnsignedShort(), self.readUnsignedShort(), self.readUnsignedShort(), self.readName())
+ elif info[0] == _TYPE_HINFO:
+ rec = DNSHinfo(domain, info[0], info[1], info[2], self.readCharacterString(), self.readCharacterString())
+ elif info[0] == _TYPE_AAAA:
+ rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(16))
+ else:
+ # Try to ignore types we don't know about
+ # this may mean the rest of the name is
+ # unable to be parsed, and may show errors
+ # so this is left for debugging. New types
+ # encountered need to be parsed properly.
+ #
+ #print "UNKNOWN TYPE = " + str(info[0])
+ #raise BadTypeInNameException
+ self.offset += info[3]
+
+ if rec is not None:
+ self.answers.append(rec)
+
+ def isQuery(self):
+ """Returns true if this is a query"""
+ return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_QUERY
+
+ def isResponse(self):
+ """Returns true if this is a response"""
+ return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_RESPONSE
+
+ def readUTF(self, offset, len):
+ """Reads a UTF-8 string of a given length from the packet"""
+ return self.data[offset:offset+len].decode('utf-8')
+
+ def readName(self):
+ """Reads a domain name from the packet"""
+ result = ''
+ off = self.offset
+ next = -1
+ first = off
+
+ while True:
+ len = ord(self.data[off])
+ off += 1
+ if len == 0:
+ break
+ t = len & 0xC0
+ if t == 0x00:
+ result = ''.join((result, self.readUTF(off, len) + '.'))
+ off += len
+ elif t == 0xC0:
+ if next < 0:
+ next = off + 1
+ off = ((len & 0x3F) << 8) | ord(self.data[off])
+ if off >= first:
+ raise BadDomainNameCircular(off)
+ first = off
+ else:
+ raise BadDomainName(off)
+
+ if next >= 0:
+ self.offset = next
+ else:
+ self.offset = off
+
+ return result
+
+
+class DNSOutgoing(object):
+ """Object representation of an outgoing packet"""
+
+ def __init__(self, flags, multicast = 1):
+ self.finished = 0
+ self.id = 0
+ self.multicast = multicast
+ self.flags = flags
+ self.names = {}
+ self.data = []
+ self.size = 12
+
+ self.questions = []
+ self.answers = []
+ self.authorities = []
+ self.additionals = []
+
+ def addQuestion(self, record):
+ """Adds a question"""
+ self.questions.append(record)
+
+ def addAnswer(self, inp, record):
+ """Adds an answer"""
+ if not record.suppressedBy(inp):
+ self.addAnswerAtTime(record, 0)
+
+ def addAnswerAtTime(self, record, now):
+ """Adds an answer if if does not expire by a certain time"""
+ if record is not None:
+ if now == 0 or not record.isExpired(now):
+ self.answers.append((record, now))
+
+ def addAuthorativeAnswer(self, record):
+ """Adds an authoritative answer"""
+ self.authorities.append(record)
+
+ def addAdditionalAnswer(self, record):
+ """Adds an additional answer"""
+ self.additionals.append(record)
+
+ def writeByte(self, value):
+ """Writes a single byte to the packet"""
+ format = '!c'
+ self.data.append(struct.pack(format, chr(value)))
+ self.size += 1
+
+ def insertShort(self, index, value):
+ """Inserts an unsigned short in a certain position in the packet"""
+ format = '!H'
+ self.data.insert(index, struct.pack(format, value))
+ self.size += 2
+
+ def writeShort(self, value):
+ """Writes an unsigned short to the packet"""
+ format = '!H'
+ self.data.append(struct.pack(format, value))
+ self.size += 2
+
+ def writeInt(self, value):
+ """Writes an unsigned integer to the packet"""
+ format = '!I'
+ self.data.append(struct.pack(format, int(value)))
+ self.size += 4
+
+ def writeString(self, value, length):
+ """Writes a string to the packet"""
+ format = '!' + str(length) + 's'
+ self.data.append(struct.pack(format, value))
+ self.size += length
+
+ def writeUTF(self, s):
+ """Writes a UTF-8 string of a given length to the packet"""
+ utfstr = s.encode('utf-8')
+ length = len(utfstr)
+ if length > 64:
+ raise NamePartTooLongException
+ self.writeByte(length)
+ self.writeString(utfstr, length)
+
+ def writeName(self, name):
+ """Writes a domain name to the packet"""
+
+ try:
+ # Find existing instance of this name in packet
+ #
+ index = self.names[name]
+ except KeyError:
+ # No record of this name already, so write it
+ # out as normal, recording the location of the name
+ # for future pointers to it.
+ #
+ self.names[name] = self.size
+ parts = name.split('.')
+ if parts[-1] == '':
+ parts = parts[:-1]
+ for part in parts:
+ self.writeUTF(part)
+ self.writeByte(0)
+ return
+
+ # An index was found, so write a pointer to it
+ #
+ self.writeByte((index >> 8) | 0xC0)
+ self.writeByte(index)
+
+ def writeQuestion(self, question):
+ """Writes a question to the packet"""
+ self.writeName(question.name)
+ self.writeShort(question.type)
+ self.writeShort(question.clazz)
+
+ def writeRecord(self, record, now):
+ """Writes a record (answer, authoritative answer, additional) to
+ the packet"""
+ self.writeName(record.name)
+ self.writeShort(record.type)
+ if record.unique and self.multicast:
+ self.writeShort(record.clazz | _CLASS_UNIQUE)
+ else:
+ self.writeShort(record.clazz)
+ if now == 0:
+ self.writeInt(record.ttl)
+ else:
+ self.writeInt(record.getRemainingTTL(now))
+ index = len(self.data)
+ # Adjust size for the short we will write before this record
+ #
+ self.size += 2
+ record.write(self)
+ self.size -= 2
+
+ length = len(''.join(self.data[index:]))
+ self.insertShort(index, length) # Here is the short we adjusted for
+
+ def packet(self):
+ """Returns a string containing the packet's bytes
+
+ No further parts should be added to the packet once this
+ is done."""
+ if not self.finished:
+ self.finished = 1
+ for question in self.questions:
+ self.writeQuestion(question)
+ for answer, time in self.answers:
+ self.writeRecord(answer, time)
+ for authority in self.authorities:
+ self.writeRecord(authority, 0)
+ for additional in self.additionals:
+ self.writeRecord(additional, 0)
+
+ self.insertShort(0, len(self.additionals))
+ self.insertShort(0, len(self.authorities))
+ self.insertShort(0, len(self.answers))
+ self.insertShort(0, len(self.questions))
+ self.insertShort(0, self.flags)
+ if self.multicast:
+ self.insertShort(0, 0)
+ else:
+ self.insertShort(0, self.id)
+ return ''.join(self.data)
+
+
+class DNSCache(object):
+ """A cache of DNS entries"""
+
+ def __init__(self):
+ self.cache = {}
+
+ def add(self, entry):
+ """Adds an entry"""
+ try:
+ list = self.cache[entry.key]
+ except KeyError:
+ list = self.cache[entry.key] = []
+ list.append(entry)
+
+ def remove(self, entry):
+ """Removes an entry"""
+ try:
+ list = self.cache[entry.key]
+ list.remove(entry)
+ except KeyError:
+ pass
+
+ def get(self, entry):
+ """Gets an entry by key. Will return None if there is no
+ matching entry."""
+ try:
+ list = self.cache[entry.key]
+ return list[list.index(entry)]
+ except (KeyError, ValueError):
+ return None
+
+ def getByDetails(self, name, type, clazz):
+ """Gets an entry by details. Will return None if there is
+ no matching entry."""
+ entry = DNSEntry(name, type, clazz)
+ return self.get(entry)
+
+ def entriesWithName(self, name):
+ """Returns a list of entries whose key matches the name."""
+ try:
+ return self.cache[name]
+ except KeyError:
+ return []
+
+ def entries(self):
+ """Returns a list of all entries"""
+ def add(x, y): return x+y
+ try:
+ return reduce(add, self.cache.values())
+ except Exception:
+ return []
+
+
+class Engine(threading.Thread):
+ """An engine wraps read access to sockets, allowing objects that
+ need to receive data from sockets to be called back when the
+ sockets are ready.
+
+ A reader needs a handle_read() method, which is called when the socket
+ it is interested in is ready for reading.
+
+ Writers are not implemented here, because we only send short
+ packets.
+ """
+
+ def __init__(self, zeroconf):
+ threading.Thread.__init__(self)
+ self.zeroconf = zeroconf
+ self.readers = {} # maps socket to reader
+ self.timeout = 5
+ self.condition = threading.Condition()
+ self.start()
+
+ def run(self):
+ while not globals()['_GLOBAL_DONE']:
+ rs = self.getReaders()
+ if len(rs) == 0:
+ # No sockets to manage, but we wait for the timeout
+ # or addition of a socket
+ #
+ self.condition.acquire()
+ self.condition.wait(self.timeout)
+ self.condition.release()
+ else:
+ try:
+ rr, wr, er = select.select(rs, [], [], self.timeout)
+ for socket in rr:
+ try:
+ self.readers[socket].handle_read()
+ except Exception:
+ if not globals()['_GLOBAL_DONE']:
+ traceback.print_exc()
+ except Exception:
+ pass
+
+ def getReaders(self):
+ self.condition.acquire()
+ result = self.readers.keys()
+ self.condition.release()
+ return result
+
+ def addReader(self, reader, socket):
+ self.condition.acquire()
+ self.readers[socket] = reader
+ self.condition.notify()
+ self.condition.release()
+
+ def delReader(self, socket):
+ self.condition.acquire()
+ del(self.readers[socket])
+ self.condition.notify()
+ self.condition.release()
+
+ def notify(self):
+ self.condition.acquire()
+ self.condition.notify()
+ self.condition.release()
+
+class Listener(object):
+ """A Listener is used by this module to listen on the multicast
+ group to which DNS messages are sent, allowing the implementation
+ to cache information as it arrives.
+
+ It requires registration with an Engine object in order to have
+ the read() method called when a socket is availble for reading."""
+
+ def __init__(self, zeroconf):
+ self.zeroconf = zeroconf
+ self.zeroconf.engine.addReader(self, self.zeroconf.socket)
+
+ def handle_read(self):
+ data, (addr, port) = self.zeroconf.socket.recvfrom(_MAX_MSG_ABSOLUTE)
+ self.data = data
+ msg = DNSIncoming(data)
+ if msg.isQuery():
+ # Always multicast responses
+ #
+ if port == _MDNS_PORT:
+ self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
+ # If it's not a multicast query, reply via unicast
+ # and multicast
+ #
+ elif port == _DNS_PORT:
+ self.zeroconf.handleQuery(msg, addr, port)
+ self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
+ else:
+ self.zeroconf.handleResponse(msg)
+
+
+class Reaper(threading.Thread):
+ """A Reaper is used by this module to remove cache entries that
+ have expired."""
+
+ def __init__(self, zeroconf):
+ threading.Thread.__init__(self)
+ self.zeroconf = zeroconf
+ self.start()
+
+ def run(self):
+ while True:
+ self.zeroconf.wait(10 * 1000)
+ if globals()['_GLOBAL_DONE']:
+ return
+ now = currentTimeMillis()
+ for record in self.zeroconf.cache.entries():
+ if record.isExpired(now):
+ self.zeroconf.updateRecord(now, record)
+ self.zeroconf.cache.remove(record)
+
+
+class ServiceBrowser(threading.Thread):
+ """Used to browse for a service of a specific type.
+
+ The listener object will have its addService() and
+ removeService() methods called when this browser
+ discovers changes in the services availability."""
+
+ def __init__(self, zeroconf, type, listener):
+ """Creates a browser for a specific type"""
+ threading.Thread.__init__(self)
+ self.zeroconf = zeroconf
+ self.type = type
+ self.listener = listener
+ self.services = {}
+ self.nextTime = currentTimeMillis()
+ self.delay = _BROWSER_TIME
+ self.list = []
+
+ self.done = 0
+
+ self.zeroconf.addListener(self, DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
+ self.start()
+
+ def updateRecord(self, zeroconf, now, record):
+ """Callback invoked by Zeroconf when new information arrives.
+
+ Updates information required by browser in the Zeroconf cache."""
+ if record.type == _TYPE_PTR and record.name == self.type:
+ expired = record.isExpired(now)
+ try:
+ oldrecord = self.services[record.alias.lower()]
+ if not expired:
+ oldrecord.resetTTL(record)
+ else:
+ del(self.services[record.alias.lower()])
+ callback = lambda x: self.listener.removeService(x, self.type, record.alias)
+ self.list.append(callback)
+ return
+ except Exception:
+ if not expired:
+ self.services[record.alias.lower()] = record
+ callback = lambda x: self.listener.addService(x, self.type, record.alias)
+ self.list.append(callback)
+
+ expires = record.getExpirationTime(75)
+ if expires < self.nextTime:
+ self.nextTime = expires
+
+ def cancel(self):
+ self.done = 1
+ self.zeroconf.notifyAll()
+
+ def run(self):
+ while True:
+ event = None
+ now = currentTimeMillis()
+ if len(self.list) == 0 and self.nextTime > now:
+ self.zeroconf.wait(self.nextTime - now)
+ if globals()['_GLOBAL_DONE'] or self.done:
+ return
+ now = currentTimeMillis()
+
+ if self.nextTime <= now:
+ out = DNSOutgoing(_FLAGS_QR_QUERY)
+ out.addQuestion(DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
+ for record in self.services.values():
+ if not record.isExpired(now):
+ out.addAnswerAtTime(record, now)
+ self.zeroconf.send(out)
+ self.nextTime = now + self.delay
+ self.delay = min(20 * 1000, self.delay * 2)
+
+ if len(self.list) > 0:
+ event = self.list.pop(0)
+
+ if event is not None:
+ event(self.zeroconf)
+
+
+class ServiceInfo(object):
+ """Service information"""
+
+ def __init__(self, type, name, address=None, port=None, weight=0, priority=0, properties=None, server=None):
+ """Create a service description.
+
+ type: fully qualified service type name
+ name: fully qualified service name
+ address: IP address as unsigned short, network byte order
+ port: port that the service runs on
+ weight: weight of the service
+ priority: priority of the service
+ properties: dictionary of properties (or a string holding the bytes for the text field)
+ server: fully qualified name for service host (defaults to name)"""
+
+ if not name.endswith(type):
+ raise BadTypeInNameException
+ self.type = type
+ self.name = name
+ self.address = address
+ self.port = port
+ self.weight = weight
+ self.priority = priority
+ if server:
+ self.server = server
+ else:
+ self.server = name
+ self.setProperties(properties)
+
+ def setProperties(self, properties):
+ """Sets properties and text of this info from a dictionary"""
+ if isinstance(properties, dict):
+ self.properties = properties
+ list = []
+ result = ''
+ for key in properties:
+ value = properties[key]
+ if value is None:
+ suffix = ''
+ elif isinstance(value, str):
+ suffix = value
+ elif isinstance(value, int):
+ if value:
+ suffix = 'true'
+ else:
+ suffix = 'false'
+ else:
+ suffix = ''
+ list.append('='.join((key, suffix)))
+ for item in list:
+ result = ''.join((result, struct.pack('!c', chr(len(item))), item))
+ self.text = result
+ else:
+ self.text = properties
+
+ def setText(self, text):
+ """Sets properties and text given a text field"""
+ self.text = text
+ try:
+ result = {}
+ end = len(text)
+ index = 0
+ strs = []
+ while index < end:
+ length = ord(text[index])
+ index += 1
+ strs.append(text[index:index+length])
+ index += length
+
+ for s in strs:
+ eindex = s.find('=')
+ if eindex == -1:
+ # No equals sign at all
+ key = s
+ value = 0
+ else:
+ key = s[:eindex]
+ value = s[eindex+1:]
+ if value == 'true':
+ value = 1
+ elif value == 'false' or not value:
+ value = 0
+
+ # Only update non-existent properties
+ if key and result.get(key) == None:
+ result[key] = value
+
+ self.properties = result
+ except Exception:
+ traceback.print_exc()
+ self.properties = None
+
+ def getType(self):
+ """Type accessor"""
+ return self.type
+
+ def getName(self):
+ """Name accessor"""
+ if self.type is not None and self.name.endswith("." + self.type):
+ return self.name[:len(self.name) - len(self.type) - 1]
+ return self.name
+
+ def getAddress(self):
+ """Address accessor"""
+ return self.address
+
+ def getPort(self):
+ """Port accessor"""
+ return self.port
+
+ def getPriority(self):
+ """Pirority accessor"""
+ return self.priority
+
+ def getWeight(self):
+ """Weight accessor"""
+ return self.weight
+
+ def getProperties(self):
+ """Properties accessor"""
+ return self.properties
+
+ def getText(self):
+ """Text accessor"""
+ return self.text
+
+ def getServer(self):
+ """Server accessor"""
+ return self.server
+
+ def updateRecord(self, zeroconf, now, record):
+ """Updates service information from a DNS record"""
+ if record is not None and not record.isExpired(now):
+ if record.type == _TYPE_A:
+ #if record.name == self.name:
+ if record.name == self.server:
+ self.address = record.address
+ elif record.type == _TYPE_SRV:
+ if record.name == self.name:
+ self.server = record.server
+ self.port = record.port
+ self.weight = record.weight
+ self.priority = record.priority
+ #self.address = None
+ self.updateRecord(zeroconf, now, zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN))
+ elif record.type == _TYPE_TXT:
+ if record.name == self.name:
+ self.setText(record.text)
+
+ def request(self, zeroconf, timeout):
+ """Returns true if the service could be discovered on the
+ network, and updates this object with details discovered.
+ """
+ now = currentTimeMillis()
+ delay = _LISTENER_TIME
+ next = now + delay
+ last = now + timeout
+ result = 0
+ try:
+ zeroconf.addListener(self, DNSQuestion(self.name, _TYPE_ANY, _CLASS_IN))
+ while self.server is None or self.address is None or self.text is None:
+ if last <= now:
+ return 0
+ if next <= now:
+ out = DNSOutgoing(_FLAGS_QR_QUERY)
+ out.addQuestion(DNSQuestion(self.name, _TYPE_SRV, _CLASS_IN))
+ out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_SRV, _CLASS_IN), now)
+ out.addQuestion(DNSQuestion(self.name, _TYPE_TXT, _CLASS_IN))
+ out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_TXT, _CLASS_IN), now)
+ if self.server is not None:
+ out.addQuestion(DNSQuestion(self.server, _TYPE_A, _CLASS_IN))
+ out.addAnswerAtTime(zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN), now)
+ zeroconf.send(out)
+ next = now + delay
+ delay = delay * 2
+
+ zeroconf.wait(min(next, last) - now)
+ now = currentTimeMillis()
+ result = 1
+ finally:
+ zeroconf.removeListener(self)
+
+ return result
+
+ def __eq__(self, other):
+ """Tests equality of service name"""
+ if isinstance(other, ServiceInfo):
+ return other.name == self.name
+ return 0
+
+ def __ne__(self, other):
+ """Non-equality test"""
+ return not self.__eq__(other)
+
+ def __repr__(self):
+ """String representation"""
+ result = "service[%s,%s:%s," % (self.name, socket.inet_ntoa(self.getAddress()), self.port)
+ if self.text is None:
+ result += "None"
+ else:
+ if len(self.text) < 20:
+ result += self.text
+ else:
+ result += self.text[:17] + "..."
+ result += "]"
+ return result
+
+
+class Zeroconf(object):
+ """Implementation of Zeroconf Multicast DNS Service Discovery
+
+ Supports registration, unregistration, queries and browsing.
+ """
+ def __init__(self, bindaddress=None):
+ """Creates an instance of the Zeroconf class, establishing
+ multicast communications, listening and reaping threads."""
+ globals()['_GLOBAL_DONE'] = 0
+ if bindaddress is None:
+ self.intf = socket.gethostbyname(socket.gethostname())
+ else:
+ self.intf = bindaddress
+ self.group = ('', _MDNS_PORT)
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ try:
+ self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
+ except Exception:
+ # SO_REUSEADDR should be equivalent to SO_REUSEPORT for
+ # multicast UDP sockets (p 731, "TCP/IP Illustrated,
+ # Volume 2"), but some BSD-derived systems require
+ # SO_REUSEPORT to be specified explicity. Also, not all
+ # versions of Python have SO_REUSEPORT available. So
+ # if you're on a BSD-based system, and haven't upgraded
+ # to Python 2.3 yet, you may find this library doesn't
+ # work as expected.
+ #
+ pass
+ self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
+ self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
+ try:
+ self.socket.bind(self.group)
+ except Exception:
+ # Some versions of linux raise an exception even though
+ # the SO_REUSE* options have been set, so ignore it
+ #
+ pass
+ #self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0'))
+ self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
+
+ self.listeners = []
+ self.browsers = []
+ self.services = {}
+ self.servicetypes = {}
+
+ self.cache = DNSCache()
+
+ self.condition = threading.Condition()
+
+ self.engine = Engine(self)
+ self.listener = Listener(self)
+ self.reaper = Reaper(self)
+
+ def isLoopback(self):
+ return self.intf.startswith("127.0.0.1")
+
+ def isLinklocal(self):
+ return self.intf.startswith("169.254.")
+
+ def wait(self, timeout):
+ """Calling thread waits for a given number of milliseconds or
+ until notified."""
+ self.condition.acquire()
+ self.condition.wait(timeout/1000)
+ self.condition.release()
+
+ def notifyAll(self):
+ """Notifies all waiting threads"""
+ self.condition.acquire()
+ self.condition.notifyAll()
+ self.condition.release()
+
+ def getServiceInfo(self, type, name, timeout=3000):
+ """Returns network's service information for a particular
+ name and type, or None if no service matches by the timeout,
+ which defaults to 3 seconds."""
+ info = ServiceInfo(type, name)
+ if info.request(self, timeout):
+ return info
+ return None
+
+ def addServiceListener(self, type, listener):
+ """Adds a listener for a particular service type. This object
+ will then have its updateRecord method called when information
+ arrives for that type."""
+ self.removeServiceListener(listener)
+ self.browsers.append(ServiceBrowser(self, type, listener))
+
+ def removeServiceListener(self, listener):
+ """Removes a listener from the set that is currently listening."""
+ for browser in self.browsers:
+ if browser.listener == listener:
+ browser.cancel()
+ del(browser)
+
+ def registerService(self, info, ttl=_DNS_TTL):
+ """Registers service information to the network with a default TTL
+ of 60 seconds. Zeroconf will then respond to requests for
+ information for that service. The name of the service may be
+ changed if needed to make it unique on the network."""
+ self.checkService(info)
+ self.services[info.name.lower()] = info
+ if self.servicetypes.has_key(info.type):
+ self.servicetypes[info.type]+=1
+ else:
+ self.servicetypes[info.type]=1
+ now = currentTimeMillis()
+ nextTime = now
+ i = 0
+ while i < 3:
+ if now < nextTime:
+ self.wait(nextTime - now)
+ now = currentTimeMillis()
+ continue
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+ out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, ttl, info.name), 0)
+ out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, ttl, info.priority, info.weight, info.port, info.server), 0)
+ out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, ttl, info.text), 0)
+ if info.address:
+ out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, ttl, info.address), 0)
+ self.send(out)
+ i += 1
+ nextTime += _REGISTER_TIME
+
+ def unregisterService(self, info):
+ """Unregister a service."""
+ try:
+ del(self.services[info.name.lower()])
+ if self.servicetypes[info.type]>1:
+ self.servicetypes[info.type]-=1
+ else:
+ del self.servicetypes[info.type]
+ except KeyError:
+ pass
+ now = currentTimeMillis()
+ nextTime = now
+ i = 0
+ while i < 3:
+ if now < nextTime:
+ self.wait(nextTime - now)
+ now = currentTimeMillis()
+ continue
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+ out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
+ out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.name), 0)
+ out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
+ if info.address:
+ out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
+ self.send(out)
+ i += 1
+ nextTime += _UNREGISTER_TIME
+
+ def unregisterAllServices(self):
+ """Unregister all registered services."""
+ if len(self.services) > 0:
+ now = currentTimeMillis()
+ nextTime = now
+ i = 0
+ while i < 3:
+ if now < nextTime:
+ self.wait(nextTime - now)
+ now = currentTimeMillis()
+ continue
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+ for info in self.services.values():
+ out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
+ out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.server), 0)
+ out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
+ if info.address:
+ out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
+ self.send(out)
+ i += 1
+ nextTime += _UNREGISTER_TIME
+
+ def checkService(self, info):
+ """Checks the network for a unique service name, modifying the
+ ServiceInfo passed in if it is not unique."""
+ now = currentTimeMillis()
+ nextTime = now
+ i = 0
+ while i < 3:
+ for record in self.cache.entriesWithName(info.type):
+ if record.type == _TYPE_PTR and not record.isExpired(now) and record.alias == info.name:
+ if (info.name.find('.') < 0):
+ info.name = info.name + ".[" + info.address + ":" + info.port + "]." + info.type
+ self.checkService(info)
+ return
+ raise NonUniqueNameException
+ if now < nextTime:
+ self.wait(nextTime - now)
+ now = currentTimeMillis()
+ continue
+ out = DNSOutgoing(_FLAGS_QR_QUERY | _FLAGS_AA)
+ self.debug = out
+ out.addQuestion(DNSQuestion(info.type, _TYPE_PTR, _CLASS_IN))
+ out.addAuthorativeAnswer(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, info.name))
+ self.send(out)
+ i += 1
+ nextTime += _CHECK_TIME
+
+ def addListener(self, listener, question):
+ """Adds a listener for a given question. The listener will have
+ its updateRecord method called when information is available to
+ answer the question."""
+ now = currentTimeMillis()
+ self.listeners.append(listener)
+ if question is not None:
+ for record in self.cache.entriesWithName(question.name):
+ if question.answeredBy(record) and not record.isExpired(now):
+ listener.updateRecord(self, now, record)
+ self.notifyAll()
+
+ def removeListener(self, listener):
+ """Removes a listener."""
+ try:
+ self.listeners.remove(listener)
+ self.notifyAll()
+ except Exception:
+ pass
+
+ def updateRecord(self, now, rec):
+ """Used to notify listeners of new information that has updated
+ a record."""
+ for listener in self.listeners:
+ listener.updateRecord(self, now, rec)
+ self.notifyAll()
+
+ def handleResponse(self, msg):
+ """Deal with incoming response packets. All answers
+ are held in the cache, and listeners are notified."""
+ now = currentTimeMillis()
+ for record in msg.answers:
+ expired = record.isExpired(now)
+ if record in self.cache.entries():
+ if expired:
+ self.cache.remove(record)
+ else:
+ entry = self.cache.get(record)
+ if entry is not None:
+ entry.resetTTL(record)
+ record = entry
+ else:
+ self.cache.add(record)
+
+ self.updateRecord(now, record)
+
+ def handleQuery(self, msg, addr, port):
+ """Deal with incoming query packets. Provides a response if
+ possible."""
+ out = None
+
+ # Support unicast client responses
+ #
+ if port != _MDNS_PORT:
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA, 0)
+ for question in msg.questions:
+ out.addQuestion(question)
+
+ for question in msg.questions:
+ if question.type == _TYPE_PTR:
+ if question.name == "_services._dns-sd._udp.local.":
+ for stype in self.servicetypes.keys():
+ if out is None:
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+ out.addAnswer(msg, DNSPointer("_services._dns-sd._udp.local.", _TYPE_PTR, _CLASS_IN, _DNS_TTL, stype))
+ for service in self.services.values():
+ if question.name == service.type:
+ if out is None:
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+ out.addAnswer(msg, DNSPointer(service.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, service.name))
+ else:
+ try:
+ if out is None:
+ out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
+
+ # Answer A record queries for any service addresses we know
+ if question.type == _TYPE_A or question.type == _TYPE_ANY:
+ for service in self.services.values():
+ if service.server == question.name.lower():
+ out.addAnswer(msg, DNSAddress(question.name, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
+
+ service = self.services.get(question.name.lower(), None)
+ if not service: continue
+
+ if question.type == _TYPE_SRV or question.type == _TYPE_ANY:
+ out.addAnswer(msg, DNSService(question.name, _TYPE_SRV, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.priority, service.weight, service.port, service.server))
+ if question.type == _TYPE_TXT or question.type == _TYPE_ANY:
+ out.addAnswer(msg, DNSText(question.name, _TYPE_TXT, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.text))
+ if question.type == _TYPE_SRV:
+ out.addAdditionalAnswer(DNSAddress(service.server, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
+ except Exception:
+ traceback.print_exc()
+
+ if out is not None and out.answers:
+ out.id = msg.id
+ self.send(out, addr, port)
+
+ def send(self, out, addr = _MDNS_ADDR, port = _MDNS_PORT):
+ """Sends an outgoing packet."""
+ # This is a quick test to see if we can parse the packets we generate
+ #temp = DNSIncoming(out.packet())
+ try:
+ self.socket.sendto(out.packet(), 0, (addr, port))
+ except Exception:
+ # Ignore this, it may be a temporary loss of network connection
+ pass
+
+ def close(self):
+ """Ends the background threads, and prevent this instance from
+ servicing further queries."""
+ if globals()['_GLOBAL_DONE'] == 0:
+ globals()['_GLOBAL_DONE'] = 1
+ self.notifyAll()
+ self.engine.notify()
+ self.unregisterAllServices()
+ self.socket.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
+ self.socket.close()
+
+# Test a few module features, including service registration, service
+# query (for Zoe), and service unregistration.
+
+if __name__ == '__main__':
+ print "Multicast DNS Service Discovery for Python, version", __version__
+ r = Zeroconf()
+ print "1. Testing registration of a service..."
+ desc = {'version':'0.10','a':'test value', 'b':'another value'}
+ info = ServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local.", socket.inet_aton("127.0.0.1"), 1234, 0, 0, desc)
+ print " Registering service..."
+ r.registerService(info)
+ print " Registration done."
+ print "2. Testing query of service information..."
+ print " Getting ZOE service:", str(r.getServiceInfo("_http._tcp.local.", "ZOE._http._tcp.local."))
+ print " Query done."
+ print "3. Testing query of own service..."
+ print " Getting self:", str(r.getServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local."))
+ print " Query done."
+ print "4. Testing unregister of service information..."
+ r.unregisterService(info)
+ print " Unregister done."
+ r.close()
+
+# no-check-code
diff --git a/hgext/zeroconf/__init__.py b/hgext/zeroconf/__init__.py
new file mode 100644
index 0000000..52ceffa
--- /dev/null
+++ b/hgext/zeroconf/__init__.py
@@ -0,0 +1,188 @@
+# zeroconf.py - zeroconf support for Mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''discover and advertise repositories on the local network
+
+Zeroconf-enabled repositories will be announced in a network without
+the need to configure a server or a service. They can be discovered
+without knowing their actual IP address.
+
+To allow other people to discover your repository using run
+:hg:`serve` in your repository::
+
+ $ cd test
+ $ hg serve
+
+You can discover Zeroconf-enabled repositories by running
+:hg:`paths`::
+
+ $ hg paths
+ zc-test = http://example.com:8000/test
+'''
+
+import socket, time, os
+
+import Zeroconf
+from mercurial import ui, hg, encoding, util, dispatch
+from mercurial import extensions
+from mercurial.hgweb import hgweb_mod
+from mercurial.hgweb import hgwebdir_mod
+
+testedwith = 'internal'
+
+# publish
+
+server = None
+localip = None
+
+def getip():
+ # finds external-facing interface without sending any packets (Linux)
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ s.connect(('1.0.0.1', 0))
+ ip = s.getsockname()[0]
+ return ip
+ except socket.error:
+ pass
+
+ # Generic method, sometimes gives useless results
+ try:
+ dumbip = socket.gethostbyaddr(socket.gethostname())[2][0]
+ if not dumbip.startswith('127.') and ':' not in dumbip:
+ return dumbip
+ except (socket.gaierror, socket.herror):
+ dumbip = '127.0.0.1'
+
+ # works elsewhere, but actually sends a packet
+ try:
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ s.connect(('1.0.0.1', 1))
+ ip = s.getsockname()[0]
+ return ip
+ except socket.error:
+ pass
+
+ return dumbip
+
+def publish(name, desc, path, port):
+ global server, localip
+ if not server:
+ ip = getip()
+ if ip.startswith('127.'):
+ # if we have no internet connection, this can happen.
+ return
+ localip = socket.inet_aton(ip)
+ server = Zeroconf.Zeroconf(ip)
+
+ hostname = socket.gethostname().split('.')[0]
+ host = hostname + ".local"
+ name = "%s-%s" % (hostname, name)
+
+ # advertise to browsers
+ svc = Zeroconf.ServiceInfo('_http._tcp.local.',
+ name + '._http._tcp.local.',
+ server = host,
+ port = port,
+ properties = {'description': desc,
+ 'path': "/" + path},
+ address = localip, weight = 0, priority = 0)
+ server.registerService(svc)
+
+ # advertise to Mercurial clients
+ svc = Zeroconf.ServiceInfo('_hg._tcp.local.',
+ name + '._hg._tcp.local.',
+ server = host,
+ port = port,
+ properties = {'description': desc,
+ 'path': "/" + path},
+ address = localip, weight = 0, priority = 0)
+ server.registerService(svc)
+
+class hgwebzc(hgweb_mod.hgweb):
+ def __init__(self, repo, name=None, baseui=None):
+ super(hgwebzc, self).__init__(repo, name=name, baseui=baseui)
+ name = self.reponame or os.path.basename(self.repo.root)
+ path = self.repo.ui.config("web", "prefix", "").strip('/')
+ desc = self.repo.ui.config("web", "description", name)
+ publish(name, desc, path,
+ util.getport(self.repo.ui.config("web", "port", 8000)))
+
+class hgwebdirzc(hgwebdir_mod.hgwebdir):
+ def __init__(self, conf, baseui=None):
+ super(hgwebdirzc, self).__init__(conf, baseui=baseui)
+ prefix = self.ui.config("web", "prefix", "").strip('/') + '/'
+ for repo, path in self.repos:
+ u = self.ui.copy()
+ u.readconfig(os.path.join(path, '.hg', 'hgrc'))
+ name = os.path.basename(repo)
+ path = (prefix + repo).strip('/')
+ desc = u.config('web', 'description', name)
+ publish(name, desc, path,
+ util.getport(u.config("web", "port", 8000)))
+
+# listen
+
+class listener(object):
+ def __init__(self):
+ self.found = {}
+ def removeService(self, server, type, name):
+ if repr(name) in self.found:
+ del self.found[repr(name)]
+ def addService(self, server, type, name):
+ self.found[repr(name)] = server.getServiceInfo(type, name)
+
+def getzcpaths():
+ ip = getip()
+ if ip.startswith('127.'):
+ return
+ server = Zeroconf.Zeroconf(ip)
+ l = listener()
+ Zeroconf.ServiceBrowser(server, "_hg._tcp.local.", l)
+ time.sleep(1)
+ server.close()
+ for value in l.found.values():
+ name = value.name[:value.name.index('.')]
+ url = "http://%s:%s%s" % (socket.inet_ntoa(value.address), value.port,
+ value.properties.get("path", "/"))
+ yield "zc-" + name, url
+
+def config(orig, self, section, key, default=None, untrusted=False):
+ if section == "paths" and key.startswith("zc-"):
+ for name, path in getzcpaths():
+ if name == key:
+ return path
+ return orig(self, section, key, default, untrusted)
+
+def configitems(orig, self, section, untrusted=False):
+ repos = orig(self, section, untrusted)
+ if section == "paths":
+ repos += getzcpaths()
+ return repos
+
+def defaultdest(orig, source):
+ for name, path in getzcpaths():
+ if path == source:
+ return name.encode(encoding.encoding)
+ return orig(source)
+
+def cleanupafterdispatch(orig, ui, options, cmd, cmdfunc):
+ try:
+ return orig(ui, options, cmd, cmdfunc)
+ finally:
+ # we need to call close() on the server to notify() the various
+ # threading Conditions and allow the background threads to exit
+ global server
+ if server:
+ server.close()
+
+extensions.wrapfunction(dispatch, '_runcommand', cleanupafterdispatch)
+
+extensions.wrapfunction(ui.ui, 'config', config)
+extensions.wrapfunction(ui.ui, 'configitems', configitems)
+extensions.wrapfunction(hg, 'defaultdest', defaultdest)
+hgweb_mod.hgweb = hgwebzc
+hgwebdir_mod.hgwebdir = hgwebdirzc
diff --git a/hgweb.cgi b/hgweb.cgi
new file mode 100755
index 0000000..b5698a0
--- /dev/null
+++ b/hgweb.cgi
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+#
+# An example hgweb CGI script, edit as necessary
+# See also http://mercurial.selenic.com/wiki/PublishingRepositories
+
+# Path to repo or hgweb config to serve (see 'hg help hgweb')
+config = "/path/to/repo/or/config"
+
+# Uncomment and adjust if Mercurial is not installed system-wide
+# (consult "installed modules" path from 'hg debuginstall'):
+#import sys; sys.path.insert(0, "/path/to/python/lib")
+
+# Uncomment to send python tracebacks to the browser if an error occurs:
+#import cgitb; cgitb.enable()
+
+from mercurial import demandimport; demandimport.enable()
+from mercurial.hgweb import hgweb, wsgicgi
+application = hgweb(config)
+wsgicgi.launch(application)
diff --git a/i18n/da.po b/i18n/da.po
new file mode 100644
index 0000000..4268c7b
--- /dev/null
+++ b/i18n/da.po
@@ -0,0 +1,18328 @@
+# Danish translations for Mercurial
+# Danske oversættelser for Mercurial
+# Copyright (C) 2009, 2010 Matt Mackall and others
+#
+# Translation dictionary:
+#
+# changeset ændring
+# commit deponere
+# merge sammenføje
+# patch rettelse
+# repo(sitory) depot
+# revision revision
+# tag mærkat
+# working directory arbejdskatalog
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2011-11-09 18:27+0100\n"
+"PO-Revision-Date: 2011-11-09 19:00+0100\n"
+"Last-Translator: <mg@lazybytes.net>\n"
+"Language-Team: Danish\n"
+"Language: Danish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (standard: %s)"
+
+msgid "Options"
+msgstr "Valgmuligheder"
+
+msgid "Commands"
+msgstr "Kommandoer"
+
+msgid "Extensions"
+msgstr "Udvidelser"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Denne sektion indeholder hjælp for udviddelser distribueret sammen med\n"
+"Mercurial. Hjælp til andre udviddelser er tilgængelig i\n"
+"hjælpesystemet."
+
+msgid "Options:"
+msgstr "Valgmuligheder:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " aliaser %s:"
+
+msgid "hooks for controlling repository access"
+msgstr ""
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+
+msgid "The order in which access checks are performed is:"
+msgstr ""
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+
+msgid ""
+"Branch-based Access Control\n"
+"..........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+
+msgid "The corresponding values can be either:"
+msgstr ""
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+
+msgid ""
+"Path-based Access Control\n"
+"........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+
+msgid ""
+"Groups\n"
+"......"
+msgstr ""
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+
+msgid ""
+"Example Configuration\n"
+"....................."
+msgstr ""
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+
+msgid ""
+" # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
+" # access to any file under the \"resources\" folder (except for 1\n"
+" # file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr ""
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"konfigurationsfejl - hook type \"%s\" kan ikke stoppe indgående ændringer "
+"eller deponeringer"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: bruger \"%s\" nægtet adgang til \"%s\" (ændring \"%s\")"
+
+#, fuzzy, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr "acl: bruger \"%s\" har ikke adgang \"%s\" (ændring \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+
+msgid "The hook does not change bug status."
+msgstr ""
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr ""
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment."
+msgstr ""
+
+msgid "Configuration items common to all access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches ``Bug\n"
+" 1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
+" ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
+" insensitive."
+msgstr ""
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+
+msgid " committer = Bugzilla user"
+msgstr ""
+
+msgid " See also the ``[usermap]`` section."
+msgstr ""
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+
+msgid "XMLRPC access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+
+msgid "MySQL access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configurations:"
+msgstr "Eksempelkonfigurationer:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "python mysql-understøttelse ikke tilgængelig: %s"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "forbinder til %s:%s som %s, kodeord %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "forespørgsel: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "fejlet forespørgsel: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "ukendt databaseskema"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "fejl %d kender allerede til ændring %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "beder bugzilla om at sende mail:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " fejl %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "kører notificeringskommando %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "bugzilla notificeringskommando %s"
+
+msgid "done\n"
+msgstr "færdig\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "slår bruger %s op\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "kan ikke finde bugzilla bruger-id for %s"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "kan ikke finde bugzilla bruger-id for %s eller %s"
+
+msgid "configuration 'bzemail' missing"
+msgstr "konfigurationen af 'bzemail' mangler"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr ""
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "bugzilla version %s ikke understøttet"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Bugzilla fejl: %s"
+
+msgid "command to display child changesets"
+msgstr "kommando til at vise børne-ændringer"
+
+msgid "show the children of the given or working directory revision"
+msgstr "vis børnene til arbejdskataloget eller en given revision"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" Udskriv arbejdskatalogets børnerevisioner. Hvis en revision er\n"
+" angivet med -r/--rev, udskrives børnene til denne revision.\n"
+" Hvis en fil er angivet, udskrives revisionen i hvilken filen sidst\n"
+" blev ændret (efter arbejdskatalogets revision eller argumentet til\n"
+" --rev, hvis givet).\n"
+" "
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr "vis børn af den givne revision"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r REV] [FIL]"
+
+msgid "command to display statistics about repository history"
+msgstr "kommando til at vise statistikker om depotets historie"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr "Revision %d er en sammenføjning; ignorerer...\n"
+
+msgid "analyzing"
+msgstr "analyserer"
+
+msgid "histogram of changes to the repository"
+msgstr "histogram over ændringer i depotet"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+" Denne kommando vil vise et histogram som repræsenterer antallet af\n"
+" ændrede linier eller revisioner, grupperet efter en given\n"
+" skabelon. Standardskabelonen vil gruppere ændringer efter\n"
+" forfatter. Med --dateformat tilvalget kan resultaterne i stedet\n"
+" grupperes efter dato."
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+" Statistikken er basseret på antallet af ændrede linier eller\n"
+" alternativt på antallet af matchende revisioner, hvis --changesets\n"
+" tilvalget er specificeret."
+
+msgid " Examples::"
+msgstr " Eksempler::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+" # viser antaller af ændrede linier for hver bruger\n"
+" hg churn -t '{author|email}'"
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+" # viser graf over daglig aktivitet\n"
+" hg churn -f '%H' -s -c"
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+" # viser månedlig aktivitet af udviklerne\n"
+" hg churn -f '%Y-%m' -s -c"
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+" # viser antallet af linier ændret hvert år\n"
+" hg churn -f '%Y' -s"
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+" Det er muligt at afbilde alternative e-mail-adresser til\n"
+" hoved-adresser ved at bruge en fil med følgende format::"
+
+msgid " <alias email> = <actual email>"
+msgstr " <alias email> = <faktisk email>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+" En sådan fil kan angivet med --aliases tilvalget. Som standard\n"
+" bruges .hgchurn i arbejdskatalogets rod, hvis denne findes.\n"
+" "
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "springer misdannet alias over: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "lav statistik for de specificerede revisioner"
+
+msgid "DATE"
+msgstr "DATO"
+
+msgid "count rate for revisions matching date spec"
+msgstr "lav statistik for revisioner som matcher dato specifikationen"
+
+msgid "TEMPLATE"
+msgstr "MØNSTER"
+
+msgid "template to group changesets"
+msgstr "skabelon for gruppering af ændringer"
+
+msgid "FORMAT"
+msgstr "FORMAT"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr "strftime-kompatibelt format til gruppering efter dato"
+
+msgid "count rate by number of changesets"
+msgstr "lav statistik efter antallet af ændringer"
+
+msgid "sort by key (default: sort by count)"
+msgstr "sorter efter nøgle (standard: sorter efter antal)"
+
+msgid "display added/removed lines separately"
+msgstr "vil tilføjede/fjernede linier separat"
+
+msgid "FILE"
+msgstr "FIL"
+
+msgid "file with email aliases"
+msgstr "fil med email-aliaser"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATO] [-r REV] [--aliases FIL] [FIL]"
+
+msgid "colorize output from some commands"
+msgstr "farvelæg output for nogle kommandoer"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"Denne udvidelse ændrer status- og resolve-kommandoerne så de tilføjer\n"
+"farve til deres output for at afspejle filstatus, qseries-kommandoen\n"
+"så den tilføjer farve for at afspejle status for rettelsen (anvendt,\n"
+"ikke-anvendt, manglende), og diff-relaterede kommandoer så de\n"
+"fremhæver tilføjelser, fjernelser, diff-hoveder og mellemrum i\n"
+"slutningen af linier."
+
+#, fuzzy
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"Ud over farver er der også andre effekter tilgængelig, såsom fed og\n"
+"understreget tekst. Effekterne bliver renderet med ECMA-48 SGR\n"
+"kontrolfunktionen (aka ANSI escape codes)."
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr "Standardeffekterne som kan overskrives i din konfigurationsfil::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' slår alle effekter fra\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr ""
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "ignorerer ukendt farve/effekt %r (konfigureret i color.%s)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+"hvornår der skal farvelægges (boolks værdi, \"always\", \"auto\" eller "
+"\"never\")"
+
+msgid "TYPE"
+msgstr "TYPE"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr "importer revisioner fra fremmede VCS depoter ind i Mercurial"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" Hvis der ikke angivet et navn til destinationen, så bruges\n"
+" grundnavnet for kilden med ``-hg`` tilføjet. Hvis\n"
+" destinationsdepotet ikke allerede findes, så vil det bliver\n"
+" oprettet."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+
+msgid " source author = destination author"
+msgstr " forfatter i kildes = forfatter i destinationen"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+
+msgid " include path/to/file-or-dir"
+msgstr ""
+
+msgid " exclude path/to/file-or-dir"
+msgstr ""
+
+msgid " rename path/to/source path/to/destination"
+msgstr ""
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+
+msgid " key parent1, parent2"
+msgstr ""
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+
+msgid " original_branch_name new_branch_name"
+msgstr ""
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ''''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ''''''''''"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The following options can be used with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" '''''''''''''''''"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid " The following options can be set with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" '''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" '''''''''''''''''''''"
+msgstr ""
+
+msgid " The following options are supported:"
+msgstr ""
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+
+msgid "source repository type"
+msgstr "kildedepotstype"
+
+msgid "destination repository type"
+msgstr "type for destinations repository"
+
+msgid "import up to target revision REV"
+msgstr "importer op til revision REV"
+
+msgid "remap usernames using this file"
+msgstr "konverter brugernavne ved hjælp af denne fil"
+
+msgid "remap file names using contents of file"
+msgstr "konverter filnavne ved brug af filindhold"
+
+msgid "splice synthesized history into place"
+msgstr "ind-splejs syntetisk historie"
+
+msgid "change branch names while converting"
+msgstr "omdøb grene under konverteringen"
+
+msgid "try to sort changesets by branches"
+msgstr "forsøg at sortere ændringer efter gren"
+
+msgid "try to sort changesets by date"
+msgstr "forsøg at sortere ændringer efter dato"
+
+msgid "preserve source changesets order"
+msgstr "bevar kildeændringerne ordning"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [TILVALG]... KILDE [MÃ…L [REV-AFBILDNING]]"
+
+msgid "only return changes on specified branches"
+msgstr "returner kun ændringer på givne grene"
+
+msgid "prefix to remove from file names"
+msgstr "præfix der skal fjernes fra filnavne"
+
+msgid "only return changes after or between specified tags"
+msgstr "returner kun ændringer efter eller mellem givne mærkater"
+
+msgid "update cvs log cache"
+msgstr "opdater cvs log cache"
+
+msgid "create new cvs log cache"
+msgstr "opret ny cvs log cache"
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr "angiv cvsroot"
+
+msgid "show parent changesets"
+msgstr "vis forældre-ændringer"
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr "ignoreret af kompatibilitetsgrunde"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [TILVALG]... [STI]..."
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ""
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ""
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s ser ikke ud som et Bazaar depot"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Bazaar modulerne kunne ikke indlæses"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr "bzr kildetype kunne ikke bestemmes\n"
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr "%s er ikke en gyldig revision i den nuværende gren"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s er ikke længere tilgængelig i %s"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "%s.%s symbolsk lænke er ikke noget mål"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "kan ikke finde påkrævet værktøj \"%s\""
+
+#, python-format
+msgid "%s error:\n"
+msgstr "%s fejl:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr "syntaksfejl i %s(%d): nøgle/værdi-par forventet"
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "kunne ikke åbne afbildningsfil %r: %s"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: ugyldig kildedepotstype"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: manglende eller usupporteret depot"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: ugyldig destinationsdepottype"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: ukendt depottype"
+
+msgid "getting files"
+msgstr "henter filer"
+
+msgid "revisions"
+msgstr "revisioner"
+
+msgid "scanning"
+msgstr "skanner"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "ukendt sortering: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "cyklus opdaget mellem %s og %s"
+
+msgid "not all revisions were sorted"
+msgstr "ikke alle revisioner blev sorteret"
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr "Skriver forfatter-afbildningsfil %s\n"
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr "Ignorerer dårlig linie i forfatter-afbildningsfil %s: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "afbilder forfatter %s til %s\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "tilsidesætter afbildning for forfatter %s, var %s, vil blive %s\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "splejsede %s ind som forældre til %s\n"
+
+msgid "scanning source...\n"
+msgstr "skanner kilde...\n"
+
+msgid "sorting...\n"
+msgstr "sorterer...\n"
+
+msgid "converting...\n"
+msgstr "konverterer...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "kilde: %s\n"
+
+msgid "converting"
+msgstr "konverterer"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "antager mål %s\n"
+
+msgid "more than one sort mode specified"
+msgstr "mere end end sorteringsmetode angivet"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "--sourcesort er ikke supporteret at denne datakilde"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s ser ikke ud som et CVS checkout"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "forbinder til %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "CVS pserver godkendelse fejlede"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+"uventet svar fra CVS serveren (forventede \"Valid-requests\", men fik %r)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "%d byte mangler i fjernfilen"
+
+msgid "malformed response from CVS"
+msgstr "misdannet svar fra CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "cvs server: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "ukendt CVS svar: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "samler CVS rlog\n"
+
+msgid "not a CVS sandbox"
+msgstr "ikke en CVS sandkasse"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "læser cvs log-mellemlager %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "mellemlager har %d lagerindgange\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "fejl ved læsning af mellemlager: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "kører %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "RCS-fil skal efterfølges af en arbejdsfil"
+
+msgid "must have at least some revisions"
+msgstr "kan have mindst nogle revisioner"
+
+msgid "expected revision number"
+msgstr "forventede et revisionsnummer"
+
+msgid "revision must be followed by date line"
+msgstr "revision skal efterfølges af datolinje"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "skriver cvs log-mellemlager %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d lagerindgange\n"
+
+msgid "creating changesets\n"
+msgstr "opretter ændringer\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "syntetisk ændring kan ikke have flere forældre"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"advarsel: CVS deponeringsbesked refererer en ikke-eksisterende gren %r:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d ændringer\n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s ser ikke ud som et darcs depot"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "kræver darcs version 2.1 eller nyere (fandt %r)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Python ElementTree modulet er ikke tilstede"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "%s depotformatet er ikke supporteret, opgrader venligst"
+
+msgid "failed to detect repository format!"
+msgstr "kunne ikke detektere depotformatet!"
+
+msgid "internal calling inconsistency"
+msgstr "intern kaldeinkonsistens"
+
+msgid "errors in filemap"
+msgstr "fejl i filafbildning"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr "%s:%d: stien til %s mangler\n"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r er allerede i %s listen\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr "%s:%d: overflødig / i %s %r\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: ukendt direktiv %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "kildedepot understøtter ikke --filemap"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s ser ikke ud som et Git depot"
+
+msgid "cannot retrieve git heads"
+msgstr "kan ikke hente hoveder fra git"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "kan ikke læse %r objekt ved %s"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "kan ikke læse ændringer i %s"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "kan ikke læse mærkater fra %s"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s ser ikke ud som et GNU Arch depot"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "kan ikke finde GNU Arch"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "analyserer træ version %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr "kan ikke parse cat-log af %s"
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s er ikke et lokalt Mercurial depot"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "initialiserer mål %s depot\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "hiver fra %s ind i %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "bortfiltrerer tom revision\n"
+
+msgid "updating tags\n"
+msgstr "opdaterer mærkater\n"
+
+msgid "updating bookmarks\n"
+msgstr "opdaterer bogmærker\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s er ikke en gyldig startrevision"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "ignorerer: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s ser ikke ud som et monotone depot"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr ""
+
+msgid "bad mtn packet - no divider before size"
+msgstr ""
+
+msgid "bad mtn packet - no end of packet size"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr ""
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "mtn kommando '%s' returnerede %s"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "kopierer fil i omdøbt katalog fra '%s' til '%s'"
+
+msgid "unable to determine mtn automate interface version"
+msgstr ""
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr ""
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s ser ikke ud som et P4 depot"
+
+msgid "reading p4 views\n"
+msgstr "læser p4 views\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "samler p4 changelists\n"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr "Mercurial kunne ikke køre sig selv, kontroller om hg er i PATH"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s ser ikke ud som et Subversion depot"
+
+msgid "Could not load Subversion python bindings"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr "fandt Subversion python bindinger %d.%d, 1.4 eller senere er påkrævet"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr "Subversion python bindinger er for gamle, 1.4 eller senere er påkrævet"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: revision %s er ikke et heltal"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: startrevision %s er ikke et heltal"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "ingen revision fundet i modul %s"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "forventede at %s ville være ved %r, men fandt det ikke"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "fandt %s ved %r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "ignorerer tom gren %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "fandt gren %s ved %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: startrevision er ikke understøttet ved mere end en gren"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: fandt ingen revisioner efter startrevision %d"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "%s blev ikke fundet op til revision %d"
+
+msgid "scanning paths"
+msgstr "skanner stier"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "fandt forælder til gren %s ved %d: %s\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "henter revisionslog for \"%s\" fra %d til %d\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: gren har ikke nogen revision %s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "initialiserer svn depot %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "initialiserer svn arbejdskatalog %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "uventet svn output:\n"
+
+msgid "unable to cope with svn output"
+msgstr "kan ikke håndtere svn output"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "skrivning af Subversion mærkater er endnu ikke implementeret\n"
+
+msgid "automatically manage newlines in repository files"
+msgstr "automatisk håndtering af linieskift i depotfiler"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+"Denne udvidelse lader dig håndtere linieskifttypen (CRLF eller LF) som\n"
+"bruges i depotet og i det lokale arbejdskatalog. På den måde kan du få\n"
+"CRLF linieskift på Windows og LF på Linux/Mac, og således lade alle\n"
+"bruge de linieskift der passer til deres OS."
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+"Udvidelsen læser sin konfiguration fra en versioneret ``.hgeol``\n"
+"konfigurationsfil fra roden af arbejdskataloget. Denne ``.hgeol`` fil\n"
+"bruger samme syntaks som alle andre Mercurial konfigurationsfiler. Den\n"
+"bruger to sektioner: ``[patterns]`` og ``[repository]``."
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+"Sektionen ``[patterns]`` angiver hvordan linieskift skal konverteres\n"
+"mellem arbejdskataloget og depotet. Formatet angives med et\n"
+"filmønster. Den første træffer bliver brugt, så skriv mere specifikke\n"
+"mønstre først. De mulige linieskifttyper er ``LF``, ``CRLF`` og\n"
+"``BIN``."
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+"Filer deklareret som ``CRLF`` eller ``LF`` bliver altid hentet ud og\n"
+"gemt i depotet i dette format og filer deklareret som binære (``BIN``)\n"
+"bliver ikke ændret. Desuden er ``native`` et alias for platformens\n"
+"normale linieskift: ``LF`` på Unix (samt Mac OS X) og ``CRLF`` på\n"
+"Windows. Bemærk at ``BIN`` (gør ingenting ved linieskift) er\n"
+"Mercurials standardopførsel; det er kun nødvendigt at bruge den hvis\n"
+"du skal overskrive et senere og mere generelt mønster."
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+"Den valgfrie ``[repository]`` sektion angiver linieskifttypen der\n"
+"bruges når filer gemmes i depotet. Den har en enkelt indstilling,\n"
+"``native``, som bestemmer typen af linieskift for filer som er\n"
+"deklareret som ``native`` i ``[patterns]`` sektionen. Den kan sættes\n"
+"til ``LF`` eller ``CRLF``. Standardindstillingen er ``LF``. Som et\n"
+"eksempel betyder dette på Windows, at filer konfigureret som\n"
+"``native`` vil blive konverteret fra ``CRLF`` til ``LF`` når de gemmes\n"
+"i depotet. Filer som er deklareret som ``LF``, ``CRLF`` eller ``BIN``\n"
+"i ``[patterns]`` sektionen bliver altid gemt uden ændring i depotet."
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr "Et eksempel på en versioneret ``.hgeol`` fil::"
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+" [repository]\n"
+" native = LF"
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"Udvidelsen bruger en valgfri ``[eol]`` sektion som bliver læst fra\n"
+"både de normale konfigurationsfiler og fra ``.hgeol`` filen, hvor den\n"
+"sidste har mere betydning end den første. Du kan bruge denne sektion\n"
+"til at bestemme den overordnede opførsel. Der er tre indstillinger:"
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+"- ``eol.native`` (standard er ``os.linesep``) kan sættes til ``LF``\n"
+" eller ``CRLF`` for at overskrive den sædvanlige fortolkning af\n"
+" ``native`` når filer hentes ud. Dette kan f.eks. bruges med\n"
+" :hg:`archive` på Unix til at lave et arkiv hvor filerne har\n"
+" linieskift til Windows."
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+"- ``eol.only-consistent`` (standard er True) kan sættes til False for\n"
+" at lade udvidelsen konvertere filer med inkonsistente linieskift.\n"
+" Inkonsistent betyder at der er både ``CRLF`` og ``LF`` linieskift\n"
+" til stedet i filen. Sådanne filer bliver normalt ikke rørt under\n"
+" antagelse af at de har miksede linieskift med vilje."
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+"Se :hg:`help patterns` for mere information on de brugte\n"
+"glob-mønstre.\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "ignorerer ukendt linieskifttype '%s' fra %s\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s i %s skulle ikke have %s linieskift"
+
+msgid "end-of-line check failed:\n"
+msgstr ""
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "eol-udvidelsen er inkompatibel med win32text-udvidelsen\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "inkonsistent linieskift i %s\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+" [extdiff]\n"
+" # tilføj ny kommando som kører GNU diff(1) i 'context diff' modus\n"
+" cdiff = gdiff -Nprc5\n"
+" ## eller den gamle måde:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # tilføj en ny kommando ved navn vdiff som kører kdiff3\n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+" # tilføj en ny kommando ved navn meld som kører meld (ingen grund\n"
+" # til at angive navnet to gange)\n"
+" meld ="
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+" # tilføj en ny kommando ved navn vimdiff som kører gvimdiff med\n"
+" # DirDiff udvidelsen (se\n"
+" # http://www.vim.org/scripts/script.php?script_id=102) Brugere fra\n"
+" # ikke-engelsktalende lande bør putte \"let g:DirDiffDynamicDiffText\n"
+" # = 1\" i deres .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+"Argumenterne til værktøjerne kan indeholde variabler som bliver erstattet på "
+"runtime::"
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+" $parent1, $plabel1 - filnavn, beskrivelse af første forælder\n"
+" $child, $clabel - filnavn, beskrivelse af barnerevisionen\n"
+" $parent2, $plabel2 - filnavn, beskrivelse af anden forælder\n"
+" $root - depotets rodbibliotek\n"
+" $parent er et alias for $parent1."
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr "laver øjebliksbillede af %d filer fra rev %s\n"
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr "laver øjebliksbillede af %d filer fra arbejdskataloget\n"
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "kan ikke angive --rev og --change på samme tid"
+
+msgid "cleaning up temp directory\n"
+msgstr "rydder midlertidigt katalog op\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "CMD"
+msgstr "KMD"
+
+msgid "comparison program to run"
+msgstr "sammenligningsprogram der skal køres"
+
+msgid "OPT"
+msgstr "TILVALG"
+
+msgid "pass option to comparison program"
+msgstr "videregiv argument til sammenligningsprogram"
+
+msgid "revision"
+msgstr "revision"
+
+msgid "change made by revision"
+msgstr "ændring lavet i revision"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [TILVALG]... [FIL]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [TILVALG]... [FIL]..."
+
+msgid "pull, update and merge in one command"
+msgstr "træk, opdater og sammenføj i en kommando"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr "hent ændringer fra fjerndepot, sammenføj nye ændringer hvis nødvendigt"
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Se :hg:`help dates` for en liste af gyldige formater til -d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Returnerer 0 ved succes.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"arbejdskataloget er ikke ved gren-spidsen (brug \"hg update\" for at hente "
+"gren-spidsen)"
+
+msgid "outstanding uncommitted merge"
+msgstr "udestående udeponeret sammenføjning"
+
+msgid "outstanding uncommitted changes"
+msgstr "udestående udeponeret ændringer"
+
+msgid "working directory is missing some files"
+msgstr "arbejdskataloget mangler nogle filer"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"flere hoveder i denne gren (brug \"hg heads .\" og \"hg merge\" for at "
+"sammenføje)"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "hiver fra %s\n"
+
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"Det andet depot understøtter ikke revisionsopslag, så en revision kan ikke "
+"angives."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+"sammenføjer ikke med %d andre nye gren-hoveder (brug \"hg heads .\" og \"hg "
+"merge\" for at sammenføje dem)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "opdaterer til %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "sammenføjer med %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr "ny ændring %d:%s fletter fjernændringer sammen med lokale\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "en bestemt revision som du gerne vil hive ned"
+
+msgid "edit commit message"
+msgstr "rediger deponeringsbesked"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "rediger deponeringsbesked (FORÆLDET)"
+
+msgid "switch parents when merging"
+msgstr "ombyt forældre ved sammenføjning"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [KILDE]"
+
+msgid "commands to sign and verify changesets"
+msgstr "kommandoer til at underskrive og verificere ændringer"
+
+msgid "error while verifying signature"
+msgstr "fejl ved verifikation af underskrift"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s DÃ¥rlig underskrift fra \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Bemærk: underskriften er udløbet (underskrevet af \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Bemærk: denne nøgle er udløbet (underskrevet af \"%s\")\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "vis underskrevne ændringer"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "%s:%d knude findes ikke\n"
+
+msgid "hg sigcheck REVISION"
+msgstr "hg sigcheck REVISION"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr "verificer alle underskrifter der måtte være for en given revision"
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr "Ingen gyldig signatur for %s\n"
+
+msgid "make the signature local"
+msgstr "lav underskriften lokal"
+
+msgid "sign even if the sigfile is modified"
+msgstr "underskriv selv hvis signaturfilen er ændret"
+
+msgid "do not commit the sigfile after signing"
+msgstr "deponer ikke signaturfilen efter underskrivning"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "nøgle ID der skal underskrives med"
+
+msgid "TEXT"
+msgstr "TEKST"
+
+msgid "commit message"
+msgstr "deponeringsbesked"
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr "hg sign [TILVALG]... [REVISION]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "tilføj en underskrift til den aktuelle eller en given revision"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Hvis der ikke angives en revision, så bruges forældren til\n"
+" arbejdskataloget, eller tip, hvis der ikke er hentet en revision."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Se :hg:`help dates` for en liste af gyldige formater til -d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr "udeponeret sammenføjning - angiv venligst en specifik revision"
+
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Underskriver: %d:%s\n"
+
+msgid "error while signing"
+msgstr "fejl ved underskrivning"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"arbejdskopien af .hgsigs er ændret (deponer venligst .hgsigs manuelt eller "
+"brug --force)"
+
+msgid "unknown signature version"
+msgstr "ukendt underskrift-version"
+
+msgid "command to view revision graphs from a shell"
+msgstr "kommando til at se revisionsgrafer fra en kommandofortolker"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"Denne udvidelser tilføjer et --graph tilvalg til incoming-, outgoing-\n"
+"og log-kommandoerne. Når dette tilvalg bruges, så vil en\n"
+"ASCII-repræsentation af revisionsgrafen også blive vist.\n"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "-G/--graph tilvalget er ikke kompatibelt med --%s"
+
+msgid "-G/--graph option is incompatible with --follow with file argument"
+msgstr "-G/--graph tilvalget er ikke kompatibelt med --follow sammen med et filargument"
+
+msgid "NUM"
+msgstr "TAL"
+
+msgid "limit number of changes displayed"
+msgstr "begræns antaln viste ændringer"
+
+msgid "show patch"
+msgstr "vis rettelse"
+
+msgid "show the specified revision or range"
+msgstr "vis den angivne revision eller interval"
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr "hg glog [TILVALG]... [FIL]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "vis revisionshistorie ved siden af en ASCII revisionsgraf"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+" Udskriver en revisionshistorie ved siden af en revisionsgraf\n"
+" tegnet med ASCII-tegn."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Knuder udskrevet med et @-tegn er forældre til arbejdskataloget.\n"
+" "
+
+msgid "show the revision DAG"
+msgstr "vis revisionsgrafen"
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+" [web]\n"
+" # Hvis du vil have hyperlinks (valgfrit)\n"
+" baseurl = http://server/sti/til/depot\n"
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s returnerede en fejl: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: sender opdatering til %s\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "email.from skal være defineret ved afsendelse af email"
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/placering/af/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr "udskriv information om fælles forfar"
+
+msgid "cat a specific revision"
+msgstr "udskriv en bestemt revision"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: ingen type eller revision angivet\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "afbryder: hg cat-file forstår kun deponeringer\n"
+
+msgid "parse given revisions"
+msgstr "fortolk de givne revisioner"
+
+msgid "print revisions"
+msgstr "udskriv revisioner"
+
+msgid "print extension options"
+msgstr "udskriv udvidelses valgmuligheder"
+
+msgid "start interactive history viewer"
+msgstr "start interaktiv historievisning"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l GRÆNSE] [REV-INTERVAL]"
+
+msgid "generate patch"
+msgstr "generer rettelse"
+
+msgid "recursive"
+msgstr "rekursiv"
+
+msgid "pretty"
+msgstr "pæn"
+
+msgid "stdin"
+msgstr "standardinddata"
+
+msgid "detect copies"
+msgstr "detekter kopier"
+
+msgid "search"
+msgstr "søg"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [TILVALG]... KNUDE1 KNUDE2 [FIL]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [TILVALG ]... TYPE FIL"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr "hg debug-merge-base REV REV"
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "ignoreret"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse REV"
+
+msgid "header"
+msgstr "header"
+
+msgid "topo-order"
+msgstr "topo-order"
+
+msgid "parents"
+msgstr "forældre"
+
+msgid "max-count"
+msgstr "max-count"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [TILVALG]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "syntaksfarvelægning til hgweb (kræver Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"Det afhænger af Pygments biblioteket til syntaksfarvelægning:\n"
+"http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "Der er en enkelt konfigurationsmulighed::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <stil>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "Standardstilen er 'colorful'.\n"
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr "accelerer statusreporter ved brug af Linux's inotify service"
+
+msgid "start an inotify server for this repository"
+msgstr "start en inotify server for dette depot"
+
+msgid "debugging information for inotify extension"
+msgstr "fejlsøgningsinformation til inotify udvidelsen"
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+" Udskriver listen af kataloger som bliver overvåget af inotify\n"
+" serveren.\n"
+" "
+
+msgid "directories being watched:\n"
+msgstr "kataloger som bliver overvåget:\n"
+
+msgid "run server in background"
+msgstr "kører serveren i baggrunden"
+
+msgid "used internally by daemon mode"
+msgstr "brugt internt i daemon mode"
+
+msgid "minutes to sit idle before exiting"
+msgstr "antal minutter der skal ventes i tomgang før afslutning"
+
+msgid "name of file to write process ID to"
+msgstr "navn på fil at skrive process ID til"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [TILVALG]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr "inotify-klient: fandt død inotify server sokkel; fjerner den\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-klient: kunne ikke starte inotify server: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr "inotify-klient: kunne ikke snakke med ny inotify server: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-klient: kontakt med inotify server mislykkedes: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-klient: modtog tomt svar fra inotify server"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr "(inotify: modtog svar fra inkompatibel server version %d)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: modtog '%s' svar når '%s' blev forventet)\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "dette system ser ikke ud til at understøtte inotify"
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+"*** den nuværende grænse pr bruger for antallet af inotify overvågninger er "
+"%s\n"
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+"*** denne grænse er for lille til at overvåge alle biblioteker i dette "
+"depot\n"
+
+msgid "*** counting directories: "
+msgstr "*** tæller kataloger: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "fandt %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr "*** for at hæve grænsen fra %d til %d (kør som root):\n"
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr "kan ikke overvåge %s før inotify overvågningsgrænsen er hævet"
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "inotify service er ikke tilgængelig: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "overvåger %r\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "overvåger kataloger under %r\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "%s hændelse: oprettede %s\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "%s hændelse: slettede %s\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "%s hændelse: ændrede %s\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "filsystem indeholdende %s blev afmonteret\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s læsbar: %d byte\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr "%s læser %d hændelser\n"
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr "afsluttede opsætning\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "status: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr "genskanner på grund af ændring af .hgignore\n"
+
+msgid "cannot start: socket is already bound"
+msgstr "kan ikke starte: soklen er allerede i brug"
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr "svarer forespørgsel for %r\n"
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr "modtog forespørgsel fra inkompatibel klient version %d\n"
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "genkendte ikke forespørgselstype: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr "ekspander udtryk i historikken og sammendrag"
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+"Denne udvidelse gør det muligt at bruge en speciel syntaks i\n"
+"sammendrag som automatisk vil blive ekspanderet til links eller et\n"
+"vilkårligt andet udtryk, ligesom InterWiki gør."
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+"Et par eksempler (link til fejldatabase, etc.) som kan bruges i din\n"
+"hgrc::"
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr "interhg: ugyldigt mønster for %s: %s\n"
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr "interhg: ugyldig regexp for %s: %s\n"
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr "Eksempel::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid "Three additional date template filters are provided:"
+msgstr ""
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "overskriver %s og udvider nøgleord\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr "overskriver %s og formindsker nøgleord\n"
+
+msgid "[keyword] patterns cannot match"
+msgstr "[keyword] mønstre kan ikke matche"
+
+msgid "no [keyword] patterns configured"
+msgstr "ingen [keyword] mønstre konfigureret"
+
+msgid "show default keyword template maps"
+msgstr "vis standard keyword skabelon-afbildninger"
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "opretter midlertidigt depot ved %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+"\n"
+"\tkonfiguration med tilpaset nøgleordskabelon\n"
+
+msgid "\textending current template maps\n"
+msgstr "\tudvider aktuelle skabeloner\n"
+
+msgid "\toverriding default svn keywordset\n"
+msgstr "\toverskriver standard svn skabelon\n"
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\toverskriver standard cvs skabelon\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+"\n"
+"\tkonfiguration med standard svn nøgleordskabelon\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+"\n"
+"\tkonfiguration med standard cvs nøgleordskabelon\n"
+
+msgid "\tdisabling current template maps\n"
+msgstr "deaktiverer nuævrende skabelon\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+"\n"
+"\tkonfiguration med nuværende nøgleordskabelon\n"
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+"\n"
+"nøgleord skrevet til %s:\n"
+
+msgid "hg keyword configuration and expansion example"
+msgstr "eksempel på konfiguration og ekspansion af nøgleord"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+"\n"
+"\tnøgleord udvidet\n"
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [TILVALG]... [FIL]..."
+
+msgid "expand keywords in the working directory"
+msgstr "udvid nøgleord i arbejdskataloget"
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr " Kør efter at at keyword-udvidelsen er blevet (gen)aktiveret."
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwexpand nægter at køre hvis de angivne filer indeholder lokale "
+"ændringer.\n"
+" "
+
+msgid "show keyword status flags of all files"
+msgstr "vis keyword status for alle filer"
+
+msgid "show files excluded from expansion"
+msgstr "vis filer ekskluderet fra ekspansion"
+
+msgid "only show unknown (not tracked) files"
+msgstr "vis kun ukendte (ikke-fulgte) filer"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [TILVALG]... [FIL]..."
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [TILVALG]... [FIL]..."
+
+msgid "revert expanded keywords in the working directory"
+msgstr "før ekspanderede nøgleord tilbge i arbejdskataloget"
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwshrink nægter at køre hvis de angivne filer indeholder lokale\n"
+" ændringer.\n"
+" "
+
+msgid "track large binary files"
+msgstr "håndtering af store binære filer"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr ""
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+
+msgid " $ hg add --lfsize 2"
+msgstr ""
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size.\n"
+msgstr ""
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "konverter et normalt depot til et largefiles-depot"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+
+msgid "getting largefiles"
+msgstr "henter largefiles"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "henter %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr ""
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "leder efter largefiles i %d ændringer\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "ikke-understøttet URL-skema %r"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "%s ser ikke ud til at være et largefile-lager"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s er ikke et lokalt Mercurial depot"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "initialiserer målet %s\n"
+
+msgid "converting revisions"
+msgstr "konverterer revisioner"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr ""
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr ""
+
+msgid "uploading largefiles"
+msgstr ""
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr ""
+
+msgid "getting changed largefiles\n"
+msgstr "henter ændrede largefiles\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr ""
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr ""
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr ""
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert KILDE MÃ…L [FIL ...]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr ""
+
+msgid "minimum size for largefiles must be specified"
+msgstr ""
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "ukendt operativsystem: %s\n"
+
+#, python-format
+msgid "Found %s in store\n"
+msgstr ""
+
+#, python-format
+msgid "Found %s in system cache\n"
+msgstr ""
+
+#, python-format
+msgid "bad hash in '%s' (only %d bytes long)"
+msgstr ""
+
+msgid "Can't get file locally"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s er allerede en largefile\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "tilføjer %s som en largefile\n"
+
+msgid "no files specified"
+msgstr "ingen filer angivet"
+
+#, python-format
+msgid "not removing %s: %s (use -f to force removal)\n"
+msgstr "fjerner ikke %s: %s (brug -f for at forcere fjernelsen)\n"
+
+msgid "file still exists"
+msgstr "%s eksisterer stadig"
+
+msgid "file is modified"
+msgstr "filen er ændret"
+
+msgid "file has been marked for add"
+msgstr "filen er markeret til sletning"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "fjerner %s\n"
+
+msgid "uncommitted local changes"
+msgstr "udeponerede lokale ændringer"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "føjer %s og %s sammen til %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "sammenføjer %s\n"
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+msgid "destination largefile already exists"
+msgstr "destinations largefile eksisterer allerede"
+
+msgid "no files to copy"
+msgstr "ingen filer at kopiere"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "ukendt depottype '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "kan ikke give præfix ved arkivering til filer"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "fjerner ikke %s: filen følges ikke\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr ""
+
+msgid "largefiles to upload:\n"
+msgstr ""
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr ""
+
+msgid "addremove cannot be run on a repo with largefiles"
+msgstr ""
+
+#, python-format
+msgid "largefiles: failed to put %s (%s) into store: %s"
+msgstr ""
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr ""
+
+msgid "putlfile failed:"
+msgstr ""
+
+msgid "putlfile failed (unexpected response):"
+msgstr ""
+
+msgid "unexpected response:"
+msgstr "uventet svar:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "fjernlager: kunne ikke åbne fil %s: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr ""
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr ""
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr ""
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr ""
+
+msgid "add as largefile"
+msgstr ""
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+
+msgid "verify largefiles"
+msgstr ""
+
+msgid "verify all revisions of largefiles not just current"
+msgstr ""
+
+msgid "verify largefile contents not just existence"
+msgstr ""
+
+msgid "display outgoing largefiles"
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr "håndter en stak af rettelser"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Denne udvidelse lader dig arbejde med en stak af rettelser (patches) i\n"
+"et Mercurial repository. Den håndterer to stakke af rettelser - alle\n"
+"kendte rettelser og alle anvendte rettelser (en delmængde af de kendte\n"
+"rettelser)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Kendte rettelser er repræsenteret som rettelse-filer i .hg/patches\n"
+"biblioteket. Anvendte rettelser er både rettelse-filer og Mercurial\n"
+"ændringer."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Almindelige opgaver (brug :hg:`help kommado` for flere detaljer)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" opret ny rettelse qnew\n"
+" importer eksisterende rettelse qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" list rettelse-serien qseries\n"
+" list anvendte rettelser qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" anvend og put rettelse på stakken qpush\n"
+" fjern rettelse fra stakken qpop\n"
+" genopfrisk indholdet af den øverste rettelse qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"Som udgangspunkt vil mq automatisk bruge git rettelser når det er\n"
+"nødvendigt for at undgå at miste information om ændring af\n"
+"filrettigheder, information om kopier, binære filer eller oprettelse\n"
+"og sletning af tomme filer. Dette kan konfigureres med::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"Hvis tilvalget er sat til 'keep', så vil mq adlyde [diff] sektionen\n"
+"samtidig med at den bevarer eksisterende git rettelser ved qrefresh.\n"
+"Hvis det sættes til 'yes' eller 'no', så vil mq ignorere [diff]\n"
+"sektionen og altid generere git eller normale rettelser, med mulighed\n"
+"for tab af data i det sidste tilfælde."
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command.\n"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr "udskriv første linie i rettelsens hoved"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "misdannet mq statuslinie: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "mq.git indstillingen kan være auto/keep/yes/no, fik %s"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s findes mere end én gang i %s"
+
+msgid "guard cannot be an empty string"
+msgstr "filtret kan ikke være den tomme streng"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "filtret %r starter med et ugyldig tegn: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "ugyldig tegn i filtret %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "filtret %r er for kort"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "filtret %r starter med et ugyldig tegn"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "tillader %s - ingen filtre aktiveret\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "tillader %s - ingen negative filtre matcher\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "tillader %s - filtreret af %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "springer %s over - filtreret af %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "springer %s over - ingen matchende filtre\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "fejl ved fjernelse af undo: %s\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "rettelsen %s kunne ikke anvendes"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "rettelsen virkede ikke, sammenføjer %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "opdatering returnerede %d"
+
+msgid "repo commit failed"
+msgstr "deponering fejlede"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "ikke i stand til at læse %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "rettelsen %s findes ikke\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "rettelsen %s er ikke anvendt\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "rettelse fejlede, kan ikke fortsætte (prøv -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "anvender %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "kan ikke læse %s\n"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "rettelsen %s er tom\n"
+
+msgid "repository commit failed"
+msgstr "deponering fejlede"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr "rettelse fejlede, afvisninger er efterladt i arbejdskataloget\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr ""
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "ukendt rettelser %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr ""
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "kan ikke slette revision %d ovenover anvendte rettelser"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "rettelsen %s er færdiggjort uden en ændringsbesked\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete kræver mindst en revision eller navnet på en rettelse"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "kan ikke slette den anvendte rettelse %s"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "rettelsen %s er ikke i series filen"
+
+msgid "no patches applied"
+msgstr "ingen rettelser anvendt"
+
+msgid "working directory revision is not qtip"
+msgstr "arbejdskatalogets revision er ikke qtip"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "udeponerede ændringer i underdepot %s"
+
+msgid "local changes found, refresh first"
+msgstr "lokale ændringer fundet, genopfrisk først"
+
+msgid "local changes found"
+msgstr "lokale ændringer fundet"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" kan ikke bruges som navnet på en rettelse"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" kan ikke bruges i navnet på en rettelse"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" eksisterer allerede som et katalog"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "rettelsen \"%s\" findes allerede"
+
+msgid "cannot manage merge changesets"
+msgstr "kan ikke håndtere sammenføjninger"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "kan ikke skrive rettelse \"%s\": %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "fejl ved sletning af %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "rettelsen \"%s\" er tvetydigt:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "rettelsen %s er ikke i serien"
+
+msgid "(working directory not at a head)\n"
+msgstr "(arbejdskatalog er ikke ved et hoved)\n"
+
+msgid "no patches in series\n"
+msgstr "ingen patches i serien\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s er allerede ved toppen\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "kan ikke skubbe til en tidligere rettelse: %s"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "beskyttet af %s"
+
+msgid "no matching guards"
+msgstr "ingen matchende filtre"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "kan ikke skubbe '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "alle rettelser er i øjeblikket anvendt\n"
+
+msgid "patch series already fully applied\n"
+msgstr "serien af rettelser er allerede anvendt fuldt ud\n"
+
+msgid "cannot use --exact and --move together"
+msgstr "kan ikke bruge --exact og --move sammen"
+
+msgid "cannot push --exact with applied patches"
+msgstr "kan push --exact med anvendte rettelser"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s har ikke gemt nogen forælder"
+
+msgid "please specify the patch to move"
+msgstr "angiv venligst lappen der skal flyttes"
+
+msgid "cleaning up working directory..."
+msgstr "rydder op i arbejdskataloget..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "der opstod fejl ved anvendelsen, ret dem venligst og genopfrisk %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "nu ved: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "rettelsen %s er ikke anvendt"
+
+msgid "no patches applied\n"
+msgstr "ingen rettelser anvendt\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s er allerede ved toppen\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: gennemtvinger opdatering af dirstate\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "prøver at fjerne ukendt knude %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr "fjerner %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "køen af rettelser er nu tom\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "kan ikke genopfriske en revision som har børn"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+
+msgid "patch queue directory already exists"
+msgstr "rettelsesdepotet findes allerede"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "rettelsen %s er ikke i series filen"
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "genopretter status: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "updating queue directory\n"
+msgstr "opdaterer køkatalog\n"
+
+msgid "Unable to load queue repository\n"
+msgstr ""
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr "status er allerede gemt\n"
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr "deponering fejlede\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "rettelse %s er allerede i series-filen"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "tilvalg \"-r\" er ikke gyldigt når filer bliver importeret"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "tilvalg \"-n\" er ikke gyldigt når flere rettelser bliver importeret"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "revision %d er roden for mere end en gren"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "revision %d er allerede håndteret"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "revision %d er ikke forfaren til køen"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "kan ikke importere sammenføjningsrevision %d"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "revision %d er ikke forældren til %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "-e er ikke kompatibelt med importering fra -"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "rettelsen %s eksisterer ikke"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "omdøber %s til %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr "har brug for --name for at importere rettelse fra -"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "kan ikke læse filen %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "tilføjer %s til series filen\n"
+
+msgid "keep patch file"
+msgstr "behold rettelsesfil"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [RETTELSE]..."
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+
+msgid "show only the last patch"
+msgstr "vis kun den sidste rettelse"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [RETTELSE]"
+
+msgid "print the patches already applied"
+msgstr "udskriver rettelserne som allerede er anvendt"
+
+msgid " Returns 0 on success."
+msgstr ""
+
+msgid "only one patch applied\n"
+msgstr "kun én rettelse er anvendt\n"
+
+msgid "show only the first patch"
+msgstr "vis kun den første rettelse"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [RETTELSE]"
+
+msgid "print the patches not yet applied"
+msgstr "udskriver rettelserne som ikke er anvendt endnu"
+
+msgid "all patches applied\n"
+msgstr "alle rettelser er anvendt\n"
+
+msgid "import file in patch directory"
+msgstr "importer en fil i rettelsesbiblioteket"
+
+msgid "NAME"
+msgstr "NAVN"
+
+msgid "name of patch file"
+msgstr "navn på rettelse"
+
+msgid "overwrite existing files"
+msgstr "overskriv eksisterende filer"
+
+msgid "place existing revisions under mq control"
+msgstr "placer eksisterende revisioner under mq-kontrol"
+
+msgid "use git extended diff format"
+msgstr "brug git udvidet diff-format"
+
+msgid "qpush after importing"
+msgstr "qpush efter import"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr "hg qimport [-e] [-n NAVN] [-f] [-g] [-P] [-r REV]... FIL..."
+
+msgid "import a patch"
+msgstr "importer en patch"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" Patchen sættes ind i serien efter den sidste anvendte patch. Hvis\n"
+" der ikker er anvendt nogen patches, indsætter qimport patches\n"
+" først i serien."
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" Patchen vil have samme navn som dens kildefil, med mindre du\n"
+" angiver et nyt med -n/--name."
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" Du kan registrere en eksisterende patch inden i patch kataloget\n"
+" med -e/--existing tilvalget."
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+" Med -f/--force vil en allerede eksisterende patch med samme navn\n"
+" blive overskrevet."
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+" En eksisterende ændring kan blive sat under mq kontrol med -r/--rev\n"
+" (e.g. qimport --rev tip -n patch vil sætte tip under mq kontrol).\n"
+" Med -g/--git vil patches importeret med --rev bruge git diff\n"
+" formatet. Se 'hg help diffs' for mere information om hvorfor dette\n"
+" er vigtigt for at bevare omdøbnings/kopierings-information og\n"
+" ændriner i rettigheder. Brug :hg:`qfinish` for at fjerne ændringer\n"
+" fra mq."
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+" Brug - som patch filnavn for at importere en patch fra standard\n"
+" indput. NÃ¥r der importeres fra standard indput skal der angivet et\n"
+" patchnavn med --name tilvalget.\n"
+" "
+
+msgid " To import an existing patch while renaming it::"
+msgstr ""
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr ""
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Returnerer 0 hvis importeringen lykkedes.\n"
+" "
+
+msgid "create queue repository"
+msgstr "opret kø-repository"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "opret et nyt kø-depot (FORÆLDET)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" Kø-depotet er uversioneret som standard. Hvis -c/--create-repo\n"
+" bruges, så vil qinit oprettet et separat indlejret depot til\n"
+" patches (qinit -c kan også bruges senere for at konvertere et\n"
+" uversioneret patch depot til et versioneret et). Du kan bruge\n"
+" qcommit for at deponere ændringer i dette kø-depot."
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" Denne kommando er forældet. Uden -c er kommandoen ikke nødvendig,\n"
+" med -c bør :hg:`init --mq` bruges i stedet."
+
+msgid "use pull protocol to copy metadata"
+msgstr "brug træk-protokol til at kopiere metadata"
+
+msgid "do not update the new working directories"
+msgstr "undlad at opdatere det nye arbejdskatalog"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "brug ukomprimeret overførsel (hurtig over LAN)"
+
+msgid "REPO"
+msgstr "DEPOT"
+
+msgid "location of source patch repository"
+msgstr "placering af kilde rettelse-depotet"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [TILVALG]... KILDE [MÃ…L]"
+
+msgid "clone main and patch repository at same time"
+msgstr ""
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Returnerer 0 ved succes.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "versionsstyret rettelsesdepot blev ikke fundet (se init --mq)"
+
+msgid "cloning main repository\n"
+msgstr "kloner hoveddepot\n"
+
+msgid "cloning patch repository\n"
+msgstr "kloner depotet til rettelser\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "stripper anvendte rettelser fra destinationsdepotet\n"
+
+msgid "updating destination repository\n"
+msgstr "opdaterer destinationsdepotet\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [TILVALG]... [FIL]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr " Denne kommando er forældet. Brug :hg:`init --mq` i stedet."
+
+msgid "print patches not in series"
+msgstr "udskriv rettelser som ikke er i serien"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "udskriver hele series filen"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "udskriver navnet på den nuværende rettelse"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "print the name of the next patch"
+msgstr "udskriver navnet på den næste rettelse"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the previous patch"
+msgstr "udskriver navnet på den forgående rettelse"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "importer udeponerede ændringer (FORÆLDET)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "tilføj \"From: <aktuel bruger>\" til rettelsen"
+
+msgid "USER"
+msgstr "BRUGER"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "tilføj \"From: <BRUGER>\" til rettelsen"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "tilføj \"Date: <aktuel dato>\" til rettelsen"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "tilføj \"Date: <DATO>\" til rettelsen"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEKST] [-l FIL] RETTELSE [FIL]..."
+
+msgid "create a new patch"
+msgstr ""
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" Brug -g/--git tilvalget for at generere ændringer i det udvidede\n"
+" git diff-format. Se :hg:`help diffs` for mere information om\n"
+" hvorfor dette er vigtigt for at bevare filrettigheder og\n"
+" information om kopieringer og omdøbninger."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Returnerer 0 hvis patchen blev oprettet.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "genopfrisk kun filer som allerede findes i rettelsen og angivne filer"
+
+msgid "add/update author field in patch with current user"
+msgstr "tilføj/opdater forfatterfeltet i rettelsen med den aktuelle bruger"
+
+msgid "add/update author field in patch with given user"
+msgstr "tilføj/opdater forfatterfeltet i rettelsen med den angivne bruger"
+
+msgid "add/update date field in patch with current date"
+msgstr "tilføj/opdater datofeltet i rettelsen med den aktuelle dato"
+
+msgid "add/update date field in patch with given date"
+msgstr "tilføj/opdater datofeltet i rettelsen med den angivne dato"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEKST] [-l FIL] [-s] [FIL]..."
+
+msgid "update the current patch"
+msgstr "opdater den aktuelle patch"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" Hvis der angives filer, så vil den opdaterede patch kun indeholde\n"
+" modifikationer som matcher disse filer; de andre ændringer vil\n"
+" forblive i arbejdskataloget."
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+" Hvis -s/--short angivet, så vil filer som allerede er i patches\n"
+" blive opdateret ligesom matchede filer og forblive i patchen."
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+" hg add/remove/copy/rename virker som sædvanlig, dog vil du måske\n"
+" bruge git-patches (-g/--git eller [diff] git=1) for at følge\n"
+" kopier og omdøbninger. Se 'hg help diffs' for mere information om\n"
+" git diff formatet."
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "tilvalg \"-e\" er inkompatibelt med \"-m\" eller \"-l\""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [TILVALG]... [FIL]..."
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "forskelle mellem den nuværende patch og efterfølgende modifikationer"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" Viser forskelle fra den nuværende patch og eventuelle\n"
+" efterfølgende ændringer i arbejdskataloget siden sidste refresh\n"
+" (dermed ser man hvad den nuværende patch vil blive efter en\n"
+" qrefresh)"
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+" Brug :hg:`diff` hvis du kun vil se ændringer lavet siden den\n"
+" sidste qrefresh, eller :hg:`export qtip` hvis du vil se ændringer\n"
+" lavet af den nuværende patch uden at inkludere ændringer lavet\n"
+" siden qrefresh."
+
+msgid "edit patch header"
+msgstr "rediger rettelsens hoved"
+
+msgid "keep folded patch files"
+msgstr "behold foldede rettelsesfiler"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEKST] [-l FIL] RETTELSE..."
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold kræver navnet på mindst én rettelse"
+
+#, python-format
+msgid "Skipping already folded patch %s\n"
+msgstr "Springer allerede foldet rettelse %s over\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "qfold kan ikke folde allerede anvendt rettelse %s"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "fejl ved foldning af rettelse %s"
+
+msgid "overwrite any local changes"
+msgstr "overskrive eventuelle lokale ændringer"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [TILVALG]... RETTELSE"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+"tilføj eller fjern rettelser indtil den navngivne rettelser er på toppen af "
+"stakken"
+
+msgid "list all patches and guards"
+msgstr "vis alle rettelser og filtre"
+
+msgid "drop all guards"
+msgstr "drop alle filtre"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [RETTELSE] [-- [+VAGT]... [-VAGT]...]"
+
+msgid "set or print guards for a patch"
+msgstr "sæt eller vis filtre for en rettelse"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+" Filtre kontrollerer hvorvidt en rettelse kan blive skubbet på\n"
+" stakken. En rettelse uden filtre kan altid skubbes. En rettelse\n"
+" med et positivt filter (\"+foo\") bliver kun skubbet hvis\n"
+" :hg:`qselect`-kommandoen har aktiveret den. En rettelse med et\n"
+" negativt filter (\"-foo\") bliver aldrig skubbet hvis\n"
+" :hg:`qselect`-kommandoen har aktiveret den."
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" Uden argumenter: vis de aktiverede filtre.\n"
+" Med argumenter: sæt filtre for den navngivne patch."
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr " For at sætte filtre på en anden rettelse::"
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr " hg qguard other.patch -- +2.6.17 -stable"
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "kan ikke blande -l/--list med tilvalg eller argumenter"
+
+msgid "no patch to work with"
+msgstr "ingen rettelse at arbejde med"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "ingen patch ved navn %s"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [RETTELSE]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "udskriv hovedet af den øverste eller den angivne rettelse"
+
+msgid "apply on top of local changes"
+msgstr "anvend ovenpå lokale ændringer"
+
+msgid "apply the target patch to its recorded parent"
+msgstr ""
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr "anvend alle rettelser"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "sammenføj med en anden kø (FORÆLDET)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "sammenføj med navngiven kø (FORÆLDET)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr ""
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [RETTELSE | INDEKS]"
+
+msgid "push the next patch onto the stack"
+msgstr "skub den næste rettelse på stakken"
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost."
+msgstr ""
+" Når -f/--force er angivet, så vil alle lokale ændringer i de\n"
+" rettede filer gå tabt."
+
+msgid "no saved queues found, please use -n\n"
+msgstr "fandt ingen gemte køer, brug venligst -r\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "sammenføjer med kø ved: %s\n"
+
+msgid "pop all patches"
+msgstr "fjern alle rettelser"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr ""
+
+msgid "forget any local changes to patched files"
+msgstr "glem eventuelle lokale ændringer i de rettede filer"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [RETTELSE | INDEKS]"
+
+msgid "pop the current patch off the stack"
+msgstr "fjern den aktuelle rettelse fra stakken"
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack."
+msgstr ""
+" Som standard fjernes toppen af stakken. Hvis der angives en\n"
+" rettelse, så vil der blive fjernet rettelser indtil den angivne\n"
+" rettelse er på toppen af stakken."
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "bruger rettelse-kø: %s\n"
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename RETTELSE1 [RETTELSE2]"
+
+msgid "rename a patch"
+msgstr "omdøb en rettelse"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" Med et argument omdøbes den nuværende rettelse til RETTELSE1. Med\n"
+" to argumenter omdøbes RETTELSE1 til RETTELSE2."
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] REV"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " Denne kommando er forældet. Brug :hg:`rebase` i stedet."
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr "gennemtving kopiering"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TEKST] [-l FIL] [-c] [-n NAVN] [-e] [-f]"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "målet %s eksisterer og er ikke et katalog"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "målet %s eksisterer, brug -f for at gennemtvinge"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "kopier %s til %s\n"
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+
+msgid "no backups"
+msgstr "ingen backupper"
+
+msgid "no backups (DEPRECATED)"
+msgstr "ingen backupper (FORÆLDET)"
+
+msgid "do not modify working copy during strip"
+msgstr ""
+
+msgid "hg strip [-k] [-f] [-n] REV..."
+msgstr "hg strip [-k] [-f] [-n] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "strip ændringer og alle deres efterkommere fra depotet"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" Hvis en af arbejdskatalogets forælder-revisioner bliver strippet,\n"
+" så vil arbejdskataloget automatisk blive opdateret til den nyeste\n"
+" tilgængelige forfader efter operation er færdig."
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+
+msgid "empty revision set"
+msgstr ""
+
+msgid "disable all guards"
+msgstr "slå alle filtre fra"
+
+msgid "list all guards in series file"
+msgstr "vis alle filtre i seriefilen"
+
+msgid "pop to before first guarded applied patch"
+msgstr "fjern rettelser indtil før første filtrerede og anvendte rettelse"
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [TILVALG]... [VAGT]..."
+
+msgid "set or print guarded patches to push"
+msgstr "sæt eller vis filtrerede rettelser der skal skubbes"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+" Brug :hg:`qguard`-kommandoen til at sætte eller vise filtre for en\n"
+" rettelse og brug så qselect til at fortælle mq hvilke filtre der\n"
+" skal bruges. En rettelse vil blive skubbet på stakken hvis den\n"
+" ikke har er nogen filtre tilknyttet eller hvis et positivt filter\n"
+" matcher det aktuelle filter. En rettelse bliver ikke skubbet hvis\n"
+" den har et negativt filter som matcher det aktuelle filter. For\n"
+" eksempel::"
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+" qguard foo.patch -- -stable (negativt filter)\n"
+" qguard bar.patch +stable (positivt filter)\n"
+" qselect stable"
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+" Dette aktiverer \"stable\"-filtret. mq vil springer over foo.patch\n"
+" (fordi den matcher et negativt filter) men skubbe bar.patch (fordi\n"
+" den matcher et positivt filter)."
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+" Uden argumenter vises de aktiverede filtre.\n"
+" Med et argument sættes det aktive filter."
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+" Brug -n/--none for at deaktivere filtre (kræver ingen andre\n"
+" argumenter). Når ingen filtre er aktive, så vil rettelser med\n"
+" positive filtre bliver sprunget over og rettelser med negative\n"
+" filtre blive skubbet."
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+" qselect kan ændre filtreringen af anvendte rettelser. Den fjerner\n"
+" som standard ikke filtrerede rettelser. Brug --pop for at fjerne\n"
+" rettelser indtil der ikke er flere filtrerede rettelser tilbage på\n"
+" stakken. Brug --reapply (som medfører --pop) for at skubbe\n"
+" ufiltrerede rettelser på stakken indtil den nuværende rettelse\n"
+" igen er øverst."
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+" Brug -s/--series for at vise en liste med alle filtre i\n"
+" rettelsesserien (kræver ingen andre argumenter). Brug -v for mere\n"
+" information."
+
+msgid "guards deactivated\n"
+msgstr "deaktiverede filtre\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+"antallet af ufiltrerede og ikke-anvendte rettelser har ændret sig fra %d til "
+"%d\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+"antallet af filtrerede og anvendte rettelser har ændret sig fra %d til %d\n"
+
+msgid "guards in series file:\n"
+msgstr "filtre i seriefilen:\n"
+
+msgid "no guards in series file\n"
+msgstr "ingen filtre i seriefilen\n"
+
+msgid "active guards:\n"
+msgstr "aktive filtre:\n"
+
+msgid "no active guards\n"
+msgstr "ingen aktive filtre\n"
+
+msgid "popping guarded patches\n"
+msgstr "fjerne filtrerede rettelser\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "anvender ufiltrerede rettelser\n"
+
+msgid "finish all applied changesets"
+msgstr "afslut alle anvendte ændringer"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+
+msgid "no revisions specified"
+msgstr "ingen revisioner specificeret"
+
+msgid "list all available queues"
+msgstr ""
+
+msgid "print name of active queue"
+msgstr "udskriv navnet på den aktive kø"
+
+msgid "create new queue"
+msgstr "opret en ny kø"
+
+msgid "rename active queue"
+msgstr "omdøb den aktive kø"
+
+msgid "delete reference to queue"
+msgstr ""
+
+msgid "delete queue, and remove patch dir"
+msgstr ""
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[TILVALG] [KØ]"
+
+msgid "manage multiple patch queues"
+msgstr "håndter flere stakke af rettelser"
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+" only the name of the active queue."
+msgstr ""
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+
+msgid "patches applied - cannot set new queue active"
+msgstr ""
+
+msgid "cannot delete queue that does not exist"
+msgstr ""
+
+msgid "cannot delete currently active queue"
+msgstr ""
+
+msgid " (active)\n"
+msgstr " (aktiv)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr ""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "køen \"%s\" eksisterer allerede"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "kan ikke omdøbe \"%s\" til dets nuværende navn"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr ""
+
+msgid "use --create to create a new queue"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr "kan ikke deponere henover en anvendt mq rettelse"
+
+msgid "source has mq patches applied"
+msgstr "kilden har mq rettelser anvendt"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "mq statusfilen refererer til en ukendt revision %s\n"
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr "Mærkaten %s overstyrer mq rettelse med samme navn\n"
+
+msgid "cannot import over an applied patch"
+msgstr "kan ikke importere henover en anvendt rettelse"
+
+msgid "only a local queue repository may be initialized"
+msgstr ""
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "der er intet Mercurial depot her (.hg ikke fundet)"
+
+msgid "no queue repository"
+msgstr ""
+
+#, python-format
+msgid "%d applied"
+msgstr "%d anvendte"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d ikke-anvendte"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (tom kø)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+
+msgid "mq takes no arguments"
+msgstr "mq tager ingen argumenter"
+
+msgid "operate on patch repository"
+msgstr "arbejd på rettelsesdepot"
+
+msgid "hooks for sending email push notifications"
+msgstr ""
+
+msgid ""
+"This extension let you run hooks sending email notifications when\n"
+"changesets are being pushed, from the sending or receiving side."
+msgstr ""
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``outgoing`` hooks\n"
+"are run by the changesets receiver while the ``outgoing`` one is for\n"
+"the sender::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+"Now the hooks are running, subscribers must be assigned to\n"
+"repositories. Use the ``[usersubs]`` section to map repositories to a\n"
+"given email or the ``[reposubs]`` section to map emails to a single\n"
+"repository::"
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root. The subscriptions can be defined in their own file and\n"
+"referenced with::"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+
+msgid ""
+"Alternatively, they can be added to Mercurial configuration files by\n"
+"setting the previous entry to an empty value."
+msgstr ""
+
+msgid ""
+"At this point, notifications should be generated but will not be sent until "
+"you\n"
+"set the ``notify.test`` entry to ``False``."
+msgstr ""
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+
+msgid ""
+"notify.sources\n"
+" Space separated list of change sources. Notifications are sent only\n"
+" if it includes the incoming or outgoing changes source. Incoming\n"
+" sources can be ``serve`` for changes coming from http or ssh,\n"
+" ``pull`` for pulled changes, ``unbundle`` for changes added by\n"
+" :hg:`unbundle` or ``push`` for changes being pushed\n"
+" locally. Outgoing sources are the same except for ``unbundle`` which\n"
+" is replaced by ``bundle``. Default: serve."
+msgstr ""
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+" references repositories with their absolute path. ``notify.strip`` let "
+"you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+
+msgid ""
+"notify.domain\n"
+" If subscribers emails or the from email have no domain set, complete them\n"
+" with this value."
+msgstr ""
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as incoming hook, override ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as outgoing hook, override ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as changegroup hook, override\n"
+" ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, -1 to include all of it. Default: 300."
+msgstr ""
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in emails subject line. Default: 67."
+msgstr ""
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+
+msgid ""
+"If set, the following entries will also be used to customize the "
+"notifications:"
+msgstr ""
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in generated email "
+"content."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+" Root repository browsing URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d nye ændringer"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: sender %d abonnenter %d ændringer\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"ændringer (afkortet fra %d til %d linier):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"ændringer (%d linier):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr "notify: udelader notifikation for sammenføjning %d:%s\n"
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRSX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+" [pager]\n"
+" quiet = True"
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+" [pager]\n"
+" ignore = version, help, update"
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr ""
+"hvornår der skal farvelægges (boolks værdi, \"always\", \"auto\" eller "
+"\"never\")"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+msgid "send patches as attachments"
+msgstr "send rettelser som vedhæftede filer"
+
+msgid "send patches as inline attachments"
+msgstr "send rettelser som integreret tekst"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "ask for confirmation before sending"
+msgstr ""
+
+msgid "add diffstat output to messages"
+msgstr "tilføj diffstat resultat til beskeder"
+
+msgid "use the given date as the sending date"
+msgstr "brug den givne dato som afsendelsesdatoen"
+
+msgid "use the given file as the series description"
+msgstr "brug den givne fil som seriens beskrivelse"
+
+msgid "email address of sender"
+msgstr "afsenderadresse"
+
+msgid "print messages that would be sent"
+msgstr "udskriv beskeder som ville være blevet sendt"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "skriv beskeder til mbox-fil i stedet for at sende dem"
+
+msgid "email addresses replies should be sent to"
+msgstr "adresser som svar skal sendes til"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "emne for den første besked (intro eller en enkelt rettelse)"
+
+msgid "message identifier to reply to"
+msgstr "message identifier der skal svares på"
+
+msgid "flags to add in subject prefixes"
+msgstr "flag som skal tilføjes i emne-præfixer"
+
+msgid "email addresses of recipients"
+msgstr "adresser på modtagere"
+
+msgid "omit hg patch header"
+msgstr "undlad hg rettelseshoved"
+
+msgid "send changes not found in the target repository"
+msgstr "send ændringer som ikke findes i måldepotet"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "send de ændringer målet mangler som et binært bundt"
+
+msgid "name of the bundle attachment file"
+msgstr "navn på det vedhæftede bundt"
+
+msgid "a revision to send"
+msgstr "en revision der skal sendes"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr "kør selv hvis fjerndepotet er urelateret (med -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr "send en introduktionsmail for en enkelt rettelse"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [TILVALG]... [MÃ…L]..."
+
+msgid "send changesets by email"
+msgstr ""
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "sammenligner med %s\n"
+
+msgid "no changes found\n"
+msgstr "fandt ingen ændringer\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "angiv mindst en ændring med -r eller -o"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+"--outgoing tilvalget er altid aktivt med --bundle; undlad at angive --"
+"outgoing igen"
+
+msgid "too many destinations"
+msgstr "for mange destinationer"
+
+msgid "use only one form to specify the revision"
+msgstr "brug un en form til at angive revisionen"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Skriv introduktionsbeskeden for rettelsesserien."
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr "Denne rettelsesserie består af %d rettelser."
+
+msgid "no recipient addresses provided"
+msgstr ""
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"Endeligt sammendrag:"
+
+msgid "are you sure you want to send (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+msgid "patchbomb canceled"
+msgstr ""
+
+msgid "Displaying "
+msgstr "Viser "
+
+msgid "Writing "
+msgstr "Skriver "
+
+msgid "writing"
+msgstr "skriver"
+
+msgid "Sending "
+msgstr "Sender "
+
+msgid "sending"
+msgstr "sender"
+
+msgid "show progress bars for some actions"
+msgstr ""
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+
+msgid "The following settings are available::"
+msgstr ""
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr ""
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr ""
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr ""
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr ""
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr ""
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr ""
+
+#, python-format
+msgid "%d %s/sec"
+msgstr ""
+
+msgid "command to delete untracked files from the working directory"
+msgstr "kommando til at slette filer fra arbejdskataloget som ikke følges"
+
+msgid "abort if an error occurs"
+msgstr "afbryd hvis der opstår en fejl"
+
+msgid "purge ignored files too"
+msgstr "udrens også ignorerede filer"
+
+msgid "print filenames instead of deleting them"
+msgstr "udskriv filnavne i stedet for at slette dem"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr "afslut filnavne med NUL, for brug med xargs (medfører -p/--print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [TILVALG]... [KATALOG]..."
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s kan ikke slettes"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "advarsel: %s\n"
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr "Fjerner fil %s\n"
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr "Fjerner katalog %s\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "kommando til at flytte revisioner til en anden forfader"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"Denne udvidelse lader dig omplante deponeringer i et eksisterende\n"
+"Mercurial depot."
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"For mere information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+msgid "rebase from the specified changeset"
+msgstr ""
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+
+msgid "rebase these revisions"
+msgstr ""
+
+msgid "rebase onto the specified changeset"
+msgstr ""
+
+msgid "collapse the rebased changesets"
+msgstr ""
+
+msgid "use text as collapse commit message"
+msgstr "brug tekst som deponeringsbesked"
+
+msgid "invoke editor on commit messages"
+msgstr ""
+
+msgid "read collapse commit message from file"
+msgstr "læs deponeringsbeskeden fra fil"
+
+msgid "keep original changesets"
+msgstr "behold de originale ændringer"
+
+msgid "keep original branch names"
+msgstr "behold originale grennavne"
+
+msgid "force detaching of source from its original branch"
+msgstr ""
+
+msgid "specify merge tool"
+msgstr "angiv sammenføjningsværktøj"
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [tilvalg]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+
+msgid "message can only be specified with collapse"
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr "abort og continue kan ikke angives samtidig"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "continue eller abort kan ikke angives samtidig med collapse"
+
+msgid "cannot use detach with continue or abort"
+msgstr "continue eller abort kan ikke angives samtidig med detach"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "abort og continue tillader ikke at der angives revisioner"
+
+msgid "tool option will be ignored\n"
+msgstr ""
+
+msgid "cannot specify both a source and a base"
+msgstr "man kan ikke angive både en kilde og en basis"
+
+msgid "cannot specify both a revision and a base"
+msgstr "man kan ikke angive både en revision og en basis"
+
+msgid "cannot specify both a revision and a source"
+msgstr "man kan ikke angive både en revision og en kilde"
+
+msgid "detach requires a revision to be specified"
+msgstr "der skal angives en revision til detach"
+
+msgid "cannot specify a base with detach"
+msgstr "kan ikke angive --rev og --change på samme tid"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+
+msgid "use --keep to keep original changesets"
+msgstr "brug --keep for at behold de originale ændringer"
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot collapse multiple named branches"
+msgstr ""
+
+msgid "rebasing"
+msgstr ""
+
+msgid "changesets"
+msgstr "ændringer"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr ""
+"uløste konflikter (se først hg resolve og dernæst hg rebase --continue)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "ingen ændringer, revision %d sprunget over\n"
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "sprang %d revisioner over\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr "kan ikke bruge revision %d som basis, resultatet ville få 3 forældre"
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "no matching revisions"
+msgstr ""
+
+msgid "can't rebase multiple roots"
+msgstr ""
+
+msgid "source is ancestor of destination"
+msgstr "kilden er forfader til destination"
+
+msgid "--tool can only be used with --rebase"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "specify merge tool for rebase"
+msgstr ""
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr "ignorer blanktegn når linier sammenlignes"
+
+msgid "ignore changes in the amount of white space"
+msgstr "ignorer ændringer i mængden af blanktegn"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "ignorer ændringer hvis linier alle er blanke"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "dette ændrer en binær fil (alt eller intet)\n"
+
+msgid "this is a binary file\n"
+msgstr "dette er en binær fil\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "%d stumper, %d linjer ændret\n"
+
+msgid "[Ynsfdaq?]"
+msgstr "[Jnsofai?]"
+
+msgid "&Yes, record this change"
+msgstr "&Ja, optag denne ændring"
+
+msgid "&No, skip this change"
+msgstr "&Nej, spring denne ændring over"
+
+msgid "&Skip remaining changes to this file"
+msgstr "&Spring tilbageværende ændringer over i denne fil"
+
+msgid "Record remaining changes to this &file"
+msgstr "&Optag tilbageværende ændringer i denne fil"
+
+msgid "&Done, skip remaining changes and files"
+msgstr "&Færdig, spring tilbageværende ændringer og filer over"
+
+msgid "Record &all changes to all remaining files"
+msgstr "Optag &alle ændringer i alle tilbageværende filer"
+
+msgid "&Quit, recording no changes"
+msgstr "Afbryd, optag &ingen ændringer"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "user quit"
+msgstr "brugeren afbrød"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "undersøg ændringer i %s?"
+
+msgid " and "
+msgstr " og "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "optag denne ændring i %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "optag ændring %d/%d i %r?"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [TILVALG]... [FIL]..."
+
+msgid "interactively select changes to commit"
+msgstr "vælg ændringer interaktivt til deponering"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" Hvis en liste af filer er udeladt, så vil alle ændringer\n"
+" rapporteret af :hg:`status` være kandidater til at blive optaget."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Du vil blive spurgt om hvorvidt der skal optages ændringer for\n"
+" hver ændret fil. For filer med flere ændringer spørges der til\n"
+" hver ændring. For hvert spørgsmål er der følgende mulige svar::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+" j - optag denne ændring\n"
+" n - spring denne ændring over"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - spring tilbageværende ændringer over i denne fil\n"
+" o - optag tilbageværende ændringer i denne fil"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" f - færdig, spring tilbageværende ændringer og filer over\n"
+" a - optag alle ændringer i alle tilbageværende filer\n"
+" i - afbryd og optag ingen ændringer"
+
+msgid " ? - display help"
+msgstr " ? - vis hjælp"
+
+msgid " This command is not available when committing a merge."
+msgstr ""
+
+msgid "interactively record a new patch"
+msgstr "vælg ændringer interaktivt til deponering"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+" Se :hg:`help qnew` & :hg:`help record` for mere information.\n"
+" "
+
+msgid "'mq' extension not loaded"
+msgstr "'mq' udvidelsen er ikke indlæst"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "kører ikke interaktivt, brug %s i stedet"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr ""
+"kan ikke deponere en sammenføjning partielt (brug i stedet \"hg commit\")"
+
+msgid "no changes to record\n"
+msgstr "ingen ændringer at optage\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [TILVALG]... RETTELSE [FIL]..."
+
+msgid "interactively select changes to refresh"
+msgstr ""
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+msgid "hardlinks are not supported on this system"
+msgstr "Hårde lænker er ikke supporteret på dette system"
+
+msgid "must specify local origin repository"
+msgstr ""
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "kæder %s og %s sammen igen\n"
+
+msgid "there is nothing to relink\n"
+msgstr "der er ikke noget at sammenlænke\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr ""
+
+msgid "collecting"
+msgstr "opsamler"
+
+msgid "files"
+msgstr "filer"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr "opsamlede %d kandidatfiler\n"
+
+msgid "source and destination are on different devices"
+msgstr "kilden og destinationen er på forskellige enheder"
+
+msgid "pruning"
+msgstr "beskærer"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr "beskåret til %d filer der potentielt kan sammenkædes\n"
+
+msgid "relinking"
+msgstr "sammenkæder"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr "[KILDE]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+
+msgid "After that you can use it like::"
+msgstr ""
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr "del en fælles historie mellem flere arbejdsbiblioteker"
+
+msgid "create a new shared repository"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "convert a shared repository to a normal one"
+msgstr ""
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+
+msgid "this is not a shared repo"
+msgstr "dette er ikke et delt depot"
+
+msgid "do not create a working copy"
+msgstr "opret ikke en arbejdskopi"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] KILDE [DESTINATION]"
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "springer allerede anvendt revision %s over\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr "springer sammenføjning over: %s:%s\n"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr "%s sammenføjet ved %s\n"
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr "%s transplanteret til %s\n"
+
+#, python-format
+msgid "filtering %s\n"
+msgstr "filtrerer %s\n"
+
+msgid "filter failed"
+msgstr "filter fejlede"
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: tom ændring"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr "ret sammenføjningen og kør hg transplant --continue"
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr "%s transplanteret som %s\n"
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr "deponering fejlede"
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr "filtrer ødelagte ændringer (ingen bruger eller dato)"
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "no such option\n"
+msgstr "tilvalget findes ikke\n"
+
+msgid "pull patches from REPO"
+msgstr "hiv rettelser fra DEPOT"
+
+msgid "BRANCH"
+msgstr "GREN"
+
+msgid "pull patches from branch BRANCH"
+msgstr "hiv rettelser fra gren GREN"
+
+msgid "pull all changesets up to BRANCH"
+msgstr "his alle ændringer indtil GREN"
+
+msgid "skip over REV"
+msgstr "spring over REV"
+
+msgid "merge at REV"
+msgstr "sammenføj ved REV"
+
+msgid "append transplant info to log message"
+msgstr "tilføj information on transplantationen i deponeringsbeskeden"
+
+msgid "continue last transplant session after repair"
+msgstr "fortsæt sidste transplantation efter reparation"
+
+msgid "filter changesets through command"
+msgstr "filtrer ændringer igennem kommando"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr "hg transplant [-s DEPOT] [-b GREN [-a]] [-p REV] [-m REV] [REV]..."
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr " (transplanted from CHANGESETHASH)"
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REVISION --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr "--continue er inkompatibelt med branch, all eller merge"
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr "--all er inkompatibelt med en revisionsliste"
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr "udestående udeponeret sammenføjning"
+
+msgid "outstanding local changes"
+msgstr "udestående lokale ændringer"
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+" [win32mbcs]\n"
+" encoding = sjis"
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr "[win32mbcs] konvertering af filnavn fejlede med %s tegnkodning\n"
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr "[win32mbcs] kan ikke aktiveres på denn platform.\n"
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+"Forsøg på at deponere eller skubbe tekstfiler som bruge %s linieskift\n"
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr "i %s: %s\n"
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+"win32text er forældet: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+msgid "archive prefix contains illegal components"
+msgstr "depotpræfix indeholder ugyldige komponenter"
+
+msgid "archiving"
+msgstr "arkiverer"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr ""
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr "gren %s blev ikke fundet"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "opdaterer bogmærke %s\n"
+
+#, python-format
+msgid "not updating divergent bookmark %s\n"
+msgstr "opdaterer ikke divergerende bogmærke %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "leder efter ændrede bogmærker\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "fandt ingen ændrede bogmærker\n"
+
+msgid "unknown parent"
+msgstr "ukendt forælder"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "integritetstjek fejlede på %s:%d"
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "stream stoppede uventet (fik %d bytes, forventede %d)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "ugyldigt længde på chunk: %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: ej et Mercurial bundt"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: bundtet har ukendt version %s"
+
+msgid "empty username"
+msgstr "tomt brugernavn"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "brugernavn %s indeholder et linieskift"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "navnet '%s' er reserveret"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "udeponerede ændringer i underdepot %s"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "tilvalgene --message og --logfile udelukker hinanden"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "kan ikke læse deponeringsbesked '%s': %s"
+
+msgid "limit must be a positive integer"
+msgstr "grænsen skal være et positivt heltal"
+
+msgid "limit must be positive"
+msgstr "grænsen skal være positiv"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "ugyldig formatspecifikation '%%%s' i output filnavn"
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "kan ikke angive --changelog og --manifest på samme tid"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr ""
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr "ugyldige parametre"
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' blev ikke fundet"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: kopierer ikke - filen er ikke versionsstyret\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: kopierer ikke - filen er markeret til sletning\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: overskriver ikke - %s kolliderer med %s\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: overskriver ikke - filen eksisterer\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: slettet i arbejdskopien\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: kan ikke kopiere - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "flytter %s til %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "kopierer %s til %s\n"
+
+msgid "no source or destination specified"
+msgstr "ingen kilde eller destination angivet"
+
+msgid "no destination specified"
+msgstr "ingen destination angivet"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+"destinationen skal være en eksisterende mappe når der angivet flere kilder"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "destinationen %s er ikke en mappe"
+
+msgid "(consider using --after)\n"
+msgstr "(overvej at bruge --after)\n"
+
+msgid "child process failed to start"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "ændring: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "gren: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "bogmærke: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "mærkat: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "forælder: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifest: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "bruger: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "dato: %s\n"
+
+msgid "files+:"
+msgstr "filer+:"
+
+msgid "files-:"
+msgstr "filer-:"
+
+msgid "files:"
+msgstr "filer:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "filer: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "kopier: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "ekstra: %s=%s\n"
+
+msgid "description:\n"
+msgstr "beskrivelse:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "uddrag: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr "Fandt revision %s fra %s\n"
+
+msgid "revision matching date not found"
+msgstr "fandt ingen revision på datoen"
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "kan ikke følge ikke-eksisterende fil: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr "kan kun følge kopier/omdøbninger for eksplicitte filnavne"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "tilføjer %s\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "springer manglende underdepot over: %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+"HG: Skriv deponeringsbesked. Linier som starter med 'HG:' bliver fjernet."
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: Efterlad beskeden tom for at afbryde deponeringen."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: bruger: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: gren-sammenføjning"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: gren '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: underdepot %s"
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: tilføjet %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: ændret %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: fjernet %s"
+
+msgid "HG: no files changed"
+msgstr "HG: ingen filændringer"
+
+msgid "empty commit message"
+msgstr "tom deponeringsbesked"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+
+msgid "DIR"
+msgstr ""
+
+msgid "change working directory"
+msgstr "skift arbejdskatalog"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr ""
+
+msgid "suppress output"
+msgstr "undertryk output"
+
+msgid "enable additional output"
+msgstr "aktiver yderlig output"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr "angiv eller overskriv tilvalg (brug 'sektion.navn=værdi')"
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr "aktiver fejlsøgningsinformation"
+
+msgid "start debugger"
+msgstr "start fejlsøgningsprogram"
+
+msgid "set the charset encoding"
+msgstr "angiv tegnkodningen"
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr "angiv tegnkodningstilstand"
+
+msgid "always print a traceback on exception"
+msgstr "udskriv altid traceback ved fejlsituationer"
+
+msgid "time how long the command takes"
+msgstr "tag tid på hvor lang tid kommandoen tager"
+
+msgid "print command execution profile"
+msgstr ""
+
+msgid "output version information and exit"
+msgstr "udskriv versionsinformation og afslut"
+
+msgid "display help and exit"
+msgstr "vis hjælp og afslut"
+
+msgid "do not perform actions, just print output"
+msgstr "udfør ingen handlinger, udskriv kun outputttet"
+
+msgid "specify ssh command to use"
+msgstr "specificer ssh kommandoen som skal bruges"
+
+msgid "specify hg command to run on the remote side"
+msgstr "angiv hg kommando som skal udføres på fjernsystemet"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+
+msgid "PATTERN"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr "inkluder navne som matcher det givne mønster"
+
+msgid "exclude names matching the given patterns"
+msgstr "ekskluder navne som matcher det givne mønster"
+
+msgid "use text as commit message"
+msgstr "brug tekst som deponeringsbesked"
+
+msgid "read commit message from file"
+msgstr "læs deponeringsbeskeden fra fil"
+
+msgid "record the specified date as commit date"
+msgstr "noter den angivne dato som integrationsdato"
+
+msgid "record the specified user as committer"
+msgstr ""
+
+msgid "STYLE"
+msgstr ""
+
+msgid "display using template map file"
+msgstr "vis med skabelon-fil"
+
+msgid "display with template"
+msgstr "vis med skabelon"
+
+msgid "do not show merges"
+msgstr "vis ikke sammenføjninger"
+
+msgid "output diffstat-style summary of changes"
+msgstr ""
+
+msgid "treat all files as text"
+msgstr "behandl alle filer som tekst"
+
+msgid "omit dates from diff headers"
+msgstr "inkluder ikke datoer i diff-hoveder"
+
+msgid "show which function each change is in"
+msgstr "vis hvilken funktion hver ændring er i"
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "number of lines of context to show"
+msgstr "antal linier kontekst der skal vises"
+
+msgid "SIMILARITY"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "gæt omdøbte filer ud fra enshed (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "fortsæt rekursivt ind i underdepoter"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[TILVALG]... [FIL]..."
+
+msgid "add the specified files on the next commit"
+msgstr "tilføj de angivne filer ved næste deponering"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr " Opskriv filer til at blive versionsstyret og tilføjet til depotet."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Filerne vil bliver tilføjet til depotet ved næste deponering. For\n"
+" at omgøre en tilføjelse før det, se :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr ""
+" Hvis der ikke er angivet nogen navne tilføjes alle filer til\n"
+" depotet."
+
+msgid " .. container:: verbose"
+msgstr " .. container:: verbose"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+
+msgid "add all new files, delete all missing files"
+msgstr "tilføj alle nye filer, fjern alle manglende filer"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr " Tilføj alle nye filer og fjern alle manglende filer fra depotet."
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" Nye filer bliver ignoreret hvis de matcher et af mønstrene i\n"
+" ``.hgignore``. Som ved add, så træder disse ændringer først i\n"
+" kræft ved næste commit."
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed."
+msgstr ""
+" Brug -s/--similarity tilvalget for at opdage omdøbte filer. Med en\n"
+" parameter større end 0 bliver hver fjernet fil sammenlignet med\n"
+" enhver tilføjet fil og filer der er tilstrækkelig ens bliver\n"
+" opført som omdøbte. Dette tilvalg tager et procenttal mellem 0\n"
+" (slået fra) og 100 (filer skal være identiske) som parameter. At\n"
+" opdage omdøbninger på denne måde kan være dyrt. Brug :hg:`status\n"
+" -C` for at kontrollere hvilke filer der blev markeret som omdøbt."
+
+msgid "similarity must be a number"
+msgstr "lighedsgrad skal være et tal"
+
+msgid "similarity must be between 0 and 100"
+msgstr "lighedsgrad skal være mellem 0 og 100"
+
+msgid "annotate the specified revision"
+msgstr "annotér den angivne revision"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "følg kopier/omdøbninger og vis filnavnet (FORÆLDET)"
+
+msgid "don't follow copies and renames"
+msgstr "følg ikke kopier og omdøbninger"
+
+msgid "list the author (long with -v)"
+msgstr "vis forfatteren (lang med -v)"
+
+msgid "list the filename"
+msgstr "vis filnavnet"
+
+msgid "list the date (short with -q)"
+msgstr "vis datoen (kort med -q)"
+
+msgid "list the revision number (default)"
+msgstr "vis revisionsnummeret (standard)"
+
+msgid "list the changeset"
+msgstr "vis ændringen"
+
+msgid "show line number at the first appearance"
+msgstr "vil linienummeret for den første forekomst"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FIL..."
+
+msgid "show changeset information by line for each file"
+msgstr "vis information om ændringer pr linie for hver fil"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+" Vis ændringer i filer ved at vise revisions ID'et som er\n"
+" ansvarligt for hver linie"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+" Denne kommando er nyttig til at opdage hvornår en ændring blev\n"
+" foretaget og af hvem."
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" Uden -a/--text tilvalget vil annotate undgå at behandle filer som\n"
+" den detekterer som binære. Med -a vil annotate generere en\n"
+" annotering alligevel, selvom resultatet sandsynligvis vil være\n"
+" hverken brugbart eller ønskværdigt."
+
+msgid "at least one filename or pattern is required"
+msgstr "kræver mindst et filnavn eller mønster"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr "brug af -l kræver mindst en af -n/-c"
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: binær fil\n"
+
+msgid "do not pass files through decoders"
+msgstr "kør ikke filerne igennem dekodere"
+
+msgid "directory prefix for files in archive"
+msgstr "katalogpræfiks for filerne i arkivet"
+
+msgid "PREFIX"
+msgstr ""
+
+msgid "revision to distribute"
+msgstr "revision som skal distribueres"
+
+msgid "type of distribution to create"
+msgstr "distributionstype der skal oprettes"
+
+msgid "[OPTION]... DEST"
+msgstr "[TILVALG]... MÃ…L"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr ""
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+
+msgid " Examples:"
+msgstr " Eksempler:"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr ""
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr ""
+
+msgid " - create a tarball excluding .hg files::"
+msgstr ""
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr ""
+
+msgid " Valid types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr "intet arbejdskatalog: angive venligst en revision"
+
+msgid "repository root cannot be destination"
+msgstr "depotets rod kan ikke bruges som destination"
+
+msgid "cannot archive plain files to stdout"
+msgstr "flade filer kan ikke arkiveres til standarduddata"
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr ""
+
+msgid "revision to backout"
+msgstr "revision som skal bakkes ud"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[TILVALG]... [-r] REV"
+
+msgid "reverse effect of earlier changeset"
+msgstr "omgør effekten af tidligere ændringer"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr "angiv venligst kun en revision"
+
+msgid "please specify a revision to backout"
+msgstr "angiv venligst en revision der skal omgøres"
+
+msgid "cannot backout change on a different branch"
+msgstr "kan ikke omgøre en ændring på en anden gren"
+
+msgid "cannot backout a change with no parents"
+msgstr "kan ikke omgøre en ændring uden forældre"
+
+msgid "cannot backout a merge changeset"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s er ikke forælder til %s"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr "kan ikke bruge --parent på en ændringer som ikke er en sammenføjning"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "ændring %s bakker ændring %s ud\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "sammenføjer med ændring %s\n"
+
+msgid "reset bisect state"
+msgstr "nulstil tilstand for halvering"
+
+msgid "mark changeset good"
+msgstr "marker ændring som god"
+
+msgid "mark changeset bad"
+msgstr "marker ændring som dårlig"
+
+msgid "skip testing changeset"
+msgstr "spring testen af denne ændring over"
+
+msgid "extend the bisect range"
+msgstr "udvid halveringsområdet"
+
+msgid "use command to check changeset state"
+msgstr "brug kommando for at kontrollere tilstanden af ændringen"
+
+msgid "do not update to target"
+msgstr "undlad at opdatere til målet"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c KOMMANDO] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr ""
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad."
+msgstr ""
+
+msgid " Some examples:"
+msgstr " Nogle eksempler::"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+
+msgid ""
+" - advance the current bisection by marking current revision as good "
+"or\n"
+" bad::"
+msgstr ""
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+
+msgid " - forget the current bisection::"
+msgstr ""
+
+msgid " hg bisect --reset"
+msgstr ""
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr ""
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr " hg log -r \"bisect(pruned)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr ""
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr ""
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr ""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr ""
+
+msgid "The first good revision is:\n"
+msgstr "Den første gode revision er:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "Den første dårlige revision er:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"På grund af oversprungne revisioner kan den første gode revision være en "
+"hvilken som helst af:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"På grund af oversprungne revisioner kan den første dårlige revision være en "
+"hvilken som helst af:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "kan ikke halvere (kender ingen gode revisioner)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "kan ikke halvere (kender ingen dårlige revisioner)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(formen 'hg bisect <kommando>' er forældet)\n"
+
+msgid "incompatible arguments"
+msgstr "inkompatible argumenter"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "kunne ikke køre %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s dræbt"
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "Ændring %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "Udvider søgning til ændring %d:%s\n"
+
+msgid "nothing to extend"
+msgstr "kan ikke udvidde"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "Tester ændring %d:%s (%d ændringer tilbage, ~%d test)\n"
+
+msgid "force"
+msgstr "gennemtving"
+
+msgid "delete a given bookmark"
+msgstr "slet et givent bogmærke"
+
+msgid "rename a given bookmark"
+msgstr "omdøb et givet bogmærke"
+
+msgid "do not mark a new bookmark active"
+msgstr ""
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NAVN] [-r REV] [NAVN]"
+
+msgid "track a line of development with movable markers"
+msgstr ""
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in :hg:`merge` and\n"
+" :hg:`update` to merge and update respectively to a given bookmark."
+msgstr ""
+" Bogmærker er pegepinde til bestemte ændringer og pegepindene\n"
+" flytter sig når man deponerer nye ændringer. Bogmærkerne er\n"
+" lokale. De kan omdøbes, kopieres og slettes. Det er muligt at\n"
+" bruge navne på bogmærker i :hg:`merge` og :hg:`update` for\n"
+" respektivt at sammenføje eller opdatere til det givne bogmærke."
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" Du kan bruge :hg:`bookmark NAVN` for at sætte et bogmærke på\n"
+" arbejdskatalogets forælderrevision med det givne navn. Hvis du\n"
+" specificerer en revision med -r REV (hvor REV kan være et\n"
+" eksisterende bogmærke), så bliver bogmærket tildelt denne\n"
+" revision."
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled.\n"
+" "
+msgstr ""
+" Bogmærker kan skubbes og hives mellem depoter (se :hg:`help push`\n"
+" og :hg:`help pull`). Dette kræver at både lokal- og fjerndepotet\n"
+" understøtter bogmærker. For versioner før 1.8 betyder det at\n"
+" bookmark-udviddelsen skal være slået til.\n"
+" "
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "mærkaten '%s' eksisterer ikke"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "mærkaten '%s' eksisterer allerede (brug -f for at gennemtvinge)"
+
+msgid "new bookmark name required"
+msgstr "nyt bogmærkenavn påkrævet"
+
+msgid "bookmark name required"
+msgstr "bogmærkenavn påkrævet"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "bogmærkenavn kan ikke indeholde linieskift"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "bogmærkenavne kan ikke bestå udelukkende af tomrum"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "et bogmærke kan ikke hedde det samme som en eksisterende gren"
+
+msgid "no bookmarks set\n"
+msgstr "der er ingen bogmærker\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "sæt grennavnet selv hvis det overskygger en eksisterende gren"
+
+msgid "reset branch name to parent branch name"
+msgstr "nulstil grennavnet til forældre-grennavnet"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NAVN]"
+
+msgid "set or show the current branch name"
+msgstr "angiv eller vis navnet på den aktuelle gren"
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" Uden noget argument vises navnet på den nuværende gren. Med et\n"
+" argument angives arbejdskatalogets grennavn (grenen eksisterer\n"
+" ikke i depotet før næste deponering). Det anbefales at den primære\n"
+" udvikling foretages på 'default' grenen."
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" Med mindre -f/--force bruges, så vil branch ikke lade dig bruge et\n"
+" grennavn som allerede eksisterer, selv hvis det er inaktivt."
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" Brug -C/--clean for at nulstille arbejdskatalogs gren til samme\n"
+" gren dets forældre-ændring og derved negere end tidligere ændring."
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" Brug kommandoen 'hg update' for at skifte til en eksisterende\n"
+" gren. Brug 'hg commit --close-branch' for at markere denne gren\n"
+" som lukket."
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent. Use :hg:`bookmark` to create a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "nulstil arbejdskataloget til gren %s\n"
+
+msgid "a branch of the same name already exists"
+msgstr "en gren af samme navn eksisterer allerede"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "brug 'hg update' for at skifte til den"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "markerede arbejdskataloget som gren %s\n"
+
+msgid "show only branches that have unmerged heads"
+msgstr "vil kun grene som har usammenføjne hoveder"
+
+msgid "show normal and closed branches"
+msgstr "vis normale og lukkede grene"
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "list repository named branches"
+msgstr "vis navngivne grene i depotet"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" Viser depotets navngivne grene og indikerer hvilke der er\n"
+" inaktive. Hvis -c/--closed er angivet, så vises lukkede grene også\n"
+" (se :hg:`commit --close-branch`)."
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" Hvis -a/--active er angivet, da vises kun aktive grene. En gren er\n"
+" anses for at være aktiv hvis den indeholder depothoveder."
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+" Brug kommandoen :hg:`update` for at skifte til en eksisterende\n"
+" gren."
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+
+msgid " (closed)"
+msgstr " (lukket)"
+
+msgid " (inactive)"
+msgstr " (inaktiv)"
+
+msgid "run even when the destination is unrelated"
+msgstr "kør selv hvis fjerndepotet er urelateret"
+
+msgid "a changeset intended to be added to the destination"
+msgstr ""
+
+msgid "a specific branch you would like to bundle"
+msgstr "en bestemt gren som du gerne vil pakke sammen"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FIL [MÃ…L]"
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "--base er inkompatibelt med at angive en destination"
+
+msgid "unknown bundle type specified with --type"
+msgstr "ukendt bundt-type angivet med --type"
+
+msgid "print output to file with formatted name"
+msgstr ""
+
+msgid "print the given revision"
+msgstr "udskriv den angivne revision"
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr "[TILVALG]... FIL..."
+
+msgid "output the current or given revision of files"
+msgstr "udskriv den aktuelle eller en given revision af filer"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Udskriver de angivne filer som de så ud ved den givne revision.\n"
+" Hvis der ikke angves en revision, så bruges forældre-revisionen\n"
+" til arbejdskataloget, eller spidsen hvis der ikke er hentet noget\n"
+" arbejdskatalog."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" Output kan gemmes i en fil hvis navn angives med et formatstreng.\n"
+" Reglerne for formatteringen er de samme som for export-kommandoen\n"
+" med følgende tilføjelser:"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: grundnavn for filen som udskrives\n"
+" :``%d``: katalognavn for filen som blvier udskrevet\n"
+" eller '.' hvis filen er i katalogets rod\n"
+" :``%p``: rod-relativ sti for filen som bliver udskrevet"
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "klonen vil indeholde et tomt arbejdsbibliotek (kun et depot)"
+
+msgid "revision, tag or branch to check out"
+msgstr "revision, mærkat eller gren som skal hentes ud"
+
+msgid "include the specified changeset"
+msgstr "inkluder den angivne revision"
+
+msgid "clone only the specified branch"
+msgstr "klon kun den angivne gren"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[TILVALG]... KILDE [MÃ…L]"
+
+msgid "make a copy of an existing repository"
+msgstr "lav en kopi af et eksisterende depot"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Lav en kopi af et eksisterende depot i en ny mappe."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" Hvis der ikke angivet et navn til destinationen, så bruges\n"
+" grundnavnet for kilden."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" Placeringen af kilden tilføjes til det nye depots ``.hg/hgrc`` fil\n"
+" som den nye standard for fremtidige kald til :hg:`pull`."
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+
+#, fuzzy
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" Af effektivitetsgrunde bruges hårde lænker ved kloning når kilden\n"
+" og destinationen er på det samme filsystem (bemærk at dette kun\n"
+" gælder for depotdata og ikke for de arbejdsbiblioteket). Nogle\n"
+" filsystemer, såsom AFS, implementerer ikke hårde lænker korrekt,\n"
+" men rapporterer ingen fejl. I disse tilfælde skal --pull bruges\n"
+" for at undgå hårde lænker."
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" I nogle tilfælde kan du klone depoter og arbejdsbiblioteket og\n"
+" bruge hårde lænker til alle filer med ::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al DEPOT DEPOTKLON"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" Dette er den hurtigste måde at klone på, men det er ikke altid\n"
+" sikkert. Operationen er ikke atomisk (det er op til dig at sikre\n"
+" at DEPOT ikke bliver modificeret undervejs) og du skal selv\n"
+" sørge for at din tekstbehandler bryder hårde lænker (Emacs og de\n"
+" fleste Linux Kernel værktøjer gør det). Dette er desuden ikke\n"
+" kompatibelt med visse udvidelser som placerer deres metadata\n"
+" under .hg mappen, såsom mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial vil opdatere arbejdsbiblioteket til den første brugbare\n"
+" revision fra denne liste:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) null, hvis -U tilvalget er brugt eller hvis kildedepotet ikke\n"
+" indeholder nogen ændringer\n"
+" b) den første forælder til kildedepotets arbejdsbiblioteket hvis\n"
+" -u . er brugt og hvis kildedepotet er lokalt\n"
+" c) ændringer specificeret med -u (hvis det er navnet på en gren,\n"
+" så tolkes det som denne grens hoved)\n"
+" d) ændringen angivet med -r\n"
+" e) hovedet med størst revisionsnummer angivet med -b\n"
+" f) hovedet med størst revisionsnummer angivet med url#gren\n"
+" syntaksen\n"
+" g) hovedet med størst revisionsnummer på default grenen\n"
+" h) revisionen med størst revisionsnummer"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr ""
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr ""
+
+msgid " hg clone project/ project-feature/"
+msgstr ""
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr ""
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr ""
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr ""
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr ""
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr ""
+
+msgid " - clone (and track) a particular named branch::"
+msgstr ""
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr ""
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " Se :hg:`help urls` for mere information om angivelse af URLer."
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "man kan ikke angive både --noupdate og --updaterev"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr "marker nye/manglende filer som tilføjede/fjernede før deponering"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "marker en gren som lukket, skuler den fra listen af grene"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "lægger de specificerede filer eller alle udestående ændringer i depot"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Deponerer ændringer i de angivne filer ind i depotet. Dette er en\n"
+" lokal operation, i modsætning til et centraliseret SCM. Se\n"
+" :hg:`push` for en måde til aktivt distribuere dine ændringer."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Hvis en liste af filer udelades vil alle ændringer rapporteret af\n"
+" :hg:`status` blive deponeret."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Hvis du deponerer resultatet af en sammenføjning, undlad da at\n"
+" angive filnavne eller -I/-X filtre."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+
+msgid "can only close branch heads"
+msgstr "kan kun lukke grenhoveder"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr "ingen ændringer\n"
+
+msgid "created new head\n"
+msgstr "lavede et nyt hoved\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "genåbner lukket grenhovede %d\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "deponerede ændring %d:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[TILVALG]... [KILDE]... MÃ…L"
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Denne kommando planlægger filerne til at blive fjernet ved næste\n"
+" deponering. For at omgøre en fjernelse før det, se :hg:`revert`."
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Returnerer 0 ved succes, 1 hvis opstod fejl.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[INDEKS] REV1 REV2"
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "find forfader-revisionen til to revisioner i det angivne indeks"
+
+msgid "either two or three arguments required"
+msgstr "kræver enten to eller tre argumenter"
+
+msgid "add single file mergeable changes"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[TILVALG]... [TEKST]"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr ""
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+
+msgid " Elements:"
+msgstr ""
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+
+msgid "reading DAG from stdin\n"
+msgstr ""
+
+msgid "repository is not empty"
+msgstr "depotet er ikke tomt"
+
+msgid "building"
+msgstr ""
+
+msgid "show all details"
+msgstr "vis alle detaljer"
+
+msgid "lists the contents of a bundle"
+msgstr "vis indholdet af et bundt"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "valider korrektheden af den nuværende dirstate"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+".hg/dirstate er inkonsistent i forhold til den nuværende forælders manifest"
+
+msgid "[COMMAND]"
+msgstr "[KOMMANDO]"
+
+msgid "list all available commands and options"
+msgstr "list alle tilgængelige kommandoer og tilvalg"
+
+msgid "show the command options"
+msgstr "vis kommando-flag"
+
+msgid "[-o] CMD"
+msgstr "[-o] KOMMANDO"
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr ""
+
+msgid "use dots for runs"
+msgstr ""
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[TILVALG]... [FIL [REV]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "open changelog"
+msgstr ""
+
+msgid "open manifest"
+msgstr ""
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|FIL REV"
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr "ugyldig revisionsidentification %s"
+
+msgid "try extended date formats"
+msgstr "prøv udvidede datoformater"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATO [INTERVAL]"
+
+msgid "parse and display a date"
+msgstr "fortolk og vis en dato"
+
+msgid "use old-style discovery"
+msgstr ""
+
+msgid "use old-style discovery with non-heads included"
+msgstr ""
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr ""
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr ""
+
+msgid "parse and apply a fileset specification"
+msgstr ""
+
+msgid "[PATH]"
+msgstr "[STI]"
+
+msgid "show information detected about current filesystem"
+msgstr ""
+
+msgid "id of head node"
+msgstr ""
+
+msgid "id of common node"
+msgstr "id på fælles knude"
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr ""
+
+msgid "retrieves a bundle from a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+
+msgid "display the combined ignore pattern"
+msgstr ""
+
+msgid "no ignore patterns found"
+msgstr "fandt ingen ignore mønstre"
+
+msgid "revlog format"
+msgstr ""
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr "dump indholdet af en indeksfil"
+
+#, python-format
+msgid "unknown format %d"
+msgstr "ukendt format %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "dump en indeks-DAG som en graphviz dot-fil"
+
+msgid "test Mercurial installation"
+msgstr "test Mercurial installationen"
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr "Kontrollerer tegnsæt (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+#, python-format
+msgid "Checking installed modules (%s)...\n"
+msgstr "Kontrollerer installerede moduler (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+#, python-format
+msgid "Checking templates (%s)...\n"
+msgstr ""
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr ""
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr ""
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr ""
+
+msgid "Checking username...\n"
+msgstr ""
+
+msgid " (specify a username in your configuration file)\n"
+msgstr ""
+
+msgid "No problems detected\n"
+msgstr "Fandt ingen problemer\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr ""
+
+msgid "REPO ID..."
+msgstr ""
+
+msgid "test whether node ids are known to a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s "
+"and 1s\n"
+" indicating unknown/known.\n"
+" "
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr "revision til hvilken der skal gendannes til"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r REV] [REV]"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr "genopbygger dirstate som den ville se ud for den angivne revision"
+
+msgid "revision to debug"
+msgstr "revision der skal fejlsøges"
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] FIL"
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s omdøbt fra %s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s ikke omdøbt\n"
+
+msgid "dump index data"
+msgstr ""
+
+msgid "-c|-m|FILE"
+msgstr ""
+
+msgid "show data and statistics about a revlog"
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr "REV1 [REV2]"
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr "vis ikke den gemte mtime"
+
+msgid "sort by saved mtime"
+msgstr "sorter efter den gemte mtime"
+
+msgid "[OPTION]..."
+msgstr "[TILVALG]..."
+
+msgid "show the contents of the current dirstate"
+msgstr "vil indholdet af den nuværende dirstate"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "kopi: %s -> %s\n"
+
+msgid "revision to check"
+msgstr "revision som skal undersøges"
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "DEPOT [TILVALG]... [EN [TO]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[TILVALG]... ([-c REV] | [-r REV1 [-r REV2]]) [FIL]..."
+
+msgid "diff repository (or selected files)"
+msgstr "find ændringer i hele depotet (eller udvalgte filer)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr " Vis ændringer mellem revisioner for de udvalgte filer."
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr " Ændringerne mellem filerne vises i unified diff-formatet."
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" diff kan generere overraskende resultater for sammenføjninger,\n"
+" idet den som udgangspunkt vil sammenligne med arbejdskatalogets\n"
+" første forælder, hvis der ikke angivet en revision."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" Du kan alternativt angive -c/--change med en revision for at se\n"
+" ændringerne i den revision relativt til dens første forælder."
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" Uden -a/--text tilvalget vil diff undgå at generere ændringer for\n"
+" filer som den detekterer som binære. Med -a vil diff generere\n"
+" ændringer alligevel, sandsynligvis med uønskede resultater."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" Brug -g/--git tilvalget for at generere ændringer i det udvidede\n"
+" git diff-format. For mere information, læs :hg:`help diffs`."
+
+msgid " - compare a file in the current working directory to its parent::"
+msgstr ""
+
+msgid " hg diff foo.c"
+msgstr ""
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr ""
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr ""
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr ""
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr ""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr ""
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr ""
+
+msgid " - compare a revision and its parents::"
+msgstr ""
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr "find forskelle i forhold til den anden forældre"
+
+msgid "revisions to export"
+msgstr "revision der skal eksporteres"
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr "[TILVALG]... [-o UDFILSPECIFIKATION] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "dump hovedet og ændringerne for en eller flere ændringer"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+" Udskriv ændrings-hovedet og ændringerne for en eller flere\n"
+" revisioner."
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" Informationen som vises i ændrings-hovedet er: forfatter, dato,\n"
+" grennavn (hvis forskellig fra default), ændringshash, forældrene\n"
+" og deponeringsbeskeden."
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" export kan generere uventet diff uddata for\n"
+" sammenføjningsændringer idet den kun vil sammenligne\n"
+" sammenføjningsændringen med dennes første forælder."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" Uddata kan gemmes i en fil, og filnavnet er givet ved en\n"
+" format-streng. Formatteringsreglerne er som følger:"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: litteral \"%\" tegn\n"
+" :``%H``: ændringshash (40 hexadecimale cifre)\n"
+" :``%N``: antallet af rettelser som bliver genereret\n"
+" :``%R``: revisionnummer for ændringen\n"
+" :``%b``: grundnavn for det eksporterede depot\n"
+" :``%h``: kortform ændringshash (12 hexadecimale cifre)\n"
+" :``%m``: første linie af deponeringsbeskeden (kun alfanumeriske tegn)\n"
+" :``%n``: nul-fyldt sekvensnummer, startende ved 1\n"
+" :``%r``: nul-fyldt revisionsnummer for ændringen"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" Uden -a/--text tilvalget vil annotate undgå at behandle filer som\n"
+" den detekterer som binære. Med -a vil annotate generere en\n"
+" annotering alligevel, sandsynligvis med et uønsket resultat."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" Brug -g/--git tilvalget for at generere ændringer i det udvidede\n"
+" git diff-format. Se :hg:`help diffs` for mere information."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" Med --switch-parent tilvalget vil ændringerne blive beregnet i\n"
+" forhold til den anden forælder. Dette kan være nyttigt til at\n"
+" gennemse en sammenføjning."
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr ""
+
+msgid " hg export -r 9353 | hg import -"
+msgstr ""
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr ""
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr ""
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr ""
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr "glem de angivne filer ved næste deponering"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+" Marker de angivne filer sådan at de ikke længere vil fulgt ved\n"
+" næste deponering."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" Dette fjerner kun filerne fra den aktuelle gren, ikke fra hele\n"
+" projektets historie, og det sletter dem heller ikke fra\n"
+" arbejdskataloget."
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr " For at omgøre forget før næste deponering, se :hg:`add`."
+
+msgid " - forget newly-added binary files::"
+msgstr ""
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr ""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr ""
+
+msgid " hg forget \"set:hgignore()\""
+msgstr ""
+
+msgid "resume interrupted graft"
+msgstr ""
+
+msgid "record the current date as commit date"
+msgstr "noter dags dato som integrationsdato"
+
+msgid "record the current user as committer"
+msgstr "noter nuværende bruger som ham der har deponeret"
+
+msgid "[OPTION]... REVISION..."
+msgstr "[TILVALG]... [REVISION]..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr ""
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" aborted so that the current merge can be manually resolved. Once\n"
+" all conflicts are addressed, the graft process can be continued\n"
+" with the -c/--continue option."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr ""
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr ""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr ""
+
+msgid " hg graft -c"
+msgstr ""
+
+msgid " - show the source of a grafted changeset::"
+msgstr ""
+
+msgid " hg log --debug -r tip"
+msgstr ""
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" Returnerer 0 ved succes afslutning.\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "kan ikke angive --continue og revisioner"
+
+msgid "no graft state found, can't continue"
+msgstr ""
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr ""
+
+msgid "unresolved conflicts, can't continue"
+msgstr "uløste konflikter, kan ikke fortsætte"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "brug hg resolve og hg graft --continue"
+
+msgid "end fields with NUL"
+msgstr "afslut felter med NUL"
+
+msgid "print all revisions that match"
+msgstr "udskriv alle revisioner som matcher"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+
+msgid "ignore case when matching"
+msgstr ""
+
+msgid "print only filenames and revisions that match"
+msgstr "udskriv kun filnavne og revisioner som matcher"
+
+msgid "print matching line numbers"
+msgstr "udskriv matchende linienumre"
+
+msgid "only search files changed within revision range"
+msgstr "søg kun i filer som er ændret i det angivne interval"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[TILVALG]... MØNSTER [FIL]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: ugyldigt søgemønster: %s\n"
+
+msgid "STARTREV"
+msgstr "STARTREV"
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "vis kun hoveder som er efterkommere af STARTREV"
+
+msgid "show topological heads only"
+msgstr ""
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "vis kun aktive gren-hoveder (FORÆLDET)"
+
+msgid "show normal and closed branch heads"
+msgstr "vis normale og lukkede grenhoveder"
+
+msgid "[-ac] [-r STARTREV] [REV]..."
+msgstr "[-ac] [-r STARTREV] [REV]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr ""
+
+msgid " With no arguments, show all repository branch heads."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" Viser depotets navngivne grene og indikerer hvilke der er\n"
+" inaktive. Hvis -c/--closed er angivet, så vises lukkede grene også\n"
+" (se :hg:`commit --close-branch`)."
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "fandt ingen åbne gren-hoveder på grenene %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (startet ved %s)"
+
+msgid "show only help for extensions"
+msgstr ""
+
+msgid "show only help for commands"
+msgstr ""
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [EMNE]"
+
+msgid "show help for a given topic or a help overview"
+msgstr ""
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+
+msgid "VALUE"
+msgstr ""
+
+msgid "DEPRECATED"
+msgstr ""
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+
+msgid "global options:"
+msgstr "globale indstillinger:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "brug \"hg help\" for den fulde liste af kommandoer"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"brug \"hg help\" for den fulde liste af kommandoer eller \"hg -v\" for "
+"detaljer"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "brug \"hg help %s\" for at se udførlig hjælp"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"brug \"hg -v help%s\" for at vise indbyggede aliaser og globale "
+"valgmuligheder"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show more info"
+msgstr "brug \"hg -v help %s\" for mere information"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"aliasser: %s\n"
+
+msgid "(no help text available)"
+msgstr "(ingen hjælpetekst tilgængelig)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "shellalias for::"
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "alias for: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr "\nbrug \"hg -v help %s\" for at se mere information\n"
+
+msgid "basic commands:"
+msgstr "basale kommandoer:"
+
+msgid "list of commands:"
+msgstr "liste af kommandoer:"
+
+msgid "no commands defined\n"
+msgstr "ingen kommandoer defineret\n"
+
+msgid "enabled extensions:"
+msgstr "aktiverede udvidelser:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"yderligere hjælpeemner:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+
+msgid "no help text available"
+msgstr "ingen hjælpetekst tilgængelig"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s udvidelse - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial Distribueret SCM\n"
+
+msgid "identify the specified revision"
+msgstr "identificer den angivne revision"
+
+msgid "show local revision number"
+msgstr "vis lokalt revisionsnummer"
+
+msgid "show global revision id"
+msgstr "vis globalt revisionsnummer"
+
+msgid "show branch"
+msgstr "vis gren"
+
+msgid "show tags"
+msgstr "vis mærkater"
+
+msgid "show bookmarks"
+msgstr "vis bogmærker"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [KILDE]"
+
+msgid "identify the working copy or specified revision"
+msgstr ""
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid " - generate a build identifier for the working directory::"
+msgstr ""
+
+msgid " hg id --id > build-id.dat"
+msgstr ""
+
+msgid " - find the revision corresponding to a tag::"
+msgstr ""
+
+msgid " hg id -n -r 1.3"
+msgstr ""
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr ""
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr ""
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr ""
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+
+msgid "PATH"
+msgstr "STI"
+
+msgid "base path (DEPRECATED)"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "spring kontrollen for udeponerede ændringer over"
+
+msgid "don't commit, just update the working directory"
+msgstr "deponer ikke, opdater blot arbejdskataloget"
+
+msgid "apply patch without touching the working directory"
+msgstr ""
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "anvend rettelse på den knude hvorfra den var genereret"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr "[TILVALG]... RETTELSE..."
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr ""
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr ""
+
+msgid " - import a changeset from an hgweb server::"
+msgstr ""
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr ""
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr ""
+
+msgid " hg import incoming-patches.mbox"
+msgstr ""
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr ""
+
+msgid "need at least one patch to import"
+msgstr ""
+
+msgid "cannot use --no-commit with --bypass"
+msgstr "kan ikke bruge --no-commit med --bypass"
+
+msgid "cannot use --similarity with --bypass"
+msgstr "kan ikke bruge --similarity med --bypass"
+
+msgid "patch is damaged or loses information"
+msgstr "rettelsen er beskadiget eller mister information"
+
+msgid "applied to working directory"
+msgstr "anvendt på arbejdskatalog"
+
+msgid "not a Mercurial patch"
+msgstr "ikke en Mercurial patch"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "oprettede %s"
+
+msgid "applying patch from stdin\n"
+msgstr "anvender rettelse fra standardinddata\n"
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: fandt ingen ændringer"
+
+msgid "run even if remote repository is unrelated"
+msgstr "kør selv hvis fjerndepotet er urelateret"
+
+msgid "show newest record first"
+msgstr "vis nyeste postering først"
+
+msgid "file to store the bundles into"
+msgstr "fil hvor bundterne skal gemmes"
+
+msgid "a remote changeset intended to be added"
+msgstr ""
+
+msgid "compare bookmarks"
+msgstr "sammenlign bogmærker"
+
+msgid "a specific branch you would like to pull"
+msgstr "en bestemt gren du gerne vil hive ned"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILNAVN] [KILDE]"
+
+msgid "show new changesets found in source"
+msgstr ""
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+
+msgid " See pull for valid source format details."
+msgstr ""
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr ""
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "fjerdepotet understøtter ikke bogmærker\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e KOMMANDO] [--remotecmd KOMMANDO] [MÃ…L]"
+
+msgid "create a new repository in the given directory"
+msgstr "opret et nyt depot i det givne katalog"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Initialiser et nyt depot i det givne katalog. Hvis det givne\n"
+" katalog ikke findes vil det blive oprettet."
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+" Hvis intet katalog er angivet vil det nuværende katalog bliver\n"
+" anvendt."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Det er muligt at angive en ``ssh://`` URL som destination.\n"
+" Se :hg:`help urls` for mere information."
+
+msgid "search the repository as it is in REV"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "afslut filnavne med NUL, til brug med xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "udskriv fulde stier fra filsystemets rod"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[TILVALG]... [MØNSTER]..."
+
+msgid "locate files matching specific patterns"
+msgstr ""
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr "følg kun den første forælder for sammenføjningsændringer"
+
+msgid "show revisions matching date spec"
+msgstr "vis revisioner som matcher datoangivelsen"
+
+msgid "show copied files"
+msgstr "vis kopierede filer"
+
+msgid "do case-insensitive search for a given text"
+msgstr "lav søgning efter nøgleord uden forskel på små/store bogstaver"
+
+msgid "include revisions where files were removed"
+msgstr "inkluder revisioner hvor filer blev slettet"
+
+msgid "show only merges"
+msgstr "vis kun sammenføjninger"
+
+msgid "revisions committed by user"
+msgstr "revisioner deponeret af bruger"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "vis kun ændringer på den angivne navngivne gren (FORÆLDET)"
+
+msgid "show changesets within the given named branch"
+msgstr "vis ændringer på den angivne navngivne gren"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "vis ikke revision eller nogen af den forfædre"
+
+msgid "show hidden changesets"
+msgstr "vis skjulte ændringer"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[TILVALG]... [FIL]"
+
+msgid "show revision history of entire repository or files"
+msgstr "vis revisionhistorik for hele depotet eller udvalgte filer"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Viser revisionshistorikken for de angivne filer eller hele\n"
+" projektet."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" Hvis der ikke angives et revisionsinterval, da bruges ``tip:0``\n"
+" som standard, med mindre --follow er brugt, i hvilket tilfælde\n"
+" arbejdskatalogets forælder bruges som startrevision."
+
+#, fuzzy
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" Filhistorik vises uden at følge omdøbninger eller kopieringer.\n"
+" Brug -f/--follow med et filnavn for at følge historien hen over\n"
+" omdøbninger og kopieringer. --follow uden et filnavn vil kun vise\n"
+" forfædre eller efterkommere af startrevisionen. --follow-first\n"
+" følger kun den første forældre for sammenføjningsrevisioner."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Som standard udskriver denne kommando revisionsnummer og ændrings\n"
+" ID, mærkater, ikke-trivielle forældre, bruger, dato og tid, og et\n"
+" uddrag for hver ændring. Når -v/--verbose tilvalget bruges vises\n"
+" listen af ændrede filer og den fulde deponeringsbesked."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" log -p/--patch kan generere uventet diff output for\n"
+" sammenføjningsændringer idet den kun sammenligner ændringen med\n"
+" dennes første forælder. Ydermere vises kun filer som er\n"
+" forskellige fra BEGGE forældre i files:."
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr ""
+
+msgid " hg log -v"
+msgstr ""
+
+msgid " - changesets ancestral to the working directory::"
+msgstr ""
+
+msgid " hg log -f"
+msgstr ""
+
+msgid " - last 10 commits on the current branch::"
+msgstr ""
+
+msgid " hg log -l 10 -b ."
+msgstr ""
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr ""
+
+msgid " hg log --removed file.c"
+msgstr ""
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr ""
+
+msgid " hg log -Mp lib/"
+msgstr ""
+
+msgid " - all revision numbers that match a keyword::"
+msgstr ""
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr ""
+
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr ""
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr " hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr ""
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr ""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr ""
+
+msgid ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+
+msgid "revision to display"
+msgstr "revision der skal vises"
+
+msgid "list files from all revisions"
+msgstr ""
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+
+msgid "can't specify a revision with --all"
+msgstr "du kan ikke specificeret en revision sammen med --all"
+
+msgid "force a merge with outstanding changes"
+msgstr ""
+
+msgid "revision to merge"
+msgstr "revision der skal sammenføjes"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "sammenføj arbejdskataloget med en anden revision"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" Det nuværende arbejdskatalog opdateres med alle ændringer lavet i\n"
+" den ønskede revision siden den sidste fælles foregående revision."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Filer som ændrede sig i forhold til en af forældrene bliver\n"
+" markeret som ændret med hensyn til næste deponering, og en\n"
+" deponering skal laves før yderligere opdateringer er tilladt. Den\n"
+" næste deponerede ændring får to forældre."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" Hvis ingen revision angives og arbejdskatalogets forælder er en\n"
+" hovedrevision og den nuværende gren indeholder præcis et andet\n"
+" hoved, så sammenføjes der med dette hoved som standard. Ellers\n"
+" skal en eksplicit revision angives."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr ""
+" :hg:`resolve` skal bruges for at prøve at sammenføje uløste filer igen"
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr "afbrudt: gren '%s' har %d hoveder - sammenføj venligst med en eksplicit revision"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "kør 'hg heads .' for at se hoveder"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr "afbrudt: gren '%s' har et hoved - sammenføj venligst med en eksplicit revision"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "kør 'hg heads' for at se alle hoveder"
+
+msgid "there is nothing to merge"
+msgstr "der er ikke noget at sammenføje"
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr "%s - brug \"hg update\" istedet"
+
+msgid "working directory not at a head revision"
+msgstr "arbejdskatalog er ikke ved et hoved"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "brug 'hg update' eller sammenføj med en eksplicit revision"
+
+msgid "a changeset intended to be included in the destination"
+msgstr ""
+
+msgid "a specific branch you would like to push"
+msgstr "en bestemt gren du gerne vil skubbe ud"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [MÃ…L]"
+
+msgid "show changesets not found in the destination"
+msgstr ""
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+
+msgid " See pull for details of valid destination formats."
+msgstr ""
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "show parents of the specified revision"
+msgstr "vis forældre for den angivne revision"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [FIL]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "vis forældrene til arbejdskataloget eller en revision"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Udskriv arbejdskatalogets forældrerevisioner. Hvis en revision\n"
+" angivet med -r/--rev, så udskrives forældren til denne revision.\n"
+" Hvis en fil er angivet, udskrives revisionen i hvilken filen sidst\n"
+" blev ændret (før arbejdskatalogets revision eller argumentet til\n"
+" --rev, hvis givet)."
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' ikke fundet i manifest!"
+
+msgid "[NAME]"
+msgstr "[NAVN]"
+
+msgid "show aliases for remote repositories"
+msgstr ""
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr " Se :hg:`help urls` for mere information."
+
+msgid "not found!\n"
+msgstr "ikke fundet!\n"
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "opdaterer ikke: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(kør 'hg heads' for at se hoveder, 'hg merge' for at sammenføje)\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr "(kør 'hg heads .' for at se hoveder, 'hg merge' for at sammenføje)\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "(kør 'hg heads' for at se hoveder)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(kør 'hg update' for at få en arbejdskopi)\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "opdater til det nye gren-hovede hvis ændringer blev trukket ned"
+
+msgid "run even when remote repository is unrelated"
+msgstr "kør selv hvis fjerndepotet er urelateret"
+
+msgid "BOOKMARK"
+msgstr "BOGMÆRKE"
+
+msgid "bookmark to pull"
+msgstr "bogmærke der skal hentes"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e KOMMANDO] [--remotecmd KOMMANDO] [KILDE]"
+
+msgid "pull changes from the specified source"
+msgstr "hent ændringer fra den angivne kilde"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Hiver ændringer fra et fjert depot til et lokalt."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Dette finder alle ændringer fra depotet på den specificerede sti\n"
+" eller URL og tilføjer dem til et lokalt depot (det nuværende depot\n"
+" med mindre -R er angivet). Som standard opdateres arbejdskataloget\n"
+" ikke."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Brug :hg:`incoming` for at se hvad der ville være blevet tilføjet\n"
+" på det tidspunkt du udførte kommandoen. Hvis du derefter beslutter\n"
+" at tilføje disse ændringer til depotet, så bør du bruge pull -r X\n"
+" hvor X er den sidste ændring nævnt af :hg:`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Hvis KILDE udelades, så bruges 'default' stien.\n"
+" Se :hg:`help urls` for mere information."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "fjern-bogmærke %s blev ikke fundet!"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"det andet depot understøtter ikke revisionsopslag, så en revision kan ikke "
+"angives."
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "importerer bogmærke %s\n"
+
+msgid "force push"
+msgstr "gennemtving skubning"
+
+msgid "bookmark to push"
+msgstr "bogmærke der skal skubbes"
+
+msgid "allow pushing a new branch"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e KOMMANDO] [--remotecmd KOMMANDO] [MÃ…L]"
+
+msgid "push changes to the specified destination"
+msgstr "skub ændringer til den angivne destination"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+" Skubber ændringer fra det lokale depot til den angivne\n"
+" destination."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Hvis -r/--rev bruges, så vil den navngivne revision og alle dens\n"
+" forfædre bliver skubbet til det andet depot."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Se venligst :hg:`help urls` for vigtige detaljer om ``ssh://``\n"
+" URL'er. Hvis DESTINATION udelades vil en standard sti blive brugt."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "skubber til %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "eksporterer bogmærke %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "sletter fjern-bogmærke %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "bogmærke %s eksisterer ikke i hverken lokal- eller fjerndepotet!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "opdatering af bogmærke %s fejlede!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr ""
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr ""
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "fjern (og slet) fil selv hvis tilføjet eller ændret"
+
+msgid "remove the specified files on the next commit"
+msgstr "fjern de angivne filer ved næste deponering"
+
+#, fuzzy
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr " Planlæg de angivne filer til sletning fra depotet."
+
+#, fuzzy
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" Denne kommando planlægger filerne til at blive fjernet ved næste\n"
+" deponering. For at omgøre en fjernelse før det, se :hg:`revert`.\n"
+" "
+
+#, fuzzy
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" Dette fjerner kun filerne fra den nuværende gren, ikke fra hele\n"
+" projektets historie. -A/--after kan bruges til kun at fjerne filer\n"
+" som allerede er slettet, -f/--force kan bruges for at gennemtvinge\n"
+" en sletning, og -Af kan bruges til at fjerne filer fra næste\n"
+" revision uden at slette dem fra arbejdskataloget."
+
+#, fuzzy
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" Den følgende tabel viser opførslen af remove for forskellige\n"
+" filtilstande (søjler) og kombinationer af tilvalg (rækker). Mulige\n"
+" filtilstande er tilføjet [A], ren [C], ændret [M] og manglende [!]\n"
+" (som rapporteret af :hg:`status`). Handlingerne er Warn, Remove\n"
+" (fra gren) og Delete (fra disk)::"
+
+#, fuzzy
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "fjerner ikke %s: filen følges ikke\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr ""
+"fjerner ikke %s: filen eksisterer stadig (brug -f for at forcere "
+"fjernelsen)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr "fjerner ikke %s: filen er ændret (brug -f for at forcere fjernelsen)\n"
+
+#, fuzzy, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr ""
+"fjerner ikke %s: filen er markeret som tilføjt (brug -f for at forcere "
+"fjernelsen)\n"
+
+msgid "record a rename that has already occurred"
+msgstr ""
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[TILVALG]... KILDE... MÃ…L"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Denne kommando planlægger filerne til at blive fjernet ved næste\n"
+" deponering. For at omgøre en fjernelse før det, se :hg:`revert`."
+
+msgid "select all unresolved files"
+msgstr "vælg alle uløste filer"
+
+msgid "list state of files needing merge"
+msgstr "vis tilstand af filer som har brug for sammenføjning"
+
+msgid "mark files as resolved"
+msgstr "marker filer som løste"
+
+msgid "mark files as unresolved"
+msgstr "marker filer som uløste"
+
+msgid "hide status prefix"
+msgstr "skjul statuspræfix"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr ""
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents)."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr "der er angivet for mange tilvalg"
+
+msgid "can't specify --all and patterns"
+msgstr "kan ikke angive --all og mønstre"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+"ingen filer eller mapper specificeret; brug --all for at gen-sammenføje alle "
+"filerne"
+
+msgid "revert all changes when no arguments given"
+msgstr "før alle ændringer tilbage når inget argument angives"
+
+msgid "tipmost revision matching date"
+msgstr ""
+
+msgid "revert to the specified revision"
+msgstr "vend tilbage til den angivne revision"
+
+msgid "do not save backup copies of files"
+msgstr "gem ikke sikkerhedskopier af filer"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[TILVALG]... [-r REV] [NAVN]..."
+
+msgid "restore files to their checkout state"
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel a merge (and lose your changes), use :hg:`update --clean .`."
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr "du kan ikke specificeret en revision og en dato"
+
+#, fuzzy
+msgid "uncommitted merge with no revision specified"
+msgstr "udeponeret sammenføjning - angiv venligst en specifik revision"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr ""
+
+#, fuzzy
+msgid "no files or directories specified"
+msgstr "ingen filer angivet"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+
+#, fuzzy
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr ""
+"udestående ikke-deponerede ændringer (brug 'hg status' for at se ændringer)"
+
+#, fuzzy
+msgid "use --all to revert all files"
+msgstr "kan ikke læse filen %s"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "glemmer %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "fører %s tilbage\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "usletter %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "gemmer nuværende version af %s som %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "filen er ikke håndteret: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "%s behøver ingen ændringer\n"
+
+msgid "ignore safety measures"
+msgstr ""
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "ruller sidste transaktion tilbage (farligt)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+
+msgid ""
+" It's possible to lose data with rollback: commit, update back to\n"
+" an older changeset, and then rollback. The update removes the\n"
+" changes you committed from the working directory, and rollback\n"
+" removes them from history. To avoid data loss, you must pass\n"
+" --force in this case."
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr ""
+
+msgid " Print the root directory of the current repository."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr "navn på adgangslogfilen der skrives til"
+
+msgid "name of error log file to write to"
+msgstr "navn på fejlllog fil der skrives til"
+
+msgid "PORT"
+msgstr "PORT"
+
+msgid "port to listen on (default: 8000)"
+msgstr "port der skal lyttes på (standard: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "adresse der skal lyttes til (standard: alle grænseflader)"
+
+msgid "ADDR"
+msgstr ""
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "prefiks sti at udstille fra (default: server-rod)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr "navn der skal vises på websider (standard: arbejdskatalog)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "navn på hgweb konfigurationsfil (se \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr "navn på hgweb konfigurationsfilen (FORÆLDET)"
+
+msgid "for remote clients"
+msgstr "for fjernklienter"
+
+msgid "web templates to use"
+msgstr "web-skabelon"
+
+msgid "template style to use"
+msgstr "skabelon-stil"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "brug IPv6 og IPv4"
+
+msgid "SSL certificate file"
+msgstr "SSL certifikatfil"
+
+msgid "start stand-alone webserver"
+msgstr ""
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" Som standard logger serveren forespørgsler til stdout og fejl til\n"
+" stderr. Brug -A/--accesslog og -E/--errorlog tilvalgene for at\n"
+" logge til filer."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+" For at få serveren til at vælge et frit portnummer at lytte til,\n"
+" angiv da portnummer 0; så vil serveren skrive det portnummer den\n"
+" bruger."
+
+#, fuzzy
+msgid "cannot use --stdio with --cmdserver"
+msgstr "kan ikke bruge --exact og --move sammen"
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "Der er intet Mercurial depot her (.hg ikke fundet)"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "lytter på http://%s%s/%s (bundet til %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr "vis ikke-betroede konfigurationsværdier"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [NAVN]..."
+
+msgid "show combined config settings from all hgrc files"
+msgstr ""
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "show status of all files"
+msgstr "vis status på alle filer"
+
+msgid "show only modified files"
+msgstr "vis kun ændrede filer"
+
+msgid "show only added files"
+msgstr "vis kun tilføjede filer"
+
+msgid "show only removed files"
+msgstr "vis kun fjernede filer"
+
+msgid "show only deleted (but tracked) files"
+msgstr "vis kun slettede (men kendte) filer"
+
+msgid "show only files without changes"
+msgstr "vis kun filer unden ændringer"
+
+msgid "show only unknown (not tracked) files"
+msgstr "vis kun ukendte filer"
+
+msgid "show only ignored files"
+msgstr "vis kun ignorerede filer"
+
+msgid "show source of copied files"
+msgstr "vis kilder for kopierede filer"
+
+msgid "show difference from revision"
+msgstr "vis forskelle fra revision"
+
+msgid "list the changed files of a revision"
+msgstr "vis de ændrede filer i en revision"
+
+msgid "show changed files in the working directory"
+msgstr "vis ændrede filer i arbejdskataloget"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Vis status for filer i depotet. Hvis der angivet navne, så vil kun\n"
+" disse filer blive vist. Filer som er rene eller ignorerede eller\n"
+" kilden i en kopierings/flytnings operation vises ikke med mindre\n"
+" -c/--clear, -i/--ignored, -C/--copies eller -A/--all er angivet.\n"
+" Med mindre tilvalgene beskrevet med \"vis kun ...\" bruges, så\n"
+" bruges -mardu tilvalgene."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" Tilvalget -q/--quiet skjuler filer som ikke bliver fulgt (ukendte\n"
+" eller ignorerede filer) med mindre disse eksplicit vælges med\n"
+" -u/--unknown eller -i/--ignored."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note::\n"
+" status kan tilsyneladende være forskellig fra diff hvis\n"
+" rettigheder er blevet ændret eller hvis en sammenføjning har\n"
+" fundet sted. Det normale diff-format rapporterer ikke ændringer\n"
+" i rettigheder og diff rapporterer kun ænringer relativt til en\n"
+" sammenføjningsforældre."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" Hvis der angivet en revision bruges denne som en basisrevision.\n"
+" Hvis der angives to revisioner, da vises forskellene mellem dem.\n"
+" Brug --change tilvalget som en genvej til at vise ændrede filer\n"
+" mellem en revision og dens første forælder."
+
+msgid " The codes used to show the status of files are::"
+msgstr " Koderne som bruges til at vise status for filerne er::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = ændret\n"
+" A = tilføjet\n"
+" R = fjernet\n"
+" C = ren\n"
+" ! = mangler (slettet af en ikke-hg kommando, men følges stadig)\n"
+" ? = følges ikke\n"
+" I = ignoreret\n"
+" = den foregående fil markeret som A (tilføjet) stammer herfra"
+
+#, fuzzy
+msgid " - show changes in the working directory relative to a changeset:"
+msgstr "vis ændrede filer i arbejdskataloget"
+
+msgid " hg status --rev 9353"
+msgstr ""
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr ""
+
+msgid " hg status --copies --change 9353"
+msgstr ""
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+
+msgid " hg status -an0"
+msgstr ""
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr ""
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "forælder: %d:%s "
+
+msgid " (empty repository)"
+msgstr "(tomt depot)"
+
+msgid " (no revision checked out)"
+msgstr "(ingen revision hentet frem)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "gren: %s\n"
+
+#, fuzzy
+msgid "bookmarks:"
+msgstr "vis bogmærker"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d ændret"
+
+#, python-format
+msgid "%d added"
+msgstr "%d tilføjet"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d fjernet"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d omdøbt"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d kopieret"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d slettet"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d ukendt"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignoreret"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d uløst"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d underdepoter"
+
+msgid " (merge)"
+msgstr " (sammenføj)"
+
+msgid " (new branch)"
+msgstr " (ny gren)"
+
+msgid " (head closed)"
+msgstr " (lukkede hoved)"
+
+msgid " (clean)"
+msgstr " (ren)"
+
+msgid " (new branch head)"
+msgstr " (nyt hoved på gren)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "deponer: %s\n"
+
+msgid "update: (current)\n"
+msgstr "opdater: (aktuel)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "opdater: %d nye ændringer (update)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "opdater: %d nye ændringer, %d grenhoveder (merge)\n"
+
+msgid "1 or more incoming"
+msgstr "1 eller flere indkomne"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d udgående"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d indgående bogmærker"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d udgående bogmærker"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "fjernsystem: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "fjernsystem: (synkroniseret)\n"
+
+msgid "force tag"
+msgstr "gennemtving markering"
+
+msgid "make the tag local"
+msgstr "gør mærkaten lokal"
+
+msgid "revision to tag"
+msgstr "revision der skal mærkes"
+
+msgid "remove a tag"
+msgstr "fjern en mærkat"
+
+msgid "use <text> as commit message"
+msgstr "brug <tekst> som deponeringsbesked"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEKST] [-d DATO] [-u BRUGER] [-r REV] NAVN..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr ""
+
+msgid " Name a particular revision using <name>."
+msgstr ""
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr "mærkatnavne skal være unikke"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "mærkater kan ikke bestå udelukkende af tomrum"
+
+msgid "--rev and --remove are incompatible"
+msgstr "--rev og --remove er inkompatible"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "mærkaten '%s' eksisterer ikke"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "mærkaten '%s' er ikke en global mærkat"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "mærkaten '%s' er ikke en lokal mærkat"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "mærkaten '%s' eksisterer allerede (brug -f for at gennemtvinge)"
+
+msgid "uncommitted merge"
+msgstr "udeponeret sammenføjning"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "ej ved et grenhoved (brug -f for at gennemtvinge)"
+
+msgid "list repository tags"
+msgstr "vis depotmærkater"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Viser både normale og lokale mærkater. Når -v/--verbose flaget\n"
+" bruges, udskrives en tredje kolonne \"local\" for lokale mærkater."
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr ""
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr "opdater til nyt gren-hoved hvis ændringer blev pakket ud"
+
+msgid "[-u] FILE..."
+msgstr "[-u] FIL..."
+
+msgid "apply one or more changegroup files"
+msgstr ""
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "kasser ikke-deponerede ændringer (ingen sikkerhedskopi)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "opdater på tværs af grene hvis der er ingen udeponerede ændringer"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATO] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "opdater arbejdskataloget (eller skift til en anden revision)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch."
+msgstr ""
+" Opdater depotets arbejdskatalog til den angivne ændring. Hvis der\n"
+" ikke angives en ændring, da opdateres til spidsen af den nuværende\n"
+" gren."
+
+msgid ""
+" If the changeset is not a descendant of the working directory's\n"
+" parent, the update is aborted. With the -c/--check option, the\n"
+" working directory is checked for uncommitted changes; if none are\n"
+" found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" De følgende regler gælder når arbejdskataloget indeholder\n"
+" udeponerede ændringer:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. Hvis hverken -c/--check eller -C/--clean er angivet og hvis den\n"
+" ønskede ændring er en forfar til eller nedstammer fra\n"
+" arbejdskatalogets forældre, så bliver udeponerede ændringer\n"
+" føjet ind i den ønskede ændring og det sammenføjne resultat\n"
+" bliver efterlad udeponeret. Hvis den ønskede ændring ikke er\n"
+" forfar til eller nedstammer fra forældreændringen (det vil\n"
+" sige, den er på en anden gren), så vil opdateringen blive\n"
+" afbrudt og de udeponerede ændringer bliver bevaret."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. Med -c/--check tilvalget vil opdateringen blive afbrudt og de\n"
+" udeponerede ændringer bliver bevaret."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. Med -C/--clean tilvalget bliver udeponerede ændringer kasseret\n"
+" og arbejdskataloget bliver opdateret til den ønskede ændring."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" Brug null som ændring for at fjerne arbejdskataloget (ligesom\n"
+" :hg:`clone -U`)."
+
+#, fuzzy
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" Hvis du vil opdatere blot en enkelt fil til en ældre revision,\n"
+" brug da :hg:`revert`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "man kan ikke angive både -c/--check og -C/--clean"
+
+msgid "verify the integrity of the repository"
+msgstr "verificer depotets integritet"
+
+msgid " Verify the integrity of the current repository."
+msgstr " Verificer integreteten af det aktuelle depot."
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Dette vil lave en udførlig kontrol af depotets integritet.\n"
+" Hashværdier og tjeksummer valideres for hver indgang i\n"
+" historikfilen, manifæstet og fulgte filer. Desuden valideres\n"
+" integriteten af deres krydslinks og indekser."
+
+msgid "output version and copyright information"
+msgstr "udskriv version- og copyrightinformation"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Mercurial Distribueret SCM (version %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(se http://mercurial.selenic.com for mere information)"
+
+msgid ""
+"Copyright (C) 2005-2011 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2011 Matt Mackall og andre\n"
+"Dette er frit programmel; se kildekoden for kopieringsbetingelser. Der\n"
+"gives INGEN GARANTI; ikke engang for SALGBARHED eller EGNETHED FOR\n"
+"NOGET BESTEMT FORMÃ…L.\n"
+
+#, fuzzy, python-format
+msgid "unknown mode %s"
+msgstr "ukendt sortering: %s"
+
+#, fuzzy, python-format
+msgid "unknown command %s"
+msgstr "hg: ukendt kommando '%s'\n"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "kan ikke inkludere %s (%s)"
+
+msgid "not found in manifest"
+msgstr "blev ikke fundet i manifest"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "ingen sådan fil i revision %s"
+
+msgid "branch name not in UTF-8!"
+msgstr "grennavn er ikke i UTF-8!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s eksisterer ikke!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+"%s ikke tilføjet: i øjeblikket understøttes kun filer og symbolske lænker\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s følges allerede!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s følges ikke\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s ikke fjernet!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr "kopiering fejlede: %s er ikke en fil eller en symbolsk længe\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "ugyldig tegn i DAG-beskrivelsen: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr ""
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr ""
+
+msgid "nullid"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr "arbejdskatalogtilstand virker beskadiget!"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "katalog %r er allerede i dirstate"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+msgid "unknown"
+msgstr "ukendt"
+
+msgid "character device"
+msgstr "tegn-specialfil"
+
+msgid "block device"
+msgstr "blok-specialfil"
+
+msgid "fifo"
+msgstr "fifo"
+
+msgid "socket"
+msgstr "sokkel"
+
+msgid "directory"
+msgstr "katalog"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "usupporteret filtype (typen er %s)"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "skub laver nye grene i fjerndepotet: %s!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "brug 'hg push --new-branch' for at lave nye grene i fjerndepotet"
+
+#, fuzzy, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "skub laver nye fjern-hoveder på grenen '%s'!"
+
+#, fuzzy, python-format
+msgid "push creates new remote head %s!"
+msgstr "skub laver nye fjern-hoveder!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr "du bør hive og sammenføje eller bruge -f for at gennemtvinge"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "glemte du at sammenføje? brug push -f for at gennemtvinge"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "bemærk: usynkroniserede ændringer i fjernsystemet!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "afbrudt: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr "(%s)\n"
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: konfigurationsfejl på %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: parse fejl: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: kommandoen '%s' is tvetydig:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "tiden løb ud ved vent på lås holdt af %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "lås holdt af %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "afbrudt: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "afbrudt: kunne ikke låse %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "afbrudt: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "afbrudt: %s"
+
+msgid " empty string\n"
+msgstr " tom streng\n"
+
+msgid "killed!\n"
+msgstr "dræbt!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: ukendt kommando '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(glemte du at kompilere udvidelserne?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(er din Python installeret korrekt?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "afbrudt: fejl: %s\n"
+
+msgid "broken pipe\n"
+msgstr "afbrudt pipe\n"
+
+msgid "interrupted!\n"
+msgstr "standset!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"afbrudt pipe\n"
+
+msgid "abort: out of memory\n"
+msgstr "afbrudt: løbet tør for hukommelse\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr "** der opstod en ukendt fejl, meld den venligst ved at besøge\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial Distributed SCM (version %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Udvidelser indlæst: %s\n"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr "ingen definition for alias '%s'\n"
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "alias '%s' oversætter til ukendt kommando '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "alias '%s' oversætter til tvetydig kommando '%s'\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr "misdannet --config tilvalg: %r (brug --config sektion.navn=værdi)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "fejl ved opslag af nuværende arbejdskatalog: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "udvidelse '%s' overskriver kommandoer: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "tilvalget --config må ikke forkortes!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "tilvalget --cwd må ikke forkortes!"
+
+msgid ""
+"Option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+"Tilvalget -R skal adskilles fra andre tilvalg (fx ikke -qR) og --repository "
+"må kun forkortes som --repo!"
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "depot '%s' er ikke lokalt"
+
+#, fuzzy, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "depotet %s blev ikke fundet"
+
+msgid "warning: --repository ignored\n"
+msgstr "advarsel: --repository ignoreret\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr "profileringsformat '%s' ikke genkendt - Ignoreret\n"
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+"lsprof er ikke tilgængelig - installer fra http://codespeak.net/svn/user/"
+"arigo/hack/misc/lsprof/"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** import af udvidelse %s fra %s fejlede: %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** import af udvidelse %s fejlede: %s\n"
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "advarsel: fejl ved søgning efter kommandoer i %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "kunne ikke finde sammenføjningsværktøj %s\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "værktøj %s kan ikke håndtere symbolske lænker\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "værktøj %s kan ikke håndtere binære filer\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "værktøj %s kræver et GUI\n"
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "sammenføjning af %s fejlede!\n"
+
+msgid "unterminated string"
+msgstr ""
+
+msgid "syntax error"
+msgstr "syntaksfejl"
+
+msgid "missing argument"
+msgstr "manglende parameter"
+
+msgid "can't use a list in this context"
+msgstr "en liste kan ikke bruges i denne konteks"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+
+#. i18n: "modified" is a keyword
+#, fuzzy
+msgid "modified takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+
+#. i18n: "added" is a keyword
+#, fuzzy
+msgid "added takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+
+#. i18n: "removed" is a keyword
+#, fuzzy
+msgid "removed takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+
+#. i18n: "deleted" is a keyword
+#, fuzzy
+msgid "deleted takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "unknown" is a keyword
+#, fuzzy
+msgid "unknown takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "ignored" is a keyword
+#, fuzzy
+msgid "ignored takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+
+#. i18n: "clean" is a keyword
+#, fuzzy
+msgid "clean takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "ikke en funktion: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+
+#. i18n: "binary" is a keyword
+#, fuzzy
+msgid "binary takes no arguments"
+msgstr "bookmark tager et eller to argumenter"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+
+#. i18n: "exec" is a keyword
+#, fuzzy
+msgid "exec takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+
+#. i18n: "symlink" is a keyword
+#, fuzzy
+msgid "symlink takes no arguments"
+msgstr "%s.%s symbolsk lænke er ikke noget mål"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+
+#. i18n: "resolved" is a keyword
+#, fuzzy
+msgid "resolved takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+
+#. i18n: "unresolved" is a keyword
+#, fuzzy
+msgid "unresolved takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+
+#, fuzzy
+msgid "hgignore takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+
+#, fuzzy
+msgid "grep requires a pattern"
+msgstr "rev kræver et tal"
+
+#, fuzzy, python-format
+msgid "couldn't parse size: %s"
+msgstr "kan ikke parse cat-log af %s"
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+
+#. i18n: "size" is a keyword
+#, fuzzy
+msgid "size requires an expression"
+msgstr "id kræver en streng"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+
+#. i18n: "encoding" is a keyword
+#, fuzzy
+msgid "encoding requires an encoding name"
+msgstr "qfold kræver navnet på mindst én rettelse"
+
+#, fuzzy, python-format
+msgid "unknown encoding '%s'"
+msgstr "ukendt funktion '%s'"
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+
+#. i18n: "copied" is a keyword
+#, fuzzy
+msgid "copied takes no arguments"
+msgstr "tag tager et eller to argumenter"
+
+#, fuzzy
+msgid "invalid token"
+msgstr "ugyldig mønster"
+
+msgid "starting revisions are not directly related"
+msgstr "startrevisionerne er ikke direkte relaterede"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "inkonsistent tilstant, %s:%s er god og dårlig"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr "ukendt halverings-type %s"
+
+msgid "invalid bisect state"
+msgstr "ugyldig tilstand for halvering"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr ""
+
+msgid "disabled extensions:"
+msgstr "deaktiverede udvidelser:"
+
+msgid "Configuration Files"
+msgstr "Konfigurationsfiler"
+
+msgid "Date Formats"
+msgstr "Datoformater"
+
+msgid "File Name Patterns"
+msgstr "Mønstre for filnavne"
+
+msgid "Environment Variables"
+msgstr "Miljøvariable"
+
+msgid "Specifying Single Revisions"
+msgstr "Angivning af en enkelt revision"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Angivning af flere revisioner"
+
+msgid "Specifying Revision Sets"
+msgstr "Angivning af af mængder af revisioner"
+
+#, fuzzy
+msgid "Specifying File Sets"
+msgstr "Angivning af af mængder af revisioner"
+
+msgid "Diff Formats"
+msgstr ""
+
+msgid "Merge Tools"
+msgstr ""
+
+msgid "Template Usage"
+msgstr "Brug af skabeloner"
+
+msgid "URL Paths"
+msgstr "URL-stier"
+
+msgid "Using additional features"
+msgstr "Brug af yderligere funktioner"
+
+msgid "Subrepositories"
+msgstr "Underdepoter"
+
+msgid "Configuring hgweb"
+msgstr "Konfigurering af hgweb"
+
+msgid "Glossary"
+msgstr ""
+
+#, fuzzy
+msgid "syntax for Mercurial ignore files"
+msgstr "%s: ej et Mercurial bundt"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Konfigurationsfilerne til Mercurial bruger et simpelt ini-filformat.\n"
+"En konfigurationsfil består af sektioner, som startes af et\n"
+"``[sektion]`` hovede og efterfølges af ``navn = værdi`` indgange::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Fornavn Efternavn <fornavn.efternavn@example.net>\n"
+" verbose = True"
+
+#, fuzzy
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"Indgangene ovenfor vil blive refereret til som henholdsvis\n"
+"``ui.username`` og ``ui.verbose``. Se venligst hgrc manualsiden for en\n"
+"fuld beskrivelse af de mulige konfigurationsværdier:"
+
+msgid ""
+"Files\n"
+"-----"
+msgstr ""
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+
+msgid "| (Unix, Windows) ``<repo>/.hg/hgrc``"
+msgstr ""
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Unix, most of this file will be ignored if it doesn't belong to a\n"
+" trusted user or to a trusted group. See the documentation for the\n"
+" ``[trusted]`` section below for more details."
+msgstr ""
+
+msgid ""
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+
+msgid ""
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"- ``<repo>/.hg/hgrc``\n"
+"- ``$HOME/.hgrc``\n"
+"- ``/etc/mercurial/hgrc``\n"
+"- ``/etc/mercurial/hgrc.d/*.rc``\n"
+"- ``<install-root>/etc/mercurial/hgrc``\n"
+"- ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected. If the\n"
+" pywin32 extensions are not installed, Mercurial will only look for\n"
+" site-wide configuration in ``C:\\Mercurial\\Mercurial.ini``."
+msgstr ""
+
+msgid ""
+"Syntax\n"
+"------"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+"Konfigurationsfilerne til Mercurial bruger et simpelt ini-filformat.\n"
+"En konfigurationsfil består af sektioner, som startes af et\n"
+"``[sektion]`` hovede og efterfølges af ``navn = værdi`` indgange::"
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr ""
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr ""
+
+msgid "to include a different configuration file on each computer you use."
+msgstr ""
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr ""
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+
+msgid ""
+"Sections\n"
+"--------"
+msgstr ""
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+
+msgid ""
+"``alias``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr ""
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr ""
+
+msgid "For example, this definition::"
+msgstr ""
+
+msgid " latest = log --limit 5"
+msgstr ""
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+
+msgid " stable5 = latest -b stable"
+msgstr ""
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+
+msgid " echo = !echo"
+msgstr ""
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr ""
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expand to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+
+msgid ""
+"``auth``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+
+msgid "Each line has the following format::"
+msgstr ""
+
+msgid " <name>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+
+#, fuzzy
+msgid "Supported arguments:"
+msgstr "inkompatible argumenter"
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+
+#, fuzzy
+msgid "Pipe example::"
+msgstr "Fillisteeksempler::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+
+msgid ""
+"\n"
+"``defaults``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr ""
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+
+msgid ""
+"\n"
+"``diff``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified`` is a\n"
+"Boolean and defaults to False."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr "brug git udvidet diff-format"
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr "vis hvilken funktion hver ændring er i"
+
+#, fuzzy
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr "ignorer blanktegn når linier sammenlignes"
+
+#, fuzzy
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr "ignorer ændringer i mængden af blanktegn"
+
+#, fuzzy
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr "ignorer ændringer hvis linier alle er blanke"
+
+#, fuzzy
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr "antal linier kontekst der skal vises"
+
+msgid ""
+"``email``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Settings for extensions that send email messages."
+msgstr ""
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+
+msgid " Order of outgoing email character sets:"
+msgstr ""
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+
+#, fuzzy
+msgid "Email example::"
+msgstr "Fillisteeksempler::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+
+msgid ""
+"\n"
+"``extensions``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"For eksplicit at deaktivere en udvidelse som er slået til i en mere\n"
+"bredt dækkende konfigurationsfil, så skal man sætte et ! foran dens\n"
+"sti::"
+
+#, fuzzy
+msgid "Example for ``~/.hgrc``::"
+msgstr "Et eksempel på en versioneret ``.hgeol`` fil::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+
+#, fuzzy
+msgid "For example::"
+msgstr "Fillisteeksempler::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+
+msgid ""
+"\n"
+"``format``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+
+msgid ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+
+msgid ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+
+#, fuzzy
+msgid "Example ``~/.hgrc``::"
+msgstr "Et eksempel på en versioneret ``.hgeol`` fil::"
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"\n"
+"``hooks``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string."
+msgstr ""
+
+msgid "Example ``.hg/hgrc``::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook"
+msgstr ""
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr ""
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+
+msgid ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+
+msgid ""
+"\n"
+"``patch``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+
+msgid ""
+"\n"
+"``paths``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+
+msgid ""
+"\n"
+"``profiling``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Specifies profiling format and file output. In this section\n"
+"description, 'profiling data' stands for the raw data collected\n"
+"during profiling, while 'profiling report' stands for a statistical\n"
+"text report generated from the profiling data. The profiling is done\n"
+"using lsprof."
+msgstr ""
+
+msgid ""
+"``format``\n"
+" Profiling format.\n"
+" Default: text."
+msgstr ""
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+
+msgid ""
+"``revsetalias``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+
+msgid ""
+"``server``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Controls generic server settings."
+msgstr ""
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+
+msgid ""
+"``subpaths``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Defines subrepositories source locations rewriting rules of the form::"
+msgstr ""
+
+msgid " <pattern> = <replacement>"
+msgstr ""
+
+msgid ""
+"Where ``pattern`` is a regular expression matching the source and\n"
+"``replacement`` is the replacement string used to rewrite it. Groups\n"
+"can be matched in ``pattern`` and referenced in ``replacements``. For\n"
+"instance::"
+msgstr ""
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr ""
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr ""
+
+msgid "All patterns are applied in definition order."
+msgstr ""
+
+msgid ""
+"``trusted``\n"
+"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+
+msgid ""
+"\n"
+"``ui``\n"
+"\"\"\"\"\"\""
+msgstr ""
+
+msgid "User interface controls."
+msgstr ""
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"\n"
+"``web``\n"
+"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr ""
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+
+#, fuzzy
+msgid "The full set of options is:"
+msgstr "Den første gode revision er:\n"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates. The form must be as follows::"
+msgstr ""
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has one.\n"
+" On most Linux systems this will be ``/etc/ssl/certs/ca-certificates."
+"crt``.\n"
+" Otherwise you will have to generate this file manually."
+msgstr ""
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr "port der skal lyttes på (standard: 8000)"
+
+#, fuzzy
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr "prefiks sti at udstille fra (default: server-rod)"
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr "skabelon-stil"
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "Nogle kommandoer tillader brugeren at specificere en dato, f.eks.:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: specificer commit-datoen.\n"
+"- log, revert, update: vælg revisioner efter dato."
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "Der er mange gyldige datoformater. Her er nogle eksempler:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (antager lokal tidszone)\n"
+"- ``Dec 6 13:18 -0600`` (antager år, tidszone er angivet)\n"
+"- ``Dec 6 13:18 UTC`` (UTC og GMT er aliaser for +0000)\n"
+"- ``Dec 6`` (midnat)\n"
+"- ``13:18`` (antager dags dato)\n"
+"- ``3:39``\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (6. dec. 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "Endelig er der Mercurials interne format:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (Ons 6. dec. 13:18:29 2006 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"Dette er den interne repræsentation af datoer. Det første tal er\n"
+"antallet af sekunder siden begyndelsen af epoken (1970-01-01 00:00\n"
+"UTC). Det andet tal er den lokale tidszone, angivet i antal sekunder\n"
+"vest for UTC (negativ hvis tidszonen er øst for UTC)."
+
+msgid "The log command also accepts date ranges:"
+msgstr "Kommandoen log accepterer også datointervaller:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+"- ``<DATO`` - på eller før den angivne dato/tidspunkt\n"
+"- ``>DATO`` - på eller efter den angivne dato/tidspunkt\n"
+"- ``DATO to DATO`` - et datointerval, inklusiv endepunkterne\n"
+"- ``-DAGE`` - indenfor et angivet antal dage, fra dags dato\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use configuration file)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"Det er muligt at tilføje nye funktionalitet til Mercurial ved brug af\n"
+"udvidelser. Udvidelser kan tilføje nye kommandoer, tilføje tilvalg til\n"
+"eksisterende kommandoer ændre standardopførslen for kommandoer eller\n"
+"implementere \"hooks\"."
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"Udvidelser bliver ikke indlæst som standard af flere årsager: de øger\n"
+"opstartstiden, de kan potentielt komme med farlig funktionalitet\n"
+"(såsom at lade dig ødelægge eller ændre historien), de er måske ikke\n"
+"klart til prime time, eller de ændrer måske opførslen af en standard\n"
+"Mercurial. Det er derfor op til brugeren at aktivere udvidelser efter\n"
+"behov."
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"For at aktivere \"foo\" udvidelsen, som enten er kommet sammen med\n"
+"Mercurial eller lagt i Pythons søgesti, lav da en indgang for den i\n"
+"din konfigurationsfil::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr "Du kan også specificere den fulde sti til en udvidelse::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"For eksplicit at deaktivere en udvidelse som er slået til i en mere\n"
+"bredt dækkende konfigurationsfil, så skal man sætte et ! foran dens\n"
+"sti::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # deaktiverer udvidelse bar placeretligger i /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, men der var ikke angivet nogen sti for bar udvidelsen\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr ""
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+
+msgid "These are the supported infix operators:"
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr ""
+
+msgid "The following predicates are supported:"
+msgstr ""
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr "vis ændrede filer i arbejdskataloget"
+
+msgid " hg status -A \"set:binary()\""
+msgstr ""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr ""
+
+#, fuzzy
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid "- Find text files that contain a string::"
+msgstr ""
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr ""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr ""
+
+#, fuzzy
+msgid " hg locate \"set:**.c and not encoding(ascii)\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid "- Revert copies of large binary files::"
+msgstr ""
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr ""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr ""
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr ""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+" Bogmærker er pegepinde til bestemte ændringer og pegepindene\n"
+" flytter sig når man deponerer nye ændringer. Bogmærkerne er\n"
+" lokale. De kan omdøbes, kopieres og slettes. Det er muligt at\n"
+" bruge navne på bogmærker i :hg:`merge` og :hg:`update` for\n"
+" respektivt at sammenføje eller opdatere til det givne bogmærke."
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Changeset, close'."
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+
+msgid ""
+"Synopsis\n"
+"--------"
+msgstr ""
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"Description\n"
+"-----------"
+msgstr "beskrivelse:\n"
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr ""
+
+msgid " syntax: NAME"
+msgstr ""
+
+msgid "where ``NAME`` is one of the following:"
+msgstr ""
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+
+msgid ""
+"Example\n"
+"-------"
+msgstr ""
+
+msgid "Here is an example ignore file. ::"
+msgstr ""
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a collection of them. In the latter case, a special\n"
+"configuration file can be used to specify the repository paths to use\n"
+"and global web configuration options."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files,\n"
+"but only the following sections are recognized:"
+msgstr ""
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+" - web\n"
+" - paths\n"
+" - collections"
+
+msgid ""
+"The ``web`` section can specify all the settings described in the web\n"
+"section of the hgrc(5) documentation. See :hg:`help config` for\n"
+"information on where to find the manual page."
+msgstr ""
+
+msgid ""
+"The ``paths`` section provides mappings of physical repository\n"
+"paths to virtual ones. For instance::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" projects/a = /foo/bar\n"
+" projects/b = /baz/quux\n"
+" web/root = /real/root/*\n"
+" / = /real/root2/*\n"
+" virtual/root2 = /real/root2/**"
+msgstr ""
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry maps every Mercurial repository found in '/real/root'\n"
+" into 'web/root'. This format is preferred over the [collections] one,\n"
+" since using absolute paths as configuration keys is not supported on "
+"every\n"
+" platform (especially on Windows).\n"
+"- The fourth entry is a special case mapping all repositories in\n"
+" '/real/root2' in the root of the virtual directory.\n"
+"- The fifth entry recursively finds all repositories under the real\n"
+" root, and maps their relative paths under the virtual root."
+msgstr ""
+
+msgid ""
+"The ``collections`` section provides mappings of trees of physical\n"
+"repositories paths to virtual ones, though the paths syntax is generally\n"
+"preferred. For instance::"
+msgstr ""
+
+msgid ""
+" [collections]\n"
+" /foo = /foo"
+msgstr ""
+" [collections]\n"
+" /foo = /foo"
+
+msgid ""
+"Here, the left side will be stripped off all repositories found in the\n"
+"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+"``bar`` and ``quux/baz`` respectively.\n"
+msgstr ""
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+" Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+" Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+" Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+" Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+" Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+" Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+"Når Mercurial accepterer mere end en revision, så kan de angives\n"
+"individuelt eller angives som et topologisk sammenhængende interval,\n"
+"adskildt af et \":\" tegn."
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+"Syntaksen for intervalnotationen er [START]:[SLUT] hvor START og SLUT\n"
+"identificerer revisioner. BÃ¥de START og SLUT er valgfri. Hvis START\n"
+"ikke angivet, så bruges revision nummer 0 som standard. Hvis SLUT ikke\n"
+"angives, så bruges tip som standard. Intervallet \":\" betyder således\n"
+"\"alle revisioner\"."
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+"Hvis START er større end SLUT, så behandles revisionerne i omvendt\n"
+"rækkefølge."
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+"Intervaller er lukkede. Det betyder at et interval 3:5 giver 3, 4 og\n"
+"5. Ligeledes giver intervallet 9:6 revisionerne 9, 8, 7, 6.\n"
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+
+msgid "File examples::"
+msgstr "Fillisteeksempler::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as branch names must be quoted with single or double\n"
+"quotes if they contain characters outside of\n"
+"``[._a-zA-Z0-9\\x80-\\xff]`` or if they match one of the predefined\n"
+"predicates."
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+
+msgid " An alternative syntax is ``x..y``."
+msgstr ""
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+
+#, fuzzy
+msgid "There is a single postfix operator:"
+msgstr "Der er en enkelt konfigurationsmulighed::"
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+
+msgid " <alias> = <definition>"
+msgstr ""
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+
+#, fuzzy
+msgid "For example,"
+msgstr "Fillisteeksempler::"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ""
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+
+msgid "- Changesets on the default branch::"
+msgstr "- Ændringer på default grenen::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr " hg log -r \"branch(default)\""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr " hg log -r \"branch(default) and 1.5:: and not merge()\""
+
+msgid "- Open branch heads::"
+msgstr "- Ã…bne grenhoveder::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr " hg log -r \"1.3::1.5 and keyword(bug) and file(\"hgext/*\")\""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr " hg log -r \"sort(date(\"May 2008\"), user)\""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+
+msgid "Subrepositories are made of three components:"
+msgstr ""
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr ""
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"----------------------"
+msgstr ""
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"-----------------------------"
+msgstr ""
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+
+msgid ""
+"Deleting a Subrepository\n"
+"------------------------"
+msgstr ""
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"-----------------------------------"
+msgstr ""
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"---------------------------------"
+msgstr ""
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ".. keywordsmarker"
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ".. filtersmarker\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr " ssh://example.com//tmp/repository"
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "remote branch lookup not supported"
+msgstr ""
+
+msgid "dirstate branch not accessible"
+msgstr ""
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "ukendt gren '%s'"
+
+msgid "can only share local repositories"
+msgstr "kan kun dele lokale depoter"
+
+msgid "destination already exists"
+msgstr "destinationen eksisterer allerede"
+
+msgid "updating working directory\n"
+msgstr "opdaterer arbejdskatalog\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "målkatalog: %s\n"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "målet '%s' eksisterer allerede"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "målet '%s' er ikke tomt"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr "kloning fra fjerndepot til fjerndepot er ikke understøttet"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "opdaterer til gren %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "brug 'hg resolve' for at prøve at sammenføje uløste filer igen\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"brug 'hg resolve' for at prøve at sammenføje uløste filer igen eller 'hg up -"
+"C .' for at opgive\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(grensammenføjning, glem ikke at deponere)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "konfigurationsfilen %s blev ikke fundet!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "fejl ved læsning af %s/.hg/hgrc: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "kunne ikke tilgå depot ved %s\n"
+
+msgid "SSL support is unavailable"
+msgstr "understøttelse for SSL er ikke tilstede"
+
+msgid "IPv6 is not available on this system"
+msgstr "IPv6 er ikke til rådighed på dette system"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "kan ikke starte server på '%s:%d': %s"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr "%d filer ændret, %d indsættelser(+), %d sletninger(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+msgid "exception from first failed import attempt:\n"
+msgstr "fejltekst fra første fejlede import-forsøg:\n"
+
+msgid "exception from second failed import attempt:\n"
+msgstr "fejltekst fra andet fejlede import-forsøg:\n"
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "kb"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorerer ugyldig [auth] nøgle '%s'\n"
+
+msgid "connection ended unexpectedly"
+msgstr "forbindelsen blev uventet afsluttet"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "ikke-understøttet URL-komponent: \"%s\""
+
+msgid "operation not supported over http"
+msgstr "operationen understøttes ikke over http"
+
+msgid "authorization failed"
+msgstr "autorisation fejlede"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "http-fejl, skyldes muligvis proxy-indstillinger"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "den rigtige URL er %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' ser ikke ud til at være et hg depot:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' sendte ødelagt Content-Type header (%s)"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' bruger nyere protokol %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "skub fejlede: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "Python support for SSL og HTTPS er ikke installeret"
+
+msgid "cannot create new http repository"
+msgstr "kan ikke lave nyt http depot"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "ignorerer ugyldig syntaks '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "springer ulæselig ignorefil '%s' over: %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "depotet %s blev ikke fundet"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "depotet %s eksisterer allerede"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ".hg/sharedpath peger på et ikke-eksisterende katalog %s"
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr "advarsel: ignorerer ukendt forælder %s til arbejdsbiblioteket!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r kan ikke bruges i et mærkatnavnet"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "advarsel: mærkat %s konflikter med et eksisterende grennavn\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr "arbejdskopien af .hgtags er ændret (deponer venligst .hgtags manuelt)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "arbejdsbiblioteket har ukendt forældre '%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "ukendt revision '%s'"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "fandt en efterladt transaktion - kør hg recover"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "ruller afbrudt transaktion tilbage\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "ingen afbrudt transaktion tilgængelig\n"
+
+msgid "no rollback information available\n"
+msgstr "ingen tilbagerulningsinformation til stede\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "spidsen af depotet rullet tilbage til revision %s (omgør %s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "spidsen af depotet rullet tilbage til revision %s (omgør %s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "ruller ukendt transaktion tilbage\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+
+msgid "use -f to force"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr ""
+"Navngiven gren kunne ikke nulstilles, den nuværende gren er stadig: %s\n"
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr ""
+"arbejdsbiblioteket er nu baseret på revisionerne %d og %d\n"
+"\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "arbejdsbiblioteket er nu baseret på revision %d\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "venter på lås af %s holdt af %r\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "depot %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "arbejdskatalog for %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"kan ikke deponere en sammenføjning partielt (undgå at specificere filer "
+"eller mønstre)"
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "kan ikke deponere underdepoter uden .hgsub"
+
+msgid "use --subrepos for recursive commit"
+msgstr ""
+
+msgid "file not found!"
+msgstr "filen blev ikke fundet!"
+
+msgid "no match under directory!"
+msgstr "ingen træffer under kataloget!"
+
+msgid "file not tracked!"
+msgstr "filen følges ikke!"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "uløste sammenføjningskonflikter (se hg help resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "deponerer underdepot %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "bemærk: deponeringsbeskeden er gemt i %s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "problem ved deponering %s!\n"
+
+msgid "requesting all changes\n"
+msgstr "anmoder om alle ændringer\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "fandt %d ændringer\n"
+
+msgid "bundling"
+msgstr "bundter"
+
+msgid "manifests"
+msgstr "manifester"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "tom eller manglende revlog for %s"
+
+msgid "adding changesets\n"
+msgstr "tilføjer ændringer\n"
+
+msgid "chunks"
+msgstr ""
+
+msgid "received changelog group is empty"
+msgstr "modtagen changelog-gruppe er tom"
+
+msgid "adding manifests\n"
+msgstr "tilføjer manifester\n"
+
+msgid "adding file changes\n"
+msgstr "tilføjer filændringer\n"
+
+msgid "received file revlog group is empty"
+msgstr ""
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d hoveder)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "tilføjede %d ændringer med %d ændringer i %d filer%s\n"
+
+msgid "Unexpected response from remote server:"
+msgstr "Uventet svar fra fjernserver:"
+
+msgid "operation forbidden by server"
+msgstr "operationen er forbudt af serveren"
+
+msgid "locking the remote repository failed"
+msgstr "låsning af fjerndepotet fejlede"
+
+msgid "the server sent an unknown error code"
+msgstr "serveren sendte en ukendt fejlkode"
+
+msgid "streaming all changes\n"
+msgstr "streamer alle ændringer\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d filer at overføre, %s data\n"
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "overførte %s i %.1f sekunder (%s/sek)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "kan ikke bruge TLS: Python SSL support er ikke installeret"
+
+msgid "(using smtps)\n"
+msgstr "(bruger smtps)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr ""
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "sender mail: smtp host %s, port %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(bruger starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(autentificerer til mailserver som %s)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "sender post: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "ignorerer ugyldigt sendcharset: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "ugyldig e-post-adresse: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "ugyldig lokal adresse: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' og '\\r' må ikke forekomme i filnavne: %r"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "kunne ikke fjerne %s fra manifest"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "ugyldigt mønster (%s): %s"
+
+msgid "invalid pattern"
+msgstr "ugyldig mønster"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "kan ikke læse filliste (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid ""
+"untracked file in working directory differs from file in requested revision: "
+"'%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr "løser manifester\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+msgid "updating"
+msgstr "opdaterer"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "opdatering kunne ikke fjerne %s: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "henter %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "henter %s til %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr ""
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr "sammenføjning med en forfader til arbejdskataloget har ingen effekt"
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr "intet at sammenføje (brug 'hg update' eller kontroller 'hg heads')"
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr ""
+"udestående ikke-deponerede ændringer (brug 'hg status' for at se ændringer)"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "udeponerede ændringer i underdepot '%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+"krydser grene (sammenføj grenene eller brug --clean for at kassere "
+"ændringerne)"
+
+#, fuzzy
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+"krydser grene (sammenføj grenene eller brug --check for at forcere "
+"opdateringen)"
+
+msgid "Attention:"
+msgstr ""
+
+msgid "Caution:"
+msgstr "Forsigtig:"
+
+msgid "!Danger!"
+msgstr "!Fare!"
+
+msgid "Error:"
+msgstr "Fejl:"
+
+msgid "Hint:"
+msgstr ""
+
+msgid "Important:"
+msgstr "Vigtigt:"
+
+msgid "Note:"
+msgstr "Bemærk:"
+
+msgid "Tip:"
+msgstr "Tip:"
+
+msgid "Warning!"
+msgstr "Advarsel!"
+
+#, fuzzy, python-format
+msgid "unexpected token: %s"
+msgstr "uventet svar:"
+
+#, fuzzy, python-format
+msgid "not a prefix: %s"
+msgstr "ikke en funktion: %s"
+
+#, fuzzy, python-format
+msgid "not an infix: %s"
+msgstr "ikke en funktion: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "fjerner ikke %s: filen følges ikke\n"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "kan ikke finde '%s' til retning\n"
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "retter fil %s\n"
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "kan ikke oprette %s: destinationen findes allerede"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "filen %s eksisterer allerede\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr ""
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr "binær rettelse er %d byte, ikke %d"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "kan ikke strippe %d ud af %d kataloger fra %s"
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "kan ikke oprette %s: destinationen findes allerede"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "patch kommando fejlede: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "linieendelse %s understøttes ikke"
+
+msgid "patch failed to apply"
+msgstr "rettelse kunne ikke tilføjes"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "afsluttede med status %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "dræbt af signal %d"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "gemmer backup-bundt i %s\n"
+
+msgid "adding branch\n"
+msgstr "tilføjer gren\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "kan ikke %s: fjerdepotet understøtter ikke %r egenskaben"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "ukendt kompressionstype %r"
+
+msgid "index entry flags need RevlogNG"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr "indeks %s ukendt flag %#04x for format v0"
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "indeks %s ukendt flag %#04x for revlogng"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "indeks %s ukendt format %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "indeks %s er ødelagt"
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s ikke fundet i transaktionen"
+
+msgid "consistency error in delta"
+msgstr "konsistensfejl i delta"
+
+#, fuzzy
+msgid "unknown delta base"
+msgstr "ukendt databaseskema"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "kan ikke bruge %s her"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr ""
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr ""
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+
+#, fuzzy
+msgid "~ expects a number"
+msgstr "rev forventer et revisionsnummer"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr ""
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology"
+msgstr ""
+
+msgid "bisect requires a string"
+msgstr "bisect kræver en streng"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+"``bookmark([name])``\n"
+" Det navngivne bogmærke eller alle bogmærker."
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark tager et eller to argumenter"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "argumentet til bookmark skal være en streng"
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr ""
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr ""
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr ""
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+
+#. i18n: "desc" is a keyword
+#, fuzzy
+msgid "desc requires a string"
+msgstr "id kræver en streng"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+
+#, fuzzy
+msgid "filelog requires a pattern"
+msgstr "id kræver en streng"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments or a filename"
+msgstr ""
+
+#, fuzzy
+msgid "follow expected a filename"
+msgstr "vis filnavnet"
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments"
+msgstr ""
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr ""
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr ""
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "ugyldigt søgemønster: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr ""
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr ""
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr ""
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+
+#. i18n: "limit" is a keyword
+#, fuzzy
+msgid "limit requires one or two arguments"
+msgstr "limit kræver to argumenter"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit kræver et tal"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr ""
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+
+#. i18n: "last" is a keyword
+#, fuzzy
+msgid "last requires one or two arguments"
+msgstr "limit kræver to argumenter"
+
+#. i18n: "last" is a keyword
+#, fuzzy
+msgid "last requires a number"
+msgstr "limit kræver et tal"
+
+#. i18n: "last" is a keyword
+#, fuzzy
+msgid "last expects a number"
+msgstr "rev forventer et revisionsnummer"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr ""
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr ""
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id kræver et argument"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id kræver en streng"
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+
+#. i18n: "outgoing" is a keyword
+#, fuzzy
+msgid "outgoing takes one or no arguments"
+msgstr "tag tager et eller to argumenter"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr ""
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+
+#, fuzzy
+msgid "^ expects a number 0, 1, or 2"
+msgstr "rev forventer et revisionsnummer"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr ""
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev kræver et argument"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev kræver et tal"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev forventer et revisionsnummer"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+
+msgid ""
+"``roots(set)``\n"
+" Changesets with no parent changeset in set."
+msgstr ""
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+
+msgid " The keys can be:"
+msgstr ""
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr ""
+
+msgid "sort spec must be a string"
+msgstr ""
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "ukendt sorteringsnøgle %r"
+
+#, fuzzy
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+"``tag(navn)``\n"
+" Den navngivne mærkat eller alle revisioner med en mærkat hvis der\n"
+" ikke angives noget navn."
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag tager et eller to argumenter"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "argumentet til tag skal være en streng"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+
+msgid "can't negate that"
+msgstr ""
+
+msgid "not a symbol"
+msgstr "ikke et symbol"
+
+#, fuzzy, python-format
+msgid "invalid number of arguments: %s"
+msgstr "ugyldige parametre"
+
+msgid "empty query"
+msgstr "tomt forespørgsel"
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr ""
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr ""
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr ""
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "stien indeholder ugyldig komponent: %s"
+
+#, python-format
+msgid "path %r is inside nested repo %r"
+msgstr "stien %r er inden i depotet %r"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "stien %r følger symbolsk link %r"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "kunne ikke lave et symbolsk link til %r: %s"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr "noterer fjernelse af %s som en omdøbning til %s (%d%% lighed)\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+"%s er endnu ikke comitted, så der vil ikke blive gemt kopieringsdata for "
+"%s.\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr "leder efter ændringer\n"
+
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr "søger"
+
+msgid "repository is unrelated"
+msgstr "depotet er urelateret"
+
+msgid "warning: repository is unrelated\n"
+msgstr "advarsel: depotet er urelateret\n"
+
+msgid "searching for exact renames"
+msgstr "leder efter eksakte omdøbninger"
+
+msgid "searching for similar files"
+msgstr "leder efter lignende filer"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s ser ud som en binær fil."
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr "advarsel: konflikter ved sammenføjning.\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "password in URL not supported"
+msgstr "kodeord i URL'er understøttes ikke"
+
+msgid "could not create remote repo"
+msgstr "kunne ikke oprette fjerndepot"
+
+msgid "no suitable response from remote hg"
+msgstr "intet brugbart svar fra fjernsystemets hg"
+
+msgid "remote: "
+msgstr "fjernsystem: "
+
+#, python-format
+msgid "push refused: %s"
+msgstr "skub afvist: %s"
+
+#, fuzzy
+msgid "Python SSL support not found"
+msgstr "kan ikke bruge TLS: Python SSL support er ikke installeret"
+
+msgid "certificate checking requires Python 2.6"
+msgstr ""
+
+msgid "no certificate received"
+msgstr "modtog ikke noget certifikat"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "certifikatet er for %s"
+
+msgid "IDN in certificate not supported"
+msgstr "IDN er ikke supporteret i certifikatet"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "fandt ikke noget commonName eller subjectAltName i certifikatet"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "kunne ikke finde web.cacerts: %s"
+
+#, python-format
+msgid "%s certificate error: %s (use --insecure to connect insecurely)"
+msgstr ""
+
+#, python-format
+msgid "invalid certificate for %s with fingerprint %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr ""
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' ser ikke ud til at være et hg depot"
+
+msgid "cannot lock static-http repository"
+msgstr "kan ikke låse static-http depot"
+
+msgid "cannot create new static-http repository"
+msgstr "kan ikke oprette nyt static-http depot"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "advarsel: underdepot spec-fil %s blev ikke fundet\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "underdepot spec-fil %s blev ikke fundet"
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr ""
+
+msgid "missing ] in subrepo source"
+msgstr "manglende ] i underdepot kilde"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr ""
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "ukendt underdepottype %s"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "arkiverer (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "advarsel: fejl \"%s\" i underdepot \"%s\"\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "fjerner underdepot %s\n"
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "kloner underdepot %s fra %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "hiver underdepot %s fra %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "skubber underdepot %s til %s\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr ""
+
+#, fuzzy
+msgid "cannot retrieve svn tool version"
+msgstr "kan ikke hente hoveder fra git"
+
+msgid "cannot commit svn externals"
+msgstr "kan ikke deponere svn externals"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "fjerner ikke depotet %s fordi det er ændret.\n"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "revision %s findes ikke i underdepot %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr ""
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr ""
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "underdepot %s mangler"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "skubber gren %s af underdepot %s\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s"
+msgstr ""
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, linie %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "knude '%s' er ikke korrekt formet"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ""
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ""
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ""
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ""
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ""
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+
+msgid ":person: Any text. Returns the text before an email address."
+msgstr ""
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ""
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+
+msgid ":user: Any text. Returns the user portion of an email address."
+msgstr ""
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ""
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ""
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ""
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ""
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ""
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ""
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ""
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ""
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ""
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ""
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ""
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ""
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "ukendt metode '%s'"
+
+msgid "expected a symbol"
+msgstr "forventede et symbol"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "ukendt funktion '%s'"
+
+msgid "expected template specifier"
+msgstr ""
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "filter %s kræver et argument"
+
+msgid "unmatched quotes"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" er ikke i skabelon-fil"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "skabelon-fil %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "kunne ikke trunkere %s\n"
+
+msgid "transaction abort!\n"
+msgstr "transaktionen er afbrudt!\n"
+
+msgid "rollback completed\n"
+msgstr "tilbagerulning gennemført\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "tilbagerulning fejlede - kør venligst hg recover\n"
+
+msgid "already have changeset "
+msgstr "har allerede ændringen "
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr "Stoler ikke på filen %s fra ubetroet bruger %s, gruppe %s\n"
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr "Ignoreret: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s er ikke en sandhedsværdi ('%s')"
+
+#, fuzzy, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s er ikke en sandhedsværdi ('%s')"
+
+msgid "enter a commit username:"
+msgstr "angiv et deponeringsbrugernavn:"
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr "Fandt intet brugernavn, bruger '%s' istedet\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "intet brugernavn angivet (se \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "brugernavn %s indeholder et linieskift\n"
+
+msgid "response expected"
+msgstr "svar forventet"
+
+msgid "unrecognized response\n"
+msgstr "svar ikke genkendt\n"
+
+msgid "password: "
+msgstr "kodeord: "
+
+msgid "edit failed"
+msgstr "redigering fejlede"
+
+msgid "http authorization required"
+msgstr ""
+
+msgid "http authorization required\n"
+msgstr ""
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "realm: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "bruger: %s\n"
+
+msgid "user:"
+msgstr "bruger:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "http godkendelse: bruger %s, kodeord %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "kommandoen '%s' fejlede: %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr ""
+
+msgid "check your clock"
+msgstr ""
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr ""
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "ugyldig dato: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "dato overskrider 32 bit: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr ""
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "umuligt tidszone: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "datoer kan ikke bestå udelukkende af tomrum"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr "ugyldig datospecifikation, brug '<DATO'"
+
+msgid "invalid day spec, use '>DATE'"
+msgstr "ugyldig datospecifikation, brug '>DATO'"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "ugyldig datospecifikation: %s"
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f byte"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "der er ikke knyttet noget portnummer til servicen '%s'"
+
+msgid "file:// URLs can only refer to localhost"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr "kan ikke verificere bundt eller fjerndepoter"
+
+msgid "interrupted"
+msgstr "afbrudt"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "tom eller manglende %s"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "datalænge er %d byte forkert"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "indekset indeholder %d ekstra byte"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "advarsel: '%s' bruger revlog format 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "advarsel: '%s' bruger revlog format 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "rev %d peger på ikke eksisterende ændring %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "rev %d peger på uventet ændring %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (forventede %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "ukendt forælder 1 %s til %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "ukendt forælder 2 %s til %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "kontrollerer forældre til %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "duplikeret revision %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "fandt efterladt transaktion - kør hg recover\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "depotet bruger revlog format %d\n"
+
+msgid "checking changesets\n"
+msgstr "kontrollerer ændringer\n"
+
+msgid "checking"
+msgstr "kontrollerer"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "udpakker ændring %s"
+
+msgid "checking manifests\n"
+msgstr "kontrollerer manifester\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s ikke i ændringer"
+
+msgid "file without name in manifest"
+msgstr "fil uden navn i manifest"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "læser manifestforskel %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "krydstjekker filer i ændringer og manifester\n"
+
+msgid "crosschecking"
+msgstr "krydstjekker"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "ændring refererer til et ukendt manifest %s"
+
+msgid "in changeset but not in manifest"
+msgstr "i ændring men ikke i manifest"
+
+msgid "in manifest but not in changeset"
+msgstr "i manifest men ikke i ændring"
+
+msgid "checking files\n"
+msgstr "kontrollerer filer\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "kan ikke dekode filnavn '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "beskadiget revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "manglende revlog!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s findes ikke i manifestet"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "udpakket størrelse er %s, forventede %s"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "udpakker %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr ""
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "kontrollerer omdøbning af %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr ""
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "advarsel: forældreløs revlog '%s'"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d filer, %d ændringer, ialt %d revisioner\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "fandt %d advarsler!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "fandt %d integritetsfejl!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(første beskadigede ændring er tilsyneladende %d)\n"
+
+msgid "look up remote revision"
+msgstr ""
+
+msgid "push failed (unexpected response):"
+msgstr "skub fejlede (uventet svar):"
+
+msgid "look up remote changes"
+msgstr ""
+
+msgid "push failed:"
+msgstr "skub fejlede:"
+
+#~ msgid "%s already exists"
+#~ msgstr "%s eksisterer allerede"
+
+#~ msgid "A patch named %s already exists in the series file"
+#~ msgstr "En rettelse ved navn %s eksisterer allerede i serien"
+
+#~ msgid ""
+#~ " [extensions]\n"
+#~ " notify ="
+#~ msgstr ""
+#~ " [extensions]\n"
+#~ " notify ="
+
+#~ msgid "interpret suffixes to refer to ancestor revisions"
+#~ msgstr "fortolk suffikser for at referere til forfader-revisioner"
+
+#~ msgid ""
+#~ "This extension allows you to use git-style suffixes to refer to the\n"
+#~ "ancestors of a specific revision."
+#~ msgstr ""
+#~ "Denne udvidelse lader dig bruge suffikser i stil med git for at\n"
+#~ "referere til forfædrerne til en bestemt revision."
+
+#~ msgid "For example, if you can refer to a revision as \"foo\", then::"
+#~ msgstr ""
+#~ "For eksempel, hvis du har referere til en revision som \"foo\", så::"
+
+#~ msgid ""
+#~ " foo^N = Nth parent of foo\n"
+#~ " foo^0 = foo\n"
+#~ " foo^1 = first parent of foo\n"
+#~ " foo^2 = second parent of foo\n"
+#~ " foo^ = foo^1"
+#~ msgstr ""
+#~ " foo^N = N'te forældre til foo\n"
+#~ " foo^0 = foo\n"
+#~ " foo^1 = første forældre til foo\n"
+#~ " foo^2 = anden forældre til foo\n"
+#~ " foo^ = foo^1"
+
+#~ msgid ""
+#~ " foo~N = Nth first grandparent of foo\n"
+#~ " foo~0 = foo\n"
+#~ " foo~1 = foo^1 = foo^ = first parent of foo\n"
+#~ " foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+#~ msgstr ""
+#~ " foo~N = N'te første bedsteforældre til foo\n"
+#~ " foo~0 = foo\n"
+#~ " foo~1 = foo^1 = foo^ = første forældre til foo\n"
+#~ " foo~2 = foo^1^1 = foo^^ = første forældre til første forældre til foo\n"
+
+#~ msgid "%s Please enter a valid value"
+#~ msgstr "%s Angiv venligst en gyldig værdi"
+
+#~ msgid "Please enter a valid value.\n"
+#~ msgstr "Angiv venligst en gyldig værdi.\n"
+
+#~ msgid "source is descendant of destination"
+#~ msgstr "kilden nedstammer fra destinationen"
+
+#~ msgid "not linkable: %s\n"
+#~ msgstr "kan ikke sammenkædes: %s\n"
+
+#~ msgid "invalid changegroup"
+#~ msgstr "ugyldig changegroup"
+
+#~ msgid "cannot backout a merge changeset without --parent"
+#~ msgstr "kan ikke omgøre en sammenføjning uden --parent"
+
+#~ msgid " See :hg:`help urls` for valid source format details."
+#~ msgstr ""
+#~ " Se :hg:`help urls` for detaljer om gyldige formatter for kilden."
+
+#~ msgid ""
+#~ " It is possible to specify an ``ssh://`` URL as the destination, but "
+#~ "no\n"
+#~ " ``.hg/hgrc`` and working directory will be created on the remote "
+#~ "side.\n"
+#~ " Please see :hg:`help urls` for important details about ``ssh://`` "
+#~ "URLs."
+#~ msgstr ""
+#~ " Det er muligt at specificere en ``ssh://`` URL som destination,\n"
+#~ " men der vil ikke bliver oprettet nogen ``.hg/hgrc`` fil eller\n"
+#~ " noget arbejdskatalog på den anden side. Se venligst :hg:`help\n"
+#~ " urls` for vigtige detaljer om ``ssh://`` URLer."
+
+#~ msgid ""
+#~ " A set of changesets (tags, or branch names) to pull may be specified\n"
+#~ " by listing each changeset (tag, or branch name) with -r/--rev.\n"
+#~ " If -r/--rev is used, the cloned repository will contain only a "
+#~ "subset\n"
+#~ " of the changesets of the source repository. Only the set of "
+#~ "changesets\n"
+#~ " defined by all -r/--rev options (including all their ancestors)\n"
+#~ " will be pulled into the destination repository.\n"
+#~ " No subsequent changesets (including subsequent tags) will be present\n"
+#~ " in the destination."
+#~ msgstr ""
+#~ " Der kan angives en mængde af ændringer (mærkater eller navne på\n"
+#~ " grene) som skal hives ved at angive hver ændring (mærkat eller\n"
+#~ " grennavn) med -r/--rev. Hvis -r/--rev tilvalget bruges, så vil det\n"
+#~ " klonede depot kun indeholde en delmængde af ændringerne i\n"
+#~ " kildedepotet. Det er kun mængden af ændringer defineret af alle\n"
+#~ " -r/--rev tilvalgene (inklusiv alle deres forfædre) som vil blive\n"
+#~ " hevet ind i destinationsdepotet. Ingen efterfølgende revisioner\n"
+#~ " (inklusiv efterfølgende mærkater) vil findes i destinationen."
+
+#~ msgid ""
+#~ " Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+#~ " local source repositories."
+#~ msgstr ""
+#~ " Brug af -r/--rev (eller 'clone kilde#rev destination') medfører\n"
+#~ " --pull, selv ved lokale depoter."
+
+#~ msgid "%s command %s"
+#~ msgstr "%s kommando %s"
+
+#~ msgid "options:\n"
+#~ msgstr "valgmuligheder:\n"
+
+#~ msgid "applied %s\n"
+#~ msgstr "anvendte %s\n"
+
+#~ msgid "not updating, since new heads added\n"
+#~ msgstr "opdaterer ikke idet nye hoveder er tilføjet\n"
+
+#~ msgid ""
+#~ "no files or directories specified; use --all to revert the whole repo"
+#~ msgstr ""
+#~ "ingen filer eller mapper specificeret; brug --all for at føre hele "
+#~ "repo'et tilbage"
+
+#~ msgid "do not prompt, assume 'yes' for any required answers"
+#~ msgstr "spørg ikke, antag alle svar er 'ja'"
+
+#~ msgid "%s not added!\n"
+#~ msgstr "%s ikke tilføjet!\n"
+
+#~ msgid "not in dirstate: %s\n"
+#~ msgstr "ikke i dirstate: %s\n"
+
+#~ msgid ""
+#~ "Mercurial reads configuration data from several files, if they exist.\n"
+#~ "Below we list the most specific file first."
+#~ msgstr ""
+#~ "Mercurial læser konfigurationsdata fra flere filer, hvis de\n"
+#~ "eksisterer. Filerne er angivet nedenfor med den mest specifikke fil\n"
+#~ "først."
+
+#~ msgid "On Windows, these configuration files are read:"
+#~ msgstr "På Windows læses disse konfigurationsfiler:"
+
+#~ msgid ""
+#~ "- ``<repo>\\.hg\\hgrc``\n"
+#~ "- ``%USERPROFILE%\\.hgrc``\n"
+#~ "- ``%USERPROFILE%\\mercurial.ini``\n"
+#~ "- ``%HOME%\\.hgrc``\n"
+#~ "- ``%HOME%\\mercurial.ini``\n"
+#~ "- ``C:\\mercurial\\mercurial.ini`` (unless regkey or hgrc.d\\ or "
+#~ "mercurial.ini found)\n"
+#~ "- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (unless hgrc.d\\ or "
+#~ "mercurial.ini found)\n"
+#~ "- ``<hg.exe-dir>\\hgrc.d\\*.rc`` (unless mercurial.ini found)\n"
+#~ "- ``<hg.exe-dir>\\mercurial.ini``"
+#~ msgstr ""
+#~ "- ``<repo>\\.hg\\hgrc``\n"
+#~ "- ``%USERPROFILE%\\.hgrc``\n"
+#~ "- ``%USERPROFILE%\\Mercurial.ini``\n"
+#~ "- ``%HOME%\\.hgrc``\n"
+#~ "- ``%HOME%\\Mercurial.ini``\n"
+#~ "- ``C:\\Mercurial\\Mercurial.ini`` (med mindre regkey eller hgrc.d\\\n"
+#~ " eller mercurial.ini blev fundet)\n"
+#~ "- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (med mindre hgrc.d\\ eller\n"
+#~ " mercurial.ini blev fundet)\n"
+#~ "- ``<install-dir>\\Mercurial.ini``"
+
+#~ msgid "On Unix, these files are read:"
+#~ msgstr "På Unix læses disse filer:"
+
+#~ msgid ""
+#~ " not trusting file <repo>/.hg/hgrc from untrusted user USER, group GROUP"
+#~ msgstr ""
+#~ " stoler ikke på filen <depot>/.hg/hgrc fra ubetroet bruger BRUGER, "
+#~ "gruppe GRUPPE"
+
+#~ msgid ""
+#~ "- on Unix-like systems: ``man hgrc``\n"
+#~ "- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+#~ msgstr ""
+#~ "- på Unix-agtige systemer: ``man hgrc``\n"
+#~ "- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+
+#~ msgid "requirement '%s' not supported"
+#~ msgstr "betingelse '%s' er ikke understøttet"
+
+#~ msgid "cannot create %s: unable to create destination directory"
+#~ msgstr "kan ikke oprette %s: ikke i stand til at oprette biblioteket"
diff --git a/i18n/de.po b/i18n/de.po
new file mode 100644
index 0000000..7a068f0
--- /dev/null
+++ b/i18n/de.po
@@ -0,0 +1,21662 @@
+# German translations for Mercurial
+# Deutsche Übersetzungen für Mercurial
+# Copyright (C) 2009 Matt Mackall and others
+#
+# Ãœbersetzer:
+# Tobias Bell
+# Fabian Kreutz
+# Christoph Mewes
+# Martin Roppelt
+# Georg Brandl
+# Martin Schröder
+#
+# Ãœbersetzungshilfen
+# ==================
+# Die Ãœbersetzungshilfen wurden in das Wiki verlegt
+# und sind auf jeden Fall einen Blick wert!
+# http://mercurial.selenic.com/wiki/GermanTranslation
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2012-06-15 19:14+0200\n"
+"PO-Revision-Date: 2012-06-19 16:07+0100\n"
+"Last-Translator: Martin Schröder <martinschroeder@vcp-sh.de>\n"
+"Language-Team: \n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (Voreinstellung: %s)"
+
+msgid "Options"
+msgstr "Optionen"
+
+msgid "Commands"
+msgstr "Befehle"
+
+msgid "Extensions"
+msgstr "Erweiterungen"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Dieser Abschnitt enthält Hilfe für Erweiterungen, die zusammen mit Mercurial "
+"ausgeliefert werden. Hilfe für andere Erweiterungen sind über das Hilfe-"
+"System erreichbar."
+
+msgid "Options:"
+msgstr "Optionen:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " Aliase: %s"
+
+msgid "hooks for controlling repository access"
+msgstr "Hooks zur Zugriffsverwaltung"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"Dieser Hook macht es möglich, den Schreibzugriff auf Zweige oder Pfade\n"
+"des Projektarchivs zu erlauben oder verbieten, wenn eingehende\n"
+"Änderungssätze über pretxnchangegroup und pretxncommit empfangen werden."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"Die Autorisierung basiert auf dem lokalen Benutzernamen in dem System\n"
+"wo die Aktion gestartet wird und nicht auf der rein informativen Angabe\n"
+"über die Person(en), die die Übernahme der Änderungen ausgeführt hat."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"Diese Aktion nutzt man am besten in Verbindung mit einer eingeschränkten\n"
+"shell, wie der hgsh. So wird verhindert, dass die Benutzer etwas anderes\n"
+"als eine Schiebe- bzw. Holaktion ausführen, wie z.B. diesen Hook zu\n"
+"deaktivieren. Unsicher ist es auch, wenn mehrere Benutzer denselben\n"
+"Zugriff auf dem Zielsystem haben, da sie nicht unterschieden werden können."
+
+msgid "The order in which access checks are performed is:"
+msgstr "Die Reihenfolge, in der Zugriffsrechte ausgewertet werden, ist:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+"1) Verbotsliste für Zweige (Abschnitt ``acl.deny.branches``)\n"
+"2) Erlaubnisliste für Zweige (Abschnitt ``acl.allow.branches``)\n"
+"3) Verbotsliste für Pfade (Abschnitt ``acl.deny``)\n"
+"4) Erlaubnisliste für Pfade (Abschnitt ``acl.allow``)"
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+"Die Erlaubnis- und Verbotslisten werden in Schlüssel-Wert-Paaren angegeben."
+
+msgid ""
+"Branch-based Access Control\n"
+"..........................."
+msgstr ""
+"Zweig-basierte Zugriffskontrolle\n"
+"................................"
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+"Verwenden Sie Abschnitte ``acl.deny.branches`` und ``acl.allow.branches``,\n"
+"um Zugriffe zweigbasiert zu realisieren.\n"
+"Die Schlüssel in diesem Abschnitt können sein:"
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- ein Zweigname oder\n"
+"- ein Stern-Symbol (*), gleichbedeutend mit \"alle Zweige\";"
+
+msgid "The corresponding values can be either:"
+msgstr "Die entsprechenden Werte können wie folgt angegeben werden:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+"- eine kommaseparierte Liste von Benutzern und Gruppen oder\n"
+"- ein Stern-Symbol, das jeden einschließt;"
+
+msgid ""
+"Path-based Access Control\n"
+"........................."
+msgstr ""
+"Pfad-basierte Zugriffskontrolle\n"
+"..............................."
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+"Benutzen Sie die ``acl.deny`` und ``acl.allow``-Abschnitte, um eine\n"
+"pfadbasierte Zugriffskontrolle umzusetzen. Schlüssel in diesen Bereichen\n"
+"akzeptieren ein Verzeichnismuster (standardmäßig mit glob-Syntax). Die\n"
+"entsprechenden Werte folgen derselben Syntax wie in den anderen o.g.\n"
+"Bereichen."
+
+msgid ""
+"Groups\n"
+"......"
+msgstr ""
+"Gruppen\n"
+"......."
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+"Gruppennamen muss ein ``@``-Symbol vorangestellt werden. Eine Gruppe\n"
+"anzugeben hat denselben Effekt wie alle Benutzer einer Gruppe anzugeben."
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+"Sie können Gruppen-Mitglieder im ``acl.groups``-Bereich definieren. Wenn\n"
+"eine Gruppe nicht existiert und Mercurial auf einem Unix-artigen System\n"
+"läuft, wird die Liste der Benutzer vom Betriebssystem abgerufen.\n"
+"Andernfalls wird ein Ausnahmefehler ausgelöst."
+
+msgid ""
+"Example Configuration\n"
+"....................."
+msgstr ""
+"Beispielkonfiguration\n"
+"....................."
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+" # Verwenden Sie dies, wenn Sie den Zugriff zur Zeit der lokalen Ãœbernahme\n"
+" # (commit) prüfen wollen:\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+" # Verwenden Sie dies, wenn Sie den Zugriff beim Synchronisieren mit\n"
+" # anderen Archiven (Übertragen, Abrufen, Bündeln oder Ausliefern (serve))\n"
+" # prüfen wollen.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+" [acl]\n"
+" # Erlaubt oder verbietet den Zugriff für eingehende Änderungen nur\n"
+" # wenn ihre Quelle hier aufgelistet ist, ansonsten wird immer Zugriff\n"
+" # gewährt. Die Quelle ist \"serve\" für jeden entfernten Zugriff (http\n"
+" # oder ssh), \"push\", \"pull\" oder \"bundle\" wenn die zugehörigen "
+"Befehle\n"
+" # lokal ausgeführt werden.\n"
+" # Voreinstellung: serve\n"
+" sources = serve"
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+" # Jedem wird der Zugriff auf den Zweig \"gesperrt\" verweigert:\n"
+" gesperrt = *"
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+" # Einem bösen Benutzer wird jeder Zugriff verwehrt:\n"
+" * = boeser-benutzer"
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+" # Einige Benutzer erhalten Zugriff auf zweig-a:\n"
+" zweig-a = benutzer-1, benutzer-2, benutzer-3"
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+" # Nur einem Benutzer ist Zugriff auf zweig-b gestattet:\n"
+" zweig-b = benutzer-1"
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+" # Der Administrator darf auf jeden Zweig zugreifen:\n"
+" * = benutzer-admin"
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+" # Jeder darf auf test-zweig zugreifen:\n"
+" test-zweig = *"
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+" [acl.deny]\n"
+" # Dieser Liste wird zuerst geprüft. Wenn ein Treffer gefunden wird,\n"
+" # wird acl.allow nicht geprüft. Allen Benutzern wird Zugriff gewährt,\n"
+" # wenn acl.deny nicht vorhanden ist. Das Format beider Listen:\n"
+" # glob-muster = benutzer, ..., @gruppe, ..."
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+" # Um jeden auszuwählen, verwenden Sie einen Stern für den Benutzernamen:\n"
+" # mein/glob/muster = *"
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+" # benutzer6 wird auf keine Datei Schreibzugriff haben:\n"
+" ** = benutzer6"
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+" # Die Gruppe \"hg-verboten\" wird auf keine Datei Schreibzugriff haben:\n"
+" ** = @hg-verboten"
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+" # Niemand wird in der Lage sein, \"NICHT-ANFASSEN.txt\" zu ändern,\n"
+" # obwohl jeder alle anderen Dateien ändern kann. Siehe unten.\n"
+" src/main/ressourcen/NICHT-ANFASSEN.txt = *"
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+" [acl.allow]\n"
+" # Wenn acl.allow nicht vorhanden ist, sind standardmäßig alle Benutzer\n"
+" # erlaubt. Leeres acl.allow = kein Benutzer erlaubt."
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+" # Benutzer \"doku_autor\" hat Schreibzugriff auf jede Datei innerhalb\n"
+" # des \"doku\"-Verzeichnisses:\n"
+" doku/** = doku_autor"
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+" # Benutzer \"jack\" und die Gruppe \"designer\" haben Schreibzugriff auf\n"
+" # jede Datei innerhalb des \"bilder\"-Verzeichnisses:\n"
+" bilder/** = jack, @designer"
+
+msgid ""
+" # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+" # will have write access to any file under the \"resources\" folder\n"
+" # (except for 1 file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+" # Jeder (ausgenommen \"benutzer6\", siehe acl.deny oben) wird Schreib-\n"
+" # zugriff auf jede Datei innerhalb des \"ressources\"-Verzeichnisses\n"
+" # erhalten (ausgenommen eine Datei; siehe acl.deny):\n"
+" src/main/resources/** = *"
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "Gruppe '%s' ist undefiniert"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"Konfigurationsfehler - Hook-Typ \"%s\" kann weder eingehende "
+"Änderungssätze \n"
+"noch lokales Ãœbernehmen stoppen"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: Zugriff für \"%s\" auf Zweig \"%s\" abgelehnt (Änderungssatz \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: Zugriff für \"%s\" auf Zweig \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: Zugriff für \"%s\" auf \"%s\" abgelehnt (Änderungssatz \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: Zugriff für \"%s\" auf \"%s\" nicht erlaubt (Änderungssatz \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr "Hooks zur Integration mit dem Bugzilla Bugtracker"
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+"Diese Hook-Erweiterung fügt Kommentare zu einem Ticket in Bugzilla hinzu,\n"
+"wenn ein Änderungssatz, der eine Bugzilla-ID enthält, gefunden wird. Der\n"
+"Kommentar wird mithilfe des Mercurial-Vorlagen-Mechanismus formatiert."
+
+#, fuzzy
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"Bug-Referenzen können optional eine Angabe zur Aktualisierung der\n"
+"für die Bearbeitung des Bugs benötigten Stundenzahl beinhalten.\n"
+"Bugs können auch als gelöst markiert werden."
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr "Drei Zugriffsmethoden auf Bugzilla werden unterstützt:"
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"1. Zugriff über die XMLRPC-Schnittstelle. Benötigt Bugzilla 3.4 oder später."
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"2. Prüft Daten über die XMLRPC-Schnittstelle und sendet Ticket-Änderungen\n"
+" per Email an die Bugzilla Email-Schnittstelle. Benötigt Bugzilla 3.4\n"
+" oder später."
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+"3. Direktes Schreiben in die Bugzilla Datenbank. Funktioniert nur, wenn die\n"
+" Bugzilla-Instanz MySQL verwendet. Benötigt das Python MySQLdb Modul."
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+"Direktes Schreiben in die Datenbank führt leicht zu Problemen bei Schema-\n"
+"veränderungen und benötigt ein externes Bugzilla Script, um\n"
+"Benachrichtigungsemails zu versenden. Dieses Script wird mit den Rechten "
+"des\n"
+"Mercurial-Benutzers ausgeführt, benötigt eine lokale Bugzilla-Installation\n"
+"sowie Leserechte an der Bugzilla-Konfigurationsdatei und MySQL-Benutzername\n"
+"und -Passwort, um vollen Zugriff auf die Bugzilla Datenbank zu haben. Aus\n"
+"diesen Gründen wird diese Zugriffsmethode als veraltet angesehen und nicht\n"
+"mehr für zukünftigen Bugzillaversionen angepasst. In diesem Zugriffsmodus "
+"ist\n"
+"nur das Hinzufügen von Kommentaren erlaubt."
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
+"later."
+msgstr ""
+"Zugriff über XMLRPC benötigt einen Bugzilla-Benutzernamen und -Passwort in\n"
+"der Konfigurationsdatei. Kommentare werden unter diesem Benutzer eingefügt.\n"
+"Da es notwendig ist, dass alle Mercurial-Benutzer Lesezugriff auf diese "
+"Datei\n"
+"haben, ist es empfohlen dieses Benutzerkonto in Bugzilla mit den minimal\n"
+"nötigen Rechten um Kommentare einzufügen auszustatten.\n"
+"Bugs als gelöst zu markieren benötigt Bugzilla 4.0 oder neuer."
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+"Zugriff über XMLRPC/Email verwendet XMLRPC für Anfragen an Bugzilla, aber\n"
+"sendet Emails an die Email-Schnittstelle um Kommentare einzufügen. Die\n"
+"Adresse im 'Absender:'-Feld wird auf die Emailadresse des Mercurial-"
+"Benutzers\n"
+"gesetzt, sodass der Kommentar als vom Mercurial-Benutzer kommend erkannt\n"
+"wird. Falls Bugzilla die Email-Adresse des Mercurial-Benutzers nicht als "
+"Bugzilla-\n"
+"Benutzer erkennt, wird alternativ die Email mit dem Bugzilla-Benutzernamen \n"
+"verknüpft, der zum Anmelden in Bugzilla verwendet wird, und als Quelle des\n"
+"Kommentars verwendet. Bugs als gelöst zu markieren funktioniert in allen\n"
+"Bugzilla-Versionen."
+
+msgid "Configuration items common to all access modes:"
+msgstr "Konfigurationseinträge für alle Zugriffsmethoden:"
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+"bugzilla.version\n"
+" Die zu verwendende Zugriffsmethod. Erlaubte Werte sind:"
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+" :``xmlrpc``: Bugzilla XMLRPC Schnittstelle.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC und Email Schnittstellen.\n"
+" :``3.0``: MySQL Zugriff, Bugzilla 3.0 oder höher.\n"
+" :``2.18``: MySQL Zugriff, Bugzilla 2.18 bis ausschliesslich 3.0.\n"
+" :``2.16``: MySQL Zugriff, Bugzilla 2.16 bis ausschliesslich 2.18."
+
+#, fuzzy
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs for update in changeset commit "
+"message.\n"
+" It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+" IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.regexp\n"
+" Regulärer Ausdruck, der auf die zu aktualisierende Bug-ID in der\n"
+" Versionsmeldung passt. Er muss eine `<ids>`` benannte Gruppe \"()\"\n"
+" enthalten, die auf die Bug-IDs getrennt durch Nicht-Zahlen-Zeichen\n"
+" passt. Außerdem kann er eine ``<hours>`` benannte Gruppe mit einer\n"
+" Fließkommazahl enthalten, die die Zahl der Arbeitsstunden für den\n"
+" Bug angibt. Wenn keine benannten Gruppen vorhanden sind, wird \n"
+" angenommen, dass die erste \"()\"-Gruppe die Bug-IDs enthält, und die\n"
+" Arbeitszeit nicht aktualisiert. Der voreingestellte Ausdruck passt auf\n"
+" ``Bug 1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
+" ``Bug 1234 and 5678`` und Variationen davon, gefolgt von einer\n"
+" Stundenzahl, der ein ``h`` oder ``hours`` vorrangestellt ist,\n"
+" beispielsweise ``hours 1.5``.\n"
+" Die Passung ist von Groß-/Kleinschreibung unabhängig."
+
+msgid ""
+"bugzilla.fixregexp\n"
+" Regular expression to match bug IDs for marking fixed in changeset\n"
+" commit message. This must contain a \"()\" named group ``<ids>` "
+"containing\n"
+" the bug IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
+"1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+
+#, fuzzy
+msgid ""
+"bugzilla.fixstatus\n"
+" The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+" Der Status, auf den ein Bug gesetzt wird, wenn er als \"fixed\" markiert\n"
+" wurde. Voreinstellung ``RESOLVED``."
+
+#, fuzzy
+msgid ""
+"bugzilla.fixresolution\n"
+" The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+" Die Lösung, die für einen Bug eingestellt wird, der als \"fixed\" "
+"markiert\n"
+" wurde. Voreinstellung ``FIXED``."
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+"bugzilla.style\n"
+" Stil-Datei für das Formatieren der Kommentare."
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+"bugzilla.template\n"
+" Vorlagentext für die Bugzilla-Kommentare (anstelle der Stil-Datei).\n"
+" Zusätzlich zu den üblichen Mercurial-Schlüsselworten gibt es:"
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+" :``{bug}``: Die Bugzilla-Ticket-ID.\n"
+" :``{root}``: Der volle Pfad des Mercurial-Archivs.\n"
+" :``{webroot}``: Angepasster Pfad des Mercurial-Archivs.\n"
+" :``{hgweb}``: Basis-URL für alle Mercurial-Archive."
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+" Voreinstellung: ``Änderung {node|short} in Archiv {root}\n"
+" erwähnt Bug {bug}.\\nDetails:\\n\\t{desc|tabindent}``"
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+"bugzilla.strip\n"
+" Die Anzahl von Verzeichnisebenen, die vom Anfang des Archivpfads\n"
+" (``{root}`` in Vorlagen) abgeschnitten wird, um ``{webroot}`` zu "
+"erhalten.\n"
+" Zum Beispiel mit ``{root}`` als ``/var/local/mein-projekt`` und einem\n"
+" Wert 2, wird ``{webroot}`` auf ``mein-projekt`` gesetzt. Voreinstellung 0."
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+"web.baseurl\n"
+" Basis-URL für alle Mercurial-Archive. Kann in Kommentar-Vorlagen als\n"
+" ``{hgweb}`` verwendet werden."
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr "Gemeinsame Zugriffskonfiguration für XMLRPC+email und MySQL:"
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+"bugzilla.usermap\n"
+" Pfad zu einer Datei, die Mercurial-Benutzern eine Bugzilla-Benutzer-ID\n"
+" zuweist. Falls angegeben, sollte jede Zeile der Form::"
+
+msgid " committer = Bugzilla user"
+msgstr " Mercurial-Benutzer = Bugzilla-Benutzer"
+
+msgid " See also the ``[usermap]`` section."
+msgstr " entsprechen. Siehe auch ``[usermap]``."
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+"Einträge im ``[usermap]``-Abschnitt weisen Mercurial-Benutzern eine\n"
+"Bugzilla-Emailadresse zu. Siehe auch Option ``bugzilla.usermap``.\n"
+"Enthält Einträge der Form ``Mercurial-Benutzer = Bugzilla-Benutzer``"
+
+msgid "XMLRPC access mode configuration:"
+msgstr "XMLRPC Zugriffskonfiguration:"
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+"bugzilla.bzurl\n"
+" Die Basis-URL der Bugzilla Installation\n"
+" Voreinstellung ``http://localhost/bugzilla``."
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Der Benutzername für den Bugzilla-Zugriff via XMLRPC. Voreinstellung "
+"``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+"bugzilla.password\n"
+" Das Passwort für den Bugzilla-Zugriff."
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr "XMLRPC+email nutzt die gleichen Zugriffskonfiguration wie XMLRPC plus:"
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+"bugzilla.bzemail\n"
+" Die Bugzilla Emailadresse."
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+"Zusütlich müssen der Emailversand für Mercurial konfiguriert werden. Sie\n"
+"dazu die Dokumentation von hgrc(5), Abschnitte ``[email]`` und ``[smtp]``."
+
+msgid "MySQL access mode configuration:"
+msgstr "MySQL Zugriffskonfiguration:"
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+"bugzilla.host\n"
+" Hostname des Servers auf dem die Bugzilla MySQL-Datenbank läuft.\n"
+" Voreinstellung ``localhost``."
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+"bugzilla.db\n"
+" Name der Bugzilla-Datenbank in MySQL. Voreinstellung: ``bugs``."
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Benutzername zum Zugriff auf den MySQL-Server. Voreinstellung:\n"
+" ``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+"bugzilla.password\n"
+" Password zum Zugriff auf den MySQL-Server."
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+"bugzilla.timeout\n"
+" Datenbank Verbindungs-Zeitgrenze (in Sekunden). Voreinstellung 5."
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+"bugzilla.bzuser\n"
+" Ausweich-Benutzername zum Setzen von Kommentaren, falls der Autor der\n"
+" Änderungen kein Benutzer in Bugzilla ist."
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+"bugzilla.bzdir\n"
+" Bugzilla Installationsverzeichnis. Notwendig für die standardmäßige\n"
+" 'notify'-Aktion. Voreinstellung: ``/var/www/html/bugzilla``."
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+"bugzilla.notify\n"
+" Das Kommando um Hinweis-E-Mails zu versenden. Die drei Schlüssel\n"
+" ``bzdir``, ``id`` (Ticket ID) und ``user`` (Autor) werden ersetzt.\n"
+" Die Voreinstellung hängt von der Version ab; ab 2.18 ist es\n"
+" \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s\""
+
+msgid "Activating the extension::"
+msgstr "Um diese Erweiterung zu aktivieren::"
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+" [hooks]\n"
+" # führt Hook für jede Änderung aus, die hierher abgerufen oder\n"
+" # übertragen wird\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+
+msgid "Example configurations:"
+msgstr "Beispielkonfigurationen:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"XMLRPC Beispielkonfiguration. Genutzt wird Bugzilla auf\n"
+"``http://mein-projekt.org/bugzilla``, mit dem Benutzer\n"
+"``bugmail@mein-projekt.org`` und Password ``plugh``. Die Archive, deren\n"
+"Änderungen dort kommentiert werden, sind in ``/var/local/hg/repos/``,\n"
+"mit einem Web-Interface auf ``http://mein-projekt.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://mein-project.org/bugzilla\n"
+" user=bugmail@mein-projekt.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Änderung {node|short} in Archiv {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://mein-projekt.com/hg"
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+"XMLRPC+email Beispielkonfiguration. Genutzt wird Bugzilla auf\n"
+"``http://mein-projekt.org/bugzilla``, mit dem Benutzer\n"
+"``bugmail@mein-projekt.org`` und Password ``plugh``. Die Archive, deren\n"
+"Änderungen dort kommentiert werden, sind in ``/var/local/hg/repos/``,\n"
+"mit einem Web-Interface auf ``http://mein-projekt.org/hg``. Die Kommentare\n"
+"werden an die Emailadresse ``bugzilla@mein-projekt.org`` gesendet. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://mein-projekt.org/bugzilla\n"
+" user=bugmail@mein-projekt.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@mein-projekt.org\n"
+" template=Änderung {node|short} in Archiv {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" benutzer@emaildomain.com=benutzer.name@bugzilladomain.com"
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"MySQL Beispielkonfiguration. Bugzilla 3.2 ist lokal in ``/opt/"
+"bugzilla-3.2``\n"
+"installiert. Die MySQL Datenbank wird per ``localhost`` angesprochen,\n"
+"der Name der Bugzilla Datenbank ist ``bugs`` und der MySQL Zugriff ist für\n"
+"enutzer ``bugs`` mit Password ``XYZZY`` erlaubt. Die Archive, deren\n"
+"Änderungen dort kommentiert werden, sind in ``/var/local/hg/repos/``,\n"
+"mit einem Web-Interface auf ``http://mein-projekt.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unbekannt@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Änderung {node|short} in Archiv {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr "Eine neue Änderung führt dann zu einem solchen Bugzilla-Kommentar::"
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+" Änderung 3b16791d6642 in Archivname.\n"
+" http://mein-projekt.org/hg/archivname/rev/3b16791d6642"
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr " Änderungsnachricht des Commits. Bug 1234.\n"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "MySQL-Unterstützung in Python nicht verfügbar: %s"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "Verbinde mit %s:%s als %s, Passwort %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "Anfrage: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "Fehlgeschlagene Anfrage: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "Unbekanntes Datenbankschema"
+
+#, python-format
+msgid "bug %d does not exist\n"
+msgstr "Bug %d existiert nicht\n"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "Fehler %d hat bereits einen Kommentar über Änderung %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "Sende E-Mail durch Bugzilla:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " Fehler %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "Führe 'notify'-Befehl aus: %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "Fehler beim 'notify'-Befehl: %s"
+
+msgid "done\n"
+msgstr "fertig\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "Suche Benutzer %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "Kann keine Bugzilla Benutzer-ID für %s finden"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "Kann keine Bugzilla Benutzer-ID für %s oder %s finden"
+
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL kann den Bug-Status nicht aktualisieren\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr ""
+"Bugzilla/XMLRPC benötigt Bugzilla 4.0 oder neuer um Bugs als gelöst zu\n"
+" markieren\n"
+
+msgid "configuration 'bzemail' missing"
+msgstr "Konfiguration für 'bzemail' fehlt"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr "Standardmäßige Bugzilla-Benutzer %s Email nicht gefunden"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "Bugzilla-Version %s wird nicht unterstützt"
+
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: Ungültige Stunden\n"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"Änderung {node|short} in Archiv {root} erwähnt Bug {bug}.\n"
+"Details:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr "Hook-Typ %s übergibt keine Änderungs-ID"
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Bugzilla Fehler: %s"
+
+msgid "command to display child changesets (DEPRECATED)"
+msgstr "Befehl zum Anzeigen von Kindrevisionen (VERALTET)"
+
+msgid ""
+"This extension is deprecated. You should use :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+msgstr ""
+"Diese Erweiterung ist veraltet. Benutzen Sie stattdessen:hg:`log -r "
+"\"children(REV)\"`.\n"
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+"Zeigt die Kinder der übergebenen Revision oder des Arbeitsverzeichnisses an"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" Zeigt die Kinder der Revision des Arbeitsverzeichnisses an.\n"
+" Wenn eine Revision durch -r/--rev angegeben wird, werden die Kinder\n"
+" dieser Revision angezeigt. Wenn eine Datei als Argument angegeben\n"
+" wird, zeige die Revision an, in der die Datei zuletzt geändert wurde\n"
+" (nachfolgend der Revision des Arbeitsverzeichnisses oder wenn angegeben\n"
+" dem Argument von --rev).\n"
+" "
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr "Zeigt die Kinder der gegebenen Revision"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r REV] [DATEI]"
+
+msgid "command to display statistics about repository history"
+msgstr "Zeigt Statistiken über die Projekthistorie"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr "Revision %d ist eine Zusammenführung. Ignoriere...\n"
+
+msgid "analyzing"
+msgstr "Analysiere"
+
+msgid "histogram of changes to the repository"
+msgstr "Histogramm der Änderungen an dem Projektarchiv"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+" Dieser Befehl zeigt ein Histogramm basierend auf der Anzahl der\n"
+" geänderten Zeilen oder Revisionen an, das entsprechend der Vorlage\n"
+" gruppiert wird. Die Standardvorlage wird die Änderungen nach dem\n"
+" Autor gruppieren. Die Option --dateformat kann verwendet werden,\n"
+" um die Ergebnisse nach Datum zu sortieren."
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+" Die Statistiken basieren auf der Anzahl geänderter Zeilen oder\n"
+" alternativ auf der Anzahl passender Revisionen, wenn die Option\n"
+" --changesets angegeben wurde."
+
+msgid " Examples::"
+msgstr " Beispiele::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+" # Zeigt Anzahl der veränderten Zeilen pro Autor\n"
+" hg churn -t '{author|email}'"
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+" # Zeigt Aktivität im Tagesverlauf (Gruppiert nach Stunde)\n"
+" hg churn -f '%H' -s -c"
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+" # Zeigt Aktivität pro Monat\n"
+" hg churn -f '%Y-%m' -s -c"
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+" # Zeigt Anzahl der veränderten Zeilen über die Jahre\n"
+" hg churn -f '%Y' -s"
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+" Es ist möglich, wechselnde E-Mail-Adressen einer Haupt-Adresse\n"
+" zuzuweisen, indem eine Datei in dem folgenden Format angegeben wird::"
+
+msgid " <alias email> = <actual email>"
+msgstr " <Alias-Adresse> = <echte Adresse>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+" Solch eine Datei kann über die Option --aliases angegeben werden,\n"
+" ansonsten wird im Wurzelverzeichnis der aktuellen Arbeitskopie nach\n"
+" einer Datei namens .hgchurn gesucht.\n"
+" "
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "Ãœberspringe fehlerhaften Alias: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "Zählt nur in gegebener Revision oder Intervall"
+
+msgid "DATE"
+msgstr "DATUM"
+
+msgid "count rate for revisions matching date spec"
+msgstr "Zeigt Revisionen passend zur Datums-Spezifikation"
+
+msgid "TEMPLATE"
+msgstr "VORLAGE"
+
+msgid "template to group changesets"
+msgstr "Vorlage zur Gruppierung der Änderungssätze"
+
+msgid "FORMAT"
+msgstr "FORMAT"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr "Gruppierung nach Datum in strftime-kompatiblem Format"
+
+msgid "count rate by number of changesets"
+msgstr "Zählt Anzahl der Änderungssätze"
+
+msgid "sort by key (default: sort by count)"
+msgstr "Sortiere nach Schlüssel (Voreinstellung: nach Anzahl)"
+
+msgid "display added/removed lines separately"
+msgstr "Zeige hinzugefügte/entfernte Zeilen einzeln"
+
+msgid "FILE"
+msgstr "DATEI"
+
+msgid "file with email aliases"
+msgstr "Datei mit Alias-Adressen"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATUM] [-r REV] [--aliases DATEI] [DATEI]"
+
+msgid "colorize output from some commands"
+msgstr "Färbt die Ausgabe einiger Befehle"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"Diese Erweiterung färbt die Ausgabe der Befehle 'status' und 'resolve'\n"
+"anhand des Dateistatus, die Ausgabe von 'qseries' anhand des Patchstatus\n"
+"(angewendet, nicht angewendet, fehlend) und die Ausgabe von diff-ähnlichen\n"
+"Kommandos anhand der Änderung (hinzugefügte oder entfernte Zeilen, \n"
+"Dateistatus und abschließender Leeraum) ein."
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"Neben Farbänderungen sind auch andere Effekte wie Fettschreibung oder\n"
+"Unterstreichung möglich. Standardmäßig wird die terminfo Datenbank für die\n"
+"Terminalkommandos befragt. Falls terminfo nicht erreichbar ist, werden die\n"
+"Effekte durch die ECMA-48 SGR Funktionen (ANSI Escape Codes) realisiert."
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+"Standardeffekte können durch die Konfigurationsdatei verändert werden::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' deaktiviert alle Effekte\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+" tags.normal = green\n"
+" tags.local = black bold"
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+"Die verfügbaren Effekte im terminfo-Modus sind 'blink' (blinkend), 'bold'\n"
+"(fettgeschrieben), 'dim' (gedämmt), 'inverse' (Vorder- und Hintergrund\n"
+"getauscht), 'italic' (Schrägschrift), 'standout' (hervorstehend) und\n"
+"'underline' (unterstrichen); im ECMA-48 Modus nur 'bold', 'inverse',\n"
+"'italic' und 'underline'. Wie dies tatsächlich aussieht, hängt vom "
+"Terminal-\n"
+"emulator ab. Effekte, die nicht realisiert werden können, werden ohne\n"
+"Warnung ignoriert."
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+"Beachten Sie, dass terminfo-Farben in Verbindung mit der pager-Erweiterung\n"
+"und 'less -R' zu Problemen führen kann. 'less' wird mit der -R Option nur\n"
+"ECMA-48 Farbcodes anzeigen und der terminfo-Modus sendet manchmal Werte,\n"
+"die 'less' nicht versteht. Eine Abhilfe ist der ansi (oder auto) -Modus\n"
+"oder 'less -r', was alle Terminalkodes unverändert durchleitet."
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+"Dieses Modul erlaubt im terminfo-Modus die Definition neuer Farben für\n"
+"die Plätze oberhalb der acht Standardfarben. Zum Beispiel::"
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+"um Hellblau (brightblue) auf Platz 12 zu setzen (nützlich für 16-Farben-\n"
+"Terminale, die in den oberen acht Plätzen die helleren Farben setzen) und\n"
+"Rosa und Orange auf ihre Plätze im Standard-Farbwürfel eines 256-Farben\n"
+"XTerms. Diese Farben können nun genau wie die vordefinierten Acht verwendet\n"
+"werden, auch als Hintergrundfarbe durch Anhängen von '_background'."
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+"Standardmäßig wird die Fareberweiterung den ANSI-Modus (bzw. win32-Modus\n"
+"auf Windows) verwenden, falls ein Terminal gefunden wird (also keine\n"
+"Umleitung in eine Datei). Um den auto-Modus zu überschreiben (z.B. mit dem\n"
+"terminfo-Modus), muss die folgende Konfigurationsoption gesetzt werden::"
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+"Jeder Wert außer 'ansi', 'win32', 'terminfo' oder 'auto' wird Farben\n"
+"deaktivieren.\n"
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr "Kein terminfo-Eintrag für setab/setaf: Falle auf ECMA-48 zurück\n"
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr "Warnung: Konnte Farbmodus nicht auf %s setzen\n"
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "Ignoriere unbekannte Farbe/Effekt %r (gesetzt in color.%s)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr "Wann soll eingefärbt werden (boolescher Wert, always, auto oder never)"
+
+msgid "TYPE"
+msgstr "TYP"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+"Importiert Änderungssätze von anderen Versionsverwaltungssystemen nach "
+"Mercurial"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr "Konvertiert Archive anderer VCS in ein Mercurial-Archiv."
+
+msgid " Accepted source formats [identifiers]:"
+msgstr " Erkannte Quellformate [Bezeichner]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr " Erlaubte Zielformate [Bezeichner]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (Historie von Zweigen wird nicht erhalten)"
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+" Wenn keine Revision angegeben ist, werden alle konvertiert.\n"
+" Andernfalls werden alle Revision bis zur angegebenen konvertiert.\n"
+" Die Revisionsangabe muss für das Quellsystem verständlich sein."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" Wenn kein Zielverzeichnisname angegeben ist, wird die Endung ``-hg``\n"
+" an den Namen der Quelle angehängt. Wenn das Ziel nicht existiert, wird\n"
+" es erstellt."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+" Standardmäßig wird die Option \"--branchsort\" für alle Quellen außer\n"
+" Mercurial verwendet. Mercurial verwendet \"--sourcesort\", um die\n"
+" ursprüngliche Reihenfolge der Revisionsnummern zu erhalten.\n"
+" Die Sortieroptionen haben folgende Effekte:"
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+" --branchsort Konvertiert von Vorfahr zum Kind wenn möglich. Das\n"
+" bedeutet, dass Zweige nacheinander konvertiert werden.\n"
+" Dies führt zu kompakteren Archiven."
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+" --datesort Sortiert die Revisionen nach Datum. Die fertigen Archive\n"
+" haben ein gut lesbares Meldungs-Logbuch, sind aber häufig\n"
+" eine Zehnerpotenz größer als mit --branchsort erstellte."
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+" --sourcesort Versucht die Reihenfolge der Quellrevisionen zu erhalten.\n"
+" Dies wird nur bei Mercurial als Quelle unterstützt."
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+" Wenn ``REVMAP`` nicht gegeben ist, wird es in einer standardmäßigen\n"
+" Stelle (standardmäßig ``<dest>/.hg/shamap``) abgelegt. Die ``REVMAP``\n"
+" ist eine einfache Textdatei, die die IDs aus dem Quellarchiv mit denen\n"
+" aus dem Zielarchiv verknüpft. Das Format ist::"
+
+msgid " <source ID> <destination ID>"
+msgstr " <Quell ID> <Ziel ID>"
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+" Diese Datei wird erstellt, wenn sie nicht existiert. Sie wird durch\n"
+" jeden konvertierten Änderungssatz erweitert, so dass unterbrochene\n"
+" Konvertierungen durch erneuten Aufruf fortgesetzt werden können."
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+" Die Autorendatei ist eine Textdatei, die jeden Autor von Revisionen in\n"
+" der Quelle einem Ziel-Autor zuweist. Dies ist praktisch für VCS, die\n"
+" Unix-Login zur Identifikation von Autoren verwenden, wie z.B. CVS. Das\n"
+" Format ist pro Zeile::"
+
+msgid " source author = destination author"
+msgstr " Quellautor = Zielautor"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr " Leere Zeilen und Zeilen, die mit ``#`` beginnen, werden ignoriert."
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+" Eine weitere Abbildungsdatei für Dateinamen erlaubt eine Filterung und\n"
+" Umbenennung von Dateien und Verzeichnissen. Jede Zeile kann eine der\n"
+" folgenden Direktiven enthalten::"
+
+msgid " include path/to/file-or-dir"
+msgstr " include pfad/zur/datei-oder-verzeichnis"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " exclude pfad/zur/datei-oder-verzeichnis"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rename pfad/zur/quelle pfad/zum/ziel"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+" Kommentarzeilen beginnen mit ``#`` Ein angegebener Pfad passt, wenn\n"
+" er dem vollen, relativen Pfad einer Datei oder deren Verzeichnis\n"
+" entspricht. Die ``include``- oder ``exclude``-Anweisung mit dem\n"
+" längsten passenden Pfad wird angewendet, sodass die Reihenfolge der\n"
+" Anweisungen nicht wichtig ist."
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+" Ist eine ``include``-Direktive angegeben, so werden genau diese Dateien\n"
+" bzw. alle Dateien in diesen Verzeichnissen ins Zielarchiv übernommen,\n"
+" alle anderen nicht. Durch die ``exclude`` Direktive werden solche \n"
+" Dateien oder Verzeichnisse angegeben, die nicht übernommen werden \n"
+" sollen. ``rename`` schließlich benennt eine Datei oder Verzeichnis um.\n"
+" Um von einem Unterverzeichnis der Quelle in die Wurzel des Zielarchivs\n"
+" umzubenennen, kann ``.`` als Pfad der Zieldatei angegeben werden."
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+" Die Spleißdatei erlaubt die künstliche Einführung von Vorfahr-\n"
+" verbindungen. Die ist nützlich, wenn einer Zusammenführung unter\n"
+" Subversion der andere Vorfahr angegeben werden soll oder zwei\n"
+" ansonsten unabhängige Entwicklungslinien verbunden werden sollen.\n"
+" Jeder Eintrag enthält eine Revisions-ID des Quellarchivs, ein\n"
+" Leerzeichen und eine oder (mit Komma getrennt) zwei Revisions-IDs,\n"
+" die als Vorfahren der ersten angenommen werden sollen::"
+
+msgid " key parent1, parent2"
+msgstr " key vorfahr1, vorfahr2"
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+" Die Spleißdatei erlaubt die künstliche Einführung von Vorfahrver-\n"
+" bindungen. Die ist nützlich, wenn einer Zusammenführung unter "
+"Subversion\n"
+" der andere Vorfahr angegeben werden soll oder zwei ansonsten "
+"unabhängige\n"
+" Entwicklungslinien verbunden werden sollen. Jeder Eintrag enthält eine\n"
+" Revisions-ID des Quellarchivs, eine Leerstelle und eine oder (mit "
+"Komma)\n"
+" zwei Revisions-IDs, die als Vorfahren der ersten angenommen werden\n"
+" sollen. Wurde z.B. \"trunk\" mit \"release-1.0\" zusammengeführt, so\n"
+" sollte die Revision aus \"trunk\" als erster und die aus dem Zweig\n"
+" \"release-1.0\" als zweiter Vorfahr angegeben werden. Die Vorfahren-IDs\n"
+" können entweder im Format der Quelle oder des Ziels angegeben werden."
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+" Die Zweigdatei erlaubt das Umbenennen von Zweigen. Zusammen mit der\n"
+" Spleißdatei können so auch sehr unorganisierte Archive in ein gut\n"
+" strukturiertes Mercurial-Archiv konvertiert werden. Die Zeilen dieser\n"
+" Datei haben das folgende Format::"
+
+msgid " original_branch_name new_branch_name"
+msgstr " originaler_zweig_name neuer_zweig_name"
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+" Dabei ist \"originaler_zweig_name\" der Name des Zweigs im Quellarchiv\n"
+" und \"neuer_zweig_name\" der Name im Zielarchiv. Leerzeichen sind in\n"
+" Zweignamen nicht erlaubt. Dies kann benutzt werden, um beispielsweise\n"
+" Quellcode in einem Archiv aus dem \"default\"-Zweig in einen benannten\n"
+" Zweig zu verschieben."
+
+msgid ""
+" Mercurial Source\n"
+" ''''''''''''''''"
+msgstr ""
+" Mercurial als Quelle\n"
+" ''''''''''''''''''''"
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+" Die Mercurial-Quelle kennt die folgenden Konfigurations-Optionen\n"
+" die Sie auf der Kommando-Zeile mit ``--config`` setzen können"
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+" :convert.hg.ignoreerrors: Ignoriere Integritäts-Fehler beim Lesen.\n"
+" Benutzen Sie dies, um Mercurial-Archive mit fehlenden revlogs\n"
+" zu reparieren, während Sie von oder nach Mercurial konvertieren.\n"
+" Voreinstellung ist False."
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+" :convert.hg.saverev: Speichere die originale Revision ID im Changeset\n"
+" (erzwingt geänderte Target IDs). Nimmt ein boolean Argument\n"
+" und hat die Voreinstellung False."
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+" :convert.hg.startrev: Konvertiere Start Revision und ihre Decendants.\n"
+" Erwartet eine hg-Revisions-ID, standardmäßig 0."
+
+msgid ""
+" CVS Source\n"
+" ''''''''''"
+msgstr ""
+" CVS als Quelle\n"
+" ''''''''''''''"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+" Mit CVS als Quelle wird eine Sandkastenumgebung (also eine \n"
+" Arbeitskopie) verwenden, um den Beginn der Konversion anzuzeigen. \n"
+" Direkter Zugriff auf das Archiv ist nicht nötig, es sei denn es ist \n"
+" ein :lokales: Archiv. Die Konversion sucht das CVS Verzeichnis in der\n"
+" Wurzel der Arbeitskopie und verwendet die CVS rlog Kommandos um alle \n"
+" Dateien für die Konversion zu finden. Wird also keine Abbildungsdatei \n"
+" für Dateinamen verwendet, so werden alle Dateien unterhalb des \n"
+" Startverzeichnisses konvertiert und jegliche Verzeichnis-Umordnung im \n"
+" Sandkasten ignoriert."
+
+msgid " The following options can be used with ``--config``:"
+msgstr " Die folgenden Optionen können mit ``--config`` genutzt werden:"
+
+#, fuzzy
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+" :convert.cvsps.cache: Setzen Sie dies auf False, um Remote Log Caching\n"
+" auszuschalten, zum Testen und Debuggen. Voreinstellung ist True."
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+" :convert.cvsps.fuzz: Gibt die maximale Zeit (in Sekunden) an, die\n"
+" zwischen Commits mit identischem User und Log Meldung in einem\n"
+" einzelnen Änderungssatz erlaubt ist. Wenn sehr große Files\n"
+" übernommen als Teil eines Änderungssatzes, ist die Voreinstellung\n"
+" möglicherweise nicht lang genug. Die Voreinstellung ist 60."
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergeto: Spezifiziere einen regulären Ausdruck, der auf\n"
+" Commit Log Meldungen angewandt wird. Wenn eine Ãœbereinstimmung\n"
+" auftritt, fügt der Konvertierungsvorgang eine Dummy Revision\n"
+" ein, bei der der Branch, in dem die Ãœbereinstimmung aufgetreten\n"
+" ist, mit dem Branch zusammengeführt wird, den die Regex anzeigt.\n"
+" Voreinstellung ist ``{{mergetobranch ([-\\w]+)}}``"
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergefrom: Spezifiziere einen regulären Ausdruck, der\n"
+" auf Commit Log Meldungen angewandt wird. Wenn eine Ãœbereinstimmung\n"
+" auftritt, wird der Konvertierungsvorgang die jüngste Revision auf\n"
+" auf dem Branch zufügen, der in der Regex als zweiter Parent des\n"
+" Changesets angezeigt wird.\n"
+" Voreinstellung ist ``{{mergefrombranch ([-\\w]+)}}``"
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+" :hook.cvslog: Spezifiziere eine Python Funktion, die aufgerufen wird,\n"
+" wenn das CVS Log erfaßt ist. Die Funktion bekommt eine Liste von\n"
+" Log Einträgen, und kann diese Einträge in-place ändern, löschen,\n"
+" oder neue hinzufügen."
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+" :hook.cvschangesets: Spezifiziere eine Python Funktion, die aufgerufen\n"
+" wird, nachdem die Changesets des CVS Logs berechnet sind. Die \n"
+" Funktion bekommt eine Liste der Changeset Einträgen, und kann diese\n"
+" Einträge in-place ändern, löschen, oder neue hinzufügen."
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+" Der zusätzliche Befehl \"debugcvsps\" erlaubt es, die Zusammenführung\n"
+" auch ohne Konvertierung ausführen. Die Parameter sind denen von\n"
+" cvsps 2.1 ähnlich. Für weitere Details siehe die Hilfe zu diesem\n"
+" Befehl."
+
+msgid ""
+" Subversion Source\n"
+" '''''''''''''''''"
+msgstr ""
+" Subversion als Quelle\n"
+" '''''''''''''''''''''"
+
+#, fuzzy
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+" Die trunk/branch/tag-Konvention von Subversion wird automatisch\n"
+" erkannt: Standardmäßig wird entweder die angegebene Quell-URL\n"
+" ``svn://repo/pfad/`` oder ein Unterverzeichnis \"trunk\" (falls dies \n"
+" existiert) als einzelner (default) Zweig angenommen. Wenn ein\n"
+" \"branches\"-Unterverzeichnis gefunden wird, so werden dessen\n"
+" Unterverzeichnisse als mögliche Zweige aufgenommen. Wenn \"tags\" \n"
+" existiert, wird es auf Zweigverweise hin untersucht. Die Standardwerte \n"
+" \"trunk\", \"branches\" und \"tags\" können mit den folgenden Optionen\n"
+" überschrieben werden. Sie können auf einen Pfad relativ zur Quell-URL \n"
+" gesetzt oder leer gelassen werden, um die automatische Erkennung zu\n"
+" verhindern."
+
+msgid " The following options can be set with ``--config``:"
+msgstr " Die folgenden Optionen können mit ``--config`` gesetzt werden:"
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+" :convert.svn.branches: Spezifiziere das Verzeichnis, das die Branches\n"
+" enthält. Voreinstellung ist ``branches``."
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+" :convert.svn.tags: Spezifiziere das Verzeichnis, das die Tags enthält.\n"
+" Voreinstellung ist ``tags``."
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+" :convert.svn.trunk: Spezifiziere den Namen des trunk Branches. Der\n"
+" Voreinstellung ist ``trunk``."
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+" Nur die Konvertierung von einzelnen Zweigen ist unterstützt. Die\n"
+" Quellhistorie kann vollständig oder ab einer gegebenen Startrevision\n"
+" erfasst werden:"
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+" --config convert.svn.startrev=0 (SVN-Revisionsnummer)\n"
+" Spezifiziert die Startrevision"
+
+msgid ""
+" Perforce Source\n"
+" '''''''''''''''"
+msgstr ""
+" Perforce als Quelle\n"
+" '''''''''''''''''''"
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+" Der Perforce (P4) Importer kann einen p4 Depotpfad oder eine Client-\n"
+" Spezifikation als Quelle annehmen. Alle Dateien werden in ein flaches\n"
+" Mercurial-Archiv konvertiert; dabei werden ignoriert Label, Zweige\n"
+" und Integrationen ignoriert. Bei Angabe eines Depotpfads sollte auch\n"
+" ein Zielpfad genannt werden, da dieser sonst als ...-hg ausfallen\n"
+" kann."
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+" Es ist möglich die zu konvertierte Quellhistorie durch Angabe einer\n"
+" Startrevision zu begrenzen."
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+" :convert.p4.startrev: Spezifiziere die Perforce Start-Revision (eine\n"
+" Perforce Changelist Nummer)."
+
+msgid ""
+" Mercurial Destination\n"
+" '''''''''''''''''''''"
+msgstr ""
+" Mercurial als Ziel\n"
+" ''''''''''''''''''"
+
+msgid " The following options are supported:"
+msgstr " Die folgenden Optionen werden unterstützt:"
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+" :convert.hg.clonebranches: Verteile Source Branches in unterschiedliche\n"
+" Clones. Voreinstellung ist False."
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+" :convert.hg.tagsbranch: Branch Name für Tag Revisionen.\n"
+" Voreinstellung ist ``default``."
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+" :convert.hg.usebranchnames: Erhalte Branch Names.\n"
+" Voreinstellung ist True.\n"
+" "
+
+msgid "create changeset information from CVS"
+msgstr "erstellt Änderungssatz-Informationen aus CVS"
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+" Dieser Befehl ist als Debuggingwerkzeug für den Konverter von CVS zu\n"
+" Mercurial gedacht und kann als direkte Ersetzung für cvsps dienen."
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+" Hg debugcvsps liest das CVS-Logbuch für das aktuelle Verzeichnis\n"
+" (oder jedes angegebene Verzeichnis) aus dem CVS-Projektarchiv aus\n"
+" und konvertiert den Log in eine Serie von Änderungssätzen,\n"
+" basierend auf übereinstimmenden Log-Einträgen und Datumsangaben."
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+"Datei mit Autor-Zuweisungen (VERALTET, verwende stattdessen --authormap)"
+
+msgid "source repository type"
+msgstr "Quellarchivtyp"
+
+msgid "destination repository type"
+msgstr "Zielarchivtyp"
+
+msgid "import up to target revision REV"
+msgstr "Importiere bis einschließlich Revision REV"
+
+msgid "remap usernames using this file"
+msgstr "bildet Benutzernamen mit Hilfe dieser Datei neu ab"
+
+msgid "remap file names using contents of file"
+msgstr "bildet Dateinamen mit Hilfe dieser Datei neu ab"
+
+msgid "splice synthesized history into place"
+msgstr "verbindet künstlich erzeugte Historien miteinander"
+
+msgid "change branch names while converting"
+msgstr "ändert Zweignamen während der Konvertierung"
+
+msgid "try to sort changesets by branches"
+msgstr "Sortiere Änderungssätze nach Zweigen"
+
+msgid "try to sort changesets by date"
+msgstr "Sortiere Änderungssätze nach Datum"
+
+msgid "preserve source changesets order"
+msgstr "Erhalte Reihenfolge der Quellrevisionen"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [OPTION]... QUELLE [ZIEL [REVMAP]]"
+
+msgid "only return changes on specified branches"
+msgstr "nur die Änderungen des angegebenen Branches zurückgeben"
+
+msgid "prefix to remove from file names"
+msgstr "Präfix, das von Dateinamen entfernt werden soll"
+
+msgid "only return changes after or between specified tags"
+msgstr "nur Änderungen nach oder zwischen angegebenen Tags zurückgeben"
+
+msgid "update cvs log cache"
+msgstr "CVS Log-Zwischenspeicher aktualisieren"
+
+msgid "create new cvs log cache"
+msgstr "neuen CVS Log-Zwischenspeicher erzeugen"
+
+msgid "set commit time fuzz in seconds"
+msgstr "setze erlaubte Abweichung von der Commit-Zeit in Sekunden"
+
+msgid "specify cvsroot"
+msgstr "gibt cvsroot an"
+
+msgid "show parent changesets"
+msgstr "zeigt die Eltern-Änderungssätze an"
+
+msgid "show current changeset in ancestor branches"
+msgstr "zeigt den aktuellen Änderungssatz in Vorgänger-Zweigen"
+
+msgid "ignored for compatibility"
+msgstr "ignoriert aus Kompatibilitätsgründen"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [OPTION]... [PATH]..."
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ":svnrev: Zeichenkette. Die konvertierte subversion-Revisionsnummer."
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ":svnpath: Zeichenkette. Der konvertierte subversion-Projektpfad."
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ":svnuuid: Zeichenkette. Der konvertierte subversion-Archivbezeichner."
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s scheint kein Bazaar-Archiv zu sein"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Bazaar-Modul konnte nicht geladen werden"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+"Warnung: Leichte Arbeitskopien können zu Konvertierungsfehlern führen; \n"
+"erwäge einen regulären Zweig zu nutzen.\n"
+
+msgid "bzr source type could not be determined\n"
+msgstr "Bazaar-Quelltyp konnte nicht ermittelt werden\n"
+
+#, python-format
+msgid "%s is not a valid revision"
+msgstr "%s ist keine gültige Revision"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s ist nicht mehr in %s vorhanden"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "Symbolische Verknüpfung %s.%s hat kein Ziel"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "Kann benötigtes Werkzeug \"%s\" nicht finden"
+
+#, python-format
+msgid "%s error:\n"
+msgstr "%s-Fehler:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr "Syntaxfehler in %s(%d): Schlüssel/Wert-Paar erwartet"
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "Konnte Abbildungsdatei %r nicht öffnen: %s"
+
+#, python-format
+msgid "syntax error in %s(%d): child parent1[,parent2] expected"
+msgstr "Syntaxfehler in %s(%d): Nachfolger Vorgänger1[,Vorgänger2] erwartet"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: Ungültiger Quellarchiv-Typ"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: Fehlendes oder nicht unterstütztes Archiv"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: Ungültiger Zielarchiv-Typ"
+
+# Wird nur in einer Fehlermeldung verwendet, daher macht es hier sinn, den Namen des Befehls unübersetzt auszugeben.
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: Unbekannter Archivtyp"
+
+msgid "getting files"
+msgstr "Hole Dateien"
+
+msgid "revisions"
+msgstr "Revisionen"
+
+msgid "scanning"
+msgstr "Durchsuchen"
+
+#, fuzzy, python-format
+msgid "splice map revision %s is not being converted, ignoring\n"
+msgstr "Spleißdatei-Revision %s wird nicht konvertiert und ignoriert\n"
+
+#, fuzzy, python-format
+msgid "unknown splice map parent: %s"
+msgstr "Unbekannte Spleißdatei-Vorgänger %s"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "Unbekannte Sortiermethode: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "Schleife gefunden zwischen %s und %s"
+
+msgid "not all revisions were sorted"
+msgstr "Nicht alle Revisionen wurden sortiert"
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr "Schreibe Autoren-Abbildungsdatei %s\n"
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr "Ignoriere fehlerhafte Zeile in Autoren-Abbildungsdatei %s: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "Bilde Autor %s auf %s ab\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "Überschreibe Abbildung für Autor %s: war %s, wird %s\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "%s als Eltern von %s verbunden\n"
+
+msgid "scanning source...\n"
+msgstr "Durchsuche Quelle...\n"
+
+msgid "sorting...\n"
+msgstr "Sortiere...\n"
+
+msgid "converting...\n"
+msgstr "Konvertiere...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "Quelle: %s\n"
+
+msgid "converting"
+msgstr "Konvertiere"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "Nehme %s als Ziel an\n"
+
+msgid "more than one sort mode specified"
+msgstr "Mehr als ein Sortiermodus angegeben"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "Option --sourcesort ist für diese Archivquelle nicht unterstützt"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s scheint keine CVS-Arbeitskopie zu sein"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr "Revision %s ist keine Patchsatz-Nummer"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "Verbinde mit %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "CVS pserver-Authentifizierung fehlgeschlagen"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+"Unerwartete Antwort vom CVS-Server (erwartete \"Valid-requsts\", erhielt %r)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "%d Bytes fehlen in entfernter Datei"
+
+msgid "malformed response from CVS"
+msgstr "Fehlerhafte Antwort von CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "CVS-Server: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "Unbekannte CVS-Antwort: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "Sammle CVS-rlog\n"
+
+msgid "not a CVS sandbox"
+msgstr "keine CVS-Sandkastenumgebung"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "Lese CVS Log-Zwischenspeicher %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "Zwischenspeicher hat %d Logbucheinträge\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "Fehler beim Lesen des Zwischenspeichers: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "Führe %s aus\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "RCS-Datei muss von Arbeitsdatei gefolgt sein"
+
+msgid "must have at least some revisions"
+msgstr "Mindestens ein paar Revisionen sind benötigt"
+
+msgid "expected revision number"
+msgstr "Revisionsnummer erwartet"
+
+msgid "revision must be followed by date line"
+msgstr "Revision muss von einer Datumszeile gefolgt sein"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+"Log-Zwischenspeicher überschneidet sich mit neuen Logeinträgen,\n"
+"bitte führe den Vorgang erneut ohne Zwischenspeicher aus."
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "Schreibe CVS Log-Zwischenspeicher %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d Logbucheinträge\n"
+
+msgid "creating changesets\n"
+msgstr "Erzeuge Änderungssätze\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "Künstliche Änderungssätze können nicht mehrere Vorfahren haben"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"Warnung: CVS-Versionsmeldung benennt nicht existierenden Zweig %r:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d Änderungssatz-Einträge\n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s scheint kein darcs-Archiv zu sein"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "darcs Version 2.1 oder neuer benötigt (%r gefunden)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Python-Modul ElementTree ist nicht verfügbar"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "%s Repository Format wird nicht unterstützt, bitte upgraden"
+
+msgid "failed to detect repository format!"
+msgstr "Repository Format kann nicht festgestellt werden!"
+
+msgid "internal calling inconsistency"
+msgstr "Inkonsistenz bei internem Aufruf"
+
+msgid "errors in filemap"
+msgstr "Fehler in Dateinamen-Abbildungsdatei"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr "%s:%d: Pfad zu %s fehlt\n"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r ist bereits in %s-Liste\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr "%s:%d: überflüssiger / in %s %r\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: Unbekannte Direktive %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "Quellarchiv unterstützt die Option --filemap nicht"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s scheint kein git-Archiv zu sein"
+
+msgid "cannot retrieve git heads"
+msgstr "Kann git-Kopfdaten nicht empfangen"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "Kann Objekt %r in %s nicht lesen"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "Kann Änderungen in %s nicht lesen"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "Kann Tags aus %s nicht lesen"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s scheint kein GNU Arch-Archiv zu sein"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "Kann kein GNU Arch-Programm finden"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "Analysiere Baumversion %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+"Baumanalyse gestoppt, da er ein unregistriertes Archiv %s referenziert...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr "Konnte cat-log von %s nicht verarbeiten"
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s ist kein lokales Mercurial-Projektarchiv"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "Initialisiere Ziel-Projektarchiv %s\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "Konnte hg-Archiv %s nicht als Senke erzeugen"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "Hole von %s nach %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "Filtere leere Revision aus\n"
+
+msgid "updating tags\n"
+msgstr "Aktualisiere Etiketten\n"
+
+msgid "updating bookmarks\n"
+msgstr "Aktualisiere Lesezeichen\n"
+
+#, fuzzy, python-format
+msgid ""
+"revision %s not found in destination repository (lookups with "
+"clonebranches=true are not implemented)"
+msgstr ""
+"Revision %s wurde im Ziel-Archiv nicht gefunden (Lookups mit "
+"clonebranches=true sind nicht implementiert)"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s ist keine gültige Startrevision"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "Ignoriere: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s scheint kein monotone-Archiv zu sein"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr "Fehlerhaftes mtn-Paket - Ende von commandnbr nicht gefunden"
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr "Fehlerhaftes mtn-Paket - Falscher Stromtyp %s"
+
+msgid "bad mtn packet - no divider before size"
+msgstr "Fehlerhaftes mtn-Paket - Kein Teiler vor der Größenangabe"
+
+msgid "bad mtn packet - no end of packet size"
+msgstr "Fehlerhaftes mtn-Paket - Ende der Größenangabe nicht gefunden"
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr "Fehlerhaftes mtn-Paket - Ungültige Größenangabe %s"
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr ""
+"Fehlerhaftes mtn-Paket - Konnte Paket %s von %s nicht vollständig auslesen"
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "mtn Befehl '%s' gab %s zurück"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "Kopiere Dateien in unbenanntem Verzeichnis von '%s' nach '%s'"
+
+msgid "unable to determine mtn automate interface version"
+msgstr "Konnte die Version der mtn automate-Schnittstelle nicht herausfinden"
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr ""
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr "Konnte den Endpunkt der mtn automate-Schnittstelle nicht erreichen"
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s scheint kein P4-Archiv zu sein"
+
+msgid "reading p4 views\n"
+msgstr "Lese p4-Ansichten\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "Sammle p4-Änderungslisten\n"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+"Mercurial konnte sich selbst nicht ausführen, prüfe, ob die Programmdatei\n"
+"in PATH enthalten ist."
+
+#, fuzzy, python-format
+msgid "log stream exception '%s'"
+msgstr "Log-Stream-Ausnahme'%s'"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+"SVN: Kann entferntes Projektarchiv nicht untersuchen; nehme an, es handelt "
+"sich um ein Subversion-Projektarchiv.\n"
+"Verwende --source, wenn Sie es besser wissen.\n"
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s scheint kein Subversion-Archiv zu sein"
+
+msgid "Could not load Subversion python bindings"
+msgstr "Subversion Python-API konnte nicht geladen werden"
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+"Pythons Subversion-Unterstützung in Version %d.%d gefunden,\n"
+"aber 1.4 oder neuer wird benötigt"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+"Pythons Subversion-Unterstützung ist zu alt. 1.4 oder neuer wird benötigt."
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "SVN: Revision %s ist keine Ganzzahl"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "SVN: Startrevision %s ist keine Ganzzahl"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "Keine Revision in Modul %s gefunden"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "%s in %r erwartet aber nicht gefunden"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "%s in %r gefunden\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "Ignoriere leeren Zweig %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "Zweig %s in r%d gefunden\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "SVN: Startrevision wird nur für einzelnen Zweig unterstützt"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "SVN: Keine Revision nach Startrevision %d gefunden"
+
+#, python-format
+msgid "svn: revision %s not found"
+msgstr "SVN: Revision %s nicht gefunden"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "%s nicht bis Revision %d gefunden"
+
+msgid "scanning paths"
+msgstr "Durchsuche Pfade"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "Vorfahr von Zweig %s gefunden in r%d: %s\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "Hole Revisionslogbuch für \"%s\" aus %d nach %d\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "SVN: Zweig hat keine Revision r%s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "Initialisiere SVN-Projektarchiv %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "Initialisiere SVN-Arbeitskopie %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "Unerwartete SVN-Ausgabe:\n"
+
+msgid "unable to cope with svn output"
+msgstr "Konnte mit SVN-Ausgabe nichts anfangen"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "Schreiben von Subversion-Tags ist noch nicht implementiert\n"
+
+#, python-format
+msgid ""
+"splice map revision %s not found in subversion child map (revision lookups "
+"are not implemented)"
+msgstr ""
+
+msgid "automatically manage newlines in repository files"
+msgstr "Verwaltet automatisch Zeilenumbrüche in Archivdateien"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+"Diese Erweiterung erlaubt es, die Arten von Zeilenumbrüchen (CRLF oder LF)\n"
+"zu verwalten, die im Projektarchiv und der Arbeitskopie verwendet werden.\n"
+"Auf diese Weise kann unter Windows CRLF und unter Unix/Mac LF verwendet\n"
+"werden, womit jeder die nativen Zeilenumbrüche seines System nutzen kann."
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+"Die Erweiterung liest ihre Konfiguration aus der versionierten ``.hgeol``-\n"
+"Datei aus, wann immer ein ``hg``-Befehl ausgeführt wird. Die ``.hgeol``-\n"
+"Datei benutzt die gleiche Syntax wie alle anderen Konfigurationsdateien.\n"
+"Sie verwendet zwei Bereiche, ``[patterns]`` und ``[repository]``."
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+"Der Bereich ``[patterns]`` spezifiziert die Zeilenumbrüche, die in der\n"
+"Arbeitskopie verwendet werden. Das Format wird über ein Dateimuster\n"
+"angegeben. Der erste Treffer wird verwendet, also sollten Sie spezifi-\n"
+"schere Muster oben notieren. Die verfügbaren Zeilenenden sind ``LF``,\n"
+"``CRLF`` und ``BIN``."
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+"Dateien mit dem deklarierten Format ``CRLF`` oder ``LF`` werden immer\n"
+"in diesem Format ausgecheckt; Dateien, die als binär (``BIN``) angegeben\n"
+"sind, werden nicht verändert. Zusätzlich kann ``native`` als Alias für\n"
+"die Voreinstellung des jeweiligen Systems verwendet werden: ``LF`` unter "
+"Unix\n"
+"(inkl. Mac OS X) und ``CRLF`` unter Windows. Beachten Sie, dass ``BIN ``\n"
+"(nichts ändern) Mercurials Standardverhalten ist; es dient nur dazu,\n"
+"um ein späteres, allgemeineres Muster zu überschreiben."
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+"Der optionale Bereich ``[repository]`` spezifiziert die Zeilenenden,\n"
+"die für Dateien im Projektarchiv verwendet werden sollen. Er besteht aus\n"
+"einer einzelnen Einstellung, ``native``, die angibt, wie Dateien, die\n"
+"als ``native`` gespeichert werden sollen (``[patterns]``-Bereich),\n"
+"behandelt werden. Der Wert kann auf ``CRLF`` oder ``LF`` gesetzt werden.\n"
+"Die Voreinstellung ist ``LF``. Zum Beispiel bedeutet dies, dass unter\n"
+"Windows Dateien, die als ``native`` (standardmäßig ``CRLF``)\n"
+" gespeichert werden sollen, nach ``LF`` konvertiert werden, bevor sie im\n"
+"Archiv abgelegt werden. Dateien, die als ``LF``, ``CRLF`` oder ``BIN``\n"
+"in ``[patterns]`` angeben wurden, werden immer ungeändert ins Archiv\n"
+"übernommen."
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr "Beispiel ``.hgeol``-Datei::"
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+" [repository]\n"
+" native = LF"
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+".. note::\n"
+" Die Regeln werden erst angewendet, wenn Dateien in der Working Copy\n"
+" berührt werden, z.B. durch Updaten auf null und wieder zurück auf tip,\n"
+" um alle Dateien zu berühren."
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"Die Erweiterung verwendet einen optionalen ``[eol]``-Bereich in der\n"
+"Konfigurationsdatei und mit höherer Priorität in der ``.hgeol``-Datei, um\n"
+"das systemweite Verhalten zu definieren. Es gibt drei Einstellungen:"
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+"- ``eol.native`` (Voreinstellung ``os.linesep``) kann auf ``LF`` oder\n"
+" ``CRLF`` gesetzt werden, um die Interpretation von ``native`` beim\n"
+" Aktualisieren zu überschreiben. Dies kann mit :hg:``archive`` unter Unix\n"
+" verwendet werden, um bspw. ein Archiv zu erzeugen, in dem alle Dateien\n"
+" Windows-Zeilenumbrüche haben."
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+"- ``eol.only-consistent`` (standardmäßig True) kann auf False gesetzt\n"
+" werden, um die Erweiterung auch Dateien mit inkonsistenten Zeilen-\n"
+" umbrüchen verarbeiten zu lassen. Inkonsistent bedeutet, dass sowohl\n"
+" ``CRLF`` als auch ``LF`` in einer Datei enthalten sind. Solche Dateien\n"
+" werden normalerweise nicht angefasst, unter der Annahme, dass sie aus\n"
+" gutem Grund wechselnde Zeilenumbrüche haben."
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+"- ``eol.fix-trailing-newline`` (standardmäßig False) kann auf True gesetzt\n"
+" werden um sicherzustellen, dass die konvertierten Dateien mit einem\n"
+" konfigurierten Zeilenumbruch enden (entweder ``\\n`` oder ``\\r\\n``)."
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+"Die Extension stellt ``clevercode:`` und ``cleverdecode:`` Filter zur\n"
+"Verfügung, ähnlich der veralteten win32text Extension. Das bedeutet, daß\n"
+"Sie win32text ausschalten und eol einschalten können und Ihre Filter\n"
+"weiterhin funktionieren. Sie müssen diese Filter nur solange verwenden, bis\n"
+"Sie eine ``.hgeol`` Datei angelegt haben."
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+"Die ``win32text.forbid*`` Hooks, die von der win32text Extension zur\n"
+"Verfügung gestellt werden, sind in einem einzelnen Hook zusammengeführt\n"
+"worden: ``eol.checkheadshook``. Der Hook liest die erwarteten Zeilenenden\n"
+"aus der ``.hgeol`` Datei aus, daher muss zuerst eine ``.hgeol`` Datei\n"
+"anlegen werden, bevor Sie den Hook verwenden können. Er werden nur\n"
+"Kopfversionen geprüft; intermediäre Revisionen mit ungültigen Zeilenenden\n"
+"werden übertragen. Um auch dies zu verbieten, kann der ``eol.checkallhook``\n"
+"verwendet werden. Sie eignen sich am besten für ``pretxnchangegroup`` Hooks."
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+"Siehe auch :hg:`help patterns` für mehr Informationen über die verwendeten\n"
+"Glob-Muster.\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "Ignoriere unbekannten EOL-Stil '%s' aus '%s'\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr "Warning: Ignoriere .hgeol Datei wegen eines Parserfehlers bei %s: %s\n"
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s in %s sollte keine %s-Zeilenumbrüche haben"
+
+msgid "end-of-line check failed:\n"
+msgstr "Zeilende-Prüfung fehlgeschlagen:\n"
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "Die eol-Erweiterung ist inkompatibel mit der win32text-Erweiterung.\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "Inkonsistente Zeilenumbrüche in %s\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr "Erlaubt externen Programmen, Revisionen zu vergleichen"
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+"Die extdiff Erweiterung erlaubt es, zwei Revisionen oder eine Revision mit\n"
+"dem Arbeitsverzeichnis durch ein externes Programm vergleichen zu lassen.\n"
+"Ein solches Programm wird mit konfigurierbaren Parameters und zwei nicht-\n"
+"Optionen aufgerufen. Dies sind die Pfad zu den zu vergleichenden Daten."
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+"Die extdiff-Erweiterung erlaubt auch die Definition von neuen\n"
+"diff-Befehlen, so dass man nicht immer :hg:`extdiff -p kdiff3` eingeben\n"
+"muss. ::"
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+" [extdiff]\n"
+" # Fügt neues Kommando für GNU diff(1) im 'context diff' Modus hinzu\n"
+" cdiff = gdiff -Nprc5\n"
+" ## oder auf die alte Art:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # Fügt neues Kommando \"vdiff\" hinzu, welches kdiff3 ausführt\n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+" # Fügt Kommando \"meld\" hinzu, welches meld ausführt (Name muss nicht\n"
+" # wiederholt werden)\n"
+" meld ="
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+msgstr ""
+" # Fügt Kommando \"vimdiff\" hinzu, welches gvimdiff mit dem DirDiff-"
+"Plugin\n"
+" # ausführt. (http://www.vim.org/scripts/script.php?script_id=102).\n"
+" # Die .vimrc sollte dazu \"let g:DirDiffDynamicDiffText = 1\" enthalten.\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+"Die Argumente der Werkzeuge können Variablen enthalten, die zur Laufzeit\n"
+"ersetzt werden::"
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+" $parent1, $plabel1 - Dateiname, Beschreibung des ersten Vorfahren\n"
+" $child, $clabel - Dateiname, Beschreibung der Kindrevision\n"
+" $parent2, $plabel2 - Dateiname, Beschreibung des zweiten Vorfahren\n"
+" $root - Wurzelverzeichnis des Projektarchivs\n"
+" $parent ist ein Alias für $parent1."
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+"Die extdiff-Erweiterung wird in Ihren Abschnitten [diff-tools] und\n"
+"[merge-tools] nach Argumenten für diff-Werkzeuge suchen, wenn keine\n"
+"im Abschnitt [extdiff] angegeben wurden."
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+"Man kann die Optionen -I/-X und die Liste von Datei- oder Verzeichnisnamen\n"
+"wie beim normalen :hg:`diff`-Befehl verwenden. Die extdiff-Erweiterung\n"
+"macht nur Schnappschüsse von den benötigten Dateien, so dass die\n"
+"Ausführungs der externen Differs eigentlich ziemlich schnell verläuft\n"
+"(zumindest schneller als beim Vergleich des gesamten Verzeichnisbaums).\n"
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr "Erstelle Schnappschuss von %d Dateien aus Revision %s\n"
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr "Erstelle Schnappschuss von %d Dateien aus dem Arbeitsverzeichnis\n"
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "--rev und --change können nicht gleichzeitig angegeben werden"
+
+msgid "cleaning up temp directory\n"
+msgstr "Säubere temporäres Verzeichnis\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr "Externes Vergleichsprogramm für Archiv- oder Dateiänderungen"
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+" Zeigt die Unterschiede zwischen den Revisionen der angegeben Dateien\n"
+" durch Aufruf eines externen Programms. Standardmäßig ist dies \"diff\"\n"
+" mit den Optionen \"-Npru\"."
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+" Um ein anderes Programm zu verwenden, nutze die Option -p/--program.\n"
+" Die zwei zu vergleichenden Verzeichnisse werden automatisch als "
+"Aufrufs-\n"
+" parameter angenommen. Weitere Parameter können durch die Option\n"
+" -o/--option hinzugefügt werden. Diese werden vor den Verzeichnisnamen\n"
+" übergeben."
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+" Werden zwei Revisionen angegeben, dann werden die Änderungen zwischen\n"
+" diesen angezeigt. Ist nur eine Revision angegeben, so wird diese\n"
+" mit dem Arbeitsverzeichnis verglichen. Ohne Angabe einer Revision\n"
+" werden die lokalen Änderungen im Arbeitsverzeichnis zu seinem Vorfahren\n"
+" angezeigt."
+
+msgid "CMD"
+msgstr "BEFEHL"
+
+msgid "comparison program to run"
+msgstr "das externe Vergleichsprogramm"
+
+msgid "OPT"
+msgstr "OPT"
+
+msgid "pass option to comparison program"
+msgstr "Aufrufparameter für das Vergleichsprogramm"
+
+msgid "revision"
+msgstr "Revision"
+
+msgid "change made by revision"
+msgstr "Von dieser Revision erzeugte Änderung"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [OPT]... [DATEI]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr "Verwendet %(path)s um Archiv- oder Dateirevisionen zu vergleichen"
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+" Zeigt die Unterschiede zwischen Revisionen der angegebenen Dateien\n"
+" durch das Programm %(path)s an."
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [OPTION]... [DATEI]..."
+
+msgid "http authentication with factotum"
+msgstr "HTTP-Authentifizierung mit factotum"
+
+msgid ""
+"This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
+"platforms to provide authentication information for HTTP access. "
+"Configuration\n"
+"entries specified in the auth section as well as authentication information\n"
+"provided in the repository URL are fully supported. If no prefix is "
+"specified,\n"
+"a value of \"*\" will be assumed."
+msgstr ""
+
+msgid "By default, keys are specified as::"
+msgstr "Standardmäßig werden Schlüssel wie folgt angegeben::"
+
+msgid ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+" proto=pass service=hg prefix=<Präfix> user=<Benutzername> !"
+"password=<Passwort>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"Wenn die Factotum-Erweiterung den benötigten Schlüssel nicht lesen kann,\n"
+" wird man interaktiv danach gefragt."
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"Ein Konfigurations-Abschnitt ist verfügbar, um das Laufzeitverhalten\n"
+"anzupassen. Standartmäßig sind die Einträge die folgenden::"
+
+msgid ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+msgstr ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"Der \"executable\"-Eintrag gibt den vollen Pfad zur Programmdatei von\n"
+"Factotum am. Der \"mountpoint\"-Eintrag gibt den Pfad zum\n"
+"Factotum-Dateidienst an. Zum Schluss setzt der \"service\"-Eintrag den\n"
+"Dienstnamen, der beim Lesen der Schlüssel verwendet wird."
+
+msgid "factotum not interactive"
+msgstr "Factotum ist nicht interaktiv"
+
+msgid "factotum not responding"
+msgstr "Factotum reagiert nicht"
+
+msgid "pull, update and merge in one command (DEPRECATED)"
+msgstr ""
+"Abrufen, Aktualisieren und Zusammenführen in einem Befehl zusammengefasst "
+"(VERALTET)"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+"Ruft Änderungen aus einem entfernten Projektarchiv ab und führt sie, falls "
+"nötig, zusammen."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" Dies selektiert alle Änderungen des Projektarchivs am angegebenen Pfad\n"
+" oder der URL und fügt sie dem lokalen Projektarchiv hinzu."
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+" Wenn die abgerufenen Änderungen einen neuen Zweigkopf erzeugen, wird\n"
+" dieser Kopf automatisch zusammengeführt und das Resultat als neue\n"
+" Revision übernommen. Andernfalls wird das Arbeitsverzeichnis mit den\n"
+" neue Änderungen aktualisiert."
+
+msgid ""
+" When a merge is needed, the working directory is first updated to\n"
+" the newly pulled changes. Local changes are then merged into the\n"
+" pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+" Wenn eine Zusammenführung benötigt wird, wird zunächst das\n"
+" Arbeitsverzeichnis auf die neuen Änderungen aktualisiert.\n"
+" Lokale Änderungen werden dann mit den heruntergeladenen\n"
+" zusammengeführt. Um die Reihenfolge zu ändern, benutzen Sie\n"
+" --switch-parent."
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Siehe :hg:`help dates` für eine Liste gültiger Formate für -d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"Arbeitsverzeichnis ist nicht Spitze des Zweiges (nutze \"hg update\" um auf\n"
+"die Zweigspitze zu wechseln)"
+
+msgid "outstanding uncommitted merge"
+msgstr "Ausstehende nicht versionierte Zusammenführung"
+
+msgid "outstanding uncommitted changes"
+msgstr "Ausstehende nicht versionierte Änderungen"
+
+msgid "working directory is missing some files"
+msgstr "Im Arbeitsverzeichnis fehlen Dateien"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"Mehrere Kopfversionen in diesem Zweig (Nutze \"hg heads .\" und \"hg merge"
+"\"\n"
+"um zusammenzuführen)"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "Rufe von %s ab\n"
+
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann "
+"keine Revision angegeben werden."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+"Führe %d andere neue Zweigköpfe nicht zusammen (Nutze \"hg heads .\" und "
+"\"hg merge\" um sie zusammenzuführen)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "Aktualisiere auf %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "Führe zusammen mit %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+"Neuer Änderungssatz %d:%s führt entfernte Änderungen mit lokalen zusammen\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "Revision, die geholt werden soll"
+
+msgid "edit commit message"
+msgstr "Editiere Versionsmeldung"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "Editiere Versionsmeldung (VERALTET)"
+
+msgid "switch parents when merging"
+msgstr "Vertauscht Vorgänger bei Zusammenführung"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [QUELLE]"
+
+msgid "commands to sign and verify changesets"
+msgstr "Nutzt eine Programm um den Fehlerstatus zu bestimmen"
+
+msgid "error while verifying signature"
+msgstr "Fehler beim Überprüfen der Signatur"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s Fehlerhafte Signatur von \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Anmerkung: Signatur ist veraltet (signiert von: \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Anmerkung: Dieser Schlüssel ist veraltet (signiert von: \"%s\")\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "Zeigt signierte Änderungssätze"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "%s:%d Knoten existiert nicht\n"
+
+msgid "hg sigcheck REVISION"
+msgstr "hg sigcheck REVISION"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr "überprüfe alle für eine bestimmte Revision vorhandenen Signaturen"
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr "Keine gültige Signatur für %s\n"
+
+msgid "make the signature local"
+msgstr "signiert nur lokal"
+
+msgid "sign even if the sigfile is modified"
+msgstr "signiert auch, wenn die Signaturdatei geändert ist"
+
+msgid "do not commit the sigfile after signing"
+msgstr "Signaturdatei nach dem Signieren nicht übernehmen"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "Die Schlüssel-ID zum Signieren"
+
+msgid "TEXT"
+msgstr "TEXT"
+
+msgid "commit message"
+msgstr "Versionsmeldung"
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr "hg sign [OPTION]... [REVISION]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "Fügt der aktuellen oder gegebenen Revision eine Signatur hinzu"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Wenn keine Revision angegeben ist, wird der Vorgänger des Arbeits-\n"
+" verzeichnisses verwendet, oder die Spitze des Archivs, falls keine\n"
+" (die null-) Version geladen ist."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Siehe :hg:`help dates` für eine Liste gültiger Datumsformate für\n"
+" -d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+"Nicht versionierte Zusammenführung - bitte gib eine bestimmte Revision an"
+
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Signiere %d:%s\n"
+
+msgid "error while signing"
+msgstr "Fehler beim Signieren"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"Arbeitskopie der Datei .hgsigs wurde geändert (bitte manuell übernehmen oder "
+"--force verwenden)"
+
+msgid "unknown signature version"
+msgstr "Unbekannte Version der Signatur"
+
+msgid "command to view revision graphs from a shell"
+msgstr "Befehl zum Anzeigen eines Revisionsgraphs auf dem Terminal"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"Diese Erweiterung für bei den Befehlen incoming, outgoing und log die\n"
+"Option --graph hinzu, die, wenn sie angegeben wird, zusätzlich eine\n"
+"ASCII-Darstellung des Änderungsgraphen angezeigt.\n"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "Option -G/--graph ist inkompatibel zu --%s"
+
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "Kann in Vorgängerrevision fehlender Datei nicht folgen: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "Kann fehlender Datei nicht folgen: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+"Kopien/Umbenennungen können nur zu expliziten Dateinamen verfolgt werden"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"Folgt der Versionshistorie oder Dateihistorie über Kopien und Umbenennungen "
+"hinweg"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "Folgt nur dem ersten Vorgänger von Zusammenführungen (VERALTET)"
+
+msgid "show revisions matching date spec"
+msgstr "Zeigt Revisionen passend zur Datums-Spezifikation"
+
+msgid "show copied files"
+msgstr "Zeigt kopierte Dateien"
+
+msgid "do case-insensitive search for a given text"
+msgstr "Sucht ein Stichwort unabhängig von Groß- und Kleinschreibung"
+
+msgid "show the specified revision or range"
+msgstr "Zeigt die angegebene Revision oder den Bereich"
+
+msgid "include revisions where files were removed"
+msgstr "Revisionen einschließen, in denen Dateien entfernt wurden"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "Zeigt nur Zusammenführungen (VERALTET)"
+
+msgid "USER"
+msgstr "BENUTZER"
+
+msgid "revisions committed by user"
+msgstr "Revisionen vom Nutzer"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "Zeigt nur Änderungssätze innerhalb des angegebenen Zweigs (VERALTET)"
+
+msgid "BRANCH"
+msgstr ""
+
+msgid "show changesets within the given named branch"
+msgstr "Zeigt nur Änderungssätze innerhalb des angegebenen Zweigs"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "Gibt weder diese Revision noch ihre Vorgänger aus"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "Zeigt versteckte Änderungssätze (VERALTET)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPTION]... [DATEI]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "Zeigt die Revisionshistorie zusammen mit einem ASCII Revisionsgraphen"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr " Zeigt die Revisionshistorie und einen ASCII-Graphen an."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Das @-Zeichen kennzeichnet die Vorgänger des Arbeitsverzeichnisses.\n"
+" "
+
+msgid "show the revision DAG"
+msgstr "Zeigt den Revisions-DAG"
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr "Hooks zur Integration mit dem CIA.cv-Benachrichtigungsdienst"
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+"Dies ist dafür gedacht, als Hook für changegroup oder incoming eingesetzt\n"
+"zu werden. Um es zu konfigurieren, setzen Sie die folgenden Optionen in\n"
+"Ihrer hgrc::"
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+" [cia]\n"
+" # Ihr registrierter CIA-Benutzername\n"
+" user = foo\n"
+" # der Name des Projekts bei CIA\n"
+" project = foo\n"
+" # das Modul (Unterprojekt) (optional)\n"
+" #module = foo\n"
+" # Hänge eine Statistik über Änderungen an die Versionsmeldung an\n"
+" # (optional)\n"
+" #diffstat = False\n"
+" # Vorlage für die Versionsmeldungen (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # zu verwendender Stil (optional)\n"
+" #style = foo\n"
+" # Die URL des CIA Benachrichtigungsdienstes (optional)\n"
+" # Sie können mailto:-URLs verwenden, um E-Mails zu senden, z.B.\n"
+" # mailto:cia@cia.vc\n"
+" # Stellen Sie sicher, dass Sie email.from korrekt eingerichtet haben,\n"
+" # wenn Sie dies tun.\n"
+" #url = http://cia.vc/\n"
+" # Nachrichten ausgeben statt sie zu senden (optional)\n"
+" #test = False\n"
+" # Anzahl von Verzeichnissen, die von URL-Pfaden entfernt werden sollen\n"
+" #strip = 0"
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+" [hooks]\n"
+" # einer von diesen:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+" [web]\n"
+" # Wenn Sie Hyperlinks möchten (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s gab einen Fehler zurück: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: Sende Aktualisierung an %s\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "email.from muss definiert werden, wenn E-Mails gesendet werden"
+
+msgid "browse the repository in a graphical way"
+msgstr "durchstöbert das Projektarchiv auf grafische Weise"
+
+#, fuzzy
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+"Die hgk-Erweiterung erlaubt das Durchstöbern der Historie eines\n"
+"Projektarchivs auf grafische Weise. Sie benötigt Tcl/Tk in Version 8.4\n"
+"oder neuer. (Tcl/Tk wird nicht mit Mercurial ausgeliefert.)"
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+"hgk besteht aus zwei Teilen: Ein Tcl-Skript, das die Anzeige und das\n"
+"Abrufen der Informationen übernimmt, und eine Mercurial-Erweiterung\n"
+"namens hgk.py, die Hooks für hgk bereitstellt. hgk kann im Verzeichnis\n"
+"contrib gefunden werden, während die Erweiterung im hgext-Archiv liegt\n"
+"und extra aktiviert werden muss."
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+"Der :hg:`view`-Befehl wird das hgk Tcl-Skript starten. Damit dies\n"
+"funktioniert, muss hgk im Suchpfad vorhanden sein. Alternativ kann der\n"
+"Pfad zu hgk auch in Ihrer Konfigurationsdatei angegeben werden::"
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/pfad/zu/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+"hgk kann die extdiff-Erweiterung nutzen, um Revisionen anzuzeigen.\n"
+"Angenommen, extdiff ist bereits mit dem vdiff-Befehl konfiguriert, muss\n"
+"nur das Folgende ergänzt werden::"
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+"Das Kontextmenü von Revisionen wird nun einen zusätzlichen Eintrag\n"
+"anzeigen, um vdiff auf markierten (und bei Mouse-Over) Revisionen\n"
+"auszuführen.\n"
+
+msgid "diff trees from two commits"
+msgstr "Vergleicht (Teil)bäume von zwei Revisionen"
+
+msgid "output common ancestor information"
+msgstr "gibt Informationen über gemeinsame Vorfahren aus"
+
+msgid "cat a specific revision"
+msgstr "gibt eine bestimmte Revision aus"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: Typ oder Revision nicht angegeben\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "Breche cat-file ab: Nur Commits werden unterstützt\n"
+
+msgid "parse given revisions"
+msgstr "Verarbeitet angegebene Revisionen"
+
+msgid "print revisions"
+msgstr "Revisionen ausgeben"
+
+msgid "print extension options"
+msgstr "Gibt die Optionen der Erweiterung aus"
+
+msgid "start interactive history viewer"
+msgstr "Startet den interaktiven Historienbetrachter"
+
+msgid "NUM"
+msgstr "NUM"
+
+msgid "limit number of changes displayed"
+msgstr "Begrenzt die Anzahl der angezeigten Änderungen"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l LIMIT] [REVBEREICH]"
+
+msgid "generate patch"
+msgstr "Patch erzeugen"
+
+msgid "recursive"
+msgstr "rekursiv"
+
+msgid "pretty"
+msgstr "hübsch"
+
+msgid "stdin"
+msgstr "stdin (Standardeingabe)"
+
+msgid "detect copies"
+msgstr "erkennt Kopien"
+
+msgid "search"
+msgstr "Suche"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [OPTION]... KNOTEN1 KNOTEN2 [DATEI]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [OPTION]... TYP DATEI"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr "hg debug-merge-base REV REV"
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "ignoriert"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse REV"
+
+msgid "header"
+msgstr "Kopfbereich"
+
+msgid "topo-order"
+msgstr "topologische Sortierung"
+
+msgid "parents"
+msgstr "Eltern"
+
+msgid "max-count"
+msgstr "maximale Anzahl"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [OPTION]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "Syntax-Hervorhebung für hgweb (erfordert Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"Dies hängt von der Syntaxhervorhebungs-Bibliothek Pygments ab:\n"
+"http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "Es gibt eine einzelne Konfigurationsoption::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <style>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "Die Voreinstellung ist 'colorful'.\n"
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr "Beschleunigt die Statusabfrage mit dem inotify-Dient von Linux"
+
+msgid "start an inotify server for this repository"
+msgstr "Startet einen inotify-Server für dieses Projektarchiv"
+
+msgid "debugging information for inotify extension"
+msgstr "Informationen zur Fehlersucht für die inotify-Erweiterung"
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+" Gibt eine Liste von Verzeichnissen aus, die von dem inotify-Server\n"
+" überwacht werden."
+
+msgid "directories being watched:\n"
+msgstr "Ãœberwachte Verzeichnisse:\n"
+
+msgid "run server in background"
+msgstr "Server im Hintergrund ausführen"
+
+msgid "used internally by daemon mode"
+msgstr "Wird intern im Server-Modus genutzt"
+
+msgid "minutes to sit idle before exiting"
+msgstr "Minuten, bevor wegen Untätigkeit beendet wird"
+
+msgid "name of file to write process ID to"
+msgstr "Dateiname für Prozess-ID"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [OPTION]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr "inotify-Client: toten inotify-Serversocket gefunden; entferne ihn\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-Client: Konnte inotify-Server nicht starten: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+"inotify-Client: Konnte nicht mit dem neuen inotify-Server sprechen: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-Client: Kontakt zum inotify-Server fehlgeschlagen: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-Client: Leere Antwort vom inotify-Sever emfpangen"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+"(inotify: Antwort eines Servers mit inkompatibler Version %d empfangen)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: '%s' Antwort erhalten, aber '%s' erwartet)\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "Dieses System scheint inotify nicht zu unterstützen."
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr "*** Das aktuelle Benutzer-Limit für inotify-Beobachter ist %s\n"
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+"*** Dieses Limit ist zu gering, um jedes Verzeichnis dieses Archivs zu\n"
+"*** überwachen.\n"
+
+msgid "*** counting directories: "
+msgstr "*** Zähle Verzeichnisse: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "%d gefunden\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr "*** um das Limit von %d auf %d zu heben (als root ausführen):\n"
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+"Kann Verzeichnis %s nicht überwachen, bis das inotify-Limit erhöht wurde."
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "inotify-Dienst ist nicht verfügbar: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "Beobachte %r\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "Beobachte Verzeichnisse unterhalb von %r\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "%s-Ereignis: %s erstellt\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "%s-Ereignis: %s gelöscht\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "%s-Ereignis: %s geändert\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "Dateisystem, das %s enthielt, wurde ausgehängt\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s lesbar: %d Bytes\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr "%s unterhalb der Grenze - hänge aus\n"
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr "%s Lese %d Ereignisse\n"
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr "%s Hänge wieder mit %d lesbaren Bytes ein\n"
+
+msgid "finished setup\n"
+msgstr "Einrichtung abgeschlossen\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "Status: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr "Untersuche erneut, da sich die .hgignore geändert hat\n"
+
+msgid "cannot start: socket is already bound"
+msgstr "Kann nicht starten: Socket wird bereits verwendet"
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+"Kann nicht starten: Versucht, .hg/inotify.sock auf ein temporäres Socket zu "
+"linken, aber .hg/inotify.sock existiert bereits."
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr "Beantworte Anfrage für %r\n"
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr "Anfrage von Client mit inkompatibler Version %d empfangen\n"
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "Unbekannte Anfrageart: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr "Erweitert Ausdrücke in der Historie und Zusammenfassungen"
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+"Diese Erweiterung erlaubt es, eine spezielle Syntax in der Zusammenfassung\n"
+"zu verwenden, die automatisch in Links oder jeden beliebigen anderen\n"
+"Ausdruck ausgewertet werden, in etwa so, wie es InterWiki macht."
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+"Ein paar Beispiel-Muster (Link zu einem Bugtracker usw.), die in Ihrer\n"
+".hgrc verwendet werden können::"
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" fehler = s!fehler(\\d+)!<a href=\"http://bts/issue\\1\">fehler\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" fett = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr "interhg: Ungültiges Muster für %s: %s\n"
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr "interhg: Ungültiger Regulärer Ausdruck für %s: %s\n"
+
+msgid "expand keywords in tracked files"
+msgstr "erweitert Platzhalter in versionierten Dateien"
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+"Diese Erweiterung ersetzt RCS/CVS-artige oder selbstdefinierte\n"
+"$Platzhalter$ in versionierten Textdateien, die von Ihrer Konfiguration\n"
+"angegeben werden."
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+"Platzhalter werden nur in lokalen Archiven ersetzt und nicht in der\n"
+"Versionshistorie gespeichert. Dieser Mechanismus kann als Bequemlichkeit\n"
+"für den aktuellen Benutzer oder eine Archiv-Distribution (hg archive) \n"
+"angesehen werden."
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+"Platzhalter werden entsprechend des aktuellen Änderungssatzes erweitert,\n"
+"der für das Arbeitsverzeichnis der jeweiligen Datei gilt."
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+"Die Konfiguration erfolgt in den Bereichen [keyword], [keywordset] und\n"
+"[keywordmaps] von hgrc-Dateien."
+
+msgid "Example::"
+msgstr "Beispiel::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+" [keyword]\n"
+" # erweitert Platzhalter in jeder Python-Datei, ausgenommen Dateien,\n"
+" # die auf \"x*\" passen\n"
+" **.py =\n"
+" x* = ignore"
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+" [keywordset]\n"
+" # bevorzugt SVN- oder CVS-artige Standard-Platzhalterzuweisungen\n"
+" svn = True"
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+".. note::\n"
+" Je genauer die Muster für Dateinamen sind, desto weniger\n"
+" Geschwindigkeit geht in großen Projektarchiven verloren."
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+"Für Vorlagen und Demos zur Erweiterung von Platzhaltern via [keywordmaps]\n"
+"sowie die Einstellungen, führen Sie :hg:`kwdemo` aus. Siehe auch\n"
+":hg:`templates` für eine Liste verfügbarer Vorlagen und Filter."
+
+msgid "Three additional date template filters are provided:"
+msgstr ""
+"Drei weitere Filter für Datumsangaben in Vorlagen werden bereitgestellt:"
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+
+#, fuzzy
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+"Die Standardzuweisungen von Vorlagen (einzusehen mit :hg:`kwdemo -d`)\n"
+"können mit angepassten Platzhaltern und Vorlagen ersetzt werden. Auch hier\n"
+"sollte :hg:`kwdemo` ausgeführt werden, um die Ergebnisse der eigenen\n"
+"Konfiguration zu testen."
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+"Bevor aktive Platzhalter geändert/deaktiviert werden, sollte\n"
+":hg:`kwshrink` ausgeführt werden, um die Gefahr von versehentlich\n"
+"gespeicherten ersetzten Platzhaltern in der Historie zu vermeiden."
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+"Um das Ersetzen zu erzwingen, nachdem sie aktiviert oder die Konfiguration\n"
+"geändert wurde, führen Sie :hg:`kwexpand` aus."
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+"Ersetzungen, die mehr als eine Zeile umfassen, werden ebenso wie\n"
+"inkrementelle Ersetzungen wie das $Log$ von CVS werden nicht unterstützt.\n"
+"Eine Platzhalter-Zuweisung wie \"Log = {desc}\" wird durch die erste Zeile\n"
+"der Versionsmeldung ersetzt.\n"
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "Ãœberschreibe %s zum Ersetzen der Platzhalter\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr "Ãœberschreibe %s zum Entfernen ersetzter Platzhalter\n"
+
+msgid "[keyword] patterns cannot match"
+msgstr "[keyword]-Muster können nicht gefunden werden"
+
+msgid "no [keyword] patterns configured"
+msgstr "Keine [keyword]-Muster konfiguriert"
+
+#, fuzzy
+msgid "show default keyword template maps"
+msgstr "Zeigt die Standard-Vorlagenzuweisungen"
+
+msgid "read maps from rcfile"
+msgstr "Liest die Zuweisungen aus der rcfile-Datei"
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr "hg kwdemo [-d] [-f RCDATEI] [VORLAGENZUWEISUNGEN]..."
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr "Gibt [keywordmaps]-Einstellungen und ein Ersetzungsbeispiel aus"
+
+#, fuzzy
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+" Zeigt die aktuellen, benutzerdefinierten oder die Standardzuweisungen\n"
+" und ihre Ersetzungen."
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+" Die aktuelle Konfiguration kann erweitert werden, indem Zuweisungen\n"
+" als Argumente übergeben werden oder über -f/--rcfile eine externe\n"
+" hgrc-Datei eingebunden wird."
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+" Verwenden Sie -d/--default, um die aktuelle Konfiguration zu\n"
+" deaktivieren."
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" Siehe :hg:`help templates` für Informationen über Vorlagen und Filter.\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "Erzeuge temporäres Projektarchiv in %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+"\n"
+"\tKonfiguration mittels benutzerdefinierter Platzhalter-Zuweisungen\n"
+
+msgid "\textending current template maps\n"
+msgstr "\tErweitert die aktuellen Vorlagen-Zuweisungen\n"
+
+#, fuzzy
+msgid "\toverriding default svn keywordset\n"
+msgstr "\tÃœberschreibt das stndard svn keywordset\n"
+
+#, fuzzy
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\tÃœberschreibt das standard CVS keywordset\n"
+
+#, fuzzy
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+"\n"
+"\tKonfiguration mittels der standard svn keywordset\n"
+
+#, fuzzy
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+"\n"
+"\tKonfiguration mittels der standard csv keywordset\n"
+
+msgid "\tdisabling current template maps\n"
+msgstr "\tdeaktiviert die aktuellen Vorlagen-Zuweisungen\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+"\n"
+"\tKonfiguration mittels aktueller Platzhalter-Zuweisungen\n"
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+"\n"
+"Nach %s geschriebene Platzhalter:\n"
+
+msgid "hg keyword configuration and expansion example"
+msgstr "Konfigurations- und Ersetzungsbeispiel für hg keyword"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+"\n"
+"\tersetzte Platzhalter\n"
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [OPTION]... [DATEI]..."
+
+msgid "expand keywords in the working directory"
+msgstr "Ersetzt Platzhalter in der Arbeitskopie"
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr " Wird nach dem Aktivieren der Platzhalter-Ersetzungen ausgeführt."
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwexpand verweigert den Dienst, wenn die angegebenen Dateien\n"
+" lokale Änderungen enthalten.\n"
+" "
+
+msgid "show keyword status flags of all files"
+msgstr "Zeigt den Ersetzungsstatus aller Dateien"
+
+msgid "show files excluded from expansion"
+msgstr "Zeigt Dateien, die von den Mustern ausgeschlossen werden"
+
+msgid "only show unknown (not tracked) files"
+msgstr "Zeigt nur unbekannte (nicht überwachte) Dateien"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [OPTION]... [DATEI]..."
+
+msgid "show files configured for keyword expansion"
+msgstr "Zeigt die für die Ersetzung konfigurierten Dateien"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+" Zeigt die Dateien im Arbeitsverzeichnis, die auf die Muster aus dem\n"
+" Bereich [keyword] passen."
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+" Nützlich, um unbeabsichtigte Ersetzungen zu verhindern und die\n"
+" Ausführung zu beschleunigen, indem nur echte Kandidaten für eine\n"
+" Ersetzung in Betracht gezogen werden."
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+" Siehe auch :hg:`help keyword` für Hinweis zum Aufbau von Mustern\n"
+" für das Einbeziehen/Ausschließen von Dateien."
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+" Mit -A/--all und -v/--verbose sind die Codes für die Stati der Dateien\n"
+" wie folgt::"
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+" K = Ersetzungskandidat\n"
+" k = Ersetzungskandidat (nicht versioniert)\n"
+" I = ignoriert\n"
+" i = ignoriert (nicht versioniert)\n"
+" "
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [OPTION]... [DATEI]..."
+
+msgid "revert expanded keywords in the working directory"
+msgstr "Nimmt Ersetzungen im aktuellen Arbeitsverzeichnis wieder zurück"
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+" Muß vor dem Ändern/Abschalten von aktiven Keywords ausgeführt werden."
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwshrink verweigert den Dienst, wenn die angegebenen Dateien\n"
+" lokale Änderungen enthalten.\n"
+" "
+
+msgid "track large binary files"
+msgstr "versioniere auch grosse Binärdateien"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+"Grosse Binärdateien sind für gewöhnlich schlecht komprimierbar, Änderungen\n"
+"können nicht verständlich angezeigt werden und automatische Zusammenführung\n"
+"ist unmöglich. Derartige Dateien können von Mercurials Speicherformat\n"
+"'revlog' nicht effizient gehandhabt werden, da es auf komprimierten bin-\n"
+"deltas basiert. Grosse Binärdateien als reguläre Dateien zu versionieren\n"
+"verschwendet Bandbreite, Speicherplatz und erhöht den Hauptspeicher-\n"
+"verbrauch. Die Erweiterung 'largefiles' versucht dies einzudämmen, indem\n"
+"sie ein zusätzliches *zentrales Lager* für diese Binärriesen (irgendwo\n"
+"im Netzwerk) einrichtet. Für jede Arbeitskopie werden dann nur die\n"
+"benötigten Revisionen abgerufen."
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+"Dies funktioniert, indem für jeden Binärriesen ein kleiner Stellvertreter\n"
+"in .hglf/ regulär von Mercurial überwacht wird. Diese Dateien enthalten\n"
+"nur 41 Bytes: eine SHA-1 Prüfsumme und ein Zeilenumsprung. Die Revision\n"
+"der Binärdatei wird durch die Prüfsumme identifiziert, so dass die\n"
+"eigentliche Datei von der Erweiterung aus dem zentralen Lager abgerufen\n"
+"bzw. hinein übertragen werden kann. Damit wird sowohl Speicherplatz als\n"
+"auch Bandbreite gespart, da clone- and pull-Operationen nicht die ganze\n"
+"Historie der Änderungen übertragen müssen."
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+"Um ein neues Archiv zu starten, oder einen neuen Binärriesen hinzuzufügen,\n"
+"wird einfach :hg:`add --large` angegeben. Zum Beispiel::"
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+" $ dd if=/dev/urandom of=binaerchaos count=2000\n"
+" $ hg add --large binaerchaos\n"
+" $ hg commit -m 'Füge binaerchaos als Binärriese hinzu'"
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+"Wird ein Änderungssatz, welcher einen Binärriesen ändert oder hinzufügt,\n"
+"in ein entferntes Archiv übertragen, so werden gleichzeitig (asymmetrisch\n"
+"zum Abrufen per pull) auch die (neuen) Revisionen der Binärdatei "
+"übertragen.\n"
+"Das entfernte Mercurial muss hierfür die largefiles-Erweiterung unterstützen."
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+"Wird ein Änderungssatz, der Binärriesen betrifft, von einem entfernten\n"
+"Archiv abgerufen, verhält sich Mercurial zunächst normal. Erst wenn das\n"
+"Arbeitsverzeichnis auf eine Revision aktualisiert wird, die eine solche\n"
+"Datei enthält, wird die Binärdatei heruntergeladen. Durch permanente\n"
+"Zwischenspeicherung jeder Revision wird wiederholtes Herunterladen "
+"verhindert.\n"
+"Das bedeutet allerdings, dass zum Zeitpunkt der Aktualisierung auf eine\n"
+"bisher unbekannte Revision, Netzwerkzugriff möglich sein muss."
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+"Falls ein Archiv bereits grosse Binärdateien regulär (ohne die Erweiterung)\n"
+"versioniert, muss es zunächst konvertiert werden, um die Vorteile von\n"
+"largefiles zu nutzen. Dies geschieht duch den :hg:`lfconvert` Befehl."
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr " $ hg lfconvert --size 10 altes-archiv neues-archiv"
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+"Ein derart konvertiertes Archiv wird neue Dateien, die über 10MB gross sind\n"
+"automatisch als Binärriesen handhaben. Diese Grenze kann entweder mit\n"
+"``largefiles.minsize`` in der Konfigurationsdatei oder der --lfsize Option\n"
+"des 'add'-Befehls geändert werden (Angabe in MB)::"
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+" [largefiles]\n"
+" minsize = 2"
+
+msgid " $ hg add --lfsize 2"
+msgstr " $ hg add --lfsize 2"
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+"Mit der Konfigurationsoption ``largefiles.patterns`` kann man Dateimuster\n"
+"angeben (siehe :hg:`help patterns`), die bestimmen, welche Dateien als\n"
+"Binärriesen gehandhabt werden sollen::"
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size."
+msgstr ""
+"Dateien, die auf ein solches Muster passen, werden unabhängig von ihrer\n"
+"Größe als Binärriesen hinzugefügt."
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "Konvertiert ein normales Archiv in ein Archiv mit Binärriesen"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+" Konvertiert das Archiv QUELLE in ein neues Archiv ZIEL, welches sich\n"
+" nur dadurch unterscheidet, dass gewisse Dateien als Binärriesen\n"
+" behandlet werden. Genauer sind es die, die auf ein MUSTER passen,\n"
+" *oder* deren Größe die konfigurierte Grenze überschreitet. Die Größe,\n"
+" welche zur Entscheidung verwendet wird, ist die zur Zeit des ersten\n"
+" Hinzufügens der Datei (ob die Datei in späteren Revisionen größer wird\n"
+" wird nicht geprüft). Der Grenzwert wird mit --size oder dem\n"
+" Konfigurationseintrag ``largefiles.size`` (je in MB) definiert."
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+" Nach der Ausführung dieses Befehls muss sichergestellt werden, dass die\n"
+" Erweiterung largefiles in allen entfernten Archiven, mit denen die\n"
+" Änderungen synchonisiert werden, aktiv ist."
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+" Verwende --to-normal um die Konversion in Binärriesen rückgängig zu\n"
+" machen. Danach kann ZIEL völlig ohne Binärriesen verwendet werden."
+
+msgid "getting largefiles"
+msgstr "Hole Binärriesen"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "Hole %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: Beschädigte Daten (erwartete %s, erhielt %s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "Durchsuche %d Änderungssätze nach Binärriesen\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr "Inhalt von %d Revisionen von %d Binärriesen verifiziert\n"
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr "Existenz von %d Revisionen von %d Binärriesen verifiziert\n"
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "Nicht unterstütztes URL-Schema %r"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "%s scheint kein Lager für Binärriesen zu sein"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s ist kein lokales Mercurial-Projektarchiv"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "Initialisiere Ziel %s\n"
+
+msgid "converting revisions"
+msgstr "Konvertiere Revisionen"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr "Umbenannter/kopierter Binärriese %s wird ein symbolischer Verweis"
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr "Binärriese %s wird ein symbolischer Verweis"
+
+#, python-format
+msgid "skipping incorrectly formatted tag %s\n"
+msgstr "Ãœberspringe fehlerhaft formatiertes Etikett: %s\n"
+
+#, python-format
+msgid "skipping incorrectly formatted id %s\n"
+msgstr "Ãœberspringe fehlerhaft formatierte ID: %s\n"
+
+#, python-format
+msgid "no mapping for id %s\n"
+msgstr "Keine Abbildung für ID %s\n"
+
+msgid "uploading largefiles"
+msgstr "Lade Binärriesen hoch"
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr "Binärriese %s fehlt im Lager (muss hochgeladen werden)"
+
+#, python-format
+msgid "%d additional largefiles cached\n"
+msgstr "%d zusätzliche Binärriesen in den Zwischenspeicher geladen\n"
+
+#, python-format
+msgid "%d largefiles failed to download\n"
+msgstr "%d Binärriesen konnten nicht heruntergeladen werden\n"
+
+msgid "getting changed largefiles\n"
+msgstr "Lade veränderte Binärriesen herunter\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "%d Binärriesen verändert, %d entfernt\n"
+
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr ""
+"Binärriese %s fehlt im Zwischenspeicher und konnte nicht heruntergeladen "
+"werden"
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr ""
+"Minimale Dateigröße in MB von Dateien, die in Binärriesen konvertiert werden"
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr "Konvertiert ein Binärriesen-Archiv in ein reguläres Archiv"
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert QUELLE ZIEL [DATEI ...]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr "largefiles: Dateigröße muss eine Zahl sein (nicht %s)\n"
+
+msgid "minimum size for largefiles must be specified"
+msgstr "Grenzgröße für Binärriesen muss angegeben werden"
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "Unbekanntes Betriebssytem: %s\n"
+
+#, python-format
+msgid "Found %s in store\n"
+msgstr "%s im Lager gefunden\n"
+
+#, python-format
+msgid "Found %s in system cache\n"
+msgstr "%s im Zwischenspeicher gefunden\n"
+
+msgid "Can't get file locally"
+msgstr "Kann Datei nicht lokal abrufen"
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+"Änderungssatz %s: %s fehlt\n"
+" (Prüfsumme %s)\n"
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+"Änderungssatz %s: %s: verschiedene Inhalte\n"
+" (%s:\n"
+" erwartete Prüfsumme %s,\n"
+" tatsächlich %s)\n"
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s ist bereits ein Binärriese\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "Füge %s als Binärriese hinzu\n"
+
+msgid "no files specified"
+msgstr "Keine Dateien angegeben"
+
+#, python-format
+msgid "not removing %s: %s (use forget to undo)\n"
+msgstr "Entferne nicht %s: %s (Nutze ``forget`` um rückgängig zu machen)\n"
+
+msgid "file still exists"
+msgstr "Datei existiert noch"
+
+msgid "file is modified"
+msgstr "Datei ist modifiziert"
+
+msgid "file has been marked for add"
+msgstr "Datei ist als hinzuzufügen markiert"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "Entferne %s\n"
+
+msgid "--normal cannot be used with --large"
+msgstr "--normal kann nicht zusammen mit --large verwendet werden"
+
+msgid "uncommitted local changes"
+msgstr "Ausstehende nicht versionierte Änderungen"
+
+msgid "&Largefile"
+msgstr "&Binärriese"
+
+msgid "&Normal file"
+msgstr "&Normale Datei"
+
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+"%s wurde in einen Binärriesen umgewandelt.\n"
+"Nutze als (B)inärriese oder als (n)ormale Datei?"
+
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+"%s wurde in eine normale Datei umgewandelt.\n"
+"Nutze als (B)inärriese oder als (n)ormale Datei?"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "Führe %s und %s zusammen zu %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "Führe %s zusammen\n"
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+"Zusammenführung führt zu Konflikt im Binärriesen %s\n"
+"(l)okale Version, oder (a)ndere verwenden?"
+
+msgid "&Local"
+msgstr "&Lokal"
+
+msgid "&Other"
+msgstr "&Andere"
+
+msgid "destination largefile already exists"
+msgstr "Ziel-Binärriese existiert bereits"
+
+msgid "no files to copy"
+msgstr "Keine Dateien zu kopieren"
+
+msgid "caching new largefiles\n"
+msgstr "Lade neue Binärriesen in den Zwischenspeicher\n"
+
+#, python-format
+msgid "%d largefiles cached\n"
+msgstr "%d Binärriesen in den Zwischenspeicher geladen\n"
+
+#, python-format
+msgid "--all-largefiles is incompatible with non-local destination %s"
+msgstr "--all-largefiles ist inkompatibel mit dem nicht-lokalen Ziel %s"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "Unbekannter Archivtyp '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "Bei Archivierung in Dateien kann kein Präfix angegeben werden"
+
+#, python-format
+msgid "largefile %s not found in repo store or system cache"
+msgstr "Binärriese %s weder im Archivlager noch Zwischenspeicher gefunden"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "Entferne %s nicht: Datei ist nicht versioniert\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr "largefiles: Kein entferntes Archiv\n"
+
+msgid "largefiles to upload:\n"
+msgstr "Hochzuladende Binärriesen:\n"
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr "largefiles: %d hochzuladen\n"
+
+msgid "largefile contents do not match hash"
+msgstr "Inhalt des Binärriesen passt nicht auf Prüfsumme"
+
+#, python-format
+msgid "largefiles: failed to put %s into store: %s"
+msgstr "largefiles: Konnte %s nicht in einlagern: %s"
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr "Angeforderer Binärriese %s ist nicht im Zwischenspeicher"
+
+msgid "remote: "
+msgstr "Entfernt: "
+
+#, python-format
+msgid "unexpected putlfile response: %s"
+msgstr "Unerwartete Antwort von putlfile: %s"
+
+msgid "putlfile failed:"
+msgstr "putlfile fehlgeschlagen:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "putlfile fehlgeschlagen (unerwartete Anwort):"
+
+msgid "unexpected response:"
+msgstr "Unerwartete Antwort:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr "remotestore: Konnte %s nicht ins entfernte Lager %s packen"
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr "remotestore: %s ins entfernte Lager %s gepackt"
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "remotestore: Konnte Datei %s nicht öffnen: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr "remotestore: Binärriese %s ist ungültig"
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr "remotestore: Binärriese %s fehlt"
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "Änderungssatz %s: %s: Unterschiedliche Inhalte\n"
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "Änderungssatz %s: %s fehlt\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+"largefiles: Aktion %r scheint bereits von einer anderen Erweiterung "
+"verändert zu sein. Dadurch kann es zu Fehlern in largefiles kommen\n"
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr "Datei \"%s\" ist Stellvertreter für einen Binärriesen"
+
+msgid "add as largefile"
+msgstr "Füge als Binärriese hinzu"
+
+msgid "add as normal file"
+msgstr "Füge als normale Datei hinzu"
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+"Größe in MB ab der Dateien als Binärriesen hinzugefügt werden "
+"(Voreinstellung: 10)"
+
+msgid "verify largefiles"
+msgstr "Verifiziere Binärriesen"
+
+msgid "verify all revisions of largefiles not just current"
+msgstr "Verifiziere alle Revisionen der Binärriesen, nicht nur die aktuelle"
+
+msgid "verify largefile contents not just existence"
+msgstr "Verifiziere Inhalte der Binärriesen und nicht nur die Existenz"
+
+msgid "display outgoing largefiles"
+msgstr "Zeigt zu übertragende Binärriesen an"
+
+msgid "download all pulled versions of largefiles"
+msgstr "Alle abgerufenen Versionen von Binärriesen herunterladen"
+
+msgid "download all versions of all largefiles"
+msgstr "Alle Versionen aller Binärriesen herunterladen"
+
+msgid "manage a stack of patches"
+msgstr "Verwaltet einen Stapel von Patches"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Diese Erweiterung verwaltet Änderungen des Archivs in Patch-Dateien und\n"
+"führt dazu zwei Stapel (stacks) ein: Alle bekannten und alle lokal\n"
+"angewendeten Patches (eine Untermenge der bekannten)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Die Patch-Dateien sowie die Stapeldateien werden im Verzeichnis .hg/patches\n"
+"angelegt. Angewendete Patches sind weiterhin auch als Änderungssätze in der\n"
+"üblichen Versionshistorie zu finden."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Ãœbliche Anwendungen (mehr Details mit :hg:`help kommando`)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" Erstellt einen neuen Patch qnew\n"
+" Ãœbernimmt externen Patch als bekannt qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" Zeigt Patch-Serien an qseries\n"
+" Zeigt angewendete Patches qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" Wendet bekannten Patch an qpush\n"
+" Nimmt angewendeten Patch wieder zurück qpop\n"
+" Integriert lokale Änderungen in letzten Patch qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"Standardmäßig wird mq automatisch git-Patches verwenden, wenn dies zur\n"
+"Speicherung von Änderungen an Dateimodi, Verschiebe-Operationen, binären\n"
+"oder leeren Dateien oder Löschoperationen notwendig ist. Dieses Verhalten\n"
+"kann wie folgt konfiguriert werden::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"Wenn 'keep' angegeben ist, wird mq sich an die Einstellung aus dem Bereich\n"
+"[diff] halten, während existierende git-Patches bei qrefresh beibehalten\n"
+"beibehalten werden. Wenn 'yes' oder 'no' angegeben ist, wird mq die\n"
+"Einstellung aus [diff] überschreiben und immer Patches im git- oder im\n"
+"normal Format erzeugen, wobei bei letzterem ein Datenverlust möglich ist."
+
+msgid ""
+"It may be desirable for mq changesets to be kept in the secret phase (see\n"
+":hg:`help phases`), which can be enabled with the following setting::"
+msgstr ""
+"Es kann für mq-Änderungssätze wünschenswert sein, dass sie in der geheimen\n"
+"Phase gehalten werden (siehe :hg:`help phases`), was mit der folgenden\n"
+"Einstellung aktiviert werden kann."
+
+msgid ""
+" [mq]\n"
+" secret = True"
+msgstr ""
+" [mq]\n"
+" secret = True"
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command."
+msgstr ""
+"Sie werden standardmäßig einen Patch-Reihe namens \"patches\" verwalten. "
+"Sie\n"
+"können andere, unabhängige Warteschlangen mit :hg:`qqueue` erzeugen."
+
+msgid ""
+"If the working directory contains uncommitted files, qpush, qpop and\n"
+"qgoto abort immediately. If -f/--force is used, the changes are\n"
+"discarded. Setting::"
+msgstr ""
+"Wenn das Arbeitsverzeichnis Änderungen enthält, die noch nicht übernommen\n"
+"wurden, brechen qpush, qpop und qgoto sofort ab. Wenn -f/--force angegeben\n"
+"ist, werden die Änderungen verworfen. Einstellung::"
+
+msgid ""
+" [mq]\n"
+" keepchanges = True"
+msgstr ""
+" [mq]\n"
+" keepchanges = True"
+
+msgid ""
+"make them behave as if --keep-changes were passed, and non-conflicting\n"
+"local changes will be tolerated and preserved. If incompatible options\n"
+"such as -f/--force or --exact are passed, this setting is ignored.\n"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr "Gibt die erste Zeile eines Patch-Kopfes aus"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "fehlerhafte mq Statuszeile: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "mq.git-Einstellung kann auto/keep/yes/no sein, %s wurde angegeben"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s mehrfach in %s gefunden"
+
+msgid "guard cannot be an empty string"
+msgstr "Wächter darf keine leere Zeichenkette sein"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "Wächter %r beginnt mit ungültigem Zeichen: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "Ungültiges Zeichen in Wächter %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "Wächter %r zu kurz"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "Wächter %r beginnt mit ungültigem Zeichen"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "Erlaube %s - kein Wächter trifft zu\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "Erlaube %s - von keinem Wächter abgelehnt\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "Erlaube %s - bewacht durch %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "Ãœberspringe %s - bewacht durch %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "Überspringe %s - kein Wächter trifft zu\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "Fehler beim Entfernen von undo: %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "speichere aktuelle Version von %s als %s\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "Anwendung von Patch %s schlug fehl"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "Patch hat nicht gewirkt, führe %s zusammen\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "Aktualisierung gab Fehlercode %d zurück"
+
+msgid "repo commit failed"
+msgstr "Übernahme der Änderungen schlug fehl"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "Fehler beim Lesen von %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "Patch %s existiert nicht\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "Patch %s ist nicht angewendet\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "Patch schlug fehl und Fortsetzung unmöglich (versuche -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "Wende %s an\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "Kann %s nicht lesen\n"
+
+msgid "local changes found, refresh first"
+msgstr "Lokale Änderungen gefunden. Führe zuerst \"qrefresh\" aus!"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "Patch %s ist leer\n"
+
+msgid "qpush exactly duplicates child changeset"
+msgstr "qpush dupliziert die Nachfolgeänderung exakt"
+
+msgid "repository commit failed"
+msgstr "Übernahme der Änderungen schlug fehl"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr "Patch schlug fehl, Fehlerabschnitte noch im Arbeitsverzeichnis\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "Unschärfe bei Anwendung des Patches gefunden - breche ab\n"
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "Änderungssatz %s referenziert unbekannte Patche: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "Unbekannte Patche: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "Revision %d steht nicht unter Versionskontrolle"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "Kann Revision %d nicht hinter angewendeten Patches löschen"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "Patch %s ohne Versionsmeldung finalisiert\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete benötigt mindestens eine Revision oder einen Patchnamen"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "kann bereits angewendeten Patch %s nicht löschen"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "Patch %s ist nicht in der \"series\"-Datei"
+
+msgid "no patches applied"
+msgstr "Keine Patches angewendet"
+
+msgid "working directory revision is not qtip"
+msgstr "Revision des Arbeitsverzeichnisses ist nicht qtip"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "nicht eingetragene Änderungen in Subrepository %s"
+
+msgid "local changes found"
+msgstr "Lokale Änderungen gefunden"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" kann nicht als Patchname verwendet werden"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr "Patchname darf nicht mit \"%s\" anfangen"
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" kann nicht in einem Patchnamen verwendet werden"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" existiert bereits als Verzeichnis"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "Patch \"%s\" existiert bereits"
+
+msgid "cannot use both --force and --keep-changes"
+msgstr ""
+"Es können nicht gleichzeitig --force und --keep-changes angegeben werden"
+
+msgid "cannot manage merge changesets"
+msgstr "Zusammenführungen können nicht mit Patches verwaltet werden"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "Patch \"%s\" kann nicht geschrieben werden: %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "Fehler beim Löschen von %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "Patchname \"%s\" ist mehrdeutig:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "Patch %s nicht in Serie"
+
+msgid "(working directory not at a head)\n"
+msgstr "(Arbeitsverzeichnis ist nicht auf Stand der Kopfversion)\n"
+
+msgid "no patches in series\n"
+msgstr "Keine Patches in Serie\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s ist bereits an der Serienspitze\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "Kann Änderungen nicht in einen vorherigen Patch übertragen: %s"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "bewacht durch %s"
+
+msgid "no matching guards"
+msgstr "keine passenden Wächter"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "Kann '%s' nicht übertragen - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "Alle bekannten Patches sind zur Zeit angewendet\n"
+
+msgid "patch series already fully applied\n"
+msgstr "Patchserie bereits vollständig angewendet\n"
+
+msgid "cannot use --exact and --keep-changes together"
+msgstr "--exact und --keep-changes können nicht gleichzeitig verwendet werden"
+
+msgid "cannot use --exact and --move together"
+msgstr "--exact und --move können nicht gleichzeitig verwendet werden"
+
+msgid "cannot push --exact with applied patches"
+msgstr "kann nicht --exact übertragen, wenn Patches angewendet sind"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s hat keinen Vorgänger"
+
+msgid "please specify the patch to move"
+msgstr "Bitte geben Sie den zu verschiebenden Patch an"
+
+msgid "cleaning up working directory..."
+msgstr "Räume Arbeitsverzeichnis auf..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "Fehler beim Anwenden. Bitte beheben und %s aktualisieren\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "jetzt bei: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "Patch %s ist nicht angewendet"
+
+msgid "no patches applied\n"
+msgstr "Keine Patches angewendet\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s ist bereits an der Serienspitze\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: Erzwinge Aktualisierung des dirstates\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "Versuche unbekannten Knoten %s zurückzunehmen"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+"qpop würde eine Revision entfernen, die nicht von dieser Patch-Reihe\n"
+"verwaltet wird"
+
+msgid "popping would remove an immutable revision"
+msgstr ""
+
+msgid "see \"hg help phases\" for details"
+msgstr "siehe \"hg help phases\" für Details"
+
+msgid "deletions found between repo revs"
+msgstr "Zwischen den Revisionen haben Löschungen stattgefunden"
+
+#, python-format
+msgid "popping %s\n"
+msgstr "Entferne %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "Patch-Reihe ist jetzt leer\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "Kann keine Revision mit Kindern aktualisieren"
+
+msgid "cannot refresh immutable revision"
+msgstr "Kann keine unveränderbare Revision aktualisieren"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"Aktualisierung während einer Rücknahme unterbrochen! Nutze \"revert --all\" "
+"und \"qpush\" zum Wiederherstellen.\n"
+
+msgid "patch queue directory already exists"
+msgstr "Verzeichnis für diese Patch-Reihe existiert bereits"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "Patch %s ist nicht in der Seriendatei"
+
+msgid "No saved patch data found\n"
+msgstr "Keine gespeicherten Patchdaten gefunden\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "Stelle Status wieder her: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr "Speicher-Eintrag hat Kindrevisionen und wird daher ignoriert\n"
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr "Entferne Speicher-Eintrag %s\n"
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr "Eltern der gespeicherten Reihe: %s %s\n"
+
+msgid "updating queue directory\n"
+msgstr "Aktualisiere Patchreihenverzeichnis\n"
+
+msgid "Unable to load queue repository\n"
+msgstr "Archiv für Patch-Reihen kann nicht geladen werden\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr "save: keine Patches angewendet - breche ab\n"
+
+msgid "status is already saved\n"
+msgstr "Status ist bereits gespeichert\n"
+
+msgid "hg patches saved state"
+msgstr "Gespeicherter Zustand der Patches"
+
+msgid "repo commit failed\n"
+msgstr "Ãœbernahme ins Archiv fehlgeschlagen\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "Patch %s ist bereits in der Seriendatei"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "Option \"-r\" kann nicht beim Import von Dateien verwendet werden"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "Option \"-n\" kann nicht beim Import mehrerer Patches verwendet werden"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "Revision %d ist die Wurzel mehrerer Zweige"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "Revision %d ist bereits versioniert"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "Revision %d ist nicht der direkte Vorfahr der Patch-Reihe"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "Nachfahren der Revision %d werden nicht verwaltet"
+
+#, python-format
+msgid "revision %d is not mutable"
+msgstr "Revision %d ist unveränderbar"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "Kann Zusammenführung %d nicht importieren"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "Revision %d ist nicht der direkte Vorfahr von %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "Option \"-e\" kann nicht bei Import via stdin verwendet werden"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "Patch %s existiert nicht"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "Benenne %s in %s um\n"
+
+msgid "need --name to import a patch from -"
+msgstr ""
+"Beim Import von der Standardeingabe muss die Option --name angegeben werden"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "Fehler beim Lesen der Datei %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "Füge %s zur Seriendatei hinzu\n"
+
+msgid "keep patch file"
+msgstr "Behält die Patchdatei bei"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "Hört auf, eine Revision zu verwalten (VERALTET)"
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [PATCH]..."
+
+msgid "remove patches from queue"
+msgstr "Entfernt Patches aus der Patch-Reihe"
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"Exact\n"
+" patch identifiers must be given. With -k/--keep, the patch files are\n"
+" preserved in the patch directory."
+msgstr ""
+" Die Patches dürfen nicht angewendet sein und mindestens einer muss\n"
+" angegeben sein. Exakte Patch-IDs müssen verwendet werden. Mit -k/--keep\n"
+" werden die Patchdateien erhalten."
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+" Um die Entwicklung eines Patches zu beenden und ihn in die permanente\n"
+" Historie zu legen, verwenden Sie :hg:`qfinish`."
+
+msgid "show only the preceding applied patch"
+msgstr "Zeigt nur den letzten angewendeten Patch"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches already applied"
+msgstr "Zeigt die bereits angewendeten Patches an"
+
+msgid " Returns 0 on success."
+msgstr " Gibt 0 bei Erfolg zurück."
+
+msgid "only one patch applied\n"
+msgstr "Nur ein Patch angewendet\n"
+
+msgid "show only the first patch"
+msgstr "Zeigt nur den ersten Patch"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches not yet applied"
+msgstr "Zweigt die noch nicht angewendeten Patches an"
+
+msgid "all patches applied\n"
+msgstr "Alle Patches angewendet\n"
+
+msgid "import file in patch directory"
+msgstr "Import eine Datei in das Patchverzeichnis"
+
+msgid "NAME"
+msgstr "NAME"
+
+msgid "name of patch file"
+msgstr "Name der Patchdatei"
+
+msgid "overwrite existing files"
+msgstr "Ãœberschreibt bestehende Dateien"
+
+msgid "place existing revisions under mq control"
+msgstr "Ãœbergibt bestehende Revisionen der Kontrolle von mq"
+
+msgid "use git extended diff format"
+msgstr "Verwende git-erweitertes diff-Format"
+
+msgid "qpush after importing"
+msgstr "Führt qpush nach dem Import aus"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... DATEI..."
+
+msgid "import a patch or existing changeset"
+msgstr "Importiert einen Patch oder einen existierenden Änderungssatz"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" Der Patch wird in die Serie nach dem letzten angewandten Patch\n"
+" eingefügt. Wenn keine Patches angewandt wurden, wird qimport den\n"
+" Patch an den Anfang der Serie stellen."
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" Der Patch wird den gleichen Namen haben wie seine Datei, es sei\n"
+" denn, es wird ein neuer über -n/--name angegeben."
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" Sie können einen existierenden Patch im Patchverzeichnis mit dem\n"
+" Schalter -e/--existing registrieren."
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+" Mit dem Schalter -f/--force wird ein bereits existierender Patch\n"
+" mit dem gleichen Namen überschrieben."
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+" Ein existierender Änderungssatz kann mit -r/--rev (zum Beispiel\n"
+" wird qimport --rev tip -n patch die Spitze importieren) unter\n"
+" Kontrolle von mq gestellt werden. Mit -g/--git werden über --rev\n"
+" importierte Patches das git-Format benutzen. Siehe auch die Hilfe\n"
+" von diffs für weitere Informationen, warum dies für das Erhalten\n"
+" von Umbenennen/Kopier-Operationen und Dateirechte wichtig ist.\n"
+" Verwende :hg:`qfinish` um Änderungssätze der Kontrolle durch mq zu\n"
+" entziehen."
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+" Um einen Patch von der Standardeingabe zu importieren, geben Sie\n"
+" - als Dateinamen an. Wenn von der Standardeingabe importiert wird,\n"
+" muss der Name des Patches über --name angegeben werden."
+
+msgid " To import an existing patch while renaming it::"
+msgstr " Um einen existierenden Patch zu importieren und umzubenennen::"
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr " hg qimport -e existierender-patch -n neuer-name"
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Gibt 0 zurück, wenn der Import erfolgreich war.\n"
+" "
+
+msgid "create queue repository"
+msgstr "Erstellt ein Reihen-Archiv"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "Richtet ein neues Archiv für Patch-Reihen ein (VERALTET)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" Das Reihen-Archiv ist standardmäßig unversioniert. Wenn der Schalter\n"
+" -c/--create-repo angegeben ist, wird qinit ein abgetrenntes,\n"
+" eingebettetes Archiv für Patches erzeugen (qinit -c kann auch später\n"
+" aufgerufen werden, um ein unversioniertes Archiv in ein versioniertes\n"
+" umzuwandeln). Sie können qcommit verwenden, um Änderungen in diesem\n"
+" Archiv zu speichern."
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" Dieser Befehl ist veraltet. Ohne -c wird er implizit von den anderen\n"
+" relevanten Befehlen aufgerufen. Statt -c sollte :hg:`init --mq`\n"
+" verwendet werden."
+
+msgid "use pull protocol to copy metadata"
+msgstr "Nutzt das 'Pull'-Protokoll um Metadaten zu kopieren"
+
+msgid "do not update the new working directories"
+msgstr "Aktualisiert die Arbeitsverzeichnisse nicht"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "Nutzt unkomprimierte Ãœbertragung (schnell im LAN)"
+
+msgid "REPO"
+msgstr "ARCHIV"
+
+msgid "location of source patch repository"
+msgstr "Ort des Quell-Patcharchivs"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [OPTION]... QUELLE [ZIEL]"
+
+msgid "clone main and patch repository at same time"
+msgstr "Klont gleichzeitig das Haupt- und Patch-Archiv"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" Wenn die Quelle lokal ist, wird das Ziel keine angewandten Patches\n"
+" haben. Wenn das Ziel entfernt ist, kann dieser Befehl nicht prüfen,\n"
+" ob Patches in der Quelle angewandt sind und kann daher nicht\n"
+" garantieren, dass Patches nicht im Ziel angewandt sind. Wenn Sie\n"
+" ein entferntes Archiv klonen, seien Sie sich sicher, dass es keine\n"
+" angewandten Patches hat."
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+" Das Quell-Patcharchiv wird standardmäßig in <quelle>/.hg/patches\n"
+" gesucht. Verwenden Sie -p <url>, um dies zu ändern."
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+" Das Patchverzeichnis muss ein eingebettetes Mercurial-Archiv sein,\n"
+" wie es von :hg:`init --mq` erzeugt werden würde.\n"
+" "
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "Versioniertes Patch-Archiv nicht gefunden (siehe init --mq)"
+
+msgid "cloning main repository\n"
+msgstr "Klone Hauptarchiv\n"
+
+msgid "cloning patch repository\n"
+msgstr "Klone Patch-Archiv\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "Entferne angewandte Patches vom Zielarchiv\n"
+
+msgid "updating destination repository\n"
+msgstr "Aktualisiere Zielarchiv\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [OPTION]... [DATEI]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr "Speichert Änderungen im Reihen-Archiv (VERALTET)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr ""
+" Dieser Befehl ist veraltet; verwenden Sie stattdessen\n"
+" :hg:`commit --mq`."
+
+msgid "print patches not in series"
+msgstr "Gibt die Patches aus, die in keiner Serie sind"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "Gibt die ganze Seriendatei aus"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "Gibt den Namen des aktuellen Patches aus"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "print the name of the next pushable patch"
+msgstr "Gibt den Namen des nächsten übertragbaren Patches aus"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the preceding applied patch"
+msgstr "Gibt den Namen des letzten angewendeten Patches aus"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "Importiere ungespeicherte Änderungen (VERALTET)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "Fügt \"From: <aktueller Benutzer>\" zum Patch hinzu"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "Fügt \"From: <BENUTZER>\" zum Patch hinzu"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "Fügt \"Date: <aktuelles Datum>\" zum Patch hinzu"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "Fügt \"Date: <DATUM>\" zum Patch hinzu"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEXT] [-l DATEI] PATCH [DATEI]..."
+
+msgid "create a new patch"
+msgstr "Erstellt einen neuen Patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew erstellt einen neuen Patch über dem aktuell angewandten Patch "
+"(wenn\n"
+" vorhanden). Der Patch wird mit allen ausstehenden Änderungen in dem\n"
+" Arbeitsverzeichnis initialisiert. Wenn auch -I/--include, -X/--exclude\n"
+" und/oder eine Liste von Dateien angegeben wird, werden nur Änderungen "
+"an\n"
+" den betreffenden Dateien in den neuen Patch übernommen, der Rest wird "
+"als\n"
+" ungespeicherte Änderung belassen."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" -u/--user und -d/--date können genutzt werden, um den (gegebenen) "
+"Benutzer\n"
+" und das Datum zu setzen. -U/--currentuser und -D/--currentdate setzen "
+"den\n"
+" Benutzer auf den aktuellen Benutzer und das Datum auch entsprechend."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message oder -l/--logfile schreiben ebenfalls die Daten\n"
+" im Kopf sowie die Versionsmeldung des Patches. Wenn nichts angegeben "
+"wird,\n"
+" wird der Kopf des Patches leer und die Versionsmeldung '[mq]: PATCH' "
+"sein."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" Verwenden Sie den Schalter -g/--git, um den Patch im erweiterten\n"
+" git-Format beizubehalten. Siehe auch die Hilfe von diffs für weitere\n"
+" Informationen, warum dies für das Erhalten von Umbenennen/Kopier-\n"
+" Operationen und Dateirechte wichtig ist."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Gibt 0 bei einer erfolgreichen Erstellung eines neuen Patches zurück.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "Aktualisiert nur angegebene und bereits in Patches enthaltene Dateien"
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+"Erstellt/aktualisiert das Autor-Feld im Patch mit dem aktuellen Benutzer"
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+"Erstellt/aktualisiert das Autor-Feld im Patch mit dem angegebenen Benutzer"
+
+msgid "add/update date field in patch with current date"
+msgstr "Erstellt/Aktualisiert das Datumsfeld im Patch mit dem aktuellen Datum"
+
+msgid "add/update date field in patch with given date"
+msgstr ""
+"Erstellt/aktualisiert das Datumsfeld im Patch mit dem angegebenen Datum"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l DATEI] [-s] [DATEI]..."
+
+msgid "update the current patch"
+msgstr "Aktualisiert den aktuellen Patch"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" Wenn irgendein Dateimuster angegeben ist, wird der aktualisierte Patch "
+"nur\n"
+" die Änderungen in den passenden Dateien enthalten; die restlichen "
+"Änderungen \n"
+" verbleiben im Arbeitsverzeichnis."
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+" Wenn -s/--short angegeben wird, werden die Dateien, die im Patch "
+"enthalten\n"
+" sind, aktualisiert, als würden sie von einem Dateimuster erfasst "
+"werden,\n"
+" und verbleiben im Patch."
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+" Wenn -e/--edit angegeben wird, wird Mercurial den konfigurierten Editor\n"
+" starten, in dem Sie die Versionsmeldung eintragen können. Falls "
+"qrefresh\n"
+" fehlschlägt, wird eine Sicherheitskopie in ``.hg/last-message.txt`` "
+"abgelegt."
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+" hg add/remove/copy/rename funktionieren weiter wie gewohnt, obwohl Sie\n"
+" vermutliche Patches im git-Format (-g/--git oder [diff] git=1) "
+"verwenden\n"
+" wollen, um Umbenennungen und Kopien zu versionieren. Siehe auch die "
+"Hilfe\n"
+" zum diff-Befehl für weitere Informationen zum git-Format."
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "Der Schalter \"-e\" ist inkompatibel mit \"-m\" oder \"-l\""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [OPTION]... [DATEI]..."
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "Vergleicht den aktuellen Patch mit nachträglichen Änderungen"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" Zeigt einen Diff, der den aktuellen Patch und alle nachträglichen "
+"Änderungen\n"
+" enthält, die nach der letzten Aktualisierung getätigt wurden (und "
+"damit,\n"
+" wie der aktuelle Patch nach einem Aufruf von qrefresh aussehen würde)."
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+" Verwenden Sie :hg:`diff`, wenn Sie nur die Änderungen seit dem letzten\n"
+" qrefresh sehen möchten, oder :hg:`export qtip`, wenn Sie nur die "
+"Änderungen\n"
+" des aktuellen Patches ohne die nachträglichen Änderungen seit dem "
+"letzten\n"
+" qrefresh sehen möchten."
+
+msgid "edit patch header"
+msgstr "Bearbeitet den Kopf eines Patches"
+
+msgid "keep folded patch files"
+msgstr "Behält zusammengelegte Patches bei"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEXT] [-l DATEI] PATCH..."
+
+msgid "fold the named patches into the current patch"
+msgstr "Legt die benannten Patches mit dem aktuellen Patch zusammen"
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+" Die Patches dürfen noch nicht angewendet sein. Jeder Patch wird "
+"nacheinander\n"
+" auf den aktuellen Patch in der gegebenen Reihenfolge angewendet. Wenn "
+"alle\n"
+" Patches erfolgreich angewandt wurden, wird der aktuelle Patch mit dem\n"
+" zusammengefassten Patch aktualisiert und die zusammengelegten Patches "
+"werden\n"
+" gelöscht. Mit -k/--keep werden die zusammengelegten Patches im "
+"Anschluss\n"
+" nicht entfernt."
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+" Die Kopfzeilen der einzelnen Patches werden den den Kopf des aktuellen\n"
+" Patches angehängt, getrennt mit einer Zeile aus '* * *'."
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold erwartet mindestens einen Patchnamen"
+
+#, python-format
+msgid "Skipping already folded patch %s\n"
+msgstr "Ãœberspringe bereits angewandten Patch %s\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "qfold kann den bereits angewandten Patch %s nicht zusammenlegen"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "Fehler beim Zusammenlegen des Patches %s"
+
+msgid "tolerate non-conflicting local changes"
+msgstr "Toleriert lokale Änderungen ohne Konflikte"
+
+msgid "overwrite any local changes"
+msgstr "Überschreibt alle lokalen Änderungen"
+
+msgid "do not save backup copies of files"
+msgstr "Keine Sicherheitskopie (.orig) anlegen"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [OPTION]... PATCH"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+"Verschiebt (push/pop) die Patches bis der genannte Patch oben auf dem Stapel "
+"ist"
+
+msgid "list all patches and guards"
+msgstr "Zeigt alle Patches und Wächter an"
+
+msgid "drop all guards"
+msgstr "Entfernt alle Wächter"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [PATCH] [-- [+WÄCHTER]... [-WÄCHTER]...]"
+
+msgid "set or print guards for a patch"
+msgstr "Setzt einen Wächter oder gibt die Wächter eines Patches aus"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+" Wächter kontrollieren, ob ein Patch übertragen werden kann. Ein Patch "
+"ohne\n"
+" Wächter wird immer übertragen. Ein Patch mit einem positiven Wächter "
+"(\"+foo\")\n"
+" wird nur dann übertragen, wenn er vo :hg:`qselect` aktiviert wurde. Ein\n"
+" Patch mit einem negativen Wächter (\"-foo\") wird niemals übertragen, "
+"wenn er\n"
+" entsprechend aktiviert wurde."
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" Ohne Argumente werden die aktuell aktiven Wächter ausgegeben.\n"
+" Mit einem Argument wird der aktuelle Wächter gesetzt."
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+" .. note::\n"
+" Spezifizieren von negativen Wächtern erfordert jetzt '--'."
+
+msgid " To set guards on another patch::"
+msgstr " Um die Wächter eines anderen Patches zu setzen::"
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr ""
+" hg qguard anderer.patch -- +2.6.17 -stable\n"
+" "
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "Kann -l/--list nicht mit anderen Schaltern oder Argumenten mischen"
+
+msgid "no patch to work with"
+msgstr "Kein Patch zum Arbeiten"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "Kein Patch namens %s gefunden"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "Gibt den Kopf des obersten oder angegebenen Patches aus"
+
+msgid "apply on top of local changes"
+msgstr "Wendet Patch über die lokalen Änderungen an"
+
+msgid "apply the target patch to its recorded parent"
+msgstr "Wendet den Ziel-Patch auf dessen aufgezeichneten Vorgänger an"
+
+msgid "list patch name in commit text"
+msgstr "Listet den Patchnamen in der Versionsmeldung auf"
+
+msgid "apply all patches"
+msgstr "Wendet alle Patches an"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "Zusammenführung aus einer anderen Patch-Reihe (VERALTET)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "Name der Reihe zum Zusammenführen (VERALTET)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr "Sortiert die Patch-Serie neu und wendet nur den Patch an"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+
+msgid "push the next patch onto the stack"
+msgstr "Schiebt den nächsten Patch auf den Stapel"
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and patch over\n"
+" uncommitted changes."
+msgstr ""
+
+msgid "no saved queues found, please use -n\n"
+msgstr "Keine gespeicherten Reihen gefunden, bitte benutze -n\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "Führe mit Reihe bei %s zusammen\n"
+
+msgid "pop all patches"
+msgstr "Entnimmt (pop) alle Patches"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "Name der zu entnehmenden Reihe (VERALTET)"
+
+msgid "forget any local changes to patched files"
+msgstr "Vergisst alle lokalen Änderungen an zu ändernden Dateien"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [PATCH | INDEX]"
+
+msgid "pop the current patch off the stack"
+msgstr "Holt den aktuellen Patch vom Stapel herunter"
+
+msgid ""
+" Without argument, pops off the top of the patch stack. If given a\n"
+" patch name, keeps popping off patches until the named patch is at\n"
+" the top of the stack."
+msgstr ""
+" Ohne Argumente wird der oberste Patch vom Stapel genommen. Wenn ein\n"
+" Patch-Name angegeben ist, wird solange vom Stapel heruntergenommen, bis\n"
+" der angegebene Patch der oberste ist."
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and discard\n"
+" changes made to such files."
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "Benutzer Patch-Reihe: %s\n"
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename PATCH1 [PATCH2]"
+
+msgid "rename a patch"
+msgstr "Benennt einen Patch um"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" Mit einem Argument wird der aktuelle Patch in PATCH1 umbenannt.\n"
+" Mit zwei Argumenten wird PATCH1 in PATCH2 umbenannt."
+
+msgid "delete save entry"
+msgstr "Löscht Speicher-Eintrag"
+
+msgid "update queue working directory"
+msgstr "Aktualisiert das Arbeitsverzeichnis der Reihe"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] REV"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr ""
+"Stellt den von einer Revision gespeicherten Patchstatus wieder her (VERALTET)"
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr ""
+" Dieser Befehl ist veraltet, verwenden Sie stattdessen :hg:`rebase`."
+
+msgid "copy patch directory"
+msgstr "Kopiert das Patchverzeichnis"
+
+msgid "copy directory name"
+msgstr "Kopiert den Verzeichnisnamen"
+
+msgid "clear queue status file"
+msgstr "Löscht die Statusdatei der Reihe"
+
+msgid "force copy"
+msgstr "Erzwingt eine Kopie"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TEXT] [-l DATEI] [-c] [-n NAME] [-e] [-f]"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr "Gegenwärtigen Patchstatus speichern (VERALTET)"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "Das Ziel %s existiert und ist kein Verzeichnis"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "Das Ziel %s existiert bereits. Verwende -f zum Erzwingen"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "Kopiert %s nach %s\n"
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+"Entfernt die gegebene Revision (optional, da schon die Argumente Revisionen "
+"sind)"
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+"erzwingt Entfernung von Änderungssätzen und unversionierten Änderungen\n"
+"(keine Sicherheitskopie)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+"Bündelt nur Änderungssätze mit einer lokalen Revisionsnummer größer als REV, "
+"die nicht Nachfahren von REV sind (VERALTET)"
+
+msgid "no backups"
+msgstr "Keine Sicherheitskopien"
+
+msgid "no backups (DEPRECATED)"
+msgstr "Keine Sicherheitskopien (VERALTET)"
+
+msgid "ignored (DEPRECATED)"
+msgstr "ignorieren (VERALTET)"
+
+msgid "do not modify working copy during strip"
+msgstr "ändern Sie nicht die Working Copy während des strip Vorgangs"
+
+#, fuzzy
+msgid "remove revs only reachable from given bookmark"
+msgstr ""
+"Entfernt Revisionen, die nur vom angegebenen Lesezeichen aus erreichbar sind"
+
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] REV..."
+msgstr "hg strip [-k] [-f] [-n] [-B Lesezeichen] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "Entfernt Änderungssätze und alle Nachfahren aus dem Projektarchiv"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+" Der strip-Befehl entfernt die angegebenen Änderungssätze und alle\n"
+" Nachfahren. Unversionierte Änderungen im Arbeitsverzeichnis können\n"
+" durch Angabe von --force verworfen werden, ansonsten unterbrechen sie\n"
+" diesen Vorgang."
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" Wenn ein Vorfahr des Arbeitsverzeichnisse entfernt wird, wird dieses\n"
+" automatisch auf den aktuellsten, verfügbaren Vorfahr des entfernten\n"
+" Vorfahren aktualisiert, wenn der Vorgang abgeschlossen ist."
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+" Jeder entfernte Änderungssatz wird in ``.hg/strip-backup`` als Bündel\n"
+" gespeichert (siehe :hg:`help bundle` und :hg:`help unbundle`). Sie "
+"können\n"
+" über :hg:`unbundle .hg/strip-backup/BUNDLE` wiederhergestellt werden,\n"
+" wobei BUNDLE die von strip erstellte Datei ist. Beachten Sie, dass die\n"
+" lokalen Versionsnummern sich für gewöhnlich nach dem Wiederherstellen\n"
+" ändern werden."
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+" Benutzen Sie den Schalter --no-backup, um die Bündel zu entfernen,\n"
+" wenn die Operation abgeschlossen ist."
+
+#, python-format
+msgid "bookmark '%s' not found"
+msgstr "Lesezeichen '%s' wurde nicht gefunden"
+
+#, python-format
+msgid "bookmark '%s' deleted\n"
+msgstr "Lesezeichen '%s' wurde gelöscht\n"
+
+msgid "empty revision set"
+msgstr "Revisionsmenge ist leer"
+
+msgid "disable all guards"
+msgstr "Deaktiviert alle Wächter"
+
+msgid "list all guards in series file"
+msgstr "Listet alle Wächter in der Seriendatei auf"
+
+msgid "pop to before first guarded applied patch"
+msgstr "Entnimmt Patches bis vor den ersten geschützten angewandten Patch"
+
+msgid "pop, then reapply patches"
+msgstr "Entnimmt Patches und wendet sie dann wieder an"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [OPTION]... [WAECHTER]..."
+
+msgid "set or print guarded patches to push"
+msgstr "Setzt die zu übertragenen bewachten Patches oder gibt sie aus"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+" Verwenden Sie :hg:`qguard`, um die Wächter von Patches zu setzen oder "
+"zu\n"
+" ändern, und dann qselect, um mq mitzuteilen, welche Wächter genutzt "
+"werden\n"
+" sollen. Ein Patch wird übertragen, wenn er keine Wächter hat oder "
+"irgendein\n"
+" positiver Wächter auf den aktuell gewählten Wächter zutrifft. Er wird "
+"nicht\n"
+" übertragen, wenn ein negativer Wächter auf den aktuellen zutrifft. Ein\n"
+" Beispiel::"
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+" qguard foo.patch -- -stable (negativer Wächter)\n"
+" qguard bar.patch +stable (positiver Wächter)\n"
+" qselect stable"
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+" Dies aktiviert den Wächter \"stable\". mq wird foo.patch überspringen "
+"(weil\n"
+" er einen negativen Treffer aufweist), aber bar.patch übertragen (da er\n"
+" einen positiven Treffer aufweist)."
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+" Ohne Argumente werden die aktuell aktiven Wächter ausgegeben.\n"
+" Mit einem Argument wird der aktuelle Wächter gesetzt."
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+" Verwenden Sie -n/--none, um die Wächter zu deaktivieren (keine "
+"Argumente\n"
+" werden benötigt). Wenn keine Wächter aktiv sind, werden Patches mit\n"
+" positiven Wächtern übersprungen und Patches mit negativen übertragen."
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+" qselect kann die Wächter von angewandten Patches ändern. Standardmäßig\n"
+" werden geschützte Patches nicht vom Stapel entfernt. Verwenden Sie --"
+"pop,\n"
+" um bis zum letzten angewandten Patch ohne Wächter zurückzugehen. "
+"Verwenden\n"
+" Sie --reapply (impliziert --pop), um danach bis zum aktuellen Patch den\n"
+" Stapel wiederherzustellen (wird geschützte Patches auslassen)."
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+" Verwenden Sie -s/--series, um die Liste aller Wächter in dieser "
+"Seriendatei\n"
+" auszugeben (keine Argumente werden benötigt). Verwenden Sie -v für "
+"weitere\n"
+" Informationen."
+
+msgid "guards deactivated\n"
+msgstr "Wächter deaktiviert\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+"Die Anzahl ungeschützter, nicht angewandter Patches hat sich von %d auf %d "
+"geändert.\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+"Die Anzahl geschützter, angewandter Patches hat sich von %d auf %d "
+"geändert.\n"
+
+msgid "guards in series file:\n"
+msgstr "Wächter in der Seriendatei:\n"
+
+msgid "no guards in series file\n"
+msgstr "Keine Wächter in der Seriendatei\n"
+
+msgid "active guards:\n"
+msgstr "Aktive Wächter:\n"
+
+msgid "no active guards\n"
+msgstr "Keine aktiven Wächter\n"
+
+msgid "popping guarded patches\n"
+msgstr "Entferne geschützte Patches vom Stapel\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "Wende ungeschützte Patches erneut an\n"
+
+msgid "finish all applied changesets"
+msgstr "Schließt alle angewandten Änderungssätze ab"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "move applied patches into repository history"
+msgstr "Verschiebt angewandte Patches in die Historie des Projektarchivs"
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+" Schließt die angegebenen Revisionen ab (entspricht den angewandten\n"
+" Patches), indem sie aus der Kontrolle von mq entfernt und in die\n"
+" reguläre Projekthistorie übernommen werden."
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+" Akzeptiert einen Revisionsbereich oder den Schalter -a/--applied. Wenn\n"
+" --applied angegeben wird, werden alle angewandten mq-Revisionen aus der\n"
+" Kontrolle von mq entfernt. Ansonsten müssen die angegebenen Revisionen\n"
+" an der Basis des Stapels der angewandten Patches liegen."
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+" Dies kann insbes. nützlich sein, wenn Ihre Änderungen in einem\n"
+" vorgelagerten Projektarchiv angewandt wurden, oder wenn Sie Ihre\n"
+" Änderungen in ein vorgelagertes Archiv übertragen wollen."
+
+msgid "no revisions specified"
+msgstr "Keine Revisionen angegeben"
+
+msgid "warning: uncommitted changes in the working directory\n"
+msgstr "Warnung: Unversionierte Änderungen im Arbeitsverzeichnis\n"
+
+msgid "list all available queues"
+msgstr "Zeigt alle verfügbaren Patch-Reihen"
+
+msgid "print name of active queue"
+msgstr "Zeigt den Namen der aktive Patch-Reihe"
+
+msgid "create new queue"
+msgstr "Erstellt eine neue Patch-Reihe"
+
+msgid "rename active queue"
+msgstr "Benennt die aktive Patch-Reihe um"
+
+msgid "delete reference to queue"
+msgstr "Löscht den Verweis auf die Patch-Reihe"
+
+msgid "delete queue, and remove patch dir"
+msgstr "Löscht eine Patch-Reihe und entfernt das Patch-Verzeichnis"
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[OPTION] [REIHE]"
+
+msgid "manage multiple patch queues"
+msgstr "Verwaltet mehrere Patch-Reihen"
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+" Unterstützt das Wechseln zwischen verschiedener Patch-Reihen, sowie\n"
+" das Erstellen neuer Reihen und das Löschen bereits bestehender."
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+" only the name of the active queue."
+msgstr ""
+" Wenn ein Reihenname ausgelassen wird oder -l/--list angegeben wird, "
+"werden\n"
+" die registrierten Reihen angezeigt - standardmäßig ist die Reihe \"normal"
+"\"\n"
+" registriert. Die aktuelle Reihe ist mit \"(aktiv)\" markiert. Durch\n"
+" Angabe von --active wird nur der Name der aktiven Reihe angezeigt."
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+" Um eine neue Reihe zu erzeugen, verwenden Sie -c/--create. Die Reihe "
+"wird\n"
+" automatisch als aktiv mariert, es sei denn, es gibt bereits angewandte\n"
+" Patches aus der aktuell aktiven Reihe im Archiv. In diesem Fall wird "
+"die\n"
+" neue Reihe nur erzeugt und das Wechseln wird fehlschlagen."
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+" Um eine bestehende Reihe zu entfernen, benutzen Sie --delete. Sie können "
+"die\n"
+" aktuell aktive Reihe nicht entfernen."
+
+msgid "patches applied - cannot set new queue active"
+msgstr "Patches wurden angewandt - kann die neue Reihe nicht aktivieren"
+
+msgid "cannot delete queue that does not exist"
+msgstr "Kann nicht existierende Reihe nicht entfernen"
+
+msgid "cannot delete currently active queue"
+msgstr "Kann die aktuell aktive Reihe nicht entfernen"
+
+msgid " (active)\n"
+msgstr " (aktiv)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr ""
+"Ungültiger Name für die Reihe, er darf die Zeichen \":\\/.\" nicht enthalten."
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "Reihe \"%s\" existiert bereits"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "Kann \"%s\" nicht zu ihrem aktuellen Namen umbenennen"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "Verzeichnis \"%s\" existiert bereits, ist aber keine Reihe"
+
+msgid "use --create to create a new queue"
+msgstr "Verwenden Sie --create, um eine neue Reihe zu erzeugen"
+
+msgid "cannot commit over an applied mq patch"
+msgstr "Kann nicht über einem angewandten mq-Patch speichern"
+
+msgid "source has mq patches applied"
+msgstr "Die Quelle hat angewandte mq-Patches"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "Die mq-Statusdatei referenziert nicht existierenden Knoten %s\n"
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr "Das Tag %s überschreibt den mq-Patch mit demselben Namen\n"
+
+msgid "cannot import over an applied patch"
+msgstr "Kann nicht über einem angewandten Patch importieren"
+
+msgid "only a local queue repository may be initialized"
+msgstr "Es kann nur ein lokales Reihen-Archiv initialisiert werden"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "Es gibt hier kein Mercurial-Archiv (.hg nicht gefunden)"
+
+msgid "no queue repository"
+msgstr "Kein Reihen-Archiv"
+
+#, python-format
+msgid "%d applied"
+msgstr "%d angewandt"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d entfernt"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (leere Reihe)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+" Änderungssätze unter der Kontrolle von MQ."
+
+msgid "mq takes no arguments"
+msgstr "mq erwartet keine Argumente"
+
+msgid "operate on patch repository"
+msgstr "Arbeite mit Patch-Archiv"
+
+msgid "hooks for sending email push notifications"
+msgstr "Hooks zum Senden von E-Mail-Benachrichtigungen beim Ãœbertragen"
+
+msgid ""
+"This extension let you run hooks sending email notifications when\n"
+"changesets are being pushed, from the sending or receiving side."
+msgstr ""
+"Diese Erweiterung ermöglicht das Senden von Benachrichtigungsemails,\n"
+"wannimmer Änderungssätze übertragen werden. Dies kann von der über-\n"
+"tragenden oder der empfangenden Seite aus geschehen."
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
+"are run by the changesets receiver while the ``outgoing`` one is for\n"
+"the sender::"
+msgstr ""
+"Zunächst muss die Erweiterung aktiviert werden \n"
+"(wie in :hg:`help extensions` beschrieben) und dann \n"
+"als Hook registriert werden.Die ``incoming``- und ``changegroup``-Hooks "
+"werden\n"
+"vom Änderungssatz-Empfänger ausgeführt, der\n"
+"``outgoing``-Hook ist für den Sender::"
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+" [hooks]\n"
+" # eine E-Mail für jeden eingehenden Änderungssatz\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # zusammengefasste E-Mails wenn viele Änderungen auf einmal eingehen\n"
+" changegroup.notify = python:hgext.notify.hook"
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+" # eine E-Mail für jeden übertragenen Änderungssatz\n"
+" outgoing.notify = python:hgext.notify.hook"
+
+msgid ""
+"Now the hooks are running, subscribers must be assigned to\n"
+"repositories. Use the ``[usersubs]`` section to map repositories to a\n"
+"given email or the ``[reposubs]`` section to map emails to a single\n"
+"repository::"
+msgstr ""
+"Schliesslich müssen noch die Abonnements für die Projektarchive definiert\n"
+"werden. Im Abschnitt ``[usersubs]`` kann man mehrere Archive einer Email\n"
+"zuweisen, in ``[reposubs]`` umgekehrt mehrere Emails für ein Archiv angeben."
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+" [usersubs]\n"
+" # Schlüssel ist die Email-Adresse des Abonnenten\n"
+" # Wert ist eine kommaseparierte Liste von glob-Mustern\n"
+" benutzer@rechner = muster"
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+" [reposubs]\n"
+" # Schlüssel ist ein glob-Muster\n"
+" # Wert ist eine kommaseparierte Liste von Abonnenten-Emails\n"
+" muster = benutzer@rechner"
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root. The subscriptions can be defined in their own file and\n"
+"referenced with::"
+msgstr ""
+"Die glob-Muster müssen auf den absoluten Pfad zum Archiv passen. Alle\n"
+"Abonnements können in einer eigenen Datei gesammelt werden und folgender-\n"
+"maßen in der Konfiguration eingebunden werden::"
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+" [notify]\n"
+" config = /pfad/zur/abonnentendatei"
+
+msgid ""
+"Alternatively, they can be added to Mercurial configuration files by\n"
+"setting the previous entry to an empty value."
+msgstr ""
+"Alternativ (mit leerem Wert für ``notify.config``) können die Abonnements\n"
+"in der Mercurial-Konfigurationsdatei angegeben werden."
+
+msgid ""
+"At this point, notifications should be generated but will not be sent until "
+"you\n"
+"set the ``notify.test`` entry to ``False``."
+msgstr ""
+"Nach dieser Konfiguration werden die Benachrichtigungen nun generiert, aber\n"
+"noch nicht gesendet, bis der Wert von ``notify.test`` auf ``False`` gesetzt\n"
+"wird."
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+"Der Inhalt der Benachrichtigungen kann mit der folgenden Konfiguration\n"
+"angepasst werden:"
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+"notify.test\n"
+" Falls ``True`` werden die Nachrichten auf die Standardausgabe und nicht\n"
+" als Email versendet. Standard: True."
+
+msgid ""
+"notify.sources\n"
+" Space separated list of change sources. Notifications are sent only\n"
+" if it includes the incoming or outgoing changes source. Incoming\n"
+" sources can be ``serve`` for changes coming from http or ssh,\n"
+" ``pull`` for pulled changes, ``unbundle`` for changes added by\n"
+" :hg:`unbundle` or ``push`` for changes being pushed\n"
+" locally. Outgoing sources are the same except for ``unbundle`` which\n"
+" is replaced by ``bundle``. Default: serve."
+msgstr ""
+"notify.sources\n"
+" Kommaseparierte Liste von Quellaktionen. Benachrichtigungen werden nur\n"
+" gesendet, wenn die Änderungen von einer solchen Aktion ausgelöst wurden.\n"
+" Quellen für ankommende Änderungen sind ``serve`` (Änderungen via http\n"
+" oder ssh), ``pull`` (aktiv abgerufen), ``unbundle`` (per :hg:`unbundle`\n"
+" eingefügt) oder ``push`` (lokal übertragen). Für ausgehende Änderungen\n"
+" gibt es die gleichen, nur mit ``unbundle`` gegen ``bundle`` getauscht.\n"
+" Voreinstellung: serve."
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+" references repositories with their absolute path. ``notify.strip`` let "
+"you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+"notify.strip\n"
+" Anzahl der Schrägstriche, die vom URL-Pfad abgeschnitten werden sollen.\n"
+" Standardmäßig werden Archive mit ihrem absoluten Pfad benannt.\n"
+" Mit ``notify.strip`` lässt sich das in relative Pfade abwandeln. Zum\n"
+" Beispiel wird ``/langer/pfad/zum/archiv`` mit ``strip=4`` zu ``archiv``.\n"
+" Standard: 0."
+
+msgid ""
+"notify.domain\n"
+" If subscribers emails or the from email have no domain set, complete them\n"
+" with this value."
+msgstr ""
+"notify.domain\n"
+" Falls eine Abonnementen- oder die Sender-Adresse keine Domäne haben,\n"
+" wird dieser Wert eingefügt."
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+"notify.style\n"
+" Stil-Datei für das Formatieren der Emails."
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+"notify.template\n"
+" Vorlage für das Formatieren der Emails."
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as incoming hook, override ``notify.template``."
+msgstr ""
+"notify.incoming\n"
+" Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
+" durch einen 'incoming'-Hook ausgelöst wurde."
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as outgoing hook, override ``notify.template``."
+msgstr ""
+"notify.outcoming\n"
+" Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
+" durch einen 'outcoming'-Hook ausgelöst wurde."
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as changegroup hook, override\n"
+" ``notify.template``."
+msgstr ""
+"notify.changegroup\n"
+" Vorlage (mit höherer Priorität als ``notify.template``), falls die Aktion\n"
+" durch einen 'changegroup'-Hook ausgelöst wurde."
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, -1 to include all of it. Default: 300."
+msgstr ""
+"notify.maxdiff\n"
+" Maximale Zeilenanzahl des Diffs in der Benachrichtigungsemail. Der Wert\n"
+" 0 unterbindet die Anzeige des Diffs, -1 wird das gesamte Diff ausgeben.\n"
+" Voreinstellung: 300."
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in emails subject line. Default: 67."
+msgstr ""
+"notify.maxsubject\n"
+" Maximale Länge der Betreffszeile. Voreinstellung: 67."
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+"notify.diffstat\n"
+" Zeige eine Diff-Statistik vor dem eigentlich Diff an. Voreinstellung: True."
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+"notify.merge\n"
+" Sende Nachrichten auch für Zusammenführungen. Voreinstellung: True."
+
+msgid ""
+"notify.mbox\n"
+" If set, append mails to this mbox file instead of sending. Default: None."
+msgstr ""
+"notify.mbox\n"
+" Schreibe Nachrichten in mbox Datei, anstatt sie zu versenden. "
+"Voreinstellung: None"
+
+msgid ""
+"notify.fromauthor\n"
+" If set, use the first committer of the changegroup for the \"From\" field "
+"of\n"
+" the notification mail. If not set, take the user from the pushing repo.\n"
+" Default: False."
+msgstr ""
+"notify.fromauthor\n"
+" Verwende den Autoren der ersten Änderungsgruppe als Absender der\n"
+" Benachrichtigungsemail. Falls nicht gesetzt, verwende den Nutzer im\n"
+" übertragenden Archiv. Voreinstellung: False."
+
+msgid ""
+"If set, the following entries will also be used to customize the "
+"notifications:"
+msgstr ""
+"Durch Setzen der folgenden Einträge können die Benachrichtigungen weiter\n"
+"angepasst werden:"
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in generated email "
+"content."
+msgstr ""
+"email.from\n"
+" Die zu verwendende Senderadresse (``From``), falls die Vorlage keinen\n"
+" Wert setzt."
+
+msgid ""
+"web.baseurl\n"
+" Root repository browsing URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+"web.baseurl\n"
+" Die Basis-URL für alle Archive, die mit dem abgeschnittenen (siehe\n"
+" ``notify.strip``) Archivpfad für Referenzen verwendet wird."
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d neue Änderungssätze"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: Sende %d Empfängern %d Änderungen\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"Unterschiede (gekürzt von %d auf %d Zeilen):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"Unterschiede (%d Zeilen):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr "notify: unterdrücke Benachrichtigung über Zusammenführung %d:%s\n"
+
+msgid "browse command output with an external pager"
+msgstr ""
+"Verwendet einen externen Pager zum Blättern in der Ausgabe von Befehlen"
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+"Um den zu verwendenden Pager zu setzen, setzen Sie die folgende Variable::"
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRSX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+"Wenn kein Pager gesetzt ist, wird die Erweiterung die Umgebungsvariable\n"
+"$PAGER verwenden. Wenn weder pager.pager noch $PAGER gesetzt ist, wird\n"
+"kein Pager verwendet."
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+"Sie können den Pager für bestimmte Befehle deaktivieren, indem Sie diese\n"
+"in die pager.ignore-Liste aufnehmen::"
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+" [pager]\n"
+" ignore = version, help, update"
+
+#, fuzzy
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+"Sie können den Pager auch nur für bestimmte Befehle aktivieren, indem\n"
+"Sie pager.attend verwenden. Unten folgt die Standardliste der Befehle,\n"
+"für die ein Pager verwendet wird::"
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+"Wenn pager.attend auf eine leere Liste gesetzt wird, werden alle\n"
+"Befehle den Pager benutzen."
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr "Wenn pager.attend vorhanden ist, ist pager.ignore wirkungslos."
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+"Um globale Befehle wie :hg:`version` oder :hg:`help` zu ignorieren,\n"
+"müssen Sie diese in Ihrer Konfigurationsdatei angeben."
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+"The --pager=... Option kann auch dazu benutzt werden, den Einsatz des\n"
+"Pagers zu kontrollieren. Benutzen Sie Werte wie yes, no, on, off, oder auto\n"
+"für normales Verhalten.\n"
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr "Wann soll die Seite umgebrochen werden (always, auto oder never)"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr "Befehl, um Änderungssätze als (Reihe von) Patch-E-Mails zu versenden"
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"Die Serie wird mit \"[PATCH 0 of N]\" eingeleitet, was die Serie als\n"
+"Ganzes beschreibt."
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"Der Betreff jeder Patch-E-Mail ist \"[PATCH M of N] ...\", mit der ersten\n"
+"Zeile der Änderungszusammenfassung als weiterem Text. Die Nachricht\n"
+"besteht aus zwei oder drei Teilen:"
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+"- Der Beschreibung des Änderungssatzes.\n"
+"- [Optional] Dem Ergebnis der Anwendung von diffstat auf den Patch.\n"
+"- Den durch :hg:`export` erstellten Patch selbst."
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"Jede Nachricht bezieht sich auf die erste der Serie mit den In-Reply-To-\n"
+"und References-Headern, so dass sie in threadorientierten Mailprogrammen\n"
+"und -archiven als zusammengehörig angezeigt werden."
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+"Andere Vorgabewerte können beispielsweise durch den folgenden Abschnitt\n"
+"in der Konfigurationsdatei gesetzt werden::"
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+" [email]\n"
+" from = Mein Name <meine@email>\n"
+" to = empfänger1, empfänger2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = adresse1, adresse2, ..."
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+"Benutzen Sie ``[patchbomb]`` als Abschnittsnamen, falls Sie globale\n"
+"``[email]``-Einstellungen überschreiben müssen."
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+"Danach kann die \"Patchbombe\" durch das Kommando :hg:`email` versandt\n"
+"werden."
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"Sie können entweder die Versendeweise im [email]-Abschnitt auf einen\n"
+"sendmail-kompatibles Mailprogramm setzen oder den [smtp]-Abschnitt so\n"
+"ausfüllen, dass die patchbomb-Erweiterung automatisch Patchbomben von der\n"
+"Befehlszeile senden kann. Siehe die [email]- und [smtp]-Abschnitte in\n"
+"hgrc(5) für Einzelheiten.\n"
+
+msgid "send patches as inline message text (default)"
+msgstr "Sendet Patches als inline-Nachrichtentext (Voreinstellung)"
+
+msgid "send patches as attachments"
+msgstr "Sendet Patches als Anhänge"
+
+msgid "send patches as inline attachments"
+msgstr "Sendet Patches als inline-Anhänge"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "Emailadressen von BCC-Empfängern"
+
+msgid "email addresses of copy recipients"
+msgstr "Emailadressen von CC-Empfängern"
+
+msgid "ask for confirmation before sending"
+msgstr "Vor dem Abschicken bestätigen"
+
+msgid "add diffstat output to messages"
+msgstr "Fügt Ausgabe von diffstat hinzu"
+
+msgid "use the given date as the sending date"
+msgstr "Nutze gegebenes Datum als Sendedatum"
+
+msgid "use the given file as the series description"
+msgstr "Nutze gegebene Datei als Serienbeschreibung"
+
+msgid "email address of sender"
+msgstr "Emailadresse des Senders"
+
+msgid "print messages that would be sent"
+msgstr "Zeige Nachrichten an, die gesendet werden würden"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "Schreibe Nachrichten in mbox Datei, anstatt sie zu versenden"
+
+msgid "email addresses replies should be sent to"
+msgstr "Emailadressen zu denen Antworten geschickt werden sollen"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "Betreff der ersten Nachricht (Serieneinführung oder einzelner Patch)"
+
+msgid "message identifier to reply to"
+msgstr "Antwortadresse (reply-to)"
+
+msgid "flags to add in subject prefixes"
+msgstr "Diese Stichwörter zu Betreffs-Präfixen hinzufügen"
+
+msgid "email addresses of recipients"
+msgstr "Emailadressen der Empfänger"
+
+msgid "omit hg patch header"
+msgstr "Lasse \"hg patch\"-Kopf aus"
+
+msgid "send changes not found in the target repository"
+msgstr "Wähle Änderungen aus, die nicht im Zielarchiv sind"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "Wähle Änderungen, die nicht im Ziel als Binärbündel sind"
+
+msgid "name of the bundle attachment file"
+msgstr "Name der Bündel-Anhangsdatei"
+
+msgid "a revision to send"
+msgstr "Eine zu sendende Revision"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+"Auch ausführen, wenn das entfernte Archiv keinen Bezug hat (mit -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr "Eine Basisrevision anstelle eines Ziels (mit -b/--bundle)"
+
+msgid "send an introduction email for a single patch"
+msgstr "Sende eine Einführungsemail auch für einzelnen Patch"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [OPTION]... [ZIEL]..."
+
+msgid "send changesets by email"
+msgstr "Sende Änderungssätze per Email"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+" Standardmäßig werden Änderungen im :hg:`export`-Format gesendet,\n"
+" je eine pro Nachricht. Die Serie wird durch \"[PATCH 0 of N]\"\n"
+" eingeleitet, die die Serie als Ganzes beschreibt."
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+" Der Betreff jeder Patch-E-Mail ist \"[PATCH M of N] ...\", mit der\n"
+" ersten Zeile der Änderungszusammenfassung als weiterem Text. Die\n"
+" Nachricht besteht aus zwei oder drei Teilen. Zuerst die Beschreibung\n"
+" des Änderungsssatzes."
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+" Mit der -d/--diffstat Option wird das Ergebnis des diffstat Laufes\n"
+" über den Patch eingefügt, wenn diffstat installiert ist."
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr ""
+" Zum Schluss der Patch selbst, wie er von :hg:`export` generiert wird."
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+" Bei der Angabe der Optionen -d/--diffstat oder -c/--confirm wird eine\n"
+" abschließende Zusammenfassung aller Nachrichten angezeigt und um\n"
+" Bestätigung gebeten, bevor die Nachrichten versendet werden."
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created. You can include a patch both as text in the email\n"
+" body and as a regular or an inline attachment by combining the\n"
+" -a/--attach or -i/--inline with the --body option."
+msgstr ""
+" Standardmäßig ist der Patch direkt im Text der Email enthalten,\n"
+" damit er leicht überprüft werden kann. Mit dem Schalter\n"
+" -a/--attach stattdessen ein Anhang für den Patch erzeugt.\n"
+" Der Schalter -i/--inline erzeugt einen Inline-Anhang. Ein Patch\n"
+" kann sowohl als Nachrichtentext als auch als normaler oder \n"
+" Inline-Anhang eingebunden werden, indem die Schalter\n"
+" -a/--attach und -i/--inline mit dem --body - Schalter\n"
+" kombiniert werden."
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+" Mit der Option -o/--outgoing werden nur solche Patches gesendet, die\n"
+" sich nicht in einem Zielarchiv befinden (möglicherweise weiter begrenzt\n"
+" durch solche, die mit -r/--rev gegeben sind)."
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+" Durch -b/--bundle werden Änderungssätze wie durch --outgoing gewählt,\n"
+" aber in einer einzelnen Email als Binärbündel (als Anhang) gesendet."
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+" Alternativ werden die Nachrichten mit der Option -m/--mbox in eine\n"
+" Datei geschrieben, die von jedem Emailprogramm, welches das UNIX-mbox-\n"
+" Format unterstützt, geprüft werden, zum Beispiel mit mutt::"
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+" Mit der Option -n/--test werden alle Schritte ausgeführt und das\n"
+" Ergebnis angezeigt, aber keine Email versendet. Sie werden also nach\n"
+" einer Empfängeradresse, einem Betreff und einer einleitenden Nachricht,\n"
+" die die Patches Ihrer Patchbombe beschreibt, gefragt. Dann werden alle\n"
+" Patchbombennachrichten angezeigt. Wenn die PAGER-Umgebungsvariable\n"
+" gesetzt ist, wird Ihr Pager für jede Patchbombe einzeln aufgerufen, so\n"
+" dass alles überprüft werden kann."
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+" Sollte das Email Versenden fehlschlagen, finden Sie einen Backup Ihres\n"
+" Serien-Einführungstextes in ``.hg/last-email.txt``."
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+" hg email -r 3000 # sendet nur Patch 3000\n"
+" hg email -r 3000 -r 3001 # sendet Patches 3000 und 3001\n"
+" hg email -r 3000:3005 # sendet Patches 3000 bis 3005\n"
+" hg email 3000 # sendet Patch 3000 (veraltet)"
+
+#, fuzzy
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -o # sendet alle Patches nicht im default-Ziel\n"
+" hg email -o ZIEL # sendet alle Patches nicht im ZIEL\n"
+" hg email -o -r 3000 # Vorfahren von 3000 nicht im default-Ziel\n"
+" hg email -o -r 3000 ZIEL # Vorfahren von 3000 nicht im ZIEL"
+
+#, fuzzy
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -b # bündelt alle Patches nicht im default-"
+"Ziel\n"
+" hg email -b DEST # bündelt alle Patches nicht im ZIEL\n"
+" hg email -b -r 3000 ZIEL # bündelt Vorfahren von 3000 nicht im ZIEL"
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+" hg email -o -m mbox && # erzeugt eine mbox Datei ...\n"
+" mutt -R -f mbox # ... und zeigt sie mit mutt an\n"
+" hg email -o -m mbox && # erzeugt eine mbox Datei ...\n"
+" formail -s sendmail \\ # ... und benutzt formail, um davon zu "
+"versenden\n"
+" -bm -t < mbox # ... mit sendmail"
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+" Um dieses Kommando zu benutzen muss der Emailversand im Abschnitt\n"
+" [email] der Konfiguration aktiviert sein. Siehe hgrc(5) für Details.\n"
+" "
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "Vergleiche mit %s\n"
+
+msgid "no changes found\n"
+msgstr "Keine Änderungen gefunden\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "Mindestens ein Änderungssatz mit -r oder -o wird benötigt"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr "--bundle impliziert bereits --outgoing; bitte nicht wiederholt angeben"
+
+msgid "too many destinations"
+msgstr "zu viele Ziele"
+
+msgid "use only one form to specify the revision"
+msgstr "Nutze nur eine Form um eine Revision anzugeben"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Bitte eine Einführung für die Patch-Serie eingeben."
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr "Diese Patch-Serie besteht aus %d Patches."
+
+msgid "no recipient addresses provided"
+msgstr "Keine Empfängeradresse angegeben"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"Engültige Zusammenfassung:"
+
+msgid "are you sure you want to send (yn)?"
+msgstr "Sicher, dass Sie jetzt senden möchten (j/n)?"
+
+msgid "&No"
+msgstr "&Nein"
+
+msgid "&Yes"
+msgstr "&Ja"
+
+msgid "patchbomb canceled"
+msgstr "patchbomb abgebrochen"
+
+msgid "Displaying "
+msgstr "Zeige "
+
+msgid "Sending "
+msgstr "Sende "
+
+msgid "sending"
+msgstr "Sende"
+
+msgid "writing"
+msgstr "Schreibe"
+
+msgid "show progress bars for some actions"
+msgstr "Bei einigen Befehlen Fortschrittsbalken zeigen"
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+"Diese Erweiterung nutzt die Fortschrittsinformation von anderen\n"
+"hg Befehlen, um möglichst informative Fortschrittsbalken zu zeichnen.\n"
+"Einige Fortschrittsbalken bieten nur Zustandsinformationen ohne feste\n"
+"Dauer, während andere einen definierten Endpunkt haben."
+
+msgid "The following settings are available::"
+msgstr "Die folgenden Einstellungen sind verfügbar::"
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+" [progress]\n"
+" delay = 3 # Verzögerung in Sekunden (float),\n"
+" # bevor der Fortschrittsbalken gezeigt wird\n"
+" changedelay = 1 # Mindestverzögerung bevor ein neues Thema gezeigt wird.\n"
+" # Falls 3 * refresh größer ist, wird dies verwendet.\n"
+" refresh = 0.1 # Sek. zwischen Aktualisierungen des Fortschrittsbalkens\n"
+" format = topic bar number estimate # Format des Fortschrittsbalkens\n"
+" width = <none> # Maximalbreite der Fortschrittsinformation\n"
+" # (damit wird min(width, term width) verwendet)\n"
+" clear-complete = True # löscht den Fortschrittsbalken, wenn er fertig ist\n"
+" disable = False # Mit True wird kein Fortschrittsbalken angezeigt\n"
+" assume-tty = False # Mit True wird IMMER ein Fortschrittsbalken gezeigt,\n"
+" # es sei denn disable ist auf True gesetzt"
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+"Gültige Einträge für das Format-Feld sind topic, bar, number, unit\n"
+"estimate, speed und item. item zeigt normalerweise die letzten 20 Zeichen\n"
+"des Objektes. Mit dem Zusatz ``-<num>`` oder ``+<num>`` werden stattdessen\n"
+"entweder die letzten (-) oder die ersten (+) num Zeichen gezeigt.\n"
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02dsek"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%d:%02d"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%d:%02d"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%dd%02dh"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%dw%02dd"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%dy%02dw"
+
+#, python-format
+msgid "%d %s/sec"
+msgstr "%d %s/Sek"
+
+msgid "command to delete untracked files from the working directory"
+msgstr "Löscht nicht versionierte Dateien aus dem Arbeitsverzeichnis"
+
+msgid "abort if an error occurs"
+msgstr "Bei Fehler abbrechen"
+
+msgid "purge ignored files too"
+msgstr "Auch ignorierte Dateien entfernen"
+
+msgid "print filenames instead of deleting them"
+msgstr "Zeigt Dateinamen an, statt sie zu entfernen"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+"Beendet Dateinamen mit NUL zur Nutzung mit xargs (implizert -p/--print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [OPTION]... [DIR]..."
+
+msgid "removes files not tracked by Mercurial"
+msgstr "Entfernt nicht von Mercurial versionierte Dateien"
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+" Entferne Dateien, die Mercurial nicht bekannt sind. Nützlich, um\n"
+" lokale und nicht versionierte Dateien in einem ansonsten\n"
+" unveränderten Projektarchiv zu testen."
+
+msgid " This means that purge will delete:"
+msgstr " Das heißt, purge wird das folgende löschen:"
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+" - Unbekannte Dateien: Dateien, die :hg:`status` mit \"?\\\" markiert\n"
+" - Leere Verzeichnisse: Mercurial ignoriert Verzeichnisse, solange\n"
+" sie keine Dateien unter Versionsverwaltung enthalten."
+
+msgid " But it will leave untouched:"
+msgstr " Aber das folgende unberührt lassen:"
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+" - Veränderte und unveränderte Dateien unter Versionsverwaltung\n"
+" - Ignorierte Dateien (es sei denn --all wurde angegeben)\n"
+" - Neu hinzugefügte Dateien (mit :hg:`add`)"
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+" Wenn auf der Befehlzeile Verzeichnisse angegeben wurden, werden\n"
+" nur Dateien in diesen Verzeichnissen einbezogen."
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+" Seien Sie mit purge vorsichtig, da Sie Dateien unwiederbringlich\n"
+" löschen könnten, die Sie nicht zum Projektarchiv hinzugefügt\n"
+" haben. Wenn Sie nur die Liste der Dateien sehen wollen, die dieses\n"
+" Programm entfernen würde, nutzen Sie die Option --print.\n"
+" "
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s kann nicht entfernt werden"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "Warnung: %s\n"
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr "Entferne Datei %s\n"
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr "Entferne Verzeichnis %s\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "Verknüpft Änderungssätze mit einem anderen Vorgänger"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"Mit dieser Erweiterung können Sie Versionen in einem existierenden\n"
+"Mercurial-Projektarchiv auf einen anderen Ansatzpunkt verschieben."
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"Weitere Informationen:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+#, fuzzy
+msgid "rebase from the specified changeset"
+msgstr "Verschiebe angefangen vom gegebenen Änderungssatz"
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+"verschiebt von der Basis des spezifizierten Changesets (bis zum größten "
+"gemeinsamen Vorgänger von base und dest)"
+
+msgid "rebase these revisions"
+msgstr "Verschiebe diese Revisionen"
+
+msgid "rebase onto the specified changeset"
+msgstr "Verschiebe auf den gegebenen Änderungssatz"
+
+msgid "collapse the rebased changesets"
+msgstr "Fügt die verschobenen Änderungssätze zu einem einzelnen zusammen"
+
+msgid "use text as collapse commit message"
+msgstr "Setzt die Versionsmeldung des zusammengefügten Änderungssatzes"
+
+msgid "invoke editor on commit messages"
+msgstr "Ruft Editor zum Setzen der Versionsmeldung auf"
+
+msgid "read collapse commit message from file"
+msgstr "Liest Versionsmeldung für den zusammengefügten Änderungssatz aus Datei"
+
+msgid "keep original changesets"
+msgstr "Behält die ursprünglichen Änderungssätze bei"
+
+msgid "keep original branch names"
+msgstr "Erhält die ursprünglichen Zweignamen"
+
+msgid "force detaching of source from its original branch"
+msgstr "erzwingt ein Abkoppeln der Quelle von ihrem ursprünglichen Zweig"
+
+msgid "specify merge tool"
+msgstr "Methode für das Zusammenführen"
+
+msgid "continue an interrupted rebase"
+msgstr "Führt eine unterbrochene Pfropfung fort"
+
+msgid "abort an interrupted rebase"
+msgstr "Bricht eine unterbrochene Pfropfung ab"
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [Optionen]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+"Verschiebt Versionen (und ihre Nachfolger) auf einen abweichenden Zweig"
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+" Rebase nutzt wiederholtes Zusammenführen um Versionen von einem Teil "
+"der\n"
+" Versionshistorie auf einen anderen zu pfropfen. Dies ist nützlich, um\n"
+" *lokale* Änderungen in einem Hauptentwicklunszweig zu linearisieren."
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+" Sie sollten keine Änderungssätze umpfropfen, die auch andere bereits\n"
+" haben, ansonsten zwingen Sie jeden anderen die gleiche rebase-\n"
+" Operation durchzuführen, um die verschobenen Versionen nicht\n"
+" doppelt zu haben, sobald sie Ihre Änderungen abrufen."
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+" Wenn Sie keine Zielversion spezifizieren (``-d/--dest``), verwendet\n"
+" rebase als Ziel den Kopf des aktuellen benannten Zweigs, der\n"
+" der Projektspitze (tip) am nächsten ist. (Die Zielversion wird durch\n"
+" die Verschiebung nicht verändert, aber erhält neue Kinder.)"
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+" Sie können die zu verschiebenden Versionen auf zwei Arten angeben: Als\n"
+" \"Quell-\" oder als \"Basisversion\". Mit diesen ist jeweils eine Menge\n"
+" von topologisch verwandten Revisionen gemeint (der \"Quell\"-zweig).\n"
+" Wenn Sie eine Quellversion (``-s/--source``) angeben, wird Mercurial\n"
+" diese Version und alle ihrer Nachfahren verschieben. Geben Sie eine\n"
+" Basisversion (``-b/--base``) an, so sucht Mercurial den jüngsten\n"
+" gemeinsamen Vorfahren der Basis und des Ziels und verschiebt den Zweig,\n"
+" der die Basis enthält, nicht jedoch den gemeinsamen Vorfahren.\n"
+" Somit ist ``-s`` genauer, aber ``-b`` praktischer: Man gibt irgendeine\n"
+" Version im zu verschiebenden Zweig an. Wenn Sie weder ``-s`` noch\n"
+" ``-b`` angeben, wird den Vorfahr der Arbeitskopie als Basis verwendet."
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+" Standardmäßig werden die Änderungssätze des Quellzweigs als Nachfahren\n"
+" des Ziels erzeugt und ihr Original zerstört. Mit ``--keep`` werden\n"
+" die Originale erhalten. Einige Änderungssätze des Quellzweigs könnten\n"
+" entfernt werden (z.B. Zusammenführungen aus dem Zielzweig, die keine\n"
+" eigenen Änderungen über die Zusammenführung hinaus enthalten)."
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+" Als Folge der automatischen Auswahlregeln für Quelle und Ziel wird\n"
+" (im Gegensatz zu einer Zusammenführung) keine Verschiebung "
+"durchgeführt,\n"
+" wenn der jüngere von zwei Köpfen eines Zweiges aktuell ist. In diesem\n"
+" Falle (z.B. bei lokaler Versionsübernahme nach einem Abrufen), muss\n"
+" eine Quelle und/oder ein Ziel explizit angegeben werden. Dieser Fall\n"
+" tritt aber vor allem ein, wenn das Arbeitsverzeichnis im Zielzweig\n"
+" liegt, also zunächst auf den Quellzweig aktualisiert werden muss."
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+" Sollte eine Verschiebung zwecks manueller Konfliktbehebung unterbrochen\n"
+" werden, kann sie mit --continue/-c wieder aufgenommen oder mit\n"
+" --abort/-a abgebrochen werden."
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, oder 1, wenn es nichts zu verschieben gibt.\n"
+" "
+
+msgid "message can only be specified with collapse"
+msgstr ""
+"Eine Versionsmeldung kann nur für beim Zusammenfalten (--collapse) gegeben\n"
+"werden"
+
+msgid "cannot use both abort and continue"
+msgstr "abort und continue dürfen nicht gleichzeitig angegeben werden"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "collapse kann nicht mit continue oder abort genutzt werden"
+
+msgid "cannot use detach with continue or abort"
+msgstr "detach kann nicht mit continue oder abort genutzt werden"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "abort und continue erlauben keine Angabe einer Revision"
+
+msgid "tool option will be ignored\n"
+msgstr "Die Option tool wird ignoriert\n"
+
+msgid "cannot specify both a source and a base"
+msgstr "Quelle und Basis dürfen nicht gleichzeitig angegeben werden"
+
+msgid "cannot specify both a revision and a base"
+msgstr "Revision und Basis dürfen nicht gleichzeitig angegeben werden"
+
+msgid "cannot specify both a revision and a source"
+msgstr "Revision und Quelle dürfen nicht gleichzeitig angegeben werden"
+
+msgid "detach requires a revision to be specified"
+msgstr "detach benötigt eine Revision"
+
+msgid "cannot specify a base with detach"
+msgstr "detach erwartet keine Basis"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr "Kann Änderungssatz nicht ohne dessen Nachfahren verschieben"
+
+msgid "use --keep to keep original changesets"
+msgstr "Verwende --keep, um die ursprünglichen Änderungssätze zu behalten"
+
+#, python-format
+msgid "can't rebase immutable changeset %s"
+msgstr "Nicht veränderbarer Änderungssatz %s kann nicht verschoben werden"
+
+msgid "see hg help phases for details"
+msgstr "Siehe hg help phases für Details"
+
+msgid "nothing to rebase\n"
+msgstr "Kein Verschiebung nötig\n"
+
+msgid "cannot collapse multiple named branches"
+msgstr "Mehrere benannte Zweige können nicht zusammengefaltet werden"
+
+msgid "rebasing"
+msgstr "Verschiebe"
+
+msgid "changesets"
+msgstr "Änderungssätze"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr ""
+"ungelöste Konflikte (siehe hg resolve, fahre mit hg rebase --continue fort)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "keine Änderungen, Revision %d übersprungen\n"
+
+msgid "rebase merging completed\n"
+msgstr "Zusammenführungen der Verschiebung abgeschlossen\n"
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr "Warnung: Neue Änderungssätze auf Quellzweig gefunden, lösche nicht\n"
+
+msgid "rebase completed\n"
+msgstr "Verschiebung abgeschlossen\n"
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "%d Revisionen wurden übersprungen\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+"Zusammenfalten nicht möglich: es gibt mehr als einen externen Vorgänger"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+"Revision %d kann nicht als Basis genutzt werden: das Ergebnis hätte 3 "
+"Vorgänger"
+
+msgid "no rebase in progress"
+msgstr "Keine vorherige Verschiebung zur Wiederaufnahme"
+
+msgid "warning: immutable rebased changeset detected, can't abort\n"
+msgstr ""
+"Warnung: Unveränderbare Änderungssätze gefunden. Kann nicht abbrechen\n"
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+"Warnung: Neue Änderungssätze auf Zielzweig gefunden. Kann nicht abbrechen\n"
+
+msgid "rebase aborted\n"
+msgstr "Verschiebung abgebrochen\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr "Verschiebung kann nicht auf einem angewandten MQ-Patch aufsetzen"
+
+msgid "no matching revisions"
+msgstr "keine passenden Revisionen"
+
+msgid "can't rebase multiple roots"
+msgstr "Mehrere Wurzeln können nicht verschoben werden"
+
+msgid "source is ancestor of destination"
+msgstr "Quelle ist ein Vorfahr des Ziels"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "Aktualisiere Lesezeichen %s\n"
+
+msgid "--tool can only be used with --rebase"
+msgstr "--tool kann nicht gleichzeitig mit --rebase verwendet werden"
+
+msgid "rebase working directory to branch head"
+msgstr "Führt Verschiebung des Arbeitsverzeichnisses auf den Zweigkopf"
+
+msgid "specify merge tool for rebase"
+msgstr "Methode für Zusammenführungen innerhalb der Verschiebung"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr "Befehle um interaktiv Änderungen für commit/qrefresh zu wählen"
+
+msgid "ignore white space when comparing lines"
+msgstr "Ignoriert Leerzeichen beim Vergleich von Zeilen"
+
+msgid "ignore changes in the amount of white space"
+msgstr "Ignoriert Änderungen bei der Anzahl von Leerzeichen"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "Ignoriert Änderungen, die nur aus Leerzeilen bestehen"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "Dies modifiziert eine Binärdatei (alles oder nicht)\n"
+
+msgid "this is a binary file\n"
+msgstr "Dies ist eine Binärdatei\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "%d Hunks, %d Zeilen geändert\n"
+
+msgid "[Ynesfdaq?]"
+msgstr "[jnbsdfab?]"
+
+msgid "&Yes, record this change"
+msgstr "&Ja - übernimmt diese Änderung"
+
+msgid "&No, skip this change"
+msgstr "&Nein, überspringt diese Änderung"
+
+msgid "&Edit the change manually"
+msgstr "Änderung manuell &bearbeiten"
+
+msgid "&Skip remaining changes to this file"
+msgstr "Über&springe die restlichen Änderungen an dieser Datei"
+
+msgid "Record remaining changes to this &file"
+msgstr "Zeichne die restlichen Änderungen an dieser &Datei auf"
+
+msgid "&Done, skip remaining changes and files"
+msgstr "&Fertig, überspringe die restlichen Änderungen und Dateien"
+
+msgid "Record &all changes to all remaining files"
+msgstr "Zeichne &alle Änderungen der verbleibenden Dateien auf"
+
+msgid "&Quit, recording no changes"
+msgstr "&Beende, zeichnet keine Änderungen auf"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "cannot edit patch for whole file"
+msgstr "Patch für ganze Datei kann nicht bearbeitet werden"
+
+msgid "cannot edit patch for binary file"
+msgstr "Patch für eine Binär-Datei kann nicht bearbeitet werden"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+
+msgid "edit failed"
+msgstr "Bearbeiten fehlgeschlagen"
+
+msgid "user quit"
+msgstr "Abbruch durch Benutzer"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "Überprüfe Änderungen an %s?"
+
+msgid " and "
+msgstr " und "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "Übernehme die Änderung an %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "Übernehme die Änderung %d/%d an %r?"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [OPTION]... [DATEI]..."
+
+msgid "interactively select changes to commit"
+msgstr "Interaktive Auswahl der Änderungen zur Übernahme ins Archiv"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" Falls keine Liste von Dateien angegeben wird, gelten alle von\n"
+" hg:`status` gemeldeten Änderungen als Kandidaten für 'record'."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Es erfolgt eine Abfrage für jede Datei, ob Änderungen übernommen\n"
+" werden sollen. Bei Dateien mit mehreren Änderungen für jede einzelne\n"
+" Änderung. Folgenden Antworten sind bei jeder Anfrage möglich::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change\n"
+" e - edit this change manually"
+msgstr ""
+" j - Diese Änderung übernehmen\n"
+" n - Diese Änderung überspringen\n"
+" b - Diese Änderung manuell bearbeiten"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - überspringt verbleibende Änderungen dieser Datei\n"
+" f - übernimmt verbleibende Änderungen dieser Datei"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" f - fertig, überspringt verbleibende Änderungen und Dateien\n"
+" a - übernimmt alle Änderungen aller verbleibenden Dateien\n"
+" b - beendet ohne Änderungen zu übernehmen"
+
+msgid " ? - display help"
+msgstr " ? - zeigt Hilfe an"
+
+msgid " This command is not available when committing a merge."
+msgstr ""
+" Dieses Kommando ist nicht verfügbar, wenn Sie einen Zusammenführung\n"
+" übernehmen."
+
+msgid "interactively record a new patch"
+msgstr "Interaktive Aufnahme eines neuen Patches"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+" Siehe auch :hg:`help qnew` und :hg:`help record` für weitere Infos.\n"
+" "
+
+msgid "'mq' extension not loaded"
+msgstr "'mq' Erweiterung nicht geladen"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "Nicht-interaktive Ausführung, nutze stattdessen '%s'"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr ""
+"Eine Zusammenführung kann nicht teilweise übernommen werden (verwende :hg:"
+"`commit`)"
+
+msgid "no changes to record\n"
+msgstr "Keine Änderungen zu übernehmen\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [OPTION]... PATCH [DATEI]..."
+
+msgid "interactively select changes to refresh"
+msgstr "Interaktive Auswahl der Änderungen für refresh"
+
+msgid "recreates hardlinks between repository clones"
+msgstr "stellt Hardlinks zwischen Archivklonen wieder her"
+
+msgid "recreate hardlinks between two repositories"
+msgstr "stellt harte Verknüpfungen zwischen zwei Archiven wieder her"
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+" Wenn Archive lokal geklont werden, werden ihre Datendateien hart\n"
+" verknüpft, sodass sie nur den Platz eines einzelnen Archivs belegen."
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+" Unglücklicherweise brechen spätere Archivänderungen (z.B. Abrufen) die\n"
+" Verknüpfungen aller Dateien, die von neuen Änderungssätzen betroffen\n"
+" sind, selbst wenn beide Archive letzlich dieselben Änderungen enthalten."
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+" In gleicher Weise scheitert \"hg clone\" mit --rev an harten\n"
+" Verknüpfungen und nutzt eine komplette Kopie des Quellarchivs."
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+" Dieses Kommando erlaubt es, diese Verknüpfungen wieder herzustellen\n"
+" und den verlorenen Platz zurückzugewinnen."
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+" Dieses Archiv wird neu verknüpft um den Speicher mit HERKUNFT, welches\n"
+" auf derselben lokalen Platte sein muss, zu teilen. Wenn HERKUNFT nicht\n"
+" angegeben ist, wird der Pfad mit dem Namen \"default-relink\" oder\n"
+" anschließend \"default\" aus dem Abschnitt [paths] verwendet."
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+" Versuchen Sie nicht, während der Aktion Leseoperationen auf diesem\n"
+" Archiv durchzuführen. Schreiben wird von beiden Archive verhindert.\n"
+" "
+
+msgid "hardlinks are not supported on this system"
+msgstr "Harte Verknüpfungen werden von diesem System nicht unterstützt"
+
+msgid "must specify local origin repository"
+msgstr "Lokales Quellarchiv muss angegeben werden"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "Wiederverknüpft: %s nach %s\n"
+
+msgid "there is nothing to relink\n"
+msgstr "Es gibt nichts zum wiederverknüpfen\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr "Die Archivspitze (tip) hat %d Dateien. Geschätzte Gesamtzahl: %s\n"
+
+msgid "collecting"
+msgstr "Sammle"
+
+msgid "files"
+msgstr "Dateien"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr "%d Kandidaten gesammelt\n"
+
+msgid "source and destination are on different devices"
+msgstr "Quelle und Ziel sind auf unterschiedlichen Geräten"
+
+msgid "pruning"
+msgstr "Schränke ein"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr "Schränke auf %d wahrscheinlich wiederverknüpfbare Dateien ein\n"
+
+msgid "relinking"
+msgstr "Verknüpfe erneut"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr "%d Dateien wiederverknüpft (%s zurückgewonnen)\n"
+
+msgid "[ORIGIN]"
+msgstr "[HERKUNFT]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+"Diese Erweiterung erlaubt es, Abkürzungen für übergeordnete URLs\n"
+"anzugeben, deren Verzeichnisse sich nach einem Muster verhalten,\n"
+"beispielsweise::"
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+
+#, fuzzy
+msgid "After that you can use it like::"
+msgstr "Danach kann man es wie folgt benutzen::"
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+"Ein vordefiniertes Schema kann mit einem neuen Schema überschrieben werden,\n"
+"indem der gleiche Name angegeben wird.\n"
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+"Eine gemeinsame Historie zwischen mehreren Arbeitsverzeichnissen teilen"
+
+msgid "create a new shared repository"
+msgstr "Erzeuge ein neues gemeinsames Archiv"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "convert a shared repository to a normal one"
+msgstr "Konvertiert ein gemeinsames Archiv in ein normales"
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+
+msgid "this is not a shared repo"
+msgstr "Dies ist kein gemeinsames Archiv"
+
+msgid "do not create a working copy"
+msgstr "erstelle keine Arbeitskopie"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] QUELLE [ZIEL]"
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "Ãœberspringe bereits angewendete Revision %s\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s ist kein Vorgänger von %s"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr "Filter fehlgeschlagen"
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: leerer Änderungssatz"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr "transplant Logdatei ist beschädigt"
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr "Übernahme der Änderungen schlug fehl"
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr "filtriere beschädigte Änderungssätze (ohne Nutzer oder Datum)"
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+
+#, fuzzy
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "Änderung anwenden? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "Keine solche Option\n"
+
+msgid "pull patches from REPO"
+msgstr "Patches von REPO abrufen"
+
+msgid "pull patches from branch BRANCH"
+msgstr "Patches vom Zweig BRANCH abrufen"
+
+msgid "pull all changesets up to BRANCH"
+msgstr "Alle Änderungssätze bis BRANCH abrufen"
+
+msgid "skip over REV"
+msgstr "REV überspringen"
+
+msgid "merge at REV"
+msgstr "Bei REV zusammenführen"
+
+msgid "parent to choose when transplanting merge"
+msgstr "Auszuwählender Vorgänger wenn eine Änderung transplantiert wird"
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through command"
+msgstr "Filtriere Änderungssätze durch Programm"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REVISION --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" Merge changesets may be transplanted directly by specifying the\n"
+" proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "--continue is incompatible with branch, all or merge"
+msgstr "--continue ist inkompatibel mit branch, all oder merge"
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr "--all benötigt eine Zweig-Version"
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+"win32text ist veraltet: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr "Präfix des Archivs enthält nicht zulässige Komponenten"
+
+msgid "archiving"
+msgstr "Archiviere"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr ""
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "Lesezeichen '%s' enthält illegale Zeichen"
+
+#, python-format
+msgid "branch %s not found"
+msgstr "Zweig '%s' nicht gefunden"
+
+#, python-format
+msgid "divergent bookmark %s stored as %s\n"
+msgstr "Divergierendes Lesezeichen %s als %s gespeichert\n"
+
+#, python-format
+msgid "adding remote bookmark %s\n"
+msgstr "Hinzufügen des entfernten Lesezeichens %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "Suche nach geänderten Lesezeichen\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "Keine geänderten Lesezeichen gefunden\n"
+
+msgid "unknown parent"
+msgstr "Unbekannte Vorgängerversion"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "Integritätsprüfung fehlgeschlagen bei %s:%d"
+
+msgid "cannot create new bundle repository"
+msgstr "Neues Bündelarchiv kann nicht erzeugt werden"
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "vorzeitiges Ende des Stroms (%d Byte erhalten, %d erwartet)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "Ungültige Abschnitsslänge %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: keine Mercurial-Bündeldatei"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: unbekannte Bündelversion %s"
+
+msgid "empty username"
+msgstr "Leerere Benutzername"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "Benutzername %s enthält einen Zeilenumbruch"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "der name '%s' ist reserviert"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "Unversionierte Änderungen in Unterarchiv %s"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "Optionen --message und --logfile schließen sich gegenseitig aus"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "Kann Versionsmeldung '%s' nicht lesen: %s"
+
+msgid "limit must be a positive integer"
+msgstr "Log-Grenzwert `limit` muss eine positive Ganzzahl sein"
+
+msgid "limit must be positive"
+msgstr "Log-Grenzwert `limit` muss positiv sein"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "Ungültiges Format '%%%s' für den Namen der Ausgabedatei"
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "--changelog und --manifest können nicht gleichzeitig angegeben werden"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr ""
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr "ungültige Parameter"
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' nicht gefunden"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s kann nicht kopiert werden - steht nicht unter Versionskontrolle\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: wird nicht kopiert - ist bereits als zu entfernen markiert\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: kann nicht kopiert werden - %s wird von %s blockiert\n"
+
+#, python-format
+msgid "%s: can't copy - same file\n"
+msgstr "%s: kann nicht kopiert werden - selbe Datei\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: kann nicht kopiert werden - Datei existiert bereits\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: Verschiebung nicht aufgezeichnet - %s existiert nicht\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: Kopieren nicht aufgezeichnet - %s existiert nicht\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: kann nicht kopiert werden - Arbeitskopie ist gelöscht\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: kann nicht kopiert werden - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "Verschiebe %s nach %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "Kopiere %s nach %s\n"
+
+msgid "no source or destination specified"
+msgstr "Weder Quelle noch Ziel angegeben"
+
+msgid "no destination specified"
+msgstr "Kein Ziel angegeben"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr "Bei mehreren Quelldateien muss das Ziel ein Verzeichnis sein"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "Ziel %s ist kein Verzeichnis"
+
+msgid "(consider using --after)\n"
+msgstr "(erwäge die Option --after)\n"
+
+msgid "child process failed to start"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "Änderung: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "Zweig: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "Lesezeichen: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "Marke: %s\n"
+
+#, python-format
+msgid "phase: %s\n"
+msgstr "Phase: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "Vorgänger: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "Manifest: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "Nutzer: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "Datum: %s\n"
+
+msgid "files+:"
+msgstr "Dateien+:"
+
+msgid "files-:"
+msgstr "Dateien-:"
+
+msgid "files:"
+msgstr "Dateien:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "Dateien: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "Kopien: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "Extra: %s=%s\n"
+
+msgid "description:\n"
+msgstr "Beschreibung:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "Zusammenfassung: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr "%s: kein Schlüsselwort '%s'"
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr "Gefundene Revision %s vom %s\n"
+
+msgid "revision matching date not found"
+msgstr "Keine zum Datum passende Revision gefunden"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "Füge %s hinzu\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "Ãœberspringe fehlendes Unterarchiv: %s\n"
+
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "Berichtigt Änderungssatz %s\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "Kopiert Änderungssatz %s nach %s\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "Entfernt intermediären Änderungssatz %s\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "Entfernt berichtigten Änderungssatz %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+"HG: Bitte gib eine Versions-Meldung ein. Zeilen beginnend mit 'HG:' werden"
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: entfernt. Leere Versionsmeldung wird das Ãœbernehmen abbrechen."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: Benutzer: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: Zweigzusammenführung"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: Zweig '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: Unterarchiv %s"
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: Hinzugefügt %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: Geändert %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: Entfernt %s"
+
+msgid "HG: no files changed"
+msgstr "HG: Keine Dateiänderungen"
+
+msgid "empty commit message"
+msgstr "Leere Versions-Meldung"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "vergesse: %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "setze zurück: %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "stelle wieder her: %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "Datei nicht unter Versionskontrolle: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "keine Änderungen notwendig für %s\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr "Wurzelverzeichnis des Archivs oder Name einer Bündeldatei"
+
+msgid "DIR"
+msgstr ""
+
+msgid "change working directory"
+msgstr "Wechselt das Arbeitsverzeichnis"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr ""
+"Nicht nachfragen, automatisch die erste Auswahlmöglichkeit für alle Fragen "
+"wählen"
+
+msgid "suppress output"
+msgstr "Unterdrückt Ausgabe"
+
+msgid "enable additional output"
+msgstr "Ausgabe weiterer Informationen"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr ""
+"Setze/Ãœberschreibe Konfigurationsoption: %s (nutze --config Abschnitt."
+"Name=Wert)"
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr "Aktiviert Debugausgaben"
+
+msgid "start debugger"
+msgstr "Startet den Debugger"
+
+msgid "set the charset encoding"
+msgstr "Setzt die Zeichenkodierung"
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr "Setzt den Modus der Zeichenkodierung"
+
+msgid "always print a traceback on exception"
+msgstr "Gibt die Aufrufhierarchie einer Ausnahmebedingung aus"
+
+msgid "time how long the command takes"
+msgstr "Gibt die Dauer des Befehls aus"
+
+msgid "print command execution profile"
+msgstr "Gibt das Ausführungsprofil des Befehls aus"
+
+msgid "output version information and exit"
+msgstr "Gibt Versionsinformation aus und beendet sich"
+
+msgid "display help and exit"
+msgstr "Gibt Hilfe aus und beendet sich"
+
+msgid "do not perform actions, just print output"
+msgstr "Führt die Aktionen nicht aus, sondern zeigt nur die Ausgabe"
+
+msgid "specify ssh command to use"
+msgstr "Spezifiziert den zu nutzenden SSH-Befehl"
+
+msgid "specify hg command to run on the remote side"
+msgstr "Spezifiziert den hg-Befehl, der entfernt ausgeführt wird"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+"Server-Zertifikat nicht überprüfen (web.cacerts-Konfiguration ignorieren)"
+
+msgid "PATTERN"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr "Namen hinzufügen, die auf das angegebene Muster passen"
+
+msgid "exclude names matching the given patterns"
+msgstr "Namen ausschließen, die auf das angegebene Muster passen"
+
+msgid "use text as commit message"
+msgstr "Nutzt Text als Commit-Nachricht"
+
+msgid "read commit message from file"
+msgstr "Liest Commit-Nachricht aus Datei"
+
+msgid "record the specified date as commit date"
+msgstr "Protokolliert das angegebenen Datum als Ãœbernahmedatum"
+
+msgid "record the specified user as committer"
+msgstr "Protokolliert den angegebenen Nutzer als Autor"
+
+msgid "STYLE"
+msgstr ""
+
+msgid "display using template map file"
+msgstr "Anzeige unter Nutzung der Vorlagenzuordnungsdatei"
+
+msgid "display with template"
+msgstr "Anzeige mit Vorlage"
+
+msgid "show patch"
+msgstr "Patch anzeigen"
+
+msgid "do not show merges"
+msgstr "Zeigt keine Merges"
+
+msgid "output diffstat-style summary of changes"
+msgstr "Zusammenfassung der Änderungen im diffstat-Stil"
+
+msgid "treat all files as text"
+msgstr "Behandelt alle Dateien als Text"
+
+msgid "omit dates from diff headers"
+msgstr "Fügt Datum nicht im Kopf des Diffs ein"
+
+msgid "show which function each change is in"
+msgstr "Zeigt die Funktion, in der die Änderung passiert ist"
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "number of lines of context to show"
+msgstr "Anzahl der anzuzeigenden Kontextzeilen"
+
+msgid "SIMILARITY"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "rät Umbenennungn anhand der Ähnlichkeit (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "Durchläuft rekursiv Unterarchive"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[OPTION]... [DATEI]..."
+
+msgid "add the specified files on the next commit"
+msgstr "Fügt die angegebenen Dateien der nächsten Version hinzu"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr " Merkt Dateien zur Versionskontrolle im Projektarchiv vor."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Die Dateien werden dem Projektarchiv beim nächsten Übernehmen (commit)\n"
+" hinzugefügt. Um dies vorher rückgängig zu machen, siehe:hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr ""
+" Wenn keine Namen angegeben sind, füge alle Dateien dem Projektarchiv\n"
+" hinzu.\n"
+" "
+
+msgid " .. container:: verbose"
+msgstr ""
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Gibt 0 zurück, wenn alle Dateien erfolgreich hinzugefügt wurden.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "Fügt alle neuen Dateien hinzu, löscht alle fehlenden Dateien"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" Füge alle neuen Dateien hinzu und lösche alle fehlenden Dateien aus\n"
+" dem Projektarchiv."
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" Neue Dateien werden ignoriert, wenn sie einem der Muster aus ``."
+"hgignore``\n"
+" entsprechen. Genau wie add, wirken diese Änderungen erst beim nächsten\n"
+" Ãœbernehmen (commit)."
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed.\n"
+" If this option is not specified, only renames of identical files\n"
+" are detected."
+msgstr ""
+" Nutze die Option -s/--similarity, um umbenannte Dateien zu entdecken.\n"
+" Mit einem Parameter größer 0 wird jede gelöschte Datei mit jeder\n"
+" hinzugefügten verglichen und bei genügender Ähnlichkeit als Umbenennung\n"
+" markiert. Diese Option erwartet eine Prozentangabe zwischen 0\n"
+" (deaktiviert) und 100 (Dateien müssen identisch sein) als Parameter.\n"
+" Umbenennungen auf diese Weise zu erkennen, kann aufwändig sein.\n"
+" Nachdem Benutzung dieser Option kann :hg:`status -C` verwendet\n"
+" werden, um zu überprüfen, welche Dateien als verschoben oder\n"
+" umbenannt erkannt wurden. Wenn diese Option nicht angegeben\n"
+" ist, werden nur Umbenennungen identischer Dateien erkannt."
+
+msgid "similarity must be a number"
+msgstr "similarity muss eine Zahl sein"
+
+msgid "similarity must be between 0 and 100"
+msgstr "similarity muss zwischen 0 und 100 liegen"
+
+msgid "annotate the specified revision"
+msgstr "Annotiert die angegebene Revision"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "Folge Kopien/Umbenennungen und liste Dateinamen auf (VERALTET)"
+
+msgid "don't follow copies and renames"
+msgstr "Unterläßt das Folgen von Dateikopien und Umbenennungen"
+
+msgid "list the author (long with -v)"
+msgstr "Listet den Autor auf (lang mit -v)"
+
+msgid "list the filename"
+msgstr "Listet den Dateinamen auf"
+
+msgid "list the date (short with -q)"
+msgstr "Listet das Datum auf (kurz mit -q)"
+
+msgid "list the revision number (default)"
+msgstr "Listet die Revisionsnummer auf (Voreinstellung)"
+
+msgid "list the changeset"
+msgstr "Listet den Änderungssatz auf"
+
+msgid "show line number at the first appearance"
+msgstr "Zeigt die Zeilennummer beim ersten Auftreten "
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] DATEI..."
+
+msgid "show changeset information by line for each file"
+msgstr "Zeigt Informationen über Änderungssätze pro Dateizeile an"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+" Listet Änderungen in Dateien mit der zugehörigen Revisions-Id für jede\n"
+" Zeile auf"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+" Dieser Befehl ist nützlich, um herauszufinden wer eine Änderung gemacht\n"
+" hat oder wann eine Änderung stattgefunden hat."
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" Ohne den Schalter -a/--text wird die Verarbeitung von Binärdateien\n"
+" vermieden. Mit -a werden auch solche Dateien verarbeitet, "
+"wahrscheinlich\n"
+" mit unerwünschtem Ergebnis."
+
+msgid "at least one filename or pattern is required"
+msgstr "Mindestens ein Dateiname oder Muster benötigt"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr "Zumindest -n oder -c werden für -l benötigt"
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: Binärdatei\n"
+
+msgid "do not pass files through decoders"
+msgstr "Dateien nicht dekodieren"
+
+msgid "directory prefix for files in archive"
+msgstr "Verzeichnispräfix für Dateien im Archiv"
+
+msgid "PREFIX"
+msgstr ""
+
+msgid "revision to distribute"
+msgstr "zu verteilende Revision"
+
+msgid "type of distribution to create"
+msgstr "zu erstellender Distributionstyp"
+
+msgid "[OPTION]... DEST"
+msgstr "[OPTION]... ZIEL"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "Erzeugt ein unversioniertes Archiv einer Projektarchiv-Revision"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" Standardmäßig wird die Vorgängerversion der im Arbeitsverzeichnis "
+"gefundenen\n"
+" verwendet. Eine andere Reversion kann mit \"-r/--rev\" angegeben werden."
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+
+msgid " Examples:"
+msgstr " Beispiele:"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr ""
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr ""
+
+msgid " - create a tarball excluding .hg files::"
+msgstr ""
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr ""
+
+msgid " Valid types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+" :``files``: (Voreinstellung): ein Verzeichnis voller Dateien\n"
+" :``tar``: tar Archiv, unkomprimiert\n"
+" :``tbz2``: tar Archiv, komprimiert mit bzip2\n"
+" :``tgz``: tar Archiv, komprimiert mit gzip\n"
+" :``uzip``: zip Archiv, unkomprimiert\n"
+" :``zip``: zip Archiv, komprimiert mit deflate"
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+" Der exakte Name des Zielarchivs oder -verzeichnises wird mit\n"
+" einem Format-String angegeben; siehe :hg:`help export` für Details."
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+" Jedem Element des Archivs wird ein Verzeichnis-Präfix vorangestellt.\n"
+" Nutze -p/--prefix um eine Format-String für das Präfix anzugeben.\n"
+" Als Voreinstellung wird der Dateiname des Archive ohne Dateiendung\n"
+" genutzt."
+
+msgid "no working directory: please specify a revision"
+msgstr "Kein Arbeitsverzeichnis: Bitte gib eine Revision an"
+
+msgid "repository root cannot be destination"
+msgstr "Projektarchiv-Wurzel kann nicht als Ziel angegeben werden"
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+"Ungepacktes Archiv kann nicht auf der Standardausgabe ausgegeben werden"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "Führt mit Vorgänger im Status vor Rücknahme zusammen"
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "Wählt einen Vorgänger bei Rücknahme einer Zusammenführung (VERALTET)"
+
+msgid "revision to backout"
+msgstr "Die zurückzunehmende Revision"
+
+msgid "[OPTION]... [-r] REV"
+msgstr ""
+
+msgid "reverse effect of earlier changeset"
+msgstr "Macht einen vorangegangen Änderungssatz rückgängig"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" Erstelle eine (unversionierte) Änderung im Arbeitsverzeichnis, die den\n"
+" Effekt von REV zurücknimmt."
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr "Bitte nur eine Revision angeben"
+
+msgid "please specify a revision to backout"
+msgstr "Bitte eine Revision, die zurückgezogen werden soll, angeben"
+
+msgid "cannot backout change on a different branch"
+msgstr "Kann die Änderung auf einem abweichenden Zweig nicht rückgängig machen"
+
+msgid "cannot backout a change with no parents"
+msgstr "Kann eine Änderung ohne Vorgängerversion nicht rückgängig machen"
+
+msgid "cannot backout a merge changeset"
+msgstr "Kann eine Zusammenführungen nicht rückgängig machen"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr "Kann mit --parent nur Zusammenführung rückgängig machen"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "Änderungssatz %s macht Änderungssatz %s rückgängig\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "Führe mit Änderungssatz %s zusammen\n"
+
+msgid "reset bisect state"
+msgstr "Setzt Status der Suche zurück"
+
+msgid "mark changeset good"
+msgstr "Markiert Änderungssatz als fehlerfrei"
+
+msgid "mark changeset bad"
+msgstr "Markiert Änderungssatz als fehlerbehaftet"
+
+msgid "skip testing changeset"
+msgstr "Überspringt das Testen dieses Änderungssatzes"
+
+msgid "extend the bisect range"
+msgstr "Erweitert den Bereich der Suche"
+
+msgid "use command to check changeset state"
+msgstr "Nutzt eine Programm um den Fehlerstatus zu bestimmen"
+
+msgid "do not update to target"
+msgstr "Führe keine Aktualisierung der Dateien durch"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c BEFEHL] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr "Binäre Suche von Änderungssätzen"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" Dieser Befehl hilft Änderungssätze zu finden, die Probleme eingeführt\n"
+" haben. Dies geschieht, indem eine Revision nach der anderen geladen und\n"
+" getestet wird, bis zwei aufeinanderfolgende Revisionen ohne und mit\n"
+" Fehler gefunden wurden."
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Markiere zunächst die früheste Version, von der bekannt ist, dass der\n"
+" Fehler dort auftritt und die entsprechende letzte fehlerfreie Version.\n"
+" Bisect wird das Arbeitsverzeichnis dann auf eine zu testede Revision\n"
+" bringen (es sei denn, die Option -U/--noupdate ist angegeben). Nachdem\n"
+" der Test ausgeführt wurde, muss diese Revision als gut oder schlecht\n"
+" markiert werden. Bisect wird dann zur nächsten Revision wechseln oder\n"
+" das Ziel (die erste schlechte Revision) melden."
+
+#, fuzzy
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" The environment variable HG_NODE will contain the ID of the\n"
+" changeset being tested. The exit status of the command will be\n"
+" used to mark revisions as good or bad: status 0 means good, 125\n"
+" means to skip the revision, 127 (command not found) will abort the\n"
+" bisection, and any other non-zero exit status means the revision\n"
+" is bad."
+msgstr ""
+" Wenn ein Kommando angegen wurde, wird es für eine automatische\n"
+" Bisektion verwendet. Die Umgebungsvariable HG_NODE wird die ID\n"
+" des gerade getesteten Änderungssatz enthalten. Der Exit-Status des\n"
+" Kommandos wird verwendet, um Revisionen als gut oder schlecht zu\n"
+" markieren: 0 bedeutet gut, 125 bedeutet überspringen, 127\n"
+" (Kommando nicht gefunden) bedeutet Abbruch der Bisektion und\n"
+" jeder andere von Null verschiedene Exit-Status bedeutet, dass die\n"
+" Revision schlecht ist."
+
+msgid " Some examples:"
+msgstr " Einige Beispiele:"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+
+msgid ""
+" - advance the current bisection by marking current revision as good "
+"or\n"
+" bad::"
+msgstr ""
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+
+msgid " - forget the current bisection::"
+msgstr ""
+
+msgid " hg bisect --reset"
+msgstr ""
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr ""
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr ""
+
+msgid ""
+" - see the changeset currently being bisected (especially useful\n"
+" if running with -U/--noupdate)::"
+msgstr ""
+
+msgid " hg log -r \"bisect(current)\""
+msgstr " hg log -r \"bisect(current)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr ""
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr ""
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr ""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr ""
+" Siehe :hg:`help revsets' für mehr Infos über den bisect() Schlüssel."
+
+msgid "The first good revision is:\n"
+msgstr "Die erste fehlerfreie Revision ist:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "Die erste fehlerhafte Revision ist:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"Aufgrund übersprungener Revisionen könnte die erste fehlerfreie Revision\n"
+"eine der folgenden sein:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"Aufgrund übersprungener Revisionen könnte die erste fehlerhafte Revision\n"
+"eine der folgenden sein:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "Kann Suche nicht starten (keine bekannte fehlerfreie Revision)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "Kann Suche nicht starten (keine bekannte fehlerhafte Revision)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(Die Syntax 'hg bisect <cmd>' ist veraltet)\n"
+
+msgid "incompatible arguments"
+msgstr "Inkompatible Argumente"
+
+msgid "current bisect revision is unknown - start a new bisect to fix"
+msgstr ""
+
+msgid "current bisect revision is a merge"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "Fehler bei der Ausführung von %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s gestorben"
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "Änderungssatz %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "Erweitere Suchbereich auf Änderungssatz %d:%s\n"
+
+msgid "nothing to extend"
+msgstr "Keine Erweiterung des Bereichs nötig"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "Teste Änderungssatz %d:%s (%d Änderungssätze verbleiben, ~%d Tests)\n"
+
+msgid "force"
+msgstr "erzwinge"
+
+msgid "delete a given bookmark"
+msgstr "Löscht ein gegebenes Lesezeichen"
+
+msgid "rename a given bookmark"
+msgstr "Benennt ein gegebenes Lesezeichen um"
+
+msgid "mark a bookmark inactive"
+msgstr "Ein Lesezeichen als inaktiv markieren"
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+
+msgid "track a line of development with movable markers"
+msgstr "Folgt einem Entwicklungsstrang mit einer beweglichen Markierung"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when committing.\n"
+" Bookmarks are local. They can be renamed, copied and deleted. It is\n"
+" possible to use :hg:`merge NAME` to merge from a given bookmark, and\n"
+" :hg:`update NAME` to update to a given bookmark."
+msgstr ""
+" Lesezeichen sind Zeiger auf bestimmte Versionen, die mitwandern,\n"
+" wenn eine neuen Version erzeugt wird. Lesezeichen sind nur lokal.\n"
+" Sie können umbenannt, kopiert und gelöscht werden. Es ist möglich,\n"
+" Lesezeichen bei :hg: `merge` und :hg:`update` anzugeben, um das an-\n"
+" gegebene Lesezeichen zusammenzuführen, bzw. darauf zu aktualisieren."
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" Man kann :hg:`bookmark NAME` aufrufen, um ein Lesezeichen mit dem\n"
+" angegeben Namen auf der aktuellen Spitze (tip) zu setzen. Bei Angabe\n"
+" einer Revision mit -r REV (REV kann ein vorhandenes Lesezeichen sein) \n"
+" wird das Lesezeichen auf dieser Revision gesetzt.\n"
+" "
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled."
+msgstr ""
+" Lesezeichen können zwischen Mercurial-Archiven ausgetauscht werden\n"
+" (siehe :hg:`help push` bzw. :hg:`help pull`). Beide Archive müssen "
+"dafür\n"
+" Lesezeichen unterstützen. Bis Version 1.8 muss hierfür die\n"
+" Lesezeichenerweiterung (bookmarks extension) eingeschaltet werden."
+
+msgid ""
+" With -i/--inactive, the new bookmark will not be made the active\n"
+" bookmark. If -r/--rev is given, the new bookmark will not be made\n"
+" active even if -i/--inactive is not given. If no NAME is given, the\n"
+" current active bookmark will be marked inactive.\n"
+" "
+msgstr ""
+" Mit -i/--inactive wird das neue Lesezeichen nicht das aktive.\n"
+" Wenn -r/--rev angegeben ist, wird das neue Lesezeichen nicht\n"
+" das aktive, selbst wenn -i/--inactive nicht angegeben ist.\n"
+" Falls kein NAME angegeben ist, wird das gerade aktive\n"
+" Lesezeichen als inaktiv markiert.\n"
+" "
+
+msgid "bookmark name required"
+msgstr "Ein Name für das Lesezeichen muss übergeben werden"
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "Lesezeichen '%s' existiert nicht"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "Lesezeichen '%s' existiert bereits; erzwinge mit -f/--force"
+
+msgid "new bookmark name required"
+msgstr "Ein neuer Name für das Lesezeichen muss übergeben werden"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "Ein Lesezeichenname darf keine Zeilenumbrüche enthalten"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "Ein Lesezeichenname darf nicht ausschließlich aus Leerraum bestehen"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr ""
+"Ein Lesezeichen darf nicht denselben Namen wie ein existierender Zweig haben"
+
+msgid "no bookmarks set\n"
+msgstr "Keine Lesezeichen gesetzt\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "Setzt Branchnamen, selbst wenn es einen bestehenden Branch verdeckt"
+
+msgid "reset branch name to parent branch name"
+msgstr "Setzt Branchnamen zum Namen des Vorgängers zurück"
+
+msgid "[-fC] [NAME]"
+msgstr ""
+
+msgid "set or show the current branch name"
+msgstr "Setzt oder zeigt den Namen des aktuellen Zweigs"
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent and global. Use :hg:`bookmark` to create "
+"a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" Ohne Parameter wird der Name des aktuellen Zweiges angezeigt. Mit einem\n"
+" Parameter wird der Zweigname des Arbeitsverzeichnisses gesetzt. Der\n"
+" Zweig existiert nicht im Projektarchiv und muss erst übernommen werden.\n"
+" Es wird empfohlen den 'default'-Zweig als Hauptentwicklungszweig zu\n"
+" nutzen."
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" Außer bei Angabe von -f/--force lässt 'hg branch' nicht zu, einen Namen\n"
+" zu vergeben, der einen existierenden Zweig überdeckt."
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" Nutze -C/--clean um den neuen Namen rückgängig zu machen. Die "
+"Arbeitskopie\n"
+" hat dann wieder den selben Namen wie der Vorgänger im Projektarchiv."
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" Um auf einen anderen (existierenden) Zweig zu wechseln, nutze\n"
+" :hg:`update`. Mit :hg:`commit --close-branch` wird der aktuelle Zweig\n"
+" geschlossen."
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "Setze Arbeitsverzeichnis auf Zweig %s zurück\n"
+
+msgid "a branch of the same name already exists"
+msgstr "Ein Zweig mit diesem Namen existiert bereits"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "Benutzen Sie 'hg update' um zu ihm zu wechseln"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "Arbeitsverzeichnis wurde als Zweig %s markiert\n"
+
+msgid "(branches are permanent and global, did you want a bookmark?)\n"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr "Zeigt nur Branches deren Köpfe nicht zusammengeführt wurden"
+
+msgid "show normal and closed branches"
+msgstr "Zeigt normale und geschlossene Branches"
+
+msgid "[-ac]"
+msgstr ""
+
+msgid "list repository named branches"
+msgstr "Zeigt alle benannten Zweige des Projektarchiv an"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" Listet die benannten Zweige des Projektarchiv auf und zeigt an, welche\n"
+" inaktiv sind. Zweige, die durch :hg:`commit --close-branch` geschlossen\n"
+" wurden, werden nur mit dem Schalter -c/--closed angezeigt."
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" Mit der Option -a/--active werden nur aktive Zweige ausgegeben. Ein\n"
+" Zweig gilt als aktiv, wenn er echte Köpfe besitzt."
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+" Zum Wechsel auf einen anderen (existierenden) Zweig siehe :hg:`update`."
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+" Gibt 0 zurück.\n"
+" "
+
+msgid " (closed)"
+msgstr " (geschlossen)"
+
+msgid " (inactive)"
+msgstr " (inaktiv)"
+
+msgid "run even when the destination is unrelated"
+msgstr "Auch ausführen, wenn das Ziel keinen Bezug hat"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "Ein Änderungssatz der zum Ziel hinzugefügt werden soll"
+
+msgid "a specific branch you would like to bundle"
+msgstr "Revision die gebündelt werden soll"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "Ein Änderungssatz der im Ziel bereits existiert"
+
+msgid "bundle all changesets in the repository"
+msgstr "Bündelt alle Änderungssätze des Projektarchivs"
+
+msgid "bundle compression type to use"
+msgstr "Kompressionstyp für die Ausgabedatei"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TYP] [-a] [-r REV]... [--base REV]... DATEI [ZIEL]"
+
+msgid "create a changegroup file"
+msgstr "Erzeugt eine Datei mit Änderungsgruppen"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+" Erzeuge eine gepackte Datei der Änderungsgruppen, die alle Änderungs-\n"
+" sätze enthält, die in einem anderen Archiv nicht vorhanden sind."
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+" Falls kein Zielarchiv angegeben ist, wird angenommen, dass das Ziel\n"
+" alle Knoten enthält, die durch einen oder mehrere --base Parameter\n"
+" angegeben wurden. Um ein Bündel aller Änderungssätze zu erzeugen, nutze\n"
+" -a/--all (oder --base null)."
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+" Die angewendete Kompressionsmethode kann mit der Option -t/--type\n"
+" gewählt werden: none (nicht komprimieren), bzip2 (Voreinstellung)\n"
+" oder gzip."
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+" Die Bündeldatei kann mit üblichen Mitteln transportiert und auf ein "
+"anderes\n"
+" Archiv mit dem 'unbundle' oder 'pull'-Befehl angewandt werden.\n"
+" Dies ist nützlich wenn ein direktes Schieben oder Herunterladen von\n"
+" Änderungen nicht verfügbar ist oder der Export eines kompletten Archivs\n"
+" unerwünscht ist."
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+" Die Anwendung von Bündeln bewahrt die Inhalte aller Änderungssätze,\n"
+" Berechtigungen, Kopier/Umbennungs-Informationen und die "
+"Revisionshistorie."
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn keine Änderungen gefunden wurden.\n"
+" "
+
+msgid "unknown bundle type specified with --type"
+msgstr "Unbekannter Bündeltyp mit --type angegeben"
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "Bei Nutzung von --base kann kein Zielarchiv angegeben werden"
+
+msgid "print output to file with formatted name"
+msgstr "Schreibt Ausgabe in Datei mit formatiertem Namen"
+
+msgid "print the given revision"
+msgstr "Gibt die gegebene Revision aus"
+
+msgid "apply any matching decode filter"
+msgstr "Führt alle passenden Dekodier-Filter aus"
+
+msgid "[OPTION]... FILE..."
+msgstr "[OPTION]... DATEI..."
+
+msgid "output the current or given revision of files"
+msgstr ""
+"Gibt den Inhalt von Dateien in der aktuellen oder angegebenen Revision aus"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Gibt die angegebenen Dateien aus, wie sie zur gegebenen Revision waren.\n"
+" Wenn keine Revision angegeben wird, wird die Vorgängerversion des\n"
+" Arbeitsverzeichnisses genutzt, oder die Spitze, falls keine\n"
+" Revision geladen ist."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" Die Ausgabe kann in eine Datei erfolgen. In diesem Fall wird der Name\n"
+" der Datei mit einem Formatstring vorgegeben. Die Formatierungsregeln "
+"sind\n"
+" dem 'export'-Befehl analog, mit folgenden Ergänzungen::"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: Dateiname der ausgegebenen Datei\n"
+" :``%d``: Verzeichnisname der Datei oder '.' in der Wurzel des Archivs\n"
+" :``%p``: Pfad und Dateiname relativ zur Archiv-Wurzel\n"
+" "
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "Der Klon wird nur das Projektarchiv enthalten (keine Arbeitskopie)"
+
+msgid "revision, tag or branch to check out"
+msgstr "Revision, Etikett oder Zweig auf den aktualisiert werden soll"
+
+msgid "include the specified changeset"
+msgstr "Beziehe gegebenen Änderungssatz ein"
+
+msgid "clone only the specified branch"
+msgstr "Klone nur den gegebenen Zweig"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[OPTION]... QUELLE [ZIEL]"
+
+msgid "make a copy of an existing repository"
+msgstr "Erzeugt eine Kopie eines bestehenden Projektarchivs"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Kopiert ein bestehendes Projektarchiv in ein neues Verzeichnis."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" Wird kein Zielverzeichnis angegeben, wird der Basisname der Quelle "
+"genutzt."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" Die Adresse der Quelle wird der ``.hg/hgrc`` Datei des neuen Archivs\n"
+" als Voreinstellung für entfernte Aktionen (pull/push) hinzugefügt."
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+" Nur lokale Pfade und ``ssh://``-URLs werden als Ziele unterstützt.\n"
+" Für ``ssh://``-Ziele wird kein Arbeitsverzeichnis und keine\n"
+" ``.hg/hgrc``-Datei auf der entfernten Seite erstellt."
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+" Um nur eine Untermenge von Änderungssätzen abzurufen, können eine\n"
+" oder mehrere Revisions-IDs mit -r/--rev oder Zweige mit\n"
+" -b/--branch angegeben werden. Der entstehende Klon wird nur die \n"
+" angegebenen Änderungssätze und ihre Nachfolger enthalten. Diese\n"
+" Optionen (oder 'clone src#rev dest') implizieren '--pull', sogar\n"
+" für lokale Archive als Quelle. Bei Angabe eines Etiketts (tag)\n"
+" ist zwar der benannte Änderungssatz enthalten, nicht aber der\n"
+" Änderungssatz, der das Etikett enthält."
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+" Um eine bestimmte Version abzurufen, verwenden Sie\n"
+" -u/--update, oder -U/--noupdate um einen Klon ohne\n"
+" Arbeitsverzeichnis zu erstellen."
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" Aus Effizienzgründen werden 'hardlinks' für das Klonen genutzt, wann\n"
+" immer Quelle und Ziel auf dem selben Dateisystem liegen (dies gilt "
+"nur\n"
+" für die Daten des Archivs, nicht für die Arbeitskopie). Einige\n"
+" Dateisyteme, wie etwa AFS, implementieren 'hardlinks' fehlerhaft,\n"
+" erzeugen dabei aber keine Fehlermeldung. Dann muss die --pull Option\n"
+" genutzt werden, um das Erzeugen von 'hardlinks' zu vermeiden."
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" In einigen Fällen können Archiv und Arbeitskopie unter Nutzung\n"
+" von 'hardlinks' kopiert werden mit ::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al REPO REPOCLONE"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" Dies ist der schnellste Weg zu klonen, aber nicht immer sicher.\n"
+" Diese Operation ist nicht atomar (das Archiv darf während der "
+"Operation\n"
+" nicht modifiziert wird) und es muss sichergestellt werden, dass der\n"
+" genutzte Editor 'hardlinks' auflöst (vim, emacs und die meisten Linux\n"
+" Kernel Tools tun dies). Außerdem ist dies inkompatibel mit einigen\n"
+" Erweiterungen, die Metadaten unter dem .hg Verzeichnis ablegen, z.B. "
+"mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial wird das Arbeitsverzeichnis auf die erste anwendbare\n"
+" Revision der folgenden Liste aktualisieren:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) null , bei -U oder wenn das Quellarchiv keine Änderungssätze hat\n"
+" b) Bei -u . und wenn es sich um ein lokales Archiv handelt, den "
+"ersten\n"
+" Vorgänger der Arbeitskopie des Quellarchivs\n"
+" c) Den Änderungssatz, der mit -u angegeben wurde (falls dies der Name\n"
+" eines Zweiges ist, bedeutet das der neueste Kopf dieses Zweiges)\n"
+" d) Den Änderungssatz, der mit -r angegeben wurde\n"
+" e) Den Kopf, der sich am nächsten an der Spitze befindet und mit -b\n"
+" angegeben wurde\n"
+" f) Den Kopf, der sich am nächsten an der Spitze befindet und mit\n"
+" der 'url#branch source'-Syntax angegeben wurde\n"
+" g) Den Kopf aus dem 'default'-Zweig, der sich am nächsten an der\n"
+" Spitze befindet h) Die Spitze"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr ""
+" - Klont ein entferntes Projektarchiv in ein neues Verzeichnis hg/::"
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr " - Einen leichten lokalen Klon erzeugen::"
+
+msgid " hg clone project/ project-feature/"
+msgstr " hg clone project/ project-feature/"
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+" - Von einem absoluten Pfad auf einem SSH-Server klonen (Beachten Sie "
+"den Doppelschrägstrich)::"
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr " hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr ""
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr " hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr ""
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr " hg clone -r 04e544 experimental/ good/"
+
+msgid " - clone (and track) a particular named branch::"
+msgstr ""
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr ""
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " Siehe auch :hg:`help urls` für das Format von Adressangaben."
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr ""
+"Es können nicht gleichzeitig --noupdate und --updaterev angegeben werden"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr "Markiert neue/fehlende Dateien als hinzugefügt/entfernt"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr ""
+"Markiert einen Branch als geschlossen und blendet ihn in der Branchlist aus"
+
+#, fuzzy
+msgid "amend the parent of the working dir"
+msgstr "Berichtige die Vorgängerversion des Arbeitsverzeichnisses"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr ""
+"Übernimmt Änderungen der angegebenen Dateien oder alle ausstehenden "
+"Änderungen ins Archiv"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Übernimmt Änderungen der angegebenen Dateien ins Archiv. Anders als\n"
+" bei zentralen Versionsverwaltungssystem ist dies eine lokale Operation.\n"
+" Vergleiche :hg:`push` für Wege zur aktiven Verteilung der Änderungen."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Sollten keine Dateien übergeben werden, werden alle von :hg:`status`\n"
+" angezeigten Änderungen Bestandteil der neuen Revision."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Wenn das Ergebnis einer Zusammenführung übernommen werden soll, dürfen\n"
+" keine Dateinamen oder -I/-X Filter angegeben werden."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" Falls keine Ãœbernahmenachricht angegeben wurde, startet\n"
+" Mercurial Ihren konfigurierten Editor, wo Sie eine\n"
+" Nachricht eingeben können. Falls die Übernahme scheitert,\n"
+" wird eine Kopie Ihrer Nachricht in ``.hg/last-message.txt``\n"
+" abgelegt."
+
+msgid ""
+" The --amend flag can be used to amend the parent of the\n"
+" working directory with a new commit that contains the changes\n"
+" in the parent in addition to those currently reported by :hg:`status`,\n"
+" if there are any. The old commit is stored in a backup bundle in\n"
+" ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+" on how to restore it)."
+msgstr ""
+
+msgid ""
+" Message, user and date are taken from the amended commit unless\n"
+" specified. When a message isn't specified on the command line,\n"
+" the editor will open with the message of the amended commit."
+msgstr ""
+
+msgid ""
+" It is not possible to amend public changesets (see :hg:`help phases`)\n"
+" or changesets that have children."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, wenn nichts geändert wurde.\n"
+" "
+
+msgid "can only close branch heads"
+msgstr "Kann nur eindeutige Kopfrevisionen von Zweigen schliessen"
+
+msgid "cannot amend recursively"
+msgstr "Es kann nicht rekursiv berichtigt werden"
+
+msgid "cannot amend public changesets"
+msgstr "Öffentliche Änderungssätze können nicht berichtigt werden"
+
+msgid "cannot amend merge changesets"
+msgstr "Zusammenführungen können nicht berichtigt werden"
+
+msgid "cannot amend while merging"
+msgstr "Beim Zusammenführen kann nicht berichtigt werden"
+
+msgid "cannot amend changeset with children"
+msgstr "Kann keine Änderungssätze mit Nachfolgern berichtigen"
+
+msgid "nothing changed\n"
+msgstr "Keine Änderung\n"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr ""
+
+msgid "created new head\n"
+msgstr "neuer Kopf erzeugt\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "Zweig %d wird wieder geöffnet\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "Änderungssatz %d erzeugt:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr "Identifiziert eine Kopie, die bereits stattgefunden hat"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "Erzwingt ein Ãœberschreiben des Kopierziels"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[OPTION]... [QUELLE]... ZIEL"
+
+msgid "mark files as copied for the next commit"
+msgstr "Markiert Dateien als Kopien bereits versionierter Dateien"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+" Markiert das Ziel als Kopie der Quelle, so dass es die Versionshistorie "
+"der\n"
+" Quelle bis zu diesem Zeitpunkt teilt. Wenn mehrere Quellen angegeben "
+"sind,\n"
+" muss das Ziel ein Verzeichnis sein."
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+" Normalerweise kopiert dieser Befehl auch den Inhalt der Datei(en) wie "
+"sie\n"
+" im Arbeitsverzeichnis vorliegt. Existiert das Ziel jedoch schon, so "
+"kann\n"
+" dieses durch Angabe der Option -A/--after als Kopie nachträglich "
+"markiert\n"
+" werden."
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Die neue Datei wird wie üblich nicht sofort übernommen, sondern "
+"existiert\n"
+" als lokale Änderung im Arbeitsverzeichnis. Sie kann durch :hg:`revert`\n"
+" rückgängig gemacht werden."
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn Fehler gefunden wurden.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "Finde die Vorgängerversion zweier Revisionen im angegebenen Index"
+
+msgid "either two or three arguments required"
+msgstr "Entweder zwei oder drei Parameter angeben"
+
+msgid "add single file mergeable changes"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[OPTION]... [TEXT]"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr ""
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+
+msgid " Elements:"
+msgstr " Elemente:"
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+
+msgid "reading DAG from stdin\n"
+msgstr "Lese DAG von der Standardeingabe\n"
+
+msgid "repository is not empty"
+msgstr "Projektarchiv nicht leer"
+
+msgid "building"
+msgstr "Erstelle"
+
+msgid "show all details"
+msgstr "Zeigt alle Details"
+
+msgid "lists the contents of a bundle"
+msgstr "Listet den Inhalt eines Bündels"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "Prüft die Richtigkeit der bisher vorgemerkten Änderungen"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s ist in Status %s, aber nicht in Manifest 1\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s ist in Status %s, aber auch in Manifest 1\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s ist in Status %s, aber in keinem Manifest\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr "%s im Manifest 1, aber aufgeführt im Status %s"
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ".hg/dirstate inkonsistent mit dem Manifest des aktuellen Vorgängers"
+
+msgid "[COMMAND]"
+msgstr "[BEFEHL]"
+
+msgid "list all available commands and options"
+msgstr "Zeigt alle verfügbaren Befehl und Optionen"
+
+msgid "show the command options"
+msgstr "Zeigt alle Optionen des Befehls"
+
+msgid "[-o] CMD"
+msgstr "[-o] BEFEHL"
+
+msgid "returns the completion list associated with the given command"
+msgstr "Listet mögliche Befehle zu gegebener Abkürzung auf"
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr ""
+
+msgid "use dots for runs"
+msgstr ""
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[OPTION]... [DATEI [REV]]..."
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "open changelog"
+msgstr "Öffne Changelog"
+
+msgid "open manifest"
+msgstr "Öffne Manifest"
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|DATEI REV"
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr "versuche erweiterte Datumsformate"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATUM [BEREICH]"
+
+msgid "parse and display a date"
+msgstr "Liest ein Datum ein und gibt es wieder aus"
+
+msgid "use old-style discovery"
+msgstr ""
+
+msgid "use old-style discovery with non-heads included"
+msgstr ""
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr ""
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr ""
+
+msgid "parse and apply a fileset specification"
+msgstr ""
+
+msgid "[PATH]"
+msgstr "[PFAD]"
+
+msgid "show information detected about current filesystem"
+msgstr ""
+
+msgid "id of head node"
+msgstr ""
+
+msgid "id of common node"
+msgstr ""
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr ""
+
+msgid "retrieves a bundle from a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+
+msgid "display the combined ignore pattern"
+msgstr ""
+
+msgid "no ignore patterns found"
+msgstr ""
+
+msgid "revlog format"
+msgstr ""
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+#, python-format
+msgid "unknown format %d"
+msgstr "Unbekanntes Format %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr "Testet die Mercurial-Installation"
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr "Prüfe Kodierung (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (Stelle sicher, dass locale richtig gesetzt ist!)\n"
+
+#, python-format
+msgid "Checking installed modules (%s)...\n"
+msgstr "Prüfe installierte Module (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " Eine oder mehrere Erweiterungen nicht gefunden"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (Stelle sicher, dass die Erweiterungen compiliert wurden!)\n"
+
+#, python-format
+msgid "Checking templates (%s)...\n"
+msgstr "Prüfe Vorlagen (%s)...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr "(Vorlagen scheinen falsch installiert worden zu sein)\n"
+
+msgid "Checking commit editor...\n"
+msgstr "Prüfe Editor für Versionsmeldungen...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr " Kein Editor für Versionsmeldungen angegeben und vi nicht im PATH\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr " (Gib einen Editor in der .hgrc Datei an!)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr " Kann Editor '%s' nicht im PATH finden\n"
+
+msgid "Checking username...\n"
+msgstr "Prüfe Benutzernamen...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (Gib einen Benutzernamen in der .hgrc Datei an!)\n"
+
+msgid "No problems detected\n"
+msgstr "Keine Probleme gefunden\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "%s Probleme gefunden. Erwäge die obigen Lösungsvorschläge!\n"
+
+msgid "REPO ID..."
+msgstr ""
+
+msgid "test whether node ids are known to a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s\n"
+" and 1s indicating unknown/known.\n"
+" "
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "A B"
+msgstr ""
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr ""
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr "Basisrevision für die Änderungen"
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] DATEI"
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s umbenannt von %s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s ist nicht unbenannt\n"
+
+msgid "dump index data"
+msgstr ""
+
+msgid "-c|-m|FILE"
+msgstr ""
+
+msgid "show data and statistics about a revlog"
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid ""
+" Use --verbose to print the parsed tree before and after aliases\n"
+" expansion.\n"
+" "
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr "Setzt die Vorgängerversionen des Arbeitsverzeichnisses manuell"
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr "Zeigt gespeicherte Modifikationszeit nicht an"
+
+msgid "sort by saved mtime"
+msgstr "Sortiert nach gespeicherter Modifikationszeit"
+
+msgid "[OPTION]..."
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+"Zeigt die interne Repräsentation der aktuellen Änderungen (dirstate) an"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "Kopiere: %s -> %s\n"
+
+msgid "revision to check"
+msgstr "Die zu prüfende Revision"
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "ARCHIV [OPTIONEN]... [EINS [ZWEI]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPTION]... ([-c REV] | [-r REV1] [-r REV2]]) [DATEI]..."
+
+msgid "diff repository (or selected files)"
+msgstr "Zeigt Änderungen des Projektarchivs oder angegebener Dateien an"
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+" Zeigt Änderungen zwischen den Revisionen der angegebenen Dateien an."
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+" Unterschiede von Dateien zwischen Revisionen werden im unified-diff-\n"
+" Format angezeigt."
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" diff kann bei Zusammenführungen unerwartete Resultate anzeigen, da\n"
+" es nur mit einer (der ersten wenn keine Revision angegeben ist)\n"
+" Vorgängerversion vergleicht."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" Alternativ können mit -c/--change die Änderungen einer Revision relativ\n"
+" zu dessen ersten Vorgänger angezeigt werden."
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" Ohne die Option -a/--text vermeidet export den Vergleich von binären\n"
+" Dateien. Mit -a wird der Vergleich in jedem Fall durchgeführt,\n"
+" wahrscheinlich mit unerwünschtem Resultat."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" Nutze die Option -g/--git um Vergleiche im git-erweiterten diff-Format\n"
+" zu erzeugen. Für mehr Information ist :hg:`help diff` aufschlussreich."
+
+msgid " - compare a file in the current working directory to its parent::"
+msgstr ""
+" - vergleiche eine Datei im Arbeitsverzeichnis mit dem Vorgänger::"
+
+msgid " hg diff foo.c"
+msgstr ""
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr ""
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr ""
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr ""
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr ""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr ""
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr ""
+
+msgid " - compare a revision and its parents::"
+msgstr ""
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr "Vergleicht mit der zweiten Vorgängerversion"
+
+msgid "revisions to export"
+msgstr "zu exportierende Revisionen"
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr "[OPTION]... [-o DATEINAMENMUSTER] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "Gibt Kopfzeilen und Änderungsverlauf einer oder mehrerer Versionen aus"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+" Gibt Kopfzeilen und Änderungsverlauf einer oder mehrerer Versionen aus."
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" Die angezeigten Daten in den Kopfzeilen sind: Autor, Datum, Zweigname\n"
+" (falls nicht \"default\"), Änderungssatz-Prüfsumme, Vorgängerversion"
+"(en)\n"
+" und Versionsmeldung."
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" export kann bei Zusammenführungen unerwartete Resultate anzeigen,\n"
+" da es nur mit der ersten Vorgängerversion vergleicht."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" Die Ausgabe kann in eine Datei erfolgen. In diesem Fall wird der Name\n"
+" für jede ausgegebene Revision anhand einer Formatangabe erzeugt:"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: literales \"%\" Zeichen\n"
+" :``%H``: Prüfsumme des Änderungssatzes (40 Byte hexadezimal)\n"
+" :``%N``: Anzahl der generierten Patches\n"
+" :``%R``: Revisionnummer des Änderungssatzes\n"
+" :``%b``: Basisname des exportierten Archivs\n"
+" :``%h``: Kurzform der Prüfsumme des Änderungssatzes (12 Byte "
+"hexadezimal)\n"
+" :``%m``: Erste Zeile der Ãœbernahmenachricht (nur alphanumerische "
+"Zeichen)\n"
+" :``%n``: Laufende Nummer mit führenden Nullen, beginnend bei 1\n"
+" :``%r``: Revisionsnummer mit führenden Nullen"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" Ohne die Option -a/--text vermeidet export den Vergleich von binären\n"
+" Dateien. Mit -a wird der Vergleich in jedem Fall durchgeführt,\n"
+" wahrscheinlich mit unerwünschtem Resultat."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" Nutze die Option -g/--git um Vergleiche im git-erweiterten diff-Format\n"
+" zu erzeugen. Siehe dazu auch :hg:`help diff`."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" Mit dem Schalter --switch-parent kann im Falle einer Zusammenführung\n"
+" mit dem zweiten Vorfahren verglichen werden."
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr ""
+" - verwendet export und import um einen Bugfix auf den aktuellen Zweig\n"
+" zu transplantieren::"
+
+msgid " hg export -r 9353 | hg import -"
+msgstr " hg export -r 9353 | hg import -"
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr ""
+" - exportiere alle Änderungssätze zwischen zwei Revision in eine Datei\n"
+" mit Informationen über Umbenennungen::"
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr " hg export --git -r 123:150 > aenderungen.txt"
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr ""
+" - spalte neue Änderungen in eine Reihe von Patches mit erklärenden\n"
+" Namen::"
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
+msgid "export requires at least one changeset"
+msgstr "export benötigt zumindest eine Versionsangabe"
+
+msgid "exporting patches:\n"
+msgstr "Exportiere Patches:\n"
+
+msgid "exporting patch:\n"
+msgstr "Exportiere Patch:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr ""
+"Angegebene Dateien ab dem nächsten Commit nicht mehr unter Versionskontrolle "
+"stellen"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+
+msgid " - forget newly-added binary files::"
+msgstr ""
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr ""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr ""
+
+msgid " hg forget \"set:hgignore()\""
+msgstr ""
+
+msgid "resume interrupted graft"
+msgstr "Führt ein unterbrochenes graft fort"
+
+msgid "append graft info to log message"
+msgstr ""
+
+msgid "record the current date as commit date"
+msgstr "Protokolliert das aktuelle Datum als Commit-Datum"
+
+msgid "record the current user as committer"
+msgstr "Protokolliert den aktuellen Nutzer als Autor"
+
+msgid "[OPTION]... REVISION..."
+msgstr "[OPTION]... REVISION..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr ""
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+
+msgid " (grafted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr ""
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr ""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr ""
+
+msgid " hg graft -c"
+msgstr ""
+
+msgid " - show the source of a grafted changeset::"
+msgstr ""
+
+msgid " hg log --debug -r tip"
+msgstr ""
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück.\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "--continue und Revisionen können nicht gleichzeitig angegeben werden"
+
+msgid "no graft state found, can't continue"
+msgstr "Kein graft Status gefunden, kann nicht fortsetzen"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "Überspringe nicht transplantierbare Zusammenführung %s\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "Überspringe Vorgängerrevision %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "Ãœberspringe bereits transplantierte Revision %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (same origin %d)\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already grafted revision %s (was grafted from %d)\n"
+msgstr ""
+
+#, python-format
+msgid "grafting revision %s\n"
+msgstr ""
+
+msgid "unresolved conflicts, can't continue"
+msgstr ""
+
+msgid "use hg resolve and hg graft --continue"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "graft for revision %s is empty\n"
+msgstr "Pfropf für Revision %s ist leer\n"
+
+msgid "end fields with NUL"
+msgstr "Trennt Einträge mit NULL statt Leerzeichen"
+
+msgid "print all revisions that match"
+msgstr "Zeigt alle zutreffenden Revisionen"
+
+msgid "ignore case when matching"
+msgstr "Ignoriert Groß- und Kleinschreibung beim Suchen"
+
+msgid "print only filenames and revisions that match"
+msgstr "Zeigt nur zutreffende Dateinamen und Revisionen"
+
+msgid "print matching line numbers"
+msgstr "Zeigt zutreffende Zeilennummern"
+
+msgid "only search files changed within revision range"
+msgstr "Sucht Dateien, die in gegebenem Revisionsbereich geändert wurden"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[OPTION]... MUSTER [DATEI]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "Sucht ein Muster in angegebenen Dateien und Revisionen"
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+" Durchsucht Dateien in der Versionshistorie nach einem gegebenen Muster."
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+" Dieser Befehl unterscheidet sich von Unix grep, da es Reguläre "
+"Ausdrücke\n"
+" in Python/Perl Format erwartet und ausserdem nur die übernommenen "
+"Revisionen\n"
+" im Archiv durchsucht, nicht jedoch das Arbeitsverzeichnis."
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+" Standardmäßig gibt grep den Dateinamen und die jüngste Revision einer "
+"Datei\n"
+" aus, die das Suchmuster enthält. Mit der Option --all werden "
+"stattdessen\n"
+" alle Revisionen ausgegeben, in der das Muster hinzugefügt (\"+\") oder\n"
+" entfernt (\"-\") wurde."
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: Ungültiges Suchmuster: %s\n"
+
+msgid "STARTREV"
+msgstr ""
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "Zeigt nur Köpfe, die Nachkommen von STARTREV sind"
+
+msgid "show topological heads only"
+msgstr ""
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr ""
+
+msgid "show normal and closed branch heads"
+msgstr "Zeigt normale und geschlossene Branch-Köpfe"
+
+msgid "[-ct] [-r STARTREV] [REV]..."
+msgstr "[-ct] [-r STARTREV] [REV]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "Zeigt die Köpfe des Archivs oder von Entwicklungszweigen"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr " Ohne Argumente werden alle Köpfe des Archivs angezeigt."
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+" Archivköpfe sind Revisionen, die keine Nachfahren haben. Typischerweise\n"
+" geht die Entwicklung hier weiter und die Köpfe sind häufig Ziel von\n"
+" Aktualisierungen und Zusammenführungen.\n"
+" Zweigköpfe sind Revisionen eines bestimmten Zweigs, die keine Kinder\n"
+" im selben Zweig besitzen. Dies kann ein \"echter\" Kopf sein, oder die\n"
+" letzte Revision bevor ein neuer Zweig erstellt wurde. Falls kein Kopf\n"
+" eines Zweigs ein echter Kopf ist, gilt der Zweig als inaktiv."
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+" Wenn eine oder mehrere REV Argumente gegeben sind, werden die Köpfe von\n"
+" den benannten Zweigen dieser Revisionen angezeigt. Das bedeutet, dass\n"
+" :hg:`heads foo` verwendet werden kann, um die Köpfe des Zweigs ``foo``\n"
+" anzuzeigen."
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" Zweige die mit :hg:`commit --close-branch` geschlossen wurden, werden\n"
+" nur mit dem -c/--closed Schalter angezeigt."
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+" Bei Angabe einer STARTREV werden nur solche Köpfe (oder Zweigköpfe)\n"
+" angezeigt, die Nachfahren der gegebenen Revision sind."
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+" Mit -t/--topo wird Zweiginformation ignoriert und nur Änderungssätze\n"
+" ohne Nachfahren angezeigt."
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" Gibt 0 zurück, wenn zutreffende Köpfe gefunden wurden, sonst 1.\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "Keine offenen Zweigköpfe auf Zweig %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (fängt bei %s an)"
+
+msgid "show only help for extensions"
+msgstr "Zeigt Hilfe nur für Erweiterungen"
+
+msgid "show only help for commands"
+msgstr "Zeigt Hilfe für Befehle"
+
+msgid "show topics matching keyword"
+msgstr ""
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [THEMA]"
+
+msgid "show help for a given topic or a help overview"
+msgstr "Zeigt die Hilfe für ein gegebenes Thema oder eine Hilfsübersicht"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+" Ohne Parameter wird eine Liste aller Befehle mit Kurzhilfe angezeigt."
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" Bei Angabe eines Themas, einer Erweiterung oder eines Befehls wird\n"
+" detaillierte Hilfe zu diesem Thema angezeigt."
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück.\n"
+" "
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"Aliase: %s\n"
+
+msgid "(no help text available)"
+msgstr "(keine Hilfe verfügbar)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr ""
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "Alias für: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr ""
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr ""
+"Benutzen Sie \"hg -v help %s\" um Hilfe für die Erweitung %s anzuzeigen"
+
+msgid "options:"
+msgstr "Optionen:"
+
+msgid "global options:"
+msgstr "Globale Optionen:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"Nutze \"hg help %s\" um den vollen Hilfetext anzuzeigen\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"Nutze \"hg -v help %s\" um mehr Informationen anzuzeigen\n"
+
+msgid "basic commands:"
+msgstr "Grundlegende Befehle:"
+
+msgid "list of commands:"
+msgstr "Liste der Befehle:"
+
+msgid "no commands defined\n"
+msgstr "keine Befehle definiert\n"
+
+msgid "enabled extensions:"
+msgstr "Aktive Erweiterungen:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"Zusätzliche Hilfethemen:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "Nutze \"hg help\" für eine Liste aller Befehle"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"Nutze \"hg help\" für eine Liste aller Befehle oder \"hg -v\" für Details"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "Nutze \"hg -v help %s\" um den vollen Hilfetext anzuzeigen"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr "Nutze \"hg -v help%s\" um Aliase und globale Optionen anzuzeigen"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"Nutze \"hg help -c %s\" für die Hilfe zum Befehl %s\n"
+
+msgid "no help text available"
+msgstr "keine Hilfe verfügbar"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s Erweiterung - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
+msgid "Topics"
+msgstr ""
+
+msgid "Extension Commands"
+msgstr "Erweiterungs-Kommandos"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr ""
+
+msgid "identify the specified revision"
+msgstr "Identifiziert die angegebene Revision"
+
+msgid "show local revision number"
+msgstr "Zeigt die lokale Revisionsnummer"
+
+msgid "show global revision id"
+msgstr "Zeigt die globale Revisions-ID"
+
+msgid "show branch"
+msgstr "Zeigt gegebenen Branch"
+
+msgid "show tags"
+msgstr "Zeigt Tags"
+
+msgid "show bookmarks"
+msgstr "Zeige Lesezeichen"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [QUELLE]"
+
+msgid "identify the working copy or specified revision"
+msgstr "Beschreibt die Arbeitskopie oder die angegebene Revision"
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+" Die Zusammenfassung beschreibt den Zustand des Projektarchivs unter\n"
+" Nutzung von ein oder zwei Prüfsummenbezeichnern, gefolgt von einem \"+"
+"\"\n"
+" falls unversionierte Änderungen im Arbeitsverzeichnis vorliegen. Zudem\n"
+" werden eine Liste der Tags und eine der Lesezeichen dieser Revision\n"
+" ausgegeben sowie der Zweigname falls nicht der 'default'-Zweig vorliegt."
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" Ohne REV wird eine Zusammenfassung des aktuellen Status des\n"
+" Projektarchivs angezeigt."
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" Mit einem Pfad auf ein Projektverzeichnis oder ein Bündel wird eine\n"
+" Abfrage auf dies andere Archiv/Bündel ausgeführt."
+
+msgid " - generate a build identifier for the working directory::"
+msgstr ""
+
+msgid " hg id --id > build-id.dat"
+msgstr ""
+
+msgid " - find the revision corresponding to a tag::"
+msgstr ""
+
+msgid " hg id -n -r 1.3"
+msgstr ""
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr " - Prüft die aktuellste Version eines entfernten Archivs::"
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr ""
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr ""
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+"Entfernt führende Verzeichnisnamen. Dies hat dieselbe Bedeutung wie die "
+"gleichnamige Option von patch"
+
+msgid "PATH"
+msgstr "PFAD"
+
+msgid "base path (DEPRECATED)"
+msgstr "Basispfad (VERALTET)"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+"überspringt die Überprüfungen auf ausstehende, unversionierte Änderungen"
+
+msgid "don't commit, just update the working directory"
+msgstr "Kein Commit, nur Aktualisierung des Arbeitsverzeichnisses"
+
+msgid "apply patch without touching the working directory"
+msgstr "Wendet Patch an ohne das Arbeitsverzeichnis zu verändern"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "Wendet Patch auf die Knoten an, von denen er erstellt wurde"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr "Importiert eine Liste von Patches"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+" Wendet die angegebenen Patches nacheinander an und übernimmt die "
+"Änderungen\n"
+" ins Archiv (es sei denn die Option --no-commit ist angegeben)."
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+" Falls aktuell lokale Änderungen im Arbeitsverzeichnis vorliegen, bricht\n"
+" der Befehl ohne die Option -f/--force ab."
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+" Patches können direkt aus Emails importiert werden, sogar wenn sie in\n"
+" einem Anhang (Mime Typ text/plain oder text/x-patch) vorliegen. Die\n"
+" Absender- und Betreffszeile, sowie alle text/plain Abschnitte vor dem "
+"Patch\n"
+" werden als Benutzername bzw. Versionsmeldung bei der Ãœbernahme verwendet."
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+" Falls der einzulesende Patch von :hg:`export` erzeugt wurde, werden\n"
+" Benutzername und Versionsmeldung aus dem Patch und nicht aus der Email\n"
+" verwendet. Die Optionen -m/--message und -u/--user überschreiben aber\n"
+" auch diese Angaben."
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+" Mit der Option --exact wird das Arbeitsverzeichnis vor jedem Patch auf\n"
+" dessen Vorgängerversion gebracht. Nach Anwendung wird geprüft, ob der\n"
+" neue Änderungssatz die gleiche Prüfsumme aufweist, wie der Patch. Falls\n"
+" dies nicht so ist (im Falle von inkompatiblen Zeichensätzen oder "
+"anderen\n"
+" Problemen mit dem Patch Format), wird die Operation abgebrochen."
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as :hg:`addremove`."
+msgstr ""
+" Mit der Option -s/--similarity werden Umbenennungen und Kopien auf\n"
+" gleiche Weise wie mit dem Befehl :hg:`addremove` erkannt."
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Um einen Patch von der Standardeingabe zu lesen, kann der Dateiname \"-"
+"\"\n"
+" verwendet werden. Falls eine URL angegeben ist, wird der Patch von dort\n"
+" heruntergeladen. Siehe :hg:`help dates` für eine Liste aller gültigen\n"
+" Formate für -d/--date.\n"
+" "
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr ""
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr ""
+
+msgid " - import a changeset from an hgweb server::"
+msgstr ""
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr ""
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr ""
+
+msgid " hg import incoming-patches.mbox"
+msgstr ""
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr ""
+
+msgid "need at least one patch to import"
+msgstr "Benötigt mindestens einen Patchnamen zum Importieren"
+
+msgid "cannot use --no-commit with --bypass"
+msgstr ""
+
+msgid "cannot use --similarity with --bypass"
+msgstr ""
+
+msgid "patch is damaged or loses information"
+msgstr "Prüfsumme stimmt nicht überein: Patch beschädigt"
+
+msgid "applied to working directory"
+msgstr "Angewendet aufs Arbeitsverzeichnis"
+
+msgid "not a Mercurial patch"
+msgstr "Kein Mercurial-Patch"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "erstellt %s"
+
+msgid "applying patch from stdin\n"
+msgstr "Wende Patch von der Standardeingabe an\n"
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: Keine Diffs gefunden"
+
+msgid "run even if remote repository is unrelated"
+msgstr "Auch ausführen, wenn das entfernte Projektarchiv keinen Bezug hat"
+
+msgid "show newest record first"
+msgstr "Zeigt neueste Änderung zuerst"
+
+msgid "file to store the bundles into"
+msgstr "Dateiname zum Speichern der Bündel"
+
+msgid "a remote changeset intended to be added"
+msgstr "Ein entfernter Änderungssatz, der hinzugefügt werden soll"
+
+msgid "compare bookmarks"
+msgstr "Vergleiche Lesezeichen"
+
+msgid "a specific branch you would like to pull"
+msgstr "Spezifischer Zweig, der geholt werden soll"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle DATEINAME] [QUELLE]"
+
+msgid "show new changesets found in source"
+msgstr "Zeigt neue Revisionen in einer externen Quelle an"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Zeigt alle neuen Änderungen an, die durch ein \"hg pull\" vom \n"
+" angegebenen Pfad/URL oder dem 'default'-Pfad geholt werden würden."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" Für entfernte Archive sorgt die Option --bundle dafür, dass die "
+"Änderungen\n"
+" bei einem folgenden \"hg pull\" nicht ein zweites Mal geholt werden."
+
+msgid " See pull for valid source format details."
+msgstr " Siehe :hg:`help pull` für gültige Angaben für die Quelle."
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr "Kann --bundle und --subrepos nicht kombinieren"
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "Quellarchiv unterstützt keine Lesezeichen\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "create a new repository in the given directory"
+msgstr "Erzeugt ein neues Projektarchiv im angegebenen Verzeichnis"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Initialisiert ein neues Archiv im angegebenen Verzeichnis. Sollte das\n"
+" angegebene Verzeichnis nicht existieren, wird es angelegt."
+
+msgid " If no directory is given, the current directory is used."
+msgstr " Ist kein Zielverzeichnis angegeben, wird das aktuelle genutzt."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Es ist möglich eine ``ssh://`` URL als Ziel anzugeben.\n"
+" Siehe :hg:`help urls` für mehr Informationen."
+
+msgid "search the repository as it is in REV"
+msgstr "Sucht in der Revision REV"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "Beendet Dateinamen mit NUL zur Nutzung mit xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "Gibt absolute Dateinamen aus"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[OPTION]... [MUSTER]..."
+
+msgid "locate files matching specific patterns"
+msgstr "Suche Dateien mit bestimmtem Namen"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" Gibt alle Dateien im Projektarchiv aus, deren Namen auf ein angegebenes\n"
+" Muster passen."
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" Standardmäßig wird das gesamte Archiv durchsucht. Um die Suche auf das\n"
+" aktuelle Verzeichnis und Unterverzeichnisse zu begrenzen, verwende\n"
+" \"--include .\"."
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr " Ohne angegebenes Suchmuster werden alle Dateinamen ausgegeben."
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" Um die Ausgabe besser in Verbindung mit \"xargs\" verwenden zu können,\n"
+" sollte die Option \"-0\" (Null) in beiden Befehle angegeben werden.\n"
+" Dadurch werden die Dateinamen mit einem Null-Byte getrennt, was "
+"Probleme\n"
+" mit Leerzeichen in Dateinamen vermeidet."
+
+msgid "show revision history of entire repository or files"
+msgstr "Zeigt die Revisionshistorie des Archivs oder von Dateien an"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Gibt die Revisionshistorie der angegeben Dateien oder des ganzen\n"
+" Projektes aus."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" Wird kein Revisionsbereich angegeben, so wird ``tip:0`` angenommen,\n"
+" außer --follow wurde angegeben. In dem Fall wird die Vorgängerversion\n"
+" des Arbeitsverzeichnis als Startversion genommen."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" Die Dateihistorie wird angezeigt ohne der Umbenennungs- oder Kopier-\n"
+" historie zu folgen. Bei Angabe von -f/--follow mit einem Dateinamen\n"
+" wird die Historie über Kopien und Umbenennungen hinweg verfolgt.\n"
+" --follow ohne Dateinamen wird nur Vorläufer und Nachfolger ab der\n"
+" Startrevision anzeigen."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Standardmäßig wird folgendes ausgegeben: Änderungssatz-Id und\n"
+" Prüfsumme, Marken, nicht triviale Vorgängerversionen, Nutzer,\n"
+" Datum und Zeit und eine Zusammenfassung für jede Version. Bei Angabe\n"
+" des -v/--verbose Schalters, wird eine Liste aller geänderten Dateien\n"
+" und die komplette Versionsmeldung angezeigt."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" log -p/--patch kann ein unerwartetes Diff für Zusammenführungen\n"
+" erzeugen, da es standardmäßig die Zusammenführungsversion mit der\n"
+" ersten Vorgängerversion vergleicht. Auch in der Dateiliste werden\n"
+" nur Dateien berücksichtigt, die zu BEIDEN Vorgängernversionen\n"
+" verschieden sind:."
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr " - Änderungssätze mit vollen Beschreibungen und Dateilisten::"
+
+msgid " hg log -v"
+msgstr ""
+
+msgid " - changesets ancestral to the working directory::"
+msgstr ""
+" - Alle Änderungssätze, die Vorfahren des Arbeitsverzeichnisses sind"
+
+msgid " hg log -f"
+msgstr ""
+
+msgid " - last 10 commits on the current branch::"
+msgstr " - Die letzten 10 Revisionen des aktuellen Zweigs::"
+
+msgid " hg log -l 10 -b ."
+msgstr ""
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr ""
+
+msgid " hg log --removed file.c"
+msgstr ""
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr ""
+" - Alle Änderungssätze die ein Verzeichnis betreffen, mit diffs ohne\n"
+" Zusammenführungen::"
+
+msgid " hg log -Mp lib/"
+msgstr ""
+
+msgid " - all revision numbers that match a keyword::"
+msgstr " - Die Nummern von Revisionen, die ein Schlüsselwort beinhalten::"
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr ""
+
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr ""
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr ""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr " - Alle Änderungen eines Benutzers innerhalb eines Intervalls::"
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr ""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr ""
+" - Zusammenfassung aller Änderungssätze seit dem letzten Etikett::"
+
+msgid ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+" Siehe :hg:`help revisions` und :hg:`help revsets` darüber, wie man\n"
+" Revisionen angeben kann."
+
+#, fuzzy
+msgid ""
+" See :hg:`help templates` for more about pre-packaged styles and\n"
+" specifying custom templates."
+msgstr ""
+" Siehe :hg:`help templates` für Informationen über Vorlagen und Filter.\n"
+" "
+
+msgid "revision to display"
+msgstr "Auszugebende Revision"
+
+msgid "list files from all revisions"
+msgstr "Listet Dateien aller Revisionen"
+
+msgid "[-r REV]"
+msgstr ""
+
+msgid "output the current or given revision of the project manifest"
+msgstr "Gibt das Manifest der angegebenen oder aktuellen Revision aus"
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+" Gibt eine Liste aller Dateien unter Versionskontrolle für die "
+"angegebene\n"
+" Revision aus. Wenn keine Revision angegeben wird, wird die erste\n"
+" Vorgängerversion des Arbeitsverzeichnis genutzt oder die Spitze (tip)\n"
+" falls keine Revision ausgecheckt ist."
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+" Mit dem Schalter -v werden zusätzlich zum Dateinamen auch die Rechte "
+"und\n"
+" der Dateityp (Verknüpfung/ausführbar) ausgegeben; mit --debug auch noch\n"
+" die Prüfsumme.\n"
+" "
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+
+msgid "can't specify a revision with --all"
+msgstr "Kann nicht eine bestimmte Revision und --all gleichzeitig angeben"
+
+msgid "force a merge with outstanding changes"
+msgstr "Erzwingt einen Merge mit ausstehenden Änderungen"
+
+msgid "revision to merge"
+msgstr "zu mergende Revision"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "Führt das Arbeitsverzeichnis mit einer anderen Revision zusammen"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" Wendet die Änderungen der angegebenen Revision (seit einem gemeinsamen\n"
+" Vorfahr) im Arbeitsverzeichnis an."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Dateien, die in sich in einer der beiden Vorgängerversionen änderten\n"
+" werden als verändert markiert und es muss 'hg commit' ausgeführt bevor\n"
+" weitere Änderungen durchgeführt werden dürfen. Nach dem Übernehmen hat\n"
+" die neue Revision zwei Vorfahren."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" Wenn keine Revision angegeben wird und der Vorgänger des Arbeits-\n"
+" verzeichnisses eine Kopfversion eines Zweiges mit genau zwei Köpfen "
+"ist,\n"
+" dann wird der andere Kopf für die Zusammenführung verwendet.\n"
+" Bei mehr oder weniger als zwei Köpfen im Zweig muss eine andere "
+"Revision\n"
+" explizit angegeben werden."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr " Konflikte müssen erst mit :hg:`resolve` gelöst werden."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn ungelöste Konflikte auftraten.\n"
+" "
+
+msgid ""
+"multiple matching bookmarks to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr ""
+"Mehrere passende Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie "
+"eine explizite Revision oder ein Lesezeichen"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "'hg heads' zeigt alle Köpfe"
+
+msgid ""
+"no matching bookmark to merge - please merge with an explicit rev or bookmark"
+msgstr ""
+"Kein passendes Lesezeichen zum Zusammenführen gefunden. Bitte wählen Sie "
+"eine explizite Revision oder ein Lesezeichen"
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr "Zweig '%s' hat %d Köpfe - Bitte wähle eine explizite Revision"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "'hg heads .' zeigt Köpfe"
+
+msgid "heads are bookmarked - please merge with an explicit rev"
+msgstr ""
+"Es existieren Lesezeichen für die Köpfe. Bitte geben Sie explizit eine "
+"Revision an"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr "Zweig '%s' hat einen Kopf - Bitte wähle eine explizite Revision"
+
+msgid "nothing to merge"
+msgstr "Es gibt nichts zum Zusammenführen"
+
+msgid "use 'hg update' instead"
+msgstr "Nutze stattdessen 'hg update'"
+
+msgid "working directory not at a head revision"
+msgstr "Arbeitsverzeichnis ist nicht auf Stand der Kopfversion"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "Verwende 'hg update' oder führe mit einer expliziten Revision zusammen"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "Ein Änderungssatz, den das Ziel einschliessen soll"
+
+msgid "a specific branch you would like to push"
+msgstr "Revision, die geschoben werden soll"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [ZIEL]"
+
+msgid "show changesets not found in the destination"
+msgstr "Zeigt Änderungssätze, die nicht im Zielarchiv sind"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Zeigt alle Änderungssätze des lokalen Archivs, die nicht im angegebenen\n"
+" Zielarchiv oder dem Standardziel vorhanden sind. Dies sind genau jene,\n"
+" die durch ein 'hg push' übertragen werden würden."
+
+msgid " See pull for details of valid destination formats."
+msgstr " Siehe Hilfe zu 'pull' für das Format der Zieladresse."
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "show parents of the specified revision"
+msgstr "Zeigt die Vorgänger der angegeben Revision"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [DATEI]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "Zeigt die Vorgänger des Arbeitsverzeichnisses oder einer Revision"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Gibt die Vorgängerversion(en) des Arbeitsverzeichnisses aus. Bei\n"
+" Angabe einer Revision via -r/--rev, werden die Vorgänger dieser\n"
+" Version ausgegeben. Bei Angabe einer Datei wird die Version\n"
+" ausgegeben, in der diese Datei zuletzt geändert wurde (noch vor der\n"
+" Version des Arbeitsverzeichnisses oder dem Argument zu --rev falls\n"
+" angegeben)."
+
+msgid "can only specify an explicit filename"
+msgstr "Ein expliziter Dateiname muss angegeben werden"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' nicht im Manifest gefunden!"
+
+msgid "[NAME]"
+msgstr "[NAME]"
+
+msgid "show aliases for remote repositories"
+msgstr "Zeigt Adresse für Aliasnamen von entfernten Projektarchiven an"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+" Zeigt die Adressdefinition des Kurznamens NAME an. Wenn kein Name "
+"gegeben\n"
+" ist, werden alle Alias-Definitionen angezeigt."
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+" Kurznamen für entfernte Archive werden im Abschnitt [paths] der\n"
+" Konfigurationsdatei und ``/etc/mercurial/hgrc`` definiert. Wenn der\n"
+" Befehl in einem Projektarchiv ausgeführt wird, wird auch die Datei\n"
+" ``.hg/hgrc`` durchsucht."
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr " Siehe auch :hg:`help urls` für das Format von Adressangaben."
+
+msgid "not found!\n"
+msgstr "nicht gefunden!\n"
+
+msgid "set changeset phase to public"
+msgstr ""
+
+msgid "set changeset phase to draft"
+msgstr ""
+
+msgid "set changeset phase to secret"
+msgstr ""
+
+msgid "allow to move boundary backward"
+msgstr ""
+
+msgid "target revision"
+msgstr ""
+
+msgid "[-p|-d|-s] [-f] [-r] REV..."
+msgstr ""
+
+msgid "set or show the current phase name"
+msgstr ""
+
+msgid " With no argument, show the phase name of specified revisions."
+msgstr ""
+
+msgid ""
+" With one of -p/--public, -d/--draft or -s/--secret, change the\n"
+" phase value of the specified revisions."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
+" lower phase to an higher phase. Phases are ordered as follows::"
+msgstr ""
+
+msgid " public < draft < secret"
+msgstr ""
+
+#, fuzzy
+msgid ""
+" Return 0 on success, 1 if no phases were changed or some could not\n"
+" be changed.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn keine Änderungen gefunden wurden.\n"
+" "
+
+msgid "only one phase can be specified"
+msgstr ""
+
+#, python-format
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "Suche nach Änderungen\n"
+
+msgid "no phases changed\n"
+msgstr ""
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "aktualisiere nicht: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+"(\"hg heads\" zeigt alle Köpfe, nutze \"hg merge\" um sie zusammenzuführen)\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+"('hg heads' zeigt alle Köpfe, nutze 'hg merge' um sie zusammenzuführen)\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "('hg heads' zeigt alle Köpfe)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(führe \"hg update\" aus, um ein Arbeitsverzeichnis zu erstellen)\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "Auf neuen Zweigkopf aktualisieren, falls Änderungssätze geholt wurden"
+
+msgid "run even when remote repository is unrelated"
+msgstr "Auch ausführen, wenn das entfernte Projektarchiv keinen Bezug hat"
+
+msgid "BOOKMARK"
+msgstr "LESEZEICHEN"
+
+msgid "bookmark to pull"
+msgstr "Zu importierendes Lesezeichen"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e BEFEHL] [--remotecmd BEFEHL] [QUELLE]"
+
+msgid "pull changes from the specified source"
+msgstr "Ruft Änderungen von der angegebenen Quelle ab"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Überträgt Änderungen aus einem entfernten Archiv in das lokale."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Dabei werden alle Änderungen vom Archiv am angegebenen Pfad oder\n"
+" URL gesucht und dem lokalen Archiv hinzugefügt (das aktuelle, oder das\n"
+" mit -R gegebene). Standardmäßig wird die Kopie des Projektes im\n"
+" Arbeitsverzeichnis nicht aktualisiert."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Um zu sehen, was beim nächsten 'pull' geholt würde, ohne dem Archiv\n"
+" tatsächlich Änderungen hinzuzufügen, nutze :hg:`incoming`. Wenn diese\n"
+" dann hinzugefügt werden sollen, kann mit :hg:`pull -r X` als X der\n"
+" letzte von incoming gezeigte Änderungssatz angegeben werden."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Ohne Angabe der QUELLE wird standardmäßig der 'default'-Pfad genutzt.\n"
+" Siehe Hilfe zu 'paths' zu Pfad-Kurznamen und 'urls' für erlaubte\n"
+" Formate für die Quellangabe."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 bei Konfliken während der Aktualisierung.\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "Entferntes Lesezeichen %s wurde nicht gefunden!"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"Das andere Projektarchiv unterstützt keine Revisionsabfragen, daher kann\n"
+"keine Revision angegeben werden."
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "Importierte Lesezeichen %s\n"
+
+msgid "force push"
+msgstr "Erzwingt Push"
+
+msgid "bookmark to push"
+msgstr "Zu exportierendes Lesezeichen"
+
+msgid "allow pushing a new branch"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e BEFEHL] [--remotecmd BEFEHL] [ZIEL]"
+
+msgid "push changes to the specified destination"
+msgstr "Überträgt lokale Änderungen zum angegebenen Ziel"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr " Überträgt lokale Änderungen in das angegebene Ziel."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" Dies ist das Gegenteil der 'pull' Operation. Die lokalen Änderungen\n"
+" des aktuellen Archivs werden in ein anderes übertragen. Bei lokalem\n"
+" Ziel ist diese Aktion identisch zu einem 'hg pull' von diesem Archiv "
+"zum\n"
+" aktuellen."
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" Im Regelfall wird \"push\" die Ausführung verweigern, wenn das\n"
+" Resultat die Anzahl der Kopfversionen im entfernten Archiv erhöht, da\n"
+" dies normalerweise bedeutet, dass der Nutzer vergessen hat, vor der\n"
+" Übertragung die entfernten Änderungen zu holen und zusammenzuführen."
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" Der Schalter --new-branch erlaubt es, einen neuen Zweig in das Ziel\n"
+" zu schieben. Damit kann diese gewünschte Operation erlaubt, aber\n"
+" jede andere Kopferstellung verboten werden."
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" Nutze -f/--force um diese Vorkehrungen abzuschalten und alle Änderungs-\n"
+" sätze zu übertragen."
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Bei Nutzung von -r/--rev wird die benannte Revision mit allen "
+"Vorgängern\n"
+" in das entfernte Archiv übertragen."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Siehe :hg:`help urls` für wichtige Details zu ``ssh://``-URLS.\n"
+" Beim Weglassen von ZIEL wird standardmäßig der 'default'-Pfad\n"
+" genutzt."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn nichts übertragen wurde.\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "Ãœbertrage nach %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "Exportiere Lesezeichen %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "Lösche entferntes Lesezeichen %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "Lesezeichen %s existiert weder im lokalen noch im entfernten Archiv!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "Aktualisieren des Lesezeichens %s fehlgeschlagen!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "Setzt eine unterbrochene Transaktion zurück"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+" Setzt ein unterbrochenes Übernehmen (commit) oder Abholen (pull) zurück."
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" Der ungültige Status durch die Unterbrechung wird repariert. Dies "
+"sollte\n"
+" nur dann nötig sein, wenn eine Meldung von Mercurial es vorschlägt."
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr "Protokolliert die Löschung fehlender Dateien"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "Entfernt (und löscht) Datei sogar wenn hinzugefügt oder modifiziert"
+
+msgid "remove the specified files on the next commit"
+msgstr "Entfernt die angegebenen Dateien in der nächsten Version"
+
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr ""
+" Merkt die benannten Dateien für Entfernung aus dem aktuellen Zweig vor."
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" Die Dateien werden im Projektarchiv beim nächsten Übernehmen (commit)\n"
+" entfernt. Um diese Aktion vorher rückgängig zu machen, siehe\n"
+" :hg:`revert`. Um das Hinzufügen von Dateien rückgängig zu machen, siehe\n"
+" :hg:`forget`."
+
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" Option -A/--after kann genutzt werden, um Dateien zu entfernen, die\n"
+" bereits gelöscht wurden, -f/--force kann genutzt werden, um die\n"
+" Löschung zu erzwingen. -Af entfernt Dateien aus der nächsten "
+"Revision,\n"
+" ohne sie im Arbeitsverzeichnis zu löschen"
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" Die folgende Tabelle beschreibt detailliert das Verhalten von "
+"'remove'\n"
+" für unterschiedliche Dateizustände (Spalten) und Optionskombinationen\n"
+" (Reihen). Die Dateizustände sind Hinzugefügt (A), Unverändert (C),\n"
+" Verändert (M) und Fehlend (!) (wie von :hg:`status` angezeigt). Die\n"
+" Aktionen sind Warnen, Entfernen (aus dem Zweig) und Löschen\n"
+" (von der Festplatte)::"
+
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" keine W EL W E\n"
+" -f E EL EL E\n"
+" -A W W W E\n"
+" -Af E E E E\n"
+" ======= == == == =="
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn Warnungen ausgegeben wurden.\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "Entferne %s nicht: Datei ist nicht versioniert\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr "Entferne nicht %s: Datei existiert noch (-f zum Erzwingen)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr "Entferne nicht %s: Datei ist verändert (-f zum Erzwingen)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr ""
+"Entferne nicht %s: Datei soll hinzugefügt werden ('hg forget' um dies "
+"rückgängig zu machen)\n"
+
+msgid "record a rename that has already occurred"
+msgstr ""
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[OPTION]... QUELLE... ZIEL"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "Benennt Dateien um; Äquivalent zu \"copy\" und \"remove\""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+" Erstellt das Ziel als neue Datei mit der Versionshistorie der Quelle.\n"
+" Die Quelle wird ausserdem als gelöscht markiert. Wenn mehrere Quellen\n"
+" angegeben sind, muss das Ziel ein Verzeichnis sein."
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Die Umbenennung hat wie üblich keinn sofortigen Effekt, sondern ist\n"
+" als lokale Änderung vorgemerkt. Die Umbenennung kann durch :hg:`revert`\n"
+" rückgängig gemacht werden."
+
+msgid "select all unresolved files"
+msgstr "Wählt alle konfliktbehafteten Dateien aus"
+
+msgid "list state of files needing merge"
+msgstr "Zeigt Dateien, die einen manuellen Merge erfordern"
+
+msgid "mark files as resolved"
+msgstr "Markiert eine Datei als konfliktfrei"
+
+msgid "mark files as unresolved"
+msgstr "Markiert eine Datei als konfliktbehaftet"
+
+msgid "hide status prefix"
+msgstr "Versteckt das Status-Präfix"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr ""
+"Macht Zusammenführungen rückgängig oder setzt/zeigt den "
+"Zusammenführungsstatus einer Datei"
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents). See :hg:`help\n"
+" merge-tools` for information on configuring merge tools."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr "Zu viele Optionen angegeben"
+
+msgid "can't specify --all and patterns"
+msgstr "Verwende nicht --all gleichzeitig mit einem Dateimuster"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr "Keine Dateien oder Verzeichnisse angegeben; nutze --all für alle"
+
+msgid "revert all changes when no arguments given"
+msgstr "Nimmt (ohne andere Parameter) alle Änderungen zurück"
+
+msgid "tipmost revision matching date"
+msgstr "dem tip nächste Revision mit passendem Datum"
+
+msgid "revert to the specified revision"
+msgstr "Geht bis zur angegebene Revision zurück"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr ""
+
+msgid "restore files to their checkout state"
+msgstr "Setzt gegebene Dateien oder Verzeichnisse auf frühere Version zurück"
+
+msgid ""
+" .. note::\n"
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel a merge (and lose your changes), use :hg:`update --clean .`."
+msgstr ""
+" .. note::\n"
+" Um das Arbeitsverzeichnis auf eine ältere Version zu setzen, nutze\n"
+" :hg:`update REV`. Um eine nicht übernommene Zusammenführung "
+"rückgängig\n"
+" zu machen, nutze :hg:`update --clean .`."
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" Ohne gegebene Revision wird der Inhalt der benannten Dateien oder\n"
+" Verzeichnisse auf die Vorgängerversion zurückgesetzt. Die betroffenen\n"
+" Dateien gelten danach wieder als unmodifiziert und nicht übernommene\n"
+" Hinzufügungen, Entfernungen, Kopien und Umbenennungen werden vergessen.\n"
+" Falls das Arbeitsverzeichnis zwei Vorgänger hat, muss eine Revision\n"
+" explizit angegeben werden."
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+" Mit der -r/--rev oder der -d/--date Option werden die Dateien oder\n"
+" Verzeichnisse auf die gegebene Revision zurückgesetzt. Da 'revert' aber\n"
+" nicht die mit dem Arbeitsverzeichnis assoziierte Revisionsnummer "
+"ändert,\n"
+" gelten die betroffenen Dateien dann als modifiziert. Damit kann man\n"
+" ungewollte aber bereits übernommene Änderungen rückgängig machen. Siehe\n"
+" auch :hg:`backout` für eine ähnliche Methode."
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" Modifizierte Dateien werden vor der Änderung mit der Endung .orig\n"
+" gespeichert. Um dieses Backup zu verhindern, verwende --no-backup."
+
+msgid "you can't specify a revision and a date"
+msgstr "ungültige Angabe von Revision und Datum gleichzeitig"
+
+msgid "uncommitted merge with no revision specified"
+msgstr ""
+"Nicht übernommene Zusammenführung - bitte gib eine bestimmte Revision an"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr "Verwende :h:`update` oder lies :h:`help revert`"
+
+msgid "no files or directories specified"
+msgstr "Keine Dateien order Verzeichnisse angegeben"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"Nicht übernommene Zusammenführung - nutze --all um alle Änderungen eines "
+"Vorgängers zu vergessen, oder 'hg update -C .' um die Zusammenführung nicht "
+"durchzuführen"
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu "
+"verwerfen, oder 'hg update %s' zum Aktualisieren"
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr ""
+"Ausstehende nicht versionierte Änderungen - nutze -all um alle Änderungen zu "
+"verwerfen"
+
+msgid "use --all to revert all files"
+msgstr "nutze -all, um alle Dateien zurückzusetzen"
+
+msgid "ignore safety measures"
+msgstr ""
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "Rollt die letzte Transaktion zurück (gefährlich!)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" Dieser Befehl muss mit Vorsicht verwendet werden. Es gibt keine ver-\n"
+" schachtelten Transaktionen und ein Rückrollen kann selber nicht "
+"rückgängig\n"
+" gemacht werden. Der aktuelle Status (dirstate) im .hg Verzeichnis wird\n"
+" auf die letzte Transaktion zurückgesetzt. Neuere Änderungen gehen damit\n"
+" verloren."
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+" Transaktionen werden verwendet um den Effekt aller Befehle, die "
+"Änderungs-\n"
+" sätze erstellen oder verteilen, zu kapseln. Die folgenden Befehle\n"
+" werden durch Transaktionen geschützt und können zurückgerollt werden:"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (mit diesem Archiv als Ziel)\n"
+" - unbundle"
+
+msgid ""
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" Um einen versehentlichen Datenverlust zu verhindern, wird rollback\n"
+" keine Änderungssätze aus der Historie entfernen, die nicht im\n"
+" Arbeitsverzeichnis aktuell sind. Um diesen Schutz abzuschalten,\n"
+" muss --force (erzwingen) angegeben werden."
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" Dieser Befehl ist nicht für öffentliche Archive gedacht. Sobald "
+"Änderungen\n"
+" für Andere sichtbar sind ist ein Zurückrollen unnütz, da jemand sie "
+"bereits\n"
+" zu sich übertragen haben könnte. Weiterhin entsteht eine "
+"Wettlaufsituation,\n"
+" wenn beispielsweise ein Zurückrollen ausgeführt wird, während jemand "
+"anders\n"
+" ein 'pull' ausführt."
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+" Gibt 0 bei Erfolg zurück, 1 wenn kein Transaktionsprotokoll gefunden "
+"wird.\n"
+" "
+
+msgid "print the root (top) of the current working directory"
+msgstr "Gibt die Wurzel (top) des aktuellen Arbeitsverzeichnisses aus"
+
+msgid " Print the root directory of the current repository."
+msgstr ""
+" Gibt das Wurzelverzeichnis des aktuellen Arbeitsverzeichnisses aus."
+
+msgid "name of access log file to write to"
+msgstr "Name der Zugriffs-Logdatei"
+
+msgid "name of error log file to write to"
+msgstr "Name der Fehler-Logdatei"
+
+msgid "PORT"
+msgstr ""
+
+msgid "port to listen on (default: 8000)"
+msgstr "Port auf dem gehorcht wird (Voreinstellung: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "Adresse auf der gehorcht wird (Voreinstellung: alle Schnittstellen)"
+
+msgid "ADDR"
+msgstr ""
+
+msgid "prefix path to serve from (default: server root)"
+msgstr ""
+"Pfadpräfix von dem ausgeliefert wird (Voreinstellung: Serverwurzel '/')"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+"Name der auf der Webseite angezeigt wird (Voreinstellung: Arbeitsverzeichnis)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "Name der hgweb-Konfigurationsdatei (siehe \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr "für entfernte Clients"
+
+msgid "web templates to use"
+msgstr "Zu nutzende Web-Vorlagen"
+
+msgid "template style to use"
+msgstr "Zu verwendender Stil"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "Nutzt IPv6 zusätzlich zu IPv4"
+
+msgid "SSL certificate file"
+msgstr "SSL-Zertifikatsdatei"
+
+msgid "start stand-alone webserver"
+msgstr "Startet einen eigenständigen Webserver"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" Standardmäßig schreibt der Server Zugriffe auf die Standardausgabe\n"
+" und Fehler auf die Standardfehlerausgabe. Nutze die Optionen \n"
+" -A/--accesslog und -E/--errorlog, um die Ausgabe in Dateien umzulenken."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+
+msgid "cannot use --stdio with --cmdserver"
+msgstr "--stdio und --cmdserver können nicht gleichzeitig verwendet werden"
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "Es gibt hier kein Mercurial-Archiv (.hg nicht vorhanden)"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "Höre auf http://%s%s/%s (gebunden an %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr ""
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr "Zeigt die kombinierten Konfigurationswerte aller hgrc-Dateien an"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+" Ohne Argumente werden die Namen und Werte aller Konfigurationseinträge\n"
+" angezeigt."
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+" Mit einem Argument der Form sektion.name wird nur der Wert dieses\n"
+" Konfigurationseintrages angezeigt."
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+" Mit mehreren Argumenten werden die Namen und Werte aller passenden\n"
+" Konfigurationseinträge angezeigt."
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+" Mit dem --debug Schalter wird der Dateiname und die Zeilennummer der\n"
+" Definitionsquelle mit jedem Eintrag ausgegeben."
+
+msgid "only one config item permitted"
+msgstr "Nur ein Konfigurationseintrag ist erlaubt"
+
+msgid "show status of all files"
+msgstr "Zeigt den Status aller Dateien"
+
+msgid "show only modified files"
+msgstr "Zeigt nur geänderte Dateien"
+
+msgid "show only added files"
+msgstr "Zeigt nur hinzugefügte Dateien"
+
+msgid "show only removed files"
+msgstr "Zeigt nur entfernte Dateien"
+
+msgid "show only deleted (but tracked) files"
+msgstr "Zeigt nur gelöschte (aber versionierte) Dateien"
+
+msgid "show only files without changes"
+msgstr "Zeigt nur Dateien ohne Änderungen"
+
+msgid "show only unknown (not tracked) files"
+msgstr "Zeigt nur unbekannte (nicht versionierte) Dateien"
+
+msgid "show only ignored files"
+msgstr "Zeigt nur ignorierte Dateien"
+
+msgid "show source of copied files"
+msgstr "Zeigt die Quelle von kopierten Dateien"
+
+msgid "show difference from revision"
+msgstr "Zeigt die Unterschiede zu einer Revision"
+
+msgid "list the changed files of a revision"
+msgstr "Listet geänderte Dateien einer Revision"
+
+msgid "show changed files in the working directory"
+msgstr "Zeigt geänderte Dateien im Arbeitsverzeichnis"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Zeigt den Status von Dateien im Archiv an. Wenn eine Name übergeben\n"
+" wird, werden nur zutreffende Dateien angezeigt. Es werden keine Dateien\n"
+" angezeigt die unverändert, ignoriert oder Quelle einer Kopier- oder\n"
+" Verschiebe Operation sind, es sei denn -c/--clean (unverändert),\n"
+" -i/--ignored (ignoriert), -C/--copies (Kopien) oder -A/--all (alle)\n"
+" wurde angegeben. Außer bei Angabe von Optionen, die mit \"Zeigt\n"
+" nur ...\" beschrieben werden, werden die Optionen -mardu genutzt."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" Die Option -q/--quiet blendet unüberwachte (unbekannte und ignorierte)\n"
+" Dateien aus, es sei denn sie werden explizit mit -u/--unknown oder \n"
+" -i/--ignored angefordert."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note:\n"
+" Der Status kann sich vom Diff unterscheiden, wenn sich "
+"Berechtigungen\n"
+" geändert haben oder eine Zusammenführung durchgeführt wurde. Das\n"
+" Vorgabe-Diff-Format zeigt keine Berechtigungsänderungen an und\n"
+" 'diff' zeigt nur Änderungen relativ zu einer Vorgängerversion einer\n"
+" Zusammenführung an."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" Bei Angabe einer Revision wird diese als Basisrevision genutzt.\n"
+" Bei Angabe zweier Revisionen werden die Unterschiede zwischen diesen\n"
+" beiden gezeigt. Die -c/--change Option kann verwendet werden, um\n"
+" die Änderungen einer Revision (relativ zu dessen Vorgänger) zu zeigen."
+
+msgid " The codes used to show the status of files are::"
+msgstr " Die Zeichen, die den Status anzeigen, bedeuten::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = modifiziert\n"
+" A = hinzugefügt (added)\n"
+" R = entfernt (removed)\n"
+" C = unverändert (clean)\n"
+" ! = verschwunden (nicht durch einen hg-Befehl gelöscht, aber immer\n"
+" noch überwacht)\n"
+" ? = nicht überwacht\n"
+" I = ignoriert\n"
+" = die zuvor hinzugefügt Datei (A) wurde von hier kopiert"
+
+msgid ""
+" - show changes in the working directory relative to a\n"
+" changeset::"
+msgstr ""
+" - zeigt Änderungen zwischen dem Arbeitsverzeichnis und einer\n"
+" Revision::"
+
+msgid " hg status --rev 9353"
+msgstr ""
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr ""
+
+msgid " hg status --copies --change 9353"
+msgstr ""
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+
+msgid " hg status -an0"
+msgstr ""
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr "Fasst den Status des Arbeitsverzeichnisses zusammen"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "Vorgänger: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (leeres Archiv)"
+
+msgid " (no revision checked out)"
+msgstr " (keine Revision geladen)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "Zweig: %s\n"
+
+msgid "bookmarks:"
+msgstr "Lesezeichen:"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d modifiziert"
+
+#, python-format
+msgid "%d added"
+msgstr "%d hinzugefügt"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d entfernt"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d umbenannt"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d kopiert"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d gelöscht"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d unbekannt"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignoriert"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d konfliktbehaftet"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d Unterarchive"
+
+msgid " (merge)"
+msgstr "(Zusammenführung)"
+
+msgid " (new branch)"
+msgstr "(neuer Zeig)"
+
+msgid " (head closed)"
+msgstr " (Köpfe geschlossen)"
+
+msgid " (clean)"
+msgstr ""
+
+msgid " (new branch head)"
+msgstr ""
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "Ãœbernehme: %s\n"
+
+msgid "update: (current)\n"
+msgstr "Aktualisiere: (aktuell)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "Aktualisiere: %d neue Änderungssätze (Aktualisierung)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr ""
+"Aktualisiere: %d neue Änderungssätze, %d neue Zweigköpfe (Zusammenführung)\n"
+
+msgid "1 or more incoming"
+msgstr ""
+
+#, python-format
+msgid "%d outgoing"
+msgstr ""
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d eingehende Lesezeichen"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d ausgehende Lesezeichen"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "Entfernt: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "Entfernt: (synchonisiert)\n"
+
+msgid "force tag"
+msgstr "erzwinge Etikett"
+
+msgid "make the tag local"
+msgstr "Tag wird nur lokal gesetzt"
+
+msgid "revision to tag"
+msgstr "Zu taggende Revision"
+
+msgid "remove a tag"
+msgstr "Entfernt ein Tag"
+
+msgid "use <text> as commit message"
+msgstr "Nutzt <Text> als Commit-Nachricht"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEXT] [-d DATUM] [-u BENUTZER] [-r REV] NAME..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr ""
+"Setze ein oder mehrere Etiketten für die aktuelle oder gegebene Revision"
+
+msgid " Name a particular revision using <name>."
+msgstr " Benennt eine bestimmte Revision mit <name>."
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" Etiketten sind nützlich um somit benannte Revisionen später in "
+"Vergleichen\n"
+" zu verwenden, in der Historie dorthin zurückzugehen oder wichtige "
+"Zweig-\n"
+" stellen zu markieren. Daher sind Änderungen existierender Etiketten\n"
+" normalerweise verboten, können aber mit -f/--force erzwungen werden."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" Wenn keine Revision angegeben ist, wird der Vorgänger des Arbeits-\n"
+" verzeichnisses (oder - falls keines existiert - die Spitze) benannt."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" Um die Versionskontrolle, Verteilung und Zusammenführung von Etiketten\n"
+" möglich zu machen, werden sie in einer Datei '.hgtags' gespeichert, "
+"welche\n"
+" zusammen mit den anderen Projektdateien überwacht wird und manuell\n"
+" bearbeitet werden kann. Das bedeutet, dass Etikettierung automatisch\n"
+" eine neue Revision übernimmt. Lokale Etiketten (nicht mit anderen\n"
+" Archiven geteilt) liegen in der Datei .hg/localtags."
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr "Etikettnamen müssen einzigartig sein"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "Gegebener Etikettname ist leer"
+
+msgid "--rev and --remove are incompatible"
+msgstr "Die Optionen --rev und --remove sind inkompatibel"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "Etikett '%s' existiert nicht"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "Etikett '%s' ist nicht global"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "Etikett '%s' ist nicht lokal"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "Etikett '%s' existiert bereits; erzwinge mit -f/--force"
+
+msgid "uncommitted merge"
+msgstr "Ausstehende nicht versionierte Zusammenführung"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "Nicht auf einem Zweigkopf - erzwinge mit -f/--force"
+
+msgid "list repository tags"
+msgstr "Liste alle Etiketten des Archivs auf"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Listet sowohl reguläre wie auch lokale Etiketten auf. Mit dem Schalter\n"
+" -v/--verbose werden lokale in einer dritten Spalte als solche markiert."
+
+msgid "[-p] [-g]"
+msgstr ""
+
+msgid "show the tip revision"
+msgstr "Zeigt die zuletzt übernommene Revision"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" Die Spitze (tip) bezeichnet den zuletzt hinzugefügten Änderungssatz und\n"
+" damit den zuletzt geänderten Kopf."
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" Nach einem Ãœbernehmen mit commit wird die neue Revision die Spitze.\n"
+" Nach einem Holen mit pull wird die Spitze des anderen Archives\n"
+" übernommen. Als Etikettname ist \"tip\" ein Spezialfall und kann nicht\n"
+" umbenannt oder manuell einem anderen Änderungssatz angehängt werden."
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr ""
+"aktualisiere auf den neuen Zweigkopf when Änderungssätze entpackt wurden"
+
+msgid "[-u] FILE..."
+msgstr "[-u] DATEI..."
+
+msgid "apply one or more changegroup files"
+msgstr "Wendet eine oder mehrere Änderungsgruppendateien an"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+" Die angegebenen Dateien müssen komprimierte Änderungsgruppen enthalten,\n"
+" wie sie durch den Befehl 'bundle' erzeugt werden."
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "entferne nicht versionierte Änderungen (kein Backup)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr ""
+"Aktualisiere auf anderen Zweig (falls keine unversionierten Änderungen "
+"ausstehen)"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATUM] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "Aktualisiert das Arbeitsverzeichnis (oder wechselt die Version)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch and move the current bookmark (see :hg:`help\n"
+" bookmarks`)."
+msgstr ""
+" Aktualisiert das Arbeitsverzeichnis auf den angegebenen Änderungssatz.\n"
+" Ohne Angabe eines Änderungssatzes wird auf die Spitze des aktuellen\n"
+" Zweigs aktualisiert und das aktuelle Lesezeichen verschoben. (siehe\n"
+" :hg:`help bookmarks`)."
+
+msgid ""
+" If the changeset is not a descendant or ancestor of the working\n"
+" directory's parent, the update is aborted. With the -c/--check\n"
+" option, the working directory is checked for uncommitted changes; if\n"
+" none are found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+" Die gegebene Revision wird die Vorgängerversion des Arbeits-\n"
+" verzeichnisses (siehe :hg:`help parents`)."
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" Wenn die Arbeitskopie nicht übernommene Änderungen enthält, wird nach\n"
+" folgenden Regeln vorgegangen:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. Falls weder -c/--check noch -C/--clean angegeben ist und das\n"
+" Ziel der Aktualisierung ein Vor- oder Nachfahr des Vorgängers der\n"
+" Arbeitskopie ist, werden die lokalen Änderungen als solche erhalten,\n"
+" also mit der Zielversion zusammengeführt, aber nicht übernommen.\n"
+" Wenn das Ziel dagegen nicht verwandt ist, wird die Aktualisierung\n"
+" ohne Veränderung abgebrochen."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. Mit der Option -c/--check wird die Aktualisierung immer aufgrund\n"
+" der lokalen Änderungen abgebrochen."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. Mit der Option -C/--clean werden die nicht übernommenen Änderungen\n"
+" vernachlässigt und durch die Zielversion vollständig ersetzt."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" Bei der Verwendung von null als Revision wird die Arbeitskopie\n"
+" entfernt (wie :hg:`clone -U`)."
+
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" Solle nur eine Datei auf eine ältere Revision gehoben werden, kann\n"
+" :hg:`revert [-r REV] NAME` genutzt werden."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+"Es können nicht gleichzeitig -c/--check und -C/--clean angegeben werden"
+
+msgid "verify the integrity of the repository"
+msgstr ""
+"Prüft die Integrität des Projektarchivs\n"
+"\n"
+" Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, "
+"rechnet\n"
+" alle Prüfsummen in Historie, Manifest und überwachten Dateien nach.\n"
+" Auch die Integrität von Referenzen und Indizes wird geprüft.\n"
+" "
+
+msgid " Verify the integrity of the current repository."
+msgstr " Prüft die Integrität des aktuellen Projektarchivs"
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Führt eine umfassende Prüfung des aktuellen Projektarchivs durch, "
+"rechnet\n"
+" alle Prüfsummen in Historie, Manifest und überwachten Dateien nach.\n"
+" Auch die Integrität von Referenzen und Indizes wird geprüft."
+
+msgid "output version and copyright information"
+msgstr "Gibt Version und Copyright Information aus"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(siehe http://mercurial.selenic.com für mehr Information)"
+
+msgid ""
+"Copyright (C) 2005-2012 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2012 Matt Mackall und andere\n"
+"Dies ist freie Software; siehe Quellen für Kopierbestimmungen. Es besteht\n"
+"KEINE Gewährleistung für das Programm, nicht einmal der Marktreife oder der\n"
+"Verwendbarkeit für einen bestimmten Zweck.\n"
+
+#, python-format
+msgid "unknown mode %s"
+msgstr "Unbekannter Modus: %s"
+
+#, python-format
+msgid "unknown command %s"
+msgstr "unbekannter Befehl %s"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "%s kann nicht einbezogen werden (%s)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "Arbeitsverzeichnis hat unbekannte Vorgängerversion '%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "Unbekannte Revision '%s'"
+
+msgid "not found in manifest"
+msgstr "nicht im Manifest gefunden"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "Datei in Revision %s nicht gefunden"
+
+msgid "branch name not in UTF-8!"
+msgstr "Branchname ist nicht in UTF-8!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s existiert nicht!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+"%s nicht hinzugefügt: Nur Dateien und symbolische Verknüpfungen werden\n"
+"zur Zeit unterstützt\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s ist bereits versioniert!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s nicht versioniert!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s nicht entfernt!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+"Kopieren fehlgeschlagen: %s ist keine Datei oder eine symbolische "
+"Verknüpfung\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "Ungültiges Zeichen in dag Beschreibung: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr ""
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr "Ungültiger Ereignistyp in dag: %s"
+
+msgid "nullid"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr "Status des Arbeitsverzeichnis scheint beschädigt zu sein!"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "Verzeichnis %r ist bereits im dirstate"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr "Datei %r im dirstate steht im Konflikt mit %r"
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+msgid "unknown"
+msgstr "Unbekannt"
+
+msgid "character device"
+msgstr "Zeichenorientiertes Gerät"
+
+msgid "block device"
+msgstr "Blockorientiertes Gerät"
+
+msgid "fifo"
+msgstr "FIFO"
+
+msgid "socket"
+msgstr "Socket"
+
+msgid "directory"
+msgstr "Verzeichnis"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "nicht unterstützter Dateityp (Typ %s)"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "Push erzeugt neuen entfernten Zweig '%s'!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "Verwende 'hg push --new-branch' um dies zu erlauben."
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "Push erzeugt neuen Kopf %s auf entfernten Zweig '%s'!"
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr "Push erzeugt neuen entfernten Kopfe %s!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr ""
+"Sie sollten zuerst synchronisieren (pull) und Zusammenführen (merge), oder -"
+"f/--force zum Erzwingen verwenden"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "(Haben Sie vergessen zu mergen? Nutze push -f um zu erzwingen)"
+
+#, python-format
+msgid "new remote heads on branch '%s'\n"
+msgstr "Neuer entfernter Kopf auf Zweig '%s'\n"
+
+#, python-format
+msgid "new remote head %s\n"
+msgstr "Neuer entfernter Kopf %s\n"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "Hinweis: Nicht synchronisierte entfernte Änderungen!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "Abbruch: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: Parserfehler bei %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: Parserfehler: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: Kommando '%s' ist mehrdeutig:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "Zeitüberschreitung beim Warten auf Sperre von %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "Zur Zeit von %s gesperrt"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "Abbruch: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "Abbruch: Kann %s nicht sperren: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: %s\n"
+msgstr ""
+
+msgid "abort: remote error:\n"
+msgstr "Abbruch: Entfernter Fehler:\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "Abbruch: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "Abbruch: %s"
+
+msgid " empty string\n"
+msgstr " leere Zeichenkette\n"
+
+msgid "killed!\n"
+msgstr "getötet!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: unbekannter Befehl '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(Erweiterungen nicht kompiliert?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(Python-Installation korrekt?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "Abbruch: Fehler: %s\n"
+
+msgid "broken pipe\n"
+msgstr "Datenübergabe unterbrochen\n"
+
+msgid "interrupted!\n"
+msgstr "unterbrochen!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"Datenübergabe unterbrochen\n"
+
+msgid "abort: out of memory\n"
+msgstr "Abbruch: Unzureichender Arbeitsspeicher\n"
+
+msgid "the extension author."
+msgstr "Der Autor der Erweiterung"
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension "
+"%s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr "** Unbekannter Fehler - bitte melden auf:\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial Distributed SCM (Version %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Erweiterungen geladen: %s\n"
+
+msgid "too few arguments for command alias"
+msgstr ""
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "Alias '%s' verweist auf unbekannten Befehl '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr "fehlerhafte --config Option: %s (nutze --config Abschnitt.Name=Wert)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "Fehler beim Finden des aktuellen Arbeitsverzeichnisses: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "Erweiterung '%s' überschreibt die Befehle: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "Option --config kann nicht abgekürzt werden!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "Option --cwd kann nicht abgekürzt werden!"
+
+msgid ""
+"option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+"Option -R muss von anderen Optionen getrennt werden (also z.B. nicht -qR) "
+"und --repository kann nur als --repo abgekürzt werden!"
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "Projektarchiv '%s' ist nicht lokal"
+
+#, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "Kein Projektarchiv (.hg Verzeichnis) in %s gefunden"
+
+msgid "warning: --repository ignored\n"
+msgstr "Warnung: --repository Option ignoriert\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr ""
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "Unbekannter Profiler '%s' - wird ignoriert\n"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "Warnung: Fehler beim Suchen von Kommandos in %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+msgid "unterminated string"
+msgstr "nicht abgeschlossene Zeichenkette"
+
+msgid "syntax error"
+msgstr "Syntaxfehler"
+
+msgid "missing argument"
+msgstr "fehlendes Argument"
+
+msgid "can't use a list in this context"
+msgstr "In diesem Kontext kann keine Liste verwendet werden"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+
+#. i18n: "modified" is a keyword
+msgid "modified takes no arguments"
+msgstr "'modified' erwartet keine Argumente"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+
+#. i18n: "added" is a keyword
+msgid "added takes no arguments"
+msgstr "'added' erwartet keine Argumente"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+
+#. i18n: "removed" is a keyword
+msgid "removed takes no arguments"
+msgstr "'erwartet' erwartet keine Argumente"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+
+#. i18n: "deleted" is a keyword
+msgid "deleted takes no arguments"
+msgstr "'deleted' erwartet keine Argumente"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "unknown" is a keyword
+msgid "unknown takes no arguments"
+msgstr "'unknown' erwartet keine Argumente"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "ignored" is a keyword
+msgid "ignored takes no arguments"
+msgstr "'ignored' erwartet keine Argumente"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+
+#. i18n: "clean" is a keyword
+msgid "clean takes no arguments"
+msgstr "'clean' erwartet keine Argumente"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "keine Funktion: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+
+#. i18n: "binary" is a keyword
+msgid "binary takes no arguments"
+msgstr "'binary' erwartet keine Argumente"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+"``exec()``\n"
+" Datei ist als ausführbar markiert."
+
+#. i18n: "exec" is a keyword
+msgid "exec takes no arguments"
+msgstr "'exec' erwartet keine Argumente"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+
+#. i18n: "symlink" is a keyword
+msgid "symlink takes no arguments"
+msgstr "'symlink' erwartet keine Argumente"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+"``resolved()``\n"
+" Datei, deren Konflikt als aufgelöst markiert ist."
+
+#. i18n: "resolved" is a keyword
+msgid "resolved takes no arguments"
+msgstr "'resolved' erwartet keine Argumente"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+
+#. i18n: "unresolved" is a keyword
+msgid "unresolved takes no arguments"
+msgstr "'unresolved' erwartet keine Argumente"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+"``hgignore()``\n"
+" Datei, die einem aktives .hgignore-Muster entspricht."
+
+msgid "hgignore takes no arguments"
+msgstr "'hgignore' erwartet keine Argumente"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+
+msgid "grep requires a pattern"
+msgstr "'grep' erwartet ein Muster"
+
+#, python-format
+msgid "couldn't parse size: %s"
+msgstr "Konnte Größe %s nicht verarbeiten"
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+
+#. i18n: "size" is a keyword
+msgid "size requires an expression"
+msgstr "'size' erwartet einen Ausdruck"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+
+#. i18n: "encoding" is a keyword
+msgid "encoding requires an encoding name"
+msgstr "'encoding' erwartet einen Kodierungsnamen"
+
+#, python-format
+msgid "unknown encoding '%s'"
+msgstr "Unbekannte Kodierung '%s'"
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+"``copied()``\n"
+" Datei, die als kopiert markiert ist."
+
+#. i18n: "copied" is a keyword
+msgid "copied takes no arguments"
+msgstr "'copied' erwartet keine Argumente"
+
+msgid ""
+"``subrepo([pattern])``\n"
+" Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([Muster])``\n"
+" Unterarchive (Subrepositories) deren Pfad auf das\n"
+" Muster passen."
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo erwartet mindestens ein Argument"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo erwartet ein Muster oder keine Argumente"
+
+msgid "invalid token"
+msgstr "Ungültiges Token"
+
+msgid "starting revisions are not directly related"
+msgstr "Startrevisionen haben keinen direkten Bezug"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "Mehrdeutiger Status, %s:%s ist sowohl gut als auch schlecht"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "invalid bisect state"
+msgstr "Ungültiger bisect-Status"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "gut"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "schlecht"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "übersprungen"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "ungetestet"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "gut (implizit)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "schlecht (implizit)"
+
+msgid "disabled extensions:"
+msgstr "Inaktive Erweiterungen:"
+
+msgid "VALUE"
+msgstr "WERT"
+
+msgid "DEPRECATED"
+msgstr "VERALTET"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"Mit [+] markierte Optionen können mehrfach angegeben werden\n"
+
+msgid "Configuration Files"
+msgstr "Konfigurationsdateien"
+
+msgid "Date Formats"
+msgstr "Datumsformate"
+
+msgid "File Name Patterns"
+msgstr "Dateimuster"
+
+msgid "Environment Variables"
+msgstr "Umgebungsvariablen"
+
+msgid "Specifying Single Revisions"
+msgstr "Angabe einzelner Revisionen"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Angabe mehrerer Revisionen"
+
+msgid "Specifying Revision Sets"
+msgstr "Angabe von Änderungssatzbereichen"
+
+msgid "Specifying File Sets"
+msgstr ""
+
+msgid "Diff Formats"
+msgstr "Diff-Formate"
+
+msgid "Merge Tools"
+msgstr "Werkzeuge zum Zusammenführen"
+
+msgid "Template Usage"
+msgstr "Nutzung von Vorlagen"
+
+msgid "URL Paths"
+msgstr "URL-Pfade"
+
+msgid "Using Additional Features"
+msgstr "Benutzung erweiterter Funktionen"
+
+msgid "Subrepositories"
+msgstr "Unterarchive"
+
+msgid "Configuring hgweb"
+msgstr "hgweb-Konfiguration"
+
+msgid "Glossary"
+msgstr "Glossar"
+
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "Syntax für Mercurials 'ignore'-Dateien"
+
+msgid "Working with Phases"
+msgstr "Arbeiten mit Phasen"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Für die Konfigurationsdateien wird ein einfaches ini-Dateiformat verwendet.\n"
+"Die Datei enthält Abschnitte (durch ``[Abschnittsname]`` eingeleitet),\n"
+"welche ihrerseits Zeilen der Form ``name = wert`` enthalten::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Vorname Nachname <vorname.nachname@example.net>\n"
+" verbose = True"
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"Die obigen Beispieleinträge werden als ``ui.username`` bzw. ``ui.verbose``\n"
+"bezeichnet. Siehe auch unten den Abschnitt Syntax."
+
+msgid ""
+"Files\n"
+"-----"
+msgstr ""
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr ""
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+" belong to a trusted user or to a trusted group. See the documentation\n"
+" for the ``[trusted]`` section below for more details."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected."
+msgstr ""
+
+msgid ""
+"Syntax\n"
+"------"
+msgstr ""
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+"Die Datei enthält Abschnitte (durch ``[Abschnittsname]`` eingeleitet),\n"
+"welche ihrerseits Zeilen der Form ``name = wert`` enthalten (manchmal als\n"
+"``Konfigurationsschlüssel`` bezeichnet)::"
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr ""
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr ""
+
+msgid "to include a different configuration file on each computer you use."
+msgstr ""
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr ""
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+
+msgid ""
+"Sections\n"
+"--------"
+msgstr ""
+"Abschnitte\n"
+"----------"
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+
+msgid ""
+"``alias``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr ""
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr ""
+
+msgid "For example, this definition::"
+msgstr ""
+
+msgid " latest = log --limit 5"
+msgstr ""
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+
+msgid " stable5 = latest -b stable"
+msgstr ""
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+
+msgid " echo = !echo $@"
+msgstr ""
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr ""
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+
+msgid ""
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+
+msgid ""
+"\n"
+"``annotate``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when displaying file annotations. All values are\n"
+"Booleans and default to False. See ``diff`` section for related\n"
+"options for the diff command."
+msgstr ""
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+
+msgid ""
+"\n"
+"``auth``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+
+msgid "Each line has the following format::"
+msgstr ""
+
+msgid " <name>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+
+msgid "Supported arguments:"
+msgstr "Unterstützte Argumente:"
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+
+msgid "Pipe example::"
+msgstr "Pipe-Beispiele::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+
+msgid ""
+"\n"
+"``defaults``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr ""
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+
+msgid ""
+"\n"
+"``diff``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified``\n"
+"is a Boolean and defaults to False. See ``annotate`` section for\n"
+"related options for the annotate command."
+msgstr ""
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" Verwende git-erweitertes diff-Format"
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" Zeigt die Funktion, in der die Änderung passiert ist"
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+" Anzahl der anzuzeigenden Kontextzeilen"
+
+msgid ""
+"``email``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Settings for extensions that send email messages."
+msgstr ""
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+
+msgid " Order of outgoing email character sets:"
+msgstr ""
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+
+msgid "Email example::"
+msgstr "Email-Beispiele::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+
+msgid ""
+"\n"
+"``extensions``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"Um eine Erweiterung explizit zu deaktivieren, die von einer allgemeineren\n"
+"hgrc aktiviert wurde, setzen Sie ein ! vor den Pfad, also z.B. ``foo = !``."
+
+msgid "Example for ``~/.hgrc``::"
+msgstr "Beispiel ``~/.hgrc``-Datei::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"\n"
+"``format``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+
+msgid ""
+"``graph``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+
+msgid " <branch>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr ""
+
+msgid ""
+" [graph]\n"
+" # 2px width\n"
+" default.width = 2\n"
+" # red color\n"
+" default.color = FF0000"
+msgstr ""
+
+msgid ""
+"``width``\n"
+" Set branch edges width in pixels."
+msgstr ""
+
+msgid ""
+"``color``\n"
+" Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+
+msgid ""
+"``hooks``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string. Hooks can be prioritized\n"
+"by adding a prefix of ``priority`` to the hook name on a new line\n"
+"and setting the priority. The default priority is 0 if\n"
+"not specified."
+msgstr ""
+
+msgid "Example ``.hg/hgrc``::"
+msgstr "Beispiel ``.hg/hgrc``-Datei::"
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # force autobuild hook to run before other incoming hooks\n"
+" priority.incoming.autobuild = 1"
+msgstr ""
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr ""
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+
+msgid "For example::"
+msgstr "Zum Beispiel::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+"``passwd``\n"
+" Optional. Password zur Authentifikation mit einem Proxy-Server."
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+
+msgid ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+
+msgid ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+
+msgid "Example ``~/.hgrc``::"
+msgstr "Beispiel ``.hgrc``-Datei::"
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"\n"
+"``patch``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+
+msgid ""
+"\n"
+"``paths``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+
+msgid ""
+"``phases``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Specifies default handling of phases. See :hg:`help phases` for more\n"
+"information about working with phases."
+msgstr ""
+
+msgid ""
+"``publish``\n"
+" Controls draft phase behavior when working as a server. When true,\n"
+" pushed changesets are set to public in both client and server and\n"
+" pulled or cloned changesets are set to public in the client.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``new-commit``\n"
+" Phase of newly-created commits.\n"
+" Default: draft"
+msgstr ""
+
+msgid ""
+"``profiling``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+
+msgid ""
+"``type``\n"
+" The type of profiler to use.\n"
+" Default: ls."
+msgstr ""
+
+msgid ""
+" ``ls``\n"
+" Use Python's built-in instrumenting profiler. This profiler\n"
+" works on all platforms, but each line number it reports is the\n"
+" first line of a function. This restriction makes it difficult to\n"
+" identify the expensive parts of a non-trivial function.\n"
+" ``stat``\n"
+" Use a third-party statistical profiler, statprof. This profiler\n"
+" currently runs only on Unix systems, and is most useful for\n"
+" profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+
+msgid ""
+"``format``\n"
+" Profiling format. Specific to the ``ls`` instrumenting profiler.\n"
+" Default: text."
+msgstr ""
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+
+msgid ""
+"``frequency``\n"
+" Sampling frequency. Specific to the ``stat`` sampling profiler.\n"
+" Default: 1000."
+msgstr ""
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+
+msgid ""
+"``revsetalias``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+
+msgid ""
+"``server``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Controls generic server settings."
+msgstr ""
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``preferuncompressed``\n"
+" When set, clients will try to use the uncompressed streaming\n"
+" protocol. Default is False."
+msgstr ""
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+
+msgid ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+
+msgid ""
+"\n"
+"``subpaths``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+
+msgid " <pattern> = <replacement>"
+msgstr ""
+
+msgid ""
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr ""
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr ""
+
+msgid ""
+"Relative subrepository paths are first made absolute, and the the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+
+msgid ""
+"``trusted``\n"
+"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+
+msgid ""
+"\n"
+"``ui``\n"
+"\"\"\"\"\"\""
+msgstr ""
+
+msgid "User interface controls."
+msgstr ""
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+"``commitsubrepos``\n"
+" Angabe, ob veränderte Unterarchive beim Übernehmen des\n"
+" übergeordneten Archivs auch übernommen werden sollen.\n"
+" Falls der Wert False ist und ein Unterarchiv\n"
+" nichtübernommene Änderungen hat, wird die Übernahme\n"
+" abgebrochen.\n"
+" Voreinstellung ist False."
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+
+msgid ""
+"``reportoldssl``\n"
+" Warn if an SSL certificate is unable to be due to using Python\n"
+" 2.5 or earlier. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+"``style``\n"
+" Names des Stils für Befehlsausgabe."
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"\n"
+"``web``\n"
+"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr ""
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+
+msgid "The full set of options is:"
+msgstr "Eine vollständige Liste der Optionen ist::"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates."
+msgstr ""
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has\n"
+" one. On most Linux systems this will be\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+" generate this file manually. The form must be as follows::"
+msgstr ""
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+
+msgid ""
+"``collapse``\n"
+" With ``descend`` enabled, repositories in subdirectories are shown at\n"
+" a single level alongside repositories in the current path. With\n"
+" ``collapse`` also enabled, repositories residing at a deeper level than\n"
+" the current path are grouped behind navigable directory entries that\n"
+" lead to the locations of these repositories. In effect, this setting\n"
+" collapses each collection of repositories found within a subdirectory\n"
+" into a single entry for that subdirectory. Default is False."
+msgstr ""
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+" Port auf dem gehorcht wird (Voreinstellung: 8000)"
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+"``prefix``\n"
+" Pfadpräfix von dem ausgeliefert wird (Voreinstellung: Serverwurzel '/')"
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+"``style``\n"
+" Zu verwendender Stil"
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "Einige Befehle erlauben dem Benutzer ein Datum anzugeben, z.B.:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: Angabe des Versionsdatums.\n"
+"- log, revert, update: Selektion von Revisionen anhand ihres Datums."
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "Viele Datumsformate sind erlaubt. Hier einige Beispiele:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+" ``Wed Dec 6 13:18:29 2006`` (Lokale Zeitzone angenommen)\n"
+" ``Dec 6 13:18 -0600`` (Jahr angenommen, Zeitverschiebung angegeben)\n"
+" ``Dec 6 13:18 UTC`` (UTC und GMT sind Aliase für +0000)\n"
+" ``Dec 6`` (Mitternacht)\n"
+" ``13:18`` (Heute angenommen)\n"
+" ``3:39`` (3:39 morgens angenommen)\n"
+" ``3:39pm`` (15:39)\n"
+" ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+" ``2006-12-6 13:18``\n"
+" ``2006-12-6``\n"
+" ``12-6``\n"
+" ``12/6``\n"
+" ``12/6/6`` (Dec 6 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "Schließlich gibt es Mercurials internes Format:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"Dies ist das interne Darstellungsformat für Daten. \"Unixzeit\" ist die\n"
+"Anzahl von Sekunden seit der UNIX Epoche (1970-01-01 00:00 UTC).\n"
+"Abgesetzt davon steht die Verschiebung zur lokalen Zeitzone in Sekunden\n"
+"westlich der UTC (negativ wenn die Zeitzone östlich der UTC ist)."
+
+msgid "The log command also accepts date ranges:"
+msgstr "Der log-Befehl akzeptiert auch Datumsbereiche:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+" ``<DATUM`` - an oder vor einem/r angegebenen Datum/Uhrzeit\n"
+" ``>DATUM`` - zu oder nach einem/r angegebenen Datum/Uhrzeit\n"
+" ``DATUM to DATUM`` - ein Datumsbereich, inklusive\n"
+" ``-TAGE`` - innerhalb der angegebenen Anzahl von Tagen vor heute\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+"Das Vorgabeformat von Mercurial für das Anzeigen von Änderungen\n"
+"zwischen zwei Versionen einer Datei ist mit dem Unified-Format von GNU\n"
+"diff kompatibel und kann mit GNU patch und vielen anderen\n"
+"Standard-Werkzeugen genutzt werden."
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+"Obwohl das Standarformat oft ausreichend ist, kodiert es nicht die\n"
+"folgenden Informationen:"
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+"- Ausführbarkeit und andere Berechtigungen\n"
+"- Kopier- oder Verschiebeoperationen\n"
+"- Änderungen in Binärdateien\n"
+"- Erstellen/Löschen leerer Dateien"
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+"Mercurial unterstützt auch das erweiterte diff-Format vom Git VCS,\n"
+"das diese Einschränkungen nicht aufweist. Das Git-Format wird nicht\n"
+"standardmäßig erzeugt, da einige weit verbreitete Werkzeuge es noch\n"
+"nicht unterstützen."
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+"Das bedeutet, dass beim Erzeugen von Diffs für ein Mercurial\n"
+"Projektarchiv (z.B. mit :hg:`export`) auf Operationen wie Kopieren,\n"
+"Verschieben und die anderen oben genannten Dinge achten sollte,\n"
+"da beim Anwenden eines Standard-Diffs auf ein anderes Projektarchiv\n"
+"diese Zusatzinformationen verlorengehen. Mercurials interne Operationen\n"
+"(wie Push und Pull) sind davon nicht betroffen, da sie ein internes,\n"
+"binäres Format zur Kommunikation verwenden."
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+"Um Mercurial dazu zu bringen, das erweiterte Git-Format zu erzeugen,\n"
+"kann man entweder den für viele Befehle verfügbaren Schalter --git\n"
+"verwenden werden oder 'git = True' im Abschnitt [diff] in der\n"
+"Konfigurationsdatei angeben. Wenn Diffs in diesem Format importiert oder\n"
+"mit der mq Erweiterung genutzt werden, muss diese Option nicht angegeben\n"
+"werden.\n"
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+"HG\n"
+" Pfad zur 'hg' Programmdatei, wird automatisch beim Ausführen von\n"
+" Hooks, Erweiterungen oder externen Werkzeugen übergeben. Wenn nicht\n"
+" gesetzt oder leer, wird der Name der hg Programmdatei genommen,\n"
+" wenn dieser eingefroren ist, oder eine Programmdatei namens 'hg'\n"
+" (mit $PATHEXT% [standardmäßig auf COM/EXE/BAT/CMD gesetzt] als\n"
+" Erweiterung unter Windows) gesucht."
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+"HGEDITOR\n"
+" Dies ist der Name des Editors, der zum Bearbeiten der Versions-"
+"Meldung verwendet wird. Siehe auch EDITOR."
+
+msgid " (deprecated, use configuration file)"
+msgstr " (veraltet, benutze Konfigurationsdatei)"
+
+#, fuzzy
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+"HGENCODING\n"
+" Dies überschreibt die von Mercurial ermittelte Vorgabe-\n"
+" Lokalisierung. Diese Einstellung wird zum Konvertieren von\n"
+" Benutzernamen, Versions-Meldungen, Etiketten und Zweigen. Diese\n"
+" Einstellung kann über den Schalter --encoding überschrieben werden."
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+"HGENCODINGMODE\n"
+" Dieses steuert, wie sich Mercurial beim Auftreten unbekannter Zeichen\n"
+" verhält, wenn es Benutzereingaben verarbeitet. Die Voreinstellung ist\n"
+" \"strict\", das zu einem Abbruch führt, wenn ein Zeichen nicht erkannt\n"
+" werden konnte. Andere Einstellungen sind \"replace\", das unbekannte\n"
+" Zeichen ersetzt, und \"ignore\", das diese Zeichen verwirft. Diese\n"
+" Einstellung kann über den Schalter --encondingmode auf der\n"
+" Kommandozeile überschrieben werden."
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+"HGMERGE\n"
+" Die Programmdatei, die zum Lösen von Konflikten verwendet werden\n"
+" soll. Das Programm wird mit drei Argumenten aufgerufen: die lokale\n"
+" Datei, die entfernte Datei und die Vorgängerdatei."
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+"HGRCPATH\n"
+" Eine Liste von Dateien oder Verzeichnissen, in denen nach "
+"Konfigurations-\n"
+" dateien gesucht werden soll. Als Trenner zwischen zwei Elementen\n"
+" dient \":\" unter Unix und \";\" unter Windows. Wenn HGRCPATH nicht\n"
+" gesetzt ist, wird der plattformspezifische Standardwert verwendet.\n"
+" Wenn die Variable gesetzt, aber leer ist, wird nur .hg/hgrc aus dem\n"
+" aktuellen Projektarchiv ausgewertet."
+
+msgid " For each element in HGRCPATH:"
+msgstr " Für jedes Element in HGRCPATH gilt:"
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+" - Wenn es ein Verzeichnis ist, werden alle Dateien, die auf .rc\n"
+" enden, hinzugefügt.\n"
+" - Ansonsten wird die Datei selbst hinzugefügt."
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+"HGUSER\n"
+" Diese Angabe wird als Autor von Commits verwendet. Wenn sie nicht\n"
+" gesetzt ist, werden die verfügbaren Werte in der folgenden\n"
+" Reihenfolge ausgewertet:"
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+" - HGUSER (veraltet)\n"
+" - Konfigurationsdateien aus dem HGRCPATH\n"
+" - EMAIL\n"
+" - Wert aus einer ineraktiven Eingabeaufforderung\n"
+" - LOGNAME (mit angefügtem ``@hostname``)"
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"EMAIL\n"
+" Kann als Autor eines Commits verwendet werden; siehe auch HGUSER."
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"LOGNAME\n"
+" Kann als Autor eines Commits verwendet werden; siehe auch HGUSER."
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+"VISUAL\n"
+" Dies ist der Name des Editors, der beim Erzeugen eines Commits\n"
+" verwendet werden soll. Siehe auch EDITOR."
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+"EDITOR\n"
+" Manchmal muss Mercurial eine Textdatei in einem Editor öffnen, damit\n"
+" der Nutzer sie bearbeiten kann, zum Beispiel wenn eine Versionsmeldung\n"
+" geschrieben wird. Der verwendete Editor wird aus den drei Umgebungs-\n"
+" variablen HGEDITOR, VISUAL und EDITOR (in dieser Reihenfolge) "
+"ermittelt.\n"
+" Der erste nicht-leere wird verwendet. Wenn alle Angaben leer sind,\n"
+" wird die Voreinstellung 'vi' verwendet."
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+"PYTHONPATH\n"
+" Dies wird von Python genutzt, um importierte Module zu finden, und\n"
+" muss entsprechend angepasst werden, wenn Mercurial nicht\n"
+" systemweit installiert ist.\n"
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"Mercurial hat die Fähigkeit, neue Funktionen über Erweiterungen\n"
+"einzubinden. Erweiterungen können neue Befehle oder Schalter für\n"
+"bestehende Befehle hinzufügen, das Vorgabeverhalten ändern\n"
+"oder Hooks implementieren."
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"Erweiterungen werden aus einer Vielzahl von Gründen nicht standardmäßig\n"
+"geladen: Sie können die Startzeit verlängern; sie können nur für\n"
+"erweiterte Nutzung gedacht sein; sie können möglicherweise gefährliche\n"
+"Fähigkeiten (wie das Zerstören oder Verändern der Projektgeschichte)\n"
+"bereitstellen; sie können noch nicht für den allgemeinen Einsatz bereit\n"
+"sein; oder sie verändern das übliche Verhalten des Kerns von Mercurial.\n"
+"Daher müssen Erweiterungen erst vom Benutzer bei Bedarf aktiviert werden."
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"Um die Erweiterung \"foo\", die entweder mit Mercurial ausgeliefert wird\n"
+"oder sich im Python-Suchpfad befindet, zu aktivieren, erstellen Sie einen\n"
+"Eintrag wie den folgenden in Ihrer Konfigurationsdatei::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr "Sie können auch den vollen Pfad zu einer Erweiterung angeben::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" meinefunktion = ~/.hgext/meinefunktion.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"Um eine Erweiterung explizit zu deaktivieren, die von einer allgemeineren\n"
+"Konfigurationsdatei aktiviert wurde, setzen Sie ein ! vor den Pfad::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # deaktiviert die Erweiterung bar, die im Verzeichnis\n"
+" # /pfad/zur/erweiterung/bar.py liegt bar = !/pfad/zur/erweiterung/bar.py\n"
+" # ditto, aber es wurde kein Pfad für die Erweiterung baz angegeben\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr ""
+"Mercurial unterstützt eine funktionale Sprache, um eine Liste von\n"
+"Dateien auszuwählen."
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+"Dieses Muster ist (wie andere Dateimuster) durch ein Präfix angegeben:\n"
+"'set:'. Die Sprache unterstützt eine Reihe von Prädikaten, die über Infix-\n"
+"Operatoren miteinander verbunden werden. Klammern können zur\n"
+"Gruppierung verwendet werden."
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+"Bezeichner wie Dateinamen oder -muster müssen mit einfachen oder doppelten\n"
+"Anführungszeichen umgeben werden, wenn sie Zeichen außerhalb von\n"
+"``[._a-zA-Z0-9\\x80-\\xff]`` oder wenn sie einem der vordefinierten\n"
+"Prädikate entsprechen. Sonderzeichen können in Bezeichnern mit\n"
+"Anführungszeichen verwendet werden, indem sie \\-maskiert werden, z.B.\n"
+"wird ``\\n`` als Zeilenumbruch interpretiert."
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr "Es gibt einen einzigen Präfix-Operator:"
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Änderungssätze, die nicht in x enthalten sind. Kurzform ist ``! x``."
+
+msgid "These are the supported infix operators:"
+msgstr "Dies sind die unterstützten Infix-Operatoren:"
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" Die Schnittmenge der Änderungssätze aus x und y. Kurzform ist ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" Die Vereinigung der Änderungssätze aus x und y. Es gibt zwei\n"
+" alternative Kurzformen: ``x | y`` und ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Änderungssätze in x, aber nicht in y."
+
+msgid "The following predicates are supported:"
+msgstr "Die folgenden Prädikate werden unterstützt:"
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr "Einige Beispiel-Anfragen:"
+
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr ""
+"- Zeigt den Status von als binär erkannten Dateien im Arbeitsverzeichnis::"
+
+msgid " hg status -A \"set:binary()\""
+msgstr ""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr "- Vergiss Dateien die in .hgignore, aber bereits versioniert sind::"
+
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr ""
+
+msgid "- Find text files that contain a string::"
+msgstr ""
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr ""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr ""
+
+msgid " hg locate \"set:**.c and not encoding('UTF-8')\""
+msgstr ""
+
+msgid "- Revert copies of large binary files::"
+msgstr ""
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr ""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr ""
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr ""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+"Lesezeichen\n"
+" Lesezeichen sind Zeiger auf bestimmte Versionen, die mitwandern,\n"
+" wenn eine neuen Version erzeugt wird. Ähnlich wie Etiketten, können\n"
+" Lesezeichen überall, wo Mercurial eine Änderungssatz-ID erwartet\n"
+" angeben, z.B. bei :hg:`update`. Im Unterschied zu Etiketten wandern\n"
+" Lesezeichen auf neue erstellte Revisionen im Zweig."
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+" Lesezeichen können umbenannt, kopiert und gelöscht werden. Sie sind\n"
+" nur lokal, wenn sie nicht explizit zwischen Archiven übertragen werden.\n"
+" Die Ãœbertragung von Lesezeichen (push oder pull) erlaubt die Zusammen-\n"
+" arbeit auf einem Entwicklungszweig, ohne ihn als Zweig zu benennen."
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (Verb) Anheben des Arbeitsverzeichnisses auf die angegebene Revision.\n"
+" Siehe :hg:`help update`."
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Head, closed branch'"
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Draft\n"
+" Changesets in the draft phase have not been shared with publishing\n"
+" repositories and may thus be safely changed by history-modifying\n"
+" extensions. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+"Kopf\n"
+" Der Begriff 'Kopf' bezeichnet je nach Kontext einen Zweigkopf oder\n"
+" einen Archivkopf. Siehe 'Kopf, Zweig' und 'Kopf, Archiv' für die\n"
+" entsprechende Definition."
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+" Typischerweise findet die Entwicklung an Köpfen statt und sie sind\n"
+" häufig Ziel von Aktualisierungen und Zusammenführungen."
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+"Kopf, Zweig\n"
+" Ein Änderungssatz ohne Nachfahren im selben benannten Zweig."
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+"Kopf, geschlossener Zweig\n"
+" Ein Änderungssatz, der einen Zweig als nunmehr uninteressant markiert.\n"
+" Der (schliessende) Kopf wird nicht mehr von :hg:`heads` angezeigt.\n"
+" Ein Zweig gilt als geschlossen, wenn all dessen Köpfe geschlossen sind,\n"
+" und wird nicht mehr von :hg:`branches` gezeigt."
+
+msgid ""
+" Closed heads can be re-opened by committing new changeset as the\n"
+" child of the changeset that marks a head as closed."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+"Kopf, Archiv\n"
+" Ein topologischer Kopf, der noch nicht geschlossen wurde."
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+"Kopf, topologisch\n"
+" Ein Änderungssatz ohne Nachfahren im Archiv."
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+"Benannter Zweig\n"
+" Siehe 'Zweig, benannt'."
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Phase\n"
+" A per-changeset state tracking how the changeset has been or\n"
+" should be shared. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Public\n"
+" Changesets in the public phase have been shared with publishing\n"
+" repositories and are therefore considered immutable. See :hg:`help\n"
+" phases`."
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Secret\n"
+" Changesets in the secret phase may not be shared via push, pull,\n"
+" or clone. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+"Vorfahr des Arbeitsverzeichnisses\n"
+" Siehe 'Vorfahr, Arbeitsverzeichnisses'.\n"
+
+msgid ""
+"Synopsis\n"
+"--------"
+msgstr ""
+"Zusammenfassung\n"
+"-------"
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+
+msgid ""
+"Description\n"
+"-----------"
+msgstr ""
+"Beschreibung\n"
+"-----------"
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+"Eine ignore-Datei ist eine Textdatei, die aus einer Liste von Dateimustern\n"
+"besteht, mit einem Ausdruck pro Zeile. Leere Zeilen werden übersprungen.\n"
+"Das ``#``-Zeichen wird als Kommentarzeichen behandelt und das \n"
+"``\\``-Zeichen als Escape-Zeichen."
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+"Mercurial unterstützt verschiedene Dateimuster-Syntaxen. Im Normalfall\n"
+"werden Python/Perl-artige Reguläre Ausdrücke verwendet."
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr "Die folgende Zeile ändert die von diesem Punkt an verwendete Syntax::"
+
+msgid " syntax: NAME"
+msgstr " Syntax: NAME"
+
+msgid "where ``NAME`` is one of the following:"
+msgstr "wobei ``NAME`` einer der folgenden ist:"
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+"Die gewählte Syntax wird auf auf alle folgenden Muster angewendet\n"
+"bis eine andere Syntax ausgewählt wird."
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" Patterns specified in other than ``.hgignore`` are always rooted.\n"
+" Please see :hg:`help patterns` for details."
+msgstr ""
+
+msgid ""
+"Example\n"
+"-------"
+msgstr ""
+
+msgid "Here is an example ignore file. ::"
+msgstr ""
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a collection of them. In the latter case, a special\n"
+"configuration file can be used to specify the repository paths to use\n"
+"and global web configuration options."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files,\n"
+"but only the following sections are recognized:"
+msgstr ""
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+
+msgid ""
+"The ``web`` section can specify all the settings described in the web\n"
+"section of the hgrc(5) documentation. See :hg:`help config` for\n"
+"information on where to find the manual page."
+msgstr ""
+
+msgid ""
+"The ``paths`` section provides mappings of physical repository\n"
+"paths to virtual ones. For instance::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" projects/a = /foo/bar\n"
+" projects/b = /baz/quux\n"
+" web/root = /real/root/*\n"
+" / = /real/root2/*\n"
+" virtual/root2 = /real/root2/**"
+msgstr ""
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry maps every Mercurial repository found in '/real/root'\n"
+" into 'web/root'. This format is preferred over the [collections] one,\n"
+" since using absolute paths as configuration keys is not supported on "
+"every\n"
+" platform (especially on Windows).\n"
+"- The fourth entry is a special case mapping all repositories in\n"
+" '/real/root2' in the root of the virtual directory.\n"
+"- The fifth entry recursively finds all repositories under the real\n"
+" root, and maps their relative paths under the virtual root."
+msgstr ""
+
+msgid ""
+"The ``collections`` section provides mappings of trees of physical\n"
+"repositories paths to virtual ones, though the paths syntax is generally\n"
+"preferred. For instance::"
+msgstr ""
+
+msgid ""
+" [collections]\n"
+" /foo = /foo"
+msgstr ""
+" [collections]\n"
+" /foo = /foo"
+
+msgid ""
+"Here, the left side will be stripped off all repositories found in the\n"
+"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+"``bar`` and ``quux/baz`` respectively.\n"
+msgstr ""
+"Hier wird die linke Seite von allen Projektarchiven, die auf der rechten\n"
+"Seite gefunden werden, entfernt. Daher werden ``/foo/bar`` und\n"
+"``foo/quux/baz`` als ``bar`` und ``quux/baz`` aufgelistet.\n"
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ".. internaltoolsmarker"
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+"Wenn Mercurial mehr als eine Revision annimmt, können sie einzeln oder als\n"
+"topologisch kontinuierlicher Bereich getrennt durch das \":\" Zeichen\n"
+"angegeben werden."
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+"Die Syntax der Bereichs-Notation ist [ANFANG]:[ENDE], wobei ANFANG und ENDE\n"
+"Revisions-Identifikatoren sind. Sowohl ANFANG als auch ENDE sind optional.\n"
+"Sollte ANFANG nicht angegeben werden, wird standardmäßig die Revision 0\n"
+"angenommen. Wenn ENDE nicht angegeben wird, wird standardmäßig die Spitze\n"
+"genommen. Der Bereich \":\" bedeutet daher \"alle Revisionen\"."
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+"Wenn ANFANG größer als ENDE ist, werden die Revisionen in umgekehrter\n"
+"Reihenfolge betrachtet."
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+"Ein Bereich fungiert als geschlossenes Intervall. Das heißt, dass der\n"
+"Bereich 3:5 die Revisionen 3, 4 und 5 enthält. Ebenso enthält der Bereich\n"
+"9:6 die Revisionen 9, 8, 7 und 6.\n"
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+"Mercurial akzeptiert verschiedene Schreibweisen zur Identifikation einer\n"
+"oder mehrerer Dateien gleichzeitig."
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+"Standardmäßig behandelt Mercurial-Dateinamen wie erweiterte \"Glob\"-Muster\n"
+"der Shell (shell-style extended glob patterns)."
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr "Andere Schreibweisen von Mustern müssen explizit angegeben werden."
+
+msgid ""
+".. note::\n"
+" Patterns specified in ``.hgignore`` are not rooted. \n"
+" Please see :hg:`help hgignore` for details."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+"Mit dem Prefix ``path:`` wird ein Pfad relativ zur Wurzel des "
+"Projektarchivs\n"
+"ohne Mustererkennung angenommen."
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+"Für erweiterte Glob-Muster muss das Muster mit ``glob:`` beginnen. Globs\n"
+"sind am aktuellen Verzeichnis verankert; ein Glob-Muster wie ````*.c````\n"
+"stimmt nur mit Dateien im aktuellen Verzeichnis überein, die mit ``.c``\n"
+"enden."
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+"Die unterstützen Erweiterungen der Glob-Syntax sind ``**`` für\n"
+"Zeichenketten über Pfadtrenner hinweg und ``{a,b}`` in der Bedeutung \"a\n"
+"oder b\"."
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+"Zur Nutzung von regulären Ausdrücken (Perl/Python) beginne einen Namen mit\n"
+"``re:``. Erkennung mit regulären Ausdrücken ist relativ zur Wurzel des\n"
+"Projektarchivs."
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr "Einfache Beispiele::"
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+" path:foo/bar eine Datei bar in einem Verzeichnis foo an der Wurzel\n"
+" des Projektarchivs\n"
+" path:path:name eine Datei oder ein Verzeichnis mit dem Namen \"path:name\""
+
+msgid "Glob examples::"
+msgstr "Glob-Beispiele::"
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+" glob:*.c jeder Name endend mit \".c\" im aktuellen Verzeichnis\n"
+" *.c jeder Name endend mit \".c\" im aktuellen Verzeichnis\n"
+" **.c jeder Name endend mit \".c\" im aktuellen Verzeichnis\n"
+" und jedem Unterverzeichnis\n"
+" foo/*.c jeder Name endend mit \".c\" im Verzeichnis foo\n"
+" foo/**.c jeder Name endend mit \".c\" im Verzeichnis foo\n"
+" und jedem Unterverzeichnis."
+
+msgid "Regexp examples::"
+msgstr "Beispiel mit regulärem Ausdruck::"
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr " re:.*\\.c$ jeder Name endend mit \".c\" überall im Projektarchiv"
+
+msgid "File examples::"
+msgstr "Datei-Beispiele::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr ""
+
+msgid ""
+"What are phases?\n"
+"----------------"
+msgstr ""
+
+msgid ""
+"Phases are a system for tracking which changesets have been or should\n"
+"be shared. This helps prevent common mistakes when modifying history\n"
+"(for instance, with the mq or rebase extensions)."
+msgstr ""
+
+msgid "Each changeset in a repository is in one of the following phases:"
+msgstr ""
+"Jeder Änderungssatz in einem Projektarchiv ist in einer der folgenden Phasen:"
+
+msgid ""
+" - public : changeset is visible on a public server\n"
+" - draft : changeset is not yet published\n"
+" - secret : changeset should not be pushed, pulled, or cloned"
+msgstr ""
+
+msgid ""
+"These phases are ordered (public < draft < secret) and no changeset\n"
+"can be in a lower phase than its ancestors. For instance, if a\n"
+"changeset is public, all its ancestors are also public. Lastly,\n"
+"changeset phases should only be changed towards the public phase."
+msgstr ""
+
+msgid ""
+"How are phases managed?\n"
+"-----------------------"
+msgstr ""
+"Wie werden Phasen verwaltet?\n"
+"--------------------------"
+
+msgid ""
+"For the most part, phases should work transparently. By default, a\n"
+"changeset is created in the draft phase and is moved into the public\n"
+"phase when it is pushed to another repository."
+msgstr ""
+
+msgid ""
+"Once changesets become public, extensions like mq and rebase will\n"
+"refuse to operate on them to prevent creating duplicate changesets.\n"
+"Phases can also be manually manipulated with the :hg:`phase` command\n"
+"if needed. See :hg:`help -v phase` for examples."
+msgstr ""
+
+msgid ""
+"Phases and servers\n"
+"------------------"
+msgstr ""
+"Phasen und Server\n"
+"--------------------------"
+
+msgid "Normally, all servers are ``publishing`` by default. This means::"
+msgstr ""
+
+msgid ""
+" - all draft changesets that are pulled or cloned appear in phase\n"
+" public on the client"
+msgstr ""
+
+msgid ""
+" - all draft changesets that are pushed appear as public on both\n"
+" client and server"
+msgstr ""
+
+msgid " - secret changesets are neither pushed, pulled, or cloned"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" Pulling a draft changeset from a publishing server does not mark it\n"
+" as public on the server side due to the read-only nature of pull."
+msgstr ""
+
+msgid ""
+"Sometimes it may be desirable to push and pull changesets in the draft\n"
+"phase to share unfinished work. This can be done by setting a\n"
+"repository to disable publishing in its configuration file::"
+msgstr ""
+
+msgid ""
+" [phases]\n"
+" publish = False"
+msgstr ""
+" [phases]\n"
+" publish = False"
+
+msgid "See :hg:`help config` for more information on config files."
+msgstr ""
+"Siehe :hg:`help config` für weitere Informationen über Konfigurationsdateien."
+
+msgid ""
+".. note::\n"
+" Servers running older versions of Mercurial are treated as\n"
+" publishing."
+msgstr ""
+
+msgid ""
+"Examples\n"
+"--------"
+msgstr ""
+"Beispiele\n"
+"----------"
+
+msgid " - list changesets in draft or secret phase::"
+msgstr ""
+
+msgid " hg log -r \"not public()\""
+msgstr " hg log -r \"not public()\""
+
+msgid " - change all secret changesets to draft::"
+msgstr ""
+
+msgid " hg phase --draft \"secret()\""
+msgstr ""
+
+msgid ""
+" - forcibly move the current changeset and descendants from public to draft::"
+msgstr ""
+
+msgid " hg phase --force --draft ."
+msgstr ""
+
+msgid " - show a list of changeset revision and phase::"
+msgstr ""
+
+msgid " hg log --template \"{rev} {phase}\\n\""
+msgstr ""
+
+#, fuzzy
+msgid " - resynchronize draft changesets relative to a remote repository::"
+msgstr ""
+" - Änderungssätze in der Entwurfsphase (draft) erneut bezüglich eines "
+"entfernten Projektarchivs synchronisieren::"
+
+msgid " hg phase -fd 'outgoing(URL)' "
+msgstr ""
+
+msgid ""
+"See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr ""
+"Siehe :hg:`help phase` für mehr Informationen über die manuelle Manipulation "
+"von Phasen.\n"
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr "Mercurial unterstützt mehrere Arten individuelle Revisionen anzugeben."
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+"Eine einfache Ganzzahl wird als Revisionsnummer behandelt. Negative Zahlen\n"
+"beschreiben den topologischen Abstand von der Spitze (tip), wobei -1 die\n"
+"Spitze selbst, und -2 dessen direkter Vorfahr ist."
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr "Eine 40-stellige Hexadezimalzahl gilt als eindeutige Revisions-ID."
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+"Eine Hexadezimalzahl mit weniger als 40 Zeichen wird als eindeutiger\n"
+"Bezeichner einer Revision angesehen und wird Kurzform-Bezeichner\n"
+"genannt. Ein Kurzform-Bezeichner ist nur gültig, wenn er ein Präfix\n"
+"der Langform genau einer Revisions-ID ist."
+
+msgid ""
+"Any other string is treated as a bookmark, tag, or branch name. A\n"
+"bookmark is a movable pointer to a revision. A tag is a permanent name\n"
+"associated with a revision. A branch name denotes the tipmost revision\n"
+"of that branch. Bookmark, tag, and branch names must not contain the \":\"\n"
+"character."
+msgstr ""
+"Jede andere Zeichenfolge wird als Lesezeichen, oder Name eines Etiketts\n"
+"oder Zweiges behandelt. Ein Lesezeichen ist ein beweglicher Zeiger auf eine\n"
+"Revision. Ein Etikett ist ein permanenter Name für eine Revision.\n"
+"Ein Zweigname bezeichnet hier die jüngste Kopfrevision des Zweigs.\n"
+"Lesezeichen, Etiketten und Zweignamen dürfen das Zeichen \":\" nicht "
+"enthalten."
+
+msgid "The reserved name \"tip\" always identifies the most recent revision."
+msgstr "Der reservierte Name \"tip\" identifiziert immer die neueste Revision."
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+"Der reservierte Name \"null\" bezeichnet die null-Revision. Sie ist die\n"
+"Revision eines leeren Projektarchivs und der Vorgänger der Revision 0."
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+"Der reservierte Name \".\" bezeichnet die Vorgängerversion des\n"
+"Arbeitsverzeichnisses. Falls das Arbeitsverzeichnis leer ist, ist dies\n"
+"äquivalent zu \"null\". Falls eine nicht gespeicherte Zusammenführung\n"
+"in Bearbeitung ist, bezeichnet \".\" die Revision des ersten Vorgängers.\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+"Mercurial unterstützt eine funtionale Sprache, um eine Menge von\n"
+"Revisionen auszuwählen."
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+"Die Sprache unterstützt eine Reihe von Prädikaten, die über Infix-\n"
+"Operatoren miteinander verbunden werden. Klammern können zur\n"
+"Gruppierung verwendet werden."
+
+msgid ""
+"Identifiers such as branch names may need quoting with single or\n"
+"double quotes if they contain characters like ``-`` or if they match\n"
+"one of the predefined predicates."
+msgstr ""
+"Bezeichner wie Zweignamen müssen mit einfachen oder doppelten\n"
+"Anführungszeichen umgeben werden, wenn sie Zeichen wie ``-``\n"
+"enthalten oder wenn sie einem der vordefinierten Prädikateņ\n"
+"entsprechen."
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Änderungssätze, die nicht in x enthalten sind. Kurzform von ``! x``."
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+"``x::y``\n"
+" Ein DAG-Bereich, d.h. alle Änderungssätze, die Nachkommen von X und\n"
+" Vorfahren von y sind, inklusive x und y selbst. Wenn der erste\n"
+" Enpunkt ausgelassen wird, ist dies äquivalent zu ``ancestors(y)``,\n"
+" wenn der zweite ausgelassen wird, entspricht dies ``descendants(x)``."
+
+msgid " An alternative syntax is ``x..y``."
+msgstr " Eine alternative Syntax ist ``x..y``."
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+"``x:y``\n"
+" Alle Änderungssätze mit Revisionsnummern zwischen x und y, beide jeweils\n"
+" inklusive. Jede der beiden Begrenzung kann ausgelassen werden, sie\n"
+" entsprechen 0 und tip."
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" Die Schnittmenge der Änderungssätze aus x und y. Kurzform ist ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" Die Vereinigung der Änderungssätze aus x und y. Es gibt zwei\n"
+" alternative Kurzformen: ``x | y`` und ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Änderungssätze in x, aber nicht in y."
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+
+msgid "There is a single postfix operator:"
+msgstr "Es gibt einen einzigen Postfix-Operator:"
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+"\n"
+"Die folgenden Prädikate werden unterstützt:"
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+
+msgid " <alias> = <definition>"
+msgstr ""
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+
+msgid "For example,"
+msgstr "Zum Beispiel,"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr "Äquivalente Kommandozeilen-Befehle für :hg:`log`::"
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+
+msgid "- Changesets on the default branch::"
+msgstr "- Änderungssätze auf dem Vorgabezweig (default)::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr ""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr ""
+
+msgid "- Open branch heads::"
+msgstr "- Offene Zweigköpfe::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr ""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr ""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr ""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+"Mercurial unterstützt im Augenblick Mercurial-, Git- und Subversion-\n"
+"Unterarchive."
+
+msgid "Subrepositories are made of three components:"
+msgstr "Unterarchive bestehen aus drei Komponenten:"
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+"1. Verschachtelte Archivaktualisierungen. Sie können überall im\n"
+" übergeordneten Arbeitsverzeichnis auftauchen."
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+" should be placed in the root of working directory, and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+"2. Verschachtelte Archivreferenzen. Sie werden in ``.hgsub`` definiert, "
+"was in der Wurzel des Arbeitsverzeichnisses abgelegt werden sollte,\n"
+" und geben an, wo Aktualisierungen für Unterarchive herkommen.\n"
+" Mercurial-Unterarchive werden wie folgt angegeben:"
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr ""
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+" is placed in the root of working directory, and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"----------------------"
+msgstr ""
+"\n"
+"Hinzufügen eines Unterarchivs\n"
+"-----------------------------"
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+"Wenn ``.hgsub`` nicht existiert, wird die Datei erstellt und dem "
+"übergeordneten Archiv hinzugefügt. Erstellen Sie eine Arbeitskopie\n"
+"(beispielsweise mit clone oder checkout) der externen Projekte dort,\n"
+"wo sie im übergeordneten Projektarchiv liegen soll. Bearbeiten Sie\n"
+"``.hgsub`` und fügen Sie den Unterarchiv-Eintrag wie oben beschrieben\n"
+"hinzu. Anschließend wird das Unterarchiv überwacht und bei der \n"
+"nächsten Übernahme wird sein Stand in ``.hgsubstate`` erfasst\n"
+"und an die übernommene Änderung gebunden."
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"-----------------------------"
+msgstr ""
+"Synchronisieren eines Unterarchivs\n"
+"----------------------------------"
+
+#, fuzzy
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+"Unterarchive übernehmen nicht automatisch den neuesten Änderungssatz\n"
+"ihrer Quellen. Stattdessen werden sie auf die Version aktualisiert,\n"
+"die der Version des übergeordneten Änderungssatzes entspricht.\n"
+"Dies geschieht, damit Entwickler immer eine konsistente Menge von\n"
+"Code und Bibliotheken erhalten, wenn sie aktualisieren."
+
+#, fuzzy
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+"Deshalb ist die Aktualisierung von Unterarchiven ein manueller Prozess.\n"
+"Erstellen Sie dazu einfach eine neue Arbeitskopie des Unterarchivs in\n"
+"der gewünschten Revision, testen Sie das übergeordnete Archiv und\n"
+"übernehmen sie das übergeordnete Projektarchiv, um die neue Kombination\n"
+"zu erfassen."
+
+msgid ""
+"Deleting a Subrepository\n"
+"------------------------"
+msgstr ""
+"Löschen eines Unterarchivs\n"
+"--------------------------"
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+"Um ein Unterarchiv aus seinem Elternarchiv zu entfernen, löschen Sie\n"
+"seine Verweise aus ``.hgsub`` und seine Dateien."
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"-----------------------------------"
+msgstr ""
+"Interaktion mit Mercurial-Befehlen\n"
+"----------------------------------"
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. However, if you specify the full path of a file in a\n"
+" subrepo, it will be added even without -S/--subrepos specified.\n"
+" Git and Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":add: \"add\" behandelt keine Unterarchive, es sei denn, es ist \n"
+" -S/--subrepos angegeben. Wenn Sie allerdings den vollen Pfad\n"
+" einer Datei in einem Unterarchiv angeben, wird sie sogar ohne den \n"
+" -S/--subrepos-Schalter hinzugefügt.\n"
+" Git- und Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+":archive: \"archive\" behandelt keine Unterarchive, es sei denn es ist\n"
+" -S/--subrepos angegeben."
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+":commit: \"commit\" erzeugt einen konsistenten Schnappschuss des\n"
+" Standes des gesamten Projekts und seiner Unterarchive. Falls\n"
+" Unterarchive modifiziert wurden, bricht Mercurial ab.\n"
+" Statt dessen kann Mercurial auch dazu gebracht werden, alle\n"
+" modifizierten Unterarchive zu übernehmen, indem -S/--subrepos\n"
+" angegeben wird oder \"ui.commitsubrepos=True\" in einer\n"
+" Konfigurations in angegeben wird (siehe :hg:`help config`).\n"
+" Nachdem keine modifizierten Unterarchive mehr vorhanden sind,\n"
+" übernimmt Mercurial ihren Stand und übernimmt ihn schließlich im\n"
+" übergeordneten Projektarchiv."
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":diff: \"diff\" behandelt keine Unterarchive, es sei denn es ist\n"
+" -S/--subrepos angegeben. Änderungen werden wie gewohnt auch für \n"
+" Elemente von Unterarchiven angezeigt.\n"
+" Git- und Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":forget: forget currently only handles exact file matches in subrepos.\n"
+" Git and Subversion subrepositories are currently silently ignored."
+msgstr ""
+":forget: \"forget\" behandelt zur Zeit nur exakte Passungen (matches)\n"
+" in Unterarchiven.\n"
+" Git- und Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":incoming: \"incoming\" behandelt keine Unterarchive, es sei denn es\n"
+" ist -S/--subrepos angegeben.\n"
+" Git- und Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":outgoing: \"outgoing\" behandelt keine Unterarchive, es sei denn es\n"
+" ist -S/--subrepos angegeben.\n"
+" Git- und Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+":pull: \"pull\" behandelt keine Unterverzeichnisse, weil es nicht klar\n"
+" ist, was abgerufen werden soll, bevor :hg:`update` ausgeführt\n"
+" wird. Alle Änderungen von Unterarchiven zu laden und aufzulisten,\n"
+" auf die von neu abgerufenen Änderungssätzen des übergeordneten\n"
+" Archivs verwiesen wird, ist bestenfalls teuer und unmöglich im\n"
+" Falle von Subversion."
+
+#, fuzzy
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+":push: Mercurial überträgt automatisch zuerst alle Unterverzeichnisse\n"
+" wenn das übergeordnete Archiv übertragen wird. Dies stellt sicher,\n"
+" dass neue Änderungen von Unterarchiven verfügbar sind, wenn sich\n"
+" übergeordnete Archive sich auf sie beziehen.\n"
+" \"push\" ist keine\n"
+" Option für Subversion-Unterarchive."
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":status: \"status\" behandelt keine Unterarchive, es sei denn es ist\n"
+" -S/--subrepos angegeben. Änderungen von Unterarchiven werden \n"
+" als normale Mercurial-Änderungen am Unterverzeichnis angezeigt.\n"
+" Subversion-Unterarchive werden zur Zeit still ignoriert."
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+":update: \"update\" setzt Unterarchive zurück auf den Stand, in dem sie\n"
+" ursprünglich im Zieländerungssatz übernommen wurden. Falls der\n"
+" angegebene Änderungssatz nicht verfügbar ist, ruft Mercurial\n"
+" es zunächst vor der Aktualisierung ab. Das bedeutet, dass die\n"
+" Aktualisierung einen Netzwerk-Zugang benötigt, wenn\n"
+" Unterverzeichnisse verwendet werden."
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"---------------------------------"
+msgstr ""
+"Umleitung der Quellen von Unterarchiven\n"
+"---------------------------------------"
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+"Der Ablageort eines Unterverzeichnisses kann sich während der\n"
+"Lebenszeit eines Projektes ändern, sodass im übergeordneten\n"
+"Archiv gespeicherte Referenzen zerstört werden können. Um dies zu\n"
+"beheben, können in der ``hgrc``-Datei des übergeordneten Archivs\n"
+"oder der Mercurial-Konfiguration Ãœberschreibregeln (rewriting rules)\n"
+"angegeben werden. Siehe ``[subpaths]``-Eintrag in hgrc(5) für mehr\n"
+"Details."
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+"Mercurial erlaubt es Ihnen, die Ausgabe von Befehlen mit Vorlagen\n"
+"anzupassen. Sie können eine Vorlage entweder über die Kommandozeile\n"
+"(über den Schalter --template) angeben, oder einen vorhandenen\n"
+"Vorlagenstil auswählen (--style)."
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+"Sie können die Ausgabe für jeden \"log-ähnlichen\" Befehl anpassen:\n"
+"log, outgoing, incoming, tip, parents, heads und glog."
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+"Vier Stile werden mit Mercurial mitgeliefert: default (der Stil, der\n"
+"genutzt wird, wenn kein anderer explizit angegeben wird), compact,\n"
+"changelog und xml. Benutzung::"
+
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+"Ein Template ist ein Stück Text, der Markierungen enthält, die bei der\n"
+"Ausgabe mit den eigentlichen Informationen ersetzt werden::"
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+"Zeichenketten in geschweiften Klammern werden als Schlüsselwörter\n"
+"bezeichnet. Die Verfügbarkeit von Schlüsselwörtern hängt von dem\n"
+"ausgeführten Befehl ab. Diese Schlüsselwörter stehen üblicherweise für\n"
+"Vorlagen von \"log-ähnlichen\" Befehlen zur Verfügung:"
+
+msgid ".. keywordsmarker"
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+"Das \"date\"-Schlüsselwort erzeugt keine menschenlesbare Ausgabe. Wenn\n"
+"Sie ein Datum in Ihrer Ausgabe verwenden wollen, können Sie einen Filter\n"
+"einsetzen, um es zu verarbeiten. Filter sind Funktionen, die eine\n"
+"Zeichenkette basierend auf der Eingabe-Variablen zurückgeben. Stellen Sie\n"
+"sicher, dass Sie den stringify-Filter zuerst anwenden, wenn Sie einen\n"
+"Filter für Zeichenketten auf eine listenartige Variable anwenden möchten.\n"
+"Sie können auch mehrere Filter verketten, um das gewünschte Ergebnis zu\n"
+"erhalten::"
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+msgid "List of filters:"
+msgstr "Liste aller Filter:"
+
+msgid ".. filtersmarker\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr "Gültige URLs haben folgende Form::"
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+" lokaler/dateisystem/pfad[#revision]\n"
+" file://lokales/dateisystem/pfad[#revision]\n"
+" http://[nutzer[:pass]@]host[:port]/[pfad][#revision]\n"
+" https://[nutzer[:pass]@]host[:port]/[pfad][#revision]\n"
+" ssh://[nutzer@]host[:port]/[pfad][#revision]"
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+"Pfade im lokalen Dateisystem können auf ein Mercurial-Archiv oder Bündel-\n"
+"dateien verweisen (wie sie von :hg:`bundle` oder :hg:`incoming --bundle`\n"
+"erzeugt werden). Siehe auch :hg:`help paths`."
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+"Ein optionaler Bezeichner nach # verweist auf einen bestimmten Zweig,\n"
+"Tag oder Änderungssatz des anderen Projektarchivs. Siehe auch :hg:\n"
+"`help revisions`."
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+"Einige Funktionen, wie das Ãœbertragen an http:// und https:// URLs, sind\n"
+"nur dann möglich, wenn diese Funktionen explizit auf dem entfernten\n"
+"Mercurial-Server aktiviert sind."
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+"Beachten Sie, dass die Sicherheit von HTTPS-URLs von der richtigen "
+"Konfiguration\n"
+"von web.cacerts abhängt."
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr "Einige Hinweise zur Nutzung von SSH mit Mercurial:"
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+"- SSH benötigt einen nutzbaren Shell-Zugang auf der Zielmaschine und eine\n"
+" Kopie von hg im Pfad der entfernten Maschine oder in der Konfiguration\n"
+" remotecmd angegeben.\n"
+"- Der Pfad ist standardmäßig relativ vom Home-Verzeichnis des entfernten\n"
+" Nutzer. Nutze einen zusätzlichen Schrägstrich um einen absoluen Pfad\n"
+" anzugeben::"
+
+msgid " ssh://example.com//tmp/repository"
+msgstr " ssh://example.com//tmp/repository"
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+"- Mercurial nutzt keine eigene Kompressionsmechanismen über SSH; hier "
+"sollte\n"
+" man die Kompression über ~/.ssh/config aktivieren, z.B.::"
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+" Alternativ kann \"ssh -C\" als dein SSH-Befehl in der hgrc oder mit der\n"
+" --ssh Befehlszeilenoption angegeben werden."
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+"Diese URLs können alle in der hgrc als Aliase unter dem Abschnitt [paths]\n"
+"wie folgt abgelegt werden::"
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+"Diese Aliase können dann bei jedem Befehl genutzt werden, der URLs nutzt\n"
+"(z.B. :hg: `pull alias1` würde als :hg: `pull URL1` gewertet werden)."
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+"Es gibt zwei besondere Pfad-Aliase, die standardmäßig genutzt\n"
+"werden wenn einem Befehl keine URL übergeben wurde:"
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+"default:\n"
+" Bei Erstellung eines Projektarchivs mit 'hg clone' sichert der clone-"
+"Befehl\n"
+" die Herkunft des Quellarchivs als 'default'-Pfad des neuen Archivs. "
+"Dieser\n"
+" Pfad wird immer dann genutzt, wenn bei Befehlen wie 'push'- oder 'pull'\n"
+" der Pfad nicht angegeben wurde (auch 'incoming' und 'outgoing')."
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+"default-push:\n"
+" Der 'push'-Befehl sucht nach dem 'default-push'-Alias und zieht\n"
+" diesen dem 'default'-Alias vor, wenn beide definiert sind.\n"
+
+msgid "remote branch lookup not supported"
+msgstr "Auflisten entfernter Zweige wird nicht unterstützt"
+
+msgid "dirstate branch not accessible"
+msgstr ""
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "Unbekannter Zweig '%s'"
+
+msgid "can only share local repositories"
+msgstr "Kann nur lokale Projektarchive teilen"
+
+msgid "destination already exists"
+msgstr "Ziel existiert bereits"
+
+msgid "updating working directory\n"
+msgstr "Aktualisiere Arbeitsverzeichnis\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "Zielverzeichnis: %s\n"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "Ziel '%s' existiert bereits"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "Ziel %s ist nicht leer"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+"Quellarchiv unterstützt keine Revisions-Abfragen und\n"
+"lässt daher das Klonen bis zu einer Revision nicht zu"
+
+msgid "clone from remote to remote not supported"
+msgstr "Klonen von entferntem zu entferntem Projektarchiv nicht möglich"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "Aktualisiere auf Zweig %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+"%d Dateien aktualisiert, %d Dateien zusammengeführt, %d Dateien entfernt, %d "
+"Dateien ungelöst\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "Nutze 'hg resolve', um ungelöste Merges zu wiederholen\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"Nutze 'hg resolve', um ungelöste Merges zu wiederholen\n"
+"oder 'hg update -C .' um aufzugeben\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(Zusammenführen von Zweigen, vergiss nicht 'hg commit' auszuführen)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "Konfigurationsdatei %s nicht gefunden!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "Fehler beim Lesen von %s/.hg/hgrc: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "Fehler beim Zugriff auf Projektarchiv in %s\n"
+
+msgid "SSL support is unavailable"
+msgstr "SSL-Unterstützung ist nicht verfügbar"
+
+msgid "IPv6 is not available on this system"
+msgstr "IPv6 ist auf diesem System nicht verfügbar"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "Kann Server nicht auf '%s:%d' starten: %s"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr ""
+" %d Dateien verändert, %d Zeilen hinzugefügt(+), %d Zeilen entfernt(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr "Rufe Hook %s auf: %s\n"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr "%s-Hook ist ungültig (\"%s\" ist kein Modul)"
+
+msgid "exception from first failed import attempt:\n"
+msgstr "Ausnahme vom ersten fehlgeschlagenen Importversuch:\n"
+
+msgid "exception from second failed import attempt:\n"
+msgstr "Ausnahme vom zweiten fehlgeschlagenen Importversuch:\n"
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr "%s-Hook ist ungültig (Import von \"%s\" schlug fehl)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr "%s-Hook ist ungültig (\"%s\" ist nicht definiert)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr "%s-Hook ist ungültig (\"%s\" ist nicht aufrufbar)"
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr "Fehler: Hook %s schlug fehl: %s\n"
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr "Fehler: Hook %s löste eine Ausnahme aus: %s\n"
+
+#, python-format
+msgid "%s hook failed"
+msgstr "%s-Hook ist fehlgeschlagen"
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr "Warnung: %s-Hook schlug fehl\n"
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr "Führe Hook %s aus: %s\n"
+
+#, python-format
+msgid "%s hook %s"
+msgstr "%s-Hook %s"
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr "Warnung: %s-Hook %s\n"
+
+msgid "kb"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "Ignoriere ungültige [auth] Schlüssel '%s'\n"
+
+msgid "connection ended unexpectedly"
+msgstr "Verbindung wurde unerwartet beendet"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "Nicht unterstützte URL-Komponente: \"%s\""
+
+msgid "operation not supported over http"
+msgstr "Operation wird über HTTP nicht unterstützt"
+
+msgid "authorization failed"
+msgstr "Autorisierung fehlgeschlagen"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "HTTP-Fehler, möglicherweise von einer Proxy-Einstellung verursacht"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "echte Adresse ist %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' scheint kein hg Projektarchiv zu sein:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' sendete einen defekte Content-Type-Kopfzeile (%s)"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' benutzt ein neueres Protokoll %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "Ãœbertragung fehlgeschlagen: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "Python-Unterstützung für SSL und HTTPS ist nicht installiert"
+
+msgid "cannot create new http repository"
+msgstr "Kann neues HTTP-Projektarchiv nicht erzeugen"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "Ignoriere ungültige Syntax '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "Ãœberspringe nicht lesbare ignore-Datei '%s': %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "Projektarchiv %s nicht gefunden"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "Projektarchiv %s existiert bereits"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ".hg/sharedpath zeigt auf nicht existierendes Verzeichnis %s"
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr ""
+"Warnung: Ignoriere unbekannte Elternversion %s des Arbeitsverzeichnisses!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r kann nicht in einem Tagnamen genutzt werden"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "Warnung: Tag %s steht im Konflikt mit existierendem Zweignamen\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+"Arbeitskopie von .hgtags wurde geändert (bitte speichere .hgtags manuell)"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "abgebrochene Transaktion gefunden - bitte führe hg recover aus"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "Setze unterbrochene Transaktion zurück\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "Keine unterbrochene Transaktion vorhanden\n"
+
+msgid "no rollback information available\n"
+msgstr "Keine rollback-Information verfügbar\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "Archivspitze (tip) auf Revision %s zurückgerollt (%s zurück: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "Archivspitze (tip) auf Revision %s zurückgerollt (%s zurück)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "Setze letzte Transaktion zurück\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+
+msgid "use -f to force"
+msgstr "Benutzen Sie -f zum erzwingen"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr ""
+"Benannter Zweig konnte nicht zurückgesetzt werden: aktueller Zweig ist "
+"weiterhin '%s'\n"
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "Arbeitsverzeichnis basiert nun auf Revisionen %d und %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "Arbeitsverzeichnis basiert nun auf Revision %d\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "Warte auf Sperre auf %s gehalten von %r\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "Projektarchiv %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "Arbeitsverzeichnis von %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"Das Zusammenführen kann nicht teilweise gespeichert werden (gib keine "
+"Dateien oder Muster an)"
+
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "Ohne neues Unterarchiv %s übernehmen"
+
+msgid "use --subrepos for recursive commit"
+msgstr ""
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "Kann Unterarchiv nicht ohne .hgsub speichern"
+
+msgid "file not found!"
+msgstr "Datei nicht gefunden!"
+
+msgid "no match under directory!"
+msgstr "Kein Treffer unterhalb des Verzeichnisses!"
+
+msgid "file not tracked!"
+msgstr "Datei wird nicht versioniert!"
+
+msgid "cannot commit merge with missing files"
+msgstr ""
+"Zusammenführung kann aufgrund fehlender Dateien nicht übernommen werden"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "Ungelöste Konflikte beim Zusammenführen (siehe hg help resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "Speichere Unterarchiv %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "Hinweis: Versionsmeldung in %s gespeichert\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "Problem beim Speichern von %s!\n"
+
+msgid "requesting all changes\n"
+msgstr "Fordere alle Änderungen an\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"Teilweiser Pull kann nicht ausgeführt werden, da das andere Projektarchiv "
+"changegroupsubset nicht unterstützt."
+
+#, python-format
+msgid "updating %s to public failed!\n"
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "%d Änderungssätze gefunden\n"
+
+msgid "bundling"
+msgstr "Bündle"
+
+msgid "manifests"
+msgstr "Manifeste"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "Leeres oder fehlendes Revlog für %s"
+
+msgid "adding changesets\n"
+msgstr "Füge Änderungssätze hinzu\n"
+
+msgid "chunks"
+msgstr "Blöcke"
+
+msgid "received changelog group is empty"
+msgstr "Erhaltene Changelog-Gruppe ist leer"
+
+msgid "adding manifests\n"
+msgstr "Füge Manifeste hinzu\n"
+
+msgid "adding file changes\n"
+msgstr "Füge Dateiänderungen hinzu\n"
+
+msgid "received file revlog group is empty"
+msgstr "Revlog-Gruppe der erhaltenen Datei ist leer"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "Fehlende Dateidaten für %s:%s - bitte führe hg verify aus"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d Köpfe)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "Fügte %d Änderungssätze mit %d Änderungen an %d Dateien hinzu%s\n"
+
+msgid "Unexpected response from remote server:"
+msgstr "Unerwartete Antwort vom entfernten Server:"
+
+msgid "operation forbidden by server"
+msgstr "Kommando vom Server verboten"
+
+msgid "locking the remote repository failed"
+msgstr "Sperren des entfernten Projektarchivs fehlgeschlagen"
+
+msgid "the server sent an unknown error code"
+msgstr "Der Server sendete einen unbekannten Fehlercode."
+
+msgid "streaming all changes\n"
+msgstr "Sende alle Änderungen\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d Dateien zum Ãœbertragen, %s an Daten\n"
+
+msgid "clone"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "%s in %.1f Sekunden übertragen (%s/Sek)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "Kann TLS nicht benutzen: SSL-Unterstützung nicht in Python installiert"
+
+msgid "(using smtps)\n"
+msgstr "(benutze SMTPS)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "smtp.host nicht konfiguriert -- kann keine E-Mail versenden"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "Sende E-Mail: SMTP-Host %s, Port %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(benutze starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(authentifiziere beim E-Mail-Server als %s)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "Sende E-Mail: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+"SMTP zum Versenden von E-Mails angegeben, aber es wurde kein SMTP-Host "
+"konfiguriert"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+"%r zum Versenden von E-Mails angegeben, wurde aber nicht in PATH gefunden"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "Ignoriere ungültige sendcharset-Angabe: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "Ungültige E-Mail-Adresse: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "Ungültige lokale Adresse: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' und '\\r' sind nicht in Dateinamen erlaubt: %r"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "Konnte %s nicht aus dem Manifest entfernen"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "Ungültiges Muster (%s): %s"
+
+msgid "invalid pattern"
+msgstr "Ungültiges Muster"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "Kann Dateiliste nicht lesen (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr "Zeilenangaben im Diff-Kontext müssen Zahlen sein, nicht %r"
+
+#, python-format
+msgid "%s: untracked file differs\n"
+msgstr "%s: Unversionierte Datei verändert\n"
+
+msgid ""
+"untracked files in working directory differ from files in requested revision"
+msgstr ""
+"Unversionierte Dateien in der Arbeitskopie unterscheidet sich von der "
+"angeforderten Revision: '%s'"
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr "Groß-/Kleinschreibungskonflikt zwischen %s und %s"
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr "Manifeste auflösen\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" Lokales Archiv ändert %s, aber entferntes löscht.\n"
+"Nutze (c) geänderte Version oder (d) lösche?"
+
+msgid "&Changed"
+msgstr "(&C) Geändert"
+
+msgid "&Delete"
+msgstr "(&D) Löschen"
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+"Entferntes Archiv ändert %s, aber lokales löscht.\n"
+"Nutze (c) geänderte Version oder (d) lösche?"
+
+msgid "&Deleted"
+msgstr "(&D) Gelöscht"
+
+msgid "updating"
+msgstr "Aktualisiere"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "update konnte %s nicht entfernen: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "Hole %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "Hole %s nach %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr "Anmerkung: Möglicher Konflikt - %s wurde mehrere Male umbenannt zu:\n"
+
+#, python-format
+msgid "note: possible conflict - %s was deleted and renamed to:\n"
+msgstr "Anmerkung: Möglicher Konflikt - %s wurde gelöscht und umbenannt zu:\n"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr "Zusammenführen mit einem Vorfahren der Arbeitskopie hat keinen Effekt"
+
+msgid "use 'hg update' or check 'hg heads'"
+msgstr "nutze 'hg update' oder überprüfe 'hg heads'"
+
+msgid "use 'hg status' to list changes"
+msgstr "nutze 'hg status' zur Auflistung der Änderungen"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "Ausstehende, unversionierte Änderungen im Unterarchiv '%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+"kreuzt Zweige (nutze :hg:`merge` zum Zusammenführen oder :hg:`update -C` um "
+"die Änderungen zu verwerfen)"
+
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+"kreuzt Zweige (nutze :hg:`merge` oder :hg:`update --check` zum Erzwingen)"
+
+msgid "Attention:"
+msgstr "Obacht:"
+
+msgid "Caution:"
+msgstr "Vorsicht:"
+
+msgid "!Danger!"
+msgstr "!Gefahr!"
+
+msgid "Error:"
+msgstr "Fehler:"
+
+msgid "Hint:"
+msgstr "Tipp:"
+
+msgid "Important:"
+msgstr "Wichtig:"
+
+msgid "Note:"
+msgstr "Hinweis: "
+
+msgid "Tip:"
+msgstr "Tipp:"
+
+msgid "Warning!"
+msgstr "Warnung!"
+
+#, python-format
+msgid "unexpected token: %s"
+msgstr "Unerwartetes Token: %s"
+
+#, python-format
+msgid "not a prefix: %s"
+msgstr "kein Präfix: %s"
+
+#, python-format
+msgid "not an infix: %s"
+msgstr "kein Infix: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+"%d von %d Teilstücken sind FEHLGESCHLAGEN -- speichere Ausschuss in Datei "
+"%s\n"
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "Kann patch nicht auf %s anwenden: Datei ist nicht versioniert"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "Kann '%s' nicht zum Patchen finden\n"
+
+# unschön -- mir fiel kein gutes Verb außer "flicken" ein
+#, python-format
+msgid "patching file %s\n"
+msgstr "Wende Patch auf Datei %s an\n"
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr "Fehlerhaftes Teilstück #%d %s (%d %d %d %d)"
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "Kann %s nicht anlegen: Zielverzeichnis existiert bereits\n"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "Datei %s existiert bereits\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+"Teilstück #%d wurde erfolgreich in Zeile %d mit Unschärfe %d angewandt (%d "
+"Zeilen verschoben).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr ""
+"Teilstück #%d wurde erfolgreich in Zeile %d angewandt (%d Zeilen "
+"verschoben).\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr "FEHLSCHLAG von Teilstück #%d in Zeile %d\n"
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr "Fehlerhaftes Teilstück #%d"
+
+# Würde schon im Original mit "... ON text line" mehr Sinn ergeben. Kann mir auch nach einem Blick in die Sourcen nicht vorstellen, was diese Meldung genau aussagen soll.
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr "Fehlerhaftes Teilstück #%d, alte Textzeile %d"
+
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "Konnte binäre Daten \"%s\" nicht extrahieren"
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "Konnte binären Patch \"%s\" nicht dekodieren: %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "Länge von\"%s\" ist %d bytes, sollte aber %d sein"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "Konnte %d von %d Verzeichnissen nicht aus %s entfernen"
+
+msgid "undefined source and destination files"
+msgstr "undefinierte Quell- und Zieldateien"
+
+#, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "Metadaten für \"%s\" konnten nicht synchronisiert werden"
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "Kann %s nicht anlegen: Zielverzeichnis existiert bereits"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "Nicht unterstützter Parser-Zustand: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "patch-Befehl fehlgeschlagen: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "Nicht unterstütztes Zeilenende: %s"
+
+msgid "patch failed to apply"
+msgstr "Patch schlug fehl"
+
+msgid "cannot change null revision phase"
+msgstr "Kann die Phase der Null-Revision nicht ändern"
+
+#, python-format
+msgid "ignoring inconsistent public root from remote: %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unexpected root from remote: %i %s\n"
+msgstr "Ignorieren einer unerwarteten Wurzel von entfernt: %i %s\n"
+
+#, python-format
+msgid "phases.new-commit: not a valid phase name ('%s')"
+msgstr ""
+
+#, python-format
+msgid "exited with status %d"
+msgstr "Beendet mit Status %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "Getötet von Signal %d"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "Speichere Bündel-Sicherheitskopie in %s\n"
+
+msgid "adding branch\n"
+msgstr "füge Zweig hinzu\n"
+
+#, python-format
+msgid "error removing %s: %s\n"
+msgstr "Fehler beim Entfernen von %s: %s\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "Bereinigen fehlgeschlagen, vollständiges Bündle in '%s' gespeichert\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "Bereinigen fehlgeschlagen, partielles Bündel in '%s' gespeichert\n"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr ""
+"Kann nicht %s; entferntes Projektarchiv unterstützt nicht die %r-Fähigkeiten"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "Unbekannter Kompressionstyp %r"
+
+msgid "index entry flags need RevlogNG"
+msgstr "Index-Eintragsschalter benötigen RevlogNG"
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr "Index %s hat unbekannte Schalter %#04x für Format v0"
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "Index %s hat unbekannte Schalter %#04x für revlogng"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "Index %s hat unbekanntes Format %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "Index %s ist beschädigt"
+
+msgid "no node"
+msgstr "kein Knoten"
+
+msgid "ambiguous identifier"
+msgstr "mehrdeutiger Bezeichner"
+
+msgid "no match found"
+msgstr "Kein Treffer gefunden"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "Inkompatibler Revisions-Schalter %x"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s nicht in Transaktion gefunden"
+
+msgid "consistency error in delta"
+msgstr "Konsistenzfehler im delta"
+
+msgid "unknown delta base"
+msgstr "unbekannte delta-Basis"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "Kann %s hier nicht verwenden"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+"``adds(muster)``\n"
+" Änderungssätze, die auf das Muster passende Dateien hinzufügen."
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "'adds' erwartet ein Muster"
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+"``ancestor(single, single)``\n"
+" Jüngster gemeinsamer Vorfahre der beiden Änderungssätze."
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "'ancestor' erwartet zwei Argumente"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "'ancestor' erwartet einzelne Revisionen als Argumente"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+"``ancestors(Liste)``\n"
+" Änderungssätze, die Vorfahren der Änderungssätze aus der Liste sind."
+
+msgid "~ expects a number"
+msgstr "~ erwartet eine Zahl"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+"``author(zeichenkette)``\n"
+" Alias für ``user(zeichenkette)``."
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "'author' erwartet eine Zeichenkette"
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+"``bisect(zeichenkette)``\n"
+" Änderungssätze im gegebenen bisect-Status:"
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology\n"
+" - ``current`` : the cset currently being bisected"
+msgstr ""
+
+msgid "bisect requires a string"
+msgstr "bisect erwartet eine Zeichenkette"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+
+msgid ""
+" If `name` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a bookmark that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark verlangt ein oder zwei Argumente"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "'bookmark' erwartet eine Zeichenkette als Parameter"
+
+#, python-format
+msgid "no bookmarks exist that match '%s'"
+msgstr ""
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+"``branch(zeichenkette oder liste)``\n"
+" Alle Änderungssätze des gegebenen Zweigs oder den Zweigen der gegebenen\n"
+" Liste von Änderungssätzen."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a branch that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+"``children(liste)``\n"
+" Direkte Nachfahren der Änderungssätze in der Liste."
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+"``closed()``\n"
+" Änderungssatz ist geschlossen."
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "'closed' erwartet keine Argumente"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "'contains' erwartet ein Muster"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+"``date(intervall)``\n"
+" Änderungssätze innerhalb des Intervalls, siehe auch :hg:`help dates`."
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date erwartet eine Zeichenkette"
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+"``desc(zeichenkette)``\n"
+" Sucht die Zeichenketten in der Commit-Nachricht (Großschreibung wird\n"
+" ignoriert)."
+
+#. i18n: "desc" is a keyword
+msgid "desc requires a string"
+msgstr "'desc' erwartet eine Zeichenkette"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+"``descendants(liste)``\n"
+" Nachkommen der Änderungssätze in der Liste sind."
+
+msgid ""
+"``draft()``\n"
+" Changeset in draft phase."
+msgstr ""
+
+msgid "draft takes no arguments"
+msgstr "draft erwartet keine Argumente"
+
+msgid ""
+"``extra(label, [value])``\n"
+" Changesets with the given label in the extra metadata, with the given\n"
+" optional value."
+msgstr ""
+
+msgid ""
+" If `value` starts with `re:`, the remainder of the value is treated as\n"
+" a regular expression. To match a value that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+msgid "extra takes at least 1 and at most 2 arguments"
+msgstr "extra erwartet mindestens eins und höchstens zwei Argumente"
+
+msgid "first argument to extra must be a string"
+msgstr "Erstes Argument für extra muss eine Zeichenkette sein"
+
+msgid "second argument to extra must be a string"
+msgstr "Zweites Argument für extra muss eine Zeichenkette sein"
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+"``filelog(muster)``\n"
+" Änderungssätze, die das gegebene filelog betreffen."
+
+msgid "filelog requires a pattern"
+msgstr "'filelog' erwartet ein Muster"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+"``first(liste, [n])``\n"
+" Alias für limit()."
+
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s erwartet keine Argumente oder einen Dateinamen"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s erwartete einen Dateinamen"
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+"``follow([dateiname])``\n"
+" Ein Alias für ``::.`` (Vorfahren in der ersten Eltern-Revision der\n"
+" Arbeitskopie). Wenn ein Dateiname gegeben ist, wird der Historie der\n"
+" Datei über Kopien hinweg gefolgt."
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+"``all()``\n"
+" Alle Änderungssätze, entspricht ``0:tip``."
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all erwartet keine Argumente"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "'grep' erwartet eine Zeichenkette"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "Ungültiges Suchmuster: %s"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles erwartet mindestens ein Argument"
+
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles erwartet Zeichenketten als Argumente"
+
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles erwartete mindestens eine Revision"
+
+msgid "_matchfiles expected at most one default mode"
+msgstr ""
+
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "Ungültiges Präfix für _matchfiles: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+"``file(muster)``\n"
+" Änderungssätze, die auf das Muster passende Dateien betreffen."
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "'file' erwartet ein Muster"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+"``head()``\n"
+" Änderungssatz ist ein Kopf eines benannten Zweigs."
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head erwartet keine Argumente"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+"``heads(liste)``\n"
+" Elemente der Liste, die keine Kinder in der Liste haben."
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+"``keyword(zeichenkette)``\n"
+" Sucht die Zeichenketten in der Commit-Nachricht, dem Benutzernamen\n"
+" und der Liste geänderter Dateien. Großschreibung wird ignoriert."
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "'keyword' erwartet eine Zeichenkette"
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+"``limit(liste, [n])``\n"
+" Die erste, bzw. die ersten n Elemente Liste."
+
+#. i18n: "limit" is a keyword
+msgid "limit requires one or two arguments"
+msgstr "'limit' verlangt ein oder zwei Argumente"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "'limit' erwartet eine Zahl"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit erwartet eine Zahl"
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+"``last(liste, [n])``\n"
+" Das letzte, bzw. die letzten n Elemente der Liste."
+
+#. i18n: "last" is a keyword
+msgid "last requires one or two arguments"
+msgstr "'last' verlangt ein oder zwei Argumente"
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr "'last' benötigt eine Zahl"
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr "'last' erwartet eine Zahl"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+"``max(set)``\n"
+" Änderungssatz mit der größten Revisionsnummer in set."
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+"``merge()``\n"
+" Änderungssatz ist eine Zusammenführung."
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge erwartet keine Argumente"
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+"``min(liste)``\n"
+" Änderungssatz mit der kleinsten Revisionsnummer in der Liste."
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+"``modifies(muster)``\n"
+" Änderungssätze, die auf das Muster passende Dateien verändern."
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "'modifies' erwartet ein Dateinamenmuster"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+"``id(zeichenkette)``\n"
+" Revision, die eindeutig durch den gegebenen Hex-Wert(-Präfix)\n"
+" identifiziert wird."
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "'id' erwartet keine Argumente"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "'id' erwartet eine Zeichenkette"
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([pfad])``\n"
+" Änderungssätze, die nicht im angegebenen Ziel-Archiv oder dem\n"
+" Vorgabe-Push-Ziel vorhanden sind."
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing takes one or no arguments"
+msgstr "'outgoing' erwartet keine Argumente"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "'outgoing' verlangt einen Projektarchivpfad"
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+"``p1([liste])``\n"
+" Erster Vorfahr der Änderungssätze der Liste oder des Arbeits-\n"
+" verzeichnisses."
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+"``p2([liste])``\n"
+" Zweiter Vorfahr der Änderungssätze der Liste oder des Arbeits-\n"
+" verzeichnisses."
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+"``parents([liste])``\n"
+" Die Menge aller Eltern für die Änderungssätze der Liste oder des\n"
+" Arbeitverzeichnisses.."
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr "^ erwartet eine Zahl (0, 1 oder 2)"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+"``present(liste)``\n"
+" Die gegebene Liste, wenn alle Revisionen darin gefunden wurden. Wenn\n"
+" ein Eintrag nicht gefunden wird, die leere Menge."
+
+msgid ""
+" If any of specified revisions is not present in the local repository,\n"
+" the query is normally aborted. But this predicate allows the query\n"
+" to continue even in such cases."
+msgstr ""
+
+msgid ""
+"``public()``\n"
+" Changeset in public phase."
+msgstr ""
+
+msgid "public takes no arguments"
+msgstr "public erwartet keine Argumente"
+
+msgid ""
+"``remote([id [,path]])``\n"
+" Local revision that corresponds to the given identifier in a\n"
+" remote repository, if present. Here, the '.' identifier is a\n"
+" synonym for the current local branch."
+msgstr ""
+
+#. i18n: "remote" is a keyword
+msgid "remote takes one, two or no arguments"
+msgstr "remote erwartet ein, zwei oder keine Argumente"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a string id"
+msgstr "remote erwartet eine Zeichenkette (ID)"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a repository path"
+msgstr "'remote' erwartet einen Projektarchivpfad"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+"``removes(muster)``\n"
+" Änderungssätze, die auf das Muster passende Dateien entfernten."
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "'removes' erwartet ein Muster"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "'rev' erwartet eine Argumente"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "'rev' benötigt eine Zahl"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "'rev' erwartet eine Zahl"
+
+msgid ""
+"``matching(revision [, field])``\n"
+" Changesets in which a given set of fields match the set of fields in "
+"the\n"
+" selected revision or set."
+msgstr ""
+
+msgid ""
+" To match more than one field pass the list of fields to match separated\n"
+" by spaces (e.g. ``author description``)."
+msgstr ""
+
+msgid ""
+" Valid fields are most regular revision fields and some special fields."
+msgstr ""
+
+msgid ""
+" Regular revision fields are ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate`` and ``user``.\n"
+" Note that ``author`` and ``user`` are synonyms."
+msgstr ""
+
+msgid ""
+" Special fields are ``summary`` and ``metadata``:\n"
+" ``summary`` matches the first line of the description.\n"
+" ``metadata`` is equivalent to matching ``description user date``\n"
+" (i.e. it matches the main metadata fields)."
+msgstr ""
+
+msgid ""
+" ``metadata`` is the default field which is used when no fields are\n"
+" specified. You can match more than one field at a time."
+msgstr ""
+
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching erwartet 1 oder 2 Argumente"
+
+msgid "matching requires a string as its second argument"
+msgstr "matching erwartet eine Zeichenkette als sein zweites Argument"
+
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "Unerwarteter Feldname wurde an matching übergeben: %s"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+"``reverse(set)``\n"
+" Kehrt die Liste um."
+
+msgid ""
+"``roots(set)``\n"
+" Changesets in set with no parent changeset in set."
+msgstr ""
+"``roots(Menge)``\n"
+" Änderungssätze in der Menge, die keine Vorgänger in der Menge haben."
+
+msgid ""
+"``secret()``\n"
+" Changeset in secret phase."
+msgstr ""
+
+msgid "secret takes no arguments"
+msgstr "secret erwartet keine Argumente"
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+"``sort(menge[, [-]schlüssel...])``\n"
+" Sortiert die Menge anhand der Schlüssel. Mit einem vorgestellten ``-``\n"
+" wird absteigend, standardmäßig aufsteigend sortiert."
+
+msgid " The keys can be:"
+msgstr " Folgende Schlüssel können verwendet werden:"
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+" - ``rev`` für die Revisionsnummer,\n"
+" - ``branch`` für den Zweignamen,\n"
+" - ``desc`` für die Versionsmeldung (description),\n"
+" - ``user`` für den Benutzernamen (Alias ``author``),\n"
+" - ``date`` für das Datum des Commits"
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "'sort' verlangt ein oder zwei Argumente"
+
+msgid "sort spec must be a string"
+msgstr "Sortiermodus muss eine Zeichenkette sein"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "Unbekannter Sortiermodus: %r"
+
+#, python-format
+msgid "invalid regular expression: %s"
+msgstr "Ungültiger regulärer Ausdruck: %s"
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "'tag' erwartet eins oder keine Argumente"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "'tag' erwartet eine Zeichenkette"
+
+#, python-format
+msgid "no tags exist that match '%s'"
+msgstr "Es existiert kein Etikett, dass auf '%s' passt"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+"``user(zeichenkette)``\n"
+" Der Benutzername enthält die Zeichenkette. Großschreibung wird ignoriert."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the string is treated "
+"as\n"
+" a regular expression. To match a user that actually contains `re:`, use\n"
+" the prefix `literal:`."
+msgstr ""
+
+msgid "can't negate that"
+msgstr "kann dies nicht negieren"
+
+msgid "not a symbol"
+msgstr "kein Symbol"
+
+#, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr ""
+
+#, python-format
+msgid "invalid number of arguments: %s"
+msgstr "ungültige Parameteranzahl: %s"
+
+msgid "empty query"
+msgstr "Leere Anfrage"
+
+#, python-format
+msgid "no changes found (ignored %d secret changesets)\n"
+msgstr ""
+"Keine Änderungen gefunden (%d geheime Änderungssätze wurden ignoriert)\n"
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr ""
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr "Groß-/Kleinschreibungskonflikt bei %s"
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "Pfad endet mit Verzeichnis Separator: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "Pfad enthält ungültige Komponente: %s"
+
+#, python-format
+msgid "path '%s' is inside nested repo %r"
+msgstr "Pfad '%s' ist innerhalb des geschachtelten Archivs %r"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "Pfad %r überschreitet symbolische Verknüpfung %r"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "Konnte symbolische Verknüpfung auf %r nicht erzeugen: %s"
+
+msgid "empty revision range"
+msgstr "Leerer Revisionsbereich"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+"Interpretiere die Entfernung von %s als Umbenennung in %s (%d%% ähnlich)\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+"%s ist nicht im Archiv, daher gilt %s als neu hinzugefügt (nicht als "
+"kopiert).\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr ".hg/requires file ist beschädigt"
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr "Suche nach Änderungen\n"
+
+msgid "all local heads known remotely\n"
+msgstr ""
+
+msgid "sampling from both directions\n"
+msgstr "Nehme Proben von beiden Verzeichnissen\n"
+
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr "Projektarchiv steht in keinem Zusammenhang"
+
+msgid "warning: repository is unrelated\n"
+msgstr "Warnung: Projektarchiv steht in keinem Zusammenhang\n"
+
+msgid "searching for exact renames"
+msgstr "Suche nach exakten Umbenennungen"
+
+msgid "searching for similar files"
+msgstr "Suche nach ähnlichen Dateien"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s scheint eine Binärdatei zu sein."
+
+msgid "can only specify two labels."
+msgstr "Kann nur zwei Marken angeben."
+
+msgid "warning: conflicts during merge.\n"
+msgstr "Warnung: Konflikte beim Zusammenführen.\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "Konnte Adresse %s nicht verarbeiten"
+
+msgid "password in URL not supported"
+msgstr "Passwort in URL nicht unterstützt"
+
+msgid "could not create remote repo"
+msgstr "Konnte entferntes Projektarchiv nicht erstellen"
+
+msgid "no suitable response from remote hg"
+msgstr "Keine passende Antwort des entfernten hg"
+
+#, python-format
+msgid "push refused: %s"
+msgstr "Hochladen abgewiesen: %s"
+
+msgid "ssl connection failed"
+msgstr "ssk-Verbindung fehlgeschlagen"
+
+msgid "Python SSL support not found"
+msgstr "SSL-Unterstützung für Python nicht gefunden"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "Zur Überprüfung von Zertifikaten wird Python 2.6 benötigt"
+
+msgid "no certificate received"
+msgstr "Kein Zertifikat empfangen"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "Zertifikat ist für %s"
+
+msgid "IDN in certificate not supported"
+msgstr ""
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "Kein commonName oder subjectAltName im Zertifikat gefunden"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "Konnte web.cacerts nicht finden: %s"
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr ""
+"Server Authentizität für %s kann nicht verifiziert werden (Python ist zu alt)"
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr ""
+"Warnung: Zertifikat für %s kann nicht verifiziert werden (Python ist zu "
+"alt)\n"
+
+#, python-format
+msgid "%s ssl connection error"
+msgstr ""
+
+#, python-format
+msgid "%s certificate error: no certificate received"
+msgstr "%s Zertifikatfehler: Kein Zertifikat empfangen"
+
+#, python-format
+msgid "certificate for %s has unexpected fingerprint %s"
+msgstr ""
+
+msgid "check hostfingerprint configuration"
+msgstr ""
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "%s Zertifikatfehler: %s"
+
+#, python-format
+msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
+msgstr ""
+"Erlauben Sie Serverkennung %s in der Konfiguration oder benutzen Sie --"
+"insecure, um unsicher zu verbinden"
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' scheint kein hg-Projektarchiv zu sein"
+
+msgid "cannot lock static-http repository"
+msgstr "Kann static-http Projektarchiv nicht sperren"
+
+msgid "cannot create new static-http repository"
+msgstr "Kann kein neues, static-http Projektarchiv erstellen"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr "Ungültiger Eintrag in fncache, Zeile %s"
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "Warnung: Spezifikationsdatei für Unterarchive %s nicht gefunden\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "Konfigurationsdatei %s für das Unterarchiv nicht gefunden"
+
+#, python-format
+msgid "invalid subrepository revision specifier in .hgsubstate line %d"
+msgstr ""
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr "Fehlerhaftes Muster für Unterarchive in %s: %s"
+
+msgid "missing ] in subrepo source"
+msgstr "Fehlendes ] in der Unterarchivquelle"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+" Unterarchivquellen für %s sind verschieden.\n"
+"Nutze (l)okale Quelle (%s) oder entfe(r)nte Quelle (%s)?"
+
+msgid "&Remote"
+msgstr "Entfe&rnt"
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" Lokales Unterarchiv ändert %s, aber entferntes löscht.\n"
+"Nutze (c) geänderte Version oder (d) lösche?"
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" Entferntes Unterarchiv ändert %s, aber lokales löscht.\n"
+"Nutze (c) geänderte Version oder (d) lösche?"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" Unterarchivquellen für %s sind verschieden.\n"
+"Nutze (l)okale Quelle (%s) oder entfe(r)nte Quelle (%s)?\n"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" Unterarchivquellen für %s unterscheiden sich im Arbeitsverzeichnis.\n"
+"Nutze (l)okale Quelle (%s) oder entfe(r)nte Quelle (%s)?\n"
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "Vorgabepfad für Unterarchiv %s nicht gefunden"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "Unbekannter Unterarchivtyp %s"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "Archiviere (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "Warnung: Fahler \"%s\" im Unterarchiv \"%s\"\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "Entferne Unterarchiv %s\n"
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "Klone Unterarchiv %s von %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "Rufe Unterarchiv %s von %s ab\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "Ãœbertrage Unterarchiv %s zu %s\n"
+
+#, python-format
+msgid "reverting subrepo %s\n"
+msgstr "Zurücksetzen von Unterarchiv %s\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr ""
+
+msgid "cannot retrieve svn tool version"
+msgstr "Kann svn-Version nicht herausfinden"
+
+msgid "cannot commit svn externals"
+msgstr "Kann SVN-Externals nicht speichern"
+
+msgid "cannot commit missing svn entries"
+msgstr "Kann fehlende SVN-Einträge nicht übernehmen"
+
+msgid "failed to commit svn changes"
+msgstr "Übernahme von SVN-Änderungen fehlgeschlagen"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "Entferne Projektarchiv %s nicht, da es Änderungen enthält.\n"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "Revision %s existiert nicht im Unterarchiv %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr ""
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr ""
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "Unterarchiv %s fehlt"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "Ãœbertrage Zweig %s von Unterarchiv %s\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s"
+msgstr ""
+"kein Zweig in Unterarchiv %s aktuell\n"
+"Revision %s kann nicht übertragen werden"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, Zeile %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr "Kann Eintrag nicht parsen"
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "Knoten '%s' ist nicht wohlgeformt"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags ist korrupt, wird wiederhergestellt\n"
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+":addbreaks: Beliebiger Text. Führt ein XHTML \"<br />\"-Tag vor das Ende\n"
+" jeder Zeile bis auf die letzte ein."
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+":age: Datumsangabe. Gibt eine menschenlesbare Datums- und Zeitdifferenz\n"
+" zwischen dem gegebenen Datum und der aktuellen Zeit aus."
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+":basename: Beliebiger Text. Behandelt jeden Text als Pfadangabe und gibt\n"
+" den letzten Bestandteil des Pfades nach dem Auftrennen mit dem\n"
+" Trennzeichen für Verzeichnisse zurück (überhängende Trenner werden\n"
+" ignoriert). Zum Beispiel wird aus \"foo/bar/baz\" dann \"baz\" und\n"
+" \"foo/bar//\" wird zu \"bar\"."
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+":date: Datumsangabe. Gibt ein Datum als Unix Datum zurück,\n"
+" inklusive der Zeitzone: \"Mon Sep 04 15:13:13 2006 0700\"."
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+":domain: Beliebiger Text. Findet die erste Zeichenkette, die wie eine\n"
+" E-Mail-Adresse aussieht, und extrahiert davon die Domain-Komponente:\n"
+" Beispiel: ``Nutzer <user@example.com>`` wird zu ``example.com``."
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+":email: Beliebiger Text. Extrahiert die erste Zeichenkette, die wie eine\n"
+" E-Mail-Adresse aussieht. Beispiel: ``Nutzer <user@example.com>`` wird\n"
+" zu ``user@example.com``."
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+":escape: Beliebiger Text. Ersetzt die besonderen XML/XHTML-Zeichen\n"
+" \"&\", \"<\" und \">\" mit XML-Entitäten."
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ":fill68: Beliebiger Text. Umbricht den Text bei 68 Zeichen."
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ":fill76: Beliebiger Text. Umbricht den Text bei 76 Zeichen."
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ":firstline: Beliebiger Text. Gibt die erste Zeile des Texts zurück."
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+":hex: Beliebiger Text. Konvertiert eine binäre Mercurial-Knoten-ID\n"
+" in eine lange hexadezimale Repräsentation."
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+":hgdate: Datumsangabe. Gibt das Datum als Zahlpaar zurück:\n"
+" \"1157407993 25200\" (Unix Zeitstempel, Zeitzonenverschiebung)"
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+":isodate: Datumsangabe. Gibt das Datum im ISO 8601-Format zurück:\n"
+" \"2009-08-18 13:00 +0200\"."
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+":isodatesec: Datumsangabe. Gibt das Datum im ISO 8601-Format inklusive\n"
+" Sekunden zurück: \"2009-08-18 13:00 +0200\". Siehe auch den\n"
+" rfc3339date-Filter."
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ""
+":localdate: Datumsangabe. Konvertiert ein Datum in das lokale Datumsformat."
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+":nonempty: Beliebiger Text. Gibt '(none)' für eine leere Zeichenkette\n"
+" zurück."
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+":obfuscate: Beliebiger Text. Gibt den Text als Folge von XML-Entitäten\n"
+" zurück."
+
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+" interpreting it as per RFC 5322."
+msgstr ""
+":person: Beliebiger Text. Gibt den Text vor einer E-Mail-Adresse\n"
+" zurück, interpretiert als RFC 5322."
+
+msgid ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+msgstr ""
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+":rfc3339date: Datumsangabe. Gibt das Datum im Internet-Datumsformat,\n"
+" spezifiziert im RFC 3339, zurück: \"2009-08-18T13:00:13+02:00\"."
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+":rfc822date: Datumsangabe. Gibt das Datum im gleichen Format zurück,\n"
+" das auch in Kopfzeilen von E-Mails verwendet wird:\n"
+" \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+":short: Prüfsumme. Gibt die Kurzform der Prüfsumme zurück, d.h.\n"
+" als 12 Zeichen lange hexadezimale Zeichenkette."
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+":shortbisect: Beliebiger text. Behandelt `text` als Teilungsstatus, und\n"
+" gibt einen repräsentatives Buchstaben zurück (G: gut, B: schlecht,\n"
+" S: übersprungen, U: ungetestet, I: ignoriert). Wenn `text` kein\n"
+" gültiger Teilungsstatus ist, wird ein Leerzeichen zurückgegeben."
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ":shortdate: Datumsangabe. Gibt ein Datum wie \"2006-09-18\" zurück."
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+":stringify: Beliebiger Typ. Wandelt jeden Wert in einen Text um, indem die\n"
+" Werte in Zeichenketten konvertiert und dann aneinander gehängt werden."
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+":strip: Beliebiger Text. Entfernt jeden führenden und überhängenden\n"
+" Leerraum."
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+":stripdir: Behandelt den Text als Pfadangabe und entfernt das letzte\n"
+" Verzeichnis, wenn möglich. Zum Beispiel wird aus \"foo\" und \"foo/bar//"
+"\" \n"
+" dann \"bar\"."
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+":tabindent: Beliebiger Text. Gibt den Text zurück, wobei jede Zeile bis\n"
+" auf die erste mit einem Tabulator eingerückt ist."
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+":urlescape: Beliebiger Text. Maskiert alle \"besonderen\" Zeichen.\n"
+" Aus \"foo bar\" wird zum Beispiel \"foo%20bar\"."
+
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+" address."
+msgstr ""
+":user: Beliebiger Text. Gibt die Kurzdarstellung eines Benutzernamens\n"
+" oder einer E-Mail-Adresse zurück."
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ""
+":emailuser: Beliebiger Text. Gibt den Nutzerteil einer E-Mail-Adresse\n"
+" (vor dem @-Zeichen) zurück."
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ":author: Zeichenkette. Der unveränderte Autor eines Änderungssatzes."
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ":bisect: Zeichenkette. Der bisect Status des Änderungssatzes."
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ""
+":branch: Zeichenkette. Der Name des Zweiges, in dem der Änderungssatz\n"
+" versioniert wurde."
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+":branches: Zeichenkette. Der Name des Zweiges, in dem der Änderungssatz\n"
+" versioniert wurde. Ist leer, wenn der Zweig-Name 'default' ist."
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ""
+":bookmarks: Liste von Zeichenketten. Alle Lesezeichen, die diesem\n"
+" Änderungssatz zugewiesen wurden."
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ":children: Liste von Zeichenketten. Die Kinder dieses Änderungssatzes."
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ""
+":date: Datumsangabe. Das Datum, wann ein Änderungssatz versioniert wurde."
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ":desc: Zeichenkette. Der Text der Beschreibung eines Änderungssatzes."
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+":diffstat: Zeichenkette. Statistik über die Änderungen in dem folgenden\n"
+" Format: \"geänderte Dateien: +hinzugefügt/-entfernte Zeilen\""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ":file_adds: Liste von Zeichenketten. Alle hinzugefügten Dateien."
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+":file_copies_switch: Liste von Zeichenketten. Dateien, die in diesem\n"
+" Änderungssatz kopiert wurden, zusammen mit den Quelldateien."
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+":file_copies_switch: Liste von Zeichenketten. Wie \"file_copies\", wird\n"
+" aber nur angezeigt, wenn der Schalter --copied gesetzt wurde."
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ":file_dels: Liste von Zeichenketten. Alle gelöschten Dateien."
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ":file_mods: Liste von Zeichenketten. Alle geänderten Dateien."
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+":files: Liste von Zeichenketten. Alle geänderten, hinzugefügten oder\n"
+" gelöschten Dateien dieses Änderungssatzes."
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+":latesttag: Zeichenkette. Aktuellstes globales Tag in den Nachfahren\n"
+" dieses Änderungssatzes."
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ":latesttagdistance: Zahl. Längster Pfad zum aktuellsten Tag."
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+":node: Zeichenkette. Die Prüfsumme, die einen Änderungssatz identifiziert,\n"
+" als 40 Zeichen lange hexadezimale Zeichenkette."
+
+msgid ":phase: String. The changeset phase name."
+msgstr ":phase: Zeichenkette. Der Name der Phase des Änderungssatzes."
+
+msgid ":phaseidx: Integer. The changeset phase index."
+msgstr ""
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ""
+":rev: Zahl. Die für dieses Projektarchiv geltende Nummer eines\n"
+" Änderungssatzes."
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ""
+":tags: Liste von Zeichenketten. Alle Tags, die diesem Änderungssatz\n"
+" zugewiesen wurden."
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "Unbekannte Method '%s'"
+
+msgid "expected a symbol"
+msgstr "erwartete ein Symbol"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "Unbekannte Funktion '%s'"
+
+msgid "expected template specifier"
+msgstr ""
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "Filter %s erwartet ein Argument"
+
+msgid "unmatched quotes"
+msgstr "unpassende Anführungszeichen"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "Stil nicht gefunden: %s"
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" nicht in der Vorlagenzuordnungsdatei gefunden"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "Vorlagendatei %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+"Kann Transaktion nicht verwenden, wenn sie bereits übernommen/abgebrochen ist"
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "Konnte %s nicht abschneiden\n"
+
+msgid "transaction abort!\n"
+msgstr "Transaktion abgebrochen!\n"
+
+msgid "rollback completed\n"
+msgstr "Zurückrollen abgeschlossen\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "Zurückrollen fehlgeschlagen - bitte führe hg recover aus\n"
+
+msgid "already have changeset "
+msgstr "Änderungssatz bereits vorhanden "
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr "Nicht vertrauenswürdige Datei %s vom Nutzer %s, Gruppe %s\n"
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr "Ignoriert: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr "(veraltete Angabe '%%' im Pfad %s=%s aus %s)\n"
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s ist kein boolescher Wert ('%s')"
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s ist keine Zahl ('%s')"
+
+msgid "enter a commit username:"
+msgstr "Geben Sie einen Benutzernamen für den Commit ein:"
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr "Kein Benutzername gefunden, nutze '%s' stattdessen\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "kein Benutzername angegeben (siehe \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "Benutzername %s enthält einen Zeilenumbruch\n"
+
+msgid "response expected"
+msgstr "Antwort erwartet"
+
+msgid "unrecognized response\n"
+msgstr "Unbekannte Antwort\n"
+
+msgid "password: "
+msgstr "Passwort: "
+
+msgid "http authorization required"
+msgstr "HTTP-Autorisierung erforderlich"
+
+msgid "http authorization required\n"
+msgstr "HTTP-Autorisierung erforderlich\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "Bereich: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "Benutzer: %s\n"
+
+msgid "user:"
+msgstr "Benutzer:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "HTTP-Auth: Benutzer %s, Passwort %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "Befehl '%s' fehlgeschlagen: %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr "Dateiname enthält '%s', was in Windows reserviert ist"
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr "Dateiname enthält '%r', was in Windows ungültig ist"
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr "Dateiname endet mit '%s', was in Windows nicht erlaubt ist"
+
+msgid "check your clock"
+msgstr "überprüfen Sie ihre Uhr"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "negativer Zeitstempel: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "Ungültiges Datum: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "Datum überschreitet 32 Bit: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "negativer Datumswert: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "Unmögliche Zeitzonen-Verschiebung: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "Ein Datum kann nicht nur aus Leerzeichen bestehen"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr "Ungültige Datumsangabe, verwende '<DATUM'"
+
+msgid "invalid day spec, use '>DATE'"
+msgstr "Ungültige Datumsangabe, verwende '>DATUM'"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "Ungültige Datumsangabe: %s"
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr "%s muss nichtnegativ sein (siehe 'hg help dates')"
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f Bytes"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "Dem Dient '%s' ist keine Portnummer zugewiesen"
+
+msgid "file:// URLs can only refer to localhost"
+msgstr "file://-URLs können nur auf localhost verweisen"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "Kann Bündel oder entfernte Projektarchive nicht verifizieren"
+
+msgid "interrupted"
+msgstr "unterbrochen"
+
+# problematisch: Wird mit "Changelog" oder "Manifest" aufgerufen, allerdings passt die aktuelle Ãœbersetzung nur auf Manifest.
+#, python-format
+msgid "empty or missing %s"
+msgstr "leeres oder fehlendes %s"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "Datenlänge um %d Bytes verschoben"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "Index enthält %d zusätzliche Bytes"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "Warnung: `%s' nutzt Revlogformat 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "Warnung: `%s' nutzt Revlogformat 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "Revision %d zeigt auf nicht existenten Änderungssatz %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "Revision %d zeigt auf unerwarteten Änderungssatz %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (erwartete %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "Unbekannter erster Vorfahr %s von %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "Unbekannter zweiter Vorfahr %s von %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "Prüfe Vorfahren von %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "Doppelte Revision %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "abgebrochene Transaktion gefunden - bitte führe hg recover aus\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "Archiv verwendet Revlogformat %d\n"
+
+msgid "checking changesets\n"
+msgstr "Prüfe Änderungssätze\n"
+
+msgid "checking"
+msgstr "Prüfe"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "Entpacke Änderungssatz %s"
+
+msgid "checking manifests\n"
+msgstr "Prüfe Manifeste\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s nicht in den Änderungssätzen vorhanden"
+
+msgid "file without name in manifest"
+msgstr "Datei ohne Namen im Manifest"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "Lese Manifest-Delta %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "Überkreuzprüfung der Dateien in Änderungssätzen und Manifesten\n"
+
+msgid "crosschecking"
+msgstr "Überkreuzprüfung"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "Änderungssatz referenziert unbekanntes Manifest %s"
+
+msgid "in changeset but not in manifest"
+msgstr "im Änderungssatz aber nicht im Manifest"
+
+msgid "in manifest but not in changeset"
+msgstr "im Manifest aber nicht im Änderungssatz"
+
+msgid "checking files\n"
+msgstr "Prüfe Dateien\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "Kann Dateinamen '%s' nicht dekodieren"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "Beschädigtes Revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "Fehlendes Revlog!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s nicht in Manifesten"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "entpackte Größe ist %s, aber %s erwartet"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "entpacke %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "Warnung: Kopierquelle von '%s' ist in keinem Vorfahren von %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "Leeres oder fehlendes revlog %s:%s der Kopierquelle"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr "Warnung: %s@%s: Revision der Kopierquelle ist Null %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "Prüfe Umbenennung von %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s nicht in den Manifesten gefunden"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "Warnung: Verwaistes revlog '%s'"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d Dateien, %d Änderungssätze, %d Revisionen insgesamt\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "%d Warnungen gefunden!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "%d Integritätsfehler gefunden!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(erster beschädigter Änderungssatz scheint %d zu sein)\n"
+
+msgid "look up remote revision"
+msgstr "entfernte Revision abrufen"
+
+msgid "push failed (unexpected response):"
+msgstr "Ãœbertragen fehlgeschlagen (unerwartete Antwort)"
+
+msgid "look up remote changes"
+msgstr "entfernte Änderungen abrufen"
+
+msgid "push failed:"
+msgstr "Ãœbertragen fehlgeschlagen: %s"
+
+#~ msgid "The hook does not change bug status."
+#~ msgstr "Diese Erweiterung ändert den Status des Bugzilla-Tickets nicht."
+
+#~ msgid ""
+#~ "bugzilla.regexp\n"
+#~ " Regular expression to match bug IDs in changeset commit message.\n"
+#~ " Must contain one \"()\" group. The default expression matches ``Bug\n"
+#~ " 1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
+#~ " ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
+#~ " insensitive."
+#~ msgstr ""
+#~ "bugzilla.regexp\n"
+#~ " Der Reguläre Ausdruck, mit dem Ticket-IDs in der Versionsmeldung "
+#~ "erkannt\n"
+#~ " werden. Er muss eine \"()\"-Gruppe enthalten. Der Standardwert "
+#~ "erkennt:\n"
+#~ " 'Bug 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678',\n"
+#~ " 'Bug 1234 and 5678' und Variationen. Großschreibung wird ignoriert."
+
+#~ msgid "%s is not a valid revision in current branch"
+#~ msgstr "%s ist keine gültige Revision im aktuellen Zweig"
+
+#~ msgid "-G/--graph option is incompatible with --follow with file argument"
+#~ msgstr "Option -G/--graph ist inkompatibel zu --follow mit Dateiparameter"
+
+#~ msgid "hg glog [OPTION]... [FILE]"
+#~ msgstr "hg glog [OPTION]... [DATEI]"
+
+#~ msgid "import a patch"
+#~ msgstr "Importiert einen Patch"
+
+#~ msgid ""
+#~ " When -f/--force is applied, all local changes in patched files\n"
+#~ " will be lost."
+#~ msgstr ""
+#~ " Wenn -f/--force angegeben ist, werden alle lokalen Änderungen in den\n"
+#~ " vom Patch betroffenen Dateien verlorengehen."
+
+#~ msgid ""
+#~ "If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+#~ "setting::"
+#~ msgstr ""
+#~ "Wenn Sie \"BROKEN PIPE\"-Fehlermeldungen erhalten, können Sie diese über\n"
+#~ "die folgende Einstellung deaktivieren::"
+
+#~ msgid "use \"hg -v help %s\" to show more info"
+#~ msgstr "Nutze \"hg -v help %s\" um mehr Informationen anzuzeigen"
+
+#~ msgid "follow takes no arguments"
+#~ msgstr "follow erwartet keine Argumente"
+
+#~ msgid "outgoing takes one or two arguments"
+#~ msgstr "'outgoing' erwartet ein oder zwei Argumente"
diff --git a/i18n/el.po b/i18n/el.po
new file mode 100644
index 0000000..949e0ec
--- /dev/null
+++ b/i18n/el.po
@@ -0,0 +1,14801 @@
+# Greek translations for Mercurial
+# Ελληνική μετάφÏαση των μηνυμάτων του Mercurial
+#
+# Copyright (C) 2009 Matt Mackall και άλλοι
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2009-10-25 12:38+0100\n"
+"PO-Revision-Date: 2009-12-02 03:23+0200\n"
+"Last-Translator: <keramida@ceid.upatras.gr>\n"
+"Language-Team: Greek\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Generated-By: pygettext.py 1.5\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (Ï€ÏοκαθοÏισμένο: %s)"
+
+msgid "Options"
+msgstr "Επιλογές"
+
+msgid "Commands"
+msgstr "Εντολές"
+
+msgid " options:"
+msgstr " επιλογές:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " ψευδώνυμα: %s"
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"Below we list the most specific file first."
+msgstr ""
+
+msgid "On Windows, these configuration files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>\\.hg\\hgrc``\n"
+"- ``%USERPROFILE%\\.hgrc``\n"
+"- ``%USERPROFILE%\\Mercurial.ini``\n"
+"- ``%HOME%\\.hgrc``\n"
+"- ``%HOME%\\Mercurial.ini``\n"
+"- ``C:\\Mercurial\\Mercurial.ini``\n"
+"- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``\n"
+"- ``<install-dir>\\Mercurial.ini``"
+msgstr ""
+
+msgid "On Unix, these files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>/.hg/hgrc``\n"
+"- ``$HOME/.hgrc``\n"
+"- ``/etc/mercurial/hgrc``\n"
+"- ``/etc/mercurial/hgrc.d/*.rc``\n"
+"- ``<install-root>/etc/mercurial/hgrc``\n"
+"- ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+"The configuration files for Mercurial use a simple ini-file format. A\n"
+"configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries::"
+msgstr ""
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+
+msgid ""
+"This above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. Please see the hgrc man page for a full\n"
+"description of the possible configuration values:"
+msgstr ""
+
+msgid ""
+"- on Unix-like systems: ``man hgrc``\n"
+"- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr ""
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr ""
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr ""
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+"This is the internal representation format for dates. unixtime is the\n"
+"number of seconds since the epoch (1970-01-01 00:00 UTC). offset is\n"
+"the offset of the local timezone, in seconds west of UTC (negative if\n"
+"the timezone is east of UTC)."
+msgstr ""
+
+msgid "The log command also accepts date ranges:"
+msgstr ""
+
+msgid ""
+"- ``<{datetime}`` - at or before a given date/time\n"
+"- ``>{datetime}`` - on or after a given date/time\n"
+"- ``{datetime} to {datetime}`` - a date range, inclusive\n"
+"- ``-{days}`` - within a given number of days of today\n"
+msgstr ""
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with \"hg export\"), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your hgrc. You do not need to set this option when\n"
+"importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use .hgrc)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for hgrc files. Item\n"
+" separator is \":\" on Unix, \";\" on Windows. If HGRCPATH is not set,\n"
+" platform default search path is used. If empty, only the .hg/hgrc\n"
+" from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - hgrc files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in\n"
+"the Python search path, create an entry for it in your hgrc, like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+
+msgid "You may also specify the full path to an extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension enabled in an hgrc of broader\n"
+"scope, prepend its path with !::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Three styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact and changelog.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ""
+":author: String. The unmodified author of the changeset.\n"
+":branches: String. The name of the branch on which the changeset\n"
+" was committed. Will be empty if the branch name was\n"
+" default.\n"
+":date: Date information. The date when the changeset was\n"
+" committed.\n"
+":desc: String. The text of the changeset description.\n"
+":diffstat: String. Statistics of changes with the following\n"
+" format: \"modified files: +added/-removed lines\"\n"
+":files: List of strings. All files modified, added, or removed\n"
+" by this changeset.\n"
+":file_adds: List of strings. Files added by this changeset.\n"
+":file_mods: List of strings. Files modified by this changeset.\n"
+":file_dels: List of strings. Files removed by this changeset.\n"
+":node: String. The changeset identification hash, as a\n"
+" 40-character hexadecimal string.\n"
+":parents: List of strings. The parents of the changeset.\n"
+":rev: Integer. The repository-local changeset revision\n"
+" number.\n"
+":tags: List of strings. Any tags associated with the\n"
+" changeset.\n"
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset.\n"
+":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. You can also use a chain of filters to get the desired\n"
+"output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last.\n"
+":age: Date. Returns a human-readable date/time difference\n"
+" between the given date/time and the current\n"
+" date/time.\n"
+":basename: Any text. Treats the text as a path, and returns the\n"
+" last component of the path after splitting by the\n"
+" path separator (ignoring trailing separators). For\n"
+" example, \"foo/bar/baz\" becomes \"baz\" and \"foo/bar//\"\n"
+" becomes \"bar\".\n"
+":stripdir: Treat the text as path and strip a directory level,\n"
+" if possible. For example, \"foo\" and \"foo/bar\" becomes\n"
+" \"foo\".\n"
+":date: Date. Returns a date in a Unix date format, including\n"
+" the timezone: \"Mon Sep 04 15:13:13 2006 0700\".\n"
+":domain: Any text. Finds the first string that looks like an\n"
+" email address, and extracts just the domain\n"
+" component. Example: ``User <user@example.com>`` becomes\n"
+" ``example.com``.\n"
+":email: Any text. Extracts the first string that looks like\n"
+" an email address. Example: ``User <user@example.com>``\n"
+" becomes ``user@example.com``.\n"
+":escape: Any text. Replaces the special XML/XHTML characters\n"
+" \"&\", \"<\" and \">\" with XML entities.\n"
+":fill68: Any text. Wraps the text to fit in 68 columns.\n"
+":fill76: Any text. Wraps the text to fit in 76 columns.\n"
+":firstline: Any text. Returns the first line of text.\n"
+":nonempty: Any text. Returns '(none)' if the string is empty.\n"
+":hgdate: Date. Returns the date as a pair of numbers:\n"
+" \"1157407993 25200\" (Unix timestamp, timezone offset).\n"
+":isodate: Date. Returns the date in ISO 8601 format:\n"
+" \"2009-08-18 13:00 +0200\".\n"
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the\n"
+" rfc3339date filter.\n"
+":localdate: Date. Converts a date to local date.\n"
+":obfuscate: Any text. Returns the input text rendered as a\n"
+" sequence of XML entities.\n"
+":person: Any text. Returns the text before an email address.\n"
+":rfc822date: Date. Returns a date using the same format used in\n"
+" email headers: \"Tue, 18 Aug 2009 13:00:13 +0200\".\n"
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\".\n"
+":short: Changeset hash. Returns the short form of a changeset\n"
+" hash, i.e. a 12-byte hexadecimal string.\n"
+":shortdate: Date. Returns a date like \"2006-09-18\".\n"
+":strip: Any text. Strips all leading and trailing whitespace.\n"
+":tabindent: Any text. Returns the text, with every line except\n"
+" the first starting with a tab character.\n"
+":urlescape: Any text. Escapes all \"special\" characters. For\n"
+" example, \"foo bar\" becomes \"foo%20bar\".\n"
+":user: Any text. Returns the user portion of an email\n"
+" address.\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user[:pass]@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by 'hg bundle' or 'hg\n"
+"incoming --bundle')."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also 'hg help\n"
+"revisions'."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your hgrc or\n"
+" with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your hgrc with path aliases under the\n"
+"[paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example 'hg pull alias1' will be treated as 'hg pull URL1')."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "hooks for controlling repository access"
+msgstr "hooks για έλεγχο της Ï€Ïόσβασης σε ένα αποθετήÏιο"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to portions\n"
+"of a repository when receiving incoming changesets."
+msgstr ""
+"Τα hooks της επέκτασης acl σας δίνουν τη δυνατότητα να επιτÏέψετε ή να\n"
+"απαγοÏεÏσετε την Ï€Ïόσβαση για αλλαγές σε μέÏη ενός αποθετηÏίου κατά τη\n"
+"διάÏκεια της λήψης εισεÏχόμενων αλλαγών."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"Η Ï€Ïόσβαση ελέγχεται με βάση το τοπικό όνομα χÏήστη στο σÏστημα το οποίο\n"
+"εκτελεί τον κώδικα της επέκτασης κι όχι με βάση το όνομα του συγγÏαφέα\n"
+"μιας αλλαγής (Î±Ï†Î¿Ï Ï„Î¿ δεÏτεÏο υπάÏχει μόνο για πληÏοφοÏιακοÏÏ‚ σκοποÏÏ‚)."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than\n"
+"pushing or pulling. The hook is not safe to use if users have\n"
+"interactive shell access, as they can then disable the hook.\n"
+"Nor is it safe if remote users share an account, because then there\n"
+"is no way to distinguish them."
+msgstr ""
+"Η επέκταση acl είναι πιο χÏήσιμη όταν συνδυάζεται με ένα πεÏιοÏισμένο\n"
+"φλοιό όπως το hgsh, Î±Ï†Î¿Ï Î­Ï„ÏƒÎ¹ οι απομακÏυσμένοι χÏήστες έχουν Ï€Ïόσβαση\n"
+"μόνο για λειτουÏγίες pull ή push. Η επέκταση δε μποÏεί να σας\n"
+"εξασφαλίσει ότι δε θα την απενεÏγοποιήσουν οι τοπικοί χÏήστες όταν\n"
+"έχουν απευθείας Ï€Ïόσβαση να εκτελέσουν οποιαδήποτε εντολή στο\n"
+"εξυπηÏετητή του αποθετηÏίου. Δεν είναι ασφαλής, επίσης, όταν πολλοί\n"
+"απομακÏυσμένοι χÏήστες μοιÏάζονται τον ίδιο τοπικό λογαÏιασμό, Î±Ï†Î¿Ï Î´ÎµÎ½\n"
+"υπάÏχει Ï„Ïόπος να ξεχωÏίσει ο ένας χÏήστης από τον άλλο."
+
+msgid "To use this hook, configure the acl extension in your hgrc like this::"
+msgstr ""
+"Για να χÏησιμοποιήσετε το hook της επέκτασης ενεÏγοποιήστε την στο\n"
+"αÏχείο hgrc ως εξής::"
+
+msgid ""
+" [extensions]\n"
+" acl ="
+msgstr ""
+" [extensions]\n"
+" acl ="
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+" [hooks]\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+
+msgid ""
+" [acl]\n"
+" # Check whether the source of incoming changes is in this list\n"
+" # (\"serve\" == ssh or http, \"push\", \"pull\", \"bundle\")\n"
+" sources = serve"
+msgstr ""
+" [acl]\n"
+" # Ελέγξτε αν η πηγή των εισεÏχόμενων αλλαγών είναι κάποια από τις\n"
+" # (\\\"serve\\\" == ssh ή http, \\\"push\\\", \\\"pull\\\", \\\"bundle\\\")\n"
+" sources = serve"
+
+msgid ""
+"The allow and deny sections take a subtree pattern as key (with a glob\n"
+"syntax by default), and a comma separated list of users as the\n"
+"corresponding value. The deny list is checked before the allow list\n"
+"is. ::"
+msgstr ""
+"Τα τμήματα του αÏχείου Ïυθμίσεων τα οποία επιτÏέπουν ή απαγοÏεÏουν την\n"
+"Ï€Ïόσβαση μποÏοÏν να αναφέÏονται σε υποκαταλόγους του αποθετηÏίου (με\n"
+"σÏνταξη glob για τα ονόματα αÏχείων ή υποκαταλόγων). Σε κάθε Ï€Ïότυπο\n"
+"ονόματος μποÏείτε να οÏίσετε ένα ή πεÏισσότεÏους χÏήστες χωÏίζοντας τα\n"
+"ονόματά τους με κόμμα. Η λίστα Ï€ÏοτÏπων που απαγοÏεÏει την Ï€Ïόσβαση\n"
+"ελέγχεται Ï€Ïώτη. ::"
+
+msgid ""
+" [acl.allow]\n"
+" # If acl.allow is not present, all users are allowed by default.\n"
+" # An empty acl.allow section means no users allowed.\n"
+" docs/** = doc_writer\n"
+" .hgtags = release_engineer"
+msgstr ""
+" [acl.allow]\n"
+" # Όταν δεν υπάÏχει το τμήμα acl.allow επιτÏέπεται η Ï€Ïόσβαση σε\n"
+" # όλους τους χÏήστες. Όταν το τμήμα acl.allow είναι κενό δεν\n"
+" # επιτÏέπεται η Ï€Ïόσβαση σε κανέναν χÏήστη.\n"
+" docs/** = doc_writer\n"
+" .hgtags = release_engineer"
+
+msgid ""
+" [acl.deny]\n"
+" # If acl.deny is not present, no users are refused by default.\n"
+" # An empty acl.deny section means all users allowed.\n"
+" glob pattern = user4, user5\n"
+" ** = user6\n"
+msgstr ""
+" [acl.deny]\n"
+" # Όταν δεν υπάÏχει το τμήμα acl.deny επιτÏέπεται η Ï€Ïόσβαση σε\n"
+" # όλους τους χÏήστες. Όταν είναι κενό επίσης επιτÏέπεται η\n"
+" # Ï€Ïόσβαση σε όλους.\n"
+" glob pattern = user4, user5\n"
+" ** = user6\n"
+
+#, python-format
+msgid "config error - hook type \"%s\" cannot stop incoming changesets"
+msgstr "Ï€Ïόβλημα Ïυθμίσεων - το hook \"%s\" δε μποÏεί να εμποδίσει εισεÏχόμενες αλλαγές"
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr "acl: η Ï€Ïόσβαση για την αλλαγή %s δεν επιτÏέπεται"
+
+msgid "track a line of development with movable markers"
+msgstr "παÏακολοÏθηση μιας γÏαμμής ανάπτυξης με κινητές ετικέτες"
+
+msgid ""
+"Bookmarks are local movable markers to changesets. Every bookmark\n"
+"points to a changeset identified by its hash. If you commit a\n"
+"changeset that is based on a changeset that has a bookmark on it, the\n"
+"bookmark shifts to the new changeset."
+msgstr ""
+"Τα bookmarks είναι κινητές ετικέτες για αλλαγές. Κάθε ετικέτα δείχνει\n"
+"σε μια αλλαγή, με βάση το hash της αλλαγής. Αν δημιουÏγήσετε μια νέα\n"
+"αλλαγή με βάση μια αλλαγή στην οποία δείχνει μια ετικέτα, η ετικέτα\n"
+"μετακινείται στην καινοÏÏια αλλαγή."
+
+msgid ""
+"It is possible to use bookmark names in every revision lookup (e.g. hg\n"
+"merge, hg update)."
+msgstr ""
+"Οι ετικέτες μποÏοÏν να χÏησιμοποιηθοÏν οπουδήποτε έχει νόημα το\n"
+"αναγνωÏιστικό μιας έκδοσης (Ï€.χ. ως οÏίσματα των hg merge ή hg update)."
+
+msgid ""
+"By default, when several bookmarks point to the same changeset, they\n"
+"will all move forward together. It is possible to obtain a more\n"
+"git-like experience by adding the following configuration option to\n"
+"your .hgrc::"
+msgstr ""
+"Η Ï€ÏοκαθοÏισμένη συμπεÏιφοÏά της επέκτασης είναι να μετακινεί όλες τις\n"
+"ετικέτες μιας γονικής αλλαγής. Αυτή η συμπεÏιφοÏά μποÏεί να αλλάξει,\n"
+"για να μοιάζει πεÏισσότεÏο με το git, Ï€Ïοσθέτοντας την παÏακάτω επιλογή\n"
+"στο αÏχείο .hgrc::"
+
+msgid ""
+" [bookmarks]\n"
+" track.current = True"
+msgstr ""
+" [bookmarks]\n"
+" track.current = True"
+
+msgid ""
+"This will cause Mercurial to track the bookmark that you are currently\n"
+"using, and only update it. This is similar to git's approach to\n"
+"branching.\n"
+msgstr ""
+"Με αυτή την επιλογή το Mercurial θα ελέγχει αν έχετε ενεÏγοποιήσει\n"
+"κάποια ετικέτα και θα μετακινεί μόνο αυτή την ετικέτα. Αυτή η\n"
+"συμπεÏιφοÏά μοιάζει με τον Ï„Ïόπο που λειτουÏγοÏν οι κλάδοι ανάπτυξης στο\n"
+"git.\n"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in 'hg merge' and\n"
+" 'hg update' to merge and update respectively to a given bookmark."
+msgstr ""
+" Οι ετικέτες είναι δείκτες Ï€Ïος συγκεκÏιμένες αλλαγές, οι οποίοι\n"
+" μετακινοÏνται όταν κάνετε commit. Οι ετικέτες αποθηκεÏονται μόνο\n"
+" τοπικά. ΜποÏοÏν να μετονομαστοÏν, να αντιγÏαφοÏν, και να σβηστοÏν.\n"
+" Η χÏήση τους επιτÏέπεται τόσο με την εντολή 'hg merge όσο και με την\n"
+" 'hg update', για συγχώνευση ή ενημέÏωση, αντίστοιχα, του χώÏου\n"
+" εÏγασίας με την έκδοση μιας ετικέτας."
+
+msgid ""
+" You can use 'hg bookmark NAME' to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision.\n"
+" "
+msgstr ""
+" ΜποÏείτε να δώσετε 'hg bookmark ΟÎΟΜΑ' για να οÏίσετε μια ετικέτα η\n"
+" οποία δείχνει στη γονική αλλαγή του χώÏου εÏγασίας. Με την επιλογή\n"
+" '-r REV' (όπου REV μποÏεί να είναι και μια υπάÏχουσα ετικέτα)\n"
+" μποÏείτε να οÏίσετε μια νέα ετικέτα για οποιαδήποτε έκδοση.\n"
+" "
+
+msgid "a bookmark of this name does not exist"
+msgstr "δεν υπάÏχει σελιδοδείκτης με αυτό το όνομα"
+
+msgid "a bookmark of the same name already exists"
+msgstr "υπάÏχει ήδη σελιδοδείκτης με αυτό το όνομα"
+
+msgid "new bookmark name required"
+msgstr "απαιτείται ένα όνομα νέου σελιδοδείκτη"
+
+msgid "bookmark name required"
+msgstr "απαιτείται όνομα σελιδοδείκτη"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "το όνομα ενός σελιδοδείκτη δεν επιτÏέπεται να πεÏιέχει χαÏακτήÏες αλλαγής γÏαμμής"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "οι σελιδοδείκτες δεν επιτÏέπεται να έχουν το όνομα ενός υπάÏχοντος κλάδου"
+
+msgid "force"
+msgstr "force"
+
+msgid "revision"
+msgstr "αλλαγή"
+
+msgid "delete a given bookmark"
+msgstr "διαγÏαφή ενός σελιδοδείκτη"
+
+msgid "rename a given bookmark"
+msgstr "μετονομασία ενός σελιδοδείκτη"
+
+msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-m ΟÎΟΜΑ] [-r REV] [REV]"
+
+#, fuzzy
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The hook does not change\n"
+"bug status."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"The hook updates the Bugzilla database directly. Only Bugzilla\n"
+"installations using MySQL are supported."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"The hook relies on a Bugzilla script to send bug change notification\n"
+"emails. That script changes between Bugzilla versions; the\n"
+"'processmail' script used prior to 2.18 is replaced in 2.18 and\n"
+"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n"
+"be run by Mercurial as the user pushing the change; you will need to\n"
+"ensure the Bugzilla install file permissions are set appropriately."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"The extension is configured through three different configuration\n"
+"sections. These keys are recognized in the [bugzilla] section:"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"host\n"
+" Hostname of the MySQL server holding the Bugzilla database."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"db\n"
+" Name of the Bugzilla database in MySQL. Default 'bugs'."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"user\n"
+" Username to use to access MySQL server. Default 'bugs'."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"password\n"
+" Password to use to access MySQL server."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"version\n"
+" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n"
+" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n"
+" to 2.18."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" '/var/www/html/bugzilla'."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n"
+" and 'user' (committer bugzilla email). Default depends on version;\n"
+" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n"
+" %(id)s %(user)s\"."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"style\n"
+" The style file to use when formatting comments."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies::"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" {bug} The Bugzilla bug ID.\n"
+" {root} The full pathname of the Mercurial repository.\n"
+" {webroot} Stripped pathname of the Mercurial repository.\n"
+" {hgweb} Base URL for browsing Mercurial repositories."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" Default 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"usermap\n"
+" Path of file containing Mercurial committer ID to Bugzilla user ID\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"The [usermap] section is used to specify mappings of Mercurial\n"
+"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n"
+"\"committer\"=\"Bugzilla user\""
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid "Finally, the [web] section supports one entry:"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"baseurl\n"
+" Base URL for browsing Mercurial repositories. Reference from\n"
+" templates as {hgweb}."
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid "Activating the extension::"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid "Example configuration:"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+"This example configuration is for a collection of Mercurial\n"
+"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n"
+"installation in /opt/bugzilla-3.2. ::"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid "Commits add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, fuzzy
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+"διασÏνδεση με το bug tracker Bugzilla\n"
+"\n"
+"Αυτή η επέκταση Ï€Ïοσθέτει σχόλια σε bugs στο Bugzilla όταν δει κάποια\n"
+"αλλαγή να αναφέÏεται σε ανοιχτά bugs. Το hook της επέκτασης δεν αλλάζει\n"
+"την κατάσταση του bug.\n"
+"\n"
+"Το hook ενημεÏώνει απευθείας τη βάση δεδομένων του Bugzilla. Αυτή η\n"
+"έκδοση υποστηÏίζει μόνο εγκαταστάσεις του Bugzilla που χÏησιμοποιοÏν τη\n"
+"βάση δεδομένων MySQL.\n"
+"\n"
+"Το hook καλεί εσωτεÏικά το script του Bugzilla για ειδοποιήσεις μέσω\n"
+"email. Το script έχει διαφοÏετικό όνομα σε μεÏικές εκδόσεις του\n"
+"Bugzilla. ΜέχÏι την έκδοση 2.18 λέγεται 'processmail'. Από την έκδοση\n"
+"2.18 και μετά αντικαταστάθηκε από το 'config/sendbugmail.pl'. Το script\n"
+"εκτελείται με τα δικαιώματα του χÏήστη που στέλνει τις αλλαγές μέσω\n"
+"Mercurial· μποÏεί να χÏειαστεί να Ïυθμίσετε τις άδειες χÏήστη στην\n"
+"εγκατάσταση του Bugzilla για να λειτουÏγήσει σωστά.\n"
+"\n"
+"Η επέκταση bugzilla Ïυθμίζεται μέσω Ï„Ïιών διαφοÏετικών τμημάτων του\n"
+"αÏχείου εκκίνησης του Mercurial. Οι παÏακω επιλογές αναγνωÏίζονται στο\n"
+"τμήμα [bugzilla]:\n"
+"\n"
+"host\n"
+" Το όνομα του εξυπηÏετητή MySQL για τη βάση δεδομένων του Bugzilla.\n"
+"\n"
+"db\n"
+" Το όνομα της βάσης δεδομένων MySQL του Bugzilla. ΠÏοκαθοÏισμένο όνομα\n"
+" 'bugs'.\n"
+"\n"
+"user\n"
+" Το όνομα χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL. ΠÏοκαθοÏισμένο\n"
+" όνομα 'bugs'.\n"
+"\n"
+"password\n"
+" Κωδικός χÏήστη για Ï€Ïόσβαση στον εξυπηÏετητή MySQL.\n"
+"\n"
+"timeout\n"
+" ΧÏονικό ÏŒÏιο Ï€Ïόσβασης στη βάση δεδομένων (δευτεÏόλεπτα).\n"
+" ΠÏοκαθοÏισμένος χÏόνος 5.\n"
+"\n"
+"version\n"
+" Έκδοση Bugzilla. ΟÏίστε '3.0' για την έκδοση 3.0 ή νεώτεÏες, '2.18'\n"
+" για εκδόσεις από 2.18 έως και 3.0, και '2.16' για εκδόσεις πιο παλιές\n"
+" από την 2.18.\n"
+"\n"
+"bzuser\n"
+" Εναλλακτικό όνομα χÏήστη Bugzilla. Το όνομα του χÏήστη Bugzilla που\n"
+" θα χÏησιμοποιείται όταν ο αÏχικός συγγÏαφέας μιας αλλαγής δε μποÏεί να\n"
+" βÏεθεί ως χÏήστης στο Bugzilla.\n"
+"\n"
+"bzdir\n"
+" Ο κατάλογος εγκατάστασης του Bugzilla. ΧÏησιμοποιείται από τον\n"
+" Ï€ÏοκαθοÏισμένο μηχανισμό ειδοποιήσεων. ΠÏοκαθοÏισμένος κατάλογος\n"
+" '/var/www/html/bugzilla'.\n"
+"\n"
+"notify\n"
+" Η εντολή που χÏησιμοποιείται για την αποστολή ειδοποιήσεων μέσω\n"
+" Bugzilla. Η επέκταση υποστηÏίζει Ï„Ïία κλειδιά στην τιμή αυτής της\n"
+" εντολής: 'bzdir', 'id' (bug id) και 'user' (το όνομα χÏήστη στο\n"
+" bugzilla). Η Ï€ÏοκαθοÏισμένη τιμή εξαÏτάται από την έκδοση του\n"
+" Bugzilla. Για την έκδοση 2.18 και νεότεÏες είναι \\\"cd %(bzdir)s &&\n"
+" perl -T contrib/sendbugmail.pl %(id)s %(user)s\\\".\n"
+"\n"
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \\\"()\\\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive.\n"
+"\n"
+"style\n"
+" Το αÏχείο στυλ που θα χÏησιμοποιείται για την μοÏφοποίηση των σχολίων.\n"
+"\n"
+"template\n"
+" ΠÏότυπο μοÏφοποίησης σχολίων. Όταν οÏίζεται έχει Ï€ÏοτεÏαιότητα σε\n"
+" σχέση με το αÏχείο στυλ. ΥποστηÏίζονται όλες οι συνηθισμένες λέξεις\n"
+" κλειδιά των Ï€ÏοτÏπων του Mercurial, κι επιπλέον οι εξής ειδικές λέξεις\n"
+" κλειδιά::\n"
+"\n"
+" {bug} Το ID ενός bug στο Bugzilla.\n"
+" {root} Ο πλήÏης κατάλογος ενός αποθετηÏίου Mercurial.\n"
+" {webroot} ΣÏντομη μοÏφή του καταλόγου ενός αποθετηÏίου.\n"
+" {hgweb} ΑÏχικό URL για Ï€Ïοβολή των αποθετηÏίων Mercurial.\n"
+"\n"
+" ΠÏοκαθοÏισμένη τιμή: 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\\\ndetails:\\\\n\\\\t{desc|tabindent}'\n"
+"\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0.\n"
+"\n"
+"usermap\n"
+"\n"
+" Η διαδÏομή του αÏχείου αντιστοίχησης του ονόματος κάθε συγγÏαφέα από\n"
+" το Mercurial σε Bugzilla user ID. Όταν οÏίζεται αυτή η επιλογή το\n"
+" αÏχείο Ï€Ïέπει να πεÏιέχει μια αντιστοίχηση ανά γÏαμμή. Κάθε γÏαμμή\n"
+" είναι της μοÏφής \\\"committer\\\"=\\\"Bugzilla user\\\". Δείτε και την\n"
+" πεÏιγÏαφή του τμήματος [usermap].\n"
+"\n"
+"Το τμήμα [usermap] χÏησιμοποιείται για την αντιστοίχηση του ονόματος\n"
+"κάθε συγγÏαφέα από το όνομα που χÏησιμοποιεί στο Mercurial στο όνομα\n"
+"χÏήστη που έχει στο Bugzilla. Δείτε επίσης την πεÏιγÏαφή της επιλογής\n"
+"[bugzilla].usermap. Η μοÏφή που έχει κάθε γÏαμμή στο usermap είναι::\n"
+"\n"
+"\\\"committer\\\"=\\\"Bugzilla user\\\"\n"
+"\n"
+"Τέλος, στο τμήμα [web] υποστηÏίζεται η εξής επιλογή:\n"
+"\n"
+"baseurl\n"
+" ΑÏχικός κατάλογος για Ï€Ïοβολή των αποθετηÏίων Mercurial. Η τιμή του\n"
+" baseurl χÏησιμοποιείται από τα Ï€Ïότυπα μοÏφοποίησης ως {hgweb}.\n"
+"\n"
+"ΕνεÏγοποίηση της επέκτασης::\n"
+"\n"
+" [extensions]\n"
+" bugzilla =\n"
+"\n"
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook\n"
+"\n"
+"ΠαÏάδειγμα Ïυθμίσεων:\n"
+"\n"
+"Οι παÏακάτω Ïυθμίσεις αναφέÏονται σε μια συλλογή αποθετηÏίων Mercurial\n"
+"στον κατάλογο /var/local/hg/repos/ και μια τοπική εγκατάσταση του\n"
+"Bugzilla 3.2 με αÏχικό κατάλογο τον /opt/bugzilla-3.2. ::\n"
+"\n"
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Αλλαγή {node|short} στο {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\\\n\n"
+" {desc}\\\\n\n"
+" strip=5\n"
+"\n"
+" [web]\n"
+" baseurl=http://dev.domain.com/hg\n"
+"\n"
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com\n"
+"\n"
+"Οι αλλαγές που στέλνονται στα αποθετήÏια Ï€Ïοσθέτουν στα αντίστοιχα bug\n"
+"report ένα σχόλιο της μοÏφής::\n"
+"\n"
+" Αλλαγή 3b16791d6642 στο όνομα-αποθετηÏίου.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642\n"
+"\n"
+" ΠεÏιγÏαφή της αλλαγής. Bug 1234.\n"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "σÏνδεση στο %s:%s ως %s, κωδικός %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "αίτηση: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "αποτυχία αίτησης: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "άγνωστο σχήμα βάσης"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "το Ï€Ïόβλημα %d έχει ενημεÏωθεί ήδη για την αλλαγή %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "ειδοποίηση του bugzilla να στείλει email:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " Ï€Ïόβλημα %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "εκτέλεση εντολής ειδοποίησης %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "εντολή ειδοποίησης bugzilla %s"
+
+msgid "done\n"
+msgstr "ολοκληÏώθηκε\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "αναζήτηση χÏήστη %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "δε βÏέθηκε χÏήστης bugzilla με το αναγνωÏιστικό %s"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "δε βÏέθηκε χÏήστης bugzilla με το αναγνωÏιστικό %s ή %s"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "η έκδοση %s του bugzilla δεν υποστηÏίζεται"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"η αλλαγή {node|short} στο αποθετήÏιο {root} αναφέÏεται στο bug {bug}.\n"
+"λεπτομέÏειες:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "δεν έχει εγκατασταθεί η υποστήÏιξη mysql για την python: %s"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr "τα hooks Ï„Ïπου %s δεν πεÏνοÏν αναγνωÏιστικό αλλαγής"
+
+#, python-format
+msgid "database error: %s"
+msgstr "σφάλμα βάσης δεδομένων: %s"
+
+msgid "command to display child changesets"
+msgstr "εντολή Ï€Ïοβολής εξαÏτώμενων αλλαγών"
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "show children of the specified revision"
+msgstr ""
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r ΕΚΔΟΣΗ] [ΑΡΧΕΙΟ]"
+
+msgid "command to display statistics about repository history"
+msgstr "εντολή η οποία δείχνει κάποια στατιστικά για το ιστοÏικό του αποθετηÏίου"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr "Η αλλαγή %d είναι αλλαγή συγχώνευσης, αγνοείται...\n"
+
+#, python-format
+msgid "generating stats: %d%%"
+msgstr "υπολογισμός στατιστικών: %d%%"
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+msgid "count rate for revisions matching date spec"
+msgstr ""
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "display added/removed lines separately"
+msgstr ""
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "show progress"
+msgstr "Ï€Ïοβολή Ï€Ïοόδου"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]"
+msgstr ""
+
+msgid "colorize output from some commands"
+msgstr ""
+
+msgid ""
+"This extension modifies the status command to add color to its output\n"
+"to reflect file status, the qseries command to add color to reflect\n"
+"patch status (applied, unapplied, missing), and to diff-related\n"
+"commands to highlight additions, removals, diff headers, and trailing\n"
+"whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. Effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes). This module also provides the\n"
+"render_text function, which can be used to add effects to any text."
+msgstr ""
+
+msgid "Default effects may be overridden from the .hgrc file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background\n"
+msgstr ""
+
+msgid "when to colorize (always, auto, or never)"
+msgstr ""
+
+msgid "don't colorize output (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr ""
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with '-hg' appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If <REVMAP> isn't given, it will be put in a default location\n"
+" (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file\n"
+" that maps each source commit ID to the destination ID for that\n"
+" revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so convert-repo can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The [username mapping] file is a simple text file that maps each\n"
+" source commit author to a destination commit author. It is handy\n"
+" for source SCMs that use unix logins to identify authors (eg:\n"
+" CVS). One line per author mapping and the line format is:\n"
+" srcauthor=whatever string you want"
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Comment lines start with '#'. Each line can\n"
+" contain one of the following directives::"
+msgstr ""
+
+msgid " include path/to/file"
+msgstr ""
+
+msgid " exclude path/to/file"
+msgstr ""
+
+msgid " rename from/file to/file"
+msgstr ""
+
+msgid ""
+" The 'include' directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The 'exclude' directive causes files or directories to\n"
+" be omitted. The 'rename' directive renames a file or directory. To\n"
+" rename from a subdirectory into the root of the repository, use\n"
+" '.' as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values. The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form \"original_branch_name new_branch_name\".\n"
+" \"original_branch_name\" is the name of the branch in the source\n"
+" repository, and \"new_branch_name\" is the name of the branch is the\n"
+" destination repository. This can be used to (for instance) move code\n"
+" in one repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ----------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.ignoreerrors=False (boolean)\n"
+" ignore integrity errors when reading. Use it to fix Mercurial\n"
+" repositories with missing revlogs, by converting from and to\n"
+" Mercurial.\n"
+" --config convert.hg.saverev=False (boolean)\n"
+" store original revision ID in changeset (forces target IDs to\n"
+" change)\n"
+" --config convert.hg.startrev=0 (hg revision identifier)\n"
+" convert start revision and its descendants"
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ----------"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is :local:. The conversion uses the top level directory\n"
+" in the sandbox to find the CVS repository, and then uses CVS rlog\n"
+" commands to find files to convert. This means that unless a\n"
+" filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The options shown are the defaults."
+msgstr ""
+
+msgid ""
+" --config convert.cvsps.cache=True (boolean)\n"
+" Set to False to disable remote log caching, for testing and\n"
+" debugging purposes.\n"
+" --config convert.cvsps.fuzz=60 (integer)\n"
+" Specify the maximum time (in seconds) that is allowed between\n"
+" commits with identical user and log message in a single\n"
+" changeset. When very large files were checked in as part of a\n"
+" changeset then the default may not be long enough.\n"
+" --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" insert a dummy revision merging the branch on which this log\n"
+" message occurs to the branch indicated in the regex.\n"
+" --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" add the most recent revision on the branch indicated in the\n"
+" regex as the second parent of the changeset."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" -----------------"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied \"svn://repo/path/\" source URL is\n"
+" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n"
+" replaces the default branch. If \"svn://repo/path/branches\" exists,\n"
+" its subdirectories are listed as possible branches. If\n"
+" \"svn://repo/path/tags\" exists, it is looked for tags referencing\n"
+" converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n"
+" can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid ""
+" --config convert.svn.branches=branches (directory name)\n"
+" specify the directory containing branches\n"
+" --config convert.svn.tags=tags (directory name)\n"
+" specify the directory containing tags\n"
+" --config convert.svn.trunk=trunk (directory name)\n"
+" specify the name of the trunk branch"
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" --config convert.svn.startrev=0 (svn revision number)\n"
+" specify start Subversion revision."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" ---------------"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ...-hg."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision."
+msgstr ""
+
+msgid ""
+" --config convert.p4.startrev=0 (perforce changelist number)\n"
+" specify initial Perforce revision."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" ---------------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.clonebranches=False (boolean)\n"
+" dispatch source branches in separate clones.\n"
+" --config convert.hg.tagsbranch=default (branch name)\n"
+" tag revisions branch name\n"
+" --config convert.hg.usebranchnames=True (boolean)\n"
+" preserve branch names"
+msgstr ""
+
+msgid " "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr "Ï€Ïοβολή γονικών αλλαγών"
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]"
+
+msgid "warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr ""
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr ""
+
+#, python-format
+msgid "%s error:\n"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr ""
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr ""
+
+#, python-format
+msgid "convert: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr ""
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr ""
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr ""
+
+msgid "not all revisions were sorted"
+msgstr ""
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr ""
+
+msgid "sorting...\n"
+msgstr ""
+
+msgid "converting...\n"
+msgstr ""
+
+#, python-format
+msgid "source: %s\n"
+msgstr ""
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr ""
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr ""
+
+msgid "CVS pserver authentication failed"
+msgstr ""
+
+#, python-format
+msgid "unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr ""
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr ""
+
+msgid "collecting CVS rlog\n"
+msgstr ""
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr ""
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr ""
+
+#, python-format
+msgid "running %s\n"
+msgstr "εκτέλεση %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "το αÏχείο RCS Ï€Ïέπει να ακολουθείται από ένα αÏχείο εÏγασίας"
+
+msgid "must have at least some revisions"
+msgstr "Ï€Ïέπει να υπάÏχουν κάποιες εκδόσεις αÏχείων"
+
+msgid "expected revision number"
+msgstr "αναμένεται αÏιθμός έκδοσης αÏχείου"
+
+msgid "revision must be followed by date line"
+msgstr "η έκδοση αÏχείου Ï€Ïέπει να ακολουθείται από γÏαμμή ημεÏομηνίας"
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "αποθήκευση Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Î½Ï„Î¹Î³Ïάφου cvs log %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d εκδόσεις αÏχείων\n"
+
+msgid "creating changesets\n"
+msgstr "δημιουÏγία αλλαγών\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "μια συνθετική αλλαγή δε μποÏεί να έχει πολλές γονικές αλλαγές"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"Ï€Ïοειδοποίηση: το μήνυμα καταγÏαφής CVS αναφέÏεται στον ανÏπαÏκτο κλάδο %r:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d αλλαγές\n"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr ""
+
+msgid "Python ElementTree module is not available"
+msgstr "δεν είναι διαθέσιμο το άÏθÏωμα ElementTree της Python"
+
+msgid "internal calling inconsistency"
+msgstr "εσωτεÏικό Ï€Ïόβλημα κλήσης"
+
+msgid "errors in filemap"
+msgstr "λάθη στο filemap"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: η εγγÏαφή %r υπάÏχει ήδη στη λίστα %s\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: άγνωστη εντολή %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "το αποθετήÏιο πηγής δεν υποστηÏίζει την επιλογή --filemap"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repo"
+msgstr "το %s δε φαίνεται να είναι αποθετήÏιο Arch"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "δεν είναι διαθέσιμο το εÏγαλείο GNU Arch"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "ανάλυση καταλόγου αÏχείων για την έκδοση %s...\n"
+
+#, python-format
+msgid "tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr "η ανάλυση καταλόγου διακόπηκε επειδή πεÏιέχει αναφοÏά στην συλλογή αÏχείων %s, η οποία δεν υπάÏχει ή δεν είναι διαθέσιμη...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr ""
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr ""
+
+msgid "filtering out empty revision\n"
+msgstr ""
+
+msgid "updating tags\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr ""
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a monotone repo"
+msgstr ""
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+msgid "reading p4 views\n"
+msgstr ""
+
+msgid "collecting p4 changelists\n"
+msgstr ""
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+msgid "svn: cannot probe remote repository, assume it could be a subversion repository. Use --source-type if you know better.\n"
+msgstr ""
+
+msgid "Subversion python bindings could not be loaded"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr ""
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr ""
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr ""
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr ""
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr ""
+
+#, python-format
+msgid "no tags found at revision %d\n"
+msgstr ""
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr ""
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr ""
+
+#, python-format
+msgid "initializing svn repo %r\n"
+msgstr ""
+
+#, python-format
+msgid "initializing svn wc %r\n"
+msgstr ""
+
+msgid "unexpected svn output:\n"
+msgstr ""
+
+msgid "unable to cope with svn output"
+msgstr ""
+
+msgid "XXX TAGS NOT IMPLEMENTED YET\n"
+msgstr ""
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows to configure new diff commands, so\n"
+"you do not need to type \"hg extdiff -p kdiff3\" always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal \"hg\n"
+"diff\" command. The extdiff extension makes snapshots of only needed\n"
+"files, so running the external diff program will actually be pretty\n"
+"fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr ""
+
+msgid "cleaning up temp directory\n"
+msgstr ""
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "change made by revision"
+msgstr ""
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]..."
+
+msgid "pull, update and merge in one command"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid ""
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+
+msgid "outstanding uncommitted merge"
+msgstr ""
+
+msgid "outstanding uncommitted changes"
+msgstr "υπάÏχουν τοπικές αλλαγές ακόμη"
+
+msgid "working directory is missing some files"
+msgstr "λείπουν οÏισμένα αÏχεία από το χώÏο εÏγασίας"
+
+msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr ""
+
+msgid "Other repository doesn't support revision lookup, so a rev cannot be specified."
+msgstr ""
+
+#, python-format
+msgid "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "ενημέÏωση σε %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "συγχώνευση με %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+
+msgid "a specific revision you would like to pull"
+msgstr ""
+
+msgid "edit commit message"
+msgstr "επεξεÏγασία μηνÏματος καταγÏαφής"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr ""
+
+msgid "switch parents when merging"
+msgstr ""
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [ΠΗΓΗ]"
+
+msgid "commands to sign and verify changesets"
+msgstr ""
+
+msgid "error while verifying signature"
+msgstr "σφάλμα επιβεβαίωσης υπογÏαφής"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr ""
+
+msgid "list signed changesets"
+msgstr "Ï€Ïοβολή λίστας υπογεγÏαμμένων αλλαγών"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr ""
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr "Δεν υπάÏχει έγκυÏη υπογÏαφή για την αλλαγή %s\n"
+
+msgid "add a signature for the current or given revision"
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+
+msgid "Error while signing"
+msgstr "Σφάλμα δημιουÏγίας υπογÏαφής"
+
+msgid "working copy of .hgsigs is changed (please commit .hgsigs manually or use --force)"
+msgstr ""
+
+msgid "unknown signature version"
+msgstr ""
+
+msgid "make the signature local"
+msgstr ""
+
+msgid "sign even if the sigfile is modified"
+msgstr ""
+
+msgid "do not commit the sigfile after signing"
+msgstr ""
+
+msgid "the key id to sign with"
+msgstr "το κλειδί με το οποίο δημιουÏγοÏνται υπογÏαφές"
+
+msgid "commit message"
+msgstr "μήνυμα καταγÏαφής"
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr "hg sign [ΕΠΙΛΟΓΗ]... [ΑΛΛΑΓΗ]..."
+
+msgid "hg sigcheck REVISION"
+msgstr "hg sigcheck ΑΛΛΑΓΗ"
+
+msgid "hg sigs"
+msgstr ""
+
+msgid "command to view revision graphs from a shell"
+msgstr ""
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "--graph option is incompatible with --%s"
+msgstr ""
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr ""
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "σÏγκÏιση με %s\n"
+
+msgid "no changes found\n"
+msgstr "δεν υπάÏχουν αλλαγές\n"
+
+msgid "show the revision DAG"
+msgstr ""
+
+msgid "limit number of changes displayed"
+msgstr ""
+
+msgid "show patch"
+msgstr "Ï€Ïοβολή patch"
+
+msgid "show the specified revision or range"
+msgstr ""
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr "hg glog [ΕΠΙΛΟΓΗ]... [ΑΡΧΕΙΟ]"
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The hg view command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your .hgrc file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr ""
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr ""
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr ""
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr "αναζήτηση"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr ""
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr ""
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr ""
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr ""
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr ""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr ""
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr ""
+
+msgid "used internally by daemon mode"
+msgstr ""
+
+msgid "minutes to sit idle before exiting"
+msgstr ""
+
+msgid "name of file to write process ID to"
+msgstr ""
+
+msgid "hg inserve [OPTION]..."
+msgstr ""
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr ""
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+msgid "cannot start: socket is already bound"
+msgstr ""
+
+msgid "cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword] and [keywordmaps] sections of\n"
+"hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+"NOTE: the more specific you are in your filename patterns the less you\n"
+"lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run \"hg kwdemo\". See \"hg help templates\" for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid ""
+"An additional date template filter {date|utcdate} is provided. It\n"
+"returns a date like \"2006/09/18 15:13:13\"."
+msgstr ""
+
+msgid ""
+"The default template mappings (view with \"hg kwdemo -d\") can be\n"
+"replaced with customized keywords and templates. Again, run \"hg\n"
+"kwdemo\" to control the results of your config changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, run \"hg kwshrink\" to avoid\n"
+"the risk of inadvertently storing expanded keywords in the change\n"
+"history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+"\"hg kwexpand\"."
+msgstr ""
+
+msgid ""
+"Also, when committing with the record extension or using mq's qrecord,\n"
+"be aware that keywords cannot be updated. Again, run \"hg kwexpand\" on\n"
+"the files in question to update keyword expansions after all changes\n"
+"have been checked in."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See \"hg help templates\" for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "δημιουÏγία Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ï€Î¿Î¸ÎµÏ„Î·Ïίου %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default keyword template maps\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "unhooked all commit hooks\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See \"hg help keyword\" on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid ""
+" Run before changing/disabling active keywords or if you experience\n"
+" problems with \"hg import\" or \"hg merge\"."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "only show unknown (not tracked) files"
+msgstr ""
+
+msgid "show keyword status flags of all files (DEPRECATED)"
+msgstr ""
+
+msgid "only show untracked files (DEPRECATED)"
+msgstr ""
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr ""
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+
+msgid "Common tasks (use \"hg help command\" for more details)::"
+msgstr ""
+
+msgid ""
+" prepare repository to work with patches qinit\n"
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh\n"
+msgstr ""
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr ""
+
+msgid "guard cannot be an empty string"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr ""
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr ""
+
+#, python-format
+msgid "guard %r too short"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr ""
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "update returned %d"
+msgstr ""
+
+msgid "repo commit failed"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr ""
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr ""
+
+#, python-format
+msgid "applying %s\n"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "αποτυχία ανάγνωσης του %s\n"
+
+#, python-format
+msgid "imported patch %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"imported patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr ""
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr ""
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr ""
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr ""
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr ""
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr ""
+
+msgid "no patches applied"
+msgstr ""
+
+msgid "working directory revision is not qtip"
+msgstr ""
+
+msgid "local changes found, refresh first"
+msgstr ""
+
+msgid "local changes found"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr ""
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr ""
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "σφάλμα διαγÏαφής του %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series"
+msgstr ""
+
+msgid "(working directory not at a head)\n"
+msgstr "(ο χώÏος εÏγασίας δεν ταιÏιάζει με κάποιο υπάÏχοντα κλάδο)\n"
+
+msgid "no patches in series\n"
+msgstr "δεν υπάÏχουν patches στην ακολουθία\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr ""
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr ""
+
+#, python-format
+msgid "guarded by %r"
+msgstr ""
+
+msgid "no matching guards"
+msgstr ""
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr ""
+
+msgid "all patches are currently applied\n"
+msgstr ""
+
+msgid "patch series already fully applied\n"
+msgstr ""
+
+msgid "cleaning up working directory..."
+msgstr ""
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr ""
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "Ï„ÏŽÏα στο: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "το patch %s δεν έχει εφαÏμοστεί"
+
+msgid "no patches applied\n"
+msgstr "δεν έχει εφαÏμοστεί κανένα patch\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr ""
+
+msgid "qpop: forcing dirstate update\n"
+msgstr ""
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr ""
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr "αφαίÏεση του %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "η ακολουθία των patches είναι Ï„ÏŽÏα κενή\n"
+
+msgid "cannot refresh a revision with children"
+msgstr ""
+
+msgid "refresh interrupted while patch was popped! (revert --all, qpush to recover)\n"
+msgstr ""
+
+msgid "patch queue directory already exists"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr ""
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "επαναφοÏά κατάστασης: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "queue directory updating\n"
+msgstr ""
+
+msgid "Unable to load queue repository\n"
+msgstr ""
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr ""
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr ""
+
+msgid "option \"-r\" not valid when importing files"
+msgstr ""
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr ""
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr ""
+
+msgid "-e is incompatible with import from -"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "το patch %s δεν υπάÏχει"
+
+msgid "need --name to import a patch from -"
+msgstr ""
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "Ï€Ïοσθήκη του %s στο αÏχείο series\n"
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the qfinish command."
+msgstr ""
+
+msgid "print the patches already applied"
+msgstr ""
+
+msgid "only one patch applied\n"
+msgstr "μόνο ένα patch έχει εφαÏμοστεί\n"
+
+msgid "print the patches not yet applied"
+msgstr ""
+
+msgid "all patches applied\n"
+msgstr "όλα τα patches έχουν εφαÏμοστεί\n"
+
+msgid "import a patch"
+msgstr ""
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes."
+msgstr ""
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag.\n"
+" "
+msgstr ""
+
+msgid "init a new queue repository"
+msgstr ""
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+
+msgid "clone main and patch repository at same time"
+msgstr ""
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by qinit -c.\n"
+" "
+msgstr ""
+
+msgid "versioned patch repository not found (see qinit -c)"
+msgstr ""
+
+msgid "cloning main repository\n"
+msgstr "κλωνοποίηση του κεντÏÎ¹ÎºÎ¿Ï Î±Ï€Î¿Î¸ÎµÏ„Î·Ïίου\n"
+
+msgid "cloning patch repository\n"
+msgstr ""
+
+msgid "stripping applied patches from destination repository\n"
+msgstr ""
+
+msgid "updating destination repository\n"
+msgstr "ενημέÏωση του αποθετηÏίου Ï€ÏοοÏισμοÏ\n"
+
+msgid "commit changes in the queue repository"
+msgstr ""
+
+msgid "print the entire series file"
+msgstr "Ï€Ïοβολή ολόκληÏης της ακολουθίας των patches"
+
+msgid "print the name of the current patch"
+msgstr "Ï€Ïοβολή του ονόματος του Ï„Ïέχοντος patch"
+
+msgid "print the name of the next patch"
+msgstr "Ï€Ïοβολή του ονόματος του επόμενου patch"
+
+msgid "print the name of the previous patch"
+msgstr "Ï€Ïοβολή του ονόματος του Ï€ÏοηγοÏμενου patch"
+
+msgid "create a new patch"
+msgstr ""
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). It will refuse to run if there are any outstanding changes\n"
+" unless -f/--force is specified, in which case the patch will be\n"
+" initialized with them. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information.\n"
+" "
+msgstr ""
+
+msgid "update the current patch"
+msgstr ""
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format.\n"
+" "
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "η επιλογή \"-e\" είναι ασÏμβατη με τις \"-m\" και \"-l\""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr ""
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use 'hg diff' if you only want to see the changes made since the\n"
+" last qrefresh, or 'hg export qtip' if you want to see changes made\n"
+" by the current patch without including changes made since the\n"
+" qrefresh.\n"
+" "
+msgstr ""
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of '* * *'."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr ""
+
+msgid "No patches applied"
+msgstr "Δεν έχει εφαÏμοστεί κανένα patch"
+
+#, python-format
+msgid "Skipping already folded patch %s"
+msgstr ""
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "Error folding patch %s"
+msgstr "Σφάλμα συγχώνευσης του patch %s"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr "εφαÏμογή ή αφαίÏεση patches μέχÏι το patch Ï€ÏοοÏÎ¹ÏƒÎ¼Î¿Ï Î½Î± είναι στην κοÏυφή της στοίβας"
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the qselect command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the qselect command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch.\n"
+" NOTE: Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr ""
+
+msgid ""
+" hg qguard -- other.patch +2.6.17 -stable\n"
+" "
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr ""
+
+#, python-format
+msgid "no patch named %s"
+msgstr "δεν υπάÏχει patch με το όνομα %s"
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+msgid "push the next patch onto the stack"
+msgstr ""
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost.\n"
+" "
+msgstr ""
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "συγχώνευση με την ουÏά: %s\n"
+
+msgid "pop the current patch off the stack"
+msgstr ""
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr ""
+
+msgid "rename a patch"
+msgstr ""
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+
+#, python-format
+msgid "%s already exists"
+msgstr "το %s υπάÏχει ήδη"
+
+#, python-format
+msgid "A patch named %s already exists in the series file"
+msgstr "ΥπάÏχει ήδη ένα patch με το όνομα %s στο αÏχείο series "
+
+msgid "restore the queue state saved by a revision"
+msgstr ""
+
+msgid "save current queue state"
+msgstr "αποθήκευση της Ï„Ïέχουσας κατάστασης της σειÏάς patch"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr ""
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "αντιγÏαφή του %s σε %s\n"
+
+msgid "strip a revision and all its descendants from the repository"
+msgstr ""
+
+msgid ""
+" If one of the working directory's parent revisions is stripped, the\n"
+" working directory will be updated to the parent of the stripped\n"
+" revision.\n"
+" "
+msgstr ""
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the qguard command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream.\n"
+" "
+msgstr ""
+
+msgid "no revisions specified"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr ""
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr ""
+
+msgid "show only the last patch"
+msgstr ""
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr ""
+
+msgid "do not update the new working directories"
+msgstr ""
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr ""
+
+msgid "location of source patch repository"
+msgstr ""
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "keep patch file"
+msgstr ""
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [-r REV]... [PATCH]..."
+msgstr ""
+
+msgid "edit patch header"
+msgstr ""
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr ""
+
+msgid "overwrite any local changes"
+msgstr ""
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr ""
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
+msgstr ""
+
+msgid "hg qheader [PATCH]"
+msgstr ""
+
+msgid "import file in patch directory"
+msgstr ""
+
+msgid "name of patch file"
+msgstr "όνομα του αÏχείου patch"
+
+msgid "overwrite existing files"
+msgstr ""
+
+msgid "place existing revisions under mq control"
+msgstr ""
+
+msgid "use git extended diff format"
+msgstr "χÏήση των επεκτάσεων του git για τα αÏχεία diff"
+
+msgid "qpush after importing"
+msgstr ""
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr ""
+
+msgid "create queue repository"
+msgstr "δημιουÏγία αποθετηÏίου για το queue"
+
+msgid "hg qinit [-c]"
+msgstr ""
+
+msgid "import uncommitted changes into patch"
+msgstr "ενσωμάτωση τοπικών αλλαγών στο patch"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr ""
+
+msgid "add \"From: <given user>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <given date>\" to patch"
+msgstr ""
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH [FILE]..."
+msgstr ""
+
+msgid "hg qnext [-s]"
+msgstr ""
+
+msgid "hg qprev [-s]"
+msgstr ""
+
+msgid "pop all patches"
+msgstr "αφαίÏεση όλων των patches"
+
+msgid "queue name to pop"
+msgstr ""
+
+msgid "forget any local changes to patched files"
+msgstr "ακÏÏωση όλων των τοπικών αλλαγών"
+
+msgid "hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]"
+msgstr ""
+
+msgid "apply if the patch has rejects"
+msgstr ""
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr ""
+
+msgid "merge from another queue"
+msgstr ""
+
+msgid "merge queue name"
+msgstr ""
+
+msgid "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
+msgstr ""
+
+msgid "refresh only files already in the patch and specified files"
+msgstr ""
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+msgid "add/update date field in patch with current date"
+msgstr ""
+
+msgid "add/update date field in patch with given date"
+msgstr ""
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr ""
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr ""
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr ""
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "print patches not in series"
+msgstr ""
+
+msgid "hg qseries [-ms]"
+msgstr ""
+
+msgid "force removal with local changes"
+msgstr ""
+
+msgid "bundle unrelated changesets"
+msgstr ""
+
+msgid "no backups"
+msgstr ""
+
+msgid "hg strip [-f] [-b] [-n] REV"
+msgstr ""
+
+msgid "hg qtop [-s]"
+msgstr ""
+
+msgid "show only the first patch"
+msgstr ""
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr ""
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" merge = False # send notification for merges (default True)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid "::"
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = LESS='FSRX' less"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like \"hg version\" or \"hg help\", you have to\n"
+"specify them in the global .hgrc\n"
+msgstr ""
+
+msgid "interpret suffixes to refer to ancestor revisions"
+msgstr ""
+
+msgid ""
+"This extension allows you to use git-style suffixes to refer to the\n"
+"ancestors of a specific revision."
+msgstr ""
+
+msgid "For example, if you can refer to a revision as \"foo\", then::"
+msgstr ""
+
+msgid ""
+" foo^N = Nth parent of foo\n"
+" foo^0 = foo\n"
+" foo^1 = first parent of foo\n"
+" foo^2 = second parent of foo\n"
+" foo^ = foo^1"
+msgstr ""
+
+msgid ""
+" foo~N = Nth first grandparent of foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = first parent of foo\n"
+" foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+msgstr ""
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by \"hg export\"."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"With the -d/--diffstat option, you will be prompted for each changeset\n"
+"with a diffstat summary and the changeset summary, so you can be sure\n"
+"you are sending the right changes."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your hgrc\n"
+"file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ..."
+msgstr ""
+
+msgid ""
+"Then you can use the \"hg email\" command to mail a series of changesets\n"
+"as a patchbomb."
+msgstr ""
+
+msgid ""
+"To avoid sending patches prematurely, it is a good idea to first run\n"
+"the \"email\" command with the \"-n\" option (test only). You will be\n"
+"prompted for an email recipient address, a subject and an introductory\n"
+"message describing the patches of your patchbomb. Then when all is\n"
+"done, patchbomb messages are displayed. If the PAGER environment\n"
+"variable is set, your pager will be fired up once for each patchbomb\n"
+"message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+"The -m/--mbox option is also very useful. Instead of previewing each\n"
+"patchbomb message in a pager or sending the messages directly, it will\n"
+"create a UNIX mailbox file with the patch emails. This mailbox file\n"
+"can be previewed with any mail user agent which supports UNIX mbox\n"
+"files, e.g. with mutt::"
+msgstr ""
+
+msgid " % mutt -R -f mbox"
+msgstr ""
+
+msgid ""
+"When you are previewing the patchbomb messages, you can use ``formail``\n"
+"(a utility that is commonly installed as part of the procmail\n"
+"package), to send each message out::"
+msgstr ""
+
+msgid " % formail -s sendmail -bm -t < mbox"
+msgstr ""
+
+msgid "That should be all. Now your patchbomb is on its way out."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+#, python-format
+msgid "%s Please enter a valid value"
+msgstr ""
+
+msgid "Please enter a valid value.\n"
+msgstr ""
+
+msgid "does the diffstat above look okay?"
+msgstr ""
+
+msgid "diffstat rejected"
+msgstr ""
+
+msgid "send changesets by email"
+msgstr ""
+
+msgid ""
+" By default, diffs are sent in the format generated by hg export,\n"
+" one per message. The series starts with a \"[PATCH 0 of N]\"\n"
+" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description. Next, (optionally) if the diffstat program is\n"
+" installed and -d/--diffstat is used, the result of running\n"
+" diffstat on the patch. Finally, the patch itself, as generated by\n"
+" \"hg export\"."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "οÏίστε τουλάχιστον μια αλλαγή με -r ή -o"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr "Ï€Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿Ï‚ αÏιθμός παÏαληπτών"
+
+msgid "use only one form to specify the revision"
+msgstr ""
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr ""
+
+msgid "Final summary:\n"
+msgstr ""
+
+msgid "Displaying "
+msgstr ""
+
+msgid "Writing "
+msgstr ""
+
+msgid "Sending "
+msgstr ""
+
+msgid "send patches as attachments"
+msgstr ""
+
+msgid "send patches as inline attachments"
+msgstr ""
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "add diffstat output to messages"
+msgstr ""
+
+msgid "use the given date as the sending date"
+msgstr ""
+
+msgid "use the given file as the series description"
+msgstr ""
+
+msgid "email address of sender"
+msgstr ""
+
+msgid "print messages that would be sent"
+msgstr ""
+
+msgid "write messages to mbox file instead of sending them"
+msgstr ""
+
+msgid "subject of first message (intro or single patch)"
+msgstr ""
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr ""
+
+msgid "omit hg patch header"
+msgstr ""
+
+msgid "send changes not found in the target repository"
+msgstr ""
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+
+msgid "name of the bundle attachment file"
+msgstr ""
+
+msgid "a revision to send"
+msgstr ""
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr ""
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr ""
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by \"hg status\"\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with \"hg add\")"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr ""
+
+msgid "abort if an error occurs"
+msgstr ""
+
+msgid "purge ignored files too"
+msgstr ""
+
+msgid "print filenames instead of deleting them"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr ""
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history onto another. This can be useful for linearizing local\n"
+" changes relative to a master development tree."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a.\n"
+" "
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr ""
+
+msgid "cannot use collapse with continue or abort"
+msgstr ""
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot use both keepbranches and extrafn"
+msgstr ""
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr ""
+
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr ""
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr ""
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, not stripping\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "source is ancestor of destination"
+msgstr ""
+
+msgid "source is descendant of destination"
+msgstr ""
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "rebase from a given revision"
+msgstr ""
+
+msgid "rebase from the base of a given revision"
+msgstr ""
+
+msgid "rebase onto a given revision"
+msgstr ""
+
+msgid "collapse the rebased changesets"
+msgstr "συγχώνευση των αλλαγών καθώς μεταφέÏονται"
+
+msgid "keep original changesets"
+msgstr ""
+
+msgid "keep original branch names"
+msgstr ""
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid "hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] | [-c] | [-a]"
+msgstr ""
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr ""
+
+msgid "this is a binary file\n"
+msgstr ""
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr ""
+
+msgid "&No, skip this change"
+msgstr ""
+
+msgid "&Skip remaining changes to this file"
+msgstr ""
+
+msgid "Record remaining changes to this &file"
+msgstr ""
+
+msgid "&Done, skip remaining changes and files"
+msgstr ""
+
+msgid "Record &all changes to all remaining files"
+msgstr ""
+
+msgid "&Quit, recording no changes"
+msgstr ""
+
+msgid "&?"
+msgstr ""
+
+msgid "y - record this change"
+msgstr ""
+
+msgid "user quit"
+msgstr ""
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+#, python-format
+msgid "record this change to %r?"
+msgstr ""
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr ""
+
+msgid "interactively select changes to commit"
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be candidates for recording."
+msgstr ""
+
+msgid " See 'hg help dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+
+msgid " ? - display help"
+msgstr ""
+
+msgid "'mq' extension not loaded"
+msgstr ""
+
+msgid "running non-interactively, use commit instead"
+msgstr ""
+
+msgid "no changes to record\n"
+msgstr ""
+
+msgid "patch failed to apply"
+msgstr ""
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr ""
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr ""
+
+msgid "source and destination are on different devices"
+msgstr ""
+
+#, python-format
+msgid "not linkable: %s\n"
+msgstr ""
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr ""
+
+msgid " files"
+msgstr ""
+
+msgid "relink"
+msgstr ""
+
+#, python-format
+msgid "relinked %d files (%d bytes reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository (experimental)"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" NOTE: actions that change history such as rollback or moving the\n"
+" source may confuse sharers.\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr ""
+
+msgid "Fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. If --log is\n"
+" specified, log messages will have a comment appended of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" hg transplant --branch REVISION --all will rebase the selected\n"
+" branch (up to the named revision) onto your current working\n"
+" directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, hg transplant will start\n"
+" an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling hg transplant\n"
+" --continue/-c.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid "pull patches from REPOSITORY"
+msgstr ""
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through FILTER"
+msgstr ""
+
+msgid "hg transplant [-s REPOSITORY] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- You should set same encoding for the repository by locale or\n"
+" HGENCODING."
+msgstr ""
+
+msgid ""
+"Path encoding conversion are done between Unicode and\n"
+"encoding.encoding which is decided by Mercurial from current locale\n"
+"setting or HGENCODING.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid "If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run \"hg serve\"\n"
+"in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid "You can discover zeroconf enabled repositories by running \"hg paths\"::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr ""
+
+msgid "cannot give prefix when archiving to files"
+msgstr ""
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr ""
+
+msgid "invalid changegroup"
+msgstr ""
+
+msgid "unknown parent"
+msgstr ""
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+#, python-format
+msgid "%s: not a Mercurial bundle file"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle version"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle compression type"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "premature EOF reading chunk (got %d bytes, expected %d)"
+msgstr ""
+
+msgid "empty username"
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr ""
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr ""
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr ""
+
+msgid "limit must be a positive integer"
+msgstr ""
+
+msgid "limit must be positive"
+msgstr ""
+
+msgid "too many revisions specified"
+msgstr ""
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+#, python-format
+msgid "adding %s\n"
+msgstr "Ï€Ïοσθήκη του %s\n"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "αφαίÏεση του %s\n"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr ""
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr ""
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr ""
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "μετακίνηση του %s στο %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "αντιγÏαφή του %s στο %s\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+msgid "no source or destination specified"
+msgstr ""
+
+msgid "no destination specified"
+msgstr ""
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "no files to copy"
+msgstr ""
+
+msgid "(consider using --after)\n"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "branch: %s\n"
+msgstr ""
+
+#, python-format
+msgid "tag: %s\n"
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "user: %s\n"
+msgstr ""
+
+#, python-format
+msgid "date: %s\n"
+msgstr ""
+
+msgid "files+:"
+msgstr ""
+
+msgid "files-:"
+msgstr ""
+
+msgid "files:"
+msgstr ""
+
+#, python-format
+msgid "files: %s\n"
+msgstr ""
+
+#, python-format
+msgid "copies: %s\n"
+msgstr ""
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr ""
+
+msgid "description:\n"
+msgstr ""
+
+#, python-format
+msgid "summary: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "%s: %s"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr ""
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr ""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+
+msgid "HG: Leave message empty to abort commit."
+msgstr ""
+
+#, python-format
+msgid "HG: user: %s"
+msgstr ""
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr ""
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr ""
+
+#, python-format
+msgid "HG: added %s"
+msgstr ""
+
+#, python-format
+msgid "HG: changed %s"
+msgstr ""
+
+#, python-format
+msgid "HG: removed %s"
+msgstr ""
+
+msgid "HG: no files changed"
+msgstr ""
+
+msgid "empty commit message"
+msgstr ""
+
+msgid "add the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see hg forget."
+msgstr ""
+
+msgid ""
+" If no names are given, add all files to the repository.\n"
+" "
+msgstr ""
+
+msgid "add all new files, delete all missing files"
+msgstr ""
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" .hgignore. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive.\n"
+" "
+msgstr ""
+
+msgid "similarity must be a number"
+msgstr ""
+
+msgid "similarity must be between 0 and 100"
+msgstr ""
+
+msgid "show changeset information by line for each file"
+msgstr ""
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable.\n"
+" "
+msgstr ""
+
+msgid "at least one filename or pattern is required"
+msgstr ""
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr ""
+
+msgid "create an unversioned archive of a repository revision"
+msgstr ""
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" To specify the type of archive to create, use -t/--type. Valid\n"
+" types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see 'hg help export' for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed.\n"
+" "
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr ""
+
+msgid "repository root cannot be destination"
+msgstr ""
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+
+msgid "reverse effect of earlier changeset"
+msgstr ""
+
+msgid ""
+" Commit the backed out changes as a new changeset. The new\n"
+" changeset is a child of the backed out changeset."
+msgstr ""
+
+msgid ""
+" If you backout a changeset other than the tip, a new head is\n"
+" created. This head will be the new tip and you should merge this\n"
+" backout changeset with another head."
+msgstr ""
+
+msgid ""
+" The --merge option remembers the parent of the working directory\n"
+" before starting the backout, then merges the new head with that\n"
+" changeset afterwards. This saves you from doing the merge by hand.\n"
+" The result of this merge is not committed, as with a normal merge."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr "παÏακαλώ οÏίστε μόνο μία αλλαγή"
+
+msgid "please specify a revision to backout"
+msgstr ""
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "η αλλαγή %s δεν είναι γονική αλλαγή της %s"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr ""
+
+msgid "the backout changeset is a new head - do not forget to merge\n"
+msgstr ""
+
+msgid "(use \"backout --merge\" if you want to auto-merge)\n"
+msgstr ""
+
+msgid "subdivision search of changesets"
+msgstr ""
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad.\n"
+" "
+msgstr ""
+
+msgid "The first good revision is:\n"
+msgstr "Η Ï€Ïώτη καλή %s αλλαγή είναι:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "Η Ï€Ïώτη κακή %s αλλαγή είναι:\n"
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+
+msgid "cannot bisect (no known good revisions)"
+msgstr ""
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr ""
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr ""
+
+msgid "incompatible arguments"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr ""
+
+#, python-format
+msgid "%s killed"
+msgstr ""
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "Αλλαγή %d:%s: %s\n"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr ""
+
+msgid "set or show the current branch name"
+msgstr ""
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch. Use\n"
+" 'hg commit --close-branch' to mark this branch as closed.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr ""
+
+msgid "a branch of the same name already exists (use --force to override)"
+msgstr ""
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr ""
+
+msgid "list repository named branches"
+msgstr ""
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch.\n"
+" "
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If no destination repository is specified the destination is\n"
+" assumed to have all the nodes specified by one or more --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr ""
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "output the current or given revision of files"
+msgstr ""
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed\n"
+" "
+msgstr ""
+
+msgid "make a copy of an existing repository"
+msgstr ""
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" .hg/hgrc file, as the default to be used for future pulls."
+msgstr ""
+
+msgid " See 'hg help urls' for valid source format details."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ssh:// URL as the destination, but no\n"
+" .hg/hgrc and working directory will be created on the remote side.\n"
+" Please see 'hg help urls' for important details about ssh:// URLs."
+msgstr ""
+
+msgid ""
+" If the -U/--noupdate option is specified, the new clone will contain\n"
+" only a repository (.hg) and no working copy (the working copy parent\n"
+" will be the null changeset). Otherwise, clone will initially check\n"
+" out (in order of precedence):"
+msgstr ""
+
+msgid ""
+" a) the changeset, tag or branch specified with -u/--updaterev\n"
+" b) the changeset, tag or branch given with the first -r/--rev\n"
+" c) the head of the default branch"
+msgstr ""
+
+msgid ""
+" Use 'hg clone -u . src dst' to checkout the source repository's\n"
+" parent changeset (applicable for local source repositories only)."
+msgstr ""
+
+msgid ""
+" A set of changesets (tags, or branch names) to pull may be specified\n"
+" by listing each changeset (tag, or branch name) with -r/--rev.\n"
+" If -r/--rev is used, the cloned repository will contain only a subset\n"
+" of the changesets of the source repository. Only the set of changesets\n"
+" defined by all -r/--rev options (including all their ancestors)\n"
+" will be pulled into the destination repository.\n"
+" No subsequent changesets (including subsequent tags) will be present\n"
+" in the destination."
+msgstr ""
+
+msgid ""
+" Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+" local source repositories."
+msgstr ""
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the checked out files). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+
+msgid ""
+" In some cases, you can clone repositories and checked out files\n"
+" using full hardlinks with ::"
+msgstr ""
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr ""
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq.\n"
+" "
+msgstr ""
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr ""
+
+msgid "commit the specified files or all outstanding changes"
+msgstr ""
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized RCS, this operation is a local operation. See hg push\n"
+" for a way to actively distribute your changes."
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be committed."
+msgstr ""
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+
+msgid ""
+" If no commit message is specified, the configured editor is\n"
+" started to prompt you for a message."
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr "δεν έγινε καμία αλλαγή\n"
+
+msgid "created new head\n"
+msgstr "δημιουÏγήθηκε νέο παÏακλάδι\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "αποθηκεÏθηκε η αλλαγή %d:%s\n"
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "Δεν υπάÏχει αποθετήÏιο Mercurial εδώ (δε βÏέθηκε υποκατάλογος .hg)"
+
+msgid "either two or three arguments required"
+msgstr "απαιτοÏνται δÏο ή Ï„Ïία οÏίσματα"
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "validate the correctness of the current dirstate"
+msgstr "έλεγχος εγκυÏότητας της Ï„Ïέχουσας dirstate"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr ""
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item.\n"
+" "
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr "σε αυτό το σημείο επιτÏέπεται μόνο ένα ÏŒÏισμα Ïυθμίσεων"
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care.\n"
+" "
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr "Ï€Ïοβολή πεÏιεχομένων της Ï„Ïέχουσας dirstate"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "αντιγÏαφή: %s -> %s\n"
+
+msgid "dump the contents of a data file revision"
+msgstr "εκτÏπωση πεÏιεχομένων μιας έκδοσης αÏχείου δεδομένων"
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr "μη έγκυÏο όνομα αλλαγής: %s"
+
+msgid "parse and display a date"
+msgstr "αναγνώÏιση και εκτÏπωση μιας ημεÏομηνίας"
+
+msgid "dump the contents of an index file"
+msgstr "εκτÏπωση πεÏιεχομένων ενός αÏχείου καταλόγου"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "εκτÏπωση του γÏάφου ενός καταλόγου σε μοÏφή graphviz dot"
+
+msgid "test Mercurial installation"
+msgstr "δοκιμή της εγκατάστασης του Mercurial"
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr "Έλεγχος κωδικοποίησης (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (ελέγξτε ότι έχετε τις σωστές Ïυθμίσεις γλώσσας)\n"
+
+msgid "Checking extensions...\n"
+msgstr "Έλεγχος επεκτάσεων...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " Δεν ήταν δυνατή η εÏÏεση κάποιων επεκτάσεων"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (ελέγξτε ότι έχετε μεταγλωττίσει τις επεκτάσεις)\n"
+
+msgid "Checking templates...\n"
+msgstr "Έλεγχος Ï€ÏοτÏπων...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr " (υπάÏχει κάποιο Ï€Ïόβλημα με την εγκατάσταση των Ï€ÏοτÏπων)\n"
+
+msgid "Checking patch...\n"
+msgstr "Έλεγχος εÏγαλείου patch...\n"
+
+msgid " patch call failed:\n"
+msgstr " η κλήση του patch απέτυχε:\n"
+
+msgid " unexpected patch output!\n"
+msgstr ""
+
+msgid " patch test failed!\n"
+msgstr ""
+
+msgid " (Current patch tool may be incompatible with patch, or misconfigured. Please check your .hgrc file)\n"
+msgstr ""
+
+msgid " Internal patcher failure, please report this error to http://mercurial.selenic.com/bts/\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr ""
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+
+msgid " (specify a commit editor in your .hgrc file)\n"
+msgstr ""
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr ""
+
+msgid "Checking username...\n"
+msgstr ""
+
+msgid " (specify a username in your .hgrc file)\n"
+msgstr ""
+
+msgid "No problems detected\n"
+msgstr "Δε βÏέθηκε κανένα Ï€Ïόβλημα\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr ""
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "το %s μετονομάστηκε από το %s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "το %s δε μετονομάστηκε\n"
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "diff repository (or selected files)"
+msgstr ""
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+
+msgid ""
+" NOTE: diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first parent\n"
+" changeset if no revisions are specified."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read 'hg help diffs'.\n"
+" "
+msgstr ""
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr ""
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+
+msgid ""
+" The information shown in the changeset header is: author,\n"
+" changeset hash, parent(s) and commit comment."
+msgstr ""
+
+msgid ""
+" NOTE: export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 bytes of hexadecimal)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 bytes of hexadecimal)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See 'hg help diffs' for more information."
+msgstr ""
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge.\n"
+" "
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" To undo a forget before the next commit, see hg add.\n"
+" "
+msgstr ""
+
+msgid "no files specified"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "show current repository heads or show branch heads"
+msgstr ""
+
+msgid " With no arguments, show all repository head changesets."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations."
+msgstr ""
+
+msgid ""
+" If one or more REV is given, the \"branch heads\" will be shown for\n"
+" the named branch associated with the specified changeset(s)."
+msgstr ""
+
+msgid ""
+" Branch heads are changesets on a named branch with no descendants on\n"
+" the same branch. A branch head could be a \"true\" (repository) head,\n"
+" or it could be the last changeset on that branch before it was\n"
+" merged into another branch, or it could be the last changeset on the\n"
+" branch before a new branch was created. If none of the branch heads\n"
+" are true heads, the branch is considered inactive."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed.\n"
+" "
+msgstr ""
+
+msgid "you must specify a branch to use --closed"
+msgstr ""
+
+#, python-format
+msgid "no open branch heads on branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes on branch %s containing %s are reachable from %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes on branch %s are reachable from %s\n"
+msgstr ""
+
+msgid "show help for a given topic or a help overview"
+msgstr ""
+
+msgid " With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid "global options:"
+msgstr ""
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "δείτε τη βοήθεια \"hg help\" για την πλήÏη λίστα εντολών"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+
+#, python-format
+msgid "use \"hg -v help%s\" to show aliases and global options"
+msgstr "δώστε \"hg -v help%s\" για τη λίστα εικονικών εντολών και κεντÏικών επιλογών"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "δώστε \"hg -v help %s\" για τη λίστα κεντÏικών επιλογών"
+
+msgid "list of commands:"
+msgstr "λίστα εντολών:"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"εικονικές εντολές %s:\n"
+
+msgid "(no help text available)"
+msgstr "(δεν υπάÏχει κείμενο βοήθειας)"
+
+msgid "options:\n"
+msgstr "επιλογές:\n"
+
+msgid "no commands defined\n"
+msgstr "δεν έχει οÏιστεί καμία εντολή\n"
+
+msgid "no help text available"
+msgstr "δεν υπάÏχει κείμενο βοήθειας"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr ""
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial Κατανεμημένο SCM\n"
+
+msgid "basic commands:"
+msgstr "βασικές εντολές:"
+
+msgid "enabled extensions:"
+msgstr "ενεÏγές επεκτάσεις:"
+
+msgid "DEPRECATED"
+msgstr ""
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"πεÏισσότεÏα θέματα βοήθειας:"
+
+msgid "identify the working copy or specified revision"
+msgstr ""
+
+msgid ""
+" With no revision, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid ""
+" This summary identifies the repository state using one or two\n"
+" parent hash identifiers, followed by a \"+\" if there are\n"
+" uncommitted changes in the working directory, a list of tags for\n"
+" this revision and a branch name for non-default branches.\n"
+" "
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by hg export, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+msgid "no diffs found"
+msgstr ""
+
+msgid "not a Mercurial patch"
+msgstr ""
+
+msgid "patch is damaged or loses information"
+msgstr ""
+
+msgid "show new changesets found in source"
+msgstr ""
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+
+msgid ""
+" See pull for valid source format details.\n"
+" "
+msgstr ""
+
+msgid "create a new repository in the given directory"
+msgstr ""
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ssh:// URL as the destination.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "locate files matching specific patterns"
+msgstr ""
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames.\n"
+" "
+msgstr ""
+
+msgid "show revision history of entire repository or files"
+msgstr ""
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+
+msgid ""
+" If no revision range is specified, the default is tip:0 unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+
+msgid ""
+" NOTE: log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:.\n"
+" "
+msgstr ""
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes.\n"
+" "
+msgstr ""
+
+msgid "merge working directory with another revision"
+msgstr ""
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr ""
+
+msgid "there is nothing to merge"
+msgstr ""
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr "%s - δώστε \"hg update\" καλÏτεÏα"
+
+msgid "working dir not at a head rev - use \"hg update\" or merge with an explicit rev"
+msgstr ""
+
+msgid "show changesets not found in destination"
+msgstr ""
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+
+msgid ""
+" See pull for valid destination format details.\n"
+" "
+msgstr ""
+
+msgid "show the parents of the working directory or revision"
+msgstr ""
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr ""
+
+msgid "show aliases for remote repositories"
+msgstr ""
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of /etc/mercurial/hgrc\n"
+" and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too."
+msgstr ""
+
+msgid ""
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "not found!\n"
+msgstr "δε βÏέθηκε!\n"
+
+msgid "not updating, since new heads added\n"
+msgstr "δεν εξάγεται κάποια αλλαγή, επειδή δημιουÏγήθηκε νέο παÏακλάδι\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(δώστε 'hg heads' για να δείτε τα παÏακλάδια, 'hg merge' για συγχώνευση)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(δώστε 'hg update' για να εξάγετε αντίγÏαφο εÏγασίας)\n"
+
+msgid "pull changes from the specified source"
+msgstr ""
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+
+msgid ""
+" Use hg incoming if you want to see what would have been added by a\n"
+" pull at the time you issued this command. If you then decide to\n"
+" added those changes to the repository, you should use pull -r X\n"
+" where X is the last changeset listed by hg incoming."
+msgstr ""
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "push changes to the specified destination"
+msgstr ""
+
+msgid " Push changes from the local repository to the given destination."
+msgstr ""
+
+msgid ""
+" This is the symmetrical operation for pull. It moves changes from\n"
+" the current repository to a different one. If the destination is\n"
+" local this is identical to a pull in that directory from the\n"
+" current one."
+msgstr ""
+
+msgid ""
+" By default, push will refuse to run if it detects the result would\n"
+" increase the number of remote heads. This generally indicates the\n"
+" user forgot to pull and merge before pushing."
+msgstr ""
+
+msgid ""
+" If -r/--rev is used, the named revision and all its ancestors will\n"
+" be pushed to the remote repository."
+msgstr ""
+
+msgid ""
+" Please see 'hg help urls' for important details about ssh://\n"
+" URLs. If DESTINATION is omitted, a default path will be used.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr ""
+
+msgid "roll back an interrupted transaction"
+msgstr ""
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it.\n"
+" "
+msgstr ""
+
+msgid "remove the specified files on the next commit"
+msgstr ""
+
+msgid " Schedule the indicated files for removal from the repository."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by hg status). The actions are Warn, Remove (from branch)\n"
+" and Delete (from disk)::"
+msgstr ""
+
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see hg revert.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file %s (use -f to force removal)\n"
+msgstr ""
+
+msgid "still exists"
+msgstr "υπάÏχει ακόμη"
+
+msgid "is modified"
+msgstr "έχει Ï„Ïοποποιηθεί"
+
+msgid "has been marked for add"
+msgstr "έχει σημειωθεί για Ï€Ïοσθήκη"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "retry file merges from a merge or update"
+msgstr ""
+
+msgid ""
+" This command can cleanly retry unresolved file merges using file\n"
+" revisions preserved from the last update or merge."
+msgstr ""
+
+msgid ""
+" If a conflict is resolved manually, please note that the changes\n"
+" will be overwritten if the merge is retried with resolve. The\n"
+" -m/--mark switch should be used to mark the file as resolved."
+msgstr ""
+
+msgid ""
+" You can specify a set of files to operate on, or use the -a/-all\n"
+" switch to select all unresolved files."
+msgstr ""
+
+msgid ""
+" This command also allows listing resolved files and manually\n"
+" indicating whether or not files are resolved. All files must be\n"
+" marked as resolved before a commit is permitted."
+msgstr ""
+
+msgid " The codes used to show the status of files are::"
+msgstr ""
+
+msgid ""
+" U = unresolved\n"
+" R = resolved\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr ""
+
+msgid "can't specify --all and patterns"
+msgstr ""
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr "δεν οÏίστηκαν αÏχεία ή κατάλογοι· χÏησιμοποιήστε την επιλογή --all για να επαναλάβετε τη συγχώνευση για όλα τα αÏχεία"
+
+msgid "restore individual files or directories to an earlier state"
+msgstr ""
+
+msgid ""
+" (Use update -r to check out earlier revisions, revert does not\n"
+" change the working directory parents.)"
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify the\n"
+" revision to revert to."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See 'hg help\n"
+" dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+
+msgid ""
+" If a file has been deleted, it is restored. If the executable mode\n"
+" of a file was changed, it is reset."
+msgstr ""
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup.\n"
+" "
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr "δεν επιτÏέπεται η χÏήση αλλαγής και ημεÏομηνίας ταυτόχÏονα"
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr ""
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "επαναφοÏά %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "επανάκτηση %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr ""
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr ""
+
+msgid "roll back the last transaction"
+msgstr ""
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as destination)\n"
+" - unbundle"
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr ""
+
+msgid ""
+" Print the root directory of the current repository.\n"
+" "
+msgstr ""
+
+msgid "export the repository via HTTP"
+msgstr ""
+
+msgid " Start a local HTTP repository browser and pull server."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr ""
+
+msgid "show changed files in the working directory"
+msgstr ""
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+
+msgid ""
+" NOTE: status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does not\n"
+" report permission changes and diff only reports changes relative\n"
+" to one merge parent."
+msgstr ""
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown."
+msgstr ""
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)\n"
+" "
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr ""
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming.\n"
+" "
+msgstr ""
+
+msgid " (empty repository)"
+msgstr ""
+
+msgid " (no revision checked out)"
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s %s\n"
+msgstr ""
+
+#, python-format
+msgid "branch: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d added"
+msgstr ""
+
+#, python-format
+msgid "%d modified"
+msgstr "%d Ï„Ïοποποιήθηκαν"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d αφαιÏέθηκαν"
+
+#, python-format
+msgid "%d deleted"
+msgstr ""
+
+#, python-format
+msgid "%d ignored"
+msgstr ""
+
+#, python-format
+msgid "%d unknown"
+msgstr ""
+
+#, python-format
+msgid "%d unresolved"
+msgstr ""
+
+msgid " (merge)"
+msgstr ""
+
+msgid " (new branch)"
+msgstr ""
+
+msgid " (clean)"
+msgstr ""
+
+msgid " (new branch head)"
+msgstr ""
+
+#, python-format
+msgid "commit: %s\n"
+msgstr ""
+
+msgid "update: (current)\n"
+msgstr ""
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "update: %d νέες αλλαγές (ενημεÏώστε)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "update: %d νέες αλλαγές, %d παÏακλάδια (συγχωνεÏστε)\n"
+
+msgid "1 or more incoming"
+msgstr ""
+
+#, python-format
+msgid "%d outgoing"
+msgstr ""
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "απομακÏυσμένο: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "απομακÏυσμένο: (συγχÏονίστηκε)\n"
+
+msgid "add one or more tags for the current or given revision"
+msgstr "Ï€Ïοσθήκη μιας ή πεÏισσότεÏων ετικετών για την Ï„Ïέχουσα ή κάποια άλλη έκδοση"
+
+msgid " Name a particular revision using <name>."
+msgstr " Ονομασία μιας συγκεκÏιμένης αλλαγής με ένα νέο <όνομα>."
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc."
+msgstr ""
+" Οι ετικέτες μποÏοÏν να χÏησιμοποιηθοÏν ως συμβολικά ονόματα των αλλαγών\n"
+" ενός αποθετηÏίου και είναι Ï€Î¿Î»Ï Ï‡Ïήσιμες για την Ï€Ïοβολή των διαφοÏών\n"
+" Î¼ÎµÏ„Î±Î¾Ï Î´Ïο σημαντικών εκδόσεων, για να επιστÏέφει κανείς σε πιο παλιές\n"
+" εκδόσεις ή για την καταγÏαφή της αÏχής ενός κλάδου, του σημείου στο\n"
+" οποίο έγινε μια επίσημη έκδοση, κλπ."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" Οταν δεν έχει οÏιστεί συγκεκÏιμένη αλλαγή, τότε η νέα ετικέτα τίθεται\n"
+" στη γονική αλλαγή του χώÏου εÏγασίας, ή στο tip όταν δεν υπάÏχουν στο\n"
+" χώÏο εÏγασίας τα αÏχεία κάποιας έκδοσης."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed\n"
+" similarly to other project files and can be hand-edited if\n"
+" necessary. The file '.hg/localtags' is used for local tags (not\n"
+" shared among repositories)."
+msgstr ""
+" Για να διατηÏείται το ιστοÏικό των ετικετών, να διανέμονται σε άλλους\n"
+" κλώνους του αποθετηÏίου και να μποÏεί να γίνει συγχώνευσή τους, όλες\n"
+" οι ετικέτες αποθηκεÏονται σε ένα αÏχείο με το όνομα \".hgtags\", το\n"
+" οποίο συντηÏείται όπως και κάθε άλλο αÏχείο του αποθετηÏίου και μποÏεί\n"
+" να το επεξεÏγαστεί κανείς ως απλό αÏχείο κειμένου αν χÏειαστεί. Το\n"
+" αÏχείο '.hg/localtags' χÏησιμοποιείται για τις τοπικές ετικέτες\n"
+" (αυτές που δε διανέμονται σε άλλους κλώνους του αποθετηÏίου)."
+
+msgid "tag names must be unique"
+msgstr ""
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr ""
+
+msgid "--rev and --remove are incompatible"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr ""
+
+msgid "list repository tags"
+msgstr ""
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags.\n"
+" "
+msgstr ""
+
+msgid "show the tip revision"
+msgstr ""
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset.\n"
+" "
+msgstr ""
+
+msgid "apply one or more changegroup files"
+msgstr ""
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command.\n"
+" "
+msgstr ""
+
+msgid "update working directory"
+msgstr ""
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" If no changeset is specified, attempt to update to the head of the\n"
+" current branch. If this head is a descendant of the working\n"
+" directory's parent, update to it, otherwise abort."
+msgstr ""
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+
+msgid ""
+" Use null as the changeset to remove the working directory (like 'hg\n"
+" clone -U')."
+msgstr ""
+
+msgid " If you want to update just one file to an older changeset, use 'hg revert'."
+msgstr ""
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+
+msgid "uncommitted local changes"
+msgstr "υπάÏχουν τοπικές αλλαγές ακόμη"
+
+msgid "verify the integrity of the repository"
+msgstr ""
+
+msgid " Verify the integrity of the current repository."
+msgstr ""
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices.\n"
+" "
+msgstr ""
+
+msgid "output version and copyright information"
+msgstr ""
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Mercurial Κατανεμημένο SCM (version %s)\n"
+
+msgid ""
+"\n"
+"Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"\n"
+"Πνευματικά δικαιώματα (C) 2005-2009 Matt Mackall <mpm@selenic.com> και άλλοι\n"
+"Αυτό το Ï€ÏόγÏαμμα είναι ελεÏθεÏο λογισμικό· δείτε τον πηγαίο κώδικα για\n"
+"την άδεια χÏήσης του. Δεν παÏέχεται ΚΑΜΙΑ εγγÏηση· οÏτε καν για την\n"
+"ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑ ή την ΚΑΤΑΛΛΗΛΟΤΗΤΑ ΓΙΑ ΚΑΠΟΙΟ ΣΚΟΠΟ.\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+
+msgid "change working directory"
+msgstr ""
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr ""
+
+msgid "suppress output"
+msgstr ""
+
+msgid "enable additional output"
+msgstr ""
+
+msgid "set/override config option"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr ""
+
+msgid "start debugger"
+msgstr ""
+
+msgid "set the charset encoding"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr ""
+
+msgid "always print a traceback on exception"
+msgstr ""
+
+msgid "time how long the command takes"
+msgstr ""
+
+msgid "print command execution profile"
+msgstr ""
+
+msgid "output version information and exit"
+msgstr ""
+
+msgid "display help and exit"
+msgstr ""
+
+msgid "do not perform actions, just print output"
+msgstr ""
+
+msgid "specify ssh command to use"
+msgstr ""
+
+msgid "specify hg command to run on the remote side"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr ""
+
+msgid "exclude names matching the given patterns"
+msgstr ""
+
+msgid "use <text> as commit message"
+msgstr ""
+
+msgid "read commit message from <file>"
+msgstr ""
+
+msgid "record datecode as commit date"
+msgstr ""
+
+msgid "record the specified user as committer"
+msgstr ""
+
+msgid "display using template map file"
+msgstr ""
+
+msgid "display with template"
+msgstr ""
+
+msgid "do not show merges"
+msgstr ""
+
+msgid "treat all files as text"
+msgstr ""
+
+msgid "don't include dates in diff headers"
+msgstr ""
+
+msgid "show which function each change is in"
+msgstr ""
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr ""
+
+msgid "ignore changes in the amount of white space"
+msgstr ""
+
+msgid "ignore changes whose lines are all blank"
+msgstr ""
+
+msgid "number of lines of context to show"
+msgstr ""
+
+msgid "output diffstat-style summary of changes"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr ""
+
+msgid "[OPTION]... [FILE]..."
+msgstr ""
+
+msgid "annotate the specified revision"
+msgstr ""
+
+msgid "follow file copies and renames"
+msgstr ""
+
+msgid "list the author (long with -v)"
+msgstr ""
+
+msgid "list the date (short with -q)"
+msgstr ""
+
+msgid "list the revision number (default)"
+msgstr ""
+
+msgid "list the changeset"
+msgstr ""
+
+msgid "show line number at the first appearance"
+msgstr ""
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr ""
+
+msgid "do not pass files through decoders"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr ""
+
+msgid "revision to distribute"
+msgstr ""
+
+msgid "type of distribution to create"
+msgstr ""
+
+msgid "[OPTION]... DEST"
+msgstr ""
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge"
+msgstr ""
+
+msgid "revision to backout"
+msgstr ""
+
+msgid "[OPTION]... [-r] REV"
+msgstr ""
+
+msgid "reset bisect state"
+msgstr ""
+
+msgid "mark changeset good"
+msgstr ""
+
+msgid "mark changeset bad"
+msgstr ""
+
+msgid "skip testing changeset"
+msgstr ""
+
+msgid "use command to check changeset state"
+msgstr ""
+
+msgid "do not update to target"
+msgstr ""
+
+msgid "[-gbsr] [-c CMD] [REV]"
+msgstr ""
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr ""
+
+msgid "reset branch name to parent branch name"
+msgstr ""
+
+msgid "[-fC] [NAME]"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr ""
+
+msgid "show normal and closed branches"
+msgstr ""
+
+msgid "[-a]"
+msgstr ""
+
+msgid "run even when remote repository is unrelated"
+msgstr ""
+
+msgid "a changeset up to which you would like to bundle"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr ""
+
+msgid "print output to file with formatted name"
+msgstr ""
+
+msgid "print the given revision"
+msgstr ""
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr ""
+
+msgid "the clone will only contain a repository (no working copy)"
+msgstr ""
+
+msgid "revision, tag or branch to check out"
+msgstr ""
+
+msgid "clone only the specified revisions and ancestors"
+msgstr ""
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr ""
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr ""
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+msgid "[COMMAND]"
+msgstr "[ΕÎΤΟΛΗ]"
+
+msgid "show the command options"
+msgstr ""
+
+msgid "[-o] CMD"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr ""
+
+msgid "[-e] DATE [RANGE]"
+msgstr ""
+
+msgid "FILE REV"
+msgstr ""
+
+msgid "[PATH]"
+msgstr ""
+
+msgid "FILE"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr ""
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr ""
+
+msgid "[OPTION]..."
+msgstr ""
+
+msgid "revision to check"
+msgstr "αλλαγή Ï€Ïος έλεγχο"
+
+msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr ""
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr ""
+
+msgid "print all revisions that match"
+msgstr ""
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+
+msgid "ignore case when matching"
+msgstr ""
+
+msgid "print only filenames and revisions that match"
+msgstr ""
+
+msgid "print matching line numbers"
+msgstr ""
+
+msgid "search in given revision range"
+msgstr ""
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr ""
+
+msgid "show only heads which are descendants of REV"
+msgstr ""
+
+msgid "show only the active branch heads from open branches"
+msgstr ""
+
+msgid "show normal and closed branch heads"
+msgstr ""
+
+msgid "[-r STARTREV] [REV]..."
+msgstr ""
+
+msgid "[TOPIC]"
+msgstr ""
+
+msgid "identify the specified revision"
+msgstr ""
+
+msgid "show local revision number"
+msgstr ""
+
+msgid "show global revision id"
+msgstr ""
+
+msgid "show branch"
+msgstr ""
+
+msgid "show tags"
+msgstr ""
+
+msgid "[-nibt] [-r REV] [SOURCE]"
+msgstr ""
+
+msgid "directory strip option for patch. This has the same meaning as the corresponding patch option"
+msgstr ""
+
+msgid "base path"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+
+msgid "don't commit, just update the working directory"
+msgstr ""
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr ""
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr ""
+
+msgid "show newest record first"
+msgstr ""
+
+msgid "file to store the bundles into"
+msgstr ""
+
+msgid "a specific remote revision up to which you would like to pull"
+msgstr ""
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr ""
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "search the repository as it stood at REV"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr ""
+
+msgid "print complete paths from the filesystem root"
+msgstr ""
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr ""
+
+msgid "show revisions matching date spec"
+msgstr ""
+
+msgid "show copied files"
+msgstr ""
+
+msgid "do case-insensitive search for a keyword"
+msgstr ""
+
+msgid "include revisions where files were removed"
+msgstr ""
+
+msgid "show only merges"
+msgstr ""
+
+msgid "revisions committed by user"
+msgstr ""
+
+msgid "show only changesets within the given named branch"
+msgstr ""
+
+msgid "do not display revision or any of its ancestors"
+msgstr ""
+
+msgid "[OPTION]... [FILE]"
+msgstr ""
+
+msgid "revision to display"
+msgstr ""
+
+msgid "[-r REV]"
+msgstr ""
+
+msgid "force a merge with outstanding changes"
+msgstr ""
+
+msgid "revision to merge"
+msgstr ""
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-f] [[-r] REV]"
+msgstr ""
+
+msgid "a specific revision up to which you would like to push"
+msgstr ""
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr ""
+
+msgid "show parents from the specified revision"
+msgstr ""
+
+msgid "[-r REV] [FILE]"
+msgstr ""
+
+msgid "[NAME]"
+msgstr ""
+
+msgid "update to new tip if changesets were pulled"
+msgstr ""
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr ""
+
+msgid "force push"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr ""
+
+msgid "remove (and delete) file even if added or modified"
+msgstr ""
+
+msgid "record a rename that has already occurred"
+msgstr ""
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr ""
+
+msgid "select all unresolved files"
+msgstr ""
+
+msgid "list state of files needing merge"
+msgstr ""
+
+msgid "mark files as resolved"
+msgstr ""
+
+msgid "unmark files as resolved"
+msgstr ""
+
+msgid "hide status prefix"
+msgstr ""
+
+msgid "revert all changes when no arguments given"
+msgstr ""
+
+msgid "tipmost revision matching date"
+msgstr ""
+
+msgid "revision to revert to"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr ""
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr ""
+
+msgid "name of error log file to write to"
+msgstr ""
+
+msgid "port to listen on (default: 8000)"
+msgstr ""
+
+msgid "address to listen on (default: all interfaces)"
+msgstr ""
+
+msgid "prefix path to serve from (default: server root)"
+msgstr ""
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+
+msgid "name of the webdir config file (serve more than one repository)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr ""
+
+msgid "web templates to use"
+msgstr ""
+
+msgid "template style to use"
+msgstr ""
+
+msgid "use IPv6 in addition to IPv4"
+msgstr ""
+
+msgid "SSL certificate file"
+msgstr ""
+
+msgid "show untrusted configuration options"
+msgstr ""
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "show status of all files"
+msgstr ""
+
+msgid "show only modified files"
+msgstr ""
+
+msgid "show only added files"
+msgstr ""
+
+msgid "show only removed files"
+msgstr ""
+
+msgid "show only deleted (but tracked) files"
+msgstr ""
+
+msgid "show only files without changes"
+msgstr ""
+
+msgid "show only unknown (not tracked) files"
+msgstr ""
+
+msgid "show only ignored files"
+msgstr ""
+
+msgid "show source of copied files"
+msgstr ""
+
+msgid "show difference from revision"
+msgstr ""
+
+msgid "replace existing tag"
+msgstr ""
+
+msgid "make the tag local"
+msgstr ""
+
+msgid "revision to tag"
+msgstr ""
+
+msgid "remove a tag"
+msgstr ""
+
+msgid "[-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr ""
+
+msgid "[-p]"
+msgstr ""
+
+msgid "update to new tip if changesets were unbundled"
+msgstr ""
+
+msgid "[-u] FILE..."
+msgstr ""
+
+msgid "discard uncommitted changes (no backup)"
+msgstr ""
+
+msgid "check for uncommitted changes"
+msgstr ""
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr ""
+
+#, python-format
+msgid "config error at %s:%d: '%s'"
+msgstr "σφάλμα Ïυθμίσεων στο %s:%d: '%s'"
+
+msgid "not found in manifest"
+msgstr ""
+
+msgid "branch name not in UTF-8!"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr "ο χώÏος εÏγασίας έχει Ï€Ïόβλημα!"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr ""
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "not in dirstate: %s\n"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "character device"
+msgstr ""
+
+msgid "block device"
+msgstr ""
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr ""
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr ""
+
+#, python-format
+msgid "abort: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "lock held by %s"
+msgstr "κλειδωμένο από %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s"
+msgstr ""
+
+msgid " empty string\n"
+msgstr ""
+
+msgid "killed!\n"
+msgstr ""
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "abort: could not import module %s!\n"
+msgstr ""
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr ""
+
+msgid "(is your Python install correct?)\n"
+msgstr ""
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr ""
+
+msgid "broken pipe\n"
+msgstr ""
+
+msgid "interrupted!\n"
+msgstr ""
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+
+msgid "abort: out of memory\n"
+msgstr ""
+
+msgid "** unknown exception encountered, details follow\n"
+msgstr ""
+
+msgid "** report bug details to http://mercurial.selenic.com/bts/\n"
+msgstr ""
+
+msgid "** or mercurial@selenic.com\n"
+msgstr ""
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr ""
+
+#, python-format
+msgid "%s"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr ""
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr ""
+
+msgid "Option --config may not be abbreviated!"
+msgstr ""
+
+msgid "Option --cwd may not be abbreviated!"
+msgstr ""
+
+msgid "Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!"
+msgstr ""
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr ""
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid "lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+#, python-format
+msgid "Inconsistent state, %s:%s is good and bad"
+msgstr ""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "disabled extensions:"
+msgstr "ανενεÏγές επεκτάσεις:"
+
+msgid "Configuration Files"
+msgstr ""
+
+msgid "Date Formats"
+msgstr ""
+
+msgid "File Name Patterns"
+msgstr ""
+
+msgid "Environment Variables"
+msgstr ""
+
+msgid "Specifying Single Revisions"
+msgstr ""
+
+msgid "Specifying Multiple Revisions"
+msgstr ""
+
+msgid "Diff Formats"
+msgstr ""
+
+msgid "Template Usage"
+msgstr ""
+
+msgid "URL Paths"
+msgstr ""
+
+msgid "Using additional features"
+msgstr ""
+
+msgid "can only share local repositories"
+msgstr ""
+
+msgid "destination already exists"
+msgstr ""
+
+msgid "updating working directory\n"
+msgstr ""
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr ""
+
+msgid "src repository does not support revision lookup and so doesn't support clone by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr ""
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon\n"
+msgstr ""
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr ""
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr ""
+
+msgid "IPv6 is not available on this system"
+msgstr ""
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr ""
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+msgid "exception from first failed import attempt:\n"
+msgstr ""
+
+msgid "exception from second failed import attempt:\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "connection ended unexpectedly"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr ""
+
+msgid "operation not supported over http"
+msgstr ""
+
+msgid "authorization failed"
+msgstr "απαιτείται έλεγχος Ï€Ïόσβασης"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr ""
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr ""
+
+msgid "look up remote revision"
+msgstr ""
+
+msgid "unexpected response:"
+msgstr ""
+
+msgid "look up remote changes"
+msgstr ""
+
+msgid "push failed (unexpected response):"
+msgstr ""
+
+#, python-format
+msgid "push failed: %s"
+msgstr ""
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "δεν έχει εγκατασταθεί υποστήÏιξη SSL και HTTPS για την Python"
+
+msgid "cannot create new http repository"
+msgstr "δε μποÏεί να δημιουÏγηθεί ένα νέο αποθετήÏιο μέσω http"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr ""
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s not found"
+msgstr "το αποθετήÏιο %s δε βÏέθηκε"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "το αποθετήÏιο %s υπάÏχει ήδη"
+
+#, python-format
+msgid "requirement '%s' not supported"
+msgstr ""
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "το %r δε μποÏεί να χÏησιμοποιηθεί ως όνομα ετικέτας"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr ""
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr ""
+
+msgid "abandoned transaction found - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr ""
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+msgid "rolling back last transaction\n"
+msgstr ""
+
+#, python-format
+msgid "Named branch could not be reset, current branch still is: %s\n"
+msgstr ""
+
+msgid "no rollback information available\n"
+msgstr ""
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr ""
+
+#, python-format
+msgid "working directory of %s"
+msgstr "χώÏος εÏγασίας του %s"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+
+msgid "file not found!"
+msgstr "δε βÏέθηκε!"
+
+msgid "no match under directory!"
+msgstr ""
+
+msgid "file not tracked!"
+msgstr ""
+
+msgid "unresolved merge conflicts (see hg resolve)"
+msgstr ""
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr ""
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr ""
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"%s: files over 10MB may cause memory and performance problems\n"
+"(use 'hg revert %s' to unadd the file)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added!\n"
+msgstr ""
+
+#, python-format
+msgid "%s still exists!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr ""
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr "αναζήτηση αλλαγών\n"
+
+msgid "already have changeset "
+msgstr ""
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr ""
+
+msgid "Partial pull cannot be done because other repository doesn't support changegroupsubset."
+msgstr ""
+
+#, python-format
+msgid "abort: push creates new remote branch '%s'!\n"
+msgstr ""
+
+msgid "abort: push creates new remote heads!\n"
+msgstr ""
+
+msgid "(did you forget to merge? use push -f to force)\n"
+msgstr ""
+
+msgid "note: unsynced remote changes!\n"
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr ""
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr ""
+
+msgid "adding changesets\n"
+msgstr "Ï€Ïοσθήκη αλλαγών\n"
+
+msgid "received changelog group is empty"
+msgstr ""
+
+msgid "adding manifests\n"
+msgstr ""
+
+msgid "adding file changes\n"
+msgstr ""
+
+msgid "received file revlog group is empty"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr ""
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr ""
+
+msgid "Unexpected response from remote server:"
+msgstr ""
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr ""
+
+msgid "the server sent an unknown error code"
+msgstr ""
+
+msgid "streaming all changes\n"
+msgstr ""
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr ""
+
+msgid "no [smtp]host in hgrc - cannot send mail"
+msgstr ""
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr ""
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr ""
+
+msgid "(using tls)\n"
+msgstr ""
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr ""
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr ""
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr ""
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr ""
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr ""
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid "untracked file in working directory differs from file in requested revision: '%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr "&ΔιαγÏαφή"
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr "&ΔιαγÏάφηκε"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s\n"
+msgstr "λήψη του %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "λήψη του %s στο %s\n"
+
+#, python-format
+msgid "warning: detected divergent renames of %s to:\n"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr "δε βÏέθηκε ο κλάδος %s"
+
+msgid "can't merge with ancestor"
+msgstr ""
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr ""
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr "υπάÏχουν τοπικές αλλαγές ακόμη (δώστε 'hg status' για να δείτε τις αλλαγές)"
+
+msgid "crosses branches (use 'hg merge' to merge or use 'hg update -C' to discard changes)"
+msgstr ""
+
+msgid "crosses branches (use 'hg merge' or use 'hg update -c')"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: unable to create destination directory"
+msgstr ""
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr ""
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr ""
+
+#, python-format
+msgid "unable to strip away %d dirs from %s"
+msgstr ""
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "malformed patch %s %s"
+msgstr ""
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr ""
+
+#, python-format
+msgid "Unsupported line endings type: %s"
+msgstr ""
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr " %d αÏχεία Ï„Ïοποποιήθηκαν, %d εισαγωγές(+), %d διαγÏαφές(-)\n"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "τεÏμάτισε με κωδικό %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "διακοπή λόγω σήματος %d"
+
+#, python-format
+msgid "saving bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr "Ï€Ïοσθήκη κλάδου\n"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr ""
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr ""
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr ""
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr ""
+
+msgid "unknown base"
+msgstr ""
+
+msgid "consistency error adding group"
+msgstr ""
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr ""
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "could not create remote repo"
+msgstr ""
+
+msgid "no suitable response from remote hg"
+msgstr ""
+
+msgid "remote: "
+msgstr "απομακÏυσμένο: "
+
+#, python-format
+msgid "push refused: %s"
+msgstr ""
+
+msgid "unsynced changes"
+msgstr ""
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr ""
+
+msgid "cannot lock static-http repository"
+msgstr ""
+
+msgid "cannot create new static-http repository"
+msgstr ""
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr "&ΑπομακÏυσμένο:"
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "αφαίÏεση του εμφωλιασμένου αποθετηÏίου %s\n"
+
+#, python-format
+msgid "pulling subrepo %s\n"
+msgstr "λήψη στο εμφωλιασμένο αποθετήÏιο %s\n"
+
+#, python-format
+msgid "pushing subrepo %s\n"
+msgstr "αποστολή από το εμφωλιασμένο αποθετήÏιο %s\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, γÏαμμή %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid "unmatched quotes"
+msgstr ""
+
+#, python-format
+msgid "error expanding '%s%%%s'"
+msgstr ""
+
+#, python-format
+msgid "unknown filter '%s'"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr ""
+
+#, python-format
+msgid "template file %s: %s"
+msgstr ""
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr ""
+
+msgid "transaction abort!\n"
+msgstr ""
+
+msgid "rollback completed\n"
+msgstr ""
+
+msgid "rollback failed - please run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s.%s not a boolean ('%s')"
+msgstr ""
+
+msgid "enter a commit username:"
+msgstr ""
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr "Δε βÏέθηκε όνομα χÏήστη. ΧÏησιμοποιήθηκε το όνομα '%s'\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "το όνομα χÏήστη %s πεÏιέχει το χαÏακτήÏα αλλαγή γÏαμμής\n"
+
+msgid "response expected"
+msgstr ""
+
+msgid "unrecognized response\n"
+msgstr ""
+
+msgid "password: "
+msgstr "κωδικός: "
+
+msgid "edit failed"
+msgstr "η επεξεÏγασία απέτυχε"
+
+msgid "http authorization required"
+msgstr ""
+
+msgid "http authorization required\n"
+msgstr ""
+
+#, python-format
+msgid "realm: %s\n"
+msgstr ""
+
+#, python-format
+msgid "user: %s\n"
+msgstr ""
+
+msgid "user:"
+msgstr ""
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "η εντολή '%s' απέτυχε: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "η διαδÏομή πεÏιέχει μη έγκυÏα στοιχεία: %s"
+
+#, python-format
+msgid "path %r is inside repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+msgid "Hardlinks not supported"
+msgstr "Δεν υποστηÏίζονται hard links"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "απέτυχε η δημιουÏγία συντόμευσης του %r: %s"
+
+#, python-format
+msgid "invalid date: %r "
+msgstr "μη έγκυÏη ημεÏομηνία: %r "
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "η ημεÏομηνία ξεπεÏνά τα 32 διφία: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "μη έγκυÏη μετατόπιση ζώνης ÏŽÏας: %d"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f bytes"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "δεν είναι δυνατός ο έλεγχος σε bundles ή απομακÏυσμένα αποθετήÏια"
+
+msgid "interrupted"
+msgstr "διακόπηκε"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "κενό ή μη υπαÏκτό %s"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "το μέγεθος των δεδομένων διαφέÏει κατά %d bytes"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "το ευÏετήÏιο πεÏιέχει %d έξτÏα bytes"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "Ï€Ïοειδοποίηση: το '%s' χÏησιμοποιεί revlog έκδοσης 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "Ï€Ïοειδοποίηση: το '%s' χÏησιμοποιεί revlog έκδοσης 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "η έκδοση %d αναφέÏεται στην ανÏπαÏκτη αλλαγή %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "η έκδοση %d αναφέÏεται στη μη-αναμενόμενη αλλαγή %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (αναμενόταν %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "άγνωστη γονική αλλαγή 1 %s της %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "άγνωστη γονική αλλαγή 2 %s της %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "έλεγχος γονικών αλλαγών της %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "διπλή έκδοση %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "το αποθετήÏιο χÏησιμοποιεί τη μοÏφή revlog %d\n"
+
+msgid "checking changesets\n"
+msgstr "έλεγχος αλλαγών\n"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "εξαγωγή αλλαγής %s"
+
+msgid "checking manifests\n"
+msgstr "έλεγχος manifests\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s δεν υπάÏχει ως αλλαγή"
+
+msgid "file without name in manifest"
+msgstr "αÏχείο χωÏίς όνομα στο manifest"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "ανάγνωση αλλαγής manifest %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "διασταÏÏωση αÏχείων στις αλλαγές και τα manifests\n"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "η αλλαγή αναφέÏεται σε άγνωστο manifest %s"
+
+msgid "in changeset but not in manifest"
+msgstr "υπάÏχει στην αλλαγή αλλά όχι στο manifest"
+
+msgid "in manifest but not in changeset"
+msgstr "υπάÏχει στο manifest αλλά όχι στην αλλαγή"
+
+msgid "checking files\n"
+msgstr "έλεγχος αÏχείων\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "δε μποÏεί να αποκωδικοποιηθεί το όνομα αÏχείου '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "μη έγκυÏο revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "δεν υπάÏχει αυτό το revlog!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "το %s δεν υπάÏχει στα manifests"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "μέγεθος εξαγόμενων δεδομένων %s, αναμενόταν %s"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "εξαγωγή του %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "Ï€Ïοειδοποίηση: η πηγή '%s' της αντιγÏαφής δεν υπάÏχει στις γονικές της %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "κενό ή μη έγκυÏο revlog Ï€Ïοέλευσης %s:%s"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr "Ï€Ïοειδοποίηση: %s@%s: η έκδοση Ï€Ïοέλευσης της αντιγÏαφής αÏχείου είναι η κενή αλλαγή %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "έλεγχος μετονομασίας του %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s δε βÏέθηκε στα manifests"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "Ï€Ïοειδοποίηση: οÏφανό revlog '%s'"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d αÏχεία, %d αλλαγές, %d εκδόσεις αÏχείων\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "%d ειδοποιήσεις λάθους!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "βÏέθηκαν %d λάθη!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(η Ï€Ïώτη Ï€Ïοβληματική αλλαγή φαίνεται να είναι η %d)\n"
+
+msgid "user name not available - set USERNAME environment variable"
+msgstr ""
diff --git a/i18n/fr.po b/i18n/fr.po
new file mode 100644
index 0000000..8fcd601
--- /dev/null
+++ b/i18n/fr.po
@@ -0,0 +1,11459 @@
+# French translations for Mercurial
+# Traductions françaises de Mercurial
+# Copyright (C) 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# Quelques règles :
+# - dans l'aide d'une commande, la première ligne descriptive
+# commence par un verbe au présent sans majuscule
+# - dans l'aide d'une commande, la description des options
+# utilise un verbe à l'infinitif
+#
+# Note : la terminologie ci-dessous est loin d'être complète, figée ou
+# parfaite. À compléter et à améliorer, particulièrement les
+# termes comportant un point d'interrogation...
+#
+# Dictionnaire de termes courants :
+# - to apply a patch appliquer un patch
+# - a branch une branche
+# - to check out extraire (terminologie utilisée par svn)
+# - children des rejetons ? des descendants ?
+# - to clone clôner
+# - a conflict un conflit
+# - an extension une extension (au sens de module Mercurial)
+# - to fold patches agréger des patchs (replier des patch ?? bof)
+# - an integrity check une vérification d'intégrité (ou de cohérence ?)
+# - a mail un courriel, un courrier électronique
+# - a merge une fusion
+# - to merge fusionner
+# - a node un nœud ?
+# - a patch queue/stack une pile de patchs (mq)
+# - à l'utilisation c'est vraiment une _pile_
+# (on y empile et dépile des patchs)
+# - l'unique cas où _file_ conviendrait est dans le
+# contexte de la commande qfinish
+# => terme unique de pile pour plus de cohérence
+# - the patch series la série (complète) de patchs (suite ?)
+# - rejects des rejets ? (à propos de l'application d'un
+# patch)
+# - a repository un dépôt
+# - to revert annuler des modifications (ou défaire ?)
+# - a revision une révision
+# - the topmost patch le dernier patch appliqué
+# - a tree une arborescence
+# - an unrelated repository un dépôt non apparenté
+# - unversioned
+# unmanaged
+# untracked non suivi, non géré, pas sous contrôle du dépôt,
+# hors révision ?
+# - the working directory le répertoire de travail
+#
+# Termes très courants repris de l'anglais - à utiliser sans guillemets
+# pour ne pas alourdir inutilement la traduction :
+# - a diff un diff ? (ou également un patch ? synonymes...)
+# - a hook un hook
+# - a patch un patch
+# - a tag un tag
+# - to tag taguer
+#
+# Termes anglais avec une signification très spécifique, difficile à
+# paraphraser sans alourdir ou perdre le sens - à utiliser avec guillemets :
+# - a bundle un \"bundle\"
+# - to bundle créer un \"bundle\" ?
+# - a changeset un \"changeset\"
+# - a changegroup un \"changegroup\"
+# - the tip la révision \"tip\"
+#
+# Termes dont le classement / la traduction sont à déterminer :
+# - a commit un commit, un \"commit\"
+# - to commit \"committer\" ? (beuark, même dit tous les jours)
+# - a guard une \"garde\" ? (une protection ?)
+# - to guard a patch \"garder\" un patch ?
+# - to pull rapatrier des \"changesets\" ? effectuer une
+# opération de \"pull\" ? \"puller\" ?? (argh !)
+# - to push propager ? (utilisé par svn pour commit)
+# publier ? pousser ?? envoyer ??
+# - the series file (mq) ?
+#
+# Notes :
+# - (cédric) je verrais bien l'ajout d'une rubrique générale dans l'aide
+# (par exemple 'hg help glossary') librement remplissable par chaque équipe
+# de traduction, qui introduirait succintement à l'utilisateur les termes
+# qui vont être rencontrés dans mercurial - et en particulier permettrait
+# de faire le lien avec des termes franglisants parfois utilisés
+# (par ex. fusionner = "merger", etc.) ... ?
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2009-10-25 12:38+0100\n"
+"PO-Revision-Date: 2009-10-25 12:43+0100\n"
+"Last-Translator: Cedric Duval <cedricduval@free.fr>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (défaut: %s)"
+
+msgid "OPTIONS"
+msgstr "OPTIONS"
+
+msgid "COMMANDS"
+msgstr "COMMANDES"
+
+#, fuzzy
+msgid " options:"
+msgstr "options :\n"
+
+#, python-format
+msgid " aliases: %s"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr ""
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+
+msgid "Many date formats are valid. Here are some examples::"
+msgstr ""
+
+msgid ""
+" \"Wed Dec 6 13:18:29 2006\" (local timezone assumed)\n"
+" \"Dec 6 13:18 -0600\" (year assumed, time offset provided)\n"
+" \"Dec 6 13:18 UTC\" (UTC and GMT are aliases for +0000)\n"
+" \"Dec 6\" (midnight)\n"
+" \"13:18\" (today assumed)\n"
+" \"3:39\" (3:39AM assumed)\n"
+" \"3:39pm\" (15:39)\n"
+" \"2006-12-06 13:18:29\" (ISO 8601 format)\n"
+" \"2006-12-6 13:18\"\n"
+" \"2006-12-6\"\n"
+" \"12-6\"\n"
+" \"12/6\"\n"
+" \"12/6/6\" (Dec 6 2006)"
+msgstr ""
+
+msgid "Lastly, there is Mercurial's internal format::"
+msgstr ""
+
+msgid " \"1165432709 0\" (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+"This is the internal representation format for dates. unixtime is the\n"
+"number of seconds since the epoch (1970-01-01 00:00 UTC). offset is\n"
+"the offset of the local timezone, in seconds west of UTC (negative if\n"
+"the timezone is east of UTC)."
+msgstr ""
+
+msgid "The log command also accepts date ranges::"
+msgstr ""
+
+msgid ""
+" \"<{datetime}\" - at or before a given date/time\n"
+" \">{datetime}\" - on or after a given date/time\n"
+" \"{datetime} to {datetime}\" - a date range, inclusive\n"
+" \"-{days}\" - within a given number of days of today\n"
+msgstr ""
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with \"hg export\"), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your hgrc. You do not need to set this option when\n"
+"importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use .hgrc)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for hgrc files. Item\n"
+" separator is \":\" on Unix, \";\" on Windows. If HGRCPATH is not set,\n"
+" platform default search path is used. If empty, only the .hg/hgrc\n"
+" from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - hgrc files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with '@hostname' appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"\n"
+" Mercurial a la capacité de s'enrichir de nouvelles\n"
+" fonctionnalités par le biais d'extensions. Les extensions\n"
+" permettent d'ajouter des nouvelles commandes, de changer le\n"
+" comportement de commandes existantes ou leur ajouter des\n"
+" options, ou encore d'implémenter de nouveaux \"hooks\"."
+
+#, fuzzy
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+" Les extensions ne sont pas chargées automatiquement par défaut\n"
+" pour diverses raisons : elles peuvent accroître la latence\n"
+" de lancement de Mercurial ; elle peuvent n'être destinées qu'à\n"
+" une utilisation avancée ; elle peuvent fournir des\n"
+" fonctionnalités potentiellement dangereuses, comme de vous\n"
+" permettre de modifier ou détruire l'historique du dépôt ; elles\n"
+" peuvent ne pas être encore prêtes à être utilisées par le plus\n"
+" grand nombre ; ou encore elles peuvent modifier certains des\n"
+" comportements habituels de Mercurial.\n"
+" Il appartient donc à l'utilisateur de les activer en fonction\n"
+" de ses besoins."
+
+#, fuzzy
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in\n"
+"the Python search path, create an entry for it in your hgrc, like\n"
+"this::"
+msgstr ""
+" Pour activer l'extension \"truc\" fournie avec Mercurial ou\n"
+" présente dans le chemin de recherche de Python, déclarez-la\n"
+" dans votre fichier de configuration hgrc comme suit :"
+
+#, fuzzy
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" truc ="
+
+#, fuzzy
+msgid "You may also specify the full path to an extension::"
+msgstr " Vous pouvez aussi indiquer l'endroit où elle se trouve :"
+
+#, fuzzy
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" monbidule = ~/.hgext/monbidule.py"
+
+#, fuzzy
+msgid ""
+"To explicitly disable an extension enabled in an hgrc of broader\n"
+"scope, prepend its path with !::"
+msgstr ""
+" Pour forcer la désactivation d'une extension activée par un\n"
+" autre hgrc, précédez son chemin d'un point d'exclamation :"
+
+#, fuzzy
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # désactivation de machin qui se trouve dans /vers/machin.py\n"
+" bar = !/vers/machin.py\n"
+" # idem, mais aucun chemin n'avait été donné pour chose \n"
+" chose = !\n"
+" "
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Three styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact and changelog.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid " $ hg log -r1 --template \"{node}\\n\"\\n b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ""
+":author: String. The unmodified author of the changeset.\n"
+":branches: String. The name of the branch on which the changeset\n"
+" was committed. Will be empty if the branch name was\n"
+" default.\n"
+":date: Date information. The date when the changeset was\n"
+" committed.\n"
+":desc: String. The text of the changeset description.\n"
+":diffstat: String. Statistics of changes with the following\n"
+" format: \"modified files: +added/-removed lines\"\n"
+":files: List of strings. All files modified, added, or removed\n"
+" by this changeset.\n"
+":file_adds: List of strings. Files added by this changeset.\n"
+":file_mods: List of strings. Files modified by this changeset.\n"
+":file_dels: List of strings. Files removed by this changeset.\n"
+":node: String. The changeset identification hash, as a\n"
+" 40-character hexadecimal string.\n"
+":parents: List of strings. The parents of the changeset.\n"
+":rev: Integer. The repository-local changeset revision\n"
+" number.\n"
+":tags: List of strings. Any tags associated with the\n"
+" changeset.\n"
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset.\n"
+":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. You can also use a chain of filters to get the desired\n"
+"output::"
+msgstr ""
+
+msgid " $ hg tip --template \"{date|isodate}\\n\"\\n 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last.\n"
+":age: Date. Returns a human-readable date/time difference\n"
+" between the given date/time and the current\n"
+" date/time.\n"
+":basename: Any text. Treats the text as a path, and returns the\n"
+" last component of the path after splitting by the\n"
+" path separator (ignoring trailing separators). For\n"
+" example, \"foo/bar/baz\" becomes \"baz\" and \"foo/bar//\"\n"
+" becomes \"bar\".\n"
+":stripdir: Treat the text as path and strip a directory level,\n"
+" if possible. For example, \"foo\" and \"foo/bar\" becomes\n"
+" \"foo\".\n"
+":date: Date. Returns a date in a Unix date format, including\n"
+" the timezone: \"Mon Sep 04 15:13:13 2006 0700\".\n"
+":domain: Any text. Finds the first string that looks like an\n"
+" email address, and extracts just the domain\n"
+" component. Example: 'User <user@example.com>' becomes\n"
+" 'example.com'.\n"
+":email: Any text. Extracts the first string that looks like\n"
+" an email address. Example: 'User <user@example.com>'\n"
+" becomes 'user@example.com'.\n"
+":escape: Any text. Replaces the special XML/XHTML characters\n"
+" \"&\", \"<\" and \">\" with XML entities.\n"
+":fill68: Any text. Wraps the text to fit in 68 columns.\n"
+":fill76: Any text. Wraps the text to fit in 76 columns.\n"
+":firstline: Any text. Returns the first line of text.\n"
+":nonempty: Any text. Returns '(none)' if the string is empty.\n"
+":hgdate: Date. Returns the date as a pair of numbers:\n"
+" \"1157407993 25200\" (Unix timestamp, timezone offset).\n"
+":isodate: Date. Returns the date in ISO 8601 format:\n"
+" \"2009-08-18 13:00 +0200\".\n"
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the\n"
+" rfc3339date filter.\n"
+":localdate: Date. Converts a date to local date.\n"
+":obfuscate: Any text. Returns the input text rendered as a\n"
+" sequence of XML entities.\n"
+":person: Any text. Returns the text before an email address.\n"
+":rfc822date: Date. Returns a date using the same format used in\n"
+" email headers: \"Tue, 18 Aug 2009 13:00:13 +0200\".\n"
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\".\n"
+":short: Changeset hash. Returns the short form of a changeset\n"
+" hash, i.e. a 12-byte hexadecimal string.\n"
+":shortdate: Date. Returns a date like \"2006-09-18\".\n"
+":strip: Any text. Strips all leading and trailing whitespace.\n"
+":tabindent: Any text. Returns the text, with every line except\n"
+" the first starting with a tab character.\n"
+":urlescape: Any text. Escapes all \"special\" characters. For\n"
+" example, \"foo bar\" becomes \"foo%20bar\".\n"
+":user: Any text. Returns the user portion of an email\n"
+" address.\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user[:pass]@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by 'hg bundle' or 'hg\n"
+"incoming --bundle')."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also 'hg help\n"
+"revisions'."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your hgrc or\n"
+" with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your hgrc with path aliases under the\n"
+"[paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example 'hg pull alias1' would pull from the 'alias1' path)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "hooks for controlling repository access"
+msgstr ""
+
+msgid ""
+"This hook makes it possible to allow or deny write access to portions\n"
+"of a repository when receiving incoming changesets."
+msgstr ""
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than\n"
+"pushing or pulling. The hook is not safe to use if users have\n"
+"interactive shell access, as they can then disable the hook.\n"
+"Nor is it safe if remote users share an account, because then there\n"
+"is no way to distinguish them."
+msgstr ""
+
+msgid "To use this hook, configure the acl extension in your hgrc like this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" acl ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Check whether the source of incoming changes is in this list\n"
+" # (\"serve\" == ssh or http, \"push\", \"pull\", \"bundle\")\n"
+" sources = serve"
+msgstr ""
+
+msgid ""
+"The allow and deny sections take a subtree pattern as key (with a glob\n"
+"syntax by default), and a comma separated list of users as the\n"
+"corresponding value. The deny list is checked before the allow list\n"
+"is. ::"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # If acl.allow is not present, all users are allowed by default.\n"
+" # An empty acl.allow section means no users allowed.\n"
+" docs/** = doc_writer\n"
+" .hgtags = release_engineer"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # If acl.deny is not present, no users are refused by default.\n"
+" # An empty acl.deny section means all users allowed.\n"
+" glob pattern = user4, user5\n"
+" ** = user6\n"
+msgstr ""
+
+#, python-format
+msgid "config error - hook type \"%s\" cannot stop incoming changesets"
+msgstr ""
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr ""
+
+msgid "track a line of development with movable markers"
+msgstr ""
+
+msgid ""
+"Bookmarks are local movable markers to changesets. Every bookmark\n"
+"points to a changeset identified by its hash. If you commit a\n"
+"changeset that is based on a changeset that has a bookmark on it, the\n"
+"bookmark shifts to the new changeset."
+msgstr ""
+
+msgid ""
+"It is possible to use bookmark names in every revision lookup (e.g. hg\n"
+"merge, hg update)."
+msgstr ""
+
+msgid ""
+"By default, when several bookmarks point to the same changeset, they\n"
+"will all move forward together. It is possible to obtain a more\n"
+"git-like experience by adding the following configuration option to\n"
+"your .hgrc::"
+msgstr ""
+
+msgid ""
+" [bookmarks]\n"
+" track.current = True"
+msgstr ""
+
+msgid ""
+"This will cause Mercurial to track the bookmark that you are currently\n"
+"using, and only update it. This is similar to git's approach to\n"
+"branching.\n"
+msgstr ""
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in 'hg merge' and\n"
+" 'hg update' to merge and update respectively to a given bookmark."
+msgstr ""
+
+msgid ""
+" You can use 'hg bookmark NAME' to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "a bookmark of this name does not exist"
+msgstr "un signet de ce nom n'existe pas"
+
+msgid "a bookmark of the same name already exists"
+msgstr ""
+
+msgid "new bookmark name required"
+msgstr ""
+
+msgid "bookmark name required"
+msgstr ""
+
+msgid "bookmark name cannot contain newlines"
+msgstr ""
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr ""
+
+msgid "force"
+msgstr ""
+
+msgid "revision"
+msgstr ""
+
+msgid "delete a given bookmark"
+msgstr "Supprimer un signet donné"
+
+msgid "rename a given bookmark"
+msgstr "Renommer un signet donné"
+
+msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]"
+msgstr ""
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The hook does not change\n"
+"bug status."
+msgstr ""
+
+msgid ""
+"The hook updates the Bugzilla database directly. Only Bugzilla\n"
+"installations using MySQL are supported."
+msgstr ""
+
+msgid ""
+"The hook relies on a Bugzilla script to send bug change notification\n"
+"emails. That script changes between Bugzilla versions; the\n"
+"'processmail' script used prior to 2.18 is replaced in 2.18 and\n"
+"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n"
+"be run by Mercurial as the user pushing the change; you will need to\n"
+"ensure the Bugzilla install file permissions are set appropriately."
+msgstr ""
+
+msgid ""
+"The extension is configured through three different configuration\n"
+"sections. These keys are recognized in the [bugzilla] section:"
+msgstr ""
+
+msgid ""
+"host\n"
+" Hostname of the MySQL server holding the Bugzilla database."
+msgstr ""
+
+msgid ""
+"db\n"
+" Name of the Bugzilla database in MySQL. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"user\n"
+" Username to use to access MySQL server. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"version\n"
+" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n"
+" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n"
+" to 2.18."
+msgstr ""
+
+msgid ""
+"bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" '/var/www/html/bugzilla'."
+msgstr ""
+
+msgid ""
+"notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n"
+" and 'user' (committer bugzilla email). Default depends on version;\n"
+" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n"
+" %(id)s %(user)s\"."
+msgstr ""
+
+msgid ""
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies::"
+msgstr ""
+
+msgid ""
+" {bug} The Bugzilla bug ID.\n"
+" {root} The full pathname of the Mercurial repository.\n"
+" {webroot} Stripped pathname of the Mercurial repository.\n"
+" {hgweb} Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'\\n\n"
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0."
+msgstr ""
+
+msgid ""
+"usermap\n"
+" Path of file containing Mercurial committer ID to Bugzilla user ID\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section."
+msgstr ""
+
+msgid ""
+"The [usermap] section is used to specify mappings of Mercurial\n"
+"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n"
+"\"committer\"=\"Bugzilla user\""
+msgstr ""
+
+msgid "Finally, the [web] section supports one entry:"
+msgstr ""
+
+msgid ""
+"baseurl\n"
+" Base URL for browsing Mercurial repositories. Reference from\n"
+" templates as {hgweb}."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configuration:"
+msgstr ""
+
+msgid ""
+"This example configuration is for a collection of Mercurial\n"
+"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n"
+"installation in /opt/bugzilla-3.2. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\\n {desc}\\n\\n strip=5"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+msgstr ""
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+
+msgid "Commits add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr ""
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr ""
+
+msgid "unknown database schema"
+msgstr ""
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr ""
+
+msgid "telling bugzilla to send mail:\n"
+msgstr ""
+
+#, python-format
+msgid " bug %s\n"
+msgstr ""
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr ""
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr ""
+
+msgid "done\n"
+msgstr "effectué\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr ""
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr ""
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr ""
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "database error: %s"
+msgstr ""
+
+msgid "command to display child changesets"
+msgstr ""
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "show children of the specified revision"
+msgstr ""
+
+msgid "hg children [-r REV] [FILE]"
+msgstr ""
+
+#, fuzzy
+msgid "command to display statistics about repository history"
+msgstr "Commande pour afficher les statistiques de l'historique du repository"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr ""
+
+#, python-format
+msgid "generating stats: %d%%"
+msgstr ""
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+msgid "count rate for revisions matching date spec"
+msgstr ""
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "show progress"
+msgstr ""
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]"
+msgstr ""
+
+msgid "colorize output from some commands"
+msgstr ""
+
+msgid ""
+"This extension modifies the status command to add color to its output\n"
+"to reflect file status, the qseries command to add color to reflect\n"
+"patch status (applied, unapplied, missing), and to diff-related\n"
+"commands to highlight additions, removals, diff headers, and trailing\n"
+"whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. Effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes). This module also provides the\n"
+"render_text function, which can be used to add effects to any text."
+msgstr ""
+
+msgid "Default effects may be overridden from the .hgrc file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background\n"
+msgstr ""
+
+msgid "when to colorize (always, auto, or never)"
+msgstr ""
+
+msgid "don't colorize output (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr ""
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with '-hg' appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If <REVMAP> isn't given, it will be put in a default location\n"
+" (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file\n"
+" that maps each source commit ID to the destination ID for that\n"
+" revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so convert-repo can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The [username mapping] file is a simple text file that maps each\n"
+" source commit author to a destination commit author. It is handy\n"
+" for source SCMs that use unix logins to identify authors (eg:\n"
+" CVS). One line per author mapping and the line format is:\n"
+" srcauthor=whatever string you want"
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Comment lines start with '#'. Each line can\n"
+" contain one of the following directives::"
+msgstr ""
+
+msgid " include path/to/file"
+msgstr ""
+
+msgid " exclude path/to/file"
+msgstr ""
+
+msgid " rename from/file to/file"
+msgstr ""
+
+msgid ""
+" The 'include' directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The 'exclude' directive causes files or directories to\n"
+" be omitted. The 'rename' directive renames a file or directory. To\n"
+" rename from a subdirectory into the root of the repository, use\n"
+" '.' as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values. The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form \"original_branch_name new_branch_name\".\n"
+" \"original_branch_name\" is the name of the branch in the source\n"
+" repository, and \"new_branch_name\" is the name of the branch is the\n"
+" destination repository. This can be used to (for instance) move code\n"
+" in one repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ----------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.ignoreerrors=False (boolean)\n"
+" ignore integrity errors when reading. Use it to fix Mercurial\n"
+" repositories with missing revlogs, by converting from and to\n"
+" Mercurial.\n"
+" --config convert.hg.saverev=False (boolean)\n"
+" store original revision ID in changeset (forces target IDs to\n"
+" change)\n"
+" --config convert.hg.startrev=0 (hg revision identifier)\n"
+" convert start revision and its descendants"
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ----------"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is :local:. The conversion uses the top level directory\n"
+" in the sandbox to find the CVS repository, and then uses CVS rlog\n"
+" commands to find files to convert. This means that unless a\n"
+" filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The options shown are the defaults."
+msgstr ""
+
+msgid ""
+" --config convert.cvsps.cache=True (boolean)\n"
+" Set to False to disable remote log caching, for testing and\n"
+" debugging purposes.\n"
+" --config convert.cvsps.fuzz=60 (integer)\n"
+" Specify the maximum time (in seconds) that is allowed between\n"
+" commits with identical user and log message in a single\n"
+" changeset. When very large files were checked in as part of a\n"
+" changeset then the default may not be long enough.\n"
+" --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" insert a dummy revision merging the branch on which this log\n"
+" message occurs to the branch indicated in the regex.\n"
+" --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" add the most recent revision on the branch indicated in the\n"
+" regex as the second parent of the changeset."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" -----------------"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied \"svn://repo/path/\" source URL is\n"
+" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n"
+" replaces the default branch. If \"svn://repo/path/branches\" exists,\n"
+" its subdirectories are listed as possible branches. If\n"
+" \"svn://repo/path/tags\" exists, it is looked for tags referencing\n"
+" converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n"
+" can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid ""
+" --config convert.svn.branches=branches (directory name)\n"
+" specify the directory containing branches\n"
+" --config convert.svn.tags=tags (directory name)\n"
+" specify the directory containing tags\n"
+" --config convert.svn.trunk=trunk (directory name)\n"
+" specify the name of the trunk branch"
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" --config convert.svn.startrev=0 (svn revision number)\n"
+" specify start Subversion revision."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" ---------------"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ...-hg."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision."
+msgstr ""
+
+msgid ""
+" --config convert.p4.startrev=0 (perforce changelist number)\n"
+" specify initial Perforce revision."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" ---------------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.clonebranches=False (boolean)\n"
+" dispatch source branches in separate clones.\n"
+" --config convert.hg.tagsbranch=default (branch name)\n"
+" tag revisions branch name\n"
+" --config convert.hg.usebranchnames=True (boolean)\n"
+" preserve branch names"
+msgstr ""
+
+msgid " "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr ""
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr ""
+
+msgid "warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr ""
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr ""
+
+#, python-format
+msgid "%s error:\n"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr ""
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr ""
+
+#, python-format
+msgid "convert: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s : type de dépôt inconnu"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "mode de tri inconnu: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "cycle détecté entre %s et %s"
+
+#, fuzzy
+msgid "not all revisions were sorted"
+msgstr "Touts les révisions n'ont pas été triées"
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr ""
+
+#, fuzzy
+msgid "sorting...\n"
+msgstr "tri en cours...\n"
+
+#, fuzzy
+msgid "converting...\n"
+msgstr "conversion en cours...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "source: %s\n"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr "plus d'un mode de tri specifié"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "revision %s is not a patchset number"
+msgstr "la révision %d n'est pas parente de la pile"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "connexion à %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "l'authentification au serveur CVS a échoué"
+
+#, python-format, fuzzy
+msgid "unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr "réponse innatendue du serveur CVS (\\'Valid-requests\" attendue, mais %r reçue)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "%d bytes manquants dans le fichier distant"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "serveur cvs : %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "Réponse CVS inconnue : %s"
+
+#, fuzzy
+msgid "collecting CVS rlog\n"
+msgstr "récupération des rlog CVS\n"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr ""
+
+#, python-format, fuzzy
+msgid "cache has %d log entries\n"
+msgstr "le cache a %d entrées de log\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "erreur lors de la lecture du cache : %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "RCS file must be followed by working file"
+msgstr "le fichier RCS doit être suivi par le fichier de travail"
+
+msgid "must have at least some revisions"
+msgstr ""
+
+msgid "expected revision number"
+msgstr "numéro de révision attendu"
+
+msgid "revision must be followed by date line"
+msgstr ""
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr ""
+
+#, python-format, fuzzy
+msgid "%d log entries\n"
+msgstr "%d entrées dans les log\n"
+
+msgid "creating changesets\n"
+msgstr ""
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr ""
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "darcs version 2.1 ou supérieur nécessaire (trouvé %r)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Le module Python ElementTree n'est pas disponible"
+
+msgid "internal calling inconsistency"
+msgstr ""
+
+msgid "errors in filemap"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr ""
+
+msgid "source repository doesn't support --filemap"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a GNU Arch repo"
+msgstr ""
+
+msgid "cannot find a GNU Arch tool"
+msgstr ""
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr ""
+
+#, python-format
+msgid "tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s n'est pas un dépôt local de Mercurial"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr ""
+
+msgid "filtering out empty revision\n"
+msgstr ""
+
+msgid "updating tags\n"
+msgstr "mise à jour des tags\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr ""
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a monotone repo"
+msgstr ""
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+msgid "reading p4 views\n"
+msgstr ""
+
+msgid "collecting p4 changelists\n"
+msgstr ""
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+msgid "Subversion python bindings could not be loaded"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+
+#, python-format, fuzzy
+msgid "svn: revision %s is not an integer"
+msgstr "svn : la révision %s n'est pas un entier"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr ""
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr ""
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr ""
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr ""
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr ""
+
+#, python-format
+msgid "no tags found at revision %d\n"
+msgstr "aucun tag trouvé dans la révision %d\n"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr ""
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr ""
+
+#, python-format
+msgid "initializing svn repo %r\n"
+msgstr "initialisation du dépôt svn %r\n"
+
+#, python-format
+msgid "initializing svn wc %r\n"
+msgstr ""
+
+msgid "unexpected svn output:\n"
+msgstr ""
+
+msgid "unable to cope with svn output"
+msgstr ""
+
+msgid "XXX TAGS NOT IMPLEMENTED YET\n"
+msgstr "XXX TAGS PAS ENCORE IMPLÉMENTÉ\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows to configure new diff commands, so\n"
+"you do not need to type \"hg extdiff -p kdiff3\" always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal \"hg\n"
+"diff\" command. The extdiff extension makes snapshots of only needed\n"
+"files, so running the external diff program will actually be pretty\n"
+"fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr ""
+
+msgid "cleaning up temp directory\n"
+msgstr "nettoyage du dossier temporaire\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "change made by revision"
+msgstr ""
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr ""
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using the\n"
+" %(path)s program."
+msgstr ""
+
+#, python-format
+msgid ""
+" When two revision arguments are given, then changes are shown between\n"
+" those revisions. If only one revision is specified then that revision is\n"
+" compared to the working directory, and, when no revisions are specified,\n"
+" the working directory files are compared to its parent."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "pull, update and merge in one command"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid ""
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+
+msgid "outstanding uncommitted merge"
+msgstr ""
+
+msgid "outstanding uncommitted changes"
+msgstr ""
+
+msgid "working directory is missing some files"
+msgstr ""
+
+msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr ""
+
+msgid "Other repository doesn't support revision lookup, so a rev cannot be specified."
+msgstr ""
+
+#, python-format
+msgid "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+
+msgid "a specific revision you would like to pull"
+msgstr ""
+
+msgid "edit commit message"
+msgstr ""
+
+msgid "edit commit message (DEPRECATED)"
+msgstr ""
+
+msgid "switch parents when merging"
+msgstr ""
+
+msgid "hg fetch [SOURCE]"
+msgstr ""
+
+msgid "commands to sign and verify changesets"
+msgstr ""
+
+msgid "error while verifying signature"
+msgstr "erreur lors de la vérification de la signature"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr ""
+
+msgid "list signed changesets"
+msgstr ""
+
+#, python-format, fuzzy
+msgid "%s:%d node does not exist\n"
+msgstr "%s: le noeud %d n'existe pas\n"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr "Signature invalide pour %s\n"
+
+msgid "add a signature for the current or given revision"
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+
+msgid "Error while signing"
+msgstr ""
+
+msgid "working copy of .hgsigs is changed (please commit .hgsigs manually or use --force)"
+msgstr ""
+
+msgid "unknown signature version"
+msgstr ""
+
+msgid "make the signature local"
+msgstr ""
+
+msgid "sign even if the sigfile is modified"
+msgstr ""
+
+msgid "do not commit the sigfile after signing"
+msgstr ""
+
+msgid "the key id to sign with"
+msgstr ""
+
+msgid "commit message"
+msgstr ""
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr ""
+
+msgid "hg sigcheck REVISION"
+msgstr ""
+
+msgid "hg sigs"
+msgstr ""
+
+msgid "command to view revision graphs from a shell"
+msgstr ""
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "--graph option is incompatible with --%s"
+msgstr ""
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr ""
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "comparaison avec %s\n"
+
+msgid "no changes found\n"
+msgstr "aucun changement trouvé\n"
+
+msgid "show the revision DAG"
+msgstr ""
+
+msgid "limit number of changes displayed"
+msgstr ""
+
+msgid "show patch"
+msgstr ""
+
+msgid "show the specified revision or range"
+msgstr ""
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr ""
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}/rev/{node}-- {diffstat}\\n # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The hg view command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your .hgrc file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr ""
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr ""
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr "récursif"
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr "recherche"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr "ignoré"
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr "en-tête"
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr "parent"
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [OPTION]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr ""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr ""
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr ""
+
+msgid "used internally by daemon mode"
+msgstr ""
+
+msgid "minutes to sit idle before exiting"
+msgstr ""
+
+msgid "name of file to write process ID to"
+msgstr ""
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [OPTION]..."
+
+msgid "(found dead inotify server socket; removing it)\n"
+msgstr ""
+
+#, python-format
+msgid "could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "could not talk to new inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr "trouvé %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s dirstate reload\n"
+msgstr ""
+
+#, python-format
+msgid "%s end dirstate reload\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+#, python-format
+msgid "could not start server: %s"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword] and [keywordmaps] sections of\n"
+"hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+"NOTE: the more specific you are in your filename patterns the less you\n"
+"lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run \"hg kwdemo\". See \"hg help templates\" for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid ""
+"An additional date template filter {date|utcdate} is provided. It\n"
+"returns a date like \"2006/09/18 15:13:13\"."
+msgstr ""
+
+msgid ""
+"The default template mappings (view with \"hg kwdemo -d\") can be\n"
+"replaced with customized keywords and templates. Again, run \"hg\n"
+"kwdemo\" to control the results of your config changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, run \"hg kwshrink\" to avoid\n"
+"the risk of inadvertently storing expanded keywords in the change\n"
+"history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+"\"hg kwexpand\"."
+msgstr ""
+
+msgid ""
+"Also, when committing with the record extension or using mq's qrecord,\n"
+"be aware that keywords cannot be updated. Again, run \"hg kwexpand\" on\n"
+"the files in question to update keyword expansions after all changes\n"
+"have been checked in."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See \"hg help templates\" for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default keyword template maps\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "unhooked all commit hooks\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See \"hg help keyword\" on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid ""
+" Run before changing/disabling active keywords or if you experience\n"
+" problems with \"hg import\" or \"hg merge\"."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "only show unknown (not tracked) files"
+msgstr ""
+
+msgid "show keyword status flags of all files (DEPRECATED)"
+msgstr ""
+
+msgid "only show untracked files (DEPRECATED)"
+msgstr ""
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+#, fuzzy
+msgid "manage a stack of patches"
+msgstr "gestion et utilisation d'une pile de patchs"
+
+#, fuzzy
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Cette extension permet de travailler avec une pile de patchs au\n"
+"dessus d'un dépôt Mercurial. Deux piles de patchs sont gérées :\n"
+"l'ensemble des patchs référencés, et le sous-ensemble des patchs\n"
+"qui ont été appliqués."
+
+#, fuzzy
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Les patchs référencés sont stockés en tant que fichiers au format\n"
+"patch au sein du répertoire .hg/patches, tandis que les patchs\n"
+"appliqués sont présents à la fois sous forme de fichier et de\n"
+"\"changesets\"."
+
+#, fuzzy
+msgid "Common tasks (use \"hg help command\" for more details)::"
+msgstr "Tâches usuelles (utiliser \"hg help commande\" pour plus de détails):"
+
+#, fuzzy
+msgid ""
+" prepare repository to work with patches qinit\n"
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+"préparer un dépôt pour utilisation avec des patchs qinit\n"
+"créer un nouveau patch qnew\n"
+"importer un patch existant qimport"
+
+#, fuzzy
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+"afficher la série de patchs complète qseries\n"
+"afficher les patchs appliqués qapplied\n"
+"afficher le nom du dernier patch appliqué qtop"
+
+#, fuzzy
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh\n"
+msgstr ""
+"empiler/appliquer un patch référencé sur la pile qpush\n"
+"dépiler/ôter un patch de la pile qpop\n"
+"rafraîchir le contenu du dernier patch appliqué qrefresh\n"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s apparaît plus d'une fois dans %s"
+
+msgid "guard cannot be an empty string"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr ""
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr ""
+
+#, python-format
+msgid "guard %r too short"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr ""
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "l'application du patch %s a échoué"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "l'application simple du patch a échoué, fusion de %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr ""
+
+msgid "repo commit failed"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s"
+msgstr "impossible de lire %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "le patch %s n'existe pas\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "le patch %s n'est pas appliqué\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "l'application du patch a échoué, impossible de continuer (essayez avec -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "application de %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "impossible de lire %s\n"
+
+#, python-format
+msgid "imported patch %s\n"
+msgstr "le patch %s a été importé\n"
+
+#, python-format
+msgid ""
+"\n"
+"imported patch %s"
+msgstr ""
+"\n"
+"le patch %s a été importé"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "le patch %s est vide\n"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "la révision %d n'est pas gérée"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "impossible de supprimer la révision %d au-dessus de patchs appliqués"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr ""
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete requiert au moins une révision ou le nom d'un patch"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "impossible de supprimer le patch appliqué %s"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "le patch %s n'est pas listé (fichier \"series\")"
+
+msgid "no patches applied"
+msgstr "pas de patchs appliqués"
+
+msgid "working directory revision is not qtip"
+msgstr "le répertoire de travail n'est pas à la révision qtip"
+
+msgid "local changes found, refresh first"
+msgstr "modifications locales trouvées, veuillez d'abord rafraîchir le patch"
+
+msgid "local changes found"
+msgstr "modifications locales trouvées"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" ne peut être utilisé comme nom de patch"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "le patch \"%s\" existe déjà"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "erreur lors de la suppression de %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "\"%s\" est un nom de patch ambigu :\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "le patch %s ne figure pas dans la série"
+
+#, fuzzy
+msgid "(working directory not at a head)\n"
+msgstr "(le répertoire de travail est à une révision différente de tip)\n"
+
+msgid "no patches in series\n"
+msgstr "pas de patchs dans la série\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "impossible d'empiler un patch déjà appliqué : %s"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s est déjà le dernier patch appliqué\n"
+
+#, python-format
+msgid "guarded by %r"
+msgstr ""
+
+msgid "no matching guards"
+msgstr ""
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "impossible d'empiler '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "tous les patchs sont actuellement appliqués\n"
+
+msgid "patch series already fully applied\n"
+msgstr "la série de patchs est déjà complètement appliquée\n"
+
+msgid "cleaning up working directory..."
+msgstr "nettoyage du répertoire de travail..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "des erreurs se sont produites durant l'application, veuillez corriger puis rafraîchir %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "actuellement à : %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "le patch %s n'est pas appliqué"
+
+msgid "no patches applied\n"
+msgstr "aucun patch appliqué\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s est déjà le dernier patch appliqué\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: mise à jour de l'état du répertoire de travail (dirstate) forcée\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "tentative de dépilement d'un nœud inconnu : %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr "le dépilement enlèverait une révision non gérée par cette pile de patchs"
+
+msgid "deletions found between repo revs"
+msgstr "suppressions trouvées entre des révisions du dépôt"
+
+#, fuzzy, python-format
+msgid "popping %s\n"
+msgstr "application de %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "la pile de patchs est maintenant vide\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "impossible de rafraîchir une révision possédant des révisions filles"
+
+msgid "refresh interrupted while patch was popped! (revert --all, qpush to recover)\n"
+msgstr "rafraîchissement interrompu alors qu'un patch était en cours de dépilement (utiliser revert --all, ou qpush pour restaurer l'état)\n"
+
+msgid "patch queue directory already exists"
+msgstr "la pile de patchs existe déjà"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "le patch %s n'est pas dans la liste (fichier \"series\")"
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "rétablissement de l'état : %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "queue directory updating\n"
+msgstr "mise à jour du répertoire de patchs\n"
+
+msgid "Unable to load queue repository\n"
+msgstr "Impossible de charger le dépôt de patchs\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr "l'état a déjà été sauvegardé\n"
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "le patch %s est déjà dans la liste (fichier \"series\")"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "l'option \"-r\" n'est pas utilisable lors de l'importation de fichiers"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "l'option \"-n\" n'est pas utilisable lors de l'importation de plusieurs patchs"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "la révision %d est à l'origine de plus d'une branche"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "la révision %d est déjà gérée"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "la révision %d n'est pas parente de la pile"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "la révision %d possède des révisions filles non gérées"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "impossible d'importer la révision fusionnée %d"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "%d n'est pas la révision parente de %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "-e n'est pas compatible avec l'importation depuis -"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "le patch %s n'existe pas"
+
+msgid "need --name to import a patch from -"
+msgstr "il est nécessaire d'utiliser --name pour importer un patch depuis -"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "ajout de %s à la liste de patchs (fichier \"series\")\n"
+
+#, fuzzy
+msgid "remove patches from queue"
+msgstr ""
+"supprime des patchs de la pile\n"
+"\n"
+" Les patchs ne doivent pas avoir été appliqués, et il est\n"
+" nécessaire de fournir au moins un patch.\n"
+"\n"
+" Avec -k/--keep, les fichiers sont préservés au sein du répertoire\n"
+" de patchs.\n"
+"\n"
+" Pour arrêter de gérer un patch et le déplacer de manière\n"
+" permanente vers l'historique du dépôt, utilisez la commande\n"
+" qfinish."
+
+#, fuzzy
+msgid ""
+" The patches must not be applied, and at least one patch is required. With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+"supprime des patchs de la pile\n"
+"\n"
+" Les patchs ne doivent pas avoir été appliqués, et il est\n"
+" nécessaire de fournir au moins un patch.\n"
+"\n"
+" Avec -k/--keep, les fichiers sont préservés au sein du répertoire\n"
+" de patchs.\n"
+"\n"
+" Pour arrêter de gérer un patch et le déplacer de manière\n"
+" permanente vers l'historique du dépôt, utilisez la commande\n"
+" qfinish."
+
+#, fuzzy
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the qfinish command."
+msgstr ""
+"supprime des patchs de la pile\n"
+"\n"
+" Les patchs ne doivent pas avoir été appliqués, et il est\n"
+" nécessaire de fournir au moins un patch.\n"
+"\n"
+" Avec -k/--keep, les fichiers sont préservés au sein du répertoire\n"
+" de patchs.\n"
+"\n"
+" Pour arrêter de gérer un patch et le déplacer de manière\n"
+" permanente vers l'historique du dépôt, utilisez la commande\n"
+" qfinish."
+
+msgid "print the patches already applied"
+msgstr "affiche les patchs déjà appliqués"
+
+msgid "only one patch applied\n"
+msgstr "un seul patch d'appliqué\n"
+
+msgid "print the patches not yet applied"
+msgstr "affiche les patchs non encore appliqués"
+
+msgid "all patches applied\n"
+msgstr "tous les patchs ont été appliqués\n"
+
+msgid "import a patch"
+msgstr "importe un patch"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" Le patch est inséré dans la série à la suite du dernier patch\n"
+" appliqué. Si aucun patch n'a encore été appliqué, le patch sera\n"
+" ajouté en tête de série."
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" Le patch portera le même nom que le fichier dont il provient,\n"
+" à moins qu'un autre nom ne soit spécifié à l'aide de -n/--name."
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" Vous pouvez enregistrer un patch déjà présent dans le répertoire\n"
+" de patchs à l'aide de l'option -e/--existing."
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr " Avec -f/--force, un patch déjà présent du même nom sera écrasé."
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes."
+msgstr ""
+" Un \"changeset\" existant peut-être placé sous le contrôle de mq\n"
+" à l'aide de -r/--rev (par exemple qimport --rev tip -n patch\n"
+" placera la révision tip sous le contrôle de mq).\n"
+" Avec -g/--git, les patchs importés à l'aide de --rev seront\n"
+" enregistrés au format \"git diff\". La section \"diffs\" de\n"
+" l'aide explique l'importance de cette option pour la\n"
+" préservation des informations de copie/renommage et des\n"
+" modifications de permissions."
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag.\n"
+" "
+msgstr ""
+" Pour importer un patch depuis l'entrée standard, utilisez -\n"
+" comme nom de fichier. Il sera alors nécessaire de nommer le\n"
+" patch à l'aide de l'option --name.\n"
+" "
+
+msgid "init a new queue repository"
+msgstr ""
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+
+msgid "clone main and patch repository at same time"
+msgstr "clône simultanément le dépôt principal et le dépôt des patchs"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" Si la source est locale, aucun patch ne sera appliqué sur la\n"
+" cible. En revanche, si la source est distante, cette commande\n"
+" n'est pas en mesure de vérifier si des patchs y ont été\n"
+" empilés, et par conséquent ne peut garantir qu'aucun patch\n"
+" ne sera appliqué au dessus de la cible. Autrement dit, si vous\n"
+" clônez un dépôt distant, assurez-vous auparavant qu'il n'ait\n"
+" aucun patch d'appliqué."
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+" Le dépôt de patchs est recherché dans <src>/.hg/patches par\n"
+" défaut, à moins que -p <url> ne soit utilisé pour spécifier\n"
+" un chemin différent."
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by qinit -c.\n"
+" "
+msgstr ""
+" Le répertoire de patchs doit être contenu dans le dépôt\n"
+" principal, tel que créé par qinit -c.\n"
+" "
+
+msgid "versioned patch repository not found (see qinit -c)"
+msgstr "aucun dépôt de patch trouvé (voir qinit -c)"
+
+msgid "cloning main repository\n"
+msgstr "clônage du dépôt principal\n"
+
+msgid "cloning patch repository\n"
+msgstr "clônage du dépôt des patchs\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "enlèvement des patchs appliqués du dépôt cible\n"
+
+msgid "updating destination repository\n"
+msgstr "mise à jour du dépôt cible\n"
+
+msgid "commit changes in the queue repository"
+msgstr ""
+
+msgid "print the entire series file"
+msgstr "afficher la liste complète de patchs (fichier \"series\")"
+
+msgid "print the name of the current patch"
+msgstr "affiche le nom du dernier patch appliqué"
+
+msgid "print the name of the next patch"
+msgstr "affiche le nom du prochain patch"
+
+msgid "print the name of the previous patch"
+msgstr "affiche le nom du patch précédent"
+
+msgid "create a new patch"
+msgstr "crée un nouveau patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). It will refuse to run if there are any outstanding changes\n"
+" unless -f/--force is specified, in which case the patch will be\n"
+" initialized with them. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew crée un nouveau patch au-dessus du dernier patch\n"
+" actuellement appliqué, le cas échéant. Si le répertoire\n"
+" de travail comporte des modifications non enregistrées,\n"
+" la création du patch sera refusée, à moins d'utiliser\n"
+" -f/--force auquel cas le contenu du nouveau patch sera\n"
+" initialisé avec ces modifications. Il est également\n"
+" possible d'utiliser -I/--include, -X/--exclude ou une liste\n"
+" de noms de fichiers après le nom du patch, afin de n'inclure\n"
+" que les changements des fichiers concernés, et laisser le\n"
+" reste dans le répertoire de travail en tant que modifications\n"
+" non enregistrées."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" Le nom d'utilisateur et la date peuvent être spécifiés à\n"
+" l'aide de -u/--user et -d/--date respectivement.\n"
+" -U/--currentuser et -D/--currentdate positionnent le nom\n"
+" d'utilisateur et la date à leur valeur actuelle."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" L'en-tête du patch et le message de \"commit\" peuvent être\n"
+" spécifiés à l'aide de -e/--edit, -m/--message ou -l/--logfile.\n"
+" Si aucune de ces options n'est utilisée, l'en-tête restera\n"
+" vierge et le message de \"commit\" sera '[mq]: PATCH'."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information.\n"
+" "
+msgstr ""
+" Utilisez -g/--git pour garder le patch au format étendu de\n"
+" \"git\". La section \"diffs\" de l'aide explique l'importance\n"
+" de cette option pour la préservation des informations de\n"
+" copie/renommage et des modifications de permissions.\n"
+" "
+
+msgid "update the current patch"
+msgstr ""
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format.\n"
+" "
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "l'option \"-e\" est incompatible avec \"-m\" ou \"-l\""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr ""
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use 'hg diff' if you only want to see the changes made since the\n"
+" last qrefresh, or 'hg export qtip' if you want to see changes made\n"
+" by the current patch without including changes made since the\n"
+" qrefresh.\n"
+" "
+msgstr ""
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of '* * *'."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold a besoin au minimum du nom d'un patch"
+
+msgid "No patches applied"
+msgstr "Aucun patch d'appliqué"
+
+#, python-format
+msgid "Skipping already folded patch %s"
+msgstr ""
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "Error folding patch %s"
+msgstr ""
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr "empile ou dépile les patchs jusqu'à arriver au patch indiqué"
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the qselect command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the qselect command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch.\n"
+" NOTE: Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid ""
+" To set guards on another patch:\n"
+" hg qguard -- other.patch +2.6.17 -stable\n"
+" "
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "impossible d'utiliser -l/--list avec d'autres options ou paramètres"
+
+msgid "no patch to work with"
+msgstr "aucun patch avec lequel travailler"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "aucun patch du nom de %s"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "affiche l'en-tête du dernier patch appliqué"
+
+msgid "push the next patch onto the stack"
+msgstr "applique le patch suivant sur la pile"
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost.\n"
+" "
+msgstr ""
+" Si -f/--force est utilisé, tout changement local dans les\n"
+" fichiers concernés par le patch seront perdus.\n"
+" "
+
+msgid "no saved queues found, please use -n\n"
+msgstr "aucune ssauvegarde de pile de patchs trouvée, veuillez utiliser -n\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "fusion avec la pile située à %s\n"
+
+msgid "pop the current patch off the stack"
+msgstr "dépile le dernier patch appliqué"
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack.\n"
+" "
+msgstr ""
+" Par défaut, le dernier patch appliqué est ôté de la pile. Si\n"
+" un nom de patch est fourni, les patchs seront dépilés en\n"
+" séquence jusqu'à arriver au patch demandé.\n"
+" "
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "utilisation de la pile de patchs %s\n"
+
+msgid "rename a patch"
+msgstr "renomme un patch"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" Avec un seul argument, le patch actuel est renommé PATCH1.\n"
+" Avec deux arguments, PATCH1 devient PATCH2."
+
+#, python-format
+msgid "%s already exists"
+msgstr "%s existe déjà"
+
+#, python-format
+msgid "A patch named %s already exists in the series file"
+msgstr "Il existe déjà un patch du nom de %s (dans le fichier \"series\")"
+
+msgid "restore the queue state saved by a revision"
+msgstr "rétablissement d'un état sauvegardé de la pile"
+
+msgid "save current queue state"
+msgstr "sauvegarde de l'étatt de la pile de patchs"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "%s: la cible existe et n'est pas un répertoire"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "%s: la cible existe, utilisez -f pour forcer l'action"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "copie de %s vers %s\n"
+
+msgid "strip a revision and all its descendants from the repository"
+msgstr ""
+
+msgid ""
+" If one of the working directory's parent revisions is stripped, the\n"
+" working directory will be updated to the parent of the stripped\n"
+" revision.\n"
+" "
+msgstr ""
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the qguard command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example:"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "move applied patches into repository history"
+msgstr "déplacement des patchs vers l'historique du dépôt"
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+" Achève le développement des révisions spécifiées (qui doivent\n"
+" correspondre à des patch appliqués) en les retirant du contrôle\n"
+" de mq, pour les transformer en \"changeset\" ordinaires dans\n"
+" l'historique du dépôt."
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+" Il est possible d'utiliser l'option -a/--applied, ou de fournir\n"
+" une plage de révisions. Avec --applied, tous les patchs\n"
+" appliqués seront retirés du contrôle de mq. Autrement, les\n"
+" révisions fournies doivent être situées à la base de la pile de\n"
+" patchs appliqués."
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream.\n"
+" "
+msgstr ""
+" Ceci est utile en particulier si vos changements ont été adoptés\n"
+" dans un dépôt amont, ou si vous vous apprêtez à les y envoyer.\n"
+" "
+
+msgid "no revisions specified"
+msgstr "aucune révision spécifiée"
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "le fichier d'état de mq fait référence à un nœud inconnu : %s\n"
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr "impossible d'importer au-dessus d'un patch appliqué"
+
+msgid "print first line of patch header"
+msgstr "affiche la première ligne de l'en-tête d'un patch"
+
+msgid "show only the last patch"
+msgstr ""
+
+#, fuzzy
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-s] [PATCH]"
+
+msgid "use pull protocol to copy metadata"
+msgstr ""
+
+msgid "do not update the new working directories"
+msgstr "ne pas mettre à jour le répertoire de travail"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "transférer sans compression (rapide sur un réseau local)"
+
+msgid "location of source patch repository"
+msgstr "emplacement du dépôt de patchs"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [OPTION]... SOURCE [DEST]"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [OPTION]... [FICHIER]..."
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [OPTION]... [FICHIER]..."
+
+msgid "keep patch file"
+msgstr "garder le fichier du patch"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "arrêter de gérer une révision"
+
+msgid "hg qdelete [-k] [-r REV]... [PATCH]..."
+msgstr "hg qdelete [-k] [-r REV]... [PATCH]..."
+
+msgid "edit patch header"
+msgstr "éditer l'en-tête du patch"
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEXTE] [-l FICHIER] PATCH..."
+
+msgid "overwrite any local changes"
+msgstr "écraser tout modification locale"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [OPTION]... PATCH"
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
+msgstr ""
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "import file in patch directory"
+msgstr "importer un fichier résidant dans le répertoire de patchs"
+
+msgid "name of patch file"
+msgstr "nom du fichier de patch"
+
+msgid "overwrite existing files"
+msgstr "écraser les fichiers existant"
+
+msgid "place existing revisions under mq control"
+msgstr "placer des révisions existantes sous le contrôle de mq"
+
+msgid "use git extended diff format"
+msgstr "utiliser le format de patch étendu de git"
+
+msgid "qpush after importing"
+msgstr "qpush après l'importation"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr "hg qimport [-e] [-n NOM] [-f] [-g] [-P] [-r REV]... FICHIER..."
+
+msgid "create queue repository"
+msgstr "crée un dépôt de patchs"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "import uncommitted changes into patch"
+msgstr "importer les modifications locales dans le patch"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "ajout de \"From: <utilisateur actuel>\" au patch"
+
+msgid "add \"From: <given user>\" to patch"
+msgstr "ajout de \"From: <utilisateur spécifié>\" au patch"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "ajout de \"Date: <date actuelle>\" au patch"
+
+msgid "add \"Date: <given date>\" to patch"
+msgstr "ajout de \"Date: <date spécifiée>\" au patch"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEXTE] [-l FICHIER] [-f] PATCH [FICHIER]..."
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "pop all patches"
+msgstr "dépiler tous les patchs"
+
+msgid "queue name to pop"
+msgstr "nom de la pile à dépiler"
+
+#, fuzzy
+msgid "forget any local changes to patched files"
+msgstr "oublier toute modification locale"
+
+msgid "hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-n NOM] [-f] [PATCH | INDEX]"
+
+msgid "apply if the patch has rejects"
+msgstr ""
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr "appliquer tous les patchs"
+
+msgid "merge from another queue"
+msgstr "fusionner avec une autre pile de patchs"
+
+msgid "merge queue name"
+msgstr "nom de la pile à fusionner"
+
+msgid "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [-m] [-n NOM] [PATCH | INDEX]"
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "ne rafraîchir que les fichiers déjà présent dans le patch et ceux explicitement spécifiés"
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+#, fuzzy
+msgid "add/update date field in patch with current date"
+msgstr "mettre à jour \"Date: <date spécifiée>\" dans le patch (si présente)"
+
+#, fuzzy
+msgid "add/update date field in patch with given date"
+msgstr "mettre à jour \"Date: <date spécifiée>\" dans le patch (si présente)"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXTE] [-l FICHIER] [-s] [FICHIER]..."
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename PATCH1 [PATCH2]"
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TEXT] [-l FILE] [-c] [-n NOM] [-e] [-f]"
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr "dépiler, puis appliquer à nouveau les patchs"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "print patches not in series"
+msgstr "afficher les patchs absents de la série"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "force removal with local changes"
+msgstr "forcer la suppression malgré les modifications locales"
+
+msgid "bundle unrelated changesets"
+msgstr ""
+
+msgid "no backups"
+msgstr ""
+
+msgid "hg strip [-f] [-b] [-n] REV"
+msgstr "hg strip [-f] [-b] [-n] REV"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "show only the first patch"
+msgstr ""
+
+#, fuzzy
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-s] [PATCH]"
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" merge = False # send notification for merges (default True)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid "::"
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = LESS='FSRX' less"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = log"
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like \"hg version\" or \"hg help\", you have to\n"
+"specify them in the global .hgrc\n"
+msgstr ""
+
+#, fuzzy
+msgid "interpret suffixes to refer to ancestor revisions"
+msgstr "suffixes faisant référence à des révisions antérieures"
+
+#, fuzzy
+msgid ""
+"This extension allows you to use git-style suffixes to refer to the\n"
+"ancestors of a specific revision."
+msgstr ""
+"Cette extension permet d'utiliser des suffixes à la mode git pour\n"
+"faire référence aux ancêtres d'une révision donnée."
+
+#, fuzzy
+msgid "For example, if you can refer to a revision as \"foo\", then::"
+msgstr "Par exemple, si \"foo\" désigne une révision, alors :"
+
+#, fuzzy
+msgid ""
+" foo^N = Nth parent of foo\n"
+" foo^0 = foo\n"
+" foo^1 = first parent of foo\n"
+" foo^2 = second parent of foo\n"
+" foo^ = foo^1"
+msgstr ""
+"- foo^N = Nième parent de foo\n"
+" foo^0 = foo\n"
+" foo^1 = premier parent de foo\n"
+" foo^2 = second parent de foo\n"
+" foo^ = foo^1"
+
+#, fuzzy
+msgid ""
+" foo~N = Nth first grandparent of foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = first parent of foo\n"
+" foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+msgstr ""
+"- foo~N = Nième premier grand-parent de foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = premier parent de foo\n"
+" foo~2 = foo^1^1 = foo^^ = premier parent du premier parent de foo\n"
+
+#, fuzzy
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by \"hg export\"."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"With the -d/--diffstat option, you will be prompted for each changeset\n"
+"with a diffstat summary and the changeset summary, so you can be sure\n"
+"you are sending the right changes."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"To configure other defaults, add a section like this to your hgrc\n"
+"file::"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ..."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"Then you can use the \"hg email\" command to mail a series of changesets\n"
+"as a patchbomb."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"To avoid sending patches prematurely, it is a good idea to first run\n"
+"the \"email\" command with the \"-n\" option (test only). You will be\n"
+"prompted for an email recipient address, a subject and an introductory\n"
+"message describing the patches of your patchbomb. Then when all is\n"
+"done, patchbomb messages are displayed. If the PAGER environment\n"
+"variable is set, your pager will be fired up once for each patchbomb\n"
+"message, so you can verify everything is alright."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"The -m/--mbox option is also very useful. Instead of previewing each\n"
+"patchbomb message in a pager or sending the messages directly, it will\n"
+"create a UNIX mailbox file with the patch emails. This mailbox file\n"
+"can be previewed with any mail user agent which supports UNIX mbox\n"
+"files, e.g. with mutt::"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid " % mutt -R -f mbox"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"When you are previewing the patchbomb messages, you can use ``formail``\n"
+"(a utility that is commonly installed as part of the procmail\n"
+"package), to send each message out::"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid " % formail -s sendmail -bm -t < mbox"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid "That should be all. Now your patchbomb is on its way out."
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"envoi d'une série de \"changesets\" par courrier électronique\n"
+"\n"
+"La série débute par un message d'introduction \"[PATCH 0 of N]\" la\n"
+"décrivant dans son ensemble.\n"
+"\n"
+"Ensuite, pour chaque patch est créé un courriel dont le sujet est\n"
+"la première ligne du commentaire du \"changeset\", préfixée par\n"
+"\"[PATCH M of N] \". Le corps du message comporte deux ou trois\n"
+"parties :\n"
+"\n"
+" La description du \"changeset\".\n"
+"\n"
+" Optionnellement, un résumé des modifications généré par le\n"
+" programme diffstat.\n"
+"\n"
+" Le patch proprement dit, tel que généré par \"hg export\".\n"
+"\n"
+"Chaque message fait référence au premier de la série (à l'aide\n"
+"des en-têtes de message In-Reply-To et References) de manière à\n"
+"apparaître comme un fil de discussion dans les lecteurs de courrier\n"
+"électronique et de nouvelles, ainsi que dans les archives de\n"
+"messagerie.\n"
+"\n"
+"Avec l'option -d/--diffstat, il vous sera demandé pour chaque\n"
+"\"changeset\" d'en confirmer l'envoi après avoir vu un résumé des\n"
+"modifications (par diffstat) et le commentaire associé ; ceci afin\n"
+"d'être certain de bien envoyer les bonnes modifications.\n"
+"\n"
+"Pour configurer les valeurs par défaut d'autres options d'envoi,\n"
+"ajoutez à votre fichier hgrc une section telle ci-dessous :\n"
+"\n"
+" [email]\n"
+" from = Mon Nom <mon@adresse_de_courriel>\n"
+" to = destinataire1, destinataire2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+"\n"
+"Après cela il vous sera possible d'utiliser la commande \"hg email\"\n"
+"pour envoyer par courrier électronique une série de \"changesets\".\n"
+"\n"
+"Pour éviter d'envoyer des patchs prématurément, utiliser tout d'abord\n"
+"l'option \"-n\" (simple test) s'avère être une bonne idée. Il vous\n"
+"sera demandé l'adresse du destinataire ainsi qu'un sujet et un\n"
+"message d'introduction pour la série de patchs. Lorsque tout est\n"
+"prêt, les messages seront affichés. Si la variable d'environnement\n"
+"PAGER a été définie, le programme qu'elle indique sera utilisé pour\n"
+"l'affichage chaque message, permettant de vérifier que tout est\n"
+"correct.\n"
+"\n"
+"L'option -m/--mbox est également très utile : au lieu que les\n"
+"messages soient affichés ou envoyés directement, ils seront écrits\n"
+"dans un fichier (au format de boîte aux lettres UNIX). Cette boîte\n"
+"aux lettres peut alors être consultée pour vérification par n'importe\n"
+"quel lecteur de courrier électronique comprenant le format UNIX mbox,\n"
+"comme par exemple mutt :\n"
+"\n"
+" % mutt -R -f mbox\n"
+"\n"
+"Lors de votre vérification, vous pouvez envoyer chaque message en\n"
+"utilisant formail (un outil généralement installé en même temps que\n"
+"procmail) :\n"
+"\n"
+" % formail -s sendmail -bm -t < mbox\n"
+"\n"
+"Et voilà, vos patchs sont en route vers leur destination.\n"
+"\n"
+"Vous pouvez aussi configurer l'option \"method\" de la section\n"
+"[email] pour utiliser un programme compatible avec sendmail, ou\n"
+"alors remplir la section [smtp] de telle sorte que l'extension\n"
+"patchbomb puisse automatiquement envoyer les messages depuis la\n"
+"ligne de commande. Consulter les sections [email] et [smtp] dans la\n"
+"page de manuel hgrc(5) pour plus de détails."
+
+#, fuzzy, python-format
+msgid "%sPlease enter a valid value"
+msgstr "Veuillez fournir une valeur valide.\n"
+
+msgid "Please enter a valid value.\n"
+msgstr "Veuillez fournir une valeur valide.\n"
+
+msgid "does the diffstat above look okay? "
+msgstr "le résumé des modifications ci-dessus semble-t-il correct ?"
+
+msgid "diffstat rejected"
+msgstr "résumé des modifications rejeté"
+
+#, fuzzy
+msgid "send changesets by email"
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" By default, diffs are sent in the format generated by hg export,\n"
+" one per message. The series starts with a \"[PATCH 0 of N]\"\n"
+" introduction, which describes the series as a whole."
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description. Next, (optionally) if the diffstat program is\n"
+" installed and -d/--diffstat is used, the result of running\n"
+" diffstat on the patch. Finally, the patch itself, as generated by\n"
+" \"hg export\"."
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+#, fuzzy
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+"envoi de \"changesets\" par courrier électronique\n"
+"\n"
+" Par défaut, les modifications sont envoyées au format généré par\n"
+" \"hg export\", une par message. La série débute par un message\n"
+" la décrivant dans son ensemble, intitulé \"[PATCH 0 of N]\".\n"
+"\n"
+" Chaque courriel a pour sujet un résumé des modifications\n"
+" apportées par le patch (pris en première ligne de la description\n"
+" du \"changeset\"), préfixé par \"[PATCH M of N] \".\n"
+" Le message est constitué de deux ou trois parties. D'abord,\n"
+" le texte décrivant le \"changeset\". Puis, (optionnellement)\n"
+" un résumé des modifications généré par le programme diffstat si\n"
+" celui-ci est installé et que l'option -d/--diffstat a été\n"
+" spécifiée. Et enfin le patch, tel que généré par \"hg export\".\n"
+"\n"
+" Par défaut le patch est inclus textuellement dans le corps du\n"
+" message afin de faciliter les relectures et commentaires.\n"
+" Cela peut être changé avec l'option -a/--attach qui crée une\n"
+" pièce jointe séparée pour le patch, ou avec -i/--inline qui\n"
+" insère celle-ci dans le corps.\n"
+"\n"
+" Avec -o/--outgoing, des courriels seront générés pour chaque\n"
+" révision non trouvée dans le dépôt cible (ou seulement pour les\n"
+" ancêtres des révisions spécifiées, le cas échéant).\n"
+"\n"
+" Avec -b/--bundle, les \"changesets\" sont sélectionnés de la\n"
+" même manière que pour --outgoing, mais il seront envoyés via\n"
+" un unique courriel dans un \"bundle\" Mercurial binaire joint.\n"
+"\n"
+" Exemples :\n"
+"\n"
+" hg email -r 3000 # envoyer uniquement le patch 3000\n"
+" hg email -r 3000 -r 3001 # envoyer les patchs 3000 et 3001\n"
+" hg email -r 3000:3005 # envoyer les patchs 3000 à 3005\n"
+" hg email 3000 # envoyer le patch 3000 (déprécié)\n"
+"\n"
+" hg email -o # envoyer les patchs absents de la\n"
+" destination par défaut\n"
+" hg email -o DEST # envoyer les patchs absents de DEST\n"
+" hg email -o -r 3000 # envoyer les ancêtres de 3000 absents\n"
+" de la destination par défaut\n"
+" hg email -o -r 3000 DEST # envoyer les ancêtres de 3000 absents\n"
+" de DEST\n"
+"\n"
+" Afin de pouvoir utiliser cette commande, il est nécessaire\n"
+" d'activer préalablement l'envoi de courriel dans le fichier\n"
+" de configuration (hgrc). Consulter hgrc(5) à la section\n"
+" [email] pour plus de détails.\n"
+" "
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "veuillez spécifier au minimum un \"changeset\", à l'aide de -r ou -o"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr "ne pas spécifier --outgoing, qui est systématiquement activé lorsque --bundle est utilisé"
+
+msgid "too many destinations"
+msgstr "trop de destinations"
+
+msgid "use only one form to specify the revision"
+msgstr "veuillez ne spécifier les révisions que d'une seule manière"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Veuillez écrire le message d'introduction de la série de patchs."
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr "Cette série comporte %d patchs."
+
+msgid "Final summary:\n"
+msgstr "Résumé complet des modifications :\n"
+
+msgid "Displaying "
+msgstr "Affichage de "
+
+msgid "Writing "
+msgstr "Écriture de "
+
+msgid "Sending "
+msgstr "Envoi de "
+
+msgid "send patches as attachments"
+msgstr "envoyer les patchs en tant que pièces jointes"
+
+msgid "send patches as inline attachments"
+msgstr "envoyer les patchs comme pièces insérées dans le corps du message"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "adresses électroniques des destinataires en copie carbone invisible"
+
+msgid "email addresses of copy recipients"
+msgstr "adresses électroniques des destinataires en copie carbone"
+
+msgid "add diffstat output to messages"
+msgstr "ajouter un résumé des modifications avec diffstat dans les messages"
+
+msgid "use the given date as the sending date"
+msgstr "utiliser la date fournie comme date d'envoi"
+
+msgid "use the given file as the series description"
+msgstr "lire le message d'introduction à la série dans le fichier fourni"
+
+msgid "email address of sender"
+msgstr "adresse électronique de l'expéditeur"
+
+msgid "print messages that would be sent"
+msgstr "afficher les messages tels qu'ils seraient envoyés"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "écrire les messages dans un fichier au format \"mbox\" au lieu de les envoyer"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "sujet du premier message (intro ou patch unique)"
+
+msgid "message identifier to reply to"
+msgstr "identifiant du message auquel répondre"
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr "adresses électroniques des destinataires"
+
+msgid "omit hg patch header"
+msgstr "omettre l'en-tête de patch spécifique à Mercurial"
+
+msgid "send changes not found in the target repository"
+msgstr "envoyer les modifications non présentes dans le dépôt cible"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "envoyer les modifications non présentes dans le dépôt cible sous forme de \"bundle\" binaire"
+
+msgid "name of the bundle attachment file"
+msgstr "nom à donner au fichier \"bundle\" envoyé"
+
+msgid "a revision to send"
+msgstr "une révision à envoyer"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr "procéder même si le dépôt cible n'est pas apparenté (avec -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr "un \"changeset\" à utiliser comme point de départ, au lieu d'une destination (avec -b/--bundle)"
+
+msgid "send an introduction email for a single patch"
+msgstr "envoyer un courriel d'introduction pour un patch seul"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [OPTION]... [DEST]..."
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+#, fuzzy
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid " This means that purge will delete:"
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid ""
+" - Unknown files: files marked with \"?\" by \"hg status\"\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid " But it will leave untouched:"
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with \"hg add\")"
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, fuzzy
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+"retire les fichiers non suivis par Mercurial\n"
+"\n"
+" Supprime les fichiers non connus de Mercurial, ce qui peut être\n"
+" utile pour tester des changements locaux non enregistrés à\n"
+" l'intérieur d'une arborescence de sources propre.\n"
+"\n"
+" Ainsi, purge effacera :\n"
+" - les fichiers inconnus : fichiers que \"hg status\" indique\n"
+" par un point d'interrogation\n"
+" - les répertoires vides : en fait Mercurial ignore complètement\n"
+" les répertoires, à moins qu'ils ne contiennent des fichiers\n"
+" sous son contrôle\n"
+" Seront par contre laissés intacts :\n"
+" - Les fichiers placés sous contrôle, qu'ils aient été modifiés\n"
+" ou non\n"
+" - Les fichiers ignorés (sauf si --all est utilisé)\n"
+" - Les fichiers nouvellement ajoutés au dépôt (avec \"hg add\")\n"
+"\n"
+" Si des répertoires sont spécifiés sur la ligne de commande,\n"
+" seuls les fichiers qu'ils contiennent seront considérés.\n"
+"\n"
+" Soyez prudent en utilisant purge, si vous avez oublié d'ajouter\n"
+" des fichiers au dépôt, ils seront perdus irrémédiablement.\n"
+" Si vous souhaitez seulement afficher la liste des fichiers qui\n"
+" seraient effacés par purge, utilisez l'option --print.\n"
+" "
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s ne peut être supprimé"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "attention: %s\n"
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr "Suppression du fichier %s\n"
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr "Suppression du répertoire %s\n"
+
+msgid "abort if an error occurs"
+msgstr "abandonner en cas d'erreur"
+
+msgid "purge ignored files too"
+msgstr "supprimer également les fichiers ignorés"
+
+msgid "print filenames instead of deleting them"
+msgstr "afficher les nom des fichiers au lieu de les supprimer"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr "terminer les noms de fichiers par un caractère nul, pour utilisation avec xargs (implique -p/--print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [OPTION]... [RÉPERTOIRE]..."
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history onto another. This can be useful for linearizing local\n"
+" changes relative to a master development tree."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a.\n"
+" "
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr ""
+
+msgid "cannot use collapse with continue or abort"
+msgstr ""
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot use both keepbranches and extrafn"
+msgstr ""
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr ""
+
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr ""
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr ""
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, not stripping\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+#, fuzzy
+msgid "source is ancestor of destination"
+msgstr "le répertoire racine ne peut servir de destination"
+
+#, fuzzy
+msgid "source is descendant of destination"
+msgstr "le répertoire racine ne peut servir de destination"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "rebase from a given revision"
+msgstr ""
+
+msgid "rebase from the base of a given revision"
+msgstr ""
+
+msgid "rebase onto a given revision"
+msgstr ""
+
+msgid "collapse the rebased changesets"
+msgstr ""
+
+#, fuzzy
+msgid "keep original changesets"
+msgstr "ne pas considérer la révision"
+
+msgid "keep original branch names"
+msgstr ""
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid "hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] | [-c] | [-a]"
+msgstr ""
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr ""
+
+msgid "this is a binary file\n"
+msgstr ""
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr ""
+
+msgid "&No, skip this change"
+msgstr ""
+
+msgid "&Skip remaining changes to this file"
+msgstr ""
+
+msgid "Record remaining changes to this &file"
+msgstr ""
+
+msgid "&Done, skip remaining changes and files"
+msgstr ""
+
+msgid "Record &all changes to all remaining files"
+msgstr ""
+
+msgid "&Quit, recording no changes"
+msgstr ""
+
+msgid "&?"
+msgstr ""
+
+msgid "y - record this change"
+msgstr ""
+
+msgid "user quit"
+msgstr ""
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+msgid "y"
+msgstr ""
+
+#, python-format
+msgid "record this change to %r?"
+msgstr ""
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr ""
+
+msgid "interactively select changes to commit"
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be candidates for recording."
+msgstr ""
+
+msgid " See 'hg help dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+
+msgid " ? - display help"
+msgstr ""
+
+msgid "'mq' extension not loaded"
+msgstr ""
+
+msgid "running non-interactively, use commit instead"
+msgstr ""
+
+msgid "no changes to record\n"
+msgstr ""
+
+msgid "patch failed to apply"
+msgstr ""
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository (experimental)"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" NOTE: actions that change history such as rollback or moving the\n"
+" source may confuse sharers.\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr ""
+
+msgid "Fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. If --log is\n"
+" specified, log messages will have a comment appended of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" hg transplant --branch REVISION --all will rebase the selected\n"
+" branch (up to the named revision) onto your current working\n"
+" directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, hg transplant will start\n"
+" an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling hg transplant\n"
+" --continue/-c.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid "pull patches from REPOSITORY"
+msgstr ""
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through FILTER"
+msgstr ""
+
+msgid "hg transplant [-s REPOSITORY] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- You should set same encoding for the repository by locale or\n"
+" HGENCODING."
+msgstr ""
+
+msgid ""
+"Path encoding conversion are done between Unicode and\n"
+"encoding.encoding which is decided by Mercurial from current locale\n"
+"setting or HGENCODING.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid "If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+#, fuzzy
+msgid "discover and advertise repositories on the local network"
+msgstr "découverte et annonce de dépôts sur le réseau local"
+
+#, fuzzy
+msgid ""
+"Zeroconf enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+"Les dépôts utilisant zeroconf seront visibles sur le réseau sans\n"
+"qu'il n'y ait besoin de configurer un serveur ou service\n"
+"particuliers, et ils peuvent être accédés simplement, sans\n"
+"connaissance de leur adresse IP."
+
+#, fuzzy
+msgid ""
+"To allow other people to discover your repository using run \"hg serve\"\n"
+"in your repository::"
+msgstr ""
+"Pour permettre à d'autres personnes de découvrir votre dépôt,\n"
+"lancez-y la commande \"hg serve\" :"
+
+#, fuzzy
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+#, fuzzy
+msgid "You can discover zeroconf enabled repositories by running \"hg paths\"::"
+msgstr ""
+"Vous pouvez découvrir les dépôts utilisant zeroconf en utilisant\n"
+"la commande \"hg paths\", par exemple :"
+
+#, fuzzy
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+msgid "archive prefix contains illegal components"
+msgstr "le préfixe donné pour l'archive contient des composants non autorisés"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "impossible de donner un préfixe pour une création d'archive vers un répertoire (de type \"files\")"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "type d'archive inconnu : '%s'"
+
+msgid "invalid changegroup"
+msgstr ""
+
+msgid "unknown parent"
+msgstr ""
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+#, python-format
+msgid "%s: not a Mercurial bundle file"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle version"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle compression type"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "premature EOF reading chunk (got %d bytes, expected %d)"
+msgstr ""
+
+msgid "empty username"
+msgstr "le nom d'utilisateur est vide"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "le nom d'utilisateur %s contient un saut de ligne"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "les options --message et --logfile s'excluent mutuellement"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr ""
+
+msgid "limit must be a positive integer"
+msgstr "la limite spécifiée doit être un entier positif"
+
+msgid "limit must be positive"
+msgstr "la limite doit être positive"
+
+msgid "too many revisions specified"
+msgstr "trop de révisions spécifiées"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "'%%%s'spécification de format invalide dans le nom du fichier de sortie"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "ajout de %s\n"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "suppression de %s\n"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr "suppression de %s plannifiée, en tant que renommage de %s (similaire à %d%%)\n"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: le fichier n'est pas suivi, pas de copie\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: le fichier a été marqué pour suppression, pas de copie\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: %s entre en collision avec %s, pas d'écrasement\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: le fichier existe, pas d'écrasement\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: supprimé dans la copie de travail\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: impossible de copier - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "déplacement de %s vers %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "copie de %s vers %s\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+msgid "no source or destination specified"
+msgstr ""
+
+msgid "no destination specified"
+msgstr ""
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "no files to copy"
+msgstr ""
+
+msgid "(consider using --after)\n"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "branch: %s\n"
+msgstr ""
+
+#, python-format
+msgid "tag: %s\n"
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "user: %s\n"
+msgstr ""
+
+#, python-format
+msgid "date: %s\n"
+msgstr ""
+
+msgid "files+:"
+msgstr ""
+
+msgid "files-:"
+msgstr ""
+
+msgid "files:"
+msgstr ""
+
+#, python-format
+msgid "files: %s\n"
+msgstr ""
+
+#, python-format
+msgid "copies: %s\n"
+msgstr ""
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr ""
+
+msgid "description:\n"
+msgstr ""
+
+#, python-format
+msgid "summary: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "%s: %s"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr ""
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr ""
+
+#, python-format
+msgid "%s:%s copy source revision cannot be found!\n"
+msgstr ""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+
+msgid "HG: Leave message empty to abort commit."
+msgstr ""
+
+#, python-format
+msgid "HG: user: %s"
+msgstr ""
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr ""
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr ""
+
+#, python-format
+msgid "HG: added %s"
+msgstr ""
+
+#, python-format
+msgid "HG: changed %s"
+msgstr ""
+
+#, python-format
+msgid "HG: removed %s"
+msgstr ""
+
+msgid "HG: no files changed"
+msgstr ""
+
+msgid "empty commit message"
+msgstr ""
+
+msgid "add the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see hg forget."
+msgstr ""
+
+msgid ""
+" If no names are given, add all files to the repository.\n"
+" "
+msgstr ""
+
+msgid "add all new files, delete all missing files"
+msgstr ""
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" .hgignore. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive.\n"
+" "
+msgstr ""
+
+msgid "similarity must be a number"
+msgstr ""
+
+msgid "similarity must be between 0 and 100"
+msgstr ""
+
+msgid "show changeset information by line for each file"
+msgstr ""
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable.\n"
+" "
+msgstr ""
+
+msgid "at least one filename or pattern is required"
+msgstr ""
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr ""
+
+#, fuzzy
+msgid "create an unversioned archive of a repository revision"
+msgstr "crée une archive du dépôt à une révision donnée, sans conserver l'historique"
+
+#, fuzzy
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" Par défaut l'archive est créée à partir de la révision parente\n"
+" du répertoire de travail. Une autre révision peut être spécifiée\n"
+" à l'aide de -r/--rev."
+
+#, fuzzy
+msgid ""
+" To specify the type of archive to create, use -t/--type. Valid\n"
+" types are::"
+msgstr " -t/--type permet de spécifier le type d'archive à créer, parmi :"
+
+#, fuzzy
+msgid ""
+" \"files\" (default): a directory full of files\n"
+" \"tar\": tar archive, uncompressed\n"
+" \"tbz2\": tar archive, compressed using bzip2\n"
+" \"tgz\": tar archive, compressed using gzip\n"
+" \"uzip\": zip archive, uncompressed\n"
+" \"zip\": zip archive, compressed using deflate"
+msgstr ""
+" \"files\" (par défaut) : un répertoire rempli de fichiers\n"
+" \"tar\" : une archive tar non compressée\n"
+" \"tbz2\" : une archive tar compressée avec bzip2\n"
+" \"tgz\" : une archive tar compressée avec gzip\n"
+" \"uzip\" : une archive zip non compressée\n"
+" \"zip\" : une archive zip compressée avec l'algorithme deflate"
+
+#, fuzzy
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see 'hg help export' for details."
+msgstr ""
+" Le nom exact de l'archive ou du répertoire de destination est\n"
+" donné à l'aide d'une chaîne de format. Consulter 'hg help export'\n"
+" pour plus de détails."
+
+#, fuzzy
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed.\n"
+" "
+msgstr ""
+" Un chemin relatif est ajouté devant chaque membre de l'archive,\n"
+" par défaut le nom du fichier d'archive (sans répertoires ni\n"
+" suffixes). Un préfixe différent peut être spécifié avec\n"
+" -p/--prefix.\n"
+" "
+
+msgid "no working directory: please specify a revision"
+msgstr "pas de répertoire de travail, veuillez spécifier une révision"
+
+msgid "repository root cannot be destination"
+msgstr "le répertoire racine ne peut servir de destination"
+
+msgid "cannot archive plain files to stdout"
+msgstr "impossible d'envoyer une archive de simples fichiers vers la sortie standard"
+
+msgid "reverse effect of earlier changeset"
+msgstr ""
+
+msgid ""
+" Commit the backed out changes as a new changeset. The new\n"
+" changeset is a child of the backed out changeset."
+msgstr ""
+
+msgid ""
+" If you backout a changeset other than the tip, a new head is\n"
+" created. This head will be the new tip and you should merge this\n"
+" backout changeset with another head."
+msgstr ""
+
+msgid ""
+" The --merge option remembers the parent of the working directory\n"
+" before starting the backout, then merges the new head with that\n"
+" changeset afterwards. This saves you from doing the merge by hand.\n"
+" The result of this merge is not committed, as with a normal merge."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr ""
+
+msgid "please specify a revision to backout"
+msgstr ""
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr ""
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr ""
+
+msgid "the backout changeset is a new head - do not forget to merge\n"
+msgstr ""
+
+msgid "(use \"backout --merge\" if you want to auto-merge)\n"
+msgstr ""
+
+msgid "subdivision search of changesets"
+msgstr "recherche de \"changesets\" par dichotomie"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" Cette commande aide à trouver les \"changesets\" étant à\n"
+" l'origine de problèmes. Pour l'utiliser, marquez comme étant\n"
+" mauvaise la première révision pour laquelle vous avez relevé les\n"
+" symptômes, puis comme bonne la dernière révision connue pour\n"
+" être exempte du problème. Bisect va alors mettre à jour votre\n"
+" répertoire de travail à une révision à tester (à moins que\n"
+" -U/--noupdate n'ait été spécifié). Une fois vos tests réalisés,\n"
+" indiquez si le problème était présent ou non. Bisect\n"
+" recommencera alors pour une autre révision candidate jusqu'à\n"
+" être en mesure d'annoncer la révision fautive."
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Vous pouvez aussi passer une révision en argument lors du\n"
+" marquage afin d'éviter l'étape manuelle de mise à jour du\n"
+" répertoire de travail à cette révision."
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad.\n"
+" "
+msgstr ""
+" Vous pouvez fournir une commande pour automatiser la recherche\n"
+" par dichotomie. Son code de retour sera utilisé pour marquer les\n"
+" révisions : 0 indique une révision sans problème, 125 qu'il ne\n"
+" faut pas prendre cette révision en compte, 127 (commande\n"
+" introuvable) cause l'abandon du processus de recherche, et tout\n"
+" autre code de retour non nul désigne une révision affectée par\n"
+" le problème.\n"
+" "
+
+msgid "The first good revision is:\n"
+msgstr "La première révision exempte du problème est :\n"
+
+msgid "The first bad revision is:\n"
+msgstr "La première révision présentant le problème est :\n"
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"Certaines révisions n'ayant pas été considérées, la première révision\n"
+"exempte du problème pourrait être parmi :\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"Certaines révisions n'ayant pas été considérées, la première révision\n"
+"présentant le problème pourrait être parmi :\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "dichotomie impossible (pas de bonne révision connue)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "dichotomie impossible (pas de mauvaise révision connue)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "('hg bisect <cmd>' ne devrait plus être utilisé)\n"
+
+msgid "incompatible arguments"
+msgstr "arguments incompatibles"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "impossible d'exécuter %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s a été tué"
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "\"Changeset\" %d:%s: %s\n"
+
+#, fuzzy, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "Test du \"changeset\" %s:%s (%s \"changesets\" restant, ~%s tests)\n"
+
+msgid "set or show the current branch name"
+msgstr ""
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch. Use\n"
+" 'hg commit --close-branch' to mark this branch as closed.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr ""
+
+msgid "a branch of the same name already exists (use --force to override)"
+msgstr ""
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr ""
+
+msgid "list repository named branches"
+msgstr ""
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch.\n"
+" "
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If no destination repository is specified the destination is\n"
+" assumed to have all the nodes specified by one or more --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr ""
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "output the current or given revision of files"
+msgstr ""
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions::"
+msgstr ""
+
+msgid ""
+" %s basename of file being printed\n"
+" %d dirname of file being printed, or '.' if in repository root\n"
+" %p root-relative path name of file being printed\n"
+" "
+msgstr ""
+
+msgid "make a copy of an existing repository"
+msgstr ""
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" .hg/hgrc file, as the default to be used for future pulls."
+msgstr ""
+
+msgid ""
+" If you use the -r/--rev option to clone up to a specific revision,\n"
+" no subsequent revisions (including subsequent tags) will be\n"
+" present in the cloned repository. This option implies --pull, even\n"
+" on local repositories."
+msgstr ""
+
+msgid ""
+" By default, clone will check out the head of the 'default' branch.\n"
+" If the -U/--noupdate option is used, the new clone will contain\n"
+" only a repository (.hg) and no working copy (the working copy\n"
+" parent is the null revision)."
+msgstr ""
+
+msgid " See 'hg help urls' for valid source format details."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ssh:// URL as the destination, but no\n"
+" .hg/hgrc and working directory will be created on the remote side.\n"
+" Please see 'hg help urls' for important details about ssh:// URLs."
+msgstr ""
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the checked out files). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+
+msgid ""
+" In some cases, you can clone repositories and checked out files\n"
+" using full hardlinks with ::"
+msgstr ""
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr ""
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq.\n"
+" "
+msgstr ""
+
+msgid "commit the specified files or all outstanding changes"
+msgstr ""
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized RCS, this operation is a local operation. See hg push\n"
+" for a way to actively distribute your changes."
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be committed."
+msgstr ""
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+
+msgid ""
+" If no commit message is specified, the configured editor is\n"
+" started to prompt you for a message."
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr ""
+
+msgid "created new head\n"
+msgstr ""
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr ""
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr ""
+
+msgid "either two or three arguments required"
+msgstr ""
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "validate the correctness of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr ""
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item.\n"
+" "
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care.\n"
+" "
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr ""
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr ""
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr ""
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+msgid "Checking extensions...\n"
+msgstr ""
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+msgid "Checking templates...\n"
+msgstr ""
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking patch...\n"
+msgstr ""
+
+msgid " patch call failed:\n"
+msgstr ""
+
+msgid " unexpected patch output!\n"
+msgstr ""
+
+msgid " patch test failed!\n"
+msgstr ""
+
+msgid " (Current patch tool may be incompatible with patch, or misconfigured. Please check your .hgrc file)\n"
+msgstr ""
+
+msgid " Internal patcher failure, please report this error to http://mercurial.selenic.com/bts/\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr ""
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+
+msgid " (specify a commit editor in your .hgrc file)\n"
+msgstr ""
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr ""
+
+msgid "Checking username...\n"
+msgstr ""
+
+msgid " (specify a username in your .hgrc file)\n"
+msgstr ""
+
+msgid "No problems detected\n"
+msgstr ""
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr ""
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr ""
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "diff repository (or selected files)"
+msgstr ""
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+
+msgid ""
+" NOTE: diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first parent\n"
+" changeset if no revisions are specified."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read 'hg help diffs'.\n"
+" "
+msgstr ""
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr ""
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+
+msgid ""
+" The information shown in the changeset header is: author,\n"
+" changeset hash, parent(s) and commit comment."
+msgstr ""
+
+msgid ""
+" NOTE: export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows::"
+msgstr ""
+
+msgid ""
+" %% literal \"%\" character\n"
+" %H changeset hash (40 bytes of hexadecimal)\n"
+" %N number of patches being generated\n"
+" %R changeset revision number\n"
+" %b basename of the exporting repository\n"
+" %h short-form changeset hash (12 bytes of hexadecimal)\n"
+" %n zero-padded sequence number, starting at 1\n"
+" %r zero-padded changeset revision number"
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See 'hg help diffs' for more information."
+msgstr ""
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge.\n"
+" "
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" To undo a forget before the next commit, see hg add.\n"
+" "
+msgstr ""
+
+msgid "no files specified"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "show current repository heads or show branch heads"
+msgstr ""
+
+msgid " With no arguments, show all repository head changesets."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations."
+msgstr ""
+
+msgid ""
+" If one or more REV is given, the \"branch heads\" will be shown for\n"
+" the named branch associated with the specified changeset(s)."
+msgstr ""
+
+msgid ""
+" Branch heads are changesets on a named branch with no descendants on\n"
+" the same branch. A branch head could be a \"true\" (repository) head,\n"
+" or it could be the last changeset on that branch before it was\n"
+" merged into another branch, or it could be the last changeset on the\n"
+" branch before a new branch was created. If none of the branch heads\n"
+" are true heads, the branch is considered inactive."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed.\n"
+" "
+msgstr ""
+
+msgid "you must specify a branch to use --closed"
+msgstr ""
+
+#, python-format
+msgid "no open branch heads on branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes on branch %s containing %s are reachable from %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes on branch %s are reachable from %s\n"
+msgstr ""
+
+msgid "show help for a given topic or a help overview"
+msgstr ""
+
+msgid " With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid "global options:"
+msgstr "options globales :"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "utiliser \"hg help\" pour la liste complète des commandes"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr "utiliser \"hg help\" pour la liste complète des commandes ou \"hg -v\" pour plus de détails"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show aliases and global options"
+msgstr "utiliser \"hg -v help%s\" pour afficher les alias et les options globales"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "utiliser \"hg -v help %s\" pour afficher les options globales"
+
+msgid "list of commands:"
+msgstr "liste des commandes :"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"alias : %s\n"
+
+msgid "(no help text available)"
+msgstr "(pas d'aide disponible)"
+
+msgid "options:\n"
+msgstr "options :\n"
+
+msgid "no commands defined\n"
+msgstr "pas de commandes définies\n"
+
+msgid "enabled extensions:"
+msgstr "extensions activées :"
+
+msgid "no help text available"
+msgstr "pas d'aide disponible"
+
+#, fuzzy, python-format
+msgid "%s extension - %s"
+msgstr "extension %s - %s\n"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial, système de gestion de sources distribué\n"
+
+msgid "basic commands:"
+msgstr "commandes de base :"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"sujets d'aide supplémentaires :"
+
+msgid "identify the working copy or specified revision"
+msgstr ""
+
+msgid ""
+" With no revision, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid ""
+" This summary identifies the repository state using one or two\n"
+" parent hash identifiers, followed by a \"+\" if there are\n"
+" uncommitted changes in the working directory, a list of tags for\n"
+" this revision and a branch name for non-default branches.\n"
+" "
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid " Import a list of patches and commit them individually."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by hg export, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+msgid "no diffs found"
+msgstr ""
+
+msgid "not a Mercurial patch"
+msgstr ""
+
+msgid "patch is damaged or loses information"
+msgstr ""
+
+msgid "show new changesets found in source"
+msgstr ""
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+
+msgid ""
+" See pull for valid source format details.\n"
+" "
+msgstr ""
+
+msgid "create a new repository in the given directory"
+msgstr ""
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ssh:// URL as the destination.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "locate files matching specific patterns"
+msgstr ""
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames.\n"
+" "
+msgstr ""
+
+msgid "show revision history of entire repository or files"
+msgstr ""
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+
+msgid ""
+" If no revision range is specified, the default is tip:0 unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+
+msgid ""
+" NOTE: log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:.\n"
+" "
+msgstr ""
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes.\n"
+" "
+msgstr ""
+
+msgid "merge working directory with another revision"
+msgstr ""
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr ""
+
+msgid "there is nothing to merge"
+msgstr ""
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr ""
+
+msgid "working dir not at a head rev - use \"hg update\" or merge with an explicit rev"
+msgstr ""
+
+msgid "show changesets not found in destination"
+msgstr ""
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+
+msgid ""
+" See pull for valid destination format details.\n"
+" "
+msgstr ""
+
+msgid "show the parents of the working directory or revision"
+msgstr ""
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr ""
+
+msgid "show aliases for remote repositories"
+msgstr ""
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of /etc/mercurial/hgrc\n"
+" and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too."
+msgstr ""
+
+msgid ""
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "not found!\n"
+msgstr ""
+
+msgid "not updating, since new heads added\n"
+msgstr ""
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr ""
+
+msgid "pull changes from the specified source"
+msgstr ""
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+
+msgid ""
+" Use hg incoming if you want to see what would have been added by a\n"
+" pull at the time you issued this command. If you then decide to\n"
+" added those changes to the repository, you should use pull -r X\n"
+" where X is the last changeset listed by hg incoming."
+msgstr ""
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "push changes to the specified destination"
+msgstr ""
+
+msgid " Push changes from the local repository to the given destination."
+msgstr ""
+
+msgid ""
+" This is the symmetrical operation for pull. It moves changes from\n"
+" the current repository to a different one. If the destination is\n"
+" local this is identical to a pull in that directory from the\n"
+" current one."
+msgstr ""
+
+msgid ""
+" By default, push will refuse to run if it detects the result would\n"
+" increase the number of remote heads. This generally indicates the\n"
+" user forgot to pull and merge before pushing."
+msgstr ""
+
+msgid ""
+" If -r/--rev is used, the named revision and all its ancestors will\n"
+" be pushed to the remote repository."
+msgstr ""
+
+msgid ""
+" Please see 'hg help urls' for important details about ssh://\n"
+" URLs. If DESTINATION is omitted, a default path will be used.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr ""
+
+msgid "roll back an interrupted transaction"
+msgstr ""
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it.\n"
+" "
+msgstr ""
+
+msgid "remove the specified files on the next commit"
+msgstr ""
+
+msgid " Schedule the indicated files for removal from the repository."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by hg status). The actions are Warn, Remove (from branch)\n"
+" and Delete (from disk)::"
+msgstr ""
+
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see hg revert.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file %s (use -f to force removal)\n"
+msgstr ""
+
+msgid "still exists"
+msgstr ""
+
+msgid "is modified"
+msgstr ""
+
+msgid "has been marked for add"
+msgstr ""
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "retry file merges from a merge or update"
+msgstr ""
+
+msgid ""
+" This command will cleanly retry unresolved file merges using file\n"
+" revisions preserved from the last update or merge. To attempt to\n"
+" resolve all unresolved files, use the -a/--all switch."
+msgstr ""
+
+msgid ""
+" If a conflict is resolved manually, please note that the changes\n"
+" will be overwritten if the merge is retried with resolve. The\n"
+" -m/--mark switch should be used to mark the file as resolved."
+msgstr ""
+
+msgid ""
+" This command also allows listing resolved files and manually\n"
+" indicating whether or not files are resolved. All files must be\n"
+" marked as resolved before a commit is permitted."
+msgstr ""
+
+msgid " The codes used to show the status of files are::"
+msgstr ""
+
+msgid ""
+" U = unresolved\n"
+" R = resolved\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr ""
+
+msgid "can't specify --all and patterns"
+msgstr ""
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+
+msgid "restore individual files or directories to an earlier state"
+msgstr ""
+
+msgid ""
+" (Use update -r to check out earlier revisions, revert does not\n"
+" change the working directory parents.)"
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify the\n"
+" revision to revert to."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See 'hg help\n"
+" dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+
+msgid ""
+" If a file has been deleted, it is restored. If the executable mode\n"
+" of a file was changed, it is reset."
+msgstr ""
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup.\n"
+" "
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr ""
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr ""
+
+#, python-format
+msgid "reverting %s\n"
+msgstr ""
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr ""
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr ""
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr ""
+
+msgid "roll back the last transaction"
+msgstr ""
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back::"
+msgstr ""
+
+msgid ""
+" commit\n"
+" import\n"
+" pull\n"
+" push (with this repository as destination)\n"
+" unbundle"
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr ""
+
+msgid ""
+" Print the root directory of the current repository.\n"
+" "
+msgstr ""
+
+msgid "export the repository via HTTP"
+msgstr ""
+
+msgid " Start a local HTTP repository browser and pull server."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr ""
+
+msgid "show changed files in the working directory"
+msgstr ""
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+
+msgid ""
+" NOTE: status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does not\n"
+" report permission changes and diff only reports changes relative\n"
+" to one merge parent."
+msgstr ""
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown."
+msgstr ""
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)\n"
+" "
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr ""
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid " (empty repository)"
+msgstr "clônage du dépôt des patchs\n"
+
+#, fuzzy
+msgid " (no revision checked out)"
+msgstr "aucune révision spécifiée"
+
+#, fuzzy, python-format
+msgid "parent: %d:%s %s\n"
+msgstr "abandon : %s : %s\n"
+
+#, fuzzy, python-format
+msgid "branch: %s\n"
+msgstr "abandon : %s\n"
+
+#, python-format
+msgid "%d added"
+msgstr ""
+
+#, python-format
+msgid "%d modified"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "%d removed"
+msgstr "%s ne peut être supprimé"
+
+#, python-format
+msgid "%d deleted"
+msgstr ""
+
+#, python-format
+msgid "%d ignored"
+msgstr ""
+
+#, python-format
+msgid "%d unknown"
+msgstr ""
+
+#, python-format
+msgid "%d unresolved"
+msgstr ""
+
+msgid " (merge)"
+msgstr ""
+
+msgid " (new branch)"
+msgstr ""
+
+msgid " (clean)"
+msgstr ""
+
+msgid " (new branch head)"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "commit: %s\n"
+msgstr "abandon : %s\n"
+
+msgid "update: (current)\n"
+msgstr ""
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr ""
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr ""
+
+msgid "1 or more incoming"
+msgstr ""
+
+#, python-format
+msgid "%d outgoing"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "remote: %s\n"
+msgstr "suppression de %s\n"
+
+msgid "remote: (synced)\n"
+msgstr ""
+
+msgid "add one or more tags for the current or given revision"
+msgstr ""
+
+msgid " Name a particular revision using <name>."
+msgstr ""
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc."
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed\n"
+" similarly to other project files and can be hand-edited if\n"
+" necessary. The file '.hg/localtags' is used for local tags (not\n"
+" shared among repositories)."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr ""
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr ""
+
+msgid "--rev and --remove are incompatible"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr ""
+
+msgid "list repository tags"
+msgstr ""
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags.\n"
+" "
+msgstr ""
+
+msgid "show the tip revision"
+msgstr ""
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset.\n"
+" "
+msgstr ""
+
+msgid "apply one or more changegroup files"
+msgstr ""
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command.\n"
+" "
+msgstr ""
+
+msgid "update working directory"
+msgstr ""
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" revision, or the tip of the current branch if none is specified.\n"
+" Use null as the revision to remove the working copy (like 'hg\n"
+" clone -U')."
+msgstr ""
+
+msgid ""
+" When the working directory contains no uncommitted changes, it\n"
+" will be replaced by the state of the requested revision from the\n"
+" repository. When the requested revision is on a different branch,\n"
+" the working directory will additionally be switched to that\n"
+" branch."
+msgstr ""
+
+msgid ""
+" When there are uncommitted changes, use option -C/--clean to\n"
+" discard them, forcibly replacing the state of the working\n"
+" directory with the requested revision. Alternately, use -c/--check\n"
+" to abort."
+msgstr ""
+
+msgid ""
+" When there are uncommitted changes and option -C/--clean is not\n"
+" used, and the parent revision and requested revision are on the\n"
+" same branch, and one of them is an ancestor of the other, then the\n"
+" new working directory will contain the requested revision merged\n"
+" with the uncommitted changes. Otherwise, the update will fail with\n"
+" a suggestion to use 'merge' or 'update -C' instead."
+msgstr ""
+
+msgid ""
+" If you want to update just one file to an older revision, use\n"
+" revert."
+msgstr ""
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+
+msgid "uncommitted local changes"
+msgstr ""
+
+msgid "verify the integrity of the repository"
+msgstr ""
+
+msgid " Verify the integrity of the current repository."
+msgstr ""
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices.\n"
+" "
+msgstr ""
+
+msgid "output version and copyright information"
+msgstr ""
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+
+msgid ""
+"\n"
+"Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+
+msgid "change working directory"
+msgstr ""
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr ""
+
+msgid "suppress output"
+msgstr ""
+
+msgid "enable additional output"
+msgstr ""
+
+msgid "set/override config option"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr ""
+
+msgid "start debugger"
+msgstr ""
+
+msgid "set the charset encoding"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr ""
+
+msgid "print traceback on exception"
+msgstr ""
+
+msgid "time how long the command takes"
+msgstr ""
+
+msgid "print command execution profile"
+msgstr ""
+
+msgid "output version information and exit"
+msgstr ""
+
+msgid "display help and exit"
+msgstr ""
+
+msgid "do not perform actions, just print output"
+msgstr ""
+
+msgid "specify ssh command to use"
+msgstr ""
+
+msgid "specify hg command to run on the remote side"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr ""
+
+msgid "exclude names matching the given patterns"
+msgstr ""
+
+msgid "use <text> as commit message"
+msgstr ""
+
+msgid "read commit message from <file>"
+msgstr ""
+
+msgid "record datecode as commit date"
+msgstr ""
+
+msgid "record the specified user as committer"
+msgstr ""
+
+msgid "display using template map file"
+msgstr ""
+
+msgid "display with template"
+msgstr ""
+
+msgid "do not show merges"
+msgstr ""
+
+msgid "treat all files as text"
+msgstr ""
+
+msgid "don't include dates in diff headers"
+msgstr ""
+
+msgid "show which function each change is in"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr ""
+
+msgid "ignore changes in the amount of white space"
+msgstr ""
+
+msgid "ignore changes whose lines are all blank"
+msgstr ""
+
+msgid "number of lines of context to show"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr ""
+
+msgid "[OPTION]... [FILE]..."
+msgstr ""
+
+msgid "annotate the specified revision"
+msgstr ""
+
+msgid "follow file copies and renames"
+msgstr ""
+
+msgid "list the author (long with -v)"
+msgstr ""
+
+msgid "list the date (short with -q)"
+msgstr ""
+
+msgid "list the revision number (default)"
+msgstr ""
+
+msgid "list the changeset"
+msgstr ""
+
+msgid "show line number at the first appearance"
+msgstr ""
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr ""
+
+msgid "do not pass files through decoders"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr "chemin préfixé aux fichiers de l'archive"
+
+msgid "revision to distribute"
+msgstr "révision à distribuer"
+
+msgid "type of distribution to create"
+msgstr "type de distribution à créer"
+
+msgid "[OPTION]... DEST"
+msgstr "[OPTION]... DEST"
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge"
+msgstr ""
+
+msgid "revision to backout"
+msgstr ""
+
+msgid "[OPTION]... [-r] REV"
+msgstr ""
+
+msgid "reset bisect state"
+msgstr "réinitialiser l'état de la recherche par dichotomie"
+
+msgid "mark changeset good"
+msgstr "marquer la révision comme \"bonne\""
+
+msgid "mark changeset bad"
+msgstr "marquer la révision comme \"mauvaise\""
+
+msgid "skip testing changeset"
+msgstr "ne pas considérer la révision"
+
+msgid "use command to check changeset state"
+msgstr "utiliser une commande pour tester l'état des révisions"
+
+msgid "do not update to target"
+msgstr "ne pas mettre à jour à la révision cible"
+
+msgid "[-gbsr] [-c CMD] [REV]"
+msgstr "[-gbsr] [-c CMD] [REV]"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr ""
+
+msgid "reset branch name to parent branch name"
+msgstr ""
+
+msgid "[-fC] [NAME]"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr ""
+
+msgid "show normal and closed branches"
+msgstr ""
+
+msgid "[-a]"
+msgstr ""
+
+msgid "run even when remote repository is unrelated"
+msgstr ""
+
+msgid "a changeset up to which you would like to bundle"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr ""
+
+msgid "print output to file with formatted name"
+msgstr ""
+
+msgid "print the given revision"
+msgstr ""
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr ""
+
+msgid "the clone will only contain a repository (no working copy)"
+msgstr ""
+
+msgid "a changeset you would like to have after cloning"
+msgstr ""
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr ""
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr ""
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+msgid "[COMMAND]"
+msgstr ""
+
+msgid "show the command options"
+msgstr ""
+
+msgid "[-o] CMD"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr ""
+
+msgid "[-e] DATE [RANGE]"
+msgstr ""
+
+msgid "FILE REV"
+msgstr ""
+
+msgid "[PATH]"
+msgstr ""
+
+msgid "FILE"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr ""
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr ""
+
+msgid "[OPTION]..."
+msgstr ""
+
+msgid "revision to check"
+msgstr ""
+
+msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr ""
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr ""
+
+msgid "print all revisions that match"
+msgstr ""
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+
+msgid "ignore case when matching"
+msgstr ""
+
+msgid "print only filenames and revisions that match"
+msgstr ""
+
+msgid "print matching line numbers"
+msgstr ""
+
+msgid "search in given revision range"
+msgstr ""
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr ""
+
+msgid "show only heads which are descendants of REV"
+msgstr ""
+
+msgid "show only the active branch heads from open branches"
+msgstr ""
+
+msgid "show normal and closed branch heads"
+msgstr ""
+
+msgid "[-r STARTREV] [REV]..."
+msgstr ""
+
+msgid "[TOPIC]"
+msgstr ""
+
+msgid "identify the specified revision"
+msgstr ""
+
+msgid "show local revision number"
+msgstr ""
+
+msgid "show global revision id"
+msgstr ""
+
+msgid "show branch"
+msgstr ""
+
+msgid "show tags"
+msgstr ""
+
+msgid "[-nibt] [-r REV] [SOURCE]"
+msgstr ""
+
+msgid "directory strip option for patch. This has the same meaning as the corresponding patch option"
+msgstr ""
+
+msgid "base path"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+
+msgid "don't commit, just update the working directory"
+msgstr ""
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr ""
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr ""
+
+msgid "show newest record first"
+msgstr ""
+
+msgid "file to store the bundles into"
+msgstr ""
+
+msgid "a specific revision up to which you would like to pull"
+msgstr ""
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr ""
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "search the repository as it stood at REV"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr ""
+
+msgid "print complete paths from the filesystem root"
+msgstr ""
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr ""
+
+msgid "show revisions matching date spec"
+msgstr ""
+
+msgid "show copied files"
+msgstr ""
+
+msgid "do case-insensitive search for a keyword"
+msgstr ""
+
+msgid "include revisions where files were removed"
+msgstr ""
+
+msgid "show only merges"
+msgstr ""
+
+msgid "revisions committed by user"
+msgstr ""
+
+msgid "show only changesets within the given named branch"
+msgstr ""
+
+msgid "do not display revision or any of its ancestors"
+msgstr ""
+
+msgid "[OPTION]... [FILE]"
+msgstr ""
+
+msgid "revision to display"
+msgstr ""
+
+msgid "[-r REV]"
+msgstr ""
+
+msgid "force a merge with outstanding changes"
+msgstr ""
+
+msgid "revision to merge"
+msgstr ""
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-f] [[-r] REV]"
+msgstr ""
+
+msgid "a specific revision up to which you would like to push"
+msgstr ""
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr ""
+
+msgid "show parents from the specified revision"
+msgstr ""
+
+msgid "[-r REV] [FILE]"
+msgstr ""
+
+msgid "[NAME]"
+msgstr ""
+
+msgid "update to new tip if changesets were pulled"
+msgstr ""
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr ""
+
+msgid "force push"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr ""
+
+msgid "remove (and delete) file even if added or modified"
+msgstr ""
+
+msgid "record a rename that has already occurred"
+msgstr ""
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr ""
+
+msgid "remerge all unresolved files"
+msgstr ""
+
+msgid "list state of files needing merge"
+msgstr ""
+
+msgid "mark files as resolved"
+msgstr ""
+
+msgid "unmark files as resolved"
+msgstr ""
+
+msgid "revert all changes when no arguments given"
+msgstr ""
+
+msgid "tipmost revision matching date"
+msgstr ""
+
+msgid "revision to revert to"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr ""
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr ""
+
+msgid "name of error log file to write to"
+msgstr ""
+
+msgid "port to listen on (default: 8000)"
+msgstr ""
+
+msgid "address to listen on (default: all interfaces)"
+msgstr ""
+
+msgid "prefix path to serve from (default: server root)"
+msgstr ""
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+
+msgid "name of the webdir config file (serve more than one repository)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr ""
+
+msgid "web templates to use"
+msgstr ""
+
+msgid "template style to use"
+msgstr ""
+
+msgid "use IPv6 in addition to IPv4"
+msgstr ""
+
+msgid "SSL certificate file"
+msgstr ""
+
+msgid "show untrusted configuration options"
+msgstr ""
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "show status of all files"
+msgstr ""
+
+msgid "show only modified files"
+msgstr ""
+
+msgid "show only added files"
+msgstr ""
+
+msgid "show only removed files"
+msgstr ""
+
+msgid "show only deleted (but tracked) files"
+msgstr ""
+
+msgid "show only files without changes"
+msgstr ""
+
+msgid "show only unknown (not tracked) files"
+msgstr ""
+
+msgid "show only ignored files"
+msgstr ""
+
+msgid "hide status prefix"
+msgstr ""
+
+msgid "show source of copied files"
+msgstr ""
+
+msgid "show difference from revision"
+msgstr ""
+
+msgid "replace existing tag"
+msgstr ""
+
+msgid "make the tag local"
+msgstr ""
+
+msgid "revision to tag"
+msgstr ""
+
+msgid "remove a tag"
+msgstr ""
+
+msgid "[-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr ""
+
+msgid "[-p]"
+msgstr ""
+
+msgid "update to new tip if changesets were unbundled"
+msgstr ""
+
+msgid "[-u] FILE..."
+msgstr ""
+
+msgid "overwrite locally modified files (no backup)"
+msgstr ""
+
+msgid "check for uncommitted changes"
+msgstr ""
+
+msgid "[-C] [-d DATE] [[-r] REV]"
+msgstr ""
+
+#, python-format
+msgid "config error at %s:%d: '%s'"
+msgstr "erreur de configuration à %s:%d : '%s'"
+
+msgid "not found in manifest"
+msgstr ""
+
+msgid "branch name not in UTF-8!"
+msgstr "le nom de la branche n'est pas en UTF-8 !"
+
+msgid "working directory state appears damaged!"
+msgstr ""
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr ""
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "not in dirstate: %s\n"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "character device"
+msgstr ""
+
+msgid "block device"
+msgstr ""
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr ""
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr ""
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "abandon : %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: la commande '%s' est ambiguë :\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "attendu trop longtemps le verrou détenu par %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "abandon : %s : %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "abandon : impossible de verrouiller %s : %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "abandon : %s !\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "abandon : %s"
+
+msgid " empty string\n"
+msgstr " chaîne vide\n"
+
+msgid "killed!\n"
+msgstr "tué !\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: commande inconnue : '%s'\n"
+
+#, python-format
+msgid "abort: could not import module %s!\n"
+msgstr "abandon : impossible d'importer le module %s !\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(avez-vous oublié de compiler les extensions ?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(votre installation de Python est-elle correcte ?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "abandon : erreur : %s\n"
+
+msgid "broken pipe\n"
+msgstr "relais brisé (pipe)\n"
+
+msgid "interrupted!\n"
+msgstr "interrompu !\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"relais brisé (pipe)\n"
+
+msgid "abort: out of memory\n"
+msgstr "abandon : plus de mémoire libre\n"
+
+msgid "** unknown exception encountered, details follow\n"
+msgstr "** exception inconnue rencontrée, détails ci-dessous\n"
+
+msgid "** report bug details to http://mercurial.selenic.com/bts/\n"
+msgstr "** veuillez signaler le problème en détails sur http://www.selenic.com/mercurial/bts\n"
+
+msgid "** or mercurial@selenic.com\n"
+msgstr "** ou mercurial@selenic.com\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial version %s, système de gestion de sources distribué\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Extensions chargées : %s\n"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "malformed --config option: %s"
+msgstr "option incorrecte pour --config : %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "l'extension '%s' redéfinit ces commandes : %s\n"
+
+msgid "Option --config may not be abbreviated!"
+msgstr "L'option --config ne peut être abrégée !"
+
+msgid "Option --cwd may not be abbreviated!"
+msgstr "L'option --cwd ne peut être abrégée !"
+
+msgid "Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!"
+msgstr "L'option -R doit être séparée des autres options (autrement dit -qR est invalide) et --repository ne peut être abrégé qu'en --repo !"
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "le dépôt '%s' n'est pas local"
+
+msgid "invalid arguments"
+msgstr "arguments invalides"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid "lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+#, python-format
+msgid "Inconsistent state, %s:%s is good and bad"
+msgstr "État incohérent, %s:%s est à la fois \"bon\" et \"mauvais\""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr "type inconnu pour dichotomie : %s"
+
+msgid "disabled extensions:"
+msgstr "extensions désactivées :"
+
+msgid "Date Formats"
+msgstr ""
+
+msgid "File Name Patterns"
+msgstr ""
+
+msgid "Environment Variables"
+msgstr ""
+
+msgid "Specifying Single Revisions"
+msgstr ""
+
+msgid "Specifying Multiple Revisions"
+msgstr ""
+
+msgid "Diff Formats"
+msgstr ""
+
+msgid "Template Usage"
+msgstr ""
+
+msgid "URL Paths"
+msgstr ""
+
+msgid "Using additional features"
+msgstr ""
+
+msgid "can only share local repositories"
+msgstr ""
+
+msgid "destination already exists"
+msgstr ""
+
+msgid "updating working directory\n"
+msgstr ""
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr ""
+
+msgid "src repository does not support revision lookup and so doesn't support clone by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "updating to branch %s\n"
+msgstr "comparaison avec %s\n"
+
+#, python-format
+msgid "%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon\n"
+msgstr ""
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr ""
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr ""
+
+msgid "IPv6 is not available on this system"
+msgstr ""
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr ""
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "connection ended unexpectedly"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr ""
+
+msgid "operation not supported over http"
+msgstr ""
+
+msgid "authorization failed"
+msgstr ""
+
+msgid "http error, possibly caused by proxy setting"
+msgstr ""
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr ""
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr ""
+
+msgid "look up remote revision"
+msgstr ""
+
+msgid "unexpected response:"
+msgstr ""
+
+msgid "look up remote changes"
+msgstr ""
+
+msgid "push failed (unexpected response):"
+msgstr ""
+
+#, python-format
+msgid "push failed: %s"
+msgstr ""
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr ""
+
+msgid "cannot create new http repository"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr ""
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s not found"
+msgstr ""
+
+#, python-format
+msgid "repository %s already exists"
+msgstr ""
+
+#, python-format
+msgid "requirement '%s' not supported"
+msgstr ""
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr ""
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr ""
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr ""
+
+msgid "journal already exists - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr ""
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+msgid "rolling back last transaction\n"
+msgstr ""
+
+#, python-format
+msgid "Named branch could not be reset, current branch still is: %s\n"
+msgstr ""
+
+msgid "no rollback information available\n"
+msgstr ""
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr ""
+
+#, python-format
+msgid "working directory of %s"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+
+msgid "file not found!"
+msgstr ""
+
+msgid "no match under directory!"
+msgstr ""
+
+msgid "file not tracked!"
+msgstr ""
+
+msgid "unresolved merge conflicts (see hg resolve)"
+msgstr ""
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr ""
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"%s: files over 10MB may cause memory and performance problems\n"
+"(use 'hg revert %s' to unadd the file)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added!\n"
+msgstr ""
+
+#, python-format
+msgid "%s still exists!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr ""
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr ""
+
+msgid "already have changeset "
+msgstr ""
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr ""
+
+msgid "Partial pull cannot be done because other repository doesn't support changegroupsubset."
+msgstr ""
+
+#, python-format
+msgid "abort: push creates new remote branch '%s'!\n"
+msgstr ""
+
+msgid "abort: push creates new remote heads!\n"
+msgstr ""
+
+msgid "(did you forget to merge? use push -f to force)\n"
+msgstr ""
+
+msgid "note: unsynced remote changes!\n"
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr ""
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr ""
+
+msgid "adding changesets\n"
+msgstr ""
+
+msgid "received changelog group is empty"
+msgstr ""
+
+msgid "adding manifests\n"
+msgstr ""
+
+msgid "adding file changes\n"
+msgstr ""
+
+msgid "received file revlog group is empty"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr ""
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr ""
+
+msgid "Unexpected response from remote server:"
+msgstr ""
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr ""
+
+msgid "the server sent an unknown error code"
+msgstr ""
+
+msgid "streaming all changes\n"
+msgstr ""
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr ""
+
+msgid "no [smtp]host in hgrc - cannot send mail"
+msgstr ""
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr ""
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr ""
+
+msgid "(using tls)\n"
+msgstr ""
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr ""
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr ""
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr ""
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr ""
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr ""
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid "untracked file in working directory differs from file in requested revision: '%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: detected divergent renames of %s to:\n"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr ""
+
+msgid "can't merge with ancestor"
+msgstr ""
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr ""
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr ""
+
+msgid "crosses branches (use 'hg merge' or 'hg update -C' to discard changes)"
+msgstr ""
+
+msgid "crosses branches (use 'hg merge' or 'hg update -C')"
+msgstr ""
+
+msgid "crosses named branches (use 'hg update -C' to discard changes)"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: unable to create destination directory"
+msgstr ""
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr ""
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr ""
+
+#, python-format
+msgid "unable to strip away %d dirs from %s"
+msgstr ""
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "malformed patch %s %s"
+msgstr ""
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr ""
+
+#, python-format
+msgid "Unsupported line endings type: %s"
+msgstr ""
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr ""
+
+#, python-format
+msgid "exited with status %d"
+msgstr ""
+
+#, python-format
+msgid "killed by signal %d"
+msgstr ""
+
+#, python-format
+msgid "saving bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr ""
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr ""
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr ""
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr ""
+
+msgid "unknown base"
+msgstr ""
+
+msgid "consistency error adding group"
+msgstr ""
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr ""
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "could not create remote repo"
+msgstr ""
+
+msgid "no suitable response from remote hg"
+msgstr ""
+
+msgid "remote: "
+msgstr ""
+
+#, python-format
+msgid "push refused: %s"
+msgstr ""
+
+msgid "unsynced changes"
+msgstr ""
+
+msgid "cannot lock static-http repository"
+msgstr ""
+
+msgid "cannot create new static-http repository"
+msgstr ""
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "pulling subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "pushing subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr ""
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid "unmatched quotes"
+msgstr ""
+
+#, python-format
+msgid "error expanding '%s%%%s'"
+msgstr ""
+
+#, python-format
+msgid "unknown filter '%s'"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr ""
+
+#, python-format
+msgid "template file %s: %s"
+msgstr ""
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr ""
+
+msgid "transaction abort!\n"
+msgstr ""
+
+msgid "rollback completed\n"
+msgstr ""
+
+msgid "rollback failed - please run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s.%s not a boolean ('%s')"
+msgstr ""
+
+msgid "enter a commit username:"
+msgstr ""
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr ""
+
+msgid "Please specify a username."
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr ""
+
+msgid "response expected"
+msgstr ""
+
+msgid "unrecognized response\n"
+msgstr ""
+
+msgid "password: "
+msgstr ""
+
+msgid "edit failed"
+msgstr ""
+
+msgid "http authorization required"
+msgstr ""
+
+msgid "http authorization required\n"
+msgstr ""
+
+#, python-format
+msgid "realm: %s\n"
+msgstr ""
+
+#, python-format
+msgid "user: %s\n"
+msgstr ""
+
+msgid "user:"
+msgstr ""
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr ""
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr ""
+
+#, python-format
+msgid "path %r is inside repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+msgid "Hardlinks not supported"
+msgstr ""
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid date: %r "
+msgstr ""
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr ""
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr ""
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr ""
+
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#, python-format
+msgid "%.2f GB"
+msgstr ""
+
+#, python-format
+msgid "%.0f MB"
+msgstr ""
+
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#, python-format
+msgid "%.2f MB"
+msgstr ""
+
+#, python-format
+msgid "%.0f KB"
+msgstr ""
+
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#, python-format
+msgid "%.2f KB"
+msgstr ""
+
+#, python-format
+msgid "%.0f bytes"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr ""
+
+msgid "interrupted"
+msgstr ""
+
+#, python-format
+msgid "empty or missing %s"
+msgstr ""
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr ""
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr ""
+
+#, python-format
+msgid " (expected %s)"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "checking parents of %s"
+msgstr ""
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr ""
+
+msgid "checking changesets\n"
+msgstr ""
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr ""
+
+msgid "checking manifests\n"
+msgstr ""
+
+#, python-format
+msgid "%s not in changesets"
+msgstr ""
+
+msgid "file without name in manifest"
+msgstr ""
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr ""
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr ""
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr ""
+
+msgid "in changeset but not in manifest"
+msgstr ""
+
+msgid "in manifest but not in changeset"
+msgstr ""
+
+msgid "checking files\n"
+msgstr ""
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr ""
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr ""
+
+msgid "missing revlog!"
+msgstr ""
+
+#, python-format
+msgid "%s not in manifests"
+msgstr ""
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr ""
+
+#, python-format
+msgid "unpacking %s"
+msgstr ""
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr ""
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr ""
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr ""
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr ""
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr ""
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr ""
+
+msgid "user name not available - set USERNAME environment variable"
+msgstr ""
diff --git a/i18n/hggettext b/i18n/hggettext
new file mode 100755
index 0000000..983459a
--- /dev/null
+++ b/i18n/hggettext
@@ -0,0 +1,137 @@
+#!/usr/bin/env python
+#
+# hggettext - carefully extract docstrings for Mercurial
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# The normalize function is taken from pygettext which is distributed
+# with Python under the Python License, which is GPL compatible.
+
+"""Extract docstrings from Mercurial commands.
+
+Compared to pygettext, this script knows about the cmdtable and table
+dictionaries used by Mercurial, and will only extract docstrings from
+functions mentioned therein.
+
+Use xgettext like normal to extract strings marked as translatable and
+join the message cataloges to get the final catalog.
+"""
+
+import os, sys, inspect
+
+
+def escape(s):
+ # The order is important, the backslash must be escaped first
+ # since the other replacements introduce new backslashes
+ # themselves.
+ s = s.replace('\\', '\\\\')
+ s = s.replace('\n', '\\n')
+ s = s.replace('\r', '\\r')
+ s = s.replace('\t', '\\t')
+ s = s.replace('"', '\\"')
+ return s
+
+
+def normalize(s):
+ # This converts the various Python string types into a format that
+ # is appropriate for .po files, namely much closer to C style.
+ lines = s.split('\n')
+ if len(lines) == 1:
+ s = '"' + escape(s) + '"'
+ else:
+ if not lines[-1]:
+ del lines[-1]
+ lines[-1] = lines[-1] + '\n'
+ lines = map(escape, lines)
+ lineterm = '\\n"\n"'
+ s = '""\n"' + lineterm.join(lines) + '"'
+ return s
+
+
+def poentry(path, lineno, s):
+ return ('#: %s:%d\n' % (path, lineno) +
+ 'msgid %s\n' % normalize(s) +
+ 'msgstr ""\n')
+
+
+def offset(src, doc, name, default):
+ """Compute offset or issue a warning on stdout."""
+ # Backslashes in doc appear doubled in src.
+ end = src.find(doc.replace('\\', '\\\\'))
+ if end == -1:
+ # This can happen if the docstring contains unnecessary escape
+ # sequences such as \" in a triple-quoted string. The problem
+ # is that \" is turned into " and so doc wont appear in src.
+ sys.stderr.write("warning: unknown offset in %s, assuming %d lines\n"
+ % (name, default))
+ return default
+ else:
+ return src.count('\n', 0, end)
+
+
+def importpath(path):
+ """Import a path like foo/bar/baz.py and return the baz module."""
+ if path.endswith('.py'):
+ path = path[:-3]
+ if path.endswith('/__init__'):
+ path = path[:-9]
+ path = path.replace('/', '.')
+ mod = __import__(path)
+ for comp in path.split('.')[1:]:
+ mod = getattr(mod, comp)
+ return mod
+
+
+def docstrings(path):
+ """Extract docstrings from path.
+
+ This respects the Mercurial cmdtable/table convention and will
+ only extract docstrings from functions mentioned in these tables.
+ """
+ mod = importpath(path)
+ if mod.__doc__:
+ src = open(path).read()
+ lineno = 1 + offset(src, mod.__doc__, path, 7)
+ print poentry(path, lineno, mod.__doc__)
+
+ functions = list(getattr(mod, 'i18nfunctions', []))
+ functions = [(f, True) for f in functions]
+
+ cmdtable = getattr(mod, 'cmdtable', {})
+ if not cmdtable:
+ # Maybe we are processing mercurial.commands?
+ cmdtable = getattr(mod, 'table', {})
+ functions.extend((c[0], False) for c in cmdtable.itervalues())
+
+ for func, rstrip in functions:
+ if func.__doc__:
+ src = inspect.getsource(func)
+ name = "%s.%s" % (path, func.__name__)
+ lineno = func.func_code.co_firstlineno
+ doc = func.__doc__
+ if rstrip:
+ doc = doc.rstrip()
+ lineno += offset(src, doc, name, 1)
+ print poentry(path, lineno, doc)
+
+
+def rawtext(path):
+ src = open(path).read()
+ print poentry(path, 1, src)
+
+
+if __name__ == "__main__":
+ # It is very important that we import the Mercurial modules from
+ # the source tree where hggettext is executed. Otherwise we might
+ # accidentally import and extract strings from a Mercurial
+ # installation mentioned in PYTHONPATH.
+ sys.path.insert(0, os.getcwd())
+ from mercurial import demandimport; demandimport.enable()
+ for path in sys.argv[1:]:
+ if path.endswith('.txt'):
+ rawtext(path)
+ else:
+ docstrings(path)
diff --git a/i18n/it.po b/i18n/it.po
new file mode 100644
index 0000000..ccad9e8
--- /dev/null
+++ b/i18n/it.po
@@ -0,0 +1,14232 @@
+# Italian translations for Mercurial
+# Traduzione italiana per Mercurial
+# Copyright (C) 2009 Matt Mackall and others
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2011-03-22 22:04+0100\n"
+"PO-Revision-Date: 2011-03-15 17:05+0100\n"
+"Last-Translator: Stefano Tortarolo <stefano.tortarolo@gmail.com>\n"
+"Language-Team: Italian <Italian>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (default: %s)"
+
+msgid "Options"
+msgstr "Opzioni"
+
+msgid "Commands"
+msgstr "Comandi"
+
+msgid "Extensions"
+msgstr "Estensioni"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Questa sezione contiene la guida per le estensioni che sono distribuite con "
+"Mercurial. Guide per altre estensioni sono disponibili nel sistema d'aiuto."
+
+msgid "Options:"
+msgstr "Opzioni:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " alias: %s"
+
+msgid "hooks for controlling repository access"
+msgstr "hook per controllare l'accesso al repository"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"Questo hook rende possibile consentire o negare l'accesso in scrittura\n"
+"a specifiche branch o percorsi di un repository durante la ricezione di\n"
+"changeset in ingresso tramite pretxnchangegroup and pretxncommit."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"L'autorizzazione è verificata sulla base del nome dell'utente locale\n"
+"del sistema dove l'hook viene eseguito, e non l'autore del commit\n"
+"originario (dal momento che quest'ultimo ha mero scopo informativo)."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"L'hook acl è usato meglio con una shell ristretta come hgsh,\n"
+"prevenendo utenti autenticati dal fare altro di push o pull.\n"
+"L'hook non è sicuro da usare se gli utenti hanno accesso a\n"
+"shell interattive, dal momento che possono disattivare l'hook.\n"
+"Allo stesso modo non è sicuro se utenti remoti condividono\n"
+"l'account, poichè allora non c'è modo di distinguerli."
+
+msgid "The order in which access checks are performed is:"
+msgstr "L'ordine in cui le verifiche di accesso vengono eseguite è:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+
+msgid ""
+"Branch-based Access Control\n"
+"..........................."
+msgstr ""
+"Controllo degli accessi basato su branch\n"
+"..........................."
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- il nome di un branch, oppure\n"
+"- un asterisco, per comprendere ogni branch;"
+
+msgid "The corresponding values can be either:"
+msgstr "I valori corrispondenti possono essere:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+
+msgid ""
+"Path-based Access Control\n"
+"........................."
+msgstr ""
+"Controllo degli accessi basato su percorso\n"
+"........................."
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+
+msgid ""
+"Groups\n"
+"......"
+msgstr ""
+"Gruppi\n"
+"......"
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+
+msgid ""
+"Example Configuration\n"
+"....................."
+msgstr ""
+"Configurazione d'esempio\n"
+"....................."
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+" # Ad ognuno è vietato l'accesso alla branch congelata:\n"
+" frozen-branch = *"
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+
+msgid ""
+" # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
+" # access to any file under the \"resources\" folder (except for 1\n"
+" # file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "il gruppo '%s' non è definito"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"errore di configurazione - l'hook di tipo \"%s\" non può fermare né i "
+"changesetné i commit in entrata"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: accesso negato per l'utente \"%s\" per il branch \"%s\" (changeset \"%s"
+"\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: accesso non permesso per l'utente \"%s\" per il branch \"%s"
+"\" (changeset \"%s\")"
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr "acl: accesso negato per il changeset %s"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr "hook per l'integrazione con il bug tracker Bugzilla"
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The hook does not change\n"
+"bug status."
+msgstr ""
+"Questa estensione hook aggiunge commenti a bug in Bugzilla quando vengono\n"
+"rilevati changeset che fanno riferimento a bug per ID Bugzilla. L'hook non\n"
+"cambia lo status del bug."
+
+msgid ""
+"The hook updates the Bugzilla database directly. Only Bugzilla\n"
+"installations using MySQL are supported."
+msgstr ""
+"L'hook aggiorna direttamente il database Bugzilla. Sono supportate\n"
+"solo installazioni di Bugzilla che usano MySQL."
+
+msgid ""
+"The hook relies on a Bugzilla script to send bug change notification\n"
+"emails. That script changes between Bugzilla versions; the\n"
+"'processmail' script used prior to 2.18 is replaced in 2.18 and\n"
+"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n"
+"be run by Mercurial as the user pushing the change; you will need to\n"
+"ensure the Bugzilla install file permissions are set appropriately."
+msgstr ""
+
+msgid ""
+"The extension is configured through three different configuration\n"
+"sections. These keys are recognized in the [bugzilla] section:"
+msgstr ""
+
+msgid ""
+"host\n"
+" Hostname of the MySQL server holding the Bugzilla database."
+msgstr ""
+
+msgid ""
+"db\n"
+" Name of the Bugzilla database in MySQL. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"user\n"
+" Username to use to access MySQL server. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"version\n"
+" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n"
+" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n"
+" to 2.18."
+msgstr ""
+
+msgid ""
+"bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" '/var/www/html/bugzilla'."
+msgstr ""
+
+msgid ""
+"notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n"
+" and 'user' (committer bugzilla email). Default depends on version;\n"
+" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n"
+" %(id)s %(user)s\"."
+msgstr ""
+
+msgid ""
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies::"
+msgstr ""
+
+msgid ""
+" {bug} The Bugzilla bug ID.\n"
+" {root} The full pathname of the Mercurial repository.\n"
+" {webroot} Stripped pathname of the Mercurial repository.\n"
+" {hgweb} Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'"
+msgstr ""
+
+msgid ""
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0."
+msgstr ""
+
+msgid ""
+"usermap\n"
+" Path of file containing Mercurial committer ID to Bugzilla user ID\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section."
+msgstr ""
+
+msgid ""
+"The [usermap] section is used to specify mappings of Mercurial\n"
+"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n"
+"\"committer\"=\"Bugzilla user\""
+msgstr ""
+
+msgid "Finally, the [web] section supports one entry:"
+msgstr ""
+
+msgid ""
+"baseurl\n"
+" Base URL for browsing Mercurial repositories. Reference from\n"
+" templates as {hgweb}."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr "Attivazione dell'estensione::"
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+" [hooks]\n"
+" # esegue l'hook bugzilla ad ogni modifica a seguito di pull o push qui\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+
+msgid "Example configuration:"
+msgstr "Configurazione di esempio:"
+
+msgid ""
+"This example configuration is for a collection of Mercurial\n"
+"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n"
+"installation in /opt/bugzilla-3.2. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+
+msgid "Commits add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "sto connettendomi a %s:%s come %s, password %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "query: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "query fallita: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "schema del database sconosciuto"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "il bug %d è già a conoscenza del changeset %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "sto dicendo a bugzilla di inviare la mail:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " bug %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "sto eseguendo il comando di notifica %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "comando di notifica di bugzilla %s"
+
+msgid "done\n"
+msgstr "fatto\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "ricercando l'utente %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "impossibile trovare nome utente bugzilla per %s"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "impossibile trovare nome utente bugzilla per %s o %s"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "versione di bugzilla %s non supportata"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"changeset {node|short} nel repository {root} si riferisce al bug {bug}.\n"
+"dettagli:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "il supporto per python per mysql non è disponibile: %s"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "database error: %s"
+msgstr "errore del database: %s"
+
+msgid "command to display child changesets"
+msgstr "comando per mostrare i changeset figli"
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+"mostra i figli della revisione data o di quella della directory di lavoro"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" Stampa le revisioni figlie della directory di lavoro. Se una\n"
+" revisione è data tramite --rev, verranno stampati i figli di\n"
+" quella revisione. Se viene fornito un file come argomento,\n"
+" verrà stampata l'ultima revisione in cui il file è stato\n"
+" modificato (dopo la revisione della directory di lavoro\n"
+" o dell'argomento di --rev se fornito).\n"
+" "
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr "mostra i figli della revisione specificata"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg·children·[-r·REV]·[FILE]"
+
+msgid "command to display statistics about repository history"
+msgstr "comando per mostrare statistiche sulla storia del repository"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr "La revisione %d è un merge, ignoro...\n"
+
+msgid "analyzing"
+msgstr "sto effettuando l'analisi"
+
+msgid "histogram of changes to the repository"
+msgstr "istogramma delle modifiche al repository"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr " Esempi::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> = <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "sto saltando un alias malformato: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "misura velocità per le revisioni o il range specificati"
+
+msgid "DATE"
+msgstr "DATA"
+
+msgid "count rate for revisions matching date spec"
+msgstr "misura velocità per le revisioni che corrispondono ad una data fornita"
+
+msgid "TEMPLATE"
+msgstr "TEMPLATE"
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "FORMAT"
+msgstr "FORMATO"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr "misura velocità dal numero di changeset"
+
+msgid "sort by key (default: sort by count)"
+msgstr "ordina per chiave (default: ordina per conteggio)"
+
+msgid "display added/removed lines separately"
+msgstr ""
+
+msgid "FILE"
+msgstr "FILE"
+
+msgid "file with email aliases"
+msgstr "file con alias email"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATA] [-r REV] [--aliases FILE] [FILE]"
+
+msgid "colorize output from some commands"
+msgstr ""
+
+msgid ""
+"This extension modifies the status and resolve commands to add color to "
+"their\n"
+"output to reflect file status, the qseries command to add color to reflect\n"
+"patch status (applied, unapplied, missing), and to diff-related\n"
+"commands to highlight additions, removals, diff headers, and trailing\n"
+"whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. Effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+
+msgid ""
+"The color extension will try to detect whether to use ANSI codes or\n"
+"Win32 console APIs, unless it is made explicit::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" mode = ansi"
+msgstr ""
+
+msgid "Any value other than 'ansi', 'win32', or 'auto' will disable color."
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr ""
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr ""
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr "quando colorare (booleano, sempre, auto o mai)"
+
+msgid "TYPE"
+msgstr "TIPO"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr "importa revisioni da repository di altri VCS in Mercurial"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+
+msgid " source author = destination author"
+msgstr " autore sorgente = autore destinatario"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr " Linee vuote e linee che iniziano con un ``#`` vengono ignorate."
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+
+msgid " include path/to/file-or-dir"
+msgstr " include percorso/al/file-o-dir"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " esclude percorso/al/file-o-dir"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rinomina percorso/sorgente percorso/destinazione"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+
+msgid " key parent1, parent2"
+msgstr ""
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+
+msgid " original_branch_name new_branch_name"
+msgstr ""
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ''''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes and boolean argument\n"
+" and defaults to False."
+msgstr ""
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ''''''''''"
+msgstr ""
+" Sorgente CVS\n"
+" ''''''''''"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The following options can be used with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" '''''''''''''''''"
+msgstr ""
+" Subversion Sorgente\n"
+" '''''''''''''''''"
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid " The following options can be set with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" '''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" '''''''''''''''''''''"
+msgstr ""
+" Mercurial di Destinazione\n"
+" '''''''''''''''''''''"
+
+msgid " The following options are supported:"
+msgstr " Sono supportate le opzioni seguenti:"
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+
+msgid "source repository type"
+msgstr "tipo del repository sorgente"
+
+msgid "destination repository type"
+msgstr "tipo di repository di destinazione"
+
+msgid "import up to target revision REV"
+msgstr "importa fino alla revisione target REV"
+
+msgid "remap usernames using this file"
+msgstr "rimappa i nomi utente usando questo file"
+
+msgid "remap file names using contents of file"
+msgstr "rimappa i nomi dei file usando il contenuto del file"
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr "modifica i nomi dei branch durante la conversione"
+
+msgid "try to sort changesets by branches"
+msgstr "prova ad ordinare i changeset per branch"
+
+msgid "try to sort changesets by date"
+msgstr "prova ad ordinare i changeset per data"
+
+msgid "preserve source changesets order"
+msgstr "preserva l'ordine dei changeset nella sorgente"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [OPZIONE]... SORGENTE [DEST [REVMAP]]"
+
+msgid "only return changes on specified branches"
+msgstr "restituisce solo le modifiche relative alle branch specificate"
+
+msgid "prefix to remove from file names"
+msgstr "prefisso da rimuovere dai nomi dei file"
+
+msgid "only return changes after or between specified tags"
+msgstr "restituisce solo le modifiche dopo o tra le tag specificate"
+
+msgid "update cvs log cache"
+msgstr "aggiorna la cache dei log di cvs"
+
+msgid "create new cvs log cache"
+msgstr "crea una nuova cache dei log cvs"
+
+msgid "set commit time fuzz in seconds"
+msgstr "imposta il lasso temporale del commit in secondi"
+
+msgid "specify cvsroot"
+msgstr "specifica la cvsroot"
+
+msgid "show parent changesets"
+msgstr "mostra i changeset genitori"
+
+msgid "show current changeset in ancestor branches"
+msgstr "mostra il changeset corrente nei rami degli antenati"
+
+msgid "ignored for compatibility"
+msgstr "ignorato per compatibilità"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [OPZIONE]... [PERCORSO]..."
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s non sembra essere un repository Bazaar"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Non è stato possibile caricare i moduli Bazaar"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr "%s non è una revisione valida nella branch corrente"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s non è più disponibile in %s"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "impossibile trovare il tool richiesto \"%s\""
+
+#, python-format
+msgid "%s error:\n"
+msgstr "%s errore:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "impossibile aprire il file di associazione %r: %s"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: tipo del repository sorgente non valido"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: repository mancante o non supportato"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: tipo di repository di destinazione non valido"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: tipo di repository sconosciuto"
+
+msgid "getting files"
+msgstr "prelievo dei file"
+
+msgid "revisions"
+msgstr "revisioni"
+
+msgid "scanning"
+msgstr "scansione in corso"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "modalità di ordinamento sconosciuta: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "ciclo rilevato tra %s e %s"
+
+msgid "not all revisions were sorted"
+msgstr "non tutte le revisioni erano ordinate"
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr "Scrivo il file di associazione degli autori %s\n"
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr "Ignoro riga non valida nel file di associazione degli autori %s: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "sto associando l'autore %s a %s\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "rimpiazzo l'associazione per l'autore %s, era %s, sarà %s\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "inserito %s come genitore di %s\n"
+
+msgid "scanning source...\n"
+msgstr "sto effettuando la scansione della sorgente...\n"
+
+msgid "sorting...\n"
+msgstr "sto ordinando...\n"
+
+msgid "converting...\n"
+msgstr "sto effettuando la conversione...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "sorgente: %s\n"
+
+msgid "converting"
+msgstr "conversione in corso"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "assumo destinazione %s\n"
+
+msgid "more than one sort mode specified"
+msgstr "più di una modalità di ordinamento specificata"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s non sembra essere un repository CVS"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr "la revisione %s non è un numero di patchset"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "sto connettendomi a %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "autenticazione pserver CVS fallita"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "%d byte mancanti dal file remoto"
+
+msgid "malformed response from CVS"
+msgstr "risposta malformata da CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "server cvs: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "risposta CVS sconosciuta: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "sto collezionando gli rlog CVS\n"
+
+msgid "not a CVS sandbox"
+msgstr "non è una sandbox CVS"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "sto leggendo la cache dei log cvs %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "la cache ha %d voci di log\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "errore durante la lettura della cache: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "sto eseguendo %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "Il file RCS deve essere seguito da un file funzionante"
+
+msgid "must have at least some revisions"
+msgstr "è necessario avere almeno alcune revisioni"
+
+msgid "expected revision number"
+msgstr "numero di revisione atteso"
+
+msgid "revision must be followed by date line"
+msgstr "la revisione deve essere seguita da una riga con la data"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "sto scrivendo la cache dei log cvs %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d voci di log\n"
+
+msgid "creating changesets\n"
+msgstr "sto creando i changeset\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "changeset sintetici non possono avere genitori multipli"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d voci di changeset\n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s non sembra essere un repository darcs"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr ""
+
+msgid "Python ElementTree module is not available"
+msgstr "il modulo Python ElementTree non è disponibile"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr ""
+
+msgid "failed to detect repository format!"
+msgstr "impossibile rilevare il formato del repository!"
+
+msgid "internal calling inconsistency"
+msgstr "inconsistenza nella chiamata interna"
+
+msgid "errors in filemap"
+msgstr "errori nel filemap"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r esiste già nell'elenco %s\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: direttiva sconosciuta %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "il repository sorgente non supporta --filemap"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s non sembra essere un repository Git"
+
+msgid "cannot retrieve git heads"
+msgstr "impossibile reperire le head git"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr ""
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "impossibile leggere le modifiche in %s"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "impossibile leggere le tag da %s"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s non sembra essere un repository GNU Arch"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "impossibile trovare un tool GNU Arch"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "sto analizzando la versione dell'albero %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+"analisi dell'albero interrotta in quanto punta ad un archivio non\n"
+" registrato %s...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s non è un repository locale Mercurial"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "sto inizializzando il repository destinatario %s\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "impossibile creare il repository hg %s come destinazione"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "sto effettuando il pull da %s a %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "salto revisione vuota\n"
+
+msgid "updating tags\n"
+msgstr "sto aggiornando le tag\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s non è una revisione iniziale valida"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "sto ignorando: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s non sembra essere un repository monotone"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s non sembra essere un repository P4"
+
+msgid "reading p4 views\n"
+msgstr "sto leggendo le viste p4\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "sto raccogliendo le changelist p4\n"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s non sembra essere un repository Subversion"
+
+msgid "Could not load Subversion python bindings"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+"Trovati binding python per Subversion %d.%d, richiesti 1.4 o successivi"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+"I binding python per Subversion sono troppo vecchi, richiesti 1.4 o "
+"successivi"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: la revisione %s non è un intero"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: la revisione iniziale %s non è un intero"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "nessuna revisione trovata nel modulo %s"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "mi aspettavo di trovare %s in %r, ma non esiste"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "trovato %s in %r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "ignoro branch vuota %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "trovata branch %s in %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: con più di una branch non è supportata una revisione iniziale"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: nessuna revisione trovata dopo la revisione iniziale %d"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "%s non trovato fino alla revisione %d"
+
+msgid "scanning paths"
+msgstr "scansione percorsi"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "trovato genitore della branch %s in %d: %s\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: la branch non ha nessuna revisione %s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "inizializzo il repository svn %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "inizializzo working copy svn %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "output svn inatteso:\n"
+
+msgid "unable to cope with svn output"
+msgstr "non sono in grado di gestire l'output di svn"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr ""
+
+msgid "automatically manage newlines in repository files"
+msgstr ""
+"gestisci automaticamente i fine linea nei file contenuti nel repository"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr ""
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+
+msgid ""
+"The extension uses an optional ``[eol]`` section in your hgrc file\n"
+"(not the ``.hgeol`` file) for settings that control the overall\n"
+"behavior. There are two settings:"
+msgstr ""
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.hook``. The hook will\n"
+"lookup the expected line endings from the ``.hgeol`` file, which means\n"
+"you must migrate to a ``.hgeol`` file first before using the hook.\n"
+"Remember to enable the eol extension in the repository where you\n"
+"install the hook."
+msgstr ""
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "%s should not have CRLF line endings"
+msgstr " %s in %s non dovrebbe avere %s fine riga"
+
+#, fuzzy, python-format
+msgid "%s should not have LF line endings"
+msgstr " %s in %s non dovrebbe avere %s fine riga"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr ""
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "ignoro stile di EOL '%s' da %s\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "stile di nuova riga inconsistente in %s\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # aggiunge un nuovo chiamato vdiff, esegue kdiff3\n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $parent is an alias for $parent1."
+msgstr ""
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+"L'estensione extdiff guarderà nelle tue sezioni [diff-tools] e [merge-"
+"tools]\n"
+"per gli argomenti dello strumento di diff, quando non si specifica nulla\n"
+"in [extdiff]."
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "impossibile specificare sia --rev sia --change"
+
+msgid "cleaning up temp directory\n"
+msgstr "sto ripulendo la directory temporanea\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+"usa un programma esterno per fare il diff di repository (o di file "
+"selezionati)"
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "CMD"
+msgstr "CMD"
+
+msgid "comparison program to run"
+msgstr "programma per i confronti da eseguire"
+
+msgid "OPT"
+msgstr "OPZIONE"
+
+msgid "pass option to comparison program"
+msgstr "passa l'opzione al programma per i confronti"
+
+msgid "revision"
+msgstr "revisione"
+
+msgid "change made by revision"
+msgstr "modifica effettuata dalla revisione"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [OPZIONE]... [FILE]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+"usa %(path)s per creare una diff tra repository (o tra i file selezionati)"
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+" Mostra differenze tra revisioni per i file specificati, usando\n"
+" il programma %(path)s."
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [OPZIONE]... [FILE]..."
+
+msgid "pull, update and merge in one command"
+msgstr "pull, update e merge in un comando"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+"effettua il pull delle modifiche da un repository remoto, effettua il merge "
+"delle nuove modifiche se necessario."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" Questo trova tutte le modifiche dal repository al percorso o URL "
+"specificato\n"
+" e le aggiunge al repository locale."
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+" Se le modifiche ottenute aggiungono una nuova head di branch, il merge "
+"di questa viene effettuato\n"
+" automaticamente e si effettua il commit del merge. Altrimenti, la\n"
+" directory di lavoro viene aggiornata per includere le nuove modifiche."
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+" Quando si verifica un merge, si assume che le modifiche appena ottenute "
+"siano\n"
+" \"autoritarie\". La head delle nuove modifiche è usata come primo\n"
+" genitore, con le modifiche locali come secondo. Per invertire l'ordine\n"
+" di merge, usare --switch-parent."
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Vedere :hg:`help dates` per l'elenco dei formati validi per -d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Restituisce 0 in caso di successo.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"directory di lavoro non al tip della branch (usa \"hg update\" per\n"
+" fare il check out della tip della branch)"
+
+msgid "outstanding uncommitted merge"
+msgstr "c'è un merge in sospeso di cui non si è effettuato il commit"
+
+msgid "outstanding uncommitted changes"
+msgstr "ci sono modifiche in sospeso di cui non si è effettuato il commit"
+
+msgid "working directory is missing some files"
+msgstr "alla directory di lavoro mancano alcuni file"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"head multiple in questa branch (usa \"hg heads .\" e \"hg merge\"\n"
+" per fare il merge"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "sto facendo pull da %s\n"
+
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"L'altro repository non supporta la ricerca di revisioni, quindi una "
+"revisione non può essere specificata."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "sto aggiornando a %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "sto facendo il merge con %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+"il nuovo changeset %d:%s fa il merge delle modifiche remote con quelle "
+"locali\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "una specifica revisione di cui si desidera fare il pull"
+
+msgid "edit commit message"
+msgstr "modifica il messaggio di commit"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "modifica il messaggio di commit (DEPRECATO)"
+
+msgid "switch parents when merging"
+msgstr "inverte i genitori durante il merge"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [SORGENTE]"
+
+msgid "commands to sign and verify changesets"
+msgstr "comandi per firmare e verificare changeset"
+
+msgid "error while verifying signature"
+msgstr "errore durante la verifica della firma"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s Firma non valida da \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Nota: La firma è scaduta (firmato da: \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Nota: Questa chiave è scaduta (firmato da: \"%s\")\n"
+
+msgid "list signed changesets"
+msgstr "elenca i changeset firmati"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "il nodo %s:%d non esiste\n"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+"verifica tutte le firme che potrebbero esistere per una particolare revisione"
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr "Nessuna firma valida per %s\n"
+
+msgid "add a signature for the current or given revision"
+msgstr "aggiunge una firma per la revisione corrente o data"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Se nessuna revisione è stata specificata, viene usato il genitore\n"
+" della directory di lavoro, oppure tip se non si è eseguito il\n"
+" checkout di nessuna revisione."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Vedere :hg:`help dates` per un elenco dei formati validi per -d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+"merge di cui non si è effettuato il commit - si prega di fornire una "
+"revisione specifica"
+
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr "Firma in corso di %d:%s\n"
+
+msgid "error while signing"
+msgstr "errore durante la firma"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"la copia di lavoro di .hgsigs è cambiata (si prega di fare il commit "
+"manualmente di .hgsigs o usare --force)"
+
+msgid "unknown signature version"
+msgstr "versione della firma sconosciuta"
+
+msgid "make the signature local"
+msgstr "rende la firma locale"
+
+msgid "sign even if the sigfile is modified"
+msgstr "firma anche se il sigfile è stato modificato"
+
+msgid "do not commit the sigfile after signing"
+msgstr "non effettuare il commit del sigfile dopo la firma"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "l'id della chiave con cui firmare"
+
+msgid "TEXT"
+msgstr "TESTO"
+
+msgid "commit message"
+msgstr "messaggio di commit"
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr "hg sign [OPZIONE]... [REVISIONE]..."
+
+msgid "hg sigcheck REVISION"
+msgstr "hg sigcheck REVISIONE"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "command to view revision graphs from a shell"
+msgstr "comando per visualizzare grafi di revisioni da una shell"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "--graph option is incompatible with --%s"
+msgstr "l'opzione --graph è incompatibile con --%s"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr ""
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+
+msgid "--graph option allows at most one file"
+msgstr "l'opzione --graph consente al massimo un file"
+
+msgid "show the revision DAG"
+msgstr "mostra il DAG delle revisioni"
+
+msgid "NUM"
+msgstr "NUM"
+
+msgid "limit number of changes displayed"
+msgstr "limita il numero di modifiche mostrate"
+
+msgid "show patch"
+msgstr "mostra patch"
+
+msgid "show the specified revision or range"
+msgstr "mostra la revisione specificata o un range"
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr "hg glog [OPZIONE]... [FILE]"
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s ha restituito un errore: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: sto inviando l'aggiornamento a %s\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "email.from deve essere definito quando si mandano mail"
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/posizione/di/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr "mostra le differenze tra alberi di due commit"
+
+msgid "output common ancestor information"
+msgstr "stampa in output informazioni sull'antenato comune"
+
+msgid "cat a specific revision"
+msgstr "stampa a video una specifica revisione"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: tipo o revisione non forniti\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr "parsifica le revisioni date"
+
+msgid "print revisions"
+msgstr "stampa revisioni"
+
+msgid "print extension options"
+msgstr "stampa le opzioni dell'estensione"
+
+msgid "start interactive history viewer"
+msgstr "avvia visualizzatore interattivo della storia"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l LIMITE] [INTERVALLOREV]"
+
+msgid "generate patch"
+msgstr "genera patch"
+
+msgid "recursive"
+msgstr "ricorsivo"
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr "stdin"
+
+msgid "detect copies"
+msgstr "rileva copie"
+
+msgid "search"
+msgstr "ricerca"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [OPZIONE]... NODO1 NODO2 [FILE]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [OPZIONE]... TIPO FILE"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr "ignorato"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse REV"
+
+msgid "header"
+msgstr "intestazione"
+
+msgid "topo-order"
+msgstr "ordine topologico"
+
+msgid "parents"
+msgstr "genitori"
+
+msgid "max-count"
+msgstr "conto massimo"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [OPZIONE]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr "Il default è 'colorful'.\n"
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr "avvia un server inotify per questo repository"
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr "directory sotto osservazione:\n"
+
+msgid "run server in background"
+msgstr "avvia il server in background"
+
+msgid "used internally by daemon mode"
+msgstr "usato internamente dalla modalità demone"
+
+msgid "minutes to sit idle before exiting"
+msgstr "minuti per cui stare in attesa prima di uscire"
+
+msgid "name of file to write process ID to"
+msgstr "nome del file in cui scrivere l'ID del processo"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [OPZIONI]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr "inotify-client: trovato socket morto del server inotify; lo rimuovo\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-client: mpossibile avviare il server inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+"inotify-client: impossibile comunicare con il nuovo server inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-client: non sono riuscito a contattare il server inotify: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-client: ricevuta risposta vuota dal server inotify"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr "(inotify: ricevuta risposta dalla versione incompatibile %d)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: ricevuta risposta '%s' mentre era attesa '%s')\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "questo sistema sembra non supportare inotify"
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr "*** sto contando le directory: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "trovato %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+"impossibile controllare %s finchè il limite di controlli di inotify non "
+"verrà aumentato"
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "servizio inotify non disponibile: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "sto controllando %r\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "sto controllando le directory sotto %r\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "evento %s: creato %s\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "evento %s: cancellato %s\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "evento %s: modificato %s\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "il filesystem contenente %s era smontato\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s leggibile: %d byte\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr "setup terminato\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "status: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+msgid "cannot start: socket is already bound"
+msgstr ""
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "tipo di interrogazione non riconosciuto: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr "Esempio::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid "Three additional date template filters are provided::"
+msgstr ""
+
+msgid ""
+" utcdate \"2006/09/18 15:13:13\"\n"
+" svnutcdate \"2006-09-18 15:13:13Z\"\n"
+" svnisodate \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "sovrascrittura di %s durante l'espansione delle keyword\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" Vedere :hg:`help templates` per informazioni su template e filtri.\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "sto creando un repository temporaneo in %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default svn keywordset\n"
+msgstr "\tsto sovrascrivendo il set di keyword predefinito di svn\n"
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\tsto sovrascrivendo il set di keyword predefinito di cvs\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "hg keyword configuration and expansion example"
+msgstr "configurazione ed espansione d'esempio del keyword hg"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr "mostra i file configurati per l'espansione di keyword"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr "legge le mappe dall'rcfile"
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [OPZIONE]... [FILE]..."
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "only show unknown (not tracked) files"
+msgstr "mostra solo i file sconosciuti (non tracciati)"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [OPZIONE]... [FILE]..."
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [OPZIONE]... [FILE]..."
+
+msgid "manage a stack of patches"
+msgstr "gestisci una pila di patch"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Questa estensione ti permette di gestire una coda di patch per un "
+"repository\n"
+"Mercurial. Essa gestisce due pile di patch - tutte le patch note, e\n"
+"le patch applicate (un sottoinsieme delle patch note)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Le patch note sono rappresentate da file di patch nella directory\n"
+".hg/patches. Le patch applicate sono sia file di patch sia changeset."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Compiti comuni (usa :hg:`help comando` per maggior dettagli)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" crea una nuova patch qnew\n"
+" importa una patch esistente qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" stampa la serie di patch qseries\n"
+" stampa le patch applicate qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" aggiungi patch nota alla pila applicata qpush\n"
+" rimuovi patch dalla pila applicata qpop\n"
+" aggiorna i contenuti della patch applicata in cima qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"Di default, mq userà automaticamente patch in formato git quando necessario\n"
+"per evitare di perdere modifiche ai permessi dei file, registrazioni di\n"
+"copie, file binari o la creazione o cancellazione di file vuoti. Questo\n"
+"comportamento può essere configurato con::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"Se impostato a 'keep', mq seguirà la configurazione nella sezione\n"
+"[diff] nel mantenere il formato git o meno delle patch esistenti\n"
+"nell'eseguire il comando qrefresh. Se impostato a 'yes' o 'no', mq\n"
+"sovrascriverà la sezione [diff] e genererà sempre patch in formato git o\n"
+"normale, perdendo potenzialmente dati nel secondo caso."
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command.\n"
+msgstr ""
+"Di default, verrà gestita una coda di patch chiamata \"patches\".\n"
+"Se ne possono creare altre indipendenti, col comando :hg:`qqueue`.\n"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "l'opzione mg.git può valere auto/keep/yes/no, impostata a %s"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s compare più di una volta in %s"
+
+msgid "guard cannot be an empty string"
+msgstr "una guardia non può essere una stringa vuota"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "la guardia %r inizia con un carattere non valido: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "carattere non valido nella guardia %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "la guardia %r è troppo corta"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "la guardia %r inizia con un carattere non valido"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - guarded by %r\n"
+msgstr "sto saltando %s - controllato da %r\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "sto saltando %s - nessuna guardia corrispondente\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "applicazione della patch %s fallita"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "patch non ha funzionato, esecuzione del merge di %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "l'aggiornamento ha restituito %d"
+
+msgid "repo commit failed"
+msgstr "commit del repository fallito"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "impossibile leggere %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "la patch %s non esiste\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "la patch %s non è applicata\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "patch fallita, impossibile continuare (provare con -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "sto applicando %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "impossibile leggere %s\n"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "la patch %s è vuota\n"
+
+msgid "repository commit failed"
+msgstr "commit del repository fallito"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+"patch fallita, frammenti rifiutati lasciati nella directory di lavoro\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "trovato fuzz nell'applicare la patch, arresto\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "la revisione %d non è gestita"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "impossibile cancellare la revisione %d sopra patch applicate"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "patch %s finalizzata senza un messaggio di changeset\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr ""
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "impossibile rimuovere la patch applicata %s"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "la patch %s non è nel file series"
+
+msgid "no patches applied"
+msgstr "nessuna patch applicata"
+
+msgid "working directory revision is not qtip"
+msgstr "la revisione della directory di lavoro non è qtip"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "invertito commit delle modifiche nel subrepository %s"
+
+msgid "local changes found, refresh first"
+msgstr "trovate modifiche locali, effettuare prima un refresh"
+
+msgid "local changes found"
+msgstr "trovate modifiche locali"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" non può essere usato come nome di una patch"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" esiste già come directory"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "la patch \"%s\" esiste già"
+
+msgid "cannot manage merge changesets"
+msgstr "impossibile gestire un changeset di merge"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "impossibile scrivere la patch \"%s\": %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "errore nella cancellazione di %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "il nome della patch \"%s\" è ambiguo:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "la patch %s non è nel file series"
+
+msgid "(working directory not at a head)\n"
+msgstr "(la directory di lavoro non è a una head)\n"
+
+msgid "no patches in series\n"
+msgstr "nessuna patch nella serie\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s è già in cima\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "impossibile fare push fino a una patch precedente: %s"
+
+#, python-format
+msgid "guarded by %r"
+msgstr "controllato dalla guardia %r"
+
+msgid "no matching guards"
+msgstr "nessuna guardia corrispondente"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "impossibile fare push di '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "tutte le patch sono correntemente applicate\n"
+
+msgid "patch series already fully applied\n"
+msgstr "la serie di patch è già stata applicata completamente\n"
+
+msgid "cannot use --exact and --move together"
+msgstr ""
+
+msgid "cannot push --exact with applied patches"
+msgstr "impossibile fare un push --exact con patch applicate"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s non sembra avere un genitore registrato"
+
+msgid "please specify the patch to move"
+msgstr "si prega di specificare la patch da spostare"
+
+msgid "cleaning up working directory..."
+msgstr "sto pulendo la directory di lavoro..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr ""
+"errori durante l'applicazione, si prega di correggere e aggiornare %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "ora a: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "la patch %s non è applicata"
+
+msgid "no patches applied\n"
+msgstr "nessuna patch applicata\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s è già in cima\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: forzatura aggiornamento dirstate\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "tentativo rimozione dalla cima del nodo sconosciuto %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+"la rimozione dalla cima cancellerebbe una revisione non gestita da\n"
+"questa coda di patch"
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr "sto rimuovendo %s dalla cima\n"
+
+msgid "patch queue now empty\n"
+msgstr "coda di patch ora vuota\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "impossibile aggiornare una revisione con figli"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"aggiornamento patch interrotto mentre la patch veniva rimossa dalla\n"
+"cima! (revert --all, qpush per recuperare)\n"
+
+msgid "patch queue directory already exists"
+msgstr "la directory per la coda di patch esiste già"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "la patch %s non è nel file series"
+
+msgid "No saved patch data found\n"
+msgstr "Non è stata trovata nessuna modifica salvata\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "sto ripristinando lo stato: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "updating queue directory\n"
+msgstr "sto aggiornando la directory della coda\n"
+
+msgid "Unable to load queue repository\n"
+msgstr "Impossibile caricare il repository della coda\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr "lo status è già stato salvato\n"
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr "commit del repository fallito\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "la patch %s è già nel file series"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "l'opzione \"-r\" non è valida quando si importano file"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "l'opzione \"-n\" non è valida quando si importano patch multiple"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "la revisione %d ha figli non gestiti"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "impossibile importare la revisione di merge %d"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "la revisione %d non è il genitore di %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "-e è incompatibile con l'import da -"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "la patch %s non esiste"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "sto rinominando %s in %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr "necessario --name per importare una patch da -"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "impossibile leggere file %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "sto aggiungendo %s al file series\n"
+
+msgid "remove patches from queue"
+msgstr "rimuove patch dalla coda"
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+
+msgid "print the patches already applied"
+msgstr "stampa le patch già applicate"
+
+msgid " Returns 0 on success."
+msgstr " Restituisce 0 in caso di successo."
+
+msgid "only one patch applied\n"
+msgstr " stata applicata solo una patch\n"
+
+msgid "print the patches not yet applied"
+msgstr "stampa le patch non ancora applicate"
+
+msgid "all patches applied\n"
+msgstr "tutte le patch sono state applicate\n"
+
+msgid "import a patch"
+msgstr "importa una patch"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes."
+msgstr ""
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+
+msgid " To import an existing patch while renaming it::"
+msgstr " Per importare una patch esistente mentre la si rinomina::"
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr " hg qimport -e patch-esistente -n nuovo-nome"
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Restituisce 0 se l'import è terminato correttamente.\n"
+" "
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "inizializza un nuovo repository della coda (DEPRECATO)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" Il repository della coda, di default, non è sotto controllo di\n"
+" versione. Se viene specificato -c/--create-repo, qinit creerà un\n"
+" repository annidato separato per le patch (qinit -c potrebbe anche\n"
+" essere eseguito in seguito per convertire un repository non gestito in\n"
+" uno gestito).\n"
+" Si può usare qcommit per effettuare il commit delle modifiche in\n"
+" questo repository della coda."
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" Questo comando è deprecated. Senza -c, è implicito negli altri comandi\n"
+" relativi. Con -c, è stato rimpiazzato da :hg:`init --mq`."
+
+msgid "clone main and patch repository at same time"
+msgstr "clona assieme il repository principale e quello delle patch"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" Se la sorgente è locale, la destinazione non avrà patch applicate.\n"
+" Se la sorgente è remota, questo comando non può controllare\n"
+" se le patch sono applicate alla sorgente, quindi non può garantire\n"
+" che le patch non siano applicate alla destinazione. Se cloni un\n"
+" repository remoto, assicurati prima che non abbia patch applicate."
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Restituisce 0 in caso di successo.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr ""
+"repository delle patch sotto controllo di versione non trovato (vedere init "
+"--mq)"
+
+msgid "cloning main repository\n"
+msgstr "clonazione del repository principale\n"
+
+msgid "cloning patch repository\n"
+msgstr "clonazione del repository delle patch\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "rimozione delle patch applicate dal repository di destinazione\n"
+
+msgid "updating destination repository\n"
+msgstr "aggiornamento del repository di destinazione\n"
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr ""
+"effettua il commit delle modifiche nel repository della coda (DEPRECATO)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr " Questo comando è deprecato; usa invece :hg:`commit --mq`."
+
+msgid "print the entire series file"
+msgstr "stampa l'intero file series"
+
+msgid "print the name of the current patch"
+msgstr "stampa il nome della patch corrente"
+
+msgid "print the name of the next patch"
+msgstr "stampa il nome della patch seguente"
+
+msgid "print the name of the previous patch"
+msgstr "stampa il nome della patch precedente"
+
+msgid "create a new patch"
+msgstr "crea una nuova patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew crea una nuova patch sopra alla patch correntemente applicata\n"
+" (se esiste). La patch verrà inizializzata con le eventuali modifiche\n"
+" pendenti nella directory di lavoro. È possibile anche usare\n"
+" -I/--include, -X/--exclude e/o una lista di file dopo il nome\n"
+" della patch, per aggiungere alla nuova patch solamente le modifiche a\n"
+" tali file, lasciando il resto come cambiamenti non salvati."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" -u/--user e -d/--date possono essere usati per impostare "
+"rispettivamente\n"
+" un dato utente e data.\n"
+" -U/--currentuser e -D/--currentdate impostano l'utente all'utente\n"
+" corrente e la data alla data corrente."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message o -l/--logfile impostano l'intestazione\n"
+" della patch così come il messaggio di commit. Se nulla è stato\n"
+" specificato, l'intestazione sarà vuota e il messaggio di commit\n"
+" '[mq]: PATCH'."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" Usa l'opzione -g/--git per mantenere la patch nel formato diff esteso\n"
+" git. Leggere le informazioni di aiuto sui diff per maggiori\n"
+" informazioni sul perché quest'opzione è importante per preservare\n"
+" modifiche di permessi e informazioni su copie/rinomine."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Restituisce 0 alla creazione con successo di una nuova patch.\n"
+" "
+
+msgid "update the current patch"
+msgstr "aggiorna la patch corrente"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "l'opzione \"-e\" è incompatibile con \"-m\" o \"-l\""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr ""
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+
+msgid "fold the named patches into the current patch"
+msgstr "ripiega le patch indicate in quella corrente"
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold richiede almeno un nome di patch"
+
+#, python-format
+msgid "Skipping already folded patch %s\n"
+msgstr "Salto patch già ripiegata %s\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "qfold non può ripiegare la patch già applicata %s"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "errore nel ripiegare la patch %s"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+"applica o rimuove delle patch finché la patch indicata si trova in cima alla "
+"pila"
+
+msgid "set or print guards for a patch"
+msgstr "imposta o stampa le guardie per una patch"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" Senza argomenti stampa le guardie attualmente attive.\n"
+" Con argomenti imposta le guardie per la patch selezionata.."
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr ""
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr "nessuna patch con cui lavorare"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "nessuna patch di nome %s"
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+msgid "push the next patch onto the stack"
+msgstr "applica la patch successiva in cima alla pila"
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost."
+msgstr ""
+
+msgid ""
+" Return 0 on succces.\n"
+" "
+msgstr ""
+" Restituisce 0 in caso di successo.\n"
+" "
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr ""
+
+msgid "pop the current patch off the stack"
+msgstr "toglie la patch corrente dalla pila"
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack."
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "uso la coda delle patch: %s\n"
+
+msgid "rename a patch"
+msgstr "rinomina una patch"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" Con un argomento rinomina la patch corrente in PATCH1.\n"
+" Con due argomenti rinomina PATCH1 in PATCH2."
+
+#, python-format
+msgid "%s already exists"
+msgstr "%s esiste già"
+
+#, python-format
+msgid "A patch named %s already exists in the series file"
+msgstr "Una patch chiamata %s esiste già nel file series"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr "ripristina lo stato della coda salvato da una revisione (DEPRECATO)"
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " Questo comando è deprecato, usare invece :hg:`rebase`"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr "salva lo stato corrente della coda (DEPRECATO)"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "la destinazione %s esiste e non è una directory"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "la destinazione %s esiste, usare -f per forzare l'operazione"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "copia %s a %s\n"
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "elimina le revisioni e tutti i loro discendenti dal repository"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes,\n"
+" the operation is aborted unless the --force flag is supplied."
+msgstr ""
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" Se una delle revisioni genitore della directory di lavoro\n"
+" viene rimossa, la directory di lavorò sarà aggiornata automaticamente,\n"
+" dopo il completamento dell'operazione, all'antenato più recente\n"
+" disponibile del genitore rimosso."
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+
+msgid "empty revision set"
+msgstr "insieme di revisioni vuoto"
+
+msgid "set or print guarded patches to push"
+msgstr "imposta o stampa le patch controllate da guardia"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr "guardie disattivate\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+"il numero di patch non applicate, senza guardia è cambiato da %d a %d\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+"il numero di patch applicate controllate da guardia è cambiato da %d a %d\n"
+
+msgid "guards in series file:\n"
+msgstr "guardie nel file series:\n"
+
+msgid "no guards in series file\n"
+msgstr "nessuna guardia nel file series\n"
+
+msgid "active guards:\n"
+msgstr "guardie attive:\n"
+
+msgid "no active guards\n"
+msgstr "nessuna guardia attiva\n"
+
+msgid "popping guarded patches\n"
+msgstr "sto disapplicando patch controllate da una guardia\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "sto riapplicando patch che non sono controllate da una guardia\n"
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+
+msgid "no revisions specified"
+msgstr "nessuna revisione specificata"
+
+msgid "manage multiple patch queues"
+msgstr ""
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\"."
+msgstr ""
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+
+msgid "patches applied - cannot set new queue active"
+msgstr ""
+
+msgid "cannot delete queue that does not exist"
+msgstr "impossibile cancellare una coda che non esiste"
+
+msgid "cannot delete currently active queue"
+msgstr "impossibile cancellare la coda correntemente attiva"
+
+msgid " (active)\n"
+msgstr " (attiva)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr ""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "la coda \"%s\" esiste già"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "impossibile rinominare \"%s\" nel suo nome corrente"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "la directory non per la coda \"%s\" esiste già"
+
+msgid "use --create to create a new queue"
+msgstr "usa --create per creare una nuova coda"
+
+msgid "cannot commit over an applied mq patch"
+msgstr "impossibile effettuare commit su una patch mq applicata"
+
+msgid "source has mq patches applied"
+msgstr "la sorgente ha patch mq applicate"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "il file dello stato di mq fa riferimento al nodo sconosciuto %s\n"
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr "La tag %s annulla una patch mq con lo stesso nome\n"
+
+msgid "cannot import over an applied patch"
+msgstr "impossibile importare sopra ad una patch applicata"
+
+msgid "only a local queue repository may be initialized"
+msgstr "solo un repository locale della coda può essere inizializzato"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "non esiste alcun repository Mercurial qui (.hg non trovata)"
+
+msgid "no queue repository"
+msgstr "nessun repository della coda"
+
+#, python-format
+msgid "%d applied"
+msgstr "%d applicate"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d non applicate"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (coda vuota)\n"
+
+msgid "operate on patch repository"
+msgstr "opera sul repository delle patch"
+
+msgid "print first line of patch header"
+msgstr "stampa la prima riga dell'intestazione della patch"
+
+msgid "show only the last patch"
+msgstr "mostra solo l'ultima patch"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr "usa il protocollo pull per copiare i metadati"
+
+msgid "do not update the new working directories"
+msgstr "non aggiornare le nuove directory di lavoro"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "usa trasferimento non compresso (veloce su LAN)"
+
+msgid "REPO"
+msgstr "REPO"
+
+msgid "location of source patch repository"
+msgstr "posizione del repository sorgente delle patch"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [OPZIONE]... SORGENTE [DEST]"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [OPZIONE]... [FILE]..."
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [OPZIONE]... [FILE]..."
+
+msgid "keep patch file"
+msgstr "mantieni il file della patch"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "smetti di gestire una revisione (DEPRECATO)"
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr ""
+
+msgid "edit patch header"
+msgstr "modifica l'intestazione della patch"
+
+msgid "keep folded patch files"
+msgstr "mantieni il file della patch ripiegata"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TESTO] [-l FILE] PATCH..."
+
+msgid "overwrite any local changes"
+msgstr "sovrascrivi ogni modifica locale"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [OPZIONE]... PATCH"
+
+msgid "list all patches and guards"
+msgstr "elenca tutte le patch e le guardie"
+
+msgid "drop all guards"
+msgstr "scarta tutte le guardie"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [PATCH] [-- [+GUARDIA]... [-GUARDIA]...]"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "import file in patch directory"
+msgstr "importa il file nella directory delle patch"
+
+msgid "NAME"
+msgstr "NOME"
+
+msgid "name of patch file"
+msgstr "nome del file della patch"
+
+msgid "overwrite existing files"
+msgstr "sovrascrive i file esistenti"
+
+msgid "place existing revisions under mq control"
+msgstr "metti le revisioni esistenti sotto il controllo di mq"
+
+msgid "use git extended diff format"
+msgstr "usa il formato diff git esteso"
+
+msgid "qpush after importing"
+msgstr "qpush dopo l'importazione "
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr "hg qimport [-e] [-n NOME] [-f] [-g] [-P] [-r REV]... FILE..."
+
+msgid "create queue repository"
+msgstr "crea il repository della coda"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "importa modifiche non registrate (DEPRECATO)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "aggiunge \"Da: <utente corrente>\" alla patch"
+
+msgid "USER"
+msgstr "UTENTE"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "aggiunge \"Da: <utente>\" alla patch"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "aggiunge \"Data: <data corrente>\" alla patch"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "aggiunge \"Data: <data>\" alla patch"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TESTO] [-l FILE] PATCH [FILE]..."
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "pop all patches"
+msgstr "disapplica tutte le patch"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "nome della coda da disapplicare (DEPRECATED)"
+
+msgid "forget any local changes to patched files"
+msgstr ""
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [PATCH | INDEX]"
+
+msgid "apply on top of local changes"
+msgstr "applica in cima alle modifiche locali"
+
+msgid "apply the target patch to its recorded parent"
+msgstr "applica la patch selezionata al suo genitore registrato"
+
+msgid "list patch name in commit text"
+msgstr "elenca il nome della patch nel testo di commit"
+
+msgid "apply all patches"
+msgstr "applica tutte le patch"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "effettua il merge da un'altra coda (DEPRECATO)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "effettua il merge del nome della coda (DEPRECATO)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr "riordina la serie di patch e applica solo la patch"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDICE]"
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "aggiorna solo file già nella patch e quelli specificati"
+
+msgid "add/update author field in patch with current user"
+msgstr "aggiunge/aggiorna il campo autore alla patch con l'utente corrente"
+
+msgid "add/update author field in patch with given user"
+msgstr "aggiunge/aggiorna il campo autore alla con l'utente fornito"
+
+msgid "add/update date field in patch with current date"
+msgstr "aggiunge/aggiorna il campo data alla patch con la data corrente"
+
+msgid "add/update date field in patch with given date"
+msgstr "aggiunge/aggiorna il campo data alla patch con la data fornita"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TESTO] [-l FILE] [-s] [FILE]..."
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename PATCH1 [PATCH2]"
+
+msgid "delete save entry"
+msgstr "elimina la voce salvata"
+
+msgid "update queue working directory"
+msgstr "aggiorna la directory di lavoro della coda"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] REV"
+
+msgid "copy patch directory"
+msgstr "copia la directory delle patch"
+
+msgid "copy directory name"
+msgstr "copia il nome della directory"
+
+msgid "clear queue status file"
+msgstr "pulisce il file di stato della coda"
+
+msgid "force copy"
+msgstr "forza la copia"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TESTO] [-l FILE] [-c] [-n NOME] [-e] [-f]"
+
+msgid "disable all guards"
+msgstr "disabilita tutte le guardie"
+
+msgid "list all guards in series file"
+msgstr "elenca tutte le guardie nel file series"
+
+msgid "pop to before first guarded applied patch"
+msgstr "disapplica fino alla prima patch applicata con guardia"
+
+msgid "pop, then reapply patches"
+msgstr "disapplica e poi riapplica le patch"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [OPZIONE]... [GUARDIA]..."
+
+msgid "print patches not in series"
+msgstr "stampa le patch non in series"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid ""
+"force removal of changesets even if the working directory has uncommitted "
+"changes"
+msgstr ""
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+
+msgid "no backups"
+msgstr "nessun backup"
+
+msgid "no backups (DEPRECATED)"
+msgstr "non effettuare backup (DEPRECATO)"
+
+msgid "do not modify working copy during strip"
+msgstr "non modificare la copia di lavoro durante l'operazione di strip"
+
+msgid "hg strip [-k] [-f] [-n] REV..."
+msgstr "hg strip [-k] [-f] [-n] REV..."
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "show only the first patch"
+msgstr "mostra solo la prima patch"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr "finalizza tutti i changeset applicati"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "list all available queues"
+msgstr "elenca tutte le code disponibili"
+
+msgid "create new queue"
+msgstr "crea nuova coda"
+
+msgid "rename active queue"
+msgstr "rinomina la coda attiva"
+
+msgid "delete reference to queue"
+msgstr "elimina i riferimenti alla coda"
+
+msgid "delete queue, and remove patch dir"
+msgstr "elimina la coda e rimuove la directory delle patch"
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[OPZIONE] [CODA]"
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this "
+"list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" merge = False # send notification for merges (default True)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d nuovi changeset"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: sto inviando a %d sottoscritti %d modifiche\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"diff (troncati da %d linee a %d):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"diff (%d linee):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr "quando effettuare la paginazione (booleano, sempre, auto o mai)"
+
+msgid "interpret suffixes to refer to ancestor revisions"
+msgstr "interpreta i suffissi per riferirsi alle revisioni antenate"
+
+msgid ""
+"This extension allows you to use git-style suffixes to refer to the\n"
+"ancestors of a specific revision."
+msgstr ""
+
+msgid "For example, if you can refer to a revision as \"foo\", then::"
+msgstr "Per esempio, se puoi riferirti ad una revisione come \"foo\", allora::"
+
+msgid ""
+" foo^N = Nth parent of foo\n"
+" foo^0 = foo\n"
+" foo^1 = first parent of foo\n"
+" foo^2 = second parent of foo\n"
+" foo^ = foo^1"
+msgstr ""
+
+msgid ""
+" foo~N = Nth first grandparent of foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = first parent of foo\n"
+" foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+msgstr ""
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your hgrc\n"
+"file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+#, python-format
+msgid "%s Please enter a valid value"
+msgstr "%s Si prega di inserire un valore valido"
+
+msgid "Please enter a valid value.\n"
+msgstr "Si prega di inserire un valore valido.\n"
+
+msgid "send changesets by email"
+msgstr "invia dei changeset via email"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "sto confrontando con %s\n"
+
+msgid "no changes found\n"
+msgstr "nessuna modifica trovata\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr ""
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr "troppe destinazioni"
+
+msgid "use only one form to specify the revision"
+msgstr "usa solo un formato per specificare la revisione"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Scrivi il messaggio introduttivo per la serie di patch."
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr "Questa serie di patch consiste di %d patch."
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"Sommario finale:"
+
+msgid "are you sure you want to send (yn)?"
+msgstr "sei sicuro di voler effettuare l'invio (yn)?"
+
+msgid "&No"
+msgstr "&No"
+
+msgid "&Yes"
+msgstr "&Si"
+
+msgid "patchbomb canceled"
+msgstr "patchbomb cancellato"
+
+msgid "Displaying "
+msgstr "Sto mostrando "
+
+msgid "Writing "
+msgstr "Sto scrivendo "
+
+msgid "writing"
+msgstr "sto scrivendo"
+
+msgid "Sending "
+msgstr "Sto inviando "
+
+msgid "sending"
+msgstr "sto inviando"
+
+msgid "send patches as attachments"
+msgstr "invia patch come allegati"
+
+msgid "send patches as inline attachments"
+msgstr "invia patch come allegati in linea"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "indirizzi mail dei destinatari in copia nascosta"
+
+msgid "email addresses of copy recipients"
+msgstr "indirizzi mail dei destinatari in copia"
+
+msgid "ask for confirmation before sending"
+msgstr "chiede la conferma prima dell'invio"
+
+msgid "add diffstat output to messages"
+msgstr "aggiungi l'output del diffstat ai messaggi"
+
+msgid "use the given date as the sending date"
+msgstr "usa la data fornita come data di invio"
+
+msgid "use the given file as the series description"
+msgstr "usa il file fornito come descrizione della serie"
+
+msgid "email address of sender"
+msgstr "indirizzo email del mittente"
+
+msgid "print messages that would be sent"
+msgstr "stampa i messaggi che verrebbero inviati"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "scrive i messaggi nel file mbox invece di inviarli"
+
+msgid "email addresses replies should be sent to"
+msgstr "indirizzi mail cui vanno indirizzate le risposte"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "soggetto del primo messaggio (introduzione o patch singola)"
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr "indirizzi mail dei destinatari"
+
+msgid "omit hg patch header"
+msgstr "ometti l'intestazione della patch hg"
+
+msgid "send changes not found in the target repository"
+msgstr "invia le modifiche non trovate nel repository di destinazione"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "invia le modifiche non in target come bundle binario"
+
+msgid "name of the bundle attachment file"
+msgstr "nome file del bundle allegato"
+
+msgid "a revision to send"
+msgstr "una revisione da inviare"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+"esegui anche quando il repository remoto non è collegato (con -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+"un changeset base da specificare invece di una destinazione (con -b/--bundle)"
+
+msgid "send an introduction email for a single patch"
+msgstr "invia una mail introduttiva per una patch singola"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [OPZIONE]... [DEST]..."
+
+msgid "show progress bars for some actions"
+msgstr ""
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+
+msgid "The following settings are available::"
+msgstr "Le seguenti impostazioni sono disponibili::"
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, and item. item defaults to the last 20 characters of the\n"
+"item, but this can be changed by adding either ``-<num>`` which would\n"
+"take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02ds"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%dm%02ds"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%dh%02dm"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%dd%02dh"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%dw%02dd"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%dy%02dw"
+
+msgid "command to delete untracked files from the working directory"
+msgstr "comando per cancellare file non tracciati dalla directory di lavoro"
+
+msgid "removes files not tracked by Mercurial"
+msgstr "rimuove i file non tracciati da Mercurial"
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr " Questo significa che purge cancellerà:"
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr " Ma lascerà intoccati:"
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s non può essere rimosso"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "attenzione: %s\n"
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr "Sto rimuovendo il file %s\n"
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr "Sto rimuovendo la directory %s\n"
+
+msgid "abort if an error occurs"
+msgstr "abortisce se si verifica un errore"
+
+msgid "purge ignored files too"
+msgstr "rimuove anche i file ignorati"
+
+msgid "print filenames instead of deleting them"
+msgstr "stampa i nomi dei file invece di cancellarli"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+"termina i nomi dei file con NUL, per usarli con xargs (implica -p/--print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [OPZIONE]... [DIR]..."
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "comando per spostare insiemi di revisioni su un antenato differente"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"Questa estensione consente di effettuare il rebase di changeset in\n"
+"un repository Mercurial esistente."
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"Per maggiori informazioni:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr "sposta changeset (e discendenti) su un branch differente"
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+" Rebase usa merge ripetuti per trapiantare changeset da una parte\n"
+" della storia (la sorgente) ad un'altra (la destinazione). Questo\n"
+" può essere utile per linearizzare modifiche *locali* relative ad\n"
+" un albero di sviluppo principale."
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+" Non si dovrebbe effettuare il rebase di modifiche che sono già\n"
+" state condivise con altri. Così facendo si forzerebbe chiunque\n"
+" altro ad effettuare lo stesso rebase, altrimenti finirebbero \n"
+" per l'avere changeset duplicati dopo aver effettuato il pull\n"
+" dei changeset di cui è stato effettuato il rebase."
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+" Se un rebase viene interrotto per risolvere manualmente un merge,\n"
+" può essere ripreso con --continue/-c o abortito con --abort/-a."
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+" Restituisce 0 in caso di successo, 1 se non c'è nulla di cui fare\n"
+" il rebase.\n"
+" "
+
+msgid "cannot use both abort and continue"
+msgstr "non è possibile usare sia abort sia continue"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "non è possibile usare collapse con continue o abort"
+
+msgid "cannot use detach with continue or abort"
+msgstr "non è possibile usare detach con continue o abort"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "abort e continue non consentono di specificare revisioni"
+
+msgid "cannot specify both a revision and a base"
+msgstr "non è possibile specificare sia una revisione sia una base"
+
+msgid "detach requires a revision to be specified"
+msgstr "detach richiede di specificare una revisione"
+
+msgid "cannot specify a base with detach"
+msgstr "impossibile specificare una base con detach"
+
+msgid "nothing to rebase\n"
+msgstr "niente di cui effettuare il rebase\n"
+
+msgid "cannot use both keepbranches and extrafn"
+msgstr "non è possibile usare sia keepbranches sia extrafn"
+
+msgid "rebasing"
+msgstr "sto effettuando il rebase"
+
+msgid "changesets"
+msgstr "sto aggiungendo i changeset"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr ""
+"conflitti non risolti (vedere hg resolve e poi eseguire hg rebase --continue)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "nessuna modifica, revisione %d saltata\n"
+
+msgid "rebase merging completed\n"
+msgstr "merge del rebase completato\n"
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+"attenzione: nuovi changeset rilevati sulla branch sorgente, non li rimuovo\n"
+
+msgid "rebase completed\n"
+msgstr "rebase completato\n"
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "%d revisioni sono state saltate\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "impossibile effettuare il collapse, c'è più di un genitore esterno"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+"non è possibile usare la revisione %d come base, il risultato avrebbe 3 "
+"genitori"
+
+msgid "no rebase in progress"
+msgstr "nessun rebase in corso"
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+"attenzione: nuovi changeset rilevati sulla branch target, impossibile "
+"abortire\n"
+
+msgid "rebase aborted\n"
+msgstr "rebase abortito\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr "non è possibile effettuare il rebase su una patch mq applicata"
+
+msgid "source is ancestor of destination"
+msgstr "la sorgente è un antenato della destinazione"
+
+msgid "source is descendant of destination"
+msgstr "la sorgente è un discendente della destinazione"
+
+msgid "rebase working directory to branch head"
+msgstr "effettua il rebase della directory di lavoro sulla head della branch"
+
+msgid "rebase from the specified changeset"
+msgstr "effettua il rebase dal changeset specificato"
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+"rebase dalla base del changeset specificato (fino al più grande antenato "
+"comune tra la base e la destinazione)"
+
+msgid "rebase onto the specified changeset"
+msgstr "rebase sul changeset specificato"
+
+msgid "collapse the rebased changesets"
+msgstr "collassa le revisioni di cui si effettua il rebase"
+
+msgid "keep original changesets"
+msgstr "mantiene i changeset originali"
+
+msgid "keep original branch names"
+msgstr "mantiene le branch originali"
+
+msgid "force detaching of source from its original branch"
+msgstr "forza la separazione della sorgente dalla sua branch originaria"
+
+msgid "continue an interrupted rebase"
+msgstr "continua un rebase interrotto"
+
+msgid "abort an interrupted rebase"
+msgstr "abortisce un rebase interrotto"
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [opzioni]\n"
+"hg rebase {-a|-c}"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+"comando per selezionare interattivamente le modifiche per il commit/qrefresh"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "questo modifica un file binario (tutto o niente)\n"
+
+msgid "this is a binary file\n"
+msgstr "questo è un file binario\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr "&Yes, registra questa modifica"
+
+msgid "&No, skip this change"
+msgstr "&No, salta questa modifca"
+
+msgid "&Skip remaining changes to this file"
+msgstr "&Salta le modifiche rimanenti a questo file"
+
+msgid "Record remaining changes to this &file"
+msgstr "Registra le modifiche rimanenti a questo &file"
+
+#, fuzzy
+msgid "&Done, skip remaining changes and files"
+msgstr "&Fatto, salta le modifiche e i file rimanenti"
+
+#, fuzzy
+msgid "Record &all changes to all remaining files"
+msgstr "Registra &tutte le modifiche a tutti i file rimanenti"
+
+#, fuzzy
+msgid "&Quit, recording no changes"
+msgstr "&Esce, non registrando alcuna modifica"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "user quit"
+msgstr "utente uscito"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "esaminare le modifiche a %s?"
+
+msgid " and "
+msgstr " e "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "registrare questa modifica a %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "registrare la modifica %d/%d a %r?"
+
+msgid "interactively select changes to commit"
+msgstr "seleziona interattivamente le modifiche di cui eseguire il commit"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" Se viene omesso un elenco di file, tutte le modifiche\n"
+" riportate da :hg:`status` saranno candidate per la\n"
+" registrazione."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Si verrà interrogati su quali modifiche registrare\n"
+" per ogni file modificato e, per file con modifiche\n"
+" multiple, per ogni modifica da usare. Per ogni domanda\n"
+" sono possibili le seguenti risposte::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+" y - registra questa modifica\n"
+" n - salta questa modifica"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - salta le modifiche rimanenti di questo file\n"
+" f - registra le modifiche rimanenti di questo file"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - fatto, salta le modifiche e i file rimanenti\n"
+" a - registra tutte le modifiche a tutti i file rimanenti\n"
+" q - esci, non registrare alcuna modifica"
+
+msgid " ? - display help"
+msgstr " ? - mostra il messaggio di aiuto"
+
+msgid " This command is not available when committing a merge."
+msgstr " Questo comando non è disponibile durante il commit di un merge."
+
+msgid "'mq' extension not loaded"
+msgstr "estensione 'mq' non caricata"
+
+msgid "running non-interactively, use commit instead"
+msgstr "esecuzione non interattiva, usare invece commit"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr ""
+"impossibile eseguire il commit parziale di un merge (usare invece \"hg commit"
+"\")"
+
+msgid "no changes to record\n"
+msgstr "nessuna modifica da registrare\n"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [OPZIONE]... [FILE]..."
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [OPZIONE]... PATCH [FILE]..."
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+msgid "hardlinks are not supported on this system"
+msgstr "hardlink non supportati su questo sistema"
+
+#, fuzzy
+msgid "must specify local origin repository"
+msgstr "%s non è un repository locale Mercurial"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "sto ricollegando %s a %s\n"
+
+#, fuzzy
+msgid "there is nothing to relink\n"
+msgstr "non c'è nulla di cui fare il merge"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr "tip ha %d file, numero totale stimato di file: %s\n"
+
+msgid "collecting"
+msgstr "sto collezionando"
+
+msgid "files"
+msgstr "file"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr ""
+
+msgid "source and destination are on different devices"
+msgstr "sorgente e destinazione sono su periferiche differenti"
+
+#, python-format
+msgid "not linkable: %s\n"
+msgstr "non collegabile: %s\n"
+
+msgid "pruning"
+msgstr "eliminazione"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr ""
+
+msgid "relinking"
+msgstr "ricollegamento in corso"
+
+#, python-format
+msgid "relinked %d files (%d bytes reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr "[ORIGINE]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+
+msgid "After that you can use it like::"
+msgstr "In seguito puoi usarlo come::"
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository"
+msgstr "crea un nuovo repository condiviso"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr "non crea una directory di lavoro"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] SORGENTE [DEST]"
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr "sto filtrando %s\n"
+
+msgid "filter failed"
+msgstr "filtraggio fallito"
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: changeset vuoto"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr "%s trapiantato come %s\n"
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr "commit fallito"
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "applicare il changeset? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "nessuna opzione\n"
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REVISION --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr "--all richiede la revisione di un branch"
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr "nessuna revisione estratta"
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid ""
+"``transplanted(set)``\n"
+" Transplanted changesets in set."
+msgstr ""
+
+msgid "pull patches from REPO"
+msgstr ""
+
+msgid "BRANCH"
+msgstr "BRANCH"
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through command"
+msgstr "changeset filtrati tramite il comando"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr "consente l'uso di percorsi MBCS con codifiche problematiche"
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr "Questa estensione è utile per:"
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr "Questa estensione non è necessaria per:"
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr "Notare che ci sono alcune limitazioni all'uso di questa estensione:"
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+"win32text è deprecato: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr "scopre e pubblicizza repository sulla rete locale"
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+"Si possono scoprire repository abilitati a Zeroconf eseguendo\n"
+":hg:`paths`::"
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+msgid "archive prefix contains illegal components"
+msgstr "il prefisso dell'archivio contiene componenti non consentite"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "impossibile fornire un prefisso durante l'archiviazione dei file"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "tipo di archivio '%s' sconosciuto"
+
+msgid "archiving"
+msgstr "archiviazione"
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "il segnalibro '%s' contiene caratteri non consentiti"
+
+msgid "searching for changed bookmarks\n"
+msgstr "sto cercando segnalibri modificati\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "non è stato trovato alcun segnalibro modificato\n"
+
+msgid "invalid changegroup"
+msgstr "changegroup invalido"
+
+msgid "unknown parent"
+msgstr "genitore sconosciuto"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "controllo di integrità fallito su %s:%d"
+
+msgid "cannot create new bundle repository"
+msgstr "impossibile creare un nuovo repository bundle"
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "flusso terminato in maniera inattesa (%d byte, attesi %d)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "lunghezza del chunk invalida %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: non è un bundle di Mercurial"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: versione di bundle sconosciuta %s"
+
+msgid "empty username"
+msgstr "username vuoto"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "il nome utente %s contiene un carattere di nuova riga"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "il nome '%s' è riservato"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr ""
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr ""
+
+msgid "limit must be a positive integer"
+msgstr "limit dev'essere un intero positivo "
+
+msgid "limit must be positive"
+msgstr "limit dev'essere positivo"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+#, python-format
+msgid "adding %s\n"
+msgstr "aggiunta in corso di %s\n"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "sto rimuovendo %s\n"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: non copio - il file non è gestito\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: non copio - il file è stato rimosso per la rimozione\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: non sovrascrivo - %s collide con %s\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: non sovrascrivo - il file esiste\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: non registro la rinomina - %s non esiste\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: non registro la copia - %s non esiste\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: rimosso nella copia di lavoro\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: impossibile copiare - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "sto spostando %s in %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "sto copiando %s in %s\n"
+
+msgid "no source or destination specified"
+msgstr "nessuna sorgente o destinazione specificata"
+
+msgid "no destination specified"
+msgstr "nessuna destinazione specificata"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+"con sorgenti multiple la destinazione deve essere una directory esistente"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "la destinazione %s non è una directory"
+
+msgid "no files to copy"
+msgstr "nessun file da copiare"
+
+msgid "(consider using --after)\n"
+msgstr "(considera di usare --after)\n"
+
+msgid "child process failed to start"
+msgstr "avvio fallito del processo figlio"
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "changeset: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "branch: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "segnalibro: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "tag: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "genitore: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifesto: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "utente: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "data: %s\n"
+
+msgid "files+:"
+msgstr "file+:"
+
+msgid "files-:"
+msgstr "file-:"
+
+msgid "files:"
+msgstr "file:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "file: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "copie: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "extra: %s=%s\n"
+
+msgid "description:\n"
+msgstr "descrizione:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "sommario: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr "%s: nessuna chiave chiamata '%s'"
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr "Trovata revisione %s da %s\n"
+
+msgid "revision matching date not found"
+msgstr "revisione corrispondente alla data non trovata"
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "impossibile seguire il file non esistente: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "sto saltando il subrepository mancante: %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+"HG: Inserisci il messaggio di commit. Le linee che iniziano con 'HG:' "
+"vengono rimosse."
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: Lasciare il messaggio vuoto per abortire il commit."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: utente: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: branch merge"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: branch '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: subrepository %s"
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: aggiunto %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: cambiato %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: rimosso %s"
+
+msgid "HG: no files changed"
+msgstr "HG: nessun file modificato"
+
+msgid "empty commit message"
+msgstr "messaggio di commit vuoto"
+
+msgid "add the specified files on the next commit"
+msgstr "aggiunge i file specificati al prossimo commit"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+" Pianifica i file che devono essere versionati e aggiunti\n"
+" al repository"
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" I file saranno aggiunti al repository al prossimo commit. Per\n"
+" annullare prima un aggiunta, vedere :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr " Se non vengono forniti nomi, aggiunge tutti i file al repository."
+
+msgid " .. container:: verbose"
+msgstr " .. contenitore:: verboso"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" Un esempio che mostra come file nuovi (sconosciuti) vengono \n"
+" aggiunti automaticamente da :hg:`add`::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Restituisce 0 se tutti i file sono stati aggiunti con successo.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "aggiunge tutti i nuovi file, cancella tuitti i file mancanti"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed."
+msgstr ""
+
+msgid "similarity must be a number"
+msgstr "similarity dev'essere un numero"
+
+msgid "similarity must be between 0 and 100"
+msgstr "similarity dev'essere compreso tra 0 e 100"
+
+msgid "show changeset information by line for each file"
+msgstr ""
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+
+msgid "at least one filename or pattern is required"
+msgstr "è richiesto almeno un nome di file o pattern"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: è un file binario\n"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr ""
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+
+msgid " Valid types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr ""
+
+msgid "repository root cannot be destination"
+msgstr ""
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+
+msgid "reverse effect of earlier changeset"
+msgstr "inverte l'effetto di un changeset precedente"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" Prepara un nuovo changeset con l'effetto dell'annullamento\n"
+" di REV nella directory di lavoro corrente."
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+" Se REV è il genitore della copia di lavoro, allore di questo nuovo\n"
+" changeset viene fatto il commit automatico. Altrimenti, hg necessita\n"
+" di effettuare il merge delle modifiche e del risultato del merge non\n"
+" viene effettuato il commit."
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending changeset\n"
+" will instead have two parents: the old parent of the working\n"
+" directory and a new child of REV that simply undoes REV."
+msgstr ""
+" Di default, il changeset in attesa avrà un solo genitore,\n"
+" mantenendo una storia lineare. Con --merge, il changeset in attesa\n"
+" avrà invece due genitori: il vecchio genitore della directory di\n"
+" lavoro e un nuovo figlio di REV che semplicemente annulla REV."
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent to\n"
+" specifying --merge followed by :hg:`update --clean .` to cancel\n"
+" the merge and leave the child of REV as a head to be merged\n"
+" separately."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr "si prega di specificare solo una revisione"
+
+msgid "please specify a revision to backout"
+msgstr "si prega di specificare una revisione di cui effettuare il backout"
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+"impossibile effettuare il backout di modifiche su una branch differente"
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s non è un genitore di %s"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "sto effettuando il merge con il changeset %s\n"
+
+msgid "subdivision search of changesets"
+msgstr ""
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad."
+msgstr ""
+
+msgid "The first good revision is:\n"
+msgstr "La prima revisione buona è:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "La prima revisione errata è:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"To check the other ancestors, start from the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "impossibile fare bisect (nessuna revisione buona nota)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "impossibile fare bisect (nessuna revisione cattiva nota)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(l'uso di 'hg bisect <cmd>' è deprecato)\n"
+
+msgid "incompatible arguments"
+msgstr "argomenti incompatibili"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "esecuzione di %s fallita"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s ucciso"
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "Changeset %d:%s: %s\n"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr ""
+
+msgid "track a line of development with movable markers"
+msgstr "segui una linea di sviluppo con puntatori mobili"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in :hg:`merge` and\n"
+" :hg:`update` to merge and update respectively to a given bookmark."
+msgstr ""
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled.\n"
+" "
+msgstr ""
+
+msgid "a bookmark of this name does not exist"
+msgstr "non esiste un segnalibro con questo nome"
+
+msgid "a bookmark of the same name already exists"
+msgstr "esiste già un segnalibro con lo stesso nome"
+
+msgid "new bookmark name required"
+msgstr "richiesto nuovo nome per il segnalibro"
+
+msgid "bookmark name required"
+msgstr "richiesto nome per il segnalibro"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "il nome di un segnalibro non può contenere a capo"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "il nome di un segnalibro non può consistere interamente di whitespace"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "un segnalibro non può avere lo stesso nome di una branch esistente"
+
+msgid "no bookmarks set\n"
+msgstr ""
+
+msgid "set or show the current branch name"
+msgstr ""
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "resetto la directory di lavoro alla branch %s\n"
+
+msgid ""
+"a branch of the same name already exists (use 'hg update' to switch to it)"
+msgstr ""
+"una branch con lo stesso nome esiste già (usare 'hg update' per passare ad "
+"essa)"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "marcata directory di lavoro come branch %s\n"
+
+msgid "list repository named branches"
+msgstr ""
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+
+msgid " (closed)"
+msgstr ""
+
+msgid " (inactive)"
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "--base è incompatibile con la selezione di una destinazione"
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "output the current or given revision of files"
+msgstr ""
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+
+msgid "make a copy of an existing repository"
+msgstr ""
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+
+msgid " See :hg:`help urls` for valid source format details."
+msgstr ""
+" Vedere :hg:`help urls` per dettagli sui formati validi per la sorgente."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination, but no\n"
+" ``.hg/hgrc`` and working directory will be created on the remote side.\n"
+" Please see :hg:`help urls` for important details about ``ssh://`` URLs."
+msgstr ""
+" E' possibile specificare un URL ``ssh://`` come destinazione, ma sul\n"
+" sistema remoto non verranno creati ``.hg/hgrc`` nè directory di lavoro.\n"
+" Vedere :hg:`help urls` per dettagli importanti sugli URL ``ssh://``."
+
+msgid ""
+" A set of changesets (tags, or branch names) to pull may be specified\n"
+" by listing each changeset (tag, or branch name) with -r/--rev.\n"
+" If -r/--rev is used, the cloned repository will contain only a subset\n"
+" of the changesets of the source repository. Only the set of changesets\n"
+" defined by all -r/--rev options (including all their ancestors)\n"
+" will be pulled into the destination repository.\n"
+" No subsequent changesets (including subsequent tags) will be present\n"
+" in the destination."
+msgstr ""
+
+msgid ""
+" Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+" local source repositories."
+msgstr ""
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the working directory). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+
+msgid ""
+" In some cases, you can clone repositories and the working directory\n"
+" using full hardlinks with ::"
+msgstr ""
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr ""
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq."
+msgstr ""
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "impossibile selezionare sia --noupdate sia --updaterev"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr ""
+"effettua il commit dei file selezionati o di tutte le modifiche in attesa"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Effettua il commit nel repository delle modifiche ai file selezionati.\n"
+" A differenza di un SCM centralizzato, questa operazione è una\n"
+" operazione locale. Vedere :hg:`push` per un modo per distribuire\n"
+" attivamente le tue modifiche."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Se un elenco di file viene omesso, verrà effettuato il commit di\n"
+" tutte le modifiche riportate da :hg:`status`."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Se si sta effettuando il commit del risultato di un merge, non\n"
+" fornire nessun nome di file o filtri -I/-X."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+
+msgid "can only close branch heads"
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr "nulla è cambiato\n"
+
+msgid "created new head\n"
+msgstr "creata una nuova head\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr ""
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "effettuato il commit del changeset %d:%s\n"
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "either two or three arguments required"
+msgstr "due o tre argomenti sono richiesti"
+
+msgid "builds a repo with a given dag from scratch in the current empty repo"
+msgstr ""
+
+msgid " Elements:"
+msgstr ""
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"!command\" runs the command using your shell\n"
+" - \"!!my command\\n\" is like \"!\", but to the end of the line\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape character."
+msgstr ""
+
+msgid ""
+" Note that the --overwritten-file and --appended-file options imply the\n"
+" use of \"HGMERGE=internal:local\" during DAG buildup.\n"
+" "
+msgstr ""
+
+msgid "need at least one of -m, -a, -o, -n"
+msgstr ""
+
+msgid "repository is not empty"
+msgstr "il repository non è vuoto"
+
+#, python-format
+msgid "%s command %s"
+msgstr "%s comando %s"
+
+msgid "list all available commands and options"
+msgstr "elenca tutti comandi disponibili e le relative opzioni"
+
+msgid "returns the completion list associated with the given command"
+msgstr "restituisce l'elenco di completamento associato al dato comando"
+
+msgid "show information detected about current filesystem"
+msgstr "mostra le informazioni rilevare del filesystem corrente"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "validate the correctness of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s è nello state %s, ma non nel manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s è nello state %s, ma anche nel manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s è nello state %s, ma non in uno dei manifesti\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr ""
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+
+#, python-format
+msgid "read config from: %s\n"
+msgstr "lettura delle configurazioni da: %s\n"
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr ""
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+" Altrimenti, viene mostrato il DAG dei changelog del repository\n"
+" corrente.\n"
+" "
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "display the combined ignore pattern"
+msgstr ""
+
+msgid "no ignore patterns found"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+#, python-format
+msgid "unknown format %d"
+msgstr "formato sconosciuto %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr ""
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr ""
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+#, python-format
+msgid "Checking installed modules (%s)...\n"
+msgstr "Sto controllando i moduli installati (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+msgid "Checking templates...\n"
+msgstr ""
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking patch...\n"
+msgstr ""
+
+msgid " patch call failed:\n"
+msgstr ""
+
+msgid " unexpected patch output!\n"
+msgstr ""
+
+msgid " patch test failed!\n"
+msgstr ""
+
+msgid ""
+" (Current patch tool may be incompatible with patch, or misconfigured. "
+"Please check your configuration file)\n"
+msgstr ""
+
+msgid ""
+" Internal patcher failure, please report this error to http://mercurial."
+"selenic.com/wiki/BugTracker\n"
+msgstr ""
+" Fallimento del patcher interno, si prega di segnalare questo errore a "
+"http://mercurial.selenic.com/wiki/BugTracker\n"
+
+msgid "Checking commit editor...\n"
+msgstr "Sto controllando l'editor per il commit...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr "Nessun editor per il commit trovato e non trovo vi in PATH\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr ""
+" (specificare un editor per il commit nel proprio file di configurazione)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr "Editor '%s' non trovato in PATH\n"
+
+msgid "Checking username...\n"
+msgstr "Sto controllando lo username...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (specificare un nome utente nel proprio file di configurazione)\n"
+
+msgid "No problems detected\n"
+msgstr "Nessun problema riscontrato\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "%s problemi riscontrati, si prega di controllare l'installazione!\n"
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr ""
+
+msgid "show how files match on given patterns"
+msgstr "mostra come i file corrispondono ai dati pattern"
+
+msgid "diff repository (or selected files)"
+msgstr ""
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr ""
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. nota::\n"
+" l'export potrebbe generare un diff inatteso per changeset di \n"
+" merge, dal momento che confronterà tali changeset solo con\n"
+" il loro primo genitore."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" Usa l'opzione --git per generare diff nel formato diff esteso\n"
+" git. Vedere :hg:`help diffs` per maggiori informazioni."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+
+msgid "no files specified"
+msgstr "nessun file specificato"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s non rimosso: il file non viene già tracciato\n"
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "show current repository heads or show branch heads"
+msgstr ""
+
+msgid " With no arguments, show all repository branch heads."
+msgstr " Senza argomenti mostra tutte le teste dei branch del repository."
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "nessuna testa di branch aperta trovata sui branch %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (iniziato a %s)"
+
+msgid "show help for a given topic or a help overview"
+msgstr "mostra l'aiuto per un dato argomento o una panoramica d'aiuto"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+" Senza argomenti stampa un elenco dei comandi ed un breve\n"
+" messaggio d'aiuto."
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" Dato un argomento, estensione o nome di comando, stampa l'aiuto\n"
+" per tale argomento."
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+
+msgid "global options:"
+msgstr "opzioni globali:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "usare \"hg help\" per l'elenco completo dei comandi"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"usare \"hg help\" per la lista completa dei comandi oppure \"hg -v\" per i "
+"dettagli"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"usare \"hg -v help%s\" per mostrare gli alias predefiniti e le opzioni "
+"globali"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "usare \"hg -v help %s\" per mostrare le opzioni globali"
+
+msgid "list of commands:"
+msgstr "elenco dei comandi:"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"alias: %s\n"
+
+msgid "(no help text available)"
+msgstr "(nessun testo di aiuto disponibile)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "alias shell per::"
+
+#, python-format
+msgid " %s"
+msgstr ""
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "alias per: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show verbose help\n"
+msgstr ""
+"\n"
+"usare \"hg -v help %s\" per mostrare l'aiuto più esteso\n"
+
+msgid "options:\n"
+msgstr "opzioni:\n"
+
+msgid "no commands defined\n"
+msgstr "nessun comando definito\n"
+
+msgid "no help text available"
+msgstr "nessun testo di aiuto disponibile"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "estensione %s - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial SCM Distribuito\n"
+
+msgid "basic commands:"
+msgstr "comandi base:"
+
+msgid "enabled extensions:"
+msgstr "estensioni abilitate:"
+
+msgid "VALUE"
+msgstr ""
+
+msgid "DEPRECATED"
+msgstr ""
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times"
+msgstr ""
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"argomenti di aiuto aggiuntivi:"
+
+msgid "identify the working copy or specified revision"
+msgstr "identifica la copia di lavoro o una revisione specifica"
+
+msgid ""
+" With no revision, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" Senza revisioni, stampa un sommario dello stato corrente del\n"
+" repository."
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" Specificando un percorso alla root di un repository o un\n"
+" bundle Mercurial si effettuerà la ricerca su tale repository/bundle."
+
+msgid ""
+" This summary identifies the repository state using one or two\n"
+" parent hash identifiers, followed by a \"+\" if there are\n"
+" uncommitted changes in the working directory, a list of tags for\n"
+" this revision and a branch name for non-default branches."
+msgstr ""
+" Questo sommario identifica lo stato del repository usando uno o\n"
+" due identificatori hash genitori, seguito da un \"+\" se ci sono \n"
+" modifiche di cui non si è eseguito il commit nella directory di \n"
+" lavoro, un elenco di tag per questa revisione e un nome di branch\n"
+" per branch non-default. "
+
+msgid "can't query remote revision number, branch, tags, or bookmarks"
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr "importa un insieme ordinato di patch"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+" Importa un elenco di patch e ne effettua il commit\n"
+" individualmente (a meno che non venga specificato --no-commit)."
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+" Se ci sono modifiche pendenti nella directory di lavoro,\n"
+" l'importazione abortirà a meno che non si usi il flag -f/--force."
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+" E' possibile importare una patch direttamente da un messaggio\n"
+" mail. Anche le patch come allegato funzionano (il corpo deve\n"
+" essere di tipo text/plain o text/x-patch). Le intestazioni Da e \n"
+" Soggetto della mail sono usate come autore del commit\n"
+" e messaggio di commit di default. Tutte le parti del corpo\n"
+" text/plain antecedenti il primo diff sono aggiunte al messaggio di\n"
+" commit."
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+" Se la patch importata è stata generata da :hg:`export`, l'utente e la\n"
+" descrizione dalla patch rimpiazzano i valori del corpo e\n"
+" dell'intestazione del messaggio. I valori forniti dalla riga di\n"
+" comando con -m/--message e -u/--user rimpiazzano questi."
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+" Se viene specificato --exact, l'importazione imposterà la\n"
+" directory di lavoro al genitore di ogni patch prima di applicarla,\n"
+" e abortirà se il changeset risultante avrà un ID differente\n"
+" rispetto a quello registrato nella patch. Questo potrebbe capitare\n"
+" a causa di problemi del set di caratteri o altre carenze nel\n"
+" formato della patch testuale."
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+" Con -s/--similarity, hg tenterà di scoprire le rinomine e le copie\n"
+" nella patch allo stesso modo di 'addremove'."
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Per leggere una patch dallo standard input, usare come nome della\n"
+" patch \"-\". Se viene specificato un URL, la patch verrà scaricata da\n"
+" questo. Vedere :hg:`help dates` per un elenco dei formati validi\n"
+" per -d/--date.\n"
+" "
+
+msgid "to working directory"
+msgstr "alla directory di lavoro"
+
+msgid "not a Mercurial patch"
+msgstr "non è una patch di Mercurial"
+
+msgid "patch is damaged or loses information"
+msgstr "la patch è danneggiata o perde informazioni"
+
+msgid "applying patch from stdin\n"
+msgstr "sto applicando patch dallo stdin\n"
+
+#, python-format
+msgid "applied %s\n"
+msgstr "applicata %s\n"
+
+msgid "no diffs found"
+msgstr "nessun diff trovato"
+
+msgid "show new changesets found in source"
+msgstr "mostra i nuovi changeset trovati nella sorgente"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Mostra i nuovi changeset trovati nel percorso/URL specificato o\n"
+" nella posizione di pull di default. Questi sono i changeset di cui\n"
+" si effettuerebbe il pull se questo venisse richiesto in quel momento."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" Per repository remoti, usare --bundle evita di scaricare due volte\n"
+" i changeset se incoming è seguito da un pull."
+
+msgid " See pull for valid source format details."
+msgstr " Vedere pull per dettagli sui formati di sorgenti validi."
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr ""
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "il repository remoto non supporta i segnalibri\n"
+
+msgid "create a new repository in the given directory"
+msgstr "crea un nuovo repository nella directory specificata"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Inizializza un nuovo repository nella directory data. Se tale\n"
+" directory non esiste la crea."
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+" Se non viene specificata alcuna directory, viene usata la directory "
+"corrente."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" E' possibile specificare un URL ``ssh://`` come destinazione.\n"
+" Vedere :hg:`help urls` per maggiori informazioni. "
+
+msgid "locate files matching specific patterns"
+msgstr "trova file corrispondenti a pattern specificati"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" Stampa tutti i file sotto il controllo di Mercurial nella directory di\n"
+" lavoro il cui nome corrisponde ai pattern specificati."
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" Di default questo comando cerca in tutte le directory della copia\n"
+" di lavoro. Per cercare solo nella directory corrente e le sue \n"
+" sottodirectory, usare \"--include .\"."
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+" Se non vengono forniti pattern da confrontare, questo comando\n"
+" stampa il nome di tutti i file sotto il controllo di Mercurial nella "
+"directory\n"
+" di lavoro."
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" Se si desidera fornire l'output di questo comando al comando\n"
+" \"xargs\", usare l'opzione -0 sia per questo comando sia per\n"
+" \"xargs\". Questo eviterà il problema per cui \"xargs\" tratta\n"
+" nomi di file singoli che contengono spazi bianchi come nomi di\n"
+" file multipli."
+
+msgid "show revision history of entire repository or files"
+msgstr "mostra la storia delle revisioni dell'intero repository o di file"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Stampa la storia delle revisioni o dei file specificati o dell'intero\n"
+" progetto."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+" La storia dei file viene mostrata senza seguire la storia delle\n"
+" rinomine o delle copie dei file. Usare -f/--follow con il nome di\n"
+" un file per seguirne la storia attraverso copie e rinomine.\n"
+" --follow senza il nome di un file mostrerà solamente gli antenati\n"
+" o i discendenti della revisione di partenza. --follow-first segue\n"
+" solo il primo genitore delle revisioni di merge."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision. You can specify a revision set for\n"
+" log, see :hg:`help revsets` for more information."
+msgstr ""
+" Se non viene specificato alcun range di revisioni, il default\n"
+" è ``tip:0`` a meno di impostare --follow, in questo caso la\n"
+" directory genitore viene usata come revisione di partenza.\n"
+" E' possibile specificare un insieme di revisioni per log, vedere\n"
+" :hg:`help revsets` per maggiori informazioni."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Di default questo comando stampa il numero di revisione e l'id del\n"
+" changeset, tag, genitori non triviali, utente, data e ora e un \n"
+" sommario per ogni commit. Quando viene usato -v/--verbose,\n"
+" viene mostrato l'elenco dei file modificati e l'intero messaggio\n"
+" di commit."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. nota::\n"
+" log -p/--patch potrebbe generare un diff inatteso per changeset\n"
+" di merge, in quanto confronta solo i changeset di merge con il loro\n"
+" primo genitore. Inoltre, solo i file differente da ENTRAMBI i "
+"genitori\n"
+" compariranno nei file:."
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+
+msgid "merge working directory with another revision"
+msgstr ""
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr " :hg:`resolve` deve essere usato per decidere su file irrisolti."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid ""
+"branch '%s' has %d heads - please merge with an explicit rev\n"
+"(run 'hg heads .' to see heads)"
+msgstr ""
+"il branch '%s' ha %d head - si prega di effettuare il merge con\n"
+"una revisione esplicita (eseguire 'hg heads .' per vedere le head)"
+
+#, python-format
+msgid ""
+"branch '%s' has one head - please merge with an explicit rev\n"
+"(run 'hg heads' to see all heads)"
+msgstr ""
+"il branch '%s' ha una head - si prega di effettuare il merge con\n"
+"una revisione esplicita (eseguire 'hg heads' per vedere tutte le head)"
+
+msgid "there is nothing to merge"
+msgstr "non c'è nulla di cui fare il merge"
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr "%s - invece usare \"hg update\""
+
+msgid ""
+"working dir not at a head rev - use \"hg update\" or merge with an explicit "
+"rev"
+msgstr ""
+"la directory di lavoro non è una revisione head - usare \"hg update\"\n"
+"o fare il merge con una revisione esplicita"
+
+msgid "show changesets not found in the destination"
+msgstr "mostra changeset non trovati nella destinazione"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Mostra i changeset non trovati nel repository di destinazione\n"
+" specificato o nella posizione di default di push. Questi sono i\n"
+" changeset di cui si effettuerebbe il push se questo venisse\n"
+" richiesto."
+
+msgid " See pull for details of valid destination formats."
+msgstr " Vedere pull per dettagli sui formati validi di destinazioni."
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "show the parents of the working directory or revision"
+msgstr "mostra i genitori della directory di lavoro o di una revisione"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Stampa le revisioni genitori della directory di lavoro. Se una\n"
+" revisione è specificata tramite -r/--rev, verrà stampato il genitore\n"
+" di quella revisione. Se viene fornito un file come argomento,\n"
+" verrà stampata l'ultima revisione in cui il file è stato\n"
+" modificato (prima della revisione della directory di lavoro\n"
+" o dell'argomento di --rev se fornito)."
+
+msgid "can only specify an explicit filename"
+msgstr "possibile specificare solo un nome di file esplicito"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' non trovato nel manifesto!"
+
+msgid "show aliases for remote repositories"
+msgstr ""
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr ""
+
+msgid "not found!\n"
+msgstr "non trovato!\n"
+
+msgid "not updating, since new heads added\n"
+msgstr ""
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(esegui 'hg heads' per vedere le head, 'hg merge' per fare un merge)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(esegui 'hg update' per ottenere una copia funzionante)\n"
+
+msgid "pull changes from the specified source"
+msgstr "effettua il pull delle modifiche dalla sorgente specificata"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr ""
+" Effettua il pull delle modifiche da un repository remoto\n"
+" ad uno locale."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Questo trova tutte le modifiche dal repository al percorso o URL\n"
+" specificato e le aggiunge al repository locale (quello corrente a\n"
+" meno che non venga specificato -R). Di default, non viene \n"
+" aggiornata la copia del progetto nella directory di lavoro."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Usare :hg:`incoming` per vedere quello che verrebbe aggiunto da\n"
+" un pull nel momento dell'esecuzione di questo comando. Se si decidesse\n"
+" di aggiungere in seguito tali modifiche al repository, si dovrebbe "
+"usare\n"
+" :hg:`pull -r X` dove ``X`` è l'ultimo changeset elencato da :hg:"
+"`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Se viene omessa la SORGENTE, verrà usato il \n"
+" percorso 'default'. Vedere :hg:`help urls` per\n"
+" maggiori informazioni."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "repository remoto %s non trovato!"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"l'altro repository non supporta la ricerca di revisioni, quindi una "
+"revisione \n"
+"non può essere specificata."
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "importazione segnalibro %s\n"
+
+msgid "push changes to the specified destination"
+msgstr "effettua il push di modifiche verso la destinazione specificata"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+" Effettua il push di modifiche dal repository locale verso la\n"
+" destinazione specificata."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Se si usa -r/--rev, si effettuerà il push del changeset dato e\n"
+" di tutti i suoi antenati verso il repository remoto."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Vedere :hg:`help urls` per importanti dettagli sugli URL ``ssh://``.\n"
+" Se viene omessa DESTINATION, verrà usato il percorso di default."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "sto effettuando il push verso %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "esportazione segnalibro %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "eliminazione segnalibro remoto %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "il segnalibro %s non esiste nel repository locale o remoto!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "aggiornamento del segnalibro %s fallito!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "effettua il rollback di una transazione interrotta"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr " Riprende un commit o un pull interrotti."
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" Questo comando prova a correggere lo stato del repository dopo\n"
+" un'operazione interrotta. Dovrebbe essere necessario solamente\n"
+" quando Mercurial lo suggerisce. "
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+
+msgid "remove the specified files on the next commit"
+msgstr ""
+
+msgid " Schedule the indicated files for removal from the repository."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by :hg:`status`). The actions are Warn, Remove (from\n"
+" branch) and Delete (from disk)::"
+msgstr ""
+
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "non rimuovo %s: il file non è tracciato\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr ""
+"non rimuovo %s: il file esiste già (usare -f per forzare la rimozione)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr ""
+"non rimuovo %s: il file è stato modificato (usare -f per forzare la "
+"rimozione)\n"
+
+#, python-format
+msgid ""
+"not removing %s: file has been marked for add (use -f to force removal)\n"
+msgstr ""
+"non rimuovo %s: il file è stato marcato per l'aggiunta (usare -f per forzare "
+"la rimozione)\n"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid "redo merges or set/view the merge status of files"
+msgstr ""
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents)."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to selects all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr "troppe opzioni specificate"
+
+msgid "can't specify --all and patterns"
+msgstr "non è possibile specificare pattern e --all"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+"nessun file o directory specificata; usare --all per rieffettuare il merge "
+"di tutti i file"
+
+msgid "restore individual files or directories to an earlier state"
+msgstr "ripristina file singoli o directory ad uno stato precedente"
+
+msgid ""
+" .. note::\n"
+" This command is most likely not what you are looking for.\n"
+" Revert will partially overwrite content in the working\n"
+" directory without changing the working directory parents. Use\n"
+" :hg:`update -r rev` to check out earlier revisions, or\n"
+" :hg:`update --clean .` to undo a merge which has added another\n"
+" parent."
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" Se nessuna revisione viene specificata, i file o directory\n"
+" specificati vengono riportati al contenuto che avevano nel\n"
+" genitore della directory di lavoro. Questo ripristina il contenuto\n"
+" dei file interessati ad uno stato non modificato e annulla\n"
+" aggiunte, rimozioni, copie e rinomine. Se la directory di lavoro\n"
+" ha due genitori, è necessario specificare esplicitamente la\n"
+" revisione a cui tornare."
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See :hg:`help\n"
+" dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Usando l'opzione -r(--rev, riporta i dati file o directory al loro\n"
+" contenuto ad una specifica revisione. Questo può essere utile per\n"
+" effettuare il \"roll back\" di alcune o tutte le modifiche\n"
+" precedenti. Vedere :hg:`help dates` per un elenco dei formati\n"
+" validi per -d/--date."
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+" Revert modifica la directory di lavoro. Non effettua il commit di\n"
+" alcuna modifica, nè cambia i genitori della directory di lavoro. Se\n"
+" si effettua il revert ad una revisione differente di quella del\n"
+" genitore della directory di lavoro, i file interessati appariranno\n"
+" quindi in seguito modificati."
+
+msgid ""
+" If a file has been deleted, it is restored. If the executable mode\n"
+" of a file was changed, it is reset."
+msgstr ""
+" Se un file è stato cancellato viene ripristinato. Se è stato\n"
+" modificato il flag di esecuzione di un file, questo viene resettato."
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+" Se vengono forniti nomi, tutti i file corrispondenti ai nomi\n"
+" vengono ripristinati. Se non vengono forniti argomenti nessun file\n"
+" viene ripristinato."
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" I file modificati vengono salvati con un suffisso .orig prima di\n"
+" essere ripristinati. Per disabilitare questi backup, usare\n"
+" --no-backup. "
+
+msgid "you can't specify a revision and a date"
+msgstr "non è possibile specificare sia una revisione sia una data"
+
+msgid "uncommitted merge - use \"hg update\", see \"hg help revert\""
+msgstr ""
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+"nessun file o directory specificati; usare --all per ripristinare l'intero "
+"repository"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "sto dimenticandomi di %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "sto ripristinando %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "sto annullando la rimozione di %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "sto salvando la versione corrente di %s come %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "file non gestito: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "nessuna modifica richiesta per %s\n"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "effettua il rollback dell'ultima transazione (pericoloso)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" Questo comando dovrebbe essere usato con cautela. Esiste un solo\n"
+" livello di rollback e non c'è modo di annullare un rollback.\n"
+" Ripristinerà anche il dirstate al tempo dell'ultima transazione,\n"
+" perdendo qualunque modifica ad esso da quel momento in poi.\n"
+" Questo comando non altera la copia di lavoro."
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+" Le transazioni sono usate per incapsulare gli effetti di tutti i\n"
+" comandi che creano nuovi changeset o propagano changeset esistenti\n"
+" in un altro repository. Ad esempio, i seguenti comandi sono\n"
+" usano transazioni ed è possibile effettuare il rollback dei loro\n"
+" effetti:"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (con questo repository come destinazione)\n"
+" - unbundle"
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" L'uso di questo comando non è inteso per repository pubblici. Una\n"
+" volta che le modifiche sono visibili per il pull da parte di altri\n"
+" utenti, effettuare il rollback locale di una transazione non ha\n"
+" effetti (qualcun'altro potrebbe aver già effettuato il pull delle\n"
+" modifiche). Inoltre, è possibile che si verifichi una competizione\n"
+" con i lettori del repository; ad esempio un pull in corso dal\n"
+" repository potrebbe fallire se viene effettuato un rollback. "
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr "stampa la radice (top) della directory di lavoro corrente"
+
+msgid " Print the root directory of the current repository."
+msgstr " Stampa la directory radice del repository corrente. "
+
+msgid "start stand-alone webserver"
+msgstr ""
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" Di default i log del server vengono inviati allo stdout e gli\n"
+" errori allo stderr. Usare le opzion -A/--accesslog e \n"
+" -E/--errorlog\" per effettuare il log su file."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "Non esiste alcun repository Mercurial qui (.hg non trovata)"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "in ascolto su http://%s%s/%s (limitato a %s:%d)\n"
+
+msgid "show changed files in the working directory"
+msgstr ""
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+
+msgid " The codes used to show the status of files are::"
+msgstr ""
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr ""
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "genitore: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (repository vuoto)"
+
+msgid " (no revision checked out)"
+msgstr " (nessuna revisione in check out)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d modified"
+msgstr "%d modificati"
+
+#, python-format
+msgid "%d added"
+msgstr "%d aggiunti"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d rimossi"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d rinominati"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d copiati"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d cancellati"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d sconosciuti"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignorati"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d non risolti"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d subrepository"
+
+msgid " (merge)"
+msgstr ""
+
+msgid " (new branch)"
+msgstr " (nuovo branch)"
+
+msgid " (head closed)"
+msgstr " (head chiusa)"
+
+msgid " (clean)"
+msgstr " (pulito)"
+
+msgid " (new branch head)"
+msgstr " (nuova head per il branch)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr ""
+
+msgid "update: (current)\n"
+msgstr "update: (aggiornato)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "update: %d nuovi changeset (update)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "update: %d nuovi changeset, %d head del branch (merge)\n"
+
+msgid "1 or more incoming"
+msgstr "1 o più in arrivo"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d in uscita"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d segnalibri in ingresso"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d segnalibri in uscita"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "remoto: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "remoto: (sincronizzato)\n"
+
+msgid "add one or more tags for the current or given revision"
+msgstr "aggiunge una o più tag per la revisione corrente o quella data"
+
+msgid " Name a particular revision using <name>."
+msgstr " Nomina una revisione particolare usando <nome>."
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" I tag sono usate per dare un nome a revisioni particolari del\n"
+" repository e sono molto utili per confrontare revisioni\n"
+" differenti, per tornare indietro a versioni precedenti\n"
+" significative o per marcare punti di branch come release, ecc.\n"
+" La modifica di un tag esistente di norma non è consentito;\n"
+" usare -f/--force per sovrascriverle."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" Se nessuna revisione viene fornita, viene usato il genitore della\n"
+" directory di lavoro, o tip se non si è effettuato il check out di\n"
+" nessuna revisione."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" Per facilitare il controllo di versione, la distribuzione e il\n"
+" merge di tag, sono memorizzate nel file chiamato \".hgtags\" che è\n"
+" gestito analogamente ad altri file del progetto e può essere\n"
+" modificato manualmente se necessario. Questo significa anche che\n"
+" effettuare il tagging crea un nuovo commit. Il file \".hg/localtags\" è\n"
+" usato per le tag locali (non condivise tra repository)."
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr "i nomi delle tag devono essere univoci"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "i nomi dei tag non possono consistere interamente di spazi bianchi"
+
+msgid "--rev and --remove are incompatible"
+msgstr "--rev e --remove sono incompatibili"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "la tag '%s' non esiste"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "la tag '%s' non è una tag globale"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "la tag '%s' non è una tag locale"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "la tag '%s' esiste già (usare -f per forzare)"
+
+msgid "uncommitted merge"
+msgstr "merge con commit in sospeso"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "non ad una head di una branch (usare -f per forzare l'operazione)"
+
+msgid "list repository tags"
+msgstr "elenca le tag del repository"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Questo elenca sia le tag regolari sia le tag locali. Quando viene usata "
+"l'opzione -v/--verbose\n"
+" una terza colonna \"local\" viene stampata per le tag locali."
+
+msgid "show the tip revision"
+msgstr "mostra la revisione tip"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" La revisione tip (di solito chiamata solo tip) è il changeset\n"
+" aggiunto più di recente al repository (e quindi l'head modificata\n"
+" più recentemente.)"
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" Se si è appena fatto un commit, quel commit sarà il tip. Se si ha\n"
+" appena fatto il pull di modifiche da un altro repository, il tip\n"
+" di quel repository diventa il tip corrente. La tag \"tip\" tag è\n"
+" speciale e non può essere rinominata o assegnata ad un changeset\n"
+" differente."
+
+msgid "apply one or more changegroup files"
+msgstr "applica uno o più file changegroup"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+" Applica uno o più file changegroup compressi generati dal\n"
+" comando bundle."
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+
+msgid "update working directory (or switch revisions)"
+msgstr "aggiorna la directory di lavoro (o passa a un'altra revisione)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch."
+msgstr ""
+" Aggiorna la directory di lavoro del repository ad una revisione\n"
+" specifica. Se non viene specificato alcun changeset, aggiorna\n"
+" al tip del named branch corrente."
+
+msgid ""
+" If the changeset is not a descendant of the working directory's\n"
+" parent, the update is aborted. With the -c/--check option, the\n"
+" working directory is checked for uncommitted changes; if none are\n"
+" found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+
+msgid ""
+" If you want to update just one file to an older changeset, use\n"
+" :hg:`revert`."
+msgstr ""
+" Se si desidera aggiornare solo un file ad una revisione più\n"
+" vecchia, usare :hg:`revert`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "non è possibile specificare sia -c/--check sia -C/--clean"
+
+msgid "uncommitted local changes"
+msgstr "modifiche locali di cui non si è effettuato il commit"
+
+msgid "verify the integrity of the repository"
+msgstr "verifica l'integrità del repository"
+
+msgid " Verify the integrity of the current repository."
+msgstr " Verifica l'integrità del repository corrente."
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Questo comando eseguirà un controllo estensivo dell'integrità del\n"
+" repository validando gli hash e i checksum di ogni voce nel\n"
+" changelog, manifesto, e file tracciati, così come l'integrità dei\n"
+" loro link incrociati e indici. "
+
+msgid "output version and copyright information"
+msgstr "stampa la versione e le informazioni di copyright"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Mercurial SCM Distribuito (versione %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr ""
+
+msgid ""
+"Copyright (C) 2005-2011 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2011 Matt Mackall e altri\n"
+"Questo è software libero; vedere i sorgenti per le condizioni di copia.\n"
+"Non c'è ALCUNA garanzia; neppure di COMMERCIABILITÀ o IDONEITÀ AD UNO\n"
+"SCOPO PARTICOLARE.\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr "directory radice del repository o nome del file bundle"
+
+msgid "DIR"
+msgstr ""
+
+msgid "change working directory"
+msgstr "cambia la directory di lavoro"
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr "non chiedere conferma, assume 'yes' per ogni risposta richiesta"
+
+msgid "suppress output"
+msgstr "sopprime l'output"
+
+msgid "enable additional output"
+msgstr "abilita output aggiuntivo"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr ""
+"imposta/sovrascrive l'opzione di configurazione (usare 'sezione."
+"nome=valore')"
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr "abilita output di debug"
+
+msgid "start debugger"
+msgstr "avvia il debugger"
+
+msgid "set the charset encoding"
+msgstr "imposta la codifica dei caratteri"
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr "imposta la modalità di codifica dei caratteri"
+
+msgid "always print a traceback on exception"
+msgstr "stampa sempre un traceback in seguito ad eccezioni"
+
+msgid "time how long the command takes"
+msgstr "misura quanto tempo impiega il comando"
+
+msgid "print command execution profile"
+msgstr "stampa il profilo di esecuzione dei comandi"
+
+msgid "output version information and exit"
+msgstr "stampa informazioni sulla versione ed esce"
+
+msgid "display help and exit"
+msgstr "mostra l'aiuto ed esce"
+
+msgid "do not perform actions, just print output"
+msgstr "non esegue azioni, stampa solamente l'output"
+
+msgid "specify ssh command to use"
+msgstr "specifica il comando ssh da usare"
+
+msgid "specify hg command to run on the remote side"
+msgstr "specifica il comando hg da eseguire in remoto"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+
+msgid "PATTERN"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr "include nomi che corrispondono ai pattern dati"
+
+msgid "exclude names matching the given patterns"
+msgstr "esclude nomi che corrispondono ai pattern dati"
+
+msgid "use text as commit message"
+msgstr "usa text come messaggio di commit"
+
+msgid "read commit message from file"
+msgstr "legge il messaggio di commit dal file"
+
+msgid "record datecode as commit date"
+msgstr "registra il datecode come data del commit"
+
+msgid "record the specified user as committer"
+msgstr "registra l'utente specificato come autore del commit"
+
+msgid "STYLE"
+msgstr ""
+
+msgid "display using template map file"
+msgstr "mostra usando un file mappa template"
+
+msgid "display with template"
+msgstr "mostra con un template"
+
+msgid "do not show merges"
+msgstr "non mostrare i merge"
+
+msgid "output diffstat-style summary of changes"
+msgstr ""
+
+msgid "treat all files as text"
+msgstr "tratta tutti i file come testo"
+
+msgid "omit dates from diff headers"
+msgstr "non includere le date nelle intestazioni dei diff"
+
+msgid "show which function each change is in"
+msgstr "mostra in quale funzione si trova ogni modifica"
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr "ignora spazi bianchi quando si confrontano righe"
+
+msgid "ignore changes in the amount of white space"
+msgstr "ignora le modifiche nel conteggio degli spazi bianchi"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "ignora le modifiche le cui righe sono tutte vuote"
+
+msgid "number of lines of context to show"
+msgstr "numero di righe di contesto da mostrare"
+
+msgid "SIMILARITY"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "stima i file rinominati per similarità (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "ricorre nei subrepository"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[OPZIONE]... [FILE]..."
+
+msgid "annotate the specified revision"
+msgstr "annota la revisione specificata"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr ""
+
+msgid "don't follow copies and renames"
+msgstr "non seguire le copie e le rinomine"
+
+msgid "list the author (long with -v)"
+msgstr "elenca l'autore (verboso con -v)"
+
+msgid "list the filename"
+msgstr "elenca il nome del file"
+
+msgid "list the date (short with -q)"
+msgstr "elenca la data (breve con -q)"
+
+msgid "list the revision number (default)"
+msgstr "elenca il numero di revisione (default)"
+
+msgid "list the changeset"
+msgstr "elenca il changeset"
+
+msgid "show line number at the first appearance"
+msgstr "mostra il numero di riga alla prima apparizione"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+
+msgid "do not pass files through decoders"
+msgstr "non passare file attraverso decodificatori"
+
+msgid "PREFIX"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr "prefisso di directory per i file nell'archivio"
+
+msgid "revision to distribute"
+msgstr "revisione da distribuire"
+
+msgid "type of distribution to create"
+msgstr "tipo di distribuzione da creare"
+
+msgid "[OPTION]... DEST"
+msgstr "[OPZIONE]... DEST"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "effettua il merge con il vecchio dirstate del genitore dopo il backout"
+
+msgid "parent to choose when backing out merge"
+msgstr "il genitore da scegliere quando effettuare il backout del merge"
+
+msgid "specify merge tool"
+msgstr "specifica lo strumento da usare per i merge"
+
+msgid "revision to backout"
+msgstr "revisione di cui effettuare il backout"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[OPZIONE]... [-r] REV"
+
+msgid "reset bisect state"
+msgstr "resetta lo stato di bisect"
+
+msgid "mark changeset good"
+msgstr "marca il changeset come buono"
+
+msgid "mark changeset bad"
+msgstr "marca il changeset come cattivo"
+
+msgid "skip testing changeset"
+msgstr "salta il changeset di test"
+
+msgid "use command to check changeset state"
+msgstr "usa il comando per controllare lo stato del changeset"
+
+msgid "do not update to target"
+msgstr "non aggiornare a target"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c CMD] [REV]"
+
+msgid "force"
+msgstr "forza"
+
+msgid "delete a given bookmark"
+msgstr "elimina un dato segnalibro"
+
+msgid "rename a given bookmark"
+msgstr "rinomina un dato segnalibro"
+
+msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-m NOME] [-r REV] [NOME]"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "imposta il nome della branch anche se nasconde una branch esistente"
+
+msgid "reset branch name to parent branch name"
+msgstr "resetta il nome della branch al nome della branch genitore"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NOME]"
+
+msgid "show only branches that have unmerged heads"
+msgstr ""
+"mostra solo le branch che hanno head di cui non si è effettuato il merge"
+
+msgid "show normal and closed branches"
+msgstr ""
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "run even when the destination is unrelated"
+msgstr "esegui anche quando la destinazione non è correlata"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "un changeset inteso per l'aggiunta alla destinazione"
+
+msgid "a specific branch you would like to bundle"
+msgstr "un branch specifico di cui si desidera creare il bundle"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "un changeset base di cui si assume la disponibilità alla destinazione"
+
+msgid "bundle all changesets in the repository"
+msgstr "effettua il bundle di tutti i changeset nel repository"
+
+msgid "bundle compression type to use"
+msgstr "tipo di compressione da usare per il bundle"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TIPO] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+
+msgid "print output to file with formatted name"
+msgstr "stampa l'output su file con un nome formattato"
+
+msgid "print the given revision"
+msgstr "stampa la data revisione"
+
+msgid "apply any matching decode filter"
+msgstr "applica qualunque filtro di decodifica corrispondente"
+
+msgid "[OPTION]... FILE..."
+msgstr "[OPZIONE]... FILE..."
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "il clone conterrà una copia di lavoro vuota (solo un repository)"
+
+msgid "revision, tag or branch to check out"
+msgstr "revisione, tag o branch da reperire"
+
+msgid "include the specified changeset"
+msgstr "include il changeset specificato"
+
+msgid "clone only the specified branch"
+msgstr "clona solo il branch specificato"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[OPZIONE]... SORGENTE [DEST]"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+"marca file nuovi/mancanti come aggiunti/rimossi prima di effettuare il commit"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "marca una branch come chiusa, nascondendola dall'elenco delle branch"
+
+msgid "record a copy that has already occurred"
+msgstr "registra una copia che si è già verificata"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "forza una copia su un file gestito esistente"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[OPZIONI]... [SORGENTE]... DEST"
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[INDICE] REV1 REV2"
+
+msgid "add single file mergeable changes"
+msgstr ""
+"aggiunge singole modifiche ai file di cui è possibile effettuare il merge"
+
+msgid "add single file all revs append to"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... TEXT"
+msgstr "[OPZIONE]... TESTO"
+
+msgid "[COMMAND]"
+msgstr "[COMANDO]"
+
+msgid "show the command options"
+msgstr "mostra le opzioni dei comandi"
+
+msgid "[-o] CMD"
+msgstr "[-o] CMD"
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr "annota con i nomi dei branch"
+
+msgid "use dots for runs"
+msgstr "usa i punti per le esecuzioni"
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[OPZIONE]... [FILE [REV]...]"
+
+msgid "try extended date formats"
+msgstr "prova formati di date estesi"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATA [RANGE]"
+
+msgid "FILE REV"
+msgstr "FILE REV"
+
+msgid "[PATH]"
+msgstr "[PERCORSO]"
+
+msgid "revlog format"
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr "revisione alla quale ricostruire"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r REV] [REV]"
+
+msgid "revision to debug"
+msgstr "revisione di cui fare il debug"
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] FILE"
+
+msgid "REV1 [REV2]"
+msgstr "REV1 [REV2]"
+
+msgid "do not display the saved mtime"
+msgstr "non mostrare l'mtime salvato"
+
+msgid "[OPTION]..."
+msgstr "[OPZIONE]..."
+
+msgid "revision to check"
+msgstr "revisione da controllare"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPZIONE]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+
+msgid "diff against the second parent"
+msgstr "effettua il diff con il secondo genitore"
+
+msgid "revisions to export"
+msgstr "revisioni da esportare"
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr "[OPZIONE]... [-o OUTFILESPEC] REV..."
+
+msgid "end fields with NUL"
+msgstr "termina i campi con NUL"
+
+msgid "print all revisions that match"
+msgstr "stampa tutte le revisioni che corrispondono"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"segue la storia del changeset, o la storia del file attraverso copie e "
+"rinomine"
+
+msgid "ignore case when matching"
+msgstr "ignora il case quando si cercano corrispondenze"
+
+msgid "print only filenames and revisions that match"
+msgstr "stampa solo i nomi dei file e le revisioni che corrispondono"
+
+msgid "print matching line numbers"
+msgstr "stampa i numeri di riga corrispondenti"
+
+msgid "only search files changed within revision range"
+msgstr "cerca solo i file modificati nell'intervallo di revisioni"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[OPZIONE]... PATTERN [FILE]..."
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "mostra solo le head che sono discendenti di REVINIZIALE"
+
+msgid "STARTREV"
+msgstr ""
+
+msgid "show topological heads only"
+msgstr ""
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "mostra solo le teste dei branch attive (DEPRECATO)"
+
+msgid "show normal and closed branch heads"
+msgstr ""
+
+msgid "[-ac] [-r STARTREV] [REV]..."
+msgstr "[-ac] [-r REVINIZIALE] [REV]..."
+
+msgid "[TOPIC]"
+msgstr "[ARGOMENTO]"
+
+msgid "identify the specified revision"
+msgstr "identifica la revisione specificata"
+
+msgid "show local revision number"
+msgstr "mostra il numero locale della revisione"
+
+msgid "show global revision id"
+msgstr "mostra id globale della revisione"
+
+msgid "show branch"
+msgstr "mostra le branch"
+
+msgid "show tags"
+msgstr "mostra le tag"
+
+msgid "show bookmarks"
+msgstr "mostra i segnalibri"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [SORGENTE]"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+"opzione di rimozione della directory per patch. Questa ha lo stesso\n"
+"significato dell'opzione corrispondente di patch"
+
+msgid "PATH"
+msgstr "PERCORSO"
+
+msgid "base path"
+msgstr "percorso base"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+"salta il controllo di modifiche pendenti di cui non si è effettuato il commit"
+
+msgid "don't commit, just update the working directory"
+msgstr "non effettuare il commit, aggiorna solo la directory di lavoro"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "applica la patch al nodo da cui è stata generata"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr "usa ogni informazione sul branch nella patch (implicato da --exact)"
+
+msgid "[OPTION]... PATCH..."
+msgstr "[OPZIONE]... PATCH..."
+
+msgid "run even if remote repository is unrelated"
+msgstr "esegui anche se il repository remoto non è correlato"
+
+msgid "show newest record first"
+msgstr "mostra prima il record più nuovo"
+
+msgid "file to store the bundles into"
+msgstr "file in cui salvare i bundle"
+
+msgid "a remote changeset intended to be added"
+msgstr "un changeset remoto inteso per l'aggiunta"
+
+msgid "compare bookmarks"
+msgstr "confronta i segnalibri"
+
+msgid "a specific branch you would like to pull"
+msgstr "un branch specifico di cui si desidera fare il pull"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle NOME_FILE] [SORGENTE]"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "search the repository as it is in REV"
+msgstr "cerca nel repository per come era in REV"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "termina il nome dei file con NUL, da usare con xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "stampa i percorsi completi dalla radice del filesystem"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[OPZIONE]... [PATTERN]..."
+
+msgid "only follow the first parent of merge changesets"
+msgstr "segui solo il primo genitore di un changeset di merge"
+
+msgid "show revisions matching date spec"
+msgstr "mostra le revisioni che corrispondono ad una data fornita"
+
+msgid "show copied files"
+msgstr "mostra i file copiati"
+
+msgid "do case-insensitive search for a given text"
+msgstr "effettua una ricerca case-insensitive di un testo specificato"
+
+msgid "include revisions where files were removed"
+msgstr "include le revisioni in cui sono stati rimossi dei file"
+
+msgid "show only merges"
+msgstr "mostra solo i merge"
+
+msgid "revisions committed by user"
+msgstr "revisioni il cui commit è stato effettuato dall'utente"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr ""
+"mostra solo i changeset all'interno della data named branch (DEPRECATO)"
+
+msgid "show changesets within the given named branch"
+msgstr "mostra i changeset all'interno del named branch specificato"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "non mostrare la revisione o qualche suo antenato"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPZIONE]... [FILE]"
+
+msgid "revision to display"
+msgstr "revisione da mostrare"
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "force a merge with outstanding changes"
+msgstr "forza un merge con modifiche pendenti"
+
+msgid "revision to merge"
+msgstr "revisione di cui fare il merge"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "un changeset intest per l'inclusione nella destinazione"
+
+msgid "a specific branch you would like to push"
+msgstr "un branch specifico di cui si desidera fare il push"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+
+msgid "show parents of the specified revision"
+msgstr "mostra i genitori della revisione specificata"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [FILE]"
+
+msgid "[NAME]"
+msgstr "[NOME]"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr ""
+"aggiorna alla nuova head del branch se si è effettuato il pull di changeset"
+
+msgid "run even when remote repository is unrelated"
+msgstr "esegui anche quando il repository remoto non è collegato"
+
+msgid "BOOKMARK"
+msgstr ""
+
+msgid "bookmark to pull"
+msgstr "segnalibro da importare"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SORGENTE]"
+
+msgid "force push"
+msgstr "forza il push"
+
+msgid "bookmark to push"
+msgstr "segnalibro da esportare"
+
+msgid "allow pushing a new branch"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "record delete for missing files"
+msgstr "registra cancellazione per i file mancanti"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "rimuove (e cancella) i file anche se sono stati aggiunti o modificati"
+
+msgid "record a rename that has already occurred"
+msgstr "registra una rinomina che si è già verificata"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[OPZIONE]... SORGENTE... DEST"
+
+msgid "select all unresolved files"
+msgstr "seleziona tutti i file non risolti"
+
+msgid "list state of files needing merge"
+msgstr "elenca lo stato dei file che necessitano merge"
+
+msgid "mark files as resolved"
+msgstr "marca i file come risolti"
+
+msgid "mark files as unresolved"
+msgstr "marca i file come non risolti"
+
+msgid "hide status prefix"
+msgstr "nascondi il prefisso di stato"
+
+msgid "revert all changes when no arguments given"
+msgstr "annulla tutte le modifiche quando nessun argomento è stato fornito"
+
+msgid "tipmost revision matching date"
+msgstr "la revisione più vicina a tip corrispondente alla data"
+
+msgid "revert to the specified revision"
+msgstr "ritorna alla revisione specificata"
+
+msgid "do not save backup copies of files"
+msgstr "non salva copie di backup dei file"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[OPZIONE]... [-r REV] [NOME]..."
+
+msgid "name of access log file to write to"
+msgstr "nome del file di log degli accessi su cui scrivere"
+
+msgid "name of error log file to write to"
+msgstr "nome del file di log degli errori su cui scrivere"
+
+msgid "PORT"
+msgstr ""
+
+msgid "port to listen on (default: 8000)"
+msgstr "porta su cui stare in ascolto (default: 8000)"
+
+msgid "ADDR"
+msgstr ""
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "indirizzo su cui stare in ascolto (default: tutte le interfacce)"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "prefisso del percorso da cui servire (default: radice del server)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr "nome da mostrare nelle pagine web (default: la directory di lavoro)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "nome del file di configurazione hgweb (vedere \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr "per i client remoti"
+
+msgid "web templates to use"
+msgstr "template web da usare"
+
+msgid "template style to use"
+msgstr "stile dei template da usare"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "usa IPv6 in aggiunta ad IPv4"
+
+msgid "SSL certificate file"
+msgstr "file del certificato SSL"
+
+msgid "show untrusted configuration options"
+msgstr "mostra le opzioni di configurazioni non affidabili"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [NOME]..."
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "show status of all files"
+msgstr "mostra lo stato di tutti i file"
+
+msgid "show only modified files"
+msgstr "mostra solo i file modificati"
+
+msgid "show only added files"
+msgstr "mostra solo i file aggiunti"
+
+msgid "show only removed files"
+msgstr "mostra solo i file rimossi"
+
+msgid "show only deleted (but tracked) files"
+msgstr "mostra solo i file rimossi (ma tracciati)"
+
+msgid "show only files without changes"
+msgstr "mostra solo i file senza modifiche"
+
+msgid "show only unknown (not tracked) files"
+msgstr "mostra solo i file sconosciuti (non tracciati)"
+
+msgid "show only ignored files"
+msgstr "mostra solo i file ignorati"
+
+msgid "show source of copied files"
+msgstr "mostra la sorgente dei file copiati"
+
+msgid "show difference from revision"
+msgstr "mostra le differenze dalla revisione"
+
+msgid "list the changed files of a revision"
+msgstr "elenca i file modificati di una revisione"
+
+msgid "force tag"
+msgstr "forza il tag"
+
+msgid "make the tag local"
+msgstr "rendi la tag locale"
+
+msgid "revision to tag"
+msgstr "revisione da taggare"
+
+msgid "remove a tag"
+msgstr "rimuove una tag"
+
+msgid "use <text> as commit message"
+msgstr "usa <text> come messaggio di commit"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TESTO] [-d DATA] [-u UTENTE] [-r REV] NOME..."
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr ""
+"aggiorna alla nuova head del branch se changeset sono stati estratti da un "
+"bundle"
+
+msgid "[-u] FILE..."
+msgstr "[-u] FILE..."
+
+msgid "discard uncommitted changes (no backup)"
+msgstr ""
+"scarta modifiche di cui non è stato effettuato il commit (nessun backup)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr ""
+"aggiorna tra branch se non ci modifiche in sospeso di cui non si è "
+"effettuato il commit"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATA] [[-r] REV]"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "impossibile includere %s (%s)"
+
+msgid "not found in manifest"
+msgstr "non trovato nel manifesto"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "nessun file alla revisione %s"
+
+msgid "branch name not in UTF-8!"
+msgstr "il nome della branch non è in UTF-8!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s non esiste!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+"%s non aggiunto: attualmente solo file e link simbolici sono supportati\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s è già tracciato!\n"
+
+#, python-format
+msgid "%s not added!\n"
+msgstr "%s non aggiunto!\n"
+
+#, python-format
+msgid "%s still exists!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s non è tracciato!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr ""
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "carattere non valido nella descrizione del dag: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr ""
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr "tipo di evento invalido nel dag: %s"
+
+msgid "working directory state appears damaged!"
+msgstr "lo stato della directory di lavoro risulta danneggiato!"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' e '\\r' non sono consentiti nei nomi dei file: %r"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "la directory %r è già nel dirstate"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr "il file %r nel dirstate collide con %r"
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+#, python-format
+msgid "not in dirstate: %s\n"
+msgstr "non nel dirstate: %s\n"
+
+msgid "unknown"
+msgstr "sconosciuto"
+
+msgid "character device"
+msgstr "device a caratteri"
+
+msgid "block device"
+msgstr "device a blocchi"
+
+msgid "fifo"
+msgstr "fifo"
+
+msgid "socket"
+msgstr "socket"
+
+msgid "directory"
+msgstr "directory"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "tipo di file non supportato (il tipo è %s)"
+
+msgid "searching for changes\n"
+msgstr "sto cercando modifiche\n"
+
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr "ricerca in corso"
+
+msgid "already have changeset "
+msgstr ""
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr "il repository non è imparentato"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "push crea nuovi branch remoti: %s!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "usare 'hg push --new-branch' per creare nuovi branch remoti"
+
+#, python-format
+msgid "push creates new remote heads on branch '%s'!"
+msgstr "push crea nuove head remote sul branch '%s'!"
+
+msgid "push creates new remote heads!"
+msgstr "push crea nuove head remote!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr ""
+"dovresti fare il pull e il merge o usare push -f per forzare l'operazione"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "ti sei dimenticato di effettuare il merge? usare push -f per forzare"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "nota: modifiche remote non sincronizzate!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "abortito: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: errore di parsing a %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: errore di parsing: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: il comando '%s' è ambiguo:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "tempo esaurito per l'attesa del lock tenuto da %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "lock tenuto da %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "abortito: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "abortito: impossibile acquisire il lock su %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "abortito: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "abortito: %s"
+
+msgid " empty string\n"
+msgstr "stringa vuota\n"
+
+msgid "killed!\n"
+msgstr "ucciso!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: comando '%s' sconosciuto\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(ti sei dimenticato di compilare le estensioni?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(l'installazione di Python è corretta?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "abortito: errore: %s\n"
+
+msgid "broken pipe\n"
+msgstr "pipe rotta\n"
+
+msgid "interrupted!\n"
+msgstr "interrotto!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"pipe rotta\n"
+
+msgid "abort: out of memory\n"
+msgstr "abortito: memoria esaurita\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr ""
+"** incontrata eccezione sconosciuta, si prega di segnalarla visitando\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr ""
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial SCM Distribuito (versione %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Estensioni caricate: %s\n"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"No argument found for substitution of %i variable in alias '%s' definition."
+msgstr ""
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "l'alias '%s' corrisponde al comando sconosciuto '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "l'alias '%s' corrisponde al comando ambiguo '%s'\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr "opzione --config malformata: %r (usare --config sezione.nome=valore)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "errore nel reperimento della directory di lavoro corrente: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "l'estensione '%s' rimpiazza i comandi: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "l'opzione --config non può essere abbreviata!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "l'opzione --cwd non può essere abbreviata!"
+
+msgid ""
+"Option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "il repository '%s' non è locale"
+
+msgid "warning: --repository ignored\n"
+msgstr "attenzione: --repository ignorata\n"
+
+msgid "invalid arguments"
+msgstr "argomenti non validi"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** fallita l'importazione dell'estensione %s da %s: %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** fallita l'importazione dell'estensione %s: %s\n"
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "attenzione: errore nella ricerca di comandi in %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "non è stato possibile trovare il tool per il merge %s\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "il tool %s non può gestire link simbolici\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "il tool %s non può gestire file binari\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "il tool %s richiede una GUI\n"
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "sto effettuando il merge di %s e %s in %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "sto effettuando il merge di %s\n"
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "merge di %s fallito!\n"
+
+msgid "starting revisions are not directly related"
+msgstr "le revisioni di partenza non sono direttamente correlate"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "etato inconsistente, %s:%s è sia buona sia errata"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "disabled extensions:"
+msgstr "estensioni disabilitate:"
+
+msgid "Configuration Files"
+msgstr ""
+
+msgid "Date Formats"
+msgstr "Formati della data"
+
+msgid "File Name Patterns"
+msgstr "Pattern dei Nomi dei File"
+
+msgid "Environment Variables"
+msgstr "Variabili d'ambiente"
+
+msgid "Specifying Single Revisions"
+msgstr ""
+
+msgid "Specifying Multiple Revisions"
+msgstr "Specificare Revisioni Multiple"
+
+msgid "Specifying Revision Sets"
+msgstr "Specificare Insiemi di Revisioni"
+
+msgid "Diff Formats"
+msgstr "Formati di diff"
+
+msgid "Merge Tools"
+msgstr ""
+
+msgid "Template Usage"
+msgstr ""
+
+msgid "URL Paths"
+msgstr "Percorsi URL"
+
+msgid "Using additional features"
+msgstr "Uso di funzionalità aggiuntive"
+
+msgid "Subrepositories"
+msgstr "Subrepository"
+
+msgid "Configuring hgweb"
+msgstr ""
+
+msgid "Glossary"
+msgstr ""
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"Below we list the most specific file first."
+msgstr ""
+
+msgid "On Windows, these configuration files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>\\.hg\\hgrc``\n"
+"- ``%USERPROFILE%\\.hgrc``\n"
+"- ``%USERPROFILE%\\mercurial.ini``\n"
+"- ``%HOME%\\.hgrc``\n"
+"- ``%HOME%\\mercurial.ini``\n"
+"- ``C:\\mercurial\\mercurial.ini`` (unless regkey or hgrc.d\\ or mercurial."
+"ini found)\n"
+"- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (unless hgrc.d\\ or mercurial."
+"ini found)\n"
+"- ``<hg.exe-dir>\\hgrc.d\\*.rc`` (unless mercurial.ini found)\n"
+"- ``<hg.exe-dir>\\mercurial.ini``"
+msgstr ""
+
+msgid "On Unix, these files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>/.hg/hgrc``\n"
+"- ``$HOME/.hgrc``\n"
+"- ``/etc/mercurial/hgrc``\n"
+"- ``/etc/mercurial/hgrc.d/*.rc``\n"
+"- ``<install-root>/etc/mercurial/hgrc``\n"
+"- ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+"If there is a per-repository configuration file which is not owned by\n"
+"the active user, Mercurial will warn you that the file is skipped::"
+msgstr ""
+
+msgid ""
+" not trusting file <repo>/.hg/hgrc from untrusted user USER, group GROUP"
+msgstr ""
+
+msgid ""
+"If this bothers you, the warning can be silenced (the file would still\n"
+"be ignored) or trust can be established. Use one of the following\n"
+"settings, the syntax is explained below:"
+msgstr ""
+
+msgid ""
+"- ``ui.report_untrusted = False``\n"
+"- ``trusted.users = USER``\n"
+"- ``trusted.groups = GROUP``"
+msgstr ""
+
+msgid ""
+"The configuration files for Mercurial use a simple ini-file format. A\n"
+"configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries::"
+msgstr ""
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. Please see the hgrc man page for a full\n"
+"description of the possible configuration values:"
+msgstr ""
+
+msgid ""
+"- on Unix-like systems: ``man hgrc``\n"
+"- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr ""
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr ""
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr ""
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+"This is the internal representation format for dates. unixtime is the\n"
+"number of seconds since the epoch (1970-01-01 00:00 UTC). offset is\n"
+"the offset of the local timezone, in seconds west of UTC (negative if\n"
+"the timezone is east of UTC)."
+msgstr ""
+
+msgid "The log command also accepts date ranges:"
+msgstr ""
+
+msgid ""
+"- ``<{datetime}`` - at or before a given date/time\n"
+"- ``>{datetime}`` - on or after a given date/time\n"
+"- ``{datetime} to {datetime}`` - a date range, inclusive\n"
+"- ``-{days}`` - within a given number of days of today\n"
+msgstr ""
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use configuration file)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+
+msgid "You may also specify the full path to an extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Changeset, close'."
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+"Named branch\n"
+" Vedere 'Branch, named'."
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+"Genitore della directory di lavoro\n"
+" Vedere 'Genitore, directory di lavoro'.\n"
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a collection of them. In the latter case, a special\n"
+"configuration file can be used to specify the repository paths to use\n"
+"and global web configuration options."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as hgrc configuration files, but only\n"
+"the following sections are recognized:"
+msgstr ""
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+
+msgid ""
+"The ``web`` section can specify all the settings described in the web\n"
+"section of the hgrc documentation."
+msgstr ""
+
+msgid ""
+"The ``paths`` section provides mappings of physical repository\n"
+"paths to virtual ones. For instance::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" projects/a = /foo/bar\n"
+" projects/b = /baz/quux\n"
+" web/root = /real/root/*\n"
+" / = /real/root2/*\n"
+" virtual/root2 = /real/root2/**"
+msgstr ""
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry maps every Mercurial repository found in '/real/root'\n"
+" into 'web/root'. This format is preferred over the [collections] one,\n"
+" since using absolute paths as configuration keys is not supported on "
+"every\n"
+" platform (especially on Windows).\n"
+"- The fourth entry is a special case mapping all repositories in\n"
+" '/real/root2' in the root of the virtual directory.\n"
+"- The fifth entry recursively finds all repositories under the real\n"
+" root, and maps their relative paths under the virtual root."
+msgstr ""
+
+msgid ""
+"The ``collections`` section provides mappings of trees of physical\n"
+"repositories paths to virtual ones, though the paths syntax is generally\n"
+"preferred. For instance::"
+msgstr ""
+
+msgid ""
+" [collections]\n"
+" /foo = /foo"
+msgstr ""
+
+msgid ""
+"Here, the left side will be stripped off all repositories found in the\n"
+"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+"``bar`` and ``quux/baz`` respectively.\n"
+msgstr ""
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+" Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+" Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+" Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+" Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+" Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+" Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+
+msgid "File examples::"
+msgstr ""
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as branch names must be quoted with single or double\n"
+"quotes if they contain characters outside of\n"
+"``[._a-zA-Z0-9\\x80-\\xff]`` or if they match one of the predefined\n"
+"predicates."
+msgstr ""
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+
+msgid "These are the supported infix operators:"
+msgstr ""
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+
+msgid " An alternative syntax is ``x..y``."
+msgstr ""
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+
+msgid "The following predicates are supported:"
+msgstr ""
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ""
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr ""
+
+msgid "- Changesets on the default branch::"
+msgstr "- Changeset sul branch di default::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr ""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr ""
+
+msgid "- Open branch heads::"
+msgstr "- Teste di branch aperte::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr ""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr ""
+
+msgid "- Changesets in committed May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr ""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group. External Mercurial and Subversion projects are currently\n"
+"supported."
+msgstr ""
+
+msgid "Subrepositories are made of three components:"
+msgstr ""
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory, and are Mercurial clones or Subversion\n"
+" checkouts."
+msgstr ""
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path. Subversion repositories are defined with:"
+msgstr ""
+
+msgid " path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"----------------------"
+msgstr ""
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"-----------------------------"
+msgstr ""
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+
+msgid ""
+"Deleting a Subrepository\n"
+"------------------------"
+msgstr ""
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"-----------------------------------"
+msgstr ""
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. It does this by first\n"
+" attempting to commit all modified subrepositories, then recording\n"
+" their state and finally committing it in the parent\n"
+" repository. Mercurial can be made to abort if any subrepository\n"
+" content is modified by setting \"ui.commitsubrepos=no\" in a\n"
+" configuration file (see :hg:`help config`)."
+msgstr ""
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories."
+msgstr ""
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"---------------------------------"
+msgstr ""
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ""
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ""
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ""
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ""
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ""
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ""
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ""
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ""
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+
+msgid ":parents: List of strings. The parents of the changeset."
+msgstr ""
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ""
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ""
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ""
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ""
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ""
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ""
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+
+msgid ":person: Any text. Returns the text before an email address."
+msgstr ""
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ""
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+
+msgid ":user: Any text. Returns the user portion of an email address.\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "remote branch lookup not supported"
+msgstr "ricerca di branch remoti non supportata"
+
+msgid "dirstate branch not accessible"
+msgstr "dirstate del branch non accessibile"
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "branch sconosciuto '%s'"
+
+msgid "can only share local repositories"
+msgstr "è possibile condividere solo repository locali"
+
+msgid "destination already exists"
+msgstr "la destinazione esiste già"
+
+msgid "updating working directory\n"
+msgstr "sto aggiornando la directory di lavoro\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "directory di destinazione: %s\n"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "la destinazione '%s' esiste già"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "la destinazione '%s' non è vuota"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr "clone da remoto a remoto non supportato"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "sto aggiornando al branch %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "usa 'hg resolve' per riprovare i merge sui file non risolti\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"usare 'hg resolve' per riprovare i merge sui file non risolti o\n"
+"'hg update -C .' per abbandonare\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(merge su branch, non dimenticare di effettuare il commit)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "file di configurazione %s non trovato!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "errore di lettura di %s/.hg/hgrc: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "errore nell'accedere al repository in %s\n"
+
+msgid "SSL support is unavailable"
+msgstr "Supporto SSL non disponibile"
+
+msgid "IPv6 is not available on this system"
+msgstr "IPv6 non è disponibile su questo sistema"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "impossibile avviare il server a '%s:%d': %s"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr "sto invocando l'hook %s: %s\n"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr "l'hook %s non è valido (\"%s\" non in un modulo)"
+
+msgid "exception from first failed import attempt:\n"
+msgstr ""
+
+msgid "exception from second failed import attempt:\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr "l'hook %s è invalido (fallito import di \"%s\")"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr "l'hook %s è invalido (\"%s\" non è definito)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr "l'hook %s è invalido (\"%s\" non è invocabile)"
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr "errore: %s hook fallito: %s\n"
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr "errore: l'hook %s ha sollevato un'eccezione: %s\n"
+
+#, python-format
+msgid "%s hook failed"
+msgstr "%s hook fallito"
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr "attenzione: %s hook fallito\n"
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr "esecuzione dell'hook %s: %s\n"
+
+#, python-format
+msgid "%s hook %s"
+msgstr "%s hook %s"
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr "attenzione: %s hook %s\n"
+
+msgid "connection ended unexpectedly"
+msgstr "connessione terminata inaspettatamente"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "componente URL non supportato: \"%s\""
+
+msgid "operation not supported over http"
+msgstr "operazione non supportata su http"
+
+msgid "authorization failed"
+msgstr "autorizzazione fallita"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "errore http, probabilmente causato dalle impostazioni del proxy"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "il vero URL è %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' non sembra essere un repository hg:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' ha inviato un header Content-Type rotto (%s)"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' usa il protocollo più nuovo %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "push fallito: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "Supporto per Python per SSL e HTTPS non installato"
+
+msgid "cannot create new http repository"
+msgstr "impossibile creare un nuovo repository http"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "ignoro sintassi invalida '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "sto saltando file ignore non leggibile '%s': %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "repository %s non trovato"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "il repository %s esiste già"
+
+#, python-format
+msgid "requirement '%s' not supported"
+msgstr "requisito '%s' non supportato"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr "attenzione: ignoro genitore sconosciuto della copia di lavoro %s!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r non può essere usato nel nome di un tag"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "attenzione: tag %s in conflitto con un branch esistente\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+"la copia di lavoro di .hgtags è cambiata (si prega di effettuare il commit "
+"manuale di .hgtags)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "la directory di lavoro ha il genitore sconosciuto '%s'"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "revisione sconosciuta '%s'"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "trovata transazione abbandonata - eseguire hg recover"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "sto effettuando il rollback della transazione interrotta\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "nessuna transazione interrotta disponibile\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "tip del repository riportata alla revisione %s (annulla %s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "tip del repository riportata alla revisione %s (annulla %s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "sto effettuando il rollback di una transazione sconosciuta\n"
+
+#, python-format
+msgid "Named branch could not be reset, current branch still is: %s\n"
+msgstr ""
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "directory di lavoro basata ora sulle revisioni %d e %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "directory di lavoro ora basata sulla revisione %d\n"
+
+msgid "no rollback information available\n"
+msgstr "nessuna informazione disponibile per il rollback\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "sto aspettando il lock su %s mantenuto da %r\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "repository·%s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "directory di lavoro di %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"impossibile fare il commit parziale di un merge (non specificare file o "
+"pattern)"
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "impossibile effettuare il commit di subrepository senza .hgsub"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "modifiche nel subrepository di cui non è stato effettuato il commit %s"
+
+msgid "file not found!"
+msgstr "file non trovato!"
+
+msgid "no match under directory!"
+msgstr "nessuna corrispondenza sotto la directory!"
+
+msgid "file not tracked!"
+msgstr "file non tracciato!"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr ""
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "commit del subrepository %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "nota: messaggio di commit salvato in %s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "problemi nell'effettuare il commit di %s!\n"
+
+msgid "requesting all changes\n"
+msgstr "sto richiedendo tutte le modifiche\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"il pull parziale non può essere eseguito perchè l'altro repository non "
+"supporta changegroupsubset."
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "sto aggiornando il segnalibro %s\n"
+
+#, python-format
+msgid "not updating divergent bookmark %s\n"
+msgstr "non aggiorno il segnalibro divergente %s\n"
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "%d changeset trovati\n"
+
+msgid "bundling"
+msgstr "sto creando il bundle"
+
+msgid "manifests"
+msgstr "manifesti"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "revlog vuoto o mancante per %s"
+
+msgid "adding changesets\n"
+msgstr "sto aggiungendo i changeset\n"
+
+msgid "chunks"
+msgstr "chunk"
+
+msgid "received changelog group is empty"
+msgstr "il gruppo di changelog ricevuto è vuoto"
+
+msgid "adding manifests\n"
+msgstr "sto aggiungendo i manifesti\n"
+
+msgid "adding file changes\n"
+msgstr "sto aggiungendo le modifiche ai file\n"
+
+msgid "received file revlog group is empty"
+msgstr "il gruppo di file revlog ricevuto è vuoto"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d head)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "aggiunti %d changeset con %d modifiche a %d file%s\n"
+
+msgid "Unexpected response from remote server:"
+msgstr "Risposta inaspettata dal server remoto:"
+
+msgid "operation forbidden by server"
+msgstr "operazione vietata dal server"
+
+msgid "locking the remote repository failed"
+msgstr "lock del repository remoto fallito"
+
+msgid "the server sent an unknown error code"
+msgstr "il server ha inviato un codice d'errore sconosciuto"
+
+msgid "streaming all changes\n"
+msgstr "sto effettuando lo streaming di tutte le modifiche\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d file da trasferire, %s di dati\n"
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "trasferiti %s in %.1f secondi (%s/sec)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "impossibile usare TLS: supporto a Python SSL non installato"
+
+msgid "(using smtps)\n"
+msgstr "(sto usando smtps)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "smtp.host non configurato - impossibile inviare mail"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "invio mail in corso: host smtp %s, porta %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(sto usando starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr ""
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "sto inviando la mail: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr "%r selezionato come trasporto email, non è nel PATH"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr ""
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "indirizzo e-mail errato: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "indirizzo locale errato: %s"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "fallita la rimozione di %s dal manifest"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "pattern non valido (%s): %s"
+
+msgid "invalid pattern"
+msgstr "pattern non valido"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "impossibile leggere l'elenco dei file (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid ""
+"untracked file in working directory differs from file in requested revision: "
+"'%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr "&Nessuno"
+
+msgid "E&xec"
+msgstr "E&segui"
+
+msgid "Sym&link"
+msgstr "&Link simbolico"
+
+msgid "resolving manifests\n"
+msgstr "sto risolvendo i manifesti\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr "&Modificato"
+
+msgid "&Delete"
+msgstr "&Elimina"
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr "&Eliminato"
+
+msgid "updating"
+msgstr "aggiornamento in corso"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "l'aggiornamento ha fallito la rimozione di %s: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "sto ottenendo %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "sto ottenendo %s in %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr "branch %s non trovata"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr ""
+"effettuare il merge con un antenato della copia di lavoro non ha effetti"
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr ""
+"niente di cui effettuare il merge (usare 'hg update' ocontrollare 'hg heads')"
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr ""
+"ci sono modifiche in sospeso di cui non si è effettuato il commit (usa'hg "
+"status' per elencarle)"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr ""
+"modifiche in sospeso di cui non si è effettuato il commit nel subrepository "
+"'%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+
+msgid "crosses branches (merge branches or use --check to force update)"
+msgstr ""
+
+msgid "Attention:"
+msgstr "Attenzione:"
+
+msgid "Caution:"
+msgstr "Prudenza:"
+
+msgid "!Danger!"
+msgstr "!Pericolo!"
+
+msgid "Error:"
+msgstr "Errore:"
+
+msgid "Hint:"
+msgstr "Suggerimento:"
+
+msgid "Important:"
+msgstr "Importante:"
+
+msgid "Note:"
+msgstr "Nota:"
+
+msgid "Tip:"
+msgstr ""
+
+msgid "Warning!"
+msgstr "Attenzione!"
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "impossibile creare %s: la destinazione esiste già"
+
+#, python-format
+msgid "cannot create %s: unable to create destination directory"
+msgstr "impossibile creare %s: impossibile creare la directory di destinazione"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "sto applicando una patch al file %s\n"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr "hunk errato #%d %s (%d %d %d %d)"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "il file %s esiste già\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr "Hunk #%d con successo a %d con variazioni %d (offset %d linee).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "Hunk #%d con successo a %d (offset %d linee).\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr "Hunk #%d FALLITO a %d\n"
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr "hunk errato #%d"
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr "hunk errato #%d vecchia linea di testo %d"
+
+msgid "could not extract binary patch"
+msgstr "impossibile estrarre patch binaria"
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr "la patch binaria è di %d byte, non %d"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "impossibile eliminare %d directory di %d da %s"
+
+msgid "undefined source and destination files"
+msgstr "file sorgente e destinazione non definiti"
+
+#, python-format
+msgid "malformed patch %s %s"
+msgstr "patch malformata %s %s"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "stato del parser non supportato: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "comando patch fallito: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "tipo di fine linea non supportato: %s"
+
+msgid "patch failed to apply"
+msgstr "fallita l'applicazione della patch"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr "%d file modificati, %d inserimenti(+), %d cancellazioni(-)\n"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "uscito con status %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "ucciso dal segnale %d"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "salvato bundle di backup in %s\n"
+
+msgid "adding branch\n"
+msgstr "aggiungo il branch\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "strip fallito, il bundle completo è stato salvato in '%s'\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "strip fallito, bundle parziale salvato in '%s'\n"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "%s impossibile; il repository remoto non supporta la funzionalità %r"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "tipo di compressione sconosciuto %r"
+
+msgid "index entry flags need RevlogNG"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "indice %s flag sconosciute %#04x per revlogng"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "indice %s formato sconosciuto %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "l'indice %s è corrotto"
+
+msgid "no node"
+msgstr "nessun nodo"
+
+msgid "ambiguous identifier"
+msgstr "identificatore ambiguo"
+
+msgid "no match found"
+msgstr "nessuna corrispondenza trovata"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "flag di revisione non compatibile %x"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s non trovato nella transazione"
+
+msgid "consistency error in delta"
+msgstr "errore di consistenza nel delta"
+
+msgid "unknown base"
+msgstr "base sconosciuta"
+
+msgid "unterminated string"
+msgstr "stringa non terminata"
+
+msgid "syntax error"
+msgstr "errore di sintassi"
+
+msgid "missing argument"
+msgstr "argomento mancante"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "impossibile usare %s qui"
+
+msgid "can't use a list in this context"
+msgstr "impossibile usare una lista in questo contesto"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "non è una funzione: %s"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id richiede un argomento"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id richiede una stringa"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev richiede un argomento"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev richiede un numero"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev si attende un numero"
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+
+msgid ""
+"``limit(set, n)``\n"
+" First n members of set."
+msgstr ""
+"``limit(set, n)``\n"
+" Primi n membri dell'insieme."
+
+#. i18n: "limit" is a keyword
+msgid "limit requires two arguments"
+msgstr "limit richiede due argomenti"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit richiede un numero"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit si aspetta un numero"
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+
+msgid ""
+"``branch(set)``\n"
+" All changesets belonging to the branches of changesets in set."
+msgstr ""
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor richiede due argomenti"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "gli argomenti di ancestor devono essere revisioni singole"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+
+msgid ""
+"``follow()``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent)."
+msgstr ""
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments"
+msgstr "follow non richiede argomenti"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date richiede una stringa"
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string."
+msgstr ""
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword richiede una stringa"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep richiede una stringa"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "pattern di confronto invalido: %s"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+"``author(stringa)``\n"
+" Alias per ``user(stringa)``."
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author richiede una stringa"
+
+msgid ""
+"``user(string)``\n"
+" User name is string."
+msgstr ""
+"``user(string)``\n"
+" Il nome utente è una stringa."
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+"``file(pattern)``\n"
+" Changeset che riguardano file corrispondenti al pattern."
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file richiede un pattern"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains pattern."
+msgstr ""
+"``contains(pattern)``\n"
+" La revisione contiene il pattern."
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains richiede un pattern"
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies richiede un pattern"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds richiede un pattern"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes richiede un pattern"
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+"``merge()``\n"
+" Il changeset è un changeset di merge."
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge non richiede argomenti"
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+"``closed()``\n"
+" Il changeset è chiuso."
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed non richiede argomenti"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head non richiede argomenti"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+
+msgid " The keys can be:"
+msgstr " Le chiavi possono essere:"
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort richiede uno o due argomenti"
+
+msgid "sort spec must be a string"
+msgstr "sort spec dev'essere una stringa"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "chiave di ordinamento sconosciuta: %r"
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all non richiede argomenti"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+
+msgid ""
+"``roots(set)``\n"
+" Changesets with no parent changeset in set."
+msgstr ""
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([percorso])``\n"
+" Changeset non trovati nel repository di destinazione specificato\n"
+" oppure nel percorso di push di default."
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "outgoing richiede il percorso ad un repository"
+
+msgid ""
+"``tag(name)``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag accetta un argomento o nulla"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "l'argomento di tag dev'essere una stringa"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+"``bookmark([nome])``\n"
+" Il segnalibro specificato o tutti i segnalibri."
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark accetta un argomento o nessuno"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "l'argomento del segnalibro dev'essere una stringa"
+
+msgid "can't negate that"
+msgstr "impossibile negarlo"
+
+msgid "not a symbol"
+msgstr "non un simbolo"
+
+msgid "empty query"
+msgstr "interrogazione vuota"
+
+msgid "searching for exact renames"
+msgstr "ricerca di rinomine esatte"
+
+msgid "searching for similar files"
+msgstr "ricerca di file simili"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s sembra essere un file binario."
+
+msgid "can only specify two labels."
+msgstr "possibile specificare solo due etichette."
+
+msgid "warning: conflicts during merge.\n"
+msgstr "attenzione: conflitti durante il merge.\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "non è stato possibile parsificare la posizione %s"
+
+msgid "password in URL not supported"
+msgstr "password nell'URL non supportata"
+
+msgid "could not create remote repo"
+msgstr "non è stato possibile creare il repository remoto"
+
+msgid "no suitable response from remote hg"
+msgstr "nessuna risposta accettabile dall'hg remoto"
+
+msgid "remote: "
+msgstr "remoto: "
+
+msgid "unexpected response:"
+msgstr "risposta inattesa: "
+
+#, python-format
+msgid "push refused: %s"
+msgstr "push rifiutato: %s"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' non sembra essere un repository hg"
+
+msgid "cannot lock static-http repository"
+msgstr "impossibile bloccare il repository http statico"
+
+msgid "cannot create new static-http repository"
+msgstr "impossibile creare un nuovo repository http statico"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr "voce non valida in fncache, linea %s"
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "attenzione: spec file del subrepository %s non trovato\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "spec file del subrepository %s non trovato"
+
+msgid "missing ] in subrepo source"
+msgstr "] mancante nel subrepository sorgente"
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr "pattern di subrepository errato in %s: %s"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr "&Remoto"
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "percorso di default per il subrepository %s non trovato"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "tipo di subrepository sconosciuto %s"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "archiviazione in corso (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "attenzione: errore \"%s\" nel subrepository \"%s\"\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "sto rimuovendo il subrepository %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "pull in corso del subrepository %s da %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "push in corso del subrepository %s verso %s\n"
+
+msgid "cannot commit svn externals"
+msgstr "impossibile fare il commit di external svn"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "non rimuovo il repository %s in quanto contiene modifiche\n"
+
+#, fuzzy, python-format
+msgid "cloning subrepo %s\n"
+msgstr "clonazione in corso del subrepository %s da %s\n"
+
+#, fuzzy, python-format
+msgid "pulling subrepo %s\n"
+msgstr "pull in corso del subrepository %s da %s\n"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "la revisione %s non esiste nel subrepository %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr "reperimento della HEAD scollegata nel subrepository %s\n"
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr "effettua il check out di un branch git se intendi fare modifiche\n"
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "subrepo %s mancante"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr "branch git non correlata estratta nel subrepository %s\n"
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "push del branch %s del subrepository %s in corso\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s"
+msgstr ""
+"nessun branch estratto nel subrepository %s\n"
+"impossibile effettuare il push della revisione %s"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, linea %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr "impossibile parsificare la entry"
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "il nodo '%s' non è ben formato"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags corrotta, la ricostruisco\n"
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "metodo sconosciuto '%s'"
+
+msgid "expected a symbol"
+msgstr "atteso un simbolo"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "funzione sconosciuta '%s'"
+
+msgid "expected template specifier"
+msgstr ""
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "il filtro %s si aspetta un argomento"
+
+msgid "unmatched quotes"
+msgstr "citazione non corrispondente"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "stile non trovato: %s"
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" non è nel map del template"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr ""
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "fallito il troncamento di %s\n"
+
+msgid "transaction abort!\n"
+msgstr "transazione abortita!\n"
+
+msgid "rollback completed\n"
+msgstr "rollback completato\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "rollback fallito - eseguire hg recover\n"
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr ""
+"Non viene data fiducia al file %s dall'utente non fidato %s, gruppo %s\n"
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr "Ignorato: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr "ignoro l'opzione di configurazione non affidabile %s.%s = %s\n"
+
+#, python-format
+msgid "%s.%s not a boolean ('%s')"
+msgstr "%s.%s non è un booleano ('%s')"
+
+msgid "enter a commit username:"
+msgstr "inserire uno username per il commit:"
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr "Nessuno username trovato, uso '%s' invece\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "nessun nome utente fornito (vedere \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "lo username %s contiene un carattere di fine riga\n"
+
+msgid "response expected"
+msgstr "risposta attesa"
+
+msgid "unrecognized response\n"
+msgstr "risposta non riconosciuta\n"
+
+msgid "password: "
+msgstr "password: "
+
+msgid "edit failed"
+msgstr "modifica fallita"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignoro chiave [auth] invalida '%s'\n"
+
+msgid "http authorization required"
+msgstr "autorizzazione http richiesta"
+
+msgid "http authorization required\n"
+msgstr "autorizzazione http richiesta\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "reame: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "utente: %s\n"
+
+msgid "user:"
+msgstr "utente:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "autenticazione http: utente %s, password %s\n"
+
+msgid "kb"
+msgstr "kb"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "il controllo dei certificati richiede Python 2.6"
+
+msgid "no certificate received"
+msgstr "nessun certificato ricevuto"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "il certificato è per %s"
+
+msgid "IDN in certificate not supported"
+msgstr "IDN non supportato nel certificato"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "nessun commonName o subjectAltName trovato nel certificato"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "impossibile trovare web.cacerts: %s"
+
+#, python-format
+msgid "%s certificate error: %s (use --insecure to connect insecurely)"
+msgstr ""
+
+#, python-format
+msgid "invalid certificate for %s with fingerprint %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "no certificate for %s with configured hostfingerprint"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: %s certificate not verified (check web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "comando '%s' fallito: %s"
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "il percorso finisce con il separatore di directory: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "il percorso contiene un componente non consentito: %s"
+
+#, python-format
+msgid "path %r is inside repo %r"
+msgstr "il percorso %r è all'interno del repository %r"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "il percorso %r attraversa il link simbolico %r"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "impossibile creare un link simbolico a %r: %s"
+
+msgid "check your clock"
+msgstr "controlla il tuo orologio"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "timestamp negativo: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "data invalida: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "la data supera i 32 bit: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "valore di data negativo: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "fuso orario impossibile: %d"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "specificato giorno invalido: %s"
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f byte"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "nessuno numero di porta associato al servizio '%s'"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "impossibile verificare bundle o repository remoti"
+
+msgid "interrupted"
+msgstr "interrotto"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "%s vuoto o mancante"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "lunghezza dei dati eccedente di %d byte"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "l'indice contiene %d extra byte"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "attenzione: `%s' usa il formato di revlog 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "attenzione: `%s' usa il formato di revlog 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "rev %d punta al changeset non esistente %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "rev %d punta al changeset inatteso %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr "(atteso %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "genitore 1 %s di %s sconosciuto"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "genitore 2 %s di %s sconosciuto"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "sto controllando i genitori di %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "revisione duplicata %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "trovata transazione abbandonata - eseguire hg recover\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "il repository usa il formato di revlog %d\n"
+
+msgid "checking changesets\n"
+msgstr "sto controllando i changeset\n"
+
+msgid "checking"
+msgstr "controllo in corso"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "sto spacchettando il changeset %s"
+
+msgid "checking manifests\n"
+msgstr "sto controllando i manifesti\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s non è nei changeset"
+
+msgid "file without name in manifest"
+msgstr "file senza nome nel manifesto"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "sto leggendo il delta del manifesto %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr ""
+"sto facendo un controllo incrociato sui file nei changeset e nei manifesti\n"
+
+msgid "crosschecking"
+msgstr "controllo incrociato"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "il changeset si riferisce ad un manifesto sconosciuto %s"
+
+msgid "in changeset but not in manifest"
+msgstr "nel changeset ma non nel manifesto"
+
+msgid "in manifest but not in changeset"
+msgstr "nel manifesto ma non nel changeset"
+
+msgid "checking files\n"
+msgstr "sto controllando i file\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "impossibile decodificare il nome del file '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "revlog danneggiato! (%s)"
+
+msgid "missing revlog!"
+msgstr "revlog mancante!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s non è nei manifesti"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "la dimensione spacchettata è %s, attesa %s"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "sto spacchettando %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "attenzione: la copia sorgente di '%s' non è tra i genitori di %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "sto controllando la rinomina di %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s non trovato nei manifesti"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "attenzione: revlog '%s' orfano"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d file, %d changeset, %d revisioni totali\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "%d warning incontrati!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "%d errori di integrit incontrati!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(il primo changeset danneggiato sembra essere %d)\n"
+
+msgid "look up remote revision"
+msgstr "ricerca di revisioni remote"
+
+msgid "push failed (unexpected response):"
+msgstr "push fallito (risposta inattesa):"
+
+msgid "look up remote changes"
+msgstr "ricerca di modifiche remote"
+
+msgid "push failed:"
+msgstr "push fallito:"
+
+#~ msgid "end-of-line check failed:\n"
+#~ msgstr "controllo del fine-riga fallito:\n"
+
+#, fuzzy
+#~ msgid "use text as collapse commit message"
+#~ msgstr "usa text come messaggio di commit"
+
+#, fuzzy
+#~ msgid "read collapse commit message from file"
+#~ msgstr "legge il messaggio di commit dal file"
+
+#~ msgid "Extending search to changeset %d:%s\n"
+#~ msgstr "Estendo la ricerca al changeset %d:%s\n"
+
+#~ msgid "nothing to extend"
+#~ msgstr "niente da estendere"
+
+#~ msgid "extend the bisect range"
+#~ msgstr "estende il range di bisect"
+
+#~ msgid "bisect requires a string"
+#~ msgstr "bisect richiede una stringa"
+
+#~ msgid "invalid bisect state"
+#~ msgstr "stato di bisect invalido"
+
+#~ msgid "%s\n"
+#~ msgstr "%s\n"
+
+#~ msgid " options:"
+#~ msgstr " opzioni:"
+
+#~ msgid ""
+#~ "Bookmarks are local movable markers to changesets. Every bookmark\n"
+#~ "points to a changeset identified by its hash. If you commit a\n"
+#~ "changeset that is based on a changeset that has a bookmark on it, the\n"
+#~ "bookmark shifts to the new changeset."
+#~ msgstr ""
+#~ "I segnalibri di Mercurial sono puntatori locali e mobili a changeset. "
+#~ "Ogni\n"
+#~ "segnalibro punta ad un changeset identificato dal proprio hash. Se fai il "
+#~ "commit di un\n"
+#~ "changeset basato su un changeset che ha un segnalibro,\n"
+#~ "il segnalibro è spostato sul nuovo changeset"
+
+#~ msgid ""
+#~ "It is possible to use bookmark names in every revision lookup (e.g.\n"
+#~ ":hg:`merge`, :hg:`update`)."
+#~ msgstr ""
+#~ "E' possibile usare nomi di segnalibri in ogni ricerca di revisioni (es.\n"
+#~ ":hg:`merge`, :hg:`update`)."
+
+#~ msgid ""
+#~ "By default, when several bookmarks point to the same changeset, they\n"
+#~ "will all move forward together. It is possible to obtain a more\n"
+#~ "git-like experience by adding the following configuration option to\n"
+#~ "your .hgrc::"
+#~ msgstr ""
+#~ "Di default, quando più segnalibri puntano allo stesso changeset, essi\n"
+#~ "avanzeranno tutti assieme. È possibile avere un comportamento più simile\n"
+#~ "a git aggiungendo la seguente opzione di configurazione al tuo .hgrc::"
+
+#~ msgid ""
+#~ "This will cause Mercurial to track the bookmark that you are currently\n"
+#~ "using, and only update it. This is similar to git's approach to\n"
+#~ "branching.\n"
+#~ msgstr ""
+#~ "Questo porterà Mercurial a tener traccia del segnalibro su cui sei "
+#~ "attualmente, e\n"
+#~ "a limitarsi ad aggiornarlo. Questo è simile all'approccio di branching di "
+#~ "git.\n"
+
+#~ msgid "bookmark to export"
+#~ msgstr "segnalibro da esportare"
+
+#~ msgid "username mapping filename"
+#~ msgstr "nome del file con il mapping degli username"
+
+#~ msgid "Subversion python bindings could not be loaded"
+#~ msgstr "Non è stato possibile caricare i binding python per Subversion"
+
+#~ msgid "XXX TAGS NOT IMPLEMENTED YET\n"
+#~ msgstr "XXX TAG NON ANCORA IMPLEMENTATE\n"
+
+#~ msgid "queue directory updating\n"
+#~ msgstr "aggiornamento directory della coda\n"
+
+#~ msgid "No patches applied"
+#~ msgstr "Nessuna patch applicata"
+
+#~ msgid "does the diffstat above look okay?"
+#~ msgstr "il diffstat di sopra sembra corretto? "
+
+#~ msgid "diffstat rejected"
+#~ msgstr "diffstat rifiutato"
+
+#, fuzzy
+#~ msgid " files"
+#~ msgstr "file:"
+
+#, fuzzy
+#~ msgid ""
+#~ " Commit the backed out changes as a new changeset. The new\n"
+#~ " changeset is a child of the backed out changeset."
+#~ msgstr ""
+#~ " Effettua il commit delle modifiche di cui si è fatto backout\n"
+#~ " come nuovo changeset. Il nuovo changeset è un figlio del\n"
+#~ " changeset di cui si è fatto backout."
+
+#, fuzzy
+#~ msgid ""
+#~ " If you backout a changeset other than the tip, a new head is\n"
+#~ " created. This head will be the new tip and you should merge this\n"
+#~ " backout changeset with another head."
+#~ msgstr ""
+#~ " Se si fa il backout di un changeset diverso da tip, viene creata\n"
+#~ " una nuova head. Questa sarà la nuova tip e si dovrebbe fare il\n"
+#~ " merge di questo changeset di backout con un'altra head\n"
+#~ " (attualmente una di default)."
+
+#, fuzzy
+#~ msgid ""
+#~ " The --merge option remembers the parent of the working directory\n"
+#~ " before starting the backout, then merges the new head with that\n"
+#~ " changeset afterwards. This saves you from doing the merge by hand.\n"
+#~ " The result of this merge is not committed, as with a normal merge."
+#~ msgstr ""
+#~ " L'opzione --merge ricorda il genitore della directory di lavoro\n"
+#~ " prima di avviare il backout, poi fa il merge della nuova head con\n"
+#~ " quel changeset. Questo evita di fare il merge a mano. Non viene\n"
+#~ " effettuato il commit del risultato di questo merge, come per un\n"
+#~ " merge normale."
+
+#, fuzzy
+#~ msgid ""
+#~ " If no commit message is specified, the configured editor is\n"
+#~ " started to prompt you for a message."
+#~ msgstr ""
+#~ " Se non è specificato nessun messaggio di commit, l'editor\n"
+#~ " configurato viene lanciato per inserire un messaggio."
+
+#~ msgid "still exists"
+#~ msgstr "esiste ancora"
+
+#~ msgid "is modified"
+#~ msgstr "è modificato"
+
+#~ msgid "has been marked for add"
+#~ msgstr "è stato marcato per l'aggiunta"
+
+#~ msgid "unmark files as resolved"
+#~ msgstr "smarca i file come risolti"
+
+#~ msgid "replace existing tag"
+#~ msgstr "rimpiazza tag esistente"
+
+#, fuzzy
+#~ msgid "check for uncommitted changes"
+#~ msgstr ""
+#~ "salta il controllo di modifiche pendenti di cui non si è effettuato il "
+#~ "commit"
+
+#~ msgid "** report bug details to http://mercurial.selenic.com/bts/\n"
+#~ msgstr ""
+#~ "** riportare dettagli del bug a http://www.selenic.com/mercurial/bts/\n"
+
+#, fuzzy
+#~ msgid "bundling changes"
+#~ msgstr "sto aggiungendo i changeset\n"
+
+#, fuzzy
+#~ msgid "bundling manifests"
+#~ msgstr "sto aggiungendo i manifesti\n"
+
+#~ msgid "unsynced changes"
+#~ msgstr "modifiche non sincronizzate"
+
+#~ msgid "error expanding '%s%%%s'"
+#~ msgstr "errore nell'espansione di '%s%%%s'"
+
+#~ msgid "unknown filter '%s'"
+#~ msgstr "filtro sconosciuto '%s'"
+
+#~ msgid "user name not available - set USERNAME environment variable"
+#~ msgstr ""
+#~ "nome utente non disponibile - impostare la variabile d'ambiente USERNAME"
+
+#~ msgid "COMMANDS"
+#~ msgstr "COMANDI"
+
+#~ msgid "generating stats: %d%%"
+#~ msgstr "sto generando le statistiche: %d%%"
+
+#~ msgid "show progress"
+#~ msgstr "mostra progresso"
+
+#~ msgid "don't colorize output (DEPRECATED)"
+#~ msgstr "non colorare l'output (DEPRECATO)"
+
+#~ msgid "no tags found at revision %d\n"
+#~ msgstr "nessuna tag trovata alla revisione %d\n"
+
+#, fuzzy
+#~ msgid "show keyword status flags of all files (DEPRECATED)"
+#~ msgstr "mostra lo stato di tutti i file"
+
+#~ msgid ""
+#~ "\n"
+#~ "imported patch %s"
+#~ msgstr ""
+#~ "\n"
+#~ "patch %s importata"
+
+#~ msgid "force removal with local changes"
+#~ msgstr "forza la rimozione con modifiche locali"
+
+#~ msgid "rebase from a given revision"
+#~ msgstr "rebase da una data revisione"
+
+#~ msgid "rebase from the base of a given revision"
+#~ msgstr "rebase dalla base di una data revisione"
+
+#~ msgid "rebase onto a given revision"
+#~ msgstr "rebase su una data revisione"
+
+#~ msgid "y - record this change"
+#~ msgstr "y - registra questa modifica"
+
+#~ msgid "y"
+#~ msgstr "y"
+
+#~ msgid "%s: %s"
+#~ msgstr "%s: %s"
+
+#, fuzzy
+#~ msgid ""
+#~ " This is the symmetrical operation for pull. It moves changes from\n"
+#~ " the current repository to a different one. If the destination is\n"
+#~ " local this is identical to a pull in that directory from the\n"
+#~ " current one."
+#~ msgstr ""
+#~ " Questa è l'operazione simmetrica di pull. Aiuta a spostare modifiche\n"
+#~ " dal repository corrente in un altro. Se la destinazione è locale "
+#~ "questo\n"
+#~ " è identico ad un pull in quella directory verso questa."
+
+#, fuzzy
+#~ msgid ""
+#~ " By default, push will refuse to run if it detects the result would\n"
+#~ " increase the number of remote heads. This generally indicates the\n"
+#~ " user forgot to pull and merge before pushing."
+#~ msgstr ""
+#~ " Di default, il push verrà rifiutato se viene rivelato che aumenterà "
+#~ "il\n"
+#~ " numerdo di head remote. Questo generalmente indica che il client ha\n"
+#~ " dimenticato di fare pull e merge prima del push."
+
+#, fuzzy
+#~ msgid ""
+#~ " (Use update -r to check out earlier revisions, revert does not\n"
+#~ " change the working directory parents.)"
+#~ msgstr ""
+#~ " (usare update -r per effettuare il checkout di revisioni\n"
+#~ " precedenti, revert non cambia i genitori della directory di\n"
+#~ " lavoro)"
+
+#, fuzzy
+#~ msgid "export the repository via HTTP"
+#~ msgstr "esporta il repository via HTTP"
+
+#, fuzzy
+#~ msgid " Start a local HTTP repository browser and pull server."
+#~ msgstr " Avvia un server HTTP locale per il pull e la navigazione."
+
+#, fuzzy
+#~ msgid ""
+#~ " When the working directory contains no uncommitted changes, it\n"
+#~ " will be replaced by the state of the requested revision from the\n"
+#~ " repository. When the requested revision is on a different branch,\n"
+#~ " the working directory will additionally be switched to that\n"
+#~ " branch."
+#~ msgstr ""
+#~ " Quando la directory di lavoro non contiene modifiche di cui non si\n"
+#~ " è eseguito il commit, sarà rimpiazzata dallo stato della revisione\n"
+#~ " richiesta dal repository. Quando la revisione richiesta è su una\n"
+#~ " branch differente, la directory di lavoro verrà inoltre spostata\n"
+#~ " su quella branch."
+
+#, fuzzy
+#~ msgid ""
+#~ " When there are uncommitted changes, use option -C/--clean to\n"
+#~ " discard them, forcibly replacing the state of the working\n"
+#~ " directory with the requested revision. Alternately, use -c/--check\n"
+#~ " to abort."
+#~ msgstr ""
+#~ " Quandi ci sono modifiche di cui non si è eseguito il commit, usare\n"
+#~ " l'opzione -C per scartarle, forzando la sostituzione dello stato\n"
+#~ " della directory di lavoro con la revisione richiesta."
+
+#, fuzzy
+#~ msgid ""
+#~ " When there are uncommitted changes and option -C/--clean is not\n"
+#~ " used, and the parent revision and requested revision are on the\n"
+#~ " same branch, and one of them is an ancestor of the other, then the\n"
+#~ " new working directory will contain the requested revision merged\n"
+#~ " with the uncommitted changes. Otherwise, the update will fail with\n"
+#~ " a suggestion to use 'merge' or 'update -C' instead."
+#~ msgstr ""
+#~ " Quando ci sono modifiche di cui non si è eseguito il commit,\n"
+#~ " l'opzione -C non è usata, la revisione del genitore e di quella\n"
+#~ " richiesta sono sulla stessa branch e una di queste è un antenato\n"
+#~ " dell'altro, allora la nuova directory di lavoro conterrà la\n"
+#~ " revisione richiesta unita con le modifiche non salvate. Altrimenti\n"
+#~ " l'aggiornamento fallirà con un suggerimento di usare invece\n"
+#~ " 'merge' o 'update -C'."
+
+#~ msgid "a changeset up to which you would like to bundle"
+#~ msgstr "un changeset fino al quale si desidera effettuare il bundle"
+
+#~ msgid "a changeset you would like to have after cloning"
+#~ msgstr "un changeset che si desidera avere dopo il clone"
+
+#, fuzzy
+#~ msgid "show only the active branch heads from open branches"
+#~ msgstr "mostra solo le head attive dalle branch aperte"
+
+#, fuzzy
+#~ msgid "[-r STARTREV] [REV]..."
+#~ msgstr "[-r REV] [REV]..."
+
+#~ msgid "a specific revision up to which you would like to pull"
+#~ msgstr "una specifica revisione fino alla quale si desidera fare il pull"
+
+#~ msgid "a specific revision up to which you would like to push"
+#~ msgstr ""
+#~ "una specifica revisione fino alla quale si desidera effettuare il push"
+
+#~ msgid "revision to revert to"
+#~ msgstr "revisione a cui annullare"
+
+#~ msgid "overwrite locally modified files (no backup)"
+#~ msgstr "sovrascrivi file modificati localmente (nessun backup)"
+
+#~ msgid "abort: could not import module %s!\n"
+#~ msgstr "abortito: non è stato possibile importare %s!\n"
+
+#~ msgid "journal already exists - run hg recover"
+#~ msgstr "il journal esiste già - eseguire hg recover"
+
+#~ msgid ""
+#~ "%s: files over 10MB may cause memory and performance problems\n"
+#~ "(use 'hg revert %s' to unadd the file)\n"
+#~ msgstr ""
+#~ "%s: file oltre i 10MB potrebbero causare problemi di memoria\n"
+#~ "e performance (usare 'hg revert %s' per annullare l'aggiunta\n"
+#~ "del file)\n"
diff --git a/i18n/ja.po b/i18n/ja.po
new file mode 100644
index 0000000..1dd70c0
--- /dev/null
+++ b/i18n/ja.po
@@ -0,0 +1,24050 @@
+# Japanese translation for Mercurial
+# Mercurial 日本語翻訳
+#
+# Copyright (C) 2009-2012 the Mercurial team
+#
+# ========================================
+# ã€ç¿»è¨³ç”¨èªžé›†ã€‘
+#
+# 言ã„回ã—:
+#
+# no XXXX avairable XXXX ãŒã‚ã‚Šã¾ã›ã‚“
+# XXXX found XXXX ãŒå­˜åœ¨ã—ã¾ã™
+# XXXX exists XXXX ãŒå­˜åœ¨ã—ã¾ã™
+# do not XXXX XXXX ã§ãã¾ã›ã‚“ ※ 「XXXX ã—ã¦ã¯ã„ã‘ãªã„ã€ã®æ„
+# XXXX failed XXXX ãŒ(or ã«)失敗
+# error XXXX-ing XXXX ãŒ(or ã«)失敗
+# error while XXXX XXXX ãŒ(or ã«)失敗
+# cannot XXXX XXXX ãŒ(or ã«)失敗
+# XXXX-ing YYYY YYYY ã‚’ XXXX 中 ※ メッセージ冒頭ã‹ã‚‰å§‹ã¾ã‚‹å ´åˆ
+# YYYY ã‚’ XXXX ※ 「以後ã®å‡¦ç†ã¯ YYYY ã‚’ XXXX ã¨ã™ã‚‹ã€
+# ã¨ã„ã†ãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹ã®å ´åˆ
+# --XXXX option --XXXX ※ 「オプションã€ã§ã‚ã‚‹ã“ã¨ãŒè‡ªæ˜Žãªå ´åˆ
+# option --XXXX --XXXX ※ 「オプションã€ã§ã‚ã‚‹ã“ã¨ãŒè‡ªæ˜Žãªå ´åˆ
+# invalid XXXX XXXX ãŒä¸æ­£ã§ã™ or ä¸æ­£ãª XXXX
+# malformed XXXX XXXX ãŒä¸æ­£ã§ã™ or ä¸æ­£ãª XXXX
+#
+# å˜èªž:
+#
+# Distributed SCM 分散構æˆç®¡ç†ãƒ„ール
+#
+# abort 中断
+# add (構æˆç®¡ç†ã¸ã®)追加登録
+# alias 別å
+# amend 改変 (※ 『破壊的修正ã€ã®ãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹)
+# ancestor 祖先
+# apply é©ç”¨
+# archive アーカイブ
+# argument(, with no) 引数(指定ãŒç„¡ã„å ´åˆ)
+# authenticate/-ion èªè¨¼
+# author 作æˆè€…
+# authorize/-ation æ‰¿èª or アクセスå¯å¦
+# (※ HTTP 系エラー㯠authorization も「èªè¨¼ã€)
+# backout 打ã¡æ¶ˆã—
+# basename パスå末尾è¦ç´ 
+# binary ãƒã‚¤ãƒŠãƒª
+# branch ブランãƒ
+# bundle( file) ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«
+# change ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆ/差分
+# changegroup( file) ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«
+# changeset リビジョン (or 「ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆã€ï¼ã€Œå¤‰æ›´å†…容ã€)
+# changeset hash ãƒãƒƒã‚·ãƒ¥å€¤
+# changeset header ヘッダ情報
+# changeset log コミットログ
+# checkout/update (作業領域ã®)æ›´æ–°
+# close(of branch) 閉鎖
+# command(, this) (本)コマンド
+# commit コミット
+# commit comment コミットログ
+# commit message コミットログ
+# copy(of file, repo) 複製
+# default(, by) 指定ãŒç„¡ã„å ´åˆ/通常ã¯
+# delete (作業領域ã‹ã‚‰ã®)ファイル削除
+# diff 差分
+# directory ディレクトリ
+# dirstate dirstate
+# entry エントリ
+# extend(ed) æ‹¡å¼µ
+# extension (Mercurialã®)エクステンション
+# fold (revision/patch) (リビジョンï¼ãƒ‘ッãƒã®)ä½µåˆ
+# glob(, rooted at ...) ワイルドカード形å¼
+# (... ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€
+# パス先頭ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ã§åˆ¤å®šã™ã‚‹)
+# graft 移æ¤
+# hash identifier(s) ãƒãƒƒã‚·ãƒ¥å€¤
+# head ヘッド
+# head changeset(s) ヘッド
+# header ヘッダ
+# history(, revision) 変更履歴
+# hunk 差分
+# identifier ID
+# import å–ã‚Šè¾¼ã¿(patch ç³»)/読ã¿è¾¼ã¿(module/extension)
+# immutable( revision) 改変ä¸èƒ½(リビジョン)
+# interrupt 中断
+# largefile(s) 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«
+# list of .... 列挙ã•ã‚ŒãŸ..../.... ã®ä¸€è¦§
+# local (repo) 手元(ã®ãƒªãƒã‚¸ãƒˆãƒª)
+# lock ロック
+# manifest マニフェスト or 管ç†å¯¾è±¡(一覧)
+# merge マージ
+# must(A must B) A 㯠B ã—ã¦ãã ã•ã„
+# node リビジョン
+# note 備考
+# patch パッãƒ
+# platform 稼åƒç’°å¢ƒ
+# pop(patch) (パッãƒã®)é©ç”¨è§£é™¤
+# pull (追加リビジョンã®)å–ã‚Šè¾¼ã¿
+# push (追加リビジョンã®)å映
+# push(patch) (パッãƒã®)é©ç”¨
+# raise(of exception) (例外ã®)発生
+# reject(s) å´ä¸‹å·®åˆ†
+# remote(host) é éš”(ホスト)
+# remote(repo) 連æºå…ˆ(リãƒã‚¸ãƒˆãƒª)
+# remove (構æˆç®¡ç†ã‹ã‚‰ã®)登録除外
+# rename 改å
+# repo(sitory) リãƒã‚¸ãƒˆãƒª/(.hg を指ã™å ´åˆã¯)管ç†é ˜åŸŸ
+# resolve/unresolve (è¡çª)解消/(è¡çª)未解消
+# revert/undo å–り消ã—
+# revision リビジョン
+# schedule (add/remove ã®)予約
+# search 探索
+# server サーãƒ
+# source url (of subrepo) (副リãƒã‚¸ãƒˆãƒªã®)å‚照先 URL
+# subrepo 副リãƒã‚¸ãƒˆãƒª
+# summary è¦ç´„(情報)
+# support(, not) (未)サãƒãƒ¼ãƒˆ
+# support(, un) (未)サãƒãƒ¼ãƒˆ
+# tag ã‚¿ã‚°
+# tracked xxxx 構æˆç®¡ç†å¯¾è±¡ã® xxxx
+# tracked, un 未登録
+# type, xxxxx xxxx 種別
+# unknown xxxx 未知㮠xxxx
+# user ユーザ
+# working copy(of xxx) 作業領域(中㮠xxx)
+# working directory 作業領域
+# ========================================
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2012-08-01 04:42+0900\n"
+"PO-Revision-Date: 2009-11-16 21:24+0100\n"
+"Last-Translator: Japanese translation team <mercurial-ja@googlegroups.com>\n"
+"Language-Team: Japanese\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Generated-By: pygettext.py 1.5\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (既定値: %s)"
+
+msgid "Options"
+msgstr "オプション"
+
+msgid "Commands"
+msgstr "コマンド"
+
+msgid "Extensions"
+msgstr "エクステンション"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"ã“ã“ã§ã¯ã€ Mercurial ã«åŒæ¢±ã•ã‚Œã‚‹ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ ãれ以"
+"外ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã«é–¢ã—ã¦ã¯ã€ å„コマンドã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ˜ãƒ«ãƒ—ã‚’å‚ç…§ã—ã¦ãã ã•"
+"ã„。"
+
+msgid "Options:"
+msgstr "オプション:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " 別å: %s"
+
+msgid "hooks for controlling repository access"
+msgstr "リãƒã‚¸ãƒˆãƒªã«ãŠã‘るアクセス制御用ã®ãƒ•ãƒƒã‚¯é›†"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"アクセス制御用フックを使用ã™ã‚‹ã“ã¨ã§ã€ pretxnchangegroup ã‚„ pretxncommit\n"
+"契機ã§æ›´æ–°å映をå—ç†ã—ãŸéš›ã«ã€ 指定ã•ã‚ŒãŸãƒ–ランãƒã‚„パスã«å¯¾ã—ã¦ã€\n"
+"アクセス (= 改変) ã®å¯å¦ã‚’制御ã§ãã¾ã™ã€‚"
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"本エクステンションã§ã¯ã€ å„リビジョンã®ã‚³ãƒŸãƒƒãƒˆå®Ÿæ–½è€… (ã“ã®æƒ…å ±ã¯ã€\n"
+"ã‚ã¾ã‚Šæœ‰ç›Šã§ã¯ã‚ã‚Šã¾ã›ã‚“) ã®åå‰ã§ã¯ãªã〠フックãŒå®Ÿè¡Œã•ã‚Œã‚‹ç’°å¢ƒã§ã®ã€\n"
+"ログインユーザå情報をベースã«ã€ アクセスå¯å¦ãŒåˆ¤å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"ACL エクステンションã®ãƒ•ãƒƒã‚¯ã¯ã€ hgsh (※ 訳注: contrib æˆæžœç‰©ã¨ã—ã¦ã€\n"
+"é…布ã•ã‚Œã¦ã„ã¾ã™) ã®ã‚ˆã†ãªã€åˆ¶é™ä»˜ãã®ã‚·ã‚§ãƒ«ã¨ä½µç”¨ã™ã‚‹ã“ã¨ã§ã€\n"
+"push/pull 以外ã®æ“作ã«é–¢ã—ã¦ã€ ログイン済ã¿ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã™ã‚‹æŠ‘止を行ã†ã€\n"
+"ã¨ã„ã†æ§˜ãªç”¨é€”ã«é©ã—ã¦ã„ã¾ã™ã€‚ ユーザãŒãƒ­ã‚°ã‚¤ãƒ³ã§ãる一般的ãªç’°å¢ƒã§ã¯ã€\n"
+"ユーザã«ã‚ˆã£ã¦è¨­å®šãŒç„¡åŠ¹åŒ–ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚〠ACL フックã§ã®åˆ¶é™ã¯ã€\n"
+"安全ã¨ã¯è¨€ãˆã¾ã›ã‚“。 åŒä¸€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’〠複数人ã§å…±æœ‰ã™ã‚‹ã‚ˆã†ãªå ´åˆã‚‚ã€\n"
+"アクセス元ã®ãƒ¦ãƒ¼ã‚¶ã‚’特定ã§ããªã„ãŸã‚〠安全ã¨ã¯è¨€ãˆã¾ã›ã‚“。"
+
+msgid "The order in which access checks are performed is:"
+msgstr "アクセスå¯å¦ã®åˆ¤å®šé †åºã¯ã€ 以下ã®é€šã‚Šã§ã™:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+"1) ブランãƒã¸ã®ç¦æ­¢ä¸€è¦§ (``acl.deny.branches`` セクション)\n"
+"2) ブランãƒã¸ã®è¨±å¯ä¸€è¦§ (``acl.allow.branches`` セクション)\n"
+"3) パスã¸ã®ç¦æ­¢ä¸€è¦§ (``acl.deny`` セクション)\n"
+"4) パスã¸ã®è¨±å¯ä¸€è¦§ (``acl.allow`` セクション)"
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr "許å¯ï¼ç¦æ­¢ã®ã„ãšã‚Œã‚‚〠キーï¼å€¤ã®å¯¾ã§è¨­å®šã—ã¾ã™ã€‚"
+
+msgid ""
+"Branch-based Access Control\n"
+"---------------------------"
+msgstr ""
+"ブランãƒãƒ™ãƒ¼ã‚¹ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡\n"
+"----------------------------"
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+"ブランãƒãƒ™ãƒ¼ã‚¹ã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã«ã¯ã€ ``acl.deny.branches`` ãŠã‚ˆã³\n"
+"``acl.allow.branches`` セクションã§ã®è¨­å®šãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+"ã“れらã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€ 以下ã®ã„ãšã‚Œã‹ã‚’〠キーã¨ã—ã¦æŒ‡å®šã—ã¾ã™:"
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- ブランãƒåã€ãªã„ã—\n"
+"- 「全ブランãƒã€ã‚’æ„味ã™ã‚‹ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯(``*``)"
+
+msgid "The corresponding values can be either:"
+msgstr "キーã«å¯¾å¿œã™ã‚‹å€¤ã«ã¯ã€ 以下ã®ã„ãšã‚Œã‹ã‚’指定ã—ã¾ã™:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+"- ユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—ã®åå‰ã‚’〠カンマ区切りã§ä¸¦ã¹ãŸä¸€è¦§ã€ ãªã„ã—\n"
+"- 「全ã¦ã€ã‚’æ„味ã™ã‚‹ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯"
+
+msgid ""
+"You can add the \"!\" prefix to a user or group name to invert the sense\n"
+"of the match."
+msgstr ""
+"ユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—å指定ã®å†’é ­ã« \"!\" を付ã‘ã‚‹ã“ã¨ã§ã€ åˆè‡´åˆ¤å®šæ¡ä»¶ã‚’ã€\n"
+"å転ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"Path-based Access Control\n"
+"-------------------------"
+msgstr ""
+"パスベースã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡\n"
+"------------------------"
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+"パスベースã®ã‚¢ã‚¯ã‚»ã‚¹åˆ¶å¾¡ã«ã¯ ``acl.deny`` ãŠã‚ˆã³ ``acl.allow``\n"
+"セクションã§ã®è¨­å®šãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ã“れらã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§ã¯ã€\n"
+"パスã®åˆè‡´åˆ¤å®šã‚’ã™ã‚‹ãƒ‘ターン (無指定時ã®è¨˜è¿°æ–‡æ³•ã¯ glob) ã‚’ã€\n"
+"キーã¨ã—ã¦æŒ‡å®šã—ã¾ã™ã€‚ キーã«å¯¾å¿œã™ã‚‹å€¤ã®è¨˜è¿°æ–¹å¼ã¯ã€\n"
+"ä»–ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¨åŒã˜ã§ã™ã€‚"
+
+msgid ""
+"Groups\n"
+"------"
+msgstr ""
+"グループ\n"
+"--------"
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+"グループåを記述ã™ã‚‹å ´åˆã€ 接頭辞ã¨ã—㦠``@`` を付与ã—ã¾ã™ã€‚\n"
+"グループå記述ã¯ã€ グループã«å±žã™ã‚‹å…¨ãƒ¦ãƒ¼ã‚¶ã®åˆ—挙ã¨ã€ åŒã˜åŠ¹æžœã‚’æŒã¡ã¾ã™ã€‚"
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+"グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ ``acl.groups`` セクションã§å®šç¾©ã§ãã¾ã™ã€‚\n"
+"ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ãŠã„ã¦ã€ グループåãŒå®šç¾©ã•ã‚Œã¦ã„ãªã„å ´åˆã€\n"
+"UNIX ç³»ã®ç’°å¢ƒä¸‹ã§ã‚ã‚Œã°ã€ グループã®ãƒ¡ãƒ³ãƒãƒ¼ã«é–¢ã™ã‚‹æƒ…å ±ã¯ã€\n"
+"OS ã‹ã‚‰å–å¾—ã•ã‚Œã¾ã™ã€‚ ãれ以外ã®å ´åˆã¯ã€ 例外ãŒç™ºç”Ÿã—ã¾ã™ã€‚"
+
+msgid ""
+"Example Configuration\n"
+"---------------------"
+msgstr ""
+"設定例\n"
+"------"
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+" # コミット実行ã«åˆ¶é™ã‚’掛ã‘ãŸã„å ´åˆã®è¨­å®š\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+" # pull push bundle serve 実行ã«åˆ¶é™ã‚’掛ã‘ãŸã„å ´åˆã®è¨­å®š\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+" [acl]\n"
+" # 変更å映元種別ãŒã€ä»¥ä¸‹ã«åˆ—挙ã•ã‚Œã¦ã„ã‚‹å ´åˆã®ã¿ã€è¨±å¯ï¼ç¦æ­¢ã‚’è¡Œã„ã€\n"
+" # ãれ以外ã®å ´åˆã¯ã€åˆ¶é™ã‚’è¡Œã‚ãªã„。 指定å¯èƒ½ãªç¨®åˆ¥ã¯ã€http ãªã„ã—\n"
+" # ssh 経由ã§ã®å…¨ã‚¢ã‚¯ã‚»ã‚¹ã‚’指㙠\"serve\" ã‹ã€å¯¾å¿œã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã®\n"
+" # (ローカルã§ã®)実行ã«å¯¾å¿œã™ã‚‹ \"push\" \"pull\" \"bundle\" ã§ã™ã€‚\n"
+" # デフォルト値: serve\n"
+" sources = serve"
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+" # ã„ãšã‚Œã®ãƒ¦ãƒ¼ã‚¶ã‚‚ frozen-branch ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢:\n"
+" frozen-branch = *"
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+" # bad-user ã¯å…¨ã¦ã®ãƒ–ランãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’ç¦æ­¢:\n"
+" * = bad-user"
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+" # branch-a ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’特定ã®ãƒ¦ãƒ¼ã‚¶ã«ã®ã¿è¨±å¯:\n"
+" branch-a = user-1, user-2, user-3"
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+" # branch-b ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’一人ã®ãƒ¦ãƒ¼ã‚¶ã«ã®ã¿è¨±å¯:\n"
+" branch-b = user-1"
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+" # super-user ã¯å…¨ã¦ã®ãƒ–ランãƒã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½:\n"
+" * = super-user"
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+" # å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã¯ branch-for-tests ã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½:\n"
+" branch-for-tests = *"
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+" [acl.deny]\n"
+" # acl.allow よりも先ã«ã€ 本セクションã®è¨­å®šã«å¯¾ã—ã¦ç¢ºèªãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚\n"
+" # åˆè‡´ã™ã‚‹è¨­å®šãŒã‚ã£ãŸå ´åˆã€acl.allow セクションã®è¨­å®šã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚\n"
+" # acl.deny 設定ãŒç„¡ã„å ´åˆã€å…¨ãƒ¦ãƒ¼ã‚¶ã«ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚\n"
+" # 記述形å¼: åˆè‡´ãƒ‘ターン = ユーザå, ..., @グループå, ..."
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+" # 全ユーザã«ãƒžãƒƒãƒã•ã›ã‚‹å ´åˆã¯ã€å€¤ã«ã‚¢ã‚¹ã‚¿ãƒªã‚¹ã‚¯ã‚’指定:\n"
+" # my/glob/pattern = *"
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+" # user6 ã¯å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢:\n"
+" ** = user6"
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+" # グループ \"hg-denied\" ã¯å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢:\n"
+" ** = @hg-denied"
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+" # 全ユーザã«å¯¾ã—㦠\"DONT-TOUCH-THIS.txt\" ã¯ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã€‚\n"
+" # (ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªãƒ¦ãƒ¼ã‚¶ã§ã‚ã£ã¦ã‚‚åŒæ§˜)\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+" [acl.allow]\n"
+" # 設定ファイル㫠acl.allow セクションãŒç„¡ã„å ´åˆã€å…¨ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦ã€\n"
+" # 全アクセスãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚ 空㮠acl.allow セクションã¯ã€\n"
+" # 全ユーザã«å¯¾ã—ã¦ã€Œè¨±å¯ã‚’与ãˆãªã„ã€ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+" # ユーザ \"doc_writer\" 㯠\"docs\" é…下ã®ä»»æ„ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½:\n"
+" docs/** = doc_writer"
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+" # ユーザ \"jack\" ã¨ã‚°ãƒ«ãƒ¼ãƒ— \"designers\" 㯠\"images\" é…下ã®ä»»æ„ã®\n"
+" # ファイルã«ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½:\n"
+" images/** = jack, @designers"
+
+msgid ""
+" # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+" # will have write access to any file under the \"resources\" folder\n"
+" # (except for 1 file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+" # acl.deny ã§ç¦æ­¢ã•ã‚Œã¦ã„ã‚‹ \"user6\" ユーザãŠã‚ˆã³ \"hg-denied\"\n"
+" # グループã«å±žã™ã‚‹ãƒ¦ãƒ¼ã‚¶ä»¥å¤–ã®ã€å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦\n"
+" # \"resources\" é…下ã®ä»»æ„ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€‚\n"
+" # 但㗠acl.deny ã§å…¨ãƒ¦ãƒ¼ã‚¶ã«ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã•ã‚Œã¦ã„ã‚‹\n"
+" # src/main/resources/DONT-TOUCH-THIS.txt を除ã:\n"
+" src/main/resources/** = *"
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+msgid ""
+"Examples using the \"!\" prefix\n"
+"............................."
+msgstr ""
+"æ¡ä»¶å転(\"!\")設定例\n"
+"..................."
+
+msgid ""
+"Suppose there's a branch that only a given user (or group) should be able "
+"to\n"
+"push to, and you don't want to restrict access to any other branch that may\n"
+"be created."
+msgstr ""
+"ä»®ã«ã€ 指定ユーザ (åˆã¯ã‚°ãƒ«ãƒ¼ãƒ—) ã®å±¥æ­´ã®ã¿ã‚’å映ã•ã›ãŸã„ブランãƒãŒã‚ã‚Šã€\n"
+"ブランãƒç”Ÿæˆã‚‚å«ã‚ã¦ã€ ãれ以外ã®ã‚¢ã‚¯ã‚»ã‚¹ã¯åˆ¶é™ã—ãŸããªã„ã€ã¨ã—ã¾ã™ã€‚"
+
+msgid ""
+"The \"!\" prefix allows you to prevent anyone except a given user or group "
+"to\n"
+"push changesets in a given branch or path."
+msgstr ""
+"\"!\" 指定を使ã†ã“ã¨ã§ã€ 指定ユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—以外ã«ã‚ˆã‚‹å±¥æ­´ã®å映をã€\n"
+"特定ブランãƒï¼ãƒ‘スã«å¯¾ã—ã¦æŠ‘æ­¢ã§ãã¾ã™ã€‚"
+
+msgid ""
+"In the examples below, we will:\n"
+"1) Deny access to branch \"ring\" to anyone but user \"gollum\"\n"
+"2) Deny access to branch \"lake\" to anyone but members of the group \"hobbit"
+"\"\n"
+"3) Deny access to a file to anyone but user \"gollum\""
+msgstr ""
+"以下ã®è¨­å®šã«ã‚ˆã‚Š:\n"
+"1) ユーザ \"gollum\" 以外ã®ãƒ–ランム\"ring\" ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã€\n"
+"2) グループ \"hobbit\" 以外ã®ãƒ–ランム\"lake\" ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã€\n"
+"3) ユーザ \"gollum\" 以外㮠``/misty/mountains/cave/ring``\n"
+"ファイルã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã€ç¦æ­¢ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" [acl.allow.branches]\n"
+" # Empty"
+msgstr ""
+" [acl.allow.branches]\n"
+" # 空"
+
+msgid ""
+" # 1) only 'gollum' can commit to branch 'ring';\n"
+" # 'gollum' and anyone else can still commit to any other branch.\n"
+" ring = !gollum"
+msgstr ""
+" # 1) ユーザ 'gollum' ã®ã¿ãŒãƒ–ランム'ring' ã«ã‚³ãƒŸãƒƒãƒˆå¯èƒ½ã€‚\n"
+" # ãã®ä»–ã®ãƒ–ランãƒã¸ã® 'gollum' ï¼ä»–ã®ãƒ¦ãƒ¼ã‚¶ã®ã‚³ãƒŸãƒƒãƒˆå¯å¦ã¯å¤‰ã‚らãšã€‚\n"
+" ring = !gollum"
+
+msgid ""
+" # 2) only members of the group 'hobbit' can commit to branch 'lake';\n"
+" # 'hobbit' members and anyone else can still commit to any other branch.\n"
+" lake = !@hobbit"
+msgstr ""
+" # 2) グループ 'hobbit' ã®ãƒ¡ãƒ³ãƒãƒ¼ã¿ãŒãƒ–ランム'lake' ã«ã‚³ãƒŸãƒƒãƒˆå¯èƒ½ã€‚\n"
+" # ãã®ä»–ã®ãƒ–ランãƒã¸ã® 'hobbit' ï¼ä»–ã®ãƒ¦ãƒ¼ã‚¶ã®ã‚³ãƒŸãƒƒãƒˆå¯å¦ã¯å¤‰ã‚らãšã€‚\n"
+" lake = !@hobbit"
+
+msgid " # You can also deny access based on file paths:"
+msgstr " # ファイルパスã«ã‚ˆã‚‹ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ã‚‚å¯èƒ½:"
+
+msgid ""
+" [acl.allow]\n"
+" # Empty"
+msgstr ""
+" [acl.allow]\n"
+" # 空"
+
+msgid ""
+" [acl.deny]\n"
+" # 3) only 'gollum' can change the file below;\n"
+" # 'gollum' and anyone else can still change any other file.\n"
+" /misty/mountains/cave/ring = !gollum"
+msgstr ""
+" [acl.deny]\n"
+" # 3) ユーザ 'gollum' ã®ã¿ãŒä»¥ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’変更å¯èƒ½ã€‚\n"
+" # ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã® 'gollum' ï¼ä»–ã®ãƒ¦ãƒ¼ã‚¶ã®æ”¹å¤‰å¯å¦ã¯å¤‰ã‚らãšã€‚\n"
+" /misty/mountains/cave/ring = !gollum"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "グループ '%s' ã¯æœªå®šç¾©ã§ã™"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr "設定エラー - フック種別 \"%s\" ã¯å±¥æ­´ã®å–ã‚Šè¾¼ã¿ã‚’抑止ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" ã¯ãƒ–ランム\"%s\" ã§æ‹’å¦ã•ã‚Œã¾ã—ãŸ(リビジョン \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" ã¯ãƒ–ランム\"%s\" ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(リビジョン \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" ã¯ãƒ•ã‚¡ã‚¤ãƒ« \"%s\" ã§æ‹’å¦ã•ã‚Œã¾ã—ãŸ(リビジョン \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr ""
+"acl: ユーザ \"%s\" ã¯ãƒ•ã‚¡ã‚¤ãƒ« \"%s\" ãŒè¨±å¯ã•ã‚Œã¦ã„ã¾ã›ã‚“(リビジョン \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr "Bugzilla ãƒã‚°ç®¡ç†ã‚·ã‚¹ãƒ†ãƒ ã¨ã®é€£æºç”¨ãƒ•ãƒƒã‚¯é›†"
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+"本エクステンションã®ãƒ•ãƒƒã‚¯ã¯ã€ 記録ã•ã‚ŒãŸãƒªãƒ“ジョンã‹ã‚‰ã® Bugzilla ãƒã‚°\n"
+"ID 検出を契機ã«ã€ Bugzilla 上ã®ãƒã‚°æƒ…å ±ã«å¯¾ã—ã¦ã€ コメントを追加ã—ã¾ã™ã€‚\n"
+"Mercurial ã®ãƒ†ãƒ³ãƒ—レート機能を使ã†ã“ã¨ã§ã€ コメント形å¼ã‚’変更å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"コミットログã‹ã‚‰ã®ãƒã‚°IDã®æŠ½å‡ºã§ã¯ã€ Bugzilla ã®ã€Œä½œæ¥­æ™‚é–“ã€ã‚’æ›´æ–°ã™ã‚‹ã€\n"
+"所è¦æ™‚間情報ã®å–り出ã—ã‚‚å¯èƒ½ã§ã™ (オプション)。 ãƒã‚°çŠ¶æ…‹ã‚’「解決済ã¿ã€\n"
+"ã«ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚"
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr "Bugzilla ã¨ã®é€£æºæ–¹å¼ã¯ã€ 以下ã®3種類ã‹ã‚‰é¸æŠžã§ãã¾ã™:"
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr "1. Bugzilla XMLRPC インタフェースを使用。 Bugzilla 3.4 以é™ãŒå¿…è¦ã€‚"
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"2. データã®ç¢ºèªã« Bugzilla XMLRPC を〠コメントã®è¿½åŠ ã« Bugzilla\n"
+" メールインタフェースを使用。 Bugzilla 3.4 以é™ãŒå¿…è¦ã€‚"
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+"3. Bugzilla データベースを直接æ“作。 MySQL を使用ã™ã‚‹ Bugzilla é™å®šã€‚\n"
+" Python MySQLdb ãŒå¿…è¦ã€‚"
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+"データベースã®ç›´æŽ¥æ“作ã§ã®é€£æºã¯ã€ スキーマ変更ã®å½±éŸ¿ã‚’å—ã‘易ãã€\n"
+"且ã¤ã€ コメント追加通知ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã«ã€ 寄贈扱ㄠ(contrib) ã® Bugzilla\n"
+"スクリプトを必è¦ã¨ã—ã¾ã™ã€‚ Mercurial ã®å®Ÿè¡Œãƒ¦ãƒ¼ã‚¶ã®æ¨©é™ãŒãã®ã¾ã¾ã€\n"
+"ã“ã®ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œæ¨©é™ã¨ãªã‚Šã¾ã™ãŒã€ Bugzilla ã®ç¨¼å‹•ãƒ›ã‚¹ãƒˆä¸Šã§ã®å®Ÿè¡Œã§ã€\n"
+"且㤠Bugzilla ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿å‡ºã—権é™ã‚’æŒã£ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"ãã‚Œã«åŠ ãˆã¦ã€ Bugzilla データベースã«å¯¾ã—ã¦ã€ フルアクセスå¯èƒ½ãª MySQL\n"
+"ユーザã®ã€ ユーザåã¨ãƒ‘スワードãŒå¿…è¦ã¨ãªã‚Šã¾ã™ã€‚ 以上ã®æ¡ä»¶ã‹ã‚‰ã€\n"
+"ã“ã®é€£æºæ–¹å¼ã¯ã€ ç¾åœ¨ã¯éžæŽ¨å¥¨ã§ã‚り〠Bugzilla ã®æ›´æ–°ã«ã‚‚対応ã—ã¾ã›ã‚“。\n"
+"ã“ã®é€£æºæ–¹å¼ã§ã¯ã€ コメントã®è¿½åŠ ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
+"later."
+msgstr ""
+"XMLRPC 連æºã§ã¯ã€ Bugzilla ユーザåã¨ãƒ‘スワードを設定ファイルã«è¨˜è¿°ã—ã€\n"
+"当該ユーザã®æ¨©é™ã§ã‚³ãƒ¡ãƒ³ãƒˆãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚ ユーザåã¨ãƒ‘スワードã¯ã€\n"
+"当該リãƒã‚¸ãƒˆãƒªä¸Šã§ Mercurial を実行ã™ã‚‹ã€ 全ユーザã‹ã‚‰å‚ç…§å¯èƒ½ãªãŸã‚ã€\n"
+"コメント追加ã«å¿…è¦ãªæ¨©é™ã—ã‹æŒãŸãªã„〠Bugzilla 連æºå°‚用ユーザã§ã€\n"
+"é‹ç”¨ã™ã‚‹äº‹ã‚’推奨ã—ã¾ã™ã€‚ ãƒã‚°ã®çŠ¶æ…‹ã‚’「解決済ã¿ã€ (fixed) ã«ã™ã‚‹ã«ã¯ã€\n"
+"Bugzilla 4.0 版以é™ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+"XMLRPC/email 連æºã§ã¯ã€ Bugzilla ã¸ã®å•ã„åˆã‚ã›ã« XMLRPC を使用ã—ã¾ã™ãŒã€\n"
+"ãƒã‚°ã¸ã®ã‚³ãƒ¡ãƒ³ãƒˆè¿½åŠ ã«ã¯ã€ メールを使用ã—ã¾ã™ã€‚ メール㮠From 欄ã«ã¯ã€\n"
+"å„リビジョンã«è¨˜éŒ²ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶æƒ…報中ã®ã€ メールアドレスãŒä½¿ç”¨ã•ã‚Œã‚‹ãŸã‚〠\n"
+"å„リビジョンã®ä½œæˆè€…ã«ã‚ˆã£ã¦ã€ コメントãŒè¿½åŠ ã•ã‚ŒãŸã‚ˆã†ã«è¦‹ãˆã¾ã™ã€‚\n"
+"リビジョンã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹æƒ…å ±ãŒã€ Bugzilla ユーザã®ã‚‚ã®ã¨å¯¾å¿œã—ãªã„å ´åˆã€\n"
+"Bugzilla ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶åã§ã€ メールãŒé€ä¿¡ã•ã‚Œã¾ã™ã€‚\n"
+"サãƒãƒ¼ãƒˆå¯¾è±¡ã®å…¨ã¦ã®ç‰ˆã® Bugzilla ã§ã€ ãƒã‚°ã®çŠ¶æ…‹ã‚’「解決ã€ã«ã§ãã¾ã™ã€‚"
+
+msgid "Configuration items common to all access modes:"
+msgstr "全連æºæ–¹å¼ã§å…±é€šã®è¨­å®šé …ç›®ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+"bugzilla.version\n"
+" 連æºæ–¹å¼ã®é¸æŠžã€‚ 指定å¯èƒ½ãªå€¤ã¯ä»¥ä¸‹ã®é€šã‚Š:"
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+" :``xmlrpc``: Bugzilla XMLRPC 経由ã§ã®é€£æº\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC ã¨ãƒ¡ãƒ¼ãƒ«çµŒç”±ã§ã®é€£æº\n"
+" :``3.0``: MySQL 経由ã§ã®é€£æº: Bugzilla 3.0 以é™é™å®š\n"
+" :``2.18``: MySQL 経由ã§ã®é€£æº: Bugzilla 2.18 以上 3.0 未満é™å®š\n"
+" :``2.16``: MySQL 経由ã§ã®é€£æº: Bugzilla 2.16 以上 2.18 未満é™å®š"
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs for update in changeset commit "
+"message.\n"
+" It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+" IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.regexp\n"
+" 状態更新対象ã®ãƒã‚°ID群を〠コミットログã‹ã‚‰æŠ½å‡ºã™ã‚‹ãŸã‚ã®æ­£è¦è¡¨ç¾ã€‚\n"
+" éžæ•°å€¤æ–‡å­—ã§åŒºåˆ‡ã‚‰ã‚ŒãŸãƒã‚°ID群ã«åˆè‡´ã™ã‚‹ ``<ids>`` åã®ã‚°ãƒ«ãƒ¼ãƒ—記述\n"
+" ( \"()\") ãŒå¿…é ˆã§ã™ã€‚ ãƒã‚°ã«å¯¾ã™ã‚‹ä½œæ¥­æ™‚間を表ã™ã€ 少数点数ã«åˆè‡´ã™ã‚‹\n"
+" ``<hours>`` åグループも記述å¯èƒ½ã§ã™ã€‚ åå‰ä»˜ãグループ記述ãŒç„¡ã„å ´åˆã€\n"
+" 最åˆã® \"()\" グループãŒãƒã‚°ID群ã«ã€ 作業時間ã®æ›´æ–°ã¯ç„¡ã—ã€\n"
+" ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ デフォルトã®æ­£è¦è¡¨ç¾ã¯ ``Bug 1234``〠``Bug no.\n"
+" 1234``〠``Bug number 1234``〠``Bugs 1234,5678``〠``Bug 1234 and\n"
+" 5678`` ãŠã‚ˆã³é¡žä¼¼ã®å½¢å¼ã«åŠ ãˆã¦ã€ å‰ç½®è©žã« ``h`` ãªã„ã— ``hours``\n"
+" ãŒä»˜ã‘られãŸæ™‚é–“æ•° (例: ``hours 1.5``) ãŒç¶šãã‚‚ã®ã«åˆè‡´ã—ã¾ã™ã€‚\n"
+" 文字大å°ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"bugzilla.fixregexp\n"
+" Regular expression to match bug IDs for marking fixed in changeset\n"
+" commit message. This must contain a \"()\" named group ``<ids>` "
+"containing\n"
+" the bug IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
+"1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.fixregexp\n"
+" 「解決済ã¿ã€åŒ–ã™ã‚‹ãƒã‚°ID群を〠コミットログã‹ã‚‰æŠ½å‡ºã™ã‚‹ãŸã‚ã®æ­£è¦è¡¨ç¾ã€‚\n"
+" éžæ•°å€¤æ–‡å­—ã§åŒºåˆ‡ã‚‰ã‚ŒãŸãƒã‚°ID群ã«åˆè‡´ã™ã‚‹ ``<ids>`` åã®ã‚°ãƒ«ãƒ¼ãƒ—記述\n"
+" ( \"()\") ãŒå¿…é ˆã§ã™ã€‚ ãƒã‚°ã«å¯¾ã™ã‚‹ä½œæ¥­æ™‚間を表ã™ã€ 少数点数ã«åˆè‡´ã™ã‚‹\n"
+" ``<hours>`` åグループも記述å¯èƒ½ã§ã™ã€‚ åå‰ä»˜ãグループ記述ãŒç„¡ã„å ´åˆã€\n"
+" 最åˆã® \"()\" グループãŒãƒã‚°ID群ã«ã€ 作業時間ã®æ›´æ–°ã¯ç„¡ã—ã€\n"
+" ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ デフォルトã®æ­£è¦è¡¨ç¾ã¯ã€ ``Fixes 1234``〠``Fixes bug\n"
+" 1234``〠``Fixes bugs 1234,5678``〠``Fixes 1234 and 5678``\n"
+" ãŠã‚ˆã³é¡žä¼¼ã®å½¢å¼ã«åŠ ãˆã¦ã€ å‰ç½®è©žã« ``h`` ãªã„ã— ``hours``\n"
+" ãŒä»˜ã‘られãŸæ™‚é–“æ•° (例: ``hours 1.5``) ãŒç¶šãã‚‚ã®ã«åˆè‡´ã—ã¾ã™ã€‚\n"
+" 文字大å°ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"bugzilla.fixstatus\n"
+" The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+" ãƒã‚°ã‚’「解決ã€çŠ¶æ…‹ã«ã™ã‚‹éš›ã®ã€ŒçŠ¶æ…‹ã€å€¤ã€‚ デフォルト値:\n"
+" ``RESOLVED`` (対象済ã¿)"
+
+msgid ""
+"bugzilla.fixresolution\n"
+" The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+" ãƒã‚°ã‚’「解決ã€çŠ¶æ…‹ã«ã™ã‚‹éš›ã®ã€Œå¯¾å‡¦æ–¹æ³•ã€å€¤ã€‚デフォルト値:\n"
+" ``FIXED`` (修正済ã¿)"
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+"bugzilla.style\n"
+" コメントã®æ•´å½¢ã«ä½¿ç”¨ã™ã‚‹ã‚¹ã‚¿ã‚¤ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã€‚"
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+"bugzilla.template\n"
+" コメントã®æ•´å½¢ã«ä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レート。 スタイルファイル指定よりもã€\n"
+" ã“ã¡ã‚‰ãŒå„ªå…ˆã—ã¾ã™ã€‚ 通常ã®ã‚‚ã®ã«åŠ ãˆã¦ã€ 以下ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãŒä½¿ç”¨ã§ãã¾ã™:"
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+" :``{bug}``: Bugzilla ã®ãƒã‚° ID\n"
+" :``{root}``: Mercurial リãƒã‚¸ãƒˆãƒªã®ãƒ•ãƒ«ãƒ‘ス\n"
+" :``{webroot}``: Mercurial リãƒã‚¸ãƒˆãƒªã®ã‚¹ãƒ©ãƒƒã‚·ãƒ¥é™¤å¤– (strip) 後パス\n"
+" :``{hgweb}``: Mercurial リãƒã‚¸ãƒˆãƒªã® URL 生æˆç”¨ã®ãƒ™ãƒ¼ã‚¹ URL"
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+" 無指定ã®å ´åˆã€ ``リãƒã‚¸ãƒˆãƒª {root} ã®ãƒªãƒ“ジョン {node|short} ãŒãƒã‚°\n"
+" {bug} ã«é–¢é€£ã€‚\\n詳細:\\n\\t{desc|tabindent}`` ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+"bugzilla.strip\n"
+" テンプレートã«ãŠã‘ã‚‹ ``{webroot}`` 相当を得るãŸã‚ã«ã€ Mercurial\n"
+" リãƒã‚¸ãƒˆãƒªã®ãƒ‘ス (テンプレート㮠``{root}`` 相当) 冒頭ã‹ã‚‰ã€\n"
+" å–り除ãスラッシュã®æ•°ã€‚ 例ãˆã° ``{root}`` ㌠``/var/local/my-project``\n"
+" ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã€ ``{webroot}`` ã‚’ ``my-project`` ã«ã™ã‚‹ãŸã‚ã«ã¯ã€\n"
+" strip ã« 2 を指定ã—ã¾ã™ã€‚ デフォルト値㯠0。"
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+"web.baseurl\n"
+" Mercurial リãƒã‚¸ãƒˆãƒªã® URL 生æˆç”¨ãƒ™ãƒ¼ã‚¹ URL。 テンプレートキーワード\n"
+" ``{hgweb}`` ã§å‚ç…§å¯èƒ½ã€‚"
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr "連æºæ–¹å¼ XMLRPC+email 㨠MySQL ã§å…±é€šã®è¨­å®šé …ç›®ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+"bugzilla.usermap\n"
+" Mercurial ã®å„リビジョンã®ã€ 生æˆè€…情報ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ã€ Bugzilla\n"
+" ユーザã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã€ 対応一覧ファイルã¸ã®ãƒ‘ス。 対象ファイルã¯ã€\n"
+" 1è¡Œ1対応付ã‘ã®ã€ 以下ã®å½¢å¼ã§è¨˜è¿°ã—ã¦ãã ã•ã„::"
+
+msgid " committer = Bugzilla user"
+msgstr " リビジョン作æˆè€… = Bugzilla ユーザ"
+
+msgid " See also the ``[usermap]`` section."
+msgstr " ``[usermap]`` セクションã®èª¬æ˜Žã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+"``[usermap]`` セクションã¯ã€ Mercurial ã®å„リビジョンã®ã€\n"
+"生æˆè€…情報ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¨ã€ Bugzilla ユーザã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã€\n"
+"対応付ã‘ã‚’è¡Œã„ã¾ã™ã€‚ ``bugzilla.usermap`` 設定ã®èª¬æ˜Žã‚‚å‚ç…§ã—ã¦ãã ã•ã„。\n"
+"記述形å¼ã¯ ``リビジョン生æˆè€… = Bugzilla ユーザ`` ã§ã™ã€‚"
+
+msgid "XMLRPC access mode configuration:"
+msgstr "XMLRPC 連æºå›ºæœ‰ã®è¨­å®šé …ç›®ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+"bugzilla.bzurl\n"
+" アクセス先 Bugzilla ã®ãƒ™ãƒ¼ã‚¹ URL。\n"
+" デフォルト値㯠``http://localhost/bugzilla`` 。"
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Bugzilla ã¨ã® XMLRPC 連æºã§ã€ ログインã«ä½¿ç”¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶å。\n"
+" デフォルト値㯠``bugs`` 。"
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+"bugzilla.password\n"
+" Bugzilla 連æºã§ã€ ログインã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワード。"
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr ""
+"XMLRPC+email 経由ã§ã®é€£æºã§ã¯ã€ XMLRPC 経由連æºã«é–¢ã™ã‚‹è¨­å®šã«åŠ ãˆã¦ã€\n"
+"以下ã®è¨­å®šãŒå¿…è¦ã§ã™:"
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+"bugzilla.bzemail\n"
+" Bugzilla ã¸é€ä¿¡ã™ã‚‹éš›ã®å®›å…ˆãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚"
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+"以上ã®è¨­å®šã«åŠ ãˆã¦ã€ Mercurial ã®ãƒ¡ãƒ¼ãƒ«è¨­å®šã‚‚å¿…è¦ã§ã™ã€‚ hgrc(5)\n"
+"ドキュメント (※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½) ã® ``[email]``\n"
+"ãŠã‚ˆã³ ``[smtp]`` セクションをå‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "MySQL access mode configuration:"
+msgstr "MySQL 経由連æºå›ºæœ‰ã®è¨­å®šé …ç›®ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:"
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+"bugzilla.host\n"
+" Bugzilla データベースをæŒã¤ MySQL サーãƒã®ãƒ›ã‚¹ãƒˆå。\n"
+" デフォルト値㯠``localhost`` 。"
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+"bugzilla.db\n"
+" MySQL ã«ãŠã‘ã‚‹ Bugzilla データベースã®åå‰ã€‚ デフォルト値㯠``bugs`` 。"
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" MySQL サーãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶å。 デフォルト値㯠``bugs`` 。"
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+"bugzilla.password\n"
+" MySQL サーãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ä½¿ç”¨ã™ã‚‹ãƒ‘スワード。"
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+"bugzilla.timeout\n"
+" データベース接続ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæŒ‡å®š (å˜ä½:秒)。 デフォルト値㯠5。"
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+"bugzilla.bzuser\n"
+" リビジョン生æˆè€…åãŒã€ Bugzilla ユーザã¨å¯¾å¿œã—ãªã„å ´åˆã«ã€\n"
+" コメント追加ã«ä½¿ç”¨ã™ã‚‹ Bugzilla ユーザå (予備設定)"
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+"bugzilla.bzdir\n"
+" Bugzilla ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚ デフォルト㮠``notify``\n"
+" 設定ã«ãŠã„ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ デフォルト値㯠``/var/www/html/bugzilla`` 。"
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+"bugzilla.notify\n"
+" ãƒã‚°æƒ…å ±ã®æ›´æ–°é€šçŸ¥ã‚’〠Bugzilla ã«ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã•ã›ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã€‚\n"
+" 3ã¤ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ ``bzdir``〠``id`` (ãƒã‚° ID) ãŠã‚ˆã³ ``user``\n"
+" (リビジョン作æˆè€…ã® Bugzilla メールアドレス) ãŒã€ ç½®æ›æŒ‡å®šå¯èƒ½ã§ã™ã€‚\n"
+" デフォルト値㯠MySQL ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¾å­˜ã—ã¦ãŠã‚Šã€ 2.18 版以é™ã§ã¯ã€\n"
+" \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s\"\n"
+" ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Activating the extension::"
+msgstr "エクステンションã®æœ‰åŠ¹åŒ–::"
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+" [hooks]\n"
+" # リビジョンãŒå½“該リãƒã‚¸ãƒˆãƒªã« push/pull ã§å–ã‚Šè¾¼ã¾ã‚ŒãŸå¥‘æ©Ÿã§\n"
+" # Bugzilla 連æºã®ãƒ•ãƒƒã‚¯ã‚’実行\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+
+msgid "Example configurations:"
+msgstr "設定例:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"以下㯠XMLRPC 連æºã®è¨­å®šä¾‹ã§ã™ã€‚ ``http://my-project.org/bugzilla`` ã®\n"
+"Bugzilla ã¨é€£æºã—〠ユーザå ``bugmail@my-project.org``〠パスワード\n"
+"``plugh`` ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã™ã€‚ URL ``http://my-project.org/hg``\n"
+"é…下ã§ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã€ ``/var/local/hg/repos/`` é…下ã®è¤‡æ•°ãƒªãƒã‚¸ãƒˆãƒªã§ã®ã€\n"
+"設定共有を想定ã—ã¦ã„ã¾ã™::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+"以下㯠XMLRPC+email 連æºã®è¨­å®šä¾‹ã§ã™ã€‚ ``http://my-project.org/bugzilla``\n"
+"ã® Bugzilla ã¨é€£æºã—〠ユーザå ``bugmail@my-project.org``〠パスワード\n"
+"``plugh`` ã§ãƒ­ã‚°ã‚¤ãƒ³ã—ã¾ã™ã€‚ URL ``http://my-project.org/hg``\n"
+"é…下ã§ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã€ ``/var/local/hg/repos/`` é…下ã®è¤‡æ•°ãƒªãƒã‚¸ãƒˆãƒªã§ã®ã€\n"
+"設定共有を想定ã—ã¦ã„ã¾ã™ã€‚ コメントã®è¿½åŠ ã¯ã€ Bugzilla ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹\n"
+"``bugzilla@my-project.org`` å®›ã«é€ä¿¡ã•ã‚Œã¾ã™::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"以下㯠MySQL 連æºã®è¨­å®šä¾‹ã§ã™ã€‚ ``/opt/bugzilla-3.2`` ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚ŒãŸ\n"
+"Bugzilla 3.2 を想定ã—ã¦ã„ã¾ã™ã€‚ MySQL サーãƒã®ãƒ›ã‚¹ãƒˆå㌠``localhost``ã€\n"
+"Bugzilla データベースå㌠``bugs``〠MySQL サーãƒã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã«ã€\n"
+"ユーザå ``bugs``〠パスワード ``XYZZY`` を使用ã—ã¾ã™ã€‚ URL\n"
+"``http://my-project.org/hg``\n"
+"é…下ã§ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã€\n"
+"``/var/local/hg/repos/`` é…下ã®è¤‡æ•°ãƒªãƒã‚¸ãƒˆãƒªã§ã®ã€\n"
+"設定共有を想定ã—ã¦ã„ã¾ã™::"
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+"上記設定例㧠Bugzilla ã«è¿½åŠ ã•ã‚Œã‚‹ã‚³ãƒ¡ãƒ³ãƒˆã¯ã€ å…¨ã¦ä»¥ä¸‹ã®å½¢å¼ã¨ãªã‚Šã¾ã™::"
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr " (※ ã“ã“ã«ã¯å„リビジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ãŒå±•é–‹ã•ã‚Œã¾ã™)\n"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "python mysql ã®ã‚µãƒãƒ¼ãƒˆãŒåˆ©ç”¨ã§ãã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "%s:%s ã« %s ã¨ã—ã¦æŽ¥ç¶šã—ã¦ã„ã¾ã™ (パスワード:%s)\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "å•ã„åˆã‚ã›: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "å•ã„åˆã‚ã›ã«å¤±æ•—: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "未知ã®ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚¹ã‚­ãƒ¼ãƒž"
+
+#, python-format
+msgid "bug %d does not exist\n"
+msgstr "ãƒã‚° %d ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "ãƒã‚° %d ã«ã¨ã£ã¦ãƒªãƒ“ジョン %s ã¯æ—¢çŸ¥ã®ã‚‚ã®ã§ã™\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "bugzilla ã¸ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡æŒ‡ç¤ºä¸­:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " ãƒã‚° %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "通知コマンド %s 実行中\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "bugzilla 通知コマンド実行エラー: %s"
+
+msgid "done\n"
+msgstr "完了\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "ユーザ %s を検索ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "%s ã® buzilla ユーザ ID を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "%s ã‹ %s ã® buzilla ユーザ ID を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL 連æºã§ã¯ãƒã‚°çŠ¶æ…‹ã‚’æ›´æ–°ã§ãã¾ã›ã‚“\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr "Bugzilla/XMLRPC 連æºã§ã®ãƒã‚°çŠ¶æ…‹æ›´æ–°ã¯ Bugzilla 4.0 以é™ãŒå¿…è¦ã§ã™\n"
+
+msgid "configuration 'bzemail' missing"
+msgstr "'bzemail' 設定ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr "デフォルト㮠bugzilla ユーザ %s ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "bugzilla ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: ä¸æ­£ãªæ™‚間指定ã§ã™\n"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"リãƒã‚¸ãƒˆãƒª {root} ã®ãƒªãƒ“ジョン {node|short} ãŒãƒã‚° {bug} ã«é–¢é€£ã€‚\n"
+"詳細:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr "フック種別 %s ã«ãƒªãƒ“ジョン ID ãŒæŒ‡å®šã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Bugzilla エラー: %s"
+
+msgid "command to display child changesets (DEPRECATED)"
+msgstr "å­ãƒªãƒ“ジョン表示ã®ã‚³ãƒžãƒ³ãƒ‰ (éžæŽ¨å¥¨)"
+
+msgid ""
+"This extension is deprecated. You should use :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+msgstr ""
+"本エクステンションã¯éžæŽ¨å¥¨ã§ã™ã€‚:hg:`log -r \"children(REV)\"`\n"
+"を使用ã—ã¦ãã ã•ã„。\n"
+
+msgid "show the children of the given or working directory revision"
+msgstr "指定リビジョンã®å­ãƒªãƒ“ジョンã®è¡¨ç¤º"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" 作業領域ã®å­ãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚ -r/--rev ã«ã‚ˆã‚‹ãƒªãƒ“ジョン指定ãŒ\n"
+" ã‚ã‚‹å ´åˆã¯ã€ 指定リビジョンã®å­ãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚ 引数ã¨ã—ã¦\n"
+" ファイルãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ファイルãŒ(作業領域ã®ãƒªãƒ“ジョンãªã„ã—\n"
+" --rev ã§æŒ‡å®šã•ã‚ŒãŸãƒªãƒ“ジョンã®å¾Œã§)最後ã«å¤‰æ›´ã•ã‚ŒãŸãƒªãƒ“ジョンを表示\n"
+" ã—ã¾ã™ã€‚\n"
+" "
+
+msgid "REV"
+msgstr "リビジョン"
+
+msgid "show children of the specified revision"
+msgstr "指定リビジョンã®å­ãƒªãƒ“ジョンã®è¡¨ç¤º"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r REV] [FILE]"
+
+msgid "command to display statistics about repository history"
+msgstr "変更履歴ã®çµ±è¨ˆæƒ…報表示ã®ã‚³ãƒžãƒ³ãƒ‰"
+
+#, python-format
+msgid "revision %d is a merge, ignoring...\n"
+msgstr "マージ実施リビジョン %d を無視...\n"
+
+msgid "analyzing"
+msgstr "解æžä¸­"
+
+msgid "histogram of changes to the repository"
+msgstr "リãƒã‚¸ãƒˆãƒªã«ãŠã‘る変更ã®çµ±è¨ˆåˆ†å¸ƒè¡¨ç¤º"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+" 本コマンドã¯ã€ 変更行数ãªã„ã—リビジョン数ã®åº¦æ•°åˆ†å¸ƒã‚’〠テンプレート\n"
+" 指定ã«ã‚ˆã£ã¦ã‚°ãƒ«ãƒ¼ãƒ—化ã—ã¦ã‚°ãƒ©ãƒ•è¡¨ç¤ºã—ã¾ã™ã€‚\n"
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ リビジョン作æˆè€…毎ã«å¤‰æ›´è¡Œæ•°ã‚’グループ化ã—ã¾ã™ã€‚\n"
+" --dateformat ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 度数分布ã¯æ—¥æ™‚ã§ã‚°ãƒ«ãƒ¼ãƒ—化ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ 度数分布ã®çµ±è¨ˆå¯¾è±¡ã¯å¤‰æ›´è¡Œæ•°ã¨ãªã‚Šã¾ã™ãŒã€\n"
+" --changesets ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 対象リビジョンã®æ•°ãŒçµ±è¨ˆå¯¾è±¡ã¨\n"
+" ãªã‚Šã¾ã™ã€‚"
+
+msgid " Examples::"
+msgstr " 例::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+" # ユーザ毎ã®å¤‰æ›´è¡Œæ•°ã®è¡¨ç¤º\n"
+" hg churn -t '{author|email}'"
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+" # 日毎ã®æ´»ç™ºåº¦(コミット実施数)を表示\n"
+" hg churn -f '%H' -s -c"
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+" # 月毎ã®æ´»ç™ºåº¦ã‚’表示\n"
+" hg churn -f '%Y-%m' -s -c"
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+" # 年毎ã®å¤‰æ›´è¡Œæ•°ã‚’表示\n"
+" hg churn -f '%Y' -s"
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+" 以下ã®å½¢å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定ã™ã‚‹ã“ã¨ã§ã€ リビジョンã«è¨˜éŒ²ã•ã‚ŒãŸé›»å­\n"
+" メールアドレスを別ã®ã‚‚ã®ã«å¤‰æ›ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™::"
+
+msgid " <alias email> = <actual email>"
+msgstr " <別å> = <実å>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+" 上記形å¼ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ --aliases ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯æŒ‡å®šã•ã‚ŒãŸ\n"
+" ファイルãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆ\n"
+" 直下ã«ã‚ã‚‹ .hgchurn ã¨ã„ã†ãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚‚ã†ã¨ã—ã¾ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "ä¸æ­£ãªå½¢å¼ã®åˆ¥åã¯ç„¡è¦–ã—ã¾ã™: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "処ç†å¯¾è±¡ã¨ã™ã‚‹ç‰¹å®šãƒªãƒ“ジョンï¼ç¯„囲ã®æŒ‡å®š"
+
+msgid "DATE"
+msgstr "日時"
+
+msgid "count rate for revisions matching date spec"
+msgstr "指定日時ã¨ä¸€è‡´ã—ãŸãƒªãƒ“ジョンを処ç†å¯¾è±¡ã¨ã™ã‚‹"
+
+msgid "TEMPLATE"
+msgstr "テンプレート"
+
+msgid "template to group changesets"
+msgstr "リビジョン表示をグループ化ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ³ãƒ—レート"
+
+msgid "FORMAT"
+msgstr "書å¼"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr "日時グループ化ã®ãŸã‚ã® strftime 互æ›å½¢å¼ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ"
+
+msgid "count rate by number of changesets"
+msgstr "リビジョン数ã§çµ±è¨ˆ"
+
+msgid "sort by key (default: sort by count)"
+msgstr "キーã«ã‚ˆã‚‹æ•´åˆ—(無指定時: 統計é‡ã§æ•´åˆ—)"
+
+msgid "display added/removed lines separately"
+msgstr "追加ï¼å‰Šé™¤è¡Œè¡¨ç¤ºã®åˆ†é›¢"
+
+msgid "FILE"
+msgstr "ファイル"
+
+msgid "file with email aliases"
+msgstr "ユーザå変æ›ç”¨ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+
+msgid "colorize output from some commands"
+msgstr "コマンド出力ã®ã‚«ãƒ©ãƒ¼åŒ–"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"本エクステンションã¯ã€ status ãŠã‚ˆã³ resolve コマンドã®å ´åˆã¯ã€\n"
+"å„ファイル状態ã«å¿œã˜ã¦ã€ qseries コマンドã®å ´åˆã¯ã€ パッãƒã®é©ç”¨çŠ¶æ³\n"
+"(é©ç”¨æ¸ˆã¿ã€ 未é©ç”¨ã€ ä¸åœ¨) ã«å¿œã˜ã¦ã€ diff 関連コマンドã®å ´åˆã¯ã€\n"
+"追加〠削除〠差分ヘッダãŠã‚ˆã³æœ«å°¾ç©ºç™½æ–‡å­—ã®å„è¦ç´ ã«å¯¾å¿œã—ã¦ã€\n"
+"出力ã«å¯¾ã™ã‚‹è‰²ä»˜ã‘ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"色付ã‘以外ã®åŠ¹æžœã¨ã—ã¦ã€ 文字ã®å¼·èª¿ã‚„〠下線付ã‘ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+"色付ã‘や効果を行ã†ãŸã‚ã®ã€ 端末情報ã®å–å¾—ã«ã¯ã€ デフォルトã§ã¯ terminfo\n"
+"データベースãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ terminfo ãŒä½¿ç”¨ã§ããªã„å ´åˆã¯ã€\n"
+"ECMA-48 SGR 制御機能 (「ANSI エスケープコードã€ã®åˆ¥å) を使用ã—ã¾ã™ã€‚"
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr "デフォルトã®æŒ™å‹•ã¯ã€ 設定ファイルã§ã®è¨˜è¿°ã«ã‚ˆã‚Šä¸Šæ›¸ãã•ã‚Œã¾ã™::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' 指定ã«ã‚ˆã‚ŠåŠ¹æžœãŒå…¨ã¦ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+" tags.normal = green\n"
+" tags.local = black bold"
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+"terminfo 使用時ã«æœ‰åŠ¹ãªåŠ¹æžœã¯ã€ 'blink' 'bold' 'dim' 'inverse'\n"
+"'invisible' 'italic' 'standout' ãŠã‚ˆã³ 'underline' ã§ã™ã€‚\n"
+"ECMA-48 使用時ã«æœ‰åŠ¹ãªåŠ¹æžœã¯ã€ 'bold' 'inverse' 'italic' ãŠã‚ˆã³\n"
+"'underline' ã§ã™ã€‚ å„指定ãŒå®Ÿéš›ã®è¡¨ç¤ºã«ä¸Žãˆã‚‹åŠ¹æžœã¯ã€\n"
+"端末ã®å®Ÿè£…ã«ä¾å­˜ã—ã¾ã™ã€‚ 当該端末ã§ç„¡åŠ¹ãªåŠ¹æžœã«é–¢ã—ã¦ã¯ã€\n"
+"警告等を発ã›ãšã«ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+"pager エクステンションã§ã® ``less -R`` 使用ã¨ã€ terminfo 使用ã®ä½µç”¨ã¯ã€\n"
+"稼動環境ã«ã‚ˆã£ã¦ã¯ã€ 色付ã‘ãŒæ­£ã—ã機能ã—ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"``less -R`` ㌠ECMA-48 ã®è‰²æŒ‡å®šã—ã‹è§£é‡ˆã—ãªã„ã“ã¨ã‹ã‚‰ã€ less\n"
+"ãŒè§£é‡ˆã—ãªã„色指定制御㌠terminfo 使用時ã«é™¤å¤–ã•ã‚Œã‚‹å ´åˆãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚\n"
+"ã“ã®ã‚ˆã†ãªå ´åˆã€ 端末指定㫠ansi (ãªã„ã— auto) を用ã„ã‚‹ã‹ã€ ``less -r``\n"
+"(色指定以外ã®å…¨ã¦ã®ç«¯æœ«åˆ¶å¾¡ãŒã€ é€éŽçš„ã«ä¼æ’­ã•ã‚Œã¾ã™) を使用ã™ã‚‹ã“ã¨ã§ã€\n"
+"状æ³ãŒæ”¹å–„ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+"terminfo 使用ã®å ´åˆã€ 基本色定義ãŒ8色ã®ã¿ãªã®ã§ã€ 本エクステンションã§ã¯ã€\n"
+"利用端末種別ã«å¿œã˜ã¦åˆ©ç”¨å¯èƒ½ã«ãªã‚‹ (ã§ã‚ã‚ã†) 色スロットã«å¯¾ã—ã¦ã€\n"
+"色å称を定義ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚例ãˆã°::"
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+"上記設定ã«ã‚ˆã‚Šã€ 'brightblue' ã¨ã„ã†åå‰ãŒã€ 色スロット 12\n"
+"(16色端末ã§åˆ©ç”¨å¯èƒ½ã€‚ 16色端末ã§ã¯ã€ 明度ã®é«˜ã„色ãŒã€ 後åŠ8色ã§å®šç¾©)\n"
+"ã¨ã—ã¦ã€ ã¾ãŸ 'pink' ãŠã‚ˆã³ 'orange' ã¨ã„ã†åå‰ãŒã€ 256色 xterm ã®ã€\n"
+"色立体中ã«å®šç¾©ã•ã‚Œã¾ã™ã€‚ 色åã« '_background' を付加ã™ã‚‹ã“ã¨ã§ã€\n"
+"背景色を指定å¯èƒ½ãªç‚¹ã‚‚ãµãã‚ã¦ã€ æ–°è¦å®šç¾©ã•ã‚ŒãŸè‰²å称ã¯ã€\n"
+"事å‰å®šç¾©ã•ã‚ŒãŸ8色ã¨åŒæ§˜ã«ä½¿ãˆã¾ã™ã€‚"
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+"本エクステンションã¯ã€ 端末検出時ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆç«¯æœ«è¨­å®šã¨ã—㦠ANSI\n"
+"(Windows 環境ã®å ´åˆã¯ win32) を使用ã—ã¾ã™ã€‚ ã“ã®è‡ªå‹•åˆ¤å®šæ©Ÿèƒ½ã¯ã€\n"
+"以下ã®ã‚ˆã†ãªè¨˜è¿° (ã“ã®ä¾‹ã§ã¯ã€ terminfo 使用ã®å¼·åˆ¶) ã§ä¸Šæ›¸ãã§ãã¾ã™::"
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+"'ansi' 'win32' 'terminfo' ãªã„ã— 'auto' 以外ã®å€¤ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+"色付ã‘ã¯ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr ""
+"terminfo ã® setab/setaf エントリãŒã‚ã‚Šã¾ã›ã‚“: ECMA-48 color を使用ã—ã¾ã™\n"
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr "警告: カラーモード %s ã®è¨­å®šã«å¤±æ•—\n"
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "未知ã®è‰²/効果指定 %r を無視(color.%s ã§è¨­å®šè¨˜è¿°)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+"カラー表示種別。 true/always(常時), auto(自動) ãªã„ã— false/never(ç¦æ­¢)"
+
+msgid "TYPE"
+msgstr "種別"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr "ä»–ã®æ§‹æˆç®¡ç†ãƒ„ールã‹ã‚‰ Mercurial ã¸ã®å±¥æ­´å–ã‚Šè¾¼ã¿"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr "別 SCM ã®ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰ Mercurial リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›"
+
+msgid " Accepted source formats [identifiers]:"
+msgstr " 変æ›å…ƒã¨ã—ã¦ä½¿ç”¨å¯èƒ½ãªå½¢å¼ã¯ä»¥ä¸‹ã®é€šã‚Š [括弧内ã¯è­˜åˆ¥å]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr " 変æ›å…ˆã¨ã—ã¦ä½¿ç”¨å¯èƒ½ãªå½¢å¼ã¯ä»¥ä¸‹ã®é€šã‚Š [括弧内ã¯è­˜åˆ¥å]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (ブランãƒä¸Šã®å±¥æ­´ã¯ç¶­æŒã•ã‚Œã¾ã›ã‚“)"
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+" リビジョン指定ãŒç„¡ã„å ´åˆã€ å…¨ã¦ã®å±¥æ­´ãŒå¤‰æ›ã•ã‚Œã¾ã™ã€‚\n"
+" リビジョンãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 当該リビジョンã¾ã§ãŒå¤‰æ›å¯¾è±¡ã§ã™ã€‚\n"
+" (変æ›å…ƒå½¢å¼ã«ã¨ã£ã¦ã€ å—ç†å¯èƒ½ãªå½¢å¼ã§æŒ‡å®šã—ã¦ãã ã•ã„)"
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" 変æ›å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæŒ‡å®šãŒç„¡ã„å ´åˆã€ 変æ›å…ƒãƒ‘スåã®æœ«å°¾è¦ç´ ã« ``-hg``\n"
+" を追加ã—ãŸã‚‚ã®ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ 変æ›å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå­˜åœ¨ã—ãªã„å ´åˆã€\n"
+" æ–°è¦ä½œæˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ Mercurial 以外ã®å¤‰æ›å…ƒã«å¯¾ã—ã¦ã¯ã€ --branchsort\n"
+" ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ Mercurial å½¢å¼ã«å¯¾ã—ã¦ã¯ã€ --sourcesort é©ç”¨ã«ã‚ˆã‚Šã€\n"
+" 変æ›å…ƒã®ãƒªãƒ“ジョン番å·ãŒç¶­æŒã•ã‚Œã¾ã™ã€‚ å„並ã³æ›¿ãˆæŒ‡å®šã«ã¯ã€\n"
+" 以下ã®ã‚ˆã†ãªåŠ¹æžœãŒã‚ã‚Šã¾ã™:"
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+" --branchsort 親ã‹ã‚‰å­ã¸ã®å¤‰æ›å®Ÿæ–½ã«ã‚ˆã‚Šã€ å„ブランãƒæ¯Žã«ã€\n"
+" 順次変æ›ã•ã‚Œã¾ã™ã€‚ 比較的コンパクトãªå¤‰æ›çµæžœã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+" --datesort 日付順ã§å¤‰æ›ã—ã¾ã™ã€‚ 変æ›çµæžœã®ãƒ­ã‚°ã®ä½“è£ã¯è‰¯ã„ã§ã™ãŒã€\n"
+" --branchsort 指定ã«å¯¾ã—ã¦ã€ 変æ›çµæžœãŒå¤§ãããªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+" --sourcesort 変æ›å…ƒã®ãƒªãƒ“ジョン順åºã‚’維æŒã—ã¾ã™ã€‚ 変æ›å…ƒå½¢å¼ãŒ\n"
+" Mercurial ã§ã®ã¿ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+" ``REVMAP`` ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 既定ã®å ´æ‰€ (``<変æ›å…ˆ>/.hg/shamap``)\n"
+" ã«æ›¸ã出ã•ã‚Œã¾ã™ã€‚ ``REVMAP`` ファイルã®å„è¡Œã¯ã€ 変æ›å…ƒã‚³ãƒŸãƒƒãƒˆæ¯Žã«ã€\n"
+" 変æ›å…ƒã¨å¤‰æ›å…ˆã§ã® ID ã®å¯¾å¿œé–¢ä¿‚ (「キー/値ã€ã®å¯¾ã§è¡¨ç¾) ã‚’ã€\n"
+" 以下ã®å½¢å¼ã§åˆ—挙ã—ãŸã‚‚ã®ã«ãªã‚Šã¾ã™::"
+
+msgid " <source ID> <destination ID>"
+msgstr " <変æ›å…ƒã§ã® ID> <変æ›å…ˆã§ã® ID>"
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+" ファイルãŒå­˜åœ¨ã—ãªã„å ´åˆã€ 自動的ã«ä½œæˆã•ã‚Œã¾ã™ã€‚ ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€\n"
+" 変æ›å…ƒã‚³ãƒŸãƒƒãƒˆãŒå¤‰æ›å…ˆã«æ ¼ç´ã•ã‚Œã‚‹æ¯Žã«ã€ æ›´æ–°ã•ã‚Œã¾ã™ã®ã§ã€\n"
+" :hg:`convert` を中断ã—ãŸå ´åˆã§ã‚‚〠å復的ã«å®Ÿè¡Œã™ã‚‹å ´åˆã§ã‚‚ã€\n"
+" æ–°è¦ã®ã‚³ãƒŸãƒƒãƒˆã®ã¿ãŒå¤‰æ›å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+" authormap ã¯ã€ 変æ›å…ƒã¨å¤‰æ›å…ˆã®é–“ã§ã€ コミットã®ãƒ¦ãƒ¼ã‚¶åを変æ›ã—ã¾ã™ã€‚\n"
+" UNIX çš„ãªãƒ­ã‚°ã‚¤ãƒ³åを〠èªè¨¼ã«ä½¿ç”¨ã—ã¦ã„ã‚‹ SCM ツール (例: CVS)\n"
+" ã‹ã‚‰ã®å¤‰æ›ã«ä¾¿åˆ©ã§ã™ã€‚ authormap ファイルã®å„è¡Œã¯ã€ 以下ã®å½¢å¼ã‚’æŒã¡ã€\n"
+" 1行1ユーザ変æ›ã¨ãªã‚Šã¾ã™::"
+
+msgid " source author = destination author"
+msgstr " 変æ›å…ƒãƒ¦ãƒ¼ã‚¶å = 変æ›å…ˆãƒ¦ãƒ¼ã‚¶å"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr " 空行㨠``#`` ã§å§‹ã¾ã‚‹è¡Œã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+" filemap ファイルã¯ã€ ファイルやディレクトリã®è¦å¦ã‚„変æ›ã‚’指示ã—ã¾ã™ã€‚\n"
+" filemap ファイルã®å„è¡Œã«ã¯ã€ 以下ã®æŒ‡ç¤ºã®ã„ãšã‚Œã‹ã‚’記述ã—ã¾ã™::"
+
+msgid " include path/to/file-or-dir"
+msgstr " include ファイルや/ディレクトリã¸ã®/パス"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " exclude ファイルや/ディレクトリã¸ã®/パス"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rename 変æ›å…ƒ/ã§ã®/パス 変æ›å…ˆ/ã§ã®/パス"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+" コメント行㯠``#`` ã§å§‹ã‚ã¾ã™ã€‚ ファイルã®ç›¸å¯¾ãƒ‘スã¨å®Œå…¨ä¸€è‡´ã™ã‚‹ã‹ã€\n"
+" 親ディレクトリã¨ä¸€è‡´ã—ãŸå ´åˆã«ã€ パスãŒåˆè‡´ã—ãŸã¨åˆ¤å®šã•ã‚Œã¾ã™ã€‚\n"
+" ``include`` ã‚„ ``exclude`` ã¯ã€ 最長åˆè‡´ã—ãŸæŒ‡ç¤ºãŒé¸æŠžã•ã‚Œã¾ã™ã®ã§ã€\n"
+" 記述ã®é †åºã¯æ„味をæŒã¡ã¾ã›ã‚“。"
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+" ファイルやディレクトリ㌠``include`` 指定ã«åˆè‡´ã—ãŸå ´åˆã€\n"
+" 当該ファイルや〠ディレクトリé…下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 変æ›å¯¾è±¡ã«ãªã‚Šã¾ã™ãŒã€\n"
+" ãれ以外ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 明示的㫠``include`` 指定ã«åˆè‡´ã—ãªã„é™ã‚Šã€\n"
+" 変æ›å¯¾è±¡ã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚ ファイルやディレクトリ㌠``exclude``\n"
+" 指定ã«åˆè‡´ã—ãŸå ´åˆã€ ãれらã¯å¤‰æ›å¯¾è±¡ã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚\n"
+" 変æ›å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ãŒ ``rename`` 指定ã«åˆè‡´ã™ã‚‹å ´åˆã€ ファイルåã‚„ã€\n"
+" ディレクトリåãŒæ”¹å (ï¼ ç§»å‹•) ã•ã‚Œã¾ã™ã€‚ サブディレクトリé…下ã‹ã‚‰ã€\n"
+" リãƒã‚¸ãƒˆãƒªãƒ«ãƒ¼ãƒˆç›´ä¸‹ã«æ”¹åã™ã‚‹å ´åˆã€ 改å先㫠``.`` を使ã„ã¾ã™ã€‚"
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+" splicemap ファイルã¯ã€ 親リビジョン指定ã«ã‚ˆã‚‹å±¥æ­´ã®åˆæˆ (synthesize)\n"
+" を指示ã—ã¾ã™ã€‚ 例ãˆã°ã€ Subversion ã«ãŠã‘るマージ実施リビジョンã«ã€\n"
+" 2ã¤ã®è¦ªã‚’æŒãŸã›ã‚‹ã¨ã‹ã€ 個別ã®ãƒªãƒ“ジョン群を〠ã²ã¨ã¾ã¨ã¾ã‚Šã«ã™ã‚‹ã€\n"
+" ã¨ã„ã£ãŸå ´åˆã«æœ‰ç”¨ã§ã™ã€‚ splicemap ファイルã®å„è¡Œã¯ã€ キーã€\n"
+" 空白文字〠1ã¤ãªã„ã—ï¼’ã¤ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã®å€¤ã§æ§‹æˆã•ã‚Œã¾ã™::"
+
+msgid " key parent1, parent2"
+msgstr " キー 親1, 親2"
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+" キーã«ã¯ã€ 改変対象 (親リビジョンãŒæ”¹å¤‰ã•ã‚Œã¾ã™) リビジョンã®ã€\n"
+" 変æ›å…ƒã«ãŠã‘ã‚‹ ID を指定ã—ã¾ã™ (.hg/shamap ã«ãŠã‘るキーã¨åŒä¸€å½¢å¼)。\n"
+" 値指定ã«ã¯ã€ 変æ›å¾Œã®å½“該リビジョンã®ã€ 親ã¨ãªã‚‹ãƒªãƒ“ジョン㮠ID\n"
+" (変æ›å…ƒï¼å¤‰æ›å…ˆã®ã€ ã„ãšã‚Œã‹ã«ãŠã‘ã‚‹å½¢å¼) を指定ã—ã¾ã™ã€‚ 例ãˆã°ã€\n"
+" \"release-1.0\" ブランãƒã‹ã‚‰ \"trunk\" ã¸ã®ãƒžãƒ¼ã‚¸å®Ÿæ–½ãƒªãƒ“ジョンãŒã€\n"
+" åˆæˆå¯¾è±¡ã¨ãªã‚‹å ´åˆã¯ã€ 第1親ã«ã¯ \"trunk\" 上ã®ã€ 第2親ã«ã¯\n"
+" \"release-1.0\" 上ã®ãƒªãƒ“ジョンを指定ã—ã¾ã™ã€‚"
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+" branchmap ファイルã¯ã€ 変æ›å…ƒã‹ã‚‰ (åå‰ä»˜ã) ブランãƒã‚’å–り込む際ã«ã€\n"
+" ブランãƒã®æ”¹åを指示ã—ã¾ã™ã€‚ splicemap ファイルã¨ä½µç”¨ã—ãŸå ´åˆã€\n"
+" 最悪ã®ç®¡ç†çŠ¶æ³ã«ã‚るリãƒã‚¸ãƒˆãƒªã‹ã‚‰ã€ é©åˆ‡ãªæ§‹æˆã® Mercurial\n"
+" リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›ã‚‚å¯èƒ½ã¨ã™ã‚‹ã€ 強力ãªæ©Ÿèƒ½ãŒç™ºæ®ã•ã‚Œã¾ã™ã€‚ branchmap\n"
+" ファイルã®å„è¡Œã¯ã€ 以下ã®å½¢å¼ã§è¨˜è¿°ã•ã‚Œã¾ã™::"
+
+msgid " original_branch_name new_branch_name"
+msgstr " 変æ›å…ƒãƒ–ランãƒå 変æ›å…ˆãƒ–ランãƒå"
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+" \"変æ›å…ƒãƒ–ランãƒå\" ãŒå¤‰æ›å…ƒãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘るブランãƒåã§ã€\n"
+" \"変æ›å…ˆãƒ–ランãƒå\" ãŒå¤‰æ›å…ˆãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘るブランãƒåã§ã™ã€‚\n"
+" ブランãƒåã«ã¯ã€ 空白文字を使用ã§ãã¾ã›ã‚“。 変æ›ã®ä½¿ç”¨ä¾‹ã¨ã—ã¦ã¯ã€\n"
+" 変æ›å…ƒã® \"default\" ブランãƒã‹ã‚‰ã€ 特定ã®ãƒªãƒ“ジョンをã€\n"
+" åå‰ä»˜ãブランãƒã«ç§»å‹•ã™ã‚‹ã‚ˆã†ãªã‚±ãƒ¼ã‚¹ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Mercurial Source\n"
+" ################"
+msgstr ""
+" Mercurial å½¢å¼ã‹ã‚‰ã®å¤‰æ›\n"
+" ########################"
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+" Mercurial å½¢å¼ã‹ã‚‰ã®å¤‰æ›ã®å ´åˆã€ コマンド行ã§ã® ``--config``\n"
+" 使用ã«ã‚ˆã‚Šã€ 以下ã®ã‚ªãƒ—ションを指定ã§ãã¾ã™:"
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+" :convert.hg.ignoreerrors: 読ã¿è¾¼ã¿ã«ãŠã‘ã‚‹æ•´åˆæ€§ã‚¨ãƒ©ãƒ¼ã‚’無視ã—ã¾ã™ã€‚\n"
+" Mercurial å½¢å¼ã‹ã‚‰ Mercurial å½¢å¼ã¸ã®å¤‰æ›ã®éš›ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã§ã€\n"
+" revlog ã«å•é¡Œã®ã‚るリãƒã‚¸ãƒˆãƒªã‚’復旧å¯èƒ½ã§ã™ã€‚ デフォルト値㯠False"
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+" :convert.hg.saverev: 変æ›å…ƒã«ãŠã‘るリビジョン ID ã®ã€ \n"
+" 埋ã‚è¾¼ã¿è¦å¦ã‚’示ã™çœŸå½å€¤ (変æ›å…ˆã§ã®ãƒªãƒ“ジョン ID ã¯ã€\n"
+" 確実ã«å¤‰æ›´ã•ã‚Œã¾ã™) (※ 訳注: ãƒãƒƒã‚·ãƒ¥å€¤è¨ˆç®—å…ƒã¨ãªã‚‹ãƒ‡ãƒ¼ã‚¿ãŒã€\n"
+" ID 埋ã‚è¾¼ã¿ã§å¤‰åŒ–ã™ã‚‹ãŸã‚)。 デフォルト値㯠False。"
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+" :convert.hg.startrev: 指定リビジョンã¨ãã®å­å­«ã‚’変æ›ã—ã¾ã™ã€‚\n"
+" Mercurial ã®ãƒªãƒ“ジョン ID ãŒæŒ‡å®šå¯èƒ½ã§ã™ã€‚ デフォルト値㯠0"
+
+msgid ""
+" CVS Source\n"
+" ##########"
+msgstr ""
+" CVS å½¢å¼ã‹ã‚‰ã®å¤‰æ›\n"
+" ##################"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+" CVS å½¢å¼ã‹ã‚‰ã®å¤‰æ›ã§ã®ã€ 変æ›å¯¾è±¡ã®èµ·ç‚¹ã¨ãªã‚‹ãƒªãƒ“ジョンã®æŒ‡å®šã§ã¯ã€\n"
+" CVS リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã®ã‚ˆã†ãªã€ 「サンドボックスã€\n"
+" (sandbox) ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ リãƒã‚¸ãƒˆãƒªé ˜åŸŸã¸ã®ç›´æŽ¥ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€\n"
+" ``:local:`` ãªãƒªãƒã‚¸ãƒˆãƒªä»¥å¤–ã§ã¯ã€ å¿…è¦ã‚ã‚Šã¾ã›ã‚“。 変æ›ã®éš›ã«ã¯ã€\n"
+" サンドボックスã®æœ€ä¸Šä½ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã€ CVS リãƒã‚¸ãƒˆãƒªãŒæ¤œå‡ºã•ã‚Œã€\n"
+" CVS rlog コマンドã«ã‚ˆã£ã¦ã€ 変æ›å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¤œå‡ºã•ã‚Œã¾ã™ã€‚\n"
+" ãã®ãŸã‚〠filemap ファイルã®æŒ‡å®šãŒç„¡ã„é™ã‚Šã€ 起点ディレクトリé…下ã®ã€\n"
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒå¤‰æ›å¯¾è±¡ã¨ãªã‚Šã¾ã™ã—〠サンドボックスé…下ã«ãŠã‘ã‚‹ã€\n"
+" ディレクトリã®å†ç·¨æˆã¯ã€ å…¨ã¦ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid " The following options can be used with ``--config``:"
+msgstr " ``--config`` 使用ã«ã‚ˆã‚Šã€ 以下ã®ã‚ªãƒ—ションを指定ã§ãã¾ã™:"
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+" :convert.cvsps.cache: リモートログã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’抑止ã—ã¾ã™\n"
+" (試験ãŠã‚ˆã³ãƒ‡ãƒãƒƒã‚°ç”¨)。 デフォルト値㯠True。"
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+" :convert.cvsps.fuzz: åŒä¸€ãƒ¦ãƒ¼ã‚¶ï¼ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã®ãƒªãƒ“ジョン検出ã®ã€\n"
+" 最大所è¦æ™‚é–“ (å˜ä½:秒)。 変æ›å…ƒã«ãŠã„ã¦ã€éžå¸¸ã«å¤§é‡ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€\n"
+" åŒæ™‚ã«ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¦ã„ã‚‹å ´åˆã€ デフォルト値 (60秒) ã§ã¯ã€\n"
+" ä¸å分ãªæã‚ŒãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergeto: コミットログã«å¯¾ã™ã‚‹æ­£è¦è¡¨ç¾ã€‚\n"
+" æ­£è¦è¡¨ç¾ã®åˆè‡´ãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã€ ダミーã®ãƒªãƒ“ジョンを追加ã—ã¦ã€\n"
+" åˆè‡´ãƒªãƒ“ジョンã®ãƒ–ランãƒã‹ã‚‰ã€ æ­£è¦è¡¨ç¾ãŒç¤ºã™ãƒ–ランãƒã¸ã¨ã€\n"
+" マージを実施ã—ã¾ã™ã€‚ デフォルト値㯠``{{mergetobranch ([-\\w]+)}}``"
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergefrom: コミットログã«å¯¾ã™ã‚‹æ­£è¦è¡¨ç¾ã€‚\n"
+" æ­£è¦è¡¨ç¾ã®åˆè‡´ãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã€ æ­£è¦è¡¨ç¾ãŒç¤ºã™ãƒ–ランãƒã«ã€\n"
+" æ–°è¦ãƒªãƒ“ジョンを追加ã—ã¦ã€ åˆè‡´ãƒªãƒ“ジョンã®ç¬¬2親ã¨ã—ã¾ã™ã€‚\n"
+" デフォルト値㯠``{{mergefrombranch ([-\\w]+)}}``"
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+" :hook.cvslog: CVS ã®ãƒ­ã‚°åŽé›†å‡¦ç†å¾Œã«å‘¼ã°ã‚Œã‚‹ Python 関数。\n"
+" 関数呼ã³å‡ºã—ã®éš›ã«ã¯ã€ ログエントリã®ä¸€è¦§ãŒæ¸¡ã•ã‚Œã€\n"
+" 一覧è¦ç´ ã®æ”¹å¤‰ã‚„〠追加ï¼å‰Šé™¤ã‚’〠直接実施ã§ãã¾ã™ã€‚"
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+" :hook.cvschangesets: CVS ログã‹ã‚‰ã®ãƒªãƒ“ジョン算出完了後ã«å‘¼ã°ã‚Œã‚‹\n"
+" Python 関数。 関数呼ã³å‡ºã—ã®éš›ã«ã¯ã€ リビジョン一覧ãŒæ¸¡ã•ã‚Œã€\n"
+" リビジョンã®æ”¹å¤‰ã‚„〠追加ï¼å‰Šé™¤ã‚’〠直接実施ã§ãã¾ã™ã€‚"
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+" 付加的㪠\"debugcvsps\" Mercurial コマンドを使ã†ã“ã¨ã§ã€\n"
+" 変æ›å‡¦ç†æŠœãã«ã€ 内部ã®ãƒªãƒ“ジョンマージ機能を実行ã§ãã¾ã™ã€‚\n"
+" 引数や出力ã¯ã€ cvsps 2.1 ã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" 詳細ã¯ã‚³ãƒžãƒ³ãƒ‰ã®ãƒ˜ãƒ«ãƒ—出力をå‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Subversion Source\n"
+" #################"
+msgstr ""
+" Subversion å½¢å¼ã‹ã‚‰ã®å¤‰æ›\n"
+" #########################"
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+" Subversion å½¢å¼ã‹ã‚‰ã®å¤‰æ›ã§ã¯ã€ ä¼çµ±çš„㪠trunk/branches/tags\n"
+" 構造ãŒæ¤œå‡ºã•ã‚Œã¾ã™ã€‚ 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 変æ›å…ƒ URL 指定ã®\n"
+" ``svn://repo/path/`` ã¯å˜ä¸€ãƒ–ランãƒã«å¤‰æ›ã•ã‚Œã¾ã™ã€‚\n"
+" ``svn://repo/path/trunk`` ãŒå­˜åœ¨ã™ã‚‹å ´åˆã€ default ブランãƒã«ã¯ã€\n"
+" ãã¡ã‚‰ã®å†…容ãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚ ``svn://repo/path/branches``\n"
+" ãŒå­˜åœ¨ã™ã‚‹å ´åˆã€ サブディレクトリ群を〠ブランãƒä¸€è¦§å€™è£œã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" ``svn://repo/path/tags`` ãŒå­˜åœ¨ã™ã‚‹å ´åˆã€ 変æ›å¾Œãƒªãƒ“ジョンを指ã™ã€\n"
+" ã‚¿ã‚°ã®ç‰¹å®šã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ``trunk``〠``branches`` ãŠã‚ˆã³ ``tags``\n"
+" ã®å‚照先ã¯ã€ 以下ã®ã‚ªãƒ—ションã§ä¸Šæ›¸ãå¯èƒ½ã§ã™ã€‚ ã“れらã®æŒ‡å®šã®éš›ã«ã¯ã€\n"
+" 変æ›å…ƒ URL ã«å¯¾ã™ã‚‹ç›¸å¯¾ãƒ‘スã‹ã€ 空白 (ï¼ è‡ªå‹•æ¤œå‡ºæŠ‘æ­¢) を指定ã—ã¾ã™ã€‚"
+
+msgid " The following options can be set with ``--config``:"
+msgstr " ``--config`` 使用ã«ã‚ˆã‚Šã€ 以下ã®ã‚ªãƒ—ションを指定ã§ãã¾ã™:"
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+" :convert.svn.branches: ブランãƒã‚’æ ¼ç´ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚\n"
+" デフォルト値㯠``branches`` 。"
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+" :convert.svn.tags: ã‚¿ã‚°ã‚’æ ¼ç´ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚\n"
+" デフォルト値㯠``tags`` 。"
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+" :convert.svn.trunk: trunk ブランãƒã®ãƒ–ランãƒå。\n"
+" デフォルト値㯠``trunk`` 。"
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+" 全履歴変æ›ã®ä»£ã‚ã‚Šã«ã€ 履歴変æ›ã®èµ·ç‚¹ãƒªãƒ“ジョンを指定å¯èƒ½ã§ã™ã€‚\n"
+" å˜ä¸€ãƒ–ランãƒå¤‰æ›ã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+" :convert.svn.startrev: 変æ›é–‹å§‹ Subversion リビジョン番å·ã€‚\n"
+" デフォルト値㯠0。"
+
+msgid ""
+" Perforce Source\n"
+" ###############"
+msgstr ""
+" Perforce å½¢å¼ã‹ã‚‰ã®å¤‰æ›\n"
+" #######################"
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+" Perforce (P4) å½¢å¼ã§ã®å–ã‚Šè¾¼ã¿å…ƒæŒ‡å®šã«ã¯ã€ p4 depot ã¸ã®ãƒ‘スã‹ã€\n"
+" クライアント仕様を指定ã—ã¾ã™ã€‚ 変æ›å…ƒã®å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€\n"
+" å¹³å¦ãª Mercurial リãƒã‚¸ãƒˆãƒªã«å¤‰æ›ã•ã‚Œã¾ã™: ラベルやブランãƒã€\n"
+" çµ±åˆ (※ 訳注: \"integration\" 㯠Mercurial ã§è¨€ã†ãƒžãƒ¼ã‚¸ã®ã“ã¨ï¼Ÿ)\n"
+" ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ depot ã¸ã®ãƒ‘ス指定ã®å ´åˆã€ 変æ›å…ˆæŒ‡å®šãŒç„¡ã„å ´åˆã€\n"
+" 変æ›å…ˆã®åå‰ãŒ ``...-hg`` ã«ãªã‚‹ç‚¹ã«æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+" åˆæœŸ Perforce リビジョン指定ã«ã‚ˆã‚Šã€ 変æ›å¯¾è±¡ã¨ãªã‚‹ãƒªãƒ“ジョンç·é‡ã‚’ã€\n"
+" 制é™ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™:"
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+" :convert.p4.startrev: åˆæœŸ Perforce リビジョン\n"
+" (Perforce ãƒã‚§ãƒ³ã‚¸ãƒªã‚¹ãƒˆç•ªå·)。."
+
+msgid ""
+" Mercurial Destination\n"
+" #####################"
+msgstr ""
+" Mercurial å½¢å¼ã¸ã®å¤‰æ›\n"
+" ######################"
+
+msgid " The following options are supported:"
+msgstr " 以下ã®ã‚ªãƒ—ションを指定ã§ãã¾ã™:"
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+" :convert.hg.clonebranches: 変æ›å…ƒãƒ–ランãƒã®åˆ¥è¤‡è£½ã¸ã®æŒ¯ã‚Šåˆ†ã‘ã®è¦å¦ã€‚\n"
+" デフォルト値㯠False。"
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+" :convert.hg.tagsbranch: タグ付ã‘を実施ã™ã‚‹ãƒªãƒ“ジョンã®ãƒ–ランãƒå。\n"
+" デフォルト値㯠``default`` 。"
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+" :convert.hg.usebranchnames: ブランãƒå維æŒã®è¦å¦ã€‚\n"
+" デフォルト値㯠True。\n"
+" "
+
+msgid "create changeset information from CVS"
+msgstr "CVS ã‹ã‚‰ã®ãƒªãƒ“ジョン情報ã®ä½œæˆ"
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+" 本コマンドã®ä½ç½®ä»˜ã‘ã¯ã€ CVS ã‹ã‚‰ Mercurial ã¸ã®å¤‰æ›ã«ãŠã‘るデãƒãƒƒã‚°\n"
+" ツールã§ã‚り〠cvsps ã®ä»£æ›¿ãƒ„ールã¨ã—ã¦ä½¿ç”¨å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+" 本コマンドã¯ã€ ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª (ãªã„ã—指定ディレクトリ) 中㮠CVS rlog\n"
+" を読ã¿è¾¼ã¿ã€ コミットログã®å†…容ã¨æ—¥ä»˜ã‚’å…ƒã«ãƒªãƒ“ジョンを推測ã—ã¾ã™ã€‚"
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr "ユーザå変æ›ãƒ•ã‚¡ã‚¤ãƒ«ã®æŒ‡å®š (éžæŽ¨å¥¨: --authormap を使用ã—ã¦ãã ã•ã„)"
+
+msgid "source repository type"
+msgstr "変æ›å…ƒãƒªãƒã‚¸ãƒˆãƒªç¨®åˆ¥"
+
+msgid "destination repository type"
+msgstr "変æ›å…ˆã®ãƒªãƒã‚¸ãƒˆãƒªç¨®åˆ¥"
+
+msgid "import up to target revision REV"
+msgstr "指定リビジョンã¾ã§ã®å–ã‚Šè¾¼ã¿"
+
+msgid "remap usernames using this file"
+msgstr "変æ›æ™‚ã®ãƒ¦ãƒ¼ã‚¶å変æ›ç”¨ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "remap file names using contents of file"
+msgstr "変æ›æ™‚ã®ãƒ•ã‚¡ã‚¤ãƒ«å変æ›ç”¨ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "splice synthesized history into place"
+msgstr "継ãŽåˆã‚ã›ã«ã‚ˆã‚‹å±¥æ­´ã®åˆæˆ"
+
+msgid "change branch names while converting"
+msgstr "変æ›æ™‚ã®ãƒ–ランãƒå変æ›ç”¨ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "try to sort changesets by branches"
+msgstr "ブランãƒã«ã‚ˆã‚‹ãƒªãƒ“ジョンã®ä¸¦ã³æ›¿ãˆã‚’試ã™"
+
+msgid "try to sort changesets by date"
+msgstr "日付ã«ã‚ˆã‚‹ãƒªãƒ“ジョンã®ä¸¦ã³æ›¿ãˆã‚’試ã™"
+
+msgid "preserve source changesets order"
+msgstr "元リãƒã‚¸ãƒˆãƒªã§ã®ãƒªãƒ“ジョンã®ä¸¦ã³é †ã‚’å°Šé‡"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+
+msgid "only return changes on specified branches"
+msgstr "指定ブランãƒã®ã¿ã®å¤‰æ›"
+
+msgid "prefix to remove from file names"
+msgstr "ファイルåã‹ã‚‰é™¤å¤–ã™ã‚‹æŽ¥é ­è¾ž"
+
+msgid "only return changes after or between specified tags"
+msgstr "指定リビジョンã®ã¿ã®å¤‰æ›"
+
+msgid "update cvs log cache"
+msgstr "cvs ログキャッシュã®æ›´æ–°"
+
+msgid "create new cvs log cache"
+msgstr "cvs ログキャッシュã®æ–°è¦ä½œæˆ"
+
+msgid "set commit time fuzz in seconds"
+msgstr "秒ã®ä½ãŒä¸æ˜Žãªæ—¥æ™‚ã«è¨­å®šã™ã‚‹ç§’値"
+
+msgid "specify cvsroot"
+msgstr "cvsroot ã®æŒ‡å®š"
+
+msgid "show parent changesets"
+msgstr "親リビジョンã®è¡¨ç¤º"
+
+msgid "show current changeset in ancestor branches"
+msgstr "祖先ã®ãƒ–ランãƒã«ãŠã‘ã‚‹ç¾è¡Œãƒªãƒ“ジョンã®è¡¨ç¤º"
+
+msgid "ignored for compatibility"
+msgstr "※ 後方互æ›æ€§ã®ãŸã‚ã®ã‚ªãƒ—ション"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [OPTION]... [PATH]..."
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ":svnrev: 文字列。 変æ›å…ƒã® subversion リビジョン番å·ã€‚"
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ":svnpath: 文字列。 変æ›å…ƒ subversion リビジョンã«ãŠã‘るパス。"
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ":svnuuid: 文字列。 変æ›å…ƒ subversion リビジョンã®ãƒªãƒã‚¸ãƒˆãƒª ID。"
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s 㯠Bazaar å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Bazaar モジュールãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr "警告: 簡易ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã¯å¤±æ•—è¦å› ã¨ãªã‚‹ãŸã‚通常ブランãƒã‚’使ã„ã¾ã™\n"
+
+msgid "bzr source type could not be determined\n"
+msgstr "変æ›å…ƒã®ç¨®åˆ¥ãŒ bzr ã§ã‚ã‚‹ã¨ç‰¹å®šã§ãã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s is not a valid revision"
+msgstr "%s ã¯æœ‰åŠ¹ãªãƒªãƒ“ジョンã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s 㯠%s ã«ãŠã„ã¦å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "%s.%s ã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯å…ˆãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "è¦æ±‚ã•ã‚ŒãŸãƒ„ール '%s' を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "%s error:\n"
+msgstr "%s エラー:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr "%s(%d) ã§ã®æ–‡æ³•ã‚¨ãƒ©ãƒ¼: key/value ã®çµ„ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "変æ›ãƒ•ã‚¡ã‚¤ãƒ« %r ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "syntax error in %s(%d): child parent1[,parent2] expected"
+msgstr "%s(%d) ã§ã®æ–‡æ³•ã‚¨ãƒ©ãƒ¼: æ­£ã—ã„å½¢å¼ã¯ å­ è¦ª1[,親2]"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: 変æ›å…ƒãƒªãƒã‚¸ãƒˆãƒªç¨®åˆ¥ãŒä¸æ­£ã§ã™"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: リãƒã‚¸ãƒˆãƒªãŒè¦‹ã¤ã‹ã‚‰ãªã„ã‹ã€ 未サãƒãƒ¼ãƒˆãªå½¢å¼ã§ã™"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: 変æ›å…ˆãƒªãƒã‚¸ãƒˆãƒªç¨®åˆ¥ãŒä¸æ­£ã§ã™"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "変æ›: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: 未知ã®ãƒªãƒã‚¸ãƒˆãƒªå½¢å¼"
+
+msgid "getting files"
+msgstr "ファイルã®å–得中"
+
+msgid "revisions"
+msgstr "リビジョン"
+
+msgid "scanning"
+msgstr "走査中"
+
+#, python-format
+msgid "splice map revision %s is not being converted, ignoring\n"
+msgstr "継ãŽåˆã‚ã›æŒ‡å®šä¸­ã® %s ãŒå¤‰æ›å¯¾è±¡ã§ã¯ãªã„ãŸã‚無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "unknown splice map parent: %s"
+msgstr "継ãŽåˆã‚ã›æŒ‡å®šã«æœªçŸ¥ã®è¦ªãƒªãƒ“ジョンãŒã‚ã‚Šã¾ã™: %s"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "未知ã®æ•´åˆ—æ–¹å¼: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "%s 㨠%s ã®é–“ã§å·¡å›žã‚’検出ã—ã¾ã—ãŸ"
+
+msgid "not all revisions were sorted"
+msgstr "æ ¼ç´ã•ã‚Œã¦ã„ãªã„リビジョンãŒã‚ã‚Šã¾ã™"
+
+#, python-format
+msgid "writing author map file %s\n"
+msgstr "作æˆè€…å変æ›ãƒ•ã‚¡ã‚¤ãƒ« %s ã¸ã®æ›¸ãè¾¼ã¿ä¸­\n"
+
+#, python-format
+msgid "ignoring bad line in author map file %s: %s\n"
+msgstr "作æˆè€…å変æ›ãƒ•ã‚¡ã‚¤ãƒ« %s ã®ä¸æ­£ãªè¡Œã‚’無視: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "作æˆè€… %s ã‚’ %s ã«å¤‰æ›\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "作æˆè€… %s ã® %s ã¸ã®å¤‰æ›ã‚’〠%s ã¸ã®å¤‰æ›ã§ä¸Šæ›¸ãã—ã¾ã™\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "%s ã‚’ %s ã®è¦ªã¨ã—ã¦ç¶™ãŽåˆã‚ã›\n"
+
+msgid "scanning source...\n"
+msgstr "変æ›å…ƒãƒªãƒã‚¸ãƒˆãƒªã®èµ°æŸ»ä¸­...\n"
+
+msgid "sorting...\n"
+msgstr "並ã¹æ›¿ãˆä¸­...\n"
+
+msgid "converting...\n"
+msgstr "変æ›ä¸­...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "変æ›å…ƒ: %s\n"
+
+msgid "converting"
+msgstr "変æ›ä¸­"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "変æ›å…ˆã¨ã—㦠%s を想定\n"
+
+msgid "more than one sort mode specified"
+msgstr "整列オプションã®æŒ‡å®šãŒéŽå‰°ã§ã™"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "指定ã®å¤‰æ›å…ƒã¯ --sourcesort ãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s 㯠CVS 作業領域ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr "リビジョン %s ã¯ãƒ‘ッãƒã‚»ãƒƒãƒˆç•ªå·ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "%s ã¸æŽ¥ç¶šä¸­\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "CVS pserver ã®èªè¨¼ã«å¤±æ•—"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr "CVS サーãƒã®äºˆæœŸã›ã¬å¿œç­”(期待値 \"Valid-requests\" ã«å¯¾ã—㦠%r)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "リモートファイル㨠%d ãƒã‚¤ãƒˆé•ã„ã¾ã™"
+
+msgid "malformed response from CVS"
+msgstr "CVS ã‹ã‚‰ã®æƒ³å®šå¤–ã®å¿œç­”"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "cvs サーãƒ: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "未知㮠CVS レスãƒãƒ³ã‚¹: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "CVS rlog åŽé›†ä¸­\n"
+
+msgid "not a CVS sandbox"
+msgstr "CVS サンドボックスã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "CVS ログキャッシュ %s 読ã¿è¾¼ã¿ä¸­\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "キャッシュã«ã¯ %d 件ã®ãƒ­ã‚°ã‚¨ãƒ³ãƒˆãƒªãŒã‚ã‚Šã¾ã™\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "キャッシュ読ã¿è¾¼ã¿ã®å¤±æ•—: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "%s ã®å®Ÿè¡Œä¸­\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "RCS ファイルã¯ãƒ¯ãƒ¼ã‚­ãƒ³ã‚°ãƒ•ã‚¡ã‚¤ãƒ«æƒ…報を伴ã†ç­ˆã§ã™"
+
+msgid "must have at least some revisions"
+msgstr "リビジョン指定ãŒè¶³ã‚Šã¾ã›ã‚“"
+
+msgid "expected revision number"
+msgstr "リビジョン番å·ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "revision must be followed by date line"
+msgstr "リビジョン情報ã¯æ—¥ä»˜æƒ…報を伴ã†ç­ˆã§ã™"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+"ログキャッシュãŒæ–°è¦ã‚¨ãƒ³ãƒˆãƒªã¨é‡è¤‡ã™ã‚‹ãŸã‚ã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ç„¡ã—ã§å†å®Ÿè¡Œã—ã¦ãã ã•"
+"ã„"
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "cvs ログキャッシュ %s ã®æ›¸ãè¾¼ã¿ä¸­\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d 件ã®ãƒ­ã‚°ã‚¨ãƒ³ãƒˆãƒª\n"
+
+msgid "creating changesets\n"
+msgstr "リビジョン作æˆä¸­\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "åˆæˆãƒªãƒ“ジョンã¯è¤‡æ•°ã®è¦ªã‚’æŒã¦ã¾ã›ã‚“"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"警告: CVS コミットログãŒæœªçŸ¥ã®ãƒ–ランム%r ã‚’å‚ç…§ã—ã¦ã„ã¾ã™:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d 件ã®ãƒªãƒ“ジョンè¦ç´ \n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s 㯠darcs å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 2.1 以é™ã® darcs ãŒå¿…è¦ã§ã™(検出ã•ã‚ŒãŸã®ã¯ %r)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Python ã® ElementTree モジュールãŒåˆ©ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "%s å½¢å¼ãƒªãƒã‚¸ãƒˆãƒªã¯éžå¯¾å¿œã§ã™ã®ã§ã€ã‚¢ãƒƒãƒ—グレードã—ã¦ãã ã•ã„"
+
+msgid "failed to detect repository format!"
+msgstr "リãƒã‚¸ãƒˆãƒªå½¢å¼ã®åˆ¤å®šã«å¤±æ•—!"
+
+msgid "internal calling inconsistency"
+msgstr "内部ä¸æ•´åˆ"
+
+msgid "errors in filemap"
+msgstr "ファイルマップã§ã®è§£æžã‚¨ãƒ©ãƒ¼"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr "%s:%d: %s 指定ã®ãƒ‘スãŒä¸åœ¨ã§ã™\n"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r ã¯æ—¢ã« %s 中ã«ã‚ã‚Šã¾ã™\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr "%s:%d: %s 指定 %r ã«ä½™è¨ˆãª / ãŒã‚ã‚Šã¾ã™\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: %r ã¯æœªçŸ¥ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒ†ã‚£ãƒ–ã§ã™\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "変æ›å…ƒãƒªãƒã‚¸ãƒˆãƒªã¯ --filemap をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s 㯠Git å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "cannot retrieve git heads"
+msgstr "git ã®ãƒ˜ãƒƒãƒ‰ãŒå–å¾—ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "%r オブジェクト㌠%s ã‹ã‚‰èª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "%s ã®å¤‰æ›´ã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "%s ã‹ã‚‰ã‚¿ã‚°ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s 㯠GNU Arch å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "GNU Arch ツールを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "ツリーãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s ã®è§£æžä¸­...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr "未登録アーカイブ %s ã®å‚ç…§ã«ã‚ˆã‚Šãƒ„リー解æžã‚’中断...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr "リビジョン %s ã® cat-log ã®è§£æžã«å¤±æ•—"
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã® Mercurial リãƒã‚¸ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "変æ›å…ˆãƒªãƒã‚¸ãƒˆãƒª %s ã®åˆæœŸåŒ–中\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "変æ›å…ˆã® Mercurial リãƒã‚¸ãƒˆãƒª %s ãŒç”Ÿæˆã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«å–ã‚Šè¾¼ã¿ä¸­\n"
+
+msgid "filtering out empty revision\n"
+msgstr "空リビジョンã®é™¤å¤–中\n"
+
+msgid "updating tags\n"
+msgstr "ã‚¿ã‚°ã®æ›´æ–°ä¸­\n"
+
+msgid "updating bookmarks\n"
+msgstr "ブックマークã®æ›´æ–°ä¸­\n"
+
+#, python-format
+msgid ""
+"revision %s not found in destination repository (lookups with "
+"clonebranches=true are not implemented)"
+msgstr ""
+"変æ›å…ˆãƒªãƒã‚¸ãƒˆãƒªã«ãƒªãƒ“ジョン %s ãŒã‚ã‚Šã¾ã›ã‚“(clonebranches=true ã§ã®æ¤œç´¢ã¯æœª"
+"実装ã§ã™)"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s ã¯æ­£ã—ã„開始リビジョンã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "例外を無視ã—ã¾ã™: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s 㯠monotone å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr "ä¸æ­£ãª mtn パケット - no end of commandnbr"
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr "ä¸æ­£ãª mtn パケット - bad stream type %s"
+
+msgid "bad mtn packet - no divider before size"
+msgstr "ä¸æ­£ãª mtn パケット - no divider before size"
+
+msgid "bad mtn packet - no end of packet size"
+msgstr "ä¸æ­£ãª mtn パケット - no end of packet size"
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr "ä¸æ­£ãª mtn パケット - bad packet size %s"
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr "ä¸æ­£ãª mtn パケット - unable to read full packet read %s of %s"
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "mtn コマンド '%s' ã®å®Ÿè¡Œçµæžœ: %s"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "改å先ディレクトリ㮠'%s' ã‹ã‚‰ '%s' ã¸ãƒ•ã‚¡ã‚¤ãƒ«ã‚’複製中"
+
+msgid "unable to determine mtn automate interface version"
+msgstr "mtn automate インターフェイスã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒç‰¹å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr "mtn automate stdio ヘッダãŒæƒ³å®šå¤–ã§ã™: %s"
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr "mtn automate stdio ヘッダを最後ã¾ã§èª­ã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s 㯠P4 å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "reading p4 views\n"
+msgstr "p4 ビューã®èª­ã¿è¾¼ã¿ä¸­\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "p4 ãƒã‚§ãƒ³ã‚¸ãƒªã‚¹ãƒˆã®åŽé›†ä¸­\n"
+
+msgid "debugsvnlog could not load Subversion python bindings"
+msgstr "debugsvnlog ㌠Subversion python ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚’読ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr "Mercurial 自身ã®å®Ÿè¡Œã«å¤±æ•—。 PATH 設定㨠hg コマンドを確èªã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "log stream exception '%s'"
+msgstr "ログ入力ã§ã®ä¾‹å¤–発生 '%s'"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+"svn: subversion ã®é€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸã€‚ --source-type ã®ä½¿ç”¨"
+"を検討ã—ã¦ãã ã•ã„。\n"
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s 㯠Subversion å½¢å¼ã§ã¯ãªã„ã¨æ€ã‚ã‚Œã¾ã™"
+
+msgid "could not load Subversion python bindings"
+msgstr "Subversion python ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr "Subversion python ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ 1.4 以上ãŒå¿…è¦ã§ã™(%d.%d を検出)"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr "Subversion python ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã¯ 1.4 以上ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: リビジョン %s ãŒæ•°å­—ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: 開始リビジョン %s ãŒæ•°å­—ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "モジュール %s ã§ãƒªãƒ“ジョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "%s ㌠%r ã«ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "%s ㌠%r ã«ã‚ã‚Šã¾ã—ãŸ\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "空ブランム%s を無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "ブランム%s ã‚’ %d ã§è¦‹ã¤ã‘ã¾ã—ãŸ\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: 複数ブランãƒã«å¯¾ã™ã‚‹é–‹å§‹ãƒªãƒ“ジョンã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: 開始リビジョン %d 以é™ã«ãƒªãƒ“ジョンã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "svn: revision %s not found"
+msgstr "svn: リビジョン %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "リビジョン %s 㯠%d ã¾ã§ã®ãƒªãƒ“ジョンã«è¦‹å½“ãŸã‚Šã¾ã›ã‚“"
+
+msgid "scanning paths"
+msgstr "パスã®èµ°æŸ»ä¸­"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "ブランム%s ã®è¦ªã‚’ %d:%s ã§æ¤œå‡º\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "\"%s\" ã®å¤‰æ›´å±¥æ­´(%d ã‹ã‚‰ %d)ã®å…ˆèª­ã¿ä¸­\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: ブランãƒã«ã¯ãƒªãƒ“ジョン %s ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "svn リãƒã‚¸ãƒˆãƒª %r ã®åˆæœŸåŒ–中\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "svn ワーキングコピー %r ã®åˆæœŸåŒ–中\n"
+
+msgid "unexpected svn output:\n"
+msgstr "予期ã›ã¬ svn ã®å‡ºåŠ›:\n"
+
+msgid "unable to cope with svn output"
+msgstr "予期ã›ã¬ svn 出力ã®ãŸã‚継続ã§ãã¾ã›ã‚“"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "Subversion ã®ã‚¿ã‚°æ›¸ã出ã—機能ã¯æœªå®Ÿè£…ã§ã™\n"
+
+#, python-format
+msgid ""
+"splice map revision %s not found in subversion child map (revision lookups "
+"are not implemented)"
+msgstr ""
+"subversion ã®å­ãƒªãƒ“ジョン中ã«ã€ç¶™ãŽåˆã‚ã›æŒ‡å®šã® %s ãŒã‚ã‚Šã¾ã›ã‚“(リビジョン検"
+"ç´¢ã¯æœªå®Ÿè£…ã§ã™)"
+
+msgid "automatically manage newlines in repository files"
+msgstr "管ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã‘る改行形å¼ã®è‡ªå‹•ç®¡ç†"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+"本エクステンションã¯ã€ リãƒã‚¸ãƒˆãƒªãŠã‚ˆã³ä½œæ¥­é ˜åŸŸä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã‘ã‚‹ã€\n"
+"æ”¹è¡Œå½¢å¼ (CRLF ãªã„ã— LF) を管ç†ã™ã‚‹ãŸã‚ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã§ã™ã€‚\n"
+"Windows 環境ã§ã¯ CRLF å½¢å¼ã€ Unix/Mac 環境ã§ã¯ LF å½¢å¼ã¨è¨€ã†æ§˜ã«ã€\n"
+"å„ OS 固有ã®æ”¹è¡Œå½¢å¼ã‚’使用ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+"本エクステンションã¯ã€ 作業領域ã®ãƒ«ãƒ¼ãƒˆç›´ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ« ``.hgeol``\n"
+"(構æˆç®¡ç†å¯èƒ½) ã‹ã‚‰è¨­å®šã‚’読ã¿è¾¼ã¿ã¾ã™ã€‚ ``.hgeol`` ファイルã®æ–‡æ³•ã¯ã€\n"
+"ä»–ã® Mercurial 設定ファイルã¨åŒã˜ã§ã™ã€‚ 本設定ファイルã§ã¯ã€\n"
+"``[patterns]`` 㨠``[repository]`` ã®2ã¤ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’記述å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+"``[patterns]`` セクションã¯ã€ 作業領域ã¨ãƒªãƒã‚¸ãƒˆãƒªè¨˜éŒ²ã®é–“ã«ãŠã‘ã‚‹ã€\n"
+"改行変æ›æ–¹æ³•ã«é–¢ã—ã¦è¨˜è¿°ã—ã¾ã™ã€‚ ファイルパターン形å¼ã§è¨˜è¿°ã—ã¾ã™ã€‚\n"
+"å…ˆã«åˆè‡´ã—ãŸãƒ‘ターンãŒæŽ¡ç”¨ã•ã‚Œã¾ã™ã®ã§ã€ より特徴的ãªãƒ‘ターンã»ã©ã€\n"
+"より先頭ã§è¨˜è¿°ã—ã¦ãã ã•ã„。 指定å¯èƒ½ãªæ”¹è¡Œå½¢å¼ã¯ ``LF``ã€\n"
+"``CRLF`` ãŠã‚ˆã³ ``BIN`` ã§ã™ã€‚"
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+"``CRLF`` ãªã„ã— ``LF`` ãŒæŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 作業領域ã¸ã®å–り出ã—ã‚„ã€\n"
+"リãƒã‚¸ãƒˆãƒªã¸ã®æ ¼ç´ã®éš›ã«ã€ 指定ã®æ”¹è¡Œå½¢å¼ã«å¤‰æ›ã•ã‚Œã¾ã™ãŒã€ ãƒã‚¤ãƒŠãƒª\n"
+"(``BIN``) 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 改行変æ›ã•ã‚Œã¾ã›ã‚“。 ã“れらã«åŠ ãˆã¦ã€\n"
+"実行環境固有ã®æ”¹è¡Œå½¢å¼ã®ä½¿ç”¨ã‚’æ„味ã™ã‚‹ ``native`` も使用å¯èƒ½ã§ã™:\n"
+"Unix (Mac OS X å«ã‚€) 環境ã§ã¯ ``LF``〠Windows 環境ã§ã¯ ``CRLF``。\n"
+"``BIN`` (改行変æ›ç„¡ã—) ã¯ã€ Mercurial ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æŒ™å‹•ã§ã™:\n"
+"一般的ãªãƒ‘ターン指定ã«ã€ æ„図ã›ãšåˆè‡´ã—ã¦ã—ã¾ã†ã®ã‚’回é¿ã—ãŸã„å ´åˆã«ã€\n"
+"当該パターンよりも先ã«åˆè‡´ã•ã›ã‚‹å ´åˆã«ã®ã¿æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+"``[repository]`` セクションã¯ä»˜åŠ çš„ãªã‚‚ã®ã§ã€ リãƒã‚¸ãƒˆãƒªæ ¼ç´ã®éš›ã®ã€\n"
+"改行形å¼ã‚’指定ã—ã¾ã™ã€‚ 記述å¯èƒ½ãªè¨­å®šã¯ ``native`` ã®ã¿ã§ã€\n"
+"``[patterns]`` セクションã«ãŠã„㦠``native`` 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€\n"
+"履歴ã«è¨˜éŒ²ã™ã‚‹éš›ã®æ”¹è¡Œå½¢å¼ã‚’指定ã—ã¾ã™ã€‚ 指定å¯èƒ½ãªå€¤ã¯ ``LF`` ãªã„ã—\n"
+"``CRLF`` ã§ã™ã€‚ 無指定時㯠``LF`` ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 例ãˆã° Windows 上ã§\n"
+"``native`` (デフォルト設定㯠``CRLF``) 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€\n"
+"改行形å¼ãŒ ``LF`` ã«å¤‰æ›ã•ã‚ŒãŸä¸Šã§ã€ 履歴ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚\n"
+"``[patterns]`` セクションã«ãŠã„㦠``LF``〠``CRLF`` ãªã„ã— ``BIN``\n"
+"ãŒæŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ ãã®ã¾ã¾ã®æ”¹è¡Œå½¢å¼ã§å±¥æ­´ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚"
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr "``.hgeol`` ファイルã®è¨˜è¿°ä¾‹::"
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+" [repository]\n"
+" native = LF"
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+".. note::\n"
+" 変æ›è¨­å®šã®é©ç”¨å¥‘æ©Ÿã¯ã€ 作業領域中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹æœ€åˆã®æ›´æ–°ã§ã™ã€‚\n"
+" 例ãˆã°ã€ :hg:`update null` 後㮠:hg:`update tip` ã«ã‚ˆã‚Šã€\n"
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ›´æ–°ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"本エクステンションã¯ã€ 通常㮠Mercurial 設定ファイル㨠``.hgeol``\n"
+"ã®ä¸¡æ–¹ã‹ã‚‰ã€ 付加的㪠``[eol]`` セクションを読ã¿è¾¼ã¿ã¾ã™ãŒã€\n"
+"後者ã®è¨­å®šãŒå‰è€…ã«å„ªå…ˆã—ã¾ã™ã€‚ 本セクションã¯å…¨èˆ¬çš„ãªæŒ™å‹•ã‚’制御ã—ã¾ã™ã€‚\n"
+"記述å¯èƒ½ãªè¨­å®šã¯ä»¥ä¸‹ã®3種類ã§ã™:"
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+"- ``eol.native`` (無指定時㯠``os.linesep`` ã¨åŒå€¤) ã«ã¯ã€ ``LF`` ãªã„ã—\n"
+" ``CRLF`` ãŒæŒ‡å®šå¯èƒ½ã§ã€ ``native`` 指定ファイルã®ä½œæ¥­é ˜åŸŸå–り出ã—ã‚’ã€\n"
+" ã©ã®æ”¹è¡Œå½¢å¼ã§å®Ÿæ–½ã™ã‚‹ã‹ã‚’指定ã—ã¾ã™ã€‚ :hg:`archive` 実施ã®éš›ã«ã€\n"
+" ã“ã®è¨­å®šã‚’è¡Œã†ã“ã¨ã§ã€ Unix 上ã§ç”Ÿæˆã—ãŸã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã«ã€ Windows\n"
+" ã®æ”¹è¡Œå½¢å¼ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ ¼ç´ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+"- ``eol.only-consistent`` (無指定時㯠True) ã® False 設定ã«ã‚ˆã‚Šã€\n"
+" 本エクステンションã«ã€ ä¸æ•´åˆãªæ”¹è¡Œå½¢å¼ã‚’許容ã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚\n"
+" 「ä¸æ•´åˆã€ã¨ã¯ã€ ``CRLF`` 㨠``LF`` ã®ä¸¡æ–¹ã®æ”¹è¡Œå½¢å¼ã‚’æŒã¤è¡ŒãŒã€\n"
+" åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã«æ··åœ¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ ã“ã®ã‚ˆã†ãªæ”¹è¡Œå½¢å¼ã¯ã€\n"
+" 特定用途å‘ã‘ã®æ„図的ãªã‚‚ã®ã¨ã„ã†ä»®å®šã®å…ƒã§ã€ 改行形å¼ã®å¤‰æ›å¯¾è±¡ã‹ã‚‰ã¯ã€\n"
+" 除外ã™ã‚‹ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚"
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+"- ``eol.fix-trailing-newline`` (無指定時㯠False) ã® True 設定ã«ã‚ˆã‚Šã€\n"
+" 改行形å¼å¤‰æ›å¾Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ«å°¾ãŒã€ 改行 (設定ã«å¿œã˜ã¦ ``\\n`` ãªã„ã—\n"
+" ``\\r\\n``) ã§çµ‚了ã™ã‚‹ã“ã¨ãŒä¿è¨¼ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+"本エクステンションã¯ã€ éžæŽ¨å¥¨ã® win32text エクステンションã¨åŒæ§˜ã«ã€\n"
+"``cleverencode:`` ãŠã‚ˆã³ ``cleverdecode:`` フィルタをæä¾›ã—ã¦ã„ã¾ã™ã€‚\n"
+"ãã®ãŸã‚〠win32text ã®ç„¡åŠ¹åŒ–㨠eol ã®æœ‰åŠ¹åŒ–ã‚’è¡Œã£ã¦ã‚‚ã€\n"
+"既存ã®ãƒ•ã‚£ãƒ«ã‚¿è¨­å®šã¯æ©Ÿèƒ½ã—続ã‘ã¾ã™ã€‚ 既存ã®ãƒ•ã‚£ãƒ«ã‚¿è¨­å®šãŒå¿…è¦ãªã®ã¯ã€\n"
+"``.hgeol`` 設定を記述ã™ã‚‹ã¾ã§ã§ã™ã€‚"
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+"win32text エクステンションã«ã‚ˆã‚‹ ``win32text.forbid*`` フック群ã¯ã€\n"
+"å˜ä¸€ã® ``eol.checkheadshook`` フックã«çµ±åˆã•ã‚Œã¾ã—ãŸã€‚ ã“ã®ãƒ•ãƒƒã‚¯ã¯ã€\n"
+"期待ã™ã‚‹æ”¹è¡Œå½¢å¼ã‚’ ``.hgeol`` ã‹ã‚‰ç‰¹å®šã—ã¾ã™ã®ã§ã€ フック使用ã®éš›ã«ã¯ã€\n"
+"ã¾ãšã¯ ``.hgeol`` 利用ã¸ã¨ç§»è¡Œã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ ``eol.checkheadshook``\n"
+"ãŒç¢ºèªã™ã‚‹ã®ã¯ã€ ヘッド (head) リビジョンã®ã¿ã§ã€ ãれ以外ã®ãƒªãƒ“ジョンã¯ã€\n"
+"改行形å¼ãŒä¸æ­£ã§ã‚‚無視ã•ã‚Œã¾ã™ã€‚ å…¨ã¦ã®ãƒªãƒ“ジョンã«ãŠã„ã¦ã€\n"
+"ä¸æ­£ãªæ”¹è¡Œå½¢å¼ã‚’ç¦æ­¢ã—ãŸã„å ´åˆã¯ ``eol.checkallhook`` を使用ã—ã¾ã™ã€‚\n"
+"ã“れらã®ãƒ•ãƒƒã‚¯ã¯ ``pretxnchangegroup`` フックã¨ã—ã¦ã®ä½¿ç”¨ã‚’想定ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr "パターンåˆè‡´ã«é–¢ã™ã‚‹è©³ç´°ã¯ :hg:`help patterns` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "未知ã®æ”¹è¡Œå½¢å¼ '%s' (%s ç”±æ¥) を無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr "警告: 解æžã‚¨ãƒ©ãƒ¼ã«ã‚ˆã‚Š .hgeol ファイルを無視ã—ã¾ã™ (%s 行目: %s)\n"
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s (リビジョン %s) ã®æ”¹è¡Œå½¢å¼ %s ã¯ä¸é©åˆ‡ã§ã™"
+
+msgid "end-of-line check failed:\n"
+msgstr "改行形å¼ç¢ºèªã«å¤±æ•—:\n"
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "eol エクステンション㨠win32text エクステンションã¯ä½µç”¨ã§ãã¾ã›ã‚“\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "%s ã«ãŠã‘る改行形å¼ä¸æ•´åˆ\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr "リビジョン間差分表示ã§ã®å¤–部コマンドã®åˆ©ç”¨"
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+"本エクステンションã¯ã€ リビジョン間〠ãªã„ã—リビジョンã¨ä½œæ¥­é ˜åŸŸã®é–“ã§ã€\n"
+"差分表示を行ã†éš›ã«ã€ 外部コマンドを利用å¯èƒ½ã«ã—ã¾ã™ã€‚ 外部コマンドã¯ã€\n"
+"設定ã§æ”¹å¤‰å¯èƒ½ãªã‚ªãƒ—ション群ã¨ã€ 2ã¤ã®å¼•æ•° (比較対象ファイルを格ç´ã—ãŸã€\n"
+"スナップショットディレクトリã¸ã®ãƒ‘ス) を使ã£ã¦èµ·å‹•ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+"本エクステンションã§ã¯ã€ 差分コマンドを定義å¯èƒ½ãªã®ã§ã€ 実行ã®éƒ½åº¦ã€\n"
+":hg:`extdiff -p kdiff3` ã®ã‚ˆã†ãªæŒ‡å®šã‚’ã™ã‚‹å¿…è¦ã‚ã‚Šã¾ã›ã‚“::"
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+" [extdiff]\n"
+" # 'context diff' モード㧠GNU diff(1) ã‚’èµ·å‹•ã™ã‚‹è¨­å®šã‚’追加\n"
+" cdiff = gdiff -Nprc5\n"
+" ## æ—§æ¥ã®æ–¹å¼ã§ã®è¨­å®š:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # kdiff3 ã‚’èµ·å‹•ã™ã‚‹ vdiff 設定ã®è¿½åŠ \n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+" # meld ã‚’èµ·å‹•ã™ã‚‹è¨­å®šã®è¿½åŠ  (åŒåã®å ´åˆã¯è¨­å®šå³è¾ºã‚’çœç•¥å¯èƒ½)\n"
+" meld ="
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+msgstr ""
+" # DirDiff (http://www.vim.org/scripts/script.php?script_id=102 å‚ç…§)\n"
+" # プラグイン併用㮠gvimdiff ã‚’ èµ·å‹•ã™ã‚‹ vimdiff 設定ã®è¿½åŠ ã€‚\n"
+" # éžè‹±èªžåœã®åˆ©ç”¨è€…ã¯ã€ .vimrc 設定ファイルã«ãŠã‘ã‚‹\n"
+" # \"let g:DirDiffDynamicDiffText = 1\" 指定ãŒå¿…è¦ã€‚\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr "外部コマンドã¸ã®å¼•æ•°ã«ã¯ã€ 実行時ã«ç½®æ›ã•ã‚Œã‚‹å¤‰æ•°ã‚’指定ã§ãã¾ã™::"
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+" $parent1, $plabel1 - 第1親リビジョンã®ãƒ•ã‚¡ã‚¤ãƒ«åã¨èª¬æ˜Žæ–‡å­—列\n"
+" $child, $clabel - å­ãƒªãƒ“ジョンã®ãƒ•ã‚¡ã‚¤ãƒ«åã¨èª¬æ˜Žæ–‡å­—列\n"
+" $parent2, $plabel2 - 第2親リビジョンã®ãƒ•ã‚¡ã‚¤ãƒ«åã¨èª¬æ˜Žæ–‡å­—列\n"
+" $root - リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆ\n"
+" $parent1 ã®åˆ¥åã¨ã—㦠$parent も使用å¯èƒ½"
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+"差分表示ã®å¤–部コマンドã¸ã®å¼•æ•°è¨­å®šãŒ [extdiff] セクションã«ç„¡ã„å ´åˆã€\n"
+"本エクステンション㯠[diff-tools] ãŠã‚ˆã³ [merge-tools] ã®è¨­å®šã‚’å‚ç…§ã—ã¾ã™ã€‚"
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+"通常㮠:hg:`diff` 実行ã¨åŒæ§˜ã«ã€ -I/-X〠ãŠã‚ˆã³ãƒ•ã‚¡ã‚¤ãƒ«åã€\n"
+"ディレクトリåã®æŒ‡å®šãŒå¯èƒ½ã§ã™ã€‚ ã“ã®å ´åˆã€ 本エクステンションã¯ã€\n"
+"差分表示ã«å¿…è¦ãªåˆ†ã ã‘〠スナップショットを作æˆã—ã¾ã™ã®ã§ã€\n"
+"外部ã®å·®åˆ†è¡¨ç¤ºã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã¯ã€ ã‚る程度高速化ã•ã‚Œã¾ã™ (å°‘ãªãã¨ã‚‚ã€\n"
+"リãƒã‚¸ãƒˆãƒªå…¨ä½“ã«å¯¾ã™ã‚‹å·®åˆ†è¡¨ç¤ºã‚ˆã‚Šã¯ã€ 確実ã«æ—©ã„ç­ˆã§ã™)。\n"
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¹ãƒŠãƒƒãƒ—ショットをリビジョン %s ã‹ã‚‰ç”Ÿæˆä¸­\n"
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¹ãƒŠãƒƒãƒ—ショットを作業領域ã‹ã‚‰ç”Ÿæˆä¸­\n"
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "--rev 㨠--change ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "cleaning up temp directory\n"
+msgstr "一時ディレクトリを破棄ã—ã¦ã„ã¾ã™\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr "外部コマンドを使用ã—ãŸãƒªãƒã‚¸ãƒˆãƒª(ãªã„ã—指定ファイル)ã®å·®åˆ†è¡¨ç¤º"
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+" 指定ファイルã®ãƒªãƒ“ジョン間差分を〠外部コマンドを使ã£ã¦è¡¨ç¤ºã—ã¾ã™ã€‚\n"
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 外部プログラムã«ã¯ã€\"-Npru\" オプション付ãã®\n"
+" \"diff\" コマンドãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+" 外部プログラムを変更ã™ã‚‹å ´åˆã¯ã€ -p/--program ã§æŒ‡å®šã—ã¾ã™ã€‚\n"
+" 外部プログラム起動時ã«ã¯ã€ 比較対象ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒ2ã¤æŒ‡å®šã•ã‚Œã¾ã™ã€‚\n"
+" 付加的ãªã‚ªãƒ—ションãŒå¿…è¦ãªå ´åˆã¯ã€ -o/--option ã§æŒ‡å®šã—ã¾ã™ã€‚\n"
+" 外部プログラムã®èµ·å‹•å¼•æ•°ã¨ã—ã¦ã¯ã€ オプション指定ã®æ–¹ãŒã€\n"
+" 比較対象ディレクトリよりも先ã«æŒ‡å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+" リビジョンãŒ2ã¤æŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定リビジョン間ã®å·®åˆ†ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+" リビジョンãŒ1ã¤æŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 作業領域ã¨ã®é–“ã®å·®åˆ†ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+" リビジョンãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 作業領域ã¨è¦ªã¨ã®å·®åˆ†ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid "CMD"
+msgstr "コマンド"
+
+msgid "comparison program to run"
+msgstr "差分表示プログラム"
+
+msgid "OPT"
+msgstr "オプション"
+
+msgid "pass option to comparison program"
+msgstr "差分表示プログラムã¸ã®ã‚ªãƒ—ション指定"
+
+msgid "revision"
+msgstr "リビジョン"
+
+msgid "change made by revision"
+msgstr "当該リビジョンã«ãŠã‘る変更内容ã®è¡¨ç¤º"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [OPT]... [FILE]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr "%(path)s ã«ã‚ˆã‚‹ãƒªãƒã‚¸ãƒˆãƒª(ãªã„ã—指定ファイル)ã®å·®åˆ†è¡¨ç¤º"
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+" 外部プログラム %(path)s を使用ã—ã¦ã€ リビジョン間ã«ãŠã‘ã‚‹ã€\n"
+" 指定ファイルã®å·®åˆ†ã‚’表示ã—ã¾ã™ã€‚"
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [OPTION]... [FILE]..."
+
+msgid "http authentication with factotum"
+msgstr "factotum ã§ã® http èªè¨¼"
+
+msgid ""
+"This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
+"platforms to provide authentication information for HTTP access. "
+"Configuration\n"
+"entries specified in the auth section as well as authentication information\n"
+"provided in the repository URL are fully supported. If no prefix is "
+"specified,\n"
+"a value of \"*\" will be assumed."
+msgstr ""
+"本エクステンションã¯ã€ ベル研㮠Plan 9 環境ã«ãŠã‘ã‚‹ factotum(4) 機能をã€\n"
+"HTTP アクセスã§ã®èªè¨¼æƒ…å ±å–å¾—ã§ã€ 利用ã§ãるよã†ã«ã—ã¾ã™ã€‚ 連æºå¯¾è±¡ã®\n"
+"URL 中ã®èªè¨¼æƒ…å ±åŒæ§˜ã«ã€ 設定ファイル㮠auth セクションã«ãŠã‘る設定もã€\n"
+"サãƒãƒ¼ãƒˆå¯¾è±¡ã§ã™ã€‚ 設定ã«ãŠã„ã¦ã€ 値ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã¯ã€\n"
+"``*`` 指定ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid "By default, keys are specified as::"
+msgstr "デフォルトã§ã¯ã€ キーã®æŒ‡å®šã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¡Œã„ã¾ã™::"
+
+msgid ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"å¿…è¦ãªã‚­ãƒ¼ã‚’読ã¿è¾¼ã‚ãªã„å ´åˆã€ factotum エクステンションã¯ã€\n"
+"対話的ãªã‚­ãƒ¼ã®è¦æ±‚ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"実行時ã®æŒ™å‹•ã¯ã€ 設定ã«ã‚ˆã£ã¦å¤‰æ›´å¯èƒ½ã§ã™ã€‚ デフォルトã®è¨­å®šã¯ã€\n"
+"以下ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™::"
+
+msgid ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+msgstr ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"executable 設定ã¯ã€ factotum ãƒã‚¤ãƒŠãƒªã¸ã®ãƒ•ãƒ«ãƒ‘スを指定ã—ã¾ã™ã€‚\n"
+"mountpoint 設定ã¯ã€ factotum ファイルサービスを指定ã—ã¾ã™ã€‚\n"
+"service 設定ã¯ã€ キーã®èª­ã¿è¾¼ã¿ã«ä½¿ç”¨ã™ã‚‹ã‚µãƒ¼ãƒ“スåを制御ã—ã¾ã™ã€‚"
+
+msgid "factotum not interactive"
+msgstr "factotum ãŒå¯¾è©±çš„ã«å®Ÿè¡Œã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "factotum not responding"
+msgstr "factotum ãŒå¿œç­”ã—ã¾ã›ã‚“"
+
+msgid "pull, update and merge in one command (DEPRECATED)"
+msgstr "pull, update, merge ã®ä¸€æ‹¬å®Ÿè¡Œ (éžæŽ¨å¥¨)"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®å–ã‚Šè¾¼ã¿ã¨ã€ å¿…è¦ã«å¿œã˜ãŸãƒžãƒ¼ã‚¸å®Ÿæ–½"
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" 指定ã®ãƒ‘ス/URL ãŒæŒ‡ã™ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰ã€ 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦ã€\n"
+" å…¨ã¦ã®å¤‰æ›´ã‚’å–ã‚Šè¾¼ã¿ã¾ã™ã€‚"
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+" 変更å–ã‚Šè¾¼ã¿ã«ã‚ˆã£ã¦ã€ æ–°è¦ã®ãƒ–ランãƒãƒ˜ãƒƒãƒ‰ãŒç”Ÿæˆã•ã‚Œã‚‹å ´åˆã€\n"
+" ヘッドã®ãƒžãƒ¼ã‚¸ã¨ã€ マージçµæžœã®ã‚³ãƒŸãƒƒãƒˆãŒã€ 自動的ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" ãれ以外ã®å ´åˆã¯ã€ 作業領域ãŒæœ€æ–°ã®ãƒªãƒ“ジョンã«æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" When a merge is needed, the working directory is first updated to\n"
+" the newly pulled changes. Local changes are then merged into the\n"
+" pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+" マージã®å¿…è¦ãŒã‚ã‚‹å ´åˆã€ å–ã‚Šè¾¼ã¾ã‚ŒãŸå¤‰æ›´ã«ã‚ˆã‚‹ä½œæ¥­é ˜åŸŸã®æ›´æ–°ãŒã€\n"
+" 最åˆã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚ 次ã«ã€ 手元ã®å¤‰æ›´ãŒä½œæ¥­é ˜åŸŸã«ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã™ã€‚\n"
+" マージã®é †åºã‚’変更ã™ã‚‹å ´åˆã¯ã€ --switch-parent を指定ã—ã¾ã™ã€‚"
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr " -d/--date ã§ã®æ—¥æ™‚表記㯠:hg:`help dates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr "作業領域ã¯ãƒ–ランãƒã®æœ€æ–°ã§ã¯ã‚ã‚Šã¾ã›ã‚“(\"hg update\" ã§æœ€æ–°ã«æ›´æ–°å¯èƒ½)"
+
+msgid "outstanding uncommitted merge"
+msgstr "マージãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "outstanding uncommitted changes"
+msgstr "変更ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "working directory is missing some files"
+msgstr "作業領域ã«å­˜åœ¨ã—ãªã„ファイルãŒã‚ã‚Šã¾ã™"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"ブランãƒã«è¤‡æ•°ã®ãƒ˜ãƒƒãƒ‰ãŒã‚ã‚Šã¾ã™(\"hg heads .\" ã§ç¢ºèªã€\"hg merge\" ã§ãƒžãƒ¼"
+"ジ)"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "%s ã‹ã‚‰å–ã‚Šè¾¼ã¿ä¸­\n"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr "連æºå…ˆã§ãƒªãƒ“ジョンãŒç‰¹å®šã§ããªã„ãŸã‚〠リビジョンã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+"æ–°è¦ãƒ˜ãƒƒãƒ‰ %d 個ã¯ãƒžãƒ¼ã‚¸æœªå®Ÿæ–½(\"hg heads .\" ã§ç¢ºèªã€\"hg merge\" ã§ãƒžãƒ¼"
+"ジ)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "%d ã«æ›´æ–°ã—ã¦ã„ã¾ã™:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "%d ã¨ãƒžãƒ¼ã‚¸ã—ã¦ã„ã¾ã™:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr "æ–°è¦ãƒªãƒ“ジョン %d:%s ã«ã‚ˆã‚Šã€é€£æºå…ˆã¨ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒªãƒ“ジョンをマージ\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "å–ã‚Šè¾¼ã¿å¯¾è±¡ãƒªãƒ“ジョンã®æŒ‡å®š"
+
+msgid "edit commit message"
+msgstr "コミットログã®ç·¨é›†"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "コミットログã®ç·¨é›†(éžæŽ¨å¥¨)"
+
+msgid "switch parents when merging"
+msgstr "マージã®éš›ã®ç¬¬1親リビジョンを切り替ãˆ"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [SOURCE]"
+
+msgid "commands to sign and verify changesets"
+msgstr "リビジョンã¸ã®ç½²åãŠã‚ˆã³æ¤œè¨¼ã‚³ãƒžãƒ³ãƒ‰"
+
+msgid "error while verifying signature"
+msgstr "ç½²å検証中ã®ã‚¨ãƒ©ãƒ¼"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s ä¸æ­£ç½²å(\"%s\" ã«ã‚ˆã‚‹ç½²å)\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s 備考: 有効期é™åˆ‡ã‚Œç½²å(\"%s\" ã«ã‚ˆã‚‹ç½²å)\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s 備考: 有効期é™åˆ‡ã‚Œéµ(\"%s\" ã«ã‚ˆã‚‹ç½²å)\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "ç½²å済ã¿ãƒªãƒ“ジョンã®ä¸€è¦§è¡¨ç¤º"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "%s:%d ノードã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+msgid "hg sigcheck REV"
+msgstr "hg sigcheck REV"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr "特定リビジョンã«é–¢ã™ã‚‹å…¨ç½²åã®æ¤œè¨¼"
+
+#, python-format
+msgid "no valid signature for %s\n"
+msgstr "%s ã®æ­£ã—ã„ç½²åã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "make the signature local"
+msgstr "自リãƒã‚¸ãƒˆãƒªãƒ­ãƒ¼ã‚«ãƒ«ãªç½²å"
+
+msgid "sign even if the sigfile is modified"
+msgstr "ç½²åファイルãŒå¤‰æ›´ã•ã‚Œã¦ã„ã¦ã‚‚ç½²åを実施"
+
+msgid "do not commit the sigfile after signing"
+msgstr "ç½²å後ã®ç½²åファイルã®ã‚³ãƒŸãƒƒãƒˆã‚’抑止"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "ç½²åã«ä½¿ç”¨ã™ã‚‹éµID"
+
+msgid "TEXT"
+msgstr "テキスト"
+
+msgid "commit message"
+msgstr "コミットログ"
+
+msgid "hg sign [OPTION]... [REV]..."
+msgstr "hg sign [OPTION]... [REV]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "指定リビジョンã¸ã®ç½²åã®ä»˜ä¸Ž"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" リビジョンãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 作業領域ã®è¦ªãƒªãƒ“ジョンãŒã€\n"
+" 親リビジョン㌠null ã®å ´åˆã¯ tip ãŒå¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" -d/--date ã§ã®æ—¥æ™‚表記㯠:hg:`help dates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr "マージãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™ - 対象リビジョンを指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "signing %d:%s\n"
+msgstr "%d:%s ã¸ã®ç½²å中\n"
+
+msgid "error while signing"
+msgstr "ç½²å処ç†ã®å¤±æ•—"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"作業領域㮠.hgsigs ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™(手動コミットãªã„ã— --force ã®æŒ‡å®š)"
+
+msgid "unknown signature version"
+msgstr "未知ã®ç½²åãƒãƒ¼ã‚¸ãƒ§ãƒ³"
+
+msgid "command to view revision graphs from a shell"
+msgstr "端末ã§ã®å±¥æ­´ãƒ„リー表示ã®ã‚³ãƒžãƒ³ãƒ‰"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"本エクステンションã¯ã€ incoming, outgoing ãŠã‚ˆã³ log コマンドã«ã€\n"
+"æ–°è¦ã‚ªãƒ—ション --graph を付与ã—ã¾ã™ã€‚ --graph 指定ã«ã‚ˆã‚Šã€ ASCII\n"
+"文字ã«ã‚ˆã‚‹å±¥æ­´ãƒ„リーãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr "複製元や改åå…ƒã®å±¥æ­´ã‚‚é¡ã‚‹"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "マージã®éš›ã«ã¯ç¬¬1親ã®ã¿ã‚’é¡ã‚‹ (DEPRECATED)"
+
+msgid "show revisions matching date spec"
+msgstr "指定日時ã«åˆè‡´ã™ã‚‹ãƒªãƒ“ジョンを表示"
+
+msgid "show copied files"
+msgstr "複製ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "do case-insensitive search for a given text"
+msgstr "指定キーワードã«ã‚ˆã‚‹æ¤œç´¢(大文字å°æ–‡å­—ã¯ç„¡è¦–)"
+
+msgid "show the specified revision or range"
+msgstr "指定ã•ã‚ŒãŸå˜ä¸€ã€ ãªã„ã—リビジョン区間ã®è¡¨ç¤º"
+
+msgid "include revisions where files were removed"
+msgstr "ファイルãŒç™»éŒ²é™¤å¤–ã•ã‚ŒãŸãƒªãƒ“ジョンをå«ã‚ã‚‹"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "マージ実施リビジョンã®ã¿ã‚’表示 (DEPRECATED)"
+
+msgid "USER"
+msgstr "ユーザ"
+
+msgid "revisions committed by user"
+msgstr "当該ユーザã«ã‚ˆã‚‹ãƒªãƒ“ジョンを表示"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "指定ã®åå‰ä»˜ãブランãƒã«å±žã™ã‚‹ãƒªãƒ“ジョンを表示 (éžæŽ¨å¥¨)"
+
+msgid "BRANCH"
+msgstr "ブランãƒ"
+
+msgid "show changesets within the given named branch"
+msgstr "指定ã®åå‰ä»˜ãブランãƒã«å±žã™ã‚‹ãƒªãƒ“ジョンを表示"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "当該リビジョンã¨ãã®ç¥–å…ˆã®è¡¨ç¤ºã‚’抑止"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "éš ã‚ŒãŸãƒªãƒ“ジョンã®è¡¨ç¤º (DEPRECATED)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPTION]... [FILE]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "ASCII 文字ã«ã‚ˆã‚‹å±¥æ­´ãƒ„リー併用ã®å±¥æ­´è¡¨ç¤º"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr " ASCII 文字ã«ã‚ˆã‚‹å±¥æ­´ãƒ„リー併用ã®å¤‰æ›´å±¥æ­´ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" @ 文字ã§è¡¨ç¤ºã•ã‚Œã‚‹ãƒªãƒ“ジョンã¯ã€ 作業領域ã®è¦ªãƒªãƒ“ジョンã§ã™ã€‚\n"
+" "
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr "CIA.vc 通知サービスã¨ã®çµ±åˆå‘ã‘ã®ãƒ•ãƒƒã‚¯é›†"
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+"changegroup ãªã„ã— incoming フックã¨ã—ã¦ã®å®Ÿè¡Œã‚’想定ã—ã¦ã„ã¾ã™ã€‚\n"
+"以下ã®ã‚ˆã†ãªè¨­å®šã‚’〠Mercurial 設定ファイルã«è¨˜è¿°ã—ã¦ãã ã•ã„::"
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+" [cia]\n"
+" # CIA ã®ç™»éŒ²ãƒ¦ãƒ¼ã‚¶å\n"
+" user = foo\n"
+" # CIA ã«ãŠã‘るプロジェクトå\n"
+" project = foo\n"
+" # モジュール (副プロジェクト) (çœç•¥å¯èƒ½)\n"
+" #module = foo\n"
+" # ログメッセージã¸ã® diffstat ã®è¿½åŠ  (çœç•¥å¯èƒ½)\n"
+" #diffstat = False\n"
+" # ログメッセージ用テンプレート指定 (çœç•¥å¯èƒ½)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # スタイル指定 (çœç•¥å¯èƒ½)\n"
+" #style = foo\n"
+" # CIA 通知サービス㮠URL (çœç•¥å¯èƒ½)\n"
+" # é›»å­ãƒ¡ãƒ¼ãƒ«ã§é€šçŸ¥ã™ã‚‹å ´åˆã€ 以下ã®ã‚ˆã†ãª mailto: URL を使用å¯èƒ½\n"
+" # mailto:cia@cia.vc\n"
+" # é›»å­ãƒ¡ãƒ¼ãƒ«ä½¿ç”¨ã®éš›ã«ã¯ email.from 設定ãŒå¿…須。\n"
+" #url = http://cia.vc/\n"
+" # メッセージをé€ä¿¡ã›ãšã«è¡¨ç¤º (çœç•¥å¯èƒ½)\n"
+" #test = False\n"
+" # URL パスã‹ã‚‰å–り除ãスラッシュ数\n"
+" #strip = 0"
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+" [hooks]\n"
+" # 以下ã®ã„ãšã‚Œã‹:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+" [web]\n"
+" # ãƒã‚¤ãƒ‘ーリンクãŒå¿…è¦ãªå ´åˆ (çœç•¥å¯èƒ½)\n"
+" baseurl = http://server/path/to/repo\n"
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s ã‹ã‚‰ã‚¨ãƒ©ãƒ¼ãŒè¿”å´ã•ã‚Œã¾ã—ãŸ: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: %s ã«æ›´æ–°ã‚’é€ä¿¡ã—ã¦ã„ã¾ã™\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã®ãŸã‚ã«ã¯ email.from ã®å®šç¾©ãŒå¿…è¦ã§ã™"
+
+msgid "browse the repository in a graphical way"
+msgstr "グラフィカル㪠UI ã«ã‚ˆã‚‹ãƒªãƒã‚¸ãƒˆãƒªå‚ç…§"
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+"本エクステンションã¯ã€ GUI ã«ã‚ˆã‚‹å±¥æ­´ã®å‚照をå¯èƒ½ã«ã—ã¾ã™ã€‚\n"
+"利用ã«å½“ãŸã£ã¦ã¯ã€ 8.4 以é™ã® Tcl/Tk ãŒå¿…è¦ã§ã™\n"
+"(Tcl/Tk 㯠Mercurial ã«ã¯åŒæ¢±ã•ã‚Œã¦ã„ã¾ã›ã‚“)"
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+"本エクステンション (hgk) ã¯ã€ 2ã¤ã®éƒ¨ä½ã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™:\n"
+"情報ã®è¡¨ç¤ºï¼å…¥åŠ›ç”¨ã® Tcl スクリプト部ã¨ã€ Mercurial\n"
+"ã‹ã‚‰ã®æƒ…報入手フックを定義ã™ã‚‹ã€ Mercurial エクステンションã¨ã—ã¦ã®\n"
+"hgk.py スクリプトã§ã™ã€‚ Tcl スクリプト部 (hgk) 㯠contrib\n"
+"ディレクトリé…下ã«ã€ エクステンション部 (hgk.py) 㯠hgext\n"
+"ディレクトリé…下ã«æ ¼ç´ã•ã‚Œã¦ãŠã‚Šã€ 使用ã«å½“ãŸã£ã¦ã¯ã€\n"
+"エクステンションã®æœ‰åŠ¹åŒ–ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+":hg:`view` コマンドã«ã‚ˆã‚Šã€ hgk ã® Tcl スクリプトãŒèµ·å‹•ã•ã‚Œã¾ã™ã€‚\n"
+"実行ã®éš›ã«ã¯ã€ コマンド検索パス上㫠hgk スクリプトãŒãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+"ã‚ã‚‹ã„ã¯ã€ 設定ファイルã«ãŠã„ã¦ã€ hgk ã¸ã®ãƒ‘スを指定ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™::"
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/location/of/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+"extdiff エクステンションã®ä½µç”¨ã§ã€ 差分をグラフィカルã«è¡¨ç¤ºã§ãã¾ã™ã€‚\n"
+"extdiff 㧠vdiff コマンドãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ 以下ã®è¨˜è¿°ã‚’追加ã—ã¾ã™::"
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+"上記設定ã«ã‚ˆã‚Šã€ リビジョンã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ã¯ã€ 対象リビジョンã¨ã€\n"
+"指定ã—ãŸãƒªãƒ“ジョンã«å¯¾ã—ã¦ã€ vdiff ã‚’èµ·å‹•ã™ã‚‹é …ç›®ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "diff trees from two commits"
+msgstr "2リビジョン間ã®å·®åˆ†ãƒ„リー表示"
+
+msgid "output common ancestor information"
+msgstr "共通ã®ç¥–先リビジョンã®æƒ…報表示"
+
+msgid "cat a specific revision"
+msgstr "指定リビジョン時点ã®å†…容表示"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: 種別もリビジョンも指定ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "中断: catfile 㯠commit 種別ã§ã®ã¿å®Ÿè¡Œå¯èƒ½ã§ã™\n"
+
+msgid "parse given revisions"
+msgstr "指定リビジョンã®è§£æž"
+
+msgid "print revisions"
+msgstr "リビジョンã®è¡¨ç¤º"
+
+msgid "print extension options"
+msgstr "エクステンション設定ã®è¡¨ç¤º"
+
+msgid "start interactive history viewer"
+msgstr "対話的ãªå±¥æ­´å‚ç…§ã®é–‹å§‹"
+
+msgid "NUM"
+msgstr "数値"
+
+msgid "limit number of changes displayed"
+msgstr "最大表示リビジョン数"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l LIMIT] [REVRANGE]"
+
+msgid "generate patch"
+msgstr "パッãƒã®ç”Ÿæˆ"
+
+msgid "recursive"
+msgstr "å†èµ·"
+
+msgid "pretty"
+msgstr "ヘッダã®æ•´å½¢å‡ºåŠ›"
+
+msgid "stdin"
+msgstr "標準入力"
+
+msgid "detect copies"
+msgstr "コピーã®æ¤œå‡º"
+
+msgid "search"
+msgstr "検索"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [OPTION]... TYPE FILE"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr "hg debug-merge-base REV REV"
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "無視ã—ã¾ã—ãŸ"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse REV"
+
+msgid "header"
+msgstr "ヘッダ"
+
+msgid "topo-order"
+msgstr "履歴トãƒãƒ­ã‚¸ãƒ¼ã®é †åº"
+
+msgid "parents"
+msgstr "親"
+
+msgid "max-count"
+msgstr "最大数"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [OPTION]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "hgweb ã«ãŠã‘るシンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆ (è¦ Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"本エクステンションã«ã¯ã€ シンタックスãƒã‚¤ãƒ©ã‚¤ãƒˆãƒ©ã‚¤ãƒ–ラリ㮠Pygments\n"
+"ãŒå¿…è¦ã§ã™: http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "本エクステンションã«å¯¾ã—ã¦ã¯ã€ä»¥ä¸‹ã®è¨­å®šã®ã¿ãŒå¯èƒ½ã§ã™::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <style>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "無指定時ã®è¨­å®šã¯ 'colorful' ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "interactive history editing"
+msgstr "対話的ãªå±¥æ­´æ”¹å¤‰"
+
+msgid ""
+"With this extension installed, Mercurial gains one new command: histedit. "
+"Usage\n"
+"is as follows, assuming the following history::"
+msgstr ""
+"本エクステンションã®æœ‰åŠ¹åŒ–ã«ã‚ˆã‚Š histedit コマンドãŒåˆ©ç”¨å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚\n"
+"以é™ã®èª¬æ˜Žã§ã¯ã€ 以下ã®å±¥æ­´ã‚’å‰æã¨ã—ã¦ã„ã¾ã™::"
+
+msgid ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you were to run ``hg histedit c561b4e977df``, you would see the "
+"following\n"
+"file open in your editor::"
+msgstr ""
+"``hg histedit c561b4e977df`` 実行ã«ã‚ˆã‚Šã€ エディタãŒèµ·å‹•ã•ã‚ŒãŸä¸Šã§ã€\n"
+"以下ã®å†…容ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒé–‹ã‹ã‚Œã¾ã™::"
+
+msgid ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+msgstr ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+
+msgid ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+msgstr ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+
+msgid ""
+"In this file, lines beginning with ``#`` are ignored. You must specify a "
+"rule\n"
+"for each revision in your history. For example, if you had meant to add "
+"gamma\n"
+"before beta, and then wanted to add delta in the same revision as beta, you\n"
+"would reorganize the file to look like this::"
+msgstr ""
+"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã® ``#`` ã§å§‹ã¾ã‚‹è¡Œã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ 履歴編集対象ã«å¯¾ã—ã¦ã€\n"
+"å„リビジョン毎ã®å‡¦ç†å†…容 (rule) を指定ã—ã¦ãã ã•ã„。 例ãˆã° \"Add beta\"\n"
+"ã«ã‚ˆã‚‹æ”¹å¤‰ã‚ˆã‚Šã‚‚ \"Add gamma\" ã«ã‚ˆã‚‹æ”¹å¤‰ã‚’å…ˆã«å®Ÿæ–½ã—ãŸä¸Šã§ã€ \"Add\n"
+"delta\" ã«ã‚ˆã‚‹æ”¹å¤‰ã‚’ \"Add beta\" ã¸ã¨ä½µåˆ (fold) ã™ã‚‹å ´åˆãªã‚‰ã€\n"
+"以下ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™::"
+
+msgid ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+msgstr ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+
+msgid ""
+"At which point you close the editor and ``histedit`` starts working. When "
+"you\n"
+"specify a ``fold`` operation, ``histedit`` will open an editor when it "
+"folds\n"
+"those revisions together, offering you a chance to clean up the commit "
+"message::"
+msgstr ""
+"``histedit`` ã®å®Ÿéš›ã®å‡¦ç†ã¯ã€ エディタを終了ã•ã›ãŸæ™‚点ã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ã€‚\n"
+"``fold`` æ“作を指定ã—ãŸå ´åˆã€ ä½µåˆå¾Œãƒªãƒ“ジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°å…¥åŠ›ã®ãŸã‚ã«ã€\n"
+"ä½µåˆå¯¾è±¡ã¨ä½µåˆå…ˆã®å„コミットログを〠以下ã®æ§˜ã«çµåˆã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€\n"
+"``histedit`` ãŒã‚¨ãƒ‡ã‚£ã‚¿ã§é–‹ãã¾ã™::"
+
+msgid ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+msgstr ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+
+msgid ""
+"Edit the commit message to your liking, then close the editor. For\n"
+"this example, let's assume that the commit message was changed to\n"
+"``Add beta and delta.`` After histedit has run and had a chance to\n"
+"remove any old or temporary revisions it needed, the history looks\n"
+"like this::"
+msgstr ""
+"コミットログã®ç·¨é›†ã‚’終ãˆãŸãªã‚‰ã€ エディタを終了ã—ã¾ã™ã€‚ ã“ã“ã§ã¯ã€\n"
+"コミットログを ``Add beta and delta.`` ã«å¤‰æ›´ã—ãŸã‚‚ã®ã¨ä»®å®šã—ã¾ã™ã€‚\n"
+"histedit ã«ã‚ˆã‚‹æ”¹å¤‰å‡¦ç†ãŒå®Œäº†ã™ã‚‹ã¨ã€ 以下ã®æ§˜ãªå±¥æ­´ã«ãªã‚Šã¾ã™::"
+
+msgid ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"Note that ``histedit`` does *not* remove any revisions (even its own "
+"temporary\n"
+"ones) until after it has completed all the editing operations, so it will\n"
+"probably perform several strip operations when it's done. For the above "
+"example,\n"
+"it had to run strip twice. Strip can be slow depending on a variety of "
+"factors,\n"
+"so you might need to be a little patient. You can choose to keep the "
+"original\n"
+"revisions by passing the ``--keep`` flag."
+msgstr ""
+"``histedit`` ã®å±¥æ­´æ”¹å¤‰å‡¦ç†ã§ã¯ã€ 改変処ç†ãŒå®Œäº†ã™ã‚‹ã¾ã§ã¯ã€(例ãˆãã‚ŒãŒã€\n"
+"作業用ã®ä¸€æ™‚çš„ãªã‚‚ã®ã§ã‚ã£ã¦ã‚‚) 履歴ãŒå‰Šé™¤ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“ã®ã§ã€\n"
+"処ç†çµ‚了直å‰ã«ã¯ã€ ãŠãらã複数ã®ãƒªãƒ“ジョンã®ç ´æ£„ãŒè¡Œã‚ã‚Œã¾ã™ã€‚\n"
+"上記ã®ä¾‹ã®å ´åˆã€ 2回ã®å±¥æ­´ç ´æ£„ãŒè¡Œã‚れる筈ã§ã™ã€‚ 履歴破棄ã®å®Ÿè¡Œé€Ÿåº¦ã¯ã€\n"
+"様々ãªè¦å› ãŒå…ƒã§ä½Žä¸‹ã—å¾—ã¾ã™ã®ã§ã€ 多少ã®æˆ‘æ…¢ãŒå¿…è¦ã«ãªã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。\n"
+"``--keep`` を指定ã™ã‚‹ã“ã¨ã§ã€ 履歴ã®ç ´æ£„を抑止å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"The ``edit`` operation will drop you back to a command prompt,\n"
+"allowing you to edit files freely, or even use ``hg record`` to commit\n"
+"some changes as a separate commit. When you're done, any remaining\n"
+"uncommitted changes will be committed as well. When done, run ``hg\n"
+"histedit --continue`` to finish this step. You'll be prompted for a\n"
+"new commit message, but the default commit message will be the\n"
+"original message for the ``edit`` ed revision."
+msgstr ""
+"``edit`` æ“作を指定ã—ãŸå ´åˆã€ 一旦コマンド入力ã«æˆ»ã‚Šã¾ã™ã®ã§ã€\n"
+"ファイル内容ã®ç·¨é›†ã‚„〠``hg record`` ã«ã‚ˆã‚‹é¸æŠžçš„ãªå¤‰æ›´ã®å–ã‚Šè¾¼ã¿ãªã©ã‚’ã€\n"
+"自由ã«è¡Œã£ã¦ãã ã•ã„。 変更作業ãŒå®Œäº†ã—ãŸãªã‚‰ã€ ``hg histedit --continue``\n"
+"を実行ã™ã‚‹ã“ã¨ã§ã€ 作業領域中ã®å¤‰æ›´å†…容ãŒã€ 変更後リビジョンã¨ã—ã¦ã€\n"
+"コミットã•ã‚Œã¾ã™ã€‚ ã“ã®éš›ã«ã€ コミットログã®å•ã„åˆã‚ã›ãŒã‚ã‚Šã¾ã™ãŒã€\n"
+"デフォルト値㯠``edit`` 対処リビジョンã®ã€ 元々ã®ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã®å†…容ã§ã™ã€‚"
+
+msgid ""
+"The ``message`` operation will give you a chance to revise a commit\n"
+"message without changing the contents. It's a shortcut for doing\n"
+"``edit`` immediately followed by `hg histedit --continue``."
+msgstr ""
+"``message`` æ“作ã¯ã€ 対象リビジョンã§ã®å¤‰æ›´å†…容ã¯ãã®ã¾ã¾ã«ã€\n"
+"コミットログã®ã¿ã‚’変更ã—ã¾ã™ã€‚ ã“れ㯠``edit`` æ“作を指定ã—ãŸä¸Šã§ã€\n"
+"コマンド入力ã«æˆ»ã£ã¦ã™ãã« ``hg histedit --continue`` を実施ã™ã‚‹ã®ã¨ã€\n"
+"å…¨ãåŒã˜æŒ™å‹•ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"If ``histedit`` encounters a conflict when moving a revision (while\n"
+"handling ``pick`` or ``fold``), it'll stop in a similar manner to\n"
+"``edit`` with the difference that it won't prompt you for a commit\n"
+"message when done. If you decide at this point that you don't like how\n"
+"much work it will be to rearrange history, or that you made a mistake,\n"
+"you can use ``hg histedit --abort`` to abandon the new changes you\n"
+"have made and return to the state before you attempted to edit your\n"
+"history."
+msgstr ""
+"履歴改変ã«ã‚ˆã‚‹è¡çªãŒ ``histedit`` ã«ã‚ˆã£ã¦ (``pick`` ã‚„ ``fold``\n"
+"æ“作ã«ãŠã„ã¦) 検出ã•ã‚ŒãŸå ´åˆã«ã€ 一旦コマンド入力ã«æˆ»ã‚‹ç‚¹ã¯ ``edit``\n"
+"æ“作ã¨åŒã˜ã§ã™ãŒã€ è¡çªè§£æ¶ˆä½œæ¥­ãŒå®Œäº†ã—㦠``hg histedit --continue``\n"
+"を実行ã—ã¦ã‚‚〠コミットログã®å•ã„åˆã‚ã›ãŒç„¡ã„点㯠``edit`` ã¨ç•°ãªã‚Šã¾ã™ã€‚\n"
+"ã“ã®æ™‚点ã§ã€ 履歴改変ã«ä¼´ã†ä½œæ¥­é‡ã®å•é¡Œã‚„〠間é•ã„ã«æ°—付ã„ãŸå ´åˆã¯ã€\n"
+"``hg histedit --abort`` 実行ã«ã‚ˆã£ã¦ã€ ã“ã‚Œã¾ã§ã®ä½œæ¥­æˆæžœãŒç ´æ£„ã•ã‚Œã€\n"
+"履歴ã¯æ”¹å¤‰å‰ã®çŠ¶æ…‹ã«æˆ»ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"If we clone the example repository above and add three more changes, such "
+"that\n"
+"we have the following history::"
+msgstr ""
+"上記ã®å®Ÿè¡Œä¾‹ã«ãŠã‘るリãƒã‚¸ãƒˆãƒªã‚’複製ã—〠ãã“ã§å±¥æ­´ã‚’3ã¤è¿½åŠ ã—ãŸçµæžœã€\n"
+"以下ã®æ§˜ãªå±¥æ­´ã«ãªã£ãŸã‚‚ã®ã¨ä»®å®šã—ã¾ã™::"
+
+msgid ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you run ``hg histedit --outgoing`` on the clone then it is the same\n"
+"as running ``hg histedit 836302820282``. If you need plan to push to a\n"
+"repository that Mercurial does not detect to be related to the source\n"
+"repo, you can add a ``--force`` option.\n"
+msgstr ""
+"複製『先ã€ã®ãƒªãƒã‚¸ãƒˆãƒªã§ ``hg histedit --outgoing`` を実行ã—ãŸå ´åˆã€\n"
+"``hg histedit 836302820282`` 実行ã¨åŒã˜çµæžœã¨ãªã‚Šã¾ã™ã€‚ Mercurial ãŒã€\n"
+"連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã¨ã®é–¢é€£æ€§ã‚’〠検出ã§ããªã„å ´åˆã§ã‚‚〠``--force``\n"
+"を指定ã™ã‚‹ã“ã¨ã§ã€ 元リãƒã‚¸ãƒˆãƒªã¨ã®é–¢é€£ã‚ã‚Šã¨ã¿ãªã™ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+
+msgid "cannot edit history that would orphan nodes"
+msgstr "履歴ツリーãŒåˆ†æ–­ã•ã‚Œã‚‹ã‚ˆã†ãªå±¥æ­´æ”¹å¤‰ã¯ã§ãã¾ã›ã‚“"
+
+msgid "can't edit history with merges"
+msgstr "マージã«é–¢ã‚る履歴ã®æ”¹å¤‰ã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: 空ã®ãƒªãƒ“ジョン"
+
+msgid "Fix up the change and run hg histedit --continue"
+msgstr "è¡çªè§£æ¶ˆå¾Œã« \"hg histedit --continue\" ã—ã¦ãã ã•ã„"
+
+msgid ""
+"Make changes as needed, you may commit or record as needed now.\n"
+"When you are finished, run hg histedit --continue to resume."
+msgstr ""
+"å¿…è¦ã«å¿œã˜ã¦å¤‰æ›´ï¼è¨˜éŒ²ã‚’è¡Œã£ã¦ãã ã•ã„。 作業ãŒå®Œäº†ã—ãŸãªã‚‰ã°ã€\n"
+"改変å†é–‹ã®ãŸã‚ã« hg histedit --continue を実行ã—ã¦ãã ã•ã„。"
+
+msgid "Read history edits from the specified file."
+msgstr "履歴改変手順を指定ファイルã‹ã‚‰èª­ã¿è¾¼ã¿"
+
+msgid "continue an edit already in progress"
+msgstr "中断ã•ã‚ŒãŸå±¥æ­´æ”¹å¤‰ã‚’å†é–‹"
+
+msgid "don't strip old nodes after edit is complete"
+msgstr "改変元ã®å±¥æ­´ã‚’改変完了後もä¿æŒ"
+
+msgid "abort an edit in progress"
+msgstr "進行中ã®å±¥æ­´æ”¹å¤‰ã‚’中止"
+
+msgid "changesets not found in destination"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«ã€ å«ã¾ã‚Œãªã„リビジョンを〠改変対象化"
+
+msgid "force outgoing even for unrelated repositories"
+msgstr "連æºå…ˆãŒç„¡é–¢ä¿‚ãªãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚〠比較を実施"
+
+msgid "first revision to be edited"
+msgstr "改変対象ã®æœ€åˆã®ãƒªãƒ“ジョン"
+
+msgid "[PARENT]"
+msgstr "[PARENT]"
+
+msgid ""
+"interactively edit changeset history\n"
+" "
+msgstr ""
+"対話的ãªå±¥æ­´ã®æ”¹å¤‰\n"
+" "
+
+msgid "source has mq patches applied"
+msgstr "元リãƒã‚¸ãƒˆãƒªã§ã¯ MQ パッãƒãŒé©ç”¨ä¸­ã§ã™"
+
+msgid "only one repo argument allowed with --outgoing"
+msgstr "--outgoing 指定時ã«ã¯ã€å¼•æ•°ã¯ï¼‘ã¤ã—ã‹æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "%s ã¨æ¯”較中\n"
+
+msgid "--force only allowed with --outgoing"
+msgstr "--outgoing 指定時ã®ã¿ --force を指定å¯èƒ½ã§ã™"
+
+msgid "no arguments allowed with --continue"
+msgstr "--continue 指定時ã¯å¼•æ•°ã‚’指定ã§ãã¾ã›ã‚“"
+
+msgid "no arguments allowed with --abort"
+msgstr "--abort 指定時ã¯å¼•æ•°ã‚’指定ã§ãã¾ã›ã‚“"
+
+msgid "history edit already in progress, try --continue or --abort"
+msgstr "履歴改変ã¯ç¶™ç¶šä¸­ã§ã™ã€‚ --continue ã¾ãŸã¯ --abort を指定ã—ã¦ãã ã•ã„"
+
+msgid "histedit requires exactly one parent revision"
+msgstr "履歴改変ã«ã¯å˜ä¸€ã®è¦ªãƒªãƒ“ジョンを指定ã—ã¦ãã ã•ã„"
+
+msgid "histedit: Should update metadata for the following changes:\n"
+msgstr "histedit: 以下ã®ãƒªãƒ“ジョンã®ãŸã‚ã«ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®æ›´æ–°ãŒå¿…è¦ã§ã™:\n"
+
+#, python-format
+msgid "histedit: %s to %s\n"
+msgstr "histedit: %s ã‹ã‚‰ %s ã¸\n"
+
+#, python-format
+msgid "histedit: moving bookmarks %s\n"
+msgstr "histedit: ブックマーク %s ã®ç§»å‹•ä¸­\n"
+
+msgid "must specify a rule for each changeset once"
+msgstr "1リビジョン毎ã«ï¼‘ã¤ã®ãƒ«ãƒ¼ãƒ«æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "malformed line \"%s\""
+msgstr "ä¸æ­£ãªè¡Œ \"%s\""
+
+msgid "may not use changesets other than the ones listed"
+msgstr "対象範囲以外ã®ãƒªãƒ“ジョンã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "unknown changeset %s listed"
+msgstr "未知ã®ãƒªãƒ“ジョン %s ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+#, python-format
+msgid "unknown action \"%s\""
+msgstr "未知ã®æ“作 \"%s\" ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr "Linux ã® inoitfy サービスã«ã‚ˆã‚‹çŠ¶æ…‹å ±å‘Šã®é«˜é€ŸåŒ–"
+
+msgid "start an inotify server for this repository"
+msgstr "リãƒã‚¸ãƒˆãƒªã«å¯¾ã™ã‚‹ inotify サーãƒã®èµ·å‹•"
+
+msgid "debugging information for inotify extension"
+msgstr "inotify エクステンションå‘ã‘デãƒãƒƒã‚°æƒ…å ±"
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+" inotify サーãƒã®ç›£è¦–対象ディレクトリを一覧表示ã—ã¾ã™ã€‚\n"
+" "
+
+msgid "directories being watched:\n"
+msgstr "監視対象ディレクトリ:\n"
+
+msgid "run server in background"
+msgstr "ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰ã§ã®ã‚µãƒ¼ãƒå®Ÿè¡Œ"
+
+msgid "used internally by daemon mode"
+msgstr "(ãƒãƒƒã‚¯ã‚°ãƒ©ã‚¦ãƒ³ãƒ‰å®Ÿè¡Œæ™‚ã§ã®å†…部用途å‘ã‘)"
+
+msgid "minutes to sit idle before exiting"
+msgstr "終了å‰ã®ã‚¢ã‚¤ãƒ‰ãƒªãƒ³ã‚°å¾…機時間(å˜ä½:分)"
+
+msgid "name of file to write process ID to"
+msgstr "プロセスIDã®æ›¸ã出ã—先ファイル"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [OPTION]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr "inotify-client:無効㪠inotify サーãƒã‚½ã‚±ãƒƒãƒˆã‚’検出ã—ãŸã®ã§å‰Šé™¤ã—ã¾ã™\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-client: inotify サーãƒã®èµ·å‹•ã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr "inotify-client: æ–°è¦ inotify サーãƒã¨ã®é€£æºã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-client: inotify サーãƒã¨ã®é€£æºã«å¤±æ•—: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-client: inotify サーãƒã‹ã‚‰ã®ç©ºå¿œç­”ã‚’å—ä¿¡"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr "(inotify: 互æ›æ€§ã®ç„¡ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d ã®ã‚µãƒ¼ãƒå¿œç­”ã‚’å—ç†)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: 想定外㮠'%s' 応答をå—ç†ã€‚ 想定応答㯠'%s')\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ inotify ã¯åˆ©ç”¨ã§ããªã„よã†ã«è¦‹ãˆã¾ã™"
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr "*** inotify ã®ãƒ¦ãƒ¼ã‚¶æ¯Žç›£è¦–対象上é™æ•°ã¯ %s\n"
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr "*** ã“ã®ä¸Šé™ã¯ä½œæ¥­é ˜åŸŸã®å…¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ç›£è¦–ã«ã¯å°‘ãªã™ãŽã¾ã™\n"
+
+msgid "*** counting directories: "
+msgstr "*** ディレクトリã®è¨ˆä¸Šä¸­: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "%d 個ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’検出\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr "*** 上é™ã‚’ %d ã‹ã‚‰ %d ã«ä¸Šã’ã¦ãã ã•ã„(root 権é™ãŒå¿…è¦):\n"
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr "inotify ã®ç›£è¦–対象上é™ãŒä¸ŠãŒã‚‹ã¾ã§ã¯ %s を監視ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "inotify サービスãŒä½¿ç”¨ã§ãã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "%r を監視\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "%r é…下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’監視\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "%s: %s を作æˆ\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "%s: %s を削除\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "%s: %s を変更\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "%s ã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ãŒæœªãƒžã‚¦ãƒ³ãƒˆã§ã™\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s: 読ã¿è¾¼ã¿å¯èƒ½: %d ãƒã‚¤ãƒˆ\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr "%s: 閾値未満 - ロック解放\n"
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr "%s: %d 個ã®ã‚¤ãƒ™ãƒ³ãƒˆèª­ã¿è¾¼ã¿ä¸­\n"
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr "%s: 読ã¿è¾¼ã¿å¯èƒ½ãª %d ãƒã‚¤ãƒˆã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—をフック\n"
+
+msgid "finished setup\n"
+msgstr "セットアップを終了ã—ã¾ã—ãŸ\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "status: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ".hgignore 変更ã«ä»˜ãå†èµ°æŸ»ä¸­\n"
+
+msgid "cannot start: socket is already bound"
+msgstr "ソケットãŒæ—¢ã«ãƒã‚¤ãƒ³ãƒ‰ã•ã‚Œã¦ã„ã‚‹ãŸã‚開始ã§ãã¾ã›ã‚“"
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+"一時ソケットã«ä½¿ç”¨ã™ã‚‹ .hg/inotify.sock ãŒæ—¢ã«å­˜åœ¨ã™ã‚‹ãŸã‚開始ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr "%r ã¸ã®å•ã„åˆã‚ã›ã«è¿”答中\n"
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr "互æ›æ€§ã®ç„¡ã„クライアントãƒãƒ¼ã‚¸ãƒ§ãƒ³ %d ã‹ã‚‰ã®å•ã„åˆã‚ã›ã‚’å—ä¿¡\n"
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "未知ã®å•ã„åˆã‚ã›ç¨®åˆ¥: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr "コミットログ中ã®è¨˜è¿°ã®å±•é–‹"
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+"本エクステンションã¯ã€ リンクãªã‚Šä»»æ„ã®å¼ã®å½¢å¼ã¸ã¨è‡ªå‹•çš„ã«å¤‰æ›ã•ã‚Œã‚‹\n"
+"InterWiki ã®ã‚ˆã†ãªç‰¹åˆ¥ãªæ›¸å¼ã‚’用ã„ãŸã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã®è¨˜è¿°ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚"
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+"ãƒã‚°ç®¡ç†ã‚·ã‚¹ãƒ†ãƒ ã¨ã®é€£æºã§ä½¿ç”¨ã•ã‚Œã‚‹ã‚ˆã†ãªãƒ‘ターンを設定ファイルã§\n"
+"記述ã™ã‚‹ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr "interhg: %s ã®ãƒ‘ターンãŒä¸æ­£ã§ã™: %s\n"
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr "interhg: %s ã®æ­£è¦è¡¨ç¾ãŒä¸æ­£ã§ã™: %s\n"
+
+msgid "expand keywords in tracked files"
+msgstr "構æˆç®¡ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹"
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+"本エクステンションã¯ã€ 構æˆç®¡ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã® RCS/CVS çš„\n"
+"(カスタマイズå¯èƒ½)㪠$Keywords$ を〠設定ファイルã§ã®è¨˜è¿°ã«å¾“ã„\n"
+"展開ã—ã¾ã™ã€‚"
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+"キーワード展開ã¯ä½œæ¥­é ˜åŸŸã§ã®ã¿è¡Œã‚れ〠履歴ã«ã¯æ®‹ã‚Šã¾ã›ã‚“。\n"
+"ã“ã®ä»•çµ„ã¿ã¯ç¾è¡Œãƒ¦ãƒ¼ã‚¶ã‚„アーカイブé…布者ã«é…æ…®ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+"作業領域ã®å„ファイルã«å¯¾ã™ã‚‹ç›´è¿‘ã®æ›´æ–°å†…容を使用ã—ã¦ã€\n"
+"キーワードã®å±•é–‹ãŒè¡Œã‚ã‚Œã¾ã™"
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+"設定ã¯ã€ 設定ファイル中㮠[keyword] [keywordset] ãŠã‚ˆã³ [keywordmaps]\n"
+"セクションã«è¨˜è¿°ã—ã¾ã™ã€‚"
+
+msgid "Example::"
+msgstr "記述例::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+" [keyword]\n"
+" # \"x*\" ã«åˆè‡´ã€Œã—ãªã„〠python ファイルã§ã®ã¿ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹\n"
+" **.py =\n"
+" x* = ignore"
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+" [keywordset]\n"
+" # CVS çš„ãªã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹ã‚ˆã‚Šã‚‚ SVN çš„ãªã‚‚ã®ã‚’é¸æŠž\n"
+" svn = True"
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+".. note::\n"
+" ファイルåパターンãŒæ›´ã«ç‰¹æ®Šã«ãªã‚‹å ´åˆã€\n"
+" リãƒã‚¸ãƒˆãƒªã‚µã‚¤ã‚ºæ¬¡ç¬¬ã§ã¯æ€§èƒ½åŠ£åŒ–ãŒç”Ÿã˜å¾—ã¾ã™ã€‚"
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+"[keywordmaps] ã§ã®ãƒ†ãƒ³ãƒ—レート設定ã®å±•é–‹ã‚’実演ã™ã‚‹ã«ã¯ã€ :hg:`kwdemo`\n"
+"を実行ã—ã¾ã™ã€‚ 使用å¯èƒ½ãªãƒ†ãƒ³ãƒ—レートやフィルタã«é–¢ã—ã¦ã¯\n"
+":hg:`help templates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "Three additional date template filters are provided:"
+msgstr "テンプレートã§ã®æ—¥æ™‚用フィルタ㌠3 ã¤è¿½åŠ ã•ã‚Œã¾ã™:"
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+"無指定時ã®ãƒ†ãƒ³ãƒ—レート設定 (:hg:`kwdemo -d` ã§é–²è¦§å¯èƒ½) ã¯ã€\n"
+"キーワードåŠã³ãƒ†ãƒ³ãƒ—レートã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ã€ ç½®ãæ›ãˆã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚\n"
+"ç¹°ã‚Šè¿”ã—ã¾ã™ãŒã€ 設定変更ã®ç¢ºèªã¯ :hg:`kwdemo` ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+"展開済ã¿ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã®ã€ æ„図ã›ã¬å±¥æ­´ã¸ã®è¨˜éŒ²ã‚’防ããŸã‚ã«ã€\n"
+"キーワード展開ã®è¨­å®šå¤‰æ›´/無効化ã®å‰ã«ã¯ã€\n"
+"å¿…ãš :hg:`kwshrink` を実行ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+"キーワードã®è¨­å®šå¤‰æ›´/有効化後ã«ã€ 強制的ã«å±•é–‹ã™ã‚‹å ´åˆã¯ :hg:`kwexpand`\n"
+"を実行ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+"複数行ã«æ¸¡ã‚‹å±•é–‹ã‚„〠CVS ã® $Log$ ã®ã‚ˆã†ãªå¢—加ã™ã‚‹å†…容ã®å±•é–‹ã¯\n"
+"未サãƒãƒ¼ãƒˆã§ã™ã€‚ キーワードテンプレート設定 \"Log = {desc}\" ã¯ã€\n"
+"コミットメッセージã®æœ€åˆã®ä¸€è¡Œã‚’埋ã‚è¾¼ã¿ã¾ã™ã€‚\n"
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "キーワード置æ›ã§ %s を上書ã\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr "キーワード置æ›ã§ %s を上書ã\n"
+
+msgid "[keyword] patterns cannot match"
+msgstr "[keyword] パターンãŒåˆè‡´ã—ã¾ã›ã‚“"
+
+msgid "no [keyword] patterns configured"
+msgstr "[keyword] ã§ã®ãƒ‘ターン設定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "show default keyword template maps"
+msgstr "デフォルトã®ãƒ†ãƒ³ãƒ—レートマップã§è¡¨ç¤º"
+
+msgid "read maps from rcfile"
+msgstr "設定ファイルã‹ã‚‰ã®ãƒžãƒƒãƒ—設定ã®èª­ã¿è¾¼ã¿"
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr "[keywordmaps] ã§ã®è¨­å®šå†…容ãŠã‚ˆã³å±•é–‹ä¾‹ã®è¡¨ç¤º"
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+" ç¾æ™‚点〠固有ãªã„ã—デフォルトã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãƒ†ãƒ³ãƒ—レートマップã€\n"
+" ãŠã‚ˆã³ãã®å±•é–‹ä¾‹ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+" 引数ã§ã®ãƒžãƒƒãƒ—指定や〠-f/--rcfile 指定ã«ã‚ˆã‚‹å¤–部設定ファイルã‹ã‚‰ã®\n"
+" 読ã¿è¾¼ã¿ã«ã‚ˆã‚Šã€ ç¾æ™‚点ã§ã®è¨­å®šã‚’æ‹¡å¼µã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+" -d/--default 指定ã«ã‚ˆã‚Šã€ ç¾æ™‚点ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãƒ†ãƒ³ãƒ—レート設定を\n"
+" 一時的ã«ç„¡åŠ¹åŒ–ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" テンプレートやフィルタ機能ã«é–¢ã—ã¦ã¯ :hg:`help templates`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "一時リãƒã‚¸ãƒˆãƒª %s ã®ä½œæˆä¸­\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+"\n"
+"\t固有キーワードテンプレートマップ設定を使用\n"
+
+msgid "\textending current template maps\n"
+msgstr "\tç¾è¡Œãƒ†ãƒ³ãƒ—レートマップã®çµ‚了\n"
+
+msgid "\toverriding default svn keywordset\n"
+msgstr "\tsvn ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’上書ã\n"
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\tcvs ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’上書ã\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+"\n"
+"\tsvn ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰è¨­å®šã‚’使用\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+"\n"
+"\tcvs ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰è¨­å®šã‚’使用\n"
+
+msgid "\tdisabling current template maps\n"
+msgstr "\tç¾è¡Œã®ãƒ†ãƒ³ãƒ—レートマップを無効化\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+"\n"
+"\tç¾è¡Œã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãƒ†ãƒ³ãƒ—レートマップを使用\n"
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+"\n"
+"キーワードを %s ã«æ›¸ãè¾¼ã¿ã¾ã—ãŸ:\n"
+
+msgid "hg keyword configuration and expansion example"
+msgstr "keyword エクステンションã®è¨­å®šï¼å±•é–‹ã®ä¾‹"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+"\n"
+"\tキーワードを展開\n"
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [OPTION]... [FILE]..."
+
+msgid "expand keywords in the working directory"
+msgstr "作業領域ã«ãŠã‘るキーワードã®å±•é–‹"
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr " キーワード埋ã‚è¾¼ã¿ãŒ(å†)有効化ã•ã‚Œã¦ã‹ã‚‰å®Ÿè¡Œã—ã¦ãã ã•ã„。"
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã€ 実行ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "show keyword status flags of all files"
+msgstr "全ファイルã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹è¨­å®šã‚’表示"
+
+msgid "show files excluded from expansion"
+msgstr "キーワード展開対象外ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "only show unknown (not tracked) files"
+msgstr "構æˆç®¡ç†å¯¾è±¡å¤–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [OPTION]... [FILE]..."
+
+msgid "show files configured for keyword expansion"
+msgstr "キーワード展開対象ファイルã®è¡¨ç¤º"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+" 作業領域中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã€ [keyword] 設定ã§ã®ãƒ‘ターンã«åˆè‡´ã™ã‚‹\n"
+" ファイルã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+" 予期ã›ã¬ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹ã®é˜²æ­¢ã¨ã€ 実行性能å‘上ã®ãŸã‚ã«ã€ 実際ã®\n"
+" 埋ã‚è¾¼ã¿å¯¾è±¡ã¨ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ã‚’設定ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+" パターンåˆè‡´ã«é–¢ã™ã‚‹è©³ç´°ã¯ã€ :hg:`help keyword` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+" -a/--all ãŠã‚ˆã³ -v/--verbose 指定ã®ã‚ã‚‹å ´åˆã€ å„ファイルã®çŠ¶æ³ã¯\n"
+" 以下ã®è¨˜å·ã§è¡¨ç¾ã•ã‚Œã¾ã™::"
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+" K = キーワード展開候補\n"
+" k = キーワード展開候補(構æˆç®¡ç†å¯¾è±¡å¤–)\n"
+" I = 無視\n"
+" i = 無視(構æˆç®¡ç†å¯¾è±¡å¤–)\n"
+" "
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [OPTION]... [FILE]..."
+
+msgid "revert expanded keywords in the working directory"
+msgstr "作業領域中ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å±•é–‹ã®å–り消ã—"
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+" キーワード展開ã®è¨­å®šå¤‰æ›´ï¼ç„¡åŠ¹åŒ–ã®å‰ã«ã€\n"
+" å¿…ãšå®Ÿæ–½ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã€ 実行ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "track large binary files"
+msgstr "大容é‡ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®ç®¡ç†"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+"大容é‡ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®å–り扱ã„ã¯ã€ 圧縮〠差分å–得〠マージã®ç‚¹ã§ã€\n"
+"éžå¸¸ã«é›£ã—ã„ã§ã™ã€‚ ãƒã‚¤ãƒŠãƒªå·®åˆ†ã®åœ§ç¸®ã‚’ベースã«ã—㟠Mercurial ã®æ ¼ç´å½¢å¼\n"
+"(revlog å½¢å¼) ã§ãã®ã‚ˆã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚’扱ã†ã®ã¯ã€ 効率ãŒè‰¯ãã‚ã‚Šã¾ã›ã‚“:\n"
+"大容é‡ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã‚’〠通常ファイルã¨åŒæ§˜ã«æ ¼ç´ã—ãŸå ´åˆã€ \n"
+"転é€å¸¯åŸŸã‚„ã€ãƒ‡ã‚£ã‚¹ã‚¯ï¼ãƒ¡ãƒ¢ãƒªã®æ¶ˆè²»é‡ã‚’増加ã•ã›ã¦ã—ã¾ã„ã¾ã™ã€‚\n"
+"largefiles エクステンションã¯ã€ Mercurial ã®ä»•çµ„ã¿ã®ä¸Šã«ã€ クライアント/\n"
+"サーãƒçš„ãªã€ 中央集約的ãªæ©Ÿèƒ½ã‚’追加ã™ã‚‹ã“ã¨ã§ã€ ã“ã®å•é¡Œã«å¯¾å‡¦ã—ã¾ã™:\n"
+"大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã® *中央格ç´é ˜åŸŸ* ã§ä¿æŒã•ã‚Œã€\n"
+"リビジョンå‚照時ã«å¿…è¦ã¨ãªã£ãŸæ™‚点ã§ã€ å¿…è¦ãªç‰ˆã ã‘ãŒå–å¾—ã•ã‚Œã¾ã™ã€‚\n"
+"(※ 訳注: 「中央格ç´é ˜åŸŸã€ (central store) ã¯ã€ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã«1ã¤ã ã‘ã€\n"
+"ã¨é™å®šã•ã‚Œã¦ã„ã‚‹ã‚ã‘ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 通常㮠Mercurial リãƒã‚¸ãƒˆãƒªåŒæ§˜ã€\n"
+"åŒä¸€ã®å¤§å®¹é‡ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã‚’〠複数ã®å ´æ‰€ã«æ ¼ç´ã•ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+"「中央ã€ã¨ã„ã†ã®ã¯ã€ ã‚ãã¾ã§èª¬æ˜Žã®ä¾¿å®œä¸Šã®è¡¨ç¾ã«éŽãŽã¾ã›ã‚“)"
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+"largefiles エクステンションã¯ã€ å„大容é‡ãƒ•ã‚¡ã‚¤ãƒ«æ¯Žã® \"代ç†ãƒ•ã‚¡ã‚¤ãƒ«\"\n"
+"(standin file) を〠.hglf/ é…下ã§ç®¡ç†ã™ã‚‹ã“ã¨ã§æ©Ÿèƒ½ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚\n"
+"代ç†ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ Mercurial 管ç†ä¸‹ã«ç½®ã‹ã‚ŒãŸã€ å°å®¹é‡ (41 ãƒã‚¤ãƒˆ: SHA-1\n"
+"ã¨æ”¹è¡Œæ–‡å­—) ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™ã€‚ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容ã‹ã‚‰ç®—出ã•ã‚ŒãŸ SHA-1\n"
+"ãƒãƒƒã‚·ãƒ¥å€¤ãŒä»£ç†ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã•ã‚Œã€ ファイル自身ã®ãƒªãƒ“ジョン識別ã«ã¯ã€\n"
+"ã“ã®ãƒãƒƒã‚·ãƒ¥å€¤ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ largefiles エクステンションãŒã€\n"
+"中央格ç´é ˜åŸŸã¨ã®é–“ã§ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®æŽˆå—ã‚’è¡Œã†å ´åˆã€ ID ã¨ã—ã¦ã€\n"
+"ã“ã®ãƒãƒƒã‚·ãƒ¥å€¤ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ã“ã®æ–¹å¼ã§ã¯ã€ リãƒã‚¸ãƒˆãƒªã®è¤‡è£½ã‚„ã€\n"
+"履歴ã®å–ã‚Šè¾¼ã¿ã®éš›ã«ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã—ã¦ã¯ã€\n"
+"履歴ã®å…¨ã¦ã‚’å–å¾—ã›ãšã«æ¸ˆã‚€ãŸã‚〠転é€å¸¯åŸŸã‚„ディスクã®æ¶ˆè²»ãŒä½Žæ¸›ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+"æ–°è¦ã«å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加登録ã™ã‚‹å ´åˆã¯ã€ 以下ã®ä¾‹ã®ã‚ˆã†ã«ã€:hg:`add`\n"
+"ã«å¯¾ã—㦠--large を指定ã—ã¾ã™::"
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m '大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ä¹±æ•°ãƒ‡ãƒ¼ã‚¿ã‚’追加'"
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+"連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å映ã—よã†ã¨ã™ã‚‹ãƒªãƒ“ジョンãŒã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€\n"
+"追加ï¼æ”¹å¤‰ã‚’実施ã—ã¦ã„ã‚‹å ´åˆã€ 該当ã™ã‚‹ãƒªãƒ“ジョンã®å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€\n"
+"連æºå…ˆã«è»¢é€ã•ã‚Œã¾ã™ã€‚ ã“ã®éš›ã€ 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã§ç¨¼å‹•ã™ã‚‹ Mercurial ã¯ã€\n"
+"largefiles エクステンションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+"連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰å–ã‚Šè¾¼ã¾ã‚Œã‚‹ãƒªãƒ“ジョンãŒã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€\n"
+"影響ã®ã‚ã‚‹ã‚‚ã®ã§ã‚ã‚‹å ´åˆã€ Mercurial ã®æŒ™å‹•ã¯é€šå¸¸ã¨å¤‰ã‚ã‚Šã¾ã›ã‚“。\n"
+"但ã—〠当該リビジョンã§ã®ä½œæ¥­é ˜åŸŸæ›´æ–°ã®éš›ã«ã€ å¿…è¦ãªå¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€\n"
+"転é€ï¼ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¾ã™ (事å‰å…¥æ‰‹ã•ã‚Œã¦ã„ãªã„å ´åˆã®ã¿)。 ãã®ãŸã‚ã€\n"
+"ã“ã‚Œã¾ã§ :hg:`update` 対象ã«ãªã£ã¦ã„ãªã„リビジョンを使用ã™ã‚‹éš›ã«ã¯ã€\n"
+"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’å¿…è¦ã¨ã™ã‚‹å¯èƒ½æ€§ãŒç”Ÿã˜ã¾ã™ã€‚"
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+"largefiles エクステンション無ã—ã§ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’〠既㫠Mercurial\n"
+"ã§æ§‹æˆç®¡ç†ã—ã¦ã„ã‚‹å ´åˆã€ largefiles ã®æ©æµã‚’å—ã‘ã‚‹ãŸã‚ã«ã¯ã€\n"
+"リãƒã‚¸ãƒˆãƒªã®å¤‰æ›ãŒå¿…è¦ã§ã™ã€‚ 変æ›ã¯ :hg:`lfconvert` コマンドã§å®Ÿæ–½ã—ã¾ã™::"
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr " $ hg lfconvert --size 10 旧リãƒã‚¸ãƒˆãƒª 変æ›å¾Œãƒªãƒã‚¸ãƒˆãƒª"
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+"æ—¢ã«å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’管ç†ã—ã¦ã„るリãƒã‚¸ãƒˆãƒªã§ã¯ã€ ファイルサイズãŒ\n"
+"10MB 以上ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ ç™»éŒ²ã¯ã€ 自動的ã«å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+"ã“ã®é–¾å€¤ã¯ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã¿ãªã™æœ€å°ã®ã‚µã‚¤ã‚º (å˜ä½: MB) を〠Mercurial\n"
+"ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã„㦠``largefiles.minsize`` ã«è¨­å®šã™ã‚‹ã‹ã€ :hg:`add`\n"
+"ã«å¯¾ã—㦠--lfsize ã§æŒ‡å®šã™ã‚‹ã“ã¨ã§ã€ 変更ã§ãã¾ã™ã€‚::"
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+" [largefiles]\n"
+" minsize = 2"
+
+msgid " $ hg add --lfsize 2"
+msgstr " $ hg add --lfsize 2"
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+"``largefiles.patterns`` を指定ã™ã‚‹ã“ã¨ã§ã€ 特定パターンã®ãƒ•ã‚¡ã‚¤ãƒ«å\n"
+"(:hg:`help patterns` å‚ç…§) を〠常ã«å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã¿ãªã›ã¾ã™::"
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size."
+msgstr ""
+"パターンã«åˆè‡´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加登録ã™ã‚‹éš›ã«ã¯ã€ã‚µã‚¤ã‚ºã«é–¢ã‚ã‚Šãªãã€\n"
+"大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+"管ç†ä¸‹ã«å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ãŒ1ã¤ã‚‚ç„¡ã„リãƒã‚¸ãƒˆãƒªã§ã¯ã€ ``largefiles.minsize``\n"
+"ãŠã‚ˆã³ ``largefiles.patterns`` ã®è¨­å®šã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ ãã®ãŸã‚ã€\n"
+"最åˆã®å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加登録ã™ã‚‹éš›ã«ã¯ã€ :hg:`add` ã«æ˜Žç¤ºçš„ã« --large \n"
+"を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "既存リãƒã‚¸ãƒˆãƒªã‹ã‚‰ largefiles を利用ã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+" リãƒã‚¸ãƒˆãƒª SOURCE を変æ›ã—〠新è¦ãƒªãƒã‚¸ãƒˆãƒª DEST を生æˆã—ã¾ã™ã€‚\n"
+" SOURCE ã«å¯¾ã™ã‚‹ DEST ã®é•ã„ã¯ã€ 指定パターンã¸ã®åå‰ã®åˆè‡´ã€ ãªã„ã—ã€\n"
+" 指定閾値以上ã®ã‚µã‚¤ã‚ºã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«æ‰±ã„ã«ãªã£ã¦ã„ã‚‹ã€\n"
+" ã¨ã„ã†ç‚¹ã§ã™ã€‚ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«æ‰±ã„ã®è¦å¦åˆ¤å®šã«ä½¿ç”¨ã™ã‚‹ã‚µã‚¤ã‚ºå€¤ã«ã¯ã€\n"
+" å„ファイルãŒæœ€åˆã«ç™»éŒ²ã•ã‚ŒãŸæ™‚点ã®ã‚µã‚¤ã‚ºãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" サイズ閾値ã®æŒ‡å®šã¯ã€ --size ã‹ã€ ``largefiles.size``\n"
+" 設定ã«ã‚ˆã£ã¦è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+" ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿæ–½å¾Œã¯ã€ 変æ›å¾Œãƒªãƒã‚¸ãƒˆãƒªã®é€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚ã€\n"
+" largefiles エクステンションãŒæœ‰åŠ¹ã«ãªã£ã¦ã„る事を確èªã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+" largefiles エクステンションを使用ã—ãªã„リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›ã«ã¯ã€\n"
+" --to-normal を指定ã—ã¾ã™ã€‚ 変æ›å¾Œãƒªãƒã‚¸ãƒˆãƒªã¯ã€ largefiles\n"
+" エクステンション無ã—ã§ã‚‚使用ã§ãã¾ã™ã€‚"
+
+msgid "getting largefiles"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å–得中"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "ファイル %s ã®å–得中:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: データ破æを検出 (想定ãƒãƒƒã‚·ãƒ¥å€¤ %s ã«å¯¾ã—㦠%s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®ãŸã‚ã« %d 個ã®ãƒªãƒ“ジョンを検索中\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr "%d 個ã®ãƒªãƒ“ジョン㧠%d 個ã®å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容を検証\n"
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr "%d 個ã®ãƒªãƒ“ジョン㧠%d 個ã®å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å­˜åœ¨ã‚’検証\n"
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "%r ã¯æœªã‚µãƒãƒ¼ãƒˆãª URL å½¢å¼ã§ã™"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "%s 㯠largefiles 対応ã¨ã¯æ€ã‚ã‚Œã¾ã›ã‚“"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã® Mercurial リãƒã‚¸ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "変æ›å…ˆãƒªãƒã‚¸ãƒˆãƒª %s ã®åˆæœŸåŒ–中\n"
+
+msgid "converting revisions"
+msgstr "リビジョンã®å¤‰æ›ä¸­"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr "改åï¼è¤‡è£½å¯¾è±¡ã®å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ãŒã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯åŒ–ã•ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ãŒã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯åŒ–ã•ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "skipping incorrectly formatted tag %s\n"
+msgstr "ä¸æ­£ãªå½¢å¼ã®ã‚¿ã‚° %s を無視\n"
+
+#, python-format
+msgid "skipping incorrectly formatted id %s\n"
+msgstr "ä¸æ­£ãªå½¢å¼ã® ID %s を無視\n"
+
+#, python-format
+msgid "no mapping for id %s\n"
+msgstr "ID %s ã¯æœªçŸ¥ã®å€¤ã§ã™\n"
+
+msgid "uploading largefiles"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®è»¢é€ä¸­"
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ãŒä¸åœ¨ã§ã™ (連æºå…ˆã¸è»¢é€ã§ãã¾ã›ã‚“)"
+
+#, python-format
+msgid "%d additional largefiles cached\n"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %d 個を追加å–å¾—\n"
+
+#, python-format
+msgid "%d largefiles failed to download\n"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %d 個ã®å–å¾—ã«å¤±æ•—\n"
+
+msgid "getting changed largefiles\n"
+msgstr "æ›´æ–°ã•ã‚ŒãŸå¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å–得中\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›´æ–°æ•° %d〠削除数 %d\n"
+
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ãŠã‚‰ãšã€ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã‚‚ã§ãã¾ã›ã‚“"
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«åŒ–ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å°ã‚µã‚¤ã‚º (MB)"
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ä½¿ç”¨ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰é€šå¸¸ãƒªãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›"
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert SOURCE DEST [FILE ...]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr "largefiles: サイズã¯æ•°å€¤ã§æŒ‡å®šã—ã¦ãã ã•ã„ (%s ã¯ä¸æ­£ã§ã™)\n"
+
+msgid "minimum size for largefiles must be specified"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®æœ€å°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "未知㮠OS ã§ã™: %s\n"
+
+#, python-format
+msgid "found %s in store\n"
+msgstr "%s ã¯ãƒªãƒã‚¸ãƒˆãƒªã«å–得済ã¿\n"
+
+#, python-format
+msgid "found %s in system cache\n"
+msgstr "%s ã¯ã‚·ã‚¹ãƒ†ãƒ ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã«å–得済ã¿\n"
+
+msgid "can't get file locally"
+msgstr "ファイルãŒæ‰‹å…ƒã«ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+"リビジョン %s: %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+" (ãƒãƒƒã‚·ãƒ¥å€¤ %s を想定)\n"
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+"リビジョン %s: %s ã®å†…容ãŒç•°ãªã‚Šã¾ã™\n"
+" (%s:\n"
+" 想定ãƒãƒƒã‚·ãƒ¥å€¤ %s ã«å¯¾ã—ã¦\n"
+" 実際ã®ãƒãƒƒã‚·ãƒ¥å€¤ã¯ %s)\n"
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s ã¯å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦ç™»éŒ²æ¸ˆã§ã™\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "%s を大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦è¿½åŠ ç™»éŒ²ä¸­\n"
+
+msgid "no files specified"
+msgstr "ファイルå指定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "not removing %s: %s (use forget to undo)\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: %s (å–り消ã—機能㯠forget)\n"
+
+msgid "file still exists"
+msgstr "ファイルã¯ç¶­æŒã•ã‚Œã¾ã™"
+
+msgid "file is modified"
+msgstr "ファイルã¯æ”¹å¤‰ã•ã‚Œã¦ã„ã¾ã™"
+
+msgid "file has been marked for add"
+msgstr "追加登録予定ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "%s を登録除外中\n"
+
+msgid "--normal cannot be used with --large"
+msgstr "--normal 㨠--large ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "uncommitted local changes"
+msgstr "作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "&Largefile"
+msgstr "&Largefile"
+
+msgid "&Normal file"
+msgstr "&Normal file"
+
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+"ファイル %s ãŒå¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã©ã¡ã‚‰ã®å½¢å¼ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 大容é‡:(l)argefile 通常:(n)ormal file"
+
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+"ファイル %s ãŒé€šå¸¸ãƒ•ã‚¡ã‚¤ãƒ«åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"ã©ã¡ã‚‰ã®å½¢å¼ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 大容é‡:(l)argefile 通常:(n)ormal file"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "%s 㨠%s ã‚’ %s ã«ãƒžãƒ¼ã‚¸ä¸­\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "%s をマージ中\n"
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+"大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ã®ãƒžãƒ¼ã‚¸ã§è¡çªãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸã€‚\n"
+"ã©ã¡ã‚‰ã®å†…容を採用ã—ã¾ã™ã‹ï¼Ÿ 作業領域:(l)ocal マージ対象:(o)ther"
+
+msgid "&Local"
+msgstr "&Local"
+
+msgid "&Other"
+msgstr "&Other"
+
+msgid "no files to copy"
+msgstr "コピーã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "destination largefile already exists"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®è¤‡è£½å…ˆã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "caching new largefiles\n"
+msgstr "æ›´æ–°ã•ã‚ŒãŸå¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ä¸­\n"
+
+#, python-format
+msgid "%d largefiles cached\n"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %d 個をキャッシュ\n"
+
+#, python-format
+msgid "--all-largefiles is incompatible with non-local destination %s"
+msgstr "éžãƒ­ãƒ¼ã‚«ãƒ«ãªãƒªãƒã‚¸ãƒˆãƒª %s ã§ã¯ --all-largefiles を指定ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "未知ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–種別 '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "アーカイブã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’追加ã™ã‚‹ã¨ãã¯æŽ¥é ­è¾žã‚’指定ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "largefile %s not found in repo store or system cache"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ãŒãƒªãƒã‚¸ãƒˆãƒªã«ã‚‚システムキャッシュã«ã‚‚ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: ファイルã¯æ—¢ã«æœªç™»éŒ²ã§ã™\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr "largefiles: 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+msgid "largefiles to upload:\n"
+msgstr "転é€äºˆå®šå¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«:\n"
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr "largefiles: 転é€äºˆå®šãƒ•ã‚¡ã‚¤ãƒ«æ•° %d\n"
+
+msgid "largefile contents do not match hash"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容ãŒæƒ³å®šãƒãƒƒã‚·ãƒ¥å€¤ã¨ä¸€è‡´ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "largefiles: failed to put %s into store: %s"
+msgstr "largefiles: ファイル %s ã®æ ¼ç´ã«å¤±æ•—: %s"
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ã¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "remote: "
+msgstr "連æºå…ˆ: "
+
+#, python-format
+msgid "unexpected putlfile response: %s"
+msgstr "想定外㮠putlfile 応答: %s"
+
+msgid "putlfile failed:"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®è»¢é€ã«å¤±æ•—:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®è»¢é€ã«å¤±æ•— (未知ã®å¿œç­”):"
+
+msgid "unexpected response:"
+msgstr "未知ã®å¿œç­”:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr "remotestore: %s を連æºå…ˆ %s ã«æ ¼ç´ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr "remotestore: %s を連æºå…ˆ %s ã«æ ¼ç´"
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "remotestore: ファイル %s ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr "remotestore: 大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ã¯ç„¡åŠ¹ã§ã™"
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr "remotestore: 大容é‡ãƒ•ã‚¡ã‚¤ãƒ« %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "リビジョン %s: %s: 内容ãŒç•°ãªã‚Šã¾ã™\n"
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "リビジョン %s: ファイル %s ãŒä¸åœ¨ã§ã™\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+"largefiles: ä»–ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ãŒ %r 機能を書ãæ›ãˆã¦ã„る模様ã§ã™:"
+"largefiles ãŒæƒ³å®šå¤–ã®æŒ™å‹•ã‚’ã™ã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™\n"
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr "\"%s\" ã¯å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®ä»£ç†ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™"
+
+msgid "add as largefile"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦è¿½åŠ "
+
+msgid "add as normal file"
+msgstr "通常ファイルã¨ã—ã¦è¿½åŠ "
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+"指定サイズ (å˜ä½:MB) 以上ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’〠大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã¨ã—ã¦è¿½åŠ  (既定値:10)"
+
+msgid "verify largefiles"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’検証"
+
+msgid "verify all revisions of largefiles not just current"
+msgstr "ç¾ãƒªãƒ“ジョン以外ã§ã‚‚〠大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã™ã‚‹æ¤œè¨¼ã‚’実施"
+
+msgid "verify largefile contents not just existence"
+msgstr "大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã®å­˜åœ¨ç¢ºèªä»¥å¤–ã«ã€ 内容ã®æ¤œè¨¼ã‚‚実施"
+
+msgid "display outgoing largefiles"
+msgstr "転é€å¯¾è±¡å¤§å®¹é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "download all pulled versions of largefiles"
+msgstr "å–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンã«ãŠã„ã¦ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å…¨ã¦å–å¾—"
+
+msgid "download all versions of all largefiles"
+msgstr "全リビジョンã«ãŠã„ã¦ã€ 大容é‡ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å…¨ã¦å–å¾—"
+
+msgid "manage a stack of patches"
+msgstr "パッãƒä½µç”¨ã®ç®¡ç†"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"本エクステンションã¯ã€ Mercurial リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã«ãŠã„ã¦ã€ パッãƒã‚’\n"
+"併用ã—ãŸä½œæ¥­ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚ 本エクステンションã§ã¯ã€ 「既知ã®ãƒ‘ッãƒã€ã¨\n"
+"「é©ç”¨ä¸­ã®ãƒ‘ッãƒã€(「既知ã®ãƒ‘ッãƒã€ã®éƒ¨åˆ†é›†åˆ)ã®2ã¤ã®é›†åˆã‚’〠スタック\n"
+"を用ã„ã¦ç®¡ç†ã—ã¾ã™ã€‚"
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"「既知ã®ãƒ‘ッãƒã€ã¯ã€ .hg/patches ディレクトリé…下ã«ç½®ã‹ã‚ŒãŸãƒ‘ッãƒãƒ•ã‚¡ã‚¤ãƒ«\n"
+"ã«ç›¸å½“ã—ã¾ã™ã€‚ 「é©ç”¨ä¸­ã®ãƒ‘ッãƒã€ã¯ã€ 「既知ã®ãƒ‘ッãƒã€ã®ã†ã¡ã€ 対応ã™ã‚‹\n"
+"リビジョンãŒãƒªãƒã‚¸ãƒˆãƒªã®å±¥æ­´ã«(一時的ã«)記録ã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã‚’指ã—ã¾ã™ã€‚"
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "良ã使用ã•ã‚Œã‚‹æ©Ÿèƒ½ (詳細㯠:hg:`help コマンドå` ã‚’å‚ç…§)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" æ–°è¦ãƒ‘ッãƒã®ä½œæˆ qnew\n"
+" 外部ã‹ã‚‰ã®ãƒ‘ッãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å–り込㿠qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" 既知ã®ãƒ‘ッãƒä¸€è¦§ã®è¡¨ç¤º qseries\n"
+" é©ç”¨ä¸­ã®ãƒ‘ッãƒä¸€è¦§ã®è¡¨ç¤º qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" 既知ã®ãƒ‘ッãƒã®é©ç”¨ qpush\n"
+" パッãƒé©ç”¨ã®è§£é™¤ qpop\n"
+" é©ç”¨ä¸­ã®æœ€ä¸Šä½ãƒ‘ッãƒã®å†…容更新 qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"ファイルモードã®å¤‰æ›´ã‚„〠複製履歴〠ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã‚„空ファイルã®ç”Ÿæˆ\n"
+"ï¼å‰Šé™¤ç­‰ã®æƒ…報を維æŒã™ã‚‹ãŸã‚ã«ã€ mq ã¯å¿…è¦ã«å¿œã˜ã¦ git å½¢å¼ã®ãƒ‘ッãƒã‚’\n"
+"自動的ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æŒ¯ã‚‹èˆžã„ã¯ä»¥ä¸‹ã®æŒ‡å®šã§åˆ¶å¾¡ã—ã¾ã™::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"'keep' ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 既存㮠qrefresh 対象ã¨ãªã‚‹ãƒ‘ッãƒãŒ git å½¢å¼\n"
+"パッãƒã§ã‚ã‚‹é–“ã¯ã€ MQ 㯠[diff] セクションã®è¨­å®šã«å¾“ã„ã¾ã™ã€‚\n"
+"'yes' ãªã„ã— 'no' ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ MQ 㯠[diff] セクションã®è¨­å®šã‚’無視\n"
+"ã—ã¦ã€ git パッãƒãªã„ã—通常パッãƒã‚’生æˆã—ã¾ã™ã€‚ 通常パッãƒã‚’生æˆã™ã‚‹å ´åˆã€\n"
+"情報ãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"It may be desirable for mq changesets to be kept in the secret phase (see\n"
+":hg:`help phases`), which can be enabled with the following setting::"
+msgstr ""
+"以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã“ã¨ã§ã€ MQ 管ç†ä¸‹ã®ãƒªãƒ“ジョンã®ãƒ•ã‚§ãƒ¼ã‚º\n"
+"(:hg:`help phases` å‚ç…§) ã‚’ secret ã«ç¶­æŒã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™::"
+
+msgid ""
+" [mq]\n"
+" secret = True"
+msgstr ""
+" [mq]\n"
+" secret = True"
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command."
+msgstr ""
+"通常㯠\"patches\" ã¨ã„ã†åå‰ã®ã‚­ãƒ¥ãƒ¼é…下ã§ã€ãƒ‘ッãƒãŒç®¡ç†ã•ã‚Œã¾ã™ã€‚\n"
+":hg:`qqueue` を使ã†ã“ã¨ã§ã€ 独立ã—ãŸå€‹åˆ¥ã®ç®¡ç†ã‚­ãƒ¥ãƒ¼ã‚’作æˆå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"If the working directory contains uncommitted files, qpush, qpop and\n"
+"qgoto abort immediately. If -f/--force is used, the changes are\n"
+"discarded. Setting::"
+msgstr ""
+"作業領域中ã«ã€ 未コミット変更ãŒã‚ã‚‹å ´åˆã€ qpush, qpop ã‚„ qgoto ã®å®Ÿè¡Œã¯ã€\n"
+"å³åº§ã«ä¸­æ–­ã•ã‚Œã¾ã™ã€‚ -f/--force 指定時ã¯ã€ 変更内容ãŒç ´æ£„ã•ã‚Œã¾ã™ã€‚\n"
+"ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã®æŒ™å‹•ã¯ã€ 以下ã®è¨­å®šã«ã‚ˆã‚Š::"
+
+msgid ""
+" [mq]\n"
+" keepchanges = True"
+msgstr ""
+" [mq]\n"
+" keepchanges = True"
+
+msgid ""
+"make them behave as if --keep-changes were passed, and non-conflicting\n"
+"local changes will be tolerated and preserved. If incompatible options\n"
+"such as -f/--force or --exact are passed, this setting is ignored.\n"
+msgstr ""
+"--keep-changes 指定時ã¨åŒã˜ã«ãªã‚‹ãŸã‚〠作業領域中ã®å¤‰æ›´ã¯ã€\n"
+"è¡çªãŒç„¡ã„é™ã‚Šã€ ãã®ã¾ã¾ç¶­æŒã•ã‚Œã¾ã™ã€‚ -f/--force ã‚„ --exact ã®ã‚ˆã†ãªã€\n"
+"併用ã§ããªã„オプションãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ã“ã®è¨­å®šã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "print first line of patch header"
+msgstr "パッãƒãƒ˜ãƒƒãƒ€ã®æœ€åˆã®è¡Œã‚’表示"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "ä¸æ­£ãª MQ 状態行: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "mq.git オプション㌠auto/keep/yes/no 以外㮠%s ã§ã—ãŸ"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s 㯠%s 中ã«è¤‡æ•°å›žç™»å ´ã—ã¦ã„ã¾ã™"
+
+msgid "guard cannot be an empty string"
+msgstr "ガードã«ç©ºæ–‡å­—列を指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "ガード %r ã®å†’頭文字ã¯ä¸é©åˆ‡ãªæ–‡å­—ã§ã™: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "ガード %r 中ã«ä¸é©åˆ‡ãªæ–‡å­—ãŒã‚ã‚Šã¾ã™: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "ガードå %r ã¯çŸ­éŽãŽã¾ã™"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "ガード %r ã®å†’頭文字ã¯ä¸é©åˆ‡ãªæ–‡å­—ã§ã™"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "%s ã‚’é©ç”¨ - åˆè‡´ã™ã‚‹ã‚¬ãƒ¼ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "%s ã‚’é©ç”¨ - åˆè‡´ã™ã‚‹ãƒã‚¬ãƒ†ã‚£ãƒ–ガードã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "%s ã‚’é©ç”¨ - ガード %s ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "%s を抑止 - ガード %s ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "%s を抑止 - åˆè‡´ã™ã‚‹ã‚¬ãƒ¼ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "å–り消ã—情報ã®ç ´æ£„ã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "ç¾è¡Œç‰ˆã® %s ã‚’ %s ã«ä¿å­˜ä¸­\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "パッム%s ã®é©ç”¨ã«å¤±æ•—"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "パッム%s ãŒé©ç”¨ã§ããªã„ã®ã§ãƒžãƒ¼ã‚¸å®Ÿæ–½ä¸­\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "作業領域ã®æ›´æ–°ãŒã‚¨ãƒ©ãƒ¼ %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+msgid "repo commit failed"
+msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚³ãƒŸãƒƒãƒˆæ“作ã«å¤±æ•—"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "ファイル %s ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "パッム%s ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "パッム%s ã¯æœªé©ç”¨ã§ã™\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "パッãƒé©ç”¨ã®å¤±æ•—ã®ãŸã‚処ç†ãŒç¶™ç¶šã§ãã¾ã›ã‚“(-v 付ã実行ã§è©³ç´°è¡¨ç¤º)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "%s ã‚’é©ç”¨ä¸­\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "ファイル %s ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“\n"
+
+msgid "local changes found, refresh first"
+msgstr "作業領域ã®å†…容ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ã®ã§ qrefresh を実施ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "パッム%s ã¯ç©ºã§ã™\n"
+
+msgid "qpush exactly duplicates child changeset"
+msgstr "qpush ã®å†…容ãŒé©ç”¨å…ˆãƒªãƒ“ジョンã¨å®Œå…¨ã«ä¸€è‡´ã—ã¾ã™"
+
+msgid "repository commit failed"
+msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚³ãƒŸãƒƒãƒˆæ“作ã«å¤±æ•—"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr "パッãƒé©ç”¨ãŒå¤±æ•—ã—〠å´ä¸‹å·®åˆ†ã¯ä½œæ¥­é ˜åŸŸã«æ®‹ã•ã‚Œã¦ã„ã¾ã™\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "パッãƒãŒæ›–昧ãªãŸã‚〠é©ç”¨ã‚’中止\n"
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "リビジョン %s ãŒæœªçŸ¥ã®ãƒ‘ッãƒã‚’å‚ç…§ã—ã¦ã„ã¾ã™: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "未知ã®ãƒ‘ッãƒã§ã™: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "リビジョン %d 㯠MQ 管ç†ä¸‹ã«ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "é©ç”¨ä¸­ã®æœ€ä¸‹ä½ãƒ‘ッãƒã‹ã‚‰é€£ç¶šã—ã¦ã„ãªã„リビジョン %d ã¯å‰Šé™¤ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "パッム%s をメッセージ無ã—ã§é€šå¸¸ãƒªãƒ“ジョン化ã—ã¾ã—ãŸ\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete ã«ã¯æœ€ä½Ž1ã¤ã®ãƒªãƒ“ジョン(åˆã¯ãƒ‘ッãƒå)指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "é©ç”¨ä¸­ã®ãƒ‘ッム%s ã¯å‰Šé™¤ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "パッム%s ã¯æœªçŸ¥ã®ãƒ‘ッãƒã§ã™"
+
+msgid "no patches applied"
+msgstr "é©ç”¨ä¸­ã®ãƒ‘ッãƒã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "working directory revision is not qtip"
+msgstr "作業領域ã®è¦ªãƒªãƒ“ジョン㯠qtip ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "local changes found"
+msgstr "作業領域ã®å†…容ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" ã¯ãƒ‘ッãƒåã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr "パッãƒåã®æœ€åˆã®æ–‡å­—ã« \"%s\" ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" ã‚’å«ã‚€åå‰ã¯ãƒ‘ッãƒåã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ã—ã¦æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "パッム\"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "cannot use both --force and --keep-changes"
+msgstr "--force 㨠--keep-changes ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot manage merge changesets"
+msgstr "マージリビジョン㯠MQ ã®ç®¡ç†å¯¾è±¡ã«ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "パッム\"%s\" ã®æ›¸ã出ã—ã«å¤±æ•—: %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "%s ã® unlink ã«å¤±æ•—\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "パッãƒå \"%s\" ã¯æ›–昧ã§ã™:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "パッム%s ã¯æœªçŸ¥ã®ãƒ‘ッãƒã§ã™"
+
+msgid "(working directory not at a head)\n"
+msgstr "(作業領域ã®è¦ªãƒªãƒ“ジョンã¯ãƒ˜ãƒƒãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“)\n"
+
+msgid "no patches in series\n"
+msgstr "既知ã®ãƒ‘ッãƒã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: パッム%s ã¯æ—¢ã«é©ç”¨ä¸­ã®æœ€ä¸Šä½ãƒ‘ッãƒã§ã™\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "é©ç”¨ä¸­ã®ãƒ‘ッム%s ã®å†é©ç”¨ã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "ガード %s ãŒé©ç”¨ã•ã‚Œã¾ã—ãŸ"
+
+msgid "no matching guards"
+msgstr "åˆè‡´ã™ã‚‹ã‚¬ãƒ¼ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "パッム'%s' ã¯é©ç”¨ã§ãã¾ã›ã‚“ã§ã—㟠- %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒãŒé©ç”¨ä¸­ã§ã™\n"
+
+msgid "patch series already fully applied\n"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒãŒé©ç”¨ä¸­ã§ã™\n"
+
+msgid "cannot use --exact and --keep-changes together"
+msgstr "--exact and --keep-changes ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot use --exact and --move together"
+msgstr "--exact 㨠--move ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot push --exact with applied patches"
+msgstr "パッãƒé©ç”¨ä¸­ã«ã€ --exact 付ãã§ã®ãƒ‘ッãƒé©ç”¨ã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s ã«ã¯è¦ªãƒªãƒ“ジョン情報ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "please specify the patch to move"
+msgstr "移動ã™ã‚‹ãƒ‘ッãƒã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid "cleaning up working directory..."
+msgstr "作業領域ã®æ•´ç†ä¸­..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "é©ç”¨ãŒå¤±æ•—ã—ãŸãŸã‚〠対処後㫠%s ã¸ã® qrefresh を実施ã—ã¦ãã ã•ã„\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "é©ç”¨ä¸­ã®æœ€ä¸Šä½ãƒ‘ッãƒã¯ %s ã§ã™\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "パッム%s ã¯æœªé©ç”¨ã§ã™"
+
+msgid "no patches applied\n"
+msgstr "é©ç”¨ä¸­ã®ãƒ‘ッãƒã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: パッム%s ã¯æ—¢ã«é©ç”¨ä¸­ã®æœ€ä¸Šä½ãƒ‘ッãƒã§ã™\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: 作業領域状態ã®æ›´æ–°ã‚’å¼·è¡Œã—ã¾ã™\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "未知ã®ãƒªãƒ“ジョン %s ãŒè§£é™¤å¯¾è±¡ã«æŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr "管ç†å¯¾è±¡å¤–ã®ãƒªãƒ“ジョンãŒè§£é™¤å¯¾è±¡ã«æŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "popping would remove an immutable revision"
+msgstr "é©ç”¨è§£é™¤å¯¾è±¡ã¯æ”¹å¤‰ä¸èƒ½ãƒªãƒ“ジョンã§ã™"
+
+msgid "see \"hg help phases\" for details"
+msgstr "詳細㯠\"hg help phases\" å‚ç…§"
+
+msgid "deletions found between repo revs"
+msgstr "リビジョン間ã§å‰Šé™¤ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ"
+
+#, python-format
+msgid "popping %s\n"
+msgstr "%s ã®é©ç”¨è§£é™¤\n"
+
+msgid "patch queue now empty\n"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒã®é©ç”¨ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸ\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "ヘッド以外㯠qrefresh ã®å¯¾è±¡ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "cannot refresh immutable revision"
+msgstr "改変ä¸èƒ½ãƒªãƒ“ジョン㯠qrefresh ã§ãã¾ã›ã‚“"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr "パッãƒè§£é™¤ä¸­ã«ä¸­æ–­ã•ã‚Œã¾ã—ãŸ!(revert --all ãŠã‚ˆã³ qpush ã§å¾©æ—§)\n"
+
+msgid "patch queue directory already exists"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "パッム%s ã¯æœªçŸ¥ã®ãƒ‘ッãƒã§ã™"
+
+msgid "no saved patch data found\n"
+msgstr "ä¿å­˜ã•ã‚ŒãŸãƒ‘ッãƒçŠ¶æ…‹ãƒ‡ãƒ¼ã‚¿ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "パッãƒçŠ¶æ…‹ %s ã®å¾©æ—§ä¸­\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr "パッãƒçŠ¶æ…‹ä¿å­˜ãƒªãƒ“ジョンã¯ãƒ˜ãƒƒãƒ‰ã§ãªã„ã®ã§å‰Šé™¤ã§ãã¾ã›ã‚“\n"
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr "パッãƒçŠ¶æ…‹ä¿å­˜ãƒªãƒ“ジョン %s ã®å‰Šé™¤ä¸­\n"
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr "パッãƒçŠ¶æ…‹ä¿å­˜ãƒªãƒ“ジョンã®è¦ª: %s %s\n"
+
+msgid "updating queue directory\n"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®æ›´æ–°ä¸­\n"
+
+msgid "unable to load queue repository\n"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®ãƒªãƒã‚¸ãƒˆãƒªæƒ…報を読ã¿è¾¼ã‚ã¾ã›ã‚“\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr "save: é©ç”¨ä¸­ã®ãƒ‘ッãƒãŒç„¡ã„ãŸã‚終了ã—ã¾ã™\n"
+
+msgid "status is already saved\n"
+msgstr "パッãƒçŠ¶æ…‹ã¯ä¿å­˜æ¸ˆã¿ã§ã™\n"
+
+msgid "hg patches saved state"
+msgstr "パッãƒçŠ¶æ…‹ä¿å­˜ç”¨ãƒªãƒ“ジョン"
+
+msgid "repo commit failed\n"
+msgstr "リãƒã‚¸ãƒˆãƒªã®ã‚³ãƒŸãƒƒãƒˆæ“作ã«å¤±æ•—\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "åŒåã®ãƒ‘ッム%s ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "ファイルå–ã‚Šè¾¼ã¿ã®éš›ã® \"-r\" 指定ã¯ä¸é©åˆ‡ã§ã™"
+
+msgid "no files or revisions specified"
+msgstr "ファイルï¼ãƒªãƒ“ジョンã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "複数パッãƒå–ã‚Šè¾¼ã¿ã®éš›ã® \"-n\" 指定ã¯ä¸é©åˆ‡ã§ã™"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "リビジョン %d ã¯1ã¤ä»¥ä¸Šã®ãƒ–ランãƒã®åˆ†å²ç‚¹ã§ã™"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "リビジョン %d ã¯æ—¢ã« MQ 管ç†ä¸‹ã«ã‚ã‚Šã¾ã™"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "リビジョン %d ã¯ãƒ‘ッãƒé©ç”¨ã®èµ·ç‚¹ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "リビジョン %d ã«ã¯ MQ 管ç†ä¸‹ã«ç„¡ã„å­ãƒªãƒ“ジョンãŒã‚ã‚Šã¾ã™"
+
+#, python-format
+msgid "revision %d is not mutable"
+msgstr "リビジョン %d ã¯æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "マージ実施リビジョン %d ã¯å–ã‚Šè¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "リビジョン %d ã¯ã€ %d ã®è¦ªãƒªãƒ“ジョンã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "-e is incompatible with import from -"
+msgstr "標準入力(-)ã‹ã‚‰ã®å–ã‚Šè¾¼ã¿ã®éš›ã® -e 指定ã¯ä¸é©åˆ‡ã§ã™"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "パッム%s ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«æ”¹å中\n"
+
+msgid "need --name to import a patch from -"
+msgstr "標準入力(-)ã‹ã‚‰ã®å–ã‚Šè¾¼ã¿ã®éš›ã«ã¯ --name 指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "ファイル %s ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "パッム%s を追加中\n"
+
+msgid "keep patch file"
+msgstr "パッãƒãƒ•ã‚¡ã‚¤ãƒ«ã®å‰Šé™¤ã‚’抑止"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "指定リビジョンを管ç†å¯¾è±¡ã‹ã‚‰é™¤å¤–(éžæŽ¨å¥¨)"
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [PATCH]..."
+
+msgid "remove patches from queue"
+msgstr "管ç†å¯¾è±¡ã‹ã‚‰ã®ãƒ‘ッãƒé™¤å¤–"
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"Exact\n"
+" patch identifiers must be given. With -k/--keep, the patch files are\n"
+" preserved in the patch directory."
+msgstr ""
+" パッãƒå指定ã«ã¯ã€ 最低1ã¤ã®æœªé©ç”¨ãƒ‘ッãƒåã®æŒ‡å®šãŒå¿…è¦ã§ã™ã€‚\n"
+" ã¾ãŸã€ åå‰ã¯åŽ³å¯†ãªã‚‚ã®ã‚’指定ã—ã¦ãã ã•ã„。 -k/--keep を指定ã—ãŸå ´åˆã€\n"
+" パッãƒãƒ•ã‚¡ã‚¤ãƒ«ãã®ã‚‚ã®ã¯ç®¡ç†é ˜åŸŸã«æ®‹ã•ã‚ŒãŸã¾ã¾ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+" 管ç†å¯¾è±¡å¤–ã¨ãªã£ãŸãƒ‘ッãƒã‚’通常リビジョン化ã™ã‚‹å ´åˆã¯ :hg:`qfinish`\n"
+" を使用ã—ã¦ãã ã•ã„。"
+
+msgid "show only the preceding applied patch"
+msgstr "ç›´å‰ã«é©ç”¨ã—ãŸãƒ‘ッãƒã®ã¿ã‚’表示"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches already applied"
+msgstr "é©ç”¨ä¸­ã®ãƒ‘ッãƒä¸€è¦§ã®è¡¨ç¤º"
+
+msgid " Returns 0 on success."
+msgstr " æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚"
+
+msgid "only one patch applied\n"
+msgstr "å˜ä¸€ã®ãƒ‘ッãƒã ã‘ãŒé©ç”¨ä¸­ã§ã™\n"
+
+msgid "show only the first patch"
+msgstr "最åˆã®æœªé©ç”¨ãƒ‘ッãƒã®ã¿ã‚’表示"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches not yet applied"
+msgstr "未é©ç”¨ã®ãƒ‘ッãƒä¸€è¦§ã®è¡¨ç¤º"
+
+msgid "all patches applied\n"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒãŒé©ç”¨ä¸­ã§ã™\n"
+
+msgid "import file in patch directory"
+msgstr "パッãƒç®¡ç†é ˜åŸŸä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰å–ã‚Šè¾¼ã¿"
+
+msgid "NAME"
+msgstr "åå‰"
+
+msgid "name of patch file"
+msgstr "パッãƒãƒ•ã‚¡ã‚¤ãƒ«å"
+
+msgid "overwrite existing files"
+msgstr "既存ファイルã®ä¸Šæ›¸ã"
+
+msgid "place existing revisions under mq control"
+msgstr "既存リビジョンを MQ 管ç†ä¸‹ã«ç§»è¡Œ"
+
+msgid "use git extended diff format"
+msgstr "git 拡張差分形å¼ã®ä½¿ç”¨"
+
+msgid "qpush after importing"
+msgstr "パッãƒå–ã‚Šè¾¼ã¿å¾Œã«ãƒ‘ッãƒé©ç”¨(qpush)を実施"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
+msgstr "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
+
+msgid "import a patch or existing changeset"
+msgstr "パッãƒãªã„ã—既存リビジョンã®å–ã‚Šè¾¼ã¿"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" å–ã‚Šè¾¼ã¾ã‚ŒãŸãƒ‘ッãƒã®é©ç”¨é †åºã¯ã€ ç¾åœ¨é©ç”¨ä¸­ã®æœ€ä¸Šä½ãƒ‘ッãƒã®æ¬¡ã«\n"
+" ãªã‚Šã¾ã™ã€‚ é©ç”¨ä¸­ã®ãƒ‘ッãƒãŒç„¡ã„å ´åˆã€ å–ã‚Šè¾¼ã¾ã‚ŒãŸãƒ‘ッãƒã®é©ç”¨é †åºã¯\n"
+" 一番最åˆã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" -n/--name ã«ã‚ˆã‚‹åå‰ã®æŒ‡å®šãŒç„¡ã„å ´åˆã€ å–ã‚Šè¾¼ã¿å¯¾è±¡ã®ãƒ•ã‚¡ã‚¤ãƒ«åãŒ\n"
+" ãã®ã¾ã¾ãƒ‘ッãƒåã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" -e/--existing を指定ã™ã‚‹ã“ã¨ã§ã€ パッãƒç®¡ç†é ˜åŸŸä¸­ã®æ—¢å­˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚’\n"
+" å–ã‚Šè¾¼ã¿å¯¾è±¡ã¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr " -f/--force ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ åŒåã®æ—¢å­˜ãƒ‘ッãƒã‚’上書ãã—ã¾ã™ã€‚"
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+" -r/--rev を指定ã™ã‚‹ã“ã¨ã§ã€\n"
+" 既存ã®é€šå¸¸ãƒªãƒ“ジョンを MQ 管ç†ä¸‹ã«ç½®ãã“ã¨ãŒã§ãã¾ã™\n"
+" (例: 'qimport --rev tip -n patch' ã¯ã€ tip ã‚’ MQ 管ç†ä¸‹ã«ç½®ãã¾ã™)。\n"
+" -g/--git 指定ã¯ã€ --rev 指定ã«ã‚ˆã‚‹å–ã‚Šè¾¼ã¿ã®éš›ã«\n"
+" git 差分形å¼ã‚’使用ã—ã¾ã™ã€‚\n"
+" 改åï¼è¤‡è£½æƒ…報や〠権é™è¨­å®šã®æƒ…å ±ä¿æŒã«ã¨ã£ã¦ã®\n"
+" git 差分形å¼ã®æœ‰ç”¨æ€§ã«é–¢ã—ã¦ã¯ã€ 'help diffs' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" リビジョンを MQ 管ç†ä¸‹ã‹ã‚‰é™¤å¤–ã™ã‚‹å ´åˆã€ :hg:`qfinish` を使用ã—ã¾ã™ã€‚"
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+" 標準入力ã‹ã‚‰ãƒ‘ッãƒã‚’å–り込む場åˆã€ ファイルåã« '-' を指定ã—ã¾ã™ã€‚\n"
+" 標準入力ã‹ã‚‰ã®å–ã‚Šè¾¼ã¿ã®éš›ã«ã¯ã€ --name ã§ã®ãƒ‘ッãƒå指定ãŒå¿…é ˆã§ã™ã€‚"
+
+msgid " To import an existing patch while renaming it::"
+msgstr " 既存ã®ãƒ‘ッãƒã‚’改åã—ã¤ã¤å–り込む場åˆã¯::"
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr " hg qimport -e 既存パッãƒã®åå‰ -n æ–°ã—ã„åå‰"
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid "create queue repository"
+msgstr "パッãƒç®¡ç†è‡ªèº«ã‚’ Mercurial ã§æ§‹æˆç®¡ç†"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®åˆæœŸåŒ–(éžæŽ¨å¥¨)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ パッãƒç®¡ç†é ˜åŸŸã¯æ§‹æˆç®¡ç†ã•ã‚Œã¾ã›ã‚“。\n"
+" -c/--create-repo ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 本コマンドã¯ãƒ‘ッãƒç®¡ç†é ˜åŸŸè‡ªä½“ã‚’\n"
+" Mercurial ã®ãƒªãƒã‚¸ãƒˆãƒªã¨ã—ã¦ä½œæˆã—ã¾ã™(既存ã®ãƒ‘ッãƒç®¡ç†é ˜åŸŸã‚’後ã‹ã‚‰\n"
+" Mercurial リãƒã‚¸ãƒˆãƒªåŒ–ã™ã‚‹ã®ã«ã‚‚使用ã§ãã¾ã™)。 管ç†é ˜åŸŸã®å¤‰æ›´å†…容ã¯\n"
+" qcommit ã«ã‚ˆã£ã¦ã‚³ãƒŸãƒƒãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" 本コマンドã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“。 -c 指定無ã—ã§ã®ä½œæˆãªã‚‰ã€ ä»–ã®é–¢é€£ã‚³ãƒžãƒ³ãƒ‰\n"
+" ã«ã‚ˆã£ã¦ä½œæˆã•ã‚Œã¾ã™ã€‚ -c 指定有りã§ã®ä½œæˆãªã‚‰ã°ã€ :hg:`init --mq`\n"
+" を使用ã—ã¦ãã ã•ã„。"
+
+msgid "use pull protocol to copy metadata"
+msgstr "メタデータ複製㫠pull プロトコルを使用"
+
+msgid "do not update the new working directories"
+msgstr "æ–°è¦ä½œæ¥­é ˜åŸŸã®æ›´æ–°ã‚’抑止"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "éžåœ§ç¸®ã§ã®è»¢é€(LAN ã§ã®é«˜é€Ÿè»¢é€ç”¨)"
+
+msgid "REPO"
+msgstr "リãƒã‚¸ãƒˆãƒª"
+
+msgid "location of source patch repository"
+msgstr "複製元パッãƒç®¡ç†é ˜åŸŸä½ç½®"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [OPTION]... SOURCE [DEST]"
+
+msgid "clone main and patch repository at same time"
+msgstr "リãƒã‚¸ãƒˆãƒªã¨ãƒ‘ッãƒç®¡ç†é ˜åŸŸã®åŒæ™‚複製"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" 複製元ãŒåŒä¸€ãƒ›ã‚¹ãƒˆä¸Šã«ã‚ã‚‹å ´åˆã€ 複製先リãƒã‚¸ãƒˆãƒªã§ã¯ã€ å…¨ã¦ã®ãƒ‘ッãƒãŒ\n"
+" 未é©ç”¨ãªçŠ¶æ…‹ã¨ãªã‚Šã¾ã™ã€‚ 複製元ãŒé éš”ホストã«ã‚ã‚‹å ´åˆã€ 複製元ã§ã®\n"
+" パッãƒé©ç”¨çŠ¶æ³ãŒä¸æ˜Žãªã®ã§ã€ 複製先ã§ã®ãƒ‘ッãƒé©ç”¨çŠ¶æ³ã¯æœªä¿è¨¼ã§ã™ã€‚\n"
+" é éš”ホスト上ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’複製ã™ã‚‹å ´åˆã€ パッãƒãŒæœªé©ç”¨ã§ã‚ã‚‹ã“ã¨ã‚’\n"
+" 確èªã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ パッãƒç®¡ç†é ˜åŸŸã¯ <src>/.hg/patches ã‹ã‚‰è¤‡è£½ã•ã‚Œ\n"
+" ã¾ã™ã€‚ 変更ã™ã‚‹å ´åˆã¯ -p <url> を使用ã—ã¾ã™ã€‚"
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+" パッãƒç®¡ç†é ˜åŸŸã¯ã€ :hg:`init --mq` ã«ã‚ˆã£ã¦ç”Ÿæˆã•ã‚ŒãŸ\n"
+" 入れå­çŠ¶ã® Mercurial リãƒã‚¸ãƒˆãƒªã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "構æˆç®¡ç†ã•ã‚ŒãŸãƒ‘ッãƒé ˜åŸŸãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“(init --mq å‚ç…§)"
+
+msgid "cloning main repository\n"
+msgstr "主リãƒã‚¸ãƒˆãƒªã‚’複製中\n"
+
+msgid "cloning patch repository\n"
+msgstr "パッãƒç®¡ç†ãƒªãƒã‚¸ãƒˆãƒªã‚’複製中\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "複製先リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ãƒ‘ッãƒé©ç”¨ã‚’解除中\n"
+
+msgid "updating destination repository\n"
+msgstr "複製先ã®ä½œæ¥­é ˜åŸŸã‚’更新中\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [OPTION]... [FILE]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®å¤‰æ›´ã‚’コミット(éžæŽ¨å¥¨)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr " 本コマンドã¯éžæŽ¨å¥¨ã§ã™ã€‚ :hg:`commit --mq` を使用ã—ã¦ãã ã•ã„。"
+
+msgid "print patches not in series"
+msgstr "パッãƒç®¡ç†é ˜åŸŸä¸­ã®æœªçŸ¥ã®ãƒ‘ッãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "既知ã®ãƒ‘ッãƒä¸€è¦§ã®è¡¨ç¤º"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "ç¾è¡Œãƒ‘ッãƒã®åå‰è¡¨ç¤º"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "print the name of the next pushable patch"
+msgstr "ç¾è¡Œãƒ‘ッãƒã®ã€Œæ¬¡ã€ã«é©ç”¨ã•ã‚Œã‚‹ãƒ‘ッãƒã®åå‰è¡¨ç¤º"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the preceding applied patch"
+msgstr "ç›´å‰ã«é©ç”¨ã•ã‚ŒãŸãƒ‘ッãƒåã®è¡¨ç¤º"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "作業領域ã®å¤‰æ›´å†…容ã®ãƒ‘ッãƒã¸ã®å–ã‚Šè¾¼ã¿(éžæŽ¨å¥¨)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "\"From: <ç¾ãƒ¦ãƒ¼ã‚¶å>\" をパッãƒã«è¿½åŠ "
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "\"From: <ユーザ>\" をパッãƒã«è¿½åŠ "
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "\"Date: <ç¾åœ¨æ™‚刻>\" をパッãƒã«è¿½åŠ "
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "\"Date: <日時>\" をパッãƒã«è¿½åŠ "
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+
+msgid "create a new patch"
+msgstr "æ–°è¦ãƒ‘ッãƒã®ä½œæˆ"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" 本コマンドã¯ã€ (パッãƒé©ç”¨ä¸­ã®å ´åˆã¯) é©ç”¨ä¸­ãƒ‘ッãƒã®æœ€ä¸Šä½ã®ä½ç½®ã«ã€\n"
+" æ–°è¦ãƒ‘ッãƒã‚’作æˆã—ã¾ã™ã€‚ æ–°è¦ãƒ‘ッãƒã«ã¯ã€ 作業領域中ã®å…¨ã¦ã®å¤‰æ›´ãŒã€\n"
+" æ ¼ç´ã•ã‚Œã¾ã™ã€‚ -I/--include〠-X/--exclude や〠パッãƒåã«ç¶šãã€\n"
+" ファイルå指定ã®çµ„ã¿åˆã‚ã›ã«ã‚ˆã‚Šã€ 変更ãŒå–ã‚Šè¾¼ã¾ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€\n"
+" é™å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ å–ã‚Šè¾¼ã¿å¯¾è±¡å¤–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã‘る変更ã¯ã€\n"
+" 未コミットãªã¾ã¾ã€ 作業領域ã«æ®‹ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" -u/--user ãŠã‚ˆã³ -d/--date ã¯ã€ ãã‚Œãžã‚ŒæŒ‡å®šã®ãƒ¦ãƒ¼ã‚¶åï¼æ—¥æ™‚ã®è¨˜éŒ²ã«\n"
+" 使用ã§ãã¾ã™ã€‚ -U/--currentuser ãŠã‚ˆã³ -D/--currendate ã¯ã€ ãã‚Œãžã‚Œ\n"
+" ç¾ãƒ¦ãƒ¼ã‚¶åï¼ç¾åœ¨æ—¥æ™‚を記録ã—ã¾ã™ã€‚"
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message, -l/--logfile ã¯ã€ コミットログã¨åŒæ§˜ã«ã€\n"
+" パッãƒã®ãƒ˜ãƒƒãƒ€ã«è¨˜éŒ²ã™ã‚‹æƒ…報を指定ã—ã¾ã™ã€‚ 指定ãŒç„¡ã„å ´åˆã¯ã€\n"
+" ヘッダã¯ç©ºã®ã¾ã¾ã€ コミットログ㌠'[mq]: パッãƒå' ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" git 拡張差分形å¼ã‚’使用ã™ã‚‹å ´åˆã¯ã€ -g/--git を指定ã—ã¾ã™ã€‚ 改åï¼è¤‡è£½\n"
+" 情報や〠権é™è¨­å®šã®æƒ…å ±ä¿æŒã«ã¨ã£ã¦ã® git 差分形å¼ã®æœ‰ç”¨æ€§ã«é–¢ã—ã¦ã¯ã€\n"
+" 'help diffs' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "明示ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«åŠ ãˆã¦ã€ 既存ã®ãƒ‘ッãƒå¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚æ›´æ–°"
+
+msgid "add/update author field in patch with current user"
+msgstr "パッãƒä½œæˆè€…情報をç¾è¡Œãƒ¦ãƒ¼ã‚¶ã«è¨­å®š"
+
+msgid "add/update author field in patch with given user"
+msgstr "パッãƒä½œæˆè€…情報を指定ユーザã«è¨­å®š"
+
+msgid "add/update date field in patch with current date"
+msgstr "パッãƒä½œæˆæ—¥ä»˜æƒ…報をç¾æ™‚刻ã«è¨­å®š"
+
+msgid "add/update date field in patch with given date"
+msgstr "パッãƒä½œæˆæ—¥ä»˜æƒ…報を指定時刻ã«è¨­å®š"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+
+msgid "update the current patch"
+msgstr "ç¾è¡Œãƒ‘ッãƒã®æ›´æ–°"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" 何らã‹ã®ãƒ‘ターンãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 更新後ã®ãƒ‘ッãƒã¯å½“該パターンã«\n"
+" åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´å†…容ã ã‘ã‚’å«ã¿ã€ ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´å†…容ã¯ä½œæ¥­\n"
+" 領域ã«æ®‹ã£ãŸã¾ã¾ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+" -s/--short ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ç¾è¡Œãƒ‘ッãƒãŒå¤‰æ›´ã‚’ä¿æŒã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€\n"
+" ファイル指定ã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã•ã‚Œã€ パッãƒã«ã¨ã©ã¾ã‚Šç¶šã‘ã¾ã™ã€‚"
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+" -e/--edit ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ メッセージ入力用ã®ãƒ—ログラムãŒ\n"
+" 設定ã«å¾“ã£ã¦èµ·å‹•ã•ã‚Œã¾ã™ã€‚ 処ç†ãŒå¤±æ•—ã—ãŸå ´åˆã€\n"
+" 入力ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ ``.hg/last-message.txt`` ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+" 複製ï¼æ”¹åã«é–¢ã™ã‚‹å±¥æ­´ä¿å­˜ã®ãŸã‚ã« git 差分形å¼ã‚’使用(-g/--git 指定や\n"
+" 設定ファイルã§ã® [diff] git=1 記述)ã™ã‚‹ã®ã§ã‚ã‚Œã°ã€\n"
+" add/remove/copy/rename ã¨ã„ã£ãŸ hg ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã‚‹å±¥æ­´è¨˜éŒ²ã‚‚ã€\n"
+" 通常ã¨å¤‰ã‚ã‚Šãªã機能ã—ã¾ã™ã€‚ git 差分形å¼ã®è©³ç´°ã«é–¢ã—ã¦ã¯ã€\n"
+" 'help diffs' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "\"-e\" ã¨ã€ \"-m\" ãªã„ã— \"-l\" ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [OPTION]... [FILE]..."
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "ç¾è¡Œãƒ‘ッãƒã¨ä½œæ¥­é ˜åŸŸå¤‰æ›´ã®çµåˆçµæžœã®è¡¨ç¤º"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" ç¾è¡Œãƒ‘ッãƒã®å¤‰æ›´å†…容ã¨ã€ å‰å›žã® qrefresh 実施以後ã®ä½œæ¥­é ˜åŸŸã«ãŠã‘ã‚‹\n"
+" 変更内容をåˆã‚ã›ãŸå·®åˆ†(ï¼ ç¾æ™‚点ã§ã® qrefresh 実施ã«ã‚ˆã‚‹ãƒ‘ッãƒå†…容ã®\n"
+" æ›´æ–°çµæžœ)を表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+" å‰å›žã® :hg:`qrefresh` 実施以後ã®ä½œæ¥­é ˜åŸŸã«ãŠã‘る変更内容を見ãŸã„\n"
+" å ´åˆã¯ :hg:`diff` を〠作業領域ã®å¤‰æ›´å†…容をå«ã¾ãªã„ç¾è¡Œãƒ‘ッãƒã®å†…容\n"
+" ã®ã¿ã‚’見ãŸã„å ´åˆã¯ :hg:`export qtip` を使用ã—ã¦ãã ã•ã„。"
+
+msgid "edit patch header"
+msgstr "パッãƒãƒ˜ãƒƒãƒ€å†…容ã®ç·¨é›†"
+
+msgid "keep folded patch files"
+msgstr "ä½µåˆå¯¾è±¡ãƒ‘ッãƒã®ãƒ‘ッãƒãƒ•ã‚¡ã‚¤ãƒ«å‰Šé™¤ã‚’抑止"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+
+msgid "fold the named patches into the current patch"
+msgstr "指定パッãƒã®ç¾è¡Œãƒ‘ッãƒã¸ã®ä½µåˆ"
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+" ä½µåˆå¯¾è±¡ãƒ‘ッãƒã¯ã€ 未é©ç”¨ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 個々ã®ãƒ‘ッãƒã¯ã€\n"
+" 指定ã•ã‚ŒãŸé †åºã§ã€ ç¾è¡Œãƒ‘ッãƒã®ä¸Šã«ã€ 連続ã—ã¦é©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" ä½µåˆå¯¾è±¡ãƒ‘ッãƒã®é©ç”¨ãŒã€ å…¨ã¦æˆåŠŸã—ãŸå ´åˆã€ ç¾è¡Œã®ãƒ‘ッãƒã¯ã€\n"
+" 対象パッãƒå…¨ã¦ã®ç´¯ç©ã¨ã—ã¦æ›´æ–°ã•ã‚Œã€ ä½µåˆãƒ‘ッãƒã¯å‰Šé™¤ã•ã‚Œã¾ã™ã€‚\n"
+" -k/--keep ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ä½µåˆå¯¾è±¡ãƒ‘ッãƒã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€\n"
+" ä½µåˆå¾Œã‚‚ä¿æŒã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+" ä½µåˆå¯¾è±¡ãƒ‘ッãƒã®ãƒ˜ãƒƒãƒ€æƒ…å ±ã¯ã€ ``* * *`` 行を区切り記å·ã¨ã—ã¦ã€\n"
+" ç¾è¡Œã®ãƒ‘ッãƒã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+
+msgid "qfold requires at least one patch name"
+msgstr "ä½µåˆå®Ÿæ–½ã«ã¯æœ€ä½Ž1ã¤ã®ãƒ‘ッãƒå指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "skipping already folded patch %s\n"
+msgstr "æ—¢ã«ä½µåˆæ¸ˆã¿ã®ãƒ‘ッム%s ã¯ç„¡è¦–ã—ã¾ã™\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "パッム%s ã¯é©ç”¨ä¸­ãªã®ã§ä½µåˆã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "パッム%s ã®ä½µåˆã«å¤±æ•—"
+
+msgid "tolerate non-conflicting local changes"
+msgstr "è¡çªã—ãªã„作業領域中ã®å¤‰æ›´ã‚’許容"
+
+msgid "overwrite any local changes"
+msgstr "作業領域中ã®å¤‰æ›´ã‚’上書ã"
+
+msgid "do not save backup copies of files"
+msgstr "å–り消ã—実施å‰å†…容ã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—を抑止"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [OPTION]... PATCH"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr "指定パッãƒã‚’é©ç”¨ãƒ‘ッãƒã®æœ€ä¸Šä½ã«ã™ã‚‹ qpush/qpop ã®å®Ÿæ–½"
+
+msgid "list all patches and guards"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒã®ã‚¬ãƒ¼ãƒ‰çŠ¶æ³ã‚’一覧表示"
+
+msgid "drop all guards"
+msgstr "å…¨ã¦ã®ã‚¬ãƒ¼ãƒ‰è¨­å®šã‚’破棄"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+
+msgid "set or print guards for a patch"
+msgstr "パッãƒã®ã‚¬ãƒ¼ãƒ‰è¨­å®šãªã„ã—表示"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+" 「ガードã€ã¯ãƒ‘ッãƒé©ç”¨ã®å¯å¦ã‚’制御ã—ã¾ã™ã€‚ ガードãŒè¨­å®šã•ã‚Œã¦ã„ãªã„\n"
+" パッãƒã¯å¸¸ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ 「正ã€ã®ã‚¬ãƒ¼ãƒ‰(例: \"+foo\")ãŒè¨­å®šã•ã‚ŒãŸ\n"
+" パッãƒã¯ã€ :hg:`qselect` ã«ã‚ˆã£ã¦å½“該ガードãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã«é™ã‚Š\n"
+" é©ç”¨ã•ã‚Œã¾ã™ã€‚ 「負ã€ã®ã‚¬ãƒ¼ãƒ‰(例: \"-foo\")ãŒè¨­å®šã•ã‚Œã¦ã„るパッãƒã¯ã€\n"
+" :hg:`qselect` ã«ã‚ˆã£ã¦å½“該ガードãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" 引数指定ãŒç„¡ã„å ´åˆã€ ç¾åœ¨ã®ã‚¬ãƒ¼ãƒ‰é¸æŠžçŠ¶æ³ã‚’表示ã—ã¾ã™ã€‚\n"
+" 引数ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定パッãƒã«å¯¾ã™ã‚‹ã‚¬ãƒ¼ãƒ‰é¸æŠžã‚’設定ã—ã¾ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+" .. note::\n"
+" 「負ã€ã®ã‚¬ãƒ¼ãƒ‰è¨­å®šã«ã¯ã€ ガード指定ã®å‰ã« '--' 指定ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid " To set guards on another patch::"
+msgstr " ç¾è¡Œãƒ‘ッãƒä»¥å¤–ã«ã‚¬ãƒ¼ãƒ‰ã‚’設定ã™ã‚‹ã«ã¯::"
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr " hg qguard 対象パッãƒå -- +2.6.17 -stable"
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "-l/--list ã¯ã€ ä»–ã®ã‚ªãƒ—ションや引数ã¨åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "no patch to work with"
+msgstr "対象ã¨ã™ã¹ãパッãƒãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "パッム%s ã¯æœªçŸ¥ã®ãƒ‘ッãƒã§ã™"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "ç¾è¡Œãƒ‘ッãƒãªã„ã—指定パッãƒã®ãƒ˜ãƒƒãƒ€è¡¨ç¤º"
+
+msgid "apply on top of local changes"
+msgstr "作業領域ã®å¤‰æ›´ã‚’ãã®ã¾ã¾ã§ãƒ‘ッãƒã‚’é©ç”¨"
+
+msgid "apply the target patch to its recorded parent"
+msgstr "パッãƒã«è¨˜éŒ²ã•ã‚ŒãŸè¦ªãƒªãƒ“ジョンã«å¯¾ã—ã¦é©ç”¨"
+
+msgid "list patch name in commit text"
+msgstr "コミットメッセージã¨ã—ã¦ãƒ‘ッãƒåを列挙"
+
+msgid "apply all patches"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒã‚’é©ç”¨"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "ä»–ã®ãƒ‘ッãƒç®¡ç†é ˜åŸŸã¨ã®ãƒžãƒ¼ã‚¸(éžæŽ¨å¥¨)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "マージ対象ã®ãƒ‘ッãƒç®¡ç†é ˜åŸŸå(éžæŽ¨å¥¨)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr "パッãƒä¸€è¦§ã®é †åºå¤‰æ›´ã¨ãƒ‘ッãƒé©ç”¨"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+
+msgid "push the next patch onto the stack"
+msgstr "次ã®ãƒ‘ッãƒã®é©ç”¨"
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and patch over\n"
+" uncommitted changes."
+msgstr ""
+" 作業領域ã«æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ãŒã‚ã‚‹å ´åˆã€ 通常ã¯ã‚³ãƒžãƒ³ãƒ‰ãŒä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" --keep-changes ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 未コミット変更ã¨ãƒ‘ッãƒã¨ã®é–“ã§ã€\n"
+" é‡è¤‡ãŒã‚ã‚‹å ´åˆã®ã¿ã€ 中断ã•ã‚Œã¾ã™ã€‚ -f/--force ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 変更内容をãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ãŸä¸Šã§ã€ 未コミット変更ã®ä¸Šã‹ã‚‰ã€\n"
+" パッãƒãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid "no saved queues found, please use -n\n"
+msgstr "ä¿å­˜ã•ã‚ŒãŸãƒ‘ッãƒç®¡ç†é ˜åŸŸãŒã‚ã‚Šã¾ã›ã‚“。 -n を使用ã—ã¦ãã ã•ã„\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "パッãƒç®¡ç†é ˜åŸŸ %s ã¨ãƒžãƒ¼ã‚¸ä¸­\n"
+
+msgid "pop all patches"
+msgstr "å…¨ã¦ã®ãƒ‘ッãƒã®é©ç”¨ã‚’解除"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "パッãƒè§£é™¤å…ˆã®ãƒ‘ッãƒç®¡ç†é ˜åŸŸå(éžæŽ¨å¥¨)"
+
+msgid "forget any local changes to patched files"
+msgstr "パッãƒå¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹ä½œæ¥­é ˜åŸŸä¸­ã®å¤‰æ›´ã‚’破棄"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [PATCH | INDEX]"
+
+msgid "pop the current patch off the stack"
+msgstr "ç¾è¡Œãƒ‘ッãƒã®é©ç”¨è§£é™¤"
+
+msgid ""
+" Without argument, pops off the top of the patch stack. If given a\n"
+" patch name, keeps popping off patches until the named patch is at\n"
+" the top of the stack."
+msgstr ""
+" 引数指定ãŒç„¡ã„å ´åˆã€ é©ç”¨ä¸­ãƒ‘ッãƒç¾¤ã®ã†ã¡ã€ 最上ä½ãƒ‘ッãƒã‚’解除ã—ã¾ã™ã€‚\n"
+" パッãƒåãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 当該パッãƒãŒé©ç”¨æœ€ä¸Šä½ãƒ‘ッãƒã«ãªã‚‹ã¾ã§ã€\n"
+" ä»–ã®ãƒ‘ッãƒã®é©ç”¨è§£é™¤ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and discard\n"
+" changes made to such files."
+msgstr ""
+" 作業領域ã«æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ãŒã‚ã‚‹å ´åˆã€ 通常ã¯ã‚³ãƒžãƒ³ãƒ‰ãŒä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" --keep-changes ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 未コミット変更ã¨ãƒ‘ッãƒã¨ã®é–“ã§ã€\n"
+" é‡è¤‡ãŒã‚ã‚‹å ´åˆã®ã¿ã€ 中断ã•ã‚Œã¾ã™ã€‚ -f/--force ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 変更内容をãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã—ãŸä¸Šã§ã€ 未コミット変更ã®å†…容を破棄ã—ã¾ã™ã€‚"
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "パッãƒç®¡ç†é ˜åŸŸ %s を使用中\n"
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename PATCH1 [PATCH2]"
+
+msgid "rename a patch"
+msgstr "パッãƒã®æ”¹å"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" 引数ãŒ1ã¤ã®å ´åˆã€ ç¾è¡Œãƒ‘ッãƒã‚’指定ã•ã‚ŒãŸåå‰ã«æ”¹åã—ã¾ã™ã€‚\n"
+" 引数ãŒ2ã¤ã®å ´åˆã€ 1ã¤ç›®ã®ãƒ‘ッãƒã®åå‰ã‚’2ã¤ç›®ã«æ”¹åã—ã¾ã™ã€‚"
+
+msgid "delete save entry"
+msgstr "ä¿å­˜ã‚¨ãƒ³ãƒˆãƒªã®ç ´æ£„"
+
+msgid "update queue working directory"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®æ›´æ–°"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] REV"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr "指定リビジョンã«ã‚ˆã£ã¦ä¿å­˜ã•ã‚ŒãŸãƒ‘ッãƒç®¡ç†çŠ¶æ…‹ã®å¾©æ—§(éžæŽ¨å¥¨)"
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " 本コマンドã¯éžæŽ¨å¥¨ã§ã™ã€‚ :hg:`rebase` を使用ã—ã¦ãã ã•ã„。"
+
+msgid "copy patch directory"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã®è¤‡è£½"
+
+msgid "copy directory name"
+msgstr "複製先ディレクトリå"
+
+msgid "clear queue status file"
+msgstr "パッãƒçŠ¶æ…‹ãƒ•ã‚¡ã‚¤ãƒ«(status)ã®ã‚¯ãƒªã‚¢"
+
+msgid "force copy"
+msgstr "複製ã®å¼·è¡Œ"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr "パッãƒç®¡ç†çŠ¶æ…‹ã®ä¿å­˜(éžæŽ¨å¥¨)"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "ä¿å­˜å…ˆ %s ã¯æ—¢å­˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "ä¿å­˜å…ˆ %s ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 実施ã™ã‚‹å ´åˆã¯ -f を指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«è¤‡è£½ã—ã¾ã™\n"
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr "指定リビジョンã®å‰Šé™¤ (本オプション無ã—ã§ã‚‚リビジョン指定å¯èƒ½)"
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr "リビジョンを強制的ã«å‰Šé™¤ã—〠未コミット変更内容を破棄(ä¿å­˜ç„¡ã—)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+"指定リビジョンよりリビジョン番å·ãŒå¤§ããå­å­«ä»¥å¤–ã®ã‚‚ã®ã‚’ bundle 化(éžæŽ¨å¥¨)"
+
+msgid "no backups"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—作æˆã®æŠ‘æ­¢"
+
+msgid "no backups (DEPRECATED)"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—作æˆã®æŠ‘æ­¢(éžæŽ¨å¥¨)"
+
+msgid "ignored (DEPRECATED)"
+msgstr "※ ã“ã®ã‚ªãƒ—ションã¯ç„¡è¦–ã•ã‚Œã¾ã™ (éžæŽ¨å¥¨)"
+
+msgid "do not modify working copy during strip"
+msgstr "処ç†ä¸­ã®ä½œæ¥­é ˜åŸŸæ›´æ–°ã‚’抑止"
+
+msgid "remove revs only reachable from given bookmark"
+msgstr "指定ブックマークã‹ã‚‰ã€ 到é”å¯èƒ½ãªãƒªãƒ“ジョンã®ã¿ã‚’除外"
+
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
+msgstr "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®ã€ 特定リビジョンãŠã‚ˆã³ãã®å­å­«ã®é™¤å¤–"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+" :hg:`strip` ã¯æŒ‡å®šã®ãƒªãƒ“ジョンãŠã‚ˆã³ã€ 指定リビジョンã®å­å­«ã‚’\n"
+" å–り除ãã¾ã™ã€‚ 作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã€\n"
+" --force ãŒæŒ‡å®šã•ã‚Œãªã„é™ã‚Šã¯å‡¦ç†ã‚’中断ã—ã¾ã™ã€‚\n"
+" --force ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 変更内容ã¯ç ´æ£„ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" 作業領域ã®è¦ªãƒªãƒ“ジョンãŒé™¤å¤–対象ã«ãªã£ãŸå ´åˆã€ 除外æ“作ã®å®Œäº†å¾Œã«ã€\n"
+" 除外ã•ã‚ŒãŸè¦ªãƒªãƒ“ジョンã®ç¥–å…ˆã®ä¸­ã§ã€ 最も近ã„有効ãªãƒªãƒ“ジョンã§ã€\n"
+" 作業領域を更新ã—ã¾ã™ã€‚"
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+" 除外ã•ã‚ŒãŸãƒªãƒ“ジョンã¯ã€ bundle å½¢å¼ã§ ``.hg/strip-backup`` é…下ã«\n"
+" 退é¿ã•ã‚Œã¾ã™(bundle å½¢å¼ã«é–¢ã—ã¦ã¯ :hg:`help bundle` ãŠã‚ˆã³\n"
+" :hg:`help unbundle` å‚ç…§)。 除外ã®éš›ã«ä½œæˆã•ã‚ŒãŸ BUNDLE ファイルã§\n"
+" :hg:`unbundle .hg/strip-backup/BUNDLE` を実施ã™ã‚‹ã“ã¨ã§\n"
+" 除外ã•ã‚ŒãŸãƒªãƒ“ジョンを復旧ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 通常〠復旧ã®éš›ã«ã¯\n"
+" リビジョン番å·ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã®ã§æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+" 除外処ç†å®Œäº†æ™‚点㧠bundle ファイルを破棄ã™ã‚‹å ´åˆã¯\n"
+" --no-backup を指定ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Strip is not a history-rewriting operation and can be used on\n"
+" changesets in the public phase. But if the stripped changesets have\n"
+" been pushed to a remote repository you will likely pull them again."
+msgstr ""
+" 本コマンドã§ã®æ“作ã¯ã€ 履歴ã®æ›¸ãæ›ãˆã§ã¯ãªã„ã®ã§ã€ 対象リビジョンãŒ\n"
+" public フェーズã§ã‚‚〠実行å¯èƒ½ã§ã™ã€‚ 但ã—〠除外対象リビジョンãŒã€\n"
+" 他リãƒã‚¸ãƒˆãƒªã«å映済ã¿ã§ã‚ã‚‹å ´åˆã€ ãã®ãƒªãƒ“ジョン㯠pull æ“作ã«ã‚ˆã‚Šã€\n"
+" å†ã³æ‰‹å…ƒã®ãƒªãƒã‚¸ãƒˆãƒªã«å‡ºç¾ã™ã‚‹ã“ã¨ã§ã—ょã†ã€‚"
+
+#, python-format
+msgid "bookmark '%s' not found"
+msgstr "ブックマーク '%s' ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "bookmark '%s' deleted\n"
+msgstr "ブックマーク '%s' ãŒç ´æ£„ã•ã‚Œã¾ã—ãŸ\n"
+
+msgid "empty revision set"
+msgstr "指定ã«è©²å½“ã™ã‚‹ãƒªãƒ“ジョンã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "disable all guards"
+msgstr "å…¨ã¦ã®ã‚¬ãƒ¼ãƒ‰è¨­å®šã‚’破棄"
+
+msgid "list all guards in series file"
+msgstr "å„パッãƒã«è¨­å®šã•ã‚ŒãŸã‚¬ãƒ¼ãƒ‰ã‚’一覧化"
+
+msgid "pop to before first guarded applied patch"
+msgstr "é©ç”¨å¯å¦ãŒå¤‰åŒ–ã™ã‚‹ãƒ‘ッãƒã®é©ç”¨ã‚’解除"
+
+msgid "pop, then reapply patches"
+msgstr "qpop 実施後ã«å†åº¦ãƒ‘ッãƒã‚’é©ç”¨"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [OPTION]... [GUARD]..."
+
+msgid "set or print guarded patches to push"
+msgstr "作業領域ã«ãŠã‘るガードé¸æŠžã®è¨­å®šãªã„ã—表示"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+" パッãƒæ¯Žã®ã‚¬ãƒ¼ãƒ‰è¨­å®šãªã„ã—表示ã«ã¯ :hg:`qguard` を〠作業領域ã«ãŠã‘ã‚‹\n"
+" ガードã®é¸æŠžãªã„ã—表示ã«ã¯ :hg:`qselect` を使用ã—ã¾ã™ã€‚ ガードãŒè¨­å®š\n"
+" ã•ã‚Œã¦ã„ãªã„ã‹ã€ 何らã‹ã®ã€Œæ­£ã€ã®ã‚¬ãƒ¼ãƒ‰ãŒã‚¬ãƒ¼ãƒ‰é¸æŠžã«åˆè‡´ã™ã‚‹å ´åˆã«ã¯\n"
+" パッãƒãŒé©ç”¨ã•ã‚Œã¾ã™ãŒã€ 何らã‹ã®ã€Œè² ã€ã®ã‚¬ãƒ¼ãƒ‰ãŒã‚¬ãƒ¼ãƒ‰é¸æŠžã«åˆè‡´ã™ã‚‹\n"
+" å ´åˆã«ã¯ãƒ‘ッãƒã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。 例ãˆã°::"
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+" qguard foo.patch -- -stable (「負ã€ã®ã‚¬ãƒ¼ãƒ‰)\n"
+" qguard bar.patch +stable (「正ã€ã®ã‚¬ãƒ¼ãƒ‰)\n"
+" qselect stable"
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+" 上記㮠qselect 実行ã«ã‚ˆã‚Šã€ \"stable\" ガードãŒé¸æŠžã•ã‚Œã¾ã™ã€‚ MQ ã¯\n"
+" foo.patch ã®é©ç”¨ã‚’(「負ã€ã®ã‚¬ãƒ¼ãƒ‰ã«åˆè‡´ã™ã‚‹ãŸã‚)見é€ã‚Šã¾ã™ãŒã€\n"
+" bar.patch ã®é©ç”¨ã¯(「正ã€ã®ã‚¬ãƒ¼ãƒ‰ã«åˆè‡´ã™ã‚‹ãŸã‚)実施ã—ã¾ã™ã€‚"
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+" 本コマンドãŒå¼•æ•°ç„¡ã—ã§å®Ÿè¡Œã•ã‚ŒãŸå ´åˆã€ ç¾åœ¨ã®ã‚¬ãƒ¼ãƒ‰é¸æŠžçŠ¶æ³ã‚’表示\n"
+" ã—ã¾ã™ã€‚ 引数ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ガードé¸æŠžã‚’設定ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+" -n/--none を指定ã™ã‚‹ã“ã¨ã§ã€ ガードé¸æŠžã‚’無効化ã—ã¾ã™(ä»–ã®å¼•æ•°ã¯å¿…è¦\n"
+" ã‚ã‚Šã¾ã›ã‚“)。 ã„ãšã‚Œã®ã‚¬ãƒ¼ãƒ‰ã‚‚é¸æŠžã•ã‚Œã¦ã„ãªã„å ´åˆã€ 「正ã€ã®ã‚¬ãƒ¼ãƒ‰ãŒ\n"
+" 設定ã•ã‚ŒãŸãƒ‘ッãƒã®é©ç”¨ã¯è¦‹é€ã‚‰ã‚Œã¾ã™ãŒã€ 「負ã€ã®ã‚¬ãƒ¼ãƒ‰ãŒè¨­å®šã•ã‚ŒãŸ\n"
+" パッãƒã¯é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+" 本コマンドã®å®Ÿè¡Œã«ã‚ˆã‚Šã€ é©ç”¨ä¸­ã®ãƒ‘ッãƒã®é©ç”¨å¯å¦ã‚‚変化ã—å¾—ã¾ã™ã€‚ \n"
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ ガードãŒæœ‰åŠ¹ãªãƒ‘ッãƒã®é©ç”¨è§£é™¤ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。\n"
+" --pop ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ é©ç”¨å¯å¦ãŒå¤‰ã‚る最åˆã®ãƒ‘ッãƒã¾ã§ã®ãƒ‘ッãƒãŒã€\n"
+" é©ç”¨è§£é™¤ã•ã‚Œã¾ã™ã€‚ --reapply ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ --pop 相当ã®å‡¦ç†å¾Œã«ã€\n"
+" ガードãŒæœ‰åŠ¹ãªãƒ‘ッãƒã®é©ç”¨ã‚’見é€ã‚Šã¤ã¤ã€ ç¾è¡Œãƒ‘ッãƒã«è‡³ã‚‹ã¾ã§ã€\n"
+" パッãƒã‚’å†é©ç”¨ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+" -s/--series ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ パッãƒã«è¨­å®šã•ã‚ŒãŸã‚¬ãƒ¼ãƒ‰ã‚’一覧化ã—ã¦\n"
+" 表示ã—ã¾ã™(ä»–ã®å¼•æ•°ã¯ä¸è¦)。 詳細表示ã«ã¯ -v を指定ã—ã¦ãã ã•ã„。"
+
+msgid "guards deactivated\n"
+msgstr "ガード設定を無効化ã—ã¾ã™\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr "ガード設定ã®å¤‰æ›´ã«ã‚ˆã‚Šã€ é©ç”¨é™¤å¤–パッãƒæ•°ãŒ %d ã‹ã‚‰ %d ã«ãªã‚Šã¾ã—ãŸ\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr "ガード設定ã®å¤‰æ›´ã«ã‚ˆã‚Šã€ é©ç”¨å¯¾è±¡ãƒ‘ッãƒæ•°ãŒ %d ã‹ã‚‰ %d ã«ãªã‚Šã¾ã—ãŸ\n"
+
+msgid "guards in series file:\n"
+msgstr "パッãƒã«è¨­å®šã•ã‚Œã¦ã„るガードã®ä¸€è¦§:\n"
+
+msgid "no guards in series file\n"
+msgstr "ガードãŒè¨­å®šã•ã‚ŒãŸãƒ‘ッãƒã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "active guards:\n"
+msgstr "有効ãªã‚¬ãƒ¼ãƒ‰:\n"
+
+msgid "no active guards\n"
+msgstr "有効ãªã‚¬ãƒ¼ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "popping guarded patches\n"
+msgstr "ガードãŒæœ‰åŠ¹ãªãƒ‘ッãƒã‚’解除中\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "ガードãŒç„¡åŠ¹ãªãƒ‘ッãƒã‚’å†é©ç”¨ä¸­\n"
+
+msgid "finish all applied changesets"
+msgstr "å…¨ã¦ã®é©ç”¨ä¸­ãƒ‘ッãƒã‚’通常リビジョン化"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "move applied patches into repository history"
+msgstr "é©ç”¨ä¸­ãƒ‘ッãƒã®é€šå¸¸ãƒªãƒ“ジョン化"
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒªãƒ“ジョン(é©ç”¨ä¸­ãƒ‘ッãƒã«ç›¸å½“)を〠MQ 管ç†ä¸‹ã‹ã‚‰é™¤å¤–ã—ã€\n"
+" 通常ã®ãƒªãƒ“ジョンã¨ã—ã¦ãƒªãƒã‚¸ãƒˆãƒªã«è¨˜éŒ²ã—ã¾ã™ã€‚"
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+" リビジョン範囲指定や〠-a/--applied ãŒæŒ‡å®šå¯èƒ½ã§ã™ã€‚ --applied ãŒæŒ‡å®š\n"
+" ã•ã‚ŒãŸå ´åˆã€ å…¨ã¦ã®é©ç”¨ä¸­ãƒ‘ッãƒãŒ MQ 管ç†ä¸‹ã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚ ãã‚Œ\n"
+" 以外ã®å ´åˆã€ 指定ã•ã‚ŒãŸãƒªãƒ“ジョンã¯ã€ é©ç”¨ä¸­ã‚¹ã‚¿ãƒƒã‚¯ã®æœ€ä¸‹ä½ã‹ã‚‰ã®\n"
+" 一連ã®ãƒªãƒ“ジョンã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+" ã“ã®æ©Ÿèƒ½ã¯ã€ 上æµã®ãƒªãƒã‚¸ãƒˆãƒªã§ãƒ‘ッãƒãŒå—ç†ã•ã‚ŒãŸå ´åˆã‚„ã€\n"
+" パッãƒå†…容を上æµãƒªãƒã‚¸ãƒˆãƒªã«å映ã™ã‚‹å ´åˆãªã©ã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid "no revisions specified"
+msgstr "リビジョン指定ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "warning: uncommitted changes in the working directory\n"
+msgstr "警告: 作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™\n"
+
+msgid "list all available queues"
+msgstr "有効ãªã‚­ãƒ¥ãƒ¼ã®ä¸€è¦§è¡¨ç¤º"
+
+msgid "print name of active queue"
+msgstr "アクティブãªã‚­ãƒ¥ãƒ¼åã®è¡¨ç¤º"
+
+msgid "create new queue"
+msgstr "æ–°è¦ã‚­ãƒ¥ãƒ¼ã®ä½œæˆ"
+
+msgid "rename active queue"
+msgstr "ç¾è¡Œã‚­ãƒ¥ãƒ¼ã®æ”¹å"
+
+msgid "delete reference to queue"
+msgstr "キューã¸ã®å‚ç…§ã®å‰Šé™¤"
+
+msgid "delete queue, and remove patch dir"
+msgstr "キューãŠã‚ˆã³ç®¡ç†ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å‰Šé™¤"
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[OPTION] [QUEUE]"
+
+msgid "manage multiple patch queues"
+msgstr "複数ã®ãƒ‘ッãƒã‚­ãƒ¥ãƒ¼ã®ç®¡ç†"
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+" 複数ã®ç•°ãªã‚‹ãƒ‘ッãƒã‚­ãƒ¥ãƒ¼ã®é–“ã§ã®åˆ‡ã‚Šæ›¿ãˆã€ æ–°è¦ãƒ‘ッãƒã‚­ãƒ¥ãƒ¼ã®ä½œæˆ\n"
+" ãŠã‚ˆã³æ—¢å­˜ãƒ‘ッãƒã‚­ãƒ¥ãƒ¼ã®å‰Šé™¤ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+" only the name of the active queue."
+msgstr ""
+" キューå称を指定ã—ãªã„ã‹ã€ -l/--list ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 登録済ã¿ã®\n"
+" キューã®ä¸€è¦§ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ - 通常㯠\"normal\" パッãƒã‚­ãƒ¥ãƒ¼ãŒç™»éŒ²\n"
+" 済ã¿ã§ã™ã€‚ 当該時点ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚­ãƒ¥ãƒ¼ã«ã¯ \"(アクティブ)\" ãŒè¡¨ç¤º\n"
+" ã•ã‚Œã¾ã™ã€‚ --active ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 表示対象ã¨ãªã‚‹ã‚­ãƒ¥ãƒ¼ã¯ã€\n"
+" アクティブãªã‚­ãƒ¥ãƒ¼ã®ã¿ã§ã™"
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+" -c/--create ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ æ–°è¦ã‚­ãƒ¥ãƒ¼ã‚’作æˆã—ã¾ã™ã€‚ 当該時点ã§\n"
+" アクティブãªã‚­ãƒ¥ãƒ¼ã‹ã‚‰ãƒ‘ッãƒãŒé©ç”¨ä¸­ã®å ´åˆã‚’除ã〠新è¦ä½œæˆã•ã‚ŒãŸ\n"
+" キューãŒè‡ªå‹•çš„ã«ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚­ãƒ¥ãƒ¼ã¨ãªã‚Šã¾ã™ã€‚ ã“ã®å ´åˆã€\n"
+" æ–°è¦ã‚­ãƒ¥ãƒ¼ã¯ç”Ÿæˆã•ã‚Œã¾ã™ãŒã‚­ãƒ¥ãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+" --delete ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 既存ã®ã‚­ãƒ¥ãƒ¼ã‚’削除ã—ã¾ã™ã€‚\n"
+" 当該時点ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚­ãƒ¥ãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。"
+
+msgid "patches applied - cannot set new queue active"
+msgstr "パッãƒé©ç”¨ä¸­ - æ–°è¦ã‚­ãƒ¥ãƒ¼ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã§ãã¾ã›ã‚“"
+
+msgid "cannot delete queue that does not exist"
+msgstr "存在ã—ãªã„キューã¯å‰Šé™¤ã§ãã¾ã›ã‚“"
+
+msgid "cannot delete currently active queue"
+msgstr "ç¾æ™‚点ã§ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚­ãƒ¥ãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“"
+
+msgid " (active)\n"
+msgstr " (アクティブ)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr "\":\\/.\" ã‚’å«ã‚€ä¸æ­£ãªã‚­ãƒ¥ãƒ¼å称ã§ã™"
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "キュー \"%s\" ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "\"%s\" ã‚’åŒã˜åå‰ã«æ”¹åã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "パッãƒç®¡ç†é ˜åŸŸã§ãªã„åŒåディレクトリ \"%s\" ãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "use --create to create a new queue"
+msgstr "æ–°è¦ã‚­ãƒ¥ãƒ¼ã®ä½œæˆã«ã¯ --create を指定ã—ã¦ãã ã•ã„"
+
+msgid "cannot commit over an applied mq patch"
+msgstr "MQ パッãƒé©ç”¨ä¸­ã¯ã‚³ãƒŸãƒƒãƒˆã‚’実施ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "MQ ã®çŠ¶æ…‹ç®¡ç†ãƒ•ã‚¡ã‚¤ãƒ«ãŒæœªçŸ¥ã®ãƒªãƒ“ジョン %s ã‚’å‚ç…§ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "tag %s overrides mq patch of the same name\n"
+msgstr "ã‚¿ã‚° %s 㯠MQ パッãƒã®åŒåタグを上書ãã—ã¾ã™\n"
+
+msgid "cannot import over an applied patch"
+msgstr "パッãƒé©ç”¨ä¸­ã® import ã«ã‚ˆã‚‹å–ã‚Šè¾¼ã¿ã¯ã§ãã¾ã›ã‚“"
+
+msgid "only a local queue repository may be initialized"
+msgstr "手元ã®ã‚­ãƒ¥ãƒ¼ã®ãƒªãƒã‚¸ãƒˆãƒªã—ã‹åˆæœŸåŒ–ã§ãã¾ã›ã‚“"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "Mercurial リãƒã‚¸ãƒˆãƒªãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“(.hg ãŒä¸åœ¨ã§ã™)"
+
+msgid "no queue repository"
+msgstr "キューã®ãƒªãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%d applied"
+msgstr "é©ç”¨ãƒ‘ッãƒæ•° %d"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "未é©ç”¨ãƒ‘ッãƒæ•° %d"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (空キュー)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+" MQ 管ç†ä¸‹ã«ã‚るリビジョン"
+
+msgid "mq takes no arguments"
+msgstr "mq ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "operate on patch repository"
+msgstr "パッãƒç®¡ç†ãƒªãƒã‚¸ãƒˆãƒªã¸ã®æ“作"
+
+msgid "hooks for sending email push notifications"
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã«ã‚ˆã‚‹ push 通知é€ä¿¡ç”¨ãƒ•ãƒƒã‚¯é›†"
+
+msgid ""
+"This extension implements hooks to send email notifications when\n"
+"changesets are sent from or received by the local repository."
+msgstr ""
+"本エクステンションã§ã¯ã€ 変更履歴ãŒã€ 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«å–ã‚Šè¾¼ã¾ã‚ŒãŸã‚Šã€\n"
+"ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã¸ã¨å映ã•ã‚ŒãŸã®ã‚’契機ã«ã€ é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã®ã€\n"
+"フックをæä¾›ã—ã¾ã™ã€‚"
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
+"are run when changesets are received, while ``outgoing`` hooks are for\n"
+"changesets sent to another repository::"
+msgstr ""
+":hg:`help extensions` ã«ãªã‚‰ã£ã¦ã€ 本エクステンションを有効ã«ã—ãŸä¸Šã§ã€\n"
+"実行ã—ãŸã„フックを登録ã—ã¦ãã ã•ã„。 `incoming`` ãŠã‚ˆã³ ``changegroup``\n"
+"フックã¯å±¥æ­´ã®å–ã‚Šè¾¼ã¿ã§ã€ ``outgoing`` ã¯å±¥æ­´ã®å映ã®éš›ã«å®Ÿè¡Œã•ã‚Œã¾ã™::"
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+" [hooks]\n"
+" # å–ã‚Šè¾¼ã¿å‡¦ç†æ™‚ã«ãƒªãƒ“ジョン毎ã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # å–ã‚Šè¾¼ã¿å‡¦ç†æ¯Žã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡\n"
+" changegroup.notify = python:hgext.notify.hook"
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+" # å映処ç†æ¯Žã«ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡\n"
+" outgoing.notify = python:hgext.notify.hook"
+
+msgid ""
+"This registers the hooks. To enable notification, subscribers must\n"
+"be assigned to repositories. The ``[usersubs]`` section maps multiple\n"
+"repositories to a given recipient. The ``[reposubs]`` section maps\n"
+"multiple recipients to a single repository::"
+msgstr ""
+"上記ã®è¨­å®šã«ã‚ˆã‚Šã€ フックãŒç™»éŒ²ã•ã‚Œã¾ã™ã€‚ メール通知を有効ã«ã™ã‚‹ã«ã¯ã€\n"
+"リãƒã‚¸ãƒˆãƒªæ¯Žã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆ (subscriber:購読者) 設定ãŒå¿…è¦ã§ã™ã€‚\n"
+"``[usersubs]`` ã¯å˜ä¸€è³¼èª­è€…ã«è¤‡æ•°ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’設定ã—ã¾ã™ã€‚\n"
+"``[reposubs]`` ã¯å˜ä¸€ãƒªãƒã‚¸ãƒˆãƒªã«è¤‡æ•°ã®è³¼èª­è€…を設定ã—ã¾ã™ã€‚"
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of repo glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+" [usersubs]\n"
+" # 左辺ã«ã¯é€ä¿¡å…ˆãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€å³è¾ºã«ã¯ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã®\n"
+" # リãƒã‚¸ãƒˆãƒªåˆè‡´(glob)パターンを記述ã—ã¦ãã ã•ã„\n"
+" user@host = pattern"
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+" # 左辺ã«ã¯åˆè‡´ãƒ‘ターンã€å³è¾ºã«ã¯ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã®é€ä¿¡å…ˆãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’\n"
+" # 記述ã—ã¦ãã ã•ã„\n"
+" pattern = user@host"
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root."
+msgstr "åˆè‡´ãƒ‘ターンã®é©ç”¨å¯¾è±¡ã¯ã€ リãƒã‚¸ãƒˆãƒªãƒ«ãƒ¼ãƒˆã®çµ¶å¯¾ãƒ‘スã§ã™ã€‚"
+
+msgid ""
+"In order to place them under direct user management, ``[usersubs]`` and\n"
+"``[reposubs]`` sections may be placed in a separate ``hgrc`` file and\n"
+"incorporated by reference::"
+msgstr ""
+"``[usersubs]`` ãŠã‚ˆã³ ``[reposubs]`` 設定を〠別ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«è¨˜è¿°ã—ã¦ã€\n"
+"ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚€ã‚ˆã†ã«ã™ã‚‹ã“ã¨ã§ã€ メールé€ä¿¡å…ˆãƒ¦ãƒ¼ã‚¶ã®ç®¡ç†ã‚’ã€\n"
+"独立ã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™::"
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+
+msgid ""
+"Notifications will not be sent until the ``notify.test`` value is set\n"
+"to ``False``; see below."
+msgstr ""
+"``notify.test`` 設定を ``False`` ã«ã—ãªã„é™ã‚Šã€ メールã¯é€ä¿¡ã•ã‚Œã¾ã›ã‚“。\n"
+"詳細ã¯å¾Œè¿°ã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr "通知内容ã¯ã€ 以下ã®è¨­å®šã«ã‚ˆã‚Šå¤‰æ›´å¯èƒ½ã§ã™:"
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+"notify.test\n"
+" 真値ã®å ´åˆã€ 生æˆã•ã‚ŒãŸé€šçŸ¥å†…容ã¯ã€ 標準出力ã«æ›¸ã出ã•ã‚Œã¾ã™\n"
+" (メールé€ä¿¡ç„¡ã—)。 デフォルト値㯠True"
+
+msgid ""
+"notify.sources\n"
+" Space-separated list of change sources. Notifications are activated only\n"
+" when a changeset's source is in this list. Sources may be:"
+msgstr ""
+"notify.sources\n"
+" 空白区切りã®å¤‰æ›´å映元一覧。 変更å映元ãŒä¸€è¦§è¦ç´ ã¨åˆè‡´ã™ã‚‹å ´åˆã®ã¿ã€\n"
+" メールé€ä¿¡ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™ã€‚ 指定å¯èƒ½ãªè¦ç´ ã¯:"
+
+msgid ""
+" :``serve``: changesets received via http or ssh\n"
+" :``pull``: changesets received via ``hg pull``\n"
+" :``unbundle``: changesets received via ``hg unbundle``\n"
+" :``push``: changesets sent or received via ``hg push``\n"
+" :``bundle``: changesets sent via ``hg unbundle``"
+msgstr ""
+" :``serve``: http ã¾ãŸã¯ ssh 経由ã§ã®å–ã‚Šè¾¼ã¿\n"
+" :``pull``: ``hg pull`` 経由ã§ã®å–ã‚Šè¾¼ã¿\n"
+" :``unbundle``: ``hg unbundle`` 経由ã§ã®å–ã‚Šè¾¼ã¿\n"
+" :``push``: ``hg push`` 経由ã§ã®å映ï¼å–ã‚Šè¾¼ã¿\n"
+" :``bundle``: ``hg unbundle`` 経由ã§ã®å映"
+
+msgid " Default: serve."
+msgstr " デフォルト値㯠serve ã§ã™ã€‚"
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+" reference repositories with their absolute path. ``notify.strip`` lets "
+"you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+"notify.strip\n"
+" URL パス冒頭ã‹ã‚‰å–り除ã〠スラッシュ数。 無指定時ã¯ã€\n"
+" リãƒã‚¸ãƒˆãƒªã®çµ¶å¯¾ãƒ‘スãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ``notify.strip`` ã«ã‚ˆã£ã¦ã€\n"
+" リãƒã‚¸ãƒˆãƒªã®ãƒ‘スを〠相対パス化ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 例ãˆã°ã€\n"
+" ``notify.strip=3`` 㯠``/long/path/repository`` を ``repository``\n"
+" ã«æ”¹å¤‰ã—ã¾ã™ã€‚ デフォルト値㯠0。"
+
+msgid ""
+"notify.domain\n"
+" Default email domain for sender or recipients with no explicit domain."
+msgstr ""
+"notify.domain\n"
+" 明示的ãªãƒ‰ãƒ¡ã‚¤ãƒ³ãŒç„¡ã„å ´åˆã®ã€ é€ä¿¡å…ƒï¼å…ˆãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã€‚"
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+"notify.style\n"
+" メール本文ã®æ•´å½¢ã«ç”¨ã„る〠スタイルファイルå。"
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+"notify.template\n"
+" メール本文ã®æ•´å½¢ã«ç”¨ã„る〠テンプレート指定。"
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as an incoming hook, overriding ``notify."
+"template``."
+msgstr ""
+"notify.incoming\n"
+" incoming フックã§ä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レート指定。 設定ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" ``notify.template`` ã«å„ªå…ˆã—ã¾ã™ã€‚"
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as an outgoing hook, overriding ``notify."
+"template``."
+msgstr ""
+"notify.outgoing\n"
+" outgoing フックã§ä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レート設定。 設定ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" ``notify.template`` ã«å„ªå…ˆã—ã¾ã™ã€‚"
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as a changegroup hook, overriding\n"
+" ``notify.template``."
+msgstr ""
+"notify.changegroup\n"
+" changegroup フックã§ä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レート設定。 設定ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" ``notify.template`` ã«å„ªå…ˆã—ã¾ã™ã€‚"
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, or -1 to include all of it. Default: 300."
+msgstr ""
+"notify.maxdiff\n"
+" メール本文ã«å«ã‚る〠差分情報ã®æœ€å¤§è¡Œæ•°ã€‚ 0 ã®å ´åˆã¯ã€ 差分ãŒå«ã¾ã‚Œãšã€\n"
+" -1 ã®å ´åˆã¯ã€ 全差分行ãŒå«ã¾ã‚Œã¾ã™ã€‚ デフォルト値㯠300。"
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in email's subject line. Default: 67."
+msgstr ""
+"notify.maxsubject\n"
+" メール表題 (subject) ã®æœ€å¤§æ–‡å­—数。 デフォルト値㯠67。"
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+"notify.diffstat\n"
+" 差分統計 (diffstat) 通知ã®æœ‰ç„¡ã€‚ デフォルト値㯠True。"
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+"notify.merge\n"
+" マージ実施リビジョンã«é–¢ã™ã‚‹ã€ 通知ã®æœ‰ç„¡ã€‚ デフォルト値㯠True。"
+
+msgid ""
+"notify.mbox\n"
+" If set, append mails to this mbox file instead of sending. Default: None."
+msgstr ""
+"notify.mbox\n"
+" 値ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ mbox ファイル指定ã¨ã¿ãªã—〠メールé€ä¿¡ã®ä»£ã‚ã‚Šã«ã€\n"
+" é€ä¿¡å†…容を mbox ファイルã«è¿½è¨˜ã—ã¾ã™ã€‚ デフォルト値ã¯ç„¡è¨­å®šã€‚"
+
+msgid ""
+"notify.fromauthor\n"
+" If set, use the committer of the first changeset in a changegroup for\n"
+" the \"From\" field of the notification mail. If not set, take the user\n"
+" from the pushing repo. Default: False."
+msgstr ""
+"notify.fromauthor\n"
+" 真値ã®å ´åˆã€ 通知契機リビジョン群ã®ã€ 先頭リビジョンã®ãƒ¦ãƒ¼ã‚¶åã‚’ã€\n"
+" 通知メール㮠\"From\" フィールドã«ä½¿ç”¨ã—ã¾ã™ã€‚ ãれ以外ã®å ´åˆã¯ã€\n"
+" 変更å映元ã‹ã‚‰ã®ã€ ユーザå情報を利用ã—ã¾ã™ã€‚ デフォルト値㯠False。"
+
+msgid ""
+"If set, the following entries will also be used to customize the\n"
+"notifications:"
+msgstr "通知ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã«ã¯ã€ 以下ã®è¨­å®šã‚‚利用å¯èƒ½ã§ã™:"
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in the generated\n"
+" email content."
+msgstr ""
+"email.from\n"
+" 生æˆã•ã‚ŒãŸé€šçŸ¥ãƒ¡ãƒ¼ãƒ«æœ¬æ–‡ã«ã€ 相当ã™ã‚‹æƒ…å ±ãŒç„¡ã„å ´åˆã¯ã€ ã“ã®å€¤ãŒ\n"
+" ``From`` フィールドã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"web.baseurl\n"
+" Root repository URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+"web.baseurl\n"
+" リãƒã‚¸ãƒˆãƒªã®ãƒ‘スã¨çµ„ã¿åˆã‚ã›ã¦ã€ å‚照用 URL を生æˆã™ã‚‹ URL ベース。\n"
+" ``notify.strip`` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d 件ã®æ–°ã—ã„リビジョン"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: %d 購読者㫠%d 変更をé€ä¿¡ä¸­\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"差分 (%d è¡Œã‹ã‚‰ %d è¡Œã«åˆ‡ã‚Šè©°ã‚):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"差分 (%d 行):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr "notify: マージ %d:%s ã®é€šçŸ¥ã‚’抑止中\n"
+
+msgid "browse command output with an external pager"
+msgstr "コマンド出力ã«å¯¾ã™ã‚‹å¤–部ページャーã®ä½¿ç”¨"
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr "使用ã™ã‚‹ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¨­å®šã¯ã€ 以下ã®ã‚ˆã†ãªè¨­å®šã§è¡Œã„ã¾ã™::"
+
+msgid ""
+" [pager]\n"
+" pager = less -FRX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+"上記設定ãŒç„¡ã„å ´åˆã€ 本エクステンション㯠PAGER 環境変数をå‚ç…§ã—ã¾ã™ã€‚\n"
+"pager.pager ã‚‚ PAGER も未設定ã®å ´åˆã€ 本エクステンションã¯ä½•ã‚‚ã—ã¾ã›ã‚“。"
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+"pager.ignore 設定ã«ã‚³ãƒžãƒ³ãƒ‰åを列挙ã™ã‚‹ã“ã¨ã§ã€ 当該コマンド実行ã§ã®ã€\n"
+"ページャーã®ä½¿ç”¨ã‚’抑止ã§ãã¾ã™::"
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+" [pager]\n"
+" ignore = version, help, update"
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+"pager.attend 設定ã«ã‚³ãƒžãƒ³ãƒ‰åを列挙ã™ã‚‹ã“ã¨ã§ã€ ページャーã®ä½¿ç”¨ã‚’ã€\n"
+"当該コマンド実行時ã«é™å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ 以下ã®è¨­å®šä¾‹ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€\n"
+"デフォルトã®ãƒšãƒ¼ã‚¸ãƒ£ãƒ¼ä½¿ç”¨å¯¾è±¡ã§ã™::"
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr "pager.attend 設定を空ã«ã™ã‚‹ã“ã¨ã§ã€ å…¨ã¦ã®ã‚³ãƒžãƒ³ãƒ‰ãŒå¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr "pager.attend 設定時㯠pager.ignore 設定ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+":hg:`version` ã‚„ :hg:`help` ã®ã‚ˆã†ãªã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚³ãƒžãƒ³ãƒ‰ã§ã€\n"
+"ページャー使用を抑止ã—ãŸã„å ´åˆã€ 個人ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã§ã€\n"
+"ãã®æ—¨ã‚’明記ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+"ページャーã®ä½¿ç”¨ã¯ã€ --pager=... ã§ã‚‚制御ã§ãã¾ã™ã€‚\n"
+"真å½å€¤ã® yes no on off 以外ã«ã€ 無指定時挙動ã«ç›¸å½“ã™ã‚‹ auto\n"
+"を指定ã§ãã¾ã™ã€‚\n"
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr "ページャーã®è¦å¦ (真å½å€¤ã€ always auto ãªã„ã— never)"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã«ã‚ˆã‚‹å¤‰æ›´å†…容パッãƒé€ä»˜ã®ã‚³ãƒžãƒ³ãƒ‰"
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"一連ã®ãƒ¡ãƒ¼ãƒ«ã¯ã€ \"[PATCH 0 of N]\" ã‚’ Subject ヘッダã«æŒã¤ã€ 説明メール\n"
+"ã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"個々ã®ãƒ¡ãƒ¼ãƒ«ã® Subject ヘッダã¯ã€ \"[PATCH M of N]\" ã§å§‹ã¾ã‚Šã€ 対応ã™ã‚‹\n"
+"リビジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€åˆã®è¡Œã®å†…容ãŒè¨˜è¼‰ã•ã‚Œã¾ã™ã€‚ メールã®\n"
+"本文ã¯ã€ 以下ã®æ§˜ãª2ãªã„ã—3ã®éƒ¨ä½ã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™:"
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+"- コミットメッセージ\n"
+"- パッãƒã®å·®åˆ†çµ±è¨ˆ(diffstat)çµæžœ [çœç•¥å¯èƒ½]\n"
+"- :hg:`export` å½¢å¼ã¨åŒæ§˜ã®ãƒ‘ッãƒå†…容"
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"個々ã®ãƒ¡ãƒ¼ãƒ«ã¯ã€ In-Reply-To ãŠã‚ˆã³ References ヘッダを使用ã—ã¦ã€ 1通目ã®\n"
+"メールをå‚ç…§ã—ã¾ã™ã®ã§ã€ メールリーダーやニュースリーダーã§ã®å‚照時やã€\n"
+"メールアーカイブã«ãŠã„ã¦ã¯ã€ 一連ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+"以下ã®æ§˜ãªè¨˜è¿°ã‚’設定ファイルã«è¿½åŠ ã™ã‚‹ã“ã¨ã§ã€\n"
+"無指定時ã®è¨­å®šã‚’変更ã§ãã¾ã™::"
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+"``[email]`` セクションã«ãŠã‘るグローãƒãƒ«ãªã‚¢ãƒ‰ãƒ¬ã‚¹è¨­å®šã‚ˆã‚Šã‚‚優先ã•ã›ãŸã„\n"
+"設定ãŒã‚ã‚‹å ´åˆã«ã¯ã€ ``[patchbomb]`` セクションを使ã£ã¦è¨˜è¿°ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+"ã“ã“ã¾ã§è¨­å®šã§ããŸãªã‚‰ã€ :hg:`email` コマンドを使用ã—ã¦ã€ 一連ã®\n"
+"リビジョンをパッãƒçˆ†å¼¾(patchbomb)ã¨ã—ã¦ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"設定ファイル㮠[email] セクション㧠method 指定を行ã†ã“ã¨ã§ã€ sendmail\n"
+"互æ›ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ãƒ—ログラムを指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã‚Œã°ã€ [smtp] セクションã«\n"
+"å¿…è¦ãªæƒ…報を記述ã™ã‚‹ã“ã¨ã§ã€ 外部プログラムã®åŠ©ã‘を借りãšã« Mercurial ã‹ã‚‰\n"
+"直接パッãƒçˆ†å¼¾ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ ã“れらã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«é–¢ã™ã‚‹è©³ç´°ã¯\n"
+"設定ファイルã«é–¢ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ (hgrc(5)) ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+"(※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½)\n"
+
+msgid "send patches as inline message text (default)"
+msgstr "インラインメッセージã¨ã—ã¦ãƒ‘ッãƒã‚’é€ä¿¡ (デフォルト)"
+
+msgid "send patches as attachments"
+msgstr "添付ファイルã¨ã—ã¦ãƒ‘ッãƒã‚’é€ä¿¡"
+
+msgid "send patches as inline attachments"
+msgstr "インライン添付ファイルã¨ã—ã¦ãƒ‘ッãƒã‚’é€ä¿¡"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "BCC 宛先ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹"
+
+msgid "email addresses of copy recipients"
+msgstr "CC 宛先ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹"
+
+msgid "ask for confirmation before sending"
+msgstr "é€ä¿¡å‰ã«ç¢ºèªã‚’実施"
+
+msgid "add diffstat output to messages"
+msgstr "差分統計を出力ã«è¿½åŠ "
+
+msgid "use the given date as the sending date"
+msgstr "メール㮠Date ヘッダ値ã«æŒ‡å®šæ—¥æ™‚を設定"
+
+msgid "use the given file as the series description"
+msgstr "指定ファイルã®å†…容を説明文ã¨ã—ã¦ä½¿ç”¨"
+
+msgid "email address of sender"
+msgstr "メール㮠From ヘッダ値"
+
+msgid "print messages that would be sent"
+msgstr "é€ä¿¡äºˆå®šã®ãƒ¡ãƒ¼ãƒ«ã®å†…容を表示"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "メールé€ä¿¡ã®ä»£ã‚ã‚Šã«ã€ mbox ファイルã«æ›¸ã出ã™"
+
+msgid "email addresses replies should be sent to"
+msgstr "返信メールã®é€ä»˜å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "説明文ãªã„ã—å˜ä¸€ãƒ‘ッãƒé€ä¿¡ãƒ¡ãƒ¼ãƒ«ã® Subject ヘッダ値"
+
+msgid "message identifier to reply to"
+msgstr "返信対象ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ID"
+
+msgid "flags to add in subject prefixes"
+msgstr "subject 欄ã«ä»˜ä¸Žã™ã‚‹ãƒ•ãƒ©ã‚°"
+
+msgid "email addresses of recipients"
+msgstr "TO 宛先ã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹"
+
+msgid "omit hg patch header"
+msgstr "Mercurial 固有ã®ãƒ‘ッãƒãƒ˜ãƒƒãƒ€ã‚’çœç•¥"
+
+msgid "send changes not found in the target repository"
+msgstr "対象リãƒã‚¸ãƒˆãƒªã«ç„¡ã„リビジョンをパッãƒå½¢å¼ã§é€ä¿¡"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "対象リãƒã‚¸ãƒˆãƒªã«ç„¡ã„リビジョンをãƒãƒ³ãƒ‰ãƒ«å½¢å¼ã§é€ä¿¡"
+
+msgid "name of the bundle attachment file"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«å½¢å¼æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«å"
+
+msgid "a revision to send"
+msgstr "é€ä¿¡ã™ã‚‹ãƒªãƒ“ジョン"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr "連æºå…ˆãŒç„¡é–¢ä¿‚ãªãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚é€ä¿¡ (-b/--bundle 指定時)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr "連æºå…ˆæŒ‡å®šã®ä»£ã‚ã‚Šã¨ãªã‚‹åŸºåº•ãƒªãƒ“ジョン (-b/--bundle 指定時)"
+
+msgid "send an introduction email for a single patch"
+msgstr "説明文を独立ã—ãŸãƒ¡ãƒ¼ãƒ«ã§é€ä¿¡"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [OPTION]... [DEST]...\""
+
+msgid "send changesets by email"
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã«ã‚ˆã‚‹å¤‰æ›´å†…容ã®ãƒ‘ッãƒé€ä»˜"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ :hg:`export` ã®ç”Ÿæˆã™ã‚‹å·®åˆ†å½¢å¼ã§ãƒªãƒ“ジョン毎ã«\n"
+" メールãŒé€ä¿¡ã•ã‚Œã¾ã™ã€‚ 一連ã®ãƒ¡ãƒ¼ãƒ«ã¯ã€ \"[PATCH 0 of N]\" ã‚’ Subject\n"
+" ヘッダã«æŒã¤ã€ 説明メールã‹ã‚‰å§‹ã¾ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+" 個々ã®ãƒ¡ãƒ¼ãƒ«ã® Subject ヘッダã¯ã€ \"[PATCH M of N]\" ã§å§‹ã¾ã‚Šã€\n"
+" 対応ã™ã‚‹ãƒªãƒ“ジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®1行目ãŒè¨˜è¼‰ã•ã‚Œã¾ã™ã€‚\n"
+" メール本文ã¯ã€ 2ãªã„ã—3ã®éƒ¨ä½ã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™ã€‚\n"
+" 最åˆã®éƒ¨ä½ã«ã¯ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç¶šããŒé…ç½®ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+" -d/--diffstat ãŒæŒ‡å®šã•ã‚Œã€ diffstat コマンドãŒåˆ©ç”¨å¯èƒ½ãªå ´åˆã€\n"
+" パッãƒã«å¯¾ã™ã‚‹ diffstat ã®å®Ÿè¡ŒçµæžœãŒé…ç½®ã•ã‚Œã¾ã™ã€‚"
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr " 最後ã®éƒ¨ä½ã«ã¯ :hg:`export` ãŒç”Ÿæˆã™ã‚‹å·®åˆ†ãŒé…ç½®ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+" -d/--diffstat ãªã„ã— -c/--confirm ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" メッセージã®é€ä¿¡ã«å…ˆç«‹ã£ã¦ã€ 全メッセージã®ã¾ã¨ã‚ã‚’ä¼´ã£ã¦ã€\n"
+" 確èªã®å•ã„åˆã‚ã›ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created. You can include a patch both as text in the email\n"
+" body and as a regular or an inline attachment by combining the\n"
+" -a/--attach or -i/--inline with the --body option."
+msgstr ""
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ メール本文中ã®é€šå¸¸ãƒ†ã‚­ã‚¹ãƒˆã¨ã—ã¦ã€\n"
+" パッãƒãŒåŸ‹ã‚è¾¼ã¾ã‚Œã¾ã™ã€‚ -a/--attach ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" パッãƒã¯æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«åŒ–ã•ã‚Œã¾ã™ã€‚ -i/--inline ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" インライン添付ファイルã¨ãªã‚Šã¾ã™ã€‚ -a/--attach ãªã„ã— -i/--inline ã¨\n"
+" --body を組ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€ パッãƒã®æ ¼ç´å…ˆã‚’〠メール本文やã€\n"
+" インラインãªã„ã—通常ã®æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã€ é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+" -o/--outgoing 指定ãŒã‚ã‚‹å ´åˆã€ 連æºå¯¾è±¡ãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã—ãªã„\n"
+" (ã‚ã‚‹ã„ã¯ã€ 指定リビジョン以å‰ã®)リビジョンã®ãŸã‚ã®ãƒ‘ッãƒã®ã¿ãŒ\n"
+" メールã§é€ä¿¡ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+" -b/--bundle 指定ãŒã‚ã‚‹å ´åˆã€ 対象リビジョンã®é¸æŠžã¯ --outgoing 指定\n"
+" 時ã¨åŒæ§˜ã«è¡Œã‚ã‚Œã¾ã™ãŒã€ Mercurial ã®ãƒãƒ³ãƒ‰ãƒ«å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’添付\n"
+" ファイルã¨ã™ã‚‹å˜ä¸€ã®ãƒ¡ãƒ¼ãƒ«ã¨ã—ã¦é€ä¿¡ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+" -m/--mbox ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ PAGER ã§ã®è¡¨ç¤ºã‚„メールé€ä¿¡ã®ä»£ã‚ã‚Šã«ã€\n"
+" パッãƒã®ãƒ¡ãƒ¼ãƒ«ã‚’æ ¼ç´ã—㟠UNIX mbox å½¢å¼ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã—ã¾ã™ã€‚\n"
+" ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ UNIX mbox å½¢å¼ã«å¯¾å¿œã—ã¦ã„るツールã§é–²è¦§å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+" -n/--test 指定ã®ã‚ã‚‹å ´åˆã€ 一連ã®å‡¦ç†æ‰‹é †ã¯å®Ÿè¡Œã•ã‚Œã¾ã™ãŒã€\n"
+" メールã®é€ä¿¡ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。 ãã®ä»£ã‚ã‚Šã«ã€ é€ä¿¡å…ˆã‚¢ãƒ‰ãƒ¬ã‚¹ã‚„ã€\n"
+" パッãƒèª¬æ˜Žæ–‡ã®å…¥åŠ›ãŒä¿ƒã•ã‚Œã¾ã™ã€‚ å¿…è¦ãªå…¥åŠ›ãŒå®Œäº†ã™ã‚‹ã¨ã€\n"
+" é€ä¿¡ã•ã‚Œã‚‹ãƒ¡ãƒ¼ãƒ«ã®å†…容ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+" PAGER 環境変数ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ パッãƒçˆ†å¼¾ã‚’構æˆã™ã‚‹\n"
+" メールã”ã¨ã«ã€ 環境変数ã«è¨­å®šã•ã‚ŒãŸãƒ—ログラムãŒèµ·å‹•ã•ã‚Œã¾ã™ã®ã§ã€\n"
+" 内容を確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+" メールé€ä¿¡ã«å¤±æ•—ã—ãŸå ´åˆã€\n"
+" 導入メッセージ㯠``.hg/last-email.txt`` ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+" hg email -r 3000 # リビジョン 3000\n"
+" hg email -r 3000 -r 3001 # リビジョン 3000 ãŠã‚ˆã³ 3001\n"
+" hg email -r 3000:3005 # リビジョン 3000 ã‹ã‚‰ 3005 ã¾ã§\n"
+" hg email 3000 # リビジョン 3000 (éžæŽ¨å¥¨å½¢å¼)"
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -o # default ã«ç„¡ã„リビジョン\n"
+" hg email -o DEST # DEST ã«ç„¡ã„リビジョン\n"
+" hg email -o -r 3000 # 3000 以å‰ã§ default å´ã«ç„¡ã„リビジョン\n"
+" hg email -o -r 3000 DEST # 3000 以å‰ã§ DEST å´ã«ç„¡ã„リビジョン"
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+" # ※ 以下ã€ã™ã¹ã¦ bundle å½¢å¼\n"
+" hg email -b # default å´ã«ç„¡ã„リビジョン\n"
+" hg email -b DEST # DEST å´ã«ç„¡ã„リビジョン\n"
+" hg email -b -r 3000 # 3000 以å‰ã§ default å´ã«ç„¡ã„リビジョン\n"
+" hg email -b -r 3000 DEST # 3000 以å‰ã§ DEST å´ã«ç„¡ã„リビジョン"
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+" hg email -o -m mbox && # mbox ファイルを生æˆã—...\n"
+" mutt -R -f mbox # ... mutt ã§é–²è¦§\n"
+" hg email -o -m mbox && # mbox ファイルを生æˆã— ...\n"
+" formail -s sendmail \\ # ... formail を使用ã—ã¦\n"
+" -bm -t < mbox # ... sendmail 経由ã§é€ä¿¡"
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+" 本コマンドを使用ã™ã‚‹å‰ã«ã€ 設定ファイルã«é›»å­ãƒ¡ãƒ¼ãƒ«é–¢é€£è¨­å®šã‚’記述ã™ã‚‹\n"
+" å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ 設定ファイルã«é–¢ã™ã‚‹ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆ (hgrc(5))\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 (※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½)\n"
+" "
+
+msgid "no changes found\n"
+msgstr "差分ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "-r åˆã¯ -o を使用ã—ã¦ãƒªãƒ“ジョンを指定ã—ã¦ãã ã•ã„"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr "--bundle 指定ã§æš—é»™ã«æœ‰åŠ¹ã¨ãªã‚Šã¾ã™ã®ã§ --outgoing 指定ã¯ä¸è¦ã§ã™"
+
+msgid "too many destinations"
+msgstr "対象指定ãŒå¤šéŽãŽã§ã™"
+
+msgid "use only one form to specify the revision"
+msgstr "リビジョン指定ã¯å˜ä¸€ã®å½¢å¼ã§è¡Œã£ã¦ãã ã•ã„"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"一連ã®ãƒ‘ッãƒã®ãŸã‚ã®èª¬æ˜Žæ–‡ã‚’記述ã—ã¦ãã ã•ã„。"
+
+#, python-format
+msgid "this patch series consists of %d patches."
+msgstr "一連ã®ãƒ‘ッãƒã¯ %d 個ã®ãƒ‘ッãƒã‹ã‚‰æ§‹æˆã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid "no recipient addresses provided"
+msgstr "宛先アドレスãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"統計çµæžœ:"
+
+msgid "are you sure you want to send (yn)?"
+msgstr "メールをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ (y/n)"
+
+msgid "&No"
+msgstr "&No"
+
+msgid "&Yes"
+msgstr "&Yes"
+
+msgid "patchbomb canceled"
+msgstr "メールã¯é€ä¿¡ã—ã¾ã›ã‚“"
+
+msgid "displaying "
+msgstr "表示中 "
+
+msgid "sending "
+msgstr "é€ä¿¡ä¸­ "
+
+msgid "sending"
+msgstr "é€ä¿¡ä¸­"
+
+msgid "writing"
+msgstr "書ã出ã—中"
+
+msgid "show progress bars for some actions"
+msgstr "処ç†ã«ãŠã‘る進æ—率ã®è¡¨ç¤º"
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+"本エクステンションã¯ã€ hg コマンドã‹ã‚‰ã®é€²æ—情報を元ã«ã€\n"
+"å¯èƒ½ãªé™ã‚Šæœ‰ç›Šãªé€²æ—率を表示ã—ã¾ã™ã€‚ 多ãã®å‡¦ç†ã§ã®é€²æ—率表示ãŒã€\n"
+"明確ãªå‡¦ç†ç·é‡ã«åŸºã¥ã„ã¦ã„る一方ã§ã€ å¹¾ã¤ã‹ã®å‡¦ç†ã«ãŠã„ã¦ã¯ã€\n"
+"ä¸ç¢ºå®šãªæƒ…å ±ã«åŸºã¥ã„ãŸé€²æ—率を表示ã™ã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚"
+
+msgid "The following settings are available::"
+msgstr "指定å¯èƒ½ãªè¨­å®šã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™::"
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+" [progress]\n"
+" delay = 3 # 進æ—率表示ã¾ã§ã®çŒ¶äºˆç§’æ•° (浮動少数指定)\n"
+" changedelay = 1 # æ–°è¦ãƒˆãƒ”ック表示ã¾ã§ã®æœ€å°çŒ¶äºˆæ™‚間。\n"
+" # 3 * refresh よりもå°ã•ã„値ã®å ´åˆã¯ã€\n"
+" # ã“ã®è¨­å®šã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚\n"
+" refresh = 0.1 # 進æ—率表示更新間隔ã®ç§’æ•°\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # 進æ—率表示ã®æœ€å¤§ã‚«ãƒ©ãƒ æ•°\n"
+" # (width 設定ã¨ç”»é¢å¹…ã®å°ã•ã„æ–¹ãŒæœ‰åŠ¹ã«ãªã‚Šã¾ã™)\n"
+" clear-complete = True # 実行完了時ã®é€²æ—率表示クリアã®æœ‰ç„¡\n"
+" disable = False # 真値ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€é€²æ—率ã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“\n"
+" assume-tty = False # 真値ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ disable ãŒæŒ‡å®šã•ã‚Œãªã„é™ã‚Š\n"
+" # 常ã«é€²æ—率ãŒè¡¨ç¤ºã•ã‚Œã¾ã™"
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+"format 指定ã§æœ‰åŠ¹ãªè¦ç´ ã¯ topic bar number unit estimate speed item\n"
+"ã§ã™ã€‚ デフォルト㮠item ã¯æœ«å°¾ 20 文字ã§ã™ãŒã€ ``-<num>`` (末尾 num\n"
+"文字) ã‚„ ``+<num>`` (冒頭 num 文字) 指定ã®è¿½åŠ ã§å¤‰æ›´å¯èƒ½ã§ã™ã€‚\n"
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02d秒"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%d分%02d秒"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%d時間%02d分"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%d日%02d時間"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%d週%02d日"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%d年%02d週"
+
+#, python-format
+msgid "%d %s/sec"
+msgstr "%d %s/秒"
+
+msgid "command to delete untracked files from the working directory"
+msgstr "作業領域中ã®æœªç™»éŒ²ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰"
+
+msgid "abort if an error occurs"
+msgstr "エラーãŒç™ºç”Ÿã—ãŸå ´åˆã€ 中断ã™ã‚‹"
+
+msgid "purge ignored files too"
+msgstr "無視ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚‚削除ã™ã‚‹"
+
+msgid "print filenames instead of deleting them"
+msgstr "ファイル削除ã®å¤‰ã‚ã‚Šã«ãƒ•ã‚¡ã‚¤ãƒ«å表示を実施"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr "ファイルåã‚’NUL文字(0x00)ã§çµ‚端(xargs -p/--print ã¨ã®ä½µç”¨å‘ã‘)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [OPTION]... [DIR]...\""
+
+msgid "removes files not tracked by Mercurial"
+msgstr "Mercurial ã®ç®¡ç†å¯¾è±¡å¤–ファイルã®å‰Šé™¤"
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+" 本コマンド㯠Mercurial ã®ç®¡ç†å¯¾è±¡å¤–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¾ã™ã€‚\n"
+" 記録済ã¿ã®ãƒªãƒ“ジョンや〠未コミット変更をテストã™ã‚‹å ´åˆãªã©ã€\n"
+" 作業領域を綺麗ã«ã—ãŸã„å ´åˆã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid " This means that purge will delete:"
+msgstr " 本コマンドã¯ã€ 以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¾ã™:"
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+" - 未知ã®ãƒ•ã‚¡ã‚¤ãƒ«: :hg:`status` ã«ãŠã‘ã‚‹ \"?\" 扱ã„ã®ãƒ•ã‚¡ã‚¤ãƒ«\n"
+" - 空ディレクトリ: 実際ã«ã¯ã€ ファイル (登録除外対象å«ã‚€)\n"
+" を一切æŒãŸãªã„ディレクトリã¯ã€ 削除ã•ã‚Œã¾ã›ã‚“"
+
+msgid " But it will leave untouched:"
+msgstr " ãã®ä¸€æ–¹ã§ã€ 以下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ä¿æŒã•ã‚Œã¾ã™:"
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+" - 改変ã®æœ‰ç„¡ã«é–¢ã‚らãšã€ç®¡ç†ä¸‹ã«ã‚るファイル\n"
+" - 無視対象ファイル (--all 指定ã®ç„¡ã„å ´åˆ)\n"
+" - æ–°è¦ç™»éŒ²ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« (:hg:`add` 実施対象)"
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+" 引数ã¨ã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定ディレクトリé…下ã®ã¿ãŒã€\n"
+" 処ç†å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+" 本コマンドã®å®Ÿæ–½ã«ã‚ˆã‚Šã€ 登録ã—忘れãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒå‰Šé™¤ã•ã‚ŒãŸå ´åˆã€\n"
+" 当該ファイルã¯å¾©æ—§ã§ãã¾ã›ã‚“ã®ã§ã€ å分注æ„ã—ã¦ãã ã•ã„。\n"
+" 削除対象ファイルã®åå‰ã‚’確èªã—ãŸã„ã ã‘ã®å ´åˆã¯ã€\n"
+" --print を指定ã—ã¦ãã ã•ã„。\n"
+" "
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "警告: %s\n"
+
+#, python-format
+msgid "removing file %s\n"
+msgstr "ファイル %s ã®å‰Šé™¤ä¸­\n"
+
+#, python-format
+msgid "removing directory %s\n"
+msgstr "ディレクトリ %s ã®å‰Šé™¤ä¸­\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "履歴上ã®ç•°ãªã‚‹ä½ç½®ã¸ã®ä¸€é€£ã®ãƒªãƒ“ジョンã®ç§»å‹•"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"本エクステンションã¯ã€ 既存㮠Mercurial リãƒã‚¸ãƒˆãƒªä¸Šã§ã®ã€\n"
+"リビジョン群ã®ç§»å‹•ã‚’実ç¾ã—ã¾ã™"
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"詳細ã¯ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+msgid "rebase from the specified changeset"
+msgstr "指定リビジョンã‹ã‚‰ã®ç§»å‹•"
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr "指定リビジョンã®ç¥–å…ˆã‹ã‚‰ç§»å‹• (移動先ã¨ã®å…±é€šç¥–å…ˆã¾ã§é¡ã‚Šã¾ã™)"
+
+msgid "rebase these revisions"
+msgstr "指定リビジョン群ã®ç§»å‹•"
+
+msgid "rebase onto the specified changeset"
+msgstr "移動先リビジョン"
+
+msgid "collapse the rebased changesets"
+msgstr "移動後ã«ç§»å‹•ãƒªãƒ“ジョンをå˜ä¸€åŒ–"
+
+msgid "use text as collapse commit message"
+msgstr "指定テキストをè¦ç´„コミットログã¨ã—ã¦ä½¿ç”¨"
+
+msgid "invoke editor on commit messages"
+msgstr "コミットログ入力ã«ã‚¨ãƒ‡ã‚£ã‚¿ã‚’èµ·å‹•"
+
+msgid "read collapse commit message from file"
+msgstr "è¦ç´„コミットログをファイルã‹ã‚‰èª­ã¿è¾¼ã¿"
+
+msgid "keep original changesets"
+msgstr "元リビジョンを維æŒ"
+
+msgid "keep original branch names"
+msgstr "元ブランãƒåを維æŒ"
+
+msgid "(DEPRECATED)"
+msgstr "(éžæŽ¨å¥¨)"
+
+msgid "specify merge tool"
+msgstr "マージツールã®æŒ‡å®š"
+
+msgid "continue an interrupted rebase"
+msgstr "中断ã•ã‚ŒãŸç§»å‹•ã‚’å†é–‹"
+
+msgid "abort an interrupted rebase"
+msgstr "中断ã•ã‚ŒãŸç§»å‹•ã‚’中断"
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr "別ãªå±¥æ­´ä½ç½®ã¸ã®ãƒªãƒ“ジョン(ãŠã‚ˆã³ãã®å­å­«)ã®ç§»å‹•"
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+" 本コマンドã¯ã€ å復的ãªãƒžãƒ¼ã‚¸ã‚’è¡Œãªã†ã“ã¨ã§ã€ ã‚る履歴ä½ç½® (移動元)\n"
+" ã‹ã‚‰åˆ¥ãªä½ç½® (移動先) ã¸ã¨ãƒªãƒ“ジョン群を移æ¤ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã¯ã€\n"
+" 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã®æˆæžœã‚’〠開発用ã®å…±æœ‰ãƒªãƒã‚¸ãƒˆãƒªã«å映ã™ã‚‹éš›ã«ã€\n"
+" æžåˆ†ã‹ã‚Œã®ç„¡ã„状態ã«ã—ãŸã„å ´åˆãªã©ã§æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+" ä»–ã®åˆ©ç”¨è€…ã«å…¬é–‹æ¸ˆã¿ã®ãƒªãƒ“ジョンã¯ã€ 移動ã™ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+" 公開済ã¿ãƒªãƒ“ジョンã®ç§»å‹•ã¯ã€ çµæžœçš„ã«ã€ ä»–ã®åˆ©ç”¨è€…ã«å¯¾ã—ã¦ã€\n"
+" åŒæ§˜ã®ãƒªãƒ“ジョン移動æ“作を強制ã—ã¦ã—ã¾ã£ãŸã‚Šã€ 公開済ã¿ã¨ç§»å‹•å¾Œã®ã€\n"
+" 両方ã®ãƒªãƒ“ジョンã®å–ã‚Šè¾¼ã¿ã«ã‚ˆã‚Šã€ リビジョンãŒé‡è¤‡ã—ãŸã‚Šã¨ã„ã£ãŸã€\n"
+" 悪影響ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+" 移動先リビジョン (``-d/--dest``) ãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ç§»å‹•å…ˆã¨ã—ã¦ã€\n"
+" ç¾è¡Œã®åå‰ä»˜ãブランãƒã®ã€ 最新ヘッドãŒæŽ¡ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" (移動先リビジョン自身ã¯æ”¹å¤‰ã•ã‚Œã¾ã›ã‚“ãŒã€ 移動先ã®å­å­«ã¨ã—ã¦ã€\n"
+" æ–°è¦ãƒªãƒ“ジョンãŒè¿½åŠ ã•ã‚Œã¾ã™)"
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+" 移動対象リビジョンã®æŒ‡å®šã«ã¯ã€ \"source\" 指定㨠\"base\" 指定ã®ã€\n"
+" 2ã¤ã®æ–¹æ³•ãŒä½¿ãˆã¾ã™ã€‚ ã„ãšã‚Œã‚‚履歴ツリーã‹ã‚‰ç§»å‹•å¯¾è±¡ã‚’抽出ã™ã‚‹ãŸã‚ã®ã€\n"
+" 簡易化ã•ã‚ŒãŸæ–¹æ³•ã§ã™ã€‚ \"source\" (``-s/--source``) を指定ã—ãŸå ´åˆã€\n"
+" 指定リビジョン〠ãŠã‚ˆã³ãã®å­å­«å…¨ã¦ã‚’移動ã—ã¾ã™ã€‚ \"base\"\n"
+" (``-b/--base``) を指定ã—ãŸå ´åˆã€ 指定リビジョンã‹ã‚‰é¡ã‚Šã€\n"
+" 移動先ã¨ã®å…±é€šç¥–å…ˆã¾ã§ã®ç¯„囲を〠移動対象ã¨ã—ã¦é¸æŠžã—ã¾ã™ã€‚\n"
+" ``-s`` 指定よりも ``-b`` 指定ã¯ç²¾å¯†ã•ã§åŠ£ã‚Šã¾ã™ãŒã€ ãã®åˆ†ä¾¿åˆ©ã§ã™ã€‚\n"
+" 移動元ã®ãƒ–ランãƒã«ãŠã„ã¦ã€ ä»»æ„ã®ãƒªãƒ“ジョンをé¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€\n"
+" ブランãƒå…¨ä½“ãŒé¸æŠžã•ã‚Œã¾ã™ã€‚ ``-s`` ã‚‚ ``-b`` も指定ã—ãªã„å ´åˆã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョンを \"base\" ã¨ã¿ãªã—ã¾ã™ã€‚"
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 本コマンドã¯ç§»å‹•å…ƒãƒ–ランãƒã®ãƒªãƒ“ジョンをã€\n"
+" 移動先ã®å­å­«ã¨ã—ã¦å†ç”Ÿæˆã—〠ãã®å¾Œã«å…ƒãƒªãƒ“ジョンを破棄ã—ã¾ã™ã€‚\n"
+" 移動元リビジョンを残ã™å ´åˆã€ ``--keep`` を指定ã—ã¦ãã ã•ã„。\n"
+" 移動元ブランãƒã®ãƒªãƒ“ジョンã®ã†ã¡ã€ 何も貢献ã®ç„¡ã„リビジョン\n"
+" (例: 移動先ブランãƒã¨ã®ãƒžãƒ¼ã‚¸å®Ÿæ–½ãƒªãƒ“ジョン等) ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+" ç¾è¡Œã®åå‰ä»˜ãブランãƒãŒ2ã¤ã®ãƒ˜ãƒƒãƒ‰ã‚’æŒã¡ã€ 且ã¤æœ€æ–°ã®ãƒ˜ãƒƒãƒ‰å´ãŒã€\n"
+" 作業領域ã®è¦ªã§ã‚ã‚‹å ´åˆã€ リビジョン指定無ã—ã§ã‚‚処ç†ã‚’行ㆠ``merge``\n"
+" ã¨ç•°ãªã‚Šã€ 本コマンドã¯ä½•ã‚‚実施ã—ã¾ã›ã‚“。 ã“ã‚Œã¯ã€ 移動先 (※ 訳注:\n"
+" ç¾è¡Œã®åå‰ä»˜ãブランãƒã®ã€ 最新ヘッド) ã¨ç§»å‹•å…ƒ (※ 訳注: 作業領域ã®ã€\n"
+" 親ã«å¯¾ã™ã‚‹ \"base\" 指定) リビジョンã®é¸æŠžä»•æ§˜ã®ãŸã‚ã§ã™ã€‚\n"
+" å¿…è¦ã«å¿œã˜ã¦ã€ 移動元ï¼å…ˆã‚’明示ã—ã¦ãã ã•ã„ (ã‚‚ã†ä¸€æ–¹ã®ãƒ˜ãƒƒãƒ‰ãŒã€\n"
+" 移動先ã§ã‚ã‚‹ãªã‚‰ã°ã€ ãã¡ã‚‰ã« ``update`` ã—ã¦ãã ã•ã„)。"
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+" 手動マージã§ã®è¡çªè§£æ¶ˆã®å¿…è¦æ€§ã‹ã‚‰ã€ 移動処ç†ãŒä¸­æ–­ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" --continue/-c ã§ã®å†é–‹ã‚„〠--abort/-a ã§ã®ç§»å‹•å‰çŠ¶æ…‹ã¸ã®å¾©æ—§ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠移æ¤ãŒå®Ÿæ–½ã•ã‚Œãªã„å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "message can only be specified with collapse"
+msgstr "--collapse 指定ã¨ã®ä½µç”¨æ™‚ã®ã¿ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸æŒ‡å®šãŒå¯èƒ½ã§ã™"
+
+msgid "cannot use both abort and continue"
+msgstr "--abort 㨠--continue ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "--collapse ã¨ã€ --abort ã‚„ --continue ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "--abort ã‚„ --continue ã¨ã€ リビジョン指定ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "tool option will be ignored\n"
+msgstr "--tool 指定ã¯ç„¡è¦–ã•ã‚Œã¾ã™\n"
+
+msgid "cannot specify both a source and a base"
+msgstr "--soruce 㨠--base ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot specify both a revision and a base"
+msgstr "--rev 㨠--base ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot specify both a revision and a source"
+msgstr "--rev 㨠--soruce ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr "移動対象外ã®å­å­«ã‚’æŒã¤ãŸã‚ã€ç§»å‹•å…ƒãƒªãƒ“ジョンãŒå‰Šé™¤ã§ãã¾ã›ã‚“"
+
+msgid "use --keep to keep original changesets"
+msgstr "元リビジョンを維æŒã™ã‚‹å ´åˆã¯ --keep を使用ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "can't rebase immutable changeset %s"
+msgstr "改変ä¸èƒ½ãªãƒªãƒ“ジョン %s ã¯ç§»å‹•ã§ãã¾ã›ã‚“"
+
+msgid "see hg help phases for details"
+msgstr "詳細ã¯ã€€\"hg help phases\" ã‚’å‚ç…§ã—ã¦ãã ã•ã„"
+
+msgid "nothing to rebase\n"
+msgstr "移動ã®å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "cannot collapse multiple named branches"
+msgstr "複数ã®åå‰ä»˜ãブランãƒã®å˜ä¸€åŒ–ã¯ã§ãã¾ã›ã‚“"
+
+msgid "rebasing"
+msgstr "移動実施中"
+
+msgid "changesets"
+msgstr "リビジョン"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr "è¡çªãŒæœªè§£æ¶ˆã§ã™ (\"hg resolve\" 㨠\"hg rebase --continue\" å‚ç…§)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "変更ãŒãªã„ã®ã§ã€ リビジョン %d をスキップ\n"
+
+msgid "rebase merging completed\n"
+msgstr "移動ã®ãƒžãƒ¼ã‚¸å‡¦ç†ãŒå®Œäº†\n"
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr "警告: 移動元ã«æ–°è¦ãƒªãƒ“ジョンを検出ã—ãŸã®ã§ã€ 破棄ã—ã¾ã›ã‚“\n"
+
+msgid "rebase completed\n"
+msgstr "移動完了\n"
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "%d 個ã®ãƒªãƒ“ジョンをスキップ\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "複数ã®è¦ªã¨ã®é–¢ä¿‚ã‹ã‚‰ã€ --collapse ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr "親リビジョン㌠3 ã¤ã«ãªã‚‹ã®ã§ã€ リビジョン %d をベースã«ã§ãã¾ã›ã‚“"
+
+msgid "no rebase in progress"
+msgstr "進行中ã®ç§»å‹•çŠ¶æ…‹ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "can't abort rebase due to immutable changesets %s"
+msgstr "改変ä¸èƒ½ãƒªãƒ“ジョンãŒã‚ã‚‹ãŸã‚ rebase å‰ã®çŠ¶æ…‹ã«å¾©æ—§ã§ãã¾ã›ã‚“: %s"
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr "警告: æ–°è¦ãƒªãƒ“ジョンãŒå¯¾è±¡ãƒ–ランãƒã«æ¤œå‡ºã•ã‚ŒãŸã®ã§ä¸­æ–­ã§ãã¾ã›ã‚“\n"
+
+msgid "rebase aborted\n"
+msgstr "移動ãŒä¸­æ–­ã•ã‚Œã¾ã—ãŸ\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr "MQ パッãƒä¸Šã¸ã®ç§»å‹•ã¯ã§ãã¾ã›ã‚“"
+
+msgid "no matching revisions"
+msgstr "åˆè‡´ã™ã‚‹ãƒªãƒ“ジョンã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "can't rebase multiple roots"
+msgstr "複数リビジョン由æ¥ã®ãƒªãƒ“ジョンã¯ç§»å‹•ã§ãã¾ã›ã‚“"
+
+msgid "source is ancestor of destination"
+msgstr "移動元ã¯ç§»å‹•å…ˆã®ç¥–å…ˆã§ã™"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "ブックマーク %s ã®æ›´æ–°ä¸­\n"
+
+msgid "--tool can only be used with --rebase"
+msgstr "--tool 㯠--rebase 指定時ã«ã—ã‹ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+msgid "rebase working directory to branch head"
+msgstr "作業領域をブランãƒãƒ˜ãƒƒãƒ‰ã«ç§»å‹•"
+
+msgid "specify merge tool for rebase"
+msgstr "移動用ã®ãƒžãƒ¼ã‚¸ãƒ„ールã®æŒ‡å®š"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr "commit ã‚„ qrefresh ã«ãŠã‘る対話的ãªå¤‰æ›´å–ã‚Šè¾¼ã¿ã®é¸æŠž"
+
+msgid "ignore white space when comparing lines"
+msgstr "差分判定ã®éš›ã«ç©ºç™½æ–‡å­—を無視"
+
+msgid "ignore changes in the amount of white space"
+msgstr "差分判定ã®éš›ã«ç©ºç™½æ–‡å­—ã®æ•°ã‚’無視"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "差分判定ã®éš›ã«ç©ºç™½è¡Œã‚’無視"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "ã“ã‚Œã¯ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹å¤‰æ›´ã§ã™(部分的ãªé¸æŠžã¯ä¸å¯èƒ½)\n"
+
+msgid "this is a binary file\n"
+msgstr "ã“ã‚Œã¯ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã§ã™\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "%d 個ã®å·®åˆ†ã€ %d è¡Œã®å¤‰æ›´\n"
+
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
+
+msgid "&Yes, record this change"
+msgstr "&Yes - ã“ã®å¤‰æ›´ã‚’記録ã—ã¾ã™"
+
+msgid "&No, skip this change"
+msgstr "&No - ã“ã®å¤‰æ›´ã‚’スキップã—ã¾ã™"
+
+msgid "&Edit the change manually"
+msgstr "&Edit - 変更を手動ã§æ”¹å¤‰ã—ã¾ã™"
+
+msgid "&Skip remaining changes to this file"
+msgstr "&Skip - ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ®‹ã‚Šã®å¤‰æ›´ã‚’å…¨ã¦ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™"
+
+msgid "Record remaining changes to this &file"
+msgstr "&File - ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ®‹ã‚Šã®å¤‰æ›´ã‚’å…¨ã¦è¨˜éŒ²ã—ã¾ã™"
+
+msgid "&Done, skip remaining changes and files"
+msgstr "&Done - 残りã®å¤‰æ›´ãŠã‚ˆã³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å…¨ã¦ã‚¹ã‚­ãƒƒãƒ—ã—ã¦çµ‚了ã—ã¾ã™"
+
+msgid "Record &all changes to all remaining files"
+msgstr "&All - 残りã®å¤‰æ›´ãŠã‚ˆã³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å…¨ã¦è¨˜éŒ²ã—ã¾ã™"
+
+msgid "&Quit, recording no changes"
+msgstr "&Quit - 変更を記録ã—ãªã„ã§çµ‚了ã—ã¾ã™"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "cannot edit patch for whole file"
+msgstr "ファイル全体ã«å¯¾ã™ã‚‹ãƒ‘ッãƒã®æ‰‹å‹•æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+msgid "cannot edit patch for binary file"
+msgstr "ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«å‘ã‘パッãƒã®æ‰‹å‹•æ”¹å¤‰ã¯ã§ãã¾ã›ã‚“"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"'-' è¡Œã®å‰Šé™¤ã¯ã€è¡Œã® ' ' (コンテキスト行)化ã§è¡Œã„ã¾ã™ã€‚\n"
+"'+' è¡Œã®å‰Šé™¤ã¯ã€è¡Œè‡ªä½“ã®å‰Šé™¤ã§è¡Œã„ã¾ã™ã€‚\n"
+"'#' ã§å§‹ã¾ã‚‹è¡Œã¯ã€ãƒ‘ッãƒã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"パッãƒé©ç”¨ãŒæˆåŠŸã—ãŸå ´åˆã€ 編集後ã®å·®åˆ†ã¯ã€ 記録対象ã«è¿½åŠ ã•ã‚Œã¾ã™ã€‚\n"
+"é©ç”¨ãŒå¤±æ•—ã—ãŸå ´åˆã€ å´ä¸‹å·®åˆ†ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚ å†è©¦è¡Œã®éš›ã¯ã€\n"
+"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’利用å¯èƒ½ã§ã™ã€‚ 差分ã®å…¨è¡ŒãŒå‰Šé™¤ã•ã‚ŒãŸå ´åˆã€\n"
+"改変作業ã¯ä¸­æ–­ã•ã‚Œã€å·®åˆ†ã¯ãã®ã¾ã¾ç¶­æŒã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "edit failed"
+msgstr "編集ã«å¤±æ•—"
+
+msgid "user quit"
+msgstr "ユーザã®æŒ‡ç¤ºã«ã‚ˆã‚Šçµ‚了ã—ã¾ã™"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "%s ã®å¤‰æ›´ç‚¹ã‚’調ã¹ã¾ã™ã‹ï¼Ÿ"
+
+msgid " and "
+msgstr " 㨠"
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "ã“ã®å¤‰æ›´ã‚’ %r ã«è¨˜éŒ²ã—ã¾ã™ã‹ï¼Ÿ"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "ã“ã®å¤‰æ›´ (%d 件目 / %d 件中) ã‚’ %r ã«è¨˜éŒ²ã—ã¾ã™ã‹ï¼Ÿ"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [OPTION]... [FILE]..."
+
+msgid "interactively select changes to commit"
+msgstr "コミットã™ã‚‹å†…容を対話的ã«é¸æŠžã—ã¾ã™"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" ファイル一覧ãŒæŒ‡å®šã•ã‚Œãªã‹ã£ãŸå ´åˆã¯ :hg:`status` ã§è¡¨ç¤ºã•ã‚Œã‚‹\n"
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒè¨˜éŒ²ã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" 変更ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´ç®‡æ‰€ã”ã¨ã«è¨˜éŒ²ã™ã‚‹ã‹ã©ã†ã‹è³ªå•ã•ã‚Œã¾ã™ã€‚\n"
+" ãã‚Œã«å¯¾ã—ã¦ä»¥ä¸‹ã®æ“作ãŒå¯èƒ½ã§ã™::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change\n"
+" e - edit this change manually"
+msgstr ""
+" y - ã“ã®å¤‰æ›´ã‚’記録ã—ã¾ã™\n"
+" n - ã“ã®å¤‰æ›´ã‚’スキップã—ã¾ã™\n"
+" e - ã“ã®å¤‰æ›´ã‚’手動ã§æ”¹å¤‰ã—ã¾ã™"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ®‹ã‚Šã®å¤‰æ›´ã‚’å…¨ã¦ã‚¹ã‚­ãƒƒãƒ—ã—ã¾ã™\n"
+" f - ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ®‹ã‚Šã®å¤‰æ›´ã‚’å…¨ã¦è¨˜éŒ²ã—ã¾ã™"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - 残りã®å¤‰æ›´ãŠã‚ˆã³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’スキップã—ã¦çµ‚了ã—ã¾ã™\n"
+" a - 残り全ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´ã‚’記録ã—ã¾ã™\n"
+" q - 変更を記録ã—ãªã„ã§çµ‚了ã—ã¾ã™"
+
+msgid " ? - display help"
+msgstr " ? - ヘルプを表示ã—ã¾ã™"
+
+msgid " This command is not available when committing a merge."
+msgstr " 本コマンドをマージã®ã‚³ãƒŸãƒƒãƒˆã«ä½¿ç”¨ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+
+msgid "interactively record a new patch"
+msgstr "æ–°è¦ãƒ‘ッãƒã®ã‚³ãƒŸãƒƒãƒˆå†…容を対話的ã«é¸æŠž"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+" 用法等ã®è©³ç´°ã¯ :hg:`help qnew` ãŠã‚ˆã³ :hg:`help record`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "'mq' extension not loaded"
+msgstr "'mq' エクステンションãŒèª­ã¿è¾¼ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "éžå¯¾è©±çš„ã«å®Ÿè¡Œã™ã‚‹å ´åˆã¯ã€%s を使用ã—ã¦ãã ã•ã„"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr "マージã®éƒ¨åˆ†ã‚³ãƒŸãƒƒãƒˆã¯ã§ãã¾ã›ã‚“ (\"hg commit\" を使用ã—ã¦ãã ã•ã„)"
+
+msgid "no changes to record\n"
+msgstr "記録å¯èƒ½ãªå¤‰æ›´ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [OPTION]... PATCH [FILE]..."
+
+msgid "interactively select changes to refresh"
+msgstr "パッãƒæ›´æ–°å†…容を対話的ã«é¸æŠž"
+
+msgid "recreates hardlinks between repository clones"
+msgstr "複製リãƒã‚¸ãƒˆãƒªé–“ã§ã®ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã®å†ç”Ÿæˆ"
+
+msgid "recreate hardlinks between two repositories"
+msgstr "ï¼’ã¤ã®ãƒªãƒã‚¸ãƒˆãƒªé–“ã§ã®ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã®å†ç”Ÿæˆ"
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+" リãƒã‚¸ãƒˆãƒªã®è¤‡è£½ãŒã€ åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã§è¡Œã‚ã‚ŒãŸå ´åˆã€\n"
+" 管ç†æƒ…報ファイルãŒãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã•ã‚Œã‚‹ãŸã‚〠ディスク消費é‡ã¯ã€\n"
+" リãƒã‚¸ãƒˆãƒª1ã¤åˆ†ã§æ¸ˆã¿ã¾ã™ã€‚"
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+" 残念ãªäº‹ã«ã€ ã„ãšã‚Œã‹ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€ 変更ãŒå–ã‚Šè¾¼ã¾ã‚Œã‚‹ã¨ã€\n"
+" ã“ã®ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã¯è§£æ¶ˆã•ã‚Œã¾ã™ã€‚ ã“ã‚Œã¯ã€ 両方ã®ãƒªãƒã‚¸ãƒˆãƒªãŒã€\n"
+" å…¨ãåŒã˜å¤‰æ›´ã‚’å–り込んã å ´åˆã§ã‚‚変ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+" åŒæ§˜ã« :hg:`clone` ã«å¯¾ã™ã‚‹ --rev 指定も〠ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ä½¿ç”¨ã‚’æ­¢ã‚ã€\n"
+" 元リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®è¤‡è£½ã®å®Ÿæ–½ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+" 本コマンドã¯ã€ ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã‚’使用ã™ã‚‹çŠ¶æ³ã‚’å†æ§‹ç¯‰ã™ã‚‹ã“ã¨ã§ã€\n"
+" 無駄ãªãƒ‡ã‚£ã‚¹ã‚¯é ˜åŸŸã‚’回åŽã—ã¾ã™ã€‚"
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+" 本コマンドã®å®Ÿè¡Œå¯¾è±¡ã¨ãªã‚‹ãƒªãƒã‚¸ãƒˆãƒªã¯ã€ ディスク領域共有対象ã®\n"
+" ORIGIN リãƒã‚¸ãƒˆãƒªã¨ã€ åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+" ORIGIN 指定ãŒç„¡ã„å ´åˆã€ [paths] セクション㮠\"default-relink\"\n"
+" ãªã„ã— \"default\" ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+" コマンド実行中ã¯ã€ リãƒã‚¸ãƒˆãƒªã«å¯¾ã™ã‚‹ã‚らゆる読ã¿å‡ºã—ã¯ç¦æ­¢ã§ã™\n"
+" (両方ã®ãƒªãƒã‚¸ãƒˆãƒªãŒæ›¸ã出ã—ロックã•ã‚Œã¾ã™)\n"
+" "
+
+msgid "hardlinks are not supported on this system"
+msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ä¸Šã§ã¯ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ä¸­\n"
+
+msgid "there is nothing to relink\n"
+msgstr "ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã®å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr "tip ã«ãŠã‘るファイル数 %d〠推定ç·ãƒ•ã‚¡ã‚¤ãƒ«æ•°: %s\n"
+
+msgid "collecting"
+msgstr "åŽé›†ä¸­"
+
+msgid "files"
+msgstr "ファイル"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr "%d 個ã®å€™è£œãƒ•ã‚¡ã‚¤ãƒ«ã®é ˜åŸŸã‚’回åŽ\n"
+
+msgid "source and destination are on different devices"
+msgstr "リンク元ã¨ãƒªãƒ³ã‚¯å…ˆãŒåŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "pruning"
+msgstr "刈り込ã¿ä¸­"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr "ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯å¯èƒ½ã¨æ€ã‚れる %d ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外\n"
+
+msgid "relinking"
+msgstr "å†ãƒªãƒ³ã‚¯ä¸­"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr "%d ファイルをå†ãƒªãƒ³ã‚¯ (%s ãƒã‚¤ãƒˆã®ç¯€ç´„)\n"
+
+msgid "[ORIGIN]"
+msgstr "[ORIGIN]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªç¾¤ã«å¯¾ã™ã‚‹ç•¥è¨˜æŒ‡å®šã®æ‹¡å¼µ"
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+"本エクステンションã«ã‚ˆã£ã¦ã€ 複数リãƒã‚¸ãƒˆãƒªã®è¦ª URL çš„ãªå½¹å‰²ã‚’ã€\n"
+"スキーマ指定ã®ã‚ˆã†ã«è¨˜è¿°ã™ã‚‹çœç•¥è¨˜æ³•ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ 例ãˆã°::"
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+
+msgid "After that you can use it like::"
+msgstr "上記設定ã®å…ƒã§ã¯ã€ 以下ã®ã‚ˆã†ãªè¡¨è¨˜ãŒå¯èƒ½ã§ã™::"
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+"æ›´ã«ã€ より複雑ãªã‚¹ã‚­ãƒ¼ãƒžã«ã‚‚対応ã—ã¦ã„ã¾ã™ã€‚ 例ãˆã° Google Code\n"
+"を使用ã™ã‚‹å ´åˆ::"
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+"Mercurial ã®ãƒ†ãƒ³ãƒ—レート表記ã®æ–‡æ³•ã‚’å…ƒã«ã€ ``{1}`` ã‹ã‚‰å§‹ã¾ã‚Š\n"
+"``{2}``〠``{3}`` 等々ã¨é€£ç¶šã—ãŸã€ 上é™ç„¡ã—ã®ç•ªå·å¤‰æ•°ã‚’使用å¯èƒ½ã§ã™ã€‚\n"
+"å„番å·å¤‰æ•°ã¯ã€ URL ã‚’ ``/`` ã§åŒºåˆ‡ã£ãŸéƒ¨ä½ã«å¯¾å¿œã—ãŸå€¤ã§ç½®æ›ã•ã‚Œã¾ã™ã€‚\n"
+"``{部ä½}`` å½¢å¼ã«è©²å½“ã—ãªã„部分ã¯ã€ 全㦠URL 末尾ã«ä»˜åŠ ã•ã‚Œã¾ã™ã€‚"
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+"利便上〠本エクステンションã¯ã€ 以下ã®ã‚¹ã‚­ãƒ¼ãƒžã‚’デフォルトã§è¨­å®šã—ã¾ã™::"
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr "定義済ã¿ã‚¹ã‚­ãƒ¼ãƒžã¯ã€ åŒåスキーマ定義ã«ã‚ˆã‚Šã€ 上書ãå¯èƒ½ã§ã™ã€‚\n"
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr "独自スキーマ %s:// ã¯ã€ ドライブ文字 %s:\\ ã¨è¡çªã—ã¾ã™\n"
+
+msgid "share a common history between several working directories"
+msgstr "複数作業領域ã«ã‚ˆã‚‹å±¥æ­´æƒ…報領域ã®å…±æœ‰"
+
+msgid "create a new shared repository"
+msgstr "共有リãƒã‚¸ãƒˆãƒªã®æ–°è¦ä½œæˆ"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+" ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã¨å±¥æ­´æƒ…報を共有ã™ã‚‹ã€ リãƒã‚¸ãƒˆãƒªï¼ä½œæ¥­é ˜åŸŸã‚’ã€\n"
+" æ–°è¦ã«ä½œæˆã—ã¾ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+" .. note::\n"
+" rollback ã®å®Ÿæ–½ã‚„〠履歴を改変ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ (例: mq ã‚„\n"
+" rebase ç­‰) ã®åˆ©ç”¨ã¯ã€ 共有リãƒã‚¸ãƒˆãƒªé–“ã«ç›¸å½“ã®æ··ä¹±ã‚’ã‚‚ãŸã‚‰ã—ã¾ã™ã€‚\n"
+" 典型的ãªä¾‹ã¯ã€ 共有関係ã«ã‚るリãƒã‚¸ãƒˆãƒªã®ä¸¡æ–¹ãŒã€ \n"
+" 作業領域をåŒä¸€ãƒªãƒ“ジョンã§æ›´æ–°ã—ãŸçŠ¶æ…‹ã§ã€ 一方ãŒå½“該リビジョンを\n"
+" rollback ã«ã‚ˆã‚Šç ´æ£„ã™ã‚‹ã“ã¨ã§ã€ ä»–æ–¹ãŒæ©Ÿèƒ½ã—ãªããªã‚‹ã‚±ãƒ¼ã‚¹ã§ã™:\n"
+" \"中断: 作業領域ã®è¦ª REV ãŒæœªçŸ¥ã®ãƒªãƒ“ジョンã§ã™\"\n"
+" メッセージ表示ã¨å…±ã«ã€ ä»–æ–¹ã§ã®ã‚らゆるæ“作ãŒå¤±æ•—ã—ã¾ã™ã€‚\n"
+" ã“ã®å ´åˆã®å”¯ä¸€ã®å¾©æ—§æ–¹æ³•ã¯ã€ 機能ã—ãªã„å´ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹ã€\n"
+" 確実ã«å­˜åœ¨ã™ã‚‹ãƒªãƒ“ジョン (例: tip) を使ã£ãŸ :hg:`debugsetparents`\n"
+" ã®å®Ÿæ–½ã ã‘ã§ã™ã€‚\n"
+" "
+
+msgid "convert a shared repository to a normal one"
+msgstr "共有状態ã®ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰é€šå¸¸ãƒªãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›"
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+" 履歴管ç†æƒ…報を複製ã—〠共有状態を解消ã—ã¾ã™ã€‚\n"
+" "
+
+msgid "this is not a shared repo"
+msgstr "共有状態ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "do not create a working copy"
+msgstr "作業領域ã®æ›´æ–°ã‚’抑止ã—ã¾ã™"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] SOURCE [DEST]"
+
+msgid "command to transplant changesets from another branch"
+msgstr "別ブランãƒã‹ã‚‰ã®ãƒªãƒ“ジョンã®ç§»æ¤"
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr "本エクステンションã¯ã€ 別ブランãƒã‹ã‚‰ã®ãƒªãƒ“ジョン移æ¤ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚"
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+"移æ¤ã•ã‚ŒãŸãƒªãƒ“ジョンã®æƒ…å ±ã¯ã€ 移æ¤å…ˆãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤ã‹ã‚‰ã€\n"
+"移æ¤å…ƒãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹ãƒãƒƒã‚·ãƒ¥å€¤ã¸ã®å¤‰æ›ä¸€è¦§ã¨ã—ã¦ã€\n"
+".hg/transplant/transplants ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚\n"
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "é©ç”¨æ¸ˆã¿ãƒªãƒ“ジョン %s を無視\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr "マージ実施リビジョン %s:%s を無視\n"
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s 㯠%s ã®è¦ªãƒªãƒ“ジョンã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr "%s ã‚’ %s ã«ãƒžãƒ¼ã‚¸\n"
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr "%s ã‚’ %s ã«ç§»æ¤ä¸­\n"
+
+#, python-format
+msgid "filtering %s\n"
+msgstr "%s をフィルタリング中\n"
+
+msgid "filter failed"
+msgstr "フィルタリングã«å¤±æ•—"
+
+msgid "can only omit patchfile if merging"
+msgstr "マージã®å ´åˆã®ã¿ãƒ‘ッãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’çœç•¥å¯èƒ½"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr "è¡çªè§£æ¶ˆå¾Œã« \"hg transplant --continue\" ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr "%s ㌠%s ã¨ã—ã¦ç§»æ¤ã•ã‚Œã¾ã—ãŸ\n"
+
+msgid "transplant log file is corrupt"
+msgstr "移æ¤ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ãŒç ´æã—ã¦ã„ã¾ã™"
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr "作業領域ãŒç§»æ¤è¦ª %s ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "commit failed"
+msgstr "コミットã«å¤±æ•—"
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr "ç ´æã—ãŸãƒªãƒ“ジョンを除外ã—ã¦ãã ã•ã„ (ユーザåãªã„ã—日付ã®æ¬ æ)"
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: ã“ã®ãƒªãƒ“ジョンを移æ¤\n"
+"n: ã“ã®ãƒªãƒ“ジョンã¯ç§»æ¤ã—ãªã„\n"
+"m: ã“ã®ãƒªãƒ“ジョンã®ç§»æ¤ã‚’マージã§å®Ÿç¾\n"
+"p: パッãƒã‚’表示\n"
+"c: é¸æŠžã•ã‚ŒãŸãƒªãƒ“ジョンをコミット\n"
+"q: 移æ¤ã®å–り消ã—\n"
+"?: ヘルプã®è¡¨ç¤º\n"
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "リビジョンを移æ¤ã—ã¾ã™ã‹ï¼Ÿ [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "ãã®ã‚ˆã†ãªã‚ªãƒ—ションã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "pull patches from REPO"
+msgstr "指定リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®å–ã‚Šè¾¼ã¿"
+
+msgid "pull patches from branch BRANCH"
+msgstr "指定ブランãƒã‹ã‚‰ã®å–ã‚Šè¾¼ã¿"
+
+msgid "pull all changesets up to BRANCH"
+msgstr "指定ブランãƒã®å…¨ã¦ã‚’å–り込む"
+
+msgid "skip over REV"
+msgstr "指定リビジョンã®ã‚¹ã‚­ãƒƒãƒ—"
+
+msgid "merge at REV"
+msgstr "指定リビジョンã®ç§»æ¤ã‚’マージã§å®Ÿç¾"
+
+msgid "parent to choose when transplanting merge"
+msgstr "移æ¤ã§ã®ãƒžãƒ¼ã‚¸ã«ä½¿ç”¨ã™ã‚‹è¦ªãƒªãƒ“ジョン"
+
+msgid "append transplant info to log message"
+msgstr "コミットログã¸ã®ç§»æ¤æƒ…å ±ã®ä»˜ä¸Ž"
+
+msgid "continue last transplant session after repair"
+msgstr "中断ã•ã‚ŒãŸç›´å‰ã®ç§»æ¤ä½œæ¥­ã®å†é–‹"
+
+msgid "filter changesets through command"
+msgstr "コマンドã«ã‚ˆã‚‹ãƒªãƒ“ジョンã®ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+
+msgid "transplant changesets from another branch"
+msgstr "別ブランãƒã‹ã‚‰ã®ãƒªãƒ“ジョン移æ¤"
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+" 移æ¤å¯¾è±¡ãƒªãƒ“ジョンã¯ã€ 作業領域ã®è¦ªãƒªãƒ“ジョンã®å­å­«ã¨ã—ã¦ã€\n"
+" コミットログを維æŒã—ã¤ã¤è¤‡è£½ã•ã‚Œã¾ã™ã€‚ 移æ¤ã§ã®è¤‡è£½ã«ã‚ˆã‚Šã€\n"
+" 移æ¤å¯¾è±¡ã¨åŒå†…容ã®ãƒªãƒ“ジョンã¯ã€ 履歴上ã«2回登場ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚\n"
+" 未公開リビジョンã®ãƒ–ランãƒã‚’〠ã¾ã¨ã‚ã¦ç§»å‹•ã—ãŸã„å ´åˆã¯ã€ rebase\n"
+" エクステンションを使用ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+" --log ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 以下ã®å½¢å¼ã®ã‚³ãƒ¡ãƒ³ãƒˆãŒãƒ­ã‚°ã«ä»˜åŠ ã•ã‚Œã¾ã™::"
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr " (transplanted from 移æ¤å…ƒãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤)"
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+" --filter ã«ã‚ˆã‚Šã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã‚’改変ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 指定ã•ã‚ŒãŸå€¤ã¯ã€\n"
+" コマンド起動ã«ä½¿ç”¨ã•ã‚Œã€ コマンドã®ç¬¬1引数ã«ã¯ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã€\n"
+" 第2引数ã«ã¯ãƒ‘ッãƒãŒæ ¼ç´ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+" --source/-s ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 指定リãƒã‚¸ãƒˆãƒªãŒç§»æ¤å…ƒã«ãªã‚Šã¾ã™ã€‚\n"
+" --branch/-b ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 指定リビジョンをå«ã‚€ãƒ–ランãƒã®ã€\n"
+" 指定リビジョンã¾ã§ãŒç§»æ¤å…ƒã«ãªã‚Šã¾ã™ã€‚ --all/-a ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" 指定ブランãƒä¸­ã®å…¨ã¦ã®ãƒªãƒ“ジョンãŒç§»æ¤å¯¾è±¡ã¨ãªã‚Šã€ ãれ以外ã®å ´åˆã¯ã€\n"
+" 移æ¤å€™è£œãƒªãƒ“ジョンã«é–¢ã—ã¦ã€ 移æ¤è¦å¦ã®å•ã„åˆã‚ã›ãŒç™ºç”Ÿã—ã¾ã™ã€‚"
+
+msgid ""
+" :hg:`transplant --branch REV --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+" :hg:`transplant --branch REV --all` 実行ã«ã‚ˆã‚Šã€\n"
+" 指定ã•ã‚ŒãŸåå‰ä»˜ãブランム(ã®ä¸­ã® REV ã¾ã§ã®ãƒªãƒ“ジョン) ãŒã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョンã®å­ã¨ã—ã¦ã€ 移æ¤ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+" ä»»æ„ã®ãƒªãƒ“ジョンã«å¯¾ã—㦠``--merge`` 指定をã—ãŸå ´åˆã€\n"
+" 当該リビジョンã®ç§»æ¤ã¯ã€ 複製ã«ã‚ˆã‚‹é€šå¸¸ã®æ–¹æ³•ã®ä»£ã‚ã‚Šã«ã€\n"
+" 当該リビジョンã¨ã®ãƒžãƒ¼ã‚¸ã§å®Ÿç¾ã•ã‚Œã¾ã™ã€‚ 本コマンドã«å¯¾ã—ã¦ã€\n"
+" 移æ¤å¯¾è±¡ã¨ã—ã¦æŒ‡å®šã•ã‚ŒãŸãƒªãƒ“ジョンã®ã†ã¡ã€ãƒžãƒ¼ã‚¸å®Ÿæ–½ãƒªãƒ“ジョンã¯ã€\n"
+" 移æ¤å¯¾è±¡ã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚ ã¾ãŸã€ マージ実施リビジョンã®ç¥–å…ˆã¯ã€\n"
+" 自動的ã«ã¯ç§»æ¤å¯¾è±¡ã«å«ã¾ã‚Œã¾ã›ã‚“。 ãã®ãŸã‚〠マージ実施リビジョンã€\n"
+" ãªã„ã—ãã®å­å­«ã®ç§»æ¤ã«é–¢ã—ã¦ã¯ã€ ã“ã¡ã‚‰ã®æ–¹æ³•ã‚‚検討ã—ã¦ãã ã•ã„。\n"
+" (※ 訳注: ã“ã®æ®µè½ã®ç¿»è¨³ã¯ã€ ã‚ã‹ã‚Šã‚„ã™ã•ã‚’é‡è¦–ã—ã¦ã€ \n"
+" 原文ã‹ã‚‰å¤§å¹…ã«æ”¹å¤‰ã—ã¦ã‚ã‚Šã¾ã™ã€‚ é©å®œåŽŸæ–‡ã®ãƒ˜ãƒ«ãƒ—ã‚‚å‚ç…§ã—ã¦ãã ã•ã„)"
+
+msgid ""
+" Merge changesets may be transplanted directly by specifying the\n"
+" proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+" :hg:`transplant --parent` 実行ã§ã®ã€ é©åˆ‡ãªè¦ªãƒªãƒ“ジョン指定ã«ã‚ˆã‚Šã€\n"
+" マージ実施リビジョンを〠直接移æ¤å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+" マージ指定もリビジョン指定もãªã„å ´åˆã€ :hg:`transplant`\n"
+" ã¯å¯¾è©±çš„ã«ç§»æ¤ã‚’実施ã—ã¾ã™ã€‚"
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+" è¡çªã«ã‚ˆã‚Šç§»æ¤ãŒå¤±æ•—ã—ãŸå ´åˆã€ 手動ã§ã®è¡çªè§£æ¶ˆå¾Œã« :hg:`transplant\n"
+" --continue/-c` を実行ã™ã‚‹ã“ã¨ã§ã€ 中断ã•ã‚ŒãŸç§»æ¤ã‚’å†é–‹å¯èƒ½ã§ã™ã€‚\n"
+" "
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr "--continue 㯠--branch〠--all〠--merge ã¨ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr "å…ƒ URL〠ブランãƒã‚¿ã‚°ã€ リビジョン一覧ã®ã„ãšã‚Œã‚‚指定ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "--all requires a branch revision"
+msgstr "--all ã«ã¯ãƒ–ランãƒãƒªãƒ“ジョン指定ãŒå¿…è¦ã§ã™"
+
+msgid "--all is incompatible with a revision list"
+msgstr "--all ã¨ãƒªãƒ“ジョンリスト指定ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "no revision checked out"
+msgstr "作業領域ãŒæœªæ›´æ–°ã§ã™"
+
+msgid "outstanding uncommitted merges"
+msgstr "マージãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "outstanding local changes"
+msgstr "変更ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+"``transplanted([set])``\n"
+" set 中ã®ç§»æ¤å…ˆãƒªãƒ“ジョン〠ãªã„ã—全移æ¤å…ˆãƒªãƒ“ジョン。"
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ":transplanted: 文字列。 (移æ¤å…ˆã§ã‚ã‚Œã°) 移æ¤å…ƒãƒªãƒ“ジョン㮠ID。"
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr "å•é¡Œã‚る文字コードをパスåã«ä½¿ç”¨ã™ã‚‹å ´åˆã®å¯¾å‡¦"
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+"パスåã®å–り扱ã„(例: パスè¦ç´ ã®åˆ†å‰²ã€ 文字大å°å¤‰æ›ç­‰)上〠ä¸é©åˆ‡ãªæ–‡å­—ã‚’\n"
+"å«ã‚€å¤šãƒã‚¤ãƒˆç¬¦å·åŒ–文字セット(MBCS)ãŒå­˜åœ¨ã—ã¾ã™ã€‚ ã“ã“ã§ã¯ãã®ã‚ˆã†ãªæ–‡å­—\n"
+"セット(例: shift_jis ãŠã‚ˆã³ big5)を「å•é¡Œæ–‡å­—コードã€ã¨å‘¼ã³ã¾ã™ã€‚\n"
+"本エクステンションã¯ã€ パスæ“作ã®å®Ÿæ–½å‰ã« unicode 文字列化ã™ã‚‹å‡¦ç†ã‚’\n"
+"割り込ã¾ã›ã‚‹ã“ã¨ã§ã€ å•é¡Œæ–‡å­—コードã«ã‚ˆã£ã¦ç™ºç”Ÿã™ã‚‹éšœå®³ã‚’防ãŽã¾ã™ã€‚"
+
+msgid "This extension is useful for:"
+msgstr "ã“ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯ä»¥ä¸‹ã®å ´åˆã«æœ‰ç”¨ã§ã™:"
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+"- shift_jis 文字コードを使用ã™ã‚‹æ—¥æœ¬èªž Windows ã®ãƒ¦ãƒ¼ã‚¶\n"
+"- big5 文字コードを使用ã™ã‚‹ä¸­å›½èªž Windows ã®ãƒ¦ãƒ¼ã‚¶\n"
+"- 文字大å°ã‚’区別ã§ããªã„ファイルシステム上ã§ã€ å•é¡Œæ–‡å­—コードを\n"
+" 使用ã—ãŸãƒªãƒã‚¸ãƒˆãƒªã‚’é‹ç”¨ã™ã‚‹ãƒ¦ãƒ¼ã‚¶"
+
+msgid "This extension is not needed for:"
+msgstr "ã“ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯ä»¥ä¸‹ã®å ´åˆã«ã¯ä¸è¦ã§ã™:"
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+"- パスåã« ASCII 文字ã—ã‹ä½¿ç”¨ã—ãªã„ユーザ\n"
+"- å•é¡Œæ–‡å­—コードを使用ã—ãªã„ユーザ"
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr "ã“ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã®åˆ©ç”¨ã«ã¯å¹¾ã¤ã‹ã®åˆ¶é™ãŒã‚ã‚Šã¾ã™:"
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+"- リãƒã‚¸ãƒˆãƒªå†…ã§ã¯å˜ä¸€ã®æ–‡å­—コードを使用ã—ã¦ãã ã•ã„\n"
+"- リãƒã‚¸ãƒˆãƒªãƒ‘ス末尾㌠0x5c ã®å ´åˆã€ .hg/hgrc ãŒèª­ã¿å‡ºã›ã¾ã›ã‚“\n"
+"- win32mbcs 㯠fixutf8 エクステンションã¨äº’æ›æ€§ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+"指定ã®ç„¡ã„å ´åˆã€ win32mbcs 㯠Mercurial ã«ã‚ˆã‚Šæ±ºå®šã•ã‚Œã‚‹\n"
+"(Python プログラム上ã®) encoding.encoding 変数値を使用ã—ã¾ã™ã€‚\n"
+"以下ã®è¨­å®šè¨˜è¿°ã«ã‚ˆã‚Šã€ 文字コードを指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™::"
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+" [win32mbcs]\n"
+" encoding = sjis"
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr "ログメッセージã®æ–‡å­—コード㫠UTF-8 を使用ã—ãŸã„ユーザ等ã«æœ‰ç”¨ã§ã™ã€‚\n"
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr "[win32mbcs] 文字コード '%s' ã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«å変æ›ã«å¤±æ•—\n"
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr "[win32mbcs] ã“ã®ãƒ—ラットフォームã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。\n"
+
+msgid "perform automatic newline conversion"
+msgstr "改行形å¼ã®è‡ªå‹•å¤‰æ›"
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+" éžæŽ¨å¥¨: リãƒã‚¸ãƒˆãƒªã®è¤‡è£½ã®éš›ã«è¨­å®šã¯è¤‡è£½ã•ã‚Œãªã„ãŸã‚〠win32text\n"
+" エクステンションã¯å€‹ã€…ã®è¤‡è£½ï¼å€‹ã€…ã®ãƒ¦ãƒ¼ã‚¶ã”ã¨ã«éƒ½åº¦è¨­å®šã™ã‚‹å¿…è¦ãŒ\n"
+" ã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+" ãã®ãŸã‚〠代替手段ã¨ã—㦠``eol`` エクステンションãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+" ``eol`` エクステンションã§ã¯ã€ 構æˆç®¡ç†å¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ˆã‚‹è¨­å®šãŒ\n"
+" å¯èƒ½ã§ã™ã®ã§ã€ 複製ã—ãŸãƒªãƒã‚¸ãƒˆãƒªã¯æœ€åˆã‹ã‚‰é©åˆ‡ãªçŠ¶æ…‹ã§ä½¿ç”¨ã§ãã¾ã™ã€‚"
+
+msgid "To perform automatic newline conversion, use::"
+msgstr "改行形å¼ã®è‡ªå‹•å¤‰æ›ã‚’è¡Œã†å ´åˆã€ 以下ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™::"
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # ãªã„ã— ** = macencode:"
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # ãªã„ã— ** = macdecode:"
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr "変æ›ã¯ã—ãªã„ã‚‚ã®ã®ã€ é–“é•ã£ãŸæ”¹è¡Œå½¢å¼ã§ã®ã‚³ãƒŸãƒƒãƒˆã‚’防止ã—ãŸã„å ´åˆã¯::"
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # ãªã„ã— pretxncommit.cr = python:hgext.win32text.forbidcr"
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+"æ„図ã›ã¬å±¥æ­´å映ã®é˜²æ­¢ã®ãŸã‚ã«ã€ サーãƒå´ã§åŒæ§˜ã®ç¢ºèªã‚’è¡Œã„ãŸã„å ´åˆã¯::"
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # ãªã„ã— pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+"警告: %s ã¯æ—¢ã«è¡Œæœ«ãŒ %s å½¢å¼ã§ã™\n"
+"ãã®ãŸã‚ win32text ã«ã‚ˆã‚‹è¡Œæœ«å½¢å¼å¤‰æ›ã¯ä¸è¦ã§ã™ã€‚\n"
+"次回㮠commit ã¾ã§ã«ã€ Mercurial.ini ãªã‚Š %s ã«ãŠã‘ã‚‹ encode/decode 設定を\n"
+"見直ã™ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚\n"
+
+#, python-format
+msgid "attempt to commit or push text file(s) using %s line endings\n"
+msgstr "è¡Œæœ«å½¢å¼ %s ã«ã‚ˆã‚‹ãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã® commit ãªã„ã—履歴å映を実施\n"
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr "リビジョン %s: %s\n"
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+"\n"
+"åŒæ§˜ã®é–“é•ã„を防ãã«ã¯ã€ 以下ã®è¨­å®šã‚’ Mercurial.ini ãªã„ã— .hg/hgrc ã«\n"
+"以下ã®è¨˜è¿°ã‚’追加ã—ã¦ãã ã•ã„:"
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+
+#, python-format
+msgid "and also consider adding:"
+msgstr "å¿…è¦ã§ã‚ã‚Œã°ä»¥ä¸‹ã®è¨˜è¿°ã‚‚追加ã—ã¦ãã ã•ã„:"
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+"win32text ã¯æŽ¨å¥¨ã•ã‚Œã¦ã„ã¾ã›ã‚“: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension å‚ç…§\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr "ローカルãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã§ã®ãƒªãƒã‚¸ãƒˆãƒªã®æ¤œå‡ºï¼å…¬é–‹"
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+"Zeroconf ãŒæœ‰åŠ¹åŒ–ã•ã‚ŒãŸãƒªãƒã‚¸ãƒˆãƒªã¯ã€ サーãƒãƒ¼ã‚„サービスã®è¨­å®šç„¡ã—ã«ã€\n"
+"ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ä¸Šã«å‘ŠçŸ¥ã•ã‚Œã¾ã™ã€‚ 対象ã®IPアドレス等を知らãªãã¦ã‚‚ã€\n"
+"告知ã•ã‚ŒãŸãƒªãƒã‚¸ãƒˆãƒªã‚’検出ã§ãã¾ã™ã€‚"
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+":hg:`serve` を稼動中ã®ãƒªãƒã‚¸ãƒˆãƒªãŒã€ ä»–ã®åˆ©ç”¨è€…ã‹ã‚‰æ¤œå‡ºå¯èƒ½ã«ãªã‚Šã¾ã™::"
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ":hg:`paths` を使ã†ã“ã¨ã§ã€ Zeroconf ãŒæœ‰åŠ¹ãªãƒªãƒã‚¸ãƒˆãƒªã‚’検出ã§ãã¾ã™::"
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+msgid "archive prefix contains illegal components"
+msgstr "アーカイブã®æŽ¥é ­è¾žãŒä¸æ­£ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆã‚’å«ã¿ã¾ã™"
+
+msgid "archiving"
+msgstr "アーカイブ中"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr "ä¸æ­£ãª .hg/bookmarks 記述行: %r\n"
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "ブックマーク '%s' ã¯ä¸æ­£ãªæ–‡å­—ã‚’å«ã‚“ã§ã„ã¾ã™"
+
+#, python-format
+msgid "branch %s not found"
+msgstr "ブランム%s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "divergent bookmark %s stored as %s\n"
+msgstr "分å²ã™ã‚‹ãƒ–ックマーク %s ã‚’ %s ã¨ã—ã¦ä¿å­˜\n"
+
+#, python-format
+msgid "adding remote bookmark %s\n"
+msgstr "連æºå…ˆã«ãƒ–ックマーク %s を追加中\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "変更ã•ã‚ŒãŸãƒ–ックマークを探索中\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "変更ã•ã‚ŒãŸãƒ–ックマークã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "unknown parent"
+msgstr "未知ã®è¦ª"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "%s:%d ã®ä¸€è²«æ€§ãƒã‚§ãƒƒã‚¯ã«å¤±æ•—"
+
+msgid "cannot create new bundle repository"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã®æ–°è¦ä½œæˆã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "予期ã›ã¬ãƒ‡ãƒ¼ã‚¿çµ‚端 (実データ:%d ãƒã‚¤ãƒˆ 期待データ:%d ãƒã‚¤ãƒˆ)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "ä¸æ­£ãªãƒ‡ãƒ¼ã‚¿é•·: %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: Mercurial ã®ãƒãƒ³ãƒ‰ãƒ«å½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: 未知ã®ãƒãƒ³ãƒ‰ãƒ«å½¢å¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s"
+
+msgid "empty username"
+msgstr "ユーザåãŒç©ºã§ã™"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "ユーザå %s ãŒæ”¹è¡Œã‚’å«ã‚“ã§ã„ã¾ã™"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "ã‚¿ã‚°å '%s' ã¯ã‚·ã‚¹ãƒ†ãƒ ã§äºˆç´„ã•ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "--message 㨠--logfile ã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "コミットログ '%s' を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“: %s"
+
+msgid "limit must be a positive integer"
+msgstr "制é™ã«ã¯æ­£æ•°ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid "limit must be positive"
+msgstr "制é™ã«ã¯æ­£æ•°ã‚’指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "出力ファイルåã«ä¸æ­£ãªãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ '%%%s' 指定"
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "--changelog 㨠--manifest ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr "--changelog ãªã„ã— --manifest ã¨ãƒ•ã‚¡ã‚¤ãƒ«åã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr "--changelog ãªã„ã— --manifest ã®æŒ‡å®šã¯ãƒªãƒã‚¸ãƒˆãƒªæŒ‡å®šãŒå¿…è¦ã§ã™"
+
+msgid "invalid arguments"
+msgstr "引数ãŒä¸æ­£ã§ã™"
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: コピー失敗 - ファイルã¯ç™»éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: コピー失敗 - 削除予定ã®ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: 上書ã失敗 - %s 㯠%s ã¨è¡çª\n"
+
+#, python-format
+msgid "%s: can't copy - same file\n"
+msgstr "%s: コピー失敗 - åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã§ã™\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: 上書ãã—ã¾ã›ã‚“ - ファイルãŒå­˜åœ¨ã—ã¾ã™\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: 移動ã¯è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“ - %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: 複製ã¯è¨˜éŒ²ã•ã‚Œã¦ã„ã¾ã›ã‚“ - %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: 作業コピーã‹ã‚‰å‰Šé™¤ã—ã¾ã—ãŸ\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: コピー失敗 - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "%s ã‚’ %s ã«ç§»å‹•ä¸­\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "%s ã‚’ %s ã«ã‚³ãƒ”ー中\n"
+
+msgid "no source or destination specified"
+msgstr "作業元もã—ãã¯ä½œæ¥­å…ˆã‚’指定ã—ã¦ã„ã¾ã›ã‚“"
+
+msgid "no destination specified"
+msgstr "作業先を指定ã—ã¦ã„ã¾ã›ã‚“"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr "複数ã®ä½œæ¥­å…ƒã®å ´åˆã€ 作業先ã¯å­˜åœ¨ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "作業先 %s ã¯ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "(consider using --after)\n"
+msgstr "(--after を使ã£ã¦ã¿ã¦ã¯ï¼Ÿ)\n"
+
+msgid "child process failed to start"
+msgstr "å­ãƒ—ロセスã®ç”Ÿæˆã«å¤±æ•—"
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆ: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ブランãƒ: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "ブックマーク: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "ã‚¿ã‚°: %s\n"
+
+#, python-format
+msgid "phase: %s\n"
+msgstr "フェーズ: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "親: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "管ç†ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "ユーザ: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "日付: %s\n"
+
+msgid "files+:"
+msgstr "ファイル追加: "
+
+msgid "files-:"
+msgstr "ファイル削除: "
+
+msgid "files:"
+msgstr "ファイル: "
+
+#, python-format
+msgid "files: %s\n"
+msgstr "ファイル: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "コピー: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "ãã®ä»–: %s=%s\n"
+
+msgid "description:\n"
+msgstr "説明:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "è¦ç´„: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr "%s: '%s' ã¨ã„ã†ã‚­ãƒ¼ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "found revision %s from %s\n"
+msgstr "リビジョン %s ã‚’ %s ã§è¦‹ã¤ã‘ã¾ã—ãŸ\n"
+
+msgid "revision matching date not found"
+msgstr "リビジョンã«ä¸€è‡´ã™ã‚‹æ—¥ä»˜ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "親リビジョンã«å­˜åœ¨ã—ãªã„ファイルã¯è¿½è·¡ã§ãã¾ã›ã‚“: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "存在ã—ãªã„ファイルã¯è¿½è·¡ã§ãã¾ã›ã‚“: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr "ファイルåãŒæ˜Žç¤ºã•ã‚ŒãŸå ´åˆã®ã¿è¤‡è£½/改åを追跡å¯èƒ½ã§ã™"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "-G/--graph 㨠--%s ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "%s を追加登録中\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "存在ã—ãªã„副リãƒã‚¸ãƒˆãƒªã¸ã®å‡¦ç†ã‚’çœç•¥: %s\n"
+
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "リビジョン %s を改変中\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "リビジョン %s ã‚’ %s ã«ã‚³ãƒ”ー中\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "中途リビジョン %s を除外中\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "改変対象リビジョン %s を除外中\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr "HG: コミットログを入力ã—ã¦ãã ã•ã„。'HG:' ã§å§‹ã¾ã‚‹è¡Œã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: メッセージãŒç©ºã®ã¾ã¾ãªã‚‰ã‚³ãƒŸãƒƒãƒˆã‚’中断ã—ã¾ã™ã€‚"
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: ユーザ: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: ブランãƒã®ãƒžãƒ¼ã‚¸"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: ブランム'%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: 副リãƒã‚¸ãƒˆãƒª %s"
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: %s を追加"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: %s を変更"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: %s を削除"
+
+msgid "HG: no files changed"
+msgstr "HG: ファイル変更ãªã—"
+
+msgid "empty commit message"
+msgstr "コミットログãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "%s ã®è¿½åŠ ç™»éŒ²ã‚’å–り消ã—中\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "%s ã®å¾©æ—§ä¸­\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "%s ã®å¾©æ—§ä¸­\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "ファイル %s ã¯ç®¡ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "%s ã«ã¯æ”¹å¤‰ã®å¿…è¦ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr "リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆä½ç½®ã€ ãªã„ã—ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ‘ス"
+
+msgid "DIR"
+msgstr "ディレクトリ"
+
+msgid "change working directory"
+msgstr "作業領域ã®å¤‰æ›´"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr "å•ã„åˆã‚ã›ç„¡ã—ã§ã€ 最åˆã®é¸æŠžè‚¢ã‚’自動的ã«é¸æŠž"
+
+msgid "suppress output"
+msgstr "出力を抑止"
+
+msgid "enable additional output"
+msgstr "付加的ãªå‡ºåŠ›ã‚’有効化"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr "オプション設定を指定ï¼ä¸Šæ›¸ã(指定形å¼ã¯ 'section.name=value')"
+
+msgid "CONFIG"
+msgstr "設定"
+
+msgid "enable debugging output"
+msgstr "デãƒãƒƒã‚°å‡ºåŠ›ã‚’有効化"
+
+msgid "start debugger"
+msgstr "デãƒãƒƒã‚¬ã‚’開始"
+
+msgid "set the charset encoding"
+msgstr "文字エンコーディングã®è¨­å®š"
+
+msgid "ENCODE"
+msgstr "文字コード"
+
+msgid "MODE"
+msgstr "モード"
+
+msgid "set the charset encoding mode"
+msgstr "文字エンコーディングã®ãƒ¢ãƒ¼ãƒ‰è¨­å®š"
+
+msgid "always print a traceback on exception"
+msgstr "例外発生ã®éš›ã«å¸¸ã«ãƒˆãƒ¬ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚’表示"
+
+msgid "time how long the command takes"
+msgstr "コマンド実行ã®æ‰€è¦æ™‚間を計測"
+
+msgid "print command execution profile"
+msgstr "コマンド実行ã®ãƒ—ロファイルを表示"
+
+msgid "output version information and exit"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…報を表示ã—ã¦çµ‚了"
+
+msgid "display help and exit"
+msgstr "ヘルプ情報を表示ã—ã¦çµ‚了"
+
+msgid "do not perform actions, just print output"
+msgstr "実施予定ã®å‡¦ç†å†…容ã®è¡¨ç¤ºã®ã¿ã§å‡¦ç†å®Ÿæ–½ã¯æŠ‘æ­¢"
+
+msgid "specify ssh command to use"
+msgstr "SSH 連æºã§ä½¿ç”¨ã™ã‚‹ ssh コマンド"
+
+msgid "specify hg command to run on the remote side"
+msgstr "é éš”ホストå´ã§å®Ÿè¡Œã•ã‚Œã‚‹ hg コマンド"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr "サーãƒè¨¼æ˜Žæ›¸ã®æ¤œè¨¼çœç•¥(web.cacerts 設定ã®ç„¡è¦–)"
+
+msgid "PATTERN"
+msgstr "パターン"
+
+msgid "include names matching the given patterns"
+msgstr "パターンã«åˆè‡´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’処ç†å¯¾è±¡ã«è¿½åŠ "
+
+msgid "exclude names matching the given patterns"
+msgstr "パターンã«åˆè‡´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’処ç†å¯¾è±¡ã‹ã‚‰é™¤å¤–"
+
+msgid "use text as commit message"
+msgstr "指定テキストをコミットログã¨ã—ã¦ä½¿ç”¨"
+
+msgid "read commit message from file"
+msgstr "コミットログをファイルã‹ã‚‰èª­ã¿è¾¼ã¿"
+
+msgid "record the specified date as commit date"
+msgstr "指定日時をコミット日時ã¨ã—ã¦è¨˜éŒ²"
+
+msgid "record the specified user as committer"
+msgstr "指定ユーザをコミットユーザã¨ã—ã¦è¨˜éŒ²"
+
+msgid "STYLE"
+msgstr "スタイル"
+
+msgid "display using template map file"
+msgstr "当該スタイルã§è¡¨ç¤ºã‚’カスタマイズ"
+
+msgid "display with template"
+msgstr "当該テンプレートã§è¡¨ç¤ºã‚’カスタマイズ"
+
+msgid "show patch"
+msgstr "パッãƒå½¢å¼ã§ã®è¡¨ç¤º"
+
+msgid "do not show merges"
+msgstr "マージ実施リビジョンã®è¡¨ç¤ºæŠ‘æ­¢"
+
+msgid "output diffstat-style summary of changes"
+msgstr "diffstat å½¢å¼ã®å¤‰æ›´æ¦‚è¦ã‚’生æˆ"
+
+msgid "show the revision DAG"
+msgstr "履歴ツリーã®è¡¨ç¤º"
+
+msgid "treat all files as text"
+msgstr "全ファイルをテキストファイルã¨ä»®å®š"
+
+msgid "omit dates from diff headers"
+msgstr "差分表示ã®éš›ã«æ—¥ä»˜æƒ…å ±ã®è¡¨ç¤ºã‚’抑止"
+
+msgid "show which function each change is in"
+msgstr "差分表示ã®éš›ã«é–¢æ•°å情報を表示"
+
+msgid "produce a diff that undoes the changes"
+msgstr "変更をå–り消ã™ãŸã‚ã®å·®åˆ†ã‚’生æˆ"
+
+msgid "number of lines of context to show"
+msgstr "差分コンテキストã®è¡Œæ•°"
+
+msgid "SIMILARITY"
+msgstr "類似度"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "ファイル改å推定ã®éš›ã®é¡žä¼¼åº¦(0 以上 100 以下)"
+
+msgid "recurse into subrepositories"
+msgstr "副リãƒã‚¸ãƒˆãƒªã¸ã®å†å¸°çš„é©ç”¨"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[OPTION]... [FILE]..."
+
+msgid "add the specified files on the next commit"
+msgstr "指定ファイルã®è¿½åŠ ç™»éŒ²äºˆç´„"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr " 構æˆç®¡ç†ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ ç™»éŒ²ã‚’予約ã—ã¾ã™ã€‚"
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 次回ã®ã‚³ãƒŸãƒƒãƒˆã‹ã‚‰æ§‹æˆç®¡ç†å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚\n"
+" 追加登録ã®ã‚³ãƒŸãƒƒãƒˆå‰å–り消ã—㯠:hg:`help forget` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " If no names are given, add all files to the repository."
+msgstr ""
+" ファイルå指定ãŒç„¡ã„å ´åˆã€ 作業領域中ã®å…¨ãƒ•ã‚¡ã‚¤ãƒ«ãŒå¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid " .. container:: verbose"
+msgstr " .. container:: verbose"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" 以下ã®å®Ÿè¡Œä¾‹ã¯ã€ :hg:`add` 実行ã«ãŠã‘ã‚‹(未知ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®)自動的ãª\n"
+" 追加ã®ä¾‹ã§ã™::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" foo.c を追加登録中\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ç™»éŒ²ãŒæˆåŠŸã—ãŸå ´åˆã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ ç™»éŒ²ã€ ãŠã‚ˆã³ä¸åœ¨ãƒ•ã‚¡ã‚¤ãƒ«ã®ç™»éŒ²é™¤å¤–"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" 作業領域中ã®æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã®è¿½åŠ ç™»éŒ²ã€ ãŠã‚ˆã³å…¨ä¸åœ¨ãƒ•ã‚¡ã‚¤ãƒ«ã®ç™»éŒ²é™¤å¤–ã‚’\n"
+" è¡Œãªã„ã¾ã™ã€‚"
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" ``.hgignore`` ã«è¨˜è¿°ã•ã‚ŒãŸãƒ‘ターンã«åˆè‡´ã™ã‚‹æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã¯\n"
+" 無視ã•ã‚Œã¾ã™ã€‚ :hg:`add` ã¨åŒæ§˜ã«ã€ 実行効果ãŒç™ºæ®ã•ã‚Œã‚‹ã®ã¯\n"
+" 次回コミット時点ã§ã™ã€‚"
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. With a parameter greater than 0,\n"
+" this compares every removed file with every added file and records\n"
+" those similar enough as renames. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed. If\n"
+" not specified, -s/--similarity defaults to 100 and only renames of\n"
+" identical files are detected."
+msgstr ""
+" ファイルã®æ”¹åを検知ã™ã‚‹ã«ã¯ -s/--similarity を使用ã—ã¾ã™ã€‚ ã“ã‚Œã¯ã€\n"
+" 0 (改å比較無ã—) ã‹ã‚‰ 100 (完全一致ã§åˆ¤å®š) ã®ç¯„囲ã§ã€ 類似度を指定\n"
+" ã™ã‚‹ã‚ªãƒ—ションã§ã™ (パーセンテージ指定)。 0 より大ãã„指定値ã®å ´åˆã€\n"
+" å…¨ã¦ã®è¿½åŠ ï¼é™¤å¤–ファイル対象ã¨ã—ã¦ã€ 改åã®æœ‰ç„¡ãŒåˆ¤å®šã•ã‚Œã¾ã™ã€‚ \n"
+" 改å判定ã«ã¯ã€ 相応ã®æ™‚é–“ã‚’è¦ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ 判定çµæžœã®ç¢ºèªã¯ã€\n"
+" 本コマンドã®å®Ÿè¡Œå¾Œã« :hg:`status -C` 出力をå‚ç…§ã—ã¦ãã ã•ã„。\n"
+" -s/--similarity 未指定ã®å ´åˆã€ 100 ãŒæŒ‡å®šã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã•ã‚Œã€\n"
+" 内容ãŒå®Œå…¨ã«ä¸€è‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ãŒã€ 改åã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid "similarity must be a number"
+msgstr "類似度ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid "similarity must be between 0 and 100"
+msgstr "類似度ã«ã¯0ã‹ã‚‰100ã®é–“を指定ã—ã¦ãã ã•ã„"
+
+msgid "annotate the specified revision"
+msgstr "当該リビジョン時点ã§ã®ç”±æ¥æƒ…報を表示"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "複製ï¼æ”¹å元ファイルã®å±¥æ­´è¿½è·¡ã¨ã€ ファイルåã®è¡¨ç¤º(éžæŽ¨å¥¨)"
+
+msgid "don't follow copies and renames"
+msgstr "複製ï¼æ”¹å元ファイル履歴ã®è¿½è·¡ã‚’抑止"
+
+msgid "list the author (long with -v)"
+msgstr "ユーザåを表示(-v 指定時ã¯è©³ç´°è¡¨ç¤º)"
+
+msgid "list the filename"
+msgstr "ファイルåを表示"
+
+msgid "list the date (short with -q)"
+msgstr "日付を表示(-q 指定時ã¯ç°¡ç•¥è¡¨ç¤º)"
+
+msgid "list the revision number (default)"
+msgstr "リビジョン番å·ã‚’表示(既定動作)"
+
+msgid "list the changeset"
+msgstr "ãƒãƒƒã‚·ãƒ¥å€¤ã‚’表示"
+
+msgid "show line number at the first appearance"
+msgstr "ç”±æ¥ãƒªãƒ“ジョンã§ã®åˆå‡ºæ™‚ã®è¡Œç•ªå·ã‚’表示"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+
+msgid "show changeset information by line for each file"
+msgstr "ファイル行毎ã®ãƒªãƒ“ジョン情報表示"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr " ファイルã®å„行毎ã«ã€ ãã®å†…容ãŒç”±æ¥ã™ã‚‹ãƒªãƒ“ジョンIDを表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr " 本コマンドã¯ã€ 変更ã®å®Ÿæ–½è€…ãªã„ã—実施時期を特定ã™ã‚‹ã®ã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" -a/--text 指定ãŒç„¡ã„å ´åˆã€ ãƒã‚¤ãƒŠãƒªã¨æ€ã—ãファイルã¯å‡¦ç†å¯¾è±¡ã‹ã‚‰\n"
+" 除外ã•ã‚Œã¾ã™ã€‚ -a 指定ãŒæœ‰ã‚‹å ´åˆã€ çµæžœã®æœ‰ç”¨æ€§ã®æœ‰ç„¡ã«é–¢ã‚らãš\n"
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒå‡¦ç†å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚\n"
+" "
+
+msgid "at least one filename or pattern is required"
+msgstr "ファイルåãªã„ã—パターンを最低1ã¤æŒ‡å®šã—ã¦ãã ã•ã„"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr "-l 指定時ã«ã¯ -n/-c ã®ã†ã¡æœ€ä½Žã§ã‚‚ã„ãšã‚Œã‹1ã¤ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã§ã™\n"
+
+msgid "do not pass files through decoders"
+msgstr "デコード処ç†ã‚’回é¿"
+
+msgid "directory prefix for files in archive"
+msgstr "アーカイブファイルã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæŽ¥é ­è¾ž"
+
+msgid "PREFIX"
+msgstr "接頭辞"
+
+msgid "revision to distribute"
+msgstr "アーカイブ対象リビジョン"
+
+msgid "type of distribution to create"
+msgstr "アーカイブ種別"
+
+msgid "[OPTION]... DEST"
+msgstr "[OPTION]... DEST"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "特定リビジョン時点ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®ãƒªãƒã‚¸ãƒˆãƒªå¤–ã¸ã®ç”Ÿæˆ"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 作業領域ã®è¦ªãƒªãƒ“ジョンãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" ä»–ã®ãƒªãƒ“ジョンを指定ã™ã‚‹å ´åˆã¯ -r/--rev を使用ã—ã¾ã™ã€‚"
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+" アーカイブ種別ã¯ã€ 出力先ファイルã®æ‹¡å¼µå­ã‹ã‚‰è‡ªå‹•çš„ã«åˆ¤å®šã•ã‚Œã¾ã™ãŒ\n"
+" -t/--type ã§å¼·åˆ¶ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚"
+
+msgid " Examples:"
+msgstr " 例:"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr " - 1.0 版時点ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’æ ¼ç´ã—㟠zip ファイルã®ç”Ÿæˆ::"
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr " hg archive -r 1.0 project-1.0.zip"
+
+msgid " - create a tarball excluding .hg files::"
+msgstr " - .hg ã§å§‹ã¾ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’除外ã—㟠tar ファイルã®ç”Ÿæˆ::"
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr " hg archive project.tar.gz -X \".hg*\""
+
+msgid " Valid types are:"
+msgstr " 有効種別一覧:"
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+" :``files``: 展開済ã¿ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ã®ã‚¤ãƒ¡ãƒ¼ã‚¸(無指定時)\n"
+" :``tar``: éžåœ§ç¸®ã® tar アーカイブ形å¼\n"
+" :``tbz2``: bzip2 圧縮㮠tar アーカイブ形å¼\n"
+" :``tgz``: gzip 圧縮㮠tar アーカイブ形å¼\n"
+" :``uzip``: éžåœ§ç¸®ã® zip アーカイブ形å¼\n"
+" :``zip``: deflate 圧縮㮠zip アーカイブ形å¼"
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+" アーカイブ生æˆå…ˆã¨ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åãªã„ã—ディレクトリåã®æŒ‡å®šã«ã¯\n"
+" ç½®æ›æŒ‡å®šã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ç½®æ›æŒ‡å®šã«é–¢ã™ã‚‹è©³ç´°ã¯\n"
+" :hg:`help export` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+" アーカイブ生æˆã®éš›ã«ã¯ã€ 展開時ã®æ ¼ç´å…ˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªåãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚\n"
+" -p/--prefix ã«ã‚ˆã‚Šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªåを指定ã§ãã¾ã™(ç½®æ›æŒ‡å®šå¯èƒ½)。 \n"
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ アーカイブファイルã¸ã®ãƒ‘スã®æœ«å°¾è¦ç´ ã‹ã‚‰ã€\n"
+" æ‹¡å¼µå­ã‚’除ã„ãŸã‚‚ã®ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "no working directory: please specify a revision"
+msgstr "作業領域ã«ã‚ˆã‚‹æš—黙指定ãŒã§ãã¾ã›ã‚“ã®ã§ãƒªãƒ“ジョンを明示ã—ã¦ãã ã•ã„"
+
+msgid "repository root cannot be destination"
+msgstr "リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆã‚’作æˆå…ˆã«æŒ‡å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+msgid "cannot archive plain files to stdout"
+msgstr "通常ファイルã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å…ˆã«æ¨™æº–出力を指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "打ã¡æ¶ˆã—リビジョンをç¾è¦ªãƒªãƒ“ジョンã¨ãƒžãƒ¼ã‚¸"
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "打ã¡æ¶ˆã—リビジョンã¨ã®ãƒžãƒ¼ã‚¸å¯¾è±¡ (éžæŽ¨å¥¨)"
+
+msgid "revision to backout"
+msgstr "打ã¡æ¶ˆã—対象リビジョン"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[OPTION]... [-r] REV"
+
+msgid "reverse effect of earlier changeset"
+msgstr "以å‰ã®ãƒªãƒ“ジョンã«ãŠã‘る変更ã®æ‰“ã¡æ¶ˆã—"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" 対象リビジョンã§ã®å¤‰æ›´ã‚’打ã¡æ¶ˆã™åŠ¹æžœã‚’æŒã¤å¤‰æ›´ã‚’ã€\n"
+" 作業領域ã§ä½œæˆã—ã¾ã™ã€‚"
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+" 対象リビジョンãŒã€ 作業領域ã®è¦ªãƒªãƒ“ジョンã®å ´åˆã€\n"
+" æ–°è¦ä½œæˆã•ã‚ŒãŸæ‰“ã¡æ¶ˆã—リビジョンã¯ã€ 自動的ã«ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã™ã€‚\n"
+" ãれ以外ã®å ´åˆã¯ã€ マージãŒå®Ÿæ–½ã•ã‚Œã¾ã™ãŒã€\n"
+" マージçµæžœã¯ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+" .. note::\n"
+" :hg:`backout` ã«ã‚ˆã‚‹æ‰“消ã—機能ã¯ã€ãƒžãƒ¼ã‚¸å®Ÿæ–½ãƒªãƒ“ジョンã«å¯¾ã—ã¦ã¯ã€\n"
+" é©ç”¨ã§ãã¾ã›ã‚“。"
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 打ã¡æ¶ˆã—リビジョンã¯ã€\n"
+" å˜ä¸€ã®è¦ªãƒªãƒ“ジョンã—ã‹æŒãŸãªã„ã€\n"
+" 一直線ã®å±¥æ­´ã¨ãªã‚‹ã‚ˆã†ã«ä½œæˆã•ã‚Œã¾ã™ã€‚\n"
+" --merge を指定ã—ãŸå ´åˆã¯ã€ 2ã¤ã®è¦ªãƒªãƒ“ジョンをæŒã¤ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚\n"
+" 一方ã®è¦ªã¯ä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンã€\n"
+" ã‚‚ã†ä¸€æ–¹ã¯ã€ 打ã¡æ¶ˆã—リビジョン (ï¼ æ‰“ã¡æ¶ˆã—対象ã®æ–°è¦å­ãƒªãƒ“ジョン)\n"
+" ã§ã™ã€‚"
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+" 1.8 版よりå‰ã®æœ¬ã‚³ãƒžãƒ³ãƒ‰ã® --merge ç„¡ã—時挙動ã¯ã€\n"
+" 打消ã—ã‚’ --merge 付ãã§å®Ÿè¡Œã—ãŸå¾Œã§ã€\n"
+" :hg:`update --clean .` を実行ã—ãŸå ´åˆã¨ç­‰ä¾¡ã§ã™ã€‚\n"
+" ã“ã“ã§ã® :hg:`update --clean .` 実行ã¯ã€\n"
+" マージã®å®Ÿæ–½ã‚’キャンセルã—ã€\n"
+" 打ã¡æ¶ˆã—リビジョンを後ã‹ã‚‰åˆ¥é€”マージã§ãるよã†ã«ã€\n"
+" ヘッドã®ã¾ã¾æ®‹ã™åƒãã‚’ã—ã¾ã™ã€‚"
+
+msgid "please specify just one revision"
+msgstr "リビジョン指定ã¯1ã¤ã ã‘ã§ã™"
+
+msgid "please specify a revision to backout"
+msgstr "打ã¡æ¶ˆã—対象リビジョンを指定ã—ã¦ãã ã•ã„"
+
+msgid "cannot backout change on a different branch"
+msgstr "ç•°ãªã‚‹ãƒ–ランãƒã«å±žã™ã‚‹ãƒªãƒ“ジョンを打ã¡æ¶ˆã™ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+msgid "cannot backout a change with no parents"
+msgstr "親ã®ç„¡ã„リビジョンを打ã¡æ¶ˆã™ã“ã¨ã¯ã§ãã¾ã›ã‚“"
+
+msgid "cannot backout a merge changeset"
+msgstr "マージ実施リビジョンã¯æ‰“ã¡æ¶ˆã—対象ã«ã§ãã¾ã›ã‚“"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr "éžãƒžãƒ¼ã‚¸ãƒªãƒ“ジョンã«ã¯ --parent を指定ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "リビジョン %s ã¯ãƒªãƒ“ジョン %s を打ã¡æ¶ˆã—ã¾ã™\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "リビジョン %s ã¨ãƒžãƒ¼ã‚¸ä¸­\n"
+
+msgid "reset bisect state"
+msgstr "探索状態ã®ãƒªã‚»ãƒƒãƒˆ"
+
+msgid "mark changeset good"
+msgstr "対象リビジョンã®æŽ¢ç´¢çŠ¶æ…‹ã‚’ good 化"
+
+msgid "mark changeset bad"
+msgstr "対象リビジョンã®æŽ¢ç´¢çŠ¶æ…‹ã‚’ bad 化"
+
+msgid "skip testing changeset"
+msgstr "対象リビジョンã®æ¤œè¨¼ä½œæ¥­ã‚’çœç•¥"
+
+msgid "extend the bisect range"
+msgstr "探索範囲ã®æ‹¡å¼µ"
+
+msgid "use command to check changeset state"
+msgstr "good/bad 検証用コマンド"
+
+msgid "do not update to target"
+msgstr "対象リビジョンã«ã‚ˆã‚‹ä½œæ¥­é ˜åŸŸå†…容ã®æ›´æ–°ã‚’抑止"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c CMD] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr "リビジョンã®åˆ†å‰²æŽ¢ç´¢"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" å•é¡Œç™ºç”Ÿå¥‘æ©Ÿã¨ãªã‚‹ãƒªãƒ“ジョンã®ç‰¹å®šã‚’補助ã—ã¾ã™ã€‚ 使用開始ã®éš›ã«ã¯ã€\n"
+" å•é¡ŒãŒç™ºç”Ÿã™ã‚‹æ—¢çŸ¥ã®ãƒªãƒ“ジョンã®ã†ã¡ã€ 最å¤ã®ã‚‚ã®ã‚’ bad ã¨ãƒžãƒ¼ã‚¯ã—ã€\n"
+" å•é¡ŒãŒç™ºç”Ÿã—ãªã„既知ã®ãƒªãƒ“ジョンã®ã†ã¡ã€ 最新ã®ã‚‚ã®ã‚’ good ã¨ãƒžãƒ¼ã‚¯\n"
+" ã—ã¾ã™ã€‚ 本コマンドã¯ã€ 検証対象リビジョンã§ä½œæ¥­é ˜åŸŸã‚’æ›´æ–°ã—ã¾ã™(-U/\n"
+" --noupdate 指定時除ã)。 当該リビジョンを検証ã—ãŸãªã‚‰ã€ bad ã‚ã‚‹ã„ã¯\n"
+" good ã§ãƒžãƒ¼ã‚¯ã—ã¦ãã ã•ã„。 本コマンドã¯ã€ 次ã®æ¤œè¨¼å€™è£œãƒªãƒ“ジョンã§\n"
+" 作業領域を更新ã™ã‚‹ã‹ã€ å•é¡Œå¥‘機リビジョンを特定ã§ããŸæ—¨ã‚’出力ã—ã¾ã™ã€‚"
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" 簡便ãªæ‰‹é †ã¨ã—ã¦ã¯ã€ 作業領域を更新ã›ãšã€ リビジョン指定を使用ã—ã¦ã€\n"
+" リビジョンを good ãªã„ã— bad ã«ãƒžãƒ¼ã‚¯ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚"
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" The environment variable HG_NODE will contain the ID of the\n"
+" changeset being tested. The exit status of the command will be\n"
+" used to mark revisions as good or bad: status 0 means good, 125\n"
+" means to skip the revision, 127 (command not found) will abort the\n"
+" bisection, and any other non-zero exit status means the revision\n"
+" is bad."
+msgstr ""
+" コマンドãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 自動的ãªãƒªãƒ“ジョン検証ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" コマンド実行時ã«ã¯ã€ 環境変数 HG_NODE ã«æ¤œè¨¼å¯¾è±¡ãƒªãƒ“ジョン㮠ID\n"
+" ãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚コマンドã®çµ‚了コードã¯ã€ リビジョンã«å¯¾ã™ã‚‹ bad\n"
+" ãªã„ã— good ã®ãƒžãƒ¼ã‚¯ä»˜ã‘ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚終了コード 0 㯠good〠125\n"
+" ã¯ãƒªãƒ“ジョンã®ã‚¹ã‚­ãƒƒãƒ—〠127 (コマンドä¸åœ¨) ã¯æŽ¢ç´¢ä¸­æ–­ã€\n"
+" ãã®ä»–ã®éž 0 終了コード㯠bad ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid " Some examples:"
+msgstr " 例:"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+" - 既知㮠bad ãªãƒªãƒ“ジョン 12 㨠good ãªãƒªãƒ“ジョン 34 ã‹ã‚‰æ¤œç´¢é–‹å§‹::"
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+
+msgid ""
+" - advance the current bisection by marking current revision as good "
+"or\n"
+" bad::"
+msgstr " - ç¾ãƒªãƒ“ジョンを good ãªã„ã— bad 化ã—ã¦æ¤œç´¢çŠ¶æ…‹ã‚’進ã‚ã‚‹::"
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+" hg bisect --good\n"
+" hg bisect --bad"
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+" - ç¾ãƒªãƒ“ジョンãªã„ã—特定ã®ãƒªãƒ“ジョンをスキップ (例: 別ãªå•é¡Œã«ã‚ˆã‚Šã€\n"
+" 当該リビジョンã®æ¤œè¨¼ãŒã§ããªã„)::"
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+
+msgid " - forget the current bisection::"
+msgstr " - ç¾è¡Œã®æ¤œç´¢çŠ¶æ…‹ã‚’クリア::"
+
+msgid " hg bisect --reset"
+msgstr " hg bisect --reset"
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+" - 最åˆã®å•é¡Œãƒªãƒ“ジョン探索ã®è‡ªå‹•åŒ–ã« 'make && make tests' を利用::"
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr " - ç¾åœ¨ã®æ¤œç´¢ã«ãŠã„ã¦ã€ 状態ã®åˆ¤æ˜Žã—ã¦ã„るリビジョン全ã¦ã‚’表示::"
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr " hg log -r \"bisect(pruned)\""
+
+msgid ""
+" - see the changeset currently being bisected (especially useful\n"
+" if running with -U/--noupdate)::"
+msgstr ""
+" - ç¾åœ¨ã®æ¤œè¨¼å¯¾è±¡ãƒªãƒ“ジョンを表示 (特㫠-U/--noupdate 併用時ã«æœ‰ç”¨)::"
+
+msgid " hg log -r \"bisect(current)\""
+msgstr " hg log -r \"bisect(current)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr " - ç¾åœ¨ã®æ¤œç´¢å¯¾è±¡ã«ãªã£ã¦ã„るリビジョン全ã¦ã‚’表示::"
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr " - graphlog エクステンション有効時ã¯ã€å±¥æ­´ãƒ„リー表示もå¯èƒ½::"
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr " hg log --graph -r \"bisect(range)\""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr ""
+" `bisect()` キーワードã®è©³ç´°ã¯ :hg:`help revsets` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "The first good revision is:\n"
+msgstr "最åˆã® good ãªãƒªãƒ“ジョンã¯:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "最åˆã® bad ãªãƒªãƒ“ジョンã¯:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+"ã“ã®ãƒªãƒ“ジョンã®ç¥–å…ˆã«å¯¾ã™ã‚‹ç¢ºèªã¯å®Œå…¨ã§ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+"共通ã®ç¥–å…ˆ %s ã‹ã‚‰æ¤œç´¢ã‚’継続ã™ã‚‹å ´åˆã€\n"
+"--extend 付ã㧠\"hg bisect\" を実行ã—ã¦ãã ã•ã„。\n"
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr "検証çœç•¥ã«ã‚ˆã‚Šã€ 最åˆã® good ãªãƒªãƒ“ジョンã¯ä»¥ä¸‹ã‹ã‚‰é¸æŠžå¯èƒ½ã§ã™:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr "検証çœç•¥ã«ã‚ˆã‚Šã€ 最åˆã® bad ãªãƒªãƒ“ジョンã¯ä»¥ä¸‹ã‹ã‚‰é¸æŠžå¯èƒ½ã§ã™:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "分割探索ã§ãã¾ã›ã‚“(good リビジョンãŒæœªæŒ‡å®šã§ã™)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "分割探索ã§ãã¾ã›ã‚“(bad リビジョンãŒæœªæŒ‡å®šã§ã™)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "('hg bisect <cmd>' å½¢å¼ã®å®Ÿè¡Œã¯æŽ¨å¥¨ã•ã‚Œã¾ã›ã‚“)\n"
+
+msgid "incompatible arguments"
+msgstr "ä¸æ­£ãªå¼•æ•°ã®çµ„ã¿åˆã‚ã›ã§ã™"
+
+msgid "current bisect revision is unknown - start a new bisect to fix"
+msgstr "ç¾åœ¨ã®æ¤œè¨¼å¯¾è±¡ãƒªãƒ“ジョンãŒä¸åœ¨ã§ã™ - 探索を最åˆã‹ã‚‰ã‚„ã‚Šç›´ã—ã¦ãã ã•ã„"
+
+msgid "current bisect revision is a merge"
+msgstr "ç¾åœ¨ã®æ¤œè¨¼å¯¾è±¡ãƒªãƒ“ジョンã¯ãƒžãƒ¼ã‚¸å®Ÿæ–½ãƒªãƒ“ジョンã§ã™"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "%s ã®å®Ÿè¡Œã«å¤±æ•—"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s プロセスã¯ä¸­æ–­ã•ã‚Œã¾ã—ãŸ"
+
+#, python-format
+msgid "changeset %d:%s: %s\n"
+msgstr "リビジョン %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "探索範囲を %d:%s ã¾ã§æ‹¡å¼µ\n"
+
+msgid "nothing to extend"
+msgstr "探索範囲ã¯æ‹¡å¼µã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "リビジョン %d:%s を検証中(検証残 %d〠検証済㿠%d)\n"
+
+msgid "force"
+msgstr "強制実施"
+
+msgid "delete a given bookmark"
+msgstr "指定ブックマークã®å‰Šé™¤"
+
+msgid "rename a given bookmark"
+msgstr "指定ブックマークã®æ”¹å"
+
+msgid "mark a bookmark inactive"
+msgstr "ブックマークをéžã‚¢ã‚¯ãƒ†ã‚£ãƒ–化"
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+
+msgid "track a line of development with movable markers"
+msgstr "移動å¯èƒ½ãªãƒžãƒ¼ã‚­ãƒ³ã‚°ã«ã‚ˆã‚‹å±¥æ­´é€²å±•ã®è¿½è·¡"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when committing.\n"
+" Bookmarks are local. They can be renamed, copied and deleted. It is\n"
+" possible to use :hg:`merge NAME` to merge from a given bookmark, and\n"
+" :hg:`update NAME` to update to a given bookmark."
+msgstr ""
+" ブックマーク (bookmark) ã¯ã€ コミットæ“作ã«è¿½å¾“ã—ã¦ç§»å‹•ã™ã‚‹ã€\n"
+" リビジョン特定用ã®æƒ…å ±ã§ã™ã€‚\n"
+" ブックマークã®ãƒªãƒã‚¸ãƒˆãƒªé–“ä¼æ’­ã¯ã€ 自動的ã«ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。\n"
+" ブックマークã«å¯¾ã—ã¦ã¯ã€ 改åï¼è¤‡è£½ï¼å‰Šé™¤ãŒå¯èƒ½ã§ã™ã€‚\n"
+" :hg:`merge` ã‚„ :hg:`update` ã¸ã®ãƒªãƒ“ジョン指定ã«ãŠã„ã¦ã€\n"
+" ブックマークを使用ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" :hg:`bookmark NAME` を実行ã™ã‚‹ã“ã¨ã§ã€ 作業領域ã®è¦ªãƒªãƒ“ジョンã«ã€\n"
+" 指定ã•ã‚ŒãŸåå‰ã§ã€ ブックマークãŒè¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" -r を使用ã—ã¦ã€ 対象リビジョンを指定ã—ãŸå ´åˆ\n"
+" (対象指定自体ã«ã‚‚〠ブックマークを使用å¯èƒ½)\n"
+" ãã®ãƒªãƒ“ジョンã«ãƒ–ックマークãŒè¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled."
+msgstr ""
+" ブックマークã¯ã€ リãƒã‚¸ãƒˆãƒªé–“ã§ã®å–ã‚Šè¾¼ã¿ã‚„å映ãŒå¯èƒ½ã§ã™\n"
+" (:hg:`help push` ãŠã‚ˆã³ :hg:`help pull` å‚ç…§)。\n"
+" 但ã—〠連æºã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã®ä¸¡æ–¹ãŒã€\n"
+" ブックマーク機能ã«å¯¾å¿œã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™\n"
+" 1.8 版よりå‰ã® Mercurial ã®å ´åˆã€ \n"
+" bookmarks エクステンションを有効ã«ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" With -i/--inactive, the new bookmark will not be made the active\n"
+" bookmark. If -r/--rev is given, the new bookmark will not be made\n"
+" active even if -i/--inactive is not given. If no NAME is given, the\n"
+" current active bookmark will be marked inactive.\n"
+" "
+msgstr ""
+" -i/--inactive 指定ã®ã‚ã‚‹å ´åˆã¯ã€ 作æˆã•ã‚ŒãŸæ–°è¦ãƒ–ックマークã¯ã€\n"
+" アクティブã«ã¯ãªã‚Šã¾ã›ã‚“。 -r/--rev 指定ã®ã‚ã‚‹å ´åˆã¯ã€ -i/--inactive\n"
+" 指定ãŒç„¡ãã¦ã‚‚〠新è¦ãƒ–ックマークã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã¾ã›ã‚“。\n"
+" ブックマークå指定ãŒç„¡ã„å ´åˆã€ ç¾ãƒ–ックマークãŒéžã‚¢ã‚¯ãƒ†ã‚£ãƒ–化ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "bookmark name required"
+msgstr "ブックマークåã‚’è¦æ±‚ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "ブックマーク '%s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "ブックマーク '%s' ã¯å­˜åœ¨ã—ã¾ã™(強制実行ã™ã‚‹å ´åˆã¯ -f を指定)"
+
+msgid "new bookmark name required"
+msgstr "æ–°ã—ã„ブックマークåã‚’è¦æ±‚ã—ã¾ã—ãŸ"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "ブックマークåã«æ”¹è¡Œã‚’å«ã‚ã¾ã›ã‚“"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "空白文字ã ã‘ã§æ§‹æˆã•ã‚ŒãŸã‚¿ã‚°åã¯ä¸æ­£ã§ã™"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "既存ブランãƒã¨åŒåã®ãƒ–ックマークã¯ä½œæˆã§ãã¾ã›ã‚“"
+
+msgid "no bookmarks set\n"
+msgstr "ブックマークã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "åŒå既存ブランãƒãŒå­˜åœ¨ã™ã‚‹å ´åˆã§ã‚‚ブランãƒä½œæˆã‚’実施"
+
+msgid "reset branch name to parent branch name"
+msgstr "ブランãƒå設定を解消ã—〠親リビジョンã®ãƒ–ランãƒã«æˆ»ã‚‹"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NAME]"
+
+msgid "set or show the current branch name"
+msgstr "ブランãƒåã®è¨­å®šã€ ãªã„ã—ç¾ãƒ–ランãƒåã®è¡¨ç¤º"
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent and global. Use :hg:`bookmark` to create "
+"a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+" .. note::\n"
+" ブランãƒåã¯æ°¸ç¶šçš„ã§ä¸”ã¤å…±æœ‰ã•ã‚Œã¾ã™ã€‚\n"
+" 軽é‡ãªåå‰ä»˜ã‘ãŒå¿…è¦ãªã‚‰ã€\n"
+" :hg:`bookmark` ã§ãƒ–ックマークを作æˆã—ã¦ãã ã•ã„。\n"
+" åå‰ä»˜ãブランãƒã¨ã€ ブックマークã®è©³ç´°ã«é–¢ã—ã¦ã¯ã€\n"
+" :hg:`help glossary` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" 引数無ã—ã®å ´åˆã€ ç¾ãƒ–ランãƒåを表示ã—ã¾ã™ã€‚ 引数ãŒï¼‘ã¤æŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 作業領域ã®ãƒ–ランãƒåを設定ã—ã¾ã™(次回コミット時ã¾ã§ã€ ブランãƒã¯ç”Ÿæˆ\n"
+" ã•ã‚Œã¾ã›ã‚“)。 作業時ã«åŸºæœ¬ã¨ã™ã‚‹ãƒ–ランãƒã«ã¯ã€ 'default' ブランãƒã‚’\n"
+" 使用ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" -f/--force 指定ãŒç„¡ã„å ´åˆã€ 例ãˆãã‚ŒãŒéžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚‚ã®ã§ã‚ã£ã¦ã‚‚ã€\n"
+" 既存ブランãƒã¨åŒã˜åå‰ã¯è¨­å®šã§ãã¾ã›ã‚“。"
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" -C/--clean を指定ã™ã‚‹ã“ã¨ã§ã€ 以å‰ã®ãƒ–ランãƒå設定を無効ã«ã—ã¦ã€ 作業\n"
+" 領域ã®è¦ªãƒªãƒ“ジョンã®ãƒ–ランãƒåã«æˆ»ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" 作業領域ã®å†…容を既存ブランãƒã®ã‚‚ã®ã§æ›´æ–°ã™ã‚‹å ´åˆã¯ :hg:`update` ã‚’\n"
+" 使用ã—ã¦ãã ã•ã„。 ç¾ãƒ–ランãƒã‚’閉鎖ã™ã‚‹å ´åˆã¯\n"
+" :hg:`commit --close-branch` を使用ã—ã¦ãã ã•ã„。"
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "作業領域ã®ãƒ–ランãƒã‚’ %s ã«ãƒªã‚»ãƒƒãƒˆ\n"
+
+msgid "a branch of the same name already exists"
+msgstr "åŒã˜åå‰ã®ãƒ–ランãƒãŒã™ã§ã«å­˜åœ¨ã—ã¾ã™"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "作業領域を既存ブランãƒã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã«ã¯ 'hg update' を使用ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "作業領域をブランム%s ã«è¨­å®š\n"
+
+msgid "(branches are permanent and global, did you want a bookmark?)\n"
+msgstr "(ブランãƒã¯æ°¸ç¶šçš„且ã¤å…±æœ‰ã•ã‚Œã¾ã™ã€‚ブックマークã¯ã„ã‹ãŒã§ã™ã‹ï¼Ÿ)\n"
+
+msgid "show only branches that have unmerged heads"
+msgstr "未マージãªãƒ˜ãƒƒãƒ‰ã‚’æŒã¤ãƒ–ランãƒã®ã¿ã‚’表示"
+
+msgid "show normal and closed branches"
+msgstr "閉鎖済ã¿ãƒ˜ãƒƒãƒ‰ã‚‚表示"
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "list repository named branches"
+msgstr "リãƒã‚¸ãƒˆãƒªä¸­ã®åå‰ä»˜ãブランãƒã®ä¸€è¦§"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" リãƒã‚¸ãƒˆãƒªä¸­ã®åå‰ä»˜ãブランãƒã‚’〠éžã‚¢ã‚¯ãƒ†ã‚£ãƒ– (inactive)\n"
+" ã‹å¦ã‹ã¨å…±ã«ä¸€è¦§è¡¨ç¤ºã—ã¾ã™ã€‚ -c/--closed 指定時ã«ã¯ã€\n"
+" 閉鎖済ã¿ã®ãƒ–ランム(:hg:`commit --close-branch` å‚ç…§) も表示ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" -a/--active 指定時ã«ã¯ã€ 活性(active)ブランãƒã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+" リãƒã‚¸ãƒˆãƒªä¸­ã«ãƒ˜ãƒƒãƒ‰ã‚’æŒã¤ã‚‚ã®ãŒæ´»æ€§ãƒ–ランãƒã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+" 作業領域ã®å†…容を既存ブランãƒã®ã‚‚ã®ã§æ›´æ–°ã™ã‚‹å ´åˆã¯ :hg:`update` ã‚’\n"
+" 使用ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+" コマンドã®çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid " (closed)"
+msgstr " (閉鎖済ã¿)"
+
+msgid " (inactive)"
+msgstr " (éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–)"
+
+msgid "run even when the destination is unrelated"
+msgstr "連æºå…ˆãŒç„¡é–¢ä¿‚ãªãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚実行"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ã«å«ã‚ãŸã„リビジョン"
+
+msgid "a specific branch you would like to bundle"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ã«å«ã‚ãŸã„ブランãƒ"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã™ã‚‹ã“ã¨ã‚’仮定ã™ã‚‹ãƒªãƒ“ジョン"
+
+msgid "bundle all changesets in the repository"
+msgstr "リãƒã‚¸ãƒˆãƒªä¸­ã®å…¨ãƒªãƒ“ジョンをãƒãƒ³ãƒ‰ãƒ«ã«å«ã‚ã‚‹"
+
+msgid "bundle compression type to use"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®åœ§ç¸®å½¢å¼"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+
+msgid "create a changegroup file"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®ç”Ÿæˆ"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+" 連æºå¯¾è±¡ãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã—ãªã„リビジョンã®æƒ…報をã¾ã¨ã‚ã¦ã€\n"
+" 圧縮形å¼ã®ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã—ã¾ã™ã€‚"
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+" 連æºå¯¾è±¡ãƒªãƒã‚¸ãƒˆãƒªãŒç„¡æŒ‡å®šã®å ´åˆã€ --base 指定ã•ã‚ŒãŸãƒªãƒ“ジョンãŒã€\n"
+" 連æºå¯¾è±¡ãƒªãƒã‚¸ãƒˆãƒªå´ã«å­˜åœ¨ã™ã‚‹ã‚‚ã®ã¨ä»®å®šã—ã¾ã™ã€‚\n"
+" -a/--all (ãªã„ã— --base null) 指定ã«ã‚ˆã‚Šã€\n"
+" 全リビジョンをå«ã‚€ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ãŒç”Ÿæˆã§ãã¾ã™ã€‚"
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+" 圧縮形å¼ã¯ -t/--type ã§æŒ‡å®šå¯èƒ½ã§ã™ã€‚ 利用å¯èƒ½ãªåœ§ç¸®å½¢å¼ã¯\n"
+" none (無圧縮), bzip2, gzip ã§ã™ (無指定時㯠bzip2 圧縮)。"
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+" ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã¯ :hg:`unbundle` ãªã„ã— :hg:`pull` ã«ã‚ˆã£ã¦ã€\n"
+" 他リãƒã‚¸ãƒˆãƒªã«å–ã‚Šè¾¼ã‚ã‚‹ã®ã§ã€ 変更内容を任æ„ã®æ–¹æ³•ã§ä¼æ’­ã§ãã¾ã™ã€‚\n"
+" ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ˆã‚‹ä¼æ’­ã¯ã€ :hg:`push`/:hg:`pull` ã§ã®ç›´æŽ¥è»¢é€ã‚„ã€\n"
+" リãƒã‚¸ãƒˆãƒªå…¨ä½“ã®å…¬é–‹ãŒã€ ã§ããªã„ï¼æœ›ã¾ã—ãç„¡ã„å ´åˆã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+" ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ˆã‚‹å–ã‚Šè¾¼ã¿ã§ã¯ã€ 権é™è¨­å®šã€ 複製ï¼æ”¹åã€\n"
+" 変更履歴等をå«ã‚€å…¨ã¦ã®æ›´æ–°å†…容ãŒå–ã‚Šè¾¼ã¾ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠変更ãŒæ¤œå‡ºã§ããªã„å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "unknown bundle type specified with --type"
+msgstr "--type ã«æœªçŸ¥ã®ãƒãƒ³ãƒ‰ãƒ«ç¨®åˆ¥ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "--base ã¨é€£æºå¯¾è±¡ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "print output to file with formatted name"
+msgstr "ファイル内容ã®ä¿å­˜å…ˆ"
+
+msgid "print the given revision"
+msgstr "出力対象リビジョン"
+
+msgid "apply any matching decode filter"
+msgstr "デコード処ç†ã‚’実施"
+
+msgid "[OPTION]... FILE..."
+msgstr "[OPTION]... FILE..."
+
+msgid "output the current or given revision of files"
+msgstr "指定ã•ã‚ŒãŸãƒªãƒ“ジョン時点ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…容ã®å‡ºåŠ›"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒªãƒ“ジョン時点ã§ã®ãƒ•ã‚¡ã‚¤ãƒ«å†…容を出力ã—ã¾ã™ã€‚ リビジョンãŒ\n"
+" 指定ã•ã‚Œãªã„å ´åˆã¯ä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンãŒã€ 作業領域ã®æ›´æ–°å‰ãªã‚‰ tip\n"
+" ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" 出力先指定ãŒã‚ã‚‹å ´åˆã€ 出力ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚\n"
+" 出力先指定ã§ã¯ã€ :hg:`export` ã§æŒ‡å®šå¯èƒ½ãªã‚‚ã®ã«åŠ ãˆã¦ã€\n"
+" 以下ã®ç½®æ›æŒ‡å®šãŒåˆ©ç”¨å¯èƒ½ã§ã™:"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: 対象ファイルパスã®æœ«å°¾è¦ç´ \n"
+" :``%d``: 対象ファイルã®æ ¼ç´ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ ãªã„ã— '.'(ルートã®å ´åˆ)\n"
+" :``%p``: 対象ファイルã®ãƒªãƒã‚¸ãƒˆãƒªãƒ«ãƒ¼ãƒˆã‹ã‚‰ã®ç›¸å¯¾ãƒ‘ス\n"
+" "
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "作業領域ã®æ›´æ–°ç„¡ã—(管ç†é ˜åŸŸã®ã¿ã®è¤‡è£½)"
+
+msgid "revision, tag or branch to check out"
+msgstr "作業領域更新用リビジョン(ã‚¿ã‚°åï¼ãƒ–ランãƒå)"
+
+msgid "include the specified changeset"
+msgstr "複製対象ã«å«ã‚るリビジョン"
+
+msgid "clone only the specified branch"
+msgstr "指定ブランãƒã®ã¿ã‚’複製"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[OPTION]... SOURCE [DEST]"
+
+msgid "make a copy of an existing repository"
+msgstr "既存リãƒã‚¸ãƒˆãƒªã®è¤‡è£½"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " 既存リãƒã‚¸ãƒˆãƒªã‚’〠新è¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¤‡è£½ã—ã¾ã™ã€‚"
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" 複製先ディレクトリ指定ãŒç„¡ã„å ´åˆã€ 複製元パスåã®æœ«å°¾è¦ç´ ã‚’使用ã—ã¾ã™ã€‚"
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" 後々㮠:hg:`pull` 実施ã«å‚™ãˆã¦ã€ 複製先リãƒã‚¸ãƒˆãƒªã® ``.hg/hgrc``\n"
+" ファイルã«ã¯ã€ 複製元リãƒã‚¸ãƒˆãƒªä½ç½®ãŒ default å義ã§è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+" 複製先ã«æŒ‡å®šå¯èƒ½ãªã®ã¯ã€ ローカルファイルシステム上ã®ãƒ‘スã¨ã€\n"
+" ``ssh://`` å½¢å¼ URL ã®ã¿ã§ã™ã€‚ ``ssh://`` å½¢å¼ URL を指定ã—ãŸå ´åˆã€\n"
+" 作業領域ã®æ›´æ–°ã‚„〠``.hg/hgrc`` ã®ç”Ÿæˆã¯è¡Œã‚ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+" -r/--rev ã§ã®ãƒªãƒ“ジョン指定や〠-b/--branch ã§ã®ãƒ–ランãƒæŒ‡å®šã«ã‚ˆã‚Šã€\n"
+" 一部ã®ãƒªãƒ“ジョンã®ã¿ã‚’å–り込むã“ã¨ãŒã§ãã¾ã™ã€‚ 複製先ã®ãƒªãƒã‚¸ãƒˆãƒªã¯ã€\n"
+" 指定リビジョンã¨ã€ ãã®ç¥–å…ˆã®ã¿ã‚’ä¿æŒã—ã¾ã™ã€‚ ã“れらã®ã‚ªãƒ—ション指定\n"
+" (ã‚ã‚‹ã„㯠:hg:`clone src#rev dest` å½¢å¼ã§ã®è¤‡è£½) ãŒã‚ã‚‹å ´åˆã€\n"
+" åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã®ãƒªãƒã‚¸ãƒˆãƒªã®è¤‡è£½ã§ã‚‚〠--pull 指定時ã¨ã€\n"
+" åŒæ§˜ã«æŒ¯èˆžã„ã¾ã™ã€‚ ã‚¿ã‚°åã§ãƒªãƒ“ジョンを指定ã—ãŸå ´åˆã€\n"
+" タグ「対処ã€ãƒªãƒ“ジョンã¯ã€ 複製先ã«å–ã‚Šè¾¼ã¾ã‚Œã¾ã™ãŒã€\n"
+" タグ「実施ã€ãƒªãƒ“ジョンã¯ã€ 複製先ã«å–ã‚Šè¾¼ã¾ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+" 特定ã®ãƒªãƒ“ジョンã§ã€ 作業領域を更新ã™ã‚‹å ´åˆã¯ -u/--update ã‚’ã€\n"
+" 作業領域ã«ãƒ‡ãƒ¼ã‚¿ã‚’æŒã¡ãŸããªã„å ´åˆã¯ -U/--noupdate を指定ã—ã¾ã™ã€‚"
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" 複製元ï¼è¤‡è£½å…ˆãŒã€ åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã«ã‚ã‚‹å ´åˆã€\n"
+" 資æºåŠ¹çŽ‡ã®ç‚¹ã‹ã‚‰ã€ (リãƒã‚¸ãƒˆãƒªã®å†…部管ç†ãƒ‡ãƒ¼ã‚¿ã«å¯¾ã—ã¦ã®ã¿)\n"
+" ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯å®Ÿè£…ãŒä¸é©åˆ‡ãªã€ \n"
+" ファイルシステム (例: AFS) ã¯ã€ ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ä½¿ç”¨æ™‚ã«ã€\n"
+" エラー通知ãŒã‚ã‚Šã¾ã›ã‚“。 ã“ã®ã‚ˆã†ãªå ´åˆã«ã¯ --pull\n"
+" を指定ã™ã‚‹ã“ã¨ã§ã€ ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ä½¿ç”¨ã‚’抑止ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" リãƒã‚¸ãƒˆãƒªã®å†…部管ç†ãƒ‡ãƒ¼ã‚¿ã¨ä½œæ¥­é ˜åŸŸä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«å…¨ã¦ã«å¯¾ã™ã‚‹ã€\n"
+" ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã«ã‚ˆã‚‹è¤‡è£½ã®ä½œæˆã«ã¯ã€ 以下ã®æ–¹æ³•ãŒä½¿ãˆã‚‹ã‹ã‚‚知れã¾ã›ã‚“::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al REPO REPOCLONE"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" ã“ã®æ–¹æ³•ã¯æœ€é€Ÿã®è¤‡è£½æ–¹æ³•ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ãŒã€ 常ã«å®‰å…¨ã¨ã¯é™ã‚Šã¾ã›ã‚“。\n"
+" æ“作ã®å˜ä¸€æ€§ã¯ä¿éšœã•ã‚Œã¾ã›ã‚“ (リãƒã‚¸ãƒˆãƒªã®è¤‡è£½ä¸­æ”¹å¤‰ã®é˜²æ­¢ã¯ã€ \n"
+" 利用者責務) ã—〠利用ã™ã‚‹ã‚¨ãƒ‡ã‚£ã‚¿ã®ãƒ•ã‚¡ã‚¤ãƒ«æ”¹å¤‰æ™‚ã®æŒ¯ã‚‹èˆžã„ãŒã€\n"
+" ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ã‚’破棄ã™ã‚‹ã‚‚ã®ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ (Emacs ãŠã‚ˆã³å¤šãã®\n"
+" Linux 系ツールã¯ã€ ãã®ã‚ˆã†ã«æŒ¯èˆžã„ã¾ã™)。 ã“ã®åˆ¶ç´„ã¯ã€\n"
+" MQ エクステンションã®ã‚ˆã†ã«ã€ .hg ディレクトリé…下ã«ã€\n"
+" 管ç†æƒ…報を格ç´ã™ã‚‹ãƒ„ールã¨ã¯ç›¸å®¹ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial ã¯ã€ 以下ã®ä¸€è¦§ä¸­ã§æœ€åˆã«åˆ©ç”¨å¯èƒ½ãªãƒªãƒ“ジョンを用ã„ã¦ã€\n"
+" 作業領域を更新ã—ã¾ã™:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) -U ãŒæŒ‡å®šã•ã‚Œã‚‹ã‹ã€ 元リãƒã‚¸ãƒˆãƒªå±¥æ­´ãŒç©ºã®å ´åˆã¯ null リビジョン\n"
+" b) -u . ãŒæŒ‡å®šã•ã‚Œã€ 且ã¤å…ƒãƒªãƒã‚¸ãƒˆãƒªãŒåŒä¸€ãƒ›ã‚¹ãƒˆã®å ´åˆã€\n"
+" 元リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã®ç¬¬1親リビジョン\n"
+" c) -u ã§æŒ‡å®šã•ã‚ŒãŸãƒªãƒ“ジョン (ブランãƒåãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 当該ブランãƒã®æœ€æ–°ãƒ˜ãƒƒãƒ‰ãƒªãƒ“ジョン)\n"
+" d) -r ã§æŒ‡å®šã•ã‚ŒãŸãƒªãƒ“ジョン\n"
+" e) -b ã§æŒ‡å®šsã‚ŒãŸãƒ–ランãƒã®æœ€æ–°ãƒ˜ãƒƒãƒ‰ãƒªãƒ“ジョン\n"
+" f) url#branch å½¢å¼ã§æŒ‡å®šã•ã‚ŒãŸãƒ–ランãƒã®æœ€æ–°ãƒ˜ãƒƒãƒ‰ãƒªãƒ“ジョン\n"
+" g) default ブランãƒã®æœ€æ–°ãƒ˜ãƒƒãƒ‰ãƒªãƒ“ジョン\n"
+" h) tip"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr " - é éš”ホストã®ãƒªãƒã‚¸ãƒˆãƒªã‚’ã€ æ–°è¦ hg/ ディレクトリé…下ã«è¤‡è£½::"
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr " - åŒä¸€ãƒ›ã‚¹ãƒˆä¸Šã®ãƒªãƒã‚¸ãƒˆãƒªã‚’軽é‡è¤‡è£½::"
+
+msgid " hg clone project/ project-feature/"
+msgstr " hg clone project/ project-feature/"
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr " - SSH 接続先ã‹ã‚‰çµ¶å¯¾ãƒ‘ス指定ã§è¤‡è£½ (ダブルスラッシュã«æ³¨æ„)::"
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr " hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr " - LAN 経由ã§ã®é«˜é€Ÿè¤‡è£½ã¨ã€ 特定リビジョンã§ã®ä½œæ¥­é ˜åŸŸæ›´æ–°::"
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr " hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr " - 特定リビジョンã¾ã§ã—ã‹å«ã¾ãªã„リãƒã‚¸ãƒˆãƒªã®ç”Ÿæˆ::"
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr " hg clone -r 04e544 experimental/ good/"
+
+msgid " - clone (and track) a particular named branch::"
+msgstr " - 特定ã®åå‰ä»˜ãブランãƒé™å®šã§ã®è¤‡è£½::"
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr " hg clone http://selenic.com/hg#stable"
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " URL 記述ã®è©³ç´°ã¯ :hg:`help urls` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "--noupdate 㨠--updaterev ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr "コミットå‰ã«ã€ æ–°è¦ï¼ä¸åœ¨ãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録ï¼é™¤å¤–"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "ブランãƒã‚’閉鎖ã—〠ブランãƒä¸€è¦§ã§ã®è¡¨ç¤ºã‹ã‚‰é™¤å¤–"
+
+msgid "amend the parent of the working dir"
+msgstr "作業領域ã®è¦ªãƒªãƒ“ジョンã®æ”¹å¤‰"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "指定ファイルãªã„ã—å…¨ã¦ã®å¤‰æ›´å†…容ã®ãƒªãƒã‚¸ãƒˆãƒªã¸ã®è¨˜éŒ²"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´å†…容を〠管ç†é ˜åŸŸã«è¨˜éŒ² (コミット) ã—ã¾ã™ã€‚\n"
+" 中央集権的ãªæ§‹æˆç®¡ç†ãƒ„ールã¨ç•°ãªã‚Šã€\n"
+" ã“ã®æ“作ã§å¤‰æ›´ãŒè¨˜éŒ²ã•ã‚Œã‚‹ã®ã¯ã€ 手元ã®ç®¡ç†é ˜åŸŸã«å¯¾ã—ã¦ã®ã¿ã§ã™ã€‚\n"
+" 能動的ãªå¤‰æ›´ä¼æ’­ã«é–¢ã—ã¦ã¯ã€ :hg:`help push` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" ファイル指定ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã€ :hg:`status` ã«ã‚ˆã‚Šæ¤œå‡ºã•ã‚Œã‚‹å…¨ã¦ã®\n"
+" 変更内容ãŒã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" :hg:`merge` çµæžœã‚’コミットã™ã‚‹å ´åˆã€ ファイルåãªã„ã— -I/-X ã®ã€\n"
+" ã„ãšã‚Œã‚‚指定ã—ãªã„ã§ãã ã•ã„。"
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" コミットログãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ メッセージ入力用ã®ãƒ—ログラムãŒã€\n"
+" 設定ã«å¾“ã£ã¦èµ·å‹•ã•ã‚Œã¾ã™ã€‚ コミット処ç†ãŒå¤±æ•—ã—ãŸå ´åˆã§ã‚‚ã€\n"
+" 入力ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ ``.hg/last-message.txt`` ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" The --amend flag can be used to amend the parent of the\n"
+" working directory with a new commit that contains the changes\n"
+" in the parent in addition to those currently reported by :hg:`status`,\n"
+" if there are any. The old commit is stored in a backup bundle in\n"
+" ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+" on how to restore it)."
+msgstr ""
+" --amend を指定ã—ãŸå ´åˆã€ 作業領域ã®è¦ªãƒªãƒ“ジョンã®æŒã¤å¤‰æ›´å†…容ã«ã€\n"
+" :hg:`status` ãŒè¡¨ç¤ºã™ã‚‹å¤‰æ›´å†…容 (変更ãŒã‚ã‚‹å ´åˆ) を加ãˆãŸã‚‚ã®ã§ã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョンを改変ã—ã¾ã™ã€‚ 改変å‰ã®ãƒªãƒ“ジョンã®å†…容ã¯ã€\n"
+" ãƒãƒ³ãƒ‰ãƒ«å½¢å¼ã§ ``.hg/strip-backup`` ã«ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã•ã‚Œã¾ã™ã€‚\n"
+" (復旧方法㯠:hg:`help bundle` ãŠã‚ˆã³ :hg:`help unbundle` ã‚’å‚ç…§).\n"
+" (※ 訳注: --amend 指定時ã¯ã€ 対象ファイルを指定ã—ã¦ã‚‚ã€\n"
+" 追加記録分ã®é¸æŠžã«ã®ã¿ä½¿ç”¨ã•ã‚Œã€ 記録済ã¿ãƒ•ã‚¡ã‚¤ãƒ«ã®å–æ¨é¸æŠžã«ã¯ã€\n"
+" 影響ã—ã¾ã›ã‚“。 MQ エクステンション㮠hg:`qrefresh` ã«ãŠã‘ã‚‹\n"
+" ``--short`` 指定ã¨åŒç­‰ãªæŒ™å‹•ã¨ãªã‚Šã¾ã™ã€‚)"
+
+msgid ""
+" Message, user and date are taken from the amended commit unless\n"
+" specified. When a message isn't specified on the command line,\n"
+" the editor will open with the message of the amended commit."
+msgstr ""
+" コミットログ〠ユーザå〠記録日付ã¯ã€ 明示的ãªæŒ‡å®šãŒç„¡ã„é™ã‚Šã€\n"
+" 改変対象ã®ãƒªãƒ“ジョンã®ã‚‚ã®ãŒå†åˆ©ç”¨ã•ã‚Œã¾ã™ã€‚ コマンド行ã«ãŠã„ã¦ã€\n"
+" コミットログãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 改変å‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’使ã£ã¦ã€\n"
+" エディタãŒèµ·å‹•ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" It is not possible to amend public changesets (see :hg:`help phases`)\n"
+" or changesets that have children."
+msgstr ""
+" public フェーズ (:hg:`help phases` å‚ç…§) ã®ãƒªãƒ“ジョンやã€\n"
+" æ—¢ã«å­ãƒªãƒ“ジョンをæŒã¤ãƒªãƒ“ジョンã¯ã€ 改変ã§ãã¾ã›ã‚“ "
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠変更ãŒæ¤œå‡ºã§ããªã„å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "can only close branch heads"
+msgstr "ブランãƒãƒ˜ãƒƒãƒ‰ã®ã¿é–‰éŽ–ã§ãã¾ã™"
+
+msgid "cannot amend recursively"
+msgstr "副リãƒã‚¸ãƒˆãƒªã‚’å«ã‚€å†å¸°çš„ãªæ”¹å¤‰ã¯ã§ãã¾ã›ã‚“"
+
+msgid "cannot amend public changesets"
+msgstr "public フェーズã®ãƒªãƒ“ジョンã¯æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+msgid "cannot amend merge changesets"
+msgstr "マージ実施リビジョンã¯æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+msgid "cannot amend while merging"
+msgstr "マージ実施中ã®ä½œæ¥­é ˜åŸŸã§ã¯æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+msgid "cannot amend changeset with children"
+msgstr "å­ãƒªãƒ“ジョンをæŒã¤ãƒªãƒ“ジョンã¯æ”¹å¤‰ã§ãã¾ã›ã‚“"
+
+msgid "nothing changed\n"
+msgstr "変更ãªã—\n"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr "改変ã¯ã‚ã‚Šã¾ã›ã‚“ (%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒä¸åœ¨ã€‚ 'hg status' ã§ç¢ºèªã‚’)\n"
+
+msgid "created new head\n"
+msgstr "æ–°è¦ãƒ˜ãƒƒãƒ‰ãŒå¢—ãˆã¾ã—ãŸ\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "閉鎖済ã¿ãƒ–ランãƒãƒ˜ãƒƒãƒ‰ %d ã®å†é–‹ä¸­\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "コミット対象リビジョン %d:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr "手動ã§è¤‡è£½æ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€ 複製ã®æ—¨ã‚’記録"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "åŒåã®ç™»éŒ²æ¸ˆã¿ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ã¦ã‚‚複製を実施"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[OPTION]... [SOURCE]... DEST"
+
+msgid "mark files as copied for the next commit"
+msgstr "指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®è¤‡è£½"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+" 対象ファイルãŒè¤‡è£½å…ƒã‹ã‚‰ã®è¤‡è£½ã§ã‚ã‚‹ã“ã¨ã‚’記録ã—ã¾ã™ã€‚ 複製先指定ãŒ\n"
+" ディレクトリã®å ´åˆã€ ディレクトリ内ã«è¤‡è£½ãŒä½œæˆã•ã‚Œã¾ã™ã€‚ 複製先指定ãŒ\n"
+" ファイルã®å ´åˆã€ 複製元ã¯1ã¤ã—ã‹æŒ‡å®šã§ãã¾ã›ã‚“。"
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 複製元ファイルã®å†…容をæŒã¤è¤‡è£½å…ˆãƒ•ã‚¡ã‚¤ãƒ«ã‚’作業\n"
+" 領域ã«ä½œæˆã—ã¾ã™ã€‚ -A/--after 指定ãŒã‚ã‚‹å ´åˆã€ 「複製ã€æ“作ã¯è¨˜éŒ²ã•ã‚Œ\n"
+" ã¾ã™ãŒã€ ファイルã®è¤‡è£½ã¯è¡Œã‚ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" 本コマンドã®å®Ÿè¡Œçµæžœã¯æ¬¡å›žã®ã‚³ãƒŸãƒƒãƒˆã®éš›ã«åŠ¹æžœã‚’発æ®ã—ã¾ã™ã€‚\n"
+" 複製æ“作ã®ã‚³ãƒŸãƒƒãƒˆå‰å–り消ã—ã¯ã€ :hg:`help revert` ã‚’å‚ç…§ã—ã¦\n"
+" ãã ã•ã„。"
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠エラー発生時㯠1 ã§ã™ã€‚\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[INDEX] REV1 REV2"
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "指定範囲ã«ãŠã‘ã‚‹2ã¤ã®ãƒªãƒ“ジョンã®ç¥–先リビジョンã®æ¤œç´¢"
+
+msgid "either two or three arguments required"
+msgstr "2ãªã„ã—3ã®å¼•æ•°ãŒå¿…è¦ã§ã™"
+
+msgid "add single file mergeable changes"
+msgstr "ファイルを1ã¤ç™»éŒ²ã—ã¦ã€ リビジョン毎ã«ãƒžãƒ¼ã‚¸å¯èƒ½ãªæ”¹å¤‰ã‚’実施"
+
+msgid "add single file all revs overwrite"
+msgstr "ファイルを1ã¤ç™»éŒ²ã—ã¦ã€ リビジョン毎ã«ä¸Šæ›¸ãを実施"
+
+msgid "add new file at each rev"
+msgstr "å„リビジョン毎ã«æ–°è¦ãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録"
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[OPTION]... [TEXT]"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr "指定 DAG ã«ã‚ˆã‚‹ç©ºãƒªãƒã‚¸ãƒˆãƒªä¸Šã¸ã®å±¥æ­´æ§‹ç¯‰"
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr " コマンド行ã§æŒ‡å®šãŒç„¡ã„å ´åˆã€ 標準入力ã‹ã‚‰ DAG を読ã¿è¾¼ã¿ã¾ã™ã€‚"
+
+msgid " Elements:"
+msgstr " 表記:"
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+" - \"+n\" ã¯ã€ ç¾è¦ªãƒªãƒ“ジョンã«ç¶šã‘ã¦ã€ n個ã®æ–°è¦ãƒªãƒ“ジョンを順次生æˆ\n"
+" - \".\" ã¯ã€ ç¾è¦ªãƒªãƒ“ジョンã«ç¶šã‘ã¦ã€ å˜ä¸€ã®ãƒªãƒ“ジョンを生æˆ\n"
+" - \"$\" ã¯ç¾è¦ªãƒªãƒ“ジョンを null ã«è¨­å®š (処ç†é–‹å§‹æ™‚点ã§æš—é»™ã«å®Ÿæ–½)。\n"
+" 開始時以外ã¯ã€ 最後ã«ç”Ÿæˆã•ã‚ŒãŸãƒªãƒ“ジョンãŒè¦ªãƒªãƒ“ジョン。\n"
+" - \"<p\" ã¯ã€ å‰æ–¹å‚ç…§(backref) p ã®ãƒªãƒ“ジョンを〠親リビジョンã«è¨­å®š\n"
+" - \"*p\" ã¯ã€ å‰æ–¹å‚ç…§ p ã®ãƒªãƒ“ジョンを親ã«ã€ æžåˆ†ã‹ã‚Œ\n"
+" - \"*p1/p2\" ã¯ã€ å‰æ–¹å‚ç…§ p1 㨠p2 ã®å„リビジョンをマージ\n"
+" - \"/p2\" ã¯ã€ ç›´å‰ã®ãƒªãƒ“ジョンã¨ã€ å‰æ–¹å‚ç…§ p2 ã®ãƒªãƒ“ジョンをマージ\n"
+" - \":tag\" ã¯ã€ ç›´å‰ãƒªãƒ“ジョンã«ã€ ローカルタグを設定\n"
+" - \"@branch\" ã¯ã€ 以後ã®ãƒªãƒ“ジョンを〠åå‰ä»˜ãブランãƒé…下ã«ç”Ÿæˆ\n"
+" - \"#...\\n\" ã¯ã€ 行末ã¾ã§ã®ã‚³ãƒ¡ãƒ³ãƒˆè¨˜è¿°"
+
+msgid " Whitespace between the above elements is ignored."
+msgstr " 記å·é–“ã®ç©ºç™½ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid " A backref is either"
+msgstr " å‰æ–¹å‚ç…§ (backref) ã«ã¯ä»¥ä¸‹ã®ã„ãšã‚Œã‹ã‚’指定ã§ãã¾ã™"
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+" - n 個å‰ã®ãƒªãƒ“ジョンを指ã™ã€ 数値指定 n\n"
+" - \":tag\" ã§è¨­å®šã—ãŸãƒ­ãƒ¼ã‚«ãƒ«ã‚¿ã‚°å\n"
+" - ç¾è¦ªãƒªãƒ“ジョンを指ã™ã€ 空指定"
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+" 文字列è¦ç´ ã¯ã€ 厳密ãªè‹±æ•°å­—ã‹ã€ 二é‡å¼•ç”¨ç¬¦ (例: \"...\")\n"
+" ã§å›²ã¾ã‚Œã¦ã„ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。 引用符ã§å›²ã‚€å ´åˆã€ \"\\\"\n"
+" をエスケープ文字ã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã™ã€‚\n"
+" "
+
+msgid "reading DAG from stdin\n"
+msgstr "DAG を標準入力ã‹ã‚‰èª­ã¿è¾¼ã¿ã¾ã™\n"
+
+msgid "repository is not empty"
+msgstr "リãƒã‚¸ãƒˆãƒªãŒç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "building"
+msgstr "構築中"
+
+msgid "show all details"
+msgstr "全詳細ã®è¡¨ç¤º"
+
+msgid "lists the contents of a bundle"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容表示"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "ç¾æ™‚点㮠dirstate ã®æ•´åˆæ€§æ¤œè¨¼"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s ã®çŠ¶æ…‹ã¯ %s ã§ã™ãŒã€ 管ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s ã®çŠ¶æ…‹ã¯ %s ã§ã™ãŒã€ æ—¢ã«ç®¡ç†å¯¾è±¡ã«ãªã£ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s ã®çŠ¶æ…‹ã¯ %s ã§ã™ãŒã€ 管ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr "%s ã¯ç®¡ç†å¯¾è±¡ã§ã™ãŒã€ 状態 %s ã§ã™"
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr "親リビジョンã®ç®¡ç†æƒ…報㨠.hg/dirstate ã®é–“ã«ä¸æ•´åˆãŒã‚ã‚Šã¾ã™"
+
+msgid "[COMMAND]"
+msgstr "[COMMAND]"
+
+msgid "list all available commands and options"
+msgstr "利用å¯èƒ½ãªã‚³ãƒžãƒ³ãƒ‰ãŠã‚ˆã³ã‚ªãƒ—ション一覧ã®è¡¨ç¤º"
+
+msgid "show the command options"
+msgstr "当該コマンドã®ã‚ªãƒ—ション一覧ã®è¡¨ç¤º"
+
+msgid "[-o] CMD"
+msgstr "[-o] CMD"
+
+msgid "returns the completion list associated with the given command"
+msgstr "指定コマンドã®è£œå®Œãƒªã‚¹ãƒˆã®ä½œæˆ"
+
+msgid "use tags as labels"
+msgstr "タグをラベルã¨ã—ã¦ä½¿ç”¨"
+
+msgid "annotate with branch names"
+msgstr "åå‰ä»˜ãブランãƒã®å‡ºåŠ›"
+
+msgid "use dots for runs"
+msgstr "リビジョンã®é †æ¬¡ç”Ÿæˆã‚’ドット(\".\")ã§è¡¨ç¾"
+
+msgid "separate elements by spaces"
+msgstr "å„è¦ç´ ã®åŒºåˆ‡ã‚Šã«ç©ºç™½ã‚’挿入"
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[OPTION]... [FILE [REV]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr "変更履歴や差分インデックスファイルã®å†…容を〠簡易テキスト化ã—ã¾ã™ã€‚"
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+" 差分インデックスファイル (revlog å½¢å¼) を指定ã—ãŸå ´åˆã€\n"
+" 当該ファイル㮠DAG ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚ リビジョン番å·ã‚’指定ã—ãŸå ´åˆã€\n"
+" 指定リビジョン毎㮠\"rN\" å½¢å¼ãƒ©ãƒ™ãƒ«ä»˜ã‘ãŒã€ 処ç†ã¨ã—ã¦è¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+" ãれ以外ã®å ´åˆã¯ã€ ç¾ãƒªãƒã‚¸ãƒˆãƒªã®å¤‰æ›´å±¥æ­´ãŒ DAG 出力ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "need repo for changelog dag"
+msgstr "変更履歴㮠DAG 出力ã«ã¯ãƒªãƒã‚¸ãƒˆãƒªãŒå¿…è¦ã§ã™"
+
+msgid "open changelog"
+msgstr "変更履歴ã®èª­ã¿è¾¼ã¿"
+
+msgid "open manifest"
+msgstr "マニフェストã®èª­ã¿è¾¼ã¿"
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|FILE REV"
+
+msgid "dump the contents of a data file revision"
+msgstr "データファイルリビジョンã®å†…容表示"
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr "リビジョン指定 %s ã¯ä¸æ­£ã§ã™"
+
+msgid "try extended date formats"
+msgstr "拡張日時形å¼ã®ä½¿ç”¨"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATE [RANGE]"
+
+msgid "parse and display a date"
+msgstr "日付ã®è§£æžãŠã‚ˆã³è¡¨ç¤º"
+
+msgid "use old-style discovery"
+msgstr "旧形å¼ã®æŽ¢ç´¢ã‚’実施"
+
+msgid "use old-style discovery with non-heads included"
+msgstr "non-heads 有りã®æ—§å½¢å¼æŽ¢ç´¢ã‚’実施"
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr "リビジョン探索プロトコルã®å˜ç‹¬å®Ÿè¡Œ"
+
+msgid "parse and apply a fileset specification"
+msgstr "fileset 仕様ã®è§£é‡ˆãŠã‚ˆã³é©ç”¨"
+
+msgid "[PATH]"
+msgstr "[PATH]"
+
+msgid "show information detected about current filesystem"
+msgstr "ファイルシステムã«é–¢ã™ã‚‹æƒ…å ±ã®è¡¨ç¤º"
+
+msgid "id of head node"
+msgstr "ヘッドノード㮠ID"
+
+msgid "id of common node"
+msgstr "共通ノード㮠ID"
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr "REPO FILE [-H|-C ID]..."
+
+msgid "retrieves a bundle from a repo"
+msgstr "リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®ç”Ÿæˆ"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+" ID ã®æŒ‡å®šã«ã¯ã€ 完全長 (40æ¡) ã®16進数文字列を使用ã—ã¦ãã ã•ã„。\n"
+" ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’〠指定ファイルã«æ›¸ã出ã—ã¾ã™ã€‚\n"
+" "
+
+msgid "display the combined ignore pattern"
+msgstr "無視対象ファイル判定用正è¦è¡¨ç¾ã®è¡¨ç¤º"
+
+msgid "no ignore patterns found"
+msgstr "無視対象ファイルã®æŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "revlog format"
+msgstr "revlog ã®å½¢å¼"
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr "[-f FORMAT] -c|-m|FILE"
+
+msgid "dump the contents of an index file"
+msgstr "インデックスファイルã®å†…容表示"
+
+#, python-format
+msgid "unknown format %d"
+msgstr "未知ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆ: %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "インデックス DAG ã® graphviz å‘ã‘ .dot ファイルを生æˆ"
+
+msgid "test Mercurial installation"
+msgstr "Mercurial インストールã®æ¤œè¨¼"
+
+#, python-format
+msgid "checking encoding (%s)...\n"
+msgstr "文字コードã®æ¤œè¨¼ä¸­ (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (ロケール設定ã®å¦¥å½“性を確èªã—ã¦ãã ã•ã„)\n"
+
+#, python-format
+msgid "checking installed modules (%s)...\n"
+msgstr "インストール済ã¿ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã®ç¢ºèªä¸­(%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " 見ã¤ã‹ã‚‰ãªã„エクステンションãŒã‚ã‚Šã¾ã™"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (エクステンションã®ã‚³ãƒ³ãƒ‘イル状æ³ã‚’確èªã—ã¦ãã ã•ã„)\n"
+
+#, python-format
+msgid "checking templates (%s)...\n"
+msgstr "テンプレートã®ç¢ºèªä¸­ (%s)...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr " (テンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒä¸é©åˆ‡ãªã‚ˆã†ã§ã™)\n"
+
+msgid "checking commit editor...\n"
+msgstr "メッセージ入力用エディタã®ç¢ºèªä¸­...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr " エディタãŒèµ·å‹•ã§ãã¾ã›ã‚“(vi ã«ã‚‚ PATH ãŒé€šã£ã¦ã„ã¾ã›ã‚“)\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr " (コミットメッセージ用エディタを設定ファイルã§è¨­å®šã—ã¦ãã ã•ã„)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr " エディタ '%s' ã« PATH ãŒé€šã£ã¦ã„ã¾ã›ã‚“\n"
+
+msgid "checking username...\n"
+msgstr "ユーザåã®ç¢ºèªä¸­...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (設定ファイルã§ãƒ¦ãƒ¼ã‚¶åを設定ã—ã¦ãã ã•ã„)\n"
+
+msgid "no problems detected\n"
+msgstr "å•é¡Œã¯æ¤œå‡ºã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "障害ãŒ%s件検出ã•ã‚Œã¾ã—ãŸã€‚ インストール内容を確èªã—ã¦ãã ã•ã„\n"
+
+msgid "REPO ID..."
+msgstr "REPO ID..."
+
+msgid "test whether node ids are known to a repo"
+msgstr "対象リãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹ ID ã®æ—¢çŸ¥æ€§æ¤œè¨¼"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s\n"
+" and 1s indicating unknown/known.\n"
+" "
+msgstr ""
+" ID ã®æŒ‡å®šã«ã¯ã€ 完全長 (40æ¡) ã®16進数文字列を使用ã—ã¦ãã ã•ã„。\n"
+" å„ ID 毎ã®æ—¢çŸ¥æ€§ã‚’〠0 㨠1 ã§è¡¨ç¾ã—ãŸãƒªã‚¹ãƒˆãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
+msgstr "[OBSOLETED [REPLACEMENT] [REPL... ]"
+
+msgid "create arbitrary obsolete marker"
+msgstr "ä»»æ„ã®ã€Žå»ƒæ­¢ã€çŠ¶æ…‹ã®è¨­å®š"
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr "REPO NAMESPACE [KEY OLD NEW]"
+
+msgid "access the pushkey key/value protocol"
+msgstr "pushkey key/value プロトコルã§ã®ã‚¢ã‚¯ã‚»ã‚¹"
+
+msgid " With two args, list the keys in the given namespace."
+msgstr " 2引数ã§ã®å®Ÿè¡Œã®å ´åˆã€ 指定åå‰ç©ºé–“中ã®ã‚­ãƒ¼ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+" 5引数ã§ã®å®Ÿè¡Œã®å ´åˆã€ 指定キーã®å€¤ãŒæ—§å€¤ã§ã‚ã‚Œã°ã€ 値を更新ã—ã¾ã™ã€‚\n"
+" 実行æˆå¦ãŒå‡ºåŠ›ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr "æ·±ã•(a): %d æ·±ã•(b): %d\n"
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr "差分: %d ãƒãƒŸãƒ³ã‚°(hamming)è·é›¢: %d è·é›¢: %d 関連: %s\n"
+
+msgid "revision to rebuild to"
+msgstr "å†æ§‹ç¯‰å¯¾è±¡ãƒªãƒ“ジョン"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r REV] [REV]"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr "指定リビジョン時点相当㮠dirstate ã®å†æ§‹ç¯‰"
+
+msgid "revision to debug"
+msgstr "デãƒãƒƒã‚°å¯¾è±¡ãƒªãƒ“ジョン"
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] FILE"
+
+msgid "dump rename information"
+msgstr "改å情報ã®è¡¨ç¤º"
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s 㯠%s:%s ã§æ”¹åã•ã‚Œã¾ã—ãŸ\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s ã¯æ”¹åã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+msgid "dump index data"
+msgstr "インデックスデータã®ãƒ€ãƒ³ãƒ—"
+
+msgid "-c|-m|FILE"
+msgstr "-c|-m|FILE"
+
+msgid "show data and statistics about a revlog"
+msgstr "revlog ファイルã®ãƒ‡ãƒ¼ã‚¿ã¨çµ±è¨ˆæƒ…å ±ã®è¡¨ç¤º"
+
+msgid "parse and apply a revision specification"
+msgstr "リビジョン指定記述ã®è§£æžï¼é©ç”¨"
+
+msgid ""
+" Use --verbose to print the parsed tree before and after aliases\n"
+" expansion.\n"
+" "
+msgstr ""
+" --verbose 指定時ã¯ã€ 別å (alias) 展開å‰å¾Œã®ã€ 解æžæœ¨ã‚’表示ã—ã¾ã™ã€‚\n"
+" "
+
+msgid "REV1 [REV2]"
+msgstr "REV1 [REV2]"
+
+msgid "manually set the parents of the current working directory"
+msgstr "作業領域ã®è¦ªãƒªãƒ“ジョンã®æ‰‹å‹•è¨­å®š"
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+" 本コマンドã¯ãƒªãƒã‚¸ãƒˆãƒªå¤‰æ›ãƒ„ールã®ä½œæˆã«æœ‰ç”¨ã§ã™ãŒã€ 利用ã«ã¯æ³¨æ„ãŒ\n"
+" å¿…è¦ã§ã™ã€‚"
+
+msgid "do not display the saved mtime"
+msgstr "記録ã•ã‚ŒãŸ mtime 情報ã®è¡¨ç¤ºæŠ‘æ­¢"
+
+msgid "sort by saved mtime"
+msgstr "記録ã•ã‚ŒãŸ mtime 情報ã§æ•´åˆ—"
+
+msgid "[OPTION]..."
+msgstr "[OPTION]..."
+
+msgid "show the contents of the current dirstate"
+msgstr "ç¾æ™‚点㮠dirstate 内容ã®è¡¨ç¤º"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«è¤‡è£½\n"
+
+msgid "revision to check"
+msgstr "確èªå¯¾è±¡ãƒªãƒ“ジョン"
+
+msgid "show how files match on given patterns"
+msgstr "指定パターンã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«åˆè‡´çŠ¶æ³ã®è¡¨ç¤º"
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "REPO [OPTIONS]... [ONE [TWO]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+
+msgid "diff repository (or selected files)"
+msgstr "作業領域全体(ãªã„ã—指定ファイル)ã®å·®åˆ†æŠ½å‡º"
+
+msgid " Show differences between revisions for the specified files."
+msgstr " 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€ リビジョン間ã®å·®åˆ†ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr " 差分㯠unified diff å½¢å¼ã§è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" マージ実施リビジョンã«å¯¾ã™ã‚‹æœ¬ã‚³ãƒžãƒ³ãƒ‰ã®å·®åˆ†å‡ºåŠ›ãŒã€\n"
+" 期待ã¨ç•°ãªã‚‹å ´åˆãŒã‚ã‚‹ã®ã¯ã€ 対象リビジョンãŒç„¡æŒ‡å®šã®å ´åˆã«\n"
+" 比較対象ã¨ãªã‚‹ã®ãŒã€ 作業領域ã®ç¬¬1親ã«å›ºå®šã•ã‚Œã¦ã„ã‚‹ãŸã‚ã§ã™ã€‚"
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" 指定リビジョンã¨ã€ ãã®ç¬¬1親ã¨ã®é–“ã®å·®åˆ†ã‚’見るã«ã¯ã€ -c/--change ã§\n"
+" 対象リビジョンを指定ã™ã‚‹æ–¹æ³•ã‚‚使用ã§ãã¾ã™ã€‚"
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" -a/--text 指定ãŒç„¡ã„å ´åˆã€ ãƒã‚¤ãƒŠãƒªã¨æ€ã—ãファイルã¯å‡¦ç†å¯¾è±¡ã‹ã‚‰\n"
+" 除外ã•ã‚Œã¾ã™ã€‚ -a 指定ãŒæœ‰ã‚‹å ´åˆã€ çµæžœã«é–¢ã‚らãšå…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒ\n"
+" 処ç†å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" git 拡張差分形å¼ã§è¡¨ç¤ºã™ã‚‹ã«ã¯ -g/--git を指定ã—ã¾ã™ã€‚ 詳細ã¯\n"
+" :hg:`help diffs` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " - compare a file in the current working directory to its parent::"
+msgstr " - 作業領域ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’親リビジョンã¨æ¯”較::"
+
+msgid " hg diff foo.c"
+msgstr " hg diff foo.c"
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr " - 2ã¤ã®ãƒªãƒ“ジョン時点ã§ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªå†…容を比較 (改å情報付ã)::"
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr " hg diff --git -r 1.0:1.2 lib/"
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr " - 指定日時時点ã‹ã‚‰ã®å·®åˆ†ã®çµ±è¨ˆæƒ…報を表示::"
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr " hg diff --stat -r \"date('may 2')\""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr " - 指定キーワードをå«ã‚€å…¨æ–°è¦è¿½åŠ ãƒ•ã‚¡ã‚¤ãƒ«ã®å·®åˆ†ã‚’表示::"
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr " hg diff \"set:added() and grep(GNU)\""
+
+msgid " - compare a revision and its parents::"
+msgstr " - 指定リビジョンã¨ãã®è¦ªã‚’比較::"
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+" hg diff -c 9353 # 第1親ã¨ã®æ¯”較\n"
+" hg diff -r 9353^:9353 # 上記ã¨ç­‰ä¾¡ãª revset 文法記述\n"
+" hg diff -r 9353^2:9353 # 第2親ã¨ã®æ¯”較"
+
+msgid "diff against the second parent"
+msgstr "第2親ã¨ã®å·®åˆ†ã‚’使用"
+
+msgid "revisions to export"
+msgstr "対象リビジョン"
+
+msgid "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
+msgstr "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "1ã¤ä»¥ä¸Šã®ãƒªãƒ“ジョンã«å¯¾ã™ã‚‹ãƒ˜ãƒƒãƒ€ãŠã‚ˆã³å¤‰æ›´å†…容ã®å‡ºåŠ›"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+" 1ã¤ä»¥ä¸Šã®ãƒªãƒ“ジョンã«å¯¾ã—ã¦ã€ ヘッダ情報ãŠã‚ˆã³å¤‰æ›´å†…容を表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" ヘッダ情報ã¨ã—ã¦è¡¨ç¤ºã•ã‚Œã‚‹æƒ…å ±ã¯:作æˆè€…/日付/\n"
+" (default 以外ã®å ´åˆã¯)ブランãƒåå‰/ãƒãƒƒã‚·ãƒ¥å€¤/親リビジョン/コミットログ"
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" マージ実施リビジョンã«å¯¾ã™ã‚‹æœ¬ã‚³ãƒžãƒ³ãƒ‰ã®å·®åˆ†å‡ºåŠ›ãŒã€\n"
+" 期待ã¨ç•°ãªã‚‹å ´åˆãŒã‚ã‚‹ã®ã¯ã€ 比較対象ãŒå¯¾è±¡ãƒªãƒ“ジョンã®ç¬¬1親ã«\n"
+" 固定ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã§ã™ã€‚"
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" 出力先指定(ç½®æ›æŒ‡å®šå¯èƒ½)ãŒã‚ã‚‹å ´åˆã€ 出力ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚\n"
+" ç½®æ›æŒ‡å®šã¨ã—ã¦ä»¥ä¸‹ã®ã‚‚ã®ãŒä½¿ç”¨å¯èƒ½ã§ã™:"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: \"%\" 文字ãã®ã‚‚ã®\n"
+" :``%H``: ãƒãƒƒã‚·ãƒ¥å€¤(40 æ¡ 16 進数)\n"
+" :``%N``: 生æˆã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ç·æ•°\n"
+" :``%R``: リビジョン番å·\n"
+" :``%b``: 対象リãƒã‚¸ãƒˆãƒªãƒ‘スã®æœ«å°¾è¦ç´ \n"
+" :``%h``: 短縮形å¼ãƒãƒƒã‚·ãƒ¥å€¤(12 æ¡ 16 進数)\n"
+" :``%m``: コミットログã®1行目 (英数字é™å®š)\n"
+" :``%n``: 1ã‹ã‚‰å§‹ã¾ã‚‹ã‚¼ãƒ­è©°ã‚ã®é€šã—番å·\n"
+" :``%r``: ゼロ詰ã‚ã®ãƒªãƒ“ジョン番å·"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" -a/--text 指定ãŒç„¡ã„å ´åˆã€ ãƒã‚¤ãƒŠãƒªã¨æ€ã—ãファイルã¯å‡¦ç†å¯¾è±¡ã‹ã‚‰\n"
+" 除外ã•ã‚Œã¾ã™ã€‚ -a 指定ãŒæœ‰ã‚‹å ´åˆã€ çµæžœã«é–¢ã‚らãšã€ å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒ\n"
+" 処ç†å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" git 拡張差分形å¼ã§å‡ºåŠ›ã™ã‚‹ã«ã¯ -g/--git を指定ã—ã¾ã™ã€‚ 詳細ã¯\n"
+" :hg:`help diffs` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" --switch-parent を指定ã™ã‚‹ã“ã¨ã§ã€ 比較対象ãŒç¬¬2親ã«ãªã‚Šã¾ã™ã€‚\n"
+" ã“ã‚Œã¯ãƒžãƒ¼ã‚¸ã®ãƒ¬ãƒ“ューã®éš›ãªã©ã«æœ‰åŠ¹ã§ã™ã€‚"
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr " - export 㨠import ã®ä½µç”¨ã«ã‚ˆã‚‹ç¾ãƒ–ランãƒä¸Šã¸ã®å¤‰æ›´ã®ç§»æ¤::"
+
+msgid " hg export -r 9353 | hg import -"
+msgstr " hg export -r 9353 | hg import -"
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr " - 指定リビジョン間ã®å…¨å¤‰æ›´ (改å情報付ã) をファイルã«å‡ºåŠ›::"
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr " hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr " - å¯èª­æ€§ã‚ã‚‹åå‰ã®ä¸€é€£ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¤‰æ›´å†…容を分割格ç´::"
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
+msgid "export requires at least one changeset"
+msgstr "最低1ã¤ã®ãƒªãƒ“ジョン指定ãŒå¿…è¦ã§ã™"
+
+msgid "exporting patches:\n"
+msgstr "パッãƒã®ä½œæˆä¸­:\n"
+
+msgid "exporting patch:\n"
+msgstr "パッãƒã®ä½œæˆä¸­:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr "次回コミットã«ãŠã‘る指定ファイルã®ç™»éŒ²é™¤å¤–"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr " 指定ファイルã®æ¬¡å›žã‚³ãƒŸãƒƒãƒˆã«ãŠã‘る登録除外を予約ã—ã¾ã™ã€‚"
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" 本コマンドã§ã®ç™»éŒ²é™¤å¤–ã¯ã€ ç¾ãƒ–ランãƒã«ãŠã‘る登録除外ã®ã¿ã‚’æ„味ã—ã€\n"
+" 履歴ãã®ã‚‚ã®ã¯ä¿æŒã•ã‚Œç¶šã‘ã¾ã™ã—〠作業領域ã‹ã‚‰ã‚‚削除ã•ã‚Œã¾ã›ã‚“。"
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+" 登録除外æ“作ã®ã‚³ãƒŸãƒƒãƒˆå‰å–り消ã—ã¯ã€ :hg:`help add` ã‚’å‚ç…§ã—ã¦\n"
+" ãã ã•ã„。"
+
+msgid " - forget newly-added binary files::"
+msgstr " - æ–°è¦è¿½åŠ ã®ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録除外::"
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr " hg forget \"set:added() and binary()\""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr " - .hgignore ã«ã‚ˆã‚‹ç„¡è¦–対象ファイルを登録除外::"
+
+msgid " hg forget \"set:hgignore()\""
+msgstr " hg forget \"set:hgignore()\""
+
+msgid "revisions to graft"
+msgstr "移æ¤å¯¾è±¡ãƒªãƒ“ジョン"
+
+msgid "resume interrupted graft"
+msgstr "中断ã•ã‚ŒãŸç§»æ¤ã‚’å†é–‹"
+
+msgid "append graft info to log message"
+msgstr "コミットログã¸ã®ç§»æ¤æƒ…å ±ã®ä»˜ä¸Ž"
+
+msgid "record the current date as commit date"
+msgstr "ç¾æ™‚刻をコミット日時ã¨ã—ã¦è¨˜éŒ²"
+
+msgid "record the current user as committer"
+msgstr "ç¾ãƒ¦ãƒ¼ã‚¶ã‚’コミットユーザã¨ã—ã¦è¨˜éŒ²"
+
+msgid "[OPTION]... [-r] REV..."
+msgstr "[OPTION]... [-r] REV..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "別ブランãƒä¸Šã‹ã‚‰ç¾è¡Œãƒ–ランãƒã¸ã®æŒ‡å®šãƒªãƒ“ジョンã®è¤‡è£½"
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+" 本コマンドã¯ã€ ã‚るブランãƒã‹ã‚‰åˆ¥ã®ãƒ–ランãƒã¸ã€ Mercurial\n"
+" ã®ãƒžãƒ¼ã‚¸æ©Ÿèƒ½ã§ãƒªãƒ“ジョンを複製ã—ã¾ã™ãŒã€ 履歴上ã¯ãƒžãƒ¼ã‚¸ã•ã‚Œã¾ã›ã‚“。\n"
+" ã“れ㯠'backport' ãªã„ã— 'cherry-picking' ã¨å‘¼ã°ã‚Œã‚‹æ©Ÿèƒ½ã§ã™ã€‚\n"
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ ユーザå〠日付〠コミットログã¯ã€ \n"
+" 元リビジョンã®ã‚‚ã®ã‚’å†åˆ©ç”¨ã—ã¾ã™ã€‚"
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+" ç¾è¡Œãƒªãƒ“ジョンã®ç¥–先〠既ã«ç§»æ¤ (graft) 済ã¿ã®ãƒªãƒ“ジョンã€\n"
+" マージ実施リビジョンã¯ã€ 複製対象ã‹ã‚‰é™¤å¤–ã•ã‚Œã¾ã™ã€‚"
+
+msgid " (grafted from CHANGESETHASH)"
+msgstr " (grafted from 移æ¤å…ƒãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤)"
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
+msgstr ""
+" 本コマンドã®ãƒžãƒ¼ã‚¸å‡¦ç†ã§è¡çªãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã€ 処ç†ãŒä¸­æ–­ã•ã‚Œã‚‹ã®ã§ã€\n"
+" 手動ã§ã®è¡çªè§£æ±ºãŒå¯èƒ½ã§ã™ã€‚ å…¨ã¦ã®è¡çªãŒè§£æ¶ˆã•ã‚ŒãŸãªã‚‰ã°ã€\n"
+" -c/--continue 指定ã«ã‚ˆã‚Šã‚³ãƒžãƒ³ãƒ‰ã®å®Ÿè¡Œã‚’å†é–‹ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+" .. note::\n"
+" -c/--continue ã§ã‚‚〠以å‰ã®ã‚ªãƒ—ション指定ã¾ã§ã¯å†ç¾ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr " - コミットログを改変ã—ã¤ã¤å˜ä¸€ãƒªãƒ“ジョンを stable ã¸è¤‡è£½::"
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+" hg update stable\n"
+" hg graft --edit 9393"
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr " - 日付を更新ã—ã¤ã¤ã€2091 を除ã指定範囲中ã®ãƒªãƒ“ジョンを複製::"
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr " hg graft -D \"2085::2093 and not 2091\""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr " - è¡çªè§£æ¶ˆå¾Œã®ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œå†é–‹::"
+
+msgid " hg graft -c"
+msgstr " hg graft -c"
+
+msgid " - show the source of a grafted changeset::"
+msgstr " - 複製元リビジョンã®è¡¨ç¤º::"
+
+msgid " hg log --debug -r tip"
+msgstr " hg log --debug -r tip"
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "--continue ã¨ãƒªãƒ“ジョンã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "no graft state found, can't continue"
+msgstr "移æ¤çŠ¶æ…‹ãŒè¨˜éŒ²ã•ã‚Œã¦ã„ãªã„ãŸã‚å†é–‹ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "移æ¤ã§ããªã„マージリビジョン %s を飛ã°ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "祖先リビジョン %s を飛ã°ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "移æ¤æ¸ˆã¿ãƒªãƒ“ジョン %s を飛ã°ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (same origin %d)\n"
+msgstr "移æ¤æ¸ˆã¿ãƒªãƒ“ジョン %s を飛ã°ã—ã¦ã„ã¾ã™ (ç”±æ¥å…ƒ: %d)\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (was grafted from %d)\n"
+msgstr "移æ¤æ¸ˆã¿ãƒªãƒ“ジョン %s を飛ã°ã—ã¦ã„ã¾ã™ (移æ¤å…ƒ: %d)\n"
+
+#, python-format
+msgid "grafting revision %s\n"
+msgstr "リビジョン %s ã®ç§»æ¤ä¸­\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "è¡çªãŒæœªè§£æ¶ˆã®ãŸã‚ã€ç¶™ç¶šã§ãã¾ã›ã‚“"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "hg resolve 㨠hg graft --continue を使用ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "graft for revision %s is empty\n"
+msgstr "リビジョン %s ã®ç§»æ¤ã¯ç©ºã§ã™\n"
+
+msgid "end fields with NUL"
+msgstr "å„フィールドã®åŒºåˆ‡ã‚Šã«NUL文字(0x00)を使用"
+
+msgid "print all revisions that match"
+msgstr "åˆè‡´ã™ã‚‹ãƒªãƒ“ジョンを全ã¦è¡¨ç¤º"
+
+msgid "ignore case when matching"
+msgstr "大文字å°æ–‡å­—を無視ã—ã¦æ¤œç´¢"
+
+msgid "print only filenames and revisions that match"
+msgstr "åˆè‡´ã®éš›ã«ãƒ•ã‚¡ã‚¤ãƒ«åã¨ãƒªãƒ“ジョンã®ã¿ã‚’表示"
+
+msgid "print matching line numbers"
+msgstr "åˆè‡´ã—ãŸè¡Œç•ªå·ã‚’表示"
+
+msgid "only search files changed within revision range"
+msgstr "指定リビジョン範囲ã®ã¿ã‚’検索"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[OPTION]... PATTERN [FILE]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "特定ã®ãƒ‘ターンã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒªãƒ“ジョンã®æ¤œç´¢"
+
+msgid " Search revisions of files for a regular expression."
+msgstr " æ­£è¦è¡¨ç¾ã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’å«ã‚€ãƒªãƒ“ジョンを検索ã—ã¾ã™ã€‚"
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+" 本コマンドã®æŒ™å‹•ã¯ Unix ã® grep ã¨ã¯ç•°ãªã‚Šã¾ã™ã€‚\n"
+" 解釈å¯èƒ½ãªæ­£è¦è¡¨ç¾ã¯ Python/Perl å½¢å¼ã®ã‚‚ã®ã ã‘ã§ã™ã€‚\n"
+" 検索対象ã¯ãƒªãƒã‚¸ãƒˆãƒªå†…ã®ãƒ‡ãƒ¼ã‚¿ã®ã¿ã§ã€\n"
+" 作業領域ã¯æ¤œç´¢å¯¾è±¡ã«ã¯å«ã¾ã‚Œã¾ã›ã‚“。\n"
+" パターンã«åˆè‡´ã™ã‚‹å†…容ãŒç¾ã‚ŒãŸãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 本コマンドã¯ãƒ‘ターンã«åˆè‡´ã™ã‚‹å†…容ãŒæœ€åˆã«ç¾ã‚ŒãŸ\n"
+" リビジョンをå„ファイル毎ã«è¡¨ç¤ºã—ã¾ã™ã€‚ パターンã«åˆè‡´ã™ã‚‹å¤‰æ›´ã®ã‚ã£ãŸ\n"
+" å…¨ã¦ã®ãƒªãƒ“ジョンを表示ã™ã‚‹å ´åˆã€ --all を指定ã—ã¾ã™(パターンåˆè‡´éƒ¨ãŒ\n"
+" 削除æ“作ãªã‚‰ \"-\"〠追加æ“作ãªã‚‰ \"+\" ãŒæ¤œç´¢çµæžœã«è¡¨ç¤º)。"
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+" パターンåˆè‡´ãŒã‚ã‚‹å ´åˆã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠ãれ以外㯠1 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: '%s' ã¯ä¸æ­£ãªãƒ‘ターンã§ã™\n"
+
+msgid "STARTREV"
+msgstr "開始リビジョン"
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "指定リビジョンã®å­å­«ã¨ãªã‚‹ãƒ˜ãƒƒãƒ‰ã®ã¿ã‚’表示"
+
+msgid "show topological heads only"
+msgstr "å­ã‚’æŒãŸãªã„å…¨ã¦ã®ãƒªãƒ“ジョンを表示"
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "アクティブãªãƒ–ランãƒãƒ˜ãƒƒãƒ‰ã®ã¿ã‚’表示 (éžæŽ¨å¥¨)"
+
+msgid "show normal and closed branch heads"
+msgstr "閉鎖済ã¿ãƒ˜ãƒƒãƒ‰ã‚‚表示"
+
+msgid "[-ct] [-r STARTREV] [REV]..."
+msgstr "[-ct] [-r STARTREV] [REV]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "ç¾æ™‚点ã§ã®ãƒªãƒã‚¸ãƒˆãƒª(ãªã„ã—ブランãƒ)ã®ãƒ˜ãƒƒãƒ‰è¡¨ç¤º"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr ""
+" 引数指定ãŒç„¡ã„å ´åˆã€ リãƒã‚¸ãƒˆãƒªä¸­ã®å…¨ã¦ã®ãƒ–ランãƒãƒ˜ãƒƒãƒ‰ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+" リãƒã‚¸ãƒˆãƒªã®ã€Œãƒ˜ãƒƒãƒ‰ã€ã¨ã¯ã€\n"
+" å­ãƒªãƒ“ジョンをæŒãŸãªã„リビジョンã®ã“ã¨ã§ã™ã€‚\n"
+" 改変作業ã®å®Ÿæ–½ã‚„〠update/merge コマンド実施ã®éš›ã«ã¯ã€\n"
+" ã“ã®ãƒªãƒ“ジョンを対象ã¨ã™ã‚‹ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚\n"
+" 「ブランãƒãƒ˜ãƒƒãƒ‰ã€ã¨ã¯ã€ åŒã˜åå‰ä»˜ãブランãƒå†…ã«ã€\n"
+" å­ãƒªãƒ“ジョンをæŒãŸãªã„リビジョンã®ã“ã¨ã§ã™ã€‚"
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+" 1ã¤ä»¥ä¸Šã®ãƒªãƒ“ジョンãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定ã•ã‚ŒãŸãƒªãƒ“ジョンã®å±žã™ã‚‹\n"
+" åå‰ä»˜ãブランãƒã«ãŠã‘るヘッドã®ã¿ã‚’表示ã—ã¾ã™ã€‚\n"
+" ã“ã®æŒ™å‹•ã¯ã€ :hg:`heads foo` を実行ã™ã‚‹ã“ã¨ã§ã€\n"
+" åå‰ä»˜ãブランム``foo`` ã«ãŠã‘るヘッドを表示ã§ãã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" -c/--closed 指定時ã«ã¯ã€ 閉鎖済ã¿ã®ãƒ–ランãƒ\n"
+" (:hg:`commit --close-branch` å‚ç…§) も表示ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+" 「開始リビジョンã€ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定ã•ã‚ŒãŸé–‹å§‹ãƒªãƒ“ジョンã®\n"
+" å­å­«ã¨ãªã‚‹ãƒ˜ãƒƒãƒ‰ã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+" -t/--topo 指定時ã«ã¯ã€ åå‰ä»˜ãブランãƒã«é–¢ã™ã‚‹åˆ¤å®šã¯ç„¡è¦–ã•ã‚Œã€\n"
+" å˜ã«å­ãƒªãƒ“ジョンをæŒãŸãªã„リビジョンãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" åˆè‡´ã™ã‚‹ãƒ˜ãƒƒãƒ‰ãŒã‚ã‚‹å ´åˆã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠ãれ以外㯠1 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "ブランム%s ã«ã¯ã‚ªãƒ¼ãƒ—ンãªãƒ˜ãƒƒãƒ‰ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid " (started at %s)"
+msgstr "(%s ã‹ã‚‰é–‹å§‹)"
+
+msgid "show only help for extensions"
+msgstr "エクステンションã®ãƒ˜ãƒ«ãƒ—ã®ã¿ã‚’表示"
+
+msgid "show only help for commands"
+msgstr "コマンドã«é–¢ã™ã‚‹ãƒ˜ãƒ«ãƒ—ã®ã¿ã‚’表示"
+
+msgid "show topics matching keyword"
+msgstr "キーワードã«åˆè‡´ã™ã‚‹ãƒˆãƒ”ック一覧を表示"
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [TOPIC]"
+
+msgid "show help for a given topic or a help overview"
+msgstr "指定ã•ã‚ŒãŸãƒˆãƒ”ックã®ãƒ˜ãƒ«ãƒ—や〠ヘルプ概è¦ã®è¡¨ç¤º"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr " 引数指定ãŒç„¡ã„å ´åˆã€ コマンドã®ä¸€è¦§ã¨æ¦‚è¦ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" トピックやコマンドåãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定対象ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"別å: %s\n"
+
+msgid "(no help text available)"
+msgstr "(ヘルプã¯ã‚ã‚Šã¾ã›ã‚“)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "シェルコマンドã®åˆ¥å::"
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "コマンドã®åˆ¥å: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr "\"hg help -e %s\" ã«ã‚ˆã£ã¦ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ %s ã®ãƒ˜ãƒ«ãƒ—ãŒè¡¨ç¤ºã•ã‚Œã¾ã™"
+
+msgid "options:"
+msgstr "オプション:"
+
+msgid "global options:"
+msgstr "グローãƒãƒ«ã‚ªãƒ—ション:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"\"hg help %s\" ã§è©³ç´°ãªãƒ˜ãƒ«ãƒ—ãŒè¡¨ç¤ºã•ã‚Œã¾ã™\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"\"hg -v help %s\" ã§è©³ç´°ãªæƒ…å ±ãŒè¡¨ç¤ºã•ã‚Œã¾ã™\n"
+
+msgid "basic commands:"
+msgstr "基本コマンド:"
+
+msgid "list of commands:"
+msgstr "コマンド一覧:"
+
+msgid "no commands defined\n"
+msgstr "コマンドãŒå®šç¾©ã•ã‚Œã¦ã„ã¾ã›ã‚“\n"
+
+msgid "enabled extensions:"
+msgstr "有効化ã•ã‚Œã¦ã„るエクステンション:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"追加ã®ãƒ˜ãƒ«ãƒ—トピック:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "全コマンドã®ä¸€è¦§ã¯ \"hg help\" ã§è¡¨ç¤ºã•ã‚Œã¾ã™"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"全コマンドã®ä¸€è¦§ã¯ \"hg help\" ã§ã€ コマンド詳細㯠\"hg -v\" ã§è¡¨ç¤ºã•ã‚Œã¾ã™"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "\"hg help %s\" ã§è©³ç´°ãªãƒ˜ãƒ«ãƒ—ãŒè¡¨ç¤ºã•ã‚Œã¾ã™"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr "組ã¿è¾¼ã¿åˆ¥åãŠã‚ˆã³ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚ªãƒ—ションã®è¡¨ç¤ºã¯ \"hg -v help%s\""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"\"hg help -c %s\" ã«ã‚ˆã£ã¦ã‚³ãƒžãƒ³ãƒ‰ %s ã®ãƒ˜ãƒ«ãƒ—ãŒè¡¨ç¤ºã•ã‚Œã¾ã™\n"
+
+msgid "no help text available"
+msgstr "ヘルプã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s エクステンション - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr "\"hg help extensions\" ã§æœ‰åŠ¹ãªã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã®æƒ…å ±ãŒè¡¨ç¤ºã•ã‚Œã¾ã™\n"
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr "以下ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã«ã‚ˆã‚Š '%s' ãŒæä¾›ã•ã‚Œã¦ã„ã¾ã™:"
+
+msgid "Topics"
+msgstr "トピック"
+
+msgid "Extension Commands"
+msgstr "エクステンション由æ¥ã®ã‚³ãƒžãƒ³ãƒ‰"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial - 分散構æˆç®¡ç†ãƒ„ール\n"
+
+msgid "identify the specified revision"
+msgstr "当該リビジョンã®è­˜åˆ¥æƒ…報を表示"
+
+msgid "show local revision number"
+msgstr "リビジョン番å·ã‚’表示"
+
+msgid "show global revision id"
+msgstr "ãƒãƒƒã‚·ãƒ¥å€¤ã‚’表示"
+
+msgid "show branch"
+msgstr "ブランãƒåを表示"
+
+msgid "show tags"
+msgstr "タグを表示"
+
+msgid "show bookmarks"
+msgstr "ブックマークã®è¡¨ç¤º"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [SOURCE]"
+
+msgid "identify the working copy or specified revision"
+msgstr "作業領域ãªã„ã—特定リビジョンã®è­˜åˆ¥æƒ…報表示"
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+" 1ã¤ãªã„ã—2ã¤ã®è¦ªãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤ã‚’使用ã—ã¦ã€\n"
+" 指定リビジョンã«ãŠã‘ã‚‹è¦ç´„情報を表示ã—ã¾ã™ã€‚\n"
+" 親リビジョンãƒãƒƒã‚·ãƒ¥ã«ç¶šã‘ã¦ã€\n"
+" 作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã¯ \"+\" ã€\n"
+" default 以外ã®ãƒ–ランãƒã§ã‚ã‚Œã°ãƒ–ランãƒåã€\n"
+" 付与ã•ã‚Œã¦ã„ã‚‹ã‚¿ã‚°ã®ä¸€è¦§ã€\n"
+" ãŠã‚ˆã³ä»˜ä¸Žã•ã‚Œã¦ã„るブックマークã®ä¸€è¦§ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" リビジョン指定無ã—ã§èµ·å‹•ã•ã‚ŒãŸå ´åˆã¯ã€ 作業領域ã®çŠ¶æ…‹ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" パス指定有りã§ã®èµ·å‹•ã®éš›ã«ã¯ã€ ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªãªã„ã—ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®\n"
+" 状態を表示ã—ã¾ã™ã€‚"
+
+msgid " - generate a build identifier for the working directory::"
+msgstr " - 作業領域ã®ãƒ“ルド識別情報ã®ç”Ÿæˆ::"
+
+msgid " hg id --id > build-id.dat"
+msgstr " hg id --id > build-id.dat"
+
+msgid " - find the revision corresponding to a tag::"
+msgstr " - ã‚¿ã‚°ã«å¯¾å¿œã™ã‚‹ãƒªãƒ“ジョンã®ç‰¹å®š::"
+
+msgid " hg id -n -r 1.3"
+msgstr " hg id -n -r 1.3"
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr " - 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘る最新リビジョンã®ç¢ºèª::"
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr " hg id -r tip http://selenic.com/hg/"
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr "リビジョン番å·/ブランãƒ/ã‚¿ã‚°ã¯é éš”å•ã„åˆã‚ã›ã§ãã¾ã›ã‚“"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr "パスè¦ç´ é™¤åŽ»æ•°(patch コマンドã®åŒåオプションã¨åŒæ©Ÿèƒ½)"
+
+msgid "PATH"
+msgstr "パス"
+
+msgid "base path (DEPRECATED)"
+msgstr "基底パス (éžæŽ¨å¥¨)"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "作業領域中ã®æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ã®ç¢ºèªã‚’çœç•¥"
+
+msgid "don't commit, just update the working directory"
+msgstr "作業領域ã®æ›´æ–°ã®ã¿ã§ã€ コミット実施を抑止"
+
+msgid "apply patch without touching the working directory"
+msgstr "作業領域を改変ã›ãšã«ãƒ‘ッãƒã‚’é©ç”¨"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "パッãƒä½œæˆæ™‚ã¨åŒã˜è¦ªãƒªãƒ“ジョンã«å¯¾ã—ã¦é©ç”¨"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr "パッãƒä¸­ã®ãƒ–ランãƒæƒ…報を利用(--exact 指定時ã¯è‡ªå‹•é©ç”¨)"
+
+msgid "[OPTION]... PATCH..."
+msgstr "[OPTION]... PATCH..."
+
+msgid "import an ordered set of patches"
+msgstr "パッãƒã®é †æ¬¡å–ã‚Šè¾¼ã¿"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+" 列挙ã•ã‚ŒãŸãƒ‘ッãƒã®å–ã‚Šè¾¼ã¿ãŠã‚ˆã³ã‚³ãƒŸãƒƒãƒˆã‚’\n"
+" (--no-commit 指定ãŒç„¡ã„é™ã‚Š) 個別ã«è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+" 作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã€ -f/--force ãŒæŒ‡å®šã•ã‚Œãªã„é™ã‚Šã€\n"
+" å–ã‚Šè¾¼ã¿ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+" æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ (但㗠text/plain ãªã„ã— text/x-patch åž‹é™å®š)\n"
+" ã‚’å«ã‚ã¦ã€ é›»å­ãƒ¡ãƒ¼ãƒ«ã‹ã‚‰ã‚‚パッãƒã‚’å–ã‚Šè¾¼ã‚ã¾ã™ã€‚\n"
+" 作æˆè€…ï¼ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ãŒç„¡ã„å ´åˆã€ é›»å­ãƒ¡ãƒ¼ãƒ«ã® From ãŠã‚ˆã³ Subject\n"
+" ヘッダ値を使用ã—ã¾ã™ã€‚ 差分データã«å…ˆç«‹ã¤ text/plain パートã¯ã€\n"
+" コミットログã«è¿½è¨˜ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+" :hg:`export` ã«ã‚ˆã‚Šç”Ÿæˆã•ã‚ŒãŸãƒ‘ッãƒã‚’å–り込む場åˆã€ é›»å­ãƒ¡ãƒ¼ãƒ«ã®\n"
+" ヘッダやボディã®æƒ…報よりも〠パッãƒã«å«ã¾ã‚Œã‚‹æƒ…å ±ã®æ–¹ãŒå„ªå…ˆã—ã¾ã™ã€‚\n"
+" コマンドラインã§ã® -m/--message ãªã„ã— -u/--user 指定ã¯ã€\n"
+" ã“れらよりも更ã«å„ªå…ˆã—ã¾ã™ã€‚"
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+" --exact 指定時ã«ã¯ã€ 作業領域をパッãƒã®è¦ªãƒªãƒ“ジョンã«æ›´æ–°ã—ã¦ã‹ã‚‰ã€\n"
+" パッãƒã‚’é©ç”¨ã—ã¾ã™ãŒã€ パッãƒã«ã‚ˆã‚Šä½œæˆã•ã‚ŒãŸãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤ãŒã€\n"
+" パッãƒã«è¨˜éŒ²ã•ã‚ŒãŸå€¤ã¨ç•°ãªã‚‹å ´åˆã€ パッãƒã®å–ã‚Šè¾¼ã¿ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" ã“ã®å•é¡Œã®åŽŸå› ã¨ã—ã¦è€ƒãˆã‚‰ã‚Œã‚‹ã®ã¯ã€ 文字符å·åŒ–å½¢å¼ã®ä¸ä¸€è‡´ã‚„ã€\n"
+" パッãƒå†…容ã®æ¬ æãªã©ã§ã™ã€‚"
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+" --bypass 指定時ã¯ã€ 作業領域ã®æ”¹å¤‰ç„¡ã—ã«å¤‰æ›´å†…容をå映ã—ã¾ã™ã€‚\n"
+" --exact 指定ãŒç„¡ã„å ´åˆã€ 変更ã¯ä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as :hg:`addremove`."
+msgstr ""
+" -s/--similarity ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ :hg:`addremove` ã¨åŒæ§˜ãªæ–¹é‡ã§ã€\n"
+" パッãƒã«ã‚ˆã‚‹å¤‰æ›´çµæžœã‹ã‚‰ã€ 改åや複製を検出ã—ã¾ã™ã€‚"
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" 標準入力ã‹ã‚‰ãƒ‘ッãƒã‚’å–り込むã«ã¯ã€ パッãƒåã« \"-\" を指定ã—ã¾ã™ã€‚\n"
+" URL ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ パッãƒã‚’当該 URL ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã™ã€‚\n"
+" -d/--date ã§ã®æ—¥æ™‚表記㯠:hg:`help dates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr " - ウェブサイトã‹ã‚‰å…¥æ‰‹ã—ãŸæ¨™æº–çš„ãªãƒ‘ッãƒã®é©ç”¨ã¨æ”¹åã®åˆ¤å®š::"
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr " hg import -s 80 http://example.com/bugfix.patch"
+
+msgid " - import a changeset from an hgweb server::"
+msgstr " - hgweb サーãƒã‹ã‚‰ã®æŒ‡å®šãƒªãƒ“ジョンã®å–ã‚Šè¾¼ã¿::"
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr " - Unix å½¢å¼ mbox ファイル中ã®å…¨ãƒ‘ッãƒã®å–ã‚Šè¾¼ã¿::"
+
+msgid " hg import incoming-patches.mbox"
+msgstr " hg import incoming-patches.mbox"
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+" - export ã•ã‚ŒãŸãƒªãƒ“ジョンã®åŽ³å¯†é©ç”¨ (常ã«æˆåŠŸã™ã‚‹ã¨ã¯é™ã‚Šã¾ã›ã‚“)::"
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr " hg import --exact proposed-fix.patch"
+
+msgid "need at least one patch to import"
+msgstr "å–ã‚Šè¾¼ã¿ã«ã¯æœ€ä½Ž1ã¤ã®ãƒ‘ッãƒå指定ãŒå¿…è¦ã§ã™"
+
+msgid "cannot use --no-commit with --bypass"
+msgstr "--no-commit 㨠--bypass ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "cannot use --similarity with --bypass"
+msgstr "--similarity 㨠--bypass ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "patch is damaged or loses information"
+msgstr "パッãƒã«ã¯ç ´æãªã„ã—情報ã®æ¬ è½ãŒã‚ã‚Šã¾ã™"
+
+msgid "applied to working directory"
+msgstr "作業領域ã¸ã®é©ç”¨"
+
+msgid "not a Mercurial patch"
+msgstr "Mercurial å‘ã‘ã®ãƒ‘ッãƒã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "%s を作æˆ"
+
+msgid "applying patch from stdin\n"
+msgstr "標準入力ã‹ã‚‰ã®ãƒ‘ッãƒã‚’é©ç”¨ä¸­\n"
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: 差分ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "run even if remote repository is unrelated"
+msgstr "連æºå…ˆãŒç„¡é–¢ä¿‚ãªãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚実行"
+
+msgid "show newest record first"
+msgstr "æ–°ã—ã„リビジョンã‹ã‚‰å…ˆã«è¡¨ç¤º"
+
+msgid "file to store the bundles into"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®æ›¸ã出ã—å…ˆ"
+
+msgid "a remote changeset intended to be added"
+msgstr "å–ã‚Šè¾¼ã¿å¯¾è±¡ãƒªãƒ“ジョン"
+
+msgid "compare bookmarks"
+msgstr "ブックマークã®æ¯”較"
+
+msgid "a specific branch you would like to pull"
+msgstr "å–ã‚Šè¾¼ã¿å¯¾è±¡ãƒ–ランãƒ"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+
+msgid "show new changesets found in source"
+msgstr "指定リãƒã‚¸ãƒˆãƒªä¸­ã®æœªå–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンã®æ¤œç´¢"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" ファイルパス〠URL ãªã„ã— :hg:`pull` ã®ç„¡æŒ‡å®šæ™‚連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªä¸­ã®ã€\n"
+" 未å–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンを検索ã—ã¾ã™ã€‚ ã“れらã®ãƒªãƒ“ジョンã¯\n"
+" :hg:`pull` を実行ã—ãŸéš›ã«ã€ å–ã‚Šè¾¼ã¿å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" --bundle ã§ã®æ›¸ã出ã—çµæžœã‚’利用ã—㟠:hg:`pull` ã®å®Ÿæ–½ã¯ã€\n"
+" :hg:`pull` ã§ã®å†åº¦ã®ãƒ‡ãƒ¼ã‚¿è»¢é€ã‚’抑止ã§ãã‚‹ãŸã‚ã€\n"
+" (データ転é€ã‚³ã‚¹ãƒˆã®é«˜ã„) é éš”ホストã¨ã®é€£æºã§ã¯ç‰¹ã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid " See pull for valid source format details."
+msgstr " 対象リãƒã‚¸ãƒˆãƒªã®æŒ‡å®šå½¢å¼ã¯ :hg:`help pull` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+" å–ã‚Šè¾¼ã¿å¯¾è±¡ãŒã‚ã‚‹å ´åˆã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠ãれ以外㯠1 ã§ã™ã€‚\n"
+" "
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr "--bundle 㨠--subrepos ã¯çµ„ã¿åˆã‚ã›ã‚‰ã‚Œã¾ã›ã‚“"
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã¯ãƒ–ックマークãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "create a new repository in the given directory"
+msgstr "指定ã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ã®æ–°è¦ãƒªãƒã‚¸ãƒˆãƒªã®ä½œæˆ"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æ–°è¦ãƒªãƒã‚¸ãƒˆãƒªã‚’作æˆã—ã¾ã™ã€‚ 指定ã•ã‚ŒãŸ\n"
+" ディレクトリãŒå­˜åœ¨ã—ãªã„å ´åˆã«ã¯ã€ ディレクトリを作æˆã—ã¾ã™ã€‚"
+
+msgid " If no directory is given, the current directory is used."
+msgstr " ディレクトリãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒåˆæœŸåŒ–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" 複製先ã¨ã—㦠``ssh://`` URL å½¢å¼ã‚’指定ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+" 詳細ã«é–¢ã—ã¦ã¯ã€ :hg:`help urls` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "search the repository as it is in REV"
+msgstr "当該リビジョン時点ã®ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã‹ã‚‰æ¤œç´¢"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "ファイルåã‚’NUL文字(0x00)ã§çµ‚端(xargs ã¨ã®ä½µç”¨å‘ã‘)"
+
+msgid "print complete paths from the filesystem root"
+msgstr "ファイルシステムã®ãƒ«ãƒ¼ãƒˆã‹ã‚‰ã®çµ¶å¯¾ãƒ‘スã§è¡¨ç¤º"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[OPTION]... [PATTERN]..."
+
+msgid "locate files matching specific patterns"
+msgstr "指定ã•ã‚ŒãŸãƒ‘ターンã«åˆè‡´ã™ã‚‹åå‰ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã®ç‰¹å®š"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" 構æˆç®¡ç†å¯¾è±¡ã¨ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸­ã‹ã‚‰ã€ 指定ã•ã‚ŒãŸãƒ‘ターンã«åˆè‡´ã™ã‚‹\n"
+" åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’特定ã—ã¾ã™ã€‚"
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 本コマンドã¯æ§‹æˆç®¡ç†å¯¾è±¡ã¨ãªã‚‹ä½œæ¥­é ˜åŸŸä¸­ã®\n"
+" 全ディレクトリを検索対象ã¨ã—ã¾ã™ã€‚ ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ãã®é…下ã®ã¿ã‚’検索\n"
+" 対象ã¨ã™ã‚‹å ´åˆã¯ \"--include .\" を指定ã—ã¾ã™ã€‚"
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+" パターン指定ãŒç„¡ã„å ´åˆã€ 本コマンドã¯æ§‹æˆç®¡ç†å¯¾è±¡ä¸‹ã«ã‚る作業領域中ã®\n"
+" å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«åを表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" 本コマンドã®å‡ºåŠ›ã‚’ \"xargs\" コマンドã¸ã¨æ¸¡ã™å ´åˆã€ 本コマンドã¨\n"
+" \"xargs\" コマンドã®ä¸¡æ–¹ã« \"-0\" を指定ã—ã¦ãã ã•ã„。 空白文字を\n"
+" å«ã‚€å˜ä¸€ã®ãƒ•ã‚¡ã‚¤ãƒ«åを〠\"xargs\" ãŒè¤‡æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«åã«è§£é‡ˆã—ã¦\n"
+" ã—ã¾ã†å•é¡Œã¯ã€ ã“ã®ã‚ªãƒ—ションã«ã‚ˆã‚Šè§£æ¶ˆã•ã‚Œã¾ã™ã€‚"
+
+msgid "show revision history of entire repository or files"
+msgstr "リãƒã‚¸ãƒˆãƒªå…¨ä½“ãªã„ã—ファイルã®å¤‰æ›´å±¥æ­´ã®è¡¨ç¤º"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr " 特定ã®ãƒ•ã‚¡ã‚¤ãƒ«ãªã„ã—リãƒã‚¸ãƒˆãƒªå…¨ä½“ã®å¤‰æ›´å±¥æ­´ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" 特ã«æŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 対象ã¨ãªã‚‹ãƒªãƒ“ジョンã®ç¯„囲㯠``tip:0``\n"
+" ã¨ã¿ãªã•ã‚Œã¾ã™ãŒã€ --follow ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 作業領域ã®\n"
+" 親リビジョンãŒé–‹å§‹ãƒªãƒ“ジョンã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" ファイルã®å±¥æ­´è¡¨ç¤ºã§ã¯ã€ 改åï¼è¤‡è£½æ™‚ã®å…ƒãƒ•ã‚¡ã‚¤ãƒ«ã«ã¾ã§ã•ã‹ã®ã¼ã£ãŸ\n"
+" 履歴ã¯è¡¨ç¤ºã—ã¾ã›ã‚“。 元ファイルã®å±¥æ­´ã‚’ã•ã‹ã®ã¼ã‚‹å ´åˆã¯ã€ ファイルå\n"
+" ã¨ä¸€ç·’ã« -f/--follow を使用ã—ã¾ã™ã€‚ --follow 指定ã®éš›ã«ãƒ•ã‚¡ã‚¤ãƒ«åãŒ\n"
+" 指定ã•ã‚Œãªã„å ´åˆã¯ã€ 開始リビジョンã«é€£ãªã‚‹ãƒªãƒ“ジョンã®ã¿ã‚’表示\n"
+" ã—ã¾ã™ã€‚"
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ 本コマンドãŒå‡ºåŠ›ã™ã‚‹æƒ…報㯠-\n"
+" リビジョン番å·ã€ 識別用ãƒãƒƒã‚·ãƒ¥å€¤ã€ タグ〠(リビジョン番å·ã®é›¢ã‚ŒãŸ)\n"
+" 親リビジョン〠作æˆè€…〠作æˆæ—¥æ™‚ãŠã‚ˆã³ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã®1行目 - ã§ã™ã€‚\n"
+" -v/--verbose ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 変更対象ファイル一覧ã¨ã€\n"
+" コミットログã®å…¨æ–‡ã‚‚表示ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" マージ実施リビジョンã«å¯¾ã™ã‚‹ -p/--patch 指定ã«ã‚ˆã‚‹å·®åˆ†å‡ºåŠ›ãŒã€\n"
+" 期待ã¨ç•°ãªã‚‹å ´åˆãŒã‚ã‚‹ã®ã¯ã€ 比較対象ãŒå¯¾è±¡ãƒªãƒ“ジョンã®ç¬¬1親ã«\n"
+" 固定ã•ã‚Œã¦ã„ã‚‹ãŸã‚ã§ã™ã€‚ ファイル一覧ãŒäºˆæœŸã›ã¬å†…容ã¨ãªã‚‹ã®ã¯ã€\n"
+" 親åŒå£«ã§å†…容ãŒç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ãŒåˆ—挙ã•ã‚Œã‚‹ãŸã‚ã§ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+" .. note::\n"
+" ファイルå指定付ãã§ã®å®Ÿè¡Œã§ã¯ã€ 複数ブランãƒä¸Šã§ã®åŒä¸€å¤‰æ›´ã‚„ã€\n"
+" 登録除外実施リビジョンã¯ã€ 性能的ãªç‚¹ã‹ã‚‰è¡¨ç¤ºã—ã¾ã›ã‚“。\n"
+" é‡è¤‡å¤‰æ›´ã‚„登録除外をå«ã‚〠全ã¦ã®ãƒªãƒ“ジョンを表示ã™ã‚‹å ´åˆã€\n"
+" --removed を指定ã—ã¦ãã ã•ã„。"
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr " - 全リビジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã®è¡¨ç¤º::"
+
+msgid " hg log -v"
+msgstr " hg log -v"
+
+msgid " - changesets ancestral to the working directory::"
+msgstr " - 作業領域ã®ç¥–å…ˆã®è¡¨ç¤º::"
+
+msgid " hg log -f"
+msgstr " hg log -f"
+
+msgid " - last 10 commits on the current branch::"
+msgstr " - ç¾è¡Œãƒ–ランãƒã«ãŠã‘ã‚‹ç›´è¿‘ã® 10 リビジョンã®è¡¨ç¤º::"
+
+msgid " hg log -l 10 -b ."
+msgstr " hg log -l 10 -b ."
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr " - 登録除外をå«ã‚€ã€ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã™ã‚‹å…¨å¤‰æ›´ã®è¡¨ç¤º::"
+
+msgid " hg log --removed file.c"
+msgstr " hg log --removed file.c"
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr " - マージ以外ã§ã®ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé…下ã¸ã®å…¨å¤‰æ›´ã®å·®åˆ†ä»˜ã表示::"
+
+msgid " hg log -Mp lib/"
+msgstr " hg log -Mp lib/"
+
+msgid " - all revision numbers that match a keyword::"
+msgstr " - 指定キーワードã«åˆè‡´ã™ã‚‹å…¨ãƒªãƒ“ジョン番å·ã®è¡¨ç¤º::"
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr " hg log -k bug --template \"{rev}\\n\""
+
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr " - 指定リビジョンãŒæŒ‡å®šã‚¿ã‚°æ™‚点ã«ãŠã„ã¦å«ã¾ã‚Œã¦ã„ã‚‹ã‹ã‚’確èª::"
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr " hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr " - 指定期間ã«ãŠã‘る指定ユーザã«ã‚ˆã‚‹å…¨å¤‰æ›´ã®è¡¨ç¤º::"
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr " hg log -k alice -d \"may 2008 to jul 2008\""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr " - 最後ã®ã‚¿ã‚°ä»˜ã‘以é™ã®å…¨å¤‰æ›´ã®æ¦‚è¦ã®è¡¨ç¤º::"
+
+msgid ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+" リビジョン指定ã®è©³ç´°ã¯ :hg:`help revisions` ãŠã‚ˆã³ :hg:`help revsets`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" See :hg:`help templates` for more about pre-packaged styles and\n"
+" specifying custom templates."
+msgstr ""
+" åŒæ¢±ã•ã‚Œã¦ã„るスタイルやã€ãƒ†ãƒ³ãƒ—レートã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºç­‰ã®è©³ç´°ã¯ã€\n"
+" :hg:`help templates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "revision to display"
+msgstr "表示対象リビジョン"
+
+msgid "list files from all revisions"
+msgstr "関連ã™ã‚‹å…¨ãƒ•ã‚¡ã‚¤ãƒ«ã®è¡¨ç¤º"
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr "ç¾æ™‚点ãªã„ã—指定時点ã§ã®ãƒªãƒã‚¸ãƒˆãƒªãƒžãƒ‹ãƒ•ã‚§ã‚¹ãƒˆã®å‡ºåŠ›"
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+" 指定リビジョンã«ãŠã‘る構æˆç®¡ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ã‚’表示ã—ã¾ã™ã€‚\n"
+" リビジョン指定ãŒç„¡ã„å ´åˆã€ 作業領域ã®(第1)親リビジョンã‹ã€\n"
+" 作業領域ã®æ›´æ–°å‰ãªã‚‰ null ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+" -v ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ファイルアクセス権やシンボリックリンクã€\n"
+" 実行å¯èƒ½ãƒ“ットã¨ã„ã£ãŸã‚‚ã®ã‚‚表示ã•ã‚Œã¾ã™ã€‚\n"
+" --debug ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ å„ファイルã®ãƒªãƒ“ジョンã®ãƒãƒƒã‚·ãƒ¥å€¤ãŒ\n"
+" 表示ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+" --all ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ リビジョンã«é–¢ã‚る全ファイルãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚\n"
+" ã“ã®å ´åˆã€ 削除ï¼æ”¹å対象ファイルもå«ã¾ã‚Œã¾ã™ã€‚"
+
+msgid "can't specify a revision with --all"
+msgstr "リビジョン指定㨠--all ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "force a merge with outstanding changes"
+msgstr "作業領域中ã®æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ã”ã¨ãƒžãƒ¼ã‚¸ã‚’実施"
+
+msgid "revision to merge"
+msgstr "マージ対象リビジョン"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr "マージ対象リビジョンã®ç¢ºèª(マージ処ç†ã¯æœªå®Ÿæ–½)"
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "作業領域ã®å†…容ã¨ä»–ã®ãƒªãƒ“ジョンã®ãƒžãƒ¼ã‚¸"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" ç¾æ™‚点ã§ã®ä½œæ¥­é ˜åŸŸã®å†…容を〠指定ã•ã‚ŒãŸãƒªãƒ“ジョンã¸ã¨è‡³ã‚‹ã¾ã§ã®\n"
+" 共通ã®è¦ªãƒªãƒ“ジョンã‹ã‚‰ã®å¤‰æ›´å†…容ã¨ãƒžãƒ¼ã‚¸ã—ã¾ã™ã€‚"
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" 両方ã®è¦ªãƒªãƒ“ジョンã«å¯¾ã—ã¦å·®åˆ†ã®ã‚るファイルã¯ã€ 次回コミットã®éš›ã«ã¯\n"
+" 変更ã•ã‚ŒãŸã‚‚ã®ã¨ã—ã¦è¨˜éŒ²ã•ã‚Œã¾ã™ã®ã§ã€ å¿…è¦ä»¥ä¸Šã®å¤‰æ›´ãŒå®Ÿæ–½ã•ã‚Œã‚‹å‰ã«\n"
+" コミットを実施ã—ã¦ãã ã•ã„。 ã“ã®ã‚³ãƒŸãƒƒãƒˆæ™‚ã«ç”Ÿæˆã•ã‚Œã‚‹ãƒªãƒ“ジョンã¯ã€\n"
+" 親リビジョンを2ã¤æŒã¤ãƒªãƒ“ジョンã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+" ``--tool`` を使用ã™ã‚‹ã“ã¨ã§ã€\n"
+" ファイルã®ãƒžãƒ¼ã‚¸ã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’指定å¯èƒ½ã§ã™ã€‚\n"
+" ã“ã®ã‚ªãƒ—ションã«ã‚ˆã‚‹æŒ‡å®šã¯ã€\n"
+" HGMERGE 環境変数や設定ファイルã«ã‚ˆã‚‹æŒ‡å®šã‚’上書ãã—ã¾ã™ã€‚\n"
+" 指定ã®è©³ç´°ã«é–¢ã—ã¦ã¯ã€ :hg:`help merge-tools` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" マージ対象リビジョンã®æŒ‡å®šãŒç„¡ã〠作業領域ã®è¦ªãƒªãƒ“ジョンãŒãƒ˜ãƒƒãƒ‰ã§ã€\n"
+" 且ã¤ç¾è¡Œãƒ–ランãƒãŒã‚‚ã†1ã¤ã ã‘ヘッドをæŒã¤å ´åˆã€ ãã®ãƒ˜ãƒƒãƒ‰ãŒãƒžãƒ¼ã‚¸\n"
+" 対象ã¨ãªã‚Šã¾ã™ã€‚ ãれ以外ã®å ´åˆã¯ã€ 明示的ãªãƒªãƒ“ジョン指定ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr " è¡çªæœªè§£æ¶ˆãªãƒ•ã‚¡ã‚¤ãƒ«ã¯ :hg:`resolve` ã§ã®è¡çªè§£æ¶ˆãŒå¿…è¦ã§ã™ã€‚"
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+" コミットå‰ã«ãƒžãƒ¼ã‚¸å‡¦ç†ã‚’å–り消ã™å ´åˆã¯ã€ :hg:`update --clean .`\n"
+" ãŒä½¿ç”¨ã§ãã¾ã™ãŒã€ マージå‰ã®è¦ªãƒªãƒ“ジョンã®å†…容ã§ä¸Šæ›¸ãã™ã‚‹ãŸã‚ã€\n"
+" 作業領域中ã®å…¨ã¦ã®å¤‰æ›´å†…容ãŒå¤±ã‚ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠未解消ファイルãŒã‚ã‚‹å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid ""
+"multiple matching bookmarks to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr "ç¾ãƒ–ックマークã¯è¤‡æ•°ãƒ˜ãƒƒãƒ‰ã§ã™ -マージ対象を明示ã—ã¦ãã ã•ã„"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "'hg heads' ã«ã‚ˆã‚Šãƒ˜ãƒƒãƒ‰ã‚’一覧表示ã§ãã¾ã™"
+
+msgid ""
+"no matching bookmark to merge - please merge with an explicit rev or bookmark"
+msgstr "ç¾ãƒ–ックマークã¯å˜ä¸€ãƒ˜ãƒƒãƒ‰ã§ã™ - マージ対象を明示ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr "ブランム'%s' ã«ã¯ %d 個ã®ãƒ˜ãƒƒãƒ‰ã‚ã‚Šã¾ã™ - 対象を明示ã—ã¦ãã ã•ã„"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "'hg heads .' ã«ã‚ˆã‚Šãƒ˜ãƒƒãƒ‰ã‚’一覧表示ã§ãã¾ã™"
+
+msgid "heads are bookmarked - please merge with an explicit rev"
+msgstr "ヘッドã¯ãƒ–ックマークã•ã‚Œã¦ã„ã¾ã™ - マージ対象を明示ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr "ブランム'%s' ã¯å˜ä¸€ãƒ˜ãƒƒãƒ‰ã§ã™ - 対象を明示ã—ã¦ãã ã•ã„"
+
+msgid "nothing to merge"
+msgstr "マージã®å¿…è¦ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "use 'hg update' instead"
+msgstr "'hg update' を使用ã—ã¦ãã ã•ã„"
+
+msgid "working directory not at a head revision"
+msgstr "作業領域ã®è¦ªãƒªãƒ“ジョンã¯ã€ ヘッドã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "リビジョンを明示ã—ã¦ã€'hg update' ãªã„ã—マージを実施ã—ã¦ãã ã•ã„"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "å映対象ã¨ã™ã‚‹ãƒªãƒ“ジョン"
+
+msgid "a specific branch you would like to push"
+msgstr "å映対象ã¨ã™ã‚‹ãƒ–ランãƒ"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+
+msgid "show changesets not found in the destination"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å«ã¾ã‚Œãªã„リビジョンã®è¡¨ç¤º"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" 指定ã•ã‚ŒãŸé€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒª (ãªã„ã—〠無指定時㮠:hg:`push`\n"
+" 先リãƒã‚¸ãƒˆãƒª) ã«å«ã¾ã‚Œãªã„リビジョンを表示ã—ã¾ã™ã€‚\n"
+" ã“ã“ã§è¡¨ç¤ºã•ã‚Œã‚‹ãƒªãƒ“ジョンã¯ã€\n"
+" :hg:`push` 実施ã®éš›ã«ã€ 連æºå…ˆã¸ã¨å映ã•ã‚Œã¾ã™ã€‚"
+
+msgid " See pull for details of valid destination formats."
+msgstr " 有効ãªãƒªãƒã‚¸ãƒˆãƒªæŒ‡å®šå½¢å¼ã¯ :hg:`pull` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+" å映å¯èƒ½ãƒªãƒ“ジョンãŒã‚ã‚‹å ´åˆã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠ãれ以外ã¯\n"
+" 1 ã§ã™ã€‚\n"
+" "
+
+msgid "show parents of the specified revision"
+msgstr "親リビジョンã®è¡¨ç¤ºå¯¾è±¡"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [FILE]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "作業領域(ãªã„ã—指定リビジョン)ã®è¦ªãƒªãƒ“ジョンã®è¡¨ç¤º"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" 作業領域ã®è¦ªãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚ -r/--rev ã§ã®ãƒªãƒ“ジョン指定ãŒ\n"
+" ã‚ã‚‹å ´åˆã€ 指定リビジョンã®è¦ªãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚ ファイルãŒæŒ‡å®š\n"
+" ã•ã‚ŒãŸå ´åˆã€ (作業領域ã®è¦ªãƒªãƒ“ジョン〠ãªã„ã— --rev 指定ã®ãƒªãƒ“ジョン\n"
+" 以å‰ã®ã‚‚ã®ã§)ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’最後ã«æ›´æ–°ã—ãŸãƒªãƒ“ジョンを表示ã—ã¾ã™ã€‚"
+
+msgid "can only specify an explicit filename"
+msgstr "明示的ãªãƒ•ã‚¡ã‚¤ãƒ«å以外ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' ã¯ç®¡ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "[NAME]"
+msgstr "[NAME]"
+
+msgid "show aliases for remote repositories"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã®åˆ¥å一覧ã®è¡¨ç¤º"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+" 指定ã•ã‚ŒãŸã‚·ãƒ³ãƒœãƒ«åã«ç›¸å½“ã™ã‚‹é€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‚’表示ã—ã¾ã™ã€‚\n"
+" シンボルåãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ å…¨ã¦ã®åˆ¥å定義ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+" -q/--quiet ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" シンボルå検索ã®éŽç¨‹ã«ãŠã‘る表示ã¯æŠ‘æ­¢ã•ã‚Œã€\n"
+" çµæžœè¡¨ç¤ºã‚‚シンボルåã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+" シンボル定義ã¯ã€ 個人ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚„ ``/etc/mercurial/hgrc`` ç­‰ã®\n"
+" [paths] セクションã«è¨˜è¿°ã•ã‚Œã¾ã™ã€‚ 作業領域ã§ã®å®Ÿè¡Œã®å ´åˆã¯\n"
+" ``.hg/hgrc`` ã§ã®è¨˜è¿°ã‚‚å‚ç…§ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+" ``default`` ãŠã‚ˆã³ ``default-push`` ã¯ç‰¹åˆ¥ãªæ„味をæŒã¡ã¾ã™ã€‚\n"
+" push/pull ã®éš›ã«ã‚³ãƒžãƒ³ãƒ‰è¡Œã§é€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€\n"
+" ã“れらã®ãƒ‘スãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ``default-push`` ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+" ``default-push`` 㯠:hg:`push` ã§ä½¿ç”¨ã•ã‚Œã€ ``default`` ã¯\n"
+" :hg:`pull` ã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ``default-push`` ãŒæœªè¨­å®šã§ã‚ã‚Œã°ã€\n"
+" push/pull 共㫠``default`` を使用ã—ã¾ã™ã€‚ リãƒã‚¸ãƒˆãƒªã®è¤‡è£½ã§ã¯ã€\n"
+" 複製元リãƒã‚¸ãƒˆãƒªãŒ ``default`` ã¨ã—㦠``.hg/hgrc`` ã«è¨˜éŒ²ã•ã‚Œã¾ã™ã€‚\n"
+" ``default`` ãŠã‚ˆã³ ``default-push`` ã¯å…¨ã¦ã®å–り込㿠(例:\n"
+" :hg:`incoming`) ãŠã‚ˆã³å映 (例: :hg:`outgoing`〠:hg:`email` ãŠã‚ˆã³\n"
+" :hg:`bundle`) æ“作ã«ãŠã„ã¦é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid " See :hg:`help urls` for more information."
+msgstr " 詳細㯠:hg:`help urls` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "not found!\n"
+msgstr "指定シンボルã¯ä¸æ˜Žã§ã™\n"
+
+msgid "set changeset phase to public"
+msgstr "リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’ public 化"
+
+msgid "set changeset phase to draft"
+msgstr "リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’ draft 化"
+
+msgid "set changeset phase to secret"
+msgstr "リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’ secret 化"
+
+msgid "allow to move boundary backward"
+msgstr "フェーズ境界ã®ç§»å‹•ã‚’ä¼´ã†å¼·åˆ¶å®Ÿè¡Œ"
+
+msgid "target revision"
+msgstr "対象リビジョン"
+
+msgid "[-p|-d|-s] [-f] [-r] REV..."
+msgstr "[-p|-d|-s] [-f] [-r] REV..."
+
+msgid "set or show the current phase name"
+msgstr "ç¾è¡Œãƒ•ã‚§ãƒ¼ã‚ºçŠ¶æ…‹ã®æ”¹å¤‰ãªã„ã—表示"
+
+msgid " With no argument, show the phase name of specified revisions."
+msgstr " 引数無ã—ã®å ´åˆã€ 指定リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºåを表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" With one of -p/--public, -d/--draft or -s/--secret, change the\n"
+" phase value of the specified revisions."
+msgstr ""
+" -p/--public〠-d/--draft ãªã„ã— -s/--secret ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 指定リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’指定値ã«å¤‰æ›´ã—ã¾ã™ã€‚"
+
+msgid ""
+" Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
+" lower phase to an higher phase. Phases are ordered as follows::"
+msgstr ""
+" -f/--force ãŒæŒ‡å®šã•ã‚Œãªã„é™ã‚Šã€ 低ã„æ–¹ã‹ã‚‰é«˜ã„æ–¹ã¸ã®ãƒ•ã‚§ãƒ¼ã‚ºå¤‰æ›´ã¯ã€\n"
+" 実施ã§ãã¾ã›ã‚“。 フェーズã®é«˜ä½Žã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™::"
+
+msgid " public < draft < secret"
+msgstr " public < draft < secret"
+
+msgid ""
+" Return 0 on success, 1 if no phases were changed or some could not\n"
+" be changed.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰ã®çµ‚了値㯠0〠フェーズ状態変更ãŒç„¡ã„ã€ã‚ã‚‹ã„ã¯ã€\n"
+" 変更ã«å¤±æ•—ã—ãŸå ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "only one phase can be specified"
+msgstr "フェーズ指定ã¯1ã¤ã ã‘ã§ã™"
+
+#, python-format
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+"公開方å‘ã¸ã®ãƒ•ã‚§ãƒ¼ã‚ºå¤‰æ›´ãŒ %i 個ã®ãƒªãƒ“ジョンã§å¤±æ•—ã—ã¾ã—ãŸã€‚\n"
+"é©å®œ --force 指定を行ã£ã¦ãã ã•ã„。\n"
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "%i 個ã®ãƒªãƒ“ジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’変更\n"
+
+msgid "no phases changed\n"
+msgstr "フェーズã®å¤‰æ›´ãªã—\n"
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "更新中断: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(ヘッド一覧表示㯠'hg heads'〠マージ実施㯠'hg merge')\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr "(ヘッド一覧表示㯠'hg heads .'〠マージ実施㯠'hg merge')\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "(ヘッド一覧表示㯠'hg heads')\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(作業領域ã®æ›´æ–°ã¯ 'hg update')\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "æ–°è¦å–ã‚Šè¾¼ã¿ã®éš›ã¯ã€ æ–°è¦ãƒ–ランãƒãƒ˜ãƒƒãƒ‰ã§ã€ 作業領域を更新"
+
+msgid "run even when remote repository is unrelated"
+msgstr "連æºå…ˆãŒç„¡é–¢ä¿‚ãªãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚実行"
+
+msgid "BOOKMARK"
+msgstr "ブックマーク"
+
+msgid "bookmark to pull"
+msgstr "å–ã‚Šè¾¼ã¿å¯¾è±¡ãƒ–ックマーク"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+
+msgid "pull changes from the specified source"
+msgstr "指定リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®å¤‰æ›´å±¥æ­´ã®å–ã‚Šè¾¼ã¿"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰æ‰‹å…ƒã®ãƒªãƒã‚¸ãƒˆãƒªã«å¤‰æ›´å±¥æ­´ã‚’å–ã‚Šè¾¼ã¿ã¾ã™ã€‚"
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" パスや URL ã§æŒ‡å®šã•ã‚Œã‚‹é€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªä¸­ã®ã€ å…¨ã¦ã®ãƒªãƒ“ジョンãŒ\n"
+" (-R 指定ãŒç„¡ã„å ´åˆã¯ç¾åœ¨ã®) リãƒã‚¸ãƒˆãƒªã¸ã®å–ã‚Šè¾¼ã¿å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚\n"
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã«ã‚ˆã‚‹ä½œæ¥­é ˜åŸŸã®æ›´æ–°ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" :hg:`incoming` を使用ã™ã‚‹ã“ã¨ã§ã€ 実際ã®å–ã‚Šè¾¼ã¿ã‚’ã›ãšã«ã€\n"
+" :hg:`pull` ã«ã‚ˆã‚‹å–ã‚Šè¾¼ã¿å¯¾è±¡ã‚’確èªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ 表示ã•ã‚ŒãŸ\n"
+" 内容ã®å–ã‚Šè¾¼ã¿ã‚’決断ã—ãŸãªã‚‰ã°ã€ :hg:`incoming` 実行ã§è¡¨ç¤ºã•ã‚ŒãŸ\n"
+" 最後ã®ãƒªãƒ“ジョンを ``-r`` ã®å¼•æ•°ã«ã—㦠:hg:`pull -r X` を実行ã—ã¾ã™ã€‚"
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" 連æºå…ˆãŒçœç•¥ã•ã‚ŒãŸå ´åˆã€ 'default' パスãŒé€£æºå…ˆã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" 詳細㯠:hg:`help urls` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠作業領域更新ã«ã‚ˆã‚Šã€ \n"
+" è¡çªæœªè§£æ¶ˆãƒ•ã‚¡ã‚¤ãƒ«ãŒç”Ÿã˜ã‚‹å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "連æºå…ˆã«ã¯ãƒ–ックマーク %s ãŒã‚ã‚Šã¾ã›ã‚“!"
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "ブックマーク %s ã®å–ã‚Šè¾¼ã¿ä¸­\n"
+
+msgid "force push"
+msgstr "å映先ã«ãƒ˜ãƒƒãƒ‰ãŒå¢—ãˆã‚‹å ´åˆã§ã‚‚実施"
+
+msgid "bookmark to push"
+msgstr "å映対象ブックマーク"
+
+msgid "allow pushing a new branch"
+msgstr "æ–°è¦ãƒ–ランãƒã®å映を許å¯"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "push changes to the specified destination"
+msgstr "指定リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›´å±¥æ­´ã®å映"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr " 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰æŒ‡å®šé€£æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å¤‰æ›´å±¥æ­´ã‚’å映ã—ã¾ã™ã€‚"
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" ã“れ㯠:hg:`pull` ã¨å¯¾ç§°çš„ãªæ“作ã§ã™:連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" ç¾ãƒªãƒã‚¸ãƒˆãƒªã«å¯¾ã™ã‚‹ :hg:`pull` ã‚’è¡Œã£ãŸå ´åˆã¨åŒä¸€ã®åŠ¹æžœã‚’æŒã¡ã¾ã™ã€‚"
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ 複数ヘッド状態ã¯ã€ ã©ã®ãƒ˜ãƒƒãƒ‰ãŒå¦¥å½“ãªã‚‚ã®ã§ã‚ã‚‹ã‹\n"
+" æ··ä¹±ã™ã‚‹ãŸã‚〠連æºå…ˆã«æ–°è¦ãƒ˜ãƒƒãƒ‰ãŒä½œæˆã•ã‚Œã‚‹å映ã¯è¨±å¯ã•ã‚Œã¾ã›ã‚“。\n"
+" ã“ã®ã‚ˆã†ãªå ´åˆã€ :hg:`push` 実施å‰ã«ã€ :hg:`pull` ãŠã‚ˆã³ :hg:`merge`\n"
+" を実施ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" 連æºå…ˆã«å­˜åœ¨ã—ãªã„åå‰ä»˜ãブランãƒã‚’æ–°è¦ä½œæˆã™ã‚‹å ´åˆã¯ --new-branch\n"
+" を使用ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ションã¯ã€ æ–°è¦ãƒ–ランãƒã®ä½œæˆã®ã¿ã‚’許å¯ã—ã¾ã™ã€‚"
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" 通常挙動ã«ãŠã‘る制約を無視ã—ã¦ã€ å…¨ã¦ã®ãƒ–ランãƒã«ãŠã‘ã‚‹å…¨ã¦ã®å¤‰æ›´ã‚’\n"
+" å映ã™ã‚‹å ´åˆã¯ã€ -f/--force を使用ã—ã¾ã™ã€‚"
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" -r/--rev ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定リビジョンã¨ãã®ç¥–å…ˆã®ãƒªãƒ“ジョン群ãŒã€\n"
+" 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã¸ã¨å映ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If -B/--bookmark is used, the specified bookmarked revision, its\n"
+" ancestors, and the bookmark will be pushed to the remote\n"
+" repository."
+msgstr ""
+" -B/--bookmark ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定ブックマークã®ãƒªãƒ“ジョンã¨ã€\n"
+" ãã®ç¥–å…ˆã®ãƒªãƒ“ジョン群〠ãŠã‚ˆã³ãƒ–ックマークãŒã€ 連æºå…ˆã¸ã¨å映ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" ``ssh://`` URL å½¢å¼ã®è©³ç´°ã¯ã€ :hg:`help urls` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" 連æºå…ˆãŒçœç•¥ã•ã‚ŒãŸå ´åˆã€ 'default' パスãŒé€£æºå…ˆã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" å映æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠何もå映ã•ã‚Œãªã‹ã£ãŸå ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "%s ã¸ã®å映中\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "ブックマーク %s ã®å映中\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "連æºå…ˆã®ãƒ–ックマーク %s ã®å‰Šé™¤ä¸­\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "ブックマーク %s ã¯ã„ãšã‚Œã®ãƒªãƒã‚¸ãƒˆãƒªã«ã‚‚存在ã—ã¾ã›ã‚“!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "ブックマーク %s ã®æ›´æ–°ã«å¤±æ•—!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "中断ã•ã‚ŒãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å–り消ã—"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr " commit ã‚„ pull ãŒä¸­æ–­ã•ã‚ŒãŸå ´åˆã®å¾©æ—§ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" 本コマンドã¯ã€ æ“作ãŒä¸­æ–­ã•ã‚ŒãŸéš›ã®ãƒªãƒã‚¸ãƒˆãƒªçŠ¶æ…‹ã®ä¿®å¾©ã‚’è¡Œã„ã¾ã™ã€‚\n"
+" 本コマンドã®å®Ÿè¡Œã¯ã€ Mercurial ãŒå®Ÿè¡Œã‚’促ã—ãŸå ´åˆã®ã¿ã§å分ã§ã™ã€‚"
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠修復ä¸è¦ãªã„ã—修復失敗時㯠1 ã§ã™ã€‚\n"
+" "
+
+msgid "record delete for missing files"
+msgstr "手動ã§å‰Šé™¤æ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€ 登録除外ã®æ—¨ã‚’記録"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "追加登録ï¼å¤‰æ›´å¯¾è±¡ã§ã‚ã£ã¦ã‚‚登録除外(ファイルã¯å‰Šé™¤)"
+
+msgid "remove the specified files on the next commit"
+msgstr "次回コミットã«ãŠã‘る指定ファイルã®ç™»éŒ²é™¤å¤–"
+
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr " ç¾ãƒ–ランãƒã§ã®ã€ 構æˆç®¡ç†å¯¾è±¡ã‹ã‚‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®é™¤å¤–を予約ã—ã¾ã™ã€‚"
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" 指定ファイルã¯ã€ 次回ã®ã‚³ãƒŸãƒƒãƒˆã§ç™»éŒ²é™¤å¤–ã•ã‚Œã¾ã™ã€‚ コミットå‰ã«ã€\n"
+" 登録除外ã®å–り消ã—㯠:hg:`help revert` を〠構æˆç®¡ç†ç™»éŒ²ã®å–り消ã—ã¯\n"
+" :hg:`forget` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" 手動削除ã—ãŸãƒ•ã‚¡ã‚¤ãƒ«ã®äº‹å¾Œçš„ãªç™»éŒ²é™¤å¤–ã§ã¯ -A/--after ã‚’ã€\n"
+" 強制的ã«ç™»éŒ²é™¤å¤–ã™ã‚‹ã«ã¯ -f/--force ã‚’ã€\n"
+" 登録除外ã®éš›ã«ã€ä½œæ¥­é ˜åŸŸä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ãªã„å ´åˆã«ã¯\n"
+" -Af を指定ã—ã¾ã™ã€‚"
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" ファイルã®çŠ¶æ…‹ (横) ã¨ã€ オプション指定 (縦) ã®çµ„ã¿åˆã‚ã›ã¨æŒ™å‹•ã¯ã€\n"
+" 以下ã®ä¸€è¦§ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" ファイルã®çŠ¶æ…‹ã¯ã€ :hg:`status` ã®è¡¨ç¤ºã«å€£ã„ã€\n"
+" 追加 (Added) [A]〠改変無㗠(Clean) [C]〠改変有り (Modified) [M]\n"
+" ãŠã‚ˆã³ä¸åœ¨ (Missing) [!] ã§è¡¨ã—ã¾ã™ã€‚\n"
+" 挙動ã¯ã€ 警告 (Warn) [W]〠構æˆç®¡ç†ã‹ã‚‰ã®ç™»éŒ²é™¤å¤– (Remove) [R]\n"
+" ãŠã‚ˆã³ä½œæ¥­é ˜åŸŸã‹ã‚‰ã®å‰Šé™¤ (Delete) [D] ã§è¡¨ã—ã¾ã™::"
+
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" 無指定 W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+" 作業領域ã«ãŠã‘る追加 [A] 状態ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã—ã¦ã¯ã€\n"
+" --force を指定ã—ãªãã¦ã‚‚ã€\n"
+" 登録除外æ“作ã«ã‚ˆã£ã¦ç ´æ£„ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠警告検出時㯠1 ã§ã™ã€‚\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: 未登録ファイルã§ã™\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: ファイルã¯ä¿æŒã•ã‚Œã¾ã™(削除ã®å¼·è¡Œã¯ -f を指定)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr ""
+"%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: ファイルã¯æ”¹å¤‰ã•ã‚Œã¦ã„ã¾ã™(削除ã®å¼·è¡Œã¯ -f を指定)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“: 追加登録対象ファイルã§ã™ (å–り消ã—㯠forget)\n"
+
+msgid "record a rename that has already occurred"
+msgstr "手動ã§æ”¹å済ã¿ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€ 改åã®æ—¨ã‚’記録"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[OPTION]... SOURCE... DEST"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "ファイルã®æ”¹å(copy + remove ã¨ç­‰ä¾¡)"
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+" 改åå…ƒã®è¤‡è£½ã¨ã—ã¦æ”¹å先を追加登録ã—〠改å元を登録除外ã—ã¾ã™ã€‚\n"
+" 改åå…ˆãŒãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å ´åˆã€ ディレクトリ内ã«è¤‡è£½ãŒä½œæˆã•ã‚Œã¾ã™ã€‚\n"
+" 改åå…ˆãŒãƒ•ã‚¡ã‚¤ãƒ«ã®å ´åˆã€ 改åå…ƒã¯1ã¤ã—ã‹æŒ‡å®šã§ãã¾ã›ã‚“。"
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" 本コマンドã®å®Ÿè¡Œçµæžœã¯æ¬¡å›žã®ã‚³ãƒŸãƒƒãƒˆã®éš›ã«åŠ¹æžœã‚’発æ®ã—ã¾ã™ã€‚ 改å\n"
+" æ“作ã®ã‚³ãƒŸãƒƒãƒˆå‰å–り消ã—㯠:hg:`help revert` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "select all unresolved files"
+msgstr "è¡çªæœªè§£æ¶ˆã®å…¨ãƒ•ã‚¡ã‚¤ãƒ«ã‚’処ç†å¯¾è±¡ã«ã™ã‚‹"
+
+msgid "list state of files needing merge"
+msgstr "マージã®å¿…è¦ãªãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æ¶ˆçŠ¶æ…‹ä¸€è¦§"
+
+msgid "mark files as resolved"
+msgstr "当該ファイルをè¡çªè§£æ¶ˆæ¸ˆã¿çŠ¶æ…‹ã«è¨­å®š"
+
+msgid "mark files as unresolved"
+msgstr "当該ファイルをè¡çªæœªè§£æ¶ˆçŠ¶æ…‹ã«è¨­å®š"
+
+msgid "hide status prefix"
+msgstr "状態記å·ã®è¡¨ç¤ºã‚’抑止"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr "マージã®å†å®Ÿæ–½ã€ ãªã„ã—å„ファイルã®ãƒžãƒ¼ã‚¸çŠ¶æ³ç®¡ç†"
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents). See :hg:`help\n"
+" merge-tools` for information on configuring merge tools."
+msgstr ""
+" 未解消ã®è¡çªã®å¤šã㯠``internal:merge`` ã‚„ ``diff3`` ãªã©ã‚’使用ã—ãŸ\n"
+" éžå¯¾è©±çš„ãªãƒžãƒ¼ã‚¸ã«ç”±æ¥ã—ã¾ã™ã€‚ 本コマンドã¯ã€ :hg:`merge` 実行後ã‹ã‚‰\n"
+" :hg:`commit` 実行ã«ã‹ã‘ã¦ã€ マージã«é–¢ä¸Žã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’管ç†ã—ã¾ã™ã€‚\n"
+" (ã“ã®éš›ã«ã¯ã€ 作業領域ã¯ï¼’ã¤ã®è¦ªãƒªãƒ“ジョンをæŒã¤å¿…è¦ãŒã‚ã‚Šã¾ã™)\n"
+" マージツール設定ã®è©³ç´°ã¯ :hg:`help merge-tools` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " The resolve command can be used in the following ways:"
+msgstr " 本コマンドã¯ã€ 以下ã®å½¢å¼ã§ä½¿ç”¨ã•ã‚Œã¾ã™:"
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+" - :hg:`resolve [--tool TOOL] FILE...`: 指定ファイルã®ãƒžãƒ¼ã‚¸ã‚’\n"
+" å†åº¦å®Ÿæ–½ã—ã¾ã™ã€‚ ã“ã®éš›ã«ã¯ã€ ç›´å‰ã¾ã§ã®å¤‰æ›´å†…容ã¯ç ´æ£„ã•ã‚Œã¾ã™ã€‚\n"
+" è¡çªè§£æ¶ˆæ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã¯ã€ マージã¯å†å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。\n"
+" å…¨ã¦ã®æœªè§£æ¶ˆãƒ•ã‚¡ã‚¤ãƒ«ã«é©ç”¨ã™ã‚‹å ´åˆã¯ ``--all/-a`` を指定ã—ã¾ã™ã€‚\n"
+" ``--tool`` を使用ã™ã‚‹ã“ã¨ã§ã€ ファイルã®ãƒžãƒ¼ã‚¸ã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’\n"
+" 指定å¯èƒ½ã§ã™ã€‚ ã“ã®ã‚ªãƒ—ションã«ã‚ˆã‚‹æŒ‡å®šã¯ã€ HGMERGE 環境変数や\n"
+" 設定ファイルã«ã‚ˆã‚‹æŒ‡å®šã‚’上書ãã—ã¾ã™ã€‚ 以å‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å†…容ã¯ã€\n"
+" ``.orig`` æ‹¡å¼µå­ã®ãƒ•ã‚£ãƒ«ã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+" - :hg:`resolve -m [FILE]`: 指定ファイルをè¡çªè§£æ¶ˆæ¸ˆã¿ã¨ã¿ãªã—ã¾ã™\n"
+" (例: 手動ã§ã®ä¿®æ­£å¾Œã«å®Ÿæ–½)。 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ å…¨ã¦ã®æœªè§£æ¶ˆ\n"
+" ファイルを解消済ã¿ã¨ã¿ãªã—ã¾ã™ã€‚"
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+" - :hg:`resolve -u [FILE]...`: 指定ファイルをè¡çªæœªè§£æ¶ˆã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ å…¨ã¦ã®è§£æ¶ˆæ¸ˆã¿ãƒ•ã‚¡ã‚¤ãƒ«ã‚’未解消ã¨ã¿ãªã—ã¾ã™ã€‚"
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+" - :hg:`resolve -l`: è¡çªãŒæ¤œå‡ºã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã®è§£æ¶ˆçŠ¶æ³ã‚’表示ã—ã¾ã™ã€‚\n"
+" 一覧表示ã«ãŠã„㦠`U`` ã¯æœªè§£æ¶ˆ(Unresolved)ã‚’ã€\n"
+" ``R`` ã¯è§£æ¶ˆæ¸ˆã¿(Resolved)ã‚’æ„味ã—ã¾ã™ã€‚"
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+" è¡çªæœªè§£æ¶ˆã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹é–“ã¯ã‚³ãƒŸãƒƒãƒˆã§ãã¾ã›ã‚“。\n"
+" マージã«ãŠã‘ã‚‹è¡çªè§£æ¶ˆã®éš›ã«ã¯ã€ コミットå‰ã«\n"
+" :hg:`resolve -m ...` を実施ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠è¡çªè§£æ¶ˆå¤±æ•—ãŒã‚ã‚‹å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "too many options specified"
+msgstr "オプション指定ãŒéŽå‰°ã§ã™"
+
+msgid "can't specify --all and patterns"
+msgstr "--all ã¨ãƒ‘ターンã¯åŒæ™‚ã«æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr "å†ãƒžãƒ¼ã‚¸ã«ã¯ã€ ファイルï¼ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã€ --all を指定ã—ã¦ãã ã•ã„"
+
+msgid "revert all changes when no arguments given"
+msgstr "引数指定ãŒç„¡ã„å ´åˆã«ã€ 全ファイルã®å†…容を復旧"
+
+msgid "tipmost revision matching date"
+msgstr "当該日時ã®æœ€æ–°ãƒªãƒ“ジョンを使用"
+
+msgid "revert to the specified revision"
+msgstr "当該リビジョン時点ã®å†…容ã§å¾©æ—§"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[OPTION]... [-r REV] [NAME]..."
+
+msgid "restore files to their checkout state"
+msgstr "親リビジョンã®çŠ¶æ…‹ã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’復旧"
+
+msgid " .. note::"
+msgstr " .. note::"
+
+msgid ""
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" 作業領域を〠別リビジョン時点ã®å†…容ã§æ›´æ–°ã™ã‚‹å ´åˆã¯\n"
+" :hg:`update 対象リビジョン` を実行ã—ã¦ãã ã•ã„。\n"
+" マージ実施を途中ã§å–り消ã™å ´åˆã¯\n"
+" :hg:`update --clean .` を実行ã—ã¦ãã ã•ã„\n"
+" (マージã«ãŠã‘る修正内容ã¯ç ´æ£„ã•ã‚Œã¾ã™)。"
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" リビジョン指定ãŒç„¡ã„å ´åˆã¯ã€ \n"
+" 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ï¼ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョン時点ã®å†…容ã¸ã¨å¾©æ—§ã—ã¾ã™ã€‚\n"
+" 本コマンドã¯å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€ 状態を「改変無ã—ã€ã¨ã—ã€\n"
+" add/remove/copy/rename ã®å®Ÿæ–½äºˆå®šã‚’å–り消ã—ã¾ã™ã€‚\n"
+" 作業領域ãŒè¤‡æ•°ã®è¦ªãƒªãƒ“ジョンをæŒã¤å ´åˆã€\n"
+" ã„ãšã‚Œã‹ã®ãƒªãƒ“ジョンを明示的ã«æŒ‡å®šã—ã¦ä¸‹ã•ã„。"
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+" -r/--rev ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ï¼ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ã€\n"
+" 指定ã•ã‚ŒãŸãƒªãƒ“ジョン時点ã®å†…容ã¸ã¨å¾©æ—§ã—ã¾ã™ã€‚\n"
+" 以å‰ã®å¤‰æ›´å†…容ã®ä¸€éƒ¨ãªã„ã—全部を〠å–り消ã™ç”¨é€”ã«ã‚‚使用ã§ãã¾ã™ã€‚\n"
+" -d/--date ã§ã®æ—¥æ™‚表記㯠:hg:`help dates` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" 改変ファイルã®å¾©æ—§ã®éš›ã«ã¯ã€ 復旧å‰ã®å†…容㌠.orig æ‹¡å¼µå­ã‚’付ã‘ãŸ\n"
+" ファイルã«ä¿å­˜ã•ã‚Œã¾ã™ã€‚ ã“ã®ä¿å­˜ã¯ --no-backup ã§ç„¡åŠ¹åŒ–ã•ã‚Œã¾ã™ã€‚"
+
+msgid "you can't specify a revision and a date"
+msgstr "リビジョンã¨æ—¥æ™‚ã¯åŒæ™‚ã«ã¯æŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid "uncommitted merge with no revision specified"
+msgstr "マージãŒæœªã‚³ãƒŸãƒƒãƒˆãªä¸Šã«ã€å¯¾è±¡ãƒªãƒ“ジョンãŒæ˜Žç¤ºã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr "\"hg update\" 実施を検討ã™ã‚‹ã‹ã€\"hg help revert\" ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„"
+
+msgid "no files or directories specified"
+msgstr "ファイルï¼ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªæŒ‡å®šãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"マージãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™: 変更全破棄ãªã‚‰ --all 付ã実行ã€ãƒžãƒ¼ã‚¸å–ã‚Šã‚„ã‚ãªã‚‰ "
+"'hg update -C .' 実行"
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"変更ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™: 変更全破棄ãªã‚‰ --all 付ã実行ã€ä½œæ¥­é ˜åŸŸæ›´æ–°ãªã‚‰ 'hg "
+"update %s' 実行"
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+"全ファイル復旧ãªã‚‰ --all 付ã実行ã€ä½œæ¥­é ˜åŸŸæ›´æ–°ãªã‚‰ 'hg update %s' 実行"
+
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr "変更ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™ - 変更全破棄ãªã‚‰ --all 付ã実行"
+
+msgid "use --all to revert all files"
+msgstr "全ファイル復旧ãªã‚‰ --all 付ã実行"
+
+msgid "ignore safety measures"
+msgstr "安全判定を無視"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "ç›´å‰ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å·»ã戻ã—(è¦æ³¨æ„)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" 本コマンドã®ä½¿ç”¨ã«ã¯æ³¨æ„ã‚’è¦ã—ã¾ã™ã€‚ å·»ã戻ã—ã¯ï¼‘段階é™ã‚Šã§ã€ \n"
+" å·»ã戻ã—後ã®å†å®Ÿæ–½ã¯ã§ãã¾ã›ã‚“。 ç›´å‰ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³æ™‚点ã®ã€\n"
+" 作業領域状態ãŒå¾©å…ƒã•ã‚Œã€ ãã®æ™‚点以後ã®å¤‰æ›´ã¯å…¨ã¦å¤±ã‚ã‚Œã¾ã™ã€‚\n"
+" 但ã—〠作業領域ã®å†…容ã¯å¤‰æ›´ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository."
+msgstr ""
+" トランザクションã¨ã¯ã€ コマンド実行ã«ã‚ˆã‚‹ã€ æ–°è¦ãƒªãƒ“ジョンã®ä½œæˆã‚„ã€\n"
+" 外部ã‹ã‚‰ã®ãƒªãƒ“ジョンã®å–ã‚Šè¾¼ã¿ã¨ã„ã£ãŸã€ 改変æ“作を一括化ã™ã‚‹ã‚‚ã®ã§ã™ã€‚"
+
+msgid ""
+" For example, the following commands are transactional, and their\n"
+" effects can be rolled back:"
+msgstr ""
+" 例ãˆã°ã€ 以下ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã„ãšã‚Œã‚‚トランザクションを形æˆã™ã‚‹ãŸã‚ã€\n"
+" 本コマンドã«ã‚ˆã‚Šã€ ãã®åŠ¹æžœã‚’å·»ã戻ã—å¯èƒ½ã§ã™:"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (ç¾ãƒªãƒã‚¸ãƒˆãƒªãŒã€ å映対象ã¨ã—ã¦æŒ‡å®šã•ã‚ŒãŸå ´åˆ)\n"
+" - unbundle"
+
+msgid ""
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" データãŒæ°¸é ã«å¤±ã‚れるã®ã‚’回é¿ã™ã‚‹ãŸã‚〠コミットã®å·»ã戻ã—æ“作ã¯ã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョン以外ã«å¯¾ã—ã¦ã¯ã€ 失敗ã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚\n"
+" ã“ã®å›žé¿æŒ™å‹•ã¯ --force 指定ã«ã‚ˆã‚ŠæŠ‘æ­¢ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" 本コマンドã¯ã€ 公開リãƒã‚¸ãƒˆãƒªã§ã®å®Ÿè¡Œã‚’想定ã—ã¦ã„ã¾ã›ã‚“。 一旦他ã®\n"
+" ユーザã‹ã‚‰ :hg:`pull` å¯èƒ½ãªçŠ¶æ…‹ã«ãªã£ã¦ã—ã¾ã£ãŸãªã‚‰ã€ 公開リãƒã‚¸ãƒˆãƒª\n"
+" ã§ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’å·»ã戻ã—ã¦ã‚‚(æ—¢ã«ä»–ã®ãƒ¦ãƒ¼ã‚¶ãŒè¤‡è£½ã—ã¦ã„ã‚‹å¯èƒ½æ€§\n"
+" ãŒã‚ã‚‹ã®ã§)効果をæŒã¡ã¾ã›ã‚“。 ãã®ä¸Šã€ リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®æƒ…報読ã¿å–ã‚Šã«\n"
+" éš›ã—ã¦ã€ 競åˆãŒç™ºç”Ÿã—å¾—ã¾ã™ã€‚ 例ãˆã°ã€ 併走ã—ã¦ã„ã‚‹ :hg:`pull` 処ç†ãŒ\n"
+" å·»ã戻ã—ã«ã‚ˆã£ã¦å¤±æ•—ã—ã¦ã—ã¾ã†å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠巻ã戻ã›ã‚‹ãƒ‡ãƒ¼ã‚¿ãŒç„¡ã„å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "print the root (top) of the current working directory"
+msgstr "作業領域ã®ãƒ«ãƒ¼ãƒˆ(最上ä½)ディレクトリä½ç½®ã®è¡¨ç¤º"
+
+msgid " Print the root directory of the current repository."
+msgstr " ç¾ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä½ç½®ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid "name of access log file to write to"
+msgstr "アクセスログã®æ›¸ã出ã—先ファイル"
+
+msgid "name of error log file to write to"
+msgstr "エラーログã®æ›¸ã出ã—先ファイル"
+
+msgid "PORT"
+msgstr "ãƒãƒ¼ãƒˆç•ªå·"
+
+msgid "port to listen on (default: 8000)"
+msgstr "è¦æ±‚å—ã‘付ã‘ãƒãƒ¼ãƒˆç•ªå·(既定値: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "è¦æ±‚å—ã‘付ã‘アドレス(既定値: 全インタフェース)"
+
+msgid "ADDR"
+msgstr "アドレス"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "公開パス接頭辞(既定値: ルート)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr "表示å(既定値: 作業領域ã®ãƒ‘ス)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "hgweb 設定ファイルä½ç½®(\"hg help hgweb\" å‚ç…§)"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr "hgweb 設定ファイルä½ç½® (éžæŽ¨å¥¨)"
+
+msgid "for remote clients"
+msgstr "(ホスト間連æºã§ã®å†…部用途å‘ã‘)"
+
+msgid "web templates to use"
+msgstr "当該テンプレートã§è¡¨ç¤ºã‚’カスタマイズ"
+
+msgid "template style to use"
+msgstr "当該スタイルã§è¡¨ç¤ºã‚’カスタマイズ"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "IPv4 ã«åŠ ãˆã¦ IPv6 を使用"
+
+msgid "SSL certificate file"
+msgstr "SSL 証明書ファイル"
+
+msgid "start stand-alone webserver"
+msgstr "独立ã—ãŸã‚¦ã‚§ãƒ–サーãƒã®å®Ÿè¡Œé–‹å§‹"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+" リãƒã‚¸ãƒˆãƒªå‚照㨠:hg:`pull` ã®ãŸã‚ã® HTTP サーãƒã‚’èµ·å‹•ã—ã¾ã™ã€‚\n"
+" ã“ã® HTTP サーãƒã‚’用ã„ã‚‹ã“ã¨ã§ã€ リãƒã‚¸ãƒˆãƒªã®å…±æœ‰ï¼å‚照をã€\n"
+" å³å¸­ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™ã€‚ リãƒã‚¸ãƒˆãƒªã‚’長期間公開ã™ã‚‹éš›ã«ã¯ã€\n"
+" 通常ã®ã‚¦ã‚§ãƒ–サーãƒã®ä½¿ç”¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+" 本コマンドã§èµ·å‹•ã•ã‚Œã‚‹ã‚µãƒ¼ãƒã¯ã€ アクセス制御ãŒå®Ÿè£…ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+" 特ã«è¨­å®šãŒç„¡ã„å ´åˆã€ 誰もãŒãƒªãƒã‚¸ãƒˆãƒªã‚’å‚ç…§å¯èƒ½ã§ã€ 且ã¤ãƒªãƒã‚¸ãƒˆãƒªã¯\n"
+" 誰ã«ã‚‚æ›´æ–°ã§ããªã„状態ã«ã‚ã‚Šã¾ã™ã€‚ ``web.allow_push`` 設定を ``*``\n"
+" ã«è¨­å®šã™ã‚‹ã“ã¨ã§ã€ 誰もãŒãƒªãƒã‚¸ãƒˆãƒªã« :hg:`push` ã§ãã¾ã™ã€‚\n"
+" ユーザèªè¨¼ãŒå¿…è¦ãªå ´åˆã¯ã€ 通常ã®ã‚¦ã‚§ãƒ–サーãƒã‚’使用ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" 特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã€ サーãƒã¯ã‚¢ã‚¯ã‚»ã‚¹ãƒ­ã‚°ã‚’標準出力ã«ã€\n"
+" エラーを標準エラー出力ã«è¡¨ç¤ºã—ã¾ã™ã€‚ ログをファイルã«è¨˜éŒ²ã™ã‚‹å ´åˆã¯ã€\n"
+" -A/--accesslog ã‚„ -E/--errorlog ã§æŒ‡å®šã—ã¾ã™ã€‚"
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+" サーãƒã«ç©ºããƒãƒ¼ãƒˆç•ªå·ã®æ¤œå‡ºãŠã‚ˆã³ä½¿ç”¨ã‚’ã•ã›ã‚‹å ´åˆã€ ãƒãƒ¼ãƒˆç•ªå·ã«ã¯\n"
+" 0 を指定ã—ã¾ã™ã€‚ ã“ã®å ´åˆã€ 使用ã™ã‚‹ãƒãƒ¼ãƒˆç•ªå·ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚"
+
+msgid "cannot use --stdio with --cmdserver"
+msgstr "--stdio 㨠--cmdserver ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "http://%s%s/%s ã§å¾…ã¡å—ã‘開始(ãƒã‚¤ãƒ³ãƒ‰å…ˆã¯ %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr "ä¿¡é ¼ã§ããªã„設定項目も表示"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [NAME]..."
+
+msgid "show combined config settings from all hgrc files"
+msgstr "全設定ファイルã«ã‚ˆã‚‹æœ€çµ‚çš„ãªè¨­å®šå†…容ã®è¡¨ç¤º"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+" 引数指定ãŒç„¡ã„å ´åˆã€ å…¨ã¦ã®è¨­å®šé …ç›®ã«å¯¾ã—ã¦ã€ åå‰ã¨å€¤ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+" 'section.name' å½¢å¼ã«åˆè‡´ã™ã‚‹å¼•æ•°ã‚’1ã¤ã ã‘指定ã—ãŸå ´åˆã€ ãã®è¨­å®šé …ç›®\n"
+" 値ã®ã¿ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+" 複数ã®å¼•æ•°ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ãれらをセクションåã¨ã¿ãªã—〠該当ã™ã‚‹\n"
+" セクションã®è¨­å®šé …目を全ã¦è¡¨ç¤ºã—ã¾ã™ã€‚"
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+" --debug 指定ãŒã‚ã‚‹å ´åˆã€ 設定項目毎ã«è¨˜è¿°ä½ç½®(ファイルåã¨è¡Œç•ªå·)ãŒ\n"
+" 表示ã•ã‚Œã¾ã™ã€‚\n"
+" "
+
+msgid "only one config item permitted"
+msgstr "複数ã®è¨­å®šé …目指定ã¯ç„¡åŠ¹ã§ã™"
+
+msgid "show status of all files"
+msgstr "å…¨ã¦ã®çŠ¶æ…‹ã‚’表示"
+
+msgid "show only modified files"
+msgstr "変更ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "show only added files"
+msgstr "追加登録ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "show only removed files"
+msgstr "登録除外ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "show only deleted (but tracked) files"
+msgstr "削除ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«(登録除外ã¯æœªå®Ÿæ–½)を表示"
+
+msgid "show only files without changes"
+msgstr "変更ã®ç„¡ã„ファイルを表示"
+
+msgid "show only unknown (not tracked) files"
+msgstr "構æˆç®¡ç†å¯¾è±¡å¤–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "show only ignored files"
+msgstr "無視対象ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表示"
+
+msgid "show source of copied files"
+msgstr "複製元ファイルを表示"
+
+msgid "show difference from revision"
+msgstr "当該リビジョンã¨ã®å·®åˆ†ã§çŠ¶æ…‹ã‚’判定"
+
+msgid "list the changed files of a revision"
+msgstr "指定リビジョンã«ãŠã‘る更新ファイルã®ä¸€è¦§"
+
+msgid "show changed files in the working directory"
+msgstr "作業領域ã®ãƒ•ã‚¡ã‚¤ãƒ«æ“作状æ³ã®è¡¨ç¤º"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" 作業領域ã®ãƒ•ã‚¡ã‚¤ãƒ«çŠ¶æ…‹ã‚’表示ã—ã¾ã™ã€‚ åå‰(パターン)指定ã®ã‚ã‚‹å ´åˆã€\n"
+" ãã®åå‰ã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã¿ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ 変更無ã—(clean)ã€\n"
+" 無視(ignored)ãªã„ã—複製(copy)・改å(rename)ã®å…ƒãƒ•ã‚¡ã‚¤ãƒ«ã«é–¢ã—ã¦ã¯ã€\n"
+" ãã‚Œãžã‚Œ -c/--clean〠-i/--ignored ãªã„ã— -C/--copy ãŒæŒ‡å®šã•ã‚Œã‚‹ã‹ã€\n"
+" ã‚ã‚‹ã„㯠-A/--all ãŒæŒ‡å®šã•ã‚Œãªã„é™ã‚Šè¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。\n"
+" ã„ãšã‚Œã®è¡¨ç¤ºå¯¾è±¡é¸æŠžã‚ªãƒ—ションも指定ã•ã‚Œãªã„å ´åˆã€\n"
+" -m -a -r -d -u ãŒæŒ‡å®šã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã—ã¾ã™ã€‚"
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" -q/--quiet 指定ãŒã‚ã‚‹å ´åˆã€ -u/--unknown ãªã„ã— -i/--ignored\n"
+" ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•ã‚Œãªã„é™ã‚Šã€ 未登録ファイルã¯è¡¨ç¤ºã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note::\n"
+" 権é™è¨­å®šã®å¤‰æ›´ã‚„マージãŒè¡Œã‚ã‚ŒãŸå ´åˆã€ 差分表示ã‹ã‚‰æœŸå¾…ã•ã‚Œã‚‹\n"
+" çµæžœã¨ã¯ç•°ãªã‚‹çŠ¶æ…‹ãŒè¡¨ç¤ºã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" 標準的ãªå·®åˆ†å½¢å¼ã¯æ¨©é™å¤‰æ›´ã®æƒ…報をå«ã¿ã¾ã›ã‚“ã—ã€\n"
+" マージ実施リビジョンã«å¯¾ã—ã¦ã¯ã€ 一方ã®è¦ªãƒªãƒ“ジョンã¨ã®å·®åˆ†\n"
+" ã—ã‹è¡¨ç¤ºã—ãªã„ãŸã‚ã§ã™ã€‚"
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" 1ã¤ã®ãƒªãƒ“ジョンãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 比較元リビジョンã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚\n"
+" 2ã¤ã®ãƒªãƒ“ジョンãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 両リビジョン間ã§çŠ¶æ…‹ã‚’比較ã—ã¾ã™ã€‚\n"
+" --change 指定を使ã†ã“ã¨ã§ã€ 第1親ã‹ã‚‰å¤‰æ›´ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã‚’ç°¡å˜ã«\n"
+" 表示ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid " The codes used to show the status of files are::"
+msgstr " ファイルã®çŠ¶æ…‹ã‚’表ã™è¨˜å·ã¯ä»¥ä¸‹ã®é€šã‚Š::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = 改変有り(Modified)\n"
+" A = 追加登録予定(Added)\n"
+" R = 登録除外予定(Removed)\n"
+" C = 変更無ã—(Clean)\n"
+" ! = 構æˆç®¡ç†å¯¾è±¡ã«ã‚‚é–¢ã‚らãšä½œæ¥­é ˜åŸŸã«ãƒ•ã‚¡ã‚¤ãƒ«ãŒç„¡ã„(missing)\n"
+" ? = 構æˆç®¡ç†å¯¾è±¡å¤–(unknown)\n"
+" I = 無視(Ignored)\n"
+" = ç›´å‰ã«è¡¨ç¤ºã•ã‚Œã‚‹æ–°è¦ç™»éŒ²äºˆå®šãƒ•ã‚¡ã‚¤ãƒ«(A)ã®è¤‡è£½å…ƒ"
+
+msgid ""
+" - show changes in the working directory relative to a\n"
+" changeset::"
+msgstr " - 作業領域ã¨æŒ‡å®šãƒªãƒ“ジョンã¨ã®é–“ã§ã®çŠ¶æ…‹å¤‰æ›´ã‚’表示::"
+
+msgid " hg status --rev 9353"
+msgstr " hg status --rev 9353"
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr " - 指定リビジョンã«ãŠã‘る状態変更 (複製元å«ã‚€) を表示::"
+
+msgid " hg status --copies --change 9353"
+msgstr " hg status --copies --change 9353"
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr " - 追加登録ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã® NUL 区切り一覧ã®è¡¨ç¤º (xargs å‘ã‘)::"
+
+msgid " hg status -an0"
+msgstr " hg status -an0"
+
+msgid "check for push and pull"
+msgstr "push/pull 実施çµæžœã®ç¢ºèª"
+
+msgid "summarize working directory state"
+msgstr "作業領域状態ã®æ¦‚è¦è¡¨ç¤º"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+" 親リビジョン〠ブランãƒã€ 想定コミットçµæžœã‚„〠作業領域更新候補等をå«ã‚€\n"
+" 作業領域状態ã®æ¦‚è¦ã‚’表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+" --remote ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ default 連æºå…ˆã«å¯¾ã™ã‚‹å–ã‚Šè¾¼ã¿ï¼å映ã«\n"
+" é–¢ã™ã‚‹æ¦‚è¦ã‚‚表示ã—ã¾ã™ã€‚ ã“ã®å‡¦ç†ã«ã¯æ™‚é–“ã‚’è¦ã™ã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚"
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "親リビジョン : %d:%s "
+
+msgid " (empty repository)"
+msgstr " (空ã®ãƒªãƒã‚¸ãƒˆãƒª)"
+
+msgid " (no revision checked out)"
+msgstr " (作業領域ãŒæœªæ›´æ–°)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ブランム: %s\n"
+
+msgid "bookmarks:"
+msgstr "ブックマーク :"
+
+#, python-format
+msgid "%d modified"
+msgstr "変更ファイル数 %d"
+
+#, python-format
+msgid "%d added"
+msgstr "追加ファイル数 %d"
+
+#, python-format
+msgid "%d removed"
+msgstr "削除ファイル数 %d"
+
+#, python-format
+msgid "%d renamed"
+msgstr "改åファイル数 %d"
+
+#, python-format
+msgid "%d copied"
+msgstr "複製ファイル数 %d"
+
+#, python-format
+msgid "%d deleted"
+msgstr "ä¸åœ¨ãƒ•ã‚¡ã‚¤ãƒ«æ•° %d"
+
+#, python-format
+msgid "%d unknown"
+msgstr "未知ファイル %d"
+
+#, python-format
+msgid "%d ignored"
+msgstr "無視ファイル数 %d"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "è¡çªæœªè§£æ¶ˆãƒ•ã‚¡ã‚¤ãƒ« %d"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "副リãƒã‚¸ãƒˆãƒªæ•° %d"
+
+msgid " (merge)"
+msgstr " (マージ)"
+
+msgid " (new branch)"
+msgstr " (æ–°è¦ãƒ–ランãƒ)"
+
+msgid " (head closed)"
+msgstr " (閉鎖済ã¿)"
+
+msgid " (clean)"
+msgstr " (改変無ã—)"
+
+msgid " (new branch head)"
+msgstr " (æ–°è¦ãƒ–ランãƒãƒ˜ãƒƒãƒ‰)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "想定 commit çµæžœ: %s\n"
+
+msgid "update: (current)\n"
+msgstr "update 候補 : (ç¾è¡Œã®ã¾ã¾)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "update 候補 : %d ã®æ–°è¦ãƒªãƒ“ジョン(æ›´æ–°)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "update 候補 : %d ã®æ–°è¦ãƒªãƒ“ジョン〠%d ã®ãƒ–ランãƒãƒ˜ãƒƒãƒ‰(マージ)\n"
+
+msgid "1 or more incoming"
+msgstr "å–ã‚Šè¾¼ã¿å¯¾è±¡ãƒªãƒ“ジョン(incoming)ã‚ã‚Š"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d 個ã®å映候補リビジョン(outgoing)"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d 個ã®å–ã‚Šè¾¼ã¿å€™è£œãƒ–ックマーク(incoming)"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d 個ã®æ›´æ–°å€™è£œãƒ–ックマーク(outgoing)"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "想定連æºçµæžœ : %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "想定連æºçµæžœ : (åŒæœŸæ¸ˆã¿)\n"
+
+msgid "force tag"
+msgstr "タグ付ã‘ã®å¼·åˆ¶å®Ÿæ–½"
+
+msgid "make the tag local"
+msgstr "ローカルタグã¨ã—ã¦ä½œæˆ"
+
+msgid "revision to tag"
+msgstr "タグ付ã‘対象リビジョン"
+
+msgid "remove a tag"
+msgstr "ã‚¿ã‚°ã®å‰Šé™¤"
+
+msgid "use <text> as commit message"
+msgstr "指定文字列をコミットログã¨ã—ã¦ä½¿ç”¨"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr "ç¾ãƒªãƒ“ジョンãªã„ã—指定リビジョンã¸ã®ã‚¿ã‚°ã®ä»˜ä¸Ž"
+
+msgid " Name a particular revision using <name>."
+msgstr " 特定ã®ãƒªãƒ“ジョンã«ã€ 指定ã•ã‚ŒãŸåå‰ã‚’付ã‘ã¾ã™ã€‚"
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" ã‚¿ã‚°ã®ç”¨é€”ã¯ã€ リãƒã‚¸ãƒˆãƒªä¸­ã®ç‰¹å®šãƒªãƒ“ジョンã¸ã®åå‰ä»˜ã‘ã§ã‚ã‚Šã€\n"
+" リビジョン間ã§ã®æ¯”較や〠é‡è¦ãªãƒªãƒ“ジョンã®å‚ç…§ã€\n"
+" リリース時ã®åˆ†å²ç‚¹ã«å¯¾ã™ã‚‹ç›®å°ã€ ãªã©ã®ç”¨é€”ã«ä½¿ç”¨ã§ãã¾ã™ã€‚\n"
+" 既存タグã®æ”¹å¤‰ã¯ã€ 通常ã§ã¯ã§ãã¾ã›ã‚“。 -f/--force ã®æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" 対象リビジョンãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 作業領域ã®è¦ªãƒªãƒ“ジョンãŒ\n"
+" (作業領域更新å‰ãªã‚‰ tip ãŒ) タグ付ã‘ã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" 分散構æˆç®¡ç†ã«ãŠã‘るタグ付ã‘ã®é›†ç´„を容易ã«ã™ã‚‹ãŸã‚ã«ã€\n"
+" 構æˆç®¡ç†ä¸‹ã«ã‚ã‚‹ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨åŒæ§˜ã«ã€\n"
+" ã‚¿ã‚°ã®æƒ…報㯠\".hgtags\" ファイルã§ç®¡ç†ã•ã‚Œã€\n"
+" å¿…è¦ã§ã‚ã‚Œã°æ‰‹å‹•ã§ã®ç·¨é›†ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+" ã“ã‚Œã¯ã€ タグ付ã‘æ“作ãŒã€ コミット処ç†ã‚’ä¼´ã†ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" ローカルタグ㯠'.hg/localtags' ã§ç®¡ç†ã•ã‚Œã¾ã™\n"
+" (リãƒã‚¸ãƒˆãƒªé–“ã§å…±æœ‰ã•ã‚Œã‚‹ã“ã¨ã¯ã‚ã‚Šã¾ã›ã‚“)"
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+" タグ付ã‘æ“作ã¯ã€ ブランãƒã®ãƒ˜ãƒƒãƒ‰ã«ãŠã„ã¦å®Ÿæ–½ã•ã‚Œã‚‹ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョンãŒã€ ブランãƒã®ãƒ˜ãƒƒãƒ‰ã§ã¯ç„¡ã„å ´åˆã€\n"
+" :hg:`tag` 実行ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" ヘッド以外ã®ãƒªãƒ“ジョンã«ãŠã„ã¦ã€ タグ付ã‘を実施ã™ã‚‹å ´åˆã¯ã€\n"
+" -f/--force を指定ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+" リビジョン特定ã«ãŠã„ã¦ã€ ã‚¿ã‚°åã¯ãƒ–ランãƒåよりも優先度ãŒé«˜ã„ã®ã§ã€\n"
+" 既存ブランãƒã¨åŒåã®ã‚¿ã‚°ã®ä½¿ç”¨ã¯æ­¢ã‚ã¾ã—ょã†ã€‚"
+
+msgid "tag names must be unique"
+msgstr "ã‚¿ã‚°åãŒé‡è¤‡ã—ã¦ã„ã¾ã™"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "空白文字ã ã‘ã§æ§‹æˆã•ã‚ŒãŸã‚¿ã‚°åã¯ä¸æ­£ã§ã™"
+
+msgid "--rev and --remove are incompatible"
+msgstr "--rev 㨠--remove ã¯åŒæ™‚ã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "ã‚¿ã‚° '%s' ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "ã‚¿ã‚° '%s' ã¯ã‚°ãƒ­ãƒ¼ãƒãƒ«ãªã‚¿ã‚°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "ã‚¿ã‚° '%s' ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãªã‚¿ã‚°ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "ã‚¿ã‚° '%s' ã¯å­˜åœ¨ã—ã¾ã™(強制実行ã™ã‚‹å ´åˆã¯ -f を指定ã—ã¦ãã ã•ã„)"
+
+msgid "uncommitted merge"
+msgstr "マージãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "親リビジョンãŒãƒ–ランãƒã®ãƒ˜ãƒƒãƒ‰ã§ã¯ã‚ã‚Šã¾ã›ã‚“(強制実行㯠-f 指定)"
+
+msgid "null revision specified"
+msgstr "null リビジョンãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "list repository tags"
+msgstr "リãƒã‚¸ãƒˆãƒªä¸­ã®ã‚¿ã‚°ä¸€è¦§ã®è¡¨ç¤º"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" 本コマンドã¯ã€ 通常ã®ã‚¿ã‚°ãŠã‚ˆã³ãƒ­ãƒ¼ã‚«ãƒ«ã‚¿ã‚°ã®ä¸¡æ–¹ã‚’一覧表示ã—ã¾ã™ã€‚\n"
+" -v/--verbose ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ローカルタグã«ã¯ \"local\" 表示ã®\n"
+" 第3ã®ã‚«ãƒ©ãƒ ãŒè¿½åŠ ã•ã‚Œã¾ã™ã€‚"
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr "tip リビジョンã®è¡¨ç¤º"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" tip リビジョン(一般ã«ã¯å˜ã« tip ã¨è¡¨è¨˜)ã¨ã¯ã€ リãƒã‚¸ãƒˆãƒªãŠã„ã¦æœ€ã‚‚\n"
+" æ–°ã—ã追加ã•ã‚ŒãŸãƒªãƒ“ジョンã§ã‚ã‚‹ã¨åŒæ™‚ã«ã€ 最も新ã—ã変更ã•ã‚ŒãŸãƒ˜ãƒƒãƒ‰\n"
+" ã®ã“ã¨ã§ã‚‚ã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" コミットã—ãŸç›´å¾Œã§ã‚ã‚Œã°ã€ 生æˆã•ã‚ŒãŸãƒªãƒ“ジョン㌠tip ã¨ãªã‚Šã¾ã™ã€‚\n"
+" ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰å¤‰æ›´å±¥æ­´ã®å–ã‚Šè¾¼ã¿ã‚’ã—ãŸç›´å¾Œã§ã‚ã‚Œã°ã€ 連æºå…ˆ\n"
+" リãƒã‚¸ãƒˆãƒªã§ã® tip ãŒç¾ãƒªãƒã‚¸ãƒˆãƒªã® tip ã¨ãªã‚Šã¾ã™ã€‚ \"tip\" ã‚¿ã‚°ã¯\n"
+" 特別ãªã‚¿ã‚°ã§ã€ 改åや〠他ã®ãƒªãƒ“ジョンã¸ã®ä»˜ã‘替ãˆã¯ã§ãã¾ã›ã‚“。"
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr "æ–°è¦å–ã‚Šè¾¼ã¿ã®éš›ã¯ã€ æ–°è¦ãƒ–ランãƒãƒ˜ãƒƒãƒ‰ã§ã€ 作業領域を更新"
+
+msgid "[-u] FILE..."
+msgstr "[-u] FILE..."
+
+msgid "apply one or more changegroup files"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã®é©ç”¨"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr " :hg:`bundle` コマンドã§ç”Ÿæˆã•ã‚ŒãŸãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é©ç”¨ã—ã¾ã™ã€‚"
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+" æˆåŠŸæ™‚ã®ã‚³ãƒžãƒ³ãƒ‰çµ‚了値㯠0〠è¡çªæœªè§£æ¶ˆãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚ã‚‹å ´åˆã¯ 1 ã§ã™ã€‚\n"
+" "
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "未コミット変更内容ã®ç ´æ£„(ä¿å­˜ç„¡ã—)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "未コミット変更ãŒç„¡ã„å ´åˆã€ ブランãƒæ¨ªæ–­ã§ã‚‚更新を実施ã—ã¾ã™"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATE] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "作業領域ã®å†…容更新(ãªã„ã—リビジョンã®åˆ‡ã‚Šæ›¿ãˆ)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch and move the current bookmark (see :hg:`help\n"
+" bookmarks`)."
+msgstr ""
+" 指定ã•ã‚ŒãŸãƒªãƒ“ジョン時点ã®å†…容ã§ã€ 作業領域を更新ã—ã¾ã™ã€‚\n"
+" 対象リビジョンãŒæŒ‡å®šã•ã‚Œãªã„å ´åˆã€ 作業領域ã¨åŒã˜åå‰ä»˜ãブランãƒã®ã€\n"
+" 最新リビジョンã§æ›´æ–°ã—ãŸä¸Šã§ã€ ブックマークã®æ›´æ–°ã‚’è¡Œã„ã¾ã™ã€‚\n"
+" (詳細㯠:hg:`help bookmarks` å‚ç…§)"
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+" 作業領域ã®è¦ªãƒªãƒ“ジョンを〠指定ã•ã‚ŒãŸãƒªãƒ“ジョンã«æ›´æ–°ã—ã¾ã™\n"
+" (:hg:`help parents` å‚ç…§)。"
+
+msgid ""
+" If the changeset is not a descendant or ancestor of the working\n"
+" directory's parent, the update is aborted. With the -c/--check\n"
+" option, the working directory is checked for uncommitted changes; if\n"
+" none are found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+" 指定リビジョンãŒã€ 作業領域ã®ç¥–å…ˆï¼ç›´ç³»ã®å­å­«ã®ã„ãšã‚Œã§ã‚‚ã§ãªã„å ´åˆã€\n"
+" 作業領域ã®æ›´æ–°ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚ -c/--check ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 作業領域中ã®æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ã®æœ‰ç„¡ã‚’確èªã—〠変更ãŒç„¡ã‹ã£ãŸå ´åˆã«ã¯ã€\n"
+" 作業領域を指定リビジョンã§æ›´æ–°ã—ã¾ã™ã€‚"
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr " 作業領域ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã®å ´åˆã€ 以下ã®è¦å‰‡ãŒé©ç”¨ã•ã‚Œã¾ã™:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. -c/--check ã‚‚ -C/--clean も指定ã•ã‚Œãšã€ 指定リビジョンãŒã€\n"
+" 作業領域ã®è¦ªãƒªãƒ“ジョンã®ã€ ç›´ç³»ã®ç¥–å…ˆãªã„ã—å­å­«ã§ã‚ã£ãŸå ´åˆã€\n"
+" 未コミット変更ã®å†…容ã¯ã€ 指定リビジョンã¸ã¨ãƒžãƒ¼ã‚¸ã•ã‚Œã€\n"
+" マージçµæžœã¯ã€ 未コミットã®ã¾ã¾ä½œæ¥­é ˜åŸŸã«æ®‹ã‚Šã¾ã™ã€‚\n"
+" 別㮠(åå‰ç„¡ã—) ブランãƒä¸Šã«ã‚るリビジョンãªã©ã€\n"
+" ç›´ç³»ã®ç¥–å…ˆï¼å­å­«ä»¥å¤–ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" æ›´æ–°ã¯ä¸­æ–­ã•ã‚Œã€ 未コミット変更ã¯ã€ 作業領域ã«æ®‹ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. -c/--check ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ æ›´æ–°ã¯ä¸­æ–­ã•ã‚Œã€\n"
+" 未コミット変更ã¯ã€ 作業領域ã«æ®‹ã‚Šã¾ã™ã€‚"
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. -C/--clean ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ 未コミット変更ã¯ç ´æ£„ã•ã‚Œã€\n"
+" 作業領域ã¯æŒ‡å®šã®ãƒªãƒ“ジョンã§æ›´æ–°ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" マージ実施を途中ã§å–り消ã™å ´åˆã¯\n"
+" :hg:`update --clean .` を実行ã—ã¦ãã ã•ã„\n"
+" (マージã«ãŠã‘る修正内容ã¯ç ´æ£„ã•ã‚Œã¾ã™)。"
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" 作業領域中ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã™ã‚‹å ´åˆã¯ã€ リビジョン㫠null を指定ã—ã¾ã™\n"
+" (:hg:`clone -U` ã¨åŒç­‰)。"
+
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" 特定ã®ãƒ•ã‚¡ã‚¤ãƒ«ã ã‘を以å‰ã®çŠ¶æ…‹ã«æˆ»ã™å ´åˆã¯ã€\n"
+" :hg:`revert [-r リビジョン] ファイルå` を使用ã—ã¦ãã ã•ã„。"
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "-c/--check 㨠-C/--clean ã¯ä½µç”¨ã§ãã¾ã›ã‚“"
+
+msgid "verify the integrity of the repository"
+msgstr "リãƒã‚¸ãƒˆãƒªã®æ•´åˆæ€§æ¤œè¨¼"
+
+msgid " Verify the integrity of the current repository."
+msgstr " ç¾ãƒªãƒã‚¸ãƒˆãƒªã®æ•´åˆæ€§ã‚’検証ã—ã¾ã™ã€‚"
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" 本コマンドã¯ã€ リãƒã‚¸ãƒˆãƒªã®æ•´åˆæ€§ã«é–¢ã™ã‚‹åºƒç¯„ãªæ¤œè¨¼ã‚’è¡Œã„ã¾ã™ã€‚\n"
+" 変更履歴・マニフェスト・å„構æˆç®¡ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã‘ã‚‹ãƒãƒƒã‚·ãƒ¥å€¤\n"
+" ãŠã‚ˆã³ãƒã‚§ãƒƒã‚¯ã‚µãƒ ã€ 相互関連付ã‘ãŠã‚ˆã³ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ç­‰ã®æ•´åˆæ€§ãŒ\n"
+" 検証ã•ã‚Œã¾ã™ã€‚"
+
+msgid "output version and copyright information"
+msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŠã‚ˆã³è‘—作権情報ã®è¡¨ç¤º"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Mercurial - 分散構æˆç®¡ç†ãƒ„ール(ãƒãƒ¼ã‚¸ãƒ§ãƒ³ %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(詳細㯠http://mercurial.selenic.com ã‚’å‚ç…§ã—ã¦ãã ã•ã„)"
+
+msgid ""
+"Copyright (C) 2005-2012 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2012 Matt Mackall ä»–\n"
+"本製å“ã¯ãƒ•ãƒªãƒ¼ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã§ã™ã€‚\n"
+"頒布æ¡ä»¶ã«é–¢ã—ã¦ã¯åŒæ¢±ã•ã‚Œã‚‹ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡é …ã‚’ãŠèª­ã¿ãã ã•ã„。\n"
+"市場é©åˆæ€§ã‚„特定用途ã¸ã®å¯å¦ã‚’å«ã‚〠本製å“ã¯ç„¡ä¿è¨¼ã§ã™ã€‚\n"
+
+#, python-format
+msgid "unknown mode %s"
+msgstr "未知ã®ãƒ¢ãƒ¼ãƒ‰ %s"
+
+#, python-format
+msgid "unknown command %s"
+msgstr "未知ã®ã‚³ãƒžãƒ³ãƒ‰ %s"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "%s を読ã¿è¾¼ã‚ã¾ã›ã‚“(%s)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "作業領域ã®è¦ª '%s' ãŒæœªçŸ¥ã®ãƒªãƒ“ジョンã§ã™!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "'%s' ã¯æœªçŸ¥ã®ãƒªãƒ“ジョンã§ã™"
+
+msgid "not found in manifest"
+msgstr "マニフェストã«ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "リビジョン %s ã«å½“該ファイルã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+msgid "branch name not in UTF-8!"
+msgstr "ブランãƒå㌠UTF-8 ã§ã¯ã‚ã‚Šã¾ã›ã‚“!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s ã¯ã‚ã‚Šã¾ã›ã‚“!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+"%s: 指定ファイルã®ç®¡ç†ã«ã¯ %d MBを超ãˆã‚‹ãƒ¡ãƒ¢ãƒªãŒå¿…è¦ã§ã™\n"
+"(ファイルã®ç™»éŒ²ã‚’解除ã™ã‚‹ã«ã¯ 'hg revert %s')\n"
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr "%s ã¯è¿½åŠ ç™»éŒ²ã•ã‚Œã¾ã›ã‚“: ファイルã¨ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã®ã¿ç™»éŒ²å¯èƒ½\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s ã¯ç™»éŒ²æ¸ˆã§ã™!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s ã¯ç®¡ç†ã•ã‚Œã¦ã„ã¾ã›ã‚“!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr "コピー失敗: %s ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã§ã‚‚シンボリックリンクã§ã‚‚ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "dag 記述ã«ä¸æ­£ãªæ–‡å­—ãŒä½¿ã‚ã‚Œã¦ã„ã¾ã™: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr "想定 id %i ã«å¯¾ã—㦠%i ãŒæ¤œå‡º"
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr "親 id %i ãŒç¾ id %i よりも大ãã„ã§ã™"
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr "dag イベント種別ãŒä¸æ­£ã§ã™: %s"
+
+msgid "nullid"
+msgstr "nullid"
+
+msgid "working directory state appears damaged!"
+msgstr "作業領域ã®çŠ¶æ…‹ç®¡ç†ã«å•é¡ŒãŒã‚ã‚Šã¾ã™!"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "ディレクトリ %r ã¯æ—¢ã«ç®¡ç†å¯¾è±¡ã«å«ã¾ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr "管ç†æƒ…報中ã®ãƒ•ã‚¡ã‚¤ãƒ« %r 㯠%r ã«ã‚ˆã£ã¦ç ´å£Šã•ã‚Œã¾ã™"
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr "%r ã®åˆ¥è¦ªã¸ã®è¨­å®šã¯ãƒžãƒ¼ã‚¸ã§ã®ã¿å¯èƒ½ã§ã™"
+
+msgid "unknown"
+msgstr "未知"
+
+msgid "character device"
+msgstr "キャラクタデãƒã‚¤ã‚¹"
+
+msgid "block device"
+msgstr "ブロックデãƒã‚¤ã‚¹"
+
+msgid "fifo"
+msgstr "FIFO(パイプ)"
+
+msgid "socket"
+msgstr "ソケット"
+
+msgid "directory"
+msgstr "ディレクトリ"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "未サãƒãƒ¼ãƒˆã®ãƒ•ã‚¡ã‚¤ãƒ«ç¨®åˆ¥(%s)"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "連æºå…ˆã«æ–°ã—ã„ブランãƒãŒä½œæˆã•ã‚Œã¾ã™: %s!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "連æºå…ˆã¸ã®æ–°è¦ãƒ–ランãƒä½œæˆã¯ 'hg push --new-branch'"
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "æ–°ã—ã„ヘッド %s ãŒé€£æºå…ˆã®ãƒ–ランム'%s' ã«ä½œæˆã•ã‚Œã¾ã™!"
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr "æ–°ã—ã„ヘッド %s ãŒé€£æºå…ˆã«ä½œæˆã•ã‚Œã¾ã™!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr "pull 㨠merge を実施ã™ã‚‹ã‹ã€ push -f ã§å¼·åˆ¶å®Ÿè¡Œã—ã¦ãã ã•ã„"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "マージã¯æ¸ˆã‚“ã§ã„ã¾ã™ã‹ï¼Ÿ push -f ã§å¼·åˆ¶å®Ÿè¡Œã§ãã¾ã™"
+
+#, python-format
+msgid "new remote heads on branch '%s'\n"
+msgstr "æ–°ã—ã„ヘッドãŒé€£æºå…ˆã®ãƒ–ランム'%s' ã«ä½œæˆã•ã‚Œã¾ã™\n"
+
+#, python-format
+msgid "new remote head %s\n"
+msgstr "æ–°ã—ã„ヘッド %s ãŒé€£æºå…ˆã«ä½œæˆã•ã‚Œã¾ã™\n"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "注æ„: 連æºå…ˆã§ã®å¤‰æ›´ç‚¹ãŒå–ã‚Šè¾¼ã¾ã‚Œã¦ã„ã¾ã›ã‚“!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "中断: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr "(%s)\n"
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: %s ã§ã®è§£æžã‚¨ãƒ©ãƒ¼: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: 解æžã‚¨ãƒ©ãƒ¼: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr "デãƒãƒƒã‚¬å‹•ä½œé–‹å§‹ - 継続ãªã‚‰ c 〠ヘルプãªã‚‰ h を入力ã—ã¦ãã ã•ã„\n"
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: コマンド指定 '%s' ã¯æ›–昧ã§ã™:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "%s ã®ãƒ­ãƒƒã‚¯è§£æ”¾å¾…ã¡ã‚’断念"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "%s ã«ã‚ˆã‚‹ãƒ­ãƒƒã‚¯ä¿æŒ"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "中断: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "中断: %s ã®ãƒ­ãƒƒã‚¯ã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+msgid "abort: remote error:\n"
+msgstr "中断: 連æºã‚¨ãƒ©ãƒ¼:\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "中断: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "中断: %s"
+
+msgid " empty string\n"
+msgstr " 空文字列\n"
+
+msgid "killed!\n"
+msgstr "強制終了ã•ã‚Œã¾ã—ãŸ!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: 未知ã®ã‚³ãƒžãƒ³ãƒ‰ '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(エクステンションã®ã‚³ãƒ³ãƒ‘イルを忘れã¦ã„ã¾ã›ã‚“ã‹ï¼Ÿ)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(Python ã¯æ­£ã—ãインストールã•ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "中断: エラー: %s\n"
+
+msgid "broken pipe\n"
+msgstr "パイプ破壊(EPIPE)\n"
+
+msgid "interrupted!\n"
+msgstr "中断ã•ã‚Œã¾ã—ãŸ!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"パイプ破壊(EPIPE)\n"
+
+msgid "abort: out of memory\n"
+msgstr "中断: メモリä¸è¶³\n"
+
+msgid "the extension author."
+msgstr "エクステンションã®ä½œè€…"
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension "
+"%s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+"** éžåŒæ¢±ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ %s ã«èµ·å› ã™ã‚‹ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚\n"
+"** 当該エクステンションã®ã‚µãƒãƒ¼ãƒˆå¯¾è±¡ Mercurial ã®ç‰ˆ: %s\n"
+"** エクステンション %s を無効化ã—ã¦ã‹ã‚‰ã€å†åº¦åŒã˜å‡¦ç†ã‚’実行ã—ã¦ãã ã•ã„。\n"
+"** å•é¡ŒãŒæ”¹å–„ã•ã‚ŒãŸå ´åˆã€ 障害ã®ç™ºç”Ÿã‚’ %s ã«å ±å‘Šã—ã¦ãã ã•ã„。\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr "** 予期ã›ã¬ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚以下㮠URL ã‹ã‚‰éšœå®³å ±å‘Šã—ã¦ãã ã•ã„\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial Distributed SCM (version %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Extensions loaded: %s\n"
+
+msgid "too few arguments for command alias"
+msgstr "別å(エイリアス)ã¸ã®å¼•æ•°ãŒè¶³ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr "'%s' を別åã«æŒã¤ã‚³ãƒžãƒ³ãƒ‰ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr "別å定義 '%s' ã®ã‚¨ãƒ©ãƒ¼: %s ã¯ã‚³ãƒžãƒ³ãƒ‰è¡Œã§ã®ç›´æŽ¥æŒ‡å®šé™å®šã§ã™\n"
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "'%s' ãŒæœªçŸ¥ã®ã‚³ãƒžãƒ³ãƒ‰ '%s' ã®åˆ¥åã¨ã¿ãªã•ã‚Œã¾ã—ãŸ\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "'%s' ãŒæ›–昧ãªã‚³ãƒžãƒ³ãƒ‰ '%s' ã®åˆ¥åã¨ã¿ãªã•ã‚Œã¾ã—ãŸ\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr "ä¸æ­£ãª --config 指定: %r (有効ãªå½¢å¼ã¯ --config section.name=value)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä½ç½®ã®å–å¾—ã«å¤±æ•—: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "エクステンション '%s' ãŒã‚³ãƒžãƒ³ãƒ‰ã‚’上書ãã—ã¾ã™: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "--config 指定値ãŒçœç•¥ã•ã‚Œãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "--cwd 指定値ãŒçœç•¥ã•ã‚Œãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™!"
+
+msgid ""
+"option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr "-R ã¯å˜ç‹¬è¨˜è¿°(例: '-dR' ã¯ä¸å¯)〠--repository ã®ç•¥è¨˜ã¯ --repo ã®ã¿"
+
+#, python-format
+msgid "time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr "所è¦æ™‚é–“: 実時間 %.3f 秒 (ユーザ %.3f+%.3f システム %.3f+%.3f)\n"
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "リãƒã‚¸ãƒˆãƒª '%s' ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "'%s' é…下ã«ã¯ãƒªãƒã‚¸ãƒˆãƒªãŒã‚ã‚Šã¾ã›ã‚“ (.hg ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“)"
+
+msgid "warning: --repository ignored\n"
+msgstr "警告: --repository 指定を無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr "ä¸æ­£ãªãƒ—ãƒ­ãƒ•ã‚¡ã‚¤ãƒ«å½¢å¼ '%s' を無視ã—ã¾ã™\n"
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+"lsprof ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“ - http://codespeak.net/svn/user/arigo/hack/misc/"
+"lsprof/ã‹ã‚‰ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„"
+
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr ""
+"statprof ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“ - \"easy_install statprof\"ã§ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•"
+"ã„"
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr "ä¸æ­£ãªã‚µãƒ³ãƒ—リング周期頻度 '%s' を無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "ä¸æ­£ãªãƒ—ロファイラ指定 '%s' を無視ã—ã¾ã™\n"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** %s ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•— (%s): %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** %s ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "警告: ファイル %s ã§ã®ã‚³ãƒžãƒ³ãƒ‰è§£æžä¸­ã«ã‚¨ãƒ©ãƒ¼ç™ºç”Ÿ\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "マージツール %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "ツール %s ã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚’扱ãˆã¾ã›ã‚“\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "ツール %s ã¯ãƒã‚¤ãƒŠãƒªã‚’扱ãˆã¾ã›ã‚“\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "ツール %s 㯠GUI ãŒå¿…è¦ã§ã™\n"
+
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+"``internal:prompt``\n"
+"作業領域å´ã¨ãƒžãƒ¼ã‚¸å¯¾è±¡ãƒªãƒ“ジョンå´ã®ã©ã¡ã‚‰ã‚’ã€\n"
+" マージçµæžœã¨ã—ã¦æŽ¡ç”¨ã™ã‚‹ã‹ã€ 対話的ã«ç¢ºèªã—ã¾ã™ã€‚"
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" %s ã®ãƒžãƒ¼ã‚¸ã«é©åˆ‡ãªãƒ„ールãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+"ã©ã¡ã‚‰ã®å†…容を採用ã—ã¾ã™ã‹ï¼Ÿ 作業領域:(l)ocal マージ対象:(o)ther"
+
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+"``internal:local``\n"
+"マージçµæžœã¨ã—ã¦ã€ 作業領域å´ã®å†…容を採用ã—ã¾ã™ã€‚"
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+"``internal:other``\n"
+"マージçµæžœã¨ã—ã¦ã€ マージ対象リビジョンå´ã®å†…容を採用ã—ã¾ã™ã€‚"
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+"``internal:fail``\n"
+"変更内容ã«é–¢ã™ã‚‹ãƒžãƒ¼ã‚¸å‡¦ç†ã¯å®Ÿæ–½ã›ãšã€ å¿…ãšãƒžãƒ¼ã‚¸å¤±æ•—ã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" マージ失敗ã¨ã¿ãªã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã¯ã€\n"
+" :hg:`resolve` ã«ã‚ˆã‚‹æ‰‹å‹•ã§ã®è¡çªè§£æ¶ˆãŒå¿…è¦ã§ã™ã€‚"
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr "%s.premerge ã¯ç„¡åŠ¹ã§ã™('%s' ã¯çœŸå½ãªã„ã— %s ã®ã„ãšã‚Œã§ã‚‚ã‚ã‚Šã¾ã›ã‚“)"
+
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+"``internal:merge``\n"
+"éžå¯¾è©±çš„ãªã€ å˜ç´”ãªãƒžãƒ¼ã‚¸å‡¦ç†ã‚’実施ã—ã¾ã™ã€‚\n"
+" è¡çªãŒã‚ã£ãŸå ´åˆã€ マージ処ç†ã¯å¤±æ•—ã¨ã¿ãªã•ã‚Œã¾ã™ãŒã€\n"
+" マージçµæžœãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯ã€ è¡çªãƒžãƒ¼ã‚¯ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚"
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr "%s ã®ãƒžãƒ¼ã‚¸ã¯ä¸å®Œå…¨ã§ã™ (è¡çªè§£æ¶ˆå¾Œã« 'hg resolve --mark' ãŒå¿…è¦)\n"
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+"``internal:dump``\n"
+"作業領域å´ã€ マージ対象リビジョンå´ã€ ãŠã‚ˆã³å…±é€šç¥–先時点ã®ã€\n"
+" ãã‚Œãžã‚Œã®å†…容をæŒã¤3ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã—ã¾ã™ã€‚\n"
+" ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€äº‹å¾Œã®æ‰‹å‹•ãƒžãƒ¼ã‚¸ç­‰ã§ä½¿ç”¨ã—ã¦ãã ã•ã„。\n"
+" 対象ファイルå㌠``a.txt`` ã§ã‚ã£ãŸå ´åˆã€\n"
+" 生æˆã•ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ãã‚Œãžã‚Œ ``a.txt.local``〠``a.txt.other``\n"
+" ãŠã‚ˆã³ ``a.txt.base`` ã¨å‘½åã•ã‚Œã€\n"
+" ``a.txt`` ã¨åŒã˜ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«æ ¼ç´ã•ã‚Œã¾ã™ã€‚"
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "%s ã®ãƒžãƒ¼ã‚¸ã«å¤±æ•—!\n"
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr "'%s' ã®ãƒžãƒ¼ã‚¸ã¯æˆåŠŸã—ã¾ã—ãŸã‹ï¼Ÿ (y/n) "
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+" マージçµæžœãƒ•ã‚¡ã‚¤ãƒ« %s ã¯æœªå¤‰æ›´ã«è¦‹ãˆã¾ã™\n"
+"マージæˆåŠŸã¨ã¿ãªã—ã¾ã™ã‹ï¼Ÿ (y/n)"
+
+msgid "unterminated string"
+msgstr "文字列ãŒçµ‚端ã—ã¦ã„ã¾ã›ã‚“"
+
+msgid "syntax error"
+msgstr "文法エラー"
+
+msgid "missing argument"
+msgstr "引数ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "can't use a list in this context"
+msgstr "ã“ã“ã§ã¯ãƒªã‚¹ãƒˆã‚’使用ã§ãã¾ã›ã‚“"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+"``modified()``\n"
+" 更新ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "modified" is a keyword
+msgid "modified takes no arguments"
+msgstr "modified ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+"``added()``\n"
+" 追加ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "added" is a keyword
+msgid "added takes no arguments"
+msgstr "added ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+"``removed()``\n"
+" 登録除外ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "removed" is a keyword
+msgid "removed takes no arguments"
+msgstr "removed ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+"``deleted()``\n"
+" ä¸åœ¨ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "deleted" is a keyword
+msgid "deleted takes no arguments"
+msgstr "deleted ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``unknown()``\n"
+" 未知ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã€‚\n"
+" 本述語ãŒæŒ‡å®šã•ã‚ŒãŸæ™‚ã®ã¿ã€\n"
+" 未知ファイル㌠Mercurial ã®å–り扱ã„対象ã«ãªã‚Šã¾ã™ã€‚"
+
+#. i18n: "unknown" is a keyword
+msgid "unknown takes no arguments"
+msgstr "unknown ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``ignored()``\n"
+" 無視ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã€‚\n"
+" 本述語ãŒæŒ‡å®šã•ã‚ŒãŸæ™‚ã®ã¿ã€\n"
+" 無視対象ファイル㌠Mercurial ã®å–り扱ã„対象ã«ãªã‚Šã¾ã™ã€‚"
+
+#. i18n: "ignored" is a keyword
+msgid "ignored takes no arguments"
+msgstr "ignored ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+"``clean()``\n"
+" 変更無ã—ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "clean" is a keyword
+msgid "clean takes no arguments"
+msgstr "clean ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "関数ã§ã¯ã‚ã‚Šã¾ã›ã‚“: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+"``binary()``\n"
+" ãƒã‚¤ãƒŠãƒªã¨æ€ã‚れるファイル (NUL ãƒã‚¤ãƒˆã‚’å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«)"
+
+#. i18n: "binary" is a keyword
+msgid "binary takes no arguments"
+msgstr "binary ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+"``exec()``\n"
+" 実行å¯èƒ½ãƒ“ットãŒç«‹ã£ã¦ã„るファイル"
+
+#. i18n: "exec" is a keyword
+msgid "exec takes no arguments"
+msgstr "exec ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+"``symlink()``\n"
+" シンボリックリンクã¨ã¿ãªã•ã‚Œã¦ã„るファイル"
+
+#. i18n: "symlink" is a keyword
+msgid "symlink takes no arguments"
+msgstr "symlink ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+"``resolved()``\n"
+" マージステータスãŒè§£æ¶ˆæ¸ˆã¿ã®ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#. i18n: "resolved" is a keyword
+msgid "resolved takes no arguments"
+msgstr "resolved ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+"``unresolved()``\n"
+" マージステータスãŒæœªè§£æ¶ˆã®ãƒ•ã‚¡ã‚¤ãƒ«"
+
+#. i18n: "unresolved" is a keyword
+msgid "unresolved takes no arguments"
+msgstr "unresolved ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+"``hgignore()``\n"
+" 有効㪠.hgignore パターンã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "hgignore takes no arguments"
+msgstr "hgignore ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+"``grep(regex)``\n"
+" æ­£è¦è¡¨ç¾ regexp ã«åˆè‡´ã™ã‚‹å†…容をæŒã¤ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "grep requires a pattern"
+msgstr "grep ã«ã¯ãƒ‘ターン指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "couldn't parse size: %s"
+msgstr "サイズ指定ã®è§£æžã«å¤±æ•—: %s"
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+"``size(expression)``\n"
+" サイズãŒæŒ‡å®šæ¡ä»¶ã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã€‚æ¡ä»¶ä¾‹:"
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+" - 1k (1024 〜 2047 ãƒã‚¤ãƒˆã®ãƒ•ã‚¡ã‚¤ãƒ«)\n"
+" - < 20k (20480 ãƒã‚¤ãƒˆæœªæº€ã®ãƒ•ã‚¡ã‚¤ãƒ«)\n"
+" - >= .5MB (524288 ãƒã‚¤ãƒˆä»¥ä¸Šã®ãƒ•ã‚¡ã‚¤ãƒ«)\n"
+" - 4k - 1MB (4096 〜 1048576 ãƒã‚¤ãƒˆã®ãƒ•ã‚¡ã‚¤ãƒ«)"
+
+#. i18n: "size" is a keyword
+msgid "size requires an expression"
+msgstr "size ã«ã¯æ¡ä»¶æŒ‡å®šãŒå¿…è¦ã§ã™"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+"``encoding(name)``\n"
+" 指定エンコーディング方å¼ã§ãƒ‡ã‚³ãƒ¼ãƒ‰å¯èƒ½ãªãƒ•ã‚¡ã‚¤ãƒ«ã€‚\n"
+" ASCII ã‚„ UTF-8 以外ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã«å¯¾ã—ã¦ã¯ã€\n"
+" 無益ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。"
+
+#. i18n: "encoding" is a keyword
+msgid "encoding requires an encoding name"
+msgstr "encoding ã«ã¯ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°åãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "unknown encoding '%s'"
+msgstr "ä¸æ˜Žãªã‚¨ãƒ³ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚° '%s' ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+"``copied()``\n"
+" 複製先ステータスをæŒã¤ãƒ•ã‚¡ã‚¤ãƒ« (※ 訳注: 未コミット時点ã§ã®ã¿åˆ¤å®šå¯èƒ½)"
+
+#. i18n: "copied" is a keyword
+msgid "copied takes no arguments"
+msgstr "copied ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``subrepo([pattern])``\n"
+" Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([pattern])``\n"
+" パターンã«åˆè‡´ã™ã‚‹ãƒ‘スã«ä½ç½®ã™ã‚‹å‰¯ãƒªãƒã‚¸ãƒˆãƒªã€‚"
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo ã®å¼•æ•°ã¯æœ€å¤§ï¼‘ã¤ã§ã™"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo ã®å¼•æ•°ã¯ã€ãƒ‘ターン指定ã‹ã€å¼•æ•°ç„¡ã—ã§ã™"
+
+msgid "invalid token"
+msgstr "ä¸æ­£ãªè¨˜è¿°"
+
+msgid "starting revisions are not directly related"
+msgstr "開始リビジョンã¨ç›´æŽ¥ã®é–¢é€£ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "状態矛盾: %s:%s ã¯è‰¯å¦åˆ¤å®šä¸èƒ½"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr "未知ã®åˆ†å²ç¨®é¡ž %s"
+
+msgid "invalid bisect state"
+msgstr "bisect 状態ãŒä¸æ­£ã§ã™"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "good"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "bad"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "skipped"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "untested"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "good (推定)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "bad (推定)"
+
+msgid "disabled extensions:"
+msgstr "無効化ã•ã‚Œã¦ã„るエクステンション:"
+
+msgid "VALUE"
+msgstr "値"
+
+msgid "DEPRECATED"
+msgstr "éžæŽ¨å¥¨"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"[+] å°ä»˜ãã®ã‚ªãƒ—ションã¯è¤‡æ•°å›žæŒ‡å®šå¯èƒ½ã§ã™\n"
+
+msgid "Configuration Files"
+msgstr "設定ファイル"
+
+msgid "Date Formats"
+msgstr "日時表記"
+
+msgid "File Name Patterns"
+msgstr "ファイルåパターン"
+
+msgid "Environment Variables"
+msgstr "環境変数"
+
+msgid "Specifying Single Revisions"
+msgstr "å˜ä¸€ãƒªãƒ“ジョンã®æŒ‡å®š"
+
+msgid "Specifying Multiple Revisions"
+msgstr "複数リビジョンã®æŒ‡å®š"
+
+msgid "Specifying Revision Sets"
+msgstr "リビジョン群ã®æŒ‡å®š"
+
+msgid "Specifying File Sets"
+msgstr "ファイル群ã®æŒ‡å®š"
+
+msgid "Diff Formats"
+msgstr "差分形å¼"
+
+msgid "Merge Tools"
+msgstr "マージツール"
+
+msgid "Template Usage"
+msgstr "テンプレートã®åˆ©ç”¨"
+
+msgid "URL Paths"
+msgstr "URLã®ãƒ‘ス指定"
+
+msgid "Using Additional Features"
+msgstr "拡張機能(エクステンション)ã®ä½¿ç”¨"
+
+msgid "Subrepositories"
+msgstr "副リãƒã‚¸ãƒˆãƒª"
+
+msgid "Configuring hgweb"
+msgstr "hgweb 設定ファイル"
+
+msgid "Glossary"
+msgstr "用語集"
+
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "Mercurial ã®ç„¡è¦–指定ファイルã®æ–‡æ³•"
+
+msgid "Working with Phases"
+msgstr "フェーズã®åˆ©ç”¨"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+"Mercurial ã§ã¯ã€ 挙動を制御ã™ã‚‹ãŸã‚ã«ã€\n"
+"複数ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’使用ã—ã¾ã™ã€‚"
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Mercurial ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ ã„ã‚ゆる ini ファイル形å¼ã§è¨˜è¿°ã•ã‚Œã¾ã™ã€‚\n"
+"設定ファイルã¯ã€ 「セクションã€ã‹ã‚‰æ§‹æˆã•ã‚Œã€\n"
+"å„セクション㯠``[セクションå]`` å½¢å¼ã®ãƒ˜ãƒƒãƒ€ã§å§‹ã¾ã‚Šã€\n"
+"``åå‰ = 値`` å½¢å¼ã®è¦ç´ ãŒåˆ—挙ã•ã‚Œã¾ã™::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"上記記述ã¯ãã‚Œãžã‚Œã€\n"
+"``ui.username`` ãŠã‚ˆã³ ``ui.verbose`` ã¨ã—ã¦å‚ç…§ã•ã‚Œã¾ã™ã€‚\n"
+"後述ã™ã‚‹æ–‡æ³•ã®è©³ç´°ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Files\n"
+"====="
+msgstr ""
+"ファイル\n"
+"========"
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+"Mercurial ã¯è¤‡æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰è¨­å®šæƒ…報を読ã¿è¾¼ã¿ã¾ã™ã€‚\n"
+"読ã¿è¾¼ã¿å¯¾è±¡ã¨ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 事å‰ã«å­˜åœ¨ã—ã¾ã›ã‚“ã®ã§ã€\n"
+"é©åˆ‡ãªä½ç½®ã«ãƒ•ã‚¡ã‚¤ãƒ«ã‚’作æˆã™ã‚‹ã®ã¯ã€ 利用者ã®è²¬ä»»ã¨ãªã‚Šã¾ã™ã€‚\n"
+"ユーザå設定ã®ã‚ˆã†ãªã€ 広範囲ã«æ¸¡ã‚‹è¨­å®šã¯ã€\n"
+"``%USERPROFILE%\\mercurial.ini`` ã‚„ ``$HOME/.hgrc`` ã«ã€\n"
+"ã‚‚ã£ã¨ç‹­ã„範囲ã«é–¢ã™ã‚‹è¨­å®šã¯ã€ å„リãƒã‚¸ãƒˆãƒªæ¯Žã® ``<リãƒã‚¸ãƒˆãƒª>/.hg/hgrc``\n"
+"ã«ãŠã„ã¦è¨˜è¿°ã™ã‚‹ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚"
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+"設定ファイルã®åå‰ (パス) ã¯ã€ Mercurial ã®ç¨¼å‹•ç’°å¢ƒã«ä¾å­˜ã—ã¾ã™ã€‚\n"
+"å˜ä¸€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç›´ä¸‹ã® ``*.rc`` ファイルを読ã¿è¾¼ã‚€å ´åˆã€\n"
+"ファイルåã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã§èª­ã¿è¾¼ã¾ã‚Œã€ å…ˆã«èª­ã¿è¾¼ã‚“ã è¨­å®šã‚ˆã‚Šã‚‚ã€\n"
+"後ã‹ã‚‰èª­ã¿è¾¼ã‚“ã è¨­å®šã®æ–¹ãŒå„ªå…ˆã•ã‚Œã¾ã™ã€‚ 以下ã«åˆ—挙ã•ã‚Œã‚‹ãƒ‘スã«ãŠã„ã¦ã€\n"
+"複数ã‹ã‚‰è¨­å®šãŒèª­ã¿è¾¼ã¾ã‚ŒãŸå ´åˆã¯ã€ 列挙順ã®æ—©ã„æ–¹ã®è¨­å®šãŒå„ªå…ˆã•ã‚Œã¾ã™ã€‚"
+
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr "| (共通) ``<リãƒã‚¸ãƒˆãƒª>/.hg/hgrc``"
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+" belong to a trusted user or to a trusted group. See the documentation\n"
+" for the ``[trusted]`` section below for more details."
+msgstr ""
+" 個々ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã®ã¿é©ç”¨ã•ã‚Œã‚‹ã€ リãƒã‚¸ãƒˆãƒªæ¯Žè¨­å®šã€‚\n"
+" 本ファイルã¯æ§‹æˆç®¡ç†å¯¾è±¡å¤–ã§ã‚り〠:hg:`clone` \n"
+" ã«ã‚ˆã£ã¦ä¼æ’­ã™ã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã›ã‚“。 本ファイルã§ã®è¨­å®šã¯ã€\n"
+" 以下ã«è¿°ã¹ã‚‹å…¨ã¦ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«å„ªå…ˆã—ã¾ã™ã€‚ Unix ãŠã‚ˆã³ Plan 9\n"
+" 環境ã«ãŠã„ã¦ã€ 本ファイルã®æ‰€æœ‰è€…ï¼ã‚°ãƒ«ãƒ¼ãƒ—ãŒã€ ä¿¡é ¼ã§ããªã„å ´åˆã€\n"
+" 本ファイル中ã®è¨­å®šã®å¤§åŠã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ 詳細ã«é–¢ã—ã¦ã¯ã€\n"
+" 後述ã™ã‚‹ã€€``trusted`` セクションã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+" Mercurial を実行ã™ã‚‹ãƒ¦ãƒ¼ã‚¶ã®ãŸã‚ã®ã€ ユーザ毎設定。\n"
+" Windows 9x 環境ã§ã® ``%HOME%`` 㯠``%APPDATA%`` ã«ç›¸å½“ã—ã¾ã™ã€‚\n"
+" 本ファイルã§ã®è¨­å®šã¯ã€ 当該ユーザã®å…¨ã¦ã® Mercurial\n"
+" コマンド実行ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚ 本ファイルã§ã®è¨­å®šã¯ã€\n"
+" システム毎ï¼ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«æ¯Žã®è¨­å®šã‚ˆã‚Šå„ªå…ˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+" Mercurial ã®ç¨¼å‹•ç’°å¢ƒã«ãŠã‘るシステム毎設定。\n"
+" 本ファイルã§ã®è¨­å®šã¯ã€ 実行ユーザï¼å®Ÿè¡Œä½ç½®ã«é–¢ã‚らãšã€\n"
+" å…¨ã¦ã® Mercurial コマンド実行ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" 本ファイルã§ã®è¨­å®šã¯ã€ インストール毎設定より優先ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``<インストール先>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<インストール先>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<インストール先>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<インストール先>/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+" Mercurial ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å…ˆã‹ã‚‰èª­ã¿è¾¼ã¾ã‚Œã‚‹ã€ インストール毎設定。\n"
+" ``<インストール先>`` ã¯ã€ 実行ã•ã‚Œã‚‹ **hg** コマンド\n"
+" (ãªã„ã—シンボリックリンク) ã®è¦ªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’æ„味ã—ã¾ã™ã€‚\n"
+" 例ãˆã°ã€ ``/shared/tools/bin/hg`` ãŒå®Ÿè¡Œã•ã‚Œã‚‹å ´åˆã€\n"
+" ``/shared/tools/etc/mercurial/hgrc`` ãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚\n"
+" 本ファイルã§ã®è¨­å®šã¯ã€ 実行ユーザï¼å®Ÿè¡Œä½ç½®ã«é–¢ã‚らãšã€\n"
+" 当該 Mercurial コマンドã®å®Ÿè¡Œã®å…¨ã¦å¯¾ã—ã¦é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+"| (Windows) ``<インストール先>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<インストール先>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected."
+msgstr ""
+" Mercurial ã®ç¨¼å‹•ç’°å¢ƒã«ãŠã‘る〠インストール毎ï¼ã‚·ã‚¹ãƒ†ãƒ æ¯Žè¨­å®šã€‚\n"
+" 本ファイルã§ã®è¨­å®šã¯ã€ 実行ユーザï¼å®Ÿè¡Œä½ç½®ã«é–¢ã‚らãšã€\n"
+" 当該 Mercurial コマンドã®å…¨ã¦ã®å®Ÿè¡Œã«å¯¾ã—ã¦é©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" レジストリキー㯠PATH 環境変数的ãªå€¤ã‚’ä¿æŒã—ã€\n"
+" 値ã®å„è¦ç´ ã¯ã€ ファイル ``Mercurial.ini`` ã‚’å‚ç…§ã™ã‚‹ã‹ã€\n"
+" ``*.rc`` ファイルを格ç´ã™ã‚‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+" 1ã¤ä»¥ä¸Šã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¤œå‡ºã•ã‚Œã‚‹ã¾ã§ã€\n"
+" Mercurial ã¯è¨˜è¿°é †åºé€šã‚Šã«ã€ å„ä½ç½®ã®ãƒ•ã‚¡ã‚¤ãƒ«æ‰€åœ¨ç¢ºèªã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid ""
+"Syntax\n"
+"======"
+msgstr ""
+"文法\n"
+"===="
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+"設定ファイルã¯ã€ 「セクションã€ã‹ã‚‰æ§‹æˆã•ã‚Œã€\n"
+"å„セクション㯠``[セクションå]`` å½¢å¼ã®ãƒ˜ãƒƒãƒ€ã§å§‹ã¾ã‚Šã€\n"
+"``åå‰ = 値`` å½¢å¼ã®è¦ç´  (『åå‰ã€ã¯ã€Žè¨­å®šã‚­ãƒ¼ã€ã¨ã‚‚呼ã°ã‚Œã¾ã™)\n"
+"ãŒåˆ—挙ã•ã‚Œã¾ã™::"
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+"設定記述ã¯ä¸€è¡Œä¸€ã‚¨ãƒ³ãƒˆãƒªã§ã™ã€‚ 但ã—〠後続行ãŒå­—下ã’ã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€\n"
+"エントリ記述ãŒç¶™ç¶šã—ã¦ã„ã‚‹ã‚‚ã®ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+"値記述ã®å…ˆé ­ã® (åŠè§’) 空白文字ã¯é™¤å¤–ã•ã‚Œã¾ã™ã€‚\n"
+"空行ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚ ``#`` ãªã„ã— ``;`` ã§å§‹ã¾ã‚‹è¡Œã¯ã€\n"
+"コメント行ã¨ã—ã¦ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+"åŒä¸€è¨­å®šã‚­ãƒ¼ã«å¯¾ã—ã¦ã€ 複数回ã®è¨˜è¿°ãŒå¯èƒ½ã§ã™ãŒã€\n"
+"Mercurial ã¯æœ€å¾Œã«è¨­å®šã•ã‚ŒãŸå€¤ã‚’使用ã—ã¾ã™ã€‚\n"
+"例ãˆã°::"
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr ""
+"上記記述ã®å ´åˆã€ 設定キー ``eggs`` ã®å€¤ã¨ã—ã¦æŽ¡ç”¨ã•ã‚Œã‚‹ã®ã¯\n"
+"``small`` ã§ã™ã€‚"
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+"åŒä¸€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’複数回記述ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ 複数回ã®è¨˜è¿°å ´æ‰€ã¯ã€\n"
+"åŒä¸€ãƒ•ã‚¡ã‚¤ãƒ«ä¸­ã§ã‚‚〠異ãªã‚‹è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«é–“ã§ã‚‚構ã„ã¾ã›ã‚“。\n"
+"例ãˆã°::"
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+"上記ã®è¨­å®šè¨˜è¿°ã®å ´åˆã€\n"
+"``foo`` セクションã®\n"
+"``eggs``〠``ham`` ãŠã‚ˆã³ ``bread`` 設定キーã®å€¤ã¯ãã‚Œãžã‚Œ\n"
+"``medium``〠``prosciutto`` ãŠã‚ˆã³ ``toasted`` ã¨ãªã‚Šã¾ã™ã€‚\n"
+"å„設定キー毎ã«ã€ 最後ã«è¨­å®šã•ã‚ŒãŸå€¤ãŒæœ‰åŠ¹ã«ãªã‚‹ã®ã§ã™ã€‚"
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+"åŒä¸€è¨­å®šã‚­ãƒ¼ã«å¯¾ã—ã¦ã€ ç•°ãªã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã§ãã‚Œãžã‚Œè¨­å®šãŒè¨˜è¿°ã•ã‚ŒãŸå ´åˆã€\n"
+"「最後ã®è¨­å®šå€¤ã€ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã®èª­ã¿è¾¼ã¿é †åºã«ä¾å­˜ã—ã¾ã™ã€‚\n"
+"先㮠``ファイル`` セクションã§ã®ãƒ‘スã®åˆ—挙順ãŒã€ より早ã„æ–¹ãŒå„ªå…ˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+"``%include file`` å½¢å¼ã®è¨˜è¿°ã«ã‚ˆã£ã¦ã€ 当該設定ファイルã«ãŠã„ã¦\n"
+"``file`` ãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚ 読ã¿è¾¼ã¿ã¯å†å¸°çš„ã«å®Ÿæ–½ã•ã‚Œã‚‹ãŸã‚ã€\n"
+"読ã¿è¾¼ã¿å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã‹ã‚‰ã€ ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚€ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+"ファイルåã¯ã€ ``%include`` 記述ã®ã‚るファイルã«å¯¾ã—ã¦ã€\n"
+"相対的ãªã‚‚ã®ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ ``file`` ã«ãŠã‘る環境変数や ``~user``\n"
+"å½¢å¼ã®è¨˜è¿°ã¯å±•é–‹ã•ã‚Œã¾ã™ã€‚ ãã®ãŸã‚〠以下ã®ã‚ˆã†ãªè¨˜è¿°ã«ã‚ˆã£ã¦::"
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr " %include ~/.hgrc.d/$HOST.rc"
+
+msgid "to include a different configuration file on each computer you use."
+msgstr "ホスト毎ã«ç•°ãªã‚‹è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚€äº‹ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+"当該セクションã«ãŠã„ã¦ã€ 既㫠``name`` ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+"``%unset name`` å½¢å¼ã®è¨˜è¿°ã«ã‚ˆã£ã¦ã€ 設定を破棄ã™ã‚‹äº‹ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+"設定ã™ã‚‹å€¤ã«ã¯ã€ 自由形å¼ã®æ–‡å­—列〠文字列ã®åˆ—挙ã€ãªã„ã—真å½å€¤ã®ã€\n"
+"ã„ãšã‚Œã§ã‚‚指定å¯èƒ½ã§ã™ã€‚ 真å½å€¤ã®è¨­å®šã§ã¯ã€ \"1\"〠\"yes\"ã€\n"
+"\"true\" ãªã„ã— \"on\" ã®ã„ãšã‚Œã‚‚ãŒçœŸå€¤ã€ \"0\"〠\"no\"〠\"false\"\n"
+"ãªã„ã— \"off\" ã®ã„ãšã‚Œã‚‚ãŒå½å€¤ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ (文字大å°ã¯ç„¡è¦–ã•ã‚Œã¾ã™)"
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+"列挙ã«ãŠã‘ã‚‹å„値ã¯ã€ 空白文字ãªã„ã—コンマã§åŒºåˆ‡ã‚‰ã‚Œã¾ã™ãŒã€\n"
+"二é‡å¼•ç”¨ç¬¦ (\") ã§å›²ã¾ã‚ŒãŸéƒ¨ä½ã¯åˆ†å‰²ã•ã‚Œã¾ã›ã‚“::"
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr " allow_read = \"John Doe, PhD\", brian, betty"
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+"ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã‚’å‰ã«ä»˜ã‘る事ã§ã€ 引用符自体を記述ã™ã‚‹äº‹ãŒå¯èƒ½ã§ã™ã€‚\n"
+"語ã®å†’é ­ä½ç½®ä»¥å¤–ã®å¼•ç”¨ç¬¦ã¯ã€ 引用符ã¨ã¯ã¿ãªã•ã‚Œã¾ã›ã‚“。\n"
+"(例: ``foo\"bar baz`` 㯠``foo\"bar`` 㨠``baz`` ã®åˆ—挙ã¨ã¿ãªã•ã‚Œã¾ã™)"
+
+msgid ""
+"Sections\n"
+"========"
+msgstr ""
+"セクション\n"
+"=========="
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+"Mercurial ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã§è¨˜è¿°å¯èƒ½ãªå„セクション毎ã®ã€\n"
+"用途〠設定キーã€ã€€ãŠã‚ˆã³è¨­å®šå¯èƒ½ãªå€¤ã«ã¤ã„ã¦ä»¥ä¸‹ã§è¿°ã¹ã¾ã™ã€‚"
+
+msgid ""
+"``alias``\n"
+"---------"
+msgstr ""
+"``alias``\n"
+"---------"
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+"コマンドã®åˆ¥å (エイリアス) 定義。\n"
+"別åã¯ã€ ä»–ã®ã‚³ãƒžãƒ³ãƒ‰ (ãªã„ã—エイリアス) や〠付加的ãªå¼•æ•°ã‚’使ã£ã¦ã€\n"
+"自分独自ã®ã‚³ãƒžãƒ³ãƒ‰ã®å®šç¾©ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚\n"
+"別å定義ã«ãŠã‘ã‚‹ ``$1`` ã‚„ ``$2`` ã®ã‚ˆã†ãªä½ç½®æŒ‡å®šå¼•æ•°ã¯ã€\n"
+"実行å‰ã« Mercurial ã«ã‚ˆã£ã¦ç½®æ›ã•ã‚Œã¾ã™ã€‚\n"
+"別å定義中㧠``$N`` å½¢å¼ã«ã‚ˆã‚‹å‚ç…§ã®ç„¡ã‹ã£ãŸå…¨ã¦ã®å¼•æ•°ã¯ã€\n"
+"実行ã•ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã®æœ«å°¾ã«ä»˜ä¸Žã•ã‚Œã¾ã™ã€‚"
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr "別å定義ã§ã¯ã€ 以下ã®å½¢å¼ã®è¡Œã‚’記述ã—ã¾ã™::"
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr " <別å> = <コマンド> [<引数>]..."
+
+msgid "For example, this definition::"
+msgstr "例ãˆã°ã€ 以下ã®å®šç¾©ã§ã¯::"
+
+msgid " latest = log --limit 5"
+msgstr " latest = log --limit 5"
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+"最新㮠5 リビジョンã®ã¿ã‚’表示ã™ã‚‹ ``latest`` コマンドãŒå®šç¾©ã•ã‚Œã¾ã™ã€‚\n"
+"定義済ã¿ã®åˆ¥åを用ã„ã¦ã€ é•ã†åˆ¥åを定義ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™::"
+
+msgid " stable5 = latest -b stable"
+msgstr " stable5 = latest -b stable"
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+".. note:: 既存コマンドã¨åŒåã®åˆ¥å定義ã¯ã€ 既存コマンドを上書ãã—ã¾ã™ã€‚\n"
+" ã“ã®ã‚ˆã†ãªåˆ¥å定義ã¯ã€ 大概悲惨ãªçµæžœã‚’æ‹›ãã¾ã™!"
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+"感嘆符 (``!``) ã‹ã‚‰å§‹ã¾ã‚‹åˆ¥å定義ã¯ã€ シェル別åã‚’æ„味ã—ã¾ã™ã€‚\n"
+"シェル別åã¯ã‚·ã‚§ãƒ«ã«ã‚ˆã£ã¦è§£é‡ˆã•ã‚Œã€ ä»»æ„ã®ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡ŒãŒå¯èƒ½ã§ã™ã€‚\n"
+"例ãˆã°ä»¥ä¸‹ã®å®šç¾©ã«ã‚ˆã£ã¦::"
+
+msgid " echo = !echo $@"
+msgstr " echo = !echo $@"
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+"``hg echo foo`` 実行ã¯ã€ 端末㫠``foo`` を表示ã—ã¾ã™ã€‚\n"
+"より実践的ãªä¾‹ã¨ã—ã¦ã¯::"
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+"``hg purge`` 実行ã¯ã€ 作業領域中ã®å…¨ã¦ã®æœªçŸ¥ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã€\n"
+"purge エクステンションã¨åŒã˜ä½œæ³•ã§å‰Šé™¤ã—ã¾ã™ã€‚"
+
+msgid ""
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+"別å定義ã§ã® ``$1`` ã‚„ ``$2`` ç­‰ã®ä½ç½®æŒ‡å®šå¼•æ•°ã¯ã€ 別åコマンド実行ã®éš›ã«ã€\n"
+"コマンド行ã§æŒ‡å®šã•ã‚ŒãŸã€ 対応ã™ã‚‹å¼•æ•°ã§ç½®æ›ã•ã‚Œã¾ã™ã€‚ 対応引数ãŒç„¡ã„å ´åˆã€\n"
+"引数ä¸è¶³ã§å‡¦ç†ãŒä¸­æ–­ã•ã‚Œã¾ã™ã€‚ ``$0`` ã¯ã‚³ãƒžãƒ³ãƒ‰åˆ¥åãã®ã‚‚ã®ã€``$@``\n"
+"ã¯å…¨å¼•æ•°ã‚’空白区切りã—ãŸã‚‚ã®ã§ã€ãã‚Œãžã‚Œç½®æ›ã•ã‚Œã¾ã™ã€‚ 引数ã®ç½®æ›ã¯ã€\n"
+"シェルã«ã‚ˆã‚‹ã‚³ãƒžãƒ³ãƒ‰è¡Œè§£é‡ˆã‚ˆã‚Šã‚‚〠å‰ã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+"シェル別åã§ã¯ã€ 環境変数 ``$HG`` ãŒã€ 別åコマンドを実行ã™ã‚‹\n"
+"Mercurial ã®ãƒ‘スã«ç½®æ›ã•ã‚Œã¾ã™ã€‚\n"
+"ã“ã®ä»•æ§˜ã¯ã€ 先㮠purge 別åã®ã‚ˆã†ã«ã€ シェル別åã«ãŠã„ã¦\n"
+"Mercurial を実行ã™ã‚‹å ´åˆã«æœ‰ç”¨ã§ã™ã€‚\n"
+"æ›´ã«ã€ 環境変数 ``$HG_ARGS`` 㯠Mercurial ã¸ã®å¼•æ•°ã«ç½®æ›ã•ã‚Œã¾ã™ã®ã§ã€\n"
+"先述ã—㟠``hg echo foo`` ã§ã¯ã€\n"
+"``$HG_ARGS`` 㯠``echo foo`` ã«ç½®æ›ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+".. note:: å¹¾ã¤ã‹ã®ã‚°ãƒ­ãƒ¼ãƒãƒ«ã‚ªãƒ—ション (例: ``-R``) ã®å‡¦ç†ã¯ã€\n"
+" シェル別åã®è§£é‡ˆå‰ã«å®Ÿæ–½ã•ã‚Œã‚‹ãŸã‚〠シェル別åã«å¯¾ã—ã¦ã€\n"
+" ã“れらを指定ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。"
+
+msgid ""
+"\n"
+"``annotate``\n"
+"------------"
+msgstr ""
+"\n"
+"``annotate``\n"
+"------------"
+
+msgid ""
+"Settings used when displaying file annotations. All values are\n"
+"Booleans and default to False. See ``diff`` section for related\n"
+"options for the diff command."
+msgstr ""
+"ファイル中ã®è¡Œã®ç”±æ¥è¡¨ç¤ºã«é–¢ã™ã‚‹è¨­å®šã€‚\n"
+"å…¨ã¦ã®å€¤ãŒçœŸå½å€¤ã§ã€ デフォルト値㯠False ã§ã™ã€‚\n"
+"diff コマンドã«é–¢é€£ã™ã‚‹ã‚ªãƒ—ションã®è©³ç´°ã¯ã€\n"
+"``diff`` セクションをå‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+"``ignorews``\n"
+" 差分検出ã«ãŠã‘る空白文字無視ã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+"``ignorewsamount``\n"
+" 差分検出ã«ãŠã‘る空白文字数増減無視ã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+"``ignoreblanklines``\n"
+" 差分検出ã«ãŠã‘る空行増減無視ã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"\n"
+"``auth``\n"
+"--------"
+msgstr ""
+"\n"
+"``auth``\n"
+"--------"
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+"HTTP èªè¨¼ã®ãŸã‚ã®èªè¨¼æƒ…報。 本セクションã§ã¯ã€ HTTP \n"
+"サーãƒã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã§ä½¿ç”¨ã•ã‚Œã‚‹ã€ ユーザåï¼ãƒ‘スワードを記述ã—ã¾ã™ã€‚\n"
+"HTTP サーãƒå´ã«ãŠã„ã¦ã€ ログインå¯èƒ½ãƒ¦ãƒ¼ã‚¶ã‚’制御ã™ã‚‹å ´åˆã®è©³ç´°ã¯ã€\n"
+"``[web]`` セクションをå‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid "Each line has the following format::"
+msgstr "設定ã¯ä»¥ä¸‹ã®å½¢å¼ã§è¨˜è¿°ã•ã‚Œã¾ã™::"
+
+msgid " <name>.<argument> = <value>"
+msgstr " <åå‰>.<引数> = <値>"
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+"``<åå‰>`` ã¯å¼•æ•°ç¾¤ã‚’1ã¤ã®èªè¨¼æƒ…報エントリã«æŸã­ã‚‹åƒãã‚’ã—ã¾ã™ã€‚ 例ãˆã°::"
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+
+msgid "Supported arguments:"
+msgstr "利用å¯èƒ½ãªå¼•æ•°ã‚’以下ã«ç¤ºã—ã¾ã™:"
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+"``prefix``\n"
+" ``*`` ãªã„ã— URI (scheme 部分ã®è¨˜è¿°ã¯ä»»æ„)。\n"
+" 最長マッãƒã™ã‚‹ prefix 指定をæŒã¤èªè¨¼æƒ…å ±ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" (``*`` ã¯å…¨ã¦ã«ãƒžãƒƒãƒã—〠マッãƒé•·ã¯ 1 ã¨ã¿ãªã•ã‚Œã¾ã™)\n"
+" prefix 指定㌠scheme 部分をæŒãŸãªã„å ´åˆã€ \n"
+" scheme 部分をå–り除ã„㟠URI ã«å¯¾ã™ã‚‹ prefix ã®ãƒžãƒƒãƒãƒ³ã‚°ã®å¾Œã§ã€\n"
+" (後述ã™ã‚‹) scheme 引数ã«ã‚ˆã‚‹ãƒžãƒƒãƒãƒ³ã‚°ãŒè¡Œã‚ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+"``username``\n"
+" çœç•¥å¯ã€‚ èªè¨¼ã«ãŠã‘るユーザå。 本引数ã®æŒ‡å®šãŒç„¡ã〠且ã¤ãƒ­ã‚°ã‚¤ãƒ³æ™‚ã«\n"
+" basic ãªã„ã— digest èªè¨¼ãŒè¦æ±‚ã•ã‚ŒãŸå ´åˆã€ 対話的入力ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚\n"
+" ``foo.username = $USER`` å½¢å¼ã®è¨˜è¿°ã§ã¯ã€ 環境変数ãŒç½®æ›ã•ã‚Œã¾ã™ã€‚\n"
+" URI ãŒãƒ¦ãƒ¼ã‚¶åã‚’å«ã‚€å ´åˆã€ é¸æŠžå¯¾è±¡ã¨ãªã‚‹ ``[auth]`` ã®ã‚¨ãƒ³ãƒˆãƒªã¯ã€\n"
+" ユーザåãŒåˆè‡´ã™ã‚‹ã‚‚ã®ã‹ã€ ユーザåãŒç„¡ã„ã‚‚ã®ã ã‘ã§ã™ã€‚"
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+"``password``\n"
+" çœç•¥å¯ã€‚ èªè¨¼ã«ãŠã‘るパスワード。 本引数ã®æŒ‡å®šãŒç„¡ãã€\n"
+" 且ã¤ãƒ­ã‚°ã‚¤ãƒ³æ™‚ã« basic ãªã„ã— digest èªè¨¼ãŒè¦æ±‚ã•ã‚ŒãŸå ´åˆã€\n"
+" 対話的入力ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``key``\n"
+" çœç•¥å¯èƒ½ã€‚ PEM 符å·åŒ–ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸éµãƒ•ã‚¡ã‚¤ãƒ«ã€‚\n"
+" ファイルå指定ã§ã¯ã€ 環境変数ã®ç½®æ›ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``cert``\n"
+" çœç•¥å¯èƒ½ã€‚ PEM 符å·åŒ–ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆè¨¼æ˜Žæ›¸é€£éŽ–ファイル。\n"
+" ファイルå指定ã§ã¯ã€ 環境変数ã®ç½®æ›ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+"``schemes``\n"
+" çœç•¥å¯èƒ½ã€‚ 空白ã§åŒºåˆ‡ã£ãŸã€ èªè¨¼ã§ä½¿ç”¨ã•ã‚Œã‚‹ URI scheme ã®ä¸€è¦§ã€‚\n"
+" prefix 引数㫠scheme ãŒå«ã¾ã‚Œãªã„å ´åˆã«ã®ã¿ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" http ãŠã‚ˆã³ https ãŒæŒ‡å®šå¯èƒ½ã§ã™ã€‚ ãã‚Œãžã‚Œ static-http ãŠã‚ˆã³\n"
+" static-https ã«ã‚‚マッãƒã—ã¾ã™ã€‚ デフォルト値: https"
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+"ログイン時ã«èªè¨¼ãŒè¦æ±‚ã•ã‚Œã€ 且ã¤é©åˆ‡ãªèªè¨¼æƒ…報記述ãŒç„¡ã„å ´åˆã€\n"
+"èªè¨¼æƒ…å ±ã«é–¢ã™ã‚‹å¯¾è©±çš„入力ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+msgstr ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+"リãƒã‚¸ãƒˆãƒªï¼ä½œæ¥­é ˜åŸŸé–“ã®å…¥å‡ºåŠ›ã«ãŠã‘る〠ファイル変æ›ãƒ•ã‚£ãƒ«ã‚¿ã®æŒ‡å®šã€‚\n"
+"改行形å¼ã®å¤‰æ›ã«ä»£è¡¨ã•ã‚Œã‚‹ã€ ファイルã®åœ°åŸŸåŒ–ï¼æ­£è¦åŒ–ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+"フィルタã¯ã€ フィルタコマンドを伴ã£ãŸãƒ•ã‚£ãƒ«ã‚¿ãƒ‘ターンã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚\n"
+"デフォルトã®ãƒ‘ターン指定形å¼ã¯ã€ 作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+"パス先頭ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ã§åˆ¤å®šã™ã‚‹ã€ ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰å½¢å¼ (glob) ã§ã™ã€‚\n"
+"例ãˆã°ã€ ルート直下㮠``.txt`` æ‹¡å¼µå­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã®ã¿åˆè‡´ã•ã›ã‚‹ãƒ‘ターンã¯\n"
+"``*.txt`` ã¨ãªã‚Šã¾ã™ã€‚ 作業領域中㮠``.c`` æ‹¡å¼µå­ã®å…¨ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®åˆè‡´ã¯ã€\n"
+"``**.c`` ã¨ãªã‚Šã¾ã™ã€‚ ãã‚Œãžã‚Œã®ãƒ•ã‚¡ã‚¤ãƒ«ã«é©ç”¨ã•ã‚Œã‚‹ãƒ•ã‚£ãƒ«ã‚¿ã¯ã€\n"
+"最åˆã«ãƒžãƒƒãƒã—ãŸãƒ‘ターンã®ã‚‚ã®ã ã‘ã§ã™ã€‚"
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+"フィルタコマンドã®è¨˜è¿°ã¯ ``pipe:`` ãªã„ã— ``tempfile:`` ã§é–‹å§‹å¯èƒ½ã§ã™ã€‚\n"
+"特ã«æŒ‡å®šãŒç„¡ã„å ´åˆã¯ã€ ``pipe:`` 指定相当ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+"``pipe:`` 指定ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ 標準入力ã‹ã‚‰ãƒ‡ãƒ¼ã‚¿ã‚’読ã¿è¾¼ã¿ã€\n"
+"変æ›æ¸ˆã¿ãƒ‡ãƒ¼ã‚¿ã‚’標準出力ã«æ›¸ã出ã•ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid "Pipe example::"
+msgstr "pipe フィルタ例を以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+" [encode]\n"
+" # 差分記録ã®åœ§ç¸®åŠ¹æžœå‘上ã®ãŸã‚ã€ã‚³ãƒŸãƒƒãƒˆæ™‚ã« gzip ファイルを解å‡ã€‚\n"
+" # 備考: ã‚ãã¾ã§ä¾‹ç¤ºã§ã‚ã‚Šã€ã“ã®æ–¹å¼è‡ªä½“ã¯ã‚ã¾ã‚Šè‰¯ã„案ã§ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+" *.gz = pipe: gunzip"
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+" [decode]\n"
+" # 作業領域ã¸ã®å–り出ã—ã®éš›ã« gzip ファイルをå†åœ§ç¸®\n"
+" # (デフォルトã§ã‚ã‚‹ \"pipe:\" 指定ã¯çœç•¥å¯èƒ½)\n"
+" *.gz = gzip"
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+"``tempfile:`` 指定ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ テンプレート形å¼ã§è¨˜è¿°ã—ã¾ã™ã€‚\n"
+"``INFILE`` 記述ã¯ã€ 処ç†å¯¾è±¡ãƒ‡ãƒ¼ã‚¿ãŒæ ¼ç´ã•ã‚ŒãŸä¸€æ™‚ファイルã®ãƒ‘スã«ã€\n"
+"``OUTFILE`` 記述ã¯ã€ 処ç†çµæžœã‚’æ ¼ç´ã™ã‚‹ (空ã®) 一時ファイルã®ãƒ‘スã«ã€\n"
+"ãã‚Œãžã‚Œç½®æ›ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+".. note:: 標準的ãªã‚·ã‚§ãƒ«ã® I/O リダイレクトãŒã€ 予期ã›ã¬çµæžœã‚„ã€\n"
+" ファイル内容ã®ç ´å£Šã«ç¹‹ãŒã‚‹ Windows ã®ã‚ˆã†ãªç’°å¢ƒã§ã¯ã€\n"
+" tempfile 機構ã®ä½¿ç”¨ãŒãŠå‹§ã‚ã§ã™ã€‚"
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+"Windows (CRLF) 㨠Unix (LF) 環境間ã«ãŠã‘る改行形å¼ã®å¤‰æ›ã‚’è¡Œã†\n"
+"``eol`` エクステンションã¯ã€ 内部的ã«ãƒ•ã‚£ãƒ«ã‚¿æ©Ÿæ§‹ã‚’使用ã—ã¦ã„ã¾ã™ã€‚\n"
+"改行形å¼å¤‰æ›´ã«ã¯ã€ ``eol`` エクステンションã®åˆ©ç”¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚"
+
+msgid ""
+"\n"
+"``defaults``\n"
+"------------"
+msgstr ""
+"\n"
+"``defaults``\n"
+"------------"
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr "(defaults ã®ä½¿ç”¨ã¯éžæŽ¨å¥¨ã§ã™ã€‚ alias を使用ã—ã¦ãã ã•ã„)"
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+"``[defaults]`` セクションã¯ã€ 指定コマンドã«å¯¾ã™ã‚‹ã€\n"
+"デフォルトã®ã‚ªãƒ—ションï¼å¼•æ•°æŒ‡å®šã®è¨˜è¿°ã«ä½¿ç”¨ã—ã¾ã™ã€‚"
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+"以下ã®è¨˜è¿°ã¯ã€ :hg:`log` ã®å¸¸æ™‚ verbose モード実行ã¨ã€\n"
+":hg:`status` ã®å¤‰æ›´ãƒ•ã‚¡ã‚¤ãƒ«é™å®šè¡¨ç¤ºåŒ–ã®ä¾‹ã§ã™::"
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+"alias 定義ã§ä¸Šæ›¸ãã•ã‚ŒãŸã‚³ãƒžãƒ³ãƒ‰ã§ã‚‚〠元々ã®ã‚³ãƒžãƒ³ãƒ‰ã®æ–¹ãŒ\n"
+"defaults 定義対象ã¨ãªã‚Šã¾ã™ã€‚ alias 定義コマンドも\n"
+"defaults 定義対象ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"\n"
+"``diff``\n"
+"--------"
+msgstr ""
+"\n"
+"``diff``\n"
+"--------"
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified``\n"
+"is a Boolean and defaults to False. See ``annotate`` section for\n"
+"related options for the annotate command."
+msgstr ""
+"差分表示ã®è¨­å®šã€‚ ``unified`` 以外ã®å…¨ã¦ã®è¨­å®šã¯çœŸå½å€¤ã§ã€\n"
+"デフォルト値㯠False ã§ã™ã€‚\n"
+"annotate コマンドã«é–¢é€£ã™ã‚‹ã‚ªãƒ—ションã®è©³ç´°ã¯ã€\n"
+"``annotate`` セクションをå‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" git æ‹¡å¼µ diff å½¢å¼ä½¿ç”¨ã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+"``nodates``\n"
+" 差分ヘッダ部分ã‹ã‚‰ã®æ—¥ä»˜æƒ…報除外ã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" 変更ãŒç”Ÿã˜ãŸé–¢æ•°ã®åå‰è¡¨ç¤ºã®æœ‰ç„¡ã€‚"
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+" 差分出力ã«ãŠã‘るコンテキスト行ã®è¡Œæ•°ã€‚"
+
+msgid ""
+"``email``\n"
+"---------"
+msgstr ""
+"``email``\n"
+"---------"
+
+msgid "Settings for extensions that send email messages."
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³å‘ã‘ã®è¨­å®šã€‚"
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+"``from``\n"
+" çœç•¥å¯èƒ½ã€‚ é€ä¿¡ã™ã‚‹ãƒ¡ãƒ¼ãƒ«ã® \"From\" ヘッダ㨠SMTP\n"
+" エンベロープã«ä½¿ç”¨ã™ã‚‹é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚"
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+"``to``\n"
+" çœç•¥å¯èƒ½ã€‚ 宛先電å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã€‚"
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``cc``\n"
+" çœç•¥å¯èƒ½ã€‚ CC 宛先電å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã€‚"
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``bcc``\n"
+" çœç•¥å¯èƒ½ã€‚ BCC 宛先電å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã€‚"
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+"``method``\n"
+" çœç•¥å¯èƒ½ã€‚ é›»å­ãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡æ–¹å¼ã€‚ ``smtp`` (デフォルト値)\n"
+" ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ 直接 SMTP を使用ã—ã¦é€ä¿¡ã—ã¾ã™ã€‚\n"
+" (設定詳細㯠``[smtp]`` セクション詳細をå‚ç…§)\n"
+" ãれ以外ã®å€¤ã®å ´åˆã¯ã€ sendmail ã¨åŒæ§˜ã«æŒ¯èˆžã†\n"
+" (``-f`` ã§é€ä¿¡å…ƒã‚’指定〠コマンド行ã§å®›å…ˆä¸€è¦§ã‚’指定ã€\n"
+" 標準入力ã§é€ä¿¡å†…容ã®å—ã‘å–ã‚Š)\n"
+" é›»å­ãƒ¡ãƒ¼ãƒ«é€ä¿¡ãƒ—ログラムã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" ``sendmail`` ã§ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡ã§ã¯ã€ 通常㯠``sendmail`` ãªã„ã—\n"
+" ``/usr/sbin/sendmail`` ã¨è¨­å®šã™ã‚Œã°å分ã§ã™ã€‚"
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+"``charsets``\n"
+" çœç•¥å¯èƒ½ã€‚ 宛先ã«ãŠã„ã¦éƒ½åˆã®è‰¯ã„文字符å·åŒ–æ–¹å¼ã®ã‚«ãƒ³ãƒžåŒºåˆ‡ã‚Šã€‚\n"
+" é›»å­ãƒ¡ãƒ¼ãƒ«ã®ã‚¢ãƒ‰ãƒ¬ã‚¹æŒ‡å®šã€ ヘッダ群〠ãŠã‚ˆã³ãƒ‘ッム「以外ã€\n"
+" ã®ãƒžãƒ«ãƒãƒ‘ート部分ã¯ã€ ローカル符å·åŒ–æ–¹å¼ (``$HGENCODING`` ãªã„ã—\n"
+" ``ui.fallbackencoding`` ã§æŒ‡å®š) ã‹ã‚‰ã®å¤‰æ›ã«æˆåŠŸã—ãŸã€\n"
+" 「最åˆã®ã€ç¬¦å·åŒ–æ–¹å¼ã§ç¬¦å·åŒ–ã•ã‚Œã¾ã™ã€‚ 変æ›ã«å¤±æ•—ã—ãŸå ´åˆã€\n"
+" ãã®ã¾ã¾ã®ãƒ‡ãƒ¼ã‚¿ãŒé€ä¿¡ã•ã‚Œã¾ã™ã€‚ デフォルトã®è¨­å®šã¯ç©ºã®ãƒªã‚¹ãƒˆã§ã™ã€‚"
+
+msgid " Order of outgoing email character sets:"
+msgstr " é›»å­ãƒ¡ãƒ¼ãƒ«ã®æ–‡å­—符å·åŒ–æ–¹å¼ã¯ä»¥ä¸‹ã®é †åºã§ç¢ºå®šã—ã¾ã™:"
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+" 1. ``us-ascii``: 設定ã«é–¢ã‚らãšå¸¸ã«æœ€åˆ\n"
+" 2. ``email.charsets``: ユーザ指定ã®é †åºé€šã‚Š\n"
+" 3. ``ui.fallbackencoding``: email.charsets ã§æŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€‚\n"
+" 4. ``$HGENCODING``: email.charsets ã§æŒ‡å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€‚\n"
+" 5. ``utf-8``: 設定ã«é–¢ã‚らãšå¸¸ã«æœ€å¾Œ"
+
+msgid "Email example::"
+msgstr "email セクションã®è¨­å®šä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # 西欧åœå‘ã‘ã®æ–‡å­—符å·åŒ–設定\n"
+" # 最åˆã¨æœ€å¾Œã«ç¢ºèªã•ã‚Œã‚‹ us-ascii 㨠utf-8 ã®è¨˜è¿°ã¯çœç•¥\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+
+msgid ""
+"\n"
+"``extensions``\n"
+"--------------"
+msgstr ""
+"\n"
+"``extensions``\n"
+"--------------"
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+"Mercurial ã«ã¯ã€ 機能追加ã®ãŸã‚ã®ã€ エクステンション機構ãŒå‚™ã‚ã£ã¦ã„ã¾ã™ã€‚\n"
+"個々ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’有効ã«ã™ã‚‹ã«ã¯ã€ 本セクションã«ãŠã„ã¦ã€\n"
+"対応ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã‚’記述ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+"エクステンションã®å®Ÿè£…ãŒã€ Python ã®æ¤œç´¢ãƒ‘ス上ã«ã‚ã‚‹å ´åˆã€\n"
+"モジュールåã«ç¶šã‘㦠``=`` を記述ã™ã‚‹ã ã‘ (å³è¾ºå€¤ã¯ä¸è¦) ã§ã™ã€‚"
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+"ãれ以外ã®å ´åˆã€ ä»»æ„ã®åå‰ã«ç¶šã‘㦠``=`` を記述ã—ãŸå¾Œã‚ã«ã€\n"
+"エクステンションを実装ã—㟠``.py`` ファイルã¸ã®ãƒ‘ス (ファイルåå«ã‚€)\n"
+"を記述ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"å…ˆã«èª­ã¿è¾¼ã¾ã‚ŒãŸè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã„ã¦ã€ 有効化済ã¿ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’ã€\n"
+"明示的ã«ç„¡åŠ¹åŒ–ã—ãŸã„å ´åˆã¯ã€ ``foo = !/ext/path`` ã‚ã‚‹ã„㯠``foo = !``\n"
+"ã®ã‚ˆã†ã«ã€ 値ã®å…ˆé ­ã« ``!`` ãŒæ¥ã‚‹ã‚ˆã†ãªè¨­å®šã‚’記述ã—ã¦ãã ã•ã„。"
+
+msgid "Example for ``~/.hgrc``::"
+msgstr "``~/.hgrc`` 記述例を以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" # (mq エクステンション㯠Mercurial åŒæ¢±ã®ã‚‚ã®ãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã™)\n"
+" mq =\n"
+" # (以下ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯æŒ‡å®šã®ãƒ‘スã‹ã‚‰èª­ã¿è¾¼ã¾ã‚Œã¾ã™)\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"\n"
+"``format``\n"
+"----------"
+msgstr ""
+"\n"
+"``format``\n"
+"----------"
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+"``usestore``\n"
+" ファイルåã®æ–‡å­—大å°ã‚’èªè­˜ã—ãªã„よã†ãªãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ã¸ã®ã€\n"
+" é©å¿œæ€§ã‚’å‘上ã•ã›ã‚‹ã€ \"store\" å½¢å¼ãƒªãƒã‚¸ãƒˆãƒªã®ä½¿ç”¨å¯å¦ã€‚\n"
+" デフォルトã§ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚ ã“ã®è¨­å®šã‚’無効化ã—ãŸå ´åˆã€\n"
+" æ–°è¦ä½œæˆã—ãŸãƒªãƒã‚¸ãƒˆãƒªã¯ã€ 0.9.4 以å‰ã® Mercurial ã¨ã€\n"
+" ディスク記録形å¼ã§äº’æ›æ€§ãŒä¿ãŸã‚Œã¾ã™ãŒã€ 状æ³æ¬¡ç¬¬ã§ã¯ã€\n"
+" é•·ã„ファイルåã§ã®ä¿å­˜ãŒå¿…è¦ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+"``usefncache``\n"
+" \"store\" å½¢å¼ãƒªãƒã‚¸ãƒˆãƒª (本設定ã®æœ‰åŠ¹åŒ–ã«å¿…é ˆ) ã«ãŠã„ã¦ã€\n"
+" é•·ã„ファイルåを使用ã™ã‚‹ãŸã‚ã®æ©Ÿèƒ½å‘上や〠\"nul\" ã®ã‚ˆã†ãª Windows\n"
+" 予約å利用を回é¿å¯èƒ½ã«ã™ã‚‹ã€ \"fncache\"\n"
+" å½¢å¼ãƒªãƒã‚¸ãƒˆãƒªã®ä½¿ç”¨å¯å¦ã€‚\n"
+" デフォルトã§ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚ ã“ã®è¨­å®šã‚’無効化ã—ãŸå ´åˆã€\n"
+" æ–°è¦ä½œæˆã—ãŸãƒªãƒã‚¸ãƒˆãƒªã¯ã€ 1.1 以å‰ã® Mercurial ã¨ã€\n"
+" ディスク記録形å¼ã§äº’æ›æ€§ãŒä¿ãŸã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+"``dotencode``\n"
+" \"fncache\" å½¢å¼ãƒªãƒã‚¸ãƒˆãƒª (本設定ã®æœ‰åŠ¹åŒ–ã«å¿…é ˆ) ã«ãŠã„ã¦ã€\n"
+" Mac OS X ã§ã¯ ``._`` ã€Windows ã§ã¯ç©ºç™½æ–‡å­—ã§å§‹ã¾ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«åãŒã€\n"
+" 原因ã¨ãªã£ã¦ç™ºç”Ÿã™ã‚‹å•é¡Œã‚’〠回é¿ã™ã‚‹ãŸã‚ã® \"dotencode\"\n"
+" å½¢å¼ãƒªãƒã‚¸ãƒˆãƒªã®ä½¿ç”¨å¯å¦ã€‚ デフォルトã§ã¯æœ‰åŠ¹åŒ–ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+" ã“ã®è¨­å®šã‚’無効化ã—ãŸå ´åˆã€ æ–°è¦ä½œæˆã—ãŸãƒªãƒã‚¸ãƒˆãƒªã¯ã€ 1.7 以å‰ã®\n"
+" Mercurial ã¨ã€ ディスク記録形å¼ã§äº’æ›æ€§ãŒä¿ãŸã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``graph``\n"
+"---------"
+msgstr ""
+"``graph``\n"
+"---------"
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+"ウェブã§ã®ã‚°ãƒ©ãƒ•è¡¨ç¤ºè¨­å®šã€‚ 本セクションã§ã¯ã€ グラフã®è¡¨ç¤ºè¦ç´ ã«å¯¾ã—ã¦ã€\n"
+"設定を変更ã§ãã¾ã™ (例: ``default`` ブランãƒã‚’目立ãŸã›ã‚‹)。"
+
+msgid " <branch>.<argument> = <value>"
+msgstr " <ブランãƒå>.<引数> = <値>"
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr "``<ブランãƒå>`` ã¯è¨­å®šå¤‰æ›´å¯¾è±¡ã®ãƒ–ランãƒåã§ã™ã€‚例ãˆã°::"
+
+msgid ""
+" [graph]\n"
+" # 2px width\n"
+" default.width = 2\n"
+" # red color\n"
+" default.color = FF0000"
+msgstr ""
+" [graph]\n"
+" # å¹…ã‚’2ピクセルã«å¤‰æ›´\n"
+" default.width = 2\n"
+" # 色を赤ã«å¤‰æ›´\n"
+" default.color = FF0000"
+
+msgid ""
+"``width``\n"
+" Set branch edges width in pixels."
+msgstr ""
+"``width``\n"
+" ブランãƒã«ãŠã‘ã‚‹ã®ç·šå¹…を〠ピクセルå˜ä½ã§æŒ‡å®šã€‚"
+
+msgid ""
+"``color``\n"
+" Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+"``color``\n"
+" ブランãƒã«ãŠã‘ã‚‹ç·šã®è‰²ã‚’〠16進 RGB 表記ã§æŒ‡å®šã€‚"
+
+msgid ""
+"``hooks``\n"
+"---------"
+msgstr ""
+"``hooks``\n"
+"---------"
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string. Hooks can be prioritized\n"
+"by adding a prefix of ``priority`` to the hook name on a new line\n"
+"and setting the priority. The default priority is 0 if\n"
+"not specified."
+msgstr ""
+"commit ã®é–‹å§‹ï¼çµ‚了ã¨ã„ã£ãŸæ§˜ã€…ãªå‡¦ç†å¥‘æ©Ÿã«ãŠã„ã¦ã€\n"
+"自動実行ã•ã‚Œã‚‹ã‚³ãƒžãƒ³ãƒ‰ã€ãªã„ã— Python 関数。 \n"
+"処ç†å¥‘æ©Ÿåã«æŽ¥å°¾è¾ž (suffix) を追加ã—ãŸè¨˜è¿°ã‚’ã™ã‚‹äº‹ã§ã€\n"
+"åŒä¸€å‡¦ç†å¥‘æ©Ÿã«è¤‡æ•°ã®ãƒ•ãƒƒã‚¯ã‚’実行å¯èƒ½ã§ã™ã€‚\n"
+"å…ˆã«èª­ã¿è¾¼ã¾ã‚ŒãŸè¨­å®š (例: ホスト毎設定) ã«ãŠã‘るフック設定ã¯ã€\n"
+"別ãªå€¤ã‚’設定ã™ã‚‹ã‹ã€ 空値ã®è¨­å®šã«ã‚ˆã‚Šã€ 上書ãå¯èƒ½ã§ã™ã€‚\n"
+"フックåã®å‰ã« ``priority`` を追加ã—ãŸè¨­å®šå€¤ã‚’æ–°ãŸã«å®šç¾©ã—ã€\n"
+"値を設定ã™ã‚‹ã“ã¨ã§ã€ フック実行ã®å„ªå…ˆåº¦ã‚’設定ã§ãã¾ã™ã€‚\n"
+"デフォルトã®å„ªå…ˆåº¦è¨­å®šå€¤ã¯ 0 ã§ã™ã€‚\n"
+"(※ 訳注: 優先度値ãŒå¤§ãã„フックã®æ–¹ãŒå…ˆã«å®Ÿè¡Œã•ã‚Œã¾ã™)"
+
+msgid "Example ``.hg/hgrc``::"
+msgstr "``.hg/hgrc`` 設定例を以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # force autobuild hook to run before other incoming hooks\n"
+" priority.incoming.autobuild = 1"
+msgstr ""
+" [hooks]\n"
+" # æ›´æ–°ã®å–ã‚Šè¾¼ã¿æ¯Žã«ä½œæ¥­é ˜åŸŸã‚’æ›´æ–°\n"
+" changegroup.update = hg update\n"
+" # ホスト毎設定ã®ç„¡åŠ¹åŒ–\n"
+" incoming =\n"
+" \n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # ä»–ã® incoming ã«å…ˆç«‹ã£ã¦ autobuild フックを実行\n"
+" priority.incoming.autobuild = 1"
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+"殆ã©ã®ãƒ•ãƒƒã‚¯ã¯ã€ 有用ãªä»˜åŠ æƒ…報をæŒã¤ç’°å¢ƒå¤‰æ•°è¨­å®šã¨å…±ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+"以下ã«ç¤ºã™ãƒ•ãƒƒã‚¯ç¾¤ã«æ¸¡ã•ã‚Œã‚‹ç’°å¢ƒå¤‰æ•°ã¯ ``$HG_foo`` å½¢å¼ã®åå‰ã‚’æŒã¡ã¾ã™ã€‚"
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+"``changegroup``\n"
+" push〠pull〠unbundle ã«ã‚ˆã‚‹ãƒªãƒ“ジョン群ã®è¿½åŠ å®Œäº†æ™‚ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" æ–°è¦è¿½åŠ ãƒªãƒ“ジョン群ã®æœ€åˆã® ID ㌠``$HG_NODE`` ã«ã€\n"
+" 追加リビジョン群ã®å–ã‚Šè¾¼ã¿å…ƒ URL ㌠``$HG_URL`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" (※ 訳注: 複数リビジョン一括追加時㮠``changegroup``\n"
+" フック実行ã¯1回ã§ã™ãŒã€ ``incoming`` フックã¯ãƒªãƒ“ジョン毎ã«å®Ÿè¡Œã•ã‚Œã¾ã™)"
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``commit``\n"
+" 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹æ–°è¦ãƒªãƒ“ジョン作æˆå®Œäº†æ™‚ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" æ–°è¦ä½œæˆãƒªãƒ“ジョン㮠ID ㌠``$HG_NODE`` ã«ã€è¦ªãƒªãƒ“ジョン㮠ID ãŒ\n"
+" ``$HG_PARENT1`` ãŠã‚ˆã³ ``$HG_PARENT2`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+"``incoming``\n"
+" push〠pull〠unbundle ã«ã‚ˆã‚‹ãƒªãƒ“ジョンã®è¿½åŠ å®Œäº†æ™‚ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" æ–°è¦è¿½åŠ ãƒªãƒ“ジョンã®æœ€åˆã® ID ㌠``$HG_NODE`` ã«ã€\n"
+" 追加リビジョンã®å–ã‚Šè¾¼ã¿å…ƒ URL ㌠``$HG_URL`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" (※ 訳注: 複数リビジョン一括追加時㮠``changegroup``\n"
+" フック実行ã¯1回ã§ã™ãŒã€ ``incoming`` フックã¯ãƒªãƒ“ジョン毎ã«å®Ÿè¡Œã•ã‚Œã¾ã™)"
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+"``outgoing``\n"
+" 他リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›´å映完了後ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" æ–°è¦è¿½åŠ ãƒªãƒ“ジョン群ã®æœ€åˆã® ID ㌠``$HG_NODE`` ã«ã€\n"
+" æ“作実施契機㌠``$HG_SOURCE`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" \"preoutgoing\" フックã®èª¬æ˜Žã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+"``post-<コマンドå>``\n"
+" 指定コマンドãŒæ­£å¸¸çµ‚了ã—ãŸéš›ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 当該コマンド実行ã®å¼•æ•°ãŒ ``$HG_ARGS`` ã«ã€\n"
+" 終了コード㌠``$HG_RESULT`` ã«ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" 当該コマンドã®å†…部処ç†ã«æ¸¡ã•ã‚Œã‚‹ã€ コマンド実行時引数ã®è§£æžçµæžœãŒã€\n"
+" ``$HG_PATS`` ãŠã‚ˆã³ ``$HG_OPTS`` ã«è¨­å®šã•ã‚Œã¾ã™ãŒã€\n"
+" ã“れらã«è¨­å®šã•ã‚Œã‚‹å€¤ã¯ã€ 内部的㪠Python データ形å¼ã®æ–‡å­—列ã§ã™ã€‚\n"
+" ``$HG_OPTS`` ã¯ã‚ªãƒ—ションã®è¾žæ›¸å½¢å¼ (無指定オプションã¯ã€\n"
+" デフォルト値ãŒè¨­å®šã•ã‚ŒãŸçŠ¶æ…‹)〠``$HG_PATS`` ã¯å¼•æ•°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚\n"
+" フック自身ã®å®Ÿè¡Œå¤±æ•—ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+"``pre-<コマンドå>``\n"
+" 指定コマンドã®å®Ÿè¡Œå‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 当該コマンド実行ã®å¼•æ•°ãŒ ``$HG_ARGS`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" 当該コマンドã®å†…部処ç†ã«æ¸¡ã•ã‚Œã‚‹ã€ コマンド実行時引数ã®è§£æžçµæžœãŒã€\n"
+" ``$HG_PATS`` ãŠã‚ˆã³ ``$HG_OPTS`` ã«è¨­å®šã•ã‚Œã¾ã™ãŒã€\n"
+" ã“れらã«è¨­å®šã•ã‚Œã‚‹å€¤ã¯ã€ 内部的㪠Python データ形å¼ã®æ–‡å­—列ã§ã™ã€‚\n"
+" ``$HG_OPTS`` ã¯ã‚ªãƒ—ションã®è¾žæ›¸å½¢å¼ (無指定オプションã¯ã€\n"
+" デフォルト値ãŒè¨­å®šã•ã‚ŒãŸçŠ¶æ…‹)〠``$HG_PATS`` ã¯å¼•æ•°ã®ãƒªã‚¹ãƒˆã§ã™ã€‚\n"
+" フック実行ãŒå¤±æ•—ã—ãŸå ´åˆã€ 当該コマンドã¯å®Ÿè¡Œã•ã‚Œãšã€\n"
+" Mercurial ã¯å®Ÿè¡Œå¤±æ•—ã®çµ‚了コードを返ã—ã¾ã™ã€‚"
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+"``prechangegroup``\n"
+" push〠pull〠unbundle ã«ã‚ˆã‚‹ãƒªãƒ“ジョン群ã®è¿½åŠ å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 終了コード 0 ã¯ã€ 処ç†ã®ç¶™ç¶šã‚’æ„味ã—ã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ push〠pull〠unbundle ã®ä¸­æ–­ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" 追加リビジョン群ã®å–ã‚Šè¾¼ã¿å…ƒ URL ㌠``$HG_URL`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``precommit``\n"
+" 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹æ–°è¦ãƒªãƒ“ジョン作æˆå‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 終了コード 0 ã¯ã€ 処ç†ã®ç¶™ç¶šã‚’æ„味ã—ã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ commit ã®ä¸­æ–­ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" 親リビジョン㮠ID ãŒ\n"
+" ``$HG_PARENT1`` ãŠã‚ˆã³ ``$HG_PARENT2`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+"``prelistkeys``\n"
+" pushkey (bookmark ã®ã‚ˆã†ãªã‚‚ã®) ã®ä¸€è¦§å–å¾—å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ 処ç†ã®ä¸­æ–­ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" キーã®åå‰ç©ºé–“㌠``$HG_NAMESPACE`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+"``preoutgoing``\n"
+" 他リãƒã‚¸ãƒˆãƒªã¸ã®å¤‰æ›´å映ã«ãŠã„ã¦ã€ 対象リビジョン確定å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ 処ç†ã®ä¸­æ–­ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" 本フックã«ã‚ˆã£ã¦ã€ HTTP ã‚„ SSH 経由ã§ã®å¤‰æ›´å映を抑止å¯èƒ½ã§ã™ã€‚\n"
+" ローカルホスト上ã®ãƒªãƒã‚¸ãƒˆãƒªé–“ã§ã® pull ã‚„ push ãªã„ã— bundle\n"
+" コマンドも抑止å¯èƒ½ã§ã™ãŒã€ ファイルãã®ã‚‚ã®ã®ã‚³ãƒ”ーãŒå¯èƒ½ã§ã™ã‹ã‚‰ã€\n"
+" 実質的ãªæŠ‘止効果ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+" æ“作実施契機㌠``$HG_SOURCE`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" ã“ã®ç’°å¢ƒå¤‰æ•°ã« \"serve\" ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+" SSH ãªã‚Š HTTP を経由ã—ãŸé éš”ホストå´ãŒã€ 処ç†å¥‘æ©Ÿã¨ãªã£ã¦ã„ã¾ã™ã€‚\n"
+" \"push\"〠\"pull\" ãªã„ã— \"bundle\" ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+" åŒä¸€ãƒ›ã‚¹ãƒˆä¸Šã®ãƒªãƒã‚¸ãƒˆãƒªãŒå‡¦ç†å¥‘æ©Ÿã¨ãªã£ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+"``prepushkey``\n"
+" pushkey (bookmark ã®ã‚ˆã†ãªã‚‚ã®) ã®å–ã‚Šè¾¼ã¿å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ å–ã‚Šè¾¼ã¿æ‹’å¦ã‚’æ„味ã—ã¾ã™ã€‚\n"
+" キーã®åå‰ç©ºé–“㌠``$HG_NAMESPACE`` ã«ã€\n"
+" キー㌠``$HG_KEY`` ã«ã€\n"
+" (æ›´æ–°ã®å ´åˆã¯) 旧値㌠``$HG_OLD`` ã«ã€\n"
+" 新値㌠``$HG_NEW`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``pretag``\n"
+" ã‚¿ã‚°ã®æ–°è¦ç”Ÿæˆå‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 終了コード㌠0 ã®å ´åˆã€ ã‚¿ã‚°ã®ç”ŸæˆãŒè¨±å¯ã•ã‚Œã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã¯ã€ タグ生æˆã‚’中断ã—ã¾ã™ã€‚\n"
+" タグ付ã‘対象リビジョン㮠ID ㌠``$HG_NODE`` ã«ã€\n"
+" ã‚¿ã‚°å㌠``$HG_TAG`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" ローカルタグã®å ´åˆã¯ ``$HG_LOCAL=1`` ã«ã€\n"
+" 通常ã®ã‚¿ã‚°ã®å ´åˆã¯ ``$HG_LOCAL=0`` ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+"``pretxnchangegroup``\n"
+" push〠pull〠unbundle ã«ã‚ˆã‚‹ãƒªãƒ“ジョン群ã®è¿½åŠ å®Œäº†ã®éš›ã«ã€\n"
+" トランザクションãŒå®Œäº†ã™ã‚‹å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 追加ã•ã‚Œã‚‹ãƒªãƒ“ジョン群ã¯ã€ フックã‹ã‚‰å‚ç…§å¯èƒ½ã§ã™ã€‚\n"
+" ãã®ãŸã‚〠追加ãŒç¢ºå®šã™ã‚‹å‰ã«ã€ 対象リビジョン群ã®å†…容を検証å¯èƒ½ã§ã™ã€‚\n"
+" æ–°è¦è¿½åŠ ãƒªãƒ“ジョン群ã®æœ€åˆã® ID ㌠``$HG_NODE`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" 終了コード㌠0 ã®å ´åˆã€ トランザクションãŒç¢ºå®šã—ã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã®å ´åˆã€ トランザクションãŒå·»ã戻ã•ã‚Œã€\n"
+" push〠pull〠unbundle ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" 追加リビジョンã®å–ã‚Šè¾¼ã¿å…ƒ URL 㯠``$HG_URL`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``pretxncommit``\n"
+" æ–°è¦ãƒªãƒ“ジョン作æˆã®éš›ã«ã€\n"
+" トランザクションãŒå®Œäº†ã™ã‚‹å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 追加ã•ã‚Œã‚‹ãƒªãƒ“ジョンã¯ã€ フックã‹ã‚‰å‚ç…§å¯èƒ½ã§ã™ã€‚\n"
+" ãã®ãŸã‚〠コミットログや〠変更内容ã®æ¤œè¨¼ãŒå¯èƒ½ã§ã™ã€‚\n"
+" 終了コード㌠0 ã®å ´åˆã€ トランザクションãŒç¢ºå®šã—ã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã®å ´åˆã€ トランザクションãŒå·»ã戻ã•ã‚Œã¾ã™ã€‚\n"
+" æ–°è¦è¿½åŠ ãƒªãƒ“ジョン㮠ID ㌠``$HG_NODE`` ã«ã€\n"
+" 親リビジョン㮠ID ãŒ\n"
+" ``$HG_PARENT1`` ãŠã‚ˆã³ ``$HG_PARENT2`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+"``preupdate``\n"
+" 作業領域ã®æ›´æ–°å‰ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 終了コード㌠0 ã®å ´åˆã€ 更新処ç†ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚\n"
+" éž 0 ã®çµ‚了コードã®å ´åˆã€ 更新処ç†ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。\n"
+" 更新対象リビジョン㮠ID ㌠``$HG_PARENT1`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" マージ契機ã®æ›´æ–°å‡¦ç†ã®å ´åˆã€ 第2親リビジョン㮠ID ãŒ\n"
+" ``$HG_PARENT2`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+"``listkeys``\n"
+" pushkey (bookmark ã®ã‚ˆã†ãªã‚‚ã®) ã®ä¸€è¦§å–得後ã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" キーã®åå‰ç©ºé–“㌠``$HG_NAMESPACE`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" ``$HG_VALUES`` ã«ã¯ã€ キーã¨å€¤ã‹ã‚‰ãªã‚‹è¾žæ›¸æƒ…å ±ãŒè¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+"``pushkey``\n"
+" pushkey (bookmark ã®ã‚ˆã†ãªã‚‚ã®) ã®å–ã‚Šè¾¼ã¿å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" キーã®åå‰ç©ºé–“㌠``$HG_NAMESPACE`` ã«ã€\n"
+" キー㌠``$HG_KEY`` ã«ã€\n"
+" (æ›´æ–°ã®å ´åˆã¯) 旧値㌠``$HG_OLD`` ã«ã€\n"
+" 新値㌠``$HG_NEW`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``tag``\n"
+" ã‚¿ã‚°ã®æ–°è¦ç”Ÿæˆå¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" タグ付ã‘対象リビジョン㮠ID ㌠``$HG_NODE`` ã«ã€\n"
+" ã‚¿ã‚°å㌠``$HG_TAG`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" ローカルタグã®å ´åˆã¯ ``$HG_LOCAL=1`` ã«ã€\n"
+" 通常ã®ã‚¿ã‚°ã®å ´åˆã¯ ``$HG_LOCAL=0`` ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+"``update``\n"
+" 作業領域ã®æ›´æ–°å¾Œã«å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+" 更新対象リビジョン㮠ID ㌠``$HG_PARENT1`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" マージ契機ã®æ›´æ–°å‡¦ç†ã®å ´åˆã€ 第2親リビジョン㮠ID ãŒ\n"
+" ``$HG_PARENT2`` ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" 更新処ç†ãŒæˆåŠŸã—ãŸå ´åˆã¯ ``$HG_ERROR=0`` ã«ã€\n"
+" 失敗ã—ãŸå ´åˆ (例: è¡çªè§£æ¶ˆã®å¤±æ•—ç­‰) 㯠``$HG_ERROR=1`` ãŒè¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+".. note:: コマンド実行ã«å¯¾ã™ã‚‹ pre- ãªã„ã— post- 付ãã®æ±Žç”¨ãƒ•ãƒƒã‚¯ã¯ã€\n"
+" トランザクション確定ã®æˆå¦ã«å½±éŸ¿ã—ãªã„状æ³ã§å‘¼ã°ã‚Œã‚‹ãŸã‚ã€\n"
+" 汎用フックを使用ã™ã‚‹æ–¹ãŒãŠå‹§ã‚ã§ã™ã€‚\n"
+" \"commit\" ã®ã‚ˆã†ãªãƒ•ãƒƒã‚¯ã¯ã€ :hg:`commit` 実行以外ã«ã‚‚ã€\n"
+" リビジョンを作æˆã™ã‚‹å¥‘æ©Ÿ (例: :hg:`tag`) å…¨ã¦ã«ãŠã„ã¦å‘¼ã°ã‚Œã¾ã™ã€‚"
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+".. note:: Windows ã®ã‚ˆã†ãªç’°å¢ƒã§ã¯ã€ 空値ã®ç’°å¢ƒå¤‰æ•°ãŒã€\n"
+" 引ã渡ã•ã‚Œãªã„å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ 例ãˆã°ã€ éžãƒžãƒ¼ã‚¸ãƒªãƒ“ジョンã®å ´åˆã€\n"
+" Unix 系環境ã§ã¯ç©ºå€¤ã® ``$HG_PARENT2`` ãŒå¼•ã渡ã•ã‚Œã¾ã™ãŒã€\n"
+" Windows 環境ã§ã¯ã€ 環境変数自身ã®å¼•æ¸¡ã—ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr "Python 関数ã®ãƒ•ãƒƒã‚¯æŒ‡å®šæ–‡æ³•ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+" フックå = python:モジュールå.サブモジュールå.関数å\n"
+" フックå = python:/モジュール/ファイル/ã¸ã®/パス.py:関数å"
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+"Python 関数ã®ãƒ•ãƒƒã‚¯ã¯ã€ Mercurial プロセス内部ã§å®Ÿè¡Œã•ã‚Œã¾ã™ã€‚\n"
+"å„フックã®èµ·å‹•ã§ã¯ã€ 最低ã§ã‚‚3ã¤ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰å¼•æ•°ãŒæ¸¡ã•ã‚Œã¾ã™ã€‚\n"
+"ui オブジェクト (``ui`` キーワード)ã€\n"
+"repository オブジェクト (``repo`` キーワード)ã€\n"
+"フック起動種別を示㙠``hooktype`` キーワードã®3ã¤ã§ã™ã€‚\n"
+"フックã®èª¬æ˜Žã§ç¤ºã—ãŸç’°å¢ƒå¤‰æ•°ã¯ã€\n"
+"``HG_`` ç„¡ã—ã§ã€ 且ã¤å°æ–‡å­—表記ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’使用ã—ãŸã€\n"
+"キーワード引数ã¨ã—ã¦æ¸¡ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+"Python 関数フックã®æˆ»ã‚Šå€¤ãŒ \"true\" 相当値ã‹ã€\n"
+"実行中ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ãŸå ´åˆã€ 処ç†å¤±æ•—ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+"(※ 訳注: 失敗ã®å ´åˆã« \"true\" ã§ã‚る点ã«æ³¨æ„)"
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+"既知㮠HTTPS サーãƒè¨¼æ˜Žæ›¸ã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リント (fingerprint) 記述。\n"
+"本セクションã«è¨˜è¿°ã®ã‚るサーãƒã¨ HTTPS ã§æŽ¥ç¶šã™ã‚‹å ´åˆã€\n"
+"サーãƒè¨¼æ˜Žæ›¸ã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リントãŒã€ 記述ã¨ä¸€è‡´ã—ãªã‘ã‚Œã°ã€\n"
+"接続失敗ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ ssh ã«ãŠã‘ã‚‹ ``known_hosts`` 設定ã«ç›¸å½“ã—ã¾ã™ã€‚\n"
+"フィンガープリントã¯ã€ DER 符å·åŒ–ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã® SHA-1 ãƒãƒƒã‚·ãƒ¥å€¤ã§ã™ã€‚\n"
+"フィンガープリント指定ã®ã‚るサーãƒã¨ã®æŽ¥ç¶šã®å ´åˆã€\n"
+"CA 連鎖ã®ç¢ºèªã‚„ web.cacerts 設定ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid "For example::"
+msgstr "記述例を以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr "本機能ã¯ã€ Python 2.6 以é™ã§ã®ã¿ä½¿ç”¨å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+msgstr ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+"ウェブベース㮠Mercurial リãƒã‚¸ãƒˆãƒªã‚¢ã‚¯ã‚»ã‚¹ã§ä½¿ç”¨ã•ã‚Œã‚‹\n"
+"HTTP プロキシ設定。"
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+"``host``\n"
+" プロキシサーãƒã®ãƒ›ã‚¹ãƒˆå㨠(çœç•¥å¯èƒ½ãª) ãƒãƒ¼ãƒˆç•ªå·ã€‚\n"
+" 設定例: \"myproxy:8000\""
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+"``no``\n"
+" çœç•¥å¯èƒ½ã€‚ プロキシを使用「ã—ãªã„ã€ãƒ›ã‚¹ãƒˆå一覧 (カンマ区切り)"
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+"``passwd``\n"
+" çœç•¥å¯èƒ½ã€‚ プロキシサーãƒã®èªè¨¼ç”¨ãƒ‘スワード。"
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+"``user``\n"
+" çœç•¥å¯èƒ½ã€‚ プロキシサーãƒã®èªè¨¼ç”¨ãƒ¦ãƒ¼ã‚¶å。"
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+"``always``\n"
+" çœç•¥å¯èƒ½ã€‚ ``http_proxy.no`` を無視ã—ã¦ã€ プロキシを常用ã™ã‚‹ã‹å¦ã‹ã€‚\n"
+" 真å½å€¤ã€‚ デフォルト値: False"
+
+msgid ""
+"``merge-patterns``\n"
+"------------------"
+msgstr ""
+"``merge-patterns``\n"
+"------------------"
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+"特定ã®ãƒ•ã‚¡ã‚¤ãƒ«åパターンã¨ã€ マージツールã®é–¢é€£ä»˜ã‘。\n"
+"本セクションã§ã®é–¢é€£ä»˜ã‘ã¯ã€ デフォルトã®ãƒžãƒ¼ã‚¸ãƒ„ールé¸æŠžã«å„ªå…ˆã—ã¾ã™ã€‚\n"
+"デフォルトã®ãƒ‘ターン指定形å¼ã¯ã€ 作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+"パス先頭ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ã§åˆ¤å®šã™ã‚‹ã€ãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰å½¢å¼ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+
+msgid ""
+"``merge-tools``\n"
+"---------------"
+msgstr ""
+"``merge-tools``\n"
+"---------------"
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr "ファイルå˜ä½ã®ãƒžãƒ¼ã‚¸ã‚’è¡Œã†å¤–部マージツールã®è¨­å®šã€‚"
+
+msgid "Example ``~/.hgrc``::"
+msgstr "``~/.hgrc`` ã§ã®è¨­å®šä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+" [merge-tools]\n"
+" # 既存ツールã®å®Ÿè¡Œãƒ‘スを標準ã®ã‚‚ã®ã‹ã‚‰å¤‰æ›´\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # コマンド行形å¼ã®æŒ‡å®š\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # 優先順ä½ã‚’高ã設定\n"
+" kdiff3.priority = 1"
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+" # 固有ツールã®è¨­å®š\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+"``priority``\n"
+" 当該ツールをé¸æŠžã™ã‚‹éš›ã®å„ªå…ˆé †ä½ã€‚ デフォルト値: 0"
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+"``executable``\n"
+" 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«åãªã„ã—パスå。 Windows 環境ã§ã¯ã€\n"
+" ${ProgramFiles} 環境変数を併用ã—ãŸè¨˜è¿°ãŒä½¿ç”¨å¯èƒ½ã§ã™ã€‚\n"
+" デフォルト値: ツールåãŒè‡ªå‹•çš„ã«è¨­å®š"
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+"``args``\n"
+" 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã«æ¸¡ã•ã‚Œã‚‹å¼•æ•°ã€‚ ``$base``〠``$local``〠``$other``\n"
+" ãŠã‚ˆã³ ``$output`` ã¨ã„ã†è¨˜è¿°ã§ã€ マージ対象ファイル群やã€\n"
+" çµæžœãƒ•ã‚¡ã‚¤ãƒ«ã‚’指定å¯èƒ½ã§ã™ã€‚ デフォルト値: ``$local $base $other``"
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+"``premerge``\n"
+" 外部ツール起動å‰ã®ã€ éžå¯¾è©±çš„ãªå†…部 3-way マージツール実行ã®æœ‰ç„¡ã€‚\n"
+" ``true`` ãŠã‚ˆã³ ``false`` 以外ã«ã€ 事å‰ãƒžãƒ¼ã‚¸ãŒå¤±æ•—ã—ãŸå ´åˆã«ã€\n"
+" マージマークを残ã—ãŸã¾ã¾ã«ã™ã‚‹ ``keep`` を指定å¯èƒ½ã§ã™ã€‚\n"
+" デフォルト値: True"
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+"``binary``\n"
+" 当該ツールã«ã‚ˆã‚‹ã€ ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒžãƒ¼ã‚¸å¯å¦ã€‚ デフォルト値㯠False\n"
+" ã§ã™ãŒã€ ツールã®é¸æŠžãŒã€ ファイルパターンã®åˆè‡´ã§å®Ÿæ–½ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" ã“ã®è¨­å®šå€¤ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+"``symlink``\n"
+" 当該ツールã«ã‚ˆã‚‹ã€ シンボリックリンクã®ãƒžãƒ¼ã‚¸å¯å¦ã€‚ デフォルト値㯠False\n"
+" ã§ã™ãŒã€ ツールã®é¸æŠžãŒã€ ファイルパターンã®åˆè‡´ã§å®Ÿæ–½ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" ã“ã®è¨­å®šå€¤ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+"``check``\n"
+" マージæˆå¦åˆ¤å®šæ–¹å¼ã®é¸æŠžä¸€è¦§ (複数指定å¯èƒ½):"
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+" ``changed``\n"
+" マージçµæžœã¨ä»¥å‰ã®å†…容ã«å·®åˆ†ãŒç„¡ã„å ´åˆã€ マージæˆå¦ã‚’å•ã„åˆã‚ã›ã€‚\n"
+" ``conflicts``\n"
+" ツールã®æˆ»ã‚Šå€¤ãŒãƒžãƒ¼ã‚¸æˆåŠŸã‚’示ã™å ´åˆã§ã‚‚〠è¡çªãƒžãƒ¼ã‚¯ã®æœ‰ç„¡ã‚’確èªã€‚\n"
+" ``prompt``\n"
+" ツールã®æˆ»ã‚Šå€¤ãŒãƒžãƒ¼ã‚¸æˆåŠŸã‚’示ã™å ´åˆã§ã‚‚〠常ã«ãƒžãƒ¼ã‚¸æˆå¦ã‚’å•ã„åˆã‚ã›ã€‚"
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+"``checkchanged``\n"
+" 本設定を True ã«ã™ã‚‹ã®ã¯ã€ ``check = changed`` 設定ã¨ç­‰ä¾¡ã§ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+"``checkconflicts``\n"
+" 本設定を True ã«ã™ã‚‹ã®ã¯ã€ ``check = conflicts`` 設定ã¨ç­‰ä¾¡ã§ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+"``fixeol``\n"
+" マージツールã®å®Ÿè¡Œã«ã‚ˆã‚‹ EOL å½¢å¼å¤‰æ›´ã®æ˜¯æ­£ã®æœ‰ç„¡ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+"``gui``\n"
+" 当該ツール実行ã«ãŠã‘ã‚‹ GUI 表示ã®è¦å¦ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+"``regkey``\n"
+" 当該ツールã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ä½ç½®ã‚’ä¿æŒã™ã‚‹ Windows レジストリキー。\n"
+" Mercurial 㯠``HKEY_CURRENT_USER`` ãªã„ã— ``HKEY_LOCAL_MACHINE``\n"
+" é…下ã®å½“該キーã®æœ‰ç„¡ã‚’〠ã“ã®é †åºã§ç¢ºèªã—ã¾ã™ã€‚\n"
+" デフォルト値: None"
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+"``regkeyalt``\n"
+" 指定ã•ã‚ŒãŸãƒ¬ã‚¸ã‚¹ãƒˆãƒªã‚­ãƒ¼ä¸åœ¨æ™‚ã®ã€ 代替 Windows レジストリキー。\n"
+" ``regname`` ãŠã‚ˆã³ ``regappend`` ã«ã‚ˆã‚‹æ”¹å¤‰ã¯ã€\n"
+" 代替キーã§ã‚‚実施ã•ã‚Œã¾ã™ã€‚ 典型的ãªç”¨é€”ã¯ã€\n"
+" 64 ビット環境ã«ãŠã‘ã‚‹ 32 ビットアプリã®æ¤œç´¢ã§ã™ã€‚\n"
+" デフォルト値: None"
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+"``regname``\n"
+" 当該レジストリキーã‹ã‚‰èª­ã¿å‡ºã™å€¤ã®åå‰ã€‚ デフォルト値ã¯ã€\n"
+" ``(既定)`` ã‹ã‚‰ã®èª­ã¿å‡ºã—ã§ã™ã€‚"
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+"``regappend``\n"
+" 当該レジストリキーã‹ã‚‰ã®èª­ã¿å‡ºã—値ã«ä»˜åŠ ã™ã‚‹å€¤ã€‚ 典型的ãªè¨­å®šå€¤ã¯ã€\n"
+" ツールã®å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«åã§ã™ã€‚\n"
+" デフォルト値: None"
+
+msgid ""
+"\n"
+"``patch``\n"
+"---------"
+msgstr ""
+"\n"
+"``patch``\n"
+"---------"
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+":hg:`import` ã‚„ Mercurial Queues (MQ) エクステンション等ã«ã‚ˆã‚‹ã€\n"
+"パッãƒé©ç”¨ã«é–¢ã™ã‚‹è¨­å®šã€‚"
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+"``eol``\n"
+" 'strict' ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ パッãƒãƒ•ã‚¡ã‚¤ãƒ«ã¨ã€\n"
+" パッãƒå¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 行末形å¼ãŒãã®ã¾ã¾ç¶­æŒã•ã‚Œã¾ã™ã€‚\n"
+" ``lf`` ãªã„ã— ``crlf`` ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€\n"
+" パッãƒãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ‘ッãƒå¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ 行末形å¼ãŒç„¡è¦–ã•ã‚Œã€\n"
+" LF (Unix å½¢å¼) ãªã„ã— CRLF (Windows å½¢å¼) ã«æ­£è¦åŒ–ã•ã‚Œã¾ã™ã€‚\n"
+" ``auto`` ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€\n"
+" パッãƒãƒ•ã‚¡ã‚¤ãƒ«ã®è¡Œæœ«å½¢å¼ã¯ç„¡è¦–ã•ã‚Œã¾ã™ãŒã€\n"
+" パッãƒå¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã®è¡Œæœ«å½¢å¼ã¯ã€ ファイル毎ã®è¨­å®šã§æ­£è¦åŒ–ã•ã‚Œã¾ã™ã€‚\n"
+" 対象ファイルãŒå­˜åœ¨ã—ãªã„ã‹ã€ 改行をå«ã¾ãªã„å ´åˆã€\n"
+" パッãƒãƒ•ã‚¡ã‚¤ãƒ«ã®è¡Œæœ«å½¢å¼ãŒãã®ã¾ã¾ç¶­æŒã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: strict"
+
+msgid ""
+"\n"
+"``paths``\n"
+"---------"
+msgstr ""
+"\n"
+"``paths``\n"
+"---------"
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+"リãƒã‚¸ãƒˆãƒªã¸ã®ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãªåå‰ã®å‰²ã‚Šå½“ã¦è¨­å®šã€‚\n"
+"設定記述ã®å·¦è¾ºã«ã‚·ãƒ³ãƒœãƒ«åã‚’ã€\n"
+"å³è¾ºã«ãƒªãƒã‚¸ãƒˆãƒªä½ç½®ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€\n"
+"ãªã„ã— URL を記述ã—ã¾ã™ã€‚\n"
+"連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªæŒ‡å®šãŒç„¡ã„å ´åˆã§ã‚‚ã€\n"
+"以下ã®ã‚·ãƒ³ãƒœãƒ«ã‚’設定ã™ã‚‹ã“ã¨ã§ã€\n"
+"パス指定ãŒå¯èƒ½ã§ã™ã€‚ (※ 訳注: :hg:`help urls` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„)"
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+"``default``\n"
+" 連æºå…ˆæŒ‡å®šãŒç„¡ã„å ´åˆã«ã€ :hg:`pull` ã«é¡žã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã®ã€\n"
+" 連æºå¯¾è±¡ã¨ãªã‚‹ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ ãªã„ã— URL。\n"
+" 当該リãƒã‚¸ãƒˆãƒªãŒ :hg:`clone` ã§ç”Ÿæˆã•ã‚ŒãŸå ´åˆã€\n"
+" 複製元リãƒã‚¸ãƒˆãƒªã® URL ãŒè‡ªå‹•çš„ã«è¨­å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+"``default-push``\n"
+" 連æºå…ˆæŒ‡å®šãŒç„¡ã„å ´åˆã«ã€ :hg:`push` ã«é¡žã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã®ã€\n"
+" 連æºå¯¾è±¡ã¨ãªã‚‹ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ ãªã„ã— URL。"
+
+msgid ""
+"``phases``\n"
+"----------"
+msgstr ""
+"``phases``\n"
+"----------"
+
+msgid ""
+"Specifies default handling of phases. See :hg:`help phases` for more\n"
+"information about working with phases."
+msgstr ""
+"デフォルト時ã®ãƒ•ã‚§ãƒ¼ã‚ºã®å–り扱ã„設定。\n"
+"フェーズæ“作ã«é–¢ã™ã‚‹è©³ç´°ã¯ :hg:`help phases` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``publish``\n"
+" Controls draft phase behavior when working as a server. When true,\n"
+" pushed changesets are set to public in both client and server and\n"
+" pulled or cloned changesets are set to public in the client.\n"
+" Default: True"
+msgstr ""
+"``publish``\n"
+" サーãƒã¨ã—ã¦æ©Ÿèƒ½ã™ã‚‹éš›ã®ã€ draft フェーズã«å¯¾ã™ã‚‹æŒ™å‹•ã®è¨­å®šã€‚\n"
+" True ã®å ´åˆã€ クライアントã‹ã‚‰å映ã•ã‚ŒãŸãƒªãƒ“ジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã¯ã€\n"
+" クライアントï¼ã‚µãƒ¼ãƒåŒæ–¹ã§ public 化ã•ã‚Œã€ クライアントã«å–ã‚Šè¾¼ã¿ã€\n"
+" ãªã„ã—複製ã•ã‚ŒãŸãƒªãƒ“ジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã¯ã€ クライアントå´ã§ã®ã¿ public\n"
+" 化ã•ã‚Œã¾ã™ã€‚デフォルト値: True"
+
+msgid ""
+"``new-commit``\n"
+" Phase of newly-created commits.\n"
+" Default: draft"
+msgstr ""
+"``new-commit``\n"
+" æ–°è¦ä½œæˆã•ã‚Œã‚‹ãƒªãƒ“ジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã€‚\n"
+" デフォルト値: draft"
+
+msgid ""
+"``profiling``\n"
+"-------------"
+msgstr ""
+"``profiling``\n"
+"-------------"
+
+msgid ""
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+"プロファイリングã®ç¨®åˆ¥ã€ å½¢å¼ãŠã‚ˆã³å‡ºåŠ›å…ˆã®è¨­å®šã€‚ 指定å¯èƒ½ãªç¨®åˆ¥ã¯ã€\n"
+"精密プロファイル (å称: ``ls``) ã¨ã€ サンプリングプロファイル (å称:\n"
+"``stat``) ã®2種類ã§ã™ã€‚"
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+"以下ã®èª¬æ˜Žã§ã¯ã€ プロファイル期間ã«æŽ¡å–ã•ã‚Œã‚‹ç”Ÿãƒ‡ãƒ¼ã‚¿ã®äº‹ã‚’\n"
+"'プロファイルデータ'〠プロファイルデータを元ã«ã—ãŸã€\n"
+"テキスト形å¼ã®çµ±è¨ˆå ±å‘Šã‚’ 'プロファイル報告' ã¨å‘¼ç§°ã—ã¾ã™ã€‚\n"
+"プロファイル採å–ã«ã¯ã€ lsprof ãŒç”¨ã„られã¾ã™ã€‚"
+
+msgid ""
+"``type``\n"
+" The type of profiler to use.\n"
+" Default: ls."
+msgstr ""
+"``type``\n"
+" 使用ã™ã‚‹ãƒ—ロファイラ種別。 デフォルト値: ls."
+
+msgid ""
+" ``ls``\n"
+" Use Python's built-in instrumenting profiler. This profiler\n"
+" works on all platforms, but each line number it reports is the\n"
+" first line of a function. This restriction makes it difficult to\n"
+" identify the expensive parts of a non-trivial function.\n"
+" ``stat``\n"
+" Use a third-party statistical profiler, statprof. This profiler\n"
+" currently runs only on Unix systems, and is most useful for\n"
+" profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+" ``ls``\n"
+" Python 組ã¿è¾¼ã¿ã®è©³ç´°ãƒ—ロファイラ。 ã©ã®ç’°å¢ƒã§ã‚‚利用ã§ãã¾ã™ãŒã€\n"
+" 報告ã•ã‚Œã‚‹è¡Œç•ªå·ã¯ã€ 常ã«é–¢æ•°ã®å†’é ­è¡Œã«å›ºå®šã•ã‚Œã¾ã™ã€‚ ãã®ãŸã‚ã€\n"
+" 入り組んã é–¢æ•°å†…部ã®ã€ 高コストãªéƒ¨ä½ã¯ã€ 特定ãŒå›°é›£ã§ã™ã€‚\n"
+" ``stat``\n"
+" サードパーティ製㮠statprof。 ç¾æ™‚点ã§ã¯ Unix 環境ã§ã®ã¿ä½¿ç”¨ã§ãã€\n"
+" 0.1 秒以上をè¦ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã®è§£æžã§æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+"``format``\n"
+" Profiling format. Specific to the ``ls`` instrumenting profiler.\n"
+" Default: text."
+msgstr ""
+"``format``\n"
+" プロファイル形å¼ã€‚ 詳細プロファイラ ``ls`` 固有ã®è¨­å®šã€‚\n"
+" デフォルト値: text"
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+" ``text``\n"
+" プロファイル報告を生æˆã€‚ プロファイル報告をファイルã«ä¿å­˜ã™ã‚‹å ´åˆã€\n"
+" プロファイルデータã¯ä¿å­˜ã•ã‚Œãªã„点ã«æ³¨æ„ã—ã¦ãã ã•ã„。\n"
+" ``kcachegrind``\n"
+" プロファイルデータを kcachegrind å½¢å¼åŒ–。 ファイルã«ä¿å­˜ã™ã‚‹å ´åˆã€\n"
+" 当該ファイルã¯ç›´æŽ¥ kcachegrind ã§èª­ã¿è¾¼ã‚ã¾ã™ã€‚"
+
+msgid ""
+"``frequency``\n"
+" Sampling frequency. Specific to the ``stat`` sampling profiler.\n"
+" Default: 1000."
+msgstr ""
+"``frequency``\n"
+" サンプリング頻度。 サンプリングプロファイラ ``stat`` 固有ã®è¨­å®šã€‚\n"
+" デフォルト値: 1000."
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+"``output``\n"
+" プロファイルデータ〠ãªã„ã—統計報告ã®ä¿å­˜å…ˆã€‚\n"
+" 既存ファイルãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ファイルã¯ä¸Šæ›¸ãã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: None (çµæžœã¯æ¨™æº–エラー出力ã‹ã‚‰å‡ºåŠ›)"
+
+msgid ""
+"``revsetalias``\n"
+"---------------"
+msgstr ""
+"``revsetalias``\n"
+"---------------"
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+"revsets 機能ã®åˆ¥å定義。\n"
+"詳細㯠:hg:`help revsets` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``server``\n"
+"----------"
+msgstr ""
+"``server``\n"
+"----------"
+
+msgid "Controls generic server settings."
+msgstr "一般的ãªã‚µãƒ¼ãƒæ©Ÿèƒ½ã®è¨­å®šã€‚"
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+"``uncompressed``\n"
+" クライアントã‹ã‚‰ã®ã€éžåœ§ç¸®ãƒ—ロトコルã§ã® :hg:`clone` è¦æ±‚ã«å¯¾ã™ã‚‹ã€\n"
+" 許å¯ã®å¯å¦ã€‚ 通常ã®è»¢é€ã¨æ¯”較ã—ã¦ã€ データé‡ãŒ 40% 程度増加ã—ã¾ã™ãŒã€\n"
+" サーãƒï¼ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆåŒæ–¹ã§ã€ メモリや CPU ã®æ¶ˆè²»ãŒä½Žæ¸›ã—ã¾ã™ã€‚\n"
+" LAN (100 Mbps ãªã„ã—ãれ以上) や高速 WAN 経由ã§ã‚ã‚Œã°ã€\n"
+" 通常形å¼ã‚ˆã‚Šã‚‚高速 (最大 10 å€ç¨‹åº¦) ã§ã™ã€‚\n"
+" 転é€ãƒ‡ãƒ¼ã‚¿é‡ãŒå¢—加ã™ã‚‹ã“ã¨ã‹ã‚‰ã€ 一般的㪠WAN 接続 (概㭠6 Mbps 以下)\n"
+" ã§ã¯ã€ éžåœ§ç¸®å½¢å¼ã®æ–¹ãŒä½Žé€Ÿã§ã™ã€‚\n"
+" 転é€ãƒ‡ãƒ¼ã‚¿ãŒç¢ºå®šã™ã‚‹ã¾ã§ã®é–“ã¯ã€ éžåœ§ç¸®å½¢å¼ã§ã‚ã£ã¦ã‚‚ã€\n"
+" 一時的ãªæ›¸ãè¾¼ã¿ãƒ­ãƒƒã‚¯ãŒä¿æŒã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: True"
+
+msgid ""
+"``preferuncompressed``\n"
+" When set, clients will try to use the uncompressed streaming\n"
+" protocol. Default is False."
+msgstr ""
+"``preferuncompressed``\n"
+" 真値ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ クライアントã¯éžåœ§ç¸®ã§ã®è»¢é€ã‚’試ã¿ã¾ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+"``validate``\n"
+" å映対象リビジョンã®ã€ 完全性検証ã®è¦å¦ã€‚\n"
+" マニフェスト中ã®å…¨ã¦ã®æ›´æ–°æƒ…å ±ãŒã€ 転é€å†…容ã«å«ã¾ã‚Œã¦ã„ã‚‹ã‹å¦ã‹ã§ã€\n"
+" データã®å®Œå…¨æ€§ã‚’確èªã—ã¾ã™ã€‚ デフォルト値: False"
+
+msgid ""
+"``smtp``\n"
+"--------"
+msgstr ""
+"``smtp``\n"
+"--------"
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr "é›»å­ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã™ã‚‹ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³å‘ã‘設定。"
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+"``host``\n"
+" SMTP サーãƒã®ãƒ›ã‚¹ãƒˆå。 設定例: \"mail.example.com\""
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+"``port``\n"
+" çœç•¥å¯èƒ½ã€‚ SMTP サーãƒã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ デフォルト値: 25"
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+"``tls``\n"
+" çœç•¥å¯èƒ½ã€‚ SMTP サーãƒæŽ¥ç¶šã«ãŠã‘ã‚‹ TLS 接続ã®æœ‰ç„¡ï¼æ–¹å¼ã®æŒ‡å®šã€‚\n"
+" starttls〠smtps ãªã„ã— none。 デフォルト値: none"
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+"``username``\n"
+" çœç•¥å¯èƒ½ã€‚ SMTP サーãƒæŽ¥ç¶šã®èªè¨¼ã«ãŠã‘るユーザå。\n"
+" デフォルト値: none"
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+"``password``\n"
+" çœç•¥å¯èƒ½ã€‚ SMTP サーãƒæŽ¥ç¶šã®èªè¨¼ã«ãŠã‘るパスワード。\n"
+" 無指定ã®å ´åˆã€ 対話的ãªå®Ÿè¡Œã§ã‚ã‚Œã°ã€\n"
+" パスワード入力プロンプトãŒè¡¨ç¤ºã•ã‚Œã¾ã™ãŒã€\n"
+" éžå¯¾è©±çš„ãªå®Ÿè¡Œã§ã‚ã‚Œã°ã€ 処ç†ãŒä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: none"
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+"``local_hostname``\n"
+" çœç•¥å¯èƒ½ã€‚ MTA ã«å¯¾ã—ã¦ã€ é€ä¿¡å…ƒã‚’指定ã™ã‚‹ãŸã‚ã®ãƒ›ã‚¹ãƒˆå。"
+
+msgid ""
+"\n"
+"``subpaths``\n"
+"------------"
+msgstr ""
+"\n"
+"``subpaths``\n"
+"------------"
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+"連æºå…ˆãƒ›ã‚¹ãƒˆã®å称変更や一時的ãªåœæ­¢ãªã©ã§ã€ 副リãƒã‚¸ãƒˆãƒªã®å‚照先 URL ãŒã€\n"
+"無効ã«ãªã‚‹å ´åˆãŒã‚ã‚Šã¾ã™ã€‚ 本セクションã§ã¯ã€ å‚照先 URL ã®æ›¸ãæ›ãˆã‚’ã€\n"
+"以下ã®å½¢å¼ã§è¨˜è¿°ã§ãã¾ã™::"
+
+msgid " <pattern> = <replacement>"
+msgstr " <パターン> = <ç½®æ›çµæžœ>"
+
+msgid ""
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+"``パターン`` ã«ã¯å‰¯ãƒªãƒã‚¸ãƒˆãƒªã®å‚照先 URL ã«åˆè‡´ã™ã‚‹æ­£è¦è¡¨ç¾ã‚’ã€\n"
+"``ç½®æ›çµæžœ`` ã«ã¯å‚照先 URL ã®æ›¸ãæ›ãˆçµæžœã‚’記述ã—ã¾ã™ã€‚\n"
+"``パターン`` ã§ã®ã‚°ãƒ«ãƒ¼ãƒ—表記ã¸ã®åˆè‡´ã¯ã€``ç½®æ›çµæžœ`` ã§å‚ç…§å¯èƒ½ã§ã™ã€‚\n"
+"記述例を以下ã«ç¤ºã—ã¾ã™::"
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr " http://server/(.*)-hg/ = http://hg.server/\\1/"
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr ""
+"上記設定ã«ã‚ˆã£ã¦ã€ ``http://server/foo-hg/`` ã¯\n"
+"``http://hg.server/foo/`` ã«æ›¸ãæ›ãˆã‚‰ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Relative subrepository paths are first made absolute, and the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªã®å‚照先 URL ãŒç›¸å¯¾ãƒ‘スã®å ´åˆã€ 書ãæ›ãˆã®``パターン``ã¯ã€\n"
+"å‚照先 URL を絶対パス化ã—ãŸå¾Œã§ã€ 絶対パス全体ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+"書ãæ›ãˆã®é©ç”¨ã¯ã€ 記述順ã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``trusted``\n"
+"-----------"
+msgstr ""
+"``trusted``\n"
+"-----------"
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+"Mercurial ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯ã€ ä»»æ„ã®ã‚³ãƒžãƒ³ãƒ‰å®Ÿè¡Œã‚’å¯èƒ½ã«ã§ãã‚‹ã“ã¨ã‹ã‚‰ã€\n"
+"ä¿¡é ¼ã§ãるユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—ã«å±žã•ãªã„設定ファイルã¯ã€\n"
+"ãã®è¨˜è¿°å†…容ãŒç„¡è¦–ã•ã‚Œã¾ã™ã€‚ 共有リãƒã‚¸ãƒˆãƒªã‚„〠リãƒã‚¸ãƒˆãƒªã‚µãƒ¼ãƒã®\n"
+"``.hg/hgrc`` ã«ãŠã‘るフックやエクステンション設定ã§ã¯ã€\n"
+"ã—ã°ã—ã°ã“ã®å•é¡ŒãŒé¡•åœ¨åŒ–ã—ã¾ã™ã€‚\n"
+"但ã—〠web インタフェースã«é–¢ã—ã¦ã¯ã€\n"
+"``[web]`` セクションã«ãŠã‘る〠安全ãªè¨­å®šè¨˜è¿°ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+"設定ファイルã®æ‰€æœ‰è€…ãªã„ã—グループãŒã€\n"
+"本セクションã§è¨˜è¿°ã—ãŸã€ ユーザãªã„ã—グループã¨åˆè‡´ã™ã‚‹å ´åˆã€\n"
+"ãã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯ *ä¿¡é ¼* ã•ã‚Œã¾ã™ã€‚\n"
+"実効ユーザ (※ 訳注: 対象リãƒã‚¸ãƒˆãƒªä¸Šã§å®Ÿè¡Œã•ã‚Œã‚‹\n"
+"「プロセス〠ã®å®ŸåŠ¹ãƒ¦ãƒ¼ã‚¶) ã¯å¸¸ã«ä¿¡é ¼å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚\n"
+"å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ä¿¡é ¼ã™ã‚‹å ´åˆã¯ã€ ユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—設定ã®ã„ãšã‚Œã‹ã§\n"
+"``*`` を列挙ã—ã¦ãã ã•ã„。 本セクションã®è¨˜è¿°ãŒæœ‰åŠ¹ã«ãªã‚‹ãŸã‚ã«ã¯ã€\n"
+"*æ—¢ã«ä¿¡é ¼ã•ã‚Œã¦ã„るファイル* ã«ãŠã„ã¦è¨˜è¿°ã™ã‚‹å¿…è¦ãŒæœ‰ã‚Šã¾ã™ã€‚\n"
+"例ãˆã°ã€ Mercurial プロセスを実行ã—ã¦ã„るユーザやサービスã®\n"
+"``$HOME/.hgrc`` ファイルãªã©ãŒè©²å½“ã—ã¾ã™ã€‚"
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+"``users``\n"
+" ä¿¡é ¼ã§ãるユーザã®ä¸€è¦§ (カンマ区切り)"
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+"``groups``\n"
+" ä¿¡é ¼ã§ãるグループã®ä¸€è¦§ (カンマ区切り)"
+
+msgid ""
+"\n"
+"``ui``\n"
+"------"
+msgstr ""
+"\n"
+"``ui``\n"
+"------"
+
+msgid "User interface controls."
+msgstr "ユーザインタフェースã«é–¢ã™ã‚‹è¨­å®šã€‚"
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+"``archivemeta``\n"
+" :hg:`archive` コマンドãªã„ã— hgweb 経由ã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã§å¾—られる\n"
+" アーカイブファイルã¸ã®ã€ メタデータ (リãƒã‚¸ãƒˆãƒªã®åˆæœŸãƒªãƒ“ジョンã¨ã€\n"
+" アーカイブ対象リビジョンã®ãƒãƒƒã‚·ãƒ¥å€¤) ã‚’ä¿æŒã™ã‚‹ .hg_archival.txt\n"
+" ファイル格ç´ã®æœ‰ç„¡ã€‚ デフォルト値: True"
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+"``askusername``\n"
+" コミットã«ãŠã‘るユーザåå•ã„åˆã‚ã›ã®æœ‰ç„¡ã€‚ True ã®å ´åˆã€\n"
+" ``$HGUSER`` ã‚‚ ``$EMAIL`` も設定ã•ã‚Œã¦ã„ãªã‘ã‚Œã°ã€\n"
+" ユーザåã®å•ã„åˆã‚ã›ã‚’è¡Œã„ã¾ã™ã€‚\n"
+" ユーザåãŒå…¥åŠ›ã•ã‚Œãªã„å ´åˆã€ ``ユーザå@ホストå`` ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+"``commitsubrepos``\n"
+" 親リãƒã‚¸ãƒˆãƒªã®ã‚³ãƒŸãƒƒãƒˆã«ãŠã‘る〠副リãƒã‚¸ãƒˆãƒªå¤‰æ›´ã®ã‚³ãƒŸãƒƒãƒˆã®è¦å¦ã€‚\n"
+" False ã®å ´åˆã«ã€ 変更ãŒæœªã‚³ãƒŸãƒƒãƒˆãªå‰¯ãƒªãƒã‚¸ãƒˆãƒªãŒã‚ã‚Œã°ã€\n"
+" コミット処ç†ã¯ä¸­æ–­ã•ã‚Œã¾ã™ã€‚ デフォルト値: False"
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+"``debug``\n"
+" デãƒãƒƒã‚°æƒ…報表示è¦å¦ã®çœŸå½å€¤ã€‚ デフォルト値: False"
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+"``editor``\n"
+" コミットログ入力用エディタ。 無指定ã®å ´åˆã€ ``$EDITOR`` ãªã„ã—\n"
+" ``vi`` ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+"``fallbackencoding``\n"
+" UTF-8 ã«ã‚ˆã‚‹ã‚³ãƒŸãƒƒãƒˆãƒ­ã‚°ã®å¤‰æ›ãŒå¤±æ•—ã—ãŸå ´åˆã«ä½¿ç”¨ã™ã‚‹ç¬¦å·åŒ–å½¢å¼ã€‚\n"
+" デフォルト値: ISO-8859-1"
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+"``ignore``\n"
+" ユーザ毎ã®ç„¡è¦–対象パターンファイルã®èª­ã¿è¾¼ã¿è¨­å®šã€‚\n"
+" 対象ファイルã®å½¢å¼ã¯ã€ リãƒã‚¸ãƒˆãƒªæ¯Žã® .hgignore ファイルã¨åŒã˜ã§ã™ã€‚\n"
+" 本指定ã«ã¯ã€ フック指定ã®æ–‡æ³•ãŒé©ç”¨å¯èƒ½ã§ã™ã€‚\n"
+" 複数ã®ç„¡è¦–指定ファイルã®èª­ã¿è¾¼ã¿ã¯ã€ ``ignore.other = ~/.hgignore2``\n"
+" ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™ã€‚ 無視指定ファイル記述ã®è©³ç´°ã¯ã€\n"
+" ``hgignore(5)`` マニュアルをå‚ç…§ã—ã¦ãã ã•ã„。\n"
+" (※ 訳注: :hg:`help ignore` ã§ã‚‚å‚ç…§å¯èƒ½)"
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+"``interactive``\n"
+" ユーザã¸ã®å•ã„åˆã‚ã›å¯å¦ã®çœŸå½å€¤ã€‚ デフォルト値: True"
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+"``logtemplate``\n"
+" リビジョン表示系コマンドãŒä½¿ç”¨ã™ã‚‹ãƒ†ãƒ³ãƒ—レート文字列。"
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+"``merge``\n"
+" 手動マージã®éš›ã«è¡çªè§£æ¶ˆã‚’è¡Œã†ãƒ—ログラム。\n"
+" マージツールã«é–¢ã™ã‚‹è©³ç´°ã¯ :hg:`help merge-tools` ã‚’ã€\n"
+" マージツールã®è¨­å®šã«é–¢ã™ã‚‹è©³ç´°ã¯ ``[merge-tools]``\n"
+" セクションã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+"``portablefilenames``\n"
+" ファイルåå¯æ¬æ€§ç¢ºèªã®è¦å¦ã€‚\n"
+" ``warn``〠``ignore`` ãªã„ã— ``abort`` ã®ã„ãšã‚Œã‹ã€‚\n"
+" デフォルト値㯠``warn``。\n"
+" POSIX 環境ã«ãŠã‘ã‚‹ ``warn`` (ãªã„ã— ``true``) 設定ã§ã¯ã€\n"
+" å¯æ¬æ€§ã®ç„¡ã„åå‰ (例: ``AUX`` ã®ã‚ˆã†ãªäºˆç´„語や〠``:``\n"
+" ã®ã‚ˆã†ãªç‰¹æ®Šæ–‡å­—ã‚’å«ã‚“ã ã‚Šã€ 文字大å°ã®å•é¡Œã§ã€\n"
+" 既存ファイルã¨è¡çªã™ã‚‹ã‚ˆã†ãªã€ Windows 環境ã§åˆ©ç”¨ã§ããªã„ファイルå)\n"
+" ã‚’æŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ãŒã€ 構æˆç®¡ç†å¯¾è±¡ã¨ã—ã¦è¿½åŠ ã•ã‚ŒãŸéš›ã«ã€\n"
+" 警告を発ã—ã¾ã™ã€‚\n"
+" ``ignore`` (ãªã„ã— ``false``) 設定ã§ã¯ã€ 警告ãŒç™ºã›ã‚‰ã‚Œã¾ã›ã‚“。\n"
+" ``abort`` 設定ã§ã¯ã€ コマンドã®å®Ÿè¡ŒãŒä¸­æ–­ã•ã‚Œã¾ã™ã€‚\n"
+" Windows 環境ã§ã¯ã€ 本設定ã¯ç„¡è¦–ã•ã‚Œã€ コマンド実行ã¯å¸¸ã«ä¸­æ–­ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+"``quiet``\n"
+" コマンド実行時ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸è¡¨ç¤ºæŠ‘æ­¢è¦å¦ã®çœŸå½å€¤ã€‚ デフォルト値: False"
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+"``remotecmd``\n"
+" clone/push/pull 処ç†ã«ãŠã‘ã‚‹é éš”実行コマンド。 デフォルト値: ``hg``"
+
+msgid ""
+"``reportoldssl``\n"
+" Warn if an SSL certificate is unable to be due to using Python\n"
+" 2.5 or earlier. True or False. Default is True."
+msgstr ""
+"``reportoldssl``\n"
+" Python 2.5 以å‰ã®ä½¿ç”¨ã«ã‚ˆã‚Šã€ SSL 証明書ã®å‡¦ç†ãŒã§ããªã„å ´åˆã®ã€\n"
+" 警告表示を指定ã™ã‚‹çœŸå½å€¤ã€‚ デフォルト値: True"
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+"``report_untrusted``\n"
+" ä¿¡é ¼ã§ãるユーザï¼ã‚°ãƒ«ãƒ¼ãƒ—下ã«ç„¡ã„ ``.hg/hgrc``\n"
+" ã®ç„¡è¦–ã«å¯¾ã™ã‚‹ã€ 警告è¦å¦ã®çœŸå½å€¤ã€‚ デフォルト値: True"
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+"``slash``\n"
+" パス区切りã§ã®ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (``/``) 使用ã®è¦å¦ã€‚\n"
+" パス区切りãŒã‚¹ãƒ©ãƒƒã‚·ãƒ¥ã§ã¯ãªã„環境 (例: ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ (``\\``)\n"
+" を使用ã™ã‚‹ Windows 環境) ã§ã®ã¿æ„味をæŒã¡ã¾ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+"``ssh``\n"
+" SSH 接続ã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã€‚ デフォルト値: ``ssh``"
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+"``strict``\n"
+" コマンドå指定ã®åŽ³å¯†æ€§è¦å¦ (ï¼ çœç•¥æŒ‡å®šã®ç¦æ­¢) ã®çœŸå½å€¤ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+"``style``\n"
+" コマンド出力ã«ä½¿ç”¨ã™ã‚‹ã‚¹ã‚¿ã‚¤ãƒ«å指定。"
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+"``timeout``\n"
+" ロック解放待ã¡ã«ãŠã‘るタイムアウト時間指定 (å˜ä½: 秒)。\n"
+" 負値ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆç„¡ã—ã‚’æ„味ã—ã¾ã™ã€‚ デフォルト値: 600"
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+"``traceback``\n"
+" Mercurial ã¯æœªçŸ¥ã®ä¾‹å¤–ã®ã¿ã€ トレースãƒãƒƒã‚¯ã‚’表示ã—ã¾ã™ã€‚\n"
+" 本設定㌠True ã®éš›ã¯ã€ Mercurial ã®æ—¢çŸ¥ã®ä¾‹å¤– (IOError ã‚„\n"
+" MemoryError) ã§ã‚ã£ã¦ã‚‚ã€ãƒˆãƒ¬ãƒ¼ã‚¹ãƒãƒƒã‚¯ã‚’表示ã—ã¾ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+"``username``\n"
+" :hg:`commit` ã§ã®æ–°è¦ãƒªãƒ“ジョン作æˆã§è¨˜éŒ²ã•ã‚Œã‚‹ãƒ¦ãƒ¼ã‚¶å。\n"
+" 個人åã¨é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’使用ã™ã‚‹ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚\n"
+" (例: ``Fred Widget <fred@example.com>``)\n"
+" 無指定ã®å ´åˆã€ ``$EMAIL`` 指定値〠ãªã„ã— ``ユーザå@ホストå``\n"
+" ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ 設定ファイル㧠username ã«ç©ºå€¤ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" (Mercurial ã®å•ã„åˆã‚ã›ã‚’契機ã«) 手動ã§æŒ‡å®šã™ã‚‹ã‹ã€\n"
+" ä»–ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ« (例: システム毎設定ファイル㧠``username =``\n"
+" ãŒè¨˜è¿°ã•ã‚ŒãŸå ´åˆã¯ ``$HOME/.hgrc``) ã§ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚\n"
+" username 指定値ã§ã¯ã€ 環境変数ã®ç½®æ›ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+"``verbose``\n"
+" 出力情報é‡å¢—加è¦å¦ã®çœŸå½å€¤ã€‚ デフォルト値: False"
+
+msgid ""
+"\n"
+"``web``\n"
+"-------"
+msgstr ""
+"\n"
+"``web``\n"
+"-------"
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+"ウェブインタフェース設定。 本セクションã§ã®è¨­å®šã¯ã€ 組ã¿è¾¼ã¿ã‚¦ã‚§ãƒ–サーãƒ\n"
+"(:hg:`serve` ã§ã®å®Ÿè¡Œ) ã¨ã€ ウェブサーãƒä¸Šã§ã®ã‚¹ã‚¯ãƒªãƒ—ト (FastCGI ã‚„ WSGI\n"
+"å‘ã‘ã® ``hgweb.cgi`` ãŠã‚ˆã³ãã®æ´¾ç”Ÿ) ã®å®Ÿè¡Œã®ã€ä¸¡æ–¹ã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+"Mercurial ã®çµ„ã¿è¾¼ã¿ã‚¦ã‚§ãƒ–サーãƒã¯ã€ èªè¨¼ (authentication) ã‚’è¡Œã„ã¾ã›ã‚“\n"
+"(ユーザを確èªã™ã‚‹ãŸã‚ã®ã€ ユーザåやパスワードã®å…¥åŠ›ã‚’求ã‚ã¾ã›ã‚“) ãŒã€\n"
+"æ‰¿èª (authorization: アクセスå¯å¦ã®åˆ¤å®š) ã®æ©Ÿèƒ½ã¯ã‚ã‚Šã¾ã™\n"
+"(本セクションã§ã®è¨­å®šã‚’å…ƒã«ã€ èªè¨¼æ¸ˆã¿ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦å®Ÿæ–½)。\n"
+"利用ã™ã‚‹ã‚¦ã‚§ãƒ–サーãƒã®ã€ èªè¨¼æ©Ÿèƒ½ã‚’ Mercurial å‘ã‘ã«æ­£ã—ã設定ã™ã‚‹ã‹ã€\n"
+"Mercurial ã®æ‰¿èªæ©Ÿèƒ½ã‚’〠無効化ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+"ä¿¡é ¼ã§ãる環境 (例: ç§çš„㪠LAN é…下ã§ã€ å…¨ã¦ã®åˆ©ç”¨è€…ã« :hg:`push` 許å¯)\n"
+"ã«ãŠã„ã¦ã€ ç´ æ—©ãサーãƒã‚’ç«‹ã¡ä¸Šã’ãŸã„å ´åˆã€ 以下ã®èµ·å‹•å½¢å¼ãŒè‰¯ã„ã§ã—ょã†::"
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+"ã“ã®è¨­å®šã¯ã€ å…¨ã¦ã®åˆ©ç”¨è€…ã«ã€ サーãƒã¸ã® :hg:`push` を許å¯ã—ã¾ã™ã®ã§ã€\n"
+"公開サーãƒã§ä½¿ç”¨ã—ã¦ã¯ã„ã‘ã¾ã›ã‚“。"
+
+msgid "The full set of options is:"
+msgstr "本セクションã§æŒ‡å®šå¯èƒ½ãªè¨­å®šé …目を〠以下ã«ç¤ºã—ã¾ã™:"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+"``accesslog``\n"
+" アクセスログã®æ›¸ã出ã—先。 無指定時ã¯æ¨™æº–出力ã«å‡ºåŠ›ã€‚"
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+"``address``\n"
+" サーãƒã®å¾…ã¡ã†ã‘アドレス。 無指定時ã¯ãƒ›ã‚¹ãƒˆã®æŒã¤å…¨ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚"
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+"``allow_archive``\n"
+" 利用å¯èƒ½ãªãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰å‘ã‘ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–å½¢å¼ (bz2, gz, zip) 一覧。\n"
+" デフォルト値: 空(ダウンロードä¸å¯)"
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowbz2``\n"
+" (éžæŽ¨å¥¨) .tar.bz2 å½¢å¼ã§ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ダウンロードã®å¯å¦ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowgz``\n"
+" (éžæŽ¨å¥¨) .tar.gz å½¢å¼ã§ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ダウンロードã®å¯å¦ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+"``allowpull``\n"
+" :hg:`pull` è¦æ±‚ã¸ã®å¿œç­”ã®å¯å¦ã€‚ デフォルト値: True"
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+"``allow_push``\n"
+" :hg:`push` è¦æ±‚ã¸ã®å¿œç­”ã®å¯å¦ã€‚ 空ãªã„ã—未設定ã®å ´åˆã€ :hg:`push`\n"
+" è¦æ±‚ã¯å—ç†ã•ã‚Œã¾ã›ã‚“。 ``*`` ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã‚’å«ã‚€ã€\n"
+" å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒ :hg:`push` ã§ãã¾ã™ã€‚ ä»–ã®å€¤ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€\n"
+" èªè¨¼ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ã®ã†ã¡ã€ 本項目ã§åå‰ãŒåˆ—挙ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ã®ã¿ãŒã€\n"
+" :hg:`push` ã§ãã¾ã™ã€‚ 本設定ã®ç¢ºèªå®Ÿæ–½ã¯ã€ ``deny_push``\n"
+" 確èªã®å¾Œã§ã™ã€‚"
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+"``guessmime``\n"
+" ファイル内容ã®ç›´æŽ¥ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«ãŠã‘る〠MIME 種別ã®åˆ¶å¾¡ã€‚\n"
+" True 設定ã®å ´åˆã€ ファイルã®æ‹¡å¼µå­ã‚’元㫠MIME 種別を推測ã—ã¾ã™ã€‚\n"
+" 例ãˆã°ã€ HTML ファイルã§ã¯ ``text/html`` ãŒä½¿ç”¨ã•ã‚Œã¾ã™ãŒã€\n"
+" 信用ã§ããªã„リãƒã‚¸ãƒˆãƒªã‚’公開ã—ãŸå ´åˆã€ cross site scripting\n"
+" 攻撃ã®åŽŸå› ã¨ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ デフォルト値: False"
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+"``allow_read``\n"
+" アクセス元ユーザ㌠``deny_read`` ã«ã‚ˆã‚‹åˆ¶é™ã‚’å—ã‘ã¦ã„ãªã„å ´åˆã®ã€\n"
+" 当該ユーザã®ã‚¢ã‚¯ã‚»ã‚¹å¯å¦ã®åˆ¶å¾¡ã€‚ 本設定ãŒç©ºã®å ´åˆã€ 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã‚„ã€\n"
+" 本設定ã§åå‰ãŒåˆ—挙ã•ã‚Œã¦ã„ãªã„ユーザã¯ã€ アクセスãŒæ‹’å¦ã•ã‚Œã¾ã™ã€‚\n"
+" 本設定ãŒç©ºã€ ãªã„ã—未設定ã®å ´åˆã€ å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã™ã€‚\n"
+" ``allow_read`` ã‚’ ``*`` ã«è¨­å®šã™ã‚‹ã®ã¯ã€ 未設定 (ï¼ å…¨ãƒ¦ãƒ¼ã‚¶ã¸ã®è¨±å¯)\n"
+" ã¨ç­‰ä¾¡ã§ã™ã€‚ 本設定ã®ç¢ºèªå®Ÿæ–½ã¯ã€ ``deny_read`` 確èªã®å¾Œã§ã™ã€‚"
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+"``allowzip``\n"
+" (éžæŽ¨å¥¨) .zip å½¢å¼ã§ã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–ダウンロードã®å¯å¦ã€‚\n"
+" 本機能を有効ã«ã—ãŸå ´åˆã€ 一時ファイルãŒä½œæˆã•ã‚Œã¾ã™ã€‚\n"
+" デフォルト値: False"
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+"``baseurl``\n"
+" 外部ã¸ã® URL 公開ã§ä½¿ç”¨ã™ã‚‹ãƒ™ãƒ¼ã‚¹ URL。\n"
+" é›»å­ãƒ¡ãƒ¼ãƒ«é€šçŸ¥ãƒ•ãƒƒã‚¯ç­‰ã®ã€ サードパーティツールã«ã‘ã‚‹ã€\n"
+" 公開用 URL ã®æ§‹ç¯‰ã‚’å¯èƒ½ã«ã—ã¾ã™ã€‚\n"
+" 設定例: ``http://hgserver/repos/``"
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates."
+msgstr ""
+"``cacerts``\n"
+" PEM 符å·åŒ–å½¢å¼ã®è¨¼æ˜Žæ›¸èªè¨¼å±€è¨¼æ˜Žæ›¸ä¸€è¦§æ ¼ç´ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘ス。\n"
+" ファイルå記述ã«ãŠã‘る環境変数ãŠã‚ˆã³ ``~user`` 記述ã¯ç½®æ›ã•ã‚Œã¾ã™ã€‚\n"
+" 本項目ãŒã€ クライアントå´ã§è¨˜è¿°ã•ã‚ŒãŸå ´åˆã€ 指定ã•ã‚ŒãŸè¨¼æ˜Žæ›¸ã«ã‚ˆã‚Šã€\n"
+" HTTPS サーãƒãŒèªè¨¼ã•ã‚Œã¾ã™ã€‚ ファイルã®å½¢å¼ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+" 本機能㯠Python 2.6 以é™ã§åˆ©ç”¨å¯èƒ½ã§ã™ã€‚ ãれ以å‰ã® Python ã«ãŠã„ã¦ã€\n"
+" 本機能を利用ã™ã‚‹å ´åˆã¯ã€ ``http://pypi.python.org`` ã‹ã‚‰å…¥æ‰‹ã§ãã‚‹\n"
+" SSL ライブラリã®å¾Œæ–¹ç§»æ¤ç‰ˆã‚’インストールã—ã¦ãã ã•ã„。"
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+" SSL ã®è¨¼æ˜Žæ›¸æ¤œè¨¼ã‚’〠一時的ã«åœæ­¢ã—ãŸã„å ´åˆã¯ã€ コマンドライン上ã§\n"
+" ``--insecure`` を指定ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has\n"
+" one. On most Linux systems this will be\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+" generate this file manually. The form must be as follows::"
+msgstr ""
+" OpenSSL ã® CA 証明書ファイルãŒã‚ã‚Œã°ã€ ãれを利用ã—ã¦ã‚‚構ã„ã¾ã›ã‚“。\n"
+" 多ãã® Linux システムã§ã¯ã€ ``/etc/ssl/certs/ca-certificates.crt``\n"
+" ã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ç­ˆã§ã™ã€‚ ãれ以外ã¯ã€ 手動ã§ç”Ÿæˆã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" ファイルã®å½¢å¼ã‚’以下ã«ç¤ºã—ã¾ã™::"
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (base64 PEM 符å·åŒ–å½¢å¼ã®è¨¼æ˜Žæ›¸) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (base64 PEM 符å·åŒ–å½¢å¼ã®è¨¼æ˜Žæ›¸) ...\n"
+" -----END CERTIFICATE-----"
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+"``cache``\n"
+" hgweb ã«ãŠã‘るキャッシュ利用ã®å¯å¦ã€‚ デフォルト値: True"
+
+msgid ""
+"``collapse``\n"
+" With ``descend`` enabled, repositories in subdirectories are shown at\n"
+" a single level alongside repositories in the current path. With\n"
+" ``collapse`` also enabled, repositories residing at a deeper level than\n"
+" the current path are grouped behind navigable directory entries that\n"
+" lead to the locations of these repositories. In effect, this setting\n"
+" collapses each collection of repositories found within a subdirectory\n"
+" into a single entry for that subdirectory. Default is False."
+msgstr ""
+" ``descend`` ãŒæœ‰åŠ¹ãªå ´åˆã€ サブディレクトリé…下ã®ãƒªãƒã‚¸ãƒˆãƒªç¾¤ã‚‚ã€\n"
+" å˜ä¸€ã®ä¸€è¦§ãƒšãƒ¼ã‚¸ã«è¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ åŒæ™‚ã« ``collapse`` も有効ãªå ´åˆã€\n"
+" サブディレクトリé…下ã®ãƒªãƒã‚¸ãƒˆãƒªç¾¤ã¯ã€ 対応パスã¸ã®èª˜å°Žã‚’è¡Œã†ã€\n"
+" 専用ディレクトリé…下ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—化ã•ã‚Œã¾ã™ã€‚ ã“ã®è¨­å®šã«ã‚ˆã£ã¦ã€\n"
+" サブディレクトリé…下ã®ãƒªãƒã‚¸ãƒˆãƒªè¡¨ç¤ºã¯ã€ å˜ä¸€ã®è¦ç´ ã«ã¾ã¨ã‚られã¾ã™ã€‚\n"
+" デフォルト値: Flase。"
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+"``contact``\n"
+" リãƒã‚¸ãƒˆãƒªç®¡ç†è€…ã®åå‰ãªã„ã—é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€‚\n"
+" 無指定ã®å ´åˆã€ ui.username 設定値〠``$EMAIL`` 設定値ãŒã€\n"
+" ãれらも未設定ï¼ç©ºå€¤ã®å ´åˆã¯ \"unknown\" ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+"``deny_push``\n"
+" :hg:`push` è¦æ±‚æ‹’å¦ã®è¦å¦ã€‚ 空ãªã„ã—未設定ã®å ´åˆã€ :hg:`push` ã¯ã€\n"
+" æ‹’å¦ã•ã‚Œã¾ã›ã‚“。 ``*`` ã®å ´åˆã€ :hg:`push` ã¯å…¨ã¦æ‹’å¦ã•ã‚Œã¾ã™ã€‚\n"
+" ãれ以外ã§ã¯ã€ 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã¨ã€ 本設定ã§åå‰ãŒåˆ—挙ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ã¯ã€\n"
+" :hg:`push` ãŒæ‹’å¦ã•ã‚Œã¾ã™ã€‚ 本設定ã®ç¢ºèªå®Ÿæ–½ã¯ã€ ``allow_push``\n"
+" 確èªã®å‰ã§ã™ã€‚"
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+"``deny_read``\n"
+" リãƒã‚¸ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹æ‹’å¦ã®è¦å¦ã€‚ 空値以外ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 未èªè¨¼ãƒ¦ãƒ¼ã‚¶ã¨ã€ 本設定ã§åå‰ãŒåˆ—挙ã•ã‚ŒãŸãƒ¦ãƒ¼ã‚¶ã¯ã€\n"
+" リãƒã‚¸ãƒˆãƒªã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒå…¨ã¦æ‹’å¦ã•ã‚Œã¾ã™ã€‚ ``*`` ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€\n"
+" å…¨ã¦ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒæ‹’å¦ã•ã‚Œã¾ã™ (ã“ã®è¨­å®šãŒå¿…è¦ãªã‚±ãƒ¼ã‚¹ã¯ç„¡ã„ã§ã—ょã†)。\n"
+" 空ãªã„ã—未設定ã®å ´åˆã€ アクセスå¯å¦ã¯ ``allow_read`` 設定次第ã§ã™ã€‚\n"
+" (説明をå‚ç…§ã—ã¦ãã ã•ã„) ``deny_read`` 㨠``allow_read`` ãŒã€\n"
+" 両方ã¨ã‚‚空ãªã„ã—未設定ã®å ´åˆã€ å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ãŒã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚\n"
+" ウェブインタフェースã®ã€ ディレクトリ毎インデックページ経由ã§ã€\n"
+" リãƒã‚¸ãƒˆãƒªä¸€è¦§ãŒå…¬é–‹ã•ã‚Œã‚‹å ´åˆã€ アクセス拒å¦å¯¾å‡¦ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—ã¦ã¯ã€\n"
+" 一覧ã‹ã‚‰å½“該リãƒã‚¸ãƒˆãƒªãŒé™¤å¤–ã•ã‚Œã¾ã™ã€‚ ``deny_read`` ã§ã®è¨­å®šã¯ã€\n"
+" ``allow_read`` ã§ã®è¨­å®šã«å„ªå…ˆã—ã¾ã™ã€‚"
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+"``descend``\n"
+" ウェブインタフェースãŒè¡¨ç¤ºã™ã‚‹ã€ ディレクトリ毎ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ãƒšãƒ¼ã‚¸ã§ã€\n"
+" リãƒã‚¸ãƒˆãƒªä¸€è¦§ã‚’表示ã™ã‚‹éš›ã«ã€ 当該仮想パスé…下ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’ã€\n"
+" å…¨ã¦è¡¨ç¤ºã™ã‚‹ã‹å¦ã‹ã®åˆ¶å¾¡ã€‚ (※ 訳注: デフォルト値㯠True)。\n"
+" å½å€¤ã®å ´åˆã€ 当該仮想パス直下ã®ãƒªãƒã‚¸ãƒˆãƒªã®ã¿ãŒåˆ—挙ã•ã‚Œã¾ã™ã€‚\n"
+" (表示ã•ã‚Œãªããªã‚‹ãƒªãƒã‚¸ãƒˆãƒªã‚‚〠親仮想パスã§ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ãƒšãƒ¼ã‚¸ã§ã¯ã€\n"
+" 列挙ã•ã‚Œã¾ã™) (※ 訳注: 本項目ã®ç¿»è¨³ã¯ã€ ã‚ã‹ã‚Šã‚„ã™ã•ã‚’é‡è¦–ã—ã¦ã€\n"
+" 原文ã‹ã‚‰å¤§å¹…ã«æ”¹å¤‰ã—ã¦ã‚ã‚Šã¾ã™ã€‚ é©å®œåŽŸæ–‡ã®ãƒ˜ãƒ«ãƒ—ã‚‚å‚ç…§ã—ã¦ãã ã•ã„)"
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+"``description``\n"
+" リãƒã‚¸ãƒˆãƒªå†…容ï¼ç”¨é€”ã«é–¢ã™ã‚‹èª¬æ˜Žãƒ†ã‚­ã‚¹ãƒˆã€‚ デフォルト値: \"unknown\""
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+"``encoding``\n"
+" 文字符å·åŒ–å½¢å¼ã€‚ 無指定ã®å ´åˆã€ サーãƒå®Ÿè¡Œæ™‚ã®ãƒ­ã‚±ãƒ¼ãƒ«è¨­å®šã‚’å…ƒã«ã€\n"
+" 符å·åŒ–å½¢å¼ãŒæ±ºå®šã•ã‚Œã¾ã™ã€‚ 設定例: \"UTF-8\""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+"``errorlog``\n"
+" エラーログã®æ›¸ã出ã—先。 無指定時ã¯æ¨™æº–エラー出力ã«å‡ºåŠ›ã€‚"
+
+msgid ""
+"``comparisoncontext``\n"
+" Number of lines of context to show in side-by-side file comparison. If\n"
+" negative or the value ``full``, whole files are shown. Default is 5.\n"
+" This setting can be overridden by a ``context`` request parameter to "
+"the\n"
+" ``comparison`` command, taking the same values."
+msgstr ""
+"``comparisoncontext``\n"
+" ファイルã®å·®åˆ†æ¯”較を表示ã™ã‚‹éš›ã®ã€ コンテキスト行数。 負値ã¾ãŸã¯\n"
+" ``full`` 指定ã®å ´åˆã€ ファイル全体ãŒè¡¨ç¤ºã•ã‚Œã¾ã™ã€‚ デフォルト値㯠5。\n"
+" ``comparison`` è¦æ±‚時㫠``context`` パラメータを指定ã™ã‚‹ã“ã¨ã§ã€\n"
+" 設定を上書ãå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+"``hidden``\n"
+" ウェブインタフェースã®ã€ ディレクトリ毎インデックスページã«ãŠã‘ã‚‹ã€\n"
+" リãƒã‚¸ãƒˆãƒªä¸€è¦§éš è”½ã®è¦å¦ã€‚ デフォルト値: False"
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+"``ipv6``\n"
+" IPv6 利用ã®è¦å¦ã€‚ デフォルト値: False"
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+"``logoimg``\n"
+" å¹¾ã¤ã‹ã®è¡¨ç¤ºãƒ†ãƒ³ãƒ—レートã«ãŠã„ã¦ã€ å„ページã§è¡¨ç¤ºã•ã‚Œã‚‹ãƒ­ã‚´ã®ã€\n"
+" ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«å。 ``staticurl`` ã«å¯¾ã™ã‚‹ç›¸å¯¾ãƒ‘スã§æŒ‡å®šã—ã¾ã™ã€‚\n"
+" ロゴ画åƒãƒ•ã‚¡ã‚¤ãƒ«ã®ãƒ•ãƒ«ãƒ‘スã¯ã€ \"staticurl/logoimg\" ã¨ãªã‚Šã¾ã™ã€‚\n"
+" デフォルト値: ``hglogo.png``"
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+"``logourl``\n"
+" ロゴ表示ã«ä½¿ç”¨ã™ã‚‹ãƒ™ãƒ¼ã‚¹ URL。 無指定時ã¯\n"
+" ``http://mercurial.selenic.com/``"
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+"``name``\n"
+" ウェブインタフェースã§ä½¿ç”¨ã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªå。 無指定ã®å ´åˆã€\n"
+" 当該作業領域ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€‚"
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+"``maxchanges``\n"
+" changelog ç”»é¢ã«ãŠã‘る最大表示リビジョン数。 デフォルト値: 10"
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+"``maxfiles``\n"
+" リビジョンã‚ãŸã‚Šã®æœ€å¤§ä¸€è¦§è¡¨ç¤ºãƒ•ã‚¡ã‚¤ãƒ«æ•°ã€‚ デフォルト値: 10"
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+" å¾…ã¡å—ã‘ãƒãƒ¼ãƒˆç•ªå·ã€‚ デフォルト値: 8000"
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+"``prefix``\n"
+" サービスæ供時ã®å‰ç½®ãƒ‘ス。 デフォルト値: '' (サーãƒãƒ¼ãƒ«ãƒ¼ãƒˆ)"
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+"``push_ssl``\n"
+" :hg:`push` ã«ãŠã‘ã‚‹ SSL 接続è¦æ±‚ (パスワード盗è´é˜²æ­¢ ) ã®è¦å¦ã€‚\n"
+" デフォルト値: True"
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+"``staticurl``\n"
+" é™çš„ファイル利用ã®ãƒ™ãƒ¼ã‚¹ URL。 未設定ã®å ´åˆã€ é™çš„ファイル (例:\n"
+" ã‚¢ã‚¤ã‚³ãƒ³ç”»åƒ hgicon.png) 㯠CGI スクリプト自身ãŒæä¾›ã—ã¾ã™ã€‚\n"
+" 本項目を設定ã™ã‚‹ã“ã¨ã§ã€ é™çš„ファイル㯠HTTP サーãƒãŒç›´æŽ¥æ‰±ã„ã¾ã™ã€‚\n"
+" 設定例: ``http://hgserver/static/``"
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+"``stripes``\n"
+" 複数行出力ã«ãŠã‘ã‚‹ \"シマウマ模様\" ã®è¡Œæ•°ã€‚ デフォルト値: 1\n"
+" (0 指定ã§æ©Ÿèƒ½ç„¡åŠ¹åŒ–)"
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+"``style``\n"
+" 使用ã™ã‚‹ãƒ†ãƒ³ãƒ—レートスタイル。"
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+"``templates``\n"
+" HTML テンプレートã®æ¤œç´¢å…ˆã€‚ 無指定時ã¯ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«å…ˆã€‚\n"
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§æ—¥æ™‚指定ãŒå¯èƒ½ã§ã™:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: コミット日時ã®æŒ‡å®š\n"
+"- log, revert, update: 日時ã«ã‚ˆã‚‹ãƒªãƒ“ジョンã®æŒ‡å®š"
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "有効ãªæ—¥æ™‚指定形å¼ã¯æ²¢å±±ã‚ã‚Šã¾ã™ã€‚ 以下ã«ã„ãã¤ã‹ã®ä¾‹ã‚’示ã—ã¾ã™:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (「ローカルタイムゾーンã€ã‚’想定)\n"
+"- ``Dec 6 13:18 -0600`` (「今年ã€ã‚’想定〠タイムゾーンã¯ã‚ªãƒ•ã‚»ãƒƒãƒˆæŒ‡å®š)\n"
+"- ``Dec 6 13:18 UTC`` (UTC ãŠã‚ˆã³ GMT 㯠+0000 ã®åˆ¥å)\n"
+"- ``Dec 6`` (「åˆå‰0時ã€ã‚’想定)\n"
+"- ``13:18`` (「本日ã€ã‚’想定)\n"
+"- ``3:39`` (「3:39AMã€ã‚’想定)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 å½¢å¼)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (2006年12月6日)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "最後ã«ã€ Mercurial 固有ã®å†…部形å¼ã‚’示ã—ã¾ã™:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (2006年12月6日 13:18:29 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"ã“ã‚Œã¯æ—¥æ™‚ã®å†…部表ç¾å½¢å¼ã§ã™ã€‚\n"
+"最åˆã®æ•°å€¤ã¯ã€ 基準時 (1970å¹´1月1æ—¥ 00:00 UTC) ã‹ã‚‰ã®çµŒéŽç§’æ•°ã§ã™ã€‚\n"
+"次ã®æ•°å€¤ã¯ã€ UTC ã«å¯¾ã™ã‚‹ãƒ­ãƒ¼ã‚«ãƒ«ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã®ã‚ªãƒ•ã‚»ãƒƒãƒˆå€¤\n"
+"(å˜ä½: 分) ã§ã™ (UTC よりもæ±å´ã®åœ°åŸŸã¯è² å€¤)"
+
+msgid "The log command also accepts date ranges:"
+msgstr "log コマンドã«ã¯ã€ 日時範囲指定å¯èƒ½ã§ã™:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+"- ``<日時指定`` - 指定日時以å‰(指定日時å«ã‚€)\n"
+"- ``>日時指定`` - 指定日時以後(指定日時å«ã‚€)\n"
+"- ``日時指定 to 日時指定`` - 指定日時範囲(指定日時å«ã‚€)\n"
+"- ``-日数`` - 本日ã‹ã‚‰æŒ‡å®šæ—¥æ•°ä»¥å†…\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+"無指定時㫠Mercurial ãŒ2ã¤ã®ãƒªãƒ“ジョンを比較ã—ã¦å·®åˆ†è¡¨ç¤ºã™ã‚‹éš›ã®å½¢å¼ã¯\n"
+"GNU diff ã® unified å½¢å¼äº’æ›ã®ã‚‚ã®ã§ã€ GNU patch ã‚’ã¯ã˜ã‚ã¨ã™ã‚‹å¤šãã®\n"
+"標準的ãªãƒ„ールã§ä½¿ç”¨ã§ãã‚‹ã‚‚ã®ã§ã™ã€‚"
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr "ã“ã®æ¨™æº–çš„ãªå½¢å¼ã¯æ¦‚ã­å分ãªã®ã§ã™ãŒã€ 以下ã®ã‚ˆã†ãªæƒ…å ±ã¯å«ã¾ã‚Œã¾ã›ã‚“:"
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+"- 実行å¯å¦ãŠã‚ˆã³æ¨©é™è¨­å®š\n"
+"- 複製ï¼æ”¹å情報\n"
+"- ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®å¤‰æ›´\n"
+"- 空ファイルã®ä½œæˆï¼å‰Šé™¤"
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+"Mercurial ã¯ã€ 別ã®æ§‹æˆç®¡ç†ãƒ„ールã§ã‚ã‚‹ git ã«ç”±æ¥ã™ã‚‹æ‹¡å¼µå·®åˆ†å½¢å¼ã«ã‚‚\n"
+"対応ã—ã¦ãŠã‚Šã€ ã“ã®å½¢å¼ã¯å¾“æ¥ã®å·®åˆ†å½¢å¼ã®æŒã¤åˆ¶é™ã‚’解消ã—ã¦ã„ã¾ã™ã€‚\n"
+"但ã—〠普åŠã—ã¦ã„るツールã®å¹¾ã¤ã‹ãŒ git 差分形å¼ã«å¯¾å¿œã—ã¦ã„ãªã„ãŸã‚ã€\n"
+"Mercurial ã¯æŒ‡å®šãŒç„¡ã„å ´åˆã¯ã“ã®å½¢å¼ã§ã¯å‡ºåŠ›ã—ã¾ã›ã‚“。"
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+"ã¤ã¾ã‚Šã€ Mercurial ãŒ(:hg:`export` ç­‰ã§)生æˆã—ãŸæ¨™æº–ã®å·®åˆ†å½¢å¼ã¯ã€\n"
+"ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦é©ç”¨ã—ãŸå ´åˆã€ 上述ã—ãŸæƒ…å ±ã®æ¬ è½ãŒã‚ã‚‹ã“ã¨ã‹ã‚‰ã€\n"
+"ファイルã®è¤‡è£½ãƒ»æ”¹åã‚’ã¯ã˜ã‚ã¨ã™ã‚‹ä¸Šè¨˜ã®åˆ¶é™ã«é¡žã™ã‚‹æ“作ã«é–¢ã—ã¦ã¯ã€\n"
+"å分注æ„ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚ :hg:`push` ã‚„ :hg:`pull` ã®ã‚ˆã†ãª\n"
+"Mercurial ã®å†…部形å¼ã§å®Ÿæ–½ã•ã‚Œã‚‹æ“作ã«é–¢ã—ã¦ã¯ã€ ãƒã‚¤ãƒŠãƒªå½¢å¼ã§å¤‰æ›´\n"
+"情報ã®æŽˆå—ã‚’è¡Œã†ã“ã¨ã‹ã‚‰ã€ 情報ã®æ¬ è½ã«é–¢ã—ã¦ã¯å¿ƒé…ã™ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+"Mercurial ã‹ã‚‰ git 拡張差分形å¼ã®å‡ºåŠ›ã‚’å¾—ã‚‹ã«ã¯ã€ å—ç†å¯èƒ½ãªã‚³ãƒžãƒ³ãƒ‰ã«\n"
+"対ã—㦠--git を指定ã™ã‚‹ã‹ã€ 設定ファイル㮠[diff] セクションã«\n"
+"'git = True' 記述を追加ã—ã¦ãã ã•ã„。 :hg:`import` ã‚„\n"
+"mq エクステンションを使用ã™ã‚‹å ´åˆã¯ã€ ã“ã®æŒ‡å®šã¯ä¸è¦ã§ã™ã€‚\n"
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+"HG\n"
+" 'hg' コマンドã¸ã®ãƒ‘ス。 フックï¼ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã€\n"
+" ãªã„ã—外部ツールã®èµ·å‹•ã®éš›ã«è‡ªå‹•çš„ã«è¨­å®šã•ã‚Œã¾ã™ã€‚\n"
+" 未設定や空ã®å ´åˆã¯ã€\n"
+" frozen å½¢å¼ã® hg 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã®åå‰ãŒè¨­å®šã•ã‚Œã‚‹ã‹ã€\n"
+" 'hg' ã¨ã„ã†åå‰ã®å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¤œç´¢ã•ã‚Œã¾ã™\n"
+" (Windows ã®å ´åˆã€ PATHEXT 環境変数ã«è¨­å®šã•ã‚ŒãŸ\n"
+" COM/EXE/BAT/CMD ç­‰ã®æ‹¡å¼µå­ä»˜ã)。"
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+"HGEDITOR\n"
+" コミットã®éš›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å…¥åŠ›ã‚’è¡Œã†ãŸã‚ã®ã‚¨ãƒ‡ã‚£ã‚¿ã®åå‰ã€‚\n"
+" EDITOR 環境変数ã«ã¤ã„ã¦ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " (deprecated, use configuration file)"
+msgstr " (éžæŽ¨å¥¨: 設定ファイル経由ã§æŒ‡å®šã—ã¦ãã ã•ã„)"
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+"HGENCODING\n"
+" Mercurial ã«ã‚ˆã‚‹ãƒ­ã‚±ãƒ¼ãƒ«è‡ªå‹•æ¤œå‡ºã®ä¸Šæ›¸ã。 ã“ã®è¨­å®šã¯ã€ ユーザåã€\n"
+" コミットメッセージ〠タグåãŠã‚ˆã³ãƒ–ランãƒåを内部データ形å¼ã«å¤‰æ›ã™ã‚‹\n"
+" éš›ã«ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ã“ã®ç’°å¢ƒå¤‰æ•°è¨­å®šã¯ã€ コマンドラインã§ã® --encoding\n"
+" 使用ã«ã‚ˆã‚Šã€ æ›´ã«ä¸Šæ›¸ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+"HGENCODINGMODE\n"
+" ユーザã‹ã‚‰ã®æŒ‡å®šå€¤ã‚’内部データ形å¼ã«å¤‰æ›ã™ã‚‹éš›ã«ã€ 指定ã®ç¬¦å·åŒ–ã¨\n"
+" åˆè‡´ã—ãªã„文字ãŒæ¤œå‡ºã•ã‚ŒãŸå ´åˆã® Mercurial ã®æŒ™å‹•ã®æŒ‡å®šã€‚ 無指定時ã¯ã€\n"
+" 「指定ã®ç¬¦å·åŒ–ã¨åˆè‡´ã—ãªã„å ´åˆã¯å‡¦ç†ä¸­æ–­ã€ã‚’æ„味ã™ã‚‹ \"strict\" ãŒæŒ‡å®š\n"
+" ã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã—ã¾ã™ã€‚ ä»–ã«ã¯ã€ 「未知ã®æ–‡å­—ã®ç½®ãæ›ãˆã€ã‚’æ„味ã™ã‚‹\n"
+" \"replace\" ã¨ã€ 「未知ã®æ–‡å­—ã®åˆ‡ã‚Šæ¨ã¦ã€ã‚’æ„味ã™ã‚‹ \"ignore\" ãŒæŒ‡å®š\n"
+" ã§ãã¾ã™ã€‚ ã“ã®ç’°å¢ƒå¤‰æ•°è¨­å®šã¯ã€ コマンドラインã§ã® --encodingmode\n"
+" 使用ã«ã‚ˆã‚Šã€ æ›´ã«ä¸Šæ›¸ãã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+"HGENCODINGAMBIGUOUS\n"
+" 表示幅ãŒ\"曖昧ãª\"文字ã«å¯¾ã™ã‚‹ Mercurial ã®æŒ™å‹•ã‚’決定ã—ã¾ã™ã€‚\n"
+" 例ãˆã°ã€ east asian 文字集åˆã«ãŠã‘る〠アクセント付ãã® Latin\n"
+" 文字ãªã©ãŒã“ã‚Œã«è©²å½“ã—ã¾ã™ã€‚\n"
+" 指定ãŒç„¡ã„å ´åˆã€ Mercurial ã¯æ›–昧ãªæ–‡å­—ã®å¹…ã‚’\n"
+" 1文字分 (narrow) ã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" ã“ã®æ‰‹ã®æ–‡å­—ãŒè¡¨ç¤ºä¸Šã®å•é¡Œã¨ãªã‚‹å ´åˆã¯ã€ 本環境変数を \"wide\"\n"
+" ã«è¨­å®šã—ã¦ãã ã•ã„。"
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+"HGMERGE\n"
+" マージã®éš›ã®è¡çªè§£æ¶ˆã«ä½¿ç”¨ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã€‚\n"
+" 指定ã•ã‚ŒãŸã‚³ãƒžãƒ³ãƒ‰ã®èµ·å‹•ã«ã¯ã€\n"
+" 作業領域ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€ マージ対象別リビジョンã®ãƒ•ã‚¡ã‚¤ãƒ«ã€\n"
+" 両者ã®è¦ªãƒªãƒ“ジョンã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’表ã™ã€ 3ã¤ã®å¼•æ•°ãŒæŒ‡å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+"HGRCPATH\n"
+" 設定ファイル読込ã®ãŸã‚ã®ã€ ファイルãªã„ã—ディレクトリã®ä¸€è¦§ã®æŒ‡å®šã€‚\n"
+" 一覧è¦ç´ ã®åŒºåˆ‡ã‚Šè¨˜å·ã¯ã€ Unix ãªã‚‰ \":\"〠WIndows ãªã‚‰ \";\" ã§ã™ã€‚\n"
+" HGRCPATH 環境変数ãŒè¨­å®šã•ã‚Œã¦ã„ãªã„å ´åˆã€ å„稼åƒç’°å¢ƒã«å¿œã˜ãŸ\n"
+" 読ã¿è¾¼ã¿å…ˆã‹ã‚‰èª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚ 空ã®å€¤ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+" ç¾ãƒªãƒã‚¸ãƒˆãƒªã® .hg/hgrc ã®ã¿ãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã™ã€‚"
+
+msgid " For each element in HGRCPATH:"
+msgstr " 指定ã•ã‚ŒãŸä¸€è¦§ã®å„è¦ç´ ã«å¯¾ã—ã¦ã€ 以下ã®ã‚ˆã†ã«æŒ¯èˆžã„ã¾ã™:"
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+" - ディレクトリãªã‚‰ã€ é…下㮠\".rc\" ã§çµ‚ã‚ã‚‹åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’読ã¿è¾¼ã‚€\n"
+" - ファイルãªã‚‰ã€ ãã®ãƒ•ã‚¡ã‚¤ãƒ«è‡ªèº«ã‚’読ã¿è¾¼ã‚€"
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+"HGPLAIN\n"
+" ã“ã®ç’°å¢ƒå¤‰æ•°ãŒè¨­å®šã•ã‚ŒãŸå ´åˆã€ Mercurial ã®è¡¨ç¤ºè¨­å®šã‚’変更ã—å¾—ã‚‹\n"
+" 設定ファイル中ã®è¨˜è¿°ãŒå…¨ã¦ç„¡è¦–ã•ã‚Œã¾ã™ã€‚\n"
+" encoding ã‚„ defaults ã®æŒ‡å®šã€ verbose モード〠debug モードã€\n"
+" quiet モード〠トレースãƒãƒƒã‚¯è¡¨ç¤ºè¨­å®šã‚„å„国語設定ãŒå¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚\n"
+" ユーザ設定を温存ã—ãŸã¾ã¾ã§ã€\n"
+" ツール等ã‹ã‚‰ Mercurial を使用ã™ã‚‹å ´åˆã«æœ‰ç”¨ã§ã™ã€‚"
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+" コマンドラインや環境変数ã«ã‚ˆã£ã¦ã€ åŒç­‰ã®ã‚ªãƒ—ションãŒã€\n"
+" 明示的ã«æŒ‡å®šã•ã‚ŒãŸå ´åˆã«ã¯ã€ ã“ららã¯ç„¡è¦–ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+" HGPLAIN ã«ã‚ˆã‚‹è¨­å®šç„¡åŠ¹åŒ–ã®éš›ã§ã‚‚ã€\n"
+" 維æŒã™ã‚‹æ©Ÿèƒ½ã‚’カンマ区切りã§åˆ—挙ã—ã¾ã™ã€‚\n"
+" ç¾åœ¨åˆ©ç”¨å¯èƒ½ãªæ©Ÿèƒ½å㯠\"i18n\" ã®ã¿ã§ã€\n"
+" 国際化関連機能ãŒç¶­æŒã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+" HGPLAINEXCEPT ã«ä½•ã‚‰ã‹ã®è¨­å®š (空設定ã§ã‚‚å¯) ã‚’ã—ãŸå ´åˆã€\n"
+" 設定無効化ãŒæ©Ÿèƒ½ã—ã¾ã™ã€‚"
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+"HGUSER\n"
+" コミット時ã«è¨˜éŒ²ã™ã‚‹ã€ リビジョン作æˆè€…åã®æŒ‡å®šã€‚\n"
+" 作æˆè€…åã¨ã—ã¦æŽ¡ç”¨ã•ã‚Œã‚‹å€¤ã¯ã€ 以下ã®é †åºã§æ±ºå®šã•ã‚Œã¾ã™:"
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+" - HGUSER 環境変数値(推奨ã•ã‚Œã¾ã›ã‚“)\n"
+" - (HGRCPATH 環境変数ã§æŒ‡å®šã•ã‚Œã‚‹)設定ファイル中ã®è¨­å®š\n"
+" - EMAIL 環境変数値\n"
+" - 対話的ãªå…¥åŠ›\n"
+" - LOGNAME 環境変数値(``@hostname`` ãŒä»˜ä¸Žã•ã‚Œã¾ã™)"
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"EMAIL\n"
+" リビジョン作æˆè€…ã¨ã—ã¦ã“ã®ç’°å¢ƒå¤‰æ•°å€¤ãŒè¨˜éŒ²ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" 詳細㯠HGUSER ã®è¨˜è¿°ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"LOGNAME\n"
+" リビジョン作æˆè€…ã¨ã—ã¦ã“ã®ç’°å¢ƒå¤‰æ•°å€¤ãŒè¨˜éŒ²ã•ã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" 詳細㯠HGUSER ã®è¨˜è¿°ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+"VISUAL\n"
+" コミット時ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã™ã‚‹ã‚¨ãƒ‡ã‚£ã‚¿åã®æŒ‡å®šã€‚EDITOR 環境変数\n"
+" ã«ã¤ã„ã¦ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+"EDITOR\n"
+" コミットログ入力時ã®ã‚ˆã†ã«ã€ エディタã§ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é–‹ãã€\n"
+" ユーザã«ã‚ˆã‚‹ç·¨é›†ã‚’促ã™çŠ¶æ³ãŒã‚ã‚Šã¾ã™ã€‚\n"
+" ãã“ã§ä½¿ç”¨ã•ã‚Œã‚‹ã‚¨ãƒ‡ã‚£ã‚¿ã¯ã€ HGEDITOR〠VISUAL\n"
+" ã‚ã‚‹ã„㯠EDITOR 環境変数ã«è¨­å®šã•ã‚ŒãŸã‚‚ã®ã‚’(ã“ã®é †åºã§)使用ã—ã¾ã™ã€‚\n"
+" 最åˆã®ç©ºã§ç„¡ã„値ã«è¨­å®šã•ã‚ŒãŸç’°å¢ƒå¤‰æ•°ã®å€¤ã‚’使用ã—ã¾ã™ã€‚\n"
+" ã„ãšã‚Œã‚‚未設定 (ã‚ã‚‹ã„ã¯ç©º) ã®å ´åˆã¯ã€ 'vi' ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+"PYTHONPATH\n"
+" Mercurial ãŒå½“該システムã®å…±æœ‰é ˜åŸŸã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ãªã„å ´åˆã€\n"
+" Python ãŒå¿…è¦ãªãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’読ã¿è¾¼ã‚€ãŸã‚ã«ã¯ã€ ã“ã®ç’°å¢ƒå¤‰æ•°ã®è¨­å®šãŒ\n"
+" å¿…è¦ã§ã™ã€‚\n"
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"Mercurial ã«ã¯ã€ æ–°è¦æ©Ÿèƒ½ã‚’「エクステンションã€ã¨ã„ã†æ©Ÿæ§‹ã‚’用ã„ã¦\n"
+"追加ã™ã‚‹ä»•çµ„ã¿ãŒå‚™ã‚ã£ã¦ã„ã¾ã™ã€‚ エクステンションã§ã¯ã€ コマンドã®\n"
+"æ–°è¦è¿½åŠ ã€ 既存コマンドã¸ã®ã‚ªãƒ—ションã®è¿½åŠ ã€ コマンドã®æŒ™å‹•ã®å¤‰æ›´ã€\n"
+"フックã®å®Ÿè£…ã¨ã„ã£ãŸã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"様々ãªäº‹æƒ…ã‹ã‚‰ã€ 特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã«ã¯ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯èª­ã¿è¾¼ã¾ã‚Œ\n"
+"ã¾ã›ã‚“。 付加的ãªèª­ã¿è¾¼ã¿ã¯ã€ 起動時間ã®å¢—加をæ„味ã—ã¾ã™ã€‚ 上級用途\n"
+"é™å®šã®ã‚‚ã®ã‚‚ã‚ã‚Šã¾ã™ã€‚ (履歴ã®ç ´å£Šã‚„改変ãªã©ã®)潜在的ãªå±é™ºæ€§ã‚’æŒã¤\n"
+"å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ 実験的ãªã‚‚ã®ã§ã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 ã“ã‚Œã¾ã§ã®\n"
+"Mercurial ã®æŒ¯ã‚‹èˆžã„を変ãˆã¦ã—ã¾ã†ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 エクステンションを\n"
+"å¿…è¦ã«å¿œã˜ã¦æœ‰åŠ¹åŒ–ã™ã‚‹ã®ã¯åˆ©ç”¨è€…ã®è²¬å‹™ã§ã™ã€‚"
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"\"foo\" ã¨ã„ã†ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’有効化ã™ã‚‹ã«ã¯ã€\n"
+"Mercurial åŒæ¢±ã®ã‚‚ã®ã§ã‚ã‚ã†ã¨ã€ Python ã®æ¤œç´¢ãƒ‘ス中ã®ã‚‚ã®ã§ã‚ã‚ã†ã¨ã€\n"
+"設定ファイルã«ãŠã„ã¦ä»¥ä¸‹ã®ã‚ˆã†ãªè¨˜è¿°ãŒå¿…è¦ã§ã™::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr "エクステンションã¸ã®ãƒ•ãƒ«ãƒ‘スを記述ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"明示的ã«ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã‚’無効化ã™ã‚‹å ´åˆã€ é©åˆ‡ãªè¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã„ã¦\n"
+"パス指定部分㫠'!' を記述ã—ã¾ã™::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # /path/to/extension/bar.py ã«ã‚るエクステンション bar ã®ç„¡åŠ¹åŒ–\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ã“ã¡ã‚‰ã¯ãƒ‘ス指定無ã—ã§ã® baz エクステンションã®ç„¡åŠ¹åŒ–\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr "Mercurial ã¯ãƒ•ã‚¡ã‚¤ãƒ«æŒ‡å®šã®ãŸã‚ã®å•ã„åˆã‚ã›è¨€èªžã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+"ä»–ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ターン指定ã¨åŒæ§˜ã«ã€ パターン種別ãŒå®šã‚られã¦ã„ã¦ã€\n"
+"'set:' 接頭辞ã§è¨˜è¿°ã‚’始ã‚ã¾ã™ã€‚ å•ã„åˆã‚ã›è¨€èªžã¯ã€Œè¿°èªžã€ (predicate)\n"
+"(※ 訳注: ã„ã‚ゆる「関数ã€çš„ãªã‚‚ã®) ã‚’æä¾›ã—ã¦ãŠã‚Šã€\n"
+"二項演算å­ã«ã‚ˆã‚‹çµåˆã‚„〠括弧ã«ã‚ˆã‚‹ã‚°ãƒ«ãƒ¼ãƒ—化もå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+"ファイルåやパターンãŒã€ ``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]``\n"
+"以外ã®æ–‡å­—や〠既存ã®è¿°èªžã¨ä¸€è‡´ã™ã‚‹å ´åˆã€ 引用符(') ãªã„ã—二é‡å¼•ç”¨ç¬¦(\")\n"
+"ã§å›²ã£ã¦ãã ã•ã„。 ã“ã®ä»•æ§˜ã¯ã€ glob 対象や述語ã®å¼•æ•°ä»¥å¤–ã®ã€\n"
+"å…¨ã¦ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‘ターンã«é©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+"エスケープ表記ã«ã‚ˆã‚Šã€ 引用符中ã®æ–‡å­—列中ã§ã€ 特殊文字を使用å¯èƒ½ã§ã™ã€‚\n"
+"例: ``\\n`` ã¯æ”¹è¡Œæ–‡å­—扱ã„。 特殊文字ã¨ã—ã¦è§£é‡ˆã•ã›ãŸããªã„å ´åˆã¯ã€\n"
+"文字列指定ã®å†’é ­ã« ``r`` を付ã‘ã¾ã™ã€‚ 例: ``r'...'``."
+
+msgid "There is a single prefix operator:"
+msgstr "使用å¯èƒ½ãªå‰ç½®å˜é …演算å­ã‚’以下ã«åˆ—挙ã—ã¾ã™:"
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" ファイル群 x ã«å«ã¾ã‚Œãªã„ファイル。 ``! x`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid "These are the supported infix operators:"
+msgstr "使用å¯èƒ½ãªäºŒé …演算å­ã‚’以下ã«åˆ—挙ã—ã¾ã™:"
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" ファイル群 x 㨠y ã®å…±é€šéƒ¨åˆ†ã€‚ ``x & y`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" ファイル群 x 㨠y ã®ç·å’Œã€‚ ``x | y`` åˆã¯ ``x + y`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr " ファイル群 x ã®ã†ã¡ã€ y ã«å±žã•ãªã„ã‚‚ã®ã€‚"
+
+msgid "The following predicates are supported:"
+msgstr "使用å¯èƒ½ãªè¿°èªžã‚’以下ã«åˆ—挙ã—ã¾ã™:"
+
+msgid ".. predicatesmarker"
+msgstr ".. predicatesmarker"
+
+msgid "Some sample queries:"
+msgstr "å•ã„åˆã‚ã›ã®è¨˜è¿°ä¾‹:"
+
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr "- 作業領域中ã®ãƒã‚¤ãƒŠãƒªæ‰±ã„ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’表示::"
+
+msgid " hg status -A \"set:binary()\""
+msgstr " hg status -A \"set:binary()\""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr "- .hgignore 対象ã®ä¸­ã§ã€ æ—¢ã«æ§‹æˆç®¡ç†ã•ã‚Œã¦ã„るファイルを登録除外::"
+
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr " hg forget \"set:hgignore() and not ignored()\""
+
+msgid "- Find text files that contain a string::"
+msgstr "- æ­£è¦è¡¨ç¾ magic ãŒå«ã¾ã‚Œã¦ã„るテキストファイルã®åå‰ã‚’表示::"
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr " hg locate \"set:grep(magic) and not binary()\""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr "- UTF-8 以外ã®æ–‡å­—コードを使ㆠC 言語ソースã®ãƒ•ã‚¡ã‚¤ãƒ«åを表示::"
+
+msgid " hg locate \"set:**.c and not encoding('UTF-8')\""
+msgstr " hg locate \"set:**.c and not encoding('UTF-8')\""
+
+msgid "- Revert copies of large binary files::"
+msgstr "- 指定サイズ以上ã§ãƒã‚¤ãƒŠãƒªæ‰±ã„ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¤‡è£½ã‚’å–り消ã—::"
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr " hg revert \"set:copied() and binary() and size('>1M')\""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr "- foo.lst ã®ä¸€è¦§ä¸­ã§ a åˆã¯ b ã‚’åå‰ã«å«ã‚€ãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録除外::"
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr ":hg:`help patterns` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+"Ancestor\n"
+" [祖先] 指定ã•ã‚ŒãŸãƒªãƒ“ジョンã‹ã‚‰ã€ 親リビジョンä¼ã„ã«åˆ°é”å¯èƒ½ãªã€\n"
+" ä»»æ„ã®ãƒªãƒ“ジョン。 より正確ã«ã¯ã€ ã‚るリビジョンã«ã¨ã£ã¦ã¯ã€\n"
+" 直接ã®è¦ªãƒªãƒ“ジョンã¯ç¥–å…ˆã§ã‚り〠祖先(ï¼ç›´æŽ¥ã®è¦ªãƒªãƒ“ジョンå«ã‚€)\n"
+" ã®è¦ªãƒªãƒ“ジョンも祖先ã¨ãªã‚Šã¾ã™ã€‚ 'Descendant' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+"Bookmark\n"
+" [ブックマーク] コミットã®éƒ½åº¦ç§»å‹•ã—ã¤ã¤ã€ 一定ã®ãƒªãƒ“ジョンを指ã™ã€\n"
+" 一種ã®ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚ リビジョン指定ã®éš›ã«ã¯ã€ ã‚¿ã‚°ã¨åŒæ§˜ã«ã€\n"
+" 常ã«ãƒ–ックマークåを使用ã§ãã¾ã™: 例 :hg:`update` 対象。\n"
+" ã‚¿ã‚°ã¨ã®é•ã„ã¯ã€ コミットã®éƒ½åº¦ã€ ブックマークãŒç§»å‹•ã™ã‚‹ã“ã¨ã§ã™ã€‚"
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+" ブックマークã¯ã€ 改å〠複製ãŠã‚ˆã³å‰Šé™¤å¯èƒ½ã§ã™ã€‚ リãƒã‚¸ãƒˆãƒªé–“ã§ã€\n"
+" 明示的ãªå映ï¼å–ã‚Šè¾¼ã¿ã‚’ã—ãªã„é™ã‚Šã€ ブックマークã¯ä¼æ’­ã—ã¾ã›ã‚“。\n"
+" ブックマークã®å映ï¼å–ã‚Šè¾¼ã¿ã«ã‚ˆã‚Šã€ ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã®é€£æºã®éš›ã«ã€\n"
+" åå‰ä»˜ãブランãƒã®ä»£æ›¿ã¨ã—ã¦ã€ ブックマークãŒä½¿ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+"Branch\n"
+" (åè©ž) [ブランãƒ] ヘッドã§ã¯ãªã„ (ï¼ ä»–ã«å­ãƒªãƒ“ジョンをæŒã¤)\n"
+" リビジョンを親ã¨ã—ã¦ã€ 作æˆã•ã‚ŒãŸå­ãƒªãƒ“ジョン。\n"
+" ã“れ㯠「ä½ç›¸çš„ (topological) ブランãƒã€ ã¨å‘¼ã°ã‚Œã¾ã™ã€‚\n"
+" ('Branch, topological' å‚ç…§) ä½ç›¸çš„ブランãƒãŒåå‰ã‚’æŒã¤å ´åˆã¯\n"
+" 「åå‰ä»˜ãブランãƒã€ã€ åå‰ã‚’æŒãŸãªã„å ´åˆã¯ã€Œåå‰ç„¡ã—ブランãƒã€\n"
+" ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ (※ 訳注: åå‰ã‚’「æŒã¤ï¼æŒãŸãªã„ã€ã¯ã€\n"
+" 「親ã¨ç•°ãªã‚‹åå‰ã€ã‚’æŒã¤ï¼æŒãŸãªã„〠をæ„味ã—ã¾ã™)\n"
+" 'Branch, anonymous' ãŠã‚ˆã³ 'Branch, named' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+" 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã§ç”Ÿæˆã•ã‚ŒãŸãƒªãƒ“ジョンãŒã€ リãƒã‚¸ãƒˆãƒªé–“連æº\n"
+" (å映ï¼å–ã‚Šè¾¼ã¿) ã®éš›ã«ã€ æ–°è¦ãƒ˜ãƒƒãƒ‰ã¨ã—ã¦å–ã‚Šè¾¼ã¾ã‚Œã‚‹ã“ã¨ã§ã€\n"
+" ブランãƒãŒç”Ÿæˆã•ã‚Œã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ 「ブランãƒã€ã¨ã„ã†å‘¼ç§°ã¯ã€\n"
+" 複数ã®è¦ä»¶ã«å¯¾ã—ã¦ã€ 個別ã«ä½œæ¥­ãŒè¡Œã‚れる状æ³ã‚’指ã™å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚\n"
+" ã“ã®ã‚ˆã†ãªä½œæ¥­ã¯ã€ 明示的ã«åå‰ä»˜ãブランãƒã‚’作æˆã—ãŸä¸Šã§ã€\n"
+" 実施ã•ã‚Œã‚‹ã“ã¨ã‚‚ã‚ã‚Œã°ã€ ローカルホスト上ã§ã€ ブックマーク機能やã€\n"
+" リãƒã‚¸ãƒˆãƒªè¤‡è£½ã¨åå‰ç„¡ã—ブランãƒã«ã‚ˆã£ã¦ã€ 実施ã•ã‚Œã‚‹å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚"
+
+msgid " Example: \"The experimental branch\"."
+msgstr " 例: \"実験的ãª(開発用)ブランãƒ\""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+" (å‹•è©ž) [ブランãƒã™ã‚‹/分å²ã™ã‚‹/æžåˆ†ã‹ã‚Œã™ã‚‹] ã‚るリビジョンã«ãŠã„ã¦ã€\n"
+" 2ã¤ç›®ä»¥é™ã®å­ãƒªãƒ“ジョンを作æˆã™ã‚‹æ“作。"
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr " 例: \"リビジョン X ã‹ã‚‰ãƒ–ランãƒã™ã‚‹\""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+"Branch, anonymous\n"
+" [åå‰ç„¡ã—ブランãƒ/匿åブランãƒ] æ–°è¦ã«ä½œæˆã•ã‚ŒãŸãƒªãƒ“ジョンãŒã€\n"
+" ヘッドã§ã¯ãªã„ (ï¼ å­ãƒªãƒ“ジョンを他ã«æŒã¤) リビジョンを親ã«æŒã¡ã€\n"
+" 親ã¨åŒã˜ãƒ–ランãƒã«å±žã™ã‚‹å ´åˆã€ ãれをåå‰ç„¡ã—ブランãƒã¨ã¿ãªã—ã¾ã™ã€‚\n"
+" (※ 訳注: 良ãã‚る誤解ãŒã€ 『default ã«å±žã™ã‚‹å ´åˆã®ã¿ãŒåå‰ç„¡ã—ã€\n"
+" ã¨ã„ã†ã‚‚ã®ã§ã™ã€‚ default ã‚‚ 『default〠ã¨ã„ã†åå‰ã®ãƒ–ランãƒã§ã™ã€‚\n"
+" æžåˆ†ã‹ã‚Œã®éš›ã«ã€ 親ã¨ç•°ãªã‚‹ãƒ–ランãƒã«å±žã™ã‚‹ã‹å¦ã‹ãŒã€ åå‰ä»˜ãã¨ã€\n"
+" åå‰ç„¡ã—ã®å·®ç•°ã«ãªã‚Šã¾ã™ã€‚)"
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+"Branch, closed\n"
+" [閉鎖(ã•ã‚ŒãŸ)ブランãƒ] å…¨ã¦ã®ãƒ˜ãƒƒãƒ‰ãŒé–‰éŽ–ã•ã‚ŒãŸã€ åå‰ä»˜ãブランãƒã€‚"
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+"Branch, default\n"
+" [デフォルトブランãƒ] 所属ã™ã‚‹åå‰ä»˜ãブランãƒãŒã€ 明示ã•ã‚Œãªã„å ´åˆã«ã€\n"
+" æ–°è¦ãƒªãƒ“ジョンãŒå±žã™ã‚‹åå‰ä»˜ãブランãƒã€‚ (※ 訳注: 親リビジョンãŒã€\n"
+" 既㫠default 以外ã®åå‰ä»˜ãブランãƒã«å±žã™ã‚‹å ´åˆã€ 所属ブランãƒã¯ã€\n"
+" 明示ã•ã‚Œã¦ã„ã‚‹ã‚‚ã®ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™)"
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+"Branch head\n"
+" 'Head, branch' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+"Branch, inactive\n"
+" [éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ–ランãƒ] ä½ç›¸çš„ãªãƒ˜ãƒƒãƒ‰ãŒç„¡ã„åå‰ä»˜ãブランãƒã¯ã€\n"
+" éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ–ランãƒã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 例ãˆã° default ブランãƒã«ã€\n"
+" 機能実装用ã®åå‰ä»˜ãブランãƒãŒãƒžãƒ¼ã‚¸ã•ã‚Œã‚‹ã¨ã€ 機能実装用ブランãƒã¯ã€\n"
+" éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã¾ã™ã€‚ :hg:`branches` ã¯ã€ --active 指定ãŒç„¡ã„å ´åˆã€\n"
+" éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªãƒ–ランãƒã‚‚表示ã—ã¾ã™ã€‚"
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+" 備考: 履歴ツリー構造を元ã«ã—ãŸã€ 暗黙的ãªçŠ¶æ³ã‚’å…ƒã«ã—ã¦ã„ã‚‹ã“ã¨ã‹ã‚‰ã€\n"
+" ã“ã®æ¦‚念ã®å¸¸ç”¨ã¯éžæŽ¨å¥¨ã§ã™ã€‚ ä¸è¦ã«ãªã£ãŸåå‰ä»˜ãブランãƒã¯ã€\n"
+" :hg:`commit --close-branch` ã«ã‚ˆã‚Šã€ 明示的ã«é–‰éŽ–ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+"Branch, named\n"
+" [åå‰ä»˜ãブランãƒ] åŒä¸€ã®ãƒ–ランãƒåã‚’æŒã¤ãƒªãƒ“ジョンã®é›†åˆã€‚\n"
+" åå‰ä»˜ãブランãƒã«å±žã™ã‚‹ãƒªãƒ“ジョンã¯ã€ ãã®å­ãƒªãƒ“ジョンもã€\n"
+" åŒã˜åå‰ä»˜ãブランãƒã«å±žã—ã¾ã™ã€‚ 別ãªåå‰ä»˜ãブランãƒã‚’ã€\n"
+" 明示的ã«æŒ‡å®šã™ã‚‹ã“ã¨ã§ã€ 次ã®ã‚³ãƒŸãƒƒãƒˆã§ç”Ÿæˆã•ã‚Œã‚‹å­ãƒªãƒ“ジョンã®ã€\n"
+" 所属ブランãƒã‚’変更ã§ãã¾ã™ã€‚ ブランãƒç®¡ç†ã®è©³ç´°ã¯ã€\n"
+" :hg:`help branch` 〠:hg:`help branches` ãŠã‚ˆã³\n"
+" :hg:`commit --close-branch` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+" åå‰ä»˜ãブランãƒã¯ã€ リãƒã‚¸ãƒˆãƒªã®å±¥æ­´ã‚’構æˆã™ã‚‹ãƒªãƒ“ジョン群をã€\n"
+" é‡è¤‡ã®ç„¡ã„部分集åˆã¸ã¨åˆ†å‰²ã™ã‚‹ã€ åå‰ç©ºé–“ã®ä¸€ç¨®ã¨ã‚‚言ãˆã¾ã™ã€‚\n"
+" åå‰ä»˜ãブランãƒã¯ã€ å¿…ãšã—ã‚‚ä½ç›¸çš„ブランãƒã§ã‚ã‚‹å¿…è¦ã¯ã‚ã‚Šã¾ã›ã‚“。\n"
+" ã‚ã‚‹åå‰ä»˜ãブランム(default ã§ã‚‚å¯) ã®ãƒ˜ãƒƒãƒ‰ã¨ãªã‚‹ãƒªãƒ“ジョンを親ã«ã€\n"
+" 別ã®åå‰ä»˜ãブランãƒã‚’æ–°è¦ç”Ÿæˆã—ãŸå ´åˆã€ 元ブランãƒã«å¯¾ã—ã¦ã€\n"
+" 以後ã®æ–°è¦ãƒªãƒ“ジョン追加ãŒç„¡ã‘ã‚Œã°ã€ 元ブランãƒã¯ (ä½ç›¸çš„ãªæ„味ã§)\n"
+" 『分å²ã€ã—ãŸã®ã§ã¯ãªã〠åå‰ãŒä»˜ã„ã¦ã„ã‚‹ã ã‘ã¨è¨€ãˆã¾ã™ã€‚"
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+"Branch tip\n"
+" 'Tip, branch' å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+"Branch, topological\n"
+" [ä½ç›¸çš„ブランãƒ] ヘッドã§ã¯ãªã„ (ï¼ ä»–ã«å­ãƒªãƒ“ジョンをæŒã¤)\n"
+" リビジョンを親ã¨ã—ã¦ã€ æ–°è¦ã«ä½œæˆã•ã‚ŒãŸãƒªãƒ“ジョンã¯ã€ \n"
+" ä½ç›¸çš„ブランãƒã¨ãªã‚Šã¾ã™ã€‚ ä½ç›¸çš„ブランãƒã«åå‰ãŒä¸Žãˆã‚‰ã‚ŒãŸå ´åˆã€\n"
+" ãã‚Œã¯åå‰ä»˜ãブランãƒã¨ãªã‚Šã¾ã™ã€‚ (※ 訳注: åå‰ä»˜ãブランãƒã¯ã€\n"
+" å¿…ãšã—ã‚‚ä½ç›¸çš„ブランãƒã¨ã¯é™ã‚Šã¾ã›ã‚“) åå‰ãŒä¸Žãˆã‚‰ã‚Œãªã„å ´åˆã¯ã€\n"
+" ç¾è¡Œã®åå‰ä»˜ãブランム(一般的ã«ã¯ default) ã«ãŠã‘ã‚‹ã€\n"
+" åå‰ç„¡ã—ブランãƒã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+"Changelog\n"
+" [変更履歴] å„リビジョンã®å†…容を〠リãƒã‚¸ãƒˆãƒªç™»éŒ²é †ã«è¨˜éŒ²ã—ãŸã‚‚ã®ã€‚\n"
+" 記録内容ã«ã¯ã€ 識別用ãƒãƒƒã‚·ãƒ¥å€¤ã€ 作æˆè€…å〠コミットログã€\n"
+" 日付〠ãŠã‚ˆã³å¤‰æ›´å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ãŒå«ã¾ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+"Changeset\n"
+" [ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆ] 変更記録ã®ãŸã‚ã®ãƒªãƒã‚¸ãƒˆãƒªçŠ¶æ…‹ã®ã‚¹ãƒŠãƒƒãƒ—ショット。\n"
+" (※ 訳注: æ­´å²çš„ãªçµŒç·¯ã‹ã‚‰ã€ ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆã¨ãƒªãƒ“ジョンã¯ã€\n"
+" åŒã˜æ„味ã§ä½¿ç”¨ã•ã‚Œã‚‹ã‚±ãƒ¼ã‚¹ãŒå¤šã„ã§ã™ã€‚ Mercurial ã®ç¿»è¨³ã§ã¯ã€\n"
+" 概㭠「リビジョン〠ã¨è¨³ã—ã¦ã„ã¾ã™ãŒã€ 一部ã«ä¸çµ±ä¸€ãªéƒ¨åˆ†ã‚‚ã‚ã‚Šã¾ã™ã€‚\n"
+" 'Revision' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。)"
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+"Changeset, child\n"
+" [å­(リビジョン)] 「親(リビジョン)〠ã®å¯¾ç¾©èªžã€‚\n"
+" リビジョン P ãŒãƒªãƒ“ジョン C ã®è¦ªã§ã‚ã‚‹å ´åˆã€ C 㯠P ã®å­ã¨ãªã‚Šã¾ã™ã€‚\n"
+" 親ã«å¯¾ã™ã‚‹å­ã®æ•°ã«ã¯ä¸Šé™ãŒã‚ã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+"Changeset id\n"
+" [リビジョンID/識別用ãƒãƒƒã‚·ãƒ¥å€¤] リビジョンを一æ„ã«è­˜åˆ¥ã™ã‚‹\n"
+" SHA-1 ãƒãƒƒã‚·ãƒ¥å€¤ã€‚ 40æ¡16進数ã¨ã—ã¦è¡¨ç¾ã•ã‚Œã‚‹ 「完全長〠ã®ã‚‚ã®ã¨ã€\n"
+" 12æ¡16進数ã¨ã—ã¦è¡¨ç¾ã•ã‚Œã‚‹ 「短縮〠形å¼ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+"Changeset, merge\n"
+" [マージリビジョン] 親リビジョンを2ã¤æŒã¤ãƒªãƒ“ジョン。\n"
+" :hg:`merge` 実施çµæžœã‚’〠コミットã™ã‚‹ã“ã¨ã§ç”Ÿæˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+"Changeset, parent\n"
+" [親(リビジョン)] å­ãƒªãƒ“ジョンã®ç”±æ¥å…ƒã¨ãªã‚‹ãƒªãƒ“ジョン。\n"
+" より明確ã«ã¯ã€ リビジョン C ã®è¦ªã¯ã€ (旧→新順ã®) 履歴ツリーã«ãŠã„ã¦ã€\n"
+" リビジョン C ã®ç›´å‰ã®ãƒªãƒ“ジョンを指ã—ã¾ã™ã€‚ å„リビジョンã®è¦ªã¯ã€\n"
+" 最大ã§ï¼’ã¤ã§ã™ã€‚"
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+"Checkout\n"
+" [ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆ] (åè©ž) 指定リビジョンã®å†…容ã§ã€ æ›´æ–°ã•ã‚ŒãŸä½œæ¥­é ˜åŸŸã€‚\n"
+" åŒç­‰ã®æ„味を表ã™å ´åˆã€ 「リビジョン〠ã®æ–¹ãŒå¦¥å½“ãªã®ã§ã€\n"
+" ã“ã®ç”¨æ³•ã§ã®ä½¿ç”¨ã¯é¿ã‘ã¾ã—ょã†ã€‚"
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr " 例: \"ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã—㟠X を使用ã™ã‚‹ã€‚\""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (å‹•è©ž) 指定リビジョンã§ã®ä½œæ¥­é ˜åŸŸã®æ›´æ–°ã€‚ :hg:`help update`\n"
+" ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr " 例: \"リビジョン X ã‚’ãƒã‚§ãƒƒã‚¯ã‚¢ã‚¦ãƒˆã™ã‚‹ã€‚\""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+"Child changeset\n"
+" 'Changeset, child' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Close changeset\n"
+" See 'Head, closed branch'"
+msgstr ""
+"Close changeset\n"
+" 'Head, closed branch' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+"Closed branch\n"
+" 'Branch, closed' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+"Clone\n"
+" (åè©ž) [複製(リãƒã‚¸ãƒˆãƒª)] ã‚るリãƒã‚¸ãƒˆãƒªã®å…¨ä½“〠ãªã„ã—一部ã‹ã‚‰ã€\n"
+" 複製ã•ã‚ŒãŸãƒªãƒã‚¸ãƒˆãƒªã€‚ 部分複製リãƒã‚¸ãƒˆãƒªã®æŒã¤å¤‰æ›´å±¥æ­´ã¯ã€\n"
+" 指定リビジョンã¨ã€ ãã®ç¥–å…ˆã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™ã€‚"
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr " 例: \"ã‚ãªãŸã®è¤‡è£½(リãƒã‚¸ãƒˆãƒª)ã¯æœ€æ–°ã§ã™ã‹ï¼Ÿ\""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+" (å‹•è©ž) [(リãƒã‚¸ãƒˆãƒªã®)複製] 複製リãƒã‚¸ãƒˆãƒªã‚’作æˆã™ã‚‹æ“作。\n"
+" :hg:`clone` を使用ã—ã¾ã™ã€‚"
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr " 例: \"リãƒã‚¸ãƒˆãƒªã‚’複製ã—ã¾ã™ã€‚\""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+"Closed branch head\n"
+" 'Head, closed branch' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+"Commit\n"
+" [コミット] (åè©ž) リビジョンã®åˆ¥ç§°ã€‚"
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr " 例: \"最新ã®ã‚³ãƒŸãƒƒãƒˆã§ã€ ãƒã‚°ã¯ä¿®æ­£ã•ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ\""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+" (å‹•è©ž) 変更内容をリãƒã‚¸ãƒˆãƒªã«è¨˜éŒ²ã™ã‚‹æ“作。\n"
+" コミットã®éš›ã«ã¯ã€ コミット対象ファイルã®ã€ 作業領域中ã®å†…容ã¨ã€\n"
+" 親リビジョンã«ãŠã‘る内容ã‹ã‚‰ã€ 差分ãŒå–られ〠リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" æ–°è¦ãƒªãƒ“ジョンãŒä½œæˆã•ã‚Œã¾ã™ã€‚"
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr " 例: \"ãã®å¤‰æ›´ã¯ã€ ã™ãã«ã‚³ãƒŸãƒƒãƒˆã™ã¹ãã§ã™ã€‚\""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+"Cset\n"
+" 「ãƒã‚§ãƒ³ã‚¸ã‚»ãƒƒãƒˆã€ã®ç•¥è¨˜ã€‚"
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+"DAG\n"
+" 分散構æˆç®¡ç†ã‚·ã‚¹ãƒ†ãƒ  (DVCS) ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘るリビジョン群ã¯ã€\n"
+" リビジョンã«ç›¸å½“ã™ã‚‹ãƒŽãƒ¼ãƒ‰ (node) ã¨ã€ 親〜å­ã®é–¢ä¿‚ã«ç›¸å½“ã™ã‚‹ã‚¨ãƒƒã‚¸\n"
+" (edge) ã‹ã‚‰æˆã‚‹ã€ éžå¾ªç’°æœ‰å‘グラフ (directed acyclic graph:DAG)\n"
+" ã¨ã—ã¦è¡¨ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®ã‚°ãƒ©ãƒ•ã¯ã€ :hg:`glog` (graphlog)\n"
+" ãªã©ã«ã‚ˆã‚Šå¯è¦–化ã§ãã¾ã™ã€‚ å„リビジョンã¯æœ€å¤§2ã¤ã®è¦ªã—ã‹æŒã¦ãªã„ã€\n"
+" ã¨ã„ã†ã®ãŒã€ Mercurial ã® DAG ã«ãŠã‘る制約ã§ã™ã€‚(※ 訳注:\n"
+" 多ãã®ã‚±ãƒ¼ã‚¹ã§ DAG 㯠「履歴ツリー〠的ãªãƒ‹ãƒ¥ã‚¢ãƒ³ã‚¹ã§ç”¨ã„られるãŸã‚ã€\n"
+" 基本的ã«ã¯ã€Œå±¥æ­´ãƒ„リーã€ã¨è¨³ã—ã¦ã„ã¾ã™)"
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+"Default branch\n"
+" 'Branch, default' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+"Descendant\n"
+" [å­å­«] 指定ã•ã‚ŒãŸãƒªãƒ“ジョンã‹ã‚‰ã€ å­ãƒªãƒ“ジョンä¼ã„ã«åˆ°é”å¯èƒ½ãªã€\n"
+" ä»»æ„ã®ãƒªãƒ“ジョン。 より正確ã«ã¯ã€ ã‚るリビジョンã«ã¨ã£ã¦ã€\n"
+" 直接ã®å­ãƒªãƒ“ジョンã¯å­å­«ã§ã‚り〠å­å­«ã®å­ãƒªãƒ“ジョンもå­å­«ã¨ãªã‚Šã¾ã™ã€‚\n"
+" 'Ancestor' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+"Diff\n"
+" (åè©ž) [差分] ï¼’ã¤ã®ãƒªãƒ“ジョン〠ãªã„ã—作業領域ã¨ãƒªãƒ“ジョン間ã§ã®ã€\n"
+" ファイルã®å†…容ã¨å±žæ€§ã®å·®ç•°ã€‚ 差分ã®è¡¨ç¾ã¯ã€ \"diff\" ãªã„ã— \"patch\"\n"
+" ã¨å‘¼ã°ã‚Œã‚‹å½¢å¼ã§è¡¨ç¾ã•ã‚Œã¾ã™ã€‚ ファイルã®è¤‡è£½ï¼æ”¹åや属性ã®å¤‰æ›´ã¯ã€\n"
+" \"diff\" ã‚„ \"patch\" ã®å½¢å¼ã§ã¯è¡¨ç¾ã§ããªã„ãŸã‚〠\"git diff\"\n"
+" å½¢å¼ã‚’使ã£ã¦è¡¨ç¾ã•ã‚Œã¾ã™ã€‚"
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr " 例: \"ç§ã®ä¿®æ­£ã®å·®åˆ†ã‚’見ã¦ã‚‚らãˆã¾ã—ãŸã‹ï¼Ÿ\""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+" (å‹•è©ž) [差分をå–ã‚‹] 2ã¤ã®ãƒªãƒ“ジョン間ã§å·®åˆ†ã‚’å–る行為ã¯ã€ \n"
+" \"diff\" ã‚„ \"patch\" å½¢å¼ã‚’生æˆã™ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+" Example: \"リビジョン X ã¨ã®å·®åˆ†ã‚’å–ã‚Œã°ã€ ç§ã®æ„図ãŒã‚ã‹ã‚Šã¾ã™ã€‚\""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+"Directory, working\n"
+" [作業領域] 作業領域ã¯ã€ 次ã®ã‚³ãƒŸãƒƒãƒˆã«ã‚ˆã£ã¦è¨˜éŒ²ã•ã‚Œã‚‹ã€\n"
+" Mercurial 管ç†ä¸‹ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’ä¿æŒã—ã¾ã™ã€‚ åˆæœŸçŠ¶æ…‹ã§ã¯ã€\n"
+" (親リビジョンã¨å‘¼ã°ã‚Œã‚‹) 既存ã®ãƒªãƒ“ジョンã¨åŒã˜å†…容をæŒã¡ã¾ã™ã€‚\n"
+" 'Parent, working directory' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 マージやã€\n"
+" ファイルã¸ã®å¤‰æ›´æ“作ã«ã‚ˆã£ã¦ã€ 状態ãŒå¤‰æ›´ã•ã‚Œã¾ã™ã€‚\n"
+" リãƒã‚¸ãƒˆãƒªã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã¯ã€ 作業領域中㮠.hg ディレクトリé…下ã«ã€\n"
+" æ ¼ç´ã•ã‚Œã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Draft\n"
+" Changesets in the draft phase have not been shared with publishing\n"
+" repositories and may thus be safely changed by history-modifying\n"
+" extensions. See :hg:`help phases`."
+msgstr ""
+"Draft\n"
+" draft フェーズã®ãƒªãƒ“ジョンã¯ã€ publishing リãƒã‚¸ãƒˆãƒªé–“ã§ã€\n"
+" 共有ã•ã‚Œãªã„ã“ã¨ã‹ã‚‰ã€ 履歴改変エクステンションをé©ç”¨å¯èƒ½ã§ã™ã€‚\n"
+" :hg:`help phases` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+"Graph\n"
+" DAG ãŠã‚ˆã³ :hg:`help graphlog` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+"Head\n"
+" [ヘッド] 使用ã™ã‚‹æ–‡è„ˆã«å¿œã˜ã¦ã€ ブランãƒã®ãƒ˜ãƒƒãƒ‰ã¨ã€\n"
+" リãƒã‚¸ãƒˆãƒªã®ãƒ˜ãƒƒãƒ‰ã®ã€ 2ã¤ã®æ„味ã§ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚ ãã‚Œãžã‚Œã®è©³ç´°ã¯ã€\n"
+" 'Head, branch' ãŠã‚ˆã³ 'Head, repository' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+" 開発ã«ãŠã„ã¦ã€ ヘッドã¯æ—¥å¸¸çš„ã«ç™ºç”Ÿã—〠作業領域更新やã€\n"
+" マージæ“作ã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+"Head, branch\n"
+" [ブランãƒ(ã®)ヘッド] åŒä¸€åå‰ä»˜ãブランãƒä¸Šã«ã€ å­ã‚’æŒãŸãªã„リビジョン。"
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+"Head, closed branch\n"
+" [閉鎖(ã•ã‚ŒãŸ)ブランãƒ(ã®)ヘッド] ヘッドã¸ã®é–‰éŽ–を実施ã—ãŸãƒªãƒ“ジョン。\n"
+" (※ 訳注: 閉鎖æ“作(commit)ã®å®Ÿæ–½ã¯ã€ 閉鎖対象リビジョン上ã§è¡Œã†ãŸã‚ã€\n"
+" 閉鎖実施リビジョン ï¼ é–‰éŽ–ãƒ–ãƒ©ãƒ³ãƒãƒ˜ãƒƒãƒ‰ã¨ãªã‚Šã¾ã™) 閉鎖済ã¿ãƒ˜ãƒƒãƒ‰ã¯\n"
+" :hg:`heads` ã§åˆ—挙ã•ã‚Œã¾ã›ã‚“。 å…¨ã¦ã®ãƒ˜ãƒƒãƒ‰ãŒé–‰éŽ–ã•ã‚Œã‚‹ã¨ã€\n"
+" ãã®åå‰ä»˜ãブランãƒã¯é–‰éŽ–済ã¿ã¨ã¿ãªã•ã‚Œã€ 以é™ã® :hg:`branches`\n"
+" ã§åå‰ãŒåˆ—挙ã•ã‚Œãªããªã‚Šã¾ã™ã€‚"
+
+msgid ""
+" Closed heads can be re-opened by committing new changeset as the\n"
+" child of the changeset that marks a head as closed."
+msgstr ""
+" 閉鎖ブランãƒã®ãƒ˜ãƒƒãƒ‰ã«å¯¾ã—ã¦ã€ æ–°è¦ã®å­ãƒªãƒ“ジョンを生æˆã™ã‚‹ã“ã¨ã§ã€\n"
+" 当該ヘッドã®é–‰éŽ–状態ãŒè§£æ¶ˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+"Head, repository\n"
+" [リãƒã‚¸ãƒˆãƒª(ã®)ヘッド] 閉鎖ã•ã‚Œã¦ã„ãªã„〠ä½ç›¸çš„ãªãƒ˜ãƒƒãƒ‰ã€‚"
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+"Head, topological\n"
+" [ä½ç›¸çš„(ãª)ヘッド] リãƒã‚¸ãƒˆãƒªå†…ã«ã€ å­ã‚’æŒãŸãªã„リビジョン。"
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+"History, immutable\n"
+" [改変ä¸èƒ½(ãª)履歴] 一旦コミットã•ã‚ŒãŸãƒªãƒ“ジョンã¯ã€ 改変ã§ãã¾ã›ã‚“。\n"
+" 履歴改変機能を謳ã†ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯ã€ 実際ã«ã¯å±¥æ­´ã®æ”¹å¤‰ã§ã¯ãªãã€\n"
+" æ–°è¦ãƒªãƒ“ジョンã«ã‚ˆã‚‹ã€ 既存リビジョンã®ç½®ãæ›ãˆ (破棄をå«ã‚€)\n"
+" ã‚’è¡Œã£ã¦ã„ã¾ã™ã€‚ 公開リãƒã‚¸ãƒˆãƒªä¸Šã§ã“ã®æ“作を行ã£ãŸå ´åˆã€\n"
+" 既存ã®ã‚‚ã®ã¨åŒä¸€å†…容ã®ãƒªãƒ“ジョンãŒã€ 履歴上ã«ç¾ã‚Œã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+"History, rewriting\n"
+" [履歴(ã®)改変] リãƒã‚¸ãƒˆãƒªã«è¨˜éŒ²ã•ã‚ŒãŸå±¥æ­´ã¯ã€ 改変ä¸èƒ½ã§ã™ã€‚\n"
+" ã—ã‹ã— Mercurial ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã«ã¯ã€ 既存リビジョンã®å†…容をã€\n"
+" ã‚る種ã®æ–¹æ³•ã§æ”¹å¤‰ã§ãã‚‹ (よã†ã«è¦‹ã›ã‚‹) ã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+"Immutable history\n"
+" 'History, immutable' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+"Merge changeset\n"
+" 'Changeset, merge' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+"Manifest\n"
+" [管ç†å¯¾è±¡/マニフェスト] å„リビジョンã«ãŠã‘る〠管ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã®ä¸€è¦§ã€‚"
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+"Merge\n"
+" [マージ] æžåˆ†ã‹ã‚Œã—ãŸä½œæ¥­æˆæžœã‚’çµ±åˆã™ã‚‹æ“作。 リビジョンを指定ã—ã¦ã€\n"
+" 作業領域を更新ã—ãŸä¸Šã§ã€ 別ãªãƒªãƒ“ジョンã¨ã®ãƒžãƒ¼ã‚¸ã‚’è¡Œã£ãŸå ´åˆã€\n"
+" 後者ã®å±¥æ­´ã«ãŠã‘ã‚‹æˆæžœã‚’〠作業領域ã«æŒã¡è¾¼ã‚€ã“ã¨ã«ãªã‚Šã¾ã™ã€‚\n"
+" è¡çªãŒè§£æ¶ˆã•ã‚ŒãŸ (åŠã³ã€ãã®æ—¨æ˜Žç¤ºã•ã‚ŒãŸ) ãªã‚‰ã°ã€\n"
+" 履歴ツリーã«ãŠã‘ã‚‹2ã¤ã®æžåˆ¥ã‚Œã‚’〠1ã¤ã«çµ±åˆã™ã‚‹ãƒªãƒ“ジョンã¨ã—ã¦ã€\n"
+" マージçµæžœã‚’コミットã§ãã¾ã™ã€‚"
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+"Named branch\n"
+" 'Branch, named' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+"Null changeset\n"
+" [空リビジョン] 作業領域ãŒæ›´æ–°ã•ã‚Œã¦ã„ãªã„〠新è¦ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã‘ã‚‹ã€\n"
+" 親リビジョン。 以上ã®ã“ã¨ã‹ã‚‰ã€ ルートリビジョンã®è¦ªã§ã‚ã‚Šã€\n"
+" ID '000000000000' ã¨åˆ¥å 'null' ã®ã©ã¡ã‚‰ã§ã‚‚指定å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+"Parent\n"
+" 'Changeset, parent' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+"Parent changeset\n"
+" 'Changeset, parent' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+"Parent, working directory\n"
+" [作業領域ã®è¦ª] 作業領域ã¯ã€ :hg:`parents` ãŒè¡¨ç¤ºã™ã‚‹ãƒªãƒ“ジョン\n"
+" (未コミットマージã®å ´åˆã¯2ã¤) ï¼ ä½œæ¥­é ˜åŸŸã®è¦ªã«å¯¾ã™ã‚‹ã€\n"
+" 仮想的ãªå­ãƒªãƒ“ジョンã§ã™ã€‚ 作業領域ã®è¦ªã¯ :hg:`update` ã§å¤‰æ›´ã—ã¾ã™ã€‚\n"
+" ä»–ã«ã‚‚ :hg:`summary` ã‚„ :hg:`id` ã§ä½œæ¥­é ˜åŸŸã®è¦ªã‚’知るã“ã¨ãŒå¯èƒ½ã§ã™ã€‚\n"
+" \".\" ã¨ã„ã†åˆ¥åã§ã‚‚記述å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+"Patch\n"
+" (åè©ž) [パッãƒ] 差分å–å¾—æ“作ã§å¾—られる出力。"
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr " 例: \"ç§ã®ãƒ‘ッãƒã‚’é€ã‚Šã¾ã—ãŸã€‚\""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+" (å‹•è©ž) [パッãƒ(ã‚’)当ã¦(ã‚‹)] ã‚るリビジョン時点ã®å†…容ã«å¯¾ã™ã‚‹ã€\n"
+" パッãƒé©ç”¨ã«ã‚ˆã‚‹æ”¹å¤‰æ“作 (※ 訳注: æš—ã«æ–°è¦ãƒªãƒ“ジョンã®ç”Ÿæˆã‚’想定)。"
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr " Example: \"ãã®ãƒªãƒ“ジョンã¸ã®ãƒ‘ッãƒå½“ã¦ãŒå¿…è¦ã§ã™ã€‚\""
+
+msgid ""
+"Phase\n"
+" A per-changeset state tracking how the changeset has been or\n"
+" should be shared. See :hg:`help phases`."
+msgstr ""
+"Phase\n"
+" [フェーズ] リビジョン毎ã«ç®¡ç†ã•ã‚Œã¦ã„る〠共有å¯å¦ã®æƒ…報。\n"
+" :hg:`help phases` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Public\n"
+" Changesets in the public phase have been shared with publishing\n"
+" repositories and are therefore considered immutable. See :hg:`help\n"
+" phases`."
+msgstr ""
+"Public\n"
+" public フェーズã®ãƒªãƒ“ジョンã¯ã€ publishing リãƒã‚¸ãƒˆãƒªé–“ã§ã€\n"
+" 共有ã•ã‚Œã‚‹ã“ã¨ã‹ã‚‰ã€ 改変ä¸èƒ½ãƒªãƒ“ジョンã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+" :hg:`help phases` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+"Pull\n"
+" [(リビジョンã®)å–ã‚Šè¾¼ã¿] 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«ç„¡ã„リビジョンをã€\n"
+" 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰å–り込むæ“作。 特定ã®ã‚ªãƒ—ション指定ãŒç„¡ã‘ã‚Œã°ã€\n"
+" ã“ã®æ“作ã¯ãƒªãƒã‚¸ãƒˆãƒªã®ã¿ã‚’æ›´æ–°ã—〠作業領域ã¯æ›´æ–°ã—ã¾ã›ã‚“。。\n"
+" :hg:`help pull` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+"Push\n"
+" [(リビジョンã®)å映] 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã—ã‹ç„¡ã„リビジョンをã€\n"
+" 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å映ã™ã‚‹æ“作。 手元ã®ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" コミットã•ã‚ŒãŸãƒªãƒ“ジョンを〠連æºå…ˆã«è¿½åŠ ã™ã‚‹ã ã‘ã§ã™ã€‚\n"
+" 未コミットã®å¤‰æ›´ã¯å映ã•ã‚Œã¾ã›ã‚“。 :hg:`help push`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+"Repository\n"
+" [リãƒã‚¸ãƒˆãƒª] 管ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹ã‚’記録ã—ãŸãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã€‚\n"
+" 記録ã•ã‚ŒãŸçŠ¶æ…‹ã«ã‚ˆã£ã¦ã€ リビジョンãŒè¡¨ç¾ã•ã‚Œã¾ã™ã€‚ リãƒã‚¸ãƒˆãƒªã¯ã€\n"
+" 通常 (「常ã«ã€ã§ã¯ã‚ã‚Šã¾ã›ã‚“) ã§ã‚ã‚Œã°ã€ 作業領域㮠``.hg``\n"
+" é…下ã«ã‚ã‚Šã¾ã™ã€‚ 記録ã•ã‚ŒãŸçŠ¶æ…‹ã¯ã€ 特定ã®ãƒªãƒ“ジョンを指定ã—ãŸ\n"
+" \"updating\" ã«ã‚ˆã£ã¦ã€ 作業領域ã«å†ç¾ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+"Repository head\n"
+" 'Head, repository' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+"Revision\n"
+" [リビジョン] ã‚る時点ã«ãŠã‘るリãƒã‚¸ãƒˆãƒªã®çŠ¶æ…‹ã€‚ :hg:`update` ã«ã‚ˆã‚Šã€\n"
+" 以å‰ã®ãƒªãƒ“ジョン時点ã«ãŠã‘る内容ã§ã€ 作業領域を更新ã§ãã¾ã™ã€‚\n"
+" 'Revision number' ãŠã‚ˆã³ 'Changeset' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+"Revision number\n"
+" [リビジョン番å·] 当該リãƒã‚¸ãƒˆãƒªã®ãƒªãƒ“ジョンを〠一æ„ã«è­˜åˆ¥ã™ã‚‹æ•´æ•°ã€‚\n"
+" リãƒã‚¸ãƒˆãƒªã¸ã®è¿½åŠ é †ã§ã€ å„リビジョン㫠0 ã‹ã‚‰ç•ªå·ã‚’振ã£ãŸã‚‚ã®ã§ã™ã€‚\n"
+" リビジョン番å·ã¯ã€ リãƒã‚¸ãƒˆãƒªã®è¤‡è£½æ¯Žã«ç•°ãªã‚Šå¾—ã¾ã™ã€‚\n"
+" 複数ã®ãƒªãƒã‚¸ãƒˆãƒªé–“ã§ã€ リビジョンを一æ„ã«è­˜åˆ¥ã™ã‚‹æ–¹æ³•ã¯ã€\n"
+" 'Changeset id' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+"Revlog\n"
+" Mercurial ã«ãŠã‘る履歴記録ã®å½¢å¼ã€‚ å„リビジョンã«ç›¸å½“ã™ã‚‹å·®åˆ†ã¨ã€\n"
+" 一定間隔ã§ã®å®Œå…¨ãªãƒ‡ãƒ¼ã‚¿ã‹ã‚‰ã€ 構æˆã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+" 管ç†å¯¾è±¡ãƒ‡ãƒ¼ã‚¿ã¨ã€ データå‚照用ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’æ ¼ç´ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+"Rewriting history\n"
+" 'History, rewriting' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+"Root\n"
+" [ルート(リビジョン)] 親ãŒç©ºãƒªãƒ“ジョンã®ã¿ã®ãƒªãƒ“ジョン。\n"
+" 一般的ãªãƒªãƒã‚¸ãƒˆãƒªã§ã¯ã€ ルートリビジョンã¯ï¼‘ã¤ã ã‘ã§ã™ã€‚"
+
+msgid ""
+"Secret\n"
+" Changesets in the secret phase may not be shared via push, pull,\n"
+" or clone. See :hg:`help phases`."
+msgstr ""
+"Secret\n"
+" secret フェーズã®ãƒªãƒ“ジョンã¯ã€ push/pull/clone ã®å¯¾è±¡å¤–ã§ã™ã€‚\n"
+" :hg:`help phases` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+"Tag\n"
+" [ã‚¿ã‚°] リビジョンã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸåˆ¥å。 リビジョン指定ã®éš›ã«ã¯ã€\n"
+" 常ã«ã‚¿ã‚°åを使用ã§ãã¾ã™: 例 :hg:`update` 対象。\n"
+" ã‚¿ã‚°ã®ç”Ÿæˆã¯å±¥æ­´ã«è¨˜éŒ²ã•ã‚Œã€ å映ï¼å–ã‚Šè¾¼ã¿ã«ã‚ˆã£ã¦ã€\n"
+" ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã«ä¼æ’­ã—ã¾ã™ã€‚"
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+"Tip\n"
+" 最大ã®ãƒªãƒ“ジョン番å·ã‚’æŒã¤ãƒªãƒ“ジョン。 当該リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" 最も最後ã«è¿½åŠ ã•ã‚ŒãŸãƒªãƒ“ジョン。"
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+"Tip, branch\n"
+" [ブランãƒ(ã®) tip] リビジョン番å·ãŒæœ€å¤§ãªã€ 指定ブランãƒã®ãƒ˜ãƒƒãƒ‰ã€‚\n"
+" リビジョン指定ã®éš›ã«ã€ ブランãƒåãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€ ブランムtip\n"
+" 指定ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 'Branch, head' ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" リビジョン番å·ã¯ã€ リãƒã‚¸ãƒˆãƒªã®è¤‡è£½æ¯Žã«ç•°ãªã‚Šå¾—ã‚‹ãŸã‚〠ブランムtip\n"
+" もリãƒã‚¸ãƒˆãƒªæ¯Žã«ç•°ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+"Update\n"
+" (åè©ž) [更新内容] リビジョンã®è¨€ã„æ›ãˆã€‚"
+
+msgid " Example: \"I've pushed an update\"."
+msgstr " 例: \"更新内容をå映ã—ã¦ãŠãã¾ã—ãŸã€‚\""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (å‹•è©ž) [æ›´æ–°] 作業領域を〠特定リビジョン時点ã®å†…容ã§æ›¸ãæ›ãˆã‚‹æ“作。\n"
+" :hg:`help update` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid " Example: \"You should update\"."
+msgstr " 例: \"(作業領域ã®)æ›´æ–°ãŒå¿…è¦ã§ã™ã€‚\""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+"Working directory\n"
+" 'Directory, working' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+"Working directory parent\n"
+" 'Parent, working directory' ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+msgid ""
+"Synopsis\n"
+"========"
+msgstr ""
+"概è¦\n"
+"===="
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+"Mercurial ã§ã¯ã€ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆç›´ä¸‹ã«ç½®ã‹ã‚ŒãŸ ``.hgignore``\n"
+"ã¨å‘¼ã°ã‚Œã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’使用ã—ã¦ã€æ§‹æˆç®¡ç†å¯¾è±¡ã‹ã‚‰ã®\n"
+"ファイルã®é™¤å¤–を制御ã—ã¾ã™ã€‚"
+
+msgid ""
+"Description\n"
+"==========="
+msgstr ""
+"説明\n"
+"===="
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+"Mercurial ã®ä½œæ¥­é ˜åŸŸã«ã¯ã€ 構æˆç®¡ç†å¯¾è±¡ã«ã—ãŸããªã„ファイルも\n"
+"多数存在ã—å¾—ã¾ã™ã€‚ 例ãˆã°ã€ エディタã®ä½œæˆã™ã‚‹ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ファイルや\n"
+"コンパイラãŒç”Ÿæˆã™ã‚‹ä¸­é€”ï¼æœ€çµ‚æˆæžœç‰©ç­‰ã§ã™ã€‚\n"
+"作業領域ã®ãƒ«ãƒ¼ãƒˆç›´ä¸‹ã«ç½®ã„㟠``.hgignore`` ファイルã«ãŠã„ã¦ã€\n"
+"対象ファイルã®åå‰ã‚’列挙ã™ã‚‹ã“ã¨ã§ã€ ã“れらを無視ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+"``.hgignore`` ã¯æ˜Žç¤ºçš„ã«æ‰‹å‹•ã§ä½œæˆã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+"一般的ã«ã¯ã€ ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚‚構æˆç®¡ç†å¯¾è±¡ã«å«ã‚ã¾ã™ã®ã§ã€\n"
+"更新内容ã®å映やå–ã‚Šè¾¼ã¿ã«ã‚ˆã£ã¦ã€ 設定内容ã¯ä»–ã®ãƒªãƒã‚¸ãƒˆãƒªã«ã‚‚ä¼æ’­ã—ã¾ã™ã€‚"
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+"未登録ファイルãŒã€ 作業領域ã®ãƒ«ãƒ¼ãƒˆã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã€\n"
+"ãªã„ã—ãã®ãƒ‘スã®å…ˆé ­éƒ¨åˆ†ãŒã€ ``.hgignore``\n"
+"ã«è¨˜è¿°ã•ã‚ŒãŸãƒ‘ターンã¨åˆè‡´ã™ã‚‹å ´åˆã€\n"
+"ãã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯ Mercurial ã‹ã‚‰ã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+"例ãˆã°ã€ 未登録ファイル ``file.c`` ãŒã€\n"
+"作業領域㮠``a/b/file.c`` ã«ä½ç½®ã™ã‚‹ã¨ä»®å®šã—ã¾ã™ã€‚\n"
+"``a/b/file.c``〠``a/b`` ãªã„ã— ``a`` ã¨ã„ã£ãŸãƒ‘ターンãŒ\n"
+"``.hgignore`` ã«è¨˜è¿°ã•ã‚Œã¦ã„ã‚‹å ´åˆã€\n"
+"Mercurial ã¯ã“ã® ``file.c`` を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+"作業領域毎ã®ç„¡è¦–設定ã«åŠ ãˆã¦ã€ ユーザ毎〠ãªã„ã—システム毎ã®\n"
+"無視設定ファイルを指定ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™:\n"
+"ã“れらã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¨­å®šã«é–¢ã™ã‚‹è©³ç´°ã¯ã€\n"
+":hg:`help config` ã® ``[ui]`` セクションã«ãŠã‘ã‚‹\n"
+"``ignore`` 設定キーã®èª¬æ˜Žã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+"æ—¢ã«æ§‹æˆç®¡ç†ä¸‹ã«ã‚るファイルã«å¯¾ã—ã¦ã€\n"
+"Mercurial コマンドã®å®Ÿæ–½è¦å¦ã‚’制御ã™ã‚‹ã«ã¯ã€\n"
+"多ãã®ã‚³ãƒžãƒ³ãƒ‰ã§ã‚µãƒãƒ¼ãƒˆã•ã‚Œã¦ã„ã‚‹ ``-I`` ãŠã‚ˆã³ ``-X``\n"
+"ã®ä½¿ç”¨ãŒä¾¿åˆ©ã§ã™ã€‚ 詳細ã«é–¢ã—ã¦ã¯ã€\n"
+":hg:`help <command>` ãŠã‚ˆã³ :hg:`help patterns` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Files that are already tracked are not affected by .hgignore, even\n"
+"if they appear in .hgignore. An untracked file X can be explicitly\n"
+"added with :hg:`add X`, even if X would be excluded by a pattern\n"
+"in .hgignore."
+msgstr ""
+"æ—¢ã«ç®¡ç†å¯¾è±¡ã¨ãªã£ã¦ã„るファイルã¯ã€ .hgignore 中ã®æŒ‡å®šãŒåˆè‡´ã—ã¦ã‚‚ã€\n"
+"無視ã®å¯¾è±¡ã¨ã¯ãªã‚Šã¾ã›ã‚“。 .hgignore 記述ã«ã‚ˆã‚Šã€ 管ç†å¯¾è±¡å¤–ã®ãƒ•ã‚¡ã‚¤ãƒ«\n"
+"X ãŒç„¡è¦–ã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚〠明示的㪠:hg:`add X` 実行ã«ã‚ˆã‚Šã€\n"
+"ファイル X を管ç†å¯¾è±¡ã«ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+"無視設定ファイルã¯ã€ 1è¡Œ1パターンã§ãƒ‘ターンãŒåˆ—挙ã•ã‚ŒãŸã€\n"
+"å˜ç´”ãªãƒ†ã‚­ã‚¹ãƒˆãƒ•ã‚¡ã‚¤ãƒ«ã§ã™ã€‚ 空ã®è¡Œã¯ç„¡è¦–ã•ã‚Œã¾ã™ã€‚\n"
+"``#`` 文字ã¯ã‚³ãƒ¡ãƒ³ãƒˆæ–‡å­—〠``\\`` 文字ã¯ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—文字ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+"Mercurial ã®ç„¡è¦–設定ファイルã§ã¯ã€ 複数ã®ãƒ‘ターン文法を利用ã§ãã¾ã™ã€‚\n"
+"デフォルトã®æ–‡æ³•ã¯ Python/Perl å½¢å¼ã®æ­£è¦è¡¨ç¾ã§ã™ã€‚"
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr "文法を変更ã™ã‚‹ã«ã¯ã€ 以下ã®ã‚ˆã†ãªå½¢å¼ã®è¡Œã‚’記述ã—ã¾ã™::"
+
+msgid " syntax: NAME"
+msgstr " syntax: NAME"
+
+msgid "where ``NAME`` is one of the following:"
+msgstr "``NAME`` 部分ã«ã¯ã€ 以下ã®ã„ãšã‚Œã‹ã‚’記述ã—ã¾ã™:"
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+"``regexp``\n"
+" Python/Perl å½¢å¼ã®æ­£è¦è¡¨ç¾ (※ 訳注: ``re`` ã§ã‚‚å¯)\n"
+"``glob``\n"
+" Shell å½¢å¼ã®ãƒ‘ターンマッãƒ"
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+"文法変更ã®æŒ‡å®šã¯ã€ 次ã«æ–‡æ³•ã‚’指定ã™ã‚‹ã¾ã§ã«è¨˜è¿°ã•ã‚ŒãŸã€\n"
+"å…¨ã¦ã®ãƒ‘ターンã«å¯¾ã—ã¦æœ‰åŠ¹ã§ã™ã€‚"
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+"glob 㨠regexp ã®ã„ãšã‚Œã®å ´åˆã‚‚〠作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+"部分一致ã™ã‚Œã°åˆè‡´ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ glob 文法ã§ã® ``*.c`` パターン指定ã¯ã€\n"
+"ä»»æ„ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ãŠã‘ã‚‹ ``.c`` æ‹¡å¼µå­ãƒ•ã‚¡ã‚¤ãƒ«ã«åˆè‡´ã—ã¾ã™ã—ã€\n"
+"regexp 文法ã§ã® ``\\.c$`` パターン指定も〠åŒæ§˜ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«åˆè‡´ã—ã¾ã™ã€‚\n"
+"ルート直下ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«ã®ã¿åˆè‡´ã•ã›ãŸã„å ´åˆã€ regexp 文法ã§ã‚ã‚Œã°ã€\n"
+"パターン記述を ``^`` ã§é–‹å§‹ã—ã¦ãã ã•ã„。"
+
+msgid ""
+".. note::\n"
+" Patterns specified in other than ``.hgignore`` are always rooted.\n"
+" Please see :hg:`help patterns` for details."
+msgstr ""
+".. note::\n"
+" ``.hgignore`` 以外ã®è¨˜è¿°ã§ã¯ã€ 作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+" パス先頭ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚ 詳細㯠:hg:`help patterns`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Example\n"
+"======="
+msgstr ""
+"記述例\n"
+"======"
+
+msgid "Here is an example ignore file. ::"
+msgstr "無視設定ファイルã®è¨˜è¿°ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ ::"
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+" # Shell å½¢å¼ãƒ‘ターンマッãƒæ–‡æ³•ã‚’指定。\n"
+" syntax: glob"
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+" # æ­£è¦è¡¨ç¾æ–‡æ³•ã¸ã®åˆ‡ã‚Šæ›¿ãˆã€‚\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a tree of repositories. In the second case, repository\n"
+"paths and global options can be defined using a dedicated\n"
+"configuration file common to :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` and ``hgweb.fcgi``."
+msgstr ""
+"Mercurial ã®å†…部ウェブサーãƒæ©Ÿèƒ½ hgweb ã¯ã€ å˜ä¸€ãƒªãƒã‚¸ãƒˆãƒªãªã„ã—ã€\n"
+"リãƒã‚¸ãƒˆãƒªã®ãƒ„リーを公開å¯èƒ½ã§ã™ã€‚ 後者ã®å ´åˆã€ 専用ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ã‚ˆã‚Šã€\n"
+"パスやオプション設定を定義å¯èƒ½ã§ã™ã€‚ 設定ファイル㯠:hg:`serve`ã€\n"
+"``hgweb.wsgi``ã€ã€€``hgweb.cgi`` ãŠã‚ˆã³ ``hgweb.fcgi`` ã§å…±é€šã§ã™ã€‚"
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files\n"
+"but recognizes only the following sections:"
+msgstr ""
+"ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®è¨˜è¿°æ–‡æ³•ã¯ã€ 通常㮠Mercurial 設定ファイルã¨åŒã˜ã§ã™ãŒã€\n"
+"以下ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã¿ãŒèªè­˜ã•ã‚Œã¾ã™:"
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+" - web\n"
+" - paths\n"
+" - collections"
+
+msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgstr "``web`` ã§ã®è¨˜è¿°ã®è©³ç´°ã¯ :hg:`help config` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"The ``paths`` section maps URL paths to paths of repositories in the\n"
+"filesystem. hgweb will not expose the filesystem directly - only\n"
+"Mercurial repositories can be published and only according to the\n"
+"configuration."
+msgstr ""
+"``paths`` セクションã¯ã€ URL 上ã®ãƒ‘スã¨ã€ ãã‚Œã«å¯¾å¿œã™ã‚‹ãƒªãƒã‚¸ãƒˆãƒªã®ã€\n"
+"ファイルシステム上ã«ãŠã‘るパスを対応付ã‘ã¾ã™ã€‚ hgweb ã«ã‚ˆã‚‹å…¬é–‹ã¯ã€\n"
+"ファイルシステムã®ç›´æŽ¥å…¬é–‹ã§ã¯ãªã〠Mercurial ã®ãƒªãƒã‚¸ãƒˆãƒªã®ã¿ã‚’ã€\n"
+"設定ã«å¾“ã£ã¦å…¬é–‹ã—ã¾ã™ã€‚"
+
+msgid ""
+"The left hand side is the path in the URL. Note that hgweb reserves\n"
+"subpaths like ``rev`` or ``file``, try using different names for\n"
+"nested repositories to avoid confusing effects."
+msgstr ""
+"設定キー㯠URL 中ã®ãƒ‘スを指ã—ã¾ã™ã€‚ hgweb ã§ã¯ ``rev`` ã¾ãŸã¯ ``file``\n"
+"ã¨ã„ã£ãŸåå‰ã¯ã€ 特定用途用ã«ä½¿ã‚ã‚Œã¾ã™ã®ã§ã€ 想定外ã®æŒ™å‹•ã‚’é¿ã‘ã‚‹ãŸã‚ã«ã€\n"
+"リãƒã‚¸ãƒˆãƒªã®ãƒ‘スãŒã€ ã“れらã¨è¡çªã—ãªã„よã†ã«æ³¨æ„ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"The right hand side is the path in the filesystem. If the specified\n"
+"path ends with ``*`` or ``**`` the filesystem will be searched\n"
+"recursively for repositories below that point.\n"
+"With ``*`` it will not recurse into the repositories it finds (except for\n"
+"``.hg/patches``).\n"
+"With ``**`` it will also search inside repository working directories\n"
+"and possibly find subrepositories."
+msgstr ""
+"設定値ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚·ã‚¹ãƒ†ãƒ ä¸Šã®ãƒ‘スã§ã™ã€‚ パス指定末尾㌠``*`` ã‚„ ``**``\n"
+"ã®å ´åˆã€ 指定ã®ãƒ‘スä½ç½®ã‹ã‚‰ã€ リãƒã‚¸ãƒˆãƒªã®æ¤œå‡ºãŒã€ å†å¸°çš„ã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚\n"
+"パスã®æœ«å°¾ãŒ ``*`` ã®å ´åˆã€ 検出ã•ã‚ŒãŸãƒªãƒã‚¸ãƒˆãƒªé…下ã®å†å¸°çš„検出ã¯ã€\n"
+"実施ã•ã‚Œã¾ã›ã‚“ (``.hg/patches`` é…下を除ã)。 パス末尾㌠``**`` ã®å ´åˆã€\n"
+"副リãƒã‚¸ãƒˆãƒªã®ã‚ˆã†ãªã€ 作業領域中ã®ãƒªãƒã‚¸ãƒˆãƒªã‚‚〠å†å¸°çš„ã«æ¤œå‡ºã•ã‚Œã¾ã™ã€‚"
+
+msgid "In this example::"
+msgstr "以下ã®è¨­å®šä¾‹ã®å ´åˆ::"
+
+msgid ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+msgstr ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry will publish every Mercurial repository found in\n"
+" ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``\n"
+" will appear as ``http://server/quux/``\n"
+"- The fourth entry will publish both ``http://server/user/bob/quux/``\n"
+" and ``http://server/user/bob/quux/testsubrepo/``"
+msgstr ""
+"- 冒頭ã®2ã¤ã®è¨­å®šã¯ã€ ファイルシステム上ã¯ç•°ãªã‚‹ä½ç½®ã«ã‚るリãƒã‚¸ãƒˆãƒªã‚’ã€\n"
+" URL 上ã¯åŒä¸€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªé…下ã«ã‚るよã†ã«è¦‹ã›ã¾ã™\n"
+"- 3ã¤ç›®ã®è¨­å®šã¯ã€ ``/srv/repos/`` é…下ã®å…¨ãƒªãƒã‚¸ãƒˆãƒªã‚’公開ã—ã¾ã™ã€‚\n"
+" 例ãˆã° ``/srv/repos/quux/`` リãƒã‚¸ãƒˆãƒªã¯ ``http://server/quux/``\n"
+" ã¨ã—ã¦ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ã§ã™ã€‚\n"
+"- ï¼”ã¤ç›®ã®è¨­å®šã§ã¯ã€ ``http://server/user/bob/quux/`` ã¨\n"
+" ``http://server/user/bob/quux/testsubrepo/`` ã®ä¸¡æ–¹ãŒå…¬é–‹ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"The ``collections`` section is deprecated and has been superseeded by\n"
+"``paths``.\n"
+msgstr ""
+"``collections`` セクションã§ã®è¨­å®šã¯éžæŽ¨å¥¨ãªã®ã§ã€ 代ã‚ã‚Šã« ``paths``\n"
+"を使用ã—ã¦ãã ã•ã„。\n"
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr "Mercurial ã§ã®æ›´æ–°å†…容マージã«ã¯ã€ マージツールを使用ã—ã¾ã™ã€‚"
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+"マージツールã¯ã€ 2ã¤ã®ç•°ãªã‚‹ãƒªãƒ“ジョンã«ãŠã‘るファイルã®å†…容をã€\n"
+"1ã¤ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«çµ±åˆã—ã¾ã™ã€‚ マージツール実行時ã«ã¯ã€\n"
+"çµ±åˆå¯¾è±¡ã¨ãªã‚‹2ã¤ã®ãƒªãƒ“ジョン時点ã®å†…容をæŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ã«åŠ ãˆã¦ã€\n"
+"2ã¤ã®å…±é€šã®ç¥–å…ˆã¨ãªã‚‹ãƒªãƒ“ジョン時点ã®å†…容をæŒã¤ãƒ•ã‚¡ã‚¤ãƒ«ãŒä¸Žãˆã‚‰ã‚Œã€\n"
+"åŒæ–¹ã®ãƒªãƒ“ジョンã«ãŠã‘る変更内容ãŒç‰¹å®šã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+"マージツールã¯ã€ :hg:`resolve`〠:hg:`merge`〠:hg:`update` ã‚„\n"
+":hg:`backout` ãŠã‚ˆã³å¹¾ã¤ã‹ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã®å®Ÿè¡Œæ™‚ã«èµ·å‹•ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+"一般的ãªãƒžãƒ¼ã‚¸ãƒ„ールã¯ã€ çµ±åˆå¯¾è±¡ã¨ãªã‚‹ãƒªãƒ“ジョンã«è‡³ã‚‹éŽç¨‹ã§ã€\n"
+"共通ã®ç¥–先を元ã«ç‹¬ç«‹ã—ã¦å®Ÿæ–½ã•ã‚ŒãŸã€ ç•°ãªã‚‹éƒ¨ä½ã¸ã®å¤‰æ›´ã«é–¢ã—ã¦ã¯ã€\n"
+"ãã‚Œãžã‚ŒãŒä¸¡ç«‹ã§ãるよã†ã«ã€ 自動的ã«åŒæ–¹ã®å¤‰æ›´ã‚’å–ã‚Šè¾¼ã¿ã¾ã™ã€‚\n"
+"ãã‚Œã«åŠ ãˆã¦ã€ 近接箇所ã¸ã®ç•°ãªã‚‹å¤‰æ›´ã«ã‚ˆã£ã¦ã€\n"
+"è¡çª (conflict) ãŒç”Ÿã˜ã‚‹å ´åˆã«ã¯ã€\n"
+"グラフィカル㪠UI ã§ã®å¯¾è©±çš„ãªè¡çªã®è§£æ¶ˆã‚„ã€\n"
+"è¡çªãƒžãƒ¼ã‚¯ã‚’çµæžœãƒ•ã‚¡ã‚¤ãƒ«ã«åŸ‹ã‚込んã ã‚Šã—ã¾ã™ã€‚\n"
+"Mercurial 自身ã¯å¯¾è©±çš„ãªãƒžãƒ¼ã‚¸ãƒ„ールをæä¾›ã›ãšã«ã€\n"
+"外部ツールã¨é€£æºã™ã‚‹ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"Available merge tools\n"
+"====================="
+msgstr ""
+"利用å¯èƒ½ãªãƒžãƒ¼ã‚¸ãƒ„ール\n"
+"======================"
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+"外部ã®ãƒžãƒ¼ã‚¸ãƒ„ールã¨ãã®å®Ÿè¡Œã«é–¢ã™ã‚‹è¨­å®šã¯ã€ 設定ファイルã®\n"
+"merge-tools セクションã«è¨˜è¿°ã•ã‚Œã¾ã™ãŒã€ 設定記述ã®éš›ã®åå‰ã«ã¯ã€\n"
+"外部ツールã®ã‚³ãƒžãƒ³ãƒ‰åãã®ã‚‚ã®ã‚’使用ã™ã‚‹ãŒé€šä¾‹ã§ã™\n"
+"- hgrc(5) ã‚’å‚ç…§ã—ã¦ãã ã•ã„\n"
+"(※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½)。"
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+"マージツール設定ã¯ã€ システム上ã«å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ã€\n"
+"且ã¤ãƒžãƒ¼ã‚¸å‡¦ç†ãŒå¯èƒ½ã§ã‚ã‚‹å ´åˆã«æ„味をæŒã¡ã¾ã™ã€‚\n"
+"実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã®æŒ‡å®šã¯ã€ 絶対ãªã„ã—相対パスã§æŒ‡å®šã•ã‚Œã‚‹ã‹ã€\n"
+"コマンドサーãƒãƒ‘ス設定上ã«ã€\n"
+"åŒåã®å®Ÿè¡Œå¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã™ã‚‹å ´åˆã«æœ‰åŠ¹ã¨ãªã‚Šã¾ã™ã€‚\n"
+"マージツールã¯ãƒžãƒ¼ã‚¸å‡¦ç†ãŒå¯èƒ½ã§ã‚ã‚‹ã‚‚ã®ã¨ä»®å®šã•ã‚Œã¾ã™ã€‚\n"
+"対象ãŒã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ シンボリックリンクãŒæ‰±ãˆã‚‹ (設定ã®) å ´åˆã€\n"
+"対象ãŒãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã§ ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ãŒæ‰±ãˆã‚‹ (設定ã®) å ´åˆã€\n"
+"ã‚ã‚‹ã„㯠GUI ãŒå¿…è¦ãªè¨­å®šã§ GUI ãŒåˆ©ç”¨å¯èƒ½ãªå ´åˆã¯ã€\n"
+"ãã‚Œãžã‚Œé©åˆ‡ã«æ©Ÿèƒ½ã™ã‚‹ã“ã¨ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr "以下ã®ã‚ˆã†ãªå†…部マージツールも利用å¯èƒ½ã§ã™:"
+
+msgid ".. internaltoolsmarker"
+msgstr ".. internaltoolsmarker"
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+"内部マージツールã¯ã€ 常ã«åˆ©ç”¨å¯èƒ½ã§ GUI ã‚‚å¿…è¦ã¨ã—ã¾ã›ã‚“ãŒã€\n"
+"シンボリックリンクやãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯å¯¾å¿œã—ã¾ã›ã‚“。"
+
+msgid ""
+"Choosing a merge tool\n"
+"====================="
+msgstr ""
+"マージツールã®é¸æŠž\n"
+"=================="
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr "Mercurial ã§ä½¿ç”¨ã•ã‚Œã‚‹ãƒžãƒ¼ã‚¸ãƒ„ールã¯ä»¥ä¸‹ã®é †åºã§æ±ºå®šã•ã‚Œã¾ã™:"
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+"1. :hg:`merge` ã‚„ :hg:`resolve` 㧠--tool ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 指定ã•ã‚ŒãŸãƒ„ールãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" merge-tools 設定ã«è¨˜è¿°ã•ã‚ŒãŸåå‰ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã€\n"
+" 設定内容ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚ ãれ以外ã®å ´åˆã€ 指定ã•ã‚ŒãŸãƒ„ールã¯ã€\n"
+" 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+"2. ``HGMERGE`` 環境変数ãŒè¨­å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã€ ãã®å†…容ãŒé©ç”¨ã•ã‚Œã¾ã™ãŒã€\n"
+" 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+"3. merge-patterns セクションã«è¨˜è¿°ã•ã‚ŒãŸãƒ‘ターンã«ã€\n"
+" マージ対象ファイルã®åå‰ãŒåˆè‡´ã—ãŸå ´åˆã€\n"
+" åˆè‡´ã—ãŸãƒ‘ターンã«å¯¾å¿œã™ã‚‹æœ€åˆã®ãƒžãƒ¼ã‚¸ãƒ„ールãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®é©ç”¨å¯å¦è¨­å®šã¯è€ƒæ…®ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+"4. ui セクション㮠merge 設定ã¯ã“ã®æ®µéšŽã§è€ƒæ…®ã•ã‚Œã¾ã™ã€‚\n"
+" 指定内容㌠merge-tools 設定ã«è¨˜è¿°ã•ã‚ŒãŸåå‰ã§ã¯ç„¡ã„å ´åˆã€\n"
+" 実行å¯èƒ½ãƒ•ã‚¡ã‚¤ãƒ«ãŒæŒ‡å®šã•ã‚Œãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。\n"
+" ãれ以外ã®å ´åˆã¯ã€ 利用å¯èƒ½ãªè¨­å®šå†…容ãŒé©ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+"5. merge-tools 設定ã«ä½•ã‚‰ã‹ã®è¨˜è¿°ãŒã‚ã‚‹å ´åˆã€\n"
+" 優先度ã®æœ€ã‚‚高ã„ツールãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+"6. ``hgmerge`` ã¨ã„ã†åå‰ã®ãƒ„ールãŒåˆ©ç”¨å¯èƒ½ãªå ´åˆã¯ã“ã‚ŒãŒåˆ©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" 但ã—シンボリックリンクやãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã«ã¯é©ç”¨ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+"7. マージ対象ファイルãŒã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã‚„ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã§ãªã„å ´åˆã€\n"
+" ``internal:merge`` ãŒä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+"8. ファイルã®ãƒžãƒ¼ã‚¸ã¯å¤±æ•—ã¨ã¿ãªã•ã‚Œã€ 手動ã§ã® :hg:`resolve` ãŒå¿…è¦ã§ã™ã€‚"
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+".. note::\n"
+" マージツールã®é¸æŠžãŒå®Œäº†ã—ãŸãªã‚‰ã€\n"
+" ã¾ãšæœ€åˆã« Mercurial ã¯å˜ç´”マージ処ç†ã‚’実施ã—ã¾ã™ã€‚\n"
+" ã“ã®éš›ã«è¡çªãŒæ¤œå‡ºã•ã‚Œã¦ã€ マージã«å¤±æ•—ã—ãŸå ´åˆã«é™ã‚Š\n"
+" Mercurial ã¯é¸æŠžã—ãŸãƒžãƒ¼ã‚¸ãƒ„ールã«ã‚ˆã‚‹ãƒžãƒ¼ã‚¸ã‚’è¡Œã„ã¾ã™ã€‚\n"
+" 最åˆã«å˜ç´”マージ処ç†ã‚’実施ã™ã‚‹ã‹å¦ã‹ã¯ premerge 設定ã§åˆ¶å¾¡ã§ãã¾ã™ã€‚\n"
+" シンボリックリンクやãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ä»¥å¤–ã«é–¢ã—ã¦ã¯ã€\n"
+" premerge ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã¯æœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+"マージツールã®è¨­å®šè©³ç´°ã«é–¢ã—ã¦ã¯ã€ hgrc(5) ã«ãŠã‘ã‚‹ merge-tools ã‚„\n"
+"ui セクションをå‚ç…§ã—ã¦ãã ã•ã„。 (※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½)\n"
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+"Mercurial ã«è¤‡æ•°ã®ãƒªãƒ“ジョンを指定ã™ã‚‹å ´åˆã®æ–¹æ³•ã«ã¯ã€\n"
+"個々ã®ãƒªãƒ“ジョンをãã‚Œãžã‚ŒæŒ‡å®šã™ã‚‹æ–¹æ³•ä»¥å¤–ã«ã‚‚〠\":\" を区切り\n"
+"記å·ã«ã—ãŸç¯„囲指定ã«ã‚ˆã‚‹æ–¹æ³•ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+"範囲表記ã®æ–‡æ³•ã¯ã€ \"[開始]:[終了]\" ã¨ã„ã†ã‚‚ã®ã§ã€ \"開始\"・\"終了\"\n"
+"部分ã«ã¯ãã‚Œãžã‚Œãƒªãƒ“ジョン識別用ã®æƒ…å ±ãŒè¨˜è¿°ã•ã‚Œã¾ã™ã€‚\n"
+"\"開始\"・\"終了\" ã¯ãã‚Œãžã‚Œçœç•¥å¯èƒ½ã§ã™ã€‚ \"開始\" 部分ãŒ\n"
+"記述ã•ã‚Œãªã„å ´åˆã€ ãƒªãƒ“ã‚¸ãƒ§ãƒ³ç•ªå· 0 ãŒè¨˜è¿°ã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+"\"終了\" 部分ãŒè¨˜è¿°ã•ã‚Œãªã„å ´åˆã€ tip ãŒè¨˜è¿°ã•ã‚ŒãŸã‚‚ã®ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚\n"
+"以上ã®ã“ã¨ã‹ã‚‰ã€ \":\" ã¨ã„ã†è¨˜è¿°ã¯ \"全リビジョン\" を指ã—ã¾ã™ã€‚"
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+"\"開始\" 指定㌠\"終了\" 指定よりも後ã®ãƒªãƒ“ジョンã§ã‚ã‚‹å ´åˆã€ 逆順指定\n"
+"ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+"範囲指定㯠\"閉区間\" ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ ã¤ã¾ã‚Šã€ 3:5 ã¨ã„ã†ç¯„囲指定ã¯\n"
+"3, 4, 5 ã®æŒ‡å®šã¨ç­‰ä¾¡ã§ã™ã€‚ åŒæ§˜ã« 9:6 ã¨ã„ã†æŒ‡å®šã¯ 9, 8, 7, 6 ã®æŒ‡å®šã¨\n"
+"等価ã§ã™ã€‚\n"
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr "Mercurial ã«ã¯ã€ ファイルを特定ã™ã‚‹ãƒ‘ターン指定方法ãŒè¤‡æ•°ã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+"特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ Mercurial ã¯æŒ‡å®šã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«åã«å¯¾ã—ã¦ã€\n"
+"shell å½¢å¼ã®æ‹¡å¼µãƒ¯ã‚¤ãƒ«ãƒ‰ã‚«ãƒ¼ãƒ‰åˆè‡´ã‚’è¡Œã„ã¾ã™ã€‚"
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr "別ãªå½¢å¼ã§ã®ãƒ‘ターン記述ã®éš›ã«ã¯ã€ 明示的ã«ç¨®åˆ¥ã‚’指定ã—ã¦ãã ã•ã„。"
+
+msgid ""
+".. note::\n"
+" Patterns specified in ``.hgignore`` are not rooted. \n"
+" Please see :hg:`help hgignore` for details."
+msgstr ""
+".. note::\n"
+" ``.hgignore`` ã§ã®è¨˜è¿°ã§ã¯ã€ 作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+" 部分一致ã®ã¿ã§åˆè‡´åˆ¤å®šã•ã‚Œã¾ã™ã€‚ 詳細㯠:hg:`help hgignore`\n"
+" ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+"パターンåˆè‡´ã‚’è¡Œã‚ãšã«ã€ 指定ã•ã‚ŒãŸåå‰ã‚’ãã®ã¾ã¾ä½¿ç”¨ã™ã‚‹å ´åˆã€\n"
+"åå‰ã®å‰ã« ``path:`` を記述ã—ã¾ã™ã€‚ ã“ã®å½¢å¼ã‚’使用ã™ã‚‹å ´åˆã€\n"
+"リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆã‹ã‚‰ã®ãƒ‘スã¨å®Œå…¨ã«ä¸€è‡´ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。"
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+"拡張ワイルドカードåˆè‡´ã®å ´åˆã€ åå‰ã®å‰ã« ``glob:`` を記述ã—ã¾ã™ã€‚\n"
+"ã“ã®å½¢å¼ã§ã®åˆè‡´åˆ¤å®šã¯ã€ ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã®ã€\n"
+"パス先頭ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ã¨ãªã‚Šã¾ã™ã®ã§ã€ ``*.c`` ã¨åˆè‡´ã™ã‚‹ã®ã¯ã€\n"
+"ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç›´ä¸‹ã®æœ«å°¾ãŒ ``.c`` ã§çµ‚ã‚るファイルã®ã¿ã§ã™ã€‚"
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+"ワイルドカードã®æ‹¡å¼µæ–‡æ³•ã«ã¯ã€ パス区切りもå«ã‚ãŸä»»æ„ã®æ–‡å­—列ã¨åˆè‡´ã™ã‚‹\n"
+"``**`` ã¨ã€ \"a ãªã„ã— b\" ã‚’æ„味ã™ã‚‹ ``{a,b}`` ã¨ã„ã†å½¢å¼ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+"Perl/Python å½¢å¼ã®æ­£è¦è¡¨ç¾ã®å ´åˆã€ åå‰ã®å‰ã« ``re:`` を記述ã—ã¾ã™ã€‚\n"
+"æ­£è¦è¡¨ç¾å½¢å¼ã§ã®ãƒ‘ターンã¯ã€ 作業領域ルートã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã«å¯¾ã—ã¦ã€\n"
+"常ã«å…ˆé ­ã‹ã‚‰ã®ãƒ‘ターンåˆè‡´ãŒè¦æ±‚ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+"ファイルã‹ã‚‰ãƒ‘ターンを読ã¿è¾¼ã‚€å ´åˆã¯ã€\n"
+"``listfile:`` ãªã„ã— ``listfile0:`` を使用ã—ã¾ã™ã€‚\n"
+"å‰è€…ãŒæ”¹è¡Œã§ãƒ‘ターンを区切るã®ã«å¯¾ã—ã¦ã€\n"
+"後者㯠null 文字ã§ãƒ‘ターンを区切りã¾ã™ã€‚\n"
+"ファイルã‹ã‚‰èª­ã¿è¾¼ã¾ã‚ŒãŸå€‹ã€…ã®ãƒ‘ターンã¯ã€\n"
+"file パターンã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚"
+
+msgid "Plain examples::"
+msgstr "パターンåˆè‡´æœªä½¿ç”¨ä¾‹::"
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+" path:foo/bar リãƒã‚¸ãƒˆãƒªãƒ«ãƒ¼ãƒˆç›´ä¸‹ã® foo ディレクトリ中㮠bar\n"
+" path:path:name \"path:name\" ã¨ã„ã†åå‰"
+
+msgid "Glob examples::"
+msgstr "ワイルドカード指定例::"
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+" glob:*.c ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç›´ä¸‹ã§ã€ åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®\n"
+" *.c ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªç›´ä¸‹ã§ã€ åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®\n"
+" **.c ç¾ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãªã„ã—ãã®é…下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®\n"
+" foo/*.c foo ディレクトリ直下ã§ã€ åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®\n"
+" foo/**.c foo ディレクトリãªã„ã—ãã®é…下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®"
+
+msgid "Regexp examples::"
+msgstr "æ­£è¦è¡¨ç¾æŒ‡å®šä¾‹::"
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr " re:.*\\.c$ ä»»æ„ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®ã€ åå‰ãŒ \".c\" ã§çµ‚ã‚ã‚‹ã‚‚ã®"
+
+msgid "File examples::"
+msgstr "ファイル読ã¿è¾¼ã¿ä¾‹::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+" listfile:list.txt 1è¡Œ 1 file パターン㧠list.txt ã‹ã‚‰èª­ã¿è¾¼ã¿\n"
+" listfile0:list.txt null 文字区切り㧠file パターンを読ã¿è¾¼ã¿"
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr ":hg:`help filesets` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+msgid ""
+"What are phases?\n"
+"================"
+msgstr ""
+"フェーズã¨ã¯ï¼Ÿ\n"
+"=============="
+
+msgid ""
+"Phases are a system for tracking which changesets have been or should\n"
+"be shared. This helps prevent common mistakes when modifying history\n"
+"(for instance, with the mq or rebase extensions)."
+msgstr ""
+"フェーズ (phase) ã¯ã€ 当該リビジョンã®å…±æœ‰æ€§ã‚’管ç†ã™ã‚‹ä»•çµ„ã¿ã§ã™ã€‚\n"
+"ã“ã®ä»•çµ„ã¿ã«ã‚ˆã£ã¦ã€ 予期ã›ã¬å±¥æ­´æ”¹å¤‰\n"
+"(例: mq ã‚„ rebase エクステンション等ã«ã‚ˆã‚‹ã‚‚ã®) を防止ã§ãã¾ã™ã€‚"
+
+msgid "Each changeset in a repository is in one of the following phases:"
+msgstr "リãƒã‚¸ãƒˆãƒªä¸­ã®å„リビジョンã¯ã€ 以下ã®ã„ãšã‚Œã‹ã®ãƒ•ã‚§ãƒ¼ã‚ºã«å±žã—ã¾ã™:"
+
+msgid ""
+" - public : changeset is visible on a public server\n"
+" - draft : changeset is not yet published\n"
+" - secret : changeset should not be pushed, pulled, or cloned"
+msgstr ""
+" - public : 公開サーãƒä¸Šã§å‚ç…§å¯èƒ½ãªãƒªãƒ“ジョン\n"
+" - draft : public 化å‰æ®µéšŽã®ãƒªãƒ“ジョン\n"
+" - secret : push/pull/clone ã®å¯¾è±¡å¤–ã¨ãªã‚‹ãƒªãƒ“ジョン"
+
+msgid ""
+"These phases are ordered (public < draft < secret) and no changeset\n"
+"can be in a lower phase than its ancestors. For instance, if a\n"
+"changeset is public, all its ancestors are also public. Lastly,\n"
+"changeset phases should only be changed towards the public phase."
+msgstr ""
+"フェーズã«ã¯é †åºé–¢ä¿‚ (public < draft < secret) ãŒã‚ã‚Šã€\n"
+"祖先よりもå°ã•ãªãƒ•ã‚§ãƒ¼ã‚ºã‚’æŒã¤ã“ã¨ã¯ã§ãã¾ã›ã‚“。\n"
+"例ãˆã° public フェーズã®ç¥–å…ˆã¯ã€ 全㦠public フェーズã§ã™ã€‚\n"
+"å„リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã¯ã€ 基本的㫠public 化ã™ã‚‹æ–¹å‘ã«å¤‰æ›´ã•ã‚Œã‚‹ã¹ãã§ã™ã€‚"
+
+msgid ""
+"How are phases managed?\n"
+"======================="
+msgstr ""
+"フェーズã¯ã©ã†ç®¡ç†ã•ã‚Œã‚‹ã®ã‹ï¼Ÿ\n"
+"=============================="
+
+msgid ""
+"For the most part, phases should work transparently. By default, a\n"
+"changeset is created in the draft phase and is moved into the public\n"
+"phase when it is pushed to another repository."
+msgstr ""
+"多ãã®å ´åˆã€ フェーズã¯é€éŽçš„ã«æ©Ÿèƒ½ã—ã¾ã™ã€‚\n"
+"特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ æ–°è¦ãƒªãƒ“ジョン㯠draft フェーズã§ä½œæˆã•ã‚Œã€\n"
+"他リãƒã‚¸ãƒˆãƒªã¸ã®å映ã®éš›ã« public 化ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Once changesets become public, extensions like mq and rebase will\n"
+"refuse to operate on them to prevent creating duplicate changesets.\n"
+"Phases can also be manually manipulated with the :hg:`phase` command\n"
+"if needed. See :hg:`help -v phase` for examples."
+msgstr ""
+"予期ã›ã¬é¡žä¼¼ãƒªãƒ“ジョン生æˆå›žé¿ã®ãŸã‚〠mq/rebase ç­‰ã®ã‚¨ã‚¯ã‚¹ãƒ†ãƒ³ã‚·ãƒ§ãƒ³ã¯ã€\n"
+"一旦 public 化ã•ã‚ŒãŸãƒªãƒ“ジョンを処ç†å¯¾å‡¦ã«ã§ãã¾ã›ã‚“。\n"
+"å¿…è¦ã§ã‚れ㰠:hg:`phase` コマンドã«ã‚ˆã‚‹æ‰‹å‹•ã§ã®ãƒ•ã‚§ãƒ¼ã‚ºå¤‰æ›´ã‚‚å¯èƒ½ã§ã™ã€‚\n"
+"実行例ã«é–¢ã—ã¦ã¯ :hg:`help -v phase` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Phases and servers\n"
+"=================="
+msgstr ""
+"フェーズã¨ã‚µãƒ¼ãƒ\n"
+"================"
+
+msgid "Normally, all servers are ``publishing`` by default. This means::"
+msgstr ""
+"特ã«æŒ‡å®šã®ç„¡ã„å ´åˆã€ å…¨ã¦ã®ã‚µãƒ¼ãƒã§ ``publishing`` ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚\n"
+"ã“ã‚Œã¯ä»¥ä¸‹ã‚’æ„味ã—ã¾ã™::"
+
+msgid ""
+" - all draft changesets that are pulled or cloned appear in phase\n"
+" public on the client"
+msgstr ""
+" - draft フェーズã®ãƒªãƒ“ジョンã¯ã€ pull/clone ã•ã‚ŒãŸã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã§ã¯\n"
+" public フェーズã¨ã¿ãªã•ã‚Œã‚‹"
+
+msgid ""
+" - all draft changesets that are pushed appear as public on both\n"
+" client and server"
+msgstr ""
+" - クライアントã‹ã‚‰ push ã•ã‚ŒãŸ draft フェーズã®ãƒªãƒ“ジョンã¯ã€\n"
+" サーãƒï¼ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆã®ä¸¡æ–¹ã§ public フェーズã¨ã¿ãªã•ã‚Œã‚‹"
+
+msgid " - secret changesets are neither pushed, pulled, or cloned"
+msgstr " - secret フェーズã®ãƒªãƒ“ジョン㯠push/pull/clone 対象ã«ãªã‚‰ãªã„"
+
+msgid ""
+".. note::\n"
+" Pulling a draft changeset from a publishing server does not mark it\n"
+" as public on the server side due to the read-only nature of pull."
+msgstr ""
+".. note::\n"
+" publishing サーãƒã‹ã‚‰ draft フェーズã®ãƒªãƒ“ジョンを pull ã—ãŸå ´åˆã§ã‚‚ã€\n"
+" 『pull ã¯èª­ã¿å‡ºã—専用ã€ã®åŽŸå‰‡ã«å‰‡ã‚Šã€ 当該リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã¯ã€\n"
+" サーãƒå´ã§ã¯ draft ã®ã¾ã¾ (public 化ã—ãªã„) ã§ã™ã€‚"
+
+msgid ""
+"Sometimes it may be desirable to push and pull changesets in the draft\n"
+"phase to share unfinished work. This can be done by setting a\n"
+"repository to disable publishing in its configuration file::"
+msgstr ""
+"未完ã®ä½œæ¥­ã‚’共有ã™ã‚‹ãŸã‚ã«ã€ リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’ draft ã®ã¾ã¾ã§\n"
+"push/pull ã—ãŸã„å ´åˆã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ publishing を無効化ã™ã‚‹ã«ã¯ã€\n"
+"サーãƒå´ã§ä»¥ä¸‹ã®è¨­å®šã‚’è¡Œã£ã¦ãã ã•ã„。"
+
+msgid ""
+" [phases]\n"
+" publish = False"
+msgstr ""
+" [phases]\n"
+" publish = False"
+
+msgid "See :hg:`help config` for more information on config files."
+msgstr "設定ファイルã«é–¢ã™ã‚‹è©³ç´°ã¯ :hg:`help config` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+".. note::\n"
+" Servers running older versions of Mercurial are treated as\n"
+" publishing."
+msgstr ""
+".. note::\n"
+" 旧版㮠Mercurial ã§ç¨¼å‹•ã—ã¦ã„るサーãƒã¯ã€ publishing 実施ã«ç›¸å½“ã—ã¾ã™ã€‚"
+
+msgid ""
+"Examples\n"
+"========"
+msgstr ""
+"記述例\n"
+"======"
+
+msgid " - list changesets in draft or secret phase::"
+msgstr " - draft ãªã„ã— secret フェーズã®ãƒªãƒ“ジョン一覧::"
+
+msgid " hg log -r \"not public()\""
+msgstr " hg log -r \"not public()\""
+
+msgid " - change all secret changesets to draft::"
+msgstr " - secret フェーズã®å…¨ãƒªãƒ“ジョンã®ã‚’ draft 化::"
+
+msgid " hg phase --draft \"secret()\""
+msgstr " hg phase --draft \"secret()\""
+
+msgid ""
+" - forcibly move the current changeset and descendants from public to draft::"
+msgstr " - ç¾è¡Œãƒªãƒ“ジョンã¨å­å­«ã®ãƒ•ã‚§ãƒ¼ã‚ºã‚’ public ã‹ã‚‰ draft ã«å¼·åˆ¶å¤‰æ›´::"
+
+msgid " hg phase --force --draft ."
+msgstr " hg phase --force --draft ."
+
+msgid " - show a list of changeset revision and phase::"
+msgstr " - リビジョン番å·ã¨ãƒ•ã‚§ãƒ¼ã‚ºã‚’表示::"
+
+msgid " hg log --template \"{rev} {phase}\\n\""
+msgstr " hg log --template \"{rev} {phase}\\n\""
+
+msgid " - resynchronize draft changesets relative to a remote repository::"
+msgstr " - 連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã«å¿œã˜ã¦ã€ãƒªãƒ“ジョンを draft フェーズ化::"
+
+msgid " hg phase -fd 'outgoing(URL)' "
+msgstr " hg phase -fd 'outgoing(URL)'"
+
+msgid ""
+"See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr "フェーズã®æ‰‹å‹•æ“作ã«é–¢ã—ã¦ã¯ :hg:`help phase` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr "Mercurial ã«å€‹ã€…ã®ãƒªãƒ“ジョン指定ã™ã‚‹éš›ã«ã¯è¤‡æ•°ã®è¨˜æ³•ãŒä½¿ç”¨ã§ãã¾ã™ã€‚"
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+"整数値ã¯ã€ 「リビジョン番å·ã€ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 負値ã¯ã€ tip ã‹ã‚‰ã®è·é›¢ã‚’\n"
+"æ„味ã—〠-1 㯠tip 自身を〠-2 㯠tip ã®ç›´å‰ã¨ã„ã£ãŸãƒªãƒ“ジョンを指ã—ã¾ã™ã€‚"
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr "40æ¡ã®16進文字列ã¯ã€ 一æ„ãªã€Œãƒªãƒ“ジョン IDã€ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+"40æ¡æœªæº€ã®16進文字列ã¯ã€ 一æ„ãªã€Œãƒªãƒ“ジョン IDã€ã®çŸ­ç¸®å½¢å¼ã¨\n"
+"ã¿ãªã•ã‚Œã¾ã™ã€‚ 短縮形å¼ã® ID ã¯ã€ 厳密ã«1ã¤ã®å®Œå…¨é•·ã® ID ã¨ã ã‘\n"
+"å‰æ–¹ä¸€è‡´ã™ã‚‹å ´åˆã«ã®ã¿æœ‰åŠ¹ã§ã™ã€‚"
+
+msgid ""
+"Any other string is treated as a bookmark, tag, or branch name. A\n"
+"bookmark is a movable pointer to a revision. A tag is a permanent name\n"
+"associated with a revision. A branch name denotes the tipmost revision\n"
+"of that branch. Bookmark, tag, and branch names must not contain the \":\"\n"
+"character."
+msgstr ""
+"ä»–ã®æ–‡å­—列ã¯ã€ 「ブックマーク〠〠「タグå〠ãªã„㗠「ブランãƒåã€\n"
+"ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 「ブックマーク〠ã¯ç§»å‹•å¯èƒ½ãªãƒªãƒ“ジョンå‚ç…§ãƒã‚¤ãƒ³ã‚¿ã§ã™ã€‚\n"
+"「タグå〠ã¯ç‰¹å®šã®ãƒªãƒ“ジョンã«ä»˜ä¸Žã•ã‚ŒãŸæ°¸ç¶šçš„ãªåå‰ã§ã™ã€‚\n"
+"「ブランãƒå〠ã¯å½“該ブランãƒä¸­ã®æœ€æ–°ãƒªãƒ“ジョンをæ„味ã—ã¾ã™ã€‚\n"
+"ブックマークã€ã‚¿ã‚°ãŠã‚ˆã³ãƒ–ランãƒã®åå‰ã¯ \":\" 文字をå«ã‚“ã§ã¯ãªã‚Šã¾ã›ã‚“。"
+
+msgid "The reserved name \"tip\" always identifies the most recent revision."
+msgstr "予約å \"tip\" ã¯ã€ 常ã«ä¸€ç•ªæœ€æ–°ã®ãƒªãƒ“ジョンを指ã—ã¾ã™ã€‚"
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+"「空リビジョンã€ã‚’æ„味ã™ã‚‹åå‰ \"null\" ã¯ã€ 特別ãªåå‰ã¨ã—ã¦äºˆç´„\n"
+"ã•ã‚Œã¦ã„ã¾ã™ã€‚ 空リãƒã‚¸ãƒˆãƒªã«ãŠã‘るリビジョンã¯ã“ã®ãƒªãƒ“ジョンã§ã€\n"
+"リビジョン 0 ã®è¦ªã¯ \"null\" リビジョンã§ã™ã€‚"
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+"常ã«ã€Œä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンã€ã‚’示ã™ãŸã‚ã®åå‰ \".\" ã¯ã€ 特別ãªåå‰ã¨ã—ã¦\n"
+"予約ã•ã‚Œã¦ã„ã¾ã™ã€‚ 作業領域ãŒæœªæ›´æ–°ã®å ´åˆã¯ã€ \"null\" 指定ã¨ç­‰ä¾¡ã§ã™ã€‚\n"
+"未コミットã®ãƒžãƒ¼ã‚¸ä¸­ã®å ´åˆã€ \".\" ã¯ç¬¬1親リビジョンを指ã—ã¾ã™ã€‚\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr "Mercurial ã¯ãƒªãƒ“ジョン指定ã®ãŸã‚ã®å•ã„åˆã‚ã›è¨€èªžã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚"
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+"å•ã„åˆã‚ã›è¨€èªžã¯ã€Œè¿°èªžã€ (predicate) (※ 訳注: ã„ã‚ゆる「関数ã€çš„ãªã‚‚ã®)\n"
+"ã‚’æä¾›ã—ã¦ãŠã‚Šã€ 二項演算å­ã«ã‚ˆã‚‹çµåˆã‚„〠括弧ã«ã‚ˆã‚‹ã‚°ãƒ«ãƒ¼ãƒ—化もå¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Identifiers such as branch names may need quoting with single or\n"
+"double quotes if they contain characters like ``-`` or if they match\n"
+"one of the predefined predicates."
+msgstr ""
+"ID ã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãƒ–ランãƒåãªã©ãŒã€ ``-`` 文字やã€\n"
+"既存ã®è¿°èªžã¨ä¸€è‡´ã™ã‚‹å ´åˆã€ 引用符(') ãªã„ã—二é‡å¼•ç”¨ç¬¦(\")\n"
+"ã§å›²ã£ã¦ãã ã•ã„。"
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" x ã«å«ã¾ã‚Œãªã„リビジョン群。 ``! x`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+"``x::y``\n"
+" x ã®å­å­«ä¸”㤠y ã®ç¥–å…ˆã«ç›¸å½“ã™ã‚‹ãƒªãƒ“ジョン群 (x ãŠã‚ˆã³ y 自身をå«ã‚€)。\n"
+" å·¦å´ã®ãƒªãƒ“ジョン指定 (``x``) ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã¯ ``ancestors(y)``ã€\n"
+" å³å´ã®ãƒªãƒ“ジョン指定 (``y``) ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã¯ ``descendants(x)``\n"
+" ã¨ç­‰ä¾¡ã§ã™ã€‚"
+
+msgid " An alternative syntax is ``x..y``."
+msgstr " ``x..y`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+"``x:y``\n"
+" ãƒªãƒ“ã‚¸ãƒ§ãƒ³ç•ªå· x ã‹ã‚‰ y ã®é–“ã®å…¨ãƒªãƒ“ジョン群 (x ãŠã‚ˆã³ y 自身をå«ã‚€)。\n"
+" å·¦å³ã®ãƒªãƒ“ジョン指定ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã¯ã€ ãã‚Œãžã‚ŒãŒ 0 ãŠã‚ˆã³ tip\n"
+" ã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" リビジョン群 x 㨠y ã®å…±é€šéƒ¨åˆ†ã€‚ ``x & y`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" リビジョン群 x 㨠y ã®ç·å’Œã€‚ ``x | y`` åˆã¯ ``x + y`` ã¨ã‚‚表記å¯èƒ½ã€‚"
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+"``x - y``\n"
+" リビジョン群 x ã®ã†ã¡ã€ y ã«å±žã•ãªã„ã‚‚ã®ã€‚"
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+"``x^n``\n"
+" リビジョン群 x 中ã®å„リビジョンã®ã€ n 番目ã®è¦ªãƒªãƒ“ジョン。\n"
+" n ã«ã¯ 0 1 ãªã„ã— 2 を指定å¯èƒ½ã€‚\n"
+" n == 0 ãªã‚‰ãƒªãƒ“ジョン自身〠n == 1 ãªã‚‰ç¬¬1親〠n == 2 ãªã‚‰ç¬¬2親。"
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+"``x~n``\n"
+" リビジョン群 x 中ã®å„リビジョンã®ã€ 第1親å´ã® n 番目ã®ç¥–先。\n"
+" ``x~0`` ã¯ãƒªãƒ“ジョン自身〠``x~3`` 㯠``x^^^`` ã¨ç­‰ä¾¡ã€‚"
+
+msgid "There is a single postfix operator:"
+msgstr "使用å¯èƒ½ãªå¾Œç½®å˜é …演算å­ã‚’以下ã«åˆ—挙ã—ã¾ã™:"
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+"``x^``\n"
+" リビジョン群 x 中ã®å„リビジョンã®ã€ 第1親リビジョン。 ``x^1`` ã¨ç­‰ä¾¡ã€‚"
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+"\n"
+"使用å¯èƒ½ãªè¿°èªžã‚’以下ã«åˆ—挙ã—ã¾ã™:"
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+"既存ã®è¿°èªžã‚„別å (alias) を組ã¿åˆã‚ã›ã‚‹ã“ã¨ã§ã€ æ–°ã—ã„述語を定義å¯èƒ½ã§ã™ã€‚\n"
+"別åã¯ã€ Mercurial 設定ファイル㮠``revsetalias`` セクションã«ãŠã‘ã‚‹ã€\n"
+"以下ã®ã‚ˆã†ãªè¨˜è¿°ã§å®šç¾©ã—ã¾ã™::"
+
+msgid " <alias> = <definition>"
+msgstr " <別å> = <定義>"
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+"別å記述部分ã«ãŠã„㦠`$1` ã‚„ `$2` ã¨ã„ã£ãŸå½¢å¼ã®å¼•æ•°ã‚’記述ã™ã‚‹ã“ã¨ã§ã€\n"
+"別å定義部分ã§ãã®å¼•æ•°ã‚’使用ã§ãã¾ã™ã€‚"
+
+msgid "For example,"
+msgstr "記述例"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+"上記ã®è¨˜è¿°ã§ã€ 3ã¤ã®åˆ¥å ``h``〠``d`` ãŠã‚ˆã³ ``rs`` ãŒå®šç¾©ã•ã‚Œã¾ã™ã€‚\n"
+"``rs(0:tip, author)`` 㯠``reverse(sort(0:tip, author))`` ã¨åŒä¸€ã§ã™ã€‚"
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ":hg:`log` ã®ã‚³ãƒžãƒ³ãƒ‰è¡Œã‚ªãƒ—ション指定ã«å¯¾ã™ã‚‹ç­‰ä¾¡ãªè¨˜è¿°::"
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+
+msgid "- Changesets on the default branch::"
+msgstr "- default ブランãƒã®ãƒªãƒ“ジョン群::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr " hg log -r \"branch(default)\""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr "- ã‚¿ã‚° 1.5 以後㮠default ブランãƒã®ãƒªãƒ“ジョン群 (マージ実施除ã)::"
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr " hg log -r \"branch(default) and 1.5:: and not merge()\""
+
+msgid "- Open branch heads::"
+msgstr "- 閉鎖 (close) ã•ã‚Œã¦ã„ãªã„ブランãƒãƒ³ã®ãƒ˜ãƒƒãƒ‰::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+"- ã‚¿ã‚° 1.3 㨠1.5 ã®é–“㧠\"bug\" ã«è¨€åŠã— ``hgext/*``\n"
+" ã«å½±éŸ¿ã™ã‚‹ãƒªãƒ“ジョン群::"
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr "- 2008 å¹´ 5 月 (May 2008) ã«ãŠã‘るリビジョン群をユーザåé †ã§è¡¨ç¤º::"
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr " hg log -r \"sort(date('May 2008'), user)\""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+"- \"bug\" åˆã¯ \"issue\" ã«è¨€åŠã—ãŸãƒªãƒ“ジョン群ã®ã†ã¡ã€ ã‚¿ã‚° tagged\n"
+" 時点ã®å†…容ã«å«ã¾ã‚Œãªã„ã‚‚ã®::"
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒª (sub repository) 機能ã¯ã€ Mercurial リãƒã‚¸ãƒˆãƒªã‚’親ã«ã€\n"
+"外部ã®ãƒªãƒã‚¸ãƒˆãƒªã‚„プロジェクトを入れå­ã«ã—〠コマンドã®å®Ÿè¡Œã®éš›ã«ã€\n"
+"ãれら一連ã®ãƒªãƒã‚¸ãƒˆãƒªã«å¯¾ã—ã¦å‡¦ç†ã‚’è¡Œãˆã‚‹ã‚ˆã†ã«ã—ã¾ã™ã€‚"
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+"ç¾æ™‚点ã§å‰¯ãƒªãƒã‚¸ãƒˆãƒªã¨ã—ã¦ä½¿ç”¨ã§ãã‚‹ã®ã¯ã€Mercurial Git Subversion\n"
+"ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã™ã€‚"
+
+msgid "Subrepositories are made of three components:"
+msgstr "副リãƒã‚¸ãƒˆãƒªã¯ã€ 3ã¤ã®è¦ç´ ã‹ã‚‰æ§‹æˆã•ã‚Œã¾ã™:"
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+"1. 入れå­ãƒªãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã€‚ 親リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸä¸­ã®ã€\n"
+" ä»»æ„ã®å ´æ‰€ã«é…ç½®å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+" should be placed in the root of working directory, and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+"2. 入れå­ãƒªãƒã‚¸ãƒˆãƒªã¸ã®å‚照。 親リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸãƒ«ãƒ¼ãƒˆç›´ä¸‹ã«é…ç½®ã—ãŸ\n"
+" ``.hgsub`` ã«ãŠã„ã¦ã€ 副リãƒã‚¸ãƒˆãƒªã®å‚照先を記述ã—ã¾ã™ã€‚ Mercurial\n"
+" ã®å‰¯ãƒªãƒã‚¸ãƒˆãƒªã®å‚照先ã¯ã€ 以下ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™:"
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr " 入れå­/作業領域/パス = https://example.com/nested/repo/path"
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr " Git ã‚„ Subversion も副リãƒã‚¸ãƒˆãƒªã¨ã—ã¦åˆ©ç”¨å¯èƒ½ã§ã™:"
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+" 入れå­/作業領域/パス = [git]git://example.com/nested/repo/path\n"
+" 入れå­/作業領域/パス = [svn]https://example.com/nested/trunk/path"
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+" ``入れå­/作業領域/パス`` ã¯ã€ 親リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸãƒ«ãƒ¼ãƒˆã«å¯¾ã™ã‚‹ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªä½œæ¥­é ˜åŸŸã®ç›¸å¯¾ãƒ‘スã€\n"
+" ``https://example.com/nested/repo/path`` ã¯ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªã®é€£æºå…ˆæƒ…å ±ã§ã™ã€‚ 連æºå…ˆã«ã¯ã€\n"
+" ローカルファイルシステム上ã®ãƒ‘スも記述å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+" Mercurial リãƒã‚¸ãƒˆãƒªã¯ã€ ``.hgsub`` を自動的ã«ã¯ç”Ÿæˆã—ã¾ã›ã‚“ã®ã§ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªã‚’使用ã™ã‚‹éš›ã«ã¯ã€ 手動㧠``.hgsub`` を生æˆã—ã€\n"
+" 親リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€ 履歴管ç†å¯¾è±¡ã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+" is placed in the root of working directory, and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+"3. 入れå­ãƒªãƒã‚¸ãƒˆãƒªã®çŠ¶æ…‹æƒ…報。 親リãƒã‚¸ãƒˆãƒªã®ãƒ«ãƒ¼ãƒˆç›´ä¸‹ã«é…ç½®ã•ã‚ŒãŸ\n"
+" ``.hgsubstate`` ã«ãŠã„ã¦ã€ 親リãƒã‚¸ãƒˆãƒªã§ã®ã‚³ãƒŸãƒƒãƒˆæ™‚点ã«ãŠã‘ã‚‹ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªã®çŠ¶æ…‹ã‚’復旧ã™ã‚‹ãŸã‚ã«ã€ å¿…è¦ãªæƒ…å ±ãŒæ ¼ç´ã•ã‚Œã¾ã™ã€‚\n"
+" ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®ç”Ÿæˆã¯ã€ 親リãƒã‚¸ãƒˆãƒªã§ã®ã‚³ãƒŸãƒƒãƒˆã®éš›ã«ã€ Mercurial\n"
+" ã«ã‚ˆã£ã¦è‡ªå‹•çš„ã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+" .. note::\n"
+" ``.hgsubstate`` ã¯æ±ºã—ã¦æ‰‹å‹•ç·¨é›†ã—ãªã„ã§ãã ã•ã„。"
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"======================"
+msgstr ""
+"\n"
+"副リãƒã‚¸ãƒˆãƒªã®è¿½åŠ \n"
+"=================="
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+"ã¾ã  ``.hgsub`` ãŒè¦ªãƒªãƒã‚¸ãƒˆãƒªã«å­˜åœ¨ã—ãªã„å ´åˆã¯ã€ 手動ã§ä½œæˆã—ãŸä¸Šã§ã€\n"
+"履歴管ç†å¯¾è±¡ã«ç™»éŒ²ã—ã¦ãã ã•ã„。 親リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸä¸­ã®ä»»æ„ã®å ´æ‰€ã«ã€\n"
+"外部リãƒã‚¸ãƒˆãƒªã‚’å…ƒã«ã€ ä½œæ¥­é ˜åŸŸã‚’ç”Ÿæˆ (checkout) ã—ã¦ãã ã•ã„。\n"
+"追加対象ã®å¤–部リãƒã‚¸ãƒˆãƒªã®ãŸã‚ã®ã‚¨ãƒ³ãƒˆãƒªã‚’ ``.hgsub`` ã«è¿½åŠ ã—ã¦ãã ã•ã„。\n"
+"ã“れ以後〠ã“ã®å‰¯ãƒªãƒã‚¸ãƒˆãƒªã¯æ§‹æˆç®¡ç†å¯¾è±¡ã¨ãªã‚Šã€ 次回ã®ã‚³ãƒŸãƒƒãƒˆã«ãŠã„ã¦ã€\n"
+"``.hgsubstate`` ã«çŠ¶æ…‹ãŒè¨˜éŒ²ã•ã‚Œã€ 親リãƒã‚¸ãƒˆãƒªã®ãƒªãƒ“ジョンã«å¯¾ã—ã¦ã€\n"
+"対応付ã‘ãŒè¡Œã‚ã‚Œã¾ã™ã€‚ (※ 訳注: 副リãƒã‚¸ãƒˆãƒªã«é–¢ã™ã‚‹ã€Œæ§‹æˆç®¡ç†ã€ã¯ã€\n"
+"ã‚ãã¾ã§ 「親リãƒã‚¸ãƒˆãƒªã®å„リビジョンãŒã€ 副リãƒã‚¸ãƒˆãƒªã®ã©ã®ãƒªãƒ“ジョンã¨ã€\n"
+"ã©ã†å¯¾å¿œã™ã‚‹ã®ã‹ï¼Ÿã€ ã¨ã„ã†å¯¾å¿œä»˜ã‘情報ã®ã¿ã§ã™)"
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"============================="
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªã®åŒæœŸ\n"
+"=================="
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+"構æˆç®¡ç†ä¸‹ã«ã‚る副リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã¯ã€ 最新状態ã¸ã®è‡ªå‹•çš„ãªè¿½å¾“ãŒã€\n"
+"è¡Œã‚ã‚Œãªããªã‚Šã¾ã™ã€‚ ãã®ä»£ã‚り〠親リãƒã‚¸ãƒˆãƒªã®ãƒªãƒ“ジョンã«ãŠã„ã¦ã€\n"
+"関連付ã‘ãŒè¨˜éŒ²ã•ã‚ŒãŸãƒªãƒ“ジョンã®å†…容ã§æ›´æ–°ã•ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚\n"
+"ã“ã®æŒ™å‹•ã«ã‚ˆã‚Šã€ 親リãƒã‚¸ãƒˆãƒªå´ã¨ä¸€è²«æ€§ã®ã‚る状態ãŒç¶­æŒã§ãã¾ã™"
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+"ãã®ãŸã‚〠副リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã¯ã€ 手動ã§æ›´æ–°ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚\n"
+"å„副リãƒã‚¸ãƒˆãƒªã®ä½œæ¥­é ˜åŸŸã‚’〠希望ã™ã‚‹ãƒªãƒ“ジョンã§æ›´æ–°ã—ãŸãªã‚‰ã°ã€\n"
+"親リãƒã‚¸ãƒˆãƒªã«ãŠã„㦠(é©å®œãƒ†ã‚¹ãƒˆã‚’実施ã—ãŸä¸Šã§) コミットを実施ã™ã‚‹ã“ã¨ã§ã€\n"
+"æ–°ãŸãªãƒªãƒ“ジョンã®çµ„ã¿åˆã‚ã›ãŒè¨˜éŒ²ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"Deleting a Subrepository\n"
+"========================"
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªã®å‰Šé™¤\n"
+"=================="
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+"親リãƒã‚¸ãƒˆãƒªã‹ã‚‰å‰¯ãƒªãƒã‚¸ãƒˆãƒªã‚’削除ã™ã‚‹å ´åˆã€ 対応ã™ã‚‹ã‚¨ãƒ³ãƒˆãƒªã‚’ ``.hgsub``\n"
+"ã‹ã‚‰å‰Šé™¤ã—ãŸä¸Šã§ã€ 関連ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’削除ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"==================================="
+msgstr ""
+"Mercurial コマンドã¨ã®é€£æº\n"
+"=========================="
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. However, if you specify the full path of a file in a\n"
+" subrepo, it will be added even without -S/--subrepos specified.\n"
+" Git and Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":add: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ 構æˆç®¡ç†å¯¾è±¡ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«ç™»éŒ²ã¯ã€\n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。 但ã—〠-S/--subrepos 指定ãŒç„¡ãã¦ã‚‚ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¸ã®ãƒ‘スãŒã€ 直接指定ã•ã‚ŒãŸå ´åˆã¯ã€\n"
+" 対象ファイルを構æˆç®¡ç†å¯¾è±¡ã¨ã—ã¦ç™»éŒ²ã—ã¾ã™ã€‚ ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ\n"
+" Git ãªã„ã— Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€ 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€\n"
+" 登録è¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+":archive: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ アーカイブã®ä½œæˆã¯ã€\n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。"
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+":commit: コミットã®å®Ÿæ–½ã«ã‚ˆã‚Šã€ 親リãƒã‚¸ãƒˆãƒªã¨é…下ã®å‰¯ãƒªãƒã‚¸ãƒˆãƒªã«é–¢ã™ã‚‹ã€\n"
+" æ•´åˆæ€§ã®å–ã‚ŒãŸå¯¾å¿œé–¢ä¿‚ãŒã€ (親リãƒã‚¸ãƒˆãƒªå´ã«) 記録ã•ã‚Œã¾ã™ã€‚\n"
+" 未コミット改変をæŒã¤å‰¯ãƒªãƒã‚¸ãƒˆãƒªã¯ã€ コミット動作を中断ã•ã›ã¾ã™ã€‚\n"
+" -S/--subrepos を指定ã™ã‚‹ã‹ã€ 設定ファイル記述 (:hg:`help config` å‚ç…§)\n"
+" ã§ã® \"ui.commitsubrepos=True\" 設定ã«ã‚ˆã‚Šã€ コミット実施ã®éš›ã«ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªä¸­ã®æœªã‚³ãƒŸãƒƒãƒˆå¤‰æ›´ãŒã€ å†å¸°çš„ã«ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã™ã€‚\n"
+" å…¨ã¦ã®å‰¯ãƒªãƒã‚¸ãƒˆãƒªã‹ã‚‰ã€ 未コミット改変ãŒç„¡ããªã£ãŸå¾Œã§ã€\n"
+" å„副リãƒã‚¸ãƒˆãƒªã®çŠ¶æ…‹è¨˜éŒ²ãŒã€ 親リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã‚³ãƒŸãƒƒãƒˆã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":diff: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ 差分表示ã¯ã€ \n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。\n"
+" 副リãƒã‚¸ãƒˆãƒªä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®å·®åˆ†è¡¨ç¤ºã¯ã€ 通常ã®å·®åˆ†è¡¨ç¤ºã¨åŒã˜å½¢å¼ã§ã™ã€‚\n"
+" ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ Git ãªã„ã— Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€\n"
+" 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€ 差分表示è¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":forget: forget currently only handles exact file matches in subrepos.\n"
+" Git and Subversion subrepositories are currently silently ignored."
+msgstr ""
+":forget: ç¾çŠ¶ã§ã¯ã€ 副リãƒã‚¸ãƒˆãƒªä¸­ã®ãƒ‘ス (ファイルãªã„ã—ディレクトリ)\n"
+" ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã«é™ã‚Šã€ 副リãƒã‚¸ãƒˆãƒªä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«å¯¾ã—ã¦ã€\n"
+" 登録除外æ“作ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ Git ãªã„ã—\n"
+" Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€ 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€\n"
+" 登録除外è¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":incoming: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ å–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンã®ç¢ºèªã¯ã€\n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。 ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ Git ãªã„ã—\n"
+" Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€ 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€\n"
+" å–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンã®ç¢ºèªè¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":outgoing: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ å映予定リビジョンã®ç¢ºèªã¯ã€\n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。 ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ Git ãªã„ã—\n"
+" Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€ 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€\n"
+" å映予定リビジョンã®ç¢ºèªè¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+":pull: リビジョンå–ã‚Šè¾¼ã¿ãŒå†å¸°çš„ã«å®Ÿæ–½ã•ã‚Œãªã„ã®ã¯ã€ :hg:`update`\n"
+" ã«å…ˆç«‹ã¤å–ã‚Šè¾¼ã¿ãƒªãƒ“ジョンã®å–æ¨é¸æŠžãŒã€ 自明ã§ã¯ãªã„ãŸã‚ã§ã™ã€‚\n"
+" å‚照中ã®å…¨å‰¯ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€ å…¨ã¦ã®å¤‰æ›´ã‚’å–り込むã®ã¯ã€\n"
+" éžå¸¸ã«é«˜ã‚³ã‚¹ãƒˆã§ã™ã—〠Subversion å½¢å¼ã®å ´åˆã¯å®Ÿè¡Œè‡ªä½“ãŒä¸å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+":push: 親リãƒã‚¸ãƒˆãƒªã§ã®å±¥æ­´å映ã®éš›ã«ã¯ã€ ã¾ãšã¯å…¨å‰¯ãƒªãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" 履歴å映ãŒè‡ªå‹•çš„ã«å®Ÿæ–½ã•ã‚Œã¾ã™ã€‚ ã“ã‚Œã¯ã€ 親リãƒã‚¸ãƒˆãƒªãŒå‚ç…§ã™ã‚‹ã€\n"
+" 副リãƒã‚¸ãƒˆãƒªã®ãƒªãƒ“ジョンを〠広ãå‚ç…§å¯èƒ½ã¨ã™ã‚‹ãŸã‚ã§ã™ã€‚\n"
+" ãªãŠã€ Subversion å½¢å¼ã®å ´åˆã¯ã€ 履歴å映æ“作ã¯ä½•ã‚‚è¡Œã„ã¾ã›ã‚“。"
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":status: -S/--subrepos 指定ãŒç„¡ã„é™ã‚Šã€ 状態表示ã¯ã€\n"
+" å†å¸°çš„ã«ã¯å®Ÿæ–½ã•ã‚Œã¾ã›ã‚“。\n"
+" 副リãƒã‚¸ãƒˆãƒªä¸­ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®çŠ¶æ…‹è¡¨ç¤ºã¯ã€ 通常ã®çŠ¶æ…‹è¡¨ç¤ºã¨åŒã˜å½¢å¼ã§ã™ã€‚\n"
+" ãªãŠã€ 副リãƒã‚¸ãƒˆãƒªãŒ Subversion å½¢å¼ã®å ´åˆã€ ç¾çŠ¶ã§ã¯ã€\n"
+" 何ã®è¡¨ç¤ºã‚‚ç„¡ã—ã«ã€ 状態表示è¦æ±‚を無視ã—ã¾ã™ã€‚"
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+":update: 作業領域更新ã«ã‚ˆã‚Šã€ 副リãƒã‚¸ãƒˆãƒªã§ã¯ã€ 指定リビジョンã«ãŠã‘ã‚‹ã€\n"
+" コミット時点ã®çŠ¶æ…‹ãŒå¾©å…ƒã•ã‚Œã¾ã™ã€‚ 副リãƒã‚¸ãƒˆãƒªã«ãŠã„ã¦ã€\n"
+" 復元対象リビジョンãŒåˆ©ç”¨ä¸å¯èƒ½ãªå ´åˆã€ 作業領域更新ã«å…ˆç«‹ã£ã¦ã€\n"
+" 対象リビジョンã®å–ã‚Šè¾¼ã¿ãŒå®Ÿæ–½ã•ã‚Œã¾ã™ã€‚ (※ 訳注: Subversion å½¢å¼ã¯ã€\n"
+" 履歴情報ãŒã‚µãƒ¼ãƒå´ã«ã‚ã‚‹ãŸã‚〠常ã«å¯¾è±¡ãƒªãƒ“ジョンã®å–ã‚Šè¾¼ã¿ãŒå¿…è¦)\n"
+" ã“ã®æŒ™å‹•ã¯ã€ 副リãƒã‚¸ãƒˆãƒªåˆ©ç”¨ã«ã‚ˆã£ã¦ã€ 作業領域更新ã®éš›ã«ã€\n"
+" ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šãŒå¿…è¦ã¨ãªã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚"
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"================================="
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªé€£æºå…ˆã®æ›¸ãæ›ãˆ\n"
+"============================"
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+"親リãƒã‚¸ãƒˆãƒªã®åˆ©ç”¨æœŸé–“中ã«ã€ 副リãƒã‚¸ãƒˆãƒªã®é€£æºå…ˆãŒå¤‰æ›´ã•ã‚ŒãŸå ´åˆã€\n"
+"変更å‰ã«è¦ªãƒªãƒã‚¸ãƒˆãƒªã§è¨˜éŒ²ã•ã‚ŒãŸãƒªãƒ“ジョンãŒæŒã¤é€£æºå…ˆæƒ…å ±ã¯ã€\n"
+"無効ã¨ãªã£ã¦ã—ã¾ã„ã¾ã™ã€‚ 親リãƒã‚¸ãƒˆãƒªã® ``hgrc`` ファイルãªã„ã— Mercurial\n"
+"ã®è¨­å®šãƒ•ã‚¡ã‚¤ãƒ«ã«ãŠã„ã¦ã€ 連æºå…ˆæƒ…å ±ã®æ›¸ãæ›ãˆãƒ«ãƒ¼ãƒ«ã‚’定義ã™ã‚‹ã“ã¨ã§ã€\n"
+"ã“ã®å•é¡Œã‚’解消å¯èƒ½ã§ã™ã€‚ 詳細ã«é–¢ã—ã¦ã¯ hgrc(5) 㮠``[subpaths]``\n"
+"セクションをå‚ç…§ã—ã¦ãã ã•ã„。 (※ 訳注: :hg:`help config` ã§ã‚‚å‚ç…§å¯èƒ½)"
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+"Mercurial ã§ã¯ã€ テンプレート機能ã«ã‚ˆã£ã¦ã‚³ãƒžãƒ³ãƒ‰ã®å‡ºåŠ›ã‚’カスタマイズ\n"
+"ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ コマンドラインã‹ã‚‰ã®æŒ‡å®šã§ã¯ã€ --template ã«ã‚ˆã‚‹\n"
+"テンプレート指定ã¨ã€ --style ã«ã‚ˆã‚‹ã‚¹ã‚¿ã‚¤ãƒ«æŒ‡å®šã®ä¸¡æ–¹ãŒä½¿ç”¨ã§ãã¾ã™ã€‚"
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+"「log çš„ã€ãªå‡ºåŠ›ã‚’è¡Œã†ä¸€é€£ã®ã‚³ãƒžãƒ³ãƒ‰å‡ºåŠ›ã‚’カスタマイズå¯èƒ½ã§ã™:\n"
+"log, outgoing, incoming, tip, parents, heads, glog"
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+"Mercurial ã«ã¯(明示的ãªæŒ‡å®šãŒç„¡ã„å ´åˆã«ä½¿ç”¨ã•ã‚Œã‚‹)default〠compact\n"
+"changelog ãŠã‚ˆã³ xml ã®4ã¤ã®ã‚¹ã‚¿ã‚¤ãƒ«è¨­å®šãŒåŒæ¢±ã•ã‚Œã¦ã„ã¾ã™ã€‚\n"
+"利用方法ã¯::"
+
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr "テンプレートã¨ã¯ã€ 変数展開マークアップ機能を備ãˆãŸãƒ†ã‚­ã‚¹ãƒˆã§ã™::"
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+"波括弧ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã¯ã€Œã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã€ã¨å‘¼ã°ã‚Œã¾ã™ã€‚ キーワード利用ã®\n"
+"å¯å¦ã¯ã€ テンプレートã®åˆ©ç”¨ã•ã‚Œã‚‹çŠ¶æ³ã«ä¾å­˜ã—ã¾ã™ã€‚ 以下ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã¯\n"
+"log çš„ãªã‚³ãƒžãƒ³ãƒ‰ã§ã®ãƒ†ãƒ³ãƒ—レート利用ã®éš›ã«ã¯å¸¸ã«ä½¿ç”¨å¯èƒ½ã§ã™:"
+
+msgid ".. keywordsmarker"
+msgstr ".. keywordsmarker"
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+"\"date\" キーワードã®å‡ºåŠ›ã¯å¯èª­å½¢å¼ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 出力ã«æ—¥æ™‚情報を\n"
+"å«ã‚ãŸã„å ´åˆã€ å¯èª­åŒ–ã™ã‚‹ãŸã‚ã®ã€Œãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã€ã‚’使用ã—ã¾ã™ã€‚\n"
+"「フィルターã€ã¨ã¯ã€ 入力値ã«åŸºã¥ã„ã¦æ–‡å­—列を生æˆã™ã‚‹æ©Ÿèƒ½ã§ã™ã€‚\n"
+"一覧系ã®å…¥åŠ›ã«å¯¾ã—ã¦æ–‡å­—列åã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’é©ç”¨ã™ã‚‹å ´åˆã€ 最åˆã« stringify\n"
+"フィルターをé©ç”¨ã—ã¦ãã ã•ã„。 複数ã®ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã‚’連ã­ã‚‹ã“ã¨ã§ã€\n"
+"様々ãªå‡ºåŠ›ã‚’å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã™::"
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+msgid "List of filters:"
+msgstr "フィルター一覧(入力ã¨ã€ ãã‚Œã«å¯¾ã™ã‚‹å‡ºåŠ›):"
+
+msgid ".. filtersmarker\n"
+msgstr ".. filtersmarker\n"
+
+msgid "Valid URLs are of the form::"
+msgstr "有効㪠URL 指定ã¯ä»¥ä¸‹ã®å½¢å¼ã§ã™::"
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+"ローカルファイルシステム上ã®ãƒ‘スãŒæŒ‡ã™å…ˆã¯ã€\n"
+"Mercurial ã®ãƒªãƒã‚¸ãƒˆãƒªã§ã‚‚〠ãƒãƒ³ãƒ‰ãƒ«ãƒ•ã‚¡ã‚¤ãƒ«\n"
+"(:hg:`bundle` ãªã„ã— :hg:`incoming --bundle` ã§ç”Ÿæˆ)\n"
+"ã§ã‚‚構ã„ã¾ã›ã‚“。 :hg:`help paths` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+"連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªæŒ‡å®šã«ãŠã„ã¦ã€ '#' 記å·ã«ç¶šã‘㦠ID を指定ã™ã‚‹ã“ã¨ã§ã€\n"
+"特定ã®ãƒ–ランãƒã€ ã‚¿ã‚°ãªã„ã—リビジョンを指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚\n"
+":hg:`help revisions` ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+"http:// ã‚„ https:// å½¢å¼ã® URL ã§æŒ‡å®šã•ã‚Œã‚‹é€£æºå…ˆã¸ã® push ã®æ§˜ãª\n"
+"機能ã®ã†ã¡ã®å¹¾ã¤ã‹ã¯ã€ ãã®æ©Ÿèƒ½ãŒé€£æºå…ˆã® Mercurial サーãƒå´ã§æ˜Žç¤ºçš„ã«\n"
+"利用å¯èƒ½ã«ãªã£ã¦ã„ã‚‹å ´åˆã«é™ã‚Šä½¿ç”¨å¯èƒ½ã§ã™ã€‚"
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+"HTTPS ã«ã‚ˆã‚‹ URL 指定ã®å®‰å…¨æ€§ã¯ã€ web.cacerts ã«ãŠã‘る設定ã®\n"
+"妥当性ã«ä¾å­˜ã—ã¾ã™ã€‚"
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr "Mercurial 㨠SSH を併用ã™ã‚‹å ´åˆã®æ³¨æ„点:"
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+"- SSH アクセス先ホスト上ã«ã€ shell アカウント㨠hg コマンドãŒå¿…è¦ã§ã™ã€‚\n"
+" hg コマンドãŒã‚¢ã‚¯ã‚»ã‚¹å…ˆãƒ›ã‚¹ãƒˆã® PATH 設定ã§åˆ©ç”¨å¯èƒ½ã«ãªã£ã¦ã„ãªã„\n"
+" å ´åˆã¯ã€ --remotecmd ã§æ˜Žç¤ºçš„ã«æŒ‡å®šã—ã¦ãã ã•ã„。\n"
+"- URL 中ã®ãƒ‘ス指定ã¯ã€ アクセス先ホスト上ã®ãƒ¦ãƒ¼ã‚¶ã®ãƒ›ãƒ¼ãƒ ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª\n"
+" ã‹ã‚‰ã®ç›¸å¯¾ãƒ‘スã¨ã¿ãªã•ã‚Œã¾ã™ã€‚ 絶対パスを指定ã™ã‚‹å ´åˆã¯ã€ パスã®å…ˆé ­ã«\n"
+" æ›´ã«ã‚¹ãƒ©ãƒƒã‚·ãƒ¥('/')を付与ã—ã¦ãã ã•ã„::"
+
+msgid " ssh://example.com//tmp/repository"
+msgstr " 例: ssh://example.com//tmp/repository"
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+"- SSH 連æºã®éš›ã«ã¯ Mercurial ã¯è‡ªèº«ã®åœ§ç¸®å‡¦ç†ã‚’è¡Œã„ã¾ã›ã‚“。 以下ã®ã‚ˆã†ã«\n"
+" ~/.ssh/config 等㧠SSH ã®åœ§ç¸®å®Ÿæ–½ã‚’指示ã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™::"
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+" ã‚ã‚‹ã„ã¯ã€ 設定ファイルã«ãŠã‘ã‚‹ ssh コマンド指定や〠コマンドラインã§ã®\n"
+" --ssh ã«å¯¾ã—ã¦ã€ 'ssh -C' を指定ã™ã‚‹æ–¹æ³•ã‚‚ã‚ã‚Šã¾ã™ã€‚"
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+"連æºå…ˆ URL ã¯ã€ 設定ファイル㮠[paths] セクションã§ã€\n"
+"別åを付ã‘ã¦è¨˜è¿°ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™::"
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+"URL 指定ãŒå¿…è¦ãªã‚³ãƒžãƒ³ãƒ‰ã«å¯¾ã—ã¦ã¯ã€ 別åを指定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™\n"
+"(例ãˆã°ã€ :hg:`pull alias1` 㯠:hg:`pull URL1` ã¨åŒç¾©ã§ã™)。"
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+"コマンド㫠URL を指定ã—ãªã‹ã£ãŸå ´åˆã«ã€ æš—é»™ã®é€£æºå…ˆã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã‚‹\n"
+"é‡è¦ãªåˆ¥åãŒ2ã¤ã‚ã‚Šã¾ã™:"
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+"default:\n"
+" :hg:`clone` ã«ã‚ˆã£ã¦è¤‡è£½ã—ãŸå ´åˆã€ æ–°è¦ãƒªãƒã‚¸ãƒˆãƒªã® 'default' ã¨ã—ã¦\n"
+" 複製元リãƒã‚¸ãƒˆãƒªã® URL ãŒä¿å­˜ã•ã‚Œã¾ã™ã€‚\n"
+" 以後〠連æºå…ˆã‚’çœç•¥ã—㦠:hg:`push` ã‚„ :hg:`pull` ã«é¡žã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’\n"
+" 実行ã—ãŸéš›ã«ã¯ã€ ã“ã® URL ãŒé€£æºå…ˆã¨ã—ã¦ä½¿ç”¨ã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+"default-push:\n"
+" :hg:`push` ã¯ã€ 'default-push' ã®åˆ¥åã§å®šç¾©ã•ã‚Œã‚‹ URL を探ã—ã¾ã™ã€‚\n"
+" 'default' ãŒå®šç¾©ã•ã‚Œã¦ã„ã‚‹å ´åˆã§ã‚‚〠'default-push' ãŒå®šç¾©ã•ã‚Œã¦ã„ã‚Œã°\n"
+" ã“ã¡ã‚‰ãŒå„ªå…ˆã•ã‚Œã¾ã™ã€‚\n"
+
+msgid "remote branch lookup not supported"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã¯ãƒ–ランãƒæ¤œç´¢æ©Ÿèƒ½ãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "dirstate branch not accessible"
+msgstr "dirstate ã®ãƒ–ランãƒæƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "'%s' ã¯æœªçŸ¥ã®ãƒ–ランãƒã§ã™"
+
+msgid "can only share local repositories"
+msgstr "共有å¯èƒ½ãªã®ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒªãƒã‚¸ãƒˆãƒªã®ã¿ã§ã™"
+
+msgid "destination already exists"
+msgstr "複製先 '%s' ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+msgid "updating working directory\n"
+msgstr "作業領域ã®æ›´æ–°ä¸­\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "複製先ディレクトリ: %s\n"
+
+msgid "empty destination path is not valid"
+msgstr "複製先指定ã«ãŠã‘る空ã®ãƒ‘スã¯ä¸æ­£ã§ã™"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "複製先 '%s' ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "複製先 '%s' ã¯ç©ºã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr "指定ã®è¤‡è£½å…ƒã¯ã€ リビジョン指定付ã複製ãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "clone from remote to remote not supported"
+msgstr "リモートã‹ã‚‰ãƒªãƒ¢ãƒ¼ãƒˆã®è¤‡è£½ã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "ブランム%s ã¸æ›´æ–°ä¸­\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr "ファイルã®æ›´æ–°æ•° %d〠マージ数 %d〠削除数 %d〠è¡çªæœªè§£æ¶ˆæ•° %d\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "'hg resolve' ã§ãƒžãƒ¼ã‚¸ã®è¡çªã‚’解消ã—ã¦ãã ã•ã„\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"'hg resolve' ã§å†åº¦è¡çªè§£æ¶ˆã™ã‚‹ã‹ã€ 'hg up -C .' ã§å¤‰æ›´ç ´æ£„ã—ã¦ãã ã•ã„\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(マージçµæžœã® commit を忘れãšã«)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "設定ファイル %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "%s/.hg/hgrc ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "リãƒã‚¸ãƒˆãƒª %s ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹å¤±æ•—\n"
+
+msgid "SSL support is unavailable"
+msgstr "SSL サãƒãƒ¼ãƒˆãŒåˆ©ç”¨ã§ãã¾ã›ã‚“"
+
+msgid "IPv6 is not available on this system"
+msgstr "ã“ã®ã‚·ã‚¹ãƒ†ãƒ ã§ã¯ IPv6 を利用ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "'%s:%d' ã§ã®ã‚µãƒ¼ãƒèµ·å‹•ã«å¤±æ•—: %s"
+
+#, python-format
+msgid "(binary file %s, hash: %s)"
+msgstr "(ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ« %s, ãƒãƒƒã‚·ãƒ¥å€¤: %s)"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr " 更新ファイル数 %d〠追加 %d 行(+)〠削除 %d 行(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr "フック %s:%s 呼ã³å‡ºã—中\n"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr "フック %s ã¯ä¸æ­£ã§ã™(モジュール中㫠\"%s\" ãŒã‚ã‚Šã¾ã›ã‚“)"
+
+msgid "exception from first failed import attempt:\n"
+msgstr "モジュール読ã¿è¾¼ã¿ã«ãŠã‘る最åˆã®ä¾‹å¤–:\n"
+
+msgid "exception from second failed import attempt:\n"
+msgstr "モジュール読ã¿è¾¼ã¿ã«ãŠã‘ã‚‹2ã¤ç›®ã®ä¾‹å¤–:\n"
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr "フック %s ã¯ä¸æ­£ã§ã™(\"%s\" ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr "フック %s ã¯ä¸æ­£ã§ã™(\"%s\" ã¯æœªå®šç¾©ã§ã™)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr "フック %s ã¯ä¸æ­£ã§ã™(\"%s\" ã¯å‘¼ã³å‡ºã—å¯èƒ½ã§ã¯ã‚ã‚Šã¾ã›ã‚“)"
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr "エラー: フック %s ã®å¤±æ•—: %s\n"
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr "エラー: フック %s ã«ã‚ˆã‚‹ä¾‹å¤–発生: %s\n"
+
+#, python-format
+msgid "%s hook failed"
+msgstr "フック %s ã®å¤±æ•—"
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr "警告: フック %s ã®å¤±æ•—\n"
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr "フック %s: %s ã®å®Ÿè¡Œä¸­\n"
+
+#, python-format
+msgid "%s hook %s"
+msgstr "%s フック %s"
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr "警告: %s フック %s\n"
+
+#, python-format
+msgid "loading %s hook failed:\n"
+msgstr "フック %s ã®èª­ã¿è¾¼ã¿ã«å¤±æ•—:\n"
+
+msgid "kb"
+msgstr "キロãƒã‚¤ãƒˆ"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ä¸æ­£ãª [auth] セクションã®ã‚­ãƒ¼'%s' を無視ã—ã¾ã™\n"
+
+msgid "connection ended unexpectedly"
+msgstr "予期ã›ã¬æŽ¥ç¶šçµ‚了"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "URL è¦ç´  \"%s\" ã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "operation not supported over http"
+msgstr "http リãƒã‚¸ãƒˆãƒªã§ã¯æœªã‚µãƒãƒ¼ãƒˆã®æ©Ÿèƒ½ã§ã™"
+
+msgid "authorization failed"
+msgstr "èªè¨¼ã«å¤±æ•—"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "HTTP エラー(ãŠãらãプロキシー設定ã«èµ·å› )"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "実際㮠URL: %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' 㯠Mercurial リãƒã‚¸ãƒˆãƒªå½¢å¼ã¨ã¯æ€ã‚ã‚Œã¾ã›ã‚“:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' ã¯å£Šã‚ŒãŸ Content-Type ヘッダ(%s)ã‚’é€ä¿¡ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' ã¯æ–°ã—ã„プロトコル %s を使ã„ã¾ã™"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "履歴å映ã«å¤±æ•—: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "SSL 㨠HTTPS をサãƒãƒ¼ãƒˆã—㟠Python ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "cannot create new http repository"
+msgstr "http リãƒã‚¸ãƒˆãƒªã®æ–°è¦ä½œæˆã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "文法ä¸æ­£ã® '%s' を無視ã—ã¾ã™"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "読込ä¸å¯ã® ignore ファイル '%s' をスキップã—ã¾ã™: %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "リãƒã‚¸ãƒˆãƒª '%s' ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "%sã¨ã„ã†ãƒªãƒã‚¸ãƒˆãƒªã¯æ—¢ã«å­˜åœ¨ã—ã¦ã„ã¾ã™"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ".hg/sharedpath ã®å‚照先 %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr "警告: 作業領域ã®è¦ª '%s' ãŒæœªçŸ¥ã®ãƒªãƒ“ジョンã§ã™!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r ã¯ã‚¿ã‚°åã«ä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "警告: ã‚¿ã‚° %s ãŒæ—¢å­˜ã®ãƒ–ランãƒåã¨è¡çªã—ã¾ã™\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr "作業領域㮠.hgtags ãŒå¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™ï¼ˆæ‰‹å‹•ã§ã‚³ãƒŸãƒƒãƒˆã—ã¦ãã ã•ã„)"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "中断トランザクションを検出 - 'hg recover' を実施ã—ã¦ãã ã•ã„"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "中断ã•ã‚ŒãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ロールãƒãƒƒã‚¯ã—ã¦ã„ã¾ã™\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "中断ã•ã‚ŒãŸãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚ã‚Šã¾ã›ã‚“\n"
+
+msgid "no rollback information available\n"
+msgstr "利用å¯èƒ½ãªãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯æƒ…å ±ãŒã‚ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "tip をリビジョン %s ã«å·»ã戻ã—ã¾ã—㟠(å–り消㗠%s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "tip をリビジョン %s ã«å·»ã戻ã—ã¾ã—㟠(å–り消㗠%s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "未知ã®ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã®å·»ã戻ã—中\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr "作業領域ã¨ç„¡é–¢ä¿‚ã®ã‚³ãƒŸãƒƒãƒˆã®å·»ã戻ã—ã¯ã€ã‚³ãƒŸãƒƒãƒˆãƒ‡ãƒ¼ã‚¿ã‚’喪失ã—ã¾ã™"
+
+msgid "use -f to force"
+msgstr "-f 指定ã§å¼·åˆ¶å®Ÿè¡Œ"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr "åå‰ã¤ãブランãƒã¯ãƒªã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ã®ã§ã€ '%s' ã®ã¾ã¾ã§ã™\n"
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "%d 㨠%d ãŒä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンã«ãªã‚Šã¾ã—ãŸ\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "%d ãŒä½œæ¥­é ˜åŸŸã®è¦ªãƒªãƒ“ジョンã«ãªã‚Šã¾ã—ãŸ\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "%s ã®ãƒ­ãƒƒã‚¯ (%rãŒä¿æŒ) ã®è§£æ”¾ã‚’å¾…ã£ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "リãƒã‚¸ãƒˆãƒª '%s'"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "%s ã®ä½œæ¥­é ˜åŸŸ"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr "警告: '%s'('%s' ã‹ã‚‰ã®è¤‡è£½)ã®ç¥–å…ˆãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr "マージã®éƒ¨åˆ†ã‚³ãƒŸãƒƒãƒˆã¯ã§ãã¾ã›ã‚“(ファイルåï¼ãƒ‘ターンã¯æŒ‡å®šã§ãã¾ã›ã‚“)"
+
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "コミット対象ã«ã€æ–°è¦å‰¯ãƒªãƒã‚¸ãƒˆãƒª %s ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "use --subrepos for recursive commit"
+msgstr "--subrepos 指定ã§å†å¸°ã‚³ãƒŸãƒƒãƒˆ"
+
+msgid "can't commit subrepos without .hgsub"
+msgstr ".hgsub ã®ç„¡ã„副リãƒã‚¸ãƒˆãƒªã¯ã‚³ãƒŸãƒƒãƒˆã§ãã¾ã›ã‚“"
+
+msgid "file not found!"
+msgstr "ファイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
+
+msgid "no match under directory!"
+msgstr "ディレクトé…下ã«ä¸€è‡´ã™ã‚‹ã‚‚ã®ãŒã‚ã‚Šã¾ã›ã‚“!"
+
+msgid "file not tracked!"
+msgstr "ファイルã¯æœªç™»éŒ²ã§ã™!"
+
+msgid "cannot commit merge with missing files"
+msgstr "管ç†å¯¾è±¡ãƒ•ã‚¡ã‚¤ãƒ«ãŒä¸åœ¨ã®çŠ¶æ³ã§ã¯ã€ãƒžãƒ¼ã‚¸çµæžœã‚’コミットã§ãã¾ã›ã‚“"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "未解消ã®è¡çªãŒæ®‹ã£ã¦ã„ã¾ã™ (hg help resolveã‚’å‚ç…§ã—ã¦ãã ã•ã„)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã§ã®ã‚³ãƒŸãƒƒãƒˆä¸­\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "備考: コミットログを %s ã«ä¿å­˜ã—ã¾ã—ãŸ\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "%s ã®ã‚³ãƒŸãƒƒãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
+
+msgid "requesting all changes\n"
+msgstr "全リビジョンをå–得中\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr "連æºå…ˆã® changegroupsubset 機能未対応ã«ã‚ˆã‚Šã€ 部分å–ã‚Šè¾¼ã¿ã§ãã¾ã›ã‚“。"
+
+msgid "destination does not support push"
+msgstr "指定ã®é€£æºå…ˆã«ã¯å±¥æ­´å映ãŒã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "push includes an obsolete changeset: %s!"
+msgstr "履歴å映対象ã«ã€Žå»ƒæ­¢ã€ãƒªãƒ“ジョンãŒå«ã¾ã‚Œã¾ã™ï¼: %s"
+
+#, python-format
+msgid "push includes an unstable changeset: %s!"
+msgstr "履歴å映対象ã«ã€Žéžæ°¸ç¶šã€ãƒªãƒ“ジョンãŒå«ã¾ã‚Œã¾ã™ï¼: %s"
+
+#, python-format
+msgid "updating %s to public failed!\n"
+msgstr "%s ã®ãƒ•ã‚§ãƒ¼ã‚ºã® public 化ã«å¤±æ•—!\n"
+
+msgid "failed to push some obsolete markers!\n"
+msgstr "リビジョンã®ã€Žå»ƒæ­¢ã€æƒ…å ±ã®å映ã«å¤±æ•—ã—ã¾ã—ãŸï¼\n"
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "%d 個ã®ãƒªãƒ“ジョンãŒã‚ã‚Šã¾ã™\n"
+
+msgid "bundling"
+msgstr "ãƒãƒ³ãƒ‰ãƒ«ç”Ÿæˆä¸­"
+
+msgid "manifests"
+msgstr "マニフェスト"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "%s ã«å¯¾ã™ã‚‹ãƒªãƒ“ジョンログãŒç©ºãªã„ã—ä¸åœ¨ã§ã™"
+
+msgid "adding changesets\n"
+msgstr "リビジョンを追加中\n"
+
+msgid "chunks"
+msgstr "ãƒãƒ£ãƒ³ã‚¯"
+
+msgid "received changelog group is empty"
+msgstr "å—ä¿¡ã—ãŸå¤‰æ›´å±¥æ­´ã¯ç©ºã§ã™"
+
+msgid "adding manifests\n"
+msgstr "マニフェストを追加中\n"
+
+msgid "adding file changes\n"
+msgstr "ファイルã®å¤‰æ›´ã‚’追加中\n"
+
+msgid "received file revlog group is empty"
+msgstr "ファイルã®ãƒªãƒ“ジョンログãŒç©ºã§ã™"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "%s:%s ã®ãƒ•ã‚¡ã‚¤ãƒ«ãƒ‡ãƒ¼ã‚¿ãŒä¸åœ¨ã§ã™ - hg verify を実施ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr "(%+d個ã®ãƒ˜ãƒƒãƒ‰ï¼‰"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "%d 個ã®ãƒªãƒ“ジョン(%d ã®å¤‰æ›´ã‚’ %d ファイルã«é©ç”¨)を追加%s\n"
+
+msgid "unexpected response from remote server:"
+msgstr "連æºå…ˆã®ã‚µãƒ¼ãƒã‹ã‚‰äºˆæœŸã—ãªã„返信:"
+
+msgid "operation forbidden by server"
+msgstr "ãã®å‡¦ç†ã¯ã‚µãƒ¼ãƒã§ç¦æ­¢ã•ã‚Œã¦ã„ã¾ã™"
+
+msgid "locking the remote repository failed"
+msgstr "連æºå…ˆãƒªãƒã‚¸ãƒˆãƒªã‚’ロックã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+msgid "the server sent an unknown error code"
+msgstr "サーãƒãŒæœªçŸ¥ã®ã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’è¿”å´ã—ã¾ã—ãŸ"
+
+msgid "streaming all changes\n"
+msgstr "全変更を転é€ä¸­\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«è»¢é€(ãƒ‡ãƒ¼ã‚¿é‡ %s)\n"
+
+msgid "clone"
+msgstr "複製"
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "%s ã‚’ %.1f 秒ã§é€ä¿¡ã—ã¾ã—ãŸï¼ˆ%s/秒)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "TLS を利用ã§ãã¾ã›ã‚“: Python SSL サãƒãƒ¼ãƒˆãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+msgid "(using smtps)\n"
+msgstr "(SMTP を使用)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "設定ファイル㫠smtp.host 指定ãŒã‚ã‚Šã¾ã›ã‚“ - メールé€ä¿¡ã«å¤±æ•—"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "メールé€ä¿¡ä¸­: SMTP ホスト %s〠ãƒãƒ¼ãƒˆç•ªå· %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(starttls を使用)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(%s ã¨ã—ã¦ãƒ¡ãƒ¼ãƒ«ã‚µãƒ¼ãƒã®èªè¨¼ä¸­)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "メールé€ä¿¡ä¸­: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr "メール転é€æ–¹å¼ã® 'smtp' 指定ã«ã‚‚é–¢ã‚らãšã€ SMTP ホストãŒæœªè¨­å®šã§ã™"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr "メール転é€ã‚³ãƒžãƒ³ãƒ‰ã§æŒ‡å®šã•ã‚ŒãŸãƒ—ログラム %r ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "ä¸æ­£ãªæ–‡å­—セットを無視ã—ã¾ã™: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "ä¸æ­£ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "ä¸æ­£ãªãƒ­ãƒ¼ã‚«ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' 㨠'\\r' ã¯ãƒ•ã‚¡ã‚¤ãƒ«åã§ä½¿ç”¨ã—ãªã„ã§ãã ã•ã„: %r"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "マニフェストã‹ã‚‰ %s を削除ã§ãã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "ä¸æ­£ãƒ‘ターン (%s): %s"
+
+msgid "invalid pattern"
+msgstr "ä¸æ­£ãƒ‘ターン"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "一覧ファイル(%s)ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr "差分コンテキストã§ã®è¡Œæ•°æŒ‡å®šãŒä¸æ­£ã§ã™: %r"
+
+#, python-format
+msgid "%s: untracked file differs\n"
+msgstr "%s: 未登録ファイルã«å·®åˆ†ã‚ã‚Š\n"
+
+msgid ""
+"untracked files in working directory differ from files in requested revision"
+msgstr "指定リビジョンã§ã®è¨˜éŒ²å†…容ã¨ç•°ãªã‚‹æœªç™»éŒ²ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr "ファイルåã®æ–‡å­—大å°ã®å•é¡Œã§ %s 㨠%s ãŒè¡çªã—ã¾ã™"
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+"ファイル %s ã®ãƒ“ット設定ã«è¡çªãŒã‚ã‚Šã¾ã™\n"
+"ã©ã®è¨­å®šã«ã—ã¾ã™ã‹ï¼Ÿ 無効:(n)one 実行å¯èƒ½:e(x)ec リンク:sym(l)ink"
+
+msgid "&None"
+msgstr "&None"
+
+msgid "E&xec"
+msgstr "E&xec"
+
+msgid "Sym&link"
+msgstr "Sym&link"
+
+msgid "resolving manifests\n"
+msgstr "管ç†ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã‚’解決ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+"変更ã—ãŸãƒ•ã‚¡ã‚¤ãƒ« %s ã¯åˆ¥ãƒªãƒ“ジョンã§ç™»éŒ²é™¤å¤–ã•ã‚Œã¦ã„ã¾ã™\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 変更:(c)hange 登録除外:(d)elete"
+
+msgid "&Changed"
+msgstr "&Changed"
+
+msgid "&Delete"
+msgstr "&Delete"
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+"リモートã§å¤‰æ›´ã•ã‚ŒãŸ %s ã¯ãƒ­ãƒ¼ã‚«ãƒ«ã§å‰Šé™¤ã•ã‚Œã¦ã„ã¾ã™\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 変更:(c)hanged 削除:(d)elete"
+
+msgid "&Deleted"
+msgstr "&Deleted"
+
+msgid "updating"
+msgstr "更新中"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "%s ã®å‰Šé™¤ã«å¤±æ•—: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "%s ã‚’å–å¾—ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "%s ã‹ã‚‰ %s ã«è¤‡è£½ä¸­\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr "備考: è¡çªã®å¯èƒ½æ€§ - %s ãŒè¤‡æ•°ã®ãƒ•ã‚¡ã‚¤ãƒ«ã«æ”¹åã•ã‚Œã¾ã—ãŸ:\n"
+
+#, python-format
+msgid "note: possible conflict - %s was deleted and renamed to:\n"
+msgstr "備考: è¡çªã®å¯èƒ½æ€§ - 削除ã¨å¹³è¡Œã—㦠%s ã¸ã®æ”¹åãŒã‚ã‚Šã¾ã™:\n"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr "作業領域ã®ç¥–å…ˆã¨ã®ãƒžãƒ¼ã‚¸ã¯æ„味ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "use 'hg update' or check 'hg heads'"
+msgstr "'hg update' を実施ã™ã‚‹ã‹ã€'hg heads' çµæžœã‚’確èªã—ã¦ãã ã•ã„"
+
+msgid "use 'hg status' to list changes"
+msgstr "変更一覧㯠'hg status' ã§ç¢ºèªã§ãã¾ã™"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã®å¤‰æ›´ãŒæœªã‚³ãƒŸãƒƒãƒˆã§ã™"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+"ブランãƒæ¨ªæ–­ã®æ›´æ–° (マージã™ã‚‹ã‹ã€ --clean 指定ã§å¤‰æ›´ã‚’破棄ã—ã¦ãã ã•ã„)"
+
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr "ブランãƒæ¨ªæ–­ã®æ›´æ–° (マージã‹ã€ update --check ã§å¼·åˆ¶æ›´æ–°ã—ã¦ãã ã•ã„)"
+
+msgid "Attention:"
+msgstr "注æ„:"
+
+msgid "Caution:"
+msgstr "警告:"
+
+msgid "!Danger!"
+msgstr "!å±é™º!"
+
+msgid "Error:"
+msgstr "エラー:"
+
+msgid "Hint:"
+msgstr "ヒント:"
+
+msgid "Important:"
+msgstr "é‡è¦:"
+
+msgid "Note:"
+msgstr "備考:"
+
+msgid "Tip:"
+msgstr "情報:"
+
+msgid "Warning!"
+msgstr "警告!"
+
+#, python-format
+msgid "parsing obsolete marker: unknown version %r"
+msgstr "『廃止ã€æƒ…報解æž: 未知ã®ãƒªãƒ“ジョン %r"
+
+#, python-format
+msgid ""
+"parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
+msgstr "『廃止ã€æƒ…報解æž: メタデータã®æƒ³å®šã‚µã‚¤ã‚º %d ã«å¯¾ã—㦠%d ã—ã‹ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "unknown key: %r"
+msgstr "未知ã®ã‚­ãƒ¼ã§ã™: %r"
+
+msgid "unexpected old value"
+msgstr "旧値ã®æŒ‡å®šã¯æƒ³å®šå¤–ã§ã™"
+
+#, python-format
+msgid "unexpected token: %s"
+msgstr "未知ã®è¨˜è¿°: %s"
+
+#, python-format
+msgid "not a prefix: %s"
+msgstr "ä¸æ­£ãªæŽ¥é ­è¾ž: %s"
+
+#, python-format
+msgid "not an infix: %s"
+msgstr "ä¸æ­£ãªæŒ¿å…¥è¾ž: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr "%d 個ã®å·®åˆ†(ç·æ•° %d)ãŒé©ç”¨å¤±æ•— -- å´ä¸‹å·®åˆ†ã¯ %s ã«ä¿å­˜\n"
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "%s ã«ãƒ‘ッãƒé©ç”¨ã§ãã¾ã›ã‚“: 構æˆç®¡ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "パッãƒé©ç”¨å¯¾è±¡ã® '%s' ãŒä¸åœ¨ã§ã™\n"
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "ファイル %s をパッãƒé©ç”¨ã—ã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr "ä¸æ­£ãªå·®åˆ†: #%d %s (%d %d %d %d)"
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "%s を作æˆã§ãã¾ã›ã‚“: 作業先ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™\n"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "ファイル %s ã¯æ—¢ã«å­˜åœ¨ã—ã¾ã™\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr "差分 #%d ã®é©ç”¨æˆåŠŸ:%d 行目〠曖昧性 %d (ä½ç½®è£œæ­£ %d è¡Œ)\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "差分 #%d ã®é©ç”¨æˆåŠŸ:%d 行目 (ä½ç½®è£œæ­£ %d è¡Œ)\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr "差分 #%d ã®é©ç”¨å¤±æ•—:%d 行目\n"
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr "ä¸æ­£ãªå·®åˆ†: #%d"
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr "ä¸æ­£ãªå·®åˆ†: #%d 元テキスト %d 行目"
+
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "ãƒã‚¤ãƒŠãƒªãƒ‡ãƒ¼ã‚¿ \"%s\" ãŒå±•é–‹ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "ãƒã‚¤ãƒŠãƒªãƒ‘ッム\"%s\" ã®è§£æžã«å¤±æ•—ã—ã¾ã—ãŸ: %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "ãƒã‚¤ãƒŠãƒªãƒ‘ッム\"%s\" ã®å®Ÿã‚µã‚¤ã‚º %d ã¨æƒ³å®šã‚µã‚¤ã‚º %d ãŒç•°ãªã‚Šã¾ã™"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "%d 個ã®ãƒ‘スè¦ç´ é™¤å¤–ãŒã€ãƒ‘スè¦ç´ ã‚’ %d 個ã—ã‹æŒãŸãªã„ %s ã§å¤±æ•—ã—ã¾ã—ãŸ"
+
+msgid "undefined source and destination files"
+msgstr "パッãƒå¯¾è±¡ã®ãƒ•ã‚¡ã‚¤ãƒ«åãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "\"%s\" ã®ãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿ã®åŒæœŸã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "%s を作æˆã§ãã¾ã›ã‚“: 作業先ã«ã™ã§ã«å­˜åœ¨ã—ã¾ã™"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "未サãƒãƒ¼ãƒˆãªãƒ‘ーサ状態ã§ã™: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "patch コマンドãŒå¤±æ•—: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "未サãƒãƒ¼ãƒˆã®è¡Œæœ«ç¨®åˆ¥: %s"
+
+msgid "patch failed to apply"
+msgstr "パッãƒã®é©ç”¨ã«å¤±æ•—"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "%s ãŒã§ãã¾ã›ã‚“。 連æºå…ˆã¯æ©Ÿèƒ½ %r ãŒæœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "cannot change null revision phase"
+msgstr "null リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºã¯å¤‰æ›´ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "ignoring inconsistent public root from remote: %s\n"
+msgstr "連æºå…ˆã‹ã‚‰ã®çŸ›ç›¾ã™ã‚‹ãƒ•ã‚§ãƒ¼ã‚º public 化è¦æ±‚を無視: %s\n"
+
+#, python-format
+msgid "ignoring unexpected root from remote: %i %s\n"
+msgstr "連æºå…ˆã‹ã‚‰ã®äºˆæœŸã›ã¬ãƒ•ã‚§ãƒ¼ã‚ºæ›´æ–°è¦æ±‚を無視: %i %s\n"
+
+#, python-format
+msgid "phases.new-commit: not a valid phase name ('%s')"
+msgstr "phases.new-commit: ä¸æ­£ãªãƒ•ã‚§ãƒ¼ã‚ºåã§ã™ ('%s')"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "終了コード %d ã§çµ‚了ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "%d ã®ã‚·ã‚°ãƒŠãƒ«ã§å¼·åˆ¶çµ‚了ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ãƒãƒ³ãƒ‰ãƒ«ã‚’ %s ã«ä¿å­˜\n"
+
+msgid "adding branch\n"
+msgstr "ブランãƒã‚’追加中\n"
+
+#, python-format
+msgid "error removing %s: %s\n"
+msgstr "ファイル %s ã®ç ´æ£„ã«å¤±æ•—: %s\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "リビジョン除外ã«å¤±æ•—: 完全ãªãƒãƒ³ãƒ‰ãƒ«ã‚’ '%s' ã«ä¿å­˜\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "リビジョンã®é™¤å¤–ã«å¤±æ•—: 部分的ãªãƒãƒ³ãƒ‰ãƒ«ã‚’ '%s' ã«ä¿å­˜\n"
+
+#, python-format
+msgid "revlog decompress error: %s"
+msgstr "revlog 圧縮ã®å±•é–‹ã‚¨ãƒ©ãƒ¼: %s"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "%r ã¯æœªçŸ¥ã®åœ§ç¸®å½¢å¼ã§ã™"
+
+msgid "index entry flags need RevlogNG"
+msgstr "インデックスエントリフラグ㯠RevlogNG 対応ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr "インデックス %s: %#04x ã¯æœªçŸ¥ã®ãƒ•ãƒ©ã‚°ã§ã™(フォーマット v0)"
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "インデックス %s: %#04x ã¯æœªçŸ¥ã®ãƒ•ãƒ©ã‚°ã§ã™(revlogng)"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "インデックス %s: %d ã¯æœªçŸ¥ã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§ã™"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "インデックス %s ã¯ç ´æã—ã¦ã„ã¾ã™"
+
+msgid "no node"
+msgstr "ノードãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "ambiguous identifier"
+msgstr "曖昧㪠ID ã§ã™"
+
+msgid "no match found"
+msgstr "該当ã™ã‚‹ ID ã¯ã‚ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "%x ã¯äº’æ›æ€§ã®ãªã„リビジョンフラグã§ã™"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "トランザクション中㫠%s ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ"
+
+msgid "consistency error in delta"
+msgstr "差分情報ã®ä¸æ•´åˆ"
+
+msgid "unknown delta base"
+msgstr "未知ã®å·®åˆ†ãƒ™ãƒ¼ã‚¹"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "ã“ã“ã§ã¯ %s を使用ã§ãã¾ã›ã‚“"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+"``adds(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録ã—ãŸãƒªãƒ“ジョン。"
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+"``ancestor(single, single)``\n"
+" 2ã¤ã®ãƒªãƒ“ジョンã«å…±é€šãªæœ€æ–°ã®ç¥–先。"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor ã®å¼•æ•°ã¯2ã¤ã§ã™"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "ancestor ã®å¼•æ•°ã«ã¯ãã‚Œãžã‚Œå˜ä¸€ãƒªãƒ“ジョンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+"``ancestors(set)``\n"
+" set 中ã®ãƒªãƒ“ジョンã«å¯¾ã™ã‚‹ç¥–先リビジョン群。"
+
+msgid "~ expects a number"
+msgstr "~ ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+"``author(string)``\n"
+" ``user(string)`` 記述ã®åˆ¥å。"
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+"``bisect(string)``\n"
+" 探索状態ã«åˆè‡´ã™ã‚‹ãƒªãƒ“ジョン群:"
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology\n"
+" - ``current`` : the cset currently being bisected"
+msgstr ""
+" - ``good``, ``bad``, ``skip``: å„状態ã«ãƒžãƒ¼ã‚¯ã•ã‚ŒãŸãƒªãƒ“ジョン群\n"
+" - ``goods``, ``bads`` : good ãªã„ã— bad ã¨åˆ¤æ–­ã•ã‚ŒãŸãƒªãƒ“ジョン群\n"
+" - ``range`` : 探索範囲中ã®ãƒªãƒ“ジョン群 \n"
+" - ``pruned`` : 状態ãŒç¢ºå®šã—ãŸãƒªãƒ“ジョン群\n"
+" - ``untested`` : 状態ãŒæœªç¢ºå®šã®ãƒªãƒ“ジョン群\n"
+" - ``ignored`` : 探索対象ã‹ã‚‰é™¤å¤–ã•ã‚ŒãŸãƒªãƒ“ジョン群\n"
+" - ``current`` : ç¾åœ¨ã®æŽ¢ç´¢å¯¾è±¡ãƒªãƒ“ジョン"
+
+#. i18n: "bisect" is a keyword
+msgid "bisect requires a string"
+msgstr "bisect ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+"``bookmark([name])``\n"
+" 指定ブックマーク対象ã€ãªã„ã—全ブックマーク対象。"
+
+msgid ""
+" If `name` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a bookmark that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" `name` ㌠`re:` ã§å§‹ã¾ã‚‹å ´åˆã€ 残りã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚\n"
+" ブックマークåãã®ã‚‚ã®ãŒ `re:` ã§å§‹ã¾ã‚‹å ´åˆã¯ã€ åå‰ã‚’ `literal:`\n"
+" 付ãã§æŒ‡å®šã—ã¦ãã ã•ã„。"
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark ã®å¼•æ•°ã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "bookmark ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "no bookmarks exist that match '%s'"
+msgstr "'%s' ã«åˆè‡´ã™ã‚‹ãƒ–ックマークã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+"``branch(string or set)``\n"
+" 指定ブランãƒãªã„ã—リビジョン群ã®å±žã™ã‚‹ãƒ–ランãƒç¾¤ã«ã€ 属ã™ã‚‹ãƒªãƒ“ジョン。"
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a branch that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" `string` ㌠`re:` ã§å§‹ã¾ã‚‹å ´åˆã€ 残りã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚\n"
+" ブランãƒåãã®ã‚‚ã®ãŒ `re:` ã§å§‹ã¾ã‚‹å ´åˆã¯ã€ åå‰ã‚’ `literal:`\n"
+" 付ãã§æŒ‡å®šã—ã¦ãã ã•ã„。"
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+"``children(set)``\n"
+" 指定リビジョン群ã®å­ãƒªãƒ“ジョン群。"
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+"``closed()``\n"
+" 閉鎖ã•ã‚ŒãŸãƒªãƒ“ジョン群。"
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+"``contains(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ãŒå­˜åœ¨ã™ã‚‹ãƒªãƒ“ジョン群。\n"
+" パターンã®è©³ç´°ã¯ :hg:`help patterns` ã‚’å‚照。"
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``converted([id])``\n"
+" Changesets converted from the given identifier in the old repository if\n"
+" present, or all converted changesets if no identifier is specified."
+msgstr ""
+"``converted([id])``\n"
+" id ãŒæŒ‡å®šã•ã‚ŒãŸå ´åˆã¯ã€ 変æ›å…ƒã«ãŠã‘ã‚‹ id ã‹ã‚‰å¤‰æ›ã•ã‚ŒãŸãƒªãƒ“ジョンã€\n"
+" id 指定ãŒç„¡ã„å ´åˆã¯ã€ 変æ›ã•ã‚ŒãŸå…¨ã¦ã®ãƒªãƒ“ジョン群。"
+
+#. i18n: "converted" is a keyword
+msgid "converted takes one or no arguments"
+msgstr "converted ã®å¼•æ•°ã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "converted" is a keyword
+msgid "converted requires a revision"
+msgstr "converted ã«ã¯ãƒªãƒ“ジョン識別å­ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+"``date(interval)``\n"
+" 指定期間中ã®ãƒªãƒ“ジョン群。 期間指定ã®è©³ç´°ã¯ :hg:`help dates` ã‚’å‚照。"
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+"``desc(string)``\n"
+" 文字列をコミットログã«æŒã¤ãƒªãƒ“ジョン群。\n"
+" åˆè‡´åˆ¤å®šã¯æ–‡å­—大å°ã‚’無視。"
+
+#. i18n: "desc" is a keyword
+msgid "desc requires a string"
+msgstr "desc ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+"``descendants(set)``\n"
+" 指定リビジョン群ã®å­å­«ãƒªãƒ“ジョン群。"
+
+msgid ""
+"``destination([set])``\n"
+" Changesets that were created by a graft, transplant or rebase "
+"operation,\n"
+" with the given revisions specified as the source. Omitting the optional "
+"set\n"
+" is the same as passing all()."
+msgstr ""
+"``destination([set])``\n"
+" 指定リビジョン群を元ã«ã€ graft, transplant, rebase ç­‰ã«ã‚ˆã£ã¦ã€\n"
+" 生æˆã•ã‚ŒãŸãƒªãƒ“ジョン群。 set 指定ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã€ ``all()``\n"
+" 指定相当ã¨ã¿ãªã—ã¾ã™ã€‚"
+
+msgid ""
+"``draft()``\n"
+" Changeset in draft phase."
+msgstr ""
+"``draft()``\n"
+" フェーズ㌠draft ãªãƒªãƒ“ジョン群。"
+
+#. i18n: "draft" is a keyword
+msgid "draft takes no arguments"
+msgstr "draft ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``extinct()``\n"
+" Obsolete changesets with obsolete descendants only."
+msgstr ""
+"``extinct()``\n"
+" å­å­«ãŒå…¨ã¦ã€Žå»ƒæ­¢ã€ãƒªãƒ“ジョンãªã€ã€Žå»ƒæ­¢ã€ãƒªãƒ“ジョン群。"
+
+#. i18n: "extinct" is a keyword
+msgid "extinct takes no arguments"
+msgstr "extinct ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``extra(label, [value])``\n"
+" Changesets with the given label in the extra metadata, with the given\n"
+" optional value."
+msgstr ""
+"``extra(label, [value])``\n"
+" extra メタデータã«ã€ 特定ã®åå‰ã®å€¤ã‚’æŒã¤ãƒªãƒ“ジョン群。 値指定ã«ã‚ˆã‚Šã€\n"
+" åˆè‡´å¯¾è±¡ãŒæ›´ã«çµžã‚Šè¾¼ã¾ã‚Œã¾ã™ã€‚"
+
+msgid ""
+" If `value` starts with `re:`, the remainder of the value is treated as\n"
+" a regular expression. To match a value that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" `value` ㌠`re:` ã§å§‹ã¾ã‚‹å ´åˆã€ 残りã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚\n"
+" 値ãã®ã‚‚ã®ãŒ `re:` ã§å§‹ã¾ã‚‹å ´åˆã¯ã€ 値を `literal:`\n"
+" 付ãã§æŒ‡å®šã—ã¦ãã ã•ã„。"
+
+#. i18n: "extra" is a keyword
+msgid "extra takes at least 1 and at most 2 arguments"
+msgstr "extra ã®å¼•æ•°ã¯ã€ 最低1ã¤ã€æœ€å¤§2ã¤ã§ã™"
+
+#. i18n: "extra" is a keyword
+msgid "first argument to extra must be a string"
+msgstr "extra ã®ç¬¬ï¼‘引数ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+#. i18n: "extra" is a keyword
+msgid "second argument to extra must be a string"
+msgstr "extra ã®ç¬¬ï¼’引数ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+"``filelog(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æ”¹å¤‰ã«é–¢é€£ä»˜ã‘られãŸãƒªãƒ“ジョン群。"
+
+msgid ""
+" For performance reasons, ``filelog()`` does not show every changeset\n"
+" that affects the requested file(s). See :hg:`help log` for details. For\n"
+" a slower, more accurate result, use ``file()``."
+msgstr ""
+" 指定ファイルã®é–¢é€£ãƒªãƒ“ジョンã§ã‚ã£ã¦ã‚‚〠``filelog()`` ã«ã‚ˆã£ã¦ã€\n"
+" å¿…ãšã—も列挙ã•ã‚Œã‚‹ã¨ã¯é™ã‚‰ãªã„ã®ã¯ã€ 性能上ã®ç†ç”±ã‹ã‚‰ã§ã™ã€‚\n"
+" ã“ã®æŒ™å‹•ã®è©³ç´°ã«é–¢ã—ã¦ã¯ :hg:`help log` ã‚’å‚ç…§ã—ã¦ãã ã•ã„。\n"
+" 低速ã§ã‚‚〠正確ãªçµæžœãŒå¿…è¦ãªå ´åˆã¯ ``file()`` を使用ã—ã¦ãã ã•ã„。"
+
+#. i18n: "filelog" is a keyword
+msgid "filelog requires a pattern"
+msgstr "filelog ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+"``first(set, [n])``\n"
+" limit() 記述ã®åˆ¥å。"
+
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s ã®å¼•æ•°ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«åã‹ã€å¼•æ•°ç„¡ã—ã§ã™"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s ã«ã¯ãƒ•ã‚¡ã‚¤ãƒ«åを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+"``follow([file])``\n"
+" ``::.`` (作業領域ã®ç¬¬1親ã®ç¥–先リビジョン群) 記述ã®åˆ¥å。\n"
+" ファイルå指定ãŒã‚ã‚‹å ´åˆã€ 当該ファイルã®å±¥æ­´ (複製å«ã‚€) を辿りã¾ã™ã€‚"
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+"``all()``\n"
+" 全リビジョン。 ``0:tip`` ã¨ç­‰ä¾¡ã€‚"
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+"``grep(regex)``\n"
+" ``keyword(string)`` ã¨åŒç­‰ã§ã™ãŒã€ æ­£è¦è¡¨ç¾ã‚’使用ã§ãã¾ã™ã€‚\n"
+" ``grep(r'...')`` å½¢å¼ã®å ´åˆã€ 特殊文字もãã®ã¾ã¾é©ç”¨ã•ã‚Œã¾ã™ã€‚\n"
+" (※ 訳注: 接頭辞 'r' ã®ä½¿ç”¨ã¯ã€ ãƒãƒƒã‚¯ã‚¹ãƒ©ãƒƒã‚·ãƒ¥ç­‰ã‚’å«ã‚ã¦ã€\n"
+" 文字列をãã®ã¾ã¾ä½¿ç”¨ã™ã‚‹å ´åˆã® Python å¼ã®è¨˜æ³•ã§ã™)\n"
+" ``keyword(string)`` ã¨ç•°ãªã‚Šã€ 文字大å°ã¯ç„¡è¦–ã•ã‚Œã¾ã›ã‚“。"
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "ä¸æ­£ãªãƒžãƒƒãƒãƒ³ã‚°ãƒ‘ターン: %s"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles ã«ã¯æœ€ä½Ž1ã¤ã®å¼•æ•°ãŒå¿…è¦ã§ã™"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles ã«ã¯æ–‡å­—列引数ãŒå¿…è¦ã§ã™"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles ã¸ã®ãƒªãƒ“ジョン指定ã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles ã¸ã®ãƒ¢ãƒ¼ãƒ‰æŒ‡å®šã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "_matchfiles" is a keyword
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "ä¸æ­£ãª _matchfiles å‰ç½®è©žæŒ‡å®š: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+"``file(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã«æ”¹å¤‰ã‚’è¡Œã£ãŸãƒªãƒ“ジョン群。"
+
+msgid ""
+" For a faster but less accurate result, consider using ``filelog()``\n"
+" instead."
+msgstr ""
+" 多少厳密ã•ã«æ¬ ã‘ã¦ã‚‚〠性能ãŒå¿…è¦ãªå ´åˆã¯ã€ 代ã‚ã‚Šã« ``filelog()``\n"
+" ã®ä½¿ç”¨ã‚’検討ã—ã¦ã¿ã¦ãã ã•ã„。"
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+"``head()``\n"
+" åå‰ä»˜ãブランãƒã®ãƒ˜ãƒƒãƒ‰ãƒªãƒ“ジョン群。"
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+"``heads(set)``\n"
+" 指定リビジョン中ã®ã€ å­ãƒªãƒ“ジョンをæŒãŸãªã„リビジョン群。"
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+"``keyword(string)``\n"
+" 文字列ãŒã€ コミットログ〠ユーザå〠変更対象ファイルåã®ã€\n"
+" ã„ãšã‚Œã‹ã«åˆè‡´ã™ã‚‹ãƒªãƒ“ジョン群。 åˆè‡´åˆ¤å®šã¯æ–‡å­—大å°ã‚’無視。"
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+"``limit(set, [n])``\n"
+" 指定リビジョン群ã®å†’é ­ n 個。 無指定時㯠1。"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires one or two arguments"
+msgstr "limit ã®å¼•æ•°ã¯1ã¤ãªã„ã—2ã¤ã§ã™"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+"``last(set, [n])``\n"
+" 指定リビジョン群ã®æœ«å°¾ n 個。 無指定時㯠1。"
+
+#. i18n: "last" is a keyword
+msgid "last requires one or two arguments"
+msgstr "last ã®å¼•æ•°ã¯1ã¤ãªã„ã—2ã¤ã§ã™"
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr "last ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr "last ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+"``max(set)``\n"
+" 指定リビジョン群中ã§ã€ リビジョン番å·ãŒæœ€å¤§ã®ã‚‚ã®ã€‚"
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+"``merge()``\n"
+" マージ実施リビジョン群。"
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+"``min(set)``\n"
+" 指定リビジョン群中ã§ã€ リビジョン番å·ãŒæœ€å°ã®ã‚‚ã®ã€‚"
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+"``modifies(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã‚’改変ã—ãŸãƒªãƒ“ジョン群。"
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+"``id(string)``\n"
+" 16進文字列をãƒãƒƒã‚·ãƒ¥å€¤ã¨ã¿ãªã—ã¦åŽ³å¯†ã«ç‰¹å®šå¯èƒ½ãªãƒªãƒ“ジョン。"
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id ã®å¼•æ•°ã¯1ã¤ã§ã™"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``obsolete()``\n"
+" Mutable changeset with a newer version."
+msgstr ""
+"``obsolete()``\n"
+" æ–°è¦ãƒªãƒ“ジョンã«ã‚ˆã‚‹æ”¹å¤‰ãŒå¯èƒ½ãªãƒªãƒ“ジョン群。\n"
+" (※ 訳注: 『廃止ã€è¨­å®šã•ã‚Œã¦ã„るリビジョン群ã®ã“ã¨)"
+
+#. i18n: "obsolete" is a keyword
+msgid "obsolete takes no arguments"
+msgstr "obsolete ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``origin([set])``\n"
+" Changesets that were specified as a source for the grafts, transplants "
+"or\n"
+" rebases that created the given revisions. Omitting the optional set is "
+"the\n"
+" same as passing all(). If a changeset created by these operations is "
+"itself\n"
+" specified as a source for one of these operations, only the source "
+"changeset\n"
+" for the first operation is selected."
+msgstr ""
+"``origin([set])``\n"
+" 指定リビジョン群㮠graft, transplant, rebase ç­‰ã«ã‚ˆã‚‹ç”Ÿæˆã®éš›ã«ã€\n"
+" 元リビジョンã¨ã—ã¦æŒ‡å®šã•ã‚ŒãŸãƒªãƒ“ジョン群。 set 指定ãŒçœç•¥ã•ã‚ŒãŸå ´åˆã€\n"
+" ``all()`` 指定相当ã¨ã¿ãªã—ã¾ã™ã€‚ 当該æ“作ã§ç”Ÿæˆã•ã‚ŒãŸãƒªãƒ“ジョンãŒã€ \n"
+" 別ã®ãƒªãƒ“ジョン生æˆã®éš›ã«ã€ 生æˆå…ƒã¨ã—ã¦æŒ‡å®šã•ã‚Œã¦ã„ã‚‹å ´åˆã¯ã€\n"
+" 最åˆã®ç”Ÿæˆæ“作ã«ãŠã‘る生æˆå…ƒã®ã¿ãŒã€ 生æˆå…ƒã¨ã¿ãªã•ã‚Œã¾ã™ã€‚"
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([path])``\n"
+" 指定連æºå…ˆãªã„ã—無指定時å映先ã«ã€ 存在ã—ãªã„リビジョン群。"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing takes one or no arguments"
+msgstr "outgoing ã®å¼•æ•°ã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "outgoing ã«ã¯ãƒªãƒã‚¸ãƒˆãƒªãƒ‘スを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+"``p1([set])``\n"
+" 指定リビジョン群ãªã„ã—作業領域ã®ã€ç¬¬1親リビジョン群。"
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+"``p2([set])``\n"
+" 指定リビジョン群ãªã„ã—作業領域ã®ã€ç¬¬2親リビジョン群。"
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+"``parents([set])``\n"
+" 指定リビジョン群ãªã„ã—作業領域ã®ã€ 全親リビジョン群。"
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr "^ ã«ã¯ 0〠1 ãªã„ã— 2 を指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+"``present(set)``\n"
+" 指定リビジョン群ã«å­˜åœ¨ã—ãªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã‚‹å ´åˆã¯ç©ºé›†åˆã€\n"
+" ãれ以外ãªã‚‰æŒ‡å®šãƒªãƒ“ジョン群ãã®ã‚‚ã®ã€‚"
+
+msgid ""
+" If any of specified revisions is not present in the local repository,\n"
+" the query is normally aborted. But this predicate allows the query\n"
+" to continue even in such cases."
+msgstr ""
+" 対象リビジョン群ãŒã€ 存在ã—ãªã„リビジョンをå«ã‚€å ´åˆã€ 通常ã§ã‚ã‚Œã°ã€\n"
+" 処ç†ãŒä¸­æ–­ã•ã‚Œã¾ã™ãŒã€ present() ã«ã‚ˆã£ã¦å‡¦ç†ã‚’継続ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"
+
+msgid ""
+"``public()``\n"
+" Changeset in public phase."
+msgstr ""
+"``public()``\n"
+" フェーズ㌠public ãªãƒªãƒ“ジョン群。"
+
+#. i18n: "public" is a keyword
+msgid "public takes no arguments"
+msgstr "public ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``remote([id [,path]])``\n"
+" Local revision that corresponds to the given identifier in a\n"
+" remote repository, if present. Here, the '.' identifier is a\n"
+" synonym for the current local branch."
+msgstr ""
+"``remote([id [,path]])``\n"
+" 指定 id 相当ã®ãƒªãƒ“ジョンãŒé€£æºå…ˆã«å­˜åœ¨ã™ã‚‹å ´åˆã¯å½“該リビジョンã€\n"
+" ãれ以外ã¯ç©ºé›†åˆã€‚ '.' 記述ã¯ç¾ãƒ–ランãƒåを指ã—ã¾ã™ã€‚"
+
+#. i18n: "remote" is a keyword
+msgid "remote takes one, two or no arguments"
+msgstr "remote ã®å¼•æ•°ã¯0ã‹ã‚‰2ã¤ã§ã™"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a string id"
+msgstr "remote ã«ã¯ id 文字列を指定ã—ã¦ãã ã•ã„"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a repository path"
+msgstr "remote ã«ã¯ãƒªãƒã‚¸ãƒˆãƒªãƒ‘スを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+"``removes(pattern)``\n"
+" パターンã«åˆè‡´ã™ã‚‹åå‰ã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’登録除外ã—ãŸãƒªãƒ“ジョン群。"
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes ã«ã¯ãƒ‘ターンを指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+"``rev(number)``\n"
+" 数値ã«åˆè‡´ã™ã‚‹ãƒªãƒ“ジョン。"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev ã®å¼•æ•°ã¯1ã¤ã§ã™"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev ã«ã¯æ•°å€¤ã‚’指定ã—ã¦ãã ã•ã„"
+
+msgid ""
+"``matching(revision [, field])``\n"
+" Changesets in which a given set of fields match the set of fields in "
+"the\n"
+" selected revision or set."
+msgstr ""
+"``matching(revision [, field])``\n"
+" 指定リビジョン群 (revision) ã¨ã€æŒ‡å®šé …ç›® (field) 値ãŒåŒä¸€ãªã€\n"
+" リビジョンã®æŠ½å‡º (※ 訳注: ``and`` çµåˆç­‰ã§ã®æŠ½å‡ºå…ƒæŒ‡å®šãŒç„¡ã„å ´åˆã€\n"
+" 全リビジョンãŒæŠ½å‡ºå…ƒã«ãªã‚Šã¾ã™)。"
+
+msgid ""
+" To match more than one field pass the list of fields to match separated\n"
+" by spaces (e.g. ``author description``)."
+msgstr ""
+" 複数項目ã®åˆè‡´åˆ¤å®šã¯ã€ 対象項目を空白区切りã§æŒ‡å®šã—ã¾ã™\n"
+" (例: 'author description')。"
+
+msgid ""
+" Valid fields are most regular revision fields and some special fields."
+msgstr " リビジョンã®ä¸€èˆ¬çš„ãªé …目以外ã«ã€ 特別ãªé …目も指定ã§ãã¾ã™ã€‚"
+
+msgid ""
+" Regular revision fields are ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" and ``diff``.\n"
+" Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the\n"
+" contents of the revision. Two revisions matching their ``diff`` will\n"
+" also match their ``files``."
+msgstr ""
+" 一般的ãªé …ç›®ã«ã¯ã€``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" ãŠã‚ˆã³ ``diff`` ãŒã‚ã‚Šã¾ã™ã€‚ ``author`` 㨠``user`` ã¯åŒä¸€é …ç›®ã§ã™ã€‚\n"
+" ``diff`` ã¯å„リビジョンã§ã®å·®åˆ†ã‚’指ã—ã¾ã™ã€‚ ï¼’ã¤ã®ãƒªãƒ“ジョンã«ãŠã„ã¦\n"
+" ``diff`` ãŒä¸€è‡´ã™ã‚‹å ´åˆã¯ ``files`` も一致ã—ã¾ã™ã€‚"
+
+msgid ""
+" Special fields are ``summary`` and ``metadata``:\n"
+" ``summary`` matches the first line of the description.\n"
+" ``metadata`` is equivalent to matching ``description user date``\n"
+" (i.e. it matches the main metadata fields)."
+msgstr ""
+" 特殊項目ã«ã¯ ``summary`` ãŠã‚ˆã³ ``metadata`` ãŒã‚ã‚Šã¾ã™: ``summary``\n"
+" 㯠``description`` ã®ï¼‘行目ã«ç›¸å½“ã—ã¾ã™ã€‚ ``metadata`` ã¯\n"
+" ``description user date`` ã¨ã®åˆè‡´ã«ç›¸å½“ã—ã¾ã™ (ã“ã®å称ã¯ã€\n"
+" 「主ãªãƒ¡ã‚¿ãƒ‡ãƒ¼ã‚¿é …ç›®ã¨ã®åˆè‡´ã€åˆ¤å®šã«ç”±æ¥ã—ã¾ã™)"
+
+msgid ""
+" ``metadata`` is the default field which is used when no fields are\n"
+" specified. You can match more than one field at a time."
+msgstr ""
+" フィールド指定ãŒç„¡ã„å ´åˆã€ ``metadata`` フィールドãŒå¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚\n"
+" åŒæ™‚ã«è¤‡æ•°ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã®åˆè‡´åˆ¤å®šãŒå¯èƒ½ã§ã™ã€‚"
+
+#. i18n: "matching" is a keyword
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching ã®å¼•æ•°ã¯1ã¤ã‹2ã¤ã§ã™"
+
+#. i18n: "matching" is a keyword
+msgid "matching requires a string as its second argument"
+msgstr "matching ã®ç¬¬2引数ã¯æ–‡å­—列ã§ã™"
+
+#. i18n: "matching" is a keyword
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "matching ã¸ã®æƒ³å®šå¤–ã®ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰å指定: %s"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+"``reverse(set)``\n"
+" 指定リビジョン群ã®é€†é †ã€‚"
+
+msgid ""
+"``roots(set)``\n"
+" Changesets in set with no parent changeset in set."
+msgstr ""
+"``roots(set)``\n"
+" 指定リビジョン群中ã®ã€ 親リビジョンãŒæŒ‡å®šãƒªãƒ“ジョン群中ã«å­˜åœ¨ã—ãªã„ã€\n"
+" 全リビジョン。"
+
+msgid ""
+"``secret()``\n"
+" Changeset in secret phase."
+msgstr ""
+"``secret()``\n"
+" フェーズ㌠secret ãªãƒªãƒ“ジョン群。"
+
+#. i18n: "secret" is a keyword
+msgid "secret takes no arguments"
+msgstr "secret ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+"``sort(set[, [-]key...])``\n"
+" key ã§ã®æŒ‡å®šæ–¹æ³•ã§æ•´åˆ—ã—ãŸé›†åˆã€‚ 基本ã®æ•´åˆ—æ–¹å¼ã¯æ˜‡é †ã§ã€\n"
+" é™é †æ•´åˆ—ã®å ´åˆã¯ ``-key`` å½¢å¼ã§è¨˜è¿°ã—ã¾ã™ã€‚"
+
+msgid " The keys can be:"
+msgstr " 指定å¯èƒ½ãªæ•´åˆ—æ–¹å¼ã¯:"
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+" - リビジョン番å·é †ã® ``rev``\n"
+" - ブランãƒå順㮠``branch``\n"
+" - コミットログ (description) 順㮠``desc``\n"
+" - ユーザå順㮠``user`` (別åã® ``author`` も使用å¯èƒ½)\n"
+" - コミット日時順㮠``date``"
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort ã®å¼•æ•°ã¯1ã¤ãªã„ã—2ã¤ã§ã™"
+
+#. i18n: "sort" is a keyword
+msgid "sort spec must be a string"
+msgstr "sort ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "未知ã®æ•´åˆ—æ–¹å¼ %r"
+
+#, python-format
+msgid "invalid regular expression: %s"
+msgstr "ä¸æ­£ãªæ­£è¦è¡¨ç¾: %s"
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+"``tag([name])``\n"
+" 指定タグ対象リビジョン〠ãªã„ã—タグ付ã‘対象ã®å…¨ãƒªãƒ“ジョン群。"
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tagged ã®å¼•æ•°ã¯æœ€å¤§1ã¤ã§ã™"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "tag ã«ã¯æ–‡å­—列を指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "no tags exist that match '%s'"
+msgstr "'%s' ã«åˆè‡´ã™ã‚‹ã‚¿ã‚°ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid ""
+"``unstable()``\n"
+" Non-obsolete changesets with obsolete ancestors."
+msgstr ""
+"``unstable()``\n"
+" 祖先ã«ã€Žå»ƒæ­¢ã€ãƒªãƒ“ジョンをæŒã¤ã€ã€Žéžå»ƒæ­¢ã€ãƒªãƒ“ジョン群。"
+
+#. i18n: "unstable" is a keyword
+msgid "unstable takes no arguments"
+msgstr "unstable ã«ã¯å¼•æ•°ãŒæŒ‡å®šã§ãã¾ã›ã‚“"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+"``user(string)``\n"
+" 文字列をユーザåã«æŒã¤ãƒªãƒ“ジョン群。 åˆè‡´åˆ¤å®šã¯æ–‡å­—大å°ã‚’無視。"
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the string is treated "
+"as\n"
+" a regular expression. To match a user that actually contains `re:`, use\n"
+" the prefix `literal:`."
+msgstr ""
+" `string` ㌠`re:` ã§å§‹ã¾ã‚‹å ´åˆã€ 残りã¯æ­£è¦è¡¨ç¾ã¨ã—ã¦æ‰±ã‚ã‚Œã¾ã™ã€‚\n"
+" ユーザåãã®ã‚‚ã®ãŒ `re:` ã§å§‹ã¾ã‚‹å ´åˆã¯ã€ ユーザåã‚’ `literal:`\n"
+" 付ãã§æŒ‡å®šã—ã¦ãã ã•ã„。"
+
+msgid "can't negate that"
+msgstr "負値ã«ã§ãã¾ã›ã‚“"
+
+msgid "not a symbol"
+msgstr "シンボル以外ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+#, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr "revset 別å定義 \"%s\" ã¯ç„¡é™ã«å±•é–‹ã•ã‚Œã¦ã—ã¾ã„ã¾ã™"
+
+#, python-format
+msgid "invalid number of arguments: %s"
+msgstr "引数ã®æ•°ãŒä¸æ­£ã§ã™: %s"
+
+msgid "empty query"
+msgstr "å•ã„åˆã‚ã›ãŒç©ºã§ã™"
+
+#, python-format
+msgid "no changes found (ignored %d secret changesets)\n"
+msgstr "差分ã¯ã‚ã‚Šã¾ã›ã‚“ (secret フェーズ㮠%d 個ã®ãƒªãƒ“ジョンã¯ç„¡è¦–)\n"
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr "ui.portablefilenames 値ãŒä¸æ­£ã§ã™ ('%s')"
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr "ファイルåã®æ–‡å­—大å°ã®å•é¡Œã§ %s ãŒè¡çªã—ã¾ã™"
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "パスã®æœ«å°¾ãŒåŒºåˆ‡ã‚Šæ–‡å­—ã§ã™: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "パスã«ä¸æ­£ãªè¦ç´ ãŒå«ã¾ã‚Œã¦ã„ã¾ã™: %s"
+
+#, python-format
+msgid "path '%s' is inside nested repo %r"
+msgstr "パス '%s' ã¯å…¥ã‚Œå­ãƒªãƒã‚¸ãƒˆãƒª %r 内ã«ã‚ã‚Šã¾ã™"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "パス %r ã¯ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ '%r' ãŒå«ã¾ã‚Œã¦ã„ã¾ã™"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "%r ã«å¯¾ã—ã¦ã‚·ãƒ³ãƒœãƒªãƒƒã‚¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“: %s"
+
+msgid "empty revision range"
+msgstr "リビジョンã®ç¯„囲指定ãŒç©ºã§ã™"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr "%s ã®å‰Šé™¤ã‚’ %s ã¸ã®ãƒ•ã‚¡ã‚¤ãƒ«å変更ã¨ã—ã¦è¨˜éŒ²ä¸­ (類似度 %d%%)\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr "%s ã¯æœªã‚³ãƒŸãƒƒãƒˆãªã®ã§ã€ %s ã®ã‚³ãƒ”ーデータã¯æ®‹ã‚Šã¾ã›ã‚“\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr ".hg/requires ファイルãŒç ´æã—ã¦ã„ã¾ã™"
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr "未知ã®ãƒªãƒã‚¸ãƒˆãƒªå½¢å¼ã§ã™: '%s' サãƒãƒ¼ãƒˆãŒå¿…è¦ (è¦ Mercurial æ›´æ–°)"
+
+msgid "searching for changes\n"
+msgstr "変更点を探索中\n"
+
+msgid "all local heads known remotely\n"
+msgstr "手元ã®å…¨ãƒ˜ãƒƒãƒ‰ã¯é€£æºå…ˆã§ã‚‚既知ã§ã™\n"
+
+msgid "sampling from both directions\n"
+msgstr "両方å‘ã‹ã‚‰æŽ¡å–中\n"
+
+msgid "queries"
+msgstr "å•ã„åˆã‚ã›"
+
+msgid "searching"
+msgstr "検索中"
+
+msgid "repository is unrelated"
+msgstr "無関係ãªãƒªãƒã‚¸ãƒˆãƒªã§ã™"
+
+msgid "warning: repository is unrelated\n"
+msgstr "警告: 無関係ãªãƒªãƒã‚¸ãƒˆãƒªã§ã™\n"
+
+msgid "searching for exact renames"
+msgstr "厳密ãªæ”¹åを探索中"
+
+msgid "searching for similar files"
+msgstr "類似ファイルを探索中"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s ã¯ãƒã‚¤ãƒŠãƒªãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚ˆã†ã§ã™ã€‚"
+
+msgid "can only specify two labels."
+msgstr "ラベルã¯äºŒã¤ã®ã¿æŒ‡å®šå¯ã€‚"
+
+msgid "warning: conflicts during merge.\n"
+msgstr "警告: マージ中ã«è¡çªã‚’発見。\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "URL %s ã®è§£æžã«å¤±æ•—"
+
+msgid "password in URL not supported"
+msgstr "パスワード付ã URL ã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "could not create remote repo"
+msgstr "指定リãƒã‚¸ãƒˆãƒªã¨ã®é€£æºã«å¤±æ•—"
+
+msgid "no suitable response from remote hg"
+msgstr "指定リãƒã‚¸ãƒˆãƒªã‹ã‚‰ã®å¿œç­”ãŒä¸é©åˆ‡"
+
+#, python-format
+msgid "push refused: %s"
+msgstr "履歴å映ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸ: %s"
+
+msgid "ssl connection failed"
+msgstr "ssl 接続ã«å¤±æ•—"
+
+msgid "Python SSL support not found"
+msgstr "Python ã® SSL サãƒãƒ¼ãƒˆæ©Ÿèƒ½ãŒä½¿ç”¨ã§ãã¾ã›ã‚“"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "証明書検証ã«ã¯ Python 2.6 ãŒå¿…è¦ã§ã™"
+
+msgid "no certificate received"
+msgstr "証明書ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "%s 用ã®è¨¼æ˜Žæ›¸ãƒ•ã‚¡ã‚¤ãƒ«"
+
+msgid "IDN in certificate not supported"
+msgstr "証明書㮠IDN ã¯æœªã‚µãƒãƒ¼ãƒˆã§ã™"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "証明書㫠commonName ã‚„ subjectAltName ãŒå«ã¾ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "web.cacerts ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr "ホスト %s ã®ãƒ•ã‚£ãƒ³ã‚¬ãƒ¼ãƒ—リントãŒæ¤œè¨¼ã§ãã¾ã›ã‚“ (Python ãŒå¤ã„ãŸã‚)"
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr "警告: %s ã®è¨¼æ˜Žæ›¸ã¯æ¤œè¨¼ã§ãã¾ã›ã‚“ (Python ãŒå¤ã„ãŸã‚)\n"
+
+#, python-format
+msgid "%s ssl connection error"
+msgstr "%s ã¸ã® ssl 接続ã«å¤±æ•—"
+
+#, python-format
+msgid "%s certificate error: no certificate received"
+msgstr "%s ã®è¨¼æ˜Žæ›¸æ¤œè¨¼ã«å¤±æ•—: 証明書ãŒå—ã‘å–ã‚Œã¾ã›ã‚“"
+
+#, python-format
+msgid "certificate for %s has unexpected fingerprint %s"
+msgstr "%s ã®è¨¼æ˜Žæ›¸ã® fingerprint %s ã¯æœŸå¾…値ã¨ç•°ãªã‚Šã¾ã™"
+
+msgid "check hostfingerprint configuration"
+msgstr "hostfingerprint 設定を確èªã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "%s ã®è¨¼æ˜Žæ›¸æ¤œè¨¼ã«å¤±æ•—: %s"
+
+#, python-format
+msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
+msgstr ""
+"%s ã« hostfingerprint 設定ã™ã‚‹ã‹ã€éžã‚»ã‚­ãƒ¥ã‚¢æŽ¥ç¶šã§ç¶™ç¶šã™ã‚‹ãªã‚‰ --insecure ã‚’"
+"指定ã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+"警告: %s ã®è¨¼æ˜Žæ›¸ (fingerprint 㯠%s) 検証をçœç•¥(設定ファイル㮠"
+"hostfingerprints ãªã„ã— web.cacerts 設定を確èªã—ã¦ãã ã•ã„)\n"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' 㯠Mercurial リãƒã‚¸ãƒˆãƒªå½¢å¼ã¨ã¯æ€ã‚ã‚Œã¾ã›ã‚“"
+
+msgid "cannot lock static-http repository"
+msgstr "static-http リãƒã‚¸ãƒˆãƒªã¯ãƒ­ãƒƒã‚¯ã§ãã¾ã›ã‚“"
+
+msgid "cannot create new static-http repository"
+msgstr "static-http リãƒã‚¸ãƒˆãƒªã®æ–°è¦ä½œæˆã¯ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr "ファイルåキャッシュã«ä¸æ­£ãªã‚¨ãƒ³ãƒˆãƒª: %s 行目"
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "警告: 副リãƒã‚¸ãƒˆãƒªã® spec ファイル %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "副リãƒã‚¸ãƒˆãƒªã® spec ファイル %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "invalid subrepository revision specifier in .hgsubstate line %d"
+msgstr ".hgsubstate ã® %d 行目ã«ãŠã‘る副リãƒã‚¸ãƒˆãƒªã®ãƒªãƒ“ジョン指定ãŒä¸æ­£ã§ã™"
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr "%s ã«ãŠã‘る副リãƒã‚¸ãƒˆãƒªæŒ‡å®šã®ä¸æ­£: %s"
+
+msgid "missing ] in subrepo source"
+msgstr "副リãƒã‚¸ãƒˆãƒªå…ƒæŒ‡å®šã« ] ãŒã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+" 副リãƒã‚¸ãƒˆãƒª %s ã§å·®åˆ†ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 手元(%s):(l)ocal 連æºå…ˆ(%s):(r)emote"
+
+msgid "&Remote"
+msgstr "&Remote"
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªã§å¤‰æ›´ã—ãŸãƒ•ã‚¡ã‚¤ãƒ« %s ã¯ã€ 連æºå…ˆã§ã¯ç™»éŒ²é™¤å¤–ã•ã‚Œã¦ã„ã¾ã™\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 変更:(c)hange 登録除外:(d)elete"
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒªã§ç™»éŒ²é™¤å¤–ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ« %s ã¯ã€ 連æºå…ˆã§ã¯å¤‰æ›´ã•ã‚Œã¦ã„ã¾ã™\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 変更:(c)hange 登録除外:(d)elete"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" 副リãƒã‚¸ãƒˆãƒª %s ã®ä½œæ¥­é ˜åŸŸã§å·®åˆ†ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 手元(%s):(l)ocal 連æºå…ˆ(%s):(r)emote\n"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" 副リãƒã‚¸ãƒˆãƒª %s ã®ãƒªãƒ“ジョンã«å·®åˆ†ãŒæ¤œå‡ºã•ã‚Œã¾ã—ãŸ\n"
+"ã©ã¡ã‚‰ã‚’採用ã—ã¾ã™ã‹ï¼Ÿ 手元(%s):(l)ocal 連æºå…ˆ(%s):(r)emote\n"
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã® ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "未知ã®å‰¯ãƒªãƒã‚¸ãƒˆãƒªç¨®åˆ¥ '%s'"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "アーカイブ中 (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "警告: エラー \"%s\" ãŒå‰¯ãƒªãƒã‚¸ãƒˆãƒª \"%s\" ã§ç™ºç”Ÿ\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒªã® %s を登録除外中\n"
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã« %s ã‹ã‚‰è¤‡è£½ä¸­\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã« %s ã‹ã‚‰å–ã‚Šè¾¼ã¿ä¸­\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã‹ã‚‰ %s ã¸å映中\n"
+
+#, python-format
+msgid "reverting subrepo %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã®å¤‰æ›´å–り消ã—中\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr "副リãƒã‚¸ãƒˆãƒª '%s' ã«ä½¿ç”¨ã™ã‚‹ 'svn' コマンドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+msgid "cannot retrieve svn tool version"
+msgstr "svn ツールã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒå–å¾—ã§ãã¾ã›ã‚“"
+
+msgid "cannot commit svn externals"
+msgstr "svn 外部リãƒã‚¸ãƒˆãƒªã« commit ã§ãã¾ã›ã‚“"
+
+msgid "cannot commit missing svn entries"
+msgstr "svn 管ç†å¯¾è±¡ã«ä¸åœ¨ãƒ•ã‚¡ã‚¤ãƒ«ãŒã‚る状態ã§ã¯ commit ã§ãã¾ã›ã‚“"
+
+msgid "failed to commit svn changes"
+msgstr "svn ã¸ã®å¤‰æ›´ã‚³ãƒŸãƒƒãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "変更ãŒå«ã¾ã‚Œã¦ã„ã‚‹ãŸã‚〠リãƒã‚¸ãƒˆãƒª %s ã¯å‰Šé™¤ã•ã‚Œã¾ã›ã‚“\n"
+
+msgid "cannot retrieve git version"
+msgstr "git ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ãŒå–å¾—ã§ãã¾ã›ã‚“"
+
+msgid "git subrepo requires at least 1.6.0 or later"
+msgstr "副リãƒã‚¸ãƒˆãƒªåˆ©ç”¨ã«ã¯ 1.6.0 以é™ã® git ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "リビジョン %s ã¯å‰¯ãƒªãƒã‚¸ãƒˆãƒª %s ã«ã¯å­˜åœ¨ã—ã¾ã›ã‚“\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã«ãŠã„ã¦ã€åˆ‡ã‚Šé›¢ã•ã‚ŒãŸ HEAD ãŒå–り出ã•ã‚Œã¾ã—ãŸã€‚\n"
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr "変更を実施ã™ã‚‹ãªã‚‰ã€ git ブランãƒã‚’å–り出ã—ã¦ãã ã•ã„。\n"
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr "副リãƒã‚¸ãƒˆãƒª %s ã¯ã€ 無関係㪠git ブランãƒã§æ›´æ–°ã•ã‚Œã¦ã„ã¾ã™\n"
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "ブランム%s を副リãƒã‚¸ãƒˆãƒª %s ã‹ã‚‰å映中\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s\n"
+msgstr ""
+"副リãƒã‚¸ãƒˆãƒª %s ã«ãƒ–ランãƒãŒå–り出ã•ã‚Œã¦ã„ã¾ã›ã‚“。\n"
+"リビジョン %s ã‚’å映ã§ãã¾ã›ã‚“。\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s %s行目: %s\n"
+
+msgid "cannot parse entry"
+msgstr "エントリを読ã¿è¾¼ã‚ã¾ã›ã‚“"
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "'%s' ã¨ã„ã†ãƒŽãƒ¼ãƒ‰ã¯ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆãŒä¸é©åˆ‡ã§ã™"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags ãŒç„¡åŠ¹ãªãŸã‚å†æ§‹ç¯‰ä¸­\n"
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+":addbreaks: 文字列。 最終行を除ãå„è¡Œã®è¡Œæœ«ã« XHTML ã®\n"
+" \"<br />\" タグを追加ã—ã¾ã™ã€‚"
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+":age: 日時情報。 与ãˆã‚‰ã‚ŒãŸæ—¥æ™‚ã¨ã€ ç¾åœ¨æ—¥æ™‚ã¨ã®å·®åˆ†ã‚’表ã™\n"
+" å¯èª­å½¢å¼ã®æ–‡å­—列を生æˆã—ã¾ã™ã€‚"
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+":basename: 文字列。 与ãˆã‚‰ã‚ŒãŸæ–‡å­—列をパスã¨ã¿ãªã—〠パス構æˆè¦ç´ ã®ã€\n"
+" 末尾è¦ç´ ã‚’å–り出ã—ã¾ã™ (末尾パス区切りã¯ç„¡è¦–ã•ã‚Œã¾ã™)。\n"
+" 例) \"foo/bar/baz\" 㯠\"baz\"〠\"foo/bar//\" 㯠\"bar\""
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+":date: 日時情報。 タイムゾーン込ã¿ã® Unix date コマンド形å¼ã«ã—ã¾ã™ã€‚\n"
+" 例) \"Mon Sep 04 15:13:13 2006 0700\""
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+":domain: 文字列。 メールアドレスã¨æ€ã—ã最åˆã®æ–‡å­—列部分ã‹ã‚‰\n"
+" ドメイン部分ã ã‘ã‚’å–り出ã—ã¾ã™ã€‚\n"
+" 例) ``User <user@example.com>`` 㯠``example.com``"
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+":email: 文字列。 メールアドレスã¨æ€ã—ã最åˆã®éƒ¨åˆ†ã‚’å–り出ã—ã¾ã™ã€‚\n"
+" 例) ``User <user@example.com>`` 㯠``user@example.com``"
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+":escape: 文字列。 XML/XHTML ã®ç‰¹æ®Šæ–‡å­—ã§ã‚ã‚‹ \"&\"〠\"<\" ãŠã‚ˆã³\n"
+" \">\" ã‚’ XML ã®ã‚¨ãƒ³ãƒ†ã‚£ãƒ†ã‚£å½¢å¼ã«å¤‰æ›ã—ã¾ã™ã€‚"
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ":fill68: 文字列。 68 æ¡ã«åŽã¾ã‚‹ã‚ˆã†ã«æ–‡å­—列を折り返ã—ã¾ã™ã€‚"
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ":fill76: 文字列。 76 æ¡ã«åŽã¾ã‚‹ã‚ˆã†ã«æ–‡å­—列を折り返ã—ã¾ã™ã€‚"
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ":firstline: 文字列。 最åˆã®è¡Œã®ã¿ã‚’å–り出ã—ã¾ã™ã€‚"
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+":hex: 文字列。 Mercurial ã® node 情報を 40 æ¡ 16 進文字列ã«å¤‰æ›ã—ã¾ã™ã€‚"
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+":hgdate: 日時情報。 Unix タイムスタンプã¨ã‚¿ã‚¤ãƒ ã‚¾ãƒ¼ãƒ³ã‚ªãƒ•ã‚»ãƒƒãƒˆã«ã‚ˆã‚‹\n"
+" 数値対形å¼ã§å¯èª­åŒ–ã—ã¾ã™ã€‚ 例) \"1157407993 25200\""
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+":isodate: 日時情報。 ISO 8601 å½¢å¼ã§å¯èª­åŒ–ã—ã¾ã™:\n"
+" 例) \"2009-08-18 13:00 +0200\""
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+":isodatesec: 日時情報。 秒情報付ãã® ISO 8601 å½¢å¼ã§å¯èª­åŒ–ã—ã¾ã™:\n"
+" 例) \"2009-08-18 13:00:13 +0200\"\n"
+" ※ 後述ã™ã‚‹ rfc3339date フィルタã®èª¬æ˜Žã‚‚å‚ç…§ã—ã¦ãã ã•ã„。"
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ":localdate: 日時情報。 ローカル日時ã§å¯èª­åŒ–ã—ã¾ã™ã€‚"
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ":nonempty: 文字列。 与ãˆã‚‰ã‚ŒãŸæ–‡å­—列ãŒç©ºã®å ´åˆ '(none)'ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ":obfuscate: 文字列。 å…¨ã¦ã®æ–‡å­—ã‚’ XML エンティティ形å¼ã«å¤‰æ›ã—ã¾ã™ã€‚"
+
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+" interpreting it as per RFC 5322."
+msgstr ""
+":person: 文字列。 メールアドレスを RFC 5322 å½¢å¼ã§è§£æžã—ã¦ã€\n"
+" åå‰éƒ¨åˆ†ã ã‘ã‚’å–り出ã—ã¾ã™ã€‚"
+
+msgid ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+msgstr ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+":rfc3339date: 日付情報。 RFC 3339 ã§å®šã‚られãŸæ—¥ä»˜å½¢å¼ã§å¯èª­åŒ–ã—ã¾ã™ã€‚\n"
+" 例) \"2009-08-18T13:00:13+02:00\"."
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+":rfc822date: 日時情報。 メールã®ãƒ˜ãƒƒãƒ€ã¨åŒå½¢å¼ã§å¯èª­åŒ–ã—ã¾ã™:\n"
+" 例) \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ":short: リビジョンãƒãƒƒã‚·ãƒ¥ 値。 12 æ¡ç¨‹åº¦ã®çŸ­ç¸®å½¢å¼ã«ã—ã¾ã™ã€‚"
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+":shortbisect: 文字列。 `文字列` を2分探索 (bisect) 状態ã¨ã¿ãªã—ã€\n"
+" 状態ã«è¦‹åˆã£ãŸ1文字 (G: good, B: bad, S: skipped, U: untested, I:\n"
+" ignored) ã‚’è¿”ã—ã¾ã™ã€‚ `文字列` ãŒï¼’分探索状態ã¨ã—ã¦ä¸é©åˆ‡ãªå ´åˆã€\n"
+" 空白文字を返ã—ã¾ã™ã€‚"
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ":shortdate: 日時情報。 \"2006-09-18\" å½¢å¼ã§å¯èª­åŒ–ã—ã¾ã™ã€‚"
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ":stringify: ä»»æ„ã®ãƒ‡ãƒ¼ã‚¿ã€‚ 値を文字列化ã—ã¦é€£çµã—ã¾ã™"
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ":strip: 文字列。 先頭ï¼æœ«å°¾ã®ç©ºç™½æ–‡å­—ã‚’å–り除ãã¾ã™ã€‚"
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+":stripdir: 文字列。 与ãˆã‚‰ã‚ŒãŸæ–‡å­—列をパスã¨ã¿ãªã—〠ディレクトリ\n"
+" 階層ãŒã‚ã‚Œã°ãれをå–り除ãã¾ã™ã€‚\n"
+" 例) \"foo\" ãŠã‚ˆã³ \"foo/bar\" 㯠\"foo\""
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ":tabindent: 文字列。 最åˆã®è¡Œä»¥å¤–をタブ文字ã§å­—下ã’ã—ã¾ã™ã€‚"
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+":urlescape: 文字列。 å…¨ã¦ã®ã€Œç‰¹æ®Šã€æ–‡å­—を変æ›ã—ã¾ã™ã€‚\n"
+" 例ãˆã° \"foo bar\" 㯠\"foo%20bar\" ã¨ãªã‚Šã¾ã™ã€‚"
+
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+" address."
+msgstr ""
+":user: 文字列。 ユーザåãªã„ã—メールアドレスã‹ã‚‰ã€\n"
+" ユーザåã®çŸ­ç¸®å½¢å¼éƒ¨åˆ†ã‚’å–り出ã—ã¾ã™ã€‚"
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ":emailuser: 文字列。 メールアドレスã®ãƒ¦ãƒ¼ã‚¶å部分をå–り出ã—ã¾ã™ã€‚"
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ":author: 文字列。 リビジョンã®ä½œè€…å(記録情報ãã®ã¾ã¾)。"
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ":bisect: 文字列。 当該リビジョンã®ï¼’分探索状態。"
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ":branch: 文字列。 リビジョンã®å±žã™ã‚‹ãƒ–ランãƒå。"
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+":branches: 文字列列挙。 リビジョンã®å±žã™ã‚‹ãƒ–ランãƒå。\n"
+" 所属ブランãƒãŒ default ã®å ´åˆã¯ç©ºã€‚"
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ":tags: 文字列列挙。 当該リビジョンã«ä»˜ä¸Žã•ã‚ŒãŸãƒ–ックマークã®ä¸€è¦§ã€‚"
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ":children: 文字列列挙。 リビジョンã®å­ä¾›ã€‚"
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ":date: 日時情報。 リビジョンãŒè¨˜éŒ²ã•ã‚ŒãŸæ—¥æ™‚。"
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ":desc: 文字列。 リビジョンã®ã‚³ãƒŸãƒƒãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€‚"
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+":diffstat: 文字列。 以下ã®å½¢å¼ã§ã®å¤‰æ›´æ¦‚è¦ã€‚\n"
+" \"変更対象ファイル: +追加行数/-削除行数\""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ":file_adds: 文字列列挙。 当該リビジョンã§ã®è¿½åŠ ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã€‚"
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ":file_copies: 文字列列挙。 当該リビジョンã§ã®è¤‡è£½å…ƒãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã€‚"
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+":file_copies_switch: 文字列列挙。 \"file_copies\" ã¨åŒç¾©ã ãŒã€\n"
+" --copied 指定ã®ã‚る時ã®ã¿è¡¨ç¤ºã€‚"
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ":file_dels: 文字列列挙。 当該リビジョンã§ã®ç™»éŒ²é™¤å¤–ファイル一覧。"
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ":file_mods: 文字列列挙。 当該リビジョンã§ã®å¤‰æ›´ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã€‚"
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+":files: 文字列列挙。 当該リビジョンã§ã®ã€ 変更ï¼è¿½åŠ ç™»éŒ²ãªã„ã—\n"
+" 登録除外ファイルã®ä¸€è¦§ã€‚"
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+":latesttag: 文字列。 当該リビジョンã®ç¥–å…ˆã«å¯¾ã—ã¦æœ€ã‚‚最近ã«ä»˜ä¸Žã•ã‚ŒãŸã‚¿ã‚°"
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ":latesttagdistance: 整数。 最新タグã¸ã®æœ€é•·ãƒ‘ス"
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ":node: 文字列。 リビジョン識別用㮠40 æ¡ 16 進数ãƒãƒƒã‚·ãƒ¥å€¤ã€‚"
+
+msgid ":phase: String. The changeset phase name."
+msgstr ":phase: 文字列。 当該リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºå。"
+
+msgid ":phaseidx: Integer. The changeset phase index."
+msgstr ":phaseidx: 数値。 当該リビジョンã®ãƒ•ã‚§ãƒ¼ã‚ºå€¤ã€‚"
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ":rev: 整数。 å„リãƒã‚¸ãƒˆãƒªå›ºæœ‰ã®ãƒªãƒ“ジョン番å·ã€‚"
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ":tags: 文字列列挙。 当該リビジョンã«ä»˜ä¸Žã•ã‚ŒãŸã‚¿ã‚°ã®ä¸€è¦§ã€‚"
+
+msgid ""
+":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
+" format. If the changeset has only one \"natural\" parent (the "
+"predecessor\n"
+" revision) nothing is shown."
+msgstr ""
+":parents: 文字列列挙。 当該リビジョンã®è¦ªãƒªãƒ“ジョン㮠\"rev:node\" å½¢å¼ã€‚\n"
+" 親ãŒå˜ä¸€ã§ã€ 且ã¤ãƒªãƒ“ジョン番å·ãŒï¼‘ã¤å‰ã®å ´åˆã¯ã€ 何も表示ã•ã‚Œã¾ã›ã‚“。"
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "ä¸æ˜Žãªå‡¦ç† '%s' ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "expected a symbol"
+msgstr "シンボル指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "ä¸æ˜Žãªé–¢æ•° '%s' ãŒæŒ‡å®šã•ã‚Œã¾ã—ãŸ"
+
+msgid "expected template specifier"
+msgstr "テンプレート指定ãŒå¿…è¦ã§ã™"
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "フィルタ %s ã¯å¼•æ•°ãŒ1ã¤å¿…è¦ã§ã™"
+
+msgid "unmatched quotes"
+msgstr "引用符ã®å¯¾å¿œé–¢ä¿‚ãŒä¸æ­£ã§ã™"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "スタイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“: %s"
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" ã¯ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã¨ã—ã¦èªè­˜ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "テンプレートファイル %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr "æ—¢ã«å®Œäº†/中断ã•ã‚Œã¦ã„ã‚‹ãŸã‚トランザクションを利用ã§ãã¾ã›ã‚“"
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "%s ã®åˆ‡ã‚Šè©°ã‚ã«å¤±æ•—\n"
+
+msgid "transaction abort!\n"
+msgstr "トランザクションを中断ã—ã¾ã™!\n"
+
+msgid "rollback completed\n"
+msgstr "ロールãƒãƒƒã‚¯ã‚’完了ã—ã¾ã—ãŸ\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "ロールãƒãƒƒã‚¯ã«å¤±æ•—ã—ã¾ã—㟠- 'hg recover' ã—ã¦ãã ã•ã„\n"
+
+msgid "already have changeset "
+msgstr "æ—¢ã«ã‚るリビジョンã§ã™ "
+
+#, python-format
+msgid "not trusting file %s from untrusted user %s, group %s\n"
+msgstr "ä¿¡é ¼ã§ããªã„ファイル %s (所有者 %s, グループ %s)\n"
+
+#, python-format
+msgid "ignored: %s\n"
+msgstr "無視ã—ã¾ã—ãŸ: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr "(パス定義 %s=%s(%s ç”±æ¥) ã«ãŠã„ã¦ã€ éžæŽ¨å¥¨ãª '%%' ãŒä½¿ç”¨)\n"
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s ã®å€¤ ('%s') ã¯çœŸå½å€¤ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s ã®å€¤ ('%s') ã¯æ•´æ•°å€¤ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+msgid "enter a commit username:"
+msgstr "コミットã™ã‚‹ãƒ¦ãƒ¼ã‚¶åを入力ã—ã¦ãã ã•ã„:"
+
+#, python-format
+msgid "no username found, using '%s' instead\n"
+msgstr "ユーザåãŒä¸æ˜Žã®ãŸã‚〠'%s' を使用\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "ユーザåãŒæœªæŒ‡å®šã§ã™(\"hg help config\" å‚ç…§)"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "ユーザå %s ã¯æ”¹è¡Œã‚’å«ã‚“ã§ã„ã¾ã™\n"
+
+msgid "response expected"
+msgstr "レスãƒãƒ³ã‚¹ãŒã‚ã‚Šã¾ã›ã‚“"
+
+msgid "unrecognized response\n"
+msgstr "èªè­˜ã§ããªã„レスãƒãƒ³ã‚¹\n"
+
+msgid "password: "
+msgstr "パスワード: "
+
+msgid "http authorization required"
+msgstr "HTTP èªè¨¼ã«å¤±æ•—"
+
+msgid "http authorization required\n"
+msgstr "HTTP èªè¨¼ã‚’è¦æ±‚ã—ã¾ã—ãŸ\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "èªè¨¼é ˜åŸŸ: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "ユーザ: %s\n"
+
+msgid "user:"
+msgstr "ユーザ:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "HTTP èªè¨¼: ユーザå %s, パスワード %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "コマンド '%s' 失敗: %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr "ファイルåã«ã€Windows ã§äºˆç´„ã•ã‚Œã¦ã„ã‚‹ '%s' ãŒå«ã¾ã‚Œã¾ã™"
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr "ファイルåã«ã€Windows 上ã§ä¸æ­£ãª %r ãŒå«ã¾ã‚Œã¾ã™"
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr "ファイルåã®æœ«å°¾ãŒã€ Windows 上ã§ä¸æ­£ãª '%s' ã§ã™"
+
+msgid "check your clock"
+msgstr "システムã®æ™‚刻設定を確èªã—ã¦ãã ã•ã„"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "è² ã®ã‚¿ã‚¤ãƒ ã‚¹ã‚¿ãƒ³ãƒ—: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "ä¸æ­£ãªæ—¥ä»˜: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "日付ãŒ32ビットを超ãˆã¦ã„ã¾ã™: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "è² ã®æ—¥ä»˜æƒ…å ±: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "ã‚ã‚Šå¾—ãªã„タイムゾーン: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "空白文字ã ã‘ã§æ§‹æˆã•ã‚ŒãŸæ—¥æ™‚指定ã¯ä¸æ­£ã§ã™"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr "ä¸æ­£ãªæ—¥ä»˜ã®æŒ‡å®šã§ã™ã€‚ '<DATE' å½¢å¼ã§è¨˜è¿°ã—ã¦ãã ã•ã„。"
+
+msgid "invalid day spec, use '>DATE'"
+msgstr "ä¸æ­£ãªæ—¥ä»˜ã®æŒ‡å®šã§ã™ã€‚ '>DATE' å½¢å¼ã§è¨˜è¿°ã—ã¦ãã ã•ã„。"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "ä¸æ­£ãªæ—¥ä»˜ã®æŒ‡å®šã§ã™: %s"
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr "%s ã¯æ­£ã®å€¤ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“ ('hg help dates' å‚ç…§)"
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f ãƒã‚¤ãƒˆ"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "サービス '%s' 用ã®ãƒãƒ¼ãƒˆç•ªå·ãŒä¸æ˜Ž"
+
+msgid "file:// URLs can only refer to localhost"
+msgstr "file:// URL ãŒå‚ç…§ã§ãã‚‹ã®ã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ›ã‚¹ãƒˆã®ã¿ã§ã™"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "ローカルリãƒã‚¸ãƒˆãƒªä»¥å¤–ã¯æ¤œè¨¼ã§ãã¾ã›ã‚“"
+
+msgid "interrupted"
+msgstr "中断ã•ã‚Œã¾ã—ãŸ"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "%s ã¯ã€ 空ã‹è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "データ長: %d ãƒã‚¤ãƒˆ"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "インデックスã®æ‹¡å¼µãƒ‡ãƒ¼ã‚¿: %d ãƒã‚¤ãƒˆ"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "警告: `%s' 㯠revlog å½¢å¼ 1 ã§ã™"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "警告: `%s' 㯠revlog å½¢å¼ 0 ã§ã™"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "リビジョン %d ã¯æœªçŸ¥ã®ãƒªãƒ“ジョン %d ã‚’å‚ç…§ã—ã¦ã„ã¾ã™"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "リビジョン %d ã¯æƒ³å®šå¤–ã®ãƒªãƒ“ジョン %d ã‚’å‚ç…§ã—ã¦ã„ã¾ã™"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (想定対象 %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "未知ã®ç¬¬1親 %s ã‚’æŒã¤ %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "未知ã®ç¬¬2親 %s ã‚’æŒã¤ %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "%s ã®è¦ªã‚’確èªä¸­"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "%d ã¨é‡è¤‡ã™ã‚‹ãƒªãƒ“ジョン %d ãŒã‚ã‚Šã¾ã™"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "中断トランザクションを検出 - 'hg recover' を実施ã—ã¦ãã ã•ã„\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "リãƒã‚¸ãƒˆãƒªã¯ revlog å½¢å¼ %d ã§ã™\n"
+
+msgid "checking changesets\n"
+msgstr "リビジョンã®ç¢ºèªä¸­\n"
+
+msgid "checking"
+msgstr "確èªä¸­"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "リビジョン %s ã®å±•é–‹ä¸­"
+
+msgid "checking manifests\n"
+msgstr "管ç†ãƒ•ã‚¡ã‚¤ãƒ«ä¸€è¦§ã®ç¢ºèªä¸­\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "リビジョン %s ã¯æœªçŸ¥ã®ãƒªãƒ“ジョンã§ã™"
+
+msgid "file without name in manifest"
+msgstr "åå‰ã‚’æŒãŸãªã„ファイルãŒã‚ã‚Šã¾ã™"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "管ç†å¯¾è±¡ä¸€è¦§ã®å·®åˆ† %s ã®èª­ã¿è¾¼ã¿ä¸­"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "リビジョンã¨ãƒžãƒ‹ãƒ•ã‚§ã‚¹ãƒˆã«ã‚ˆã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®ã‚¯ãƒ­ã‚¹ãƒã‚§ãƒƒã‚¯ä¸­\n"
+
+msgid "crosschecking"
+msgstr "クロスãƒã‚§ãƒƒã‚¯ä¸­"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "未知ã®ãƒžãƒ‹ãƒ•ã‚§ã‚¹ãƒˆ %s ãŒå‚ç…§ã•ã‚Œã¦ã„ã¾ã™"
+
+msgid "in changeset but not in manifest"
+msgstr "マニフェストã‹ã‚‰å‚ç…§ã•ã‚Œã¦ã„ãªã„ファイル"
+
+msgid "in manifest but not in changeset"
+msgstr "リビジョンã‹ã‚‰å‚ç…§ã•ã‚Œã¦ã„ãªã„ファイル"
+
+msgid "checking files\n"
+msgstr "ファイルã®ç¢ºèªä¸­\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "ファイルå '%s' ã®ãƒ‡ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "ä¸æ­£ãª revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "revlog ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s ã¯ç®¡ç†å¯¾è±¡ã§ã¯ã‚ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "展開後サイズ %s ã¯æƒ³å®šå¤–ã§ã™(期待値:%s)"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "%s ã®å±•é–‹ä¸­"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "警告: '%s' ã®è¤‡è£½å…ƒã¯ã€ %s ã®è¦ªãƒªãƒ“ジョン時点ã§å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "複製元 revlog %s:%s ã¯ã€ 空ã‹è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr "警告: %s@%s: 複製元リビジョン㌠nullid %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "%s ã®æ”¹åを確èªä¸­"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "管ç†å¯¾è±¡ä¸€è¦§ä¸­ã® %s ã¯å­˜åœ¨ã—ã¾ã›ã‚“"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "警告: revlog '%s' ã¯ã©ã“ã‹ã‚‰ã‚‚å‚ç…§ã•ã‚Œã¦ã„ã¾ã›ã‚“"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d 個ã®ãƒ•ã‚¡ã‚¤ãƒ«ã€ %d 件ã®å·®åˆ†æƒ…報〠åˆè¨ˆ %d 件ã®ãƒªãƒ“ジョン\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "警告㌠%d 件ã‚ã‚Šã¾ã™!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "ä¸æ•´åˆãŒ %d 件ã‚ã‚Šã¾ã™!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(最åˆã®ä¸æ•´åˆã¯ %d ã®æ¨¡æ§˜)\n"
+
+msgid "look up remote revision"
+msgstr "連æºå…ˆã§ã®ãƒªãƒ“ジョンã®æ¤œç´¢"
+
+msgid "push failed (unexpected response):"
+msgstr "履歴å映ã«å¤±æ•— (未知ã®å¿œç­”):"
+
+msgid "look up remote changes"
+msgstr "連æºå…ˆã§ã®å¤‰æ›´ã®æ¤œç´¢"
+
+msgid "push failed:"
+msgstr "履歴å映ã«å¤±æ•—:"
diff --git a/i18n/polib.LICENSE b/i18n/polib.LICENSE
new file mode 100644
index 0000000..300ade8
--- /dev/null
+++ b/i18n/polib.LICENSE
@@ -0,0 +1,19 @@
+copyright (c) 2006-2010 David JEAN LOUIS
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/i18n/polib.py b/i18n/polib.py
new file mode 100644
index 0000000..c09aebc
--- /dev/null
+++ b/i18n/polib.py
@@ -0,0 +1,1639 @@
+# -*- coding: utf-8 -*-
+# no-check-code
+#
+# License: MIT (see LICENSE file provided)
+# vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4:
+
+"""
+**polib** allows you to manipulate, create, modify gettext files (pot, po and
+mo files). You can load existing files, iterate through it's entries, add,
+modify entries, comments or metadata, etc. or create new po files from scratch.
+
+**polib** provides a simple and pythonic API via the :func:`~polib.pofile` and
+:func:`~polib.mofile` convenience functions.
+"""
+
+__author__ = 'David Jean Louis <izimobil@gmail.com>'
+__version__ = '0.6.4'
+__all__ = ['pofile', 'POFile', 'POEntry', 'mofile', 'MOFile', 'MOEntry',
+ 'detect_encoding', 'escape', 'unescape', 'detect_encoding',]
+
+import array
+import codecs
+import os
+import re
+import struct
+import sys
+import textwrap
+import types
+
+
+# the default encoding to use when encoding cannot be detected
+default_encoding = 'utf-8'
+
+# _pofile_or_mofile {{{
+
+def _pofile_or_mofile(f, type, **kwargs):
+ """
+ Internal function used by :func:`polib.pofile` and :func:`polib.mofile` to
+ honor the DRY concept.
+ """
+ # get the file encoding
+ enc = kwargs.get('encoding')
+ if enc is None:
+ enc = detect_encoding(f, type == 'mofile')
+
+ # parse the file
+ kls = type == 'pofile' and _POFileParser or _MOFileParser
+ parser = kls(
+ f,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+ instance = parser.parse()
+ instance.wrapwidth = kwargs.get('wrapwidth', 78)
+ return instance
+
+# }}}
+# function pofile() {{{
+
+def pofile(pofile, **kwargs):
+ """
+ Convenience function that parses the po or pot file ``pofile`` and returns
+ a :class:`~polib.POFile` instance.
+
+ Arguments:
+
+ ``pofile``
+ string, full or relative path to the po/pot file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ return _pofile_or_mofile(pofile, 'pofile', **kwargs)
+
+# }}}
+# function mofile() {{{
+
+def mofile(mofile, **kwargs):
+ """
+ Convenience function that parses the mo file ``mofile`` and returns a
+ :class:`~polib.MOFile` instance.
+
+ Arguments:
+
+ ``mofile``
+ string, full or relative path to the mo file or its content (data).
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was passed
+ to xgettext to generate the po file that was used to format the mo file
+ (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use (e.g. "utf-8") (default: ``None``, the
+ encoding will be auto-detected).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ return _pofile_or_mofile(mofile, 'mofile', **kwargs)
+
+# }}}
+# function detect_encoding() {{{
+
+def detect_encoding(file, binary_mode=False):
+ """
+ Try to detect the encoding used by the ``file``. The ``file`` argument can
+ be a PO or MO file path or a string containing the contents of the file.
+ If the encoding cannot be detected, the function will return the value of
+ ``default_encoding``.
+
+ Arguments:
+
+ ``file``
+ string, full or relative path to the po/mo file or its content.
+
+ ``binary_mode``
+ boolean, set this to True if ``file`` is a mo file.
+ """
+ rx = re.compile(r'"?Content-Type:.+? charset=([\w_\-:\.]+)')
+
+ def charset_exists(charset):
+ """Check whether ``charset`` is valid or not."""
+ try:
+ codecs.lookup(charset)
+ except LookupError:
+ return False
+ return True
+
+ if not os.path.exists(file):
+ match = rx.search(file)
+ if match:
+ enc = match.group(1).strip()
+ if charset_exists(enc):
+ return enc
+ else:
+ if binary_mode:
+ mode = 'rb'
+ else:
+ mode = 'r'
+ f = open(file, mode)
+ for l in f.readlines():
+ match = rx.search(l)
+ if match:
+ f.close()
+ enc = match.group(1).strip()
+ if charset_exists(enc):
+ return enc
+ f.close()
+ return default_encoding
+
+# }}}
+# function escape() {{{
+
+def escape(st):
+ """
+ Escapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ return st.replace('\\', r'\\')\
+ .replace('\t', r'\t')\
+ .replace('\r', r'\r')\
+ .replace('\n', r'\n')\
+ .replace('\"', r'\"')
+
+# }}}
+# function unescape() {{{
+
+def unescape(st):
+ """
+ Unescapes the characters ``\\\\``, ``\\t``, ``\\n``, ``\\r`` and ``"`` in
+ the given string ``st`` and returns it.
+ """
+ def unescape_repl(m):
+ m = m.group(1)
+ if m == 'n':
+ return '\n'
+ if m == 't':
+ return '\t'
+ if m == 'r':
+ return '\r'
+ if m == '\\':
+ return '\\'
+ return m # handles escaped double quote
+ return re.sub(r'\\(\\|n|t|r|")', unescape_repl, st)
+
+# }}}
+# class _BaseFile {{{
+
+class _BaseFile(list):
+ """
+ Common base class for the :class:`~polib.POFile` and :class:`~polib.MOFile`
+ classes. This class should **not** be instanciated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``pofile``
+ string, the path to the po or mo file, or its content as a string.
+
+ ``wrapwidth``
+ integer, the wrap width, only useful when the ``-w`` option was
+ passed to xgettext (optional, default: ``78``).
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file, (optional, default: ``False``).
+ """
+ list.__init__(self)
+ # the opened file handle
+ pofile = kwargs.get('pofile', None)
+ if pofile and os.path.exists(pofile):
+ self.fpath = pofile
+ else:
+ self.fpath = kwargs.get('fpath')
+ # the width at which lines should be wrapped
+ self.wrapwidth = kwargs.get('wrapwidth', 78)
+ # the file encoding
+ self.encoding = kwargs.get('encoding', default_encoding)
+ # whether to check for duplicate entries or not
+ self.check_for_duplicates = kwargs.get('check_for_duplicates', False)
+ # header
+ self.header = ''
+ # both po and mo files have metadata
+ self.metadata = {}
+ self.metadata_is_fuzzy = 0
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the file.
+ """
+ ret = []
+ entries = [self.metadata_as_entry()] + \
+ [e for e in self if not e.obsolete]
+ for entry in entries:
+ ret.append(entry.__unicode__(self.wrapwidth))
+ for entry in self.obsolete_entries():
+ ret.append(entry.__unicode__(self.wrapwidth))
+ ret = '\n'.join(ret)
+
+ if type(ret) != types.UnicodeType:
+ return unicode(ret, self.encoding)
+ return ret
+
+ def __str__(self):
+ """
+ Returns the string representation of the file.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __contains__(self, entry):
+ """
+ Overriden ``list`` method to implement the membership test (in and
+ not in).
+ The method considers that an entry is in the file if it finds an entry
+ that has the same msgid (the test is **case sensitive**).
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ return self.find(entry.msgid, by='msgid') is not None
+
+ def __eq__(self, other):
+ return unicode(self) == unicode(other)
+
+ def append(self, entry):
+ """
+ Overriden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Argument:
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ if self.check_for_duplicates and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).append(entry)
+
+ def insert(self, index, entry):
+ """
+ Overriden method to check for duplicates entries, if a user tries to
+ add an entry that is already in the file, the method will raise a
+ ``ValueError`` exception.
+
+ Arguments:
+
+ ``index``
+ index at which the entry should be inserted.
+
+ ``entry``
+ an instance of :class:`~polib._BaseEntry`.
+ """
+ if self.check_for_duplicates and entry in self:
+ raise ValueError('Entry "%s" already exists' % entry.msgid)
+ super(_BaseFile, self).insert(index, entry)
+
+ def metadata_as_entry(self):
+ """
+ Returns the file metadata as a :class:`~polib.POFile` instance.
+ """
+ e = POEntry(msgid='')
+ mdata = self.ordered_metadata()
+ if mdata:
+ strs = []
+ for name, value in mdata:
+ # Strip whitespace off each line in a multi-line entry
+ strs.append('%s: %s' % (name, value))
+ e.msgstr = '\n'.join(strs) + '\n'
+ if self.metadata_is_fuzzy:
+ e.flags.append('fuzzy')
+ return e
+
+ def save(self, fpath=None, repr_method='__str__'):
+ """
+ Saves the po file to ``fpath``.
+ If it is an existing file and no ``fpath`` is provided, then the
+ existing file is rewritten with the modified data.
+
+ Keyword arguments:
+
+ ``fpath``
+ string, full or relative path to the file.
+
+ ``repr_method``
+ string, the method to use for output.
+ """
+ if self.fpath is None and fpath is None:
+ raise IOError('You must provide a file path to save() method')
+ contents = getattr(self, repr_method)()
+ if fpath is None:
+ fpath = self.fpath
+ if repr_method == 'to_binary':
+ fhandle = open(fpath, 'wb')
+ else:
+ fhandle = codecs.open(fpath, 'w', self.encoding)
+ if type(contents) != types.UnicodeType:
+ contents = contents.decode(self.encoding)
+ fhandle.write(contents)
+ fhandle.close()
+ # set the file path if not set
+ if self.fpath is None and fpath:
+ self.fpath = fpath
+
+ def find(self, st, by='msgid', include_obsolete_entries=False,
+ msgctxt=False):
+ """
+ Find the entry which msgid (or property identified by the ``by``
+ argument) matches the string ``st``.
+
+ Keyword arguments:
+
+ ``st``
+ string, the string to search for.
+
+ ``by``
+ string, the property to use for comparison (default: ``msgid``).
+
+ ``include_obsolete_entries``
+ boolean, whether to also search in entries that are obsolete.
+
+ ``msgctxt``
+ string, allows to specify a specific message context for the
+ search.
+ """
+ if include_obsolete_entries:
+ entries = self[:]
+ else:
+ entries = [e for e in self if not e.obsolete]
+ for e in entries:
+ if getattr(e, by) == st:
+ if msgctxt and e.msgctxt != msgctxt:
+ continue
+ return e
+ return None
+
+ def ordered_metadata(self):
+ """
+ Convenience method that returns an ordered version of the metadata
+ dictionnary. The return value is list of tuples (metadata name,
+ metadata_value).
+ """
+ # copy the dict first
+ metadata = self.metadata.copy()
+ data_order = [
+ 'Project-Id-Version',
+ 'Report-Msgid-Bugs-To',
+ 'POT-Creation-Date',
+ 'PO-Revision-Date',
+ 'Last-Translator',
+ 'Language-Team',
+ 'MIME-Version',
+ 'Content-Type',
+ 'Content-Transfer-Encoding'
+ ]
+ ordered_data = []
+ for data in data_order:
+ try:
+ value = metadata.pop(data)
+ ordered_data.append((data, value))
+ except KeyError:
+ pass
+ # the rest of the metadata will be alphabetically ordered since there
+ # are no specs for this AFAIK
+ keys = metadata.keys()
+ keys.sort()
+ for data in keys:
+ value = metadata[data]
+ ordered_data.append((data, value))
+ return ordered_data
+
+ def to_binary(self):
+ """
+ Return the binary representation of the file.
+ """
+ offsets = []
+ entries = self.translated_entries()
+ # the keys are sorted in the .mo file
+ def cmp(_self, other):
+ # msgfmt compares entries with msgctxt if it exists
+ self_msgid = _self.msgctxt and _self.msgctxt or _self.msgid
+ other_msgid = other.msgctxt and other.msgctxt or other.msgid
+ if self_msgid > other_msgid:
+ return 1
+ elif self_msgid < other_msgid:
+ return -1
+ else:
+ return 0
+ # add metadata entry
+ entries.sort(cmp)
+ mentry = self.metadata_as_entry()
+ #mentry.msgstr = mentry.msgstr.replace('\\n', '').lstrip()
+ entries = [mentry] + entries
+ entries_len = len(entries)
+ ids, strs = '', ''
+ for e in entries:
+ # For each string, we need size and file offset. Each string is
+ # NUL terminated; the NUL does not count into the size.
+ msgid = ''
+ if e.msgctxt:
+ # Contexts are stored by storing the concatenation of the
+ # context, a <EOT> byte, and the original string
+ msgid = self._encode(e.msgctxt + '\4')
+ if e.msgid_plural:
+ indexes = e.msgstr_plural.keys()
+ indexes.sort()
+ msgstr = []
+ for index in indexes:
+ msgstr.append(e.msgstr_plural[index])
+ msgid += self._encode(e.msgid + '\0' + e.msgid_plural)
+ msgstr = self._encode('\0'.join(msgstr))
+ else:
+ msgid += self._encode(e.msgid)
+ msgstr = self._encode(e.msgstr)
+ offsets.append((len(ids), len(msgid), len(strs), len(msgstr)))
+ ids += msgid + '\0'
+ strs += msgstr + '\0'
+
+ # The header is 7 32-bit unsigned integers.
+ keystart = 7*4+16*entries_len
+ # and the values start after the keys
+ valuestart = keystart + len(ids)
+ koffsets = []
+ voffsets = []
+ # The string table first has the list of keys, then the list of values.
+ # Each entry has first the size of the string, then the file offset.
+ for o1, l1, o2, l2 in offsets:
+ koffsets += [l1, o1+keystart]
+ voffsets += [l2, o2+valuestart]
+ offsets = koffsets + voffsets
+ # check endianness for magic number
+ if struct.pack('@h', 1) == struct.pack('<h', 1):
+ magic_number = MOFile.LITTLE_ENDIAN
+ else:
+ magic_number = MOFile.BIG_ENDIAN
+
+ output = struct.pack(
+ "Iiiiiii",
+ magic_number, # Magic number
+ 0, # Version
+ entries_len, # # of entries
+ 7*4, # start of key index
+ 7*4+entries_len*8, # start of value index
+ 0, keystart # size and offset of hash table
+ # Important: we don't use hash tables
+ )
+ output += array.array("i", offsets).tostring()
+ output += ids
+ output += strs
+ return output
+
+ def _encode(self, mixed):
+ """
+ Encodes the given ``mixed`` argument with the file encoding if and
+ only if it's an unicode string and returns the encoded string.
+ """
+ if type(mixed) == types.UnicodeType:
+ return mixed.encode(self.encoding)
+ return mixed
+
+# }}}
+# class POFile {{{
+
+class POFile(_BaseFile):
+ """
+ Po (or Pot) file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by extension,
+ the python ``list`` type.
+ """
+
+ def __unicode__(self):
+ """
+ Returns the unicode representation of the po file.
+ """
+ ret, headers = '', self.header.split('\n')
+ for header in headers:
+ if header[:1] in [',', ':']:
+ ret += '#%s\n' % header
+ else:
+ ret += '# %s\n' % header
+
+ if type(ret) != types.UnicodeType:
+ ret = unicode(ret, self.encoding)
+
+ return ret + _BaseFile.__unicode__(self)
+
+ def save_as_mofile(self, fpath):
+ """
+ Saves the binary representation of the file to given ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the mo file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method that returns the percentage of translated
+ messages.
+ """
+ total = len([e for e in self if not e.obsolete])
+ if total == 0:
+ return 100
+ translated = len(self.translated_entries())
+ return int((100.00 / float(total)) * translated)
+
+ def translated_entries(self):
+ """
+ Convenience method that returns the list of translated entries.
+ """
+ return [e for e in self if e.translated()]
+
+ def untranslated_entries(self):
+ """
+ Convenience method that returns the list of untranslated entries.
+ """
+ return [e for e in self if not e.translated() and not e.obsolete \
+ and not 'fuzzy' in e.flags]
+
+ def fuzzy_entries(self):
+ """
+ Convenience method that returns the list of fuzzy entries.
+ """
+ return [e for e in self if 'fuzzy' in e.flags]
+
+ def obsolete_entries(self):
+ """
+ Convenience method that returns the list of obsolete entries.
+ """
+ return [e for e in self if e.obsolete]
+
+ def merge(self, refpot):
+ """
+ Convenience method that merges the current pofile with the pot file
+ provided. It behaves exactly as the gettext msgmerge utility:
+
+ * comments of this file will be preserved, but extracted comments and
+ occurrences will be discarded;
+ * any translations or comments in the file will be discarded, however,
+ dot comments and file positions will be preserved;
+ * the fuzzy flags are preserved.
+
+ Keyword argument:
+
+ ``refpot``
+ object POFile, the reference catalog.
+ """
+ for entry in refpot:
+ e = self.find(entry.msgid, include_obsolete_entries=True)
+ if e is None:
+ e = POEntry()
+ self.append(e)
+ e.merge(entry)
+ # ok, now we must "obsolete" entries that are not in the refpot anymore
+ for entry in self:
+ if refpot.find(entry.msgid) is None:
+ entry.obsolete = True
+
+# }}}
+# class MOFile {{{
+
+class MOFile(_BaseFile):
+ """
+ Mo file reader/writer.
+ This class inherits the :class:`~polib._BaseFile` class and, by
+ extension, the python ``list`` type.
+ """
+ BIG_ENDIAN = 0xde120495
+ LITTLE_ENDIAN = 0x950412de
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts all keywords arguments accepted by
+ :class:`~polib._BaseFile` class.
+ """
+ _BaseFile.__init__(self, *args, **kwargs)
+ self.magic_number = None
+ self.version = 0
+
+ def save_as_pofile(self, fpath):
+ """
+ Saves the mofile as a pofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath)
+
+ def save(self, fpath=None):
+ """
+ Saves the mofile to ``fpath``.
+
+ Keyword argument:
+
+ ``fpath``
+ string, full or relative path to the file.
+ """
+ _BaseFile.save(self, fpath, 'to_binary')
+
+ def percent_translated(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return 100
+
+ def translated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return self
+
+ def untranslated_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def fuzzy_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+ def obsolete_entries(self):
+ """
+ Convenience method to keep the same interface with POFile instances.
+ """
+ return []
+
+# }}}
+# class _BaseEntry {{{
+
+class _BaseEntry(object):
+ """
+ Base class for :class:`~polib.POEntry` and :class:`~polib.MOEntry` classes.
+ This class should **not** be instanciated directly.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``msgid``
+ string, the entry msgid.
+
+ ``msgstr``
+ string, the entry msgstr.
+
+ ``msgid_plural``
+ string, the entry msgid_plural.
+
+ ``msgstr_plural``
+ list, the entry msgstr_plural lines.
+
+ ``msgctxt``
+ string, the entry context (msgctxt).
+
+ ``obsolete``
+ bool, whether the entry is "obsolete" or not.
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+ """
+ self.msgid = kwargs.get('msgid', '')
+ self.msgstr = kwargs.get('msgstr', '')
+ self.msgid_plural = kwargs.get('msgid_plural', '')
+ self.msgstr_plural = kwargs.get('msgstr_plural', {})
+ self.msgctxt = kwargs.get('msgctxt', None)
+ self.obsolete = kwargs.get('obsolete', False)
+ self.encoding = kwargs.get('encoding', default_encoding)
+
+ def __unicode__(self, wrapwidth=78):
+ """
+ Returns the unicode representation of the entry.
+ """
+ if self.obsolete:
+ delflag = '#~ '
+ else:
+ delflag = ''
+ ret = []
+ # write the msgctxt if any
+ if self.msgctxt is not None:
+ ret += self._str_field("msgctxt", delflag, "", self.msgctxt, wrapwidth)
+ # write the msgid
+ ret += self._str_field("msgid", delflag, "", self.msgid, wrapwidth)
+ # write the msgid_plural if any
+ if self.msgid_plural:
+ ret += self._str_field("msgid_plural", delflag, "", self.msgid_plural, wrapwidth)
+ if self.msgstr_plural:
+ # write the msgstr_plural if any
+ msgstrs = self.msgstr_plural
+ keys = list(msgstrs)
+ keys.sort()
+ for index in keys:
+ msgstr = msgstrs[index]
+ plural_index = '[%s]' % index
+ ret += self._str_field("msgstr", delflag, plural_index, msgstr, wrapwidth)
+ else:
+ # otherwise write the msgstr
+ ret += self._str_field("msgstr", delflag, "", self.msgstr, wrapwidth)
+ ret.append('')
+ ret = '\n'.join(ret)
+
+ if type(ret) != types.UnicodeType:
+ return unicode(ret, self.encoding)
+ return ret
+
+ def __str__(self):
+ """
+ Returns the string representation of the entry.
+ """
+ return unicode(self).encode(self.encoding)
+
+ def __eq__(self, other):
+ return unicode(self) == unicode(other)
+
+ def _str_field(self, fieldname, delflag, plural_index, field, wrapwidth=78):
+ lines = field.splitlines(True)
+ if len(lines) > 1:
+ lines = [''] + lines # start with initial empty line
+ else:
+ escaped_field = escape(field)
+ specialchars_count = 0
+ for c in ['\\', '\n', '\r', '\t', '"']:
+ specialchars_count += field.count(c)
+ # comparison must take into account fieldname length + one space
+ # + 2 quotes (eg. msgid "<string>")
+ flength = len(fieldname) + 3
+ if plural_index:
+ flength += len(plural_index)
+ real_wrapwidth = wrapwidth - flength + specialchars_count
+ if wrapwidth > 0 and len(field) > real_wrapwidth:
+ # Wrap the line but take field name into account
+ lines = [''] + [unescape(item) for item in wrap(
+ escaped_field,
+ wrapwidth - 2, # 2 for quotes ""
+ drop_whitespace=False,
+ break_long_words=False
+ )]
+ else:
+ lines = [field]
+ if fieldname.startswith('previous_'):
+ # quick and dirty trick to get the real field name
+ fieldname = fieldname[9:]
+
+ ret = ['%s%s%s "%s"' % (delflag, fieldname, plural_index,
+ escape(lines.pop(0)))]
+ for mstr in lines:
+ ret.append('%s"%s"' % (delflag, escape(mstr)))
+ return ret
+
+# }}}
+# class POEntry {{{
+
+class POEntry(_BaseEntry):
+ """
+ Represents a po file entry.
+ """
+
+ def __init__(self, *args, **kwargs):
+ """
+ Constructor, accepts the following keyword arguments:
+
+ ``comment``
+ string, the entry comment.
+
+ ``tcomment``
+ string, the entry translator comment.
+
+ ``occurrences``
+ list, the entry occurrences.
+
+ ``flags``
+ list, the entry flags.
+
+ ``previous_msgctxt``
+ string, the entry previous context.
+
+ ``previous_msgid``
+ string, the entry previous msgid.
+
+ ``previous_msgid_plural``
+ string, the entry previous msgid_plural.
+ """
+ _BaseEntry.__init__(self, *args, **kwargs)
+ self.comment = kwargs.get('comment', '')
+ self.tcomment = kwargs.get('tcomment', '')
+ self.occurrences = kwargs.get('occurrences', [])
+ self.flags = kwargs.get('flags', [])
+ self.previous_msgctxt = kwargs.get('previous_msgctxt', None)
+ self.previous_msgid = kwargs.get('previous_msgid', None)
+ self.previous_msgid_plural = kwargs.get('previous_msgid_plural', None)
+
+ def __unicode__(self, wrapwidth=78):
+ """
+ Returns the unicode representation of the entry.
+ """
+ if self.obsolete:
+ return _BaseEntry.__unicode__(self, wrapwidth)
+
+ ret = []
+ # comments first, if any (with text wrapping as xgettext does)
+ comments = [('comment', '#. '), ('tcomment', '# ')]
+ for c in comments:
+ val = getattr(self, c[0])
+ if val:
+ for comment in val.split('\n'):
+ if wrapwidth > 0 and len(comment) + len(c[1]) > wrapwidth:
+ ret += wrap(
+ comment,
+ wrapwidth,
+ initial_indent=c[1],
+ subsequent_indent=c[1],
+ break_long_words=False
+ )
+ else:
+ ret.append('%s%s' % (c[1], comment))
+
+ # occurrences (with text wrapping as xgettext does)
+ if self.occurrences:
+ filelist = []
+ for fpath, lineno in self.occurrences:
+ if lineno:
+ filelist.append('%s:%s' % (fpath, lineno))
+ else:
+ filelist.append(fpath)
+ filestr = ' '.join(filelist)
+ if wrapwidth > 0 and len(filestr) + 3 > wrapwidth:
+ # textwrap split words that contain hyphen, this is not
+ # what we want for filenames, so the dirty hack is to
+ # temporally replace hyphens with a char that a file cannot
+ # contain, like "*"
+ ret += [l.replace('*', '-') for l in wrap(
+ filestr.replace('-', '*'),
+ wrapwidth,
+ initial_indent='#: ',
+ subsequent_indent='#: ',
+ break_long_words=False
+ )]
+ else:
+ ret.append('#: ' + filestr)
+
+ # flags (TODO: wrapping ?)
+ if self.flags:
+ ret.append('#, %s' % ', '.join(self.flags))
+
+ # previous context and previous msgid/msgid_plural
+ fields = ['previous_msgctxt', 'previous_msgid', 'previous_msgid_plural']
+ for f in fields:
+ val = getattr(self, f)
+ if val:
+ ret += self._str_field(f, "#| ", "", val, wrapwidth)
+
+ ret.append(_BaseEntry.__unicode__(self, wrapwidth))
+ ret = '\n'.join(ret)
+
+ if type(ret) != types.UnicodeType:
+ return unicode(ret, self.encoding)
+ return ret
+
+ def __cmp__(self, other):
+ """
+ Called by comparison operations if rich comparison is not defined.
+ """
+ def compare_occurrences(a, b):
+ """
+ Compare an entry occurrence with another one.
+ """
+ if a[0] != b[0]:
+ return a[0] < b[0]
+ if a[1] != b[1]:
+ return a[1] < b[1]
+ return 0
+
+ # First: Obsolete test
+ if self.obsolete != other.obsolete:
+ if self.obsolete:
+ return -1
+ else:
+ return 1
+ # Work on a copy to protect original
+ occ1 = self.occurrences[:]
+ occ2 = other.occurrences[:]
+ # Sorting using compare method
+ occ1.sort(compare_occurrences)
+ occ2.sort(compare_occurrences)
+ # Comparing sorted occurrences
+ pos = 0
+ for entry1 in occ1:
+ try:
+ entry2 = occ2[pos]
+ except IndexError:
+ return 1
+ pos = pos + 1
+ if entry1[0] != entry2[0]:
+ if entry1[0] > entry2[0]:
+ return 1
+ else:
+ return -1
+ if entry1[1] != entry2[1]:
+ if entry1[1] > entry2[1]:
+ return 1
+ else:
+ return -1
+ # Finally: Compare message ID
+ if self.msgid > other.msgid: return 1
+ else: return -1
+
+ def translated(self):
+ """
+ Returns ``True`` if the entry has been translated or ``False``
+ otherwise.
+ """
+ if self.obsolete or 'fuzzy' in self.flags:
+ return False
+ if self.msgstr != '':
+ return True
+ if self.msgstr_plural:
+ for pos in self.msgstr_plural:
+ if self.msgstr_plural[pos] == '':
+ return False
+ return True
+ return False
+
+ def merge(self, other):
+ """
+ Merge the current entry with the given pot entry.
+ """
+ self.msgid = other.msgid
+ self.msgctxt = other.msgctxt
+ self.occurrences = other.occurrences
+ self.comment = other.comment
+ fuzzy = 'fuzzy' in self.flags
+ self.flags = other.flags[:] # clone flags
+ if fuzzy:
+ self.flags.append('fuzzy')
+ self.msgid_plural = other.msgid_plural
+ self.obsolete = other.obsolete
+ self.previous_msgctxt = other.previous_msgctxt
+ self.previous_msgid = other.previous_msgid
+ self.previous_msgid_plural = other.previous_msgid_plural
+ if other.msgstr_plural:
+ for pos in other.msgstr_plural:
+ try:
+ # keep existing translation at pos if any
+ self.msgstr_plural[pos]
+ except KeyError:
+ self.msgstr_plural[pos] = ''
+
+# }}}
+# class MOEntry {{{
+
+class MOEntry(_BaseEntry):
+ """
+ Represents a mo file entry.
+ """
+ pass
+
+# }}}
+# class _POFileParser {{{
+
+class _POFileParser(object):
+ """
+ A finite state machine to parse efficiently and correctly po
+ file format.
+ """
+
+ def __init__(self, pofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``pofile``
+ string, path to the po file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ enc = kwargs.get('encoding', default_encoding)
+ if os.path.exists(pofile):
+ try:
+ self.fhandle = codecs.open(pofile, 'rU', enc)
+ except LookupError:
+ enc = default_encoding
+ self.fhandle = codecs.open(pofile, 'rU', enc)
+ else:
+ self.fhandle = pofile.splitlines()
+
+ self.instance = POFile(
+ pofile=pofile,
+ encoding=enc,
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+ self.transitions = {}
+ self.current_entry = POEntry()
+ self.current_state = 'ST'
+ self.current_token = None
+ # two memo flags used in handlers
+ self.msgstr_index = 0
+ self.entry_obsolete = 0
+ # Configure the state machine, by adding transitions.
+ # Signification of symbols:
+ # * ST: Beginning of the file (start)
+ # * HE: Header
+ # * TC: a translation comment
+ # * GC: a generated comment
+ # * OC: a file/line occurence
+ # * FL: a flags line
+ # * CT: a message context
+ # * PC: a previous msgctxt
+ # * PM: a previous msgid
+ # * PP: a previous msgid_plural
+ # * MI: a msgid
+ # * MP: a msgid plural
+ # * MS: a msgstr
+ # * MX: a msgstr plural
+ # * MC: a msgid or msgstr continuation line
+ all = ['ST', 'HE', 'GC', 'OC', 'FL', 'CT', 'PC', 'PM', 'PP', 'TC',
+ 'MS', 'MP', 'MX', 'MI']
+
+ self.add('TC', ['ST', 'HE'], 'HE')
+ self.add('TC', ['GC', 'OC', 'FL', 'TC', 'PC', 'PM', 'PP', 'MS',
+ 'MP', 'MX', 'MI'], 'TC')
+ self.add('GC', all, 'GC')
+ self.add('OC', all, 'OC')
+ self.add('FL', all, 'FL')
+ self.add('PC', all, 'PC')
+ self.add('PM', all, 'PM')
+ self.add('PP', all, 'PP')
+ self.add('CT', ['ST', 'HE', 'GC', 'OC', 'FL', 'TC', 'PC', 'PM',
+ 'PP', 'MS', 'MX'], 'CT')
+ self.add('MI', ['ST', 'HE', 'GC', 'OC', 'FL', 'CT', 'TC', 'PC',
+ 'PM', 'PP', 'MS', 'MX'], 'MI')
+ self.add('MP', ['TC', 'GC', 'PC', 'PM', 'PP', 'MI'], 'MP')
+ self.add('MS', ['MI', 'MP', 'TC'], 'MS')
+ self.add('MX', ['MI', 'MX', 'MP', 'TC'], 'MX')
+ self.add('MC', ['CT', 'MI', 'MP', 'MS', 'MX', 'PM', 'PP', 'PC'], 'MC')
+
+ def parse(self):
+ """
+ Run the state machine, parse the file line by line and call process()
+ with the current matched symbol.
+ """
+ i = 0
+
+ keywords = {
+ 'msgctxt': 'CT',
+ 'msgid': 'MI',
+ 'msgstr': 'MS',
+ 'msgid_plural': 'MP',
+ }
+ prev_keywords = {
+ 'msgid_plural': 'PP',
+ 'msgid': 'PM',
+ 'msgctxt': 'PC',
+ }
+
+ for line in self.fhandle:
+ i += 1
+ line = line.strip()
+ if line == '':
+ continue
+
+ tokens = line.split(None, 2)
+ nb_tokens = len(tokens)
+
+ if tokens[0] == '#~' and nb_tokens > 1:
+ line = line[3:].strip()
+ tokens = tokens[1:]
+ nb_tokens -= 1
+ self.entry_obsolete = 1
+ else:
+ self.entry_obsolete = 0
+
+ # Take care of keywords like
+ # msgid, msgid_plural, msgctxt & msgstr.
+ if tokens[0] in keywords and nb_tokens > 1:
+ line = line[len(tokens[0]):].lstrip()
+ self.current_token = line
+ self.process(keywords[tokens[0]], i)
+ continue
+
+ self.current_token = line
+
+ if tokens[0] == '#:' and nb_tokens > 1:
+ # we are on a occurrences line
+ self.process('OC', i)
+
+ elif line[:1] == '"':
+ # we are on a continuation line
+ self.process('MC', i)
+
+ elif line[:7] == 'msgstr[':
+ # we are on a msgstr plural
+ self.process('MX', i)
+
+ elif tokens[0] == '#,' and nb_tokens > 1:
+ # we are on a flags line
+ self.process('FL', i)
+
+ elif tokens[0] == '#':
+ if line == '#': line += ' '
+ # we are on a translator comment line
+ self.process('TC', i)
+
+ elif tokens[0] == '#.' and nb_tokens > 1:
+ # we are on a generated comment line
+ self.process('GC', i)
+
+ elif tokens[0] == '#|':
+ if nb_tokens < 2:
+ self.process('??', i)
+ continue
+
+ # Remove the marker and any whitespace right after that.
+ line = line[2:].lstrip()
+ self.current_token = line
+
+ if tokens[1].startswith('"'):
+ # Continuation of previous metadata.
+ self.process('MC', i)
+ continue
+
+ if nb_tokens == 2:
+ # Invalid continuation line.
+ self.process('??', i)
+
+ # we are on a "previous translation" comment line,
+ if tokens[1] not in prev_keywords:
+ # Unknown keyword in previous translation comment.
+ self.process('??', i)
+
+ # Remove the keyword and any whitespace
+ # between it and the starting quote.
+ line = line[len(tokens[1]):].lstrip()
+ self.current_token = line
+ self.process(prev_keywords[tokens[1]], i)
+
+ else:
+ self.process('??', i)
+
+ if self.current_entry:
+ # since entries are added when another entry is found, we must add
+ # the last entry here (only if there are lines)
+ self.instance.append(self.current_entry)
+ # before returning the instance, check if there's metadata and if
+ # so extract it in a dict
+ firstentry = self.instance[0]
+ if firstentry.msgid == '': # metadata found
+ # remove the entry
+ firstentry = self.instance.pop(0)
+ self.instance.metadata_is_fuzzy = firstentry.flags
+ key = None
+ for msg in firstentry.msgstr.splitlines():
+ try:
+ key, val = msg.split(':', 1)
+ self.instance.metadata[key] = val.strip()
+ except:
+ if key is not None:
+ self.instance.metadata[key] += '\n'+ msg.strip()
+ # close opened file
+ if isinstance(self.fhandle, file):
+ self.fhandle.close()
+ return self.instance
+
+ def add(self, symbol, states, next_state):
+ """
+ Add a transition to the state machine.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``states``
+ list, a list of states (two chars symbols).
+
+ ``next_state``
+ the next state the fsm will have after the action.
+ """
+ for state in states:
+ action = getattr(self, 'handle_%s' % next_state.lower())
+ self.transitions[(symbol, state)] = (action, next_state)
+
+ def process(self, symbol, linenum):
+ """
+ Process the transition corresponding to the current state and the
+ symbol provided.
+
+ Keywords arguments:
+
+ ``symbol``
+ string, the matched token (two chars symbol).
+
+ ``linenum``
+ integer, the current line number of the parsed file.
+ """
+ try:
+ (action, state) = self.transitions[(symbol, self.current_state)]
+ if action():
+ self.current_state = state
+ except Exception, exc:
+ raise IOError('Syntax error in po file (line %s)' % linenum)
+
+ # state handlers
+
+ def handle_he(self):
+ """Handle a header comment."""
+ if self.instance.header != '':
+ self.instance.header += '\n'
+ self.instance.header += self.current_token[2:]
+ return 1
+
+ def handle_tc(self):
+ """Handle a translator comment."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ if self.current_entry.tcomment != '':
+ self.current_entry.tcomment += '\n'
+ self.current_entry.tcomment += self.current_token[2:]
+ return True
+
+ def handle_gc(self):
+ """Handle a generated comment."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ if self.current_entry.comment != '':
+ self.current_entry.comment += '\n'
+ self.current_entry.comment += self.current_token[3:]
+ return True
+
+ def handle_oc(self):
+ """Handle a file:num occurence."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ occurrences = self.current_token[3:].split()
+ for occurrence in occurrences:
+ if occurrence != '':
+ try:
+ fil, line = occurrence.split(':')
+ if not line.isdigit():
+ fil = fil + line
+ line = ''
+ self.current_entry.occurrences.append((fil, line))
+ except:
+ self.current_entry.occurrences.append((occurrence, ''))
+ return True
+
+ def handle_fl(self):
+ """Handle a flags line."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.flags += self.current_token[3:].split(', ')
+ return True
+
+ def handle_pp(self):
+ """Handle a previous msgid_plural line."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.previous_msgid_plural = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pm(self):
+ """Handle a previous msgid line."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.previous_msgid = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_pc(self):
+ """Handle a previous msgctxt line."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.previous_msgctxt = \
+ unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ct(self):
+ """Handle a msgctxt."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.msgctxt = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mi(self):
+ """Handle a msgid."""
+ if self.current_state in ['MC', 'MS', 'MX']:
+ self.instance.append(self.current_entry)
+ self.current_entry = POEntry()
+ self.current_entry.obsolete = self.entry_obsolete
+ self.current_entry.msgid = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mp(self):
+ """Handle a msgid plural."""
+ self.current_entry.msgid_plural = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_ms(self):
+ """Handle a msgstr."""
+ self.current_entry.msgstr = unescape(self.current_token[1:-1])
+ return True
+
+ def handle_mx(self):
+ """Handle a msgstr plural."""
+ index, value = self.current_token[7], self.current_token[11:-1]
+ self.current_entry.msgstr_plural[index] = unescape(value)
+ self.msgstr_index = index
+ return True
+
+ def handle_mc(self):
+ """Handle a msgid or msgstr continuation line."""
+ token = unescape(self.current_token[1:-1])
+ if self.current_state == 'CT':
+ typ = 'msgctxt'
+ self.current_entry.msgctxt += token
+ elif self.current_state == 'MI':
+ typ = 'msgid'
+ self.current_entry.msgid += token
+ elif self.current_state == 'MP':
+ typ = 'msgid_plural'
+ self.current_entry.msgid_plural += token
+ elif self.current_state == 'MS':
+ typ = 'msgstr'
+ self.current_entry.msgstr += token
+ elif self.current_state == 'MX':
+ typ = 'msgstr[%s]' % self.msgstr_index
+ self.current_entry.msgstr_plural[self.msgstr_index] += token
+ elif self.current_state == 'PP':
+ typ = 'previous_msgid_plural'
+ token = token[3:]
+ self.current_entry.previous_msgid_plural += token
+ elif self.current_state == 'PM':
+ typ = 'previous_msgid'
+ token = token[3:]
+ self.current_entry.previous_msgid += token
+ elif self.current_state == 'PC':
+ typ = 'previous_msgctxt'
+ token = token[3:]
+ self.current_entry.previous_msgctxt += token
+ # don't change the current state
+ return False
+
+# }}}
+# class _MOFileParser {{{
+
+class _MOFileParser(object):
+ """
+ A class to parse binary mo files.
+ """
+
+ def __init__(self, mofile, *args, **kwargs):
+ """
+ Constructor.
+
+ Keyword arguments:
+
+ ``mofile``
+ string, path to the mo file or its content
+
+ ``encoding``
+ string, the encoding to use, defaults to ``default_encoding``
+ global variable (optional).
+
+ ``check_for_duplicates``
+ whether to check for duplicate entries when adding entries to the
+ file (optional, default: ``False``).
+ """
+ self.fhandle = open(mofile, 'rb')
+ self.instance = MOFile(
+ fpath=mofile,
+ encoding=kwargs.get('encoding', default_encoding),
+ check_for_duplicates=kwargs.get('check_for_duplicates', False)
+ )
+
+ def parse(self):
+ """
+ Build the instance with the file handle provided in the
+ constructor.
+ """
+ # parse magic number
+ magic_number = self._readbinary('<I', 4)
+ if magic_number == MOFile.LITTLE_ENDIAN:
+ ii = '<II'
+ elif magic_number == MOFile.BIG_ENDIAN:
+ ii = '>II'
+ else:
+ raise IOError('Invalid mo file, magic number is incorrect !')
+ self.instance.magic_number = magic_number
+ # parse the version number and the number of strings
+ self.instance.version, numofstrings = self._readbinary(ii, 8)
+ # original strings and translation strings hash table offset
+ msgids_hash_offset, msgstrs_hash_offset = self._readbinary(ii, 8)
+ # move to msgid hash table and read length and offset of msgids
+ self.fhandle.seek(msgids_hash_offset)
+ msgids_index = []
+ for i in range(numofstrings):
+ msgids_index.append(self._readbinary(ii, 8))
+ # move to msgstr hash table and read length and offset of msgstrs
+ self.fhandle.seek(msgstrs_hash_offset)
+ msgstrs_index = []
+ for i in range(numofstrings):
+ msgstrs_index.append(self._readbinary(ii, 8))
+ # build entries
+ for i in range(numofstrings):
+ self.fhandle.seek(msgids_index[i][1])
+ msgid = self.fhandle.read(msgids_index[i][0])
+ self.fhandle.seek(msgstrs_index[i][1])
+ msgstr = self.fhandle.read(msgstrs_index[i][0])
+ if i == 0: # metadata
+ raw_metadata, metadata = msgstr.split('\n'), {}
+ for line in raw_metadata:
+ tokens = line.split(':', 1)
+ if tokens[0] != '':
+ try:
+ metadata[tokens[0]] = tokens[1].strip()
+ except IndexError:
+ metadata[tokens[0]] = ''
+ self.instance.metadata = metadata
+ continue
+ # test if we have a plural entry
+ msgid_tokens = msgid.split('\0')
+ if len(msgid_tokens) > 1:
+ entry = self._build_entry(
+ msgid=msgid_tokens[0],
+ msgid_plural=msgid_tokens[1],
+ msgstr_plural=dict((k,v) for k,v in enumerate(msgstr.split('\0')))
+ )
+ else:
+ entry = self._build_entry(msgid=msgid, msgstr=msgstr)
+ self.instance.append(entry)
+ # close opened file
+ self.fhandle.close()
+ return self.instance
+
+ def _build_entry(self, msgid, msgstr=None, msgid_plural=None,
+ msgstr_plural=None):
+ msgctxt_msgid = msgid.split('\x04')
+ if len(msgctxt_msgid) > 1:
+ kwargs = {
+ 'msgctxt': msgctxt_msgid[0],
+ 'msgid' : msgctxt_msgid[1],
+ }
+ else:
+ kwargs = {'msgid': msgid}
+ if msgstr:
+ kwargs['msgstr'] = msgstr
+ if msgid_plural:
+ kwargs['msgid_plural'] = msgid_plural
+ if msgstr_plural:
+ kwargs['msgstr_plural'] = msgstr_plural
+ return MOEntry(**kwargs)
+
+ def _readbinary(self, fmt, numbytes):
+ """
+ Private method that unpack n bytes of data using format <fmt>.
+ It returns a tuple or a mixed value if the tuple length is 1.
+ """
+ bytes = self.fhandle.read(numbytes)
+ tup = struct.unpack(fmt, bytes)
+ if len(tup) == 1:
+ return tup[0]
+ return tup
+
+# }}}
+# class TextWrapper {{{
+
+class TextWrapper(textwrap.TextWrapper):
+ """
+ Subclass of textwrap.TextWrapper that backport the
+ drop_whitespace option.
+ """
+ def __init__(self, *args, **kwargs):
+ drop_whitespace = kwargs.pop('drop_whitespace', True)
+ textwrap.TextWrapper.__init__(self, *args, **kwargs)
+ self.drop_whitespace = drop_whitespace
+
+ def _wrap_chunks(self, chunks):
+ """_wrap_chunks(chunks : [string]) -> [string]
+
+ Wrap a sequence of text chunks and return a list of lines of
+ length 'self.width' or less. (If 'break_long_words' is false,
+ some lines may be longer than this.) Chunks correspond roughly
+ to words and the whitespace between them: each chunk is
+ indivisible (modulo 'break_long_words'), but a line break can
+ come between any two chunks. Chunks should not have internal
+ whitespace; ie. a chunk is either all whitespace or a "word".
+ Whitespace chunks will be removed from the beginning and end of
+ lines, but apart from that whitespace is preserved.
+ """
+ lines = []
+ if self.width <= 0:
+ raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+ # Arrange in reverse order so items can be efficiently popped
+ # from a stack of chucks.
+ chunks.reverse()
+
+ while chunks:
+
+ # Start the list of chunks that will make up the current line.
+ # cur_len is just the length of all the chunks in cur_line.
+ cur_line = []
+ cur_len = 0
+
+ # Figure out which static string will prefix this line.
+ if lines:
+ indent = self.subsequent_indent
+ else:
+ indent = self.initial_indent
+
+ # Maximum width for this line.
+ width = self.width - len(indent)
+
+ # First chunk on line is whitespace -- drop it, unless this
+ # is the very beginning of the text (ie. no lines started yet).
+ if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+ del chunks[-1]
+
+ while chunks:
+ l = len(chunks[-1])
+
+ # Can at least squeeze this chunk onto the current line.
+ if cur_len + l <= width:
+ cur_line.append(chunks.pop())
+ cur_len += l
+
+ # Nope, this line is full.
+ else:
+ break
+
+ # The current line is full, and the next chunk is too big to
+ # fit on *any* line (not just this one).
+ if chunks and len(chunks[-1]) > width:
+ self._handle_long_word(chunks, cur_line, cur_len, width)
+
+ # If the last chunk on this line is all whitespace, drop it.
+ if self.drop_whitespace and cur_line and cur_line[-1].strip() == '':
+ del cur_line[-1]
+
+ # Convert current line back to a string and store it in list
+ # of all lines (return value).
+ if cur_line:
+ lines.append(indent + ''.join(cur_line))
+
+ return lines
+
+# }}}
+# function wrap() {{{
+
+def wrap(text, width=70, **kwargs):
+ """
+ Wrap a single paragraph of text, returning a list of wrapped lines.
+ """
+ if sys.version_info < (2, 6):
+ return TextWrapper(width=width, **kwargs).wrap(text)
+ return textwrap.wrap(text, width=width, **kwargs)
+
+#}}}
diff --git a/i18n/posplit b/i18n/posplit
new file mode 100755
index 0000000..d2fafa6
--- /dev/null
+++ b/i18n/posplit
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+#
+# posplit - split messages in paragraphs on .po/.pot files
+#
+# license: MIT/X11/Expat
+#
+
+import sys
+import polib
+
+def addentry(po, entry, cache):
+ e = cache.get(entry.msgid)
+ if e:
+ e.occurrences.extend(entry.occurrences)
+ else:
+ po.append(entry)
+ cache[entry.msgid] = entry
+
+def mkentry(orig, delta, msgid, msgstr):
+ entry = polib.POEntry()
+ entry.merge(orig)
+ entry.msgid = msgid or orig.msgid
+ entry.msgstr = msgstr or orig.msgstr
+ entry.occurrences = [(p, int(l) + delta) for (p, l) in orig.occurrences]
+ return entry
+
+if __name__ == "__main__":
+ po = polib.pofile(sys.argv[1])
+
+ cache = {}
+ entries = po[:]
+ po[:] = []
+ for entry in entries:
+ msgids = entry.msgid.split(u'\n\n')
+ if entry.msgstr:
+ msgstrs = entry.msgstr.split(u'\n\n')
+ else:
+ msgstrs = [u''] * len(msgids)
+
+ if len(msgids) != len(msgstrs):
+ # places the whole existing translation as a fuzzy
+ # translation for each paragraph, to give the
+ # translator a chance to recover part of the old
+ # translation - erasing extra paragraphs is
+ # probably better than retranslating all from start
+ if 'fuzzy' not in entry.flags:
+ entry.flags.append('fuzzy')
+ msgstrs = [entry.msgstr] * len(msgids)
+
+ delta = 0
+ for msgid, msgstr in zip(msgids, msgstrs):
+ if msgid:
+ newentry = mkentry(entry, delta, msgid, msgstr)
+ addentry(po, newentry, cache)
+ delta += 2 + msgid.count('\n')
+ po.save()
diff --git a/i18n/pt_BR.po b/i18n/pt_BR.po
new file mode 100644
index 0000000..a4b01ae
--- /dev/null
+++ b/i18n/pt_BR.po
@@ -0,0 +1,24585 @@
+# Brazilian Portuguese translations for Mercurial
+# Traduções do Mercurial para português do Brasil
+# Copyright (C) 2011 Matt Mackall and others
+#
+# Translators:
+# Diego Oliveira <diego@diegooliveira.com>
+# Wagner Bruna <wbruna@softwareexpress.com.br>
+#
+# Translation dictionary:
+#
+# archive pacote
+# branch ramificar (v.), ramo (s.)
+# bundle bundle
+# changeset revisão
+# commit consolidar (v.), consolidação (s.)
+# default default (branch ou path), padrão
+# diff diff
+# head cabeça
+# hook gancho
+# merge mesclar (v.), mesclagem (s.)
+# patch patch
+# pull trazer
+# push enviar
+# revision revisão
+# tag etiqueta
+# tip tip (tag), ponta
+# update atualizar (v.), atualização (s.)
+# working directory diretório de trabalho
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2012-07-31 14:10-0300\n"
+"PO-Revision-Date: 2011-06-28 09:55+0200\n"
+"Last-Translator: Wagner Bruna <wbruna@yahoo.com>\n"
+"Language-Team: Brazilian Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: pygettext.py 1.5\n"
+"Language: \n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KBabel 1.11.4\n"
+"X-Poedit-Country: BRAZIL\n"
+"X-Poedit-Language: Portuguese\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (padrão: %s)"
+
+msgid "Options"
+msgstr "Opções"
+
+msgid "Commands"
+msgstr "Comandos"
+
+msgid "Extensions"
+msgstr "Extensões"
+
+msgid ""
+"This section contains help for extensions that are distributed together with"
+" Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Esta seção contém texto de ajuda para extensões que são distribuídas junto "
+"com o Mercurial. A ajuda para outras extensões está disponível no sistema de"
+" ajuda."
+
+msgid "Options:"
+msgstr "Opções:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " apelidos: %s"
+
+msgid "hooks for controlling repository access"
+msgstr "ganchos para controlar o acesso a um repositório"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"Este gancho possibilita permitir ou recusar acesso de escrita a\n"
+"determinados ramos ou caminhos ao receber revisões, usando\n"
+"pretxnchangegroup e pretxncommit."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"A autorização é feita com relação ao nome de usuário local no sistema\n"
+"onde o gancho é executado, e não ao autor da revisão original (já\n"
+"que este é meramente informativo)."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"O gancho acl funciona melhor se você usar um shell restrito (como\n"
+"por exemplo o hgsh), impedindo que usuários autenticados usem outros\n"
+"comandos além de push e pull. Ele não é seguro se os usuários tiverem\n"
+"acesso a um shell interativo, pois eles então poderão desabilitar o\n"
+"gancho. Também não é seguro se usuários remotos compartilharem uma\n"
+"conta local, pois não haverá maneira de distingui-los."
+
+msgid "The order in which access checks are performed is:"
+msgstr "A ordem na qual verificações de acesso são realizadas é:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+"1) Lista de restrição para ramos (seção ``acl.deny.branches``)\n"
+"2) Lista de permissão para ramos (seção ``acl.allow.branches``)\n"
+"3) Lista de restrição para caminhos (seção ``acl.deny``)\n"
+"4) Lista de permissão para caminhos (seção ``acl.allow``)"
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr "As seções allow e deny usam pares chave-valor."
+
+msgid ""
+"Branch-based Access Control\n"
+"---------------------------"
+msgstr ""
+"Controle de Acesso Baseado em Ramos\n"
+"-----------------------------------"
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+"Use as seções ``acl.deny.branches`` e ``acl.allow.branches`` para controlar\n"
+"o acesso com base no ramo nomeado das revisões. Chaves nessa seção podem ser:"
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- um nome de ramo;\n"
+"- um asterisco, que significa \"qualquer ramo\"."
+
+msgid "The corresponding values can be either:"
+msgstr "Os valores correspondentes podem ser:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+"- uma lista separada por vírgulas contendo usuários e grupos, ou\n"
+"- um asterisco, que significa \"qualquer usuário ou grupo\";"
+
+msgid ""
+"You can add the \"!\" prefix to a user or group name to invert the sense\n"
+"of the match."
+msgstr ""
+"Você pode adicionar o prefixo \"!\" para um usuário ou grupo\n"
+"para inverter o sentido do casamento."
+
+msgid ""
+"Path-based Access Control\n"
+"-------------------------"
+msgstr ""
+"Controle de Acesso Baseado em Caminhos\n"
+"--------------------------------------"
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+"Use as seções ``acl.deny`` e ``acl.allow`` para controlar o acesso com\n"
+"base nos caminhos de arquivo alterados pelas revisões. Chaves nessas\n"
+"seções aceitam um padrão de sub-árvore (por padrão com sintaxe glob).\n"
+"Os valores correspondentes seguem a mesma sintaxe que as outras\n"
+"seções acima."
+
+msgid ""
+"Groups\n"
+"------"
+msgstr ""
+"Grupos\n"
+"------"
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+"Nomes de grupos devem ser prefixados com um símbolo ``@``. Especificar\n"
+"um nome de grupo tem o mesmo efeito que especificar todos os usuários\n"
+"dentro desse grupo."
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+"Você pode definir grupos na seção ``acl.groups``. Se um nome de grupo\n"
+"não estiver definido nessa seção, e o Mercurial for executado em um\n"
+"sistema semelhante ao Unix, a lista de usuários será obtida do grupo\n"
+"Unix. Caso contrário, uma exceção será lançada."
+
+msgid ""
+"Example Configuration\n"
+"---------------------"
+msgstr ""
+"Exemplo de Configuração\n"
+"-----------------------"
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+" # Use este gancho para verificar restrições de acesso durante um commit\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+" # Use este gancho para verificar restrições de acesso para pull, push,\n"
+" # bundle e serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+" [acl]\n"
+" # Permite ou recusa acesso para revisões de entrada apenas se sua origem\n"
+" # estiver listada aqui, caso contrário ignora esta verificação. A origem\n"
+" # é \"serve\" para todo tipo de acesso remoto (http ou ssh), \"push\",\n"
+" # \"pull\" ou \"bundle\" quando os comandos correspondentes forem\n"
+" # executados do lado local.\n"
+" # Padrão: serve\n"
+" sources = serve"
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+" # Todos são recusados no ramo \"frozen\":\n"
+" frozen-branch = * "
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+" # O usuário-mau é recusado em todos os ramos:\n"
+" * = usuário-mau"
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+" # Alguns usuários são permitidos no ramo-a:\n"
+" ramo-a = usuário-1, usuário-2, usuário-3"
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+" # Apenas um usuário é permitido no ramo-b:\n"
+" ramo-b = usuário-1"
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+" # superusuário é permitido em qualquer ramo:\n"
+" * = superusuário"
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+" # Todos são permitidos em ramo-de-testes:\n"
+" ramo-de-testes = *"
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+" [acl.deny]\n"
+" # Esta lista é verificada primeiro. Se uma correspondência for\n"
+" # encontrada, acl.allow não é verificada. Se acl.deny não estiver\n"
+" # presente, todos os usuários terão acesso . O formato para ambas\n"
+" # é: glob padrão = usuário, ..., @grupo, ..."
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+" # Para permitir ou restringir todos os usuários, use um asterisco:\n"
+" # meu/padrão/glob = *"
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+" # usuário6 não terá acesso de escrita a nenhum arquivo:\n"
+" ** = usuário6"
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+" # O grupo \"hg-negado\" não terá acesso de escrita a qualquer arquivo:\n"
+" ** = @hg-negado"
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+" # Ninguém será capaz de mudar \"NÃO-MEXA-NISSO.txt\", apesar de\n"
+" # todos poderem mudar todos os outros arquivos. Veja abaixo.\n"
+" src/main/resources/NAO-MEXA-NISSO.txt = *"
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+" [acl.allow]\n"
+" # Se acl.allow não estiver presente, todos os usuários são\n"
+" # por padrão permitidos\n"
+" # uma acl.allow vazia faz com que nenhum usuário seja permitido"
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+" # O usuário \"escritor_de_docs\" tem acesso de escrita para qualquer\n"
+" # arquivo sob a pasta \"docs\":\n"
+" docs/** = escritor_de_docs"
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+" # O usuário \"joao\" e o grupo \"designers\" têm acesso de escrita para\n"
+" # qualquer arquivo sob a pasta \"imagens\":\n"
+" imagens/** = joao, @designers"
+
+msgid ""
+" # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+" # will have write access to any file under the \"resources\" folder\n"
+" # (except for 1 file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+" # Todos (exceto \"usuário6\" e \"@hg-denied\" - veja acl.deny acima)\n"
+" # terão acesso de escrita a qualquer arquivo sob a pasta \"resources\"\n"
+" # (exceto um arquivo - veja acl.deny):\n"
+" src/main/resources/** = *"
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+msgid ""
+"Examples using the \"!\" prefix\n"
+"............................."
+msgstr ""
+"Exemplos usando o prefixo \"!\"\n"
+"............................."
+
+msgid ""
+"Suppose there's a branch that only a given user (or group) should be able to\n"
+"push to, and you don't want to restrict access to any other branch that may\n"
+"be created."
+msgstr ""
+"Suponha que haja um ramo para o qual somente um dado usuário (ou grupo) seja capaz\n"
+"de enviar revisões, e você não quer restringir acesso a qualquer outro ramo que\n"
+"possa ser criado."
+
+msgid ""
+"The \"!\" prefix allows you to prevent anyone except a given user or group to\n"
+"push changesets in a given branch or path."
+msgstr ""
+"O prefixo \"!\" permite que você previna que qualquer um com exceção de um\n"
+"dado usuário ou grupo envie revisões em um certo ramo ou caminho."
+
+msgid ""
+"In the examples below, we will:\n"
+"1) Deny access to branch \"ring\" to anyone but user \"gollum\"\n"
+"2) Deny access to branch \"lake\" to anyone but members of the group \"hobbit\"\n"
+"3) Deny access to a file to anyone but user \"gollum\""
+msgstr ""
+"No exemplo abaixo, nós iremos:\n"
+"1) Negar o acesso a um ramo \"ring\" a todos, menos ao usuário \"gollum\"\n"
+"2) Negar o acesso ao ramo \"lake\" a todos, menos aos membros do grupo \"hobbit\"\n"
+"3) Negar o acesso a um arquivo a todos, menos ao usuário \"gollum\""
+
+msgid ""
+" [acl.allow.branches]\n"
+" # Empty"
+msgstr ""
+" [acl.allow.branches]\n"
+" # Vazio"
+
+msgid ""
+" # 1) only 'gollum' can commit to branch 'ring';\n"
+" # 'gollum' and anyone else can still commit to any other branch.\n"
+" ring = !gollum"
+msgstr ""
+" # 1) somente 'gollum' pode consolidar no ramo 'ring';\n"
+" # 'gollum' e qualquer outro usuário ainda pode consolidar em\n"
+" # qualquer outro ramo.\n"
+" ring = !gollum"
+
+msgid ""
+" # 2) only members of the group 'hobbit' can commit to branch 'lake';\n"
+" # 'hobbit' members and anyone else can still commit to any other branch.\n"
+" lake = !@hobbit"
+msgstr ""
+" # 2) somente membros do grupo 'hobbit' podem consolidar em um ramo 'lake';\n"
+" # membros do grupo 'hobbit' e qualquer outro usuário ainda podem consolidar\n"
+" # em qualquer outro ramo.\n"
+" lake = !@hobbit"
+
+msgid " # You can also deny access based on file paths:"
+msgstr " # Você também pode negar o acesso com base em caminhos de arquivo:"
+
+msgid ""
+" [acl.allow]\n"
+" # Empty"
+msgstr ""
+" [acl.allow]\n"
+" # Vazio"
+
+msgid ""
+" [acl.deny]\n"
+" # 3) only 'gollum' can change the file below;\n"
+" # 'gollum' and anyone else can still change any other file.\n"
+" /misty/mountains/cave/ring = !gollum"
+msgstr ""
+" [acl.deny]\n"
+" # 3) somente 'gollum' pode mudar o arquivo abaixo;\n"
+" # 'gollum' e qualquer outro ainda pode mudar qualquer outro arquivo.\n"
+" /misty/mountains/cave/ring = !gollum"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "o grupo '%s' não está definido"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"erro de configuração - tipo de gancho \"%s\" não pode interromper "
+"consolidações nem revisões de entrada"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr "acl: acesso do usuário \"%s\" negado para o ramo \"%s\" (revisão \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr "acl: usuário \"%s\" não tem acesso ao ramo \"%s\" (revisão \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: o acesso do usuário \"%s\" a \"%s\" foi negado (revisão \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr "acl: o acesso do usuário \"%s\" a \"%s\" não foi permitido (revisão \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr "ganchos para integração com o bug tracker Bugzilla"
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+"Essa extensão adiciona comentários a bugs do Bugzilla quando\n"
+"forem encontradas revisões que se refiram a esses bugs pelo ID.\n"
+"Os comentários são formatados usando o mecanismo de templates\n"
+"do Mercurial."
+
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"As referências para bugs podem opcionalmente incluir atualizações do\n"
+"registro do Bugzilla de horas de trabalho gastas com o bug. Bugs\n"
+"também podem ser marcados como corrigidos."
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr "Três modos básicos de acesso ao Bugzilla são fornecidos:"
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"1. Acesso através da interface XMLRPC do Bugzilla. Exige a versão\n"
+"3.4 ou posterior do Bugzilla."
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"2. Verifica os dados pela interface XMLRPC do Bugzilla, e envia mudanças\n"
+"de bug por email para a interface de email do Bugzilla. Exige a versão\n"
+"3.4 ou posterior do Bugzilla."
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+"3. Escreve diretamente na base de dados do Bugzilla. São suportadas\n"
+"apenas instalações do Bugzilla usando o MySQL. Exige o módulo\n"
+"MySQLdb do Python."
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+"A escrita direta na base de dados é suscetível a mudanças de schema,\n"
+"e se baseia em um script Bugzilla para enviar notificações de mudança\n"
+"de bug por email. Este script é executado pelo usuário que executa o\n"
+"Mercurial, deve ser executado no host contendo a instalação do\n"
+"Bugzilla, exige permissões de leitura de detalhes de configuração\n"
+"do Bugzilla e um usuário e senha do MySQL que tenha acesso completo\n"
+"à base de dados do Bugzilla.\n"
+"Por essas razões, este modo de acesso é considerado obsoleto, e\n"
+"não será atualizado para novas versões do Bugzilla.\n"
+"Neste modo de acesso, apenas a adição de comentários é suportada."
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and later."
+msgstr ""
+"O acesso por XMLRPC necessita de um nome de usuário e senha do\n"
+"Bugzilla especificados na configuração. Comentários são adicionados\n"
+"sob tal nome de usuário. Como a configuração deve ser legível por\n"
+"todos os usuários do Mercurial, recomenda-se que os direitos desse\n"
+"usuário sejam restritos ao mínimo necessário para adicionar\n"
+"comentários.\n"
+"Marcar bugs como corrigidos exige o Bugzilla versão 4.0 ou posterior."
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+"O acesso por XMLRPC/email usa XMLRPC para consultar o Bugzilla,\n"
+"mas envia um email para a interface de emails do Bugzilla para\n"
+"adicionar comentários aos bugs. O endereço de email do usuário\n"
+"do Mercurial é usado como endereço From: no email, de modo que o\n"
+"comentário parecerá vir do usuário do Mercurial. Se o email do\n"
+"usuário não for reconhecido pelo Bugzilla como um usuário do\n"
+"Bugzilla, a origem do comentário será o email associado ao nome\n"
+"de usuário do Bugzilla usado para entrar no Bugzilla.\n"
+"Marcar bugs como corrigidos funciona em todas as versões do\n"
+"Bugzilla suportadas."
+
+msgid "Configuration items common to all access modes:"
+msgstr "Itens de configuração comuns a todos os modos de acesso:"
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+"bugzilla.version\n"
+" O tipo de acesso a ser usado. Os valores reconhecidos são:"
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+" :``xmlrpc``: interface XMLRPC do Bugzilla.\n"
+" :``xmlrpc+email``: interfaces XMLRPC e email do Bugzilla.\n"
+" :``3.0``: acesso MySQL, Bugzilla 3.0 e posterior.\n"
+" :``2.18``: acesso MySQL, Bugzilla 2.18 até (sem incluir) 3.0\n"
+" :``2.16``: acesso MySQL, Bugzilla 2.16 até (sem incluir) 2.18."
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs for update in changeset commit message.\n"
+" It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+" IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.regexp\n"
+" Expressão regular para encontrar na mensagem de consolidação da\n"
+" revisão os IDs dos bugs a serem atualizados.\n"
+" Deve conter um grupo \"()\" nomeado ``<ids>`` contendo os IDs de\n"
+" bugs separados por não-dígitos. Pode também conter um grupo\n"
+" nomeado ``<hours>`` com um valor de ponto flutuante fornecendo\n"
+" as horas trabalhadas no bug. Se nenhum grupo nomeado estiver\n"
+" presente, assume-se que o primeiro grupo \"()\" irá conter os\n"
+" IDs dos bugs, e as horas trabalhadas não serão atualizadas.\n"
+" A expressão padrão encontra\n"
+" ``Bug 1234``, ``Bug no. 1234``, ``Bug number 1234``,\n"
+" ``Bugs 1234,5678``, ``Bug 1234 and 5678`` e variações,\n"
+" seguidas de um número de horas prefixado por ``h`` ou ``hours``,\n"
+" como em ``hours 1.5``.\n"
+" A busca não é sensível a maiúsculas e minúsculas."
+
+msgid ""
+"bugzilla.fixregexp\n"
+" Regular expression to match bug IDs for marking fixed in changeset\n"
+" commit message. This must contain a \"()\" named group ``<ids>` containing\n"
+" the bug IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Fixes 1234``, ``Fixes bug 1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.fixregexp\n"
+" Expressão regular para encontrar na mensagem de consolidação da\n"
+" revisão os IDs dos bugs a serem marcados como resolvidos.\n"
+" Deve conter um grupo \"()\" nomeado ``<ids>`` contendo os IDs de\n"
+" bugs separados por não-dígitos. Pode também conter um grupo\n"
+" nomeado ``<hours>`` com um valor de ponto flutuante fornecendo\n"
+" as horas trabalhadas no bug. Se nenhum grupo nomeado estiver\n"
+" presente, assume-se que o primeiro grupo \"()\" irá conter os\n"
+" IDs dos bugs, e as horas trabalhadas não serão atualizadas.\n"
+" A expressão padrão encontra\n"
+" ``Fixes 1234``, ``Fixes bug 1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` e variações,\n"
+" seguidas de um número de horas prefixado por ``h`` ou ``hours``,\n"
+" como em ``hours 1.5``.\n"
+" A busca não é sensível a maiúsculas e minúsculas."
+
+msgid ""
+"bugzilla.fixstatus\n"
+" The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+" O status definido em um bug que tiver sido marcado como corrigido.\n"
+" O padrão é ``RESOLVED``."
+
+msgid ""
+"bugzilla.fixresolution\n"
+" The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+" A resolução definida em um bug que tiver sido marcado como corrigido.\n"
+" O padrão é ``FIXED``."
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+"bugzilla.style\n"
+" O arquivo de estilo usado para formatar os comentários."
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+"bugzilla.template\n"
+" O template usado para formatar os comentários. Sobrepõe style se\n"
+" especificado. Além das palavras chave do Mercurial, a extensão\n"
+" especifica:"
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+" :``{bug}``: O ID do bug no Bugzilla.\n"
+" :``{root}``: O caminho completo do repositório do Mercurial.\n"
+" :``{webroot}``: O caminho do repositório do Mercurial.\n"
+" :``{hgweb}``: URL base para visualizar o repositório do Mercurial via http."
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+" O valor padrão é ``changeset {node|short} in repo {root} refers ``\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+"bugzilla.strip\n"
+" O número de separadores de caminho que devem ser retirados do\n"
+" início do caminho para o repositório do Mercurial (``{root}``\n"
+" nos templates) para produzir ``{webroot}``. Por exemplo, um\n"
+" repositório com ``{root}`` ``/var/local/my-project`` com valor\n"
+" de strip 2 gera ``my-project`` como valor de ``{webroot}``.\n"
+" O padrão é 0."
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+"web.baseurl\n"
+" URL base para visualização de repositórios do Mercurial. Usada\n"
+" em modelos como ``{hgweb}``."
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr ""
+"Itens de configuração comuns aos modos de acesso XMLRPC+email e MySQL:"
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+"bugzilla.usermap\n"
+" Caminho para o arquivo que contem o mapeamento do consolidador do\n"
+" Mercurial para o ID do usuário do Bugzilla. Se especificado, o\n"
+" arquivo deve conter um mapeamento por linha::"
+
+msgid " committer = Bugzilla user"
+msgstr " consolidador = usuário do Bugzilla"
+
+msgid " See also the ``[usermap]`` section."
+msgstr " Veja também a seção [usermap]."
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+"A seção ``[usermap]`` é usada para especificar mapeamentos de emails dos\n"
+"consolidadores do Mercurial para emails de usuários do Bugzilla. Veja\n"
+"também ``bugzilla.usermap``.\n"
+"Contém entradas com o formato ``consolidador = usuário do Bugzilla``."
+
+msgid "XMLRPC access mode configuration:"
+msgstr "Configuração do modo de acesso XMLRPC:"
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+"bugzilla.bzurl\n"
+" A URL base para a instalação do Bugzilla.\n"
+" O padrão é ``http://localhost/bugzilla``."
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" O nome de usuário a ser usado para entrar no Bugzilla via XMLRPC.\n"
+" O padrão é ``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+"bugzilla.password\n"
+" A senha de login do Bugzilla."
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr ""
+"O modo de acesso XMLRPC+email usa os itens de configuração do modo\n"
+"XMLRPC, além de:"
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+"bugzilla.bzemail\n"
+" O endereço de email do Bugzilla."
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+"Adicionalmente, as opções de email do Mercurial devem ser configuradas.\n"
+"Veja a documentação em hgrc(5), seções ``[email]`` e ``[smtp]``."
+
+msgid "MySQL access mode configuration:"
+msgstr "Configuração do modo de acesso MySQL:"
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+"bugzilla.host\n"
+" Nome do servidor do MySQL que contém o banco de dados do Bugzilla.\n"
+" O padrão é ``localhost``."
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+"bugzilla.db\n"
+" Nome do banco de dados do Bugzilla no MySQL. O padrão é ``bugs``."
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Nome de usuário para acessar o servidor MySQL. O padrão é ``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+"bugzilla.password\n"
+" Senha para acessar o servidor MySQL."
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+"bugzilla.timeout\n"
+" Tempo de espera limite para conexão com o banco de dados (em\n"
+" segundos). O padrão é 5."
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+"bugzilla.bzuser\n"
+" Nome de usuário no Bugzilla utilizado para gravar os comentários\n"
+" se o autor da revisão não for encontrado como um usuário do\n"
+" Bugzilla."
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+"bugzilla.bzdir\n"
+" Diretório de instalação do Bugzilla. Usado pelo notify padrão. Seu\n"
+" valor padrão é ``/var/www/html/bugzilla``."
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+"bugzilla.notify\n"
+" O comando que deve ser executado para o Bugzilla enviar o email\n"
+" de notificação de alterações. É realizada a substituição de 3\n"
+" entradas: ``bzdir``, ``id`` (bug id) e ``user`` (email do submetedor\n"
+" do bugzilla). O padrão depende da versão; na 2.18 é\n"
+" \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl %(id)s %(user)s\"."
+
+msgid "Activating the extension::"
+msgstr "Para ativar a extensão::"
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+" [hooks]\n"
+" # executa o gancho bugzilla a cada mudança trazida para cá\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+
+msgid "Example configurations:"
+msgstr "Exemplos de configuração:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"Exemplo de configuração XMLRPC. Usa o Bugzilla em\n"
+"``http://my-project.org/bugzilla``, entrando como usuário\n"
+"``bugmail@my-project.org`` com senha ``plugh``. É usado com uma\n"
+"coleção de repositórios do Mercurial em ``/var/local/hg/repos/``,\n"
+"com uma interface web em ``http://my-project.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+"Exemplo de configuração XMLRPC+email. Usa o Bugzilla em\n"
+"``http://my-project.org/bugzilla``, entrando como usuário\n"
+"``bugmail@my-project.org`` com a senha ``plugh``. É usado com uma\n"
+"coleção de repositórios do Mercurial em ``/var/local/hg/repos/``,\n"
+"com uma interface web em ``http://my-project.org/hg``. Comentários\n"
+"para bugs são enviados para o endereço de email do Bugzilla\n"
+"``bugzilla@my-project.org``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"Exemplo de configuração MySQL. Usa uma instalação local do Bugzilla 3.2\n"
+"em ``/opt/bugzilla-3.2``. A base de dados MySQL está em ``localhost``,\n"
+"o nome da base de dados Bugzilla é ``bugs`` e o MySQL é acessado\n"
+"com o nome de usuário MySQL ``bugs`` e a senha ``XYZZY``. É usado\n"
+"com uma coleção de repositórios do Mercurial em ``/var/local/hg/repos/``,\n"
+"com uma interface web em ``http://my-project.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+"Todas as configurações acima adicionam um comentário ao registro de bug\n"
+"do Bugzilla com a forma::"
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr " Changeset commit comment. Bug 1234.\n"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "indisponível suporte ao mysql no python: %s"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "conectando a %s:%s como %s, senha %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "consulta: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "falha na consulta: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "esquema de banco de dados desconhecido"
+
+#, python-format
+msgid "bug %d does not exist\n"
+msgstr "o bug %d não existe\n"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "o bug %d já sabe sobre a revisão %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "falando para o bugzilla enviar email:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " bug %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "rodando comando de notificação %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "comando de notificação do bugzilla %s"
+
+msgid "done\n"
+msgstr "feito\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "procurando usuário %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "não é possível encontrar o id do usuário no bugzilla para %s"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "não é possível encontrar o id do usuário no bugzilla para %s ou %s"
+
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL não pode atualizar o estado do bug\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr ""
+"Bugzilla/XMLRPC requer o Bugzilla 4.0 ou posterior para marcar bugs como "
+"corrigidos\n"
+
+msgid "configuration 'bzemail' missing"
+msgstr "a configuração 'bzemail' está faltando"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr "o email do usuário padrão do bugzilla %s não foi encontrado"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "versão %s do bugzilla não suportada"
+
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: horas inválidas\n"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"revisão {node|short} no repositório {root} refere-se ao bug {bug}.\n"
+"detalhes:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr "gancho do tipo %s não passa um id de revisão"
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Erro do Bugzilla: %s"
+
+msgid "command to display child changesets (DEPRECATED)"
+msgstr "comando para exibir revisões filhas (OBSOLETO)"
+
+msgid ""
+"This extension is deprecated. You should use :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+msgstr ""
+"Esta extensão é obsoleta. Você deve usar :hg:`log -r\n"
+"\"children(REV)\"` em seu lugar.\n"
+
+msgid "show the children of the given or working directory revision"
+msgstr "exibe os filhos da revisão pedida ou do diretório de trabalho"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" Imprime os filhos das revisões do diretório de trabalho. Se uma\n"
+" revisão for dada por -r/--rev, imprime os filhos dessa revisão.\n"
+" Se for passado um arquivo como parâmetro, a revisão na qual esse\n"
+" arquivo foi modificado por último (após a revisão do diretório\n"
+" de trabalho ou da passada em --rev) será impressa.\n"
+" "
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr "exibe o filho de uma revisão especifica"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r REV] [ARQUIVO]"
+
+msgid "command to display statistics about repository history"
+msgstr "comando para mostrar estatísticas do histórico do repositório"
+
+#, python-format
+msgid "revision %d is a merge, ignoring...\n"
+msgstr "a revisão %d é uma mesclagem, ignorando...\n"
+
+msgid "analyzing"
+msgstr "analisando"
+
+msgid "histogram of changes to the repository"
+msgstr "histograma de mudanças do repositório"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+" Este comando exibe um histograma representando o número de linhas\n"
+" alteradas ou revisões, agrupadas de acordo com o modelo pedido.\n"
+" O modelo padrão agrupa mudanças por autor. Alternativamente, a\n"
+" opção --dateformat pode ser usada para agrupar os resultados por\n"
+" data."
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+" As estatísticas se baseiam no número de linhas modificadas, ou\n"
+" alternativamente no número de revisões, se for usada a opção\n"
+" --changesets."
+
+msgid " Examples::"
+msgstr " Exemplos::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+" # exibe a contagem de linhas modificadas para cada autor\n"
+" hg churn -t '{author|email}'"
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+" # exibe o gráfico de atividades diárias\n"
+" hg churn -f '%H' -s -c"
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+" # exibe atividades dos desenvolvedores por mês\n"
+" hg churn -f '%Y-%m' -s -c"
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+" # exibe a contagem de linhas modificadas a cada ano\n"
+" hg churn -f '%Y' -s"
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+" É possível mapear endereços de email alternativos para um\n"
+" endereço principal provendo um arquivo usando o seguinte\n"
+" formato:"
+
+msgid " <alias email> = <actual email>"
+msgstr " <email alternativo> = <email principal>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+" Esse arquivo pode ser especificado com a opção --aliases; de\n"
+" outro modo, será usado um arquivo .hgchurn no raiz do diretório\n"
+" de trabalho, se existir.\n"
+" "
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "omitindo apelido mal formado: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "conta a frequência para uma revisão ou faixa especificada"
+
+msgid "DATE"
+msgstr "DATA"
+
+msgid "count rate for revisions matching date spec"
+msgstr "conta a frequência das revisões que casem com a data especificada"
+
+msgid "TEMPLATE"
+msgstr "MODELO"
+
+msgid "template to group changesets"
+msgstr "modelo para agrupar as revisões"
+
+msgid "FORMAT"
+msgstr "FORMATO"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr "formato compatível com o strftime para agrupar por data"
+
+msgid "count rate by number of changesets"
+msgstr "conta a frequência pelo numero de revisões"
+
+msgid "sort by key (default: sort by count)"
+msgstr "ordenar pela chave (padrão: ordenar pela contagem)"
+
+msgid "display added/removed lines separately"
+msgstr "mostra separadamente linhas adicionadas/removidas"
+
+msgid "FILE"
+msgstr "ARQUIVO"
+
+msgid "file with email aliases"
+msgstr "arquivo com apelidos de email"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATA] [-r REV] [--aliases ARQUIVO] [ARQUIVO]"
+
+msgid "colorize output from some commands"
+msgstr "colore a saída de alguns comandos"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"Esta extensão modifica os comandos status e resolve para adicionar\n"
+"coloração às suas respectivas saídas para refletir estado de arquivos,\n"
+"o comando qseries para adicionar coloração para refletir os estados dos\n"
+"patches (aplicado, não aplicado, faltando), e comandos relacionados com\n"
+"diff para destacar adições, remoções, cabeçalhos de diffs e espaços em\n"
+"branco no final das linhas."
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"Outros efeitos adicionais às cores, como negrito e sublinhado,\n"
+"também estão disponíveis. Por padrão, a base de dados terminfo\n"
+"é usada para determinar os códigos de terminal usados para mudar\n"
+"cores e efeitos. Se terminfo não estiver disponível, os efeitos\n"
+"serão desenhados com a função de controle ECMA-48 SGR (também\n"
+"conhecidos como códigos de escape ANSI)."
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+"Os efeitos padrão podem ser redefinidos pelo seu arquivo de configuração::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' desliga todos os efeitos\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+" tags.normal = green\n"
+" tags.local = black bold"
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+"Os efeitos disponíveis em modo terminfo são 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', e 'underline'; em modo\n"
+"ECMA-48 mode, as opções são 'bold', 'inverse', 'italic' e\n"
+"'underline'. O modo como cada um é desenhado dependerá do emulador\n"
+"de terminal. Alguns efeitos podem não estar disponíveis para um\n"
+"determinado tipo de terminal, e serão silenciosamente ignorados."
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+"Note que, em alguns sistemas, o modo terminfo pode causar problemas ao\n"
+"usar coloração com a extensão pager e less -R. O comando less com a\n"
+"opção -R mostrará apenas códigos de cores ECMA-48, e o modo terminfo\n"
+"pode por vezes emitir códigos não suportados pelo comando less.\n"
+"Para evitar esse problema, você pode usar o modo ansi (ou o modo auto)\n"
+"ou o comando less -r (que propagará todos os códigos de terminal, não\n"
+"apenas códigos de controle de cores)."
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+"Como existem apenas oito cores padronizadas, este módulo permite que\n"
+"você defina nomes de cores para outras entradas de cores que podem\n"
+"estar disponíveis para o seu tipo de terminal, assumindo modo terminfo.\n"
+"Por exemplo::"
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+"para definir 'brightblue' para a entrada de cor 12 (útil para terminais\n"
+"de 16 cores que possuam cores mais brilhantes definidas para as oito\n"
+"entradas superiores) e 'pink' e 'orange' para cores no cubo padrão de 256\n"
+"cores de terminais xterm. Estas cores definidas podem então ser usadas\n"
+"da mesma forma que as oito pré-definidas, inclusive anexando '_background'\n"
+"para definir o plano de fundo para tal cor."
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+"Por padrão, a extensão color usará o modo ANSI (ou, no Windows,\n"
+"o modo win32) se um terminal for detectado. Para desabilitar o modo\n"
+"auto (e habilitar modo terminfo, por exemplo), use a seguinte\n"
+"opção de configuração::"
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+"Qualquer valor diferente de 'ansi', 'win32', 'terminfo' ou 'auto'\n"
+"desabilitará a coloração.\n"
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr ""
+"nenhuma entrada terminfo para setab/setaf: revertendo para cores ECMA-48\n"
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr "aviso: falha ao definir modo de coloração para %s\n"
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "ignorando cor/efeito desconhecido %r (configurado em color.%s)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+"quando colorir (booleana, ou \"always\" (sempre), \"never\" (nunca) ou "
+"\"auto\" (automaticamente))"
+
+msgid "TYPE"
+msgstr "TIPO"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr "importa revisões de repositórios de outros sistemas para o Mercurial"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr "converte um repositório de um outro sistema em um do Mercurial."
+
+msgid " Accepted source formats [identifiers]:"
+msgstr " Formatos de origem aceitos [identificadores]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr " Formatos de destino aceitos [identificadores]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (histórico em ramos não é preservado)"
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+" Se não for dada nenhuma revisão, todas serão convertidas. Caso,\n"
+" contrário, a conversão irá importar apenas até a revisão nomeada\n"
+" (dada num formato entendido pela origem)."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" Se não for especificado o nome do diretório de destino, o padrão\n"
+" será o nome base da origem com ``-hg`` anexado. Se o repositório\n"
+" de destino não existir, ele será criado."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+" Por padrão, a conversão de todas as origens exceto do Mercurial\n"
+" usará --branchsort. O Mercurial usa --sourcesort para preservar\n"
+" a ordem de números de revisão original. Modos de ordenação têm\n"
+" os seguintes efeitos:"
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+" --branchsort converte de revisão pai para filha quando possível,\n"
+" o que faz com que ramos sejam usualmente convertidos\n"
+" um após o outro. Esta opção gera repositórios mais\n"
+" compactos."
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+" --datesort ordena revisões por data. Os repositórios convertidos\n"
+" tendem a ter changelogs de boa aparência, mas algumas\n"
+" vezes são uma ordem de grandeza maiores que os mesmos\n"
+" gerados por --branchsort."
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+" --sourcesort tenta preservar a ordem de revisões da origem, opção\n"
+" suportada apenas pela origem Mercurial."
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+" Se não for dado o ``REVMAP``, ele será posto em um local padrão\n"
+" (``<destino>/.hg/shamap``). O ``REVMAP`` é um simples arquivo texto\n"
+" que mapeia cada ID de commit da origem para o ID de destino para\n"
+" aquela revisão, da seguinte forma::"
+
+msgid " <source ID> <destination ID>"
+msgstr " <ID origem> <ID destino>"
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+" Se o arquivo não existir, será automaticamente criado. Ele é\n"
+" atualizado a cada commit copiado, assim :hg:`convert` pode ser\n"
+" interrompido e executado repetidamente para copiar novos commits."
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+" O parâmetro authormap é um arquivo texto simples\n"
+" que mapeia cada autor de commit da origem para um autor de commit\n"
+" no destino. Isso auxilia na conversão de sistemas que utilizam\n"
+" logins unix para identificar os autores (ex: CVS). É usada uma linha\n"
+" por mapeamento, com a forma::"
+
+msgid " source author = destination author"
+msgstr " autor na origem = autor no destino"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr " Linhas vazias ou começadas por ``#`` são ignoradas."
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+" O filemap é um arquivo que permite filtrar e remapear arquivos e\n"
+" diretórios. Cada linha pode conter uma das seguintes diretivas::"
+
+msgid " include path/to/file-or-dir"
+msgstr " include caminho/para/o/arquivo-ou-diretório"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " exclude caminho/para/o/arquivo-ou-diretório"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rename caminho/para/a/origem caminho/para/o/destino"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+" Linhas de comentário iniciam com ``#``. Um caminho especificado\n"
+" será considerado se for igual ao caminho relativo completo de um\n"
+" arquivo ou de um de seus diretórios pais. A ordem das linhas não é\n"
+" importante: será usada a diretiva ``include`` ou ``exclude`` com o\n"
+" caminho mais longo que combine."
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+" A diretiva ``include`` faz com que um arquivo, ou todos os arquivos\n"
+" em um diretório, sejam incluídos no repositório de destino, e\n"
+" exclui todos os outros arquivos e diretórios não incluídos\n"
+" explicitamente. A diretiva ``exclude`` faz com que os arquivos e\n"
+" diretórios sejam omitidos. A diretiva ``rename`` renomeia um\n"
+" arquivo ou diretório que for convertido. Para renomear de um\n"
+" subdiretório para o raiz do repositório, use ``.`` como caminho\n"
+" de destino."
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+" O splicemap é um arquivo que permite a inserção de histórico\n"
+" sintético, permitindo que você especifique os pais de uma\n"
+" revisão. Isto é útil se você por exemplo quiser que um merge do\n"
+" Subversion tenha dois pais, ou para juntar duas linhas desconexas\n"
+" de histórico. Cada entrada contém uma chave, seguida de um\n"
+" espaço, seguido de um ou mais valores separados por vírgulas::"
+
+msgid " key parent1, parent2"
+msgstr " chave primeiropai, segundopai"
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+" A chave é o identificador de revisão no sistema de controle de\n"
+" versão de origem cujos pais devam ser modificados (mesmo formato\n"
+" de uma chave em .hg/shamap). Os valores são os identificadores de\n"
+" revisão (no sistema de origem ou no de destino) que devem ser\n"
+" usados como os novos pais daquele nó. Por exemplo, se você mesclou\n"
+" \"release-1.0\" em \"trunk\", você deve especificar a revisão em\n"
+" \"trunk\" como primeiro pai e a revisão em \"release-1.0\" como\n"
+" segundo."
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+" O branchmap é um arquivo que permite a renomeação de um ramo\n"
+" quando este for trazido de um repositório externo qualquer. Se\n"
+" usado em conjunto com um splicemap, fornece uma poderosa\n"
+" combinação que auxilia o conserto de repositórios mal\n"
+" gerenciados, transformando-os em repositórios Mercurial\n"
+" estruturados apropriadamente. O branchmap contém linhas da forma::"
+
+msgid " original_branch_name new_branch_name"
+msgstr " nome_ramo_original nome_novo_ramo"
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+" onde \"nome_ramo_original\" é o nome do ramo no repositório de\n"
+" origem, e \"nome_novo_ramo\" é o nome do ramo no repositório de\n"
+" destino. Espaços em branco não são suportados nos nomes de ramo.\n"
+" Isto pode ser usado para por exemplo mover código em um\n"
+" repositório de \"default\" para um ramo nomeado."
+
+msgid ""
+" Mercurial Source\n"
+" ################"
+msgstr ""
+" Origem Mercurial\n"
+" ################"
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+" A origem Mercurial reconhece as seguintes opções de configuração,\n"
+" que podem ser definidas na linha de comando usando ``--config``:"
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+" :convert.hg.ignoreerrors: ignora erros de integridade na leitura.\n"
+" Use-a para corrigir repositórios do Mercurial com revlogs faltando,\n"
+" através da conversão para para outro repositório do Mercurial.\n"
+" O valor padrão é False."
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+" :convert.hg.saverev: armazena o identificador da revisão de origem\n"
+" (forçando a mudança de IDs de etiquetas). Esta opção recebe um\n"
+" argumento booleano, e seu valor padrão é False."
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+" :convert.hg.startrev: converte a revisão inicial especificada e seus\n"
+" descendentes. Recebe um identificador de revisão do Mercurial; seu\n"
+" valor padrão é 0."
+
+msgid ""
+" CVS Source\n"
+" ##########"
+msgstr ""
+" Origem CVS\n"
+" ##########"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+" A origem CVS usará uma cópia local do CVS para indicar o ponto\n"
+" inicial do que será convertido. Não é necessário acesso direto ao\n"
+" repositório, a não ser é claro que o repositório seja ``:local:``. A\n"
+" conversão usa o diretório do topo da cópia local para encontrar\n"
+" o repositório CVS, e em seguida o comando CVS rlog para encontrar\n"
+" os arquivos a serem convertidos. Isto quer dizer que a não ser\n"
+" que um filemap seja dado, todos os arquivos sob o diretório de\n"
+" início serão convertidos, e que qualquer reorganização na cópia\n"
+" local do CVS é ignorada."
+
+msgid " The following options can be used with ``--config``:"
+msgstr " As seguintes opções podem ser usadas com ``--config``:"
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+" :convert.cvsps.cache: Especifique False para desabilitar o cache do\n"
+" log remoto, para teste ou depuração. O valor padrão é True."
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+" :convert.cvsps.fuzz: Especifica o tempo máximo (em segundos)\n"
+" permitido entre commits com usuário e mensagem de log idênticos\n"
+" que devam ser considerados como uma única revisão. Se arquivos\n"
+" muito grandes forem armazenados como parte de uma revisão, o\n"
+" padrão pode não ser suficiente. O valor padrão é 60."
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergeto: Especifica uma expressão regular com a qual\n"
+" mensagens de log de commit são verificadas. Se um casamento for\n"
+" encontrado, a conversão inserirá uma revisão artificial\n"
+" mesclando o ramo onde essa mensagem de log aparece ao\n"
+" ramo indicado na expressão regular. O valor padrão é:\n"
+" ``{{mergetobranch ([-\\w]+)}}``"
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergefrom: Especifica uma expressão regular com a qual\n"
+" mensagens de log de commit são verificadas. Se um casamento for\n"
+" encontrado, a conversão inserirá a revisão mais recente\n"
+" do ramo indicado na expressão regular como segundo pai da\n"
+" revisão O valor padrão é:\n"
+" ``{{mergefrombranch ([-\\w]+)}}``"
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+" :hook.cvslog: Especifica uma função Python a ser chamada ao término\n"
+" da coleta do log do CVS. Essa função recebe uma lista com as\n"
+" entradas do log, e pode modificar, adicionar ou remover entradas."
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+" :hook.cvschangesets: Especifica uma função Python a ser chamada\n"
+" após os conjuntos de mudanças serem calculados a partir do\n"
+" log do CVS. Essa função recebe uma lista com as entradas do\n"
+" conjunto de mudanças, e pode modificar, adicionar ou\n"
+" remover suas entradas."
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+" O comando \"debugcvsps\" do Mercurial permite que o código de\n"
+" mesclagem interno seja executado fora do processo de conversão.\n"
+" Seus parâmetros e saída são semelhantes aos do cvsps 2.1.\n"
+" Veja a ajuda do comando para mais detalhes."
+
+msgid ""
+" Subversion Source\n"
+" #################"
+msgstr ""
+" Origem Subversion\n"
+" #################"
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+" A origem Subversion detecta a organização clássica\n"
+" trunk/branches/tags . Por padrão, a URL de origem\n"
+" ``svn://repo/path/`` fornecida é convertida como um único ramo.\n"
+" Se ``svn://repo/path/trunk`` existir, irá substituir o ramo\n"
+" default. Se ``svn://repo/path/branches`` existir, seus\n"
+" subdiretórios serão listados como possíveis ramos. Se\n"
+" ``svn://repo/path/tags`` existir, será consultado para tags\n"
+" referenciando ramos convertidos. Os valores padrão ``trunk``,\n"
+" ``branches`` e ``tags`` podem ser sobrepostos pelas seguintes\n"
+" opções. Defina-os como caminhos relativos à URL de origem, ou\n"
+" deixe-os em branco para desabilitar a detecção automática."
+
+msgid " The following options can be set with ``--config``:"
+msgstr " As seguintes opções podem ser definidas com ``--config``:"
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+" :convert.svn.branches: especifica o diretório que contém ramos.\n"
+" O valor padrão é ``branches``."
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+" :convert.svn.tags: especifica o diretório que contém tags.\n"
+" O valor padrão é ``tags``."
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+" :convert.svn.trunk: especifica o nome do ramo trunk.\n"
+" O valor padrão é ``trunk``."
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+" O histórico de origem pode ser recuperado a partir de uma revisão\n"
+" específica, ao invés de ser convertido integralmente. Apenas\n"
+" conversões de um único ramo são suportadas."
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+" :convert.svn.startrev: especifica a revisão inicial do Subversion.\n"
+" O valor padrão é 0."
+
+msgid ""
+" Perforce Source\n"
+" ###############"
+msgstr ""
+" Origem Perforce\n"
+" ###############"
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+" O importador Perforce (P4) pode receber um caminho de depot p4 ou\n"
+" uma especificação de cliente como origem. Ele irá converter todos\n"
+" os arquivos da origem para um repositório achatado do Mercurial,\n"
+" ignorando labels, branches e integrações. Note que quando é dado\n"
+" um caminho de depot você precisa tipicamente especificar um\n"
+" diretório de destino, caso contrário o destino pode ser chamado\n"
+" ``...-hg``."
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+" É possível limitar a quantidade de histórico de origem a ser\n"
+" convertida especificando uma revisão inicial do Perforce:"
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+" :convert.p4.startrev: especifica a revisão inicial do Perforce\n"
+" (um número de changelist do Perforce)."
+
+msgid ""
+" Mercurial Destination\n"
+" #####################"
+msgstr ""
+" Destino Mercurial\n"
+" #################"
+
+msgid " The following options are supported:"
+msgstr " As seguintes opções são suportadas:"
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+" :convert.hg.clonebranches: separa ramos da origem em diferentes clones.\n"
+" O padrão é False."
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+" :convert.hg.tagsbranch: nome do ramo para revisões de etiqueta. O valor\n"
+" padrão é ``default``."
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+" :convert.hg.usebranchnames: preserva nomes de ramo. O valor\n"
+" padrão é True.\n"
+" "
+
+msgid "create changeset information from CVS"
+msgstr "cria uma informação de revisão do CVS"
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+" Esse comando serve como ferramenta de depuração para o conversor\n"
+" do CVS para o Mercurial e pode ser usado como um substituto\n"
+" direto do cvsps."
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+" Hg debugcvsps lê o rlog do CVS para o diretório atual (ou\n"
+" qualquer diretório nomeado) no repositório do CVS e converte o\n"
+" log em uma série de revisões baseadas na correspondência das\n"
+" entradas no log de commit e datas."
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr "arquivo de mapeamento de nomes de usuário (OBSOLETO, use --authormap)"
+
+msgid "source repository type"
+msgstr "tipo de repositório de origem"
+
+msgid "destination repository type"
+msgstr "tipo de repositório de destino"
+
+msgid "import up to target revision REV"
+msgstr "importa até a revisão REV do alvo"
+
+msgid "remap usernames using this file"
+msgstr "arquivo de mapeamento de nomes de usuário"
+
+msgid "remap file names using contents of file"
+msgstr "arquivo de mapeamento de nomes de arquivo"
+
+msgid "splice synthesized history into place"
+msgstr "junta o histórico sintetizado no lugar"
+
+msgid "change branch names while converting"
+msgstr "muda nomes de ramos durante a conversão"
+
+msgid "try to sort changesets by branches"
+msgstr "tenta ordenar as revisões por ramos"
+
+msgid "try to sort changesets by date"
+msgstr "tenta ordenar as revisões por data"
+
+msgid "preserve source changesets order"
+msgstr "preserva a ordem de revisões da origem"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [OPÇÃO]... ORIGEM [DESTINO [REVMAP]]"
+
+msgid "only return changes on specified branches"
+msgstr "só retorna revisões no ramo especificado"
+
+msgid "prefix to remove from file names"
+msgstr "prefixo para remover dos nomes dos arquivos"
+
+msgid "only return changes after or between specified tags"
+msgstr "só retorna alterações anteriores ou entre as tags especificadas"
+
+msgid "update cvs log cache"
+msgstr "atualiza a cache do log do cvs"
+
+msgid "create new cvs log cache"
+msgstr "cria uma nova cache de log do cvs"
+
+msgid "set commit time fuzz in seconds"
+msgstr "define o valor de indistinção da hora de consolidação em segundos"
+
+msgid "specify cvsroot"
+msgstr "especifica o cvsroot"
+
+msgid "show parent changesets"
+msgstr "exibe as revisões pais"
+
+msgid "show current changeset in ancestor branches"
+msgstr "exibe a revisão atual nos ramos ancestrais"
+
+msgid "ignored for compatibility"
+msgstr "ignorada para compatibilidade"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [OPÇÃO]... [CAMINHO]..."
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ":svnrev: String. Número da revisão do Subversion convertida."
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ":svnpath: String. Caminho do projeto Subversion convertido."
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ""
+":svnuuid: String. Identificador do repositório do Subversion da revisão "
+"convertida."
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s não parece ser um repositório do Bazaar"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "os módulos do Bazaar não puderam ser carregados"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+"aviso: checkouts \"lightweight\" podem causar falhas de conversão, tente com"
+" um branch comum.\n"
+
+msgid "bzr source type could not be determined\n"
+msgstr "o tipo de origem bzr não pôde ser determinado\n"
+
+#, python-format
+msgid "%s is not a valid revision"
+msgstr "%s não é uma revisão válida"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s não está mais disponível em %s"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "%s.%s link simbólico não possui alvo"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "não foi possível encontrar ferramenta \"%s\" necessária"
+
+#, python-format
+msgid "%s error:\n"
+msgstr "erro no comando %s:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr "erro de sintaxe em %s(%d): esperado par chave/valor"
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "não foi possível abrir arquivo de mapeamento %r: %s"
+
+#, python-format
+msgid "syntax error in %s(%d): child parent1[,parent2] expected"
+msgstr "erro de sintaxe em %s(%d): \"filho pai1[,pai2]\" esperado"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: tipo de repositório de origem inválido"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: repositório ausente ou não suportado"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: tipo de repositório de destino inválido"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: tipo de repositório desconhecido"
+
+msgid "getting files"
+msgstr "obtendo arquivos"
+
+msgid "revisions"
+msgstr "revisões"
+
+msgid "scanning"
+msgstr "varrendo"
+
+#, python-format
+msgid "splice map revision %s is not being converted, ignoring\n"
+msgstr "revisão %s no splicemap não está sendo convertida, ignorando\n"
+
+#, python-format
+msgid "unknown splice map parent: %s"
+msgstr "pai desconhecido no splicemap: %s"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "modo de ordenação desconhecido: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "ciclo detectado entre %s e %s"
+
+msgid "not all revisions were sorted"
+msgstr "nem todas as revisões foram ordenadas"
+
+#, python-format
+msgid "writing author map file %s\n"
+msgstr "escrevendo arquivo de mapeamento de autor %s\n"
+
+#, python-format
+msgid "ignoring bad line in author map file %s: %s\n"
+msgstr "ignorando linha inválida no arquivo de mapeamento de autor %s: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "mapeando autor %s para %s\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "sobrepondo mapeamento para autor %s, era %s, será %s\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "associados %s como pais de %s\n"
+
+msgid "scanning source...\n"
+msgstr "decodificando entrada...\n"
+
+msgid "sorting...\n"
+msgstr "ordenando...\n"
+
+msgid "converting...\n"
+msgstr "convertendo...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "origem: %s\n"
+
+msgid "converting"
+msgstr "convertendo"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "assumindo destino %s\n"
+
+msgid "more than one sort mode specified"
+msgstr "mais de um modo de ordenação especificado"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "--sourcesort não é suportado para esta origem de dados"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s não parece ser uma cópia de trabalho do CVS"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr "revisão %s não é um número de patchset"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "conectando em %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "autenticação pserver do CVS falhou"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got "
+"%r)"
+msgstr ""
+"resposta inesperada do servidor CVS (\"Valid-requests\" esperada, %r "
+"recebida)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "%d bytes faltando no arquivo remoto"
+
+msgid "malformed response from CVS"
+msgstr "resposta malformada do CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "servidor cvs: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "resposta do CVS desconhecida: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "coletando rlog do CVS\n"
+
+msgid "not a CVS sandbox"
+msgstr "não é uma sandbox do CVS"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "lendo cache de log do CVS %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "cache possui %d entradas de log\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "erro lendo cache: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "executando %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "arquivo RCS deve ser seguido de um arquivo de trabalho"
+
+msgid "must have at least some revisions"
+msgstr "deve possuir ao menos algumas revisões"
+
+msgid "expected revision number"
+msgstr "número de revisão esperado"
+
+msgid "revision must be followed by date line"
+msgstr "revisão deve ser seguida por uma linha de data"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+"o cache do log se sobrepõe a novas entradas do log, execute novamente sem o "
+"cache."
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "escrevendo cache do log do CVS %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d entradas de log\n"
+
+msgid "creating changesets\n"
+msgstr "criando revisões\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "uma revisão sintética não pode ter múltiplos pais"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"aviso: a mensagem de commit do CVS se refere a um branch inexistente %r:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d entradas de revisão\n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s não parece ser um repositório do darcs"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "necessária versão do darcs 2.1 ou posterior (%r encontrada)"
+
+msgid "Python ElementTree module is not available"
+msgstr "módulo ElementTree do Python não está disponível"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "o formato de repositório %s não é suportado, por favor atualize"
+
+msgid "failed to detect repository format!"
+msgstr "falha na detecção do formato do repositório!"
+
+msgid "internal calling inconsistency"
+msgstr "inconsistência interna de chamadas"
+
+msgid "errors in filemap"
+msgstr "erros no filemap"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr "%s:%d: está faltando o caminho para %s\n"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r já faz parte da lista %s\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr "%s:%d: / supérflua em %s %r\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: diretiva desconhecida %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "repositório de origem não suporta --filemap"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s não parece ser um repositório do Git"
+
+msgid "cannot retrieve git heads"
+msgstr "não é possível recuperar cabeças do git"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "não é possível ler objeto %r em %s"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "não é possível ler mudanças em %s"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "não é possível ler etiquetas de %s"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s não parece ser um repositório do GNU Arch"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "não é possível encontrar uma ferramenta do GNU Arch"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "analisando versão da árvore %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+"análise da árvore parou porque esta aponta para um arquivo não registrado "
+"%s...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr "não foi possível decodificar cat-log de %s"
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s não é um repositório local do Mercurial"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "iniciando repositório de destino %s\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "não foi possível criar repositório hg %s como destino"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "trazendo de %s para %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "filtrando revisão vazia\n"
+
+msgid "updating tags\n"
+msgstr "atualizando tags\n"
+
+msgid "updating bookmarks\n"
+msgstr "atualizando marcadores\n"
+
+#, python-format
+msgid ""
+"revision %s not found in destination repository (lookups with "
+"clonebranches=true are not implemented)"
+msgstr ""
+"revisão %s não encontrada no repositório de destino (buscas com "
+"clonebranches=true não foram implementadas)"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s não é uma revisão inicial válida"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "ignorando: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s não parece ser um repositório do Monotone"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr "bad mtn packet - no end of commandnbr"
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr "bad mtn packet - bad stream type %s"
+
+msgid "bad mtn packet - no divider before size"
+msgstr "bad mtn packet - no divider before size"
+
+msgid "bad mtn packet - no end of packet size"
+msgstr "bad mtn packet - no end of packet size"
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr "bad mtn packet - bad packet size %s"
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr "bad mtn packet - unable to read full packet read %s of %s"
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "o comando mtn '%s' devolveu %s"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "copiando arquivo em diretório renomeado de '%s' para '%s'"
+
+msgid "unable to determine mtn automate interface version"
+msgstr "incapaz de determinar versão da interface mtn automate"
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr "cabeçalho stdio do mtn automate inesperado: %s"
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr "fim de cabeçalhos stdio do mtn automate não atingido"
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s não parece ser um repositório do P4"
+
+msgid "reading p4 views\n"
+msgstr "lendo 'p4 views'\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "coletando changelists do p4\n"
+
+msgid "debugsvnlog could not load Subversion python bindings"
+msgstr ""
+"debugsvnlog: não foi possível carregar os módulos python do Subversion"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+"Mercurial falhou ao executar a si próprio, veja se o executável hg está no "
+"PATH"
+
+#, python-format
+msgid "log stream exception '%s'"
+msgstr "exceção de log stream '%s'"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+"svn: não é possível sondar o repositório remoto; a conversão irá assumir que"
+" é um repositório remoto do Subversion. Use --source-type se necessário.\n"
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s não parece ser um repositório do Subversion"
+
+msgid "could not load Subversion python bindings"
+msgstr "não foi possível carregar os módulos python do Subversion"
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+"Encontrados módulos Python para o Subversion %d.%d, requerida a versão 1.4 "
+"ou posterior"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+"Módulos Python para o Subversion são antigos demais, requerida a versão 1.4 "
+"ou posterior"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: revisão %s não é um inteiro"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: revisão inicial %s não é um inteiro"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "nenhuma revisão encontrada no módulo %s"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "%s esperado em %r, mas não encontrado"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "encontrado %s em %r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "ignorando ramo vazio %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "encontrado ramo %s em %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: revisão inicial não é suportada com mais de um ramo"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: nenhuma revisão encontrada após revisão inicial %d"
+
+#, python-format
+msgid "svn: revision %s not found"
+msgstr "svn: revisão %s não encontrada"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "%s não encontrado até revisão %d"
+
+msgid "scanning paths"
+msgstr "varrendo caminhos"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "encontrado pai do ramo %s em %d: %s\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "obtendo log da revisão para \"%s\" de %d até %d\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: ramo não tem a revisão %s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "iniciando repositório svn %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "iniciando cópia de trabalho do svn %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "saída do svn inesperada:\n"
+
+msgid "unable to cope with svn output"
+msgstr "incapaz de lidar com saída do svn"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "a escrita de tags do Subversion ainda não foi implementada\n"
+
+#, python-format
+msgid ""
+"splice map revision %s not found in subversion child map (revision lookups "
+"are not implemented)"
+msgstr ""
+"revisão %s no splicemap não encontrada no mapa de filhos do subversion "
+"(buscas por revisão não foram implementadas)"
+
+msgid "automatically manage newlines in repository files"
+msgstr "gerencia automaticamente quebras de linha em arquivos no repositório"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+"Esta extensão gerencia o tipo de quebras de linha (CRLF ou LF) que\n"
+"são usados no repositório e no diretório de trabalho local. Dessa\n"
+"maneira você terá quebras de linha CRLF no Windows e LF no Unix/Mac,\n"
+"permitindo que todos usem quebras de linha nativas em cada sistema."
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+"A extensão lê sua configuração de um arquivo versionado chamado\n"
+"``.hgeol`` localizado no raiz da cópia de trabalho. O arquivo\n"
+"``.hgeol`` usa a mesma sintaxe que outros arquivos de configuração\n"
+"do Mercurial. Ele usa duas seções, ``[patterns]`` e ``[repository]``."
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+"A seção ``[patterns]`` especifica como quebras de linha devem ser\n"
+"convertidas entre o diretório de trabalho e o repositório.\n"
+"O formato é especificado por um padrão de nomes\n"
+"de arquivo. O primeiro padrão que combinar será usado, de modo que\n"
+"padrões mais específicos devem ser especificados primeiro. Os tipos\n"
+"de quebra de linha disponíveis são ``LF``, ``CRLF`` e ``BIN``."
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+"Arquivos com formato declarado como ``CRLF`` ou ``LF`` são sempre trazidos\n"
+"para o diretório de trabalho e guardados no repositório no tal formato,\n"
+"e arquivos declarados como\n"
+"binários (``BIN``) não são alterados. Adicionalmente, ``native`` é um\n"
+"apelido para trazer o arquivo para o diretório de trabalho\n"
+"no tipo de quebra de linha padrão na plataforma: ``LF`` em\n"
+"Unix (inclusive no Mac OS X) e ``CRLF`` no Windows. Note que ``BIN`` (não\n"
+"fazer nada em relação a quebra de linhas) é o comportamento padrão do\n"
+"Mercurial; em geral só é necessário se você precisar sobrepor um padrão\n"
+"posterior mais geral."
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+"A seção opcional ``[repository]`` especifica as quebras de linha a\n"
+"serem usadas para arquivos armazenados no repositório. Ela possui uma\n"
+"única configuração, ``native``, que determina as quebras de linha\n"
+"armazenadas para arquivos declarados como ``native`` na seção \n"
+"``[patterns]``. Pode ser definida para ``LF`` ou ``CRLF``. O padrão é\n"
+"``LF``. Isso quer dizer que no Windows os arquivos configurados como\n"
+"``native`` (``CRLF`` por padrão) serão convertidos para ``LF`` ao serem\n"
+"armazenados no repositório. Arquivos declarados como ``LF``, ``CRLF``\n"
+"ou ``BIN`` na seção ``[patterns]`` são sempre armazenados da maneira\n"
+"correspondente no repositório."
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr "Um exemplo do arquivo versionado ``.hgeol``::"
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+" [repository]\n"
+" native = LF"
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+".. note::\n"
+" As regras passarão a ser aplicadas a partir do momento em que os\n"
+" arquivos forem mexidos na cópia de trabalho, por exemplo após um\n"
+" update para null e de volta para a revisão atual para mexer em\n"
+" todos os arquivos."
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"A extensão também usa uma seção opcional ``[eol]`` lida tanto a partir\n"
+"dos arquivos de configuração normais do Mercurial como do arquivo\n"
+"``.hgeol``, sendo que este último sobrepõe os anteriores. Você pode usar\n"
+"essa seção para controlar o comportamento global. Há três configurações:"
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+"- ``eol.native`` (padrão ``os.linesep``) pode ser definido como\n"
+" ``LF`` ou ``CRLF`` para sobrepor a interpretação padrão de\n"
+" ``native`` para o checkout. Isto pode por exemplo ser usado com\n"
+" :hg:`archive` no Unix para gerar um pacote com arquivos contendo\n"
+" quebras de linha Windows."
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+"- ``eol.only-consistent`` (padrão True) pode ser definido como False\n"
+" para que a extensão converta arquivos com quebras de linha inconsistentes\n"
+" - arquivos que possuam tanto quebras de linha ``CRLF`` como ``LF``.\n"
+" Tais arquivos normalmente não são alterados, assumindo que a mistura de\n"
+" quebras de linha seja intencional."
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+"- ``eol.fix-trailing-newline`` (padrão False) pode ser definida para True\n"
+" para garantir que arquivos convertidos terminem com um caractere de fim\n"
+" de linha (``\\n`` ou ``\\r\\n``, de acordo com os padrões configurados)."
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+"A extensão fornece os filtros ``cleverencode:`` e ``cleverdecode:``, para\n"
+"compatibilidade com a extensão obsoleta win32text. Isso quer dizer que,\n"
+"ao desabilitar a extensão win32text e habilitar a eol, seus filtros ainda\n"
+"irão funcionar. Você só precisará desses filtros até preparar um arquivo\n"
+"``.hgeol``."
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+"Os ganchos ``win32text.forbid*`` fornecidos pela extensão win32text\n"
+"foram unificados em um único gancho chamado ``eol.checkheadshook``. Esse\n"
+"gancho procura pela configuração de quebra de linha no arquivo\n"
+"``.hgeol``, de modo que você precisa migrar para um arquivo\n"
+"``.hgeol`` para poder usar o gancho. Lembre-se de habilitar a\n"
+"extensão eol no repositório onde você tiver instalado o gancho.\n"
+"``eol.checkheadshook`` verifica apenas cabeças; revisões intermediárias\n"
+"inválidas serão enviadas. Para proibi-las completamente, use o gancho\n"
+"``eol.checkallhook``. Estes ganchos são mais eficazes como ganchos\n"
+"``pretxnchangegroup``."
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+"Veja :hg:`help patterns` para mais informações sobre os padrões de nome de\n"
+"arquivo usados.\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "ignorado estilo de quebra de linha desconhecido '%s' de %s\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr "aviso: arquivo .hgeol ignorado por erro de leitura em %s: %s\n"
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s em %s não deveria ter quebras de linha %s"
+
+msgid "end-of-line check failed:\n"
+msgstr "a verificação de quebras de linha falhou:\n"
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "a extensão eol é incompatível com a extensão win32text\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "estilo de quebra de linha inconsistente em %s\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr "comando que usa programas externos para comparar revisões"
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+"A extensão extdiff do Mercurial permite o uso de programas externos\n"
+"para comparar revisões ou revisões e a cópia local. Os programas de\n"
+"diff externos são chamados com um conjunto configurável de opções e\n"
+"dois argumentos: caminhos para diretórios contendo cópias temporárias\n"
+"dos arquivos a serem comparados."
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+"A extensão extdiff também permite a você configurar novos comandos\n"
+"de diff, de modo que você não precise sempre digitar\n"
+":hg:`extdiff -p kdiff3`. ::"
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+" [extdiff]\n"
+" # adiciona um novo comando que executa o GNU diff(1) em modo\n"
+" # 'context diff'\n"
+" cdiff = gdiff -Nprc5\n"
+" ## ou do modo antigo:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # adiciona um novo comando chamado vdiff, executa o kdiff3\n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+" # adiciona um novo comando chamado meld, executa o meld\n"
+" # (não é necessário nomeá-lo duas vezes)\n"
+" meld ="
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+msgstr ""
+" # adiciona um novo comando chamado vimdiff, executa gvimdiff\n"
+" # com o plugin DirDiff\n"
+" #(veja http://www.vim.org/scripts/script.php?script_id=102)\n"
+" # Esteja certo de colocar \"let g:DirDiffDynamicDiffText = 1\"\n"
+" # em seu .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+"Parâmetros de ferramentas podem incluir variáveis que são expandidas durante"
+" a execução::"
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+" $parent1, $plabel1 - nome de arquivo, rótulo descritivo do primeiro pai\n"
+" $child, $clabel - nome de arquivo, rótulo descritivo da revisão filha\n"
+" $parent2, $plabel2 - nome de arquivo, rótulo descritivo do segundo pai\n"
+" $root - raiz do repositório\n"
+" $parent é um apelido para $parent1."
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+"A extensão extdiff irá ler configurações nas seções [diff-tools] e\n"
+"[merge-tools] para determinar os parâmetros das ferramentas de diff,\n"
+"se nenhum for especificado em [extdiff]."
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+"Você pode usar -I/-X e uma lista de nomes de arquivos ou diretórios\n"
+"como no comando :hg:`diff` normal. A extensão extdiff faz cópias\n"
+"temporárias apenas dos arquivos necessários, de modo que a execução\n"
+"do diff externo seja rápida (ao menos mais rápida que comparar a\n"
+"árvore completa).\n"
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr "fazendo fotografia de %d arquivos da revisão %s\n"
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr "fazendo fotografia de %d arquivos do diretório de trabalho\n"
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "não é possível especificar simultaneamente --rev e --change"
+
+msgid "cleaning up temp directory\n"
+msgstr "limpando o diretório temporário\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr "usa um programa externo para exibir diffs do repositório ou arquivos"
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+" Mostra diferenças entre revisões para os arquivos especificados,\n"
+" usando um programa externo. O programa padrão usado é o diff, com\n"
+" as opções padrão \"-Npru\"."
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+" Para selecionar um programa diferente, use a opção -p/--program.\n"
+" Ao programa serão passados os nomes de dois diretórios para\n"
+" comparar. Para passar opções adicionais para o programa, use a\n"
+" opção -o/--option. Estas serão passadas antes dos nomes dos\n"
+" diretórios a serem comparados."
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+" Quando dois argumentos de revisão forem dados, são exibidas as\n"
+" mudanças entre essas revisões. Se apenas uma revisão for\n"
+" especificada, tal revisão será comparada com o diretório de\n"
+" trabalho, e se nenhuma revisão for especificada, os arquivos do\n"
+" diretório de trabalho serão comparados com seu pai."
+
+msgid "CMD"
+msgstr "COMANDO"
+
+msgid "comparison program to run"
+msgstr "programa de comparação a executar"
+
+msgid "OPT"
+msgstr "OPÇÃO"
+
+msgid "pass option to comparison program"
+msgstr "passa opções para o programa de comparação"
+
+msgid "revision"
+msgstr "revisão"
+
+msgid "change made by revision"
+msgstr "mudança feita pela revisão"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [OPÇÃO]... [ARQUIVO]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr "usa %(path)s para exibir diffs do repositório ou arquivos"
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+" Mostra diferenças entre revisões para os arquivos especificados,\n"
+" usando o programa %(path)s."
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [OPÇÃO]... [ARQUIVO]..."
+
+msgid "http authentication with factotum"
+msgstr "autenticação http com factotum"
+
+msgid ""
+"This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
+"platforms to provide authentication information for HTTP access. Configuration\n"
+"entries specified in the auth section as well as authentication information\n"
+"provided in the repository URL are fully supported. If no prefix is specified,\n"
+"a value of \"*\" will be assumed."
+msgstr ""
+"Esta extensão permite que o recurso factotum(4) nas plataformas\n"
+"Plan 9 from Bell Labs forneçam informação de autenticação para\n"
+"acesso HTTP. Entradas de configuração especificadas na seção\n"
+"auth bem como informações de autenticação fornecidas na URL do\n"
+"repositório são inteiramente suportadas. Se nenhum prefixo for\n"
+"especificado, assume-se o valor ``*``."
+
+msgid "By default, keys are specified as::"
+msgstr "Por padrão, as chaves são especificadas da seguinte maneira::"
+
+msgid ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"Se a extensão factotum for incapaz de ler a chave exigida, uma chave\n"
+"será solicitada interativamente."
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"A seção de configuração factotum pode ser usada para customização do\n"
+"comportamento da extensão. Por padrão, estas entradas são::"
+
+msgid ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+msgstr ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"A entrada executable define o caminho completo para o binário\n"
+"factotum. A entrada mountpoint define o caminho para o serviço de\n"
+"arquivos do factotum. Por fim, a entrada service controla o nome do\n"
+"serviço usado ao ler chaves."
+
+msgid "factotum not interactive"
+msgstr "factotum não é interativo"
+
+msgid "factotum not responding"
+msgstr "factotum não está respondendo"
+
+msgid "pull, update and merge in one command (DEPRECATED)"
+msgstr "pull, update e merge em um comando (OBSOLETA)"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr "traz mudanças de um repositório remoto, mesclando se necessário"
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" Este comando localiza todas as mudanças do repositório na URL ou\n"
+" caminho especificado e as adiciona ao repositório local."
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+" Se as mudanças trazidas adicionarem uma nova cabeça de ramo, essa\n"
+" cabeça será automaticamente mesclada, e o resultado da mesclagem\n"
+" será consolidado. Caso contrário, o diretório de trabalho será\n"
+" atualizado para incluir as novas mudanças."
+
+msgid ""
+" When a merge is needed, the working directory is first updated to\n"
+" the newly pulled changes. Local changes are then merged into the\n"
+" pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+" Quando uma mesclagem é necessária, o diretório de trabalho será\n"
+" inicialmente atualizado para as revisões recém trazidas. As\n"
+" revisões locais serão então mescladas com as novas revisões.\n"
+" Para mudar essa ordem de mesclagem, use --switch-parent."
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Veja :hg:`help dates` para obter uma lista de todos os formatos\n"
+" válidos para -d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso.\n"
+" "
+
+msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"o diretório de trabalho não está na tip do ramo (use \"hg update\" para "
+"obter a tip do ramo)"
+
+msgid "outstanding uncommitted merge"
+msgstr "mesclagem não consolidada pendente"
+
+msgid "outstanding uncommitted changes"
+msgstr "alterações não consolidadas pendentes"
+
+msgid "working directory is missing some files"
+msgstr "estão faltando alguns arquivos no diretório de trabalho"
+
+msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr "múltiplas cabeças nesse ramo (use \"hg heads .\" e \"hg merge\" para mesclar"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "trazendo revisões de %s\n"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"o outro repositório não suporta busca por revisão, portanto uma revisão não "
+"pode ser especificada."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg "
+"merge\" to merge them)\n"
+msgstr ""
+"não mesclando com %d outras novas cabeças de ramo (use \"hg heads .\" e \"hg"
+" merge\" para mesclá-las)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "atualizando para %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "mesclando com %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr "nova revisão %d:%s mescla alterações remotas com local\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "uma revisão específica que você gostaria de trazer"
+
+msgid "edit commit message"
+msgstr "editar mensagem de consolidação"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "editar mensagem de consolidação (OBSOLETO)"
+
+msgid "switch parents when merging"
+msgstr "troca de pais quando mesclando"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [ORIGEM]"
+
+msgid "commands to sign and verify changesets"
+msgstr "comando para assinar e verificar revisões"
+
+msgid "error while verifying signature"
+msgstr "erro verificando assinatura"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "Assinatura %s ruim de \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Nota: A assinatura expirou (assinado por: \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Nota: Esta chave expirou (assinada por: \"%s\")\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "lista as revisões assinadas"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "nó %s:%d não existe\n"
+
+msgid "hg sigcheck REV"
+msgstr "hg sigcheck REV"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+"verifica todas as assinaturas que podem existir para uma revisão em "
+"particular"
+
+#, python-format
+msgid "no valid signature for %s\n"
+msgstr "nenhuma assinatura válida para %s\n"
+
+msgid "make the signature local"
+msgstr "torna a assinatura local"
+
+msgid "sign even if the sigfile is modified"
+msgstr "assina mesmo se o arquivo de assinatura está modificado"
+
+msgid "do not commit the sigfile after signing"
+msgstr "não consolida o arquivo de assinaturas após assinar"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "o id da chave com a qual assinar"
+
+msgid "TEXT"
+msgstr "TEXTO"
+
+msgid "commit message"
+msgstr "mensagem de consolidação"
+
+msgid "hg sign [OPTION]... [REV]..."
+msgstr "hg sign [OPÇÃO]... [REV]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "adiciona uma assinatura para a revisão atual ou pedida"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Se não for dada uma versão, será usado o pai do diretório de\n"
+" trabalho, ou a tip se o diretório de trabalho não estiver em\n"
+" nenhuma revisão."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Veja :hg:`help dates` para uma lista de formatos válidos para\n"
+" -d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr "mesclagem não consolidada - por favor forneça uma revisão específica"
+
+#, python-format
+msgid "signing %d:%s\n"
+msgstr "assinando %d: %s\n"
+
+msgid "error while signing"
+msgstr "erro ao assinar"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use "
+"--force)"
+msgstr ""
+"a cópia de trabalho de .hgsigs foi mudada (por favor consolide .hgsigs "
+"manualmente ou use --force)"
+
+msgid "unknown signature version"
+msgstr "versão de assinatura desconhecida"
+
+msgid "command to view revision graphs from a shell"
+msgstr "comando para exibir grafos de revisão em terminais modo texto"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"Esta extensão adiciona uma opção --graph aos comandos incoming,\n"
+"outgoing e log. Quando esta opção for passada, também será mostrada\n"
+"uma representação ASCII do grafo de revisões.\n"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"acompanha histórico de revisões, ou histórico de arquivo através de cópias e"
+" renomeações"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "acompanha apenas o primeiro pai de revisões de mesclagem (OBSOLETO)"
+
+msgid "show revisions matching date spec"
+msgstr "mostra revisões que casem com a especificação de data"
+
+msgid "show copied files"
+msgstr "mostra arquivos copiados"
+
+msgid "do case-insensitive search for a given text"
+msgstr "faz uma busca insensível a maiúsculas / minúsculas por um texto dado"
+
+msgid "show the specified revision or range"
+msgstr "mostra a revisão ou sequência de revisões especificada"
+
+msgid "include revisions where files were removed"
+msgstr "inclui revisões nas quais arquivos foram removidos"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "mostra apenas mesclagens (OBSOLETO)"
+
+msgid "USER"
+msgstr "USUÃRIO"
+
+msgid "revisions committed by user"
+msgstr "revisões de autoria do usuário"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "mostra apenas revisões dentro do ramo nomeado especificado (OBSOLETA)"
+
+msgid "BRANCH"
+msgstr "RAMO"
+
+msgid "show changesets within the given named branch"
+msgstr "mostra apenas revisões dentro do ramo nomeado especificado"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "não exibe revisão ou qualquer de seus ancestrais"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "exibe revisões ocultas (OBSOLETO)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPÇÃO]... [ARQUIVO]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "mostra histórico de revisões ao lado de um grafo ASCII de revisões"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+" Imprime um histórico de revisões ao lado de um grafo de revisões\n"
+" desenhado com caracteres ASCII."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Nós impressos como um caractere @ são pais do diretório de\n"
+" trabalho.\n"
+" "
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr "ganchos para integração com o serviço de notificação CIA.vc"
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+"Isto deve ser executado como um gancho changegroup ou incoming.\n"
+"Para configurá-lo, defina as seguintes opções em seu hgrc::"
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+" [cia]\n"
+" # seu nome de usuário CIA registrado\n"
+" user = foo\n"
+" # o nome do projeto CIA\n"
+" project = foo\n"
+" # o módulo (subprojeto) (opcional)\n"
+" #module = foo\n"
+" # Anexa um diffstat à mensagem de log (opcional)\n"
+" #diffstat = False\n"
+" # Modelo a ser usado em mensagens de log (opcional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Estilo a ser usado (opcional)\n"
+" #style = foo\n"
+" # A URL do serviço de notificação CIA (opcional)\n"
+" # Você pode usar URLs mailto: para enviar por e-mail, por exemplo\n"
+" # mailto:cia@cia.vc\n"
+" # Certifique-se de definir email.from se você fizer isso.\n"
+" #url = http://cia.vc/\n"
+" # imprime a mensagem ao invés de enviá-la (opcional)\n"
+" #test = False\n"
+" # número de barras a serem removidas de caminhos url\n"
+" #strip = 0"
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+" [hooks]\n"
+" # use um destes:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+" [web]\n"
+" # Se você desejar hyperlinks (opcional)\n"
+" baseurl = http://server/path/to/repo\n"
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s devolveu um erro: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: enviando atualização para %s\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "email.from deve estar definido ao enviar por e-mail"
+
+msgid "browse the repository in a graphical way"
+msgstr "visualiza o repositório em modo gráfico"
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+"A extensão hgk permite visualizar o histórico de um repositório\n"
+"graficamente. Ela requer o Tcl/Tk versão 8.4 ou posterior. (Tcl/Tk\n"
+"não é distribuído com o Mercurial.)"
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+"hgk consiste de duas partes: um script Tcl que faz a exibição e\n"
+"consulta de informações, e uma extensão do Mercurial chamada hgk.py,\n"
+"que provê ganchos para o hgk obter informações. O hgk pode ser\n"
+"encontrado no diretório contrib, e o hgk.py pode ser encontrado no\n"
+"diretório hgext (e precisa ser habilitado)."
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+"O comando :hg:`view` irá lançar o script Tcl hgk. Para esse comando\n"
+"funcionar, hgk deve estar em seu caminho de busca. Alternativamente,\n"
+"você pode especificar o caminho para o hgk em seu arquivo de\n"
+"configuração::"
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/localização/do/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+"O hgk pode usar a extensão extdiff para visualizar revisões.\n"
+"Assumindo que você já configurou o comando vdiff da extdiff, basta\n"
+"adicionar::"
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+"Os menus de contexto das revisões vão agora mostrar entradas\n"
+"adicionais para disparar o vdiff em revisões selecionadas.\n"
+
+msgid "diff trees from two commits"
+msgstr "calcula a diferença entre duas revisões"
+
+msgid "output common ancestor information"
+msgstr "exibe informação de ancestral comum"
+
+msgid "cat a specific revision"
+msgstr "copia para a saída uma revisão específica"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: tipo ou revisão não fornecido\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "abortando; hg cat-file entende apenas commits\n"
+
+msgid "parse given revisions"
+msgstr "decodifica as revisões dadas"
+
+msgid "print revisions"
+msgstr "imprime as revisões"
+
+msgid "print extension options"
+msgstr "imprime opções da extensão"
+
+msgid "start interactive history viewer"
+msgstr "inicia um visualizador de histórico interativo"
+
+msgid "NUM"
+msgstr "NÚMERO"
+
+msgid "limit number of changes displayed"
+msgstr "número limite de mudanças exibidas"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l LIMITE] [SEQUÊNCIADEREVISÕES]"
+
+msgid "generate patch"
+msgstr "gera patch"
+
+msgid "recursive"
+msgstr "recursivo"
+
+msgid "pretty"
+msgstr "bonito"
+
+msgid "stdin"
+msgstr "stdin"
+
+msgid "detect copies"
+msgstr "detecta cópias"
+
+msgid "search"
+msgstr "procura"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [OPÇÃO]... NÓ1 NÓ2 [ARQUIVO]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [OPÇÃO]... TIPO ARQUIVO"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr "hg debug-merge-base REV REV"
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "ignorado"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse REV"
+
+msgid "header"
+msgstr "cabeçalho"
+
+msgid "topo-order"
+msgstr "ordem topológica"
+
+msgid "parents"
+msgstr "pais"
+
+msgid "max-count"
+msgstr "número máximo"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [OPÇÃO]... REV..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "realce de sintaxe para o hgweb (requer Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"Esta extensão depende da biblioteca Pygments de realce de sintaxe:\n"
+"http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "Há uma única opção de configuração::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <estilo>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "O padrão é 'colorful'.\n"
+
+msgid "interactive history editing"
+msgstr "edição interativa de histórico"
+
+msgid ""
+"With this extension installed, Mercurial gains one new command: histedit. Usage\n"
+"is as follows, assuming the following history::"
+msgstr ""
+"Com essa extensão instalada, o Mercurial ganha um novo comando: histedit.\n"
+"O uso é como a seguir, assumindo o seguinte histórico::"
+
+msgid ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you were to run ``hg histedit c561b4e977df``, you would see the following\n"
+"file open in your editor::"
+msgstr ""
+"Se você fosse rodar ``hg histedit c561b4e977df``, você veria o seguinte\n"
+"arquivo aberto no seu editor::"
+
+msgid ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+msgstr ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+
+msgid ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+msgstr ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+
+msgid ""
+"In this file, lines beginning with ``#`` are ignored. You must specify a rule\n"
+"for each revision in your history. For example, if you had meant to add gamma\n"
+"before beta, and then wanted to add delta in the same revision as beta, you\n"
+"would reorganize the file to look like this::"
+msgstr ""
+"Nesse arquivo, linhas que começam com ``#`` são ignoradas. Você deve\n"
+"especificar uma regra para cada revisão no seu histórico. Por exemplo,\n"
+"para alterar o histórico para adicionar gama antes de beta, e acrescentar\n"
+"delta na mesma revisão que beta, você reorganizaria o arquivo para ficar\n"
+"da seguinte forma:"
+
+msgid ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+msgstr ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+
+msgid ""
+"At which point you close the editor and ``histedit`` starts working. When you\n"
+"specify a ``fold`` operation, ``histedit`` will open an editor when it folds\n"
+"those revisions together, offering you a chance to clean up the commit message::"
+msgstr ""
+"Em seguida, no momento em que você fechar o editor, o 'histedit'\n"
+"começará a funcionar.\n"
+"Quando você especificar a operação ``fold``(incorporar), ``histedit``\n"
+"abrirá um editor ao incorporar as revisões, oferecendo a você\n"
+"uma chance de limpar a mensagem de consolidação::"
+
+msgid ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+msgstr ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+
+msgid ""
+"Edit the commit message to your liking, then close the editor. For\n"
+"this example, let's assume that the commit message was changed to\n"
+"``Add beta and delta.`` After histedit has run and had a chance to\n"
+"remove any old or temporary revisions it needed, the history looks\n"
+"like this::"
+msgstr ""
+"Edite a mensagem de consolidação, e feche o editor.\n"
+"Para esse exemplo, vamos assumir que a mensagem\n"
+"foi mudada para ``Add beta and delta.``Depois que o histedit for\n"
+"executado, e tiver removido quaisquer revisões velhas ou temporárias\n"
+"de que necessitava, o histórico se parecerá com o seguinte::"
+
+msgid ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"Note that ``histedit`` does *not* remove any revisions (even its own temporary\n"
+"ones) until after it has completed all the editing operations, so it will\n"
+"probably perform several strip operations when it's done. For the above example,\n"
+"it had to run strip twice. Strip can be slow depending on a variety of factors,\n"
+"so you might need to be a little patient. You can choose to keep the original\n"
+"revisions by passing the ``--keep`` flag."
+msgstr ""
+"Note que ``histedit`` *não* remove qualquer revisão (até mesmo\n"
+"as temporárias) até completar todas as operações de edição, então\n"
+"provavelmente ele irá realizar diversas operações de remoção\n"
+"quando for terminado. Para o exemplo acima, ele teve que executar\n"
+"a remoção duas vezes. Dependendo de uma variedade de fatores, a\n"
+"remoção pode ser lenta, então você pode precisar ser um pouco\n"
+"paciente. Você pode escolher manter as revisões originais passando\n"
+"o parâmetro ``--keep``."
+
+msgid ""
+"The ``edit`` operation will drop you back to a command prompt,\n"
+"allowing you to edit files freely, or even use ``hg record`` to commit\n"
+"some changes as a separate commit. When you're done, any remaining\n"
+"uncommitted changes will be committed as well. When done, run ``hg\n"
+"histedit --continue`` to finish this step. You'll be prompted for a\n"
+"new commit message, but the default commit message will be the\n"
+"original message for the ``edit`` ed revision."
+msgstr ""
+"A operação de edição (``edit``) irá conduzi-lo de volta ao prompt de comando,\n"
+"permitindo que você edite arquivos livremente, ou mesmo use ``hg record``\n"
+"para consolidar algumas mudanças como uma consolidação separada. Quando\n"
+"você acabar, qualquer mudança restante não consolidada também será\n"
+"consolidada. Quando terminado, execute ``hg histedit --continue`` para\n"
+"finalizar essa etapa. Você será consultado interativamente para uma nova\n"
+"mensagem de consolidação, mas o texto da mensagem original será incluído\n"
+"na edição."
+
+msgid ""
+"The ``message`` operation will give you a chance to revise a commit\n"
+"message without changing the contents. It's a shortcut for doing\n"
+"``edit`` immediately followed by `hg histedit --continue``."
+msgstr ""
+"A operação de mensagem ( ``message``) irá dar a você a chance de\n"
+"revisar uma mensagem de consolidação sem mudar o conteúdo. É um\n"
+"atalho para fazer ``edit`` e imediatamente em seguida fazer\n"
+"``hg histedit --continue``."
+
+msgid ""
+"If ``histedit`` encounters a conflict when moving a revision (while\n"
+"handling ``pick`` or ``fold``), it'll stop in a similar manner to\n"
+"``edit`` with the difference that it won't prompt you for a commit\n"
+"message when done. If you decide at this point that you don't like how\n"
+"much work it will be to rearrange history, or that you made a mistake,\n"
+"you can use ``hg histedit --abort`` to abandon the new changes you\n"
+"have made and return to the state before you attempted to edit your\n"
+"history."
+msgstr ""
+"Se ``histedit`` encontrar um conflito ao mover uma revisão\n"
+"(ao executar ``pick`` ou ``fold``), ela parará de uma maneira\n"
+"similar a ``edit``, mas não solicitará uma mensagem de consolidação\n"
+"ao encerrar. Se nesse ponto você mudar de ideia a respeito da\n"
+"reorganização do histórico, você pode usar ``hg histedit --abort``\n"
+"para abandonar as novas mudanças e retornar ao estado anterior\n"
+"à tentativa de edição de histórico."
+
+msgid ""
+"If we clone the example repository above and add three more changes, such that\n"
+"we have the following history::"
+msgstr ""
+"Se clonarmos o repositório de exemplo acima e adicionarmos mais\n"
+"três mudanças, de modo que tenhamos o seguinte histórico::"
+
+msgid ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you run ``hg histedit --outgoing`` on the clone then it is the same\n"
+"as running ``hg histedit 836302820282``. If you need plan to push to a\n"
+"repository that Mercurial does not detect to be related to the source\n"
+"repo, you can add a ``--force`` option.\n"
+msgstr ""
+"Rodar ``hg histedit --outgoing`` no clone será o mesmo que rodar\n"
+"``hg histedit 836302820282``. Caso você pretenda enviar revisões para\n"
+"um repositório que o Mercurial detectar como não relacionado ao de\n"
+"origem, você pode adicionar uma opção ``--force``.\n"
+
+msgid "cannot edit history that would orphan nodes"
+msgstr "não é possível editar histórico de forma a produzir nós órfãos"
+
+msgid "can't edit history with merges"
+msgstr "não se pode editar histórico contendo mesclagens"
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: revisão vazia"
+
+msgid "Fix up the change and run hg histedit --continue"
+msgstr "Conserte a mudança e execute hg histedit --continue"
+
+msgid ""
+"Make changes as needed, you may commit or record as needed now.\n"
+"When you are finished, run hg histedit --continue to resume."
+msgstr ""
+"Faça mudanças conforme for necessário, consolidando ou gravando usando record.\n"
+"Quando tiver terminado, execute hg histedit --continue para retomar."
+
+msgid "Read history edits from the specified file."
+msgstr "Lê alterações de histórico a partir do arquivo especificado."
+
+msgid "continue an edit already in progress"
+msgstr "continua uma edição em progresso"
+
+msgid "don't strip old nodes after edit is complete"
+msgstr "não remove nós antigos após o término da edição"
+
+msgid "abort an edit in progress"
+msgstr "aborta uma edição de histórico em andamento"
+
+msgid "changesets not found in destination"
+msgstr "revisões não encontradas no destino"
+
+msgid "force outgoing even for unrelated repositories"
+msgstr "força outgoing mesmo para repositórios não relacionados"
+
+msgid "first revision to be edited"
+msgstr "primeira revisão a ser editada"
+
+msgid "[PARENT]"
+msgstr "[PAI]"
+
+msgid ""
+"interactively edit changeset history\n"
+" "
+msgstr ""
+"edição interativa de histórico de revisões\n"
+" "
+
+msgid "source has mq patches applied"
+msgstr "a origem tem patches mq aplicados"
+
+msgid "only one repo argument allowed with --outgoing"
+msgstr "apenas um repositório pode ser usado com --outgoing"
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "comparando com %s\n"
+
+msgid "--force only allowed with --outgoing"
+msgstr "--force só é permitido com --outgoing"
+
+msgid "no arguments allowed with --continue"
+msgstr "--continue não recebe argumentos adicionais"
+
+msgid "no arguments allowed with --abort"
+msgstr "--abort não recebe argumentos adicionais"
+
+msgid "history edit already in progress, try --continue or --abort"
+msgstr ""
+"uma edição de histórico já está em progresso, tente --continue ou --abort"
+
+msgid "histedit requires exactly one parent revision"
+msgstr "histedit requer exatamente uma revisão pai"
+
+msgid "histedit: Should update metadata for the following changes:\n"
+msgstr "histedit: Deve atualizar metadados para as seguintes mudanças:\n"
+
+#, python-format
+msgid "histedit: %s to %s\n"
+msgstr "histedit: %s a %s\n"
+
+#, python-format
+msgid "histedit: moving bookmarks %s\n"
+msgstr "histedit: movendo marcadores %s\n"
+
+msgid "must specify a rule for each changeset once"
+msgstr "é necessário especificar uma vez uma regra para cada revisão"
+
+#, python-format
+msgid "malformed line \"%s\""
+msgstr "linha malformada \"%s\""
+
+msgid "may not use changesets other than the ones listed"
+msgstr "não é possível usar revisões além das listadas"
+
+#, python-format
+msgid "unknown changeset %s listed"
+msgstr "revisão desconhecida %s listada"
+
+#, python-format
+msgid "unknown action \"%s\""
+msgstr "ação desconhecida \"%s\""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr "acelera informações de status usando o serviço inotify do Linux"
+
+msgid "start an inotify server for this repository"
+msgstr "inicia um servidor inotify para este repositório"
+
+msgid "debugging information for inotify extension"
+msgstr "informação de depuração para a extensão inotify"
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+" Imprime a lista de diretórios monitorados pelo servidor inotify.\n"
+" "
+
+msgid "directories being watched:\n"
+msgstr "diretórios monitorados:\n"
+
+msgid "run server in background"
+msgstr "executa o servidor em segundo plano"
+
+msgid "used internally by daemon mode"
+msgstr "usado internamente pelo modo daemon"
+
+msgid "minutes to sit idle before exiting"
+msgstr "minutos a aguardar antes de sair"
+
+msgid "name of file to write process ID to"
+msgstr "nome do arquivo no qual escrever o ID do processo"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [OPÇÃO]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+"inotify-client: encontrado socket de um servidor inotify morto; removendo\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-client: não foi possível iniciar servidor inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+"inotify-client: não foi possível falar com o novo servidor inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-client: falha ao contatar servidor inotify: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-client: resposta vazia recebida do servidor inotify"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+"(inotify: recebida resposta de uma versão de servidor incompatível %d)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: recebida resposta '%s' quando '%s' era esperada)\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "esse sistema parece não suportar inotify"
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr "*** o limite atual por usuário do número de inotify watches é %s\n"
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+"*** este limite é muito baixo para acompanhar cada diretório neste "
+"repositório\n"
+
+msgid "*** counting directories: "
+msgstr "*** contando diretórios: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "encontrado %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr "*** para elevar o limite de %d para %d (rode como root):\n"
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+"impossível observar %s até que o limite de observação do inotify seja "
+"alcançado"
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "serviço inotify indisponível: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "observando %r\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "observando diretórios sobre %r\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "evento %s: criado %s\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "evento %s: cancelado %s\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "evento %s: modificado %s\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "sistema de arquivos contendo %s foi desmontado\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s legível: %d bytes\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr "%s abaixo do limiar - removendo o registro\n"
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr "%s lendo %d eventos\n"
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr "%s registrando novamente com %d bytes legíveis\n"
+
+msgid "finished setup\n"
+msgstr "setup encerrado\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "situação: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr "varrendo novamente por mudança no .hgignore\n"
+
+msgid "cannot start: socket is already bound"
+msgstr "não é possível iniciar: o socket já está associado"
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but "
+".hg/inotify.sock already exists"
+msgstr ""
+"não é possível iniciar: tentou lincar .hg/inotify.sock para um socket "
+"temporário mas .hg/inotify.sock já existe"
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr "respondendo consulta para %r\n"
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr "recebida consulta de versão de cliente incompatível %d\n"
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "tipo de consulta não reconhecido: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr "expande expressões no changelog e sumários"
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+"Esta extensão permite o uso de uma sintaxe especial em sumários,\n"
+"que será expandida automaticamente para links ou qualquer outra\n"
+"expressão arbitrária, de modo muito semelhante ao que o InterWiki\n"
+"faz."
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+"Alguns exemplos de padrões (link para bug tracking, etc.) que podem\n"
+"ser usados em seu hgrc::"
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr "interhg: padrão inválido para %s: %s\n"
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr "interhg: expressão regular inválida para %s: %s\n"
+
+msgid "expand keywords in tracked files"
+msgstr "expande palavras chave em arquivos rastreados"
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+"Esta extensão expande palavras chave RCS/CVS ou customizáveis\n"
+"($Keywords$) em arquivos texto rastreados selecionados em sua\n"
+"configuração."
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+"Palavras chave são expandidas apenas em repositórios locais e não\n"
+"são guardadas no histórico de mudanças. O mecanismo pode ser\n"
+"considerado como uma conveniência para o usuário local ou para\n"
+"distribuição em arquivos."
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+"Palavras chave expandem para os dados da revisão correspondentes\n"
+"à última mudança relativa ao pai do diretório de trabalho de cada\n"
+"arquivo."
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+"A configuração é feita nas seções [keyword], [keywordset] e [keywordmaps]\n"
+"de arquivos hgrc."
+
+msgid "Example::"
+msgstr "Exemplo::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+" [keyword]\n"
+" # expande palavras chave em todo arquivo python exceto\n"
+" # naqueles que casarem com \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+" [keywordset]\n"
+" # prefira mapeamentos padrão do svn ao invés do cvs\n"
+" svn = True"
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+".. note::\n"
+" Quanto mais específico você for em seus padrões de arquivo,\n"
+" menos velocidade será perdida em repositórios muito grandes."
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+"Para uma demonstração da expansão e do mapeamento de modelos em\n"
+"[keywordmaps] execute :hg:`kwdemo`. Veja :hg:`help templates`\n"
+"para uma lista dos modelos e filtros disponíveis."
+
+msgid "Three additional date template filters are provided:"
+msgstr "Três filtros de modelos de data adicionais são fornecidos:"
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+"Os mapeamentos de modelo padrões (veja com :hg:`kwdemo -d`) podem\n"
+"ser substituídos com palavras chave personalizáveis e modelos.\n"
+"Novamente, execute :hg:`kwdemo` para controlar os resultados de\n"
+"suas mudanças na configuração."
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+"Antes de mudar ou desabilitar palavras chave ativas, você deve executar\n"
+":hg:`kwshrink` para evitar o armazenamento de palavras chave expandidas\n"
+"no histórico."
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+"Para forçar a expansão após habilitação, ou após uma mudança de\n"
+"configuração, execute :hg:`kwexpand`."
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+"Expansões que alcancem mais de uma linha, e expansões incrementais\n"
+"como a $Log$ do CVS, não são suportadas. Um modelo de expansão\n"
+"\"Log = {desc}\" expande para a primeira linha da descrição da\n"
+"revisão.\n"
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "sobrescrevendo %s palavras chave em expansão\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr "sobrescrevendo %s palavras chave em redução\n"
+
+msgid "[keyword] patterns cannot match"
+msgstr "padrões [keyword] não podem casar"
+
+msgid "no [keyword] patterns configured"
+msgstr "nenhum padrão [keyword] configurado"
+
+msgid "show default keyword template maps"
+msgstr "exibe os mapas de modelos de teclado padrão"
+
+msgid "read maps from rcfile"
+msgstr "lê o mapeamento do arquivo rc"
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr "hg kwdemo [-d] [-f ARQUIVORC] [MAPADEMODELOS]..."
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr "imprime a configuração [keywordmaps] e um exemplo de expansão"
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+" Mostra os mapeamentos de modelo de palavras chave atual,\n"
+" customizado ou padrão, e suas expansões."
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+" Você pode ampliar a configuração atual especificando mapas como\n"
+" argumentos e usando -f/--rcfile para ler opções de um arquivo\n"
+" hgrc externo adicional."
+
+msgid " Use -d/--default to disable current configuration."
+msgstr " Use -d/--default para desabilitar a configuração atual."
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" Veja :hg:`help templates` para informações sobre modelos e\n"
+" filtros.\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "criando repositório temporário em %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+"\n"
+"\tconfiguração usando mapas de modelo de palavras chave customizados\n"
+
+msgid "\textending current template maps\n"
+msgstr "\texpandindo mapas de modelo atuais\n"
+
+msgid "\toverriding default svn keywordset\n"
+msgstr "\tsobrepondo keywordset padrão do svn\n"
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\tsobrepondo keywordset padrão do cvs\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+"\n"
+"\tconfiguração usando keywordset padrão do svn\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+"\n"
+"\tconfiguração usando keywordset padrão do cvs\n"
+
+msgid "\tdisabling current template maps\n"
+msgstr "\tdesabilitando mapas de modelo atuais\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+"\n"
+"\tconfiguração usando mapas de modelo de palavras chave atuais\n"
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+"\n"
+"palavras chave escritas em %s:\n"
+
+msgid "hg keyword configuration and expansion example"
+msgstr "exemplo de configuração e expansão da extensão keyword"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+"\n"
+"\tpalavras chave expandidas\n"
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [OPÇÃO]... [ARQUIVO]..."
+
+msgid "expand keywords in the working directory"
+msgstr "expande palavras chave no diretório de trabalho"
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr " Execute após (re)habilitar expansão de palavras chave."
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwexpand se recusa a rodar se forem passados arquivos com\n"
+" mudanças locais.\n"
+" "
+
+msgid "show keyword status flags of all files"
+msgstr "mostra indicadores de estado de palavras chave para todos os arquivos"
+
+msgid "show files excluded from expansion"
+msgstr "mostra arquivos excluídos da expansão"
+
+msgid "only show unknown (not tracked) files"
+msgstr "mostra apenas arquivos desconhecidos (não rastreados)"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [OPÇÃO]... [ARQUIVO]..."
+
+msgid "show files configured for keyword expansion"
+msgstr "mostra arquivos configurados para expansão de palavras chave"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+" Lista quais arquivos no diretório de trabalho correspondem a\n"
+" padrões de configuração em [keyword]."
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+" Útil para prevenir expansão indesejada de palavras chave e para\n"
+" acelerar a execução examinando apenas arquivos candidatos à\n"
+" expansão."
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+" Veja :hg:`help keyword` para saber como construir padrões tanto\n"
+" para inclusão como para exclusão de arquivos."
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+" Com -A/--all e -v/--verbose os códigos usados para mostrar o\n"
+" status dos arquivos são::"
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+" K = candidato à expansão de palavras chave\n"
+" k = candidato à expansão de palavras chave (não rastreado)\n"
+" I = ignorado\n"
+" i = ignorado (não rastreado)\n"
+" "
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [OPÇÃO]... [ARQUIVO]..."
+
+msgid "revert expanded keywords in the working directory"
+msgstr "reverte palavras chave expandidas no diretório de trabalho"
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+" Deve ser executado após mudar / desabilitar palavras chave ativas."
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwshrink se recusa a rodar se forem passados arquivos contendo\n"
+" mudanças locais.\n"
+" "
+
+msgid "track large binary files"
+msgstr "rastreia arquivos binários grandes"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+"Arquivos binários grandes tendem a não ser muito comprimíveis,\n"
+"não gerar diffs úteis, e não serem mescláveis. Tais arquivos não\n"
+"são gerenciados de modo eficiente pelo formato de armazenamento do\n"
+"Mercurial (revlog), que se baseia em deltas binários comprimidos;\n"
+"armazenar arquivos binários grandes como arquivos comuns no\n"
+"Mercurial desperdiça banda e espaço em disco e aumenta o uso de\n"
+"memória do Mercurial. A extensão largefiles trata esses problemas\n"
+"adicionando uma camada cliente-servidor centralizada sobre o\n"
+"Mercurial: largefiles se localiza em um *armazenamento central*\n"
+"em algum lugar da rede, e você obtém apenas as revisões necessárias\n"
+"no momento em que são necessárias."
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+"largefiles funciona mantendo um arquivo \"standin\" em .hglf/ para cada\n"
+"largefile. Os arquivos standin são pequenos (41 bytes: um hash SHA-1 e\n"
+"uma quebra de linha) e são rastreados pelo Mercurial. As revisões\n"
+"largefile são identificadas pelo hash SHA-1 de seus conteúdos, que\n"
+"são registrados no standin. largefiles usa tal ID de revisão para \n"
+"obter ou enviar revisões largefile de ou para o armazenamento central.\n"
+"Isto economiza tanto espaço em disco como banda de rede, já que não é\n"
+"necessário obter todas as revisões históricas de arquivos grandes em\n"
+"um clone ou pull."
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+"Para iniciar um novo repositório ou adicionar novos arquivos\n"
+"binários grandes, adicione --large ao seu comando :hg:`add`.\n"
+"Por exemplo::"
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+"Ao enviar uma revisão que adiciona/modifica arquivos grandes para um\n"
+"repositório remoto, sua revisão largefile correspondente será também\n"
+"enviada. Note que o Mercurial remoto também deve ter a extensão\n"
+"largefiles habilitada."
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+"Ao trazer revisões de um repositório remoto que afetam largefiles, o\n"
+"Mercurial se comporta normalmente. No entanto, ao atualizar para tal\n"
+"revisão, quaisquer largefiles necessárias para tal revisão serão\n"
+"baixadas e guardadas em um cache (se elas nunca foram baixadas antes)\n"
+". Isto quer dizer que acesso à rede pode ser necessário para atualizar\n"
+"para revisões que ainda não estiveram no diretório de trabalho."
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+"Se você já tiver arquivos grandes rastreados pelo Mercurial sem a\n"
+"extensão largefiles, será preciso converter seu repositório para se\n"
+"beneficiar da extensão largefiles. Isto é feito usando o comando\n"
+":hg:`lfconvert` ::"
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr " $ hg lfconvert --size 10 oldrepo newrepo"
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+"Em repositórios que já possuem algum largefile, qualquer novo arquivo\n"
+"acima de 10MB será automaticamente adicionado como largefile. Para\n"
+"mudar esse limiar, defina ``largefiles.minsize`` em seu arquivo de\n"
+"configuração do Mercurial para o tamanho mínimo em megabytes para\n"
+"rastrear o arquivo como largefile, ou use a opção --lfsize no comando\n"
+"add (também em megabytes)::"
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+" [largefiles]\n"
+" minsize = 2"
+
+msgid " $ hg add --lfsize 2"
+msgstr " $ hg add --lfsize 2"
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+"A opção de configuração ``largefiles.patterns`` permite especificar\n"
+"uma lista de padrões de nomes de arquivo (veja :hg:`help patterns`)\n"
+"que devam ser sempre tratados como largefiles::"
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size."
+msgstr ""
+"Arquivos que corresponderem a um desses padrões serão adicionados\n"
+"como largefiles sem que seus tamanhos sejam considerados."
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+"As opções de configuração ``largefiles.minsize`` e ``largefiles.patterns``\n"
+"serão ignoradas em qualquer repositório que ainda não contenha um\n"
+"largefile. Para adicionar o primeiro largefile de um repositório,\n"
+"você deve fazê-lo explicitamente passando a opção --large para o\n"
+"comando :hg:`add`.\n"
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "converte um repositório normal em um repositório largefiles"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+" Converte o repositório ORIGEM em um novo repositório DEST,\n"
+" idêntico a ORIGEM exceto por certos arquivos que serão\n"
+" convertidos como largefiles:\n"
+" especificamente, qualquer arquivo que combinar com qualquer\n"
+" PADRÃO *ou* cujo tamanho esteja acima do limiar de tamanho\n"
+" mínimo será convertido como um largefile. O tamanho usado para\n"
+" determinar se o arquivo será rastreado como largefile será o\n"
+" tamanho da primeira versão do arquivo. O tamanho mínimo pode\n"
+" ser especificado usando o parâmetro --size ou a opção de\n"
+" configuração ``largefiles.size``."
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+" Após a execução deste comando, você deve se certificar de\n"
+" que largefiles esteja habilitado em todos os repositórios que\n"
+" receberão revisões do novo repositório."
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+" Use --to-normal para converter largefiles de volta a arquivos\n"
+" normais; após essa conversão, o repositório DEST poderá ser\n"
+" usado normalmente, sem a extensão largefiles."
+
+msgid "getting largefiles"
+msgstr "obtendo largefiles"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "obtendo %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: corrupção de dados (esperado %s, obtido %s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "procurando em %d revisões por largefiles\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr "verificado o conteúdo de %d revisões de %d largefiles\n"
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr "verificada a existência de %d revisões de %d largefiles\n"
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "esquema URL %r não suportado"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "'%s' não parece ser um repositório de largefiles"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s não é um repositório local do Mercurial"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "iniciando destino %s\n"
+
+msgid "converting revisions"
+msgstr "convertendo revisões"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr "o largefile %s renomeado/copiado se tornou um link simbólico"
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr "o largefile %s se tornou um link simbólico"
+
+#, python-format
+msgid "skipping incorrectly formatted tag %s\n"
+msgstr "omitindo etiqueta %s formatada incorretamente\n"
+
+#, python-format
+msgid "skipping incorrectly formatted id %s\n"
+msgstr "omitindo id %s formatado incorretamente\n"
+
+#, python-format
+msgid "no mapping for id %s\n"
+msgstr "nenhum mapeamento para o id %s\n"
+
+msgid "uploading largefiles"
+msgstr "enviando largefiles"
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr "o largefile %s está faltando no repositório (deve ser enviado)"
+
+#, python-format
+msgid "%d additional largefiles cached\n"
+msgstr "%d largefiles adicionados ao cache\n"
+
+#, python-format
+msgid "%d largefiles failed to download\n"
+msgstr "o download de %d largefiles falhou\n"
+
+msgid "getting changed largefiles\n"
+msgstr "obtendo largefiles modificados\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "%d largefiles atualizados, %d removidos\n"
+
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr "o largefile %s não está no cache e não pôde ser baixado"
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr "tamanho mínimo (MB) para arquivos serem convertidos em largefiles"
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr "converte um repositório largefiles em um repositório normal"
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert ORIGEM DEST [ARQUIVO ...]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr "largefiles: o tamanho deve ser um número (e não %s)\n"
+
+msgid "minimum size for largefiles must be specified"
+msgstr "o tamanho mínimo para largefiles deve ser especificado"
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "sistema operacional desconhecido: %s\n"
+
+#, python-format
+msgid "found %s in store\n"
+msgstr "encontrado %s no armazenamento\n"
+
+#, python-format
+msgid "found %s in system cache\n"
+msgstr "encontrado %s no cache do sistema\n"
+
+msgid "can't get file locally"
+msgstr "não é possível obter o arquivo localmente"
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+"revisão %s: %s faltando\n"
+" (procurou pelo hash %s)\n"
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+"revisão %s: %s: o conteúdo é diferente\n"
+" (%s:\n"
+" esperado hash %s,\n"
+" mas obteve %s)\n"
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s já é um largefile\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "adicionando %s como largefile\n"
+
+msgid "no files specified"
+msgstr "nenhum arquivo especificado"
+
+#, python-format
+msgid "not removing %s: %s (use forget to undo)\n"
+msgstr "%s não removido: %s (use forget para desfazer)\n"
+
+msgid "file still exists"
+msgstr "o arquivo já existe"
+
+msgid "file is modified"
+msgstr "o arquivo foi modificado"
+
+msgid "file has been marked for add"
+msgstr "o arquivo foi marcado para adição"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "removendo %s\n"
+
+msgid "--normal cannot be used with --large"
+msgstr "--normal não pode ser usado com --large"
+
+msgid "uncommitted local changes"
+msgstr "alterações locais pendentes"
+
+msgid "&Largefile"
+msgstr "&Largefile"
+
+msgid "&Normal file"
+msgstr "Arquivo &Normal"
+
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+"%s foi transformado em um largefile\n"
+"usar (l)argefile ou manter como arquivo (n)ormal?"
+
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+"%s foi transformado em um arquivo normal\n"
+"manter como (l)argefile ou usar um arquivo (n)ormal?"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "mesclando %s e %s para %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "mesclando %s\n"
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+"largefile %s tem um conflito de mesclagem\n"
+"manter (l)ocal ou usar (o)utro?"
+
+msgid "&Local"
+msgstr "&Local"
+
+msgid "&Other"
+msgstr "&Outra"
+
+msgid "no files to copy"
+msgstr "nenhum arquivo para copiar"
+
+msgid "destination largefile already exists"
+msgstr "largefile de destino já existe"
+
+msgid "caching new largefiles\n"
+msgstr "adicionando novos largefiles ao cache\n"
+
+#, python-format
+msgid "%d largefiles cached\n"
+msgstr "%d largefiles adicionados ao cache\n"
+
+#, python-format
+msgid "--all-largefiles is incompatible with non-local destination %s"
+msgstr "--all-largefiles é incompatível com um destino não-local %s"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "tipo de arquivo '%s' desconhecido"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "não é possível fornecer prefixo ao arquivar para arquivos"
+
+#, python-format
+msgid "largefile %s not found in repo store or system cache"
+msgstr ""
+"largefile %s não encontrado no armazenamento do repositório nem no cache de "
+"sistema"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s não removido: arquivo já não é rastreado\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr "largefiles: Nenhum repositório remoto\n"
+
+msgid "largefiles to upload:\n"
+msgstr "largefiles a serem enviados:\n"
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr "largefiles: %d a serem enviados\n"
+
+msgid "largefile contents do not match hash"
+msgstr "o conteúdo do largefile não combina com o hash"
+
+#, python-format
+msgid "largefiles: failed to put %s into store: %s"
+msgstr "largefiles: não foi possível colocar %s no armazenamento: %s"
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr "largefile %s pedido não está presente no cache"
+
+msgid "remote: "
+msgstr "remoto: "
+
+#, python-format
+msgid "unexpected putlfile response: %s"
+msgstr "resposta inesperada de putlfile: %s"
+
+msgid "putlfile failed:"
+msgstr "putlfile falhou:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "putlfile falhou (resposta inesperada):"
+
+msgid "unexpected response:"
+msgstr "resposta inesperada:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr "remotestore: não foi possível colocar %s no armazenamento remoto %s"
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr "remotestore: %s foi colocado no armazenamento remoto %s"
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "remotestore: não foi possível abrir arquivo %s: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr "remotestore: largefile %s é inválido"
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr "remotestore: largefile %s está faltando"
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "revisão %s: %s: o conteúdo está diferente\n"
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "revisão %s: %s faltando\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+"largefiles: o método %r do repositório parece já ter sido sobreposto\n"
+"por uma outra extensão: largefiles pode se comportar incorretamente\n"
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr "o arquivo \"%s\" é um standin largefile"
+
+msgid "add as largefile"
+msgstr "adiciona como largefile"
+
+msgid "add as normal file"
+msgstr "adiciona como arquivo normal"
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+"adiciona todos os arquivos acima deste tamanho (em megabytes) como "
+"largefiles (padrão: 10)"
+
+msgid "verify largefiles"
+msgstr "verifica largefiles"
+
+msgid "verify all revisions of largefiles not just current"
+msgstr "verifica todas as revisões de largefiles, não apenas a revisão atual"
+
+msgid "verify largefile contents not just existence"
+msgstr "verifica conteúdos de largefiles, não apenas existência"
+
+msgid "display outgoing largefiles"
+msgstr "exibe largefiles a serem enviados"
+
+msgid "download all pulled versions of largefiles"
+msgstr "baixa todas as versões trazidas dos largefiles"
+
+msgid "download all versions of all largefiles"
+msgstr "baixa todas as versões de todos os largefiles"
+
+msgid "manage a stack of patches"
+msgstr "gerencia uma pilha de patches"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Esta extensão lhe permite trabalhar com uma pilha de patches em um\n"
+"repositório do Mercurial. Ela gerencia duas pilhas de patches - todos\n"
+"os patches conhecidos, e patches aplicados (subconjunto dos patches\n"
+"conhecidos.)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Patches conhecidos são representados como arquivos de patch no\n"
+"diretório .hg/patches . Patches aplicados são tanto arquivos de\n"
+"patch como revisões."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Tarefas comuns (use :hg:`help comando` para mais detalhes)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" cria um novo patch qnew\n"
+" importa um patch existente qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" imprime a série de patches qseries\n"
+" imprime patches aplicados qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" adiciona um patch conhecido à pilha de aplicados qpush\n"
+" remove um patch da pilha de aplicados qpop\n"
+" renova o conteúdo do patch aplicado do topo qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"Por padrão, a mq irá automaticamente usar patches git se necessário para\n"
+"evitar perder mudanças de modo de arquivo, registros de cópia, arquivos\n"
+"binários ou criação e remoção de arquivos vazios. Este comportamento pode\n"
+"ser configurado com::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"Se configurada como 'keep', a mq irá obedecer a seção [diff] do arquivo\n"
+"de configuração ao preservar patches git existentes durante um comando\n"
+"qrefresh. Se configurada como 'yes' ou 'no', a mq irá sobrepor a seção\n"
+"[diff] e sempre gerar patches git ou comuns, respectivamente,\n"
+"possivelmente perdendo dados no segundo caso."
+
+msgid ""
+"It may be desirable for mq changesets to be kept in the secret phase (see\n"
+":hg:`help phases`), which can be enabled with the following setting::"
+msgstr ""
+"Pode ser desejável que revisões gerenciadas pela mq sejam mantidas\n"
+"na fase secreta (veja :hg:`help phases`), comportamento que pode ser\n"
+"habilitado com a seguinte configuração::"
+
+msgid ""
+" [mq]\n"
+" secret = True"
+msgstr ""
+" [mq]\n"
+" secret = True"
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command."
+msgstr ""
+"Você gerenciará por padrão uma fila de patches chamada \"patches\". Você\n"
+"pode criar outras filas independentes usando o comando :hg:`qqueue`."
+
+msgid ""
+"If the working directory contains uncommitted files, qpush, qpop and\n"
+"qgoto abort immediately. If -f/--force is used, the changes are\n"
+"discarded. Setting::"
+msgstr ""
+"Se o diretório de trabalho contiver mudanças não consolidadas,\n"
+"qpush, qpop e qgoto abortam imediatamente. Se for usado -f/--force,\n"
+"essas mudanças serão descartadas. A definição::"
+
+msgid ""
+" [mq]\n"
+" keepchanges = True"
+msgstr ""
+" [mq]\n"
+" keepchanges = True"
+
+msgid ""
+"make them behave as if --keep-changes were passed, and non-conflicting\n"
+"local changes will be tolerated and preserved. If incompatible options\n"
+"such as -f/--force or --exact are passed, this setting is ignored.\n"
+msgstr ""
+"faz com que esses comandos se comportem como se --keep-changes\n"
+"tivesse sido passada, e mudanças locais não conflitantes serão\n"
+"toleradas e preservadas. Se forem passadas mudanças incompatíveis\n"
+"como -f/--force ou --exact, esta configuração será ignorada.\n"
+
+msgid "print first line of patch header"
+msgstr "imprime a primeira linha do cabeçalho do patch"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "linha de status da mq malformada: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "a opção mq.git pode ser auto/keep/yes/no mas é %s"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s aparece mais de uma vez em %s"
+
+msgid "guard cannot be an empty string"
+msgstr "uma guarda não pode ser uma string vazia"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "a guarda %r inicia com um caractere inválido: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "caractere inválido na guarda %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "guarda %r muito curta"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "a guarda %r inicia com um caractere inválido"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "permitindo %s - nenhuma guarda em efeito\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "permitindo %s - nenhuma guarda negativa que case\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "permitindo %s - guardada por %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "omitindo %s - guardada por %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "omitindo %s - nenhuma guarda que case\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "erro ao remover desfazimento: %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "gravando versão atual de %s como %s\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "a aplicação do patch %s falhou"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "o patch não funcionou, mesclando %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "update retornou %d"
+
+msgid "repo commit failed"
+msgstr "consolidação no repositório falhou"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "impossível ler %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "o patch %s não existe\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "o patch %s não está aplicado\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "o patch falhou, impossível continuar (tente -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "aplicando %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "impossível ler %s\n"
+
+msgid "local changes found, refresh first"
+msgstr "mudanças locais encontradas, você deve primeiro renovar"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "o patch %s é vazio\n"
+
+msgid "qpush exactly duplicates child changeset"
+msgstr "qpush duplicaria com exatidão uma revisão filha"
+
+msgid "repository commit failed"
+msgstr "consolidação no repositório falhou"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr "o patch falhou, rejeitos deixados no diretório de trabalho\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "discrepância encontrada ao aplicar patch, parando\n"
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "a revisão %s se refere a patches desconhecidos: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "patches desconhecidos: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "a revisão %d não é gerenciada"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "não se pode apagar a revisão %d acima de patches aplicados"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "patch %s finalizado sem a mensagem de revisão\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete exige ao menos uma revisão ou nome de patch"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "não se pode remover o patch %s aplicado"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "o patch %s não está no arquivo series"
+
+msgid "no patches applied"
+msgstr "nenhum patch aplicado"
+
+msgid "working directory revision is not qtip"
+msgstr "a revisão do diretório de trabalho não é a qtip"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "mudanças não consolidadas no sub-repositório %s"
+
+msgid "local changes found"
+msgstr "mudanças locais encontradas"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" não pode ser usado como nome de um patch"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr "o nome do patch não pode começar com \"%s\""
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" não pode ser usado em um nome de patch"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" já existe, e é um diretório"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "o patch \"%s\" já existe"
+
+msgid "cannot use both --force and --keep-changes"
+msgstr "não se pode especificar --force e --keep-changes simultaneamente"
+
+msgid "cannot manage merge changesets"
+msgstr "não se pode gerenciar revisões de mesclagem"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "não é possível escrever o patch \"%s\": %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "erro removendo %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "o nome de patch \"%s\" é ambíguo:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "o patch %s não está na série"
+
+msgid "(working directory not at a head)\n"
+msgstr "(diretório de trabalho não está em uma cabeça)\n"
+
+msgid "no patches in series\n"
+msgstr "nenhum patch na série\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s já está no topo\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "não se pode empilhar para um patch anterior: %s"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "guardado por %s"
+
+msgid "no matching guards"
+msgstr "nenhuma guarda com nome semelhante"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "não se pode empilhar '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "todos os patches estão aplicados nesse momento\n"
+
+msgid "patch series already fully applied\n"
+msgstr "série de patches já completamente aplicada\n"
+
+msgid "cannot use --exact and --keep-changes together"
+msgstr "não se pode especificar --exact e --keep-changes simultaneamente"
+
+msgid "cannot use --exact and --move together"
+msgstr "não se pode especificar --exact e --move simultaneamente"
+
+msgid "cannot push --exact with applied patches"
+msgstr "não se pode fazer qpush usando --exact com patches aplicados"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s não possui um pai armazenado"
+
+msgid "please specify the patch to move"
+msgstr "por favor especifique o patch a ser movido"
+
+msgid "cleaning up working directory..."
+msgstr "limpando diretório de trabalho..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "erros ao aplicar, por favor conserte e renove %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "agora em: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "o patch %s não está aplicado"
+
+msgid "no patches applied\n"
+msgstr "nenhum patch aplicado\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s já está no topo\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: forçando atualização do dirstate\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "tentando desempilhar nó desconhecido %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+"desempilhar removeria uma revisão não gerenciada por esta fila de patches"
+
+msgid "popping would remove an immutable revision"
+msgstr "qpop removeria uma revisão imutável"
+
+msgid "see \"hg help phases\" for details"
+msgstr "veja \"hg help phases\" para mais detalhes"
+
+msgid "deletions found between repo revs"
+msgstr "remoções encontradas entre revisões do repositório"
+
+#, python-format
+msgid "popping %s\n"
+msgstr "desempilhando %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "a fila de patches agora está vazia\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "não se pode renovar uma revisão com filhos"
+
+msgid "cannot refresh immutable revision"
+msgstr "não se pode renovar uma revisão imutável"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"renovação interrompida enquanto o patch foi desempilhado! (revert --all, "
+"qpush para recuperar)\n"
+
+msgid "patch queue directory already exists"
+msgstr "o diretório de fila de patches já existe"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "o patch %s não está no arquivo series"
+
+msgid "no saved patch data found\n"
+msgstr "nenhum dado salvo de patches encontrado\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "restaurando o estado: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr "entrada de salvamento tem filhos, deixando-a como está\n"
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr "removendo entrada de salvamento %s\n"
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr "pais do repositório da fila salvos: %s %s\n"
+
+msgid "updating queue directory\n"
+msgstr "atualizando diretório da fila\n"
+
+msgid "unable to load queue repository\n"
+msgstr "incapaz de carregar o repositório da fila\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr "save: nenhum patch aplicado, saindo\n"
+
+msgid "status is already saved\n"
+msgstr "o estado já foi salvo\n"
+
+msgid "hg patches saved state"
+msgstr "estado de hg patches salvo"
+
+msgid "repo commit failed\n"
+msgstr "consolidação no repositório falhou\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "o patch %s já está no arquivo series"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "opção \"-r\" inválida ao importar arquivos"
+
+msgid "no files or revisions specified"
+msgstr "nenhuma revisão ou arquivo especificados"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "opção \"-n\" inválida ao importar múltiplos patches"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "a revisão %d é raiz de mais de um ramo"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "revisão %d já gerenciada"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "a revisão %d não é o pai da fila"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "a revisão %d tem filhos não gerenciados"
+
+#, python-format
+msgid "revision %d is not mutable"
+msgstr "a revisão %d não é mutável"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "não se pode importar a revisão de mesclagem %d"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "a revisão %d não é pai de %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "-e é incompatível com a importação de -"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "o patch %s não existe"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "renomeando %s para %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr "--name é necessário ao importar um patch de -"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "incapaz de ler arquivo %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "adicionando %s ao arquivo series\n"
+
+msgid "keep patch file"
+msgstr "mantém o arquivo de patch"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "deixa de gerenciar uma revisão (OBSOLETO)"
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [PATCH]..."
+
+msgid "remove patches from queue"
+msgstr "remove patches da fila"
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. Exact\n"
+" patch identifiers must be given. With -k/--keep, the patch files are\n"
+" preserved in the patch directory."
+msgstr ""
+" Os patches não devem estar aplicados, e ao menos um patch deve\n"
+" ser passado. Devem ser fornecidos identificadores exatos para\n"
+" os patches. Com -k/--keep, os arquivos de patch serão\n"
+" preservados no diretório de patches."
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+" Para parar de gerenciar um patch e movê-lo para o histórico\n"
+" permanente, use o comando :hg:`qfinish` ."
+
+msgid "show only the preceding applied patch"
+msgstr "mostra apenas o patch aplicado anterior"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches already applied"
+msgstr "imprime os patches já aplicados"
+
+msgid " Returns 0 on success."
+msgstr " Devolve 0 para indicar sucesso."
+
+msgid "only one patch applied\n"
+msgstr "apenas um patch aplicado\n"
+
+msgid "show only the first patch"
+msgstr "mostra apenas o primeiro patch"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches not yet applied"
+msgstr "imprime os patches ainda não aplicados"
+
+msgid "all patches applied\n"
+msgstr "todos os patches aplicados\n"
+
+msgid "import file in patch directory"
+msgstr "importa um arquivo do diretório de patches"
+
+msgid "NAME"
+msgstr "NOME"
+
+msgid "name of patch file"
+msgstr "nome do arquivo de patch"
+
+msgid "overwrite existing files"
+msgstr "sobrescreve arquivos existentes"
+
+msgid "place existing revisions under mq control"
+msgstr "põe revisões existentes sob controle da mq"
+
+msgid "use git extended diff format"
+msgstr "usa o formato estendido de diff do git"
+
+msgid "qpush after importing"
+msgstr "executa qpush após importar"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
+msgstr "hg qimport [-e] [-n NOME] [-f] [-g] [-P] [-r REV]... [ARQUIVO]..."
+
+msgid "import a patch or existing changeset"
+msgstr "importa um patch ou revisão existente"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" O patch é inserido na série após o último patch aplicado. Se\n"
+" não houver nenhum patch aplicado, qimport adiciona o novo patch\n"
+" no começo da série."
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" O patch terá o mesmo nome que seu arquivo de origem, a não ser\n"
+" que você lhe dê um novo nome usando -n/--name."
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" Você pode registrar um patch já existente no diretório de\n"
+" patches usando a opção -e/--existing."
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+" Com -f/--force, um patch existente de mesmo nome será\n"
+" sobrescrito."
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+" Uma revisão existente pode ser colocada sob o controle da mq\n"
+" com -r/--rev (por exemplo, qimport --rev tip -n patch colocará a\n"
+" tip sob o controle da mq). Com -g/--git, os patches importados\n"
+" com --rev usarão o formato git diff. Veja o tópico de ajuda diff\n"
+" para informações sobre por que isso é importante para preservar\n"
+" informação de cópia e renomeação e mudanças de permissão.\n"
+" Use :hg:`qfinish` para tirar revisões do controle da mq."
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+" Para importar um patch da entrada padrão, passe - como o arquivo\n"
+" do patch. Ao importar da entrada padrão, um nome de patch deve\n"
+" ser especificado usando a opção --name."
+
+msgid " To import an existing patch while renaming it::"
+msgstr " Para importar um patch existente com um novo nome::"
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr " hg qimport -e patch-existente -n novo-nome"
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Devolve 0 se a importação teve sucesso.\n"
+" "
+
+msgid "create queue repository"
+msgstr "cria o repositório da fila"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "cria um novo repositório de fila (OBSOLETO)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" O repositório de fila é por padrão não versionado. Se for\n"
+" especificado -c/--create-repo, qinit criará um repositório\n"
+" separado aninhado para patches (qinit -c pode ser também\n"
+" executado posteriormente para converter um repositório de\n"
+" patches não versionado em um versionado). Você pode usar\n"
+" qcommit para consolidar mudanças neste repositório de fila."
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" Este comando é obsoleto. Sem -c, é subentendido em outros comandos\n"
+" relevantes. E ao invés de -c, use :hg:`init --mq`."
+
+msgid "use pull protocol to copy metadata"
+msgstr "usa o protocolo pull para copiar metadados"
+
+msgid "do not update the new working directories"
+msgstr "não atualiza os novos diretórios de trabalho"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "usa transferência não comprimida (mais rápido em LANs)"
+
+msgid "REPO"
+msgstr "REPOSITÓRIO"
+
+msgid "location of source patch repository"
+msgstr "localização do repositório de origem de patches"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [OPÇÃO]... ORIGEM [DEST]"
+
+msgid "clone main and patch repository at same time"
+msgstr "clona os repositórios principal e de fila ao mesmo tempo"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" Se a origem for local, o destino não terá patches aplicados. Se\n"
+" a origem for remota, este comando não pode verificar se patches\n"
+" estão aplicados na origem, então não pode garantir que os patches\n"
+" não estarão aplicados no destino. Se você clonar um repositório\n"
+" remoto, certifique-se primeiro que ele não tenha patches\n"
+" aplicados."
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+" O repositório de patches da origem é procurado por padrão em\n"
+" <origem>/.hg/patches . Use -p <url> para mudar."
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+" O diretório de patches deve ser um repositório aninhado do\n"
+" Mercurial, como criado por :hg:`init --mq`."
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "repositório versionado de patches não encontrado (veja init --mq)"
+
+msgid "cloning main repository\n"
+msgstr "clonando repositório principal\n"
+
+msgid "cloning patch repository\n"
+msgstr "clonando o repositório de patches\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "removendo patches aplicados do repositório de destino\n"
+
+msgid "updating destination repository\n"
+msgstr "atualizando repositório de destino\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [OPÇÃO]... [ARQUIVO]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr "consolida mudanças no repositório da fila de patches (OBSOLETO)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr " Este comando é obsoleto; use :hg:`commit --mq` em seu lugar."
+
+msgid "print patches not in series"
+msgstr "imprime os patches que não estão na série"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "imprime todo o arquivo series"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "imprime o nome do patch atual"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "print the name of the next pushable patch"
+msgstr "imprime o nome do próximo patch que pode ser aplicado"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the preceding applied patch"
+msgstr "imprime o nome do patch aplicado anterior"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "importa mudanças não consolidadas (OBSOLETO)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "adiciona \"From: <usuário atual>\" ao patch"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "adiciona \"From: <USUÃRIO>\" ao patch"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "adiciona \"Date: <data atual>\" ao patch"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "adiciona \"Date: <DATA>\" ao patch"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEXTO] [-l ARQUIVO] PATCH [ARQUIVO]..."
+
+msgid "create a new patch"
+msgstr "cria um novo patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew cria um novo patch no topo do patch aplicado no momento (se\n"
+" houver). O patch será inicializado com quaisquer mudanças\n"
+" pendentes do diretório de trabalho. Você pode também usar\n"
+" -I/--include, -X/--exclude, e/ou uma lista de arquivos após o\n"
+" nome do patch para adicionar ao novo patch apenas mudanças em\n"
+" arquivos que casarem , mantendo as restantes como modificações\n"
+" não consolidadas."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" -u/--user e -d/--date podem ser usados para definir o usuário\n"
+" e data pedidos, respectivamente. -U/--currentuser e\n"
+" -D/--currentdate definem o usuário para o usuário atual e a\n"
+" data para a data atual."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message ou -l/--logfile definem o cabeçalho\n"
+" do patch, bem como a mensagem de consolidação. Se não forem\n"
+" especificados, o cabeçalho estará vazio e a mensagem de\n"
+" consolidação será '[mq]: PATCH'."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" Use a opção -g/--git para manter o patch no formato estendido git\n"
+" diff. Leia o tópico de ajuda diffs para mais informações sobre\n"
+" por que isso é importante para preservar mudanças de permissão\n"
+" e informações de cópia e renomeação."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso na criação de um novo patch.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "renova apenas os arquivos especificados ou que já estão no patch"
+
+msgid "add/update author field in patch with current user"
+msgstr "adiciona/atualiza a entrada de autor no patch com o usuário atual"
+
+msgid "add/update author field in patch with given user"
+msgstr "adiciona/atualiza a entrada de autor no patch com o usuário pedido"
+
+msgid "add/update date field in patch with current date"
+msgstr "adiciona/atualiza a entrada de data no patch com a data atual"
+
+msgid "add/update date field in patch with given date"
+msgstr "adiciona/atualiza a entrada de data no patch com a data pedida"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXTO] [-l ARQUIVO] [-s] [ARQUIVO]..."
+
+msgid "update the current patch"
+msgstr "atualiza o patch atual"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" Se qualquer padrão de arquivos for fornecido, o patch renovado\n"
+" conterá apenas as modificações em arquivos que casarem com esses\n"
+" padrões; as modificações restantes permanecerão no diretório de\n"
+" trabalho."
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+" Se -s/--short for especificado, os arquivos incluídos no momento\n"
+" no patch serão renovados da mesma forma que arquivos que casarem,\n"
+" e permanecerão no patch."
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+" Se for especificado -e/--edit, o Mercurial inicia o editor\n"
+" de texto configurado, para que você digite a mensagem. No\n"
+" caso de falha no comando qrefresh, é criada uma cópia de segurança\n"
+" dessa mensagem em ``.hg/last-message.txt``."
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+" hg add/remove/copy/rename funciona normalmente, mas você pode\n"
+" querer usar patches estilo git (/g--git ou [diff] git=1) para\n"
+" rastrear cópias e renomeações. Veja o tópico de ajuda diffs para\n"
+" mais informações sobre o formato git diff."
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "opção \"-e\" incompatível com \"-m\" ou \"-l\""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [OPÇÃO]... [ARQUIVO]..."
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "diff do patch atual e modificações subsequentes"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" Mostra um diff que inclui o patch atual bem como quaisquer\n"
+" mudanças que tiverem sido feitas no diretório de trabalho desde\n"
+" a última renovação (mostrando assim como ficaria o patch atual\n"
+" após um qrefresh)."
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+" Use :hg:`diff` se você quiser apenas ver as mudanças feitas desde\n"
+" o último qrefresh, ou :hg:`export qtip` se você quiser ver\n"
+" mudanças feitas pelo patch atual sem incluir as mudanças feitas\n"
+" desde o último qrefresh."
+
+msgid "edit patch header"
+msgstr "edita o cabeçalho do patch"
+
+msgid "keep folded patch files"
+msgstr "mantém os arquivos dos patches incorporados"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEXTO] [-l ARQUIVO] PATCH..."
+
+msgid "fold the named patches into the current patch"
+msgstr "incorpora os patches pedidos no patch atual"
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+" Os patches não devem estar aplicados. Cada patch será\n"
+" sucessivamente aplicado ao patch atual na ordem dada. Se todos\n"
+" os patches forem aplicados com sucesso, o patch atual será\n"
+" renovado com o novo patch cumulativo, e os patches incorporados\n"
+" serão apagados. Com -k/--keep, os patches incorporados não serão\n"
+" removidos em seguida."
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+" O cabeçalho de cada patch incorporado será concatenado com o\n"
+" cabeçalho do patch atual, separado por uma linha de ``* * *``."
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold requer ao menos um nome de patch"
+
+#, python-format
+msgid "skipping already folded patch %s\n"
+msgstr "omitindo patch %s já incorporado\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "qfold não pode incorporar o patch %s já aplicado"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "erro incorporando patch %s"
+
+msgid "tolerate non-conflicting local changes"
+msgstr "tolera alterações locais não conflitantes"
+
+msgid "overwrite any local changes"
+msgstr "sobrescreve qualquer alteração local"
+
+msgid "do not save backup copies of files"
+msgstr "não grava backups de arquivos"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [OPÇÃO]... PATCH"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr "empilha ou desempilha patches até que o patch nomeado esteja no topo"
+
+msgid "list all patches and guards"
+msgstr "lista todos os patches e guardas"
+
+msgid "drop all guards"
+msgstr "descarta todas as guardas"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [PATCH] [-- [+GUARDA]... [-GUARDA]...]"
+
+msgid "set or print guards for a patch"
+msgstr "define ou imprime guardas para um patch"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` command\n"
+" has activated it."
+msgstr ""
+" Guardas controlam se um patch pode ser empilhado. Um patch sem\n"
+" guardas sempre será empilhado. Um patch com uma guarda positiva\n"
+" (\"+foo\") é empilhado apenas se ela tiver sido ativada pelo\n"
+" comando :hg:`qselect`. Um patch com uma guarda negativa (\"-foo\")\n"
+" nunca será empilhado se ele tiver sido ativado pelo comando\n"
+" :hg:`qselect`."
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" Sem argumentos, imprime as guardas ativas no momento.\n"
+" Com um argumento, define guardas para o patch pedido."
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+" .. note::\n"
+" A especificação de guardas negativas agora exige '--'."
+
+msgid " To set guards on another patch::"
+msgstr " Para definir guardas em um outro patch::"
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr " hg qguard outro.patch -- +2.6.17 -stable"
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "não se pode misturar -l/--list com opções ou argumentos"
+
+msgid "no patch to work with"
+msgstr "nenhum patch com o qual trabalhar"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "nenhum patch de nome %s"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "imprime o cabeçalho do último patch ou do patch pedido"
+
+msgid "apply on top of local changes"
+msgstr "aplica por cima das mudanças locais"
+
+msgid "apply the target patch to its recorded parent"
+msgstr "aplica o patch alvo em seu pai armazenado"
+
+msgid "list patch name in commit text"
+msgstr "lista o nome do patch no texto de consolidação"
+
+msgid "apply all patches"
+msgstr "aplica todos os patches"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "mescla com outra fila (OBSOLETO)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "nome da fila de mesclagem (OBSOLETO)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr "reordena a fila de patches e aplica apenas o patch"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [PATCH | ÃNDICE]"
+
+msgid "push the next patch onto the stack"
+msgstr "empilha o próximo patch na pilha"
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and patch over\n"
+" uncommitted changes."
+msgstr ""
+" Por padrão, aborta se o diretório de trabalho contiver mudanças\n"
+" não consolidadas. Com a opção --keep-changes, aborta apenas se as\n"
+" mudanças não consolidadas se sobrepõe a arquivos no patch. Com\n"
+" -f/--force, cria uma cópia de segurança e sobrescreve as mudanças\n"
+" não consolidadas."
+
+msgid "no saved queues found, please use -n\n"
+msgstr "nenhuma fila salva encontrada, por favor use -n\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "mesclando com fila em: %s\n"
+
+msgid "pop all patches"
+msgstr "desempilha todos os patches"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "nome da fila para desempilhar (OBSOLETO)"
+
+msgid "forget any local changes to patched files"
+msgstr "descarta qualquer mudança local a arquivos modificados pelo patch"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [PATCH | ÃNDICE]"
+
+msgid "pop the current patch off the stack"
+msgstr "desempilha o patch atual da pilha"
+
+msgid ""
+" Without argument, pops off the top of the patch stack. If given a\n"
+" patch name, keeps popping off patches until the named patch is at\n"
+" the top of the stack."
+msgstr ""
+" Sem parâmetros, desempilha o topo da pilha de patches. Se for\n"
+" passado um nome, desempilha sucessivamente os patches até que\n"
+" o patch com esse nome esteja no topo da pilha."
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and discard\n"
+" changes made to such files."
+msgstr ""
+" Por padrão, aborta se o diretório de trabalho contiver mudanças\n"
+" não consolidadas. Com a opção --keep-changes, aborta apenas se as\n"
+" mudanças não consolidadas se sobrepõem a arquivos no patch. Com\n"
+" -f/--force, cria uma cópia de segurança e descarta as mudanças\n"
+" desses arquivos."
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "usando fila de patches: %s\n"
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename PATCH1 [PATCH2]"
+
+msgid "rename a patch"
+msgstr "renomeia um patch"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" Com um argumento, renomeia o patch atual para PATCH1.\n"
+" Com dois argumentos, renomeia PATCH1 para PATCH2."
+
+msgid "delete save entry"
+msgstr "apaga entrada salva"
+
+msgid "update queue working directory"
+msgstr "atualiza o diretório de trabalho da fila"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] REV"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr "restaura o estado da fila salvo por uma revisão (OBSOLETO)"
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " Este comando é obsoleto, use :hg:`rebase` em seu lugar."
+
+msgid "copy patch directory"
+msgstr "copia o diretório do patch"
+
+msgid "copy directory name"
+msgstr "copia o nome do diretório"
+
+msgid "clear queue status file"
+msgstr "limpa o arquivo de estado da fila"
+
+msgid "force copy"
+msgstr "força a cópia"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m TEXTO] [-l ARQUIVO] [-c] [-n NOME] [-e] [-f]"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr "salva o estado atual da fila (OBSOLETO)"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "o destino %s existe e não é um diretório"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "o destino %s existe, use -f para forçar"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "copia %s para %s\n"
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+"remove a revisão especificada (opcional, não é necessário especificar "
+"explicitamente esta opção para remover revisões)"
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+"força a remoção de revisões, descarta mudanças não consolidadas (sem backup)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are"
+" not descendants of REV (DEPRECATED)"
+msgstr ""
+"adiciona ao bundle apenas revisões cujo número local de revisão for maior "
+"que REV e que não forem seus descendentes (OBSOLETA)"
+
+msgid "no backups"
+msgstr "nenhuma cópia de segurança"
+
+msgid "no backups (DEPRECATED)"
+msgstr "sem cópias de segurança (OBSOLETO)"
+
+msgid "ignored (DEPRECATED)"
+msgstr "ignorado (OBSOLETO)"
+
+msgid "do not modify working copy during strip"
+msgstr "não modifica a cópia de trabalho durante o strip"
+
+msgid "remove revs only reachable from given bookmark"
+msgstr "remove revisões alcançáveis apenas pelo marcador dado"
+
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
+msgstr "hg strip [-k] [-f] [-n] [-B marcador] [-r] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "remove do repositório revisões e todos os seus descendentes"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+" O comando strip remove as revisões pedidas e todos os seus\n"
+" descendentes. Se o diretório de trabalho tiver mudanças\n"
+" pendentes, essa operação será abortada, a não ser que seja\n"
+" usada a opção --force; nesse caso, as mudanças serão\n"
+" descartadas."
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" Se o pai do diretório de trabalho for removido, após o término\n"
+" da operação o diretório de trabalho será automaticamente\n"
+" atualizado para o ancestral disponível mais recente do pai\n"
+" removido."
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+" Qualquer revisão removida será armazenada em ``.hg/strip-backup``\n"
+" em um arquivo bundle (veja :hg:`help bundle` e :hg:`help bundle`).\n"
+" Elas podem ser restauradas com o comando\n"
+" :hg:`unbundle .hg/strip-backup/BUNDLE`, onde BUNDLE é o arquivo\n"
+" bundle criado pelo comando strip. Note que os números locais das\n"
+" revisões serão em geral diferentes após a restauração."
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+" Use a opção --no-backup para descartar o bundle de backup assim\n"
+" que a operação terminar."
+
+msgid ""
+" Strip is not a history-rewriting operation and can be used on\n"
+" changesets in the public phase. But if the stripped changesets have\n"
+" been pushed to a remote repository you will likely pull them again."
+msgstr ""
+" A operação strip não reescreve o histórico, e pode ser usada em\n"
+" revisões na fase pública. Mas se revisões removidas por strip\n"
+" tiverem sido enviadas para um repositório remoto, um comando pull\n"
+" subsequente poderá trazê-las de volta."
+
+#, python-format
+msgid "bookmark '%s' not found"
+msgstr "marcador '%s' não encontrado"
+
+#, python-format
+msgid "bookmark '%s' deleted\n"
+msgstr "marcador '%s' apagado\n"
+
+msgid "empty revision set"
+msgstr "conjunto vazio de revisões"
+
+msgid "disable all guards"
+msgstr "desabilita todas as guardas"
+
+msgid "list all guards in series file"
+msgstr "lista todas as guardas no arquivo series"
+
+msgid "pop to before first guarded applied patch"
+msgstr "desempilha até antes do primeiro patch aplicado com guarda"
+
+msgid "pop, then reapply patches"
+msgstr "desempilha, e em seguida reaplica os patches"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [OPÇÃO]... [GUARDA]..."
+
+msgid "set or print guarded patches to push"
+msgstr "define ou imprime guardas de empilhamento de patches"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+" Use o comando :hg:`qguard` para definir ou imprimir guardas no patch,\n"
+" depois use qselect para dizer à mq quais guardas usar. Um patch\n"
+" será empilhado se ele não tiver guardas ou se qualquer guarda\n"
+" positiva casar com a guarda atual, mas não será empilhado se\n"
+" qualquer guarda negativa casar com a guarda atual. Por exemplo::"
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+" qguard foo.patch -- -stable (guarda negativa)\n"
+" qguard bar.patch +stable (guarda positiva)\n"
+" qselect stable"
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+" Isso ativa a guarda \"stable\". mq omitirá o patch foo (porque\n"
+" ele tem um casamento negativo) mas empilhará o patch bar (porque\n"
+" ele tem um casamento positivo)."
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+" Sem argumentos, imprime as guardas ativas no momento. Com um\n"
+" argumento, define a guarda ativa."
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+" Use -n/--none para desativar guardas (nenhum outro argumento\n"
+" é necessário). Se nenhuma guarda estiver ativa, patches com\n"
+" guardas positivas são omitidos e patches com guardas negativas\n"
+" são empilhados."
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+" qselect pode mudar as guardas em patches aplicados. Ele por\n"
+" padrão não desempilha patches guardados. Use --pop para\n"
+" desempilhar até o último patch aplicado que não esteja guardado.\n"
+" Use --reapply (que implica --pop) para empilhar novamente para o\n"
+" patch atual em seguida, omitindo patches guardados."
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+" Use -s/--series para imprimir uma lista de todas as guardas no\n"
+" arquivo series (nenhum outro argumento necessário). Use -v para\n"
+" mais informações."
+
+msgid "guards deactivated\n"
+msgstr "guardas desativadas\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr "número de patches sem guarda e não aplicados mudou de %d para %d\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr "número de patches com guarda e aplicados mudou de %d para %d\n"
+
+msgid "guards in series file:\n"
+msgstr "guardas no arquivo series:\n"
+
+msgid "no guards in series file\n"
+msgstr "nenhuma guarda no arquivo series\n"
+
+msgid "active guards:\n"
+msgstr "guardas ativas:\n"
+
+msgid "no active guards\n"
+msgstr "nenhuma guarda ativa\n"
+
+msgid "popping guarded patches\n"
+msgstr "desempilhando patches com guarda\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "reaplicando patches sem guarda\n"
+
+msgid "finish all applied changesets"
+msgstr "encerra todas as revisões aplicadas"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "move applied patches into repository history"
+msgstr "move patches aplicados para o histórico do repositório"
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+" Encerra as revisões especificadas (que correspondem a patches\n"
+" aplicados) tirando-as do controle da mq e convertendo-as em\n"
+" histórico comum do repositório."
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+" Aceita uma sequência de revisões ou a opção -a/--applied. Se\n"
+" --applied for especificado, todas as revisões mq aplicadas serão\n"
+" removidas do controle da mq. De outro modo, as revisões pedidas\n"
+" devem estar na base da pilha de patches aplicados."
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+" Isto pode ser especialmente útil se suas mudanças foram aplicadas\n"
+" a um repositório upstream, ou se você pretender enviar essas\n"
+" mudanças para upstream."
+
+msgid "no revisions specified"
+msgstr "nenhuma revisão especificada"
+
+msgid "warning: uncommitted changes in the working directory\n"
+msgstr "aviso: mudanças não consolidadas no diretório de trabalho\n"
+
+msgid "list all available queues"
+msgstr "lista todas as filas disponíveis"
+
+msgid "print name of active queue"
+msgstr "imprime o nome da fila ativa"
+
+msgid "create new queue"
+msgstr "cria uma nova fila"
+
+msgid "rename active queue"
+msgstr "renomeia a fila ativa"
+
+msgid "delete reference to queue"
+msgstr "remove referência para uma fila"
+
+msgid "delete queue, and remove patch dir"
+msgstr "apaga a fila e remove o diretório de patches"
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[OPÇÃO] [FILA]"
+
+msgid "manage multiple patch queues"
+msgstr "gerencia múltiplas filas de patches"
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+" Este comando alterna entre diferentes filas de patches, e também é\n"
+" usado para criar novas filas ou remover filas existentes."
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the registered\n"
+" queues - by default the \"normal\" patches queue is registered. The currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will print\n"
+" only the name of the active queue."
+msgstr ""
+" Omitir um nome de fila ou especificar -l/--list fará com que o\n"
+" comando mostre as filas registradas - por padrão a fila de\n"
+" patches \"normal\" é registrada. A fila ativa no momento será\n"
+" marcada com \"(ativa)\". Especificar --active fará com que apenas\n"
+" o nome da fila ativa seja imprimido."
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+" Para criar uma nova fila, use -c/--create. A fila é automaticamente\n"
+" ativada, a não ser que patches da fila ativa atual estejam aplicados\n"
+" ao repositório. Nesse caso a fila será criada, mas a ativação\n"
+" falhará."
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the currently\n"
+" active queue."
+msgstr ""
+" Para remover uma fila existente, use --delete. Você não pode\n"
+" remover a fila ativa no momento."
+
+msgid "patches applied - cannot set new queue active"
+msgstr "patches aplicados - não é possível ativar outra fila"
+
+msgid "cannot delete queue that does not exist"
+msgstr "não é possível remover uma fila que não existe"
+
+msgid "cannot delete currently active queue"
+msgstr "não é possível remover a fila ativa"
+
+msgid " (active)\n"
+msgstr " (ativa)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr "nome de fila inválido: o nome não pode conter os caracteres \":\\/.\""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "a fila \"%s\" já existe"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "não é possível renomear \"%s\" para seu nome atual"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "o diretório \"%s\", que não é uma fila de patches, já existe"
+
+msgid "use --create to create a new queue"
+msgstr "use --create para criar uma nova fila"
+
+msgid "cannot commit over an applied mq patch"
+msgstr "não se pode consolidar sobre um patch mq aplicado"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "arquivo de estado da mq se refere ao nó desconhecido %s\n"
+
+#, python-format
+msgid "tag %s overrides mq patch of the same name\n"
+msgstr "a etiqueta %s se sobrepõe ao patch mq de mesmo nome\n"
+
+msgid "cannot import over an applied patch"
+msgstr "não se pode importar sobre um patch aplicado"
+
+msgid "only a local queue repository may be initialized"
+msgstr "apenas um repositório de fila local pode ser inicializado"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "não há um repositório do Mercurial aqui (.hg não encontrado)"
+
+msgid "no queue repository"
+msgstr "repositório da fila não existente"
+
+#, python-format
+msgid "%d applied"
+msgstr "%d aplicados"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d não aplicados"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (fila vazia)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+" Revisões gerenciadas pela MQ."
+
+msgid "mq takes no arguments"
+msgstr "mq não tem argumentos"
+
+msgid "operate on patch repository"
+msgstr "opera no repositório de patches"
+
+msgid "hooks for sending email push notifications"
+msgstr "gancho para enviar notificações por e-mail em um push"
+
+msgid ""
+"This extension implements hooks to send email notifications when\n"
+"changesets are sent from or received by the local repository."
+msgstr ""
+"Esta extensão fornece ganchos para o envio de emails de notificação\n"
+"quando revisões são enviadas ou recebidas pelo repositório local."
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
+"are run when changesets are received, while ``outgoing`` hooks are for\n"
+"changesets sent to another repository::"
+msgstr ""
+"Em primeiro lugar, habilite a extensão como explicado em\n"
+":hg:`help extensions`, e registre o gancho que você deseja executar.\n"
+"O gancho ``outgoing`` é executado quando revisões são enviadas, e os\n"
+"ganchos ``incoming`` e ``changegroup`` são executados quando revisões\n"
+"são recebidas pelo repositório local::"
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+" [hooks]\n"
+" # um e-mail para cada revisão recebida\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # um único e-mail para todas as revisões recebidas\n"
+" changegroup.notify = python:hgext.notify.hook"
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+" # um e-mail para todas as revisões enviadas\n"
+" outgoing.notify = python:hgext.notify.hook"
+
+msgid ""
+"This registers the hooks. To enable notification, subscribers must\n"
+"be assigned to repositories. The ``[usersubs]`` section maps multiple\n"
+"repositories to a given recipient. The ``[reposubs]`` section maps\n"
+"multiple recipients to a single repository::"
+msgstr ""
+"Isto registra os hooks. Para habilitar notificações, os assinantes devem\n"
+"ser inscritos em repositórios. A seção ``[usersubs]`` mapeia múltiplos\n"
+"repositórios para um dado destinatário. A seção ``[reposubs]`` mapeia\n"
+"múltiplos destinatários para um único repositório::"
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of repo glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+" [usersubs]\n"
+" # a chave é o e-mail do assinante, o valor é uma lista separada\n"
+" # por vírgulas de padrões glob de repositórios\n"
+" user@host = padrão,padrão"
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+" [reposubs]\n"
+" # a chave é o padrão glob, o valor é uma lista separada por\n"
+" # vírgulas de e-mails dos assinantes\n"
+" padrão = user@host"
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root."
+msgstr ""
+"Os padrões glob correspondem ao caminho absoluto da raiz do\n"
+"repositório."
+
+msgid ""
+"In order to place them under direct user management, ``[usersubs]`` and\n"
+"``[reposubs]`` sections may be placed in a separate ``hgrc`` file and\n"
+"incorporated by reference::"
+msgstr ""
+"Para que os usuários possam gerenciar suas próprias inscrições, as\n"
+"seções ``[usersubs]`` e ``[reposubs]`` podem ser colocadas em um\n"
+"arquivo ``hgrc`` separado e incorporadas por referência::"
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+" [notify]\n"
+" config = /caminho/para/arquivo/de/assinantes"
+
+msgid ""
+"Notifications will not be sent until the ``notify.test`` value is set\n"
+"to ``False``; see below."
+msgstr ""
+"Notificações mas não serão enviadas até que você defina a entrada\n"
+"``notify.test`` como ``False``; veja abaixo."
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+"O conteúdo das notificações pode ser ajustado com as seguintes\n"
+"entradas de configuração:"
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: True."
+msgstr ""
+"notify.test\n"
+" Se ``True``, imprime as mensagens para a saída padrão, ao\n"
+" invés de enviá-las. O padrão é True."
+
+msgid ""
+"notify.sources\n"
+" Space-separated list of change sources. Notifications are activated only\n"
+" when a changeset's source is in this list. Sources may be:"
+msgstr ""
+"notify.sources\n"
+" Lista separada por espaços de origens das mudanças. As notificações\n"
+" são enviadas apenas se esta lista incluir a origem das mudanças.\n"
+" As origens podem ser:"
+
+msgid ""
+" :``serve``: changesets received via http or ssh\n"
+" :``pull``: changesets received via ``hg pull``\n"
+" :``unbundle``: changesets received via ``hg unbundle``\n"
+" :``push``: changesets sent or received via ``hg push``\n"
+" :``bundle``: changesets sent via ``hg unbundle``"
+msgstr ""
+" :``serve``: revisões recebidas via http ou ssh\n"
+" :``pull``: revisões recebidas via ``hg pull``\n"
+" :``unbundle``: revisões recebidas via ``hg unbundle``\n"
+" :``push``: revisões enviadas ou recebidas via ``hg push``\n"
+" :``bundle``: revisões enviadas via ``hg unbundle``"
+
+msgid " Default: serve."
+msgstr " Padrão: serve."
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, notifications\n"
+" reference repositories with their absolute path. ``notify.strip`` lets you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+"notify.strip\n"
+" Número de barras \"/\" à esquerda a serem removidas de urls. Por\n"
+" padrão, notificações referenciam repositórios usando caminhos\n"
+" absolutos. ``notify.strip`` pode ser usado para suportar caminhos\n"
+" relativos. Por exemplo, ``notify.strip=3`` mudará\n"
+" ``/caminho/longo/repositorio`` para ``repositorio``. Padrão: 0."
+
+msgid ""
+"notify.domain\n"
+" Default email domain for sender or recipients with no explicit domain."
+msgstr ""
+"notify.domain\n"
+" Domínio de emails a ser usado para remetentes ou destinatários sem um domínio explícito."
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+"notify.style\n"
+" O arquivo de estilo usado para formatar os e-mails."
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+"notify.template\n"
+" O modelo usado para formatar os e-mails."
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as an incoming hook, overriding ``notify.template``."
+msgstr ""
+"notify.incoming\n"
+" O modelo usado ao executar o gancho incoming; sobrepõe\n"
+" ``notify.template``."
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as an outgoing hook, overriding ``notify.template``."
+msgstr ""
+"notify.incoming\n"
+" O modelo usado ao executar o gancho outgoing; sobrepõe\n"
+" ``notify.template``."
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as a changegroup hook, overriding\n"
+" ``notify.template``."
+msgstr ""
+"notify.changegroup\n"
+" O modelo usado ao executar o gancho changegroup; sobrepõe\n"
+" ``notify.template``."
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, or -1 to include all of it. Default: 300."
+msgstr ""
+"notify.maxdiff\n"
+" Número máximo de linhas de diff incluídas no e-mail de notificação.\n"
+" Use 0 para desabilitar o diff, e -1 para incluir o diff completo.\n"
+" Padrão: 300."
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in email's subject line. Default: 67."
+msgstr ""
+"notify.maxsubject\n"
+" Número máximo de caracteres na linha de assunto do e-mail. Padrão: 67."
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+"notify.diffstat\n"
+" Use True para incluir um diffstat antes do conteúdo do diff.\n"
+" Padrão: True."
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+"notify.merge\n"
+" Se True, envia notificações para revisões de mesclagem. Padrão: True."
+
+msgid ""
+"notify.mbox\n"
+" If set, append mails to this mbox file instead of sending. Default: None."
+msgstr ""
+"notify.mboxt\n"
+" Se definido, anexa mensagens a este arquivo mbox ao invés de enviar. O padrão é None."
+
+msgid ""
+"notify.fromauthor\n"
+" If set, use the committer of the first changeset in a changegroup for\n"
+" the \"From\" field of the notification mail. If not set, take the user\n"
+" from the pushing repo. Default: False."
+msgstr ""
+"notify.fromauthor\n"
+" Se for True, usa o autor da primeira revisão do changegroup\n"
+" para o campo \"From\"\n"
+" do email de notificação. Se não definido, usa o usuário do repositório\n"
+" que estiver fazendo o push. Padrão: False."
+
+msgid ""
+"If set, the following entries will also be used to customize the\n"
+"notifications:"
+msgstr ""
+"Se definidas, as seguintes entradas também serão usadas para\n"
+"modificar as notificações:"
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in the generated\n"
+" email content."
+msgstr ""
+"email.from\n"
+" Endereço ``From`` do e-mail se um endereço não for encontrado\n"
+" no conteúdo do e-mail gerado."
+
+msgid ""
+"web.baseurl\n"
+" Root repository URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+"web.baseurl\n"
+" URL raiz do repositório a ser combinada com\n"
+" o caminho do repositório ao criar referências. Veja também\n"
+" ``notify.strip``."
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d novas revisões"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: enviando a %d assinantes %d mudanças\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"diffs (truncados de %d para %d linhas):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"diffs (%d linhas):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr "notify: suprimindo notificação para mesclagem %d:%s\n"
+
+msgid "browse command output with an external pager"
+msgstr "visualiza a saída do comando com um pager externo"
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr "Para definir o pager a ser usado, defina a variável de aplicação::"
+
+msgid ""
+" [pager]\n"
+" pager = less -FRX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+"Se nenhum pager estiver definido, as extensões de pager usa a variável\n"
+"ambiente $PAGER. Se nem pager.pager nem $PAGER estiverem definidas,\n"
+"nenhum pager será usado."
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+"Você pode desabilitar o pager para certos comandos adicionando-os\n"
+"à lista pager.ignore::"
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+" [pager]\n"
+" ignore = version, help, update"
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+"Você também pode habilitar o pager para apenas certos comandos\n"
+"usando pager.attend. A lista padrão de comandos que usarão o pager\n"
+"é::"
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+"Definir pager.attend para um valor vazio fará com que todos os\n"
+"comandos usem o pager."
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr "Se pager.attend estiver presente, pager.ignore será ignorado."
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+"Para ignorar comandos globais como :hg:`version`ou :hg:`help`,\n"
+"você precisa especificá-los no seu arquivo de configuração de\n"
+"usuário."
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+"A opção --pager=... pode também ser usada para controlar em que momentos\n"
+"o pager será usado. Use um valor booleano como yes, no, on, off, ou use\n"
+"auto para comportamento normal.\n"
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr ""
+"quando paginar (booleana, ou \"always\" (sempre), \"never\" (nunca) ou "
+"\"auto\" (automaticamente))"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr "comando para enviar revisões como uma série de e-mails de patch"
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"A série é iniciada por uma introdução \"[PATCH 0 of N]\", que\n"
+"descreve a série como um todo."
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"Cada e-mail de patch tem uma linha Assunto com a forma\n"
+"\"[PATCH M of N] ...\", usando a primeira linha da descrição da\n"
+"revisão como texto do assunto. A mensagem contém dois ou três\n"
+"corpos:"
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+"- A descrição da revisão.\n"
+"- [Opcional] O resultado da execução de diffstat no patch.\n"
+"- O patch em si, como gerado por :hg:`export`."
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"Cada mensagem faz referência à primeira da série usando os cabeçalhos\n"
+"In-Reply-To e References, de modo que as mensagens aparecerão como\n"
+"uma sequência em e-mails organizados por conversação e leitores de\n"
+"notícias, além de mail archives."
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+"Para configurar outros padrões, adicione uma seção como esta em seu\n"
+"arquivo de configuração::"
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+" [email]\n"
+" from = Meu Nome <meu@email>\n"
+" to = destinatário1, destinatário2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = endereço1, endereço2, ..."
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+"Use ``[patchbomb]`` como nome da seção de configuração se for preciso\n"
+"sobrepor configurações globais da seção ``[email]``."
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+"Então você poderá usar o comando :hg:`email` para enviar por e-mail\n"
+"uma série de revisões como uma \"patchbomb\"."
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"Você também pode tanto configurar a opção method na seção email\n"
+"para um programa de envio de e-mails compatível com o sendmail\n"
+"como preencher a seção [smtp] para que a extensão patchbomb possa\n"
+"automaticamente enviar patchbombs diretamente da linha de comando.\n"
+"Veja as seções [email] e [smtp] na página de manual hgrc(5) para\n"
+"mais detalhes.\n"
+
+msgid "send patches as inline message text (default)"
+msgstr "envia patches como texto no corpo da mensagem (padrão)"
+
+msgid "send patches as attachments"
+msgstr "envia patches como anexos"
+
+msgid "send patches as inline attachments"
+msgstr "envia patches como anexos embutidos"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "endereços de e-mail de destinatários para cópia oculta"
+
+msgid "email addresses of copy recipients"
+msgstr "endereços de e-mail de destinatários para cópia"
+
+msgid "ask for confirmation before sending"
+msgstr "pede confirmação antes do envio"
+
+msgid "add diffstat output to messages"
+msgstr "adiciona a saída do diffstat a mensagens"
+
+msgid "use the given date as the sending date"
+msgstr "usa a data dada como data de envio"
+
+msgid "use the given file as the series description"
+msgstr "usa o arquivo dado como descrição da série"
+
+msgid "email address of sender"
+msgstr "endereço de email do remetente"
+
+msgid "print messages that would be sent"
+msgstr "imprime mensagens que seriam enviadas"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "escreve mensagens para arquivo mbox ao invés de enviá-las"
+
+msgid "email addresses replies should be sent to"
+msgstr "endereços para resposta"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "assunto da primeira mensagem (introdução ou único patch)"
+
+msgid "message identifier to reply to"
+msgstr "identificador de mensagem para a qual responder"
+
+msgid "flags to add in subject prefixes"
+msgstr "indicador adicionado no prefixo de assunto"
+
+msgid "email addresses of recipients"
+msgstr "endereços de e-mail dos destinatários"
+
+msgid "omit hg patch header"
+msgstr "omite o cabeçalho do hg patch"
+
+msgid "send changes not found in the target repository"
+msgstr "envia mudanças não encontradas no repositório alvo"
+
+msgid "send changes not in target as a binary bundle"
+msgstr "envia mudanças que não estão no alvo como um bundle binário"
+
+msgid "name of the bundle attachment file"
+msgstr "nome do arquivo bundle anexado"
+
+msgid "a revision to send"
+msgstr "a revisão a enviar"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr "executa mesmo se o repositório não for relacionado (com -b/--bundle)"
+
+msgid ""
+"a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+"uma revisão base especificada ao invés de um destino (com -b/--bundle)"
+
+msgid "send an introduction email for a single patch"
+msgstr "manda um e-mail introdutório para um patch único"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [OPÇÃO]... [DEST]..."
+
+msgid "send changesets by email"
+msgstr "envia revisões por e-mail"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+" Por padrão, diffs são enviados no formato gerado por :hg:`export`,\n"
+" um por mensagem. A série inicia com uma introdução\n"
+" \"[PATCH 0 of N]\", que descreve a série como um todo."
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+" Cada e-mail de patch tem uma linha Assunto com a forma\n"
+" \"[PATCH M of N] ...\", usando a primeira linha da descrição da\n"
+" revisão como texto do assunto. A mensagem contém duas ou três\n"
+" partes. Primeiro, a descrição da revisão."
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+" Em seguida, se a opção -d/--diffstat for usada, e se o programa\n"
+" diffstat estiver instalado, é inserido o resultado da execução de\n"
+" diffstat no patch."
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr " Por fim, o próprio patch, como gerado por :hg:`export`."
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+" Com as opções -d/--diffstat ou -c/--confirm, será apresentado\n"
+" um resumo final de todas as mensagens, e haverá um pedido de\n"
+" confirmação antes do envio das mensagens."
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created. You can include a patch both as text in the email\n"
+" body and as a regular or an inline attachment by combining the\n"
+" -a/--attach or -i/--inline with the --body option."
+msgstr ""
+" Por padrão o patch é incluído como texto no corpo do e-mail para\n"
+" facilitar a revisão. A opção -a/--attach pode ser usada para ao\n"
+" invés disso criar um anexo para o patch. Com a opção -i/--inline\n"
+" um anexo inline será criado.\n"
+" Você pode incluir um patch tanto como texto no corpo da mensagem\n"
+" como um anexo comum ou embutido combinando as opções -a/--attach\n"
+" ou -i/--inline com a opção --body."
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+" Com -o/--outgoing, e-mails serão gerados para patches não\n"
+" encontrados no repositório de destino (ou apenas aqueles que\n"
+" forem ancestrais das revisões, se estas forem especificadas)"
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+" Com -b/--bundle, as revisões são selecionados assim como em\n"
+" --outgoing, mas um único e-mail contendo em anexo um bundle\n"
+" binário do Mercurial será enviado."
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+" Com a opção -m/--mbox, ao invés de visualizar cada mensagem do\n"
+" patchbomb em um pager ou enviá-las diretamente, o comando irá\n"
+" criar um arquivo de mailbox UNIX com os e-mails de patch. Este\n"
+" arquivo de mailbox pode ser visualizado com qualquer cliente de\n"
+" e-mails que suporte arquivos mbox UNIX."
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+" Com a opção -n/--test, todos os passos serão executados, mas as\n"
+" mensagens não serão enviadas. Você será consultado interativamente\n"
+" para fornecer um endereço de email de destino, um assunto e uma\n"
+" mensagem introdutória descrevendo os patches de sua patchbomb.\n"
+" Quando tudo estiver feito, as mensagens da patchbomb serão\n"
+" exibidas. Se a variável de ambiente PAGER estiver definida, seu\n"
+" visualizador será executado uma vez para cada mensagem do patchbomb,\n"
+" para que você possa verificar se tudo está certo."
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+" Em caso de falha de envio de emails, uma cópia de segurança de sua\n"
+" mensagem introdutória da séria será gravada em ``.hg/last-email.txt``."
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+" hg email -r 3000 # envia apenas o patch\n"
+" hg email -r 3000 -r 3001 # envia os patches 3000 e 3001\n"
+" hg email -r 3000:3005 # envia os patches de 3000 até 3005\n"
+" hg email 3000 # envia o patch 3000 (obsoleto)"
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -o # envia todos os patches não presentes\n"
+" # no destino padrão\n"
+" hg email -o DEST # envia todos os patches não presentes\n"
+" # em DEST\n"
+" hg email -o -r 3000 # envia todos os ancestrais de 3000 não\n"
+" # presentes no destino padrão\n"
+" hg email -o -r 3000 DEST # envia todos os ancestrais de 3000 não\n"
+" # presentes em DEST"
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -b # envia um bundle de todos os patches\n"
+" # não presentes no destino padrão\n"
+" hg email -b DEST # envia um bundle de todos os patches\n"
+" # não presentes em DEST\n"
+" hg email -b -r 3000 # um bundle de todos os ancestrais de\n"
+" # 3000 não presentes no destino padrão\n"
+" hg email -b -r 3000 DEST # um bundle de todos os ancestrais de\n"
+" # 3000 não presentes em DEST"
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+" hg email -o -m mbox && # gera um arquivo mbox...\n"
+" mutt -R -f mbox # ... e o visualiza no mutt\n"
+" hg email -o -m mbox && # gera um arquivo mbox ...\n"
+" formail -s sendmail \\ # ... e usa o formail para enviar a\n"
+" -bm -t < mbox # partir do mbox, através do sendmail"
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+" Antes de usar este comando, você precisará habilitar e-mail em\n"
+" seu hgrc. Veja a seção [email] em hgrc(5) para mais detalhes.\n"
+" "
+
+msgid "no changes found\n"
+msgstr "nenhuma alteração encontrada\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "especifique ao menos uma revisão com -r ou -o"
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+"modo é sempre --outgoing com --bundle; não especifique --outgoing novamente"
+
+msgid "too many destinations"
+msgstr "muitos destinos"
+
+msgid "use only one form to specify the revision"
+msgstr "use apenas uma forma de especificar a revisão"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Escreva a mensagem introdutória para a série de patches."
+
+#, python-format
+msgid "this patch series consists of %d patches."
+msgstr "esta série de patches consiste de %d patches."
+
+msgid "no recipient addresses provided"
+msgstr "nenhum endereço de destinatário fornecido"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"Sumário final:"
+
+msgid "are you sure you want to send (yn)?"
+msgstr "você tem certeza que deseja enviar (yn)?"
+
+msgid "&No"
+msgstr "(&N) não"
+
+msgid "&Yes"
+msgstr "(&Y) sim"
+
+msgid "patchbomb canceled"
+msgstr "patchbomb cancelado"
+
+msgid "displaying "
+msgstr "exibindo "
+
+msgid "sending "
+msgstr "enviando "
+
+msgid "sending"
+msgstr "enviando"
+
+msgid "writing"
+msgstr "escrevendo"
+
+msgid "show progress bars for some actions"
+msgstr "mostra barras de progresso para algumas ações"
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+"Esta extensão usa a informação de progresso fornecida por comandos do\n"
+"Mercurial para desenhar barras de progresso que sejam tão informativas\n"
+"quanto possível. Algumas barras de progresso fornecem apenas informação\n"
+"indeterminada, enquanto outras possuem um ponto de encerramento definido."
+
+msgid "The following settings are available::"
+msgstr "As seguintes opções estão disponíveis::"
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+" [progress]\n"
+" delay = 3 # número de segundos (float) antes que a barra seja mostrada\n"
+" changedelay = 1 # changedelay: atraso mínimo antes que um novo tópico\n"
+" # seja mostrado. Se for definido para menos de\n"
+" # 3 * refresh, tal valor será usado em seu lugar.\n"
+" refresh = 0.1 # tempo em segundos entre atualizações da\n"
+" # barra de progresso\n"
+" format = topic bar number estimate # formato da barra de progresso\n"
+" width = <none> # se definido, será a largura máxima da informação de\n"
+" # progresso (isto é, min(largura, largura do terminal)\n"
+" # será usada)\n"
+" clear-complete = True # limpa a barra de progresso após terminar\n"
+" disable = False # se 'true', não exibe uma barra de progresso\n"
+" assume-tty = False # se 'true', SEMPRE exibe uma barra de progressos,\n"
+" # a não ser que 'disable' seja 'true'"
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+"Entradas válidas para o campo format são topic (tópico), bar (barra),\n"
+"number (número), unit (unidade), estimate (estimativa), speed (velocidade)\n"
+"e item (item).\n"
+"item por padrão são os\n"
+"últimos caracteres do item, mas isto pode ser modificado adicionando ou\n"
+"``-<num>``, que consideraria os últimos num caracteres, ou ``+<num>``\n"
+"para os primeiros num caracteres.\n"
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02ds"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%dm%02ds"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%dh%02dm"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%dd%02dh"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%dw%02dd"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%dy%02dw"
+
+#, python-format
+msgid "%d %s/sec"
+msgstr "%d %s/seg"
+
+msgid "command to delete untracked files from the working directory"
+msgstr "comando para apagar do diretório de trabalho arquivos não rastreados"
+
+msgid "abort if an error occurs"
+msgstr "aborta se ocorrer um erro"
+
+msgid "purge ignored files too"
+msgstr "remove também arquivos ignorados"
+
+msgid "print filenames instead of deleting them"
+msgstr "imprime os nomes de arquivo ao invés de removê-los"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+"termina nomes de arquivo com NUL, para uso com xargs (implica -p/--print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [OPÇÃO]... [DIR]..."
+
+msgid "removes files not tracked by Mercurial"
+msgstr "remove arquivos não rastreados pelo Mercurial"
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+" Apaga arquivos não rastreados pelo Mercurial. Isso é útil para\n"
+" testar mudanças locais e não gravadas em uma árvore que contenha\n"
+" apenas essas mudanças."
+
+msgid " This means that purge will delete:"
+msgstr " Isto quer dizer que purge irá apagar:"
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+" - Arquivos não conhecidos: arquivos marcados com \"?\" por\n"
+" :hg:`status`\n"
+" - Diretórios vazios: de fato o Mercurial ignora diretórios a\n"
+" não ser que eles contenham arquivos versionados"
+
+msgid " But it will leave untouched:"
+msgstr " Mas deixará como estão:"
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+" - Arquivos versionados, modificados ou não\n"
+" - Arquivos ignorados (a não ser que --all seja especificado)\n"
+" - Novos arquivos adicionados ao repositório (com :hg:`add`)"
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+" Se diretórios forem passados na linha de comando, apenas arquivos\n"
+" nesses diretórios serão considerados."
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+" Tenha cuidado com o comando purge, pois você pode remover de\n"
+" forma irreversível alguns arquivos que você esqueceu de adicionar\n"
+" ao repositório. Se você deseja apenas imprimir a lista de\n"
+" arquivos que este programa iria apagar, use a opção --print.\n"
+" "
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s não pode ser removido"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "aviso: %s\n"
+
+#, python-format
+msgid "removing file %s\n"
+msgstr "removendo arquivo %s\n"
+
+#, python-format
+msgid "removing directory %s\n"
+msgstr "removendo diretório %s\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "comando para mover conjuntos de revisões para um ancestral diferente"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"Esta extensão lhe permite rebasear revisões em um repositório\n"
+"existente do Mercurial."
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"Para mais informações:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+msgid "rebase from the specified changeset"
+msgstr "rebaseia a partir da revisão especificada"
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+"rebaseia a partir da base da revisão especificada (até o maior ancestral "
+"comum de base e dest)"
+
+msgid "rebase these revisions"
+msgstr "rebaseia estas revisões"
+
+msgid "rebase onto the specified changeset"
+msgstr "rebaseia sobre a revisão especificada"
+
+msgid "collapse the rebased changesets"
+msgstr "colapsa as revisões rebaseadas"
+
+msgid "use text as collapse commit message"
+msgstr "usa o texto como mensagem de consolidação da revisão colapsada"
+
+msgid "invoke editor on commit messages"
+msgstr "chama um editor para mensagens de consolidação"
+
+msgid "read collapse commit message from file"
+msgstr "lê de um arquivo a mensagem de consolidação da revisão colapsada"
+
+msgid "keep original changesets"
+msgstr "mantém revisões originais"
+
+msgid "keep original branch names"
+msgstr "mantém nomes de ramos originais"
+
+msgid "(DEPRECATED)"
+msgstr "(OBSOLETA)"
+
+msgid "specify merge tool"
+msgstr "especifica o utilitário de mesclagem"
+
+msgid "continue an interrupted rebase"
+msgstr "continua um rebaseamento interrompido"
+
+msgid "abort an interrupted rebase"
+msgstr "aborta um rebaseamento interrompido"
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [opções]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr "move a revisão (e descendentes) para um ramo diferente"
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+" Rebase usa mesclagens repetidamente para migrar revisões de uma\n"
+" parte do histórico (a origem) para outra (o destino). Isto pode\n"
+" ser útil para linearizar mudanças *locais* relativas a uma árvore\n"
+" mestra de desenvolvimento."
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+" Você não deve rebasear revisões que já foram compartilhadas com\n"
+" outros desenvolvedores. A não ser que todos realizem a mesma\n"
+" operação rebase, eles ainda terão as revisões originais em seus\n"
+" repositórios, que aparecerão como duplicatas das revisões rebaseadas."
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+" Se você não especificar uma revisão de destino (opção ``-d/--dest``),\n"
+" rebase usará como destino a cabeça mais recente do ramo nomeado\n"
+" atual (a revisão de destino não é modificada pelo rebaseamento, mas\n"
+" novas revisões são acrescentadas como seus descendentes)."
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+" Você pode especificar quais revisões rebasear de duas maneiras:\n"
+" revisão de \"origem\" ou revisão \"base\". Ambas são formas de\n"
+" especificar um conjunto de revisões topologicamente relacionadas (o\n"
+" \"ramo de origem\"). Se você especificar a revisão de origem (com\n"
+" ``-s/--source``), o comando rebase irá rebasear tal revisão e todos\n"
+" os seus descendentes para o destino. Se você especificar a revisão\n"
+" base (com ``-b/--base``), o comando rebase selecionará ancestrais\n"
+" dessa revisão base até, mas sem incluir, seu ancestral comum com o\n"
+" destino. Assim, ``-b`` é menos preciso, mas mais conveniente, que\n"
+" ``-s``: você pode especificar qualquer revisão no ramo de origem,\n"
+" e rebase irá selecionar o ramo completo. Se você não especificar\n"
+" nem ``-s`` nem ``-b``, rebase usará o pai do diretório de trabalho\n"
+" como revisão base."
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+" Por padrão, rebase recria as revisões do ramo de origem como\n"
+" descendentes do destino, e destrói as originais. Use a opção\n"
+" ``--keep`` para preservar as revisões originais. Algumas revisões\n"
+" no ramo de origem (por exemplo, mesclagens com o ramo de destino)\n"
+" podem ser descartadas se elas não contribuírem mais com nenhuma\n"
+" mudança."
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+" Um resultado das regras de seleção da revisão de destino é que, ao\n"
+" contrário de ``merge``, rebase não fará nada se você estiver na última\n"
+" cabeça (a mais próxima da tip) de um ramo nomeado com duas ou mais\n"
+" cabeças. Nesse caso você precisa especificar explicitamente a origem\n"
+" e/ou o destino (ou fazer um ``update`` para outra cabeça, se for a\n"
+" cabeça do ramo de origem desejado)."
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+" Se um rebaseamento for interrompido para resolver uma mesclagem\n"
+" manualmente, pode ser continuado com --continue/-c ou abortado com\n"
+" --abort/-a."
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se não houver nada para rebasear.\n"
+" "
+
+msgid "message can only be specified with collapse"
+msgstr "a mensagem só pode ser especificada ao usar --collapse"
+
+msgid "cannot use both abort and continue"
+msgstr "não se pode usar abort e continue simultaneamente"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "não se pode usar collapse com continue ou abort"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "abort e continue não permitem especificar revisões"
+
+msgid "tool option will be ignored\n"
+msgstr "a opção tool será ignorada\n"
+
+msgid "cannot specify both a source and a base"
+msgstr "não se pode especificar ao mesmo tempo uma origem e uma base"
+
+msgid "cannot specify both a revision and a base"
+msgstr "não se pode especificar ao mesmo tempo uma revisão e uma base"
+
+msgid "cannot specify both a revision and a source"
+msgstr "não se pode especificar ao mesmo tempo uma revisão e uma origem"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+"não é possível remover revisões originais que tenham descendentes não "
+"rebaseados"
+
+msgid "use --keep to keep original changesets"
+msgstr "use --keep para manter as revisões originais"
+
+#, python-format
+msgid "can't rebase immutable changeset %s"
+msgstr "não é possível rebasear a revisão imutável %s"
+
+msgid "see hg help phases for details"
+msgstr "veja hg help phases para mais detalhes"
+
+msgid "nothing to rebase\n"
+msgstr "nada para rebasear\n"
+
+msgid "cannot collapse multiple named branches"
+msgstr "não é possível colapsar múltiplos ramos nomeados"
+
+msgid "rebasing"
+msgstr "rebaseando"
+
+msgid "changesets"
+msgstr "revisões"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr ""
+"conflitos não resolvidos (veja hg resolve, e em seguida hg rebase "
+"--continue)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "nenhuma mudança, revisão %d omitida\n"
+
+msgid "rebase merging completed\n"
+msgstr "mesclagem de rebaseamento completada\n"
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+"aviso: novas revisões detectadas no ramo de origem, strip não realizado\n"
+
+msgid "rebase completed\n"
+msgstr "rebaseamento completado\n"
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "%d revisões foram omitidas\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "incapaz de colapsar, há mais de um pai externo"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr "não se pode usar a revisão %d como base, o resultado teria 3 pais"
+
+msgid "no rebase in progress"
+msgstr "nenhum rebaseamento em progresso"
+
+#, python-format
+msgid "can't abort rebase due to immutable changesets %s"
+msgstr ""
+"as seguintes revisões imutáveis impedem que o rebaseamento seja abortado: %s"
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+"aviso: novas revisões detectadas no ramo de destino, não é possível "
+"abortar\n"
+
+msgid "rebase aborted\n"
+msgstr "rebaseamento abortado\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr "não se pode rebasear para um patch mq aplicado"
+
+msgid "no matching revisions"
+msgstr "nenhuma revisão correspondente"
+
+msgid "can't rebase multiple roots"
+msgstr "não é possível rebasear múltiplas raízes"
+
+msgid "source is ancestor of destination"
+msgstr "origem é ancestral do destino"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "atualizando marcador %s\n"
+
+msgid "--tool can only be used with --rebase"
+msgstr "--tool só pode ser usada em conjunto com --rebase"
+
+msgid "rebase working directory to branch head"
+msgstr "rebaseia o diretório de trabalho para a cabeça do ramo"
+
+msgid "specify merge tool for rebase"
+msgstr "especifica o utilitário de mesclagem para o rebaseamento"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+"comandos para selecionar interativamente mudanças em um commit ou qrefresh"
+
+msgid "ignore white space when comparing lines"
+msgstr "ignora espaços em branco ao comparar linhas"
+
+msgid "ignore changes in the amount of white space"
+msgstr "ignora mudanças na quantidade de espaços em branco"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "ignora mudanças cujas linhas sejam todas brancas"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "isto modifica um arquivo binário (tudo ou nada)\n"
+
+msgid "this is a binary file\n"
+msgstr "este é um arquivo binário\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "%d trechos, %d linhas modificadas\n"
+
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
+
+msgid "&Yes, record this change"
+msgstr "(&Y) sim, grava esta mudança"
+
+msgid "&No, skip this change"
+msgstr "(&N) não, descarta essa mudança"
+
+msgid "&Edit the change manually"
+msgstr "&Edita a mudança manualmente"
+
+msgid "&Skip remaining changes to this file"
+msgstr "(&S) descarta mudanças restantes neste arquivo"
+
+msgid "Record remaining changes to this &file"
+msgstr "(&F) grava as mudanças restantes deste arquivo"
+
+msgid "&Done, skip remaining changes and files"
+msgstr "(&D) terminado, descarta mudanças e arquivos restantes"
+
+msgid "Record &all changes to all remaining files"
+msgstr "(&A) grava todas as mudanças dos arquivos restantes"
+
+msgid "&Quit, recording no changes"
+msgstr "(&Q) encerra, sem gravar nenhuma mudança"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "cannot edit patch for whole file"
+msgstr "não é possível editar um patch para o arquivo inteiro"
+
+msgid "cannot edit patch for binary file"
+msgstr "não é possível editar um patch para um arquivo binário"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"Para remover linhas '-', marque-as como linhas ' ' (contexto).\n"
+"Para remover linhas '+', apague-as.\n"
+"Linhas iniciadas por '#' serão removidas do patch."
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"Se o patch aplicar de forma limpa, o trecho editado será adicionado\n"
+"imediatamente à lista de gravação. Se o patch não aplicar de forma\n"
+"limpa, um arquivo de rejeitos será gerado: você poderá usar esse\n"
+"arquivo ao tentar novamente. Se todas as linhas do trecho forem\n"
+"removidas, a edição será abortada e o trecho não será modificado.\n"
+
+msgid "edit failed"
+msgstr "falha ao editar"
+
+msgid "user quit"
+msgstr "usuário encerrou"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "examinar mudanças em %s?"
+
+msgid " and "
+msgstr " e "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "gravar esta mudança em %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "gravar mudança %d/%d em %r?"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [OPÇÃO]... [ARQUIVO]..."
+
+msgid "interactively select changes to commit"
+msgstr "seleção interativa de alterações para consolidação"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" Se for omitida uma lista de arquivos, todas as alterações\n"
+" informadas por :hg:`status` serão candidatas para gravação."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Você poderá selecionar interativamente a gravação de cada\n"
+" arquivo modificado, além de cada alteração dentro dos arquivos\n"
+" (no caso de arquivos com mais de uma alteração). Para cada\n"
+" consulta, as seguintes respostas são possíveis::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change\n"
+" e - edit this change manually"
+msgstr ""
+" y - grava esta alteração\n"
+" n - omite esta alteração\n"
+" e - edita manualmente esta alteração"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - omite as alterações restantes desse arquivo\n"
+" f - grava as alterações restantes desse arquivo"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - omite alterações e arquivos restantes\n"
+" a - grava todas as alterações em todos os arquivos restantes\n"
+" q - aborta, sem gravar qualquer alteração"
+
+msgid " ? - display help"
+msgstr " ? - exibe o texto de ajuda"
+
+msgid " This command is not available when committing a merge."
+msgstr ""
+" Este comando não está disponível para a consolidação de uma mesclagem."
+
+msgid "interactively record a new patch"
+msgstr "grava um novo patch interativamente"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+" Veja :hg:`help qnew` & :hg:`help record` para forma de uso\n"
+" e mais informações.\n"
+" "
+
+msgid "'mq' extension not loaded"
+msgstr "extensão 'mq' não carregada"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "não está executando interativamente, use %s"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr "não é possível consolidar parcialmente uma mesclagem (use \"hg commit\")"
+
+msgid "no changes to record\n"
+msgstr "nenhuma mudança a ser gravada\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [OPÇÃO]... PATCH [ARQUIVO]..."
+
+msgid "interactively select changes to refresh"
+msgstr "seleciona interativamente alterações para atualização do patch"
+
+msgid "recreates hardlinks between repository clones"
+msgstr "recria hardlinks entre clones de repositórios"
+
+msgid "recreate hardlinks between two repositories"
+msgstr "restaura hardlinks entre dois repositórios"
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+" Quando repositórios são clonados localmente, seus arquivos de dados\n"
+" são duplicados usando hardlinks, de modo a usarem apenas o espaço de\n"
+" um repositório."
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+" Infelizmente, revisões subsequentemente trazidas para qualquer dos\n"
+" repositórios quebrarão os hardlinks de qualquer arquivo alterado\n"
+" pelas novas revisões, mesmo que os repositórios acabem por trazer as\n"
+" mesmas mudanças."
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+" Do mesmo modo, passar --rev para \"hg clone\" não usará hardlinks,\n"
+" criando uma cópia completa do repositório."
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+" Este comando permite recriar tais hardlinks para recuperar o espaço\n"
+" desperdiçado."
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+" Este repositório compartilhará o espaço com ORIGEM, que deve estar no\n"
+" mesmo disco local. Se ORIGEM for omitida, o comando usará os apelidos\n"
+" \"default-relink\" ou \"default\", nessa ordem."
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+" Não tente nenhuma operação de leitura neste repositório enquanto o\n"
+" comando estiver em execução (os dois repositórios serão travados para\n"
+" escrita).\n"
+" "
+
+msgid "hardlinks are not supported on this system"
+msgstr "hardlinks não são suportados neste sistema"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "restaurando hardlinks de %s para %s\n"
+
+msgid "there is nothing to relink\n"
+msgstr "não há nenhum hardlink a ser restaurado\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr "a tip tem %d arquivos, estimado número total de arquivos: %s\n"
+
+msgid "collecting"
+msgstr "coletando"
+
+msgid "files"
+msgstr "arquivos"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr "coletados %d arquivos candidatos nos repositórios\n"
+
+msgid "source and destination are on different devices"
+msgstr "arquivos de origem e destino estão em dispositivos diferentes"
+
+msgid "pruning"
+msgstr "podando"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr "reduzidos para %d prováveis candidatos\n"
+
+msgid "relinking"
+msgstr "restaurando hardlinks"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr "restaurados hardlinks de %d arquivos (%s recuperados)\n"
+
+msgid "[ORIGIN]"
+msgstr "[ORIGEM]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr "amplia protocolos com atalhos para conjuntos de repositórios"
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+"Esta extensão permite especificar atalhos para URLs pais comuns a\n"
+"diversos repositórios sob a forma de um protocolo, por exemplo::"
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+
+msgid "After that you can use it like::"
+msgstr "Você pode usar o atalho da seguinte maneira::"
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+"Adicionalmente há suporte para estruturas mais complexas, por exemplo a\n"
+"usada pelo Google Code::"
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+"A sintaxe é semelhante à de modelos do Mercurial, e você pode ter um\n"
+"número ilimitado de variáveis, iniciando com ``{1}`` e prosseguindo com\n"
+"``{2}``, ``{3}`` e assim por diante. Estas variáveis receberão partes da\n"
+"URL fornecida, separadas por ``/``. Qualquer coisa não especificada como\n"
+"``{parte}`` será simplesmente anexada ao final da URL."
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr "Por conveniência, a extensão adiciona por padrão estes protocolos::"
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+"Você pode sobrepor um protocolo pré-definido definindo um novo com o\n"
+"mesmo nome.\n"
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr "esquema personalizado %s:// conflita com a letra de unidade %s:\\\n"
+
+msgid "share a common history between several working directories"
+msgstr "compartilha histórico comum entre vários diretórios de trabalho"
+
+msgid "create a new shared repository"
+msgstr "cria um novo repositório compartilhado"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+" Inicializa um novo repositório e diretório de trabalho que\n"
+" compartilha seu histórico com outro repositório."
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+" .. note::\n"
+" o uso de rollback ou extensões que destroem ou modificam\n"
+" o histórico (mq, rebase, etc) pode causar confusão considerável\n"
+" com clones compartilhados. Em particular, se dois clones\n"
+" compartilhados forem atualizados para a mesma revisão, e um\n"
+" deles destruir essa revisão usando rollback, o outro clone irá\n"
+" deixar de funcionar: todas as operações irão falhar com\n"
+" \"abortado: diretório de trabalho tem pai desconhecido\". A\n"
+" única correção conhecida é o uso do comando debugsetparents no\n"
+" clone quebrado para reposicioná-lo para uma revisão que ainda\n"
+" exista (por exemplo, a tip).\n"
+" "
+
+msgid "convert a shared repository to a normal one"
+msgstr "converte um repositório compartilhado para um repositório normal"
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+" Copia os dados armazenados na origem e remove os dados\n"
+" de compartilhamento de repositório.\n"
+" "
+
+msgid "this is not a shared repo"
+msgstr "este não é um repositório compartilhado"
+
+msgid "do not create a working copy"
+msgstr "não cria uma cópia de trabalho"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] ORIGEM [DEST]"
+
+msgid "command to transplant changesets from another branch"
+msgstr "comando para transplantar revisões de um outro ramo"
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr "Esta extensão lhe permite transplantar patches de outro ramo."
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+"Patches transplantados são gravados em .hg/transplant/transplants,\n"
+"como um mapeamento de um hash de revisão para seu hash no\n"
+"repositório de origem.\n"
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "omitindo revisão %s já aplicada\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr "omitindo revisão de mesclagem %s:%s\n"
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s não é um pai de %s"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr "%s mesclado em %s\n"
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr "%s transplantado para %s\n"
+
+#, python-format
+msgid "filtering %s\n"
+msgstr "filtrando %s\n"
+
+msgid "filter failed"
+msgstr "filtro falhou"
+
+msgid "can only omit patchfile if merging"
+msgstr "só é possível omitir arquivo de patch em uma mesclagem"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr "conserte a mesclagem e execute hg transplant --continue"
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr "%s transplantado em %s\n"
+
+msgid "transplant log file is corrupt"
+msgstr "arquivo de log de transplante corrompido"
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr "diretório de trabalho não está no pai do transplante %s"
+
+msgid "commit failed"
+msgstr "falha ao consolidar"
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr "filtra revisões corrompidas (sem usuário ou data)"
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: transplante esta revisão\n"
+"n: pula esta revisão\n"
+"m: mescla nesta revisão\n"
+"p: mostra o patch\n"
+"c: consolida revisões selecionadas\n"
+"q: cancela o transplante\n"
+"?: exibe esta ajuda\n"
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "aplicar revisão? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "não existe tal opção\n"
+
+msgid "pull patches from REPO"
+msgstr "traz patches do REPOSITÓRIO"
+
+msgid "pull patches from branch BRANCH"
+msgstr "traz patches do ramo RAMO"
+
+msgid "pull all changesets up to BRANCH"
+msgstr "traz todas as revisões até RAMO"
+
+msgid "skip over REV"
+msgstr "omite revisão REV"
+
+msgid "merge at REV"
+msgstr "mesclagem em REV"
+
+msgid "parent to choose when transplanting merge"
+msgstr "pai a ser escolhido ao transplantar uma mesclagem"
+
+msgid "append transplant info to log message"
+msgstr "anexa informações de transplante à mensagem de log"
+
+msgid "continue last transplant session after repair"
+msgstr "continua a última sessão de transplante após reparos"
+
+msgid "filter changesets through command"
+msgstr "filtra revisões através do comando"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+"hg transplant [-s REPOSITÓRIO] [-b RAMO [-a]] [-p REV] [-m REV] [REV]..."
+
+msgid "transplant changesets from another branch"
+msgstr "transplanta revisões de outro ramo"
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+" As revisões selecionadas serão aplicadas sobre o diretório de\n"
+" trabalho atual com a descrição da revisão original. As revisões\n"
+" são copiadas, e portanto aparecerão duas vezes no histórico. Se\n"
+" ao invés disso você quiser mover um ramo inteiro de revisões não\n"
+" publicadas, use a extensão rebase."
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+" Se --log for especificado, será anexado um comentário às mensagens\n"
+" de log com a forma::"
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr " (transplanted from CHANGESETHASH)"
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+" Você pode reescrever a mensagem de changelog com a opção\n"
+" --filter . Seu argumento será chamado com a mensagem atual de\n"
+" changelog em $1 e o patch em $2."
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+" Se --source/-s for especificado, seleciona revisões do\n"
+" repositório pedido. Se --branch/-b for especificado, seleciona\n"
+" revisões do ramo que contém a revisão especificada, até essa\n"
+" revisão. Se --all/-a for especificado, todas as revisões do\n"
+" ramo serão transplantadas, de outro modo as revisões a serem\n"
+" transplantadas serão pedidas interativamente."
+
+msgid ""
+" :hg:`transplant --branch REV --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+" :hg:`transplant --branch REV --all` irá transplantar o ramo\n"
+" selecionado (até a revisão pedida) no seu diretório de trabalho\n"
+" atual."
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+" Você pode opcionalmente marcar as revisões selecionadas para\n"
+" transplante como revisões de mesclagem. Os ancestrais de um\n"
+" transplante de mesclagem não serão pedidos interativamente, e\n"
+" você pode mesclar descendentes dele normalmente ao invés de\n"
+" transplantá-los."
+
+msgid ""
+" Merge changesets may be transplanted directly by specifying the\n"
+" proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+" Revisões de mesclagem podem ser transplantadas diretamente\n"
+" especificando uma revisão pai adequada ao usar a opção\n"
+" :hg:`transplant --parent`."
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+" Se mesclagens ou revisões não forem fornecidas, :hg:`transplant`\n"
+" irá iniciar um visualizador interativo de revisões."
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+" Se a aplicação de uma revisão falhar, você pode corrigir\n"
+" a mesclagem manualmente e em seguida usar\n"
+" :hg:`transplant --continue/-c` para retomar o transplante.\n"
+" "
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr "--continue é incompatível com branch, all ou merge"
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr "URL de origem, nome de ramo ou lista de revisões não fornecidas"
+
+msgid "--all requires a branch revision"
+msgstr "--all exige uma revisão de ramo"
+
+msgid "--all is incompatible with a revision list"
+msgstr "--all é incompatível com uma lista de revisões"
+
+msgid "no revision checked out"
+msgstr "nenhuma revisão posicionada"
+
+msgid "outstanding uncommitted merges"
+msgstr "mesclagens pendentes não consolidadas"
+
+msgid "outstanding local changes"
+msgstr "alterações locais pendentes"
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+"``transplanted([set])``\n"
+" Revisões transplantadas no conjunto, ou todas as revisões transplantadas."
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+":transplanted: String. O identificador de nó da revisão\n"
+" transplantada, se existir."
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr "permite o uso de caminhos MBCS com codificação problemática."
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+"Algumas codificações MBCS não são boas para certas operações de\n"
+"manipulação de caminhos (por exemplo, quebrar o caminho, conversão\n"
+"de maiúsculas / minúsculas, etc.) com seus bytes codificados.\n"
+"Chamamos tais codificações (por exemplo, shift_jis e big5) de\n"
+"\"codificações problemáticas\". Esta extensão pode ser usada para\n"
+"corrigir esses problemas encapsulando algumas funções para as\n"
+"converter em strings Unicode antes das operações de caminho."
+
+msgid "This extension is useful for:"
+msgstr "Esta extensão é útil para:"
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+"- usuários do Windows em japonês usando codificação shift_jis.\n"
+"- usuários do Windows em chinês usando codificação big5.\n"
+"- Qualquer usuário que usam um repositório com codificação\n"
+" problemática em sistemas de arquivo insensíveis a\n"
+" maiúsculas / minúsculas."
+
+msgid "This extension is not needed for:"
+msgstr "Esta extensão não é necessária para:"
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+"- Qualquer usuário que use apenas caracteres ASCII em caminhos.\n"
+"- Qualquer usuário que não use uma codificação problemática."
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr "Note que há algumas limitações no uso desta extensão:"
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+"- Você deve usar uma única codificação por repositório.\n"
+"- Se o caminho do repositório for terminado por 0x5c, .hg/hgrc não poderá ser lido.\n"
+"- win32mbcs não é compatível com a extensão fixutf8."
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+"Por padrão, win32mbcs usa a configuração encoding.encoding do Mercurial.\n"
+"Você pode especificar a codificação através da opção de configuração::"
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+" [win32mbcs]\n"
+" encoding = sjis"
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+"Isto é útil para usuários que preferem mensagens de consolidação em UTF-8.\n"
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr "[win32mbcs] conversão de nome de arquivo falhou com codificação %s\n"
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr "[win32mbcs] não se pode ativar nesta plataforma.\n"
+
+msgid "perform automatic newline conversion"
+msgstr "faz conversão automática de tipo de quebras de linha"
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+" Obsolescência: A extensão win32text exige que cada usuário configure\n"
+" a extensão novamente para cada clone já que a configuração não é\n"
+" copiada ao clonar."
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+" A extensão ``eol``, criada como alternativa, usa um arquivo de\n"
+" configuração versionado e cada clone irá portanto usar as\n"
+" configurações apropriadas logo no início."
+
+msgid "To perform automatic newline conversion, use::"
+msgstr "Para fazer conversão automática de quebras de linha, use::"
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by "
+"accident::"
+msgstr ""
+"Se a conversão não estiver sendo feita, para garantir que você não\n"
+"consolide CRLF/CR acidentalmente::"
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+"Para fazer a mesma verificação em um servidor para impedir que\n"
+"CRLF/CR sejam enviados ou trazidos::"
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+"AVISO: %s já tem quebras de linha %s\n"
+"e não precisa da conversão de fim de linha do plugin win32text.\n"
+"Antes da próxima consolidação, por favor reconsidere suas\n"
+"configurações de encode/decode em\n"
+"Mercurial.ini ou %s.\n"
+
+#, python-format
+msgid "attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+"tentativa de consolidação ou push de arquivo(s) texto usando quebras de "
+"linha %s\n"
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr "em %s: %s\n"
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+"\n"
+"Para prevenir esse engano no seu repositório local,\n"
+"adicione ao Mercurial.ini ou .hg/hgrc:"
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+
+#, python-format
+msgid "and also consider adding:"
+msgstr "e considere também a adição de:"
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+
+msgid ""
+"win32text is deprecated: "
+"http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+msgstr ""
+"win32text é obsoleta: http://mercurial.selenic.com/wiki/Win32TextExtension\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr "descobre e anuncia repositórios na rede local"
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+"Repositórios que habilitarem zeroconf serão anunciados numa rede\n"
+"sem a necessidade de configurar um servidor ou serviço. Eles podem\n"
+"ser descobertos sem o conhecimento de seus respectivos endereços IP."
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+"Para permitir que outras pessoas encontrem seu repositório execute\n"
+":hg:`serve` em seu repositório::"
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+"Você pode encontrar repositórios com zeroconf habilitado executando\n"
+":hg:`paths`::"
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+msgid "archive prefix contains illegal components"
+msgstr "prefixo de arquivo contém componentes ilegais"
+
+msgid "archiving"
+msgstr "empacotando"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr "linha malformada em .hg/bookmarks: %r\n"
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "o marcador '%s' contém um caractere ilegal"
+
+#, python-format
+msgid "branch %s not found"
+msgstr "ramo %s não encontrado"
+
+#, python-format
+msgid "divergent bookmark %s stored as %s\n"
+msgstr "marcador divergente %s guardado como %s\n"
+
+#, python-format
+msgid "adding remote bookmark %s\n"
+msgstr "adicionando marcador remoto %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "procurando por marcadores modificados\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "nenhum marcador modificado encontrado\n"
+
+msgid "unknown parent"
+msgstr "pai desconhecido"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "checagem de integridade falhou em %s:%d"
+
+msgid "cannot create new bundle repository"
+msgstr "não é possível criar novo repositório de bundle"
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr ""
+"dados recebidos terminaram inesperadamente (%d bytes obtidos, %d esperados)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "comprimento de trecho inválido %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: não é um arquivo de bundle do Mercurial"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: versão de bundle %s desconhecida"
+
+msgid "empty username"
+msgstr "nome de usuário vazio"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "nome de usuário %s contém uma quebra de linha"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "o nome '%s' é reservado"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "mudanças não consolidadas no sub-repositório %s"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "opções --message e --logfile são mutuamente exclusivas"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "não é possível ler mensagem de consolidação '%s': %s"
+
+msgid "limit must be a positive integer"
+msgstr "o limite deve ser um inteiro positivo"
+
+msgid "limit must be positive"
+msgstr "o limite deve ser positivo"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "especificador inválido de formato '%%%s' no nome de arquivo de saída"
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "não é possível especificar simultaneamente --changelog e --manifest"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr ""
+"não é possível especificar um nome de arquivo com --changelog ou --manifest"
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr ""
+"não é possível especificar --changelog ou --manifest sem um repositório"
+
+msgid "invalid arguments"
+msgstr "argumentos inválidos"
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' não encontrado"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: não copiado - o arquivo não é gerenciado\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: não copiado - o arquivo foi marcado para remoção\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: não sobrescrito - %s colide com %s\n"
+
+#, python-format
+msgid "%s: can't copy - same file\n"
+msgstr "%s: impossível copiar - é o mesmo arquivo\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: não sobrescrito - arquivo existe\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: renomeação não gravada - %s não existe\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: cópia não gravada - %s não existe\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: apagado na cópia de trabalho\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: impossível copiar - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "movendo %s para %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "copiando %s para %s\n"
+
+msgid "no source or destination specified"
+msgstr "nenhuma origem ou destino especificado"
+
+msgid "no destination specified"
+msgstr "nenhum destino especificado"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr "com várias origens o destino deve ser um diretório existente"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "o destino %s não é um diretório"
+
+msgid "(consider using --after)\n"
+msgstr "(considere usar --after)\n"
+
+msgid "child process failed to start"
+msgstr "processo filho falhou ao iniciar"
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "revisão: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ramo: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "marcador: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "etiqueta: %s\n"
+
+#, python-format
+msgid "phase: %s\n"
+msgstr "fase: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "pai: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifesto: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "usuário: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "data: %s\n"
+
+msgid "files+:"
+msgstr "arquivos+:"
+
+msgid "files-:"
+msgstr "arquivos-:"
+
+msgid "files:"
+msgstr "arquivos:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "arquivos: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "cópias: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "extra: %s=%s\n"
+
+msgid "description:\n"
+msgstr "descrição:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "sumário: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr "%s: nenhuma chave nomeada '%s'"
+
+#, python-format
+msgid "found revision %s from %s\n"
+msgstr "encontrada revisão %s de %s\n"
+
+msgid "revision matching date not found"
+msgstr "revisão com data equivalente não encontrada"
+
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "não é possível seguir arquivo não presente na revisão pai: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "não é possível seguir arquivo inexistente: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+"é possível acompanhar cópias/renomeações apenas para nomes de arquivo "
+"explícitos"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "a opção -G/--graph é incompatível com --%s"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "adicionando %s\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "desconsiderando sub-repositório faltando: %s\n"
+
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "emendando revisão %s\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "copiando revisão %s para %s\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "removendo revisão intermediária %s\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "removendo revisão emendada %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+"HG: Edite a mensagem de consolidação.\n"
+"HG: Linhas começadas por 'HG:' serão removidas."
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: Deixe a mensagem vazia para abortar a consolidação."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: usuário: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: mesclagem de ramos"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: ramo '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: subrepo %s"
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: adicionou %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: modificou %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: removeu %s"
+
+msgid "HG: no files changed"
+msgstr "HG: nenhum arquivo mudou"
+
+msgid "empty commit message"
+msgstr "mensagem de consolidação vazia"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "esquecendo %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "revertendo %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "revertendo remoção de %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "arquivo não gerenciado: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "nenhuma mudança necessária para %s\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+"diretório raiz do repositório ou nome de arquivo de bundle para sobreposição"
+
+msgid "DIR"
+msgstr "DIR"
+
+msgid "change working directory"
+msgstr "muda o diretório de trabalho"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr ""
+"não consulta o usuário, usa automaticamente a primeira opção em todas as "
+"escolhas"
+
+msgid "suppress output"
+msgstr "suprime saída"
+
+msgid "enable additional output"
+msgstr "habilita saída adicional"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr "define/sobrepõe opção de configuração (use 'seção.nome=valor')"
+
+msgid "CONFIG"
+msgstr "CONFIG"
+
+msgid "enable debugging output"
+msgstr "habilita saída de depuração"
+
+msgid "start debugger"
+msgstr "inicia depurador"
+
+msgid "set the charset encoding"
+msgstr "define a codificação de caracteres"
+
+msgid "ENCODE"
+msgstr "CODIFICAÇÃO"
+
+msgid "MODE"
+msgstr "MODO"
+
+msgid "set the charset encoding mode"
+msgstr "define o modo de codificação de conjunto de caracteres"
+
+msgid "always print a traceback on exception"
+msgstr "sempre imprime traceback em exceções"
+
+msgid "time how long the command takes"
+msgstr "mede o tempo de execução de cada comando"
+
+msgid "print command execution profile"
+msgstr "exibe profile de execução de comando"
+
+msgid "output version information and exit"
+msgstr "exibe informação de versão e sai"
+
+msgid "display help and exit"
+msgstr "exibe ajuda e sai"
+
+msgid "do not perform actions, just print output"
+msgstr "não realiza ações, apenas imprime a saída"
+
+msgid "specify ssh command to use"
+msgstr "especifica comando ssh a ser usado"
+
+msgid "specify hg command to run on the remote side"
+msgstr "especifica comando hg para executar do lado remoto"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+"não verifica o certificado do servidor (ignorando a opção de configuração "
+"web.cacerts)"
+
+msgid "PATTERN"
+msgstr "PADRÃO"
+
+msgid "include names matching the given patterns"
+msgstr "inclui nomes que casem com os padrões fornecidos"
+
+msgid "exclude names matching the given patterns"
+msgstr "exclui nomes que casem com os padrões fornecidos"
+
+msgid "use text as commit message"
+msgstr "usa o texto como mensagem de consolidação"
+
+msgid "read commit message from file"
+msgstr "lê de um arquivo a mensagem de consolidação"
+
+msgid "record the specified date as commit date"
+msgstr "grava a data especificada como data da consolidação"
+
+msgid "record the specified user as committer"
+msgstr "grava o usuário pedido como autor da consolidação"
+
+msgid "STYLE"
+msgstr "ESTILO"
+
+msgid "display using template map file"
+msgstr "exibe usando arquivo de mapeamento de modelo"
+
+msgid "display with template"
+msgstr "exibe usando modelo"
+
+msgid "show patch"
+msgstr "mostra o patch"
+
+msgid "do not show merges"
+msgstr "não mostra mesclagens"
+
+msgid "output diffstat-style summary of changes"
+msgstr "imprime sumário de mudanças no estilo diffstat"
+
+msgid "show the revision DAG"
+msgstr "mostra o grafo de revisões"
+
+msgid "treat all files as text"
+msgstr "trata todos os arquivos como texto"
+
+msgid "omit dates from diff headers"
+msgstr "omite datas dos cabeçalhos de diff"
+
+msgid "show which function each change is in"
+msgstr "mostra em qual função está cada mudança"
+
+msgid "produce a diff that undoes the changes"
+msgstr "produz um diff que desfaz as mudanças"
+
+msgid "number of lines of context to show"
+msgstr "número de linhas de contexto a serem mostradas"
+
+msgid "SIMILARITY"
+msgstr "SIMILARIDADE"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "infere arquivos renomeados por similaridade (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "trabalha em sub-repositórios recursivamente"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[OPÇÃO]... [ARQUIVO]..."
+
+msgid "add the specified files on the next commit"
+msgstr "adiciona os arquivos especificados na próxima consolidação"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+" Agenda arquivos para serem adicionados ao controle de versão\n"
+" e ao repositório."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Os arquivos serão adicionados ao repositório na próxima\n"
+" consolidação. Para desfazer uma adição antes disso, veja\n"
+" :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr ""
+" Se nomes não forem dados, adiciona todos os arquivos ao\n"
+" repositório."
+
+msgid " .. container:: verbose"
+msgstr " .. container:: verbose"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" Um exemplo que mostra como novos arquivos (desconhecidos) são\n"
+" adicionados automaticamente por :hg:`add`::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adicionando foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Devolve 0 se todos os arquivos forem adicionados com sucesso.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "adiciona arquivos novos e remove arquivos faltando"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" Adiciona ao repositório todos os arquivos novos, e remove do\n"
+" repositório todos os arquivos ausentes."
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" Novos arquivos são ignorados se casarem com qualquer dos padrões\n"
+" em ``.hgignore.`` Assim como em add, estas mudanças fazem efeito na\n"
+" próxima consolidação."
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. With a parameter greater than 0,\n"
+" this compares every removed file with every added file and records\n"
+" those similar enough as renames. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed. If\n"
+" not specified, -s/--similarity defaults to 100 and only renames of\n"
+" identical files are detected."
+msgstr ""
+" Use a opção -s/--similarity para detectar arquivos renomeados.\n"
+" Esta opção recebe como parâmetro uma porcentagem entre 0\n"
+" (desabilitada) e 100 (arquivos devem ser idênticos). Com um parâmetro maior do que 0, compara cada arquivo removido com cada\n"
+" arquivo adicionado e grava como renomeações aqueles semelhantes o\n"
+" bastante. Detectar\n"
+" desta maneira arquivos renomeados pode ser uma operação cara.\n"
+" Após o uso dessa opção, :hg:`status -C` pode ser usado para\n"
+" verificar quais arquivos foram identificados como movidos ou\n"
+" renomeados.\n"
+" Se -s/--similarity não for especificada, seu valor será 100,\n"
+" de modo que apenas\n"
+" renomeações idênticas aos originais serão detectadas."
+
+msgid "similarity must be a number"
+msgstr "similaridade deve ser um número"
+
+msgid "similarity must be between 0 and 100"
+msgstr "similaridade deve ser um número entre 0 e 100"
+
+msgid "annotate the specified revision"
+msgstr "faz um annotate da revisão especificada"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "segue cópias e renomeações e lista o nome de arquivo (OBSOLETA)"
+
+msgid "don't follow copies and renames"
+msgstr "não segue cópias e renomeações"
+
+msgid "list the author (long with -v)"
+msgstr "lista o autor (formato longo com -v)"
+
+msgid "list the filename"
+msgstr "lista o nome de arquivo"
+
+msgid "list the date (short with -q)"
+msgstr "lista a data (formato curto com -q)"
+
+msgid "list the revision number (default)"
+msgstr "lista o número de revisão (padrão)"
+
+msgid "list the changeset"
+msgstr "lista a revisão"
+
+msgid "show line number at the first appearance"
+msgstr "exibe números de linha na primeira ocorrência"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+
+msgid "show changeset information by line for each file"
+msgstr "mostra informação de revisão por linha para cada arquivo"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+" Lista as mudanças em arquivos, mostrando o identificador de\n"
+" revisão responsável por cada linha"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+" Este comando é útil para descobrir quando uma mudança foi feita\n"
+" e por quem."
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" Sem a opção -a/--text, annotate evitará processar arquivos\n"
+" detectados como binários. Com -a, annotate irá executar de\n"
+" qualquer maneira, embora os resultados provavelmente não serão\n"
+" úteis."
+
+msgid "at least one filename or pattern is required"
+msgstr "exigido ao menos um nome de arquivo ou padrão"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr "ao menos uma das opções -n/-c é exigida para -l"
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: arquivo binário\n"
+
+msgid "do not pass files through decoders"
+msgstr "não passar arquivos por decodificadores"
+
+msgid "directory prefix for files in archive"
+msgstr "prefixo de diretório para arquivos armazenados"
+
+msgid "PREFIX"
+msgstr "PREFIXO"
+
+msgid "revision to distribute"
+msgstr "revisão a ser distribuída"
+
+msgid "type of distribution to create"
+msgstr "tipo de distribuição a ser criada"
+
+msgid "[OPTION]... DEST"
+msgstr "[OPÇÃO]... DEST"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "cria um pacote não versionado contendo uma revisão do repositório"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" Por padrão, a revisão usada é o pai do diretório de trabalho; use\n"
+" -r/--rev para especificar uma outra revisão."
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+" O tipo de arquivo é detectado automaticamente com base na extensão\n"
+" do arquivo (ou forçado através de -t/--type)."
+
+msgid " Examples:"
+msgstr " Exemplos::"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr " - cria um arquivo zip contendo a versão 1.0::"
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr " hg archive -r 1.0 project-1.0.zip"
+
+msgid " - create a tarball excluding .hg files::"
+msgstr " - cria um tarball excluindo arquivos .hg::"
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr " hg archive project.tar.gz -X \".hg*\""
+
+msgid " Valid types are:"
+msgstr " Tipos válidos:"
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+" :``files``: um diretório cheio de arquivos (padrão)\n"
+" :``tar``: pacote tar, não comprimido\n"
+" :``tbz2``: pacote tar, comprimido com bzip2\n"
+" :``tgz``: pacote tar, comprimido com gzip\n"
+" :``uzip``: pacote zip, não comprimido\n"
+" :``zip``: pacote zip, comprimido com deflate"
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+" O nome exato do pacote de destino ou diretório é dado por uma\n"
+" string de formatação; veja :hg:`help export` para detalhes."
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+" Cada membro adicionado ao pacote terá um diretório de prefixo\n"
+" adicionado. Use -p/--prefix para especificar uma string de\n"
+" formatação para o prefixo. O padrão é o nome base do pacote,\n"
+" com sufixos removidos.\n"
+" "
+
+msgid "no working directory: please specify a revision"
+msgstr "sem cópia de trabalho: por favor especifique uma revisão"
+
+msgid "repository root cannot be destination"
+msgstr "o raiz do repositório não pode ser o destino"
+
+msgid "cannot archive plain files to stdout"
+msgstr "não se pode empacotar arquivos simples na saída padrão"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "mesclar com pai do dirstate anterior após o backout"
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "pai a ser escolhido ao fazer o backout de mesclagem (OBSOLETO)"
+
+msgid "revision to backout"
+msgstr "revisão para fazer o backout"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[OPÇÃO]... [-r] REV"
+
+msgid "reverse effect of earlier changeset"
+msgstr "anula o efeito de uma revisão anterior"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" Prepara no diretório de trabalho atual uma nova revisão que desfaz\n"
+" o efeito da revisão REV."
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+" Se REV for o pai do diretório de trabalho, a nova revisão será\n"
+" consolidada automaticamente. Caso contrário, o Mercurial precisará\n"
+" mesclar as mudanças, e o resultado da mesclagem deve ser consolidado\n"
+" manualmente."
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+" .. note::\n"
+" backout não pode ser usado para corrigir uma mesclagem\n"
+" incorreta ou indesejada."
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+" Por padrão, a revisão pendente terá apenas um pai, mantendo assim\n"
+" um histórico linear. Se a opção --merge for usada, a revisão\n"
+" pendente terá dois pais: o antigo pai do diretório de trabalho e\n"
+" uma nova revisão filha de REV que desfaz o conteúdo de REV."
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+" Antes da versão 1.7 do Mercurial, o comportamento do comando\n"
+" backout sem --merge era equivalente a especificar --merge seguido por\n"
+" :hg:`update --clean .`, cancelando a mesclagem e deixando a filha\n"
+" de REV como uma cabeça a ser mesclada explicitamente."
+
+msgid "please specify just one revision"
+msgstr "por favor especifique apenas uma revisão"
+
+msgid "please specify a revision to backout"
+msgstr "por favor especifique uma revisão a ser anulada"
+
+msgid "cannot backout change on a different branch"
+msgstr "não se pode anular uma mudança em um ramo diferente"
+
+msgid "cannot backout a change with no parents"
+msgstr "não se pode anular uma mudança sem pais"
+
+msgid "cannot backout a merge changeset"
+msgstr "não se pode anular revisões de mesclagem"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr "não se pode usar --parent numa revisão que não seja uma mesclagem"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "a revisão %s anula a revisão %s\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "mesclando com revisão %s\n"
+
+msgid "reset bisect state"
+msgstr "reinicia o estado da bissecção"
+
+msgid "mark changeset good"
+msgstr "marca revisão boa"
+
+msgid "mark changeset bad"
+msgstr "marca revisão ruim"
+
+msgid "skip testing changeset"
+msgstr "descartando revisão de teste"
+
+msgid "extend the bisect range"
+msgstr "amplia o alcance da bissecção"
+
+msgid "use command to check changeset state"
+msgstr "usa o comando para verificar o estado da revisão"
+
+msgid "do not update to target"
+msgstr "não atualiza para o alvo"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c CMD] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr "busca revisões por subdivisão"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" Este comando ajuda a encontrar revisões que introduziram\n"
+" problemas. Para usá-lo, marque como ruim a revisão mais antiga\n"
+" que apresentar o problema, e como boa a mais recente que não\n"
+" apresentar o problema. O comando bisect irá atualizar seu\n"
+" diretório de trabalho para uma revisão a ser testada (a não ser\n"
+" que a opção -U/--noupdate seja especificada). Uma vez que você\n"
+" tenha realizado os testes, marque o diretório de trabalho como\n"
+" ruim ou bom e bisect irá ou atualizar para outra revisão\n"
+" candidata ou informar que encontrou a revisão ruim."
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Como um atalho, você pode também usar o parâmetro de revisão para\n"
+" marcar uma revisão como boa ou ruim sem obtê-la primeiro."
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" The environment variable HG_NODE will contain the ID of the\n"
+" changeset being tested. The exit status of the command will be\n"
+" used to mark revisions as good or bad: status 0 means good, 125\n"
+" means to skip the revision, 127 (command not found) will abort the\n"
+" bisection, and any other non-zero exit status means the revision\n"
+" is bad."
+msgstr ""
+" Se você fornecer um comando ele será usado para bissecção\n"
+" automática. A variável de ambiente HG_NODE conterá o ID da\n"
+" revisão sendo testada. O código de saída do comando\n"
+" será usado para marcar revisões\n"
+" como boas ou ruins: o código de saída 0 marcará a revisão como\n"
+" boa, 125 omitirá a revisão, 127 (comando não encontrado)\n"
+" abortará a bissecção, e qualquer outro código maior que 0\n"
+" marcará a revisão como ruim."
+
+msgid " Some examples:"
+msgstr " Alguns exemplos::"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+" - inicia uma bissecção com a revisão ruim 12, e a revisão boa 34::"
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+
+msgid ""
+" - advance the current bisection by marking current revision as good or\n"
+" bad::"
+msgstr ""
+" - avança a bissecção atual marcando a revisão atual como\n"
+" boa ou ruim::"
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+" hg bisect --good\n"
+" hg bisect --bad"
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+" - marca a revisão atual, ou uma revisão conhecida, para que\n"
+" seja omitida (por exemplo, se tal revisão não for usável\n"
+" devido a algum outro problema)::"
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+
+msgid " - forget the current bisection::"
+msgstr " - esquece a bissecção atual::"
+
+msgid " hg bisect --reset"
+msgstr " hg bisect --reset"
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+" - usa 'make && make tests' para encontrar a primeira revisão\n"
+" quebrada automaticamente::"
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr ""
+" - mostra todas as revisões cujos estados já são conhecidos\n"
+" na bissecção atual::"
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr " hg log -r \"bisect(pruned)\""
+
+msgid ""
+" - see the changeset currently being bisected (especially useful\n"
+" if running with -U/--noupdate)::"
+msgstr ""
+" - mostra a revisão sendo bisseccionada no momento (especialmente\n"
+" útil ao rodar com -U/--noupdate)::"
+
+msgid " hg log -r \"bisect(current)\""
+msgstr " hg log -r \"bisect(current)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr " - mostra todas as revisões que tomam parte na bissecção atual::"
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr " - a extensão graphlog pode inclusive fornecer um grafo::"
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr " hg log --graph -r \"bisect(range)\""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr ""
+" Veja :hg:`help revsets` para mais informações sobre a palavra\n"
+" chave `bisect()`."
+
+msgid "The first good revision is:\n"
+msgstr "A primeira revisão boa é:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "A primeira revisão ruim é:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+"Nem todos os ancestrais desta revisão foram verificados.\n"
+"Use bisect --extend para continuar a bissecção a partir do\n"
+"ancestral comum, %s.\n"
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"Devido a revisões omitidas, a primeira revisão boa pode ser qualquer uma "
+"entre:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"Devido a revisões omitidas, a primeira revisão ruim pode ser qualquer uma "
+"entre:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "não é possível fazer o bisect (nenhuma revisão boa conhecida)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "não é possível fazer o bisect (nenhuma revisão ruim conhecida)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(o uso 'hg bisect <cmd>' é obsoleto)\n"
+
+msgid "incompatible arguments"
+msgstr "argumentos incompatíveis"
+
+msgid "current bisect revision is unknown - start a new bisect to fix"
+msgstr ""
+"a revisão biseccionada atual é desconhecida - para corrigir inicie uma nova "
+"bissecção"
+
+msgid "current bisect revision is a merge"
+msgstr "a revisão biseccionada atual é uma mesclagem"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "falhou ao executar %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s morto"
+
+#, python-format
+msgid "changeset %d:%s: %s\n"
+msgstr "revisão %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "Ampliando a busca até a revisão %d:%s\n"
+
+msgid "nothing to extend"
+msgstr "nada para ampliar"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "Testando a revisão %d:%s (%d revisões restando, ~%d testes)\n"
+
+msgid "force"
+msgstr "forçar"
+
+msgid "delete a given bookmark"
+msgstr "apaga o marcador pedido"
+
+msgid "rename a given bookmark"
+msgstr "renomeia um marcador"
+
+msgid "mark a bookmark inactive"
+msgstr "torna um marcador inativo"
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NOME] [-r REV] [NOME]"
+
+msgid "track a line of development with movable markers"
+msgstr "rastreia uma linha de desenvolvimento com marcadores móveis"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when committing.\n"
+" Bookmarks are local. They can be renamed, copied and deleted. It is\n"
+" possible to use :hg:`merge NAME` to merge from a given bookmark, and\n"
+" :hg:`update NAME` to update to a given bookmark."
+msgstr ""
+" Marcadores são ponteiros para certas consolidações que se movem\n"
+" quando novas consolidações forem feitas. Marcadores são locais.\n"
+" Eles podem ser renomeados, copiados e removidos. É possível usar\n"
+" :hg:`merge NOME` para mesclar com um marcador específico, e\n"
+" :hg:`update NOME` para atualizar para um marcador específico."
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" Você pode usar :hg:`bookmark NOME` para definir um marcador na\n"
+" revisão pai do diretório de trabalho com o nome informado. Se você\n"
+" especificar a revisão usando -r REV (onde REV pode ser o nome de\n"
+" um marcador existente), o marcador é apontado para tal revisão."
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this means\n"
+" the bookmarks extension must be enabled."
+msgstr ""
+" Marcadores podem ser transferidos entre repositórios usando push\n"
+" e pull (veja :hg:`help push` e :hg:`help pull`). Isto requer que\n"
+" marcadores sejam suportados tanto no repositório local como no\n"
+" remoto. Em versões anteriores à 1.8, a extensão bookmarks\n"
+" precisa ser habilitada.\n"
+" "
+
+msgid ""
+" With -i/--inactive, the new bookmark will not be made the active\n"
+" bookmark. If -r/--rev is given, the new bookmark will not be made\n"
+" active even if -i/--inactive is not given. If no NAME is given, the\n"
+" current active bookmark will be marked inactive.\n"
+" "
+msgstr ""
+" Com -i/--inactive, o novo marcador não se tornará ativo. Se\n"
+" -r/--rev for passada, o novo marcador não se tornará ativo mesmo\n"
+" que -i/--inactive não seja passada. Se nenhum NOME for dado, o\n"
+" marcador ativo atual se tornará inativo.\n"
+" "
+
+msgid "bookmark name required"
+msgstr "requerido nome do marcador"
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "o marcador '%s' não existe"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "o marcador '%s' já existe (use -f para forçar)"
+
+msgid "new bookmark name required"
+msgstr "requerido nome do novo marcador"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "o nome do marcador não pode conter novas linhas"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "nomes de marcadores não podem conter apenas espaços em branco"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "um marcador não pode ter o mesmo nome de um ramo existente"
+
+msgid "no bookmarks set\n"
+msgstr "nenhum marcador definido\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "especifica nome do ramo mesmo se ocultar um ramo existente"
+
+msgid "reset branch name to parent branch name"
+msgstr "especifica o nome do ramo como o nome do ramo do pai"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NOME]"
+
+msgid "set or show the current branch name"
+msgstr "define ou mostra o nome de ramo atual"
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent and global. Use :hg:`bookmark` to create a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+" .. note::\n"
+" Nomes de ramos são permanentes e globais. Use :hg:`bookmark`\n"
+" para criar um marcador leve temporário. Veja :hg:`help glossary`\n"
+" para mais informações sobre ramos nomeados e marcadores."
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" Sem argumentos, mostra o nome de ramo atual. Com um argumento,\n"
+" define o nome de ramo do diretório de trabalho (o ramo não\n"
+" existirá no repositório até a próxima consolidação). Recomenda-se\n"
+" usar o ramo 'default' como ramo primário de desenvolvimento."
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" A não ser que -f/--force seja especificado, o comando branch não\n"
+" deixará você definir um nome de ramo que já existe, mesmo que\n"
+" tal ramo esteja inativo."
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" Use -C/--clean para redefinir o ramo do diretório de trabalho\n"
+" para o ramo do pai do diretório de trabalho, desfazendo uma\n"
+" mudança de ramo anterior."
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" Use o comando :hg:`update` para alternar para um ramo existente.\n"
+" Use :hg:`commit --close-branch` para marcar este ramo como\n"
+" fechado.\n"
+" "
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "redefine o diretório de trabalho para o ramo %s\n"
+
+msgid "a branch of the same name already exists"
+msgstr "já existe um ramo com o mesmo nome"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "use 'hg update' para mudar para ele"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "diretório de trabalho marcado como ramo %s\n"
+
+msgid "(branches are permanent and global, did you want a bookmark?)\n"
+msgstr ""
+"(ramos nomeados são permanentes e globais, use um bookmark para um marcador "
+"não permanente)\n"
+
+msgid "show only branches that have unmerged heads"
+msgstr "mostra apenas ramos que possuem cabeças não mescladas"
+
+msgid "show normal and closed branches"
+msgstr "mostra ramos normais e fechados"
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "list repository named branches"
+msgstr "lista os ramos nomeados do repositório"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" Lista os ramos nomeados do repositório, indicando quais são\n"
+" inativos. Se -c/--closed for especificado, exibe também ramos\n"
+" marcados como fechados (veja :hg:`commit --close-branch`)."
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" Se -a/--active for especificado, mostra apenas ramos ativos. Um\n"
+" ramo é considerado ativo se contém cabeças de repositório."
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr " Use o comando :hg:`update` para trocar para um ramo existente."
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+" Devolve 0.\n"
+" "
+
+msgid " (closed)"
+msgstr " (fechado)"
+
+msgid " (inactive)"
+msgstr " (inativo)"
+
+msgid "run even when the destination is unrelated"
+msgstr "execute mesmo se o destino não for relacionado"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "uma revisão que deve ser adicionada ao destino"
+
+msgid "a specific branch you would like to bundle"
+msgstr "um ramo específico que você gostaria de incluir no bundle"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "uma revisão base que se assume estar presente no destino"
+
+msgid "bundle all changesets in the repository"
+msgstr "cria um bundle com todas as revisões no repositório"
+
+msgid "bundle compression type to use"
+msgstr "tipo de compressão de bundle a ser usada"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TIPO] [-a] [-r REV]... [--base REV]... ARQUIVO [DEST]"
+
+msgid "create a changegroup file"
+msgstr "cria um arquivo de changegroup (coleção de revisões)"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+" Gera um arquivo de changegroup contendo revisões não\n"
+" encontradas no outro repositório."
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+" Se você omitir o repositório de destino, o Mercurial assume que o\n"
+" destino terá todos os nós especificados por um ou mais parâmetros\n"
+" --base. Para criar um bundle contendo todas as revisões, use\n"
+" -a/--all (ou --base null)."
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+" Você pode mudar o método de compressão aplicado com a opção\n"
+" -t/--type. Os métodos de compressão disponíveis são: none\n"
+" (nenhum), bzip2 e gzip (por padrão, bundles são comprimidos\n"
+" usando bzip2)."
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+" O arquivo bundle pode então ser transferido usando métodos\n"
+" convencionais e aplicado a outro repositório com os comandos\n"
+" unbundle ou pull. Isto pode ser útil caso o acesso direto para\n"
+" push e pull não estiver disponível ou se exportar um repositório\n"
+" completo não for desejável."
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+" A aplicação de um bundle preserva todo o conteúdo das revisões,\n"
+" incluindo permissões, informação de cópia/renomeação, e histórico\n"
+" de revisões."
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" Devolve 0 indicando sucesso, 1 se não foram encontradas mudanças.\n"
+" "
+
+msgid "unknown bundle type specified with --type"
+msgstr "tipo de bundle especificado por --type desconhecido"
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "--base é incompatível com uma especificação de destino"
+
+msgid "print output to file with formatted name"
+msgstr "imprime a saída para o arquivo com o nome formatado"
+
+msgid "print the given revision"
+msgstr "imprime a revisão dada"
+
+msgid "apply any matching decode filter"
+msgstr "aplica qualquer filtro de decodificação que case"
+
+msgid "[OPTION]... FILE..."
+msgstr "[OPÇÃO]... ARQUIVO..."
+
+msgid "output the current or given revision of files"
+msgstr "mostra o conteúdo de um arquivo na revisão atual ou pedida"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Imprime o conteúdo dos arquivos especificados na revisão pedida.\n"
+" Se a revisão não for dada, o pai do diretório de trabalho é usado,\n"
+" ou a tip se nenhuma revisão estiver obtida."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" A saída pode ser para um arquivo, e nesse caso o nome do arquivo é\n"
+" dado através de uma string de formatação.As regras de formatação\n"
+" são as mesmas que as do comando export, com as seguintes adições:"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: nome base do arquivo impresso\n"
+" :``%d``: diretório do arquivo impresso, ou '.' se no raiz do repositório\n"
+" :``%p``: caminho do arquivo impresso relativo à raiz"
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "o clone irá conter uma cópia de trabalho vazia (apenas o repositório)"
+
+msgid "revision, tag or branch to check out"
+msgstr "revisão, etiqueta ou ramo a ser obtido"
+
+msgid "include the specified changeset"
+msgstr "inclui a revisão especificada"
+
+msgid "clone only the specified branch"
+msgstr "clona apenas o ramo especificado"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[OPÇÃO]... ORIGEM [DEST]"
+
+msgid "make a copy of an existing repository"
+msgstr "cria uma cópia de um repositório existente"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Cria uma cópia de um repositório existente em um novo diretório."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" Se um diretório de destino não for especificado, será usado o\n"
+" nome base da origem."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" A localização da origem é adicionada ao arquivo ``.hg/hgrc`` do novo\n"
+" repositório, como o padrão a ser usado para futuros comandos\n"
+" pull."
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+" Apenas caminhos locais e URLs ``ssh://`` são suportados no\n"
+" destino. Para destinos ``ssh://``, a cópia de trabalho e arquivo\n"
+" ``.hg/hgrc`` não serão criados no repositório remoto."
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+" Para trazer apenas um subconjunto de revisões, especifique um\n"
+" ou mais identificadores de revisão com -r/--rev ou ramos com\n"
+" -b/--branch. O clone resultante conterá apenas as revisões\n"
+" especificadas e seus ancestrais. Estas opções (ou\n"
+" 'clone origem#rev dest') implicam --pull, mesmo para repositórios\n"
+" locais. Note que especificar uma etiqueta incluirá a revisão\n"
+" etiquetada mas não incluirá a revisão que define a etiqueta em si."
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+" Para obter uma revisão em particular, use -u/--update, ou\n"
+" -U/--noupdate para criar um clone sem um diretório de trabalho."
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" Por eficiência, hardlinks são usados para a clonagem sempre que a\n"
+" origem e o destino estiverem no mesmo sistema de arquivos (note\n"
+" que isso se aplica apenas aos dados do repositório, e não aos\n"
+" arquivos da cópia de trabalho). Alguns sistemas de arquivo, como\n"
+" o AFS, implementam hardlinks incorretamente, mas não informam\n"
+" erros. Nesses casos, use a opção --pull para evitar o uso de\n"
+" hardlinks."
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" Em alguns casos, você pode clonar repositórios e o diretório de\n"
+" trabalho usando hardlinks completos com ::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al REPO REPOCLONE"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" Este é o jeito mais rápido de clonar, mas não é sempre seguro. A\n"
+" operação não é atômica (garantir que REPO não seja modificado\n"
+" durante a operação é sua responsabilidade) e você deve ter\n"
+" certeza que seu editor quebre hardlinks (o Emacs e muitos\n"
+" utilitários do kernel Linux fazem isso). Além disso, esse modo de\n"
+" criar um clone não é compatível com certas extensões que colocam\n"
+" seus metadados sob o diretório hg, como a mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" O Mercurial atualizará o diretório de trabalho para a primeira revisão\n"
+" aplicável da seguinte lista:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) null, se for passada a opção -U ou se o repositório de origem não\n"
+" tiver revisões\n"
+" b) o primeiro pai do diretório de trabalho do repositório de origem,\n"
+" se for passada a opção -u e o repositório de origem for local\n"
+" c) a revisão especificada por -u (se for um nome de ramo, é a última\n"
+" cabeça de tal ramo)\n"
+" d) a revisão especificada com -r\n"
+" e) a cabeça mais recente especificada com -b\n"
+" f) a cabeça mais recente especificada com a sintaxe de origem\n"
+" url#ramo\n"
+" g) a cabeça mais recente do ramo default\n"
+" h) a tip"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr ""
+" - clona um repositório remoto para um novo diretório chamado hg/::"
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr " - cria um clone leve local::"
+
+msgid " hg clone project/ project-feature/"
+msgstr " hg clone project/ project-feature/"
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+" - clona um caminho absoluto em um servidor ssh (note as barras\n"
+" duplicadas)::"
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr " hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr ""
+" - faz um clone em alta velocidade em uma LAN e obtém uma\n"
+" revisão específica::"
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr " hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr ""
+" - cria um repositório sem revisões após uma revisão em particular::"
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr " hg clone -r 04e544 experimental/ good/"
+
+msgid " - clone (and track) a particular named branch::"
+msgstr " - clona (e rastreia) um ramo nomeado em particular::"
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr " hg clone http://selenic.com/hg#stable"
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " Veja :hg:`help urls` para detalhes sobre a especificação de URLs."
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "não se pode especificar ao mesmo tempo ---noupdate e --updaterev"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+"marca arquivos novos/ausentes como adicionados/removidos antes da "
+"consolidação"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "marca um ramo como fechado, escondendo-o da lista de ramos"
+
+msgid "amend the parent of the working dir"
+msgstr "emenda o pai do diretório de trabalho"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "consolida os arquivos pedidos ou todas as mudanças por gravar"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Consolida no repositório local mudanças nos arquivos dados. Ao\n"
+" contrário do que ocorre em um sistema de controle de versão\n"
+" centralizado, esta operação é local. Veja :hg:`push` para um modo\n"
+" de distribuir ativamente suas mudanças."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Se não for passada uma lista de arquivos, todas as mudanças\n"
+" informadas por :hg:`status` serão gravadas."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Se você estiver consolidando o resultado de uma mesclagem, não\n"
+" forneça nenhum nome de arquivo ou filtros -I/-X ."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" Se não for passada uma mensagem de consolidação, o Mercurial inicia\n"
+" o editor de texto configurado, para que você digite a mensagem. No\n"
+" caso de a consolidação falhar, é criada uma cópia de segurança\n"
+" dessa mensagem em ``.hg/last-message.txt``."
+
+msgid ""
+" The --amend flag can be used to amend the parent of the\n"
+" working directory with a new commit that contains the changes\n"
+" in the parent in addition to those currently reported by :hg:`status`,\n"
+" if there are any. The old commit is stored in a backup bundle in\n"
+" ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+" on how to restore it)."
+msgstr ""
+" A opção --amend pode ser usada para emendar o pai do diretório\n"
+" de trabalho com uma nova revisão que contenha as mudanças no pai\n"
+" somadas às mudanças atualmente informadas por :hg:`status`, se\n"
+" houver alguma. A revisão antiga é armazenada em um bundle de\n"
+" backup em ``.hg/strip-backup`` (para restaurar essa revisão, veja\n"
+" :hg:`help bundle` e :hg:`help unbundle`)."
+
+msgid ""
+" Message, user and date are taken from the amended commit unless\n"
+" specified. When a message isn't specified on the command line,\n"
+" the editor will open with the message of the amended commit."
+msgstr ""
+" Se não forem especificados, o usuário, mensagem e data são\n"
+" tomados da revisão emendada. Se uma mensagem não for especificada\n"
+" na linha de comando, o editor será aberto com a mensagem original\n"
+" da revisão emendada."
+
+msgid ""
+" It is not possible to amend public changesets (see :hg:`help phases`)\n"
+" or changesets that have children."
+msgstr ""
+" Não é possível emendar revisões públicas (veja :hg:`help phases`)\n"
+" ou revisões que contenham filhas."
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se nada mudou.\n"
+" "
+
+msgid "can only close branch heads"
+msgstr "só pode fechar cabeças de ramo"
+
+msgid "cannot amend recursively"
+msgstr "não é possível emendar recursivamente"
+
+msgid "cannot amend public changesets"
+msgstr "não é possível emendar revisões públicas"
+
+msgid "cannot amend merge changesets"
+msgstr "não é possível emendar revisões de mesclagem"
+
+msgid "cannot amend while merging"
+msgstr "não é possível emendar durante uma mesclagem"
+
+msgid "cannot amend changeset with children"
+msgstr "não é possível emendar revisões com filhas"
+
+msgid "nothing changed\n"
+msgstr "nada mudou\n"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr "nada mudou (%d arquivos faltando, veja 'hg status')\n"
+
+msgid "created new head\n"
+msgstr "nova cabeça criada\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "reabrindo cabeça de ramo fechada %d\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "consolidada a revisão %d:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr "grava uma cópia que já ocorreu"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "força cópia sobre um arquivo não gerenciado existente"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[OPÇÃO]... [ORIGEM]... DEST"
+
+msgid "mark files as copied for the next commit"
+msgstr "marca arquivos como copiados para a próxima consolidação"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+" Marca dest como tendo cópias de arquivos de origem. Se dest for\n"
+" um diretório, cópias são colocadas nesse diretório. Se dest for\n"
+" um arquivo, só pode haver uma origem."
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+" Por padrão, este comando copia os conteúdos de arquivos como\n"
+" estão no diretório de trabalho. Se chamado com a opção\n"
+" -A/--after, a operação é gravada, mas nenhuma cópia é feita."
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Este comando faz efeito na próxima consolidação. para desfazer\n"
+" uma cópia antes disso, veja :hg:`revert`."
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se erros forem encontrados.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[ÃNDICE] REV1 REV2"
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "encontra a revisão ancestral de duas revisões no índice dado"
+
+msgid "either two or three arguments required"
+msgstr "ou dois ou três argumentos necessários"
+
+msgid "add single file mergeable changes"
+msgstr "adiciona mudanças mescláveis em arquivos únicos"
+
+msgid "add single file all revs overwrite"
+msgstr "adiciona um único arquivo que todas as revisões sobrescrevem"
+
+msgid "add new file at each rev"
+msgstr "adiciona um arquivo novo a cada revisão"
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[OPÇÃO]... [TEXTO]"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr ""
+"constrói um repositório do zero com um DAG dado em um repositório vazio "
+"existente"
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+" Se não for passada na linha de comando, a descrição do DAG é lida\n"
+" da entrada padrão."
+
+msgid " Elements:"
+msgstr " Elementos:"
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+" - \"+n\" é uma sequência linear de n nós baseada no pai default atual\n"
+" - \".\" é um único nó baseado no pai default atual\n"
+" - \"$\" redefine o pai default para null (valor usado no início);\n"
+" de outra maneira o pai default é sempre o último nó criado\n"
+" - \"<p\" define o pai default para a backref p\n"
+" - \"*p\" é uma bifurcação no pai p, que é uma backref\n"
+" - \"*p1/p2\" é uma mesclagem dos pais p1 e p2, que são backrefs\n"
+" - \"/p2\" é uma mesclagem do nó anterior e p2\n"
+" - \":tag\" define uma etiqueta local para o nó anterior\n"
+" - \"@branch\" define o nome de ramo para nós subsequentes\n"
+" - \"#...\\n\" é um comentário até o fim da linha"
+
+msgid " Whitespace between the above elements is ignored."
+msgstr " Espaços em branco entre os elementos acima são ignorados."
+
+msgid " A backref is either"
+msgstr " Uma backref pode ser"
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+" - um número n, que referencia o nó atual-n, ou\n"
+" - o nome de uma tag local criada anteriormente com \":tag\", ou\n"
+" - vazio, denotando o pai default."
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape character.\n"
+" "
+msgstr ""
+" Todos os elementos com valores string devem ser ou estritamente\n"
+" alfanuméricos, ou devem estar entre aspas duplas (\"...\"), usando\n"
+" \"\\\" como caractere de escape.\n"
+" "
+
+msgid "reading DAG from stdin\n"
+msgstr "lendo DAG da entrada padrão\n"
+
+msgid "repository is not empty"
+msgstr "repositório não está vazio"
+
+msgid "building"
+msgstr "construindo"
+
+msgid "show all details"
+msgstr "mostra todos os detalhes"
+
+msgid "lists the contents of a bundle"
+msgstr "lista o conteúdo de um bundle"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "valida a exatidão do dirstate atual"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s no estado %s, mas não no manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s no estado %s, mas também no manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s no estado %s, mas não em qualquer manifesto\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr "%s no manifest1, mas listado como estado %s"
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ".hg/dirstate inconsistente com manifesto do pai atual"
+
+msgid "[COMMAND]"
+msgstr "[COMANDO]"
+
+msgid "list all available commands and options"
+msgstr "exibe todas as opções e comandos disponíveis"
+
+msgid "show the command options"
+msgstr "exibe opções dos comandos"
+
+msgid "[-o] CMD"
+msgstr "[-o] CMD"
+
+msgid "returns the completion list associated with the given command"
+msgstr "devolve a lista de complementos associada ao comando dado"
+
+msgid "use tags as labels"
+msgstr "usa etiquetas como rótulos"
+
+msgid "annotate with branch names"
+msgstr "comenta com nomes de ramos"
+
+msgid "use dots for runs"
+msgstr "usar pontos para representar sequências"
+
+msgid "separate elements by spaces"
+msgstr "separa elementos usando espaços"
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[OPÇÃO]... [ARQUIVO [REVISÃO]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+"formata o changelog ou um índice DAG como uma representação textual concisa"
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+" Se você passar um índice de revlog, o DAG do revlog será emitido.\n"
+" Se você listar números de revisão, eles serão rotulados na saída\n"
+" como rN."
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+" Caso contrário, imprime o DAG do changelog do repositório atual.\n"
+" "
+
+msgid "need repo for changelog dag"
+msgstr "é necessário um repositório para o DAG do changelog"
+
+msgid "open changelog"
+msgstr "abre o changelog"
+
+msgid "open manifest"
+msgstr "abre o manifesto"
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|ARQUIVO REV"
+
+msgid "dump the contents of a data file revision"
+msgstr "exibe o conteúdo de uma revisão de dados de arquivo"
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr "identificador de revisão inválido %s"
+
+msgid "try extended date formats"
+msgstr "tenta formatos de data estendidos"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATA [INTERVALO]"
+
+msgid "parse and display a date"
+msgstr "decodifica e exibe uma data"
+
+msgid "use old-style discovery"
+msgstr "usa descoberta de nós antiga"
+
+msgid "use old-style discovery with non-heads included"
+msgstr "usa descoberta de nós antiga com não-cabeças incluídas"
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr "[-l REV] [-r REV] [-b RAMO]... [OUTRO]"
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr "executa o protocolo discovery isoladamente"
+
+msgid "parse and apply a fileset specification"
+msgstr "interpreta e aplica uma especificação de fileset"
+
+msgid "[PATH]"
+msgstr "[CAMINHO]"
+
+msgid "show information detected about current filesystem"
+msgstr "mostra informações detectadas sobre o sistema de arquivos atual"
+
+msgid "id of head node"
+msgstr "id do nó cabeça"
+
+msgid "id of common node"
+msgstr "id do nó comum"
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr "REPO ARQUIVO [-H|-C ID]..."
+
+msgid "retrieves a bundle from a repo"
+msgstr "obtém um bundle de um repositório"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to the\n"
+" given file.\n"
+" "
+msgstr ""
+" Todo ID deve ser uma string hexadecimal completa.\n"
+" Grava o bundle no arquivo pedido.\n"
+" "
+
+msgid "display the combined ignore pattern"
+msgstr "exibe o padrão combinado de arquivos ignorados"
+
+msgid "no ignore patterns found"
+msgstr "nenhum padrão de arquivos ignorados encontrado"
+
+msgid "revlog format"
+msgstr "formato do revlog"
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr "[-f FORMATO] -c|-m|ARQUIVO"
+
+msgid "dump the contents of an index file"
+msgstr "extrai o conteúdo de um arquivo de índice"
+
+#, python-format
+msgid "unknown format %d"
+msgstr "formato desconhecido %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "extrai os dados de um índice DAG como um arquivo .dot do graphviz"
+
+msgid "test Mercurial installation"
+msgstr "testa a instalação do Mercurial"
+
+#, python-format
+msgid "checking encoding (%s)...\n"
+msgstr "verificando codificação (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (verifique se seu locale está configurado propriamente)\n"
+
+#, python-format
+msgid "checking installed modules (%s)...\n"
+msgstr "verificando módulos instalados (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " Uma ou mais extensões não puderam ser encontradas"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (verifique se você compilou as extensões)\n"
+
+#, python-format
+msgid "checking templates (%s)...\n"
+msgstr "verificando modelos (%s)...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr " (modelos parecem ter sido instalados incorretamente)\n"
+
+msgid "checking commit editor...\n"
+msgstr "verificando editor para consolidação...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+" Nenhum editor para consolidação configurado, e não foi possível encontrar "
+"'vi' no PATH\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr ""
+" (especifique um editor para consolidação em seu arquivo de configuração)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr " Não é possível localizar editor '%s' no PATH\n"
+
+msgid "checking username...\n"
+msgstr "verificando nome de usuário...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (especifique um nome de usuário em seu arquivo de configuração)\n"
+
+msgid "no problems detected\n"
+msgstr "nenhum problema detectado\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "%s problemas detectados, por favor verifique sua instalação!\n"
+
+msgid "REPO ID..."
+msgstr "REPO ID..."
+
+msgid "test whether node ids are known to a repo"
+msgstr "testa se os ids dos nós são conhecidos em um repositório"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s\n"
+" and 1s indicating unknown/known.\n"
+" "
+msgstr ""
+" Todo ID deve ser uma string hexadecimal completa.\n"
+" Devolve uma lista de 0s e 1s indicando respectivamente\n"
+" desconhecidos e conhecidos.\n"
+" "
+
+msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
+msgstr "[OBSOLETA [SUBSTITUTA] [SUBSTITUTA... ]"
+
+msgid "create arbitrary obsolete marker"
+msgstr "cria uma marcação de obsolescência arbitrária"
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr "REPOSITÓRIO NAMESPACE [CHAVE ANTIGO NOVO]"
+
+msgid "access the pushkey key/value protocol"
+msgstr "acessa o protocolo pushkey de pares chave/valor"
+
+msgid " With two args, list the keys in the given namespace."
+msgstr " Com dois argumentos, lista as chaves no espaço de nomes dado."
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+" Com cinco argumentos, redefine uma chave para o novo valor se\n"
+" estiver no momento definida para o valor antigo.\n"
+" Informa sobre sucesso ou falha.\n"
+" "
+
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr "profundidade(a): %d profundidade(b): %d\n"
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr "delta: %d hdist: %d distância: %d relação: %s\n"
+
+msgid "revision to rebuild to"
+msgstr "revisão para a qual reconstruir"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r REV] [REV]"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr "reconstrói o dirstate como ele pareceria para a revisão dada"
+
+msgid "revision to debug"
+msgstr "revisão a ser depurada"
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] ARQUIVO"
+
+msgid "dump rename information"
+msgstr "exibe informações de renomeação"
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s renomeado de %s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s não renomeado\n"
+
+msgid "dump index data"
+msgstr "imprime diretamente dados do índice"
+
+msgid "-c|-m|FILE"
+msgstr "-c|-m|ARQUIVO"
+
+msgid "show data and statistics about a revlog"
+msgstr "mostra dados e estatísticas sobre um revlog"
+
+msgid "parse and apply a revision specification"
+msgstr "interpreta e aplica uma especificação de revisões"
+
+msgid ""
+" Use --verbose to print the parsed tree before and after aliases\n"
+" expansion.\n"
+" "
+msgstr ""
+" Use --verbose para imprimir a árvore decodificada antes e depois\n"
+" da expansão de apelidos.\n"
+" "
+
+msgid "REV1 [REV2]"
+msgstr "REV1 [REV2]"
+
+msgid "manually set the parents of the current working directory"
+msgstr "muda manualmente os pais do diretório de trabalho atual"
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+" Isto é útil para escrever utilitários de conversão de repositórios, mas\n"
+" deve ser usado com cuidado."
+
+msgid "do not display the saved mtime"
+msgstr "não exibe o mtime armazenado"
+
+msgid "sort by saved mtime"
+msgstr "ordena por mtime armazenado"
+
+msgid "[OPTION]..."
+msgstr "[OPÇÃO]..."
+
+msgid "show the contents of the current dirstate"
+msgstr "mostra o conteúdo do dirstate atual"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "cópia: %s -> %s\n"
+
+msgid "revision to check"
+msgstr "revisão para verificar"
+
+msgid "show how files match on given patterns"
+msgstr "mostra como os arquivos casam com os padrões pedidos"
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "REPO [OPÇÕES]... [UM [DOIS]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPÇÃO]... ([-c REV] | [-r REV1 [-r REV2]]) [ARQUIVO]..."
+
+msgid "diff repository (or selected files)"
+msgstr "exibe um diff do repositório (ou arquivos selecionados)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr " Mostra diferenças entre revisões para os arquivos especificados."
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+" Diferenças entre arquivos são mostradas usando o formato\n"
+" \"unified diff\"."
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" diff pode gerar resultados inesperados para mesclagens, já\n"
+" que por padrão irá comparar com o primeiro pai do diretório de\n"
+" trabalho se uma revisão não for especificada."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" Alternativamente você pode especificar -c/--change com uma revisão\n"
+" para ver as mudanças nessa revisão relativas a seu primeiro pai."
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" Sem a opção -a/--text, diff evitará gerar diffs de arquivos que\n"
+" detectar como binários. Com -a, diff irá gerar um diff de\n"
+" qualquer maneira, provavelmente com resultados não desejados."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" Use a opção -g/--git para gerar diffs no formato estendido\n"
+" \"git diff\". Leia :hg:`help diffs` para mais informações."
+
+msgid ""
+" - compare a file in the current working directory to its parent::"
+msgstr ""
+" - compara um arquivo no diretório de trabalho atual com seu pai::"
+
+msgid " hg diff foo.c"
+msgstr " hg diff foo.c"
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr ""
+" - compara duas versões históricas de um diretório, com\n"
+" informações de renomeação::"
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr " hg diff --git -r 1.0:1.2 lib/"
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr ""
+" - obtém estatísticas de modificações relativas à última\n"
+" mudança em alguma data::"
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr " hg diff --stat -r \"date('may 2')\""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr ""
+" - faz diff de todos os arquivos recém-adicionados que\n"
+" contenham uma palavra chave::"
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr " hg diff \"set:added() and grep(GNU)\""
+
+msgid " - compare a revision and its parents::"
+msgstr " - compara uma revisão com seus pais::"
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+" hg diff -c 9353 # compara com o primeiro pai\n"
+" hg diff -r 9353^:9353 # o mesmo, usando sintaxe revset\n"
+" hg diff -r 9353^2:9353 # compara com o segundo pai"
+
+msgid "diff against the second parent"
+msgstr "faz o diff com o segundo pai"
+
+msgid "revisions to export"
+msgstr "revisões a serem exportadas"
+
+msgid "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
+msgstr "[OPÇÃO]... [-o PADRÃOARQSAÃDA] [-r] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "exibe o cabeçalho e diffs para uma ou mais revisões"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+" Imprime o cabeçalho de revisão e diffs para uma ou mais\n"
+" revisões."
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" A informação exibida no cabeçalho de revisão é: autor, data,\n"
+" nome do ramo (se diferente do default), hash da revisão, pai(s)\n"
+" e comentário de consolidação."
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" export pode gerar saída de diff inesperada para revisões\n"
+" de mesclagem, já que irá comparar a revisão de mesclagem\n"
+" apenas com seu primeiro pai."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" A saída pode ser gerada em um arquivo, e nesse caso o nome do\n"
+" arquivo é dado usando uma string de formato. As regras de\n"
+" formatação são como segue:"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: caractere \"%\" literal\n"
+" :``%H``: hash da revisão (40 bytes hexadecimais)\n"
+" :``%N``: número de patches gerados\n"
+" :``%R``: número de ordem da revisão\n"
+" :``%b``: nome base do repositório onde o export é realizado\n"
+" :``%h``: hash de forma curta da revisão (12 bytes hexadecimais)\n"
+" :``%m``: primeira linha da mensagem de consolidação (apenas caracteres alfanuméricos)\n"
+" :``%n``: número sequencial completado com zeros, começando em 1\n"
+" :``%r``: número de ordem da revisão completado com zeros"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" Sem a opção -a/--text, export evitará gerar diffs de arquivos\n"
+" detectados como binários. Com -a, export gerará um diff de\n"
+" qualquer maneira, provavelmente com resultados não desejados."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" Use a opção -g/--git para gerar diffs no formato estendido\n"
+" \"git diff\". Veja :hg:`help diffs` para mais informações."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" Com a opção --switch-parent, o diff será feito em relação ao\n"
+" segundo pai. Isso pode ser útil para avaliar uma mesclagem."
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr ""
+" - usa export e import para transplantar uma correção para o ramo\n"
+" atual::"
+
+msgid " hg export -r 9353 | hg import -"
+msgstr " hg export -r 9353 | hg import -"
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr ""
+" - exporta todas as revisões entre duas revisões específicas para\n"
+" um arquivo com informações de renomeação::"
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr " hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr ""
+" - separa mudanças a serem enviadas em uma série de patches com\n"
+" nomes descritivos::"
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
+msgid "export requires at least one changeset"
+msgstr "export exige ao menos uma revisão"
+
+msgid "exporting patches:\n"
+msgstr "exportando patches:\n"
+
+msgid "exporting patch:\n"
+msgstr "exportando patch:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr "esquece os arquivos especificados na próxima consolidação"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+" Marca os arquivos especificados de modo que não serão mais\n"
+" rastreados após a próxima consolidação."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" Isto remove arquivos apenas do ramo atual,e não de todo o\n"
+" histórico do projeto, nem os apaga do diretório de trabalho."
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+" Para desfazer um forget antes da próxima consolidação, veja :hg:`add`."
+
+msgid " - forget newly-added binary files::"
+msgstr " - esquece arquivos binários recém adicionados::"
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr " hg forget \"set:added() and binary()\""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr " - esquece arquivos que seriam excluídos por .hgignore::"
+
+msgid " hg forget \"set:hgignore()\""
+msgstr " hg forget \"set:hgignore()\""
+
+msgid "revisions to graft"
+msgstr "revisões a serem enxertadas"
+
+msgid "resume interrupted graft"
+msgstr "continua um enxerto interrompido"
+
+msgid "append graft info to log message"
+msgstr "anexa informações de enxerto à mensagem de log"
+
+msgid "record the current date as commit date"
+msgstr "grava a data atual como data da consolidação"
+
+msgid "record the current user as committer"
+msgstr "grava o usuário atual como autor da consolidação"
+
+msgid "[OPTION]... [-r] REV..."
+msgstr "[OPÇÃO]... [-r] REV..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "copia mudanças de outros ramos para o ramo atual"
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+" Este comando usa a lógica de mesclagens do Mercurial para\n"
+" copiar mudanças individuais de outros ramos sem mesclar\n"
+" os ramos no grafo de histórico. Isto é por vezes chamado de\n"
+" 'backporting' ou 'cherry-picking'. Por padrão, graft\n"
+" copiará o usuário, data e descrição das revisões de\n"
+" origem."
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+" Serão omitidas revisões ancestrais da revisão atual, já\n"
+" enxertadas ou mesclagens."
+
+msgid " (grafted from CHANGESETHASH)"
+msgstr " (grafted from CHANGESETHASH)"
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
+msgstr ""
+" Se a mesclagem de enxerto resultar em conflitos, o processo de\n"
+" enxerto será interrompido para que a mesclagem atual possa ser\n"
+" resolvida manualmente. Uma vez que todos os conflitos estejam\n"
+" resolvidos, o processo de enxerto pode ser retomado usando a\n"
+" opção -c/--continue."
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+" .. note::\n"
+" A opção -c/--continue não reaplica opções anteriores."
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr ""
+" - copia uma única mudança para o ramo stable e edita sua descrição::"
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+" hg update stable\n"
+" hg graft --edit 9393"
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+" - enxerta uma faixa de revisões com uma exceção, atualizando as "
+"datas::"
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr " hg graft -D \"2085::2093 and not 2091\""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr " - continua um processo de enxerto após resolver conflitos::"
+
+msgid " hg graft -c"
+msgstr " hg graft -c"
+
+msgid " - show the source of a grafted changeset::"
+msgstr " - mostra a origem de uma revisão enxertada::"
+
+msgid " hg log --debug -r tip"
+msgstr " hg log --debug -r tip"
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso.\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "não é possível especificar --continue e revisões"
+
+msgid "no graft state found, can't continue"
+msgstr "estado de graft não encontrado, não é possível continuar"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "omitindo revisão de mesclagem %s que não pode ser enxertada\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "omitindo revisão ancestral %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "omitindo revisão %s já enxertada\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (same origin %d)\n"
+msgstr "omitindo revisão %s já enxertada (mesma origem %d)\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (was grafted from %d)\n"
+msgstr "omitindo revisão %s já enxertada (foi enxertada de %d)\n"
+
+#, python-format
+msgid "grafting revision %s\n"
+msgstr "enxertando revisão %s\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "conflitos não resolvidos, não é possível continuar"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "use hg resolve e hg graft --continue"
+
+#, python-format
+msgid "graft for revision %s is empty\n"
+msgstr "o enxerto para a revisão %s é vazio\n"
+
+msgid "end fields with NUL"
+msgstr "termina campos com NUL"
+
+msgid "print all revisions that match"
+msgstr "imprime todas as revisões que casarem"
+
+msgid "ignore case when matching"
+msgstr "ignora maiúsculas/minúsculas ao casar"
+
+msgid "print only filenames and revisions that match"
+msgstr "imprime apenas nomes de arquivo e revisões que casarem"
+
+msgid "print matching line numbers"
+msgstr "imprime número de linhas que casarem"
+
+msgid "only search files changed within revision range"
+msgstr "procura apenas por arquivos que mudaram dentro do intervalo pedido"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[OPÇÃO]... PADRÃO [ARQUIVO]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "procura por um padrão nos arquivos e revisões especificados"
+
+msgid " Search revisions of files for a regular expression."
+msgstr " Procura em revisões e arquivos por uma expressão regular."
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+" Este comando se comporta de modo diferente do grep do Unix. Ele\n"
+" aceita apenas expressões regulares Python/Perl. Ele procura no\n"
+" histórico do repositório, não no diretório de trabalho. Ele\n"
+" sempre imprime o número da revisão onde um casamento aparece."
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+" Por padrão, grep imprime uma saída apenas para a primeira revisão\n"
+" de um arquivo no qual ele encontra uma correspondência.\n"
+" Para fazê-lo imprimir todas as revisões que contenham uma\n"
+" mudança de correspondência (\"-\" para uma correspondência\n"
+" que se torne uma não correspondência, ou \"+\" para uma não\n"
+" correspondência que se torne uma correspondência), use a\n"
+" opção --all ."
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+" Devolve 0 se um resultado for encontrado, 1 caso contrário.\n"
+" "
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: padrão de busca inválido: %s\n"
+
+msgid "STARTREV"
+msgstr "REVINICIAL"
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "mostra apenas cabeças descendentes de REVINICIAL"
+
+msgid "show topological heads only"
+msgstr "mostra apenas cabeças topológicas"
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "mostra apenas cabeças de ramo ativas (OBSOLETA)"
+
+msgid "show normal and closed branch heads"
+msgstr "mostra cabeças de ramo normais e fechadas"
+
+msgid "[-ct] [-r STARTREV] [REV]..."
+msgstr "[-ct] [-r REVINICIAL] [REV]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "mostra as cabeças atuais do repositório ou cabeças de ramo"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr " Sem argumentos, mostra todas as cabeças de ramo do repositório."
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+" \"Cabeças\" do repositório são revisões que não têm revisões\n"
+" filhas. Elas são onde o desenvolvimento geralmente\n"
+" acontece e são os alvos costumeiros para operações update e\n"
+" merge. Cabeças de ramo são revisões que não possuem revisões filhas\n"
+" no mesmo ramo."
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+" Se um ou mais argumentos REV forem dados, apenas cabeças de ramo\n"
+" nos ramos correspondentes a essas revisões serão mostradas. Ou\n"
+" seja, você pode usar :hg:`heads foo` para mostrar as cabeças no\n"
+" ramo ``foo``."
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" Se -c/--closed for especificado, mostra também cabeças de ramos\n"
+" marcados como fechados (veja :hg:`commit --close-branch`)."
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+" Se REVINICIAL for especificada, serão mostradas apenas cabeças\n"
+" (ou cabeças de ramo) descendentes de REVINICIAL."
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and only\n"
+" changesets without children will be shown."
+msgstr ""
+" Se -t/--topo for especificado, ramos nomeados serão ignorados e apenas\n"
+" revisões sem filhas serão mostradas."
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" Devolve 0 se cabeças correspondentes forem encontradas,\n"
+" 1 caso contrário.\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "nenhuma cabeça de ramo aberta encontrada nos ramos %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (iniciado em %s)"
+
+msgid "show only help for extensions"
+msgstr "mostra apenas a ajuda para extensões"
+
+msgid "show only help for commands"
+msgstr "mostra apenas a ajuda para comandos"
+
+msgid "show topics matching keyword"
+msgstr "mostra os tópicos que correspondem à palavra chave"
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [TÓPICO]"
+
+msgid "show help for a given topic or a help overview"
+msgstr "exibe o texto de ajuda geral ou de um tópico pedido"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+" Sem argumentos, imprime uma lista de comandos com textos curtos\n"
+" de ajuda."
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" Dado um tópico, extensão, ou nome de comando, imprime o texto de\n"
+" ajuda para esse tópico."
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso.\n"
+" "
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"apelidos: %s\n"
+
+msgid "(no help text available)"
+msgstr "(texto de ajuda não disponível)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "apelido de shell para::"
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "apelido para: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr "use \"hg help -e %s\" para mostrar a ajuda para a extensão %s"
+
+msgid "options:"
+msgstr "opções:"
+
+msgid "global options:"
+msgstr "opções globais:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"use \"hg help %s\" para mostrar o texto completo de ajuda\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"use \"hg -v help %s\" para mostrar mais informações\n"
+
+msgid "basic commands:"
+msgstr "comandos básicos:"
+
+msgid "list of commands:"
+msgstr "lista de comandos:"
+
+msgid "no commands defined\n"
+msgstr "nenhum comando definido\n"
+
+msgid "enabled extensions:"
+msgstr "extensões habilitadas:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"tópicos adicionais de ajuda:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "use \"hg help\" para a lista completa de comandos"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr "use \"hg help\" para a lista completa de comandos ou \"hg -v\" para detalhes"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "use \"hg help %s\" para mostrar o texto completo de ajuda"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"use \"hg -v help%s\" para mostrar apelidos pré-definidos de comandos e "
+"opções globais"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"use \"hg help -c %s\" para mostrar a ajuda do comando %s\n"
+
+msgid "no help text available"
+msgstr "texto de ajuda não disponível"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "extensão %s - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+"use \"hg help extensions\" para informações sobre como habilitar extensões\n"
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr "'%s' é fornecido pela seguinte extensão:"
+
+msgid "Topics"
+msgstr "Tópicos"
+
+msgid "Extension Commands"
+msgstr "Comandos de Extensões"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Sistema de controle de versão distribuído Mercurial\n"
+
+msgid "identify the specified revision"
+msgstr "identifica a revisão especificada"
+
+msgid "show local revision number"
+msgstr "exibe número local de revisão"
+
+msgid "show global revision id"
+msgstr "exibe identificador global de revisão"
+
+msgid "show branch"
+msgstr "exibe ramo"
+
+msgid "show tags"
+msgstr "exibe etiquetas"
+
+msgid "show bookmarks"
+msgstr "exibe marcadores"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [ORIGEM]"
+
+msgid "identify the working copy or specified revision"
+msgstr "identifica a cópia de trabalho ou revisão especificada"
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+" Imprime um sumário identificando o estado do repositório na\n"
+" revisão REV usando um ou dois identificadores de hash dos\n"
+" pais, seguidos por um \"+\" se o diretório de trabalho tiver\n"
+" mudanças pendentes, o nome do ramo (omitido para o ramo\n"
+" default), uma lista de etiquetas e uma lista de marcadores."
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" Se a revisão não for passada, imprime um sumário do estado atual\n"
+" do repositório."
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" Especificar um caminho para a raiz de um repositório ou para um\n"
+" arquivo bundle do Mercurial faz com que a busca opere em tal\n"
+" repositório ou bundle."
+
+msgid " - generate a build identifier for the working directory::"
+msgstr " - gera um identificador de build para o diretório de trabalho::"
+
+msgid " hg id --id > build-id.dat"
+msgstr " hg id --id > build-id.dat"
+
+msgid " - find the revision corresponding to a tag::"
+msgstr " - encontra a revisão que corresponde a uma etiqueta::"
+
+msgid " hg id -n -r 1.3"
+msgstr " hg id -n -r 1.3"
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr " - verifica a revisão mais recente de um repositório remoto::"
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr " hg id -r tip http://selenic.com/hg/"
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr ""
+"não é possível consultar o número de revisão, ramo ou etiquetas remotos"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+"opção de remoção de diretório para o patch. Tem o mesmo significado da opção"
+" correspondente do utilitário patch"
+
+msgid "PATH"
+msgstr "CAMINHO"
+
+msgid "base path (DEPRECATED)"
+msgstr "caminho base (OBSOLETO)"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "não faz verificação de mudanças ainda não consolidadas"
+
+msgid "don't commit, just update the working directory"
+msgstr "não consolida, apenas atualiza o diretório de trabalho"
+
+msgid "apply patch without touching the working directory"
+msgstr "aplica o patch sem alterar o diretório de trabalho"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "aplica o patch aos nós a partir dos quais ele foi gerado"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr "usa qualquer informação de ramo no patch (implicada por --exact)"
+
+msgid "[OPTION]... PATCH..."
+msgstr "[OPÇÃO]... PATCH..."
+
+msgid "import an ordered set of patches"
+msgstr "importa um conjunto ordenado de patches"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+" Importa uma lista de patches e consolida cada um individualmente\n"
+" (se --no-commit não for especificado)."
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+" Se houver mudanças não gravadas no diretório de trabalho, import\n"
+" irá abortar, a não ser que a opção -f/--force seja passada."
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+" Você pode importar um patch direto de uma mensagem de e-mail. São\n"
+" aceitos até mesmo patches anexados (para poder usar o o corpo da\n"
+" mensagem, ele deve ser do tipo text/plain ou text/x-patch). Os\n"
+" cabeçalhos From e Subject da mensagem são usados como autor e\n"
+" mensagem de consolidação, respectivamente. Todas as partes\n"
+" text/plain antes do primeiro diff são adicionadas à mensagem de\n"
+" consolidação."
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+" Se o patch importado foi gerado por :hg:`export`, o usuário e\n"
+" descrição do patch são usados ao invés dos cabeçalhos e corpo da\n"
+" mensagem. Valores passados na linha de comando com -m/--message e\n"
+" -u/--user são usados no lugar destes."
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+" Se --exact for especificado, import irá posicionar o diretório de\n"
+" trabalho no pai de cada patch antes de aplicá-lo, e irá abortar\n"
+" se a revisão resultante tiver um ID diferente do gravado no\n"
+" patch. Isso pode acontecer por problemas de conjunto de\n"
+" caracteres ou outras deficiências no formato de texto de patch."
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+" Use --bypass para aplicar e consolidar patches diretamente no\n"
+" repositório, sem alterar arquivos no diretório de trabalho. Sem\n"
+" --exact, patches serão aplicados sobre a revisão do pai do\n"
+" diretório de trabalho."
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as :hg:`addremove`."
+msgstr ""
+" Com -s/--similarity, hg irá tentar determinar renomeações e\n"
+" cópias no patch do mesmo modo que :hg:`addremove`."
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Para ler um patch da entrada padrão, use \"-\" como nome do\n"
+" patch. Se uma URL for especificada, o patch será obtido a partir\n"
+" dela. Veja :hg:`help dates` para uma lista de formatos válidos\n"
+" para -d/--date.\n"
+" "
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr ""
+" - importa um patch tradicional de um servidor web e detecta\n"
+" renomeações::"
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr " hg import -s 80 http://example.com/bugfix.patch"
+
+msgid " - import a changeset from an hgweb server::"
+msgstr " - importa uma revisão de um servidor hgweb::"
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr " - importa todos os patches em uma mbox estilo Unix::"
+
+msgid " hg import incoming-patches.mbox"
+msgstr " hg import incoming-patches.mbox"
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+" - tenta restaurar com exatidão uma revisão exportada (nem sempre\n"
+" possível)::"
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr " hg import --exact proposed-fix.patch"
+
+msgid "need at least one patch to import"
+msgstr "é necessário ao menos um nome de patch para importar"
+
+msgid "cannot use --no-commit with --bypass"
+msgstr "não se pode usar --no-commit com --bypass"
+
+msgid "cannot use --similarity with --bypass"
+msgstr "não se pode usar --similarity com --bypass"
+
+msgid "patch is damaged or loses information"
+msgstr "o patch está danificado ou perde informação"
+
+msgid "applied to working directory"
+msgstr "aplicado no diretório de trabalho"
+
+msgid "not a Mercurial patch"
+msgstr "não é um patch do Mercurial"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "revisão %s criada"
+
+msgid "applying patch from stdin\n"
+msgstr "aplicando patch da entrada padrão\n"
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: nenhum diff encontrado"
+
+msgid "run even if remote repository is unrelated"
+msgstr "execute mesmo se o repositório remoto não for relacionado"
+
+msgid "show newest record first"
+msgstr "mostra registros mais novos primeiro"
+
+msgid "file to store the bundles into"
+msgstr "arquivo no qual armazenar os bundles"
+
+msgid "a remote changeset intended to be added"
+msgstr "uma revisão remota que se deva adicionar"
+
+msgid "compare bookmarks"
+msgstr "compara marcadores"
+
+msgid "a specific branch you would like to pull"
+msgstr "um ramo específico que você gostaria de trazer"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle ARQUIVO] [ORIGEM]"
+
+msgid "show new changesets found in source"
+msgstr "mostra novas revisões encontradas na origem"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Mostra novas revisões encontradas no caminho/URL especificado\n"
+" ou na localização de pull padrão. Estas são as revisões que\n"
+" seriam trazidas se um pull fosse executado."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" Para repositórios remotos, a opção --bundle evita baixar as\n"
+" revisões duas vezes se o comando incoming for seguido por um\n"
+" pull."
+
+msgid " See pull for valid source format details."
+msgstr " Veja pull para detalhes sobre formatos válidos da origem."
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar mudanças de entrada, 0 se não houver mudanças.\n"
+" "
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr "não é possível combinar --bundle e --subrepos"
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "o repositório remoto não suporta marcadores\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "create a new repository in the given directory"
+msgstr "cria um novo repositório no diretório pedido"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Inicializa um novo repositório no diretório dado. Se o diretório\n"
+" não existir, ele será criado."
+
+msgid " If no directory is given, the current directory is used."
+msgstr " Se o diretório não for dado, o diretório atual será usado."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" É possível especificar uma URL ``ssh://`` como destino.\n"
+" Veja :hg:`help urls` para mais informações.\n"
+" "
+
+msgid "search the repository as it is in REV"
+msgstr "procura no repositório como se estivesse em REV"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "termina nomes de arquivo com NUL, para uso com xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "imprime caminhos completos a partir do raiz do sistema de arquivos"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[OPÇÃO]... [PADRÃO]..."
+
+msgid "locate files matching specific patterns"
+msgstr "localiza arquivos que casem com os padrões especificados"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" Imprime todos os arquivos sob o controle do Mercurial no\n"
+" diretório de trabalho cujos nomes casem com os padrões\n"
+" fornecidos."
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" Por padrão, este comando procura em todos os diretórios no\n"
+" diretório de trabalho. Para procurar apenas no diretório\n"
+" atual e subdiretórios, use \"--include .\"."
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+" Se não forem passados padrões, este comando imprime os nomes\n"
+" de todos os arquivos sob o controle do Mercurial no diretório\n"
+" de trabalho."
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" Se você quiser passar a saída desse comando para o comando\n"
+" \"xargs\", use a opção -0 tanto para este comando como para o\n"
+" \"xargs\". Isso irá evitar que \"xargs\" trate nomes de arquivo\n"
+" contendo espaços como múltiplos nomes de arquivo."
+
+msgid "show revision history of entire repository or files"
+msgstr "mostra o histórico de revisões do repositório ou de arquivos"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Imprime o histórico de revisões dos arquivos especificados ou do\n"
+" projeto como um todo."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" Se um intervalo de revisões não for pedido, o padrão é ``tip:0``,\n"
+" a não ser que --follow seja pedido; nesse caso, o pai do\n"
+" diretório de trabalho será usado como revisão inicial."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" O histórico de arquivos é mostrado sem que informações de cópia e\n"
+" renomeação sejam seguidas. Use -f/--follow para seguir o\n"
+" histórico através de renomeações e cópias. --follow sem um nome\n"
+" de arquivo irá mostrar apenas ancestrais ou descendentes da\n"
+" revisão de início."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Por padrão este comando mostra o número e identificador da\n"
+" revisão, etiquetas, pais não triviais, usuário, data e hora,\n"
+" e um resumo de cada consolidação. Se a opção -v/--verbose for\n"
+" usada, são mostradas a lista de arquivos modificados e a\n"
+" mensagem de consolidação completa."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" log -p/--patch pode gerar saídas de diff inesperadas para\n"
+" mesclagens, pois irá comparar a revisão de mesclagem apenas\n"
+" com seu primeiro pai. Além disso, apenas arquivos diferentes\n"
+" de AMBOS os pais aparecerão na lista de arquivos."
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+" .. note::\n"
+" por razões de desempenho, log ARQUIVO pode omitir mudanças\n"
+" duplicadas feitas em outros ramos, e não mostra remoções.\n"
+" Para ver todas as mudanças incluindo duplicatas e remoções,\n"
+" use a opção --removed."
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr " - revisões com descrições completas e lista de arquivos::"
+
+msgid " hg log -v"
+msgstr " hg log -v"
+
+msgid " - changesets ancestral to the working directory::"
+msgstr " - revisões ancestrais do diretório de trabalho::"
+
+msgid " hg log -f"
+msgstr " hg log -f"
+
+msgid " - last 10 commits on the current branch::"
+msgstr " - últimas 10 revisões no ramo atual::"
+
+msgid " hg log -l 10 -b ."
+msgstr " hg log -l 10 -b ."
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr ""
+" - revisões mostrando todas as modificações feitas em um\n"
+" arquivo, incluindo remoções::"
+
+msgid " hg log --removed file.c"
+msgstr " hg log --removed file.c"
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding "
+"merges::"
+msgstr ""
+" - todas as revisões que modificam um diretório, com diffs,\n"
+" excluindo mesclagens::"
+
+msgid " hg log -Mp lib/"
+msgstr " hg log -Mp lib/"
+
+msgid " - all revision numbers that match a keyword::"
+msgstr ""
+" - todos os números de revisões que combinarem com uma palavra chave::"
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr " hg log -k bug --template \"{rev}\\n\""
+
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr ""
+" - verifica se uma revisão dada foi incluída em um\n"
+" release etiquetado::"
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr " hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr ""
+" - encontra todas as revisões feitas por um usuário em\n"
+" uma faixa de datas::"
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr " hg log -k alice -d \"may 2008 to jul 2008\""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr " - sumário de todas as revisões após a última etiqueta::"
+
+msgid " hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr " hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+" Veja :hg:`help revisions` e :hg:`help revsets` para mais\n"
+" informações sobre a especificação de revisões."
+
+msgid ""
+" See :hg:`help templates` for more about pre-packaged styles and\n"
+" specifying custom templates."
+msgstr ""
+" Veja :hg:`help templates` para mais informações sobre estilos\n"
+" pré-existentes e especificação de modelos personalizados."
+
+msgid "revision to display"
+msgstr "revisão a ser exibida"
+
+msgid "list files from all revisions"
+msgstr "lista os arquivos de todas as revisões"
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr "mostra a revisão atual ou pedida do manifesto do projeto"
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+" Imprime uma lista de arquivos sob controle de versão para a\n"
+" revisão pedida. Se a revisão não for especificada, o primeiro pai\n"
+" do diretório de trabalho será usado, ou a revisão null se nenhuma\n"
+" revisão estiver selecionada."
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+" Com a opção -v, imprime permissões de arquivo, links simbólicos\n"
+" e bits de execução. Com a opção --debug, imprime os hashes de\n"
+" revisão de arquivo."
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+" Se a opção --all for especificada, será impressa a lista de todos\n"
+" os arquivos de todas as revisões, inclusive arquivos apagados e\n"
+" renomeados."
+
+msgid "can't specify a revision with --all"
+msgstr "você não pode especificar uma revisão com --all"
+
+msgid "force a merge with outstanding changes"
+msgstr "força uma mesclagem com mudanças ainda não consideradas"
+
+msgid "revision to merge"
+msgstr "revisão a ser mesclada"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr "avalia revisões a serem mescladas (a mesclagem não é executada)"
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "mescla o diretório de trabalho com outra revisão"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" O diretório de trabalho é atualizado com todas as mudanças feitas\n"
+" na revisão pedida desde a última revisão predecessora comum."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Arquivos que mudarem com relação a qualquer dos pais são\n"
+" marcados como modificados para a próxima consolidação, e esta\n"
+" deve ser feita antes que qualquer outra atualização seja\n"
+" permitida. Essa próxima consolidação terá dois pais."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+" ``--tool`` pode ser usado pra especificar o utilitário de\n"
+" mesclagem usado para mesclagens de arquivo. Esta opção sobrepõe\n"
+" a variável de ambiente HGMERGE e os valores especificados nos\n"
+" arquivos de configuração. Veja :hg:`help merge-tools` para opções."
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" Se a revisão não for especificada, o pai do diretório de trabalho\n"
+" for uma revisão cabeça, e o ramo atual contiver exatamente uma\n"
+" outra cabeça, a outra cabeça será usada para a mesclagem. Caso\n"
+" contrário, uma revisão com a qual mesclar deve ser fornecida\n"
+" explicitamente."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr ""
+" :hg:`resolve` deve ser usado para resolver arquivos não resolvidos."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+" Para desfazer uma mesclagem antes de sua consolidação, use\n"
+" :hg:`update --clean .`, que obterá uma cópia limpa do primeiro pai\n"
+" original, descartando todas as mudanças."
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se houver arquivos não resolvidos.\n"
+" "
+
+msgid ""
+"multiple matching bookmarks to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr ""
+"múltiplos marcadores para mesclar - por favor mescle com uma revisão ou "
+"marcador explícitos"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "execute 'hg heads' para ver todas as cabeças"
+
+msgid ""
+"no matching bookmark to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr ""
+"nenhum marcador correspondente para mesclar - por favor mescle com uma "
+"revisão ou marcador explícitos"
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr ""
+"o ramo '%s' tem %d cabeças - por favor mescle com uma revisão explícita"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "execute 'hg heads .' para ver as cabeças"
+
+msgid "heads are bookmarked - please merge with an explicit rev"
+msgstr ""
+"as cabeças estão marcadas com bookmarks - por favor mescle com uma revisão "
+"explícita"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr ""
+"o ramo '%s' tem apenas uma cabeça - por favor mescle com uma revisão "
+"explícita"
+
+msgid "nothing to merge"
+msgstr "nada para mesclar"
+
+msgid "use 'hg update' instead"
+msgstr "use 'hg update'"
+
+msgid "working directory not at a head revision"
+msgstr "o diretório de trabalho não está em uma cabeça"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "use 'hg update' ou mescle com uma revisão explícita"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "uma revisão que se deva incluir no destino"
+
+msgid "a specific branch you would like to push"
+msgstr "um ramo específico que você gostaria de enviar"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+
+msgid "show changesets not found in the destination"
+msgstr "mostra revisões não encontradas no destino"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Mostra revisões não encontradas no repositório de destino\n"
+" especificado ou na localização padrão de push. Estas são as\n"
+" revisões que seriam enviadas se um push fosse pedido."
+
+msgid " See pull for details of valid destination formats."
+msgstr " Veja pull para detalhes do formato do destino."
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar mudanças de saída, 1 se não houver mudanças.\n"
+" "
+
+msgid "show parents of the specified revision"
+msgstr "mostra pais da revisão especificada"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [ARQUIVO]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "mostra os pais do diretório de trabalho ou da revisão"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Imprime as revisões pai do diretório de trabalho. Se uma revisão\n"
+" for passada com -r/--rev, o pai dessa revisão será impresso. Se\n"
+" um arquivo for passado, será impressa a revisão na qual esse\n"
+" arquivo foi mudado por último (anterior à revisão do diretório de\n"
+" trabalho ou ao argumento --rev, se passado)."
+
+msgid "can only specify an explicit filename"
+msgstr "só é possível especificar um nome de arquivo explícito"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' não encontrado no manifesto!"
+
+msgid "[NAME]"
+msgstr "[NOME]"
+
+msgid "show aliases for remote repositories"
+msgstr "mostra apelidos de repositórios remotos"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+" Mostra a definição do caminho simbólico NOME. Se nenhum nome for\n"
+" fornecido, mostra todas as definições de nomes disponíveis."
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+" A opção -q/--quiet suprime toda a saída ao procurar por NOME, e\n"
+" mostra apenas os nomes de caminhos ao listar todas as definições."
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+" Nomes de caminho são definidos na seção [paths] de seu arquivo\n"
+" de configuração e em ``/etc/mercurial/hgrc``. Se executado em um\n"
+" repositório, ``.hg/hgrc`` também será usado."
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+" Os nomes de caminho ``default`` e ``default-push`` têm significado\n"
+" especial. Ao realizar uma operação pull ou push, eles são usados como\n"
+" origem ou destino pré-definidos se nenhum local remoto for especificado\n"
+" na linha de comando. Se ``default-push`` estiver definido, será o valor\n"
+" usado para push, e ``default`` será usado para pull; caso contrário,\n"
+" ``default`` será usado para ambos. Ao clonar um repositório, a origem\n"
+" é definida como ``default`` no ``.hg/hgrc`` do novo clone. Note que\n"
+" ``default`` e ``default-push`` são usados por todas as operações de\n"
+" entrada (por exemplo, :hg:`incoming`) e de saída (por exemplo,\n"
+" :hg:`outgoing`, :hg:`email` e :hg:`bundle`)."
+
+msgid " See :hg:`help urls` for more information."
+msgstr " Veja :hg:`help urls` para mais informações."
+
+msgid "not found!\n"
+msgstr "não encontrado!\n"
+
+msgid "set changeset phase to public"
+msgstr "define a fase da revisão como pública"
+
+msgid "set changeset phase to draft"
+msgstr "define a fase da revisão como rascunho"
+
+msgid "set changeset phase to secret"
+msgstr "define a fase da revisão como secreta"
+
+msgid "allow to move boundary backward"
+msgstr "permite que o limite seja movido para trás"
+
+msgid "target revision"
+msgstr "revisão alvo"
+
+msgid "[-p|-d|-s] [-f] [-r] REV..."
+msgstr "[-p|-d|-s] [-f] [-r] REV..."
+
+msgid "set or show the current phase name"
+msgstr "define ou mostra o nome da fase atual"
+
+msgid " With no argument, show the phase name of specified revisions."
+msgstr " Sem parâmetros, mostra o nome da fase das revisões especificadas."
+
+msgid ""
+" With one of -p/--public, -d/--draft or -s/--secret, change the\n"
+" phase value of the specified revisions."
+msgstr ""
+" Com um parâmetro -p/--public, -d/--draft ou -s/--secret, muda o\n"
+" valor da fase das revisões especificadas para pública, rascunho ou\n"
+" secreta, respectivamente."
+
+msgid ""
+" Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
+" lower phase to an higher phase. Phases are ordered as follows::"
+msgstr ""
+" A não ser que -f/--force seja especificado, :hg:`phase` não\n"
+" moverá revisões de uma fase mais baixa para uma mais alta. As\n"
+" fases são ordenadas como segue::"
+
+msgid " public < draft < secret"
+msgstr " pública < rascunho < secreta"
+
+msgid ""
+" Return 0 on success, 1 if no phases were changed or some could not\n"
+" be changed.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se não houver mudanças de fase\n"
+" ou se algumas não puderam ser mudadas.\n"
+" "
+
+msgid "only one phase can be specified"
+msgstr "apenas uma fase pode ser especificada"
+
+#, python-format
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+"não é possível mover %i revisões para uma fase mais permissiva sem usar "
+"--force\n"
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "as fases de %i revisões foram modificadas\n"
+
+msgid "no phases changed\n"
+msgstr "nenhuma fase mudou\n"
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "atualização não realizada: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(execute 'hg heads' para ver cabeças, 'hg merge' para mesclar)\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr "(execute 'hg heads .' para ver cabeças, 'hg merge' para mesclar)\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "(execute 'hg heads' para ver cabeças)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(execute 'hg update' para obter uma cópia de trabalho)\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "atualiza para nova cabeça de ramo se revisões forem trazidas"
+
+msgid "run even when remote repository is unrelated"
+msgstr "execute mesmo se o repositório remoto não for relacionado"
+
+msgid "BOOKMARK"
+msgstr "MARCADOR"
+
+msgid "bookmark to pull"
+msgstr "marcador a ser trazido"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [ORIGEM]"
+
+msgid "pull changes from the specified source"
+msgstr "traz mudanças da origem especificada"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Traz mudanças de um repositório remoto para um local."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Este comando localiza todas as mudanças do repositório no\n"
+" caminho ou URL especificado e as adiciona a um repositório\n"
+" local (o atual, a não ser que a opção -R seja especificada).\n"
+" Por padrão, ele não atualiza a cópia do projeto no diretório\n"
+" de trabalho."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Use :hg:`incoming` se você quiser ver o que seria adicionado pelo\n"
+" comando pull. Se você então decidir adicionar tais mudanças ao\n"
+" repositório, você deve usar :hg:`pull -r X`, onde X é a última\n"
+" revisão listada por :hg:`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Se ORIGEM for omitida, o caminho 'default' será usado. Veja\n"
+" :hg:`help urls` para mais informações."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se uma atualização resultar\n"
+" em arquivos não resolvidos.\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "marcador remoto %s não encontrado!"
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "importando marcador %s\n"
+
+msgid "force push"
+msgstr "força um push"
+
+msgid "bookmark to push"
+msgstr "marcador a ser enviado"
+
+msgid "allow pushing a new branch"
+msgstr "permite o envio de um novo ramo nomeado"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "push changes to the specified destination"
+msgstr "envia mudanças para o destino especificado"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr " Envia mudanças do repositório local para o destino especificado."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" Esta operação é simétrica à pull: ela é idêntica a um pull realizado\n"
+" no destino usando o repositório atual como origem."
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" Por padrão, push não permite a criação de novas cabeças no destino,\n"
+" já que múltiplas cabeças deixariam dúvidas sobre qual cabeça deva ser\n"
+" usada. Nessa situação, o recomendado é trazer e mesclar as novas\n"
+" mudanças antes de fazer o push."
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" Use --new-branch se você quiser permitir que o comando push crie\n"
+" um novo ramo nomeado que já não esteja presente no destino, sem\n"
+" forçar outras mudanças."
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" Você pode usar a opção -f/--force para mudar o comportamento padrão,\n"
+" fazendo com que as revisões sejam enviadas ao repositório remoto\n"
+" mesmo que acrescentem novas cabeças ou ramos."
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Se -r/--rev for usado, apenas a revisão pedida e todos os seus\n"
+" ancestrais serão enviados para o repositório remoto."
+
+msgid ""
+" If -B/--bookmark is used, the specified bookmarked revision, its\n"
+" ancestors, and the bookmark will be pushed to the remote\n"
+" repository."
+msgstr ""
+" Se -B/--bookmark for usado, a revisão marcada especificada, seus\n"
+" ancestrais, e o próprio marcador serão enviados para o repositório\n"
+" remoto."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Por favor veja :hg:`help urls` para detalhes importantes sobre\n"
+" URLs ``ssh://`` . Se DESTINO for omitido, um caminho padrão será\n"
+" usado."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso no envio, 1 se não houver nada\n"
+" para enviar.\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "enviando revisões para %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "exportando marcador %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "apagando marcador remoto %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "o marcador %s não existe nem no repositório local nem no remoto!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "a atualização do marcador %s falhou!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "desfaz uma transação interrompida"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr " Recupera uma consolidação ou pull interrompido."
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" Este comando tenta consertar o estado do repositório após uma\n"
+" operação interrompida. Deve ser necessário apenas se o Mercurial\n"
+" sugeri-lo."
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se não houver nada a ser\n"
+" corrigido ou se a verificação falhar.\n"
+" "
+
+msgid "record delete for missing files"
+msgstr "grava remoção de arquivos faltando"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "remove (e apaga) o arquivo mesmo se foi adicionado ou modificado"
+
+msgid "remove the specified files on the next commit"
+msgstr "remove os arquivos pedidos na próxima consolidação"
+
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr " Agenda os arquivos indicados para remoção do ramo atual."
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" Este comando agenda os arquivos para serem removidos na próxima\n"
+" consolidação. Para desfazer uma remoção antes disso, veja\n"
+" :hg:`revert`. Para desfazer uma adição de arquivos, veja\n"
+" :hg:`forget`."
+
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" -A/--after pode ser usado para remover\n"
+" apenas arquivos já removidos do diretório de trabalho,\n"
+" -f/--force pode ser usado para forçar a remoção, e -Af pode ser\n"
+" usado para remover os arquivos da próxima revisão sem removê-los\n"
+" do diretório de trabalho."
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" A seguinte tabela detalha o comportamento do comando remove para\n"
+" diferentes estados dos arquivos (colunas) e combinações de opções\n"
+" (linhas). Os estados dos arquivos são: adicionados [A],\n"
+" limpos [C], modificados [M] ou faltando [!] (conforme informado\n"
+" por :hg:`status`). As ações são W (aviso), R (remove do ramo) e D\n"
+" (remove do diretório de trabalho):"
+
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" nenhum W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+" Note que remove nunca apaga do diretório de trabalho arquivos no\n"
+" estado adicionado [A], nem mesmo se a opção --force for especificada."
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se algum aviso for encontrado.\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "arquivo %s não removido: arquivo não rastreado\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr ""
+"%s não removido: o arquivo ainda existe (use -f para forçar a remoção)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr ""
+"%s não removido: o arquivo foi modificado (use -f para forçar a remoção)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr ""
+"%s não removido: o arquivo foi marcado para adição (use forget para "
+"desfazer)\n"
+
+msgid "record a rename that has already occurred"
+msgstr "grava uma renomeação que já ocorreu"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[OPÇÃO]... ORIGEM... DESTINO"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "renomeia arquivos; equivalente a uma cópia seguida de remoção"
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+" Marca dest como cópia da origem; marca as origens como removidas.\n"
+" Se dest for um diretório, as cópias serão colocadas nesse\n"
+" diretório. Se dest for um arquivo, só pode haver uma origem."
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Este comando faz efeito na próxima consolidação. Para desfazer\n"
+" uma renomeação antes disso, veja :hg:`revert`."
+
+msgid "select all unresolved files"
+msgstr "seleciona todos os arquivos não resolvidos"
+
+msgid "list state of files needing merge"
+msgstr "lista estado de arquivos que precisam ser mesclados"
+
+msgid "mark files as resolved"
+msgstr "marca arquivos como resolvidos"
+
+msgid "mark files as unresolved"
+msgstr "marca arquivos como não resolvidos"
+
+msgid "hide status prefix"
+msgstr "esconde prefixo de status"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr "refaz mesclagens e exibe ou muda o estado da mesclagem de arquivos"
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents). See :hg:`help\n"
+" merge-tools` for information on configuring merge tools."
+msgstr ""
+" Mesclagens com conflitos não resolvidos podem resultar de\n"
+" mesclagens não interativas usando a opção ``internal:merge``\n"
+" do arquivo de configuração ou um utilitário de mesclagem de\n"
+" linha de comando, como o ``diff3``.\n"
+" O comando resolve é usado para gerenciar os arquivos envolvidos\n"
+" em uma mesclagem, após a execução de :hg:`merge` e antes da\n"
+" execução de :hg:`commit` (ou seja, enquanto o diretório de\n"
+" trabalho tiver dois pais).\n"
+" Veja :hg:`help merge-tools` para informações sobre a\n"
+" configuração de utilitários de mesclagem."
+
+msgid " The resolve command can be used in the following ways:"
+msgstr " O comando resolve pode ser usado das seguintes maneiras:"
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+" - :hg:`resolve [--tool] ARQUIVO...`: tenta refazer a mesclagem\n"
+" dos arquivos especificados, descartando qualquer tentativa de\n"
+" mesclagem anterior. Essa nova tentativa não será feita em\n"
+" arquivos já marcados como resolvidos. Use ``--all/-a`` para\n"
+" indicar todos os arquivos não resolvidos. ``--tool`` pode ser\n"
+" usado para especificar o utilitário de mesclagem usado para os\n"
+" arquivos pedidos. Esta opção sobrepõe a variável de ambiente\n"
+" HGMERGE e os valores especificados nos arquivos de configuração.\n"
+" Os conteúdos anteriores dos arquivos são gravados usando um\n"
+" sufixo ``.orig``."
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+" - :hg:`resolve -m [ARQUIVO]`: marca um arquivo como resolvido (por\n"
+" exemplo, após correção manual do arquivo). O padrão é marcar todos\n"
+" os arquivos não resolvidos."
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+" - :hg:`resolve -u [ARQUIVO]...`: marca um arquivo como não resolvido.\n"
+" O padrão é marcar todos os arquivos resolvidos."
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+" - :hg:`resolve -l`: lista os arquivos que já tiveram ou ainda têm\n"
+" conflitos. Na lista impressa, ``U`` significa não resolvido, e\n"
+" ``R`` resolvido."
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+" Note que o Mercurial não deixará que você faça a consolidação de\n"
+" arquivos com conflitos de mesclagem não resolvidos. Você precisa\n"
+" primeiro usar ``hg resolve -m ...`` para indicar os conflitos como\n"
+" resolvidos."
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se a resolução de algum\n"
+" arquivo falhar.\n"
+" "
+
+msgid "too many options specified"
+msgstr "opções demais especificadas"
+
+msgid "can't specify --all and patterns"
+msgstr "não é possível especificar --all e padrões"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+"nenhum arquivo ou diretório especificado; use --all para refazer a mesclagem"
+" de todos os arquivos"
+
+msgid "revert all changes when no arguments given"
+msgstr "se parâmetros não forem fornecidos, reverte todas as mudanças"
+
+msgid "tipmost revision matching date"
+msgstr "revisão mais recente que casa com a data"
+
+msgid "revert to the specified revision"
+msgstr "reverte para a revisão especificada"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[OPÇÃO]... [-r REV] [NOME]..."
+
+msgid "restore files to their checkout state"
+msgstr ""
+"restaura arquivos para o estado correspondente a uma cópia de trabalho"
+
+msgid " .. note::"
+msgstr " .. note::"
+
+msgid ""
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" Para obter revisões anteriores, você deve usar :hg:`update REV`.\n"
+" Para cancelar uma mesclagem não consolidada (e descartar suas\n"
+" modificações), use :hg:`update --clean .`."
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" Se não for pedida uma revisão, reverte os arquivos ou diretórios\n"
+" pedidos para o conteúdo que eles possuíam no primeiro pai do diretório de\n"
+" trabalho. Isto restaura o conteúdo do arquivos afetados para um\n"
+" estado inalterado e reverte operações de adição, remoção, cópia e\n"
+" renomeação. Se o diretório de trabalho tiver dois pais, você deve\n"
+" especificar uma revisão explicitamente."
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+" Com a opção -r/--rev ou -d/--date, reverte os arquivos ou diretórios\n"
+" dados para seus conteúdos em uma revisão específica. Como revert não\n"
+" muda os pais do diretório de trabalho, isto fará com que estes\n"
+" arquivos apareçam como modificados na cópia de trabalho. Isso pode\n"
+" ser útil para \"desfazer\" no todo ou em parte alguma mudança anterior.\n"
+" Veja :hg:`backout` para um método relacionado."
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" Arquivos modificados são gravados com um sufixo .orig antes da\n"
+" reversão. Para desabilitar essas cópias, use --no-backup."
+
+msgid "you can't specify a revision and a date"
+msgstr "você não pode especificar uma revisão e uma data"
+
+msgid "uncommitted merge with no revision specified"
+msgstr "mesclagem não consolidada, e não foi especificada uma revisão"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr "use \"hg update\" ou veja \"hg help revert\""
+
+msgid "no files or directories specified"
+msgstr "nenhum arquivo ou diretório especificados"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"mesclagem não consolidada, use --all para descartar todas as mudanças "
+"locais, ou 'hg update -C .' para abortar a mesclagem"
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"mudanças não consolidadas, use --all para descartar todas as mudanças "
+"locais, ou 'hg update %s' para atualizar"
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+"use --all para reverter todos os arquivos, ou 'hg update %s' para atualizar "
+"a revisão"
+
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr ""
+"mudanças não consolidadas, use --all para descartar todas as mudanças locais"
+
+msgid "use --all to revert all files"
+msgstr "use --all para reverter todos os arquivos"
+
+msgid "ignore safety measures"
+msgstr "ignora medidas de segurança"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "desfaz a última transação (perigoso)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" Este comando deve ser usado com cuidado. Há apenas um nível de\n"
+" rollback, e não há maneira de desfazê-lo. Ele irá também restaurar\n"
+" o dirstate ao do momento da última transação, descartando qualquer\n"
+" mudança de dirstate desde aquele momento. Este comando não altera\n"
+" o diretório de trabalho."
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository."
+msgstr ""
+" Transações são usadas para encapsular os efeitos de todos os comandos\n"
+" que criam novas revisões ou propagam revisões existentes para o\n"
+" repositório."
+
+msgid ""
+" For example, the following commands are transactional, and their\n"
+" effects can be rolled back:"
+msgstr ""
+" Por exemplo, os seguintes comandos são transacionais,\n"
+" e seus efeitos podem ser revertidos com rollback::"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (com este repositório como destino)\n"
+" - unbundle"
+
+msgid ""
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" Para evitar perda permanente de dados, o comando rollback se recusará\n"
+" a desfazer a transação de um commit se a revisão correspondente não\n"
+" for a revisão atual do diretório de trabalho. Para desabilitar essa\n"
+" proteção e remover a revisão de qualquer maneira, use a opção --force."
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" Este comando não deve ser usado em repositórios públicos. Uma vez que\n"
+" as mudanças sejam visíveis para serem trazidas por outros usuários, um\n"
+" desfazimento local se torna inefetivo (alguém pode já ter feito um pull\n"
+" das mudanças). Além disso, erros de concorrência são possíveis para\n"
+" leitores do repositório: por exemplo, um pull em andamento pode falhar\n"
+" se um rollback for executado."
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se não houver dados de\n"
+" desfazimento disponíveis.\n"
+" "
+
+msgid "print the root (top) of the current working directory"
+msgstr "imprime o raiz (topo) do diretório de trabalho atual"
+
+msgid " Print the root directory of the current repository."
+msgstr " Imprime o diretório raiz do repositório atual."
+
+msgid "name of access log file to write to"
+msgstr "nome do arquivo de log de acesso a ser escrito"
+
+msgid "name of error log file to write to"
+msgstr "nome do arquivo de log de erros a ser escrito"
+
+msgid "PORT"
+msgstr "PORTA"
+
+msgid "port to listen on (default: 8000)"
+msgstr "porta onde escutar (padrão: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "endereço onde escutar (padrão: todas as interfaces)"
+
+msgid "ADDR"
+msgstr "ENDEREÇO"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "prefixo dos caminhos a serem servidos (padrão: raiz do servidor)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr "nome a ser exibido em páginas web (padrão: diretório de trabalho)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "nome do arquivo de configuração do hgweb (veja \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr "nome do arquivo de configuração do hgweb (OBSOLETA)"
+
+msgid "for remote clients"
+msgstr "para clientes remotos"
+
+msgid "web templates to use"
+msgstr "modelo web a ser usado"
+
+msgid "template style to use"
+msgstr "estilo de modelo a ser usado"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "usa IPv6 além de IPv4"
+
+msgid "SSL certificate file"
+msgstr "arquivo de certificado de SSL"
+
+msgid "start stand-alone webserver"
+msgstr "inicia um servidor web auto-suficiente"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+" Inicia um visualizador e servidor de pull local via HTTP. Você pode\n"
+" usar esse comando para imediata visualização e compartilhamento de\n"
+" repositórios. É recomendado utilizar um servidor web propriamente dito\n"
+" para compartilhamento mais permanente de repositórios."
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+" Em particular, este serviço não implementa controle de acesso por\n"
+" usuário. Na configuração padrão, o acesso de leitura é permitido a\n"
+" qualquer usuário, e o acesso de escrita é restrito. Defina a opção\n"
+" ``web.allow_push`` como ``*`` para permitir que qualquer um envie\n"
+" revisões através deste serviço. Se você precisar autenticar usuários,\n"
+" você deve usar um servidor web de verdade."
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" Por padrão, o servidor loga cada acesso para stdout, e erros para\n"
+" stderr. Use as opções -A/--accesslog e -E/--errorlog para logar para\n"
+" arquivos."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+" Para que o servidor escolha qualquer porta livre para escutar,\n"
+" especifique a porta como 0; nesse caso, o servidor irá imprimir\n"
+" o número da porta que ele usar."
+
+msgid "cannot use --stdio with --cmdserver"
+msgstr "não se pode usar --stdio com --cmdserver"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "ouvindo em http://%s%s/%s (associado a %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr "mostra opções de configuração não confiáveis"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [NOME]..."
+
+msgid "show combined config settings from all hgrc files"
+msgstr "exibe opções de configuração de todos os arquivos hgrc combinados"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+" Sem argumentos, imprime nomes e valores de todos os itens de\n"
+" configuração."
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+" Com um argumento da forma 'seção.nome', imprime apenas o valor\n"
+" desse item de configuração."
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+" Com múltiplos argumentos, imprime nomes e valores de todos os\n"
+" itens de configuração que casarem com os nomes de seção."
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+" Com --debug, é mostrada a origem (nome de arquivo e número da\n"
+" linha) para cada item de configuração."
+
+msgid "only one config item permitted"
+msgstr "apenas um item de configuração permitido"
+
+msgid "show status of all files"
+msgstr "mostra status de todos os arquivos"
+
+msgid "show only modified files"
+msgstr "mostra apenas arquivos modificados"
+
+msgid "show only added files"
+msgstr "mostra apenas arquivos adicionados"
+
+msgid "show only removed files"
+msgstr "mostra apenas arquivos removidos"
+
+msgid "show only deleted (but tracked) files"
+msgstr "mostra apenas arquivos removidos (mas rastreados)"
+
+msgid "show only files without changes"
+msgstr "mostra apenas arquivos sem mudanças"
+
+msgid "show only unknown (not tracked) files"
+msgstr "mostra apenas arquivos desconhecidos (não rastreados)"
+
+msgid "show only ignored files"
+msgstr "mostra apenas arquivos ignorados"
+
+msgid "show source of copied files"
+msgstr "mostra a origem de arquivos copiados"
+
+msgid "show difference from revision"
+msgstr "mostra diferença a partir da revisão"
+
+msgid "list the changed files of a revision"
+msgstr "lista os arquivos modificados por uma revisão"
+
+msgid "show changed files in the working directory"
+msgstr "exibe arquivos alterados no diretório de trabalho"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Exibe o estado dos arquivos no repositório. Se nomes forem\n"
+" fornecidos, apenas arquivos que casarem serão exibidos. Arquivos\n"
+" sem modificações, ignorados ou origens de uma cópia ou renomeação\n"
+" não são listados, a não ser que -c/--clean (sem modificações),\n"
+" -i/--ignored (ignorados), -C/--copies (cópias) ou -A/-all (todos)\n"
+" sejam passados. A não ser que as opções descritas como \"mostra\n"
+" apenas ...\" sejam passadas, as opções -mardu serão usadas."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" A opção -q/--quiet esconde arquivos não rastreados (desconhecidos\n"
+" ou ignorados) a não ser que estes sejam pedidos explicitamente\n"
+" com -u/--unknown (desconhecidos) ou -i/--ignored (ignorados)."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note::\n"
+" o comando status pode aparentemente discordar do comando\n"
+" diff se ocorrer uma mudança de permissões ou uma mesclagem. O\n"
+" formato diff padrão não informa mudanças de permissão e o\n"
+" comando diff informa apenas mudanças relativas a um pai da\n"
+" mesclagem."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" Se uma revisão for dada, será usada como revisão base. Se duas\n"
+" revisões forem dadas, serão mostradas as diferenças entre elas.\n"
+" A opção --change pode ser usada como atalho para listar os\n"
+" arquivos de uma revisão com mudanças em relação a seu primeiro pai."
+
+msgid " The codes used to show the status of files are::"
+msgstr " Os códigos usados para exibir o estado dos arquivos são::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = modificado\n"
+" A = adicionado\n"
+" R = removido\n"
+" C = limpo (sem modificações)\n"
+" ! = faltando (removido por um outro programa, mas ainda\n"
+" rastreado pelo Mercurial)\n"
+" ? = não rastreado\n"
+" I = ignorado\n"
+" = origem do arquivo anterior listado como A (adicionado)"
+
+msgid ""
+" - show changes in the working directory relative to a\n"
+" changeset::"
+msgstr ""
+" - mostra mudanças no diretório de trabalho relativas a uma revisão::"
+
+msgid " hg status --rev 9353"
+msgstr " hg status --rev 9353"
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr ""
+" - mostra todas as mudanças incluindo cópias em uma revisão existente::"
+
+msgid " hg status --copies --change 9353"
+msgstr " hg status --copies --change 9353"
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+" - gera uma lista separada por NUL de arquivos adicionados,\n"
+" adequada para o comando xargs::"
+
+msgid " hg status -an0"
+msgstr " hg status -an0"
+
+msgid "check for push and pull"
+msgstr "verifica push e pull"
+
+msgid "summarize working directory state"
+msgstr "sumariza o estado do diretório de trabalho"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+" Isto gera um breve sumário do estado do diretório de trabalho,\n"
+" incluindo pais, ramo, status de consolidação e atualizações\n"
+" disponíveis."
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+" Com a opção --remote, isto verificará no caminho default mudanças ainda\n"
+" não sincronizadas. Isto pode levar algum tempo."
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "pai: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (repositório vazio)"
+
+msgid " (no revision checked out)"
+msgstr " (nenhuma revisão na cópia de trabalho)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ramo: %s\n"
+
+msgid "bookmarks:"
+msgstr "marcadores:"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d modificados"
+
+#, python-format
+msgid "%d added"
+msgstr "%d adicionados"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d removidos"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d renomeados"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d copiados"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d apagados"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d desconhecidos"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignorados"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d não resolvidos"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d sub-repositórios"
+
+msgid " (merge)"
+msgstr " (mesclagem)"
+
+msgid " (new branch)"
+msgstr " (novo ramo)"
+
+msgid " (head closed)"
+msgstr " (cabeça fechada)"
+
+msgid " (clean)"
+msgstr " (limpo)"
+
+msgid " (new branch head)"
+msgstr " (nova cabeça de ramo)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "consolidação: %s\n"
+
+msgid "update: (current)\n"
+msgstr "atualizações: (atual)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "atualizações: %d novas revisões (update)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "atualizações: %d novas revisões, %d cabeças de ramo (merge)\n"
+
+msgid "1 or more incoming"
+msgstr "1 ou mais de entrada"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d de saída"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d marcadores a serem trazidos"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d marcadores a serem enviados"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "remoto: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "remoto: (sincronizado)\n"
+
+msgid "force tag"
+msgstr "força a mudança da etiqueta"
+
+msgid "make the tag local"
+msgstr "torna a etiqueta local"
+
+msgid "revision to tag"
+msgstr "revisão a receber a etiqueta"
+
+msgid "remove a tag"
+msgstr "remove uma etiqueta"
+
+msgid "use <text> as commit message"
+msgstr "usa <texto> como mensagem de consolidação"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEXTO] [-d DATA] [-u USUÃRIO] [-r REV] NOME..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr "adiciona uma ou mais etiquetas à revisão atual ou pedida"
+
+msgid " Name a particular revision using <name>."
+msgstr " Nomeia uma determinada revisão usando <nome>."
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" Etiquetas são usadas para nomear determinadas revisões do\n"
+" repositório e são muito úteis para comparar diferentes revisões,\n"
+" para voltar para versões significativas anteriores ou para marcar\n"
+" pontos de ramificação para versões de distribuição, etc.\n"
+" Alterar uma etiqueta existente normalmente não é permitido\n"
+" use -f/--force para forçar essa alteração."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" Se a revisão não for fornecida, será usada a revisão pai do\n"
+" diretório de trabalho, ou a tip se a cópia de trabalho não\n"
+" estiver em uma revisão."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" Para facilitar o controle de versão, a distribuição e a\n"
+" mesclagem de etiquetas, elas são armazenadas em um arquivo\n"
+" chamado \".hgtags\" que é gerenciado de forma similar a\n"
+" outros arquivos do projeto, e pode ser editado manualmente se\n"
+" necessário. O arquivo \".hg/localtags\" é usado para etiquetas\n"
+" locais (não compartilhadas entre repositórios)."
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+" A consolidação de revisões de etiqueta são em geral feitas na\n"
+" cabeça de um ramo. Se o pai do diretório de trabalho não for a\n"
+" cabeça de um ramo, :hg:`tag` abortará; use -f/--force para\n"
+" forçar a consolidação de uma etiqueta a se basear em uma \n"
+" revisão que não seja uma cabeça de ramo."
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+" Como nomes de etiqueta têm prioridade sobre nomes de ramo durante\n"
+" a busca de revisões, não é recomendado usar um nome de ramo\n"
+" existente como nome de etiqueta."
+
+msgid "tag names must be unique"
+msgstr "nomes de etiqueta devem ser únicos"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "nomes de etiqueta não podem conter apenas espaços em branco"
+
+msgid "--rev and --remove are incompatible"
+msgstr "--rev e --remove são incompatíveis"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "a etiqueta '%s' não existe"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "a etiqueta '%s' não é uma etiqueta global"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "a etiqueta '%s' não é uma etiqueta local"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "a etiqueta '%s' já existe (use -f para forçar)"
+
+msgid "uncommitted merge"
+msgstr "mesclagem não consolidada pendente"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "não está em uma cabeça de ramo (use -f para forçar)"
+
+msgid "null revision specified"
+msgstr "foi especificada a revisão nula"
+
+msgid "list repository tags"
+msgstr "lista as etiquetas do repositório"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Lista tanto etiquetas regulares como locais. Se a opção\n"
+" -v/--verbose for usada, uma terceira coluna \"local\" é impressa\n"
+" para etiquetas locais."
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr "exibe a revisão mais recente"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" A revisão tip (tipicamente chamada apenas de tip) é a revisão\n"
+" adicionada mais recentemente ao repositório (e portanto a cabeça\n"
+" modificada mais recentemente."
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" Se você acabou de fazer uma consolidação, essa consolidação será\n"
+" a tip. Se você acabou de trazer revisões de outro repositório, a\n"
+" tip desse repositório será a tip do atual. A etiqueta \"tip\" é\n"
+" especial e não pode ser renomeada ou atribuída a outra\n"
+" revisão."
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr ""
+"atualiza para nova cabeça de ramo se revisões forem extraídas do bundle"
+
+msgid "[-u] FILE..."
+msgstr "[-u] ARQUIVO..."
+
+msgid "apply one or more changegroup files"
+msgstr "aplica um ou mais arquivos de changegroup"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+" Aplica um ou mais arquivos comprimidos de changegroup gerados pelo\n"
+" comando bundle."
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+" Devolve 0 para indicar sucesso, 1 se uma atualização resultar\n"
+" em arquivos não resolvidos.\n"
+" "
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "descarta mudanças não consolidadas (sem backup)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "atualiza através de ramos, se não houverem mudanças pendentes"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATA] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "atualiza o diretório de trabalho (ou muda para outra revisão)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch and move the current bookmark (see :hg:`help\n"
+" bookmarks`)."
+msgstr ""
+" Atualiza o diretório de trabalho do repositório para a revisão\n"
+" pedida. Se não for especificada uma revisão, atualiza para a\n"
+" última revisão do ramo nomeado atual e move o marcador atual\n"
+" (veja :hg:`help bookmarks`)."
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+" Update muda o pai do diretório de trabalho para a revisão especificada\n"
+" (veja :hg:`help parents`)."
+
+msgid ""
+" If the changeset is not a descendant or ancestor of the working\n"
+" directory's parent, the update is aborted. With the -c/--check\n"
+" option, the working directory is checked for uncommitted changes; if\n"
+" none are found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+" Se a revisão não for um descendente ou ancestral\n"
+" do pai do diretório de trabalho,\n"
+" o comando update será abortado. Com a opção -c/--check, o comando\n"
+" verificará se existem mudanças não consolidadas no diretório de\n"
+" trabalho; caso não hajam mudanças, o diretório de trabalho será\n"
+" atualizado para a revisão pedida."
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" Quando o diretório de trabalho contiver mudanças não consolidadas, as\n"
+" seguintes regras se aplicam:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. Se nem -c/--check nem -C/--clean forem especificadas, e se a\n"
+" revisão pedida for um ancestral ou um descendente do pai do\n"
+" diretório de trabalho, as alterações não consolidadas são\n"
+" mescladas com a revisão pedida e o resultado da mesclagem não\n"
+" será automaticamente consolidado. Se a revisão pedida não for\n"
+" um ancestral ou um descendente (ou seja, se estiver em um\n"
+" outro ramo), a atualização abortará e as mudanças não\n"
+" consolidadas serão preservadas."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. Com a opção -c/--check, a atualização abortará e as mudanças\n"
+" não consolidadas serão preservadas."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. Com a opção -C/--clean, mudanças não consolidadas são descartadas\n"
+" e o diretório de trabalho é atualizado para a revisão pedida."
+
+msgid ""
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" Para cancelar uma mesclagem não consolidada (e perder suas\n"
+" modificações), use :hg:`update --clean .`."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" Use null como revisão para remover o diretório de trabalho (com um\n"
+" resultado semelhante a :hg:`clone -U`)."
+
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" Se você quiser reverter apenas um arquivo para seu conteúdo em\n"
+" uma revisão anterior, use :hg:`revert [-r REV] NOME`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "não se pode especificar ao mesmo tempo -c/--check e -C/--clean"
+
+msgid "verify the integrity of the repository"
+msgstr "verifica a integridade do repositório"
+
+msgid " Verify the integrity of the current repository."
+msgstr " Verifica a integridade do repositório atual."
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Isto irá realizar uma verificação ampla da integridade do\n"
+" repositório, validando os hashes e checksums de cada entrada\n"
+" no changelog, manifesto, e arquivos rastreados, bem como a\n"
+" integridade de seus índices e ligações cruzadas."
+
+msgid "output version and copyright information"
+msgstr "exibe versão e informação de copyright"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Sistema de controle de versão distribuído Mercurial (versão %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(veja http://mercurial.selenic.com para mais informações)"
+
+msgid ""
+"Copyright (C) 2005-2012 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2012 Matt Mackall e outros\n"
+"Este software é livre; veja os fontes para condições de cópia. Não\n"
+"há garantias, nem mesmo de adequação para qualquer propósito em\n"
+"particular.\n"
+
+#, python-format
+msgid "unknown mode %s"
+msgstr "modo %s desconhecido"
+
+#, python-format
+msgid "unknown command %s"
+msgstr "comando %s desconhecido"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "não é possível incluir %s (%s)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "diretório de trabalho tem pai desconhecido '%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "revisão desconhecida '%s'"
+
+msgid "not found in manifest"
+msgstr "não encontrado no manifesto"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "não há tal arquivo na revisão %s"
+
+msgid "branch name not in UTF-8!"
+msgstr "nome do ramo não está em UTF-8!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s não existe!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+"%s: até %d MB de RAM podem ser necessários para gerenciar este arquivo\n"
+"(use 'hg revert %s' se você quiser cancelar a adição pendente)\n"
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+"%s não adicionado: apenas arquivos e links simbólicos suportados no "
+"momento\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s já rastreado!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s não rastreado!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s não removido!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr "cópia falhou: %s não é um arquivo ou um link simbólico\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "caractere inválido na descrição do dag: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr "esperado id %i, obtido %i"
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr "id do pai %i é maior que o id atual %i"
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr "tipo de entrada inválido no dag: %s"
+
+msgid "nullid"
+msgstr "nullid"
+
+msgid "working directory state appears damaged!"
+msgstr "estado do diretório de trabalho parece danificado!"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "diretório %r já está em dirstate"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr "o arquivo %r em dirstate colide com %r"
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr "definir %r para outro pai é permitido apenas em mesclagens"
+
+msgid "unknown"
+msgstr "desconhecido"
+
+msgid "character device"
+msgstr "dispositivo de caracteres"
+
+msgid "block device"
+msgstr "dispositivo de bloco"
+
+msgid "fifo"
+msgstr "fifo"
+
+msgid "socket"
+msgstr "socket"
+
+msgid "directory"
+msgstr "diretório"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "tipo de arquivo não suportado (o tipo é %s)"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "push cria novos ramos remotos: '%s'!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "use 'hg push --new-branch' para criar novos ramos remotos"
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "push cria uma nova cabeça remota %s no ramo '%s'!"
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr "push cria uma nova cabeça remota %s!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr "você deve fazer o pull e mesclar ou usar push -f para forçar"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "você esqueceu de mesclar? Use push -f para forçar"
+
+#, python-format
+msgid "new remote heads on branch '%s'\n"
+msgstr "novas cabeças remotas no ramo '%s'\n"
+
+#, python-format
+msgid "new remote head %s\n"
+msgstr "nova cabeça remota %s\n"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "aviso: mudanças remotas não sincronizadas!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "abortado: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr "(%s)\n"
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: erro de análise da entrada em %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: erro de análise da entrada: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+"entrando no depurador - digite c para continuar iniciando o hg ou h para "
+"ajuda\n"
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: o comando '%s' é ambíguo:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "tempo limite excedido esperando por trava de %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "travado por %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "abortado: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "abortado: impossível travar %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+msgid "abort: remote error:\n"
+msgstr "abortado: erro remoto:\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "abortado: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "abortado: %s"
+
+msgid " empty string\n"
+msgstr " string vazia\n"
+
+msgid "killed!\n"
+msgstr "morto!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: comando '%s' desconhecido\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(você esqueceu de compilar extensões?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(sua instalação do Python está correta?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "abortado: erro: %s\n"
+
+msgid "broken pipe\n"
+msgstr "pipe quebrado\n"
+
+msgid "interrupted!\n"
+msgstr "interrompido!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"pipe quebrado\n"
+
+msgid "abort: out of memory\n"
+msgstr "abortado: sem memória\n"
+
+msgid "the extension author."
+msgstr "o autor da extensão."
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension %s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+"** Exceção desconhecida encontrada, envolvendo a extensão de terceiros %s,\n"
+"** possivelmente defeituosa, que suporta a versão %s do Mercurial.\n"
+"** Por favor desabilite %s e tente sua ação novamente.\n"
+"** Se isso corrigir o erro, por favor informe-o para %s\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr ""
+"** exceção desconhecida encontrada, por favor informe sobre esse erro "
+"visitando\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** Mercurial SCM Distribuído (versão %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Extensões carregadas: %s\n"
+
+msgid "too few arguments for command alias"
+msgstr "faltam argumentos para o apelido de comando"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr "nenhuma definição para o apelido '%s'\n"
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+"erro na definição do apelido '%s': %s pode ser passado apenas na linha de "
+"comando\n"
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "apelido '%s' indica comando desconhecido '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "apelido '%s' indica comando ambíguo '%s'\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr "opção --config mal formada: %r (use --config seção.nome=valor)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "erro obtendo diretório de trabalho atual: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "a extensão '%s' sobrepõe o comando: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "a opção --config não pode ser abreviada!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "a opção --cwd não pode ser abreviada!"
+
+msgid ""
+"option -R has to be separated from other options (e.g. not -qR) and "
+"--repository may only be abbreviated as --repo!"
+msgstr ""
+"a opção -R deve ser separada de outras opções (por exemplo, não usar -qR) e "
+"--repository pode ser abreviada apenas como --repo!"
+
+#, python-format
+msgid "time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr "tempo: real %.3f segs (user %.3f+%.3f sys %.3f+%.3f)\n"
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "o repositório '%s' não é local"
+
+#, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "não foi encontrado um repositório em '%s' (.hg não encontrado)"
+
+msgid "warning: --repository ignored\n"
+msgstr "aviso: opção --repository ignorada\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr "formato de profiling '%s' não reconhecido - Ignorado\n"
+
+msgid ""
+"lsprof not available - install from "
+"http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgstr ""
+"lsprof não disponível - instale de "
+"http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr "statprof não está disponível - instale usando \"easy_install statprof\""
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr "frequência de amostragem '%s' inválida - ignorando\n"
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "profiler '%s' não reconhecido - ignorado\n"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** falha ao importar a extensão %s de %s: %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** falha ao importar a extensão %s: %s\n"
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "aviso: erro ao localizar comandos em %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "não foi possível encontrar ferramenta de mesclagem %s\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "a ferramenta %s não pode tratar links simbólicos\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "a ferramenta %s não pode tratar binários\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "a ferramenta %s requer uma interface gráfica (GUI)\n"
+
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+"``internal:prompt``\n"
+"Pergunta ao usuário se a versão local ou a outra deve ser usada\n"
+" como resultado da mesclagem."
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" nenhuma ferramenta encontrada para mesclar %s\n"
+"manter (l)ocal ou usar (o)utro?"
+
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+"``internal:local``\n"
+"Usa a versão local de arquivos como resultado da mesclagem."
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+"``internal:other``\n"
+"Usa a outra (não local) versão de arquivos como resultado da mesclagem."
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+"``internal:fail``\n"
+"Ao invés de tentar mesclar arquivos modificados em ambos os ramos,\n"
+" marca tais arquivos como não resolvidos. O comando resolve deve\n"
+" então ser usado para resolver esses conflitos."
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr "%s.premerge não é válido ('%s' não é nem booleano nem %s)"
+
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+"``internal:merge``\n"
+"Usa o algoritmo não interativo interno simples para mesclar arquivos.\n"
+" Se houver qualquer conflito, esse algoritmo falhará, deixando\n"
+" marcadores no arquivo parcialmente mesclado."
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr ""
+"a mesclagem de %s está incompleta! (edite os conflitos, e em seguida use 'hg"
+" resolve --mark')\n"
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+"``internal:dump``\n"
+"Cria três versões dos arquivos a serem mesclados, com os conteúdos\n"
+" das versões local, outra e base. Estes arquivos podem então ser\n"
+" usados para fazer uma mesclagem manual. Se o arquivo a ser mesclado\n"
+" se chamar ``a.txt``, estes arquivos serão chamados respectivamente\n"
+" ``a.txt.local``, ``a.txt.other`` e ``a.txt.base`` e serão colocados\n"
+" no mesmo diretório de ``a.txt``."
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "mesclagem de %s falhou!\n"
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr "a mesclagem de '%s' teve sucesso (yn)?"
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+" arquivo de saída %s parece não ter modificações\n"
+"a mesclagem teve sucesso (yn)?"
+
+msgid "unterminated string"
+msgstr "string não terminada"
+
+msgid "syntax error"
+msgstr "erro de sintaxe"
+
+msgid "missing argument"
+msgstr "argumento faltando"
+
+msgid "can't use a list in this context"
+msgstr "não se pode usar uma lista nesse contexto"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+"``modified()``\n"
+" Arquivo com status modificado (M)."
+
+#. i18n: "modified" is a keyword
+msgid "modified takes no arguments"
+msgstr "modified não tem argumentos"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+"``added()``\n"
+" Arquivo com status adicionado (A)."
+
+#. i18n: "added" is a keyword
+msgid "added takes no arguments"
+msgstr "added não tem argumentos"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+"``removed()``\n"
+" Arquivo com status removido (R)."
+
+#. i18n: "removed" is a keyword
+msgid "removed takes no arguments"
+msgstr "removed não tem argumentos"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+"``deleted()``\n"
+" Arquivo com status apagado (!)."
+
+#. i18n: "deleted" is a keyword
+msgid "deleted takes no arguments"
+msgstr "deleted não tem argumentos"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``unknown()``\n"
+" Arquivo com status desconhecido (?). Tais arquivos só serão\n"
+" considerados se este predicado for usado."
+
+#. i18n: "unknown" is a keyword
+msgid "unknown takes no arguments"
+msgstr "unknown não tem argumentos"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``ignored()``\n"
+" Arquivo com status ignorado (I). Tais arquivos só serão\n"
+" considerados se este predicado for usado."
+
+#. i18n: "ignored" is a keyword
+msgid "ignored takes no arguments"
+msgstr "ignored não tem argumentos"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+"``clean()``\n"
+" Arquivo com status limpo (C)."
+
+#. i18n: "clean" is a keyword
+msgid "clean takes no arguments"
+msgstr "clean não tem argumentos"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "não é uma função: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+"``binary()``\n"
+" O arquivo parece ser binário (contém bytes NUL)."
+
+#. i18n: "binary" is a keyword
+msgid "binary takes no arguments"
+msgstr "binary não tem argumentos"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+"``exec()``\n"
+" O arquivo foi marcado como executável."
+
+#. i18n: "exec" is a keyword
+msgid "exec takes no arguments"
+msgstr "exec não tem argumentos"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+"``symlink()``\n"
+" O arquivo foi marcado como link simbólico."
+
+#. i18n: "symlink" is a keyword
+msgid "symlink takes no arguments"
+msgstr "symlink não tem argumentos"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+"``resolved()``\n"
+" O arquivo foi marcado como resolvido de acordo com o estado de\n"
+" resolução (comando resolve)."
+
+#. i18n: "resolved" is a keyword
+msgid "resolved takes no arguments"
+msgstr "resolved não tem argumentos"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+"``unresolved()``\n"
+" O arquivo foi marcado como não resolvido de acordo com o estado de\n"
+" resolução (comando resolve)."
+
+#. i18n: "unresolved" is a keyword
+msgid "unresolved takes no arguments"
+msgstr "unresolved não tem argumentos"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+"``hgignore()``\n"
+" O nome do arquivo combina com um padrão do arquivo .hgignore ativo."
+
+msgid "hgignore takes no arguments"
+msgstr "hgignore não tem argumentos"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+"``grep(regex)``\n"
+" O arquivo contém a expressão regular fornecida."
+
+msgid "grep requires a pattern"
+msgstr "grep requer um padrão"
+
+#, python-format
+msgid "couldn't parse size: %s"
+msgstr "não foi possível decodificar o tamanho: %s"
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+"``size(expressão)``\n"
+" O tamanho do arquivo combina com a expressão fornecida. Por exemplo:"
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+" - 1k (arquivos com tamanho de 1024 a 2047 bytes)\n"
+" - < 20k (arquivos com tamanho menor que 20480 bytes)\n"
+" - >= .5MB (arquivos com pelo menos 524288 bytes)\n"
+" - 4k - 1MB (arquivos com tamanho entre 4096 bytes e 1048576 bytes)"
+
+#. i18n: "size" is a keyword
+msgid "size requires an expression"
+msgstr "size requer uma expressão"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+"``encoding(name)``\n"
+" O arquivo pode ser decodificado com sucesso com a codificação de\n"
+" caracteres fornecida. Pode não ser muito útil para codificações\n"
+" diferentes de ASCII e UTF-8."
+
+#. i18n: "encoding" is a keyword
+msgid "encoding requires an encoding name"
+msgstr "encoding requer um nome de codificação"
+
+#, python-format
+msgid "unknown encoding '%s'"
+msgstr "codificação desconhecida '%s'"
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+"``copied()``\n"
+" O arquivo foi registrado como cópia."
+
+#. i18n: "copied" is a keyword
+msgid "copied takes no arguments"
+msgstr "copied não tem argumentos"
+
+msgid ""
+"``subrepo([pattern])``\n"
+" Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([padrão])``\n"
+" Sub-repositórios cujos caminhos combinam com o padrão."
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo recebe um ou nenhum argumento"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo requer um padrão ou nenhum argumento"
+
+msgid "invalid token"
+msgstr "token inválido"
+
+msgid "starting revisions are not directly related"
+msgstr "as revisões iniciais não são diretamente relacionadas"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "estado inconsistente, %s:%s é bom e ruim"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr "tipo desconhecido de bisect %s"
+
+msgid "invalid bisect state"
+msgstr "estado de bissecção inválido"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "boa"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "ruim"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "omitida"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "não testada"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "boa (implicitamente)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "ruim (implicitamente)"
+
+msgid "disabled extensions:"
+msgstr "extensões desabilitadas:"
+
+msgid "VALUE"
+msgstr "VALOR"
+
+msgid "DEPRECATED"
+msgstr "OBSOLETO"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"opções marcadas com [+] podem ser especificadas múltiplas vezes\n"
+
+msgid "Configuration Files"
+msgstr "Arquivos de Configuração"
+
+msgid "Date Formats"
+msgstr "Formatos de datas"
+
+msgid "File Name Patterns"
+msgstr "Padrões de nome de arquivo"
+
+msgid "Environment Variables"
+msgstr "Variáveis de ambiente"
+
+msgid "Specifying Single Revisions"
+msgstr "Especificação de revisões únicas"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Especificação de múltiplas revisões"
+
+msgid "Specifying Revision Sets"
+msgstr "Especificação de Conjuntos de Revisões"
+
+msgid "Specifying File Sets"
+msgstr "Especificação de Conjuntos de Arquivos"
+
+msgid "Diff Formats"
+msgstr "Formatos de Diff"
+
+msgid "Merge Tools"
+msgstr "Utilitários de Mesclagem"
+
+msgid "Template Usage"
+msgstr "Uso de Modelos"
+
+msgid "URL Paths"
+msgstr "Caminhos URL"
+
+msgid "Using Additional Features"
+msgstr "Usando Funcionalidades Adicionais"
+
+msgid "Subrepositories"
+msgstr "Sub-repositórios"
+
+msgid "Configuring hgweb"
+msgstr "Configuração do hgweb"
+
+msgid "Glossary"
+msgstr "Glossário"
+
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "Sintaxe dos Arquivos de Padrões de Arquivos Ignorados"
+
+msgid "Working with Phases"
+msgstr "Trabalhando Com Fases"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+"O Mercurial usa um conjunto de arquivos de configuração para controlar\n"
+"aspectos de seu comportamento."
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Os arquivos de configuração usam um simples formato ini.\n"
+"Um arquivo de configuração consiste de seções iniciadas por um\n"
+"cabeçalho ``[seção]`` seguidas por entradas ``nome = valor``::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Primeironome Sobrenome <primeironome.sobrenome@exemplo.net>\n"
+" verbose = True"
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"As entradas acima são referidas como ``ui.username`` e\n"
+"``ui.verbose``, respectivamente. Veja a seção Sintaxe abaixo."
+
+msgid ""
+"Files\n"
+"====="
+msgstr ""
+"Arquivos\n"
+"========"
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+"O Mercurial lê dados de configuração de diversos arquivos, se existirem.\n"
+"Estes arquivos por padrão não existem, e você mesmo precisa criar os\n"
+"arquivos de configuração apropriados: configurações globais, como por\n"
+"exemplo seu nome de usuário, são tipicamente colocadas em\n"
+"``%USERPROFILE%\\mercurial.ini`` ou ``$HOME/.hgrc``, e configurações\n"
+"específicas de um repositório são colocadas no arquivo\n"
+"``<repositório>/.hg/hgrc``."
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+"Os nomes desses arquivos dependem do sistema no qual o Mercurial\n"
+"está instalado. Arquivos ``*.rc`` de um único diretório são lidos em\n"
+"ordem alfabética, e definições em arquivos posteriores sobrepõe\n"
+"definições em arquivos anteriores. Onde múltiplos caminhos forem\n"
+"mencionados abaixo, definições de caminhos anteriores sobrepõe\n"
+"definições de caminhos posteriores."
+
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr "| (Todos) ``<repo>/.hg/hgrc``"
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+" belong to a trusted user or to a trusted group. See the documentation\n"
+" for the ``[trusted]`` section below for more details."
+msgstr ""
+" Configurações específicas do repositório <repo>. Este arquivo\n"
+" não é versionado, e não é transferido durante uma operação\n"
+" \"clone\". Opções neste arquivo sobrepõe opções em qualquer outro\n"
+" arquivo de configuração. No Plan 9 e Unix, a maior parte deste arquivo\n"
+" será ignorada se ele não pertencer a um usuário ou grupo\n"
+" confiável; veja abaixo a documentação sobre a seção [trusted]\n"
+" para maiores detalhes."
+
+msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-installation\n"
+" options."
+msgstr ""
+" Arquivos de configuração específicos do usuário que executa o Mercurial.\n"
+" No Windows 9x, ``%HOME%`` é substituído por ``%APPDATA%``. Opções nestes\n"
+" arquivos se aplicam a todos os comandos do Mercurial executados por este\n"
+" usuário em qualquer diretório. Opções nestes arquivos sobrepõe opções\n"
+" por sistema e por instalação."
+
+msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+" Arquivos de configuração por sistema, específicos do sistema no qual\n"
+" o Mercurial é executado. Opções nestes arquivos se aplicam a todos\n"
+" os comandos do Mercurial executados por qualquer usuário em qualquer\n"
+" diretório. Opções nestes arquivos sobrepõe opções por instalação."
+
+msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+" Arquivos de configuração por instalação, procurados no diretório onde\n"
+" o Mercurial está instalado. ``<install-root>`` é o diretório pai do\n"
+" executável **hg** (ou link simbólico) executado.\n"
+" Por exemplo, se instalado em ``/shared/tools/bin/hg``, o Mercurial\n"
+" procurará em ``/shared/tools/etc/mercurial/hgrc``.\n"
+" Opções nestes arquivos se aplicam a todos os comandos do Mercurial\n"
+" executados por qualquer usuário em qualquer diretório."
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected."
+msgstr ""
+" Arquivos de configuração por instalação e sistema, para o sistema\n"
+" no qual o Mercurial está instalado.\n"
+" Opções nestes arquivos se aplicam a todos os comandos do Mercurial\n"
+" executados por qualquer usuário em qualquer diretório.\n"
+" As chaves do registro contém strings semelhantes ao PATH; cada parte\n"
+" delas deve fazer referência a um arquivo ``Mercurial.ini`` ou a um\n"
+" diretório do qual arquivos ``*.rc`` serão lidos.\n"
+" O Mercurial verifica cada uma destas localizações na ordem\n"
+" especificada até que um ou mais arquivos de configuração sejam\n"
+" encontrados."
+
+msgid ""
+"Syntax\n"
+"======"
+msgstr ""
+"Sintaxe\n"
+"======="
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+"Um arquivo de configuração consiste de seções iniciadas por um\n"
+"cabeçalho ``[seção]`` seguidas por entradas ``nome = valor``\n"
+"(por vezes chamadas de ``chaves de configuração``)::"
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+"Cada linha contém uma entrada. Se as linhas seguintes estiverem\n"
+"indentadas, elas serão tratadas como continuações dessa entrada.\n"
+"Espaços em branco no início do valor são descartados. Linhas\n"
+"vazias são ignoradas. Linhas começadas por ``#`` ou ``;`` são\n"
+"ignoradas e podem ser usadas para comentários."
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+"Chaves de configuração podem ser definidas múltiplas vezes; nesse\n"
+"caso, o Mercurial usará o valor que tiver sido definido por último.\n"
+"Por exemplo::"
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr "Isto definirá a chave de configuração ``eggs`` com o valor ``small``."
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+"Também é possível definir múltiplas vezes uma seção. Uma seção pode ser\n"
+"redefinida no mesmo ou em diferentes arquivos de configuração. Por exemplo::"
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+"Isto definiria as chaves de configuração ``eggs``, ``ham`` e ``bread``\n"
+"da seção ``foo`` com os valores ``medium``, ``prosciutto`` e ``toasted``,\n"
+"respectivamente. Note que a única coisa que importa é o último valor\n"
+"definido para cada chave de configuração."
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+"Se uma chave de configuração for definida múltiplas vezes em diferentes\n"
+"arquivos de configuração, o valor final dependerá da ordem na qual os\n"
+"diferentes arquivos de configuração forem lidos, sendo que definições\n"
+"de caminhos anteriores sobrepõe definições de caminhos posteriores, como\n"
+"descrito na seção ``Arquivos`` acima."
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+"Uma linha da forma ``%include arquivo`` incluirá ``arquivo`` no\n"
+"arquivo de configuração atual.\n"
+"A inclusão é recursiva, ou seja, os arquivos incluídos podem\n"
+"incluir outros arquivos.\n"
+"O caminho de um arquivo incluído é relativo ao próprio arquivo de\n"
+"configuração que o incluiu.\n"
+"Variáveis de ambiente e construções ``~usuário`` são expandidos em\n"
+"``arquivo``. Assim, você pode fazer algo como::"
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr " %include ~/.hgrc.d/$HOST.rc"
+
+msgid "to include a different configuration file on each computer you use."
+msgstr ""
+"para incluir um arquivo de configuração diferente em cada computador\n"
+"que você usar."
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+"Uma linha ``%unset nome`` removerá ``nome`` da seção atual, se tiver\n"
+"sido definido previamente."
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or \"off\"\n"
+"(all case insensitive)."
+msgstr ""
+"Os valores podem ser strings de texto, listas de strings de texto, ou\n"
+"valores booleanos. Valores booleanos podem ser definidos como verdadeiros\n"
+"usando \"1\", \"yes\", \"true\" ou \"on\", e como falsos usando \"0\",\n"
+"\"no\", \"false\" ou \"off\" (sem considerar maiúsculas ou minúsculas)."
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+"Listas são separadas por espaços em branco ou vírgulas, exceto se os\n"
+"valores estiverem entre aspas duplas::"
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr " allow_read = \"John Doe, PhD\", brian, betty"
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+"Aspas duplas podem ser colocadas nos valores se prefixadas por uma\n"
+"barra invertida (\"\\\"). Apenas aspas duplas no começo de uma\n"
+"palavra iniciam uma citação literal (por exemplo, ``foo\"bar baz``\n"
+"é uma lista contendo ``foo\"bar`` e ``baz``)."
+
+msgid ""
+"Sections\n"
+"========"
+msgstr ""
+"Seções\n"
+"======"
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+"Esta seção descreve as diversas seções que podem aparecer em um arquivo\n"
+"de configuração do Mercurial, o propósito de cada seção, suas chaves e\n"
+"seus valores possíveis."
+
+msgid ""
+"``alias``\n"
+"---------"
+msgstr ""
+"``alias``\n"
+"---------"
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+"Define apelidos para comandos.\n"
+"Apelidos são novos comandos definidos em termos de outros comandos\n"
+"(ou outros apelidos), opcionalmente incluindo argumentos. Argumentos\n"
+"posicionais na forma de ``$1``, ``$2``, etc na definição do apelido\n"
+"são expandidos pelo Mercurial antes da execução. Argumentos posicionais\n"
+"não utilizados como ``$N`` na definição são colocados ao final do\n"
+"comando a ser executado."
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr "Definições de apelidos consistem de linhas da seguinte forma::"
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr " <apelido> = <comando> [<argumento>]..."
+
+msgid "For example, this definition::"
+msgstr "Por exemplo, esta definição::"
+
+msgid " latest = log --limit 5"
+msgstr " ultimos = log --limit 5"
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+"cria um novo comando ``ultimos`` que mostra apenas as cinco revisões\n"
+"mais recentes. Você pode definir apelidos a partir de outros apelidos\n"
+"definidos anteriormente::"
+
+msgid " stable5 = latest -b stable"
+msgstr " stable5 = ultimos -b stable"
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+".. note:: É possível criar apelidos com os mesmos nomes que comandos\n"
+" existentes, o que irá sobrepôr suas definições originais. Isto é\n"
+" quase sempre uma má ideia!"
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+"Um apelido pode começar com um ponto de exclamação (``!``) para torná-lo\n"
+"um apelido de shell. Um apelido de shell é executado pelo shell, e pode\n"
+"ser usado para executar comandos arbitrários. Por exemplo, ::"
+
+msgid " echo = !echo $@"
+msgstr " echo = !echo $@"
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+"fará com que ``hg echo foo`` imprima ``foo`` em seu terminal.\n"
+"Um exemplo melhor (em um Unix) poderia ser::"
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+"que fará com que ``hg purge`` apague todos os arquivos desconhecidos no\n"
+"repositório da mesma maneira que a extensão purge."
+
+msgid ""
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+"Argumentos posicionais como ``$1``, ``$2``, etc. na definição\n"
+"do apelido expandem para argumentos da linha de comando. Argumentos\n"
+"em excesso são removidos. ``$0`` expande para o nome do apelido e\n"
+"``$@`` expande para todos os argumentos, separados por espaços.\n"
+"Estas expansões são realizadas antes de o comando ser passado\n"
+"para o shell."
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+"Apelidos de shell são executados em um ambiente no qual ``$HG``\n"
+"expande para o caminho do Mercurial que foi usado para executar o\n"
+"apelido. Isto pode ser usado para invocar novos comandos do\n"
+"Mercurial em um apelido de shell, como foi feito acima para o\n"
+"apelido purge. Adicionalmente, ``$HG_ARGS`` expande para os\n"
+"argumentos passados para o Mercurial. Na chamada ``hg echo foo``\n"
+"acima, ``$HG_ARGS`` expandiria para ``echo foo``."
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+".. note:: Algumas opções globais de configuração, como ``-R``,\n"
+" são processadas antes de apelidos de shell, e portanto não serão\n"
+" passadas para os apelidos."
+
+msgid ""
+"\n"
+"``annotate``\n"
+"------------"
+msgstr ""
+"\n"
+"``annotate``\n"
+"------------"
+
+msgid ""
+"Settings used when displaying file annotations. All values are\n"
+"Booleans and default to False. See ``diff`` section for related\n"
+"options for the diff command."
+msgstr ""
+"Definições usadas ao exibir anotações de arquivo. Todos os valores\n"
+"são booleanos com padrão False. Veja a seção ``diff`` para opções\n"
+"relacionadas do comando diff."
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+"``ignorews``\n"
+" ignora espaços em branco ao comparar linhas"
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+"``ignorewsamount``\n"
+" ignora mudanças na quantidade de espaços em branco"
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+"``ignoreblanklines``\n"
+" ignora mudanças cujas linhas sejam todas brancas"
+
+msgid ""
+"\n"
+"``auth``\n"
+"--------"
+msgstr ""
+"\n"
+"``auth``\n"
+"--------"
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+"Credenciais de autenticação HTTP. Esta seção pode ser usada para\n"
+"armazenar nomes de usuário e senhas usados para acessar servidores\n"
+"HTTP remotos. Veja a seção de configuração ``[web]`` para configurar\n"
+"*quem* pode acessar o seu servidor HTTP local."
+
+msgid "Each line has the following format::"
+msgstr "Cada linha tem o seguinte formato::"
+
+msgid " <name>.<argument> = <value>"
+msgstr " <nome>.<argumento> = <valor>"
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+"onde ``<nome>`` é usado para agrupar argumentos em entradas de\n"
+"autenticação. Por exemplo::"
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+
+msgid "Supported arguments:"
+msgstr "Argumentos suportados:"
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+"``prefix``\n"
+" Ou ``*`` ou um prefixo URI com ou sem a parte do esquema.\n"
+" Será usada a entrada de autenticação com o maior prefixo que\n"
+" combine (onde ``*`` combina com qualquer coisa, e conta como um\n"
+" prefixo de comprimento 1). Se o prefixo não incluir um esquema,\n"
+" a URL também terá seu esquema removido para a verificação, e o\n"
+" argumento schemes será então consultado em seguida."
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+"``username``\n"
+" Opcional. Nome do usuário usado para a autenticação. Se não for\n"
+" fornecido, e o servidor remoto solicitar autenticação básica ou\n"
+" digest, o usuário do Mercurial será consultado interativamente para\n"
+" fornecê-lo. Variáveis de ambiente são expandidas no nome de usuário,\n"
+" de forma a suportar ``foo.username = $USER``.\n"
+" Se a URI incluir um nome de usuário, só serão consideradas as\n"
+" entradas ``[auth]`` com o nome de usuário correspondente ou\n"
+" sem nome de usuário."
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+"``password``\n"
+" Opcional. Senha usada para autenticação. Se não for fornecida, e o\n"
+" servidor remoto solicitar autenticação básica ou digest, o usuário\n"
+" do Mercurial será consultado interativamente para fornecê-la."
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``key``\n"
+" Opcional. Arquivo certificado de cliente codificado em formato PEM.\n"
+" Variáveis de ambiente serão expandidas no caminho do arquivo."
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``cert``\n"
+" Opcional. Arquivo certificado de cadeia codificado em formato PEM.\n"
+" Variáveis de ambiente serão expandidas no caminho do arquivo."
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+"``schemes``\n"
+" Opcional. Lista separada por espaços de esquemas URI com os quais\n"
+" usar esta entrada de autenticação. Só será usado se o prefixo não\n"
+" incluir um esquema. Os esquemas suportados são http e https. Eles\n"
+" também combinarão com static-http e static-https, respectivamente.\n"
+" O padrão é: https."
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+"Se nenhuma entrada de autenticação apropriada for encontrada, o usuário\n"
+"será consultado interativamente para fornecer credenciais normalmente,\n"
+"se forem solicitadas pelo servidor remoto."
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+msgstr ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+"Filtros para transformar arquivos durante update/commit. São\n"
+"tipicamente utilizados para processar quebras de linha ou outro\n"
+"tipo de localização ou padronização de arquivos."
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+"Filtros consistem de um padrão de arquivos filtrados seguido por um\n"
+"comando de filtragem. Por padrão, o padrão de arquivos usa globs,\n"
+"a partir da raiz do repositório. Por exemplo, para combinar com qualquer\n"
+"arquivo terminado por ``.txt`` apenas no diretório raiz, use o padrão\n"
+"``*.txt``. Para combinar com qualquer arquivo terminado em ``.c`` em\n"
+"qualquer ponto do repositório, use o padrão ``**.c``.\n"
+"Para cada arquivo, apenas o primeiro filtro que combine será usado."
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+"O comando de filtragem pode começar com um especificador ``pipe:`` ou\n"
+"``tempfile:``. Se nenhum for fornecido, ``pipe:`` será usado."
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+"Um comando ``pipe:`` deve aceitar dados na entrada padrão e devolver os\n"
+"dados transformados na saída padrão."
+
+msgid "Pipe example::"
+msgstr "Exemplo de pipe::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+" [encode]\n"
+" # descompacta arquivos gzip no commit para melhorar a\n"
+" # compressão em delta\n"
+" # obs: não é necessariamente uma boa ideia, este é apenas\n"
+" # um exemplo\n"
+" *.gz = pipe: gunzip"
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+" [decode]\n"
+" # recomprime arquivos gzip ao escrevê-los no diretório de trabalho\n"
+" # (podemos seguramente omitir \"pipe:\", por ser o padrão)\n"
+" *.gz = gzip"
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+"Um comando ``tempfile:`` é um modelo. A string ``INFILE`` é substituída\n"
+"pelo nome de um arquivo temporário que conterá os dados a serem filtrados\n"
+"pelo comando. A string ``OUTFILE`` será substituída pelo nome de um\n"
+"arquivo temporário vazio, no qual os dados devam ser escritos pelo comando."
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+".. note:: O mecanismo tempfile é recomendado para sistemas Windows,\n"
+" no qual os operadores padrão do shell de redirecionamento de comandos\n"
+" por vezes causam efeitos estranhos e podem corromper o conteúdo de\n"
+" seus arquivos."
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+"Este mecanismo de filtragem é usado internamente pela extensão\n"
+"``eol`` para traduzir quebras de linha entre os formatos Windows (CRLF)\n"
+"e Unix (LF). Por conveniência, sugerimos que você utilize a extensão\n"
+"``eol`` se esse tipo de conversão for necessária."
+
+msgid ""
+"\n"
+"``defaults``\n"
+"------------"
+msgstr ""
+"\n"
+"``defaults``\n"
+"------------"
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr ""
+"(defaults são obsoletos, e não devem ser utilizados. Use apelidos no\n"
+"lugar deles; veja a seção ``[alias]``)"
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+"Você pode usar a seção ``[defaults]`` para definir padrões de comandos,\n"
+"isto é, as opções ou argumentos a serem passadas para comandos\n"
+"especificados por padrão."
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+"O seguinte exemplo faz com que :hg:`log` execute em modo verboso,\n"
+"e :hg:`status` mostre apenas arquivos modificados, por padrão::"
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+"Os próprios comandos (e não apelidos) devem ser usados ao definir padrões\n"
+"de comandos. Os padrões também serão aplicados aos apelidos que usarem\n"
+"esses comandos."
+
+msgid ""
+"\n"
+"``diff``\n"
+"--------"
+msgstr ""
+"\n"
+"``diff``\n"
+"--------"
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified``\n"
+"is a Boolean and defaults to False. See ``annotate`` section for\n"
+"related options for the annotate command."
+msgstr ""
+"Definições usadas ao exibir diffs. Exceto por ``unified``, todas são\n"
+"booleanas, por padrão False. Veja a seção ``annotate`` para opções\n"
+"relacionadas do comando annotate."
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" usa o formato estendido de diff do git"
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+"``nodates``\n"
+" Não inclui datas nos cabeçalhos de diff."
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" mostra em qual função está cada mudança"
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+" número de linhas de contexto a serem mostradas"
+
+msgid ""
+"``email``\n"
+"---------"
+msgstr ""
+"``email``\n"
+"---------"
+
+msgid "Settings for extensions that send email messages."
+msgstr "Definições para extensões que enviam mensagens de email."
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+"``from``\n"
+" Opcional. Endereço de email usado no cabeçalho \"From\" e envelope\n"
+" SMTP de mensagens enviadas."
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+"``to``\n"
+" Opcional. Lista separada por vírgulas de endereços de email\n"
+" destinatários."
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``cc``\n"
+" Opcional. Lista separada por vírgulas de destinatários especificados\n"
+" em cópia carbono."
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``bcc``\n"
+" Opcional. Lista separada por vírgulas de destinatários especificados\n"
+" em cópia carbono oculta."
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+"``method``\n"
+" Opcional. Método usado para enviar mensagens de email. Se o valor\n"
+" for ``smtp`` (o padrão), usa SMTP (veja a seção de configuração\n"
+" ``[smtp]``). Caso contrário, o valor será interpretado como o nome\n"
+" de um programa a ser executado que atue como o sendmail\n"
+" (que use a opção ``-f`` para remetente, leia a lista de\n"
+" destinatários na linha de comando, e a mensagem da entrada padrão).\n"
+" Normalmente, definir esta chave como ``sendmail`` ou\n"
+" ``/usr/sbin/sendmail`` basta para usar o sendmail para enviar mensagens."
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+"``charsets``\n"
+" Opcional. Lista separada por vírgulas de conjuntos de caracteres\n"
+" considerados convenientes para destinatários. Endereços, cabeçalhos\n"
+" e partes de mensagens que não contiverem patches serão codificadas\n"
+" no primeiro conjunto de caracteres para o qual a conversão da\n"
+" codificação local (``$HGENCODING``, ``ui.fallbackencoding``) seja\n"
+" realizada com sucesso. Se a conversão correta falhar, o texto em\n"
+" questão será enviado sem modificações. O valor padrão é uma lista\n"
+" (explicitamente) vazia."
+
+msgid " Order of outgoing email character sets:"
+msgstr " Ordem de conjuntos de caracteres para emails:"
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+" 1. ``us-ascii``: sempre usado primeiro, independente de configuração\n"
+" 2. ``email.charsets``: na ordem dada pelo usuário\n"
+" 3. ``ui.fallbackencoding``: se não estiver em email.charsets\n"
+" 4. ``$HGENCODING``: se não estiver em email.charsets\n"
+" 5. ``utf-8``: sempre por último, independente de configuração"
+
+msgid "Email example::"
+msgstr "Exemplo de email::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # caracteres para a Europa Ocidental\n"
+" # us-ascii e utf-8 omitidos, pois sempre são tentados\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+
+msgid ""
+"\n"
+"``extensions``\n"
+"--------------"
+msgstr ""
+"\n"
+"``extensions``\n"
+"--------------"
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+"O Mercurial possui um mecanismo de extensão para adicionar novas\n"
+"funcionalidades. Para habilitar uma extensão, crie para ela uma\n"
+"entrada nesta seção."
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+"Se você souber que a extensão já está no caminho de busca do Python\n"
+"(como tipicamente é o caso para extensões distribuídas com o Mercurial),\n"
+"você pode passar o nome do módulo, seguido por ``=``, sem nada após o\n"
+"``=``."
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+"Caso contrário, forneça um nome à sua escolha, seguido por ``=``,\n"
+"seguido pelo caminho para o arquivo ``.py`` (incluindo a extensão do\n"
+"arquivo) que define a extensão."
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"Para desabilitar explicitamente uma extensão habilitada em um\n"
+"arquivo de configuração de escopo mais amplo, prefixe seu caminho com !,\n"
+"como em ``foo = !/ext/path``, ou ``foo = !`` se um caminho não for\n"
+"fornecido."
+
+msgid "Example for ``~/.hgrc``::"
+msgstr "Exemplo para ``~/.hgrc``::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" # (a extensão mq será carregada a partir do caminho do Mercurial)\n"
+" mq =\n"
+" # (esta extensão será carregada do arquivo especificado)\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"\n"
+"``format``\n"
+"----------"
+msgstr ""
+"\n"
+"``format``\n"
+"----------"
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+"``usestore``\n"
+" Habilita ou desabilita o formato de repositório \"store\", que melhora\n"
+" compatibilidade com sistemas de arquivo que interferem em nomes de\n"
+" arquivo, por exemplo alterando maiúsculas e minúsculas.\n"
+" Habilitado por padrão. Desabilitar esta opção permite o armazenamento\n"
+" de nomes de arquivo mais longos em algumas situações, em prejuízo\n"
+" da compatibilidade, e garante que o formato em disco de repositórios\n"
+" criados recentemente seja compatível com versões do Mercurial\n"
+" anteriores à 0.9.4."
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+"``usefncache``\n"
+" Habilita ou desabilita o formato de repositório \"fncache\", que\n"
+" aprimora o formato \"store\" (que deve ser habilitado para o uso de\n"
+" fncache) para permitir nomes de arquivo mais longos e evitar o uso\n"
+" de nomes de arquivo reservados, como \"nul\". Habilitado por padrão.\n"
+" Desabilitar esta opção garante que o formato em disco de repositórios\n"
+" criados recentemente seja compatível com versões do Mercurial\n"
+" anteriores à 1.1."
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+"``dotencode``\n"
+" Habilita ou desabilita o formato de repositório \"dotencode\", que\n"
+" aprimora o formato \"fncache\" (que deve ser habilitado para o uso de\n"
+" dotencode) para evitar problemas com nomes de arquivo iniciados por\n"
+" ._ no Mac OS X e espaços no Windows. Habilitado por padrão.\n"
+" Desabilitar esta opção garante que o formato em disco de repositórios\n"
+" criados recentemente seja compatível com versões do Mercurial\n"
+" anteriores à 1.7."
+
+msgid ""
+"``graph``\n"
+"---------"
+msgstr ""
+"``graph``\n"
+"---------"
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+"Configuração da visualização de grafo da interface web. Esta seção\n"
+"possibilita mudar propriedades de exibição de elementos do grafo,\n"
+"para por exemplo ressaltar o ramo ``default``."
+
+msgid " <branch>.<argument> = <value>"
+msgstr " <ramo>.<argumento> = <valor>"
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr "onde ``<ramo>`` é o nome do ramo a ser personalizado. Por exemplo::"
+
+msgid ""
+" [graph]\n"
+" # 2px width\n"
+" default.width = 2\n"
+" # red color\n"
+" default.color = FF0000"
+msgstr ""
+" [graph]\n"
+" # 2 pixels de largura\n"
+" default.width = 2\n"
+" # cor vermelha\n"
+" default.color = FF0000"
+
+msgid ""
+"``width``\n"
+" Set branch edges width in pixels."
+msgstr ""
+"``width``\n"
+" Define a largura das arestas do ramo, em pixels."
+
+msgid ""
+"``color``\n"
+" Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+"``color``\n"
+" Define a cor das arestas do ramo, em notação RGB hexadecimal."
+
+msgid ""
+"``hooks``\n"
+"---------"
+msgstr ""
+"``hooks``\n"
+"---------"
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string. Hooks can be prioritized\n"
+"by adding a prefix of ``priority`` to the hook name on a new line\n"
+"and setting the priority. The default priority is 0 if\n"
+"not specified."
+msgstr ""
+"Hooks, ou ganchos, são comandos ou funções Python automaticamente\n"
+"executados por várias ações, como iniciar ou finalizar um commit.\n"
+"Múltiplos ganchos podem ser executados para a mesma ação através\n"
+"da adição de um sufixo à ação.\n"
+"Um gancho definido para o sistema todo pode ser sobreposto alterando\n"
+"seu valor ou definindo-o para uma string vazia.\n"
+"Ganchos podem ser priorizados adicionando-se um prefixo ``priority``\n"
+"ao nome do gancho em uma nova linha e atribuindo a prioridade.\n"
+"Se não especificada, a prioridade padrão é 0."
+
+msgid "Example ``.hg/hgrc``::"
+msgstr "Um exemplo de ``.hg/.hgrc``::"
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # force autobuild hook to run before other incoming hooks\n"
+" priority.incoming.autobuild = 1"
+msgstr ""
+" [hooks]\n"
+" # atualiza o diretório de trabalho após a adição de revisões\n"
+" changegroup.update = hg update\n"
+" # não usa o gancho de sistema\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # força o gancho autobuild a ser executado antes de outros ganchos incoming\n"
+" priority.incoming.autobuild = 1"
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+"Vários ganchos são executados com variáveis de ambiente que fornecem\n"
+"informações adicionais. Para cada gancho abaixo, as variáveis de\n"
+"ambiente recebidas são listadas com nomes com a forma ``$HG_foo``."
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+"``changegroup``\n"
+" Executado após um changegroup ser adicionado em operações push, pull\n"
+" ou unbundle.\n"
+" O ID da primeira revisão nova é passado em ``$HG_NODE``.\n"
+" A URL de origem das mudanças é passada em ``$HG_URL``."
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``commit``\n"
+" Executado após uma revisão ser criada no repositório local.\n"
+" O ID da nova revisão é passado em ``$HG_NODE``.\n"
+" Os IDs das revisões pais são passados em ``$HG_PARENT1`` e ``$HG_PARENT2``."
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+"``incoming``\n"
+" Executado após uma revisão ser trazida para o repositório local em\n"
+" uma operação pull, push ou unbundle.\n"
+" O ID da nova revisão é passado em ``$HG_NODE``.\n"
+" A URL de origem da revisão é passada em ``$HG_URL``."
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+"``outgoing``\n"
+" Executado após o envio de mudanças do repositório local para algum outro.\n"
+" O ID da primeira revisão enviada é passado em ``$HG_NODE``.\n"
+" A origem da operação é passada em ``$HG_SOURCE``; veja o gancho\n"
+" \"preoutgoing\" para uma descrição desse valor."
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+"``post-<comando>``\n"
+" Executado após invocações do comando associado realizadas com sucesso.\n"
+" O conteúdo da linha de comando é passado em ``$HG_ARGS``, e o código de\n"
+" resultado em ``$HG_RESULT``. Argumentos de linha de comando decodificados\n"
+" são passados em ``$HG_PATS`` e ``$HG_OPTS``; estas contém representações\n"
+" em string dos dados python passados internamente para o <comando>.\n"
+" Em ``$HG_OPTS`` é passado um dicionário de opções (com opções não\n"
+" especificadas definidas para seus valores padrão). ``$HG_PATS`` é uma\n"
+" lista de argumentos. A falha destes ganchos é ignorada."
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+"``pre-<comando>``\n"
+" Executado antes de invocações do comando associado.\n"
+" O conteúdo da linha de comando é passado em ``$HG_ARGS``.\n"
+" Argumentos de linha de comando decodificados\n"
+" são passados em ``$HG_PATS`` e ``$HG_OPTS``; estas contém representações\n"
+" em string dos dados python passados internamente para o <comando>.\n"
+" Em ``$HG_OPTS`` é passado um dicionário de opções (com opções não\n"
+" especificadas definidas para seus valores padrão). ``$HG_PATS`` é uma\n"
+" lista de argumentos.\n"
+" Se o gancho devolver uma falha, o comando correspondente não será\n"
+" executado, e o Mercurial devolverá o código da falha."
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+"``prechangegroup``\n"
+" Executado antes de um changegroup ser adicionado em operações\n"
+" push, pull ou unbundle. O status de saída 0 permite que o\n"
+" changegroup seja processado. Status diferentes de zero farão com\n"
+" que a operação push, pull ou unbundle falhe.\n"
+" A URL de origem das mudanças é passada em ``$HG_URL``."
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``precommit``\n"
+" Executado antes de iniciar um commit local. O status de saída 0\n"
+" permite que o commit seja realizado. Status diferentes de zero\n"
+" fazem com que o commit falhe.\n"
+" Os IDs das revisões pais são passados em ``$HG_PARENT1`` e ``$HG_PARENT2``."
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+"``prelistkeys``\n"
+" Executado antes de listar pushkeys (como marcadores) do repositório.\n"
+" Status de saída diferente de zero causará uma falha.\n"
+" O espaço de nomes de chave é passado em ``$HG_NAMESPACE``."
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+"``preoutgoing``\n"
+" Executado antes da coleta de mudanças a serem enviadas do\n"
+" repositório local para algum outro. Status de saída diferentes\n"
+" de zero causarão uma falha. Desta forma, você pode impedir\n"
+" operações pull por HTTP ou SSH. Também previne comandos pull, push\n"
+" (de saída) ou bundle locais, embora esta prevenção não seja\n"
+" efetiva, já que os arquivos locais ainda poderão ser copiados.\n"
+" A operação de origem é passada em ``$HG_SOURCE``. Se esta tiver\n"
+" o valor \"serve\", a operação ocorre através de SSH ou HTTP\n"
+" envolvendo um repositório remoto. Se tiver os valores \"push\",\n"
+" \"pull\" ou \"bundle\", a operação lida com um outro repositório\n"
+" no mesmo sistema."
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+"``prepushkey``\n"
+" Executado antes de uma pushkey (como um marcador) ser adicionada ao\n"
+" repositório. Status de saída diferentes de zero farão com que a\n"
+" chave seja rejeitada. O espaço de nomes de chave é passado em\n"
+" ``$HG_NAMESPACE``, a chave é passada em ``$HG_KEY``, o valor antigo\n"
+" (se houver) é passado em ``$HG_OLD``, e o novo valor é passado em\n"
+" ``$HG_NEW``."
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``pretag``\n"
+" Executado antes da criação de uma etiqueta. O status de saída 0\n"
+" permite que a etiqueta seja criada. Status de saída diferentes de 0\n"
+" causarão uma falha do comando. O ID da revisão a ser etiquetada é\n"
+" passado em ``$HG_NODE``. O nome da etiqueta é passado em ``$HG_TAG``.\n"
+" Uma etiqueta local é indicada por ``$HG_LOCAL=1``; uma global, por\n"
+" ``$HG_LOCAL=0``."
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+"``pretxnchangegroup``\n"
+" Executado após um changegroup ser adicionado em uma operação\n"
+" push, pull ou unbundle, mas antes da transação ser completada.\n"
+" O changegroup é visível para o programa do gancho.\n"
+" Isto permite que as novas mudanças sejam validadas antes de serem\n"
+" aceitas. O ID da primeira nova revisão é passado em ``$HG_NODE``.\n"
+" O status de saída 0 permite que a transação seja completada. Status\n"
+" de saída diferentes de 0 farão com que a transação seja desfeita,\n"
+" e a operação push, pull ou unbundle falhará.\n"
+" A URL de origem das revisões é passada em ``$HG_URL``."
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``pretxncommit``\n"
+" Executado após uma revisão ser criada mas antes da transação ser\n"
+" completada. A revisão é visível para o programa do gancho.\n"
+" Isto permite que as novas mudanças e a mensagem de consolidação\n"
+" sejam validadas.\n"
+" O status de saída 0 permite que a transação seja completada. Status\n"
+" de saída diferentes de 0 farão com que a transação seja desfeita.\n"
+" O ID da revisão é passado em ``$HG_NODE``.\n"
+" Os IDs das revisões pais são passados em ``$HG_PARENT1`` e ``$HG_PARENT2``."
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+"``preupdate``\n"
+" Executado antes de uma atualização do diretório de trabalho.\n"
+" O status de saída 0 permitirá a atualização. Status de saída\n"
+" diferentes de 0 impedirão a atualização.\n"
+" O ID de revisão do novo primeiro pai é passado em ``$HG_PARENT1``.\n"
+" No caso de uma mesclagem, o ID do novo segundo pai será passado\n"
+" em ``$HG_PARENT2``."
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+"``listkeys``\n"
+" Executado após listar pushkeys (como marcadores) no repositório.\n"
+" O espaço de nomes de chave é passado em ``$HG_NAMESPACE``.\n"
+" ``$HG_VALUES`` é um dicionário contendo as chaves e valores."
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+"``pushkey``\n"
+" Executado após uma pushkey (como um marcador) ser adicionado ao\n"
+" repositório. O espaço de nomes de chave é passado em ``$HG_NAMESPACE``,\n"
+" a chave é passada em ``$HG_KEY``, o valor antigo (se houver) é passado\n"
+" em ``$HG_OLD``, e o novo valor é passado em ``$HG_NEW``."
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``tag``\n"
+" Executado após a criação de uma etiqueta. O ID da revisão etiquetada é\n"
+" passado em ``$HG_NODE``. O nome da etiqueta é passado em ``$HG_TAG``.\n"
+" Uma etiqueta local é indicada por ``$HG_LOCAL=1``; uma global, por\n"
+" ``$HG_LOCAL=0``."
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+"``update``\n"
+" Executado após uma atualização do diretório de trabalho.\n"
+" O ID de revisão do novo primeiro pai é passado em ``$HG_PARENT1``.\n"
+" No caso de uma mesclagem, o ID do novo segundo pai será passado\n"
+" em ``$HG_PARENT2``. Se a atualização tiver sucesso, ``$HG_ERROR=0``.\n"
+" Se a atualização falhar (por exemplo, por apresentar conflitos não\n"
+" resolvidos), ``$HG_ERROR=1``."
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+".. note:: Em geral é melhor usar ganchos padronizados ao invés dos\n"
+" ganchos genéricos pre- e post- comando, pois é garantido que\n"
+" sejam chamados nos contextos apropriados para influenciar\n"
+" transações.\n"
+" Além disso, ganchos como \"commit\" serão chamados em todos os\n"
+" contextos que gerem uma revisão (a criação de uma etiqueta\n"
+" global, por exemplo), e não apenas no comando commit."
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+".. note:: Variáveis de ambiente com valor vazio podem não ser passadas\n"
+" para os ganchos em certas plataformas, como no Windows. Por exemplo,\n"
+" ``$HG_PARENT2`` terá um valor vazio sob plataformas semelhantes ao\n"
+" Unix para revisões que não sejam mesclagens, mas não estará definida\n"
+" sob Windows."
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr "A sintaxe de ganchos Python é como segue::"
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+"Ganchos Python são executados dentro do processo do Mercurial. Cada\n"
+"gancho é chamado com ao menos três argumentos keyword: um objeto ui\n"
+"(keyword ``ui``), um objeto repositório (keyword ``repo``) e um\n"
+"keyword ``hooktype`` que diz o tipo de gancho usado.\n"
+"Argumentos listados acima como variáveis de ambiente são passados\n"
+"como argumentos keyword, sem o prefixo ``HG_``, e nomes em minúsculas."
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+"Se um gancho Python devolver um valor \"true\" ou lançar uma exceção,\n"
+"isto será tratado como uma falha."
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+"Impressões digitais (\"fingerprints\") dos certificados de servidores\n"
+"HTTPS conhecidos.\n"
+"Uma conexão HTTPS com um servidor com uma impressão digital configurada\n"
+"aqui só terá sucesso se o certificado do servidor bater com a impressão.\n"
+"Isto é bastante similar ao mecanismo \"known hosts\" do ssh.\n"
+"A impressão digital é o valor do hash SHA-1 do certificado codificado\n"
+"em formato DER.\n"
+"A cadeia CA e a opção web.cacerts não são usadas para servidores com\n"
+"impressões digitais configuradas."
+
+msgid "For example::"
+msgstr "Por exemplo::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
+msgstr ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc"
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+"Esta funcionalidade só é suportada nas versões do Python 2.6 ou posteriores."
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+msgstr ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+"Usado para acessar repositórios do Mercurial disponibilizados\n"
+"via web através de um proxy HTTP."
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+"``host``\n"
+" Nome e porta (opcional) do servidor proxy, por exemplo\n"
+" \"myproxy:8000\"."
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+"``no``\n"
+" Opcional. Lista separada por vírgulas de nomes de servidores para\n"
+" os quais o proxy não deva ser usado."
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+"``passwd``\n"
+" Opcional. Senha usada para autenticação no servidor proxy."
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+"``user``\n"
+" Opcional. Nome de usuário usado para autenticação no servidor proxy."
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+"``always``\n"
+" Opcional. Sempre usar o proxy, mesmo para localhost e quaisquer\n"
+" entradas em ``http_proxy.no``. Booleana; o padrão é False."
+
+msgid ""
+"``merge-patterns``\n"
+"------------------"
+msgstr ""
+"``merge-patterns``\n"
+"------------------"
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+"Esta seção especifica ferramentas de mesclagem a serem associados a\n"
+"determinados padrões de arquivo. As ferramentas correspondentes têm\n"
+"prioridade sobre o utilitário padrão de mesclagem. Por padrão, os\n"
+"padrões de arquivo são globs a partir do raiz do repositório."
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+
+msgid ""
+"``merge-tools``\n"
+"---------------"
+msgstr ""
+"``merge-tools``\n"
+"---------------"
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+"Esta seção configura ferramentas de mesclagem externas a serem\n"
+"usadas em mesclagens de arquivo."
+
+msgid "Example ``~/.hgrc``::"
+msgstr "Um exemplo de ``~/.hgrc``::"
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+" [merge-tools]\n"
+" # sobrepõe a localização padrão da ferramenta\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Especifica a linha de comando\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Usa uma prioridade mais alta\n"
+" kdiff3.priority = 1"
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+" # Define uma nova ferramenta\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+"``priority``\n"
+" A prioridade com a qual avaliar esta ferramenta.\n"
+" Padrão: 0."
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+"``executable``\n"
+" Pode ser apenas o nome do executável ou seu caminho completo. No\n"
+" Windows, o caminho pode usar variáveis de ambiente com a sintaxe\n"
+" ${ProgramFiles}.\n"
+" Padrão: o próprio nome da ferramenta."
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+"``args``\n"
+" Os parâmetros passados para o executável da ferramenta. Você pode se\n"
+" referir aos arquivos a serem mesclados bem como ao arquivo de saída\n"
+" usando as seguintes variáveis: ``$base`` (versão base), ``$local``\n"
+" (versão local), ``$other`` (a outra versão), ``$output`` (o arquivo\n"
+" de saída).\n"
+" Padrão: ``$local $base $other``"
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+"``premerge``\n"
+" Tenta executar a ferramenta interna não interativa de mesclagem de\n"
+" 3 vias antes de executar a ferramenta externa. As opções são\n"
+" ``true``, ``false``, ou ``keep`` para deixar marcações no conteúdo\n"
+" do arquivo se o premerge falhar.\n"
+" Padrão: True"
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+"``binary``\n"
+" Esta ferramenta é capaz de mesclar arquivos binários. O padrão é\n"
+" False, a não ser que a ferramenta tenha sido selecionada por\n"
+" correspondência de padrão de arquivo (seção ``[merge-patterns]``)."
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+"``symlink``\n"
+" Esta ferramenta pode mesclar links simbólicos. O padrão é False,\n"
+" mesmo que a ferramenta tenha sido selecionada por\n"
+" correspondência de padrão de arquivo."
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+"``check``\n"
+" Uma lista de opções de verificação de sucesso da mesclagem:"
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+" ``changed``\n"
+" Perguntar se a mesclagem teve sucesso, caso o arquivo mesclado não mostre mudanças.\n"
+" ``conflicts``\n"
+" Verificar a existência de conflitos mesmo que a ferramenta indique sucesso.\n"
+" ``prompt``\n"
+" Sempre perguntar se a mesclagem teve sucesso, sem levar em conta o informado pela ferramenta."
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+"``checkchanged``\n"
+" True equivale a ``check = changed``.\n"
+" Padrão: False"
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+"``checkconflicts``\n"
+" True equivale a ``check = conflicts``.\n"
+" Padrão: False"
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+"``fixeol``\n"
+" Tenta corrigir mudanças de quebras de linha causadas pela ferramenta de mesclagem.\n"
+" Padrão: False"
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+"``gui``\n"
+" Esta ferramenta exige uma interface gráfica para ser executada. Padrão: False"
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+"``regkey``\n"
+" Chave do registro do Windows que descreve a localização de instalação\n"
+" desta ferramenta. O Mercurial procurará por esta chave primeiro sob\n"
+" ``HKEY_CURRENT_USER`` e em seguida sob ``HKEY_LOCAL_MACHINE``.\n"
+" Padrão: Nenhum"
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+"``regkeyalt``\n"
+" Uma chave alternativa de registro do Windows a ser tentada caso a primeira\n"
+" chave não seja encontrada. A chave alternativa usa as mesmas semânticas\n"
+" ``regname`` e ``regappend`` da chave primária.\n"
+" O uso mais comum desta chave é a procura de aplicações 32 bits em\n"
+" sistemas operacionais 64 bits.\n"
+" Padrão: None"
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+"``regname``\n"
+" Nome do valor a ser lido da chave de registro especificada. O padrão é\n"
+" o valor sem nome (padrão)."
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+"``regappend``\n"
+" String a ser anexada ao valor lido do registro, tipicamente o nome\n"
+" do executável da ferramenta.\n"
+" Padrão: None"
+
+msgid ""
+"\n"
+"``patch``\n"
+"---------"
+msgstr ""
+"\n"
+"``patch``\n"
+"---------"
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+"Configurações usadas ao aplicar patches, por exemplo através do\n"
+"comando 'import' ou da extensão Mercurial Queues."
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+"``eol``\n"
+" Se definida como 'strict', quebras de linha do conteúdo do patch\n"
+" e dos arquivos alterados são preservadas. Se definida como ``lf``\n"
+" ou ``crlf``, as quebras de linha de ambos são ignoradas na\n"
+" aplicação do patch, e o resultado é normalizado para LF (Unix) ou\n"
+" CRLF (Windows). Se definida como ``auto``, quebras de linha são\n"
+" novamente ignoradas na aplicação do patch, mas as quebras de\n"
+" linha em arquivos modificados são normalizadas para suas\n"
+" configurações originais, arquivo por arquivo. Se o arquivo de\n"
+" destino não existir ou não tiver quebras de linha, as quebras de\n"
+" linha do patch serão preservadas.\n"
+" Padrão: strict."
+
+msgid ""
+"\n"
+"``paths``\n"
+"---------"
+msgstr ""
+"\n"
+"``paths``\n"
+"---------"
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+"Atribui nomes simbólicos para repositórios. O lado esquerdo é o\n"
+"nome simbólico, e o direito o diretório ou URL onde se localiza o\n"
+"repositório. Caminhos padrão podem ser declarados definindo as\n"
+"seguintes entradas."
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+"``default``\n"
+" Diretório ou URL a ser usado para um pull se a origem não\n"
+" for especificada. Por padrão, é definido como o repositório\n"
+" do qual o repositório local foi clonado."
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+"``default-push``\n"
+" Opcional. Diretório ou URL a ser usado para um push se o destino\n"
+" não for especificado."
+
+msgid ""
+"``phases``\n"
+"----------"
+msgstr ""
+"``phases``\n"
+"----------"
+
+msgid ""
+"Specifies default handling of phases. See :hg:`help phases` for more\n"
+"information about working with phases."
+msgstr ""
+"Especifica o gerenciamento padrão de fases. Veja :hg:`help phases`\n"
+"para mais informações sobre fases."
+
+msgid ""
+"``publish``\n"
+" Controls draft phase behavior when working as a server. When true,\n"
+" pushed changesets are set to public in both client and server and\n"
+" pulled or cloned changesets are set to public in the client.\n"
+" Default: True"
+msgstr ""
+"``publish``\n"
+" Controla o comportamento da fase rascunho em um servidor. Se for\n"
+" True, revisões enviadas usando push se tornam públicas tanto no\n"
+" cliente como no servidor, e revisões recebidas usando pull ou\n"
+" clone se tornam públicas no cliente. O padrão é True."
+
+msgid ""
+"``new-commit``\n"
+" Phase of newly-created commits.\n"
+" Default: draft"
+msgstr ""
+"``new-commit``\n"
+" Fase de revisões criadas usando commit.\n"
+" Padrão: draft (rascunho)"
+
+msgid ""
+"``profiling``\n"
+"-------------"
+msgstr ""
+"``profiling``\n"
+"-------------"
+
+msgid ""
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+"Especifica o tipo, formato e saída de arquivo de profiling.\n"
+"Dois profilers são suportados: um profiler de instrumentação\n"
+"(chamado ``ls``) e um de amostragem (chamado ``stat``)."
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+"Na descrição desta\n"
+"seção, 'dados de profiling' são os dados crus coletados durante o\n"
+"profiling, enquanto 'relatório de profiling' é um relatório estatístico\n"
+"em formato texto gerado a partir dos dados de profiling.\n"
+"O profiling é feito usando lsprof."
+
+msgid ""
+"``type``\n"
+" The type of profiler to use.\n"
+" Default: ls."
+msgstr ""
+"``type``\n"
+" O tipo de profiler a ser usado.\n"
+" Padrão: ls."
+
+msgid ""
+" ``ls``\n"
+" Use Python's built-in instrumenting profiler. This profiler\n"
+" works on all platforms, but each line number it reports is the\n"
+" first line of a function. This restriction makes it difficult to\n"
+" identify the expensive parts of a non-trivial function.\n"
+" ``stat``\n"
+" Use a third-party statistical profiler, statprof. This profiler\n"
+" currently runs only on Unix systems, and is most useful for\n"
+" profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+" ``ls``\n"
+" Usa o profiler de instrumentação embutido no Python. Este profiler\n"
+" funciona em todas as plataformas, mas cada número de linha que ele\n"
+" informa é a primeira linha de uma função. Esta restrição dificulta\n"
+" a identificação de partes caras de funções não triviais.\n"
+" ``stat``\n"
+" Usa o profiler estatístico statprof, fornecido separadamente. No\n"
+" momento este profiler funciona apenas em sistemas Unix, e é mais\n"
+" útil para analisar comandos que rodem por mais de cerca de 0.1\n"
+" segundos."
+
+msgid ""
+"``format``\n"
+" Profiling format. Specific to the ``ls`` instrumenting profiler.\n"
+" Default: text."
+msgstr ""
+"``format``\n"
+" Formato de profiling. Específico para o profiler de\n"
+" instrumentação ``ls``.\n"
+" Padrão: text."
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+" ``text``\n"
+" Gera um relatório de profiling. Nota-se que, ao gravar em um\n"
+" arquivo, apenas o relatório é gravado; os dados de profiling\n"
+" não são mantidos.\n"
+" ``kcachegrind``\n"
+" Formata dados de profiling para uso do kcachegrind: ao salvar\n"
+" para um arquivo, o arquivo gerado pode ser carregado diretamente\n"
+" no kcachegrind."
+
+msgid ""
+"``frequency``\n"
+" Sampling frequency. Specific to the ``stat`` sampling profiler.\n"
+" Default: 1000."
+msgstr ""
+"``frequency``\n"
+" Frequência de amostragem. Específico para o profiler de amostragem\n"
+" ``stat``.\n"
+" Padrão: 1000."
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+"``output``\n"
+" Caminho do arquivo onde dados de profiling devem ser gravados.\n"
+" Se o arquivo existir, será sobrescrito. Padrão: nenhum; os dados\n"
+" são impressos na saída de erros."
+
+msgid ""
+"``revsetalias``\n"
+"---------------"
+msgstr ""
+"``revsetalias``\n"
+"---------------"
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+"Definições de apelidos para revsets. Veja :hg:`help revsets` para\n"
+"mais detalhes."
+
+msgid ""
+"``server``\n"
+"----------"
+msgstr ""
+"``server``\n"
+"----------"
+
+msgid "Controls generic server settings."
+msgstr "Controla configurações genéricas de servidores."
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+"``uncompressed``\n"
+" Permite que clientes clonem um repositório usando o protocolo\n"
+" de streaming não comprimido. Isto transfere cerca de 40% mais\n"
+" dados que um clone comum, mas usa menos memória e CPU tanto no\n"
+" cliente como no servidor. Em uma LAN (100 Mbps ou melhor) ou uma\n"
+" WAN bem rápida, um clone por streaming não comprimido é bem mais\n"
+" rápido (~10x) que um clone comum. Na maior parte de conexões WAN\n"
+" (ou qualquer conexão mais lenta que cerca de 6 Mbps), streaming\n"
+" não comprimido é mais lento, por causa dos dados extras\n"
+" transferidos. Este modo também usará\n"
+" temporariamente o bloqueio de escrita no repositório enquanto\n"
+" forem determinados os dados a serem transmitidos.\n"
+" O padrão é True."
+
+msgid ""
+"``preferuncompressed``\n"
+" When set, clients will try to use the uncompressed streaming\n"
+" protocol. Default is False."
+msgstr ""
+"``preferuncompressed``\n"
+" Se definido, clientes preferirão o protocolo de streaming\n"
+" não comprimido.\n"
+" O padrão é False."
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+"``validate``\n"
+" Verifica se revisões recebidas em um push estão completas, checando\n"
+" se todas as novas revisões de arquivo especificadas em manifestos\n"
+" estão presentes. O padrão é False."
+
+msgid ""
+"``smtp``\n"
+"--------"
+msgstr ""
+"``smtp``\n"
+"--------"
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr "Configurações para extensões que enviam mensagens de email."
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+"``host``\n"
+" Nome do servidor de emails, como em \"mail.example.com\"."
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+"``port``\n"
+" Opcional. Porta usada pelo servidor de emails. Padrão: 25."
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+"``tls``\n"
+" Opcional. Método para habilitar TLS ao conectar com o servidor de\n"
+" emails: starttls, smtps ou none. Padrão: none."
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+"``username``\n"
+" Opcional. Nome de usuário usado para autenticação no servidor\n"
+" de emails. Padrão: none."
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+"``password``\n"
+" Opcional. Senha usada para autenticação no servidor de emails.\n"
+" Se não for especificada, sessões interativas consultarão o\n"
+" usuário para que ele forneça a senha; sessões não interativas\n"
+" falharão. Padrão: none."
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+"``local_hostname``\n"
+" Opcional. É o nome de servidor que o remetente pode usar para se\n"
+" identificar para o MTA."
+
+msgid ""
+"\n"
+"``subpaths``\n"
+"------------"
+msgstr ""
+"\n"
+"``subpaths``\n"
+"------------"
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+"URLs de origem de sub-repositórios podem se tornar obsoletas se\n"
+"um servidor remoto mudar de nome ou se tornar indisponível. Esta\n"
+"seção possibilita a definição de regras de reescrita com a forma::"
+
+msgid " <pattern> = <replacement>"
+msgstr " <padrão> = <substituição>"
+
+msgid ""
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+"Onde ``padrão`` é uma expressão regular comparada com uma URL de\n"
+"sub-repositório original e ``substituição`` é o texto a ser usado\n"
+"para reescrevê-la. Grupos podem ser usados em ``padrão`` e\n"
+"referenciados em ``substituição``. Por exemplo::"
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr " http://server/(.*)-hg/ = http://hg.server/\\1/"
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr "reescreve ``http://server/foo-hg/`` como ``http://hg.server/foo/``."
+
+msgid ""
+"Relative subrepository paths are first made absolute, and the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+"Caminhos relativos para sub-repositórios são primeiramente tornados\n"
+"absolutos, e em seguida as regras de reescrita são aplicadas no\n"
+"caminho absoluto completo. As regras são aplicadas na ordem de definição."
+
+msgid ""
+"``trusted``\n"
+"-----------"
+msgstr ""
+"``trusted``\n"
+"-----------"
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+"O Mercurial não usará as configurações no arquivo ``.hg/hgrc`` de um\n"
+"repositório se ele não pertencer a um usuário ou a um grupo confiável,\n"
+"pois diversas funcionalidades do arquivo de configuração possibilitam\n"
+"a execução de comandos arbitrários.\n"
+"Esta questão é por vezes encontrada ao configurar ganchos ou extensões\n"
+"em repositórios compartilhados ou servidores. Entretanto,\n"
+"a interface web usará algumas definições seguras da seção ``[web]``."
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+"Esta seção especifica quais usuários e grupos são confiáveis. O\n"
+"usuário atual é sempre confiável. Para confiar em todos os usuários,\n"
+"liste um usuário ou grupo de nome ``*``. Para terem efeito, estas\n"
+"configurações devem ser colocadas em um arquivo\n"
+"*que já seja confiável*, como ``$HOME/.hgrc`` do usuário ou serviço\n"
+"que executa o Mercurial."
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+"``users``\n"
+" Lista separada por vírgulas de usuários confiáveis."
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+"``groups``\n"
+" Lista separada por vírgulas de grupos confiáveis."
+
+msgid ""
+"\n"
+"``ui``\n"
+"------"
+msgstr ""
+"\n"
+"``ui``\n"
+"------"
+
+msgid "User interface controls."
+msgstr "Controles de interface com o usuário."
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+"``archivemeta``\n"
+" Determina se o arquivo .hg_archival.txt contendo metadados (hashes\n"
+" do repositório base e da tip) em pacotes criados pelo comando\n"
+" :hg:`archive` ou baixados via hgweb.\n"
+" O padrão é True."
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+"``askusername``\n"
+" Determina se o usuário deve ser consultado interativamente para\n"
+" fornecer um nome de usuário ao consolidar uma revisão. Se for True,\n"
+" e nem ``$HGUSER`` nem ``$EMAIL`` estiverem definidas, o usuário\n"
+" será consultado para fornecer um nome. Se nenhum nome for passado,\n"
+" o padrão ``USER@HOST`` será usado.\n"
+" O padrão é False."
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+"``commitsubrepos``\n"
+" Determina se sub-repositórios modificados serão automaticamente\n"
+" consolidados ao consolidar o repositório pai. Se for False e\n"
+" algum sub-repositório tiver mudanças não consolidadas, aborta a\n"
+" consolidação do repositório pai.\n"
+" O padrão é False."
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+"``debug``\n"
+" Imprime informações de depuração. Booleana; o padrão é False."
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+"``editor``\n"
+" O editor usado durante um commit. O padrão é ``$EDITOR`` ou ``vi``."
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+"``fallbackencoding``\n"
+" Codificação a ser tentada se não for possível decodificar o\n"
+" changelog usando UTF-8. O padrão é ISO-8859-1."
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+"``ignore``\n"
+" Um arquivo contendo listas de padrões de arquivos a serem ignorados\n"
+" para o usuário. Este arquivo deve estar no mesmo formato de um\n"
+" arquivo .hgignore de um repositório. Esta opção suporta sintaxe\n"
+" semelhante a ganchos, de modo que múltiplos arquivos hgignore podem\n"
+" ser especificados de modo semelhante a\n"
+" ``ignore.other = ~/.hgignore2``. Para detalhes do formato de arquivo\n"
+" hgignore, veja a página de manual ``hgignore(5)``."
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+"``interactive``\n"
+" Permite que o usuário seja consultado interativamente.\n"
+" Booleana; o padrão é True."
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+"``logtemplate``\n"
+" String de modelo para comandos que imprimem revisões."
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+"``merge``\n"
+" O programa de resolução de conflitos a ser usado durante uma\n"
+" mesclagem manual. Para mais informações sobre ferramentas de\n"
+" mesclagem, veja :hg:`help merge-tools`.\n"
+" Para configurar ferramentas de mesclagem, veja a seção\n"
+" ``[merge-tools]``."
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+"``portablefilenames``\n"
+" Verifica a portabilidade de nomes de arquivos. Pode ser ``warn``\n"
+" (avisar), ``ignore`` (ignorar) ou ``abort`` (abortar).\n"
+" O padrão é ``warn``.\n"
+" Com o valor ``warn`` (ou ``true``), uma mensagem de aviso será\n"
+" impressa em plataformas POSIX se um arquivo com um nome não\n"
+" portável for adicionado (por exemplo, um arquivo com um nome que\n"
+" não pode ser criado em Windows por conter partes reservadas (como\n"
+" ``AUX``), caracteres reservados (como ``:``) ou que causaria uma\n"
+" colisão de maiúsculas e minúsculas com um arquivo existente).\n"
+" Com o valor ``ignore`` (ou ``false``), nenhum aviso é emitido.\n"
+" Com o valor ``abort``, o comando é abortado.\n"
+" No Windows, esta configuração é ignorada, e o comando é sempre\n"
+" abortado."
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+"``quiet``\n"
+" Reduz a quantidade de saída impressa. Booleana; o padrão é False."
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+"``remotecmd``\n"
+" Comando remoto a ser usado para operações clone/push/pull.\n"
+" O padrão é ``hg``."
+
+msgid ""
+"``reportoldssl``\n"
+" Warn if an SSL certificate is unable to be due to using Python\n"
+" 2.5 or earlier. True or False. Default is True."
+msgstr ""
+"``reportoldssl``\n"
+" Avisa se um certificado SSL não puder ser usado por falta de\n"
+" suporte nas versões do Pyton 2.5 ou anteriores. True ou False.\n"
+" O padrão é True."
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+"``report_untrusted``\n"
+" Avisa se um arquivo ``.hg/hgrc`` for ignorado por não pertencer a um\n"
+" usuário ou grupo confiável (veja a seção ``[trusted]``).\n"
+" Booleana; o padrão é True."
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+"``slash``\n"
+" Exibe caminhos usando uma barra ``/`` como separador de caminhos.\n"
+" Isto faz diferença apenas em sistemas nos quais o separador de\n"
+" caminhos padrão não for esse caractere (por exemplo, o Windows\n"
+" usa a barra invertida (``\\``)).\n"
+" O padrão é False."
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+"``ssh``\n"
+" comando a ser usado para conexões SSH. O padrão é ``ssh``."
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+"``strict``\n"
+" Exige nomes de comando exatos, ao invés de permitir abreviações\n"
+" não ambíguas. Booleana; o padrão é False."
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+"``style``\n"
+" Nome do estilo usado para saída de comandos."
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+"``timeout``\n"
+" O tempo limite de espera (em segundos) para a obtenção de locks;\n"
+" um valor negativo desabilita o limite. O padrão é 600."
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+"``traceback``\n"
+" O Mercurial sempre imprime um traceback quando ocorre uma exceção\n"
+" desconhecida. Definir isto para o valor True fará com que um\n"
+" traceback seja impresso em todas as exceções, mesmo que sejam\n"
+" reconhecidas pelo Mercurial (como IOError ou MemoryError).\n"
+" O padrão é False."
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+"``username``\n"
+" O autor de uma revisão criada ao executar \"commit\".\n"
+" Tipicamente, é o nome de uma pessoa seguido de seu endereço de\n"
+" email, como em ``Fred Widget <fred@example.com>``.\n"
+" O padrão é ``$EMAIL`` ou ``username@hostname``.\n"
+" Se o nome de usuário em um arquivo de configuração estiver vazio, ele\n"
+" deve ser especificado manualmente ou em um arquivo de configuração\n"
+" diferente (por exemplo, ``$HOME/.hgrc``, se o administrador definir\n"
+" ``username =`` no arquivo de configuração de sistema).\n"
+" Variáveis de ambiente são expandidas no nome de usuário."
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+"``verbose``\n"
+" Aumenta a quantidade de saída impressa. Booleana; o padrão é False."
+
+msgid ""
+"\n"
+"``web``\n"
+"-------"
+msgstr ""
+"\n"
+"``web``\n"
+"-------"
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+"Configurações para a interface web. As opções desta seção se aplicam\n"
+"tanto ao servidor web interno (iniciado por :hg:`serve`) como ao\n"
+"script executado através de um servidor web separado (``hgweb.cgi``\n"
+"e derivados para FastCGI e WSGI)."
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+"O servidor web interno do Mercurial não faz autenticação (ele não\n"
+"consulta por nomes de usuários e senhas para validar *quem* são\n"
+"os usuários), mas faz autorização (aceita ou nega o acesso de\n"
+"*usuários autenticados* baseado em definições desta seção).\n"
+"Você deve ou configurar seu servidor web para fazer autenticação,\n"
+"ou desabilitar as verificações de autorização."
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+"Para uma configuração rápida em um ambiente completamente confiável,\n"
+"por exemplo uma LAN privada, na qual você deseja aceitar operações\n"
+"push de qualquer um, você pode usar a seguinte linha de comando::"
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+"Note que isto permitirá que qualquer um envie qualquer coisa para o\n"
+"servidor, e que isto não deve ser usado em servidores públicos."
+
+msgid "The full set of options is:"
+msgstr "As opções são:"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+"``accesslog``\n"
+" Onde escrever o log de acesso. O padrão é a saída padrão (stdout)."
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+"``address``\n"
+" Endereço de interface para fazer o bind. Por padrão, usa todos\n"
+" os endereços."
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+"``allow_archive``\n"
+" Lista de formatos de pacote (bz2, gz, zip) permitidos para download.\n"
+" O padrão é nenhum (lista vazia)."
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowbz2``\n"
+" (OBSOLETA) Determina se revisões estarão disponíveis para download\n"
+" em formato .tar.bz2.\n"
+" O padrão é False."
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowgz``\n"
+" (OBSOLETA) Determina se revisões estarão disponíveis para download\n"
+" em formato .tar.gz.\n"
+" O padrão é False."
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+"``allowpull``\n"
+" Se este repositório pode fornecer revisões em uma operação pull.\n"
+" O padrão é True."
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+"``allow_push``\n"
+" Se este repositório pode receber revisões em uma operação push.\n"
+" Se vazio ou não definido, o push não é permitido. Com o valor\n"
+" especial ``*``, qualquer usuário remoto poderá fazer push,\n"
+" incluindo usuários não autenticados. Caso contrário, o\n"
+" conteúdo desta opção será uma lista de usuários. Se o usuário\n"
+" remoto estiver autenticado, e se o nome do usuário remoto estiver\n"
+" presente nesta lista, o push será autorizado. O conteúdo da lista\n"
+" allow_push é examinado após a lista deny_push."
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+"``guessmime``\n"
+" Controla tipos MIME para download inalterado do conteúdo de\n"
+" arquivos. Use True para permitir que o hgweb determine o tipo de\n"
+" conteúdo a partir da extensão do arquivo. Isto servirá arquivos\n"
+" HTML como ``text/html``, e portanto pode permitir ataques de\n"
+" cross-site scripting (XSS) ao servir repositórios não confiáveis.\n"
+" O padrão é False."
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+"``allow_read``\n"
+" Se o usuário já não tiver seu acesso ao repositório negado pelo\n"
+" conteúdo de deny_read, esta lista determinará se o usuário poderá\n"
+" acessar o repositório. Se esta lista não estiver vazia, e se o\n"
+" usuário não estiver autenticado ou não estiver presente nesta lista,\n"
+" o acesso será negado. Se esta lista estiver vazia ou não definida,\n"
+" o acesso por padrão é permitido para todos os usuários. Definir\n"
+" allow_read com o valor especial ``*`` é equivalente a deixá-la\n"
+" sem definição (ou seja, o acesso é permitido para todos os\n"
+" usuários). O conteúdo da lista allow_read é examinado após a lista\n"
+" deny_read."
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+"``allowzip``\n"
+" (OBSOLETA) Determina se revisões estarão disponíveis para download\n"
+" em formato .zip.\n"
+" O padrão é False."
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+"``baseurl``\n"
+" URL base usada ao publicar URLs em outros locais, para que\n"
+" ferramentas de terceiros (notificações por email, por exemplo)\n"
+" possam construir URLs. Exemplo: ``http://hgserver/repos/``."
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates."
+msgstr ""
+"``cacerts``\n"
+" Caminho para um arquivo contendo uma lista de certificados de\n"
+" autoridades certificadoras em formato PEM. Variáveis de ambiente\n"
+" e construções ``~user`` são expandidas no nome de arquivo. Se\n"
+" especificada no cliente, o Mercurial irá verificar a identidade\n"
+" de servidores HTTPS remotos usando estes certificados."
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+" Esta funcionalidade só é suportada em versões do Python 2.6 ou\n"
+" posteriores. Se você quiser usá-la em versões anteriores do Python,\n"
+" a versão da biblioteca ssl readaptada para versões antigas do Python\n"
+" disponível em ``http://pypi.python.org``."
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+" Para temporariamente desabilitar a verificação SSL, especifique\n"
+" ``--insecure`` (inseguro) na linha de comando."
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has\n"
+" one. On most Linux systems this will be\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+" generate this file manually. The form must be as follows::"
+msgstr ""
+" Você pode usar o arquivo de certificado CA do OpenSSL se sua\n"
+" plataforma tiver um. Em muitos sistemas Linux, será o arquivo\n"
+" ``/etc/ssl/certs/ca-certificates.crt``.\n"
+" De outro modo, você terá que gerar esse arquivo manualmente.\n"
+" A forma deve ser a seguinte::"
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificado em codificação PEM base64) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificado em codificação PEM base64) ...\n"
+" -----END CERTIFICATE-----"
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+"``cache``\n"
+" Habilita suporte a cache na interface hgweb. O padrão é True."
+
+msgid ""
+"``collapse``\n"
+" With ``descend`` enabled, repositories in subdirectories are shown at\n"
+" a single level alongside repositories in the current path. With\n"
+" ``collapse`` also enabled, repositories residing at a deeper level than\n"
+" the current path are grouped behind navigable directory entries that\n"
+" lead to the locations of these repositories. In effect, this setting\n"
+" collapses each collection of repositories found within a subdirectory\n"
+" into a single entry for that subdirectory. Default is False."
+msgstr ""
+"``collapse``\n"
+" Com ``descend`` habilitado, repositórios em subdiretórios são\n"
+" exibidos em um único nível junto com repositórios no caminho\n"
+" atual. Com ``collapse`` também habilitado, repositórios que\n"
+" residam em um nível mais profundo que o caminho atual são\n"
+" agrupados atrás de entradas de diretório navegáveis que levam\n"
+" às localizações desses repositórios. Ou seja, esta\n"
+" configuração colapsa cada coleção de repositórios encontrada\n"
+" em um subdiretório em uma única entrada para esse\n"
+" subdiretório. O padrão é False."
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+"``contact``\n"
+" Nome ou endereço de email da pessoa responsável pelo repositório.\n"
+" O padrão é ui.username ou ``$EMAIL``, ou \"unknown\" se vazia ou\n"
+" não definida."
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+"``deny_push``\n"
+" Determina se operações push que têm como destino este repositório\n"
+" devem ser recusadas. Se vazio ou não definido, o push não é\n"
+" recusado. Com o valor especial ``*``, nenhum usuário remoto\n"
+" poderá fazer push. Caso contrário, o conteúdo desta opção será\n"
+" uma lista de usuários, e todos os usuários autenticados presentes\n"
+" nesta lista, bem como todos os usuários não autenticados, serão\n"
+" recusados. O conteúdo da lista deny_push é examinado antes da\n"
+" lista allow_push."
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+"``deny_read``\n"
+" Determina se o acesso de leitura e visualização deve ser recusado.\n"
+" Se esta lista não estiver vazia, todos os usuário não autenticados\n"
+" serão recusados, bem como os usuários autenticados presentes nesta\n"
+" lista. Se estiver definida com o valor especial ``*``, todos os\n"
+" usuários remotos são recusados (raramente necessária ;). Se\n"
+" deny_read estiver vazia ou não definida, a determinação do acesso\n"
+" remoto depende da presença e conteúdo da lista allow_read (veja\n"
+" sua descrição). Se tanto deny_read como allow_read estiverem\n"
+" vazias ou não definidas, o acesso é por padrão permitido para\n"
+" todos os usuários.\n"
+" Se o repositório estiver sendo servido via hgwebdir, usuários\n"
+" recusados não verão este repositório na lista de repositórios.\n"
+" O conteúdo da lista deny_read é examinado antes (ou seja, tem\n"
+" prioridade sobre) o conteúdo da lista allow_read."
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only repositories\n"
+" directly in the current path will be shown (other repositories are still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+"``descend``\n"
+" Booleana. Com o valor False, índices do hgwebdir não irão entrar em\n"
+" subdiretórios recursivamente. Apenas repositórios diretamente no\n"
+" caminho atual serão mostrados (outros repositórios ainda ficam\n"
+" disponíveis a partir do índice correspondente ao caminho que os\n"
+" contém). O padrão é True."
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+"``description``\n"
+" Descrição textual do propósito ou conteúdo do repositório. O\n"
+" padrão é \"unknown\" (desconhecido)."
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+"``encoding``\n"
+" Nome da codificação de caracteres. O padrão é o conjunto de\n"
+" caracteres atual de acordo com o locale. Exemplo: \"UTF-8\""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+"``errorlog``\n"
+" Onde escrever o log de erros. O padrão é a saída de erros (stderr)."
+
+msgid ""
+"``comparisoncontext``\n"
+" Number of lines of context to show in side-by-side file comparison. If\n"
+" negative or the value ``full``, whole files are shown. Default is 5.\n"
+" This setting can be overridden by a ``context`` request parameter to the\n"
+" ``comparison`` command, taking the same values."
+msgstr ""
+"``comparisoncontext``\n"
+" Número de linhas de contexto a serem exibidas em comparações lado a\n"
+" lado. Se negativo, ou com o valor ``full``, serão exibidos arquivos\n"
+" completos. O padrão é 5.\n"
+" Esta configuração pode ser redefinida por um parâmetro ``context`` do\n"
+" pedido para o comando ``comparison``, recebendo os mesmos valores."
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+"``hidden``\n"
+" Determina se o repositório não deve aparecer na índice do hgwebdir.\n"
+" O padrão é False (ou seja, mostrar o repositório)."
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+"``ipv6``\n"
+" Determina se IPv6 deve ser usado. O padrão é False."
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+"``logoimg``\n"
+" Nome do arquivo contendo a imagem de logotipo que alguns modelos\n"
+" exibem em cada página. O nome de arquivo é relativo a ``staticurl``.\n"
+" Isto é, o caminho completo para a imagem de logo é\n"
+" \"staticurl/logoimg\".\n"
+" Se não definido, ``hglogo.png`` será usado."
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+"``logourl``\n"
+" URL base para usar em logos. Se não estiver definida,\n"
+" ``http://mercurial.selenic.com/`` será usada."
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+"``name``\n"
+" Nome do repositório a ser usado na interface web. Por padrão é\n"
+" o nome do diretório de trabalho."
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+"``maxchanges``\n"
+" Número máximo de mudanças listadas no changelog. O padrão é 10."
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+"``maxfiles``\n"
+" Numero máximo de arquivos listados por revisão. O padrão é 10."
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+" Porta na qual escutar. O padrão é 8000."
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+"``prefix``\n"
+" Prefixo dos caminhos a serem servidos. O padrão é '' (que\n"
+" corresponde à raiz do servidor)."
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+"``push_ssl``\n"
+" Determina se SSL será exigido para o recebimento de revisões em\n"
+" um push, para prevenir o vazamento de senhas. O padrão é True."
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+"``staticurl``\n"
+" URL base para servir arquivos estáticos. Se não estiver definida,\n"
+" arquivos estáticos (por exemplo, o favicon hgicon.png) serão\n"
+" servidos pelo próprio script CGI. Use esta configuração para\n"
+" servi-los diretamente pelo servidor HTTP externo.\n"
+" Exemplo: ``http://hgserver/static/``."
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+"``stripes``\n"
+" Quantas linhas uma \"listra de zebra\" deve ocupar em saídas com\n"
+" múltiplas linhas. O padrão é 1; use 0 para desabilitar."
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+"``style``\n"
+" Estilo a ser usado para exibição."
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+"``templates``\n"
+" Onde modelos HTML são encontrados. O padrão é o caminho de instalação.\n"
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "Alguns comandos permitem ao usuário especificar uma data, como:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: Especificar a data de consolidação.\n"
+"- log, revert, update: Selecionar revisões por data."
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "Muitos formatos de data são válidos. Eis alguns exemplos:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (assumido fuso horário local)\n"
+"- ``Dec 6 13:18 -0600`` (ano atual, defasagem de horário local fornecida)\n"
+"- ``Dec 6 13:18 UTC`` (UTC e GMT são apelidos para +0000)\n"
+"- ``Dec 6`` (meia noite)\n"
+"- ``13:18`` (assume a data atual)\n"
+"- ``3:39`` (assume 3:39AM)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (formato ISO 8601)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "E por fim, há um formato interno do Mercurial:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"Este é o formato interno de representação de datas. O primeiro número é\n"
+"o número de segundos desde a epoch (1970-01-01 00:00 UTC). O segundo\n"
+"é a defasagem do fuso horário local, em segundos a oeste de UTC\n"
+"(negativo para fusos horários a leste de UTC)."
+
+msgid "The log command also accepts date ranges:"
+msgstr "O comando log também aceita intervalos de data:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+"- ``<DATA`` - na data fornecida, ou anterior\n"
+"- ``>DATA`` - na data fornecida, ou posterior\n"
+"- ``DATA to DATA`` - um intervalo de data, incluindo os extremos\n"
+"- ``-DIAS`` - dentro de um certo número de dias contados de hoje\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+"O formato padrão do Mercurial para exibir mudanças entre duas\n"
+"versões de um arquivo é compatível com o formato unified do GNU\n"
+"diff, que pode ser usado pelo GNU patch e muitos outros\n"
+"utilitários padrão."
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+"Apesar de esse formato padrão ser muitas vezes suficiente, ele\n"
+"não codifica as seguintes informações:"
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+"- bits de execução e permissão\n"
+"- informação de cópia ou renomeação\n"
+"- mudanças em arquivos binários\n"
+"- criação ou remoção de arquivos vazios"
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+"O Mercurial também suporta o formato diff estendido do VCS git\n"
+"que trata dessas limitações. O formato git diff não é\n"
+"produzido por padrão porque há muito poucas ferramentas que\n"
+"entendem esse formato."
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+"Isso quer dizer que ao gerar diffs de um repositório do Mercurial\n"
+"(por exemplo, com :hg:`export`), você deve tomar cuidado com por\n"
+"exemplo cópias e renomeações de arquivos ou outras coisas\n"
+"mencionadas acima, porque essa informação extra é perdida ao\n"
+"aplicar um diff padrão em um outro repositório. As operações\n"
+"internas do Mercurial (como push e pull) não são afetadas por\n"
+"isso, porque usam um formato binário interno para comunicar\n"
+"mudanças."
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+"Para fazer com que o Mercurial produza o formato estendido git\n"
+"diff, use a opção --git disponível para vários comandos, ou\n"
+"defina 'git = True' na seção [diff] de seu arquivo de configuração.\n"
+"Você não precisa definir essa opção para importar diffs nesse formato,\n"
+"nem para usá-lo com a extensão mq.\n"
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+"HG\n"
+" Caminho para o executável 'hg', automaticamente passado na\n"
+" execução de ganchos, extensões ou ferramentas externas. Se não\n"
+" definido ou vazio, um executável chamado 'hg' (com a extensão\n"
+" com/exe/bat/cmd no Windows) é procurado."
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+"HGEDITOR\n"
+" Este é o nome do editor usado em consolidações. Veja EDITOR."
+
+msgid " (deprecated, use configuration file)"
+msgstr " (obsoleto, use o arquivo de configuração)"
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+"HGENCODING\n"
+" É usado no lugar da configuração padrão de locale detectada\n"
+" pelo Mercurial. Essa configuração é usada para converter dados\n"
+" como nomes de usuário, descrições de revisões, nomes de\n"
+" etiqueta e ramos. Essa configuração pode ser sobreposta com a\n"
+" opção --encoding na linha de comando."
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+"HGENCODINGMODE\n"
+" Essa configuração ajusta o comportamento do Mercurial no\n"
+" tratamento de caracteres desconhecidos, ao codificar entradas do\n"
+" usuário. O padrão é \"strict\", o que faz com que o Mercurial\n"
+" aborte se ele não puder traduzir um caractere. Outros valores\n"
+" incluem \"replace\", que substitui caracteres desconhecidos, e\n"
+" \"ignore\", que os descarta. Essa configuração pode ser\n"
+" sobreposta com a opção --encodingmode na linha de comando."
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+"HGENCODINGAMBIGUOUS\n"
+" Define o comportamento do Mercurial ao lidar com caracteres\n"
+" com larguras \"ambíguas\" como caracteres latinos acentuados\n"
+" com fontes da Ãsia Oriental. Por padrão, o Mercurial assume\n"
+" que caracteres ambíguos são \"narrow\" (estreitos); defina\n"
+" esta variável para \"wide\" (largos) se tais caracteres\n"
+" causarem problemas de formatação."
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+"HGMERGE\n"
+" Um executável a ser usado para resolver conflitos de mesclagem.\n"
+" O programa será executado com três argumentos: arquivo local,\n"
+" arquivo remoto, arquivo ancestral."
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+"HGRCPATH\n"
+" Uma lista de arquivos ou diretórios onde procurar por arquivos de\n"
+" configuração. O separador de itens é \":\" em Unix, \";\" no\n"
+" Windows. Se HGRCPATH não estiver definido, o caminho de busca padrão\n"
+" da plataforma será usado. Se vazio, será lido apenas o .hg/hgrc no\n"
+" repositório atual."
+
+msgid " For each element in HGRCPATH:"
+msgstr " Para cada elemento em HGRCPATH:"
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+" - se for um diretório, todos os arquivos nesse diretório\n"
+" terminados por \".rc\" serão adicionados\n"
+" - caso contrário, o próprio arquivo será adicionado"
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+"HGPLAIN\n"
+" Se definido, desabilita qualquer opção de configuração que possa mudar\n"
+" a saída padrão do Mercurial. Isto inclui codificação, seção defaults,\n"
+" modo verboso, modo debug, modo silencioso, adições de tracebacks\n"
+" e localização. Isto pode ser útil para a inclusão do Mercurial em\n"
+" scripts para compensar mudanças de configuração feitas pelo usuário."
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+" Opções equivalentes definidas pela linha de comando ou variáveis de\n"
+" ambiente não serão sobrepostas."
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+"HGPLAINEXCEPT\n"
+" Esta é uma lista separada por vírgulas de funcionalidades a serem\n"
+" preservadas quando HGPLAIN estiver habilitada. No momento, o único\n"
+" valor suportado é \"i18n\", que preserva internacionalização em\n"
+" modo plain."
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+" Definir HGPLAINEXCEPT para qualquer valor (mesmo uma string vazia)\n"
+" habilitará o modo plain."
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+"HGUSER\n"
+" Esta é a string usada para o autor de uma consolidação.\n"
+" Se não for definida, valores disponíveis serão considerados na\n"
+" seguinte ordem:"
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+" - HGUSER (obsoleto)\n"
+" - arquivos de configuração no HGRCPATH\n"
+" - EMAIL\n"
+" - consulta interativa\n"
+" - LOGNAME (com ``@hostname`` anexado)"
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"EMAIL\n"
+" Pode ser usado como autor de consolidações; veja HGUSER."
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"LOGNAME\n"
+" Pode ser usado como autor de consolidações; veja HGUSER."
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+"VISUAL\n"
+" Este é o nome do editor a ser usado em consolidações. Veja\n"
+" EDITOR."
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+"EDITOR\n"
+" Algumas vezes o Mercurial precisa abrir em um editor um arquivo\n"
+" texto para ser modificado por um usuário, por exemplo ao escrever\n"
+" mensagens de consolidação. O editor usado é determinado pela\n"
+" consulta às variáveis de ambiente HGEDITOR, VISUAL e EDITOR,\n"
+" nessa ordem. O primeiro valor não vazio é escolhido. Se todos\n"
+" estiverem vazios, o editor será o 'vi'."
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+"PYTHONPATH\n"
+" Isto é usado pelo Python para localizar módulos importados, e\n"
+" pode precisar ser ajustado apropriadamente se o Mercurial não\n"
+" estiver instalado para o sistema todo.\n"
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"O Mercurial possui um mecanismo para adicionar novas\n"
+"funcionalidades através do uso de extensões. Extensões podem\n"
+"adicionar novos comandos, adicionar novas opções a comandos\n"
+"existentes ou implementar ganchos."
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"Extensões não são carregadas por padrão por diversas razões:\n"
+"elas podem aumentar o tempo de início ou execução; podem ser\n"
+"destinadas apenas a uso avançado; podem fornecer funcionalidade\n"
+"potencialmente perigosa (por exemplo, modificar ou destruir o\n"
+"histórico); podem ainda não estar prontas para uso geral; ou\n"
+"podem alterar o comportamento padrão do Mercurial. Cabe ao\n"
+"usuário ativar extensões como desejar."
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"Para habilitar a extensão \"foo\", tanto se for distribuída com\n"
+"o Mercurial como estiver no caminho de busca do Python, crie uma\n"
+"entrada para ela em seu arquivo de configuração, da seguinte forma::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr ""
+"Você também pode especificar o caminho completo para uma\n"
+"extensão::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"Para desabilitar explicitamente uma extensão habilitada em um\n"
+"arquivo de configuração de escopo mais amplo, prefixe seu caminho com !::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # desabilita a extensão bar localizada em\n"
+" # /caminho/para/extensao/bar.py\n"
+" bar = !/caminho/para/extensao/bar.py\n"
+" # o mesmo, se um caminho não foi fornecido para a\n"
+" # extensão baz\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr ""
+"O Mercurial suporta uma linguagem funcional para selecionar um conjunto\n"
+"de arquivos."
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+"Como outros padrões de arquivo, este tipo de padrão é indicado\n"
+"por um prefixo, 'set:'. A linguagem suporta vários predicados\n"
+"associados por operadores infixos. Parênteses podem ser usados\n"
+"para agrupamento."
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+"Identificadores, tais como nomes de arquivo ou padrões, devem ser\n"
+"passados entre aspas simples ou duplas se contiverem caracteres\n"
+"fora do conjunto ``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` ou se forem\n"
+"iguais a um dos predicados pré-definidos. Isto geralmente se\n"
+"aplica a padrões de arquivo diferentes de glob e argumentos para\n"
+"predicados."
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+"Dentro de identificadores protegidos por aspas, caracteres\n"
+"especiais podem ser especificados usando escapes; por exemplo,\n"
+"``\\n`` é interpretado como uma quebra de linha. Para evitar\n"
+"que eles sejam interpretados dessa maneira, strings podem ser\n"
+"prefixadas por ``r``, como em ``r'...'``."
+
+msgid "There is a single prefix operator:"
+msgstr "Há um único operador prefixo:"
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Arquivos que não estejam em x. A forma curta é ``! x``."
+
+msgid "These are the supported infix operators:"
+msgstr "Estes são os operadores infixos suportados:"
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" A intersecção dos arquivos em x e y. A forma curta é ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" A união dos arquivos em x e y. Há duas formas curtas alternativas:\n"
+" ``x | y`` e ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Arquivos em x mas não em y."
+
+msgid "The following predicates are supported:"
+msgstr "Os seguintes predicados são suportados:"
+
+msgid ".. predicatesmarker"
+msgstr ".. predicatesmarker"
+
+msgid "Some sample queries:"
+msgstr "Alguns exemplos de consultas:"
+
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr ""
+"- Exibe o status de arquivos que parecem ser binários no diretório\n"
+"de trabalho::"
+
+msgid " hg status -A \"set:binary()\""
+msgstr " hg status -A \"set:binary()\""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr "- Esquece arquivos especificados por .hgignore mas já rastreados::"
+
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr " hg forget \"set:hgignore() and not ignored()\""
+
+msgid "- Find text files that contain a string::"
+msgstr "- Encontra arquivos texto que contém uma string::"
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr " hg locate \"set:grep(magic) and not binary()\""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr "- Encontra arquivos C em uma codificação não padrão::"
+
+msgid " hg locate \"set:**.c and not encoding('UTF-8')\""
+msgstr " hg locate \"set:**.c and not encoding('UTF-8')\""
+
+msgid "- Revert copies of large binary files::"
+msgstr "- Reverte cópias de arquivos binários grandes::"
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr " hg revert \"set:copied() and binary() and size('>1M')\""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr "- Remove arquivos listados em foo.lst que contêm as letras a ou b::"
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr "Veja também :hg:`help patterns`.\n"
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+"Ancestor\n"
+" Ancestral. Qualquer revisão que possa ser alcançada por uma cadeia\n"
+" contínua de revisões pais a partir de uma revisão dada. Mais\n"
+" precisamente, os ancestrais de uma revisão podem ser definidos por\n"
+" duas propriedades: um pai de uma revisão é um ancestral, e um pai\n"
+" de um ancestral é um ancestral. Veja também: 'Descendant'."
+
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+"Bookmark\n"
+" Marcador. Marcadores são ponteiros para certas consolidações que\n"
+" se movem quando novas consolidações forem feitas. Assim como\n"
+" etiquetas, nomes de marcadores podem ser usados em todos os lugares\n"
+" onde o Mercurial espera um ID de revisão, por exemplo em\n"
+" :hg:`update`. Ao contrário de etiquetas, marcadores se movem\n"
+" automaticamente quando é feita uma consolidação."
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+" Marcadores podem ser renomeados, copiados e apagados. Marcadores\n"
+" são locais, a não ser que sejam explicitamente enviados para ou\n"
+" trazidos de um repositório remoto. O envio (usando :hg:`push`) e\n"
+" o recebimento (usando :hg:`pull`) de marcadores permite a\n"
+" colaboração com outros usuários em um ramo sem a criação de\n"
+" um ramo nomeado."
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+"Branch\n"
+" (Nome) Ramo. Uma revisão filha que foi criada a partir de um pai que\n"
+" não seja uma cabeça. Estes são conhecidos como ramos topológicos; veja\n"
+" 'Branch, topological'. Se um ramo topológico tiver um nome, ele pode\n"
+" ser chamado de ramo nomeado. Se um ramo topológico não tiver um nome,\n"
+" ele pode ser chamado de ramo anônimo. Veja 'Branch, anonymous' e\n"
+" 'Branch, named'."
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+" Ramos podem ser criados quando mudanças forem trazidas de ou enviadas\n"
+" para um repositório remoto, já que novas cabeças podem ser criadas por\n"
+" estas operações. Note que o termo ramo pode também ser usado\n"
+" informalmente para descrever um processo de desenvolvimento no qual\n"
+" parte do trabalho é feita independentemente de outras partes. Isto\n"
+" pode ser feito com ramos anônimos, distinguindo-os através de\n"
+" diferentes clones ou marcadores (veja :hg:`help bookmarks`), ou\n"
+" explicitamente usando ramos nomeados."
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+" Exemplos: \"o ramo experimental\"; \"enviei a correção para o\n"
+" ramo de produção\"."
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+" (Verbo) Ramificar. A ação de criar uma revisão filha que resulta\n"
+" em seu pai ter mais de uma revisão filha, muitas vezes designada\n"
+" como \"criar um ramo\" ou \"fazer um ramo\"."
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr " Exemplos: \"vou ramificar em X\"; \"vou criar um ramo em X\"."
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+"Branch, anonymous\n"
+" Ramo anônimo. Um ramo anônimo é criado sempre que uma nova revisão\n"
+" filha for criada a partir de um pai que não seja uma cabeça (veja\n"
+" 'Head, branch') sem mudar o nome do ramo (veja 'Branch, named')."
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+"Branch, closed\n"
+" Ramo fechado. Um ramo nomeado (veja 'Branch, named') onde todas as\n"
+" cabeças de ramo (veja 'Branch, heads') tenham sido fechadas."
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+"Branch, default\n"
+" Ramo default, às vezes chamado de ramo padrão. 'default' é o nome\n"
+" de ramo (veja 'Branch, named') atribuído a uma revisão se nenhum nome\n"
+" for explicitamente atribuído."
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+"Branch head\n"
+" Veja 'Head, branch'."
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+"Branch, inactive\n"
+" Ramo inativo. Um ramo nomeado é considerado inativo se ele não tiver\n"
+" cabeças topológicas. Por exemplo, um \"feature branch\" (ramo de\n"
+" implementação) se torna inativo quando for mesclado com o ramo default.\n"
+" O comando :hg:`branches` mostra ramos inativos por padrão, mas eles\n"
+" podem ser ocultados usando :hg:`branches --active`."
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+" NOTA: este conceito foi tornado obsoleto por ser demasiado implícito.\n"
+" Atualmente, quando não forem mais necessários, ramos nomeados devem\n"
+" ser fechados explicitamente usando :hg:`commit --close-branch`."
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+"Branch, named\n"
+" Ramo nomeado. É uma coleção de revisões que possuem o mesmo nome de\n"
+" ramo. Por padrão, as revisões filhas de uma revisão em um ramo\n"
+" nomeado pertencem ao mesmo ramo nomeado; uma revisão filha pode\n"
+" receber um outro nome de ramo durante sua criação. Veja\n"
+" :hg:`help branch`, :hg:`help branches` e :hg:`commit --close-branch`\n"
+" para explicações mais detalhadas sobre gerenciamento de ramos."
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+" Ramos nomeados podem ser vistos como um tipo de espaço de nomes,\n"
+" dividindo a coleção de revisões que compõe um repositório em\n"
+" subconjuntos disjuntos. Um ramo nomeado não é necessariamente\n"
+" um ramo topológico. Se um novo ramo nomeado for criado a partir\n"
+" da cabeça de um outro ramo nomeado, ou do ramo default, mas nenhuma\n"
+" outra revisão for adicionada no ramo de origem, tal ramo de origem\n"
+" não será mais um ramo topológico, embora não deixe de ser um ramo\n"
+" nomeado."
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+"Branch tip\n"
+" Veja 'Tip, branch'."
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+"Branch, topological\n"
+" Ramo topológico. Cada vez que uma nova revisão filha for criada a\n"
+" partir de um pai que não seja uma cabeça (veja 'Head, topological'),\n"
+" um novo ramo topológico é criado. Se um ramo topológico tiver um\n"
+" nome de ramo, será um ramo nomeado. Se um ramo topológico não for\n"
+" nomeado, ele se torna um ramo anônimo do ramo atual (possivelmente\n"
+" o ramo 'default', veja 'Branch, default')."
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+"Changelog\n"
+" Um registro das revisões na ordem em que elas foram adicionadas\n"
+" ao repositório. Isso inclui detalhes como id de revisão, autor,\n"
+" mensagem de consolidação, data e lista de arquivos modificados."
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+"Changeset\n"
+" Revisão. Uma cópia do estado do repositório usado para gravar uma\n"
+" mudança. Dependendo do contexto, pode se referir também à mudança\n"
+" imediata que levou a esse estado."
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+"Changeset, child\n"
+" Revisão filha. O inverso de revisão pai: se P é um pai de F, então F\n"
+" é uma filha de P. Não há limite no número de revisões filhas que uma\n"
+" revisão possa ter."
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+"Changeset id\n"
+" Id de revisão. Um hash SHA-1 que identifica unicamente uma revisão.\n"
+" Pode ser representado tanto como uma cadeia \"longa\" de 40 dígitos\n"
+" hexadecimais, ou uma cadeia \"curta\" de 12 dígitos hexadecimais\n"
+" correspondente aos 12 primeiros dígitos da cadeia longa (veja\n"
+" :hg:`help revisions`)."
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+"Changeset, merge\n"
+" Revisão de mesclagem. Uma revisão com dois pais. Tais revisões são\n"
+" criadas ao consolidar uma mesclagem (veja 'Merge')."
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+"Changeset, parent\n"
+" Revisão pai. Uma revisão na qual uma revisão filha se baseia.\n"
+" Especificamente, uma revisão pai de uma revisão F é uma revisão\n"
+" cujo nó imediatamente precede F no DAG (veja 'DAG'). Revisões\n"
+" têm no máximo duas revisões pais."
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+"Checkout\n"
+" (Nome) Um diretório de trabalho atualizado para uma revisão\n"
+" específica, comumente usado em outros sistemas de controle de\n"
+" versão. Este uso é desencorajado, uma vez que revisão ou\n"
+" 'changeset' são bem mais apropriados que 'checkout' nesse\n"
+" contexto."
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr " Exemplo: \"Estou usando o checkout X.\""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (Verbo) Atualizar o diretório de trabalho para uma revisão específica.\n"
+" É um apelido para o comando 'update'; veja :hg:`help update`."
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr " Exemplo: \"Estou atualizando para a revisão X.\""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+"Child changeset\n"
+" Veja 'Changeset, child'."
+
+msgid ""
+"Close changeset\n"
+" See 'Head, closed branch'"
+msgstr ""
+"Closed changeset\n"
+" Veja 'Head, closed branch'."
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+"Closed branch\n"
+" Veja 'Branch, closed'."
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+"Clone\n"
+" (Nome) Uma cópia total ou parcial de um repositório."
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr " Exemplo: \"Seu clone está atualizado?\"."
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+" (Verbo) Clonar. O processo de criar um clone, usando o comando\n"
+" de mesmo nome: :hg:`clone`."
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr " Exemplo: \"Vou clonar o repositório\"."
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+"Closed branch head\n"
+" Veja 'Head, closed branch'."
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+"Commit\n"
+" (Nome) Consolidação. Pode se referir ao ato de consolidar uma nova\n"
+" revisão, o comando que faz essa consolidação (veja :hg:`help commit`)\n"
+" ou simplesmente a uma revisão."
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+" Exemplos: \"O bug foi corrigido por seu último commit?\";\n"
+" \"A consolidação das mudanças foi finalizada com sucesso.\""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+" (Verbo) Consolidar. O ato de gravar mudanças em um repositório.\n"
+" Quando arquivos são consolidados em um diretório de trabalho, o\n"
+" Mercurial localiza todas as mudanças entre os arquivos consolidados\n"
+" e a revisão pai (veja 'Parent, working directory'), criando uma\n"
+" nova revisão no repositório."
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr " Exemplo: \"Você deve consolidar aquelas mudanças agora.\""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+"Cset\n"
+" Uma abreviação comum para o termo changeset (revisão)."
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+"DAG\n"
+" O repositório de revisões de um sistema de controle de versão\n"
+" distribuído (DVCS) pode ser descrito como um grafo acíclico\n"
+" dirigido (Directed Acyclic Graph, ou DAG), consistindo de nós\n"
+" correspondendo a revisões e arestas indicando relações entre\n"
+" revisões pais e filhas. Esse grafo pode ser visualizado com\n"
+" ferramentas como :hg:`glog` (veja :hg:`help graphlog`). No\n"
+" Mercurial, o número de arestas incidentes em um nó qualquer\n"
+" do DAG é limitado a dois, por ser esse o limite do número\n"
+" de pais que uma revisão pode ter."
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+"Default branch\n"
+" Veja 'Branch, default'."
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+"Descendant\n"
+" Descendente. Qualquer revisão que possa ser alcançada por uma\n"
+" cadeia de revisões filhas, a partir de uma revisão dada. Mais\n"
+" precisamente, os descendentes de uma revisão podem ser definidos\n"
+" por duas propriedades: as revisões filhas de uma revisão são\n"
+" suas descendentes, e as revisões filhas de uma descendente são\n"
+" descendentes. Veja também: 'Ancestor'."
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+"Diff\n"
+" (Nome) A diferença de conteúdos e atributos de arquivos entre\n"
+" duas revisões ou entre uma revisão e o diretório de trabalho atual.\n"
+" Tal diferença é tipicamente representada em um formato de texto\n"
+" padronizado conhecido como \"diff\" ou \"patch\" (veja 'Patch' e\n"
+" :hg:`help diff`).\n"
+" O formato \"git diff\" é usado para representar cópias, renomeações\n"
+" ou mudanças de atributos de arquivo, que não podem ser representadas\n"
+" no formato \"diff\" clássico. Diff também é o nome de um popular\n"
+" programa Unix que gera essas representações."
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr " Exemplo: \"Você viu minha correção no diff?\""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+" (Verbo) A ação de criar uma representação diff a partir de duas\n"
+" revisões."
+
+msgid " Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+" Em português, diff não aparece como verbo: costuma-se usar\n"
+" \"criar um diff\" ou \"gerar um diff\" em seu lugar."
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+"Directory, working\n"
+" Diretório de trabalho. Representa o estado dos arquivos rastreados\n"
+" pelo Mercurial que será gravado na próxima consolidação. O diretório\n"
+" de trabalho inicialmente corresponde a uma cópia dos dados de uma\n"
+" revisão existente conhecida como pai do diretório de trabalho (veja\n"
+" 'Parent, working directory'). Esse estado pode ser modificado por uma\n"
+" mesclagem ou por mudanças manuais nos arquivos. Os metadados do\n"
+" repositório são armazenados no diretório .hg dentro do diretório de\n"
+" trabalho."
+
+msgid ""
+"Draft\n"
+" Changesets in the draft phase have not been shared with publishing\n"
+" repositories and may thus be safely changed by history-modifying\n"
+" extensions. See :hg:`help phases`."
+msgstr ""
+"Draft\n"
+" Rascunho. Revisões na fase rascunho não foram compartilhadas com\n"
+" repositórios de publicação, e podem portanto ser modificadas de\n"
+" forma segura por extensões que alterem o histórico.\n"
+" Veja :hg:`help phases`."
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+"Graph\n"
+" Grafo; veja 'DAG' e :hg:`help graphlog`."
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+"Head\n"
+" Cabeça. O termo pode ser usado tanto para denotar uma cabeça de\n"
+" ramo como uma cabeça do repositório, dependendo do contexto. Veja\n"
+" 'Head, branch' e 'Head, repository' para definições específicas."
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+" Cabeças são onde o desenvolvimento geralmente acontece e são os\n"
+" alvos costumeiros para operações update e merge."
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+"Head, branch\n"
+" Cabeça de ramo. Uma revisão sem descendentes no mesmo ramo nomeado."
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+"Head, closed branch\n"
+" Cabeça de um ramo fechado. Uma revisão que marca uma linha de\n"
+" desenvolvimento que não interessa mais. A cabeça fechada não\n"
+" aparece mais na lista de :hg:`heads`. Um ramo é considerado\n"
+" fechado quando todas as suas cabeças estiverem fechadas, e\n"
+" consequentemente não será listado por :hg:`branches`."
+
+msgid ""
+" Closed heads can be re-opened by committing new changeset as the\n"
+" child of the changeset that marks a head as closed."
+msgstr ""
+" Cabeças fechadas podem ser reabertas com a consolidação de uma\n"
+" nova revisão filha da revisão que marca a cabeça como fechada."
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+"Head, repository\n"
+" Cabeça do repositório. Uma cabeça topológica que não foi fechada."
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+"Head, topological\n"
+" Cabeça topológica. Uma revisão que não tem revisões filhas neste\n"
+" repositório."
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+"History, immutable\n"
+" Histórico imutável. Uma vez consolidada, uma revisão não pode ser\n"
+" alterada. Extensões que se propõem a alterar o histórico (veja\n"
+" 'History, rewriting') na verdade criam novas revisões substituindo\n"
+" as revisões existentes.\n"
+" Este tipo de operação faz mais sentido em repositórios privados:\n"
+" se alguém tiver copiado alguma revisão original antes da edição,\n"
+" essa revisão irá reaparecer no repositório na próxima vez que\n"
+" esse desenvolvedor enviar suas revisões (a remoção de revisões\n"
+" não é propagada pelo Mercurial)."
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+"History, rewriting\n"
+" Edição, ou reescrita de histórico. As revisões de um repositório são\n"
+" imutáveis; no entanto, extensões do Mercurial podem ser usadas para\n"
+" alterar o repositório, através da criação de novas revisões baseadas\n"
+" nas revisões existentes (preservando ou modificando conteúdos,\n"
+" metadados ou posições no grafo de revisões) e remoção das revisões\n"
+" originais."
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+"Immutable history\n"
+" Veja 'History, immutable'."
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+"Merge changeset\n"
+" Veja 'Changeset, merge'."
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+"Manifest\n"
+" Manifesto. É a lista de arquivos rastreados por uma determinada revisão."
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+"Merge\n"
+" Mesclagem. Operação usada para conciliar ramos de trabalho divergentes.\n"
+" Quando você atualiza para uma revisão e faz uma mesclagem com outra\n"
+" revisão, você traz o histórico da última para seu diretório de\n"
+" trabalho. Uma vez que eventuais conflitos sejam resolvidos e marcados\n"
+" (como descrito em :hg:`help resolve`), esta mesclagem pode ser\n"
+" consolidada como uma revisão de mesclagem. O termo também é\n"
+" usado para designar tais revisões."
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+"Named branch\n"
+" Veja 'Branch, named'."
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+"Null changeset\n"
+" Revisão nula. A revisão vazia. É o pai do diretório de trabalho em\n"
+" repositórios recém-criados, ou repositórios sem uma cópia local\n"
+" obtida. É portanto o pai de revisões raízes (veja 'Root') e\n"
+" o ancestral efetivo ao mesclar revisões não relacionadas. Pode ser\n"
+" especificado usando o nome reservado \"null\" ou pelo id de revisão\n"
+" '000000000000' (note que isto .não é o mesmo que o número de revisão\n"
+" 0; veja 'Revision number')."
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+"Parent\n"
+" Veja 'Changeset, parent'."
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+"Parent changeset\n"
+" Veja 'Changeset, parent'."
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+"Parent, working directory\n"
+" Pai do diretório de trabalho. É a revisão associada à cópia de trabalho\n"
+" presente no momento: a próxima revisão consolidada será uma filha do\n"
+" pai do diretório de trabalho (ou pais, no caso de uma mesclagem).\n"
+" Podem ser exibidos com os comandos :hg:`parents`, :hg:`summary` ou\n"
+" :hg:`id`, e mudados através de :hg:`update`. Pode ser especificado\n"
+" usando o nome reservado \".\"."
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+"Patch\n"
+" (Nome) O produto de uma operação de diff (veja 'Diff').\n"
+" Patch também é o nome de um programa Unix capaz de restaurar o\n"
+" conteúdo de um arquivo de destino a partir do arquivo original\n"
+" e da representação diff de suas diferenças com o destino.\n"
+" Por serem capazes de aplicar tais diferenças mesmo em arquivos\n"
+" ligeiramente diferentes dos originais, patches são muito usados\n"
+" como forma legível de difundir e aplicar mudanças; veja\n"
+" :hg:`help export` e :hg:`help import`."
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr " Exemplo: \"Eu enviei o meu patch.\""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+" (Verbo) O processo de usar um arquivo de patch para transformar uma\n"
+" revisão em outra."
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+" Em português, patch não aparece como verbo: costuma-se usar a expressão\n"
+" \"aplicar um patch\" em seu lugar."
+
+msgid ""
+"Phase\n"
+" A per-changeset state tracking how the changeset has been or\n"
+" should be shared. See :hg:`help phases`."
+msgstr ""
+"Phase\n"
+" Fase. Um estado específico de uma revisão que rastreia como essa\n"
+" revisão foi ou deve ser compartilhada. Veja :hg:`help phases`."
+
+msgid ""
+"Public\n"
+" Changesets in the public phase have been shared with publishing\n"
+" repositories and are therefore considered immutable. See :hg:`help\n"
+" phases`."
+msgstr ""
+"Public\n"
+" Pública. Revisões na fase pública foram compartilhadas com\n"
+" repositórios de publicação, e são portanto consideradas imutáveis.\n"
+" Veja :hg:`help phases`."
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+"Pull\n"
+" Recebimento de revisões remotas. Uma operação na qual revisões de um\n"
+" repositório remoto que não estejam no repositório local são trazidas\n"
+" para o repositório local. Note que esta operação tipicamente afeta\n"
+" apenas o repositório, sem atualizar os arquivos da área de trabalho;\n"
+" veja :hg:`help pull`."
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+"Push\n"
+" Envio de revisões. Uma operação na qual revisões de um repositório\n"
+" local que não estão em um repositório remoto são enviadas para esse\n"
+" repositório remoto.\n"
+" Note que essa operação apenas adiciona ao repositório remoto revisões\n"
+" já consolidadas localmente; mudanças não consolidadas da cópia de\n"
+" trabalho não são enviadas. Veja :hg:`help push`."
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+"Repository\n"
+" Repositório. Os metadados descrevendo todos os estados registrados\n"
+" de uma coleção de arquivos. Cada estado registrado é representado por\n"
+" uma revisão. Um repositório é tipicamente encontrado no subdiretório\n"
+" ``.hg`` de um diretório de trabalho. Qualquer estado registrado pode\n"
+" ser recriado através de uma atualização (veja 'Update') de um\n"
+" diretório de trabalho para uma revisão específica."
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+"Repository head\n"
+" Veja 'Head, repository'."
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+"Revision\n"
+" Revisão. O estado de um repositório em algum ponto no tempo;\n"
+" 'Changeset' é um termo alternativo praticamente equivalente.\n"
+" Revisões mais antigas podem ser obtidas usando :hg:`update`.\n"
+" Veja também 'Revision number'."
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+"Revision number\n"
+" Número de revisão. Este inteiro identifica unicamente uma revisão\n"
+" dentro de um repositório específico. Ele representa a ordem na qual as\n"
+" revisões foram adicionadas a um repositório, começando pela revisão\n"
+" número 0. Note que o número de revisão pode ser diferente em cada\n"
+" clone de um repositório. Para identificar unicamente revisões entre\n"
+" diferentes clones, veja 'Changeset id' e :hg:`help revisions`."
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+"Revlog\n"
+" O mecanismo de armazenamento de dados usado pelo Mercurial. É uma\n"
+" forma de codificação por deltas, com revisões completas ocasionais\n"
+" seguidas pelas diferenças com relação a cada revisão anterior. Inclui\n"
+" dados e um índice referenciando esses dados."
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+"Rewriting history\n"
+" Veja 'History, rewriting'."
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+"Root\n"
+" Raiz. Uma revisão que possui como pai apenas a revisão nula.\n"
+" A maior parte dos repositórios possui apenas uma revisão raiz."
+
+msgid ""
+"Secret\n"
+" Changesets in the secret phase may not be shared via push, pull,\n"
+" or clone. See :hg:`help phases`."
+msgstr ""
+"Secret\n"
+" Secreta. Revisões na fase secreta não podem ser compartilhadas com\n"
+" push, pull ou clone.\n"
+" Veja :hg:`help phases`."
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+"Tag\n"
+" Etiqueta. Um nome alternativo dado a uma revisão. Etiquetas podem\n"
+" ser usadas em todos os lugares nos quais o Mercurial espera um\n"
+" ID de revisão, por exemplo em :hg:`update`. A criação de uma\n"
+" etiqueta é armazenada no histórico e será portanto\n"
+" automaticamente compartilhada com outros, usando push e pull."
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+"Tip\n"
+" Ponta. A revisão com o maior número de revisão. É a revisão que foi\n"
+" adicionada por último a um repositório."
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+"Tip, branch\n"
+" A ponta de um ramo. É a cabeça de um determinado ramo com o maior\n"
+" número de revisão. Quando um nome de ramo é usado como identificador\n"
+" de revisão, ele se refere à ponta do ramo.\n"
+" Veja também 'Branch, head'. Note que a ponta do ramo pode ser diferente\n"
+" em diferentes clones de um repositório, já que os números de revisão\n"
+" podem não ser os mesmos."
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+"Update\n"
+" (Nome) Atualização. Outro sinônimo para revisão."
+
+msgid " Example: \"I've pushed an update\"."
+msgstr " Exemplo: \"Eu enviei uma atualização\"."
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (Verbo) Atualizar. Esse termo é tipicamente usado para descrever\n"
+" a mudança do estado do diretório de trabalho para uma revisão\n"
+" específica qualquer. Veja :hg:`help update`."
+
+msgid " Example: \"You should update\"."
+msgstr " Exemplo: \"Você deveria atualizar\"."
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+"Working directory\n"
+" Veja 'Directory, working'."
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+"Working directory parent\n"
+" Veja 'Parent, working directory'.\n"
+
+msgid ""
+"Synopsis\n"
+"========"
+msgstr ""
+"Sinopse\n"
+"======="
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+"O Mercurial usa um arquivo chamado ``.hgignore`` no diretório\n"
+"raiz de um repositório para controlar seu comportamento em relação\n"
+"a arquivos que não estejam sendo rastreados no momento."
+
+msgid ""
+"Description\n"
+"==========="
+msgstr ""
+"Descrição\n"
+"========="
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+"O diretório de trabalho de um repositório do Mercurial frequentemente\n"
+"irá conter arquivos que não devem ser rastreados. Isso inclui cópias\n"
+"de segurança criadas por editores e produtos de compilação de fontes.\n"
+"Estes arquivos podem ser ignorados listando-os em um arquivo\n"
+"``.hgignore`` localizado no raiz do diretório de trabalho. O arquivo\n"
+"``.hgignore`` deve ser criado manualmente. Ele é tipicamente colocado\n"
+"sob controle de versão, para que suas definições sejam propagadas\n"
+"para outros repositórios juntamente com as revisões do projeto."
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+"Um arquivo não rastreado será ignorado se seu caminho relativo ao\n"
+"diretório raiz do projeto, ou qualquer caminho que seja um prefixo\n"
+"desse caminho, combinar com qualquer padrão definido no ``.hgignore``."
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+"Por exemplo, suponha que temos um arquivo não rastreado chamado\n"
+"``file.c``, em ``a/b/file.c`` dentro do seu repositório. O Mercurial\n"
+"irá ignorar ``file.c`` se qualquer padrão no ``.hgignore`` combinar\n"
+"``a/b/file.c``, ``a/b`` ou ``a``."
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+"Adicionalmente, um arquivo de configuração do Mercurial pode fazer\n"
+"referência a um conjunto de arquivos hgignore globais ou por usuário.\n"
+"Veja a chave de configuração ``ignore`` na seção ``[ui]`` de\n"
+":hg:`help config` para detalhes sobre como configurar esses arquivos."
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+"Para controlar o gerenciamento do Mercurial de arquivos versionados,\n"
+"muitos comandos suportam as opções ``-I`` e ``-X``; veja\n"
+":hg:`help <comando>` e :hg:`help patterns` para mais detalhes."
+
+msgid ""
+"Files that are already tracked are not affected by .hgignore, even\n"
+"if they appear in .hgignore. An untracked file X can be explicitly\n"
+"added with :hg:`add X`, even if X would be excluded by a pattern\n"
+"in .hgignore."
+msgstr ""
+"O .hgignore não afeta arquivos já rastreados, mesmo que estes\n"
+"apareçam no .hgignore. Um arquivo X não rastreado pode ser adicionado\n"
+"explicitamente usando :hg:`add X`, mesmo se X estiver sendo excluído\n"
+"por um padrão no .hgignore."
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+"Um arquivo hgignore é um arquivo texto que consiste de uma lista de\n"
+"padrões, com um padrão por linha. Linhas em branco são ignoradas.\n"
+"O caractere ``#`` é tratado como caractere de comentários, e o\n"
+"caractere ``\\`` como caractere de escape."
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+"O Mercurial suporta diversas sintaxes de padrões. A sintaxe padrão usa\n"
+"expressões regulares ao estilo Python/Perl."
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr "Para mudar a sintaxe utilizada, use uma linha com a forma::"
+
+msgid " syntax: NAME"
+msgstr " syntax: NOME"
+
+msgid "where ``NAME`` is one of the following:"
+msgstr "onde ``NOME`` pode ser:"
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+"``regexp``\n"
+" Expressão regular, com sintaxe ao estilo Python/Perl.\n"
+"``glob``\n"
+" Caracteres de glob (curingas) ao estilo shell."
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+"A sintaxe escolhida permanece em efeito para todos os padrões\n"
+"subsequentes, até que outra sintaxe seja selecionada."
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+"Padrões glob e regexp não são restritos à raiz do repositório. Um padrão\n"
+"glob com a forma ``*.c`` casará com um arquivo terminado por ``.c`` em\n"
+"qualquer diretório, e um padrão regexp com a forma ``\\.c$`` fará o\n"
+"mesmo. Para fazer com que um padrão regexp seja considerado somente a\n"
+"partir da raiz, comece-o por ``^``."
+
+msgid ""
+".. note::\n"
+" Patterns specified in other than ``.hgignore`` are always rooted.\n"
+" Please see :hg:`help patterns` for details."
+msgstr ""
+".. note::\n"
+" Padrões são sempre relativos à raiz do repositório, com exceção\n"
+" dos especificados em ``.hgignore``.\n"
+" Veja :hg:`help patterns` para mais detalhes."
+
+msgid ""
+"Example\n"
+"======="
+msgstr ""
+"Exemplo\n"
+"======="
+
+msgid "Here is an example ignore file. ::"
+msgstr "Este é um exemplo de arquivo hgignore. ::"
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+" # use sintaxe glob.\n"
+" syntax: glob"
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+" # troque para sintaxe regexp.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a tree of repositories. In the second case, repository\n"
+"paths and global options can be defined using a dedicated\n"
+"configuration file common to :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` and ``hgweb.fcgi``."
+msgstr ""
+"hgweb, o servidor web interno do Mercurial, é capaz de servir tanto um único\n"
+"repositório como uma árvore de repositórios. No caso de uma árvore,\n"
+"os caminhos e opções globais podem ser especificados através de um\n"
+"arquivo de configuração dedicado comum a :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` e ``hgweb.fcgi``."
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files\n"
+"but recognizes only the following sections:"
+msgstr ""
+"Este arquivo usa a mesma sintaxe de arquivos de configuração do Mercurial,\n"
+"mas reconhece apenas as seguintes seções:"
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+" - web\n"
+" - paths\n"
+" - collections"
+
+msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgstr "As opções ``web`` são descritas com detalhes em :hg:`help config`."
+
+msgid ""
+"The ``paths`` section maps URL paths to paths of repositories in the\n"
+"filesystem. hgweb will not expose the filesystem directly - only\n"
+"Mercurial repositories can be published and only according to the\n"
+"configuration."
+msgstr ""
+"A seção ``paths`` mapeia caminhos URL para caminhos de\n"
+"repositórios no sistema de arquivos. O hgweb não expõe o\n"
+"sistema de arquivos diretamente - apenas repositórios\n"
+"do Mercurial podem ser publicados e apenas de acordo com a\n"
+"configuração."
+
+msgid ""
+"The left hand side is the path in the URL. Note that hgweb reserves\n"
+"subpaths like ``rev`` or ``file``, try using different names for\n"
+"nested repositories to avoid confusing effects."
+msgstr ""
+"O lado esquerdo corresponde ao caminho na URL. Note que o hgweb\n"
+"reserva caminhos intermediários como ``rev`` ou ``file``, tente\n"
+"usar nomes diferentes para repositórios aninhados para evitar\n"
+"confusão."
+
+msgid ""
+"The right hand side is the path in the filesystem. If the specified\n"
+"path ends with ``*`` or ``**`` the filesystem will be searched\n"
+"recursively for repositories below that point.\n"
+"With ``*`` it will not recurse into the repositories it finds (except for\n"
+"``.hg/patches``).\n"
+"With ``**`` it will also search inside repository working directories\n"
+"and possibly find subrepositories."
+msgstr ""
+"O lado direito corresponde ao caminho no sistema de arquivos.\n"
+"Se o caminho especificado terminar por ``*`` ou ``**``, será feita\n"
+"uma busca recursiva por repositórios a partir daquele ponto.\n"
+"Com ``*`` a busca não entrará nos repositórios que encontrar (com\n"
+"a exceção de ``.hg/patches``).\n"
+"Com ``**`` a busca incluirá os diretórios de trabalho dos\n"
+"repositórios, e eventuais sub-repositórios."
+
+msgid "In this example::"
+msgstr "Neste exemplo::"
+
+msgid ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+msgstr ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry will publish every Mercurial repository found in\n"
+" ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``\n"
+" will appear as ``http://server/quux/``\n"
+"- The fourth entry will publish both ``http://server/user/bob/quux/``\n"
+" and ``http://server/user/bob/quux/testsubrepo/``"
+msgstr ""
+"- As primeiras duas entradas fazem dois repositórios em diretórios\n"
+" diferentes aparecerem sob o mesmo diretório na interface web\n"
+"- A terceira entrada publicará todos os repositórios do Mercurial\n"
+" encontrados em ``/srv/repos/``, por exemplo o repositório\n"
+" ``/srv/repos/quux/`` aparecerá em ``http://server/quux/``\n"
+"- A quarta entrada publicará tanto ``http://server/user/bob/quux/``\n"
+" como ``http://server/user/bob/quux/testsubrepo/``"
+
+msgid ""
+"The ``collections`` section is deprecated and has been superseeded by\n"
+"``paths``.\n"
+msgstr ""
+"A seção ``collections`` é obsoleta e foi completamente substituída\n"
+"pela seção ``paths``.\n"
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr "Para mesclar arquivos o Mercurial usa utilitários de mesclagem."
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+"Um utilitário de mesclagem combina duas versões diferentes de\n"
+"um arquivo em um arquivo mesclado. Ao utilitário de mesclagem\n"
+"são passados os dois arquivos e o maior ancestral comum das\n"
+"duas revisões dos arquivos, para que ele possa determinar as\n"
+"mudanças feitas nos dois ramos."
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+"Os utilitários de mesclagem são usados por :hg:`resolve`,\n"
+":hg:`merge`, :hg:`update`, :hg:`backout` e diversas extensões."
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+"Tipicamente, o utilitário de mesclagem tenta automaticamente reconciliar\n"
+"os arquivos combinando todas as mudanças não sobrepostas que tiverem\n"
+"ocorrido separadamente nas duas evoluções diferentes do mesmo arquivo\n"
+"base inicial. Além disso, alguns programas de mesclagem interativos\n"
+"facilitam a resolução manual de conflitos de mesclagem, de maneira\n"
+"gráfica ou inserindo no arquivo algum marcador de conflitos. O Mercurial\n"
+"não inclui nenhum programa de mesclagem interativa, mas usa utilitários\n"
+"externos para essa tarefa."
+
+msgid ""
+"Available merge tools\n"
+"====================="
+msgstr ""
+"Utilitários de mesclagem disponíveis\n"
+"===================================="
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+"Utilitários externos de mesclagem e suas propriedades são\n"
+"configurados na seção de configuração merge-tools - veja\n"
+"hgrc(5) - mas tipicamente podem ser usados meramente\n"
+"através do nome do executável."
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+"Um utilitário de mesclagem pode ser usado se seu executável\n"
+"puder ser encontrado no sistema e se ele puder gerenciar a\n"
+"mesclagem. O executável será encontrado se corresponder a um\n"
+"caminho absoluto ou relativo ou se corresponder ao nome de\n"
+"uma aplicação no caminho de busca de executáveis. Assume-se\n"
+"que o utilitário pode lidar com a mesclagem se ele puder\n"
+"lidar com o tipo específico de arquivo (no caso de links\n"
+"simbólicos ou arquivos binários) e se uma interface\n"
+"gráfica estiver disponível (no caso de utilitários gráficos)."
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+"Também estão disponíveis os seguintes utilitários de mesclagem\n"
+"internos:"
+
+msgid ".. internaltoolsmarker"
+msgstr ".. internaltoolsmarker"
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by default\n"
+"not handle symlinks or binary files."
+msgstr ""
+"Esses utilitários internos estão sempre disponíveis e não requerem uma\n"
+"interface gráfica, mas por padrão não lidam com links simbólicos e\n"
+"arquivos binários."
+
+msgid ""
+"Choosing a merge tool\n"
+"====================="
+msgstr ""
+"Escolhendo um utilitário de mesclagem\n"
+"====================================="
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+"O Mercurial segue as seguintes regras para determinar qual utilitário\n"
+"de mesclagem será usado:"
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, its\n"
+" configuration is used. Otherwise the specified tool must be executable by\n"
+" the shell."
+msgstr ""
+"1. Se um utilitário for especificado pela opção --tool, ele será usado.\n"
+" Se esse for o nome de um utilitário definido na seção de configuração\n"
+" merge-tools, essa configuração será usada; caso contrário, o\n"
+" utilitário especificado deve estar disponível para execução através\n"
+" do shell."
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used and\n"
+" must be executable by the shell."
+msgstr ""
+"2. Se a variável de ambiente ``HGMERGE`` estiver presente, seu valor será\n"
+" usado; o utilitário especificado deve estar disponível para execução\n"
+" através do shell."
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of the\n"
+" merge tool are not considered."
+msgstr ""
+"3. Se o nome do arquivo a ser mesclado combinar com algum padrão definido\n"
+" na seção de configuração merge-patterns, será usado o primeiro utilitário\n"
+" de mesclagem que corresponda a um desses padrões. Aqui, não é considerada\n"
+" a capacidade do utilitário em lidar com arquivos binários."
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the name\n"
+" of a configured tool, the specified value is used and must be executable by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+"4. Se ui.merge estiver definida, será utilizada.\n"
+" Se esse for o nome de um utilitário definido na seção de configuração\n"
+" merge-tools, essa configuração será usada; caso contrário, o\n"
+" utilitário especificado deve estar disponível para execução através\n"
+" do shell."
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+"5. Se qualquer utilitário de mesclagem usável estiver presente na seção\n"
+" de configuração merge-tools, será utilizado o de maior prioridade."
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+"6. Se um programa chamado ``hgmerge`` for encontrado no sistema,\n"
+" ele será usado - mas por padrão ele não será usado para\n"
+" links simbólicos e arquivos binários."
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+"7. Se o arquivo a ser mesclado não for um link simbólico nem\n"
+" um arquivo binário, ``internal:merge`` será usado."
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+"8. A mesclagem falha, e deve ser resolvida manualmente antes da\n"
+" consolidação."
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+".. note::\n"
+" Após selecionar um utilitário de mesclagem, o Mercurial por padrão\n"
+" tentará primeiro mesclar o arquivo usando um algoritmo simples de\n"
+" mesclagem. O utilitário só será usado se o algoritmo simples falhar\n"
+" por existirem mudanças conflitantes. Esse comportamento de\n"
+" mesclagem prévia pode ser controlado através da configuração premerge\n"
+" do utilitário de mesclagem. A mesclagem prévia é habilitada por\n"
+" padrão, a não ser que o arquivo seja binário ou um link simbólico."
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+"Veja as seções merge-tools e ui da página de manual\n"
+"hgrc(5) para detalhes da configuração de utilitários de mesclagem.\n"
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+"Quando o Mercurial aceita mais de uma revisão, elas podem ser\n"
+"especificadas individualmente, ou fornecidas como uma sequência\n"
+"topologicamente contínua, separadas pelo caractere \":\"."
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+"A sintaxe da notação de sequência é [INÃCIO]:[FIM], onde INÃCIO\n"
+"e FIM são identificadores de revisão. Tanto INÃCIO como FIM são\n"
+"opcionais. Se INÃCIO não for especificado, terá como valor padrão\n"
+"a revisão número 0. Se FIM não for especificado, terá como valor\n"
+"padrão a revisão tip. A sequência \":\" portanto significa\n"
+"\"todas as revisões\"."
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+"Se INÃCIO for maior que FIM, as revisões são tratadas na ordem\n"
+"inversa."
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+"Uma sequência age como um intervalo fechado. Isso quer dizer que\n"
+"uma sequência 3:5 nos dá 3, 4 e 5. De forma semelhante, uma\n"
+"sequência 4:2 nos dá 4, 3, e 2.\n"
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+"O Mercurial aceita diversas notações para identificar um ou mais\n"
+"arquivos de uma vez."
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+"Por padrão, o Mercurial trata nomes de arquivo como padrões\n"
+"estendidos de glob do shell."
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+"Notações alternativas de padrões devem ser especificadas\n"
+"explicitamente."
+
+msgid ""
+".. note::\n"
+" Patterns specified in ``.hgignore`` are not rooted. \n"
+" Please see :hg:`help hgignore` for details."
+msgstr ""
+".. note::\n"
+" Padrões especificados em ``.hgignore`` não são relativos à raiz do\n"
+" repositório.\n"
+" Veja :hg:`help hgignore` para mais detalhes."
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+"Para usar um nome simples de caminho sem qualquer casamento de\n"
+"padrões, comece o nome com ``path:``. Estes nomes de caminho\n"
+"devem bater completamente, a partir da raiz do repositório\n"
+"atual."
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+"Para usar um glob estendido, comece um nome com ``glob:``. Globs\n"
+"têm como raiz o diretório corrente; um glob como ``*.c`` baterá\n"
+"apenas com arquivos terminados em ``.c`` no diretório corrente."
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+"As sintaxes de extensão do glob suportadas são ``**`` para bater\n"
+"com qualquer string incluindo separadores de caminho, e ``{a,b}``\n"
+"para significar \"a ou b\"."
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+"Para usar uma expressão regular Perl/Python, comece um nome com\n"
+"``re:``. O casamento de padrões por expressão regular é feito a\n"
+"partir do raiz do repositório."
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+"Para ler de um arquivo os padrões de nomes, use ``listfile:`` ou\n"
+"``listfile0:``. O primeiro lê padrões delimitados por quebras de\n"
+"linha; o segundo, por caracteres null. Cada string lida do\n"
+"arquivo também é tratada como um padrão de arquivos."
+
+msgid "Plain examples::"
+msgstr "Exemplos de caminhos simples::"
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+" path:foo/bar o nome bar em um diretório chamado foo no raiz do\n"
+" repositório\n"
+" path:path:name um arquivo ou diretório chamado \"path:name\""
+
+msgid "Glob examples::"
+msgstr "Exemplos de glob::"
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+" glob:*.c qualquer nome terminado por \".c\" no diretório\n"
+" atual\n"
+" *.c qualquer nome terminado por \".c\" no diretório\n"
+" atual\n"
+" **.c qualquer nome terminado por \".c\" no diretório\n"
+" atual ou em qualquer subdiretório\n"
+" foo/*.c qualquer nome terminado por \".c\" no diretório\n"
+" foo\n"
+" foo/**.c qualquer nome terminado por \".c\" no diretório\n"
+" foo ou em qualquer subdiretório"
+
+msgid "Regexp examples::"
+msgstr "Exemplos de expressão regular::"
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+" re:.*\\.c$ qualquer nome terminado por \".c\", em qualquer\n"
+" lugar no repositório"
+
+msgid "File examples::"
+msgstr "Exemplos de padrões lidos de arquivos::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+" listfile:list.txt lê a lista de list.txt com um padrão por linha\n"
+" listfile0:list.txt lê a lista de list.txt delimitados por bytes null"
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr "Veja também :hg:`help filesets`.\n"
+
+msgid ""
+"What are phases?\n"
+"================"
+msgstr ""
+"O que são fases?\n"
+"================"
+
+msgid ""
+"Phases are a system for tracking which changesets have been or should\n"
+"be shared. This helps prevent common mistakes when modifying history\n"
+"(for instance, with the mq or rebase extensions)."
+msgstr ""
+"Fases são um sistema para rastrear quais revisões foram ou\n"
+"devem ser compartilhadas. Isto ajuda a prevenir erros comuns\n"
+"ao modificar o histórico (usando por exemplo as extensões mq\n"
+"e rebase)."
+
+msgid "Each changeset in a repository is in one of the following phases:"
+msgstr "Cada revisão em um repositório está em uma das seguintes fases:"
+
+msgid ""
+" - public : changeset is visible on a public server\n"
+" - draft : changeset is not yet published\n"
+" - secret : changeset should not be pushed, pulled, or cloned"
+msgstr ""
+" - public (pública): a revisão é visível em um servidor público\n"
+" - draft (rascunho): a revisão ainda não foi publicada\n"
+" - secret (secreta): a revisão não deve ser propagada em um clone, push ou pull"
+
+msgid ""
+"These phases are ordered (public < draft < secret) and no changeset\n"
+"can be in a lower phase than its ancestors. For instance, if a\n"
+"changeset is public, all its ancestors are also public. Lastly,\n"
+"changeset phases should only be changed towards the public phase."
+msgstr ""
+"Estas fases são ordenadas (pública < rascunho < secreta) e\n"
+"nenhuma revisão pode estar em uma fase menor que as de seus\n"
+"ancestrais. Por exemplo, se uma revisão é pública, todos os\n"
+"seus ancestrais também serão públicos. Por fim, as fases de\n"
+"revisões só devem ser modificadas em direção à fase pública."
+
+msgid ""
+"How are phases managed?\n"
+"======================="
+msgstr ""
+"Como fases são gerenciadas?\n"
+"==========================="
+
+msgid ""
+"For the most part, phases should work transparently. By default, a\n"
+"changeset is created in the draft phase and is moved into the public\n"
+"phase when it is pushed to another repository."
+msgstr ""
+"Na maior parte, fases devem funcionar de forma transparente.\n"
+"Por padrão, uma revisão é criada na fase rascunho, e movida\n"
+"para a fase pública quando for enviada para outro repositório."
+
+msgid ""
+"Once changesets become public, extensions like mq and rebase will\n"
+"refuse to operate on them to prevent creating duplicate changesets.\n"
+"Phases can also be manually manipulated with the :hg:`phase` command\n"
+"if needed. See :hg:`help -v phase` for examples."
+msgstr ""
+"Uma vez que revisões se tornem públicas, extensões como mq e\n"
+"rebase se recusarão a operar sobre elas, para impedir a criação\n"
+"de revisões duplicadas. Se necessário, fases também podem ser\n"
+"manipuladas usando o comando :hg:`phase`.\n"
+"Veja :hg:`help -v phase` para alguns exemplos."
+
+msgid ""
+"Phases and servers\n"
+"=================="
+msgstr ""
+"Fases e servidores\n"
+"=================="
+
+msgid "Normally, all servers are ``publishing`` by default. This means::"
+msgstr ""
+"Normalmente, todos os servidores são por padrão ``publishing``\n"
+"(\"de publicação\"). Isto quer dizer que::"
+
+msgid ""
+" - all draft changesets that are pulled or cloned appear in phase\n"
+" public on the client"
+msgstr ""
+" - todas as revisões na fase rascunho que forem trazidas desse\n"
+" servidor usando pull ou clone aparecerão no cliente na fase\n"
+" pública"
+
+msgid ""
+" - all draft changesets that are pushed appear as public on both\n"
+" client and server"
+msgstr ""
+" - todas as revisões na fase rascunho que forem enviadas para esse\n"
+" servidor aparecerão como públicas tanto no cliente como no servidor"
+
+msgid " - secret changesets are neither pushed, pulled, or cloned"
+msgstr ""
+" - revisões na fase secreta não são transmitidas com push, pull ou clone"
+
+msgid ""
+".. note::\n"
+" Pulling a draft changeset from a publishing server does not mark it\n"
+" as public on the server side due to the read-only nature of pull."
+msgstr ""
+".. note::\n"
+" Trazer uma revisão rascunho de um servidor de publicação não a\n"
+" marca como pública no servidor devido à natureza somente leitura\n"
+" do comando pull."
+
+msgid ""
+"Sometimes it may be desirable to push and pull changesets in the draft\n"
+"phase to share unfinished work. This can be done by setting a\n"
+"repository to disable publishing in its configuration file::"
+msgstr ""
+"Às vezes pode ser desejável fazer push e pull de revisões na fase\n"
+"rascunho para compartilhar trabalho não concluído. Isto pode ser\n"
+"feito desabilitando a publicação de um repositório em seu arquivo\n"
+"de configuração::"
+
+msgid ""
+" [phases]\n"
+" publish = False"
+msgstr ""
+" [phases]\n"
+" publish = False"
+
+msgid "See :hg:`help config` for more information on config files."
+msgstr ""
+"Veja :hg:`help config` para mais informações sobre arquivos de configuração."
+
+msgid ""
+".. note::\n"
+" Servers running older versions of Mercurial are treated as\n"
+" publishing."
+msgstr ""
+".. note::\n"
+" Servidores executando versões mais antigas do Mercurial são\n"
+" considerados como de publicação."
+
+msgid ""
+"Examples\n"
+"========"
+msgstr ""
+"Exemplos\n"
+"========"
+
+msgid " - list changesets in draft or secret phase::"
+msgstr " - lista revisões nas fases rascunho ou secreta::"
+
+msgid " hg log -r \"not public()\""
+msgstr " hg log -r \"not public()\""
+
+msgid " - change all secret changesets to draft::"
+msgstr " - muda todas as revisões secretas para rascunho::"
+
+msgid " hg phase --draft \"secret()\""
+msgstr " hg phase --draft \"secret()\""
+
+msgid ""
+" - forcibly move the current changeset and descendants from public to "
+"draft::"
+msgstr ""
+" - força a passagem da revisão atual e seus descendentes da fase pública "
+"para a rascunho::"
+
+msgid " hg phase --force --draft ."
+msgstr " hg phase --force --draft ."
+
+msgid " - show a list of changeset revision and phase::"
+msgstr " - mostra uma lista de números de revisão e suas respectivas fases::"
+
+msgid " hg log --template \"{rev} {phase}\\n\""
+msgstr " hg log --template \"{rev} {phase}\\n\""
+
+msgid " - resynchronize draft changesets relative to a remote repository::"
+msgstr ""
+" - sincroniza novamente revisões de rascunho relativas a um repositório "
+"remoto::"
+
+msgid " hg phase -fd 'outgoing(URL)' "
+msgstr " hg phase -fd 'outgoing(URL)' "
+
+msgid ""
+"See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr ""
+"Veja :hg:`help phase` para mais informações sobre como manipular\n"
+"fases manualmente.\n"
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+"O Mercurial aceita diversas notações para identificar revisões\n"
+"individuais."
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+"Um simples inteiro é tratado como um número de revisão. Inteiros\n"
+"negativos são contados a partir da tip, com -1 denotando a tip,\n"
+"-2 denotando a revisão anterior à tip, e assim por diante."
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+"Uma string hexadecimal de 40 dígitos é tratada como um\n"
+"identificador único de revisão."
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+"Uma string hexadecimal de menos de 40 caracteres é tratada como\n"
+"um identificador único de revisão, chamado de identificador\n"
+"curto. Um identificador curto é válido apenas se for o prefixo\n"
+"de um identificador completo."
+
+msgid ""
+"Any other string is treated as a bookmark, tag, or branch name. A\n"
+"bookmark is a movable pointer to a revision. A tag is a permanent name\n"
+"associated with a revision. A branch name denotes the tipmost revision\n"
+"of that branch. Bookmark, tag, and branch names must not contain the \":\"\n"
+"character."
+msgstr ""
+"Qualquer outra string é tratada como um nome de marcador, etiqueta\n"
+"ou ramo.\n"
+"Um marcador (bookmark) é um apontador móvel para uma revisão.\n"
+"Uma etiqueta (tag) é um nome simbólico permanente associado a uma\n"
+"revisão.\n"
+"Um nome de ramo denota a revisão mais recente de tal ramo.\n"
+"Nomes de marcadores, etiquetas e ramos não podem conter o caractere \":\"."
+
+msgid "The reserved name \"tip\" always identifies the most recent revision."
+msgstr ""
+"O nome reservado \"tip\" sempre\n"
+"identifica a revisão mais recente."
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+"O nome reservado \"null\" indica a revisão nula. Essa é a revisão\n"
+"de um repositório vazio, e a revisão pai da revisão 0."
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+"O nome reservado \".\" indica a revisão pai do diretório de\n"
+"trabalho. Se nenhum diretório de trabalho estiver selecionado,\n"
+"será equivalente a null. Se uma mesclagem estiver em progresso,\n"
+"\".\" será a revisão do primeiro pai.\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+"O Mercurial suporta uma linguagem funcional para selecionar um conjunto\n"
+"de revisões."
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+"Essa linguagem suporta um número de predicados que são agrupados através\n"
+"de operadores infixos. Parênteses podem ser usados para agrupar expressões."
+
+msgid ""
+"Identifiers such as branch names may need quoting with single or\n"
+"double quotes if they contain characters like ``-`` or if they match\n"
+"one of the predefined predicates."
+msgstr ""
+"Identificadores (como nomes de ramo ou etiquetas) que contenham\n"
+"caracteres como ``-`` ou que forem\n"
+"iguais a algum dos predicados predefinidos devem ser passados\n"
+"entre aspas simples ou duplas."
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Revisões que não estejam em x. A forma curta é ``! x``."
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+"``x::y``\n"
+" Uma sequência no DAG, significando todas as revisões descendentes de x\n"
+" e ancestrais de y, incluindo os próprios. Se o primeiro extremo for\n"
+" omitido, a expressão equivale a ``ancestors(y)``, se o segundo termo\n"
+" for omitido a expressão é equivalente a ``descendants(x)``."
+
+msgid " An alternative syntax is ``x..y``."
+msgstr " Uma sintaxe alternativa é ``x..y``."
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+"``x:y``\n"
+" Todas as revisões com números de revisão entre x e y, inclusive.\n"
+" Os extremos podem ser omitidos: os valores padrão são 0 e tip."
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" A intersecção das revisões em x e y. A forma curta é ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" A união de revisões em x e y. Há duas formas curtas alternativas:\n"
+" ``x | y`` e ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Revisões em x mas não em y."
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+"``x^n``\n"
+" O n-ésimo pai de x, onde n == 0, 1, ou 2.\n"
+" Para n == 0, x; para n == 1, o primeiro pai de cada revisão em x;\n"
+" para n == 2, o segundo pai de cada revisão em x."
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+"``x~n``\n"
+" O n-ésimo primeiro ancestral de x; ``x~0`` é x; ``x~3`` é ``x^^^``."
+
+msgid "There is a single postfix operator:"
+msgstr "Há um único operador posfixo:"
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+"``x^``\n"
+" Equivalente a ``x^1``, o primeiro pai de cada revisão em x."
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+"\n"
+"Os seguintes predicados são suportados:"
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+"Novos predicados (conhecidos como \"aliases\", ou apelidos) podem ser\n"
+"definidos usando qualquer combinação de predicados existentes ou\n"
+"outros apelidos. Uma definição de apelido segue a seguinte forma::"
+
+msgid " <alias> = <definition>"
+msgstr " <apelido> = <definicao>"
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+"na seção ``revsetalias`` de um arquivo de configuração do Mercurial.\n"
+"Argumentos da forma `$1`, `$2`, etc. são substituídos pelos argumentos\n"
+"passados na chamada do apelido."
+
+msgid "For example,"
+msgstr "Por exemplo,"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+"defines três apelidos, ``h``, ``d`` e ``rs``. ``rs(0:tip, author)`` é\n"
+"exatamente equivalente a ``reverse(sort(0:tip, author))``."
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr "Opções de linha de comando equivalentes para :hg:`log`::"
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+
+msgid "- Changesets on the default branch::"
+msgstr "- Revisões no ramo default::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr " hg log -r \"branch(default)\""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+"- Revisões no ramo default desde a etiqueta tag 1.5, excluindo\n"
+" mesclagens::"
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr " hg log -r \"branch(default) and 1.5:: and not merge()\""
+
+msgid "- Open branch heads::"
+msgstr "- Cabeças de ramo abertas::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+"- Revisões entre as etiquetas 1.3 e 1.5 mencionando \"bug\" e que\n"
+" afetam ``hgext/*``::"
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr "- Revisões consolidadas em maio de 2008, ordenadas por autor::"
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr " hg log -r \"sort(date('May 2008'), user)\""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+"- Revisões mencionando \"bug\" ou \"issue\" que não descendem\n"
+" de revisões etiquetadas::"
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not "
+"ancestors(tagged())\"\n"
+msgstr ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not "
+"ancestors(tagged())\"\n"
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+"O suporte a sub-repositórios possibilita o aninhamento de\n"
+"repositórios externos ou projetos em um repositório pai do\n"
+"Mercurial, fornecendo suporte para a operação de diversos\n"
+"comandos no conjunto como um todo."
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+"No momento o Mercurial suporta sub-repositórios do próprio\n"
+"Mercurial, do Git e do Subversion."
+
+msgid "Subrepositories are made of three components:"
+msgstr "Sub-repositórios são constituídos de três componentes:"
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+"1. Cópias locais aninhadas.\n"
+" Podem aparecer em qualquer ponto do diretório\n"
+" de trabalho pai."
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+" should be placed in the root of working directory, and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+"2. Referências a repositórios aninhados. São definidas no\n"
+" arquivo ``.hgsub`` no raiz do repositório,\n"
+" e informam ao Mercurial de onde as cópias\n"
+" locais devem ser obtidas. Sub-repositórios do Mercurial são\n"
+" referenciados da seguinte maneira:"
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr " caminho/aninhado = https://exemplo.com/aninhado/repo/caminho"
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr " Subrepositórios do Git e do Subversion também são suportados:"
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+" caminho/aninhado = [git]git://exemplo.com/aninhado/repo/caminho\n"
+" caminho/aninhado = [svn]https://exemplo.com/aninhado/trunk/caminho"
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+" onde ``caminho/aninhado`` é a localização da cópia local relativa\n"
+" à raiz do repositório pai do Mercurial, e\n"
+" ``https://exemplo.com/aninhado/repo/caminho`` é o caminho do\n"
+" repositório de origem. A origem também pode ser um caminho no\n"
+" sistema de arquivos."
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+" Note que ``.hgsub`` não é criado por padrão em repositórios\n"
+" do Mercurial; você deve criá-lo e adicioná-lo manualmente ao\n"
+" repositório pai para poder usar sub-repositórios."
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+" is placed in the root of working directory, and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+"3. Os estados dos repositórios aninhados. Eles são definidos no\n"
+" arquivo ``.hgsubstate`` no raiz do repositório,\n"
+" e capturam quaisquer informações\n"
+" necessárias para restaurar os sub-repositórios para o estado\n"
+" com o qual foram consolidados na revisão do repositório pai.\n"
+" O Mercurial grava esses estados automaticamente durante uma\n"
+" consolidação do repositório pai."
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+" .. note::\n"
+" O arquivo ``.hgsubstate`` não deve ser editado manualmente."
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"======================"
+msgstr ""
+"\n"
+"Adicionando um Sub-Repositório\n"
+"=============================="
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+"Se ``.hgsub`` não existir, crie-o e adicione-o ao repositório\n"
+"pai. Clone ou faça um checkout dos projetos externos que você\n"
+"deseje adicionar como sub-repositórios ao repositório pai.\n"
+"Edite ``.hgsub`` e adicione as entradas de sub-repositórios\n"
+"como descritas acima. Neste ponto, o sub-repositório passa a\n"
+"ser rastreado e a próxima consolidação gravará seu estado\n"
+"em ``.hgsubstate`` e o associará à revisão consolidada."
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"============================="
+msgstr ""
+"Sincronizando um Sub-Repositório\n"
+"================================"
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+"Sub-repositórios não rastreiam automaticamente as últimas\n"
+"mudanças de suas respectivas origens. Ao invés disso, eles são\n"
+"atualizados para a revisão correspondente à revisão atual do\n"
+"repositório pai. Isso é feito para que os desenvolvedores\n"
+"sempre recebam um conjunto consistente e compatível de código\n"
+"e bibliotecas ao atualizar para uma revisão qualquer."
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+"Ou seja, a atualização de sub-repositórios é um processo manual.\n"
+"Basta atualizar o sub-repositório em questão para a revisão\n"
+"desejada, testar no repositório pai, e consolidar no repositório\n"
+"pai para que a nova combinação seja gravada."
+
+msgid ""
+"Deleting a Subrepository\n"
+"========================"
+msgstr ""
+"Apagando um Sub-Repositório\n"
+"==========================="
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+"Para remover a associação de um sub-repositório com seu repositório\n"
+"pai, remova a referência correspondente do arquivo ``.hgsub``, e\n"
+"em seguida apague manualmente seus arquivos."
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"==================================="
+msgstr ""
+"Interação com Comandos do Mercurial\n"
+"==================================="
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. However, if you specify the full path of a file in a\n"
+" subrepo, it will be added even without -S/--subrepos specified.\n"
+" Git and Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":add: add não é executado recursivamente em sub-repositórios, a não\n"
+" ser que -S/--subrepos seja especificado. No entanto, se for\n"
+" especificado o caminho completo de um arquivo em um sub-repositório,\n"
+" ele será adicionado mesmo que -S/--subrepos não seja passado.\n"
+" Sub-repositórios do Subversion e do Git são no momento\n"
+" silenciosamente ignorados."
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+":archive: archive não é executado recursivamente em sub-repositórios, a não\n"
+" ser que -S/--subrepos seja especificado."
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+":commit: commit cria uma referência consistente do estado do\n"
+" projeto e seus sub-repositórios como um todo. O Mercurial\n"
+" abortará se qualquer sub-repositório tiver sido modificado.\n"
+" Para fazer com que ao invés disso um commit seja executado\n"
+" em cada sub-repositório, use a opção -S/--subrepos ou\n"
+" defina \"ui.commitsubrepos=True\" em um arquivo de\n"
+" configuração (veja :hg:`help config`).\n"
+" Assim que não houver mais sub-repositórios modificados,\n"
+" seus estados serão gravados, e finalmente o commit será\n"
+" realizado no repositório pai."
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":diff: diff não é executado recursivamente em sub-repositórios, a não\n"
+" ser que -S/--subrepos seja especificado. As mudanças são exibidas\n"
+" normalmente nos sub-repositórios do Mercurial. Sub-repositórios do\n"
+" Subversion e do Git são no momento silenciosamente ignorados."
+
+msgid ""
+":forget: forget currently only handles exact file matches in subrepos.\n"
+" Git and Subversion subrepositories are currently silently ignored."
+msgstr ""
+":forget: forget no momento considera apenas especificações exatas de\n"
+" arquivos em sub-repositórios.\n"
+" Sub-repositórios do Subversion e do Git são no momento\n"
+" silenciosamente ignorados."
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":incoming: incoming não é executado recursivamente em\n"
+" sub-repositórios, a não ser que -S/--subrepos seja\n"
+" especificado.\n"
+" Sub-repositórios do Subversion e do Git são no momento\n"
+" silenciosamente ignorados."
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":outgoing: outgoing não é executado recursivamente em\n"
+" sub-repositórios, a não ser que -S/--subrepos seja\n"
+" especificado.\n"
+" Sub-repositórios do Subversion e do Git são no momento\n"
+" silenciosamente ignorados."
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+":pull: pull não é recursivo, já que não se sabe quais revisões\n"
+" devem ser trazidas antes da execução de :hg:`update`. Listar\n"
+" e obter todas as mudanças em sub-repositórios referenciadas\n"
+" pelas revisões trazidas para o repositório pai é na melhor\n"
+" das hipóteses uma operação cara, e impossível no caso de\n"
+" sub-repositórios do Subversion."
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+":push: O Mercurial irá automaticamente executar push em\n"
+" todos os sub-repositórios ao realizar um push no repositório\n"
+" pai. Isto garante que novas mudanças em sub-repositórios\n"
+" estejam disponíveis quando referenciadas por repositórios\n"
+" pais.\n"
+" Push é ignorado em sub-repositórios do Subversion."
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":status: status não é executado recursivamente em\n"
+" sub-repositórios, a não ser que -S/--subrepos seja\n"
+" especificado.\n"
+" Mudanças em sub-repositórios são exibidas como mudanças\n"
+" comuns do Mercurial em cada sub-repositório.\n"
+" Sub-repositórios do Subversion são no momento\n"
+" silenciosamente ignorados."
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+":update: update restaura cada sub-repositório para seu estado\n"
+" correspondente gravado pela revisão alvo. Se nesse momento a\n"
+" revisão gravada não estiver disponível no sub-repositório,\n"
+" o Mercurial executará o pull dessa revisão antes de atualizar.\n"
+" Isto quer dizer que o comando update pode exigir acesso à rede\n"
+" caso sub-repositórios sejam usados."
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"================================="
+msgstr ""
+"Remapeamento de Origens de Sub-Repositórios\n"
+"==========================================="
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+"A localização de origem de um sub-repositório pode mudar\n"
+"durante a vida de um projeto, invalidando as referências\n"
+"guardadas no histórico do repositório pai. Para corrigir\n"
+"isso, regras de reescrita podem ser definidas no arquivo\n"
+"``hgrc`` do repositório pai ou na configuração do Mercurial.\n"
+"Veja a seção ``[subpaths]`` em hgrc(5) para mais detalhes."
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+"O Mercurial permite que você personalize a saída de comandos\n"
+"usando modelos. Você pode tanto passar um modelo pela linha de\n"
+"comando, usando a opção --template, como selecionar um\n"
+"estilo de modelo existente (--style)."
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+"Você pode personalizar a saída de qualquer comando semelhante\n"
+"ao log: log, outgoing, incoming, tip, parents, heads e glog."
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+"Quatro estilos são incluídos na distribuição do Mercurial: default\n"
+"(o estilo usado quando nenhuma preferência for passada), compact,\n"
+"changelog e xml.\n"
+"Uso::"
+
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+"Um modelo é um texto com marcações que invocam expansão de\n"
+"variáveis::"
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+"Strings entre chaves são chamadas palavras chave. A\n"
+"disponibilidade de palavras chave depende do contexto exato do\n"
+"modelador. Estas palavras chave estão comumente disponíveis para\n"
+"modelar comandos semelhantes ao log:"
+
+msgid ".. keywordsmarker"
+msgstr ".. keywordsmarker"
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+"A palavra chave \"date\" não produz saída legível para humanos.\n"
+"Se você quiser usar uma data em sua saída, você pode usar um\n"
+"filtro para processá-la. Filtros são funções que devolvem uma\n"
+"string baseada na variável de entrada. Certifique-se de usar\n"
+"primeiro o filtro stringify quando você estiver aplicando um\n"
+"filtro de entrada de strings para uma variável de entrada que\n"
+"contenha uma lista. Você também pode encadear\n"
+"filtros para obter a saída desejada::"
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+msgid "List of filters:"
+msgstr "Lista de filtros:"
+
+msgid ".. filtersmarker\n"
+msgstr ".. filtersmarker\n"
+
+msgid "Valid URLs are of the form::"
+msgstr "URLs válidas são da forma::"
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+" caminho/no/sistema/de/arquivos/local[#revisão]\n"
+" file://caminho/no/sistema/de/arquivos/local[#revisão]\n"
+" http://[usuário[:senha]@]servidor[:porta]/[caminho][#revisão]\n"
+" https://[usuário[:senha]@]servidor[:porta]/[caminho][#revisão]\n"
+" ssh://[usuário@]servidor[:porta]/[caminho][#revisão]"
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+"Caminhos no sistema de arquivos local podem tanto apontar para\n"
+"repositórios do Mercurial como para arquivos bundle (criados por\n"
+":hg:`bundle` ou :hg:`incoming --bundle`). Veja também :hg:`help paths`."
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+"Um identificador opcional após # indica um ramo, etiqueta ou\n"
+"revisão do repositório remoto a ser usado. Veja também\n"
+":hg:`help revisions`."
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+"Certas funcionalidades, como o push para URLs http:// e https://\n"
+"são possíveis apenas se forem explicitamente habilitadas no\n"
+"servidor remoto do Mercurial."
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+"Note que a segurança de URLs HTTPS depende de uma configuração\n"
+"adequada de web.cacerts."
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr "Algumas notas sobre o uso de SSH com o Mercurial:"
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+"- o SSH necessita de uma conta shell acessível na máquina de\n"
+" destino e uma cópia do hg no caminho de execução remoto ou\n"
+" especificado em remotecmd.\n"
+"- o caminho é por padrão relativo ao diretório home do usuário\n"
+" remoto.\n"
+" Use uma barra extra no início de um caminho para especificar um\n"
+" caminho absoluto::"
+
+msgid " ssh://example.com//tmp/repository"
+msgstr " ssh://exemplo.com//tmp/repositorio"
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+"- o Mercurial não usa sua própria compressão via SSH; a coisa\n"
+" certa a fazer é configurá-la em seu ~/.ssh/config, por exemplo::"
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+" Host *.minharedelocal.exemplo.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+" Alternativamente especifique \"ssh -C\" como seu comando ssh\n"
+" em seu arquivo de configuração ou pela opção de linha de comando --ssh ."
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+"Estas URLs podem ser todas armazenadas em seu arquivo de configuração\n"
+"com apelidos de caminho na seção [paths] , da seguinte forma::"
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+" [paths]\n"
+" apelido1 = URL1\n"
+" apelido2 = URL2\n"
+" ..."
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+"Você pode então usar o apelido em qualquer comando que receba uma\n"
+"URL (por exemplo :hg:`pull apelido1` será tratado como :hg:`pull URL1`)."
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+"Dois apelidos de caminho são especiais por serem usados como\n"
+"valores padrão quando você não fornece a URL para um comando:"
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+"default:\n"
+" Quando você cria um repositório com hg clone, o comando clone\n"
+" grava a localização do repositório de origem como o novo\n"
+" caminho 'default' do repositório. Ele é então usado quando você\n"
+" omitir o caminho de comandos semelhantes ao push e ao pull\n"
+" (incluindo incoming e outgoing)."
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+"default-push:\n"
+" O comando push procurará por um caminho chamado 'default-push',\n"
+" e o usará ao invés de 'default' se ambos estiverem definidos.\n"
+
+msgid "remote branch lookup not supported"
+msgstr "busca de ramo remoto não suportada"
+
+msgid "dirstate branch not accessible"
+msgstr "ramo do dirstate inacessível"
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "ramo desconhecido '%s'"
+
+msgid "can only share local repositories"
+msgstr "só é possível compartilhar repositórios locais"
+
+msgid "destination already exists"
+msgstr "o destino já existe"
+
+msgid "updating working directory\n"
+msgstr "atualizando diretório de trabalho\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "diretório de destino: %s\n"
+
+msgid "empty destination path is not valid"
+msgstr "um caminho de destino vazio não é válido"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "o destino '%s' já existe"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "o destino '%s' não está vazio"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone"
+" by revision"
+msgstr ""
+"repositório de origem não suporta busca de revisões, portanto não suporta "
+"clonar por revisão"
+
+msgid "clone from remote to remote not supported"
+msgstr "clone de origem remota para destino remoto não suportado"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "atualizando para o ramo %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+"%d arquivos atualizados, %d arquivos mesclados, %d arquivos removidos, %d "
+"arquivos não resolvidos\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "use 'hg resolve' para mesclar novamente arquivos não resolvidos\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"use 'hg resolve' para mesclar novamente arquivos não resolvidos ou 'hg "
+"update -C .' para abandonar\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(mesclagem de ramo, não esqueça de consolidar)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "arquivo de configuração %s não encontrado!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "erro ao ler %s/.hg/hgrc: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "erro ao acessar o repositório em %s\n"
+
+msgid "SSL support is unavailable"
+msgstr "Suporte a SSL indisponível"
+
+msgid "IPv6 is not available on this system"
+msgstr "IPv6 indisponível nesse sistema"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "não é possível iniciar o servidor em '%s:%d': %s"
+
+#, python-format
+msgid "(binary file %s, hash: %s)"
+msgstr "(arquivo binário %s, hash: %s)"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr "%d arquivos modificados, %d inserções(+), %d remoções(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr "invocando gancho %s: %s\n"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr "gancho %s inválido(\"%s\" não está em um módulo)"
+
+msgid "exception from first failed import attempt:\n"
+msgstr "exceção na primeira tentativa de import:\n"
+
+msgid "exception from second failed import attempt:\n"
+msgstr "exceção na segunda tentativa de import:\n"
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr "gancho %s é inválido (falhou o import de \"%s\")"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr "gancho %s é inválido (\"%s\" não definido)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr "gancho %s é inválido (\"%s\" não é executável)"
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr "erro: gancho %s falhou: %s\n"
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr "erro: gancho %s lançou uma exceção: %s\n"
+
+#, python-format
+msgid "%s hook failed"
+msgstr "gancho %s falhou"
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr "aviso: gancho %s falhou\n"
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr "executando gancho %s: %s\n"
+
+#, python-format
+msgid "%s hook %s"
+msgstr "gancho %s %s"
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr "aviso: gancho %s %s\n"
+
+#, python-format
+msgid "loading %s hook failed:\n"
+msgstr "o carregamento do gancho %s falhou:\n"
+
+msgid "kb"
+msgstr "kb"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorando chave inválida em [auth] '%s'\n"
+
+msgid "connection ended unexpectedly"
+msgstr "conexão terminou inesperadamente"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "componente de URL não suportado: \"%s\""
+
+msgid "operation not supported over http"
+msgstr "operação não suportada sobre http"
+
+msgid "authorization failed"
+msgstr "autorização falhou"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "erro http, possivelmente causado pela configuração de proxy"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "URL real é %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' não parece ser um repositório do Mercurial:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' enviou um cabeçalho Content-Type inválido (%s)"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' usa protocolo mais novo %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "o push falhou: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "suporte do Python a SSL e HTTPS não está instalado"
+
+msgid "cannot create new http repository"
+msgstr "impossível criar novo repositório http"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "ignorando sintaxe inválida '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "desconsiderando arquivo ignore ilegível '%s': %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "repositório %s não encontrado"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "repositório %s já existe"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ".hg/sharedpath aponta para diretório %s inexistente"
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr "aviso: ignorando pai desconhecido do diretório de trabalho '%s'!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r não pode ser usado em um nome de etiqueta"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "aviso: a etiqueta %s conflita com um nome de ramo existente\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+"a cópia de trabalho de .hgtags foi modificada (por favor consolide .hgtags "
+"manualmente)"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "transação abandonada encontrada - execute hg recover"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "desfazendo transação interrompida\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "nenhuma transação interrompida disponível\n"
+
+msgid "no rollback information available\n"
+msgstr "nenhuma informação de desfazimento disponível\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr ""
+"executando rollback da tip do repositório para a revisão %s (desfazimento de"
+" %s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr ""
+"executando rollback da tip do repositório para a revisão %s (desfazimento de"
+" %s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "desfazendo transação desconhecida\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+"rollback do último commit pode perder dados se a revisão não for a atual"
+
+msgid "use -f to force"
+msgstr "use -f para forçar"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr "o ramo nomeado não pôde ser redefinido: o ramo atual ainda é %s\n"
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "o diretório de trabalho está agora baseado nas revisões %d e %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "o diretório de trabalho está agora baseado na revisão %d\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "esperando pelo bloqueio em %s feito por %r\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "repositório %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "diretório de trabalho de %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr ""
+"aviso: não é possível encontrar o ancestral de '%s' copiado a partir de "
+"'%s'!\n"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"não é possível consolidar parcialmente uma mesclagem (não especifique "
+"arquivos ou padrões)"
+
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "consolidação com novo sub-repositório %s excluída"
+
+msgid "use --subrepos for recursive commit"
+msgstr "use --subrepos para um commit recursivo"
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "não é possível consolidar sub-repositórios sem o arquivo .hgsub"
+
+msgid "file not found!"
+msgstr "arquivo não encontrado!"
+
+msgid "no match under directory!"
+msgstr "nenhuma correspondência sob o diretório!"
+
+msgid "file not tracked!"
+msgstr "arquivo não rastreado!"
+
+msgid "cannot commit merge with missing files"
+msgstr "não se pode consolidar uma mesclagem com arquivos ausentes"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "conflitos de mesclagem não resolvidos (veja hg help resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "consolidando sub-repositório %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "nota: mensagem de consolidação gravada em %s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "problemas ao consolidar %s!\n"
+
+msgid "requesting all changes\n"
+msgstr "pedindo todas as mudanças\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"pull parcial não pode ser feito porque o outro repositório não suporta "
+"'changegroupsubset'."
+
+msgid "destination does not support push"
+msgstr "o destino não suporta push"
+
+#, python-format
+msgid "push includes an obsolete changeset: %s!"
+msgstr "push inclui uma revisão obsoleta: %s!"
+
+#, python-format
+msgid "push includes an unstable changeset: %s!"
+msgstr "push inclui uma revisão instável: %s!"
+
+#, python-format
+msgid "updating %s to public failed!\n"
+msgstr "a atualização da fase de %s para pública falhou!\n"
+
+msgid "failed to push some obsolete markers!\n"
+msgstr "erro ao enviar algumas marcações de obsolescência!\n"
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "%d revisões encontradas\n"
+
+msgid "bundling"
+msgstr "criando bundle"
+
+msgid "manifests"
+msgstr "manifestos"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "revlog vazio ou não encontrado para %s"
+
+msgid "adding changesets\n"
+msgstr "adicionando revisões\n"
+
+msgid "chunks"
+msgstr "trechos"
+
+msgid "received changelog group is empty"
+msgstr "grupo de changelogs recebido é vazio"
+
+msgid "adding manifests\n"
+msgstr "adicionando manifestos\n"
+
+msgid "adding file changes\n"
+msgstr "adicionando mudanças em arquivos\n"
+
+msgid "received file revlog group is empty"
+msgstr "grupo recebido de arquivos revlog vazio"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "faltando dados de arquivo para %s:%s - execute hg verify"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d cabeças)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "adicionadas %d revisões com %d mudanças em %d arquivos%s\n"
+
+msgid "unexpected response from remote server:"
+msgstr "resposta inesperada do servidor remoto:"
+
+msgid "operation forbidden by server"
+msgstr "operação não permitida pelo servidor"
+
+msgid "locking the remote repository failed"
+msgstr "o bloqueio do repositório remoto falhou"
+
+msgid "the server sent an unknown error code"
+msgstr "o servidor enviou um código de erro desconhecido"
+
+msgid "streaming all changes\n"
+msgstr "encadeando todas as mudanças\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d arquivos para transferir, %s de dados\n"
+
+msgid "clone"
+msgstr "clone"
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "transferidos %s em %.1f segundos (%s/s)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "impossível usar TLS: suporte Python a SSL não instalado"
+
+msgid "(using smtps)\n"
+msgstr "(usando smtps)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "servidor smtp não configurado - impossível enviar e-mail"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "enviando e-mail: servidor smtp %s, porta %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(usando starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(autenticando com o servidor de e-mail como %s)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "enviando e-mail: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+"smtp especificado como transporte de e-mail, mas o servidor smtp não foi "
+"configurado"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+"%r especificado como um transporte de e-mail, mas não encontrado no PATH"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "ignorando sendcharset inválido: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "endereço de e-mail inválido: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "endereço local inválido: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' e '\\r' proibidos em nomes de arquivos: %r"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "falha ao remover %s do manifesto"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "padrão inválido (%s): %s"
+
+msgid "invalid pattern"
+msgstr "padrão inválido"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "incapaz de ler lista de arquivos (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr "o número de linhas de contexto de diff deve ser um inteiro, e não %r"
+
+#, python-format
+msgid "%s: untracked file differs\n"
+msgstr "%s: arquivo não rastreado é diferente\n"
+
+msgid ""
+"untracked files in working directory differ from files in requested revision"
+msgstr ""
+"arquivos não versionados no diretório de trabalho diferem do arquivo na "
+"revisão pedida"
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr "conflito de maiúsculas e minúsculas entre %s e %s"
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+" modo conflitante para %s\n"
+"(n)enhum, e(x)ecutável ou (l)ink simbólico?"
+
+msgid "&None"
+msgstr "&Nenhum"
+
+msgid "E&xec"
+msgstr "E&xecutável"
+
+msgid "Sym&link"
+msgstr "&Link simbólico"
+
+msgid "resolving manifests\n"
+msgstr "examinando manifestos\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" local alterou %s, que a remota removeu\n"
+"use (c) a versão alterada, ou (d) apague?"
+
+msgid "&Changed"
+msgstr "(&C) alterada"
+
+msgid "&Delete"
+msgstr "(&D) apagar"
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+"remota mudou %s, apagada pela local\n"
+"use (c) a versão alterada, ou (d) deixe apagada?"
+
+msgid "&Deleted"
+msgstr "(&D) apagada"
+
+msgid "updating"
+msgstr "atualizando"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "update falhou ao remover %s: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "obtendo %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "obtendo %s para %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr "nota: possível conflito - %s foi renomeado múltiplas vezes para:\n"
+
+#, python-format
+msgid "note: possible conflict - %s was deleted and renamed to:\n"
+msgstr "nota: possível conflito - %s foi apagado e renomeado para:\n"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr ""
+"mesclar com um ancestral do diretório de trabalho não tem nenhum efeito"
+
+msgid "use 'hg update' or check 'hg heads'"
+msgstr "use 'hg update' ou verifique 'hg heads'"
+
+msgid "use 'hg status' to list changes"
+msgstr "use 'hg status' para listar as mudanças"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "mudanças não consolidadas pendentes no sub-repositório '%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+"atravessa ramos (mescle os ramos ou use --clean para descartar mudanças)"
+
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+"atravessa ramos (mescle os ramos ou use update --check para forçar a "
+"atualização)"
+
+msgid "Attention:"
+msgstr "Atenção:"
+
+msgid "Caution:"
+msgstr "Cuidado:"
+
+msgid "!Danger!"
+msgstr "!Perigo!"
+
+msgid "Error:"
+msgstr "Erro:"
+
+msgid "Hint:"
+msgstr "Dica:"
+
+msgid "Important:"
+msgstr "Importante:"
+
+msgid "Note:"
+msgstr "Nota:"
+
+msgid "Tip:"
+msgstr "Tip:"
+
+msgid "Warning!"
+msgstr "Aviso!"
+
+#, python-format
+msgid "parsing obsolete marker: unknown version %r"
+msgstr "decodificando marcações de obsolescência: versão desconhecida %r"
+
+#, python-format
+msgid ""
+"parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
+msgstr ""
+"decodificando marcações de obsolescência: metadados são curtos demais, %d "
+"bytes esperados, %d obtidos"
+
+#, python-format
+msgid "unknown key: %r"
+msgstr "chave desconhecida: %r"
+
+msgid "unexpected old value"
+msgstr "valor antigo inesperado"
+
+#, python-format
+msgid "unexpected token: %s"
+msgstr "token inesperado: %s"
+
+#, python-format
+msgid "not a prefix: %s"
+msgstr "não é um prefixo: %s"
+
+#, python-format
+msgid "not an infix: %s"
+msgstr "não é um infixo: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr "%d de %d trechos FALHARAM -- gravando rejeitados no arquivo %s\n"
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "não é possível aplicar o patch em %s: arquivo não rastreado"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "incapaz de localizar '%s' para modificação\n"
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "modificando arquivo %s\n"
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr "trecho ruim #%d %s (%d %d %d %d)"
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "impossível criar %s: o destino já existe\n"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "arquivo %s já existe\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+"Trecho #%d aplicado com sucesso em %d com indistinção %d (distância %d "
+"linhas).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "Trecho #%d aplicado com sucesso em %d (distância %d linhas).\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr "Trecho #%d FALHOU em %d\n"
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr "trecho ruim #%d"
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr "trecho ruim #%d antiga linha de texto %d"
+
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "não foi possível extrair os dados binários de \"%s\""
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "não foi possível decodificar o patch binário \"%s\": %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "o comprimento de \"%s\" é %d bytes, deveria ser %d"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "impossível remover %d de %d diretórios de %s"
+
+msgid "undefined source and destination files"
+msgstr "arquivos de origem e destino não definidos"
+
+#, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "falha ao sincronizar metadados para \"%s\""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "impossível criar %s: destino já existe"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "estado do parser não suportado: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "comando de patch falhou: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "tipo de quebra de linha não suportado: %s"
+
+msgid "patch failed to apply"
+msgstr "aplicação do patch falhou"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "impossível %s; repositório remoto não suporta a funcionalidade '%r'"
+
+msgid "cannot change null revision phase"
+msgstr "não é possível mudar a fase da revisão nula"
+
+#, python-format
+msgid "ignoring inconsistent public root from remote: %s\n"
+msgstr "ignorando raiz pública inconsistente no repositório remoto: %s\n"
+
+#, python-format
+msgid "ignoring unexpected root from remote: %i %s\n"
+msgstr "ignorando raiz inesperada no repositório remoto: %i %s\n"
+
+#, python-format
+msgid "phases.new-commit: not a valid phase name ('%s')"
+msgstr "phases.new-commit: não é um nome de fase válido ('%s')"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "terminou com o código %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "morto pelo sinal %d"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "salvando bundle de segurança em %s\n"
+
+msgid "adding branch\n"
+msgstr "adicionando ramo\n"
+
+#, python-format
+msgid "error removing %s: %s\n"
+msgstr "erro ao remover %s: %s\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "strip falhou, bundle completo armazenado em '%s'\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "strip falhou, bundle parcial armazenado em '%s'\n"
+
+#, python-format
+msgid "revlog decompress error: %s"
+msgstr "erro de descompressão do revlog: %s"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "tipo de compressão %r desconhecido"
+
+msgid "index entry flags need RevlogNG"
+msgstr "flags de entrada de índice exigem RevlogNG"
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr "índice %s marcadores desconhecidos %#04x para o formato v0"
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "índice %s marcadores desconhecidos %#04x para o revlogng"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "índice %s formato desconhecido %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "índice %s corrompido"
+
+msgid "no node"
+msgstr "nenhum nó"
+
+msgid "ambiguous identifier"
+msgstr "identificador ambíguo"
+
+msgid "no match found"
+msgstr "nenhum casamento encontrado"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "marcação de revisão incompatível %x"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s não encontrado na transação"
+
+msgid "consistency error in delta"
+msgstr "erro de consistência no delta"
+
+msgid "unknown delta base"
+msgstr "base de delta desconhecida"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "não se pode usar %s aqui"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+"``adds(padrão)``\n"
+" Revisões que adicionam arquivos correspondentes ao padrão."
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds requer um padrão"
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+"``ancestor(revisão, revisão)``\n"
+" Maior ancestral comum das duas revisões."
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor requer dois argumentos"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "os argumentos de ancestor devem ser revisões únicas"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+"``ancestors(conjunto)``\n"
+" Revisões ancestrais de revisões no conjunto."
+
+msgid "~ expects a number"
+msgstr "~ espera um número"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+"``author(string)``\n"
+" Apelido para ``user(string)``."
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author requer uma string"
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+"``bisected(string)``\n"
+" Revisões marcadas com o estado de bissecção especificado:"
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology\n"
+" - ``current`` : the cset currently being bisected"
+msgstr ""
+" - ``good``, ``bad``, ``skip``: revs explicitamente marcadas como boas, ruins ou omitidas\n"
+" - ``goods``, ``bads`` : revs topologicamente boas ou ruins\n"
+" - ``range`` : revs participando da bissecção\n"
+" - ``pruned`` : revs goods, bads ou skipped\n"
+" - ``untested`` : revs que ainda não foram testadas\n"
+" - ``ignored`` : revs ignoradas pela topologia do DAG\n"
+" - ``current`` : a revisão sendo biseccionada no momento"
+
+#. i18n: "bisect" is a keyword
+msgid "bisect requires a string"
+msgstr "bisect requer uma string"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+"``bookmark([nome])``\n"
+" O marcador chamado nome, ou todos os marcadores."
+
+msgid ""
+" If `name` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a bookmark that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" Se `nome` começar com `re:`, o restante do nome é tratado como\n"
+" uma expressão regular. Para combinar com um marcador que comece\n"
+" com `re:` literalmente, use o prefixo `literal:`."
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark requer um ou nenhum argumento"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "o argumento para o comando bookmark deve ser uma string"
+
+#, python-format
+msgid "no bookmarks exist that match '%s'"
+msgstr "não existe nenhum marcador que corresponda a '%s'"
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the given\n"
+" changesets."
+msgstr ""
+"``branch(string ou conjunto)``\n"
+" Todas as revisões pertencentes ao ramo pedido ou aos ramos\n"
+" das revisões no conjunto."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a branch that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" Se `string` começar com `re:`, o restante do nome é tratado como\n"
+" uma expressão regular. Para combinar com um ramo que comece\n"
+" com `re:` literalmente, use o prefixo `literal:`."
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+"``children(conjunto)``\n"
+" Revisões filhas das revisões no conjunto."
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+"``closed()``\n"
+" Revisões fechadas."
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed não tem argumentos"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+"``contains(padrão)``\n"
+" Revisões que contenham um arquivo que combine com o padrão. Veja\n"
+" :hg:`help patterns` para informações sobre padrões de arquivo."
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains requer um padrão"
+
+msgid ""
+"``converted([id])``\n"
+" Changesets converted from the given identifier in the old repository if\n"
+" present, or all converted changesets if no identifier is specified."
+msgstr ""
+"``converted([id])``\n"
+" Revisões convertidas a partir do identificador dado no\n"
+" repositório de origem, ou todas as revisões convertidas se\n"
+" um identificador não for fornecido."
+
+#. i18n: "converted" is a keyword
+msgid "converted takes one or no arguments"
+msgstr "converted recebe um ou nenhum argumento"
+
+#. i18n: "converted" is a keyword
+msgid "converted requires a revision"
+msgstr "converted requer uma revisão"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+"``date(intervalo)``\n"
+" Revisões dentro do intervalo de datas, veja :hg:`help dates`."
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date requer uma string"
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+"``desc(string)``\n"
+" Procura por string na mensagem de consolidação. Essa procura não\n"
+" distingue maiúsculas e minúsculas."
+
+#. i18n: "desc" is a keyword
+msgid "desc requires a string"
+msgstr "desc requer uma string"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+"``descendants(conjunto)``\n"
+" Todas as revisões descendentes de revisões do conjunto."
+
+msgid ""
+"``destination([set])``\n"
+" Changesets that were created by a graft, transplant or rebase operation,\n"
+" with the given revisions specified as the source. Omitting the optional set\n"
+" is the same as passing all()."
+msgstr ""
+"``destination([conjunto])``\n"
+" Revisões criadas por operações graft, transplant ou rebase\n"
+" que tiveram como origem revisões no conjunto. Se o conjunto\n"
+" não for especificado, será o mesmo que especificar all()."
+
+msgid ""
+"``draft()``\n"
+" Changeset in draft phase."
+msgstr ""
+"``draft()``\n"
+" Revisões na fase \"draft\" (rascunho)."
+
+#. i18n: "draft" is a keyword
+msgid "draft takes no arguments"
+msgstr "draft não tem argumentos"
+
+msgid ""
+"``extinct()``\n"
+" Obsolete changesets with obsolete descendants only."
+msgstr ""
+"``extinct()``\n"
+" Revisões extintas (revisões obsoletas que possuam apenas\n"
+" descendentes obsoletos)."
+
+#. i18n: "extinct" is a keyword
+msgid "extinct takes no arguments"
+msgstr "extinct não tem argumentos"
+
+msgid ""
+"``extra(label, [value])``\n"
+" Changesets with the given label in the extra metadata, with the given\n"
+" optional value."
+msgstr ""
+"``extra(rótulo, [valor])``\n"
+" Revisões com o rótulo pedido nos metadados extras, opcionalmente\n"
+" com o valor pedido."
+
+msgid ""
+" If `value` starts with `re:`, the remainder of the value is treated as\n"
+" a regular expression. To match a value that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" Se `valor` começar com `re:`, o restante do valor é tratado como\n"
+" uma expressão regular. Para combinar com um valor que comece\n"
+" com `re:` literalmente, use o prefixo `literal:`."
+
+#. i18n: "extra" is a keyword
+msgid "extra takes at least 1 and at most 2 arguments"
+msgstr "extra recebe um ou dois argumentos"
+
+#. i18n: "extra" is a keyword
+msgid "first argument to extra must be a string"
+msgstr "o primeiro argumento de extra deve ser uma string"
+
+#. i18n: "extra" is a keyword
+msgid "second argument to extra must be a string"
+msgstr "o segundo argumento de extra deve ser uma string"
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+"``filelog(padrão)``\n"
+" Revisões conectadas ao filelog especificado."
+
+msgid ""
+" For performance reasons, ``filelog()`` does not show every changeset\n"
+" that affects the requested file(s). See :hg:`help log` for details. For\n"
+" a slower, more accurate result, use ``file()``."
+msgstr ""
+" Por razões de desempenho, ``filelog()`` não mostra todas as\n"
+" revisões que afetaram os arquivos pedidos. Veja :hg:`help log`\n"
+" para mais detalhes. Para um resultado mais preciso, mas mais\n"
+" lento, use ``file()``."
+
+#. i18n: "filelog" is a keyword
+msgid "filelog requires a pattern"
+msgstr "filelog requer um padrão"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+"``first(conjunto, [n])``\n"
+" Um apelido para limit()."
+
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s requer um nome de arquivo ou nenhum argumento"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s espera um nome de arquivo"
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+"``follow([arquivo])``\n"
+" Um apelido para ``::.`` (ancestrais do primeiro pai da cópia de trabalho).\n"
+" Se um nome de arquivo for especificado, o histórico do arquivo pedido será\n"
+" seguido, incluindo cópias."
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+"``all()``\n"
+" Todas as revisões, o mesmo que ``0:tip``."
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all não tem argumentos"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+"``grep(regex)``\n"
+" Como ``keyword(string)`` mas aceita uma expressão regular. Use\n"
+" ``grep(r'...')`` para garantir que caracteres especiais sejam\n"
+" manipulados corretamente. Ao contrário de ``keyword(string)``,\n"
+" a comparação diferencia maiúsculas e minúsculas."
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep requer uma string"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "padrão de busca inválido: %s"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles requer ao menos um argumento"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles requer argumentos de texto"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles espera no máximo uma revisão"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles espera no máximo um modo padrão"
+
+#. i18n: "_matchfiles" is a keyword
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "prefixo _matchfiles inválido: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+"``file(padrão)``\n"
+" Revisões que afetam arquivos correspondentes ao padrão."
+
+msgid ""
+" For a faster but less accurate result, consider using ``filelog()``\n"
+" instead."
+msgstr ""
+" Para um resultado mais rápido mas menos preciso, considere usar\n"
+" ``filelog()``."
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file requer um padrão"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+"``head()``\n"
+" Revisões que forem cabeças de ramos nomeados."
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head não tem argumentos"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+"``heads(conjunto)``\n"
+" Membros do conjunto que não tenham filhos no conjunto."
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+"``keyword(string)``\n"
+" Revisões que contenham string na mensagem de consolidação, nome de\n"
+" usuário ou nomes de arquivos modificados. A comparação não diferencia\n"
+" maiúsculas e minúsculas."
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword requer uma string"
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+"``limit(conjunto, [n])``\n"
+" Os primeiros n membros do conjunto. O valor padrão de n é 1."
+
+#. i18n: "limit" is a keyword
+msgid "limit requires one or two arguments"
+msgstr "limit exige um ou dois argumentos"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit requer um número"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit espera um número"
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+"``last(conjunto, [n])``\n"
+" Os últimos n membros do conjunto. O valor padrão de n é 1."
+
+#. i18n: "last" is a keyword
+msgid "last requires one or two arguments"
+msgstr "last exige um ou dois argumentos"
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr "last requer um número"
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr "last espera um número"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+"``max(conjunto)``\n"
+" Revisão com maior número de revisão no conjunto."
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+"``merge()``\n"
+" Revisões de mesclagem."
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge não tem argumentos"
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+"``min(conjunto)``\n"
+" Revisão com menor número de revisão no conjunto."
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+"``modifies(padrão)``\n"
+" Revisões que modificam arquivos correspondentes ao padrão."
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies requer um padrão"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+"``id(string)``\n"
+" Revisão especificada de modo não ambíguo pelo\n"
+" prefixo hexadecimal fornecido em string."
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id requer um argumento"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id requer uma string"
+
+msgid ""
+"``obsolete()``\n"
+" Mutable changeset with a newer version."
+msgstr ""
+"``obsolete()``\n"
+" Revisões obsoletas (revisões mutáveis com uma nova versão)."
+
+#. i18n: "obsolete" is a keyword
+msgid "obsolete takes no arguments"
+msgstr "obsolete não tem argumentos"
+
+msgid ""
+"``origin([set])``\n"
+" Changesets that were specified as a source for the grafts, transplants or\n"
+" rebases that created the given revisions. Omitting the optional set is the\n"
+" same as passing all(). If a changeset created by these operations is itself\n"
+" specified as a source for one of these operations, only the source changeset\n"
+" for the first operation is selected."
+msgstr ""
+"``origin([conjunto])``\n"
+" Revisões que foram especificadas como origem em operações graft,\n"
+" transplant ou rebase que criaram as revisões no conjunto. Omitir\n"
+" o conjunto tem o mesmo efeito de passar all(). Se uma revisão\n"
+" criada por essas operações for ela mesma especificada como\n"
+" origem de uma dessas operações, apenas a revisão de origem da\n"
+" primeira operação será selecionada."
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([caminho])``\n"
+" Revisões não encontradas no repositório de destino\n"
+" especificado pelo caminho ou na localização padrão de push."
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing takes one or no arguments"
+msgstr "outgoing recebe um ou nenhum argumento"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "outgoing exige um caminho para um repositório"
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+"``p1([conjunto])``\n"
+" O primeiro pai das revisões no conjunto, ou do diretório de trabalho."
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+"``p2([conjunto])``\n"
+" O segundo pai das revisões no conjunto, ou do diretório de trabalho."
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working directory."
+msgstr ""
+"``parents([conjunto])``\n"
+" O conjunto de todos os pais de todas as revisões no conjunto pedido,\n"
+" ou os pais do diretório de trabalho."
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr "^ espera o número 0, 1 ou 2"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+"``present(set)``\n"
+" Um conjunto vazio, se qualquer revisão no conjunto pedido não for\n"
+" encontrada; caso contrário, todas as revisões no conjunto pedido."
+
+msgid ""
+" If any of specified revisions is not present in the local repository,\n"
+" the query is normally aborted. But this predicate allows the query\n"
+" to continue even in such cases."
+msgstr ""
+" A consulta é normalmente abortada se qualquer revisão especificada\n"
+" não estiver presente no repositório local. Este predicado permite\n"
+" que a consulta continue nesses casos."
+
+msgid ""
+"``public()``\n"
+" Changeset in public phase."
+msgstr ""
+"``public()``\n"
+" Revisões na fase \"public\" (pública)."
+
+#. i18n: "public" is a keyword
+msgid "public takes no arguments"
+msgstr "public não tem argumentos"
+
+msgid ""
+"``remote([id [,path]])``\n"
+" Local revision that corresponds to the given identifier in a\n"
+" remote repository, if present. Here, the '.' identifier is a\n"
+" synonym for the current local branch."
+msgstr ""
+"``remote([id] [,caminho])``\n"
+" Revisão local que corresponda ao identificador dado em um\n"
+" repositório remoto, se presente. Aqui, o identificador '.' é um\n"
+" sinônimo para o ramo local atual."
+
+#. i18n: "remote" is a keyword
+msgid "remote takes one, two or no arguments"
+msgstr "remote recebe nenhum, um ou dois argumentos"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a string id"
+msgstr "remote requer uma string de identificação"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a repository path"
+msgstr "remote requer um caminho para um repositório"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+"``removes(padrão)``\n"
+" Revisões que removem arquivos correspondentes ao padrão."
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes requer um padrão"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+"``rev(number)``\n"
+" Revisão com o identificador numérico dado."
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev requer um argumento"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev requer um número"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev espera um número"
+
+msgid ""
+"``matching(revision [, field])``\n"
+" Changesets in which a given set of fields match the set of fields in the\n"
+" selected revision or set."
+msgstr ""
+"``matching(revisão [, campos])``\n"
+" Revisões nas quais os valores do conjunto especificado de campos\n"
+" combinam com os valores do mesmo conjunto de campos na revisão ou\n"
+" conjunto de revisões pedido."
+
+msgid ""
+" To match more than one field pass the list of fields to match separated\n"
+" by spaces (e.g. ``author description``)."
+msgstr ""
+" Para combinar com mais de um campo, passe a lista de campos\n"
+" separada por espaços (como em 'author description')."
+
+msgid ""
+" Valid fields are most regular revision fields and some special fields."
+msgstr ""
+" Os campos válidos são a maior parte dos campos comuns de revisões,\n"
+" além de alguns campos especiais."
+
+msgid ""
+" Regular revision fields are ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" and ``diff``.\n"
+" Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the\n"
+" contents of the revision. Two revisions matching their ``diff`` will\n"
+" also match their ``files``."
+msgstr ""
+" Os campos comuns são: ``description`` (descrição), ``author`` (autor),\n"
+" ``branch`` (ramo), ``date`` (data), ``files`` (arquivos),\n"
+" ``phase`` (fase), ``parents`` (pais), ``substate`` (sub-repositórios)\n"
+" e ``user`` (usuário). Note que ``user`` ``author`` são sinônimos.\n"
+" ``diff`` se refere ao conteúdo da revisão. Duas revisões com mesmo\n"
+" ``diff`` também terão o mesmo ``files``."
+
+msgid ""
+" Special fields are ``summary`` and ``metadata``:\n"
+" ``summary`` matches the first line of the description.\n"
+" ``metadata`` is equivalent to matching ``description user date``\n"
+" (i.e. it matches the main metadata fields)."
+msgstr ""
+" Os campos especiais são ``summary`` (sumário) e ``metadata`` (metadados):\n"
+" ``summary`` corresponde à primeira linha da descrição.\n"
+" ``metadata`` é equivalente a ``description user date``\n"
+" (ou seja, corresponde aos principais campos de metadados)."
+
+msgid ""
+" ``metadata`` is the default field which is used when no fields are\n"
+" specified. You can match more than one field at a time."
+msgstr ""
+" Se não forem especificados campos, será utilizado o campo metadata.\n"
+" Você pode corresponder mais de um campo simultaneamente."
+
+#. i18n: "matching" is a keyword
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching recebe um ou dois argumentos"
+
+#. i18n: "matching" is a keyword
+msgid "matching requires a string as its second argument"
+msgstr "matching exige uma string como segundo argumento"
+
+#. i18n: "matching" is a keyword
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "nome de campo inesperado passado para matching: %s"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+"``reverse(set)``\n"
+" Ordem reversa do conjunto."
+
+msgid ""
+"``roots(set)``\n"
+" Changesets in set with no parent changeset in set."
+msgstr ""
+"``roots(conjunto)``\n"
+" Revisões no conjunto sem revisões pais no conjunto."
+
+msgid ""
+"``secret()``\n"
+" Changeset in secret phase."
+msgstr ""
+"``secret()``\n"
+" A revisão está na fase \"secret\" (secreta)."
+
+#. i18n: "secret" is a keyword
+msgid "secret takes no arguments"
+msgstr "secret não tem argumentos"
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+"``sort(conjunto[, [-]chave...])``\n"
+" Ordena conjunto de acordo com as chaves. A ordem padrão é ascendente,\n"
+" especifique uma chave como ``-chave`` para ordem descendente."
+
+msgid " The keys can be:"
+msgstr " As chaves podem ser:"
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+" - ``rev`` para o número de revisão,\n"
+" - ``branch`` para o nome do ramo,\n"
+" - ``desc`` para a mensagem de consolidação (descrição),\n"
+" - ``user`` para o nome do usuário (``author`` também pode ser usado),\n"
+" - ``date`` para a data de consolidação"
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort exige um ou dois argumentos"
+
+#. i18n: "sort" is a keyword
+msgid "sort spec must be a string"
+msgstr "especificação do sort deve ser uma string"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "especificação de ordenação desconhecida: %r"
+
+#, python-format
+msgid "invalid regular expression: %s"
+msgstr "expressão regular inválida: %s"
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+"``tag([nome])``\n"
+" Se nome for dado, a revisão correspondente à etiqueta\n"
+" especificada por nome; caso contrário, todas as revisões\n"
+" etiquetadas."
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag recebe um ou nenhum argumento"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "o argumento de tag deve ser uma string"
+
+#, python-format
+msgid "no tags exist that match '%s'"
+msgstr "não existem etiquetas que correspondem a '%s'"
+
+msgid ""
+"``unstable()``\n"
+" Non-obsolete changesets with obsolete ancestors."
+msgstr ""
+"``unstable()``\n"
+" Revisões instáveis (revisões não-obsoletas com ancestrais obsoletos)."
+
+#. i18n: "unstable" is a keyword
+msgid "unstable takes no arguments"
+msgstr "unstable não tem argumentos"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+"``user(texto)``\n"
+" O nome do usuário contém texto. A comparação não diferencia\n"
+" maiúsculas e minúsculas."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the string is treated as\n"
+" a regular expression. To match a user that actually contains `re:`, use\n"
+" the prefix `literal:`."
+msgstr ""
+" Se `texto` começar com `re:`, o restante do texto é tratado como\n"
+" uma expressão regular. Para combinar com um usuário que contiver\n"
+" `re:` literalmente, use o prefixo `literal:`."
+
+msgid "can't negate that"
+msgstr "não é possível negar essa expressão"
+
+msgid "not a symbol"
+msgstr "não é um símbolo"
+
+#, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr "detectada expansão infinita no apelido de revset \"%s\""
+
+#, python-format
+msgid "invalid number of arguments: %s"
+msgstr "número de argumentos inválido: %s"
+
+msgid "empty query"
+msgstr "consulta vazia"
+
+#, python-format
+msgid "no changes found (ignored %d secret changesets)\n"
+msgstr "nenhuma mudança encontrada (%d revisões secretas ignoradas)\n"
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr "o valor de ui.portablefilenames é inválido ('%s')"
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr "possível colisão de maiúsculas e minúsculas para %s"
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "o caminho termina em um separador de diretório: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "o caminho contém um componente ilegal: %s"
+
+#, python-format
+msgid "path '%s' is inside nested repo %r"
+msgstr "o caminho '%s' está dentro do repositório aninhado %r"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "o caminho %r percorre o link simbólico %r"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "impossível criar link simbólico para %r: %s"
+
+msgid "empty revision range"
+msgstr "faixa de revisões vazia"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr "gravando remoção de %s como renomeação para %s (%d%% de similaridade)\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+"%s ainda não foi consolidado, então dados de cópia não serão guardados para "
+"%s.\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr "arquivo .hg/requires corrompido"
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr ""
+"formato de repositório desconhecido: requer as funcionalidades '%s' "
+"(atualize o Mercurial)"
+
+msgid "searching for changes\n"
+msgstr "procurando por mudanças\n"
+
+msgid "all local heads known remotely\n"
+msgstr "todas as cabeças locais são conhecidas remotamente\n"
+
+msgid "sampling from both directions\n"
+msgstr "amostrando de ambas as direções\n"
+
+msgid "queries"
+msgstr "consultas"
+
+msgid "searching"
+msgstr "procurando"
+
+msgid "repository is unrelated"
+msgstr "repositório não é relacionado"
+
+msgid "warning: repository is unrelated\n"
+msgstr "aviso: repositório não é relacionado\n"
+
+msgid "searching for exact renames"
+msgstr "procurando por renomeações exatas"
+
+msgid "searching for similar files"
+msgstr "procurando por arquivos similares"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s parece um arquivo binário."
+
+msgid "can only specify two labels."
+msgstr "só pode especificar dois rótulos."
+
+msgid "warning: conflicts during merge.\n"
+msgstr "atenção: conflitos durante a mesclagem.\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "não foi possível processar localização %s"
+
+msgid "password in URL not supported"
+msgstr "senha na URL não é suportada"
+
+msgid "could not create remote repo"
+msgstr "não foi possível criar repositório remoto"
+
+msgid "no suitable response from remote hg"
+msgstr "nenhuma resposta adequada do hg remoto"
+
+#, python-format
+msgid "push refused: %s"
+msgstr "envio recusado: %s"
+
+msgid "ssl connection failed"
+msgstr "a conexão ssl falhou"
+
+msgid "Python SSL support not found"
+msgstr "suporte do Python a SSL não instalado"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "verificação de certificado exige Python 2.6"
+
+msgid "no certificate received"
+msgstr "nenhum certificado recebido"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "o certificado é para %s"
+
+msgid "IDN in certificate not supported"
+msgstr "IDN no certificado não é suportado"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "nenhum commonName ou subjectAltName encontrado no certificado"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "não foi possível encontrar web.cacerts: %s"
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr ""
+"a impressão digital do host para %s não pode ser verificada (versão do "
+"Python muito antiga)"
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr ""
+"aviso: certificado %s não pode ser verificado (versão do Python muito "
+"antiga)\n"
+
+#, python-format
+msgid "%s ssl connection error"
+msgstr "erro de conexão ssl com %s"
+
+#, python-format
+msgid "%s certificate error: no certificate received"
+msgstr "erro de certificado ssl em %s: nenhum certificado recebido"
+
+#, python-format
+msgid "certificate for %s has unexpected fingerprint %s"
+msgstr "certificado para %s tem impressão digital inesperada %s"
+
+msgid "check hostfingerprint configuration"
+msgstr "verifique a configuração hostfingerprint"
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "erro de certificado em %s: %s"
+
+#, python-format
+msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
+msgstr ""
+"configure a hostfingerprint %s ou use --insecure para conectar de modo "
+"inseguro"
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+"aviso: o certificado %s com impressão digital %s não foi verificado "
+"(verifique as opções de configuração hostfingerprints e web.cacerts)\n"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' não parece ser um repositório hg"
+
+msgid "cannot lock static-http repository"
+msgstr "não é possível travar repositório http estático"
+
+msgid "cannot create new static-http repository"
+msgstr "não é possível criar novo repositório http estático"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr "entrada inválida na fncache, linha %s"
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "aviso: arquivo spec de sub-repositório %s não encontrado\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "arquivo spec de sub-repositório %s não encontrado"
+
+#, python-format
+msgid "invalid subrepository revision specifier in .hgsubstate line %d"
+msgstr ""
+"especificador de revisão de sub-repositório inválido na linha %d do arquivo "
+".hgsubstate"
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr "padrão ruim de sub-repositório em %s: %s"
+
+msgid "missing ] in subrepo source"
+msgstr "faltando ] na origem do sub-repositório"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+" origens do sub-repositório para %s diferem\n"
+"usar fonte (l)ocal (%s) ou (r)emota (%s)?"
+
+msgid "&Remote"
+msgstr "&Remoto"
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" local mudou sub-repositório %s, que a remota removeu\n"
+"use (c) a versão alterada, ou (d) apague?"
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" remota mudou sub-repositório %s apagado pela local\n"
+"use (c) a versão alterada ou (d) apague?"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" as origens do sub-repositório %s diferem\n"
+"usar origem (l)ocal (%s) ou (r)emota (%s)?\n"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" as origens do sub-repositório %s diferem (na versão do diretório de trabalho)\n"
+"usar origem (l)ocal (%s) ou (r)emota (%s)?\n"
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "o caminho padrão para o sub-repositório %s não foi encontrado"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "tipo de sub-repositório %s desconhecido"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "empacotando (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "aviso: erro \"%s\" no sub-repositório \"%s\"\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "removendo sub-repositório %s\n"
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "clonando sub-repositório %s de %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "trazendo sub-repositório %s de %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "enviando sub-repositório %s para %s\n"
+
+#, python-format
+msgid "reverting subrepo %s\n"
+msgstr "revertendo sub-repositório %s\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr "executável 'svn' não encontrado para o sub-repositório '%s'"
+
+msgid "cannot retrieve svn tool version"
+msgstr "não é possível obter a versão da ferramenta svn"
+
+msgid "cannot commit svn externals"
+msgstr "não se pode consolidar svn externals"
+
+msgid "cannot commit missing svn entries"
+msgstr "não se pode consolidar entradas svn ausentes"
+
+msgid "failed to commit svn changes"
+msgstr "falha ao consolidar mudanças do svn"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "repositório %s não removido por possuir mudanças.\n"
+
+msgid "cannot retrieve git version"
+msgstr "não é possível obter a versão do git"
+
+msgid "git subrepo requires at least 1.6.0 or later"
+msgstr "sub-repositórios do git exigem a versão 1.6.0 ou posterior"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "a revisão %s não existe no sub-repositório %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr "obtendo detached HEAD no sub-repositório %s\n"
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr "obtenha um ramo do git se você pretender fazer mudanças\n"
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "o sub-repositório %s está faltando"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr "ramo do git não relacionado obtido no sub-repositório %s\n"
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "enviando o ramo %s do sub-repositório %s\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s\n"
+msgstr ""
+"nenhum ramo obtido no sub-repositório %s\n"
+"não é possível fazer push da revisão %s\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, linha %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr "não é possível decodificar entrada"
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "nó '%s' não é bem formado"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags está corrompido, reconstruindo\n"
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+":addbreaks: Qualquer texto. Adiciona uma tag XHTML \"<br />\"\n"
+" antes do fim de cada linha, exceto a última."
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+":age: Data. Devolve uma diferença de data/tempo legível entre\n"
+" a data/hora dada e a data/hora atual."
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+":basename: Qualquer texto. Trata o texto como um caminho, e\n"
+" devolve o último componente do caminho após quebrá-lo\n"
+" usando o separador de caminhos (ignorando separadores à\n"
+" direita). Por exemple, \"foo/bar/baz\" se torna \"baz\"\n"
+" e \"foo/bar//\" se torna \"bar\"."
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+":date: Data. Devolve uma data em um formato de data Unix,\n"
+" incluindo a diferença de fuso horário:\n"
+" \"Mon Sep 04 15:13:13 2006 0700\"."
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+":domain: Qualquer texto. Encontra a primeira string que se\n"
+" pareça com um endereço de e-mail, e extrai apenas a parte\n"
+" do domínio. Por exemplo:\n"
+" ``User <user@example.com>`` se torna ``example.com``."
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+":email: Qualquer texto. Extrai a primeira string que se pareça\n"
+" com um endereço de e-mail. Por exemplo:\n"
+" ``User <user@example.com>`` se torna ``user@example.com``."
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+":escape: Qualquer texto. Substitui os caracteres especiais\n"
+" XML/XHTML \"&\", \"<\" e \">\" por entidades XML."
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ""
+":fill68: Qualquer texto. Quebra o texto para caber em 68\n"
+" colunas."
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ""
+":fill76: Qualquer texto. Quebra o texto para caber em 76\n"
+" colunas."
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ":firstline: Qualquer texto. Devolve a primeira linha do texto."
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+":hex: Qualquer texto. Converte um identificador de nó binário do\n"
+" Mercurial em sua representação longa hexadecimal."
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+":hgdate: Data. Devolve a data como um par de números:\n"
+" \"1157407993 25200\" (timestamp Unix, defasagem de fuso)"
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+":isodate: Data. Devolve a data em formato ISO 8601:\n"
+" \"2009-08-18 13:00 +0200\"."
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+":isodatesec: Data. Devolve a data em formato ISO 8601, incluindo os\n"
+" segundos: \"2009-08-18 13:00:13 +0200\". Veja também o filtro\n"
+" rfc3339date."
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ":localdate: Data. Converte para data local."
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ":nonempty: Qualquer texto. Devolve (none) se o texto for vazio."
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+":obfuscate: Qualquer texto. Devolve o texto de entrada\n"
+" renderizado como uma sequência de entidades XML."
+
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+" interpreting it as per RFC 5322."
+msgstr ""
+":person: Qualquer texto. Devolve o texto antes de um endereço\n"
+" de e-mail, interpretando-o de acordo com a RFC 5322."
+
+msgid ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+msgstr ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+":rfc3339date: Data. Devolve uma data usando o formato de data da\n"
+" Internet especificado na RFC 3339:\n"
+" \"2009-08-18T13:00:13+02:00\"."
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+":rfc822date: Data. Devolve uma data usando o mesmo formato utilizado\n"
+" em cabeçalhos de e-mail:\n"
+" \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+":short: Hash da revisão. Devolve a forma curta do hash de\n"
+" uma revisão, ou seja, uma string hexadecimal de 12 dígitos."
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+":shortbisect: Qualquer texto. Trata o texto como um estado de\n"
+" bissecção, e devolve um caractere único representando o estado\n"
+" (G: boa, B: ruim, S: omitida, U: não testada, I: ignorada).\n"
+" Devolve um único espaço se o texto não for um estado de bissecção\n"
+" válido."
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ":shortdate: Data. Devolve uma data como \"2006-09-18\"."
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+":stringify: Qualquer tipo. Transforma o valor em texto convertendo cada\n"
+" parte em texto e concatenando os resultados."
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+":strip: Qualquer texto. Remove todos os espaços em branco no\n"
+" início e no final do texto."
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+":stripdir: Trata o texto como um caminho e remove um nível\n"
+" de diretório, se possível. Por exemplo, \"foo\" e\n"
+" \"foo/bar\" se tornam \"foo\"."
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+":tabindent: Qualquer texto. Insere um caractere de tabulação no\n"
+" início de cada linha do texto, exceto da primeira."
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+":urlescape: Qualquer texto. Codifica todos os caracteres\n"
+" \"especiais\". Por exemplo, \"foo bar\" se torna\n"
+" \"foo%20bar\"."
+
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+" address."
+msgstr ""
+":user: Qualquer texto. Devolve uma representação curta de um nome\n"
+" de usuário ou endereço de e-mail."
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ""
+":emailuser: Qualquer texto. Devolve a parte do usuário de um endereço de "
+"e-mail."
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ":author: String. O autor da revisão, sem modificações."
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ":bisect: String. O estado de bissecção da revisão."
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ":branch: String. O nome do ramo no qual a revisão foi consolidada."
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+":branches: Lista de strings. O nome do ramo no qual a revisão foi\n"
+" consolidada. Será vazio se o nome do ramo for default."
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ""
+":bookmarks: Lista de strings. Quaisquer marcadores associados à revisão."
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ":children: Lista de strings. As revisões filhas da revisão."
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ":date: Informação de data. A data de consolidação da revisão."
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ":desc: String. O texto da descrição da revisão."
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+":diffstat: String. Estatísticas de mudanças no seguinte\n"
+" formato: \"modified files: +added/-removed lines\""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ":file_adds: Lista de strings. Arquivos adicionados por esta revisão."
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+":file_copies: Lista de strings. Arquivos copiados nesta revisão\n"
+" com suas respectivas origens."
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+":file_copies_switch: Lista de strings. Como \"file_copies\", mas\n"
+" é exibida apenas se a opção --copied estiver definida."
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ":file_dels: Lista de strings. Arquivos removidos por esta revisão."
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ":file_mods: Lista de strings. Arquivos modificados por esta revisão"
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+":files: Lista de strings. Todos os arquivos modificados,\n"
+" adicionados ou removidos por esta revisão."
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+":latesttag: String. A etiqueta global mais recente nos ancestrais desta\n"
+" revisão."
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ":latesttagdistance: Inteiro. O caminho mais longo para a latesttag."
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+":node: String. O hash de identificação da revisão, como uma string\n"
+" hexadecimal de 40 dígitos."
+
+msgid ":phase: String. The changeset phase name."
+msgstr ":phase: String. O nome da fase da revisão."
+
+msgid ":phaseidx: Integer. The changeset phase index."
+msgstr ":phaseidx: Inteiro. O índice da fase da revisão."
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ":rev: Inteiro. O número de ordem da revisão no repositório local."
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ":tags: Lista de strings. Quaisquer etiquetas associadas à revisão."
+
+msgid ""
+":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
+" format. If the changeset has only one \"natural\" parent (the predecessor\n"
+" revision) nothing is shown."
+msgstr ""
+":parents: Lista de strings. Os pais da revisão no formato \"rev:node\".\n"
+" Se a revisão só tiver um pai \"natural\" (a revisão predecessora),\n"
+" nada é exibido."
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "método desconhecido '%s'"
+
+msgid "expected a symbol"
+msgstr "esperado um símbolo"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "função desconhecida '%s'"
+
+msgid "expected template specifier"
+msgstr "esperado um especificador de modelo"
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "o filtro %s espera um argumento"
+
+msgid "unmatched quotes"
+msgstr "aspas não combinam"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "estilo não encontrado: %s"
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" não está no mapa de modelo"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "arquivo de modelo %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr "não é possível usar transação quando já estiver consolidada/abortada"
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "falha ao truncar %s\n"
+
+msgid "transaction abort!\n"
+msgstr "transação abortada!\n"
+
+msgid "rollback completed\n"
+msgstr "desfazimento completado\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "rollback falhou - por favor execute hg recover\n"
+
+msgid "already have changeset "
+msgstr "já possui a revisão "
+
+#, python-format
+msgid "not trusting file %s from untrusted user %s, group %s\n"
+msgstr "não confiando em arquivo %s de usuário não confiável %s, grupo %s\n"
+
+#, python-format
+msgid "ignored: %s\n"
+msgstr "ignorado: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr "('%%' obsoleto em caminho %s=%s de %s)\n"
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s não é uma booleana ('%s')"
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s não é um inteiro ('%s')"
+
+msgid "enter a commit username:"
+msgstr "entre o nome do usuário para consolidação:"
+
+#, python-format
+msgid "no username found, using '%s' instead\n"
+msgstr "nome de usuário não encontrado, usando '%s'\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "nome de usuário não fornecido (veja \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "nome de usuário %s contém quebra de linha\n"
+
+msgid "response expected"
+msgstr "resposta esperada"
+
+msgid "unrecognized response\n"
+msgstr "resposta desconhecida\n"
+
+msgid "password: "
+msgstr "senha: "
+
+msgid "http authorization required"
+msgstr "autorização http requerida"
+
+msgid "http authorization required\n"
+msgstr "autorização http requerida\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "domínio: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "usuário: %s\n"
+
+msgid "user:"
+msgstr "usuário:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "autenticação http: usuário %s, senha %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "falha ao executar o comando '%s' : %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr "o nome de arquivo contém '%s', que é um nome reservado em Windows"
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr "o nome de arquivo contém '%s', que é inválido em Windows"
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr "o nome de arquivo termina em '%s', o que não é permitido em Windows"
+
+msgid "check your clock"
+msgstr "verifique seu relógio"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "timestamp negativo: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "data inválida: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "data supera 32 bits: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "valor de data negativo: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "fuso horário impossível: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "datas não podem conter apenas espaços em branco"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr "especificação de dia inválida, use '<DATA'"
+
+msgid "invalid day spec, use '>DATE'"
+msgstr "especificação de dia inválida, use '>DATA'"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "especificação de dia inválida: %s"
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr "%s não pode ser negativo (veja 'hg help dates')"
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f bytes"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "nenhum número de porta associado ao serviço '%s'"
+
+msgid "file:// URLs can only refer to localhost"
+msgstr "URLs file:// só podem se referir a localhost"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "impossível verificar bundle ou repositório remoto"
+
+msgid "interrupted"
+msgstr "interrompido"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "%s vazio ou faltando"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "comprimento dos dados difere de %d bytes"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "índice contém %d bytes extras"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "aviso: `%s' usa revlog no formato 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "aviso: `%s' usa revlog no formato 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "rev %d aponta para revisão inexistente %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "rev %d aponta para revisão inesperada %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (esperado %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "pai 1 %s de %s desconhecido"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "pai 2 %s de %s desconhecido"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "checando pais de %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "revisão duplicada %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "transação abandonada encontrada - execute hg recover\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "repositório utiliza revlog no formato %d\n"
+
+msgid "checking changesets\n"
+msgstr "checando revisões\n"
+
+msgid "checking"
+msgstr "checando"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "desempacotando revisão %s"
+
+msgid "checking manifests\n"
+msgstr "checando manifestos\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s não está em revisões"
+
+msgid "file without name in manifest"
+msgstr "arquivo sem nome no manifesto"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "lendo alterações no manifesto %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "checagem cruzada de arquivos em revisões e no manifesto\n"
+
+msgid "crosschecking"
+msgstr "checagem cruzada"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "revisão se refere a manifesto desconhecido %s"
+
+msgid "in changeset but not in manifest"
+msgstr "na revisão mas não no manifesto"
+
+msgid "in manifest but not in changeset"
+msgstr "no manifesto mas não na revisão"
+
+msgid "checking files\n"
+msgstr "checando arquivos\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "impossível decodificar nome de arquivo '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "revlog quebrado! (%s)"
+
+msgid "missing revlog!"
+msgstr "revlog faltando!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s não está no manifesto"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "o tamanho descompactado é %s, esperado %s"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "descompactando %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "aviso: a origem da cópia de '%s' não está nos pais de %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "revlog de origem %s:%s vazio ou faltando"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr "aviso: %s@%s: revisão fonte da cópia é nullid %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "checando renomeação de %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s não encontrado no manifesto"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "atenção: revlog '%s' órfão"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d arquivos, %d revisões, %d mudanças em arquivos\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "%d avisos encontrados!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "%d erros de integridade encontrados!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(primeira revisão danificada parece ser %d)\n"
+
+msgid "look up remote revision"
+msgstr "procurar revisão remota"
+
+msgid "push failed (unexpected response):"
+msgstr "o push falhou (resposta inesperada):"
+
+msgid "look up remote changes"
+msgstr "procurar mudanças remotas"
+
+msgid "push failed:"
+msgstr "o push falhou:"
diff --git a/i18n/ro.po b/i18n/ro.po
new file mode 100644
index 0000000..d69a669
--- /dev/null
+++ b/i18n/ro.po
@@ -0,0 +1,16116 @@
+# Romanian translation for Mercurial
+# Traducerea în limba română pentru Mercurial
+#
+# Copyright (C) 2010 Matt Mackall <mpm@selenic.com> and others
+#
+#
+# Glosar de traduceri
+# ===================
+# abort a abandona
+# ancestor strămoș
+# branch ramură
+# bundle pachet (fascicul), a crea un pachet
+# change modificare
+# changeset set de modificări
+# changegroup grup de modificări
+# check out a actualiza, a extrage, checkout
+# children fiu
+# commit depozitare, predare, încredințare, commit
+# commit (v) a depozita, a preda, a încredința, commit
+# consistency consistență (termen informatic; sens general: coerență)
+# deprecated învechit
+# diff diff
+# dirstate dirstate
+# discard a înlătura, a renunța la
+# expand a extinde
+# fold a plia
+# flag indicator
+# given specificat
+# guard gardă / a garda
+# head capăt
+# imply a implica, a sugera
+# incoming de primit
+# hook hook, acțiune, ancoră
+# merge a fuziona (a contopi, a îmbina)
+# notation notație
+# pattern tipar
+# remove a înlătura, a elimina
+# repository depozit (magazie)
+# resolve a determina (a rezolva)
+# manage a gestiona
+# manifest manifest (există în română, ca "declarație/listă de mărfuri")
+# map corespondență, mapare
+# merge a fuziona
+# notify a înștiința
+# outgoing de trimis
+# outstanding în suspensie
+# overview rezumat
+# patch patch
+# patch queue/stack o stivă de patch-uri (mq)
+# patch series serie/suită (completă) de patch-uri
+# pull (pull), a aduce, a trage, a extrage,
+# push (push), a duce, a împinge, a difuza, a distribui
+# rebase a repoziționa, a disloca, a deplasa
+# remote la distanță
+# rejects respingeri, rejectări
+# retrieve a recupera, a regăsi
+# revert a reveni
+# revlog revlog
+# rollback ???
+# shelf ? raft
+# shelve ? a pune pe raft
+# switch a comuta
+# tag etichetă / a eticheta
+# template tipar
+# tip vârf
+# topmost patch ultimul patch aplicat
+# track a urmări
+# traceback ?
+# undo a anula, a reface, a desface
+# unrelated/unversioned/unmanaged/untracked repository depozit neînrudit/neversionat/negestionat/neurmărit
+# update a actualiza
+# (un)trusted ?
+# working directory directorul de lucru
+#
+# NOTĂ: - Terminologia de mai sus este departe de a fi completă sau perfectă.
+# De completat și ameliorat
+# - Primul termen este cel considerat momentan cel mai potrivit.
+# - Măcar pentru primele versiuni, se recomandă păstrarea în paranteze
+# a termenului englezesc, mai ales în cazul comenzilor.
+#
+# Câteva reguli:
+# - în ajutorul pentru o comandă, primul rând începe cu un verb
+# la prezent fără majusculă
+# - în ajutorul pentru o comandă, descrierea opțiunilor se face
+# printr-un verb la prezent, pers. a 3-a singular
+#
+# Dicționar de termeni curenți:
+# - a patch queue/stack o stivă de patch-uri (mq)
+# - the patch series seria/suita (completă) de patch-uri
+# - rejects respingeri, rejectări
+# - to revert a reveni
+# - the topmost patch ultimul patch aplicat
+# - an unrelated repository un depozit neînrudit
+# - unversioned neversionat
+# unmanaged negestionat
+# untracked neurmărit
+# - the working directory directorul de lucru
+#
+# Termeni de păstrat din engleză:
+# - a diff un diff
+# - a hook un hook
+# - a patch un patch
+#
+# Daniel Dumitriu <daniel.dumitriu@gmail.com>, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2011-06-08 15:03+0200\n"
+"PO-Revision-Date: 2011-06-08 17:00+0200\n"
+"Last-Translator: Daniel Dumitriu <daniel.dumitriu@gmail.com>\n"
+"Language-Team: Romanian <>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > "
+"0 && n%100 < 20)) ? 1 : 2;\n"
+"X-Generator: Lokalize 1.0\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (implicit: %s)"
+
+msgid "Options"
+msgstr "Opțiuni"
+
+msgid "Commands"
+msgstr "Comenzi"
+
+msgid "Extensions"
+msgstr "Extensii"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+
+msgid "Options:"
+msgstr "Opțiuni:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " alias: %s"
+
+msgid "hooks for controlling repository access"
+msgstr "hook-uri pentru controlul accesului la depozit"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"Acest hook realizează permiterea sau interzicerea accesului\n"
+"în scriere la anumite ramuri și căi ale unui depozit, atunci când \n"
+"se primesc seturi de modificări prin pretxnchangegroup și pretxncommit."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"Autorizația este căutată pe baza numelui de utilizator local\n"
+"de pe sistemul unde rulează hook-ul, nu pe baza numelui celui care a\n"
+"publicat setul de modificări original (pentru că acesta e pur informativ)."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"Hook-ul acl e folosit optim împreună cu un shell restrictiv precum\n"
+"hgsh, care împiedică utilizatorii care doresc să se autentifice să aibă\n"
+"alte acțiuni în afară de push și pull. Hook-ul nu prezintă siguranță\n"
+"dacă utilizatorii au acces la shell interactiv, deoarece astfel ei pot\n"
+"dezactiva hook-ul. De asemenea, nu prezintă siguranță situația în\n"
+"care utilizatorii la distanță partajează un cont, deoarece nu există\n"
+"posibilitatea de a-i distinge."
+
+msgid "The order in which access checks are performed is:"
+msgstr "Ordinea în care se fac verificările de acces este:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+"1) Lista cu interdicții pentru ramuri (secțiunea ``acl.deny.branches``)\n"
+"2) Lista cu permisiuni pentru ramuri (secțiunea ``acl.allow.branches``)\n"
+"3) Lista cu interdicții pentru căi (secțiunea ``acl.deny``)\n"
+"4) Lista cu permisiuni pentru căi (secțiunea ``acl.allow``)"
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr "Secțiunile cu permisiuni și interdicții conțin perechi cheie-valoare."
+
+msgid ""
+"Branch-based Access Control\n"
+"..........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+"Utilizați secțiunile ``acl.deny.branches`` și ``acl.allow.branches``\n"
+"pentru a avea controlul accesului pe baza ramurii. În aceste secțiuni,\n"
+"cheile pot fi:"
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- un nume de ramură, sau\n"
+"- un asterisc, însemnând orice ramură;"
+
+msgid "The corresponding values can be either:"
+msgstr "Valorile corespunzatoare pot fi:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+"- o listă separată prin virgule conținând utilizatori și grupuri, sau\n"
+"- un asterisc, însemnând oricine;"
+
+msgid ""
+"Path-based Access Control\n"
+"........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+
+msgid ""
+"Groups\n"
+"......"
+msgstr ""
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+
+msgid ""
+"Example Configuration\n"
+"....................."
+msgstr ""
+
+msgid "::"
+msgstr ""
+
+msgid " [hooks]"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+
+msgid " [acl.deny.branches]"
+msgstr ""
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+
+msgid " [acl.allow.branches]"
+msgstr ""
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+
+msgid ""
+" # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
+" # access to any file under the \"resources\" folder (except for 1\n"
+" # file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+
+msgid " .hgtags = release_engineer"
+msgstr ""
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr ""
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr ""
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+
+msgid "The hook does not change bug status."
+msgstr ""
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr ""
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment."
+msgstr ""
+
+msgid "Configuration items common to all access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches ``Bug\n"
+" 1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
+" ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
+" insensitive."
+msgstr ""
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+
+msgid " committer = Bugzilla user"
+msgstr ""
+
+msgid " See also the ``[usermap]`` section."
+msgstr ""
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+
+msgid "XMLRPC access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+
+msgid "MySQL access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configurations:"
+msgstr "Configurări exemplu:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` wityh password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr ""
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr ""
+
+msgid "unknown database schema"
+msgstr ""
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr ""
+
+msgid "telling bugzilla to send mail:\n"
+msgstr ""
+
+#, python-format
+msgid " bug %s\n"
+msgstr ""
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr ""
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr ""
+
+msgid "done\n"
+msgstr ""
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr ""
+
+msgid "configuration 'bzemail' missing"
+msgstr "Lipsește configurarea 'bzemail'"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr "Nu s-a găsit email-ul utilizatorului bugzilla implicit %s "
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr ""
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Eroare Bugzilla: %s"
+
+msgid "command to display child changesets"
+msgstr "comandă pentru afișarea seturilor de modificări fii"
+
+msgid "show the children of the given or working directory revision"
+msgstr "afișează copiii reviziei specificate sau a celei din directorul curent"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr "afișează fiii reviziei specificate"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr ""
+
+msgid "command to display statistics about repository history"
+msgstr "comandă pentru afișarea statisticilor despre istoricul depozitului"
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr ""
+
+msgid "analyzing"
+msgstr ""
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> = <actual email>"
+msgstr " <email alias> = <email actual>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "se omite alias-ul eronat %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+msgid "DATE"
+msgstr ""
+
+msgid "count rate for revisions matching date spec"
+msgstr ""
+
+msgid "TEMPLATE"
+msgstr "ȘABLON"
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "FORMAT"
+msgstr ""
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "display added/removed lines separately"
+msgstr ""
+
+msgid "FILE"
+msgstr ""
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr ""
+
+msgid "colorize output from some commands"
+msgstr "colorează afișajul unor comenzi"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+
+msgid " bookmarks.current = green"
+msgstr ""
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+
+msgid ""
+"The color extension will try to detect whether to use terminfo, ANSI\n"
+"codes or Win32 console APIs, unless it is made explicit; e.g.::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" mode = ansi"
+msgstr ""
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color."
+msgstr ""
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr ""
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr ""
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+"când să se coloreze (boolean, `always`=întotdeauna, auto, sau "
+"`never`=niciodată)"
+
+msgid "TYPE"
+msgstr ""
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+"importă în Mercurial revizii din alte sisteme de control al versiunilor"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" Dacă nu se specifică numele directorului destinație, acesta va fi\n"
+" implicit numele de bază (basename) al sursei, plus sufixul ``-hg``.\n"
+" Dacă depozitul destinație nu există, va fi creat."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+
+msgid " source author = destination author"
+msgstr ""
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+
+msgid " include path/to/file-or-dir"
+msgstr ""
+
+msgid " exclude path/to/file-or-dir"
+msgstr ""
+
+msgid " rename path/to/source path/to/destination"
+msgstr ""
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+
+msgid " key parent1, parent2"
+msgstr ""
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+
+msgid " original_branch_name new_branch_name"
+msgstr ""
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ''''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes and boolean argument\n"
+" and defaults to False."
+msgstr ""
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ''''''''''"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The following options can be used with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" '''''''''''''''''"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid " The following options can be set with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" '''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" '''''''''''''''''''''"
+msgstr ""
+
+msgid " The following options are supported:"
+msgstr ""
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "remap usernames using this file"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr "afișează seturile de modificări părinte"
+
+msgid "show current changeset in ancestor branches"
+msgstr "afișează setul de modificări curent în ramurile strămoș"
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr ""
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ""
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ""
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr ""
+
+msgid "Bazaar modules could not be loaded"
+msgstr ""
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr ""
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr ""
+
+#, python-format
+msgid "%s error:\n"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr ""
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: tipul depozitului sursă este invalid"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr ""
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr ""
+
+#, python-format
+msgid "convert: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr ""
+
+msgid "getting files"
+msgstr "se obțin fișierele"
+
+msgid "revisions"
+msgstr ""
+
+msgid "scanning"
+msgstr ""
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr ""
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr ""
+
+msgid "not all revisions were sorted"
+msgstr ""
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr ""
+
+msgid "sorting...\n"
+msgstr ""
+
+msgid "converting...\n"
+msgstr ""
+
+#, python-format
+msgid "source: %s\n"
+msgstr ""
+
+msgid "converting"
+msgstr ""
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr ""
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr ""
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr ""
+
+msgid "CVS pserver authentication failed"
+msgstr ""
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr ""
+
+msgid "malformed response from CVS"
+msgstr ""
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr ""
+
+msgid "collecting CVS rlog\n"
+msgstr ""
+
+msgid "not a CVS sandbox"
+msgstr ""
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr ""
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr ""
+
+#, python-format
+msgid "running %s\n"
+msgstr ""
+
+msgid "RCS file must be followed by working file"
+msgstr ""
+
+msgid "must have at least some revisions"
+msgstr ""
+
+msgid "expected revision number"
+msgstr ""
+
+msgid "revision must be followed by date line"
+msgstr ""
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d log entries\n"
+msgstr ""
+
+msgid "creating changesets\n"
+msgstr ""
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr ""
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr ""
+
+msgid "Python ElementTree module is not available"
+msgstr ""
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr ""
+
+msgid "failed to detect repository format!"
+msgstr ""
+
+msgid "internal calling inconsistency"
+msgstr ""
+
+msgid "errors in filemap"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr ""
+
+msgid "source repository doesn't support --filemap"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr ""
+
+msgid "cannot retrieve git heads"
+msgstr ""
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr ""
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr ""
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr ""
+
+msgid "cannot find a GNU Arch tool"
+msgstr ""
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr ""
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr ""
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr ""
+
+msgid "filtering out empty revision\n"
+msgstr ""
+
+msgid "updating tags\n"
+msgstr "se actualizează etichetele\n"
+
+msgid "updating bookmarks\n"
+msgstr "se actualizează semnele de carte\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr ""
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr ""
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr ""
+
+msgid "bad mtn packet - no divider before size"
+msgstr ""
+
+msgid "bad mtn packet - no end of packet size"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr ""
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr ""
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+msgid "unable to determine mtn automate interface version"
+msgstr ""
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr ""
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr ""
+
+msgid "reading p4 views\n"
+msgstr ""
+
+msgid "collecting p4 changelists\n"
+msgstr ""
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s nu pare a fi un depozit Subversion"
+
+msgid "Could not load Subversion python bindings"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr ""
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr ""
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr ""
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr ""
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr ""
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr ""
+
+msgid "scanning paths"
+msgstr ""
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr ""
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr ""
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr ""
+
+msgid "unexpected svn output:\n"
+msgstr ""
+
+msgid "unable to cope with svn output"
+msgstr ""
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr ""
+
+msgid "automatically manage newlines in repository files"
+msgstr ""
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr ""
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+
+msgid ""
+"The extension uses an optional ``[eol]`` section in your hgrc file\n"
+"(not the ``.hgeol`` file) for settings that control the overall\n"
+"behavior. There are two settings:"
+msgstr ""
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr ""
+
+msgid "end-of-line check failed:\n"
+msgstr ""
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr ""
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr ""
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr ""
+
+msgid "cleaning up temp directory\n"
+msgstr ""
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "CMD"
+msgstr "CMD"
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "OPT"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "revision"
+msgstr "revizia"
+
+msgid "change made by revision"
+msgstr ""
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr ""
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [OPȚIUNE]... [FIȘIER]..."
+
+msgid "pull, update and merge in one command"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+"preia modificări dintr-un depozit la distanță, fuzionează modificările noi "
+"dacă este necesar"
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" Găsește toate modificările din depozit la calea sau URL-ul\n"
+" specificat și le adaugă la depozitul local."
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" Vezi :hg:`help dates` pentru o listă de formate valide cu d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+
+msgid "outstanding uncommitted merge"
+msgstr "fuziune nedepozitată în suspensie"
+
+msgid "outstanding uncommitted changes"
+msgstr "modificări nedepozitate în suspensie"
+
+msgid "working directory is missing some files"
+msgstr ""
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr ""
+
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "se actualizează la %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+
+msgid "a specific revision you would like to pull"
+msgstr ""
+
+msgid "edit commit message"
+msgstr ""
+
+msgid "edit commit message (DEPRECATED)"
+msgstr ""
+
+msgid "switch parents when merging"
+msgstr ""
+
+msgid "hg fetch [SOURCE]"
+msgstr ""
+
+msgid "commands to sign and verify changesets"
+msgstr ""
+
+msgid "error while verifying signature"
+msgstr ""
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr ""
+
+msgid "hg sigs"
+msgstr ""
+
+msgid "list signed changesets"
+msgstr ""
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr ""
+
+msgid "hg sigcheck REVISION"
+msgstr ""
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr ""
+
+msgid "make the signature local"
+msgstr ""
+
+msgid "sign even if the sigfile is modified"
+msgstr ""
+
+msgid "do not commit the sigfile after signing"
+msgstr ""
+
+msgid "ID"
+msgstr ""
+
+msgid "the key id to sign with"
+msgstr ""
+
+msgid "TEXT"
+msgstr ""
+
+msgid "commit message"
+msgstr ""
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr "hg sign [OPÈšIUNE]... [REVIZIE].."
+
+msgid "add a signature for the current or given revision"
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Vezi :hg:`help dates` pentru o listă de formate valide cu d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr ""
+
+msgid "error while signing"
+msgstr ""
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+
+msgid "unknown signature version"
+msgstr ""
+
+msgid "command to view revision graphs from a shell"
+msgstr ""
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr ""
+
+msgid "-G/--graph option is incompatible with --follow with file argument"
+msgstr ""
+
+msgid "NUM"
+msgstr ""
+
+msgid "limit number of changes displayed"
+msgstr "limitează numărul de modificări afișat"
+
+msgid "show patch"
+msgstr "afișează patch-ul"
+
+msgid "show the specified revision or range"
+msgstr "afișează revizia sau intervalul specificat"
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr ""
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "afișează istoricul reviziilor împreună cu un graf ASCII al reviziilor"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+" Afișează un istoric al reviziilor împreună cu un graf al reviziilor\n"
+" desenat cu caractere ASCII."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Nodurile afișate cu un caracter @ sunt părinți ai directorului de "
+"lucru.\n"
+" "
+
+msgid "show the revision DAG"
+msgstr "afișează graful (DAG) reviziilor"
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr ""
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr ""
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "se abandonează hg cat-fișierul înțelege doar depozitări\n"
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr "pornește vizualizatorul interactiv al istoricului"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr ""
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr ""
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr ""
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr ""
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr ""
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr ""
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr ""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr ""
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr ""
+
+msgid "used internally by daemon mode"
+msgstr ""
+
+msgid "minutes to sit idle before exiting"
+msgstr ""
+
+msgid "name of file to write process ID to"
+msgstr ""
+
+msgid "hg inserve [OPTION]..."
+msgstr ""
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr ""
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+msgid "cannot start: socket is already bound"
+msgstr ""
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid "Three additional date template filters are provided:"
+msgstr ""
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+#, fuzzy
+msgid "show default keyword template maps"
+msgstr "afișează corespondențele șabloanelor implicite de cuvinte cheie"
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default svn keywordset\n"
+msgstr ""
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "hg keyword configuration and expansion example"
+msgstr ""
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr "afișează fișierele excluse de la expandare"
+
+msgid "only show unknown (not tracked) files"
+msgstr "afișează doar fișierele necunoscute (neurmărite)"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr "afișează fișierele configurate pentru expandarea cuvintelor cheie"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr ""
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr ""
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command.\n"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr ""
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "linie de stare mq eronată: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr ""
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr ""
+
+msgid "guard cannot be an empty string"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr ""
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr ""
+
+#, python-format
+msgid "guard %r too short"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "se permite %s - gardat de către %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "se omite %s - gardat de către %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "se omite %s - nu există gărzi care se potrivesc\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "update returned %d"
+msgstr ""
+
+msgid "repo commit failed"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr ""
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr ""
+
+#, python-format
+msgid "applying %s\n"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr ""
+
+msgid "repository commit failed"
+msgstr "depozitarea a eșuat"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "revizia %s face referință la patch-uri necunoscute: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "patch-uri necunoscute: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr ""
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr ""
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr ""
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr ""
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr ""
+
+msgid "no patches applied"
+msgstr ""
+
+msgid "working directory revision is not qtip"
+msgstr ""
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "modificări nedepozitate în subdepozitul %s"
+
+msgid "local changes found, refresh first"
+msgstr ""
+
+msgid "local changes found"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr ""
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr ""
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr ""
+
+msgid "cannot manage merge changesets"
+msgstr ""
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr ""
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series"
+msgstr ""
+
+msgid "(working directory not at a head)\n"
+msgstr ""
+
+msgid "no patches in series\n"
+msgstr ""
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr ""
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr ""
+
+#, python-format
+msgid "guarded by %s"
+msgstr ""
+
+msgid "no matching guards"
+msgstr ""
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr ""
+
+msgid "all patches are currently applied\n"
+msgstr ""
+
+msgid "patch series already fully applied\n"
+msgstr ""
+
+msgid "cannot use --exact and --move together"
+msgstr ""
+
+msgid "cannot push --exact with applied patches"
+msgstr "nu se poate executa push --exact cu patch-uri aplicate"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr ""
+
+msgid "please specify the patch to move"
+msgstr ""
+
+msgid "cleaning up working directory..."
+msgstr ""
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr ""
+
+#, python-format
+msgid "now at: %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr ""
+
+msgid "no patches applied\n"
+msgstr ""
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr ""
+
+msgid "qpop: forcing dirstate update\n"
+msgstr ""
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr ""
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr ""
+
+msgid "patch queue now empty\n"
+msgstr ""
+
+msgid "cannot refresh a revision with children"
+msgstr ""
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+
+msgid "patch queue directory already exists"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr ""
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr ""
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "updating queue directory\n"
+msgstr "se actualizează directorul coadă\n"
+
+msgid "Unable to load queue repository\n"
+msgstr ""
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr ""
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr ""
+
+msgid "option \"-r\" not valid when importing files"
+msgstr ""
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr ""
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr ""
+
+msgid "-e is incompatible with import from -"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr ""
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr ""
+
+msgid "need --name to import a patch from -"
+msgstr ""
+
+#, python-format
+msgid "unable to read file %s"
+msgstr ""
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr ""
+
+msgid "keep patch file"
+msgstr "păstrează fișierul patch"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr ""
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+
+msgid "show only the last patch"
+msgstr "afișează doar ultimul patch"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "print the patches already applied"
+msgstr ""
+
+msgid " Returns 0 on success."
+msgstr ""
+" Returnează 0 în caz de succes.\n"
+" "
+
+msgid "only one patch applied\n"
+msgstr ""
+
+msgid "show only the first patch"
+msgstr "afișează doar primul patch"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "print the patches not yet applied"
+msgstr ""
+
+msgid "all patches applied\n"
+msgstr ""
+
+msgid "import file in patch directory"
+msgstr ""
+
+msgid "NAME"
+msgstr "NUME"
+
+msgid "name of patch file"
+msgstr ""
+
+msgid "overwrite existing files"
+msgstr ""
+
+msgid "place existing revisions under mq control"
+msgstr ""
+
+msgid "use git extended diff format"
+msgstr "folosește formatul diff extins al lui git"
+
+msgid "qpush after importing"
+msgstr ""
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr ""
+
+msgid "import a patch"
+msgstr ""
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+
+msgid " To import an existing patch while renaming it::"
+msgstr ""
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr ""
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Returnează 0 dacă importarea a avut loc cu succes.\n"
+" "
+
+msgid "create queue repository"
+msgstr ""
+
+msgid "hg qinit [-c]"
+msgstr ""
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr ""
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr "folosește protocolul 'pull' pentru a copia metadatele"
+
+msgid "do not update the new working directories"
+msgstr ""
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "folosește transfer necomprimat (rapid în LAN)"
+
+msgid "REPO"
+msgstr ""
+
+msgid "location of source patch repository"
+msgstr ""
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "clone main and patch repository at same time"
+msgstr ""
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr ""
+
+msgid "cloning main repository\n"
+msgstr ""
+
+msgid "cloning patch repository\n"
+msgstr ""
+
+msgid "stripping applied patches from destination repository\n"
+msgstr ""
+
+msgid "updating destination repository\n"
+msgstr "se actualizează depozitul destinație\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr ""
+
+msgid "print patches not in series"
+msgstr ""
+
+msgid "hg qseries [-ms]"
+msgstr ""
+
+msgid "print the entire series file"
+msgstr ""
+
+msgid "hg qtop [-s]"
+msgstr ""
+
+msgid "print the name of the current patch"
+msgstr ""
+
+msgid "hg qnext [-s]"
+msgstr ""
+
+msgid "print the name of the next patch"
+msgstr ""
+
+msgid "hg qprev [-s]"
+msgstr ""
+
+msgid "print the name of the previous patch"
+msgstr ""
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr ""
+
+msgid "add \"From: <current user>\" to patch"
+msgstr ""
+
+msgid "USER"
+msgstr ""
+
+msgid "add \"From: <USER>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr ""
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr ""
+
+msgid "create a new patch"
+msgstr "creează un nou patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Returnează 0 dacă patch-ul a fost creat cu succes.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr ""
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+msgid "add/update date field in patch with current date"
+msgstr ""
+
+msgid "add/update date field in patch with given date"
+msgstr ""
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr ""
+
+msgid "update the current patch"
+msgstr "actualizează patch-ul curent"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr ""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "diff pentru patch-ul curent și modificările ulterioare"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+
+msgid "edit patch header"
+msgstr ""
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr ""
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr ""
+
+#, python-format
+msgid "Skipping already folded patch %s\n"
+msgstr "Se omite patch-ul deja pliat %s\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "error folding patch %s"
+msgstr ""
+
+msgid "overwrite any local changes"
+msgstr ""
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr ""
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr ""
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr ""
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr ""
+
+#, python-format
+msgid "no patch named %s"
+msgstr ""
+
+msgid "hg qheader [PATCH]"
+msgstr ""
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+msgid "apply on top of local changes"
+msgstr ""
+
+msgid "apply the target patch to its recorded parent"
+msgstr ""
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr ""
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr ""
+
+msgid "merge queue name (DEPRECATED)"
+msgstr ""
+
+msgid "reorder patch series and apply only the patch"
+msgstr ""
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr ""
+
+msgid "push the next patch onto the stack"
+msgstr "pune patch-ul următor pe stivă"
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost."
+msgstr ""
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr ""
+
+msgid "pop all patches"
+msgstr ""
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr ""
+
+msgid "forget any local changes to patched files"
+msgstr "uită orice modificare locală adusă fișierelor peticite"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr ""
+
+msgid "pop the current patch off the stack"
+msgstr "scoate patch-ul curent de pe stivă"
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack."
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr ""
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr ""
+
+msgid "rename a patch"
+msgstr ""
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr ""
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr ""
+
+msgid "save current queue state (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr ""
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr ""
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+"forțează înlăturarea seturilor de modificări, renunță la modificările "
+"nedepozitate (fără copie de siguranță)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+
+msgid "no backups"
+msgstr ""
+
+msgid "no backups (DEPRECATED)"
+msgstr ""
+
+msgid "do not modify working copy during strip"
+msgstr ""
+
+msgid "hg strip [-k] [-f] [-n] REV..."
+msgstr "hg strip [-k] [-f] [-n] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr ""
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+
+msgid "empty revision set"
+msgstr "setul de revizii este vid"
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr ""
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+
+msgid "no revisions specified"
+msgstr ""
+
+msgid "list all available queues"
+msgstr ""
+
+msgid "create new queue"
+msgstr ""
+
+msgid "rename active queue"
+msgstr ""
+
+msgid "delete reference to queue"
+msgstr ""
+
+msgid "delete queue, and remove patch dir"
+msgstr ""
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[OPÈšIUNE] [COADÄ‚]"
+
+msgid "manage multiple patch queues"
+msgstr ""
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\"."
+msgstr ""
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+
+msgid "patches applied - cannot set new queue active"
+msgstr ""
+
+msgid "cannot delete queue that does not exist"
+msgstr ""
+
+msgid "cannot delete currently active queue"
+msgstr ""
+
+msgid " (active)\n"
+msgstr ""
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr ""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr ""
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr ""
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "depozitul %s neaflat în coadă există deja"
+
+msgid "use --create to create a new queue"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr ""
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr ""
+
+msgid "only a local queue repository may be initialized"
+msgstr ""
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr ""
+
+msgid "no queue repository"
+msgstr ""
+
+#, python-format
+msgid "%d applied"
+msgstr ""
+
+#, python-format
+msgid "%d unapplied"
+msgstr ""
+
+msgid "mq: (empty queue)\n"
+msgstr ""
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+
+msgid "mq takes no arguments"
+msgstr ""
+
+msgid "operate on patch repository"
+msgstr "operează pe depozitul de patch-uri"
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this "
+"list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" merge = False # send notification for merges (default True)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+"Dacă doriți, puteți pune un fișier de configurare pentru `notify` în\n"
+"depozitul spre care utilizatorii pot trimite modificări, ei își pot\n"
+"gestiona propriile abonări.\n"
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr ""
+"când să se pagineze (boolean, `always`=întotdeauna, auto, sau "
+"`never`=niciodată)"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+#, python-format
+msgid "%s Please enter a valid value"
+msgstr ""
+
+msgid "Please enter a valid value.\n"
+msgstr ""
+
+msgid "send patches as attachments"
+msgstr ""
+
+msgid "send patches as inline attachments"
+msgstr ""
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "ask for confirmation before sending"
+msgstr ""
+
+msgid "add diffstat output to messages"
+msgstr ""
+
+msgid "use the given date as the sending date"
+msgstr ""
+
+msgid "use the given file as the series description"
+msgstr ""
+
+msgid "email address of sender"
+msgstr ""
+
+msgid "print messages that would be sent"
+msgstr ""
+
+msgid "write messages to mbox file instead of sending them"
+msgstr ""
+
+msgid "email addresses replies should be sent to"
+msgstr ""
+
+msgid "subject of first message (intro or single patch)"
+msgstr ""
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr ""
+
+msgid "omit hg patch header"
+msgstr ""
+
+msgid "send changes not found in the target repository"
+msgstr ""
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+
+msgid "name of the bundle attachment file"
+msgstr ""
+
+msgid "a revision to send"
+msgstr ""
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+"execută chiar când depozitul la distanță este neînrudit\n"
+"(cu -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr ""
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr ""
+
+msgid "send changesets by email"
+msgstr ""
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "se compară cu %s\n"
+
+msgid "no changes found\n"
+msgstr "nu s-au găsit modificări\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr ""
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr ""
+
+msgid "use only one form to specify the revision"
+msgstr ""
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr ""
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+
+msgid "are you sure you want to send (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+msgid "patchbomb canceled"
+msgstr ""
+
+msgid "Displaying "
+msgstr ""
+
+msgid "Writing "
+msgstr ""
+
+msgid "writing"
+msgstr ""
+
+msgid "Sending "
+msgstr ""
+
+msgid "sending"
+msgstr ""
+
+msgid "show progress bars for some actions"
+msgstr "afișează bare de progres pentru anumite acțiuni"
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+
+msgid "The following settings are available::"
+msgstr ""
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr ""
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr ""
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr ""
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr ""
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr ""
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr ""
+
+#, python-format
+msgid "%d %s/sec"
+msgstr ""
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+msgid "abort if an error occurs"
+msgstr ""
+
+msgid "purge ignored files too"
+msgstr ""
+
+msgid "print filenames instead of deleting them"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr ""
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr ""
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "rebase from the specified changeset"
+msgstr ""
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+
+msgid "rebase onto the specified changeset"
+msgstr "repoziționează la setul de modificări specificat"
+
+msgid "collapse the rebased changesets"
+msgstr "restrânge seturile de modificări repoziționate"
+
+msgid "use text as collapse commit message"
+msgstr "folosește textul drept mesaj de depozitare pentru colapsare"
+
+msgid "read collapse commit message from file"
+msgstr "citește mesajul pentru depozitare la colapsare din fișier"
+
+msgid "keep original changesets"
+msgstr ""
+
+msgid "keep original branch names"
+msgstr ""
+
+msgid "force detaching of source from its original branch"
+msgstr ""
+
+msgid "specify merge tool"
+msgstr "specifică instrumentul pentru fuziune"
+
+msgid "continue an interrupted rebase"
+msgstr "continuă o repoziționare întreruptă"
+
+msgid "abort an interrupted rebase"
+msgstr "abandonează o repoziționare întreruptă"
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s REV | -b REV] [-d REV] [opțiuni]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+
+msgid "message can only be specified with collapse"
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr "abort și continue nu se pot folosi împreună"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "collapse nu se poate folosi cu continue sau abort"
+
+msgid "cannot use detach with continue or abort"
+msgstr "detach nu se poate folosi cu continue sau abort"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "tool option will be ignored\n"
+msgstr ""
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "detach requires a revision to be specified"
+msgstr ""
+
+msgid "cannot specify a base with detach"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "rebasing"
+msgstr ""
+
+msgid "changesets"
+msgstr ""
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr ""
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "nu există modificări, se omite revizia %d\n"
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "%d revizii au fost omise\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "nu se poate restrânge, există mai mult de un părinte extern"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+"avertisment: au fost detectate seturi de modificări noi în ramura\n"
+"destinație,r nu se poate abandona\n"
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "source is ancestor of destination"
+msgstr ""
+
+msgid "source is descendant of destination"
+msgstr ""
+
+msgid "--tool can only be used with --rebase"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr "repoziționează directorul de lucru la capătul de ramură"
+
+msgid "specify merge tool for rebase"
+msgstr "specifică instrumentul pentru fuziune pentru rebase"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr ""
+
+msgid "this is a binary file\n"
+msgstr ""
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr ""
+
+msgid "&No, skip this change"
+msgstr "&Nu, omite această modificare"
+
+#, fuzzy
+msgid "&Skip remaining changes to this file"
+msgstr "&Omite restul modificărilor pentru acest fișier"
+
+msgid "Record remaining changes to this &file"
+msgstr ""
+
+#, fuzzy
+msgid "&Done, skip remaining changes and files"
+msgstr "În&cheiat, omite restul modificărilor și fișierelor"
+
+msgid "Record &all changes to all remaining files"
+msgstr ""
+
+msgid "&Quit, recording no changes"
+msgstr ""
+
+msgid "&?"
+msgstr ""
+
+msgid "user quit"
+msgstr ""
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+#, python-format
+msgid "record this change to %r?"
+msgstr ""
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr ""
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [OPȚIUNE]... [FIȘIER]..."
+
+msgid "interactively select changes to commit"
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+" y - înregistrează această modificare\n"
+" n - omite această modificare"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - omite restul modificărilor la acest fișier\n"
+" f - înregistrează restul modificărilor la acest fișier"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - încheiat, omite restul modificărilor și fișierelor\n"
+" a - înregistrează toate modificările pentru tot restul fișierelor\n"
+" q - ieși fără a înregistra vreo modificare"
+
+msgid " ? - display help"
+msgstr " ? - afișează ajutorul"
+
+msgid " This command is not available when committing a merge."
+msgstr ""
+
+msgid "interactively record a new patch"
+msgstr "înregistrează interactiv un nou patch"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+
+msgid "'mq' extension not loaded"
+msgstr ""
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr ""
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr ""
+
+msgid "no changes to record\n"
+msgstr ""
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr ""
+
+msgid "interactively select changes to refresh"
+msgstr ""
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+msgid "hardlinks are not supported on this system"
+msgstr ""
+
+msgid "must specify local origin repository"
+msgstr "trebuie să specifice depozitul de origine local"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr ""
+
+msgid "there is nothing to relink\n"
+msgstr ""
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr ""
+
+msgid "collecting"
+msgstr ""
+
+msgid "files"
+msgstr ""
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr ""
+
+msgid "source and destination are on different devices"
+msgstr ""
+
+#, python-format
+msgid "not linkable: %s\n"
+msgstr ""
+
+msgid "pruning"
+msgstr ""
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr ""
+
+msgid "relinking"
+msgstr ""
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr ""
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+
+msgid "After that you can use it like::"
+msgstr ""
+
+msgid " hg clone py://trunk/"
+msgstr ""
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "se omite revizia %s, deja aplicată\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr "se omite setul de modificări de fuziune %s:%s\n"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr ""
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr ""
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: transplantează acest set de modificări\n"
+"n: sari omite set de modificări\n"
+"m: fuzionează la acest set de modificări\n"
+"p: afișează patch-ul\n"
+"c: depozitează seturile de modificări selectate\n"
+"q: anulează transplantul\n"
+"?: afișează acest ajutor\n"
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "no such option\n"
+msgstr "opțiune inexistentă\n"
+
+msgid "pull patches from REPO"
+msgstr ""
+
+msgid "BRANCH"
+msgstr "RAMURÄ‚"
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr "omite REV"
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through command"
+msgstr ""
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr "hg transplant [-s DEPOZIT] [-b RAMURÄ‚ [-a]] [-p REV] [-m REV] [REV]..."
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REVISION --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr "fuziuni nedepozitate în suspensie"
+
+msgid "outstanding local changes"
+msgstr "modificări locale în suspensie"
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr ""
+
+msgid "cannot give prefix when archiving to files"
+msgstr ""
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr ""
+
+msgid "archiving"
+msgstr ""
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr ""
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "se actualizează semnul de carte %s\n"
+
+#, python-format
+msgid "not updating divergent bookmark %s\n"
+msgstr "nu se actualizează semnul de carte divergent %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "se caută semne de carte modificate\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "nu s-au găsit semne de carte modificate\n"
+
+msgid "unknown parent"
+msgstr ""
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr ""
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr ""
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr ""
+
+msgid "empty username"
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr ""
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr ""
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr ""
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr ""
+
+msgid "limit must be a positive integer"
+msgstr ""
+
+msgid "limit must be positive"
+msgstr ""
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr ""
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr ""
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr ""
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog-ul '%s' nu a fost găsit"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr ""
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr ""
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr ""
+
+msgid "no source or destination specified"
+msgstr ""
+
+msgid "no destination specified"
+msgstr ""
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "no files to copy"
+msgstr ""
+
+msgid "(consider using --after)\n"
+msgstr ""
+
+msgid "child process failed to start"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "set de modificări: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ramură: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "semn de carte: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "etichetă: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "părinte: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifest: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "utilizator: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "dată: %s\n"
+
+msgid "files+:"
+msgstr "fișiere+:"
+
+msgid "files-:"
+msgstr "fișiere-:"
+
+msgid "files:"
+msgstr "fișiere:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "fișiere: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "copii: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "extra: %s=%s\n"
+
+msgid "description:\n"
+msgstr "descriere:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "rezumat: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr ""
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr ""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+#, python-format
+msgid "adding %s\n"
+msgstr "se adaugă %s\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr ""
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+
+msgid "HG: Leave message empty to abort commit."
+msgstr ""
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: utilizator: %s"
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr ""
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr ""
+
+#, python-format
+msgid "HG: added %s"
+msgstr ""
+
+#, python-format
+msgid "HG: changed %s"
+msgstr ""
+
+#, python-format
+msgid "HG: removed %s"
+msgstr ""
+
+msgid "HG: no files changed"
+msgstr ""
+
+msgid "empty commit message"
+msgstr ""
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+
+msgid "DIR"
+msgstr "DIR"
+
+msgid "change working directory"
+msgstr "schimbă directorul de lucru "
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr "nu întreba, presupune 'da' pentru orice răspuns solicitat"
+
+msgid "suppress output"
+msgstr "suprimă afișarea"
+
+msgid "enable additional output"
+msgstr "activează afișarea informațiilor suplimentare"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr ""
+"setează/suprascrie opțiunea de configurare (folosiți 'secțiune.nume=valoare')"
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr "activează afișarea informațiilor pentru depanare"
+
+msgid "start debugger"
+msgstr "pornește depanatorul (debugger)"
+
+msgid "set the charset encoding"
+msgstr "setează codificarea pentru setul de caractere"
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr "setează modul de codificare pentru setul de caractere"
+
+msgid "always print a traceback on exception"
+msgstr "în caz de excepție, afișează întotdeauna un traceback"
+
+msgid "time how long the command takes"
+msgstr "durata de execuție a comenzii"
+
+msgid "print command execution profile"
+msgstr "afișează profilul executării comenzii"
+
+msgid "output version information and exit"
+msgstr "afișează informații despre versiune și ieși"
+
+msgid "display help and exit"
+msgstr "afișează ajutorul și ieși"
+
+msgid "do not perform actions, just print output"
+msgstr "acțiunea nu se execută, doar se afișează mesajele"
+
+msgid "specify ssh command to use"
+msgstr "specifică comanda ssh care va fi folosită"
+
+msgid "specify hg command to run on the remote side"
+msgstr "specifică comanda hg care va fi executată pe mașina la distanță"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+"nu verifica certificatul serverului (ignorând configurarea web.cacerts)"
+
+msgid "PATTERN"
+msgstr "TIPAR"
+
+msgid "include names matching the given patterns"
+msgstr "include numele care se potrivesc cu tiparele specificate"
+
+msgid "exclude names matching the given patterns"
+msgstr "exclude numele care se potrivesc cu tiparele specificate"
+
+msgid "use text as commit message"
+msgstr "folosește textul drept mesaj de depozitare"
+
+msgid "read commit message from file"
+msgstr "citește mesajul pentru depozitare din fișier"
+
+msgid "record the specified date as commit date"
+msgstr "înregistrează data specificată drept dată a depozitării"
+
+msgid "record the specified user as committer"
+msgstr ""
+"înregistrează utilizatorul specificat ca fiind cel care a făcut depozitarea"
+
+msgid "STYLE"
+msgstr "STIL"
+
+msgid "display using template map file"
+msgstr "afișează folosind fișierul cu harta de șabloane"
+
+msgid "display with template"
+msgstr "afișează cu șablon"
+
+msgid "do not show merges"
+msgstr "nu afișa fuziunile"
+
+msgid "output diffstat-style summary of changes"
+msgstr "afișează sumarul modificărilor în stil diffstat"
+
+msgid "treat all files as text"
+msgstr "tratează toate fișierele ca text"
+
+msgid "omit dates from diff headers"
+msgstr "omite datele din antetele diff"
+
+msgid "show which function each change is in"
+msgstr "afișează funcția în care se află fiecare modificare"
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr "ignoră spațiul alb la compararea liniilor"
+
+msgid "ignore changes in the amount of white space"
+msgstr "ignoră modificările cantității de spațiu alb"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "ignoră modificările ale căror linii sunt toate vide"
+
+msgid "number of lines of context to show"
+msgstr "numărul liniilor de context care vor fi afișate"
+
+msgid "SIMILARITY"
+msgstr "ASEMÄ‚NARE"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "ghicește fișierele redenumite după asemănare (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "operează recursiv în subdepozite"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[OPȚIUNE]... [FIȘIER]..."
+
+msgid "add the specified files on the next commit"
+msgstr "adaugă fișierele specificate la următoarea depozitare ('commit')"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+" Planifică fișierele pentru a fi luate în evidența sistemului de\n"
+" control al versiunilor și adăugate în depozit."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Fișierele vor fi adăugate în depozit la următoarea depozitare "
+"('commit').\n"
+" Pentru a anula acțiunea înainte de efectuare, folosiți :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr ""
+" Dacă nu se specifică niciun nume, vor fi adăugate în depozit toate "
+"fișierele."
+
+msgid " .. container:: verbose"
+msgstr ""
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Returnează 0 dacă toate fișierele sunt adăugate cu succes.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr ""
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed."
+msgstr ""
+
+msgid "similarity must be a number"
+msgstr ""
+
+msgid "similarity must be between 0 and 100"
+msgstr ""
+
+msgid "annotate the specified revision"
+msgstr "adnotează revizia specificată"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr ""
+"urmărește copierile/redenumirile și afișează numele\n"
+"fișierului (ÎNVECHIT)"
+
+msgid "don't follow copies and renames"
+msgstr "nu urmări copierile și redenumirile"
+
+msgid "list the author (long with -v)"
+msgstr "afișează autorul (lung cu -v)"
+
+msgid "list the filename"
+msgstr "afișează numele fișierului"
+
+msgid "list the date (short with -q)"
+msgstr "afișează data (scurt cu -q)"
+
+msgid "list the revision number (default)"
+msgstr "afișează numele reviziei (implicit)"
+
+msgid "list the changeset"
+msgstr "afișează setul de modificări"
+
+msgid "show line number at the first appearance"
+msgstr "afișează numărul liniei la prima apariție"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FIȘIER..."
+
+msgid "show changeset information by line for each file"
+msgstr ""
+"afișează informațiile despre setul de modificări line cu linie\n"
+" pentru fiecare fișier"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+
+msgid "at least one filename or pattern is required"
+msgstr ""
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr ""
+
+msgid "do not pass files through decoders"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr ""
+
+msgid "PREFIX"
+msgstr "PREFIX"
+
+msgid "revision to distribute"
+msgstr ""
+
+msgid "type of distribution to create"
+msgstr ""
+
+msgid "[OPTION]... DEST"
+msgstr "[OPÈšIUNE]... DEST"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr ""
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+
+msgid " Valid types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr ""
+
+msgid "repository root cannot be destination"
+msgstr ""
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge"
+msgstr ""
+
+msgid "revision to backout"
+msgstr ""
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[OPÈšIUNE]... [-r] REV"
+
+msgid "reverse effect of earlier changeset"
+msgstr ""
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending changeset\n"
+" will instead have two parents: the old parent of the working\n"
+" directory and a new child of REV that simply undoes REV."
+msgstr ""
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent to\n"
+" specifying --merge followed by :hg:`update --clean .` to cancel\n"
+" the merge and leave the child of REV as a head to be merged\n"
+" separately."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr ""
+
+msgid "please specify a revision to backout"
+msgstr ""
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr ""
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr ""
+
+msgid "reset bisect state"
+msgstr ""
+
+msgid "mark changeset good"
+msgstr "marchează setul de modificări drept bun"
+
+msgid "mark changeset bad"
+msgstr "marchează setul de modificări drept rău"
+
+msgid "skip testing changeset"
+msgstr "omite testarea setului de modificări"
+
+msgid "extend the bisect range"
+msgstr ""
+
+msgid "use command to check changeset state"
+msgstr ""
+
+msgid "do not update to target"
+msgstr "nu actualiza la destinație"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c CMD] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr ""
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Ca scurtătură, puteți folosi argumentul reviziei pentru a marca o "
+"revizie ca bună sau rea, fără a o actualiza în prealabil."
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad."
+msgstr ""
+" Dacă furnizați o comandă, aceasta va fi folosită pentru bisecția\n"
+" automată. Starea ei la ieșire va fi folosită pentru a marca\n"
+" reviziile drept bune sau rele: starea 0 înseamnă bun, 125 înseamnă\n"
+" omiterea reviziei, 127 (comandă negăsită) va abandona bisecția,\n"
+" iar orice altă stare la ieșire diferită de 0 înseamnă revizie rea."
+
+msgid "The first good revision is:\n"
+msgstr ""
+
+msgid "The first bad revision is:\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"Datorită reviziilor omise, prima revizie bună ar putea fi oricare\n"
+"dintre:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"Datorită reviziilor omise, prima revizie rea ar putea fi oricare\n"
+"dintre:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr ""
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr ""
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr ""
+
+msgid "incompatible arguments"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr ""
+
+#, python-format
+msgid "%s killed"
+msgstr ""
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "Se extinde căutarea la setul de modificări %d:%s\n"
+
+msgid "nothing to extend"
+msgstr ""
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr ""
+
+msgid "force"
+msgstr ""
+
+msgid "delete a given bookmark"
+msgstr ""
+
+msgid "rename a given bookmark"
+msgstr ""
+
+msgid "do not mark a new bookmark active"
+msgstr ""
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NUME] [-r REV] [NUME]"
+
+msgid "track a line of development with movable markers"
+msgstr "urmărește cu marcatori mobili o linie de dezvoltare "
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in :hg:`merge` and\n"
+" :hg:`update` to merge and update respectively to a given bookmark."
+msgstr ""
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "semnul de carte '%s' nu există"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr ""
+
+msgid "new bookmark name required"
+msgstr ""
+
+msgid "bookmark name required"
+msgstr ""
+
+msgid "bookmark name cannot contain newlines"
+msgstr ""
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr ""
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr ""
+
+msgid "no bookmarks set\n"
+msgstr ""
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr ""
+
+msgid "reset branch name to parent branch name"
+msgstr ""
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NAME]"
+
+msgid "set or show the current branch name"
+msgstr "setează sau afișează numele ramurii curente"
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr ""
+
+msgid "a branch of the same name already exists"
+msgstr ""
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr ""
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr "afișează doar ramurile care au capete nefuzionate"
+
+msgid "show normal and closed branches"
+msgstr "afișează ramurile normale și închise"
+
+msgid "[-ac]"
+msgstr ""
+
+msgid "list repository named branches"
+msgstr ""
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+
+msgid " (closed)"
+msgstr ""
+
+msgid " (inactive)"
+msgstr ""
+
+msgid "run even when the destination is unrelated"
+msgstr "execută chiar când destinația este neînrudită"
+
+msgid "a changeset intended to be added to the destination"
+msgstr ""
+
+msgid "a specific branch you would like to bundle"
+msgstr "o ramură specifică pe care ați dori să o împachetați (bundle)"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă nu s-au găsit modificări.\n"
+" "
+
+msgid "--base is incompatible with specifying a destination"
+msgstr ""
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "print output to file with formatted name"
+msgstr ""
+
+msgid "print the given revision"
+msgstr ""
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr "[OPȚIUNE]... FIȘIER"
+
+msgid "output the current or given revision of files"
+msgstr ""
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "clona va include o copie de lucru vidă (doar un depozit)"
+
+msgid "revision, tag or branch to check out"
+msgstr "revizia, eticheta sau ramura care va fi actualizată"
+
+msgid "include the specified changeset"
+msgstr "include setul de modificări specificat"
+
+msgid "clone only the specified branch"
+msgstr "clonează doar ramura specificată"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[OPÈšIUNE]... SURSÄ‚ [DEST]"
+
+msgid "make a copy of an existing repository"
+msgstr "realizează o copie a unui depozit existent"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Creează o copie a unui depozit existent, într-un director nou."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" Dacă nu se specifică numele directorului destinație, acesta va fi\n"
+" implicit numele de bază (basename) al sursei."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" Amplasarea sursei este adăugată în fișierul ``.hg/hgrc`` al noului\n"
+" depozit, ca amplasare implicită pentru viitoarele comenzi 'pull'."
+
+msgid " See :hg:`help urls` for valid source format details."
+msgstr ""
+" Vezi :hg:`help urls` pentru detalii legate de formate valide de surse."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination, but no\n"
+" ``.hg/hgrc`` and working directory will be created on the remote side.\n"
+" Please see :hg:`help urls` for important details about ``ssh://`` URLs."
+msgstr ""
+" Ca destinație se poate specifica un URL ``ssh://``, dar nu va fi creat\n"
+" niciun fișier .hg/hgrc pe mașina la distanță.\n"
+" Vezi :hg:`help urls` pentru detalii importante despre URL-urile\n"
+" ``ssh://``."
+
+msgid ""
+" A set of changesets (tags, or branch names) to pull may be specified\n"
+" by listing each changeset (tag, or branch name) with -r/--rev.\n"
+" If -r/--rev is used, the cloned repository will contain only a subset\n"
+" of the changesets of the source repository. Only the set of changesets\n"
+" defined by all -r/--rev options (including all their ancestors)\n"
+" will be pulled into the destination repository.\n"
+" No subsequent changesets (including subsequent tags) will be present\n"
+" in the destination."
+msgstr ""
+" O colecție de seturi de modificări (etichete sau nume de ramuri) care\n"
+" urmează a fi recuperate poate fi specificată prin listarea fiecărui set\n"
+" de modificări (etichete sau nume de ramuri) cu -r/--rev.\n"
+" Dacă se folosește -r/--rev, depozitul clonat va conține numai un subset\n"
+" al seturilor de modificări ale depozitului sursă. Numai colecția de\n"
+" seturi de modificări definite de toate opțiunile -r/--rev (inclusiv "
+"toți\n"
+" strămoșii) va fi adusă (pulled) in depozitul destinație.\n"
+" Nici un set de modificări ulterior (inclusiv etichete ulterioare) nu se\n"
+" va regăsi în destinație."
+
+msgid ""
+" Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+" local source repositories."
+msgstr ""
+" Folosirea -r/--rev (sau 'clone src#rev dest') implică --pull, chiar\n"
+" și pentru depozite sursă locale."
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the working directory). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+" Pentru eficiență, se folosesc link-uri hard ori de câte ori sursa și\n"
+" destinația se află pe același sistem de fișiere (remarcați ca aceasta\n"
+" este valabil doar pentru datele din depozit, nu și pentru directorul\n"
+" de lucru). Unele sisteme de fișiere, precum AFS, implementează\n"
+" link-urile hard în mod incorect, dar nu raportează erori. În aceste\n"
+" cazuri, folosiți opțiunea --pull pentru a evita link-urile hard."
+
+msgid ""
+" In some cases, you can clone repositories and the working directory\n"
+" using full hardlinks with ::"
+msgstr ""
+" În unele cazuri, puteți clona depozitele și directorul de lucru "
+"utilizând\n"
+" link-uri hard complete cu:"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al DEP CLONA_DEP"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq."
+msgstr ""
+" Acesta este cel mai rapid mod de a clona, dar nu este întotdeauna\n"
+" sigur. Operația nu este atomică (rămâne în sarcina dvs. să vă asigurați\n"
+" că DEP nu este modificat în timpul operației) și trebuie să vă\n"
+" asigurați că editorul dvs. desface link-urile hard (Emacs si cele mai\n"
+" multe unelte din kernelul Linux o vor face). De asemenea, acest mod\n"
+" nu este compatibil cu anumite extensii care își plasează metadatele\n"
+" în directorul .hg, precum mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial va actualiza directorul de lucru la prima revizie\n"
+" aplicabilă din această listă:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) null, dacă s-a menționat -U sau depozitul sursă nu are seturi de "
+"modificări\n"
+" b) dacă s-a menționat -u . iar depozitul sursă este local, primul "
+"părinte al\n"
+" directorului de lucru al depozitului sursă\n"
+" c) setul de modificări specificat cu -u (dacă este un nume de ramură,\n"
+" înseamnă cel mai recent capăt al acelei ramuri)\n"
+" d) setul de modificări specificat cu -r\n"
+" e) capătul cel mai apropiat de vârf specificat cu -b\n"
+" f) capătul cel mai apropiat de vârf specificat cu sintaxa sursă "
+"url#branch\n"
+" g) capătul cel mai apropiat de vârf al ramurii default\n"
+" h) vârful"
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr ""
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+"marchează fișierele noi/lipsă ca adăugate/eliminate înainte de depozitare"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "marchează o ramură ca închisă, ascunzând-o din lista ramurilor"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "depozitează fișierele specificate sau toate modificările în suspensie"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Depozitează modificările fișierelor date în depozit. Spre deosebire\n"
+" de un sistem de control al versiunilor centralizat, această operație\n"
+" este locală. Vezi :hg:`push` pentru o cale de a vă distribui în mod\n"
+" activ modificările."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Dacă se omite lista de fișiere, vor fi depozitate toate modificările\n"
+" raportate de :hg:`status`."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Dacă depozitați rezultatul unei fuziuni, nu furnizați niciun nume de\n"
+" fișier sau filtrele -I/-X."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" Dacă nu se specifică nici un mesaj de depozitare, Mercurial va\n"
+" porni editorul configurat de dvs., unde veți putea introduce un\n"
+" mesaj. În cazul în care depozitarea eșuează, veți găsi o copie\n"
+" de siguranță a mesajului dvs. în ``.hg/last-message.txt``."
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă nu s-a modificat nimic.\n"
+" "
+
+msgid "can only close branch heads"
+msgstr ""
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr ""
+
+msgid "created new head\n"
+msgstr ""
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr ""
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr ""
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[OPÈšIUNE]... [SURSÄ‚]... DEST"
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă au apărut erori.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "either two or three arguments required"
+msgstr ""
+
+msgid "add single file mergeable changes"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[OPÈšIUNE]... TEXT"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr ""
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+
+msgid " Elements:"
+msgstr ""
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+
+msgid "reading DAG from stdin\n"
+msgstr ""
+
+msgid "repository is not empty"
+msgstr ""
+
+msgid "building"
+msgstr "se generează"
+
+msgid "show all details"
+msgstr "afișează toate detaliile"
+
+msgid "lists the contents of a bundle"
+msgstr "afișează conținutul unui fișier bundle"
+
+msgid "validate the correctness of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "[COMMAND]"
+msgstr ""
+
+msgid "list all available commands and options"
+msgstr "afișează toate comenzile și opțiunile disponibile"
+
+msgid "show the command options"
+msgstr "afișează opțiunile comenzii"
+
+msgid "[-o] CMD"
+msgstr ""
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr ""
+
+msgid "use dots for runs"
+msgstr ""
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[OPȚIUNE]... [FIȘIER [REV]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "open changelog"
+msgstr "deschide changelog-ul"
+
+msgid "open manifest"
+msgstr "deschide manifestul"
+
+msgid "-c|-m|FILE REV"
+msgstr ""
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr ""
+
+msgid "[-e] DATE [RANGE]"
+msgstr ""
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "use old-style discovery"
+msgstr ""
+
+msgid "use old-style discovery with non-heads included"
+msgstr ""
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr ""
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr ""
+
+msgid "parse and apply a fileset specification"
+msgstr ""
+
+msgid "[PATH]"
+msgstr ""
+
+msgid "show information detected about current filesystem"
+msgstr "afișează informațiile detectate despre sistemul de fișiere curent"
+
+msgid "id of head node"
+msgstr ""
+
+msgid "id of common node"
+msgstr "id-ul nodului comun"
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr ""
+
+msgid "retrieves a bundle from a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+
+msgid "display the combined ignore pattern"
+msgstr ""
+
+msgid "no ignore patterns found"
+msgstr ""
+
+msgid "revlog format"
+msgstr ""
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr "afișează conținutul unui fișier index"
+
+#, python-format
+msgid "unknown format %d"
+msgstr "format necunoscut %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "afișează un DAG index sub forma unui fișier dot graphviz"
+
+msgid "test Mercurial installation"
+msgstr ""
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr "Se verifică codificarea (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+#, python-format
+msgid "Checking installed modules (%s)...\n"
+msgstr "Se verifică modulele instalate (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+msgid "Checking templates...\n"
+msgstr "Se verifică șabloanele...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr "Se verifică editorul pentru commit...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr ""
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr ""
+
+msgid "Checking username...\n"
+msgstr "Se verifică numele de utilizator...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr ""
+
+msgid "No problems detected\n"
+msgstr ""
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr ""
+
+msgid "REPO ID..."
+msgstr ""
+
+msgid "test whether node ids are known to a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s "
+"and 1s\n"
+" indicating unknown/known.\n"
+" "
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr ""
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr ""
+
+msgid "dump rename information"
+msgstr "afișează informații despre redenumiri"
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr ""
+
+msgid "dump index data"
+msgstr ""
+
+msgid "-c|-m|FILE"
+msgstr ""
+
+msgid "show data and statistics about a revlog"
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr ""
+
+msgid "sort by saved mtime"
+msgstr ""
+
+msgid "[OPTION]..."
+msgstr "[OPÈšIUNE]..."
+
+msgid "show the contents of the current dirstate"
+msgstr "afișează conținutul dirstate-ului curent"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr ""
+
+msgid "revision to check"
+msgstr ""
+
+msgid "show how files match on given patterns"
+msgstr "afișează modul în care fișierele se potrivesc cu tiparele specificate"
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "DEPOZIT [OPÈšIUNI]... [UNU [DOI]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[OPȚIUNE]... ([-c REV] | [-r REV1 [-r REV2]]) [FIȘIER]..."
+
+msgid "diff repository (or selected files)"
+msgstr "afișează diferențele (diff) în depozit (sau fișierele selectate)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" Notă:\n"
+" `diff` poate genera afișaj diff neașteptat pentru seturi\n"
+" de modificări de fuziune, deoarece va compara setul de modificări de\n"
+" fuziune doar cu primul părinte, dacă nu se specifică nicio revizie."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr ""
+
+msgid "revisions to export"
+msgstr ""
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr "[OPȚIUNE]... [-o SPECFIȘIEȘIRE] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr ""
+"afișează antetul și diferențele pentru unul sau mai multe seturi de "
+"modificări"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" Notă:\n"
+" `export` poate genera afișaj diff neașteptat pentru seturi\n"
+" de modificări de fuziune, deoarece va compara setul de modificări de\n"
+" fuziune doar cu primul părinte."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr "uită fișierele specificate la următoarea depozitare"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+" Marchează fișierele specificate astfel încât nu vor mai fi\n"
+" urmărite după următoarea depozitare."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" Aceasta înlătură fișierele doar din ramura curentă, nu din întregul\n"
+" istoric al proiectului, și nu le șterge din directorul de lucru."
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+" Pentru a anula efectul lui `forget` înainte de următoarea\n"
+" depozitare, vezi :hg:`add`."
+
+msgid "no files specified"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+#, python-format
+msgid "removing %s\n"
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr ""
+
+msgid "print all revisions that match"
+msgstr ""
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"urmărește istoricul seturilor de modificări sau al fișierelor, ținând cont "
+"de copieri și redenumiri"
+
+msgid "ignore case when matching"
+msgstr "ignoră minuscule/majuscule la potrivire"
+
+msgid "print only filenames and revisions that match"
+msgstr "afișează doar numele de fișiere și reviziile care se potrivesc"
+
+msgid "print matching line numbers"
+msgstr "afișează numerele liniilor care se potrivesc"
+
+msgid "only search files changed within revision range"
+msgstr "caută doar fișierele modificate în intervalul de revizii"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[OPȚIUNE]... TIPAR [FIȘIER]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnează 0 dacă se găsește o potrivire, 1 altfel.\n"
+" "
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "STARTREV"
+msgstr ""
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "afișează doar capetele care sunt descendenți ai REVSTART"
+
+msgid "show topological heads only"
+msgstr "afișează doar capetele topologice"
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "afișează doar capetele de ramură active [ÎNVECHIT]"
+
+msgid "show normal and closed branch heads"
+msgstr " afișează capetele de ramură normale și închise"
+
+msgid "[-ac] [-r STARTREV] [REV]..."
+msgstr "[-ac] [-r REV] [REVSTART]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "afișează capetele curente ale depozitului sau capetele de ramură"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" Returnează 0 dacă se găsesc capete care se potrivesc, 1 altfel.\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr ""
+
+#, python-format
+msgid " (started at %s)"
+msgstr ""
+
+msgid "show only help for extensions"
+msgstr "afișează doar ajutorul pentru extensii"
+
+msgid "show only help for commands"
+msgstr "afișează doar ajutorul pentru comenzi"
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [SUBIECT]"
+
+msgid "show help for a given topic or a help overview"
+msgstr ""
+"afișează ajutorul pentru un anumit subiect sau un rezumat al ajutorului"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes.\n"
+" "
+
+msgid "global options:"
+msgstr "opțiuni globale:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "folosiți \"hg help\" pentru lista completă a comenzilor"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"folosiți \"hg help\" pentru lista completă a comenzilor sau \"hg -v\" pentru "
+"detalii"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "folosiți \"hg help %s\" pentru afișarea textului complet al ajutorului"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"folosiți \"hg -v help%s\" pentru afișarea alias-urilor și a opțiunilor\n"
+"globale integrate"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "folosiți \"hg -v help %s\" pentru afișarea opțiunilor globale"
+
+msgid "list of commands:"
+msgstr "lista comenzilor:"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"alias: %s\n"
+
+msgid "(no help text available)"
+msgstr ""
+
+#, python-format
+msgid "shell alias for::"
+msgstr "alias de shell pentru:"
+
+#, python-format
+msgid " %s"
+msgstr ""
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "alias pentru: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show verbose help\n"
+msgstr ""
+"\n"
+"folosiți \"hg -v help %s\" pentru afișarea ajutorului detaliat\n"
+
+msgid "options:\n"
+msgstr "opțiuni:\n"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr ""
+"folosiți \"hg help -e %s\" pentru afișarea ajutorului pentru\n"
+"extensia %s"
+
+msgid "no commands defined\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"folosiți \"hg help -c %s\" pentru a vedea ajutorul pentru comanda %s\n"
+
+msgid "no help text available"
+msgstr ""
+
+#, python-format
+msgid "%s extension - %s"
+msgstr ""
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial - gestionar distribuit pentru controlul codului sursă\n"
+
+msgid "basic commands:"
+msgstr "comenzi de bază:"
+
+msgid "enabled extensions:"
+msgstr "extensii activate:"
+
+msgid "VALUE"
+msgstr "VALOARE"
+
+msgid "DEPRECATED"
+msgstr ""
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times"
+msgstr ""
+"\n"
+"[+] opțiunea marcată poate fi specificată de mai multe ori"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"subiecte de ajutor suplimentare:"
+
+msgid "identify the specified revision"
+msgstr "identifică revizia specificată"
+
+msgid "show local revision number"
+msgstr "afișează numărul de revizie local"
+
+msgid "show global revision id"
+msgstr "afișează id-ul global al reviziei"
+
+msgid "show branch"
+msgstr "afișează ramura"
+
+msgid "show tags"
+msgstr "afișează etichetele"
+
+msgid "show bookmarks"
+msgstr "arată semnele de carte"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [SURSÄ‚]"
+
+msgid "identify the working copy or specified revision"
+msgstr ""
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr ""
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+
+msgid "PATH"
+msgstr "CALE"
+
+msgid "base path (DEPRECATED)"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "omite verificarea pentru modificări nedepozitate în suspensie"
+
+msgid "don't commit, just update the working directory"
+msgstr "nu depozita, doar actualizează directorul de lucru"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "aplică patch-ul nodurilor pentru care a fost generat"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+"folosește orice informație despre ramură din patch\n"
+"(implicat de --exact)"
+
+msgid "[OPTION]... PATCH..."
+msgstr "[OPÈšIUNE]... PATCH"
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid "to working directory"
+msgstr ""
+
+msgid "not a Mercurial patch"
+msgstr ""
+
+msgid "patch is damaged or loses information"
+msgstr ""
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+#, python-format
+msgid "applied %s\n"
+msgstr ""
+
+msgid "no diffs found"
+msgstr ""
+
+msgid "run even if remote repository is unrelated"
+msgstr "execută chiar dacă depozitul la distanță este neînrudit"
+
+msgid "show newest record first"
+msgstr "afișează începând cu cea mai nouă înregistrare"
+
+msgid "file to store the bundles into"
+msgstr "fișierul în care va fi salvat bundle-ul"
+
+msgid "a remote changeset intended to be added"
+msgstr ""
+"un set de modificări la distanță care se intenționează a fi\n"
+"adăugat"
+
+msgid "compare bookmarks"
+msgstr "compară semnele de carte"
+
+msgid "a specific branch you would like to pull"
+msgstr "o ramură specifică pe care ați dori să o trimiteți"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle NUMEFIȘIER] [SURSĂ]"
+
+msgid "show new changesets found in source"
+msgstr "afișează seturile de modificări noi găsite în sursă"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Afișează seturile noi de modificări găsite în calea sau URL-ul\n"
+" specificat sau la amplasarea implicită pentru 'pull'. Acestea\n"
+" sunt seturi care ar fi fost aduse dacă s-ar fi executat o\n"
+" comandă 'pull' la momentul emiterii comenzii."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" Pentru depozitul la distantă, folosirea lui --bundle evită\n"
+" descărcarea de două ori a setului de modificări în cazul\n"
+" în care 'incoming' este urmat de 'pull'."
+
+msgid " See pull for valid source format details."
+msgstr " Vezi pull pentru detalii legate de formate valide de surse."
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnează 0 dacă există modificări de primit, 1 altfel.\n"
+" "
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr ""
+
+msgid "remote doesn't support bookmarks\n"
+msgstr ""
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "create a new repository in the given directory"
+msgstr "creează un nou depozit în directorul specificat"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Inițializează un depozit nou în directorul specificat. Dacă\n"
+" directorul nu există, va fi creat."
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+" Dacă nu se specifică niciun director, va fi folosit directorul curent."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Ca destinație se poate specifica un URL ``ssh://``.\n"
+" Vezi :hg:`help urls` pentru mai multe detalii."
+
+msgid "search the repository as it is in REV"
+msgstr "caută depozitul așa cum este el în REV"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "termină numele de fișiere cu NUL, pentru utilizare cu xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "afișează căi complete de la rădăcina sistemului de fișiere"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[OPÈšIUNE]... [TIPAR]..."
+
+msgid "locate files matching specific patterns"
+msgstr ""
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr "urmărește doar primul părinte al seturilor de modificări de fuziune"
+
+msgid "show revisions matching date spec"
+msgstr "afișează reviziile care se potrivesc cu data"
+
+msgid "show copied files"
+msgstr "afișează fișierele copiate"
+
+msgid "do case-insensitive search for a given text"
+msgstr "caută textul specificat fără a diferenția între minuscule și majuscule"
+
+msgid "include revisions where files were removed"
+msgstr "include reviziile în care au fost eliminate fișiere"
+
+msgid "show only merges"
+msgstr "afișează doar fuziunile"
+
+msgid "revisions committed by user"
+msgstr "reviziile depozitate de utilizatorul"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr ""
+"afișează doar seturile de modificări din interiorul ramurii denumite\n"
+"specificate (ÃŽNVECHIT)"
+
+msgid "show changesets within the given named branch"
+msgstr ""
+"afișează seturile de modificări din cadrul ramurii denumite specificate"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "nu afișa revizia sau oricare din strămoșii ei"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[OPȚIUNE]... [FIȘIER]"
+
+msgid "show revision history of entire repository or files"
+msgstr ""
+"afișează istoricul reviziilor pentru întregul depozit sau pentru unele "
+"fișiere"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Afișează istoricul reviziilor pentru fișierele specificate sau\n"
+" pentru întregul proiect."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+" Istoricul fișierelor este afișat fără a urmări istoricul redenumirilor\n"
+" sau al copierii acestora - pentru aceasta, folosiți -f/--follow cu un\n"
+" nume de fișier. Fără un nume de fișier, --follow va afișa doar\n"
+" strămoși sau descendenți ai reviziei de stat. --follow-first\n"
+" urmărește doar primul părinte al reviziilor fuzionate."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision. You can specify a revision set for\n"
+" log, see :hg:`help revsets` for more information."
+msgstr ""
+" Dacă nu se specifică niciun interval de revizii, acesta este implicit\n"
+" tip:0 (vârf:0), cu excepția cazului când --follow este setat, în\n"
+" această situație părintele directorului de lucru este folosit ca\n"
+" revizie de start.\n"
+" Puteți specifica un set de revizii pentru 'log'; pentru mai multe\n"
+" informații, vezi :hg:`help revsets`."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Implicit, această comandă afișează numărul reviziei și id-ul setului\n"
+" de modificări, etichete, părinți netriviali, utilizatorul, data și ora\n"
+" și un rezumat al fiecărei depozitări. Când se folosește -v/--verbose,\n"
+" se afișează lista fișierelor modificate și mesajul de depozitare complet."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" Notă:\n"
+" `log -p/--patch` poate genera afișaj diff neașteptat pentru seturi\n"
+" de modificări de fuziune, deoarece va compara setul de modificări de\n"
+" fuziune doar cu primul părinte. De asemenea, doar fișierele diferite\n"
+" față de AMBII părinți vor apărea în lista de fișiere."
+
+msgid "revision to display"
+msgstr "revizia de afișat"
+
+msgid "list files from all revisions"
+msgstr "afișează fișierele din toate reviziile"
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+
+msgid "can't specify a revision with --all"
+msgstr ""
+
+msgid "force a merge with outstanding changes"
+msgstr "forțează o fuziune cu modificări în suspensie"
+
+msgid "revision to merge"
+msgstr "revizia de fuzionat"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+"treci în revistă reviziile de fuzionat (nu se execută\n"
+"nicio fuziune)"
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "fuzionează directorul de lucru cu o altă revizie"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" Directorul de lucru curent este actualizat cu toate modificările\n"
+" făcute în revizia cerută, de la ultima revizie precedentă comună."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Fișierele care au fost modificate între oricare din părinți sunt\n"
+" marcate drept modificate pentru următoarea depozitare, și o\n"
+" depozitare trebuie să fie executată înainte de a se permite orice\n"
+" altă actualizare a depozitului. Următoarea depozitare va avea\n"
+" doi părinți."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+" ``--tool`` poate fi folosit pentru a specifica instrumentul\n"
+" pentru fuziune folosit la fuziunile de fișiere. Acesta\n"
+" prevalează asupra variabilei de mediu HGMERGE și a fișierelor\n"
+" dvs. de configurare. Pentru opțiuni vezi :hg:`help merge-tools`."
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" Dacă nu se specifică niciun părinte, părintele directorului de\n"
+" lucru este o revizie capăt, iar ramura curentă conține exact\n"
+" un singur alt capăt, atunci implicit fuziunea are loc cu celălalt\n"
+" capăt. Altfel, o revizie explicită cu care să aibă loc fuziunea\n"
+" trebuie specificată."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr ""
+" :hg:`resolve` trebuie folosit pentru a rezolva fișierele\n"
+" nerezolvate."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+" Pentru a anula o fuziune nedepozitată, folosiți\n"
+" :hg:`update --clean .`, care va extrage o copie curată a\n"
+" părintelui original al fuziunii, renunțând la toate modificările."
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă există fișiere nerezolvate.\n"
+" "
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr ""
+
+msgid "run 'hg heads .' to see heads"
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr ""
+
+msgid "run 'hg heads' to see all heads"
+msgstr ""
+
+msgid "there is nothing to merge"
+msgstr ""
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr ""
+
+msgid "working directory not at a head revision"
+msgstr "directorul de lucru nu se află la o revizie capăt"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr ""
+
+msgid "a changeset intended to be included in the destination"
+msgstr "un set de modificări care se dorește a fi inclus în destinație"
+
+msgid "a specific branch you would like to push"
+msgstr "o ramură specifică pe care ați dori să o preluați"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+
+msgid "show changesets not found in the destination"
+msgstr "afișează seturile de modificări negăsite în destinație"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Afișează seturile de modificări care nu se regăsesc în depozitul\n"
+" destinație specificat sau în calea pentru 'push' implicită\n"
+" 'default'. Acestea sunt seturile de modificări care ar fi\n"
+" difuzate dacă s-ar executa o comandă 'push' la momentul\n"
+" emiterii comenzii."
+
+msgid " See pull for details of valid destination formats."
+msgstr ""
+" Vezi 'pull' pentru detalii legate de formatele valide pentru\n"
+" destinații."
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnează 0 dacă există modificări de trimis, 1 altfel.\n"
+" "
+
+msgid "show parents of the specified revision"
+msgstr "afișează părinții reviziei specificate"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [FIȘIER]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "afișează părinții directorului de lucru sau al reviziei"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' nu a fost găsit în manifest!"
+
+msgid "[NAME]"
+msgstr "[NUME]"
+
+msgid "show aliases for remote repositories"
+msgstr "afișează alias-urile pentru depozitele la distanță"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr ""
+
+msgid "not found!\n"
+msgstr ""
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "nu se actualizează: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr ""
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr ""
+
+msgid "update to new branch head if changesets were pulled"
+msgstr ""
+"actualizează la noul capăt de ramură, dacă au fost preluate\n"
+"seturi de modificări"
+
+msgid "run even when remote repository is unrelated"
+msgstr "execută chiar când depozitul la distanță este neînrudit"
+
+msgid "BOOKMARK"
+msgstr ""
+
+msgid "bookmark to pull"
+msgstr "semnul de carte de importat"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SURSÄ‚]"
+
+msgid "pull changes from the specified source"
+msgstr "preia modificări de la sursa specificată"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Preia modificări dintr-un depozit la distanță într-unul local."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Găsește toate modificările din depozit la calea sau URL-ul\n"
+" specificat și le adaugă la un depozit local (cel curent, dacă nu\n"
+" se specifică -R). Implicit, copia proiectului din directorul\n"
+" curent nu este actualizată."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Folosiți :hg:`incoming` dacă doriți să vedeți ce ar fi adăugat un\n"
+" `pull` la momentul la care ați emis această comandă. Dacă după\n"
+" aceasta decideți să adăugați aceste modificări în depozit,\n"
+" folosiți :hg:`pull -r X`, unde ``X`` este ultimul set de\n"
+" modificări afișat de :hg:`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Dacă SURSA este omisă, va fi folosită calea implicită 'default'.\n"
+" Pentru mai multe informații, vezi :hg:`help urls`."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă o actualizare a avut\n"
+" fișiere nerezolvate.\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr ""
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr ""
+
+msgid "force push"
+msgstr "forțează `push`"
+
+msgid "bookmark to push"
+msgstr "semnul de carte de exportat"
+
+msgid "allow pushing a new branch"
+msgstr "permite trimiterea unei ramuri noi"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+
+msgid "push changes to the specified destination"
+msgstr "trimite modificări către destinația specificată"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+" Trimite seturi de modificări din depozitul local către\n"
+" destinația specificată."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" Această operație este simetrică cu `pull`: este identică cu un\n"
+" `pull` din directorul curent, aplicat în directorul destinație."
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" Implicit, `push` nu va permite crearea de capete noi la\n"
+" destinație, deoarece capetele multiple ar crea neclarități\n"
+" privind capătul care trebuie folosit. În această situație\n"
+" este recomandat să executați `pull` și `merge` înainte de\n"
+" `push`."
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" Folosiți --new-branch dacă doriți să permiteți lui `push` să\n"
+" creeze o nouă ramură cu nume care nu este prezentă la\n"
+" destinație. Aceasta vă permite să creați doar o ramură nouă,\n"
+" fără a forța alte modificări."
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" Folosiți -f/--force pentru a înlocui comportamentul implicit\n"
+" și a trimite toate modificările din toate ramurile."
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Dacă se folosește -r/--rev, revizia specificată și toți\n"
+" strămoșii ei vor fi trimiși către depozitul la distanță."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Vezi :hg:`help urls` pentru detalii importante despre URL-urile\n"
+" ``ssh://``. Dacă DESTINAȚIA este omisă, se va folosi o cale\n"
+" implicită."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" Returnează 0 dacă trimiterea s-a încheiat cu succes, 1 dacă nu există\n"
+" nimic de trimis.\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr ""
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr ""
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr ""
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr ""
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "actualizarea semnului de carte %s a eșuat!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr ""
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă nu există nimic de recuperat\n"
+" sau verificarea eșuează.\n"
+" "
+
+msgid "record delete for missing files"
+msgstr "înregistrează ștergere pentru fișierele lipsă"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "înlătură (și șterge) fișierul chiar dacă este adăugat sau modificat"
+
+msgid "remove the specified files on the next commit"
+msgstr "înlătură fișierele specificate la următoarea depozitare"
+
+msgid " Schedule the indicated files for removal from the repository."
+msgstr " Planifică fișierele indicate spre a fi înlăturate din depozit."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+" Aceasta înlătură doar fișiere din ramura curentă, nu din întregul\n"
+" istoric al proiectului. -A/--after poate fi folosit pentru a\n"
+" înlătura doar fișiere care au fost deja șterse, -f/--force poate\n"
+" fi folosit pentru a forța ștergerea, iar -Af poate fi folosit\n"
+" pentru a înlătura fișiere din revizia următoare, fără a le șterge\n"
+" din directorul de lucru."
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by :hg:`status`). The actions are Warn, Remove (from\n"
+" branch) and Delete (from disk)::"
+msgstr ""
+" Tabelul următor detaliază comportamentul comenzii pentru diferite\n"
+" stări ale fișierelor (pe coloane) și combinații de opțiuni (pe\n"
+" rânduri). Stările fișierelor sunt Adăugat [A], Curat [C],\n"
+" Modificat [M] și Lipsă [!]. Acțiunile sunt Avertizează [V],\n"
+" Înlătură [Î] (din ramură) și Șterge [Ș] (de pe disc)::"
+
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+" A C M !\n"
+" nimic V ÎȘ V Î\n"
+" -f Î ÎȘ ÎȘ Î\n"
+" -A V V V ÃŽ\n"
+" -Af ÃŽ ÃŽ ÃŽ ÃŽ"
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`."
+msgstr ""
+" Această comandă planifică fișierele spre a fi înlăturate la\n"
+" următoarea depozitare. Pentru a anula planificarea înainte\n"
+" de a avea loc, vezi :hg:`revert`."
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă au apărut avertismente.\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"not removing %s: file has been marked for add (use -f to force removal)\n"
+msgstr ""
+
+msgid "record a rename that has already occurred"
+msgstr "înregistrează o redenumire care a avut deja loc"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[OPÈšIUNE]... SURSÄ‚... DEST"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid "select all unresolved files"
+msgstr "selectează toate fișierele nerezolvate"
+
+msgid "list state of files needing merge"
+msgstr "afișează starea fișierelor care au nevoie de fuziune"
+
+msgid "mark files as resolved"
+msgstr "marchează fișierul drept rezolvat"
+
+msgid "mark files as unresolved"
+msgstr "marchează fișierul drept rezolvat"
+
+msgid "hide status prefix"
+msgstr "ascunde prefixul stării"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr ""
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents)."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to selects all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă există vreun fișier\n"
+" pentru care tentativa de rezolvare a eșuat.\n"
+" "
+
+msgid "too many options specified"
+msgstr ""
+
+msgid "can't specify --all and patterns"
+msgstr ""
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+
+msgid "revert all changes when no arguments given"
+msgstr ""
+
+msgid "tipmost revision matching date"
+msgstr "revizia cea mai apropiată de vârf care se potrivește cu data"
+
+msgid "revert to the specified revision"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr "nu salva copii de siguranță ale fișierelor"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[OPÈšIUNE]... [-r REV] [NUME]..."
+
+msgid "restore individual files or directories to an earlier state"
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" This command is most likely not what you are looking for.\n"
+" Revert will partially overwrite content in the working\n"
+" directory without changing the working directory parents. Use\n"
+" :hg:`update -r rev` to check out earlier revisions, or\n"
+" :hg:`update --clean .` to undo a merge which has added another\n"
+" parent."
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See :hg:`help\n"
+" dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+
+msgid ""
+" If a file has been deleted, it is restored. Files scheduled for\n"
+" addition are just unscheduled and left as they are. If the\n"
+" executable mode of a file was changed, it is reset."
+msgstr ""
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr ""
+
+msgid "uncommitted merge - use \"hg update\", see \"hg help revert\""
+msgstr ""
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "se neglijează %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr ""
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr ""
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr ""
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr ""
+
+msgid "roll back the last transaction (dangerous)"
+msgstr ""
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr ""
+
+msgid " Print the root directory of the current repository."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr "numele fișierului jurnal de acces în care să se scrie"
+
+msgid "name of error log file to write to"
+msgstr "numele fișierului jurnal de eroare în care să se scrie"
+
+msgid "PORT"
+msgstr "PORT"
+
+msgid "port to listen on (default: 8000)"
+msgstr "portul pe care se va asculta (implicit: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr ""
+
+msgid "ADDR"
+msgstr "ADRESÄ‚"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr ""
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+"numele care va fi afișat în paginile web (implicit: directorul de lucru)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr ""
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr ""
+
+msgid "web templates to use"
+msgstr ""
+
+msgid "template style to use"
+msgstr ""
+
+msgid "use IPv6 in addition to IPv4"
+msgstr ""
+
+msgid "SSL certificate file"
+msgstr ""
+
+msgid "start stand-alone webserver"
+msgstr "pornește serverul web autonom"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr ""
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr ""
+
+msgid "show untrusted configuration options"
+msgstr "afișează opțiunile de configurare 'untrusted'"
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr "afișează setările de configurare combinate din toate fișierele hgrc"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+
+#, python-format
+msgid "read config from: %s\n"
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "show status of all files"
+msgstr "afișează starea tuturor fișierelor"
+
+msgid "show only modified files"
+msgstr "afișează doar fișierele modificate"
+
+msgid "show only added files"
+msgstr "afișează doar fișierele adăugate"
+
+msgid "show only removed files"
+msgstr "afișează doar fișierele înlăturate"
+
+msgid "show only deleted (but tracked) files"
+msgstr "afișează doar fișierele șterse (dar urmărite)"
+
+msgid "show only files without changes"
+msgstr "afișează doar fișierele fără modificări"
+
+msgid "show only unknown (not tracked) files"
+msgstr "afișează doar fișierele necunoscute (neurmărite)"
+
+msgid "show only ignored files"
+msgstr "afișează doar fișierele ignorate"
+
+msgid "show source of copied files"
+msgstr "afișează sursa fișierelor copiate"
+
+msgid "show difference from revision"
+msgstr "afișează diferențele față de revizie"
+
+msgid "list the changed files of a revision"
+msgstr "afișează fișierele modificate ale unei revizii"
+
+msgid "show changed files in the working directory"
+msgstr "afișează fișierele modificate în directorul de lucru"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Afișează starea fișierelor din depozit. Dacă sunt furnizate nume,\n"
+" se arată doar fișierele care se potrivesc. Fișierele curate, ignorate\n"
+" sau care nu sunt sursa unei operații de copiere/mutare nu sunt afișate,\n"
+" cu excepția cazului când se furnizează `-c/--clean`, `-i/--ignored`,\n"
+" `-C/--copies` sau `-A/--all`. Dacă nu se furnizează opțiunile a căror\n"
+" descriere începe cu ``afișează doar...``, vor fi folosite opțiunile\n"
+" -mardu."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" Opțiunea `-q/--quiet` ascunde fișierele neurmărite (necunoscute\n"
+" sau ignorate), cu excepția cazului când se solicită explicit\n"
+" afișarea lor cu `-u/--unknown` sau `-i/--ignored`."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" Notă:\n"
+" `status` poate apărea în dezacord cu `diff` dacă s-au\n"
+" modificat permisiuni sau a avut loc o fuziune. Formatul\n"
+" diff standard nu raportează modificările permisiunilor,\n"
+" iar `diff` raportează modificările doar relativ la un\n"
+" părinte din fuziune."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" Dacă se furnizează o revizie, va fi folosită ca revizie\n"
+" de bază. Dacă se furnizează două revizii, se arată\n"
+" diferențele dintre ele. Opțiunea `--change` poate fi\n"
+" de asemenea folosită drept scurtătură pentru a afișa\n"
+" fișierele modificate de către o revizie în raport cu\n"
+" primul ei părinte."
+
+msgid " The codes used to show the status of files are::"
+msgstr " Codurile folosite pentru a arăta starea fișierelor sunt::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = modificat\n"
+" A = adăugat\n"
+" R = înlăturat\n"
+" C = curat\n"
+" ! = lipsă (șters de o comandă exterioară, dar încă urmărit)\n"
+" ? = neurmărit\n"
+" I = ignorat\n"
+" = originea fișierului precedent listat ca A (adăugat)"
+
+msgid "check for push and pull"
+msgstr "Verifică pentru `push` și `pull`"
+
+msgid "summarize working directory state"
+msgstr "sumarizează starea directorului de lucru"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+" Generează un sumar al stării directorului curent, incluzând\n"
+" părinții, ramura, starea depozitării și actualizările disponibile."
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+" Cu opțiunea --remote, vor fi verificate căile implicite pentru\n"
+" modificări de primit și de trimis. Acțiunea poate consuma timp."
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "părinte: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (depozit vid)"
+
+msgid " (no revision checked out)"
+msgstr " (nu există nicio revizie extrasă)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ramură: %s\n"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d modificate"
+
+#, python-format
+msgid "%d added"
+msgstr "%d adăugate"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d înlăturate"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d redenumite"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d copiate"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d șterse"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d necunoscute"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignorate"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d nerezolvate"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d subdepozite"
+
+msgid " (merge)"
+msgstr " (fuziune)"
+
+msgid " (new branch)"
+msgstr " (ramură nouă)"
+
+msgid " (head closed)"
+msgstr " (capăt închis)"
+
+msgid " (clean)"
+msgstr " (curat)"
+
+msgid " (new branch head)"
+msgstr " (capăt de ramură nou)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "depozitare: %s\n"
+
+msgid "update: (current)\n"
+msgstr "actualizare: (curent)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "actualizare: %d seturi de modificări noi (actualizare)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr ""
+"actualizare: %d seturi de modificări noi, %d capete de ramură (fuziune)\n"
+
+msgid "1 or more incoming"
+msgstr "1 sau mai multe de primit"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d de trimis"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d semne de carte de primit"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d semne de carte de trimis"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "la distanță: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "la distanță: (sincronizat)\n"
+
+msgid "force tag"
+msgstr "forțează eticheta"
+
+msgid "make the tag local"
+msgstr "fă eticheta locală"
+
+msgid "revision to tag"
+msgstr ""
+
+msgid "remove a tag"
+msgstr "înlătură o etichetă"
+
+msgid "use <text> as commit message"
+msgstr "folosește <text> drept mesaj de depozitare"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEXT] [-d DATÄ‚] [-u UTILIZATOR] [-r REV] NUME..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr ""
+"adaugă una sau mai multe etichete pentru revizia curentă\n"
+"sau cea specificată"
+
+msgid " Name a particular revision using <name>."
+msgstr ""
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr ""
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr ""
+
+msgid "--rev and --remove are incompatible"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr ""
+
+msgid "uncommitted merge"
+msgstr "fuziune nedepozitată"
+
+msgid "not at a branch head (use -f to force)"
+msgstr ""
+
+msgid "list repository tags"
+msgstr ""
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr "afișează revizia vârf"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr ""
+"actualizează la noul capăt de ramură, dacă au fost despachetate\n"
+"(unbundled) seturi de modificări"
+
+msgid "[-u] FILE..."
+msgstr "[-u] FIȘIER..."
+
+msgid "apply one or more changegroup files"
+msgstr ""
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+" Returnează 0 în caz de succes, 1 dacă o actualizare are\n"
+" fișiere nerezolvate.\n"
+" "
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "înlătură modificările nedepozitate (fără copie de siguranță)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "actualizează peste ramuri dacă nu există modificări nedepozitate"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATÄ‚] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "actualizează directorul de lucru (sau comută între revizii)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch."
+msgstr ""
+" Actualizează directorul de lucru al depozitului la setul de\n"
+" modificări specificat. Dacă nu se specifică niciun set de\n"
+" modificări, actualizarea are loc la vârful ramurii cu nume\n"
+" curente."
+
+msgid ""
+" If the changeset is not a descendant of the working directory's\n"
+" parent, the update is aborted. With the -c/--check option, the\n"
+" working directory is checked for uncommitted changes; if none are\n"
+" found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+" Dacă setul de modificări nu e un descendent al părintelui directorului\n"
+" de lucru, actualizarea este abandonată. Cu opțiunea `-c/--check`,\n"
+" se verifică în directorul de lucru modificări nedepozitate; dacă nu se\n"
+" găsește niciuna, directorul de lucru este actualizat la setul de\n"
+" modificări specificat."
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" Când directorul de lucru conține modificări nedepozitate, se\n"
+" aplică următoarele reguli:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. Dacă nu e specificat -c/--check sau -C/--clean, și dacă setul de\n"
+" modificări solicitat este ascendent sau descendent al părintelui\n"
+" directorului de lucru, modificările nedepozitate sunt fuzionate în\n"
+" setul de modificări solicitat, iar rezultatul fuziunii este lăsat\n"
+" nedepozitat. Dacă setul de modificări solicitat nu este un strămoș\n"
+" sau un descendent (adică se află în altă ramură), actualizarea\n"
+" este întreruptă, iar modificările nedepozitate sunt păstrate."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. Cu opțiunea -c/--check, actualizarea este întreruptă, iar\n"
+" modificările nedepozitate sunt păstrate."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. Cu opțiunea -C/--clean, modificările nedepozitate sunt înlăturate, "
+"iar\n"
+" directorul de lucru este actualizat la setul de modificări solicitat."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" Folosiți null ca set de modificări pentru a elimina directorul de\n"
+" lucru (similar cu :hg:`clone -U`)."
+
+msgid ""
+" If you want to update just one file to an older changeset, use\n"
+" :hg:`revert`."
+msgstr ""
+" Dacă doriți să actualizați doar un singur fișier la un set de\n"
+" modificări mai vechi, folosiți :hg:`revert`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+
+msgid "uncommitted local changes"
+msgstr ""
+
+msgid "verify the integrity of the repository"
+msgstr ""
+
+msgid " Verify the integrity of the current repository."
+msgstr ""
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+
+msgid "output version and copyright information"
+msgstr "afișează versiunea și informații legate de copyright"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+"Mercurial - gestionar distribuit pentru controlul codului sursă\n"
+"(versiunea %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(vezi http://mercurial.selenic.com pentru mai multe informații)"
+
+msgid ""
+"Copyright (C) 2005-2011 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2011 Matt Mackall și alții\n"
+"Acesta este software liber; vezi sursa pentru condițiile de copiere.\n"
+"Nu există NICIO garanție; nici măcar pentru COMERCIALIZARE sau\n"
+"COMPATIBILITATE ÃŽN ANUMITE SCOPURI.\n"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr ""
+
+msgid "not found in manifest"
+msgstr "nu s-a găsit în manifest"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr ""
+
+msgid "branch name not in UTF-8!"
+msgstr ""
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr ""
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr ""
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr ""
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr ""
+
+msgid "nullid"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr ""
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "character device"
+msgstr ""
+
+msgid "block device"
+msgstr ""
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr ""
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr ""
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr ""
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr ""
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr ""
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr ""
+
+msgid "you should pull and merge or use push -f to force"
+msgstr ""
+
+msgid "did you forget to merge? use push -f to force"
+msgstr ""
+"ați uitat să executați fuziunea? folosiți `push -f` pentru a forța acțiunea"
+
+msgid "note: unsynced remote changes!\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "abandon: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: eroare de parsare la %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: eroare de parsare: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: comanda '%s' este ambiguă:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "timpul de așteptare pentru lacătul deținut de %s a expirat"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "lacăt deținut de %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "abandon: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "abandon: nu s-a putut bloca %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "abandon: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "abandon: %s"
+
+msgid " empty string\n"
+msgstr " șir vid\n"
+
+msgid "killed!\n"
+msgstr ""
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: comandă necunoscută '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(ați uitat să compilați extensiile?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(instalarea dvs. Python este corectă?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "abandon: eroare: %s\n"
+
+msgid "broken pipe\n"
+msgstr ""
+
+msgid "interrupted!\n"
+msgstr "întrerupt!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+
+msgid "abort: out of memory\n"
+msgstr "abandon: memorie epuizată\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr ""
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr ""
+
+#, python-format
+msgid "** Python %s\n"
+msgstr ""
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+"** Mercurial - gestionar distribuit pentru controlul codului sursă\n"
+"(versiunea %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr "nu există nicio definiție pentru alias-ul '%s'\n"
+
+#, python-format
+msgid ""
+"No argument found for substitution of %i variable in alias '%s' definition."
+msgstr ""
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "alias-ul '%s' corespunde comenzii necunoscute '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "alias-ul '%s' corespunde comenzii ambigue '%s'\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr ""
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "eroare la obținerea directorului de lucru: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr ""
+
+msgid "option --config may not be abbreviated!"
+msgstr ""
+
+msgid "option --cwd may not be abbreviated!"
+msgstr ""
+
+msgid ""
+"Option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr "Durată: real %.3f sec (utilizator %.3f+%.3f sistem %.3f+%.3f)\n"
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr ""
+
+#, python-format
+msgid "no repository found in %r (.hg not found)"
+msgstr "nu s-a găsit niciun depozit în %r (nu s-a găsit .hg)"
+
+msgid "warning: --repository ignored\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+msgid "unterminated string"
+msgstr ""
+
+msgid "syntax error"
+msgstr ""
+
+msgid "starting revisions are not directly related"
+msgstr ""
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr ""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "disabled extensions:"
+msgstr ""
+
+msgid "Configuration Files"
+msgstr "Fișiere de configurare"
+
+msgid "Date Formats"
+msgstr "Formate de dată"
+
+msgid "File Name Patterns"
+msgstr "Șabloane pentru nume de fișiere"
+
+msgid "Environment Variables"
+msgstr "Variabile de mediu"
+
+msgid "Specifying Single Revisions"
+msgstr "Specificarea reviziilor simple"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Specificarea reviziilor multiple"
+
+msgid "Specifying Revision Sets"
+msgstr "Specificarea seturilor de revizii"
+
+msgid "Diff Formats"
+msgstr "Formate pentru diff"
+
+msgid "Merge Tools"
+msgstr ""
+
+msgid "Template Usage"
+msgstr "Folosirea șabloanelor"
+
+msgid "URL Paths"
+msgstr "Căi URL"
+
+msgid "Using additional features"
+msgstr "Folosirea facilităților suplimentare"
+
+msgid "Subrepositories"
+msgstr "Subdepozite"
+
+msgid "Configuring hgweb"
+msgstr "Configurarea hgweb"
+
+msgid "Glossary"
+msgstr "Glosar"
+
+msgid "syntax for Mercurial ignore files"
+msgstr "sintaxa pentru fișierele de ignorare Mercurial"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+
+msgid ""
+"Files\n"
+"-----"
+msgstr ""
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+
+msgid "| (Unix, Windows) ``<repo>/.hg/hgrc``"
+msgstr ""
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Unix, most of this file will be ignored if it doesn't belong to a\n"
+" trusted user or to a trusted group. See the documentation for the\n"
+" Trusted section below for more details."
+msgstr ""
+
+msgid ""
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+
+msgid ""
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+
+msgid ""
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected. If the\n"
+" pywin32 extensions are not installed, Mercurial will only look for\n"
+" site-wide configuration in ``C:\\Mercurial\\Mercurial.ini``."
+msgstr ""
+
+msgid ""
+"Syntax\n"
+"------"
+msgstr ""
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+
+msgid ""
+"Configuration keys can be set multiple times, in which case mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr ""
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different hgrc files. For example::"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr ""
+
+msgid "to include a different configuration file on each computer you use."
+msgstr ""
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr ""
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+
+msgid ""
+"Sections\n"
+"--------"
+msgstr ""
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial \"hgrc\" file, the purpose of each section, its possible keys,\n"
+"and their possible values."
+msgstr ""
+
+msgid ""
+"``alias``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr ""
+
+msgid " <alias> = <command> [<argument]..."
+msgstr ""
+
+msgid "For example, this definition::"
+msgstr ""
+
+msgid " latest = log --limit 5"
+msgstr ""
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+
+msgid " stable5 = latest -b stable"
+msgstr ""
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+
+msgid " echo = !echo"
+msgstr ""
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr ""
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expand to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expand to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+
+msgid ""
+"``auth``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the web_ configuration section if you want to\n"
+"configure *who* can login to your HTTP server."
+msgstr ""
+
+msgid "Each line has the following format::"
+msgstr ""
+
+msgid " <name>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+
+msgid "Supported arguments:"
+msgstr ""
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+
+msgid "Pipe example::"
+msgstr ""
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+
+msgid ""
+"\n"
+"``defaults``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr ""
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+
+msgid ""
+"\n"
+"``diff``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified`` is a\n"
+"Boolean and defaults to False."
+msgstr ""
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" Folosește formatul diff extins al lui git."
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" Afișează funcția în care se află fiecare modificare."
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+"``ignorews``\n"
+" Ignoră spațiul alb la compararea liniilor."
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+"``ignorewsamount``\n"
+" Ignoră modificările cantității de spațiu alb."
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+"``ignoreblanklines``\n"
+" Ignoră modificările ale căror linii sunt toate vide."
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+" Numărul liniilor de context care vor fi afișate."
+
+msgid ""
+"``email``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Settings for extensions that send email messages."
+msgstr ""
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the SMTP_ section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+
+msgid " Order of outgoing email character sets:"
+msgstr ""
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+
+msgid "Email example::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+
+msgid ""
+"\n"
+"``extensions``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+
+msgid "Example for ``~/.hgrc``::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+
+msgid "For example::"
+msgstr ""
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+
+msgid ""
+"\n"
+"``format``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+
+msgid ""
+"``merge-patterns``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+
+msgid ""
+"``merge-tools``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+
+msgid "Example ``~/.hgrc``::"
+msgstr ""
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"\n"
+"``hooks``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string."
+msgstr ""
+
+msgid "Example ``.hg/hgrc``::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook"
+msgstr ""
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr ""
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+
+msgid ""
+"``smtp``\n"
+"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+
+msgid ""
+"\n"
+"``patch``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+
+msgid ""
+"\n"
+"``paths``\n"
+"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+
+msgid ""
+"\n"
+"``profiling``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Specifies profiling format and file output. In this section\n"
+"description, 'profiling data' stands for the raw data collected\n"
+"during profiling, while 'profiling report' stands for a statistical\n"
+"text report generated from the profiling data. The profiling is done\n"
+"using lsprof."
+msgstr ""
+
+msgid ""
+"``format``\n"
+" Profiling format.\n"
+" Default: text."
+msgstr ""
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+
+msgid ""
+"``server``\n"
+"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Controls generic server settings."
+msgstr ""
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+
+msgid ""
+"``subpaths``\n"
+"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Defines subrepositories source locations rewriting rules of the form::"
+msgstr ""
+
+msgid " <pattern> = <replacement>"
+msgstr ""
+
+msgid ""
+"Where ``pattern`` is a regular expression matching the source and\n"
+"``replacement`` is the replacement string used to rewrite it. Groups\n"
+"can be matched in ``pattern`` and referenced in ``replacements``. For\n"
+"instance::"
+msgstr ""
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr ""
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr ""
+
+msgid "All patterns are applied in definition order."
+msgstr ""
+
+msgid ""
+"``trusted``\n"
+"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+
+msgid ""
+"\n"
+"``ui``\n"
+"\"\"\"\"\"\""
+msgstr ""
+
+msgid "User interface controls."
+msgstr ""
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the |hgignore(5)|_ man page."
+msgstr ""
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the merge-tools_ section."
+msgstr ""
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"\n"
+"``web``\n"
+"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr ""
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+
+msgid "The full set of options is:"
+msgstr "Setul complet de opțiuni este:"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates. The form must be as follows::"
+msgstr ""
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has one.\n"
+" On most Linux systems this will be ``/etc/ssl/certs/ca-certificates."
+"crt``.\n"
+" Otherwise you will have to generate this file manually."
+msgstr ""
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+" Portul pe care se va asculta (implicit: 8000)"
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr ""
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr ""
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (se subînțelege 'ora locală')\n"
+"- ``Dec 6 13:18 -0600`` (se subînțelege anul, diferența de fus orar este "
+"furnizată)\n"
+"- ``Dec 6 13:18 UTC`` (UTC și GMT sunt alias-uri pentru +0000)\n"
+"- ``Dec 6`` (miezul nopții)\n"
+"- ``13:18`` (se subînțelege 'astăzi')\n"
+"- ``3:39`` (se subînțelege 3:39AM)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (formatul ISO 8601)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr ""
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+
+msgid "The log command also accepts date ranges:"
+msgstr ""
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use configuration file)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+
+msgid "You may also specify the full path to an extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Changeset, close'."
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+
+msgid ""
+"Synopsis\n"
+"--------"
+msgstr ""
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+
+msgid ""
+"Description\n"
+"-----------"
+msgstr ""
+"Descriere\n"
+"---------"
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the\n"
+"``http://www.selenic.com/mercurial/hgrc.5.html`` man page for details\n"
+"of how to configure these files. Look for the \"ignore\" entry in the\n"
+"\"ui\" section."
+msgstr ""
+
+msgid ""
+"To control Mercurial's handling of files that it manages, see the\n"
+"``http://www.selenic.com/mercurial/hg.1.html`` man page. Look for\n"
+"the ``-I`` and ``-X`` options."
+msgstr ""
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr ""
+
+msgid " syntax: NAME"
+msgstr ""
+
+msgid "where ``NAME`` is one of the following:"
+msgstr ""
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+
+msgid ""
+"Example\n"
+"-------"
+msgstr ""
+
+msgid "Here is an example ignore file. ::"
+msgstr ""
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a collection of them. In the latter case, a special\n"
+"configuration file can be used to specify the repository paths to use\n"
+"and global web configuration options."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files,\n"
+"but only the following sections are recognized:"
+msgstr ""
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+
+msgid ""
+"The ``web`` section can specify all the settings described in the web\n"
+"section of the hgrc(5) documentation. See :hg:`help config` for\n"
+"information on where to find the manual page."
+msgstr ""
+
+msgid ""
+"The ``paths`` section provides mappings of physical repository\n"
+"paths to virtual ones. For instance::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" projects/a = /foo/bar\n"
+" projects/b = /baz/quux\n"
+" web/root = /real/root/*\n"
+" / = /real/root2/*\n"
+" virtual/root2 = /real/root2/**"
+msgstr ""
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry maps every Mercurial repository found in '/real/root'\n"
+" into 'web/root'. This format is preferred over the [collections] one,\n"
+" since using absolute paths as configuration keys is not supported on "
+"every\n"
+" platform (especially on Windows).\n"
+"- The fourth entry is a special case mapping all repositories in\n"
+" '/real/root2' in the root of the virtual directory.\n"
+"- The fifth entry recursively finds all repositories under the real\n"
+" root, and maps their relative paths under the virtual root."
+msgstr ""
+
+msgid ""
+"The ``collections`` section provides mappings of trees of physical\n"
+"repositories paths to virtual ones, though the paths syntax is generally\n"
+"preferred. For instance::"
+msgstr ""
+
+msgid ""
+" [collections]\n"
+" /foo = /foo"
+msgstr ""
+
+msgid ""
+"Here, the left side will be stripped off all repositories found in the\n"
+"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+"``bar`` and ``quux/baz`` respectively.\n"
+msgstr ""
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+" Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+" Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+" Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+" Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+" Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+" Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+
+msgid "File examples::"
+msgstr ""
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as branch names must be quoted with single or double\n"
+"quotes if they contain characters outside of\n"
+"``[._a-zA-Z0-9\\x80-\\xff]`` or if they match one of the predefined\n"
+"predicates."
+msgstr ""
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+
+msgid "These are the supported infix operators:"
+msgstr ""
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+
+msgid " An alternative syntax is ``x..y``."
+msgstr ""
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y.\n"
+" \n"
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+
+msgid "There is a single postfix operator:"
+msgstr ""
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+
+msgid " <alias> = <definition>"
+msgstr ""
+
+msgid ""
+"in the ``revsetalias`` section of ``.hgrc``. Arguments of the form `$1`, `"
+"$2`,\n"
+"etc. are substituted from the alias into the definition."
+msgstr ""
+
+msgid "For example,"
+msgstr ""
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ""
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr ""
+
+msgid "- Changesets on the default branch::"
+msgstr "- Seturi de modificări pe ramura curentă::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr ""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr ""
+
+msgid "- Open branch heads::"
+msgstr "- Capete de ramură deschise::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr ""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr ""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr ""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged())"
+"\"\n"
+msgstr ""
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group. External Mercurial and Subversion projects are currently\n"
+"supported."
+msgstr ""
+
+msgid "Subrepositories are made of three components:"
+msgstr ""
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory, and are Mercurial clones or Subversion\n"
+" checkouts."
+msgstr ""
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path. Subversion repositories are defined with:"
+msgstr ""
+
+msgid " path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"----------------------"
+msgstr ""
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"-----------------------------"
+msgstr ""
+"Sincronizarea unui subdepozit\n"
+"-----------------------------"
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+
+msgid ""
+"Deleting a Subrepository\n"
+"------------------------"
+msgstr ""
+"Ștergerea unui subdepozit\n"
+"-------------------------"
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"-----------------------------------"
+msgstr ""
+"Interacțiunea cu comenzile Mercurial\n"
+"------------------------------------"
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. It does this by first\n"
+" attempting to commit all modified subrepositories, then recording\n"
+" their state and finally committing it in the parent\n"
+" repository. Mercurial can be made to abort if any subrepository\n"
+" content is modified by setting \"ui.commitsubrepos=no\" in a\n"
+" configuration file (see :hg:`help config`)."
+msgstr ""
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories."
+msgstr ""
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"---------------------------------"
+msgstr ""
+"Refacerea corespondențelor cu sursele subdepozitelor\n"
+"----------------------------------------------------"
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ".. keywordsmarker"
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ".. filtersmarker\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "remote branch lookup not supported"
+msgstr ""
+
+msgid "dirstate branch not accessible"
+msgstr ""
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr ""
+
+msgid "can only share local repositories"
+msgstr ""
+
+msgid "destination already exists"
+msgstr ""
+
+msgid "updating working directory\n"
+msgstr "se actualizează directorul de lucru\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr ""
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr ""
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr ""
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "se actualizează la ramura %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+"%d fișiere actualizate, %d fișiere fuzionate, %d fișiere înlăturate, %d "
+"fișiere nerezolvate\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(fuziune între ramuri, nu uitați să depozitați)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "nu s-a găsit fișierul de configurare %s!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr ""
+
+msgid "IPv6 is not available on this system"
+msgstr ""
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr ""
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+msgid "exception from first failed import attempt:\n"
+msgstr ""
+
+msgid "exception from second failed import attempt:\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "kb"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr ""
+
+msgid "connection ended unexpectedly"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr ""
+
+msgid "operation not supported over http"
+msgstr ""
+
+msgid "authorization failed"
+msgstr ""
+
+msgid "http error, possibly caused by proxy setting"
+msgstr ""
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr ""
+
+#, python-format
+msgid "push failed: %s"
+msgstr ""
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr ""
+
+msgid "cannot create new http repository"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr ""
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "se omite fișierul ilizibil cu ignorări: '%s': %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "depozitul %s nu a fost găsit"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "depozitul %s există deja"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr ""
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr ""
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr ""
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr ""
+
+msgid "abandoned transaction found - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr ""
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr ""
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr ""
+
+msgid "rolling back unknown transaction\n"
+msgstr ""
+
+#, python-format
+msgid "named branch could not be reset, current branch is still: %s\n"
+msgstr ""
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "directorul de lucru se bazează acum pe reviziile %d și %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "directorul de lucru se bazează acum pe revizia %d\n"
+
+msgid "no rollback information available\n"
+msgstr ""
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr "depozitul %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "directorul de lucrul al %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+
+msgid "can't commit subrepos without .hgsub"
+msgstr ""
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "modificări nedepozitate în subdepozitul %s"
+
+msgid "file not found!"
+msgstr ""
+
+msgid "no match under directory!"
+msgstr ""
+
+msgid "file not tracked!"
+msgstr ""
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr ""
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr ""
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr ""
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr "se solicită toate modificările\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr ""
+
+msgid "bundling"
+msgstr "se creează bundle-ul"
+
+msgid "manifests"
+msgstr ""
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr ""
+
+msgid "adding changesets\n"
+msgstr "se adaugă seturile de modificări\n"
+
+msgid "chunks"
+msgstr ""
+
+msgid "received changelog group is empty"
+msgstr ""
+
+msgid "adding manifests\n"
+msgstr "se adaugă manifestele\n"
+
+msgid "adding file changes\n"
+msgstr "se adaugă modificările fișierelor\n"
+
+msgid "received file revlog group is empty"
+msgstr ""
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr "(%+d capete)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr ""
+"au fost adăugate %d seturi de modificări, conținând %d modificări în %d "
+"fișiere%s\n"
+
+msgid "Unexpected response from remote server:"
+msgstr ""
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr ""
+
+msgid "the server sent an unknown error code"
+msgstr ""
+
+msgid "streaming all changes\n"
+msgstr ""
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr ""
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr ""
+
+msgid "(using smtps)\n"
+msgstr ""
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr ""
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr ""
+
+msgid "(using starttls)\n"
+msgstr ""
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr ""
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr ""
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr ""
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr ""
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr ""
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr ""
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr ""
+
+msgid "invalid pattern"
+msgstr ""
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr ""
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid ""
+"untracked file in working directory differs from file in requested revision: "
+"'%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr "se determină manifestele\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+msgid "updating"
+msgstr "se actualizează"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s\n"
+msgstr "se obține %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "se obține %s în %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr ""
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr ""
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr ""
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr ""
+"modificări nedepozitate în suspensie (folosiți 'hg status' pentru a afișa "
+"modificările)"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "modificările încă nedepozitate în subdepozitul '%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+
+msgid "Attention:"
+msgstr ""
+
+msgid "Caution:"
+msgstr ""
+
+msgid "!Danger!"
+msgstr ""
+
+msgid "Error:"
+msgstr ""
+
+msgid "Hint:"
+msgstr ""
+
+msgid "Important:"
+msgstr ""
+
+msgid "Note:"
+msgstr "Notă:"
+
+msgid "Tip:"
+msgstr ""
+
+msgid "Warning!"
+msgstr ""
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr ""
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr ""
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr ""
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr ""
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr ""
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr ""
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr ""
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr ""
+
+msgid "patch failed to apply"
+msgstr ""
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr ""
+
+#, python-format
+msgid "exited with status %d"
+msgstr ""
+
+#, python-format
+msgid "killed by signal %d"
+msgstr ""
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr "se adaugă ramura\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr ""
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr ""
+
+msgid "index entry flags need RevlogNG"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr ""
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr ""
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s nu a fost găsit în tranzacție"
+
+msgid "consistency error in delta"
+msgstr "eroare de consistență în delta"
+
+msgid "unknown delta base"
+msgstr "bază necunoscută pentru delta"
+
+msgid "missing argument"
+msgstr ""
+
+#, python-format
+msgid "can't use %s here"
+msgstr ""
+
+msgid "can't use a list in this context"
+msgstr ""
+
+#, python-format
+msgid "not a function: %s"
+msgstr ""
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr ""
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr ""
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+
+msgid "~ expects a number"
+msgstr ""
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr ""
+
+msgid ""
+"``bisected(string)``\n"
+" Changesets marked in the specified bisect state (good, bad, skip)."
+msgstr ""
+
+msgid "bisect requires a string"
+msgstr ""
+
+msgid "invalid bisect state"
+msgstr ""
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr ""
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr ""
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr ""
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr ""
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr ""
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+
+msgid "filelog requires a pattern"
+msgstr ""
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments or a filename"
+msgstr ""
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments"
+msgstr ""
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr ""
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr ""
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr ""
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr ""
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr ""
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr ""
+
+msgid ""
+"``limit(set, n)``\n"
+" First n members of set."
+msgstr ""
+
+#. i18n: "limit" is a keyword
+msgid "limit requires two arguments"
+msgstr ""
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr ""
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr ""
+
+msgid ""
+"``last(set, n)``\n"
+" Last n members of set."
+msgstr ""
+
+#. i18n: "last" is a keyword
+msgid "last requires two arguments"
+msgstr ""
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr ""
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr ""
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr ""
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr ""
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr ""
+
+#, fuzzy
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([cale])``\n"
+" Nu s-au găsit seturi de modificări în depozitul destinație specificat\n"
+" sau în amplasarea implicită pentru `push`."
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr ""
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr ""
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr ""
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr ""
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+
+msgid ""
+"``roots(set)``\n"
+" Changesets with no parent changeset in set."
+msgstr ""
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+
+msgid " The keys can be:"
+msgstr ""
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr ""
+
+msgid "sort spec must be a string"
+msgstr ""
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr ""
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr ""
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+
+msgid "can't negate that"
+msgstr ""
+
+msgid "not a symbol"
+msgstr ""
+
+msgid "empty query"
+msgstr ""
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr ""
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr ""
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr ""
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr ""
+
+#, python-format
+msgid "path %r is inside nested repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr ""
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+msgid ".hg/requires file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "unknown repository format: requires feature '%s' (upgrade Mercurial)"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr "se caută modificări\n"
+
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr ""
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "searching for exact renames"
+msgstr ""
+
+msgid "searching for similar files"
+msgstr ""
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr ""
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "password in URL not supported"
+msgstr ""
+
+msgid "could not create remote repo"
+msgstr ""
+
+msgid "no suitable response from remote hg"
+msgstr "niciun răspuns potrivit de la hg-ul la distanță"
+
+msgid "remote: "
+msgstr "la distanță: "
+
+msgid "unexpected response:"
+msgstr ""
+
+#, python-format
+msgid "push refused: %s"
+msgstr ""
+
+msgid "certificate checking requires Python 2.6"
+msgstr "verificarea certificatului necesită Python 2.6"
+
+msgid "no certificate received"
+msgstr ""
+
+#, python-format
+msgid "certificate is for %s"
+msgstr ""
+
+msgid "IDN in certificate not supported"
+msgstr ""
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr ""
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr ""
+
+#, python-format
+msgid "%s certificate error: %s (use --insecure to connect insecurely)"
+msgstr ""
+
+#, python-format
+msgid "invalid certificate for %s with fingerprint %s"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "no certificate for %s with configured hostfingerprint"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: %s certificate not verified (check web.cacerts config setting)\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr ""
+
+msgid "cannot lock static-http repository"
+msgstr ""
+
+msgid "cannot create new static-http repository"
+msgstr ""
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr ""
+"avertisment: fișierul de specificație %s pentru subdepozit nu\n"
+"a fost găsit\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr ""
+
+msgid "missing ] in subrepo source"
+msgstr ""
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "calea implicită pentru subdepozitul %s nu a fost găsită"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr ""
+
+#, python-format
+msgid "archiving (%s)"
+msgstr ""
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "se clonează subdepozitul %s de la %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr ""
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr ""
+
+msgid "cannot retrieve svn tool version"
+msgstr ""
+
+msgid "cannot commit svn externals"
+msgstr ""
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr ""
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr ""
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr ""
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr ""
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s"
+msgstr ""
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr ""
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ""
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "metodă necunoscută '%s'"
+
+msgid "expected a symbol"
+msgstr ""
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "funcție necunoscută '%s'"
+
+msgid "expected template specifier"
+msgstr ""
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr ""
+
+msgid "unmatched quotes"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" nu se află în harta de șabloane"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr ""
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr "nu se poate folosi o tranzacție când este deja depozitată/abandonată"
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr ""
+
+msgid "transaction abort!\n"
+msgstr "tranzacție abandonată!\n"
+
+msgid "rollback completed\n"
+msgstr ""
+
+msgid "rollback failed - please run hg recover\n"
+msgstr ""
+
+msgid "already have changeset "
+msgstr ""
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr ""
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr ""
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr ""
+
+msgid "enter a commit username:"
+msgstr ""
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr ""
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr ""
+
+msgid "response expected"
+msgstr ""
+
+msgid "unrecognized response\n"
+msgstr ""
+
+msgid "password: "
+msgstr ""
+
+msgid "edit failed"
+msgstr ""
+
+msgid "http authorization required"
+msgstr ""
+
+msgid "http authorization required\n"
+msgstr ""
+
+#, python-format
+msgid "realm: %s\n"
+msgstr ""
+
+#, python-format
+msgid "user: %s\n"
+msgstr "utilizator: %s\n"
+
+msgid "user:"
+msgstr "utilizator:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr ""
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr ""
+
+msgid "check your clock"
+msgstr ""
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr ""
+
+#, python-format
+msgid "invalid date: %r"
+msgstr ""
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr ""
+
+#, python-format
+msgid "negative date value: %d"
+msgstr ""
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr ""
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr ""
+
+msgid "invalid day spec, use '<DATE'"
+msgstr ""
+
+msgid "invalid day spec, use '>DATE'"
+msgstr ""
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr ""
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr ""
+
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#, python-format
+msgid "%.2f GB"
+msgstr ""
+
+#, python-format
+msgid "%.0f MB"
+msgstr ""
+
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#, python-format
+msgid "%.2f MB"
+msgstr ""
+
+#, python-format
+msgid "%.0f KB"
+msgstr ""
+
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#, python-format
+msgid "%.2f KB"
+msgstr ""
+
+#, python-format
+msgid "%.0f bytes"
+msgstr ""
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr ""
+
+msgid "file:// URLs can only refer to localhost"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr ""
+
+msgid "interrupted"
+msgstr ""
+
+#, python-format
+msgid "empty or missing %s"
+msgstr ""
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr ""
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr ""
+
+#, python-format
+msgid " (expected %s)"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "se verifică părinții lui %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr ""
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr ""
+
+msgid "checking changesets\n"
+msgstr "se verifică seturile de modificări\n"
+
+msgid "checking"
+msgstr "se verifică"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr ""
+
+msgid "checking manifests\n"
+msgstr "se verifică manifestele\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr ""
+
+msgid "file without name in manifest"
+msgstr ""
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr ""
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr ""
+"se verifică încrucișat fișierele din seturile de modificări și manifeste\n"
+
+msgid "crosschecking"
+msgstr "se verifică încrucișat"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr ""
+
+msgid "in changeset but not in manifest"
+msgstr ""
+
+msgid "in manifest but not in changeset"
+msgstr ""
+
+msgid "checking files\n"
+msgstr "se verifică fișierele\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr ""
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr ""
+
+msgid "missing revlog!"
+msgstr ""
+
+#, python-format
+msgid "%s not in manifests"
+msgstr ""
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr ""
+
+#, python-format
+msgid "unpacking %s"
+msgstr ""
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr ""
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "se verifică redenumirea lui %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr ""
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr ""
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d fișiere, %d seturi de modificări, %d revizii totale\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr ""
+
+msgid "look up remote revision"
+msgstr "se caută revizia"
+
+msgid "push failed (unexpected response):"
+msgstr ""
+
+msgid "look up remote changes"
+msgstr "se caută modificări la distanță"
+
+msgid "push failed:"
+msgstr ""
+
+#~ msgid "not updating, since new heads added\n"
+#~ msgstr "nu se actualizează deoarece au fost adăugate noi capete\n"
+
+#~ msgid "record datecode as commit date"
+#~ msgstr "înregistrează codul de dată ca dată a depozitării"
+
+#~ msgid "base path"
+#~ msgstr "calea de bază"
+
+#~ msgid ""
+#~ "If there is a per-repository configuration file which is not owned by\n"
+#~ "the active user, Mercurial will warn you that the file is skipped::"
+#~ msgstr ""
+#~ "Dacă există un fișier de configurare la nivelul depozitului care nu\n"
+#~ "este proprietatea utilizatorului activ, Mercurial vă va avertiza că\n"
+#~ "fișierul este omis::"
+
+#~ msgid ""
+#~ " Return 0 on succces.\n"
+#~ " "
+#~ msgstr ""
+#~ " Returnează 0 în caz de succes.\n"
+#~ " "
+
+#~ msgid "Checking patch...\n"
+#~ msgstr "Se verifică patch-ul\n"
+
+#~ msgid ":user: Any text. Returns the user portion of an email address.\n"
+#~ msgstr ""
+#~ ":user: Orice text. Returnează porțiunea utilizator a unei adrese de e-"
+#~ "mail.\n"
+
+#, fuzzy
+#~ msgid "pulling subrepo %s\n"
+#~ msgstr "%d subdepozite"
+
+#~ msgid "options:"
+#~ msgstr "opțiuni:"
+
+#~ msgid "queue directory updating\n"
+#~ msgstr "actualizarea directorului se introduce în coadă\n"
+
+#~ msgid "replace existing tag"
+#~ msgstr "înlocuiește o etichetă existentă"
+
+#~ msgid " changesets"
+#~ msgstr "seturi de modificări"
+
+#~ msgid ""
+#~ " If no changeset is specified, attempt to update to the tip of the\n"
+#~ " current branch. If this changeset is a descendant of the working\n"
+#~ " directory's parent, update to it, otherwise abort."
+#~ msgstr ""
+#~ " Dacă nu se specifică nici un set de modificări, se încearcă "
+#~ "actualizarea\n"
+#~ " la vârful ramurii curente. Dacă acest set de modificări este "
+#~ "descendent\n"
+#~ " al părintelui directorului de lucru, se actualizează la el, altfel se "
+#~ "renunță."
+
+#~ msgid "check for uncommitted changes"
+#~ msgstr "verifică dacă există modificări nedepozitate"
+
+#~ msgid ""
+#~ " If no commit message is specified, the configured editor is\n"
+#~ " started to prompt you for a message."
+#~ msgstr ""
+#~ " Dacă nu specificați nici un mesaj pentru depozitare, se va\n"
+#~ " lansa editorul menționat în configurație pentru a scrie un mesaj."
+
+#~ msgid "Checking extensions...\n"
+#~ msgstr "Se verifică extensiile...\n"
+
+#~ msgid "unmark files as resolved"
+#~ msgstr "de-marchează fișierul drept rezolvat"
diff --git a/i18n/ru.po b/i18n/ru.po
new file mode 100644
index 0000000..7192c6e
--- /dev/null
+++ b/i18n/ru.po
@@ -0,0 +1,25398 @@
+# Russian translations for Mercurial package.
+# Copyright (C) 2011 Matt Mackall <mpm@selenic.com> and others
+# This file is distributed under the same license as the Mercurial package.
+# === Glossary ===
+#
+#
+# Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ Ñтруктура
+#
+# repository — хранилище (не «репозиторий»)
+# subrepository — подхранилище (не «Ñубрепозиторий»)
+# store — Ñклад (= меÑто Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в LargefilesExtension),
+# (не «хранилище»)
+# directory — каталог (не «директорий», не «директориÑ»)
+# folder — папка
+# source — иÑточник
+# source file — иÑходный файл
+# destination — назначение
+# destination file — файл назначениÑ
+#
+#
+# ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¾Ñновных дейÑтвий
+#
+# commit — гл. фикÑировать, Ñущ. фикÑÐ°Ñ†Ð¸Ñ (не «коммит», не «коммитить»)
+# commit message — Ñообщение фикÑации
+# commit comment — комментарий Ñ Ñообщением фикÑации (только Ð´Ð»Ñ BugzillaExtension)
+# log — журнал
+# log message — Ñообщение журнала, журнальное Ñообщение
+# log entry — запиÑÑŒ журнала, Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ
+# pull — затÑнуть (не «подтÑнуть»)
+# push — протолкнуть (не «затолкнуть»)
+# update — обновить (~ до определённой ревизии)
+# refresh — обновить изображение (имеет ÑмыÑл только Ð´Ð»Ñ GUI)
+# checkout — извлечь (напр. из хранилища Subversion)
+# resolve — уладить (конфликт)
+# revert — вернуть
+# discard — отброÑить
+#
+# Слова на тему «удаление»
+#
+# clean — чиÑтый (~ локальный файл, не Ñодержащий изменений по Ñравнению Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼)
+# clean working copy — чиÑÑ‚Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ (= не ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ð¸Ð·Ð¼ÐµÐ½Ñ‘Ð½Ð½Ñ‹Ñ… файлов)
+# purge — зачиÑтить (напр. удалить неиÑпользуемые файлы из рабочей копии),
+# (не «удалить», не «очиÑтить»)
+# strip — Ñрезать (~ ревизию и вÑех её потомков)
+# strip revision — Ñрезать ревизию
+# delete — удалить, уничтожить (напр. Ñтереть Ñ Ð´Ð¸Ñка)
+# remove — изъÑÑ‚ÑŒ (из-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий, не «удалить»)
+#
+#
+# Слова на тему «ÑлиÑние»
+#
+# branch — ветка (не «ветвь», не «бранч»), гл. ветвление
+# frozen branch — Ð·Ð°Ð¼Ð¾Ñ€Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°
+# named branch — Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°
+# diff — Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ (не «дифф»)
+# merge — Ñлить (Ñущ. «ÑлиÑние»)
+# backout — обратить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (~ Ñделанные в ранней ревизии)
+# rollback — откатить (~ транзакцию)
+# cancel — отменить
+#
+# Слова на тему «управление изменениÑми»
+#
+# bundle — комплект (не «бандл», не «пачка»)
+# to bundle several changesets — укомплектовать неÑколько наборов изменений
+# binary bundle — двоичный комплект
+# ??? batch — порциÑ
+# patch — заплатка, патч, накладывать заплатку, патчить, пропатчить
+# ??? apply patch — наложить заплатку (не «применить заплатку»)
+# ??? unapply patch — отпороть заплатку
+# ??? fold patch(es) — подшить заплатки (~ к Ñамой верхней наложенной заплатке)
+# ??? chunk, hunk — лоÑкут (= чаÑÑ‚ÑŒ заплатки)
+# ??? shelf — долгий Ñщик (= меÑто Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»Ð°Ð´Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹) ;)
+# shelve — отложить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (в долгий Ñщик)
+#
+#
+# Разное
+#
+# amend - иÑправлÑÑ‚ÑŒ
+# extension — раÑширение
+# option — параметр (не «опциÑ»)
+# options — параметры (не «наÑтройки»)
+# settings — наÑтройки (не «уÑтановки»)
+# hook — хук, перехватчик, (не «крючок», не «ловушка», не «уловка», не «зацепка»)
+# hook script — хук, Ñкрипт-перехватчик (не «Ñкрипт ловушки»)
+# иногда Ñлово hook употреблÑетÑÑ Ð² том же ÑмыÑле, что и intercepted action (например, в документации)
+# — тогда его Ñледует переводить как «перехватываемое дейÑтвие/Ñобытие» или «точка/момент перехвата»
+#
+# alias — пÑевдоним
+# changeset — набор изменений
+# revision — ревизиÑ
+# status — ÑоÑтоÑние
+# head — голова (= ревизиÑ, не Ð¸Ð¼ÐµÑŽÑ‰Ð°Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ñ… ревизий)
+# tip — наконечник, Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ
+# tip revision — Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ
+#
+# changegroup группа изменений
+# tag метка
+# working copy Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ
+# hash Ñ…Ñш
+# glob глоб, glob, (thg: «маÑка файла (glob)»)
+# binary бинарный
+# basename ?
+# import импортировать
+# export ÑкÑпортировать
+# rename переименовывать
+# undo отменить
+# track отÑлеживать
+# committer автор фикÑации
+# whitespace пробельный Ñимвол
+# match Ñовпадать (о шаблоне)
+# restricted ограниченный
+# graft перенеÑти (изменениÑ) ??? вообще переÑадить
+# id идентификатор
+# guard (в mq) Ñтраж (необходимо поÑÑнение) (thg: «Ñтражник» без вÑÑких поÑÑнений)
+# positive/negative guard положительный/отрицательный Ñтраж ??? (может разрешающий/запрещающий?)
+# apply patch наложить патч
+# fuzz (patch) неÑоответÑтвие контекÑтов (в патче и целевом файле) ???
+# series (mq) поÑледовательноÑÑ‚ÑŒ
+# pop (о Ñтеке) вытолкнуть (может пиÑать извлечь из Ñтека/помеÑтить в Ñтек) ???
+# push (о Ñтеке) протолкнуть Ñм. pop ???
+# save entry запиÑÑŒ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ???
+# versioned находÑщийÑÑ Ð¿Ð¾Ð´ контролем верÑий, верÑионируемый
+# queue repository хранилище очереди
+# nested вложенный
+# deprecated уÑтаревший
+# backup Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ
+# finish (mq, qfinish) финализировать??? (thg: завершить заплатку)
+# fold (patch) подшить ??? вообще Ñвернуть
+# imply подразумевать
+# rebase перебазировать
+# root корень, ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ ???
+# progress bar индикатор выполнениÑ
+# map (file) ??? да и вообще вÑе Ñ map плохо (вариант: ÑопоÑтавление)
+# abort отмена или оÑтанов (в ÑтатуÑах) (thg: прервать, прервано)
+# checkin (в конфиге Ð´Ð»Ñ encode/decode) ÑÐµÐ¹Ñ‡Ð°Ñ Ñ„Ð¸ÐºÑÐ°Ñ†Ð¸Ñ ???
+# lookup поиÑк ???
+# facility ???
+# obsolete marker маркер уÑтаревшей ревизии
+#
+#
+# === TODO ===
+#
+# Эти вещи требуют доработки
+#
+# - keyword template maps в keywords - придумать лучший перевод
+# - вычитка, иÑправление опечаток, ÑтилиÑтика многих предложений
+# - протеÑтировать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибках (Ñ Ð½Ðµ видел многих из них в работе)
+# - Ñтроки Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÑŒÑким вводом (вида &Local). Пока не знаю, как они обрабатываютÑÑ.
+# - чиÑлительные - ÑÐµÐ¹Ñ‡Ð°Ñ Ð²Ñегда множеÑтвенное чиÑло
+# - придумать перевод Ð´Ð»Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð¾Ð² Ñ ???
+# - пометить как-то Ñтроки, которые не требуют перевода или не будут переводитьÑÑ,
+# чтобы можно легко понÑÑ‚ÑŒ, Ñколько еще оÑталоÑÑŒ Ñделать.
+# - в какой форме д.б. глаголы Ñообщений о текущем дейÑтвии:
+# 1 л ед.ч. - загружаю обновлениÑ,
+# 1 л мн.ч - загружаем обновлениÑ, -- Так! // comment by Andrei Polushin
+# 3 л - загружаютÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ?
+# Сюда же отноÑÑÑ‚ÑÑ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ cannot do smth: не могу Ñделать что-то или что-то невозможно?
+# Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾Ñледний вариант. -- Рлучше «не удаётÑÑ» // comment by Andrei Polushin
+# - внеÑти Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑоглаÑованных терминов в hg glossary
+# - bisect - можно во многих меÑтах употреблÑÑ‚ÑŒ термин "биÑекциÑ" (употреблÑетÑÑ Ð² thg)
+# вмеÑто неуклюжего "метод Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿Ð¾Ð»Ð°Ð¼". Это уÑтоÑвшийÑÑ Ñ‚ÐµÑ€Ð¼Ð¸Ð½.
+# - в Ñтроке должно быть не более 75 Ñимволов!
+# - переводить ли примеры конфигов? Ñ Ð¾Ñтавил как еÑÑ‚ÑŒ, чтобы пользователь
+# привыкал к англ, Ñ‚.к. вÑе наÑтройки Mercurial на англ
+# - Attention Caution !Danger! Error Hint Important Note Tip Warning!
+# ÐºÐ°ÐºÐ°Ñ Ñ€Ð°Ð·Ð½Ð¸Ñ†Ð°?
+# - schemes - не понÑл, как пользоватьÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸. может, надо подкорректировать
+# опиÑание или добавить примеров?
+# - log message и commit message - одно и то же?
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2012-08-01 18:47+0400\n"
+"PO-Revision-Date: 2011-05-12 23:48+0400\n"
+"Last-Translator: Alexander Sauta <demosito@gmail.com>\n"
+"Language-Team: Russian\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (по умолчанию: %s)"
+
+msgid "Options"
+msgstr "ÐаÑтройки"
+
+msgid "Commands"
+msgstr "Команды"
+
+msgid "Extensions"
+msgstr "РаÑширениÑ"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Этот раздел Ñодержит Ñправку по раÑширениÑм, включенным в Ñтандартный "
+"диÑтрибутив Mercurial. Справка по другим раÑширениÑм может быть получена в "
+"Ñправочной ÑиÑтеме."
+
+msgid "Options:"
+msgstr "Параметры:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " пÑевдонимы: %s"
+
+# {{{ Start of extensions
+msgid "hooks for controlling repository access"
+msgstr "хуки Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа к хранилищу"
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+"Этот хук позволÑет разрешить или запретить доÑтуп на запиÑÑŒ к заданным\n"
+"веткам и путÑм хранилища во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð²Ñ…Ð¾Ð´Ñщих наборов изменений\n"
+"через pretxnchangegroup и pretxncommit."
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+"ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ñнована на локальном имени пользователÑ\n"
+"ÑиÑтемы, где выполнÑетÑÑ Ñ…ÑƒÐº, а не на имени автора (committer) иÑходного\n"
+"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (changeset) (так как поÑледний имеет чиÑто информативный характер)."
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+"Хук авторизации (acl hook) лучше вÑего иÑпользовать вмеÑте Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð½Ð¾Ð¹ "
+"(restricted) оболочкой, как, например hgsh,\n"
+"ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰Ð°ÐµÑ‚ доÑтуп ко вÑему кроме push или pull неавторизованными "
+"пользователÑми.\n"
+"Хук небезопаÑно иÑпользовать, еÑли иÑпользуетÑÑ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ°,\n"
+"так как при Ñтом пользователи могут отключить хук. Это также небезопаÑно "
+"еÑли\n"
+"отдалённые пользователи разделÑÑŽÑ‚ один и тот же аккаунт, так как при Ñтом "
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ‚ÑŒ пользователей."
+
+msgid "The order in which access checks are performed is:"
+msgstr "ПорÑдок, в котором выполнÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ доÑтупа:"
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+"1) СпиÑок запретов Ð´Ð»Ñ Ð²ÐµÑ‚Ð¾Ðº (раздел ``acl.deny.branches``)\n"
+"2) СпиÑок разрешений Ð´Ð»Ñ Ð²ÐµÑ‚Ð¾Ðº (раздел ``acl.allow.branches``)\n"
+"3) СпиÑок запретов Ð´Ð»Ñ Ð¿ÑƒÑ‚ÐµÐ¹ (раздел ``acl.deny``)\n"
+"4) СпиÑок разрешений Ð´Ð»Ñ Ð¿ÑƒÑ‚ÐµÐ¹ (раздел ``acl.allow``)"
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+"Одобренный и отказной разделы (Ñекции ``allow`` и ``deny``) принимают пары "
+"ключ-значение."
+
+msgid ""
+"Branch-based Access Control\n"
+"---------------------------"
+msgstr ""
+"Контроль доÑтупа по веткам\n"
+"--------------------------"
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+"ИÑпользуйте разделы ``acl.deny.branches`` и ``acl.allow.branches``\n"
+"чтобы получить контроль доÑтупа, оÑнованный на ветке. Ключами в Ñтих "
+"разделах могут быть:"
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+"- Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, или\n"
+"- звёздочка, чтобы выбрать любую ветку;"
+
+msgid "The corresponding values can be either:"
+msgstr "СоответÑтвующие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть:"
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+"- ÑпиÑок, разделённый запÑтыми, Ñодержащий пользователей и группы, или\n"
+"- звёздочка, чтобы выбрать любого;"
+
+msgid ""
+"You can add the \"!\" prefix to a user or group name to invert the sense\n"
+"of the match."
+msgstr ""
+"Ð’Ñ‹ можете добавить Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ \"!\" перед именем Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ группы, "
+"чтобы\n"
+"изменить ÑмыÑл правила на противоположный."
+
+msgid ""
+"Path-based Access Control\n"
+"-------------------------"
+msgstr ""
+"Контроль доÑтупа по путÑм\n"
+"-------------------------"
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+"ИÑпользуйте разделы ``acl.deny`` и ``acl.allow`` Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа, "
+"оÑнованного на пути.\n"
+"Ключи в Ñтих разделах принимают шаблон Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€ÐµÐ²Ð° (Ñ\n"
+"ÑинтакÑиÑом glob по умолчанию). СоответÑтвующие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñледуют тем же "
+"ÑинтакÑичеÑким правилам,\n"
+"что и вышеперечиÑленные разделы."
+
+msgid ""
+"Groups\n"
+"------"
+msgstr ""
+"Группы\n"
+"------"
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+"Имена групп должны начинатьÑÑ Ñ Ñимвола ``@``. ЕÑли Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ задано,\n"
+"Ñто даёт тот же Ñффект, что и указание вÑех пользователей в Ñтой группе."
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+"Можно задать членов группы в разделе ``acl.groups``.\n"
+"ЕÑли Ð¸Ð¼Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ там не определено, и Mercurial работает под управлением\n"
+"Unix-подобной ÑиÑтемы, то ÑпиÑок пользователей будет определÑÑ‚ÑŒÑÑ "
+"операционной ÑиÑтемой.\n"
+"Ð’ противном Ñлучае генерируетÑÑ Ð¸Ñключение."
+
+msgid ""
+"Example Configuration\n"
+"---------------------"
+msgstr ""
+"Пример конфигурации\n"
+"-------------------"
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr " [hooks]"
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+" # ИÑпользуйте Ñто еÑли хотите проверÑÑ‚ÑŒ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа во Ð²Ñ€ÐµÐ¼Ñ "
+"фикÑации\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+" # ИÑпользуйте Ñто еÑли хотите проверÑÑ‚ÑŒ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа Ð´Ð»Ñ pull, "
+"push,\n"
+" # bundle и serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+" [acl]\n"
+" # Разрешать или запрещать доÑтуп к входÑщим изменениÑм только еÑли их "
+"первоиÑточник\n"
+" # указан здеÑÑŒ, разрешать в противном Ñлучае. ИÑточник - \"serve\" Ð´Ð»Ñ "
+"вÑех\n"
+" # отдалённых операций (по http или ssh), или же \"push\", \"pull\" или "
+"\"bundle\", когда\n"
+" # ÑоответÑтвующие команды выполнÑÑŽÑ‚ÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾.\n"
+" # По умолчанию: serve\n"
+" sources = serve"
+
+msgid " [acl.deny.branches]"
+msgstr " [acl.deny.branches]"
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+" # Ð’Ñем закрыт доÑтуп к ветке frozen:\n"
+" frozen-branch = *"
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+" # Плохой пользователь забанен на вÑех ветках:\n"
+" * = bad-user"
+
+msgid " [acl.allow.branches]"
+msgstr " [acl.allow.branches]"
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+" # Ðекоторые пользователи допущены в branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+" # Только один пользователь допущен в branch-b:\n"
+" branch-b = user-1"
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+" # ÐдминиÑтратор допущен в любую ветку:\n"
+" * = super-user"
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+" # Ð’Ñе допущены в branch-for-tests:\n"
+" branch-for-tests = *"
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+" [acl.deny]\n"
+" # Этот ÑпиÑок проверÑетÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¼. ЕÑли найдено Ñовпадение, acl.allow не\n"
+" # проверÑетÑÑ. Ð’Ñе пользователи получают доÑтуп еÑли acl.deny "
+"отÑутÑтвует.\n"
+" # Формат Ð´Ð»Ñ Ð¾Ð±Ð¾Ð¸Ñ… ÑпиÑков: glob-шаблон = пользователь, ..., @группа, ..."
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+" # Чтобы обозначить любого пользователÑ, иÑпользуйте звёздочку:\n"
+" # my/glob/pattern = *"
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+" # user6 не будет иметь прав на запиÑÑŒ Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ файла:\n"
+" ** = user6"
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+" # Группа \"hg-denied\" не будет иметь прав на запиÑÑŒ Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ файла:\n"
+" ** = @hg-denied"
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+" # Ðикто не Ñможет изменить файл \"DONT-TOUCH-THIS.txt\", неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, "
+"что\n"
+" # вÑе могут менÑÑ‚ÑŒ любые другие файлы. См. далее.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+" [acl.allow]\n"
+" # ЕÑли acl.allow отÑутÑтвует, вÑе пользователи разрешены по умолчанию,\n"
+" # пуÑтой acl.allow означает что никому нет доÑтупа"
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+" # Пользователь \"doc_writer\" имеет доÑтуп на запиÑÑŒ Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ файла в "
+"\"docs\"\n"
+" # папке:\n"
+" docs/** = doc_writer"
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+" # Пользователь \"jack\" и группа \"designers\" имеют доÑтуп на запиÑÑŒ Ð´Ð»Ñ "
+"любого файла\n"
+" # в папке \"images\":\n"
+" images/** = jack, @designers"
+
+msgid ""
+" # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+" # will have write access to any file under the \"resources\" folder\n"
+" # (except for 1 file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+" # Любой пользователь (за иÑключением \"user6\" и \"@hg-denied\" - Ñм. acl."
+"deny\n"
+" # выше) получит доÑтуп на запиÑÑŒ\n"
+" # в любой файл в папке \"resources\" (за иÑключением 1 файла. См. acl."
+"deny):\n"
+" src/main/resources/** = *"
+
+msgid " .hgtags = release_engineer"
+msgstr " .hgtags = release_engineer"
+
+msgid ""
+"Examples using the \"!\" prefix\n"
+"............................."
+msgstr ""
+"Примеры иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑа \"!\"\n"
+".................................."
+
+msgid ""
+"Suppose there's a branch that only a given user (or group) should be able "
+"to\n"
+"push to, and you don't want to restrict access to any other branch that may\n"
+"be created."
+msgstr ""
+"ДопуÑтим, еÑÑ‚ÑŒ ветка, доÑтуп на запиÑÑŒ к которой должен иметь только "
+"заданный\n"
+"пользователь или группа, и вы не хотите ограничивать доÑтуп к другим веткам."
+
+msgid ""
+"The \"!\" prefix allows you to prevent anyone except a given user or group "
+"to\n"
+"push changesets in a given branch or path."
+msgstr ""
+"ÐŸÑ€ÐµÑ„Ð¸ÐºÑ \"!\" позволÑет запретить вÑем, кроме заданного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸\n"
+"группы проталкивать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² заданную ветку или по заданному пути."
+
+msgid ""
+"In the examples below, we will:\n"
+"1) Deny access to branch \"ring\" to anyone but user \"gollum\"\n"
+"2) Deny access to branch \"lake\" to anyone but members of the group \"hobbit"
+"\"\n"
+"3) Deny access to a file to anyone but user \"gollum\""
+msgstr ""
+"Ð’ Ñледующем примере мы:\n"
+"1) Запретим доÑтуп к ветке \"ring\" вÑем, кроме Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"gollum\"\n"
+"2) Запретим доÑтуп к ветке \"lake\" вÑем, кроме членов группы \"hobbit\"\n"
+"3) Запретим доÑтуп к файлу вÑем, кроме Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ \"gollum\""
+
+msgid ""
+" [acl.allow.branches]\n"
+" # Empty"
+msgstr ""
+" [acl.allow.branches]\n"
+" # ПуÑто"
+
+msgid ""
+" # 1) only 'gollum' can commit to branch 'ring';\n"
+" # 'gollum' and anyone else can still commit to any other branch.\n"
+" ring = !gollum"
+msgstr ""
+" # 1) только 'gollum' может фикÑировать в ветку 'ring';\n"
+" # 'gollum' и вÑе оÑтальные погут фикÑировать в любую другую ветку.\n"
+" ring = !gollum"
+
+msgid ""
+" # 2) only members of the group 'hobbit' can commit to branch 'lake';\n"
+" # 'hobbit' members and anyone else can still commit to any other branch.\n"
+" lake = !@hobbit"
+msgstr ""
+" # 2) только члены группы 'hobbit' могут фикÑировать в ветку 'lake';\n"
+" # члены группы 'hobbit' и вÑе оÑтальные могут фикÑировать в любую другую "
+"ветку.\n"
+" lake = !@hobbit"
+
+msgid " # You can also deny access based on file paths:"
+msgstr " # Можно также запрещать доÑтуп к определенным путÑм:"
+
+msgid ""
+" [acl.allow]\n"
+" # Empty"
+msgstr ""
+" [acl.allow]\n"
+" # ПуÑто"
+
+msgid ""
+" [acl.deny]\n"
+" # 3) only 'gollum' can change the file below;\n"
+" # 'gollum' and anyone else can still change any other file.\n"
+" /misty/mountains/cave/ring = !gollum"
+msgstr ""
+" [acl.deny]\n"
+" # только 'gollum' может изменÑÑ‚ÑŒ нижеперечиÑленные файлы;\n"
+" # 'gollum' и вÑе оÑтальные могут изменÑÑ‚ÑŒ любой другой файл.\n"
+" /misty/mountains/cave/ring = !gollum"
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "группа '%s' не определена"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+"ошибка конфигурации - хук типа \"%s\" не может предотвратить входÑщие "
+"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (changesets, commits)"
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr "acl: пользователь \"%s\" не допущен в ветку \"%s\" (Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr "acl: пользователь \"%s\" не допущен в ветку \"%s\" (Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: пользователь \"%s\" не допущен в \"%s\" (Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr "acl: пользователь \"%s\" не допущен в \"%s\" (Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr "хуки Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ Ñ Bugzilla bug tracker"
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+"Это раÑширение, предоÑтавлÑющее хуки, добавлÑет комментариии к багам\n"
+"в Bugzilla, когда вÑтречает наборы изменений, привÑзанные к багам c помощью\n"
+"Bugzilla ID. Комментарий форматируетÑÑ Ñ Ð¸Ñпользованием механизма шаблонов\n"
+"Mercurial."
+
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+"СÑылки на баги могут включать обновление затраченного времени длÑ\n"
+"Bugzilla. Можно также помечать баги как иÑправленные."
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr "ПредоÑтавлÑÑŽÑ‚ÑÑ Ñ‚Ñ€Ð¸ оÑновных режима доÑтупа к Bugzilla:"
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"1. ДоÑтуп через Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Bugzillа XMLRPC. ТребуетÑÑ Bugzilla 3.4 или новее."
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+"2. ПроверÑÑ‚ÑŒ данные через Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Bugzilla XMLRPC и отправлÑÑ‚ÑŒ изменениÑ\n"
+" бага по почте через email-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Bugzilla. ТребуетÑÑ Bugzilla 3.4 или "
+"новее."
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+"3. ПрÑÐ¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в базу данных Bugzilla. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ уÑтановка\n"
+" Bugzilla c MySQL. ТребуетÑÑ Python MySQLdb."
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+"ПрÑÐ¼Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в базу данных чувÑтвительна к изменениÑм в ее Ñхеме и\n"
+"полагаетÑÑ Ð½Ð° Ñкрипт из каталога contrib Bugzilla при отправке\n"
+"уведомлений об изменении бага по email. Этот Ñкрипт запуÑкаетÑÑ\n"
+"от имени пользователÑ, запуÑкающего Mercurial, должен быть запущен\n"
+"на машине, на которой уÑтановлена Bugzilla, и требует прав на чтение\n"
+"конфигурации Bugzilla, а также обÑзательно имени и Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "
+"MySQL,\n"
+"имеющего полный доÑтуп к ее базе данных. По Ñтим причинам Ñтот режим\n"
+"признан уÑтаревшим и не будет обновлÑÑ‚ÑŒÑÑ Ð² новых верÑиÑÑ… Bugzilla."
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
+"later."
+msgstr ""
+"ДоÑтуп по XMLRPC требует Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ и Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Bugzilla\n"
+"в наÑтройках. Комментарии добавлÑÑŽÑ‚ÑÑ Ð¾Ñ‚ имени Ñтого пользователÑ.\n"
+"ПоÑкольку наÑтройки должны быть доÑтупны на чтение вÑем пользователÑм\n"
+"Mercurial, рекомендуетÑÑ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡Ð¸Ñ‚ÑŒ Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Bugzilla\n"
+"макÑимально, разрешив только добавлÑÑ‚ÑŒ комментарии. Ð”Ð»Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтипомечать "
+"баги как иÑправленные (fixed), требует Bugzilla верÑии не\n"
+"ниже 4.0."
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+"ДоÑтуп через XMLRPC/email иÑпользует XMLRPC Ð´Ð»Ñ Ð¾Ð¿Ñ€Ð¾Ñа Bugzilla, но\n"
+"Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ² к багам отправлÑет пиÑьма на email-интерфейÑ\n"
+"Bugzilla. ÐÐ´Ñ€ÐµÑ From: (От:) в пиÑьме уÑтанавливаетÑÑ Ð² email-Ð°Ð´Ñ€ÐµÑ "
+"пользователÑ\n"
+"Mercurial, поÑтому комментарии оÑтавлÑÑŽÑ‚ÑÑ Ð¾Ñ‚ имени пользователÑ\n"
+"Mercurial. Ð’ Ñлучае, еÑли почтовый Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Mercurial не\n"
+"опознаетÑÑ Bugzill'ой как ее пользователь, в качеÑтве иÑточника\n"
+"комментариев иÑпользуетÑÑ Ð°Ð´Ñ€ÐµÑ email, привÑзанный к пользователю\n"
+"Bugzilla, от имени которого выполнÑлÑÑ Ð²Ñ…Ð¾Ð´. ВозможноÑÑ‚ÑŒ помечать баги\n"
+"как иÑправленные доÑтупна на вÑех поддерживаемых верÑÐ¸Ñ Bugzilla."
+
+msgid "Configuration items common to all access modes:"
+msgstr "Общие параметры Ð´Ð»Ñ Ð²Ñех режимов доÑтупа:"
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+"bugzilla.version\n"
+" Тип доÑтупа. Возможны Ñледующие значениÑ:"
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+" :``xmlrpc``: Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Bugzilla XMLRPC.\n"
+" :``xmlrpc+email``: ИнтерфейÑÑ‹ Bugzilla XMLRPC и email.\n"
+" :``3.0``: ДоÑтуп к MySQL, Bugzilla 3.0 и новее.\n"
+" :``2.18``: ДоÑтуп к MySQL, Bugzilla 2.18 и до 3.0 (не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ "
+"3.0)\n"
+" :``2.16``: ДоÑтуп к MySQL, Bugzilla 2.16 и до 2.18 (не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ "
+"2.18)"
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs for update in changeset commit "
+"message.\n"
+" It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+" IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.regexp\n"
+" РегулÑрное выражение, определÑющее ID обновлÑемого бага в Ñообщении\n"
+" фикÑации.\n"
+" Оно должно Ñодержать одну именованную группу в круглых Ñкобках Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+" ``<ids>``, Ñодержащую идентификаторы багов, разделенные нецифровыми\n"
+" Ñимволами. Оно также может Ñодержвать группу ``<hours>`` Ñ Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼\n"
+" чиÑлом, определÑющим затраченное на баг времÑ. ЕÑли ни одна именованнаÑ\n"
+" группа не определена, Ð¿ÐµÑ€Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° в круглых Ñкоках ÑчитаетÑÑ Ñодержащей\n"
+" идентификатор бага, затраченное Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ обновлÑетÑÑ. Выражение, "
+"определенное\n"
+" по умолчанию, Ñовпадет Ñ ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` и\n"
+" подобными вариациÑми, Ñ Ð¿Ð¾Ñледующим количеÑтвом затраченного времени в "
+"чаÑах\n"
+" Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом ``h`` или ``hours``, например ``hours 1.5``. РегиÑÑ‚Ñ€ букв не\n"
+" учитываетÑÑ."
+
+msgid ""
+"bugzilla.fixregexp\n"
+" Regular expression to match bug IDs for marking fixed in changeset\n"
+" commit message. This must contain a \"()\" named group ``<ids>` "
+"containing\n"
+" the bug IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
+"1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+"bugzilla.fixregexp\n"
+" РегулÑрное выражение, определÑющее ID бага, помечаемого как иÑправленный,\n"
+" в Ñообщении фикÑации.\n"
+" Оно должно Ñодержать именованную группу в круглых Ñкобках Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+" ``<ids>``, Ñодержащую идентификаторы багов, разделенные нецифровыми\n"
+" Ñимволами. Оно также может Ñодержвать группу ``<hours>`` Ñ Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼\n"
+" чиÑлом, определÑющим затраченное на баг времÑ. ЕÑли ни одна именованнаÑ\n"
+" группа не определена, Ð¿ÐµÑ€Ð²Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° в круглых Ñкоках ÑчитаетÑÑ Ñодержащей\n"
+" идентификатор бага, затраченное Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ обновлÑетÑÑ. Выражение, "
+"определенное\n"
+" по умолчанию, Ñовпадет Ñ ``Fixes 1234``, ``Fixes bug 1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` и\n"
+" подобными вариациÑми, Ñ Ð¿Ð¾Ñледующим количеÑтвом затраченного времени в "
+"чаÑах\n"
+" Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом ``h`` или ``hours``, например ``hours 1.5``. РегиÑÑ‚Ñ€ букв не\n"
+" учитываетÑÑ."
+
+msgid ""
+"bugzilla.fixstatus\n"
+" The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+"bugzilla.fixstatus\n"
+" СтатуÑ, который приÑваиваетÑÑ Ð±Ð°Ð³Ñƒ, когда он помечаетÑÑ ÐºÐ°Ðº иÑправленный.\n"
+" По умолчанию ``RESOLVED``."
+
+msgid ""
+"bugzilla.fixresolution\n"
+" The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+"bugzilla.fixresolution\n"
+" РезолюциÑ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸ÑваиваетÑÑ Ð±Ð°Ð³Ñƒ, когда он помечаетÑÑ ÐºÐ°Ðº "
+"иÑправленный.\n"
+" По умолчанию ``FIXED``."
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+"bugzilla.style\n"
+" Файл ÑÑ‚Ð¸Ð»Ñ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²."
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+"bugzilla.template\n"
+" Шаблон, иÑпользуемый при форматировании комментариев. ПереопределÑет\n"
+" style. Ð’ дополнение к обычным ключевым Ñловам Mercurial, доÑтупны\n"
+" также:"
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+" :``{bug}``: ID бага в Bugzilla.\n"
+" :``{root}``: Полный путь к хранилищу Mercurial.\n"
+" :``{webroot}``: Сокращенный путь к хранилищу Mercurial.\n"
+" :``{hgweb}``: Базовый URL Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ñ€ÐµÐ²Ð°Ñ‚ÐµÐ»Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ Mercurial."
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+" По умолчанию ``набор изменений {node|short} в хранилище {root}\n"
+" отноÑитÑÑ Ðº багу {bug}.\\nДетали:\\n\n"
+"\t{desc|tabindent}"
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+"bugzilla.strip\n"
+" КоличеÑтво разделителей в путÑÑ…, вырезаемых из начала пути хранилища\n"
+" Mercurial ( ``{root}`` в шаблонах), чтобы Ñоздать ``{webroot}``.\n"
+" Ðапример, хранилище Ñ ``{root}`` ``/var/local/my-project`` и strip\n"
+" равным 2, дает значение ``{webroot}`` ``my-project``. По умолчанию 0."
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+"web.baseurl\n"
+" Базовый URL Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра хранилищ Mercurial. Ðа него ÑÑылаютÑÑ Ð¸Ð·\n"
+" шаблонов как ``{hgweb}``."
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr "Общие параметры Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð¾Ð² доÑтупа XMLRPC+email и MySQL:"
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+"bugzilla.usermap\n"
+" Путь к файлу, Ñодержащему ÑоответÑÑ‚Ð²Ð¸Ñ email автора наборов\n"
+" изменений Mercurial и email пользователей Bugzilla. ЕÑли задан,\n"
+" файл должен Ñодержать одно ÑоответÑтвие на Ñтроку::"
+
+msgid " committer = Bugzilla user"
+msgstr " автор Mercurial = пользователь Bugzilla"
+
+msgid " See also the ``[usermap]`` section."
+msgstr " См. также Ñекцию ``[usermap]``."
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+"Ð¡ÐµÐºÑ†Ð¸Ñ ``[usermap]`` иÑпользуетÑÑ Ñ‡Ñ‚Ð¾Ð±Ñ‹ задать ÑоответÑÑ‚Ð²Ð¸Ñ Ð°Ð´Ñ€ÐµÑов email\n"
+"Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Mercurial адреÑу email Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Bugzilla. См. также\n"
+"``bugzilla.usermap``. Содержит запиÑи вида\n"
+"``автор Mercurial = пользователь Bugzilla``"
+
+msgid "XMLRPC access mode configuration:"
+msgstr "Параметры режима доÑтупа через XMLRPC:"
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+"bugzilla.bzurl\n"
+" Базовый URL инÑталлÑции Bugzilla.\n"
+" По умолчанию ``http://localhost/bugzilla``."
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, иÑпользуемое при аутентификации в Bugzilla через\n"
+" через XMLRPC. По умолчанию ``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+"bugzilla.password\n"
+" Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ в Bugzilla."
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr "Режим доÑтупа XMLRPC+email иÑпользует параметры XMLRPC, а также:"
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+"bugzilla.bzemail\n"
+" ÐÐ´Ñ€ÐµÑ email Bugzilla."
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+"Также должны быть наÑтроены параметры email Mercurial. См. документацию\n"
+"по hgrc(5), Ñекции ``[email]`` и ``[smtp]``."
+
+msgid "MySQL access mode configuration:"
+msgstr "Параметры режима доÑтупа MySQL:"
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+"bugzilla.host\n"
+" Ð˜Ð¼Ñ Ñ…Ð¾Ñта Ñервера, Ñодержащего базу данных MySQL Bugzilla.\n"
+" По умолчанию ``localhost``."
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+"bugzilla.db\n"
+" Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Bugzilla в MySQL. По умолчанию ``bugs``."
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+"bugzilla.user\n"
+" Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð´Ð¾Ñтупа к MySQL-Ñерверу. По умолчанию ``bugs``."
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+"bugzilla.password\n"
+" Пароль Ð´Ð»Ñ Ð´Ð¾Ñтупа к MySQL-Ñерверу."
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+"bugzilla.timeout\n"
+" Таймаут ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ данных (Ñекунды). По умолчанию 5."
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+"bugzilla.bzuser\n"
+" Резервное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Bugzilla Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñей комментариев, еÑли\n"
+" Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° набора изменений не найден ÑоответÑтвующий пользователь "
+"Bugzilla."
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+"bugzilla.bzdir\n"
+" УÑтановочный каталог Bugzilla. ИÑпользуетÑÑ Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñми (notify)\n"
+" по умолчанию. По умолчанию ``/var/www/html/bugzilla``."
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+"bugzilla.notify\n"
+" Команда, запуÑÐºÐ°ÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Bugzilla отправила уведомление\n"
+" об изменении бага по email. СоÑтавлÑетÑÑ Ð¸Ð· набора из трех ключей:\n"
+" ``bzdir``, ``id`` (идентификатор бага) и ``user``. Значение по умолчанию\n"
+" завиÑÑÑ‚ от верÑии; Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 2.18 Ñто \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+
+msgid "Activating the extension::"
+msgstr "Включение раÑширениÑ::"
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+" [extensions]\n"
+" bugzilla ="
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+" [hooks]\n"
+" # запуÑкать хук bugzilla при каждом изменении, затÑнутом или\n"
+" # протолкнутом Ñюда\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+
+msgid "Example configurations:"
+msgstr "Пример наÑтроек:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"Пример наÑтроек XMLRPC. ИÑпользует Bugzilla по адреÑу\n"
+"``http://my-project.org/bugzilla``, вход от пользователÑ\n"
+"``bugmail@my-project.org`` Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ ``plugh``. ИÑпользуетÑÑ Ñ\n"
+"коллекцией хранилищ Mercurial в ``/var/local/hg/repos/``,\n"
+"Ñ Ð²ÐµÐ±-интерфейÑом по адреÑу ``http://my-project.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+"Пример наÑтроек XMLRPC+email. ИÑпользует Bugzilla по адреÑу\n"
+"``http://my-project.org/bugzilla``, вход от имени пользователÑ\n"
+"``bugmail@my-project.org`` Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ ``plugh``. ИÑпользуетÑÑ Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸ÐµÐ¹\n"
+"хранилищ Mercurial в ``/var/local/hg/repos/``Ñ Ð²ÐµÐ±-интерфейÑом по адреÑу\n"
+"``http://my-project.org/hg``. Комментарии к багам отправлÑÑŽÑ‚ÑÑ Ð½Ð° email\n"
+"Bugzilla ``bugzilla@my-project.org``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+" [usermap]\n"
+" пользователь@emaildomain.com=имÑ.пользователÑ@bugzilladomain.com"
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+"Пример наÑтроек MySQL. ИÑпользует локальную уÑтановку Bugzilla 3.2\n"
+"в ``/opt/bugzilla-3.2``. База данных MySQL на ``localhost``,\n"
+"Ð¸Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных Bugzilla ``bugs`` и доÑтуп к MySQL производитÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+"Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ``bugs`` и паролем ``XYZZY``. Она иÑпользуетÑÑ Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸ÐµÐ¹\n"
+"хранилищ в ``/var/local/hg/repos/``, и веб-интерфейÑом по адреÑу\n"
+"``http://my-project.org/hg``. ::"
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+"Ð’Ñе приведенные примеры добавлÑÑŽÑ‚ комментарий Ñледующего вида\n"
+"в запиÑÑŒ о баге в Bugzilla ::"
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr " Комментарий фикÑации набора изменений. Bug 1234.\n"
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "не доÑтупна поддержка mysql в python: %s"
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "ÑоединÑемÑÑ Ñ %s:%s как %s, пароль %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "запроÑ: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ удалÑÑ: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ñхема базы данных"
+
+#, python-format
+msgid "bug %d does not exist\n"
+msgstr "баг %d не ÑущеÑтвует!\n"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr "баг %d уже знает о наборе изменений %s\n"
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "говорим bugzillf отправить почту:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr " баг %s\n"
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "запуÑкаем команду ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "команда ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ bugzilla %s"
+
+msgid "done\n"
+msgstr "завершено\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "ищем Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ bugzilla Ð´Ð»Ñ %s не найден"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "идентификатор Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ bugzilla Ð´Ð»Ñ %s или %s не найден"
+
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr "Bugzilla/MySQL не может обновить ÑоÑтоÑние бага\n"
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr ""
+"Bugzilla/XMLRPC требует Bugzilla 4.0 или новее, чтобы помечать\n"
+"баги как иÑправленные\n"
+
+msgid "configuration 'bzemail' missing"
+msgstr "отÑутÑтвует параметр 'bzemail'"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr "email Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ bugzilla %s по умолчанию не найден"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "верÑÐ¸Ñ bugzilla %s не поддерживаетÑÑ"
+
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: неверное количеÑтво чаÑов\n"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+"набор изменений {node|short} в хранилище {root} отноÑитÑÑ Ðº багу {bug}.\n"
+"Детали:\n"
+"\t{desc|tabindent}"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr "хук типа %s не передает идентификатор набора изменений"
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Ошибка Bugzilla: %s"
+
+msgid "command to display child changesets (DEPRECATED)"
+msgstr "команда Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ñ… наборов изменений (УСТÐРЕЛО)"
+
+msgid ""
+"This extension is deprecated. You should use :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+msgstr ""
+"Это раÑширение уÑтарело, иÑпользуйте :hg:`log -r \"children(РЕВИЗИЯ)\"`.\n"
+
+msgid "show the children of the given or working directory revision"
+msgstr "показать дочерние ревизии Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ревизии"
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" Без параметров печатает дочерние ревизии рабочего каталога. ЕÑли\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð° Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r/--rev, то выведутÑÑ ÐµÐµ дочерние ревизии.\n"
+" ЕÑли задан файл в качеÑтве аргумента, то будет выведена Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð² "
+"которой\n"
+" Ñтот файл был изменён (поÑле текущей ревизии рабочего каталога или\n"
+" Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ аргумента --rev).\n"
+" "
+
+msgid "REV"
+msgstr "РЕВИЗИЯ"
+
+msgid "show children of the specified revision"
+msgstr "показать дочерние наборы изменений Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ ревизии"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr "hg children [-r РЕВИЗИЯ] [ФÐЙЛ]"
+
+msgid "command to display statistics about repository history"
+msgstr "команда Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑтатиÑтики об иÑтории хранилища"
+
+#, python-format
+msgid "revision %d is a merge, ignoring...\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d Ñто ÑлиÑние (merge), игнорируетÑÑ...\n"
+
+msgid "analyzing"
+msgstr "анализ"
+
+msgid "histogram of changes to the repository"
+msgstr "гиÑтограмма изменений, внеÑенных в хранилище"
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+" Эта команда показывает гиÑтограмму, предÑтавлÑющую количеÑтво\n"
+" изменённых Ñтрок или ревизий, Ñгруппированных в ÑоответÑтвии Ñ\n"
+" заданным шаблоном. Стандартный шаблон группирует Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ автору.\n"
+" ÐžÐ¿Ñ†Ð¸Ñ --dateformat может быть иÑпользована, чтобы Ñгруппировать "
+"результаты по дате."
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+" СтатиÑтика оÑнована на количеÑтве изменённых Ñтрок, либо\n"
+" чиÑле ÑоответÑтвующих ревизий, еÑли задана опциÑ\n"
+" --changesets."
+
+msgid " Examples::"
+msgstr " Примеры::"
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+" # отобразить чиÑло изменённых Ñтрок Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ автора\n"
+" hg churn -t '{author|email}'"
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+" # отобразить график ежедневной активноÑти\n"
+" hg churn -f '%H' -s -c"
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+" # отобразить активноÑÑ‚ÑŒ разработчиков помеÑÑчно\n"
+" hg churn -f '%Y-%m' -s -c"
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+" # отобразить чиÑло изменённых Ñтрок за каждый год\n"
+" hg churn -f '%Y' -s"
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+" Можно заменить почтовые адреÑа на любые другие, задав файл\n"
+" Ñледующего формата::"
+
+msgid " <alias email> = <actual email>"
+msgstr " <пÑевдоним адреÑа> = <наÑтоÑщий адреÑ>"
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+" Такой файл может быть задан опцией --aliases, иначе\n"
+" поиÑк файла .hgchurn проиÑходит в корне рабочего каталога.\n"
+" "
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "пропущен неверный пÑевдоним: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr "раÑÑчитывать ÑтатиÑтику Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ ревизии или диапазона"
+
+msgid "DATE"
+msgstr "ДÐТÐ"
+
+msgid "count rate for revisions matching date spec"
+msgstr "раÑÑчитывать ÑтатиÑтику Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¹, ÑоответÑтвующих заданному шаблону"
+
+msgid "TEMPLATE"
+msgstr "ШÐБЛОÐ"
+
+msgid "template to group changesets"
+msgstr "шаблон Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ изменений"
+
+msgid "FORMAT"
+msgstr "ФОРМÐТ"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr "strftime-ÑовмеÑтимый формат Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ дате"
+
+msgid "count rate by number of changesets"
+msgstr "Ñчитать количеÑтво наборов изменений"
+
+msgid "sort by key (default: sort by count)"
+msgstr "отÑортировать по ключу (по умолчанию: Ñортировать по количеÑтву)"
+
+msgid "display added/removed lines separately"
+msgstr "отобразить добавленные/удалённые Ñтроки отдельно"
+
+msgid "FILE"
+msgstr "ФÐЙЛ"
+
+msgid "file with email aliases"
+msgstr "файл Ñ Ð¿Ñевдонимами почтовых адреÑов"
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d ДÐТÐ] [-r РЕВ] [--aliases ФÐЙЛ] [ФÐЙЛ]"
+
+msgid "colorize output from some commands"
+msgstr "раÑкрашивает вывод некоторых команд"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"Это раÑширение добавлÑет цветной вывод Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… команд.\n"
+"Ð’ командах status и resolve цвет отражает ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ„Ð°Ð¹Ð»Ð°; в qseries -\n"
+"ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¿Ð°Ñ‚Ñ‡Ð° (применен, не применен, отÑутÑтвует); в команды, ÑвÑзанные\n"
+"Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñми (diff) добавлÑет подÑветку добавлений и удалений файлов, "
+"заголовков\n"
+"различий, а также ведущих пробельных Ñимволов."
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"Кроме цвета, также доÑтупны и другие Ñффекты, такие как жирный или "
+"подчёркнутый текÑÑ‚.\n"
+"Пр умолчанию Ð´Ð»Ñ Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¾Ð² терминала Ð´Ð»Ñ Ñффекта или Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð°\n"
+"иÑпользуетÑÑ Ð±Ð°Ð·Ð° terminfo. ЕÑли terminfo не доÑтупен,\n"
+"Ñффекты отображаютÑÑ Ð¿Ñ€Ð¸ помощи контрольной функции ECMA-48 SGR control\n"
+"(также извеÑтной как ANSI escape codes)."
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+"Стандартные Ñффекты могут быть переопределены в вашем файле конфигурации::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [цвет]\n"
+" status.modified = blue bold underline red_background # Ñиний подчёркнутый "
+"краÑный_фон\n"
+" status.added = green bold # зелёный жирный\n"
+" status.removed = red bold blue_background # краÑный жирный Ñиний_фон\n"
+" status.deleted = cyan bold underline # голубой жирный подчёркнутый\n"
+" status.unknown = magenta bold underline # пурпурный жирный подчёркнутый\n"
+" status.ignored = black bold # чёрный жирный"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' выключает вÑе Ñффекты\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline # Ñиний жирный подчёркнутый\n"
+" qseries.unapplied = black bold # чёрный подчёркнутый\n"
+" qseries.missing = red bold # краÑный жирный"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold # жирный\n"
+" diff.extended = cyan bold # голубой жирный\n"
+" diff.file_a = red bold # краÑный жирный\n"
+" diff.file_b = green bold # зелёный жирный\n"
+" diff.hunk = magenta # пурпурный\n"
+" diff.deleted = red # краÑный\n"
+" diff.inserted = green # зелёный\n"
+" diff.changed = white # белый\n"
+" diff.trailingwhitespace = bold red_background # жирный краÑный_фон "
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold # краÑный жирный\n"
+" resolve.resolved = green bold # зелёный жирный"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green # зеленый"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none # нет\n"
+" branches.closed = black bold # черный жирный\n"
+" branches.current = green # зеленый\n"
+" branches.inactive = none # нет"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+" tags.normal = green # зеленый\n"
+" tags.local = black bold # черный жирный"
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+"Ð’ режиме terminfo доÑтупны Ñффекты 'blink' (мигающий), 'bold' (жирный),\n"
+"'dim' (туÑклый), 'invisible' (невидимый), 'italic' (курÑивный), 'standout'\n"
+"(выделенный) и 'underline' (подчеркнутый); в режиме ECMA-48 доÑтупны\n"
+"'bold', 'inverse', 'italic' и 'underline'. Конкретный вид каждого Ñффекта\n"
+"завиÑит от вашего ÑмулÑтора терминала. Ðекоторые из них могут быть "
+"недоÑтупны\n"
+"в вашем терминале и будут молча проигнорированы."
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+"Обратите внимание, что на некоторых ÑиÑтемах режим terminfo может вызывать\n"
+"проблемы Ñ Ñ€Ð°Ñширением pager и Ñ less -R. less Ñ Ð¾Ð¿Ñ†Ð¸ÐµÐ¹ -R будет отображать\n"
+"только цветовые коды ECMA-48, а режим terminfo иногда может порождать\n"
+"коды, которые less не понимает. Это можно обойти, еÑли иÑпользовать режим\n"
+"ansi (или auto), или иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ less -r (который пропуÑкает вÑе контрольные\n"
+"поÑледовательноÑти, а не только коды цвета)."
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+"ПоÑкольку Ñтандартных цветов вÑего воÑемь, Ñтот модуль позволÑет определить\n"
+"имена Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… Ñлотов цвета, которые могут быть доÑтупны в вашем "
+"терминале.\n"
+"Ðапример::"
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+" color.brightblue = 12 # Ñветло-голубой\n"
+" color.pink = 207 # розовый\n"
+" color.orange = 202 # оранжевый"
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+"задает Ð¸Ð¼Ñ 'bightblue' Ð´Ð»Ñ Ñлота 12 (полезно Ð´Ð»Ñ 16-цветных терминалов,\n"
+"в которых Ñветлые цвета определены в Ñтарших 8 кодах) и 'pink' и 'orange'\n"
+"Ð´Ð»Ñ 256-цветного xterm. Определенные таким образом цвета могут "
+"иÑпользоватьÑÑ\n"
+"так же, как и воÑемь Ñтандартных, Ñ‚.ч. и Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ '_background' длÑ\n"
+"уÑтановки цвета фона."
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+"По умолчанию раÑширение иÑпользует режим ANSI (или win32 под windows),\n"
+"еÑли она обнаруживает терминал. Чтобы переопределить режим по умолчанию\n"
+"(например, чтобы включить режим terminfo), иÑпользуютÑÑ Ñледующие\n"
+"параметры::"
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+"Любое другое значение, кроме 'ansi', 'win32', 'terminfo' или 'auto'\n"
+"отключает цвета.\n"
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr "нет запиÑи terminfo Ð´Ð»Ñ setab/setaf: возвращаюÑÑŒ в режим ECMA-48\n"
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr "предупреждение: не удалоÑÑŒ уÑтановить режим %s\n"
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "игнорируетÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑтный цвет/Ñффект %r (заданный в цвете.%s)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+"когда раÑкрашивать вывод (логичеÑкий. always (вÑегда), auto (автоматичеÑки)"
+"или never (не раÑкрашивать))"
+
+msgid "TYPE"
+msgstr "ТИП"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+"импортирует ревизии из хранилищ других ÑиÑтем ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий в Mercurial"
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr "Преобразовать хранилище другой SCM в хранилище Mercurial"
+
+msgid " Accepted source formats [identifiers]:"
+msgstr " Возможные входные форматы [обозначениÑ]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr " Возможные выходные форматы [обозначениÑ]:"
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° ветках не ÑохранÑетÑÑ)"
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+" ЕÑли номер ревизии не указан, преобразуютÑÑ Ð²Ñе ревизии.\n"
+" Ð’ противном Ñлучае будут преобразованы только ревизии,\n"
+" предшеÑтвующие указанной. Ðомер ревизии указываетÑÑ Ð² формате\n"
+" иÑточника."
+
+# BAIK
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" ЕÑли не указан каталог назначениÑ, то будет иÑпользовано имÑ\n"
+" каталога иÑточника Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼ окончанием ``-hg``. ЕÑли каталог\n"
+" Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ ÑущеÑтвует, он будет Ñоздан."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+" По умолчанию вÑе иÑточники кроме Mercurial преобразуютÑÑ Ñ\n"
+" параметром --branchsort. Ð”Ð»Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Mercurial иÑпользуетÑÑ\n"
+" --sourcesort, чтобы Ñохранить иÑходный порÑдок номеров ревизий.\n"
+" Режимы Ñортировки имеют Ñледующий ÑмыÑл:"
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+" --branchsort по возможноÑти преобразует от родительÑкой к\n"
+" дочерней ревизии, Ñ‚.е. ветки обычно конвертируютÑÑ\n"
+" одна за другой. ПозволÑет генерировать более\n"
+" компактные хранилища."
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+" --datesort Ñортирует ревизии по дате. Сконвертированные\n"
+" хранилища имеют правильно выглÑдÑщую иÑторию,\n"
+" но чаÑто получаютÑÑ Ð½Ð° порÑдок больше по Ñравнению\n"
+" c --branchsort."
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+" --sourcesort пытаетÑÑ Ñохранить иÑходный порÑдок ревизий.\n"
+" Только Ð´Ð»Ñ Ð¸Ñходных хранилищ Mercurial"
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+" ЕÑли файл ``REVMAP`` не задан, он будет Ñоздан по умолчанию\n"
+" как ``<dest>/.hg/shamap``. ``REVMAP`` - Ñто проÑтой текÑтовый\n"
+" файл который уÑтанавливает ÑоответÑтвие входных и выходных\n"
+" идентификаторов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ревизии в формате:"
+
+msgid " <source ID> <destination ID>"
+msgstr " <входной идентификатор> <выходной идентификатор>"
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+" ЕÑли файл не ÑущеÑтвует, он ÑоздаетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки. Он\n"
+" обновлÑетÑÑ Ð½Ð° каждой копируемой фикÑации, так что :hg: `convert`\n"
+" может быть прервано и повторно запущено Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ…\n"
+" фикÑаций"
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+" authormap - Ñто обычный текÑтовый файл, который позволÑет \n"
+" заменить в конечном хранилище имена авторов фикÑаций из\n"
+" иÑходного хранилища. Это удобно в Ñлучае когда иÑÑ…Ð¾Ð´Ð½Ð°Ñ SCM\n"
+" иÑпользует unix-логины в качеÑтве имен авторов (например, CVS).\n"
+" ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока ÑоответÑтвует одному имени. Формат Ñтроки::"
+
+msgid " source author = destination author"
+msgstr " автор в иÑточнике = автор на выходе"
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr " ПуÑтые Ñтроки и Ñтроки, начинающиеÑÑ Ñ ``#`` игнорируютÑÑ"
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+" Файл filemap позволÑет фильтровать и переименовывать\n"
+" файлы и каталоги. ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока может Ñодержать одну из Ñледующих\n"
+" директив::"
+
+msgid " include path/to/file-or-dir"
+msgstr " include путь/к/файлу-или-каталогу"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " exclude путь/к/файлу-или-каталогу/"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rename путь/к/иÑточнику путь/к/назначению"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+" Строки, начинающиеÑÑ Ñ ``#``, ÑвлÑÑŽÑ‚ÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñми. Заданный\n"
+" путь иÑпользуетÑÑ, еÑли он Ñовпадает Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ отноÑительным путем\n"
+" к файлу или одним из его родительÑких каталогов. Директивы\n"
+" ``include`` и ``exclude`` применÑÑŽÑ‚ÑÑ Ð´Ð»Ñ Ñамого длинного из\n"
+" указанных путей, так что порÑдок Ñтрок не важен."
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+" Директива ``include`` означает, что в выходное хранилище\n"
+" попадет указанный файл или каталог Ñо вÑеми его файлами и\n"
+" подкаталогами, а также что оÑтальные файлы, не указанные Ñвно,\n"
+" будут проигнорированы. Директива ``exclude`` позволÑет\n"
+" игнорировать указанный файл или каталог. Директива ``rename``\n"
+" переименовывает файл или каталог при конвертации. Чтобы\n"
+" перемеÑтить файл из подкаталога в корень хранилища,\n"
+" иÑпользуйте ``.`` в качеÑтве пути назначениÑ."
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+" Файл slicemap позволÑет добавлÑÑ‚ÑŒ иÑкуÑÑтвенные чаÑти в иÑторию,\n"
+" позволÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸. Это полезно, например,\n"
+" еÑли вы хотите привÑзать две родительÑкие ревизии (parent)\n"
+" к результату ÑлиÑÐ½Ð¸Ñ Ð² SVN, или ÑвÑзать две неÑвÑзанные чаÑти\n"
+" иÑтории. ÐšÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ Ñодержит ключ, отделенный пробелом от\n"
+" одного или двух параметров, разделÑемых запÑтой::"
+
+msgid " key parent1, parent2"
+msgstr " ключ родитель1, родитель2"
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+" Ключ - Ñто идентификатор ревизии в иÑходном хранилище, чьи\n"
+" родители должны быть изменены (тот же формат, что и в файле\n"
+" .hg/shamap). Параметры ÑвлÑÑŽÑ‚ÑÑ Ð½Ð¾Ð¼ÐµÑ€Ð°Ð¼Ð¸ ревизий (во входном\n"
+" или выходном хранилище), которые иÑпользуютÑÑ Ð² качеÑтве\n"
+" новых родителей Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ узла. Ðапример, еÑли ветка \"release-1.0\"\n"
+" была Ñлита в \"trunk\", то нужно указать номер ревизии в ветке\n"
+" \"trunk\" в качеÑтве первого родителÑ, и номер ревизии из ветки\n"
+" \"release-1.0\" в качеÑтве второго родителÑ."
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+" Файл branchmap позволÑет переименовать ветку из любого внешнего\n"
+" хранилища. При иÑпользовании вмеÑте Ñ splicemap, предоÑтавлÑет\n"
+" широкие возможноÑти Ð´Ð»Ñ ÑƒÐ¿Ð¾Ñ€ÑÐ´Ð¾Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð¶Ðµ Ñамых запутанных\n"
+" хранилищ и Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ñ… в хорошо Ñтруктурированные\n"
+" хранилище Mercurial. Содержит Ñтроки в формате:"
+
+msgid " original_branch_name new_branch_name"
+msgstr " иÑходное_имÑ_ветки новое_имÑ_ветки"
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+" где \"иÑходное_имÑ_ветки\" - Ñто Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ в иÑходном хранилище\n"
+" \"новое_имÑ_ветки\" - Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ в выходном хранилище. Пробелы\n"
+" в именах веток не допуÑкаютÑÑ. Этим можно пользоватьÑÑ,\n"
+" например, чтобы перемеÑтить код Ñ Ð²ÐµÑ‚ÐºÐ¸ \"default\" на именованную\n"
+" ветку."
+
+msgid ""
+" Mercurial Source\n"
+" ################"
+msgstr ""
+" ИÑточник - Mercurial\n"
+" ####################"
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+" При конвертации из хранилища Mercurial возможны Ñледующие\n"
+" параметры, которые можно указать в командной Ñтроке Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" ``--config``:"
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+" :convert.hg.ignoreerrors: игнорировать ошибки целоÑтноÑти при\n"
+" чтении. ИÑпользуетÑÑ Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ Mercurial\n"
+" c недоÑтающими revlog'ами путем конвертации из хранилища\n"
+" Mercurial и обратно. По умолчанию False."
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+" :convert.hg.saverev: ÑохранÑÑ‚ÑŒ иÑходный номер ревизии в наборе\n"
+" изменений (изменÑет выходные номера ревизий).\n"
+" True или False, по умолчанию False."
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+" :convert.hg.startrev: конвертировать указанную ревизию и вÑе ее\n"
+" дочерние ревизии. Принимает номер ревизии Mercurial,\n"
+" по умолчанию 0."
+
+msgid ""
+" CVS Source\n"
+" ##########"
+msgstr ""
+" ИÑточник - CVS\n"
+" ##############"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+" При конвертировании из CVS иÑпользуетÑÑ Ð¿ÐµÑочница (Ñ‚.е. копиÑ,\n"
+" Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð°Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ cvs checkout), ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½ÑƒÐ¶Ð½Ð° в качеÑтве\n"
+" отправной точки Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ð¸. ПрÑмой доÑтуп к файлам\n"
+" хранилища CVS не требуетÑÑ, еÑли, конечно, не иÑпользуетÑÑ\n"
+" метод доÑтупа ``:local:``. Хранилище CVS ищетÑÑ Ð¿Ð¾ каталогу\n"
+" верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¿ÐµÑочницы, поÑле чего иÑпользуетÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°\n"
+" CVS rlog Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка конвертируемых файлов. Это означает, что\n"
+" еÑли не задан файл filemap, будут конвертироватьÑÑ Ð²Ñе файлы\n"
+" из верхнего каталога, и вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñтруктуры каталогов в\n"
+" пеÑочнице будут проигнорированы."
+
+msgid " The following options can be used with ``--config``:"
+msgstr " Следующие параметры могут иÑпользоватьÑÑ Ñ ``--config``:"
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+" :convert.cvsps.cache: УÑтановите в False чтобы отключить\n"
+" кÑширование отдалённого лога, нужно Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸\n"
+" отладки. По умолчанию True."
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+" :convert.cvsps.fuzz: задает макÑимально допуÑтимое Ð²Ñ€ÐµÐ¼Ñ \n"
+" (в Ñекундах) между фикÑациÑми Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ пользователем \n"
+" и журнальным Ñообщением в рамках одного набора изменений. ЗначениÑ\n"
+" по умолчанию может не хватить, еÑли очень большие файлы были\n"
+" Ñохранены в наборе изменений. По умолчанию 60 Ñек."
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergeto: задает регулÑрное выражение, на\n"
+" Ñовпадение Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ проверÑÑŽÑ‚ÑÑ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ðµ ÑообщениÑ. При\n"
+" Ñовпадении будет вÑтавлена Ñ„Ð¸ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, ÑливающаÑ\n"
+" ветку Ñ Ñтим Ñообщением Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ в регулÑрном выражении\n"
+" веткой. Значение по умолчанию: ``{{mergetobranch ([-\\w]+)}}``"
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+" :convert.cvsps.mergefrom: задает регулÑрное выражение, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼\n"
+" ÑравниваютÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ð¸ фикÑации. ЕÑли Ñовпадение найдено, то\n"
+" наиболее позднÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ð° ветке, обозначенной в выражении,\n"
+" добавлÑетÑÑ Ð² качеÑтве второго Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений.\n"
+" По умолчанию ``{{mergefrombranch ([-\\w]+)}}``"
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+" :hook.cvslog: задает функцию на Python, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÑ‚ÑÑ Ð¿Ð¾Ñле\n"
+" Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»Ð° CVS. Функции передаетÑÑ ÑпиÑок Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸\n"
+" запиÑÑми, она может изменÑÑ‚ÑŒ их, удалÑÑ‚ÑŒ или добавлÑÑ‚ÑŒ новые."
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+" :hook.cvschangesets: Задает функцию на Питоне, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÐµÑ‚ÑÑ\n"
+" поÑле того, как будут раÑÑчитаны наборы изменений из журнала\n"
+" CVS. Функции передаетÑÑ ÑпиÑок Ñ Ñлементами набора изменений,\n"
+" она может изменÑÑ‚ÑŒ их, удалÑÑ‚ÑŒ или добавлÑÑ‚ÑŒ новые."
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+" Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Mercurial \"debugcvsps\" позволÑет\n"
+" запуÑтить вÑтроенный код ÑлиÑÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений без проведениÑ\n"
+" конвертации. Ее параметры и вывод похожи на cvsps 2.1. Подробней\n"
+" Ñм. Ñправку по cvsps."
+
+msgid ""
+" Subversion Source\n"
+" #################"
+msgstr ""
+" ИÑточник - Subversion\n"
+" #####################"
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+" Ð’ Ñлучае Subversion анализируетÑÑ ÐºÐ»Ð°ÑÑичеÑÐºÐ°Ñ Ñтруктура\n"
+" хранилища trunk/branches/tags. По умолчанию заданный URL\n"
+" ``svn://хранилище/путь`` преобразуетÑÑ Ð² одну ветку. ЕÑли\n"
+" ``svn://хранилище/путь/trunk`` ÑущеÑтвует, он заменÑет ветку\n"
+" ``default``. ЕÑли ``svn://хранилище/путь/branches`` ÑущеÑтвует,\n"
+" его подкаталоги перечиÑлÑÑŽÑ‚ÑÑ ÐºÐ°Ðº возможные ветки. ЕÑли\n"
+" ``svn://хранилище/путь/tags`` ÑущеÑтвует, в нем ищутÑÑ\n"
+" метки, ÑÑылающиеÑÑ Ð½Ð° конвертируемые ветки. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию\n"
+" Ð´Ð»Ñ ``trunk``, ``branches`` и ``tags`` могут быть изменены\n"
+" нижеперечиÑленными параметрами. УÑтановите их в пути отноÑительно\n"
+" URL иÑточника или оÑтавьте пуÑтыми чтобы отключить автоматичеÑкое\n"
+" определение."
+
+msgid " The following options can be set with ``--config``:"
+msgstr " Следующие параметры могут быть заданы в ``--config``:"
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+" :convert.svn.branches: задает каталог, Ñодержащий ветки.\n"
+" По умолчанию ``branches``."
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+" :convert.svn.tags: задает каталог, Ñодержащий метки.\n"
+" По умолчанию``tags``."
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+" :convert.svn.trunk: задает Ð¸Ð¼Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ ветки (trunk)\n"
+" По умолчанию ``trunk``."
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+" ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ извлекатьÑÑ Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ ревизии, а не\n"
+" обÑзательно полноÑтью. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ преобразованиÑ\n"
+" Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ветки."
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+" :convert.svn.startrev: задает начальный номер ревизии Subversion.\n"
+" По умолчанию 0."
+
+msgid ""
+" Perforce Source\n"
+" ###############"
+msgstr ""
+" ИÑточник - Perforce\n"
+" ###################"
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+" При импорте из Perforce (P4) в качеÑтве иÑточника можно задать\n"
+" путь к хранилищу или Ñпецификацию клиента. Ð’Ñе файлы иÑточника\n"
+" будут преобразованы в проÑтое хранилище Mercurial, метки,\n"
+" ветки и точки интеграции игнорируютÑÑ. Обратите внимание, что при\n"
+" задании пути к хранилищу обычно надо указать также каталог \n"
+" назначениÑ, потому что иначе он может быть назван ``...-hg``."
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+" Можно ограничить количеÑтво конвертируемых запиÑей, указав\n"
+" начальную ревизию Perforce:"
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+" :convert.p4.startrev: задает начальную ревизию Perforce\n"
+" (номер ÑпиÑка изменений Perforce)."
+
+msgid ""
+" Mercurial Destination\n"
+" #####################"
+msgstr ""
+" Выходное хранилище Mercurial\n"
+" ############################"
+
+msgid " The following options are supported:"
+msgstr " ПоддерживаютÑÑ Ñледующие параметры:"
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+" :convert.hg.clonebranches: Ñоздавать отдельные хранилища на\n"
+" каждую ветку иÑточника. По умолчанию False."
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+" :convert.hg.tagsbranch: Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹Ñ… ревизий,\n"
+" по умолчанию ``default``"
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+" :convert.hg.usebranchnames: ÑохранÑÑ‚ÑŒ имена веток. По умолчанию\n"
+" True.\n"
+" "
+
+msgid "create changeset information from CVS"
+msgstr "получить информацию о наборе изменений из CVS"
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+" Эта команда иÑпользуетÑÑ Ð² качеÑтве отладочного инÑтрумента Ð´Ð»Ñ \n"
+" конвертера CVS->Mercurial и может быть иÑпользована в качеÑтве \n"
+" замены Ð´Ð»Ñ cvsps"
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+" Команда Mercurial debugcvsps читает журнал CVS через rlog длÑ\n"
+" текущего каталога (или другого указанного каталога) в хранилище\n"
+" CVS и преобразует ее журнал в поÑледовательноÑÑ‚ÑŒ наборов изменений\n"
+" оÑнованных на ÑоответÑтвующих журнальных запиÑÑÑ… и датах."
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+"файл Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½ пользователей (УСТÐРЕЛО, иÑпользуйте --authormap)"
+
+msgid "source repository type"
+msgstr "тип хранилища иÑточника"
+
+msgid "destination repository type"
+msgstr "тип хранилища назначениÑ"
+
+msgid "import up to target revision REV"
+msgstr "импортировать до ревизии РЕВИЗИЯ"
+
+msgid "remap usernames using this file"
+msgstr "переназначить имена пользователей иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот файл"
+
+msgid "remap file names using contents of file"
+msgstr "переназначить имена файлов ÑоглаÑно файлу"
+
+msgid "splice synthesized history into place"
+msgstr "ÑраÑтить Ñинтезированную иÑторию в заданных точках"
+
+msgid "change branch names while converting"
+msgstr "изменить имена веток при конвертации"
+
+msgid "try to sort changesets by branches"
+msgstr "попытатьÑÑ Ð¾Ñ‚Ñортировать наборы изменений по веткам"
+
+msgid "try to sort changesets by date"
+msgstr "попытатьÑÑ Ð¾Ñ‚Ñортировать наборы изменений по дате"
+
+msgid "preserve source changesets order"
+msgstr "ÑохранÑÑ‚ÑŒ порÑдок ревизий иÑточника"
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr "hg convert [ПÐРÐМЕТР]... ИСТОЧÐИК [ÐÐЗР[REVMAP]]"
+
+msgid "only return changes on specified branches"
+msgstr "возвращать только Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° указанных ветках"
+
+msgid "prefix to remove from file names"
+msgstr "удалить Ñтот Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¸Ð· имен файлов"
+
+msgid "only return changes after or between specified tags"
+msgstr "возвращать только Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле или между указанными метками"
+
+msgid "update cvs log cache"
+msgstr "обновить кÑш журнала cvs"
+
+msgid "create new cvs log cache"
+msgstr "Ñоздать новый кÑш лога cvs"
+
+msgid "set commit time fuzz in seconds"
+msgstr "уÑтановить погрешноÑÑ‚ÑŒ времени фикÑации в Ñекундах"
+
+msgid "specify cvsroot"
+msgstr "задать cvsroot"
+
+msgid "show parent changesets"
+msgstr "указать родительÑкие ревизии"
+
+msgid "show current changeset in ancestor branches"
+msgstr "показывать текущий набор изменений на родительÑких ветках"
+
+msgid "ignored for compatibility"
+msgstr "игнорировать Ð´Ð»Ñ ÑовмеÑтимоÑти"
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr "hg debugcvsps [ПÐРÐМЕТР]... [ПУТЬ]..."
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ":svnrev: Строка. Ðомер Ñконвертированной ревизии subversion."
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ""
+":svnpath: Строка. Путь к проекту Ñконвертированной из subversion ревизии."
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ""
+":svnuuid: Строка. Идентификатор хранилища Ñконвертированной из\n"
+" subversion ревизии."
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s не похож на хранилище Bazaar"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Ðе удалоÑÑŒ загрузить модули Bazaar"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+"внимание: легковеÑные копии (checkouts) могут вызвать ошибки при, лучше\n"
+"конвертировании иÑпользовать обычные ветки.\n"
+
+msgid "bzr source type could not be determined\n"
+msgstr "невозможно определить тип иÑточника bzr\n"
+
+#, python-format
+msgid "%s is not a valid revision"
+msgstr "%s - Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr "%s более не доÑтупен в %s"
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "ÑимволичеÑÐºÐ°Ñ ÑÑылка %s.%s ÑÑылаетÑÑ Ð½Ð° неÑущеÑтвующий объект"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ требуемый инÑтрумент \"%s\""
+
+#, python-format
+msgid "%s error:\n"
+msgstr "ошибка в %s:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в %s(%d): ожидаетÑÑ Ð¿Ð°Ñ€Ð° ключ/значение"
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "не удаетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ файл Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (map file) %r: %s"
+
+#, python-format
+msgid "syntax error in %s(%d): child parent1[,parent2] expected"
+msgstr ""
+"ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° в %s(%d): ожидаетÑÑ `потомок родитель1[,родитель2]`"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: неверный тип хранилища-иÑточника"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: отÑутÑтвующее или неподдерживаемое хранилище"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: неверный тип хранилища назначениÑ"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: неизвеÑтный тип хранилища"
+
+msgid "getting files"
+msgstr "получаем файлы"
+
+msgid "revisions"
+msgstr "ревизии"
+
+msgid "scanning"
+msgstr "Ñканирование"
+
+# NOT-SURE
+#, python-format
+msgid "splice map revision %s is not being converted, ignoring\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s из splicemap не конвертируетÑÑ, игнорируем\n"
+
+#, python-format
+msgid "unknown splice map parent: %s"
+msgstr "неизвеÑтный родитель в splicemap: %s"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "неизвеÑтный режим Ñортировки: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr "обнаружен цикл между %s и и %s"
+
+msgid "not all revisions were sorted"
+msgstr "не вÑе ревизии были отÑортированы"
+
+#, python-format
+msgid "writing author map file %s\n"
+msgstr "запиÑÑŒ файла Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (map file) авторов %s\n"
+
+#, python-format
+msgid "ignoring bad line in author map file %s: %s\n"
+msgstr "Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡Ð½Ð°Ñ Ñтрока в файле Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¾Ð² %s игнорируетÑÑ: %s\n"
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr "автор %s отображаетÑÑ ÐºÐ°Ðº %s\n"
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr "отображение Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° %s переопределено, было %s, будет %s\n"
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr "Ñращивание в %s как родителей %s\n"
+
+msgid "scanning source...\n"
+msgstr "Ñканирование иÑточника...\n"
+
+msgid "sorting...\n"
+msgstr "Ñортировка...\n"
+
+msgid "converting...\n"
+msgstr "конвертирование...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "иÑточник: %s\n"
+
+msgid "converting"
+msgstr "конвертирование"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr "предполагаетÑÑ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ %s\n"
+
+msgid "more than one sort mode specified"
+msgstr "указано более одного режима Ñортировки"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "--sourcesort не поддерживаетÑÑ Ñтим иÑточником"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s не похоже на извлеченную рабочую копию CVS"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s не номер набора патчей"
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "Ñоединение Ñ %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr "ошибка аутентификации через CVS pserver"
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+"неожиданный ответ от Ñервера CVS (ожидаетÑÑ \"Valid-requests\", получено %r)"
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "в отдаленном файле отÑутÑтвует %d байт"
+
+msgid "malformed response from CVS"
+msgstr "неверно Ñформированный ответ от CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "Ñервер cvs: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "неизвеÑтный ответ от CVS: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "Ñбор CVS rlog\n"
+
+msgid "not a CVS sandbox"
+msgstr "не пеÑочница CVS (CVS sandbox)"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "чтение кÑша журнала cvs %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr "кÑш Ñодержит %d журнальных запиÑей\n"
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÑша: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "запуÑкаетÑÑ %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr "за RCS-файлом должен Ñледовать рабочий файл"
+
+msgid "must have at least some revisions"
+msgstr "требуетÑÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ неÑколько ревизий"
+
+msgid "expected revision number"
+msgstr "ожидаетÑÑ Ð½Ð¾Ð¼ÐµÑ€ ревизии"
+
+msgid "revision must be followed by date line"
+msgstr "за ревизией должна Ñледовать Ñтрока Ñ Ð´Ð°Ñ‚Ð¾Ð¹"
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+"кÑш журнала переÑекаетÑÑ Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ журнальными запиÑÑми, перезапуÑтите без "
+"кÑша."
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "запиÑываетÑÑ ÐºÑш журнала cvs %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr "%d запиÑей в журнале\n"
+
+msgid "creating changesets\n"
+msgstr "ÑоздаютÑÑ Ð½Ð°Ð±Ð¾Ñ€Ñ‹ изменений\n"
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr "Ñинтезированные наборы изменений не могут иметь неÑколько родителей"
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+"внимание: комментарий фикÑации CVS ÑÑылаетÑÑ Ð½Ð° неÑущеÑтвующую ветку %r:\n"
+"%s\n"
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr "%d запиÑей о наборах изменений\n"
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s не похож на хранилище darcs"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ darcs 2.1 или выше (найдена %r)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Модуль Python ElemntTree не доÑтупен"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "формат хранилища %s не поддерживаетÑÑ, пожалуйÑта обновитеÑÑŒ"
+
+msgid "failed to detect repository format!"
+msgstr "не удалоÑÑŒ определить формат хранилища!"
+
+msgid "internal calling inconsistency"
+msgstr "внутреннее нарушение целоÑтноÑти вызовов"
+
+msgid "errors in filemap"
+msgstr "ошибки в отображении файлов (filemap)"
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr "%s:%d: путь к %s отÑутÑтвует\n"
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr "%s:%d: %r уже в ÑпиÑке %s\n"
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr "%s:%d: лишний / в %s %r\n"
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr "%s:%d: неизвеÑÑ‚Ð½Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð° %r\n"
+
+msgid "source repository doesn't support --filemap"
+msgstr "иÑходное хранилище не поддерживает --filemap"
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s не похож на хранилище Git"
+
+msgid "cannot retrieve git heads"
+msgstr "не могу получить головы git"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "не могу прочитать объект %r в %s"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %s"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ метки из %s"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s не похож на хранилище GNU Arch"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "не могу найти программу GNU Arch"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "анализ дерева верÑии %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+"анализ дерева прерван, поÑкольку он указывает на незарегиÑтрированный архив "
+"%s...\n"
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr "не могу разобрать cat-log %s"
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s - не локальное хранилище Mercurial"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s\n"
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "не удаетÑÑ Ñоздать хранилище-приемник Mercurial %s"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "затÑгиваем из %s в %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "отфильтровываетÑÑ Ð¿ÑƒÑÑ‚Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ\n"
+
+msgid "updating tags\n"
+msgstr "обновление меток\n"
+
+msgid "updating bookmarks\n"
+msgstr "обновление закладок\n"
+
+#, python-format
+msgid ""
+"revision %s not found in destination repository (lookups with "
+"clonebranches=true are not implemented)"
+msgstr ""
+"Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s не найдена в хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (поиÑк Ñ clonebranches=true\n"
+"не реализован)"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s не ÑвлÑетÑÑ Ð´Ð¾Ð¿ÑƒÑтимой начальной ревизией"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "игнорируетÑÑ: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s не похож на хранилище monotone"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr "плохой пакет mtn - нет Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ commandbr"
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr "плохой пакет mtn - неверный тип потока %s"
+
+msgid "bad mtn packet - no divider before size"
+msgstr "плохой пакет mtn - отÑутÑтвует разделитель перед размером"
+
+msgid "bad mtn packet - no end of packet size"
+msgstr "плохой пакет mtn - отÑутÑтвует окончание размера пакета"
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr "плохой пакет mtn - неверный размер пакета %s"
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr ""
+"плохой пакет mtn - не удаетÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñтью прочитать пакет; прочитано %s из %s"
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "команда mtn '%s' вернула %s"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "копирование файла из переименованного каталога из '%s' в '%s'"
+
+msgid "unable to determine mtn automate interface version"
+msgstr "не удаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ верÑию автоматизированного интерфейÑа mtn"
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr "неожиданные заголовок mtn automate stdio: %s"
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr "не удалоÑÑŒ дойти до конца заголовков mtn automate stdio"
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s не похож на хранилище P4"
+
+msgid "reading p4 views\n"
+msgstr "чтение предÑтавлений p4\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "Ñбор ÑпиÑков изменений p4\n"
+
+msgid "debugsvnlog could not load Subversion python bindings"
+msgstr ""
+"debugsvnlog не удалоÑÑŒ загрузить привÑзки (bindings) Subversion Ð´Ð»Ñ python"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+"Mercurial не удалоÑÑŒ запуÑтить ÑÐµÐ±Ñ Ñамого, убедитеÑÑŒ, что переменнаÑ\n"
+"PATH Ñодержит путь к hg"
+
+#, python-format
+msgid "log stream exception '%s'"
+msgstr "при Ñчитывании журнала возникло иÑключение '%s'"
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+"svn: не удалоÑÑŒ обÑледовать отдаленное хранилище в предположении, что\n"
+"Ñто хранилище subversion. ИÑпользуйте --source-type, еÑли вам лучше\n"
+"извеÑтен его тип.\n"
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s не похож на хранилище Subversion"
+
+msgid "could not load Subversion python bindings"
+msgstr "Ðе удалоÑÑŒ загрузить привÑзки (bindings) Subversion Ð´Ð»Ñ python"
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+"ПривÑзки (bindings) Subversions %d.%d Ð´Ð»Ñ python не найдены, требуетÑÑ 1.4 "
+"или новее"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+"ПривÑзки (bindings) Subversions Ñлишком Ñтарые, требуетÑÑ 1.4 или новее"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s - не целое чиÑло"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s - не целое чиÑло"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "не найдено ревизий в модуле %s"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "%s ожидаетÑÑ Ð² %r, но не был найден"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "%s найден в %r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "игнорируетÑÑ Ð¿ÑƒÑÑ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ° %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "ветка %s найдена в %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð¿Ñ€Ð¸ наличии более одной ветки"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: не найдено ревизий поÑле Ñтартовой ревизии %d"
+
+#, python-format
+msgid "svn: revision %s not found"
+msgstr "svn: Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s не найдена"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "%s не найден вплоть до ревизии %d"
+
+msgid "scanning paths"
+msgstr "Ñканируем пути"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "найден родитель ветки %s в %d: %s\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "получаем журнал ревизий Ð´Ð»Ñ \"%s\" от %d до %d\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: на ветке нет ревизии %s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° svn %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ¹ копии svn %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "неожиданный вывод svn:\n"
+
+msgid "unable to cope with svn output"
+msgstr "не удалоÑÑŒ Ñкопировать вывод svn"
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "запиÑÑŒ меток Subversion еще не реализована\n"
+
+# NOT-SURE
+#, python-format
+msgid ""
+"splice map revision %s not found in subversion child map (revision lookups "
+"are not implemented)"
+msgstr ""
+"Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s из splicemap не найдена в таблице дочерних ревизий subversion\n"
+"(поиÑк ревизий не реализован)"
+
+msgid "automatically manage newlines in repository files"
+msgstr "автоматичеÑкий перевод форматов новой Ñтроки в хранилище"
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+"Это раÑширение позволÑет управлÑÑ‚ÑŒ форматом перевода Ñтроки (CRLF или\n"
+"LF), который иÑпользуетÑÑ Ð² хранилище или в рабочей копии. Таким\n"
+"образом можно получить переноÑÑ‹ в виде CRLF в Windows и LF в Unix/Mac,\n"
+"позволÑÑ Ð²Ñем иÑпользовать нативные Ð´Ð»Ñ Ð¸Ñ… платформы переноÑÑ‹."
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+"РаÑширение читает наÑтройки из верÑионируемого файла конфигурации\n"
+"``.hgeol``, находÑщегоÑÑ Ð² корне рабочего каталога. Файл ``.hgeol``\n"
+"имеет тот же ÑинтакÑиÑ, что и другие файлы конфигурации Mercurial.\n"
+"Он иÑпользует две Ñекции: ``[patterns]`` и ``[repository]``."
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+"Ð¡ÐµÐºÑ†Ð¸Ñ ``[patterns]`` определÑет, как переноÑÑ‹ Ñтрок должны "
+"преобразовыватьÑÑ\n"
+"между рабочей копией и хранилищем. Формат задаетÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼ файла.\n"
+"ИÑпользуетÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¹ Ñовпавший шаблон, так что помещайте более конкретные\n"
+"шаблоны в начале. ДоÑтупны Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñтроки ``LF``, ``CRLF`` и ``BIN``."
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+"Файлы, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… задан формат ``CRLF`` или ``LF`` вÑегда извлекаютÑÑ\n"
+"и хранÑÑ‚ÑÑ Ð² хранилище в Ñтом формате, файлы Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð¼ ``BIN``\n"
+"оÑтаютÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸. Дополнительно может иÑпользоватьÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ ``native``,\n"
+"позволÑющий извлекать файлы в родном Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ платформы формате: ``LF``\n"
+"в Unix (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Mac OS X) и ``CRLF`` в Windows. Обратите внимание, что\n"
+"``BIN`` (ничего не делать Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð¾Ð¼ Ñтроки) ÑвлÑетÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ Mercurial\n"
+"по умолчанию; он требуетÑÑ, только еÑли надо переопределить поÑледующий,\n"
+"более общий шаблон."
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+"ÐеобÑÐ·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑÐµÐºÑ†Ð¸Ñ ``[repository]`` задает формат перевода Ñтроки\n"
+"Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в хранилище. Он имеет единÑтвенный параметр - ``native``, - \n"
+"который определÑет формат новой Ñтроки Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð², объÑвленных как "
+"``native``\n"
+"в Ñекции ``[patterns]``. Он может быть уÑтановлен в ``LF`` или ``CRLF``.\n"
+"По умолчанию ``LF``. Это означает, что, например, под Windows файлы,\n"
+"Ñконфигурированные как ``native`` (``CRLF`` по умолчанию), будут "
+"преобразованы\n"
+"к формату ``LF`` при хранении в хранилище. Файлы, объÑвленные как ``LF``,\n"
+"``CRLF`` или ``BIN`` в Ñекции ``[patterns]``, вÑегда хранÑÑ‚ÑÑ Ð² хранилище\n"
+"в неизменном виде."
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr "Пример верÑионированного файла ``.hgeol``::"
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+" [repository]\n"
+" native = LF"
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+".. note::\n"
+" Правила будут впервые применены, когда файлы будут изменены в рабочей\n"
+" копии, например, при обновлении на нулевую (null) и обратно на оконечную\n"
+" (tip) ревизию."
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+"РаÑширение иÑпользует необÑзательную Ñекцию ``[eol]``, которую читает\n"
+"из обычного конфигурационного файла Mercurial или из файла ``.hgeol``,\n"
+"причем поÑледний имеет более выÑокий приоритет. Эту Ñекцию можно "
+"иÑпользовать,\n"
+"чтобы управлÑÑ‚ÑŒ общим поведением. ПоддерживаютÑÑ Ñ‚Ñ€Ð¸ параметра:"
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+"- ``eol.native`` (по умолчанию ``ls.linesep``) может быть уÑтановлен в\n"
+" ``LF`` или ``CRLF``, чтобы переопределить интерпретацию ``native``\n"
+" по умолчанию Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð². Это можно иÑпользовать Ñ\n"
+" :hg:`archive` в Unix, например, чтобы Ñгенерировать архив, в котором\n"
+" файлы имеют формат новой Ñтроки Ð´Ð»Ñ Windows."
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+"- ``eol.only-consistent`` (по умолчанию True) можно уÑтановить в False,\n"
+" чтобы преобразовать файлы Ñ Ð½ÐµÐ¿Ð¾ÑтоÑнными переводами Ñтрок, Ñ‚.е. такие,\n"
+" в которых вÑтречаютÑÑ Ð¸ ``CRLF`` и ``LF``. Обычно такие файлы не\n"
+" преобразуютÑÑ Ð² предположении, что у них Ñмешанные переводы Ñтрок\n"
+" оÑтавлены намеренно."
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+"- ``eol.fix-trailing-newline`` (по умолчанию False) можно уÑтановить в "
+"True,\n"
+" чтобы убедитьÑÑ, что преобразованные файлы оканчиваютÑÑ Ñимволом перевода\n"
+" Ñтроки (``\\n`` или ``\\r\\n``, в завиÑимоÑти от шаблона в конфиге)."
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+"РаÑширение предоÑтавлÑет фильтры ``cleverencode:`` и ``cleverdecode:``,\n"
+"аналогичные уÑтаревшему раÑширению win32text. Это означает, что win32text\n"
+"можно отключить, и вÑе ваши фильтры будут по-прежнему работать. Они вам\n"
+"понадобÑÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ до тех пор, пока вы не напишете файл ``.hgeol``."
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+"Хуки ``win32text.forbid*``, предоÑтавлÑемые раÑширением win32text, были\n"
+"объединены в единый хук ``eol.checkheadshook``. Хук Ñчитывает ожидаемые\n"
+"переводы Ñтрок из файла ``.hgeol``, поÑтому необходимо подготовить файл\n"
+"``.hgeol`` перед иÑпользованием хука. ``eol.checkheadshook`` проверÑет\n"
+"только головные ревизии, промежуточные ревизии Ñ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¼Ð¸ переводами\n"
+"Ñтрок будут принÑÑ‚Ñ‹. Чтобы запретить их полноÑтью, иÑпользуйте хук\n"
+"``eol.checkallhook``. Эти хуки лучше вÑего иÑпользовать в качеÑтве\n"
+"хука ``pretxnchangegroup``."
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr "О шаблонах в формате blob Ñм. :hg:`help patterns`\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "игнорируетÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑтный формат новой Ñтроки '%s' из %s\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr ""
+"внимание: файл .hgeol игнорируетÑÑ Ð¸Ð·-за ÑинтакÑичеÑкий ошибки в ÑÑ‚Ñ€ %s: %s\n"
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s в %s не должен иметь переводы Ñтроки вида %s"
+
+msgid "end-of-line check failed:\n"
+msgstr "ошибка в формате новой Ñтроки:\n"
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "раÑширение eol неÑовмеÑтимо Ñ Ñ€Ð°Ñширением win32text\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "в %s иÑпользуютÑÑ Ñмешанные переводы Ñтроки\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr "позволÑет Ñравнивать ревизии Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешних программ"
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+"РаÑширение extdiff позволÑет иÑпользовать внешние программы Ð´Ð»Ñ ÑравнениÑ\n"
+"двух ревизий или заданной ревизии Ñ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ð¼ каталогом. Внешние программы\n"
+"ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð·Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ наÑтраиваемых аргументов, и Ð´Ð²ÑƒÐ¼Ñ Ð¶ÐµÑтко\n"
+"заданными: путÑми к каталогам, Ñодержащим верÑии Ñравниваемых файлов."
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+"РаÑширение extdiff также позволÑет наÑтроить новые команды длÑ\n"
+"ÑравнениÑ, чтобы не набирать вÑе Ð²Ñ€ÐµÐ¼Ñ :hg:`extdiff -p kdiff3`. ::"
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+" [extdiff]\n"
+" # добавить новую команду, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð·Ð°Ð¿ÑƒÑкает GNU diff(1)\n"
+" # cо Ñравнением Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтом'\n"
+" cdiff = gdiff -Nprc5\n"
+" ## то же Ñамое Ñтарым ÑпоÑобом:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+" # добавить новую команду vdiff, запуÑкающую kdiff3\n"
+" vdiff = kdiff3"
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+" # добавить новую команду meld, запуÑкающую meld (не нужно набирать "
+"дважды)\n"
+" meld ="
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+msgstr ""
+" # добавить новую команду vimdiff, запуÑкающую gvimdiff Ñ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð¾Ð¼ DirDiff\n"
+" # (Ñм. http://www.vim.org/scripts/script.php?script_id=102)\n"
+" # ÐеанглоÑзычные пользователи, не забудьте добавить\n"
+" # \"let g:DirDiffDynamicDiffText = 1\" в ваш .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+"Ðргументы программы могут включать в ÑÐµÐ±Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ, в которых\n"
+"выполнÑетÑÑ Ð¿Ð¾Ð´Ñтановка во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ::"
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+" $parent1, $plabel1 - Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° первого родителÑ\n"
+" $child, $clabel - Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° дочерней ревизии\n"
+" $parent2, $plabel2 - Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° второго родителÑ\n"
+" $root - корень хранилища\n"
+" $parent - пÑевдоним Ð´Ð»Ñ $parent1."
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+"extdiff читает аргументы Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² ÑекциÑÑ… [diff-tools]\n"
+"и [merge-tools] конфигурационного файла, еÑли они не заданы в [extdiff]."
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+" [extdiff]\n"
+" kdiff3 ="
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+"Можно иÑпользовать ключи -I/-X и ÑпиÑок имен файлов или каталогов,\n"
+"как и в обычной команде :hg:`diff`. РаÑширение extdiff делает Ñнимки\n"
+"только нужных файлов, поÑтому запуÑк программы ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ довольно\n"
+"быÑтрым (по крайней мере быÑтрее, чем еÑли бы надо было Ñравнить вÑе\n"
+"дерево файлов из хранилища).\n"
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr "ÑоздаетÑÑ Ñнимок %d файлов Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸ %s\n"
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr "ÑоздаетÑÑ Ñнимок %d файлов из рабочего каталога\n"
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ одновременно --rev и --change"
+
+msgid "cleaning up temp directory\n"
+msgstr "очиÑтка временного каталога\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr "ИÑпользовать внешнюю программу поиÑка отличий между ревизиÑми"
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+" Показывает Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ревизиÑми Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… файлов, иÑпользуÑ\n"
+" внешнюю программу. По умолчанию иÑпользуетÑÑ diff Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸\n"
+" \"-Npru\"."
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+" Чтобы выбрать другую программу, иÑпользуйте параметр -p/--program.\n"
+" Программе будут переданы имена двух каталогов Ð´Ð»Ñ ÑравнениÑ.\n"
+" Чтобы передать дополнительные параметры, иÑпользуйте -o/--option.\n"
+" Они будут переданы перед именами Ñравниваемых каталогов."
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+" ЕÑли указаны две ревизии, показываютÑÑ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ Ñтими\n"
+" ревизиÑми. ЕÑли указана только одна ревизиÑ, то Ñта ревизиÑ\n"
+" ÑравниваетÑÑ Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ¹ копией, а еÑли не указано ни одной\n"
+" ревизии, Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ ÑравниваетÑÑ Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой ревизией\n"
+" из хранилища."
+
+msgid "CMD"
+msgstr "КОМÐÐДÐ"
+
+msgid "comparison program to run"
+msgstr "запуÑÐºÐ°ÐµÐ¼Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° ÑравнениÑ"
+
+msgid "OPT"
+msgstr "ОПЦИЯ"
+
+msgid "pass option to comparison program"
+msgstr "передать ОПЦИЮ программе ÑравнениÑ"
+
+msgid "revision"
+msgstr "ревизиÑ"
+
+msgid "change made by revision"
+msgstr "изменениÑ, Ñделанные в ревизии"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr "hg extdiff [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr "иÑпользовать %(path)s Ð´Ð»Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° (или выбранных файлов)"
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+" Показать Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ревизиÑми Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ñ… файлов, иÑпользуÑ\n"
+" программу %(path)s."
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr "hg %s [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "http authentication with factotum"
+msgstr "http-Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· factotum"
+
+msgid ""
+"This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
+"platforms to provide authentication information for HTTP access. "
+"Configuration\n"
+"entries specified in the auth section as well as authentication information\n"
+"provided in the repository URL are fully supported. If no prefix is "
+"specified,\n"
+"a value of \"*\" will be assumed."
+msgstr ""
+"Это раÑширение позволÑет ÑредÑтву factotum(4) из Plan 9 от Bell Labs\n"
+"пркдоÑтавлÑÑ‚ÑŒ информацию Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ Ð´Ð»Ñ Ð´Ð¾Ñтупа по HTTP.\n"
+"ПоддерживаютÑÑ Ð²Ñе параметры конфигурации из Ñекции ``auth`` и параметры\n"
+"из URL хранилища. ЕÑли Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð½Ðµ указан, предполагаетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ \"*\"."
+
+msgid "By default, keys are specified as::"
+msgstr "По умолчанию ключи задаютÑÑ Ñ‚Ð°Ðº::"
+
+msgid ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+" proto=pass service=hg prefix=<префикÑ> user=<имÑ_пользователÑ> !"
+"password=<пароль>"
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+"ЕÑли раÑширение factotum не может прочитать требуемый ключ, он будет "
+"запрошее\n"
+"у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾."
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+"СущеÑтвует ÑÐµÐºÑ†Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³Ð° Ð´Ð»Ñ Ð½Ð°Ñтройки Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ.\n"
+"По умолчанию наÑтройки таковы::"
+
+msgid ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+msgstr ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+"Параметр ``executable`` задает полный путь к иÑполнÑемому файлу factotum.\n"
+"Параметр ``mountpoint`` определÑет путь к файловому ÑервиÑу factotum. "
+"Ðаконец,\n"
+"параметр ``service`` определÑет Ð¸Ð¼Ñ ÑервиÑа, иÑпользуемого при чтении ключей."
+
+msgid "factotum not interactive"
+msgstr "factotum не интерактивен"
+
+msgid "factotum not responding"
+msgstr "factotum не отвечает"
+
+msgid "pull, update and merge in one command (DEPRECATED)"
+msgstr "затÑнуть, обновитьÑÑ Ð¸ Ñлить одной командой (УСТÐРЕЛО)"
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+"затÑгивает Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· отдалённого хранилища, проводит ÑлиÑние\n"
+"при необходимоÑти."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+" Ðаходит вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище по указанному пути или URL и\n"
+" добавлÑет их в локальное хранилище."
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+" ЕÑли затÑнутые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñоздают новую голову, она автоматичеÑки\n"
+" ÑливаетÑÑ, и результат ÑлиÑÐ½Ð¸Ñ Ñ„Ð¸ÐºÑируетÑÑ. Ð’ противном Ñлучае,\n"
+" рабочий каталог обновлÑетÑÑ, чтобы отразить новые изменениÑ."
+
+msgid ""
+" When a merge is needed, the working directory is first updated to\n"
+" the newly pulled changes. Local changes are then merged into the\n"
+" pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+" ЕÑли требуетÑÑ ÑлиÑние, рабочий каталог Ñначала обновлÑетÑÑ Ð½Ð°\n"
+" только что затÑнутые изменениÑ. ПоÑле Ñтого локальные изменениÑ\n"
+" ÑливаютÑÑ Ð² затÑнутые. Чтобы изменить Ñтот порÑдок, иÑпользуйте\n"
+" --switch-parent."
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr " СпиÑок возможных форматов Ð´Ð»Ñ --d/--dates Ñм. :hg:`help dates`"
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Ð’ Ñлучае уÑпеха возвращает 0.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"рабочий каталог не на оконечной ревизии (иÑпользуйте \"hg update\",\n"
+"чтобы извлечь оконечную ревизию)"
+
+msgid "outstanding uncommitted merge"
+msgstr "иÑходÑщее незафикÑированное ÑлиÑние"
+
+msgid "outstanding uncommitted changes"
+msgstr "иÑходÑщие незафикÑированные изменениÑ"
+
+msgid "working directory is missing some files"
+msgstr "в рабочем каталоге отÑутÑтвуют некоторые файлы"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"на Ñтой ветке неÑколько голов (иÑпользуйте \"hg heads .\" и \"hg merge\"\n"
+"Ð´Ð»Ñ ÑлиÑниÑ"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "затÑгиваем из %s\n"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"Отдалённое хранилище не поддерживает поиÑк ревизий, поÑтому Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ может "
+"быть задана."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+"не выполнÑетÑÑ ÑлиÑние Ñ %d новыми головными ревизиÑми (иÑпользуйте\n"
+"\"hg heads .\" и \"hg merge\" Ð´Ð»Ñ ÑлиÑниÑ)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "обновление на %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "ÑлиÑние Ñ %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+"новый набор изменений %d:%s Ñливает отдалённые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, которую вы хотите затÑнуть"
+
+msgid "edit commit message"
+msgstr "редактировать Ñообщение фикÑации"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "редактировать Ñообщение фикÑации (УСТÐРЕЛО)"
+
+msgid "switch parents when merging"
+msgstr "поменÑÑ‚ÑŒ родителей при ÑлиÑнии"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [ИСТОЧÐИК]"
+
+msgid "commands to sign and verify changesets"
+msgstr "команды Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи и проверки наборов изменений"
+
+msgid "error while verifying signature"
+msgstr "ошибка при проверки подпиÑи"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s ÐŸÐ»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ от \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Внимание: Срок дейÑÑ‚Ð²Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи иÑтек (автор подпиÑи: \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Замечание: Ð’Ñ€ÐµÐ¼Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñтого ключа иÑтекло (подпиÑано \"%s\")\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "перечиÑлить подпиÑанные наборы изменений"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "узел %s:%d не ÑущеÑтвует\n"
+
+msgid "hg sigcheck REV"
+msgstr "hg sigcheck РЕВИЗИЯ"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr "проверить вÑе возможные подпиÑи Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ ревизии"
+
+#, python-format
+msgid "no valid signature for %s\n"
+msgstr "нет дейÑтвительной подпиÑи Ð´Ð»Ñ %s\n"
+
+msgid "make the signature local"
+msgstr "Ñделать подпиÑÑŒ локальной"
+
+msgid "sign even if the sigfile is modified"
+msgstr "подпиÑать, даже еÑÑ‚ÑŒ файл подпиÑей (sigfile) изменен"
+
+msgid "do not commit the sigfile after signing"
+msgstr "не фикÑировать файл подпиÑей (sigfile) поÑле подпиÑываниÑ"
+
+msgid "ID"
+msgstr "ИД"
+
+msgid "the key id to sign with"
+msgstr "идентификатор ключа, иÑпользуемого Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи"
+
+msgid "TEXT"
+msgstr "ТЕКСТ"
+
+msgid "commit message"
+msgstr "Ñообщение фикÑации"
+
+msgid "hg sign [OPTION]... [REV]..."
+msgstr "hg sign [ПÐРÐМЕТР]... [РЕВИЗИЯ]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "добавить подпиÑÑŒ Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ или заданной ревизии"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ указана, иÑпользуетÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾\n"
+" каталога, либо Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, еÑли рабочий каталог не извлечен."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" О возможных форматах Ð´Ð»Ñ -d/--date Ñм. :hg:`help dates`\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr "незафикÑированное ÑлиÑние - пожалуйÑта, Ñвно укажите ревизию"
+
+#, python-format
+msgid "signing %d:%s\n"
+msgstr "подпиÑываетÑÑ %d:%s\n"
+
+msgid "error while signing"
+msgstr "ошибка при подпиÑи"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° .hgsigs изменена (пожалуйÑта, зафикÑируйте .hgsigs "
+"вручную или иÑпользуйте --force"
+
+msgid "unknown signature version"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñи"
+
+msgid "command to view revision graphs from a shell"
+msgstr "команда Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра графа ревизий в командной Ñтроке"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"Эта команда добавлÑет опцию --graph к командам incoming, outgoing и\n"
+"log. ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð°, то отображаетÑÑ Ð³Ñ€Ð°Ñ„ ревизий в ASCII-графике.\n"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"Ñледовать иÑтории набора изменений или иÑтории файла при копированиÑÑ…/"
+"переименованиÑÑ…"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "Ñледовать только за первым родителем ревизий ÑлиÑÐ½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "show revisions matching date spec"
+msgstr "показывать ревизии Ñ Ð´Ð°Ñ‚Ð¾Ð¹, ÑоответÑтвующей данной"
+
+msgid "show copied files"
+msgstr "показывать Ñкопированные файлы"
+
+msgid "do case-insensitive search for a given text"
+msgstr "выполнить поиÑк данного текÑта, Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€"
+
+msgid "show the specified revision or range"
+msgstr "показать заданную ревизию или диапазон ревизий"
+
+msgid "include revisions where files were removed"
+msgstr "включить ревизии, в которых файлы были удалены"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "показывать только ÑлиÑÐ½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "USER"
+msgstr "ПОЛЬЗОВÐТЕЛЬ"
+
+msgid "revisions committed by user"
+msgstr "только ревизии данного пользователем"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "показывать только ревизии на данной именованной ветке (УСТÐРЕЛО)"
+
+msgid "BRANCH"
+msgstr "ВЕТКÐ"
+
+msgid "show changesets within the given named branch"
+msgstr "показывать наборы изменений на данной именованной ветке"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "не показывать ревизию и вÑех ее предшеÑтвенников"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "показывать Ñкрытые наборы изменений (УСТÐРЕЛО)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[ПÐРÐМЕТР]... [ФÐЙЛ]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "показать иÑторию ревизий Ñ€Ñдом Ñ ASCII-графом ревизий"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+" Печатает иÑторию ревизий Ñ€Ñдом Ñ Ð³Ñ€Ð°Ñ„Ð¾Ð¼ ревизий, отображаемого\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ASCII-Ñимволов."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Вершины, печатаемые Ñимволом @, ÑвлÑÑŽÑ‚ÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñми рабочего\n"
+" каталога.\n"
+" "
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr "хуки Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ð¸ Ñ ÑервиÑом уведомлений CIA.vc"
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+"ПодразумеваетÑÑ Ð¸Ñпользование Ð´Ð»Ñ Ñ…ÑƒÐºÐ¾Ð² changegroup или incoming.\n"
+"Чтобы наÑтроить уведомлениÑ, иÑпользуйте Ñледующие параметры в вашем\n"
+"конфиге Mercurial::"
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+" [cia]\n"
+" # ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² CIA\n"
+" user = foo\n"
+" # название проекта в CIA\n"
+" project = foo\n"
+" # модуль (подпроект) (необÑзательный)\n"
+" #module = foo\n"
+" # Добавить diffstat к журнальному Ñообщению (необÑзательный)\n"
+" #diffstat = False\n"
+" # Шаблон Ð´Ð»Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ñ… Ñообщений (необÑзательный)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # ИÑпользуемый Ñтиль (необÑзательный)\n"
+" #style = foo\n"
+" # URL ÑервиÑа уведомлений CIA (необÑзательный)\n"
+" # Можно иÑпользовать URL вида mailto: Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ по почте, например\n"
+" # mailto:cia@cia.vc\n"
+" # ОбÑзательно задайте при Ñтом email.from.\n"
+" #url = http://cia.vc/\n"
+" # напечатать Ñообщение вмеÑто его отправки (необÑзательный)\n"
+" #test = False\n"
+" # количеÑтво удалÑемых Ñлешей из путей в форме url\n"
+" #strip = 0"
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+" [hooks]\n"
+" # один из Ñтих:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+" [web]\n"
+" # ЕÑли вам нужны гиперÑÑылки (необÑзательный)\n"
+" baseurl = http://server/path/to/repo\n"
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s вернул ошибку: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr "hgcia: отправлÑем обновление %s\n"
+
+msgid "email.from must be defined when sending by email"
+msgstr "поле 'от' (email.from) должно быть заполнено при отправке email"
+
+msgid "browse the repository in a graphical way"
+msgstr "графичеÑкий обозреватель хранилища"
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+"РаÑширение hgk позволÑет проÑматривать иÑторию хранилища Ñ Ð¸Ñпользованием\n"
+"графичеÑкого интерфейÑа. Оно требует Tcl/Tk верÑии 8.4 или новее (Tcl/Tk\n"
+"не входит в диÑтрибутив Mercurial."
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+"hgk ÑоÑтоит из двух чаÑтей: Ñкрипта на Tcl, который оÑущеÑтвлÑет\n"
+"отображение и Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸, и раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Mercurial c именем\n"
+"hgk.py, предоÑтавлÑющего хуки, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ которых hgk получает данные.\n"
+"hgk находитÑÑ Ð² папке contrib, раÑширение поÑтавлÑетÑÑ Ð² хранилище\n"
+"hgext, и его нужно включить в конфиге."
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+"Команда :hg:`view` запуÑтит Tcl-Ñкрипт hgk. Чтобы команда заработала,\n"
+"hgk должен находитÑÑ Ð¿Ð¾ извеÑтным путÑм (PATH). Другой вариант - задать\n"
+"путь к hgk в вашем файле конфигурации::"
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+" [hgk]\n"
+" path=/путь/к/hgk"
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+"hgk может иÑпользовать раÑширение extdiff Ð´Ð»Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ ревизий.\n"
+"ПредполагаÑ, что вы уже наÑтроили команду extdiff vdiff, проÑто добавьте::"
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+" [hgk]\n"
+" vdiff=vdiff"
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+"Ð’ контекÑтное меню ревизий теперь будут включены дополнительные пункты\n"
+"Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка vdiff Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ñ… или ревизий или ревизий под курÑором.\n"
+
+msgid "diff trees from two commits"
+msgstr "Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð´ÐµÑ€ÐµÐ²ÑŒÐµÐ² при двух фикÑациÑÑ…"
+
+msgid "output common ancestor information"
+msgstr "вывод информации об общем предке"
+
+msgid "cat a specific revision"
+msgstr "вывеÑти указанную ревизию"
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file: не задан тип или ревизиÑ\n"
+
+# BUG
+msgid "aborting hg cat-file only understands commits\n"
+msgstr "прервано: hg cat-file понимает только фикÑации (commits)\n"
+
+msgid "parse given revisions"
+msgstr "разбор заданных ревизий"
+
+msgid "print revisions"
+msgstr "напечатать ревизии"
+
+msgid "print extension options"
+msgstr "напечатать параметры раÑширениÑ"
+
+msgid "start interactive history viewer"
+msgstr "запуÑтить интерактивный обозреватель иÑтории"
+
+msgid "NUM"
+msgstr "КОЛ-ВО"
+
+msgid "limit number of changes displayed"
+msgstr "ограничивать количеÑтво отображаемых изменений"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr "hg view [-l ПРЕДЕЛ] [ДИÐПÐЗОÐ_РЕВИЗИЙ]"
+
+msgid "generate patch"
+msgstr "generate patch"
+
+msgid "recursive"
+msgstr "recursive"
+
+msgid "pretty"
+msgstr "pretty"
+
+msgid "stdin"
+msgstr "stdin"
+
+msgid "detect copies"
+msgstr "detect copies"
+
+msgid "search"
+msgstr "search"
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr "hg git-diff-tree [ПÐРÐМЕТР]... УЗЕЛ1 УЗЕЛ2 [ФÐЙЛ]..."
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr "hg debug-cat-file [ПÐРÐМЕТР]... ТИП ФÐЙЛ"
+
+msgid "hg debug-config"
+msgstr "hg debug-config"
+
+msgid "hg debug-merge-base REV REV"
+msgstr "hg debug-merge-base РЕВИЗИЯ РЕВИЗИЯ"
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "игнорируемые"
+
+msgid "hg debug-rev-parse REV"
+msgstr "hg debug-rev-parse РЕВИЗИЯ"
+
+msgid "header"
+msgstr "заголовок"
+
+msgid "topo-order"
+msgstr "топологичеÑкий порÑдок"
+
+msgid "parents"
+msgstr "родители"
+
+msgid "max-count"
+msgstr "макÑимальное количеÑтво"
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr "hg debug-rev-list [ПÐРÐМЕТР]... РЕВИЗИЯ..."
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "подÑветка ÑинтакÑиÑа Ð´Ð»Ñ hgweb (требует Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"ЗавиÑит от библиотеки подÑветки ÑинтакÑиÑа Pygments:\n"
+"http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "Поддерживает единÑтвенный параметр конфигурации::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <Ñтиль>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "По умолчанию 'colorful'.\n"
+
+msgid "interactive history editing"
+msgstr "интерактивное редактирование иÑтории"
+
+msgid ""
+"With this extension installed, Mercurial gains one new command: histedit. "
+"Usage\n"
+"is as follows, assuming the following history::"
+msgstr ""
+"Это раÑширение добавлÑет в Mercurial одну команду: histedit.\n"
+"Ðиже приводитÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€ иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñледующей иÑтории:"
+
+msgid ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you were to run ``hg histedit c561b4e977df``, you would see the "
+"following\n"
+"file open in your editor::"
+msgstr ""
+"ЕÑли вы выполните ``hg histedit c561b4e977df``, вы увидите Ñледующий файл,"
+"открытый в вашем редакторе::"
+
+msgid ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+msgstr ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+
+# this output is not localized yet
+msgid ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+msgstr ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #"
+
+msgid ""
+"In this file, lines beginning with ``#`` are ignored. You must specify a "
+"rule\n"
+"for each revision in your history. For example, if you had meant to add "
+"gamma\n"
+"before beta, and then wanted to add delta in the same revision as beta, you\n"
+"would reorganize the file to look like this::"
+msgstr ""
+"Ð’ Ñтом файле Ñтроки, начинающиеÑÑ Ñ ``#``, игнорируютÑÑ. Ð’Ñ‹ должны задать\n"
+"правило Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ревизии в вашей иÑтории. Ðапример, еÑли вы хотели\n"
+"добавить gamma перед beta, а потом хотели добавить delta в той же ревизии,\n"
+"что и beta, вам Ñледует отредактировать файл Ñледующим образом::"
+
+msgid ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+msgstr ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+
+msgid ""
+"At which point you close the editor and ``histedit`` starts working. When "
+"you\n"
+"specify a ``fold`` operation, ``histedit`` will open an editor when it "
+"folds\n"
+"those revisions together, offering you a chance to clean up the commit "
+"message::"
+msgstr ""
+"ПоÑле того, как вы закроете редактор, ``histedit`` начнет работать.\n"
+"Когда вы указываете операцию ``fold`` (ÑовмеÑтить), ``histedit`` откроет\n"
+"редактор при Ñовмещении Ñтих ревизий вмеÑте, Ð¿Ñ€ÐµÐ´Ð»Ð°Ð³Ð°Ñ Ð²Ð°Ð¼ подчиÑтить\n"
+"Ñообщение фикÑации::"
+
+msgid ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+msgstr ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+
+msgid ""
+"Edit the commit message to your liking, then close the editor. For\n"
+"this example, let's assume that the commit message was changed to\n"
+"``Add beta and delta.`` After histedit has run and had a chance to\n"
+"remove any old or temporary revisions it needed, the history looks\n"
+"like this::"
+msgstr ""
+"Ðапишите подходÑщее Ñообщение фикÑации и закройте редактор. ЗдеÑÑŒ\n"
+"предположим, что Ñообщение фикÑации было заменено на ``Add beta and "
+"delta``.\n"
+"ПоÑле того, как histedit завершилÑÑ Ð¸ удалил вÑе Ñтарые и промежуточные\n"
+"ревизии, иÑÑ‚Ð¾Ñ€Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ выглÑдеть так::"
+
+msgid ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"Note that ``histedit`` does *not* remove any revisions (even its own "
+"temporary\n"
+"ones) until after it has completed all the editing operations, so it will\n"
+"probably perform several strip operations when it's done. For the above "
+"example,\n"
+"it had to run strip twice. Strip can be slow depending on a variety of "
+"factors,\n"
+"so you might need to be a little patient. You can choose to keep the "
+"original\n"
+"revisions by passing the ``--keep`` flag."
+msgstr ""
+"Обратите внимание, что ``histedit`` *не* удалÑет никакие ревизии (даже\n"
+"промежуточные временные ревизии) до того, как завершит вÑе операции\n"
+"редактированиÑ, поÑтому он, возможно, будет проводить неÑколько операций\n"
+"strip поÑле завершениÑ. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ð¾Ð³Ð¾ примера, strip выполнитÑÑ Ð´Ð²Ð°Ð¶Ð´Ñ‹.\n"
+"Strip может выполнÑÑ‚ÑŒÑÑ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ в завиÑимоÑти от многих факторов, поÑтому\n"
+"вам, возможно, потребуетÑÑ Ð½ÐµÐ¼Ð¾Ð³Ð¾ подождать. Ð’Ñ‹ также можете не удалÑÑ‚ÑŒ\n"
+"ревизии Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ флага ``--keep``."
+
+# spell также так же
+msgid ""
+"The ``edit`` operation will drop you back to a command prompt,\n"
+"allowing you to edit files freely, or even use ``hg record`` to commit\n"
+"some changes as a separate commit. When you're done, any remaining\n"
+"uncommitted changes will be committed as well. When done, run ``hg\n"
+"histedit --continue`` to finish this step. You'll be prompted for a\n"
+"new commit message, but the default commit message will be the\n"
+"original message for the ``edit`` ed revision."
+msgstr ""
+"ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ ``edit`` вернет Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ в командную Ñтроку, позволÑÑ\n"
+"произвольно редактировать файлы и даже иÑпользовать ``hg record``,\n"
+"чтобы зафикÑировать некоторые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð¹ ревизией. ПоÑле того,\n"
+"как вы закончите, вÑе незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ так же "
+"зафикÑированы.\n"
+"ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑƒÑтите ``hg histedit --continue`` чтобы закончить Ñтот\n"
+"шаг. Вам будет предложено ввеÑти новое Ñообщение фикÑации, при Ñтом\n"
+"по умолчанию Ñообщение фикÑации беретÑÑ Ð¸Ð· редактируемой ревизии."
+
+msgid ""
+"The ``message`` operation will give you a chance to revise a commit\n"
+"message without changing the contents. It's a shortcut for doing\n"
+"``edit`` immediately followed by `hg histedit --continue``."
+msgstr ""
+"ÐžÐ¿ÐµÑ€Ð°Ñ†Ð¸Ñ ``message`` позволит вам иÑправить Ñообщение фикÑации без\n"
+"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñодержимого ревизии. Это Ñокращенный вариант выполнениÑ\n"
+"операции ``edit`` Ñ Ð¿Ð¾Ñледующим `hg histedit --continue``."
+
+msgid ""
+"If ``histedit`` encounters a conflict when moving a revision (while\n"
+"handling ``pick`` or ``fold``), it'll stop in a similar manner to\n"
+"``edit`` with the difference that it won't prompt you for a commit\n"
+"message when done. If you decide at this point that you don't like how\n"
+"much work it will be to rearrange history, or that you made a mistake,\n"
+"you can use ``hg histedit --abort`` to abandon the new changes you\n"
+"have made and return to the state before you attempted to edit your\n"
+"history."
+msgstr ""
+"ЕÑли ``histedit`` обнаруживает конфликт при перемещении ревизии (во\n"
+"Ð²Ñ€ÐµÐ¼Ñ ``pick`` или ``fold``), он оÑтановитÑÑ, как при ``edit``, за\n"
+"иÑключением того, что вам не будет предложено ввеÑти Ñообщение фикÑации\n"
+"по завершении. ЕÑли в Ñтот момент вы решите, что вам не нравитÑÑ Ñ‚Ð¾Ñ‚\n"
+"объем работы, который потребуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´ÐµÐ»Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð¸Ñтории, или вы\n"
+"допуÑтили ошибку, можно иÑпользовать ``hg histedit --abort``, чтобы\n"
+"отброÑить новые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ вернутьÑÑ Ðº ÑоÑтоÑнию до редактированиÑ\n"
+"иÑтории."
+
+msgid ""
+"If we clone the example repository above and add three more changes, such "
+"that\n"
+"we have the following history::"
+msgstr ""
+"ЕÑли мы клонируем приведенное выше хранилище и добавим еще три изменениÑ,\n"
+"получим такую иÑторию::"
+
+msgid ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you run ``hg histedit --outgoing`` on the clone then it is the same\n"
+"as running ``hg histedit 836302820282``. If you need plan to push to a\n"
+"repository that Mercurial does not detect to be related to the source\n"
+"repo, you can add a ``--force`` option.\n"
+msgstr ""
+"Выполнение ``hg histedit --outgoing`` на клоне Ñквивалентно выполнению\n"
+"``hg histedit 836302820282``. ЕÑли вы хотите протолкнуть Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²\n"
+"хранилище, которое Mercurial не опознает как ÑвÑзанное Ñ Ð¸Ñточником,\n"
+"можно иÑпользовать параметр ``--force``.\n"
+
+msgid "cannot edit history that would orphan nodes"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ иÑторию, еÑли Ñто оÑтавлÑет виÑÑчие узлы"
+
+msgid "can't edit history with merges"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ иÑторию Ñо ÑлиÑниÑми"
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: пуÑтой набор изменений"
+
+msgid "Fix up the change and run hg histedit --continue"
+msgstr "ИÑправьте изменение и запуÑтите hg histedit --continue"
+
+msgid ""
+"Make changes as needed, you may commit or record as needed now.\n"
+"When you are finished, run hg histedit --continue to resume."
+msgstr ""
+"ВнеÑите Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ необходимоÑти, при Ñтом, еÑли хотите, можно\n"
+"выполнÑÑ‚ÑŒ commit или record. Когда закончите, выполните\n"
+"hg histedit --continue Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ."
+
+msgid "Read history edits from the specified file."
+msgstr "Читать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ñтории из указанного файла."
+
+msgid "continue an edit already in progress"
+msgstr "продолжить текущее изменение иÑтории"
+
+msgid "don't strip old nodes after edit is complete"
+msgstr "не вырезать Ñтарые узлы поÑле завершениÑ"
+
+msgid "abort an edit in progress"
+msgstr "отменить текущее редактирование"
+
+msgid "changesets not found in destination"
+msgstr "наборы изменений, отÑутÑтвующие в другом хранилище"
+
+msgid "force outgoing even for unrelated repositories"
+msgstr "иÑпользовать outgoing даже Ð´Ð»Ñ Ð½ÐµÑвÑзанных хранилищах"
+
+msgid "first revision to be edited"
+msgstr "Ð¿ÐµÑ€Ð²Ð°Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ"
+
+msgid "[PARENT]"
+msgstr "[РОДИТЕЛЬ]"
+
+msgid ""
+"interactively edit changeset history\n"
+" "
+msgstr "интерактивно редактировать иÑторию ревизий "
+
+msgid "source has mq patches applied"
+msgstr "иÑточник имеет наложенные патчи mq"
+
+msgid "only one repo argument allowed with --outgoing"
+msgstr "допуÑкаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ одно хранилище Ñ --outgoing"
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "Ñравниваем Ñ %s\n"
+
+msgid "--force only allowed with --outgoing"
+msgstr "--force допуÑтимо только Ñ --outgoing"
+
+msgid "no arguments allowed with --continue"
+msgstr "другие аргументы не допуÑкаютÑÑ Ñ --continue"
+
+msgid "no arguments allowed with --abort"
+msgstr "другие аргументы не допуÑкаютÑÑ Ñ --abort"
+
+msgid "history edit already in progress, try --continue or --abort"
+msgstr ""
+"редактирование иÑтории уже выполнÑетÑÑ, иÑпользуйте --continue или --abort"
+
+msgid "histedit requires exactly one parent revision"
+msgstr "histedit требует ровно одну родительÑкую ревизию"
+
+msgid "histedit: Should update metadata for the following changes:\n"
+msgstr "histedit: Ðеобходимо обновить метаданные Ð´Ð»Ñ Ñледующих изменений:\n"
+
+#, python-format
+msgid "histedit: %s to %s\n"
+msgstr "histedit: %s to %s\n"
+
+#, python-format
+msgid "histedit: moving bookmarks %s\n"
+msgstr "histedit: перемещаютÑÑ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸ %s\n"
+
+msgid "must specify a rule for each changeset once"
+msgstr "Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ревизии требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ одно правило"
+
+#, python-format
+msgid "malformed line \"%s\""
+msgstr "неверный формат Ñтроки \"%s\""
+
+msgid "may not use changesets other than the ones listed"
+msgstr "можно иÑпользовать только перечиÑленные наборы изменений"
+
+#, python-format
+msgid "unknown changeset %s listed"
+msgstr "перечиÑлен неизвеÑтный набор изменений %s"
+
+#, python-format
+msgid "unknown action \"%s\""
+msgstr "неизвеÑтное дейÑтвие \"%s\""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr "уÑкоренные ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ð± изменениÑÑ… Ñ Ð¸Ñпользованием Linux inotify"
+
+msgid "start an inotify server for this repository"
+msgstr "запуÑтить Ñервер inotify Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ хранилища"
+
+msgid "debugging information for inotify extension"
+msgstr "Ð¾Ñ‚Ð»Ð°Ð´Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ inotify"
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+" Печатает ÑпиÑок каталогов, отÑлеживаемых Ñервером inotify.\n"
+" "
+
+msgid "directories being watched:\n"
+msgstr "отÑлеживаемые каталоги:\n"
+
+msgid "run server in background"
+msgstr "запуÑтить Ñервер в фоновом режиме"
+
+msgid "used internally by daemon mode"
+msgstr "иÑпользуетÑÑ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ реализацией в режиме демона"
+
+msgid "minutes to sit idle before exiting"
+msgstr "количеÑтво минут неактивноÑти перед выходом"
+
+msgid "name of file to write process ID to"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи ID процеÑÑа"
+
+msgid "hg inserve [OPTION]..."
+msgstr "hg inserve [ПÐРÐМЕТР]..."
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+"inotify-client: обнаружен мертвый Ñокет inotify-Ñервера; закрываем его\n"
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr "inotify-client: не удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить Ñервер inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+"inotify-client: не удаетÑÑ Ð½Ð°Ð»Ð°Ð´Ð¸Ñ‚ÑŒ общение Ñ Ð½Ð¾Ð²Ñ‹Ð¼ Ñервером inotify: %s\n"
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr "inotify-client: не удаетÑÑ ÑоединитьÑÑ Ñ Ñервером inotify: %s\n"
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr "inotify-client: получен пуÑтой ответ от Ñервера inotify"
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr "(inotify: получен ответ от Ñервера неÑовмеÑтимой верÑии %d)\n"
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr "(inotify: получен ответ '%s', ожидалÑÑ '%s')\n"
+
+msgid "this system does not seem to support inotify"
+msgstr "ваша ÑиÑтема, похоже, не поддерживает inotify"
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+"*** текущее предельное количеÑтво наблюдений inotify на одного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ "
+"- %s\n"
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+"*** Ñтот предел Ñлишком мал чтобы наблюдать за вÑеми каталогами Ñтого "
+"хранилища\n"
+
+msgid "*** counting directories: "
+msgstr "*** подÑчет каталогов: "
+
+#, python-format
+msgid "found %d\n"
+msgstr "найдено %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr "*** чтобы поднÑÑ‚ÑŒ предел Ñ %d до %d (Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ root):)\n"
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr "*** echo %d > %s\n"
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr "невозможно отÑлеживать %s пока не будет повышен предел наблюдений"
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr "Ñлужба inotify недоÑтупна: %s"
+
+#, python-format
+msgid "watching %r\n"
+msgstr "наблюдаем за %r\n"
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr "наблюдаем за каталогами в %r\n"
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr "%s Ñобытие: Ñоздан %s\n"
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr "%s Ñобытие: %s удален\n"
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr "%s Ñобытие: %s изменен\n"
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr "Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑтема, ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ %s, была отмонтирована\n"
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr "%s доÑтупно Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ: %d байт\n"
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr "%s доÑтигнут предел - отцеплÑем хук\n"
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr "%s читает %d Ñобытий\n"
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr "%s приÑоединÑем хук заново, можно прочитать %d байт\n"
+
+msgid "finished setup\n"
+msgstr "уÑтановка завершена\n"
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr "ÑоÑтоÑние: %r %s -> %s\n"
+
+msgid "rescanning due to .hgignore change\n"
+msgstr "повторное Ñканирование из-за Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ .hgignore\n"
+
+msgid "cannot start: socket is already bound"
+msgstr "не удаетÑÑ Ð·Ð°Ð¿ÑƒÑтитьÑÑ: Ñокет уже привÑзан"
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+"не удаетÑÑ Ð·Ð°Ð¿ÑƒÑтитьÑÑ: пыталиÑÑŒ ÑвÑзать .hg/inotify.sock Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ "
+"Ñокетом,\n"
+"но .hg/inotify.sock уже ÑущеÑтвует"
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr "отвечаем на Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ %r\n"
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr "получен Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚ клиента неÑовмеÑтимой верÑии %d\n"
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr "неизвеÑтный тип запроÑа: %s\n"
+
+msgid "expand expressions into changelog and summaries"
+msgstr "раÑкрывает Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² журнале изменений и Ñводках"
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+"Это раÑширение позволÑет иÑпользовать в Ñводках Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñобого вида,\n"
+"которые автоматичеÑки раÑкрываютÑÑ Ð² ÑÑылки или любое другое произвольное\n"
+"выражение, как Ñто делаетÑÑ Ð² InterWiki."
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+"Примеры шаблонов (ÑÑылка на баг-трекер и Ñ‚.п.), которые могут быть\n"
+"иÑпользованы в вашем hgrc::"
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr "interhg: неверный шаблон Ð´Ð»Ñ %s: %s\n"
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr "interhg: неверное регулÑрное выражение Ð´Ð»Ñ %s: %s\n"
+
+msgid "expand keywords in tracked files"
+msgstr "выполнÑÑ‚ÑŒ подÑтановку ключевых Ñлов в отÑлеживаемых файлах"
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+"Это раÑширение выполнÑет подÑтановку RCS/CVS-подобных или ÑамоÑтоÑтельно\n"
+"определенных $КлючевыхСлов$ в выбранных вами отÑлеживаемых файлах."
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+"Ключевые Ñлова подÑтавлÑÑŽÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в локальных хранилищах и не хранÑÑ‚ÑÑ\n"
+"в иÑтории изменений. Такой механизм может иÑпользоватьÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ\n"
+"удобÑтва работы текущего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ при архивации диÑтрибутива."
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+"Ключевые Ñлова подÑтавлÑÑŽÑ‚ÑÑ ÑоглаÑно данным поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ "
+"отноÑительно\n"
+"Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла в рабочем каталоге."
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+"ÐаÑтройки оÑущеÑтвлÑÑŽÑ‚ÑÑ Ð² ÑекциÑÑ… [keyword], [keywordset] и [keywordmaps]\n"
+"файлов конфигурации."
+
+msgid "Example::"
+msgstr "Пример::"
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+" [keyword]\n"
+" # подÑтавлÑÑ‚ÑŒ ключевые Ñлова во вÑех файлах на python, кроме "
+"#Ñовпадающих Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼ \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+" [keywordset]\n"
+" # предпочитать svn- а не cvs-подобные подÑтановки (keywordmaps) по "
+"#умолчанию\n"
+" svn = True"
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+".. note::\n"
+" Чем более конкретны ваши шаблоны файлов, тем меньше накладные раÑходы\n"
+" в больших хранилищах."
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+"Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [keywordmaps] Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð²\n"
+"и демонÑтрации подÑтановок, иÑпользуйте :hg:`kwdemo`. СпиÑок возможных\n"
+"шаблонов и фильтров Ñм. в :hg:`help templates`."
+
+msgid "Three additional date template filters are provided:"
+msgstr "ИмеютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ три дополнительных фильтров шаблонов дат:"
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+"ÐžÑ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (mappings) шаблонов по умолчанию (их можно поÑмотреть Ñ\n"
+"помощью :hg:`kwdemo -d`) могут быть заменены Ñвоими ключевыми Ñловами\n"
+"и шаблонами. Ð”Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² вашей наÑтройки запуÑтите\n"
+":hg:`kwdemo` еще раз."
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+"Перед изменением/удалением активных ключевых Ñлов, необходимо запуÑтить\n"
+":hg:`kwshrink`, чтобы избежать ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñтавленных ключевых Ñлов\n"
+"в иÑтории изменений."
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+"Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ подÑтановки поÑле ее Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек,\n"
+"запуÑтите :hg:`kwexpand`."
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+"ПодÑтановки, охватывающие более одной Ñтроки, и инкрементальные\n"
+"подÑтановки вроде CVS $Log$ не поддерживаютÑÑ. Отображение шаблона\n"
+"ключевого Ñлова (keyword template map) вида \"Log = {desc}\"\n"
+"раÑкроетÑÑ Ð² первую Ñтроку опиÑÐ°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений.\n"
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr "перезапиÑываютÑÑ %s подÑтавлÑемых ключевых Ñлов\n"
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr "перезапиÑываютÑÑ %s отмененных (shrinking) ключевых Ñлов\n"
+
+msgid "[keyword] patterns cannot match"
+msgstr "шаблоны в [keyword] не Ñовпадут ни Ñ Ñ‡ÐµÐ¼"
+
+msgid "no [keyword] patterns configured"
+msgstr "в Ñекции [keyword] нет наÑтроенных шаблонов"
+
+msgid "show default keyword template maps"
+msgstr "показать Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð² ключевых Ñлов по умолчанию"
+
+msgid "read maps from rcfile"
+msgstr "читать Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· файла"
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr "hg kwdemo [-d] [-f ФÐЙЛ] [ОТОБРÐЖЕÐИЕ_ШÐБЛОÐОВ]..."
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr "напечатать наÑтройки в [keywordmaps] и пример подÑтановки"
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+" Показывает текущие, наÑтроенные или заданные по умолчанию отображениÑ\n"
+" шаблонов ключевых Ñлов (keyword template maps) и их подÑтановку."
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+" Можно дополнить текущие наÑтройки, указав Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² качеÑтве\n"
+" аргументов или иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð¿Ñ†Ð¸ÑŽ -f/--rcfile, чтобы прочитать\n"
+" наÑтройки из файла."
+
+msgid " Use -d/--default to disable current configuration."
+msgstr " ИÑпользуйте -d/--default чтобы отключить текущие наÑтройки."
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" О шаблонах и фильтрах Ñм. :hg:`help templates`.\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "Ñоздание временного хранилища в %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+"\n"
+"\tнаÑтройка Ñ Ð¸Ñпользованием заданных отображение шаблонов ключевых Ñлов\n"
+
+msgid "\textending current template maps\n"
+msgstr "\tдополнение текущий отображений шаблонов\n"
+
+msgid "\toverriding default svn keywordset\n"
+msgstr "\tпереопределение наборов ключевых Ñлов svn по умолчанию\n"
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr "\tпереопределение наборов ключевых Ñлов cvs по умолчанию\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+"\n"
+"\tнаÑтройка Ñ Ð¸Ñпользованием ключевых Ñлов svn по умолчанию\n"
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+"\n"
+"\tнаÑтройка Ñ Ð¸Ñпользованием ключевых Ñлов cvs по умолчанию\n"
+
+msgid "\tdisabling current template maps\n"
+msgstr "\tотключение текущих отображений шаблонов\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+"\n"
+"\tнаÑтройка Ñ Ð¸Ñпользованием текущих отображений шаблонов ключевых Ñлов\n"
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+"\n"
+"ключевые Ñлова запиÑаны в %s:\n"
+
+msgid "hg keyword configuration and expansion example"
+msgstr "пример наÑтройки и подÑтановки ключевых Ñлов"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+"\n"
+"\tрезультат подÑтановки ключевых Ñлов\n"
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr "hg kwexpand [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "expand keywords in the working directory"
+msgstr "выполнить подÑтановку ключевых Ñлов в рабочем каталоге"
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+" ЗапуÑкайте поÑле Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸ повторного включениÑ\n"
+" подÑтановки ключевых Ñлов."
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwexpand откажетÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑÑ‚ÑŒÑÑ, еÑли указанные файлы Ñодержат локальные\n"
+" изменениÑ.\n"
+" "
+
+msgid "show keyword status flags of all files"
+msgstr "показать флаги ÑоÑтоÑний ключевых Ñлов Ð´Ð»Ñ Ð²Ñех файлов"
+
+msgid "show files excluded from expansion"
+msgstr "показать файлы, в которых не производитÑÑ Ð¿Ð¾Ð´Ñтановка"
+
+msgid "only show unknown (not tracked) files"
+msgstr "показать только неизвеÑтные (неотÑлеживаемые) файлы"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr "hg kwfiles [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "show files configured for keyword expansion"
+msgstr "показать файлы, наÑтроенные Ð´Ð»Ñ Ð¿Ð¾Ð´Ñтановки ключевых Ñлов"
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+" Показывает файлы в рабочем каталоге, имена которых Ñовпадают\n"
+" Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð°Ð¼Ð¸, заданными в Ñекции [keyword] конфига."
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+" Полезно Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… подÑтановок ключевых Ñлов\n"
+" и Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð° Ñчет обработки только нужных файлов."
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+" О том, как задавать шаблоны имен файлов, в которых выполнÑетÑÑ\n"
+" или не выполнÑетÑÑ Ð¿Ð¾Ð´Ñтановка, Ñм. :hg:`help keyword`."
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+" С опциÑми -A/--all и -v/--verbose иÑпользуютÑÑ Ñледующие коды\n"
+" ÑоÑтоÑний файлов::"
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+" K = кандидат на подÑтановку ключевых Ñлов\n"
+" k = кандидат на подÑтановку ключевых Ñлов (не отÑлеживаетÑÑ)\n"
+" I = игнорируетÑÑ\n"
+" i = игнорируетÑÑ (не отÑлеживаетÑÑ)\n"
+" "
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr "hg kwshrink [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "revert expanded keywords in the working directory"
+msgstr "отменить подÑтановки ключевых Ñлов в рабочем каталоге"
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+" Следует запуÑкать перед изменением/отключением активных\n"
+" ключевых Ñлов."
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+" kwshrink откажетÑÑ Ð·Ð°Ð¿ÑƒÑкатьÑÑ, еÑли заданные файлы Ñодержат\n"
+" незафикÑированные локальные изменениÑ."
+
+msgid "track large binary files"
+msgstr "отÑлеживает большие бинарные файлы"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+"Большие бинарные файлы обычно плохо ÑжимаютÑÑ, их Ñложно Ñравнивать,\n"
+"и еще Ñложнее Ñливать. Такие файлы не могут Ñффективно хранитьÑÑ\n"
+"в формате Mercurial (revlog), который оÑнован на Ñжатых двоичных\n"
+"различиÑÑ… (дельтах); хранение больших файлов в Mercurial обычным\n"
+"ÑпоÑобом перегружает Ñеть, иÑпользует много меÑта и увеличивает\n"
+"потребление памÑти. РаÑширение largefiles решает Ñти проблемы,\n"
+"добавлÑÑ Ñ†ÐµÐ½Ñ‚Ñ€Ð°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¹ клиент-Ñерверный Ñлой поверх Mercurial:\n"
+"большие файлы помещаютÑÑ Ð½Ð° *центральный Ñклад* где-нибудь\n"
+"в Ñети, а вы извлекаете нужные ревизии по мере необходимоÑти."
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+"largefiles Ñоздает \"замещающий файл\" (\"standin file\") в .hglf\n"
+"Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ большого файла. Эти файлы малы (41 байт: Ñ…Ñш SHA-1 и\n"
+"перевод Ñтроки) и отÑлеживаютÑÑ Mercurial. Ревизии больших файлов\n"
+"определÑÑŽÑ‚ÑÑ Ð¿Ð¾ Ñ…Ñшу SHA-1 их Ñодержимого, который пишетÑÑ Ð²\n"
+"Ñтандартный ввод. largefiles иÑпользует Ñтот идентификатор ревизии\n"
+"чтобы получить/передать ревизию большого файла из/на центральный\n"
+"Ñклад. Это позволÑет Ñкономить меÑто на диÑке и трафик, поÑкольку\n"
+"вам не надо передавать вÑÑŽ иÑторию ревизий больших файлов при\n"
+"клонировании или операции pull."
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+"Чтобы Ñоздать новое хранилище или добавить новый большой бинарный\n"
+"файл, проÑто добавьте --large к команде :hg:`add`. Ðапример::"
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'randomdata добавлен как большой файл'"
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+"Когда вы передаете набор изменений, который добавлÑет или изменÑет\n"
+"большой файл Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды push, его largefile-Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚\n"
+"также передана. Обратите внимание, что на отдалённой машине раÑширение\n"
+"largefiles также должно быть включено."
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+"Когда вы затÑгиваете набор изменений, который затрагивает большие\n"
+"файлы, из отдалённого хранилища, Mercurial ведет ÑÐµÐ±Ñ ÐºÐ°Ðº обычно.\n"
+"Однако, когда вы обновлÑетеÑÑŒ на такую ревизию, вÑе большие файлы,\n"
+"нужные Ð´Ð»Ñ Ñтой ревизии, загружаютÑÑ Ð¸ кÑшируютÑÑ (еÑли они не были\n"
+"загружены ранее). Это означает, что вам может понадобитÑÑ Ð´Ð¾Ñтуп к Ñети,\n"
+"чтобы обновитÑÑ Ð½Ð° ревизию, на которую вы до Ñтого ни разу не обновлÑлиÑÑŒ."
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+"ЕÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ большие файлы, отÑлеживаемые Mercurial без\n"
+"раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ largefiles, вам надо будет преобразовать Ñвое хранилище,\n"
+"чтобы извлечь пользу из раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ largefiles. Это делаетÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹\n"
+":hg:`lfconvert`::"
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr " $ hg lfconvert --size 10 Ñтарое_хранилище новое_хранилище"
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+"Ð’ хранилищах, уже Ñодержащих большие файлы, каждый файл больше 10 МБ\n"
+"будет добавлен как большой. Чтобы изменить Ñтот порог, иÑпользуйте\n"
+"параметр ``largefiles.minsize`` в вашем конфиге Mercurial, чтобы\n"
+"задать минимальный размер в мегабайтах, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ файл ÑчитаетÑÑ\n"
+"большим, или иÑпользуйте параметр команды add --lfsize (также в МБ)::"
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+" [largefiles]\n"
+" minsize = 2"
+
+msgid " $ hg add --lfsize 2"
+msgstr " $ hg add --lfsize 2"
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+"Параметр конфига ``largefiles.patterns`` позволÑет задать ÑпиÑок\n"
+"шаблонов имен файлов (Ñм. :hg:`help patterns`), которые должны вÑегда\n"
+"отÑлеживатьÑÑ ÐºÐ°Ðº большие::"
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size."
+msgstr ""
+"Файлы, подходÑщие под любой из Ñтих шаблонов, будут добавлены как\n"
+"большие вне завиÑимоÑти от их размера."
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+"Параметры конфигурации ``largefiles.minsize`` и ``largefiles.patterns``\n"
+"игнорируютÑÑ Ð´Ð»Ñ Ð²Ñех хранилищ, еще не Ñодержащих больших файлов.\n"
+"Чтобы добавить первый большой файл в хранилище, необходимо Ñвно\n"
+"указать флаг --large в команде :hg:`add`.\n"
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "преобразовать обычное хранилище в хранилище largefiles"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+" Преобразует хранилище ИСТОЧÐИК в новое хранилище ÐÐЗÐ,\n"
+" идентичное ИСТОЧÐИКУ, за иÑключением того, что некоторые файлы\n"
+" будут преобразованы в большие, а именно те, имена которых\n"
+" Ñовпадают Ñ Ð¨ÐБЛОÐОМ *или* чей размер превышает заданный порог.\n"
+" Ð”Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ, ÑвлÑетÑÑ Ð»Ð¸ данный файл большим, иÑпользуетÑÑ\n"
+" размер его первой верÑии. Минимальный размер может быть задан Ñ\n"
+" помощью аргумента командной Ñтроки --size или в конфиге Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" ``largefiles.size``."
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+" ПоÑле запуÑка Ñтой команды, вам Ñледует убедитьÑÑ, что раÑширение\n"
+" largefiles включено на вÑех машинах, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ вы ÑобираетеÑÑŒ\n"
+" обмениватьÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñми."
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+" ИÑпользуйте --to-normal чтобы преобразовать большие файлы\n"
+" обратно в нормальные; поÑле Ñтого, хранилище ÐÐЗРможет\n"
+" быть иÑпользовано и без largefiles."
+
+msgid "getting largefiles"
+msgstr "получение большие файлы"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "получение %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: данные повреждены (ожидаетÑÑ %s, получено %s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "поиÑк %d изменений Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… файлов\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr "проверено Ñодержимое %d ревизий %d файлов\n"
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr "проверено ÑущеÑтвование %d ревизий %d файлов\n"
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr "Ð½ÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ñхема URL %r"
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "%s не ÑвлÑетÑÑ Ñкладом больших файлов"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s - не локальное хранилище Mercurial"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr "Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s\n"
+
+msgid "converting revisions"
+msgstr "преобразование ревизий"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr ""
+"переименованный/Ñкопированный большой файл %s ÑтановитÑÑ ÑимволичеÑкой "
+"ÑÑылкой"
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr "большой файл %s ÑтановитÑÑ ÑимволичеÑкой ÑÑылкой"
+
+#, python-format
+msgid "skipping incorrectly formatted tag %s\n"
+msgstr "пропущена Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ°: %s\n"
+
+#, python-format
+msgid "skipping incorrectly formatted id %s\n"
+msgstr "пропущен неверный идентификатор: %s\n"
+
+#, python-format
+msgid "no mapping for id %s\n"
+msgstr "нет ÑопоÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð° %s\n"
+
+msgid "uploading largefiles"
+msgstr "передача больших файлов"
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr "большой файл %s отÑутÑтвует на Ñкладе (необходимо его загрузить)"
+
+#, python-format
+msgid "%d additional largefiles cached\n"
+msgstr "%d больших файлов закÑшировано дополнительно\n"
+
+#, python-format
+msgid "%d largefiles failed to download\n"
+msgstr "не удалоÑÑŒ загрузить %d больших файлов\n"
+
+msgid "getting changed largefiles\n"
+msgstr "получение измененных больших файлов\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "%d больших файлов загружено, %d удалено\n"
+
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr "большой файл %s отÑутÑтвует в кÑше и не может быть загружен"
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr ""
+"минимальный размер (МБ), Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ файлы преобразуютÑÑ Ð² большие"
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr "преобразовать из хранилища largefiles в обычное хранилище"
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr "hg lfconvert ИСТОЧÐИК ÐÐЗР[ФÐЙЛ]"
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr "largefiles: размер должен быть чиÑлом (не %s)\n"
+
+msgid "minimum size for largefiles must be specified"
+msgstr "необходимо указать минимальный размер больших файлов"
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ ÑиÑтема: %s\n"
+
+#, python-format
+msgid "found %s in store\n"
+msgstr "%s найден на Ñкладе\n"
+
+#, python-format
+msgid "found %s in system cache\n"
+msgstr "%s найден в ÑиÑтемном кÑше\n"
+
+msgid "can't get file locally"
+msgstr "невозможно получить файл локально"
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+"набор изменений %s: %s отÑутÑтвует\n"
+" (пыталÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ Ñ…Ñш %s)\n"
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+"набор изменений %s: %s: Ñодержимое различно\n"
+" (%s:\n"
+" ожидаемый Ñ…Ñш %s,\n"
+" полученный %s)\n"
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "файл %s уже ÑчитаетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ файлом\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "добавление %s как большого файла\n"
+
+msgid "no files specified"
+msgstr "не задано ни одного файла"
+
+#, python-format
+msgid "not removing %s: %s (use forget to undo)\n"
+msgstr "не изымаем %s: %s (иÑпользуйте forget, чтобы отменить добавление)\n"
+
+msgid "file still exists"
+msgstr "файл уже ÑущеÑтвует"
+
+msgid "file is modified"
+msgstr "файл изменен"
+
+msgid "file has been marked for add"
+msgstr "файл был помечен Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "удалÑетÑÑ %s\n"
+
+msgid "--normal cannot be used with --large"
+msgstr "--normal Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñ --large"
+
+msgid "uncommitted local changes"
+msgstr "незафикÑированные локальные изменениÑ"
+
+# PROMPT
+msgid "&Largefile"
+msgstr "&Largefile - большой файл"
+
+# PROMPT
+msgid "&Normal file"
+msgstr "&Normal - обычный файл"
+
+# PROMPT
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+"%s был преобразован в большой файл\n"
+"ИÑпользовать как большой файл:(l)argefile или оÑтавить обычным:(n)ormal?"
+
+# PROMPT
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+"%s был преобразован в обычный файл\n"
+"ОÑтавить как большой файл:(l)argefile или иÑпользовать обычный:(n)ormal?"
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "ÑлиÑние %s и %s в %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "ÑлиÑние %s\n"
+
+# PROMPT
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+"конфликт ÑлиÑÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð³Ð¾ файла %s\n"
+"оÑтавить локальный:(l)ocal или другой:(o)ther?"
+
+# PROMPT
+msgid "&Local"
+msgstr "&Local - локальный"
+
+# PROMPT
+msgid "&Other"
+msgstr "&Other - другой"
+
+msgid "no files to copy"
+msgstr "нет файлов Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ"
+
+msgid "destination largefile already exists"
+msgstr "большой файл Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ ÑущеÑтвует"
+
+msgid "caching new largefiles\n"
+msgstr "кÑшируем новые большие файлы\n"
+
+#, python-format
+msgid "%d largefiles cached\n"
+msgstr "%d больших файлов закÑшировано\n"
+
+#, python-format
+msgid "--all-largefiles is incompatible with non-local destination %s"
+msgstr "--all-largefiles неÑовмеÑтим Ñ Ð½ÐµÐ»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼ путем Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ %s"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "неизвеÑтный тип архива '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð¿Ñ€Ð¸ архивировании в файлы"
+
+#, python-format
+msgid "largefile %s not found in repo store or system cache"
+msgstr "большой файл %s не найден ни на Ñкладе хранилища, ни в ÑиÑтемном кÑше"
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr "%s не удален, он и так не отÑлеживаетÑÑ\n"
+
+msgid "largefiles: No remote repo\n"
+msgstr "largefiles: Ðет отдалённого хранилища\n"
+
+msgid "largefiles to upload:\n"
+msgstr "больших файлов Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸:\n"
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr "largefiles: %d Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸\n"
+
+msgid "largefile contents do not match hash"
+msgstr "Ñодержимое большого файла не Ñовпадает Ñ Ñ…Ñш-Ñуммой"
+
+#, python-format
+msgid "largefiles: failed to put %s into store: %s"
+msgstr "largefiles: не удалоÑÑŒ помеÑтить %s на Ñклад: %s"
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr "требуемый большой файл %s отÑутÑтвует в кÑше"
+
+msgid "remote: "
+msgstr "отдалённо: "
+
+#, python-format
+msgid "unexpected putlfile response: %s"
+msgstr "непредвиденный ответ при размещении файла: %s"
+
+msgid "putlfile failed:"
+msgstr "не удалоÑÑŒ выполнить putlfile:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "не удалоÑÑŒ выполнить putlfile (непредвиденный ответ):"
+
+msgid "unexpected response:"
+msgstr "непредвиденный ответ:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr "remotestore: не могу помеÑтить %s на отдаленный Ñклад %s"
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr "remotestore: %s передаетÑÑ Ð½Ð° отдаленный Ñклад %s"
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr "remotestore: не могу открыть файл %s: %s"
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr "remotestore: большой файл %s поврежден (invalid)"
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr "remotestore: большой файл %s отÑутÑтвует"
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr "Ðабор изменений %s: %s: Ñодержимое различно\n"
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "Ðабор изменений %s: %s отÑутÑтвует\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+"largefiles: метод %r похоже уже обрабатываетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ раÑширением: "
+"largefiles может работать некорректно.\n"
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr "файл \"%s\" подменÑет большой файл"
+
+msgid "add as largefile"
+msgstr "добавить как большой файл"
+
+msgid "add as normal file"
+msgstr "добавить как обычный файл"
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+"добавить вÑе файлы больше Ñтого размера (в МБ) как большие (по умолчанию: 10)"
+
+msgid "verify largefiles"
+msgstr "проверить большие файлы"
+
+msgid "verify all revisions of largefiles not just current"
+msgstr "проверить вÑе ревизии больших файлов, а не только текущую"
+
+msgid "verify largefile contents not just existence"
+msgstr "проверить Ñодержимое большого файла, а не только его наличие"
+
+msgid "display outgoing largefiles"
+msgstr "показать иÑходÑщие большие файлы"
+
+msgid "download all pulled versions of largefiles"
+msgstr "загрузить вÑе затÑнутые верÑии больших файлов"
+
+msgid "download all versions of all largefiles"
+msgstr "загрузить вÑе верÑии вÑех больших файлов"
+
+msgid "manage a stack of patches"
+msgstr "управление Ñтеком патчей"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Это раÑширение позволÑет вам работать Ñо Ñтеком патчей в хранилище\n"
+"Mercurial. Оно управлÑет Ð´Ð²ÑƒÐ¼Ñ Ñтеками патчей: вÑеми извеÑтными патчами\n"
+"и наложенными патчами (подмножеÑтво извеÑтных)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"ИзвеÑтные патчи предÑтавлены в виде файлов в каталоге .hg/patches.\n"
+"Ðаложенные патчи одновременно предÑтавлены в файлах и наборах изменений."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Типичные задачи ( Ñм. также :hg:`help команда`)::"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" Ñоздать новый патч qnew\n"
+" импортировать ÑущеÑтвующий патч qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" напечатать поÑледовательноÑÑ‚ÑŒ патчей qseries\n"
+" напечатать наложенные патчи qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" добавить извеÑтный патч в Ñтек наложенных qpush\n"
+" удалить патч из Ñтека наложенных qpop\n"
+" обновить Ñодержимое верхнего наложенного патча qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"По умолчанию mq автоматичеÑки иÑпользует патчи в формате git, когда\n"
+"Ñто необходимо чтобы предотвратить потерю изменений прав доÑтупа к\n"
+"файлам, запиÑей о копировании, Ñоздание или удаление пуÑÑ‚Ñ‹Ñ… или\n"
+"бинарных файлов. Это поведение может быть наÑтроено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"ЕÑли уÑтановлено в 'keep', mq будет иÑпользовать наÑтройки из Ñекции\n"
+"[diff], ÑохранÑÑ ÑущеÑтвующие патчи в формате git до выполнение qrefresh.\n"
+"ЕÑли уÑтановлено в 'yes' или 'no', mq переопределит наÑтройки Ñекции [diff]\n"
+"и будет вÑегда Ñоздавать патчи ÑоответÑтвенно в формате git или в обычном\n"
+"формате, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ð¹ потерей данных в поÑледнем Ñлучае."
+
+msgid ""
+"It may be desirable for mq changesets to be kept in the secret phase (see\n"
+":hg:`help phases`), which can be enabled with the following setting::"
+msgstr ""
+"ЕÑли вы хотите ÑохранÑÑ‚ÑŒ наборы изменений mq в Ñекретной фазе (Ñм.\n"
+":hg:`help phases`), Ñто может быть Ñделано при помощи Ñледующей наÑтройки::"
+
+msgid ""
+" [mq]\n"
+" secret = True"
+msgstr ""
+" [mq]\n"
+" secret = True"
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command."
+msgstr ""
+"По умолчанию будет Ñоздана очередь патчей Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"patches\". Ð’Ñ‹\n"
+"можете Ñоздавать другие незавиÑимые очереди патчей Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды\n"
+":hg:`qqueue`."
+
+msgid ""
+"If the working directory contains uncommitted files, qpush, qpop and\n"
+"qgoto abort immediately. If -f/--force is used, the changes are\n"
+"discarded. Setting::"
+msgstr ""
+"ЕÑли рабочий каталог Ñодержит незафикÑированные файлы, qpush, apop и\n"
+"qgoto немедленно прерываютÑÑ. ЕÑли укзан -f/--force, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚\n"
+"потерÑны. ÐаÑтройка::"
+
+msgid ""
+" [mq]\n"
+" keepchanges = True"
+msgstr ""
+" [mq]\n"
+" keepchanges = True"
+
+msgid ""
+"make them behave as if --keep-changes were passed, and non-conflicting\n"
+"local changes will be tolerated and preserved. If incompatible options\n"
+"such as -f/--force or --exact are passed, this setting is ignored.\n"
+msgstr ""
+"заÑтавлÑет Ñти команды веÑти ÑÐµÐ±Ñ Ñ‚Ð°Ðº, как будто был указан --keep-changes,\n"
+"при Ñтом локальные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÐµÐ· конфликтов ÑохранÑÑŽÑ‚ÑÑ. ЕÑли указаны\n"
+"неÑовмеÑтимые параметры, такие как -f/--force и --exact, Ñтот параметр\n"
+"игнорируетÑÑ.\n"
+
+msgid "print first line of patch header"
+msgstr "печатать первую Ñтроку заголовка патча"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "неверный формат Ñтроки ÑоÑтоÑÐ½Ð¸Ñ mq: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "параметр mq.git может иметь Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ auto/keep/yes/no, задано %s"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s вÑтречаетÑÑ Ð±Ð¾Ð»ÐµÐµ одного раза в %s"
+
+msgid "guard cannot be an empty string"
+msgstr "Ñтраж не может быть пуÑтой Ñтрокой"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "Ñтраж %r начинаетÑÑ Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимого Ñимвола: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "недопуÑтимый Ñимвол в Ñтраже %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "Ñтраж %r Ñлишком короткий"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "Ñтраж %r начинаетÑÑ Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимого Ñимвола"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "%s разрешен - Ñтраж не задейÑтвуетÑÑ\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "%s разрешен - нет подходÑщих запрещающих Ñтражей\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "%s разрешен - защищен %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "%s пропуÑкаетÑÑ - защищен %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "%s пропуÑкаетÑÑ - нет подходÑщих Ñтражей\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "ошибка при удалении Ñтраховки (undo): %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s ÑохранÑетÑÑ ÐºÐ°Ðº %s\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "не удалоÑÑŒ наложить патч %s"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "патч не Ñработал, Ñливаем %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "update вернул %d"
+
+msgid "repo commit failed"
+msgstr "ошибка при фикÑации хранилища"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "патч %s не ÑущеÑтвует\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "патч %s не наложен\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "не удалоÑÑŒ наложить патч, продолжение невозможно (попробуйте -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "накладываетÑÑ %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "невозможно прочитать %s\n"
+
+msgid "local changes found, refresh first"
+msgstr "найдены локальные изменениÑ, необходимо Ñначала обновитьÑÑ"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "патч %s пуÑÑ‚\n"
+
+msgid "qpush exactly duplicates child changeset"
+msgstr "qpush Ñоздает точную копию дочернего набора изменений"
+
+msgid "repository commit failed"
+msgstr "ошибка при фикÑации хранилища"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+"не удалоÑÑŒ наложить патч, отклоненные файлы Ñохранены в рабочем каталоге\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "обнаружено неÑоответÑтвие контекÑтов (fuzz), оÑтановлено\n"
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s ÑÑылаетÑÑ Ð½Ð° неизвеÑтные патчи: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "неизвеÑтные патчи: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d не контролируетÑÑ"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "невозможно удалить ревизию %d, находÑщуюÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… наложенных патчей"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "патч %s финализирован без ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ðº набору изменений\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete требует ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ ÐºÐ°Ðº минимум одной ревизии или имени патча"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "не могу удалить наложенный патч %s"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "патч %s отÑутÑтвует в файле поÑледовательноÑтей"
+
+msgid "no patches applied"
+msgstr "нет наложенных патчей"
+
+msgid "working directory revision is not qtip"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога не Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ mq (qtip)"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² подхранилище %s"
+
+msgid "local changes found"
+msgstr "найдены локальные изменениÑ"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" не может быть иÑпользовано в качеÑтве имени патча"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ‚Ñ‡Ð° не может начинатьÑÑ Ñ \"%s\""
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" не может иÑпользоватьÑÑ Ð² имени патча"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" уже ÑущеÑтвует в виде каталога"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "патч \"%s\" уже ÑущеÑтвует"
+
+msgid "cannot use both --force and --keep-changes"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ указывать --force и --keep-changes"
+
+msgid "cannot manage merge changesets"
+msgstr "не могу работать Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸ÐµÐ¹ ÑлиÑниÑ"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "невозможно запиÑать патч \"%s\": %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "ошибка при удалении (unlinking) %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ‚Ñ‡Ð° \"%s\" неоднозначно:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "патч %s не в поÑледовательноÑти (series)"
+
+msgid "(working directory not at a head)\n"
+msgstr "(Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога не ÑвлÑетÑÑ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð¹)\n"
+
+msgid "no patches in series\n"
+msgstr "нет патчей в поÑледовательноÑти\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s уже наверху\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "не могу протолкнуть в предыдущий патч: %s"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "защищен %s"
+
+msgid "no matching guards"
+msgstr "нет подходÑщих Ñтражей"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "не могу протолкнуть '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "вÑе патчи в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ñ‹\n"
+
+msgid "patch series already fully applied\n"
+msgstr "поÑледовательноÑÑ‚ÑŒ патчей уже полноÑтью наложена\n"
+
+msgid "cannot use --exact and --keep-changes together"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --exact и --keep-changes одновременно"
+
+msgid "cannot use --exact and --move together"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --exact и --move одновременно"
+
+msgid "cannot push --exact with applied patches"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать push --exact Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ð¼Ð¸ патчами"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s не имеет запиÑанного родителÑ"
+
+msgid "please specify the patch to move"
+msgstr "пожалуйÑта укажите патч Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ"
+
+msgid "cleaning up working directory..."
+msgstr "очиÑтка рабочего каталога..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "ошибка при наложении, пожалуйÑта иÑправьте и обновите %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "теперь на: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "патч %s не наложен"
+
+msgid "no patches applied\n"
+msgstr "нет наложенных патчей\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s уже наверху\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: принудительное обновление dirstate\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "пытаемÑÑ Ð²Ñ‹Ñ‚Ð¾Ð»ÐºÐ½ÑƒÑ‚ÑŒ (pop) неизвеÑтный узел %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr "выталкивание удалит ревизию, не контролируемую Ñтой очередью патчей"
+
+msgid "popping would remove an immutable revision"
+msgstr "выталкивание удалит неизменÑемую ревизию"
+
+msgid "see \"hg help phases\" for details"
+msgstr "подробнее Ñм. \"hg help phases\""
+
+msgid "deletions found between repo revs"
+msgstr "обнаружены ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ревизиÑми хранилища"
+
+#, python-format
+msgid "popping %s\n"
+msgstr "выталкиваетÑÑ %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "очередь патчей теперь пуÑта\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "не могу обновить ревизию Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼Ð¸ ревизиÑми"
+
+msgid "cannot refresh immutable revision"
+msgstr "невозможно обновить неизменÑемую ревизию"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"обновление прервано в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº патч был вытолкнут! (иÑпользуйте\n"
+"revert --all, qpush Ð´Ð»Ñ Ð²Ð¾ÑÑтановлениÑ)\n"
+
+msgid "patch queue directory already exists"
+msgstr "каталог очереди патчей уже ÑущеÑтвует"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "патч %s не в файле поÑледовательноÑтей (series)"
+
+msgid "no saved patch data found\n"
+msgstr "не найдено Ñохраненных данных патча\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "ÑоÑтоÑние воÑÑтановлениÑ: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr "запиÑÑŒ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ (save entry) имеет потомков, не трогаем ее\n"
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr "удаление запиÑи ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ (save entry) %s\n"
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr "родители Ñохраненной очереди в хранилище: %s %s\n"
+
+msgid "updating queue directory\n"
+msgstr "обновление каталога очереди\n"
+
+msgid "unable to load queue repository\n"
+msgstr "невозможно загрузить хранилище очереди\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr "save: нет наложенных патчей, выход\n"
+
+msgid "status is already saved\n"
+msgstr "ÑоÑтоÑние уже Ñохранено\n"
+
+msgid "hg patches saved state"
+msgstr "ÑÑ‚Ð°Ñ‚ÑƒÑ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¹"
+
+msgid "repo commit failed\n"
+msgstr "не удалоÑÑŒ зафикÑировать хранилище\n"
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr "патч %s уже в файле поÑледовательноÑтей (series)"
+
+msgid "option \"-r\" not valid when importing files"
+msgstr "Ð¾Ð¿Ñ†Ð¸Ñ \"-r\" недопуÑтима при импорте файлов"
+
+msgid "no files or revisions specified"
+msgstr "не заданы файлы или ревизии"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr "Ð¾Ð¿Ñ†Ð¸Ñ \"-n\" недопуÑтима при импорте неÑкольких патчей"
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d ÑвлÑетÑÑ ÐºÐ¾Ñ€Ð½ÐµÐ¼ более чем одной ветки"
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d уже контролируетÑÑ"
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d не ÑвлÑетÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой ревизией очереди"
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d имеет неконтролируемые дочерние ревизии"
+
+#, python-format
+msgid "revision %d is not mutable"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d неизменÑема"
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr "невозможно импортировать ревизию ÑлиÑÐ½Ð¸Ñ %d"
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d не родительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d"
+
+msgid "-e is incompatible with import from -"
+msgstr "-e неÑовмеÑтим Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¾Ð¼ из -"
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr "патч %s не ÑущеÑтвует"
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "переименовываетÑÑ %s в %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr "необходимо указать --name чтобы импортировать патч из -"
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "невозможно прочитать файл %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "%s добавлÑетÑÑ Ð² файл поÑледовательноÑтей (series)\n"
+
+msgid "keep patch file"
+msgstr "Ñохранить файл патча"
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr "переÑтать контролировать ревизию (УСТÐРЕЛО)"
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [ПÐТЧ]..."
+
+msgid "remove patches from queue"
+msgstr "удалить патчи из очереди"
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"Exact\n"
+" patch identifiers must be given. With -k/--keep, the patch files are\n"
+" preserved in the patch directory."
+msgstr ""
+" Патчи не должны быть наложенными, и требуетÑÑ Ð¿Ð¾ крайней мере один "
+"патч.\n"
+" Ðужно указывать точные идентификаторы патчей.\n"
+" С -k/--keep патчи ÑохранÑÑŽÑ‚ÑÑ Ð² каталоге патчей."
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+" Чтобы прекратить отÑлеживать патч и перемеÑтить его в хранилище,\n"
+" иÑпользуйте команду :hg:`qfinish`."
+
+msgid "show only the preceding applied patch"
+msgstr "показать только предыдущий наложенный патч"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [ПÐТЧ]"
+
+msgid "print the patches already applied"
+msgstr "напечатать уже наложенные патчи"
+
+msgid " Returns 0 on success."
+msgstr " Ð’ Ñлучае уÑпеха возвращает 0."
+
+msgid "only one patch applied\n"
+msgstr "применен только один патч\n"
+
+msgid "show only the first patch"
+msgstr "показать только первый патч"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [ПÐТЧ]"
+
+msgid "print the patches not yet applied"
+msgstr "напечатать еще не наложенные патчи"
+
+msgid "all patches applied\n"
+msgstr "вÑе патчи наложены\n"
+
+msgid "import file in patch directory"
+msgstr "импортировать файл в каталог патчей"
+
+msgid "NAME"
+msgstr "ИМЯ"
+
+msgid "name of patch file"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° патча"
+
+msgid "overwrite existing files"
+msgstr "перезапиÑывать ÑущеÑтвующие файлы"
+
+msgid "place existing revisions under mq control"
+msgstr "помеÑтить ÑущеÑтвующие ревизии под управление mq"
+
+msgid "use git extended diff format"
+msgstr "иÑпользовать раÑширенный формат git Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹"
+
+msgid "qpush after importing"
+msgstr "выполнить qpush поÑле импортированиÑ"
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
+msgstr "hg qimport [-e] [-n ИМЯ] [-f] [-g] [-P] [-r РЕВ]... [ФÐЙЛ]..."
+
+msgid "import a patch or existing changeset"
+msgstr "импортировать патч или ÑущеÑтвующий набор изменений"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+" Патч помещаетÑÑ Ð² поÑледовательноÑÑ‚ÑŒ поÑле поÑледнего наложенного "
+"патча.\n"
+" ЕÑли наложенных патчей нет, qimport добавлÑет файл в начало\n"
+" поÑледовательноÑти."
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+" Патч будет иметь такое же имÑ, как и файл, из которого он был Ñоздан,\n"
+" еÑли только вы не укажите новое Ð¸Ð¼Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -n/--name."
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+" Ð’Ñ‹ можете зарегиÑтрировать патч, уже находÑщийÑÑ Ð² каталоге патчей,\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ флага -e/--existing."
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+" ЕÑли указан -f/--force, ÑущеÑтвующий патч Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем будет\n"
+" перезапиÑан."
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+" СущеÑтвующий набор изменений может быть помещен под контроль mq\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r/--rev (Ñ‚.е. qimport --rev tip -n patch помеÑтит\n"
+" оконечную ревизию под контроль mq). С -g/--git патчи, импортированные\n"
+" Ñ --rev, будут иÑпользовать формат git. О том, почему Ñто важно\n"
+" Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о копировании/переименовании и правах "
+"доÑтупа,\n"
+" Ñм. ÑоответÑтвующий раздел Ñправки о различиÑÑ… (diffs). ИÑпользуйте\n"
+" :hg:`qfinish` чтобы изъÑÑ‚ÑŒ наборы изменений из-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ mq."
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+" Чтобы импортировать патч из Ñтандартного ввода, передайте - в\n"
+" качеÑтве имени файла патча. При импорте из Ñтандартного ввода имÑ\n"
+" патча должно быть задано Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ флага --name."
+
+msgid " To import an existing patch while renaming it::"
+msgstr " Импортировать ÑущеÑтвующий патч Ñ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼::"
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr " hg qimport -e ÑущеÑтвующий-патч -n новое-имÑ"
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Возвращает 0, еÑли импорт завершен уÑпешно.\n"
+" "
+
+msgid "create queue repository"
+msgstr "Ñоздать хранилище очереди"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr "инициализирует новое хранилище очереди (УСТÐРЕЛО)"
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" По умолчанию хранилище очереди не помещаетÑÑ Ð¿Ð¾Ð´ контроль верÑий.\n"
+" ЕÑли указан -c/--create-repo, qinit ÑоздаÑÑ‚ отдельный вложенный\n"
+" хранилище Ð´Ð»Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¹ (можно также запуÑтить qinit -c позже, чтобы\n"
+" преобразовать неверÑионируемое хранилище патчей в верÑионируемое.\n"
+" Ð’Ñ‹ можете иÑпользовать qcommit чтобы зафикÑировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом\n"
+" хранилище очереди."
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+" Эта команда уÑтарела. Без -c она неÑвно подразумеваетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸\n"
+" командами mq. С -c, иÑпользуйте вмеÑто нее :hg:`init --mq`."
+
+msgid "use pull protocol to copy metadata"
+msgstr "иÑпользовать протокол затÑÐ³Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð°Ð´Ð°Ð½Ð½Ñ‹Ñ…"
+
+msgid "do not update the new working directories"
+msgstr "не обновлÑÑ‚ÑŒ новые рабочие каталоги"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "не иÑпользовать Ñжатие при передачи (быÑтрее в локальной Ñети)"
+
+msgid "REPO"
+msgstr "ХРÐÐИЛИЩЕ"
+
+msgid "location of source patch repository"
+msgstr "раÑположение иÑходного хранилища патчей"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [ПÐРÐМЕТР]... ИСТОЧÐИК [ÐÐЗÐ]"
+
+msgid "clone main and patch repository at same time"
+msgstr "клонировать оÑновное хранилище вмеÑте Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ патчей"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+" ЕÑли иÑточник локален, хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ будет иметь\n"
+" наложенных патчей. ЕÑли иÑточник ÑвлÑетÑÑ Ð¾Ñ‚Ð´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ð¼, Ñта команда\n"
+" не может проверить, наложены ли патчи в хранилище-иÑточнике,\n"
+" и поÑтому не может гарантировать, что в хранилище назначениÑ\n"
+" Ñти патчи не наложены. ЕÑли вы клонируете отдалённое хранилище,\n"
+" Ñперва убедитеÑÑŒ, что в нем нет наложенных патчей."
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+" Ð’ хранилище-иÑточнике патчи ищутÑÑ Ð¿Ð¾ умолчанию в\n"
+" <иÑточник>/.hg/patches. ИÑпользуйте -p <url> чтобы задать другой путь."
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+" Каталог патчей должен быть вложенным хранилищем Mercurial,\n"
+" подобным Ñозданному Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`init --mq`."
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Ð’ Ñлучае уÑпеха возвращает 0.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "верÑионируемое хранилище патчей не найдено (Ñм. init --mq)"
+
+msgid "cloning main repository\n"
+msgstr "клонирование оÑновного хранилища\n"
+
+msgid "cloning patch repository\n"
+msgstr "клонирование хранилища патчей\n"
+
+msgid "stripping applied patches from destination repository\n"
+msgstr "ÑрезаютÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ðµ патчи из хранилища назначениÑ\n"
+
+msgid "updating destination repository\n"
+msgstr "обновление хранилища назначениÑ\n"
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr "зафикÑировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище очереди (УСТÐРЕЛО)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr " Эта команда уÑтарела; иÑпользуйте :hg:`commit --mq`."
+
+msgid "print patches not in series"
+msgstr "напечатать патчи, не входÑщие в поÑледовательноÑÑ‚ÑŒ"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "напечатать веÑÑŒ файл поÑледовательноÑтей"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "напечатать Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ патча"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+# NOT-SURE
+msgid "print the name of the next pushable patch"
+msgstr "напечатать Ð¸Ð¼Ñ Ñледующего вталкиваемого патча"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the preceding applied patch"
+msgstr "напечатать Ð¸Ð¼Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ³Ð¾ наложенного патча"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "импортировать незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "добавить \"From: <текущий пользователь>\" к патчу"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "добавить \"From: <ПОЛЬЗОВÐТЕЛЬ>\" к патчу"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "добавить \"Date: <Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð°>\" к патчу"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "добавить \"Date: <ДÐТÐ>\" к патчу"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m ТЕКСТ] [-l ФÐЙЛ] ПÐТЧ [ФÐЙЛ]..."
+
+msgid "create a new patch"
+msgstr "Ñоздать новый патч"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew Ñоздает новый патч поверх текущего наложенного патча (еÑли таковой\n"
+" имеетÑÑ). Этот патч будет инициализирован незафикÑированными\n"
+" изменениÑми в рабочем каталоге. Ð’Ñ‹ можете также иÑпользовать -I/--"
+"include,\n"
+" -X/--exclude и/или ÑпиÑок ÑпиÑок файлов поÑле имени патча, чтобы\n"
+" добавить в патч только Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑоответÑтвующих файлах, ÑчитаÑ\n"
+" оÑтальные незафикÑированными изменениÑми."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" Можно иÑпользовать -u/--user и -d/--date, чтобы уÑтановить (указанного)\n"
+" Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ дату ÑоответÑтвенно. -U/--currentuser и -D/--currentdate\n"
+" уÑтанавливают Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² текущего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ дату в текущую дату."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message или -l/--logfile задают заголовок патча "
+"аналогично Ñообщению фикÑации. ЕÑли ни один из них не задан,\n"
+" заголовок оÑтаетÑÑ Ð¿ÑƒÑтым, а Ñообщение фикÑации будет '[mq]: ПÐТЧ'."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" ИÑпользуйте параметр -g/--git, чтобы Ñохранить патч в раÑширенном\n"
+" формате git. О том, почему Ñто важно Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ о \n"
+" копировании/переименовании и правах доÑтупа, Ñм. ÑоответÑтвующий раздел\n"
+" Ñправки о различиÑÑ… (diffs)."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" При уÑпешном Ñоздании патча возвращает 0.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "обновить только файлы, уже включенные в патч, и указанные файлы"
+
+msgid "add/update author field in patch with current user"
+msgstr "добавить/обновить поле патча author, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ пользователÑ"
+
+msgid "add/update author field in patch with given user"
+msgstr "добавить/обновить поле патча author, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ пользователÑ"
+
+msgid "add/update date field in patch with current date"
+msgstr "добавить/обновить поле патча date, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ‚ÐµÐºÑƒÑ‰ÑƒÑŽ дату"
+
+msgid "add/update date field in patch with given date"
+msgstr "добавить/обновить поле патча date, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑƒÑŽ дату"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m ТЕКСТ] [-l ФÐЙЛ] [-s] [ФÐЙЛ]..."
+
+msgid "update the current patch"
+msgstr "обновить текущий патч"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" ЕÑли заданы только шаблоны файлов, обновленный патч будет\n"
+" Ñодержать только изменениÑ, Ñовпадающие Ñ Ñтими шаблонами;\n"
+" оÑтальные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑтанутÑÑ Ð² рабочем каталоге."
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+" ЕÑли указан -s/--short, файлы, входÑщие на данный момент в патч,\n"
+" будут обновлены так же, как Ñовпавшие Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼ файлы, и будут\n"
+" оÑтавлены в ÑоÑтаве патча."
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+" ЕÑли задан -e/--edit, Mercurial запуÑтит наÑтроенный вами редактор,\n"
+" чтобы вы могли ввеÑти Ñообщение фикÑации. ЕÑли qrefresh завершитÑÑ\n"
+" аварийно, вы найдете резервную копию вашего ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²\n"
+" ``.hg/last-message.txt``."
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+" Команды add/remove/copy/rename работают как обычно, Ñ…Ð¾Ñ‚Ñ Ð²Ð°Ð¼, возможно,\n"
+" захочетÑÑ Ð¸Ñпользовать патчи в Ñтиле git (-g/--git или [diff] git=1)\n"
+" Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ð¹ и переименований. См. раздел "
+"ÑоответÑтвующий\n"
+" раздел Ñправки (diffs) Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации о формате различий\n"
+" в Ñтиле git."
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr "параметр \"-e\" неÑовмеÑтим Ñ \"-m\" или \"-l\""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr "hg qdiff [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr "Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ текущим патчем и поÑледующими модификациÑми"
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" Показывает различиÑ, которые включают текущий патч, а также вÑе\n"
+" изменениÑ, Ñделанные в рабочем каталоге поÑле поÑледнего qrefresh\n"
+" (Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°Ñ Ñ‚Ð°ÐºÐ¸Ð¼ образом, чем Ñтанет Ñтот патч поÑле qrefresh)"
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+" ИÑпользуйте :hg:`diff`, еÑли вы хотите поÑмотреть только изменениÑ,\n"
+" Ñделанные поÑле поÑледнего qrefresh, или :hg:`export qtip`, еÑли\n"
+" вы хотите поÑмотреть изменениÑ, Ñделанные текущим патчем, не включаÑ\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле поÑледнего qrefresh."
+
+msgid "edit patch header"
+msgstr "редактировать заголовок патча"
+
+msgid "keep folded patch files"
+msgstr "оÑтавить подшитые файлы патчей"
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m ТЕКСТ] [-l ФÐЙЛ] ПÐТЧ..."
+
+msgid "fold the named patches into the current patch"
+msgstr "подшить перечиÑленные патчи к текущему патчу"
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+" Патчи не должны быть наложены. Каждый патч будет поÑледовательно "
+"наложен\n"
+" на текущий патч в заданном порÑдке. ЕÑли патчи уÑпешно наложилиÑÑŒ,\n"
+" текущий патч будет обновлен (refreshed) Ñ Ð½Ð¾Ð²Ñ‹Ð¼ Ñовокупным патчем,\n"
+" а подшитые патчи будут удалены. С -k/--keep, подшитые файлы патчей\n"
+" не будут поÑле Ñтого удалены."
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+" Заголовок каждого подшитого патча будет объединен Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼\n"
+" текущего патча, отделенным Ñтрокой ``* * *``."
+
+msgid "qfold requires at least one patch name"
+msgstr "qfold требует указать Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно Ð¸Ð¼Ñ Ð¿Ð°Ñ‚Ñ‡Ð°"
+
+#, python-format
+msgid "skipping already folded patch %s\n"
+msgstr "пропуÑкаетÑÑ ÑƒÐ¶Ðµ подшитый патч %s\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr "qfold не может подшить уже наложенный патч %s"
+
+#, python-format
+msgid "error folding patch %s"
+msgstr "ошибка при подшивке патча %s"
+
+msgid "tolerate non-conflicting local changes"
+msgstr "допуÑкать неконфликтующие локальные изменениÑ"
+
+msgid "overwrite any local changes"
+msgstr "перезапиÑывать вÑе локальные изменениÑ"
+
+msgid "do not save backup copies of files"
+msgstr "не ÑохранÑÑ‚ÑŒ резервные копии файлов"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr "hg qgoto [ПÐРÐМЕТР]... ПÐТЧ"
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+"вталкивать или выталкивать патчи, пока указанный патч не окажетÑÑ Ð½Ð° вершине "
+"Ñтека"
+
+msgid "list all patches and guards"
+msgstr "перечиÑлить вÑе патчи и Ñтражей"
+
+msgid "drop all guards"
+msgstr "удалить вÑех Ñтражей"
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr "hg qguard [-l] [-n] [ПÐТЧ] [-- [+СТРÐЖ]... [-СТРÐЖ]...]"
+
+msgid "set or print guards for a patch"
+msgstr "уÑтановить или напечатать Ñтражей Ð´Ð»Ñ Ð¿Ð°Ñ‚Ñ‡Ð°"
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+" Стражи (guards) контролируют, можно ли протолкнуть (в Ñтек) данный "
+"патч.\n"
+" Патч без Ñтражей проталкиваетÑÑ Ð²Ñегда. Патч Ñ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ Ñтражем\n"
+" (\"+foo\") проталкиваетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли он был активирован командой\n"
+" :hg:`qselect`. Патч Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ Ñтражем (\"-foo\") никогда не\n"
+" проталкиваетÑÑ, еÑли он был активирован командой :hg:`qselect`."
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+" Без аргументов печатает активных в данный момент Ñтражей.\n"
+" С аргументами уÑтанавливает Ñтражей Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ патча."
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+" .. note::\n"
+" задание отрицательного Ñтража теперь требует '--'."
+
+msgid " To set guards on another patch::"
+msgstr " УÑтановить Ñтражей Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð³Ð¾ патча::"
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr " hg qguard другой.patch -- +2.6.17 -stable"
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ -l/--list Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ параметрами или аргументами"
+
+msgid "no patch to work with"
+msgstr "нет патча Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹"
+
+#, python-format
+msgid "no patch named %s"
+msgstr "нет патча Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ %s"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [ПÐТЧ]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr "напечатать заголовок верхнего или указанного патча"
+
+msgid "apply on top of local changes"
+msgstr "наложить поверх локальных изменений"
+
+msgid "apply the target patch to its recorded parent"
+msgstr "наложить целевой патч на его запиÑанного родителÑ"
+
+msgid "list patch name in commit text"
+msgstr "включить Ð¸Ð¼Ñ Ð¿Ð°Ñ‚Ñ‡Ð° в Ñообщение фикÑации"
+
+msgid "apply all patches"
+msgstr "наложить вÑе патчи"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr "Ñлить из другой очереди (УСТÐРЕЛО)"
+
+msgid "merge queue name (DEPRECATED)"
+msgstr "Ð¸Ð¼Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸ ÑлиÑÐ½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "reorder patch series and apply only the patch"
+msgstr ""
+"переупорÑдочить поÑледовательноÑÑ‚ÑŒ патчей и наложить только данный патч"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [ПÐТЧ | ИÐДЕКС]"
+
+# MAYBE: помеÑтить (добавить) Ñледующий патч в Ñтек
+msgid "push the next patch onto the stack"
+msgstr "протолкнуть Ñледующий патч в Ñтек"
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and patch over\n"
+" uncommitted changes."
+msgstr ""
+" По умолчанию выполнение прерываетÑÑ, еÑли в рабочем каталоге еÑÑ‚ÑŒ\n"
+" назафикÑированные изменениÑ. С --keep-changes прерываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+" еÑли незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÑекаютÑÑ Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸, на которые\n"
+" накладываетÑÑ Ð¿Ð°Ñ‚Ñ‡. C -f/--force ÑоздаетÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¸ патч\n"
+" накладываетÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… незафикÑированных изменений."
+
+msgid "no saved queues found, please use -n\n"
+msgstr "не найдено Ñохраненных очередей, пожалуйÑта иÑпользуйте -n\n"
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "ÑлиÑние Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒÑŽ: %s\n"
+
+msgid "pop all patches"
+msgstr "вытолкнуть вÑе патчи"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "Ð¸Ð¼Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸ Ð´Ð»Ñ Ð²Ñ‹Ñ‚Ð°Ð»ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "forget any local changes to patched files"
+msgstr ""
+"затереть вÑе локальный Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файлах, на которые накладываетÑÑ Ð¿Ð°Ñ‚Ñ‡"
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qapplied [-1] [-s] [ПÐТЧ | ИÐДЕКС]"
+
+msgid "pop the current patch off the stack"
+msgstr "вытолкнуть текущий патч из Ñтека"
+
+msgid ""
+" Without argument, pops off the top of the patch stack. If given a\n"
+" patch name, keeps popping off patches until the named patch is at\n"
+" the top of the stack."
+msgstr ""
+" Без аргументов выталкивает вершину Ñтека патчей. ЕÑли указано имÑ\n"
+" патча, продолжает выталкивать патчи до тех пор, пока указанный патч\n"
+" не окажетÑÑ Ð½Ð° вершине."
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and discard\n"
+" changes made to such files."
+msgstr ""
+" По умолчанию выполнение прерываетÑÑ, еÑли в рабочем каталоге имеютÑÑ\n"
+" незафикÑированные изменениÑ. С --keep-changes прерываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+" еÑли незафикÑированные файлы переÑекаютÑÑ Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸, на которые\n"
+" накладываетÑÑ Ð¿Ð°Ñ‚Ñ‡. С -f/--force ÑоздаетÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð¸ вÑе\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² таких файлах отменÑÑŽÑ‚ÑÑ."
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr "иÑпользуетÑÑ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒ патчей: %s\n"
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr "hg qrename ПÐТЧ1 [ПÐТЧ2]"
+
+msgid "rename a patch"
+msgstr "переименовать патч"
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+" С одним аргументом переименовывает текущий патч в ПÐТЧ1.\n"
+" С Ð´Ð²ÑƒÐ¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ переименовывает ПÐТЧ1 в ПÐТЧ2."
+
+msgid "delete save entry"
+msgstr "удалить запиÑÑŒ ÑохранениÑ"
+
+msgid "update queue working directory"
+msgstr "обновить рабочий каталог очереди"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr "hg qrestore [-d] [-u] РЕВ"
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr "воÑÑтановить ÑоÑтоÑние очереди, Ñохраненное в ревизии (УСТÐРЕЛО)"
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " Эта команда уÑтарела, иÑпользуйте :hg:`rebase`."
+
+msgid "copy patch directory"
+msgstr "копировать каталог патчей"
+
+msgid "copy directory name"
+msgstr "копировать Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°"
+
+msgid "clear queue status file"
+msgstr "очиÑтить файл ÑоÑтоÑÐ½Ð¸Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸"
+
+msgid "force copy"
+msgstr "копировать принудительно"
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr "hg qsave [-m ТЕКСТ] [-l ФÐЙЛ] [-c] [-n ИМЯ] [-e] [-f]"
+
+msgid "save current queue state (DEPRECATED)"
+msgstr "Ñохранить текущее ÑоÑтоÑние очереди (УСТÐРЕЛО)"
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr "цель %s ÑущеÑтвует и не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼"
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr "цель %s ÑущеÑтвует, иÑпользуйте -f Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÑохранениÑ"
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr "копирование %s в %s\n"
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+"Ñрезать указанную ревизию (необÑзательный, можно задать ревизии и без Ñтого "
+"параметра"
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+"принудительно изъÑÑ‚ÑŒ наборы изменений, отброÑить незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ "
+"(без резервной копии)."
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+"укомплектовать только наборы изменений Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ номерами ревизий "
+"большими, чем РЕВ, и не ÑвлÑющимиÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°Ð¼Ð¸ РЕВизии (УСТÐРЕЛО)"
+
+msgid "no backups"
+msgstr "без резервного копированиÑ"
+
+msgid "no backups (DEPRECATED)"
+msgstr "без резервного ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "ignored (DEPRECATED)"
+msgstr "игнорируетÑÑ (УСТÐРЕЛО)"
+
+msgid "do not modify working copy during strip"
+msgstr "не изменÑÑ‚ÑŒ рабочую копию во во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ strip"
+
+msgid "remove revs only reachable from given bookmark"
+msgstr "удалить ревизии, доÑтупные только через указанную закладку"
+
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
+msgstr "hg strip [-k] [-f] [-n] [-B закладка] [-r] РЕВИЗИЯ..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr "Ñрезать наборы изменений и вÑех их потомков из хранилища"
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+" Команда strip удалÑет указанные наборы изменений и вÑех их потомков.\n"
+" ЕÑли рабочий каталог имеет незафикÑированные изменениÑ, операциÑ\n"
+" отменÑетÑÑ, еÑли только не указан флаг --force, в Ñлучае чего\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ отброшены."
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+" ЕÑли ÑрезаетÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒ рабочего каталога, то рабочий каталог\n"
+" будет автоматичеÑки обновлен на Ñамого позднего предка\n"
+" Ñрезаемого Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾Ñле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸."
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+" Ð’Ñе Ñрезанные наборы изменений ÑохранÑÑŽÑ‚ÑÑ Ð² ``.hg/strip-backup``\n"
+" в виде комплекта (Ñм. :hg:`help bundle` и :hg:`help unbundle`). Они\n"
+" могут быть воÑÑтановлены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`unbundle .hg/strip-backup/"
+"КОМПЛЕКТ`,\n"
+" где КОМПЛЕКТ - Ñто Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° комплекта, Ñозданного при Ñрезании.\n"
+" Обратите внимание, что локальные номера ревизий в общем Ñлучае будут\n"
+" отличатьÑÑ Ð¿Ð¾Ñле воÑÑтановлениÑ."
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+" ИÑпользуйте параметр --no-backup чтобы удалить комплект резервного\n"
+" воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñразу поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸."
+
+msgid ""
+" Strip is not a history-rewriting operation and can be used on\n"
+" changesets in the public phase. But if the stripped changesets have\n"
+" been pushed to a remote repository you will likely pull them again."
+msgstr ""
+" Strip не изменÑет иÑторию, поÑтому может быть иÑпользована на наборах\n"
+" изменений в публичной фазе. Ðо еÑли вырезанный набор изменений\n"
+" был запиÑан в отдаленное хранилище, Ñкорее вÑего вы затÑните его Ñнова."
+
+#, python-format
+msgid "bookmark '%s' not found"
+msgstr "закладка '%s' не найдена"
+
+#, python-format
+msgid "bookmark '%s' deleted\n"
+msgstr "закладк '%s' удалена\n"
+
+msgid "empty revision set"
+msgstr "пуÑтой набор ревизий"
+
+msgid "disable all guards"
+msgstr "отключить вÑех Ñтражей"
+
+msgid "list all guards in series file"
+msgstr "перечиÑлить вÑех Ñтражей в файле поÑледовательноÑтей"
+
+msgid "pop to before first guarded applied patch"
+msgstr "вытолкнуть из Ñтека до первого защищенного Ñтражем наложенного патча"
+
+msgid "pop, then reapply patches"
+msgstr "вытолкнуть, затем Ñнова наложить патчи"
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr "hg qselect [ПÐРÐМЕТР]... [СТРÐЖ]..."
+
+msgid "set or print guarded patches to push"
+msgstr "задать или напечатать защищенные патчи Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² Ñтек"
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+" ИÑпользуйте команду :hg:`qguard` чтобы задать или напечатать Ñтражей\n"
+" патча, поÑле Ñтого иÑпользуйте qselect чтобы указать mq, каких Ñтражей\n"
+" иÑпользовать. Патч будет помещен в Ñтек, еÑли у него Ñтражей или\n"
+" любой из положительных Ñтражей Ñовпадает Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¼ на данный момент\n"
+" Ñтражем, но не будет помещен в Ñтек, еÑли Ñовпадет любой отрицательный\n"
+" Ñтраж."
+
+# BUG: line breaks not preserved in Russian
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+" qguard foo.patch -- -stable (отрицательный Ñтраж)\n"
+" qguard bar.patch +stable (положительный Ñтраж)\n"
+" qselect stable"
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+" Это активирует Ñтраж \"stable\". mq пропуÑтит foo.patch\n"
+" (Ñовпадает отрицательный Ñтраж), но помеÑтит в Ñтек bar.patch \n"
+" (Ñовпадает положительный Ñтраж)"
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+" Без аргументов печатает активных в данный момент Ñтражей.\n"
+" С одним аргументом задает активного Ñтража."
+
+# MAYBE BUG: а не наоборот?
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+" ИÑпользуйте -n/--none чтобы деактивировать Ñтражей (не требуетÑÑ\n"
+" дополнительных аргументов). ЕÑли активных Ñтражей нет, патчи Ñ\n"
+" положительными Ñтражами пропуÑкаютÑÑ, а патчи Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸\n"
+" Ñтражами помещаютÑÑ Ð² Ñтек"
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+" qselect может менÑÑ‚ÑŒ Ñтражей на наложенных патчах. По умолчанию\n"
+" он не выталкивает защищенные патчи из Ñтека. ИÑпользуйте --pop чтобы\n"
+" вытолкнуть патчи вплоть до поÑледнего наложенного патча без Ñтражей.\n"
+" ИÑпользуйте --reapply (который подразумевает --pop) чтобы втолкнуть\n"
+" поÑле Ñтого вÑе патчи вплоть до текущего, пропуÑÐºÐ°Ñ Ð¿Ñ€Ð¸ Ñтом патчи\n"
+" Ñо Ñтражами."
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+" ИÑпользуйте -s/--series чтобы напечатать ÑпиÑок вÑех Ñтражей в файле\n"
+" поÑледовательноÑтей (других аргументов не требуетÑÑ). Чтобы вывеÑти\n"
+" дополнительную информацию, иÑпользуйте -v."
+
+msgid "guards deactivated\n"
+msgstr "Ñтражи деактивированы\n"
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr "количеÑтво незащищённых неналоженных патчей изменилоÑÑŒ c %d на %d\n"
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr "количеÑтво незащищённых наложенных патчей изменилоÑÑŒ c %d на %d\n"
+
+msgid "guards in series file:\n"
+msgstr "Ñтражей в файле поÑледовательноÑтей:\n"
+
+msgid "no guards in series file\n"
+msgstr "нет Ñтражей в файле поÑледовательноÑтей\n"
+
+msgid "active guards:\n"
+msgstr "активные Ñтражи:\n"
+
+msgid "no active guards\n"
+msgstr "нет активных Ñтражей\n"
+
+msgid "popping guarded patches\n"
+msgstr "выталкиваем защищенные патчи\n"
+
+msgid "reapplying unguarded patches\n"
+msgstr "заново накладываем незащищённые патчи\n"
+
+msgid "finish all applied changesets"
+msgstr "финализировать вÑе наложенные патчи"
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [РЕВ]..."
+
+msgid "move applied patches into repository history"
+msgstr "перемеÑтить наложенные патчи в иÑторию хранилища"
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+" Финализирует указанные ревизии (ÑоответÑтвующие наложенным патчам)\n"
+" путем Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸Ñ… из-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ mq в иÑторию обычного\n"
+" хранилища."
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+" Принимает диапазон ревизий или параметр -a/--applied. ЕÑли указан\n"
+" --applied, вÑе наложенные ревизии mq изымаютÑÑ Ð¸Ð·-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ mq.\n"
+" Ð’ противном Ñлучае указанные ревизии должны быть в оÑновании Ñтека\n"
+" примененных патчей."
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+" Это может быть оÑобенно полезным, еÑли ваши Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ наложены\n"
+" в вышеÑтоÑщем (upstream) хранилище, или вы как раз ÑобираетеÑÑŒ\n"
+" протолкнуть туда ваши изменениÑ."
+
+msgid "no revisions specified"
+msgstr "ревизии не заданы"
+
+msgid "warning: uncommitted changes in the working directory\n"
+msgstr "внимание: незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² рабочем каталоге\n"
+
+msgid "list all available queues"
+msgstr "перечиÑлить вÑе доÑтупные очереди"
+
+msgid "print name of active queue"
+msgstr "напечатать Ð¸Ð¼Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ очереди"
+
+msgid "create new queue"
+msgstr "Ñоздать новую очередь"
+
+msgid "rename active queue"
+msgstr "переименовать активную очередь"
+
+msgid "delete reference to queue"
+msgstr "удалить ÑÑылку на очередь"
+
+msgid "delete queue, and remove patch dir"
+msgstr "удалить очередь и удалить каталог патчей"
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[ПÐРÐМЕТР] [ОЧЕРЕДЬ]"
+
+msgid "manage multiple patch queues"
+msgstr "управление неÑколькими очередÑми патчей"
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+" Поддерживает переключение между различными очередÑми патчей, а также\n"
+" Ñоздание новых очередей и удаление ÑущеÑтвующих."
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+" only the name of the active queue."
+msgstr ""
+" ЕÑли Ð¸Ð¼Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸ опущено или указан -l/--list, показывает\n"
+" зарегиÑтрированные очереди - по умолчанию зарегиÑтрирована очередь\n"
+" \"normal\". ÐÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð² наÑтоÑщий момент очередь будет помечена\n"
+" \"(активна)\". С флагом --active напечатает только Ð¸Ð¼Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ очереди."
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+" Чтобы Ñоздать новую очередь, иÑпользуйте -c/--create. Очередь\n"
+" автоматичеÑки делаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹, за иÑключением ÑлучаÑ, когда в\n"
+" хранилище еÑÑ‚ÑŒ наложенные патчи из текущей активной очереди. Тогда\n"
+" очередь будет только Ñоздана, а переключение завершитÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹."
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+" Чтобы удалить ÑущеÑтвующую очередь, иÑпользуйте --delete. ÐельзÑ\n"
+" удалить текущую активную очередь."
+
+msgid "patches applied - cannot set new queue active"
+msgstr "патчи наложены - невозможно Ñделать новую очередь активной"
+
+msgid "cannot delete queue that does not exist"
+msgstr "невозможно удалить неÑущеÑтвующую очередь"
+
+msgid "cannot delete currently active queue"
+msgstr "невозможно удалить текущую активную очередь"
+
+msgid " (active)\n"
+msgstr " (активна)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr "неверное Ð¸Ð¼Ñ Ð¾Ñ‡ÐµÑ€ÐµÐ´Ð¸, Ñимволы \":\\/.\" недопуÑтимы"
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "очередь \"%s\" уже ÑущеÑтвует"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr "не могу переименовать \"%s\" в ее текущее имÑ"
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr "каталог, не Ñодержащий очереди, \"%s\" уже ÑущеÑтвует"
+
+msgid "use --create to create a new queue"
+msgstr "иÑпользуйте --create чтобы Ñоздать новую очередь"
+
+msgid "cannot commit over an applied mq patch"
+msgstr "не могу зафикÑировать поверх наложенного патч mq"
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr "файл ÑоÑтоÑÐ½Ð¸Ñ mq ÑÑылаетÑÑ Ð½Ð° неизвеÑтный узел %s\n"
+
+#, python-format
+msgid "tag %s overrides mq patch of the same name\n"
+msgstr "метка %s подменÑет патч mq Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем\n"
+
+msgid "cannot import over an applied patch"
+msgstr "невозможно импортировать поверх наложенного патча"
+
+msgid "only a local queue repository may be initialized"
+msgstr "можно инициализировать только локальное хранилище очереди"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "здеÑÑŒ нет хранилища Mercurial (.hg не найден)"
+
+msgid "no queue repository"
+msgstr "нет хранилища очереди"
+
+#, python-format
+msgid "%d applied"
+msgstr "%d наложено"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d неналожено"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (очередь пуÑта)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+" Ðаборы изменений, контролируемые MQ."
+
+msgid "mq takes no arguments"
+msgstr "mq не требует аргументов"
+
+msgid "operate on patch repository"
+msgstr "работать Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ патчей mq"
+
+msgid "hooks for sending email push notifications"
+msgstr "хуки Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ уведомлений о новых изменениÑÑ… по email"
+
+msgid ""
+"This extension implements hooks to send email notifications when\n"
+"changesets are sent from or received by the local repository."
+msgstr ""
+"Это раÑширение реализует хуки, отправлÑющие уведомлениÑ\n"
+"по email, когда наборы изменений проталкиваютÑÑ Ð¸Ð»Ð¸ затÑгиваютÑÑ\n"
+"или получающей Ñтороны."
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
+"are run when changesets are received, while ``outgoing`` hooks are for\n"
+"changesets sent to another repository::"
+msgstr ""
+"Первым делом, включите раÑширение, как Ñто опиÑано в :hg:`help extensions`\n"
+"и зарегиÑтрируйте хук, который вы желаете запуÑкать. При получении,\n"
+"изменений, выполнÑÑŽÑ‚ÑÑ Ñ…ÑƒÐºÐ¸ ``incoming`` и ``changegroup``,\n"
+"в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº ``outgoing`` вызываетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°ÐµÐ¼Ñ‹Ñ… в другое хранилище\n"
+"наборов изменений::"
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+" [hooks]\n"
+" # один email Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ входÑщего набора изменений\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # один email Ð´Ð»Ñ Ð²Ñех входÑщих наборов изменений\n"
+" changegroup.notify = python:hgext.notify.hook"
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+" # один email Ð´Ð»Ñ Ð²Ñех иÑходÑщих наборов изменений\n"
+" outgoing.notify = python:hgext.notify.hook"
+
+msgid ""
+"This registers the hooks. To enable notification, subscribers must\n"
+"be assigned to repositories. The ``[usersubs]`` section maps multiple\n"
+"repositories to a given recipient. The ``[reposubs]`` section maps\n"
+"multiple recipients to a single repository::"
+msgstr ""
+"Таким образом хуки зарегиÑтрированы. Чтобы включить уведомлениÑ,\n"
+"подпиÑчики должны быть ÑвÑзаны Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°Ð¼Ð¸. Ð¡ÐµÐºÑ†Ð¸Ñ ``[usersubs]``\n"
+"ÑвÑзывает неÑколько хранилищ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ получателем. Ð¡ÐµÐºÑ†Ð¸Ñ ``[reposubs]``\n"
+"ÑвÑзывает неÑколько получателей Ñ Ð¾Ð´Ð½Ð¸Ð¼ хранилищем::"
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of repo glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+" [usersubs]\n"
+" # ключ - email подпиÑчика, значение - разделенный запÑтыми ÑпиÑок "
+"шаблонов\n"
+" # в Ñтиле glob (glob patterns)\n"
+" пользователь@хоÑÑ‚ = шаблон"
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+" [reposubs]\n"
+" # ключ - шаблон в Ñтиле glob, значение - разделенный запÑтыми ÑпиÑок\n"
+" # email-адреÑов\n"
+" шаблон = пользователь@хоÑÑ‚"
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root."
+msgstr "Шаблоны ÑопоÑтавлÑÑŽÑ‚ÑÑ Ñ Ð°Ð±Ñолютными путÑми к корню хранилища."
+
+msgid ""
+"In order to place them under direct user management, ``[usersubs]`` and\n"
+"``[reposubs]`` sections may be placed in a separate ``hgrc`` file and\n"
+"incorporated by reference::"
+msgstr ""
+"Секции ``[reposubs]`` и ``[usersubs]`` могут быть помещены в отдельный файл\n"
+"конфигурации (hgrc), Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы пользователь мог Ñвно управлÑÑ‚ÑŒ ими, и\n"
+"могут подключатьÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑÑылки:"
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+" [notify]\n"
+" config = /путь/к/файлу/подпиÑок"
+
+msgid ""
+"Notifications will not be sent until the ``notify.test`` value is set\n"
+"to ``False``; see below."
+msgstr ""
+"Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ðµ будут отправлÑÑ‚ÑŒÑÑ Ð´Ð¾ тех пор, пока вы не уÑтановите\n"
+" ``notify.test`` в ``False``; Ñм. далее."
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+"Содержимое уведомлений может быть наÑтроено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñледующих параметров:"
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+"notify.test\n"
+" ЕÑли ``True`` (ИÑтина), печатать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Ñтандартный вывод вмеÑто\n"
+" их отправки. По умолчанию: True."
+
+msgid ""
+"notify.sources\n"
+" Space-separated list of change sources. Notifications are activated only\n"
+" when a changeset's source is in this list. Sources may be:"
+msgstr ""
+"notify.sources\n"
+" Разделенный пробелами ÑпиÑок иÑточников изменений. Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ "
+"активируютÑÑ\n"
+" только когда иÑточник набора изменений находитÑÑ Ð² Ñтом ÑпиÑке.\n"
+" ИÑточником могут быть:"
+
+msgid ""
+" :``serve``: changesets received via http or ssh\n"
+" :``pull``: changesets received via ``hg pull``\n"
+" :``unbundle``: changesets received via ``hg unbundle``\n"
+" :``push``: changesets sent or received via ``hg push``\n"
+" :``bundle``: changesets sent via ``hg unbundle``"
+msgstr ""
+" :``serve``: наборы изменений, полученные по http или ssh\n"
+" :``pull``: наборы изменений, полученные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ``hg pull``\n"
+" :``unbundle``: наборы изменений, полученные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ``hg unbundle``\n"
+" :``push``: наборы изменений, полученные или отправленные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ``hg "
+"push``\n"
+" :``bundle``: наборы изменений, отправленные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ``hg unbundle``"
+
+msgid " Default: serve."
+msgstr " По умолчанию: serve."
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+" reference repositories with their absolute path. ``notify.strip`` lets "
+"you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+"notify.strip\n"
+" КоличеÑтво ведущих ÑлÑшей, вырезаемых из путей URL. По умолчанию\n"
+" ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ ÑÑылаютÑÑ Ð½Ð° хранилища по их полным путÑм. ``notify.strip``\n"
+" позволÑет превратить их в отноÑительные. Ðапример, ``notify.strip=3``\n"
+" заменит ``/длинный/путь/хранилища`` на ``хранилища``. По умолчанию: 0."
+
+msgid ""
+"notify.domain\n"
+" Default email domain for sender or recipients with no explicit domain."
+msgstr ""
+"notify.domain\n"
+" Домен email, иÑпользуемый по умолчанию Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ получателей,\n"
+" еÑли он не задан Ñвно."
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+"notify.style\n"
+" файл ÑтилÑ, иÑпользуемого Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸Ñем."
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+"notify.template\n"
+" Шаблон, иÑпользуемый при форматировании пиÑем."
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as an incoming hook, overriding ``notify."
+"template``."
+msgstr ""
+"notify.incoming\n"
+" Шаблон, иÑпользуемый при запуÑке в качеÑтве хука Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих изменений,"
+"переопределÑет ``notify.template``."
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as an outgoing hook, overriding ``notify."
+"template``."
+msgstr ""
+"notify.outgoing\n"
+" Шаблон, иÑпользуемый при запуÑке в качеÑтве хука Ð´Ð»Ñ Ð¸ÑходÑщих изменений,"
+"переопределÑет ``notify.template``."
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as a changegroup hook, overriding\n"
+" ``notify.template``."
+msgstr ""
+"notify.changegroup\n"
+" Шаблон, иÑпользуемый при запуÑке в качеÑтве хука Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ изменений\n"
+" (changegroup), переопределÑет ``notify.template``."
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, or -1 to include all of it. Default: 300."
+msgstr ""
+"notify.maxdiff\n"
+" МакÑимальное количеÑтво Ñтрок различий, включаемых в пиÑьмо уведомлениÑ.\n"
+" УÑтановите в 0, чтобы убрать различиÑ, в -1 - включить их полноÑтью.\n"
+" По умолчанию: 300."
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in email's subject line. Default: 67."
+msgstr ""
+"notify.maxsubject\n"
+" МакÑимальное количеÑтво Ñимволов в теме (\"Subject:\") пиÑьма. По "
+"умолчанию: 67."
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+"notify.diffstat\n"
+" УÑтановите в True, чтобы добавить ÑтатиÑтику (diffstat) перед Ñодержимым\n"
+" различий. По умолчанию: True."
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+"notify.merge\n"
+" ЕÑли иÑтинно (True), отправлÑÑ‚ÑŒ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² изменений "
+"ÑлиÑниÑ.\n"
+" По умолчанию: True."
+
+msgid ""
+"notify.mbox\n"
+" If set, append mails to this mbox file instead of sending. Default: None."
+msgstr ""
+"notify.mbox\n"
+" ЕÑли задан, добавлÑет email-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтому mbox-файлу вмеÑто отправки.\n"
+" По умолчанию: не задан."
+
+msgid ""
+"notify.fromauthor\n"
+" If set, use the committer of the first changeset in a changegroup for\n"
+" the \"From\" field of the notification mail. If not set, take the user\n"
+" from the pushing repo. Default: False."
+msgstr ""
+"notify.fromauthor\n"
+" ЕÑли задано, иÑпользовать автора первого Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ изменений длÑ\n"
+" Ð¿Ð¾Ð»Ñ \"От\" email-ÑообщениÑ. ЕÑли не задан, иÑпользовать Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· "
+"иÑходÑщего хранилища.\n"
+" По умолчанию: False (Ложь)"
+
+msgid ""
+"If set, the following entries will also be used to customize the\n"
+"notifications:"
+msgstr ""
+"Следующие параметры также иÑпользуютÑÑ Ð´Ð»Ñ Ð½Ð°Ñтройки уведомлений,\n"
+"еÑли заданы их значениÑ:"
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in the generated\n"
+" email content."
+msgstr ""
+"email.from\n"
+" ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ ``От`` (``From``), еÑли нет другого подходÑщего\n"
+" адреÑа в Ñгенерированном Ñообщении."
+
+msgid ""
+"web.baseurl\n"
+" Root repository URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+"web.baseurl\n"
+" URL ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°, приÑоединÑемый к путÑм хранилища\n"
+" при Ñоздании ÑÑылок. См. также ``notify.strip``."
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr "%s: %d новых наборов изменений"
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr "notify: отправлÑетÑÑ %d подпиÑчикам, %d изменений\n"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+"\n"
+"Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ (урезанные Ñ %d до %d Ñтрок):"
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+"\n"
+"Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ (%d Ñтрок):"
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr "notify: подавлÑетÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ðµ о ÑлиÑнии %d:%s\n"
+
+msgid "browse command output with an external pager"
+msgstr "проÑмотр вывода команд Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешней программы"
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+"Чтобы задать иÑпользуемую программу проÑмотра (pager), уÑтановите\n"
+"переменную приложениÑ::"
+
+msgid ""
+" [pager]\n"
+" pager = less -FRX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+"ЕÑли программа проÑмотра не задана, раÑширение pager иÑпользует переменную\n"
+"Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ $PAGER. ЕÑли не заданы ни pager.pager, ни $PAGER, программа\n"
+"проÑмотра не иÑпользуетÑÑ."
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+"Можно отключить программу проÑмотра Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ… команд, добавив\n"
+"их в ÑпиÑок pager.ignore::"
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+" [pager]\n"
+" ignore = version, help, update"
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+"Ð’Ñ‹ также можете включить команду проÑмотра только Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ…\n"
+"команд, иÑпользую pager.attend. Ðиже предÑтавлен ÑпиÑок команд,\n"
+"Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… проÑмотр Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹ иÑпользуетÑÑ Ð¿Ð¾ умолчанию::"
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+"УÑтановка pager.attend в пуÑтое значение активирует программу проÑмотра\n"
+"Ð´Ð»Ñ Ð²Ñех команд."
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr "ЕÑли задан pager.attend, pager.ignore игнорируетÑÑ."
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+"Чтобы игнорировать глобальные команды, такие как :hg:`version` или\n"
+":hg:`help`, необходимо указать из вашем конфигурационном файле."
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+"Параметр командной Ñтроки --pager=... также может иÑпользоватьÑÑ, чтобы\n"
+"контролировать иÑпользуемую программу проÑмотра. ИÑпользуйте логичеÑкие\n"
+"значениÑ, такие yes (да), no (нет), on (вкл), off (выкл), либо иÑпользуйте\n"
+"auto Ð´Ð»Ñ Ñтандартного поведениÑ.\n"
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr ""
+"когда иÑпользовать прокрутку (логичеÑкий. always (вÑегда), auto"
+"(автоматичеÑки) или never (никогда)"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr "команда Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ наборов изменений в виде (Ñерии) email Ñ Ð¿Ð°Ñ‚Ñ‡Ð°Ð¼Ð¸"
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"Ð¡ÐµÑ€Ð¸Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ Ñ Ð²Ð²Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ \"[PATCH 0 of N]\",\n"
+"которое Ñодержит опиÑание вÑей Ñерии."
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"Каждое пиÑьмо Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¼ имеет тему, начинающуюÑÑ Ñ \"[PATCH M of N] ...\",\n"
+"при Ñтом в качеÑтве текÑта темы иÑпользуетÑÑ Ð¿ÐµÑ€Ð²Ð°Ñ Ñтрока опиÑÐ°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð°\n"
+"изменений. ПиÑьмо Ñодержит в теле две или три чаÑти:"
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+"- ОпиÑание набора изменений.\n"
+"- [ÐеобÑзательно] Результат работы diffstat Ð´Ð»Ñ Ð¿Ð°Ñ‚Ñ‡Ð° (ÑтатиÑтика).\n"
+"- Сам патч, как его генерирует команда :hg:`export`."
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"Каждое пиÑьмо ÑÑылаетÑÑ Ð½Ð° первое в Ñерии, иÑпользуÑ\n"
+"email-заголовки In-Reply-To и References, так что они будут показыватьÑÑ\n"
+"как ÐµÐ´Ð¸Ð½Ð°Ñ Ñ†ÐµÐ¿Ð¾Ñ‡ÐºÐ° в программах Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ и новоÑтей, а также в архивах."
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+"Чтобы наÑтроить другие заполнÑемые заголовки, добавьте Ñекцию вроде\n"
+"Ñтой в ваш конфигурационный файл::"
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+" [email]\n"
+" from = Мое Ð˜Ð¼Ñ <my@email>\n"
+" to = получатель1, получатель2, ...\n"
+" cc = копиÑ1, копиÑ2, ...\n"
+" bcc = ÑкрытаÑ-копиÑ1, ÑкрытаÑ-копиÑ2, ...\n"
+" reply-to = адреÑ1, адреÑ2, ..."
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+"ИÑпользуйте Ñекцию ``[patchbomb]``, еÑли вы хотите переопределить "
+"глобальные\n"
+"наÑтройки адреÑов из Ñекции ``[email]``."
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+"Ð’Ñ‹ можете иÑпользовать команду :hg:`email`, чтобы отправить по Ñлектронной\n"
+"почте Ñерию наборов изменений в виде неÑкольких пиÑем Ñ Ð¿Ð°Ñ‚Ñ‡Ð°Ð¼Ð¸\n"
+"(patch-bomb)."
+
+# BUG не хватает кавычек в англ текÑте
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"Ð’Ñ‹ также можете либо наÑтроить параметр method Ñекции ``[email]`` так,\n"
+"чтобы он определÑл sendmail-ÑовмеÑтимый клиент Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ почты, либо\n"
+"заполнить Ñекцию ``[smtp]``, чтобы раÑширение patchbomb могло автоматичеÑки\n"
+"отправлÑÑ‚ÑŒ почту прÑмо из командной Ñтроки. См. Ñекции ``[email]`` и ``[smtp]"
+"``\n"
+"Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации.\n"
+
+msgid "send patches as inline message text (default)"
+msgstr "отправлÑÑ‚ÑŒ патчи в такÑте ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (по умолчанию)"
+
+msgid "send patches as attachments"
+msgstr "отправить патчи как вложениÑ"
+
+msgid "send patches as inline attachments"
+msgstr "отправить патчи как Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² текÑте (inline attachments)"
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr "адреÑа получателей Ñкрытой копии пиÑьма"
+
+msgid "email addresses of copy recipients"
+msgstr "адреÑа получателей копии пиÑьма"
+
+msgid "ask for confirmation before sending"
+msgstr "запрашивать подтверждение перед отправкой"
+
+msgid "add diffstat output to messages"
+msgstr "добавить ÑтатиÑтику различий (diffstat) к ÑообщениÑм"
+
+msgid "use the given date as the sending date"
+msgstr "иÑпользовать данную дату в качеÑтве даты отправки"
+
+msgid "use the given file as the series description"
+msgstr "иÑпользовать Ñодержимое указанного файла в качеÑтве опиÑÐ°Ð½Ð¸Ñ Ñерии"
+
+msgid "email address of sender"
+msgstr "email-Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ"
+
+msgid "print messages that would be sent"
+msgstr "напечатать пиÑьма, которые будут отправлены"
+
+msgid "write messages to mbox file instead of sending them"
+msgstr "запиÑать пиÑьма в mbox-файл вмеÑто их отправки"
+
+msgid "email addresses replies should be sent to"
+msgstr "email-адреÑа, на которые должен приÑылатьÑÑ Ð¾Ñ‚Ð²ÐµÑ‚"
+
+msgid "subject of first message (intro or single patch)"
+msgstr "тема первого пиÑьма (вводного или единÑтвенного в поÑледовательноÑти)"
+
+msgid "message identifier to reply to"
+msgstr "идентификатор ÑообщениÑ, на которое надо отвечать"
+
+msgid "flags to add in subject prefixes"
+msgstr "флаги, добавлÑемые в Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ñ‚ÐµÐ¼Ñ‹"
+
+msgid "email addresses of recipients"
+msgstr "email-адреÑа получателей"
+
+msgid "omit hg patch header"
+msgstr "опуÑтить заголовок патча"
+
+msgid "send changes not found in the target repository"
+msgstr "отправить изменениÑ, не найденные в целевом хранилище"
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+"отправить отÑутÑтвующие в целевом хранилище Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² виде комплекта "
+"(bundle)"
+
+msgid "name of the bundle attachment file"
+msgstr "Ð¸Ð¼Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° комплекта (bundle)"
+
+msgid "a revision to send"
+msgstr "отправить указанную ревизию"
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+"работать даже еÑли отдаленное хранилище не ÑвÑзано Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ (Ñ -b/--bundle)"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+"базовый набор изменений, указываемый вмеÑто хранилища Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (Ñ -b/--"
+"bundle)"
+
+msgid "send an introduction email for a single patch"
+msgstr "отправлÑÑ‚ÑŒ вводное пиÑьмо Ð´Ð»Ñ ÐµÐ´Ð¸Ð½Ñтвенного патча"
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [ПÐРÐМЕТР]... [ÐÐЗÐÐЧЕÐИЕ]..."
+
+msgid "send changesets by email"
+msgstr "отправить наборы изменений по email"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+" По умолчанию Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ñ‚ÑылаютÑÑ Ð² том формате, в каком их генерирует\n"
+" :hg:`export`, по одному в каждом пиÑьме. Ð¡ÐµÑ€Ð¸Ñ Ð½Ð°Ñ‡Ð¸Ð½Ð°ÐµÑ‚ÑÑ\n"
+" Ñ Ð²Ð²Ð¾Ð´Ð½Ð¾Ð³Ð¾ пиÑьма \"[PATCH 0 of N]\", Ñодержащего опиÑание вÑей\n"
+" Ñерии."
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+" Каждое пиÑьмо Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¼ имеет тему вида \"[PATCH M of N] ...\",\n"
+" иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿ÐµÑ€Ð²ÑƒÑŽ Ñтроку опиÑÐ°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений в качеÑтве текÑта\n"
+" темы. ПиÑьмо Ñодержит две или три чаÑти. Сначала идет опиÑание\n"
+" набора изменений."
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+" ЕÑли был задан параметр -d/--diffstat и уÑтановлена программа\n"
+" diffstat, то поÑле опиÑÐ°Ð½Ð¸Ñ Ð²ÑтавлÑетÑÑ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚ ее работы длÑ\n"
+" Ñтого патча."
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr " Ðаконец, Ñам патч, как его Ñгенерировала :hg:`export`."
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+" ЕÑли указан параметр -d/--diffstat или -c/--confirm, вам будет\n"
+" показана Ð¸Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñводка вÑех Ñообщений и будет запрошено\n"
+" подтверждение отправки."
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created. You can include a patch both as text in the email\n"
+" body and as a regular or an inline attachment by combining the\n"
+" -a/--attach or -i/--inline with the --body option."
+msgstr ""
+" По умолчанию патч включаетÑÑ Ð² тело пиÑьма Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñмотра.\n"
+" Параметр -a/--attach ÑоздаÑÑ‚ вложение, Ñодержащее патч. С параметром\n"
+" -i/--inline будет Ñоздано вÑтроенное вложение (inline attachment).\n"
+" Можно отправить патч одновременно в текÑте пиÑьма и в обычном или\n"
+" вÑтроенном вложении, ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð¸Ñ€ÑƒÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ -a/--attach или -i/--include\n"
+" Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ --body."
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+" C -o/--outgoing, пиÑьма будут Ñгенерированы Ð´Ð»Ñ Ð¿Ð°Ñ‚Ñ‡ÐµÐ¹, не найденных\n"
+" в хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (либо только Ð´Ð»Ñ Ñ‚ÐµÑ…, которые ÑвлÑÑŽÑ‚ÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ°Ð¼Ð¸\n"
+" заданных ревизий, еÑли таковые были указаны)"
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+" С -b/--bundle, наборы изменений выбираютÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾ --outgoing,\n"
+" но отÑылаетÑÑ ÐµÐ´Ð¸Ð½Ñтвенное пиÑьмо, Ñодержащее двоичный комплект "
+"(bundle)\n"
+" Mercurial во вложении."
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+" С -m/--mbox, вмеÑто того, чтобы проÑматривать каждое пиÑьмо в\n"
+" конÑоли или Ñразу отправлÑÑ‚ÑŒ его, будет Ñоздан файл почтового\n"
+" Ñщика UNIX (mbox), Ñодержащий пиÑьма Ñ Ð¿Ð°Ñ‚Ñ‡Ð°Ð¼Ð¸. Такой файл\n"
+" можно проÑматривать любым почтовым клиентом, который поддерживает\n"
+" формат mbox."
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+" С -n/--test будут выполнены вÑе дейÑтвиÑ, но пиÑьмо не будет\n"
+" отправлено. У Ð²Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ запрошен Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ, тема и вводное\n"
+" Ñообщение, опиÑывающее Ñерию патчей. Потом вÑе пиÑьма\n"
+" отображаютÑÑ Ð½Ð° Ñкране. ЕÑли уÑтановлена Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ\n"
+" PAGER, ваша программа Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹ (pager) будет\n"
+" вызыватьÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ пиÑьма, чтобы вы могли убедитьÑÑ, что\n"
+" вÑе в порÑдке."
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+" ЕÑли при отправке проиÑходит ошибка, вы найдете резервную копию\n"
+" вашего вводного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñерии в файле ``.hg/last-email.txt``."
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+" hg email -r 3000 # отправить только патч 3000\n"
+" hg email -r 3000 -r 3001 # отправить патчи 3000 и 3001\n"
+" hg email -r 3000:3005 # отправить патчи Ñ 3000 по 3005\n"
+" hg email 3000 # отправить патч 3000 (уÑтарело)"
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -o # отправить вÑе патчи, которых нет по пути "
+"default\n"
+" hg email -o ÐÐЗР# отправить вÑе патчи, которых нет по пути "
+"ÐÐЗÐ\n"
+" hg email -o -r 3000 # отправить вÑех предков ревизии 3000, "
+"которых нет по пути default\n"
+" hg email -o -r 3000 ÐÐЗР# отправить вÑех предков ревизии 3000, "
+"которых нет по пути ÐÐЗÐ"
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+" hg email -b # отправить комплект (bundle) вÑех патчей, "
+"которых нет по пути default\n"
+" hg email -b ÐÐЗР# отправить комплект вÑех патчей, которых "
+"нет по пути ÐÐЗÐ\n"
+" hg email -b -r 3000 # отправить комплект вÑех предков ревизии "
+"3000, которых нет по пути default\n"
+" hg email -b -r 3000 ÐÐЗР# отправить комплект вÑех предков ревизии "
+"3000, которых нет по пути ÐÐЗÐ"
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+" hg email -o -m mbox && # Ñгенерировать mbox-файл ...\n"
+" mutt -R -f mbox # ... и поÑмотреть его в mutt\n"
+" hg email -o -m mbox && # Ñгенерировать mbox-файл ...\n"
+" formail -s sendmail \\ # ... и иÑпользовать formail Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ "
+"mbox -bm -t < mbox # ... Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ sendmail"
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+" Перед иÑпользованием Ñтой команды вам необходимо включить email\n"
+" в вашем конфигурационном файле. См. Ñекцию [email] в Ñправке по\n"
+" hgrc(5) Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации. "
+
+msgid "no changes found\n"
+msgstr "Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ найдены\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr "укажите Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один набор изменений Ð´Ð»Ñ -r или -o "
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+"режим --outgoing вÑегда включен Ñ --bundle; Ñвный --outgoing не требуетÑÑ"
+
+msgid "too many destinations"
+msgstr "Ñлишком много хранилищ назначениÑ"
+
+msgid "use only one form to specify the revision"
+msgstr "иÑпользуйте одну форму Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸"
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+"\n"
+"Ðапишите вводное пиÑьмо Ð´Ð»Ñ Ñерии патчей."
+
+#, python-format
+msgid "this patch series consists of %d patches."
+msgstr "Эта ÑÐµÑ€Ð¸Ñ ÑоÑтоит из %d патчей."
+
+msgid "no recipient addresses provided"
+msgstr "не указан Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+"\n"
+"Ð˜Ñ‚Ð¾Ð³Ð¾Ð²Ð°Ñ Ñводка:"
+
+# PROMPT
+msgid "are you sure you want to send (yn)?"
+msgstr "вы уверены, что хотите отправить пиÑьмо (yn)?"
+
+# PROMPT
+msgid "&No"
+msgstr "&Ðет"
+
+# PROMPT
+msgid "&Yes"
+msgstr "&Да"
+
+msgid "patchbomb canceled"
+msgstr "отправка отменена"
+
+msgid "displaying "
+msgstr "отображение "
+
+msgid "sending "
+msgstr "отправка "
+
+msgid "sending"
+msgstr "отправка"
+
+msgid "writing"
+msgstr "запиÑÑŒ"
+
+msgid "show progress bars for some actions"
+msgstr "показать индикаторы Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… дейÑтвий"
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+"Это раÑширение иÑпользует информацию о ходе Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸,\n"
+"предоÑтавлÑемую командами Mercurial, чтобы отобразить макÑимально\n"
+"информативные индикаторы выполнениÑ. Ðекоторые индикаторы показывают\n"
+"только неопределенную информацию, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº другие имеют\n"
+"определенную точку завершениÑ."
+
+msgid "The following settings are available::"
+msgstr "ДоÑтупны Ñледующие наÑтройки::"
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+" [progress]\n"
+" delay = 3 # количеÑтво Ñекунд (дробное) до показа индикатора выполнениÑ\n"
+" changedelay = 1 # Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð´ÐµÑ€Ð¶ÐºÐ° перед показом нового Ñтапа\n"
+" # ЕÑли меньше, чем 3 * refresh, то будет иÑпользовано\n"
+" # Ñто значение вмеÑто refresh.\n"
+" refresh = 0.1 # Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах между обновлениÑми индикатора\n"
+" format = topic bar number estimate # формат индикатора выполнениÑ\n"
+" width = <none> # еÑли задан, макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° индикатора\n"
+" # (Ñ‚.е., будет иÑпользован min(width, term width))\n"
+" clear-complete = True # очиÑтить индикатор поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸\n"
+" disable = False # еÑли иÑтина, не показывать индикатор выполнениÑ\n"
+" assume-tty = False # еÑли иÑтина, ВСЕГДРпоказывать индикатор, еÑли\n"
+" # не задан disable"
+
+# TODO неадекват
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+"ДопуÑтимые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ format - topic, bar, number, unit, estimate,\n"
+"speed и item. item по умолчанию уÑтанавливаетÑÑ Ð² поÑледние 20 Ñимволов\n"
+"опиÑаниÑ, но Ñто можно изменить, добавлÑÑ ``-<чиÑло>``, который иÑпользует\n"
+"заданное чиÑло Ñимволов Ñ ÐºÐ¾Ð½Ñ†Ð°, или ``+<чиÑло>``, чтобы иÑпользовать\n"
+"заданное чиÑло Ñимволов Ñ Ð½Ð°Ñ‡Ð°Ð»Ð°.\n"
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02dÑ"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%dм%02dÑ"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%dч%02dм"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%dд%02dм"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%dн%02dд"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%dг%02dн"
+
+#, python-format
+msgid "%d %s/sec"
+msgstr "%d %s/Ñек"
+
+msgid "command to delete untracked files from the working directory"
+msgstr "команда Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¾Ñ‚Ñлеживаемых файлов из рабочего каталога"
+
+msgid "abort if an error occurs"
+msgstr "прервать выполнение при возникновении ошибки"
+
+msgid "purge ignored files too"
+msgstr "зачиÑтить также игнорируемые файлы"
+
+msgid "print filenames instead of deleting them"
+msgstr "напечатать имена файлов вмеÑто их удалениÑ"
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+"добавлÑÑ‚ÑŒ NUL поÑле имен файлов Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ xargs (подразумевает-p/--"
+"print)"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr "hg purge [ПÐРÐМЕТР]... [КÐТÐЛОГ]..."
+
+msgid "removes files not tracked by Mercurial"
+msgstr "удалить файлы, не отÑлеживаемые Mercurial"
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+" УдалÑет файлы, не извеÑтные Mercurial. Это бывает полезно, чтобы\n"
+" протеÑтировать локальные и незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² чиÑтом\n"
+" во вÑех других отношениÑÑ… дереве иÑходных файлов."
+
+msgid " This means that purge will delete:"
+msgstr " Это означает, что purge удалит:"
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+" - ÐеизвеÑтные файлы: файлы, помеченные \"?\" в :hg:`status`\n"
+" - ПуÑтые каталоги: фактичеÑки, Mercurial игнорирует каталоги,\n"
+" еÑли они не Ñодержат файлов, находÑщихÑÑ Ð¿Ð¾Ð´ контролем верÑий."
+
+msgid " But it will leave untouched:"
+msgstr " Ðо оÑтавит нетронутыми:"
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+" - Измененные и неизмененные отÑлеживаемые файлы\n"
+" - Игнорируемые файлы (еÑли не указан --all)\n"
+" - Ðовые файлы, добавленные в хранилище (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`add`)"
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+" ЕÑли в командной Ñтроке заданы каталоги, раÑÑматриваютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ файлы\n"
+" в Ñтих каталогах."
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+" Будьте оÑторожны Ñ purge, Ñ‚.к. вы можете необратимо удалить файлы,\n"
+" которые вы забыли добавить в хранилище. ЕÑли вы проÑто хотите\n"
+" напечатать ÑпиÑок файлов, которые были бы удалены Ñтой программой,\n"
+" иÑпользуйте параметр --print."
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr "%s не может быть удален"
+
+#, python-format
+msgid "warning: %s\n"
+msgstr "предупреждение: %s\n"
+
+#, python-format
+msgid "removing file %s\n"
+msgstr "удалÑетÑÑ Ñ„Ð°Ð¹Ð» %s\n"
+
+#, python-format
+msgid "removing directory %s\n"
+msgstr "удалÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³ %s\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr "команда Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² ревизий к другому предку"
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+"Это раÑширение позволÑет вам перебазировать наборы изменений в ÑущеÑтвующем\n"
+"хранилище Mercurial."
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+"Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+
+msgid "rebase from the specified changeset"
+msgstr "перебазировать от указанного набора изменений"
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+"перебазировать от базовой ревизии указанного набора изменений (вплоть до "
+"первого общего предка базовой ревизии и ревизии назначениÑ)"
+
+msgid "rebase these revisions"
+msgstr "перебазировать Ñти ревизии"
+
+msgid "rebase onto the specified changeset"
+msgstr "перебазировать на указанный набор изменений"
+
+msgid "collapse the rebased changesets"
+msgstr "объединить перебазированные наборы изменений"
+
+msgid "use text as collapse commit message"
+msgstr ""
+"иÑпользовать текÑÑ‚ в качеÑтве ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð½Ñ‹Ñ… наборов "
+"изменений"
+
+msgid "invoke editor on commit messages"
+msgstr "вызвать редактор Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации"
+
+msgid "read collapse commit message from file"
+msgstr "взÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð½Ñ‹Ñ… наборов изменений из файла"
+
+msgid "keep original changesets"
+msgstr "Ñохранить иÑходные наборы изменений"
+
+msgid "keep original branch names"
+msgstr "Ñохранить иÑходные имена веток"
+
+msgid "(DEPRECATED)"
+msgstr "(УСТÐРЕЛО)"
+
+msgid "specify merge tool"
+msgstr "задать инÑтрумент ÑлиÑниÑ"
+
+msgid "continue an interrupted rebase"
+msgstr "продолжить прерванное перебазирование"
+
+msgid "abort an interrupted rebase"
+msgstr "отменить прерванное перебазирование"
+
+# BUG one line?
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+"hg rebase [-s РЕВ | -b РЕВ] [-d РЕВ] [параметры]\n"
+"hg rebase {-a|-c}"
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr "перемеÑтить наборы изменений (Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°Ð¼Ð¸) на другую ветку"
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+" Rebase иÑпользует повторÑющиеÑÑ ÑлиÑниÑ, чтобы перенеÑти наборы\n"
+" изменений из одной чаÑти иÑтории (иÑточник) в другую (назначение).\n"
+" Это может быть полезным Ð´Ð»Ñ Ð»Ð¸Ð½ÐµÐ°Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ð¸ *локальных* изменений\n"
+" отноÑительно оÑновного дерева разработки."
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+" Ðе Ñтоит перебазировать наборы изменений, которые уже были\n"
+" опубликованы. Это заÑтавит вÑех оÑтальных также выполнить\n"
+" перебазирование, поÑкольку в противном Ñлучае они получат\n"
+" продублированные наборы изменений поÑле того, как затÑнут\n"
+" ваши перебазированные наборы изменений."
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+" ЕÑли вы не укажете ревизию Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (``-d/--dest``),\n"
+" rebase иÑпользует оконечную голову текущей именованной ветки\n"
+" в качеÑтве назначениÑ. (Ðабор Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ изменÑетÑÑ\n"
+" при перебазировании, но новые наборы изменений добавлÑÑŽÑ‚ÑÑ\n"
+" в качеÑтве его потомков)"
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+" Можно задавать ревизии Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ±Ð°Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð²ÑƒÐ¼Ñ ÑпоÑобами: \n"
+" как \"иÑходный\" набор изменений, или как \"базовый\". Оба они\n"
+" ÑвлÑÑŽÑ‚ÑÑ ÑокращениÑми Ð´Ð»Ñ Ñ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑки ÑвÑзанных множеÑтв\n"
+" наборов изменений (\"иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°\"). ЕÑли вы указываете\n"
+" иÑточник наборов изменений (``-s/--source``), то производитÑÑ\n"
+" перебазирование Ñтого набора изменений и вÑех его потомков\n"
+" на ревизию назначениÑ. ЕÑли задаетÑÑ Ð±Ð°Ð·Ð¾Ð²Ñ‹Ð¹ набор изменений\n"
+" (``-b/--base``), rebase выберет его предков вплоть до поÑледнего\n"
+" общего Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸ÐµÐ¹ назначениÑ, не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐµ Ñаму. Т.о., ``-b``\n"
+" менее точный, но более удобный, чем ``-s``: вы можете указать\n"
+" любой набор изменений в иÑходной ветке, и rebase выберет вÑÑŽ\n"
+" ветку. ЕÑли не указан ни ``-s``, ни ``-b``, rebase иÑпользует\n"
+" родительÑкую ревизию рабочего каталога в качеÑтве базового\n"
+" набора изменений."
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+" По умолчанию rebase заново Ñоздает наборы изменений в ветке-иÑточнике\n"
+" как потомков ревизии назначениÑ, поÑле чего удалÑет оригиналы.\n"
+" ИÑпользуйте ``--keep`` чтобы Ñохранить оригиналы в иÑточнике.\n"
+" Ðекоторые наборы изменений в ветке-иÑточнике (например, ÑлиÑниÑ\n"
+" Ñ Ð²ÐµÑ‚ÐºÐ¾Ð¹ назначениÑ) могут быть выброшены, еÑли они более не\n"
+" вноÑÑÑ‚ никаких изменений."
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+" Одним из ÑледÑтвий правил выбора ревизии Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸ ветки-иÑточника\n"
+" ÑвлÑетÑÑ Ñ‚Ð¾, что, в отличие от ``ÑлиÑниÑ``, rebase не Ñделает ничего,\n"
+" еÑли вы не на Ñамой поздней (оконечной) голове именованной ветки\n"
+" Ñ Ð´Ð²ÑƒÐ¼Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°Ð¼Ð¸. ТребуетÑÑ Ñвно указать иÑточник и/или назначение\n"
+" (или обновитьÑÑ Ð½Ð° другую голову, еÑли Ñто голова предполагаемой\n"
+" ветки-иÑточника)."
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+" ЕÑли перебазирование прерываетÑÑ Ð´Ð»Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð³Ð¾ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð²\n"
+" при ÑлиÑнии, его можно продолжить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ --continue/-c или\n"
+" отменить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ --abort/-a."
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+" Ð’ Ñлучае уÑпеха возвращает 0, 1 еÑли нечего перебазировать.\n"
+" "
+
+msgid "message can only be specified with collapse"
+msgstr "Ñообщение можно задавать только при объединении"
+
+msgid "cannot use both abort and continue"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ указывать abort и continue"
+
+msgid "cannot use collapse with continue or abort"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать collapse Ñ continue или abort"
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr "abort и continue не позволÑÑŽÑ‚ задавать ревизии"
+
+msgid "tool option will be ignored\n"
+msgstr "параметр tool будет проигнорирован\n"
+
+msgid "cannot specify both a source and a base"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ source и base одновременно"
+
+msgid "cannot specify both a revision and a base"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ задавать ревизию и base"
+
+msgid "cannot specify both a revision and a source"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ одновременно ревизию и source"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+"не удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ иÑходный набор изменений Ñ Ð½ÐµÐ¿ÐµÑ€ÐµÐ±Ð°Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ð¼Ð¸ потомками"
+
+msgid "use --keep to keep original changesets"
+msgstr "иÑпользуйте --keep чтобы оÑтавить иÑходные наборы изменений"
+
+#, python-format
+msgid "can't rebase immutable changeset %s"
+msgstr "невозможно перебазировать неизменÑемый набор изменений %s"
+
+msgid "see hg help phases for details"
+msgstr "подробнее Ñм. hg help phases"
+
+msgid "nothing to rebase\n"
+msgstr "нечего перебазировать\n"
+
+msgid "cannot collapse multiple named branches"
+msgstr "не могу объединить неÑколько именованных веток"
+
+msgid "rebasing"
+msgstr "перебазируем"
+
+msgid "changesets"
+msgstr "наборы изменений"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr "неулаженные конфликты ( Ñм. hg resolve, потом hg rebase --continue)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "нет изменений, Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d пропущена\n"
+
+msgid "rebase merging completed\n"
+msgstr "ÑлиÑние Ð¿ÐµÑ€ÐµÐ±Ð°Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¾\n"
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+"внимание: новые наборы изменений обнаружены на ветке-иÑточнике, не "
+"ÑрезаютÑÑ\n"
+
+msgid "rebase completed\n"
+msgstr "перебазирование завершено\n"
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr "было пропущено %d ревизий\n"
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "не удаетÑÑ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½Ð¸Ñ‚ÑŒ - более одного внешнего родителÑ"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+"не могу иÑпользовать ревизию %d в качеÑтве базовой, результат будет иметь 3 "
+"родителÑ"
+
+msgid "no rebase in progress"
+msgstr "нет прерванного перебазированиÑ"
+
+#, python-format
+msgid "can't abort rebase due to immutable changesets %s"
+msgstr "невозможно отменить перебазирование из-за неизменÑемых ревизий %s"
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+"внимание: новые наборы изменений обнаружены на ветке назначениÑ, отмена "
+"невозможна\n"
+
+msgid "rebase aborted\n"
+msgstr "перебазирование отменено\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr "не могу перебазировать на наложенный патч mq"
+
+msgid "no matching revisions"
+msgstr "нет подходÑщих ревизий"
+
+msgid "can't rebase multiple roots"
+msgstr "не могу перебазировать неÑколько корневых ревизий"
+
+msgid "source is ancestor of destination"
+msgstr "иÑточник ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼ ревизии назначениÑ"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "обновление закладки %s\n"
+
+msgid "--tool can only be used with --rebase"
+msgstr "--tool можно иÑпользовать только вмеÑте Ñ --rebase"
+
+msgid "rebase working directory to branch head"
+msgstr "перебазировать рабочий каталог поверх головы ветки"
+
+msgid "specify merge tool for rebase"
+msgstr "задать программу Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð¿Ñ€Ð¸ перебазировании"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr "команды Ð´Ð»Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ выбора изменений Ð´Ð»Ñ commit/qrefresh"
+
+msgid "ignore white space when comparing lines"
+msgstr "игнорировать пробельные Ñимволы при Ñравнении Ñтрок"
+
+msgid "ignore changes in the amount of white space"
+msgstr "игнорировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² количеÑтве пробельных Ñимволов"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "игнорировать изменениÑ, ÑоÑтоÑщие только из пуÑÑ‚Ñ‹Ñ… Ñтрок"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "Ñто изменÑет двоичный файл (вÑÑ‘ или ничего)\n"
+
+msgid "this is a binary file\n"
+msgstr "Ñто двоичный файл\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "изменено полоÑ: %d, Ñтрок: %d\n"
+
+# PROMPT
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
+
+# PROMPT
+msgid "&Yes, record this change"
+msgstr "&Yes - Да, запиÑать Ñто изменение"
+
+# PROMPT
+msgid "&No, skip this change"
+msgstr "&No - Ðет, пропуÑтить Ñто изменение"
+
+msgid "&Edit the change manually"
+msgstr "&Edit - редактировать изменение вручную"
+
+# PROMPT
+msgid "&Skip remaining changes to this file"
+msgstr "&Skip - ПропуÑтить оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом файле"
+
+# PROMPT
+msgid "Record remaining changes to this &file"
+msgstr "&file - ЗапиÑать оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом файле"
+
+# PROMPT
+msgid "&Done, skip remaining changes and files"
+msgstr "&Done - ПропуÑтить оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ файлы"
+
+# PROMPT
+msgid "Record &all changes to all remaining files"
+msgstr "&all - запиÑать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑех оÑтавшихÑÑ Ñ„Ð°Ð¹Ð»Ð°Ñ…"
+
+# PROMPT
+msgid "&Quit, recording no changes"
+msgstr "&Quit - выйти, ничего не запиÑываÑ"
+
+# PROMPT
+msgid "&?"
+msgstr "&?"
+
+msgid "cannot edit patch for whole file"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ патч Ð´Ð»Ñ Ñ†ÐµÐ»Ð¾Ð³Ð¾ файла"
+
+msgid "cannot edit patch for binary file"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ патч Ð´Ð»Ñ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ файла"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"Чтобы убрать Ñтроки, начинающиеÑÑ Ñ '-', замените '-' на ' ' (контекÑÑ‚).\n"
+"Чтобы убрать Ñтроки, начинающиеÑÑ Ñ '+', удалите их.\n"
+"Строки, начинающиеÑÑ Ñ #, будут убраны из патча."
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"ЕÑли патч накладываетÑÑ ÑƒÑпешно, редактируемый лоÑкут будет немедленно\n"
+"добавлен в запиÑываемый ÑпиÑок. ЕÑли наложить не удалоÑÑŒ, генерируетÑÑ\n"
+"файл отказов, который может быть иÑпользован в Ñледующих попытках.\n"
+"ЕÑли из лоÑкута удалены вÑе Ñтроки, редактирование завершаетÑÑ Ð¸ лоÑкут\n"
+"оÑтаетÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñ‹Ð¼.\n"
+
+msgid "edit failed"
+msgstr "неудача при редактировании"
+
+msgid "user quit"
+msgstr "пользовательÑкий выход"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "проÑмотреть Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² %s?"
+
+msgid " and "
+msgstr " и "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "запиÑать Ñто изменение файла %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "запиÑать изменение %d/%d в %r?"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "interactively select changes to commit"
+msgstr "интерактивно выбирать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ„Ð¸ÐºÑации"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" ЕÑли ÑпиÑок файлов опущен, в качеÑтве кандидатов Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи выÑтупают\n"
+" вÑе изменениÑ, показываемые :hg:`status`."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Вам будет предложено выбрать, запиÑывать ли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾\n"
+" измененного файла, и - Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ñ Ð½ÐµÑколькими изменениÑми -\n"
+" запиÑывать ли каждое изменение. Ðа каждый Ð²Ð¾Ð¿Ñ€Ð¾Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹ Ñледующие\n"
+" варианты ответов::"
+
+# PROMPT
+msgid ""
+" y - record this change\n"
+" n - skip this change\n"
+" e - edit this change manually"
+msgstr ""
+" y - запиÑать Ñто изменение\n"
+" n - пропуÑтить Ñто изменение\n"
+" e - редактировать Ñто изменение вручную"
+
+# PROMPT
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - пропуÑтить оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом файле\n"
+" f - запиÑать оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтом файле"
+
+# PROMPT
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - готово, пропуÑтить оÑтавшиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ файлы\n"
+" a - запиÑать вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð¾ вÑех оÑтавшихÑÑ Ñ„Ð°Ð¹Ð»Ð°Ñ…\n"
+" q - выйти, ничего не запиÑываÑ"
+
+# PROMPT
+msgid " ? - display help"
+msgstr " ? - показать Ñправку"
+
+msgid " This command is not available when committing a merge."
+msgstr " Эта команда не доÑтупна при фикÑации ÑлиÑниÑ"
+
+msgid "interactively record a new patch"
+msgstr "интерактивно запиÑать новый патч"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr " Подробнее Ñм. :hg:`help qnew` и :hg:`help record`."
+
+msgid "'mq' extension not loaded"
+msgstr "раÑширение 'mq' не загружено"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "выполнение в неинтерактивном режиме, иÑпользуйте %s"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr "невозможно зафикÑировать ÑлиÑние чаÑтично (иÑпользуйте \"hg commit\")"
+
+msgid "no changes to record\n"
+msgstr "нет изменений Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [ПÐРÐМЕТР]... ПÐТЧ [ФÐЙЛ]..."
+
+msgid "interactively select changes to refresh"
+msgstr "интерактивно выбирать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ (refresh)"
+
+msgid "recreates hardlinks between repository clones"
+msgstr "заново Ñоздает жеÑткие ÑÑылки между клонами хранилища"
+
+msgid "recreate hardlinks between two repositories"
+msgstr "заново Ñоздать жеÑткие ÑÑылки между Ð´Ð²ÑƒÐ¼Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°Ð¼Ð¸"
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+" Когда хранилища клонируютÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾, их файлы данных ÑоздаютÑÑ\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ жеÑтких ÑÑылок, чтобы они ÑовмеÑтно иÑпользовали\n"
+" объем одного хранилища."
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+" Однако, поÑледующие затÑÐ³Ð¸Ð²Ð°Ð½Ð¸Ñ Ð² любое их Ñтих хранилищ разорвут\n"
+" жеÑткие ÑÑылки Ð´Ð»Ñ Ð²Ñех файлов, затрагиваемых новыми наборами\n"
+" изменений, даже еÑли в оба хранилища были затÑнуты одни и те же\n"
+" наборы изменений."
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+" Сходным образом вызов \"hg clone\" c ключом --rev не будет\n"
+" иÑпользовать жеÑткие ÑÑылки, полноÑтью ÐºÐ¾Ð¿Ð¸Ñ€ÑƒÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ иÑходного\n"
+" хранилища."
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+" Эта команда позволÑет вам заново Ñоздать Ñти жеÑткие ÑÑылки и\n"
+" вернуть потерÑнное меÑто на диÑке."
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+" СÑылки в Ñтом хранилище будут Ñозданы заново, чтобы разделÑÑ‚ÑŒ\n"
+" данные Ñ Ð˜Ð¡Ð¢ÐžÐ§ÐИКом, который должен быть на том же локальном\n"
+" диÑке. ЕÑли ИСТОЧÐИК опущен, раÑширение пытаетÑÑ Ð¸Ñпользовать\n"
+" Ñначала путь \"default-relink\", потом \"default\" из [paths]."
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+" Ðе пытайтеÑÑŒ читать ничего из текущего хранилища во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ\n"
+" Ñтой команды. (Оба хранилища будут заблокированы на запиÑÑŒ.)\n"
+" "
+
+msgid "hardlinks are not supported on this system"
+msgstr "Ñта ÑиÑтема не поддерживать жеÑткие ÑÑылки"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "переÑоздаем ÑÑылки %s в %s\n"
+
+msgid "there is nothing to relink\n"
+msgstr "нет файлов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑылок\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr ""
+"Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ %d файлов, ожидаемое общее количеÑтво файлов: %s\n"
+
+# по ÑмыÑл вроде ищем
+msgid "collecting"
+msgstr "отбираем"
+
+# units. plurals?
+msgid "files"
+msgstr "файлов"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr "отобрано %d файлов хранилища - кандидатов\n"
+
+msgid "source and destination are on different devices"
+msgstr "иÑходное и выходное хранилища на разных уÑтройÑтвах"
+
+msgid "pruning"
+msgstr "отбраÑываем лишние файлы"
+
+# по ÑмыÑлу вроде так
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr "оÑталоÑÑŒ %d кандидатов Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑылки\n"
+
+msgid "relinking"
+msgstr "переÑоздаем ÑÑылки"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr "переÑозданы ÑÑылки Ð´Ð»Ñ %d файлов (%s оÑвобождено)\n"
+
+msgid "[ORIGIN]"
+msgstr "[ИСТОЧÐИК]"
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr "раÑширÑет Ñхемы в путÑÑ… ÑокращениÑми Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿ хранилищ"
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+"Это раÑширение позволÑет вам задавать ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¸Ñходных URL,\n"
+"Ñодержащих неÑколько хранилищ, и иÑпользовать из как Ñхемы, например::"
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+
+msgid "After that you can use it like::"
+msgstr "ПоÑле Ñтого вы может иÑпользовать Ñто Ñледующим образом::"
+
+msgid " hg clone py://trunk/"
+msgstr " hg clone py://trunk/"
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+"Также приÑутÑтвует поддержка некоторых более Ñложных Ñхем, например,\n"
+"иÑпользуемых Google Code::"
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+"СинтакÑÐ¸Ñ Ð·Ð°Ð¸Ð¼Ñтвован из шаблонов Mercurial, и вы можете иÑпользовать\n"
+"неограниченное количеÑтво переменных, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ ``{1}``, затем ``{2}``,\n"
+"``{3}`` и Ñ‚.д. Эти переменные получают чаÑти переданных URL, разделенные\n"
+"``/``. Ð’Ñе, что не указано как ``{чаÑÑ‚ÑŒ}``, будет проÑто добавлено в конец\n"
+"итогового URL."
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr "Ð”Ð»Ñ ÑƒÐ´Ð¾Ð±Ñтва раÑширение определÑет Ñледующие Ñхемы по умолчанию::"
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+"Ð’Ñ‹ можете переопределить Ñхемы по умолчанию, определив новую Ñхему\n"
+"Ñ Ñ‚Ð°ÐºÐ¸Ð¼ же именем.\n"
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr "пользовательÑÐºÐ°Ñ Ñхема %s:// конфликтует Ñ Ð±ÑƒÐºÐ²Ð¾Ð¹ диÑка %s:\\\n"
+
+msgid "share a common history between several working directories"
+msgstr "разделить общую иÑторию между неÑколькими рабочими каталогами"
+
+msgid "create a new shared repository"
+msgstr "Ñоздать новое разделÑемое хранилище"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+" Инициализирует новое хранилище и рабочий каталог, который разделÑет\n"
+" Ñвою иÑторию Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ хранилищем."
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+" .. note::\n"
+" иÑпользование rollback или раÑширений, которые Ñтирают/изменÑÑŽÑ‚\n"
+" иÑторию (mq, rebase и Ñ‚.п.), может Ñоздать определенную путаницу\n"
+" Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ñемыми клонами. Ð’ чаÑтноÑти, еÑли два разделÑемых клона\n"
+" обновлены на один и тот же набор изменений, и один из них уничтожает\n"
+" Ñтот набор изменений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ rollback, второй клон вдруг "
+"переÑтанет\n"
+" работать: вÑе операции будут завершатьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ \"рабочий каталог\n"
+" имеет неизвеÑтного родителÑ\". ЕдинÑтвенное извеÑтное решение - \n"
+" иÑпользовать debugsetparents на иÑпорченном клоне, чтобы перегрузить\n"
+" его на набор изменений, который еще ÑущеÑтвует (Ñ‚.е. tip)."
+
+msgid "convert a shared repository to a normal one"
+msgstr "Преобразовать разделÑемое хранилище в обычное"
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+" Копирует хранимые данные в хранилище и удалÑет данные sharedpath.\n"
+" "
+
+msgid "this is not a shared repo"
+msgstr "Ñто не разделÑемое хранилище"
+
+msgid "do not create a working copy"
+msgstr "не Ñоздавать рабочую копию"
+
+msgid "[-U] SOURCE [DEST]"
+msgstr "[-U] ИСТОЧÐИК [ÐÐЗÐÐЧЕÐИЕ]"
+
+msgid "command to transplant changesets from another branch"
+msgstr "команда Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑадки наборов изменений из другой ветки"
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr "Это раÑширение позволÑет вам перенеÑти патчи из другой ветки."
+
+# BUG может, иÑходной ветке, а не хранилище?
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+"ПереÑаженные патчи запиÑываютÑÑ Ð² .hg/transplant/transplants, как\n"
+"ÑопоÑтавление Ñ…Ñша набора изменений его Ñ…Ñшу в иÑходном хранилище.\n"
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr "пропуÑкаем уже примененную ревизию %s\n"
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr "пропуÑкаем ревизию ÑлиÑÐ½Ð¸Ñ %s:%s\n"
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s не родитель %s"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr "%s Ñлит в %s\n"
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr "%s переÑажен в %s\n"
+
+#, python-format
+msgid "filtering %s\n"
+msgstr "фильтруем %s\n"
+
+msgid "filter failed"
+msgstr "Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ"
+
+msgid "can only omit patchfile if merging"
+msgstr "patchfile можно опуÑтить только при ÑлиÑнии"
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr "разрешите конфликты и запуÑтите hg transplant --continue"
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr "%s переÑажен как %s\n"
+
+msgid "transplant log file is corrupt"
+msgstr "файл журнала переÑадки поврежден"
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr "рабочий каталог не на родителе %s"
+
+msgid "commit failed"
+msgstr "фикÑÐ°Ñ†Ð¸Ñ Ð½Ðµ удалаÑÑŒ"
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr "поврежденный набор изменений отфильтрован (нет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ даты)"
+
+# transplant input is not localized
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: (Yes) переÑадить Ñтот набор изменений\n"
+"n: (No) пропуÑтить Ñтот набор изменений\n"
+"m: (Merge) Ñлить в Ñтом наборе изменений\n"
+"p: (Patch) показать патч\n"
+"c: (Commit) зафикÑировать выбранные наборы изменений\n"
+"q: (Quit) отказатьÑÑ Ð¾Ñ‚ переÑадки\n"
+"?: показать Ñту Ñправку\n"
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "применить набор изменений? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "нет такого варианта\n"
+
+msgid "pull patches from REPO"
+msgstr "затÑнуть патчи из ХРÐÐИЛИЩÐ"
+
+msgid "pull patches from branch BRANCH"
+msgstr "затÑнуть патчи из ВЕТКИ"
+
+msgid "pull all changesets up to BRANCH"
+msgstr "затÑнуть вÑе наборы изменений вплоть до ВЕТКИ"
+
+msgid "skip over REV"
+msgstr "пропуÑтить РЕВизию"
+
+msgid "merge at REV"
+msgstr "Ñлить в РЕВизии"
+
+msgid "parent to choose when transplanting merge"
+msgstr "Ð²Ñ‹Ð±Ð¸Ñ€Ð°ÐµÐ¼Ð°Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¿Ñ€Ð¸ перÑадке ÑлиÑниÑ"
+
+msgid "append transplant info to log message"
+msgstr "добавить информацию о переÑадке в журнальное Ñообщение"
+
+msgid "continue last transplant session after repair"
+msgstr "продолжить поÑледний ÑÐµÐ°Ð½Ñ transplant поÑле иÑправлениÑ"
+
+msgid "filter changesets through command"
+msgstr "отфильтровать наборы изменений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды"
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+"hg transplant [-s ХРÐÐИЛИЩЕ] [-b ВЕТКР[-a]] [-p РЕВ] [-m РЕВ] [РЕВ]..."
+
+msgid "transplant changesets from another branch"
+msgstr "переÑадить наборы изменений из другой ветки"
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+" Выбранные наборы изменений будут применены поверх текущего рабочего\n"
+" каталога Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ ÑообщениÑми иÑходных наборов изменений. Ðаборы\n"
+" изменений копируютÑÑ, поÑтому они отобразÑÑ‚ÑÑ Ð² иÑтории дважды.\n"
+" ИÑпользуйте раÑширение rebase, еÑли вы хотите перемеÑтить целую ветку Ñ\n"
+" неопубликованными наборами изменений."
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+" ЕÑли указан --log, к журнальным ÑообщениÑм будет добавлен\n"
+" комментарий вида::"
+
+# BUG should be localized
+msgid " (transplanted from CHANGESETHASH)"
+msgstr " (transplanted from ХЭШРЕВИЗИИ)"
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+" Ð’Ñ‹ можете заменить журнальное Ñообщение Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра --filter.\n"
+" Его аргумент будет вызван Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ журнальным Ñообщением в качеÑтве\n"
+" $1 и патчем в качеÑтве $2."
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+" ЕÑли указан --source/-s, выбираютÑÑ Ð½Ð°Ð±Ð¾Ñ€Ñ‹ изменений из заданного\n"
+" хранилища. ЕÑли указан --branch/-b, выбираютÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸\n"
+" из ветки, Ñодержащей заданную ревизию, вплоть до Ñтой ревизии.\n"
+" ЕÑли указан -a/--all, будут переÑажены вÑе наборы изменений на ветке,\n"
+" в противном Ñлучае вам будет предложено ÑамоÑтоÑтельно выбрать наборы\n"
+" изменений, которые вы хотите переÑадить."
+
+msgid ""
+" :hg:`transplant --branch REV --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+" :hg:`transplant --branch РЕВИЗИЯ --all` переÑадит выбранную\n"
+" ветку (вплоть до указанной ревизии) поверх текущего рабочего\n"
+" каталога."
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+" Ð’Ñ‹ также можете опционально пометить выбранные переÑаженные\n"
+" наборы изменений как ÑлиÑниÑ. При Ñтом вам не будет предложено\n"
+" переÑадить каких-либо предков Ñлитой переÑаженной ревизии, и вы\n"
+" можете Ñлить их потомков обычным путем, не иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð´Ð»Ñ Ñтого\n"
+" transplant."
+
+msgid ""
+" Merge changesets may be transplanted directly by specifying the\n"
+" proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+" Ревизии ÑлиÑÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть переÑажены напрÑмую, путем заданиÑ\n"
+" ÑоответÑтвующей родительÑкой ревизии Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" :hg:`transplant --parent`."
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+" ЕÑли не задано ни ревизий, ни ÑлиÑний, :hg:`transplant` запуÑтит\n"
+" интерактивный обозреватель наборов изменений."
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+" ЕÑли применение набора изменений не удалоÑÑŒ, вы можете вручную\n"
+" разрешить конфликты, а потом продолжить переÑадку Ñ Ñ‚Ð¾Ð³Ð¾ же меÑта\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`transplant --continue/-c`.\n"
+" "
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr "Ñ --continue Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ ветку, all или ÑлиÑние"
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr "не указан URL иÑточника, ревизии ветки или ÑпиÑок ревизий"
+
+msgid "--all requires a branch revision"
+msgstr "--all требует ревизии ветки"
+
+msgid "--all is incompatible with a revision list"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ одновременно --all и ÑпиÑок ревизий"
+
+msgid "no revision checked out"
+msgstr "нет извлеченной ревизии"
+
+msgid "outstanding uncommitted merges"
+msgstr "незафикÑированные ÑлиÑниÑ"
+
+msgid "outstanding local changes"
+msgstr "незафикÑированные локальные изменениÑ"
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+"``transplanted([множеÑтво])``\n"
+" ПереÑаженные наборы изменений из множеÑтва, или вÑе переÑаженные\n"
+" наборы изменений."
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+":transplanted: Строка. Идентификатор узла переÑаженного набора изменений\n"
+" еÑли таковой имеетÑÑ."
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr "разрешает иÑпользование путей в MBCS Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð½Ñ‹Ð¼Ð¸ кодировками"
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+"Ðекоторые MBCS (многобайтовые) кодировки плохо подходÑÑ‚ Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ñ…\n"
+"операций Ñ Ð¿ÑƒÑ‚Ñми (например, разделение пути, преобразование региÑтров\n"
+"и т.п.). Мы называем такие кодировки (т.е. shift_jis и big5) \"проблемными\n"
+"кодировками\". Это раÑширение может быть иÑпользовано Ð´Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼\n"
+"Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ кодировками Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ оберток над некоторыми функциÑми длÑ\n"
+"Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтрок в Юникод перед операциÑми над путÑми."
+
+msgid "This extension is useful for:"
+msgstr "Это раÑширение полезно длÑ:"
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+"- Пользователей Windows, иÑпользующих ÑпонÑкую кодировку shift_jis.\n"
+"- Пользователей Windows, иÑпользующих китайÑкую кодировку big5.\n"
+"- Ð’Ñех пользователей, иÑпользующих хранилище Ñ Ð¾Ð´Ð½Ð¾Ð¹ из проблемных\n"
+" кодировок на нечувÑтвительной к региÑтру файловой ÑиÑтеме."
+
+msgid "This extension is not needed for:"
+msgstr "Это раÑширение не нужно:"
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+"- Ð’Ñем пользователÑм, иÑпользующим только ASCII-Ñимволы в путÑÑ….\n"
+"- Ð’Ñем пользователÑм, не иÑпользующим ни одну из проблемных кодировок."
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+"Обратите внимание, что ÑущеÑтвуют определенные Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸\n"
+"иÑпользовании данного раÑширениÑ:"
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+"- Ðеобходимо иÑпользовать единую кодировку в одном хранилище.\n"
+"- ЕÑли путь хранилища оканчиваетÑÑ Ð½Ð° 0x5c, .hg/hgrc не может быть "
+"прочитан.\n"
+"- РаÑширение win32mbcs неÑовмеÑтимо Ñ Ñ€Ð°Ñширением fixutf8."
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+"По умолчанию win32mbcs иÑпользует значение encoding.encoding, выбранное\n"
+"Mercurial. Можно задать кодировку в конфиге::"
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+" [win32mbcs]\n"
+" encoding = sjis"
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+"Это полезно пользователÑм, которые хотÑÑ‚ фикÑировать Ñ Ð¶ÑƒÑ€Ð½Ð°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ "
+"ÑообщениÑми в UTF-8.\n"
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr "[win32mbcs] не удалоÑÑŒ конвертировать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ %s\n"
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr "[win32mbcs] не удаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ на Ñтой платформе.\n"
+
+msgid "perform automatic newline conversion"
+msgstr "выполнÑÑ‚ÑŒ автоматичеÑкое преобразование формата новой Ñтроки"
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+" РаÑширение уÑтарело: win32text заÑтавлÑет каждого пользователÑ\n"
+" выполнÑÑ‚ÑŒ наÑтройку Ñнова и Ñнова Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клона, Ñ‚.к. наÑтройки\n"
+" не копируютÑÑ Ð¿Ñ€Ð¸ клонировании."
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+" ПоÑтому мы Ñделали раÑширение ``eol`` в качеÑтве альтернативы. РаÑширение\n"
+" ``eol`` иÑпользует верÑионируемый файл Ð´Ð»Ñ Ñвоих наÑтроек, поÑтому каждый\n"
+" клон изначально иÑпользует правильные наÑтройки."
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+"Чтобы производить автоматичеÑкое преобразование формата новой Ñтроки, "
+"иÑпользуйте::"
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # или ** = macencode:"
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # или ** = macdecode:"
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+"ЕÑли преобразование не выполнÑетÑÑ, не забудьте убедитьÑÑ, что вы Ñлучайно\n"
+"не зафикÑируете CRLF/CR::"
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # или pretxncommit.cr = python:hgext.win32text.forbidcr"
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+"То же Ñамое на Ñервере, чтобы предотвратить затÑгивание или\n"
+"проталкивание CRLF/CR::"
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # или pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+"Ð’ÐИМÐÐИЕ: %s уже имеет формат новой Ñтроки %s\n"
+"и не нуждаетÑÑ Ð² его преобразовании Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ win32text.\n"
+"Перед Ñледующей фикÑацией, пожалуйÑта, переÑмотрите ваши наÑтройки\n"
+"в Mercurial.ini или %s.\n"
+
+#, python-format
+msgid "attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+"попытка зафикÑировать или протолкнуть текÑтовые файл(Ñ‹) Ñ Ð¿ÐµÑ€ÐµÐ²Ð¾Ð´Ð°Ð¼Ð¸\n"
+"Ñтроки формата %s\n"
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr "в %s: %s\n"
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+"\n"
+"Чтобы предотвратить Ñту ошибку в вашем локальном хранилище, добавьте Ñто\n"
+"в Mercurial.ini или .hg/hgrc:"
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+
+#, python-format
+msgid "and also consider adding:"
+msgstr "также раÑÑмотрите вариант добавлениÑ:"
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+"win32text уÑтарело: Ñм. http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+
+msgid "discover and advertise repositories on the local network"
+msgstr "обнаруживать и оповещать о хранилищах в локальной Ñети"
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+"Хранилища Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ Zeroconf будут афишированы в Ñети без необходимоÑти\n"
+"наÑтройки Ñлужбы или Ñервера. Их можно обнаружить без Ð·Ð½Ð°Ð½Ð¸Ñ Ð¸Ñ…\n"
+"реального IP-адреÑа."
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+"Чтобы позволить другим людÑм обнаружить ваше хранилище, запуÑтите\n"
+":hg:`serve` в вашем хранилище::"
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+" $ cd test\n"
+" $ hg serve"
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+"Ð’Ñ‹ можете обнаружить хранилища Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ Zeroconf Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+":hg:`paths`::"
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+
+# }}} End of extensions
+msgid "archive prefix contains illegal components"
+msgstr "Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð°Ñ€Ñ…Ð¸Ð²Ð° Ñодержит недопуÑтимые компоненты"
+
+msgid "archiving"
+msgstr "архивирование"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr "Ð¿Ð»Ð¾Ñ…Ð°Ñ Ñтрока в .hg/bookmarks: %r\n"
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "закладка '%s' Ñодержит недопуÑтимый Ñимвол"
+
+#, python-format
+msgid "branch %s not found"
+msgstr "ветка %s не найдена"
+
+# NOT-SURE
+#, python-format
+msgid "divergent bookmark %s stored as %s\n"
+msgstr "Ð¿Ñ€Ð¾Ñ‚Ð¸Ð²Ð¾Ñ€ÐµÑ‡Ð¸Ð²Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° %s Ñохранена как %s\n"
+
+#, python-format
+msgid "adding remote bookmark %s\n"
+msgstr "добавление отдалённой закладки %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "поиÑк изменившихÑÑ Ð·Ð°ÐºÐ»Ð°Ð´Ð¾Ðº\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "измененных закладок не найдено\n"
+
+msgid "unknown parent"
+msgstr "неизвеÑтный родитель"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr "ошибка при проверке целоÑтноÑти %s:%d"
+
+msgid "cannot create new bundle repository"
+msgstr "невозможно Ñоздать новое хранилище-комплект (bundle)"
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "неожиданное завершение потока (получено %d байт, ожидалоÑÑŒ %d)"
+
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° учаÑтка %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: не комплект Mercurial"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ‚Ð° %s"
+
+msgid "empty username"
+msgstr "пуÑтое Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s Ñодержит перевод Ñтроки"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "Ð¸Ð¼Ñ '%s' зарезервировано"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² подхранилище %s"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "параметры --massage и --logfile взаимно иÑключающие"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ Ñообщение фикÑации '%s': %s"
+
+msgid "limit must be a positive integer"
+msgstr "ограничение должно быть положительным целым чиÑлом"
+
+msgid "limit must be positive"
+msgstr "ограничение должно быть положительным"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° '%%%s' в имени выходного файла"
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --changelog и --manifest одновременно"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ --changelog или --manifest"
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ --changelog или --manifest без хранилища"
+
+msgid "invalid arguments"
+msgstr "неверные параметры"
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' не найден"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr "%s: не копируетÑÑ - файл не контролируетÑÑ\n"
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr "%s: не копируетÑÑ - файл был помечен Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ\n"
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr "%s: не перезапиÑываетÑÑ - %s конфликтует Ñ %s\n"
+
+#, python-format
+msgid "%s: can't copy - same file\n"
+msgstr "%s: Ð½ÐµÐ»ÑŒÐ·Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файл Ñамого в ÑебÑ\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: не перезапиÑываетÑÑ - файл ÑущеÑтвует\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: перемещение не запиÑываетÑÑ - %s не ÑущеÑтвует\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: копирование не запиÑываетÑÑ - %s не ÑущеÑтвует\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s: удален в рабочей копии\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: не удаетÑÑ Ñкопировать - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "%s перемещаетÑÑ Ð² %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "%s копируетÑÑ Ð² %s\n"
+
+msgid "no source or destination specified"
+msgstr "не указан иÑточник или назначение"
+
+msgid "no destination specified"
+msgstr "не указано назначение"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+"еÑли задано неÑколько иÑточников, назначение должно быть ÑущеÑтвующим "
+"каталогом"
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr "назначение %s не ÑвлÑетÑÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð¾Ð¼"
+
+msgid "(consider using --after)\n"
+msgstr "(попробуйте иÑпользовать --after?)\n"
+
+msgid "child process failed to start"
+msgstr "не удалоÑÑŒ запуÑтить дочерний процеÑÑ"
+
+# может Ñделать "набор изм-й" или "ревизиÑ" Ð´Ð»Ñ Ñкономии меÑта?
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "набор изменений: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ветка: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "закладка: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "метка: %s\n"
+
+#, python-format
+msgid "phase: %s\n"
+msgstr "фаза: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "родитель: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "манифеÑÑ‚: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "пользователь: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "дата: %s\n"
+
+msgid "files+:"
+msgstr "файлов+:"
+
+msgid "files-:"
+msgstr "файлов-:"
+
+msgid "files:"
+msgstr "файлы:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "файлы: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "Ñкопировано: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "дополнительно: %s=%s\n"
+
+msgid "description:\n"
+msgstr "опиÑание:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "Ñводка: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr "%s: нет ключа Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ '%s'"
+
+# второй параметр - дата/времÑ
+#, python-format
+msgid "found revision %s from %s\n"
+msgstr "найдена Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s от %s\n"
+
+msgid "revision matching date not found"
+msgstr "не найдена Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ даты"
+
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr ""
+"невозможно отÑлеживать файл, которого нет в родительÑкой ревизии: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "невозможно отÑлеживать неÑущеÑтвующий файл: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+"чтобы отÑлеживать копированиÑ/переименованиÑ, требуетÑÑ Ñвное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "Ð¾Ð¿Ñ†Ð¸Ñ -G/--graph неÑовмеÑтима Ñ --%s "
+
+#, python-format
+msgid "adding %s\n"
+msgstr "добавлÑетÑÑ %s\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr "пропуÑкаетÑÑ Ð¾Ñ‚ÑутÑтвующее подхранилище: %s\n"
+
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "иÑправление набора изменений %s\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "набор изменений %s копируетÑÑ Ð² %s\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "вырезаем промежуточную ревизию %s\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "вырезаем иÑправленную ревизию %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+"HG: Введите Ñообщение фикÑации. Строки, начинающиеÑÑ Ñ 'HG:' будут удалены."
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: ОÑтавьте Ñообщение пуÑтым, чтобы отменить фикÑацию."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: пользователь: %s"
+
+msgid "HG: branch merge"
+msgstr "HG: ÑлиÑние веток"
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: ветка '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr "HG: подхранилище %s"
+
+# UGLY
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: добавлен(ы) %s"
+
+# UGLY
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: изменен(ы) %s"
+
+# UGLY
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: удален(ы) %s"
+
+msgid "HG: no files changed"
+msgstr "HG: нет измененных файлов"
+
+msgid "empty commit message"
+msgstr "пуÑтое Ñообщение фикÑации"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "забываю %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "воÑÑтановление %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "отмена ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "файл не под контролем верÑий: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "не требуютÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ %s\n"
+
+# overlay - накладываемый?
+msgid "repository root directory or name of overlay bundle file"
+msgstr "корневой каталог хранилища или Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° комплекта"
+
+msgid "DIR"
+msgstr "КÐТÐЛОГ"
+
+msgid "change working directory"
+msgstr "Ñменить рабочий каталог"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr "не Ñпрашивать, на вÑе вопроÑÑ‹ автоматичеÑки выбирать первый вариант"
+
+msgid "suppress output"
+msgstr "подавлÑÑ‚ÑŒ вывод"
+
+msgid "enable additional output"
+msgstr "включить дополнительный вывод"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr ""
+"задать/переопределить параметр конфигурации (в виде 'ÑекциÑ."
+"параметр=значение')"
+
+msgid "CONFIG"
+msgstr "КОÐФИГ"
+
+msgid "enable debugging output"
+msgstr "включить отладочный вывод"
+
+msgid "start debugger"
+msgstr "запуÑтить отладчик"
+
+msgid "set the charset encoding"
+msgstr "уÑтановить кодировку"
+
+msgid "ENCODE"
+msgstr "КОДИРОВКÐ"
+
+msgid "MODE"
+msgstr "РЕЖИМ"
+
+msgid "set the charset encoding mode"
+msgstr "уÑтановить режим кодировки"
+
+msgid "always print a traceback on exception"
+msgstr "вÑегда печатать траÑÑировку Ñтека при иÑключении"
+
+msgid "time how long the command takes"
+msgstr "Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹"
+
+msgid "print command execution profile"
+msgstr "профилирование Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹"
+
+msgid "output version information and exit"
+msgstr "напечатать информацию о верÑии и выйти"
+
+msgid "display help and exit"
+msgstr "показать Ñправку и выйти"
+
+msgid "do not perform actions, just print output"
+msgstr "ничего реально не делать, проÑто напечатать вывод"
+
+msgid "specify ssh command to use"
+msgstr "иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Ð´Ð»Ñ ssh"
+
+msgid "specify hg command to run on the remote side"
+msgstr "команда Mercurial, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ запущена на отдалённом компьютере"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr "не проверÑÑ‚ÑŒ Ñертификат Ñервера (Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑ Ð½Ð°Ñтройку web.cacerts)"
+
+msgid "PATTERN"
+msgstr "ШÐБЛОÐ"
+
+msgid "include names matching the given patterns"
+msgstr "добавить файлы, имена которых ÑоответÑтвуют данным шаблонам"
+
+msgid "exclude names matching the given patterns"
+msgstr "не добавлÑÑ‚ÑŒ файлы, имена которых ÑоответÑтвуют данным шаблонам"
+
+msgid "use text as commit message"
+msgstr "текÑÑ‚ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации"
+
+msgid "read commit message from file"
+msgstr "взÑÑ‚ÑŒ Ñообщение фикÑации из файла"
+
+msgid "record the specified date as commit date"
+msgstr "иÑпользовать Ñту дату в качеÑтве даты фикÑации"
+
+msgid "record the specified user as committer"
+msgstr "иÑпользовать Ñтого Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ðº автора фикÑации"
+
+msgid "STYLE"
+msgstr "СТИЛЬ"
+
+msgid "display using template map file"
+msgstr "отображать Ñ Ð¸Ñпользование файла-карты шаблонов"
+
+msgid "display with template"
+msgstr "отображать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шаблона"
+
+msgid "show patch"
+msgstr "показать патч"
+
+msgid "do not show merges"
+msgstr "не показывать ÑлиÑниÑ"
+
+msgid "output diffstat-style summary of changes"
+msgstr "отображать Ñводку изменений в Ñтиле diffstat"
+
+msgid "show the revision DAG"
+msgstr "показать граф ревизий"
+
+msgid "treat all files as text"
+msgstr "обрабатывать вÑе файлы как текÑтовые"
+
+msgid "omit dates from diff headers"
+msgstr "опуÑкать даты в заголовках файлов различий"
+
+msgid "show which function each change is in"
+msgstr "Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚ÑŒ, в какой оно Ñделано функции"
+
+msgid "produce a diff that undoes the changes"
+msgstr "Ñгенерировать патч, который отменÑет изменениÑ"
+
+msgid "number of lines of context to show"
+msgstr "показываемое количеÑтво Ñтрок контекÑта"
+
+msgid "SIMILARITY"
+msgstr "ПОХОЖЕСТЬ"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr ""
+"Ñчитать файлы переименованными иÑÑ…Ð¾Ð´Ñ Ð¸Ð· Ñтепени их похожеÑти (от 0 до 100)"
+
+msgid "recurse into subrepositories"
+msgstr "рекурÑивно обрабатывать подхранилища"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[ПÐРÐМЕТР]... [ФÐЙЛ]..."
+
+msgid "add the specified files on the next commit"
+msgstr "добавить указанный файл при Ñледующей фикÑации"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+" Планирует помещение файлов под контроль верÑий и\n"
+" добавление их в хранилище."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Файлы будут добавлены в хранилище при Ñледующей фикÑации. Чтобы\n"
+" отменить добавление до фикÑации, Ñм. :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr " ЕÑли имена файлов не заданы, в будут добавлены вÑе файлы."
+
+# does this require a translation?
+msgid " .. container:: verbose"
+msgstr " .. container:: подробный"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" Пример, демонÑтрирующий автоматичеÑкое добавление новых\n"
+" (неизвеÑтных) файлов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`add`::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Возвращает 0, еÑли вÑе файлы были уÑпешно добавлены.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "добавить вÑе новые, удалить вÑе отÑутÑтвующие файлы"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" ДобавлÑет вÑе новые и удалÑет вÑе отÑутÑтвующие файлы из\n"
+" хранилища."
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" Ðовые файлы игнорируютÑÑ, еÑли они подходÑÑ‚ под любой шаблон\n"
+" в ``.hgignore``. Ðналогично команде ``add``, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑируютÑÑ\n"
+" при Ñледующей фикÑации."
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. With a parameter greater than 0,\n"
+" this compares every removed file with every added file and records\n"
+" those similar enough as renames. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed. If\n"
+" not specified, -s/--similarity defaults to 100 and only renames of\n"
+" identical files are detected."
+msgstr ""
+" ИÑпользуйте параметр -s/--similarity, чтобы найти переименованные\n"
+" файлы. ЕÑли Ñтот параметр больше 0, то производитÑÑ Ñравнение\n"
+" каждого удалённого файла Ñ ÐºÐ°Ð¶Ð´Ñ‹Ð¼ добавленным, и еÑли они доÑтаточно\n"
+" похожи, то Ñто фикÑируетÑÑ ÐºÐ°Ðº переименование. Этот параметр принимает\n"
+" в качеÑтве параметра \"процент похожеÑти\" от 0 (отключено) до 100\n"
+" (файлы должны быть одинаковыми). Этот ÑпоÑоб нахождениÑ\n"
+" переименованных файлов может оказатьÑÑ Ð·Ð°Ñ‚Ñ€Ð°Ñ‚Ð½Ñ‹Ð¼. ПоÑле иÑпользованиÑ\n"
+" Ñтого параметра можно иÑпользовать :hg:`status -C` чтобы проверить,\n"
+" какие файлы были идентифицированы как перемещенные или\n"
+" переименованные. ЕÑли Ñтот параметр не задан, обнаруживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+" Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ‡Ð½Ñ‹Ñ… файлов (--similarity = 100)."
+
+msgid "similarity must be a number"
+msgstr "параметр \"similarity\" должен быть чиÑлом"
+
+msgid "similarity must be between 0 and 100"
+msgstr "параметр similarity должен быть от 0 до 100"
+
+msgid "annotate the specified revision"
+msgstr "аннотировать указанную ревизию"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "отÑлеживать копированиÑ/Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ пиÑать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° (УСТÐРЕЛО)"
+
+msgid "don't follow copies and renames"
+msgstr "не отÑлеживать ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ перемещениÑ"
+
+msgid "list the author (long with -v)"
+msgstr "показывать Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° (длинный формат Ñ -v)"
+
+msgid "list the filename"
+msgstr "показывать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+msgid "list the date (short with -q)"
+msgstr "показывать дату (короткий формат Ñ -q)"
+
+msgid "list the revision number (default)"
+msgstr "показывать номер ревизии (по умолчанию)"
+
+msgid "list the changeset"
+msgstr "показывать набор изменений"
+
+msgid "show line number at the first appearance"
+msgstr "показывать номер Ñтроки при первом поÑвлении"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r РЕВИЗИЯ] [-f] [-a] [-u] [-d] [-n] [-c] [-l] ФÐЙЛ..."
+
+msgid "show changeset information by line for each file"
+msgstr "показать данные ревизии поÑтрочно Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+" Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки файла показывает номер ревизии, из которой\n"
+" Ñта Ñтрока взÑлаÑÑŒ"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+" Эта команда полезна Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы узнать, когда и кем было внеÑено\n"
+" изменение."
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" Без параметра -a/--test, annotate не будет обрабатывать файлы,\n"
+" которые она Ñчитает бинарными. С параметром -a, бинарные файлы\n"
+" также будут аннотированы, Ñ…Ð¾Ñ‚Ñ ÐºÐ°Ðº правило Ñто нежелательно и\n"
+" беÑполезно."
+
+msgid "at least one filename or pattern is required"
+msgstr "требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ как минимум одно Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° или шаблон"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr "Ñ -l требуетÑÑ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно из -n/-c"
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: бинарный файл\n"
+
+msgid "do not pass files through decoders"
+msgstr "не обрабатывать файлы декодерами"
+
+msgid "directory prefix for files in archive"
+msgstr "Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в архиве"
+
+msgid "PREFIX"
+msgstr "ПРЕФИКС"
+
+msgid "revision to distribute"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ"
+
+msgid "type of distribution to create"
+msgstr "тип Ñоздаваемого архива"
+
+msgid "[OPTION]... DEST"
+msgstr "[ПÐРÐМЕТР]... ÐÐЗÐÐЧЕÐИЕ"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "Ñоздать неверÑионируемую архивную копию ревизии из хранилища"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" По умолчанию иÑпользуетÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, ÑвлÑющаÑÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÐµÐ¼ рабочего\n"
+" каталога; иÑпользуйте -r/--rev чтобы указать другую ревизию."
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+" Тип архива выбираетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки на оÑнове раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°\n"
+" (можно переопределить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -t/--type)."
+
+msgid " Examples:"
+msgstr " Примеры::"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr " - Ñоздать zip-файл, Ñодержащий релиз 1.0::"
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr " hg archive -r 1.0 project-1.0.zip"
+
+msgid " - create a tarball excluding .hg files::"
+msgstr " - Ñоздать тарбол (tarball), иÑключив файлы .hg::"
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr " hg archive project.tar.gz -X \".hg*\""
+
+msgid " Valid types are:"
+msgstr " ДопуÑтимые типы:"
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+" :``files``: каталог Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ (по умолчанию)\n"
+" :``tar``: tar-архив, без ÑжатиÑ\n"
+" :``tbz2``: tar-архив, Ñжатый bzip2\n"
+" :``tgz``: tar-архив, Ñжатый gzip\n"
+" :``uzip``: zip-архив, без ÑжатиÑ\n"
+" :``zip``: zip-архив, Ñжатый"
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+" Точное Ð¸Ð¼Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð° или каталога задаетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ форматирующей\n"
+" Ñтроки; Ñм. :hg:`help export`."
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+" К каждому Ñлементу архива добавлÑетÑÑ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð² виде имени\n"
+" каталога. ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¼Ð¾Ð¶ÐµÑ‚ быть задан в виде форматирующей Ñтроки\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -p/--prefix. По умолчанию Ñто ÑобÑтвенное Ð¸Ð¼Ñ Ð°Ñ€Ñ…Ð¸Ð²Ð°,\n"
+" Ñ Ð¾Ñ‚Ñ€ÐµÐ·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ ÑуффикÑами."
+
+msgid "no working directory: please specify a revision"
+msgstr "нет рабочего каталога: пожалуйÑта, укажите ревизию"
+
+msgid "repository root cannot be destination"
+msgstr "корень хранилища не может быть назначением"
+
+msgid "cannot archive plain files to stdout"
+msgstr "не могу архивировать обычный каталог в stdout"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "Ñлить Ñо Ñтарым родителем поÑле завершениÑ"
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "Ð²Ñ‹Ð±Ð¸Ñ€Ð°ÐµÐ¼Ð°Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¿Ñ€Ð¸ отмене ÑлиÑÐ½Ð¸Ñ (УСТÐРЕЛО)"
+
+msgid "revision to backout"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[ПÐРÐМЕТР]... [-r] РЕВИЗИЯ"
+
+msgid "reverse effect of earlier changeset"
+msgstr "отменить Ñффект более раннего набора изменений"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" Создает в текущем рабочем каталоге новый набор изменений, который\n"
+" имеет Ñффект отмены изменений РЕВИЗИИ."
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+" ЕÑли РЕВИЗИЯ - родитель рабочего каталога, то Ñозданный набор\n"
+" изменений фикÑируетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки. Ð’ противном Ñлучае Mercurial\n"
+" проводит ÑлиÑние изменений, результат ÑлиÑÐ½Ð¸Ñ Ð¾ÑтаетÑÑ\n"
+" незафикÑированным."
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+" .. note::\n"
+" backout не может иÑпользоватьÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾\n"
+" или некорректного ÑлиÑниÑ."
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+" По умолчанию, Ñозданный набор изменений будет иметь одного\n"
+" родителÑ, что ÑохранÑет линейную иÑториÑ. ЕÑли указан --merge,\n"
+" он будет иметь двух родителей: предыдущего Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾\n"
+" каталога и новую дочернюю ревизию РЕВИЗИИ, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¾Ñто\n"
+" отменÑет ее дейÑтвие."
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+" До верÑии 1.7 поведение без --merge было Ñквивалентно поведению\n"
+" Ñ --merge Ñ Ð¿Ð¾Ñледующим :hg:`update --clean .` Ñ Ñ†ÐµÐ»ÑŒÑŽ отменить\n"
+" ÑлиÑние и оÑтавить дочернюю ревизию РЕВИЗИИ как голову длÑ\n"
+" Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ³Ð¾ ÑлиÑниÑ"
+
+msgid "please specify just one revision"
+msgstr "пожалуйÑта, укажите ровно одну ревизию"
+
+msgid "please specify a revision to backout"
+msgstr "пожалуйÑта, укажите ревизию Ð´Ð»Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ñ‹"
+
+msgid "cannot backout change on a different branch"
+msgstr "не могу отменить ревизию на другой ветке"
+
+msgid "cannot backout a change with no parents"
+msgstr "не могу отменить ревизию без родителей"
+
+msgid "cannot backout a merge changeset"
+msgstr "не могу отменить ревизию ÑлиÑниÑ"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --parent Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸, не ÑвлÑющейÑÑ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼ ÑлиÑниÑ"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s отменÑет ревизию %s\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "ÑлиÑние Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸ÐµÐ¹ %s\n"
+
+msgid "reset bisect state"
+msgstr "ÑброÑить поиÑк"
+
+msgid "mark changeset good"
+msgstr "пометить ревизию как хорошую"
+
+msgid "mark changeset bad"
+msgstr "пометить ревизию как плохую"
+
+msgid "skip testing changeset"
+msgstr "пропуÑтить теÑтирование набора изменений"
+
+msgid "extend the bisect range"
+msgstr "раÑширить диапазон поиÑка"
+
+msgid "use command to check changeset state"
+msgstr "иÑпользовать команду Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ ÑоÑтоÑÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений"
+
+msgid "do not update to target"
+msgstr "не обновлÑÑ‚ÑŒÑÑ Ð´Ð¾ целевой ревизии"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c КОМÐÐДÐ] [РЕВИЗИЯ]"
+
+msgid "subdivision search of changesets"
+msgstr "поиÑк ревизии методом Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿Ð¾Ð»Ð°Ð¼"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" Эта команда полезна при поиÑке ревизии, в которой была внеÑена\n"
+" ошибка. Ð”Ð»Ñ Ñтого ÑÐ°Ð¼Ð°Ñ Ñ€Ð°Ð½Ð½ÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, про которую извеÑтно, что\n"
+" она Ñодержит ошибку, помечаетÑÑ ÐºÐ°Ðº плохаÑ, поÑле чего ÑамаÑ\n"
+" позднÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, не ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ñту ошибку, помечаетÑÑ ÐºÐ°Ðº хорошаÑ.\n"
+" Bisect обновит рабочий каталог до ревизии Ð´Ð»Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (еÑли\n"
+" не указан -U/--update). ПоÑле того, как теÑÑ‚Ñ‹ проведены, ревизиÑ\n"
+" помечаетÑÑ ÐºÐ°Ðº Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð»Ð¸ Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð² завиÑимоÑти от результата, и\n"
+" bisect либо обновит каталог до новой ревизии-кандидата, либо\n"
+" объÑвит, что нашел плохую ревизию."
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Ð”Ð»Ñ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ñти можно также иÑпользовать номер ревизии в качеÑтве\n"
+" параметра, чтобы пометить ревизию как плохую или хорошую, не\n"
+" обновлÑÑ Ð´Ð¾ нее предварительно рабочий каталог."
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" The environment variable HG_NODE will contain the ID of the\n"
+" changeset being tested. The exit status of the command will be\n"
+" used to mark revisions as good or bad: status 0 means good, 125\n"
+" means to skip the revision, 127 (command not found) will abort the\n"
+" bisection, and any other non-zero exit status means the revision\n"
+" is bad."
+msgstr ""
+" ЕÑли вы укажите команду, она будет иÑпользована Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой\n"
+" биÑекции. ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ HG_NODE будет Ñодержать ID теÑтируемой\n"
+" ревизии. Код возврата команды будет иÑпользован чтобы пометить ревизию\n"
+" как плохую или хорошую: код 0 - хорошаÑ, код 125 означает пропуÑтить\n"
+" ревизию, 127 (команда не найдена) отменÑет поиÑк, любой другой\n"
+" код возврата означает плохую ревизию."
+
+msgid " Some examples:"
+msgstr " ÐеÑколько примеров::"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr " - начать биÑекцию Ñ Ð¸Ð·Ð²ÐµÑтной плохой ревизией 12, хорошей 34::"
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+
+msgid ""
+" - advance the current bisection by marking current revision as good "
+"or\n"
+" bad::"
+msgstr ""
+" - продвинуть текущую биÑекцию, пометив текущую ревизию как плохую или "
+"хорошую::"
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+" hg bisect --good\n"
+" hg bisect --bad"
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+" - пометить текущую или извеÑтную ревизию Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑка (например,\n"
+" потому что ее Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать из-за другой проблемы)::"
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+
+msgid " - forget the current bisection::"
+msgstr " - забыть текущую биÑекцию::"
+
+msgid " hg bisect --reset"
+msgstr " hg bisect --reset"
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+" - иÑпользовать команду 'make && make tests' Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкого\n"
+" поиÑка первой нерабочей ревизии::"
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr ""
+" - поÑмотреть вÑе наборы изменений, чьи ÑоÑтоÑÐ½Ð¸Ñ ÑƒÐ¶Ðµ извеÑтны в\n"
+" текущей биÑекции::"
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr " hg log -r \"bisect(pruned)\""
+
+msgid ""
+" - see the changeset currently being bisected (especially useful\n"
+" if running with -U/--noupdate)::"
+msgstr ""
+" - поÑмотреть ревизию, над которой в данный момент выполнÑетÑÑ "
+"биÑекциÑ\n"
+" (оÑобенно полезно при запуÑке Ñ -U/--noupdate)::"
+
+msgid " hg log -r \"bisect(current)\""
+msgstr " hg log -r \"bisect(current)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr ""
+" - поÑмотреть вÑе наборы изменений, которые учаÑтвовали в текущей "
+"биÑекции::"
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr ""
+" - Ñ Ñ€Ð°Ñширением graphlog, вы даже можете получить Ñимпатичный граф::"
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr " hg log --graph -r \"bisect(range)\""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr " Подробнее о `bisect()` Ñм. :hg:`help revsets`."
+
+msgid "The first good revision is:\n"
+msgstr "ÐŸÐµÑ€Ð²Ð°Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "ÐŸÐµÑ€Ð²Ð°Ñ Ð¿Ð»Ð¾Ñ…Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+"Ðе вÑе предки Ñтого набора изменений были проверены.\n"
+"ИÑпользуйте bisect --extend чтобы продолжить поиÑк\n"
+"от общей родительÑкой ревизии %s.\n"
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr "Из-за пропущенных ревизий, первой хорошей может быть Ð»ÑŽÐ±Ð°Ñ Ð¸Ð·:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr "Из-за пропущенных ревизий, первой плохой может быть Ð»ÑŽÐ±Ð°Ñ Ð¸Ð·:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "не могу поделить пополам (нет извеÑтных хороших ревизий)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "не могу поделить пополам (нет извеÑтных плохих ревизий)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(иÑпользование 'hg bisect <cmd>' уÑтарело)\n"
+
+msgid "incompatible arguments"
+msgstr "неÑовмеÑтимые аргументы"
+
+msgid "current bisect revision is unknown - start a new bisect to fix"
+msgstr "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð±Ð¸Ñекции неизвеÑтна - начните биÑекцию заново"
+
+msgid "current bisect revision is a merge"
+msgstr "Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð±Ð¸ÑÐµÐºÑ†Ð¸Ñ ÑвлÑетÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸ÐµÐ¹ ÑлиÑниÑ"
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "не удалоÑÑŒ выполнить %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s завершен (killed)"
+
+#, python-format
+msgid "changeset %d:%s: %s\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "РаÑширÑем поиÑк до ревизии %d:%s\n"
+
+msgid "nothing to extend"
+msgstr "некуда раÑширÑÑ‚ÑŒ поиÑк"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "ТеÑтирование ревизии %d:%s (%d ревизий оÑталоÑÑŒ, ~%d теÑтов)\n"
+
+msgid "force"
+msgstr "принудительно"
+
+msgid "delete a given bookmark"
+msgstr "удалить указанную закладку"
+
+msgid "rename a given bookmark"
+msgstr "переименовать указанную закладку"
+
+msgid "mark a bookmark inactive"
+msgstr "пометить закладку как неактивную"
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m ИМЯ] [-r РЕВИЗИЯ] [ИМЯ]"
+
+msgid "track a line of development with movable markers"
+msgstr "отÑлеживать ветку разработки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ подвижных меток"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when committing.\n"
+" Bookmarks are local. They can be renamed, copied and deleted. It is\n"
+" possible to use :hg:`merge NAME` to merge from a given bookmark, and\n"
+" :hg:`update NAME` to update to a given bookmark."
+msgstr ""
+" Закладки (bookmarks) - Ñто указатели на некоторую ревизию, которые\n"
+" перемещаютÑÑ Ð¿Ñ€Ð¸ фикÑации.Их можно переименовывать копировать и "
+"удалÑÑ‚ÑŒ.\n"
+" Можно иÑпользовать Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸ в :hg:`merge ИМЯ` Ð´Ð»Ñ ÑлиÑние от "
+"указанной\n"
+" закладки и :hg:`update ИМЯ` Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° заданную закладку."
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" ИÑпользуйте :hg:`bookmark ИМЯ` чтобы Ñоздать закладку Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼\n"
+" именем на родительÑкую ревизию рабочего каталога. ЕÑли указываетÑÑ\n"
+" -r РЕВИЗИЯ (где РЕВИЗИЯ может также быть ÑущеÑтвующей закладкой),\n"
+" закладка будет указывать на Ñту ревизию."
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled."
+msgstr ""
+" Закладки могут передаватьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ хранилищами Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команд\n"
+" push и pull (Ñм. :hg:`help push` и :hg:`help pull). Ð”Ð»Ñ Ñтого\n"
+" необходимо, чтобы отдалённое и локальное хранилище поддерживали\n"
+" закладки. Ð”Ð»Ñ Mercurial верÑий меньше 1.8 Ñто означает, что\n"
+" должно быть включено раÑширение bookmarks.\n"
+" "
+
+msgid ""
+" With -i/--inactive, the new bookmark will not be made the active\n"
+" bookmark. If -r/--rev is given, the new bookmark will not be made\n"
+" active even if -i/--inactive is not given. If no NAME is given, the\n"
+" current active bookmark will be marked inactive.\n"
+" "
+msgstr ""
+" ЕÑли указан -i/--inactive, Ð½Ð¾Ð²Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° не будет Ñделана активной.\n"
+" ЕÑли указан -r/--rev, Ð½Ð¾Ð²Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° не будет активной, даже еÑли\n"
+" -i/--inactive не задан. ЕÑли не указано ИМЯ, Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ°\n"
+" будет помечена как неактивнаÑ. "
+
+msgid "bookmark name required"
+msgstr "укажите Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸"
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "закладки '%s' не ÑущеÑтвует"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "закладка '%s' уже ÑущеÑтвует (-f - принудительно) "
+
+msgid "new bookmark name required"
+msgstr "укажите новое Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸ не может Ñодержать Ñимвол перевода Ñтроки"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸ не может ÑоÑтоÑÑ‚ÑŒ из одних пробелов"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "закладка не может называтьÑÑ Ñ‚Ð°Ðº же, как ÑущеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð²ÐµÑ‚ÐºÐ°"
+
+msgid "no bookmarks set\n"
+msgstr "нет ни одной закладки\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "иÑпользовать Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, даже еÑли оно Ñкрывает уже ÑущеÑтвующую ветку"
+
+msgid "reset branch name to parent branch name"
+msgstr "ÑброÑить Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ до имени ветки родителÑ"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [ИМЯ]"
+
+msgid "set or show the current branch name"
+msgstr "задать или показать Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ ветки"
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent and global. Use :hg:`bookmark` to create "
+"a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+" .. note::\n"
+" Имена веток поÑтоÑнны и глобальны. ИÑпользуйте :hg:`bookmark`,\n"
+" чтобы Ñоздать легковеÑную закладку. Дополнительную\n"
+" информацию о ветках и закладках Ñм. в :hg:`help glossary`."
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" Без аргументов показывает Ð¸Ð¼Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ ветки. С одним аргументом\n"
+" задает Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога (ветка не будет Ñоздана\n"
+" в хранилище до Ñледующей фикÑации). РекомендуетÑÑ Ð²ÐµÑти оÑновную\n"
+" разработку в ветке 'default'."
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" ЕÑли не указан -f/--force, branch не даÑÑ‚ вам задать имÑ\n"
+" ÑущеÑтвующей ветки, даже еÑли она не активна."
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" ИÑпользуйте -C/--clean чтобы уÑтановить ветку рабочего каталога\n"
+" такой же, как ветка его родителÑ, отменÑÑ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÑƒÑŽ Ñмену ветки."
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" ИÑпользуйте команду :hg:`update` чтобы переключитьÑÑ Ð½Ð° ÑущеÑтвующую\n"
+" ветку. ИÑпользуйте :hg:`commit --close-branch` чтобы пометить Ñту\n"
+" ветку как закрытую."
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "рабочий каталог Ñброшен на ветку %s\n"
+
+msgid "a branch of the same name already exists"
+msgstr "ветка Ñ Ñ‚Ð°ÐºÐ¸Ð¼ именем уже ÑущеÑтвует"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "иÑпользуйте 'hg update' чтобы переключитьÑÑ Ð½Ð° нее"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "рабочий каталог помечен как ветка %s\n"
+
+msgid "(branches are permanent and global, did you want a bookmark?)\n"
+msgstr ""
+"(ветки (branch) глобальны и перманентны, быть может, вам нужна\n"
+"закладка (bookmark?)\n"
+
+msgid "show only branches that have unmerged heads"
+msgstr "показывать только ветки, на которых еÑÑ‚ÑŒ неÑлитые головы"
+
+msgid "show normal and closed branches"
+msgstr "показывать обычные и закрытые ветки"
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "list repository named branches"
+msgstr "перечиÑлить именованные ветки в хранилище"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" ПеречиÑлÑет именованные ветки в хранилище, выделÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ðµ.\n"
+" ЕÑли указан -c/--close, печатает также ветки, помеченные как\n"
+" закрытые (Ñм. :hg:`commit --close-branch`)."
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" ЕÑли указан -a/--active, показывает только активные ветки. Ветка\n"
+" ÑчитаетÑÑ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹, еÑли она Ñодержит головные ревизии."
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+" ИÑпользуйте :hg:`update` чтобы переключитьÑÑ Ð½Ð° ÑущеÑтвующую ветку."
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+" Возвращает 0.\n"
+" "
+
+msgid " (closed)"
+msgstr " (закрыта)"
+
+msgid " (inactive)"
+msgstr " (неактивна)"
+
+msgid "run even when the destination is unrelated"
+msgstr "работать даже еÑли хранилище не ÑвÑзано Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ назначениÑ"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "набор изменений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² хранилище назначениÑ"
+
+msgid "a specific branch you would like to bundle"
+msgstr "ветка Ð´Ð»Ñ ÑƒÐ¿Ð°ÐºÐ¾Ð²ÐºÐ¸"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr ""
+"базовый набор изменений, который предполагаетÑÑ Ð´Ð¾Ñтупным в хранилище "
+"назначениÑ"
+
+msgid "bundle all changesets in the repository"
+msgstr "упаковать вÑе ревизии в хранилище"
+
+msgid "bundle compression type to use"
+msgstr "тип ÑжатиÑ"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t ТИП] [-a] [-r РЕВИЗИЯ]... [--base РЕВИЗИЯ]... ФÐЙЛ [ÐÐЗÐ]"
+
+msgid "create a changegroup file"
+msgstr "Ñоздать файл Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹ наборов изменений"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+" Создает Ñжатый файл, Ñодержащий группу наборов изменений, которые\n"
+" отÑутÑтвуют в другом хранилище."
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+" ЕÑли хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿ÑƒÑ‰ÐµÐ½Ð¾, то Mercurial предполагает,\n"
+" что там имеютÑÑ Ð²Ñе ревизии, до указанной в --base. Чтобы Ñоздать\n"
+" файл, Ñодержащий вÑе наборы изменений, иÑпользуйте -a/--all\n"
+" (или --base null)."
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+" СпоÑоб ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра -t/--type.\n"
+" ДоÑтупные методы ÑжатиÑ: без ÑÐ¶Ð°Ñ‚Ð¸Ñ (none), bzip2, gzip\n"
+" (по умолчанию иÑпользуетÑÑ bzip2)."
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+" Файл Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹ изменений (bundle) может быть передан обычными\n"
+" ÑредÑтвами, или применен в другом хранилище Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команд\n"
+" unbundle или pull. Это полезно когда команды push и pull напрÑмую\n"
+" недоÑтупны или когда Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð²Ñего хранилища нежелательна."
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+" Применение групп изменений ÑохранÑет вÑе атрибуты наборов\n"
+" изменений, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ñ€Ð°Ð²Ð° доÑтупа, информацию о копировании/\n"
+" переименовании и иÑторию ревизий."
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" Возвращает 0 в Ñлучае уÑпеха, 1 еÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ найдены\n"
+" "
+
+msgid "unknown bundle type specified with --type"
+msgstr "неизвеÑтный ÑпоÑоб задан в --type"
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ указывать --base и хранилище назначениÑ"
+
+msgid "print output to file with formatted name"
+msgstr "печатать в файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑоглаÑно ФОРМÐТУ"
+
+msgid "print the given revision"
+msgstr "напечатать заданную ревизию"
+
+msgid "apply any matching decode filter"
+msgstr "декодировать любым подходÑщим фильтром"
+
+msgid "[OPTION]... FILE..."
+msgstr "[ПÐРÐМЕТР]... ФÐЙЛ..."
+
+msgid "output the current or given revision of files"
+msgstr "напечатать текущую или заданную ревизию файлов"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Печатает Ñодержимое указанных файлов, каким оно было на момент\n"
+" указанной ревизии. ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ указана, иÑпользуетÑÑ\n"
+" родительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога или Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip),\n"
+" еÑли рабочий каталог пуÑÑ‚."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" Можно печатать в файл, в Ñтом Ñлучае его Ð¸Ð¼Ñ Ð·Ð°Ð´Ð°ÐµÑ‚ÑÑ Ð² виде\n"
+" форматирующей Ñтроки. Формат Ñтроки такой же, как в команде export,\n"
+" Ñо Ñледующими дополнениÑми:"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: базовое Ð¸Ð¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÐµÐ¼Ð¾Ð³Ð¾ файла\n"
+" :``%d``: Ð¸Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° печатаемого файла или '.', еÑли файл в корне\n"
+" :``%p``: путь к печатаемому файлу отноÑительно ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°"
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "клон будет включать пуÑтой рабочий каталог (только хранилище)"
+
+msgid "revision, tag or branch to check out"
+msgstr "ревизиÑ, метка или ветка на которую обновитьÑÑ"
+
+msgid "include the specified changeset"
+msgstr "включить указанный набор изменений"
+
+msgid "clone only the specified branch"
+msgstr "клонировать только указанную ветку"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[ПÐРÐМЕТР]... ИСТОЧÐИК [ÐÐЗÐ]"
+
+msgid "make a copy of an existing repository"
+msgstr "Ñоздать копию ÑущеÑтвующего хранилища"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Создает копию ÑущеÑтвующего хранилища в новом каталоге."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" ЕÑли каталог Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ задан, иÑпользуетÑÑ Ð±Ð°Ð·Ð¾Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ\n"
+" имени каталога иÑточника."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" ÐÐ´Ñ€ÐµÑ Ð¸Ñточника добавлÑетÑÑ Ð² файл ``.hg/hgrc`` нового хранилища,\n"
+" и иÑпользуетÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð¿Ð¾Ñледующих затÑгиваний."
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+" Ð’ качеÑтве путей Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ локальные пути и\n"
+" URL вида ``ssh://``. Ð”Ð»Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ``ssh://`` не ÑоздаетÑÑ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ¹\n"
+" копии или файла ``.hg/hgrc`` на отдаленной Ñтороне."
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+" Чтобы затÑнуть подмножеÑтво наборов изменений, укажите один или более\n"
+" идентификатор ревизии Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r/--rev или ветки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒ -b/--"
+"branch.\n"
+" Клон будет Ñодержать только заданные ревизии и их предков. Эти "
+"параметры\n"
+" (равно как и `clone иÑÑ‚#рев назн') подразумевают --pull, даже Ð´Ð»Ñ "
+"локальных\n"
+" иÑходных хранилищ. Обратите внимание, что при задании метки, клон будет\n"
+" включать в ÑÐµÐ±Ñ Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ñ‹Ð¹ набор изменений, но не набор изменений,\n"
+" Ñодержащий метку."
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+" Чтобы извлечь конкретную верÑию, иÑпользуйте -u/--update;\n"
+" чтобы Ñоздать клон без рабочего каталога, иÑпользуйте -U/--noupdate."
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" Из Ñоображений ÑффективноÑти при клонировании иÑточника находÑщегоÑÑ\n"
+" на одной файловой ÑиÑтеме Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ÐµÐ¼ назначениÑ, иÑпользуютÑÑ "
+"жеÑткие\n"
+" ÑÑылки (Ñто отноÑитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ к данным хранилища, не рабочему "
+"каталогу).\n"
+" Ðекоторые файловые ÑиÑтемы, например, AFS, некорректно реализуют\n"
+" жеÑткие ÑÑылки, но не Ñообщают об ошибках. Ð’ Ñтом Ñлучае иÑпользуйте\n"
+" --pull чтобы избежать жеÑтких ÑÑылок."
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" Ð’ некоторых ÑлучаÑÑ… можно клонировать хранилища и рабочие\n"
+" каталоги целиком жеÑткими ÑÑылками ::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al ХРÐÐИЛИЩЕ КЛОÐ"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" Это Ñамый быÑтрый ÑпоÑоб клонированиÑ, но он не вÑегда безопаÑен.\n"
+" Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ атомарна (вам надо Ñледить за тем, что ХРÐÐИЛИЩЕ\n"
+" не изменÑетÑÑ Ð² процеÑÑе копированиÑ), и вам надо убедитьÑÑ, что\n"
+" ваш редактор умеет разрывать жеÑткие ÑÑылки (Emacs и большинÑтво\n"
+" инÑтрументов разработчика Ñдра Linux умеют). Этот ÑпоÑоб также\n"
+" не ÑовмеÑтим Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ раÑширениÑми, которые хранÑÑ‚ Ñвои\n"
+" метаданные в каталоге .hg, таких как mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial обновит рабочий каталог до первой подходÑщей ревизии по\n"
+" ÑпиÑку:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" а) пуÑтой каталог, еÑли в иÑточнике нет наборов изменений или указан -"
+"U\n"
+" б) еÑли указано -u . и иÑточник локален, до первого Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ "
+"рабочей копии иÑточника\n"
+" в) ревизиÑ, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² -u (еÑли Ñто Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, то до головной "
+"ревизии\n"
+" Ñтой ветки)\n"
+" г) до ревизии, указанной Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r\n"
+" д) до оконечной головной ревизии указанной в -b\n"
+" е) до оконечной головной ревизии заданной как url#ветка\n"
+" ж) до оконечной головной ревизии ветки default\n"
+" з) до оконечной ревизии"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr ""
+" - Ñоздать клон отдаленного хранилища в новом каталоге Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ hg/::"
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr " - Ñоздать легковеÑный локальный клон::"
+
+msgid " hg clone project/ project-feature/"
+msgstr " hg clone project/ project-feature/"
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+" - клонировать хранилище по абÑолютному пути на ssh-Ñервере\n"
+" (обратите внимание на двойной ÑлÑш)::"
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr " hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr ""
+" - выполнить быÑтрое клонирование по локальной Ñети Ñ Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸ÐµÐ¼\n"
+" указанной ревизии::"
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr " hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr ""
+" - Ñоздать хранилище без наборов изменений поÑле заданной ревизии::"
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr " hg clone -r 04e544 experimental/ good/"
+
+msgid " - clone (and track) a particular named branch::"
+msgstr " - клонировать (и отÑлеживать) указанную именованную ветку::"
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr " hg clone http://selenic.com/hg#stable"
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " Подробнее о задании URL хранилища Ñм. :hg:`help urls`."
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --noupdate и --updaterev одновременно"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+"пометить новые/недоÑтающие файлы как добавленные/удаленные перед фикÑацией"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "пометить ветку как закрытую, Ñкрыть ее из ÑпиÑка веток"
+
+msgid "amend the parent of the working dir"
+msgstr "иÑправить родительÑкую ревизию рабочего каталога"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "зафикÑировать указанные файлы или вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" ЗафикÑировать указанные файлы в хранилище. Ð’ отличие от\n"
+" централизованных SCM, Ñто Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ. См.\n"
+" :hg:`push` чтобы узнать, как опубликовать Ñвои изменениÑ."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" ЕÑли ÑпиÑок файлов опущен, будут зафикÑированы вÑе изменениÑ, которые\n"
+" показывает :hg:`status`."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" ЕÑли вы фикÑируете результат ÑлиÑниÑ, не указывайте никаких\n"
+" файлов или фильтров в -I/-X."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" ЕÑли не указано Ñообщение фикÑации, Mercurial запуÑтит ваш\n"
+" наÑтроенный редактор, где можно ввеÑти Ñообщение. ЕÑли при\n"
+" фикÑации ÑлучаетÑÑ Ñбой, копию ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ найти в \n"
+" ``.hg/last-message.txt``."
+
+msgid ""
+" The --amend flag can be used to amend the parent of the\n"
+" working directory with a new commit that contains the changes\n"
+" in the parent in addition to those currently reported by :hg:`status`,\n"
+" if there are any. The old commit is stored in a backup bundle in\n"
+" ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+" on how to restore it)."
+msgstr ""
+" Флаг --amend может быть иÑпользован Ð´Ð»Ñ Ð²Ð½ÐµÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð¿Ñ€Ð°Ð²Ð¾Ðº в "
+"родительÑкую\n"
+" ревизию рабочего каталога Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ еще одной операции фикÑации,\n"
+" Ñодержащей Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкой ревизии в дополнении к тем,\n"
+" которые показываютÑÑ :hg:`status` (еÑли таковые имеютÑÑ). РезервнаÑ\n"
+" ÐºÐ¾Ð¿Ð¸Ñ Ñтарого набора изменений будет Ñохранена в виде комплекта в\n"
+" ``.hg/strip-backup`` (о том, как его воÑÑтановить, Ñм.\n"
+" :hg:`help bundle` и :hg:`help unbundle`)."
+
+msgid ""
+" Message, user and date are taken from the amended commit unless\n"
+" specified. When a message isn't specified on the command line,\n"
+" the editor will open with the message of the amended commit."
+msgstr ""
+" Сообщение фикÑации, Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ дата берутÑÑ Ð¸Ð· изменÑемой\n"
+" ревизии, еÑли они Ñвно не заданы. ЕÑли Ñообщение фикÑации не указано в\n"
+" командной Ñтроке, откроетÑÑ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€ Ñ Ñообщением изменÑемой ревизии."
+
+msgid ""
+" It is not possible to amend public changesets (see :hg:`help phases`)\n"
+" or changesets that have children."
+msgstr ""
+" ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ опубликованный набор изменений (Ñм. :hg:`help phases`),\n"
+" а также набор изменений, имеющий потомков."
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" Возвращает 0 при уÑпехе, 1 еÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ зафикÑированы.\n"
+" "
+
+msgid "can only close branch heads"
+msgstr "можно закрыть только головную ревизию ветки"
+
+msgid "cannot amend recursively"
+msgstr "невозможно иÑправлÑÑ‚ÑŒ рекурÑивно"
+
+msgid "cannot amend public changesets"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸ÑправлÑÑ‚ÑŒ публичные ревизии"
+
+msgid "cannot amend merge changesets"
+msgstr "невозможно иÑправить ревизии ÑлиÑниÑ"
+
+msgid "cannot amend while merging"
+msgstr "невозможно иÑправлÑÑ‚ÑŒ во Ð²Ñ€ÐµÐ¼Ñ ÑлиÑниÑ"
+
+msgid "cannot amend changeset with children"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸ÑправлÑÑ‚ÑŒ ревизию, имеющую потомков"
+
+msgid "nothing changed\n"
+msgstr "нет изменений\n"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr "нет изменений (%d файлов отÑутÑтвует, Ñм. 'hg status')\n"
+
+msgid "created new head\n"
+msgstr "Ñоздана Ð½Ð¾Ð²Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð°\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "повторно открываю головную ревизию %d закрытой ветки\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "зафикÑирован набор изменений %d:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr "запиÑать копирование, которое было проведено ранее"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "перезапиÑывать ÑущеÑтвующие контролируемые файлы"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[ПÐРÐМЕТР]... [ИСТОЧÐИК]... ÐÐЗÐ"
+
+msgid "mark files as copied for the next commit"
+msgstr "пометить файл как Ñкопированный при Ñледующей фикÑации"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+" Помечает файл Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ðº копию иÑточника. ЕÑли ÐÐЗÐÐЧЕÐИЕ -\n"
+" каталог, копии помещаютÑÑ Ñ‚ÑƒÐ´Ð°. ЕÑли ÐÐЗÐÐЧЕÐИЕ - файл, иÑточник\n"
+" должен быть одним файлом."
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+" По умолчанию Ñта команда копирует Ñодержимое файлов в том виде,\n"
+" как они ÑущеÑтвуют в рабочем каталоге. ЕÑли указан -A/--after,\n"
+" Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ³Ð¸ÑтрируетÑÑ, но ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ производитÑÑ."
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" ДейÑтвие Ñтой команды закреплÑетÑÑ Ð¿Ñ€Ð¸ Ñледующей фикÑации. Чтобы\n"
+" отменить копирование, Ñм. :hg:`revert`."
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Возвращает 0 при уÑпехе, 1 при ошибке.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[СПИСОК] РЕВИЗИЯ1 РЕВИЗИЯ2"
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "найти родительÑкую ревизию двух ревизий в указанном ÑпиÑке"
+
+msgid "either two or three arguments required"
+msgstr "требуютÑÑ Ð´Ð²Ð° или три аргумента"
+
+# {{{ Debug commands
+# NOT-SURE
+msgid "add single file mergeable changes"
+msgstr "добавить единÑтвенный файл, объединÑющий изменениÑ"
+
+msgid "add single file all revs overwrite"
+msgstr "добавить единÑтвенный файл, перезапиÑываемый во вÑех ревизиÑÑ…"
+
+msgid "add new file at each rev"
+msgstr "добавлÑÑ‚ÑŒ новый файл в каждой ревизии"
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[ПÐРÐМЕТР]... [ТЕКСТ]..."
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr "поÑтроить хранилище по данному графу в текущем пуÑтом хранилище"
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+" ОпиÑание графа читаетÑÑ Ñо Ñтандартного ввода, еÑли оно не задано\n"
+" в командной Ñтроке."
+
+msgid " Elements:"
+msgstr " Элементы:"
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+" - \"+n\" - Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¿Ð¾ÑледовательноÑÑ‚ÑŒ из n узлов, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° "
+"текущем родителе по умолчанию\n"
+" - \".\" - один узел, оÑнованный на текущем родителе по умолчанию\n"
+" - \"$\" ÑбраÑывает Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾ умолчанию на null (подразумеваетÑÑ Ð² "
+"начале);\n"
+" в противном Ñлучае родителем по умолчанию ÑвлÑетÑÑ Ð¿Ð¾Ñледний\n"
+" Ñозданный узел\n"
+" - \"<p\" уÑтанавливает Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾ умолчанию в обратную ÑÑылку "
+"(backref) на p\n"
+" - \"*p\" - разветвление в родителе p, который ÑвлÑетÑÑ backref\n"
+" - \"*p1/p2\" - ÑлиÑние родителей p1 и p2, которые ÑвлÑÑŽÑ‚ÑÑ backref\n"
+" - \"/p2\" - ÑлиÑние предыдущего узла и p2\n"
+" - \":tag\" задает локальную метку Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰ÐµÐ³Ð¾ узла\n"
+" - \"@branch\" уÑтанавливает именованную ветку Ð´Ð»Ñ Ð¿Ð¾Ñледующих узлов\n"
+" - \"#...\\n\" - комментарий до конца Ñтроки"
+
+# syntax highlight off ;) />
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+" Пробельные Ñимволы между вышеперечиÑленными Ñлементами игнорируютÑÑ."
+
+msgid " A backref is either"
+msgstr " Backref Ñто"
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+" - чиÑло n, которое ÑÑылаетÑÑ Ð½Ð° узел curr-n, где curr - текущий узел\n"
+" или\n"
+" - Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹ метки, заданной ранее Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ \":tag\"\n"
+" или\n"
+" - пуÑтое значение, означающее Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ð¾ умолчанию."
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+" Ð’Ñе значениÑ-Ñтроки должны быть либо Ñтрого буквенно-цифровыми, либо\n"
+" заключатьÑÑ Ð² двойные кавычки (\"...\") и иÑпользовать \"\\\" в\n"
+" качеÑтве Ñкранирующего Ñимвола."
+
+msgid "reading DAG from stdin\n"
+msgstr "читаем граф Ñо Ñтандартного ввода\n"
+
+msgid "repository is not empty"
+msgstr "хранилище не пуÑтое"
+
+msgid "building"
+msgstr "поÑтроение"
+
+msgid "show all details"
+msgstr "показать вÑе детали"
+
+msgid "lists the contents of a bundle"
+msgstr "напечатать Ñодержимое комплекта (bundle)"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "проверить корректноÑÑ‚ÑŒ текущего dirstate"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s в ÑоÑтоÑнии %s, но не в манифеÑте1\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s в ÑоÑтоÑнии %s, а также в манифеÑте1\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s в ÑоÑтоÑнии %s, но ни в одном из манифеÑтов\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr "%s в манифеÑте1, но перечиÑлен в ÑоÑтоÑнии %s"
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ".hg/dirstate не ÑоглаÑуетÑÑ Ñ Ð¼Ð°Ð½Ð¸Ñ„ÐµÑтом текущего родителÑ"
+
+msgid "[COMMAND]"
+msgstr "[КОМÐÐДÐ]"
+
+msgid "list all available commands and options"
+msgstr "перечиÑлить вÑе доÑтупные команды и параметры"
+
+msgid "show the command options"
+msgstr "показать параметры команды"
+
+msgid "[-o] CMD"
+msgstr "[-o] КОМÐÐДÐ"
+
+msgid "returns the completion list associated with the given command"
+msgstr "возвращает ÑпиÑок дополнениÑ, аÑÑоциированный Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ командой"
+
+msgid "use tags as labels"
+msgstr "иÑпользовать метки Mercurial в качеÑтве маркировки"
+
+msgid "annotate with branch names"
+msgstr "добавлÑÑ‚ÑŒ имена веток"
+
+msgid "use dots for runs"
+msgstr "Ñтавить точки Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð³Ð¾Ð½Ð¾Ð²"
+
+msgid "separate elements by spaces"
+msgstr "разделÑÑ‚ÑŒ Ñлементы пробелами"
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[ПÐРÐМЕТР]... [ФÐЙЛ [РЕВИЗИЯ]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr "показать журнал изменений или граф индекÑов в кратком текÑтовом виде"
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+" ЕÑли вы передадите Ð¸Ð½Ð´ÐµÐºÑ revlog, отображаетÑÑ Ð³Ñ€Ð°Ñ„ revlog. ЕÑли вы\n"
+" укажете номера ревизий, они помечаютÑÑ ÐºÐ°Ðº rN."
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+" Ð’ противном Ñлучае, отображаетÑÑ Ð³Ñ€Ð°Ñ„ журнала изменений (changelog)\n"
+" текущего хранилища.\n"
+" "
+
+msgid "need repo for changelog dag"
+msgstr "Ð´Ð»Ñ Ð³Ñ€Ð°Ñ„Ð° иÑтории требуетÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ðµ "
+
+msgid "open changelog"
+msgstr "открыть журнал изменений (changelog)"
+
+msgid "open manifest"
+msgstr "открыть манифеÑÑ‚"
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|ФÐЙЛ РЕВИЗИЯ"
+
+msgid "dump the contents of a data file revision"
+msgstr "дамп Ñодержимого ревизии файла данных (data file)"
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr "неверный идентификатор ревизии %s"
+
+msgid "try extended date formats"
+msgstr "пробовать раÑширенные форматы даты"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] ДÐТР[ДИÐПÐЗОÐ]"
+
+msgid "parse and display a date"
+msgstr "разобрать и отобразить дату"
+
+msgid "use old-style discovery"
+msgstr "иÑпользовать обнаружение в Ñтаром Ñтиле"
+
+msgid "use old-style discovery with non-heads included"
+msgstr "иÑпользовать обнаружение в Ñтаром Ñтиле, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð½Ðµ-головы (non-heads)"
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr "[-l РЕВ] [-r РЕВ] [-b ВЕТКÐ]... [ДРУГОЙ]"
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr ""
+"запуÑкает протокол Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² изолированном окружении"
+
+msgid "parse and apply a fileset specification"
+msgstr "разобрать и применить Ñпецификацию набора файлов (fileset)"
+
+msgid "[PATH]"
+msgstr "[ПУТЬ]"
+
+msgid "show information detected about current filesystem"
+msgstr "показать Ñобранную информацию о текущей файловой ÑиÑтеме"
+
+msgid "id of head node"
+msgstr "идентификатор головного узла"
+
+msgid "id of common node"
+msgstr "идентификатор общего узла"
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr "ХРÐÐИЛИЩЕ ФÐЙЛ [-H|-C ИД]..."
+
+msgid "retrieves a bundle from a repo"
+msgstr "извлечь комплект (bundle) из хранилища"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+" Каждый идентификатор должен полным 16-ричным идентификатором узла.\n"
+" Комплект ÑохранÑетÑÑ Ð² заданный файл.\n"
+" "
+
+msgid "display the combined ignore pattern"
+msgstr "показать результирующий шаблон игнорированиÑ"
+
+msgid "no ignore patterns found"
+msgstr "шаблонов Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ найдено"
+
+msgid "revlog format"
+msgstr "формат revlog"
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr "[-f ФОРМÐТ] -c|-m|ФÐЙЛ"
+
+msgid "dump the contents of an index file"
+msgstr "дамп Ñодержимого файла индекÑа"
+
+#, python-format
+msgid "unknown format %d"
+msgstr "неизвеÑтный формат %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr "дамп графа индекÑов в виде dot-файла graphviz"
+
+msgid "test Mercurial installation"
+msgstr "протеÑтировать уÑтановка Mercurial"
+
+#, python-format
+msgid "checking encoding (%s)...\n"
+msgstr "проверка кодировки (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (проверьте правильноÑÑ‚ÑŒ уÑтановки локали)\n"
+
+#, python-format
+msgid "checking installed modules (%s)...\n"
+msgstr "проверка уÑтановленных модулей (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " Одно или более раÑширение не найдено"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (убедитеÑÑŒ, что вы Ñкомпилировали раÑширение)\n"
+
+#, python-format
+msgid "checking templates (%s)...\n"
+msgstr "проверка шаблонов (%s)...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr " (шаблоны, похоже, некорректно уÑтановлены)\n"
+
+msgid "checking commit editor...\n"
+msgstr "проверка редактора Ñообщений фикÑации...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr " Редактор Ñообщений не уÑтановлен и vi не доÑтупен в PATH\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr " (задайте редактор Ñообщений в вашем конфиге)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr " Редактор '%s' не доÑтупен в PATH\n"
+
+msgid "checking username...\n"
+msgstr "проверка имени пользователÑ...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (задайте Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² конфиге)\n"
+
+msgid "no problems detected\n"
+msgstr "проблем не обнаружено\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "Ðайдено %s проблем, пожалуйÑта, проверьте вашу уÑтановку!\n"
+
+msgid "REPO ID..."
+msgstr "ИД ХРÐÐИЛИЩÐ..."
+
+msgid "test whether node ids are known to a repo"
+msgstr "проверить, извеÑтны ли идентификаторы узлов в хранилище"
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s\n"
+" and 1s indicating unknown/known.\n"
+" "
+msgstr ""
+" Каждый идентификатор должен быть полным 16-ричным идентификатором узла.\n"
+" Возвращает ÑпиÑок нулей и единиц, означающих неизвеÑтен/извеÑтен.\n"
+" "
+
+msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
+msgstr "[УСТÐРЕВШЕЕ [ЗÐМЕÐÐ] [ЗÐМЕÐÐ... ]"
+
+msgid "create arbitrary obsolete marker"
+msgstr "Ñоздать произвольный маркер уÑтаревшей ревизии"
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr "ХРÐÐИЛИЩЕ ПРОСТРÐÐСТВО_ИМЕР[КЛЮЧ СТÐРЫЙ ÐОВЫЙ]"
+
+msgid "access the pushkey key/value protocol"
+msgstr "доÑтуп к протоколу ключ/значение pushkey"
+
+msgid " With two args, list the keys in the given namespace."
+msgstr " С Ð´Ð²ÑƒÐ¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ перечиÑлÑет ключи в данном проÑтранÑтве имен."
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+" С пÑтью аргументами уÑтанавливает КЛЮЧ в ÐОВЫЙ, еÑли он равен СТÐРОМУ.\n"
+" Сообщает об уÑпехе или неудаче.\n"
+" "
+
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr "глубина(а): %d глубина(b): %d\n"
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr "дельта: %d hdist: %d раÑÑтоÑние: %d отношение: %s\n"
+
+msgid "revision to rebuild to"
+msgstr "переÑтроить на данную ревизию"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r РЕВИЗИЯ] [РЕВИЗИЯ]"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr "переÑтроить dirstate, как оно бы выглÑдело в данной ревизии"
+
+msgid "revision to debug"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸"
+
+msgid "[-r REV] FILE"
+msgstr "[-r РЕВИЗИЯ] ФÐЙЛ"
+
+msgid "dump rename information"
+msgstr "дамп информации о переименовании"
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s переименован из %s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s не переименован\n"
+
+msgid "dump index data"
+msgstr "дамп данных индекÑа"
+
+msgid "-c|-m|FILE"
+msgstr "-c|-m|ФÐЙЛ"
+
+msgid "show data and statistics about a revlog"
+msgstr "показать данные и ÑтатиÑтику по revlog'у"
+
+msgid "parse and apply a revision specification"
+msgstr "разобрать и применить Ñпецификацию ревизии"
+
+msgid ""
+" Use --verbose to print the parsed tree before and after aliases\n"
+" expansion.\n"
+" "
+msgstr ""
+" ИÑпользуйте --verbose чтобы напечатать разобранное дерево до и\n"
+" поÑле подÑтановки пÑевдонимов.\n"
+" "
+
+msgid "REV1 [REV2]"
+msgstr "РЕВИЗИЯ1 [РЕВИЗИЯ2]"
+
+msgid "manually set the parents of the current working directory"
+msgstr "вручную уÑтановить родителей текущего рабочего каталога"
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+" Это полезно при напиÑании инÑтрументов Ð´Ð»Ñ ÐºÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°,\n"
+" но пользоватьÑÑ Ñтим надо оÑторожно."
+
+msgid "do not display the saved mtime"
+msgstr "не показывать Ñохраненное mtime"
+
+msgid "sort by saved mtime"
+msgstr "Ñортировать по Ñохраненному mtime"
+
+msgid "[OPTION]..."
+msgstr "[ПÐРÐМЕТР]..."
+
+msgid "show the contents of the current dirstate"
+msgstr "показать Ñодержимое текущего dirstate"
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "копирование: %s -> %s\n"
+
+msgid "revision to check"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸"
+
+msgid "show how files match on given patterns"
+msgstr "показать, как файлы Ñовпадают Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸ шаблонами"
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "ХРÐÐИЛИЩЕ [ПÐРÐМЕТРЫ]... [ПЕРВЫЙ [ВТОРОЙ]]"
+
+# }}} end of debug commands
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[ПÐРÐМЕТР]... ([-c РЕВ] | [-r РЕВ1 [-r РЕВ2]]) [ФÐЙЛ]..."
+
+msgid "diff repository (or selected files)"
+msgstr "показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище (или выбранных файлах)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr " Показывает Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ревизиÑми указанных файлов."
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr " Ð Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÑŽÑ‚ÑÑ Ð² унифицированном формате diff."
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" diff может генерировать неожиданные результаты Ð´Ð»Ñ ÑлиÑний,\n"
+" поÑкольку по умолчанию Ñравнение производитÑÑ Ñ Ð¿ÐµÑ€Ð²Ñ‹Ð¼\n"
+" родителем рабочего каталога, еÑли не указаны другие ревизии."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" Можно также указать -c/--change чтобы поÑмотреть изменениÑ\n"
+" в Ñтой ревизии отноÑительно ее первой родительÑкой ревизии."
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" Без -a/--text, diff не будет генерировать Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²,\n"
+" которые поÑчитает бинарными. С -а, будет генерировать Ð´Ð»Ñ Ð²Ñех\n"
+" файлов, возможно Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ результатами."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" ИÑпользуйте -g/--git чтобы генерировать Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð² раÑширенном\n"
+" формате git. Подробнее Ñм. :hg:`help diffs`."
+
+msgid " - compare a file in the current working directory to its parent::"
+msgstr " - Ñравнить файл в текущем рабочем каталоге Ñ ÐµÐ³Ð¾ родителем::"
+
+msgid " hg diff foo.c"
+msgstr " hg diff foo.c"
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr ""
+" - Ñравнить две верÑии каталога в иÑтории Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о "
+"переименованиÑÑ…::"
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr " hg diff --git -r 1.0:1.2 lib/"
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr ""
+" - получить ÑтатиÑтику изменений отноÑительно поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° "
+"некую дату::"
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr " hg diff --stat -r \"date('may 2')\""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr ""
+" - показать вÑе только что добавленные файлы, Ñодержащие ключевое "
+"Ñлово::"
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr " hg diff \"set:added() and grep(GNU)\""
+
+msgid " - compare a revision and its parents::"
+msgstr " - Ñравнить ревизию и ее родителей::"
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+" hg diff -c 9353 # Ñравнить Ñ Ð¿ÐµÑ€Ð²Ñ‹Ð¼ родителем\n"
+" hg diff -r 9353^:9353 # то же Ñ Ð¸Ñпользованием ÑинтакÑиÑа "
+"revset\n"
+" hg diff -r 9353^2:9353 # Ñравнить Ñо вторым родителем"
+
+msgid "diff against the second parent"
+msgstr "Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ñ‚ второй родительÑкой ревизии"
+
+msgid "revisions to export"
+msgstr "ревизии Ð´Ð»Ñ ÑкÑпортированиÑ"
+
+msgid "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
+msgstr "[ПÐРÐМЕТР]... [-o ВЫХФОРМÐТ] [-r] РЕВИЗИЯ..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "вывеÑти заголовок и Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ или неÑкольких ревизий"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+" Печатает заголовок набора изменений и Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ или\n"
+" более ревизии."
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" Ð’ заголовке набора изменений ÑодержитÑÑ ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:\n"
+" автор, дата, Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ (еÑли не default), Ñ…Ñш набора изменений,\n"
+" родитель (родители) и Ñообщение фикÑации."
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" export может генерировать неожиданный вывод diff Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¹\n"
+" ÑлиÑниÑ, потому что Ñравнение такой ревизии проводитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+" Ñ ÐµÐµ первой родительÑкой ревизией."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" Можно оÑущеÑтвлÑÑ‚ÑŒ вывод в файл, при Ñтом Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° задаетÑÑ\n"
+" в виде форматирующей Ñтроки. Правила форматированиÑ:"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: Ñимвол \"%\"\n"
+" :``%H``: Ñ…Ñш набора изменений (40 шеÑтнадцатеричных цифр)\n"
+" :``%N``: количеÑтво Ñгенерированных патчей\n"
+" :``%R``: номер ревизии набора изменений\n"
+" :``%b``: базовое Ð¸Ð¼Ñ ÑкÑпортируемого хранилища\n"
+" :``%h``: короткий Ñ…Ñш набора изменений (12 шеÑтнадцатеричных цифр)\n"
+" :``%m``: Ð¿ÐµÑ€Ð²Ð°Ñ Ñтрока ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ñ Ñ„Ð¸ÐºÑации (только буквы и цифры)\n"
+" :``%n``: выровненный нулÑми поÑледовательный номер, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ 1\n"
+" :``%r``: выровненный нулÑми номер ревизии"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" Без -a/--text, export не будет генерировать Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²,\n"
+" которые он Ñчитает бинарными. С -а Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ Ñгенерированы\n"
+" Ð´Ð»Ñ Ð²Ñех файлов, чаÑто Ñ Ð½ÐµÐ¶ÐµÐ»Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ результатами."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" ИÑпользуйте -g/--git чтобы Ñгенерировать Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð² раÑширенном\n"
+" формате git. Подробнее Ñм. :hg:`help diffs`."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" ЕÑли указан --switch-parent, будут генерироватьÑÑ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ñ‚\n"
+" второго родителÑ. Это может быть полезно при анализе ÑлиÑниÑ."
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr ""
+" - иÑпользовать export вмеÑте Ñ import чтобы перенеÑти иÑправление\n"
+" бага на текущую ветку::"
+
+msgid " hg export -r 9353 | hg import -"
+msgstr " hg export -r 9353 | hg import -"
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr ""
+" - ÑкÑпортировать вÑе наборы изменений между Ð´Ð²ÑƒÐ¼Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñми в файл,\n"
+" Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÑŽ о переименованиÑÑ…::"
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr " hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr ""
+" - преобразовать иÑходÑщие изменений в Ñерию патчей Ñ Ð¾Ð¿Ð¸Ñывающими\n"
+" их именами::"
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
+msgid "export requires at least one changeset"
+msgstr "Ð´Ð»Ñ ÑкÑпорта требуетÑÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один набор изменений"
+
+msgid "exporting patches:\n"
+msgstr "ÑкÑпортируемые патчи:\n"
+
+msgid "exporting patch:\n"
+msgstr "ÑкÑпортируемый патч:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr "забыть указанные файлы при Ñледующей фикÑации"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+" Помечает указанные файлы, чтобы переÑтать их отÑлеживать\n"
+" при Ñледующей фикÑации."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" Это удалÑет файлы только из текущей ветки, а не из вÑего\n"
+" хранилища, и не удалÑет их из рабочего каталога."
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+" Чтобы отменить дейÑтвие forget до Ñледующей фикÑации\n"
+" Ñм. :hg:`add`."
+
+msgid " - forget newly-added binary files::"
+msgstr " - забыть только что добавленные бинарные файлы::"
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr " hg forget \"set:added() and binary()\""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr " - забыть файлы, которые будут иÑключены Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ .hgignore::"
+
+msgid " hg forget \"set:hgignore()\""
+msgstr " hg forget \"set:hgignore()\""
+
+msgid "revisions to graft"
+msgstr "ревизии Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа"
+
+msgid "resume interrupted graft"
+msgstr "возобновить прерванную операцию graft"
+
+msgid "append graft info to log message"
+msgstr "добавить информацию о переноÑе в журнальное Ñообщение"
+
+msgid "record the current date as commit date"
+msgstr "иÑпользовать текущую дату в качеÑтве даты фикÑации"
+
+msgid "record the current user as committer"
+msgstr "иÑпользовать текущего Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÐ°Ðº автора фикÑации"
+
+msgid "[OPTION]... [-r] REV..."
+msgstr "[ПÐРÐМЕТР]... [-r] РЕВИЗИЯ..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "копировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ ветки в текущую"
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+" Эта команда иÑпользует возможноÑти ÑлиÑÐ½Ð¸Ñ Mercurial, чтобы\n"
+" Ñкопировать отдельные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· других веток без полного ÑлиÑниÑ\n"
+" веток в графе иÑтории. Иногда Ñту операцию также называют\n"
+" 'бÑкпортирование' ('backporting') или 'cherry-picking'. По умолчанию\n"
+" graft копирует Ð¸Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð°, даты и опиÑание из ревизии-иÑточника."
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+" Ðаборы изменений, ÑвлÑющиеÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ°Ð¼Ð¸ текущей ревизии, и к которым\n"
+" уже была применена Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ graft, а также ревизии ÑлиÑÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚\n"
+" пропущены."
+
+msgid " (grafted from CHANGESETHASH)"
+msgstr " (перенеÑено из ХЭШРЕВИЗИИ)"
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
+msgstr ""
+" ЕÑли во Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ graft возникает конфликт, Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÑетÑÑ\n"
+" Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы текущее ÑлиÑние было завершено вручную. ПоÑле\n"
+" Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð²Ñех конфликтов, можно продолжить процеÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" параметра -c/--continue."
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+" .. note::\n"
+" Параметр -c/--continue не применÑет повторно ранее заданные опции."
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr ""
+" - Ñкопировать одно изменение в ветку stable и отредактировать ее\n"
+" опиÑание::"
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+" hg update stable\n"
+" hg graft --edit 9393"
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+" - перенеÑти диапазон ревизий Ñ Ð¾Ð´Ð½Ð¸Ð¼ иÑключением, обновлÑÑ Ð´Ð°Ñ‚Ñ‹::"
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr " hg graft -D \"2085::2093 and not 2091\""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr " - продолжить Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð¿Ð¾Ñле Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð²::"
+
+msgid " hg graft -c"
+msgstr " hg graft -c"
+
+msgid " - show the source of a grafted changeset::"
+msgstr " - показать иÑточник перенеÑенного набора изменений::"
+
+msgid " hg log --debug -r tip"
+msgstr " hg log --debug -r tip"
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" Ð’ Ñлучае уÑпеха возвращает 0.\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ --continue и ревизии одновременно"
+
+msgid "no graft state found, can't continue"
+msgstr "не найдено ÑоÑтоÑние операции graft, продолжение невозможно"
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr "пропуÑкаю ревизию ÑлиÑÐ½Ð¸Ñ %s\n"
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr "пропуÑкаю предка %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr "пропуÑкаю уже перенеÑенную ревизию %s\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (same origin %d)\n"
+msgstr "пропуÑкаю уже перенеÑенную ревизию %s (тот же иÑточник %d)\n"
+
+#, python-format
+msgid "skipping already grafted revision %s (was grafted from %d)\n"
+msgstr "пропуÑкаю уже перенеÑенную ревизию %s (была перенеÑена из %d)\n"
+
+#, python-format
+msgid "grafting revision %s\n"
+msgstr "Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸ %s\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "неразрешенные конфликты, продолжение невозможно"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "иÑпользуйте hg resolve и hg graft --continue"
+
+#, python-format
+msgid "graft for revision %s is empty\n"
+msgstr "нечего переноÑить Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸ %s\n"
+
+msgid "end fields with NUL"
+msgstr "заканчивать Ð¿Ð¾Ð»Ñ Ñимволом NUL"
+
+msgid "print all revisions that match"
+msgstr "печатать вÑе подходÑщие ревизии"
+
+msgid "ignore case when matching"
+msgstr "игнорировать региÑÑ‚Ñ€ букв"
+
+msgid "print only filenames and revisions that match"
+msgstr "печатать только имена Ñовпадающих файлов и ревизий"
+
+msgid "print matching line numbers"
+msgstr "печатать номера Ñтрок"
+
+msgid "only search files changed within revision range"
+msgstr "иÑкать только файлы, измененные в указанном диапазоне ревизий"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[ПÐРÐМЕТР]... ШÐБЛОР[ФÐЙЛ]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "иÑкать текÑÑ‚ в указанных файлах и ревизиÑÑ…"
+
+msgid " Search revisions of files for a regular expression."
+msgstr " Ищет регулÑрное выражение в указанных ревизиÑÑ… файлов."
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+" Команда ведет ÑÐµÐ±Ñ Ð½Ðµ так, как grep в Unix. Она принимает\n"
+" регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Python/Perl. Ищет в иÑтории хранилища,\n"
+" а не в рабочем каталоге. Она вÑегда печатает номер ревизии,\n"
+" в котором находит Ñовпадение."
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+" По умолчанию печатаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ вывод Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð¹ ревизии файла,\n"
+" в которой найдено Ñовпадение. Чтобы напечатать вÑе ревизии, в которых\n"
+" менÑетÑÑ ÑÑ‚Ð°Ñ‚ÑƒÑ ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ (\"-\", еÑли Ñовпадение переÑтало\n"
+" быть Ñовпадением, или \"+\", еÑли Ñовпадение возникло там, где раньше\n"
+" его не было), иÑпользуйте флаг --all."
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+" Возвращает 0, еÑли Ñовпадение найдено, 1 в противном Ñлучае.\n"
+" "
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: неверный шаблон: %s\n"
+
+msgid "STARTREV"
+msgstr "ÐÐЧРЕВИЗИЯ"
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "показать только головные ревизии-потомки ÐÐЧРЕВИЗИИ"
+
+msgid "show topological heads only"
+msgstr "показать только топологичеÑкие головные ревизии"
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "показать только активные головы веток (УСТÐРЕЛО)"
+
+msgid "show normal and closed branch heads"
+msgstr "показать обычные и закрытые головы веток"
+
+msgid "[-ct] [-r STARTREV] [REV]..."
+msgstr "[-ct] [-r ÐÐЧРЕВИЗИЯ] [РЕВИЗИЯ]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "показать головы текущего хранилища или головы веток"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr " Без аргументов показывает вÑе головы веток хранилища."
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+" \"Головы\" хранилища - Ñто наборы изменений, у которых нет дочерних\n"
+" наборов. Именно в них проиÑходит разработка и они как правило ÑвлÑÑŽÑ‚ÑÑ\n"
+" объектами Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ update или merge. Головы веток - Ñто наборы\n"
+" изменений, у которых нет дочерних наборов на той же ветке."
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+" ЕÑли указана одна или более РЕВИЗИЯ, показываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ головы\n"
+" на ветках, аÑÑоциированных Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼Ð¸ ревизиÑми. Это означает,\n"
+" что вы можете иÑпользовать :hg:`heads foo`, чтобы поÑмотреть\n"
+" головы на ветке Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ``foo``."
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" ЕÑли указан -c/--closed, показываютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ головы на закрытых\n"
+" ветках (Ñм. :hg:`commit --close-branch`)"
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+" ЕÑли задана ÐÐЧÐЛЬÐÐЯРЕВИЗИЯ, показываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ головы,\n"
+" ÑвлÑющиеÑÑ ÐµÐµ потомками."
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+" ЕÑли указан -t/--topo, механизм именованных веток игнорируетÑÑ, и "
+"будут показаны только наборы изменений без дочерних наборов."
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" Возвращает 0, еÑли головы найдены, 1 в противном Ñлучае.\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "не найдено голов открытых веток на ветках %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ %s)"
+
+msgid "show only help for extensions"
+msgstr "показать только Ñправку по раÑширениÑм"
+
+msgid "show only help for commands"
+msgstr "показать только Ñправку по командам"
+
+msgid "show topics matching keyword"
+msgstr "показать темы, ÑоответÑтвующие ключевому Ñлову"
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [ТЕМÐ]"
+
+msgid "show help for a given topic or a help overview"
+msgstr "показать Ñправку по выбранной теме или обзор Ñправочной информации"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr " Без аргументов печатает ÑпиÑок команд Ñ ÐºÑ€Ð°Ñ‚ÐºÐ¸Ð¼ опиÑанием."
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" ЕÑли указана тема, раÑширение или Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, показывает Ñправку\n"
+" по Ñтой теме."
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" Возвращает 0 при уÑпешном выполнении.\n"
+" "
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"пÑевдонимы: %s\n"
+
+msgid "(no help text available)"
+msgstr "(Ñправка недоÑтупна)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "пÑевдоним оболочки длÑ::"
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "пÑевдоним длÑ: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr "иÑпользуйте \"hg help -e %s\" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Ñправки по раÑширению %s"
+
+msgid "options:"
+msgstr "параметры:"
+
+msgid "global options:"
+msgstr "глобальные параметры:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"иÑпользуйте \"hg help %s\" чтобы получить полную Ñправку\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"иÑпользуйте \"hg -v help %s\" Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации\n"
+
+msgid "basic commands:"
+msgstr "ОÑновные команды:"
+
+msgid "list of commands:"
+msgstr "ÑпиÑок команд:"
+
+msgid "no commands defined\n"
+msgstr "команды не определены\n"
+
+msgid "enabled extensions:"
+msgstr "Включенные раÑширениÑ:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"дополнительные разделы Ñправки:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "иÑпользуйте \"hg help\" чтобы поÑмотреть полный ÑпиÑок команд"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"иÑпользуйте \"hg help\" чтобы поÑмотреть полный ÑпиÑок команд,\"hg -v\" Ð´Ð»Ñ "
+"подробной информации"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "иÑпользуйте \"hg help %s\" чтобы получить полную Ñправку"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"иÑпользуйте \"hg -v help%s\" чтобы поÑмотреть вÑтроенные пÑевдонимы и "
+"глобальные параметры"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"иÑпользуйте \"hg help -c %s\" Ð´Ð»Ñ Ñправки по команде %s\n"
+
+msgid "no help text available"
+msgstr "Ñправка недоÑтупна"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s раÑширение - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr "наберите \"hg help extensions\" Ð´Ð»Ñ Ñправки по включению раÑширений\n"
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr "'%s' предоÑтавлÑетÑÑ Ñледующим раÑширением:"
+
+msgid "Topics"
+msgstr "Темы"
+
+msgid "Extension Commands"
+msgstr "Команды РаÑширениÑ"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "РаÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑиÑтема ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий Mercurial\n"
+
+msgid "identify the specified revision"
+msgstr "опиÑать заданную ревизию"
+
+msgid "show local revision number"
+msgstr "показать локальный номер ревизии"
+
+msgid "show global revision id"
+msgstr "показать глобальный идентификатор ревизии"
+
+msgid "show branch"
+msgstr "показать ветку"
+
+msgid "show tags"
+msgstr "показать метки"
+
+msgid "show bookmarks"
+msgstr "показать закладки"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r РЕВИЗИЯ] [ИСТОЧÐИК]"
+
+msgid "identify the working copy or specified revision"
+msgstr "опиÑать рабочую копию или указанную ревизию"
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+" Печатает Ñводку, опиÑывающую ÑоÑтоÑние хранилища на момент РЕВИЗИЯ,\n"
+" в виде одного или двух Ñ…Ñш-идентификаторов родителÑ, за которым\n"
+" Ñледует \"+\", еÑли Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñодержит незафикÑированные\n"
+" изменениÑ, имени ветки (еÑли отлично от default), ÑпиÑка веток,\n"
+" ÑпиÑка меток и ÑпиÑка закладок."
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" ЕÑли РЕВИЗИЯ не указана, печатает Ñводку по текущему ÑоÑтоÑнию\n"
+" хранилища."
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" ЕÑли задан путь к хранилищу или комплекту Mercurial, будет\n"
+" работать Ñ Ñтим хранилищем/комплектом."
+
+msgid " - generate a build identifier for the working directory::"
+msgstr " - Ñгенерировать идентификатор Ñборки Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога::"
+
+msgid " hg id --id > build-id.dat"
+msgstr " hg id --id > build-id.dat"
+
+msgid " - find the revision corresponding to a tag::"
+msgstr " - найти ревизию, ÑоответÑтвующую метке::"
+
+msgid " hg id -n -r 1.3"
+msgstr " hg id -n -r 1.3"
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr " - поÑмотреть поÑледнюю ревизию в отдаленном хранилище::"
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr " hg id -r tip http://selenic.com/hg/"
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr "не могу запроÑить номер отдалённой ревизии, ветки или метки"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+"наÑтройка strip Ð´Ð»Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° при применении патча. Значит то же, что и в "
+"команде patch"
+
+msgid "PATH"
+msgstr "ПУТЬ"
+
+msgid "base path (DEPRECATED)"
+msgstr "базовый путь (УСТÐРЕЛО)"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "не проверÑÑ‚ÑŒ "
+
+msgid "don't commit, just update the working directory"
+msgstr "не фикÑировать, проÑто обновить рабочий каталог"
+
+msgid "apply patch without touching the working directory"
+msgstr "применить файл, не Ñ‚Ñ€Ð¾Ð³Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ð¹ каталог"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr "применить патч к узлам, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… он был Ñгенерирован"
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+"иÑпользовать любую информацию о ветках из патча (подразумеваетÑÑ Ð¿Ñ€Ð¸ --exact)"
+
+msgid "[OPTION]... PATCH..."
+msgstr "[ПÐРÐМЕТР]... ПÐТЧ..."
+
+msgid "import an ordered set of patches"
+msgstr "импортировать упорÑдоченный набор патчей"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+" Импортирует ÑпиÑок патчей и фикÑирует их по отдельноÑти (еÑли не\n"
+" задан параметр --no-commit)"
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+" ЕÑли в рабочем каталоге еÑÑ‚ÑŒ незафикÑированные изменениÑ, импорт\n"
+" отменÑетÑÑ, еÑли не указан флаг -f/--force."
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+" Можно импортировать патчи прÑмо из емейла. Работает даже длÑ\n"
+" патчей в приложениÑÑ… (чтобы иÑпользовать патч из тела пиÑьма,\n"
+" оно должно иметь тип text/plain или text/x-patch). Заголовки\n"
+" Ñлектронного пиÑьма From и Subject иÑпользуютÑÑ Ð¿Ð¾ умолчанию\n"
+" в качеÑтве автора фикÑации и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации. Ð’Ñе чаÑти\n"
+" тела пиÑьма типа text/plain до первого Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑŽÑ‚ÑÑ\n"
+" к Ñообщению фикÑации."
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+" ЕÑли импортируемый патч был Ñгенерирован Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`export`,\n"
+" пользователь и опиÑание из патча иÑпользуютÑÑ Ð²Ð¼ÐµÑто заголовков\n"
+" и тела Ñлектронного пиÑьма. С помощью параметров -m/--message и\n"
+" -u/--user можно задать Ñти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñвно."
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+" ЕÑли указан --exact, рабочий каталог будет обновлÑÑ‚ÑŒÑÑ Ð´Ð¾ родителÑ\n"
+" каждого патча перед его применением, и импорт будет отменен, еÑли\n"
+" получившийÑÑ Ð½Ð°Ð±Ð¾Ñ€ изменений будет иметь другой Ñ…Ñш, чем запиÑанный\n"
+" в патче. Это может ÑлучитьÑÑ, например, из-за проблем Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹\n"
+" или других дефектах в формате патча."
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+" ИÑпользуйте --bypass, чтобы наложить и зафикÑировать патчи прÑмо\n"
+" в хранилище, не Ð·Ð°Ñ‚Ñ€Ð°Ð³Ð¸Ð²Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‡Ð¸Ð¹ каталог. Без --exact патчи\n"
+" будут наложены поверх родительÑкой ревизии рабочего каталога."
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as :hg:`addremove`."
+msgstr ""
+" ЕÑли указан -s/--similatity, Mercurial попытаетÑÑ Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶Ð¸Ñ‚ÑŒ\n"
+" ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² патче так же, как в :hg:`addremove`."
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+" ИÑпользуйте \"-\" вмеÑто имени патча, чтобы прочитать патч Ñо\n"
+" Ñтандартного ввода. ЕÑли указан URL, патч будет загружен оттуда.\n"
+" См. :hg:`help dates` о допуÑтимых форматах дат Ð´Ð»Ñ -d/--date."
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr ""
+" - импортировать традиционный патч и веб-Ñайта и найти переименованиÑ::"
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr " hg import -s 80 http://example.com/bugfix.patch"
+
+msgid " - import a changeset from an hgweb server::"
+msgstr " - импортировать набор изменений Ñ Ñервера hgweb::"
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr " - импортировать вÑе патчи из файла почтового Ñщика Unix mbox::"
+
+msgid " hg import incoming-patches.mbox"
+msgstr " hg import incoming-patches.mbox"
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+" - попытатьÑÑ Ñтрого воÑÑтановить ÑкÑпортированный набор изменений (не\n"
+" вÑегда возможно)::"
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr " hg import --exact proposed-fix.patch"
+
+msgid "need at least one patch to import"
+msgstr "Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° требуетÑÑ Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один патч"
+
+msgid "cannot use --no-commit with --bypass"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --no-commit Ñ --bypass"
+
+msgid "cannot use --similarity with --bypass"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --similarityt Ñ --bypass"
+
+msgid "patch is damaged or loses information"
+msgstr "патч поврежден или в нем недоÑтает данных"
+
+msgid "applied to working directory"
+msgstr "наложен на рабочий каталог"
+
+msgid "not a Mercurial patch"
+msgstr "не патч Mercurial"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "Ñоздан %s"
+
+msgid "applying patch from stdin\n"
+msgstr "применÑÑŽ патч Ñо Ñтандартного ввода\n"
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: отличий не найдено"
+
+msgid "run even if remote repository is unrelated"
+msgstr "работать даже Ñ Ð½ÐµÑвÑзанным хранилищем"
+
+msgid "show newest record first"
+msgstr "показывать новые запиÑи в начале"
+
+msgid "file to store the bundles into"
+msgstr "файл Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð»ÐµÐºÑ‚Ð¾Ð²"
+
+msgid "a remote changeset intended to be added"
+msgstr "отдалённый набор изменений, предназначенный Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ"
+
+msgid "compare bookmarks"
+msgstr "Ñравнить закладки"
+
+msgid "a specific branch you would like to pull"
+msgstr "ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°, которую вы хотите затÑнуть"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r РЕВ]... [--bundle ФÐЙЛ] [ИСТОЧÐИК]"
+
+msgid "show new changesets found in source"
+msgstr "показать новые наборы изменений в иÑходном хранилище"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Показывает новые наборы изменений, найденные по указанному\n"
+" пути/URL или по пути default (Ñм. :hg:`paths`). Эти наборы\n"
+" изменений были бы затÑнуты, еÑли бы была иÑпользована команда\n"
+" pull в то же времÑ."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" Ð”Ð»Ñ Ð¾Ñ‚Ð´Ð°Ð»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ хранилища иÑпользование --bundle позволÑет\n"
+" избежать повторной загрузки наборов изменений, еÑли за incoming\n"
+" Ñледует pull."
+
+msgid " See pull for valid source format details."
+msgstr " О форматах иÑточника Ñм. pull."
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Возвращает 0 еÑли еÑÑ‚ÑŒ входÑщие изменениÑ, 1 в противном Ñлучае.\n"
+" "
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ñовмещать --bundle и --subrepos"
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "отдалённое хранилище не поддерживает закладки\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e КОМÐÐДÐ] [--remotecmd КОМÐÐДÐ] [ÐÐЗÐ]"
+
+msgid "create a new repository in the given directory"
+msgstr "Ñоздать новое хранилище в указанном каталоге"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Инициализирует новое хранилище в заданном каталоге. ЕÑли\n"
+" указанный каталог не ÑущеÑтвует, он будет Ñоздан."
+
+msgid " If no directory is given, the current directory is used."
+msgstr " ЕÑли каталог не задан, будет иÑпользован текущий."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Можно задать URL вида ``ssh://`` в качеÑтве каталога назначениÑ.\n"
+" См. также :hg:`help urls`."
+
+msgid "search the repository as it is in REV"
+msgstr "иÑкать в хранилище, каким оно было на момент РЕВИЗИЯ"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "вÑтавлÑÑ‚ÑŒ NUL поÑле имен файлов, Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "печатать полные пути от ÐºÐ¾Ñ€Ð½Ñ Ð¤Ð¡"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[ПÐРÐМЕТР]... [ШÐБЛОÐ]..."
+
+msgid "locate files matching specific patterns"
+msgstr "найти файлы подходÑщие под заданный шаблон"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" Печатает файлы в текущем каталоге, находÑщиеÑÑ Ð¿Ð¾Ð´ контролем\n"
+" Mercurial, имена которых подходÑÑ‚ под заданные шаблоны."
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" По умолчанию, Ñта команда ищет во вÑем рабочем каталога. Чтобы\n"
+" иÑкать только текущем каталоге и его подкаталогах, иÑпользуйте\n"
+" \"--include .\"."
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+" ЕÑли шаблоны не заданы, печатает имена вÑех файлов, находÑщихÑÑ\n"
+" под контролем Mercurial в рабочем каталоге."
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" ЕÑли вы хотите передать вывод Ñтой команды \"xargs\", иÑпользуйте\n"
+" опцию -0 в Ñтой команде и в \"xargs\". Это поможет избежать\n"
+" проблем, когда \"xargs\" Ñчитает отдельные имена Ñ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸\n"
+" неÑколькими файлами."
+
+msgid "show revision history of entire repository or files"
+msgstr "показать иÑторию ревизий вÑего хранилища или файлов"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr " Печатает иÑторию ревизий указанных файлов или вÑего проекта."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" ЕÑли не указан диапазон ревизий, по умолчанию иÑпользуетÑÑ\n"
+" ``tip:0``, еÑли не указан --follow, в Ñлучае чего родительÑкаÑ\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога иÑпользуютÑÑ Ð² качеÑтве начальной ревизии."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð° показываетÑÑ Ð±ÐµÐ· ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð° переименованиÑми или\n"
+" копированиÑми файлов. ИÑпользуйте -f/-follow, чтобы показать\n"
+" иÑторию Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñми и переименованиÑми. --follow без имени\n"
+" файла покажет только предков или потомков начальной ревизии."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" По умолчанию Ñта команда печатает номера ревизий Ñ Ñ…Ñшами наборов\n"
+" изменений, метки, неочевидных родителей, пользователÑ, дату и\n"
+" времÑ, а также Ñообщение каждой фикÑации. ЕÑли указан\n"
+" -v/--verbose, печатаетÑÑ Ñ‚Ð°ÐºÐ¶Ðµ ÑпиÑок измененных файлов и полное\n"
+" Ñообщение каждой фикÑации."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" log -p/--patch может генерировать неожиданные Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð´Ð»Ñ\n"
+" ревизий ÑлиÑниÑ, поÑкольку Ñравнение Ñлитой ревизии\n"
+" производитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ ÐµÐµ первым родителем. Также в ÑпиÑок\n"
+" попадут только файлы, отличные от ОБОИХ родителей:."
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+" .. note::\n"
+" из Ñоображений производительноÑти, в ФÐЙЛе журнала могут\n"
+" отÑутÑтвовать дублирующиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, Ñделанные на ветках,\n"
+" а также там будут отÑутÑтвовать удалениÑ. Чтобы увидеть вÑе\n"
+" изменениÑ, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ñ‹ и удалениÑ, иÑпользуйте параметр\n"
+" --removed."
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr " - наборы изменений Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼Ð¸ опиÑаниÑми и ÑпиÑками файлов::"
+
+msgid " hg log -v"
+msgstr " hg log -v"
+
+msgid " - changesets ancestral to the working directory::"
+msgstr " - наборы изменений, ÑвлÑющиеÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ°Ð¼Ð¸ рабочего каталога::"
+
+msgid " hg log -f"
+msgstr " hg log -f"
+
+msgid " - last 10 commits on the current branch::"
+msgstr " - поÑледние 10 наборов изменений на текущей ветке::"
+
+msgid " hg log -l 10 -b ."
+msgstr " hg log -l 10 -b ."
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr ""
+" - наборы изменений, отражающие вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°, Ñ‚.ч. изъÑÑ‚Ð¸Ñ "
+"из- под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий::"
+
+msgid " hg log --removed file.c"
+msgstr " hg log --removed file.c"
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr ""
+" - вÑе наборы изменений, затрагивающие каталог, Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñми, "
+"кроме ÑлиÑний::"
+
+msgid " hg log -Mp lib/"
+msgstr " hg log -Mp lib/"
+
+msgid " - all revision numbers that match a keyword::"
+msgstr " - номера вÑех ревизий, Ñодержащие ключевое Ñлово::"
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr " hg log -k bug --template \"{rev}\\n\""
+
+# BUG
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr ""
+" - проверить, входит ли заданный набор изменений в помеченный релиз::"
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr " hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr " - найти вÑе наборы изменений Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² диапазоне дат::"
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr " hg log -k alice -d \"may 2008 to jul 2008\""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr " - Ñводка Ð´Ð»Ñ Ð²Ñех наборов изменений поÑле поÑледней метки::"
+
+msgid ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+" См. :hg:`help revisions` и :hg:`help revsets` Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹\n"
+" информации о задании ревизий."
+
+msgid ""
+" See :hg:`help templates` for more about pre-packaged styles and\n"
+" specifying custom templates."
+msgstr ""
+" Дополнительно о вÑтроенных ÑтилÑÑ… и Ñоздании Ñвоих шаблонов\n"
+" Ñм. :hg:`help templates`."
+
+msgid "revision to display"
+msgstr "показать данную ревизию"
+
+msgid "list files from all revisions"
+msgstr "показать файлы из вÑех ревизий"
+
+msgid "[-r REV]"
+msgstr "[-r РЕВИЗИЯ]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr "показать текущую или заданную ревизию манифеÑта проекта"
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+" Печатает ÑпиÑок файлов, находÑщихÑÑ Ð¿Ð¾Ð´ контролем верÑий, длÑ\n"
+" текущей или заданной ревизии. ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ задана, иÑпользуетÑÑ\n"
+" либо первый родитель рабочего каталога, либо пуÑÑ‚Ð°Ñ (null) ревизиÑ,\n"
+" еÑли никакой ревизии не извлечено."
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+" С -v печатает права доÑтупа файлов и признаки ÑимволичеÑкой ÑÑылки\n"
+" и иÑполнÑемого файла. С --debug печатает Ñ…Ñши ревизий."
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+" ЕÑли указан --all, печатаетÑÑ ÑпиÑок вÑех файлов из вÑех ревизий,\n"
+" Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ñ‹Ðµ и переименованные файлы."
+
+msgid "can't specify a revision with --all"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ указывать ревизию и --all"
+
+msgid "force a merge with outstanding changes"
+msgstr "Ñлить принудительно, даже еÑли еÑÑ‚ÑŒ незафикÑированные изменениÑ"
+
+msgid "revision to merge"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ ÑлиÑниÑ"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr "проÑмотреть Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ (ÑлиÑние не проводитÑÑ)"
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] РЕВИЗИЯ]"
+
+msgid "merge working directory with another revision"
+msgstr "Ñлить рабочий каталог Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ ревизией"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" Ð’ текущий рабочий каталог добавлÑÑŽÑ‚ÑÑ Ð²Ñе изменениÑ, Ñделанные\n"
+" в заданной ревизии Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° поÑледней общей ревизии."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Файлы, измененные по Ñравнению Ñ Ð»ÑŽÐ±Ñ‹Ð¼ из родителей, помечаютÑÑ\n"
+" как измененные Ð´Ð»Ñ Ñледующей фикÑации, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð±Ñзательно должна\n"
+" быть Ñделана до того, как будут разрешены поÑледующие обновлениÑ\n"
+" рабочего каталога. У Ñледующей фикÑации будет два родителÑ."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+" С помощью ``--tool`` можно задать инÑтрумент Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð².\n"
+" Она заменÑет переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ HGMERGE и наÑтройки конфига.\n"
+" Подробнее Ñм. :hg:`help merge-tools`."
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ указана, родитель рабочего каталога ÑвлÑетÑÑ\n"
+" головной ревизией и Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ‚ÐºÐ° имеет ровно одну другую голову,\n"
+" производитÑÑ ÑлиÑние Ñ Ñтой головой по умолчанию. Ð’ противном\n"
+" Ñлучае, требуетÑÑ Ñвно указать ревизию Ð´Ð»Ñ ÑлиÑниÑ."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr ""
+" ИÑпользуйте :hg:`resolve`, чтобы пометить файлы Ñ ÑƒÑтраненными "
+"конфликтами"
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+" ИÑпользуйте :hg:`update -clean .`, чтобы отменить незафикÑированное\n"
+" ÑлиÑние. Это извлечет чиÑтую копию родителÑ, изначально выбранного\n"
+" Ð´Ð»Ñ ÑлиÑниÑ, Ñ Ð¿Ð¾Ñ‚ÐµÑ€ÐµÐ¹ вÑех изменений."
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" При уÑпехе возвращает 0, 1 еÑли еÑÑ‚ÑŒ неразрешенные конфликты.\n"
+" "
+
+msgid ""
+"multiple matching bookmarks to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr ""
+"неÑколько подходÑщих закладок - Ñвно укажите ревизию или закладку Ð´Ð»Ñ ÑлиÑниÑ"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "иÑпользуйте 'hg heads' чтобы поÑмотреть вÑе головы"
+
+msgid ""
+"no matching bookmark to merge - please merge with an explicit rev or bookmark"
+msgstr ""
+"нет подходÑщих закладок - Ñвно укажите ревизию или закладку Ð´Ð»Ñ ÑлиÑниÑ"
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr "ветка '%s' имеет %d голов(Ñ‹) - Ñвно укажите ревизию Ð´Ð»Ñ ÑлиÑниÑ"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "иÑпользуйте 'hg heads .' чтобы поÑмотреть головы"
+
+msgid "heads are bookmarked - please merge with an explicit rev"
+msgstr "головы помечены закладками - Ñвно укажите ревизию Ð´Ð»Ñ ÑлиÑниÑ"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr "ветка '%s' имеет одну голову - Ñвно укажите ревизию Ð´Ð»Ñ ÑлиÑниÑ"
+
+msgid "nothing to merge"
+msgstr "нечего Ñливать"
+
+msgid "use 'hg update' instead"
+msgstr "иÑпользуйте 'hg update'"
+
+msgid "working directory not at a head revision"
+msgstr "рабочий каталог не на головной ревизии"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "иÑпользуйте 'hg update' или Ñвно укажите ревизию"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "набор изменений, предназначенный Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² хранилище назначениÑ"
+
+msgid "a specific branch you would like to push"
+msgstr "одна ветка, которую вы хотите втолкнуть"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r РЕВИЗИЯ]... [ÐÐЗÐ]"
+
+msgid "show changesets not found in the destination"
+msgstr "показать наборы изменений, отÑутÑтвующие в другом хранилище"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Показывает наборы изменений, не найденные в указанном отдалённом\n"
+" хранилище или по пути по умолчанию Ð´Ð»Ñ push. Эти наборы\n"
+" изменений были бы переданы командой push."
+
+msgid " See pull for details of valid destination formats."
+msgstr " Подробней о форматах пути хранилища Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñм. pull"
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Возвращает 0, еÑли еÑÑ‚ÑŒ иÑходÑщие изменениÑ, иначе 1.\n"
+" "
+
+msgid "show parents of the specified revision"
+msgstr "показать родителей указанной ревизии"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r РЕВИЗИЯ] [ФÐЙЛ]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "показать Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога или ревизии"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Печатает родительÑкую ревизию рабочего каталога. ЕÑли указана\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r/--rev, печатает Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñтой ревизии.\n"
+" ЕÑли задано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, печатает ревизию, в которой Ñтот файл был\n"
+" изменен поÑледний раз (до ревизии рабочего каталога или ревизии,\n"
+" заданной через --rev)"
+
+msgid "can only specify an explicit filename"
+msgstr "можно задать только Ñвное Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' не найден в манифеÑте!"
+
+msgid "[NAME]"
+msgstr "[ИМЯ]"
+
+msgid "show aliases for remote repositories"
+msgstr "показать пÑевдонимы отдалённых хранилищ"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+" Показывает полный путь Ð´Ð»Ñ Ñокращенного имени хранилища ИМЯ.\n"
+" ЕÑли Ð¸Ð¼Ñ Ð½Ðµ задано, показывает полные пути Ð´Ð»Ñ Ð²Ñех извеÑтных\n"
+" пÑевдонимов."
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+" Параметр -q/--quite полноÑтью отключает вывод при поиÑке одного\n"
+" ИМЕÐИ и показывает только пÑевдонимы без полных путей еÑли ИМЯ\n"
+" не задано."
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+" ПÑевдонимы путей хранилищ определены в Ñекции [path] вашего \n"
+" конфига и в ``etc/mercurial/hgrc``. ЕÑли запуÑкаетÑÑ Ð¸Ð· каталога,\n"
+" Ñодержащего хранилище, иÑпользуетÑÑ Ñ‚Ð°ÐºÐ¶Ðµ ``.hg/hgrc``."
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+" Пути ``default`` и ``default-push`` имеют Ñпециальное значение.\n"
+" Они иÑпользуютÑÑ Ð¿Ð¾ умолчание при операциÑÑ… push и pull, еÑли\n"
+" путь не указан Ñвно. ЕÑли уÑтановлен ``default-push``, он будет\n"
+" иÑпользован Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¸ push, ``default`` будет иÑпользован длÑ\n"
+" pull; в противном Ñлучае, ``default`` будет иÑпользован Ð´Ð»Ñ Ð¾Ð±ÐµÐ¸Ñ…\n"
+" операций. При клонировании Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника запиÑываетÑÑ ÐºÐ°Ðº\n"
+" ``default`` в ``.hg/hgrc``. Обратите внимание, что ``default``\n"
+" и ``default-push`` применÑÑŽÑ‚ÑÑ Ð´Ð»Ñ Ð²Ñех входÑщих (например,\n"
+" :hg:`incoming`) и иÑходÑщих (напр, :hg:`outgoing`, :hg:`email` и\n"
+" :hg:`bundle`) операций."
+
+msgid " See :hg:`help urls` for more information."
+msgstr " Подробнее Ñм. :hg:`help urls`."
+
+msgid "not found!\n"
+msgstr "не найден!\n"
+
+msgid "set changeset phase to public"
+msgstr "уÑтановить набор изменений в публичную фазу"
+
+msgid "set changeset phase to draft"
+msgstr "уÑтановить набор изменений в черновую фазу"
+
+msgid "set changeset phase to secret"
+msgstr "уÑтановить набор изменений в Ñекретную фазу"
+
+msgid "allow to move boundary backward"
+msgstr "разрешить перемещение границы назад"
+
+msgid "target revision"
+msgstr "Ñ†ÐµÐ»ÐµÐ²Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ"
+
+msgid "[-p|-d|-s] [-f] [-r] REV..."
+msgstr "[-p|-d|-s] [-f] [-r] РЕВИЗИЯ..."
+
+msgid "set or show the current phase name"
+msgstr "задать или показать текущую фазу"
+
+msgid " With no argument, show the phase name of specified revisions."
+msgstr " ЕÑли аргументы не заданы, показывает фазу указанных ревизий."
+
+msgid ""
+" With one of -p/--public, -d/--draft or -s/--secret, change the\n"
+" phase value of the specified revisions."
+msgstr ""
+" ЕÑли задан один из -p/--public, -d/--draft или -s/--secret, то изменÑет\n"
+" фазу указанных ревизий."
+
+msgid ""
+" Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
+" lower phase to an higher phase. Phases are ordered as follows::"
+msgstr ""
+" ЕÑли не указан -f/--force, то :hg:`phase` не перемещает набор изменений\n"
+" из меньшей фазы в большую. ПорÑдок фаз такой::"
+
+msgid " public < draft < secret"
+msgstr " Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ < Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð°Ñ < ÑекретнаÑ"
+
+msgid ""
+" Return 0 on success, 1 if no phases were changed or some could not\n"
+" be changed.\n"
+" "
+msgstr ""
+" Возвращает 0 при уÑпехе, 1 еÑли никакие фазы не были изменены или\n"
+" некоторые не удалоÑÑŒ изменить.\n"
+" "
+
+msgid "only one phase can be specified"
+msgstr "можно указать только одну фазу"
+
+#, python-format
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+"не могу поменÑÑ‚ÑŒ фазу Ð´Ð»Ñ %d наборов изменений на менее Ñтрогую,\n"
+"иÑпользуйте --force\n"
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "фаза изменена Ð´Ð»Ñ %i наборов изменений\n"
+
+msgid "no phases changed\n"
+msgstr "никакие фазы не изменены\n"
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "не обновлено: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+"(иÑпользуйте 'hg heads' чтобы поÑмотреть головы, 'hg merge' Ð´Ð»Ñ ÑлиÑниÑ)\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+"(иÑпользуйте 'hg heads .' чтобы поÑмотреть головы, 'hg merge' Ð´Ð»Ñ ÑлиÑниÑ)\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "(иÑпользуйте 'hg heads' чтобы поÑмотреть головы)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(иÑпользуйте 'hg update' чтобы получить рабочую копию)\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "обновитьÑÑ Ð´Ð¾ новой головы ветки, еÑли наборы изменений были затÑнуты"
+
+msgid "run even when remote repository is unrelated"
+msgstr "работать даже на неÑвÑзанном хранилище"
+
+msgid "BOOKMARK"
+msgstr "ЗÐКЛÐДКÐ"
+
+msgid "bookmark to pull"
+msgstr "закладка, которую Ñледует затÑнуть"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r РЕВ]... [-e КОМ-ДÐ] [--remotecmd КОМ-ДÐ] [ИСТОЧÐИК]"
+
+msgid "pull changes from the specified source"
+msgstr "затÑнуть Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· указанного иÑточника"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Скачивает Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· отдалённого хранилища в локальное."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Ðаходит вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище по указанному пути или URL и\n"
+" добавлÑет их в локальное хранилище (по умолчанию текущее, еÑли\n"
+" не указано другое через -R). По умолчанию Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ\n"
+" обновлÑетÑÑ."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" ИÑпользуйте :hg:`incoming` чтобы поÑмотреть, что было бы добавлено\n"
+" командой pull, вызванной в тот же момент времени. ЕÑли потом вы\n"
+" вы решите добавить Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² хранилище, Ñледует\n"
+" иÑпользовать :hg:`pull -r X`, где ``X`` - поÑледнÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ,\n"
+" Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ :hg:`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" ЕÑли ИСТОЧÐИК не задан, будет иÑпользован путь 'default'.\n"
+" Подробнее Ñм. :hg:`help urls`."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" При уÑпехе возвращает 0, 1 еÑли при обновлении оÑталиÑÑŒ конфликты "
+"ÑлиÑниÑ.\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "закладка %s не найдена в отдалённом хранилище"
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "импортируетÑÑ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° %s\n"
+
+msgid "force push"
+msgstr "протолкнуть принудительно"
+
+msgid "bookmark to push"
+msgstr "протолкнуть закладку"
+
+msgid "allow pushing a new branch"
+msgstr "разрешить Ñоздать новую ветку в отдалённом хранилище"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r РЕВ]... [-e КОМ-ДÐ] [--remotecmd КОМ-ДÐ] [ÐÐЗÐ]"
+
+msgid "push changes to the specified destination"
+msgstr "передать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² отдалённое хранилище"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+" \"Проталкивает\" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· локального хранилища в отдалённое.\n"
+" "
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ñимметрична pull: она имеет такой же Ñффект, как\n"
+" еÑли бы в отдалённом хранилища был выполнен pull из текущего."
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" По умолчанию push не даÑÑ‚ Ñоздать новые \"головы\" в отдалённом\n"
+" хранилище, потому что в Ñтом Ñлучае было бы не ÑÑно, какую\n"
+" голову иÑпользовать. Ð’ такой Ñитуации рекомендуетÑÑ\n"
+" затÑнуть и Ñлить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ´ проталкиванием."
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" ИÑпользуйте --new-branch, еÑли вы хотите разрешить Ñоздание\n"
+" именованной ветки, которой нет в отдалённом хранилище. Это\n"
+" позволÑет проÑто Ñоздать новую ветку в отдалённом хранилище\n"
+" (прочие проверки, приводÑщие к отмене проталкиваниÑ, в отличие\n"
+" от pull --force, будут проводитьÑÑ)."
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" ИÑпользуйте -f/--force чтобы игнорировать поведение по\n"
+" умолчанию и протолкнуть вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° вÑех ветках."
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" ЕÑли указан -r/--rev, то Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¸ вÑе ее потомки\n"
+" будут переданы в отдалённое хранилище."
+
+msgid ""
+" If -B/--bookmark is used, the specified bookmarked revision, its\n"
+" ancestors, and the bookmark will be pushed to the remote\n"
+" repository."
+msgstr ""
+" ЕÑли указан -B/--bookmark, то ревизиÑ, Ð¿Ð¾Ð¼ÐµÑ‡ÐµÐ½Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ закладкой,\n"
+" ее предки и Ñама закладка будут протолкнуты в отдалённое хранилище."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" См. :hg:`help urls` о важных подробноÑÑ‚ÑÑ… об URL вида ``ssh://``.\n"
+" ЕÑли ÐÐЗÐÐЧЕÐИЕ опущено, иÑпользуетÑÑ Ð¿ÑƒÑ‚ÑŒ по умолчанию (default)."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" Возвращает 0 в Ñлучае уÑпешного проталкиваниÑ, 1 еÑли нечего\n"
+" проталкивать.\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "проталкиваем в %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "ÑкÑпортируетÑÑ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "удалÑетÑÑ Ð¾Ñ‚Ð´Ð°Ð»Ñ‘Ð½Ð½Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "закладка %s не ÑущеÑтвует в локальном или отдалённом хранилище!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "не удалоÑÑŒ обновить закладку %s!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "откатить прерванную транзакцию"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+" ВоÑÑтанавливает хранилище поÑле прерванной фикÑации или затÑгиваниÑ"
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" Эта команда пытаетÑÑ Ð¸Ñправить ÑоÑтоÑние хранилища поÑле\n"
+" прерванной операции. Это должно быть необходимо только еÑли\n"
+" Mercurial Ñам предлагает Ñто Ñделать."
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+" Возвращает 0 в Ñлучае уÑпеха, 1 еÑли нечего воÑÑтанавливать или\n"
+" проверка целоÑтноÑти не прошла."
+
+msgid "record delete for missing files"
+msgstr "удалить отÑутÑтвующие файлы"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr ""
+"удалÑÑ‚ÑŒ файлы из каталога и хранилища даже еÑли они были добавлены или "
+"изменены"
+
+msgid "remove the specified files on the next commit"
+msgstr "удалить указанные файлы при Ñледующей фикÑации"
+
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr " Помечает заданные файлы Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¸Ð· текущей ветки."
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" Эта команда помечает файлы Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ Ñледующей фикÑации.\n"
+" Чтобы отменить удаление до фикÑации, Ñм. :hg:`revert`. Чтобы отменить\n"
+" добавление файлов, Ñм. :hg:`forget`."
+
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" ИÑпользуйте -A/--after, чтобы удалить из хранилища файлы,\n"
+" которые были удалены из рабочего каталога. -f/--force\n"
+" удалÑет файлы принудительно, -Af можно иÑпользовать чтобы\n"
+" удалить файлы из Ñледующей ревизии, не удалÑÑ Ð¸Ñ… из рабочего\n"
+" каталога."
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" ÐŸÑ€Ð¸Ð²ÐµÐ´ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ таблица поÑÑнÑет поведение команды remove длÑ\n"
+" разных ÑоÑтоÑний файла (Ñтолбцы) и комбинаций параметров (Ñтроки).\n"
+" СоÑтоÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² (как их показывает :hg:`status`):\n"
+" Добавлен (Added) [A], Без изменений (Clean) [C],\n"
+" Изменен (Modified) [M], ОтÑутÑтвует (Missing) [!]. ДейÑтвиÑ:\n"
+" Предупредить (Warn - W), удалить из ветки (Remove - R), удалить\n"
+" Ñ Ð´Ð¸Ñка (Delete - D)."
+
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" нет W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+" Обратите внимание, что remove никогда не удалÑет из рабочего\n"
+" каталога файлы Ñ ÑоÑтоÑнием Added [A], даже c параметром --force."
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" При уÑпехе возвращает 0, 1 еÑли были предупреждениÑ.\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "%s не удален: файл не контролируетÑÑ\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr "%s не удален: файл еще ÑущеÑтвует (-f - удалить принудительно)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr "%s не удален: файл изменен (-f - удалить принудительно)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr ""
+"%s не удален: файл был помечен Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (иÑпользуйте forget Ð´Ð»Ñ "
+"отмены)\n"
+
+msgid "record a rename that has already occurred"
+msgstr "запиÑать переименование, которое уже было Ñделано"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[ПÐРÐМЕТР]... ИСТОЧÐИК... ÐÐЗÐÐЧЕÐИЕ"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "переименовать файлы; Ñквивалентно copy + remove"
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+" Помечает файлы Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ðº копии файлов-иÑточников; помечает\n"
+" иÑточники Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ. ЕÑли ÐÐЗÐÐЧЕÐИЕ - каталог, копии\n"
+" помещаютÑÑ Ð² Ñтот каталог. ЕÑли ÐÐЗÐÐЧЕÐИЕ - файл, то ИСТОЧÐИК\n"
+" может быть только один."
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" ДейÑтвие команды закреплÑетÑÑ Ð¿Ñ€Ð¸ Ñледующей фикÑации. чтобы отменить\n"
+" переименование, Ñм. :hg:`revert`."
+
+msgid "select all unresolved files"
+msgstr "работать Ñо вÑеми требующими ÑлиÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸"
+
+msgid "list state of files needing merge"
+msgstr "показать ÑоÑтоÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð², требующих ÑлиÑниÑ"
+
+msgid "mark files as resolved"
+msgstr "пометить файлы как корректно Ñлитый"
+
+msgid "mark files as unresolved"
+msgstr "пометить файлы как требующие ÑлиÑниÑ"
+
+msgid "hide status prefix"
+msgstr "не показывать Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ÑоÑтоÑниÑ"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr "повторить ÑлиÑÐ½Ð¸Ñ Ð¸Ð»Ð¸ задать/поÑмотреть ÑÑ‚Ð°Ñ‚ÑƒÑ ÑлиÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²"
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents). See :hg:`help\n"
+" merge-tools` for information on configuring merge tools."
+msgstr ""
+" Ðеразрешенные конфликтами чаÑто ÑвлÑÑŽÑ‚ÑÑ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð¼ неинтерактивного\n"
+" ÑлиÑÐ½Ð¸Ñ Ñ Ð¸Ñпользованием ``internal:merge``, или программы ÑлиÑниÑ\n"
+" Ñ Ñ‚ÐµÐºÑтовым интерфейÑом, вроде ``diff3``. Команда resolve может\n"
+" быть иÑпользована Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸, учаÑтвующими в ÑлиÑнии,\n"
+" поÑле того, как была запущена :hg:`merge`, но до :hg:`commit`\n"
+" (т.е. рабочий каталог должен иметь двух \"родителей\"). См. :hg:`help\n"
+" merge-tools` — Ñправку о наÑтройке ÑредÑтв ÑлиÑниÑ."
+
+msgid " The resolve command can be used in the following ways:"
+msgstr " Команда resolve может иÑпользоватьÑÑ Ñледующими ÑпоÑобами:"
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+" - :hg:`resolve [--tool ПРОГРÐММÐ] ФÐЙЛ...`: попытатьÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð¸Ñ‚ÑŒ "
+"ÑлиÑние\n"
+" файлов, отменÑÑ Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð¸Ðµ попытки. Повторное ÑлиÑние не проводитÑÑ\n"
+" Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð², помеченных как разрешенные. ИÑпользуйте ``--all/-a``,\n"
+" чтобы повторить ÑлиÑние Ð´Ð»Ñ Ð²Ñех неразрешенных файлов. Параметр\n"
+" ``--tool`` может быть иÑпользован, чтобы задать программу Ð´Ð»Ñ "
+"ÑлиÑниÑ.\n"
+" Он замещает переменную Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ HGMERGE и конфиг. Предыдущее "
+"Ñодержимое\n"
+" файла ÑохранÑетÑÑ Ñ Ñ€Ð°Ñширением ``.orig``."
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+" - :hg:`resolve -m [ФÐЙЛ]`: пометить указанный файл как файл Ñ\n"
+" разрешенными конфликтами (Ñ‚.е. поÑле ручного иÑправлениÑ\n"
+" конфликтов). По умолчанию помечает вÑе файлы Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°Ð¼Ð¸."
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+" - :hg:`resolve -u [ФÐЙЛ]...`: пометить файл как файл Ñ\n"
+" неразрешенными конфликтами. По умолчанию помечает вÑе\n"
+" неразрешенные файлы."
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+" - :hg:`resolve -l`: перечиÑлить файлы, в которых были или\n"
+" до Ñих пор еÑÑ‚ÑŒ конфликты. Ð’ ÑпиÑке ``U`` = конфликты еÑÑ‚ÑŒ\n"
+" (Unresolved), ``R`` = конфликтов нет (Resolved)."
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+" Обратите внимание, что Mercurial не даÑÑ‚ вам зафикÑировать файлы\n"
+" Ñ Ð½ÐµÑ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ конфликтами ÑлиÑниÑ. Ðеобходимо иÑпользовать\n"
+" :hg:`resolve -m` перед фикÑацией поÑле ÑлиÑÐ½Ð¸Ñ Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð°Ð¼Ð¸."
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+" При уÑпехе возвращает 0, 1 еÑли не удалоÑÑŒ разрешить файл.\n"
+" "
+
+msgid "too many options specified"
+msgstr "указано Ñлишком много параметров"
+
+msgid "can't specify --all and patterns"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ шаблон и --all одновременно"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr "не заданы файлы или каталоги; --all повторит ÑлиÑние Ð´Ð»Ñ Ð²Ñех файлов"
+
+msgid "revert all changes when no arguments given"
+msgstr "без аргументов - вернуть файлы к прежнему ÑоÑтоÑнию"
+
+msgid "tipmost revision matching date"
+msgstr "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ позднее ДÐТЫ"
+
+msgid "revert to the specified revision"
+msgstr "вернуть ÑоÑтоÑние на момент указанной ревизии"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[ПÐРÐМЕТР]... [-r РЕВИЗИЯ] [ИМЯ]..."
+
+msgid "restore files to their checkout state"
+msgstr "воÑÑтановить файлы до их ÑоÑтоÑÐ½Ð¸Ñ Ð² хранилище"
+
+# does this require a translation?
+msgid " .. note::"
+msgstr " .. примечание::"
+
+msgid ""
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" Чтобы извлечь более ранние ревизии, необходимо иÑпользовать\n"
+" :hg:`update РЕВИЗИЯ`. Чтобы отменить ÑлиÑние (Ñ Ð¿Ð¾Ñ‚ÐµÑ€ÐµÐ¹ Ñделанных\n"
+" изменений), иÑпользуйте :hg:`update --clean .`."
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ задана, вернуть указанные файлы и каталоги к\n"
+" ÑоÑтоÑнию, в котором они Ñохранены в родительÑкой ревизии\n"
+" рабочего каталога. Это воÑÑтанавливает Ñодержимое указанных\n"
+" файлов до неизмененного ÑоÑтоÑÐ½Ð¸Ñ Ð¸ отменÑет запланированные\n"
+" добавлениÑ, удалениÑ, ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð².\n"
+" ЕÑли рабочий каталог имеет двух родителей, необходимо Ñвно\n"
+" указать ревизию."
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+" С параметром -r/--rev или -d/--date воÑÑтанавливает Ñодержимое \n"
+" заданных файлов и каталогов до указанной ревизии. Т.к. revert \n"
+" изменÑет родителей рабочего каталога, Ñти файлы будут показыватьÑÑ\n"
+" как измененные. Это может быть полезным чтобы \"откатить\" вÑе или\n"
+" некоторые предшеÑтвующие изменениÑ. См. также backout."
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" Измененные файлы ÑохранÑÑ‚ÑÑ Ñ Ñ€Ð°Ñширением .orig перед\n"
+" воÑÑтановлением. Можно отключить Ñто резервное копирование\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ --no-backup."
+
+msgid "you can't specify a revision and a date"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ ÑƒÐºÐ°Ð·Ñ‹Ð²Ð°Ñ‚ÑŒ одновременно дату и ревизию"
+
+msgid "uncommitted merge with no revision specified"
+msgstr "имеетÑÑ Ð½ÐµÐ·Ð°Ñ„Ð¸ÐºÑированное ÑлиÑние, и номер ревизии не указан"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr "иÑпользуйте \"hg update\", или Ñм. \"hg help revert\""
+
+msgid "no files or directories specified"
+msgstr "не указаны файлы или каталоги"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"незафикÑированное ÑлиÑние, иÑпользуйте --all чтобы ÑброÑить вÑе изменениÑ\n"
+"или 'hg update -C .' чтобы отменить ÑлиÑние."
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"незафикÑированные изменениÑ, иÑпользуйте --all чтобы ÑброÑить вÑе изменениÑ\n"
+"или 'hg update %s' чтобы обновитьÑÑ."
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+"иÑпользуйте --all чтобы воÑÑтановить вÑе файлы, или 'hg update %s'\n"
+"чтобы обновитьÑÑ"
+
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr ""
+"незафикÑированные изменениÑ, иÑпользуйте --all чтобы ÑброÑить вÑе изменениÑ"
+
+msgid "use --all to revert all files"
+msgstr "иÑпользуйте --all чтобы воÑÑтановить вÑе файлы"
+
+msgid "ignore safety measures"
+msgstr "игнорировать меры безопаÑноÑти"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "откатить поÑледнюю транзакцию (опаÑно)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" Эту команду Ñледует иÑпользовать очень оÑторожно, поÑкольку\n"
+" можно откатыватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на один уровень вглубь и Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ\n"
+" откат. Она также воÑÑтановит dirstate на Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ñледней\n"
+" транзакции, терÑÑ Ð²Ñе его изменениÑ, Ñделанные поÑле Ñтого. Эта\n"
+" команда не изменÑет рабочий каталог."
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository."
+msgstr ""
+" Ð”Ð»Ñ Ð¸Ð½ÐºÐ°Ð¿ÑулÑции Ñффектов вÑех команд,\n"
+" которые Ñоздают новые наборы изменений или передают уже\n"
+" ÑущеÑтвующие наборы изменений в хранилище, иÑпользуютÑÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸."
+
+msgid ""
+" For example, the following commands are transactional, and their\n"
+" effects can be rolled back:"
+msgstr ""
+" Так, Ñледующие команды ÑвлÑÑŽÑ‚ÑÑ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¾Ð½Ð½Ñ‹Ð¼Ð¸ и их Ñффекты\n"
+" можно откатить:"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ хранилищем в качеÑтве назначениÑ)\n"
+" - unbundle"
+
+msgid ""
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" Чтобы предотвратить безвозвратную потерю данных, rollback откажетÑÑ\n"
+" выполнÑÑ‚ÑŒ откат транзакции фикÑации, еÑли она не извлечена. Ð’Ñ‹ можете\n"
+" иÑпользовать --force, чтобы откатить принудительно."
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" Эта команда не предназначена Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° публичных\n"
+" хранилищах. ЕÑли Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть утÑнутыми другими\n"
+" пользователÑми, локальный откат транзакций не имеет ÑмыÑла\n"
+" (кто-то могу уже утÑнуть изменениÑ). Более того, возможны гонки\n"
+" Ñ Ñ‡Ð¸Ñ‚Ð°ÑŽÑ‰Ð¸Ð¼Ð¸ хранилище; например, текущий pull может завершитьÑÑ\n"
+" неудачей, еÑли в Ñто Ð²Ñ€ÐµÐ¼Ñ Ð±ÑƒÐ´ÐµÑ‚ вызван rollback."
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+" Возвращает 0 при уÑпехе, 1 еÑли нет данных Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð°.\n"
+" "
+
+msgid "print the root (top) of the current working directory"
+msgstr "напечатать корневой каталог текущего хранилища"
+
+msgid " Print the root directory of the current repository."
+msgstr " Печатает корневой каталог текущего хранилища."
+
+msgid "name of access log file to write to"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи журнала доÑтупа"
+
+msgid "name of error log file to write to"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи журнала ошибок"
+
+msgid "PORT"
+msgstr "ПОРТ"
+
+msgid "port to listen on (default: 8000)"
+msgstr "номер порта Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений (по умолчанию 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений (по умолчанию - вÑе интерфейÑÑ‹)"
+
+msgid "ADDR"
+msgstr "ÐДРЕС"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "корневой каталог веб-Ñервера (по умолчанию: корень Ñервера)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+"имÑ, показываемое на веб-Ñтраницах (по умолчанию Ð¸Ð¼Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "путь к конфигу hgweb (Ñм. \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr "путь к конфигу hgweb (УСТÐРЕЛО)"
+
+msgid "for remote clients"
+msgstr "Ð´Ð»Ñ Ð¾Ñ‚Ð´Ð°Ð»Ñ‘Ð½Ð½Ñ‹Ñ… клиентов"
+
+msgid "web templates to use"
+msgstr "иÑпользуемые веб-шаблоны"
+
+msgid "template style to use"
+msgstr "иÑпользуемый Ñтиль шаблона"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "иÑпользовать IPv6 вмеÑте Ñ IPv4"
+
+msgid "SSL certificate file"
+msgstr "Файл Ñертификата SSL"
+
+msgid "start stand-alone webserver"
+msgstr "запуÑтить автономный веб-Ñервер"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+" ЗапуÑкает локальный HTTP-обозреватель хранилища и pull-Ñервер.\n"
+" Эту команду можно иÑпользовать в качеÑтве проÑтого ÑпоÑоба\n"
+" организации ÑовмеÑтного доÑтупа и проÑмотра хранилища по Ñети.\n"
+" Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ Ñерьезной работы в течение длительного времени,\n"
+" рекомендуетÑÑ Ð¸Ñпользовать нормальный веб-Ñервер."
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+" Обратите внимание, что такой Ñервер не поддерживает права доÑтупа.\n"
+" Это значит, что по умолчанию кто угодно может читать хранилища\n"
+" и не может пиÑать в них. УÑтановите параметр ``web.allow_push`` в\n"
+" значение ``*``, чтобы разрешить вÑем делать push на Ñервер.\n"
+" ИÑпользуйте наÑтоÑщий веб-Ñервер, еÑли требуетÑÑ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ\n"
+" пользователей."
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" По умолчанию Ñервер направлÑет лог входÑщих Ñоединений в stdout,\n"
+" а лог ошибок - в stderr. ИÑпользуйте -A/--accesslog и -E/--errlog\n"
+" Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи логов в файлы."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+" Сервер Ñам выберет Ñвободный порт Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений, еÑли\n"
+" указать 0 в качеÑтве номера входÑщего порта; в Ñтом Ñлучае он\n"
+" напечатает выбранный порт."
+
+msgid "cannot use --stdio with --cmdserver"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать --stdio Ñ --cmdserver"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "Ñлушаю по адреÑу http://%s%s/%s (привÑзан к %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr "показать недоверенные наÑтройки конфига"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [ИМЯ]..."
+
+msgid "show combined config settings from all hgrc files"
+msgstr "показать Ñовмещенные наÑтройки из вÑех файлов конфигурации"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr " Без аргументов печатает имена и Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñех параметров конфига."
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+" С одним аргументом вида \"ÑекциÑ.имÑ\" печатает только значение\n"
+" Ñтого параметра."
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+" С неÑколькими аргументами печатает имена и Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñех\n"
+" параметров конфига Ñ Ñовпадающими именами разделов."
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+" ЕÑли указан --debug, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ параметра печатаетÑÑ Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°\n"
+" и номер Ñтроки, откуда он был прочитан."
+
+msgid "only one config item permitted"
+msgstr "можно указать только один параметр конфига"
+
+msgid "show status of all files"
+msgstr "показать ÑоÑтоÑние вÑех файлов"
+
+msgid "show only modified files"
+msgstr "показать только измененные файлы"
+
+msgid "show only added files"
+msgstr "показать только добавленные файлы"
+
+msgid "show only removed files"
+msgstr "показать только отдалённые файлы"
+
+msgid "show only deleted (but tracked) files"
+msgstr "показать только отдалённые (но отÑлеживаемые) файлы"
+
+msgid "show only files without changes"
+msgstr "показать только неизмененные файлы"
+
+msgid "show only unknown (not tracked) files"
+msgstr "показать только неизвеÑтные (не отÑлеживаемые) файлы"
+
+msgid "show only ignored files"
+msgstr "показать только игнорируемые файлы"
+
+msgid "show source of copied files"
+msgstr "показать иÑточник Ñкопированного файла"
+
+msgid "show difference from revision"
+msgstr "показать Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ñ‚ ревизии"
+
+msgid "list the changed files of a revision"
+msgstr "показать измененные файлы Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð° ревизии"
+
+msgid "show changed files in the working directory"
+msgstr "показать измененные файлы в рабочем каталоге"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Показывает ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ„Ð°Ð¹Ð»Ð¾Ð² в хранилище. ЕÑли заданы имена файлов,\n"
+" печатает ÑоÑтоÑÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщих файлов. Файлы без\n"
+" изменений, а также игнорируемые файлы и иÑходные файлы \n"
+" Ñкопированных/переименованных файлов не печатаютÑÑ, еÑли не\n"
+" задан -c/--clean, -i/--ignored, -C/--copies или -A/-all.\n"
+" По умолчанию, еÑли не задан ни один из параметром Ñ Ð´ÐµÐ¹Ñтвием\n"
+" \"показывать только...\", иÑпользуетÑÑ Ð½Ð°Ð±Ð¾Ñ€ опций -mardu."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" ÐžÐ¿Ñ†Ð¸Ñ -q/-quite прÑчет неотÑлеживаемые (неизвеÑтные и игнорируемые)\n"
+" файлы, еÑли Ñвно на заданы -u/--unknown или -i/--ignored."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note::\n"
+" ÑоÑтоÑÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ не Ñовпадать Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð¼ различий, еÑли изменилиÑÑŒ\n"
+" права доÑтупа или произошло ÑлиÑние. Стандартный формат diff\n"
+" не показывает Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð°Ð² доÑтупа и показывает только\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñительно одной родительÑкой ревизии."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" ЕÑли задана одна ревизиÑ, она иÑпользуетÑÑ Ð² качеÑтве базовой.\n"
+" ЕÑли заданы две ревизии, показываютÑÑ Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ними. Можно\n"
+" иÑпользовать --change чтобы вывеÑти только изменённые файлы в\n"
+" в ревизии по Ñравнению Ñ ÐµÐµ первым родителем."
+
+msgid " The codes used to show the status of files are::"
+msgstr " ИÑпользуютÑÑ Ñледующие коды ÑоÑтоÑний файлов::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = изменен (modified)\n"
+" A = добавлен (added)\n"
+" R = удален (removed)\n"
+" C = без изменений (clean)\n"
+" ! = отÑутÑтвует (missing) (удален внешней командой, отÑлеживаетÑÑ)\n"
+" ? = не отÑлеживаетÑÑ\n"
+" I = игнорируетÑÑ (ignored)\n"
+" = иÑточник предыдущего файла показанного как A (добавлен)"
+
+msgid ""
+" - show changes in the working directory relative to a\n"
+" changeset::"
+msgstr ""
+" - показать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² рабочем каталоге отноÑительно\n"
+" набора изменений::"
+
+msgid " hg status --rev 9353"
+msgstr " hg status --rev 9353"
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr ""
+" - показать вÑе изменениÑ, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, в ÑущеÑтвующем\n"
+" наборе изменений::"
+
+msgid " hg status --copies --change 9353"
+msgstr " hg status --copies --change 9353"
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+" - показать разделенный Ñимволом NUL ÑпиÑок добавленных файлов\n"
+" Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ xargs::"
+
+msgid " hg status -an0"
+msgstr " hg status -an0"
+
+msgid "check for push and pull"
+msgstr "проверить наличие входÑщих и иÑходÑщих изменений"
+
+msgid "summarize working directory state"
+msgstr "показать Ñводку ÑоÑтоÑÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+" Показывает краткую Ñводку ÑоÑтоÑÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога, включаÑ\n"
+" информацию о родителÑÑ…, ветке, незафикÑированных файлах и доÑтупных\n"
+" обновлениÑÑ…."
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+" С опцией --remote также проверÑет пути по умолчанию на наличие\n"
+" входÑщих и иÑходÑщих изменений. Это может занÑÑ‚ÑŒ много времени."
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "родитель: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (пуÑтое хранилище)"
+
+msgid " (no revision checked out)"
+msgstr " (нет извлеченной ревизии)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "ветка: %s\n"
+
+msgid "bookmarks:"
+msgstr "закладки:"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d изменено"
+
+#, python-format
+msgid "%d added"
+msgstr "%d добавлено"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d удалено"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d переименовано"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d Ñкопировано"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d удалено"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d неизвеÑтных"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d игнорируетÑÑ"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d Ñ Ð½ÐµÑ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ конфликтами"
+
+#, python-format
+msgid "%d subrepos"
+msgstr "%d подхранилищ"
+
+msgid " (merge)"
+msgstr " (ÑлиÑние)"
+
+msgid " (new branch)"
+msgstr " (Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ‚ÐºÐ°)"
+
+msgid " (head closed)"
+msgstr " (голова закрыта)"
+
+msgid " (clean)"
+msgstr " (без изменений)"
+
+msgid " (new branch head)"
+msgstr " (Ð½Ð¾Ð²Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð° ветки)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "фикÑациÑ: %s\n"
+
+msgid "update: (current)\n"
+msgstr "обновление: (текущее)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "обновление: %d новых наборов изменений (обновление)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "обновление: %d новых наборов изменений, %d голов (ÑлиÑние)\n"
+
+msgid "1 or more incoming"
+msgstr "1 или более входÑщих"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d иÑходÑщих"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d иÑходÑщих закладок"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d иÑходÑщих закладок"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "отдалённо: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "отдалённо: (Ñинхронизировано)\n"
+
+msgid "force tag"
+msgstr "уÑтановить метку принудительно"
+
+msgid "make the tag local"
+msgstr "Ñоздать локальную метку"
+
+msgid "revision to tag"
+msgstr "пометить указанную ревизию"
+
+msgid "remove a tag"
+msgstr "удалить метку"
+
+msgid "use <text> as commit message"
+msgstr "иÑпользовать <текÑÑ‚> в качеÑтве ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m ТЕКСТ] [-d ДÐТÐ] [-u ПОЛЬЗОВÐТЕЛЬ] [-r РЕВ] ИМЯ..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr "приÑвоить одну или более метку текущей или заданной ревизии"
+
+msgid " Name a particular revision using <name>."
+msgstr " ПриÑваивает <имÑ> заданной ревизии"
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" Метки иÑпользуютÑÑ Ð² качеÑтве читаемого имени Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ ревизии\n"
+" и очень полезны, например, чтобы Ñравнить две различные ревизии,\n"
+" вернутьÑÑ Ðº важной более ранней верÑии, чтобы пометить какие-то\n"
+" ревизии как релизы и Ñ‚.д. изменение ÑущеÑтвующих меток обычно\n"
+" не разрешаетÑÑ; Ñто ограничение можно обойти Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -f/--force."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ указана, иÑпользуетÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒ рабочего каталога\n"
+" или Ð¾ÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip), еÑли Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ извлечена."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" Чтобы упроÑтить контроль верÑий, раÑпроÑтранение и ÑлиÑние меток,\n"
+" они хранÑÑ‚ÑÑ Ð² файле \".hgtags\", который обрабатываетÑÑ Ñ‚Ð°Ðº же,\n"
+" как и любой файл в проекте и при необходимоÑти может правитьÑÑ\n"
+" вручную. Это означает, что Ñоздание или изменение метки Ñоздает\n"
+" также и новую фикÑацию. Файл \".hg/localtags\" иÑпользуетÑÑ Ð´Ð»Ñ\n"
+" локальных меток и не передаетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ хранилищами."
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+" Обычно фикÑации, ÑвÑзанные Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸, ÑоздаютÑÑ Ð½Ð° голове ветки.\n"
+" ЕÑли родительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога не ÑвлÑетÑÑ Ð³Ð¾Ð»Ð¾Ð²Ð¾Ð¹\n"
+" ветки, :hg:`tag` не Ñрабатывает. Ð’ Ñтом Ñлучае можно иÑпользовать\n"
+" -f/-force чтобы принудительно Ñоздать фикÑацию Ð´Ð»Ñ Ð¼ÐµÑ‚ÐºÐ¸ на\n"
+" неголовной ревизии."
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+" ПоÑкольку Ð¸Ð¼Ñ Ð¼ÐµÑ‚ÐºÐ¸ имеет больший приоритет при поиÑке ревизии\n"
+" чем Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, наÑтоÑтельно не рекомендуетÑÑ Ð¸Ñпользовать имÑ\n"
+" ÑущеÑтвующей ветки в качеÑтве имени метки."
+
+msgid "tag names must be unique"
+msgstr "Ð¸Ð¼Ñ Ð¼ÐµÑ‚ÐºÐ¸ должно быть уникальным"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "Ð¸Ð¼Ñ Ð¼ÐµÑ‚ÐºÐ¸ не может ÑоÑтоÑÑ‚ÑŒ из одних пробельных Ñимволов"
+
+msgid "--rev and --remove are incompatible"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ иÑпользовать --rev и --remove"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "метка '%s' не ÑущеÑтвует"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "метка '%s' не ÑвлÑетÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð¹"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "метка '%s' не ÑвлÑетÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "метка '%s' уже ÑущеÑтвует (-f - задать принудительно)"
+
+msgid "uncommitted merge"
+msgstr "незафикÑированное ÑлиÑние"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "не на голове ветки (-f - уÑтановить принудительно)"
+
+msgid "null revision specified"
+msgstr "задана пуÑÑ‚Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ"
+
+msgid "list repository tags"
+msgstr "перечиÑлить метки в хранилище"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Печатает обычные и локальные метки. ЕÑли указан -v/--verbose,\n"
+" Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… меток добавлÑетÑÑ Ñ‚Ñ€ÐµÑ‚Ð¸Ð¹ Ñтолбец \"local\"."
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr "показать оконечную (tip) ревизию"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" ÐžÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip) - Ñто набор поÑледний добавленный в\n"
+" хранилище набор изменений (и, Ñледовательно, поÑледнÑÑ\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ)."
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" ЕÑли вы только что Ñделали фикÑацию, Ñта фикÑÐ°Ñ†Ð¸Ñ Ð¸ будет tip'ом.\n"
+" ЕÑли вы только что затÑнули Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· другого хранилища,\n"
+" tip Ñтого хранилища Ñтанет текущим tip'ом. Метка \"tip\"\n"
+" ÑвлÑетÑÑ Ñлужебной и не может быть переименована или назначена\n"
+" другой ревизии."
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr "обновитьÑÑ Ð½Ð° новую голову ветки, еÑли были добавлены наборы изменений"
+
+msgid "[-u] FILE..."
+msgstr "[-u] ФÐЙЛ..."
+
+msgid "apply one or more changegroup files"
+msgstr "применить один или неÑколько файлов групп изменений"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+" ПрименÑет один или неÑколько Ñжатых файлов групп изменений,\n"
+" Ñгенерированных командой bundle."
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+" При уÑпехе возвращает 0, 1 еÑли при обновлении оÑталиÑÑŒ конфликты "
+"ÑлиÑниÑ.\n"
+" "
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "затереть незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ (без ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¾Ð¹ копии)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "обновитьÑÑ Ð½Ð° другую ветку еÑли нет незафикÑированных изменений"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d ДÐТÐ] [[-r] РЕВИЗИЯ]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "обновить рабочий каталог (или переключить ревизию)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch and move the current bookmark (see :hg:`help\n"
+" bookmarks`)."
+msgstr ""
+" ОбновлÑет рабочую копию хранилища на указанную ревизию. ЕÑли\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ задана, обновлÑет до оконечной ревизии (tip) текущей\n"
+" именованной ветки и перемещает текущую закладку (Ñм. :hg:`help\n"
+" bookmarks`)."
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+" Update уÑтанавливает ревизию Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога в заданный\n"
+" набор изменений (Ñм. :hg:`help update`)."
+
+msgid ""
+" If the changeset is not a descendant or ancestor of the working\n"
+" directory's parent, the update is aborted. With the -c/--check\n"
+" option, the working directory is checked for uncommitted changes; if\n"
+" none are found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+" ЕÑли Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ ÑвлÑетÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ¾Ð¼ или предком родительÑкой ревизии\n"
+" рабочего каталога, выполнение update прерываетÑÑ. С параметром -c/--"
+"check\n"
+" рабочий каталог проверÑетÑÑ Ð½Ð° наличие незафикÑированных изменений;\n"
+" еÑли таковых нет, рабочий каталог обновлÑетÑÑ Ð´Ð¾ указанной ревизии."
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" ЕÑли рабочий каталог Ñодержит незафикÑированные изменениÑ,\n"
+" применÑÑŽÑ‚ÑÑ Ñледующие правила:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. ЕÑли не указаны ни -c/--check, ни -C/--clean и еÑли заданнаÑ\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼ или потомком Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾\n"
+" каталога, незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑливаютÑÑ Ð² заданную\n"
+" ревизию и результат ÑлиÑÐ½Ð¸Ñ Ð¾ÑтаетÑÑ Ð½ÐµÐ·Ð°Ñ„Ð¸ÐºÑированным. ЕÑли\n"
+" Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ðµ предок и не потомок (Ñ‚.е. на другой ветке)\n"
+" update завершаетÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, незафикÑированные изменениÑ\n"
+" ÑохранÑÑŽÑ‚ÑÑ."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. С опцией -c/--check update завершаетÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹ и\n"
+" незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑохранÑÑŽÑ‚ÑÑ."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. С опцией -C/--clean незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð±Ñ€Ð°ÑываютÑÑ\n"
+" и рабочий каталог обновлÑетÑÑ Ð´Ð¾ указанной ревизии."
+
+msgid ""
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" Чтобы отменить незафикÑированное ÑлиÑние (Ñ Ð¿Ð¾Ñ‚ÐµÑ€ÐµÐ¹ Ñделанных\n"
+" изменений), иÑпользуйте :hg:`update --clean .`."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" ИÑпользуйте ревизию Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ null чтобы удалить рабочий каталог\n"
+" (как :hg:`clone -U`)."
+
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" ЕÑли вы хотите проÑто вернуть один файл до более Ñтарой\n"
+" ревизии, иÑпользуйте :hg:`revert [-r РЕВИЗИЯ] ИМЯ`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ указывать -c/--check и -C/-clean"
+
+msgid "verify the integrity of the repository"
+msgstr "проверить целоÑтноÑÑ‚ÑŒ хранилища"
+
+msgid " Verify the integrity of the current repository."
+msgstr " ПроверÑет целоÑтноÑÑ‚ÑŒ текущего хранилища."
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Эта команда проводит тщательную проверку целоÑтноÑти хранилища\n"
+" ÑверÑÑ Ñ…Ñши и контрольные Ñуммы каждого Ñлемента в журнале\n"
+" изменений, манифеÑте и отÑлеживаемых файлах, а также целоÑтноÑÑ‚ÑŒ\n"
+" их взаимоÑвÑзей и индекÑов."
+
+msgid "output version and copyright information"
+msgstr "показать верÑию и копирайт"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "РаÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ SCM Mercurial (верÑÐ¸Ñ %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(подробнее Ñм. http://mercurial.selenic.com)"
+
+msgid ""
+"Copyright (C) 2005-2012 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"(С) 2005-2012 Matt Mackall и другие.\n"
+"Это Ñвободное ПО; уÑÐ»Ð¾Ð²Ð¸Ñ Ñ€Ð°ÑпроÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñм. в иÑходном коде.\n"
+"ÐИКÐКИХ ГÐРÐÐТИЙ ÐЕ ПРЕДОСТÐВЛЯЕТСЯ, в том чиÑле на пригодноÑÑ‚ÑŒ длÑ\n"
+"коммерчеÑкого иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ð´Ð»Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½ÐºÑ€ÐµÑ‚Ð½Ñ‹Ñ… задач.\n"
+
+#, python-format
+msgid "unknown mode %s"
+msgstr "неизвеÑтный режим %s"
+
+#, python-format
+msgid "unknown command %s"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° %s"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "не удаетÑÑ Ð²ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ %s (%s)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "рабочий каталог имеет неизвеÑтного Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ '%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ '%s'"
+
+msgid "not found in manifest"
+msgstr "не найден в манифеÑте"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "нет такого файла в ревизии %s"
+
+msgid "branch name not in UTF-8!"
+msgstr "Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ не в UTF-8"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s не ÑущеÑтвует!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+"%s: может потребовать до %d МБ памÑти Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ Ñтого файла\n"
+"(иÑпользуйте 'hg revert %s' чтобы отменить запланированное добавление)\n"
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+"%s не добавлен: в наÑтоÑщий момент поддерживаютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ файлы\n"
+"и ÑимволичеÑкие ÑÑылки\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s уже отÑлеживаетÑÑ!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s не отÑлеживаетÑÑ!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s не изъÑÑ‚ из-под ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr "ошибка при копировании: %s не файл и не ÑимволичеÑÐºÐ°Ñ ÑÑылка\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr "недопуÑтимый Ñимвол в опиÑании графа: %s..."
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr "ожидаетÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€ %i, получен %i"
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr "идентификатор Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ %i больше текущего идентификатора %i"
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr "недопуÑтимый тип ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð² графе: %s"
+
+msgid "nullid"
+msgstr "пуÑтой идентификатор (nullid)"
+
+msgid "working directory state appears damaged!"
+msgstr "похоже, рабочий каталог находитÑÑ Ð² поврежденном ÑоÑтоÑнии!"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr "каталог %r уже в dirstate"
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr "файл %r конфликтует c %r в dirstate"
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr "уÑтановка %r в другого Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð° только Ð´Ð»Ñ ÑлиÑний"
+
+msgid "unknown"
+msgstr "неизвеÑтно"
+
+msgid "character device"
+msgstr "Ñимвольное уÑтройÑтво"
+
+msgid "block device"
+msgstr "блочное уÑтройÑтво"
+
+msgid "fifo"
+msgstr "fifo"
+
+msgid "socket"
+msgstr "Ñокет"
+
+msgid "directory"
+msgstr "каталог"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "неподдерживаемый тип файла (%s)"
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "push ÑоздаÑÑ‚ новые ветки в отдалённом хранилище: %s!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr ""
+"иÑпользуйте 'hg push --new-branch' чтобы Ñоздать новые ветки ветки\n"
+"в отдаленном хранилище"
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "push Ñоздает новую голову в отдаленном хранилище %s на ветке '%s'!"
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr "push ÑоздаÑÑ‚ новую голову %s в отдалённом хранилище!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr ""
+"необходимо выполнить pull, затем merge, либо иÑпользовать push -f,\n"
+"чтобы протолкнуть принудительно"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr ""
+"забыли выполнить ÑлиÑние? иÑпользуйте push -f, чтобы протолкнуть "
+"принудительно"
+
+#, python-format
+msgid "new remote heads on branch '%s'\n"
+msgstr "новые головные ревизии в отдалённом хранилище на ветке '%s'\n"
+
+#, python-format
+msgid "new remote head %s\n"
+msgstr "Ð½Ð¾Ð²Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s в отдалённом хранилище\n"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "внимание: неÑинхронизированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² отдаленном хранилище!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "прервано: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr "(%s)\n"
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr "hg: ошибка разбора в %s: %s\n"
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr "hg: ошибка разбора: %s\n"
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+"вход в отладчик - напечатайте c Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑƒÑка hg или h Ð´Ð»Ñ "
+"Ñправки\n"
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+"hg: команда '%s' неоднозначна:\n"
+" %s\n"
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr "таймаут при ожидании блокировки, удерживаемой %s"
+
+#, python-format
+msgid "lock held by %s"
+msgstr "блокировка удерживаетÑÑ %s"
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "прервано: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "прервано: не удаетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr "hg %s: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr "hg: %s\n"
+
+msgid "abort: remote error:\n"
+msgstr "прервано: ошибка на отдаленной Ñтороне:\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "прервано: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "прервано: %s"
+
+msgid " empty string\n"
+msgstr " пуÑÑ‚Ð°Ñ Ñтрока\n"
+
+# можно так перевеÑти?
+msgid "killed!\n"
+msgstr "прервано Ñигналом!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(вы не забыли Ñкомпилировать раÑширениÑ?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(правильно ли у Ð²Ð°Ñ ÑƒÑтановлен Python?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "прервано: ошибка: %s\n"
+
+msgid "broken pipe\n"
+msgstr "обрыв канала ввода-вывода\n"
+
+msgid "interrupted!\n"
+msgstr "прервано!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"обрыв канала ввода-вывода\n"
+
+msgid "abort: out of memory\n"
+msgstr "прервано: недоÑтаточно памÑти\n"
+
+msgid "the extension author."
+msgstr "автор раÑширениÑ."
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension "
+"%s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+"** ÐеизвеÑтное иÑключение в возможно неиÑправном Ñтороннем дополнении \n"
+"%s\n"
+"** которое поддерживает верÑии Mercurial %s.\n"
+"** Отключите %s и попробуйте еще раз.\n"
+"** ЕÑли Ñто помогло, пожалуйÑта Ñообщите об Ñтом %s\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr "** неизвеÑтное иÑключение, пожалуйте, Ñообщите об Ñтом по адреÑу\n"
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr "** Python %s\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** РаÑÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ ÑиÑтема ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð²ÐµÑ€Ñий Mercurial (верÑÐ¸Ñ %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** Загруженные раÑширениÑ: %s\n"
+
+msgid "too few arguments for command alias"
+msgstr "недоÑтаточно аргументов Ð´Ð»Ñ Ð¿Ñевдонима команды"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr "отÑутÑтвует определение пÑевдонима '%s'\n"
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+"ошибка в определении пÑевдонима '%s': %s может быть задан только в командной "
+"Ñтроке\n"
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "пÑевдоним '%s' ÑводитÑÑ Ðº неизвеÑтной команде '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr "пÑевдоним '%s' ÑводитÑÑ Ðº неоднозначной команде '%s'\n"
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr ""
+"некорректный параметр --config: %r (иÑпользуйте --config ÑекциÑ.имÑ=значение)"
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "ошибка при получении текущего рабочего каталога (cwd): %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "раÑширение '%s' переопределÑет команды: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr "параметр --config не может быть Ñокращен!"
+
+msgid "option --cwd may not be abbreviated!"
+msgstr "параметр --cwd не может быть Ñокращен!"
+
+msgid ""
+"option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+"параметр -R должен быть отделен от других параметров (т.е. не -qR) и\n"
+"--repository можно Ñократить только до --repo!"
+
+#, python-format
+msgid "time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr "времÑ: полное (real) %.3f c (польз %.3f+%.3f ÑиÑÑ‚ %.3f+%.3f)\n"
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "хранилище '%s' не локально"
+
+#, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "хранилище не найдено в '%s' (не найден .hg)"
+
+msgid "warning: --repository ignored\n"
+msgstr "внимание: параметр --repository игнорируетÑÑ\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr "неопознанный формат Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ '%s' - Игнорирован\n"
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+"lsprof не доÑтупен - уÑтановите Ñ http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr "statprof не доÑтупен - уÑтановите Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ \"easy_install statprof\""
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr "Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ‡Ð°Ñтота ÑÑÐ¼Ð¿Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ '%s' - игнорируетÑÑ\n"
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr "неопознанный профилировщик '%s' - игнориретÑÑ\n"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** не удалоÑÑŒ импортировать раÑширение %s из %s: %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** не удалоÑÑŒ импортировать раÑширение %s: %s\n"
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "внимание: не удалоÑÑŒ найти команды в %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "не удалоÑÑŒ найти программу Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ %s\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "программа %s не умеет работать Ñ ÑимволичеÑкими ÑÑылками\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "программа %s не умеет работать Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼Ð¸ файлами\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "программа %s требует графичеÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ\n"
+
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+"``internal:prompt``\n"
+"Спрашивает пользователÑ, какую верÑию файла - локальную или \n"
+" из хранилища - иÑпользовать в качеÑтве Ñлитой верÑии."
+
+# PROMPT
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" не найден инÑтрумент Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ %s\n"
+"иÑпользовать локальный файл:(l)ocal или взÑÑ‚ÑŒ другой:(o)ther?"
+
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+"``internal:local``\n"
+"ИÑпользует локальные верÑии файлов в качеÑтве результата ÑлиÑниÑ."
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+"``internal:other``\n"
+"ИÑпользует верÑию файла из хранилища в качеÑтве результат ÑлиÑниÑ."
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+"``internal:fail``\n"
+"ВмеÑто того, чтобы попытатьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑти ÑлиÑние файлов, измененных на\n"
+" обеих ветках, он помечает их как файлы Ñ Ð½ÐµÑ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸ конфликтами.\n"
+" ПоÑле Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð° должна быть иÑпользована команда resolve."
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr "некорректный параметр %s.premerge ('%s' не логичеÑкий и не %s)"
+
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+"``internal:merge``\n"
+"ИÑпользует внутренний неинтерактивный проÑтой алгоритм ÑлиÑниÑ.\n"
+" ЗавершитьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли обнаружит конфликт, и оÑтавит Ñпециальные\n"
+" маркеры в чаÑтично Ñлитом файле."
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr ""
+"ÑлиÑние %s не завершено! (уÑтраните конфликты, затем иÑпользуйте 'hg resolve "
+"--mark')\n"
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+"``internal:dump``\n"
+"Создает три верÑии файла Ð´Ð»Ñ ÑлиÑниÑ: локальную, из хранилища и\n"
+" базовую. Эти файлы можно иÑпользовать Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ. ЕÑли\n"
+" файл называетÑÑ `a.txt``, то Ñти файлы будут называтьÑÑ ``a.txt.local``,\n"
+" ``a.txt.other`` и ``a.txt.base`` ÑоответÑтвенно и будут находитьÑÑ\n"
+" в том же каталоге, что и ``a.txt``."
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "не удалоÑÑŒ ÑлиÑние %s!\n"
+
+# PROMPT
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr "было ли ÑлиÑние '%s' уÑпешным (y - да, n - нет)?"
+
+# PROMPT
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+" выходной файл %s, похоже, не изменен\n"
+"было ли ÑлиÑние уÑпешным (y - да, n - нет)?"
+
+msgid "unterminated string"
+msgstr "Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ñтрока"
+
+msgid "syntax error"
+msgstr "ÑинтакÑичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+msgid "missing argument"
+msgstr "не хватает аргументов"
+
+msgid "can't use a list in this context"
+msgstr "не могу иÑпользовать ÑпиÑок в Ñтом контекÑте"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+"``modified()``\n"
+" Файл, измененный ÑоглаÑно ÑтатуÑу."
+
+#. i18n: "modified" is a keyword
+msgid "modified takes no arguments"
+msgstr "modified не требует аргументов"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+"``added()``\n"
+" Файл, добавленный ÑоглаÑно ÑтатуÑу."
+
+#. i18n: "added" is a keyword
+msgid "added takes no arguments"
+msgstr "added не требует аргументов"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+"``removed()``\n"
+" Файл, удаленный ÑоглаÑно ÑтатуÑу."
+
+#. i18n: "removed" is a keyword
+msgid "removed takes no arguments"
+msgstr "removed не требует аргументов"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+"``deleted()``\n"
+" Файл, удаленный из рабочего каталога ÑоглаÑно ÑтатуÑу."
+
+#. i18n: "deleted" is a keyword
+msgid "deleted takes no arguments"
+msgstr "deleted не требует аргументов"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``unknown()``\n"
+" Файл, неизвеÑтный ÑоглаÑно ÑтатуÑу. Эти файлы раÑÑматриваютÑÑ\n"
+" только еÑли иÑпользуетÑÑ Ñтот предикат."
+
+#. i18n: "unknown" is a keyword
+msgid "unknown takes no arguments"
+msgstr "unknown не требует аргументов"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+"``ignored()``\n"
+" Файл, игнорируемый ÑоглаÑно ÑтатуÑу. Эти файлы раÑÑматриваютÑÑ\n"
+" только еÑли иÑпользуетÑÑ Ñтот предикат."
+
+#. i18n: "ignored" is a keyword
+msgid "ignored takes no arguments"
+msgstr "ignored не требует аргументов"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+"``clean()``\n"
+" Файлы, не Ñодержащие изменений ÑоглаÑно ÑтатуÑу."
+
+#. i18n: "clean" is a keyword
+msgid "clean takes no arguments"
+msgstr "clean не требует аргументов"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "не функциÑ: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+"``binary()``\n"
+" Файл, который раÑÑматриваетÑÑ ÐºÐ°Ðº бинарный (Ñодержит Ñимволы NUL)."
+
+#. i18n: "binary" is a keyword
+msgid "binary takes no arguments"
+msgstr "binary не требует аргументов"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+"``exec()``\n"
+" Файл, который помечен как иÑполнÑемый."
+
+#. i18n: "exec" is a keyword
+msgid "exec takes no arguments"
+msgstr "exec не требует аргументов"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+"``symlink()``\n"
+" Файл, помеченный как ÑимволичеÑÐºÐ°Ñ ÑÑылка."
+
+#. i18n: "symlink" is a keyword
+msgid "symlink takes no arguments"
+msgstr "symlink не требует аргументов"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+"``resolved()``\n"
+" Файл, конфликты в котором ÑчитаютÑÑ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸."
+
+#. i18n: "resolved" is a keyword
+msgid "resolved takes no arguments"
+msgstr "resolved не требует аргументов"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+"``unresolved()``\n"
+" Файл, конфликты в котором ÑчитаютÑÑ Ð½ÐµÑ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð½Ñ‹Ð¼Ð¸."
+
+#. i18n: "unresolved" is a keyword
+msgid "unresolved takes no arguments"
+msgstr "unresolved не требует аргументов"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+"``hgignore()``\n"
+" Файл, подходÑщие под активный шаблон из .hgignore."
+
+msgid "hgignore takes no arguments"
+msgstr "hgignore не требует аргументов"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+"``grep(regex)``\n"
+" Файл, Ñодержащий заданное регулÑрное выражение."
+
+msgid "grep requires a pattern"
+msgstr "grep требует шаблон"
+
+#, python-format
+msgid "couldn't parse size: %s"
+msgstr "неверно задан размер: %s"
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+"``size(expression)``\n"
+" Размер файла Ñовпадает Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ шаблоном. Ðапример:"
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+" - 1k (файлы от 1024 до 2047 байт)\n"
+" - < 20k (файлы меньше 20480 байт)\n"
+" - >= .5MB (файлы не меньше 524288 байт)\n"
+" - 4k - 1MB (файлы от 4096 байт до 1048576 байт)"
+
+#. i18n: "size" is a keyword
+msgid "size requires an expression"
+msgstr "size требует выражениÑ"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+"``encoding(name)``\n"
+" Файл, который может быть корректно предÑтавлен в данной кодировке.\n"
+" Может быть беÑполезным Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð¾Ðº, отличных от ASCII и UTF-8."
+
+#. i18n: "encoding" is a keyword
+msgid "encoding requires an encoding name"
+msgstr "не указана кодировка в encoding"
+
+#, python-format
+msgid "unknown encoding '%s'"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° '%s'"
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+"``copied()``\n"
+" Файл, запиÑанный как копируемый."
+
+#. i18n: "copied" is a keyword
+msgid "copied takes no arguments"
+msgstr "copied не требует аргументов"
+
+msgid ""
+"``subrepo([pattern])``\n"
+" Subrepositories whose paths match the given pattern."
+msgstr ""
+"``subrepo([шаблон])``\n"
+" Подхранилища, чьи пути Ñовпадают Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ шаблоном"
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo принимает макÑимум один ргумент"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "аргументом subrepo может быть либо шаблон, либо ничего"
+
+msgid "invalid token"
+msgstr "неизвеÑтный Ñимвол"
+
+msgid "starting revisions are not directly related"
+msgstr "начальные ревизии не ÑвÑзаны напрÑмую"
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr "противоречивое ÑоÑтоÑние, %s:%s одновременно плохой и хороший"
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr "неизвеÑтный тип биÑекции %s"
+
+msgid "invalid bisect state"
+msgstr "некорректное ÑоÑтоÑние биÑекции"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "хороший"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "плохой"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "пропущен"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "непротеÑтирован"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "хороший (неÑвно)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "плохой (неÑвно)"
+
+msgid "disabled extensions:"
+msgstr "отключенные раÑширениÑ:"
+
+msgid "VALUE"
+msgstr "ЗÐÐЧЕÐИЕ"
+
+msgid "DEPRECATED"
+msgstr "УСТÐРЕЛО"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"параметры, помеченные [+], могут указыватьÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾\n"
+
+msgid "Configuration Files"
+msgstr "Файлы конфигурации"
+
+msgid "Date Formats"
+msgstr "Форматы дат"
+
+msgid "File Name Patterns"
+msgstr "Шаблоны имен файлов"
+
+msgid "Environment Variables"
+msgstr "Переменные окружениÑ"
+
+msgid "Specifying Single Revisions"
+msgstr "Задание одной ревизии"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Задание неÑкольких ревизий"
+
+msgid "Specifying Revision Sets"
+msgstr "Задание набора ревизий"
+
+msgid "Specifying File Sets"
+msgstr "Задание набора файлов"
+
+msgid "Diff Formats"
+msgstr "Форматы файлов различий"
+
+msgid "Merge Tools"
+msgstr "ИнÑтрументы Ð´Ð»Ñ ÑлиÑниÑ"
+
+msgid "Template Usage"
+msgstr "ИÑпользование шаблонов"
+
+msgid "URL Paths"
+msgstr "Пути URL"
+
+msgid "Using Additional Features"
+msgstr "ИÑпользование дополнительных возможноÑтей"
+
+msgid "Subrepositories"
+msgstr "Подхранилища"
+
+msgid "Configuring hgweb"
+msgstr "ÐаÑтройка hgweb"
+
+msgid "Glossary"
+msgstr "ГлоÑÑарий"
+
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "СинтакÑÐ¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Mercurial"
+
+msgid "Working with Phases"
+msgstr "Работа c фазами"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+"Mercurial иÑпользует набор файлов конфигурации (Ñокращенно конфиги),\n"
+"управлÑющих различными аÑпектами его поведениÑ."
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Конфиги Mercurial - Ñто проÑтые ini-файлы. Файл конфига ÑоÑтоит из\n"
+"разделов (Ñекций), начинающихÑÑ Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° ``[ÑекциÑ]`` Ñ Ð¿Ð¾Ñледующими\n"
+"наÑтройками вида ``Ð¸Ð¼Ñ = значение``::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Ð˜Ð¼Ñ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ <имÑ.фамилиÑ@example.net>\n"
+" verbose = True"
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"Эти параметры далее будут упоминатьÑÑ ÐºÐ°Ðº ``ui.username`` и\n"
+"``ui.verbose`` ÑоответÑтвенно. См. раздел СинтакÑÐ¸Ñ Ð½Ð¸Ð¶Ðµ."
+
+msgid ""
+"Files\n"
+"====="
+msgstr ""
+"Файлы\n"
+"====="
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+"Mercurial читает параметры из неÑкольких файлов, еÑли они ÑущеÑтвуют.\n"
+"Эти файлы не ÑущеÑтвуют по умолчанию, и вам нужно Ñоздать нужные\n"
+"файлы ÑамоÑтоÑтельно: глобальные наÑтройки, вроде имени пользователÑ, "
+"обычно\n"
+"помещают в ``%USERPROFILE%\\mercurial.ini`` или ``$HOME/.hgrc``, а\n"
+"локальные наÑтройки хранÑÑ‚ÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ хранилища в файле\n"
+"``<хранилище>/.hg/hgrc``."
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+"Имена Ñтих файлов завиÑÑÑ‚ от операционной ÑиÑтемы. Файлы ``*.rc``,\n"
+"находÑщиеÑÑ Ð² одном каталоге, читаютÑÑ Ð² алфавитном порÑдке, при Ñтом\n"
+"поÑледующие переопределÑÑŽÑ‚ предыдущие. ЕÑли далее указано неÑколько\n"
+"путей, первые имеют приоритет над поÑледующими."
+
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr "| (All) ``<хранилище>/.hg/hgrc``"
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+" belong to a trusted user or to a trusted group. See the documentation\n"
+" for the ``[trusted]`` section below for more details."
+msgstr ""
+" Индивидуальные наÑтройки хранилища - Ñто те, которые дейÑтвуют\n"
+" только Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ хранилища. Этот файл не учаÑтвует в контроле\n"
+" верÑий и не ÑкачиваетÑÑ Ð¿Ñ€Ð¸ клонировании. ÐаÑтройки в Ñтом файле\n"
+" переопределÑÑŽÑ‚ наÑтройки других файлов. Ð’ Unix и Plan9 Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ñ‡Ð°ÑÑ‚ÑŒ\n"
+" Ñтого файла игнорируетÑÑ, еÑли он не принадлежат доверенному\n"
+" пользователю или группе. См. документацию по Ñекции ``[trusted]``."
+
+msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+" Файлы конфигурации текущего пользователÑ, от имени которого.\n"
+" запущен Mercurial. Под Windows 9x ``%HOME%`` заменÑетÑÑ Ð½Ð°\n"
+" %APPDATA%. ÐаÑтройки из Ñтих файлов применÑÑŽÑ‚ÑÑ ÐºÐ¾ вÑем командам,\n"
+" выполнÑемым Ñтим пользователем в любом каталоге. ÐаÑтройки из\n"
+" из Ñтих файлов переопределÑÑŽÑ‚ общеÑиÑтемные наÑтройки и наÑтройки\n"
+" данной инÑталлÑции."
+
+msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+" ОбщеÑиÑтемные файлы конфигурации дейÑтвуют Ð´Ð»Ñ Ð²Ñей ÑиÑтемы,\n"
+" в которой уÑтановлен Mercurial. ÐаÑтройки из Ñтих файлов дейÑтвуют\n"
+" Ð´Ð»Ñ Ð²Ñех команд, выполнÑемых вÑеми пользователÑми в любом каталоге.\n"
+" ÐаÑтройки из Ñтих файлов переопределÑÑŽÑ‚ наÑтройки инÑталлÑции."
+
+msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+"| (Plan 9) ``<корень-уÑтановки>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<корень-уÑтановки>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<корень-уÑтановки>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<корень-уÑтановки>/etc/mercurial/hgrc.d/*.rc``"
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+" Файлы конфигурации инÑталлÑции - Ñто файлы, которые находÑÑ‚ÑÑ Ð²\n"
+" каталоге, в который уÑтановлен Mercurial. ``<корень-уÑтановки>`` -\n"
+" Ñто каталог, в котором находитÑÑ Ð·Ð°Ð¿ÑƒÑ‰ÐµÐ½Ð½Ð¾Ð³Ð¾ иÑполнÑемого файла\n"
+" **hg** (или ÑимволичеÑÐºÐ°Ñ ÑÑылка на него). Ðапример, еÑли Mercurial\n"
+" уÑтановлен в ``/shared/tools/bin/hg``, он будет пытатьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ\n"
+" файл ``/shared/tools/etc/mercurial/hgrc``. ÐаÑтройки из Ñтих файлов\n"
+" дейÑтвуют Ð´Ð»Ñ Ð²Ñех команд, иÑполнÑемыми любым пользователем в любом\n"
+" каталоге."
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+"| (Windows) ``<каталог-уÑтановки>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<каталог-уÑтановки>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected."
+msgstr ""
+" ÐаÑтройки из файлов конфигурации инÑталлÑции/общеÑиÑтемных файлов\n"
+" влиÑÑŽÑ‚ на вÑе команды, запуÑкаемые вÑеми пользователÑми в любых\n"
+" каталогах. Ключи рееÑтра Ñодержат Ñтроки, по формату похожие на PATH,\n"
+" ÐºÐ°Ð¶Ð´Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ которых должна быть путем к файлу ``Mercurial.ini``\n"
+" или каталогу Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ ``*.rc``. Mercurial проÑматривает вÑе Ñти пути\n"
+" в указанном порÑдке пока не найдет один или более файл конфигурации."
+
+msgid ""
+"Syntax\n"
+"======"
+msgstr ""
+"СинтакÑиÑ\n"
+"========="
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+"Файлы конфигурации ÑоÑтоÑÑ‚ из разделов (Ñекций), начинающихÑÑ Ñ\n"
+"заголовка ``[ÑекциÑ]`` Ñ Ð¿Ð¾Ñледующими наÑтройками вида ``Ð¸Ð¼Ñ = значение``\n"
+"(иногда называемыми ``ключами конфигурации``)::"
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+"ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока Ñодержит одну наÑтройку. ЕÑли поÑледующие Ñтроки\n"
+"выделены отÑтупами, они ÑчитаютÑÑ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸ÐµÐ¼ Ñтой наÑтройки.\n"
+"Ведущие пробелы удалÑÑŽÑ‚ÑÑ Ð¸Ð· значений. ПуÑтые Ñтроки пропуÑкаютÑÑ.\n"
+"Строки, начинающиеÑÑ Ñ ``#`` или ``;`` игнорируютÑÑ Ð¸ могут\n"
+"иÑпользоватьÑÑ Ð² качеÑтве комментариев."
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+"Ключи конфигурации могут задаватьÑÑ Ð½ÐµÑколько раз, при Ñтом будет\n"
+"иÑпользоватьÑÑ Ð¿Ð¾Ñледний. Ðапример::"
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr "Это уÑтановит ключ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ``eggs`` в значение ``small``."
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+"Секцию также можно определÑÑ‚ÑŒ неÑколько раз. Ð¡ÐµÐºÑ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть\n"
+"переопределена в том же и/или другом файле. Ðапример::"
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+"Ключи ``eggs``, ``ham`` и ``bread`` Ñекции ``foo`` будут уÑтановлены\n"
+"в Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ``medium``, ``proscuitto`` и ``toasted`` ÑоответÑтвенно.\n"
+"Как видно, имеет значение только поÑледнÑÑ ÑƒÑтановка параметра."
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+"ЕÑли ключ уÑтановлен неÑколько раз в разных файлах, окончательное\n"
+"значение завиÑит от порÑдка, в котором читаютÑÑ Ñ„Ð°Ð¹Ð»Ñ‹, причем чем\n"
+"раньше он читаетÑÑ, тем выше его приоритет, как опиÑано выше в\n"
+"разделе ``Файлы``."
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+"Строка вида ``%include файл`` включает файл ``файл`` в текущий\n"
+"файл конфигурации. Включение рекурÑивно, Ñ‚.е. включенные файлы\n"
+"также могут включать другие файлы. Пути файлов задаютÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно\n"
+"файла конфигурации, в котором находитÑÑ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð° ``%include``. Ð’\n"
+"имени файла выполнÑетÑÑ Ð¿Ð¾Ð´Ñтановка переменных Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¸ конÑтрукций\n"
+"вида ``~user``. Это позволÑет напиÑать::"
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr " %include ~/.hgrc.d/$HOST.rc"
+
+msgid "to include a different configuration file on each computer you use."
+msgstr "чтобы включать различные файлы на разных компьютерах."
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+"Строка ``%unset имÑ`` удалит ``имÑ`` из текущей Ñекции, еÑли оно\n"
+"было определено ранее."
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+"Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑвлÑÑŽÑ‚ÑÑ Ð»Ð¸Ð±Ð¾ текÑтовыми Ñтроками произвольной формы, либо\n"
+"ÑпиÑками текÑтовых Ñтрок, либо логичеÑкими значениÑми. ЛогичеÑкие\n"
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑƒÑтанавливаютÑÑ Ð² иÑтину Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ \"1\", \"yes\", \"true\",\n"
+"или \"on\", а в ложь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ \"0\", \"no\", \"false\", или \"off\"\n"
+"(вÑе нечувÑтвительны к региÑтру букв)."
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+"Элементы ÑпиÑков отделÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»ÑŒÐ½Ñ‹Ð¼Ð¸ Ñимволами или запÑтыми, за\n"
+"иÑключением Ñлучаев, когда Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‚ÑÑ Ð² двойные кавычки::"
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr " allow_read = \"John Doe, PhD\", brian, betty"
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+"Кавычки могут быть Ñкранированы предшеÑтвующим обратным ÑлÑшем.\n"
+"Только кавычки в начале Ñлова ÑвлÑÑŽÑ‚ÑÑ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÐµÐ¼ (Ñ‚.е.\n"
+"``foo\"bar baz`` - Ñто ÑпиÑок из ``foo\"bar`` и ``baz``)."
+
+msgid ""
+"Sections\n"
+"========"
+msgstr ""
+"Секции\n"
+"======"
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+"Этот раздел опиÑывает Ñекции, которые могут иÑпользоватьÑÑ Ð² файле\n"
+"конфигурации Mercurial, назначение каждой Ñекции, их возможные ключи\n"
+"и их значениÑ."
+
+msgid ""
+"``alias``\n"
+"---------"
+msgstr ""
+"``alias``\n"
+"---------"
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+"ОпределÑет пÑевдонимы команд\n"
+"ПÑевдонимы позволÑÑŽÑ‚ определить ÑобÑтвенную команду Ñ Ð¸Ñпользованием\n"
+"других команд (или пÑевдонимов), возможно принимающую аргументы.\n"
+"Позиционные аргументы в виде ``$1``, ``$2`` ... в определении\n"
+"пÑевдонима раÑкрываютÑÑ Ð¿ÐµÑ€ÐµÐ´ выполнением. Позиционные аргументы,\n"
+"еще не иÑпользованные до ``$N`` в определении, добавлÑÑŽÑ‚ÑÑ Ð² конец\n"
+"выполнÑемой команды."
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr "ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñевдонимов ÑоÑтоÑÑ‚ из Ñтрок вида::"
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr " <пÑевдоним> = <команда> [<аргумент>]..."
+
+msgid "For example, this definition::"
+msgstr "Ðапример, Ñто определение::"
+
+msgid " latest = log --limit 5"
+msgstr " latest = log --limit 5"
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+"Ñоздает новую команду ``latest``, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ пÑÑ‚ÑŒ поÑледних\n"
+"ревизий. Можно Ñоздавать пÑевдонимы Ñ Ð¸Ñпользованием уже определенных::"
+
+msgid " stable5 = latest -b stable"
+msgstr " stable5 = latest -b stable"
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+".. note:: Можно Ñоздать пÑевдоним Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, Ñовпадающим Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼\n"
+" ÑущеÑтвующих команд, который переопределит первоначальные\n"
+" команды. Это почти вÑегда Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ Ð¸Ð´ÐµÑ!"
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+"ПÑевдоним может начинатьÑÑ Ñ ``!``, тогда он ÑтановитÑÑ Ð¿Ñевдонимом\n"
+"командной оболочки (шела). ПÑевдоним шела иÑполнÑетÑÑ ÑˆÐµÐ»Ð¾Ð¼ и позволÑет\n"
+"запуÑкать произвольные команды. Ðапример, ::"
+
+msgid " echo = !echo $@"
+msgstr " echo = !echo $@"
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+"позволит вам выполнить ``hg echo foo``, чтобы напечатать ``foo``\n"
+"в терминале. Пример получше::"
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+"Это заÑтавит ``hg purge`` удалить вÑе неизвеÑтные в хранилище файлы,\n"
+"как Ñто делает раÑширение purge."
+
+msgid ""
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+"Позиционные аргументы, такие как ``$1``, ``$2`` и т.п. в определении\n"
+"пÑевдонима раÑкрываютÑÑ Ð² аргументы команды. Ðргументы, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ…\n"
+"нет ÑоответÑвующих параметров, удалÑÑŽÑ‚ÑÑ. ``$0`` раÑкрываетÑÑ Ð² имÑ\n"
+"пÑевдонима, ``$@`` - в ÑпиÑок вÑех аргументов, разделенных пробелами.\n"
+"Эти подÑтановки выполнÑÑŽÑ‚ÑÑ Ð´Ð¾ того, как команда будет передана\n"
+"оболочке."
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+"ПÑевдонимы оболочки выполнÑÑŽÑ‚ÑÑ Ð² Ñреде, в которой ``$HG`` раÑкрываетÑÑ\n"
+"в путь к иÑполнÑемому в данный момент файлу Mercurial. Это полезно,\n"
+"еÑли вы хотите запуÑтить еще одну команду Mercurial из пÑевдонима,\n"
+"как Ñто Ñделано в предыдущем примере Ð´Ð»Ñ purge. Кроме того, ``$HG_ARGS``\n"
+"раÑкрываетÑÑ Ð² аргументы, переданные Mercurial. Ð’ примере Ñ\n"
+"``hg echo foo``, ``$HG_ARGS`` раÑкроетÑÑ Ð² ``echo foo``."
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+".. note:: Ðекоторые глобальные параметры, такие как ``-R``,\n"
+" обрабатываютÑÑ Ð¿ÐµÑ€ÐµÐ´ пÑевдонимами оболочки, поÑтому они не будут\n"
+" переданы в пÑевдонимы."
+
+msgid ""
+"\n"
+"``annotate``\n"
+"------------"
+msgstr ""
+"\n"
+"``annotate``\n"
+"------------"
+
+msgid ""
+"Settings used when displaying file annotations. All values are\n"
+"Booleans and default to False. See ``diff`` section for related\n"
+"options for the diff command."
+msgstr ""
+"Параметры, иÑпользуемые при отображении аннотаций файлов. Ð’Ñе\n"
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑвлÑÑŽÑ‚ÑÑ Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкими и по умолчанию уÑтановлены в False (Ложь).\n"
+"См. также Ñекцию ``diff``, в которой имеютÑÑ Ñходные параметры\n"
+"Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ diff."
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+"``ignorews``\n"
+" Игнорировать пробельные Ñимволы при Ñравнении Ñтрок"
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+"``ignorewsamount``\n"
+" Игнорировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² количеÑтве пробельных Ñимволов"
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+"``ignoreblanklines``\n"
+" Игнорировать изменениÑ, ÑоÑтоÑщие только из пуÑÑ‚Ñ‹Ñ… Ñтрок"
+
+msgid ""
+"\n"
+"``auth``\n"
+"--------"
+msgstr ""
+"\n"
+"``auth``\n"
+"--------"
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+"Данные Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ по HTTP. Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет хранить\n"
+"имена пользователей и пароли при доÑтупе *к* HTTP-Ñерверам. См.\n"
+"Ñекции ``[web]``, еÑли вы хотите наÑтроить *кто* может логинитьÑÑ\n"
+"на ваш HTTP-Ñервер."
+
+msgid "Each line has the following format::"
+msgstr "ÐšÐ°Ð¶Ð´Ð°Ñ Ñтрока имеет Ñледующий формат::"
+
+msgid " <name>.<argument> = <value>"
+msgstr " <имÑ>.<аргумент> = <значение>"
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+"где ``<имÑ>`` иÑпользуетÑÑ Ñ‡Ñ‚Ð¾Ð±Ñ‹ Ñгруппировать аргументы в запиÑи\n"
+"аутентификации::"
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+
+msgid "Supported arguments:"
+msgstr "Поддерживаемые аргументы:"
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+"``prefix``\n"
+" ``*`` или Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ URI Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ Ñхемы или без него. ИÑпользуетÑÑ\n"
+" запиÑÑŒ аутентификации Ñ Ñамым длинным подходÑщим префикÑом (при Ñтом\n"
+" ``*`` Ñовпадает Ñо вÑем и ÑчитаетÑÑ Ñовпадением Ñ Ð´Ð»Ð¸Ð½Ð¾Ð¹ 1). ЕÑли\n"
+" Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð½Ðµ включает Ñхему, при проверке ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¸Ð· URI также.\n"
+" удалÑетÑÑ Ñхема и далее проверÑетÑÑ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚ schemes."
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+"``username``\n"
+" Ðе обÑзательный. ИмÑ, иÑпользуемое при аутентификации. ЕÑли не\n"
+" задан, а отдалённый Ñайт требует базовую или digest-аутентификацию,\n"
+" пользователь должен будет ввеÑти имÑ. Переменные окружениÑ\n"
+" раÑкрываютÑÑ, позволÑÑ Ð½Ð°Ð¿Ð¸Ñать ``foo.username = $USER``. ЕÑли URI\n"
+" включает Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, раÑÑматриваютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ параметры из \n"
+" Ñекции ``[auth]`` Ñ Ñовпадающим именем или без имени."
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+"``password``\n"
+" Ðе обÑзательный. Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸. ЕÑли не задан, а\n"
+" отдалённый Ñайт требует базовую или digest-аутентификацию,\n"
+" пользователь должен будет ввеÑти пароль."
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``key``\n"
+"\n"
+" Ðе обÑзательный. Зашифрованный PEM ключ Ñертификата клиента.\n"
+" Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ€Ð°ÑкрываютÑÑ Ð² Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+"``cert``\n"
+" Ðе обÑзательный. Зашифрованный PEM файл цепочки Ñертификата клиента.\n"
+" Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ€Ð°ÑкрываютÑÑ Ð² Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°."
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+"``schemes``\n"
+" Ðе обÑзательный. Разделенный пробелами ÑпиÑок Ñхем URI длÑ\n"
+" Ñтой запиÑи. ИÑпользуютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли prefix не включает имени\n"
+" Ñхемы. ПоддерживаютÑÑ http и https. Также Ñовпадут Ð´Ð»Ñ ÑтатичеÑких\n"
+" http и https ÑоответÑтвенно.\n"
+" По умолчанию: https."
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+"ЕÑли не найдено подходÑщей запиÑи аутентификации, параметры\n"
+"аутентификации будут запрошены как обычно, еÑли требуютÑÑ."
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+msgstr ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+"Фильтры Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² при извлечении/фикÑации. Обычно\n"
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ переводов Ñтроки, локализации или\n"
+"приведении файлов к единому виду."
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+"Фильтр ÑоÑтоит из шаблона Ñ Ð¿Ð¾Ñледующей командой. По умолчанию,\n"
+"шаблоны задаютÑÑ Ð² виде glob'ов, пути отноÑительно ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°.\n"
+"Ðапример, чтобы выбрать вÑе файлы, оканчивающиеÑÑ Ð½Ð° ``.txt``, только\n"
+"из корневого каталога хранилища, иÑпользуйте шаблон ``.txt``. Чтобы\n"
+"выбрать файлы, оканчивающиеÑÑ Ð½Ð° ``.c``, во вÑем хранилище,\n"
+"иÑпользуйте шаблон ``**.c``. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла применÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+"первый Ñовпавший фильтр."
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+"Команда фильтра может начинатьÑÑ Ñо Ñпецификатора - ``pipe:`` или\n"
+"``tempfile:``. ЕÑли не указан, по умолчанию иÑпользуетÑÑ ``pipe:``."
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+"Команда Ñ ``pipe:`` должна читать данные Ñо Ñтандартного ввода и\n"
+"печатать преобразованные данные на Ñтандартный вывод."
+
+msgid "Pipe example::"
+msgstr "Пример Ñ pipe::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+" [encode]\n"
+" # раÑпаковать архивированные gzip'ом файлы при фикÑации Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ\n"
+" # ÑÐ¶Ð°Ñ‚Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹ (дельт).\n"
+" # примечание: Ðе обÑзательно Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð´ÐµÑ, проÑто пример.\n"
+" *.gz = pipe: gunzip"
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+" [decode]\n"
+" # пережимать файлы gzip'ом при из запиÑи в рабочий каталог (можно\n"
+" # безопаÑно опуÑтить \"pipe\", Ñ‚.к. оно иÑпользуетÑÑ Ð¿Ð¾ умолчанию)\n"
+" *.gz = gzip"
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+" Команда ``tempfile:`` ÑвлÑетÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼. Строка ``INFILE`` заменÑетÑÑ\n"
+"именем временного файла, Ñодержащим данные Ð´Ð»Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ð¸. Строка\n"
+"``OUTFILE`` заменÑетÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ пуÑтого временного файла, куда должен\n"
+"быть запиÑан вывод команды."
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+".. note:: Временные файлы рекомендуютÑÑ Ð´Ð»Ñ ÑиÑтем Windows, где\n"
+" Ñтандартные Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð°/вывода могут иметь Ñтранные\n"
+" Ñффекты и могут повредить Ñодержимое файлов."
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+"Этот механизм иÑпользуетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ ``eol`` чтобы менÑÑ‚ÑŒ\n"
+"Ñимволы перевода Ñтроки из формата Windows (CRLF) в Unix (LF) и\n"
+"обратно. РекомендуетÑÑ Ð¸Ñпользовать Ñто раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтой цели."
+
+msgid ""
+"\n"
+"``defaults``\n"
+"------------"
+msgstr ""
+"\n"
+"``defaults``\n"
+"------------"
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr "(уÑтарело. Ðе иÑпользуйте Ñту Ñекцию. ИÑпользуйте пÑевдонимы.)"
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+"ИÑпользуйте Ñекцию ``[defaults]`` чтобы определить параметры по\n"
+"умолчанию Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹, Ñ‚.е. параметры/аргументы, которые будут\n"
+"автоматичеÑки передаватьÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ðµ при вызове."
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+"Этот пример по умолчанию запуÑкает команду :hg:`log` Ñ Ð¿Ð¾Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ð¼\n"
+"выводом, а :hg:`status` заÑтавлÑет показывать только измененные файлы::"
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+"При определении умолчаний Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, должны иÑпользоватьÑÑ Ñами команды,\n"
+"а не из пÑевдонимы. Ð£Ð¼Ð¾Ð»Ñ‡Ð°Ð½Ð¸Ñ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ применÑÑŽÑ‚ÑÑ Ñ‚Ð°ÐºÐ¶Ðµ к определенным\n"
+"пÑевдонимам."
+
+msgid ""
+"\n"
+"``diff``\n"
+"--------"
+msgstr ""
+"\n"
+"``diff``\n"
+"--------"
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified``\n"
+"is a Boolean and defaults to False. See ``annotate`` section for\n"
+"related options for the annotate command."
+msgstr ""
+"ÐаÑтройки Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹. Ð’Ñе параметры, кроме ``unified``, ÑвлÑÑŽÑ‚ÑÑ\n"
+"логичеÑкими и по умолчанию имеют значение Ложь (False). См. Ñекцию "
+"``annotate``\n"
+"Ð´Ð»Ñ Ñправки о ÑвÑзанных параметрах команды annotate."
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" ИÑпользовать раÑширенный формат git Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² различий."
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+"``nodates``\n"
+" Ðе добавлÑÑ‚ÑŒ даты в заголовки файлов различий."
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚ÑŒ, в какой оно Ñделано функции"
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+" Показываемое количеÑтво Ñтрок контекÑта."
+
+msgid ""
+"``email``\n"
+"---------"
+msgstr ""
+"``email``\n"
+"---------"
+
+msgid "Settings for extensions that send email messages."
+msgstr "ÐаÑтройки Ð´Ð»Ñ Ñ€Ð°Ñширений, отправлÑющих ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ email"
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+"``from``\n"
+" Ðе обÑзательный. Электронный Ð°Ð´Ñ€ÐµÑ Ð´Ð»Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° \"From\" (\"от\") и\n"
+" конверта SMTP Ð´Ð»Ñ Ð¸ÑходÑщих Ñообщений."
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+"``to``\n"
+" Ðе обÑзательный. Разделенный запÑтыми ÑпиÑок адреÑатов."
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``cc``\n"
+" Ðе обÑзательный. Разделенный запÑтыми ÑпиÑок получателей копий пиÑем."
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+"``bcc``\n"
+" Ðе обÑзательный. Разделенный запÑтыми ÑпиÑок получателей Ñкрытых.\n"
+" копий пиÑем."
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+"``method``\n"
+" Ðе обÑзательный. Метод Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ пиÑем. ЕÑли значение ``smtp``\n"
+" (по умолчанию), иÑпользуетÑÑ SMTP (наÑтройки Ñм. в Ñекции ``[smtp]``).\n"
+" Ð’ противном Ñлучае, иÑпользуетÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²ÐµÐ´ÐµÑ‚\n"
+" ÑÐµÐ±Ñ ÐºÐ°Ðº sendmail (принимает Ð´Ð»Ñ Ð°Ð´Ñ€ÐµÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ñ‡ÐµÑ€ÐµÐ· параметр -f,\n"
+" ÑпиÑок получателей в командной Ñтроке, текÑÑ‚ пиÑьма через Ñтандартный\n"
+" ввод). Обычно Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ``sendmail`` или ``/usr/sbin/sendmail``\n"
+" доÑтаточно, чтобы отправлÑÑ‚ÑŒ пиÑьма через sendmail."
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+"``charsets``\n"
+" Ðе обÑзательный. Разделенный запÑтыми ÑпиÑок кодировок, которые\n"
+" ÑчитаютÑÑ ÑƒÐ´Ð¾Ð±Ð½Ñ‹Ð¼Ð¸ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»ÐµÐ¹. ÐдреÑа, заголовки и чаÑти,\n"
+" не Ñодержащие патчи, будут закодированы первой кодировкой, длÑ\n"
+" в которую корректно переводитÑÑ Ð¸ÑÑ…Ð¾Ð´Ð½Ð°Ñ (``$HGENCODING``,\n"
+" ``ui.fallbackencoding``). ЕÑли корректно преобразовать не удаётÑÑ,\n"
+" текÑÑ‚ поÑылаетÑÑ ÐºÐ°Ðº еÑÑ‚ÑŒ. По умолчанию - пуÑтой (буквально) ÑпиÑок."
+
+msgid " Order of outgoing email character sets:"
+msgstr " ПорÑдок кодировок иÑходÑщих Ñообщений::"
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+" 1. ``us-ascii``: вÑегда перваÑ, незавиÑимо от уÑтановок.\n"
+" 2. ``email.charsets``: в порÑдке, определенном пользователем\n"
+" 3. ``ui.fallbackencoding``: еÑли не ÑодержитÑÑ Ð² email.charsets\n"
+" 4. ``$HGENCODING``: еÑли не ÑодержитÑÑ Ð² email.charsets\n"
+" 5. ``utf-8``: вÑегда поÑледнÑÑ, незавиÑимо от уÑтановок"
+
+msgid "Email example::"
+msgstr "Пример::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # кодировки Ð´Ð»Ñ Ð·Ð°Ð¿Ð°Ð´Ð½Ð¾Ð¹ Европы\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+
+msgid ""
+"\n"
+"``extensions``\n"
+"--------------"
+msgstr ""
+"\n"
+"``extensions``\n"
+"--------------"
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+"Mercurial иÑпользует механизм раÑширений Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ…\n"
+"возможноÑтей. Чтобы включить раÑширение, Ñоздайте Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ запиÑÑŒ\n"
+"в Ñтой Ñекции."
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+"ЕÑли вы знаете, что раÑширение уже доÑтупно по путÑм, извеÑтным\n"
+"Python'у, можно указать Ð¸Ð¼Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ñ Ð¿Ð¾Ñледующим знаком ``=``,\n"
+"поÑле которого ничего нет."
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+"Ð’ противном Ñлучае, укажите любое Ð¸Ð¼Ñ Ñ Ð¿Ð¾Ñледующим знаком ``=``,\n"
+"поÑле которого идет путь к файлу ``.py`` (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ€Ð°Ñширение файла)\n"
+"Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸ÐµÐ¹ раÑширениÑ."
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"Чтобы Ñвно отключить раÑширение, включенное в конфиге более широкой\n"
+"облаÑти дейÑтвиÑ, добавьте ``!`` перед путем - ``foo = !/раÑш/путь``,\n"
+"или ``foo = !``, еÑли путь не указан."
+
+msgid "Example for ``~/.hgrc``::"
+msgstr "Пример Ð´Ð»Ñ ``~/.hgrc`` ::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" # (раÑширение mq будет загружено из каталога Mercurial)\n"
+" mq =\n"
+" # (Ñто раÑширение будет загружено из указанного файла)\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"\n"
+"``format``\n"
+"----------"
+msgstr ""
+"\n"
+"``format``\n"
+"----------"
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+"``usestore``\n"
+" ИÑпользовать формат хранилища \"store\", который улучшает\n"
+" ÑовмеÑтимоÑÑ‚ÑŒ Ñ ÑиÑтемами, которые путают региÑÑ‚Ñ€ букв или еще\n"
+" как-нибудь иÑкажают имена файлов. Включен по умолчанию. Отключение\n"
+" Ñтого параметра позволит хранить более длинные имена файлов во\n"
+" многих ÑитуациÑÑ… ценой ÑовмеÑтимоÑти и позволÑет удоÑтоверитьÑÑ,\n"
+" что Ñозданные хранилища будут ÑовмеÑтимы Ñ Mercurial до\n"
+" верÑии 0.9.4."
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+"``usefncache``\n"
+" Включить или выключить формат хранилища \"fncache\", который\n"
+" ÑвлÑетÑÑ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸ÐµÐ¼ формата \"store\" (который должен быть включен,\n"
+" чтобы иÑпользовать fncache) и позволÑет иÑпользовать длинные имена\n"
+" файлов и избежать иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°Ñ€ÐµÐ·ÐµÑ€Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹Ñ… в Windows имен\n"
+" (например, \"nul\"). По умолчанию включен. Отключение Ñтого параметра\n"
+" позволÑет быть уверенным, что Ñозданные хранилища будут\n"
+" ÑовмеÑтимы Ñ Mercurial до верÑии 1.1."
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+"``dotencode``\n"
+" Включить или выключить формат хранилища \"dotencode\", который\n"
+" ÑвлÑетÑÑ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸ÐµÐ¼ формата \"fncache\" (который должен быть\n"
+" включен, чтобы иÑпользовать dotencode), чтобы решить проблемы\n"
+" Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ файлов, начинающихÑÑ Ñ ._ в Mac OS X и пробелов в\n"
+" Windows. По умолчанию включен. Отключение Ñтого параметра позволÑет\n"
+" быть уверенным, что формат Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñоздаваемого хранилища\n"
+" будет ÑовмеÑтим Ñ Mercurial до верÑии 1.7."
+
+msgid ""
+"``graph``\n"
+"---------"
+msgstr ""
+"``graph``\n"
+"---------"
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+"ÐаÑтройки Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð³Ñ€Ð°Ñ„Ð° в веб-интерфейÑе. Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет\n"
+"менÑÑ‚ÑŒ ÑвойÑтва отображаемых Ñлементов по веткам, например, чтобы\n"
+"выделить ветку ``default``."
+
+msgid " <branch>.<argument> = <value>"
+msgstr " <ветка>.<аргумент> = <значение>"
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr "где ``<ветка>`` - Ð¸Ð¼Ñ Ð½Ð°Ñтраиваемой ветки. Ðапример::"
+
+msgid ""
+" [graph]\n"
+" # 2px width\n"
+" default.width = 2\n"
+" # red color\n"
+" default.color = FF0000"
+msgstr ""
+" [graph]\n"
+" # толшина 2 пикÑелÑ\n"
+" default.width = 2\n"
+" # краÑный цвет\n"
+" default.color = FF0000"
+
+msgid ""
+"``width``\n"
+" Set branch edges width in pixels."
+msgstr ""
+"``width``\n"
+" Задает толщину ребер графа Ð´Ð»Ñ Ð²ÐµÑ‚ÐºÐ¸ в пикÑелÑÑ…."
+
+msgid ""
+"``color``\n"
+" Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+"``color``\n"
+" Задает цвет ребер графа Ð´Ð»Ñ Ð²ÐµÑ‚ÐºÐ¸ в шеÑтнадцатиричном RGB-виде."
+
+msgid ""
+"``hooks``\n"
+"---------"
+msgstr ""
+"``hooks``\n"
+"---------"
+
+# NOT-SURE site-wide - ?
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string. Hooks can be prioritized\n"
+"by adding a prefix of ``priority`` to the hook name on a new line\n"
+"and setting the priority. The default priority is 0 if\n"
+"not specified."
+msgstr ""
+"Команды или функции Python, вызываемые автоматичеÑки при различных\n"
+"дейÑтвиÑÑ…, таких как начало или завершение фикÑации. Можно задавать\n"
+"неÑколько хуков Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ и того же дейÑтвиÑ, добавлÑÑ Ðº дейÑтвию ÑуффикÑ.\n"
+"Можно переопределить глобальный хук, изменив его Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ задав\n"
+"Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ пуÑтую Ñтроку. Ð”Ð»Ñ Ñ…ÑƒÐºÐ° можно задать приоритет, добавив\n"
+"Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ ``priority`` к имени хука в отдельной Ñтроке и задав приоритет.\n"
+"ЕÑли приоритет не указан, иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по умолчанию - 0."
+
+msgid "Example ``.hg/hgrc``::"
+msgstr "Пример ``.hg/hgrc``::"
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # force autobuild hook to run before other incoming hooks\n"
+" priority.incoming.autobuild = 1"
+msgstr ""
+" [hooks]\n"
+" # Обновить рабочий каталог поÑле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² изменений\n"
+" changegroup.update = hg update\n"
+" # не иÑпользовать глобальный хук\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # выполнÑÑ‚ÑŒ хук autobuild перед другими хуками incoming\n"
+" priority.incoming.autobuild = 1"
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+"БольшинÑтво хуков выполнÑÑŽÑ‚ÑÑ Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ окружениÑ, Ñодержащими\n"
+"полезную дополнительную информацию. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ хука ниже, передаваемые\n"
+"ему переменные перечиÑлены Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ вида ``$HG_foo``."
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+"``changegroup``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле того, как группа наборов изменений была добавлена\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ push, pull или unbundle. ID первого набора изменений\n"
+" ÑодержитÑÑ Ð² ``$HG_NODE``. URL иÑточника изменений находитÑÑ Ð² ``$HG_URL``."
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``commit``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ набора изменений в локальном\n"
+" хранилище. ID Ñозданного набора изменений передаетÑÑ Ð² ``$HG_NODE``,\n"
+" ID родителей ÑодержатÑÑ Ð² ``$HG_PARENT1`` и ``$HG_PARENT2``."
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+"``incoming``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле того, как набор изменений был добавлен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" push, pull или unbundle. ID первого набора изменений ÑодержитÑÑ\n"
+" в ``$HG_NODE``. URL иÑточника изменений находитÑÑ Ð² ``$HG_URL``."
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+"``outgoing``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле отправки изменений из локального хранилища в\n"
+" другое. ID первого набора изменений ÑодержитÑÑ Ð² ``$HG_NODE``.\n"
+" ИÑточник операции находитÑÑ Ð² ``$HG_SOURCE``; опиÑание Ñм. в\n"
+" \"preoutgoing\""
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+"``post-<команда>``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле уÑпешного вызова ÑоответÑтвующей команды.\n"
+" Содержимое командной Ñтроки передаётÑÑ Ð² ``$HG_ARGS``, код\n"
+" Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ - в ``$HG_RESULT``. Разобранные аргументы командной\n"
+" Ñтроки передаютÑÑ ÐºÐ°Ðº ``$HG_PATS`` и ``$HG_OPTS``. Они Ñодержат\n"
+" Ñтроковое предÑтавление данных Python, передаваемых <команде>\n"
+" внутренней реализацией. ``$HG_OPTS`` - Ñто Ñловарь опций \n"
+" (опущенные опции уÑтановлены в Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию).\n"
+" ``$HG_PATS`` - ÑпиÑок аргументов. Ðеудачное завершение хука\n"
+" игнорируетÑÑ."
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+"``pre-<команда>``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ вызовом ÑоответÑтвующей команды.\n"
+" Содержимое командной Ñтроки передаётÑÑ Ð² ``$HG_ARGS``.\n"
+" Разобранные аргументы командной Ñтроки передаютÑÑ ÐºÐ°Ðº ``$HG_PATS``\n"
+" и ``$HG_OPTS``. Они Ñодержат Ñтроковое предÑтавление данных\n"
+" Python, передаваемых <команде> внутренней реализацией. ``$HG_OPTS`` -\n"
+" Ñто Ñловарь опций (опущенные опции уÑтановлены в Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾\n"
+" умолчанию).``$HG_PATS`` - ÑпиÑок аргументов. Ðеудачное завершение\n"
+" хука игнорируетÑÑ."
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+"``prechangegroup``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ добавлением группы наборов изменений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" pull, push или unbundle. Код возврата 0 разрешает продолжение\n"
+" операции, ненулевой код возврата заÑтавлÑет push, pull или unbundle\n"
+" завершитьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. URL иÑточника изменений ÑодержитÑÑ Ð² ``$HG_URL``."
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``precommit``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ началом локальной фикÑации. Код возврата 0\n"
+" разрешает продолжение операции, ненулевой код возврата заÑтавлÑет\n"
+" commit завершитьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. ID родителей передаютÑÑ Ð² ``$HG_PARENT1``\n"
+" и ``$HG_PARENT2``."
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+"``prelistkeys``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ выводом ключей наборов изменений (например, закладок)\n"
+" хранилища. Ðенулевой код возврата вызовет завершение Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹.\n"
+" ПроÑтранÑтво имен ключа передаетÑÑ Ð² ``$HG_NAMESPACE``."
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+"``preoutgoing``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ Ñборкой изменений Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ из локального\n"
+" хранилища в отдалённое. Ðенулевой код возврата вызовет аварийное\n"
+" завершение. Это позволÑет предотвратить pull по HTTP или SSH. Также\n"
+" можно отменить и локальные pull, push или bundle, но Ñто неÑффективно,\n"
+" Ñ‚.к. в Ñтом Ñлучае можно проÑто Ñкопировать файлы. ИÑточник операции\n"
+" передаетÑÑ Ð² ``$HG_SOURCE``. Ð”Ð»Ñ \"serve\" Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ\n"
+" на Ñтороне отдалённого SSH или HTTP хранилища. Ð”Ð»Ñ \"push\", \"pull\"\n"
+" или \"bundle\", Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ Ð² локальной ÑиÑтеме."
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+"``prepushkey``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ добавлением ключа (например, закладки) в\n"
+" хранилище. Ðенулевой код возврата отменит добавление ключа.\n"
+" ПроÑтранÑтво имен ключа передаетÑÑ Ð² ``$HG_NAMESPACE``, ключ в\n"
+" ``$HG_KEY``, предыдущее значение (еÑли еÑÑ‚ÑŒ) в ``$HG_OLD``, новое -\n"
+" в ``$HG_NEW``."
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``pretag``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ Ñозданием метки. Код возврата 0 позволит Ñоздать\n"
+" метку, ненулевой вызовет завершение Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. ID помечаемого набора\n"
+" изменений передаетÑÑ Ð² ``$HG_NODE``, Ð¸Ð¼Ñ Ð¼ÐµÑ‚ÐºÐ¸ - в ``$HG_TAG``.\n"
+" Метка ÑвлÑетÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹, еÑли ``$HG_LOCAL=1``, запиÑываетÑÑ Ð²\n"
+" хранилище, еÑли ``$HG_LOCAL=0``."
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+"``pretxnchangegroup``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ñ‹ наборов изменений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" push, pull или unbundle, до фикÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¸. Группа изменений\n"
+" доÑтупна в программе хука. Это позволÑет проверить входÑщие\n"
+" изменениÑ, перед тем, как принÑÑ‚ÑŒ их. ID первого добавлÑемого\n"
+" набора изменений передаетÑÑ Ð² ``$HG_NODE``. Код возврата 0 разрешает\n"
+" зафикÑировать транзакцию, ненулевой откатывает ее и заÑтавлÑет\n"
+" pull, push или unbundle завершитьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹. URL иÑточника\n"
+" изменений передаетÑÑ Ð² ``$HG_URL``."
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+"``pretxncommit``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле того, как набор изменений был Ñоздан, но\n"
+" Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ ÐµÑ‰Ðµ не зафикÑирована. Ðабор изменений доÑтупен в программе\n"
+" хука. Это позволÑет проверить Ñообщение фикÑации и изменениÑ. Код\n"
+" возврата 0 разрешает продолжение фикÑации, ненулевой код возврата\n"
+" откатит транзакцию. ID набора изменений передаетÑÑ Ð² ``$HG_NODE``.\n"
+" ID родителей передаютÑÑ Ð² ``$HG_PARENT1`` и ``$HG_PARENT2``."
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+"``preupdate``\n"
+" ВыполнÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ обновлением рабочего каталога. Код возврата 0\n"
+" позволÑет продолжить обновление. Ðенулевой код возврата отменит\n"
+" обновление. ID первого нового Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ Ð² ``$HG_PARENT1``.\n"
+" ЕÑли выполнÑетÑÑ ÑлиÑние, ID второго нового Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ñтупно в\n"
+" ``$HG_PARENT2``."
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+"``listkeys``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле вывода ключей хранилища (например, закладок).\n"
+" ПроÑтранÑтво имен ключа доÑтупно в ``$HG_NAMESPACE``. ``$HG_VALUES`` -\n"
+" Ñловарь, Ñодержащий ключи и значениÑ."
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+"``pushkey``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле того, как ключ (например, закладка) добавлен\n"
+" в хранилище. ПроÑтранÑтво имен ключа доÑтупно в ``$HG_NAMESPACE``,\n"
+" ключ в - ``$HG_KEY``, Ñтарое значение (еÑли еÑÑ‚ÑŒ) - в ``$HG_OLD``,\n"
+" новое значение - в ``$HG_NEW``."
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+"``tag``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚ÐºÐ¸. ID помечаемого набора изменений\n"
+" передаетÑÑ Ð² ``$HG_TAG``. Метка ÑвлÑетÑÑ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð¹, еÑли\n"
+" ``$HG_LOCAL=1``, но ÑоздаетÑÑ Ð² хранилище еÑли ``$HG_LOCAL=0``."
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+"``update``\n"
+" ВыполнÑетÑÑ Ð¿Ð¾Ñле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога. ID первого нового\n"
+" Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°ÐµÑ‚ÑÑ Ð² ``$HG_PARENT1``. ЕÑли выполнÑетÑÑ ÑлиÑние,\n"
+" ID второго Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð´Ð¾Ñтупен в ``$HG_PARENT2``. ЕÑли обновление\n"
+" прошло уÑпешно, ``$HG_ERROR=0``. При неудаче (например, еÑли еÑÑ‚ÑŒ\n"
+" неразрешенные конфликты) ``$HG_ERROR=1``."
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+".. note:: Вообще Ð³Ð¾Ð²Ð¾Ñ€Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ лучше иÑпользовать Ñтандартные хуки,\n"
+" а не pre- и post-хуки, потому что они гарантированно вызываютÑÑ\n"
+" Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ñ‹Ð¼ контекÑтом Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ð¹, на которые они влиÑÑŽÑ‚.\n"
+" Также такие хуки как \"commit\" будут вызваны во вÑех ÑитуациÑÑ…,\n"
+" когда ÑоздаетÑÑ Ñ„Ð¸ÐºÑÐ°Ñ†Ð¸Ñ (например, tag), а не только по команде\n"
+" commit."
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+".. note:: Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ Ð¿ÑƒÑтыми значениÑми могут не\n"
+" передатьÑÑ Ð² хуки на платформах вроде Windows. Ðапример,\n"
+" ``$HG_PARENT2`` будет иметь пуÑтое значение в Unix-подобных\n"
+" ОС, а под Windows вообще будет недоÑтупна."
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr "СинтакÑÐ¸Ñ Ñ…ÑƒÐºÐ¾Ð² Ð´Ð»Ñ Python::"
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+" имÑ_хука = python:modulename.submodule.callable\n"
+" имÑ_хука = python:/path/to/python/module.py:callable"
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+"Хуки на Python выполнÑÑŽÑ‚ÑÑ Ð² рамках процеÑÑа Mercurial. Каждый хук\n"
+"вызываетÑÑ ÐºÐ°Ðº минимум Ñ Ñ‚Ñ€ÐµÐ¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ - ключевыми Ñловами:\n"
+"объект интерфейÑа (``ui``), объект хранилища (``repo``) и ``hooktype``\n"
+"который определÑет, какой вид хука иÑпользуетÑÑ. Ðргументы, опиÑанные\n"
+"выше как переменные окружениÑ, передаютÑÑ ÐºÐ°Ðº ключевые Ñлова без\n"
+"префикÑа ``HG_`` Ñ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸ в нижнем региÑтре."
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+"ЕÑли хуки Python возвращают значение \"true\" или возбуждают иÑключение\n"
+"что раÑцениваетÑÑ ÐºÐ°Ðº ошибка."
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+"Слепки Ñертификатов извеÑтных HTTPS-Ñерверов. При заданном Ñлепке\n"
+"HTTPS-Ñоединение уÑпешно уÑтановитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли Ñлепок Ñертификата\n"
+"Ñервера Ñовпадает Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼. Это похоже на работу Ñ Ð¸Ð·Ð²ÐµÑтными хоÑтами\n"
+"по ssh. Слепок - Ñто Ñ…Ñш SHA-1 от Ñертификата, зашифрованного DER.\n"
+"Цепочка CA и web.cacerts не иÑпользуютÑÑ Ð´Ð»Ñ Ñерверов Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼Ð¸\n"
+"Ñлепками."
+
+msgid "For example::"
+msgstr "Пример::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr "ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли иÑпользуетÑÑ Python 2.6 или выше."
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+msgstr ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+"ИÑпользуетÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтупа к web-хранилищу Mercurial через\n"
+"HTTP-прокÑи."
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+"``host``\n"
+" Ð˜Ð¼Ñ Ñ…Ð¾Ñта и (необÑзательный) порт прокÑи-Ñервера, например\n"
+" \"myproxy:8000\"."
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+"``no``\n"
+" ÐеобÑзательный. Разделенный запÑтыми ÑпиÑок имен хоÑтов, доÑтупных\n"
+" в обход прокÑи-Ñервера."
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+"``passwd``\n"
+" ÐеобÑзательный. Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на прокÑи-Ñервере."
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+"``user``\n"
+" ÐеобÑзательный. Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на прокÑи."
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+"``always``\n"
+" ÐеобÑзательный. Ð’Ñегда иÑпользовать прокÑи, даже Ð´Ð»Ñ localhost и\n"
+" запиÑей из ``http_proxy.no``. True или False. По умолчанию: False."
+
+msgid ""
+"``merge-patterns``\n"
+"------------------"
+msgstr ""
+"``merge-patterns``\n"
+"------------------"
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+"Эта ÑÐµÐºÑ†Ð¸Ñ Ð·Ð°Ð´Ð°ÐµÑ‚ инÑтрументы Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð², подходÑщих под\n"
+"определенный шаблон. ПодходÑщие Ñюда программы имеют приоритет перед\n"
+"инÑтрументами по умолчанию. Шаблоны по умолчанию имеют формат glob,\n"
+"пути задаютÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°."
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+
+msgid ""
+"``merge-tools``\n"
+"---------------"
+msgstr ""
+"``merge-tools``\n"
+"---------------"
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr "Эта ÑÐµÐºÑ†Ð¸Ñ Ð·Ð°Ð´Ð°ÐµÑ‚ внешние инÑтрументы Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… файлов."
+
+msgid "Example ``~/.hgrc``::"
+msgstr "Пример ``~/.hgrc``::"
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+" [merge-tools]\n"
+" # Переопределить изначальное раÑположение программы\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Задать параметры командной Ñтроки\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Задать повышенный приоритет\n"
+" kdiff3.priority = 1"
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+" # Определить новый инÑтрумент\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+"``priority``\n"
+" Приоритет, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ выбираетÑÑ Ñтот инÑтрумент.\n"
+" По умолчанию 0."
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+"``executable``\n"
+" Ð˜Ð¼Ñ Ð¸Ð»Ð¸ полный путь к иÑполнÑемого файлу. Ð’ Windows в пути можно\n"
+" иÑпользовать переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ ÑинтакÑиÑом ${ProgramFiles}.\n"
+" По умолчанию: Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹."
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+"``args``\n"
+" Ðргументы, передаваемые инÑтрументу ÑлиÑниÑ. Можно обращатьÑÑ Ðº\n"
+" Ñливаемым файлам и результату ÑлиÑÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· Ñти переменные:\n"
+" ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" По умолчанию: ``$local $base $other``"
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+"``premerge``\n"
+" ПытатьÑÑ Ð·Ð°Ð¿ÑƒÑкать внутренний неинтерактивный инÑтрумент ÑлиÑниÑ\n"
+" Ð´Ð»Ñ Ñ‚Ñ€ÐµÑ… файлов перед запуÑком внешней программы. Возможны значениÑ\n"
+" ``true``(включено), ``false``(выключено) или ``keep``, чтобы оÑтавить\n"
+" маркеры конфликтов в файлах при неудавшемÑÑ Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¼ ÑлиÑнии.\n"
+" По умолчанию: True"
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+"``binary``\n"
+" Этот инÑтрумент может иÑпользоватьÑÑ Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ñ… файлов.\n"
+" По умолчанию False, еÑли Ñтот инÑтрумент не был выбран при\n"
+" Ñовпадении шаблона имени файла."
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+"``symlink``\n"
+" Этот инÑтрумент может иÑпользоватьÑÑ Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ ÑимволичеÑких ÑÑылок\n"
+" По умолчанию False, даже еÑли инÑтрумент был выбран при Ñовпадении\n"
+" шаблона имени файла."
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+"``check``\n"
+" СпиÑок параметров, ÑвидетельÑтвующих об уÑпехе ÑлиÑниÑ::"
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+" ``changed``\n"
+" СпроÑить, было ли ÑлиÑние уÑпешным, еÑли в Ñлитом файле нет изменений.\n"
+" ``conflicts``\n"
+" Проверить наличие конфликтов, даже еÑли программа ÑлиÑÐ½Ð¸Ñ Ñигнализирует "
+"об уÑпехе\n"
+" ``prompt``\n"
+" Ð’Ñегда Ñпрашивать об уÑпехе ÑлиÑниÑ, вне завиÑимоÑти от возвращенного "
+"инÑтрументом ÑлиÑÐ½Ð¸Ñ ÑтатуÑа."
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+"``checkchanged``\n"
+" Эквивалентно ``check = changed``.\n"
+" По умолчанию: False"
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+"``checkconflicts``\n"
+" Эквивалентно ``check = conflicts``.\n"
+" По умолчанию: False"
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+"``fixeol``\n"
+" ПытатьÑÑ Ð¸Ñправить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° новой Ñтроки из-за работы программы "
+"ÑлиÑниÑ.\n"
+" По умолчанию: False"
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+"``gui``\n"
+" Эта программа требует графичеÑкий интерфейÑ. По умолчанию: False"
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+"``regkey``\n"
+" Ключ рееÑтра Windows, опиÑывающий уÑтановочный каталог Ñтого\n"
+" инÑтрумента. Mercurial ищет Ñтот ключ Ñначала в ``HKEY_CURRENT_USER``,\n"
+" потом в ``HKEY_LOCAL_MACHINE``.\n"
+" По умолчанию: не задан"
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+"``regkeyalt``\n"
+" Ðльтернативный ключ в рееÑтре Windows, который иÑпользуетÑÑ ÐµÑли\n"
+" первый ключ не найден. Этот ключ иÑпользует ту же Ñемантику\n"
+" ``regname`` и ``regappend``, что и первичный ключ. Обычно Ñто\n"
+" иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка 32-битных приложений в 64-битных ОС.\n"
+" По умолчанию: не задан"
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+"``regname``\n"
+" Ð˜Ð¼Ñ Ñ‡Ð¸Ñ‚Ð°ÐµÐ¼Ð¾Ð³Ð¾ из рееÑтра параметра. По умолчанию значение не пуÑто -\n"
+" неименованный параметр."
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+"``regappend``\n"
+" Строка, добавлÑÐµÐ¼Ð°Ñ Ðº прочитанному из рееÑтра значению, как правило\n"
+" Ñто Ð¸Ð¼Ñ Ð¸ÑполнÑемого файла инÑтрумента.\n"
+" По умолчанию: не задан"
+
+msgid ""
+"\n"
+"``patch``\n"
+"---------"
+msgstr ""
+"\n"
+"``patch``\n"
+"---------"
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+"ÐаÑтройки, иÑпользуемые при наложении патчей, например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+"команды 'import' или раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Mercurial Queues."
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+"``eol``\n"
+" ЕÑли уÑтановлен в 'strict', Ñимволы перевода Ñтроки в патче\n"
+" и файле, к которому он применÑетÑÑ, оÑтаютÑÑ Ð±ÐµÐ· изменений. ЕÑли\n"
+" уÑтановлен в ``lf`` или ``crlf``, формат Ñимвола перевода Ñтроки\n"
+" игнорируетÑÑ Ð² обоих файлах при наложении патча и приводÑÑ‚ÑÑ Ðº\n"
+" LF (Unix) или CRLF (Windows) в результате. ЕÑли уÑтановлен \n"
+" ``auto``, переводы Ñтроки так же игнорируютÑÑ Ð¿Ñ€Ð¸ наложении патча,\n"
+" но воÑÑтанавливаютÑÑ Ð² иÑходный формат Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла. ЕÑли\n"
+" файл Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ ÑущеÑтвует или не имеет Ñимволов перевода Ñтроки,\n"
+" ÑохранÑетÑÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ новой Ñтроки патча.\n"
+" По умолчанию: strict."
+
+msgid ""
+"\n"
+"``paths``\n"
+"---------"
+msgstr ""
+"\n"
+"``paths``\n"
+"---------"
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+"Задает читаемые имена Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰. Ð›ÐµÐ²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ - Ñимвольное\n"
+"имÑ, Ð¿Ñ€Ð°Ð²Ð°Ñ - URL, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð·Ð°Ð´Ð°ÐµÑ‚ положение хранилища. Пути по\n"
+"умолчанию могут быть заданы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñледующих запиÑей."
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+"``default``\n"
+" Каталог или URL, иÑпользуемый Ð´Ð»Ñ pull, еÑли иÑточник не указан.\n"
+" По умолчанию уÑтановлен в хранилище, из которого текущее был\n"
+" клонировано."
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+"``default-push``\n"
+" ÐеобÑзательный. Каталог или URL, иÑпользуемый при операции push,\n"
+" еÑли хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ задано."
+
+msgid ""
+"``phases``\n"
+"----------"
+msgstr ""
+"``phases``\n"
+"----------"
+
+msgid ""
+"Specifies default handling of phases. See :hg:`help phases` for more\n"
+"information about working with phases."
+msgstr ""
+"УÑтановки работы Ñ Ñ„Ð°Ð·Ð°Ð¼Ð¸ по умолчанию. Подробнее о работе Ñ Ñ„Ð°Ð·Ð°Ð¼Ð¸\n"
+"Ñм. :hg:`help phases`."
+
+msgid ""
+"``publish``\n"
+" Controls draft phase behavior when working as a server. When true,\n"
+" pushed changesets are set to public in both client and server and\n"
+" pulled or cloned changesets are set to public in the client.\n"
+" Default: True"
+msgstr ""
+"``publish``\n"
+" УправлÑет поведением черновой фазы при работе в качеÑтве Ñервера. ЕÑли\n"
+" ИÑтина, проталкиваемые наборы изменений ÑтановÑÑ‚ÑÑ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ на "
+"клиенте и на Ñервере, а затÑнутые или клонированные наборы изменений\n"
+" ÑтановÑÑ‚ÑÑ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ на Ñтороне клиента.\n"
+" По умолчанию: True (ИÑтина)"
+
+msgid ""
+"``new-commit``\n"
+" Phase of newly-created commits.\n"
+" Default: draft"
+msgstr ""
+"``new-commit``\n"
+" Фаза Ð´Ð»Ñ Ð²Ð½Ð¾Ð²ÑŒ Ñоздаваемых фикÑаций.\n"
+" По умолчанию: draft (черноваÑ)"
+
+msgid ""
+"``profiling``\n"
+"-------------"
+msgstr ""
+"``profiling``\n"
+"-------------"
+
+msgid ""
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+"ОпределÑет тип профилированиÑ, формат и выходной файл. ПоддерживаютÑÑ\n"
+"два профилировщика: инÑтрументирующий (instrumenting profiler, далее\n"
+"называетÑÑ ``ls``) и ÑÑмплирующий (sampling profiler, ``stat``)."
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+"Ð’ опиÑании Ñтой\n"
+"Ñекции 'данные профилированиÑ' означают Ñырые данные, Ñобранные при\n"
+"профилировании, а 'отчет профилированиÑ' означает ÑтатиÑтичеÑкий\n"
+"текÑтовый отчет, Ñгенерированный из данных профилированиÑ.\n"
+"Профилирование выполнÑетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ lsprof."
+
+msgid ""
+"``type``\n"
+" The type of profiler to use.\n"
+" Default: ls."
+msgstr ""
+"``type``\n"
+" ИÑпользуемый тип профилировщика.\n"
+" По умолчанию: ls."
+
+msgid ""
+" ``ls``\n"
+" Use Python's built-in instrumenting profiler. This profiler\n"
+" works on all platforms, but each line number it reports is the\n"
+" first line of a function. This restriction makes it difficult to\n"
+" identify the expensive parts of a non-trivial function.\n"
+" ``stat``\n"
+" Use a third-party statistical profiler, statprof. This profiler\n"
+" currently runs only on Unix systems, and is most useful for\n"
+" profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+" ``ls``\n"
+" ИÑпользовать вÑтренный инÑтрументирующий профилировщик Python.\n"
+" Работает на вÑех платформах, но ÐºÐ°Ð¶Ð´Ð°Ñ Ñтрока, которую он показывает,\n"
+" ÑвлÑетÑÑ Ð¿ÐµÑ€Ð²Ð¾Ð¹ Ñтрокой функции. Это ограничение затруднÑет поиÑк \n"
+" проблемного меÑта в нетривиальной функции.\n"
+" ``stat``\n"
+" ИÑпользовать Ñторонний ÑтатиÑтичеÑкий профилировщик, statprof.\n"
+" Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ в Unix, оÑобо полезен Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ\n"
+" команд, которые выполнÑÑŽÑ‚ÑÑ Ð±Ð¾Ð»ÐµÐµ 0.1 Ñекуднды."
+
+msgid ""
+"``format``\n"
+" Profiling format. Specific to the ``ls`` instrumenting profiler.\n"
+" Default: text."
+msgstr ""
+"Ñ‚``format``\n"
+" Формат профилированиÑ. Специфичен Ð´Ð»Ñ Ð¸Ð½Ñтрументирующего профилировщика "
+"``ls``.\n"
+" По умолчанию: text (текÑтовый)."
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+" ``text``\n"
+" Генерировать отчет профилированиÑ. При Ñохранении в файл, необходимо\n"
+" помнить, что ÑохранÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ отчет, данные профилированиÑ\n"
+" удалÑÑŽÑ‚ÑÑ. ``kcachegrind``\n"
+" Данные Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² kcachegrind: поÑле\n"
+" ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð² файл, он может быть загружен прÑмо в kcachegrind."
+
+msgid ""
+"``frequency``\n"
+" Sampling frequency. Specific to the ``stat`` sampling profiler.\n"
+" Default: 1000."
+msgstr ""
+"``frequency``\n"
+" ЧаÑтота ÑÑмплированиÑ. Только Ð´Ð»Ñ ÑÑмплирующего профилировщика "
+"``stat``.\n"
+" По умолчанию: 1000."
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+"``output``\n"
+" Путь к выходному файлу, куда будут Ñохранены данные или отчет\n"
+" профилированиÑ. ЕÑли файл ÑущеÑтвует, от перезапиÑываетÑÑ.\n"
+" По умолчанию: не задан, данные печатаютÑÑ Ð² stderr"
+
+msgid ""
+"``revsetalias``\n"
+"---------------"
+msgstr ""
+"``revsetalias``\n"
+"---------------"
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+"ÐžÐ¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñевдонимов Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтв ревизий (revsets).\n"
+"Детали Ñм. в :hg:`help revsets`."
+
+msgid ""
+"``server``\n"
+"----------"
+msgstr ""
+"``server``\n"
+"----------"
+
+msgid "Controls generic server settings."
+msgstr "Общие наÑтройки Ñервера."
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+"``uncompressed``\n"
+" Разрешать или нет клиентам клонировать клонировать хранилище,\n"
+" иÑпользовать неÑжатый потоковый протокол. При Ñтом передаетÑÑ\n"
+" примерно на 40% больше данных при обычном клонировании, но Ñкономит\n"
+" процеÑÑорное Ð²Ñ€ÐµÐ¼Ñ Ð¸ памÑÑ‚ÑŒ на обеих Ñторонах. По локальной Ñети\n"
+" (100 Мбит/c и выше) или при очень быÑтром интернет-Ñоединении,\n"
+" протокол без ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ быÑтрее (~ в 10 раз) обычного.\n"
+" Ðа большинÑтве интернет-Ñоединений (медленней 6 Мбит/c), протокол\n"
+" Ð±ÐµÑ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ медленней из-за большего передаваемого трафика.\n"
+" Этот режим также временно уÑтанавливает блокировку запиÑи на\n"
+" Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ, какие данные передавать.\n"
+" По умолчанию True (включен)."
+
+msgid ""
+"``preferuncompressed``\n"
+" When set, clients will try to use the uncompressed streaming\n"
+" protocol. Default is False."
+msgstr ""
+"``preferuncompressed``\n"
+" ЕÑли иÑтина, клиенты будут пытатьÑÑ Ð¸Ñпользовать протокол без\n"
+" ÑжатиÑ. По умолчанию False (ложь)."
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+" Проводить или нет проверку полноты передаваемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ push\n"
+" наборов изменений, проверÑÑ, что вÑе новые ревизии файлов,\n"
+" приÑутÑтвующие в манифеÑте, подготовлены Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸.\n"
+" По умолчанию False (отключено)."
+
+msgid ""
+"``smtp``\n"
+"--------"
+msgstr ""
+"``smtp``\n"
+"--------"
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr "ÐаÑтройки Ð´Ð»Ñ Ñ€Ð°Ñширений, которые раÑÑылают email-ÑообщениÑ."
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+"``host``\n"
+" Ð˜Ð¼Ñ Ñ…Ð¾Ñта почтового Ñервера, например \"mail.example.com\"."
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr " ÐеобÑзательный. ВходÑщий порт почтового Ñервера. По умолчанию: 25."
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+"``tls``\n"
+" ÐеобÑзательный. СпоÑоб Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ TLS при подключении к почтовому "
+"Ñерверу:\n"
+" starttls, smtps или none (откл.). По умолчанию: none."
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+"``username``\n"
+" ÐеобÑзательный. Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на SMTP-Ñервере.\n"
+" По умолчанию: не задан."
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+"``password``\n"
+" ÐеобÑзательный. Пароль Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ на SMTP-Ñервере. ЕÑли\n"
+" не задан, пользователю будет предложено ввеÑти пароль, а\n"
+" неинтерактивный ÑÐµÐ°Ð½Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ñ‚ÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡ÐµÐ¹. По умолчанию: не задан."
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+"``local_hostname``\n"
+" ÐеобÑзательный. Ð˜Ð¼Ñ Ñ…Ð¾Ñта, иÑпользуемое отправителем длÑ\n"
+" Ñамоидентификации через MTA."
+
+msgid ""
+"\n"
+"``subpaths``\n"
+"------------"
+msgstr ""
+"\n"
+"``subpaths``\n"
+"------------"
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+"URL иÑточников подхранилищ могут Ñтать недейÑтвительными, еÑли удаленный\n"
+"Ñервер Ñменил Ð¸Ð¼Ñ Ð¸Ð»Ð¸ Ñтал временно недоÑтупным. Эта ÑÐµÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет вам\n"
+"задать правила замены вида::"
+
+msgid " <pattern> = <replacement>"
+msgstr " <шаблон> = <замена>"
+
+msgid ""
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+"где ``шаблон`` - Ñто регулÑрное выражение, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ Ñовпадает\n"
+"Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°-иÑточника, а ``замена`` - Ñтрока, на которую он будет\n"
+"заменен. Группы, Ñовпадающие в ``шаблоне``, могут быть иÑпользованы в\n"
+"``замене``. Ðапример::"
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr " http://server/(.*)-hg/ = http://hg.server/\\1/"
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr "заменит ``http://server/foo-hg/`` на ``http://hg.server/foo/``."
+
+msgid ""
+"Relative subrepository paths are first made absolute, and the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+"ОтноÑительные пути подхранилищ Ñначала делаютÑÑ Ð°Ð±Ñолютными, поÑле чего\n"
+"уже к Ñтим абÑолютным путÑм применÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»Ð° замены. Правила применÑÑŽÑ‚ÑÑ\n"
+"в порÑдке их определениÑ."
+
+msgid ""
+"``trusted``\n"
+"-----------"
+msgstr ""
+"``trusted``\n"
+"-----------"
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+"Mercurial не будет иÑпользовать наÑтройки из файла ``.hg/hgrc``\n"
+"хранилища, еÑли он не принадлежит доверенному пользователю или\n"
+"группе, поÑкольку многие функции из hgrc позволÑÑŽÑ‚ выполнÑÑ‚ÑŒ\n"
+"произвольные команды. С Ñтим чаÑто возникают проблемы при наÑтройке\n"
+"хуков или раÑширений Ð´Ð»Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… хранилищ или Ñерверов. Однако,\n"
+"web-Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±ÑƒÐ´ÐµÑ‚ иÑпользовать некоторые безопаÑные наÑтройки из\n"
+"Ñекции ``[web]``."
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+"Эта Ñекции определÑет, каким пользователÑм и группам доверÑÑ‚ÑŒ.\n"
+"Текущему пользователю Mercurial доверÑет вÑегда. Чтобы доверÑÑ‚ÑŒ вÑем,\n"
+"добавьте группу или Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ``*``. Эти наÑтройки должны\n"
+"быть в *уже доверенном файле*, например ``$HOME/.hgrc`` пользователÑ\n"
+"или Ñлужбы, под которым запущен Mercurial."
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+"``users``\n"
+" Разделенный запÑтыми ÑпиÑок доверенных пользователей."
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+"``groups``\n"
+" Разделенный запÑтыми ÑпиÑок доверенных групп."
+
+msgid ""
+"\n"
+"``ui``\n"
+"------"
+msgstr ""
+"\n"
+"``ui``\n"
+"------"
+
+msgid "User interface controls."
+msgstr "ÐаÑтройки интерфейÑа пользователÑ."
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+"``archivemeta``\n"
+" Включать или нет Ñодержимое файла .hg_archival.txt, хранÑщего\n"
+" метаданные (Ñ…Ñши базовой и оконечной (tip) ревизии хранилища)\n"
+" в архивы, Ñоздаваемые командой :hg:`archive` или загруженными\n"
+" через hgweb. По умолчанию True (включено)."
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+"``askusername``\n"
+" Спрашивать или нет Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸ фикÑации. ЕÑли True, и не\n"
+" уÑтановлены ни ``$HGUSER``, ни ``$EMAIL``, пользователю будет "
+"предложено\n"
+" ввеÑти Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. ЕÑли ничего не введено, будет иÑпользовано\n"
+" ``ПОЛЬЗОВÐТЕЛЬ@ХОСТ``. По умолчанию False (отключено)."
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+"``commitsubrepos``\n"
+" ФикÑировать или нет измененные подхранилища при фикÑации\n"
+" родительÑкого хранилища. ЕÑли False, и одно из подхранилищ\n"
+" имеет незафикÑированные изменениÑ, фикÑÐ°Ñ†Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ отменена.\n"
+" По умолчанию False (выключено)."
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+"``debug``\n"
+" Печатать отладочную информацию. True или False. По умолчанию False."
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+"``editor``\n"
+" Редактор, вызываемый при фикÑации. По умолчанию ``$EDITOR`` or ``vi``."
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+"``fallbackencoding``\n"
+" Кодировка, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ ÐµÑли невозможно декодировать лог, иÑпользуÑ\n"
+" UTF-8. По умолчанию ISO-8859-1."
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+"``ignore``\n"
+" Файл, из которого читаютÑÑ ÑˆÐ°Ð±Ð»Ð¾Ð½Ñ‹ игнорируемых файлов данного\n"
+" пользователÑ. Имеет тот же формате, что и файл .hgignore хранилища.\n"
+" Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ ÑинтакÑÐ¸Ñ Ñ…ÑƒÐºÐ¾Ð², так что можно задать неÑколько\n"
+" таких файлов, напиÑав что-то вроде ``ignore.other = ~/.hgignore2``.\n"
+" Дополнительно Ñм. Ñправку по hgignore."
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+"``interactive``\n"
+" Разрешить интерактивно Ñпрашивать пользователÑ. True или False.\n"
+" По умолчанию True (включено)."
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+"``logtemplate``\n"
+" Ð¨Ð°Ð±Ð»Ð¾Ð½Ð½Ð°Ñ Ñтрока Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, печатающих наборы изменений."
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+"``merge``\n"
+" Программа Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² во Ð²Ñ€ÐµÐ¼Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð³Ð¾ ÑлиÑниÑ.\n"
+" Дополнительно Ñм. :hg:`help merge-tools`. ÐаÑтройки инÑтрументов\n"
+" Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ñм. в Ñекции ``[merge-tools]``."
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+"``portablefilenames``\n"
+" ПроверÑÑ‚ÑŒ имена файлов на переноÑимоÑÑ‚ÑŒ. Может быть ``warn``,\n"
+" ``ignore`` или ``abort``. По умолчанию ``warn``.\n"
+" ЕÑли уÑтановлен в ``warn`` (или ``true``), на POSIX-ÑовмеÑтимых "
+"платформах\n"
+" печатаетÑÑ Ð¿Ñ€ÐµÐ´ÑƒÐ¿Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ðµ, еÑли ÑоздаетÑÑ Ñ„Ð°Ð¹Ð» Ñ Ð½ÐµÐ¿ÐµÑ€ÐµÐ½Ð¾Ñимым\n"
+" именем (Ñ‚.е. файл, который не может быть Ñоздан в Windows, потому\n"
+" что Ñодержит зарезервированные чаÑти, вроде ``AUX``, зарезервированные\n"
+" Ñимволы вроде ``:``, или отличаетÑÑ Ð¾Ñ‚ уже ÑущеÑтвующего файла только\n"
+" региÑтром букв).\n"
+" ЕÑли уÑтановлен в ``ignore`` (или ``false``), предупреждение на\n"
+" печатаетÑÑ.\n"
+" ЕÑли уÑтановлен в ``abort``, команда прерываетÑÑ.\n"
+" Ð’ Windows Ñтот параметр игнорируетÑÑ, команда завершаетÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹."
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+"``quiet``\n"
+" Печатать меньше информации. True или False. По умолчанию False."
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+"``remotecmd``\n"
+" Команда, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð½Ð° отдалённой машине Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹ clone/push/"
+"pull.\n"
+" По умолчанию ``hg``."
+
+msgid ""
+"``reportoldssl``\n"
+" Warn if an SSL certificate is unable to be due to using Python\n"
+" 2.5 or earlier. True or False. Default is True."
+msgstr ""
+"``reportoldssl``\n"
+" Предупреждать, еÑли невозможно иÑпользовать SSL-Ñертификат из-за\n"
+" Ñтарой верÑии Python (2.5 или Ñтарее). True или False. По умолчанию\n"
+" True (ИÑтина)."
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+"``report_untrusted``\n"
+" Предупреждать, еÑли файл ``.hg/hgrc`` игнорируетÑÑ, потому что\n"
+" его владелец не доверенный пользователь или группа. True или False.\n"
+" По умолчанию True (включено)."
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+"``slash``\n"
+" Показывать пути иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑлÑш (``/``) в качеÑтве разделителÑ.\n"
+" Имеет ÑмыÑл только на ÑиÑтемах, где в качеÑтве Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð²\n"
+" путÑÑ… иÑпользуетÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñимвол (например, Windows иÑпользует\n"
+" обратный ÑлÑш (``\\``)).\n"
+" По умолчанию False (отключено)."
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+"``ssh``\n"
+" Команда, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ñоединений по SSH. По умолчанию ``ssh``."
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+"``strict``\n"
+" Требовать точных имен команд, вмеÑто того, чтобы разрешать\n"
+" однозначные ÑокращениÑ. True или False. По умолчанию False."
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+"``style``\n"
+" Ð˜Ð¼Ñ ÑтилÑ, иÑпользуемое при выводе результата команды."
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+"``timeout``\n"
+" Таймаут в Ñекундах, иÑпользуемый при удержании блокировки,\n"
+" отрицательное чиÑло - без таймаута. По умолчанию 600."
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+"``traceback``\n"
+" Mercurial вÑегда печатает траÑÑировку вызовов при неизвеÑтном\n"
+" иÑключении. ЕÑли Ñтот параметр уÑтановлен в True, траÑÑировка\n"
+" будет печататьÑÑ Ð¿Ñ€Ð¸ любых иÑключениÑÑ…, даже обрабатываемых\n"
+" Mercurial (таких, как IOError или MemoryError).\n"
+" По умолчанию False (отключено)."
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+"``username``\n"
+" Ð˜Ð¼Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð° набора изменений, Ñоздаваемого при фикÑации. Обычно\n"
+" ÑоÑтоит из имени человека и его Ñлектронной почты, например\n"
+" ``ВаÑилий Пупкин <vasya@example.com>``. По умолчанию ``$EMAIL``\n"
+" или ``пользователь@хоÑÑ‚``. ЕÑли Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ задано в hgrc,\n"
+" оно должно быть указано вручную или в другом файле hgrc (например,\n"
+" в ``$HOME/.hgrc``, еÑли админиÑтратор задал ``username =`` в\n"
+" общеÑиÑтемном файле наÑтроек). Переменные Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ€Ð°ÑкрываютÑÑ\n"
+" в Ñтом параметре."
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+"``verbose``\n"
+" Увеличивает подробноÑÑ‚ÑŒ вывода команд. True or False. По умолчанию False."
+
+msgid ""
+"\n"
+"``web``\n"
+"-------"
+msgstr ""
+"\n"
+"``web``\n"
+"-------"
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+"ÐаÑтройки web-интерфейÑа. ÐаÑтройки из Ñтой Ñекции применÑÑŽÑ‚ÑÑ ÐºÐ°Ðº\n"
+"Ð´Ð»Ñ Ð²Ñтроенного web-Ñервера (запуÑкаемого :hg:`serve`), так и длÑ\n"
+"Ñкрипта, запуÑкаемого обычным веб-Ñервером (``hgweb.cgi`` и\n"
+"вариации Ð´Ð»Ñ FastCGI и WSGI)."
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+"Ð’Ñтроенный web-Ñервер Mercurial не производит аутентификацию (не\n"
+"Ñпрашивает имена пользователей и пароли, чтобы узнать *кто* Ñто)\n"
+"но проводит авторизацию (разрешает или запрещает доÑтуп\n"
+"*аутентифицированным пользователÑм*, оÑновываÑÑÑŒ на наÑтройках\n"
+"из Ñтой Ñекции). Ð’Ñ‹ должны или наÑтроить веб-Ñервер, чтобы он\n"
+"выполнÑл аутентификацию, либо отключить проверки авторизации."
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+"Ð”Ð»Ñ Ð±Ñ‹Ñтрой наÑтройки в доверенной Ñреде, например, чаÑтной локальной\n"
+"Ñети, где можно разрешить push вÑем, можно иÑпользовать такую\n"
+"командную Ñтроку::"
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+"Обратите внимание, что Ñто позволит кому угодно проталкивать что угодно\n"
+"на Ñервер, поÑтому так Ð½ÐµÐ»ÑŒÐ·Ñ Ð´ÐµÐ»Ð°Ñ‚ÑŒ на публичных Ñерверах."
+
+msgid "The full set of options is:"
+msgstr "Полный набор опций:"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+"``accesslog``\n"
+" Где хранить логи доÑтупа. По умолчанию Ñтандартный вывод."
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+"``address``\n"
+" ÐÐ´Ñ€ÐµÑ Ð¿Ñ€Ð¾Ñлушиваемого интерфейÑа. По умолчанию вÑе интерфейÑÑ‹."
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+"``allow_archive``\n"
+" СпиÑок форматов архивов (bz2, gz, zip), которые можно Ñкачивать.\n"
+" По умолчанию пуÑÑ‚."
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowbz2``\n"
+" (УСТÐРЕЛО) Разрешать или нет Ñкачивать ревизии хранилища в\n"
+" формате .tar.bz2.\n"
+" По умолчанию False (запрещено)."
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+"``allowgz``\n"
+" (УСТÐРЕЛО) Разрешать или нет Ñкачивать ревизии хранилища в\n"
+" формате .tar.gz.\n"
+" По умолчанию False (запрещено)."
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+"``allowpull``\n"
+" Разрешить или нет pull из хранилища. По умолчанию True (разрешать)."
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+"``allow_push``\n"
+" Разрешать или нет push в хранилище. ЕÑли проÑÑ‚Ð°Ñ Ñтрока или не\n"
+" задан, push запрещен. ЕÑли уÑтановлен в Ñпециальное значение ``*``,\n"
+" любой отдалённый пользователь может делать push, даже еÑли он не\n"
+" аутентифицирован. Ð’ противном Ñлучае, пользователь должен быть\n"
+" аутентифицирован, и его Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ приÑутÑтвовать в Ñтом ÑпиÑке.\n"
+" Этот ÑпиÑок проверÑетÑÑ Ð¿Ð¾Ñле ÑпиÑка deny_push."
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+"``guessmime``\n"
+" Контролирует MIME-типы при Ñкачивании Ñырого Ñодержимого файла.\n"
+" УÑтановите в True чтобы разрешить hgweb угадывать тип Ñодержимого\n"
+" по раÑширению файла. При Ñтом HTML файлы будут отдаватьÑÑ ÐºÐ°Ðº\n"
+" ``text/html``, и Ñто может Ñделать возможными атаки межÑайтового\n"
+" Ñкриптинга при обÑлуживании недоверенных хранилищ. По умолчанию False."
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+"``allow_read``\n"
+" ЕÑли пользователь еще не получил отказ в доÑтупе к хранилищу\n"
+" из-за ÑпиÑка deny_read, Ñтот ÑпиÑок определÑет, можно ли дать\n"
+" доÑтуп к хранилищу Ñтому пользователю. ЕÑли Ñтот ÑпиÑок не\n"
+" пуÑÑ‚, и пользователь не аутентифицирован и не приÑутÑтвует в ÑпиÑке,\n"
+" ему будет отказано в доÑтупе. ЕÑли ÑпиÑок пуÑÑ‚ или не задан,\n"
+" то доÑтуп предоÑтавлÑетÑÑ Ð²Ñем пользователÑм по умолчанию.\n"
+" Специальное значение ``*`` Ñквивалентно незаданному значению\n"
+" (Ñ‚.е. доÑтуп разрешен Ð´Ð»Ñ Ð²Ñех). Этот ÑпиÑок проверÑетÑÑ Ð¿Ð¾Ñле\n"
+" deny_read."
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+"``allowzip``\n"
+" (УСТÐРЕЛО) Разрешать или нет Ñкачивать ревизии хранилища в\n"
+" формате .zip.\n"
+" По умолчанию False (запрещено). Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ñоздает временные файлы."
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+"``baseurl``\n"
+" Базовый URL, иÑпользуемый при публикации ÑÑылок в других меÑтах,\n"
+" чтобы Ñторонние инÑтрументы, например хуки уведомлений, могли\n"
+" ÑоÑтавлÑÑ‚ÑŒ URLÑ‹. Ðапример: ``http://hgserver/repos/``."
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates."
+msgstr ""
+"``cacerts``\n"
+" Путь к файлу, Ñодержащему ÑпиÑок зашифрованных PEM Ñертификатов.\n"
+" ПроизводитÑÑ Ð¿Ð¾Ð´Ñтановка переменных Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¸ Ñтрок вида\n"
+" ``~user``. ЕÑли задан на Ñтороне клиента, будет иÑпользоватьÑÑ\n"
+" Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ отдалённых HTTPS-Ñерверов Ñ Ñтими Ñертификатами."
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+" Эта возможноÑÑ‚ÑŒ поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при иÑпользовании Python 2.6\n"
+" или выше. ЕÑли вы хотите иÑпользовать ее Ñ Ð±Ð¾Ð»ÐµÐµ ранними верÑиÑми\n"
+" Python, уÑтановите бÑкпортированную верÑию библиотеки ssl,\n"
+" доÑтупную под адреÑу ``http://pypi.python.org``."
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+" Чтобы временно отключить SSL-верификацию, укажите ``--insecure``\n"
+" из командной Ñтроки."
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has\n"
+" one. On most Linux systems this will be\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+" generate this file manually. The form must be as follows::"
+msgstr ""
+" Ð’Ñ‹ можете иÑпользовать файл Ñертификата CA OpenSSL, еÑли он \n"
+" имеетÑÑ Ð½Ð° вашей платформе. Ðа большинÑтве Linux-ÑиÑтем Ñто\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Ð’ противном Ñлучае вам\n"
+" необходимо вручную Ñгенерировать Ñтот файл. Формат файла::"
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (Ñертификат в base64 зашифрованный PEM) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (Ñертификат в base64 зашифрованный PEM) ...\n"
+" -----END CERTIFICATE-----"
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+"``cache``\n"
+" Включить или нет кÑширование в hgweb. По умолчанию True (включено)."
+
+msgid ""
+"``collapse``\n"
+" With ``descend`` enabled, repositories in subdirectories are shown at\n"
+" a single level alongside repositories in the current path. With\n"
+" ``collapse`` also enabled, repositories residing at a deeper level than\n"
+" the current path are grouped behind navigable directory entries that\n"
+" lead to the locations of these repositories. In effect, this setting\n"
+" collapses each collection of repositories found within a subdirectory\n"
+" into a single entry for that subdirectory. Default is False."
+msgstr ""
+"``collapse``\n"
+" ЕÑли включен ``descend``, хранилища в подкаталогах показываютÑÑ Ð½Ð°\n"
+" одном уровне Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°Ð¼Ð¸ по текущему пути. ЕÑли включен и "
+"``collapse``,\n"
+" хранилища, находÑщиеÑÑ Ð³Ð»ÑƒÐ±Ð¶Ðµ текущего пути, группируютÑÑ Ð² ÑпиÑок\n"
+" Ñлементов, ведущих к Ñтим хранилищам, Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñтью навигации. Таким\n"
+" образом, Ñтот параметр позволÑет Ñвернуть каждую коллекцию хранилищ\n"
+" подкаталога в одну запиÑÑŒ Ð´Ð»Ñ Ñтого подкаталога. По умолчанию False "
+"(выкл.)."
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+"``contact``\n"
+" Ð˜Ð¼Ñ Ð¸Ð»Ð¸ Ñлектронный Ð°Ð´Ñ€ÐµÑ Ñ‡ÐµÐ»Ð¾Ð²ÐµÐºÐ°, ответÑтвенного за хранилище.\n"
+" По умолчанию иÑпользуетÑÑ ui.username или ``$EMAIL`` или \"unknown\",\n"
+" еÑли не задан или пуÑтой."
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+"``deny_push``\n"
+" Запретить или нет push в хранилище. ЕÑли пуÑтой или не задан,\n"
+" push не запрещаетÑÑ. ЕÑли уÑтановлен в Ñпециальное значение ``*``,\n"
+" push запрещен Ð´Ð»Ñ Ð²Ñех отдалённых пользователей. Ð’ противном Ñлучае,\n"
+" вÑе неаутентифицированные пользователи не могут делать push, равно\n"
+" как и пользователи, приÑутÑтвующие в Ñтом ÑпиÑке. Этот ÑпиÑок\n"
+" проверÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ ÑпиÑком allow_push."
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+"``deny_read``\n"
+" Запрещать или нет чтение/проÑмотр хранилища. ЕÑли Ñтот ÑпиÑок не\n"
+" пуÑÑ‚, неаутентифицированным пользователÑм запрещаетÑÑ Ñ‡Ñ‚ÐµÐ½Ð¸Ðµ\n"
+" хранилища, равно как и пользователÑм, перечиÑленным в Ñтом ÑпиÑке.\n"
+" ЕÑли уÑтановлен в Ñпециальное значение ``*``, вÑем отдалённым\n"
+" пользователÑм запрещаетÑÑ Ð´Ð¾Ñтуп (Ñто требуетÑÑ Ñ€ÐµÐ´ÐºÐ¾). ЕÑли Ñтот\n"
+" ÑпиÑок пуÑÑ‚ или не задан, предоÑтавление доÑтупа к хранилищу\n"
+" завиÑит от ÑпиÑка allow_read (Ñм. опиÑание). ЕÑли оба Ñтих ÑпиÑка\n"
+" не заданы или пуÑÑ‚Ñ‹, доÑтуп предоÑтавлÑетÑÑ Ð²Ñем пользователÑм по\n"
+" умолчанию. ЕÑли хранилище раÑшариваетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ hgwebdir,\n"
+" запрещенные пользователи не Ñмогут видеть его в ÑпиÑке хранилищ.\n"
+" СпиÑок deny_read имеет приоритет (читаетÑÑ Ñ€Ð°Ð½ÑŒÑˆÐµ) перед allow_read."
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+"``descend``\n"
+" hgwebdir не будет индекÑировать подкаталоги. Только хранилища,\n"
+" раÑположенные прÑмо по текущему пути будут видны (оÑтальные\n"
+" хранилища вÑе равно будут доÑтупны по индекÑу, ÑоответÑтвующему\n"
+" их пути)."
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+"``description``\n"
+" ТекÑтовое опиÑание Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸ Ñодержимого хранилища.\n"
+" По умолчанию \"unknown\" (неизвеÑтно)."
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+"``encoding``\n"
+" Ðазвание кодировки. По умолчанию кодировка текущей локали.\n"
+" Ðапример: \"UTF-8\""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+"``errorlog``\n"
+" Куда пиÑать журнал ошибок. По умолчанию stderr."
+
+msgid ""
+"``comparisoncontext``\n"
+" Number of lines of context to show in side-by-side file comparison. If\n"
+" negative or the value ``full``, whole files are shown. Default is 5.\n"
+" This setting can be overridden by a ``context`` request parameter to "
+"the\n"
+" ``comparison`` command, taking the same values."
+msgstr ""
+"``comparisoncontext``\n"
+" КоличеÑтво Ñтрок контекÑта, показываемого при поÑтрочном Ñравнении "
+"файлов.\n"
+" ЕÑли отрицательно или ``full``, файлы показыаютÑÑ Ñ†ÐµÐ»Ð¸ÐºÐ¾Ð¼. По умолчанию "
+"5.\n"
+" Это значение может быть переопределено параметром запроÑа ``context`` "
+"команды\n"
+" ``comparison``, принимающей такие же значениÑ."
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+"``hidden``\n"
+" Скрывать ли хранилище в ÑпиÑке hgwebdir.\n"
+" По умолчанию False (не прÑтать)."
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+"``ipv6``\n"
+" ИÑпользовать IPv6. По умолчанию False (не иÑпользовать)."
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+"``logoimg``\n"
+" Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¾Ð¹-логотипом, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾ÐºÐ°Ð·Ñ‹Ð²Ð°ÐµÑ‚ÑÑ Ð² некоторых\n"
+" шаблонах на каждой Ñтранице. Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° задаетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно "
+"``staticurl``.\n"
+" Т.е. полный путь к логотипу - \"staticurl/logoimg\".\n"
+" ЕÑли не задан, будет иÑпользован ``hglogo.png``."
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+"``logourl``\n"
+" Базовый URL Ð´Ð»Ñ Ð»Ð¾Ð³Ð¾Ñ‚Ð¸Ð¿Ð¾Ð². ЕÑли не задан, по умолчанию иÑпользуетÑÑ\n"
+" ``http://mercurial.selenic.com/``."
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+"``name``\n"
+" Ð˜Ð¼Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°, иÑпользуемое в веб-интерфейÑе. По умолчанию\n"
+" текущий рабочий каталог."
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+"``maxchanges``\n"
+" МакÑимальное количеÑтво изменений, показываемых в логе. По умолчанию 10."
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+"``maxfiles``\n"
+" МакÑимальное количеÑтво файлов, показываемых Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений.\n"
+" По умолчанию 10."
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+" Ðомер порта Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ñщих Ñоединений. По умолчанию 8000."
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+"``prefix``\n"
+" ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¿ÑƒÑ‚Ð¸, откуда раздаютÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° (по умолчанию: корень Ñервера)"
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+"``push_ssl``\n"
+" Требовать передачи входÑщих изменений по SSL, чтобы предотвратить\n"
+" кражу паролей. По умолчанию True (требовать)."
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+"``staticurl``\n"
+" Базовый URL Ð´Ð»Ñ ÑтатичеÑких файлов. ЕÑли не задан, ÑтатичеÑкие\n"
+" файлы (например, фавикон hgicon.png) будут отдаватьÑÑ Ñамим\n"
+" CGI-Ñкриптом. ИÑпользуйте Ñтот параметр, чтобы отдавать Ñтатику\n"
+" напрÑмую HTTP-Ñервером. Пример: ``http://hgserver/static/``."
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+"``stripes``\n"
+" Сколько Ñтрок должна охватывать \"полоÑа зебры\" (\"zebra stripe\") при\n"
+" многоÑтрочном выводе. По умолчанию 1; 0 - отключить."
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+"``style``\n"
+" ИÑпользуемый Ñтиль шаблона Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (template map style)"
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+"``templates``\n"
+" Где иÑкать HTML-шаблоны. По умолчанию уÑтановочный каталог.\n"
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "Ðекоторые команды позволÑÑŽÑ‚ задать дату, например:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: указать дату фикÑации.\n"
+"- log, revert, update: выбрать ревизию(и) по дате."
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "Можно задавать даты во многих форматах. Ðапример:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (предполагаетÑÑ Ð¼ÐµÑтное времÑ)\n"
+"- ``Dec 6 13:18 -0600`` (Ñмещение отноÑительно начала года)\n"
+"- ``Dec 6 13:18 UTC`` (UTC и GMT Ñто пÑевдонимы Ð´Ð»Ñ +0000)\n"
+"- ``Dec 6`` (полночь)\n"
+"- ``13:18`` (ÑегоднÑшний день)\n"
+"- ``3:39`` (3:39AM)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (формат ISO 8601)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (6 Ð´ÐµÐºÐ°Ð±Ñ€Ñ 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "Ðаконец, еÑÑ‚ÑŒ внутренний формат Mercurial:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (Среда 6 Ð´ÐµÐºÐ°Ð±Ñ€Ñ 13:18:29 2006 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"Это внутренний формат предÑтавление дат. Первое чиÑло - Ñто количеÑтво\n"
+"Ñекунд Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Ñпохи (1970-01-01 00:00 UTC). Второе чиÑло - Ñмещение\n"
+"текущего чаÑового поÑÑа, в Ñекундах к западу от UTC (отрицательные\n"
+"чиÑла - к воÑтоку от UTC)."
+
+msgid "The log command also accepts date ranges:"
+msgstr "Команда log также принимает диапазоны дат:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+"- ``<DATE`` - до заданной даты/времени включительно\n"
+"- ``>DATE`` - поÑле заданной даты/времени включительно\n"
+"- ``DATE to DATE`` - диапазон дат, включительно\n"
+"- ``-DAYS`` - заданное количеÑтво дней назад от ÑегоднÑшнего днÑ\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+"По умолчанию Mercurial показывает Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ревизиÑми файла в\n"
+"унифицированном формате GNU diff (unified diff), который может быть\n"
+"иÑпользован в GNU patch и многих других Ñтандартных инÑтрументах."
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+"Ð¥Ð¾Ñ‚Ñ ÐºÐ°Ðº правило Ñтандартного формата доÑтаточно, он не Ñодержит\n"
+"Ñледующей информации:"
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+"- признаки иÑполнÑемого файла и биты прав доÑтупа\n"
+"- информацию о копировании и перемещении\n"
+"- Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² бинарных файлах\n"
+"- Ñоздание или удаление пуÑÑ‚Ñ‹Ñ… файлов"
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+"Mercurial также поддерживает раÑширенный формат diff VCS git, который\n"
+"иÑправлÑет Ñти недоÑтатки. Этот формат не иÑпользуетÑÑ Ð¿Ð¾ умолчанию,\n"
+"потому что многие раÑпроÑтраненные инÑтрументы его не понимают."
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+"Это значит, что при генерировании различий из хранилища Mercurial\n"
+"(например, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`export`), нужно быть оÑторожным Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸\n"
+"вещами как ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ другими перечиÑленными выше,\n"
+"потому что при применении Ñтандартного файла различий к другому хранилищу\n"
+"Ñта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ‚ÐµÑ€ÑетÑÑ. Ðа внутренние операции Mercurial (как push\n"
+"или pull) Ñто не влиÑет, потому что они иÑпользуют внутренний бинарный\n"
+"формат Ð´Ð»Ñ Ð¾Ð±Ð¼ÐµÐ½Ð° изменениÑми."
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+"Чтобы генерировать Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð² раÑширенном формате git, иÑпользуйте опцию\n"
+"--git, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð´Ð¾Ñтупна Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ… команд, или уÑтановите 'git = True'\n"
+"в Ñекции [diff] в вашем конфиге. Эту опцию не обÑзательно указывать\n"
+"при импорте различий в Ñтом формате или иÑпользовании раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ mq.\n"
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+"HG\n"
+" Путь к иÑполнÑемому файлу 'hg', передаетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки при\n"
+" при обработке хуков, раÑширений или внешних программ. ЕÑли не\n"
+" уÑтановлена или пуÑтаÑ, Ñто Ð¸Ð¼Ñ Ð¸ÑполнÑемого файла hg, еÑли\n"
+" еÑли оно зафикÑировано, либо выполнÑетÑÑ Ð¿Ð¾Ð¸Ñк иÑполнÑемого\n"
+" файла 'hg' (Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼ %PATHEXT% [по умолчанию COM/EXE/BAT/CMD]\n"
+" в Windows)"
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+"HGEDITOR\n"
+"\n"
+" Ð˜Ð¼Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð°, который запуÑкаетÑÑ Ð¿Ñ€Ð¸ фикÑации. См. EDITOR."
+
+msgid " (deprecated, use configuration file)"
+msgstr " (уÑтарело, иÑпользуйте файл конфигурации)"
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+"HGENCODING\n"
+" Замещает наÑтройку кодировки в локали иÑпользуемую Mercurial\n"
+" по умолчанию. Этот параметр иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ\n"
+" имен пользователей, опиÑаний ревизий, имен веток и меток.\n"
+" Можно переопределить Ñту наÑтройку Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции командной\n"
+" Ñтроки --encoding."
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+"HGENCODINGMODE\n"
+" ОпределÑет поведение Mercurial при обработке неизвеÑтных Ñимволов\n"
+" при перекодировании ввода пользователÑ. По умолчанию уÑтановлен\n"
+" в \"strict\", что заÑтавлÑет Mercurial завершитьÑÑ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ¾Ð¹, еÑли\n"
+" не получаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ ÑоответÑтвующий Ñимвол. Возможны также значениÑ\n"
+" \"replace\", которое заменÑет неизвеÑтные Ñимволы, и \"ignore\",\n"
+" которое удалÑет их. Эту наÑтройку можно переопределить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" опции командной Ñтроки --encodingmode."
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+"HGENCODINGAMBIGUOUS\n"
+" ОпределÑет поведение Mercurial при обработке Ñимволов Ñ\n"
+" \"неоднозначной\" шириной, вроде латинÑких Ñимволов Ñ ÑƒÐ´Ð°Ñ€ÐµÐ½Ð¸ÐµÐ¼\n"
+" в воÑточно-азиатÑких шрифтах. По умолчанию Mercurial Ñчитает\n"
+" такие Ñимволы узкими, уÑтановите Ñту переменную в \"wide\",\n"
+" еÑли форматирование ÑбиваетÑÑ."
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+"HGMERGE\n"
+" Программа Ð´Ð»Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² ÑлиÑниÑ. Она будет вызвана\n"
+" Ñ Ñ‚Ñ€ÐµÐ¼Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸: локальный файл, отдалённый файл, иÑходный файл."
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+"HGRCPATH\n"
+" СпиÑок файлов или каталогов в которых ищутÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ конфигурации.\n"
+" Ð’ качеÑтве Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð² Unix иÑпользуетÑÑ \":\", в Windows - \";\".\n"
+" ЕÑли HGRCPATH не уÑтановлена, иÑпользуетÑÑ Ð¿ÑƒÑ‚ÑŒ поиÑка по умолчанию\n"
+" Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ платформы. ЕÑли Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑƒÑтановлена в пуÑтое значение,\n"
+" то иÑпользуетÑÑ .hg/hgrc текущего хранилища."
+
+msgid " For each element in HGRCPATH:"
+msgstr " Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñлемента в HGRCPATH:"
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+" - еÑли Ñто каталог, читаютÑÑ Ð²Ñе файлы Ñ Ñ€Ð°Ñширением .rc\n"
+" - в противном Ñлучае, читаетÑÑ Ñам файл"
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+"HGPLAIN\n"
+" ЕÑли уÑтановлена, отключает вÑе наÑтройки в конфиге, которые\n"
+" могут изменить вывод Mercurial. Сюда входÑÑ‚ кодировка, параметры\n"
+" по умолчанию, режим verbose, отладочный режим, подавление вывода,\n"
+" траÑÑировки Ñтека, локализациÑ. Это полезно при иÑпользовании\n"
+" Mercurial в Ñкриптах при различных пользовательÑких наÑтройках."
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+" Ðналогичные параметры, уÑтановленные через командную Ñтроку\n"
+" или переменные Ñреды не переопределÑÑŽÑ‚ÑÑ."
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+"HGPLAINEXCEPT\n"
+" СпиÑок разделенных запÑтой наÑтроек, которые ÑохранÑÑŽÑ‚ÑÑ Ð¿Ñ€Ð¸\n"
+" уÑтановленной HGPLAIN. Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾\n"
+" значение \"i18n\", которое ÑохранÑет вывод на Ñзыке локали."
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+" УÑтановка HGPLAINEXCEPT в любое значение (даже пуÑтую Ñтроку)\n"
+" включит режим HGPLAIN."
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+"HGUSER\n"
+" Это Ñтрока, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð² качеÑтве имени автора фикÑации. ЕÑли\n"
+" не уÑтановлена, иÑпользуютÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñледующем порÑдке:"
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+" - HGUSER (уÑтарело)\n"
+" - файлы конфигурации из HGRCPATH\n"
+" - EMAIL\n"
+" - интерактивно введенное Ñ ÐºÐ»Ð°Ð²Ð¸Ð°Ñ‚ÑƒÑ€Ñ‹ имÑ\n"
+" - ЛОГИР(Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ð¼ ``@имÑ-хоÑта``)"
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"EMAIL\n"
+" Может быть иÑпользовано в качеÑтве автора фикÑации; Ñм. HGUSER."
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+"LOGNAME\n"
+" Может быть иÑпользовано в качеÑтве автора фикÑации; Ñм. HGUSER."
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+"VISUAL\n"
+" Ðазвание редактора, иÑпользуемого при фикÑациÑÑ…. См. EDITOR."
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+"EDITOR\n"
+" Иногда требуетÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ текÑтовый файл в редакторе, чтобы.\n"
+" внеÑти изменениÑ, например Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ„Ð¸ÐºÑации.\n"
+" ИÑпользуемый редактор определÑетÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ Ñреды HGEDITOR,\n"
+" VISUAL и EDITOR, именно в таком порÑдке. ВыбираетÑÑ Ð¿ÐµÑ€Ð²Ð°Ñ\n"
+" непуÑÑ‚Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ. ЕÑли они вÑе пуÑÑ‚Ñ‹, иÑпользуетÑÑ 'vi'."
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+"PYTHONPATH\n"
+" ИÑпользуетÑÑ Python'ом Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка импортируемых модулей и должна\n"
+" быть корректно уÑтановлена, еÑли Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Mercurial не\n"
+" уÑтановлена в ÑиÑтему штатно.\n"
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"Ð’ Mercurial можно добавлÑÑ‚ÑŒ новые функции Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ раÑширений.\n"
+"РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ добавлÑÑ‚ÑŒ новые команды, опции к ÑущеÑтвующим\n"
+"командам, изменÑÑ‚ÑŒ поведение команд, реализовывать хуки."
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð½Ðµ загружаютÑÑ Ð¿Ð¾ умолчанию по многим причинам: они могут\n"
+"увеличить Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка; они могут подразумевать только иÑпользование\n"
+"опытными пользователÑми; они могут предоÑтавлÑÑ‚ÑŒ потенциально опаÑные\n"
+"возможноÑти (например, позволÑÑ Ñтирать или изменÑÑ‚ÑŒ иÑторию); они\n"
+"могут быть не готовы к мажорному релизу; или они могут менÑÑ‚ÑŒ\n"
+"Ñтандартное поведение Mercurial. ПоÑтому пользователь должен включать\n"
+"раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾ мере надобноÑти."
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"Чтобы включить раÑширение \"foo\", включенное в диÑтрибутив Mercurial\n"
+"или доÑтупное по извеÑтным Python'у путÑм, Ñоздайте запиÑÑŒ в вашем\n"
+"файле конфигурации::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr "Можно также указать полный путь к раÑширению::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"Чтобы Ñвно отключить раÑширение, включенное в файле конфигурации\n"
+"охватывающей облаÑти дейÑтвиÑ, добавьте перед ним !::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # отключить раÑширение bar, находÑщееÑÑ Ð² /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # то же, но путь Ð´Ð»Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ baz не был указан\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr ""
+"Mercurial поддерживает функциональный Ñзык Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° набора\n"
+"файлов."
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+"Как и другие шаблоны имен файлов, Ñтот шаблон обозначаетÑÑ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом\n"
+"'set:'. Язык поддерживает неÑколько предикатов, которые объединÑÑŽÑ‚ÑÑ\n"
+"инфикÑными операторами. Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ можно иÑпользовать Ñкобки."
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+"Идентификаторы, такие как имена файлов или шаблоны, должны заключатьÑÑ\n"
+"в одиночные или двойные кавычки, еÑли они Ñодержат Ñимволы не из набора\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]``, или еÑли они Ñовпадают Ñ Ð¾Ð´Ð½Ð¸Ð¼\n"
+"из предопределённых предикатов. Это отноÑитÑÑ Ñ‚Ð°ÐºÐ¶Ðµ и к шаблонам имен\n"
+"файлов, не ÑвлÑющихÑÑ glob'ами, и к аргументам предикатов."
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+"Ð’ идентификаторах можно иÑпользовать Ñпециальные Ñимволы, ÑÐºÑ€Ð°Ð½Ð¸Ñ€ÑƒÑ Ð¸Ñ….\n"
+"Ðапример ``\\n`` интерпретируетÑÑ ÐºÐ°Ðº перевод Ñтроки. Чтобы запретить\n"
+"такую интерпретацию, поÑтавьте перед Ñтрокой ``r``, например, ``r'...'``."
+
+msgid "There is a single prefix operator:"
+msgstr "ПоддерживаетÑÑ Ð¾Ð´Ð¸Ð½ префикÑный оператор:"
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Файлы, не входÑщие в x. ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: ``! x``."
+
+msgid "These are the supported infix operators:"
+msgstr "Поддерживаемые инфикÑные операторы:"
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" ПереÑечение файлов из x и y. ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" Объединение файлов из x и y. СущеÑтвуют две краткие формы:\n"
+" ``x | y`` and ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Файлы, входÑщие в x, но не в y."
+
+msgid "The following predicates are supported:"
+msgstr "ПоддерживаютÑÑ Ñледующие предикаты:"
+
+msgid ".. predicatesmarker"
+msgstr ".. predicatesmarker"
+
+msgid "Some sample queries:"
+msgstr "Примеры запроÑов:"
+
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr "- Показать ÑÑ‚Ð°Ñ‚ÑƒÑ Ñ„Ð°Ð¹Ð»Ð¾Ð², ÑчитающихÑÑ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼Ð¸, в рабочем каталоге::"
+
+msgid " hg status -A \"set:binary()\""
+msgstr " hg status -A \"set:binary()\""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr "- Забыть файлы, которые запиÑаны в .hgignore, но уже контролируютÑÑ::"
+
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr " hg forget \"set:hgignore() and not ignored()\""
+
+msgid "- Find text files that contain a string::"
+msgstr "- Ðайти текÑтовые файлы, Ñодержащие Ñтроку::"
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr " hg locate \"set:grep(magic) and not binary()\""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr "- Ðайти файлы С Ñ Ð½ÐµÑтандартной кодировкой::"
+
+msgid " hg locate \"set:**.c and not encoding('UTF-8')\""
+msgstr " hg locate \"set:**.c and not encoding('UTF-8')\""
+
+msgid "- Revert copies of large binary files::"
+msgstr "- Вернуть (revert) копии больших бинарных файлов::"
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr " hg revert \"set:copied() and binary() and size('>1M')\""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr "- Удалить файлы, перечиÑленные в foo.lst и Ñодержащие букву a или b::"
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr "См. также :hg:`help patterns`.\n"
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+"Предок\n"
+" Любой набор изменений, до которого можно пройти по непрерывной\n"
+" цепочке родительÑких наборов изменений от данного набора. Более\n"
+" точно, предок набора изменений определÑетÑÑ Ð´Ð²ÑƒÐ¼Ñ ÑвойÑтвами:\n"
+" родитель набора изменений ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼, и родитель предка\n"
+" также ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼. См. также: 'Потомок'."
+
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+"Закладка (Bookmark)\n"
+" Закладки - Ñто указатели на некоторую фикÑацию, которые перемещаютÑÑ\n"
+" при фикÑации. Они похожи на метки тем, что их можно иÑпользовать\n"
+" вмеÑто ID (Ñ…Ñшей) наборов изменений, например, в :hg:`update`.\n"
+" Ðо, в отличие от меток, закладки перемещаютÑÑ Ð²Ñлед за фикÑациÑми."
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+" Закладки можно переименовывать, копировать и удалÑÑ‚ÑŒ. Закладки\n"
+" по умолчанию локальны, до тех пор пока они Ñвно не передаютÑÑ\n"
+" Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ push или pull между хранилищами. Передача закладок\n"
+" позволÑет вам ÑовмеÑтно работать над ветками, не ÑоздаваÑ\n"
+" именованную ветку."
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+"Ветка (Branch)\n"
+" Дочерний набор изменений, родительÑкий набор которого не ÑвлÑетÑÑ\n"
+" головной ревизией. Иногда называютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ топологичеÑкими ветками\n"
+" (Ñм. 'Ветка, топологичеÑкаÑ'). ЕÑли Ð´Ð»Ñ Ñ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой ветки\n"
+" задаетÑÑ Ð¸Ð¼Ñ, она ÑтановитÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹ веткой. ЕÑли \n"
+" топологичеÑÐºÐ°Ñ Ð²ÐµÑ‚ÐºÐ° не имеет имени, она ÑтановитÑÑ\n"
+" анонимной веткой. См. 'Ветка, анонимнаÑ' и 'Ветка, именованнаÑ'."
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+" Ветки могут ÑоздаватьÑÑ Ð¿Ñ€Ð¸ передаче изменений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ push или\n"
+" pull, поÑкольку Ñти операции могут Ñоздавать новые головы. Следует\n"
+" заметить, что термин \"ветка\" может быть иÑпользован неформально\n"
+" Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимой чаÑти процеÑÑа разработки. Иногда Ñто\n"
+" формализуетÑÑ Ñвно Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ именованных веток, но можно Ñделать\n"
+" Ñто и локально Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ закладок или ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ анонимных\n"
+" веток."
+
+msgid " Example: \"The experimental branch\"."
+msgstr " Пример: \"ЭкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°\"."
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+"Ветвление\n"
+" (Ñоздание ветки) ДейÑтвие по Ñозданию дочернего набора изменений,\n"
+" в результате которого родительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ более одной\n"
+" дочерней."
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr " Пример: \"Я ÑобираюÑÑŒ ответвитьÑÑ Ð² точке Ð¥\"."
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+"Ветка, анонимнаÑ\n"
+" Каждый раз, когда новый набор изменений ÑоздаетÑÑ Ð¾Ñ‚ родителÑ,\n"
+" не ÑвлÑющегоÑÑ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð¹ ревизией, и при Ñтом Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ не менÑетÑÑ,\n"
+" ÑоздаётÑÑ Ð½Ð¾Ð²Ð°Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°."
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+"Ветка, закрытаÑ\n"
+" Ð˜Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°, на которой вÑе головные ревизии закрыты."
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+"Ветка, по умолчанию\n"
+" Ветка, привÑÐ·Ð°Ð½Ð½Ð°Ñ Ðº набору изменений, до того, как было Ñвно задано\n"
+" какое-либо Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸."
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+"Голова ветки\n"
+" См. 'Голова, ветки'."
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+"Ветка, неактивнаÑ\n"
+" ЕÑли Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° не имеет топологичеÑких головных ревизий,\n"
+" она ÑчитаетÑÑ Ð½ÐµÐ°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹. Ðапример, ветка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ функции Ñтанет\n"
+" неактивной, когда она будет Ñлита в ветку по умолчанию (default).\n"
+" Команда ':hg:`branches` по умолчанию показывает неактивные ветки,\n"
+" их можно Ñкрыть Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`branches --active`."
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+" ПРИМЕЧÐÐИЕ: такое поведение уÑтарело и больше не иÑпользуетÑÑ,\n"
+" потому что оно Ñлишком неочевидно и может вызывать путаницу.\n"
+" Теперь не нужные более ветки необходимо Ñвно закрывать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" :hg:`commit --close-branch`"
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+"Ветка, именованнаÑ\n"
+" ÐеÑколько наборов изменений, имеющих одно и то же Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸.\n"
+" По умолчанию дочерние ревизии набора изменений на некоторой\n"
+" именованной ветке принадлежат той же ветке. Дочерний набор\n"
+" изменений может быть Ñвно привÑзан к другой ветке. Подробнее об\n"
+" управлении ветками Ñм. :hg:`help branch`, :hg:`help branches` и\n"
+" :hg:`commit --close-branch`"
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+" Именованные ветки можно трактовать как некое проÑтранÑтво имен,\n"
+" разделÑющие наборы изменений, ÑоÑтавлÑющие хранилище, на\n"
+" неÑколько отдельных подмножеÑтв. Ð˜Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° не обÑзательно\n"
+" ÑвлÑетÑÑ Ñ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой веткой. ЕÑли Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° отщеплÑетÑÑ\n"
+" от головы другой именованной ветки или ветки по умолчанию (default),\n"
+" но на первоначальную ветку более не добавлÑетÑÑ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² изменений,\n"
+" то Ð¿ÐµÑ€Ð²Ð¾Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° будет ÑущеÑтвовать только в качеÑтве имени."
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+"ÐžÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip) ветки\n"
+" См. 'ÐžÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip), ветка'."
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+"Ветка, топологичеÑкаÑ\n"
+" Каждый раз, когда дочернÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¾Ñ‚Ñ‰ÐµÐ¿Ð»ÑетÑÑ Ð¾Ñ‚ родительÑкой,\n"
+" ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ ÑвлÑетÑÑ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ð¹ ревизий, ÑоздаетÑÑ Ñ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкаÑ\n"
+" ветка. ЕÑли ей приÑваиваетÑÑ Ð¸Ð¼Ñ, она ÑтановитÑÑ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð¾Ð¹\n"
+" веткой. ЕÑли Ð´Ð»Ñ Ñ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð³Ð¸Ñ‡ÐµÑкой ветки не задаетÑÑ Ð¸Ð¼Ñ, она\n"
+" ÑтановитÑÑ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð¾Ð¹ веткой текущей ветки - возможно, ветки\n"
+" по умолчанию (default)."
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+"Журнал изменений (Changelog)\n"
+" ЗапиÑÑŒ наборов изменений в порÑдке их Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² хранилище.\n"
+" Она включает информацию об ID (Ñ…Ñше) ревизии, авторе, Ñообщение\n"
+" фикÑации, дату и ÑпиÑок измененных файлов."
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+"Ðабор изменений (changeset)\n"
+" Снимок ÑоÑтоÑÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°, иÑпользуемый Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи изменениÑ."
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+"Ðабор изменений (ревизиÑ), дочерний\n"
+" ПротивоположноÑÑ‚ÑŒ родительÑкого набора изменений: еÑли Р -\n"
+" родительÑкий набор изменений Д, то Д - дочерний набор\n"
+" изменений Р. Ðабор изменений может иметь неограниченное количеÑтво\n"
+" дочерних наборов изменений."
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+"Идентификатор (ID) набора изменений\n"
+" Ð¥Ñш SHA-1, однозначно идентифицирующий набор изменений. Может\n"
+" быть предÑтавлен как \"длиннаÑ\" (40 шеÑтнадцатеричных Ñимволов)\n"
+" или \"короткаÑ\" (12 шеÑтнадцатеричных Ñимволов) Ñтрока."
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+"Ðабор изменений ÑлиÑниÑ\n"
+" Ðабор изменений Ñ Ð´Ð²ÑƒÐ¼Ñ Ð¿Ñ€ÐµÐ´ÐºÐ°Ð¼Ð¸. СоздаетÑÑ ÐºÐ¾Ð³Ð´Ð° фикÑируетÑÑ\n"
+" результат ÑлиÑниÑ."
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+"Ðабор изменений, родительÑкий\n"
+" РевизиÑ, на оÑнове которой Ñоздана дочернÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ. Точнее,\n"
+" родительÑкий набор изменений набора Д - Ñто набор изменений,\n"
+" непоÑредÑтвенно предшеÑтвующий набору Д на графе. Ðабор\n"
+" изменений может иметь не более двух родителей."
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+"Извлечение, извлечь (checkout)\n"
+" (Сущ.) Рабочий каталог, обновленный до определенной ревизии.\n"
+" Ðе Ñтоит иÑпользовать Ñто понÑтие, поÑкольку набор изменений или\n"
+" Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ ÑвлÑÑŽÑ‚ÑÑ Ð±Ð¾Ð»ÐµÐµ подходÑщими терминами в таком контекÑте."
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr " Пример: \"Я иÑпользую извлечение Ð¥.\""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (Гл.) Обновить рабочий каталог до определенной ревизии. См.\n"
+" :hg:`help update`."
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr " Пример: \"Я ÑобираюÑÑŒ извлечь ревизию Ð¥.\""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+" Дочерний набор изменений (ревизиÑ)\n"
+" См. 'Ðабор изменений, дочерний'."
+
+msgid ""
+"Close changeset\n"
+" See 'Head, closed branch'"
+msgstr ""
+"Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ\n"
+" См. 'Ð“Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ°'."
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+"Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ°\n"
+" Cм. 'Ветка, закрытаÑ'."
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+"Клон\n"
+" ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¸Ð»Ð¸ чаÑÑ‚Ð¸Ñ‡Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°. ЧаÑтичный клон должен\n"
+" быть в форме ревизии Ñ ÐµÐµ предками."
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr " Пример: \"Содержит ли твой клон вÑе поÑледние изменениÑ?\""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+"Клонирование\n"
+" ПроцеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½Ð° Ñ Ð¸Ñпользованием :hg:`clone`."
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr " Пример:\"Я ÑобираюÑÑŒ клонировать хранилище\"."
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+"Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð° ветки\n"
+" См. 'Ð“Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ°'."
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+"ФикÑациÑ\n"
+" (Сущ.) Синоним набора изменений."
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr " Пример: \"ИÑправлена ли Ñта ошибка в твоей поÑледней фикÑации?\""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+" (Гл.) ДейÑтвие по фикÑации изменений в хранилище. Когда файлы\n"
+" фикÑируютÑÑ Ð² рабочем каталоге, Mercurial ищет Ð¾Ñ‚Ð»Ð¸Ñ‡Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ними и\n"
+" и их родительÑкой ревизией, ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ð½Ð¾Ð²Ñ‹Ð¹ набор изменений в\n"
+" хранилище."
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr " Пример: \"Тебе Ñтоит зафикÑировать Ñти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ.\""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+"Cset\n"
+" Сокр. от changeset (набор изменений)."
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+"ÐÐГ (DAG, граф)\n"
+" Хранилище Ñ Ð½Ð°Ð±Ð¾Ñ€Ð°Ð¼Ð¸ изменений раÑпределенной ÑиÑтемы контролÑ\n"
+" верÑий (DVCS) может быть предÑтавлен как направленный ацикличеÑкий\n"
+" граф (ÐÐГ, англ. DAG), ÑоÑтоÑщий из узлов и ребер, где узлы ÑвлÑÑŽÑ‚ÑÑ\n"
+" наборами изменений, а ребра отражают отражают отношение родительÑкаÑ-\n"
+" дочернÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ. Этот граф можно визуализировать Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" графичеÑких инÑтрументов вроде :hg:`glog` (graphlog). Ð’ Mercurial\n"
+" граф ограничен требованием ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ более двух родителей."
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+"Ветка по умолчанию (default)\n"
+" См. 'Ветка, по умолчанию'."
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+"Потомок\n"
+" Ð›ÑŽÐ±Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, до которой можно добратьÑÑ Ð¿Ð¾ цепочке дочерних\n"
+" ревизий от данной ревизии. Точнее, потомки ревизий могут быть\n"
+" опиÑаны Ð´Ð²ÑƒÐ¼Ñ ÑвойÑтвами: дочернÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½ÐµÐºÐ¾Ð¹ ревизии ÑвлÑетÑÑ\n"
+" ее потомком и дочернÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ° некой ревизии также ÑвлÑетÑÑ\n"
+" потомком Ñтой ревизии."
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+"РазличиÑ, файл различий (diff)\n"
+" ÐžÑ‚Ð»Ð¸Ñ‡Ð¸Ñ Ñодержимого и атрибутов файлов между Ð´Ð²ÑƒÐ¼Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñми\n"
+" или между некоей ревизией и текущим рабочим каталогом. ОтличиÑ\n"
+" обычно предÑтавлены в Ñтандартной форме, называемой \"диффом\"\n"
+" или \"патчем\". Формат различий git иÑпользуетÑÑ, еÑли изменениÑ\n"
+" должны включать копированиÑ, Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ изменениÑ\n"
+" атрибутов файлов, которые не могут быть предÑтавлены или\n"
+" обработаны клаÑÑичеÑкими инÑтрументами \"diff\" и \"patch\"."
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr " Пример: \"Я приÑлал тебе файл различий Ñ Ð¼Ð¾Ð¸Ð¼Ð¸ иÑправлениÑми.\""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+" (в англ) Diff (гл.) - процеÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð¸Ñ„Ñ„Ð¾Ð² или патчей. По-руÑÑки\n"
+" так не говорÑÑ‚."
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+" Пример: \"If you diff with changeset X, you will see what I mean.\""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+"Каталог, рабочий\n"
+" Рабочий каталог отражает ÑоÑтоÑние файлов, контролируемых Mercurial,\n"
+" которое будет закреплено при Ñледующей фикÑации. Рабочий каталог\n"
+" изначально ÑоответÑтвует Ñнимку ÑущеÑтвующей ревизии, называемой\n"
+" родителем рабочего каталога. См. 'Родитель, рабочий каталог'.\n"
+" СоÑтоÑние может быть изменено за Ñчет ручной правки файлов или\n"
+" ÑлиÑниÑ. Метаданные хранилища находÑÑ‚ÑÑ Ð² каталоге .hg в рабочем\n"
+" каталоге."
+
+msgid ""
+"Draft\n"
+" Changesets in the draft phase have not been shared with publishing\n"
+" repositories and may thus be safely changed by history-modifying\n"
+" extensions. See :hg:`help phases`."
+msgstr ""
+"Черновик\n"
+" Ðаборы изменений в черновой фазе еще не были опубликованы в\n"
+" общедоÑтупных хранилищах, поÑтому они могут безопаÑно модифицироватьÑÑ\n"
+" раÑширениÑми, изменÑющими иÑторию. См. :hg:`help phases`."
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+"Граф\n"
+" См. ÐÐГ и :hg:`help graphlog`."
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+"Голова (Ð³Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ)\n"
+" Термин 'голова', может быть иÑпользован Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ\n"
+" головной ревизии как ветки, так и хранилища, в завиÑимоÑти от\n"
+" контекÑта. См. 'Голова, хранилище' и 'Голова, ветка'."
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+" Ð’ головных Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ñходит вÑÑ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° и они обычно\n"
+" ÑвлÑÑŽÑ‚ÑÑ Ñ†ÐµÐ»Ñми ÑлиÑний и обновлений."
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+"Голова, ветки\n"
+" Ðабор изменений, не имеющий потомков на той же именованной ветке"
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+"Голова, Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ°\n"
+" Ðабор изменений, который помечает голову как более не интереÑную.\n"
+" Ð—Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð²ÐµÑ‚ÐºÐ° не отображаетÑÑ :hg:`heads`. Ветка ÑчитаетÑÑ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¾Ð¹,\n"
+" еÑли закрыты вÑе ее головы, и ÑоответÑтвенно она не отображаетÑÑ\n"
+" в выводе :hg:`branches`."
+
+msgid ""
+" Closed heads can be re-opened by committing new changeset as the\n"
+" child of the changeset that marks a head as closed."
+msgstr ""
+" Закрытые головы могут быть Ñнова открыты, еÑли зафикÑировать новую "
+"ревизию\n"
+" как дочернюю Ð´Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸, в которой голова была помечена как закрытаÑ."
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+"Голова, хранилище\n"
+" ТопологичеÑÐºÐ°Ñ Ð½Ðµ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ."
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+"Голова, топологичеÑкаÑ\n"
+" РевизиÑ, не Ð¸Ð¼ÐµÑŽÑ‰Ð°Ñ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ¾Ð² в хранилище."
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+"ИÑториÑ, неизменнаÑ\n"
+" ЗафикÑированный однажды набор изменений не может быть изменен.\n"
+" РаÑширениÑ, которые изменÑÑŽÑ‚ иÑторию, на Ñамом деле Ñоздают\n"
+" новые наборы изменений, которые заменÑÑŽÑ‚ уже ÑущеÑтвующие,\n"
+" поÑле чего удалÑÑŽÑ‚ Ñтарые наборы изменений. Такие дейÑÑ‚Ð²Ð¸Ñ Ð²\n"
+" публичном хранилище могут быть причиной Ñитуации, когда\n"
+" Ñтарые наборы изменений будут добавлены повторно."
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+"ИÑториÑ, изменение\n"
+" Ðаборы изменений в хранилище неизменны. Однако, раÑширениÑ\n"
+" Mercurial могут быть иÑпользованы Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñамого хранилища,\n"
+" как таким образом, чтобы Ñохранить Ñодержимое наборов изменений."
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+"ÐÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ð°Ñ Ð¸ÑториÑ\n"
+" См. 'ИÑториÑ, неизменнаÑ'."
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+"Ð ÐµÐ²Ð¸Ð·Ð¸Ñ ÑлиÑниÑ\n"
+" См. Ðабор изменений ÑлиÑниÑ"
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+"МанифеÑÑ‚\n"
+" Каждый набор изменений имеет манифеÑÑ‚, который ÑвлÑетÑÑ ÑпиÑком\n"
+" файлов, которые контролируютÑÑ Ð² Ñтом наборе изменений."
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+"СлиÑние\n"
+" ИÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð±ÑŠÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ€Ð°ÑходÑщихÑÑ Ð²ÐµÑ‚Ð¾Ðº разработки. Когда\n"
+" вы обновлÑетеÑÑŒ на некоторую ревизию и потом Ñливаете ее в другую\n"
+" ревизию, вы добавлÑете иÑторию поÑледней в ваш рабочий каталог.\n"
+" ПоÑле Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚Ð¾Ð² (и пометки файлов как разрешенных),\n"
+" Ñто ÑлиÑние будет зафикÑировано как Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ ÑлиÑниÑ, объединÑÑ Ð´Ð²Ðµ\n"
+" ветки на графе ревизий."
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+"Ð˜Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ°\n"
+" См. 'Ветка, именованнаÑ'."
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+"ПуÑÑ‚Ð°Ñ (Null) ревизиÑ\n"
+" ПуÑтой набор изменений. Это родительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ что\n"
+" инициализированного хранилища и хранилища, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾\n"
+" не извлечен рабочий каталог. Таким образом, она ÑвлÑетÑÑ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÐµÐ¼\n"
+" корневой (root) ревизии и фактичеÑким предком при ÑлиÑнии\n"
+" неÑвÑзанных наборов изменений. Может быть задана пÑевдонимом\n"
+" 'null' или ревизией Ñ ID '000000000000'."
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+"Родитель\n"
+" См. 'Ðабор изменений, родительÑкий'."
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+"РодительÑкий набор изменений\n"
+" См. 'Ðабор изменений, родительÑкий'."
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+" Родитель, рабочего каталога\n"
+" РодительÑÐºÐ°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога отражает виртуальную\n"
+" ревизию, ÑвлÑющуюÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½ÐµÐ¹ ревизией показываемых :hg:`parents`\n"
+" наборов изменений. МенÑетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`update`. Также можно\n"
+" узнать Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`summary` и\n"
+" :hg:`id`. Может задаватьÑÑ Ð¿Ñевдонимом \".\"."
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+"Патч\n"
+" Результат операции diff."
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr " Пример: \"Я отправил тебе мой патч.\""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+" Патчить - применÑÑ‚ÑŒ файл патча чтобы преобразовать один набор\n"
+" изменений в другой."
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr " Пример: \"Тебе придетÑÑ Ð¿Ñ€Ð¾Ð¿Ð°Ñ‚Ñ‡Ð¸Ñ‚ÑŒ Ñту ревизию.\""
+
+msgid ""
+"Phase\n"
+" A per-changeset state tracking how the changeset has been or\n"
+" should be shared. See :hg:`help phases`."
+msgstr ""
+"Фаза\n"
+" Механизм отÑÐ»ÐµÐ¶Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´Ð¸Ð²Ð¸Ð´ÑƒÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑоÑтоÑÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений,\n"
+" определющий, был ли он опубликован или должен быть опубликованным.\n"
+" См. :hg:`help phases`."
+
+msgid ""
+"Public\n"
+" Changesets in the public phase have been shared with publishing\n"
+" repositories and are therefore considered immutable. See :hg:`help\n"
+" phases`."
+msgstr ""
+"Публичный\n"
+" Ðаборы изменений в публичной фазе были опубликованы в общедоÑтупных\n"
+" хранилищах, поÑтому они ÑчитаютÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ñемыми. См. :hg:`help phases`."
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+"ЗатÑнуть (Pull)\n"
+" ОперациÑ, при которой наборы изменений из отдалённого хранилища,\n"
+" отÑутÑтвующие в локальном, передаютÑÑ Ð² локальное хранилище.\n"
+" Обратите внимание, что Ñта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð±ÐµÐ· дополнительных аргументов\n"
+" обновлÑет только хранилище, но не рабочий каталог.\n"
+" См. :hg:`help pull`."
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+"Протолкнуть (Push)\n"
+" ОперациÑ, при которой наборы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· локального хранилища,\n"
+" отÑутÑтвующие в отдалённом, переÑылаютÑÑ Ð² отдалённое хранилище.\n"
+" Обратите внимание, что Ñто передает только наборы изменений,\n"
+" которые были зафикÑированы в локальное хранилище. ÐезафикÑированные\n"
+" Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ðµ переÑылаютÑÑ. См. :hg:`help push`."
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+"Хранилище\n"
+" Метаданные, опиÑывающие вÑе зафикÑированные ÑоÑтоÑÐ½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð°\n"
+" файлов. Каждое зафикÑированное ÑоÑтоÑние предÑтавлено набором\n"
+" изменений. Хранилище как правило (но не вÑегда) находитÑÑ\n"
+" в подкаталоге ``.hg`` рабочего каталога. Каждое зафикÑированное\n"
+" ÑоÑтоÑние может быть воÑÑоздано \"обновлением\" рабочего каталога\n"
+" до желаемого набора изменений."
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+"Хранилища, голова\n"
+" См. 'Голова, хранилище'."
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+"РевизиÑ\n"
+" СоÑтоÑние хранилища на некоторый момент времени. Более ранние\n"
+" ревизии могут быть получены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`update`. См. также\n"
+" 'Ðомер ревизии' и 'Ðабор изменений'.\n"
+"\n"
+" ПРИМЕЧÐÐИЕ: в руÑÑком переводе термин \"ревизиÑ\" чаÑто иÑпользуетÑÑ\n"
+" как Ñиноним набора изменений. Ð¥Ð¾Ñ‚Ñ Ñто техничеÑки не ÑовÑем\n"
+" некорректно, но короче и понÑтнее."
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+"Ðомер ревизии\n"
+" Это целое чиÑло однозначно определÑет набор изменений в отдельно\n"
+" взÑтом хранилище. Оно отражает порÑдок, в котором наборы\n"
+" изменений были добавлены в хранилище, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸ Ñ\n"
+" номером 0. Очень важно понимать, что номера ревизий могут\n"
+" различатьÑÑ Ð² каждом клоне хранилища. Чтобы однозначно задать\n"
+" ревизию Ñреди вÑех клонов, Ñм. 'Идентификатор (ID) набора\n"
+" изменений'."
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+"Revlog (ревлог)\n"
+" Механизм Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ñтории, иÑпользуемый Mercurial. ЯвлÑетÑÑ\n"
+" разновидноÑтью ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´ÐµÐ»ÑŒÑ‚ (отличий), Ñ Ð¸Ð½Ð¾Ð³Ð´Ð° вÑтречающимиÑÑ\n"
+" полными ревизиÑми Ñ Ð´ÐµÐ»ÑŒÑ‚Ð°Ð¼Ð¸ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñледующей ревизии. Включает\n"
+" данные и Ð¸Ð½Ð´ÐµÐºÑ Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ»Ñми на данные."
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+"Изменение иÑтории\n"
+" См. 'ИÑториÑ, изменение'."
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+"Корень (ÐºÐ¾Ñ€Ð½ÐµÐ²Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ)\n"
+" Ðабор изменений, у которого единÑтвенный предок - null. БольшинÑтво\n"
+" хранилищ имеют только один корень."
+
+msgid ""
+"Secret\n"
+" Changesets in the secret phase may not be shared via push, pull,\n"
+" or clone. See :hg:`help phases`."
+msgstr ""
+"Секретный\n"
+" Ðабор изменений в Ñекретной фазе не может быть передан Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" команд push, pull или clone. См. :hg:`help phases`."
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+"Метка\n"
+" Ðльтернативное имÑ, приÑвоенное набору изменений. Метки могут\n"
+" быть иÑпользованы там, где Mercurial ожидает ID наборов изменений,\n"
+" например, в :hg:`update`. Создание метки фикÑируетÑÑ Ð² иÑтории,\n"
+" поÑтому метки будет автоматичеÑки доÑтупны другим при иÑпользовании\n"
+" pull или push."
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+"ÐžÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip)\n"
+" Ðабор изменений Ñ Ð¼Ð°ÐºÑимальным номером ревизии. Это набор изменений,\n"
+" добавленный в хранилище поÑледним."
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+"ÐžÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (tip) ветки\n"
+" Голова данной ветки Ñ Ð¼Ð°ÐºÑимальным номером ревизии. Когда имÑ\n"
+" ветки иÑпользуетÑÑ Ð² качеÑтве идентификатора ревизии, оно ÑÑылаетÑÑ\n"
+" на оконечную ревизию ветки. См. также 'Голова ветки'. Обратите\n"
+" внимание, что поÑкольку номера ревизий могут различатьÑÑ Ð² разных\n"
+" клонах хранилищ, tip может быть различным в разных клонах."
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+"Обновление\n"
+" (Сущ.) Синоним набора изменений."
+
+msgid " Example: \"I've pushed an update\"."
+msgstr " Пример: \"Я пушнул тебе обновление\"."
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+" (Гл.) Этот термин обычно иÑпользуетÑÑ Ñ‡Ñ‚Ð¾Ð±Ñ‹ опиÑать обновление\n"
+" рабочего каталога до некоторой ревизии. См. :hg:`help update`."
+
+msgid " Example: \"You should update\"."
+msgstr " Пример: \"Тебе надо обновитьÑÑ\"."
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+"Рабочий каталог\n"
+" См. 'Каталог, рабочий'."
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+"Рабочий каталог, родитель\n"
+" См. 'Родитель, рабочего каталога'.\n"
+
+msgid ""
+"Synopsis\n"
+"========"
+msgstr ""
+"Обзор\n"
+"====="
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+"Mercurial иÑпользует файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ``.hgignore`` из корневого каталога\n"
+"хранилища Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ при обнаружении файлов, которые\n"
+"в наÑтоÑщий момент не отÑлеживаютÑÑ."
+
+msgid ""
+"Description\n"
+"==========="
+msgstr ""
+"ОпиÑание\n"
+"========"
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+"Рабочий каталог хранилища чаÑто Ñодержит файлы, которые не должны\n"
+"контролироватьÑÑ Mercurial. Это, например, резервные копии, Ñоздаваемые\n"
+"редакторами, или результаты Ñборки, полученные при компилÑции.\n"
+"Эти файлы могут быть игнорированы, еÑли добавить их в файл ``.hgignore``\n"
+"в корне рабочего каталога. Файл ``.hgignore`` должен быть Ñоздан\n"
+"вручную. Как правило его помещают под контроль верÑий, чтобы наÑтройки\n"
+"могли передаватьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ хранилищами Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ push и pull."
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+"ÐеотÑлеживаемый файл игнорируетÑÑ, еÑли его путь отноÑительно\n"
+"корневого каталога хранилища или Ð»ÑŽÐ±Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ Ñтого пути Ñовпадает\n"
+"Ñ Ð»ÑŽÐ±Ñ‹Ð¼ шаблоном из файла ``.hgignore``."
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+"Ðапример, допуÑтим, что у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ неотÑлеживаемый файл ``file.c``,\n"
+"имеющий путь ``a/b/file.c`` в нашем хранилище. Mercurial будет\n"
+"игнорировать Ñтот файл, любой шаблон из ``.hgignore`` Ñовпадает Ñ\n"
+"``a/b/file.c``, ``a/b`` или ``a``."
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+"Также возможно задать неÑколько таких файлов игнорированиÑ\n"
+"глобально или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² конфиге. Как Ñто Ñделать -\n"
+"Ñм. ключ ``ignore`` Ñекции ``[ui]`` из :hg:`help config`."
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+"Чтобы управлÑÑ‚ÑŒ обработкой файлов, которые находÑÑ‚ÑÑ Ð¿Ð¾Ð´\n"
+"контролем Mercurial, многие команды поддерживают опции ``-I`` и ``-X``;\n"
+"Подробнее Ñм. :hg:`help <команда>` и :hg:`help patterns`."
+
+msgid ""
+"Files that are already tracked are not affected by .hgignore, even\n"
+"if they appear in .hgignore. An untracked file X can be explicitly\n"
+"added with :hg:`add X`, even if X would be excluded by a pattern\n"
+"in .hgignore."
+msgstr ""
+"Содержимое .hgignore не влиÑет на файлы, уже отÑлеживаемые Mercurial,\n"
+"даже еÑли они перечиÑлены в .hgignore. ÐеотÑлеживаемый файл X может быть\n"
+"Ñвно добавлен Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`add X`, даже еÑли X был бы иÑключен шаблоном\n"
+"из .hgignore."
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+"Файл Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ - Ñто проÑтой текÑтовый файл, Ñодержащий ÑпиÑок\n"
+"шаблонов, по одному на Ñтроку. ПуÑтые Ñтроки пропуÑкаютÑÑ. Символ ``#``\n"
+"начинает комментарий, а ``\\`` обозначает управлÑющую поÑледовательноÑÑ‚ÑŒ\n"
+"(ÑÑкейп-Ñимвол, иÑпользуетÑÑ Ð´Ð»Ñ ÑкранированиÑ)."
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+"Mercurial поддерживает неÑколько ÑинтакÑиÑов шаблонов. По умолчанию\n"
+"иÑпользуютÑÑ Ñ€ÐµÐ³ÑƒÐ»Ñрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² Ñтиле Perl/Python."
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr "Чтобы задать другой ÑинтакÑиÑ, иÑпользуйте Ñтроку вида::"
+
+msgid " syntax: NAME"
+msgstr " syntax: ИМЯ"
+
+msgid "where ``NAME`` is one of the following:"
+msgstr "где ``ИМЯ`` одно из:"
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+"``regexp``\n"
+" РегулÑрное выражение, ÑинтакÑÐ¸Ñ Python/Perl.\n"
+"``glob``\n"
+" Глоб (glob), как в командной оболочке (bash и т.п.)."
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+"Выбранный ÑинтакÑÐ¸Ñ Ð´Ð»Ñ Ð²Ñех поÑледующих шаблонов, пока не будет\n"
+"вÑтречена Ñтрока, Ð²ÐºÐ»ÑŽÑ‡Ð°ÑŽÑ‰Ð°Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ ÑинтакÑиÑ."
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+"Шаблоны в любом Ñтиле не привÑзаны к одному корневому каталогу. Шаблон\n"
+"в Ñтиле глоб вида ``*.c`` Ñовпадет Ñ Ð»ÑŽÐ±Ñ‹Ð¼ файлом, оканчивающимÑÑ Ð½Ð°\n"
+"``.c`` в любом каталоге, так же как и шаблон в Ñтиле регулÑрного\n"
+"Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð° ``\\.c$``. Чтобы задать шаблон в Ñтиле regexp\n"
+"отноÑительно корневого каталога, начните его Ñ ``^``."
+
+msgid ""
+".. note::\n"
+" Patterns specified in other than ``.hgignore`` are always rooted.\n"
+" Please see :hg:`help patterns` for details."
+msgstr ""
+".. note::\n"
+" Шаблоны, заданные где угодно, кроме ``.hgignore``, привÑзаны к корневому\n"
+" каталогу. См. также :hg:`help patterns`."
+
+msgid ""
+"Example\n"
+"======="
+msgstr ""
+"Пример\n"
+"======"
+
+msgid "Here is an example ignore file. ::"
+msgstr "Пример файла игнорированиÑ. ::"
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+" # иÑпользовать ÑинтакÑÐ¸Ñ glob.\n"
+" syntax: glob"
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+" # переключить ÑинтакÑÐ¸Ñ Ð½Ð° regexp.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a tree of repositories. In the second case, repository\n"
+"paths and global options can be defined using a dedicated\n"
+"configuration file common to :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` and ``hgweb.fcgi``."
+msgstr ""
+"Ð’Ñтроенный веб-Ñервер Mercurial, hgweb, может обÑлуживать как одно\n"
+"хранилище, так и неÑколько. Ð’ поÑледнем Ñлучае пути хранилищ и\n"
+"глобальные параметры могут быть опеределены в отдельном файле, общем\n"
+"Ð´Ð»Ñ :hg:`serve`, ``hgweb.wsgi``, ``hgweb.cgi`` and ``hgweb.fcgi``."
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files\n"
+"but recognizes only the following sections:"
+msgstr ""
+"Этот файл имеет тот же формат, что и другие файлы конфигурации\n"
+"Mercurial, но обрабатываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñледующие Ñекции:"
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+" - web\n"
+" - paths\n"
+" - collections"
+
+msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgstr "ÐаÑтройки Ñекции ``web`` подробно опиÑаны в :hg:`help config`."
+
+msgid ""
+"The ``paths`` section maps URL paths to paths of repositories in the\n"
+"filesystem. hgweb will not expose the filesystem directly - only\n"
+"Mercurial repositories can be published and only according to the\n"
+"configuration."
+msgstr ""
+"Ð¡ÐµÐºÑ†Ð¸Ñ ``paths`` ÑвÑзывает пути в URL Ñ Ð¿ÑƒÑ‚Ñми хранилищ в файловой\n"
+"ÑиÑтеме. hgweb не выÑтавлÑет наружу файловую ÑиÑтему напрÑмую - \n"
+"публикуютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ хранилища Mercurial и только в ÑоответÑтвии Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³Ð¾Ð¼."
+
+msgid ""
+"The left hand side is the path in the URL. Note that hgweb reserves\n"
+"subpaths like ``rev`` or ``file``, try using different names for\n"
+"nested repositories to avoid confusing effects."
+msgstr ""
+"Ð’ левой чаÑти находитÑÑ Ð¿ÑƒÑ‚ÑŒ в URL. Обратите внимание, что hgweb\n"
+"резервирует такие пути, как ``rev`` или ``file``, иÑпользуйте\n"
+"другие имена Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ… подхранилищ, чтобы избежать неожиданных\n"
+"Ñффектов."
+
+msgid ""
+"The right hand side is the path in the filesystem. If the specified\n"
+"path ends with ``*`` or ``**`` the filesystem will be searched\n"
+"recursively for repositories below that point.\n"
+"With ``*`` it will not recurse into the repositories it finds (except for\n"
+"``.hg/patches``).\n"
+"With ``**`` it will also search inside repository working directories\n"
+"and possibly find subrepositories."
+msgstr ""
+"Ð’ правой чаÑти находитÑÑ Ð¿ÑƒÑ‚ÑŒ в файловой ÑиÑтеме. ЕÑли указанный путь\n"
+"заканчиваетÑÑ Ð½Ð° ``*`` или ``**``, хранилища будут иÑкатьÑÑ Ñ€ÐµÐºÑƒÑ€Ñивно\n"
+"в Ñтом каталоге. При ``*`` поиÑк в подкаталогах хранилищ не ведетÑÑ\n"
+"(за иÑключением ``.hg/patches``). При ``**`` поиÑк производитÑÑ Ñ‚Ð°ÐºÐ¶Ðµ\n"
+"внутри рабочих каталогов хранилищ."
+
+msgid "In this example::"
+msgstr "Ð’ Ñтом примере::"
+
+msgid ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+msgstr ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry will publish every Mercurial repository found in\n"
+" ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``\n"
+" will appear as ``http://server/quux/``\n"
+"- The fourth entry will publish both ``http://server/user/bob/quux/``\n"
+" and ``http://server/user/bob/quux/testsubrepo/``"
+msgstr ""
+"- Первые две Ñтроки позволÑÑŽÑ‚ двум хранилищам из разных каталогов\n"
+" отображатьÑÑ Ð² одном каталоге в веб-интерфейÑе\n"
+"- Ð¢Ñ€ÐµÑ‚ÑŒÑ Ñтрока публикует каждое хранилище Mercurial в каталоге\n"
+" ``/srv/repos/``. Ðапример, хранилище ``/srv/repos/quux/`` будет\n"
+" опубликовано как ``http://server/quux/``\n"
+"- Ð§ÐµÑ‚Ð²ÐµÑ€Ñ‚Ð°Ñ Ñтрока публикует хранилища ``http://server/user/bob/quux/``\n"
+" и ``http://server/user/bob/quux/testsubrepo/``"
+
+msgid ""
+"The ``collections`` section is deprecated and has been superseeded by\n"
+"``paths``.\n"
+msgstr "Ð¡ÐµÐºÑ†Ð¸Ñ ``collections`` уÑтарела и заменена Ñекцией ``paths``.\n"
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr "При ÑлиÑнии файлов Mercurial иÑпользует Ñпециальные инÑтрументы."
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+"Такой инÑтрумент объединÑет две различных верÑии файла в результирующую.\n"
+"ИнÑтрументом ÑлиÑÐ½Ð¸Ñ ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°, которой передаютÑÑ Ð´Ð²Ð° файла\n"
+"и поÑледний общий предок обеих верÑий, так что она может определить,\n"
+"какие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð±Ñ‹Ð»Ð¸ были Ñделаны на каких ветках."
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+"ИнÑтрументы иÑпользуютÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ :hg:`resolve`, :hg:`merge`, :hg:"
+"`update`,\n"
+":hg:`backout` и неÑколькими раÑширениÑми."
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+"Обычно, программы ÑлиÑÐ½Ð¸Ñ Ð¿Ñ‹Ñ‚Ð°ÑŽÑ‚ÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки разрешить конфликты,\n"
+"объединÑÑ Ð½ÐµÐ¿ÐµÑ€ÐµÑекающиеÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, которые были Ñделаны в двух\n"
+"различных ветках иÑтории файла. Более того, некоторые интерактивные\n"
+"инÑтрументы ÑлиÑÐ½Ð¸Ñ Ð¾Ð±Ð»ÐµÐ³Ñ‡Ð°ÑŽÑ‚ ручное разрешение конфликтов, иÑпользуÑ\n"
+"графичеÑкое предÑтавление или вÑтавлÑÑ Ð¾Ñобые маркеры. Mercurial\n"
+"не поÑтавлÑетÑÑ Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼Ð¸ инÑтрументами, полагаÑÑÑŒ на внешние\n"
+"программы."
+
+msgid ""
+"Available merge tools\n"
+"====================="
+msgstr ""
+"ДоÑтупные инÑтрументы ÑлиÑниÑ\n"
+"============================="
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+"Внешние инÑтрументы ÑлиÑÐ½Ð¸Ñ Ð¸ их ÑвойÑтва наÑтраиваютÑÑ Ð² Ñекции\n"
+"merge-tools конфигурационного файла (Ñм :hg:`help config`), но как\n"
+"правило можно проÑто указать Ð¸Ð¼Ñ Ð¸Ñ… иÑполнимого файла."
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+"ИнÑтрумент ÑлиÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ иÑпользоватьÑÑ, еÑли его иÑполнÑемый файл\n"
+"может быть найден ÑиÑтемой, и еÑли он может провеÑти ÑлиÑние.\n"
+"ИÑполнÑемый файл может быть найден, еÑли он доÑтупен по извеÑтным\n"
+"путÑм. ИнÑтрумент может провеÑти ÑлиÑние, еÑли он корректно\n"
+"обрабатывает ÑимволичеÑкие ÑÑылки, в том Ñлучае еÑли файл ÑвлÑетÑÑ\n"
+"ÑимволичеÑкой ÑÑылкой, обрабатывает бинарные файлы, еÑли файл\n"
+"ÑвлÑетÑÑ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼, и еÑли доÑтупна графичеÑÐºÐ°Ñ Ñреда, в Ñлучае,\n"
+"еÑли инÑтрумент требует GUI."
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr "СущеÑтвуют также вÑтроенные инÑтрументы ÑлиÑниÑ:"
+
+msgid ".. internaltoolsmarker"
+msgstr ".. internaltoolsmarker"
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+"Ð’Ñтроенные инÑтрументы доÑтупны вÑегда и не требуют графичеÑкой Ñреды,\n"
+"но они по умолчанию не обрабатывают Ñимвольные ÑÑылки и бинарные\n"
+"файлы."
+
+msgid ""
+"Choosing a merge tool\n"
+"====================="
+msgstr ""
+"Выбор инÑтрумента ÑлиÑниÑ\n"
+"========================="
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr "Mercurial иÑпользует Ñледующие правила при выбора программы ÑлиÑниÑ:"
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+"1. ЕÑли инÑтрумент был задан Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции --tool, то иÑпользуетÑÑ Ð¾Ð½.\n"
+" ЕÑли Ñто Ð¸Ð¼Ñ Ð¸Ð½Ñтрумента из Ñекции merge-tools, иÑпользуютÑÑ\n"
+" наÑтройки оттуда. Ð’ противном Ñлучае, заданный инÑтрумент должен\n"
+" быть пригодным Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка командной оболочкой."
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+"2. ЕÑли Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ ``HGMERGE`` уÑтановлена, иÑпользуетÑÑ\n"
+" ее значение, оно должно быть иÑполнÑемо оболочкой."
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+"3. ЕÑли Ð¸Ð¼Ñ Ñливаемого файла Ñовпадает Ñ Ð»ÑŽÐ±Ñ‹Ð¼ шаблоном из Ñекции\n"
+" merge-patterns, иÑпользуетÑÑ Ð¿ÐµÑ€Ð²Ñ‹Ð¹ ÑоответÑтвующий шаблону\n"
+" инÑтрумент ÑлиÑниÑ. При Ñтом не учитываютÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾Ñти Ñтого\n"
+" инÑтрумента Ð´Ð»Ñ ÑлиÑÐ½Ð¸Ñ Ð´Ð²Ð¾Ð¸Ñ‡Ð½Ñ‹Ñ… файлов."
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+"4. ЕÑли ui.merge уÑтановлен, он раÑÑматриваетÑÑ Ñледующим. ЕÑли значение\n"
+" не ÑвлÑетÑÑ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Ñконфигурированного инÑтрумента, иÑпользуетÑÑ\n"
+" указанное значение, которое должно быть иÑполнимо командной\n"
+" оболочкой. Ð’ противном Ñлучае по возможноÑти иÑпользуетÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹\n"
+" инÑтрумент."
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+"5. ЕÑли в Ñекции merge-tools приÑутÑтвуют любые подходÑщие инÑтрументы\n"
+" ÑлиÑниÑ, иÑпользуетÑÑ Ð¸Ð½Ñтрумент Ñ Ð¼Ð°ÐºÑимальным приоритетом."
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+"6. ЕÑли программа ``hgmerge`` может быть найдена в ÑиÑтеме, она будет\n"
+" иÑпользована, но по умолчанию она не будет иÑпользоватьÑÑ Ð´Ð»Ñ\n"
+" Ñимвольных ÑÑылок и бинарных файлов по умолчанию."
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+"7. ЕÑли Ñливаемый файл не ÑвлÑетÑÑ Ñимвольной ÑÑылкой или бинарным\n"
+" файлом, иÑпользуетÑÑ ``internal:merge``."
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+"8. СлиÑние завершаетÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡ÐµÐ¹ и должно быть завершено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+" resolve перед фикÑацией."
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+".. note::\n"
+" ПоÑле выбора программы ÑлиÑниÑ, Mercurial по умолчанию пытаетÑÑ\n"
+" Ñлить файлы, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¿Ñ€Ð¾Ñтой алгоритм. ИнÑтрумент ÑлиÑÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚\n"
+" запущен, только еÑли Ñто не удаÑÑ‚ÑÑ Ð¸Ð·-за возникших конфликтов.\n"
+" Решение о том, иÑпользовать или нет проÑтой алгоритм ÑлиÑÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚\n"
+" быть проконтролировано наÑтройкой premerge инÑтрумента ÑлиÑниÑ.\n"
+" По умолчанию оно включено и иÑпользуетÑÑ, еÑли Ñливаемый файл\n"
+" не ÑвлÑетÑÑ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼ или Ñимвольной ÑÑылкой."
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+"Подробнее Ñм. Ñекции merge-tools и ui в :hg:`help config` или\n"
+"man hgrc.\n"
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+"ЕÑли Mercurial принимает где-либо более одной ревизии, их можно\n"
+"задавать по одной, либо в виде топологичеÑки непрерывного диапазона, \n"
+"разделенного Ñимволом \":\"."
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+"ЗапиÑÑŒ диапазона ревизий имеет вид [ÐÐЧÐЛО]:[КОÐЕЦ], где ÐÐЧÐЛО и\n"
+"КОÐЕЦ - идентификаторы ревизий. Оба Ñтих идентификатора не обÑзательны.\n"
+"ЕÑли не указан ÐÐЧÐЛО, по умолчанию он ÑчитаетÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ 0. ЕÑли не\n"
+"указан КОÐЕЦ, по умолчанию он ÑчитаетÑÑ Ñ€Ð°Ð²Ð½Ñ‹Ð¼ оконечной ревизии (tip).\n"
+"Таким образом, диапазон \":\" означает \"вÑе ревизии\"."
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+"ЕÑли ÐÐЧÐЛО больше, чем КОÐЕЦ, ревизии обрабатываютÑÑ Ð² обратном порÑдке."
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+"Диапазон интерпретируетÑÑ ÐºÐ°Ðº отрезок, Ñ‚.е. крайние Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑвлÑÑŽÑ‚ÑÑ\n"
+"его чаÑтью. Так, диапазон 3:5 ÑоответÑтвует 3, 4 и 5, а диапазон\n"
+"9:6 дает 9, 8, 7 и 6.\n"
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+"Mercurial понимает неÑколько форм Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или более файла\n"
+"единовременно."
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+"По умолчанию Mercurial интерпретирует имена файлов как Ñто делает\n"
+"ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ° (bash и др.), выполнÑÑ Ð¿Ð¾Ð´Ñтановку шаблонов в\n"
+"Ñтиле glob."
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr "Ð”Ñ€ÑƒÐ³Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð° шаблонов должна указыватьÑÑ Ñвно."
+
+msgid ""
+".. note::\n"
+" Patterns specified in ``.hgignore`` are not rooted. \n"
+" Please see :hg:`help hgignore` for details."
+msgstr ""
+".. note::\n"
+" Шаблоны, заданные в ``.hgignore``, привÑзаны к корневому\n"
+" каталогу. См. :hg:`help hgignore`."
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+"Чтобы иÑпользовать буквальный путь к файлу, в котором не выполнÑÑŽÑ‚ÑÑ\n"
+"подÑтановки, начните его Ñ ``path:``. Такие пути должны полноÑтью\n"
+"Ñовпадать Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ файла отноÑительно ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°."
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+"Чтобы иÑпользовать раÑширенный glob, начните его Ñ ``glob:``. Глобы\n"
+"раÑкрываютÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно текущего каталога; глоб ``*.c`` Ñовпадет\n"
+"только Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸ в текущем каталоге, оканчивающимиÑÑ Ð½Ð° ``.c``."
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+"ПоддерживаетÑÑ Ñ€Ð°Ñширение обычных глобов в виде ``**``, которое\n"
+"Ñовпадает Ñ Ð»ÑŽÐ±Ð¾Ð¹ Ñтрокой в пределах вÑего пути, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸;\n"
+"также поддерживаетÑÑ Ñ„Ð¾Ñ€Ð¼Ð° ``{a,b}``, Ð¾Ð·Ð½Ð°Ñ‡Ð°ÑŽÑ‰Ð°Ñ \"a или b\"."
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+"Чтобы иÑпользовать регулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Perl/Python, начните Ð¸Ð¼Ñ Ñ\n"
+"``re:``. Такие шаблоны раÑкрываютÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ÐºÐ¾Ñ€Ð½Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°."
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+"Можно прочитать шаблоны имен из файла, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ``listfile:`` или\n"
+"``listfile0:``. ПоÑледний ожидает шаблонов, отделенных друг от друга\n"
+"Ñимволом NUL, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº первый предполагает перевод Ñтроки. КаждаÑ\n"
+"Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð¸Ð· файла Ñтрока интерпретируетÑÑ ÐºÐ°Ðº шаблон имени файла."
+
+msgid "Plain examples::"
+msgstr "Примеры буквальных путей::"
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+" path:foo/bar файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ bar в каталоге foo в корне хранилища\n"
+" path:path:name файл или каталог Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \"path:name\""
+
+msgid "Glob examples::"
+msgstr "Примеры глобов::"
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+" glob:*.c любой файл, оканчивающийÑÑ Ð½Ð° \".c\", в текущем каталоге\n"
+" *.c любой файл, оканчивающийÑÑ Ð½Ð° \".c\", в текущем каталоге\n"
+" **.c любой файл, оканчивающийÑÑ Ð½Ð° \".c\", в любом подкаталоге\n"
+" текущего каталога, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐ³Ð¾ Ñамого.\n"
+" foo/*.c любой файл, оканчивающийÑÑ Ð½Ð° \".c\", в каталоге foo\n"
+" foo/**.c любой файл, оканчивающийÑÑ Ð½Ð° \".c\", в любом подкаталоге\n"
+" foo, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐµÐ³Ð¾ Ñамого."
+
+msgid "Regexp examples::"
+msgstr "Примеры regexp::"
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+" re:.*\\.c$ любой файл, оканчивающийÑÑ Ð½Ð° \".c\",\n"
+" находÑщийÑÑ Ð³Ð´Ðµ угодно в хранилище"
+
+msgid "File examples::"
+msgstr "Примеры шаблонов из файлов::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+" listfile:list.txt читать шаблоны из файла list.txt, Ñодержащего\n"
+" под одному шаблону на Ñтроку\n"
+" listfile0:list.txt читать шаблоны из файла list.txt, Ñодержащего\n"
+" шаблоны, разделенные Ñимволом NULL"
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr "См. также :hg:`help filesets`.\n"
+
+msgid ""
+"What are phases?\n"
+"================"
+msgstr ""
+"Что такое фазы?\n"
+"==============="
+
+msgid ""
+"Phases are a system for tracking which changesets have been or should\n"
+"be shared. This helps prevent common mistakes when modifying history\n"
+"(for instance, with the mq or rebase extensions)."
+msgstr ""
+"Фазы - Ñто ÑиÑтема Ð´Ð»Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, какие наборы изменений были\n"
+"или должны быть публично доÑтупны. Это помогает предотвратить чаÑто\n"
+"Ñовершаемые ошибки при изменение иÑтории (например, при помощи раÑширений\n"
+"mq или rebase)."
+
+msgid "Each changeset in a repository is in one of the following phases:"
+msgstr "Каждый набор изменений хранилища находитÑÑ Ð² одной из Ñледующих фаз::"
+
+msgid ""
+" - public : changeset is visible on a public server\n"
+" - draft : changeset is not yet published\n"
+" - secret : changeset should not be pushed, pulled, or cloned"
+msgstr ""
+" - Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ : набор изменений опубликован на общедоÑтупном Ñервере\n"
+" - Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð°Ñ : набор изменений ещё не опубликован\n"
+" - ÑÐµÐºÑ€ÐµÑ‚Ð½Ð°Ñ : он не должен проталкиватьÑÑ, затÑгиватьÑÑ, клонироватьÑÑ"
+
+msgid ""
+"These phases are ordered (public < draft < secret) and no changeset\n"
+"can be in a lower phase than its ancestors. For instance, if a\n"
+"changeset is public, all its ancestors are also public. Lastly,\n"
+"changeset phases should only be changed towards the public phase."
+msgstr ""
+"Фазы раÑположены в Ñледующем порÑдке: Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ < Ñ‡ÐµÑ€Ð½Ð¾Ð²Ð°Ñ < ÑекретнаÑ,\n"
+"при Ñтом набор изменений не может находитÑÑ Ð² фазе, меньшей фазы его\n"
+"предков. Ðапример, еÑли набор изменений находитÑÑ Ð² публичной фазе,\n"
+"то и вÑе его родительÑкие ревизии будут в публичной фазе. Ðаконец, фазы\n"
+"набора изменений Ñледует менÑÑ‚ÑŒ только в Ñторону пулбичной фазы."
+
+msgid ""
+"How are phases managed?\n"
+"======================="
+msgstr ""
+"Как проиÑходит работа Ñ Ñ„Ð°Ð·Ð°Ð¼Ð¸?\n"
+"==============================="
+
+msgid ""
+"For the most part, phases should work transparently. By default, a\n"
+"changeset is created in the draft phase and is moved into the public\n"
+"phase when it is pushed to another repository."
+msgstr ""
+"Как правило работа Ñ Ñ„Ð°Ð·Ð°Ð¼Ð¸ прозрачна Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ. По умолчанию\n"
+"набор изменений ÑоздаетÑÑ Ð² черновой фазе и перемещаетÑÑ Ð² публичную фазу\n"
+"при проталкивании в другое хранилище."
+
+msgid ""
+"Once changesets become public, extensions like mq and rebase will\n"
+"refuse to operate on them to prevent creating duplicate changesets.\n"
+"Phases can also be manually manipulated with the :hg:`phase` command\n"
+"if needed. See :hg:`help -v phase` for examples."
+msgstr ""
+"ПоÑле того, как набор изменений Ñтал публичным, раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð²Ñ€Ð¾Ð´Ðµ mq или\n"
+"rebase откажутÑÑ Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ Ñ Ð½Ð¸Ð¼, чтобы предотвратить Ñоздание дублирующихÑÑ\n"
+"наборов изменений. При необходимоÑти фазами можно также манипулировать\n"
+"вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды :hg:`phase`."
+
+msgid ""
+"Phases and servers\n"
+"=================="
+msgstr ""
+"Фазы и Ñерверы\n"
+"=============="
+
+msgid "Normally, all servers are ``publishing`` by default. This means::"
+msgstr "Как правило, вÑе Ñерверы по умолчанию ``публичные``. Это означает::"
+
+msgid ""
+" - all draft changesets that are pulled or cloned appear in phase\n"
+" public on the client"
+msgstr ""
+" - вÑе черновые наборы изменений, которые затÑгиваютÑÑ Ð¸Ð»Ð¸ клонируютÑÑ,\n"
+" имеют публичную фазу на Ñтороне клиента"
+
+msgid ""
+" - all draft changesets that are pushed appear as public on both\n"
+" client and server"
+msgstr ""
+" - вÑе проталкиваемые черновые наборы изменений ÑтановÑÑ‚ÑÑ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸\n"
+" как на клиенте, так и на Ñервере"
+
+msgid " - secret changesets are neither pushed, pulled, or cloned"
+msgstr ""
+" - Ñекретные наборы изменений не проталкиваютÑÑ, не затÑгиваютÑÑ\n"
+" и не клонируютÑÑ"
+
+msgid ""
+".. note::\n"
+" Pulling a draft changeset from a publishing server does not mark it\n"
+" as public on the server side due to the read-only nature of pull."
+msgstr ""
+".. note::\n"
+" ЗатÑгивание чернового набора изменений из ``публичного`` Ñервера не\n"
+" Ñделает Ñтот набор публичным на Ñервере, Ñ‚.к. команда pull выполнÑетÑÑ\n"
+" в режиме ``только чтение``."
+
+msgid ""
+"Sometimes it may be desirable to push and pull changesets in the draft\n"
+"phase to share unfinished work. This can be done by setting a\n"
+"repository to disable publishing in its configuration file::"
+msgstr ""
+"Иногда может потребоватьÑÑ Ð¿Ñ€Ð¾Ñ‚Ð°Ð»ÐºÐ¸Ð²Ð°Ñ‚ÑŒ и затÑгивать наборы изменений\n"
+"в черновой фазе, чтобы поделитьÑÑ Ð½ÐµÐ¾ÐºÐ¾Ð½Ñ‡ÐµÐ½Ð½Ð¾Ð¹ работой. Это может быть\n"
+"реализовано путем Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ``публичноÑти`` в файле конфигурации::"
+
+msgid ""
+" [phases]\n"
+" publish = False"
+msgstr ""
+" [phases]\n"
+" publish = False"
+
+msgid "See :hg:`help config` for more information on config files."
+msgstr "См. :hg:`help config` — Ñправку по файлам конфигурации."
+
+msgid ""
+".. note::\n"
+" Servers running older versions of Mercurial are treated as\n"
+" publishing."
+msgstr ""
+".. note::\n"
+" Серверы, работающие Ñо Ñтарыми верÑиÑми Mercurial, ÑчитаютÑÑ\n"
+" публичными."
+
+msgid ""
+"Examples\n"
+"========"
+msgstr ""
+"Примеры\n"
+"======="
+
+msgid " - list changesets in draft or secret phase::"
+msgstr " - перечиÑлить наборы изменений в черновой или Ñекретной фазе::"
+
+msgid " hg log -r \"not public()\""
+msgstr " hg log -r \"not public()\""
+
+msgid " - change all secret changesets to draft::"
+msgstr " - уÑтановить вÑе Ñекретные наборы изменений в черновую фазу::"
+
+msgid " hg phase --draft \"secret()\""
+msgstr " hg phase --draft \"secret()\""
+
+msgid ""
+" - forcibly move the current changeset and descendants from public to draft::"
+msgstr ""
+" - принудительно перемеÑтить текущий набор изменений и потомков из публичной "
+"фазы в черновую::"
+
+msgid " hg phase --force --draft ."
+msgstr " hg phase --force --draft ."
+
+msgid " - show a list of changeset revision and phase::"
+msgstr " - показать ÑпиÑок из номера ревизий и фазы::"
+
+msgid " hg log --template \"{rev} {phase}\\n\""
+msgstr " hg log --template \"{rev} {phase}\\n\""
+
+msgid " - resynchronize draft changesets relative to a remote repository::"
+msgstr ""
+" - Ñинхронизировать черновые ревизии отноÑительно отдаленного хранилища::"
+
+msgid " hg phase -fd 'outgoing(URL)' "
+msgstr " hg phase -fd 'outgoing(URL)' "
+
+msgid ""
+"See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr "См. :hg:`help phase` — о том, как изменÑÑ‚ÑŒ фазы вручную.\n"
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr "Mercurial поддерживает неÑколько ÑпоÑобов Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ñ‹Ñ… ревизий."
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+"ПроÑтое целое чиÑло интерпретируетÑÑ ÐºÐ°Ðº номер ревизии. Отрицательные\n"
+"целые чиÑла интерпретируютÑÑ ÐºÐ°Ðº непрерывное Ñмещение отноÑительно\n"
+"оконечной ревизии (tip). Так, -1 означает tip, -2 означает ревизию,\n"
+"предшеÑтвующую tip и Ñ‚.д."
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+"ШеÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока из 40 Ñимволов ÑчитаетÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼\n"
+"идентификатором (ID) ревизии."
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+"ШеÑÑ‚Ð½Ð°Ð´Ñ†Ð°Ñ‚ÐµÑ€Ð¸Ñ‡Ð½Ð°Ñ Ñтрока короче 40 Ñимволов ÑчитаетÑÑ Ñокращенной\n"
+"формой уникального идентификатора ревизии. Такой идентификатор\n"
+"ÑвлÑетÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼, только еÑли он ÑвлÑетÑÑ Ñтаршей чаÑтью\n"
+"ровно одного полного ID ревизии."
+
+msgid ""
+"Any other string is treated as a bookmark, tag, or branch name. A\n"
+"bookmark is a movable pointer to a revision. A tag is a permanent name\n"
+"associated with a revision. A branch name denotes the tipmost revision\n"
+"of that branch. Bookmark, tag, and branch names must not contain the \":\"\n"
+"character."
+msgstr ""
+"Ð›ÑŽÐ±Ð°Ñ Ð´Ñ€ÑƒÐ³Ð°Ñ Ñтрока интерпретируетÑÑ ÐºÐ°Ðº Ð¸Ð¼Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ¸, ветки или метки.\n"
+"Закладка - Ñто автоматичеÑки передвигаемый указатель на ревизию.\n"
+"Метка - поÑтоÑнное имÑ, аÑÑоциированное Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ ревизией.\n"
+"Ð˜Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ означает поÑледнюю ревизию на Ñтой ветки. Имена ветки, метки или\n"
+"закладки не должны Ñодержать Ñимвола \":\"."
+
+msgid "The reserved name \"tip\" always identifies the most recent revision."
+msgstr ""
+"Зарезервированное Ð¸Ð¼Ñ \"tip\" вÑегда вÑегда ÑÑылаетÑÑ Ð½Ð° Ñамую поÑледнюю "
+"ревизию."
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+"Зарезервированное Ð¸Ð¼Ñ \"null\" означает пуÑтую ревизию. Это ревизиÑ\n"
+"пуÑтого хранилища или родитель ревизии 0."
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+"Зарезервированное Ð¸Ð¼Ñ \".\" означает Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога.\n"
+"ЕÑли рабочий каталог не извлечен, оно Ñквивалентно null. ЕÑли в\n"
+"рабочем каталоге находитÑÑ Ð½ÐµÐ·Ð°Ñ„Ð¸ÐºÑированный результат ÑлиÑниÑ, \".\"\n"
+"означает первого родителÑ.\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+"Mercurial поддерживает функциональный Ñзык Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтва\n"
+"ревизий."
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+"Язык поддерживает неÑколько предикатов, которые объединÑÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+"инфикÑных операторов. Ð”Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ можно иÑпользовать круглые Ñкобки."
+
+msgid ""
+"Identifiers such as branch names may need quoting with single or\n"
+"double quotes if they contain characters like ``-`` or if they match\n"
+"one of the predefined predicates."
+msgstr ""
+"Различные идентификаторы, такие как имена веток, могут заключатьÑÑ Ð²\n"
+"одинарные или двойные кавычки, оÑобенно еÑли они Ñодержат такие Ñимволы\n"
+"как ``-``, или еÑли их имена Ñовпадают Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ одного из предопределенных\n"
+"предикатов."
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+"``not x``\n"
+" Ðаборы изменений, не входÑщие в Ñ…. ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: ``! x``."
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+"``x::y``\n"
+" Диапазон на графе ревизий, означающий вÑе ревизии, ÑвлÑющиеÑÑ\n"
+" предками y и потомками x, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ x и y. ЕÑли Ð¿ÐµÑ€Ð²Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ\n"
+" опущена, Ñто Ñквивалентно ``ancestors(y)``, еÑли Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ\n"
+" опущена, Ñто Ñквивалентно ``descendants(x)``."
+
+msgid " An alternative syntax is ``x..y``."
+msgstr " ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: ``x..y``."
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+"``x:y``\n"
+" Ð’Ñе ревизии Ñ Ð½Ð¾Ð¼ÐµÑ€Ð°Ð¼Ð¸ от x до y, включительно. Обе могут быть\n"
+" опущены, по умолчанию ÑчитаютÑÑ 0 и tip ÑоответÑтвенно."
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+"``x and y``\n"
+" ПереÑечение множеÑтв ревизий x и y. ÐšÑ€Ð°Ñ‚ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°: ``x & y``."
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+"``x or y``\n"
+" Объединение множеÑтв ревизий x и y. Возможны две краткие формы:\n"
+" ``x | y`` и ``x + y``."
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+"``x - y``\n"
+" Ревизии, входÑщие в x, но не в y."
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+"``x^n``\n"
+" n-ый родитель x, где n == 0, 1 или 2.\n"
+" ЕÑли n == 0, ÑоответÑтвует x; еÑли n == 1, то ÑоответÑтвует первому\n"
+" родителю каждой ревизии из x; еÑли n == 2 — второму родителю."
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+"``x~n``\n"
+" n-ый первый предок x; ``x~0`` ÑоответÑтвует x; ``x~3`` - ``x^^^``."
+
+msgid "There is a single postfix operator:"
+msgstr "СущеÑтвует единÑтвенный поÑтфикÑный оператор:"
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+"``x^``\n"
+" То же, что ``x^1`` - первый родитель каждой ревизии из x."
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+"\n"
+"ПоддерживаютÑÑ Ñледующие предикаты:"
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+"Можно определить новые предикаты (извеÑтные как пÑевдонимы или \"алиаÑÑ‹\"),\n"
+"иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð»ÑŽÐ±Ñ‹Ðµ комбинации ÑущеÑтвующих предикатов или пÑевдонимов.\n"
+"Определение пÑевдонима имеет вид::"
+
+msgid " <alias> = <definition>"
+msgstr " <пÑевдоним> = <определение>"
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+"в Ñекции ``revsetalias`` конфига Mercurial. Ðргументы вида `$1`, `$2`\n"
+"и Ñ‚.д. передаютÑÑ Ð¸Ð· пÑевдонима в его определение."
+
+msgid "For example,"
+msgstr "Ðапример,"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+"определÑет три пÑевдонима, ``h``, ``d`` и ``rs``. ``rs(0:tip, автор)`` -\n"
+"Ñто ровно то же Ñамое, что ``reverse(sort(0:tip, автор))``."
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr "Ðналоги командной Ñтроки Ð´Ð»Ñ :hg:`log`::"
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+
+msgid "- Changesets on the default branch::"
+msgstr "- Ревизии на ветке default::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr " hg log -r \"branch(default)\""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+"- Ревизии на ветке default, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð¼ÐµÑ‚ÐºÐ¸ 1.5, не Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¸\n"
+" ÑлиÑниÑ::"
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr " hg log -r \"branch(default) and 1.5:: and not merge()\""
+
+msgid "- Open branch heads::"
+msgstr "- Головы открытых веток::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr " hg log -r \"head() and not closed()\""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+"- Ревизии между метками 1.3 и 1.5, Ñодержащие в опиÑании Ñлово \"bug\",\n"
+" в которых были изменены файлы ``hgext/*``::"
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr ""
+"- Ревизии, зафикÑированные в мае 2008, отÑортированные по пользователю::"
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr " hg log -r \"sort(date('May 2008'), user)\""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+"- Ðаборы изменений, Ñодержащие в опиÑании Ñлова \"bug\" или \"issue\",\n"
+" и не входÑщие в помеченный релиз::"
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+"Подхранилища позволÑÑŽÑ‚ вложить неÑколько внешних хранилищ или проектов\n"
+"в родительÑкое хранилище Mercurial и выполнÑÑ‚ÑŒ над ними команды как над\n"
+"единой группой."
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÑŽÑ‚ÑÑ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° Mercurial, Git\n"
+"и Subversion."
+
+msgid "Subrepositories are made of three components:"
+msgstr "Подхранилища включают три компонента:"
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+"1. Извлеченные рабочие копии вложенных хранилищ. Они могут\n"
+" находитÑÑ Ð³Ð´Ðµ угодно в рабочем каталоге."
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+" should be placed in the root of working directory, and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+"2. СÑылки на вложенные хранилища. Они определÑÑŽÑ‚ÑÑ Ð² файле ``.hgsub``,\n"
+" который должен находитьÑÑ Ð² корне рабочего каталога, и опиÑывают,\n"
+" откуда были извлечены копии подхранилищ.\n"
+" Подхранилища имеют такие пути:"
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr " path/to/nested = https://example.com/nested/repo/path"
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr " ПоддерживаютÑÑ Ñ‚Ð°ÐºÐ¶Ðµ подхранилища Git и Subversion:"
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+" где ``path/to/nested`` - путь к извлеченной рабочей копии отноÑительно\n"
+" ÐºÐ¾Ñ€Ð½Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого хранилища Mercurial, а \n"
+" ``https://example.com/nested/repo/path`` - путь к хранилищу-\n"
+" иÑточнику. ИÑточник может быть также путем в файловой ÑиÑтеме."
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+" Обратите внимание, что ``.hgsub`` по умолчанию не ÑущеÑтвует\n"
+" в хранилищах Mercurial, вам надо Ñоздать его и добавить\n"
+" в родительÑкое хранилище перед иÑпользованием подхранилищ."
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+" is placed in the root of working directory, and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+"3. СоÑтоÑÐ½Ð¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ… хранилищ. Они определÑÑŽÑ‚ÑÑ Ð² файле ``.hgsubstate``,\n"
+" который должен находитьÑÑ Ð² корне рабочего каталога,\n"
+" и Ñодержат информацию, необходимую Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ³Ð¾ воÑÑтановлениÑ\n"
+" подхранилищ до ÑоÑтоÑниÑ, в котором они были зафикÑированы в\n"
+" родительÑкое хранилище. Mercurial запиÑывает ÑоÑтоÑÐ½Ð¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñ‹Ñ…\n"
+" хранилищ автоматичеÑки при фикÑации родительÑкого хранилища."
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+" .. note::\n"
+" Файл ``.hgsubstate`` не Ñледует редактировать вручную."
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"======================"
+msgstr ""
+"\n"
+"Добавление подхранилища\n"
+"======================="
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+"ЕÑли файл ``.hgsub`` не ÑущеÑтвует, Ñоздайте его и добавьте в\n"
+"родительÑкое хранилище. Клонируйте или извлеките внешние проекты\n"
+"в каталог, в котором они будут размещатьÑÑ Ð² родительÑком хранилище.\n"
+"Отредактируйте файл ``.hgsub``, добавив туда запиÑÑŒ Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°\n"
+"как опиÑано выше. ÐÐ°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñтого момента, Ñто подхранилище\n"
+"контролируетÑÑ Mercurial, и при Ñледующей фикÑации в файле ``.hgsubstate``\n"
+"будет зафикÑировано его ÑоÑтоÑние и выполнена привÑзка к нему\n"
+"зафикÑированного набора изменений."
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"============================="
+msgstr ""
+"Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð°\n"
+"=========================="
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+"Подхранилища не отÑлеживают автоматичеÑки Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² их иÑточниках.\n"
+"ВмеÑто Ñтого они обновлÑÑŽÑ‚ÑÑ Ð´Ð¾ ревизии, ÑоответÑтвующей ревизии,\n"
+"извлеченной уровнем выше. Это Ñделано Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы разработчики\n"
+"вÑегда имели целоÑтный набор кода и библиотек, когда они обновлÑÑŽÑ‚ÑÑ."
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+"Таким образом, обновление подхранилища необходимо выполнÑÑ‚ÑŒ вручную.\n"
+"ПроÑто извлеките желаемую ревизию подхранилища, протеÑтируйте ее\n"
+"в родительÑком хранилище и выполните commit в родительÑком\n"
+"хранилище, чтобы зафикÑировать новую комбинацию."
+
+msgid ""
+"Deleting a Subrepository\n"
+"========================"
+msgstr ""
+"Удаление подхранилища\n"
+"====================="
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+"Чтобы удалить подхранилище из родительÑкого хранилища, удалите\n"
+"ÑÑылку на него из файла ``.hgsub``, поÑле чего удалите его файлы."
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"==================================="
+msgstr ""
+"ВзаимодейÑтвие Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ Mercurial\n"
+"===================================="
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. However, if you specify the full path of a file in a\n"
+" subrepo, it will be added even without -S/--subrepos specified.\n"
+" Git and Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":add: не обрабатывает подхранилища рекурÑивно, еÑли не указан ключ\n"
+" -S/--subrepos. Однако, еÑли вы укажете полный путь к файлу из\n"
+" подхранилища, он будет добавлен даже без -S/--subrepos.\n"
+" Подхранилища Git и Subversion в наÑтоÑщий момент молча игнорируютÑÑ."
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+":archive: archive не обрабатывает подхранилища рекурÑивно, еÑли\n"
+" не указана Ð¾Ð¿Ñ†Ð¸Ñ -S/--subrepos."
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+":commit: commit Ñоздает целоÑтный Ñнимок ÑоÑтоÑÐ½Ð¸Ñ Ð²Ñего проекта и\n"
+" его подхранилищ. ЕÑли Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ одно подхранилище было изменено,\n"
+" выполнение прерываетÑÑ. Можно заÑтавить Mercurial вмеÑто Ñтого\n"
+" фикÑировать вÑе измененные подхранилища Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -S/--subrepos\n"
+" или наÑтройкой \"ui.commitsubrepos=True\" в конфиге (Ñм.\n"
+" :hg:`help config`). ПоÑле того, как измененных подхранилищ\n"
+" не оÑталоÑÑŒ, их ÑоÑтоÑние запиÑываетÑÑ Ð¸ фикÑируетÑÑ Ð² оÑновном\n"
+" хранилище."
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":diff: diff не обрабатывает подхранилища рекурÑивно, еÑли не указана\n"
+" Ð¾Ð¿Ñ†Ð¸Ñ -S/--subrepos. Ð Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÑŽÑ‚ÑÑ ÐºÐ°Ðº обычно Ð´Ð»Ñ Ñлементов\n"
+" подхранилищ. Хранилища Subversion в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð»Ñ‡Ð°\n"
+" игнорируютÑÑ."
+
+msgid ""
+":forget: forget currently only handles exact file matches in subrepos.\n"
+" Git and Subversion subrepositories are currently silently ignored."
+msgstr ""
+":forget: forget в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÐµÑ‚ только точные ÑовпадениÑ\n"
+" имен файлов в подхранилищах. Хранилища Subversion в наÑтоÑщее времÑ\n"
+" молча игнорируютÑÑ."
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":incoming: incoming не обрабатывает подхранилища рекурÑивно, еÑли\n"
+" не указан параметр -S/--subrepos. Подхранилища Subversion в\n"
+" наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð»Ñ‡Ð° игнорируютÑÑ."
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+":outgoing: outgoing не обрабатывает подхранилища рекурÑивно, еÑли\n"
+" не указан параметр -S/--subrepos. Подхранилища Subversion в\n"
+" наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð»Ñ‡Ð° игнорируютÑÑ."
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+":pull: pull не обрабатывает подхранилища рекурÑивно, Ñ‚.к. до\n"
+" Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ :hg:`update` не ÑÑно, что затÑгивать. ПеречиÑление и\n"
+" передача изменений во вÑех подхранилищах, на которые ÑÑылаютÑÑ\n"
+" затÑнутые ревизии родительÑкого хранилища в лучшем Ñлучае\n"
+" дорого, либо вообще невозможно в Ñлучае Ñ Subversion."
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+":push: Mercurial автоматичеÑки выполнÑет push Ñначала Ð´Ð»Ñ Ð²Ñех подхранилищ\n"
+" при выполнении push Ð´Ð»Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого хранилища. Это позволÑет\n"
+" быть уверенным, что новые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² подхранилищах будут доÑтупны,\n"
+" когда на них ÑÑылаютÑÑ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° уровнем выше. Push не делает ничего\n"
+" Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰ Subversion."
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+":status: status по умолчанию не обрабатывает подхранилища рекурÑивно,\n"
+" еÑли не указан -S/--subrepos. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² подхранилищах\n"
+" отображаютÑÑ ÐºÐ°Ðº обычные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñлементах подхранилища.\n"
+" Хранилища Subversion в наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð»Ñ‡Ð° игнорируютÑÑ."
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+":update: update воÑÑтанавливает подхранилища до ÑоÑтоÑниÑ,\n"
+" в котором они были зафикÑированы в целевой ревизии. ЕÑли\n"
+" запиÑÐ°Ð½Ð½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупна, Mercurial Ñначала затÑнет\n"
+" ее до обновлениÑ. Это значит, что обновление может потребовать\n"
+" доÑтупа к Ñети при иÑпользовании подхранилищ."
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"================================="
+msgstr ""
+"Переназначение иÑточников подхранилищ\n"
+"====================================="
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+"МеÑтоположение иÑточников подхранилищ может менÑÑ‚ÑŒÑÑ Ð² течение\n"
+"жизни проекта, Ð´ÐµÐ»Ð°Ñ ÑÑылки, хранÑщиеÑÑ Ð² иÑтории родительÑкого\n"
+"хранилища, некорректными. Чтобы иÑправить Ñто, можно определить\n"
+"правила Ð¿ÐµÑ€ÐµÐ½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² файле ``hgrc`` родительÑкого хранилища\n"
+"или в конфиге Mercurial. Подробнее Ñм. Ñекцию ``[subpaths]``."
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+"Mercurial позволÑет вам наÑтраивать вывод команд Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ шаблонов.\n"
+"Ð’Ñ‹ можете передать шаблон через командную Ñтроку Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции\n"
+"--template, либо выбрать ÑущеÑтвующий шаблонный Ñтиль (--style)."
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+"Можно наÑтроить вывод Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ команды, похожей на log: log,\n"
+"outgoing, incoming, tip, parents, heads и glog."
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+"С Mercurial поÑтавлÑÑŽÑ‚ÑÑ Ñ‡ÐµÑ‚Ñ‹Ñ€Ðµ ÑтилÑ: Ñтиль по умолчанию (иÑпользуетÑÑ,\n"
+"когда другой Ñтиль Ñвно не указан), compact, changelog и xml.\n"
+"ИÑпользование::"
+
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+"Шаблон - Ñто текÑÑ‚ Ñ Ñ€Ð°Ð·Ð¼ÐµÑ‚ÐºÐ¾Ð¹, позволÑющей выполнÑÑ‚ÑŒ подÑтановку\n"
+"переменных::"
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+"Строки в фигурных Ñкобках называютÑÑ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ð¼Ð¸ Ñловами. Ключевые\n"
+"Ñлова доÑтупны в завиÑимоÑти от контекÑта, в котором применÑетÑÑ\n"
+"шаблон. Эти ключевые Ñлова как правило доÑтупны в шаблонах длÑ\n"
+"команд, похожих на log:"
+
+msgid ".. keywordsmarker"
+msgstr ".. keywordsmarker"
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+"Ключевое Ñлово \"date\" не Ñоздает читаемого вывода. ЕÑли вы хотите\n"
+"иÑпользовать дату в выходном текÑте, можно иÑпользовать Ð´Ð»Ñ Ñтого\n"
+"фильтр. Фильтры - Ñто функции, которые возвращают Ñтроку, оÑнованную\n"
+"на входной переменной. УбедитеÑÑŒ, что Ñначала иÑпользуетÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€,\n"
+"преобразующий входные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтроки, еÑли вы хотите применить\n"
+"фильтр, принимающий на вход Ñтроку, к входной переменной типа ÑпиÑок.\n"
+"Можно также иÑпользовать цепочку фильтров Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð³Ð¾\n"
+"результата::"
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+msgid "List of filters:"
+msgstr "СпиÑок фильтров (вход, опиÑание):"
+
+msgid ".. filtersmarker\n"
+msgstr ".. filtersmarker\n"
+
+msgid "Valid URLs are of the form::"
+msgstr "Возможные Ñледующие формы URL::"
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+" путь/к/локальному/файлу[#ревизиÑ]\n"
+" file://путь/к/локальному/файлу[#ревизиÑ]\n"
+" http://[пользователь[:пароль]@]хоÑÑ‚[:порт]/[путь][#ревизиÑ]\n"
+" https://[пользователь[:пароль]@]хоÑÑ‚[:порт]/[путь][#ревизиÑ]\n"
+" ssh://[пользователь@]хоÑÑ‚[:порт]/[путь][#ревизиÑ]"
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+"Пути в локальной файловой ÑиÑтеме могут указывать на хранилища\n"
+"Mercurial или на файлы комплектов (bundle) (Ñозданных Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ\n"
+":hg:`bundle` или :hg:`incoming --bundle`). См. также :hg:`help paths`."
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+"ÐеобÑзательный идентификатор поÑле # указывает конкретную ветку, метку\n"
+"или набор изменений, которую Ñледует иÑпользовать из отдалённого\n"
+"хранилища. См. также :hg:`help revisions`."
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+"Ðекоторые функции, такие как выполнение push по URL вида http://\n"
+"и https://, доÑтупны только еÑли Ñти функции Ñвно включены на отдалённом\n"
+"Ñервере Mercurial."
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+"Обратите внимание, что безопаÑноÑÑ‚ÑŒ работы Ñ URL HTTPS завиÑит от\n"
+"правильных наÑтроек в web.cacerts."
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr "Ð—Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñительно иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Mercurial по SSH:"
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+"- SSH требует доÑтупного пользовательÑкого аккаунта на отдалённой\n"
+" машине и доÑтупного иÑполнÑемого файла Mercurial (hg) по извеÑтным\n"
+" на отдалённой машине путÑм, либо заданного через remotecmd.\n"
+"- пути по умолчанию задаютÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно домашнего каталога отдалённого\n"
+" пользователÑ. ИÑпользуйте дополнительный ÑлÑш в начале пути, чтобы\n"
+" задать абÑолютный путь::"
+
+msgid " ssh://example.com//tmp/repository"
+msgstr " ssh://example.com//tmp/repository"
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+"- Mercurial не иÑпользует вÑтроенное Ñжатие при работе по SSH; будет\n"
+" правильным наÑтроить его в вашем ~/.ssh/config, например::"
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+" Ð’ качеÑтве альтернативы можно указать \"ssh -C\" в качеÑтве\n"
+" вашей команды ssh в конфиге или и Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции командной\n"
+" Ñтроки --ssh."
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+"Ð’Ñе Ñти URL могут хранитьÑÑ Ð² вашем конфигурационном файле вмеÑте Ñ\n"
+"краткими пÑевдонимами путей в Ñекции [path]::"
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+" [paths]\n"
+" пÑевдоним1 = URL1\n"
+" пÑевдоним2 = URL2\n"
+" ..."
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+"Эти пÑевдонимы можно иÑпользовать в любой команде, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ‚\n"
+"URL (например, :hg:`pull пÑевдоним1` означает то же, что и\n"
+":hg:`pull URL1`)."
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+"Два пÑевдонима путей ÑвлÑÑŽÑ‚ÑÑ Ð¾Ñобыми, Ñ‚.е. они иÑпользуютÑÑ Ð¿Ð¾\n"
+"умолчанию, еÑли URL не указан при вызове команды:"
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+"default:\n"
+" Когда вы Ñоздаете хранилище Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ hg clone, команда clone\n"
+" ÑохранÑет Ð°Ð´Ñ€ÐµÑ Ð¸Ñточника в качеÑтве пути 'default' Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾\n"
+" хранилища. Он иÑпользуетÑÑ, еÑли вы опуÑкаете путь в командах\n"
+" вроде push и pull (т.ч. incoming и outgoing)."
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+"default-push:\n"
+" Команда push Ñначала ищет путь Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ `default-push` и предпочтет\n"
+" иÑпользовать его вмеÑто 'default', еÑли оба определены.\n"
+
+msgid "remote branch lookup not supported"
+msgstr "отдалённый Ñервер не поддерживает обзор Ñвоих веток"
+
+msgid "dirstate branch not accessible"
+msgstr "нет доÑтупа к ветке рабочего каталога"
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° '%s'"
+
+msgid "can only share local repositories"
+msgstr "ÑовмеÑтный доÑтуп поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ñ… хранилищ"
+
+msgid "destination already exists"
+msgstr "путь Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑƒÐ¶Ðµ ÑущеÑтвует"
+
+msgid "updating working directory\n"
+msgstr "обновлÑем рабочий каталог\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "каталог назначениÑ: %s\n"
+
+msgid "empty destination path is not valid"
+msgstr "пуÑтой путь Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтим"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "путь Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ '%s' уже ÑущеÑтвует"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "назначение '%s' не пуÑто"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+"хранилище-иÑточник не поддерживает поиÑк ревизий, так что невозможно\n"
+"и клонирование по ревизии."
+
+msgid "clone from remote to remote not supported"
+msgstr "клонирование Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¹ машины на отдаленную не поддерживаетÑÑ"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "обновлÑемÑÑ Ð½Ð° ветку %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr "%d файлов обновлено, %d Ñлито, %d удалено, %d c конфликтами\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+"иÑпользуйте 'hg resolve' чтобы повторить попытку ÑлиÑÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚ÑƒÑŽÑ‰Ð¸Ñ… "
+"файлов\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+"иÑпользуйте 'hg resolve' чтобы повторить попытку ÑлиÑÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð»Ð¸ÐºÑ‚ÑƒÑŽÑ‰Ð¸Ñ… "
+"файлов, или 'hg update -C .' чтобы вернуть вÑÑ‘ в иÑходное ÑоÑтоÑние\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(ÑлиÑние веток, не забудьте зафикÑировать)\n"
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "файл конфигурации %s не найден!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "ошибка Ñ‡Ñ‚ÐµÐ½Ð¸Ñ %s/.hg/hgrc: %s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr "ошибка доÑтупа к хранилищу по адреÑу %s\n"
+
+msgid "SSL support is unavailable"
+msgstr "поддержка SSL недоÑтупна"
+
+msgid "IPv6 is not available on this system"
+msgstr "IPv6 недоÑтупен в данной ÑиÑтеме"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "не удаетÑÑ Ð·Ð°Ð¿ÑƒÑтить Ñервер по адреÑу '%s:%d': %s"
+
+#, python-format
+msgid "(binary file %s, hash: %s)"
+msgstr "(бинарный файл %s, Ñ…Ñш: %s)"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr " %d файлов изменено, %d вÑтавок(+), %d удалений(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr "вызов хука %s: %s\n"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr "некорректный хук %s (\"%s\" отÑутÑтвует в модуле)"
+
+msgid "exception from first failed import attempt:\n"
+msgstr "иÑключение при первой неудачной попытке импорта:\n"
+
+msgid "exception from second failed import attempt:\n"
+msgstr "иÑключение при второй неудачной попытке импорта:\n"
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr "плохой хук %s (не удалоÑÑŒ импортировать \"%s\")"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr "плохой хук %s (\"%s\" не определен)"
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr "плохой хук %s (Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"%s\" невызываема)"
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr "ошибка: хук %s завершилÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡ÐµÐ¹: %s\n"
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr "ошибка: иÑключение в хуке %s: %s\n"
+
+#, python-format
+msgid "%s hook failed"
+msgstr "хук %s завершилÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡ÐµÐ¹"
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr "внимание: хук %s завершилÑÑ Ð½ÐµÑƒÐ´Ð°Ñ‡ÐµÐ¹\n"
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr "запуÑк хука %s: %s\n"
+
+# maybe description should be in braÑkets?
+#, python-format
+msgid "%s hook %s"
+msgstr "хук %s %s"
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr "внимание: хук %s %s\n"
+
+#, python-format
+msgid "loading %s hook failed:\n"
+msgstr "не удалоÑÑŒ загрузить хука %s:\n"
+
+msgid "kb"
+msgstr "Кб"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "игнорируетÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ ключ Ñекции [auth] '%s'\n"
+
+msgid "connection ended unexpectedly"
+msgstr "Ñоединение неожиданно прервано"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "неподдерживаемый Ñлемент URL: \"%s\""
+
+msgid "operation not supported over http"
+msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ поддерживаетÑÑ Ð¿Ð¾ http"
+
+msgid "authorization failed"
+msgstr "ошибка авторизации"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "ошибка http, возможно Ð²Ñ‹Ð·Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройками прокÑи"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "реальный URL: %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s не похож на хранилище Mercurial:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr "'%s' поÑлал неверный заголовок Content-Type (%s)"
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s' иÑпользует более новый протокол %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "ошибка при проталкивании: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "Поддержка SSL и HTTPS Ð´Ð»Ñ Python не уÑтановлена"
+
+msgid "cannot create new http repository"
+msgstr "не удаетÑÑ Ñоздать новое хранилище по http"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "игнорируетÑÑ Ð½ÐµÐ²ÐµÑ€Ð½Ñ‹Ð¹ ÑинтакÑÐ¸Ñ '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "пропуÑкаетÑÑ Ð½ÐµÑ‡Ð¸Ñ‚Ð°ÐµÐ¼Ñ‹Ð¹ файл Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ '%s': %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "хранилище %s не найдено"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "хранилище %s уже ÑущеÑтвует"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ".hg/sharedpath указывает на неÑущеÑтвующий каталог %s"
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr "внимание: игнорируем неизвеÑтного Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ %s рабочей копии!\n"
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать в имени метки"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "внимание: метка %s конфликтует Ñ ÑущеÑтвующим именем ветки\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+"Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ .hgtags изменена (пожалуйÑта зафикÑируйте .hgtags вручную)"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr "обнаружена Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸ÑŽ - воÑпользуйтеÑÑŒ hg recover"
+
+msgid "rolling back interrupted transaction\n"
+msgstr "откатываем прерванную транзакцию\n"
+
+msgid "no interrupted transaction available\n"
+msgstr "нет прерванной транзакции\n"
+
+msgid "no rollback information available\n"
+msgstr "нет доÑтупной информации Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ñ‚Ð°\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "оконечной ревизией Ñнова Ñтала Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s (отмена %s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "оконечной ревизией Ñнова Ñтала Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s (отмена %s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "откатываем неизвеÑтную транзакцию\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+"откат поÑледней фикÑации без извлеченной ревизии может\n"
+"привеÑти к потере данных"
+
+msgid "use -f to force"
+msgstr "-f - выполнить принудительно"
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr "Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° не может быть Ñброшена: Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ‚ÐºÐ° вÑе еще '%s'\n"
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "рабочий каталог теперь оÑнован на ревизиÑÑ… %d и %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "рабочий каталог теперь оÑнован на ревизии %d\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr "ожидаем ÑнÑÑ‚Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¸ %s удерживаемой %r\n"
+
+#, python-format
+msgid "repository %s"
+msgstr "хранилище %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "рабочий каталог %s"
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr "внимание: не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ предка '%s' Ñкопированного из '%s'!\n"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ñ„Ð¸ÐºÑировать ÑлиÑние чаÑтично (не указывайте файлы или шаблоны)"
+
+# NOT-SURE
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr "фикÑÐ°Ñ†Ð¸Ñ Ñ Ð¸Ñключенным новым подхранилищем %s"
+
+msgid "use --subrepos for recursive commit"
+msgstr "иÑпользуйте --subrepos чтобы фикÑировать рекурÑивно"
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "невозможно зафикÑировать подхранилища без .hgsub"
+
+msgid "file not found!"
+msgstr "файл не найден!"
+
+msgid "no match under directory!"
+msgstr "нет Ñовпадений в каталоге!"
+
+msgid "file not tracked!"
+msgstr "файл не отÑлеживаетÑÑ!"
+
+msgid "cannot commit merge with missing files"
+msgstr "невозможно зафикÑировать ÑлиÑние Ñ Ð½ÐµÐ´Ð¾Ñтающими файлами"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "неразрешенные конфликты ÑлиÑÐ½Ð¸Ñ (Ñм. hg help resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "фикÑÐ°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "Ñообщение фикÑации Ñохранено в %s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "проблемы при фикÑации %s!\n"
+
+msgid "requesting all changes\n"
+msgstr "запрашиваем вÑе изменениÑ\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"чаÑтичное затÑгивание не может быть произведено, Ñ‚.к. второе хранилище\n"
+"не поддерживает подмножеÑтва групп изменений (changegroupsubset)"
+
+msgid "destination does not support push"
+msgstr "хранилище Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ поддерживает push"
+
+#, python-format
+msgid "push includes an obsolete changeset: %s!"
+msgstr "push включает уÑтаревшую ревизию: %s!"
+
+#, python-format
+msgid "push includes an unstable changeset: %s!"
+msgstr "push включает неÑтабильную ревизию: %s!"
+
+# CHECK ME NOT-SURE
+#, python-format
+msgid "updating %s to public failed!\n"
+msgstr "обновление %s до публичной фазы завершилаÑÑŒ неудачей!\n"
+
+msgid "failed to push some obsolete markers!\n"
+msgstr "не удалоÑÑŒ протолкнуть некоторые маркеры уÑтаревших ревизий!\n"
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "найдено %d наборов изменений\n"
+
+msgid "bundling"
+msgstr "укомплектование (bundling)"
+
+msgid "manifests"
+msgstr "манифеÑÑ‚Ñ‹"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "пуÑтой или отÑутÑтвующий revlog Ð´Ð»Ñ %s"
+
+msgid "adding changesets\n"
+msgstr "добавлÑем наборы изменений\n"
+
+# форма такаÑ?
+msgid "chunks"
+msgstr "куÑков"
+
+msgid "received changelog group is empty"
+msgstr "Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° изменений пуÑта"
+
+msgid "adding manifests\n"
+msgstr "добавлÑем манифеÑÑ‚Ñ‹\n"
+
+msgid "adding file changes\n"
+msgstr "добавлÑем Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файлы\n"
+
+# NOT-SURE
+msgid "received file revlog group is empty"
+msgstr "Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð½Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° revlog файла пуÑта"
+
+# NOT-SURE
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "отÑутÑтвуют данные файлов Ð´Ð»Ñ %s:%s - выполните hg verify"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d голов)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "добавлено %d наборов изменений Ñ %d изменениÑми в %d файлах%s\n"
+
+msgid "unexpected response from remote server:"
+msgstr "неожиданный ответ от отдалённого Ñервера:"
+
+msgid "operation forbidden by server"
+msgstr "Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€ÐµÑ‰ÐµÐ½Ð° на Ñервере"
+
+msgid "locking the remote repository failed"
+msgstr "не удалоÑÑŒ заблокировать отдаленное хранилище"
+
+msgid "the server sent an unknown error code"
+msgstr "Ñервер передал неизвеÑтный код ошибки"
+
+# NOT-SURE
+msgid "streaming all changes\n"
+msgstr "передаём вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² поток\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d файлов Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸, %s данных\n"
+
+msgid "clone"
+msgstr "клонирование"
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "передано %s за %.1f Ñекунд (%s/c)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "не удаетÑÑ Ð¸Ñпользовать TLS: поддержка SSL Ð´Ð»Ñ Python не уÑтановлена"
+
+msgid "(using smtps)\n"
+msgstr "(иÑпользуетÑÑ smtps)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "smtp.host не наÑтроен - невозможно отправить почту"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "отправка почты: smtp хоcт %s, порт %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(иÑпользуетÑÑ starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð½Ð° почтовом Ñервере как %s)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "отправка почты: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr "smtp задан в качеÑтве транÑпорта email, но smtp-хоÑÑ‚ не наÑтроен"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr "%r задан в качеÑтве транÑпорта email, но он не доÑтупен в PATH"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "игнорируем неверную кодировку иÑходÑщих пиÑем: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "неверный Ð°Ð´Ñ€ÐµÑ email: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "неверный локальный адреÑ: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "'\\n' и '\\r' недопуÑтимы в именах файлов: %r"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "не удалоÑÑŒ удалить %s из манифеÑта"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "недопуÑтимый шаблон (%s): %s"
+
+msgid "invalid pattern"
+msgstr "недопуÑтимый шаблон"
+
+# здеÑÑŒ file list — ÑпиÑок шаблонов из listfile, Ñм. hg help patterns
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚ÑŒ файл-ÑпиÑок (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+"количеÑтво Ñтрок контекÑта Ð´Ð»Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð¸Ð¹ должно быть целым чиÑлом, а не %r"
+
+#, python-format
+msgid "%s: untracked file differs\n"
+msgstr "%s: неотÑлеживаемый файл различаетÑÑ\n"
+
+msgid ""
+"untracked files in working directory differ from files in requested revision"
+msgstr ""
+"неотÑлеживаемые файлы в рабочем каталоге отличаютÑÑ Ð¾Ñ‚ файлов в "
+"запрашиваемой ревизии"
+
+# ÑмыÑл: проверка имён файлов в ÑиÑтемах без учёта региÑтра (Windows)
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr "ÐºÐ¾Ð»Ð»Ð¸Ð·Ð¸Ñ Ð¿Ñ€Ð¾Ð¿Ð¸Ñных/Ñтрочных букв между %s и %s"
+
+# PROMPT
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+" конфликт флагов Ð´Ð»Ñ %s\n"
+"нет:(n)one, иÑполнимый:e(x)ec или ÑимволичеÑÐºÐ°Ñ ÑÑылка: sym(l)ink?"
+
+# PROMPT
+msgid "&None"
+msgstr "&None - Ðет"
+
+# PROMPT
+msgid "E&xec"
+msgstr "E&xec - ИÑполнимый"
+
+# PROMPT
+msgid "Sym&link"
+msgstr "Sym&link - СимволичеÑÐºÐ°Ñ ÑÑылка"
+
+msgid "resolving manifests\n"
+msgstr "разрешаем манифеÑÑ‚Ñ‹\n"
+
+# PROMPT
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" локально файл %s изменен, на отдаленной машине удален\n"
+"иÑпользовать измененную:(c)hanged верÑию или удалить:(d)elete?"
+
+# PROMPT
+msgid "&Changed"
+msgstr "&Changed - Измененную"
+
+# PROMPT
+msgid "&Delete"
+msgstr "&Delete - Удалить"
+
+# PROMPT
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+" на отдаленной машине файл %s изменен, локально удален\n"
+"иÑпользовать измененную:(c)hanged верÑию или оÑтавить удаленным:(d)eleted?"
+
+# PROMPT
+msgid "&Deleted"
+msgstr "&Deleted - ОÑтавить удаленным"
+
+msgid "updating"
+msgstr "обновление"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "не удалоÑÑŒ удалить %s при обновлении: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "получаем %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "получаем %s в %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr "внимание: возможен конфликт - %s был переименован неÑколько раз в:\n"
+
+#, python-format
+msgid "note: possible conflict - %s was deleted and renamed to:\n"
+msgstr "внимание: возможен конфликт - %s был удален и переименован в:\n"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr "ÑлиÑние Ñ Ð¿Ñ€ÐµÐ´ÐºÐ¾Ð¼ рабочего каталога не имеет ÑмыÑла"
+
+msgid "use 'hg update' or check 'hg heads'"
+msgstr "иÑпользуйте 'hg update' или проверьте 'hg heads'"
+
+msgid "use 'hg status' to list changes"
+msgstr "иÑпользуйте 'hg status' чтобы поÑмотреть изменениÑ"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "незафикÑированные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² подхранилище %s"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+"переÑекающиеÑÑ Ð²ÐµÑ‚ÐºÐ¸ (Ñлейте ветки или иÑпользуйте --clean чтобы\n"
+"отброÑить изменениÑ)"
+
+# BUG
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+"переÑекающиеÑÑ Ð²ÐµÑ‚ÐºÐ¸ (Ñлейте ветки или иÑпользуйте --check чтобы\n"
+"обновитьÑÑ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾)"
+
+msgid "Attention:"
+msgstr "Внимание:"
+
+msgid "Caution:"
+msgstr "ПредоÑтережение:"
+
+msgid "!Danger!"
+msgstr "!ОпаÑно!"
+
+msgid "Error:"
+msgstr "Ошибка:"
+
+msgid "Hint:"
+msgstr "ПодÑказка:"
+
+msgid "Important:"
+msgstr "Важно:"
+
+msgid "Note:"
+msgstr "Примечание:"
+
+msgid "Tip:"
+msgstr "ПодÑказка:"
+
+msgid "Warning!"
+msgstr "Внимание!"
+
+#, python-format
+msgid "parsing obsolete marker: unknown version %r"
+msgstr "ошибка разбора маркера уÑтаревшей ревизии: неизвеÑÑ‚Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %r"
+
+#, python-format
+msgid ""
+"parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
+msgstr ""
+"ошибка разбора маркера уÑтаревшей ревизии: Ñлишком Ð¼Ð°Ð»Ð°Ñ Ð´Ð»Ð¸Ð½Ð° метаданных,\n"
+"ожидалоÑÑŒ %d байт, получено %d"
+
+#, python-format
+msgid "unknown key: %r"
+msgstr "неизвеÑтный ключ: %r"
+
+msgid "unexpected old value"
+msgstr "неожиданное Ñтарое значение"
+
+#, python-format
+msgid "unexpected token: %s"
+msgstr "неожиданный Ñимвол (token): %s"
+
+#, python-format
+msgid "not a prefix: %s"
+msgstr "не префикÑный оператор: %s"
+
+#, python-format
+msgid "not an infix: %s"
+msgstr "не инфикÑный оператор: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+"%d из %d лоÑкутов (hunks) ÐЕ ÐÐЛОЖИЛИСЬ -- ÑохранÑем неналоженные\n"
+"лоÑкуты в файл %s\n"
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "не могу пропатчить %s: файл не отÑлеживаетÑÑ"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "не удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ '%s' Ð´Ð»Ñ Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ‚Ñ‡Ð°\n"
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "применÑетÑÑ Ð¿Ð°Ñ‚Ñ‡ к файлу %s\n"
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr "плохой лоÑкут (hunk) #%d %s (%d %d %d %d)"
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "не могу Ñоздать %s: файл уже ÑущеÑтвует\n"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "файл %s уже ÑущеÑтвует\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+"ЛоÑкут (hunk) #%d был уÑпешно наложен в позиции %d Ñ Ð¿Ð¾Ð³Ñ€ÐµÑˆÐ½Ð¾Ñтью %d\n"
+"(Ñмещение %d Ñтрок).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "ЛоÑкут (hunk) #%d уÑпешно наложен в позиции %d (Ñмещение %d Ñтрок).\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr "ЛоÑкут (hunk) #%d ÐЕ ÐÐЛОЖЕРв позиции %d\n"
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr "плохой лоÑкут (hunk) #%d"
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr "Ð¿Ð»Ð¾Ñ…Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа #%d ÑÑ‚Ð°Ñ€Ð°Ñ Ñтрока текÑта %d"
+
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr "невозможно извлечь бинарные данные \"%s\""
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr "невозможно декодировать двоичный патч \"%s\": %s"
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr "\"%s\" имеет размер %d байт, а должен %d"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "не удаетÑÑ Ð²Ñ‹Ñ€ÐµÐ·Ð°Ñ‚ÑŒ %d из %d каталогов из %s"
+
+msgid "undefined source and destination files"
+msgstr "не определены иÑходный и конечный файлы"
+
+#, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr "не удалоÑÑŒ Ñинхронизировать метаданные Ð´Ð»Ñ \"%s\""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "не удаетÑÑ Ñоздать %s: назначение уже ÑущеÑтвует"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "неподдерживаемое ÑоÑтоÑние парÑера: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "команда patch завершилаÑÑŒ неудачей: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "неподдерживаемый тип перевода Ñтроки: %s"
+
+msgid "patch failed to apply"
+msgstr "не удалоÑÑŒ наложить патч"
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "%s не возможно; отдаленное хранилище не поддерживает возможноÑÑ‚ÑŒ %r"
+
+msgid "cannot change null revision phase"
+msgstr "невозможно изменить фазу пуÑтой ревизии"
+
+#, python-format
+msgid "ignoring inconsistent public root from remote: %s\n"
+msgstr "игнорируем неподходÑщий публичный корень от отдалённого Ñервера: %s\n"
+
+#, python-format
+msgid "ignoring unexpected root from remote: %i %s\n"
+msgstr "игнорируем неожиданный корень от отдалённого Ñервера: %i %s\n"
+
+#, python-format
+msgid "phases.new-commit: not a valid phase name ('%s')"
+msgstr "phases.new-commit: недопуÑтимое Ð¸Ð¼Ñ Ñ„Ð°Ð·Ñ‹ ('%s')"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "выход Ñ ÐºÐ¾Ð´Ð¾Ð¼ %d"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "завершен получением Ñигнала %d"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr "резервный комплект (bundle) Ñохранен в %s\n"
+
+msgid "adding branch\n"
+msgstr "добавлÑетÑÑ Ð²ÐµÑ‚ÐºÐ°\n"
+
+#, python-format
+msgid "error removing %s: %s\n"
+msgstr "ошибка при удалении %s: %s\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "strip не удалÑÑ, полный комплект (bundle) Ñохранен в '%s'\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "strip не удалÑÑ, чаÑтичный комплект (bundle) Ñохранен в '%s'\n"
+
+#, python-format
+msgid "revlog decompress error: %s"
+msgstr "ошибка раÑпаковки revlog: %s"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "неизвеÑтный тип ÑÐ¶Ð°Ñ‚Ð¸Ñ %r"
+
+msgid "index entry flags need RevlogNG"
+msgstr "флаги запиÑи индекÑа требуют RevlogNG"
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ %s Ñодержит неизвеÑтные флаги %#04x Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð° v0"
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ %s Ñодержит неизвеÑтные флаги %#04x Ð´Ð»Ñ revlogng"
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ %s имеет неизвеÑтный формат %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ %s поврежден"
+
+msgid "no node"
+msgstr "нет узла"
+
+msgid "ambiguous identifier"
+msgstr "неоднозначный идентификатор"
+
+msgid "no match found"
+msgstr "Ñовпадений не найдено"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "неÑовмеÑтимый флаг ревизии %x"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "%s не найден в транзакции"
+
+msgid "consistency error in delta"
+msgstr "ошибка целоÑтноÑти в дельте"
+
+msgid "unknown delta base"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ð¾Ñнова (base) дельты"
+
+# {{{ revsets
+#, python-format
+msgid "can't use %s here"
+msgstr "невозможно иÑпользовать %s здеÑÑŒ"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+"``adds(шаблон)``\n"
+" Ðаборы изменений, добавлÑющие файл, Ñовпадающий Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼."
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds требует шаблон"
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+"``ancestor(одна_ревизиÑ, одна_ревизиÑ)``\n"
+" Ðаибольший общий предок двух наборов изменений."
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor требует два аргумента"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "аргументы Ð´Ð»Ñ ancestor должны быть единичными ревизиÑми"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+"``ancestors(множеÑтво)``\n"
+" Ðаборы изменений, ÑвлÑющиеÑÑ Ð¿Ñ€ÐµÐ´ÐºÐ°Ð¼Ð¸ какого-либо набора\n"
+" изменений из множеÑтва."
+
+msgid "~ expects a number"
+msgstr "~ ожидает чиÑло"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+"``author(Ñтрока)``\n"
+" ПÑевдоним Ð´Ð»Ñ ``user(Ñтрока)``."
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author требует Ñтроку"
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+"``bisect(Ñтрока)``\n"
+" Ðаборы изменений, отмеченные ÑоÑтоÑнием в ходе биÑекции:"
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology\n"
+" - ``current`` : the cset currently being bisected"
+msgstr ""
+" - ``good``, ``bad``, ``skip``: Ñвно помеченные как хороший/плохой/"
+"пропущенный\n"
+" - ``goods``, ``bads`` : топологичеÑки хорошие/плохие\n"
+" - ``range`` : находÑщиеÑÑ Ð² рамках биÑекции\n"
+" - ``pruned`` : goods, bads или пропущенные\n"
+" - ``untested`` : те, Ñ‡ÑŒÑ Ñудьба ещё неизвеÑтна\n"
+" - ``ignored`` : игнорируемые ввиду топологии графа ревизий "
+"- ``current`` : обрабатываемый в данный момент"
+
+#. i18n: "bisect" is a keyword
+msgid "bisect requires a string"
+msgstr "bisect требует Ñтроку"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+"``bookmark([имÑ])``\n"
+" Ð˜Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð·Ð°ÐºÐ»Ð°Ð´ÐºÐ° или вÑе закладки."
+
+msgid ""
+" If `name` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a bookmark that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" ЕÑли `имÑ` начинаетÑÑ Ñ `re:`, оÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ имени ÑчитаетÑÑ "
+"регулÑрным\n"
+" выражением. Чтобы найти закладку, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ начинаетÑÑ Ñ Ñимволов\n"
+" `re:`, иÑпользуйте Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ `literal:`."
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark принимает один или ноль аргументов"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "аргумент Ð´Ð»Ñ bookmark должен быть Ñтрокой"
+
+#, python-format
+msgid "no bookmarks exist that match '%s'"
+msgstr "нет закладок, Ñовпадающих Ñ '%s'"
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+"``branch(Ñтрока или множеÑтво)``\n"
+" Ð’Ñе наборы изменений, принадлежащие указанной ветке или веткам\n"
+" данных наборов изменений."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a branch that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" ЕÑли `Ñтрока` начинаетÑÑ Ñ `re:`, оÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ имени ÑчитаетÑÑ "
+"регулÑрным\n"
+" выражением. Чтобы найти ветку, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ начинаетÑÑ Ñ Ñимволов\n"
+" `re:`, иÑпользуйте Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ `literal:`."
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+"``children(множеÑтво)``\n"
+" Дочерние наборы изменений Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð² изменений из множеÑтва."
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+"``closed()``\n"
+" Ðабор изменений, который закрыт."
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed не требует аргументов"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+"``contains(шаблон)``\n"
+" РевизиÑ, ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ñ„Ð°Ð¹Ð», Ñовпадающий Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼. См. Ñправку по "
+"шаблонам\n"
+" имён файлов: :hg:`help patterns`."
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains требует шаблон"
+
+msgid ""
+"``converted([id])``\n"
+" Changesets converted from the given identifier in the old repository if\n"
+" present, or all converted changesets if no identifier is specified."
+msgstr ""
+"``converted([id])``\n"
+" Ðаборы изменений, Ñконвертированные из заданного идентификатора в "
+"Ñтаром\n"
+" хранилище, или вÑе Ñконвертированные наборы изменений, еÑли "
+"идентификатор\n"
+" не указан."
+
+#. i18n: "converted" is a keyword
+msgid "converted takes one or no arguments"
+msgstr "converted принимает ноль или один аргумент"
+
+#. i18n: "converted" is a keyword
+msgid "converted requires a revision"
+msgstr "converted требует ревизию"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+"``date(интервал)``\n"
+" Ðаборы изменений в интервале дат, Ñм. :hg:`help dates`."
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date требует Ñтроку"
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+"``desc(Ñтрока)``\n"
+" ИÑкать Ñтроку в ÑообщениÑÑ… фикÑации. РегиÑÑ‚Ñ€ букв не учитываетÑÑ."
+
+#. i18n: "desc" is a keyword
+msgid "desc requires a string"
+msgstr "desc требует Ñтроку"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+"``descendants(множеÑтво)``\n"
+" Ðаборы изменений, ÑвлÑющиеÑÑ Ð¿Ð¾Ñ‚Ð¾Ð¼ÐºÐ°Ð¼Ð¸ наборов из множеÑтва."
+
+msgid ""
+"``destination([set])``\n"
+" Changesets that were created by a graft, transplant or rebase "
+"operation,\n"
+" with the given revisions specified as the source. Omitting the optional "
+"set\n"
+" is the same as passing all()."
+msgstr ""
+"``destination([множеÑтво])``\n"
+" Ðаборы изменений, Ñозданные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ операций graft, transplant или\n"
+" rebase c указанными ревизиÑми в качеÑтве иÑточников. ЕÑли множеÑтво\n"
+" ревизий опущено, вмеÑто него предполагаетÑÑ all()."
+
+msgid ""
+"``draft()``\n"
+" Changeset in draft phase."
+msgstr ""
+"``draft()``\n"
+" Ðабор изменений в черновой фазе."
+
+#. i18n: "draft" is a keyword
+msgid "draft takes no arguments"
+msgstr "draft не требует аргументов"
+
+msgid ""
+"``extinct()``\n"
+" Obsolete changesets with obsolete descendants only."
+msgstr ""
+"``extinct()``\n"
+" УÑтаревший набор изменений, имеющий только уÑтаревших потомков."
+
+#. i18n: "extinct" is a keyword
+msgid "extinct takes no arguments"
+msgstr "extinct не требует аргументов"
+
+msgid ""
+"``extra(label, [value])``\n"
+" Changesets with the given label in the extra metadata, with the given\n"
+" optional value."
+msgstr ""
+"``extra(label, [значение])``\n"
+" Ðаборы изменений Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ меткой в дополнительных метаданных и Ñ\n"
+" заданным значением (необÑзательным)."
+
+msgid ""
+" If `value` starts with `re:`, the remainder of the value is treated as\n"
+" a regular expression. To match a value that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+" ЕÑли `значение` начинаетÑÑ Ñ `re:`, оÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑчитаетÑÑ "
+"регулÑрным\n"
+" выражением. Чтобы найти значение, которое начинаетÑÑ Ñ Ñимволов\n"
+" `re:`, иÑпользуйте Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ `literal:`."
+
+#. i18n: "extra" is a keyword
+msgid "extra takes at least 1 and at most 2 arguments"
+msgstr "extra требует от одного до двух аргументов"
+
+#. i18n: "extra" is a keyword
+msgid "first argument to extra must be a string"
+msgstr "первый аргумент Ð´Ð»Ñ extra должен быть Ñтрокой"
+
+#. i18n: "extra" is a keyword
+msgid "second argument to extra must be a string"
+msgstr "второй аргумент Ð´Ð»Ñ extra должен быть Ñтрокой"
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+"``filelog(шаблон)``\n"
+" Ðаборы изменений, ÑвÑзанные Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ объектом filelog."
+
+msgid ""
+" For performance reasons, ``filelog()`` does not show every changeset\n"
+" that affects the requested file(s). See :hg:`help log` for details. For\n"
+" a slower, more accurate result, use ``file()``."
+msgstr ""
+" Из Ñоображений производительноÑти, ``filelog()`` не показывает вÑе\n"
+" наборы изменений, затрагивающие указанный файл(Ñ‹). Подробнее Ñм.\n"
+" :hg:`help log`. Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ точного, но медленного результата, "
+"иÑпользуйте\n"
+" ``file()``."
+
+#. i18n: "filelog" is a keyword
+msgid "filelog requires a pattern"
+msgstr "filelog требует шаблон"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+"``first(множеÑтво, [n])``\n"
+" ПÑевдоним Ð´Ð»Ñ limit()."
+
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s принимает либо ноль аргументов, либо Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s ожидает Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°"
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+"``follow([файл])``\n"
+" ПÑевдоним Ð´Ð»Ñ ``::.`` (предки первого Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ¹ копии).\n"
+" ЕÑли указано Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°, проÑлеживаетÑÑ Ð²ÑÑ Ð¸ÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ файла,\n"
+" Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ð¸."
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+"``all()``\n"
+" Ð’Ñе наборы изменений, то же, что ``0:tip``."
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all не требует аргументов"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+"``grep(регулÑрное_выражение)``\n"
+" То же, что ``keyword(Ñтрока)``, но принимает регулÑрное выражение.\n"
+" ИÑпользуйте ``grep(r'...')``, чтобы включить в выражение Ñпециальные\n"
+" Ñимволы. Ð’ отличие от ``keyword(Ñтрока)``, региÑÑ‚Ñ€ букв учитываетÑÑ."
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep требует Ñтроку"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "неверный шаблон поиÑка: %s"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles требует Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один аргумент"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles требует Ñтроковых аргументов"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles ожидает не более одной ревизии"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles ожидает не более одного режима ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию"
+
+#. i18n: "_matchfiles" is a keyword
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "неверный Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ _matchfiles: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+"``file(шаблон)``\n"
+" Ðаборы изменений, затрагивающие файлы, Ñовпадающие Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼."
+
+msgid ""
+" For a faster but less accurate result, consider using ``filelog()``\n"
+" instead."
+msgstr ""
+" Ð”Ð»Ñ Ð±Ð¾Ð»ÐµÐµ быÑтрого, но не Ñтоль точного результата, иÑпользуйте\n"
+" ``filelog()``."
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file требует шаблон"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+"``head()``\n"
+" Ðабор изменений, ÑвлÑющийÑÑ Ð³Ð¾Ð»Ð¾Ð²Ð¾Ð¹ именованной ветки."
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head не требует аргументов"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+"``heads(множеÑтво)``\n"
+" Элементы множеÑтва, у которых в Ñтом множеÑтве нет детей."
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+"``keyword(Ñтрока)``\n"
+" ИÑкать Ñтроку в ÑообщениÑÑ… фикÑации, именах пользователей, именах\n"
+" изменённых файлов. РегиÑÑ‚Ñ€ букв не учитываетÑÑ."
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword требует Ñтроку"
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+"``limit(множеÑтво, [n])``\n"
+" Первые n Ñлементов множеÑтва. По умолчанию 1 Ñлемент."
+
+#. i18n: "limit" is a keyword
+msgid "limit requires one or two arguments"
+msgstr "limit требует один или два аргумента"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit требует чиÑло"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit ожидает чиÑло"
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+"``last(множеÑтво, [n])``\n"
+" ПоÑледние n Ñлементов множеÑтва. По умолчанию 1 Ñлемент."
+
+#. i18n: "last" is a keyword
+msgid "last requires one or two arguments"
+msgstr "last требует один или два аргумента"
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr "last требует чиÑло"
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr "last ожидает чиÑло"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+"``max(множеÑтво)``\n"
+" Ðабор изменений Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ номером ревизии из множеÑтва."
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+"``merge()``\n"
+" Ðабор изменений, ÑвлÑющийÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸ÐµÐ¹ ÑлиÑниÑ."
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge не требует аргументов"
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+"``min(множеÑтво)``\n"
+" Ðабор изменений Ñ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ номером ревизии из множеÑтва."
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+"``modifies(шаблон)``\n"
+" Ðаборы изменений, изменÑющие файлы, Ñовпадающие Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼."
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies требует шаблон"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+"``id(Ñтрока)``\n"
+" РевизиÑ, однозначно Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸Ñ†Ð¸Ñ€ÑƒÐµÐ¼Ð°Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ шеÑтнадцатеричным префикÑом."
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id требует один аргумент"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id требует Ñтроку"
+
+msgid ""
+"``obsolete()``\n"
+" Mutable changeset with a newer version."
+msgstr ""
+"``obsolete()``\n"
+" ИзменÑемый набор изменений, имеющий более новую верÑию."
+
+#. i18n: "obsolete" is a keyword
+msgid "obsolete takes no arguments"
+msgstr "obsolete не требует аргументов"
+
+msgid ""
+"``origin([set])``\n"
+" Changesets that were specified as a source for the grafts, transplants "
+"or\n"
+" rebases that created the given revisions. Omitting the optional set is "
+"the\n"
+" same as passing all(). If a changeset created by these operations is "
+"itself\n"
+" specified as a source for one of these operations, only the source "
+"changeset\n"
+" for the first operation is selected."
+msgstr ""
+"``origin([множеÑтво])``\n"
+" Ðаборы изменений, которые были заданы в качеÑтве иÑходных Ð´Ð»Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹\n"
+" graft, rebase или transplant, Ñоздавших указанные ревизии. ЕÑли "
+"множеÑтво\n"
+" не задано, предполагаетÑÑ all(). ЕÑли набор изменений, Ñозданный Ñтими\n"
+" операциÑми, указан в качеÑтве иÑточника Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ из Ñтих операций,\n"
+" будет выбран только иÑходный набор изменений Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð¹ операции."
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+"``outgoing([путь])``\n"
+" Ðаборы изменений, отÑутÑтвующие в указанном целевом хранилище, или\n"
+" в меÑте Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‚Ð°Ð»ÐºÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ умолчанию."
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing takes one or no arguments"
+msgstr "outgoing требует либо один аргумент, либо ни одного"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "outgoing требует путь к хранилищу"
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+"``p1([множеÑтво])``\n"
+" Первый родитель Ð´Ð»Ñ Ð²Ñех наборов изменений из множеÑтва\n"
+" или Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога."
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+"``p2([множеÑтво])``\n"
+" Второй родитель Ð´Ð»Ñ Ð²Ñех наборов изменений из множеÑтва\n"
+" или Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога."
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+"``parents([множеÑтво])``\n"
+" МножеÑтво вÑех родителей Ð´Ð»Ñ Ð²Ñех наборов изменений из множеÑтва\n"
+" или Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога."
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr "^ ожидает чиÑло 0, 1 или 2"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+"``present(множеÑтво)``\n"
+" ПуÑтое множеÑтво, еÑли какаÑ-либо Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð¸Ð· множеÑтва не найдена.\n"
+" Иначе вÑе ревизии из множеÑтва."
+
+msgid ""
+" If any of specified revisions is not present in the local repository,\n"
+" the query is normally aborted. But this predicate allows the query\n"
+" to continue even in such cases."
+msgstr ""
+" ЕÑли Ð»ÑŽÐ±Ð°Ñ Ð¸Ð· заданных ревизий отÑутÑтвует в локальном хранилище,\n"
+" выполнение запроÑа обычно прерываетÑÑ. Этот же предикат позволÑет\n"
+" продолжить выполнение запроÑа даже в таких ÑлучаÑÑ…."
+
+msgid ""
+"``public()``\n"
+" Changeset in public phase."
+msgstr ""
+"``public()``\n"
+" Ðабор изменений в публичной фазе."
+
+#. i18n: "public" is a keyword
+msgid "public takes no arguments"
+msgstr "public не требует аргументов"
+
+msgid ""
+"``remote([id [,path]])``\n"
+" Local revision that corresponds to the given identifier in a\n"
+" remote repository, if present. Here, the '.' identifier is a\n"
+" synonym for the current local branch."
+msgstr ""
+"``remote([id [,path]])``\n"
+" Ð›Ð¾ÐºÐ°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ, ÑоответÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñƒ идентификатору\n"
+" в отдалённом хранилище, еÑли Ñ‚Ð°ÐºÐ°Ñ ÑущеÑтвует. Идентификатор\n"
+" '.' ÑвлÑетÑÑ Ð·Ð´ÐµÑÑŒ Ñинонимом текущей локальной ветки."
+
+#. i18n: "remote" is a keyword
+msgid "remote takes one, two or no arguments"
+msgstr "remote принимает один, два или ноль аргументов"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a string id"
+msgstr "remote требует Ñтроковый идентификатор"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a repository path"
+msgstr "remote требует путь к хранилищу"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+"``removes(шаблон)``\n"
+" Ðаборы изменений, удалÑющие файлы, Ñовпадающие Ñ ÑˆÐ°Ð±Ð»Ð¾Ð½Ð¾Ð¼."
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes требует шаблон"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+"``rev(чиÑло)``\n"
+" Ð ÐµÐ²Ð¸Ð·Ð¸Ñ Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ чиÑловым идентификатором."
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev требует один аргумент"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev требует чиÑло"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev ожидает чиÑло"
+
+msgid ""
+"``matching(revision [, field])``\n"
+" Changesets in which a given set of fields match the set of fields in "
+"the\n"
+" selected revision or set."
+msgstr ""
+"``matching(Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ [, поле])``\n"
+" Ðаборы изменений, в которых заданный набор полей Ñовпадает Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼\n"
+" полей в выбранной ревизии или множеÑтве ревизий."
+
+msgid ""
+" To match more than one field pass the list of fields to match separated\n"
+" by spaces (e.g. ``author description``)."
+msgstr ""
+" Ð”Ð»Ñ Ð¿Ð¾Ð¸Ñка ревизий Ñ Ð½ÐµÑколькими Ñовпадающими полÑми, задайте ÑпиÑок "
+"имен,\n"
+" полей, разделенных пробелами (например, ``author description``)."
+
+msgid ""
+" Valid fields are most regular revision fields and some special fields."
+msgstr ""
+" Ð’ качеÑтве полей могут выÑтупать \"обычные\" Ð¿Ð¾Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¹, а также\n"
+" неÑколько оÑобых полей."
+
+# NOT-SURE
+msgid ""
+" Regular revision fields are ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" and ``diff``.\n"
+" Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the\n"
+" contents of the revision. Two revisions matching their ``diff`` will\n"
+" also match their ``files``."
+msgstr ""
+" \"Обычные\" Ð¿Ð¾Ð»Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ð¹: ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" и ``diff``.\n"
+" (опиÑание, автор, ветка, дата, файлы, фаза, родители, ÑоÑтоÑние, еще\n"
+" раз автор-пользователь, и различиÑ).\n"
+" Обратите внимание, что ``author`` and ``user`` ÑвлÑÑŽÑ‚ÑÑ Ñинонимами. "
+"``diff`` означает Ñодержимое ревизии. У двух ревизий, Ñовпадающих Ñ\n"
+" заданным ``diff``, Ñовпадут также и ``files``."
+
+msgid ""
+" Special fields are ``summary`` and ``metadata``:\n"
+" ``summary`` matches the first line of the description.\n"
+" ``metadata`` is equivalent to matching ``description user date``\n"
+" (i.e. it matches the main metadata fields)."
+msgstr ""
+" ОÑобыми полÑми ÑвлÑÑŽÑ‚ÑÑ ``summary`` and ``metadata``: ``summary``\n"
+" ÑоответÑтвует первой Ñтроке опиÑаниÑ. ``metadata`` Ñквивалентно\n"
+" Ñовпадению ``description user date`` (Ñ‚.е. Ñто оÑновные полÑ\n"
+" метаданных)."
+
+msgid ""
+" ``metadata`` is the default field which is used when no fields are\n"
+" specified. You can match more than one field at a time."
+msgstr ""
+" ``metadata`` иÑпользуетÑÑ Ð¿Ð¾ умолчанию, когда не указано ни одного\n"
+" полÑ. Можно иÑкать по неÑкольким полÑм за раз."
+
+#. i18n: "matching" is a keyword
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching принимает один или два аргумента"
+
+#. i18n: "matching" is a keyword
+msgid "matching requires a string as its second argument"
+msgstr "matching требует Ñтроку в качеÑтве второго аргумента"
+
+#. i18n: "matching" is a keyword
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "неожиданное Ð¸Ð¼Ñ Ð¿Ð¾Ð»Ñ, переданное matching: %s"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+"``reverse(множеÑтво)``\n"
+" Элементы множеÑтва в обратном порÑдке."
+
+msgid ""
+"``roots(set)``\n"
+" Changesets in set with no parent changeset in set."
+msgstr ""
+"``roots(множеÑтво)``\n"
+" Ðаборы изменений из множеÑтва, не имеющие Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð²Ð¾ множеÑтве."
+
+msgid ""
+"``secret()``\n"
+" Changeset in secret phase."
+msgstr ""
+"``secret()``\n"
+" Ðабор изменений в Ñекретной фазе."
+
+#. i18n: "secret" is a keyword
+msgid "secret takes no arguments"
+msgstr "secret не требует аргументов"
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+"``sort(множеÑтво[, [-]ключ...])``\n"
+" Сортировать множеÑтво по ключам. ПорÑдок по умолчанию — возраÑтающий,\n"
+" укажите ``-ключ``, чтобы отÑортировать в убывающем порÑдке."
+
+msgid " The keys can be:"
+msgstr " Ð’ качеÑтве ключа можно указать:"
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+" - ``rev`` Ð´Ð»Ñ Ñортировки по номеру ревизии,\n"
+" - ``branch`` по имени ветки,\n"
+" - ``desc`` по Ñообщению фикÑации,\n"
+" - ``user`` по имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (то же, что ``author``),\n"
+" - ``date`` по дате фикÑации"
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort требует один или два аргумента"
+
+#. i18n: "sort" is a keyword
+msgid "sort spec must be a string"
+msgstr "ÑÐ¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ sort должна быть Ñтрокой"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "неизвеÑтный ключ Ñортировки %r"
+
+#, python-format
+msgid "invalid regular expression: %s"
+msgstr "недопуÑтимое регулÑрное выражение: %s"
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+"``tag([имÑ])``\n"
+" Ð˜Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° или вÑе помеченные ревизии, еÑли Ð¸Ð¼Ñ Ð½Ðµ указано."
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag не требует аргументов"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "аргумент Ð´Ð»Ñ tag должен быть Ñтрокой"
+
+#, python-format
+msgid "no tags exist that match '%s'"
+msgstr "нет меток, Ñовпадающих Ñ '%s'"
+
+msgid ""
+"``unstable()``\n"
+" Non-obsolete changesets with obsolete ancestors."
+msgstr ""
+"``unstable()``\n"
+" ÐеуÑтаревшие наборы изменений Ñ ÑƒÑтаревшими предками."
+
+#. i18n: "unstable" is a keyword
+msgid "unstable takes no arguments"
+msgstr "unstable не требует аргументов"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+"``user(Ñтрока)``\n"
+" Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñодержит Ñтроку. РегиÑÑ‚Ñ€ букв не учитываетÑÑ."
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the string is treated "
+"as\n"
+" a regular expression. To match a user that actually contains `re:`, use\n"
+" the prefix `literal:`."
+msgstr ""
+" ЕÑли `Ñтрока` начинаетÑÑ Ñ `re:`, оÑÑ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ имени ÑчитаетÑÑ "
+"регулÑрным\n"
+" выражением. Чтобы найти пользователÑ, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ начинаетÑÑ Ñ "
+"Ñимволов\n"
+" `re:`, иÑпользуйте Ð¿Ñ€ÐµÑ„Ð¸ÐºÑ `literal:`."
+
+msgid "can't negate that"
+msgstr "Ñто Ð½ÐµÐ»ÑŒÐ·Ñ Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÑŒ"
+
+msgid "not a symbol"
+msgstr "не ÑвлÑетÑÑ Ñимволом"
+
+#, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr "обнаружена беÑÐºÐ¾Ð½ÐµÑ‡Ð½Ð°Ñ Ð¿Ð¾Ð´Ñтановка в revset-пÑевдониме \"%s\""
+
+#, python-format
+msgid "invalid number of arguments: %s"
+msgstr "неверное количеÑтво аргументов: %s"
+
+msgid "empty query"
+msgstr "пуÑтой запроÑ"
+
+#, python-format
+msgid "no changes found (ignored %d secret changesets)\n"
+msgstr "изменений не найдено (игнорируем %d Ñекретных наборов изменений)\n"
+
+# }}} revsets
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr "недопуÑтимое значение ui.portablefilenames ('%s')"
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr "Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÐºÐ¾Ð»Ð»Ð¸Ð·Ð¸Ñ Ð¿Ñ€Ð¾Ð¿Ð¸Ñных/Ñтрочных букв в %s"
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "путь заканчиваетÑÑ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»ÐµÐ¼ каталогов: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "путь Ñодержит недопуÑтимый компонент: %s"
+
+#, python-format
+msgid "path '%s' is inside nested repo %r"
+msgstr "путь '%s' находитÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ вложенного хранилища %r"
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr "путь %r проходит ÑимволичеÑкую ÑÑылку %r"
+
+# BUG?
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "не удаетÑÑ Ñоздать ÑимволичеÑкую ÑÑылку на %r: %s"
+
+msgid "empty revision range"
+msgstr "пуÑтой диапазон ревизий"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr "удаление %s запиÑываетÑÑ ÐºÐ°Ðº переименование в %s (похожеÑÑ‚ÑŒ %d%%)\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+"%s еще не был зафикÑирован, так что Ð´Ð»Ñ %s не будет Ñохранена информациÑ\n"
+"о копировании.\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr "файл .hg/requires поврежден"
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr ""
+"неизвеÑтный формат хранилища: требуетÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑ‚ÑŒ '%s' (обновите Mercurial)"
+
+msgid "searching for changes\n"
+msgstr "ищем изменениÑ\n"
+
+msgid "all local heads known remotely\n"
+msgstr "вÑе локальные головы извеÑтны на отдаленной Ñтороне\n"
+
+msgid "sampling from both directions\n"
+msgstr "отбор образцов из обоих направлений\n"
+
+# NOT-SURE Ñ‚Ð°ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°?
+msgid "queries"
+msgstr "запроÑов"
+
+msgid "searching"
+msgstr "поиÑк"
+
+# плохо
+msgid "repository is unrelated"
+msgstr "хранилище не ÑвÑзано Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼"
+
+# плохо
+msgid "warning: repository is unrelated\n"
+msgstr "внимание: хранилище не ÑвÑзано Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼\n"
+
+msgid "searching for exact renames"
+msgstr "поиÑк однозначных переименований"
+
+msgid "searching for similar files"
+msgstr "поиÑк похожих файлов"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s, похоже, ÑвлÑетÑÑ Ð±Ð¸Ð½Ð°Ñ€Ð½Ñ‹Ð¼ файлом."
+
+msgid "can only specify two labels."
+msgstr "можно указывать только две метки (labels)."
+
+msgid "warning: conflicts during merge.\n"
+msgstr "внимание: конфликт при ÑлиÑнии.\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "не удаетÑÑ Ñ€Ð°Ð·Ð¾Ð±Ñ€Ð°Ñ‚ÑŒ раÑположение %s"
+
+msgid "password in URL not supported"
+msgstr "пароль в URL не поддерживаетÑÑ"
+
+msgid "could not create remote repo"
+msgstr "не удаетÑÑ Ñоздать отдаленное хранилище"
+
+msgid "no suitable response from remote hg"
+msgstr "не получено подходÑщего ответа от отдаленного hg"
+
+#, python-format
+msgid "push refused: %s"
+msgstr "push отклонен: %s"
+
+msgid "ssl connection failed"
+msgstr "попытка уÑтановить SSL Ñоединение не удалаÑÑŒ"
+
+msgid "Python SSL support not found"
+msgstr "Ðе найдена поддержка SSL Ð´Ð»Ñ Python"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñертификата требуетÑÑ Python 2.6"
+
+msgid "no certificate received"
+msgstr "Ñертификатов не получено"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "Ñертификат Ð´Ð»Ñ %s"
+
+msgid "IDN in certificate not supported"
+msgstr "IDN в Ñертификате не поддерживаетÑÑ"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "в Ñертификате не найден commonName или subjectAltName"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "не найден web.cacerts: %s"
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr "отпечаток хоÑта %s не может быть проверен (Python Ñлишком Ñтарый)"
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr ""
+"внимание: Ñертификат %s не может быть проверен (Python Ñлишком Ñтарый)\n"
+
+# BUG здеÑÑŒ %s - Ð¸Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ хоÑта
+#, python-format
+msgid "%s ssl connection error"
+msgstr "%s - ошибка ssl"
+
+#, python-format
+msgid "%s certificate error: no certificate received"
+msgstr "%s ошибка Ñертификата: Ñертификатов не получено"
+
+#, python-format
+msgid "certificate for %s has unexpected fingerprint %s"
+msgstr "Ñертификат Ð´Ð»Ñ %s имеет неожиданные отпечатки %s"
+
+msgid "check hostfingerprint configuration"
+msgstr "проверьте наÑтройку hostfingerprint"
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "%s ошибка Ñертификата: %s"
+
+#, python-format
+msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
+msgstr ""
+"наÑтройте отпечатки пальцев хоÑта %s или иÑпользуйте --insecure Ð´Ð»Ñ "
+"небезопаÑного подключениÑ"
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+"внимание: Ñертификат %s c отпечатком %s не проверен (проверьте параметры\n"
+"конфигурации hostfingerprints или web.cacerts)\n"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' не похож на хранилище Mercurial"
+
+msgid "cannot lock static-http repository"
+msgstr "не удаетÑÑ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ ÑтатичеÑкое http-хранилище"
+
+msgid "cannot create new static-http repository"
+msgstr "не удаетÑÑ Ñоздать новое ÑтатичеÑкое http-хранилище"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr "Ð½ÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в fncache, Ñтрока %s"
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr "внимание: файл Ñпецификации подхранилища %s не найден\n"
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "файл Ñпецификации подхранилища %s не найден"
+
+#, python-format
+msgid "invalid subrepository revision specifier in .hgsubstate line %d"
+msgstr "неверный Ñпецификатор ревизии подхранилища в .hgsubstate Ñтрока %d"
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr "некорректный шаблон подхранилища в %s: %s"
+
+msgid "missing ] in subrepo source"
+msgstr "не хватает ] в иÑточнике подхранилища"
+
+# PROMPT
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+" иÑточники подхранилищ Ð´Ð»Ñ %s различаютÑÑ\n"
+"иÑпользовать локальный:(l)ocal (%s) или отдаленный:(r)emote иÑточник (%s)?"
+
+# PROMPT
+msgid "&Remote"
+msgstr "&Remote - Отдаленный"
+
+# PROMPT
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" локально подхранилище %s изменено, на отдаленной машине удалено\n"
+"иÑпользовать измененную:(c)hanged верÑию, или удалить:(d)elete?"
+
+# PROMPT
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+" на отдаленной машине подхранилище %s изменено, локально удалено\n"
+"иÑпользовать измененную:(c)hanged верÑию, или удалить:(d)elete?"
+
+# PROMPT
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" иÑточники подхранилищ Ð´Ð»Ñ %s различаютÑÑ\n"
+"иÑпользовать локальный:(l)ocal (%s) или отдаленный:(r)emote иÑточник (%s)?\n"
+
+# PROMPT
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+" иÑточники подхранилищ Ð´Ð»Ñ %s различаютÑÑ (в извлеченной верÑии)\n"
+"иÑпользовать локальный:(l)ocal (%s) или отдаленный:(r)emote иÑточник (%s)?\n"
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr "путь по умолчанию Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° %s не найден"
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "неизвеÑтный тип подхранилища %s"
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "архивирование (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr "внимание: ошибка \"%s\" в подхранилище \"%s\"\n"
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "удаление подхранилища %s\n"
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "клонирование подхранилища %s из %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "затÑгиваем в подхранилище %s из %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "проталкиваем подхранилище %s в %s\n"
+
+#, python-format
+msgid "reverting subrepo %s\n"
+msgstr "воÑÑтановление подхранилища %s\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr "иÑполнÑемый файл 'svn' не найден Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° '%s'"
+
+msgid "cannot retrieve svn tool version"
+msgstr "не удалоÑÑŒ получить верÑию svn"
+
+# svn externals - Ñто ÑимволичеÑкие ÑÑылки в хранилище svn
+msgid "cannot commit svn externals"
+msgstr "не удаетÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать svn externals"
+
+# svn externals - Ñто ÑимволичеÑкие ÑÑылки в хранилище svn
+msgid "cannot commit missing svn entries"
+msgstr "не удаетÑÑ Ð·Ð°Ñ„Ð¸ÐºÑировать отÑутÑтвующие Ñлементы svn"
+
+msgid "failed to commit svn changes"
+msgstr "не удалоÑÑŒ зафикÑировать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² svn"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "не удалÑем хранилище %s, Ñ‚.к. в нем имеютÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ.\n"
+
+msgid "cannot retrieve git version"
+msgstr "не удалоÑÑŒ получить верÑию git"
+
+msgid "git subrepo requires at least 1.6.0 or later"
+msgstr "подхранилище git требует верÑии не ниже 1.6.0"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %s не ÑущеÑтвует в подхранилище %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr "извлечение отделенной головной ревизии в подхранилище %s\n"
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr "извлеките ветку git, еÑли вы планируете вноÑить изменениÑ\n"
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "отÑутÑтвует подхранилище %s"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr "в подхранилище %s извлечена не ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ (unrelated) ветка git\n"
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "проталкиваем ветку %s подхранилища %s\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s\n"
+msgstr ""
+"нет извлеченной ветки в подхранилище %s\n"
+"невозможно протолкнуть ревизию %s\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, Ñтрока %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr "ошибка при разборе запиÑи"
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr "узел '%s' Ñформирован некорректно"
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags поврежден, переÑтраиваем его\n"
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+":addbreaks: Произвольный текÑÑ‚. ДобавлÑет XHTML-тег \"<br />\" перед\n"
+" окончанием каждой Ñтроки кроме поÑледней."
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+":age: Дата. Возвращает читаемый интервал дат/времени между данной\n"
+" датой/временем и текущей датой/временем."
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+":basename: Произвольный текÑÑ‚. Интерпретирует текÑÑ‚ как путь и\n"
+" возвращает поÑледний его компонент поÑле Ñ€Ð°Ð·Ð±Ð¸ÐµÐ½Ð¸Ñ Ð¿Ð¾ разделителÑм\n"
+" пути (Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ð¸ на конце). Ðапример, \"foo/bar/baz\"\n"
+" преобразуетÑÑ Ð² \"baz\", а \"foo/bar//\" - в \"bar\"."
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+":date: Дата. Возвращает дату в формате Unix, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‡Ð°Ñовой поÑÑ:\n"
+" \"Mon Sep 04 15:13:13 2006 0700\"."
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+":domain: Произвольный текÑÑ‚. Ищет первую Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð³Ð»Ñдит как\n"
+" email-адреÑ, и вычленÑет из нее домен. Пример:\n"
+" ``User <user@example.com>`` преобразуетÑÑ Ð² ``example.com``."
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+":email: Произвольный текÑÑ‚. ВыделÑет первую Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñ‹Ð³Ð»Ñдит\n"
+" как email-адреÑ. Пример: ``User <user@example.com>`` преобразуетÑÑ\n"
+" в ``user@example.com``."
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+":escape: Произвольный текÑÑ‚. ЗаменÑет ÑпецÑимволы XML/XHTML \"&\", \"<\"\n"
+" и \">\" ÑоответÑтвующими ÑущноÑÑ‚Ñми XML."
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ":fill68: Произвольный текÑÑ‚. Делает Ñтроки не длиннее 68 Ñимволов."
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ":fill76: Произвольный текÑÑ‚. Делает Ñтроки не длиннее 76 Ñимволов."
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ":firstline: Произвольный текÑÑ‚. Возвращает первую Ñтроку текÑта."
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+":hex: Произвольный текÑÑ‚. Преобразует двоичный идентификатор ревизии\n"
+" в длинную шеÑтнадцатеричную форму."
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+":hgdate: Дата. Возвращает дату в виде пары чиÑел: \"1157407993\n"
+" 25200\" (метка времени Unix, Ñмещение чаÑового поÑÑа)."
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+":isodate: Дата. Возвращает дату в формате ISO 8601: \"2009-08-18 13:00\n"
+" +0200\"."
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+":isodatesec: Дата. Возвращает дату в формате ISO 8601 включаÑ\n"
+" Ñекунды: \"2009-08-18 13:00:13 +0200\". См. также фильтр\n"
+" rfc3339date."
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ":localdate: Дата. Преобразует дату в локальный формат."
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+":nonempty: Произвольный текÑÑ‚. Возвращает '(none)' еÑли входнаÑ\n"
+" Ñтрока пуÑта."
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+":obfuscate: Произвольный текÑÑ‚. Возвращает входной текÑÑ‚ в виде\n"
+" поÑледовательноÑти XML-ÑущноÑтей."
+
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+" interpreting it as per RFC 5322."
+msgstr ""
+":person: Произвольный текÑÑ‚. Возвращает Ð¸Ð¼Ñ Ð¿ÐµÑ€ÐµÐ´ email-адреÑом,\n"
+" Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ñ€ÐµÑ‚Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ ÑоглаÑно RFC 5322."
+
+msgid ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+msgstr ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # ÐижеÑледующее некорректно, но в реальноÑти работает\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+":rfc3339date: Дата. Возвращает дату в Internet-формате, опиÑанном\n"
+" в RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+":rfc822date: Дата. Возвращает дату, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ заголовков\n"
+" email-Ñообщений: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+":short: Ð¥Ñш набора изменений. Возвращает Ñ…Ñш набора изменений в\n"
+" Ñокращенной форме, Ñ‚.е. Ñтроку из 12 шеÑтнадцатеричных Ñимволов."
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+":shortbisect: Произвольный текÑÑ‚. ВоÑпринимает `текÑÑ‚` как ÑтатуÑ\n"
+" биÑекции и возвращает одну букву, предÑтавлÑющую ÑÑ‚Ð°Ñ‚ÑƒÑ (G: good\n"
+" (хорошаÑ), B: bad (плохаÑ), S: skipped (пропущена), U: untested\n"
+" (не теÑтировалаÑÑŒ), I: ignored (игнорирована). Возвращает один пробел,\n"
+" еÑли `текÑÑ‚` не ÑвлÑетÑÑ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ñ‹Ð¼ ÑтатуÑом биÑекции."
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ":shortdate: Дата. Возвращает дату в виде \"2006-09-18\"."
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+":stringify: Любой тип. Превращает значение в текÑÑ‚, путем конвертации\n"
+" значений в текÑÑ‚ и их объединениÑ."
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+":strip: Произвольный текÑÑ‚. УдалÑет ведущие и замыкающие пробельные\n"
+" Ñимволы."
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+":stripdir: Считает входной текÑÑ‚ путем файловой ÑиÑтемы и по\n"
+" возможноÑти удалÑет поÑледний уровень каталога. Ðапример,\n"
+" \"foo\" и \"foo/bar\" преобразуютÑÑ Ð² \"foo\"."
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+":tabindent: Произвольный текÑÑ‚. Возвращает текÑÑ‚, ÐºÐ°Ð¶Ð´Ð°Ñ Ñтрока\n"
+" которого, кроме первой, начинаетÑÑ Ñ Ñимвола табулÑции."
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+":urlescape: Произвольный текÑÑ‚. Экранирует вÑе \"Ñпециальные\" Ñимволы.\n"
+" Ðапример, \"foo bar\" превращаетÑÑ Ð² \"foo%20bar\"."
+
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+" address."
+msgstr ""
+":user: Произвольный текÑÑ‚. Возвращает короткий вариант имени\n"
+" Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ email-адреÑа."
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ""
+":emailuser: Произвольный текÑÑ‚. Возвращает Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð· email-адреÑа."
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ":author: Строка. Ðеизмененный автор набора изменений."
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ""
+":bisect: Строка. СоÑтоÑние поиÑка делением пополам (bisect) набора изменений."
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ""
+":branch: Строка. Ð˜Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, на которую был зафикÑирован набор изменений."
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+":branches: СпиÑок Ñтрок. Ð˜Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸, на которую был зафикÑирован набор\n"
+" изменений. Будет пуÑтым, еÑли Ð¸Ð¼Ñ Ð²ÐµÑ‚ÐºÐ¸ было default."
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ""
+":bookmarks: СпиÑок Ñтрок. Ð’Ñе закладки, аÑÑоциированные Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼\n"
+" изменений."
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ":children: СпиÑок Ñтрок. Дочерние ревизии набора изменений."
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ":date: Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ дате. Дата фикÑации набора изменений."
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ":desc: Строка. ТекÑÑ‚ опиÑÐ°Ð½Ð¸Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений."
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+":diffstat: Строка. СтатиÑтика изменений в Ñледующем формате:\n"
+" \"измененные файлы: +добавленных/-удаленных Ñтрок\""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ":file_adds: СпиÑок Ñтрок. Файлы, добавленные Ñтим набором изменений."
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+":file_copies: СпиÑок Ñтрок. Файлы, Ñкопированные в Ñтом наборе\n"
+" изменений, вмеÑте Ñ Ð¸Ñ… иÑточниками."
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+":file_copies_switch: СпиÑок Ñтрок. То же, что \"file_copies\", но\n"
+" отображаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ еÑли была уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ --copied."
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ":file_dels: СпиÑок Ñтрок. Файлы, удаленные Ñтим набором изменений."
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ":file_mods: СпиÑок Ñтрок. Файлы, измененные Ñтим набором изменений."
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+":files: СпиÑок Ñтрок. Ð’Ñе файлы, измененные, добавленные или удаленные\n"
+" Ñтим набором изменений."
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+":latesttag: Строка. ПоÑледнÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° Ñреди предков данного\n"
+" набора изменений."
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+":latesttagdistance: Целое чиÑло. Самый длинный путь до поÑледней\n"
+" метки."
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+":node: Строка. Ð¥Ñш набора изменений в виде 40-значной шеÑтнадцатеричной\n"
+" Ñтроки."
+
+msgid ":phase: String. The changeset phase name."
+msgstr ":phase: Строка. Ð˜Ð¼Ñ Ñ„Ð°Ð·Ñ‹ набора изменений."
+
+msgid ":phaseidx: Integer. The changeset phase index."
+msgstr ":phaseidx: Целое чиÑло. Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð°Ð·Ñ‹ набора изменений."
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ":rev: Целое чиÑло. Локальный номер ревизии в Ñтом хранилище."
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ":tags: СпиÑок Ñтрок. Ð’Ñе метки, аÑÑоциированные Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ изменений."
+
+msgid ""
+":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
+" format. If the changeset has only one \"natural\" parent (the "
+"predecessor\n"
+" revision) nothing is shown."
+msgstr ""
+":parents: СпиÑок Ñтрок. Родители ревизии в формате \"номер ревизии:Ñ…Ñш\".\n"
+" ЕÑли набор изменений имеет только одного \"еÑтеÑтвенного\" родителÑ\n"
+" (предшеÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ), ничего не показываетÑÑ."
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "неизвеÑтный метод '%s'"
+
+msgid "expected a symbol"
+msgstr "ожидаетÑÑ Ñимвол"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "неизвеÑÑ‚Ð½Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ '%s'"
+
+msgid "expected template specifier"
+msgstr "ожидаетÑÑ Ñпецификатор шаблона"
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "фильтр %s требует один аргумент"
+
+msgid "unmatched quotes"
+msgstr "незакрытые кавычки"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "Ñтиль не найден: %s"
+
+# NOT-SURE так?
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" отÑутÑвует в ÑопоÑтавлении шаблона"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "файл шаблонов %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+"невозможно иÑпользовать транзакцию, когда она уже зафикÑирована/отменена"
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "не удалоÑÑŒ перезапиÑать %s\n"
+
+msgid "transaction abort!\n"
+msgstr "Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð°!\n"
+
+msgid "rollback completed\n"
+msgstr "откат завершен\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "ошибка при откате - пожалуйÑта, запуÑтите hg recover\n"
+
+msgid "already have changeset "
+msgstr "уже имеетÑÑ Ð½Ð°Ð±Ð¾Ñ€ изменений "
+
+#, python-format
+msgid "not trusting file %s from untrusted user %s, group %s\n"
+msgstr "не доверÑем файлу %s от недоверенного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s, группа %s\n"
+
+#, python-format
+msgid "ignored: %s\n"
+msgstr "игнорируетÑÑ: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr "(уÑтаревший '%%' в пути %s=%s из %s)\n"
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s не логичеÑкий ('%s')"
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s не целое чиÑло ('%s')"
+
+msgid "enter a commit username:"
+msgstr "введите Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ñ„Ð¸ÐºÑации:"
+
+#, python-format
+msgid "no username found, using '%s' instead\n"
+msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð½Ðµ найдено, иÑпользуетÑÑ '%s'\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "не задано Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (Ñм. \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %s Ñодержит перевод Ñтроки\n"
+
+msgid "response expected"
+msgstr "ожидаетÑÑ Ð¾Ñ‚Ð²ÐµÑ‚"
+
+msgid "unrecognized response\n"
+msgstr "не раÑпознанный ответ\n"
+
+msgid "password: "
+msgstr "пароль: "
+
+msgid "http authorization required"
+msgstr "требуетÑÑ http-авторизациÑ"
+
+msgid "http authorization required\n"
+msgstr "требуетÑÑ http-авторизациÑ\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "облаÑÑ‚ÑŒ (realm): %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "пользователь: %s\n"
+
+msgid "user:"
+msgstr "пользователь:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "http-авторизациÑ: пользователь %s, пароль %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "команда '%s' завершилаÑÑŒ ошибкой: %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñодержит '%s', Ñто зарезервированное Ð¸Ð¼Ñ Ð² Windows"
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñодержит %r, Ñто недопуÑтимый Ñимвол в Windows"
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr "Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ñодержит '%s' на конце, что недопуÑтимо в Windows"
+
+msgid "check your clock"
+msgstr "проверьте правильноÑÑ‚ÑŒ уÑтановки времени"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° времени: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð´Ð°Ñ‚Ð°: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "дата не помещаетÑÑ Ð² 32 бита: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "Ð¾Ñ‚Ñ€Ð¸Ñ†Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð°Ñ‚Ð°: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "невозможное Ñмещение чаÑового поÑÑа: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "даты не могут ÑоÑтоÑÑ‚ÑŒ из одних пробельных Ñимволов"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr "неверно указана дата, иÑпользуйте '<ДÐТÐ'"
+
+msgid "invalid day spec, use '>DATE'"
+msgstr "неверно указана дата, иÑпользуйте '>ДÐТÐ'"
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "неверно указан день: %s"
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr "%s должен быть неотрицательным (Ñм. 'hg help dates')"
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f ГБ"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f ГБ"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f ГБ"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f МБ"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f МБ"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f МБ"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f КБ"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f КБ"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f КБ"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f байт"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr "Ñ ÑервиÑом '%s' не ÑвÑзан ни один номер порта"
+
+msgid "file:// URLs can only refer to localhost"
+msgstr ""
+"URL вида file:// могут ÑÑылатьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ на локальную машину (localhost)"
+
+msgid "cannot verify bundle or remote repos"
+msgstr "не удаетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¸Ñ‚ÑŒ комплект (bundle) или отдаленное хранилище"
+
+msgid "interrupted"
+msgstr "прервано"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "%s пуÑтой или отÑутÑтвует"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr "длина данных Ñмещена на %d байт"
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "Ð¸Ð½Ð´ÐµÐºÑ Ñодержит %d лишних байт"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "внимание: `%s' иÑпользует revlog формата 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "внимание: `%s' иÑпользует revlog формата 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d указывает на неÑущеÑтвующий набор изменений %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d указывает на неожиданный набор изменений %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr " (ожидаетÑÑ %s)"
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "неизвеÑтный первый родитель %s набора изменений %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "неизвеÑтный второй родитель %s набора изменений %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "проверка родителей %s"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "дублирующаÑÑÑ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr "найдена Ð½ÐµÐ·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð½Ð°Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ - запуÑтите hg recover\n"
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "хранилище иÑпользует revlog формата %d\n"
+
+msgid "checking changesets\n"
+msgstr "проверÑем наборы изменений\n"
+
+msgid "checking"
+msgstr "проверка"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "раÑпаковка набора изменений %s"
+
+msgid "checking manifests\n"
+msgstr "проверка манифеÑтов\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s отÑутÑтвует в наборах изменений"
+
+msgid "file without name in manifest"
+msgstr "файл без имени в манифеÑте"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "чтение дельты %s манифеÑта"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "перекреÑÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° файлов в наборах изменений и манифеÑтах\n"
+
+msgid "crosschecking"
+msgstr "перекреÑÑ‚Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ°"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "набор изменений отноÑитÑÑ Ðº неизвеÑтному манифеÑту %s"
+
+msgid "in changeset but not in manifest"
+msgstr "в наборе изменений, но не в манифеÑте"
+
+msgid "in manifest but not in changeset"
+msgstr "в манифеÑте, но не в наборе изменений"
+
+msgid "checking files\n"
+msgstr "проверка файлов\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "не удаетÑÑ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "поврежденный revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "revlog отÑутÑтвует!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s отÑутÑтвует в манифеÑтах"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "раÑпакованный размер %s, а ожидалÑÑ %s"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "раÑпаковка %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "внимание: иÑточник копии '%s' не входит в родителей %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "пуÑтой или отÑутÑтвующий revlog иÑточника копии %s:%s"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+"внимание: %s@%s: иÑточник копии ревизии - пуÑÑ‚Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ (nullid) %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "проверка Ð¿ÐµÑ€ÐµÐ¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s не найден в манифеÑтах"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "внимание: виÑÑчий (orphan) revlog '%s'"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d файлов, %d наборов изменений, вÑего %d ревизий\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "обнаружено %d предупреждений!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "обнаружено %d ошибок целоÑтноÑти!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(первый поврежденный набор изменений похоже %d)\n"
+
+msgid "look up remote revision"
+msgstr "поиÑк отдаленной ревизии"
+
+msgid "push failed (unexpected response):"
+msgstr "ошибка при проталкивании (неожиданный ответ):"
+
+msgid "look up remote changes"
+msgstr "поиÑк отдаленных изменений"
+
+msgid "push failed:"
+msgstr "ошибка при проталкивании:"
+
+#~ msgid ""
+#~ "``unstable()``\n"
+#~ " Unstable changesets are non-obsolete with obsolete descendants."
+#~ msgstr ""
+#~ "``unstable()``\n"
+#~ " ÐеÑтабильные наборы изменений - не уÑтаревшие наборы изменений\n"
+#~ " Ñ ÑƒÑтаревшими потомками."
+
+#~ msgid ""
+#~ "Branch-based Access Control\n"
+#~ "..........................."
+#~ msgstr ""
+#~ "Контроль доÑтупа, оÑнованный на ветке\n"
+#~ "....................................."
+
+#~ msgid ""
+#~ "Path-based Access Control\n"
+#~ "........................."
+#~ msgstr ""
+#~ "Контроль доÑтупа оÑнованный на пути\n"
+#~ "..................................."
+
+#~ msgid ""
+#~ "Groups\n"
+#~ "......"
+#~ msgstr ""
+#~ "Группы\n"
+#~ "......"
+
+#~ msgid ""
+#~ "Example Configuration\n"
+#~ "....................."
+#~ msgstr ""
+#~ "Пример конфигурации\n"
+#~ "..................."
+
+#~ msgid ""
+#~ " Mercurial Destination\n"
+#~ " '''''''''''''''''''''"
+#~ msgstr ""
+#~ " Выходное хранилище Mercurial\n"
+#~ " ''''''''''''''''''''''''''''"
+
+#~ msgid "must specify local origin repository"
+#~ msgstr "хранилище-иÑточник должно быть локальным"
+
+#~ msgid ""
+#~ "Files\n"
+#~ "-----"
+#~ msgstr ""
+#~ "Файлы\n"
+#~ "-----"
+
+#~ msgid ""
+#~ "Syntax\n"
+#~ "------"
+#~ msgstr ""
+#~ "СинтакÑиÑ\n"
+#~ "---------"
+
+#~ msgid ""
+#~ "``alias``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``alias``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``annotate``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``annotate``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``auth``\n"
+#~ "\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``auth``\n"
+#~ "\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``decode/encode``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``decode/encode``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``defaults``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``defaults``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``diff``\n"
+#~ "\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``diff``\n"
+#~ "\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``email``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``email``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``extensions``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``extensions``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``format``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``format``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``graph``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``graph``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``hooks``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``hooks``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``hostfingerprints``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``hostfingerprints``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``http_proxy``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``http_proxy``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``merge-patterns``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``merge-patterns``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``merge-tools``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``merge-tools``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``patch``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``patch``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``paths``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``paths``\n"
+#~ "\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``phases``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``phases``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``profiling``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``profiling``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``revsetalias``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``revsetalias``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``server``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``server``\n"
+#~ "\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``smtp``\n"
+#~ "\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``smtp``\n"
+#~ "\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``subpaths``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``subpaths``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "``trusted``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "``trusted``\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``ui``\n"
+#~ "\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``ui``\n"
+#~ "\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "\n"
+#~ "``web``\n"
+#~ "\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "\n"
+#~ "``web``\n"
+#~ "\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "Example\n"
+#~ "-------"
+#~ msgstr ""
+#~ "Пример\n"
+#~ "------"
+
+#~ msgid ""
+#~ "The ``web`` section can specify all the settings described in the web\n"
+#~ "section of the hgrc(5) documentation. See :hg:`help config` for\n"
+#~ "information on where to find the manual page."
+#~ msgstr ""
+#~ "Ð¡ÐµÐºÑ†Ð¸Ñ ``web`` Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð²Ñех параметров, опиÑанных в Ñправке по\n"
+#~ "одноименной Ñекции из :hg:`help config`."
+
+#~ msgid ""
+#~ "The ``paths`` section provides mappings of physical repository\n"
+#~ "paths to virtual ones. For instance::"
+#~ msgstr ""
+#~ "Ð¡ÐµÐºÑ†Ð¸Ñ ``paths`` задает ÑоответÑтвие физичеÑких путей к хранилищам\n"
+#~ "и виртуальных. Ðапример::"
+
+#~ msgid ""
+#~ "- The first two entries make two repositories in different directories\n"
+#~ " appear under the same directory in the web interface\n"
+#~ "- The third entry maps every Mercurial repository found in '/real/root'\n"
+#~ " into 'web/root'. This format is preferred over the [collections] one,\n"
+#~ " since using absolute paths as configuration keys is not supported on "
+#~ "every\n"
+#~ " platform (especially on Windows).\n"
+#~ "- The fourth entry is a special case mapping all repositories in\n"
+#~ " '/real/root2' in the root of the virtual directory.\n"
+#~ "- The fifth entry recursively finds all repositories under the real\n"
+#~ " root, and maps their relative paths under the virtual root."
+#~ msgstr ""
+#~ "- Первые две Ñтроки показывают два хранилища, физичеÑки находÑщиеÑÑ Ð¿Ð¾\n"
+#~ " разным путÑм, в одном каталоге в веб-интерфейÑе\n"
+#~ "- Ð¢Ñ€ÐµÑ‚ÑŒÑ Ñтрока показывает вÑе хранилища Mercurial, находÑщиеÑÑ Ð²\n"
+#~ " '/real/root', в каталоге 'web/root' веб-интерфейÑа. Ð¢Ð°ÐºÐ°Ñ Ñ„Ð¾Ñ€Ð¼Ð°\n"
+#~ " ÑвлÑетÑÑ Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ по Ñравнению Ñ Ñекцией [collections],\n"
+#~ " Ñ‚.к. иÑпользование абÑолютных путей в качеÑтве ключей поддерживаетÑÑ\n"
+#~ " не на вÑех платформах (в чаÑтноÑти, не работает в Windows)\n"
+#~ "- Ð§ÐµÑ‚Ð²ÐµÑ€Ñ‚Ð°Ñ Ñтрока иллюÑтрирует оÑобый Ñлучай, при котором вÑе\n"
+#~ " хранилища из каталога '/real/root2' отображаютÑÑ Ð² корневом\n"
+#~ " виртуальном каталоге.\n"
+#~ "- ПÑÑ‚Ð°Ñ Ñтрока рекурÑивно ищет вÑе хранилища в подкаталогах\n"
+#~ " /real/root2 и показывает из отноÑительные пути в виртуальном\n"
+#~ " каталоге."
+
+#~ msgid ""
+#~ "The ``collections`` section provides mappings of trees of physical\n"
+#~ "repositories paths to virtual ones, though the paths syntax is generally\n"
+#~ "preferred. For instance::"
+#~ msgstr ""
+#~ "Ð¡ÐµÐºÑ†Ð¸Ñ ``collections`` задает ÑоответÑтвие деревьев физичеÑких путей\n"
+#~ "хранилищ виртуальным. Однако, предпочтительно иÑпользовать Ñекцию\n"
+#~ "paths. Пример::"
+
+#~ msgid ""
+#~ " [collections]\n"
+#~ " /foo = /foo"
+#~ msgstr ""
+#~ " [collections]\n"
+#~ " /foo = /foo"
+
+#~ msgid ""
+#~ "Here, the left side will be stripped off all repositories found in the\n"
+#~ "right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+#~ "``bar`` and ``quux/baz`` respectively.\n"
+#~ msgstr ""
+#~ "ЗдеÑÑŒ Ð»ÐµÐ²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ путей будет удалена из вÑех путей хранилищ,\n"
+#~ "найденных в каталоге из правой чаÑти. Так, ``/foo/bar`` и ``foo/quux/"
+#~ "baz``\n"
+#~ "будут отображатьÑÑ ÐºÐ°Ðº ``bar`` и ``quux/baz`` ÑоответÑтвенно.\n"
+
+#~ msgid ""
+#~ "Available merge tools\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "Возможные инÑтрументы ÑлиÑниÑ\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "Choosing a merge tool\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+#~ msgstr ""
+#~ "Выбор инÑтрумента ÑлиÑниÑ\n"
+#~ "\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+
+#~ msgid ""
+#~ "Interaction with Mercurial Commands\n"
+#~ "-----------------------------------"
+#~ msgstr ""
+#~ "ВзаимодейÑтвие Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ð¼Ð¸ Mercurial\n"
+#~ "------------------------------------"
+
+#~ msgid ""
+#~ "Remapping Subrepositories Sources\n"
+#~ "---------------------------------"
+#~ msgstr ""
+#~ "Переназначение иÑточников подхранилищ\n"
+#~ "-------------------------------------"
+
+#~ msgid ""
+#~ "Other repository doesn't support revision lookup, so a rev cannot be "
+#~ "specified."
+#~ msgstr ""
+#~ "Другое хранилище не поддерживает поиÑк ревизий, поÑтому нельзÑ\n"
+#~ "задавать ревизию."
+
+#~ msgid ""
+#~ " When -f/--force is applied, all local changes in patched files\n"
+#~ " will be lost."
+#~ msgstr ""
+#~ " С -f/--force вÑе локальные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файлах, на которые "
+#~ "накладываетÑÑ\n"
+#~ " патч, будут утерÑны."
+
+#~ msgid ""
+#~ "Alternatively, they can be added to Mercurial configuration files by\n"
+#~ "setting the previous entry to an empty value."
+#~ msgstr ""
+#~ "Также они могут быть добавлены прÑмо в конфигурационные файлы Mercurial,\n"
+#~ "Ð´Ð»Ñ Ñтого надо уÑтановить предыдущий параметр в пуÑтое значение (config= )"
+
+#~ msgid ""
+#~ "notify.sources\n"
+#~ " Space separated list of change sources. Notifications are sent only\n"
+#~ " if it includes the incoming or outgoing changes source. Incoming\n"
+#~ " sources can be ``serve`` for changes coming from http or ssh,\n"
+#~ " ``pull`` for pulled changes, ``unbundle`` for changes added by\n"
+#~ " :hg:`unbundle` or ``push`` for changes being pushed\n"
+#~ " locally. Outgoing sources are the same except for ``unbundle`` which\n"
+#~ " is replaced by ``bundle``. Default: serve."
+#~ msgstr ""
+#~ "notify.sources\n"
+#~ " Разделенный пробелами ÑпиÑок иÑточников изменений. УведомлениÑ\n"
+#~ " отÑылаютÑÑ, только еÑли он Ñодержит иÑточники входÑщих или иÑходÑщих\n"
+#~ " изменений. ВходÑщие иÑточники могут быть ``serve`` - Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹,\n"
+#~ " получаемых по ssh или http, ``pull`` - Ð´Ð»Ñ Ð·Ð°Ñ‚Ñгиваемых изменений,\n"
+#~ " ``unbundle`` - Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, добавлÑемых Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ :hg:`unbundle`,\n"
+#~ " или ``push`` - Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð½Ñ‹Ñ… локально Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ команды :hg:`push`.\n"
+#~ " Такие же Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ‹ и Ð´Ð»Ñ Ð¸ÑходÑщих, кроме ``unbundle``, "
+#~ "который\n"
+#~ " заменÑетÑÑ Ð½Ð° ``bundle``. По умолчанию: serve."
+
+#~ msgid ""
+#~ "notify.domain\n"
+#~ " If subscribers emails or the from email have no domain set, complete "
+#~ "them\n"
+#~ " with this value."
+#~ msgstr ""
+#~ "notify.domain\n"
+#~ " ЕÑли адреÑа email подпиÑчиков или поле email \"From:\" (От) не имеют\n"
+#~ " домена, он заменÑетÑÑ Ñтим значением."
+
+#~ msgid "Sending "
+#~ msgstr "ОтправлÑетÑÑ "
+
+#~ msgid "force detaching of source from its original branch"
+#~ msgstr "принудительно отцепить иÑточник от его ветки-иÑточника"
+
+#~ msgid "cannot use detach with continue or abort"
+#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать detach Ñ continue или abort"
+
+#~ msgid "cannot specify a base with detach"
+#~ msgstr "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð´Ð°Ð²Ð°Ñ‚ÑŒ base Ñ detach"
+
+#~ msgid "warning: immutable rebased changeset detected, can't abort\n"
+#~ msgstr ""
+#~ "внимание: обнаружены неизменÑемые перебазированные наборы изменений, "
+#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ñ€ÐµÑ€Ð²Ð°Ñ‚ÑŒ\n"
+
+#~ msgid "[OPTION]... REVISION..."
+#~ msgstr "[ПÐРÐМЕТР]... РЕВИЗИЯ..."
+
+#~ msgid "use \"hg -v help %s\" to show more info"
+#~ msgstr "иÑпользуйте \"hg -v help %s\" Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации"
+
+#~ msgid "There is no Mercurial repository here (.hg not found)"
+#~ msgstr "ЗдеÑÑŒ нет хранилища Mercurial (.hg не обнаружен)"
+
+#~ msgid ""
+#~ "If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+#~ "setting::"
+#~ msgstr ""
+#~ "ЕÑли вы замечаете Ñообщение об ошибке \"BROKEN PIPE\" (\"ОБРЫВ КÐÐÐЛÐ\")\n"
+#~ "его можно отключить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñледующего параметра::"
+
+#~ msgid ""
+#~ " [pager]\n"
+#~ " quiet = True"
+#~ msgstr ""
+#~ " [pager]\n"
+#~ " quiet = True"
+
+#~ msgid "The hook does not change bug status."
+#~ msgstr "Хук не изменÑет ÑÑ‚Ð°Ñ‚ÑƒÑ Ð±Ð°Ð³Ð°."
+
+#~ msgid ""
+#~ "bugzilla.regexp\n"
+#~ " Regular expression to match bug IDs in changeset commit message.\n"
+#~ " Must contain one \"()\" group. The default expression matches ``Bug\n"
+#~ " 1234``, ``Bug no. 1234``, ``Bug number 1234``, ``Bugs 1234,5678``,\n"
+#~ " ``Bug 1234 and 5678`` and variations thereof. Matching is case\n"
+#~ " insensitive."
+#~ msgstr ""
+#~ "bugzilla.regexp\n"
+#~ " РегулÑрное выражение Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка ID бага в комментарии фикÑации набора\n"
+#~ " изменений. Должно Ñодержать одну группу в Ñкобках \"()\". По умолчанию\n"
+#~ " задано выражение, Ñовпадающее Ñ ``Bug 1234``, ``Bug no. 1234``,\n"
+#~ " ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` и их\n"
+#~ " вариациÑми. Ðе чувÑтвительно к региÑтру."
+
+#~ msgid "%s is not a valid revision in current branch"
+#~ msgstr "%s - недопуÑÑ‚Ð¸Ð¼Ð°Ñ Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ð° текущей ветке"
+
+#~ msgid "-G/--graph option is incompatible with --follow with file argument"
+#~ msgstr "Ð¾Ð¿Ñ†Ð¸Ñ -G/--graph неÑовмеÑтима Ñ --follow Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð¼-файлом"
+
+#~ msgid "hg glog [OPTION]... [FILE]"
+#~ msgstr "hg glog [ПÐРÐМЕТР]... [ФÐЙЛ]"
+
+#~ msgid "import a patch"
+#~ msgstr "импортировать патч"
+
+#~ msgid ""
+#~ " Returns 0 on success, 1 if no changes found or an update had\n"
+#~ " unresolved files.\n"
+#~ " "
+#~ msgstr ""
+#~ " Возвращает 0 при уÑпехе, 1 еÑли изменений не найдено или еÑÑ‚ÑŒ\n"
+#~ " конфликты при обновлении.\n"
+#~ " "
+
+#~ msgid ""
+#~ "Defines subrepositories source locations rewriting rules of the form::"
+#~ msgstr "ОпределÑет правила Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð°Ð´Ñ€ÐµÑов иÑточников в форме::"
+
+#~ msgid "All patterns are applied in definition order."
+#~ msgstr "Ð’Ñе шаблоны применÑÑŽÑ‚ÑÑ Ð² порÑдке определениÑ."
+
+#~ msgid ""
+#~ "Close changeset\n"
+#~ " See 'Changeset, close'."
+#~ msgstr ""
+#~ "Закрыть набор изменений (ревизию)\n"
+#~ " См. 'Ðабор изменений, закрыть'."
+
+#~ msgid "bad hash in '%s' (only %d bytes long)"
+#~ msgstr "неверный Ñ…Ñш в '%s' (длина вÑего %d байт)"
+
+#~ msgid "addremove cannot be run on a repo with largefiles"
+#~ msgstr ""
+#~ "Ð½ÐµÐ»ÑŒÐ·Ñ Ð·Ð°Ð¿ÑƒÑкать addremove в хранилище Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼Ð¸ файлами (largefiles)"
+
+#, fuzzy
+#~ msgid "Removing unknown node %(n)s from %(p)i-phase boundary"
+#~ msgstr "УдалÑем неизвеÑтный узел %(n)s из границы %(p)i-фазы"
+
+#~ msgid "follow takes no arguments"
+#~ msgstr "follow не требует аргументов"
+
+# BUG force won't help you to avoid data loss
+#~ msgid ""
+#~ " It's possible to lose data with rollback: commit, update back to\n"
+#~ " an older changeset, and then rollback. The update removes the\n"
+#~ " changes you committed from the working directory, and rollback\n"
+#~ " removes them from history. To avoid data loss, you must pass\n"
+#~ " --force in this case."
+#~ msgstr ""
+#~ " При иÑпользовании rollback возможна Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…: зафикÑировать,\n"
+#~ " обновитьÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾ на предыдущую ревизию и Ñделать rollback. Update\n"
+#~ " удалит изменениÑ, которые вы зафикÑировали, из рабочего каталога,\n"
+#~ " а rollback Ñотрет их из иÑтории. Чтобы избежать потери данных,\n"
+#~ " вы должны в таком Ñлучае передать --force."
+
+#~ msgid "%dм%02dÑ"
+#~ msgstr "%dм%02dÑ"
+
+#~ msgid "there is nothing to merge"
+#~ msgstr "нечего Ñливать"
+
+#~ msgid "acl: access denied for changeset %s"
+#~ msgstr "acl: нет доÑтупа Ð´Ð»Ñ Ð½Ð°Ð±Ð¾Ñ€Ð° изменений %s"
+
+#~ msgid " See :hg:`help urls` for valid source format details."
+#~ msgstr " См. :hg:`help urls` о форматах адреÑа иÑточника."
+
+#~ msgid ""
+#~ " It is possible to specify an ``ssh://`` URL as the destination, but "
+#~ "no\n"
+#~ " ``.hg/hgrc`` and working directory will be created on the remote "
+#~ "side.\n"
+#~ " Please see :hg:`help urls` for important details about ``ssh://`` "
+#~ "URLs."
+#~ msgstr ""
+#~ " Можно указать ``ssh://...`` в качеÑтве адреÑа назначениÑ, но файл\n"
+#~ " ``.hg/hgrc`` и Ñ€Ð°Ð±Ð¾Ñ‡Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð½Ðµ будут Ñозданы на отдалённом "
+#~ "компьютере.\n"
+#~ " См. :hg:`help urls` Ð´Ð»Ñ Ð²Ð°Ð¶Ð½Ð¾Ð¹ информации об адреÑах вида ``ssh://..."
+#~ "``."
+
+#~ msgid ""
+#~ " A set of changesets (tags, or branch names) to pull may be specified\n"
+#~ " by listing each changeset (tag, or branch name) with -r/--rev.\n"
+#~ " If -r/--rev is used, the cloned repository will contain only a "
+#~ "subset\n"
+#~ " of the changesets of the source repository. Only the set of "
+#~ "changesets\n"
+#~ " defined by all -r/--rev options (including all their ancestors)\n"
+#~ " will be pulled into the destination repository.\n"
+#~ " No subsequent changesets (including subsequent tags) will be present\n"
+#~ " in the destination."
+#~ msgstr ""
+#~ " Копируемые наборы изменений (changesets) (как метки или имена веток)\n"
+#~ " могут быть заданы указанием каждого набора изменений (метки или "
+#~ "имени\n"
+#~ " ветки) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -r/--rev. При иÑпользовании -r/--rev, клонированное\n"
+#~ " хранилище будет Ñодержать только подмножеÑтво наборов изменений\n"
+#~ " иÑточника."
+
+#~ msgid ""
+#~ " Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+#~ " local source repositories."
+#~ msgstr ""
+#~ " ИÑпользование -r/--rev (или 'clone иÑточник#Ñ€ÐµÐ²Ð¸Ð·Ð¸Ñ Ð½Ð°Ð·Ð½')\n"
+#~ " предполагает --pull, даже еÑли иÑточник локален."
+
+#~ msgid "applied %s\n"
+#~ msgstr "применен %s\n"
+
+#~ msgid ""
+#~ ":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+#~ " specified. Subversion subrepositories are currently silently\n"
+#~ " ignored."
+#~ msgstr ""
+#~ ":add: add не обрабатывает подхранилища рекурÑивно, еÑли не указана\n"
+#~ " Ð¾Ð¿Ñ†Ð¸Ñ -S/--subrepos. Подхранилища Subversion в наÑтоÑщее\n"
+#~ " Ð²Ñ€ÐµÐ¼Ñ Ð¼Ð¾Ð»Ñ‡Ð° игнорируютÑÑ."
+
+#~ msgid "do not prompt, assume 'yes' for any required answers"
+#~ msgstr "не Ñпрашивать подтверждениÑ, вÑегда автоматичеÑки отвечать 'да'"
+
+#~ msgid "read config from: %s\n"
+#~ msgstr "читаю конфиг из: %s\n"
+
+#~ msgid "restore individual files or directories to an earlier state"
+#~ msgstr "вернуть файлы или каталоги к более раннему ÑоÑтоÑнию"
+
+#~ msgid ""
+#~ " .. note::\n"
+#~ " This command is most likely not what you are looking for.\n"
+#~ " Revert will partially overwrite content in the working\n"
+#~ " directory without changing the working directory parents. Use\n"
+#~ " :hg:`update -r rev` to check out earlier revisions, or\n"
+#~ " :hg:`update --clean .` to undo a merge which has added another\n"
+#~ " parent."
+#~ msgstr ""
+#~ " .. note::\n"
+#~ " Эта команда почти навернÑка не то, что вы ищете. Revert\n"
+#~ " чаÑтично перепиÑывает файлы в рабочем каталоге, не изменÑÑ ÐµÐ³Ð¾\n"
+#~ " родительÑкую ревизию в хранилище. ИÑпользуйте \n"
+#~ " :hg:`update -r рев` чтобы извлечь предыдущие ревизии, или\n"
+#~ " :hg:`update --clean .` чтобы отменить ÑлиÑние, которое добавило\n"
+#~ " второго родителÑ."
+
+#~ msgid ""
+#~ " Revert modifies the working directory. It does not commit any\n"
+#~ " changes, or change the parent of the working directory. If you\n"
+#~ " revert to a revision other than the parent of the working\n"
+#~ " directory, the reverted files will thus appear modified\n"
+#~ " afterwards."
+#~ msgstr ""
+#~ " Revert изменÑет рабочий каталог. Она не фикÑирует никаких\n"
+#~ " изменений и не менÑет Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ каталога. ЕÑли вы\n"
+#~ " выполните revert на ревизию, отличную от текущей родительÑкой,\n"
+#~ " воÑÑтановленные файлы будут иметь ÑÑ‚Ð°Ñ‚ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð½Ñ‹Ñ…."
+
+#~ msgid ""
+#~ " If a file has been deleted, it is restored. Files scheduled for\n"
+#~ " addition are just unscheduled and left as they are. If the\n"
+#~ " executable mode of a file was changed, it is reset."
+#~ msgstr ""
+#~ " ЕÑли файл был удален, он воÑÑтанавливаетÑÑ. У файлов, помеченных\n"
+#~ " Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ, пометка ÑнимаетÑÑ, Ñами файлы при Ñтом не\n"
+#~ " изменÑÑŽÑ‚ÑÑ. ЕÑли изменилÑÑ Ð¿Ñ€Ð¸Ð·Ð½Ð°Ðº иÑполнимоÑти файла, он\n"
+#~ " ÑбраÑываетÑÑ."
+
+#~ msgid ""
+#~ " If names are given, all files matching the names are reverted.\n"
+#~ " If no arguments are given, no files are reverted."
+#~ msgstr ""
+#~ " ЕÑли заданы имена, воÑÑтанавливаютÑÑ Ð²Ñе файлы Ñ Ð¿Ð¾Ð´Ñ…Ð¾Ð´Ñщими\n"
+#~ " именами. Без аргументов никакие файлы не будут воÑÑтановлены."
+
+#~ msgid ""
+#~ "no files or directories specified; use --all to revert the whole repo"
+#~ msgstr "не заданы файлы или каталоги; --all откатит вÑÑ‘ хранилище"
+
+#~ msgid "base path"
+#~ msgstr "базовый путь"
+
+#~ msgid "not updating, since new heads added\n"
+#~ msgstr "не обновлÑÑŽÑÑŒ Ñ‚.к. добавлены новые головы\n"
+
+#~ msgid ""
+#~ "Mercurial reads configuration data from several files, if they exist.\n"
+#~ "Below we list the most specific file first."
+#~ msgstr ""
+#~ "Mercurial читает наÑтройки из неÑкольких файлов, еÑли они ÑущеÑтвуют.\n"
+#~ "Ðиже приведен их ÑпиÑок, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ð½Ð°Ð¸Ð±Ð¾Ð»ÐµÐµ характерных."
+
+#~ msgid "On Windows, these configuration files are read:"
+#~ msgstr "Ð’ Windows иÑпользуютÑÑ Ñти файлы:"
+
+#~ msgid ""
+#~ "- ``<repo>\\.hg\\hgrc``\n"
+#~ "- ``%USERPROFILE%\\.hgrc``\n"
+#~ "- ``%USERPROFILE%\\mercurial.ini``\n"
+#~ "- ``%HOME%\\.hgrc``\n"
+#~ "- ``%HOME%\\mercurial.ini``\n"
+#~ "- ``C:\\mercurial\\mercurial.ini`` (unless regkey or hgrc.d\\ or "
+#~ "mercurial.ini found)\n"
+#~ "- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (unless hgrc.d\\ or "
+#~ "mercurial.ini found)\n"
+#~ "- ``<hg.exe-dir>\\hgrc.d\\*.rc`` (unless mercurial.ini found)\n"
+#~ "- ``<hg.exe-dir>\\mercurial.ini``"
+#~ msgstr ""
+#~ "- ``<хранилище>\\.hg\\hgrc``\n"
+#~ "- ``%USERPROFILE%\\.hgrc``\n"
+#~ "- ``%USERPROFILE%\\mercurial.ini``\n"
+#~ "- ``%HOME%\\.hgrc``\n"
+#~ "- ``%HOME%\\mercurial.ini``\n"
+#~ "- ``C:\\mercurial\\mercurial.ini`` (еÑли не найден ключ в рееÑтре или "
+#~ "hgrc.d\\)\n"
+#~ "- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (еÑли не найден hgrc.d\\или "
+#~ "mercurial.ini)\n"
+#~ "- ``<каталог-Ñ-hg.exe>\\hgrc.d\\*.rc`` (еÑли не найден mercurial.ini)\n"
+#~ "- ``<каталог-Ñ-hg.exe>\\mercurial.ini``"
+
+#~ msgid "On Unix, these files are read:"
+#~ msgstr "Ð’ Unix иÑпользуютÑÑ Ñти файлы:"
+
+#~ msgid ""
+#~ "If there is a per-repository configuration file which is not owned by\n"
+#~ "the active user, Mercurial will warn you that the file is skipped::"
+#~ msgstr ""
+#~ "ЕÑли владелец файла наÑтроек в хранилище - не текущий пользователь,\n"
+#~ "Mercurial предупреждает о том, что Ñтот файл не будет иÑпользован::"
+
+#~ msgid ""
+#~ " not trusting file <repo>/.hg/hgrc from untrusted user USER, group GROUP"
+#~ msgstr ""
+#~ " не доверÑÑŽ файлу <хранилище>/.hg/hgrc от недоверенного пользователÑ\n"
+#~ " ПОЛЬЗОВÐТЕЛЬ в группе ГРУППÐ"
+
+#~ msgid ""
+#~ "If this bothers you, the warning can be silenced (the file would still\n"
+#~ "be ignored) or trust can be established. Use one of the following\n"
+#~ "settings, the syntax is explained below:"
+#~ msgstr ""
+#~ "ЕÑли Ñто Ð²Ð°Ñ Ñ€Ð°Ð·Ð´Ñ€Ð°Ð¶Ð°ÐµÑ‚, можно отключить предупреждение (файл вÑе равно\n"
+#~ "игнорируетÑÑ), или начать доверÑÑ‚ÑŒ пользователю. Ð”Ð»Ñ Ñтого иÑпользуйте\n"
+#~ "Ñледующие наÑтройки, ÑинтакÑÐ¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… опиÑан далее:"
+
+#~ msgid ""
+#~ "- ``ui.report_untrusted = False``\n"
+#~ "- ``trusted.users = USER``\n"
+#~ "- ``trusted.groups = GROUP``"
+#~ msgstr ""
+#~ "- ``ui.report_untrusted = False``\n"
+#~ "- ``trusted.users = ПОЛЬЗОВÐТЕЛЬ``\n"
+#~ "- ``trusted.groups = ГРУППÐ``"
+
+#~ msgid ""
+#~ "- on Unix-like systems: ``man hgrc``\n"
+#~ "- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+#~ msgstr ""
+#~ "- в Unix-подобных ОС: ``man hgrc``\n"
+#~ "- онлайн: http://www.selenic.com/mercurial/hgrc.5.html\n"
diff --git a/i18n/sv.po b/i18n/sv.po
new file mode 100644
index 0000000..bbd3adc
--- /dev/null
+++ b/i18n/sv.po
@@ -0,0 +1,20113 @@
+# Swedish translation for Mercurial
+# Svensk översättning för Mercurial
+# Copyright (C) 2009-2012 Matt Mackall and others
+#
+# Translation dictionary:
+#
+# amend förändra
+# changeset ändring
+# commit arkivera
+# graft ympa
+# merge sammanfoga
+# strip avlägsna
+# tag märke
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2012-07-28 14:35+0200\n"
+"PO-Revision-Date: 2012-07-28 22:58+0200\n"
+"Last-Translator: Jens Bäckman <jens.backman@gmail.com>\n"
+"Language-Team: Swedish\n"
+"Language: Swedish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (standard: %s)"
+
+msgid "Options"
+msgstr "Flaggor"
+
+msgid "Commands"
+msgstr "Kommandon"
+
+msgid "Extensions"
+msgstr "Utökningar"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+"Den här sektioner innehåller hjälp för utökningar som levereras med "
+"Mercurial. Hjälp för andra utökningar är tillgängliga i hjälpsystemet."
+
+msgid "Options:"
+msgstr "Flaggor:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " alias: %s"
+
+msgid "hooks for controlling repository access"
+msgstr ""
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+
+msgid "The order in which access checks are performed is:"
+msgstr ""
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+
+msgid ""
+"Branch-based Access Control\n"
+"---------------------------"
+msgstr ""
+"Grenbaserad Ã…tkomstkontroll\n"
+"---------------------------"
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+
+msgid "The corresponding values can be either:"
+msgstr ""
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+
+msgid ""
+"You can add the \"!\" prefix to a user or group name to invert the sense\n"
+"of the match."
+msgstr ""
+
+msgid ""
+"Path-based Access Control\n"
+"-------------------------"
+msgstr ""
+"Sökvägsbaserad Åtkomstkontroll\n"
+"------------------------------"
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+
+msgid ""
+"Groups\n"
+"------"
+msgstr ""
+"Grupper\n"
+"-------"
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+
+msgid ""
+"Example Configuration\n"
+"---------------------"
+msgstr ""
+"Exempelkonfiguration\n"
+"--------------------"
+
+msgid "::"
+msgstr "::"
+
+msgid " [hooks]"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+
+msgid " [acl.deny.branches]"
+msgstr ""
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+
+msgid " [acl.allow.branches]"
+msgstr ""
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+
+msgid ""
+" # Everyone (except for \"user6\" and \"@hg-denied\" - see acl.deny above)\n"
+" # will have write access to any file under the \"resources\" folder\n"
+" # (except for 1 file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+
+msgid " .hgtags = release_engineer"
+msgstr ""
+
+msgid ""
+"Examples using the \"!\" prefix\n"
+"............................."
+msgstr ""
+
+msgid ""
+"Suppose there's a branch that only a given user (or group) should be able "
+"to\n"
+"push to, and you don't want to restrict access to any other branch that may\n"
+"be created."
+msgstr ""
+
+msgid ""
+"The \"!\" prefix allows you to prevent anyone except a given user or group "
+"to\n"
+"push changesets in a given branch or path."
+msgstr ""
+
+msgid ""
+"In the examples below, we will:\n"
+"1) Deny access to branch \"ring\" to anyone but user \"gollum\"\n"
+"2) Deny access to branch \"lake\" to anyone but members of the group \"hobbit"
+"\"\n"
+"3) Deny access to a file to anyone but user \"gollum\""
+msgstr ""
+
+msgid ""
+" [acl.allow.branches]\n"
+" # Empty"
+msgstr ""
+
+msgid ""
+" # 1) only 'gollum' can commit to branch 'ring';\n"
+" # 'gollum' and anyone else can still commit to any other branch.\n"
+" ring = !gollum"
+msgstr ""
+
+msgid ""
+" # 2) only members of the group 'hobbit' can commit to branch 'lake';\n"
+" # 'hobbit' members and anyone else can still commit to any other branch.\n"
+" lake = !@hobbit"
+msgstr ""
+
+msgid " # You can also deny access based on file paths:"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # Empty"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # 3) only 'gollum' can change the file below;\n"
+" # 'gollum' and anyone else can still change any other file.\n"
+" /misty/mountains/cave/ring = !gollum"
+msgstr ""
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr ""
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" denied on \"%s\" (changeset \"%s\")"
+msgstr "acl: användaren \"%s\" nekades på \"%s\" (ändringen \"%s\")"
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on \"%s\" (changeset \"%s\")"
+msgstr "acl: användaren \"%s\" tillåts inte på \"%s\" (ändringen \"%s\")"
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The comment is formatted using\n"
+"the Mercurial template mechanism."
+msgstr ""
+
+msgid ""
+"The bug references can optionally include an update for Bugzilla of the\n"
+"hours spent working on the bug. Bugs can also be marked fixed."
+msgstr ""
+
+msgid "Three basic modes of access to Bugzilla are provided:"
+msgstr ""
+
+msgid ""
+"1. Access via the Bugzilla XMLRPC interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"2. Check data via the Bugzilla XMLRPC interface and submit bug change\n"
+" via email to Bugzilla email interface. Requires Bugzilla 3.4 or later."
+msgstr ""
+
+msgid ""
+"3. Writing directly to the Bugzilla database. Only Bugzilla installations\n"
+" using MySQL are supported. Requires Python MySQLdb."
+msgstr ""
+
+msgid ""
+"Writing directly to the database is susceptible to schema changes, and\n"
+"relies on a Bugzilla contrib script to send out bug change\n"
+"notification emails. This script runs as the user running Mercurial,\n"
+"must be run on the host with the Bugzilla install, and requires\n"
+"permission to read Bugzilla configuration details and the necessary\n"
+"MySQL user and password to have full access rights to the Bugzilla\n"
+"database. For these reasons this access mode is now considered\n"
+"deprecated, and will not be updated for new Bugzilla versions going\n"
+"forward. Only adding comments is supported in this access mode."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC needs a Bugzilla username and password to be specified\n"
+"in the configuration. Comments are added under that username. Since the\n"
+"configuration must be readable by all Mercurial users, it is recommended\n"
+"that the rights of that user are restricted in Bugzilla to the minimum\n"
+"necessary to add comments. Marking bugs fixed requires Bugzilla 4.0 and "
+"later."
+msgstr ""
+
+msgid ""
+"Access via XMLRPC/email uses XMLRPC to query Bugzilla, but sends\n"
+"email to the Bugzilla email interface to submit comments to bugs.\n"
+"The From: address in the email is set to the email address of the Mercurial\n"
+"user, so the comment appears to come from the Mercurial user. In the event\n"
+"that the Mercurial user email is not recognised by Bugzilla as a Bugzilla\n"
+"user, the email associated with the Bugzilla username used to log into\n"
+"Bugzilla is used instead as the source of the comment. Marking bugs fixed\n"
+"works on all supported Bugzilla versions."
+msgstr ""
+
+msgid "Configuration items common to all access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.version\n"
+" This access type to use. Values recognised are:"
+msgstr ""
+
+msgid ""
+" :``xmlrpc``: Bugzilla XMLRPC interface.\n"
+" :``xmlrpc+email``: Bugzilla XMLRPC and email interfaces.\n"
+" :``3.0``: MySQL access, Bugzilla 3.0 and later.\n"
+" :``2.18``: MySQL access, Bugzilla 2.18 and up to but not\n"
+" including 3.0.\n"
+" :``2.16``: MySQL access, Bugzilla 2.16 and up to but not\n"
+" including 2.18."
+msgstr ""
+
+msgid ""
+"bugzilla.regexp\n"
+" Regular expression to match bug IDs for update in changeset commit "
+"message.\n"
+" It must contain one \"()\" named group ``<ids>`` containing the bug\n"
+" IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Bug 1234``, ``Bug no. 1234``,\n"
+" ``Bug number 1234``, ``Bugs 1234,5678``, ``Bug 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"bugzilla.fixregexp\n"
+" Regular expression to match bug IDs for marking fixed in changeset\n"
+" commit message. This must contain a \"()\" named group ``<ids>` "
+"containing\n"
+" the bug IDs separated by non-digit characters. It may also contain\n"
+" a named group ``<hours>`` with a floating-point number giving the\n"
+" hours worked on the bug. If no named groups are present, the first\n"
+" \"()\" group is assumed to contain the bug IDs, and work time is not\n"
+" updated. The default expression matches ``Fixes 1234``, ``Fixes bug "
+"1234``,\n"
+" ``Fixes bugs 1234,5678``, ``Fixes 1234 and 5678`` and\n"
+" variations thereof, followed by an hours number prefixed by ``h`` or\n"
+" ``hours``, e.g. ``hours 1.5``. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"bugzilla.fixstatus\n"
+" The status to set a bug to when marking fixed. Default ``RESOLVED``."
+msgstr ""
+
+msgid ""
+"bugzilla.fixresolution\n"
+" The resolution to set a bug to when marking fixed. Default ``FIXED``."
+msgstr ""
+
+msgid ""
+"bugzilla.style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"bugzilla.template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies:"
+msgstr ""
+
+msgid ""
+" :``{bug}``: The Bugzilla bug ID.\n"
+" :``{root}``: The full pathname of the Mercurial repository.\n"
+" :``{webroot}``: Stripped pathname of the Mercurial repository.\n"
+" :``{hgweb}``: Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default ``changeset {node|short} in repo {root} refers to bug\n"
+" {bug}.\\ndetails:\\n\\t{desc|tabindent}``"
+msgstr ""
+
+msgid ""
+"bugzilla.strip\n"
+" The number of path separator characters to strip from the front of\n"
+" the Mercurial repository path (``{root}`` in templates) to produce\n"
+" ``{webroot}``. For example, a repository with ``{root}``\n"
+" ``/var/local/my-project`` with a strip of 2 gives a value for\n"
+" ``{webroot}`` of ``my-project``. Default 0."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+" Base URL for browsing Mercurial repositories. Referenced from\n"
+" templates as ``{hgweb}``."
+msgstr ""
+
+msgid "Configuration items common to XMLRPC+email and MySQL access modes:"
+msgstr ""
+
+msgid ""
+"bugzilla.usermap\n"
+" Path of file containing Mercurial committer email to Bugzilla user email\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line::"
+msgstr ""
+
+msgid " committer = Bugzilla user"
+msgstr ""
+
+msgid " See also the ``[usermap]`` section."
+msgstr ""
+
+msgid ""
+"The ``[usermap]`` section is used to specify mappings of Mercurial\n"
+"committer email to Bugzilla user email. See also ``bugzilla.usermap``.\n"
+"Contains entries of the form ``committer = Bugzilla user``."
+msgstr ""
+
+msgid "XMLRPC access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzurl\n"
+" The base URL for the Bugzilla installation.\n"
+" Default ``http://localhost/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" The username to use to log into Bugzilla via XMLRPC. Default\n"
+" ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" The password for Bugzilla login."
+msgstr ""
+
+msgid ""
+"XMLRPC+email access mode uses the XMLRPC access mode configuration items,\n"
+"and also:"
+msgstr ""
+
+msgid ""
+"bugzilla.bzemail\n"
+" The Bugzilla email address."
+msgstr ""
+
+msgid ""
+"In addition, the Mercurial email settings must be configured. See the\n"
+"documentation in hgrc(5), sections ``[email]`` and ``[smtp]``."
+msgstr ""
+
+msgid "MySQL access mode configuration:"
+msgstr ""
+
+msgid ""
+"bugzilla.host\n"
+" Hostname of the MySQL server holding the Bugzilla database.\n"
+" Default ``localhost``."
+msgstr ""
+
+msgid ""
+"bugzilla.db\n"
+" Name of the Bugzilla database in MySQL. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.user\n"
+" Username to use to access MySQL server. Default ``bugs``."
+msgstr ""
+
+msgid ""
+"bugzilla.password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"bugzilla.timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"bugzilla.bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bugzilla.bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" ``/var/www/html/bugzilla``."
+msgstr ""
+
+msgid ""
+"bugzilla.notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, ``bzdir``, ``id`` (bug\n"
+" id) and ``user`` (committer bugzilla email). Default depends on\n"
+" version; from 2.18 it is \"cd %(bzdir)s && perl -T\n"
+" contrib/sendbugmail.pl %(id)s %(user)s\"."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configurations:"
+msgstr "Exempelkonfigurationer:"
+
+msgid ""
+"XMLRPC example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" baseurl=http://my-project.org/hg"
+msgstr ""
+
+msgid ""
+"XMLRPC+email example configuration. This uses the Bugzilla at\n"
+"``http://my-project.org/bugzilla``, logging in as user\n"
+"``bugmail@my-project.org`` with password ``plugh``. It is used with a\n"
+"collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. Bug comments\n"
+"are sent to the Bugzilla email address\n"
+"``bugzilla@my-project.org``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" bzurl=http://my-project.org/bugzilla\n"
+" user=bugmail@my-project.org\n"
+" password=plugh\n"
+" version=xmlrpc\n"
+" bzemail=bugzilla@my-project.org\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+
+msgid ""
+"MySQL example configuration. This has a local Bugzilla 3.2 installation\n"
+"in ``/opt/bugzilla-3.2``. The MySQL database is on ``localhost``,\n"
+"the Bugzilla database name is ``bugs`` and MySQL is\n"
+"accessed with MySQL username ``bugs`` password ``XYZZY``. It is used\n"
+"with a collection of Mercurial repositories in ``/var/local/hg/repos/``,\n"
+"with a web interface at ``http://my-project.org/hg``. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid "All the above add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://my-project.org/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr ""
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr ""
+
+msgid "unknown database schema"
+msgstr ""
+
+#, python-format
+msgid "bug %d does not exist\n"
+msgstr "bugg %d existerar inte\n"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr ""
+
+msgid "telling bugzilla to send mail:\n"
+msgstr ""
+
+#, python-format
+msgid " bug %s\n"
+msgstr ""
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr ""
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr ""
+
+msgid "done\n"
+msgstr ""
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr ""
+
+msgid "Bugzilla/MySQL cannot update bug state\n"
+msgstr ""
+
+msgid "Bugzilla/XMLRPC needs Bugzilla 4.0 or later to mark bugs fixed\n"
+msgstr ""
+
+msgid "configuration 'bzemail' missing"
+msgstr "'bzemail' inte konfigurerad"
+
+#, python-format
+msgid "default bugzilla user %s email not found"
+msgstr ""
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "bugzilla version %s stöds inte"
+
+#, python-format
+msgid "%s: invalid hours\n"
+msgstr "%s: ogiltiga timmar\n"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "Bugzilla error: %s"
+msgstr "Bugzilla-fel: %s"
+
+msgid "command to display child changesets (DEPRECATED)"
+msgstr "kommando för att visa barnändringar (FÖRLEGAD)"
+
+msgid ""
+"This extension is deprecated. You should use :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+msgstr ""
+"Detta är en förlegad utökning. Du kan avända :hg:`log -r\n"
+"\"children(REV)\"` instead.\n"
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "REV"
+msgstr "REV"
+
+msgid "show children of the specified revision"
+msgstr ""
+
+msgid "hg children [-r REV] [FILE]"
+msgstr ""
+
+msgid "command to display statistics about repository history"
+msgstr ""
+
+#, python-format
+msgid "revision %d is a merge, ignoring...\n"
+msgstr ""
+
+msgid "analyzing"
+msgstr "analyserar"
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> = <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr "hoppar över defekt alias: %s\n"
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+msgid "DATE"
+msgstr "DATUM"
+
+msgid "count rate for revisions matching date spec"
+msgstr ""
+
+msgid "TEMPLATE"
+msgstr "MALL"
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "FORMAT"
+msgstr "FORMAT"
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "display added/removed lines separately"
+msgstr "visa tillagda/raderade rader separat"
+
+msgid "FILE"
+msgstr "FIL"
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr "hg churn [-d DATUM] [-r REV] [--aliases FIL] [FIL]"
+
+msgid "colorize output from some commands"
+msgstr "färglägg utmatning från vissa kommandon"
+
+msgid ""
+"This extension modifies the status and resolve commands to add color\n"
+"to their output to reflect file status, the qseries command to add\n"
+"color to reflect patch status (applied, unapplied, missing), and to\n"
+"diff-related commands to highlight additions, removals, diff headers,\n"
+"and trailing whitespace."
+msgstr ""
+"Denna utökning modifierar kommandona status och resolve för att färglägga\n"
+"deras utmaning för att spegla filstatus, qseries-kommandon för att\n"
+"färglägga patchstatus (applicerad, oapplicerad, saknad), och till\n"
+"diff-relaterade kommandon för att framhäva additioner, borttagningar,\n"
+"diffhuvuden, och eftersläpande blanktecken."
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. By default, the terminfo database is used to find the\n"
+"terminal codes used to change color and effect. If terminfo is not\n"
+"available, then effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes)."
+msgstr ""
+"Andra effekter förutom färg, såsom fet och understryken text, är också\n"
+"tillgänglig. Som standard används terminfo-databasen för att hitta\n"
+"terminalkoderna för att ändra färg och effekt. Om terminfo inte är\n"
+"tillgänglig, så renderas effekterna med kontrollfunktionerna ECMA-48 SGR\n"
+"(ANSI-escape-koder)."
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr "Standardeffekter kan modifieras från din konfigurationsfil::"
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+" # 'none' stänger av alla effekter\n"
+" status.clean = none\n"
+" status.copied = none"
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+
+msgid " bookmarks.current = green"
+msgstr " bookmarks.current = green"
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+
+msgid ""
+" tags.normal = green\n"
+" tags.local = black bold"
+msgstr ""
+" tags.normal = green\n"
+" tags.local = black bold"
+
+msgid ""
+"The available effects in terminfo mode are 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', and 'underline'; in\n"
+"ECMA-48 mode, the options are 'bold', 'inverse', 'italic', and\n"
+"'underline'. How each is rendered depends on the terminal emulator.\n"
+"Some may not be available for a given terminal type, and will be\n"
+"silently ignored."
+msgstr ""
+"De tillgängliga effekterna i terminfo-läge är 'blink', 'bold', 'dim',\n"
+"'inverse', 'invisible', 'italic', 'standout', och 'underline'; i\n"
+"ECMA-48-läge, så är 'bold', 'inverse', 'italic', och 'underline'\n"
+"tillgängliga. Hur varje effekt renderas beror på terminalemulatorn. Vissa\n"
+"kan vara otillgängliga för en viss terminaltyp, och kommer att ignoreras i\n"
+"det tysta."
+
+msgid ""
+"Note that on some systems, terminfo mode may cause problems when using\n"
+"color with the pager extension and less -R. less with the -R option\n"
+"will only display ECMA-48 color codes, and terminfo mode may sometimes\n"
+"emit codes that less doesn't understand. You can work around this by\n"
+"either using ansi mode (or auto mode), or by using less -r (which will\n"
+"pass through all terminal control codes, not just color control\n"
+"codes)."
+msgstr ""
+"Notera att på vissa system kan terminfo-läget orsaka problem när color-\n"
+"och pager-utökningarna används med less -R. less med flaggan -R kommer bara\n"
+"att visa ECMA-48-färgkoder, och terminfo kan sända koder som less inte\n"
+"förstår. Du kan gå runt detta genom att endera använda ansi-läge (eller\n"
+"auto-läge), eller att använda less -r (som skickar vidare alla\n"
+"terminalkoder, inte bara färgkoder)."
+
+msgid ""
+"Because there are only eight standard colors, this module allows you\n"
+"to define color names for other color slots which might be available\n"
+"for your terminal type, assuming terminfo mode. For instance::"
+msgstr ""
+"Eftersom det bara finns åtta standardfärger, tillåter denna modul dig att\n"
+"definiera färgnamn för andra färgnummer som är tillgängliga för din\n"
+"terminaltyp. Exempelvis::"
+
+msgid ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+msgstr ""
+" color.brightblue = 12\n"
+" color.pink = 207\n"
+" color.orange = 202"
+
+msgid ""
+"to set 'brightblue' to color slot 12 (useful for 16 color terminals\n"
+"that have brighter colors defined in the upper eight) and, 'pink' and\n"
+"'orange' to colors in 256-color xterm's default color cube. These\n"
+"defined colors may then be used as any of the pre-defined eight,\n"
+"including appending '_background' to set the background to that color."
+msgstr ""
+"för att sätta 'brightblue' till färgnummer 12 (användbart för terminaler\n"
+"med 16 färger som har ljusare färger definierade bland de övre åtta), samt\n"
+"'pink' och 'orange' till färger i 256-färgs terminalfärger. Dessa\n"
+"definierade färger kan sedan användas som vilken som helst av de\n"
+"fördefinierade åtta, inklusive att lägga till '_background' för att sätta\n"
+"bakgrunden till den färgen."
+
+msgid ""
+"By default, the color extension will use ANSI mode (or win32 mode on\n"
+"Windows) if it detects a terminal. To override auto mode (to enable\n"
+"terminfo mode, for example), set the following configuration option::"
+msgstr ""
+"Som standard kommer color-utökningen att använda ANSI-läge (eller\n"
+"win32-läge i Windows) om en terminal upptäcks. För att upphäva auto-läge\n"
+"(för att exempelvis aktivera terminfo-läge), sätt följande\n"
+"konfigurationsflagga::"
+
+msgid ""
+" [color]\n"
+" mode = terminfo"
+msgstr ""
+" [color]\n"
+" mode = terminfo"
+
+msgid ""
+"Any value other than 'ansi', 'win32', 'terminfo', or 'auto' will\n"
+"disable color.\n"
+msgstr ""
+"Ett värde skilt från 'ansi', 'win32', 'terminfo' eller 'auto' stänger av\n"
+"färg.\n"
+
+msgid "no terminfo entry for setab/setaf: reverting to ECMA-48 color\n"
+msgstr "ingen terminfo-post för setab/setaf: återgår till ECMA-48-färger\n"
+
+#, python-format
+msgid "warning: failed to set color mode to %s\n"
+msgstr "varning: kunde inte sätta färgläge till %s\n"
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "ignorerar okänd färg/effekt %r (konfigurerad i color.%s)\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr "när färgläggning ska ske (boolean, always, auto eller never)"
+
+msgid "TYPE"
+msgstr "TYP"
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+" Om ingen destinationskatalog anges, kommer basnamnet för källan med\n"
+" ``-hg`` tillagd. Om destinationsarkivet inte existerar, så kommer det\n"
+" att skapas."
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If ``REVMAP`` isn't given, it will be put in a default location\n"
+" (``<dest>/.hg/shamap`` by default). The ``REVMAP`` is a simple\n"
+" text file that maps each source commit ID to the destination ID\n"
+" for that revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+
+msgid " source author = destination author"
+msgstr ""
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+
+msgid " include path/to/file-or-dir"
+msgstr " include sökväg/till/fil-eller-katalog"
+
+msgid " exclude path/to/file-or-dir"
+msgstr " exclude sökväg/till/fil-eller-katalog"
+
+msgid " rename path/to/source path/to/destination"
+msgstr " rename sökväg/till/källa sökväg/till/destination"
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+
+msgid " key parent1, parent2"
+msgstr ""
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+
+msgid " original_branch_name new_branch_name"
+msgstr ""
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ################"
+msgstr ""
+" Mercurial-källa\n"
+" ###############"
+
+msgid ""
+" The Mercurial source recognizes the following configuration\n"
+" options, which you can set on the command line with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.hg.ignoreerrors: ignore integrity errors when reading.\n"
+" Use it to fix Mercurial repositories with missing revlogs, by\n"
+" converting from and to Mercurial. Default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.saverev: store original revision ID in changeset\n"
+" (forces target IDs to change). It takes a boolean argument and\n"
+" defaults to False."
+msgstr ""
+
+msgid ""
+" :convert.hg.startrev: convert start revision and its descendants.\n"
+" It takes a hg revision identifier and defaults to 0."
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ##########"
+msgstr ""
+" CVS-källa\n"
+" #########"
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is ``:local:``. The conversion uses the top level\n"
+" directory in the sandbox to find the CVS repository, and then uses\n"
+" CVS rlog commands to find files to convert. This means that unless\n"
+" a filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The following options can be used with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.cache: Set to False to disable remote log caching,\n"
+" for testing and debugging purposes. Default is True."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.fuzz: Specify the maximum time (in seconds) that is\n"
+" allowed between commits with identical user and log message in\n"
+" a single changeset. When very large files were checked in as\n"
+" part of a changeset then the default may not be long enough.\n"
+" The default is 60."
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergeto: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will insert a dummy revision merging the\n"
+" branch on which this log message occurs to the branch\n"
+" indicated in the regex. Default is ``{{mergetobranch\n"
+" ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :convert.cvsps.mergefrom: Specify a regular expression to which\n"
+" commit log messages are matched. If a match occurs, then the\n"
+" conversion process will add the most recent revision on the\n"
+" branch indicated in the regex as the second parent of the\n"
+" changeset. Default is ``{{mergefrombranch ([-\\w]+)}}``"
+msgstr ""
+
+msgid ""
+" :hook.cvslog: Specify a Python function to be called at the end of\n"
+" gathering the CVS log. The function is passed a list with the\n"
+" log entries, and can modify the entries in-place, or add or\n"
+" delete them."
+msgstr ""
+
+msgid ""
+" :hook.cvschangesets: Specify a Python function to be called after\n"
+" the changesets are calculated from the CVS log. The\n"
+" function is passed a list with the changeset entries, and can\n"
+" modify the changesets in-place, or add or delete them."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" #################"
+msgstr ""
+" Subversion-källa\n"
+" ################"
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied ``svn://repo/path/`` source URL is\n"
+" converted as a single branch. If ``svn://repo/path/trunk`` exists\n"
+" it replaces the default branch. If ``svn://repo/path/branches``\n"
+" exists, its subdirectories are listed as possible branches. If\n"
+" ``svn://repo/path/tags`` exists, it is looked for tags referencing\n"
+" converted branches. Default ``trunk``, ``branches`` and ``tags``\n"
+" values can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid " The following options can be set with ``--config``:"
+msgstr ""
+
+msgid ""
+" :convert.svn.branches: specify the directory containing branches.\n"
+" The default is ``branches``."
+msgstr ""
+
+msgid ""
+" :convert.svn.tags: specify the directory containing tags. The\n"
+" default is ``tags``."
+msgstr ""
+
+msgid ""
+" :convert.svn.trunk: specify the name of the trunk branch. The\n"
+" default is ``trunk``."
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" :convert.svn.startrev: specify start Subversion revision number.\n"
+" The default is 0."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" ###############"
+msgstr ""
+" Perforce-källa\n"
+" ##############"
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ``...-hg``."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision:"
+msgstr ""
+
+msgid ""
+" :convert.p4.startrev: specify initial Perforce revision (a\n"
+" Perforce changelist number)."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" #####################"
+msgstr ""
+" Mercurial-destination\n"
+" #####################"
+
+msgid " The following options are supported:"
+msgstr ""
+
+msgid ""
+" :convert.hg.clonebranches: dispatch source branches in separate\n"
+" clones. The default is False."
+msgstr ""
+
+msgid ""
+" :convert.hg.tagsbranch: branch name for tag revisions, defaults to\n"
+" ``default``."
+msgstr ""
+
+msgid ""
+" :convert.hg.usebranchnames: preserve branch names. The default is\n"
+" True.\n"
+" "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "remap usernames using this file"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr ""
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr ""
+
+msgid ":svnrev: String. Converted subversion revision number."
+msgstr ""
+
+msgid ":svnpath: String. Converted subversion revision project path."
+msgstr ""
+
+msgid ":svnuuid: String. Converted subversion revision repository identifier."
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s verkar inte vara ett Bazaar-arkiv"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Bazaar-moduler kunde inte laddas"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision"
+msgstr "%s är inte en giltig revision"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr ""
+
+#, python-format
+msgid "%s error:\n"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): child parent1[,parent2] expected"
+msgstr ""
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: ogiltig typ för källarkiv"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr ""
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: ogiltig typ för destinationsarkiv"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "convert: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: okänd arkivtyp"
+
+msgid "getting files"
+msgstr "hämtar filer"
+
+msgid "revisions"
+msgstr "revisioner"
+
+msgid "scanning"
+msgstr "skannar"
+
+#, python-format
+msgid "splice map revision %s is not being converted, ignoring\n"
+msgstr ""
+
+#, python-format
+msgid "unknown splice map parent: %s"
+msgstr ""
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr ""
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr ""
+
+msgid "not all revisions were sorted"
+msgstr ""
+
+#, python-format
+msgid "writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr "skannar källa...\n"
+
+msgid "sorting...\n"
+msgstr "sorterar...\n"
+
+msgid "converting...\n"
+msgstr "konverterar...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "källa: %s\n"
+
+msgid "converting"
+msgstr "konverterar"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr ""
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s verkar inte vara en CVS-uthämtning"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr ""
+
+msgid "CVS pserver authentication failed"
+msgstr ""
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr ""
+
+msgid "malformed response from CVS"
+msgstr "förvrängt svar från CVS"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr ""
+
+msgid "collecting CVS rlog\n"
+msgstr ""
+
+msgid "not a CVS sandbox"
+msgstr "inte en CVS-sandlåda"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr ""
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr ""
+
+#, python-format
+msgid "running %s\n"
+msgstr ""
+
+msgid "RCS file must be followed by working file"
+msgstr ""
+
+msgid "must have at least some revisions"
+msgstr ""
+
+msgid "expected revision number"
+msgstr ""
+
+msgid "revision must be followed by date line"
+msgstr ""
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr "loggcache överlappar med nya loggningar, kör igen utan cache."
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d log entries\n"
+msgstr ""
+
+msgid "creating changesets\n"
+msgstr ""
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s verkar inte vara ett darcs-arkiv"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr ""
+
+msgid "Python ElementTree module is not available"
+msgstr ""
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr ""
+
+msgid "failed to detect repository format!"
+msgstr ""
+
+msgid "internal calling inconsistency"
+msgstr ""
+
+msgid "errors in filemap"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr ""
+
+msgid "source repository doesn't support --filemap"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s verkar inte vara ett Git-arkiv"
+
+msgid "cannot retrieve git heads"
+msgstr "kan inte hämta git-huvuden"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr "kan inte läsa %r-objekt som %s"
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "kan inte läsa ändringar i %s"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "kan inte läsa märken från %s"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s verkar inte vara ett GNU Arch-arkiv"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "kan inte hitta ett GNU Arch-verktyg"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr "analyserar trädversion %s...\n"
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s är inte ett lokalt Mercurial-arkiv"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr ""
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr "kunde inte skapa hg-arkiv %s för lagring"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "drar från %s till %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr "filtrerar bort tom revision\n"
+
+msgid "updating tags\n"
+msgstr "uppdaterar märken\n"
+
+msgid "updating bookmarks\n"
+msgstr "uppdaterar bokmärken\n"
+
+#, python-format
+msgid ""
+"revision %s not found in destination repository (lookups with "
+"clonebranches=true are not implemented)"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr ""
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "ignorerar: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s verkar inte vara ett monotone-arkiv"
+
+msgid "bad mtn packet - no end of commandnbr"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad stream type %s"
+msgstr ""
+
+msgid "bad mtn packet - no divider before size"
+msgstr ""
+
+msgid "bad mtn packet - no end of packet size"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - bad packet size %s"
+msgstr ""
+
+#, python-format
+msgid "bad mtn packet - unable to read full packet read %s of %s"
+msgstr ""
+
+#, python-format
+msgid "mtn command '%s' returned %s"
+msgstr "mtn-kommandot '%s' returnerade %s"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+msgid "unable to determine mtn automate interface version"
+msgstr ""
+
+#, python-format
+msgid "mtn automate stdio header unexpected: %s"
+msgstr ""
+
+msgid "failed to reach end of mtn automate stdio headers"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s verkar inte vara ett P4-arkiv"
+
+msgid "reading p4 views\n"
+msgstr ""
+
+msgid "collecting p4 changelists\n"
+msgstr ""
+
+msgid "debugsvnlog could not load Subversion python bindings"
+msgstr ""
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+#, python-format
+msgid "log stream exception '%s'"
+msgstr ""
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s verkar inte vara ett Subversion-arkiv"
+
+msgid "could not load Subversion python bindings"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr ""
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr ""
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr ""
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr ""
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr ""
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr ""
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr ""
+
+#, python-format
+msgid "svn: revision %s not found"
+msgstr "svn: revisionen %s hittades inte"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr ""
+
+msgid "scanning paths"
+msgstr "skannar sökvägar"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr ""
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "initialiserar svn-arkivet %r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "initialiserar svn-arbetskopia %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr ""
+
+msgid "unable to cope with svn output"
+msgstr ""
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"splice map revision %s not found in subversion child map (revision lookups "
+"are not implemented)"
+msgstr ""
+
+msgid "automatically manage newlines in repository files"
+msgstr ""
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file found in the root of the working copy. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+
+msgid ""
+"The ``[patterns]`` section specifies how line endings should be\n"
+"converted between the working copy and the repository. The format is\n"
+"specified by a file pattern. The first match is used, so put more\n"
+"specific patterns first. The available line endings are ``LF``,\n"
+"``CRLF``, and ``BIN``."
+msgstr ""
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out and stored in the repository in that format and files\n"
+"declared to be binary (``BIN``) are left unchanged. Additionally,\n"
+"``native`` is an alias for checking out in the platform's default line\n"
+"ending: ``LF`` on Unix (including Mac OS X) and ``CRLF`` on\n"
+"Windows. Note that ``BIN`` (do nothing to line endings) is Mercurial's\n"
+"default behaviour; it is only needed if you need to override a later,\n"
+"more general pattern."
+msgstr ""
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr ""
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The rules will first apply when files are touched in the working\n"
+" copy, e.g. by updating to null and back to tip to touch all files."
+msgstr ""
+
+msgid ""
+"The extension uses an optional ``[eol]`` section read from both the\n"
+"normal Mercurial configuration files and the ``.hgeol`` file, with the\n"
+"latter overriding the former. You can use that section to control the\n"
+"overall behavior. There are three settings:"
+msgstr ""
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+
+msgid ""
+"- ``eol.fix-trailing-newline`` (default False) can be set to True to\n"
+" ensure that converted files end with a EOL character (either ``\\n``\n"
+" or ``\\r\\n`` as per the configured patterns)."
+msgstr ""
+
+msgid ""
+"The extension provides ``cleverencode:`` and ``cleverdecode:`` filters\n"
+"like the deprecated win32text extension does. This means that you can\n"
+"disable win32text and enable eol and your filters will still work. You\n"
+"only need to these filters until you have prepared a ``.hgeol`` file."
+msgstr ""
+
+msgid ""
+"The ``win32text.forbid*`` hooks provided by the win32text extension\n"
+"have been unified into a single hook named ``eol.checkheadshook``. The\n"
+"hook will lookup the expected line endings from the ``.hgeol`` file,\n"
+"which means you must migrate to a ``.hgeol`` file first before using\n"
+"the hook. ``eol.checkheadshook`` only checks heads, intermediate\n"
+"invalid revisions will be pushed. To forbid them completely, use the\n"
+"``eol.checkallhook`` hook. These hooks are best used as\n"
+"``pretxnchangegroup`` hooks."
+msgstr ""
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+"Se :hg:`help patterns` för mer information om de använda glob-mönstren.\n"
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "ignorerar okänd EOL-stil '%s' från %s\n"
+
+#, python-format
+msgid "warning: ignoring .hgeol file due to parse error at %s: %s\n"
+msgstr "varning: ignorerar .hgeol-fil, parsningsfel vid %s: %s\n"
+
+#, python-format
+msgid " %s in %s should not have %s line endings"
+msgstr " %s i %s borde inte ha %s-radslut"
+
+msgid "end-of-line check failed:\n"
+msgstr "radslutskontroll misslyckades:\n"
+
+msgid "the eol extension is incompatible with the win32text extension\n"
+msgstr "eol-utökningen är inkompatibel med win32text-utökningen\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr "inkonsekvent radslutsstil i %s\n"
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows you to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f \"+next\" \\\n"
+" \"+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))\""
+msgstr ""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $root - repository root\n"
+" $parent is an alias for $parent1."
+msgstr ""
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr ""
+
+msgid "cleaning up temp directory\n"
+msgstr ""
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+" När två revisionsargument ges, kommer ändringar mellan revisionerna\n"
+" att visas. Om bara en revision anges så jämförs den revisionen med\n"
+" arbetskatalogen, och, när ingen revision anges, jämförs arbetskatalogen\n"
+" med dess förälder."
+
+msgid "CMD"
+msgstr "KMD"
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "OPT"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "revision"
+msgstr "revision"
+
+msgid "change made by revision"
+msgstr "ändring gjord av revision"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr ""
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "http authentication with factotum"
+msgstr ""
+
+msgid ""
+"This extension allows the factotum(4) facility on Plan 9 from Bell Labs\n"
+"platforms to provide authentication information for HTTP access. "
+"Configuration\n"
+"entries specified in the auth section as well as authentication information\n"
+"provided in the repository URL are fully supported. If no prefix is "
+"specified,\n"
+"a value of \"*\" will be assumed."
+msgstr ""
+
+msgid "By default, keys are specified as::"
+msgstr ""
+
+msgid ""
+" proto=pass service=hg prefix=<prefix> user=<username> !password=<password>"
+msgstr ""
+
+msgid ""
+"If the factotum extension is unable to read the required key, one will be\n"
+"requested interactively."
+msgstr ""
+
+msgid ""
+"A configuration section is available to customize runtime behavior. By\n"
+"default, these entries are::"
+msgstr ""
+
+msgid ""
+" [factotum]\n"
+" executable = /bin/auth/factotum\n"
+" mountpoint = /mnt/factotum\n"
+" service = hg"
+msgstr ""
+
+msgid ""
+"The executable entry defines the full path to the factotum binary. The\n"
+"mountpoint entry defines the path to the factotum file service. Lastly, the\n"
+"service entry controls the service name used when reading keys."
+msgstr ""
+
+msgid "factotum not interactive"
+msgstr ""
+
+msgid "factotum not responding"
+msgstr ""
+
+msgid "pull, update and merge in one command (DEPRECATED)"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge is needed, the working directory is first updated to\n"
+" the newly pulled changes. Local changes are then merged into the\n"
+" pulled changes. To switch the merge order, use --switch-parent."
+msgstr ""
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr " Se :hg:`help dates` för en lista med giltiga format för -d/--date."
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades.\n"
+" "
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+"arbetskatalogen är inte på grentoppen (använd \"hg update\" för att hämta ut "
+"grentoppen)"
+
+msgid "outstanding uncommitted merge"
+msgstr "kvarvarande oarkiverad sammanfogning"
+
+msgid "outstanding uncommitted changes"
+msgstr "kvarvarande oarkiverade ändringar"
+
+msgid "working directory is missing some files"
+msgstr "arbetskatalogen saknar några filer"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+"flera huvuden i denna gren (använd \"hg heads .\" och \"hg merge\" för att "
+"sammanfoga)"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "drar från %s\n"
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+"det andra arkivet stödjer inte revisionsuppslag, så en revision kan inte "
+"anges."
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+"sammanfogar inte med %d andra nya grenhuvuden (använd \"hg heads .\" och "
+"\"hg merge\" för att sammanfoga dem)\n"
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "uppdaterar till %d:%s\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "sammanfogar med %d:%s\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr "nya ändringen %d:%s sammanfogar fjärrändringar med lokala\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "en specifik revision som du vill dra"
+
+msgid "edit commit message"
+msgstr "redigera arkiveringsmeddelande"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "redigera arkiveringsmeddelande (FÖRÅLDRAD)"
+
+msgid "switch parents when merging"
+msgstr "byt föräldrar vid sammanfogning"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [KÄLLA]"
+
+msgid "commands to sign and verify changesets"
+msgstr "kommandon för att signera och verifiera ändringar"
+
+msgid "error while verifying signature"
+msgstr "fel vid verifiering av signatur"
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr "%s Dålig signatur från \"%s\"\n"
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr "%s Notera: Signaturen har gått ut (signerad av: \"%s\")\n"
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr "%s Notera: Den här nyckenl har gått ut (signerad av: \"%s\")\n"
+
+msgid "hg sigs"
+msgstr "hg sigs"
+
+msgid "list signed changesets"
+msgstr "visa signerade ändringar"
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "%s:%d noden existerar inte\n"
+
+msgid "hg sigcheck REV"
+msgstr "hg sigcheck REV"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr "verifiera alla signaturerna som finns för en viss revision"
+
+#, python-format
+msgid "no valid signature for %s\n"
+msgstr "ingen giltig signatur för %s\n"
+
+msgid "make the signature local"
+msgstr "gör signaturen lokal"
+
+msgid "sign even if the sigfile is modified"
+msgstr "signera även om signaturfilen är modifierad"
+
+msgid "do not commit the sigfile after signing"
+msgstr "arkivera inte signaturfilen efter signering"
+
+msgid "ID"
+msgstr "ID"
+
+msgid "the key id to sign with"
+msgstr "nyckel-ID att signera med"
+
+msgid "TEXT"
+msgstr "TEXT"
+
+msgid "commit message"
+msgstr "arkiveringsmeddelande"
+
+msgid "hg sign [OPTION]... [REV]..."
+msgstr "hg sign [FLAGGA]... [REV]..."
+
+msgid "add a signature for the current or given revision"
+msgstr "lägg till en signatur för den aktuella eller angivna revisionen"
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Om ingen revision anges, så används arbetskatalogens föräldern, eller\n"
+" toppen om ingen revision är uthämtad."
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+" Se :hg:`help dates` för en lista med giltiga format för -d/--date.\n"
+" "
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr "oarkiverad sammanfogning - ange en specifik revision"
+
+#, python-format
+msgid "signing %d:%s\n"
+msgstr "signerar %d:%s\n"
+
+msgid "error while signing"
+msgstr "fel vid signering"
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+"arbetskopian av .hgsigs är ändrad (arkivera .hgsigs manuellt eller använd\n"
+"--force)"
+
+msgid "unknown signature version"
+msgstr "okänd signaturversion"
+
+msgid "command to view revision graphs from a shell"
+msgstr "kommando för att se revisionsgrafer i ett skal"
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+"Denna utökning lägger till flaggan --graph till kommandona incoming,\n"
+"outgoing och log. När flaggan anges, visas också en ASCII-version av\n"
+"revisionsgrafen.\n"
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+"följ ändringshistorik, eller filhistorik över kopieringar och namnbyten"
+
+msgid "only follow the first parent of merge changesets (DEPRECATED)"
+msgstr "följ bara den första föräldern vid sammanfogningar (FÖRLEGAD)"
+
+msgid "show revisions matching date spec"
+msgstr "visa revisioner som matchar datumspecen"
+
+msgid "show copied files"
+msgstr "visa kopierade filer"
+
+msgid "do case-insensitive search for a given text"
+msgstr "gör versalokänslig sökning efter en given text"
+
+msgid "show the specified revision or range"
+msgstr "visa den specifika revisionen eller serien"
+
+msgid "include revisions where files were removed"
+msgstr "inkludera revisioner där filer togs bort"
+
+msgid "show only merges (DEPRECATED)"
+msgstr "visa bara sammanfogningar (FÖRLEGAD)"
+
+msgid "USER"
+msgstr "ANVÄNDARE"
+
+msgid "revisions committed by user"
+msgstr "revisioner arkiverade av användare"
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr "visa bara ändringar i den namngivna grenen (FÖRLEGAD)"
+
+msgid "BRANCH"
+msgstr "GREN"
+
+msgid "show changesets within the given named branch"
+msgstr "visa ändringar i den namngivna grenen"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "visa inte revision eller någon av dess föräldrar"
+
+msgid "show hidden changesets (DEPRECATED)"
+msgstr "visa dolda ändringar (FÖRLEGAD)"
+
+msgid "[OPTION]... [FILE]"
+msgstr "[FLAGGA]... [FIL]"
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr "visa revisionshistorik vid sidan av en ASCII-revisionsgraf"
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+" Visa en revisionshistorik bredvid en revisionsgraf ritad med\n"
+" ASCII-tecken."
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+" Noder visade som ett @-tecken är föräldrar till arbetskatalogen.\n"
+" "
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}{webroot}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False\n"
+" # number of slashes to strip for url paths\n"
+" #strip = 0"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr "%s returnerade ett fel: %s"
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr ""
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr ""
+
+msgid "NUM"
+msgstr "NUM"
+
+msgid "limit number of changes displayed"
+msgstr "begränsa antalet visade ändringar"
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr ""
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr ""
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+#. i18n: bisect changeset status
+msgid "ignored"
+msgstr "ignorerad"
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr ""
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr ""
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr ""
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr "syntaxfärgning för hgweb (kräver Pygments)"
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+"Den beror på syntaxfärgningsbiblioteket Pygments:\n"
+"http://pygments.org/"
+
+msgid "There is a single configuration option::"
+msgstr "Det finns ett enda konfigurationsalternativ::"
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+" [web]\n"
+" pygments_style = <style>"
+
+msgid "The default is 'colorful'.\n"
+msgstr "Som standard används 'colorful'.\n"
+
+msgid "interactive history editing"
+msgstr "interaktiv historieredigering"
+
+msgid ""
+"With this extension installed, Mercurial gains one new command: histedit. "
+"Usage\n"
+"is as follows, assuming the following history::"
+msgstr ""
+"Med denna utökning installerad, så får Mercurial ett nytt kommando: \n"
+"histedit. Det används som följer, förutsatt denna historia::"
+
+msgid ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+" @ 3[tip] 7c2fd3b9020c 2009-04-27 18:04 -0500 durin42\n"
+" | Add delta\n"
+" |\n"
+" o 2 030b686bedc4 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 1 c561b4e977df 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+
+msgid ""
+"If you were to run ``hg histedit c561b4e977df``, you would see the "
+"following\n"
+"file open in your editor::"
+msgstr ""
+"Om du skulle köra ``hg histedit c561b4e977df``, så skulle den följande \n"
+"filen öppnas i din editor::"
+
+msgid ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+msgstr ""
+" pick c561b4e977df Add beta\n"
+" pick 030b686bedc4 Add gamma\n"
+" pick 7c2fd3b9020c Add delta"
+
+msgid ""
+" # Edit history between 633536316234 and 7c2fd3b9020c\n"
+" #\n"
+" # Commands:\n"
+" # p, pick = use commit\n"
+" # e, edit = use commit, but stop for amending\n"
+" # f, fold = use commit, but fold into previous commit\n"
+" # d, drop = remove commit from history\n"
+" # m, mess = edit message without changing commit content\n"
+" #\n"
+" 0 files updated, 0 files merged, 0 files removed, 0 files unresolved"
+msgstr ""
+
+msgid ""
+"In this file, lines beginning with ``#`` are ignored. You must specify a "
+"rule\n"
+"for each revision in your history. For example, if you had meant to add "
+"gamma\n"
+"before beta, and then wanted to add delta in the same revision as beta, you\n"
+"would reorganize the file to look like this::"
+msgstr ""
+
+msgid ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+msgstr ""
+" pick 030b686bedc4 Add gamma\n"
+" pick c561b4e977df Add beta\n"
+" fold 7c2fd3b9020c Add delta"
+
+msgid ""
+"At which point you close the editor and ``histedit`` starts working. When "
+"you\n"
+"specify a ``fold`` operation, ``histedit`` will open an editor when it "
+"folds\n"
+"those revisions together, offering you a chance to clean up the commit "
+"message::"
+msgstr ""
+
+msgid ""
+" Add beta\n"
+" ***\n"
+" Add delta"
+msgstr ""
+
+msgid ""
+"Edit the commit message to your liking, then close the editor. For\n"
+"this example, let's assume that the commit message was changed to\n"
+"``Add beta and delta.`` After histedit has run and had a chance to\n"
+"remove any old or temporary revisions it needed, the history looks\n"
+"like this::"
+msgstr ""
+
+msgid ""
+" @ 2[tip] 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+
+msgid ""
+"Note that ``histedit`` does *not* remove any revisions (even its own "
+"temporary\n"
+"ones) until after it has completed all the editing operations, so it will\n"
+"probably perform several strip operations when it's done. For the above "
+"example,\n"
+"it had to run strip twice. Strip can be slow depending on a variety of "
+"factors,\n"
+"so you might need to be a little patient. You can choose to keep the "
+"original\n"
+"revisions by passing the ``--keep`` flag."
+msgstr ""
+
+msgid ""
+"The ``edit`` operation will drop you back to a command prompt,\n"
+"allowing you to edit files freely, or even use ``hg record`` to commit\n"
+"some changes as a separate commit. When you're done, any remaining\n"
+"uncommitted changes will be committed as well. When done, run ``hg\n"
+"histedit --continue`` to finish this step. You'll be prompted for a\n"
+"new commit message, but the default commit message will be the\n"
+"original message for the ``edit`` ed revision."
+msgstr ""
+
+msgid ""
+"The ``message`` operation will give you a chance to revise a commit\n"
+"message without changing the contents. It's a shortcut for doing\n"
+"``edit`` immediately followed by `hg histedit --continue``."
+msgstr ""
+
+msgid ""
+"If ``histedit`` encounters a conflict when moving a revision (while\n"
+"handling ``pick`` or ``fold``), it'll stop in a similar manner to\n"
+"``edit`` with the difference that it won't prompt you for a commit\n"
+"message when done. If you decide at this point that you don't like how\n"
+"much work it will be to rearrange history, or that you made a mistake,\n"
+"you can use ``hg histedit --abort`` to abandon the new changes you\n"
+"have made and return to the state before you attempted to edit your\n"
+"history."
+msgstr ""
+
+msgid ""
+"If we clone the example repository above and add three more changes, such "
+"that\n"
+"we have the following history::"
+msgstr ""
+
+msgid ""
+" @ 6[tip] 038383181893 2009-04-27 18:04 -0500 stefan\n"
+" | Add theta\n"
+" |\n"
+" o 5 140988835471 2009-04-27 18:04 -0500 stefan\n"
+" | Add eta\n"
+" |\n"
+" o 4 122930637314 2009-04-27 18:04 -0500 stefan\n"
+" | Add zeta\n"
+" |\n"
+" o 3 836302820282 2009-04-27 18:04 -0500 stefan\n"
+" | Add epsilon\n"
+" |\n"
+" o 2 989b4d060121 2009-04-27 18:04 -0500 durin42\n"
+" | Add beta and delta.\n"
+" |\n"
+" o 1 081603921c3f 2009-04-27 18:04 -0500 durin42\n"
+" | Add gamma\n"
+" |\n"
+" o 0 d8d2fcd0e319 2009-04-27 18:04 -0500 durin42\n"
+" Add alpha"
+msgstr ""
+
+msgid ""
+"If you run ``hg histedit --outgoing`` on the clone then it is the same\n"
+"as running ``hg histedit 836302820282``. If you need plan to push to a\n"
+"repository that Mercurial does not detect to be related to the source\n"
+"repo, you can add a ``--force`` option.\n"
+msgstr ""
+
+msgid "cannot edit history that would orphan nodes"
+msgstr ""
+
+msgid "can't edit history with merges"
+msgstr "kan inte redigera historik med sammanfogningar"
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr "%s: tom ändring"
+
+msgid "Fix up the change and run hg histedit --continue"
+msgstr "Fixa ändringen och kör hg histedit --continue"
+
+msgid ""
+"Make changes as needed, you may commit or record as needed now.\n"
+"When you are finished, run hg histedit --continue to resume."
+msgstr ""
+
+msgid "Read history edits from the specified file."
+msgstr "Läs historieändringar från den angivna filen"
+
+msgid "continue an edit already in progress"
+msgstr ""
+
+msgid "don't strip old nodes after edit is complete"
+msgstr ""
+
+msgid "abort an edit in progress"
+msgstr ""
+
+msgid "changesets not found in destination"
+msgstr "visa ändringar som inte hittas i destinationen"
+
+msgid "force outgoing even for unrelated repositories"
+msgstr ""
+
+msgid "first revision to be edited"
+msgstr "första revision att redigera"
+
+msgid "[PARENT]"
+msgstr "[FÖRÄLDER]"
+
+msgid ""
+"interactively edit changeset history\n"
+" "
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+msgid "only one repo argument allowed with --outgoing"
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "jämför med %s\n"
+
+msgid "--force only allowed with --outgoing"
+msgstr ""
+
+msgid "no arguments allowed with --continue"
+msgstr ""
+
+msgid "no arguments allowed with --abort"
+msgstr ""
+
+msgid "history edit already in progress, try --continue or --abort"
+msgstr ""
+
+msgid "histedit requires exactly one parent revision"
+msgstr "histedit kräver exakt en förälderrevision"
+
+msgid "histedit: Should update metadata for the following changes:\n"
+msgstr ""
+
+#, python-format
+msgid "histedit: %s to %s\n"
+msgstr "histedit: %s till %s\n"
+
+#, python-format
+msgid "histedit: moving bookmarks %s\n"
+msgstr "histedit: flyttar bokmärken %s\n"
+
+msgid "must specify a rule for each changeset once"
+msgstr ""
+
+#, python-format
+msgid "malformed line \"%s\""
+msgstr "defekt rad \"%s\""
+
+msgid "may not use changesets other than the ones listed"
+msgstr ""
+
+#, python-format
+msgid "unknown changeset %s listed"
+msgstr "okänd ändring %s angiven"
+
+#, python-format
+msgid "unknown action \"%s\""
+msgstr "okänd handling \"%s\""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr ""
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr "kör servern i bakgrunden"
+
+msgid "used internally by daemon mode"
+msgstr "används internt av daemon-läget"
+
+msgid "minutes to sit idle before exiting"
+msgstr ""
+
+msgid "name of file to write process ID to"
+msgstr "filnamn att skriva process-ID till"
+
+msgid "hg inserve [OPTION]..."
+msgstr ""
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr ""
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+msgid "cannot start: socket is already bound"
+msgstr ""
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid "Three additional date template filters are provided:"
+msgstr ""
+
+msgid ""
+":``utcdate``: \"2006/09/18 15:13:13\"\n"
+":``svnutcdate``: \"2006-09-18 15:13:13Z\"\n"
+":``svnisodate``: \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your configuration changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, you must run :hg:`kwshrink`\n"
+"to avoid storing expanded keywords in the change history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+" Se :hg:`help templates` för information om mallar och filter.\n"
+" "
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default svn keywordset\n"
+msgstr ""
+
+msgid "\toverriding default cvs keywordset\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default svn keywordset\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default cvs keywordset\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "hg keyword configuration and expansion example"
+msgstr "exempel på nyckelordskonfiguration och -expansion i hg"
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "only show unknown (not tracked) files"
+msgstr "visa bara okända (ospårade) filer"
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid " Must be run before changing/disabling active keywords."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "track large binary files"
+msgstr "spåra stora binärfiler"
+
+msgid ""
+"Large binary files tend to be not very compressible, not very\n"
+"diffable, and not at all mergeable. Such files are not handled\n"
+"efficiently by Mercurial's storage format (revlog), which is based on\n"
+"compressed binary deltas; storing large binary files as regular\n"
+"Mercurial files wastes bandwidth and disk space and increases\n"
+"Mercurial's memory usage. The largefiles extension addresses these\n"
+"problems by adding a centralized client-server layer on top of\n"
+"Mercurial: largefiles live in a *central store* out on the network\n"
+"somewhere, and you only fetch the revisions that you need when you\n"
+"need them."
+msgstr ""
+
+msgid ""
+"largefiles works by maintaining a \"standin file\" in .hglf/ for each\n"
+"largefile. The standins are small (41 bytes: an SHA-1 hash plus\n"
+"newline) and are tracked by Mercurial. Largefile revisions are\n"
+"identified by the SHA-1 hash of their contents, which is written to\n"
+"the standin. largefiles uses that revision ID to get/put largefile\n"
+"revisions from/to the central store. This saves both disk space and\n"
+"bandwidth, since you don't need to retrieve all historical revisions\n"
+"of large files when you clone or pull."
+msgstr ""
+
+msgid ""
+"To start a new repository or add new large binary files, just add\n"
+"--large to your :hg:`add` command. For example::"
+msgstr ""
+
+msgid ""
+" $ dd if=/dev/urandom of=randomdata count=2000\n"
+" $ hg add --large randomdata\n"
+" $ hg commit -m 'add randomdata as a largefile'"
+msgstr ""
+
+msgid ""
+"When you push a changeset that adds/modifies largefiles to a remote\n"
+"repository, its largefile revisions will be uploaded along with it.\n"
+"Note that the remote Mercurial must also have the largefiles extension\n"
+"enabled for this to work."
+msgstr ""
+
+msgid ""
+"When you pull a changeset that affects largefiles from a remote\n"
+"repository, Mercurial behaves as normal. However, when you update to\n"
+"such a revision, any largefiles needed by that revision are downloaded\n"
+"and cached (if they have never been downloaded before). This means\n"
+"that network access may be required to update to changesets you have\n"
+"not previously updated to."
+msgstr ""
+
+msgid ""
+"If you already have large files tracked by Mercurial without the\n"
+"largefiles extension, you will need to convert your repository in\n"
+"order to benefit from largefiles. This is done with the\n"
+":hg:`lfconvert` command::"
+msgstr ""
+
+msgid " $ hg lfconvert --size 10 oldrepo newrepo"
+msgstr ""
+
+msgid ""
+"In repositories that already have largefiles in them, any new file\n"
+"over 10MB will automatically be added as a largefile. To change this\n"
+"threshold, set ``largefiles.minsize`` in your Mercurial config file\n"
+"to the minimum size in megabytes to track as a largefile, or use the\n"
+"--lfsize option to the add command (also in megabytes)::"
+msgstr ""
+
+msgid ""
+" [largefiles]\n"
+" minsize = 2"
+msgstr ""
+
+msgid " $ hg add --lfsize 2"
+msgstr ""
+
+msgid ""
+"The ``largefiles.patterns`` config option allows you to specify a list\n"
+"of filename patterns (see :hg:`help patterns`) that should always be\n"
+"tracked as largefiles::"
+msgstr ""
+
+msgid ""
+" [largefiles]\n"
+" patterns =\n"
+" *.jpg\n"
+" re:.*\\.(png|bmp)$\n"
+" library.zip\n"
+" content/audio/*"
+msgstr ""
+
+msgid ""
+"Files that match one of these patterns will be added as largefiles\n"
+"regardless of their size."
+msgstr ""
+
+msgid ""
+"The ``largefiles.minsize`` and ``largefiles.patterns`` config options\n"
+"will be ignored for any repositories not already containing a\n"
+"largefile. To add the first largefile to a repository, you must\n"
+"explicitly do so with the --large flag passed to the :hg:`add`\n"
+"command.\n"
+msgstr ""
+
+msgid "convert a normal repository to a largefiles repository"
+msgstr "konvertera ett normalt arkiv till ett largefiles-arkiv"
+
+msgid ""
+" Convert repository SOURCE to a new repository DEST, identical to\n"
+" SOURCE except that certain files will be converted as largefiles:\n"
+" specifically, any file that matches any PATTERN *or* whose size is\n"
+" above the minimum size threshold is converted as a largefile. The\n"
+" size used to determine whether or not to track a file as a\n"
+" largefile is the size of the first version of the file. The\n"
+" minimum size can be specified either with --size or in\n"
+" configuration as ``largefiles.size``."
+msgstr ""
+
+msgid ""
+" After running this command you will need to make sure that\n"
+" largefiles is enabled anywhere you intend to push the new\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Use --to-normal to convert largefiles back to normal files; after\n"
+" this, the DEST repository can be used without largefiles at all."
+msgstr ""
+
+msgid "getting largefiles"
+msgstr "hämtar largefiles"
+
+#, python-format
+msgid "getting %s:%s\n"
+msgstr "hämtar %s:%s\n"
+
+#, python-format
+msgid "%s: data corruption (expected %s, got %s)\n"
+msgstr "%s: datakorruption (förväntade mig %s, fick %s)\n"
+
+#, python-format
+msgid "searching %d changesets for largefiles\n"
+msgstr "söker i %d ändringar efter largefiles\n"
+
+#, python-format
+msgid "verified contents of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, python-format
+msgid "verified existence of %d revisions of %d largefiles\n"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL scheme %r"
+msgstr ""
+
+#, python-format
+msgid "%s does not appear to be a largefile store"
+msgstr "%s verkar inte vara en largefiles-lagring"
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s är inte ett lokalt Mercurial-arkiv"
+
+#, python-format
+msgid "initializing destination %s\n"
+msgstr ""
+
+msgid "converting revisions"
+msgstr "konverterar revisioner"
+
+#, python-format
+msgid "renamed/copied largefile %s becomes symlink"
+msgstr ""
+
+#, python-format
+msgid "largefile %s becomes symlink"
+msgstr ""
+
+#, python-format
+msgid "skipping incorrectly formatted tag %s\n"
+msgstr "hoppar över felformaterat märke %s\n"
+
+#, python-format
+msgid "skipping incorrectly formatted id %s\n"
+msgstr "hoppar över flrformaterad id %s\n"
+
+#, python-format
+msgid "no mapping for id %s\n"
+msgstr ""
+
+msgid "uploading largefiles"
+msgstr ""
+
+#, python-format
+msgid "largefile %s missing from store (needs to be uploaded)"
+msgstr ""
+
+#, python-format
+msgid "%d additional largefiles cached\n"
+msgstr "%d ytterligare largefiles cachade\n"
+
+#, python-format
+msgid "%d largefiles failed to download\n"
+msgstr "%d largefiles kunde inte hämtas\n"
+
+msgid "getting changed largefiles\n"
+msgstr "hämtar ändrade largefiles\n"
+
+#, python-format
+msgid "%d largefiles updated, %d removed\n"
+msgstr "%d largefiles uppdaterade, %d borttagna\n"
+
+#, python-format
+msgid "largefile %s is not in cache and could not be downloaded"
+msgstr ""
+
+msgid "minimum size (MB) for files to be converted as largefiles"
+msgstr ""
+
+msgid "convert from a largefiles repo to a normal repo"
+msgstr ""
+
+msgid "hg lfconvert SOURCE DEST [FILE ...]"
+msgstr ""
+
+#, python-format
+msgid "largefiles: size must be number (not %s)\n"
+msgstr ""
+
+msgid "minimum size for largefiles must be specified"
+msgstr ""
+
+#, python-format
+msgid "unknown operating system: %s\n"
+msgstr "okänt operativsystem: %s\n"
+
+#, python-format
+msgid "found %s in store\n"
+msgstr ""
+
+#, python-format
+msgid "found %s in system cache\n"
+msgstr ""
+
+msgid "can't get file locally"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s missing\n"
+" (looked for hash %s)\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"changeset %s: %s: contents differ\n"
+" (%s:\n"
+" expected hash %s,\n"
+" but got %s)\n"
+msgstr ""
+
+#, python-format
+msgid "%s already a largefile\n"
+msgstr "%s är redan en largefile\n"
+
+#, python-format
+msgid "adding %s as a largefile\n"
+msgstr "lägger till %s som en largefile\n"
+
+msgid "no files specified"
+msgstr "inga filer angivna"
+
+#, python-format
+msgid "not removing %s: %s (use forget to undo)\n"
+msgstr "raderar inte %s: %s (använd forget för att ångra)\n"
+
+msgid "file still exists"
+msgstr "filen existerar fortfarande"
+
+msgid "file is modified"
+msgstr "filen är modifierad"
+
+msgid "file has been marked for add"
+msgstr "filen har markerats för addering"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "tar bort %s\n"
+
+msgid "--normal cannot be used with --large"
+msgstr "--normal kan inte användas med --large"
+
+msgid "uncommitted local changes"
+msgstr "oarkiverade lokala ändringar"
+
+msgid "&Largefile"
+msgstr "&Largefile"
+
+msgid "&Normal file"
+msgstr "&Normal fil"
+
+#, python-format
+msgid ""
+"%s has been turned into a largefile\n"
+"use (l)argefile or keep as (n)ormal file?"
+msgstr ""
+
+#, python-format
+msgid ""
+"%s has been turned into a normal file\n"
+"keep as (l)argefile or use (n)ormal file?"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"largefile %s has a merge conflict\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+msgid "no files to copy"
+msgstr "inga filer att kopiera"
+
+msgid "destination largefile already exists"
+msgstr "destionation-largefile finns redan"
+
+msgid "caching new largefiles\n"
+msgstr "cachar nya largefiles\n"
+
+#, python-format
+msgid "%d largefiles cached\n"
+msgstr "%d largefiles cachade\n"
+
+#, python-format
+msgid "--all-largefiles is incompatible with non-local destination %s"
+msgstr "--all-largefiles är inkompatibel med icke-lokal destination %s"
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr "okänd arkivtyp '%s'"
+
+msgid "cannot give prefix when archiving to files"
+msgstr ""
+
+#, python-format
+msgid "largefile %s not found in repo store or system cache"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+msgid "largefiles: No remote repo\n"
+msgstr ""
+
+msgid "largefiles to upload:\n"
+msgstr ""
+
+#, python-format
+msgid "largefiles: %d to upload\n"
+msgstr ""
+
+msgid "largefile contents do not match hash"
+msgstr ""
+
+#, python-format
+msgid "largefiles: failed to put %s into store: %s"
+msgstr ""
+
+#, python-format
+msgid "requested largefile %s not present in cache"
+msgstr ""
+
+msgid "remote: "
+msgstr "fjärr: "
+
+#, python-format
+msgid "unexpected putlfile response: %s"
+msgstr "oväntat putlfile-svar: %s"
+
+msgid "putlfile failed:"
+msgstr "putlfile misslyckades:"
+
+msgid "putlfile failed (unexpected response):"
+msgstr "putlfile misslyckades (oväntat svar):"
+
+msgid "unexpected response:"
+msgstr "oväntat svar:"
+
+#, python-format
+msgid "remotestore: could not put %s to remote store %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: put %s to remote store %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: could not open file %s: %s"
+msgstr ""
+
+#, python-format
+msgid "remotestore: largefile %s is invalid"
+msgstr ""
+
+#, python-format
+msgid "remotestore: largefile %s is missing"
+msgstr ""
+
+#, python-format
+msgid "changeset %s: %s: contents differ\n"
+msgstr ""
+
+#, python-format
+msgid "changeset %s: %s missing\n"
+msgstr "ändring %s: %s saknas\n"
+
+#, python-format
+msgid ""
+"largefiles: repo method %r appears to have already been wrapped by another "
+"extension: largefiles may behave incorrectly\n"
+msgstr ""
+
+#, python-format
+msgid "file \"%s\" is a largefile standin"
+msgstr ""
+
+msgid "add as largefile"
+msgstr "lägg till som largefile"
+
+msgid "add as normal file"
+msgstr "lägg till som normal fil"
+
+msgid ""
+"add all files above this size (in megabytes) as largefiles (default: 10)"
+msgstr ""
+
+msgid "verify largefiles"
+msgstr ""
+
+msgid "verify all revisions of largefiles not just current"
+msgstr ""
+
+msgid "verify largefile contents not just existence"
+msgstr ""
+
+msgid "display outgoing largefiles"
+msgstr "visa utgående largefiles"
+
+msgid "download all pulled versions of largefiles"
+msgstr ""
+
+msgid "download all versions of all largefiles"
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr "hantera en uppsättning patchar"
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+"Denna utökning låter dej arbeta med en uppsättning patchar inuti ett\n"
+"Mercurial-arkiv. Den hantera två uppsättningar med patchar - alla kända\n"
+"patchar, och applicerade patchar (delmängd av kända patchar)."
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+"Kända patchar representeras av patchfiler i katalogen .hg/patches.\n"
+"Applicerade patchar är både patchfiler och ändringar."
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr "Vanliga kommandon (använd :hg:`help command` för mer detaljer):"
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+" skapa ny patch qnew\n"
+" importera existerande patch qimport"
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+" skriv ut patchserie qseries\n"
+" skriv ut applicerade patchar qapplied"
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+" applicera en redan känd patch qpush\n"
+" ta port en applicerad patch qpop\n"
+" uppdatera innehållet i senaste patchen qrefresh"
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+"Som standard kommer mq automagiskt att använda git-patchar när det behövs\n"
+"för att inte förlora ändring av filläge, kopieringar, binära filer eller\n"
+"skapande/raderande av tomma filer. Detta beteende kan konfigureras med::"
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+"Om satt till 'keep' så kommer mq att lyda sektionen [diff] i\n"
+"konfigurationen medans existerande git-patchas bevaras vid qrefresh. Om\n"
+"satt till 'yes' eller 'no', kommer mq att ignorera sektionen [diff] och\n"
+"alltid generera git- eller vanliga patchar, även om data kan tappas i det\n"
+"andra fallet."
+
+msgid ""
+"It may be desirable for mq changesets to be kept in the secret phase (see\n"
+":hg:`help phases`), which can be enabled with the following setting::"
+msgstr ""
+"Det kan vara önskvärt att hålla alla mq-ändringar i secret-fasen (se\n"
+":hg:`help phases`), något som kan aktiveras med följande inställning::"
+
+msgid ""
+" [mq]\n"
+" secret = True"
+msgstr ""
+" [mq]\n"
+" secret = True"
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command."
+msgstr ""
+"Du kommer som standard att handera en patchkö vid namn \"patches\". Du\n"
+"kan skapa en ny, oberoende patchkö med kommandot :hg:`qqueue`."
+
+msgid ""
+"If the working directory contains uncommitted files, qpush, qpop and\n"
+"qgoto abort immediately. If -f/--force is used, the changes are\n"
+"discarded. Setting::"
+msgstr ""
+"Om arbetskatalogen innehåller oarkiverade filer så kommer qpush, qpop\n"
+"och qgoto omedelbart att avslutas. Om -f/--force används, så kommer\n"
+"ändringarna att kastas bort. Inställningen::"
+
+msgid ""
+" [mq]\n"
+" keepchanges = True"
+msgstr ""
+" [mq]\n"
+" keepchanges = True"
+
+msgid ""
+"make them behave as if --keep-changes were passed, and non-conflicting\n"
+"local changes will be tolerated and preserved. If incompatible options\n"
+"such as -f/--force or --exact are passed, this setting is ignored.\n"
+msgstr ""
+"får dom att uppföra sig som om --keep-changes angetts, och konfliktfria\n"
+"lokala ändringar tolereras och bevaras. Om inkompatibla flaggor som\n"
+"-f/--force eller --exact anges, så ignoreras den här inställningen.\n"
+
+msgid "print first line of patch header"
+msgstr "skriv ut första raden i patchheadern"
+
+#, python-format
+msgid "malformated mq status line: %s\n"
+msgstr "defekt mq-statusrad: %s\n"
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr "mq.git kan vara auto/keep/yes/no men läste %s"
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr "%s finns mer än en gång i %s"
+
+msgid "guard cannot be an empty string"
+msgstr "skyddet kan inte vara en tom sträng"
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr "skyddet %r börjar med ett otillåtet tecken: %r"
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr "otillåtet tecken i skyddet %r: %r"
+
+#, python-format
+msgid "guard %r too short"
+msgstr "skyddet %r är för kort"
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr "skyddet %r börjar med ett otillåtet tecken"
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr "tillåter %s - inga skydd aktiva\n"
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr "tillåter %s - inga matchande negativa skydd\n"
+
+#, python-format
+msgid "allowing %s - guarded by %s\n"
+msgstr "tillåter %s - skyddad av %s\n"
+
+#, python-format
+msgid "skipping %s - guarded by %s\n"
+msgstr "hoppar över %s - skyddad av %s\n"
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr "hoppar över %s - inga matchande skydd\n"
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr "fel vid borttagning av återställare: %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "sparar nuvarande revision av %s som %s\n"
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr "misslyckades att applicera patchen %s"
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr "patchning gick inte bra, sammanfogar %s\n"
+
+#, python-format
+msgid "update returned %d"
+msgstr "update returnerade %d"
+
+msgid "repo commit failed"
+msgstr "arkivering misslyckades"
+
+#, python-format
+msgid "unable to read %s"
+msgstr "kan inte läsa %s"
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr "patchen %s finns inte\n"
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr "patchen %s är inte applicerad\n"
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr "patchning misslyckades, kan inte fortsätta (försök med -v)\n"
+
+#, python-format
+msgid "applying %s\n"
+msgstr "applicerar %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "kan inte läsa %s\n"
+
+msgid "local changes found, refresh first"
+msgstr "lokala ändringar hittades, uppdatera först"
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr "patchen %s är tom\n"
+
+msgid "qpush exactly duplicates child changeset"
+msgstr "qpush duplicerar barnändringen exakt"
+
+msgid "repository commit failed"
+msgstr "arkivering misslyckades"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr "patchning misslyckades, avslag lämnades i arbetskatalogen\n"
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr "ludd upptäcktes när patchen applicerades, stannar\n"
+
+#, python-format
+msgid "revision %s refers to unknown patches: %s\n"
+msgstr "revision %s refererar till okända patchar: %s\n"
+
+#, python-format
+msgid "unknown patches: %s\n"
+msgstr "okända patchar: %s\n"
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr "revision %d hanteras inte"
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr "kan inte radera revision %d ovanför applicerade patchar"
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr "patchen %s färdigställdes utan arkiveringsmeddelande\n"
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr "qdelete kräver minst en revision eller ett patchnamn"
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr "kan inte radera applicerad patch %s"
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr "patchen %s finns inte i series-filen"
+
+msgid "no patches applied"
+msgstr "inga patcher applicerade"
+
+msgid "working directory revision is not qtip"
+msgstr "arbetskatalogen är inte qtip"
+
+#, python-format
+msgid "uncommitted changes in subrepository %s"
+msgstr "oarkiverade ändringar i underarkivet %s"
+
+msgid "local changes found"
+msgstr "lokala ändringar hittades"
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr "\"%s\" kan inte användas som patchnamn"
+
+#, python-format
+msgid "patch name cannot begin with \"%s\""
+msgstr "patchnamn kan inte börja med \"%s\""
+
+#, python-format
+msgid "\"%s\" cannot be used in the name of a patch"
+msgstr "\"%s\" kan inte användas i patchnamn"
+
+#, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "\"%s\" finns redan som katalog"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr "patchen \"%s\" existerar redan"
+
+msgid "cannot use both --force and --keep-changes"
+msgstr "kan inte ange både --force och --keep-changes"
+
+msgid "cannot manage merge changesets"
+msgstr "kan inte hantera sammanfogningar"
+
+#, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "kan inte skriva patchen \"%s\": %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr "fel vid radering av %s\n"
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr "patchnamnet \"%s\" är tvetydligt:\n"
+
+#, python-format
+msgid "patch %s not in series"
+msgstr "patchen %s finns inte i serien"
+
+msgid "(working directory not at a head)\n"
+msgstr "(arbetskatalogen är inte på ett huvud)\n"
+
+msgid "no patches in series\n"
+msgstr "inga patchar i serien\n"
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr "qpush: %s är redan på toppen\n"
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr "kan inte pusha till en tidigare patch: %s"
+
+#, python-format
+msgid "guarded by %s"
+msgstr "skyddad av %s"
+
+msgid "no matching guards"
+msgstr "inga matchande skydd"
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr "kan inte pusha '%s' - %s\n"
+
+msgid "all patches are currently applied\n"
+msgstr "alla patchar är applicerade\n"
+
+msgid "patch series already fully applied\n"
+msgstr "patchserien är redan fullständigt applicerad\n"
+
+msgid "cannot use --exact and --keep-changes together"
+msgstr "kan inte använda --exact och --keep-changes tillsammans"
+
+msgid "cannot use --exact and --move together"
+msgstr "kan inte använda --exact och --move tillsammans"
+
+msgid "cannot push --exact with applied patches"
+msgstr "kan inte trycka --exakt med applicerade patchar"
+
+#, python-format
+msgid "%s does not have a parent recorded"
+msgstr "%s har inte en angiven förälder"
+
+msgid "please specify the patch to move"
+msgstr "ange patchen som ska flyttas"
+
+msgid "cleaning up working directory..."
+msgstr "rensar upp arbetskatalogen..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr "fel vid applicering, fixa och uppdatera %s\n"
+
+#, python-format
+msgid "now at: %s\n"
+msgstr "är nu på: %s\n"
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr "patchen %s är inte applicerad"
+
+msgid "no patches applied\n"
+msgstr "inga patchar applicerade\n"
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr "qpop: %s är redan på toppen\n"
+
+msgid "qpop: forcing dirstate update\n"
+msgstr "qpop: tvingar en uppdatering av dirstate\n"
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr "försöker att poppa okänd nod %s"
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+"poppning skulle ta bort en revision som inte hanteras av denna patchkö"
+
+msgid "popping would remove an immutable revision"
+msgstr "poppning skulle ta bort en oföränderlig revision"
+
+msgid "see \"hg help phases\" for details"
+msgstr "se \"hg help phases\" för detaljer"
+
+msgid "deletions found between repo revs"
+msgstr "raderingar hittades mellan arkivrevisioner"
+
+#, python-format
+msgid "popping %s\n"
+msgstr "poppar %s\n"
+
+msgid "patch queue now empty\n"
+msgstr "patchkön är nu tom\n"
+
+msgid "cannot refresh a revision with children"
+msgstr "kan inte uppdatera en revision med barn"
+
+msgid "cannot refresh immutable revision"
+msgstr "kan inte uppdatera oföränderlig revision"
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+"uppdatering avbröts medans patch var poppad! (revert --all, qpush för "
+"att återställa)\n"
+
+msgid "patch queue directory already exists"
+msgstr "katalog för patchkö finns redan"
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr "patchen %s finns inte i series-filen"
+
+msgid "no saved patch data found\n"
+msgstr "ingen sparad patchdata hittades\n"
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr "återställer status: %s\n"
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "updating queue directory\n"
+msgstr "uppdaterar kökatalog\n"
+
+msgid "unable to load queue repository\n"
+msgstr "kan inte öppna köarkiv\n"
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr "status är redan sparad\n"
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr ""
+
+msgid "option \"-r\" not valid when importing files"
+msgstr ""
+
+msgid "no files or revisions specified"
+msgstr "inga filer eller revisioner angivna"
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr ""
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not mutable"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr ""
+
+msgid "-e is incompatible with import from -"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr ""
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "döper om %s till %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr ""
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "kan inte läsa filen %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr "lägger till %s till seriefilen\n"
+
+msgid "keep patch file"
+msgstr ""
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr "hg qdelete [-k] [PATCH]..."
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"Exact\n"
+" patch identifiers must be given. With -k/--keep, the patch files are\n"
+" preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+
+msgid "show only the preceding applied patch"
+msgstr "visa bara den föregående applicerade patchen"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr "hg qapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches already applied"
+msgstr "skriv ut redan applicerade patchar"
+
+msgid " Returns 0 on success."
+msgstr " Returnerar 0 om kommandot lyckades."
+
+msgid "only one patch applied\n"
+msgstr "bara en patch applicerad\n"
+
+msgid "show only the first patch"
+msgstr "visa bara den första patchen"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr "hg qunapplied [-1] [-s] [PATCH]"
+
+msgid "print the patches not yet applied"
+msgstr "skriv ut oapplicerade patchar"
+
+msgid "all patches applied\n"
+msgstr "alla patchar applicerade\n"
+
+msgid "import file in patch directory"
+msgstr ""
+
+msgid "NAME"
+msgstr "NAMN"
+
+msgid "name of patch file"
+msgstr ""
+
+msgid "overwrite existing files"
+msgstr ""
+
+msgid "place existing revisions under mq control"
+msgstr ""
+
+msgid "use git extended diff format"
+msgstr "använd gits utökade diff-format"
+
+msgid "qpush after importing"
+msgstr ""
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... [FILE]..."
+msgstr "hg qimport [-e] [-n NAMN] [-f] [-g] [-P] [-r REV]... [FIL]..."
+
+msgid "import a patch or existing changeset"
+msgstr "importera en patch eller existerande ändring"
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes. Use :hg:`qfinish` to remove changesets from mq control."
+msgstr ""
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+
+msgid " To import an existing patch while renaming it::"
+msgstr ""
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr ""
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+" Returnerar 0 om importeringen lyckades.\n"
+" "
+
+msgid "create queue repository"
+msgstr "skapa köarkiv"
+
+msgid "hg qinit [-c]"
+msgstr "hg qinit [-c]"
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr ""
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr "använd pull-protokollet för att kopiera metadata"
+
+msgid "do not update the new working directories"
+msgstr "uppdatera inte de nya arbetskatalogerna"
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "använd okomprimerad överföring (snabbt över LAN)"
+
+msgid "REPO"
+msgstr "ARKIV"
+
+msgid "location of source patch repository"
+msgstr ""
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr "hg qclone [FLAGGA]... KÄLLA [DEST]"
+
+msgid "clone main and patch repository at same time"
+msgstr "klona huvud- och patcharkivet på samma gång"
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades.\n"
+" "
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr "versionshanterat patcharkiv hittades inte (se init --mq)"
+
+msgid "cloning main repository\n"
+msgstr ""
+
+msgid "cloning patch repository\n"
+msgstr ""
+
+msgid "stripping applied patches from destination repository\n"
+msgstr ""
+
+msgid "updating destination repository\n"
+msgstr ""
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr "hg qcommit [FLAGGA]... [FIL]..."
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr "arkivera ändringar i köarkivet (FÖRÅLDRAD)"
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr ""
+" Detta är ett föråldrat kommando; använd :hg:`commit --mq` istället."
+
+msgid "print patches not in series"
+msgstr "visa patchas som inte är i serien"
+
+msgid "hg qseries [-ms]"
+msgstr "hg qseries [-ms]"
+
+msgid "print the entire series file"
+msgstr "visa hela seriefilen"
+
+msgid "hg qtop [-s]"
+msgstr "hg qtop [-s]"
+
+msgid "print the name of the current patch"
+msgstr "visa namnet på den nuvarande patchen"
+
+msgid "hg qnext [-s]"
+msgstr "hg qnext [-s]"
+
+msgid "print the name of the next pushable patch"
+msgstr "visa namnet på den nästkommande patchen"
+
+msgid "hg qprev [-s]"
+msgstr "hg qprev [-s]"
+
+msgid "print the name of the preceding applied patch"
+msgstr "skriv ut namnet på föregående applicerade patch"
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr "importera icke arkiverade ändringar (FÖRLEGAD)"
+
+msgid "add \"From: <current user>\" to patch"
+msgstr "lägg till \"From: <denna användare>\" i patch"
+
+msgid "add \"From: <USER>\" to patch"
+msgstr "lägg till \"From: <ANVÄNDARE>\" i patch"
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr "lägg till \"Date: <nuvarande datum>\" i patch"
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr "lägg till \"Date: <DATUM>\" i patch"
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr "hg qnew [-e] [-m TEXT] [-l FIL] PATCH [FIL]..."
+
+msgid "create a new patch"
+msgstr "skapa en ny patch"
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+" qnew skapar en ny patch ovanpå redan applicerade patchar (om några).\n"
+" Patchen kommer att initialiseras med oarkiverade ändringar i\n"
+" arbetskatalogen. Du kan också använda -I/--include, -X/--exclude,\n"
+" och/eller en uppsättning filer efter patchnamnet för att bara lägga\n"
+" till ändringar i dessa filer i patchen, och lämna resten som\n"
+" oarkiverade ändringar."
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+" -u/--user och -d/--date kan användas för att sätta (den angivna)\n"
+" användaren respektive datumet. -U/--currentuser och -D/--currentdate\n"
+" sätter användare till denna användaren och datumed till nuvarande datum."
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+" -e/--edit, -m/--message or -l/--logfile sätter både patchhuvudet och\n"
+" arkiveringsmeddelandet. Om inget är angivet, så är huvudet tomt och\n"
+" arkiveringsmeddelandet är '[mq]: PATCH'."
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+" Använd flaggan -g/--git gör att lagra patchen i gits utökade\n"
+" diff-format. Läs hjälpämnet om diffar för mer inormation om varför\n"
+" detta är viktigt för att lagra rättighetsändringar och information om\n"
+" kopior/namnbyten."
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+" Returnerar 0 om en patch skapades.\n"
+" "
+
+msgid "refresh only files already in the patch and specified files"
+msgstr ""
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+msgid "add/update date field in patch with current date"
+msgstr ""
+
+msgid "add/update date field in patch with given date"
+msgstr ""
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FIL] [-s] [FIL]..."
+
+msgid "update the current patch"
+msgstr "uppdatera den nuvarande patchen"
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr ""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr ""
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+
+msgid "edit patch header"
+msgstr ""
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr "hg qfold [-e] [-k] [-m TEXT] [-l FIL] PATCH..."
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr ""
+
+#, python-format
+msgid "skipping already folded patch %s\n"
+msgstr "hoppar över redan hopvikta patchen %s\n"
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "error folding patch %s"
+msgstr ""
+
+msgid "tolerate non-conflicting local changes"
+msgstr ""
+
+msgid "overwrite any local changes"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr "spara inte backup-kopior av filer"
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr ""
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr ""
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr ""
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr " hg qguard other.patch -- +2.6.17 -stable"
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr ""
+
+#, python-format
+msgid "no patch named %s"
+msgstr "ingen patch med namnet %s"
+
+msgid "hg qheader [PATCH]"
+msgstr "hg qheader [PATCH]"
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+msgid "apply on top of local changes"
+msgstr ""
+
+msgid "apply the target patch to its recorded parent"
+msgstr "applicera patchen på dess angivna förälder"
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr "applicera alla patchar"
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr ""
+
+msgid "merge queue name (DEPRECATED)"
+msgstr ""
+
+msgid "reorder patch series and apply only the patch"
+msgstr "omordna patchserien och applicera bara patchen"
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+
+msgid "push the next patch onto the stack"
+msgstr ""
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and patch over\n"
+" uncommitted changes."
+msgstr ""
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr "sammanfogar med kö vid: %s\n"
+
+msgid "pop all patches"
+msgstr "poppa alla patchar"
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr "könamn att poppa (FÖRLEGAD)"
+
+msgid "forget any local changes to patched files"
+msgstr ""
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr "hg qpop [-a] [-f] [PATCH | INDEX]"
+
+msgid "pop the current patch off the stack"
+msgstr ""
+
+msgid ""
+" Without argument, pops off the top of the patch stack. If given a\n"
+" patch name, keeps popping off patches until the named patch is at\n"
+" the top of the stack."
+msgstr ""
+
+msgid ""
+" By default, abort if the working directory contains uncommitted\n"
+" changes. With --keep-changes, abort only if the uncommitted files\n"
+" overlap with patched files. With -f/--force, backup and discard\n"
+" changes made to such files."
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr ""
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr ""
+
+msgid "rename a patch"
+msgstr ""
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr " Detta är ett förlegat kommando; använd :hg:`rebase` istället."
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr ""
+
+msgid "save current queue state (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr ""
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr ""
+
+msgid ""
+"strip specified revision (optional, can specify revisions without this "
+"option)"
+msgstr ""
+
+msgid "force removal of changesets, discard uncommitted changes (no backup)"
+msgstr ""
+"tvinga radering av ändringar, kassera oarkiverade ändringar (ingen backup)"
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+"bunta bara ändringar med lokala revisionsnummer större än REV som inte är "
+"ättling till REV (FÖRLEGAD)"
+
+msgid "no backups"
+msgstr "inga säkerhetskopior"
+
+msgid "no backups (DEPRECATED)"
+msgstr "inga säkerhetskopior (FÖRÅLDRAD)"
+
+msgid "ignored (DEPRECATED)"
+msgstr "ignorerad (FÖRÅLDRAD)"
+
+msgid "do not modify working copy during strip"
+msgstr "modifiera inte arbetskopian vid strippning"
+
+msgid "remove revs only reachable from given bookmark"
+msgstr "radera revisioner som bara nås från givet bokmärke"
+
+msgid "hg strip [-k] [-f] [-n] [-B bookmark] [-r] REV..."
+msgstr "hg strip [-k] [-f] [-n] [-B bokmärke] [-r] REV..."
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr ""
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes, the\n"
+" operation is aborted unless the --force flag is supplied, in which\n"
+" case changes will be discarded."
+msgstr ""
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+
+msgid ""
+" Strip is not a history-rewriting operation and can be used on\n"
+" changesets in the public phase. But if the stripped changesets have\n"
+" been pushed to a remote repository you will likely pull them again."
+msgstr ""
+
+#, python-format
+msgid "bookmark '%s' not found"
+msgstr "bokmärket '%s' hittades inte"
+
+#, python-format
+msgid "bookmark '%s' deleted\n"
+msgstr "bokmärket '%s' raderad\n"
+
+msgid "empty revision set"
+msgstr "tomt revisionsset"
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -- -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr "hg qfinish [-a] [REV]..."
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+
+msgid "no revisions specified"
+msgstr ""
+
+msgid "warning: uncommitted changes in the working directory\n"
+msgstr "varning: oarkiverade ändringar i arbetskatalogen\n"
+
+msgid "list all available queues"
+msgstr "visa alla tillgängliga köer"
+
+msgid "print name of active queue"
+msgstr "visa namnet på aktiv kö"
+
+msgid "create new queue"
+msgstr "skapa ny kö"
+
+msgid "rename active queue"
+msgstr "döp om aktiv kö"
+
+msgid "delete reference to queue"
+msgstr "radera referens till kö"
+
+msgid "delete queue, and remove patch dir"
+msgstr ""
+
+msgid "[OPTION] [QUEUE]"
+msgstr "[FLAGGA] [KÖ]"
+
+msgid "manage multiple patch queues"
+msgstr ""
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\". Specifying --active will "
+"print\n"
+" only the name of the active queue."
+msgstr ""
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+
+msgid "patches applied - cannot set new queue active"
+msgstr ""
+
+msgid "cannot delete queue that does not exist"
+msgstr ""
+
+msgid "cannot delete currently active queue"
+msgstr ""
+
+msgid " (active)\n"
+msgstr " (aktiv)\n"
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr "ogiltigt könamn, kan inte innehålla tecknen \":\\/.\""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "kön \"%s\" finns redan"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr ""
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr ""
+
+msgid "use --create to create a new queue"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr ""
+
+#, python-format
+msgid "tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr "kan inte importera över en applicerad patch"
+
+msgid "only a local queue repository may be initialized"
+msgstr "bara ett lokalt köarkiv kan initialiseras"
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "det finns inget Mercurial-arkiv här (.hg hittades inte)"
+
+msgid "no queue repository"
+msgstr "inget köarkiv"
+
+#, python-format
+msgid "%d applied"
+msgstr "%d applicerade"
+
+#, python-format
+msgid "%d unapplied"
+msgstr "%d oapplicerade"
+
+msgid "mq: (empty queue)\n"
+msgstr "mq: (tom kö)\n"
+
+msgid ""
+"``mq()``\n"
+" Changesets managed by MQ."
+msgstr ""
+"``mq()``\n"
+" Ändringar hanterade av MQ."
+
+msgid "mq takes no arguments"
+msgstr "mq tar inga argument"
+
+msgid "operate on patch repository"
+msgstr "arbeta med patcharkiv"
+
+msgid "hooks for sending email push notifications"
+msgstr ""
+
+msgid ""
+"This extension implements hooks to send email notifications when\n"
+"changesets are sent from or received by the local repository."
+msgstr ""
+
+msgid ""
+"First, enable the extension as explained in :hg:`help extensions`, and\n"
+"register the hook you want to run. ``incoming`` and ``changegroup`` hooks\n"
+"are run when changesets are received, while ``outgoing`` hooks are for\n"
+"changesets sent to another repository::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # one email for all incoming changesets\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" # one email for all outgoing changesets\n"
+" outgoing.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+"This registers the hooks. To enable notification, subscribers must\n"
+"be assigned to repositories. The ``[usersubs]`` section maps multiple\n"
+"repositories to a given recipient. The ``[reposubs]`` section maps\n"
+"multiple recipients to a single repository::"
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is a comma-separated list of repo glob\n"
+" # patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is a comma-separated list of subscriber\n"
+" # emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid ""
+"Glob patterns are matched against absolute path to repository\n"
+"root."
+msgstr ""
+
+msgid ""
+"In order to place them under direct user management, ``[usersubs]`` and\n"
+"``[reposubs]`` sections may be placed in a separate ``hgrc`` file and\n"
+"incorporated by reference::"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" config = /path/to/subscriptionsfile"
+msgstr ""
+
+msgid ""
+"Notifications will not be sent until the ``notify.test`` value is set\n"
+"to ``False``; see below."
+msgstr ""
+
+msgid ""
+"Notifications content can be tweaked with the following configuration "
+"entries:"
+msgstr ""
+
+msgid ""
+"notify.test\n"
+" If ``True``, print messages to stdout instead of sending them. Default: "
+"True."
+msgstr ""
+
+msgid ""
+"notify.sources\n"
+" Space-separated list of change sources. Notifications are activated only\n"
+" when a changeset's source is in this list. Sources may be:"
+msgstr ""
+
+msgid ""
+" :``serve``: changesets received via http or ssh\n"
+" :``pull``: changesets received via ``hg pull``\n"
+" :``unbundle``: changesets received via ``hg unbundle``\n"
+" :``push``: changesets sent or received via ``hg push``\n"
+" :``bundle``: changesets sent via ``hg unbundle``"
+msgstr ""
+
+msgid " Default: serve."
+msgstr " Standard: serve"
+
+msgid ""
+"notify.strip\n"
+" Number of leading slashes to strip from url paths. By default, "
+"notifications\n"
+" reference repositories with their absolute path. ``notify.strip`` lets "
+"you\n"
+" turn them into relative paths. For example, ``notify.strip=3`` will "
+"change\n"
+" ``/long/path/repository`` into ``repository``. Default: 0."
+msgstr ""
+
+msgid ""
+"notify.domain\n"
+" Default email domain for sender or recipients with no explicit domain."
+msgstr ""
+
+msgid ""
+"notify.style\n"
+" Style file to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.template\n"
+" Template to use when formatting emails."
+msgstr ""
+
+msgid ""
+"notify.incoming\n"
+" Template to use when run as an incoming hook, overriding ``notify."
+"template``."
+msgstr ""
+
+msgid ""
+"notify.outgoing\n"
+" Template to use when run as an outgoing hook, overriding ``notify."
+"template``."
+msgstr ""
+
+msgid ""
+"notify.changegroup\n"
+" Template to use when running as a changegroup hook, overriding\n"
+" ``notify.template``."
+msgstr ""
+
+msgid ""
+"notify.maxdiff\n"
+" Maximum number of diff lines to include in notification email. Set to 0\n"
+" to disable the diff, or -1 to include all of it. Default: 300."
+msgstr ""
+
+msgid ""
+"notify.maxsubject\n"
+" Maximum number of characters in email's subject line. Default: 67."
+msgstr ""
+
+msgid ""
+"notify.diffstat\n"
+" Set to True to include a diffstat before diff content. Default: True."
+msgstr ""
+
+msgid ""
+"notify.merge\n"
+" If True, send notifications for merge changesets. Default: True."
+msgstr ""
+
+msgid ""
+"notify.mbox\n"
+" If set, append mails to this mbox file instead of sending. Default: None."
+msgstr ""
+
+msgid ""
+"notify.fromauthor\n"
+" If set, use the committer of the first changeset in a changegroup for\n"
+" the \"From\" field of the notification mail. If not set, take the user\n"
+" from the pushing repo. Default: False."
+msgstr ""
+
+msgid ""
+"If set, the following entries will also be used to customize the\n"
+"notifications:"
+msgstr ""
+
+msgid ""
+"email.from\n"
+" Email ``From`` address to use if none can be found in the generated\n"
+" email content."
+msgstr ""
+
+msgid ""
+"web.baseurl\n"
+" Root repository URL to combine with repository paths when making\n"
+" references. See also ``notify.strip``."
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+" [pager]\n"
+" pager = less -FRSX"
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+"För att ignorera globala kommandon som :hg:`version` eller :hg:`help`, så\n"
+"måste du ange dem i din användarkonfigurationsfil."
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+"Flaggan --pager=... kan också användas för att kontrollera när pagineraren\n"
+"används. Använd ett booleskt värde som yes, no, on off, eller använd auto\n"
+"för normalt uppförande.\n"
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr "när paginering ska ske (boolean, always, auto eller never)"
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr "kommando för att sända ändringar som (en uppsättning) mail"
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+"Serien startas med en \"[PATCH 0 of N]\"-introduktion, som beskriver\n"
+"innehållet i serien."
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+"Varje patchmail har en ämnesraden \"[PATCH M of N] ...\", där den första\n"
+"raden i ändringsbeskrivningen används som ämnestext. Meddelandet innehåller\n"
+"två eller tre delar:"
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+"- Ändringsbeskrivningen.\n"
+"- [Valfritt] Resultatet av diffstat på patchen.\n"
+"- Patchen, som genererad av :hg:`export`."
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+"Varje meddelande refererar till den första i serien med hjälp av\n"
+"In-Reply-To och References, så de kommer att visas upp som en sekvens i\n"
+"trådade mail- och news-läsare, och i mailarkiv."
+
+msgid ""
+"To configure other defaults, add a section like this to your\n"
+"configuration file::"
+msgstr ""
+"För att konfigurera andra inställningar, lägg till en sådan här sektion\n"
+"till din konfigurationsfil::"
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+" [email]\n"
+" from = Mitt Namn <min@email>\n"
+" to = mottagare1, mottagare2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = adress1, adress2, ..."
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+"Använd ``[patchbomb]`` som namn på konfigurationssektionen om du behöver\n"
+"ändra globala adressinställningar i ``[email]``."
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+"Därefter kan du använda kommandot :hg:`email` för att maila en serie\n"
+"ändringar som en patchbomb."
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+"Du kan också endera konfigurera alternativet method i email-sektionen att\n"
+"vara en sendmail-kompatibel sändare eller fylla i sektionen [smtp] så att\n"
+"patchbomb-utökningen automatiskt kan skicka patchbomber från kommandoraden.\n"
+"Se sektionerna [email] och [smtp] i hgrc(5) för detaljer.\n"
+
+msgid "send patches as inline message text (default)"
+msgstr ""
+
+msgid "send patches as attachments"
+msgstr ""
+
+msgid "send patches as inline attachments"
+msgstr ""
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "ask for confirmation before sending"
+msgstr "bekräfta innan sändning"
+
+msgid "add diffstat output to messages"
+msgstr ""
+
+msgid "use the given date as the sending date"
+msgstr ""
+
+msgid "use the given file as the series description"
+msgstr ""
+
+msgid "email address of sender"
+msgstr ""
+
+msgid "print messages that would be sent"
+msgstr ""
+
+msgid "write messages to mbox file instead of sending them"
+msgstr ""
+
+msgid "email addresses replies should be sent to"
+msgstr "emailadresser som svar ska skickas till"
+
+msgid "subject of first message (intro or single patch)"
+msgstr ""
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr ""
+
+msgid "omit hg patch header"
+msgstr ""
+
+msgid "send changes not found in the target repository"
+msgstr ""
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+
+msgid "name of the bundle attachment file"
+msgstr ""
+
+msgid "a revision to send"
+msgstr ""
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr ""
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr "hg email [FLAGGA]... [DEST]..."
+
+msgid "send changesets by email"
+msgstr "sänd ändringar via email"
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+" Som standard skickas diffar i samma format som :hg:`export` genererar,\n"
+" ett per meddelande. Serien börjar med en introduktion med rubriken\n"
+" \"[PATCH 0 of N]\", som beskriver serien i helhet."
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+" Varje patchmail har en ämnesrad med texten \"[PATCH M of N] ...\", och\n"
+" använder den första raden i ändringsbeskrivningen som ämnestext.\n"
+" Meddelandet innehåller två eller tre delar. Först, beskrivningen av\n"
+" ändringen."
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+" Med flaggan -d/--diffstat, om programmet diffstat är installerat,\n"
+" läggs resultatet av att köra diffstat på patchen in."
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr " Till slut, patchen, som genererad av :hg:`export`."
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created. You can include a patch both as text in the email\n"
+" body and as a regular or an inline attachment by combining the\n"
+" -a/--attach or -i/--inline with the --body option."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+" In case email sending fails, you will find a backup of your series\n"
+" introductory message in ``.hg/last-email.txt``."
+msgstr ""
+" Om sändning av mailet misslyckas, kommer du att hitta en backup av\n"
+" introduktionsmeddelandet i ``.hg/last-email.txt``."
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+msgid "no changes found\n"
+msgstr "inga ändringar hittades\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr ""
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr ""
+
+msgid "use only one form to specify the revision"
+msgstr ""
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+
+#, python-format
+msgid "this patch series consists of %d patches."
+msgstr ""
+
+msgid "no recipient addresses provided"
+msgstr "inga mottagaradresser angavs"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+
+msgid "are you sure you want to send (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+msgid "patchbomb canceled"
+msgstr ""
+
+msgid "displaying "
+msgstr "visar "
+
+msgid "sending "
+msgstr "sänder "
+
+msgid "sending"
+msgstr "sänder"
+
+msgid "writing"
+msgstr "skriver"
+
+msgid "show progress bars for some actions"
+msgstr ""
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+
+msgid "The following settings are available::"
+msgstr ""
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" changedelay = 1 # changedelay: minimum delay before showing a new topic.\n"
+" # If set to less than 3 * refresh, that value will\n"
+" # be used instead.\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number estimate # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit,\n"
+"estimate, speed, and item. item defaults to the last 20 characters of\n"
+"the item, but this can be changed by adding either ``-<num>`` which\n"
+"would take the last num characters, or ``+<num>`` for the first num\n"
+"characters.\n"
+msgstr ""
+
+#. i18n: format XX seconds as "XXs"
+#, python-format
+msgid "%02ds"
+msgstr "%02ds"
+
+#. i18n: format X minutes and YY seconds as "XmYYs"
+#, python-format
+msgid "%dm%02ds"
+msgstr "%dm%02ds"
+
+#. i18n: format X hours and YY minutes as "XhYYm"
+#, python-format
+msgid "%dh%02dm"
+msgstr "%dt%02dm"
+
+#. i18n: format X days and YY hours as "XdYYh"
+#, python-format
+msgid "%dd%02dh"
+msgstr "%dd%02dt"
+
+#. i18n: format X weeks and YY days as "XwYYd"
+#, python-format
+msgid "%dw%02dd"
+msgstr "%dv%02dd"
+
+#. i18n: format X years and YY weeks as "XyYYw"
+#, python-format
+msgid "%dy%02dw"
+msgstr "%då%02dv"
+
+#, python-format
+msgid "%d %s/sec"
+msgstr "%d %s/sek"
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+msgid "abort if an error occurs"
+msgstr ""
+
+msgid "purge ignored files too"
+msgstr ""
+
+msgid "print filenames instead of deleting them"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr ""
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#, python-format
+msgid "removing file %s\n"
+msgstr "tar bort file %s\n"
+
+#, python-format
+msgid "removing directory %s\n"
+msgstr "tar bort katalogen %s\n"
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "rebase from the specified changeset"
+msgstr ""
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+
+msgid "rebase these revisions"
+msgstr ""
+
+msgid "rebase onto the specified changeset"
+msgstr ""
+
+msgid "collapse the rebased changesets"
+msgstr ""
+
+msgid "use text as collapse commit message"
+msgstr "använd text som kollapsarkiveringsmeddelande"
+
+msgid "invoke editor on commit messages"
+msgstr "starta editor för arkiveringsmeddelande"
+
+msgid "read collapse commit message from file"
+msgstr "läs kollapsarkiveringsmeddelandet från fil"
+
+msgid "keep original changesets"
+msgstr ""
+
+msgid "keep original branch names"
+msgstr ""
+
+msgid "(DEPRECATED)"
+msgstr "(FÖRLEGAD)"
+
+msgid "specify merge tool"
+msgstr "ange sammanfogningsverktyg"
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+
+msgid "message can only be specified with collapse"
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr ""
+
+msgid "cannot use collapse with continue or abort"
+msgstr ""
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "tool option will be ignored\n"
+msgstr ""
+
+msgid "cannot specify both a source and a base"
+msgstr "kan inte ange både en källa och en bas"
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "cannot specify both a revision and a source"
+msgstr "kan inte ange både en revision och en källa"
+
+msgid "can't remove original changesets with unrebased descendants"
+msgstr ""
+
+msgid "use --keep to keep original changesets"
+msgstr "använd --keep för att bevara originaländringarna"
+
+#, python-format
+msgid "can't rebase immutable changeset %s"
+msgstr ""
+
+msgid "see hg help phases for details"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot collapse multiple named branches"
+msgstr "kan inte kollapsa flera namngivna grenar"
+
+msgid "rebasing"
+msgstr ""
+
+msgid "changesets"
+msgstr "ändringar"
+
+msgid "unresolved conflicts (see hg resolve, then hg rebase --continue)"
+msgstr "olösta konflikter (se hg resolve, sedan hg rebase --continue)"
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr "inga ändringar, revision %d hoppas över\n"
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr ""
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr "kan inte kollapsa, det finns mer än en extern förälder"
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+#, python-format
+msgid "can't abort rebase due to immutable changesets %s"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "no matching revisions"
+msgstr ""
+
+msgid "can't rebase multiple roots"
+msgstr ""
+
+msgid "source is ancestor of destination"
+msgstr ""
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "uppdaterar bokmärket %s\n"
+
+msgid "--tool can only be used with --rebase"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "specify merge tool for rebase"
+msgstr "ange sammanfogningsverktyg för ombasering"
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr "interaktivt val av ändringar för commit/qrefresh"
+
+msgid "ignore white space when comparing lines"
+msgstr "ignorera blanktecken när rader jämförs"
+
+msgid "ignore changes in the amount of white space"
+msgstr "ignorera ändringar av antalet blanktecken"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "ignorera ändringar vars rader är tomma"
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr "detta modifierar en binär fil (allt eller inget)\n"
+
+msgid "this is a binary file\n"
+msgstr "det här är en binär fil\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr "%d stycken, %d rader ändrade\n"
+
+msgid "[Ynesfdaq?]"
+msgstr "[Ynesfdaq?]"
+
+msgid "&Yes, record this change"
+msgstr "(&Y) Ja, lagra den här ändringen"
+
+msgid "&No, skip this change"
+msgstr "&Nej, hoppa över den här ändringen"
+
+msgid "&Edit the change manually"
+msgstr "(&E) Redigera ändringen manuellt"
+
+msgid "&Skip remaining changes to this file"
+msgstr "(&S) Hoppa över kvarvarande ändringar i den här filen"
+
+msgid "Record remaining changes to this &file"
+msgstr "Spara kvarvarande ändringar till denna &fil"
+
+msgid "&Done, skip remaining changes and files"
+msgstr "&(D) Klar, hoppa över kvarvarande ändringar och filer"
+
+msgid "Record &all changes to all remaining files"
+msgstr "Spara &alla ändringar till alla kvarvarande filer"
+
+msgid "&Quit, recording no changes"
+msgstr "(&Q) Avsluta, spara inga ändringar"
+
+msgid "&?"
+msgstr "&?"
+
+msgid "cannot edit patch for whole file"
+msgstr "kan inte redigera patch för hel fil"
+
+msgid "cannot edit patch for binary file"
+msgstr "kan inte redigera patch för binär fil"
+
+msgid ""
+"\n"
+"To remove '-' lines, make them ' ' lines (context).\n"
+"To remove '+' lines, delete them.\n"
+"Lines starting with # will be removed from the patch."
+msgstr ""
+"\n"
+"För att radera rader med '-', ersätt med blanka (' ') rader (kontext).\n"
+"För att radera rader med '+', radera dom.\n"
+"Rader som börjar med # kommer att raderas från patchen."
+
+msgid ""
+"If the patch applies cleanly, the edited hunk will immediately be\n"
+"added to the record list. If it does not apply cleanly, a rejects\n"
+"file will be generated: you can use that when you try again. If\n"
+"all lines of the hunk are removed, then the edit is aborted and\n"
+"the hunk is left unchanged.\n"
+msgstr ""
+"Om patchen appliceras utan problem, kommer det redigerade stycket att\n"
+"sparas. Om problem uppstår, kommer en .rej-fil att genereras: du kan\n"
+"använde den när du försöker igen. Om alla rader i stycket raderas, så\n"
+"avbryts redigeringen och stycket lämnas oförändrat.\n"
+
+msgid "edit failed"
+msgstr "redigering misslyckades"
+
+msgid "user quit"
+msgstr "användaren avslutade"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr "granska ändringar i %s?"
+
+msgid " and "
+msgstr " och "
+
+#, python-format
+msgid "record this change to %r?"
+msgstr "spara den här ändringen till %r?"
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr "spara ändring %d/%d till %r?"
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr "hg record [FLAGGA]... [FIL]..."
+
+msgid "interactively select changes to commit"
+msgstr "välj interaktivt ändringar för arkivering"
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+" Om filer inte anges, kommer alla ändringar som :hg:`status`\n"
+" rapporterar att arkiveras."
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+" Du kommer att frågas om du vill lagra ändrade filer, och i filer med\n"
+" flera ändringar kommer du att få frågan för varje ändring. Vid varje\n"
+" fråga är följande svar möjliga::"
+
+msgid ""
+" y - record this change\n"
+" n - skip this change\n"
+" e - edit this change manually"
+msgstr ""
+" y - lagra den här ändringen\n"
+" n - hoppa över den här ändringen\n"
+" e - redigera ändringen manuellt"
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+" s - hoppa över kvarvarande ändringar i den här filen\n"
+" f - spara kvarvarande ändringar till denna fil"
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+" d - klar, hoppa över kvarvarande ändringar och filer\n"
+" a - spara alla ändringar till alla kvarvarande filer\n"
+" q - avsluta, spara inga ändringar"
+
+msgid " ? - display help"
+msgstr " ? - visa hjälp"
+
+msgid " This command is not available when committing a merge."
+msgstr " Det här kommandot är inte tillgängligt vid sammanfogning."
+
+msgid "interactively record a new patch"
+msgstr "lägra en ny ändring interaktivt"
+
+msgid ""
+" See :hg:`help qnew` & :hg:`help record` for more information and\n"
+" usage.\n"
+" "
+msgstr ""
+" Se :hg:`help qnew` & :hg:`help record` för mer information och\n"
+" användning.\n"
+" "
+
+msgid "'mq' extension not loaded"
+msgstr "utökningen 'mq' är inte laddad"
+
+#, python-format
+msgid "running non-interactively, use %s instead"
+msgstr "kör icke-interaktivt, använd %s istället"
+
+msgid "cannot partially commit a merge (use \"hg commit\" instead)"
+msgstr ""
+"kan inte delvis arkivera en sammanfogning (använd \"hg commit\" istället)"
+
+msgid "no changes to record\n"
+msgstr "inga ändringar att lagra\n"
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr "hg qrecord [FLAGGA]... PATCH [FIL]..."
+
+msgid "interactively select changes to refresh"
+msgstr "interaktivt val av ändringar att uppdatera"
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+msgid "hardlinks are not supported on this system"
+msgstr "hårda länkar stöds inte av detta system"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "länkar om %s till %s\n"
+
+msgid "there is nothing to relink\n"
+msgstr "det finns inget att länka om\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr ""
+
+msgid "collecting"
+msgstr "samlar in"
+
+msgid "files"
+msgstr "filer"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr ""
+
+msgid "source and destination are on different devices"
+msgstr ""
+
+msgid "pruning"
+msgstr "putsar"
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr ""
+
+msgid "relinking"
+msgstr "länkar om"
+
+#, python-format
+msgid "relinked %d files (%s reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr ""
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+
+msgid "After that you can use it like::"
+msgstr ""
+
+msgid " hg clone py://trunk/"
+msgstr ""
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+
+#, python-format
+msgid "custom scheme %s:// conflicts with drive letter %s:\\\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "convert a shared repository to a normal one"
+msgstr "konvertera ett delat arkiv till ett normalt"
+
+msgid ""
+" Copy the store data to the repo and remove the sharedpath data.\n"
+" "
+msgstr ""
+
+msgid "this is not a shared repo"
+msgstr "det här är inte ett delat arkiv"
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr "%s är inte en förälder till %s"
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid "filter corrupted changeset (no user or date)"
+msgstr ""
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+"y: transplantera denna ändring\n"
+"n: hoppa över denna ändring\n"
+"m: sammanfoga vid denna ändring\n"
+"p: visa patch\n"
+"c: arkivera valda ändringar\n"
+"q: avbryt transplantation\n"
+"?: visa denna hjälp\n"
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr "applicera ändring? [ynmpcq?]:"
+
+msgid "no such option\n"
+msgstr "inget sådant alternativ\n"
+
+msgid "pull patches from REPO"
+msgstr ""
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "parent to choose when transplanting merge"
+msgstr "förälder att välja när sammanfogning transplanteras"
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through command"
+msgstr ""
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. The changesets\n"
+" are copied and will thus appear twice in the history. Use the\n"
+" rebase extension instead if you want to move a whole branch of\n"
+" unpublished changesets."
+msgstr ""
+
+msgid ""
+" If --log is specified, log messages will have a comment appended\n"
+" of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REV --all` will transplant the\n"
+" selected branch (up to the named revision) onto your current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" Merge changesets may be transplanted directly by specifying the\n"
+" proper parent changeset by calling :hg:`transplant --parent`."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid ""
+"``transplanted([set])``\n"
+" Transplanted changesets in set, or all transplanted changesets."
+msgstr ""
+
+msgid ""
+":transplanted: String. The node identifier of the transplanted\n"
+" changeset if any."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- If the repository path ends with 0x5c, .hg/hgrc cannot be read.\n"
+"- win32mbcs is not compatible with fixutf8 extension."
+msgstr ""
+
+msgid ""
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr ""
+
+msgid "archiving"
+msgstr "arkiverar"
+
+#, python-format
+msgid "malformed line in .hg/bookmarks: %r\n"
+msgstr "defekt rad i .hg/bookmarks: %r\n"
+
+#, python-format
+msgid "bookmark '%s' contains illegal character"
+msgstr "bokmärket '%s' innehåller ogiltiga tecken"
+
+#, python-format
+msgid "branch %s not found"
+msgstr "grenen %s hittades inte"
+
+#, python-format
+msgid "divergent bookmark %s stored as %s\n"
+msgstr "divergent bokmärke %s lagrat som %s\n"
+
+#, python-format
+msgid "adding remote bookmark %s\n"
+msgstr "lägger till fjärrbokmärket %s\n"
+
+msgid "searching for changed bookmarks\n"
+msgstr "söker efter ändrade bokmärken\n"
+
+msgid "no changed bookmarks found\n"
+msgstr "inga ändrade bokmärken hittades\n"
+
+msgid "unknown parent"
+msgstr "okänd förälder"
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "stream ended unexpectedly (got %d bytes, expected %d)"
+msgstr "strömmen slutade abrupt (fick %d bytes av förväntade %d)"
+
+# python-format
+#, python-format
+msgid "invalid chunk length %d"
+msgstr "ogiltig styckelängd %d"
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s: inte en Mercurial-buntfil"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: okänd buntversion %s"
+
+msgid "empty username"
+msgstr "tomt användarnamn"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "användarnamnet %s innehåller en radbrytning"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr "namnet '%s' är reserverat"
+
+#, python-format
+msgid "uncommitted changes in subrepo %s"
+msgstr "oarkiverade ändringar i underarkivet %s"
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr "du kan bara ange en av --message och --logfile"
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "kan inte läsa arkiveringsmeddelande '%s': %s"
+
+msgid "limit must be a positive integer"
+msgstr "limit måste vara ett positivt heltal"
+
+msgid "limit must be positive"
+msgstr "limit måste vara positivt"
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+msgid "cannot specify --changelog and --manifest at the same time"
+msgstr "kan inte ange --changelog och --manifest samtidigt"
+
+msgid "cannot specify filename with --changelog or --manifest"
+msgstr ""
+
+msgid "cannot specify --changelog or --manifest without a repository"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr ""
+
+#, python-format
+msgid "revlog '%s' not found"
+msgstr "revlog '%s' hittades inte"
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: can't copy - same file\n"
+msgstr "%s: kan inte kopiera - samma fil\n"
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr "%s: sparar inte flytt - %s existerar inte\n"
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr "%s: sparar inte flytt - %s existerar inte\n"
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr ""
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr ""
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr ""
+
+msgid "no source or destination specified"
+msgstr ""
+
+msgid "no destination specified"
+msgstr ""
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "(consider using --after)\n"
+msgstr ""
+
+msgid "child process failed to start"
+msgstr "barnprocess kunde inte startas"
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "ändring: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "gren: %s\n"
+
+#, python-format
+msgid "bookmark: %s\n"
+msgstr "bokmärke: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "märke: %s\n"
+
+#, python-format
+msgid "phase: %s\n"
+msgstr "fas: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "förälder: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifest: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "användare: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "datum: %s\n"
+
+msgid "files+:"
+msgstr "filer+:"
+
+msgid "files-:"
+msgstr "filer-:"
+
+msgid "files:"
+msgstr "filer:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "filer: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "kopior: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr ""
+
+msgid "description:\n"
+msgstr "beskrivning:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "kortfattat: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "found revision %s from %s\n"
+msgstr "hittade revision %s från %s\n"
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow file not in parent revision: \"%s\""
+msgstr "kan inte följa fil som inte finns i förälderrevision: \"%s\""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr "kan inte följa icke-existerande fil: \"%s\""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr "kan bara följa kopior/namnbyten för explicita filnamn"
+
+#, python-format
+msgid "-G/--graph option is incompatible with --%s"
+msgstr "flaggan -G/--graph är inkompatibel med --%s"
+
+#, python-format
+msgid "adding %s\n"
+msgstr "lägger till %s\n"
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr ""
+
+#, python-format
+msgid "amending changeset %s\n"
+msgstr "förändrar ändringen %s\n"
+
+#, python-format
+msgid "copying changeset %s to %s\n"
+msgstr "kopierar ändringen %s till %s\n"
+
+#, python-format
+msgid "stripping intermediate changeset %s\n"
+msgstr "avlägsnar mellanliggande ändring %s\n"
+
+#, python-format
+msgid "stripping amended changeset %s\n"
+msgstr "avlägsnar förändrad ändring %s\n"
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr ""
+
+msgid "HG: Leave message empty to abort commit."
+msgstr ""
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: användare: %s"
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr ""
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr ""
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: lade till %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: ändrade %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: raderade %s"
+
+msgid "HG: no files changed"
+msgstr "HG: inga ändrade filer"
+
+msgid "empty commit message"
+msgstr "tomt arkiveringsmeddelande"
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr "glömmer %s\n"
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "återställer %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "Ã¥ngrar radering av %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "filen hanteras inte: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "inga ändringar behövs för %s\n"
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr "arkivrotkatalog eller namn på påläggsbuntfil"
+
+msgid "DIR"
+msgstr ""
+
+msgid "change working directory"
+msgstr "ändra arbetskatalog"
+
+msgid "do not prompt, automatically pick the first choice for all prompts"
+msgstr "fråga inte, välj automatiskt det första valet för alla frågor"
+
+msgid "suppress output"
+msgstr "förhindra utmatning"
+
+msgid "enable additional output"
+msgstr "aktivera ytterligare utmatning"
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr "sätt/upphäv konfigurationsflagga (använd 'sektion.namn=värde')"
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr "aktivera debugutmatning"
+
+msgid "start debugger"
+msgstr "starta debugger"
+
+msgid "set the charset encoding"
+msgstr "sätt teckenkodning"
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr "sätt teckenkodningsläge"
+
+msgid "always print a traceback on exception"
+msgstr "visa alltid bakåtspårning vid undantag"
+
+msgid "time how long the command takes"
+msgstr "ta tid på hur lång tid kommandot körs"
+
+msgid "print command execution profile"
+msgstr "visa kommandoexekveringens profil"
+
+msgid "output version information and exit"
+msgstr "skriv versionsinformation och avsluta"
+
+msgid "display help and exit"
+msgstr "visa hjälp och avsluta"
+
+msgid "do not perform actions, just print output"
+msgstr "utför inget, bara visa"
+
+msgid "specify ssh command to use"
+msgstr "specificera ssh-kommando att använda"
+
+msgid "specify hg command to run on the remote side"
+msgstr "specificera hg-kommando att köra på andra sidan"
+
+msgid "do not verify server certificate (ignoring web.cacerts config)"
+msgstr ""
+"verifiera inte servercertifikatet (ignorerar web.cacerts-konfiguration)"
+
+msgid "PATTERN"
+msgstr "MÖNSTER"
+
+msgid "include names matching the given patterns"
+msgstr "inkludera namn som matchar de givna mönstren"
+
+msgid "exclude names matching the given patterns"
+msgstr "exkludera namn som matchar de givna mönstren"
+
+msgid "use text as commit message"
+msgstr "använd text som arkiveringsmeddelande"
+
+msgid "read commit message from file"
+msgstr "läs arkiveringsmeddelandet från fil"
+
+msgid "record the specified date as commit date"
+msgstr "lagra det angivna datumet som arkiveringsdatumet"
+
+msgid "record the specified user as committer"
+msgstr "lagra den angivna användaren som arkiverare"
+
+msgid "STYLE"
+msgstr "STIL"
+
+msgid "display using template map file"
+msgstr "visa med mallfil"
+
+msgid "display with template"
+msgstr "visa med mall"
+
+msgid "show patch"
+msgstr "visa patch"
+
+msgid "do not show merges"
+msgstr "visa inte sammanfogningar"
+
+msgid "output diffstat-style summary of changes"
+msgstr "visa sammanfattning av ändringar i diffstat-stil"
+
+msgid "show the revision DAG"
+msgstr "visa revisionsdiagram"
+
+msgid "treat all files as text"
+msgstr "behandla alla filer som text"
+
+msgid "omit dates from diff headers"
+msgstr "exkludera datum från diff-rubriker"
+
+msgid "show which function each change is in"
+msgstr "visa vilken funktion varje ändring är i"
+
+msgid "produce a diff that undoes the changes"
+msgstr "skapa en diff som ångrar ändringarna"
+
+msgid "number of lines of context to show"
+msgstr "antal sammanhangsrader att visa"
+
+msgid "SIMILARITY"
+msgstr "LIKHET"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr "gissa omdöpta filer efter likhet (0<=s<=100)"
+
+msgid "recurse into subrepositories"
+msgstr "gå in i underarkiv"
+
+msgid "[OPTION]... [FILE]..."
+msgstr "[FLAGGA]... [FIL]..."
+
+msgid "add the specified files on the next commit"
+msgstr "lägg till de angivna filerna i nästa arkivering"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr " Schemalägg filer att versionshanteras och läggas till i arkivet."
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" Filerna kommer att läggas till i arkivet vid nästa arkivering. För att\n"
+" ångra en addering innan dess, se :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr " Om inga namn anges, läggs alla filer till i arkivet."
+
+msgid " .. container:: verbose"
+msgstr " .. container:: verbose"
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+" Ett exempel som visar hur nya (okända) filer läggs\n"
+" till automatiskt av :hg:`add`::"
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" lägger till foo.c\n"
+" $ hg status\n"
+" A foo.c"
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" Returnerar 0 om alla filer kunde läggas till.\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "lägg till alla nya nya filer, radera alla saknade filer"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" Lägg till alla nya filer och radera alla saknade filer från arkivet."
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" ``.hgignore``. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" Nya filer ignoreras om de överrensstämmer något av mönstren i\n"
+" ``.hgignore``. Precis som med add, kommer ändringarna att träda i kraft\n"
+" vid nästa arkivering."
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. With a parameter greater than 0,\n"
+" this compares every removed file with every added file and records\n"
+" those similar enough as renames. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed. If\n"
+" not specified, -s/--similarity defaults to 100 and only renames of\n"
+" identical files are detected."
+msgstr ""
+" Använd flaggan -s/--similarity för att upptäcka omdöpta filer. Flaggan\n"
+" tar ett procentvärde mellan 0 (deaktiverad) och 100 (filer måste vara\n"
+" identiska) som parameter. Med en parameter större än 0, kommer varje\n"
+" borttagen fil att jämföras med varje tillagd fil och lagrar de som är\n"
+" tillräckligt lika som ett namnbyte. Att upptäcka omdöpta filer på det\n"
+" här sättet kan ta lång tid. Efter att denna flagga har använts, kan\n"
+" :hg:`status -C` användas för att kontrollera vilka filer som\n"
+" identifierades som flyttade eller omdöpta. Om den flaggan inte anges,\n"
+" upptäcks bara namnbyten för identiska filer."
+
+msgid "similarity must be a number"
+msgstr "likhet måste vara ett nummer"
+
+msgid "similarity must be between 0 and 100"
+msgstr "likhet måste vara mellan 0 och 100"
+
+msgid "annotate the specified revision"
+msgstr "annotera den angivna revisionen"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr "följ kopieringar/namnbyten och visa filnamnet (FÖRLEGAD)"
+
+msgid "don't follow copies and renames"
+msgstr "följ inte kopieringar och namnbyten"
+
+msgid "list the author (long with -v)"
+msgstr "visa skapare (lång med -v)"
+
+msgid "list the filename"
+msgstr "visa filnamnet"
+
+msgid "list the date (short with -q)"
+msgstr "visa datum (kort med -q)"
+
+msgid "list the revision number (default)"
+msgstr "visa revisionsnummer (standard)"
+
+msgid "list the changeset"
+msgstr "visa ändring"
+
+msgid "show line number at the first appearance"
+msgstr "visa radnummer för första förekomsten"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FIL..."
+
+msgid "show changeset information by line for each file"
+msgstr "visa ändringsinformation för varje rad i filer"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr " Visa ändringar i filer, och ansvarigt revisions-ID för varje rad"
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+" Detta kommando är användbart för att upptäcka när en ändring gjordes\n"
+" och av vem."
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+" Utan flaggan -a/--text, kommer annotate att undvika behandling av filer\n"
+" som upptäcks vara binära. Med -a, kommer filen att annoteras ändå, även\n"
+" om resultatet antagligen inte kommer att vara användbart."
+
+msgid "at least one filename or pattern is required"
+msgstr "minst ett filnamn eller mönster krävs"
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr "%s: binär fil\n"
+
+msgid "do not pass files through decoders"
+msgstr "passera inte filer genom dekoders"
+
+msgid "directory prefix for files in archive"
+msgstr "katalogprefix för filer i arkiv"
+
+msgid "PREFIX"
+msgstr "PREFIX"
+
+msgid "revision to distribute"
+msgstr "revision att distribuera"
+
+msgid "type of distribution to create"
+msgstr "distributionstyp att skapa"
+
+msgid "[OPTION]... DEST"
+msgstr "[FLAGGA]... DEST"
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "skapa ett icke versionshanterat arkiv från en arkivrevision"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+" Som standard används revisonen för arbetskatalogens förälder; använd\n"
+" -r/--rev för att angivna en annan revision."
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+" Arkivtypen upptäcks automatiskt baserat på filändelsen (eller tvinga\n"
+" med hjälp av -t/--type)."
+
+msgid " Examples:"
+msgstr " Exempel:"
+
+msgid " - create a zip file containing the 1.0 release::"
+msgstr " - skapa en zip-fil som innehåller 1.0-releasen::"
+
+msgid " hg archive -r 1.0 project-1.0.zip"
+msgstr " hg archive -r 1.0 project-1.0.zip"
+
+msgid " - create a tarball excluding .hg files::"
+msgstr " - skapa en tarboll utan .hg-filer::"
+
+msgid " hg archive project.tar.gz -X \".hg*\""
+msgstr " hg archive project.tar.gz -X \".hg*\""
+
+msgid " Valid types are:"
+msgstr " Giltiga typer är:"
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+" :``files``: en katalog fylld med filer (standard)\n"
+" :``tar``: tar-arkiv, okomprimerad\n"
+" :``tbz2``: tar-arkiv, komprimerad med bzip2\n"
+" :``tgz``: tar-arkiv, komprimerad med gzip\n"
+" :``uzip``: zip-arkiv, okomprimerad\n"
+" :``zip``: zip-arkiv, komprimerad med deflate"
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+" Det exakta namnet på destinationsarkivet eller -katalogen anges med en\n"
+" formatsträng; se :hg:`help export` för detaljer."
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+" Varje fil som läggs till en arkivfil har ett katalogprefix. Använd\n"
+" -p/--prefix för att ange en formatsträng för prefixet. Som standard\n"
+" används basnamnet för arkivet, med suffix borttagna."
+
+msgid "no working directory: please specify a revision"
+msgstr "ingen arbetskatalog: ange en revision"
+
+msgid "repository root cannot be destination"
+msgstr "arkivroten kan inte vara destinationen"
+
+msgid "cannot archive plain files to stdout"
+msgstr "kan inte arkivera rena filer till stdout"
+
+msgid "merge with old dirstate parent after backout"
+msgstr "sammanfoga med gamla dirstate-föräldern efter återkallning"
+
+msgid "parent to choose when backing out merge (DEPRECATED)"
+msgstr "förälder att välja när en sammanfogning återkallas (FÖRLEGAD)"
+
+msgid "revision to backout"
+msgstr "revision att återkalla"
+
+msgid "[OPTION]... [-r] REV"
+msgstr "[FLAGGA]... [-r] REV"
+
+msgid "reverse effect of earlier changeset"
+msgstr "omvänd effekten från en tidigare ändring"
+
+msgid ""
+" Prepare a new changeset with the effect of REV undone in the\n"
+" current working directory."
+msgstr ""
+" Förbered en ny ändring där effekterna av REV ogörs i arbetskatalogen."
+
+msgid ""
+" If REV is the parent of the working directory, then this new changeset\n"
+" is committed automatically. Otherwise, hg needs to merge the\n"
+" changes and the merged result is left uncommitted."
+msgstr ""
+" Om REV är förälder till arbetskatalogen, så arkiveras denna ändring\n"
+" automatiskt. Annars krävs att hg sammanfogar ändringarna och det\n"
+" sammanfogade resultatet lämnas oarkiverat."
+
+msgid ""
+" .. note::\n"
+" backout cannot be used to fix either an unwanted or\n"
+" incorrect merge."
+msgstr ""
+" .. note::\n"
+" backout kan inte användas för att fixa en oönskad eller felaktig\n"
+" sammanfogning."
+
+msgid ""
+" By default, the pending changeset will have one parent,\n"
+" maintaining a linear history. With --merge, the pending\n"
+" changeset will instead have two parents: the old parent of the\n"
+" working directory and a new child of REV that simply undoes REV."
+msgstr ""
+" Som standard kommer ändringen att ha en förälder, för att bibehålla\n"
+" en linjär historik. Med --merge kommer ändringen istället att ha två\n"
+" föräldrar: den gamla föräldern från arbetskatalogen och ett nytt\n"
+" barn av REV som helt enkelt ogör REV."
+
+msgid ""
+" Before version 1.7, the behavior without --merge was equivalent\n"
+" to specifying --merge followed by :hg:`update --clean .` to\n"
+" cancel the merge and leave the child of REV as a head to be\n"
+" merged separately."
+msgstr ""
+" Innan version 1.7, så var beteendet utan --merge ekvivalent med att\n"
+" ange --merge följt av :hg:`update --clean .` för att ångra\n"
+" sammanfogningen och lämna barnet till REV som ett huvud att\n"
+" sammanfogas separat."
+
+msgid "please specify just one revision"
+msgstr "ange bara en revision"
+
+msgid "please specify a revision to backout"
+msgstr "ange en revision att återkalla"
+
+msgid "cannot backout change on a different branch"
+msgstr "kan inte återkalla en ändring på en annan gren"
+
+msgid "cannot backout a change with no parents"
+msgstr "kan inte återkalla en ändring utan föräldrar"
+
+msgid "cannot backout a merge changeset"
+msgstr "kan inte återkalla en sammanfogning"
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr "kan inte använda --parent på icke-sammanfogande ändring"
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr "ändringen %s återkallar ändringen %s\n"
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr "sammanfogar med ändring %s\n"
+
+msgid "reset bisect state"
+msgstr "återställ bisect-tillständ"
+
+msgid "mark changeset good"
+msgstr "markera ändringen som bra"
+
+msgid "mark changeset bad"
+msgstr "markera ändringen som dålig"
+
+msgid "skip testing changeset"
+msgstr "hoppa över test av ändring"
+
+msgid "extend the bisect range"
+msgstr "utöka bisect-område"
+
+msgid "use command to check changeset state"
+msgstr "använd kommando för att kontrollera ändringsstatus"
+
+msgid "do not update to target"
+msgstr "uppdatera inte till målet"
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr "[-gbsr] [-U] [-c KMD] [REV]"
+
+msgid "subdivision search of changesets"
+msgstr "genomsökning av ändringar med halveringsmetoden"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+" Detta kommando hjälper till att hitta ändringar som skapar problem. För\n"
+" att använda, markera den tidigaste ändringen du vet har problemet som\n"
+" dålig, och markera sedan den senaste problemfria ändringen som bra.\n"
+" Bisect uppdaterar din arbetskatalog till en revision för testning (om\n"
+" inte -U/--noupdate anges). När du har testat, markera arbetskatalogen\n"
+" som bra eller dålig, och bisect kommer endera att uppdatera till en\n"
+" annan kandidat eller meddela att den dåliga revisionen har hittats."
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+" Som en genväg kan du också använda revisionsargumentet för att markera\n"
+" en revision som bra eller dålig utan att kontrollera den först."
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" The environment variable HG_NODE will contain the ID of the\n"
+" changeset being tested. The exit status of the command will be\n"
+" used to mark revisions as good or bad: status 0 means good, 125\n"
+" means to skip the revision, 127 (command not found) will abort the\n"
+" bisection, and any other non-zero exit status means the revision\n"
+" is bad."
+msgstr ""
+" Om du tillhandahåller ett kommando, kommer det att användas för\n"
+" automatisk genomsökning. Miljövariabeln HG_NODE kommer att innehålla\n"
+" ID för den ändring som testas. Returkoden från kommandot kommer att\n"
+" användas för att markera en revision som bra eller dålig: 0 betyer\n"
+" bra, 125 betyder hoppa över revionen, 127 (kommandot hittades inte)\n"
+" kommer att avbryta genomsökningen, och alla andra värden betyder att\n"
+" revisionen är dålig."
+
+msgid " Some examples:"
+msgstr " NÃ¥gra exempel:"
+
+msgid ""
+" - start a bisection with known bad revision 12, and good revision 34::"
+msgstr ""
+" - starta en sökning med känd dålig revision 12, och bra revision 34::"
+
+msgid ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+msgstr ""
+" hg bisect --bad 34\n"
+" hg bisect --good 12"
+
+msgid ""
+" - advance the current bisection by marking current revision as good "
+"or\n"
+" bad::"
+msgstr ""
+" - stega den nuvarande sökningen genom att markera nuvarande revision\n"
+" som bra eller dålig::"
+
+msgid ""
+" hg bisect --good\n"
+" hg bisect --bad"
+msgstr ""
+" hg bisect --good\n"
+" hg bisect --bad"
+
+msgid ""
+" - mark the current revision, or a known revision, to be skipped (eg. "
+"if\n"
+" that revision is not usable because of another issue)::"
+msgstr ""
+" - markera att den nuvarande revisionen, eller en känd revision, ska\n"
+" hoppas över (ex. om den revisionen är oanvändbar på grund av annat\n"
+" fel)::"
+
+msgid ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+msgstr ""
+" hg bisect --skip\n"
+" hg bisect --skip 23"
+
+msgid " - forget the current bisection::"
+msgstr " - glöm den aktuella genomsökningen::"
+
+msgid " hg bisect --reset"
+msgstr " hg bisect --reset"
+
+msgid ""
+" - use 'make && make tests' to automatically find the first broken\n"
+" revision::"
+msgstr ""
+" - använd 'make && make tests' för att automatiskt hitta den första\n"
+" defekta revisionen::"
+
+msgid ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+msgstr ""
+" hg bisect --reset\n"
+" hg bisect --bad 34\n"
+" hg bisect --good 12\n"
+" hg bisect --command 'make && make tests'"
+
+msgid ""
+" - see all changesets whose states are already known in the current\n"
+" bisection::"
+msgstr ""
+" - visa alla ändringar vars status redan är kända i den nuvarande\n"
+" genomsökningen::"
+
+msgid " hg log -r \"bisect(pruned)\""
+msgstr " hg log -r \"bisect(pruned)\""
+
+msgid ""
+" - see the changeset currently being bisected (especially useful\n"
+" if running with -U/--noupdate)::"
+msgstr ""
+" - se ändringen som genomsöks (mest användbart med -U/--no-update)::"
+
+msgid " hg log -r \"bisect(current)\""
+msgstr " hg log -r \"bisect(current)\""
+
+msgid " - see all changesets that took part in the current bisection::"
+msgstr " - se alla ändringar som var med i den nuvarande genomsökningen::"
+
+msgid " hg log -r \"bisect(range)\""
+msgstr " hg log -r \"bisect(range)\""
+
+msgid " - with the graphlog extension, you can even get a nice graph::"
+msgstr " - med graphlog-utökningen så kan du få en söt graf::"
+
+msgid " hg log --graph -r \"bisect(range)\""
+msgstr " hg log --graph -r \"bisect(range)\""
+
+msgid " See :hg:`help revsets` for more about the `bisect()` keyword."
+msgstr " Se :hg:`help revsets` för mer om nyckelordet `bisect()`."
+
+msgid "The first good revision is:\n"
+msgstr "Den första bra revisionen är:\n"
+
+msgid "The first bad revision is:\n"
+msgstr "Den första dåliga revisionen är:\n"
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"Use bisect --extend to continue the bisection from\n"
+"the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+"Tack vare skippade revisioner, är den första bra revisionen någon av:\n"
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+"Tack vare skippade revisioner, kan den första dåliga revisionen någon av:\n"
+
+msgid "cannot bisect (no known good revisions)"
+msgstr "kan inte genomsöka (inga kända bra revisioner)"
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr "kan inte genomsöka (inga kända dåliga revisioner)"
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr "(användning av 'hg bisect <kmd>' är föråldrat)\n"
+
+msgid "incompatible arguments"
+msgstr "inkompatibla argument"
+
+msgid "current bisect revision is unknown - start a new bisect to fix"
+msgstr ""
+
+msgid "current bisect revision is a merge"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr "misslyckades med att köra %s"
+
+#, python-format
+msgid "%s killed"
+msgstr "%s dödad"
+
+#, python-format
+msgid "changeset %d:%s: %s\n"
+msgstr "ändring %d:%s: %s\n"
+
+#, python-format
+msgid "Extending search to changeset %d:%s\n"
+msgstr "Utökar sökningen till ändringen %d:%s\n"
+
+msgid "nothing to extend"
+msgstr "inget att utöka"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr "Testar ändring %d:%s (%d ändringar kvar, ~%d test)\n"
+
+msgid "force"
+msgstr "tvinga"
+
+msgid "delete a given bookmark"
+msgstr "ta bort angivet bokmärke"
+
+msgid "rename a given bookmark"
+msgstr "döp om angivet bokmärke"
+
+msgid "mark a bookmark inactive"
+msgstr "markera ett bokmärke som inaktivt"
+
+msgid "hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]"
+msgstr "hg bookmarks [-f] [-d] [-i] [-m NAMN] [-r REV] [NAMN]"
+
+msgid "track a line of development with movable markers"
+msgstr "spåra viss utveckling med flyttbara markörer"
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when committing.\n"
+" Bookmarks are local. They can be renamed, copied and deleted. It is\n"
+" possible to use :hg:`merge NAME` to merge from a given bookmark, and\n"
+" :hg:`update NAME` to update to a given bookmark."
+msgstr ""
+" Bokmärken är pekare till utvalda arkiveringar som flyttar vid\n"
+" arkivering. Bokmärken är lokala. De kan döpas om, kopieras och\n"
+" raderas. Det är möjligt att använda bokmärkesnamn i :hg:`merge NAMN`\n"
+" för att sammanfoga från ett bokmärke, och :hg:`update NAMN` för att\n"
+" uppdatera till ett visst bokmärke."
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+" Du kan använda :hg:`bookmark NAMN` för att sätta ett bokmärke på\n"
+" arbetskatalogens föräldrarevision med det angivna namnet. Om du anger\n"
+" en revision med -r REV (där REV kan vara ett existerande bokmärke), så\n"
+" tilldelas bokmärket till den revisionen."
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires both the local and remote\n"
+" repositories to support bookmarks. For versions prior to 1.8, this "
+"means\n"
+" the bookmarks extension must be enabled."
+msgstr ""
+" Bokmärken kan tryckas och dras mellan arkiv (se :hg:`help push` och\n"
+" :hg:`help pull`). Detta kräver att både det lokala och fjärrarkivet\n"
+" stödjer bokmärken. För versioner innan 1.8, så betyder det att\n"
+" bookmarks-utökningen måste vara aktiverad."
+
+msgid ""
+" With -i/--inactive, the new bookmark will not be made the active\n"
+" bookmark. If -r/--rev is given, the new bookmark will not be made\n"
+" active even if -i/--inactive is not given. If no NAME is given, the\n"
+" current active bookmark will be marked inactive.\n"
+" "
+msgstr ""
+" Med -i/--inactive blir det nya bokmärket inte det aktiva bokmärket.\n"
+" Om -r/--rev anges så är bokmärket inte aktivt även om -i/--inactive\n"
+" inte anges. Om inget NAMN anges, kommer det nuvarande aktiva bokmärket\n"
+" att markeras som inaktivt.\n"
+" "
+
+msgid "bookmark name required"
+msgstr "bokmärkesnamn krävs"
+
+#, python-format
+msgid "bookmark '%s' does not exist"
+msgstr "bokmärket '%s' existerar inte"
+
+#, python-format
+msgid "bookmark '%s' already exists (use -f to force)"
+msgstr "bokmärket '%s' existerar redan (använd -f för att tvinga)"
+
+msgid "new bookmark name required"
+msgstr "nytt bokmärkesnamn krävs"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "bokmärkesnamn kan inte innehålla radbrytningar"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr "bokmärkesnamn kan inte bara bestå av blanktecken"
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr "ett bokmärket kan inte ha samma namn som en existerande gren"
+
+msgid "no bookmarks set\n"
+msgstr "inget bokmärke satt\n"
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr "sätt grennamnet även om det döljer en existerande gren"
+
+msgid "reset branch name to parent branch name"
+msgstr "återställ grennamn till förälderns grennamn"
+
+msgid "[-fC] [NAME]"
+msgstr "[-fC] [NAMN]"
+
+msgid "set or show the current branch name"
+msgstr "sätt eller visa det aktuella grennamnet"
+
+msgid ""
+" .. note::\n"
+" Branch names are permanent and global. Use :hg:`bookmark` to create "
+"a\n"
+" light-weight bookmark instead. See :hg:`help glossary` for more\n"
+" information about named branches and bookmarks."
+msgstr ""
+" .. note::\n"
+" Grennamn är permanenta och globala. Använd :hg:`bookmark` för att\n"
+" skapa ett lättviktsbokmärke istället. Se :hg:`help glossary` för\n"
+" mer information om namngivna grenar och bokmärken."
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+" Utan arguments visas det aktuella grennamnet. Med ett argument\n"
+" sätts arbetskatalogens grennamn (grenen existerar inte i arkivet\n"
+" förrän nästa arkivering). Standardförfarandet är att all primär\n"
+" utveckling sker i grenen 'default'."
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+" Om inte -f/--force är angiven, kommer branch inte att tillåta dig att\n"
+" sätta ett grennamn som redan existerar, även om den är inaktiv."
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+" Använd -C/--clean för att återställa arbetskatalogens gren till\n"
+" samma som förälderns arbetskatalog, och återställer ett tidigare\n"
+" grenbyte."
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+" Använd kommandot :hg:`update` för att byta till en existerande gren.\n"
+" Använd :hg:`commit --close-branch` för att markera grenen som stängd."
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "återställ arbetskatalogen till grenen %s\n"
+
+msgid "a branch of the same name already exists"
+msgstr "ett grennamn med det namnet existerar redan"
+
+#. i18n: "it" refers to an existing branch
+msgid "use 'hg update' to switch to it"
+msgstr "använd 'hg update' för att byta till den"
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "markerade arbetskatalogen som grenen %s\n"
+
+msgid "(branches are permanent and global, did you want a bookmark?)\n"
+msgstr "(grenar är permanenta och globala, ville du ha ett bokmärke?)\n"
+
+msgid "show only branches that have unmerged heads"
+msgstr "visa bara grenar som har icke-sammanfogade huvuden"
+
+msgid "show normal and closed branches"
+msgstr "visa normala och stängda grenar"
+
+msgid "[-ac]"
+msgstr "[-ac]"
+
+msgid "list repository named branches"
+msgstr "visa namngivna grenar i arkivet"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+" Visa alla namngivna grenar i arkivet, och indikera vilka som är\n"
+" inaktiva. Om -c/--closed anges, visas också grenar som har markerats\n"
+" som stängda (se :hg:`commit --close-branch`)."
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+" Om -a/--acive anges, visas bara aktiva grenar. En gren anses aktiv om\n"
+" den innehåller arkivhuvuden."
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+" Använd kommandot :hg:`update` för att byta till en existerande gren."
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+" Returnerar 0.\n"
+" "
+
+msgid " (closed)"
+msgstr " (stängd)"
+
+msgid " (inactive)"
+msgstr " (inaktiv)"
+
+msgid "run even when the destination is unrelated"
+msgstr "kör även när destinationen är obesläktad"
+
+msgid "a changeset intended to be added to the destination"
+msgstr "en ändring avsedd att läggas till destinationen"
+
+msgid "a specific branch you would like to bundle"
+msgstr "en specifik gren du vill bunta"
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr "en basändring som antas är tillgängliga i destinationen"
+
+msgid "bundle all changesets in the repository"
+msgstr "bunta alla ändringar i arkivet"
+
+msgid "bundle compression type to use"
+msgstr "typ av buntkompression att använda"
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr "[-f] [-t TYP] [-a] [-r REV]... [--base REV]... FIL [DEST]"
+
+msgid "create a changegroup file"
+msgstr "skapa en ändringsgruppsfil"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+" Skapa en komprimerad ändringsgruppfil genom att samla ihop ändringar\n"
+" som inte finns i ett annat arkiv."
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+" Om inget destinationsarkiv anges, så antar hg att destinationen har\n"
+" alla noder du anger med parametrar av typen --base. För att skapa en\n"
+" bunt med alla ändringar, använd -a/--all (eller --base null)."
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+" Du kan ändra kompressionsmetod med flaggan -t/--type. De tillgänliga\n"
+" kompressionsmetoderna är: none, bzip2, och gzip (som standard\n"
+" komprimeras buntar med bzip2)."
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+" Buntfilen kan överföras med konventionella metoder och appliceras i\n"
+" ett annat arkiv med kommandot unbundle eller pull. Detta är\n"
+" användbart när en direkt push och pull inte är tillgängliga eller\n"
+" när export av ett helt arkiv inte är intressant."
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+" Applicering av buntar bevarar allt ändringsinnehåll inklusive\n"
+" tillstånd, information om kopior/namnbyte, och revisionshistorik."
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om inga ändringar hittades.\n"
+" "
+
+msgid "unknown bundle type specified with --type"
+msgstr "okänd bunttyp angiven med --type"
+
+msgid "--base is incompatible with specifying a destination"
+msgstr "--base är inkompatibel med specificering av destination"
+
+msgid "print output to file with formatted name"
+msgstr "skriv utmatning till fil med formatterat namn"
+
+msgid "print the given revision"
+msgstr "visa den angivna revisionen"
+
+msgid "apply any matching decode filter"
+msgstr "applicera valfritt överrensstämmande avkodningsfilter"
+
+msgid "[OPTION]... FILE..."
+msgstr "[FLAGGA]... FIL..."
+
+msgid "output the current or given revision of files"
+msgstr "visa den aktuella eller angivna revisionen för filer"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+" Visa de angivna filerna som de ser ut i den angivna revisionen. Om\n"
+" ingen revision anges, så används arbetskatalogens förälder, eller tip\n"
+" om ingen revision är uthämtad."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+" Utmatning kan vara till en fil, och då anges filnamnet med en\n"
+" formatsträng. Formatteringsreglerna är samma som för kommandot\n"
+" export, med följande tillägg:"
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+" :``%s``: basnamn på den visade filen\n"
+" :``%d``: katalognamn på den visade filen, eller '.' om i arkivroten\n"
+" :``%p``: rotrelativ sökvägsnamn för den visade filen"
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr "klonen kommer att inkludera en tom arbetskopia (bara ett arkiv)"
+
+msgid "revision, tag or branch to check out"
+msgstr "revision, märke eller gren att hämta ut"
+
+msgid "include the specified changeset"
+msgstr "inkludera den angivna ändringen"
+
+msgid "clone only the specified branch"
+msgstr "klona bara den angivna grenen"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr "[FLAGGA]... KÄLLA [DEST]"
+
+msgid "make a copy of an existing repository"
+msgstr "gör en kopia av ett existerande arkiv"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr " Skapa en kopia av ett existerande arkiv i en ny katalog."
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+" Om ingen namn på destinationskatalogen anges, kommer basnamnet för\n"
+" källan att användas."
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" ``.hg/hgrc`` file, as the default to be used for future pulls."
+msgstr ""
+" Källans plats kommer att läggas till i det nya arkivets\n"
+" ``.hg/hgrc``-fil som standardplats att användas för framtida dragningar."
+
+msgid ""
+" Only local paths and ``ssh://`` URLs are supported as\n"
+" destinations. For ``ssh://`` destinations, no working directory or\n"
+" ``.hg/hgrc`` will be created on the remote side."
+msgstr ""
+" Bara lokala sökvägar och ``ssh://``-URLer stödjs som destinationer. För\n"
+" ``ssh://``-destinationer så kommer ingen arbetskatalog eller\n"
+" ``.hg/hgrc`` att skapas på fjärrsidan."
+
+msgid ""
+" To pull only a subset of changesets, specify one or more revisions\n"
+" identifiers with -r/--rev or branches with -b/--branch. The\n"
+" resulting clone will contain only the specified changesets and\n"
+" their ancestors. These options (or 'clone src#rev dest') imply\n"
+" --pull, even for local source repositories. Note that specifying a\n"
+" tag will include the tagged changeset but not the changeset\n"
+" containing the tag."
+msgstr ""
+" För att dra bara en delmängd av ändringarna, angå en eller fler\n"
+" revisionidentifierare med -r/--rev eller grenar med -b/--branch. Den\n"
+" resulterande klonen kommer bara att innehålla de angivna ändringarna\n"
+" och deras anfäder. Dessa flaggor (eller 'clone källa#rev dest') har\n"
+" implicit --pull, även för lokala arkiv. Notera att angivandet av ett\n"
+" märke kommer att hämta ut den märkta ändringen, men inte ändringen som\n"
+" innehåller märket."
+
+msgid ""
+" To check out a particular version, use -u/--update, or\n"
+" -U/--noupdate to create a clone with no working directory."
+msgstr ""
+" För att hämta ut en speciell version, använd -u/--update, eller\n"
+" -U/--noupdate för att skapa en klon utan en arbetskatalog."
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the\n"
+" source and destination are on the same filesystem (note this\n"
+" applies only to the repository data, not to the working\n"
+" directory). Some filesystems, such as AFS, implement hardlinking\n"
+" incorrectly, but do not report errors. In these cases, use the\n"
+" --pull option to avoid hardlinking."
+msgstr ""
+" Av effektivitestskäl används hårda länkar när källan och\n"
+" destinationen är på samma filsystem (notera att detta bara gäller för\n"
+" arkivdatat, inte arbetskopian). Vissa filsystem såsom AFS\n"
+" implementerar hårda länkar felaktigt, men rapporterar inga fel.\n"
+" Använd flaggan --pull för att undvika användning av hårda länkar."
+
+msgid ""
+" In some cases, you can clone repositories and the working\n"
+" directory using full hardlinks with ::"
+msgstr ""
+" I vissa fall kan du klona både arkiv och arbetskopia, alla\n"
+" hårdlänkade, med ::"
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr " $ cp -al ARKIV ARKIVKLON"
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your\n"
+" editor breaks hardlinks (Emacs and most Linux Kernel tools do\n"
+" so). Also, this is not compatible with certain extensions that\n"
+" place their metadata under the .hg directory, such as mq."
+msgstr ""
+" Detta är det snabbaste sättet att klona, men det är inte alltid\n"
+" säkert. Operationen är inte atomisk (att ARKIV inte modifieras under\n"
+" operationen är upp till dig) och du måste se till att din editor\n"
+" bryter hårda länkar (Emacs och de flesta Linux-kernelverktyg gör\n"
+" det). Det är inte heller kompatibelt med vissa utökningar som\n"
+" placerar sin metadata under katalogen .hg, som mq."
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+" Mercurial uppdaterar arbetskatalogen till den första passande\n"
+" revisionen från den här listan:"
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+" a) null med -U eller källarkivet inte har några ändringar\n"
+" b) med -u . och källarkivet, den första föräldern av källarkivets\n"
+" arbetskatalog\n"
+" c) ändringen antigen med -u (om ett grennamn, innebär det senaste\n"
+" huvudet på den grenen)\n"
+" d) ändringen angiven med -r\n"
+" e) det högsta huvudet angivet med -b\n"
+" f) det högsta huvudet angivent med källsyntaxen url#gren\n"
+" g) det högsta huvudet på default-grenen\n"
+" h) tip"
+
+msgid " - clone a remote repository to a new directory named hg/::"
+msgstr " - klona ett fjärrarkiv till en ny katalog med namnet hg/::"
+
+msgid " hg clone http://selenic.com/hg"
+msgstr " hg clone http://selenic.com/hg"
+
+msgid " - create a lightweight local clone::"
+msgstr " - skapa en lättviktig lokal klon::"
+
+msgid " hg clone project/ project-feature/"
+msgstr " hg clone project/ project-feature/"
+
+msgid ""
+" - clone from an absolute path on an ssh server (note double-slash)::"
+msgstr ""
+" - klona från en absolut sökväg på en ssh-server (notera dubbel-slash)::"
+
+msgid " hg clone ssh://user@server//home/projects/alpha/"
+msgstr " hg clone ssh://user@server//home/projects/alpha/"
+
+msgid ""
+" - do a high-speed clone over a LAN while checking out a\n"
+" specified version::"
+msgstr ""
+" - gör en höghastighetsklon över ett LAN samtidigt som en specificerad\n"
+" version hämtas ut::"
+
+msgid " hg clone --uncompressed http://server/repo -u 1.5"
+msgstr " hg clone --uncompressed http://server/repo -u 1.5"
+
+msgid ""
+" - create a repository without changesets after a particular revision::"
+msgstr " - skapa ett arkiv utan ändringarna efter en viss revision::"
+
+msgid " hg clone -r 04e544 experimental/ good/"
+msgstr " hg clone -r 04e544 experimental/ good/"
+
+msgid " - clone (and track) a particular named branch::"
+msgstr " - klona (och spåra) en viss namngiven gren::"
+
+msgid " hg clone http://selenic.com/hg#stable"
+msgstr " hg clone http://selenic.com/hg#stable"
+
+msgid " See :hg:`help urls` for details on specifying URLs."
+msgstr " Se :hg:`help urls` för detaljer om att ange URLer."
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr "kan inte ange både --noupdate och --updaterev"
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr "märk nya/saknade filer som tillagda/borttagna innan arkivering"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "markera en gren som stängd, och göm den från grenlistan"
+
+msgid "amend the parent of the working dir"
+msgstr "förändra arbetskatalogens föräldrer"
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "arkivera de angivna filerna eller alla ändringar"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized SCM, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+" Arkiverar ändringar för de angivna filerna i arkivet. Till skillnad\n"
+" från ett centralicerat SCM, är detta en lokal operation. Se :hg:`push`\n"
+" för ett sätt att aktivt distribuera dina ändringar."
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+" Om filer inte anges, kommer alla ändringar som :hg:`status`\n"
+" rapporterar att arkiveras."
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+" Om du arkiverar resultatet av en sammanfogning, ange inga filnamn\n"
+" eller flaggorna -I/-X."
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+" Om inget arkiveringsmeddelande anges, startar Mercurial din\n"
+" konfigurerade editor där du kan skriva ett meddelande. Om din\n"
+" arkivering misslyckas, kommer du att hitta en säkerhetskopia av ditt\n"
+" meddelande i ``.hg/last-message.txt``."
+
+msgid ""
+" The --amend flag can be used to amend the parent of the\n"
+" working directory with a new commit that contains the changes\n"
+" in the parent in addition to those currently reported by :hg:`status`,\n"
+" if there are any. The old commit is stored in a backup bundle in\n"
+" ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`\n"
+" on how to restore it)."
+msgstr ""
+
+msgid ""
+" Message, user and date are taken from the amended commit unless\n"
+" specified. When a message isn't specified on the command line,\n"
+" the editor will open with the message of the amended commit."
+msgstr ""
+
+msgid ""
+" It is not possible to amend public changesets (see :hg:`help phases`)\n"
+" or changesets that have children."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om ingenting ändrades.\n"
+" "
+
+msgid "can only close branch heads"
+msgstr "kan bara stänga grenhuvuden"
+
+msgid "cannot amend recursively"
+msgstr "kan inte förändra rekursivt"
+
+msgid "cannot amend public changesets"
+msgstr "kan inte förändra publika ändringar"
+
+msgid "cannot amend merge changesets"
+msgstr "kan inte förändra sammanfogningar"
+
+msgid "cannot amend while merging"
+msgstr "kan inte förändra vid sammanfogning"
+
+msgid "cannot amend changeset with children"
+msgstr "kan inte förändra ändringar med barn"
+
+msgid "nothing changed\n"
+msgstr "inget ändrat\n"
+
+#, python-format
+msgid "nothing changed (%d missing files, see 'hg status')\n"
+msgstr "inget ändrat (%d saknade filer, se 'hg status')\n"
+
+msgid "created new head\n"
+msgstr "skapade ett nytt huvud\n"
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr "återöppnar det stängda grenhuvudet %d\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "arkiverade ändringen %d:%s\n"
+
+msgid "record a copy that has already occurred"
+msgstr "lagra en kopiering som redan har inträffat"
+
+msgid "forcibly copy over an existing managed file"
+msgstr "tvinga kopiering över en eixsterande hanterad fil"
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr "[FLAGGA]... [KÄLLA]... DEST"
+
+msgid "mark files as copied for the next commit"
+msgstr "markera filer som kopierade vid nästa arkivering"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+" Markera dest som kopia av källfilerna. Om dest är en katalog,\n"
+" placeras kopiorna i den katalogen. Om dest är en fil, måste källan\n"
+" vara en enda fil."
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+" Som standard kopierar detta kommando filinnehållet som det ser ut i\n"
+" arbetskatalogen. Om det aktiveras med -A/--after, sparas operationen\n"
+" men ingen kopiering utförs."
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Det här kommandot får effekt vid nästa arkivering. För att ångra ett\n"
+" namnbyte innan det, se :hg:`revert`."
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om fel uppstod.\n"
+" "
+
+msgid "[INDEX] REV1 REV2"
+msgstr "[INDEX] REV1 REV2"
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr "hitta föregående revision av två revisioner i ett givet index"
+
+msgid "either two or three arguments required"
+msgstr "endera två eller tre argument krävs"
+
+msgid "add single file mergeable changes"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... [TEXT]"
+msgstr "[FLAGGA]... [TEXT]"
+
+msgid "builds a repo with a given DAG from scratch in the current empty repo"
+msgstr ""
+
+msgid ""
+" The description of the DAG is read from stdin if not given on the\n"
+" command line."
+msgstr ""
+
+msgid " Elements:"
+msgstr ""
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape "
+"character.\n"
+" "
+msgstr ""
+
+msgid "reading DAG from stdin\n"
+msgstr "läser DAG från stdin\n"
+
+msgid "repository is not empty"
+msgstr "arkivet är inte tomt"
+
+msgid "building"
+msgstr "bygger"
+
+msgid "show all details"
+msgstr "visa alla detaljer"
+
+msgid "lists the contents of a bundle"
+msgstr "visa innehållet i en bunt"
+
+msgid "validate the correctness of the current dirstate"
+msgstr "validera korrektheten för den nuvarande katalogstatusen"
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr "%s har status %s, men inte i manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr "%s har status %s, men också i manifest1\n"
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr "%s har status %s, men inte i något manifest\n"
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr "%s i manifest1, men listad med status %s"
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ".hg/dirstate överrensstämmer inte med nuvarande förälders manifest"
+
+msgid "[COMMAND]"
+msgstr "[KOMMANDO]"
+
+msgid "list all available commands and options"
+msgstr "visa alla tillgängliga kommandon och alternativ"
+
+msgid "show the command options"
+msgstr "visa kommandoflaggor"
+
+msgid "[-o] CMD"
+msgstr "[-o] KMD"
+
+msgid "returns the completion list associated with the given command"
+msgstr "returnerar kompletteringslistan associerad med det givna kommandot"
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr ""
+
+msgid "use dots for runs"
+msgstr ""
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr "[FLAGGA]... [FIL] [REV]...]"
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "open changelog"
+msgstr "öppna ändringslogg"
+
+msgid "open manifest"
+msgstr "öppna manifest"
+
+msgid "-c|-m|FILE REV"
+msgstr "-c|-m|FIL REV"
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr "pröva utökade datumformat"
+
+msgid "[-e] DATE [RANGE]"
+msgstr "[-e] DATUM [SPANN]"
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "use old-style discovery"
+msgstr ""
+
+msgid "use old-style discovery with non-heads included"
+msgstr ""
+
+msgid "[-l REV] [-r REV] [-b BRANCH]... [OTHER]"
+msgstr ""
+
+msgid "runs the changeset discovery protocol in isolation"
+msgstr ""
+
+msgid "parse and apply a fileset specification"
+msgstr ""
+
+msgid "[PATH]"
+msgstr "[SÖKVÄG]"
+
+msgid "show information detected about current filesystem"
+msgstr "visa information om det aktuella filsystemet"
+
+msgid "id of head node"
+msgstr ""
+
+msgid "id of common node"
+msgstr ""
+
+msgid "REPO FILE [-H|-C ID]..."
+msgstr ""
+
+msgid "retrieves a bundle from a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Saves the bundle to "
+"the\n"
+" given file.\n"
+" "
+msgstr ""
+
+msgid "display the combined ignore pattern"
+msgstr "visa det sammansatta ignoreringsmönstret"
+
+msgid "no ignore patterns found"
+msgstr "inget ignoreringsmönster hittades"
+
+msgid "revlog format"
+msgstr "revlog-format"
+
+msgid "[-f FORMAT] -c|-m|FILE"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+#, python-format
+msgid "unknown format %d"
+msgstr "okänt format %d"
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr "testa Mercurial-installation"
+
+#, python-format
+msgid "checking encoding (%s)...\n"
+msgstr "kontrollerar teckenkodning (%s)...\n"
+
+msgid " (check that your locale is properly set)\n"
+msgstr " (kontrollera att din locale är korrekt inställd)\n"
+
+#, python-format
+msgid "checking installed modules (%s)...\n"
+msgstr "kontrollerar installerade moduler (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr " En eller fler utökningar kunde inte hittas"
+
+msgid " (check that you compiled the extensions)\n"
+msgstr " (kontrollera att du kompilerade utökningarna)\n"
+
+#, python-format
+msgid "checking templates (%s)...\n"
+msgstr "kontrollerar mallar (%s)...\n"
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr " (mallar verkar vara inkorrekt installerade)\n"
+
+msgid "checking commit editor...\n"
+msgstr "kontrollerar arkiveringseditor...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr " Ingen arkiveringseditor satt och kan inte hitta vi i PATH\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr " (specificera en arkiveringseditor i din konfigurationsfil)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr " Kan inte hitta editorn '%s' i PATH\n"
+
+msgid "checking username...\n"
+msgstr "kontrollerar användarnamn...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr " (ange ett användarnamn i din konfigurationsfil)\n"
+
+msgid "no problems detected\n"
+msgstr "inga problem upptäcktes\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "%s problem upptäcktes, kontrollera din installation!\n"
+
+msgid "REPO ID..."
+msgstr ""
+
+msgid "test whether node ids are known to a repo"
+msgstr ""
+
+msgid ""
+" Every ID must be a full-length hex node id string. Returns a list of 0s\n"
+" and 1s indicating unknown/known.\n"
+" "
+msgstr ""
+
+msgid "[OBSOLETED [REPLACEMENT] [REPL... ]"
+msgstr ""
+
+msgid "create arbitrary obsolete marker"
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "A B"
+msgstr "A B"
+
+#, python-format
+msgid "a: %s\n"
+msgstr "a: %s\n"
+
+#, python-format
+msgid "b: %s\n"
+msgstr "b: %s\n"
+
+#, python-format
+msgid "depth(a): %d depth(b): %d\n"
+msgstr ""
+
+#, python-format
+msgid "delta: %d hdist: %d distance: %d relation: %s\n"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr "revision att bygga om till"
+
+msgid "[-r REV] [REV]"
+msgstr "[-r REV] [REV]"
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr "bygg om katalogstatusen som den skulle se ut för den givna revisionen"
+
+msgid "revision to debug"
+msgstr "revision att debugga"
+
+msgid "[-r REV] FILE"
+msgstr "[-r REV] FIL"
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr ""
+
+msgid "dump index data"
+msgstr ""
+
+msgid "-c|-m|FILE"
+msgstr ""
+
+msgid "show data and statistics about a revlog"
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid ""
+" Use --verbose to print the parsed tree before and after aliases\n"
+" expansion.\n"
+" "
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr "REV1 [REV2]"
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr "visa inte sparad mtime"
+
+msgid "sort by saved mtime"
+msgstr "sortera efter sparad mtime"
+
+msgid "[OPTION]..."
+msgstr "[FLAGGA]..."
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr "kopia: %s -> %s\n"
+
+msgid "revision to check"
+msgstr "revision att kontrollera"
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "REPO [OPTIONS]... [ONE [TWO]]"
+msgstr "ARKIV [FLAGGA]... [ETT [TVÃ…]]"
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr "[FLAGGA]... ([-c REV] | [-r REV1 [-r REV2]]) [FIL]..."
+
+msgid "diff repository (or selected files)"
+msgstr "visa skillnader i arkivet (eller på valda filer)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr " Visa skillnader mellan revisioner för angivna filer."
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr " Skillnaderna mellan filerna visas i unified diff-format."
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+" .. note::\n"
+" diff kan generera oväntade resultat för sammanfogningar eftersom\n"
+" den som standard kommer att jämföra mot arbetskatalogens tidigare\n"
+" ändring om ingen revision anges."
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+" Alternativt så kan du ange -c/--change med en revision för att se\n"
+" modifikationerna i den ändringen relativt till dess första förälder."
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" Utan flaggan -a/--text, kommer diff att försöka undvika att visa\n"
+" skillnader mellan binära filer. Med -a, kommer en diff att skapas ändå,\n"
+" troligtvis med oönskade resultat."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+" Använd flaggan -g/--git för att skapa diffs i gits utökade format. För\n"
+" mer information, läs :hg:`help diffs`."
+
+msgid " - compare a file in the current working directory to its parent::"
+msgstr " - jämför en fil i arbetskatalogen med dess förälder::"
+
+msgid " hg diff foo.c"
+msgstr " hg diff foo.c"
+
+msgid ""
+" - compare two historical versions of a directory, with rename info::"
+msgstr ""
+" - jämför två historiska versioner of en katalog, med namnändringar::"
+
+msgid " hg diff --git -r 1.0:1.2 lib/"
+msgstr " hg diff --git -r 1.0:1.2 lib/"
+
+msgid " - get change stats relative to the last change on some date::"
+msgstr ""
+" - hämta ändringsstatus relativ ttill den sista ändringen på ett datum::"
+
+msgid " hg diff --stat -r \"date('may 2')\""
+msgstr " hg diff --stat -r \"date('may 2')\""
+
+msgid " - diff all newly-added files that contain a keyword::"
+msgstr " - diffa alla nytillagda filer som innehåller ett nyckelord::"
+
+msgid " hg diff \"set:added() and grep(GNU)\""
+msgstr " hg diff \"set:added() and grep(GNU)\""
+
+msgid " - compare a revision and its parents::"
+msgstr " - jämför en revision och dess föräldrar::"
+
+msgid ""
+" hg diff -c 9353 # compare against first parent\n"
+" hg diff -r 9353^:9353 # same using revset syntax\n"
+" hg diff -r 9353^2:9353 # compare against the second parent"
+msgstr ""
+" hg diff -c 9353 # jämför mot den första föräldern\n"
+" hg diff -r 9353^:9353 # samma med revset-syntax\n"
+" hg diff -r 9353^2:9353 # jämför mot den andra föräldern"
+
+msgid "diff against the second parent"
+msgstr "diffa mot den andra föräldern"
+
+msgid "revisions to export"
+msgstr "revisioner att exportera"
+
+msgid "[OPTION]... [-o OUTFILESPEC] [-r] REV..."
+msgstr "[FLAGGA]... [-o UTFILSPEC] [-r] REV..."
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "dumpa rubrik och diff för en eller fler ändringar"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr " Skriv ändringsrubriken och diffen för en eller fler revisioner."
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+" Informationen som visas i ändringsheadern är: författare, datum,\n"
+" grenens namn (om inte default), ändringens hash, föräldrar och\n"
+" arkiveringskommentar."
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" .. note::\n"
+" export kan generera oväntade resultat för sammanfogningar, eftersom\n"
+" den som standard bara kommer att jämföra mot den första föräldern."
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+" Utmatning kan vara till en fil, och då anges namnet på filen med en\n"
+" formatsträng. Formateringsreglerna är som följer::"
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%m``: first line of the commit message (only alphanumeric "
+"characters)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+" :``%%``: ett \"%\"-tecken\n"
+" :``%H``: ändringshash (40 hexadecimala siffror)\n"
+" :``%N``: antal genererade patchar\n"
+" :``%R``: ändringens revisionsnummer\n"
+" :``%b``: basnamn för det exporterande arkivet\n"
+" :``%h``: kort ändringshash (12 hexadecimala siffror)\n"
+" :``%m``: första raden i arkiveringsmeddelandet (bara alfanumeriska "
+"tecken)\n"
+" :``%n``: nollpaddat sekvensnummer, börjar med 1\n"
+" :``%r``: nollpaddat ändringsrevisionsnummer"
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" Utan flaggan -a/--text, kommer export att undvika skapandet av diffar\n"
+" av filer som upptäcks vara binära. Med -a, kommer filen att exporteras\n"
+" ändå, även om resultatet antagligen inte kommer att vara användbart."
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+" Använd flaggan -g/--git för att generera diffar i gits utökade format.\n"
+" Se :hg:`help diffs` för mer information."
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+" Med flaggan --switch-parent, kommer diffen att vara mot den andra\n"
+" föräldern. Det kan vara användbart för att granska en sammanfogning."
+
+msgid ""
+" - use export and import to transplant a bugfix to the current\n"
+" branch::"
+msgstr ""
+" - använd export och import för att transplantera en buggfix på den\n"
+" nuvarande grenen::"
+
+msgid " hg export -r 9353 | hg import -"
+msgstr " hg export -r 9353 | hg import -"
+
+msgid ""
+" - export all the changesets between two revisions to a file with\n"
+" rename information::"
+msgstr ""
+" - exportera alla ändringar mellan två revisioner till en fil med\n"
+" namnändringsinformation::"
+
+msgid " hg export --git -r 123:150 > changes.txt"
+msgstr " hg export --git -r 123:150 > changes.txt"
+
+msgid ""
+" - split outgoing changes into a series of patches with\n"
+" descriptive names::"
+msgstr ""
+" - dela upp utgående ändringar till en serie patchar med beskrivande\n"
+" namn::"
+
+msgid " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+msgstr " hg export -r \"outgoing()\" -o \"%n-%m.patch\""
+
+msgid "export requires at least one changeset"
+msgstr "export kräver minst en ändring"
+
+msgid "exporting patches:\n"
+msgstr "exporterar patchar:\n"
+
+msgid "exporting patch:\n"
+msgstr "exporterar patch:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr "glöm de angivna filerna vid nästa arkivering"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+" Märk de angivna filerna så att de inte längre kommer att spåras efter\n"
+" nästa arkivering."
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+" Detta tar bara bort filer från den nuvarande grenen, inte från hela\n"
+" projekthistoriken, och det raderar dem inte från arbetskatalogen."
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr " För att ångra en forget innan nästa arkivering, se :hg:`add`."
+
+msgid " - forget newly-added binary files::"
+msgstr " - glöm bort nytillagda binärfiler::"
+
+msgid " hg forget \"set:added() and binary()\""
+msgstr " hg forget \"set:added() and binary()\""
+
+msgid " - forget files that would be excluded by .hgignore::"
+msgstr " - glöm bort filer som skulle exkluderas av .hgignore::"
+
+msgid " hg forget \"set:hgignore()\""
+msgstr " hg forget \"set:hgignore()\""
+
+msgid "revisions to graft"
+msgstr "revisioner att ympa"
+
+msgid "resume interrupted graft"
+msgstr "Ã¥teruppta avbruten ympning"
+
+msgid "append graft info to log message"
+msgstr "lägg till ympningsinfo till loggmeddelande"
+
+msgid "record the current date as commit date"
+msgstr "lagra det nuvarande datumet som arkiveringsdatumet"
+
+msgid "record the current user as committer"
+msgstr "lagra den nuvarande användaren som arkiverare"
+
+msgid "[OPTION]... [-r] REV..."
+msgstr "[FLAGGA]... [-r] REV..."
+
+msgid "copy changes from other branches onto the current branch"
+msgstr "kopiera ändringar från andra grenar till den nuvarande grenen"
+
+msgid ""
+" This command uses Mercurial's merge logic to copy individual\n"
+" changes from other branches without merging branches in the\n"
+" history graph. This is sometimes known as 'backporting' or\n"
+" 'cherry-picking'. By default, graft will copy user, date, and\n"
+" description from the source changesets."
+msgstr ""
+
+msgid ""
+" Changesets that are ancestors of the current revision, that have\n"
+" already been grafted, or that are merges will be skipped."
+msgstr ""
+
+msgid " (grafted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" If a graft merge results in conflicts, the graft process is\n"
+" interrupted so that the current merge can be manually resolved.\n"
+" Once all conflicts are addressed, the graft process can be\n"
+" continued with the -c/--continue option."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The -c/--continue option does not reapply earlier options."
+msgstr ""
+
+msgid ""
+" - copy a single change to the stable branch and edit its description::"
+msgstr ""
+
+msgid ""
+" hg update stable\n"
+" hg graft --edit 9393"
+msgstr ""
+" hg update stable\n"
+" hg graft --edit 9393"
+
+msgid ""
+" - graft a range of changesets with one exception, updating dates::"
+msgstr ""
+
+msgid " hg graft -D \"2085::2093 and not 2091\""
+msgstr " hg graft -D \"2085::2093 and not 2091\""
+
+msgid " - continue a graft after resolving conflicts::"
+msgstr ""
+
+msgid " hg graft -c"
+msgstr " hg graft -c"
+
+msgid " - show the source of a grafted changeset::"
+msgstr ""
+
+msgid " hg log --debug -r tip"
+msgstr " hg log --debug -r tip"
+
+msgid ""
+" Returns 0 on successful completion.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades.\n"
+" "
+
+msgid "can't specify --continue and revisions"
+msgstr "kan inte specificera --continue och revisioner"
+
+msgid "no graft state found, can't continue"
+msgstr ""
+
+#, python-format
+msgid "skipping ungraftable merge revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping ancestor revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already grafted revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already grafted revision %s (same origin %d)\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already grafted revision %s (was grafted from %d)\n"
+msgstr ""
+
+#, python-format
+msgid "grafting revision %s\n"
+msgstr "ympar revision %s\n"
+
+msgid "unresolved conflicts, can't continue"
+msgstr "olösta konflikter, kan inte fortsätta"
+
+msgid "use hg resolve and hg graft --continue"
+msgstr "använd hg resolve och hg graft --continue"
+
+#, python-format
+msgid "graft for revision %s is empty\n"
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr "avsluta fält med NUL"
+
+msgid "print all revisions that match"
+msgstr "visa alla revisioner som matchar"
+
+msgid "ignore case when matching"
+msgstr "ignorera versaler/gemener vid matchning"
+
+msgid "print only filenames and revisions that match"
+msgstr "visa bara filnamn och revisioner som matchar"
+
+msgid "print matching line numbers"
+msgstr "visa matchande radnummer"
+
+msgid "only search files changed within revision range"
+msgstr "sök filer enbart inom ett givet revisionsområde"
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr "[FLAGGA]... MÖNSTER [FIL]..."
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "sök efter ett mänster i specificerade filer och revisioner"
+
+msgid " Search revisions of files for a regular expression."
+msgstr " Söker igenom revisioner och filer med reguljära uttryck."
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+" Det här kommandot beter sig annorlunda jämfört med grep i Unix. Det\n"
+" accepterar bara Python/Perl-regexps. Det söker arkivhistorik, inte\n"
+" arbetskatalogen. Det visar också revisionsnumret där en träff finns."
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+" Som standard visar grep bara utmatningen från den första revisionen\n"
+" av en matchande fil. För att visa varje revision som innehåller en\n"
+" ändring i träffstatus (\"-\" för en träff som blir en icke-träff,\n"
+" eller \"+\" för en icke-träff som blir en träff), använd flaggan\n"
+" --all."
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnerar 0 om en träff hittas, 1 annars.\n"
+" "
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr "grep: ogiltigt träffmönster: %s\n"
+
+msgid "STARTREV"
+msgstr "STARTREV"
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr "visa bara huvuden som är ättlingar till STARTREV"
+
+msgid "show topological heads only"
+msgstr "visa bara topologiska huvuden"
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr "visa bara aktiva grenhuvuden (FÖRLEGAD)"
+
+msgid "show normal and closed branch heads"
+msgstr "visa normala och stängda grenhuvuden"
+
+msgid "[-ct] [-r STARTREV] [REV]..."
+msgstr "[-ct] [-r STARTREV] [REV]..."
+
+msgid "show current repository heads or show branch heads"
+msgstr "visa aktuella arkivhuvuden och visar grenhuvuden"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr " Utan några argument visas alla ändringar som är grenhuvuden."
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+" Arkiv-\"huvuden\" är ändringar utan barnändringar. Det är vanligtvis\n"
+" där som utveckling sker och är de vanligaste målen för update- och\n"
+" merge-operationer. Grenhuvuden är ändringar som inte har några\n"
+" barnändringar på samma gren."
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown. This means\n"
+" that you can use :hg:`heads foo` to see the heads on a branch\n"
+" named ``foo``."
+msgstr ""
+" Om en eller flera REV anges, kommer bara grenhuvuden på grenar\n"
+" som är associerade med de angivna ändringarna att visas. Det betyder\n"
+" att du kan använda :hg:`heads foo` för att se huvuden på en gren vid\n"
+" namn ``foo``."
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+" Om -c/--closed anges, visas också grenvhuvuden som markerats som\n"
+" stängda (se :hg:`commit --close-branch`)."
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+" Om STARTREV anges, visas bara de huvuden som har STARTREV som\n"
+" anfader."
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+" Om -t/--topo anges, ignoreras all logik för namngivna grenar och bara\n"
+" ändringar utan barn kommer att visas."
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+" Returnerar 0 om matchande huvuden hittas, 1 annars.\n"
+" "
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr "inga öppna grenhuvuden hittades på grenarna %s"
+
+#, python-format
+msgid " (started at %s)"
+msgstr " (började som %s)"
+
+msgid "show only help for extensions"
+msgstr "visa bara hjälp för utökningar"
+
+msgid "show only help for commands"
+msgstr "visa bara hjälp för kommandon"
+
+msgid "show topics matching keyword"
+msgstr "visa ämnen för nyckelord"
+
+msgid "[-ec] [TOPIC]"
+msgstr "[-ec] [ÄMNE]"
+
+msgid "show help for a given topic or a help overview"
+msgstr "visa hjälp för ett givet ämne eller en hjälpöversikt"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr " Utan argument visas en kommandolista med korta hjälpmeddelanden."
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+" Med ett ämne, utökning eller kommandonamn, visas hjälp för det ämnet."
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades.\n"
+" "
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"alias: %s\n"
+
+msgid "(no help text available)"
+msgstr "(ingen hjälptext tillgänglig)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr "skal-alias för::"
+
+#, python-format
+msgid " %s"
+msgstr " %s"
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "alias för: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr "%s"
+
+#, python-format
+msgid "use \"hg help -e %s\" to show help for the %s extension"
+msgstr "använd \"hg help -e %s\" för att visa hjälp för utökningen %s"
+
+msgid "options:"
+msgstr "flaggor:"
+
+msgid "global options:"
+msgstr "globala flaggor:"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help %s\" to show the full help text\n"
+msgstr ""
+"\n"
+"använd \"hg help %s\" för att visa fullständig hjälptext\n"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show more info\n"
+msgstr ""
+"\n"
+"använd \"hg -v help %s\" för att visa mer information\n"
+
+msgid "basic commands:"
+msgstr "grundläggande kommandon:"
+
+msgid "list of commands:"
+msgstr "kommandolista:"
+
+msgid "no commands defined\n"
+msgstr "inga kommandon definierade\n"
+
+msgid "enabled extensions:"
+msgstr "aktiverade utökningar:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"ytterligare hjälpämnen:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "använd \"hg help\" för den fulla kommandolistan"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr ""
+"använd \"hg help\" för en full kommandolista eller \"hg -v\" för detaljer"
+
+#, python-format
+msgid "use \"hg help %s\" to show the full help text"
+msgstr "använd \"hg help %s\" för att visa utförlig hjälp"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show builtin aliases and global options"
+msgstr ""
+"använd \"hg -v help%s\" för att visa inbyggda alias och globala flaggor"
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg help -c %s\" to see help for the %s command\n"
+msgstr ""
+"\n"
+"använd \"hg help -c %s\" för att visa hjälp för kommandot %s\n"
+
+msgid "no help text available"
+msgstr "ingen hjälptext tillgänglig"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s-utökning - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+"använd \"hg help extensions\" för information om aktivering av utökningar\n"
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr "'%s' tillhandahålls av följande utökning:"
+
+msgid "Topics"
+msgstr "Ämnen"
+
+msgid "Extension Commands"
+msgstr "Utökningar"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial Distribuerad SCM\n"
+
+msgid "identify the specified revision"
+msgstr "identifiera den angivna revisionen"
+
+msgid "show local revision number"
+msgstr "visa lokala revisionsnummer"
+
+msgid "show global revision id"
+msgstr "visa globala revisions-id"
+
+msgid "show branch"
+msgstr "visa grenar"
+
+msgid "show tags"
+msgstr "visa märken"
+
+msgid "show bookmarks"
+msgstr "visa bokmärken"
+
+msgid "[-nibtB] [-r REV] [SOURCE]"
+msgstr "[-nibtB] [-r REV] [KÄLLA]"
+
+msgid "identify the working copy or specified revision"
+msgstr "identifiera arbetskopian eller angivna revisioner"
+
+msgid ""
+" Print a summary identifying the repository state at REV using one or\n"
+" two parent hash identifiers, followed by a \"+\" if the working\n"
+" directory has uncommitted changes, the branch name (if not default),\n"
+" a list of tags, and a list of bookmarks."
+msgstr ""
+" Visa en sammanfattning som identifierar arkivstatusen vid REV med en\n"
+" eller två föräldrars hash-identifierare, följt av ett \"+\" om det\n"
+" finns oarkiverade ändringar i arbetskatalogen, grennamnet (om inte\n"
+" default), en märkeslista, och en bokmärkeslista."
+
+msgid ""
+" When REV is not given, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+" Utan någon revision, visas en sammanfattning av den aktuella\n"
+" statusen för arkivet."
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+" Specificering av en sökväg till ett arkiv eller Mercurial-bunt\n"
+" gör att kommandot jobbar mot arkivet/bunten som är angiven."
+
+msgid " - generate a build identifier for the working directory::"
+msgstr " - skapa en byggidentifierare för arbetskatalogen::"
+
+msgid " hg id --id > build-id.dat"
+msgstr " hg id --id > build-id.dat"
+
+msgid " - find the revision corresponding to a tag::"
+msgstr " - hitta revisionen för ett märke::"
+
+msgid " hg id -n -r 1.3"
+msgstr " hg id -n -r 1.3"
+
+msgid " - check the most recent revision of a remote repository::"
+msgstr " - kontrollera den senaste revisionen i ett fjärrarkiv::"
+
+msgid " hg id -r tip http://selenic.com/hg/"
+msgstr " hg id -r tip http://selenic.com/hg/"
+
+msgid "can't query remote revision number, branch, or tags"
+msgstr "kan inte efterfråga revisionsnummer, gren, eller märken"
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+
+msgid "PATH"
+msgstr "SÖKVÄG"
+
+msgid "base path (DEPRECATED)"
+msgstr "grundsökväg (FÖRÅLDRAD)"
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr "hoppa över kontroll av oarkiverade ändringar"
+
+msgid "don't commit, just update the working directory"
+msgstr "arkivera inte, bara uppdatera arbetskatalogen"
+
+msgid "apply patch without touching the working directory"
+msgstr "applicera patch utan att röra arbetskatalogen"
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr ""
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr "[FLAGGA]... PATCH..."
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" Use --bypass to apply and commit patches directly to the\n"
+" repository, not touching the working directory. Without --exact,\n"
+" patches will be applied on top of the working directory parent\n"
+" revision."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as :hg:`addremove`."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid " - import a traditional patch from a website and detect renames::"
+msgstr ""
+" - importera en vanlig patch från en webbsida och upptäck namnbyten::"
+
+msgid " hg import -s 80 http://example.com/bugfix.patch"
+msgstr " hg import -s 80 http://example.com/bugfix.patch"
+
+msgid " - import a changeset from an hgweb server::"
+msgstr " - importera en ändring från en hgweb-server::"
+
+msgid " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+msgstr " hg import http://www.selenic.com/hg/rev/5ca8c111e9aa"
+
+msgid " - import all the patches in an Unix-style mbox::"
+msgstr " - importera alla patchar i en Unix-liknande mbox::"
+
+msgid " hg import incoming-patches.mbox"
+msgstr " hg import incoming-patches.mbox"
+
+msgid ""
+" - attempt to exactly restore an exported changeset (not always\n"
+" possible)::"
+msgstr ""
+" - försök att exakt återställa en exporterad ändring (inte alltid\n"
+" möjligt)::"
+
+msgid " hg import --exact proposed-fix.patch"
+msgstr " hg import --exact proposed-fix.patch"
+
+msgid "need at least one patch to import"
+msgstr "behöver minst en patch att importera"
+
+msgid "cannot use --no-commit with --bypass"
+msgstr "kan inte använda --no-commit med --bypass"
+
+msgid "cannot use --similarity with --bypass"
+msgstr "kan inte använda --similarity med --bypass"
+
+msgid "patch is damaged or loses information"
+msgstr "patchen är skadad eller tappar information"
+
+msgid "applied to working directory"
+msgstr "applicerad på arbetskatalog"
+
+msgid "not a Mercurial patch"
+msgstr "inte en Mercurial-patch"
+
+#. i18n: refers to a short changeset id
+#, python-format
+msgid "created %s"
+msgstr "skapade %s"
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+#, python-format
+msgid "%s: no diffs found"
+msgstr "%s: inga diffar hittades"
+
+msgid "run even if remote repository is unrelated"
+msgstr "kör även om fjärrarkivet är obesläktat"
+
+msgid "show newest record first"
+msgstr "visa nyaste saken först"
+
+msgid "file to store the bundles into"
+msgstr "fil att lagra buntarna i"
+
+msgid "a remote changeset intended to be added"
+msgstr "en fjärrändring som avses att läggas till"
+
+msgid "compare bookmarks"
+msgstr "jämför bokmärken"
+
+msgid "a specific branch you would like to pull"
+msgstr "en specifik gren som du vill dra"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAMN] [KÄLLA]"
+
+msgid "show new changesets found in source"
+msgstr "visa nya ändringar som hittas i källan"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+" Visa nya ändringar som hittas i den specificerade sökvägen/URL:en\n"
+" eller den vanliga pull-platsen. Dessa ändringar skulle ha dragits om\n"
+" du använt pull-kommandot."
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+" För fjärrarkiv, använd --bundle för att slippa ladda ner\n"
+" ändringarna två gånger om incoming följs av pull."
+
+msgid " See pull for valid source format details."
+msgstr ""
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnerar 0 om det finns inkommande ändringar, 1 annars.\n"
+" "
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr ""
+
+msgid "remote doesn't support bookmarks\n"
+msgstr "fjärrserver stödjer inte bokmärken\n"
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-e KMD] [--remotecmd KMD] [DEST]"
+
+msgid "create a new repository in the given directory"
+msgstr "skapa ett nytt arkiv i den angivna katalogen"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+" Initialisera ett nytt arkiv i den angivna katalogen. Om den angivna\n"
+" katalogen inte existerar, kommer den att skapas."
+
+msgid " If no directory is given, the current directory is used."
+msgstr " Om ingen katalog anges, används den nuvarande katalogen."
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Det är möjligt att specificera en URL med ``ssh://`` som destination.\n"
+" Se :hg:`help urls` för mer informatio"
+
+msgid "search the repository as it is in REV"
+msgstr "sök igenom arkivet som det är vid REV"
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "filnamn slutar med NUL, för användning med xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr "visa kompletta sökvägar från filsystemsroten"
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr "[FLAGGA]... [MÖNSTER]..."
+
+msgid "locate files matching specific patterns"
+msgstr "hitta filer som matchar givna mönster"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+" Visa filer som är under Mercurials kontroll i arbetskatalogen vars\n"
+" namn matchar givna mönster."
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+" Som standard söker det här kommandot i alla kataloger inuti\n"
+" arbetskatalogen. För att bara söka den aktuella katalogen och dess\n"
+" underkataloger, använd \"--include .\"."
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+" Om inga mönster anges för matching, visar det här kommantod namnen på\n"
+" alla filer under Mercurials kontroll i arbetskatalogen."
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+" Om du vill skicka utmatningen från detta kommando till kommandot\n"
+" \"xargs\", använd flaggan -0 till både detta kommando och \"xargs\".\n"
+" Detta undviker problemet med att \"xargs\" behandlar filnamn som\n"
+" innehåller blanktecken som multipla filnamn"
+
+msgid "show revision history of entire repository or files"
+msgstr "visa revisionshistorik för hela arkivet eller filer"
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+" Skriv ut revisionshistoriken för de specificerade filerna eller hela\n"
+" projektet."
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+" Om ingen revisionsserie specificeras, används ``tip:0`` som standard om\n"
+" inte --follow är satt, då arbetskatalogens förälder används som första\n"
+" revision."
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision."
+msgstr ""
+" Filhistorik visas utan att följa namnbyten eller kopieringshistorik av\n"
+" filer. Använd -f/--follow med ett filnamn för att följa historiken även\n"
+" vid namnbyten och kopiering. --follow utan ett filnamn kommer bara att\n"
+" visa föräldrar eller ättlingar från startrevisionen."
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+" Som standard skriver detta kommando ut revisionsnummer och ändrings-id,\n"
+" märken, icke-triviala föräldrar, användare, datum och tid, samt ett\n"
+" sammandrag för varje arkivering. När flaggan -v/--verbose används,\n"
+" visas listan med ändrade filer och fullständigt arkiveringsmeddelande."
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+" .. note::\n"
+" log -p/--patch kan generera oväntad diff-utmatning för\n"
+" sammanfogningar, eftersom det bara kommer att jämföra ändringen mot\n"
+" den första förälder. Dessutom kommer bara filer som skiljer sig från\n"
+" BÅDA föräldrarna att visas i filer:."
+
+msgid ""
+" .. note::\n"
+" for performance reasons, log FILE may omit duplicate changes\n"
+" made on branches and will not show deletions. To see all\n"
+" changes including duplicates and deletions, use the --removed\n"
+" switch."
+msgstr ""
+" .. note::\n"
+" av prestandaskäl så kan 'log FILE' hoppa över duplicerade ändringar\n"
+" gjorda på grenar och kommer inte att visa raderingar. För att se\n"
+" alla ändringar inklusive dupliceringar och raderingar, använd\n"
+" flaggan --removed."
+
+msgid " - changesets with full descriptions and file lists::"
+msgstr " - ändringar med fulla beskrivningar och fillistor::"
+
+msgid " hg log -v"
+msgstr " hg log -v"
+
+msgid " - changesets ancestral to the working directory::"
+msgstr " - ändringar som är anfädrar arbetskatalogen::"
+
+msgid " hg log -f"
+msgstr " hg log -f"
+
+msgid " - last 10 commits on the current branch::"
+msgstr " - sista 10 arkiveringarna på aktuell gren::"
+
+msgid " hg log -l 10 -b ."
+msgstr " hg log -l 10 -b ."
+
+msgid ""
+" - changesets showing all modifications of a file, including removals::"
+msgstr ""
+" - alla ändringar och modifikationer för en fil, inklusive raderingar::"
+
+msgid " hg log --removed file.c"
+msgstr " hg log --removed file.c"
+
+msgid ""
+" - all changesets that touch a directory, with diffs, excluding merges::"
+msgstr ""
+" - alla ändringar som rör en katalog, med diffar, utan sammanfogningar::"
+
+msgid " hg log -Mp lib/"
+msgstr " hg log -Mp lib/"
+
+msgid " - all revision numbers that match a keyword::"
+msgstr " - alla revisionsnummer som matchar ett nyckelord::"
+
+msgid " hg log -k bug --template \"{rev}\\n\""
+msgstr " hg log -k bug --template \"{rev}\\n\""
+
+msgid " - check if a given changeset is included is a tagged release::"
+msgstr " - kontrollera om en ändring inkluderas i en märkt release::"
+
+msgid " hg log -r \"a21ccf and ancestor(1.9)\""
+msgstr " hg log -r \"a21ccf and ancestor(1.9)\""
+
+msgid " - find all changesets by some user in a date range::"
+msgstr " - hitta alla ändringar av en användare i ett datumintervall::"
+
+msgid " hg log -k alice -d \"may 2008 to jul 2008\""
+msgstr " hg log -k alice -d \"may 2008 to jul 2008\""
+
+msgid " - summary of all changesets after the last tag::"
+msgstr " - sammanfattning av alla ändringar efter det senaste märket::"
+
+msgid ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+msgstr ""
+" hg log -r \"last(tagged())::\" --template \"{desc|firstline}\\n\""
+
+msgid ""
+" See :hg:`help revisions` and :hg:`help revsets` for more about\n"
+" specifying revisions."
+msgstr ""
+" Se :hg:`help revisions` och :hg:`help revsets` för mer om hur man anger\n"
+" revisioner."
+
+msgid ""
+" See :hg:`help templates` for more about pre-packaged styles and\n"
+" specifying custom templates."
+msgstr ""
+" Se :hg:`help templates` för information om mallar och filter.\n"
+" "
+
+msgid "revision to display"
+msgstr "revision att visa"
+
+msgid "list files from all revisions"
+msgstr "visa filer från alla revisioner"
+
+msgid "[-r REV]"
+msgstr "[-r REV]"
+
+msgid "output the current or given revision of the project manifest"
+msgstr "visa den nuvarande eller angivna revisionen av projektmanifestet"
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+" Visa en lista med versionshanterade filer för den angivna revisionen.\n"
+" Om ingen revision anges, används arbetskatalogens första föräldern,\n"
+" eller null-revisionen om ingen revision är uthämtad."
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+" Med -v visas filtillstånd, symlänkar och exekverbarhetsbitar.\n"
+" Med --debug visas filrevisionhashar."
+
+msgid ""
+" If option --all is specified, the list of all files from all revisions\n"
+" is printed. This includes deleted and renamed files."
+msgstr ""
+" Om flaggan --all är angiven, visas en lista med alla filer från alla\n"
+" revisioner. Detta inlkuderar borttagna och omdöpta filer."
+
+msgid "can't specify a revision with --all"
+msgstr "du kan inte ange en revision med --all"
+
+msgid "force a merge with outstanding changes"
+msgstr "tvinga en sammanfogning med utestående ändringar"
+
+msgid "revision to merge"
+msgstr "revision att sammanfoga"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr "granska revisioner att sammanfoga (ingen sammanfogning utförs)"
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr "[-P] [-f] [[-r] REV]"
+
+msgid "merge working directory with another revision"
+msgstr "sammanfoga arbetskatalogen med en annan revision"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+" Den aktuella arbetskatalogen uppdateras med alla ändringar som gjorts i\n"
+" den efterfrågade revisionen sedan den senaste gemensamma revisionen."
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+" Filerna som ändrats mellan föräldrarna markeras som förändrade till\n"
+" nästa arkivering och en arkivering måste utföras innan några andra\n"
+" arkivuppdateringar tillåts. Nästa arkivering kommer att ha två\n"
+" föräldrar."
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files. See :hg:`help merge-tools` for options."
+msgstr ""
+" ``--tool`` kan användas för att ange sammanfogningsverktyg att\n"
+" använda för filsammanfogningar. Det har högre prioritet än\n"
+" miljövariabeln HGMERGE och dina konfigurationsfiler. Se\n"
+" :hg:`help merge-tools` för flaggor."
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+" Om ingen revision anges, arbetskatalogens förälder är en huvudrevision,\n"
+" och den nuvarande grenen innehåller exakt ett annat huvud, sammanfogas\n"
+" det andra huvudet som standard. Om inte, måste en explicit revision\n"
+" anges."
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr " :hg:`resolve` måste användas för att lösa olästa filer."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+" För att ångra en oarkiverad sammanfogning, använd\n"
+" :hg:`update --clean .` som kommer att hämta ut en ren kopia av den\n"
+" ursprungliga föräldern till sammanfogningen, och ta bort ändringarna."
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om det finns olösta filer.\n"
+" "
+
+msgid ""
+"multiple matching bookmarks to merge - please merge with an explicit rev or "
+"bookmark"
+msgstr ""
+"flera överrensstämmande bokmärken att sammanfoga - ange en explicit revision "
+"eller ett bokmärke"
+
+msgid "run 'hg heads' to see all heads"
+msgstr "kör 'hg heads' för att se alla huvuden"
+
+msgid ""
+"no matching bookmark to merge - please merge with an explicit rev or bookmark"
+msgstr ""
+"inga överrensstämmande bokmärken att sammanfoga - ange en explicit revision "
+"eller ett bokmärke"
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr "grenen '%s' har %d huvuden - sammanfoga med en specifik rev"
+
+msgid "run 'hg heads .' to see heads"
+msgstr "kör 'hg heads .' för att se huvuden"
+
+msgid "heads are bookmarked - please merge with an explicit rev"
+msgstr "huvuden är bokmärkta - sammanfoga med en explicit revision"
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr "grenen '%s' har ett huvud - sammanfoga med en specifik rev"
+
+msgid "nothing to merge"
+msgstr "inget att sammanfoga"
+
+msgid "use 'hg update' instead"
+msgstr "använd 'hg update' istället"
+
+msgid "working directory not at a head revision"
+msgstr "arbetskatalogen är inte vid en huvudrevision"
+
+msgid "use 'hg update' or merge with an explicit revision"
+msgstr "använd 'hg update' eller sammanfoga med en speficik rev"
+
+msgid "a changeset intended to be included in the destination"
+msgstr "en ändring avsedd att inkluderas i destinationen"
+
+msgid "a specific branch you would like to push"
+msgstr "en specifik gren som du vill trycka"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+
+msgid "show changesets not found in the destination"
+msgstr "visa ändringar som inte hittas i destinationen"
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+" Visa ändringar som inte hittas i det angivna destionationsarkivet\n"
+" eller den vanliga push-platsen. Detta är de ändringar som skulle\n"
+" tryckas om push genomfördes."
+
+msgid " See pull for details of valid destination formats."
+msgstr " Se pull för information om giltiga destinationsformat."
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+" Returnerar 0 om det finns utgående ändringar, 1 annars.\n"
+" "
+
+msgid "show parents of the specified revision"
+msgstr "visa föräldrar för den angivna revisionen"
+
+msgid "[-r REV] [FILE]"
+msgstr "[-r REV] [FIL]"
+
+msgid "show the parents of the working directory or revision"
+msgstr "visa föräldrar till arbetskatalogen eller revision"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+" Visa revisioner för arbetskatalogens föräldrar. Om en revision anges\n"
+" via -r/--rev, kommer den revisionens föräldrar att visas. Om en fil\n"
+" anges, kommer revisionen då den filen sist ändrades (innan\n"
+" arbetskatalogens revision eller innan --rev om angiven) att visas."
+
+msgid "can only specify an explicit filename"
+msgstr "kan bara specificera ett explicit filnamn"
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr "'%s' hittades inte i manifestet!"
+
+msgid "[NAME]"
+msgstr "[NAMN]"
+
+msgid "show aliases for remote repositories"
+msgstr "visa aliases för fjärrarkiv"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+" Visa definitioner för sökvägen NAME. Om inget namn anges, visas\n"
+" definitionen för alla tillgängliga namn."
+
+msgid ""
+" Option -q/--quiet suppresses all output when searching for NAME\n"
+" and shows only the path names when listing all definitions."
+msgstr ""
+" Flaggan -q/--quiet stänger av all utmatning vid sökning efter NAMN\n"
+" och visar bara sökvägarna när alla definitioner listas."
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+" Sökvägar definieras i sektionen [paths] i din konfigurationsfil och i\n"
+" ``/etc/mercurial/hgrc``. Om det körs i ett arkiv, så används\n"
+" ``.hg/hgrc`` också."
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr " Se :hg:`help urls` för mer information."
+
+msgid "not found!\n"
+msgstr "hittades inte!\n"
+
+msgid "set changeset phase to public"
+msgstr "sätt ändringsfas till public"
+
+msgid "set changeset phase to draft"
+msgstr "sätt ändringsfas till draft"
+
+msgid "set changeset phase to secret"
+msgstr "sätt ändringsfas till secret"
+
+msgid "allow to move boundary backward"
+msgstr "tillåt att gränser flyttas bakåt"
+
+msgid "target revision"
+msgstr "målrevision"
+
+msgid "[-p|-d|-s] [-f] [-r] REV..."
+msgstr "[-p|-d|-s] [-f] [-r] REV..."
+
+msgid "set or show the current phase name"
+msgstr "sätt eller visa det aktuella fasnamnet"
+
+msgid " With no argument, show the phase name of specified revisions."
+msgstr " Om inga argument ges, så visas fasnamnet för angivna revisioner."
+
+msgid ""
+" With one of -p/--public, -d/--draft or -s/--secret, change the\n"
+" phase value of the specified revisions."
+msgstr ""
+" Med en av -p/--public, -d/--draft eller -s/--secret, så ändras\n"
+" fasvärdet för de angivna revisionerna."
+
+msgid ""
+" Unless -f/--force is specified, :hg:`phase` won't move changeset from a\n"
+" lower phase to an higher phase. Phases are ordered as follows::"
+msgstr ""
+" Om inte -f/--force anges, så kommer inte :hg:`phase` att flytta\n"
+" ändringar från en lägre fas till en högre fas. Faser är ordnade enligt\n"
+" följande::"
+
+msgid " public < draft < secret"
+msgstr " public < draft < secret"
+
+msgid ""
+" Return 0 on success, 1 if no phases were changed or some could not\n"
+" be changed.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om inga faser ändrades eller om\n"
+" några inte kunde förändras.\n"
+" "
+
+msgid "only one phase can be specified"
+msgstr "bara en fas kan vara angiven"
+
+#, python-format
+msgid "cannot move %i changesets to a more permissive phase, use --force\n"
+msgstr ""
+
+#, python-format
+msgid "phase changed for %i changesets\n"
+msgstr "fas ändrad för %i ändringar\n"
+
+msgid "no phases changed\n"
+msgstr "inga faser ändrage\n"
+
+#, python-format
+msgid "not updating: %s\n"
+msgstr "uppdaterar inte: %s\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+"(kör 'hg heads' för att se nya huvuden, 'hg merge' för att sammanfoga)\n"
+
+msgid "(run 'hg heads .' to see heads, 'hg merge' to merge)\n"
+msgstr "(kör 'hg heads' för att se huvuden, 'hg merge' för att sammanfoga)\n"
+
+msgid "(run 'hg heads' to see heads)\n"
+msgstr "(kör 'hg heads' för att se huvuden)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(kör 'hg update' för att få en arbetskopia)\n"
+
+msgid "update to new branch head if changesets were pulled"
+msgstr "uppdatera till nytt grenhuvud om ändringar drogs"
+
+msgid "run even when remote repository is unrelated"
+msgstr "kör även när fjärrarkivet är orelaterat"
+
+msgid "BOOKMARK"
+msgstr "BOKMÄRKE"
+
+msgid "bookmark to pull"
+msgstr "bokmärke att dra"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr "[-u] [-f] [-r REV]... [-e KMD] [--remotecmd KMD] [KÄLLA]"
+
+msgid "pull changes from the specified source"
+msgstr "dra ändringar från den specificerade källan"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Drar ändringar från ett annat arkiv till ett lokalt."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+" Hittar alla ändringar från arkivet i den specificerade sökvägen eller\n"
+" URL:en och lägger till dem i det lokala arkivet (det nuvarande om inte\n"
+" -R är angivet). Som standard uppdaterar detta inte projektkopian i\n"
+" arbetskatalogen."
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+" Använd :hg:`incoming` om du vill se vad som skulle ha lagts till av en\n"
+" dragning vid det tillfället du kör kommandot. Om du bestämmer dig för\n"
+" att lägga till de ändringarna i arkivet, använd :hg:`pull -r X` där\n"
+" ``X`` är den sista ändringen visad av :hg:`incoming`."
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+" Om KÄLLA inte är angivet, används 'default'-sökvägen.\n"
+" Se :hg:`help urls` för mer information."
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om en uppdatering har olösta\n"
+" filer.\n"
+" "
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "fjärrbokmärket %s hittades inte!"
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "importerar bokmärket %s\n"
+
+msgid "force push"
+msgstr "tvinga tryckning"
+
+msgid "bookmark to push"
+msgstr "bokmärke att trycka"
+
+msgid "allow pushing a new branch"
+msgstr "tillåt att trycka en ny gren"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr "[-f] [-r REV]... [-e KMD] [--remotecmd KMD] [DEST]"
+
+msgid "push changes to the specified destination"
+msgstr "tryck ändringar till den specificerade destinationen"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+" Trycker ändringar från det lokala arkivet till angiven destination."
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+" Denna operation är symmetrisk med pull: den är identisk med en pull i\n"
+" destinationsarkivet från det aktuella arkivet."
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+" Som standard tillåter inte push att nya huvuden skapas i\n"
+" destinationen, eftersom multipla huvuden skulle göra det oklart vilket\n"
+" huvud som skulle användas. I dessa situationer är det rekommenderat\n"
+" att dra och sammanfoga innan tryckning."
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+" Använd --new-branch om du vill tillåta push att skapa en ny namngiven\n"
+" gren som inte finns i destinationen. Detta ger dig möjligheten att\n"
+" bara skapa en ny gren utan att tvinga andra ändringar."
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+" Använd -f/--force för att upphäva det vanliga beteendet och trycka\n"
+" alla ändringar på alla grenar."
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+" Om -r/--rev används, kommer den angivna revisionen och alla anfäder att\n"
+" tryckas till det andra arkivet."
+
+msgid ""
+" If -B/--bookmark is used, the specified bookmarked revision, its\n"
+" ancestors, and the bookmark will be pushed to the remote\n"
+" repository."
+msgstr ""
+" Om -B/--bookmarks används, kommer den angivna bokmärkta revisionen,\n"
+" alla anfäder och bokmärket att tryckas till det andra arkivet."
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+" Se :hg:`help urls` för viktiga detaljer om URL:er med ``ssh://``. Om\n"
+" DESTINATION inte är angivet, används standardsökvägen."
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+" Returnerar 0 om tryckning lyckates, 1 om inget fanns att trycka.\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "trycker till %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "exporterar bokmärket %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "raderar fjärrbokmärket %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "bokmärket %s existerar inte i lokal- eller fjärrarkiv!\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "uppdatering av bokmärket %s misslyckades!\n"
+
+msgid "roll back an interrupted transaction"
+msgstr "Ã¥ngra en avbruten transaktion"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr " Återställ från en avbruten commit eller pull."
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+" Kommandot försöker att fixa arkivstatusen efter en avbruten operation.\n"
+" Det bör bara användas när Mercurial föreslår det.\n"
+" "
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+" Returns 0 om kommandot lyckades, 1 om inget fanns att återställa eller\n"
+" verifiering misslyckades.\n"
+" "
+
+msgid "record delete for missing files"
+msgstr "markera saknade filer för radering"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "radera (och ta bort) filer även om tillagda eller modifierade"
+
+msgid "remove the specified files on the next commit"
+msgstr "ta bort de specificerade filerna vid nästa arkivering"
+
+msgid " Schedule the indicated files for removal from the current branch."
+msgstr " Markera de indikerade filerna för borttagning från aktuell gren."
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`. To undo added\n"
+" files, see :hg:`forget`."
+msgstr ""
+" Kommandot markerar att filerna ska tas bort vid nästa arkivering. För\n"
+" att ångra en remove innan dess, se :hg:`revert`. För att ångra tillagda\n"
+" filer, se :hg:`forget`."
+
+msgid ""
+" -A/--after can be used to remove only files that have already\n"
+" been deleted, -f/--force can be used to force deletion, and -Af\n"
+" can be used to remove files from the next revision without\n"
+" deleting them from the working directory."
+msgstr ""
+" -A/--after kan användas för att bara ta bort filer som redan\n"
+" raderats, -f/--force kan användas för att tvinga radering, och -Af\n"
+" kan ta bort filer från nästa revision utan att radera dem från\n"
+" arbetskopian."
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!]\n"
+" (as reported by :hg:`status`). The actions are Warn, Remove\n"
+" (from branch) and Delete (from disk):"
+msgstr ""
+" Följande tabell visar hur remove uppför sig för olika filstatus\n"
+" (kolumner) och flaggor (rader). Filstatus är Adderade [A], Ren [C],\n"
+" Modifierad [M] och Saknad [!] (som rapporteras av :hg:`status`).\n"
+" Aktionerna är Varna, Radera (från gren) och Ta bort (från disk):"
+
+msgid ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+msgstr ""
+" ======= == == == ==\n"
+" A C M !\n"
+" ======= == == == ==\n"
+" ingen V RT V R\n"
+" -f R RT RT R\n"
+" -A V V V R\n"
+" -Af R R R R\n"
+" ======= == == == =="
+
+msgid ""
+" Note that remove never deletes files in Added [A] state from the\n"
+" working directory, not even if option --force is specified."
+msgstr ""
+" Notera att remove aldrig tar bort filer som är Adderade [A] från\n"
+" arbetskatalogen, inte ens om --force är angivet."
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om varningar påträffades.\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr "raderar inte %s: filen är inte hanterad\n"
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr "raderar inte %s: filen finns fortfarande (använd -f för att tvinga)\n"
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr "raderar inte %s: filen är ändrad (använd -f för att tvinga)\n"
+
+#, python-format
+msgid "not removing %s: file has been marked for add (use forget to undo)\n"
+msgstr "raderar inte %s: filen har lagts till (använd forget för att ångra)\n"
+
+msgid "record a rename that has already occurred"
+msgstr "spara en namnändring som redan har inträffat"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr "[FLAGGA]... KÄLLA... DEST"
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "döp om filer; likvärdig med kopiering + radering"
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+" Markera dest som kopior av källorna; markera källorna för radering.\n"
+" Om dest är en katalog, placeras kopiorna i den katalogen. Om dest är\n"
+" en fil, kan det bara finnas en källa."
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+" Det här kommandot får effekt vid nästa arkivering. För att ångra ett\n"
+" namnbyte innan det, se :hg:`revert`.\n"
+" "
+
+msgid "select all unresolved files"
+msgstr "välj alla olösta filer"
+
+msgid "list state of files needing merge"
+msgstr "visa status för filer som behöver sammanfogas"
+
+msgid "mark files as resolved"
+msgstr "markera filer som lösta"
+
+msgid "mark files as unresolved"
+msgstr "markera filer som olösta"
+
+msgid "hide status prefix"
+msgstr "göm statusprefix"
+
+msgid "redo merges or set/view the merge status of files"
+msgstr ""
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents). See :hg:`help\n"
+" merge-tools` for information on configuring merge tools."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to select all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files. Previous file\n"
+" contents are saved with a ``.orig`` suffix."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+" Notera att Mercurial inte låter dig arkivera filer med olösta\n"
+" konflikter från sammanfogningar. Du måste använda :hg:`resolve -m ...`\n"
+" innan du kan arkivera efter en sammanfogning med konflikter."
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckates, 1 om någon fil inte kunde lösas.\n"
+" "
+
+msgid "too many options specified"
+msgstr "för många flaggor specificerade"
+
+msgid "can't specify --all and patterns"
+msgstr "kan inte specificera --all och mönster"
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+"inga filer eller kataloger specificerade; använd --all för att "
+"Ã¥tersammanfoga alla filer"
+
+msgid "revert all changes when no arguments given"
+msgstr "återställ alla ändringar när inga argument ges"
+
+msgid "tipmost revision matching date"
+msgstr "senaste revision matchande datum"
+
+msgid "revert to the specified revision"
+msgstr "återgå till den angivna revisionen"
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr "[FLAGGA]... [-r REV] [NAMN]..."
+
+msgid "restore files to their checkout state"
+msgstr "återställ filer till deras uthämtningstillstånd"
+
+msgid " .. note::"
+msgstr " .. note::"
+
+msgid ""
+" To check out earlier revisions, you should use :hg:`update REV`.\n"
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" .. note::\n"
+" För att hämta ut tidigare revisioner, använd :hg:`update REV`.\n"
+" För att avbryta en oarkiverad sammanfogning (och bli av med alla\n"
+" ändringar), använd :hg:`update --clean .`."
+
+msgid ""
+" With no revision specified, revert the specified files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+" Om ingen revision anges, så återställs de givna filerna eller\n"
+" katalogerna till innehållet de hade i arbetskatalogens första förälder.\n"
+" Det sätter filer i ett omodifierad läge och avbeställer adderingar,\n"
+" raderingar, kopior och namnbyten. Om arbetskatalogen har två föräldrar,\n"
+" så måste du ange en revision."
+
+msgid ""
+" Using the -r/--rev or -d/--date options, revert the given files or\n"
+" directories to their states as of a specific revision. Because\n"
+" revert does not change the working directory parents, this will\n"
+" cause these files to appear modified. This can be helpful to \"back\n"
+" out\" some or all of an earlier change. See :hg:`backout` for a\n"
+" related method."
+msgstr ""
+" Med flaggan -r/--rev eller -d/--date, återställs de givna filerna eller\n"
+" katalogerna till läget i den specifika revisionen. Eftersom revert\n"
+" inte ändrar arbetskatalogens föräldrar, kommer dessa filer att visas\n"
+" som modifierade. Detta kan användas för att ångra delar av eller hela\n"
+" tidigare ändringar. Se :hg:`backout` för en relaterad metod."
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+" Modifierade filer sparas med suffixet .orig innan återställning.\n"
+" För att deaktivera dessa säkerhetskopior, använd --no-backup."
+
+msgid "you can't specify a revision and a date"
+msgstr "du kan inte specificera en revision och ett datum"
+
+msgid "uncommitted merge with no revision specified"
+msgstr "oarkiverad sammanfogning utan angiven revision"
+
+msgid "use \"hg update\" or see \"hg help revert\""
+msgstr "använd \"hg update\" eller se \"hg help revert\""
+
+msgid "no files or directories specified"
+msgstr "inga filer eller kataloger angivna"
+
+msgid ""
+"uncommitted merge, use --all to discard all changes, or 'hg update -C .' to "
+"abort the merge"
+msgstr ""
+"oarkiverad sammanfogning, använd --all för att kasta alla ändringar, eller "
+"'hg update -C .' för att avbryta sammanfogningen"
+
+#, python-format
+msgid ""
+"uncommitted changes, use --all to discard all changes, or 'hg update %s' to "
+"update"
+msgstr ""
+"oarkiverade ändringar, använd --all för att kasta alla ändringar, eller 'hg "
+"update %s' för att uppdatera"
+
+#, python-format
+msgid "use --all to revert all files, or 'hg update %s' to update"
+msgstr ""
+"använd --all för att återställa alla filer, eller 'hg update %s' för att "
+"uppdatera"
+
+msgid "uncommitted changes, use --all to discard all changes"
+msgstr "oarkiverade ändringar, använd --all för att kasta alla ändringar"
+
+msgid "use --all to revert all files"
+msgstr "använd --all för att återställa filer"
+
+msgid "ignore safety measures"
+msgstr "ignorera säkerhetsåtgärder"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "återgång från den senaste transaktionen (farligt)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+" Detta kommando bör användas med försiktighet. Det finns bara en nivå\n"
+" av återgång, och det finns inget sätt att ångra en återgång.\n"
+" Det återställer också katalogstatusen till tillståndet vid den\n"
+" senaste transaktionen, så dessa förloras. Kommandot ändrar inte\n"
+" arbetskatalogen."
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository."
+msgstr ""
+" Transaktioner används för att kapsla in alla kommandon som skapar nya\n"
+" ändringar eller sprider existerade ändringar till ett arkiv."
+
+msgid ""
+" For example, the following commands are transactional, and their\n"
+" effects can be rolled back:"
+msgstr ""
+" Exempelvis skapar de följande kommandona transaktioner, och deras\n"
+" ändringar kan återkallas:"
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (med det här arkivet som destination)\n"
+" - unbundle"
+
+msgid ""
+" To avoid permanent data loss, rollback will refuse to rollback a\n"
+" commit transaction if it isn't checked out. Use --force to\n"
+" override this protection."
+msgstr ""
+" För att undvika permanent dataförlust så vägrar rollback att köras\n"
+" på en arkivering om den inte är uthämtad. Använd --force för att gå\n"
+" förbi det här skyddet."
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+" Detta kommando är inte tänkt att användas i offentliga arkiv. När\n"
+" ändringar är tillgängliga att dras av andra användare, så är en\n"
+" lokal återgång ineffektivt (någon annan kan redan ha dragit\n"
+" ändringarna). Dessutom finns möjligheten till timingproblem; som\n"
+" ett exempel kan en pågående dragning misslyckas om en återgång\n"
+" utförs."
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om ingen återgångsdata finns.\n"
+" "
+
+msgid "print the root (top) of the current working directory"
+msgstr "visa roten för den aktuella arbetskatalogen"
+
+msgid " Print the root directory of the current repository."
+msgstr " Visa rotkatalogen för det aktuella arkivet."
+
+msgid "name of access log file to write to"
+msgstr "namn på åtkomstlogg att skriva till"
+
+msgid "name of error log file to write to"
+msgstr "namn på fellogg att skriva till"
+
+msgid "PORT"
+msgstr "PORT"
+
+msgid "port to listen on (default: 8000)"
+msgstr "port att lyssna på (standard: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "adress att lyssna på (standard alla gränssnitt)"
+
+msgid "ADDR"
+msgstr "ADDR"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "sökvägsprefix att dela ut från (standard: serverrot)"
+
+msgid "name to show in web pages (default: working directory)"
+msgstr "namn att visa i webbsidor (standard: arbetskatalogen)"
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr "namn på webdir-konfigurationsfil (se \"hg help hgweb\")"
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr "namn på webdir-konfigurationsfil (FÖRLEGAD)"
+
+msgid "for remote clients"
+msgstr "för fjärrklienter"
+
+msgid "web templates to use"
+msgstr "webbmallar att använda"
+
+msgid "template style to use"
+msgstr "mallstil att använda"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "använd IPv6 förutom IPv4"
+
+msgid "SSL certificate file"
+msgstr "SSL-certifikatsfil"
+
+msgid "start stand-alone webserver"
+msgstr "starta fristående webbserver"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browsing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+" Starta en lokal HTTP-arkivserver för webbläsare och pull-operationer.\n"
+" Du kan använda detta för improviserad delning och skummande av arkiv.\n"
+" Det är rekommenderat att använda en riktig webbserver för att dela ett\n"
+" arkiv under längre tidsperioder."
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+" Notera att servern inte har någon åtkomstkontroll. Det betyder att vem\n"
+" som helst kan läsa från servern och ingen kan skriva till den som\n"
+" standard. Sätt flaggan ``web.allow_push`` till ``*`` för att tillåta\n"
+" alla att trycka till servern. Om du behöver autenticiera användare,\n"
+" borde du använda en riktig webbserver."
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+" Som standard loggar servern anslutningar till stdout och fel till\n"
+" stderr. Använd flaggorna -A/--accesslog och -E/--errorlog för att logga\n"
+" till filer."
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+" För att låta servern välja ett ledigt portnummer att lyssna på, ange 0\n"
+" som portnummer; då visar servern det portnummer som används."
+
+msgid "cannot use --stdio with --cmdserver"
+msgstr "kan inte använda --stdio med --cmdserver"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr "lyssnar på http://%s%s/%s (bunden till %s:%d)\n"
+
+msgid "show untrusted configuration options"
+msgstr "visa opålitliga konfigurationsalternativ"
+
+msgid "[-u] [NAME]..."
+msgstr "[-u] [NAMN]..."
+
+msgid "show combined config settings from all hgrc files"
+msgstr "visa kombinerade konfigurationsalternativ från alla hgrc-filer"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr " Utan argument, skrivs namn och värden för alla alternativ."
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+" Med ett argument i formen sektion.namn, visas bara värdet för det\n"
+" konfigurationsalternativet."
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+" Med flera argument, visas namn och värden för alla alternativ med\n"
+" överrensstämmande sektionsnamn."
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+" Med --debug, visas källan (filnamn och radnummer) för varje\n"
+" alternativ."
+
+msgid "only one config item permitted"
+msgstr "bara ett konfigurationsalternativ tillåts"
+
+msgid "show status of all files"
+msgstr "visa status för alla filer"
+
+msgid "show only modified files"
+msgstr "visa bara modifierade filer"
+
+msgid "show only added files"
+msgstr "visa bara adderade filer"
+
+msgid "show only removed files"
+msgstr "visa bara raderade filer"
+
+msgid "show only deleted (but tracked) files"
+msgstr "visa bara borttagna (men spårade) filer"
+
+msgid "show only files without changes"
+msgstr "visa bara filer utan ändringar"
+
+msgid "show only unknown (not tracked) files"
+msgstr "visa bara okända (ospårade) filer"
+
+msgid "show only ignored files"
+msgstr "visa bara ignorerade filer"
+
+msgid "show source of copied files"
+msgstr "visa källan för kopierade filer"
+
+msgid "show difference from revision"
+msgstr "visa differens från revision"
+
+msgid "list the changed files of a revision"
+msgstr "visa de ändrade filerna från en revision"
+
+msgid "show changed files in the working directory"
+msgstr "visa ändrade filer i arbetskatalogen"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+" Visa status för filer i arkivet. Om namn anges, visas bara filer som\n"
+" matchar. FIler som är rena eller ignorerade eller källan för en flytt-\n"
+" eller kopieringsoperation, visas inte om förrän -c/--clean,\n"
+" -i/--ignored, -C/--copies eller -A/--all anges. Om inte flaggor med\n"
+" beskrivningen \"visa bara ...\" anges, så används flaggorna -mardu."
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+" Flaggan -q/--quiet döljer ospårade (okända och ignorerade) filer om det\n"
+" inte bes om explicit med -u/--unknown eller -i/--ignored."
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+" .. note::\n"
+" status kan verka osams med diff om tillstånd har ändrat eller en\n"
+" sammanfogning har utförts. Det vanliga diff-formatet rapporterar\n"
+" inte förändringar av tillstånd och diff rapporterar bara ändringar\n"
+" relativt till en förälder vid sammanfogningar."
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+" Om en revision anges, används den som basrevision. Om två revisioner\n"
+" anges, visas skillnaderna mellan dem. Flaggan --change kan också\n"
+" användas som en genväg för att visa de ändrade filerna i en revision\n"
+" från dess första förälder."
+
+msgid " The codes used to show the status of files are::"
+msgstr " Koderna som används för att visa filstatus är::"
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+" M = modifierad\n"
+" A = adderad\n"
+" R = raderad\n"
+" C = ren\n"
+" ! = saknad (borttagen av icke-hg-kommando, men fortfarande spårad)\n"
+" ? = inte spårad\n"
+" I = ignorerad\n"
+" = källa för den tidigare filen listad som A (adderad)"
+
+msgid ""
+" - show changes in the working directory relative to a\n"
+" changeset::"
+msgstr ""
+" - visa modifikationer i arbetskatalogen relativt till en ändring::"
+
+msgid " hg status --rev 9353"
+msgstr " hg status --rev 9353"
+
+msgid " - show all changes including copies in an existing changeset::"
+msgstr " - visa alla ändringar inklusive kopior i en ändring::"
+
+msgid " hg status --copies --change 9353"
+msgstr " hg status --copies --change 9353"
+
+msgid " - get a NUL separated list of added files, suitable for xargs::"
+msgstr ""
+" - visa en NUL-separerad lista med tillagda filer, lämpligt för xargs::"
+
+msgid " hg status -an0"
+msgstr " hg status -an0"
+
+msgid "check for push and pull"
+msgstr "sök efter inkommande och utgående ändringar"
+
+msgid "summarize working directory state"
+msgstr "sammanfatta arbetskatalogens tillstånd"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+" Detta skapar en kort sammanfattning av arbetskatalogens tillstånd,\n"
+" inklusive föräldrar, gren, arkivstatus, och tillgängliga uppdateringar."
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+" Med flaggan --remote kommer också standardsökvägarna att sökas igenom\n"
+" för att hitta inkommande och utgående ändringar. Detta kan ta lång tid."
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "förälder: %d:%s "
+
+msgid " (empty repository)"
+msgstr " (tomt arkiv)"
+
+msgid " (no revision checked out)"
+msgstr " (ingen revision uthämtad)"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "gren: %s\n"
+
+msgid "bookmarks:"
+msgstr "bokmärken:"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d modifierad"
+
+#, python-format
+msgid "%d added"
+msgstr "%d tillagd"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d borttagen"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d omdöpta"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d kopierade"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d raderad"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d okänd"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d ignorerad"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d olöst"
+
+#, python-format
+msgid "%d subrepos"
+msgstr ""
+
+msgid " (merge)"
+msgstr " (sammanfogning)"
+
+msgid " (new branch)"
+msgstr " (ny gren)"
+
+msgid " (head closed)"
+msgstr " (huvudet stängt)"
+
+msgid " (clean)"
+msgstr " (ren)"
+
+msgid " (new branch head)"
+msgstr " (nytt grenhuvud)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr "arkivera: %s\n"
+
+msgid "update: (current)\n"
+msgstr "uppdatera: (aktuell)\n"
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr "uppdatera: %d nya ändringar (uppdatera)\n"
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr "uppdatera: %d nya ändringar, %d grenhuvuden (sammanfoga)\n"
+
+msgid "1 or more incoming"
+msgstr "1 eller fler inkommande"
+
+#, python-format
+msgid "%d outgoing"
+msgstr "%d utgående"
+
+#, python-format
+msgid "%d incoming bookmarks"
+msgstr "%d inkommande bokmärken"
+
+#, python-format
+msgid "%d outgoing bookmarks"
+msgstr "%d utgående bokmärken"
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "fjärran: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr "fjärran: (synkad)\n"
+
+msgid "force tag"
+msgstr "tvinga märkning"
+
+msgid "make the tag local"
+msgstr "gör märket lokalt"
+
+msgid "revision to tag"
+msgstr "revision att märka"
+
+msgid "remove a tag"
+msgstr "ta bort ett märke"
+
+msgid "use <text> as commit message"
+msgstr "använd <text> som arkiveringsmeddelande"
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr "[-f] [-l] [-m TEXT] [-d DATUM] [-u ANVÄNDARE] [-r REV] NAMN..."
+
+msgid "add one or more tags for the current or given revision"
+msgstr "lägg till en eller fler märken för en revision"
+
+msgid " Name a particular revision using <name>."
+msgstr " Namnge en specifik revision med <namn>."
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc. Changing\n"
+" an existing tag is normally disallowed; use -f/--force to override."
+msgstr ""
+" Märken används för att namnge specifika revisioner i arkivet och är\n"
+" väldigt användbara för at jämföra olika revisioner, för att gå\n"
+" tillbaka till tidigare versioner eller för att markera förgreningar\n"
+" som releaser, osv. Att ändra ett existerande märke är normalt inte\n"
+" tillåtet; använd -f/--force för att tvinga."
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+" Om ingen revision anges, används föräldern för arbetskatalogen, eller\n"
+" toppen om ingen revision är uthämtad."
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed similarly\n"
+" to other project files and can be hand-edited if necessary. This\n"
+" also means that tagging creates a new commit. The file\n"
+" \".hg/localtags\" is used for local tags (not shared among\n"
+" repositories)."
+msgstr ""
+" För att underlätta versionshantering, distribution, och sammanfogning\n"
+" av märken, lagras de som en fil vid namn \".hgtags\" som hanteras på\n"
+" samma sätt som andra projektfiler och kan ändras för hand vid behov.\n"
+" Filen \".hg/localtags\" används för lokala märken (ej delad i arkiv)."
+
+msgid ""
+" Tag commits are usually made at the head of a branch. If the parent\n"
+" of the working directory is not a branch head, :hg:`tag` aborts; use\n"
+" -f/--force to force the tag commit to be based on a non-head\n"
+" changeset."
+msgstr ""
+" Arkivering av märken görs vanligtvis på huvudet av en gren. Om\n"
+" föräldern till arbetskatalogen inte är ett grenhuvud, så avbryts\n"
+" :hg:`tag`; använd -f/--force för att tvinga arkiveringen."
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+" Eftersom märkesnamn har prioritet över grennamn vid uppslagning av\n"
+" revisioner, avråds det att använda existerande grennamn som märkesnamn."
+
+msgid "tag names must be unique"
+msgstr "märkesnamn måste vara unika"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr "märkesnamn kan inte bara bestå av blanktecken"
+
+msgid "--rev and --remove are incompatible"
+msgstr "--rev och --remove är inkompatibla"
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "märket '%s' existerar inte"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "märket '%s' är inte ett globalt märke"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "märket '%s' är inte ett lokalt märke"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "märket '%s' existerar redan (använd -f för att tvinga)"
+
+msgid "uncommitted merge"
+msgstr "oarkiverad sammanfogning"
+
+msgid "not at a branch head (use -f to force)"
+msgstr "inte vid ett grenhuvud (använd -f för att tvinga)"
+
+msgid "null revision specified"
+msgstr "null-revision angiven"
+
+msgid "list repository tags"
+msgstr "lista arkivmärken"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+" Listar både vanliga och lokala märken. När flaggan -v/--verbose\n"
+" används, visas en tredje kolumn med namnet \"local\" för lokala märken."
+
+msgid "[-p] [-g]"
+msgstr "[-p] [-g]"
+
+msgid "show the tip revision"
+msgstr "visa topprevisionen"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+" Topprevisionen (kallas tip av Mercurial) är den senast tillagda\n"
+" ändringen i arkivet (och därför det senast tillagda huvudet)."
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+" Om du precis har gjort en arkivering, kommer den att vara toppen. Om\n"
+" du har dragit ändringar från ett annat arkiv, så blir toppen för det\n"
+" arkivet den aktuella toppen. Märket \"tip\" är speciellt och kan inte\n"
+" döpas om eller tilldelas en annan ändring."
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr "uppdatera till nytt grenhuvud om ändringar packades upp"
+
+msgid "[-u] FILE..."
+msgstr "[-u] FIL..."
+
+msgid "apply one or more changegroup files"
+msgstr "applicera en eller flera filer med ändringar"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+" Applicera en eller flera komprimerade filer med ändringar genererade\n"
+" av bundle-kommandot."
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+" Returnerar 0 om kommandot lyckades, 1 om en uppdatering har olösta\n"
+" filer.\n"
+" "
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "kassera oarkiverade ändringar (ingen backup)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr "uppdatera över grenar om inga oarkiverade ändringar"
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr "[-c] [-C] [-d DATUM] [[-r] REV]"
+
+msgid "update working directory (or switch revisions)"
+msgstr "uppdatera arbetskatalogen (eller växla mellan revisioner)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch and move the current bookmark (see :hg:`help\n"
+" bookmarks`)."
+msgstr ""
+" Uppdatera arkivets arbetskatalog till den angivna ändringen. Om ingen\n"
+" ändring anges, så uppdateras till toppen på den nuvarande namngivna\n"
+" grenen och nuvarande bokmärket flyttas (se :hg:`help bookmarks`)."
+
+msgid ""
+" Update sets the working directory's parent revison to the specified\n"
+" changeset (see :hg:`help parents`)."
+msgstr ""
+
+msgid ""
+" If the changeset is not a descendant or ancestor of the working\n"
+" directory's parent, the update is aborted. With the -c/--check\n"
+" option, the working directory is checked for uncommitted changes; if\n"
+" none are found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+" Följande regler gäller när arbetskatalogen innehåller oarkiverade\n"
+" ändringar:"
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+" 1. Om varken -c/--check eller -C/--clean specificeras, och om den\n"
+" begärda ändringen är en anfader eller ättling till\n"
+" arbetskatalogens förälder, kommer oarkiverade ändringar att\n"
+" sammanfogas med den begärda ändringen och det sammanfogade\n"
+" resultatet lämnas oarkiverat. Om den begärda ändringen inte är en\n"
+" anfader eller ättling (dvs är i en annan gren), avbryts\n"
+" uppdateringen och de oarkiverade ändringarna bevaras."
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+" 2. Med flaggan -c/--check avbryts uppdateringen och de oarkiverade\n"
+" ändringarna lämnas."
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+" 3. Med flaggan -C/--clean kommer oarkiverade ändringar att kasseras\n"
+" och arbetskatalogen uppdateras till den begärda ändringen."
+
+msgid ""
+" To cancel an uncommitted merge (and lose your changes), use\n"
+" :hg:`update --clean .`."
+msgstr ""
+" För att avbryta en oarkiverad sammanfogning (och förlora dina\n"
+" ändringar), använd :hg:`update --clean .`."
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+" Använd null som ändring för att radera arbetskatalogen (som\n"
+" :hg:`clone -U`)."
+
+msgid ""
+" If you want to revert just one file to an older revision, use\n"
+" :hg:`revert [-r REV] NAME`."
+msgstr ""
+" Om du vill uppdatera bara en fil till en äldre revision, använd\n"
+" :hg:`revert [-r REV] NAMN`."
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr "kan inte både ange -c/--check och -C/--clean"
+
+msgid "verify the integrity of the repository"
+msgstr "verifiera arkivets integritet"
+
+msgid " Verify the integrity of the current repository."
+msgstr " Verifiera det aktuella arkivets integritet."
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+" Detta genomför en omfattande kontroll av arkivets integritet, validerar\n"
+" hash- och checksummor för varje notering i ändringsloggen, manifestet,\n"
+" och spårade filer, såväl som integriteten av korslänkar och indexar."
+
+msgid "output version and copyright information"
+msgstr "visa version och copyright-information"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "Mercurial Distribuerad SCM (version %s)\n"
+
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "(se http://mercurial.selenic.com för mer information)"
+
+msgid ""
+"Copyright (C) 2005-2012 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"Copyright (C) 2005-2012 Matt Mackall och andra\n"
+"Detta är fri mjukvara; se källkoden för kopieringsvillkor. Det ges INGEN\n"
+"garanti; inte ens för SÄLJBARHET eller ATT PASSA FÖR ETT VISST ÄNDAMÅL.\n"
+
+#, python-format
+msgid "unknown mode %s"
+msgstr "okänt läge '%s'"
+
+#, python-format
+msgid "unknown command %s"
+msgstr "okänt kommando %s"
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "kan inte inkludera %s (%s)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr ""
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr ""
+
+msgid "not found in manifest"
+msgstr "hittades inte i manifestet"
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr "ingen sådan fil i rev %s"
+
+msgid "branch name not in UTF-8!"
+msgstr "grennamn inte i UTF-8!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s existerar inte!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+"%s: upp till %d MB RAM kan behövas för att hantera denna fil\n"
+"(använd 'hg revert %s' för att ångra den väntande additionen)\n"
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr "%s inte tillagd: bara filer och symlänkar stödjs\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s spåras redan!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s spåras inte!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s inte borttagen!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr ""
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr ""
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr ""
+
+msgid "nullid"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr ""
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "character device"
+msgstr ""
+
+msgid "block device"
+msgstr ""
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr ""
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr ""
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "push skapar nya fjärrhuvuden: %s!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "använd 'hg push --new-branch' för att skapa nya fjärrgrenar"
+
+#, python-format
+msgid "push creates new remote head %s on branch '%s'!"
+msgstr "push skapar nytt fjärrhuvud %s på grenen '%s'!"
+
+#, python-format
+msgid "push creates new remote head %s!"
+msgstr "push skapar nya fjärrhuvudet %s!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr "du kan dra och sammanfoga eller använda push -f för att tvinga"
+
+msgid "did you forget to merge? use push -f to force"
+msgstr "glömde du att sammanfoga? använd push -f för att tvinga"
+
+#, python-format
+msgid "new remote heads on branch '%s'\n"
+msgstr "nya fjärrhuvuden på grenen '%s'!\n"
+
+#, python-format
+msgid "new remote head %s\n"
+msgstr "nytt fjärrhuvud %s\n"
+
+msgid "note: unsynced remote changes!\n"
+msgstr "notera: osynkade fjärrändringar!\n"
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "avbryter: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr "(%s)\n"
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr ""
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "avbryter: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: %s\n"
+msgstr ""
+
+msgid "abort: remote error:\n"
+msgstr "avbryter: fjärrfel:\n"
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "avbryter: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "avbryter: %s"
+
+msgid " empty string\n"
+msgstr " tom sträng\n"
+
+msgid "killed!\n"
+msgstr "dödad!\n"
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: okänt kommando '%s'\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr ""
+
+msgid "(is your Python install correct?)\n"
+msgstr ""
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr ""
+
+msgid "broken pipe\n"
+msgstr ""
+
+msgid "interrupted!\n"
+msgstr "avbruten!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+
+msgid "abort: out of memory\n"
+msgstr ""
+
+msgid "the extension author."
+msgstr ""
+
+#, python-format
+msgid ""
+"** Unknown exception encountered with possibly-broken third-party extension "
+"%s\n"
+"** which supports versions %s of Mercurial.\n"
+"** Please disable %s and try your action again.\n"
+"** If that fixes the bug please report it to %s\n"
+msgstr ""
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr ""
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr "** http://mercurial.selenic.com/wiki/BugTracker\n"
+
+#, python-format
+msgid "** Python %s\n"
+msgstr ""
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr ""
+
+msgid "too few arguments for command alias"
+msgstr ""
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr ""
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr "fel när nuvarande arbetskatalog hämtades: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "utökningen '%s' tar över dessa kommandon: %s\n"
+
+msgid "option --config may not be abbreviated!"
+msgstr ""
+
+msgid "option --cwd may not be abbreviated!"
+msgstr ""
+
+msgid ""
+"option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+
+#, python-format
+msgid "time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "arkivet '%s' är inte lokalt"
+
+#, python-format
+msgid "no repository found in '%s' (.hg not found)"
+msgstr "inget arkiv hittades i '%s' (.hg hittades inte)"
+
+msgid "warning: --repository ignored\n"
+msgstr "varning: --repository ignorerades\n"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+
+msgid "statprof not available - install using \"easy_install statprof\""
+msgstr ""
+
+#, python-format
+msgid "invalid sampling frequency '%s' - ignoring\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized profiler '%s' - ignored\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: error finding commands in %s\n"
+msgstr "varning: kunde inte hitta kommandon i %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr ""
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+"Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+"Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+"Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+"Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+"Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+#, python-format
+msgid "merging %s incomplete! (edit conflicts, then use 'hg resolve --mark')\n"
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+"Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+msgid "unterminated string"
+msgstr ""
+
+msgid "syntax error"
+msgstr ""
+
+msgid "missing argument"
+msgstr ""
+
+msgid "can't use a list in this context"
+msgstr "kan inte använda en lista i detta sammanhang"
+
+msgid ""
+"``modified()``\n"
+" File that is modified according to status."
+msgstr ""
+
+#. i18n: "modified" is a keyword
+msgid "modified takes no arguments"
+msgstr "modified tar inga argument"
+
+msgid ""
+"``added()``\n"
+" File that is added according to status."
+msgstr ""
+
+#. i18n: "added" is a keyword
+msgid "added takes no arguments"
+msgstr "added tar inga argument"
+
+msgid ""
+"``removed()``\n"
+" File that is removed according to status."
+msgstr ""
+
+#. i18n: "removed" is a keyword
+msgid "removed takes no arguments"
+msgstr "removed tar inga argument"
+
+msgid ""
+"``deleted()``\n"
+" File that is deleted according to status."
+msgstr ""
+
+#. i18n: "deleted" is a keyword
+msgid "deleted takes no arguments"
+msgstr "deleted tar inga argument"
+
+msgid ""
+"``unknown()``\n"
+" File that is unknown according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "unknown" is a keyword
+msgid "unknown takes no arguments"
+msgstr "unknown tar inga argument"
+
+msgid ""
+"``ignored()``\n"
+" File that is ignored according to status. These files will only be\n"
+" considered if this predicate is used."
+msgstr ""
+
+#. i18n: "ignored" is a keyword
+msgid "ignored takes no arguments"
+msgstr "ignored tar inga argument"
+
+msgid ""
+"``clean()``\n"
+" File that is clean according to status."
+msgstr ""
+
+#. i18n: "clean" is a keyword
+msgid "clean takes no arguments"
+msgstr "clean tar inga argument"
+
+#, python-format
+msgid "not a function: %s"
+msgstr "inte en funktion: %s"
+
+msgid ""
+"``binary()``\n"
+" File that appears to be binary (contains NUL bytes)."
+msgstr ""
+
+#. i18n: "binary" is a keyword
+msgid "binary takes no arguments"
+msgstr "binary tar inga argument"
+
+msgid ""
+"``exec()``\n"
+" File that is marked as executable."
+msgstr ""
+
+#. i18n: "exec" is a keyword
+msgid "exec takes no arguments"
+msgstr "exec tar inga argument"
+
+msgid ""
+"``symlink()``\n"
+" File that is marked as a symlink."
+msgstr ""
+
+#. i18n: "symlink" is a keyword
+msgid "symlink takes no arguments"
+msgstr "symlink tar inga argument"
+
+msgid ""
+"``resolved()``\n"
+" File that is marked resolved according to the resolve state."
+msgstr ""
+
+#. i18n: "resolved" is a keyword
+msgid "resolved takes no arguments"
+msgstr "resolved tar inga argument"
+
+msgid ""
+"``unresolved()``\n"
+" File that is marked unresolved according to the resolve state."
+msgstr ""
+
+#. i18n: "unresolved" is a keyword
+msgid "unresolved takes no arguments"
+msgstr "unresolved tar inga argument"
+
+msgid ""
+"``hgignore()``\n"
+" File that matches the active .hgignore pattern."
+msgstr ""
+
+msgid "hgignore takes no arguments"
+msgstr "hgignore tar inga argument"
+
+msgid ""
+"``grep(regex)``\n"
+" File contains the given regular expression."
+msgstr ""
+
+msgid "grep requires a pattern"
+msgstr "grep kräver ett mönster"
+
+#, python-format
+msgid "couldn't parse size: %s"
+msgstr ""
+
+msgid ""
+"``size(expression)``\n"
+" File size matches the given expression. Examples:"
+msgstr ""
+
+msgid ""
+" - 1k (files from 1024 to 2047 bytes)\n"
+" - < 20k (files less than 20480 bytes)\n"
+" - >= .5MB (files at least 524288 bytes)\n"
+" - 4k - 1MB (files from 4096 bytes to 1048576 bytes)"
+msgstr ""
+
+#. i18n: "size" is a keyword
+msgid "size requires an expression"
+msgstr "size kräver ett uttryck"
+
+msgid ""
+"``encoding(name)``\n"
+" File can be successfully decoded with the given character\n"
+" encoding. May not be useful for encodings other than ASCII and\n"
+" UTF-8."
+msgstr ""
+
+#. i18n: "encoding" is a keyword
+msgid "encoding requires an encoding name"
+msgstr ""
+
+#, python-format
+msgid "unknown encoding '%s'"
+msgstr ""
+
+msgid ""
+"``copied()``\n"
+" File that is recorded as being copied."
+msgstr ""
+
+#. i18n: "copied" is a keyword
+msgid "copied takes no arguments"
+msgstr "copied tar inga argument"
+
+msgid ""
+"``subrepo([pattern])``\n"
+" Subrepositories whose paths match the given pattern."
+msgstr ""
+
+#. i18n: "subrepo" is a keyword
+msgid "subrepo takes at most one argument"
+msgstr "subrepo tar maximalt ett argument"
+
+msgid "subrepo requires a pattern or no arguments"
+msgstr "subrepo kräver ett mönster eller inga argument"
+
+msgid "invalid token"
+msgstr ""
+
+msgid "starting revisions are not directly related"
+msgstr ""
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr ""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "invalid bisect state"
+msgstr "ogiltigt bisect-tillständ"
+
+#. i18n: bisect changeset status
+msgid "good"
+msgstr "bra"
+
+#. i18n: bisect changeset status
+msgid "bad"
+msgstr "dålig"
+
+#. i18n: bisect changeset status
+msgid "skipped"
+msgstr "hoppade över"
+
+#. i18n: bisect changeset status
+msgid "untested"
+msgstr "otestad"
+
+#. i18n: bisect changeset status
+msgid "good (implicit)"
+msgstr "bra (implicit)"
+
+#. i18n: bisect changeset status
+msgid "bad (implicit)"
+msgstr "dålig (implicit)"
+
+msgid "disabled extensions:"
+msgstr "deaktiverade utökningar:"
+
+msgid "VALUE"
+msgstr "VÄRDE"
+
+msgid "DEPRECATED"
+msgstr "FÖRLEGAD"
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times\n"
+msgstr ""
+"\n"
+"flaggor markerade med [+] kan anges flera gånger\n"
+
+msgid "Configuration Files"
+msgstr "Konfigurationsfiler"
+
+msgid "Date Formats"
+msgstr "Datumformat"
+
+msgid "File Name Patterns"
+msgstr "Filnamnsmönster"
+
+msgid "Environment Variables"
+msgstr "Miljövariabler"
+
+msgid "Specifying Single Revisions"
+msgstr "Ange En Revision"
+
+msgid "Specifying Multiple Revisions"
+msgstr "Ange Flera Revisioner"
+
+msgid "Specifying Revision Sets"
+msgstr "Ange Revisionsset"
+
+msgid "Specifying File Sets"
+msgstr "Ange Filset"
+
+msgid "Diff Formats"
+msgstr "Diff-format"
+
+msgid "Merge Tools"
+msgstr "Sammanfogningsverktyg"
+
+msgid "Template Usage"
+msgstr "Användning Av Mallar"
+
+msgid "URL Paths"
+msgstr "URL-sökvägar"
+
+msgid "Using Additional Features"
+msgstr "Använda Ytterligare Funktioner"
+
+msgid "Subrepositories"
+msgstr "Underarkiv"
+
+msgid "Configuring hgweb"
+msgstr "Konfiguration av hgweb"
+
+msgid "Glossary"
+msgstr "Ordlista"
+
+msgid "Syntax for Mercurial Ignore Files"
+msgstr "Syntax för Mercurials Ignoreringsfiler"
+
+msgid "Working with Phases"
+msgstr "Arbeta med Faser"
+
+msgid ""
+"The Mercurial system uses a set of configuration files to control\n"
+"aspects of its behavior."
+msgstr ""
+"Mercurial använder ett antal konfigurationsfiler för att kontrollera hur\n"
+"vissa delar ska fungera."
+
+msgid ""
+"The configuration files use a simple ini-file format. A configuration\n"
+"file consists of sections, led by a ``[section]`` header and followed\n"
+"by ``name = value`` entries::"
+msgstr ""
+"Konfigurationsfilerna för Mercurial använder ett enkelt ini-filformat. En\n"
+"konfigurationsfil består av sektioner, som inleds av en ``[sektion]`` och\n"
+"följs av rader med ``namn = värde``::"
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+" [ui]\n"
+" username = Förnamn Efternamn <fornamn.efternamn@example.net>\n"
+" verbose = True"
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. See the Syntax section below."
+msgstr ""
+"Raderna ovanför refereras till som ``ui.username`` och\n"
+"``ui.verbose``, respektive. Läs Syntax-sektionen nedanför:"
+
+msgid ""
+"Files\n"
+"====="
+msgstr ""
+"Filer\n"
+"====="
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"These files do not exist by default and you will have to create the\n"
+"appropriate configuration files yourself: global configuration like\n"
+"the username setting is typically put into\n"
+"``%USERPROFILE%\\mercurial.ini`` or ``$HOME/.hgrc`` and local\n"
+"configuration is put into the per-repository ``<repo>/.hg/hgrc`` file."
+msgstr ""
+
+msgid ""
+"The names of these files depend on the system on which Mercurial is\n"
+"installed. ``*.rc`` files from a single directory are read in\n"
+"alphabetical order, later ones overriding earlier ones. Where multiple\n"
+"paths are given below, settings from earlier paths override later\n"
+"ones."
+msgstr ""
+
+msgid "| (All) ``<repo>/.hg/hgrc``"
+msgstr ""
+
+msgid ""
+" Per-repository configuration options that only apply in a\n"
+" particular repository. This file is not version-controlled, and\n"
+" will not get transferred during a \"clone\" operation. Options in\n"
+" this file override options in all other configuration files. On\n"
+" Plan 9 and Unix, most of this file will be ignored if it doesn't\n"
+" belong to a trusted user or to a trusted group. See the documentation\n"
+" for the ``[trusted]`` section below for more details."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``$home/lib/hgrc``\n"
+"| (Unix) ``$HOME/.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\.hgrc``\n"
+"| (Windows) ``%USERPROFILE%\\Mercurial.ini``\n"
+"| (Windows) ``%HOME%\\.hgrc``\n"
+"| (Windows) ``%HOME%\\Mercurial.ini``"
+msgstr ""
+
+msgid ""
+" Per-user configuration file(s), for the user running Mercurial. On\n"
+" Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these\n"
+" files apply to all Mercurial commands executed by this user in any\n"
+" directory. Options in these files override per-system and per-"
+"installation\n"
+" options."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``/etc/mercurial/hgrc``\n"
+"| (Unix) ``/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-system configuration files, for the system on which Mercurial\n"
+" is running. Options in these files apply to all Mercurial commands\n"
+" executed by any user in any directory. Options in these files\n"
+" override per-installation options."
+msgstr ""
+
+msgid ""
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc``\n"
+"| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc``\n"
+"| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+" Per-installation configuration files, searched for in the\n"
+" directory where Mercurial is installed. ``<install-root>`` is the\n"
+" parent directory of the **hg** executable (or symlink) being run. For\n"
+" example, if installed in ``/shared/tools/bin/hg``, Mercurial will look\n"
+" in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply\n"
+" to all Mercurial commands executed by any user in any directory."
+msgstr ""
+
+msgid ""
+"| (Windows) ``<install-dir>\\Mercurial.ini`` **or**\n"
+"| (Windows) ``<install-dir>\\hgrc.d\\*.rc`` **or**\n"
+"| (Windows) ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial``"
+msgstr ""
+
+msgid ""
+" Per-installation/system configuration files, for the system on\n"
+" which Mercurial is running. Options in these files apply to all\n"
+" Mercurial commands executed by any user in any directory. Registry\n"
+" keys contain PATH-like strings, every part of which must reference\n"
+" a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will\n"
+" be read. Mercurial checks each of these locations in the specified\n"
+" order until one or more configuration files are detected."
+msgstr ""
+
+msgid ""
+"Syntax\n"
+"======"
+msgstr ""
+"Syntax\n"
+"======"
+
+msgid ""
+"A configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries (sometimes called\n"
+"``configuration keys``)::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+"Each line contains one entry. If the lines that follow are indented,\n"
+"they are treated as continuations of that entry. Leading whitespace is\n"
+"removed from values. Empty lines are skipped. Lines beginning with\n"
+"``#`` or ``;`` are ignored and may be used to provide comments."
+msgstr ""
+
+msgid ""
+"Configuration keys can be set multiple times, in which case Mercurial\n"
+"will use the value that was configured last. As an example::"
+msgstr ""
+
+msgid ""
+" [spam]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid "This would set the configuration key named ``eggs`` to ``small``."
+msgstr ""
+
+msgid ""
+"It is also possible to define a section multiple times. A section can\n"
+"be redefined on the same and/or on different configuration files. For\n"
+"example::"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" eggs=large\n"
+" ham=serrano\n"
+" eggs=small"
+msgstr ""
+
+msgid ""
+" [bar]\n"
+" eggs=ham\n"
+" green=\n"
+" eggs"
+msgstr ""
+
+msgid ""
+" [foo]\n"
+" ham=prosciutto\n"
+" eggs=medium\n"
+" bread=toasted"
+msgstr ""
+
+msgid ""
+"This would set the ``eggs``, ``ham``, and ``bread`` configuration keys\n"
+"of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,\n"
+"respectively. As you can see there only thing that matters is the last\n"
+"value that was set for each of the configuration keys."
+msgstr ""
+
+msgid ""
+"If a configuration key is set multiple times in different\n"
+"configuration files the final value will depend on the order in which\n"
+"the different configuration files are read, with settings from earlier\n"
+"paths overriding later ones as described on the ``Files`` section\n"
+"above."
+msgstr ""
+
+msgid ""
+"A line of the form ``%include file`` will include ``file`` into the\n"
+"current configuration file. The inclusion is recursive, which means\n"
+"that included files can include other files. Filenames are relative to\n"
+"the configuration file in which the ``%include`` directive is found.\n"
+"Environment variables and ``~user`` constructs are expanded in\n"
+"``file``. This lets you do something like::"
+msgstr ""
+
+msgid " %include ~/.hgrc.d/$HOST.rc"
+msgstr ""
+
+msgid "to include a different configuration file on each computer you use."
+msgstr ""
+
+msgid ""
+"A line with ``%unset name`` will remove ``name`` from the current\n"
+"section, if it has been set previously."
+msgstr ""
+
+msgid ""
+"The values are either free-form text strings, lists of text strings,\n"
+"or Boolean values. Boolean values can be set to true using any of \"1\",\n"
+"\"yes\", \"true\", or \"on\" and to false using \"0\", \"no\", \"false\", or "
+"\"off\"\n"
+"(all case insensitive)."
+msgstr ""
+
+msgid ""
+"List values are separated by whitespace or comma, except when values are\n"
+"placed in double quotation marks::"
+msgstr ""
+
+msgid " allow_read = \"John Doe, PhD\", brian, betty"
+msgstr ""
+
+msgid ""
+"Quotation marks can be escaped by prefixing them with a backslash. Only\n"
+"quotation marks at the beginning of a word is counted as a quotation\n"
+"(e.g., ``foo\"bar baz`` is the list of ``foo\"bar`` and ``baz``)."
+msgstr ""
+
+msgid ""
+"Sections\n"
+"========"
+msgstr ""
+"Sektioner\n"
+"========="
+
+msgid ""
+"This section describes the different sections that may appear in a\n"
+"Mercurial configuration file, the purpose of each section, its possible\n"
+"keys, and their possible values."
+msgstr ""
+
+msgid ""
+"``alias``\n"
+"---------"
+msgstr ""
+"``alias``\n"
+"---------"
+
+msgid ""
+"Defines command aliases.\n"
+"Aliases allow you to define your own commands in terms of other\n"
+"commands (or aliases), optionally including arguments. Positional\n"
+"arguments in the form of ``$1``, ``$2``, etc in the alias definition\n"
+"are expanded by Mercurial before execution. Positional arguments not\n"
+"already used by ``$N`` in the definition are put at the end of the\n"
+"command to be executed."
+msgstr ""
+
+msgid "Alias definitions consist of lines of the form::"
+msgstr ""
+
+msgid " <alias> = <command> [<argument>]..."
+msgstr ""
+
+msgid "For example, this definition::"
+msgstr ""
+
+msgid " latest = log --limit 5"
+msgstr ""
+
+msgid ""
+"creates a new command ``latest`` that shows only the five most recent\n"
+"changesets. You can define subsequent aliases using earlier ones::"
+msgstr ""
+
+msgid " stable5 = latest -b stable"
+msgstr ""
+
+msgid ""
+".. note:: It is possible to create aliases with the same names as\n"
+" existing commands, which will then override the original\n"
+" definitions. This is almost always a bad idea!"
+msgstr ""
+
+msgid ""
+"An alias can start with an exclamation point (``!``) to make it a\n"
+"shell alias. A shell alias is executed with the shell and will let you\n"
+"run arbitrary commands. As an example, ::"
+msgstr ""
+
+msgid " echo = !echo $@"
+msgstr ""
+
+msgid ""
+"will let you do ``hg echo foo`` to have ``foo`` printed in your\n"
+"terminal. A better example might be::"
+msgstr ""
+
+msgid " purge = !$HG status --no-status --unknown -0 | xargs -0 rm"
+msgstr ""
+
+msgid ""
+"which will make ``hg purge`` delete all unknown files in the\n"
+"repository in the same manner as the purge extension."
+msgstr ""
+
+msgid ""
+"Positional arguments like ``$1``, ``$2``, etc. in the alias definition\n"
+"expand to the command arguments. Unmatched arguments are\n"
+"removed. ``$0`` expands to the alias name and ``$@`` expands to all\n"
+"arguments separated by a space. These expansions happen before the\n"
+"command is passed to the shell."
+msgstr ""
+
+msgid ""
+"Shell aliases are executed in an environment where ``$HG`` expands to\n"
+"the path of the Mercurial that was used to execute the alias. This is\n"
+"useful when you want to call further Mercurial commands in a shell\n"
+"alias, as was done above for the purge alias. In addition,\n"
+"``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg\n"
+"echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``."
+msgstr ""
+
+msgid ""
+".. note:: Some global configuration options such as ``-R`` are\n"
+" processed before shell aliases and will thus not be passed to\n"
+" aliases."
+msgstr ""
+
+msgid ""
+"\n"
+"``annotate``\n"
+"------------"
+msgstr ""
+"\n"
+"``annotate``\n"
+"------------"
+
+msgid ""
+"Settings used when displaying file annotations. All values are\n"
+"Booleans and default to False. See ``diff`` section for related\n"
+"options for the diff command."
+msgstr ""
+
+msgid ""
+"``ignorews``\n"
+" Ignore white space when comparing lines."
+msgstr ""
+"``ignorews``\n"
+" Ignorera blanktecken när rader jämförs."
+
+msgid ""
+"``ignorewsamount``\n"
+" Ignore changes in the amount of white space."
+msgstr ""
+"``ignorewsamount``\n"
+" Ignorera ändringar av antalet blanktecken."
+
+msgid ""
+"``ignoreblanklines``\n"
+" Ignore changes whose lines are all blank."
+msgstr ""
+"``ignoreblanklines``\n"
+" Ignorera ändringar vars rader är tomma."
+
+msgid ""
+"\n"
+"``auth``\n"
+"--------"
+msgstr ""
+"\n"
+"``auth``\n"
+"--------"
+
+msgid ""
+"Authentication credentials for HTTP authentication. This section\n"
+"allows you to store usernames and passwords for use when logging\n"
+"*into* HTTP servers. See the ``[web]`` configuration section if\n"
+"you want to configure *who* can login to your HTTP server."
+msgstr ""
+
+msgid "Each line has the following format::"
+msgstr ""
+
+msgid " <name>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<name>`` is used to group arguments into authentication\n"
+"entries. Example::"
+msgstr ""
+
+msgid ""
+" foo.prefix = hg.intevation.org/mercurial\n"
+" foo.username = foo\n"
+" foo.password = bar\n"
+" foo.schemes = http https"
+msgstr ""
+
+msgid ""
+" bar.prefix = secure.example.org\n"
+" bar.key = path/to/file.key\n"
+" bar.cert = path/to/file.cert\n"
+" bar.schemes = https"
+msgstr ""
+
+msgid "Supported arguments:"
+msgstr ""
+
+msgid ""
+"``prefix``\n"
+" Either ``*`` or a URI prefix with or without the scheme part.\n"
+" The authentication entry with the longest matching prefix is used\n"
+" (where ``*`` matches everything and counts as a match of length\n"
+" 1). If the prefix doesn't include a scheme, the match is performed\n"
+" against the URI with its scheme stripped as well, and the schemes\n"
+" argument, q.v., is then subsequently consulted."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. Username to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user will\n"
+" be prompted for it. Environment variables are expanded in the\n"
+" username letting you do ``foo.username = $USER``. If the URI\n"
+" includes a username, only ``[auth]`` entries with a matching\n"
+" username or without a username will be considered."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password to authenticate with. If not given, and the\n"
+" remote site requires basic or digest authentication, the user\n"
+" will be prompted for it."
+msgstr ""
+
+msgid ""
+"``key``\n"
+" Optional. PEM encoded client certificate key file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``cert``\n"
+" Optional. PEM encoded client certificate chain file. Environment\n"
+" variables are expanded in the filename."
+msgstr ""
+
+msgid ""
+"``schemes``\n"
+" Optional. Space separated list of URI schemes to use this\n"
+" authentication entry with. Only used if the prefix doesn't include\n"
+" a scheme. Supported schemes are http and https. They will match\n"
+" static-http and static-https respectively, as well.\n"
+" Default: https."
+msgstr ""
+
+msgid ""
+"If no suitable authentication entry is found, the user is prompted\n"
+"for credentials as usual if required by the remote."
+msgstr ""
+
+msgid ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+msgstr ""
+"\n"
+"``decode/encode``\n"
+"-----------------"
+
+msgid ""
+"Filters for transforming files on checkout/checkin. This would\n"
+"typically be used for newline processing or other\n"
+"localization/canonicalization of files."
+msgstr ""
+
+msgid ""
+"Filters consist of a filter pattern followed by a filter command.\n"
+"Filter patterns are globs by default, rooted at the repository root.\n"
+"For example, to match any file ending in ``.txt`` in the root\n"
+"directory only, use the pattern ``*.txt``. To match any file ending\n"
+"in ``.c`` anywhere in the repository, use the pattern ``**.c``.\n"
+"For each file only the first matching filter applies."
+msgstr ""
+
+msgid ""
+"The filter command can start with a specifier, either ``pipe:`` or\n"
+"``tempfile:``. If no specifier is given, ``pipe:`` is used by default."
+msgstr ""
+
+msgid ""
+"A ``pipe:`` command must accept data on stdin and return the transformed\n"
+"data on stdout."
+msgstr ""
+
+msgid "Pipe example::"
+msgstr "Pipe-exempel::"
+
+msgid ""
+" [encode]\n"
+" # uncompress gzip files on checkin to improve delta compression\n"
+" # note: not necessarily a good idea, just an example\n"
+" *.gz = pipe: gunzip"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" # recompress gzip files when writing them to the working dir (we\n"
+" # can safely omit \"pipe:\", because it's the default)\n"
+" *.gz = gzip"
+msgstr ""
+
+msgid ""
+"A ``tempfile:`` command is a template. The string ``INFILE`` is replaced\n"
+"with the name of a temporary file that contains the data to be\n"
+"filtered by the command. The string ``OUTFILE`` is replaced with the name\n"
+"of an empty temporary file, where the filtered data must be written by\n"
+"the command."
+msgstr ""
+
+msgid ""
+".. note:: The tempfile mechanism is recommended for Windows systems,\n"
+" where the standard shell I/O redirection operators often have\n"
+" strange effects and may corrupt the contents of your files."
+msgstr ""
+
+msgid ""
+"This filter mechanism is used internally by the ``eol`` extension to\n"
+"translate line ending characters between Windows (CRLF) and Unix (LF)\n"
+"format. We suggest you use the ``eol`` extension for convenience."
+msgstr ""
+
+msgid ""
+"\n"
+"``defaults``\n"
+"------------"
+msgstr ""
+"\n"
+"``defaults``\n"
+"------------"
+
+msgid "(defaults are deprecated. Don't use them. Use aliases instead)"
+msgstr ""
+
+msgid ""
+"Use the ``[defaults]`` section to define command defaults, i.e. the\n"
+"default options/arguments to pass to the specified commands."
+msgstr ""
+
+msgid ""
+"The following example makes :hg:`log` run in verbose mode, and\n"
+":hg:`status` show only the modified files, by default::"
+msgstr ""
+
+msgid ""
+" [defaults]\n"
+" log = -v\n"
+" status = -m"
+msgstr ""
+
+msgid ""
+"The actual commands, instead of their aliases, must be used when\n"
+"defining command defaults. The command defaults will also be applied\n"
+"to the aliases of the commands defined."
+msgstr ""
+
+msgid ""
+"\n"
+"``diff``\n"
+"--------"
+msgstr ""
+"\n"
+"``diff``\n"
+"--------"
+
+msgid ""
+"Settings used when displaying diffs. Everything except for ``unified``\n"
+"is a Boolean and defaults to False. See ``annotate`` section for\n"
+"related options for the annotate command."
+msgstr ""
+
+msgid ""
+"``git``\n"
+" Use git extended diff format."
+msgstr ""
+"``git``\n"
+" Använd gits utökade diff-format."
+
+msgid ""
+"``nodates``\n"
+" Don't include dates in diff headers."
+msgstr ""
+
+msgid ""
+"``showfunc``\n"
+" Show which function each change is in."
+msgstr ""
+"``showfunc``\n"
+" Visa vilken funktion varje ändring är i."
+
+msgid ""
+"``unified``\n"
+" Number of lines of context to show."
+msgstr ""
+"``unified``\n"
+"Antal sammanhangsrader att visa."
+
+msgid ""
+"``email``\n"
+"---------"
+msgstr ""
+"``email``\n"
+"---------"
+
+msgid "Settings for extensions that send email messages."
+msgstr ""
+
+msgid ""
+"``from``\n"
+" Optional. Email address to use in \"From\" header and SMTP envelope\n"
+" of outgoing messages."
+msgstr ""
+
+msgid ""
+"``to``\n"
+" Optional. Comma-separated list of recipients' email addresses."
+msgstr ""
+
+msgid ""
+"``cc``\n"
+" Optional. Comma-separated list of carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``bcc``\n"
+" Optional. Comma-separated list of blind carbon copy recipients'\n"
+" email addresses."
+msgstr ""
+
+msgid ""
+"``method``\n"
+" Optional. Method to use to send email messages. If value is ``smtp``\n"
+" (default), use SMTP (see the ``[smtp]`` section for configuration).\n"
+" Otherwise, use as name of program to run that acts like sendmail\n"
+" (takes ``-f`` option for sender, list of recipients on command line,\n"
+" message on stdin). Normally, setting this to ``sendmail`` or\n"
+" ``/usr/sbin/sendmail`` is enough to use sendmail to send messages."
+msgstr ""
+
+msgid ""
+"``charsets``\n"
+" Optional. Comma-separated list of character sets considered\n"
+" convenient for recipients. Addresses, headers, and parts not\n"
+" containing patches of outgoing messages will be encoded in the\n"
+" first character set to which conversion from local encoding\n"
+" (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct\n"
+" conversion fails, the text in question is sent as is. Defaults to\n"
+" empty (explicit) list."
+msgstr ""
+
+msgid " Order of outgoing email character sets:"
+msgstr ""
+
+msgid ""
+" 1. ``us-ascii``: always first, regardless of settings\n"
+" 2. ``email.charsets``: in order given by user\n"
+" 3. ``ui.fallbackencoding``: if not in email.charsets\n"
+" 4. ``$HGENCODING``: if not in email.charsets\n"
+" 5. ``utf-8``: always last, regardless of settings"
+msgstr ""
+
+msgid "Email example::"
+msgstr "Email-exempel::"
+
+msgid ""
+" [email]\n"
+" from = Joseph User <joe.user@example.com>\n"
+" method = /usr/sbin/sendmail\n"
+" # charsets for western Europeans\n"
+" # us-ascii, utf-8 omitted, as they are tried first and last\n"
+" charsets = iso-8859-1, iso-8859-15, windows-1252"
+msgstr ""
+
+msgid ""
+"\n"
+"``extensions``\n"
+"--------------"
+msgstr ""
+"\n"
+"``extensions``\n"
+"--------------"
+
+msgid ""
+"Mercurial has an extension mechanism for adding new features. To\n"
+"enable an extension, create an entry for it in this section."
+msgstr ""
+
+msgid ""
+"If you know that the extension is already in Python's search path,\n"
+"you can give the name of the module, followed by ``=``, with nothing\n"
+"after the ``=``."
+msgstr ""
+
+msgid ""
+"Otherwise, give a name that you choose, followed by ``=``, followed by\n"
+"the path to the ``.py`` file (including the file name extension) that\n"
+"defines the extension."
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension that is enabled in an hgrc of\n"
+"broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``\n"
+"or ``foo = !`` when path is not supplied."
+msgstr ""
+"För att explicit deaktivera en utökning som aktiverats i en\n"
+"konfigurationsfil med större omfång, börja dess sökväg med ``!``, som i\n"
+"``foo = !/ext/path`` eller ``foo = !`` när sökvägen inte anges."
+
+msgid "Example for ``~/.hgrc``::"
+msgstr "Exempel för ``~/.hgrc``::"
+
+msgid ""
+" [extensions]\n"
+" # (the mq extension will get loaded from Mercurial's path)\n"
+" mq =\n"
+" # (this extension will get loaded from the file specified)\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"\n"
+"``format``\n"
+"----------"
+msgstr ""
+"\n"
+"``format``\n"
+"----------"
+
+msgid ""
+"``usestore``\n"
+" Enable or disable the \"store\" repository format which improves\n"
+" compatibility with systems that fold case or otherwise mangle\n"
+" filenames. Enabled by default. Disabling this option will allow\n"
+" you to store longer filenames in some situations at the expense of\n"
+" compatibility and ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 0.9.4."
+msgstr ""
+
+msgid ""
+"``usefncache``\n"
+" Enable or disable the \"fncache\" repository format which enhances\n"
+" the \"store\" repository format (which has to be enabled to use\n"
+" fncache) to allow longer filenames and avoids using Windows\n"
+" reserved names, e.g. \"nul\". Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.1."
+msgstr ""
+
+msgid ""
+"``dotencode``\n"
+" Enable or disable the \"dotencode\" repository format which enhances\n"
+" the \"fncache\" repository format (which has to be enabled to use\n"
+" dotencode) to avoid issues with filenames starting with ._ on\n"
+" Mac OS X and spaces on Windows. Enabled by default. Disabling this\n"
+" option ensures that the on-disk format of newly created\n"
+" repositories will be compatible with Mercurial before version 1.7."
+msgstr ""
+
+msgid ""
+"``graph``\n"
+"---------"
+msgstr ""
+"``graph``\n"
+"---------"
+
+msgid ""
+"Web graph view configuration. This section let you change graph\n"
+"elements display properties by branches, for instance to make the\n"
+"``default`` branch stand out."
+msgstr ""
+
+msgid " <branch>.<argument> = <value>"
+msgstr ""
+
+msgid ""
+"where ``<branch>`` is the name of the branch being\n"
+"customized. Example::"
+msgstr ""
+
+msgid ""
+" [graph]\n"
+" # 2px width\n"
+" default.width = 2\n"
+" # red color\n"
+" default.color = FF0000"
+msgstr ""
+
+msgid ""
+"``width``\n"
+" Set branch edges width in pixels."
+msgstr ""
+
+msgid ""
+"``color``\n"
+" Set branch edges color in hexadecimal RGB notation."
+msgstr ""
+
+msgid ""
+"``hooks``\n"
+"---------"
+msgstr ""
+"``hooks``\n"
+"---------"
+
+msgid ""
+"Commands or Python functions that get automatically executed by\n"
+"various actions such as starting or finishing a commit. Multiple\n"
+"hooks can be run for the same action by appending a suffix to the\n"
+"action. Overriding a site-wide hook can be done by changing its\n"
+"value or setting it to an empty string. Hooks can be prioritized\n"
+"by adding a prefix of ``priority`` to the hook name on a new line\n"
+"and setting the priority. The default priority is 0 if\n"
+"not specified."
+msgstr ""
+
+msgid "Example ``.hg/hgrc``::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # update working directory after adding changesets\n"
+" changegroup.update = hg update\n"
+" # do not use the site-wide hook\n"
+" incoming =\n"
+" incoming.email = /my/email/hook\n"
+" incoming.autobuild = /my/build/hook\n"
+" # force autobuild hook to run before other incoming hooks\n"
+" priority.incoming.autobuild = 1"
+msgstr ""
+
+msgid ""
+"Most hooks are run with environment variables set that give useful\n"
+"additional information. For each hook below, the environment\n"
+"variables it is passed are listed with names of the form ``$HG_foo``."
+msgstr ""
+
+msgid ""
+"``changegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle.\n"
+" ID of the first new changeset is in ``$HG_NODE``. URL from which\n"
+" changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``commit``\n"
+" Run after a changeset has been created in the local repository. ID\n"
+" of the newly created changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``incoming``\n"
+" Run after a changeset has been pulled, pushed, or unbundled into\n"
+" the local repository. The ID of the newly arrived changeset is in\n"
+" ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``outgoing``\n"
+" Run after sending changes from local repository to another. ID of\n"
+" first changeset sent is in ``$HG_NODE``. Source of operation is in\n"
+" ``$HG_SOURCE``; see \"preoutgoing\" hook for description."
+msgstr ""
+
+msgid ""
+"``post-<command>``\n"
+" Run after successful invocations of the associated command. The\n"
+" contents of the command line are passed as ``$HG_ARGS`` and the result\n"
+" code in ``$HG_RESULT``. Parsed command line arguments are passed as \n"
+" ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of\n"
+" the python data internally passed to <command>. ``$HG_OPTS`` is a \n"
+" dictionary of options (with unspecified options set to their defaults).\n"
+" ``$HG_PATS`` is a list of arguments. Hook failure is ignored."
+msgstr ""
+
+msgid ""
+"``pre-<command>``\n"
+" Run before executing the associated command. The contents of the\n"
+" command line are passed as ``$HG_ARGS``. Parsed command line arguments\n"
+" are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string\n"
+" representations of the data internally passed to <command>. ``$HG_OPTS``\n"
+" is a dictionary of options (with unspecified options set to their\n"
+" defaults). ``$HG_PATS`` is a list of arguments. If the hook returns \n"
+" failure, the command doesn't execute and Mercurial returns the failure\n"
+" code."
+msgstr ""
+
+msgid ""
+"``prechangegroup``\n"
+" Run before a changegroup is added via push, pull or unbundle. Exit\n"
+" status 0 allows the changegroup to proceed. Non-zero status will\n"
+" cause the push, pull or unbundle to fail. URL from which changes\n"
+" will come is in ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``precommit``\n"
+" Run before starting a local commit. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the commit to fail.\n"
+" Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``prelistkeys``\n"
+" Run before listing pushkeys (like bookmarks) in the\n"
+" repository. Non-zero status will cause failure. The key namespace is\n"
+" in ``$HG_NAMESPACE``."
+msgstr ""
+
+msgid ""
+"``preoutgoing``\n"
+" Run before collecting changes to send from the local repository to\n"
+" another. Non-zero status will cause failure. This lets you prevent\n"
+" pull over HTTP or SSH. Also prevents against local pull, push\n"
+" (outbound) or bundle commands, but not effective, since you can\n"
+" just copy files instead then. Source of operation is in\n"
+" ``$HG_SOURCE``. If \"serve\", operation is happening on behalf of remote\n"
+" SSH or HTTP repository. If \"push\", \"pull\" or \"bundle\", operation\n"
+" is happening on behalf of repository on same system."
+msgstr ""
+
+msgid ""
+"``prepushkey``\n"
+" Run before a pushkey (like a bookmark) is added to the\n"
+" repository. Non-zero status will cause the key to be rejected. The\n"
+" key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,\n"
+" the old value (if any) is in ``$HG_OLD``, and the new value is in\n"
+" ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``pretag``\n"
+" Run before creating a tag. Exit status 0 allows the tag to be\n"
+" created. Non-zero status will cause the tag to fail. ID of\n"
+" changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag "
+"is\n"
+" local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``pretxnchangegroup``\n"
+" Run after a changegroup has been added via push, pull or unbundle,\n"
+" but before the transaction has been committed. Changegroup is\n"
+" visible to hook program. This lets you validate incoming changes\n"
+" before accepting them. Passed the ID of the first new changeset in\n"
+" ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero\n"
+" status will cause the transaction to be rolled back and the push,\n"
+" pull or unbundle will fail. URL that was source of changes is in\n"
+" ``$HG_URL``."
+msgstr ""
+
+msgid ""
+"``pretxncommit``\n"
+" Run after a changeset has been created but the transaction not yet\n"
+" committed. Changeset is visible to hook program. This lets you\n"
+" validate commit message and changes. Exit status 0 allows the\n"
+" commit to proceed. Non-zero status will cause the transaction to\n"
+" be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset\n"
+" IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``preupdate``\n"
+" Run before updating the working directory. Exit status 0 allows\n"
+" the update to proceed. Non-zero status will prevent the update.\n"
+" Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID\n"
+" of second new parent is in ``$HG_PARENT2``."
+msgstr ""
+
+msgid ""
+"``listkeys``\n"
+" Run after listing pushkeys (like bookmarks) in the repository. The\n"
+" key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a\n"
+" dictionary containing the keys and values."
+msgstr ""
+
+msgid ""
+"``pushkey``\n"
+" Run after a pushkey (like a bookmark) is added to the\n"
+" repository. The key namespace is in ``$HG_NAMESPACE``, the key is in\n"
+" ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new\n"
+" value is in ``$HG_NEW``."
+msgstr ""
+
+msgid ""
+"``tag``\n"
+" Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.\n"
+" Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in\n"
+" repository if ``$HG_LOCAL=0``."
+msgstr ""
+
+msgid ""
+"``update``\n"
+" Run after updating the working directory. Changeset ID of first\n"
+" new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is\n"
+" in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the\n"
+" update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``."
+msgstr ""
+
+msgid ""
+".. note:: It is generally better to use standard hooks rather than the\n"
+" generic pre- and post- command hooks as they are guaranteed to be\n"
+" called in the appropriate contexts for influencing transactions.\n"
+" Also, hooks like \"commit\" will be called in all contexts that\n"
+" generate a commit (e.g. tag) and not just the commit command."
+msgstr ""
+
+msgid ""
+".. note:: Environment variables with empty values may not be passed to\n"
+" hooks on platforms such as Windows. As an example, ``$HG_PARENT2``\n"
+" will have an empty value under Unix-like platforms for non-merge\n"
+" changesets, while it will not be available at all under Windows."
+msgstr ""
+
+msgid "The syntax for Python hooks is as follows::"
+msgstr ""
+
+msgid ""
+" hookname = python:modulename.submodule.callable\n"
+" hookname = python:/path/to/python/module.py:callable"
+msgstr ""
+
+msgid ""
+"Python hooks are run within the Mercurial process. Each hook is\n"
+"called with at least three keyword arguments: a ui object (keyword\n"
+"``ui``), a repository object (keyword ``repo``), and a ``hooktype``\n"
+"keyword that tells what kind of hook is used. Arguments listed as\n"
+"environment variables above are passed as keyword arguments, with no\n"
+"``HG_`` prefix, and names in lower case."
+msgstr ""
+
+msgid ""
+"If a Python hook returns a \"true\" value or raises an exception, this\n"
+"is treated as a failure."
+msgstr ""
+
+msgid ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+msgstr ""
+"\n"
+"``hostfingerprints``\n"
+"--------------------"
+
+msgid ""
+"Fingerprints of the certificates of known HTTPS servers.\n"
+"A HTTPS connection to a server with a fingerprint configured here will\n"
+"only succeed if the servers certificate matches the fingerprint.\n"
+"This is very similar to how ssh known hosts works.\n"
+"The fingerprint is the SHA-1 hash value of the DER encoded certificate.\n"
+"The CA chain and web.cacerts is not used for servers with a fingerprint."
+msgstr ""
+
+msgid "For example::"
+msgstr "Exempelvis::"
+
+msgid ""
+" [hostfingerprints]\n"
+" hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:"
+"d6:4b:ee:cc"
+msgstr ""
+
+msgid "This feature is only supported when using Python 2.6 or later."
+msgstr ""
+
+msgid ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+msgstr ""
+"\n"
+"``http_proxy``\n"
+"--------------"
+
+msgid ""
+"Used to access web-based Mercurial repositories through a HTTP\n"
+"proxy."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name and (optional) port of the proxy server, for example\n"
+" \"myproxy:8000\"."
+msgstr ""
+
+msgid ""
+"``no``\n"
+" Optional. Comma-separated list of host names that should bypass\n"
+" the proxy."
+msgstr ""
+
+msgid ""
+"``passwd``\n"
+" Optional. Password to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``user``\n"
+" Optional. User name to authenticate with at the proxy server."
+msgstr ""
+
+msgid ""
+"``always``\n"
+" Optional. Always use the proxy, even for localhost and any entries\n"
+" in ``http_proxy.no``. True or False. Default: False."
+msgstr ""
+
+msgid ""
+"``merge-patterns``\n"
+"------------------"
+msgstr ""
+"``merge-patterns``\n"
+"------------------"
+
+msgid ""
+"This section specifies merge tools to associate with particular file\n"
+"patterns. Tools matched here will take precedence over the default\n"
+"merge tool. Patterns are globs by default, rooted at the repository\n"
+"root."
+msgstr ""
+
+msgid ""
+" [merge-patterns]\n"
+" **.c = kdiff3\n"
+" **.jpg = myimgmerge"
+msgstr ""
+
+msgid ""
+"``merge-tools``\n"
+"---------------"
+msgstr ""
+"``merge-tools``\n"
+"---------------"
+
+msgid ""
+"This section configures external merge tools to use for file-level\n"
+"merges."
+msgstr ""
+
+msgid "Example ``~/.hgrc``::"
+msgstr ""
+
+msgid ""
+" [merge-tools]\n"
+" # Override stock tool location\n"
+" kdiff3.executable = ~/bin/kdiff3\n"
+" # Specify command line\n"
+" kdiff3.args = $base $local $other -o $output\n"
+" # Give higher priority\n"
+" kdiff3.priority = 1"
+msgstr ""
+
+msgid ""
+" # Define new tool\n"
+" myHtmlTool.args = -m $local $other $base $output\n"
+" myHtmlTool.regkey = Software\\FooSoftware\\HtmlMerge\n"
+" myHtmlTool.priority = 1"
+msgstr ""
+
+msgid ""
+"``priority``\n"
+" The priority in which to evaluate this tool.\n"
+" Default: 0."
+msgstr ""
+
+msgid ""
+"``executable``\n"
+" Either just the name of the executable or its pathname. On Windows,\n"
+" the path can use environment variables with ${ProgramFiles} syntax.\n"
+" Default: the tool name."
+msgstr ""
+
+msgid ""
+"``args``\n"
+" The arguments to pass to the tool executable. You can refer to the\n"
+" files being merged as well as the output file through these\n"
+" variables: ``$base``, ``$local``, ``$other``, ``$output``.\n"
+" Default: ``$local $base $other``"
+msgstr ""
+
+msgid ""
+"``premerge``\n"
+" Attempt to run internal non-interactive 3-way merge tool before\n"
+" launching external tool. Options are ``true``, ``false``, or ``keep``\n"
+" to leave markers in the file if the premerge fails.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``binary``\n"
+" This tool can merge binary files. Defaults to False, unless tool\n"
+" was selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``symlink``\n"
+" This tool can merge symlinks. Defaults to False, even if tool was\n"
+" selected by file pattern match."
+msgstr ""
+
+msgid ""
+"``check``\n"
+" A list of merge success-checking options:"
+msgstr ""
+
+msgid ""
+" ``changed``\n"
+" Ask whether merge was successful when the merged file shows no changes.\n"
+" ``conflicts``\n"
+" Check whether there are conflicts even though the tool reported "
+"success.\n"
+" ``prompt``\n"
+" Always prompt for merge success, regardless of success reported by tool."
+msgstr ""
+
+msgid ""
+"``checkchanged``\n"
+" True is equivalent to ``check = changed``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``checkconflicts``\n"
+" True is equivalent to ``check = conflicts``.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``fixeol``\n"
+" Attempt to fix up EOL changes caused by the merge tool.\n"
+" Default: False"
+msgstr ""
+
+msgid ""
+"``gui``\n"
+" This tool requires a graphical interface to run. Default: False"
+msgstr ""
+
+msgid ""
+"``regkey``\n"
+" Windows registry key which describes install location of this\n"
+" tool. Mercurial will search for this key first under\n"
+" ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regkeyalt``\n"
+" An alternate Windows registry key to try if the first key is not\n"
+" found. The alternate key uses the same ``regname`` and ``regappend``\n"
+" semantics of the primary key. The most common use for this key\n"
+" is to search for 32bit applications on 64bit operating systems.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"``regname``\n"
+" Name of value to read from specified registry key. Defaults to the\n"
+" unnamed (default) value."
+msgstr ""
+
+msgid ""
+"``regappend``\n"
+" String to append to the value read from the registry, typically\n"
+" the executable name of the tool.\n"
+" Default: None"
+msgstr ""
+
+msgid ""
+"\n"
+"``patch``\n"
+"---------"
+msgstr ""
+"\n"
+"``patch``\n"
+"---------"
+
+msgid ""
+"Settings used when applying patches, for instance through the 'import'\n"
+"command or with Mercurial Queues extension."
+msgstr ""
+
+msgid ""
+"``eol``\n"
+" When set to 'strict' patch content and patched files end of lines\n"
+" are preserved. When set to ``lf`` or ``crlf``, both files end of\n"
+" lines are ignored when patching and the result line endings are\n"
+" normalized to either LF (Unix) or CRLF (Windows). When set to\n"
+" ``auto``, end of lines are again ignored while patching but line\n"
+" endings in patched files are normalized to their original setting\n"
+" on a per-file basis. If target file does not exist or has no end\n"
+" of line, patch line endings are preserved.\n"
+" Default: strict."
+msgstr ""
+
+msgid ""
+"\n"
+"``paths``\n"
+"---------"
+msgstr ""
+"\n"
+"``paths``\n"
+"---------"
+
+msgid ""
+"Assigns symbolic names to repositories. The left side is the\n"
+"symbolic name, and the right gives the directory or URL that is the\n"
+"location of the repository. Default paths can be declared by setting\n"
+"the following entries."
+msgstr ""
+
+msgid ""
+"``default``\n"
+" Directory or URL to use when pulling if no source is specified.\n"
+" Default is set to repository from which the current repository was\n"
+" cloned."
+msgstr ""
+
+msgid ""
+"``default-push``\n"
+" Optional. Directory or URL to use when pushing if no destination\n"
+" is specified."
+msgstr ""
+
+msgid ""
+"``phases``\n"
+"----------"
+msgstr ""
+"``phases``\n"
+"----------"
+
+msgid ""
+"Specifies default handling of phases. See :hg:`help phases` for more\n"
+"information about working with phases."
+msgstr ""
+
+msgid ""
+"``publish``\n"
+" Controls draft phase behavior when working as a server. When true,\n"
+" pushed changesets are set to public in both client and server and\n"
+" pulled or cloned changesets are set to public in the client.\n"
+" Default: True"
+msgstr ""
+
+msgid ""
+"``new-commit``\n"
+" Phase of newly-created commits.\n"
+" Default: draft"
+msgstr ""
+
+msgid ""
+"``profiling``\n"
+"-------------"
+msgstr ""
+"``profiling``\n"
+"-------------"
+
+msgid ""
+"Specifies profiling type, format, and file output. Two profilers are\n"
+"supported: an instrumenting profiler (named ``ls``), and a sampling\n"
+"profiler (named ``stat``)."
+msgstr ""
+
+msgid ""
+"In this section description, 'profiling data' stands for the raw data\n"
+"collected during profiling, while 'profiling report' stands for a\n"
+"statistical text report generated from the profiling data. The\n"
+"profiling is done using lsprof."
+msgstr ""
+
+msgid ""
+"``type``\n"
+" The type of profiler to use.\n"
+" Default: ls."
+msgstr ""
+
+msgid ""
+" ``ls``\n"
+" Use Python's built-in instrumenting profiler. This profiler\n"
+" works on all platforms, but each line number it reports is the\n"
+" first line of a function. This restriction makes it difficult to\n"
+" identify the expensive parts of a non-trivial function.\n"
+" ``stat``\n"
+" Use a third-party statistical profiler, statprof. This profiler\n"
+" currently runs only on Unix systems, and is most useful for\n"
+" profiling commands that run for longer than about 0.1 seconds."
+msgstr ""
+
+msgid ""
+"``format``\n"
+" Profiling format. Specific to the ``ls`` instrumenting profiler.\n"
+" Default: text."
+msgstr ""
+
+msgid ""
+" ``text``\n"
+" Generate a profiling report. When saving to a file, it should be\n"
+" noted that only the report is saved, and the profiling data is\n"
+" not kept.\n"
+" ``kcachegrind``\n"
+" Format profiling data for kcachegrind use: when saving to a\n"
+" file, the generated file can directly be loaded into\n"
+" kcachegrind."
+msgstr ""
+
+msgid ""
+"``frequency``\n"
+" Sampling frequency. Specific to the ``stat`` sampling profiler.\n"
+" Default: 1000."
+msgstr ""
+
+msgid ""
+"``output``\n"
+" File path where profiling data or report should be saved. If the\n"
+" file exists, it is replaced. Default: None, data is printed on\n"
+" stderr"
+msgstr ""
+
+msgid ""
+"``revsetalias``\n"
+"---------------"
+msgstr ""
+"``revsetalias``\n"
+"---------------"
+
+msgid "Alias definitions for revsets. See :hg:`help revsets` for details."
+msgstr ""
+
+msgid ""
+"``server``\n"
+"----------"
+msgstr ""
+"``server``\n"
+"----------"
+
+msgid "Controls generic server settings."
+msgstr ""
+
+msgid ""
+"``uncompressed``\n"
+" Whether to allow clients to clone a repository using the\n"
+" uncompressed streaming protocol. This transfers about 40% more\n"
+" data than a regular clone, but uses less memory and CPU on both\n"
+" server and client. Over a LAN (100 Mbps or better) or a very fast\n"
+" WAN, an uncompressed streaming clone is a lot faster (~10x) than a\n"
+" regular clone. Over most WAN connections (anything slower than\n"
+" about 6 Mbps), uncompressed streaming is slower, because of the\n"
+" extra data transfer overhead. This mode will also temporarily hold\n"
+" the write lock while determining what data to transfer.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``preferuncompressed``\n"
+" When set, clients will try to use the uncompressed streaming\n"
+" protocol. Default is False."
+msgstr ""
+
+msgid ""
+"``validate``\n"
+" Whether to validate the completeness of pushed changesets by\n"
+" checking that all new file revisions specified in manifests are\n"
+" present. Default is False."
+msgstr ""
+
+msgid ""
+"``smtp``\n"
+"--------"
+msgstr ""
+"``smtp``\n"
+"--------"
+
+msgid "Configuration for extensions that need to send email messages."
+msgstr ""
+
+msgid ""
+"``host``\n"
+" Host name of mail server, e.g. \"mail.example.com\"."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Optional. Port to connect to on mail server. Default: 25."
+msgstr ""
+
+msgid ""
+"``tls``\n"
+" Optional. Method to enable TLS when connecting to mail server: "
+"starttls,\n"
+" smtps or none. Default: none."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" Optional. User name for authenticating with the SMTP server.\n"
+" Default: none."
+msgstr ""
+
+msgid ""
+"``password``\n"
+" Optional. Password for authenticating with the SMTP server. If not\n"
+" specified, interactive sessions will prompt the user for a\n"
+" password; non-interactive sessions will fail. Default: none."
+msgstr ""
+
+msgid ""
+"``local_hostname``\n"
+" Optional. It's the hostname that the sender can use to identify\n"
+" itself to the MTA."
+msgstr ""
+
+msgid ""
+"\n"
+"``subpaths``\n"
+"------------"
+msgstr ""
+"\n"
+"``subpaths``\n"
+"------------"
+
+msgid ""
+"Subrepository source URLs can go stale if a remote server changes name\n"
+"or becomes temporarily unavailable. This section lets you define\n"
+"rewrite rules of the form::"
+msgstr ""
+
+msgid " <pattern> = <replacement>"
+msgstr ""
+
+msgid ""
+"where ``pattern`` is a regular expression matching a subrepository\n"
+"source URL and ``replacement`` is the replacement string used to\n"
+"rewrite it. Groups can be matched in ``pattern`` and referenced in\n"
+"``replacements``. For instance::"
+msgstr ""
+
+msgid " http://server/(.*)-hg/ = http://hg.server/\\1/"
+msgstr ""
+
+msgid "rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``."
+msgstr ""
+
+msgid ""
+"Relative subrepository paths are first made absolute, and the\n"
+"rewrite rules are then applied on the full (absolute) path. The rules\n"
+"are applied in definition order."
+msgstr ""
+
+msgid ""
+"``trusted``\n"
+"-----------"
+msgstr ""
+"``trusted``\n"
+"-----------"
+
+msgid ""
+"Mercurial will not use the settings in the\n"
+"``.hg/hgrc`` file from a repository if it doesn't belong to a trusted\n"
+"user or to a trusted group, as various hgrc features allow arbitrary\n"
+"commands to be run. This issue is often encountered when configuring\n"
+"hooks or extensions for shared repositories or servers. However,\n"
+"the web interface will use some safe settings from the ``[web]``\n"
+"section."
+msgstr ""
+
+msgid ""
+"This section specifies what users and groups are trusted. The\n"
+"current user is always trusted. To trust everybody, list a user or a\n"
+"group with name ``*``. These settings must be placed in an\n"
+"*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the\n"
+"user or service running Mercurial."
+msgstr ""
+
+msgid ""
+"``users``\n"
+" Comma-separated list of trusted users."
+msgstr ""
+
+msgid ""
+"``groups``\n"
+" Comma-separated list of trusted groups."
+msgstr ""
+
+msgid ""
+"\n"
+"``ui``\n"
+"------"
+msgstr ""
+"\n"
+"``ui``\n"
+"------"
+
+msgid "User interface controls."
+msgstr ""
+
+msgid ""
+"``archivemeta``\n"
+" Whether to include the .hg_archival.txt file containing meta data\n"
+" (hashes for the repository base and for tip) in archives created\n"
+" by the :hg:`archive` command or downloaded via hgweb.\n"
+" Default is True."
+msgstr ""
+
+msgid ""
+"``askusername``\n"
+" Whether to prompt for a username when committing. If True, and\n"
+" neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user "
+"will\n"
+" be prompted to enter a username. If no username is entered, the\n"
+" default ``USER@HOST`` is used instead.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``commitsubrepos``\n"
+" Whether to commit modified subrepositories when committing the\n"
+" parent repository. If False and one subrepository has uncommitted\n"
+" changes, abort the commit.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``debug``\n"
+" Print debugging information. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``editor``\n"
+" The editor to use during a commit. Default is ``$EDITOR`` or ``vi``."
+msgstr ""
+
+msgid ""
+"``fallbackencoding``\n"
+" Encoding to try if it's not possible to decode the changelog using\n"
+" UTF-8. Default is ISO-8859-1."
+msgstr ""
+
+msgid ""
+"``ignore``\n"
+" A file to read per-user ignore patterns from. This file should be\n"
+" in the same format as a repository-wide .hgignore file. This\n"
+" option supports hook syntax, so if you want to specify multiple\n"
+" ignore files, you can do so by setting something like\n"
+" ``ignore.other = ~/.hgignore2``. For details of the ignore file\n"
+" format, see the ``hgignore(5)`` man page."
+msgstr ""
+
+msgid ""
+"``interactive``\n"
+" Allow to prompt the user. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``logtemplate``\n"
+" Template string for commands that print changesets."
+msgstr ""
+
+msgid ""
+"``merge``\n"
+" The conflict resolution program to use during a manual merge.\n"
+" For more information on merge tools see :hg:`help merge-tools`.\n"
+" For configuring merge tools see the ``[merge-tools]`` section."
+msgstr ""
+
+msgid ""
+"``portablefilenames``\n"
+" Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.\n"
+" Default is ``warn``.\n"
+" If set to ``warn`` (or ``true``), a warning message is printed on POSIX\n"
+" platforms, if a file with a non-portable filename is added (e.g. a file\n"
+" with a name that can't be created on Windows because it contains "
+"reserved\n"
+" parts like ``AUX``, reserved characters like ``:``, or would cause a "
+"case\n"
+" collision with an existing file).\n"
+" If set to ``ignore`` (or ``false``), no warning is printed.\n"
+" If set to ``abort``, the command is aborted.\n"
+" On Windows, this configuration option is ignored and the command aborted."
+msgstr ""
+
+msgid ""
+"``quiet``\n"
+" Reduce the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``remotecmd``\n"
+" remote command to use for clone/push/pull operations. Default is ``hg``."
+msgstr ""
+
+msgid ""
+"``reportoldssl``\n"
+" Warn if an SSL certificate is unable to be due to using Python\n"
+" 2.5 or earlier. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``report_untrusted``\n"
+" Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a\n"
+" trusted user or group. True or False. Default is True."
+msgstr ""
+
+msgid ""
+"``slash``\n"
+" Display paths using a slash (``/``) as the path separator. This\n"
+" only makes a difference on systems where the default path\n"
+" separator is not the slash character (e.g. Windows uses the\n"
+" backslash character (``\\``)).\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ssh``\n"
+" command to use for SSH connections. Default is ``ssh``."
+msgstr ""
+
+msgid ""
+"``strict``\n"
+" Require exact command names, instead of allowing unambiguous\n"
+" abbreviations. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Name of style to use for command output."
+msgstr ""
+
+msgid ""
+"``timeout``\n"
+" The timeout used when a lock is held (in seconds), a negative value\n"
+" means no timeout. Default is 600."
+msgstr ""
+
+msgid ""
+"``traceback``\n"
+" Mercurial always prints a traceback when an unknown exception\n"
+" occurs. Setting this to True will make Mercurial print a traceback\n"
+" on all exceptions, even those recognized by Mercurial (such as\n"
+" IOError or MemoryError). Default is False."
+msgstr ""
+
+msgid ""
+"``username``\n"
+" The committer of a changeset created when running \"commit\".\n"
+" Typically a person's name and email address, e.g. ``Fred Widget\n"
+" <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. "
+"If\n"
+" the username in hgrc is empty, it has to be specified manually or\n"
+" in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set\n"
+" ``username =`` in the system hgrc). Environment variables in the\n"
+" username are expanded."
+msgstr ""
+
+msgid ""
+"``verbose``\n"
+" Increase the amount of output printed. True or False. Default is False."
+msgstr ""
+
+msgid ""
+"\n"
+"``web``\n"
+"-------"
+msgstr ""
+"\n"
+"``web``\n"
+"-------"
+
+msgid ""
+"Web interface configuration. The settings in this section apply to\n"
+"both the builtin webserver (started by :hg:`serve`) and the script you\n"
+"run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI\n"
+"and WSGI)."
+msgstr ""
+
+msgid ""
+"The Mercurial webserver does no authentication (it does not prompt for\n"
+"usernames and passwords to validate *who* users are), but it does do\n"
+"authorization (it grants or denies access for *authenticated users*\n"
+"based on settings in this section). You must either configure your\n"
+"webserver to do authentication for you, or disable the authorization\n"
+"checks."
+msgstr ""
+
+msgid ""
+"For a quick setup in a trusted environment, e.g., a private LAN, where\n"
+"you want it to accept pushes from anybody, you can use the following\n"
+"command line::"
+msgstr ""
+
+msgid " $ hg --config web.allow_push=* --config web.push_ssl=False serve"
+msgstr ""
+
+msgid ""
+"Note that this will allow anybody to push anything to the server and\n"
+"that this should not be used for public servers."
+msgstr ""
+
+msgid "The full set of options is:"
+msgstr "Fullständig inställningslista:"
+
+msgid ""
+"``accesslog``\n"
+" Where to output the access log. Default is stdout."
+msgstr ""
+
+msgid ""
+"``address``\n"
+" Interface address to bind to. Default is all."
+msgstr ""
+
+msgid ""
+"``allow_archive``\n"
+" List of archive format (bz2, gz, zip) allowed for downloading.\n"
+" Default is empty."
+msgstr ""
+
+msgid ""
+"``allowbz2``\n"
+" (DEPRECATED) Whether to allow .tar.bz2 downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowgz``\n"
+" (DEPRECATED) Whether to allow .tar.gz downloading of repository\n"
+" revisions.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``allowpull``\n"
+" Whether to allow pulling from the repository. Default is True."
+msgstr ""
+
+msgid ""
+"``allow_push``\n"
+" Whether to allow pushing to the repository. If empty or not set,\n"
+" push is not allowed. If the special value ``*``, any remote user can\n"
+" push, including unauthenticated users. Otherwise, the remote user\n"
+" must have been authenticated, and the authenticated user name must\n"
+" be present in this list. The contents of the allow_push list are\n"
+" examined after the deny_push list."
+msgstr ""
+
+msgid ""
+"``guessmime``\n"
+" Control MIME types for raw download of file content.\n"
+" Set to True to let hgweb guess the content type from the file\n"
+" extension. This will serve HTML files as ``text/html`` and might\n"
+" allow cross-site scripting attacks when serving untrusted\n"
+" repositories. Default is False."
+msgstr ""
+
+msgid ""
+"``allow_read``\n"
+" If the user has not already been denied repository access due to\n"
+" the contents of deny_read, this list determines whether to grant\n"
+" repository access to the user. If this list is not empty, and the\n"
+" user is unauthenticated or not present in the list, then access is\n"
+" denied for the user. If the list is empty or not set, then access\n"
+" is permitted to all users by default. Setting allow_read to the\n"
+" special value ``*`` is equivalent to it not being set (i.e. access\n"
+" is permitted to all users). The contents of the allow_read list are\n"
+" examined after the deny_read list."
+msgstr ""
+
+msgid ""
+"``allowzip``\n"
+" (DEPRECATED) Whether to allow .zip downloading of repository\n"
+" revisions. Default is False. This feature creates temporary files."
+msgstr ""
+
+msgid ""
+"``baseurl``\n"
+" Base URL to use when publishing URLs in other locations, so\n"
+" third-party tools like email notification hooks can construct\n"
+" URLs. Example: ``http://hgserver/repos/``."
+msgstr ""
+
+msgid ""
+"``cacerts``\n"
+" Path to file containing a list of PEM encoded certificate\n"
+" authority certificates. Environment variables and ``~user``\n"
+" constructs are expanded in the filename. If specified on the\n"
+" client, then it will verify the identity of remote HTTPS servers\n"
+" with these certificates."
+msgstr ""
+
+msgid ""
+" This feature is only supported when using Python 2.6 or later. If you "
+"wish\n"
+" to use it with earlier versions of Python, install the backported\n"
+" version of the ssl library that is available from\n"
+" ``http://pypi.python.org``."
+msgstr ""
+
+msgid ""
+" To disable SSL verification temporarily, specify ``--insecure`` from\n"
+" command line."
+msgstr ""
+
+msgid ""
+" You can use OpenSSL's CA certificate file if your platform has\n"
+" one. On most Linux systems this will be\n"
+" ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to\n"
+" generate this file manually. The form must be as follows::"
+msgstr ""
+
+msgid ""
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----\n"
+" -----BEGIN CERTIFICATE-----\n"
+" ... (certificate in base64 PEM encoding) ...\n"
+" -----END CERTIFICATE-----"
+msgstr ""
+
+msgid ""
+"``cache``\n"
+" Whether to support caching in hgweb. Defaults to True."
+msgstr ""
+
+msgid ""
+"``collapse``\n"
+" With ``descend`` enabled, repositories in subdirectories are shown at\n"
+" a single level alongside repositories in the current path. With\n"
+" ``collapse`` also enabled, repositories residing at a deeper level than\n"
+" the current path are grouped behind navigable directory entries that\n"
+" lead to the locations of these repositories. In effect, this setting\n"
+" collapses each collection of repositories found within a subdirectory\n"
+" into a single entry for that subdirectory. Default is False."
+msgstr ""
+
+msgid ""
+"``contact``\n"
+" Name or email address of the person in charge of the repository.\n"
+" Defaults to ui.username or ``$EMAIL`` or \"unknown\" if unset or empty."
+msgstr ""
+
+msgid ""
+"``deny_push``\n"
+" Whether to deny pushing to the repository. If empty or not set,\n"
+" push is not denied. If the special value ``*``, all remote users are\n"
+" denied push. Otherwise, unauthenticated users are all denied, and\n"
+" any authenticated user name present in this list is also denied. The\n"
+" contents of the deny_push list are examined before the allow_push list."
+msgstr ""
+
+msgid ""
+"``deny_read``\n"
+" Whether to deny reading/viewing of the repository. If this list is\n"
+" not empty, unauthenticated users are all denied, and any\n"
+" authenticated user name present in this list is also denied access to\n"
+" the repository. If set to the special value ``*``, all remote users\n"
+" are denied access (rarely needed ;). If deny_read is empty or not set,\n"
+" the determination of repository access depends on the presence and\n"
+" content of the allow_read list (see description). If both\n"
+" deny_read and allow_read are empty or not set, then access is\n"
+" permitted to all users by default. If the repository is being\n"
+" served via hgwebdir, denied users will not be able to see it in\n"
+" the list of repositories. The contents of the deny_read list have\n"
+" priority over (are examined before) the contents of the allow_read\n"
+" list."
+msgstr ""
+
+msgid ""
+"``descend``\n"
+" hgwebdir indexes will not descend into subdirectories. Only "
+"repositories\n"
+" directly in the current path will be shown (other repositories are "
+"still\n"
+" available from the index corresponding to their containing path)."
+msgstr ""
+
+msgid ""
+"``description``\n"
+" Textual description of the repository's purpose or contents.\n"
+" Default is \"unknown\"."
+msgstr ""
+
+msgid ""
+"``encoding``\n"
+" Character encoding name. Default is the current locale charset.\n"
+" Example: \"UTF-8\""
+msgstr ""
+
+msgid ""
+"``errorlog``\n"
+" Where to output the error log. Default is stderr."
+msgstr ""
+
+msgid ""
+"``comparisoncontext``\n"
+" Number of lines of context to show in side-by-side file comparison. If\n"
+" negative or the value ``full``, whole files are shown. Default is 5.\n"
+" This setting can be overridden by a ``context`` request parameter to "
+"the\n"
+" ``comparison`` command, taking the same values."
+msgstr ""
+
+msgid ""
+"``hidden``\n"
+" Whether to hide the repository in the hgwebdir index.\n"
+" Default is False."
+msgstr ""
+
+msgid ""
+"``ipv6``\n"
+" Whether to use IPv6. Default is False."
+msgstr ""
+
+msgid ""
+"``logoimg``\n"
+" File name of the logo image that some templates display on each page.\n"
+" The file name is relative to ``staticurl``. That is, the full path to\n"
+" the logo image is \"staticurl/logoimg\".\n"
+" If unset, ``hglogo.png`` will be used."
+msgstr ""
+
+msgid ""
+"``logourl``\n"
+" Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``\n"
+" will be used."
+msgstr ""
+
+msgid ""
+"``name``\n"
+" Repository name to use in the web interface. Default is current\n"
+" working directory."
+msgstr ""
+
+msgid ""
+"``maxchanges``\n"
+" Maximum number of changes to list on the changelog. Default is 10."
+msgstr ""
+
+msgid ""
+"``maxfiles``\n"
+" Maximum number of files to list per changeset. Default is 10."
+msgstr ""
+
+msgid ""
+"``port``\n"
+" Port to listen on. Default is 8000."
+msgstr ""
+"``port``\n"
+"Port att lyssna på. Standard är 8000."
+
+msgid ""
+"``prefix``\n"
+" Prefix path to serve from. Default is '' (server root)."
+msgstr ""
+"``prefix``\n"
+"Sökvägsprefix att dela ut från. Standard är '' (serverrot)."
+
+msgid ""
+"``push_ssl``\n"
+" Whether to require that inbound pushes be transported over SSL to\n"
+" prevent password sniffing. Default is True."
+msgstr ""
+
+msgid ""
+"``staticurl``\n"
+" Base URL to use for static files. If unset, static files (e.g. the\n"
+" hgicon.png favicon) will be served by the CGI script itself. Use\n"
+" this setting to serve them directly with the HTTP server.\n"
+" Example: ``http://hgserver/static/``."
+msgstr ""
+
+msgid ""
+"``stripes``\n"
+" How many lines a \"zebra stripe\" should span in multiline output.\n"
+" Default is 1; set to 0 to disable."
+msgstr ""
+
+msgid ""
+"``style``\n"
+" Which template map style to use."
+msgstr ""
+"``style``\n"
+" Mallstil att använda."
+
+msgid ""
+"``templates``\n"
+" Where to find the HTML templates. Default is install path.\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "Vissa kommandon tillåter att användare anger ett datum, bland dom:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: Ange arkiveringsdatum.\n"
+"- log, revert, update: Välj revision(er) med hjälp av datum."
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "Många datumformat är giltiga. Här är några exempel:"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+"- ``Wed Dec 6 13:18:29 2006`` (lokal tidszon antas)\n"
+"- ``Dec 6 13:18 -0600`` (Ã¥ret antas, tidsoffset anges)\n"
+"- ``Dec 6 13:18 UTC`` (UTC och GMT är alias för +0000)\n"
+"- ``Dec 6`` (midnatt)\n"
+"- ``13:18`` (idag antas)\n"
+"- ``3:39`` (3:39 på natten antas)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601-format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "Till sist, så finns även Mercurial's interna format:"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+
+msgid ""
+"This is the internal representation format for dates. The first number\n"
+"is the number of seconds since the epoch (1970-01-01 00:00 UTC). The\n"
+"second is the offset of the local timezone, in seconds west of UTC\n"
+"(negative if the timezone is east of UTC)."
+msgstr ""
+"Detta är det interna representationsformatet för datum. Det första numret\n"
+"är antalet sekunder sedan epoken(1970-01-01 00:00 UTC). Det andra är\n"
+"offseten för den lokala tidszonen, i sekunder väst om UTC (negativ om\n"
+"tidszonen är öst om UTC)."
+
+msgid "The log command also accepts date ranges:"
+msgstr "Kommandot log accepterar också datumintervall:"
+
+msgid ""
+"- ``<DATE`` - at or before a given date/time\n"
+"- ``>DATE`` - on or after a given date/time\n"
+"- ``DATE to DATE`` - a date range, inclusive\n"
+"- ``-DAYS`` - within a given number of days of today\n"
+msgstr ""
+"- ``<DATUM`` - på eller innan datum/tid\n"
+"- ``>DATUM`` - på eller efter datum/tid\n"
+"- ``DATUM to DATUM`` - ett datumintervall, inklusivt\n"
+"- ``-DAGAR`` - inom ett givet antal dagar från idag\n"
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+"HG\n"
+" Sökväg till den exekverbara filen 'hg', skickas automatiskt med när\n"
+" hakar, utökningar eller externa verktyg körs. Om osatt eller tom, så är\n"
+" det här hg:s körbara namn om den är frysen, eller en exekverbar fil vid\n"
+" namnet 'hg' (med tillägget %PATHEXT% [COM/EXE/BAT/CMD som standard] på\n"
+" Windows) sökes."
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+"HGEDITOR\n"
+" Detta är namnet på editorn som ska köras vid arkivering. Se EDITOR."
+
+msgid " (deprecated, use configuration file)"
+msgstr " (föråldrad, använd konfigurationsfilen)"
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGPLAINEXCEPT\n"
+" This is a comma-separated list of features to preserve when\n"
+" HGPLAIN is enabled. Currently the only value supported is \"i18n\",\n"
+" which preserves internationalization in plain mode."
+msgstr ""
+
+msgid ""
+" Setting HGPLAINEXCEPT to anything (even an empty string) will\n"
+" enable plain mode."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+"Mercurial har förmågan att lägga till nya funktioner genom utökningar.\n"
+"Utökningar kan lägga till nya kommandon, lägga till flaggor till\n"
+"existerande kommandon, ändra hur ett kommando beter sig, eller\n"
+"implementera hakar."
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+"Utökningar laddas inte som standard av ett antal orsaker: de kan göra att\n"
+"Mercurial startar långsammare; de kan vara avsedda för avancerat\n"
+"användning; de kan tillföra potentiellt farliga förmågor (som att låta dig\n"
+"förstöra eller modifiera historik); de kanske inte är redo för fullskalig\n"
+"användning än; eller de kan förändra beteendet för Mercurial. Det är därför\n"
+"upp till användaren att aktiverade utökningar om de behövs."
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+"För att aktivera utökningen \"foo\", som endera levereras med Mercurial\n"
+"eller finns i Pythons sökväg, skapa en post för den i din\n"
+"konfigurationsfil, så här::"
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+" [extensions]\n"
+" foo ="
+
+msgid "You may also specify the full path to an extension::"
+msgstr "Du kan också ange den fullständiga sökvägen till en utökning::"
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+" [extensions]\n"
+" minfunktion = ~/.hgext/minfunktion.py"
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+"För att explicit deaktivera en utökning som aktiverats i en\n"
+"konfigurationsfil med större omfång, börja dess sökväg med !::"
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+" [extensions]\n"
+" # deaktiverar utökningen bar som finns i /sökväg/till/utökningen/bar.py\n"
+" bar = !/sökväg/till/utökningen/bar.py\n"
+" # samma sak, men ingen sökväg angavs för utökningen baz\n"
+" baz = !\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"files. "
+msgstr ""
+"Mercurial stöder ett funktionellt språk för att välja en uppsättning filer. "
+
+msgid ""
+"Like other file patterns, this pattern type is indicated by a prefix,\n"
+"'set:'. The language supports a number of predicates which are joined\n"
+"by infix operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as filenames or patterns must be quoted with single\n"
+"or double quotes if they contain characters outside of\n"
+"``[.*{}[]?/\\_a-zA-Z0-9\\x80-\\xff]`` or if they match one of the\n"
+"predefined predicates. This generally applies to file patterns other\n"
+"than globs and arguments for predicates."
+msgstr ""
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Files not in x. Short form is ``! x``."
+msgstr ""
+
+msgid "These are the supported infix operators:"
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of files in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of files in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Files in x but not in y."
+msgstr ""
+
+msgid "The following predicates are supported:"
+msgstr ""
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr ""
+
+msgid ""
+"- Show status of files that appear to be binary in the working directory::"
+msgstr ""
+
+msgid " hg status -A \"set:binary()\""
+msgstr ""
+
+msgid "- Forget files that are in .hgignore but are already tracked::"
+msgstr ""
+
+msgid " hg forget \"set:hgignore() and not ignored()\""
+msgstr ""
+
+msgid "- Find text files that contain a string::"
+msgstr ""
+
+msgid " hg locate \"set:grep(magic) and not binary()\""
+msgstr ""
+
+msgid "- Find C files in a non-standard encoding::"
+msgstr ""
+
+msgid " hg locate \"set:**.c and not encoding('UTF-8')\""
+msgstr ""
+
+msgid "- Revert copies of large binary files::"
+msgstr ""
+
+msgid " hg revert \"set:copied() and binary() and size('>1M')\""
+msgstr ""
+
+msgid "- Remove files listed in foo.lst that contain the letter a or b::"
+msgstr ""
+
+msgid " hg remove \"set: 'listfile:foo.lst' and (**a* or **b*)\""
+msgstr ""
+
+msgid "See also :hg:`help patterns`.\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+msgid ""
+"Bookmark\n"
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. They are similar to tags in that it is possible to use\n"
+" bookmark names in all places where Mercurial expects a changeset\n"
+" ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along\n"
+" when you make a commit."
+msgstr ""
+" Bokmärken är pekare till utvalda arkiveringar som flyttar vid\n"
+" arkivering. De liknar märken på det sättet att du kan använda\n"
+" bokmärkesnamn på alla platser där Mercurial förväntar sig ett\n"
+" ändrings-ID, exexempelvis med :hg:`update`. Till skillnad från märken,\n"
+" så förflyttas bokmärken när du arkiverar."
+
+msgid ""
+" Bookmarks can be renamed, copied and deleted. Bookmarks are local,\n"
+" unless they are explicitly pushed or pulled between repositories.\n"
+" Pushing and pulling bookmarks allow you to collaborate with others\n"
+" on a branch without creating a named branch."
+msgstr ""
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Head, closed branch'"
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Draft\n"
+" Changesets in the draft phase have not been shared with publishing\n"
+" repositories and may thus be safely changed by history-modifying\n"
+" extensions. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+
+msgid ""
+" Closed heads can be re-opened by committing new changeset as the\n"
+" child of the changeset that marks a head as closed."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Phase\n"
+" A per-changeset state tracking how the changeset has been or\n"
+" should be shared. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Public\n"
+" Changesets in the public phase have been shared with publishing\n"
+" repositories and are therefore considered immutable. See :hg:`help\n"
+" phases`."
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+"Push\n"
+" En operation där ändringarna ett lokalt arkiv som inte är i ett annat\n"
+" arkiv skickas till det andra arkivet. Notera att denna operation bara\n"
+" lägger till öndringar som har arkiverats lokalt till det andra arkivet.\n"
+" Oarkiverade ändringar skickas inte. Se :hg:`help push`."
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Secret\n"
+" Changesets in the secret phase may not be shared via push, pull,\n"
+" or clone. See :hg:`help phases`."
+msgstr ""
+
+msgid ""
+"Tag\n"
+" An alternative name given to a changeset. Tags can be used in all\n"
+" places where Mercurial expects a changeset ID, e.g., with\n"
+" :hg:`update`. The creation of a tag is stored in the history and\n"
+" will thus automatically be shared with other using push and pull."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+
+msgid ""
+"Synopsis\n"
+"========"
+msgstr ""
+"Synopsis\n"
+"========"
+
+msgid ""
+"The Mercurial system uses a file called ``.hgignore`` in the root\n"
+"directory of a repository to control its behavior when it searches\n"
+"for files that it is not currently tracking."
+msgstr ""
+
+msgid ""
+"Description\n"
+"==========="
+msgstr ""
+"Beskrivning\n"
+"==========="
+
+msgid ""
+"The working directory of a Mercurial repository will often contain\n"
+"files that should not be tracked by Mercurial. These include backup\n"
+"files created by editors and build products created by compilers.\n"
+"These files can be ignored by listing them in a ``.hgignore`` file in\n"
+"the root of the working directory. The ``.hgignore`` file must be\n"
+"created manually. It is typically put under version control, so that\n"
+"the settings will propagate to other repositories with push and pull."
+msgstr ""
+
+msgid ""
+"An untracked file is ignored if its path relative to the repository\n"
+"root directory, or any prefix path of that path, is matched against\n"
+"any pattern in ``.hgignore``."
+msgstr ""
+
+msgid ""
+"For example, say we have an untracked file, ``file.c``, at\n"
+"``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``\n"
+"if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``."
+msgstr ""
+
+msgid ""
+"In addition, a Mercurial configuration file can reference a set of\n"
+"per-user or global ignore files. See the ``ignore`` configuration\n"
+"key on the ``[ui]`` section of :hg:`help config` for details of how to\n"
+"configure these files."
+msgstr ""
+
+msgid ""
+"To control Mercurial's handling of files that it manages, many\n"
+"commands support the ``-I`` and ``-X`` options; see\n"
+":hg:`help <command>` and :hg:`help patterns` for details."
+msgstr ""
+
+msgid ""
+"Files that are already tracked are not affected by .hgignore, even\n"
+"if they appear in .hgignore. An untracked file X can be explicitly\n"
+"added with :hg:`add X`, even if X would be excluded by a pattern\n"
+"in .hgignore."
+msgstr ""
+
+msgid ""
+"An ignore file is a plain text file consisting of a list of patterns,\n"
+"with one pattern per line. Empty lines are skipped. The ``#``\n"
+"character is treated as a comment character, and the ``\\`` character\n"
+"is treated as an escape character."
+msgstr ""
+
+msgid ""
+"Mercurial supports several pattern syntaxes. The default syntax used\n"
+"is Python/Perl-style regular expressions."
+msgstr ""
+
+msgid "To change the syntax used, use a line of the following form::"
+msgstr ""
+
+msgid " syntax: NAME"
+msgstr ""
+
+msgid "where ``NAME`` is one of the following:"
+msgstr ""
+
+msgid ""
+"``regexp``\n"
+" Regular expression, Python/Perl syntax.\n"
+"``glob``\n"
+" Shell-style glob."
+msgstr ""
+
+msgid ""
+"The chosen syntax stays in effect when parsing all patterns that\n"
+"follow, until another syntax is selected."
+msgstr ""
+
+msgid ""
+"Neither glob nor regexp patterns are rooted. A glob-syntax pattern of\n"
+"the form ``*.c`` will match a file ending in ``.c`` in any directory,\n"
+"and a regexp pattern of the form ``\\.c$`` will do the same. To root a\n"
+"regexp pattern, start it with ``^``."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" Patterns specified in other than ``.hgignore`` are always rooted.\n"
+" Please see :hg:`help patterns` for details."
+msgstr ""
+
+msgid ""
+"Example\n"
+"======="
+msgstr ""
+"Exempel\n"
+"======="
+
+msgid "Here is an example ignore file. ::"
+msgstr ""
+
+msgid ""
+" # use glob syntax.\n"
+" syntax: glob"
+msgstr ""
+
+msgid ""
+" *.elc\n"
+" *.pyc\n"
+" *~"
+msgstr ""
+
+msgid ""
+" # switch to regexp syntax.\n"
+" syntax: regexp\n"
+" ^\\.pc/\n"
+msgstr ""
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a tree of repositories. In the second case, repository\n"
+"paths and global options can be defined using a dedicated\n"
+"configuration file common to :hg:`serve`, ``hgweb.wsgi``,\n"
+"``hgweb.cgi`` and ``hgweb.fcgi``."
+msgstr ""
+"Mercurials interna webbserver, hgweb, kan endera dela ut ett arkiv, eller\n"
+"en trädstruktur med arkiv. I det andra fallet kan arkivsökvägar och\n"
+"globala flaggor definieras med en dedikerad konfigurationsfil som delas\n"
+"av :hg:`serve`, ``hgweb.wsgi``, ``hgweb.cgi`` och ``hgweb.fcgi``."
+
+msgid ""
+"This file uses the same syntax as other Mercurial configuration files\n"
+"but recognizes only the following sections:"
+msgstr ""
+"Denna fil använder samma syntax som Mercurials övriga konfigurationsfiler,\n"
+"men använder bara de följande sektionerna:"
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+" - web\n"
+" - paths\n"
+" - collections"
+
+msgid "The ``web`` options are thorougly described in :hg:`help config`."
+msgstr "Flaggorna för ``web`` finns utförligt beskrivna i :hg:`help config`."
+
+msgid ""
+"The ``paths`` section maps URL paths to paths of repositories in the\n"
+"filesystem. hgweb will not expose the filesystem directly - only\n"
+"Mercurial repositories can be published and only according to the\n"
+"configuration."
+msgstr ""
+"Sektionen ``paths`` matchar URL-sökvägar till arkivsökvägar i filsystemet.\n"
+"hgweb kommer inte att exponera filsystemet direkt - bara Mercurial-arkiv\n"
+"kan publiceras och bara som konfigurationen medger."
+
+msgid ""
+"The left hand side is the path in the URL. Note that hgweb reserves\n"
+"subpaths like ``rev`` or ``file``, try using different names for\n"
+"nested repositories to avoid confusing effects."
+msgstr ""
+"Den vänstra sidan är sökvägen i URL:en. Notera att hgweb reserverar\n"
+"undersökvägar som ``rev`` eller ``file``, försök att anvädna andra namn\n"
+"för nästlade arkiv för att undvika förbryllande fenomen."
+
+msgid ""
+"The right hand side is the path in the filesystem. If the specified\n"
+"path ends with ``*`` or ``**`` the filesystem will be searched\n"
+"recursively for repositories below that point.\n"
+"With ``*`` it will not recurse into the repositories it finds (except for\n"
+"``.hg/patches``).\n"
+"With ``**`` it will also search inside repository working directories\n"
+"and possibly find subrepositories."
+msgstr ""
+"Den högra sidan är sökvägen i filsystemet. Om den angivna sökvägen slutar\n"
+"med ``*`` eller ``**`` så kommer filsystemet att genomsökas rekursivt\n"
+"efter arkiv från den punkten.\n"
+"Med ``*`` så kommer sökningen inte att fortsätta in i funna arkiv (med\n"
+"undantag för ``.hg/patches``).\n"
+"Med ``**`` så kommer sökningen att fortsätta i arkivets arbetskopia och\n"
+"möjligen hitta underarkiv."
+
+msgid "In this example::"
+msgstr "I det här exemplet::"
+
+msgid ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+msgstr ""
+" [paths]\n"
+" /projects/a = /srv/tmprepos/a\n"
+" /projects/b = c:/repos/b\n"
+" / = /srv/repos/*\n"
+" /user/bob = /home/bob/repos/**"
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry will publish every Mercurial repository found in\n"
+" ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``\n"
+" will appear as ``http://server/quux/``\n"
+"- The fourth entry will publish both ``http://server/user/bob/quux/``\n"
+" and ``http://server/user/bob/quux/testsubrepo/``"
+msgstr ""
+"- De första två posterna gör att två arkiv i olika kataloger dyker upp\n"
+" under samma katalog i webbgränssnittet\n"
+"- Den tredje posten publicerar alla Mercurial-arkiv som hittas i\n"
+" ``/srv/repos/``, exempelvis kommer arkivet ``/srv/repos/quux/``\n"
+" att dyka upp som ``http://server/quux/``\n"
+"- Den fjärde posten publicerar både ``http://server/user/bob/quux/``\n"
+" och ``http://server/user/bob/quux/testsubrepo/``"
+
+msgid ""
+"The ``collections`` section is deprecated and has been superseeded by\n"
+"``paths``.\n"
+msgstr "Sektionen ``collections`` är föråldrad och har ersatts av ``paths``.\n"
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"====================="
+msgstr ""
+"Tillgängliga sammanfogningsverktyg\n"
+"=================================="
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ".. internaltoolsmarker"
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"====================="
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+"Mercurial acceptera flera notationer för att identifiera en eller flera\n"
+"filer samma gång."
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+"Som standard behandlar Mercurial filnamn som ett utökat glob-mönster i\n"
+"skalstil."
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr "Alternativa mönsternotationer måste anges explicit."
+
+msgid ""
+".. note::\n"
+" Patterns specified in ``.hgignore`` are not rooted. \n"
+" Please see :hg:`help hgignore` for details."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+"För att använda en enkel sökväg utan någon mönstermatching, börja den med\n"
+"``path:``. Dessa sökvägar måste överrensstämma helt från det nuvarande\n"
+"arkivroten."
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+"För att använda utökad glob, börja ett namn med ``glob:``. Globs har sin\n"
+"rot i den aktuella katalogen; en glob som ``*.c`` kommer bara att matcha\n"
+"filer i den aktuella katalogen som slutar med ``.c``."
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+"Den utökade glob-syntaxen är ``**`` för att matcha alla strängar i sökvägen\n"
+"och ``{a,b}`` som innebär \"a eller b\"."
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+"För att använda reguljära uttryck från Perl/Python, börja ett namn med\n"
+"``re:``. Regexp-mönstermatchning har sin början i arkivroten."
+
+msgid ""
+"To read name patterns from a file, use ``listfile:`` or ``listfile0:``.\n"
+"The latter expects null delimited patterns while the former expects line\n"
+"feeds. Each string read from the file is itself treated as a file\n"
+"pattern."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr "RÃ¥a exempel::"
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+" path:foo/bar namnet bar i en katalog med namnet foo i arkivroten\n"
+" path:path:name en fil eller katalog med namnet \"path:name\""
+
+msgid "Glob examples::"
+msgstr "Glob-exempel::"
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+" glob:*.c alla namn som slutar på \".c\" i den nuvarande katalogen\n"
+" *.c alla namn som slutar på \".c\" i den nuvarande katalogen\n"
+" **.c alla namn som slutar på \".c\" i alla underkataloger från\n"
+" den nuvarande katalogen inklusive sig själv.\n"
+" foo/*.c alla namn som slutar på \".c\" i katalogen foo\n"
+" foo/**.c alla namn som slutar på \".c\" i alla underkataloger från\n"
+" foo inklusive sig själv."
+
+msgid "Regexp examples::"
+msgstr "Regexp-exempel::"
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+" re:.*\\.c$ alla namn som slutar med \".c\", var som helst i arkivet"
+
+msgid "File examples::"
+msgstr "Filexempel::"
+
+msgid ""
+" listfile:list.txt read list from list.txt with one file pattern per line\n"
+" listfile0:list.txt read list from list.txt with null byte delimiters"
+msgstr ""
+
+msgid "See also :hg:`help filesets`.\n"
+msgstr ""
+
+msgid ""
+"What are phases?\n"
+"================"
+msgstr ""
+"Vad är faser?\n"
+"============="
+
+msgid ""
+"Phases are a system for tracking which changesets have been or should\n"
+"be shared. This helps prevent common mistakes when modifying history\n"
+"(for instance, with the mq or rebase extensions)."
+msgstr ""
+
+msgid "Each changeset in a repository is in one of the following phases:"
+msgstr ""
+
+msgid ""
+" - public : changeset is visible on a public server\n"
+" - draft : changeset is not yet published\n"
+" - secret : changeset should not be pushed, pulled, or cloned"
+msgstr ""
+
+msgid ""
+"These phases are ordered (public < draft < secret) and no changeset\n"
+"can be in a lower phase than its ancestors. For instance, if a\n"
+"changeset is public, all its ancestors are also public. Lastly,\n"
+"changeset phases should only be changed towards the public phase."
+msgstr ""
+
+msgid ""
+"How are phases managed?\n"
+"======================="
+msgstr ""
+"Hur hanteras faser?\n"
+"==================="
+
+msgid ""
+"For the most part, phases should work transparently. By default, a\n"
+"changeset is created in the draft phase and is moved into the public\n"
+"phase when it is pushed to another repository."
+msgstr ""
+
+msgid ""
+"Once changesets become public, extensions like mq and rebase will\n"
+"refuse to operate on them to prevent creating duplicate changesets.\n"
+"Phases can also be manually manipulated with the :hg:`phase` command\n"
+"if needed. See :hg:`help -v phase` for examples."
+msgstr ""
+
+msgid ""
+"Phases and servers\n"
+"=================="
+msgstr ""
+"Faser och servrar\n"
+"================="
+
+msgid "Normally, all servers are ``publishing`` by default. This means::"
+msgstr ""
+
+msgid ""
+" - all draft changesets that are pulled or cloned appear in phase\n"
+" public on the client"
+msgstr ""
+
+msgid ""
+" - all draft changesets that are pushed appear as public on both\n"
+" client and server"
+msgstr ""
+
+msgid " - secret changesets are neither pushed, pulled, or cloned"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" Pulling a draft changeset from a publishing server does not mark it\n"
+" as public on the server side due to the read-only nature of pull."
+msgstr ""
+
+msgid ""
+"Sometimes it may be desirable to push and pull changesets in the draft\n"
+"phase to share unfinished work. This can be done by setting a\n"
+"repository to disable publishing in its configuration file::"
+msgstr ""
+
+msgid ""
+" [phases]\n"
+" publish = False"
+msgstr ""
+" [phases]\n"
+" publish = False"
+
+msgid "See :hg:`help config` for more information on config files."
+msgstr "Se :hg:`help config` för mer information om konfigurationsfiler."
+
+msgid ""
+".. note::\n"
+" Servers running older versions of Mercurial are treated as\n"
+" publishing."
+msgstr ""
+
+msgid ""
+"Examples\n"
+"========"
+msgstr ""
+"Exempel\n"
+"======="
+
+msgid " - list changesets in draft or secret phase::"
+msgstr " - visa ändringar i draft- eller secret-fasen::"
+
+msgid " hg log -r \"not public()\""
+msgstr " hg log -r \"not public()\""
+
+msgid " - change all secret changesets to draft::"
+msgstr " - ändra alla secret-ändringar till draft::"
+
+msgid " hg phase --draft \"secret()\""
+msgstr " hg phase --draft \"secret()\""
+
+msgid ""
+" - forcibly move the current changeset and descendants from public to draft::"
+msgstr " - tvinga nuvarande ändring och ättlingar från public till draft::"
+
+msgid " hg phase --force --draft ."
+msgstr " hg phase --force --draft ."
+
+msgid " - show a list of changeset revision and phase::"
+msgstr " - visa en lista med ändringsrevision och fas::"
+
+msgid " hg log --template \"{rev} {phase}\\n\""
+msgstr " hg log --template \"{rev} {phase}\\n\""
+
+msgid " - resynchronize draft changesets relative to a remote repository::"
+msgstr ""
+
+msgid " hg phase -fd 'outgoing(URL)' "
+msgstr " hg phase -fd 'outgoing(URL)' "
+
+msgid ""
+"See :hg:`help phase` for more information on manually manipulating phases.\n"
+msgstr ""
+"Se :hg:`help phase` för mer information om att manuellt änddra faser.\n"
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr "Mercurial stöder flera sätt att ange individuella revisioner."
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+"Ett heltal behandlas som ett revisionsnummer. Negativa heltal behandlas som\n"
+"sekventiell offset från toppen, där -1 är tippen, -2 revisionen innan\n"
+"toppen, och så vidare."
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+"En 40-siffrig hexadecimal sträng behandlas som en unik\n"
+"revisionsidentifierare."
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+"En hexadecimal sträng med mindre än 40 tecken behandlas som en unik\n"
+"revisionsidentifierare och refereras till som en kort identifierare. En\n"
+"kort identifierare är bara giltig om det är prefixet för exakt en\n"
+"fullängdsidentifierare."
+
+msgid ""
+"Any other string is treated as a bookmark, tag, or branch name. A\n"
+"bookmark is a movable pointer to a revision. A tag is a permanent name\n"
+"associated with a revision. A branch name denotes the tipmost revision\n"
+"of that branch. Bookmark, tag, and branch names must not contain the \":\"\n"
+"character."
+msgstr ""
+"Alla andra strängar behandlas som bokmärken, märken eller grennamn. Ett\n"
+"bokmärke är en flyttbar pekare till en revision. Ett märkesnamn är ett\n"
+"permanent namn associerad med en revisionsidentifierare. Ett grennamn\n"
+"anger den högsta revisionen på den grenen. Bokmärken, märken och\n"
+"grennamn kan inte innehålla tecknet \":\"."
+
+msgid "The reserved name \"tip\" always identifies the most recent revision."
+msgstr ""
+"Det reserverade namnet \"tip\" identifierar alltid den senaste revisionen."
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+"Det reserverade namnet \"null\" indikerar null-revisionen. Detta är\n"
+"revisionen i ett tomt arkiv, och är förälder till revision 0."
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+"Det reserverade namnet \".\" indikerar arbetskatalogens förälder. Om ingen\n"
+"arbetskatalog är uthämtad, är den ekvivalent med null. Om en oarkiverad\n"
+"sammanfogning pågår, så är \".\" den första förälderns revision.\n"
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr "Mercurial stöder flera sätt att ange individuella revisioner."
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as branch names may need quoting with single or\n"
+"double quotes if they contain characters like ``-`` or if they match\n"
+"one of the predefined predicates."
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+
+msgid " An alternative syntax is ``x..y``."
+msgstr ""
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+
+msgid ""
+"``x^n``\n"
+" The nth parent of x, n == 0, 1, or 2.\n"
+" For n == 0, x; for n == 1, the first parent of each changeset in x;\n"
+" for n == 2, the second parent of changeset in x."
+msgstr ""
+
+msgid ""
+"``x~n``\n"
+" The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``."
+msgstr ""
+
+msgid "There is a single postfix operator:"
+msgstr ""
+
+msgid ""
+"``x^``\n"
+" Equivalent to ``x^1``, the first parent of each changeset in x."
+msgstr ""
+
+msgid ""
+"\n"
+"The following predicates are supported:"
+msgstr ""
+
+msgid ""
+"New predicates (known as \"aliases\") can be defined, using any combination "
+"of\n"
+"existing predicates or other aliases. An alias definition looks like::"
+msgstr ""
+
+msgid " <alias> = <definition>"
+msgstr ""
+
+msgid ""
+"in the ``revsetalias`` section of a Mercurial configuration file. Arguments\n"
+"of the form `$1`, `$2`, etc. are substituted from the alias into the\n"
+"definition."
+msgstr ""
+
+msgid "For example,"
+msgstr "Exempelvis,"
+
+msgid ""
+" [revsetalias]\n"
+" h = heads()\n"
+" d($1) = sort($1, date)\n"
+" rs($1, $2) = reverse(sort($1, $2))"
+msgstr ""
+
+msgid ""
+"defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is\n"
+"exactly equivalent to ``reverse(sort(0:tip, author))``."
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ""
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+
+msgid "- Changesets on the default branch::"
+msgstr "- Ändringar på default-grenen::"
+
+msgid " hg log -r \"branch(default)\""
+msgstr " hg log -r \"branch(default)\""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr " hg log -r \"branch(default) and 1.5:: and not merge()\""
+
+msgid "- Open branch heads::"
+msgstr "- Öppna grenhuvuden::"
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr ""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr ""
+
+msgid "- Changesets committed in May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr ""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group."
+msgstr ""
+
+msgid ""
+"Mercurial currently supports Mercurial, Git, and Subversion\n"
+"subrepositories."
+msgstr ""
+
+msgid "Subrepositories are made of three components:"
+msgstr ""
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory."
+msgstr ""
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub``, which\n"
+" should be placed in the root of working directory, and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid " Git and Subversion subrepos are also supported:"
+msgstr ""
+
+msgid ""
+" path/to/nested = [git]git://example.com/nested/repo/path\n"
+" path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path."
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate``, which\n"
+" is placed in the root of working directory, and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"======================"
+msgstr ""
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"============================="
+msgstr ""
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+
+msgid ""
+"Deleting a Subrepository\n"
+"========================"
+msgstr ""
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"==================================="
+msgstr ""
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. However, if you specify the full path of a file in a\n"
+" subrepo, it will be added even without -S/--subrepos specified.\n"
+" Git and Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. If any subrepositories\n"
+" have been modified, Mercurial will abort. Mercurial can be made\n"
+" to instead commit all modified subrepositories by specifying\n"
+" -S/--subrepos, or setting \"ui.commitsubrepos=True\" in a\n"
+" configuration file (see :hg:`help config`). After there are no\n"
+" longer any modified subrepositories, it records their state and\n"
+" finally commits it in the parent repository."
+msgstr ""
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":forget: forget currently only handles exact file matches in subrepos.\n"
+" Git and Subversion subrepositories are currently silently ignored."
+msgstr ""
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Git and Subversion subrepositories are currently\n"
+" silently ignored."
+msgstr ""
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories. Push is a no-op for Subversion subrepositories."
+msgstr ""
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"================================="
+msgstr ""
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ".. keywordsmarker"
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ".. filtersmarker\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`). See also :hg:`help paths`."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "remote branch lookup not supported"
+msgstr ""
+
+msgid "dirstate branch not accessible"
+msgstr "dirstate-grenen inte åtkomlig"
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "okänd gren '%s'"
+
+msgid "can only share local repositories"
+msgstr "kan bara dela lokala arkiv"
+
+msgid "destination already exists"
+msgstr "destinationen finns redan"
+
+msgid "updating working directory\n"
+msgstr "uppdaterar arbetskatalog\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "destinationskatalog: %s\n"
+
+msgid "empty destination path is not valid"
+msgstr "en tom destinationssökväg är inte giltig"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "destinationen '%s' finns redan"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "destinationen '%s är inte tom"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+"källarkivet stödjer inte revisionsuppslag, och stödjer därför inte kloning "
+"av angivna revisioner"
+
+msgid "clone from remote to remote not supported"
+msgstr "kloning från fjärr till fjärr stödjs inte"
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "uppdaterar till grenen %s\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr ""
+"%d filer uppdaterade, %d filer sammanfogade, %d filer raderade, %d filer "
+"olösta\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr ""
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr ""
+
+#, python-format
+msgid "config file %s not found!"
+msgstr "konfigurationsfilen %s hittades inte!"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr ""
+
+msgid "IPv6 is not available on this system"
+msgstr ""
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr ""
+
+#, python-format
+msgid "(binary file %s, hash: %s)"
+msgstr "(binär fil %s, hash: %s)"
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr "%d filer ändrade, %d tillägg(+), %d raderingar(-)\n"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+msgid "exception from first failed import attempt:\n"
+msgstr ""
+
+msgid "exception from second failed import attempt:\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+#, python-format
+msgid "loading %s hook failed:\n"
+msgstr ""
+
+msgid "kb"
+msgstr "kb"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "ignorerar ogiltig [auth]-nyckel '%s'\n"
+
+msgid "connection ended unexpectedly"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr ""
+
+msgid "operation not supported over http"
+msgstr ""
+
+msgid "authorization failed"
+msgstr ""
+
+msgid "http error, possibly caused by proxy setting"
+msgstr ""
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+"'%s' verkar inte vara ett hg-arkiv:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr ""
+
+#, python-format
+msgid "push failed: %s"
+msgstr "tryckning misslyckades: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr ""
+
+msgid "cannot create new http repository"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr ""
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s not found"
+msgstr ""
+
+#, python-format
+msgid "repository %s already exists"
+msgstr ""
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "warning: ignoring unknown working parent %s!\n"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr ""
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr ""
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+
+msgid "abandoned transaction found - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr ""
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+msgid "no rollback information available\n"
+msgstr ""
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s: %s)\n"
+msgstr "arkivtopp tillbakadragen till revision %s (Ã¥ngra %s: %s)\n"
+
+#, python-format
+msgid "repository tip rolled back to revision %s (undo %s)\n"
+msgstr "arkivtopp tillbakadragen till revision %s (Ã¥ngra %s)\n"
+
+msgid "rolling back unknown transaction\n"
+msgstr "återkallar okänd transaktion\n"
+
+msgid "rollback of last commit while not checked out may lose data"
+msgstr ""
+
+msgid "use -f to force"
+msgstr ""
+
+#, python-format
+msgid "named branch could not be reset: current branch is still '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "working directory now based on revisions %d and %d\n"
+msgstr "arbetskatalogen är nu baserad på revisionerna %d och %d\n"
+
+#, python-format
+msgid "working directory now based on revision %d\n"
+msgstr "arbetskatalogen är nu baserad på revision %d\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr ""
+
+#, python-format
+msgid "working directory of %s"
+msgstr ""
+
+#, python-format
+msgid "warning: can't find ancestor for '%s' copied from '%s'!\n"
+msgstr "varning: kan inte hitta anfader för '%s', kopierad från '%s'!\n"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+"kan inte delvis arkivera en sammanfogning (ange inte filer eller mönster"
+
+#, python-format
+msgid "commit with new subrepo %s excluded"
+msgstr ""
+
+msgid "use --subrepos for recursive commit"
+msgstr ""
+
+msgid "can't commit subrepos without .hgsub"
+msgstr "kan inte arkivera underarkiv utan .hgsub"
+
+msgid "file not found!"
+msgstr "filen hittades inte!"
+
+msgid "no match under directory!"
+msgstr ""
+
+msgid "file not tracked!"
+msgstr "filen spåras inte!"
+
+msgid "cannot commit merge with missing files"
+msgstr "kan inte arkivera sammanfogning när filer saknas"
+
+msgid "unresolved merge conflicts (see hg help resolve)"
+msgstr "olösta sammanfogningskonflikter (se hg help resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "arkiverar underarkiv %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr ""
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr "efterfrågar alla ändringar\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr ""
+"deldragningar kan inte göras eftersom det andra arkivet inte stödjer "
+"changegroupsubset."
+
+msgid "destination does not support push"
+msgstr "destinationen stödjer inte tryckning"
+
+#, python-format
+msgid "push includes an obsolete changeset: %s!"
+msgstr "tryckningen innehåller en förlegad ändring: %s!"
+
+#, python-format
+msgid "push includes an unstable changeset: %s!"
+msgstr "tryckningen innehåller en instabil ändring: %s!"
+
+#, python-format
+msgid "updating %s to public failed!\n"
+msgstr "uppdatera %s till publik misslyckades!\n"
+
+msgid "failed to push obsolete markers!\n"
+msgstr "kunde inte trycka förlegad-markörerna!\n"
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "%d ändringar hittades\n"
+
+msgid "bundling"
+msgstr "buntar"
+
+msgid "manifests"
+msgstr "manifest"
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr "tom eller ingen revlog för %s"
+
+msgid "adding changesets\n"
+msgstr "lägger till ändringar\n"
+
+msgid "chunks"
+msgstr "stycken"
+
+msgid "received changelog group is empty"
+msgstr "mottagen ändringsgrupp är tom"
+
+msgid "adding manifests\n"
+msgstr "lägger till manifest\n"
+
+msgid "adding file changes\n"
+msgstr "lägger till filändringar\n"
+
+msgid "received file revlog group is empty"
+msgstr "mottagen revlog-grupp för filer är tom"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "fildata för %s:%s saknas - kör hg verify"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr " (%+d huvuden)"
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "lade till %d ändringar med %d modifikationer i %d filer%s\n"
+
+msgid "unexpected response from remote server:"
+msgstr "oväntat svar från server:"
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr ""
+
+msgid "the server sent an unknown error code"
+msgstr ""
+
+msgid "streaming all changes\n"
+msgstr "strömmar alla ändringar\n"
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr "%d filer att överföra, %s med data\n"
+
+msgid "clone"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr "överförde %s på %.1f sekunder (%s/sek)\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "kan inte använda TLS: Pythons SSL-stöd är inte installerat"
+
+msgid "(using smtps)\n"
+msgstr "(använder smtps)\n"
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "smtp.host är inte konfigurerad - kan inte sända mail"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "sänder mail: smtp-server %s, port %s\n"
+
+msgid "(using starttls)\n"
+msgstr "(använder starttls)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(autenticerar mot mailserver som %s)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "sänder mail: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr "smtp angiven som emailtransport, men ingen smtp-server konfigurerad"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr "%r angiven som emailtransport, men inte i PATH"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "ignorerar ogiltig sendcharset: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "ogiltig emailadress: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "ogiltig lokal adress: %s"
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr ""
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr ""
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "ogiltigt mönster (%s): %s"
+
+msgid "invalid pattern"
+msgstr "ogiltigt mönster"
+
+#, python-format
+msgid "unable to read file list (%s)"
+msgstr "kan inte läsa fillistan (%s)"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid "%s: untracked file differs\n"
+msgstr ""
+
+msgid ""
+"untracked files in working directory differ from files in requested revision"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+msgid "updating"
+msgstr "uppdaterar"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr "update kunde inte ta bort %s: %s!\n"
+
+#, python-format
+msgid "getting %s\n"
+msgstr "hämtar %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr "hämtar %s till %s\n"
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr "notera: möjlig konflikt - %s döptes om flera gånger till:\n"
+
+#, python-format
+msgid "note: possible conflict - %s was deleted and renamed to:\n"
+msgstr "notera: möjlig konflikt - %s raderades och döptes om till:\n"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr ""
+
+msgid "use 'hg update' or check 'hg heads'"
+msgstr "använd 'hg update' eller kontrollera 'hg heads'"
+
+msgid "use 'hg status' to list changes"
+msgstr "använd 'hg status' för att visa modifikationer"
+
+#, python-format
+msgid "outstanding uncommitted changes in subrepository '%s'"
+msgstr "kvarvarande oarkiverade ändringar i underarkivet '%s'"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+
+msgid "crosses branches (merge branches or update --check to force update)"
+msgstr ""
+
+msgid "Attention:"
+msgstr ""
+
+msgid "Caution:"
+msgstr ""
+
+msgid "!Danger!"
+msgstr "!Fara!"
+
+msgid "Error:"
+msgstr "Fel:"
+
+msgid "Hint:"
+msgstr "Tips:"
+
+msgid "Important:"
+msgstr "Viktigt:"
+
+msgid "Note:"
+msgstr "Notera:"
+
+msgid "Tip:"
+msgstr "Tips:"
+
+msgid "Warning!"
+msgstr "Varning!"
+
+#, python-format
+msgid "parsing obsolete marker: unknown version %r"
+msgstr "tolkar förlegad-markering: okänd version %r"
+
+#, python-format
+msgid ""
+"parsing obsolete marker: metadata is too short, %d bytes expected, got %d"
+msgstr ""
+"tolkar förlegad-markering: metadata är för kort, %d bytes förväntades, fick "
+"%d"
+
+#, python-format
+msgid "unknown key: %r"
+msgstr "okänd nyckel: %r"
+
+msgid "unexpected old value"
+msgstr "oväntat gammalt värde"
+
+#, python-format
+msgid "unexpected token: %s"
+msgstr ""
+
+#, python-format
+msgid "not a prefix: %s"
+msgstr "inte ett prefix: %s"
+
+#, python-format
+msgid "not an infix: %s"
+msgstr "inte en infix: %s"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot patch %s: file is not tracked"
+msgstr "kan inte patcha %s: filen är inte hanterad"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists\n"
+msgstr "kan inte skapa %s: destinationen finns redan\n"
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr "Stycke #%d lyckades vid %d med luddigheten %d (offset %d rader).\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr "Stycke #%d lyckades vid %d (offset %d rader).\n"
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+#, python-format
+msgid "could not extract \"%s\" binary data"
+msgstr ""
+
+#, python-format
+msgid "could not decode \"%s\" binary patch: %s"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" length is %d bytes, should be %d"
+msgstr ""
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr ""
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "failed to synchronize metadata for \"%s\""
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr ""
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr ""
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr ""
+
+msgid "patch failed to apply"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "kan inte %s; fjärrarkivet har inte %r-förmågan"
+
+msgid "cannot change null revision phase"
+msgstr "kan inte ändra fas för null-revisionen"
+
+#, python-format
+msgid "ignoring inconsistent public root from remote: %s\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring unexpected root from remote: %i %s\n"
+msgstr ""
+
+#, python-format
+msgid "phases.new-commit: not a valid phase name ('%s')"
+msgstr ""
+
+#, python-format
+msgid "exited with status %d"
+msgstr ""
+
+#, python-format
+msgid "killed by signal %d"
+msgstr ""
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr ""
+
+#, python-format
+msgid "error removing %s: %s\n"
+msgstr "fel vid radering av %s: %s\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr "avlägsning misslyckades, hela bunten lagrad i '%s'\n"
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr "avlägsning misslyckades, partiell bunt lagrad i '%s'\n"
+
+#, python-format
+msgid "revlog decompress error: %s"
+msgstr ""
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr ""
+
+msgid "index entry flags need RevlogNG"
+msgstr "indexflaggor kräver RevlogNG"
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr ""
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr ""
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr ""
+
+msgid "consistency error in delta"
+msgstr ""
+
+msgid "unknown delta base"
+msgstr "okänd deltabas"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "kan inte använda %s här"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds kräver ett mönster"
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor kräver två argument"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "argument till ancestor måste vara revisioner"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+
+msgid "~ expects a number"
+msgstr "~ förväntar sig ett nummer"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author kräver en sträng"
+
+msgid ""
+"``bisect(string)``\n"
+" Changesets marked in the specified bisect status:"
+msgstr ""
+
+msgid ""
+" - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip\n"
+" - ``goods``, ``bads`` : csets topologicaly good/bad\n"
+" - ``range`` : csets taking part in the bisection\n"
+" - ``pruned`` : csets that are goods, bads or skipped\n"
+" - ``untested`` : csets whose fate is yet unknown\n"
+" - ``ignored`` : csets ignored due to DAG topology\n"
+" - ``current`` : the cset currently being bisected"
+msgstr ""
+
+#. i18n: "bisect" is a keyword
+msgid "bisect requires a string"
+msgstr "bisect kräver en sträng"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+
+msgid ""
+" If `name` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a bookmark that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark tar ett eller inga argument"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr "argumentet till bookmark måste vara en sträng"
+
+#, python-format
+msgid "no bookmarks exist that match '%s'"
+msgstr ""
+
+msgid ""
+"``branch(string or set)``\n"
+" All changesets belonging to the given branch or the branches of the "
+"given\n"
+" changesets."
+msgstr ""
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the name is treated as\n"
+" a regular expression. To match a branch that actually starts with `re:"
+"`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed tar inga argument"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains a file matching pattern. See :hg:`help patterns`\n"
+" for information about file patterns."
+msgstr ""
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains kräver ett mönster"
+
+msgid ""
+"``converted([id])``\n"
+" Changesets converted from the given identifier in the old repository if\n"
+" present, or all converted changesets if no identifier is specified."
+msgstr ""
+
+#. i18n: "converted" is a keyword
+msgid "converted takes one or no arguments"
+msgstr "converted tar ett eller inga argument"
+
+#. i18n: "converted" is a keyword
+msgid "converted requires a revision"
+msgstr "converted kräver en revision"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date kräver en sträng"
+
+msgid ""
+"``desc(string)``\n"
+" Search commit message for string. The match is case-insensitive."
+msgstr ""
+
+#. i18n: "desc" is a keyword
+msgid "desc requires a string"
+msgstr "desc kräver en sträng"
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+
+msgid ""
+"``destination([set])``\n"
+" Changesets that were created by a graft, transplant or rebase "
+"operation,\n"
+" with the given revisions specified as the source. Omitting the optional "
+"set\n"
+" is the same as passing all()."
+msgstr ""
+
+msgid ""
+"``draft()``\n"
+" Changeset in draft phase."
+msgstr ""
+
+#. i18n: "draft" is a keyword
+msgid "draft takes no arguments"
+msgstr "draft tar inga argument"
+
+msgid ""
+"``extinct()``\n"
+" obsolete changeset with obsolete descendant only."
+msgstr ""
+
+#. i18n: "extinct" is a keyword
+msgid "extinct takes no arguments"
+msgstr "extinct tar inga argument"
+
+msgid ""
+"``extra(label, [value])``\n"
+" Changesets with the given label in the extra metadata, with the given\n"
+" optional value."
+msgstr ""
+
+msgid ""
+" If `value` starts with `re:`, the remainder of the value is treated as\n"
+" a regular expression. To match a value that actually starts with `re:`,\n"
+" use the prefix `literal:`."
+msgstr ""
+
+#. i18n: "extra" is a keyword
+msgid "extra takes at least 1 and at most 2 arguments"
+msgstr "extra tar minst 1 och som mest 2 argument"
+
+#. i18n: "extra" is a keyword
+msgid "first argument to extra must be a string"
+msgstr "första argumentet till extra måste vara en sträng"
+
+#. i18n: "extra" is a keyword
+msgid "second argument to extra must be a string"
+msgstr "andra argumentet till extra måste vara en sträng"
+
+msgid ""
+"``filelog(pattern)``\n"
+" Changesets connected to the specified filelog."
+msgstr ""
+
+msgid ""
+" For performance reasons, ``filelog()`` does not show every changeset\n"
+" that affects the requested file(s). See :hg:`help log` for details. For\n"
+" a slower, more accurate result, use ``file()``."
+msgstr ""
+
+#. i18n: "filelog" is a keyword
+msgid "filelog requires a pattern"
+msgstr "filelog kräver ett mönster"
+
+msgid ""
+"``first(set, [n])``\n"
+" An alias for limit()."
+msgstr ""
+
+#, python-format
+msgid "%s takes no arguments or a filename"
+msgstr "%s tar inga argument eller ett filnamn"
+
+#, python-format
+msgid "%s expected a filename"
+msgstr "%s förväntade sig ett filnamn"
+
+msgid ""
+"``follow([file])``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent).\n"
+" If a filename is specified, the history of the given file is followed,\n"
+" including copies."
+msgstr ""
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all tar inga argument"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly. Unlike\n"
+" ``keyword(string)``, the match is case-sensitive."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep kräver en sträng"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "ogiltigt träffmönster: %s"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires at least one argument"
+msgstr "_matchfiles kräver minst ett argument"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles requires string arguments"
+msgstr "_matchfiles kräver strängargument"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one revision"
+msgstr "_matchfiles förväntade sig som mest en revision"
+
+#. i18n: "_matchfiles" is a keyword
+msgid "_matchfiles expected at most one default mode"
+msgstr "_matchfiles förvändate sig som mest ett standardläge"
+
+#. i18n: "_matchfiles" is a keyword
+#, python-format
+msgid "invalid _matchfiles prefix: %s"
+msgstr "ogiltigt _matchfiles-prefix: %s"
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+
+msgid ""
+" For a faster but less accurate result, consider using ``filelog()``\n"
+" instead."
+msgstr ""
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file kräver ett mönster"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head tar inga argument"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string. The match is case-insensitive."
+msgstr ""
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword kräver en sträng"
+
+msgid ""
+"``limit(set, [n])``\n"
+" First n members of set, defaulting to 1."
+msgstr ""
+
+#. i18n: "limit" is a keyword
+msgid "limit requires one or two arguments"
+msgstr "limit kräver ett eller två argument"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit kräver ett nummer"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr "limit förväntar sig ett nummer"
+
+msgid ""
+"``last(set, [n])``\n"
+" Last n members of set, defaulting to 1."
+msgstr ""
+
+#. i18n: "last" is a keyword
+msgid "last requires one or two arguments"
+msgstr "last kräver ett eller två argument"
+
+#. i18n: "last" is a keyword
+msgid "last requires a number"
+msgstr "last kräver ett nummer"
+
+#. i18n: "last" is a keyword
+msgid "last expects a number"
+msgstr "last förväntar sig ett nummer"
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge tar inga argument"
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies kräver ett mönster"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id kräver ett argument"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id kräver en sträng"
+
+msgid ""
+"``obsolete()``\n"
+" Mutable changeset with a newer version."
+msgstr ""
+
+#. i18n: "obsolete" is a keyword
+msgid "obsolete takes no arguments"
+msgstr "obsolete tar inga argument"
+
+msgid ""
+"``origin([set])``\n"
+" Changesets that were specified as a source for the grafts, transplants "
+"or\n"
+" rebases that created the given revisions. Omitting the optional set is "
+"the\n"
+" same as passing all(). If a changeset created by these operations is "
+"itself\n"
+" specified as a source for one of these operations, only the source "
+"changeset\n"
+" for the first operation is selected."
+msgstr ""
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing takes one or no arguments"
+msgstr "outgoing tar ett eller inga argument"
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr ""
+
+msgid ""
+"``p1([set])``\n"
+" First parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``p2([set])``\n"
+" Second parent of changesets in set, or the working directory."
+msgstr ""
+
+msgid ""
+"``parents([set])``\n"
+" The set of all parents for all changesets in set, or the working "
+"directory."
+msgstr ""
+
+msgid "^ expects a number 0, 1, or 2"
+msgstr "^ förväntar sig ett nummer 0, 1, eller 2"
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+
+msgid ""
+" If any of specified revisions is not present in the local repository,\n"
+" the query is normally aborted. But this predicate allows the query\n"
+" to continue even in such cases."
+msgstr ""
+
+msgid ""
+"``public()``\n"
+" Changeset in public phase."
+msgstr ""
+
+#. i18n: "public" is a keyword
+msgid "public takes no arguments"
+msgstr "public tar inga argument"
+
+msgid ""
+"``remote([id [,path]])``\n"
+" Local revision that corresponds to the given identifier in a\n"
+" remote repository, if present. Here, the '.' identifier is a\n"
+" synonym for the current local branch."
+msgstr ""
+
+#. i18n: "remote" is a keyword
+msgid "remote takes one, two or no arguments"
+msgstr "remote tar ett, två eller inga argument"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a string id"
+msgstr "remote kräver ett sträng-id"
+
+#. i18n: "remote" is a keyword
+msgid "remote requires a repository path"
+msgstr "remote kräver en arkivsökväg"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes kräver ett mönster"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev kräver ett argument"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev kräver ett nummer"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr "rev förväntar sig ett nummer"
+
+msgid ""
+"``matching(revision [, field])``\n"
+" Changesets in which a given set of fields match the set of fields in "
+"the\n"
+" selected revision or set."
+msgstr ""
+
+msgid ""
+" To match more than one field pass the list of fields to match separated\n"
+" by spaces (e.g. ``author description``)."
+msgstr ""
+
+msgid ""
+" Valid fields are most regular revision fields and some special fields."
+msgstr ""
+
+msgid ""
+" Regular revision fields are ``description``, ``author``, ``branch``,\n"
+" ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``\n"
+" and ``diff``.\n"
+" Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the\n"
+" contents of the revision. Two revisions matching their ``diff`` will\n"
+" also match their ``files``."
+msgstr ""
+
+msgid ""
+" Special fields are ``summary`` and ``metadata``:\n"
+" ``summary`` matches the first line of the description.\n"
+" ``metadata`` is equivalent to matching ``description user date``\n"
+" (i.e. it matches the main metadata fields)."
+msgstr ""
+
+msgid ""
+" ``metadata`` is the default field which is used when no fields are\n"
+" specified. You can match more than one field at a time."
+msgstr ""
+
+#. i18n: "matching" is a keyword
+msgid "matching takes 1 or 2 arguments"
+msgstr "matching tar 1 eller 2 argument"
+
+#. i18n: "matching" is a keyword
+msgid "matching requires a string as its second argument"
+msgstr "matching kräver en sträng som sitt andra argument"
+
+#. i18n: "matching" is a keyword
+#, python-format
+msgid "unexpected field name passed to matching: %s"
+msgstr "oväntat fältnamn skickat till matching: %s"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+
+msgid ""
+"``roots(set)``\n"
+" Changesets in set with no parent changeset in set."
+msgstr ""
+
+msgid ""
+"``secret()``\n"
+" Changeset in secret phase."
+msgstr ""
+
+#. i18n: "secret" is a keyword
+msgid "secret takes no arguments"
+msgstr "secret tar inga argument"
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+
+msgid " The keys can be:"
+msgstr ""
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort kräver ett eller två argument"
+
+#. i18n: "sort" is a keyword
+msgid "sort spec must be a string"
+msgstr "sort-spec måste vara en sträng"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "okänd sorteringsnyckel %r"
+
+#, python-format
+msgid "invalid regular expression: %s"
+msgstr "ogiltigt reguljärt uttryck: %s"
+
+msgid ""
+"``tag([name])``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag tar ett eller inga argument"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "argumentet till tag måste vara en sträng"
+
+#, python-format
+msgid "no tags exist that match '%s'"
+msgstr "inga märken finns som matchar '%s'"
+
+msgid ""
+"``unstable()``\n"
+" Unstable changesets are non-obsolete with obsolete descendants."
+msgstr ""
+
+#. i18n: "unstable" is a keyword
+msgid "unstable takes no arguments"
+msgstr "unstable tar inga argument"
+
+msgid ""
+"``user(string)``\n"
+" User name contains string. The match is case-insensitive."
+msgstr ""
+
+msgid ""
+" If `string` starts with `re:`, the remainder of the string is treated "
+"as\n"
+" a regular expression. To match a user that actually contains `re:`, use\n"
+" the prefix `literal:`."
+msgstr ""
+
+msgid "can't negate that"
+msgstr "kan inte negera det"
+
+msgid "not a symbol"
+msgstr "inte en symbol"
+
+#, python-format
+msgid "infinite expansion of revset alias \"%s\" detected"
+msgstr ""
+
+#, python-format
+msgid "invalid number of arguments: %s"
+msgstr "felaktigt antal argument: %s"
+
+msgid "empty query"
+msgstr "tom fråga"
+
+#, python-format
+msgid "no changes found (ignored %d secret changesets)\n"
+msgstr "inga ändringar hittades (ignorerade %d hemliga ändringar)\n"
+
+#, python-format
+msgid "ui.portablefilenames value is invalid ('%s')"
+msgstr ""
+
+#, python-format
+msgid "possible case-folding collision for %s"
+msgstr ""
+
+#, python-format
+msgid "path ends in directory separator: %s"
+msgstr "sökvägen slutar med en katalogseparator: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr ""
+
+#, python-format
+msgid "path '%s' is inside nested repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr ""
+
+msgid "empty revision range"
+msgstr "tomt revisionsset"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+"%s har inte arkiverats än, så ingen kopieringsinformation lagras för %s.\n"
+
+msgid ".hg/requires file is corrupt"
+msgstr "filen .hg/requires är korrupt"
+
+#, python-format
+msgid "unknown repository format: requires features '%s' (upgrade Mercurial)"
+msgstr "okänt arkivformat: kräver att '%s' fungerar (uppgradera Mercurial)"
+
+msgid "searching for changes\n"
+msgstr "söker efter ändringar\n"
+
+msgid "all local heads known remotely\n"
+msgstr ""
+
+msgid "sampling from both directions\n"
+msgstr ""
+
+msgid "queries"
+msgstr "frågar"
+
+msgid "searching"
+msgstr "söker"
+
+msgid "repository is unrelated"
+msgstr "arkivet är obesläktat"
+
+msgid "warning: repository is unrelated\n"
+msgstr "varning: arkivet är obesälktat\n"
+
+msgid "searching for exact renames"
+msgstr "söker efter exakta namnbyten"
+
+msgid "searching for similar files"
+msgstr "söker efter liknande filer"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s verkar vara en binärfil."
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "password in URL not supported"
+msgstr "lösenord i URL stödjs inte"
+
+msgid "could not create remote repo"
+msgstr ""
+
+msgid "no suitable response from remote hg"
+msgstr ""
+
+#, python-format
+msgid "push refused: %s"
+msgstr ""
+
+msgid "ssl connection failed"
+msgstr "ssl-anslutning misslyckades"
+
+msgid "Python SSL support not found"
+msgstr "Pythons SSL-stöd hittades inte"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "certifikatkontroll kräver Python 2.6"
+
+msgid "no certificate received"
+msgstr "inget certifikat mottaget"
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "certifikat är för %s"
+
+msgid "IDN in certificate not supported"
+msgstr "IDN i certifikat stöds inte"
+
+msgid "no commonName or subjectAltName found in certificate"
+msgstr "inget commonName eller subjectAltName hittades i certifikat"
+
+#, python-format
+msgid "could not find web.cacerts: %s"
+msgstr "kunde inte hitta web.cacerts: %s"
+
+#, python-format
+msgid "host fingerprint for %s can't be verified (Python too old)"
+msgstr ""
+
+#, python-format
+msgid "warning: certificate for %s can't be verified (Python too old)\n"
+msgstr "varning: certificatet för %s kan inte verifieras (för gammal Python)\n"
+
+#, python-format
+msgid "%s ssl connection error"
+msgstr ""
+
+#, python-format
+msgid "%s certificate error: no certificate received"
+msgstr "%s certifikatfel: inget certifikat mottaget"
+
+#, python-format
+msgid "certificate for %s has unexpected fingerprint %s"
+msgstr "certifikatet för %s har oväntat fingeravtryck %s"
+
+msgid "check hostfingerprint configuration"
+msgstr "kontrollera hostfingerprint-konfiguration"
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "%s certifikatfel: %s"
+
+#, python-format
+msgid "configure hostfingerprint %s or use --insecure to connect insecurely"
+msgstr ""
+"konfigurera hostfingerprint %s eller använd --insecure för att ansluta "
+"osäkert"
+
+#, python-format
+msgid ""
+"warning: %s certificate with fingerprint %s not verified (check "
+"hostfingerprints or web.cacerts config setting)\n"
+msgstr ""
+"varning: %s-certificatet med fingeravtrycket %s overifierad (kontrollera "
+"inställningen för hostfingerprints eller web.cacerts)\n"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' verkar inte vara ett hg-arkiv"
+
+msgid "cannot lock static-http repository"
+msgstr ""
+
+msgid "cannot create new static-http repository"
+msgstr ""
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid "warning: subrepo spec file %s not found\n"
+msgstr ""
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr ""
+
+#, python-format
+msgid "invalid subrepository revision specifier in .hgsubstate line %d"
+msgstr ""
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr ""
+
+msgid "missing ] in subrepo source"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ (in checked out version)\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?\n"
+msgstr ""
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr ""
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr ""
+
+#, python-format
+msgid "archiving (%s)"
+msgstr "arkiverar (%s)"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr ""
+
+#, python-format
+msgid "cloning subrepo %s from %s\n"
+msgstr "klonar underarkivet %s från %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "drar underarkivet %s från %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "trycker underarkivet %s till %s\n"
+
+#, python-format
+msgid "reverting subrepo %s\n"
+msgstr "återställer underarkivet %s\n"
+
+#, python-format
+msgid "'svn' executable not found for subrepo '%s'"
+msgstr ""
+
+msgid "cannot retrieve svn tool version"
+msgstr "kan inte hämta version på svn-verktyg"
+
+msgid "cannot commit svn externals"
+msgstr ""
+
+msgid "cannot commit missing svn entries"
+msgstr ""
+
+msgid "failed to commit svn changes"
+msgstr "kunde inte arkivera svn-ändringar"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "raderar inte arkivet %s eftersom den har ändringar.\n"
+
+msgid "cannot retrieve git version"
+msgstr "kan inte hämta git-version"
+
+msgid "git subrepo requires at least 1.6.0 or later"
+msgstr "git-underarkiv kräver minst 1.6.0 eller senare"
+
+#, python-format
+msgid "revision %s does not exist in subrepo %s\n"
+msgstr "revisionen %s existerar inte i underarkivet %s\n"
+
+#, python-format
+msgid "checking out detached HEAD in subrepo %s\n"
+msgstr "hämtar ut löst HEAD i underarkivet %s\n"
+
+msgid "check out a git branch if you intend to make changes\n"
+msgstr "hämta ut en git-gren om du tänker göra ändringer\n"
+
+#, python-format
+msgid "subrepo %s is missing"
+msgstr "underarkivet %s saknas"
+
+#, python-format
+msgid "unrelated git branch checked out in subrepo %s\n"
+msgstr "obesläktar git-gren hämtar i underarkivet %s\n"
+
+#, python-format
+msgid "pushing branch %s of subrepo %s\n"
+msgstr "trycker grenen %s från underarkivet %s\n"
+
+#, python-format
+msgid ""
+"no branch checked out in subrepo %s\n"
+"cannot push revision %s\n"
+msgstr ""
+"ingen gren uthämtar i underarkivet %s\n"
+"kan inte trycka revison %s\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr "%s, rad %s: %s\n"
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid ".hg/cache/tags is corrupt, rebuilding it\n"
+msgstr ".hg/cache/tags är korrupt, bygger om den\n"
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ""
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ""
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ""
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ""
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+
+msgid ""
+":person: Any text. Returns the name before an email address,\n"
+" interpreting it as per RFC 5322."
+msgstr ""
+
+msgid ""
+" >>> person('foo@bar')\n"
+" 'foo'\n"
+" >>> person('Foo Bar <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo Bar\" <foo@bar>')\n"
+" 'Foo Bar'\n"
+" >>> person('\"Foo \"buz\" Bar\" <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> # The following are invalid, but do exist in real-life\n"
+" ...\n"
+" >>> person('Foo \"buz\" Bar <foo@bar>')\n"
+" 'Foo \"buz\" Bar'\n"
+" >>> person('\"Foo Bar <foo@bar>')\n"
+" 'Foo Bar'"
+msgstr ""
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+":shortbisect: Any text. Treats `text` as a bisection status, and\n"
+" returns a single-character representing the status (G: good, B: bad,\n"
+" S: skipped, U: untested, I: ignored). Returns single space if `text`\n"
+" is not a valid bisection status."
+msgstr ""
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ""
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+
+msgid ""
+":user: Any text. Returns a short representation of a user name or email\n"
+" address."
+msgstr ""
+
+msgid ":emailuser: Any text. Returns the user portion of an email address."
+msgstr ""
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ""
+
+msgid ":bisect: String. The changeset bisection status."
+msgstr ""
+
+msgid ""
+":branch: String. The name of the branch on which the changeset was\n"
+" committed."
+msgstr ""
+
+msgid ""
+":branches: List of strings. The name of the branch on which the\n"
+" changeset was committed. Will be empty if the branch name was\n"
+" default."
+msgstr ""
+
+msgid ""
+":bookmarks: List of strings. Any bookmarks associated with the\n"
+" changeset."
+msgstr ""
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ""
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ""
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ""
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ""
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ""
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ""
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+
+msgid ":phase: String. The changeset phase name."
+msgstr ""
+
+msgid ":phaseidx: Integer. The changeset phase index."
+msgstr ""
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ""
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ""
+
+msgid ""
+":parents: List of strings. The parents of the changeset in \"rev:node\"\n"
+" format. If the changeset has only one \"natural\" parent (the "
+"predecessor\n"
+" revision) nothing is shown."
+msgstr ""
+
+#, python-format
+msgid "unknown method '%s'"
+msgstr "okänd metod '%s'"
+
+msgid "expected a symbol"
+msgstr "förväntade en symbol"
+
+#, python-format
+msgid "unknown function '%s'"
+msgstr "okänd funktion '%s'"
+
+msgid "expected template specifier"
+msgstr "förväntade mallspecifikation"
+
+#, python-format
+msgid "filter %s expects one argument"
+msgstr "filtret %s kräver ett argument"
+
+msgid "unmatched quotes"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" not in template map"
+msgstr "\"%s\" finns inte i mallistan"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr ""
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr ""
+
+msgid "transaction abort!\n"
+msgstr ""
+
+msgid "rollback completed\n"
+msgstr ""
+
+msgid "rollback failed - please run hg recover\n"
+msgstr ""
+
+msgid "already have changeset "
+msgstr "har redan ändringen "
+
+#, python-format
+msgid "not trusting file %s from untrusted user %s, group %s\n"
+msgstr "litar inte på filen %s från opålitlig användare %s, grupp %s\n"
+
+#, python-format
+msgid "ignored: %s\n"
+msgstr "ignorerad: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr "(föråldrad '%%' i sökvägen %s=%s från %s)\n"
+
+#, python-format
+msgid "%s.%s is not a boolean ('%s')"
+msgstr "%s.%s är inte booleskt ('%s')"
+
+#, python-format
+msgid "%s.%s is not an integer ('%s')"
+msgstr "%s.%s är inte ett heltal ('%s')"
+
+msgid "enter a commit username:"
+msgstr ""
+
+#, python-format
+msgid "no username found, using '%s' instead\n"
+msgstr "inget användarnamn hittades, använder '%s' istället\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "inget användarnamn angivet (se \"hg help config\")"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr ""
+
+msgid "response expected"
+msgstr ""
+
+msgid "unrecognized response\n"
+msgstr ""
+
+msgid "password: "
+msgstr "lösenord: "
+
+msgid "http authorization required"
+msgstr "http-autenticiering krävs"
+
+msgid "http authorization required\n"
+msgstr "http-autenticiering krävs\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "realm: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "användare: %s\n"
+
+msgid "user:"
+msgstr "användare:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "http-auth: användare %s, lösenord %s\n"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "kommandot '%s' misslyckades: %s"
+
+#, python-format
+msgid "filename contains '%s', which is reserved on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename contains %r, which is invalid on Windows"
+msgstr ""
+
+#, python-format
+msgid "filename ends with '%s', which is not allowed on Windows"
+msgstr ""
+
+msgid "check your clock"
+msgstr "kontrollera din klocka"
+
+#, python-format
+msgid "negative timestamp: %d"
+msgstr "negativ tidsstämpel: %d"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "ogiltigt datum: %r"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "datum överskrider 32 bitar: %d"
+
+#, python-format
+msgid "negative date value: %d"
+msgstr "negativt datumvärde: %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr "omöjlig tidzonsoffset: %d"
+
+msgid "dates cannot consist entirely of whitespace"
+msgstr "datum kan inte bara bestå av blanktecken"
+
+msgid "invalid day spec, use '<DATE'"
+msgstr ""
+
+msgid "invalid day spec, use '>DATE'"
+msgstr ""
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr ""
+
+#, python-format
+msgid "%s must be nonnegative (see 'hg help dates')"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr "%.0f GB"
+
+#, python-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#, python-format
+msgid "%.2f GB"
+msgstr "%.2f GB"
+
+#, python-format
+msgid "%.0f MB"
+msgstr "%.0f MB"
+
+#, python-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#, python-format
+msgid "%.2f MB"
+msgstr "%.2f MB"
+
+#, python-format
+msgid "%.0f KB"
+msgstr "%.0f KB"
+
+#, python-format
+msgid "%.1f KB"
+msgstr "%.1f KB"
+
+#, python-format
+msgid "%.2f KB"
+msgstr "%.2f KB"
+
+#, python-format
+msgid "%.0f bytes"
+msgstr "%.0f bytes"
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr ""
+
+msgid "file:// URLs can only refer to localhost"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr ""
+
+msgid "interrupted"
+msgstr ""
+
+#, python-format
+msgid "empty or missing %s"
+msgstr ""
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr ""
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr ""
+
+#, python-format
+msgid " (expected %s)"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "checking parents of %s"
+msgstr ""
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr ""
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "arkivet använder revlog-format %d\n"
+
+msgid "checking changesets\n"
+msgstr "kontrollerar ändringar\n"
+
+msgid "checking"
+msgstr "kontrollerar"
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "packar upp ändringen %s"
+
+msgid "checking manifests\n"
+msgstr "kontrollerar manifest\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s inte i ändringarna"
+
+msgid "file without name in manifest"
+msgstr "fil utan namn i manifest"
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "läser manifestdelta %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "korskontrollerar filer i ändringar och manifest\n"
+
+msgid "crosschecking"
+msgstr "korskontrollerar"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "ändring refererar till okänt manifest %s"
+
+msgid "in changeset but not in manifest"
+msgstr "i ändring men inte i manifest"
+
+msgid "in manifest but not in changeset"
+msgstr "i manifest men inte i ändring"
+
+msgid "checking files\n"
+msgstr "kontrollerar filer\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "kan inte avkoda filnamnet '%s'"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr "skadad revlog! (%s)"
+
+msgid "missing revlog!"
+msgstr "saknad revlog!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s inte i manifest"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr "uppackad storlek är %s, %s förväntades"
+
+#, python-format
+msgid "unpacking %s"
+msgstr "packar upp %s"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "varning: kopieringskällan för '%s' inte i föräldrar till %s"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr "tom eller saknar kopieringskälla för revlog %s:%s"
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr "varning: %s@%s: kopieringskällrevision är nullid %s:%s\n"
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "kontrollerar namnbytet på %s"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s i manifest hittades inte"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "varning: övergiven revlog '%s'"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d filer, %d ändringar, %d totala revisioner\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "%d varningar påträffades!\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "%d integritetsfel påträffades!\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(första skadade ändringen verkar vara %d)\n"
+
+msgid "look up remote revision"
+msgstr "söker fjärrevision"
+
+msgid "push failed (unexpected response):"
+msgstr "tryckning misslyckades (oväntat svar):"
+
+msgid "look up remote changes"
+msgstr "söker fjärrändringar"
+
+msgid "push failed:"
+msgstr "tryckning misslyckades:"
diff --git a/i18n/zh_CN.po b/i18n/zh_CN.po
new file mode 100644
index 0000000..ff5722a
--- /dev/null
+++ b/i18n/zh_CN.po
@@ -0,0 +1,11357 @@
+# Chinese (simplified) translation for Mercurial
+# This file is distributed under the same license as Mercurial
+#
+# Copyright (C) 2009 the Mercurial team
+# Dongsheng Song <dongsheng.song@gmail.com>, 2009
+#
+# Update with pot file:
+# msgmerge --update zh_CN.po hg.pot
+# msgfmt --statistics -c zh_CN.po
+#
+# Please test your translation before commit:
+# python setup.py build_py -c -d . build_ext -i build_mo
+# LC_ALL=zh_CN.UTF-8 ./hg
+#
+# Please format your translation before commit:
+# msgcat --width=80 --sort-by-file -o zh_CN_new.po zh_CN.po
+# mv -f zh_CN_new.po zh_CN.po
+#
+# Please remove '#: filename:line' lines before submit to hg:
+# msgcat --width=80 --no-location -o zh_CN_new.po zh_CN.po
+# mv -f zh_CN_new.po zh_CN.po
+#
+# Dictionary:
+# blame 追溯
+# branch 分支
+# changes 修改
+# changeset 修改集
+# checkout 检出
+# remove 移除(从版本库删除)
+# delete 删除(åªä»Žæ–‡ä»¶ç³»ç»Ÿåˆ é™¤)
+# patchset è¡¥ä¸é›†
+# pushing to 推到
+# pulling from 拉自
+# rename 改å
+# repository 版本库
+# revert æ¢å¤
+# revision 版本
+# tag 标签
+# tip 顶点
+# undo 撤销
+# unversioned 未版本控制
+# versioned å—版本控制
+# working copy 工作副本
+# ...
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial 1.3\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2009-10-19 11:47+0800\n"
+"PO-Revision-Date: 2009-03-31 20:38+0200\n"
+"Last-Translator: Dongsheng Song <dongsheng.song@gmail.com>\n"
+"Language-Team: Chinese translation team <i18n-zh@googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"Generated-By: pygettext.py 1.5\n"
+"X-Poedit-Country: CHINA\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr " (默认: %s)"
+
+msgid "OPTIONS"
+msgstr "选项"
+
+msgid "COMMANDS"
+msgstr "命令"
+
+msgid " options:"
+msgstr " 选项:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr " 别å: %s"
+
+msgid "hooks for controlling repository access"
+msgstr ""
+
+msgid ""
+"This hook makes it possible to allow or deny write access to portions\n"
+"of a repository when receiving incoming changesets."
+msgstr ""
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than\n"
+"pushing or pulling. The hook is not safe to use if users have\n"
+"interactive shell access, as they can then disable the hook.\n"
+"Nor is it safe if remote users share an account, because then there\n"
+"is no way to distinguish them."
+msgstr ""
+
+msgid "To use this hook, configure the acl extension in your hgrc like this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" acl ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Check whether the source of incoming changes is in this list\n"
+" # (\"serve\" == ssh or http, \"push\", \"pull\", \"bundle\")\n"
+" sources = serve"
+msgstr ""
+
+msgid ""
+"The allow and deny sections take a subtree pattern as key (with a glob\n"
+"syntax by default), and a comma separated list of users as the\n"
+"corresponding value. The deny list is checked before the allow list\n"
+"is. ::"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # If acl.allow is not present, all users are allowed by default.\n"
+" # An empty acl.allow section means no users allowed.\n"
+" docs/** = doc_writer\n"
+" .hgtags = release_engineer"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # If acl.deny is not present, no users are refused by default.\n"
+" # An empty acl.deny section means all users allowed.\n"
+" glob pattern = user4, user5\n"
+" ** = user6\n"
+msgstr ""
+
+#, python-format
+msgid "acl: %s not enabled\n"
+msgstr "acl: 未å¯ç”¨ %s\n"
+
+#, python-format
+msgid "acl: %s enabled, %d entries for user %s\n"
+msgstr "acl: å·²å¯ç”¨ %s, %d 项,用户 %s\n"
+
+#, python-format
+msgid "config error - hook type \"%s\" cannot stop incoming changesets"
+msgstr "é…置错误 - é’©å­ç±»åž‹ \"%s\" ä¸èƒ½ç»ˆæ­¢è¿›å…¥çš„修改集"
+
+#, python-format
+msgid "acl: changes have source \"%s\" - skipping\n"
+msgstr "acl: 改å˜æº \"%s\" - 跳过\n"
+
+#, python-format
+msgid "acl: user %s denied on %s\n"
+msgstr "acl: 用户 %s 被拒ç»è®¿é—® %s\n"
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr "acl: æ‹’ç»è®¿é—®ä¿®æ”¹é›† %s"
+
+#, python-format
+msgid "acl: user %s not allowed on %s\n"
+msgstr "acl: 用户 %s 被拒ç»è®¿é—® %s\n"
+
+#, python-format
+msgid "acl: allowing changeset %s\n"
+msgstr "acl: å…许修改集 %s\n"
+
+msgid "track a line of development with movable markers"
+msgstr ""
+
+msgid ""
+"Bookmarks are local movable markers to changesets. Every bookmark\n"
+"points to a changeset identified by its hash. If you commit a\n"
+"changeset that is based on a changeset that has a bookmark on it, the\n"
+"bookmark shifts to the new changeset."
+msgstr ""
+
+msgid ""
+"It is possible to use bookmark names in every revision lookup (e.g. hg\n"
+"merge, hg update)."
+msgstr ""
+
+msgid ""
+"By default, when several bookmarks point to the same changeset, they\n"
+"will all move forward together. It is possible to obtain a more\n"
+"git-like experience by adding the following configuration option to\n"
+"your .hgrc::"
+msgstr ""
+
+msgid ""
+" [bookmarks]\n"
+" track.current = True"
+msgstr ""
+
+msgid ""
+"This will cause Mercurial to track the bookmark that you are currently\n"
+"using, and only update it. This is similar to git's approach to\n"
+"branching.\n"
+msgstr ""
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in 'hg merge' and\n"
+" 'hg update' to merge and update respectively to a given bookmark."
+msgstr ""
+
+msgid ""
+" You can use 'hg bookmark NAME' to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision.\n"
+" "
+msgstr ""
+
+msgid "a bookmark of this name does not exist"
+msgstr ""
+
+msgid "a bookmark of the same name already exists"
+msgstr ""
+
+msgid "new bookmark name required"
+msgstr ""
+
+msgid "bookmark name required"
+msgstr ""
+
+msgid "bookmark name cannot contain newlines"
+msgstr ""
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr ""
+
+msgid "force"
+msgstr "强制"
+
+msgid "revision"
+msgstr "版本"
+
+msgid "delete a given bookmark"
+msgstr "删除指定书签"
+
+msgid "rename a given bookmark"
+msgstr "改å指定书签"
+
+msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]"
+msgstr ""
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The hook does not change\n"
+"bug status."
+msgstr ""
+
+msgid ""
+"The hook updates the Bugzilla database directly. Only Bugzilla\n"
+"installations using MySQL are supported."
+msgstr ""
+
+msgid ""
+"The hook relies on a Bugzilla script to send bug change notification\n"
+"emails. That script changes between Bugzilla versions; the\n"
+"'processmail' script used prior to 2.18 is replaced in 2.18 and\n"
+"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n"
+"be run by Mercurial as the user pushing the change; you will need to\n"
+"ensure the Bugzilla install file permissions are set appropriately."
+msgstr ""
+
+msgid ""
+"The extension is configured through three different configuration\n"
+"sections. These keys are recognized in the [bugzilla] section:"
+msgstr ""
+
+msgid ""
+"host\n"
+" Hostname of the MySQL server holding the Bugzilla database."
+msgstr ""
+
+msgid ""
+"db\n"
+" Name of the Bugzilla database in MySQL. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"user\n"
+" Username to use to access MySQL server. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"version\n"
+" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n"
+" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n"
+" to 2.18."
+msgstr ""
+
+msgid ""
+"bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" '/var/www/html/bugzilla'."
+msgstr ""
+
+msgid ""
+"notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n"
+" and 'user' (committer bugzilla email). Default depends on version;\n"
+" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n"
+" %(id)s %(user)s\"."
+msgstr ""
+
+msgid ""
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies::"
+msgstr ""
+
+msgid ""
+" {bug} The Bugzilla bug ID.\n"
+" {root} The full pathname of the Mercurial repository.\n"
+" {webroot} Stripped pathname of the Mercurial repository.\n"
+" {hgweb} Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'"
+msgstr ""
+
+msgid ""
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0."
+msgstr ""
+
+msgid ""
+"usermap\n"
+" Path of file containing Mercurial committer ID to Bugzilla user ID\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section."
+msgstr ""
+
+msgid ""
+"The [usermap] section is used to specify mappings of Mercurial\n"
+"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n"
+"\"committer\"=\"Bugzilla user\""
+msgstr ""
+
+msgid "Finally, the [web] section supports one entry:"
+msgstr ""
+
+msgid ""
+"baseurl\n"
+" Base URL for browsing Mercurial repositories. Reference from\n"
+" templates as {hgweb}."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configuration:"
+msgstr ""
+
+msgid ""
+"This example configuration is for a collection of Mercurial\n"
+"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n"
+"installation in /opt/bugzilla-3.2. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+msgstr ""
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+
+msgid "Commits add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "连接到 %s:%s as %sï¼Œå¯†ç  %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "查询: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "查询失败: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "未知的数æ®åº“方案"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr ""
+
+msgid "telling bugzilla to send mail:\n"
+msgstr ""
+
+#, python-format
+msgid " bug %s\n"
+msgstr ""
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr ""
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr ""
+
+msgid "done\n"
+msgstr "完æˆ\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr ""
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr ""
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr ""
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr ""
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "database error: %s"
+msgstr ""
+
+msgid "command to display child changesets"
+msgstr "列出å­ä¿®æ”¹é›†çš„命令"
+
+#, fuzzy
+msgid "show the children of the given or working directory revision"
+msgstr "显示工作目录或指定版本的父亲"
+
+#, fuzzy
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" 显示工作目录的父亲版本。如果使用 '--rev' 指定版本,就显示此版本的\n"
+" 父亲。如果指定了文件,那么使用此文件最åŽä¿®æ”¹çš„版本(工作目录的起æº\n"
+" 版本,或 '--rev' 指定的版本)。\n"
+" "
+
+msgid "show children of the specified revision"
+msgstr "显示指定版本的å­å­™"
+
+msgid "hg children [-r REV] [FILE]"
+msgstr ""
+
+msgid "command to display statistics about repository history"
+msgstr ""
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr ""
+
+#, python-format
+msgid "generating stats: %d%%"
+msgstr ""
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "assuming %i character terminal\n"
+msgstr ""
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+#, fuzzy
+msgid "count rate for revisions matching date spec"
+msgstr "显示匹é…日期的版本"
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "show progress"
+msgstr ""
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [--progress] [FILE]"
+msgstr ""
+
+msgid "colorize output from some commands"
+msgstr ""
+
+msgid ""
+"This extension modifies the status command to add color to its output\n"
+"to reflect file status, the qseries command to add color to reflect\n"
+"patch status (applied, unapplied, missing), and to diff-related\n"
+"commands to highlight additions, removals, diff headers, and trailing\n"
+"whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. Effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes). This module also provides the\n"
+"render_text function, which can be used to add effects to any text."
+msgstr ""
+
+msgid "Default effects may be overridden from the .hgrc file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background\n"
+msgstr ""
+
+msgid "when to colorize (always, auto, or never)"
+msgstr ""
+
+msgid "don't colorize output"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr ""
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with '-hg' appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If <REVMAP> isn't given, it will be put in a default location\n"
+" (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file\n"
+" that maps each source commit ID to the destination ID for that\n"
+" revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so convert-repo can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The [username mapping] file is a simple text file that maps each\n"
+" source commit author to a destination commit author. It is handy\n"
+" for source SCMs that use unix logins to identify authors (eg:\n"
+" CVS). One line per author mapping and the line format is:\n"
+" srcauthor=whatever string you want"
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Comment lines start with '#'. Each line can\n"
+" contain one of the following directives::"
+msgstr ""
+
+msgid " include path/to/file"
+msgstr ""
+
+msgid " exclude path/to/file"
+msgstr ""
+
+msgid " rename from/file to/file"
+msgstr ""
+
+msgid ""
+" The 'include' directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The 'exclude' directive causes files or directories to\n"
+" be omitted. The 'rename' directive renames a file or directory. To\n"
+" rename from a subdirectory into the root of the repository, use\n"
+" '.' as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values. The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form \"original_branch_name new_branch_name\".\n"
+" \"original_branch_name\" is the name of the branch in the source\n"
+" repository, and \"new_branch_name\" is the name of the branch is the\n"
+" destination repository. This can be used to (for instance) move code\n"
+" in one repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ----------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.ignoreerrors=False (boolean)\n"
+" ignore integrity errors when reading. Use it to fix Mercurial\n"
+" repositories with missing revlogs, by converting from and to\n"
+" Mercurial.\n"
+" --config convert.hg.saverev=False (boolean)\n"
+" store original revision ID in changeset (forces target IDs to\n"
+" change)\n"
+" --config convert.hg.startrev=0 (hg revision identifier)\n"
+" convert start revision and its descendants"
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ----------"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is :local:. The conversion uses the top level directory\n"
+" in the sandbox to find the CVS repository, and then uses CVS rlog\n"
+" commands to find files to convert. This means that unless a\n"
+" filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid ""
+" Because CVS does not have changesets, it is necessary to collect\n"
+" individual commits to CVS and merge them into changesets. CVS\n"
+" source uses its internal changeset merging code by default but can\n"
+" be configured to call the external 'cvsps' program by setting::"
+msgstr ""
+
+msgid " --config convert.cvsps='cvsps -A -u --cvs-direct -q'"
+msgstr ""
+
+msgid " This option is deprecated and will be removed in Mercurial 1.4."
+msgstr ""
+
+msgid " The options shown are the defaults."
+msgstr ""
+
+msgid " Internal cvsps is selected by setting ::"
+msgstr ""
+
+msgid " --config convert.cvsps=builtin"
+msgstr ""
+
+msgid " and has a few more configurable options:"
+msgstr ""
+
+msgid ""
+" --config convert.cvsps.cache=True (boolean)\n"
+" Set to False to disable remote log caching, for testing and\n"
+" debugging purposes.\n"
+" --config convert.cvsps.fuzz=60 (integer)\n"
+" Specify the maximum time (in seconds) that is allowed between\n"
+" commits with identical user and log message in a single\n"
+" changeset. When very large files were checked in as part of a\n"
+" changeset then the default may not be long enough.\n"
+" --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" insert a dummy revision merging the branch on which this log\n"
+" message occurs to the branch indicated in the regex.\n"
+" --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" add the most recent revision on the branch indicated in the\n"
+" regex as the second parent of the changeset."
+msgstr ""
+
+msgid ""
+" The hgext/convert/cvsps wrapper script allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" -----------------"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied \"svn://repo/path/\" source URL is\n"
+" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n"
+" replaces the default branch. If \"svn://repo/path/branches\" exists,\n"
+" its subdirectories are listed as possible branches. If\n"
+" \"svn://repo/path/tags\" exists, it is looked for tags referencing\n"
+" converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n"
+" can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid ""
+" --config convert.svn.branches=branches (directory name)\n"
+" specify the directory containing branches\n"
+" --config convert.svn.tags=tags (directory name)\n"
+" specify the directory containing tags\n"
+" --config convert.svn.trunk=trunk (directory name)\n"
+" specify the name of the trunk branch"
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" --config convert.svn.startrev=0 (svn revision number)\n"
+" specify start Subversion revision."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" ---------------"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ...-hg."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision."
+msgstr ""
+
+msgid ""
+" --config convert.p4.startrev=0 (perforce changelist number)\n"
+" specify initial Perforce revision."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" ---------------------"
+msgstr ""
+
+msgid ""
+" --config convert.hg.clonebranches=False (boolean)\n"
+" dispatch source branches in separate clones.\n"
+" --config convert.hg.tagsbranch=default (branch name)\n"
+" tag revisions branch name\n"
+" --config convert.hg.usebranchnames=True (boolean)\n"
+" preserve branch names"
+msgstr ""
+
+msgid " "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr ""
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr ""
+
+msgid "warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr ""
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr ""
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr ""
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr ""
+
+#, python-format
+msgid "running: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s error:\n"
+msgstr ""
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr ""
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr ""
+
+#, python-format
+msgid "convert: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr ""
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "未知排åºæ–¹å¼: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr ""
+
+msgid "not all revisions were sorted"
+msgstr ""
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr ""
+
+msgid "sorting...\n"
+msgstr ""
+
+msgid "converting...\n"
+msgstr ""
+
+#, python-format
+msgid "source: %s\n"
+msgstr ""
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr ""
+
+msgid "--sourcesort is not supported by this data source"
+msgstr ""
+
+msgid "warning: support for external cvsps is deprecated and will be removed in Mercurial 1.4\n"
+msgstr ""
+
+#, python-format
+msgid "revision %s is not a patchset number or date"
+msgstr ""
+
+msgid "using builtin cvsps\n"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr ""
+
+msgid "CVS pserver authentication failed"
+msgstr ""
+
+#, python-format
+msgid "unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr ""
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr ""
+
+msgid "collecting CVS rlog\n"
+msgstr ""
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr ""
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr ""
+
+#, python-format
+msgid "running %s\n"
+msgstr ""
+
+#, python-format
+msgid "prefix=%r directory=%r root=%r\n"
+msgstr ""
+
+msgid "RCS file must be followed by working file"
+msgstr ""
+
+msgid "must have at least some revisions"
+msgstr ""
+
+msgid "expected revision number"
+msgstr ""
+
+msgid "revision must be followed by date line"
+msgstr ""
+
+#, python-format
+msgid "found synthetic revision in %s: %r\n"
+msgstr "%s 有伪造版本: %r\n"
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d log entries\n"
+msgstr ""
+
+msgid "creating changesets\n"
+msgstr ""
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr ""
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr ""
+
+msgid "Python ElementTree module is not available"
+msgstr ""
+
+#, python-format
+msgid "cleaning up %s\n"
+msgstr ""
+
+msgid "internal calling inconsistency"
+msgstr ""
+
+msgid "errors in filemap"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr ""
+
+msgid "source repository doesn't support --filemap"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a GNU Arch repo"
+msgstr ""
+
+msgid "cannot find a GNU Arch tool"
+msgstr ""
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr ""
+
+#, python-format
+msgid "tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "applying revision %s...\n"
+msgstr ""
+
+#, python-format
+msgid "computing changeset between %s and %s...\n"
+msgstr ""
+
+#, python-format
+msgid "obtaining revision %s...\n"
+msgstr ""
+
+#, python-format
+msgid "analyzing revision %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repo"
+msgstr "%s ä¸æ˜¯æœ¬åœ°çš„水银版本库"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr "åˆå§‹åŒ–目标版本库 %s\n"
+
+msgid "run hg sink pre-conversion action\n"
+msgstr "执行动作 hg sink pre-conversion\n"
+
+msgid "run hg sink post-conversion action\n"
+msgstr "执行动作 hg sink post-conversion action\n"
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr "自 %s 拉到 %s\n"
+
+msgid "filtering out empty revision\n"
+msgstr ""
+
+msgid "updating tags\n"
+msgstr "正在更新标签\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s ä¸æ˜¯æœ‰æ•ˆçš„开始版本"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "忽略: %s\n"
+
+msgid "run hg source pre-conversion action\n"
+msgstr "执行动作 hg source pre-conversion\n"
+
+msgid "run hg source post-conversion action\n"
+msgstr "执行动作 hg source post-conversion\n"
+
+#, python-format
+msgid "%s does not look like a monotone repo"
+msgstr "%s ä¸åƒæ˜¯å•çº¯çš„ monotone 版本库"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr "从已改å的目录 '%s' å¤åˆ¶æ–‡ä»¶åˆ° '%s'"
+
+msgid "reading p4 views\n"
+msgstr ""
+
+msgid "collecting p4 changelists\n"
+msgstr "正在æœç´¢ p4 修改集\n"
+
+msgid "Subversion python bindings could not be loaded"
+msgstr "ä¸èƒ½åŠ è½½ svn çš„ python 绑定"
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr "å‘现 svn çš„ python 绑定版本 %d.%dï¼Œéœ€è¦ 1.4 或更新的版本"
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr "svn çš„ python ç»‘å®šå¤ªæ—§ï¼Œéœ€è¦ 1.4 或更新的版本"
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn: 版本 %s ä¸æ˜¯æ•´æ•°"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn: 开始版本 %s ä¸æ˜¯æ•´æ•°"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "æ²¡æœ‰åœ¨æ¨¡å— %s 中å‘现版本"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr "期望 %s ä½äºŽ %r,但是没有å‘现"
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "å‘现 %s ä½äºŽ %r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "忽略空的分支 %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "å‘现分支 %s ä½äºŽ %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr "svn: 在给出多于一个分支时ä¸æ”¯æŒå¼€å§‹ç‰ˆæœ¬"
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr "svn: 在开始版本 %d 之åŽæ²¡æœ‰ç‰ˆæœ¬"
+
+#, python-format
+msgid "no tags found at revision %d\n"
+msgstr "在版本 %d 没有å‘现标签\n"
+
+#, python-format
+msgid "ignoring foreign branch %r\n"
+msgstr "忽略外部分支 %r\n"
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr "没有å‘现 %s,一直到版本 %d"
+
+#, python-format
+msgid "branch renamed from %s to %s at %d\n"
+msgstr "分支从 %s 改å为 %s,在 %d\n"
+
+#, python-format
+msgid "reparent to %s\n"
+msgstr ""
+
+#, python-format
+msgid "copied to %s from %s@%s\n"
+msgstr "å¤åˆ¶åˆ° %s,自 %s@%s\n"
+
+#, python-format
+msgid "gone from %s\n"
+msgstr "离开 %s\n"
+
+#, python-format
+msgid "entry %s\n"
+msgstr "å…¥å£ %s\n"
+
+#, python-format
+msgid "unknown path in revision %d: %s\n"
+msgstr "版本 %d 有未知路径: %s\n"
+
+#, python-format
+msgid "mark %s came from %s:%d\n"
+msgstr "标记 %s æ¥è‡ª %s:%d\n"
+
+#, python-format
+msgid "parsing revision %d (%d changes)\n"
+msgstr "解æžç‰ˆæœ¬ %d (%d 个改å˜)\n"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr "å‘现分支 %s 的父亲,在 %d: %s\n"
+
+msgid "no copyfrom path, don't know what to do.\n"
+msgstr "没有 copyfrom 路径,ä¸çŸ¥é“该怎么办。\n"
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr "为 \"%s\" 获å–版本日志,自 %d 到 %d\n"
+
+#, python-format
+msgid "revision %d has no entries\n"
+msgstr "版本 %d 没有入å£\n"
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn: 分支没有版本 %s"
+
+#, python-format
+msgid "%r is not under %r, ignoring\n"
+msgstr "%r ä¸åœ¨ %r 之下,忽略之\n"
+
+#, python-format
+msgid "initializing svn repo %r\n"
+msgstr "åˆå§‹åŒ– svn 版本库 %r\n"
+
+#, python-format
+msgid "initializing svn wc %r\n"
+msgstr "åˆå§‹åŒ– svn 工作副本 %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "æ„外的 svn 输出:\n"
+
+msgid "unable to cope with svn output"
+msgstr "ä¸èƒ½å¤„ç† svn 的输出"
+
+msgid "XXX TAGS NOT IMPLEMENTED YET\n"
+msgstr ""
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows to configure new diff commands, so\n"
+"you do not need to type \"hg extdiff -p kdiff3\" always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal \"hg\n"
+"diff\" command. The extdiff extension makes snapshots of only needed\n"
+"files, so running the external diff program will actually be pretty\n"
+"fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "ä¸èƒ½åŒæ—¶æŒ‡å®š '--rev' å’Œ '--change'"
+
+#, python-format
+msgid "running %r in %s\n"
+msgstr ""
+
+#, python-format
+msgid "file changed while diffing. Overwriting: %s (src: %s)\n"
+msgstr ""
+
+msgid "cleaning up temp directory\n"
+msgstr ""
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "change made by revision"
+msgstr "此版本的修改"
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr ""
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using the\n"
+" %(path)s program."
+msgstr ""
+
+#, python-format
+msgid ""
+" When two revision arguments are given, then changes are shown between\n"
+" those revisions. If only one revision is specified then that revision is\n"
+" compared to the working directory, and, when no revisions are specified,\n"
+" the working directory files are compared to its parent."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "pull, update and merge in one command"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid ""
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+
+msgid "outstanding uncommitted merge"
+msgstr ""
+
+msgid "outstanding uncommitted changes"
+msgstr ""
+
+msgid "working directory is missing some files"
+msgstr ""
+
+msgid "multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "正在拉自 %s\n"
+
+msgid "Other repository doesn't support revision lookup, so a rev cannot be specified."
+msgstr ""
+
+#, python-format
+msgid "not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr "新修改集 '%d:%s' 将远程修改与本地åˆå¹¶\n"
+
+msgid "a specific revision you would like to pull"
+msgstr "指定å–得的版本"
+
+msgid "edit commit message"
+msgstr "编辑æ交日志"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr "编辑æ交日志(ä¸èµžæˆ)"
+
+msgid "switch parents when merging"
+msgstr "当åˆå¹¶æ—¶åˆ‡æ¢çˆ¶äº²"
+
+msgid "hg fetch [SOURCE]"
+msgstr "hg fetch [SOURCE]"
+
+msgid "commands to sign and verify changesets"
+msgstr "签署和校验修改集的命令"
+
+msgid "error while verifying signature"
+msgstr ""
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr ""
+
+msgid "list signed changesets"
+msgstr ""
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr ""
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr ""
+
+msgid "add a signature for the current or given revision"
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+
+msgid "Error while signing"
+msgstr ""
+
+msgid "working copy of .hgsigs is changed (please commit .hgsigs manually or use --force)"
+msgstr ""
+
+msgid "unknown signature version"
+msgstr ""
+
+msgid "make the signature local"
+msgstr ""
+
+msgid "sign even if the sigfile is modified"
+msgstr ""
+
+msgid "do not commit the sigfile after signing"
+msgstr ""
+
+msgid "the key id to sign with"
+msgstr ""
+
+msgid "commit message"
+msgstr ""
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr ""
+
+msgid "hg sigcheck REVISION"
+msgstr ""
+
+msgid "hg sigs"
+msgstr ""
+
+msgid "command to view revision graphs from a shell"
+msgstr ""
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "--graph option is incompatible with --%s"
+msgstr ""
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr ""
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr ""
+
+msgid "no changes found\n"
+msgstr "没有å‘现修改\n"
+
+msgid "show the revision DAG"
+msgstr "显示版本分支图"
+
+msgid "limit number of changes displayed"
+msgstr "é™åˆ¶æ˜¾ç¤ºçš„修改集数é‡"
+
+msgid "show patch"
+msgstr "显示补ä¸"
+
+msgid "show the specified revision or range"
+msgstr ""
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr ""
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "cia: no user specified"
+msgstr ""
+
+msgid "cia: no project specified"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The hg view command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your .hgrc file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr ""
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr ""
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr ""
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr ""
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr ""
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr ""
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr ""
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr ""
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr ""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr "为此版本库å¯åŠ¨æœåŠ¡ 'inotify'"
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr "在åŽå°è¿è¡ŒæœåŠ¡"
+
+msgid "used internally by daemon mode"
+msgstr "在åŽå°æœåŠ¡æ¨¡å¼å†…部使用"
+
+msgid "minutes to sit idle before exiting"
+msgstr "空闲几分钟åŽé€€å‡º"
+
+msgid "name of file to write process ID to"
+msgstr "写入进程标识符的文件å称"
+
+msgid "hg inserve [OPTION]..."
+msgstr ""
+
+msgid "(found dead inotify server socket; removing it)\n"
+msgstr ""
+
+msgid "(starting inotify server)\n"
+msgstr ""
+
+#, python-format
+msgid "could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "could not talk to new inotify server: %s\n"
+msgstr ""
+
+msgid "(inotify server not running)\n"
+msgstr ""
+
+#, python-format
+msgid "failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr ""
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s dirstate reload\n"
+msgstr ""
+
+#, python-format
+msgid "%s end dirstate reload\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+#, python-format
+msgid "could not start server: %s"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword] and [keywordmaps] sections of\n"
+"hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+"NOTE: the more specific you are in your filename patterns the less you\n"
+"lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run \"hg kwdemo\". See \"hg help templates\" for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid ""
+"An additional date template filter {date|utcdate} is provided. It\n"
+"returns a date like \"2006/09/18 15:13:13\"."
+msgstr ""
+
+msgid ""
+"The default template mappings (view with \"hg kwdemo -d\") can be\n"
+"replaced with customized keywords and templates. Again, run \"hg\n"
+"kwdemo\" to control the results of your config changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, run \"hg kwshrink\" to avoid\n"
+"the risk of inadvertently storing expanded keywords in the change\n"
+"history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+"\"hg kwexpand\"."
+msgstr ""
+
+msgid ""
+"Also, when committing with the record extension or using mq's qrecord,\n"
+"be aware that keywords cannot be updated. Again, run \"hg kwexpand\" on\n"
+"the files in question to update keyword expansions after all changes\n"
+"have been checked in."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See \"hg help templates\" for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr "正在创建临时版本库 %s\n"
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default keyword template maps\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr "\tç¦ç”¨å½“å‰æ¨¡ç‰ˆæ˜ å°„\n"
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "unhooked all commit hooks\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"removing temporary repository %s\n"
+msgstr ""
+"\n"
+"正在删除临时版本库 %s\n"
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See \"hg help keyword\" on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid " Use -u/--untracked to list untracked files as well."
+msgstr ""
+
+msgid ""
+" With -a/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (untracked)\n"
+" I = ignored\n"
+" i = ignored (untracked)\n"
+" "
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid ""
+" Run before changing/disabling active keywords or if you experience\n"
+" problems with \"hg import\" or \"hg merge\"."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "additionally show untracked files"
+msgstr ""
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr ""
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+
+msgid "Common tasks (use \"hg help command\" for more details)::"
+msgstr ""
+
+msgid ""
+" prepare repository to work with patches qinit\n"
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh\n"
+msgstr ""
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr ""
+
+msgid "guard cannot be an empty string"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr ""
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr ""
+
+#, python-format
+msgid "active guards: %s\n"
+msgstr ""
+
+#, python-format
+msgid "guard %r too short"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr ""
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "update returned %d"
+msgstr ""
+
+msgid "repo commit failed"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr ""
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr ""
+
+#, python-format
+msgid "applying %s\n"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr "è¯»å– %s 失败\n"
+
+#, python-format
+msgid "imported patch %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"imported patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr ""
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr ""
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr ""
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr ""
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr ""
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr ""
+
+msgid "no patches applied"
+msgstr ""
+
+msgid "working directory revision is not qtip"
+msgstr ""
+
+msgid "local changes found, refresh first"
+msgstr ""
+
+msgid "local changes found"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr ""
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr ""
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series"
+msgstr ""
+
+msgid "(working directory not at a head)\n"
+msgstr ""
+
+msgid "no patches in series\n"
+msgstr ""
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr ""
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr ""
+
+#, python-format
+msgid "guarded by %r"
+msgstr ""
+
+msgid "no matching guards"
+msgstr ""
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr ""
+
+msgid "all patches are currently applied\n"
+msgstr ""
+
+msgid "patch series already fully applied\n"
+msgstr ""
+
+msgid "cleaning up working directory..."
+msgstr ""
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr ""
+
+#, python-format
+msgid "now at: %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr ""
+
+msgid "no patches applied\n"
+msgstr ""
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr ""
+
+msgid "qpop: forcing dirstate update\n"
+msgstr ""
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr ""
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr ""
+
+msgid "patch queue now empty\n"
+msgstr ""
+
+msgid "cannot refresh a revision with children"
+msgstr ""
+
+msgid "refresh interrupted while patch was popped! (revert --all, qpush to recover)\n"
+msgstr ""
+
+msgid "patch queue directory already exists"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr ""
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr ""
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+msgid "queue directory updating\n"
+msgstr ""
+
+msgid "Unable to load queue repository\n"
+msgstr ""
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr ""
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr ""
+
+msgid "option \"-r\" not valid when importing files"
+msgstr ""
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr ""
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr ""
+
+msgid "-e is incompatible with import from -"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr ""
+
+msgid "need --name to import a patch from -"
+msgstr ""
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr ""
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the qfinish command."
+msgstr ""
+
+msgid "print the patches already applied"
+msgstr ""
+
+msgid "only one patch applied\n"
+msgstr ""
+
+msgid "print the patches not yet applied"
+msgstr ""
+
+msgid "all patches applied\n"
+msgstr ""
+
+#, fuzzy
+msgid "import a patch"
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes."
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag.\n"
+" "
+msgstr ""
+"导入补ä¸\n"
+"\n"
+" 此补ä¸æ’入到最近一次应用的补ä¸åºåˆ—中。\n"
+" 如果尚无应用补ä¸ï¼Œqimport 会æ’入补ä¸åˆ°åºåˆ—开始。\n"
+"\n"
+" 除éžä½ ä½¿ç”¨ '--name' 给出补ä¸å称,å¦åˆ™å°±ä¸Žæºæ–‡ä»¶åŒå。\n"
+"\n"
+" ä½ å¯ä»¥ä½¿ç”¨ '--existing' 注册一个已在补ä¸ç›®å½•ä¸­çš„è¡¥ä¸ã€‚\n"
+"\n"
+" 使用 '--force' 会覆盖已有的补ä¸ã€‚\n"
+"\n"
+" å¯ä»¥ä½¿ç”¨ '--rev' 将已有的修改集置于 mq 控制下(例如 \n"
+" 'qimport --rev tip -n patch' 会将 tip 置于 mq 控制下)。当使用 '--git'\n"
+" 时,'--rev' 导入的补ä¸å°†ä¼šä½¿ç”¨ git 差异格å¼ã€‚å‚è§å·®å¼‚帮助主题,以了解\n"
+" 为什么这对于ä¿ç•™æ”¹å/å¤åˆ¶ä¿¡æ¯å’Œæƒé™ä¿®æ”¹å¾ˆé‡è¦ã€‚\n"
+" "
+
+#, fuzzy
+msgid "init a new queue repository"
+msgstr "åˆå§‹åŒ–队列仓库"
+
+#, fuzzy
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+" 默认队列仓库ä¸å—版本控制。如果指定了 '-c',那么 qinit 会为补ä¸åˆ›å»ºä¸€ä¸ª\n"
+" å•ç‹¬çš„嵌套版本库(也å¯ä»¥ç¨åŽè¿è¡Œ 'qinit -c' æ¥å°†ä¸å—版本控制的补ä¸ä»“库\n"
+" 转æ¢æˆå—版本控制)。你å¯ä»¥ä½¿ç”¨ 'qcommit' æ交改å˜åˆ°æ­¤é˜Ÿåˆ—版本库。"
+
+msgid "clone main and patch repository at same time"
+msgstr ""
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by qinit -c.\n"
+" "
+msgstr ""
+
+msgid "versioned patch repository not found (see qinit -c)"
+msgstr ""
+
+#, fuzzy
+msgid "cloning main repository\n"
+msgstr "åˆå§‹åŒ–目标版本库 %s\n"
+
+msgid "cloning patch repository\n"
+msgstr ""
+
+#, fuzzy
+msgid "stripping applied patches from destination repository\n"
+msgstr "åˆå§‹åŒ–目标版本库 %s\n"
+
+#, fuzzy
+msgid "updating destination repository\n"
+msgstr "åˆå§‹åŒ–目标版本库 %s\n"
+
+msgid "commit changes in the queue repository"
+msgstr ""
+
+msgid "print the entire series file"
+msgstr ""
+
+msgid "print the name of the current patch"
+msgstr ""
+
+msgid "print the name of the next patch"
+msgstr ""
+
+msgid "print the name of the previous patch"
+msgstr ""
+
+msgid "create a new patch"
+msgstr ""
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). It will refuse to run if there are any outstanding changes\n"
+" unless -f/--force is specified, in which case the patch will be\n"
+" initialized with them. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "update the current patch"
+msgstr "更新当å‰è¡¥ä¸"
+
+#, fuzzy
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+" 如果æ供了文件匹é…模å¼ï¼Œæ›´æ–°åŽçš„è¡¥ä¸åªåŒ…å«åŒ¹é…这些模å¼çš„修改,其它\n"
+" 的修改ä»æ—§åœ¨å·¥ä½œç›®å½•ä¸­ã€‚"
+
+#, fuzzy
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr " 如果指定了 '--short',åªæ›´æ–°å·²ç»åœ¨è¡¥ä¸ä¸­çš„文件,与文件匹é…模å¼ç±»ä¼¼ã€‚"
+
+#, fuzzy
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format.\n"
+" "
+msgstr ""
+" 'hg add/remove/copy/rename' 如常工作,你å¯èƒ½æƒ³ä½¿ç”¨ git æ ¼å¼è¡¥ä¸(使\n"
+" 用选项 '--git' 或在é…置文件的 [diff] 区中设置 git=1)以跟踪å¤åˆ¶å’Œæ”¹\n"
+" å。请å‚è§å·®å¼‚帮助主题,以了解关于 git 差异格å¼çš„更多信æ¯ã€‚\n"
+" "
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr ""
+
+#, fuzzy
+msgid "diff of the current patch and subsequent modifications"
+msgstr "显å¼å½“å‰çš„è¡¥ä¸å’ŒåŽç»­çš„修改"
+
+#, fuzzy
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+" 显示当å‰çš„è¡¥ä¸å’Œæœ€è¿‘一次刷新之åŽçš„修改(因而在执行 'qrefresh' 之åŽå°±åª\n"
+" 显示当å‰çš„è¡¥ä¸)。"
+
+#, fuzzy
+msgid ""
+" Use 'hg diff' if you only want to see the changes made since the\n"
+" last qrefresh, or 'hg export qtip' if you want to see changes made\n"
+" by the current patch without including changes made since the\n"
+" qrefresh.\n"
+" "
+msgstr ""
+" 如果你åªæƒ³çœ‹åˆ°æœ€è¿‘一次刷新之åŽçš„修改请使用 'hg diff',如果你åªæƒ³çœ‹åˆ°å½“\n"
+" å‰çš„è¡¥ä¸è¯·ä½¿ç”¨ 'hg export qtip'。\n"
+" "
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of '* * *'."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr ""
+
+msgid "No patches applied"
+msgstr ""
+
+#, python-format
+msgid "Skipping already folded patch %s"
+msgstr ""
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "Error folding patch %s"
+msgstr ""
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the qselect command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the qselect command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch.\n"
+" NOTE: Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid ""
+" To set guards on another patch:\n"
+" hg qguard -- other.patch +2.6.17 -stable\n"
+" "
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr ""
+
+#, python-format
+msgid "no patch named %s"
+msgstr ""
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+#, fuzzy
+msgid "push the next patch onto the stack"
+msgstr "将下个补ä¸åŽ‹å…¥å †æ ˆ"
+
+#, fuzzy
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost.\n"
+" "
+msgstr ""
+" 当指定 '--force' 时,所有在补ä¸æ–‡ä»¶ä¸­çš„本地修改都会丢失。\n"
+" "
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "pop the current patch off the stack"
+msgstr "将当å‰è¡¥ä¸å¼¹å‡ºå †æ ˆ"
+
+#, fuzzy
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack.\n"
+" "
+msgstr ""
+" 默认将补ä¸å †æ ˆçš„顶部弹出。如果指定了补ä¸å称,那么就会一直弹出,直到此\n"
+" è¡¥ä¸ä½äºŽå †æ ˆé¡¶éƒ¨ã€‚\n"
+" "
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr ""
+
+msgid "rename a patch"
+msgstr ""
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+
+#, python-format
+msgid "%s already exists"
+msgstr ""
+
+#, python-format
+msgid "A patch named %s already exists in the series file"
+msgstr ""
+
+msgid "restore the queue state saved by a revision"
+msgstr ""
+
+msgid "save current queue state"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr ""
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "strip a revision and all its descendants from the repository"
+msgstr "从版本库删除一个版本以åŠå®ƒçš„å­å­™"
+
+#, fuzzy
+msgid ""
+" If one of the working directory's parent revisions is stripped, the\n"
+" working directory will be updated to the parent of the stripped\n"
+" revision.\n"
+" "
+msgstr ""
+" 如果有工作目录的父版本被删除,那么此目录会被更新到已删除版本的父版本。\n"
+" "
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the qguard command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example:"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream.\n"
+" "
+msgstr ""
+
+msgid "no revisions specified"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr ""
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr ""
+
+#, fuzzy
+msgid "show only the last patch"
+msgstr "åªæ˜¾ç¤ºå·²å¢žåŠ æ–‡ä»¶çš„状æ€"
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr "数用åè®® 'pull' æ¥å¤åˆ¶å…ƒæ•°æ®"
+
+msgid "do not update the new working directories"
+msgstr ""
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr "使用ä¸åŽ‹ç¼©çš„传输(在局域网更快)"
+
+#, fuzzy
+msgid "location of source patch repository"
+msgstr "为此版本库å¯åŠ¨æœåŠ¡ 'inotify'"
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "keep patch file"
+msgstr ""
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [-r REV]... [PATCH]..."
+msgstr ""
+
+msgid "edit patch header"
+msgstr ""
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr ""
+
+msgid "overwrite any local changes"
+msgstr ""
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr ""
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] -- [PATCH] [+GUARD]... [-GUARD]..."
+msgstr ""
+
+msgid "hg qheader [PATCH]"
+msgstr ""
+
+#, fuzzy
+msgid "import file in patch directory"
+msgstr "从补ä¸ç›®å½•å¯¼å…¥æ–‡ä»¶"
+
+#, fuzzy
+msgid "name of patch file"
+msgstr "è¡¥ä¸æ–‡ä»¶å称"
+
+msgid "overwrite existing files"
+msgstr "覆盖已有文件"
+
+msgid "place existing revisions under mq control"
+msgstr "将现有的版本置于 mq 控制下"
+
+msgid "use git extended diff format"
+msgstr "使用 git 扩展差异格å¼"
+
+msgid "qpush after importing"
+msgstr ""
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr ""
+
+msgid "create queue repository"
+msgstr "创建队列版本库"
+
+msgid "hg qinit [-c]"
+msgstr ""
+
+msgid "import uncommitted changes into patch"
+msgstr ""
+
+msgid "add \"From: <current user>\" to patch"
+msgstr ""
+
+msgid "add \"From: <given user>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <given date>\" to patch"
+msgstr ""
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] [-f] PATCH [FILE]..."
+msgstr ""
+
+msgid "hg qnext [-s]"
+msgstr ""
+
+msgid "hg qprev [-s]"
+msgstr ""
+
+msgid "pop all patches"
+msgstr "弹出全部补ä¸"
+
+msgid "queue name to pop"
+msgstr "æ“作的队列å称"
+
+msgid "forget any local changes"
+msgstr "丢弃本地修改"
+
+msgid "hg qpop [-a] [-n NAME] [-f] [PATCH | INDEX]"
+msgstr ""
+
+msgid "apply if the patch has rejects"
+msgstr "强制应用补ä¸"
+
+msgid "list patch name in commit text"
+msgstr "在æ交日志中列出补ä¸å称"
+
+msgid "apply all patches"
+msgstr "应用所有补ä¸"
+
+msgid "merge from another queue"
+msgstr "从其它队列åˆå¹¶"
+
+msgid "merge queue name"
+msgstr "åˆå¹¶é˜Ÿåˆ—çš„å称"
+
+msgid "hg qpush [-f] [-l] [-a] [-m] [-n NAME] [PATCH | INDEX]"
+msgstr ""
+
+msgid "refresh only files already in the patch and specified files"
+msgstr "仅当文件已ç»åœ¨è¡¥ä¸æˆ–指定文件中时æ‰æ›´æ–°"
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+#, fuzzy
+msgid "add/update date field in patch with current date"
+msgstr "在补ä¸ä¸­æ›´æ–° \"Date: <given date>\" (如果存在)"
+
+#, fuzzy
+msgid "add/update date field in patch with given date"
+msgstr "在补ä¸ä¸­æ›´æ–° \"Date: <given date>\" (如果存在)"
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr ""
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr ""
+
+msgid "delete save entry"
+msgstr ""
+
+#, fuzzy
+msgid "update queue working directory"
+msgstr "正在更新工作目录\n"
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr ""
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "print patches not in series"
+msgstr ""
+
+msgid "hg qseries [-ms]"
+msgstr ""
+
+msgid "force removal with local changes"
+msgstr "强制删除,纵然有本地修改"
+
+msgid "bundle unrelated changesets"
+msgstr "打包ä¸ç›¸å…³çš„修改集"
+
+msgid "no backups"
+msgstr "ä¸å¤‡ä»½"
+
+msgid "hg strip [-f] [-b] [-n] REV"
+msgstr ""
+
+msgid "hg qtop [-s]"
+msgstr ""
+
+#, fuzzy
+msgid "show only the first patch"
+msgstr "åªæ˜¾ç¤ºå·²å¢žåŠ æ–‡ä»¶çš„状æ€"
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr ""
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid "::"
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: no subscribers to repository %s\n"
+msgstr ""
+
+#, python-format
+msgid "notify: changes have source \"%s\" - skipping\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = LESS='FSRX' less"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = log"
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like \"hg version\" or \"hg help\", you have to\n"
+"specify them in the global .hgrc\n"
+msgstr ""
+
+msgid "interpret suffixes to refer to ancestor revisions"
+msgstr ""
+
+msgid ""
+"This extension allows you to use git-style suffixes to refer to the\n"
+"ancestors of a specific revision."
+msgstr ""
+
+msgid "For example, if you can refer to a revision as \"foo\", then::"
+msgstr ""
+
+msgid ""
+" foo^N = Nth parent of foo\n"
+" foo^0 = foo\n"
+" foo^1 = first parent of foo\n"
+" foo^2 = second parent of foo\n"
+" foo^ = foo^1"
+msgstr ""
+
+msgid ""
+" foo~N = Nth first grandparent of foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = first parent of foo\n"
+" foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+msgstr ""
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by \"hg export\"."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"With the -d/--diffstat option, you will be prompted for each changeset\n"
+"with a diffstat summary and the changeset summary, so you can be sure\n"
+"you are sending the right changes."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your hgrc\n"
+"file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ..."
+msgstr ""
+
+msgid ""
+"Then you can use the \"hg email\" command to mail a series of changesets\n"
+"as a patchbomb."
+msgstr ""
+
+msgid ""
+"To avoid sending patches prematurely, it is a good idea to first run\n"
+"the \"email\" command with the \"-n\" option (test only). You will be\n"
+"prompted for an email recipient address, a subject and an introductory\n"
+"message describing the patches of your patchbomb. Then when all is\n"
+"done, patchbomb messages are displayed. If the PAGER environment\n"
+"variable is set, your pager will be fired up once for each patchbomb\n"
+"message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+"The -m/--mbox option is also very useful. Instead of previewing each\n"
+"patchbomb message in a pager or sending the messages directly, it will\n"
+"create a UNIX mailbox file with the patch emails. This mailbox file\n"
+"can be previewed with any mail user agent which supports UNIX mbox\n"
+"files, e.g. with mutt::"
+msgstr ""
+
+msgid " % mutt -R -f mbox"
+msgstr ""
+
+msgid ""
+"When you are previewing the patchbomb messages, you can use ``formail``\n"
+"(a utility that is commonly installed as part of the procmail\n"
+"package), to send each message out::"
+msgstr ""
+
+msgid " % formail -s sendmail -bm -t < mbox"
+msgstr ""
+
+msgid "That should be all. Now your patchbomb is on its way out."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+msgid "Please enter a valid value.\n"
+msgstr ""
+
+msgid "does the diffstat above look okay? "
+msgstr ""
+
+msgid "diffstat rejected"
+msgstr ""
+
+msgid "send changesets by email"
+msgstr ""
+
+msgid ""
+" By default, diffs are sent in the format generated by hg export,\n"
+" one per message. The series starts with a \"[PATCH 0 of N]\"\n"
+" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description. Next, (optionally) if the diffstat program is\n"
+" installed and -d/--diffstat is used, the result of running\n"
+" diffstat on the patch. Finally, the patch itself, as generated by\n"
+" \"hg export\"."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+msgid "specify at least one changeset with -r or -o"
+msgstr ""
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr ""
+
+msgid "use only one form to specify the revision"
+msgstr ""
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr ""
+
+msgid "Final summary:\n"
+msgstr ""
+
+msgid "Displaying "
+msgstr ""
+
+msgid "Writing "
+msgstr ""
+
+msgid "Sending "
+msgstr ""
+
+msgid "send patches as attachments"
+msgstr ""
+
+msgid "send patches as inline attachments"
+msgstr ""
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "add diffstat output to messages"
+msgstr ""
+
+msgid "use the given date as the sending date"
+msgstr ""
+
+msgid "use the given file as the series description"
+msgstr ""
+
+msgid "email address of sender"
+msgstr ""
+
+msgid "print messages that would be sent"
+msgstr ""
+
+msgid "write messages to mbox file instead of sending them"
+msgstr ""
+
+msgid "subject of first message (intro or single patch)"
+msgstr ""
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr ""
+
+msgid "omit hg patch header"
+msgstr ""
+
+msgid "send changes not found in the target repository"
+msgstr ""
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+
+msgid "name of the bundle attachment file"
+msgstr ""
+
+msgid "a revision to send"
+msgstr ""
+
+#, fuzzy
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr "纵然远程版本库是无关的也è¦æ‰§è¡Œ"
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr ""
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr ""
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by \"hg status\"\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with \"hg add\")"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr "正在删除文件 %s\n"
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr "正在删除目录 %s\n"
+
+msgid "abort if an error occurs"
+msgstr ""
+
+msgid "purge ignored files too"
+msgstr ""
+
+msgid "print filenames instead of deleting them"
+msgstr ""
+
+#, fuzzy
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr "在文件å称结尾增加 NUL,用于 xargs"
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr ""
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "first revision, do not change ancestor\n"
+msgstr ""
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history onto another. This can be useful for linearizing local\n"
+" changes relative to a master development tree."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a.\n"
+" "
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr ""
+
+msgid "cannot use collapse with continue or abort"
+msgstr ""
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot use both keepbranches and extrafn"
+msgstr ""
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr ""
+
+msgid " set parents\n"
+msgstr ""
+
+#, python-format
+msgid "rebasing %d:%s\n"
+msgstr ""
+
+#, python-format
+msgid " future parents are %d and %d\n"
+msgstr ""
+
+#, python-format
+msgid " update to %d:%s\n"
+msgstr ""
+
+msgid " already in target\n"
+msgstr ""
+
+#, python-format
+msgid " merge against %d:%s\n"
+msgstr ""
+
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr ""
+
+msgid "resuming interrupted rebase\n"
+msgstr ""
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr ""
+
+#, python-format
+msgid "next revision set to %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+#, python-format
+msgid "revision %d is an mq patch (%s), finalize it.\n"
+msgstr ""
+
+#, python-format
+msgid "import mq patch %d (%s)\n"
+msgstr ""
+
+msgid "rebase status stored\n"
+msgstr ""
+
+msgid "rebase status resumed\n"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, not stripping\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr ""
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "cannot rebase an ancestor"
+msgstr ""
+
+msgid "cannot rebase a descendant"
+msgstr ""
+
+msgid "already working on current\n"
+msgstr ""
+
+msgid "already working on the current branch\n"
+msgstr ""
+
+#, python-format
+msgid "rebase onto %d starting from %d\n"
+msgstr ""
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+
+msgid "--update and --rebase are not compatible, ignoring the update flag\n"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "rebase from a given revision"
+msgstr ""
+
+msgid "rebase from the base of a given revision"
+msgstr ""
+
+msgid "rebase onto a given revision"
+msgstr ""
+
+msgid "collapse the rebased revisions"
+msgstr ""
+
+msgid "keep original revisions"
+msgstr ""
+
+msgid "keep original branches"
+msgstr ""
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid "hg rebase [-s REV | -b REV] [-d REV] [--collapse] [--keep] [--keepbranches] | [-c] | [-a]"
+msgstr ""
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr ""
+
+msgid "this is a binary file\n"
+msgstr ""
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr ""
+
+msgid "&No, skip this change"
+msgstr ""
+
+msgid "&Skip remaining changes to this file"
+msgstr ""
+
+msgid "Record remaining changes to this &file"
+msgstr ""
+
+msgid "&Done, skip remaining changes and files"
+msgstr ""
+
+#, fuzzy
+msgid "Record &all changes to all remaining files"
+msgstr "将丢失的文件视为删除"
+
+#, fuzzy
+msgid "&Quit, recording no changes"
+msgstr "正在æœç´¢ä¿®æ”¹\n"
+
+msgid "&?"
+msgstr ""
+
+msgid "y - record this change"
+msgstr ""
+
+msgid "user quit"
+msgstr "用户退出"
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+msgid "y"
+msgstr ""
+
+#, python-format
+msgid "record this change to %r?"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "record change %d/%d to %r?"
+msgstr "ä¸éœ€è¦æ”¹å˜ %s\n"
+
+msgid "interactively select changes to commit"
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be candidates for recording."
+msgstr ""
+
+msgid " See 'hg help dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+
+msgid " ? - display help"
+msgstr ""
+
+msgid "'mq' extension not loaded"
+msgstr ""
+
+msgid "running non-interactively, use commit instead"
+msgstr ""
+
+msgid "no changes to record\n"
+msgstr ""
+
+#, python-format
+msgid "backup %r as %r\n"
+msgstr ""
+
+msgid "applying patch\n"
+msgstr ""
+
+msgid "patch failed to apply"
+msgstr ""
+
+#, python-format
+msgid "restoring %r to %r\n"
+msgstr ""
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository (experimental)"
+msgstr ""
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" NOTE: actions that change history such as rollback or moving the\n"
+" source may confuse sharers.\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr ""
+
+msgid "Fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. If --log is\n"
+" specified, log messages will have a comment appended of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" hg transplant --branch REVISION --all will rebase the selected\n"
+" branch (up to the named revision) onto your current working\n"
+" directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, hg transplant will start\n"
+" an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling hg transplant\n"
+" --continue/-c.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid "pull patches from REPOSITORY"
+msgstr ""
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through FILTER"
+msgstr ""
+
+msgid "hg transplant [-s REPOSITORY] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid ""
+"- You should use single encoding in one repository.\n"
+"- You should set same encoding for the repository by locale or\n"
+" HGENCODING."
+msgstr ""
+
+msgid ""
+"Path encoding conversion are done between Unicode and\n"
+"encoding.encoding which is decided by Mercurial from current locale\n"
+"setting or HGENCODING.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] activated with encoding: %s\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid "If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run \"hg serve\"\n"
+"in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid "You can discover zeroconf enabled repositories by running \"hg paths\"::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr ""
+
+msgid "cannot give prefix when archiving to files"
+msgstr ""
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr ""
+
+msgid "invalid changegroup"
+msgstr ""
+
+msgid "unknown parent"
+msgstr ""
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+#, python-format
+msgid "%s: not a Mercurial bundle file"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle version"
+msgstr ""
+
+#, python-format
+msgid "%s: unknown bundle compression type"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "premature EOF reading chunk (got %d bytes, expected %d)"
+msgstr ""
+
+msgid "empty username"
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr ""
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr ""
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr ""
+
+msgid "limit must be a positive integer"
+msgstr ""
+
+msgid "limit must be positive"
+msgstr ""
+
+msgid "too many revisions specified"
+msgstr ""
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+#, python-format
+msgid "adding %s\n"
+msgstr ""
+
+#, python-format
+msgid "removing %s\n"
+msgstr "正在删除 %s\n"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr ""
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr ""
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr ""
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "copying %s to %s\n"
+msgstr "正在推到 %s\n"
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+msgid "no source or destination specified"
+msgstr ""
+
+msgid "no destination specified"
+msgstr ""
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "no files to copy"
+msgstr ""
+
+msgid "(consider using --after)\n"
+msgstr "(考虑使用 --after)\n"
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "修改集: %d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "分支: %s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "标签: %s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "父亲: %d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "清å•: %d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "用户: %s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "日期: %s\n"
+
+msgid "files+:"
+msgstr "文件+:"
+
+msgid "files-:"
+msgstr "文件-:"
+
+msgid "files:"
+msgstr "文件:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "文件: %s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "å¤åˆ¶: %s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "é¢å¤–: %s=%s\n"
+
+msgid "description:\n"
+msgstr "æè¿°:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "摘è¦: %s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "%s: %s"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr ""
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr ""
+
+#, python-format
+msgid "%s:%s copy source revision cannot be found!\n"
+msgstr ""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr "HG: 请输入æ交日志。以 'HG:' 开始的行会被删除。"
+
+msgid "HG: Leave message empty to abort commit."
+msgstr ""
+
+#, fuzzy, python-format
+msgid "HG: user: %s"
+msgstr "用户: %s\n"
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "HG: subrepo %s"
+msgstr "已删除"
+
+#, python-format
+msgid "HG: added %s"
+msgstr ""
+
+#, python-format
+msgid "HG: changed %s"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "HG: removed %s"
+msgstr "已删除"
+
+#, fuzzy
+msgid "HG: no files changed"
+msgstr "正在增加文件改å˜\n"
+
+msgid "empty commit message"
+msgstr "空的æ交日志"
+
+#, fuzzy
+msgid "add the specified files on the next commit"
+msgstr "增加指定文件用于下次æ交"
+
+#, fuzzy
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr " 调度文件å—版本控制,增加到版本库。"
+
+#, fuzzy
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see hg forget."
+msgstr ""
+" 这些文件将于下次æ交时增加到版本库。需è¦åœ¨æ交å‰æ’¤é”€å¢žåŠ ï¼Œ\n"
+" å‚è§ 'hg revert'。"
+
+#, fuzzy
+msgid ""
+" If no names are given, add all files to the repository.\n"
+" "
+msgstr ""
+" 如果没有给出文件å称,就增加所有文件到版本库。\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr ""
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" .hgignore. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive.\n"
+" "
+msgstr ""
+
+msgid "similarity must be a number"
+msgstr ""
+
+msgid "similarity must be between 0 and 100"
+msgstr ""
+
+#, fuzzy
+msgid "show changeset information by line for each file"
+msgstr "显示指定文件æ¯è¡Œçš„修改集信æ¯"
+
+#, fuzzy
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr " 列出文件中的修改,为æ¯è¡Œæ˜¾ç¤ºç‰ˆæœ¬æ ‡è¯†"
+
+#, fuzzy
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr " 此命令用于查找è°åšå‡ºçš„修改,或者什么时候å‘生的修改"
+
+#, fuzzy
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable.\n"
+" "
+msgstr ""
+" 当没有选项 '-a' 时,annotate 会é¿å…处ç†æ£€æµ‹ä¸ºäºŒè¿›åˆ¶çš„文件\n"
+" 当使用选项 '-a' 时,annotate 会直接产生追溯,å¯èƒ½ä¼šæœ‰ä¸åˆéœ€è¦çš„结果\n"
+" "
+
+msgid "at least one filename or pattern is required"
+msgstr ""
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr ""
+
+msgid "create an unversioned archive of a repository revision"
+msgstr ""
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" To specify the type of archive to create, use -t/--type. Valid\n"
+" types are::"
+msgstr ""
+
+msgid ""
+" \"files\" (default): a directory full of files\n"
+" \"tar\": tar archive, uncompressed\n"
+" \"tbz2\": tar archive, compressed using bzip2\n"
+" \"tgz\": tar archive, compressed using gzip\n"
+" \"uzip\": zip archive, uncompressed\n"
+" \"zip\": zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see 'hg help export' for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed.\n"
+" "
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr ""
+
+msgid "repository root cannot be destination"
+msgstr ""
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+
+msgid "reverse effect of earlier changeset"
+msgstr ""
+
+msgid ""
+" Commit the backed out changes as a new changeset. The new\n"
+" changeset is a child of the backed out changeset."
+msgstr ""
+
+msgid ""
+" If you backout a changeset other than the tip, a new head is\n"
+" created. This head will be the new tip and you should merge this\n"
+" backout changeset with another head."
+msgstr ""
+
+msgid ""
+" The --merge option remembers the parent of the working directory\n"
+" before starting the backout, then merges the new head with that\n"
+" changeset afterwards. This saves you from doing the merge by hand.\n"
+" The result of this merge is not committed, as with a normal merge."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr ""
+
+msgid "please specify a revision to backout"
+msgstr ""
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr ""
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr ""
+
+msgid "the backout changeset is a new head - do not forget to merge\n"
+msgstr ""
+
+msgid "(use \"backout --merge\" if you want to auto-merge)\n"
+msgstr ""
+
+msgid "subdivision search of changesets"
+msgstr ""
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad.\n"
+" "
+msgstr ""
+
+msgid "The first good revision is:\n"
+msgstr ""
+
+msgid "The first bad revision is:\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+
+msgid "cannot bisect (no known good revisions)"
+msgstr ""
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr ""
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr ""
+
+msgid "incompatible arguments"
+msgstr ""
+
+#, python-format
+msgid "cannot find executable: %s"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr ""
+
+#, python-format
+msgid "%s killed"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr "修改集: %d:%s\n"
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr ""
+
+msgid "set or show the current branch name"
+msgstr ""
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch. Use\n"
+" 'hg commit --close-branch' to mark this branch as closed.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr ""
+
+msgid "a branch of the same name already exists (use --force to override)"
+msgstr ""
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr ""
+
+msgid "list repository named branches"
+msgstr ""
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid ""
+" Use the command 'hg update' to switch to an existing branch.\n"
+" "
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr ""
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If no destination repository is specified the destination is\n"
+" assumed to have all the nodes specified by one or more --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr ""
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "output the current or given revision of files"
+msgstr ""
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions::"
+msgstr ""
+
+msgid ""
+" %s basename of file being printed\n"
+" %d dirname of file being printed, or '.' if in repository root\n"
+" %p root-relative path name of file being printed\n"
+" "
+msgstr ""
+
+msgid "make a copy of an existing repository"
+msgstr ""
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" .hg/hgrc file, as the default to be used for future pulls."
+msgstr ""
+
+msgid ""
+" If you use the -r/--rev option to clone up to a specific revision,\n"
+" no subsequent revisions (including subsequent tags) will be\n"
+" present in the cloned repository. This option implies --pull, even\n"
+" on local repositories."
+msgstr ""
+
+msgid ""
+" By default, clone will check out the head of the 'default' branch.\n"
+" If the -U/--noupdate option is used, the new clone will contain\n"
+" only a repository (.hg) and no working copy (the working copy\n"
+" parent is the null revision)."
+msgstr ""
+
+msgid " See 'hg help urls' for valid source format details."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ssh:// URL as the destination, but no\n"
+" .hg/hgrc and working directory will be created on the remote side.\n"
+" Please see 'hg help urls' for important details about ssh:// URLs."
+msgstr ""
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the checked out files). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+
+msgid ""
+" In some cases, you can clone repositories and checked out files\n"
+" using full hardlinks with ::"
+msgstr ""
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr ""
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "commit the specified files or all outstanding changes"
+msgstr "æ交指定文件的修改或全部修改"
+
+#, fuzzy
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized RCS, this operation is a local operation. See hg push\n"
+" for a way to actively distribute your changes."
+msgstr " 将指定文件的修改æ交到版本库。"
+
+#, fuzzy
+msgid ""
+" If a list of files is omitted, all changes reported by \"hg status\"\n"
+" will be committed."
+msgstr " 如果çœç•¥äº†æ–‡ä»¶åˆ—表,那么 \"hg status\" 报告的所有修改都被æ交。"
+
+#, fuzzy
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr " 如果你è¦æ交åˆå¹¶ç»“果,请ä¸è¦æ供任何文件å称或过滤器 '-I/-X'。"
+
+#, fuzzy
+msgid ""
+" If no commit message is specified, the configured editor is\n"
+" started to prompt you for a message."
+msgstr " 如果没有指定æ交日志,将会å¯åŠ¨é…置的编辑器,让你输入信æ¯ã€‚"
+
+msgid "nothing changed\n"
+msgstr "没有改å˜\n"
+
+msgid "created new head\n"
+msgstr "å·²ç»åˆ›å»ºæ–°é¡¶ç‚¹\n"
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr "æ交修改集 %d:%s\n"
+
+msgid "mark files as copied for the next commit"
+msgstr ""
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "此处没有水银版本库(没有找到 .hg)"
+
+msgid "either two or three arguments required"
+msgstr "需è¦ä¸¤ä¸ªæˆ–三个å‚æ•°"
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "validate the correctness of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr ""
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item.\n"
+" "
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care.\n"
+" "
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr ""
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr ""
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr ""
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+msgid "Checking extensions...\n"
+msgstr ""
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+msgid "Checking templates...\n"
+msgstr ""
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking patch...\n"
+msgstr ""
+
+msgid " patch call failed:\n"
+msgstr ""
+
+msgid " unexpected patch output!\n"
+msgstr ""
+
+msgid " patch test failed!\n"
+msgstr ""
+
+msgid " (Current patch tool may be incompatible with patch, or misconfigured. Please check your .hgrc file)\n"
+msgstr ""
+
+msgid " Internal patcher failure, please report this error to http://mercurial.selenic.com/bts/\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr ""
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr ""
+
+msgid " (specify a commit editor in your .hgrc file)\n"
+msgstr ""
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr ""
+
+msgid "Checking username...\n"
+msgstr ""
+
+msgid " (specify a username in your .hgrc file)\n"
+msgstr ""
+
+msgid "No problems detected\n"
+msgstr ""
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr ""
+
+msgid "dump rename information"
+msgstr ""
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr ""
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+#, fuzzy
+msgid "diff repository (or selected files)"
+msgstr "在版本库中比较(指定的文件)"
+
+#, fuzzy
+msgid " Show differences between revisions for the specified files."
+msgstr " 显示指定文件在版本间的差异。"
+
+#, fuzzy
+msgid " Differences between files are shown using the unified diff format."
+msgstr " 文件间的差异使用åŒä¸€å·®å¼‚æ ¼å¼æ˜¾ç¤ºã€‚"
+
+#, fuzzy
+msgid ""
+" NOTE: diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first parent\n"
+" changeset if no revisions are specified."
+msgstr ""
+" 注æ„: 对åˆå¹¶çš„比较å¯èƒ½ä¼šäº§ç”Ÿä¸æœŸæœ›çš„结果,因为没有指定版本时,默认\n"
+" 与工作目录的直接父亲比较。"
+
+#, fuzzy
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+" 当没有选项 '-a' 时,将会é¿å…处ç†æ£€æµ‹ä¸ºäºŒè¿›åˆ¶çš„文件。当使用选项 '-a'\n"
+" 时,å¯èƒ½ä¼šæœ‰ä¸åˆéœ€è¦çš„结果。"
+
+#, fuzzy
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read 'hg help diffs'.\n"
+" "
+msgstr ""
+" 使用选项 '--git' 会使用 git 扩展差异格å¼ã€‚请阅读 'hg help diffs' 以\n"
+" 了解更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid "dump the header and diffs for one or more changesets"
+msgstr "为一个或多个修改集输出标题和差异"
+
+#, fuzzy
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr " 为一个或多个版本输出标题和差异。"
+
+#, fuzzy
+msgid ""
+" The information shown in the changeset header is: author,\n"
+" changeset hash, parent(s) and commit comment."
+msgstr " 在修改集标题中显示的信æ¯æ˜¯: 作者,修改集哈希,父亲和æ交日志。"
+
+#, fuzzy
+msgid ""
+" NOTE: export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œå¯¼å‡ºå¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åªä¼šå°†åˆå¹¶\n"
+" 修改集与其第一个父亲比较。"
+
+#, fuzzy
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows::"
+msgstr ""
+" å¯ä»¥è¾“出到文件,这时会使用指定的格å¼åŒ–字符串构造文件å称。格å¼åŒ–规则\n"
+" 如下:"
+
+#, fuzzy
+msgid ""
+" %% literal \"%\" character\n"
+" %H changeset hash (40 bytes of hexadecimal)\n"
+" %N number of patches being generated\n"
+" %R changeset revision number\n"
+" %b basename of the exporting repository\n"
+" %h short-form changeset hash (12 bytes of hexadecimal)\n"
+" %n zero-padded sequence number, starting at 1\n"
+" %r zero-padded changeset revision number"
+msgstr ""
+" %% 字符 \"%\"\n"
+" %H 修改集哈希 (40 ä½å六进制数字)\n"
+" %N 产生的补ä¸å·\n"
+" %R 修改集版本å·\n"
+" %b 待导出的版本库的基本å称\n"
+" %h 短修改集哈希(12 ä½å六进制数字)\n"
+" %n 从 1 开始补 0 çš„åºåˆ—å·\n"
+" %r è¡¥ 0 的修改集版本å·"
+
+#, fuzzy
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+" 当没有选项 '-a' 时,将会é¿å…处ç†æ£€æµ‹ä¸ºäºŒè¿›åˆ¶çš„文件。当使用选项 '-a'\n"
+" 时,å¯èƒ½ä¼šæœ‰ä¸åˆéœ€è¦çš„结果。"
+
+#, fuzzy
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See 'hg help diffs' for more information."
+msgstr ""
+" 使用选项 '--git' 会使用 git 扩展差异格å¼ã€‚请阅读差异帮助主题以了解\n"
+" 更多信æ¯ã€‚"
+
+#, fuzzy
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge.\n"
+" "
+msgstr ""
+" 使用选项 '--switch-parent',将会与第二个父亲比较。对于å¤å®¡åˆå¹¶å¾ˆæœ‰ç”¨ã€‚\n"
+" "
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr ""
+
+msgid "exporting patch:\n"
+msgstr ""
+
+msgid "forget the specified files on the next commit"
+msgstr ""
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid ""
+" To undo a forget before the next commit, see hg add.\n"
+" "
+msgstr ""
+
+msgid "no files specified"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+msgid "search for a pattern in specified files and revisions"
+msgstr ""
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "show current repository heads or show branch heads"
+msgstr ""
+
+msgid " With no arguments, show all repository head changesets."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations."
+msgstr ""
+
+msgid ""
+" If one or more REV is given, the \"branch heads\" will be shown for\n"
+" the named branch associated with the specified changeset(s)."
+msgstr ""
+
+msgid ""
+" Branch heads are changesets on a named branch with no descendants on\n"
+" the same branch. A branch head could be a \"true\" (repository) head,\n"
+" or it could be the last changeset on that branch before it was\n"
+" merged into another branch, or it could be the last changeset on the\n"
+" branch before a new branch was created. If none of the branch heads\n"
+" are true heads, the branch is considered inactive."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see hg commit --close-branch)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed.\n"
+" "
+msgstr ""
+
+msgid "you must specify a branch to use --closed"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "no open branch heads on branch %s\n"
+msgstr "svn: 分支没有版本 %s"
+
+#, python-format
+msgid "no changes on branch %s containing %s are reachable from %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes on branch %s are reachable from %s\n"
+msgstr ""
+
+msgid "show help for a given topic or a help overview"
+msgstr ""
+
+msgid " With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid "global options:"
+msgstr "全局选项:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "使用 \"hg help\" 获得全部命令的列表"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr "使用 \"hg help\" 获得全部命令的列表,或 \"hg -v\" 获得详细信æ¯"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show aliases and global options"
+msgstr "使用 \"hg -v help%s\" 显示别å和全局选项"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "使用 \"hg -v help %s\" 显示全局选项"
+
+msgid "list of commands:"
+msgstr "命令列表:"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"别å: %s\n"
+
+msgid "(no help text available)"
+msgstr "(没有å¯ç”¨çš„帮助信æ¯)"
+
+msgid "options:\n"
+msgstr "选项:\n"
+
+msgid "no commands defined\n"
+msgstr ""
+
+#, fuzzy
+msgid "enabled extensions:"
+msgstr ""
+"\n"
+"å¯ç”¨çš„扩展:\n"
+"\n"
+
+msgid "no help text available"
+msgstr "没有å¯ç”¨çš„帮助信æ¯"
+
+#, fuzzy, python-format
+msgid "%s extension - %s"
+msgstr "** 已加载的扩展: %s\n"
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "分布å¼è½¯ä»¶é…置管ç†å·¥å…· - 水银\n"
+
+msgid "basic commands:"
+msgstr "基本命令:"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"é¢å¤–的帮助主题:"
+
+msgid "identify the working copy or specified revision"
+msgstr ""
+
+msgid ""
+" With no revision, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid ""
+" This summary identifies the repository state using one or two\n"
+" parent hash identifiers, followed by a \"+\" if there are\n"
+" uncommitted changes in the working directory, a list of tags for\n"
+" this revision and a branch name for non-default branches.\n"
+" "
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr ""
+
+msgid " Import a list of patches and commit them individually."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by hg export, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See 'hg help dates' for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+msgid "no diffs found"
+msgstr ""
+
+#, python-format
+msgid ""
+"message:\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy
+msgid "not a Mercurial patch"
+msgstr "%s ä¸æ˜¯æœ¬åœ°çš„水银版本库"
+
+msgid "patch is damaged or loses information"
+msgstr ""
+
+msgid "show new changesets found in source"
+msgstr ""
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+
+msgid ""
+" See pull for valid source format details.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "create a new repository in the given directory"
+msgstr "在指定目录创建新版本库"
+
+#, fuzzy
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr " 在指定目录åˆå§‹åŒ–新版本库。如果指定的目录ä¸å­˜åœ¨ï¼Œé‚£ä¹ˆä¼šè¢«åˆ›å»ºã€‚"
+
+#, fuzzy
+msgid " If no directory is given, the current directory is used."
+msgstr " 如果没有指定目录,就使用当å‰ç›®å½•ã€‚"
+
+#, fuzzy
+msgid ""
+" It is possible to specify an ssh:// URL as the destination.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+" å¯ä»¥æŒ‡å®šä½ç½® 'ssh://' 作为目标。å‚è§å‘½ä»¤ 'hg help urls' 的帮助信æ¯ï¼Œ\n"
+" 以了解ä½ç½® 'ssh://' çš„é‡è¦è¯¦æƒ…。\n"
+" "
+
+msgid "locate files matching specific patterns"
+msgstr ""
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "show revision history of entire repository or files"
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+#, fuzzy
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+#, fuzzy
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+#, fuzzy
+msgid ""
+" If no revision range is specified, the default is tip:0 unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision."
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+#, fuzzy
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+#, fuzzy
+msgid ""
+" NOTE: log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:.\n"
+" "
+msgstr ""
+"显示全部版本库或指定文件的版本历å²\n"
+"\n"
+" 显示全部版本库或指定文件的版本历å²ã€‚\n"
+"\n"
+" 显示文件历å²çš„时候ä¸è·Ÿè¸ªæ”¹å或å¤åˆ¶ã€‚对文件å称使用 '-f/--follow'\n"
+" 会跟踪改å或å¤åˆ¶çš„历å²ã€‚当ä¸ç»™å‡ºæ–‡ä»¶å称时,使用 '--follow' åªæ˜¾\n"
+" 示开始版本的直系祖先。使用 '--follow-first' åªæ˜¾ç¤ºåˆå¹¶ç‰ˆæœ¬çš„第一\n"
+" 个父亲。\n"
+"\n"
+" 如果没有指定版本范围,默认是 'tip:0'。当使用 '--follow' 时,使用\n"
+" 工作目录的父亲作为开始版本。\n"
+"\n"
+" å‚è§ 'hg help dates' 以获得 '-d/--date' 的有效格å¼åˆ—表。\n"
+"\n"
+" 此命令缺çœè¾“出: 修改集标识和哈希,标签,父亲,æ交者,日期和时间,\n"
+" 以åŠæ¯æ¬¡æ交的概è¦ä¿¡æ¯ã€‚当使用选项 '-v/--verbose' 时,会显示文件\n"
+" å˜æ›´åˆ—表和完整的æ交信æ¯ã€‚\n"
+"\n"
+" 注æ„: 对于åˆå¹¶ä¿®æ”¹é›†ï¼Œ'log -p' å¯èƒ½äº§ç”Ÿä¸æœŸæœ›çš„差异输出,因为它åª\n"
+" 会将åˆå¹¶ä¿®æ”¹é›†ä¸Žå…¶ç¬¬ä¸€ä¸ªçˆ¶äº²æ¯”较。而且,åªæ˜¾ç¤ºå¯¹æ‰€æœ‰çˆ¶äº²éƒ½ä¸åŒçš„\n"
+" 文件列表。\n"
+"\n"
+" "
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "merge working directory with another revision"
+msgstr ""
+"将工作目录与其它版本åˆå¹¶\n"
+"\n"
+" 将当å‰å·¥ä½œç›®å½•ä¸­çš„内容与指定版本åˆå¹¶ã€‚对任一父亲而言改å˜çš„文件都会对\n"
+" 下次æ交标记为已修改,在æ交之å‰ä¸å…许å†æ‰§è¡Œæ›´æ–°ã€‚\n"
+"\n"
+" 如果没有指定版本,那么工作目录的父亲是一个åˆå¹¶é¡¶ç‚¹ï¼Œå¦ä¸€ä¸ªåœ¨å½“å‰åˆ†æ”¯\n"
+" 中,åˆå¹¶åŽçš„内容是新的顶点。å¦åˆ™ï¼Œå¿…须明确的指定è¦åˆå¹¶çš„版本。\n"
+" "
+
+#, fuzzy
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+"将工作目录与其它版本åˆå¹¶\n"
+"\n"
+" 将当å‰å·¥ä½œç›®å½•ä¸­çš„内容与指定版本åˆå¹¶ã€‚对任一父亲而言改å˜çš„文件都会对\n"
+" 下次æ交标记为已修改,在æ交之å‰ä¸å…许å†æ‰§è¡Œæ›´æ–°ã€‚\n"
+"\n"
+" 如果没有指定版本,那么工作目录的父亲是一个åˆå¹¶é¡¶ç‚¹ï¼Œå¦ä¸€ä¸ªåœ¨å½“å‰åˆ†æ”¯\n"
+" 中,åˆå¹¶åŽçš„内容是新的顶点。å¦åˆ™ï¼Œå¿…须明确的指定è¦åˆå¹¶çš„版本。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+"将工作目录与其它版本åˆå¹¶\n"
+"\n"
+" 将当å‰å·¥ä½œç›®å½•ä¸­çš„内容与指定版本åˆå¹¶ã€‚对任一父亲而言改å˜çš„文件都会对\n"
+" 下次æ交标记为已修改,在æ交之å‰ä¸å…许å†æ‰§è¡Œæ›´æ–°ã€‚\n"
+"\n"
+" 如果没有指定版本,那么工作目录的父亲是一个åˆå¹¶é¡¶ç‚¹ï¼Œå¦ä¸€ä¸ªåœ¨å½“å‰åˆ†æ”¯\n"
+" 中,åˆå¹¶åŽçš„内容是新的顶点。å¦åˆ™ï¼Œå¿…须明确的指定è¦åˆå¹¶çš„版本。\n"
+" "
+
+#, fuzzy
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided.\n"
+" "
+msgstr ""
+"将工作目录与其它版本åˆå¹¶\n"
+"\n"
+" 将当å‰å·¥ä½œç›®å½•ä¸­çš„内容与指定版本åˆå¹¶ã€‚对任一父亲而言改å˜çš„文件都会对\n"
+" 下次æ交标记为已修改,在æ交之å‰ä¸å…许å†æ‰§è¡Œæ›´æ–°ã€‚\n"
+"\n"
+" 如果没有指定版本,那么工作目录的父亲是一个åˆå¹¶é¡¶ç‚¹ï¼Œå¦ä¸€ä¸ªåœ¨å½“å‰åˆ†æ”¯\n"
+" 中,åˆå¹¶åŽçš„内容是新的顶点。å¦åˆ™ï¼Œå¿…须明确的指定è¦åˆå¹¶çš„版本。\n"
+" "
+
+#, python-format
+msgid "branch '%s' has %d heads - please merge with an explicit rev"
+msgstr ""
+
+#, python-format
+msgid "branch '%s' has one head - please merge with an explicit rev"
+msgstr ""
+
+msgid "there is nothing to merge"
+msgstr ""
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr ""
+
+msgid "working dir not at a head rev - use \"hg update\" or merge with an explicit rev"
+msgstr ""
+
+msgid "show changesets not found in destination"
+msgstr ""
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+
+msgid ""
+" See pull for valid destination format details.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "show the parents of the working directory or revision"
+msgstr "显示工作目录或指定版本的父亲"
+
+#, fuzzy
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+" 显示工作目录的父亲版本。如果使用 '--rev' 指定版本,就显示此版本的\n"
+" 父亲。如果指定了文件,那么使用此文件最åŽä¿®æ”¹çš„版本(工作目录的起æº\n"
+" 版本,或 '--rev' 指定的版本)。\n"
+" "
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr ""
+
+msgid "show aliases for remote repositories"
+msgstr ""
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of /etc/mercurial/hgrc\n"
+" and $HOME/.hgrc. If run inside a repository, .hg/hgrc is used, too."
+msgstr ""
+
+msgid ""
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+
+msgid "not found!\n"
+msgstr ""
+
+msgid "not updating, since new heads added\n"
+msgstr ""
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr ""
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr ""
+
+#, fuzzy
+msgid "pull changes from the specified source"
+msgstr ""
+"从指定版本库å–得修改集\n"
+"\n"
+" 从远程版本库å–得修改集到本地版本库。\n"
+"\n"
+" 查找ä½äºŽæŒ‡å®šè·¯å¾„或ä½ç½®çš„版本库的全部修改,增加到版本版本库。默认ä¸\n"
+" 更新工作目录。\n"
+"\n"
+" 如果没有指定ä½ç½®ï¼Œå°±ä½¿ç”¨è·¯å¾„ 'default'。å‚è§ 'hg help urls' 以了解\n"
+" 更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid " Pull changes from a remote repository to a local one."
+msgstr ""
+"从指定版本库å–得修改集\n"
+"\n"
+" 从远程版本库å–得修改集到本地版本库。\n"
+"\n"
+" 查找ä½äºŽæŒ‡å®šè·¯å¾„或ä½ç½®çš„版本库的全部修改,增加到版本版本库。默认ä¸\n"
+" 更新工作目录。\n"
+"\n"
+" 如果没有指定ä½ç½®ï¼Œå°±ä½¿ç”¨è·¯å¾„ 'default'。å‚è§ 'hg help urls' 以了解\n"
+" 更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+"从指定版本库å–得修改集\n"
+"\n"
+" 从远程版本库å–得修改集到本地版本库。\n"
+"\n"
+" 查找ä½äºŽæŒ‡å®šè·¯å¾„或ä½ç½®çš„版本库的全部修改,增加到版本版本库。默认ä¸\n"
+" 更新工作目录。\n"
+"\n"
+" 如果没有指定ä½ç½®ï¼Œå°±ä½¿ç”¨è·¯å¾„ 'default'。å‚è§ 'hg help urls' 以了解\n"
+" 更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" Use hg incoming if you want to see what would have been added by a\n"
+" pull at the time you issued this command. If you then decide to\n"
+" added those changes to the repository, you should use pull -r X\n"
+" where X is the last changeset listed by hg incoming."
+msgstr ""
+"从指定版本库å–得修改集\n"
+"\n"
+" 从远程版本库å–得修改集到本地版本库。\n"
+"\n"
+" 查找ä½äºŽæŒ‡å®šè·¯å¾„或ä½ç½®çš„版本库的全部修改,增加到版本版本库。默认ä¸\n"
+" 更新工作目录。\n"
+"\n"
+" 如果没有指定ä½ç½®ï¼Œå°±ä½¿ç”¨è·¯å¾„ 'default'。å‚è§ 'hg help urls' 以了解\n"
+" 更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See 'hg help urls' for more information.\n"
+" "
+msgstr ""
+"从指定版本库å–得修改集\n"
+"\n"
+" 从远程版本库å–得修改集到本地版本库。\n"
+"\n"
+" 查找ä½äºŽæŒ‡å®šè·¯å¾„或ä½ç½®çš„版本库的全部修改,增加到版本版本库。默认ä¸\n"
+" 更新工作目录。\n"
+"\n"
+" 如果没有指定ä½ç½®ï¼Œå°±ä½¿ç”¨è·¯å¾„ 'default'。å‚è§ 'hg help urls' 以了解\n"
+" 更多信æ¯ã€‚\n"
+" "
+
+#, fuzzy
+msgid "push changes to the specified destination"
+msgstr "推é€æ”¹å˜åˆ°æŒ‡å®šä½ç½®"
+
+#, fuzzy
+msgid " Push changes from the local repository to the given destination."
+msgstr " 从本地版本库推é€æ”¹å˜åˆ°æŒ‡å®šä½ç½®ã€‚"
+
+#, fuzzy
+msgid ""
+" This is the symmetrical operation for pull. It moves changes from\n"
+" the current repository to a different one. If the destination is\n"
+" local this is identical to a pull in that directory from the\n"
+" current one."
+msgstr ""
+" 这是 'pull' 的对称æ“作。它从当å‰ç‰ˆæœ¬åº“推é€æ”¹å˜åˆ°å…¶å®ƒç‰ˆæœ¬åº“。如果目标\n"
+" 是本地版本库,那么此æ“作与在目标版本库从当å‰ç‰ˆæœ¬åº“执行 'pull' æ“作等\n"
+" åŒã€‚"
+
+#, fuzzy
+msgid ""
+" By default, push will refuse to run if it detects the result would\n"
+" increase the number of remote heads. This generally indicates the\n"
+" user forgot to pull and merge before pushing."
+msgstr ""
+" 推é€é»˜è®¤æ‹’ç»å¯¼è‡´å¢žåŠ è¿œç¨‹ç‰ˆæœ¬åº“顶点数目的æ“作。这通常表明客户端在推é€\n"
+" 之å‰å¿˜è®°å–得远程版本库的修改,并且åˆå¹¶ã€‚"
+
+#, fuzzy
+msgid ""
+" If -r/--rev is used, the named revision and all its ancestors will\n"
+" be pushed to the remote repository."
+msgstr ""
+" 如果使用了选项 '-r',此命å修改集以åŠå…¶ç¥–先都会被推é€åˆ°è¿œç¨‹ç‰ˆæœ¬åº“。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Please see 'hg help urls' for important details about ssh://\n"
+" URLs. If DESTINATION is omitted, a default path will be used.\n"
+" "
+msgstr ""
+" å‚è§ä¸»é¢˜ 'urls' 的帮助信æ¯ï¼Œä»¥äº†è§£ä½ç½® 'ssh://' çš„é‡è¦è¯¦æƒ…。如果没有\n"
+" 给出目标ä½ç½®ï¼Œé‚£ä¹ˆä½¿ç”¨é»˜è®¤è·¯å¾„。å‚è§ 'hg help urls' 以了解更多信æ¯ã€‚\n"
+" "
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr "正在推到 %s\n"
+
+msgid "roll back an interrupted transaction"
+msgstr ""
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "remove the specified files on the next commit"
+msgstr "在下次æ交时删除指定文件"
+
+#, fuzzy
+msgid " Schedule the indicated files for removal from the repository."
+msgstr " 调度从版本库删除指定文件。"
+
+#, fuzzy
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+" 它åªä»Žå½“å‰åˆ†æ”¯åˆ é™¤æ–‡ä»¶ï¼Œä¸åˆ é™¤åŽ†å²ã€‚'-A' 用于åªç§»é™¤å·²ç»åˆ é™¤çš„æ–‡\n"
+" 件,'-f' 用于强制删除,'-Af' 用于从下个版本移除文件,但是ä¸åˆ é™¤\n"
+" 它们。"
+
+#, fuzzy
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by hg status). The actions are Warn, Remove (from branch)\n"
+" and Delete (from disk)::"
+msgstr ""
+" 下表给出了删除ä¸åŒçŠ¶æ€(列)文件的行为和å¯é€‰çš„组åˆ(è¡Œ)。文件状æ€\n"
+" ('hg status' 报告的状æ€)是增加(A),干净(C),已修改(M),丢失(!)。\n"
+" 动作是警告(W),移除(R,从分支),以åŠåˆ é™¤(D,从ç£ç›˜)。"
+
+#, fuzzy
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+
+#, fuzzy
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see hg revert.\n"
+" "
+msgstr ""
+" 此命令调度下次æ交时删除文件。\n"
+" è¦åœ¨æ­¤ä¹‹å‰æ’¤é”€åˆ é™¤ï¼Œè¯·å‚è§ 'hg revert'。\n"
+" "
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file %s (use -f to force removal)\n"
+msgstr ""
+
+msgid "still exists"
+msgstr ""
+
+msgid "is modified"
+msgstr ""
+
+msgid "has been marked for add"
+msgstr ""
+
+msgid "rename files; equivalent of copy + remove"
+msgstr ""
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see hg revert.\n"
+" "
+msgstr ""
+
+msgid "retry file merges from a merge or update"
+msgstr ""
+
+msgid ""
+" This command will cleanly retry unresolved file merges using file\n"
+" revisions preserved from the last update or merge. To attempt to\n"
+" resolve all unresolved files, use the -a/--all switch."
+msgstr ""
+
+msgid ""
+" If a conflict is resolved manually, please note that the changes\n"
+" will be overwritten if the merge is retried with resolve. The\n"
+" -m/--mark switch should be used to mark the file as resolved."
+msgstr ""
+
+msgid ""
+" This command also allows listing resolved files and manually\n"
+" indicating whether or not files are resolved. All files must be\n"
+" marked as resolved before a commit is permitted."
+msgstr ""
+
+msgid " The codes used to show the status of files are::"
+msgstr ""
+
+msgid ""
+" U = unresolved\n"
+" R = resolved\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr ""
+
+msgid "can't specify --all and patterns"
+msgstr ""
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+
+msgid "restore individual files or directories to an earlier state"
+msgstr ""
+
+msgid ""
+" (Use update -r to check out earlier revisions, revert does not\n"
+" change the working directory parents.)"
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify the\n"
+" revision to revert to."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See 'hg help\n"
+" dates' for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+
+msgid ""
+" If a file has been deleted, it is restored. If the executable mode\n"
+" of a file was changed, it is reset."
+msgstr ""
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup.\n"
+" "
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr ""
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr ""
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "正在æ¢å¤ %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr "正在撤销删除 %s\n"
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr "ä¿å­˜å½“å‰ç‰ˆæœ¬çš„ %s 为 %s\n"
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr "文件未被控制: %s\n"
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "ä¸éœ€è¦æ”¹å˜ %s\n"
+
+msgid "roll back the last transaction"
+msgstr ""
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back::"
+msgstr ""
+
+msgid ""
+" commit\n"
+" import\n"
+" pull\n"
+" push (with this repository as destination)\n"
+" unbundle"
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr ""
+
+msgid ""
+" Print the root directory of the current repository.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "export the repository via HTTP"
+msgstr "通过 HTTP å‘布版本库"
+
+#, fuzzy
+msgid " Start a local HTTP repository browser and pull server."
+msgstr " å¯åŠ¨æœ¬åœ° HTTP 版本库æµè§ˆå™¨å’Œå‘布æœåŠ¡å™¨ã€‚"
+
+#, fuzzy
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files.\n"
+" "
+msgstr ""
+" 默认æœåŠ¡å™¨è®¿é—®æ—¥å¿—输出到 stdout,错误日志输出到 stderr。\n"
+" å¯ä»¥ä½¿ç”¨é€‰é¡¹ \"-A\" å’Œ \"-E\",将这些日志输出到文件。\n"
+" "
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr ""
+
+#, fuzzy
+msgid "show changed files in the working directory"
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+#, fuzzy
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+#, fuzzy
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+#, fuzzy
+msgid ""
+" NOTE: status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does not\n"
+" report permission changes and diff only reports changes relative\n"
+" to one merge parent."
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+#, fuzzy
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown."
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+#, fuzzy
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)\n"
+" "
+msgstr ""
+"显示工作目录中已改å˜çš„文件\n"
+"\n"
+" 显示版本库中的文件状æ€ã€‚如果指定文件å称,åªæ˜¾ç¤ºåŒ¹é…的文件。干净的\n"
+" 文件,被忽略的文件,å¤åˆ¶/移动的æºæ–‡ä»¶ï¼Œä¸ä¼šè¢«æ˜¾ç¤ºï¼Œé™¤éžä½¿ç”¨äº†é€‰é¡¹\n"
+" '-c' (干净的),'-i' (被忽略的),'-C' (å¤åˆ¶æº) 或者 '-A' (全部)。除\n"
+" éžä½¿ç”¨äº†é€‰é¡¹ \"åªæ˜¾ç¤º ...\",å¦åˆ™å°±ä½¿ç”¨é€‰é¡¹ '-mardu'。\n"
+"\n"
+" 选项 '-q/--quiet' éšè—未跟踪(未知或被忽略)的文件,除éžæ˜Žç¡®åœ°ä½¿ç”¨é€‰\n"
+" 项 '-u/--unknown' 或 ‘-i/-ignored’。\n"
+"\n"
+" 注æ„: 如果修改了æƒé™æˆ–者执行了åˆå¹¶ï¼Œ'status' 与 'diff' 的显示å¯èƒ½\n"
+" ä¸ä¸€è‡´ã€‚标准差异格å¼ä¸æŠ¥å‘Šæƒé™çš„改å˜ï¼Œ'diff' åªæŠ¥å‘Šç›¸å¯¹äºŽä¸€ä¸ªåˆå¹¶\n"
+" 父亲的改å˜ã€‚\n"
+"\n"
+" 如果给出 1 个版本,就用于基础版本。如果给出 2 个版本,就显示其差异。\n"
+"\n"
+" 显示文件状æ€çš„代ç æ˜¯:\n"
+" M = 已修改\n"
+" A = 已增加\n"
+" R = 已移除\n"
+" C = 干净的\n"
+" ! = 已删除,ä»æ—§è¢«è·Ÿè¸ª\n"
+" ? = 未跟踪\n"
+" I = 已忽略\n"
+" = 早先增加的文件自此å¤åˆ¶\n"
+" "
+
+msgid "add one or more tags for the current or given revision"
+msgstr ""
+
+msgid " Name a particular revision using <name>."
+msgstr ""
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc."
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed\n"
+" similarly to other project files and can be hand-edited if\n"
+" necessary. The file '.hg/localtags' is used for local tags (not\n"
+" shared among repositories)."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr ""
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr ""
+
+msgid "--rev and --remove are incompatible"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "éžæœ¬åœ°ç‰ˆæœ¬åº“ '%s'"
+
+#, fuzzy, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "éžæœ¬åœ°ç‰ˆæœ¬åº“ '%s'"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr ""
+
+msgid "list repository tags"
+msgstr ""
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags.\n"
+" "
+msgstr ""
+
+msgid "show the tip revision"
+msgstr ""
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset.\n"
+" "
+msgstr ""
+
+msgid "apply one or more changegroup files"
+msgstr ""
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command.\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "update working directory"
+msgstr "更新工作目录"
+
+#, fuzzy
+msgid ""
+" Update the repository's working directory to the specified\n"
+" revision, or the tip of the current branch if none is specified.\n"
+" Use null as the revision to remove the working copy (like 'hg\n"
+" clone -U')."
+msgstr ""
+" 更新工作目录到指定版本,或者到当å‰åˆ†æ”¯çš„顶点。使用 'null' 作为版本å¯ä»¥\n"
+" 删除工作副本(类似于 'hg clone -U')。"
+
+#, fuzzy
+msgid ""
+" When the working directory contains no uncommitted changes, it\n"
+" will be replaced by the state of the requested revision from the\n"
+" repository. When the requested revision is on a different branch,\n"
+" the working directory will additionally be switched to that\n"
+" branch."
+msgstr ""
+" 当工作目录包å«æœªæ交的修改时,它会被版本库中指定版本的状æ€æ›¿æ¢ã€‚当请求\n"
+" 的版本ä½äºŽä¸åŒåˆ†æ”¯æ—¶ï¼Œå·¥ä½œç›®å½•ä¼šè¢«åˆ‡æ¢åˆ°æ­¤åˆ†æ”¯ã€‚"
+
+#, fuzzy
+msgid ""
+" When there are uncommitted changes, use option -C/--clean to\n"
+" discard them, forcibly replacing the state of the working\n"
+" directory with the requested revision. Alternately, use -c/--check\n"
+" to abort."
+msgstr ""
+" å¯ä»¥ä½¿ç”¨é€‰é¡¹ '-C' æ¥ä¸¢å¼ƒæœªæ交的修改,强制使用请求的版本替æ¢å·¥ä½œç›®å½•çš„\n"
+" 状æ€ã€‚"
+
+#, fuzzy
+msgid ""
+" When there are uncommitted changes and option -C/--clean is not\n"
+" used, and the parent revision and requested revision are on the\n"
+" same branch, and one of them is an ancestor of the other, then the\n"
+" new working directory will contain the requested revision merged\n"
+" with the uncommitted changes. Otherwise, the update will fail with\n"
+" a suggestion to use 'merge' or 'update -C' instead."
+msgstr ""
+" 当有未æ交的修改,没有使用选项 '-C',父版本和请求版本ä½äºŽä¸åŒåˆ†æ”¯ï¼Œå¹¶ä¸”\n"
+" 其中一个是å¦ä¸€ä¸ªçš„祖先时,那么新的工作目录包å«è¯·æ±‚版本与未æ交的修改的\n"
+" åˆå¹¶ç»“果。å¦åˆ™ï¼Œæ›´æ–°ä¼šå¤±è´¥ï¼Œå»ºè®®ä½¿ç”¨ 'merge' 或 'update -C'。"
+
+#, fuzzy
+msgid ""
+" If you want to update just one file to an older revision, use\n"
+" revert."
+msgstr " 如果你åªæƒ³æ›´æ–°ä¸€ä¸ªæ–‡ä»¶åˆ°æ—§ç‰ˆæœ¬ï¼Œè¯·ä½¿ç”¨ 'revert'。"
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+
+#, fuzzy
+msgid "uncommitted local changes"
+msgstr "æ交修改集 %d:%s\n"
+
+msgid "verify the integrity of the repository"
+msgstr ""
+
+msgid " Verify the integrity of the current repository."
+msgstr ""
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices.\n"
+" "
+msgstr ""
+
+msgid "output version and copyright information"
+msgstr "输出版本和版æƒä¿¡æ¯"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "分布å¼è½¯ä»¶é…置管ç†å·¥å…· - 水银 (版本 %s)\n"
+
+msgid ""
+"\n"
+"Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+"\n"
+"版æƒæ‰€æœ‰ (C) 2005-2010 Matt Mackall <mpm@selenic.com> 和其他人。\n"
+"这是自由软件,具体å‚è§ç‰ˆæƒæ¡æ¬¾ã€‚这里没有任何担ä¿ï¼Œç”šè‡³æ²¡æœ‰é€‚åˆ\n"
+"特定目的的éšå«çš„æ‹…ä¿ã€‚\n"
+
+msgid "repository root directory or symbolic path name"
+msgstr "版本库的根目录或符å·è·¯å¾„å称"
+
+msgid "change working directory"
+msgstr "改å˜å·¥ä½œç›®å½•"
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr "ä¸å†è¯¢é—®ï¼Œå‡å®šæ‰€æœ‰ç­”案都是 'yes'"
+
+msgid "suppress output"
+msgstr "抑制输出"
+
+msgid "enable additional output"
+msgstr "å¯ç”¨é¢å¤–的输出"
+
+msgid "set/override config option"
+msgstr "设置/覆盖é…置选项"
+
+msgid "enable debugging output"
+msgstr "å¯ç”¨è°ƒè¯•è¾“出"
+
+msgid "start debugger"
+msgstr "å¯åŠ¨è°ƒè¯•å™¨"
+
+msgid "set the charset encoding"
+msgstr "设置字符集编ç "
+
+msgid "set the charset encoding mode"
+msgstr "设置字符集编ç æ¨¡å¼"
+
+msgid "print traceback on exception"
+msgstr "显示异常的跟踪"
+
+msgid "time how long the command takes"
+msgstr "为命令计时"
+
+msgid "print command execution profile"
+msgstr "显示命令执行的剖æž"
+
+msgid "output version information and exit"
+msgstr "显示版本信æ¯åŽé€€å‡º"
+
+msgid "display help and exit"
+msgstr "显示帮助åŽé€€å‡º"
+
+msgid "do not perform actions, just print output"
+msgstr "ä¸æ‰§è¡Œæ“作,åªæ‰“å°è¾“出"
+
+msgid "specify ssh command to use"
+msgstr "指定è¦ä½¿ç”¨çš„ 'ssh' 命令"
+
+msgid "specify hg command to run on the remote side"
+msgstr "指定è¦åœ¨è¿œç¨‹è¿è¡Œçš„ 'hg' 命令"
+
+msgid "include names matching the given patterns"
+msgstr "包å«åŒ¹é…指定模å¼çš„å称"
+
+msgid "exclude names matching the given patterns"
+msgstr "æ‹’ç»åŒ¹é…指定模å¼çš„å称"
+
+msgid "use <text> as commit message"
+msgstr "使用 <text> 作为æ交日志"
+
+msgid "read commit message from <file>"
+msgstr "从 <file> 读å–æ交日志"
+
+msgid "record datecode as commit date"
+msgstr "å°†æ供的日期作为æ交日期"
+
+#, fuzzy
+msgid "record the specified user as committer"
+msgstr "å°†æ供的用户作为æ交者"
+
+msgid "display using template map file"
+msgstr "使用指定的样å¼æ˜¾ç¤º"
+
+msgid "display with template"
+msgstr "使用指定的模æ¿æ˜¾ç¤º"
+
+msgid "do not show merges"
+msgstr "ä¸æ˜¾ç¤ºåˆå¹¶"
+
+msgid "treat all files as text"
+msgstr "将所有文件视为文本文件"
+
+msgid "don't include dates in diff headers"
+msgstr "ä¸è¦çš„差异头中包å«æ—¥æœŸ"
+
+msgid "show which function each change is in"
+msgstr "为æ¯ä¸ªä¿®æ”¹æ˜¾ç¤ºåœ¨ä»€ä¹ˆå‡½æ•°ä¸­"
+
+msgid "ignore white space when comparing lines"
+msgstr "当比较行时忽略空白"
+
+msgid "ignore changes in the amount of white space"
+msgstr "忽略空白数é‡çš„改å˜"
+
+msgid "ignore changes whose lines are all blank"
+msgstr "忽略空行的改å˜"
+
+msgid "number of lines of context to show"
+msgstr "显示几行上下文"
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr ""
+
+msgid "[OPTION]... [FILE]..."
+msgstr ""
+
+msgid "annotate the specified revision"
+msgstr "追溯指定版本"
+
+msgid "follow file copies and renames"
+msgstr "处ç†æ–‡ä»¶å¤åˆ¶ä¸Žæ”¹å"
+
+msgid "list the author (long with -v)"
+msgstr "列出作者 (增加 '-v' 会以长格å¼æ˜¾ç¤º)"
+
+msgid "list the date (short with -q)"
+msgstr "列出日期 (增加 '-q' 会以短格å¼æ˜¾ç¤º)"
+
+msgid "list the revision number (default)"
+msgstr "åˆ—å‡ºç‰ˆæœ¬å· (默认)"
+
+msgid "list the changeset"
+msgstr "列出修改集"
+
+msgid "show line number at the first appearance"
+msgstr "列出首次出现时的行å·"
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr ""
+
+msgid "do not pass files through decoders"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr ""
+
+msgid "revision to distribute"
+msgstr ""
+
+msgid "type of distribution to create"
+msgstr ""
+
+msgid "[OPTION]... DEST"
+msgstr ""
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge"
+msgstr ""
+
+msgid "revision to backout"
+msgstr ""
+
+msgid "[OPTION]... [-r] REV"
+msgstr ""
+
+msgid "reset bisect state"
+msgstr ""
+
+msgid "mark changeset good"
+msgstr ""
+
+msgid "mark changeset bad"
+msgstr ""
+
+msgid "skip testing changeset"
+msgstr ""
+
+msgid "use command to check changeset state"
+msgstr ""
+
+msgid "do not update to target"
+msgstr ""
+
+msgid "[-gbsr] [-c CMD] [REV]"
+msgstr ""
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr ""
+
+msgid "reset branch name to parent branch name"
+msgstr ""
+
+msgid "[-fC] [NAME]"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr ""
+
+#, fuzzy
+msgid "show normal and closed branches"
+msgstr "åªæ˜¾ç¤ºå·²å¢žåŠ æ–‡ä»¶çš„状æ€"
+
+msgid "[-a]"
+msgstr ""
+
+msgid "run even when remote repository is unrelated"
+msgstr "纵然远程版本库是无关的也è¦æ‰§è¡Œ"
+
+msgid "a changeset up to which you would like to bundle"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr ""
+
+msgid "print output to file with formatted name"
+msgstr "输出到使用格å¼åŒ–å称的文件中"
+
+msgid "print the given revision"
+msgstr ""
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr ""
+
+msgid "the clone will only contain a repository (no working copy)"
+msgstr "åªå¤åˆ¶ç‰ˆæœ¬åº“(没有工作副本)"
+
+msgid "a changeset you would like to have after cloning"
+msgstr "å¤åˆ¶åŽä½ æœŸæœ›æœ‰çš„修改集"
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr "在æ交之å‰å°†'æ–°çš„/丢失的'文件标记为'已增加/已删除'"
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr "标记一个分支已关闭,ä¸åœ¨åˆ†æ”¯åˆ—表中显示"
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr ""
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+#, fuzzy
+msgid "[COMMAND]"
+msgstr "命令"
+
+msgid "show the command options"
+msgstr ""
+
+msgid "[-o] CMD"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr ""
+
+msgid "[-e] DATE [RANGE]"
+msgstr ""
+
+msgid "FILE REV"
+msgstr ""
+
+msgid "[PATH]"
+msgstr ""
+
+msgid "FILE"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr ""
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr ""
+
+msgid "[OPTION]..."
+msgstr ""
+
+#, fuzzy
+msgid "revision to check"
+msgstr "è¦åˆå¹¶çš„版本"
+
+msgid "[OPTION]... [-r REV1 [-r REV2]] [FILE]..."
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr "与第二个父亲比较"
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr ""
+
+msgid "print all revisions that match"
+msgstr ""
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr "跟踪修改集历å²ï¼Œæˆ–者跟踪文件的å¤åˆ¶ä¸Žæ”¹åæ“作"
+
+msgid "ignore case when matching"
+msgstr ""
+
+msgid "print only filenames and revisions that match"
+msgstr ""
+
+msgid "print matching line numbers"
+msgstr ""
+
+msgid "search in given revision range"
+msgstr ""
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr ""
+
+msgid "show only heads which are descendants of REV"
+msgstr ""
+
+#, fuzzy
+msgid "show only the active branch heads from open branches"
+msgstr "svn: 分支没有版本 %s"
+
+#, fuzzy
+msgid "show normal and closed branch heads"
+msgstr "åªæ˜¾ç¤ºå·²å¢žåŠ æ–‡ä»¶çš„状æ€"
+
+msgid "[-r STARTREV] [REV]..."
+msgstr ""
+
+msgid "[TOPIC]"
+msgstr ""
+
+#, fuzzy
+msgid "identify the specified revision"
+msgstr "追溯指定版本"
+
+msgid "show local revision number"
+msgstr ""
+
+msgid "show global revision id"
+msgstr ""
+
+msgid "show branch"
+msgstr ""
+
+msgid "show tags"
+msgstr ""
+
+msgid "[-nibt] [-r REV] [SOURCE]"
+msgstr ""
+
+msgid "directory strip option for patch. This has the same meaning as the corresponding patch option"
+msgstr ""
+
+msgid "base path"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+
+msgid "don't commit, just update the working directory"
+msgstr ""
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr ""
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr ""
+
+msgid "show newest record first"
+msgstr ""
+
+msgid "file to store the bundles into"
+msgstr ""
+
+msgid "a specific revision up to which you would like to pull"
+msgstr "指定è¦å–得的最高版本"
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr ""
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "search the repository as it stood at REV"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr "在文件å称结尾增加 NUL,用于 xargs"
+
+msgid "print complete paths from the filesystem root"
+msgstr ""
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr "åªè·Ÿè¸ªä¿®æ”¹é›†çš„第一个父亲"
+
+#, fuzzy
+msgid "show revisions matching date spec"
+msgstr "显示匹é…日期的版本"
+
+msgid "show copied files"
+msgstr "显示å¤åˆ¶çš„文件"
+
+msgid "do case-insensitive search for a keyword"
+msgstr "对关键字执行ä¸åŒºåˆ†å¤§å°å†™çš„æœç´¢"
+
+#, fuzzy
+msgid "include revisions where files were removed"
+msgstr "包å«åˆ é™¤æ–‡ä»¶çš„版本"
+
+msgid "show only merges"
+msgstr "åªæ˜¾ç¤ºåˆå¹¶"
+
+#, fuzzy
+msgid "revisions committed by user"
+msgstr "指定用户æ交的版本"
+
+msgid "show only changesets within the given named branch"
+msgstr "åªæ˜¾ç¤ºä½äºŽæŒ‡å®šå‘½å分支中的修改集"
+
+msgid "do not display revision or any of its ancestors"
+msgstr "ä¸æ˜¾ç¤ºæŒ‡å®šç‰ˆæœ¬æˆ–其祖先"
+
+msgid "[OPTION]... [FILE]"
+msgstr ""
+
+msgid "revision to display"
+msgstr ""
+
+msgid "[-r REV]"
+msgstr ""
+
+msgid "force a merge with outstanding changes"
+msgstr "强制与已有修改åˆå¹¶"
+
+msgid "revision to merge"
+msgstr "è¦åˆå¹¶çš„版本"
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-f] [[-r] REV]"
+msgstr ""
+
+msgid "a specific revision up to which you would like to push"
+msgstr "指定你è¦æŽ¨é€çš„最高版本"
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr ""
+
+#, fuzzy
+msgid "show parents from the specified revision"
+msgstr "从指定的版本显示父亲"
+
+msgid "[-r REV] [FILE]"
+msgstr ""
+
+msgid "[NAME]"
+msgstr ""
+
+msgid "update to new tip if changesets were pulled"
+msgstr "如果有新的修改集,就更新到最新版本"
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr ""
+
+msgid "force push"
+msgstr "强制推é€"
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr "将丢失的文件视为删除"
+
+msgid "remove (and delete) file even if added or modified"
+msgstr "删除文件,纵然它已被增加或修改"
+
+msgid "record a rename that has already occurred"
+msgstr "记录已ç»å‘生的改å"
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr ""
+
+msgid "remerge all unresolved files"
+msgstr ""
+
+msgid "list state of files needing merge"
+msgstr ""
+
+msgid "mark files as resolved"
+msgstr ""
+
+msgid "unmark files as resolved"
+msgstr ""
+
+msgid "revert all changes when no arguments given"
+msgstr ""
+
+msgid "tipmost revision matching date"
+msgstr "匹é…最接近顶点的日期"
+
+msgid "revision to revert to"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr ""
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr "记录访问日志的文件å称"
+
+msgid "name of error log file to write to"
+msgstr "记录错误日志的文件å称"
+
+msgid "port to listen on (default: 8000)"
+msgstr "监å¬çš„端å£(默认: 8000)"
+
+msgid "address to listen on (default: all interfaces)"
+msgstr "监å¬åœ°å€(默认: 所有地å€)"
+
+msgid "prefix path to serve from (default: server root)"
+msgstr "æœåŠ¡è·¯å¾„å‰ç¼€(默认: æœåŠ¡å™¨æ ¹)"
+
+#, fuzzy
+msgid "name to show in web pages (default: working directory)"
+msgstr "在 WEB 页é¢ä¸­æ˜¾ç¤ºçš„å称(默认: 工作目录)"
+
+#, fuzzy
+msgid "name of the webdir config file (serve more than one repository)"
+msgstr "webdir é…置文件的å称(å‘布多个版本库)"
+
+msgid "for remote clients"
+msgstr "针对远程客户端"
+
+msgid "web templates to use"
+msgstr "使用的 WEB 模æ¿"
+
+msgid "template style to use"
+msgstr "使用的显示样å¼"
+
+msgid "use IPv6 in addition to IPv4"
+msgstr "åŒæ—¶ä½¿ç”¨ IPv6 å’Œ IPv4"
+
+msgid "SSL certificate file"
+msgstr "SSL è¯ä¹¦æ–‡ä»¶"
+
+msgid "show untrusted configuration options"
+msgstr "显示ä¸èƒ½ä¿¡èµ–çš„é…置选项"
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "show status of all files"
+msgstr "显示全部文件的状æ€"
+
+msgid "show only modified files"
+msgstr "åªæ˜¾ç¤ºå·²ä¿®æ”¹æ–‡ä»¶çš„状æ€"
+
+msgid "show only added files"
+msgstr "åªæ˜¾ç¤ºå·²å¢žåŠ æ–‡ä»¶çš„状æ€"
+
+msgid "show only removed files"
+msgstr "åªæ˜¾ç¤ºå·²ç§»é™¤æ–‡ä»¶çš„状æ€"
+
+msgid "show only deleted (but tracked) files"
+msgstr "åªæ˜¾ç¤ºå·²åˆ é™¤(但被跟踪)文件的状æ€"
+
+msgid "show only files without changes"
+msgstr "åªæ˜¾ç¤ºæ— æ”¹åŠ¨æ–‡ä»¶çš„状æ€"
+
+msgid "show only unknown (not tracked) files"
+msgstr "åªæ˜¾ç¤ºæœªçŸ¥(未被跟踪)文件的状æ€"
+
+msgid "show only ignored files"
+msgstr "åªæ˜¾ç¤ºè¢«å¿½ç•¥æ–‡ä»¶çš„状æ€"
+
+msgid "hide status prefix"
+msgstr "éšè—状æ€å‰ç¼€"
+
+msgid "show source of copied files"
+msgstr "显示文件的å¤åˆ¶æº"
+
+msgid "show difference from revision"
+msgstr "显示版本差异"
+
+msgid "replace existing tag"
+msgstr "替æ¢å·²æœ‰çš„标签"
+
+msgid "make the tag local"
+msgstr "标记标签为本地"
+
+msgid "revision to tag"
+msgstr "标签对应的版本"
+
+msgid "remove a tag"
+msgstr "删除标签"
+
+msgid "[-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr ""
+
+msgid "[-p]"
+msgstr ""
+
+msgid "update to new tip if changesets were unbundled"
+msgstr ""
+
+msgid "[-u] FILE..."
+msgstr ""
+
+msgid "overwrite locally modified files (no backup)"
+msgstr "覆盖本地修改的文件(ä¸å¤‡ä»½)"
+
+#, fuzzy
+msgid "check for uncommitted changes"
+msgstr "æ交修改集 %d:%s\n"
+
+msgid "[-C] [-d DATE] [[-r] REV]"
+msgstr ""
+
+#, python-format
+msgid "config error at %s:%d: '%s'"
+msgstr ""
+
+msgid "not found in manifest"
+msgstr ""
+
+msgid "branch name not in UTF-8!"
+msgstr ""
+
+#, python-format
+msgid " searching for copies back to rev %d\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" unmatched files in local:\n"
+" %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" unmatched files in other:\n"
+" %s\n"
+msgstr ""
+
+msgid " all copies found (* = to merge, ! = divergent):\n"
+msgstr ""
+
+msgid " checking for directory renames\n"
+msgstr ""
+
+#, python-format
+msgid " dir %s -> %s\n"
+msgstr ""
+
+#, python-format
+msgid " file %s -> %s\n"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr ""
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr ""
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "not in dirstate: %s\n"
+msgstr ""
+
+msgid "unknown"
+msgstr ""
+
+msgid "character device"
+msgstr ""
+
+msgid "block device"
+msgstr ""
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr ""
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr ""
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "中止: %s\n"
+
+#, python-format
+msgid "hg: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "中止: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "中止: ä¸èƒ½é”定 %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "中止: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "中止: %s"
+
+msgid " empty string\n"
+msgstr ""
+
+msgid "killed!\n"
+msgstr ""
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: 未知命令 '%s'\n"
+
+#, python-format
+msgid "abort: could not import module %s!\n"
+msgstr "中止: ä¸èƒ½å¯¼å…¥æ¨¡å— %s!\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(你是å¦å¿˜è®°äº†ç¼–译扩展?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(你的 Python 安装正确�)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr "中止: 失败: %s\n"
+
+msgid "broken pipe\n"
+msgstr "å掉的管é“\n"
+
+msgid "interrupted!\n"
+msgstr "中断!\n"
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+"\n"
+"å掉的管é“\n"
+
+msgid "abort: out of memory\n"
+msgstr "中止: 内存ä¸è¶³\n"
+
+msgid "** unknown exception encountered, details follow\n"
+msgstr "** é‡åˆ°äº†æœªçŸ¥å¼‚常,详细信æ¯å¦‚下\n"
+
+#, fuzzy
+msgid "** report bug details to http://mercurial.selenic.com/bts/\n"
+msgstr "** 报告问题详情到 http://www.selenic.com/mercurial/bts\n"
+
+msgid "** or mercurial@selenic.com\n"
+msgstr "** 或 mercurial@selenic.com\n"
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr "** 分布å¼è½¯ä»¶é…置管ç†å·¥å…· - 水银 (版本 %s)\n"
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** 已加载的扩展: %s\n"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr "hg: 未知命令 '%s'\n"
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "alias '%s' shadows command\n"
+msgstr ""
+"命令列表:\n"
+"\n"
+
+#, python-format
+msgid "malformed --config option: %s"
+msgstr "éžæ³• '--config' 选项: %s"
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr "扩展 '%s' 覆盖了命令: %s\n"
+
+msgid "Option --config may not be abbreviated!"
+msgstr "选项 '--config' ä¸èƒ½ç®€çŸ­!"
+
+msgid "Option --cwd may not be abbreviated!"
+msgstr "选项 '--cwd' ä¸èƒ½ç®€çŸ­!"
+
+#, fuzzy
+msgid "Option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!"
+msgstr "选项 -R 必须隔离使用(也就是ä¸èƒ½ -qR),并且 --repository åªèƒ½ç®€çŸ­ä¸º --repo!"
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr "时间: 实际 %.3f 秒(用户 %.3f+%.3f 系统 %.3f+%.3f)\n"
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "éžæœ¬åœ°ç‰ˆæœ¬åº“ '%s'"
+
+msgid "invalid arguments"
+msgstr "éžæ³•å‚æ•°"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid "lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/misc/lsprof/"
+msgstr "lsprof ä¸å¯ç”¨ - 从 http://codespeak.net/svn/user/arigo/hack/misc/lsprof/ 安装"
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** 加载扩展 '%s',自 '%s': %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** 加载扩展 '%s' 失败: %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "ä¸èƒ½æ‰¾åˆ°åˆå¹¶å·¥å…· '%s'\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "工具 '%s' ä¸èƒ½å¤„ç†ç¬¦å·é“¾æŽ¥\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "工具 '%s' ä¸èƒ½å¤„ç†äºŒè¿›åˆ¶\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "工具 '%s' éœ€è¦ GUI\n"
+
+#, python-format
+msgid "picked tool '%s' for %s (binary %s symlink %s)\n"
+msgstr "选择工具 '%s',用于 %s(二进制 %s 符å·é“¾æŽ¥ %s)\n"
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" 没有找到工具åˆå¹¶ %s\n"
+"使用本地(l)或者他人(o)的内容?"
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "my %s other %s ancestor %s\n"
+msgstr ""
+
+msgid " premerge successful\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr ""
+
+#, python-format
+msgid "Inconsistent state, %s:%s is good and bad"
+msgstr ""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid ""
+"\n"
+" Mercurial has the ability to add new features through the use of\n"
+" extensions. Extensions may add new commands, add options to\n"
+" existing commands, change the default behavior of commands, or\n"
+" implement hooks."
+msgstr ""
+
+msgid ""
+" Extensions are not loaded by default for a variety of reasons:\n"
+" they can increase startup overhead; they may be meant for advanced\n"
+" usage only; they may provide potentially dangerous abilities (such\n"
+" as letting you destroy or modify history); they might not be ready\n"
+" for prime time; or they may alter some usual behaviors of stock\n"
+" Mercurial. It is thus up to the user to activate extensions as\n"
+" needed."
+msgstr ""
+
+msgid ""
+" To enable the \"foo\" extension, either shipped with Mercurial or in\n"
+" the Python search path, create an entry for it in your hgrc, like\n"
+" this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+
+msgid " You may also specify the full path to an extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+" To explicitly disable an extension enabled in an hgrc of broader\n"
+" scope, prepend its path with !::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+" "
+msgstr ""
+
+#, fuzzy
+msgid "disabled extensions:"
+msgstr ""
+"\n"
+"å¯ç”¨çš„扩展:\n"
+"\n"
+
+msgid "Date Formats"
+msgstr ""
+
+msgid ""
+"\n"
+" Some commands allow the user to specify a date, e.g.:"
+msgstr ""
+
+msgid ""
+" - backout, commit, import, tag: Specify the commit date.\n"
+" - log, revert, update: Select revision(s) by date."
+msgstr ""
+
+msgid " Many date formats are valid. Here are some examples::"
+msgstr ""
+
+msgid ""
+" \"Wed Dec 6 13:18:29 2006\" (local timezone assumed)\n"
+" \"Dec 6 13:18 -0600\" (year assumed, time offset provided)\n"
+" \"Dec 6 13:18 UTC\" (UTC and GMT are aliases for +0000)\n"
+" \"Dec 6\" (midnight)\n"
+" \"13:18\" (today assumed)\n"
+" \"3:39\" (3:39AM assumed)\n"
+" \"3:39pm\" (15:39)\n"
+" \"2006-12-06 13:18:29\" (ISO 8601 format)\n"
+" \"2006-12-6 13:18\"\n"
+" \"2006-12-6\"\n"
+" \"12-6\"\n"
+" \"12/6\"\n"
+" \"12/6/6\" (Dec 6 2006)"
+msgstr ""
+
+msgid " Lastly, there is Mercurial's internal format::"
+msgstr ""
+
+msgid " \"1165432709 0\" (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+" This is the internal representation format for dates. unixtime is\n"
+" the number of seconds since the epoch (1970-01-01 00:00 UTC).\n"
+" offset is the offset of the local timezone, in seconds west of UTC\n"
+" (negative if the timezone is east of UTC)."
+msgstr ""
+
+msgid " The log command also accepts date ranges::"
+msgstr ""
+
+msgid ""
+" \"<{datetime}\" - at or before a given date/time\n"
+" \">{datetime}\" - on or after a given date/time\n"
+" \"{datetime} to {datetime}\" - a date range, inclusive\n"
+" \"-{days}\" - within a given number of days of today\n"
+" "
+msgstr ""
+
+msgid "File Name Patterns"
+msgstr ""
+
+msgid ""
+"\n"
+" Mercurial accepts several notations for identifying one or more\n"
+" files at a time."
+msgstr ""
+
+msgid ""
+" By default, Mercurial treats filenames as shell-style extended\n"
+" glob patterns."
+msgstr ""
+
+msgid " Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+" To use a plain path name without any pattern matching, start it\n"
+" with \"path:\". These path names must completely match starting at\n"
+" the current repository root."
+msgstr ""
+
+msgid ""
+" To use an extended glob, start a name with \"glob:\". Globs are\n"
+" rooted at the current directory; a glob such as \"``*.c``\" will\n"
+" only match files in the current directory ending with \".c\"."
+msgstr ""
+
+msgid ""
+" The supported glob syntax extensions are \"``**``\" to match any\n"
+" string across path separators and \"{a,b}\" to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+" To use a Perl/Python regular expression, start a name with \"re:\".\n"
+" Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid " Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid " Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid " Regexp examples::"
+msgstr ""
+
+msgid " re:.*\\.c$ any name ending in \".c\", anywhere in the repository"
+msgstr ""
+
+msgid "Environment Variables"
+msgstr ""
+
+msgid ""
+"\n"
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use .hgrc)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for hgrc files. Item\n"
+" separator is \":\" on Unix, \";\" on Windows. If HGRCPATH is not set,\n"
+" platform default search path is used. If empty, only the .hg/hgrc\n"
+" from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - hgrc files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with '@hostname' appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+" "
+msgstr ""
+
+msgid "Specifying Single Revisions"
+msgstr ""
+
+msgid ""
+"\n"
+" Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+" A plain integer is treated as a revision number. Negative integers\n"
+" are treated as sequential offsets from the tip, with -1 denoting\n"
+" the tip, -2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+" A 40-digit hexadecimal string is treated as a unique revision\n"
+" identifier."
+msgstr ""
+
+msgid ""
+" A hexadecimal string less than 40 characters long is treated as a\n"
+" unique revision identifier and is referred to as a short-form\n"
+" identifier. A short-form identifier is only valid if it is the\n"
+" prefix of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+" Any other string is treated as a tag or branch name. A tag name is\n"
+" a symbolic name associated with a revision identifier. A branch\n"
+" name denotes the tipmost revision of that branch. Tag and branch\n"
+" names must not contain the \":\" character."
+msgstr ""
+
+msgid ""
+" The reserved name \"tip\" is a special tag that always identifies\n"
+" the most recent revision."
+msgstr ""
+
+msgid ""
+" The reserved name \"null\" indicates the null revision. This is the\n"
+" revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+" The reserved name \".\" indicates the working directory parent. If\n"
+" no working directory is checked out, it is equivalent to null. If\n"
+" an uncommitted merge is in progress, \".\" is the revision of the\n"
+" first parent.\n"
+" "
+msgstr ""
+
+msgid "Specifying Multiple Revisions"
+msgstr "指定多个版本"
+
+#, fuzzy
+msgid ""
+"\n"
+" When Mercurial accepts more than one revision, they may be\n"
+" specified individually, or provided as a topologically continuous\n"
+" range, separated by the \":\" character."
+msgstr ""
+"\n"
+" 当水银接å—多个版本时,它们å¯ä»¥å•ç‹¬ç»™å‡ºï¼Œæˆ–者以字符 \":\" 分割的拓扑连续\n"
+" 范围格å¼æ供。"
+
+#, fuzzy
+msgid ""
+" The syntax of range notation is [BEGIN]:[END], where BEGIN and END\n"
+" are revision identifiers. Both BEGIN and END are optional. If\n"
+" BEGIN is not specified, it defaults to revision number 0. If END\n"
+" is not specified, it defaults to the tip. The range \":\" thus means\n"
+" \"all revisions\"."
+msgstr ""
+" 范围的语法是 '[BEGIN]:[END]',其中 'BEGIN' 和 'END' 是版本标识。'BEGIN'\n"
+" å’Œ 'END' 都是å¯é€‰çš„。'BEGIN' 默认是 0,'END' 默认是 'tip'。因此范围 \":\"\n"
+" æ„味ç€å…¨éƒ¨ç‰ˆæœ¬ã€‚"
+
+#, fuzzy
+msgid ""
+" If BEGIN is greater than END, revisions are treated in reverse\n"
+" order."
+msgstr " 如果 'BEGIN' 大于 'END',版本视为ååºã€‚"
+
+#, fuzzy
+msgid ""
+" A range acts as a closed interval. This means that a range of 3:5\n"
+" gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+" "
+msgstr ""
+" 范围是闭区间。å³èŒƒå›´ '3:5' 是 '3','4','5'。åŒæ ·ï¼ŒèŒƒå›´ '9:6' 是 '9',\n"
+" '8','7' 和 '6'。\n"
+" "
+
+msgid "Diff Formats"
+msgstr "差异格å¼"
+
+#, fuzzy
+msgid ""
+"\n"
+" Mercurial's default format for showing changes between two\n"
+" versions of a file is compatible with the unified format of GNU\n"
+" diff, which can be used by GNU patch and many other standard\n"
+" tools."
+msgstr ""
+"\n"
+" 水银显示文件ä¸åŒç‰ˆæœ¬ä¹‹é—´å·®å¼‚çš„æ ¼å¼ä¸Ž GNU diff 标准格å¼å…¼å®¹ï¼Œå¯ç”¨äºŽ\n"
+" GNU patch 和许多标准工具。"
+
+#, fuzzy
+msgid ""
+" While this standard format is often enough, it does not encode the\n"
+" following information:"
+msgstr " 虽然标准格å¼åœ¨å¤§å¤šæ•°æƒ…况下都能满足è¦æ±‚,但是它ä¸åŒ…å«ä¸‹è¿°ä¿¡æ¯:"
+
+#, fuzzy
+msgid ""
+" - executable status and other permission bits\n"
+" - copy or rename information\n"
+" - changes in binary files\n"
+" - creation or deletion of empty files"
+msgstr ""
+" - å¯æ‰§è¡ŒçŠ¶æ€å’Œå…¶å®ƒæƒé™ä½\n"
+" - å¤åˆ¶æˆ–改åä¿¡æ¯\n"
+" - 二进制文件的修改\n"
+" - 创建或删除空文件"
+
+#, fuzzy
+msgid ""
+" Mercurial also supports the extended diff format from the git VCS\n"
+" which addresses these limitations. The git diff format is not\n"
+" produced by default because a few widespread tools still do not\n"
+" understand this format."
+msgstr ""
+" 水银也支æŒè§£å†³è¿™äº›é™åˆ¶çš„ git 扩展差异格å¼ã€‚由于一些常用的工具还ä¸æ”¯æŒ\n"
+" 此格å¼ï¼Œæ‰€ä»¥å®ƒä¸æ˜¯é»˜è®¤æ ¼å¼ã€‚"
+
+#, fuzzy
+msgid ""
+" This means that when generating diffs from a Mercurial repository\n"
+" (e.g. with \"hg export\"), you should be careful about things like\n"
+" file copies and renames or other things mentioned above, because\n"
+" when applying a standard diff to a different repository, this\n"
+" extra information is lost. Mercurial's internal operations (like\n"
+" push and pull) are not affected by this, because they use an\n"
+" internal binary format for communicating changes."
+msgstr ""
+" è¿™æ„味ç€å½“从水银版本库(例如 \"hg export\")产生差异时,在其它版本库应用标\n"
+" 准差异时,会丢失文件å¤åˆ¶æˆ–改åç­‰é¢å¤–ä¿¡æ¯ï¼Œæ‰€ä»¥ä½ è¦å°å¿ƒå¤„ç†ã€‚水银的内部\n"
+" æ“作(例如 push å’Œ pull)在传达改å˜æ—¶ï¼Œä½¿ç”¨å†…部的二进制格å¼ï¼Œæ‰€ä»¥ä¸å—å½±\n"
+" å“。"
+
+#, fuzzy
+msgid ""
+" To make Mercurial produce the git extended diff format, use the\n"
+" --git option available for many commands, or set 'git = True' in\n"
+" the [diff] section of your hgrc. You do not need to set this\n"
+" option when importing diffs in this format or using them in the mq\n"
+" extension.\n"
+" "
+msgstr ""
+" è¦è®©æ°´é“¶äº§ç”Ÿ git 扩展差异格å¼ï¼Œå¯ä»¥å¯¹è®¸å¤šå‘½ä»¤ä½¿ç”¨é€‰é¡¹ '--git',或者在\n"
+" ä½ çš„ hgrc 文件中的节 '[diff]' 中增加 'git = True'。当你从此格å¼å¯¼å…¥æ—¶ï¼Œ\n"
+" 或在 mq 扩展中使用时,ä¸éœ€è¦è®¾ç½®æ­¤é€‰é¡¹ã€‚\n"
+" "
+
+msgid "Template Usage"
+msgstr "模版用法"
+
+#, fuzzy
+msgid ""
+"\n"
+" Mercurial allows you to customize output of commands through\n"
+" templates. You can either pass in a template from the command\n"
+" line, via the --template option, or select an existing\n"
+" template-style (--style)."
+msgstr ""
+"\n"
+" 水银å…许你通过模版定制命令的输出。你å¯ä»¥é€šè¿‡å‘½ä»¤è¡Œé€‰é¡¹ '--template'\n"
+" æ¥ä½¿ç”¨æ¨¡ç‰ˆï¼Œæˆ–者选择已有的模版样å¼(--style)。"
+
+#, fuzzy
+msgid ""
+" You can customize output for any \"log-like\" command: log,\n"
+" outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+" ä½ å¯ä»¥å®šåˆ¶ä»»æ„输出与日志信æ¯ç±»ä¼¼çš„命令,å³: log,outgoing,incoming,\n"
+" tip,parents,heads 和 glog。"
+
+#, fuzzy
+msgid ""
+" Three styles are packaged with Mercurial: default (the style used\n"
+" when no explicit preference is passed), compact and changelog.\n"
+" Usage::"
+msgstr " 水银中内置了 3 ç§æ ·å¼: default (默认), compact å’Œ changelog。用法:"
+
+#, fuzzy
+msgid " $ hg log -r1 --style changelog"
+msgstr " $ hg log -r1 --style changelog"
+
+#, fuzzy
+msgid ""
+" A template is a piece of text, with markup to invoke variable\n"
+" expansion::"
+msgstr " 模版是文本片断,其中的标记用于å˜é‡æ‰©å±•:"
+
+#, fuzzy
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+
+#, fuzzy
+msgid ""
+" Strings in curly braces are called keywords. The availability of\n"
+" keywords depends on the exact context of the templater. These\n"
+" keywords are usually available for templating a log-like command:"
+msgstr ""
+" 花括å·ä¸­çš„字符串称为关键字。å¯ç”¨çš„关键字ä¾èµ–于模版的上下文。下述关键字\n"
+" å¯ç”¨äºŽè¾“出与日志信æ¯ç±»ä¼¼çš„命令:"
+
+#, fuzzy
+msgid ""
+" :author: String. The unmodified author of the changeset.\n"
+" :branches: String. The name of the branch on which the changeset\n"
+" was committed. Will be empty if the branch name was\n"
+" default.\n"
+" :date: Date information. The date when the changeset was\n"
+" committed.\n"
+" :desc: String. The text of the changeset description.\n"
+" :diffstat: String. Statistics of changes with the following\n"
+" format: \"modified files: +added/-removed lines\"\n"
+" :files: List of strings. All files modified, added, or removed\n"
+" by this changeset.\n"
+" :file_adds: List of strings. Files added by this changeset.\n"
+" :file_mods: List of strings. Files modified by this changeset.\n"
+" :file_dels: List of strings. Files removed by this changeset.\n"
+" :node: String. The changeset identification hash, as a\n"
+" 40-character hexadecimal string.\n"
+" :parents: List of strings. The parents of the changeset.\n"
+" :rev: Integer. The repository-local changeset revision\n"
+" number.\n"
+" :tags: List of strings. Any tags associated with the\n"
+" changeset."
+msgstr ""
+" - author: 字符串。修改集的作者。\n"
+" - branches: 字符串。修改集的分支。如果分支å称为 'default' 则为空。\n"
+" - date: 日期信æ¯ã€‚修改集的日期。\n"
+" - desc: 字符串。修改集的æ述。\n"
+" - files: 字符串列表。修改集中被修改ã€å¢žåŠ å’Œåˆ é™¤çš„全部文件。\n"
+" - file_adds: 字符串列表。修改集中被增加的文件。\n"
+" - file_mods: 字符串列表。修改集中被修改的文件\n"
+" - file_dels: 字符串列表。修改集中被删除的文件\n"
+" - node: 字符串。修改集的哈系标识,40 个字符的 16 进制字符串。\n"
+" - parents: 字符串列表。修改集的父亲。\n"
+" - rev: 整数。本地版本库的修改集的版本å·ã€‚\n"
+" - tags: 字符串列表。修改集的标签。"
+
+#, fuzzy
+msgid ""
+" The \"date\" keyword does not produce human-readable output. If you\n"
+" want to use a date in your output, you can use a filter to process\n"
+" it. Filters are functions which return a string based on the input\n"
+" variable. You can also use a chain of filters to get the desired\n"
+" output::"
+msgstr ""
+" 关键字 \"date\" ä¸äº§ç”Ÿäººå·¥å¯è¯»çš„输出。如果你想在输出中使用日期,å¯ä»¥ä½¿ç”¨\n"
+" 过滤器æ¥å¤„ç†å®ƒã€‚过滤器是根æ®è¾“å…¥å˜é‡è¿”回字符串的函数。你还å¯ä»¥ä½¿ç”¨è¿‡æ»¤\n"
+" 链æ¥äº§ç”Ÿç†æƒ³çš„输出:"
+
+#, fuzzy
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+
+#, fuzzy
+msgid " List of filters:"
+msgstr " 过滤器列表:"
+
+#, fuzzy
+msgid ""
+" :addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last.\n"
+" :age: Date. Returns a human-readable date/time difference\n"
+" between the given date/time and the current\n"
+" date/time.\n"
+" :basename: Any text. Treats the text as a path, and returns the\n"
+" last component of the path after splitting by the\n"
+" path separator (ignoring trailing separators). For\n"
+" example, \"foo/bar/baz\" becomes \"baz\" and \"foo/bar//\"\n"
+" becomes \"bar\".\n"
+" :stripdir: Treat the text as path and strip a directory level,\n"
+" if possible. For example, \"foo\" and \"foo/bar\" becomes\n"
+" \"foo\".\n"
+" :date: Date. Returns a date in a Unix date format, including\n"
+" the timezone: \"Mon Sep 04 15:13:13 2006 0700\".\n"
+" :domain: Any text. Finds the first string that looks like an\n"
+" email address, and extracts just the domain\n"
+" component. Example: 'User <user@example.com>' becomes\n"
+" 'example.com'.\n"
+" :email: Any text. Extracts the first string that looks like\n"
+" an email address. Example: 'User <user@example.com>'\n"
+" becomes 'user@example.com'.\n"
+" :escape: Any text. Replaces the special XML/XHTML characters\n"
+" \"&\", \"<\" and \">\" with XML entities.\n"
+" :fill68: Any text. Wraps the text to fit in 68 columns.\n"
+" :fill76: Any text. Wraps the text to fit in 76 columns.\n"
+" :firstline: Any text. Returns the first line of text.\n"
+" :nonempty: Any text. Returns '(none)' if the string is empty.\n"
+" :hgdate: Date. Returns the date as a pair of numbers:\n"
+" \"1157407993 25200\" (Unix timestamp, timezone offset).\n"
+" :isodate: Date. Returns the date in ISO 8601 format:\n"
+" \"2009-08-18 13:00 +0200\".\n"
+" :isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the\n"
+" rfc3339date filter.\n"
+" :localdate: Date. Converts a date to local date.\n"
+" :obfuscate: Any text. Returns the input text rendered as a\n"
+" sequence of XML entities.\n"
+" :person: Any text. Returns the text before an email address.\n"
+" :rfc822date: Date. Returns a date using the same format used in\n"
+" email headers: \"Tue, 18 Aug 2009 13:00:13 +0200\".\n"
+" :rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\".\n"
+" :short: Changeset hash. Returns the short form of a changeset\n"
+" hash, i.e. a 12-byte hexadecimal string.\n"
+" :shortdate: Date. Returns a date like \"2006-09-18\".\n"
+" :strip: Any text. Strips all leading and trailing whitespace.\n"
+" :tabindent: Any text. Returns the text, with every line except\n"
+" the first starting with a tab character.\n"
+" :urlescape: Any text. Escapes all \"special\" characters. For\n"
+" example, \"foo bar\" becomes \"foo%20bar\".\n"
+" :user: Any text. Returns the user portion of an email\n"
+" address.\n"
+" "
+msgstr ""
+" - addbreaks: 输入任æ„文本。除了最åŽä¸€è¡Œï¼Œåœ¨æ¯è¡Œçš„结尾增加 XHTML 标签\n"
+" \"<br />\"。\n"
+" - age: 输入日期。返回指定日期与当å‰æ—¥æœŸå·®å¼‚的人工å¯è¯»çš„字符串。\n"
+" - basename: 输入任æ„文本。将输入视为路径,返回被路径分隔符隔开的最åŽ\n"
+" 一个组件的å称(忽略结尾的分隔符)。例如 \"foo/bar/baz\" æˆä¸º \"baz\",\n"
+" \"foo/bar//\" æˆä¸º \"bar\"。\n"
+" - date: 输入日期。返回指定日期的 Unix 日期格å¼å­—符串,包å«æ—¶åŒºï¼Œä¾‹å¦‚: \n"
+" \"Mon Sep 04 15:13:13 2006 0700\"。\n"
+" - domain: 输入任æ„文本。找到第一个 email 地å€ï¼Œè¿”回其域å。例如: \n"
+" 'User <user@example.com>' æˆä¸º 'example.com'。\n"
+" - email: 输入任æ„文本。返回第一个 email 地å€ã€‚例如: \n"
+" 'User <user@example.com>' æˆä¸º 'user@example.com'。\n"
+" - escape: 输入任æ„文本。用 XML 实体æ¥å°è£… XML/XHTML 的特殊字符 \"&\",\n"
+" \"<\" 和 \">\"。\n"
+" - fill68: 输入任æ„文本。格å¼åŒ–为 68 列文本。\n"
+" - fill76: 输入任æ„文本。格å¼åŒ–为 76 列文本。\n"
+" - firstline: 输入任æ„文本。返回首行。\n"
+" - hgdate: 输入日期。返回一对数字:\n"
+" \"1157407993 25200\" (Unix 时戳,时区å移)。\n"
+" - isodate: 输入日期。返回 ISO 8601 æ ¼å¼çš„日期。\n"
+" - obfuscate: 输入任æ„文本。返回其 XML 实体åºåˆ—。\n"
+" - person: 输入任æ„文本。返回 email 地å€å‰çš„文本。\n"
+" - rfc822date: 输入日期。返回 email 头部使用的日期格å¼ã€‚\n"
+" - short: 修改集哈系。返回修改集哈系的短格å¼ã€‚例如 12 字符的 16 进制\n"
+" 字符串。\n"
+" - shortdate: 输入日期。返回格å¼ç±»ä¼¼äºŽ \"2006-09-18\"。\n"
+" - strip: 输入任æ„文本。删除全部行首与行尾空白。\n"
+" - tabindent: 输入任æ„文本。除了首行,在æ¯è¡Œçš„开始增加制表符å·ã€‚\n"
+" - urlescape: 输入任æ„文本。å°è£…全部特殊字符。例如\n"
+" \"foo bar\" æˆä¸º \"foo%20bar\"。\n"
+" - user: 输入任æ„文本。返回 email 地å€ä¸­çš„用户å称部分。\n"
+" "
+
+#, fuzzy
+msgid "URL Paths"
+msgstr "统一资æºå®šä½è·¯å¾„"
+
+#, fuzzy
+msgid ""
+"\n"
+" Valid URLs are of the form::"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user[:pass]@]host[:port]/[path][#revision]"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Paths in the local filesystem can either point to Mercurial\n"
+" repositories or to bundle files (as created by 'hg bundle' or 'hg\n"
+" incoming --bundle')."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" An optional identifier after # indicates a particular branch, tag,\n"
+" or changeset to use from the remote repository. See also 'hg help\n"
+" revisions'."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Some features, such as pushing to http:// and https:// URLs are\n"
+" only possible if the feature is explicitly enabled on the remote\n"
+" Mercurial server."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid " Some notes about using SSH with Mercurial:"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" - SSH requires an accessible shell account on the destination\n"
+" machine and a copy of hg in the remote path or specified with as\n"
+" remotecmd.\n"
+" - path is relative to the remote user's home directory by default.\n"
+" Use an extra slash at the start of a path to specify an absolute\n"
+" path::"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" - Mercurial doesn't use its own compression via SSH; the right\n"
+" thing to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your hgrc\n"
+" or with the --ssh command line option."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" These URLs can all be stored in your hgrc with path aliases under\n"
+" the [paths] section like so::"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" You can then use the alias for any command that uses a URL (for\n"
+" example 'hg pull alias1' would pull from the 'alias1' path)."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" Two path aliases are special because they are used as defaults\n"
+" when you do not provide the URL to a command:"
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" default:\n"
+" When you create a repository with hg clone, the clone command\n"
+" saves the location of the source repository as the new\n"
+" repository's 'default' path. This is then used when you omit\n"
+" path from push- and pull-like commands (including incoming and\n"
+" outgoing)."
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid ""
+" default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+" "
+msgstr ""
+"\n"
+" 有效的ä½ç½®æ ¼å¼:\n"
+"\n"
+" local/filesystem/path (or file://local/filesystem/path)\n"
+" http://[user[:pass]@]host[:port]/[path]\n"
+" https://[user[:pass]@]host[:port]/[path]\n"
+" ssh://[user[:pass]@]host[:port]/[path]\n"
+"\n"
+" ä½äºŽæœ¬åœ°æ–‡ä»¶ç³»ç»Ÿä¸­çš„路径å¯ä»¥æŒ‡å‘版本库,也å¯ä»¥æŒ‡å‘打包的文件(被\n"
+" 'hg bundle' 或 'hg incoming --bundle' 创建)。\n"
+"\n"
+" 在 '#' åŽé¢å¯é€‰çš„标识符用于指定è¦å–得的远程版本库的分支,标签或\n"
+" 修改集。\n"
+"\n"
+" 仅当远程水银æœåŠ¡å™¨æ˜¾å¼å¯ç”¨æ—¶ï¼Œæ‰èƒ½æŽ¨åˆ° 'http://' å’Œ 'https://'。\n"
+"\n"
+" 在水银中使用 SSH 的一些æ示:\n"
+" - 使用 SSH 时,需è¦åœ¨è¿œç¨‹ä¸»æœºä¸Šæœ‰å¯ç™»å½•å¸å·ï¼Œè¿œç¨‹è·¯å¾„中还需è¦æœ‰\n"
+" hg,或者有指定的远程命令。\n"
+" - 默认 'path' 是相对于远程主机上的用户家目录。\n"
+" å¯ä»¥åœ¨è·¯å¾„å‰å¢žåŠ ä¸€ä¸ªæ–œçº¿æŒ‡å®šç»å¯¹è·¯å¾„:\n"
+" ssh://example.com//tmp/repository\n"
+" - 水银使用 SSH æ—¶ä¸ä½¿ç”¨åŽ‹ç¼©ï¼Œæ‰€ä»¥ä½ å¯ä»¥åœ¨ ~/.ssh/config 中é…ç½®\n"
+" SSH 执行压缩,例如:\n"
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes\n"
+" å¦ä¸€ä¸ªæ–¹æ³•æ˜¯åœ¨ä½ çš„ hgrc 中将 \"ssh -C\" 作为你的 ssh 命令,或\n"
+" 用于命令行å‚æ•° '--ssh' 中。\n"
+"\n"
+" 这些路径å¯ä»¥åœ¨ä½ çš„ 'hgrc' 中的节 '[paths]' 中定义别å:\n"
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ...\n"
+"\n"
+" 然åŽä½ å°±å¯ä»¥åœ¨ä»»æ„命令中使用这些别å作为路径(例如 'hg pull alias1'\n"
+" 会从 'alias1' 定义的路径å–得指定版本)。\n"
+"\n"
+" 因为用于默认路径,所以这 2 个路径别å比较特殊:\n"
+"\n"
+" default:\n"
+" 当你使用 'hg clone' 创建版本库时,此命令会将æºç‰ˆæœ¬åº“çš„ä½ç½®ä¿å­˜\n"
+" 为新版本库的 'default' 路径,然åŽä½ å¯ä»¥å¯¹ç±»ä¼¼ 'push' å’Œ 'pull'\n"
+" 的命令çœç•¥è·¯å¾„(包å«è¿›å’Œå‡º)。\n"
+"\n"
+" default-push:\n"
+" 命令 'push' 会查找别å是 'default-push' 的路径,它覆盖定义 'default'。\n"
+" "
+
+#, fuzzy
+msgid "Using additional features"
+msgstr "å¯ç”¨é¢å¤–的输出"
+
+#, fuzzy
+msgid "can only share local repositories"
+msgstr "为此版本库å¯åŠ¨æœåŠ¡ 'inotify'"
+
+#, fuzzy
+msgid "destination already exists"
+msgstr "版本库 %s 已存在"
+
+msgid "updating working directory\n"
+msgstr "正在更新工作目录\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "目标目录: %s\n"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "destination '%s' is not empty"
+msgstr "éžæœ¬åœ°ç‰ˆæœ¬åº“ '%s'"
+
+msgid "src repository does not support revision lookup and so doesn't support clone by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr ""
+
+msgid "updated"
+msgstr "已更新"
+
+msgid "merged"
+msgstr "å·²åˆå¹¶"
+
+msgid "removed"
+msgstr "已删除"
+
+msgid "unresolved"
+msgstr "未解决"
+
+#, python-format
+msgid "%d files %s"
+msgstr "%d 个文件%s"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr ""
+
+msgid "use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon\n"
+msgstr ""
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr ""
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr ""
+
+msgid "IPv6 is not available on this system"
+msgstr ""
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr ""
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "connection ended unexpectedly"
+msgstr ""
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr ""
+
+#, python-format
+msgid "using %s\n"
+msgstr "使用 %s\n"
+
+#, python-format
+msgid "capabilities: %s\n"
+msgstr ""
+
+msgid "operation not supported over http"
+msgstr ""
+
+#, python-format
+msgid "sending %s command\n"
+msgstr "å‘é€å‘½ä»¤ '%s'\n"
+
+#, python-format
+msgid "sending %s bytes\n"
+msgstr "å‘é€ %s 字节\n"
+
+msgid "authorization failed"
+msgstr "授æƒå¤±è´¥"
+
+#, python-format
+msgid "http error while sending %s command\n"
+msgstr ""
+
+msgid "http error, possibly caused by proxy setting"
+msgstr ""
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "实际 URL 是 '%s'\n"
+
+#, fuzzy, python-format
+msgid "requested URL: '%s'\n"
+msgstr "请求的 URL: '%s'\n"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr "'%s' 似乎ä¸æ˜¯æ°´é“¶ç‰ˆæœ¬åº“"
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr ""
+
+msgid "look up remote revision"
+msgstr ""
+
+msgid "unexpected response:"
+msgstr ""
+
+msgid "look up remote changes"
+msgstr ""
+
+msgid "push failed (unexpected response):"
+msgstr ""
+
+#, python-format
+msgid "push failed: %s"
+msgstr ""
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr ""
+
+msgid "cannot create new http repository"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr ""
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s not found"
+msgstr ""
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "版本库 %s 已存在"
+
+#, python-format
+msgid "requirement '%s' not supported"
+msgstr ""
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr ""
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ""
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr ""
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr ""
+
+#, python-format
+msgid "filtering %s through %s\n"
+msgstr ""
+
+msgid "journal already exists - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr "回滚中断的事务\n"
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+msgid "rolling back last transaction\n"
+msgstr "回滚最近的事务\n"
+
+#, python-format
+msgid "Named branch could not be reset, current branch still is: %s\n"
+msgstr ""
+
+msgid "no rollback information available\n"
+msgstr "没有回滚信æ¯å¯ç”¨\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr ""
+
+#, python-format
+msgid "working directory of %s"
+msgstr ""
+
+#, python-format
+msgid " %s: searching for copy revision for %s\n"
+msgstr ""
+
+#, python-format
+msgid " %s: copy %s:%s\n"
+msgstr ""
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+
+#, fuzzy
+msgid "file not found!"
+msgstr "没有找到样å¼: %s"
+
+#, fuzzy
+msgid "no match under directory!"
+msgstr "改å˜å·¥ä½œç›®å½•"
+
+#, fuzzy
+msgid "file not tracked!"
+msgstr "%s 没有被跟踪!\n"
+
+msgid "unresolved merge conflicts (see hg resolve)"
+msgstr "未解决的åˆå¹¶å†²çª(å‚è§ 'hg resolve')"
+
+#, fuzzy, python-format
+msgid "committing subrepository %s\n"
+msgstr "åˆå§‹åŒ–目标版本库 %s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr "æ交 '%s' 出错!\n"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s ä¸å­˜åœ¨!\n"
+
+#, python-format
+msgid ""
+"%s: files over 10MB may cause memory and performance problems\n"
+"(use 'hg revert %s' to unadd the file)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr ""
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added!\n"
+msgstr ""
+
+#, python-format
+msgid "%s still exists!\n"
+msgstr ""
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s 没有被跟踪!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr ""
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr ""
+
+msgid "searching for changes\n"
+msgstr "正在æœç´¢ä¿®æ”¹\n"
+
+#, python-format
+msgid "examining %s:%s\n"
+msgstr ""
+
+msgid "branch already found\n"
+msgstr ""
+
+#, python-format
+msgid "found incomplete branch %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "found new changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "request %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "received %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "narrowing %d:%d %s\n"
+msgstr ""
+
+#, python-format
+msgid "found new branch changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "narrowed branch search to %s:%s\n"
+msgstr ""
+
+msgid "already have changeset "
+msgstr ""
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr ""
+
+msgid "found new changesets starting at "
+msgstr ""
+
+#, python-format
+msgid "%d total queries\n"
+msgstr ""
+
+msgid "common changesets up to "
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr "正在请求全部修改\n"
+
+msgid "Partial pull cannot be done because other repository doesn't support changegroupsubset."
+msgstr ""
+
+#, python-format
+msgid "abort: push creates new remote branch '%s'!\n"
+msgstr ""
+
+msgid "abort: push creates new remote heads!\n"
+msgstr ""
+
+msgid "(did you forget to merge? use push -f to force)\n"
+msgstr ""
+
+msgid "note: unsynced remote changes!\n"
+msgstr ""
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "å·²å‘现 %d 个修改集\n"
+
+msgid "list of changesets:\n"
+msgstr ""
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr ""
+
+#, python-format
+msgid "add changeset %s\n"
+msgstr ""
+
+msgid "adding changesets\n"
+msgstr "正在增加修改集\n"
+
+msgid "received changelog group is empty"
+msgstr ""
+
+msgid "adding manifests\n"
+msgstr "正在增加清å•\n"
+
+msgid "adding file changes\n"
+msgstr "正在增加文件改å˜\n"
+
+#, python-format
+msgid "adding %s revisions\n"
+msgstr ""
+
+msgid "received file revlog group is empty"
+msgstr ""
+
+#, python-format
+msgid " (%+d heads)"
+msgstr ""
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "已增加 %d ä¸ªä¿®æ”¹é›†ï¼ŒåŒ…å« %d 个改å˜ï¼Œä¿®æ”¹äº† %d 个文件%s\n"
+
+msgid "updating the branch cache\n"
+msgstr ""
+
+msgid "Unexpected response from remote server:"
+msgstr ""
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr ""
+
+msgid "the server sent an unknown error code"
+msgstr ""
+
+msgid "streaming all changes\n"
+msgstr ""
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr ""
+
+#, python-format
+msgid "adding %s (%s)\n"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr ""
+
+msgid "no [smtp]host in hgrc - cannot send mail"
+msgstr ""
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr ""
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr ""
+
+msgid "(using tls)\n"
+msgstr ""
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr ""
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr ""
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr ""
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr ""
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr ""
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr ""
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr ""
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr ""
+
+#, python-format
+msgid "untracked file in working directory differs from file in requested revision: '%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+#, fuzzy
+msgid "&None"
+msgstr "完æˆ\n"
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr "正在解æžæ¸…å•\n"
+
+#, python-format
+msgid " overwrite %s partial %s\n"
+msgstr ""
+
+#, python-format
+msgid " ancestor %s local %s remote %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+#, python-format
+msgid "preserving %s for resolve of %s\n"
+msgstr ""
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s\n"
+msgstr "正在检出 %s\n"
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "warning: detected divergent renames of %s to:\n"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr ""
+
+msgid "can't merge with ancestor"
+msgstr ""
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr ""
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr ""
+
+msgid "crosses branches (use 'hg merge' or 'hg update -C' to discard changes)"
+msgstr ""
+
+msgid "crosses branches (use 'hg merge' or 'hg update -C')"
+msgstr ""
+
+msgid "crosses named branches (use 'hg update -C' to discard changes)"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr ""
+
+#, python-format
+msgid "cannot create %s: unable to create destination directory"
+msgstr ""
+
+#, python-format
+msgid "found patch at byte %d\n"
+msgstr ""
+
+msgid "patch generated by hg export\n"
+msgstr ""
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr ""
+
+#, python-format
+msgid "patching file %s\n"
+msgstr ""
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d line).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d %s(offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr ""
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr ""
+
+#, python-format
+msgid "unable to strip away %d dirs from %s"
+msgstr ""
+
+msgid "undefined source and destination files"
+msgstr ""
+
+#, python-format
+msgid "malformed patch %s %s"
+msgstr ""
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr ""
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr ""
+
+#, python-format
+msgid "Unsupported line endings type: %s"
+msgstr ""
+
+#, python-format
+msgid "no valid hunks found; trying with %r instead\n"
+msgstr ""
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr ""
+
+#, python-format
+msgid "exited with status %d"
+msgstr ""
+
+#, python-format
+msgid "killed by signal %d"
+msgstr ""
+
+#, python-format
+msgid "stopped by signal %d"
+msgstr ""
+
+msgid "invalid exit code"
+msgstr ""
+
+#, python-format
+msgid "saving bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr ""
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr ""
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr ""
+
+msgid "no node"
+msgstr ""
+
+msgid "ambiguous identifier"
+msgstr ""
+
+msgid "no match found"
+msgstr ""
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr ""
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr ""
+
+msgid "unknown base"
+msgstr ""
+
+msgid "consistency error adding group"
+msgstr ""
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr ""
+
+msgid "can only specify two labels."
+msgstr ""
+
+msgid "warning: conflicts during merge.\n"
+msgstr ""
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr ""
+
+msgid "could not create remote repo"
+msgstr ""
+
+msgid "remote: "
+msgstr ""
+
+msgid "no suitable response from remote hg"
+msgstr ""
+
+#, python-format
+msgid "push refused: %s"
+msgstr ""
+
+msgid "unsynced changes"
+msgstr ""
+
+msgid "cannot lock static-http repository"
+msgstr ""
+
+msgid "cannot create new static-http repository"
+msgstr ""
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+msgid "scanning\n"
+msgstr "正在扫æ\n"
+
+#, python-format
+msgid "%d files, %d bytes to transfer\n"
+msgstr "需è¦ä¼ è¾“ %d 个文件,%d 字节\n"
+
+#, python-format
+msgid "sending %s (%d bytes)\n"
+msgstr "正在å‘é€ %s (%d 字节)\n"
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "removing subrepo %s\n"
+msgstr "正在删除 %s\n"
+
+#, fuzzy, python-format
+msgid "pulling subrepo %s\n"
+msgstr "正在拉自 %s\n"
+
+#, fuzzy, python-format
+msgid "pushing subrepo %s\n"
+msgstr "正在推到 %s\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr ""
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid "unmatched quotes"
+msgstr "ä¸åŒ¹é…的引å·"
+
+#, python-format
+msgid "error expanding '%s%%%s'"
+msgstr ""
+
+#, python-format
+msgid "unknown filter '%s'"
+msgstr ""
+
+#, python-format
+msgid "style not found: %s"
+msgstr "没有找到样å¼: %s"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "模版文件 %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "截断 '%s' 失败\n"
+
+msgid "transaction abort!\n"
+msgstr "事务中止!\n"
+
+msgid "rollback completed\n"
+msgstr "完æˆå›žæ»š\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr "显示ä¸èƒ½ä¿¡èµ–çš„é…置选项"
+
+#, python-format
+msgid "%s.%s not a boolean ('%s')"
+msgstr ""
+
+msgid "enter a commit username:"
+msgstr ""
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr ""
+
+msgid "Please specify a username."
+msgstr ""
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr ""
+
+msgid "response expected"
+msgstr ""
+
+msgid "unrecognized response\n"
+msgstr ""
+
+msgid "password: "
+msgstr "密ç : "
+
+msgid "edit failed"
+msgstr ""
+
+msgid "http authorization required"
+msgstr "éœ€è¦ http 授æƒ"
+
+msgid "http authorization required\n"
+msgstr "éœ€è¦ http 授æƒ\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "领域: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "用户: %s\n"
+
+msgid "user:"
+msgstr "用户:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr ""
+
+#, python-format
+msgid "proxying through http://%s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr ""
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr ""
+
+#, python-format
+msgid "path %r is inside repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+msgid "Hardlinks not supported"
+msgstr ""
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr ""
+
+#, python-format
+msgid "invalid date: %r "
+msgstr ""
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr ""
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr ""
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr ""
+
+#, python-format
+msgid "%.0f GB"
+msgstr ""
+
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#, python-format
+msgid "%.2f GB"
+msgstr ""
+
+#, python-format
+msgid "%.0f MB"
+msgstr ""
+
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#, python-format
+msgid "%.2f MB"
+msgstr ""
+
+#, python-format
+msgid "%.0f KB"
+msgstr ""
+
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#, python-format
+msgid "%.2f KB"
+msgstr ""
+
+#, python-format
+msgid "%.0f bytes"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr ""
+
+msgid "interrupted"
+msgstr ""
+
+#, python-format
+msgid "empty or missing %s"
+msgstr ""
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr ""
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr ""
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr ""
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr ""
+
+#, python-format
+msgid " (expected %s)"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr ""
+
+#, python-format
+msgid "checking parents of %s"
+msgstr ""
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr ""
+
+msgid "checking changesets\n"
+msgstr ""
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr ""
+
+msgid "checking manifests\n"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "%s not in changesets"
+msgstr "列出修改集"
+
+msgid "file without name in manifest"
+msgstr ""
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr ""
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr ""
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr ""
+
+msgid "in changeset but not in manifest"
+msgstr ""
+
+msgid "in manifest but not in changeset"
+msgstr ""
+
+msgid "checking files\n"
+msgstr ""
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr ""
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr ""
+
+msgid "missing revlog!"
+msgstr ""
+
+#, python-format
+msgid "%s not in manifests"
+msgstr ""
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr ""
+
+#, python-format
+msgid "unpacking %s"
+msgstr ""
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr ""
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr ""
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr ""
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr ""
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr ""
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr ""
+
+msgid "user name not available - set USERNAME environment variable"
+msgstr ""
diff --git a/i18n/zh_TW.po b/i18n/zh_TW.po
new file mode 100644
index 0000000..695eb29
--- /dev/null
+++ b/i18n/zh_TW.po
@@ -0,0 +1,12930 @@
+# Traditional Chinese translation for Mercurial
+# Copyright (C) 2009 Matt Mackall <mpm@selenic.com> and others
+# This file is distributed under the same license as the Mercurial package.
+# Chia-Huan Wu <willie.tw@gmail.com>, 2009.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Mercurial\n"
+"Report-Msgid-Bugs-To: <mercurial-devel@selenic.com>\n"
+"POT-Creation-Date: 2010-10-31 22:27+0100\n"
+"PO-Revision-Date: 2009-10-25 12:50+0100\n"
+"Last-Translator: Chia-Huan Wu <willie.tw@gmail.com>,"
+"leolarrel<leolarrel@gmail.com>\n"
+"Language-Team: Traditional Chinese\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#, python-format
+msgid " (default: %s)"
+msgstr "(內定: %s)"
+
+msgid "Options"
+msgstr "é¸é …"
+
+msgid "Commands"
+msgstr "基本命令"
+
+msgid "Extensions"
+msgstr "擴充套件"
+
+msgid ""
+"This section contains help for extensions that are distributed together with "
+"Mercurial. Help for other extensions is available in the help system."
+msgstr ""
+
+msgid "options:"
+msgstr "é¸é …:"
+
+#, python-format
+msgid " aliases: %s"
+msgstr "\t別å:%s"
+
+msgid "hooks for controlling repository access"
+msgstr ""
+
+msgid ""
+"This hook makes it possible to allow or deny write access to given\n"
+"branches and paths of a repository when receiving incoming changesets\n"
+"via pretxnchangegroup and pretxncommit."
+msgstr ""
+
+msgid ""
+"The authorization is matched based on the local user name on the\n"
+"system where the hook runs, and not the committer of the original\n"
+"changeset (since the latter is merely informative)."
+msgstr ""
+
+msgid ""
+"The acl hook is best used along with a restricted shell like hgsh,\n"
+"preventing authenticating users from doing anything other than pushing\n"
+"or pulling. The hook is not safe to use if users have interactive\n"
+"shell access, as they can then disable the hook. Nor is it safe if\n"
+"remote users share an account, because then there is no way to\n"
+"distinguish them."
+msgstr ""
+
+msgid "The order in which access checks are performed is:"
+msgstr ""
+
+msgid ""
+"1) Deny list for branches (section ``acl.deny.branches``)\n"
+"2) Allow list for branches (section ``acl.allow.branches``)\n"
+"3) Deny list for paths (section ``acl.deny``)\n"
+"4) Allow list for paths (section ``acl.allow``)"
+msgstr ""
+
+msgid "The allow and deny sections take key-value pairs."
+msgstr ""
+
+msgid ""
+"Branch-based Access Control\n"
+"..........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny.branches`` and ``acl.allow.branches`` sections to\n"
+"have branch-based access control. Keys in these sections can be\n"
+"either:"
+msgstr ""
+
+msgid ""
+"- a branch name, or\n"
+"- an asterisk, to match any branch;"
+msgstr ""
+
+msgid "The corresponding values can be either:"
+msgstr ""
+
+msgid ""
+"- a comma-separated list containing users and groups, or\n"
+"- an asterisk, to match anyone;"
+msgstr ""
+
+msgid ""
+"Path-based Access Control\n"
+"........................."
+msgstr ""
+
+msgid ""
+"Use the ``acl.deny`` and ``acl.allow`` sections to have path-based\n"
+"access control. Keys in these sections accept a subtree pattern (with\n"
+"a glob syntax by default). The corresponding values follow the same\n"
+"syntax as the other sections above."
+msgstr ""
+
+msgid ""
+"Groups\n"
+"......"
+msgstr ""
+
+msgid ""
+"Group names must be prefixed with an ``@`` symbol. Specifying a group\n"
+"name has the same effect as specifying all the users in that group."
+msgstr ""
+
+msgid ""
+"You can define group members in the ``acl.groups`` section.\n"
+"If a group name is not defined there, and Mercurial is running under\n"
+"a Unix-like system, the list of users will be taken from the OS.\n"
+"Otherwise, an exception will be raised."
+msgstr ""
+
+msgid ""
+"Example Configuration\n"
+"....................."
+msgstr ""
+
+msgid "::"
+msgstr ""
+
+msgid " [hooks]"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions at commit time\n"
+" pretxncommit.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" # Use this if you want to check access restrictions for pull, push,\n"
+" # bundle and serve.\n"
+" pretxnchangegroup.acl = python:hgext.acl.hook"
+msgstr ""
+
+msgid ""
+" [acl]\n"
+" # Allow or deny access for incoming changes only if their source is\n"
+" # listed here, let them pass otherwise. Source is \"serve\" for all\n"
+" # remote access (http or ssh), \"push\", \"pull\" or \"bundle\" when the\n"
+" # related commands are run locally.\n"
+" # Default: serve\n"
+" sources = serve"
+msgstr ""
+
+msgid " [acl.deny.branches]"
+msgstr ""
+
+msgid ""
+" # Everyone is denied to the frozen branch:\n"
+" frozen-branch = *"
+msgstr ""
+
+msgid ""
+" # A bad user is denied on all branches:\n"
+" * = bad-user"
+msgstr ""
+
+msgid " [acl.allow.branches]"
+msgstr ""
+
+msgid ""
+" # A few users are allowed on branch-a:\n"
+" branch-a = user-1, user-2, user-3"
+msgstr ""
+
+msgid ""
+" # Only one user is allowed on branch-b:\n"
+" branch-b = user-1"
+msgstr ""
+
+msgid ""
+" # The super user is allowed on any branch:\n"
+" * = super-user"
+msgstr ""
+
+msgid ""
+" # Everyone is allowed on branch-for-tests:\n"
+" branch-for-tests = *"
+msgstr ""
+
+msgid ""
+" [acl.deny]\n"
+" # This list is checked first. If a match is found, acl.allow is not\n"
+" # checked. All users are granted access if acl.deny is not present.\n"
+" # Format for both lists: glob pattern = user, ..., @group, ..."
+msgstr ""
+
+msgid ""
+" # To match everyone, use an asterisk for the user:\n"
+" # my/glob/pattern = *"
+msgstr ""
+
+msgid ""
+" # user6 will not have write access to any file:\n"
+" ** = user6"
+msgstr ""
+
+msgid ""
+" # Group \"hg-denied\" will not have write access to any file:\n"
+" ** = @hg-denied"
+msgstr ""
+
+msgid ""
+" # Nobody will be able to change \"DONT-TOUCH-THIS.txt\", despite\n"
+" # everyone being able to change all other files. See below.\n"
+" src/main/resources/DONT-TOUCH-THIS.txt = *"
+msgstr ""
+
+msgid ""
+" [acl.allow]\n"
+" # if acl.allow is not present, all users are allowed by default\n"
+" # empty acl.allow = no users allowed"
+msgstr ""
+
+msgid ""
+" # User \"doc_writer\" has write access to any file under the \"docs\"\n"
+" # folder:\n"
+" docs/** = doc_writer"
+msgstr ""
+
+msgid ""
+" # User \"jack\" and group \"designers\" have write access to any file\n"
+" # under the \"images\" folder:\n"
+" images/** = jack, @designers"
+msgstr ""
+
+msgid ""
+" # Everyone (except for \"user6\" - see acl.deny above) will have write\n"
+" # access to any file under the \"resources\" folder (except for 1\n"
+" # file. See acl.deny):\n"
+" src/main/resources/** = *"
+msgstr ""
+
+msgid " .hgtags = release_engineer"
+msgstr ""
+
+#, python-format
+msgid "group '%s' is undefined"
+msgstr "沒有定義'%s'群組"
+
+#, python-format
+msgid ""
+"config error - hook type \"%s\" cannot stop incoming changesets nor commits"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" denied on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: user \"%s\" not allowed on branch \"%s\" (changeset \"%s\")"
+msgstr ""
+
+#, python-format
+msgid "acl: access denied for changeset %s"
+msgstr "acl: changeset %s 拒絕存å–"
+
+msgid "track a line of development with movable markers"
+msgstr ""
+
+msgid ""
+"Bookmarks are local movable markers to changesets. Every bookmark\n"
+"points to a changeset identified by its hash. If you commit a\n"
+"changeset that is based on a changeset that has a bookmark on it, the\n"
+"bookmark shifts to the new changeset."
+msgstr ""
+
+msgid ""
+"It is possible to use bookmark names in every revision lookup (e.g.\n"
+":hg:`merge`, :hg:`update`)."
+msgstr ""
+
+msgid ""
+"By default, when several bookmarks point to the same changeset, they\n"
+"will all move forward together. It is possible to obtain a more\n"
+"git-like experience by adding the following configuration option to\n"
+"your configuration file::"
+msgstr ""
+
+msgid ""
+" [bookmarks]\n"
+" track.current = True"
+msgstr ""
+
+msgid ""
+"This will cause Mercurial to track the bookmark that you are currently\n"
+"using, and only update it. This is similar to git's approach to\n"
+"branching.\n"
+msgstr ""
+
+msgid ""
+" Bookmarks are pointers to certain commits that move when\n"
+" committing. Bookmarks are local. They can be renamed, copied and\n"
+" deleted. It is possible to use bookmark names in :hg:`merge` and\n"
+" :hg:`update` to merge and update respectively to a given bookmark."
+msgstr ""
+
+msgid ""
+" You can use :hg:`bookmark NAME` to set a bookmark on the working\n"
+" directory's parent revision with the given name. If you specify\n"
+" a revision using -r REV (where REV may be an existing bookmark),\n"
+" the bookmark is assigned to that revision."
+msgstr ""
+
+msgid ""
+" Bookmarks can be pushed and pulled between repositories (see :hg:`help\n"
+" push` and :hg:`help pull`). This requires the bookmark extension to be\n"
+" enabled for both the local and remote repositories.\n"
+" "
+msgstr ""
+
+msgid "a bookmark of this name does not exist"
+msgstr "這個å字的書籤ä¸å­˜åœ¨"
+
+msgid "a bookmark of the same name already exists"
+msgstr "已經有相åŒå字的書籤了"
+
+msgid "new bookmark name required"
+msgstr "需è¦æ–°çš„書籤åå­—"
+
+msgid "bookmark name required"
+msgstr "需è¦æ›¸ç±¤çš„åå­—"
+
+msgid "bookmark name cannot contain newlines"
+msgstr "書籤åå­—ä¸å¯ä»¥æœ‰æ›è¡Œå­—å…ƒ"
+
+msgid "bookmark names cannot consist entirely of whitespace"
+msgstr ""
+
+msgid "a bookmark cannot have the name of an existing branch"
+msgstr ""
+
+msgid "no bookmarks set\n"
+msgstr "沒有設定書籤\n"
+
+#, python-format
+msgid "updating bookmark %s\n"
+msgstr "更新書籤 %s\n"
+
+#, python-format
+msgid "not updating divergent bookmark %s\n"
+msgstr "沒有更新分歧的書籤 %s\n"
+
+#, python-format
+msgid "updating bookmark %s failed!\n"
+msgstr "更新書籤 %s 失敗ï¼\n"
+
+#, python-format
+msgid "remote bookmark %s not found!"
+msgstr "找ä¸åˆ° %s書籤"
+
+#, python-format
+msgid "importing bookmark %s\n"
+msgstr "匯入書籤 %s\n"
+
+#, python-format
+msgid "exporting bookmark %s\n"
+msgstr "匯出書籤 %s\n"
+
+#, python-format
+msgid "deleting remote bookmark %s\n"
+msgstr "刪除é ç«¯æ›¸ç±¤ %s\n"
+
+#, python-format
+msgid "bookmark %s does not exist on the local or remote repository!\n"
+msgstr "%s 書籤沒有在本地或é ç«¯å„²å­˜åº«!\n"
+
+#, fuzzy
+msgid "searching for changed bookmarks\n"
+msgstr "正在æœå°‹è®Šæ›´\n"
+
+#, fuzzy
+msgid "no changed bookmarks found\n"
+msgstr "找ä¸åˆ°è®Šæ›´\n"
+
+#, python-format
+msgid "comparing with %s\n"
+msgstr "正在跟 %s 比å°\n"
+
+msgid "bookmark to import"
+msgstr ""
+
+msgid "BOOKMARK"
+msgstr ""
+
+msgid "bookmark to export"
+msgstr ""
+
+msgid "compare bookmark"
+msgstr "比å°æ›¸ç±¤"
+
+msgid ""
+"``bookmark([name])``\n"
+" The named bookmark or all bookmarks."
+msgstr ""
+
+#. i18n: "bookmark" is a keyword
+msgid "bookmark takes one or no arguments"
+msgstr "bookmark 需è¦ä¸€å€‹åƒæ•¸æˆ–沒有åƒæ•¸"
+
+#. i18n: "bookmark" is a keyword
+msgid "the argument to bookmark must be a string"
+msgstr ""
+
+msgid "force"
+msgstr ""
+
+msgid "REV"
+msgstr ""
+
+msgid "revision"
+msgstr "修定版"
+
+msgid "delete a given bookmark"
+msgstr "刪除一個特定的書籤"
+
+msgid "NAME"
+msgstr ""
+
+msgid "rename a given bookmark"
+msgstr "æ›´å一個特定的書籤"
+
+msgid "hg bookmarks [-f] [-d] [-m NAME] [-r REV] [NAME]"
+msgstr ""
+
+msgid "hooks for integrating with the Bugzilla bug tracker"
+msgstr ""
+
+msgid ""
+"This hook extension adds comments on bugs in Bugzilla when changesets\n"
+"that refer to bugs by Bugzilla ID are seen. The hook does not change\n"
+"bug status."
+msgstr ""
+
+msgid ""
+"The hook updates the Bugzilla database directly. Only Bugzilla\n"
+"installations using MySQL are supported."
+msgstr ""
+
+msgid ""
+"The hook relies on a Bugzilla script to send bug change notification\n"
+"emails. That script changes between Bugzilla versions; the\n"
+"'processmail' script used prior to 2.18 is replaced in 2.18 and\n"
+"subsequent versions by 'config/sendbugmail.pl'. Note that these will\n"
+"be run by Mercurial as the user pushing the change; you will need to\n"
+"ensure the Bugzilla install file permissions are set appropriately."
+msgstr ""
+
+msgid ""
+"The extension is configured through three different configuration\n"
+"sections. These keys are recognized in the [bugzilla] section:"
+msgstr ""
+
+msgid ""
+"host\n"
+" Hostname of the MySQL server holding the Bugzilla database."
+msgstr ""
+
+msgid ""
+"db\n"
+" Name of the Bugzilla database in MySQL. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"user\n"
+" Username to use to access MySQL server. Default 'bugs'."
+msgstr ""
+
+msgid ""
+"password\n"
+" Password to use to access MySQL server."
+msgstr ""
+
+msgid ""
+"timeout\n"
+" Database connection timeout (seconds). Default 5."
+msgstr ""
+
+msgid ""
+"version\n"
+" Bugzilla version. Specify '3.0' for Bugzilla versions 3.0 and later,\n"
+" '2.18' for Bugzilla versions from 2.18 and '2.16' for versions prior\n"
+" to 2.18."
+msgstr ""
+
+msgid ""
+"bzuser\n"
+" Fallback Bugzilla user name to record comments with, if changeset\n"
+" committer cannot be found as a Bugzilla user."
+msgstr ""
+
+msgid ""
+"bzdir\n"
+" Bugzilla install directory. Used by default notify. Default\n"
+" '/var/www/html/bugzilla'."
+msgstr ""
+
+msgid ""
+"notify\n"
+" The command to run to get Bugzilla to send bug change notification\n"
+" emails. Substitutes from a map with 3 keys, 'bzdir', 'id' (bug id)\n"
+" and 'user' (committer bugzilla email). Default depends on version;\n"
+" from 2.18 it is \"cd %(bzdir)s && perl -T contrib/sendbugmail.pl\n"
+" %(id)s %(user)s\"."
+msgstr ""
+
+msgid ""
+"regexp\n"
+" Regular expression to match bug IDs in changeset commit message.\n"
+" Must contain one \"()\" group. The default expression matches 'Bug\n"
+" 1234', 'Bug no. 1234', 'Bug number 1234', 'Bugs 1234,5678', 'Bug\n"
+" 1234 and 5678' and variations thereof. Matching is case insensitive."
+msgstr ""
+
+msgid ""
+"style\n"
+" The style file to use when formatting comments."
+msgstr ""
+
+msgid ""
+"template\n"
+" Template to use when formatting comments. Overrides style if\n"
+" specified. In addition to the usual Mercurial keywords, the\n"
+" extension specifies::"
+msgstr ""
+
+msgid ""
+" {bug} The Bugzilla bug ID.\n"
+" {root} The full pathname of the Mercurial repository.\n"
+" {webroot} Stripped pathname of the Mercurial repository.\n"
+" {hgweb} Base URL for browsing Mercurial repositories."
+msgstr ""
+
+msgid ""
+" Default 'changeset {node|short} in repo {root} refers '\n"
+" 'to bug {bug}.\\ndetails:\\n\\t{desc|tabindent}'"
+msgstr ""
+
+msgid ""
+"strip\n"
+" The number of slashes to strip from the front of {root} to produce\n"
+" {webroot}. Default 0."
+msgstr ""
+
+msgid ""
+"usermap\n"
+" Path of file containing Mercurial committer ID to Bugzilla user ID\n"
+" mappings. If specified, the file should contain one mapping per\n"
+" line, \"committer\"=\"Bugzilla user\". See also the [usermap] section."
+msgstr ""
+
+msgid ""
+"The [usermap] section is used to specify mappings of Mercurial\n"
+"committer ID to Bugzilla user ID. See also [bugzilla].usermap.\n"
+"\"committer\"=\"Bugzilla user\""
+msgstr ""
+
+msgid "Finally, the [web] section supports one entry:"
+msgstr ""
+
+msgid ""
+"baseurl\n"
+" Base URL for browsing Mercurial repositories. Reference from\n"
+" templates as {hgweb}."
+msgstr ""
+
+msgid "Activating the extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" bugzilla ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # run bugzilla hook on every change pulled or pushed in here\n"
+" incoming.bugzilla = python:hgext.bugzilla.hook"
+msgstr ""
+
+msgid "Example configuration:"
+msgstr ""
+
+msgid ""
+"This example configuration is for a collection of Mercurial\n"
+"repositories in /var/local/hg/repos/ used with a local Bugzilla 3.2\n"
+"installation in /opt/bugzilla-3.2. ::"
+msgstr ""
+
+msgid ""
+" [bugzilla]\n"
+" host=localhost\n"
+" password=XYZZY\n"
+" version=3.0\n"
+" bzuser=unknown@domain.com\n"
+" bzdir=/opt/bugzilla-3.2\n"
+" template=Changeset {node|short} in {root|basename}.\n"
+" {hgweb}/{webroot}/rev/{node|short}\\n\n"
+" {desc}\\n\n"
+" strip=5"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" baseurl=http://dev.domain.com/hg"
+msgstr ""
+
+msgid ""
+" [usermap]\n"
+" user@emaildomain.com=user.name@bugzilladomain.com"
+msgstr ""
+
+msgid "Commits add a comment to the Bugzilla bug record of the form::"
+msgstr ""
+
+msgid ""
+" Changeset 3b16791d6642 in repository-name.\n"
+" http://dev.domain.com/hg/repository-name/rev/3b16791d6642"
+msgstr ""
+
+msgid " Changeset commit comment. Bug 1234.\n"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s:%s as %s, password %s\n"
+msgstr "正在連線到 %s:%s as %s, 密碼是 %s\n"
+
+#, python-format
+msgid "query: %s %s\n"
+msgstr "查詢: %s %s\n"
+
+#, python-format
+msgid "failed query: %s %s\n"
+msgstr "查詢失敗了: %s %s\n"
+
+msgid "unknown database schema"
+msgstr "未知的資料庫schema"
+
+#, python-format
+msgid "bug %d already knows about changeset %s\n"
+msgstr ""
+
+msgid "telling bugzilla to send mail:\n"
+msgstr "告訴bugzilla去寄信:\n"
+
+#, python-format
+msgid " bug %s\n"
+msgstr ""
+
+#, python-format
+msgid "running notify command %s\n"
+msgstr "執行通知命令 %s\n"
+
+#, python-format
+msgid "bugzilla notify command %s"
+msgstr "bugzilla 通知命令 %s"
+
+msgid "done\n"
+msgstr "完æˆ\n"
+
+#, python-format
+msgid "looking up user %s\n"
+msgstr "查閱使用者 %s\n"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s"
+msgstr "找ä¸åˆ° bugzilla 使用者%s çš„ ID"
+
+#, python-format
+msgid "cannot find bugzilla user id for %s or %s"
+msgstr "找ä¸åˆ° bugzilla 使用者%s 或 %sçš„ ID"
+
+#, python-format
+msgid "bugzilla version %s not supported"
+msgstr "bugzilla版本 %s ä¸æ”¯æ´"
+
+msgid ""
+"changeset {node|short} in repo {root} refers to bug {bug}.\n"
+"details:\n"
+"\t{desc|tabindent}"
+msgstr ""
+
+#, python-format
+msgid "python mysql support not available: %s"
+msgstr "python mmysql 支æ´ä¸èƒ½ç”¨: %s"
+
+#, python-format
+msgid "hook type %s does not pass a changeset id"
+msgstr ""
+
+#, python-format
+msgid "database error: %s"
+msgstr "資料庫錯誤: %s"
+
+msgid "command to display child changesets"
+msgstr ""
+
+msgid "show the children of the given or working directory revision"
+msgstr ""
+
+msgid ""
+" Print the children of the working directory's revisions. If a\n"
+" revision is given via -r/--rev, the children of that revision will\n"
+" be printed. If a file argument is given, revision in which the\n"
+" file was last changed (after the working directory revision or the\n"
+" argument to --rev if given) is printed.\n"
+" "
+msgstr ""
+
+msgid "show children of the specified revision"
+msgstr ""
+
+msgid "hg children [-r REV] [FILE]"
+msgstr ""
+
+msgid "command to display statistics about repository history"
+msgstr ""
+
+#, python-format
+msgid "Revision %d is a merge, ignoring...\n"
+msgstr ""
+
+msgid "analyzing"
+msgstr "分æžä¸­"
+
+msgid "histogram of changes to the repository"
+msgstr ""
+
+msgid ""
+" This command will display a histogram representing the number\n"
+" of changed lines or revisions, grouped according to the given\n"
+" template. The default template will group changes by author.\n"
+" The --dateformat option may be used to group the results by\n"
+" date instead."
+msgstr ""
+
+msgid ""
+" Statistics are based on the number of changed lines, or\n"
+" alternatively the number of matching revisions if the\n"
+" --changesets option is specified."
+msgstr ""
+
+msgid " Examples::"
+msgstr ""
+
+msgid ""
+" # display count of changed lines for every committer\n"
+" hg churn -t '{author|email}'"
+msgstr ""
+
+msgid ""
+" # display daily activity graph\n"
+" hg churn -f '%H' -s -c"
+msgstr ""
+
+msgid ""
+" # display activity of developers by month\n"
+" hg churn -f '%Y-%m' -s -c"
+msgstr ""
+
+msgid ""
+" # display count of lines changed in every year\n"
+" hg churn -f '%Y' -s"
+msgstr ""
+
+msgid ""
+" It is possible to map alternate email addresses to a main address\n"
+" by providing a file using the following format::"
+msgstr ""
+
+msgid " <alias email> = <actual email>"
+msgstr ""
+
+msgid ""
+" Such a file may be specified with the --aliases option, otherwise\n"
+" a .hgchurn file will be looked for in the working directory root.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "skipping malformed alias: %s\n"
+msgstr ""
+
+msgid "count rate for the specified revision or range"
+msgstr ""
+
+msgid "DATE"
+msgstr ""
+
+msgid "count rate for revisions matching date spec"
+msgstr ""
+
+msgid "TEMPLATE"
+msgstr ""
+
+msgid "template to group changesets"
+msgstr ""
+
+msgid "FORMAT"
+msgstr ""
+
+msgid "strftime-compatible format for grouping by date"
+msgstr ""
+
+msgid "count rate by number of changesets"
+msgstr ""
+
+msgid "sort by key (default: sort by count)"
+msgstr ""
+
+msgid "display added/removed lines separately"
+msgstr ""
+
+msgid "FILE"
+msgstr ""
+
+msgid "file with email aliases"
+msgstr ""
+
+msgid "hg churn [-d DATE] [-r REV] [--aliases FILE] [FILE]"
+msgstr ""
+
+msgid "colorize output from some commands"
+msgstr ""
+
+msgid ""
+"This extension modifies the status and resolve commands to add color to "
+"their\n"
+"output to reflect file status, the qseries command to add color to reflect\n"
+"patch status (applied, unapplied, missing), and to diff-related\n"
+"commands to highlight additions, removals, diff headers, and trailing\n"
+"whitespace."
+msgstr ""
+
+msgid ""
+"Other effects in addition to color, like bold and underlined text, are\n"
+"also available. Effects are rendered with the ECMA-48 SGR control\n"
+"function (aka ANSI escape codes). This module also provides the\n"
+"render_text function, which can be used to add effects to any text."
+msgstr ""
+
+msgid "Default effects may be overridden from your configuration file::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" status.modified = blue bold underline red_background\n"
+" status.added = green bold\n"
+" status.removed = red bold blue_background\n"
+" status.deleted = cyan bold underline\n"
+" status.unknown = magenta bold underline\n"
+" status.ignored = black bold"
+msgstr ""
+
+msgid ""
+" # 'none' turns off all effects\n"
+" status.clean = none\n"
+" status.copied = none"
+msgstr ""
+
+msgid ""
+" qseries.applied = blue bold underline\n"
+" qseries.unapplied = black bold\n"
+" qseries.missing = red bold"
+msgstr ""
+
+msgid ""
+" diff.diffline = bold\n"
+" diff.extended = cyan bold\n"
+" diff.file_a = red bold\n"
+" diff.file_b = green bold\n"
+" diff.hunk = magenta\n"
+" diff.deleted = red\n"
+" diff.inserted = green\n"
+" diff.changed = white\n"
+" diff.trailingwhitespace = bold red_background"
+msgstr ""
+
+msgid ""
+" resolve.unresolved = red bold\n"
+" resolve.resolved = green bold"
+msgstr ""
+
+msgid " bookmarks.current = green"
+msgstr ""
+
+msgid ""
+" branches.active = none\n"
+" branches.closed = black bold\n"
+" branches.current = green\n"
+" branches.inactive = none"
+msgstr ""
+
+msgid ""
+"The color extension will try to detect whether to use ANSI codes or\n"
+"Win32 console APIs, unless it is made explicit::"
+msgstr ""
+
+msgid ""
+" [color]\n"
+" mode = ansi"
+msgstr ""
+
+msgid "Any value other than 'ansi', 'win32', or 'auto' will disable color."
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown color/effect %r (configured in color.%s)\n"
+msgstr "忽略未知的é¡è‰²/效果 %r (被設定在 color.%s)\n"
+
+msgid "win32console not found, please install pywin32\n"
+msgstr "找ä¸åˆ°win32console,請安è£pywin32\n"
+
+#. i18n: 'always', 'auto', and 'never' are keywords and should
+#. not be translated
+msgid "when to colorize (boolean, always, auto, or never)"
+msgstr ""
+
+msgid "TYPE"
+msgstr ""
+
+msgid "import revisions from foreign VCS repositories into Mercurial"
+msgstr ""
+
+msgid "convert a foreign SCM repository to a Mercurial one."
+msgstr ""
+
+msgid " Accepted source formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - CVS [cvs]\n"
+" - Darcs [darcs]\n"
+" - git [git]\n"
+" - Subversion [svn]\n"
+" - Monotone [mtn]\n"
+" - GNU Arch [gnuarch]\n"
+" - Bazaar [bzr]\n"
+" - Perforce [p4]"
+msgstr ""
+
+msgid " Accepted destination formats [identifiers]:"
+msgstr ""
+
+msgid ""
+" - Mercurial [hg]\n"
+" - Subversion [svn] (history on branches is not preserved)"
+msgstr ""
+
+msgid ""
+" If no revision is given, all revisions will be converted.\n"
+" Otherwise, convert will only import up to the named revision\n"
+" (given in a format understood by the source)."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source with ``-hg`` appended. If the destination\n"
+" repository doesn't exist, it will be created."
+msgstr ""
+
+msgid ""
+" By default, all sources except Mercurial will use --branchsort.\n"
+" Mercurial uses --sourcesort to preserve original revision numbers\n"
+" order. Sort modes have the following effects:"
+msgstr ""
+
+msgid ""
+" --branchsort convert from parent to child revision when possible,\n"
+" which means branches are usually converted one after\n"
+" the other. It generates more compact repositories."
+msgstr ""
+
+msgid ""
+" --datesort sort revisions by date. Converted repositories have\n"
+" good-looking changelogs but are often an order of\n"
+" magnitude larger than the same ones generated by\n"
+" --branchsort."
+msgstr ""
+
+msgid ""
+" --sourcesort try to preserve source revisions order, only\n"
+" supported by Mercurial sources."
+msgstr ""
+
+msgid ""
+" If <REVMAP> isn't given, it will be put in a default location\n"
+" (<dest>/.hg/shamap by default). The <REVMAP> is a simple text file\n"
+" that maps each source commit ID to the destination ID for that\n"
+" revision, like so::"
+msgstr ""
+
+msgid " <source ID> <destination ID>"
+msgstr ""
+
+msgid ""
+" If the file doesn't exist, it's automatically created. It's\n"
+" updated on each commit copied, so :hg:`convert` can be interrupted\n"
+" and can be run repeatedly to copy new commits."
+msgstr ""
+
+msgid ""
+" The authormap is a simple text file that maps each source commit\n"
+" author to a destination commit author. It is handy for source SCMs\n"
+" that use unix logins to identify authors (eg: CVS). One line per\n"
+" author mapping and the line format is::"
+msgstr ""
+
+msgid " source author = destination author"
+msgstr ""
+
+msgid " Empty lines and lines starting with a ``#`` are ignored."
+msgstr ""
+
+msgid ""
+" The filemap is a file that allows filtering and remapping of files\n"
+" and directories. Each line can contain one of the following\n"
+" directives::"
+msgstr ""
+
+msgid " include path/to/file-or-dir"
+msgstr ""
+
+msgid " exclude path/to/file-or-dir"
+msgstr ""
+
+msgid " rename path/to/source path/to/destination"
+msgstr ""
+
+msgid ""
+" Comment lines start with ``#``. A specified path matches if it\n"
+" equals the full relative name of a file or one of its parent\n"
+" directories. The ``include`` or ``exclude`` directive with the\n"
+" longest matching path applies, so line order does not matter."
+msgstr ""
+
+msgid ""
+" The ``include`` directive causes a file, or all files under a\n"
+" directory, to be included in the destination repository, and the\n"
+" exclusion of all other files and directories not explicitly\n"
+" included. The ``exclude`` directive causes files or directories to\n"
+" be omitted. The ``rename`` directive renames a file or directory if\n"
+" it is converted. To rename from a subdirectory into the root of\n"
+" the repository, use ``.`` as the path to rename to."
+msgstr ""
+
+msgid ""
+" The splicemap is a file that allows insertion of synthetic\n"
+" history, letting you specify the parents of a revision. This is\n"
+" useful if you want to e.g. give a Subversion merge two parents, or\n"
+" graft two disconnected series of history together. Each entry\n"
+" contains a key, followed by a space, followed by one or two\n"
+" comma-separated values::"
+msgstr ""
+
+msgid " key parent1, parent2"
+msgstr ""
+
+msgid ""
+" The key is the revision ID in the source\n"
+" revision control system whose parents should be modified (same\n"
+" format as a key in .hg/shamap). The values are the revision IDs\n"
+" (in either the source or destination revision control system) that\n"
+" should be used as the new parents for that node. For example, if\n"
+" you have merged \"release-1.0\" into \"trunk\", then you should\n"
+" specify the revision on \"trunk\" as the first parent and the one on\n"
+" the \"release-1.0\" branch as the second."
+msgstr ""
+
+msgid ""
+" The branchmap is a file that allows you to rename a branch when it is\n"
+" being brought in from whatever external repository. When used in\n"
+" conjunction with a splicemap, it allows for a powerful combination\n"
+" to help fix even the most badly mismanaged repositories and turn them\n"
+" into nicely structured Mercurial repositories. The branchmap contains\n"
+" lines of the form::"
+msgstr ""
+
+msgid " original_branch_name new_branch_name"
+msgstr ""
+
+msgid ""
+" where \"original_branch_name\" is the name of the branch in the\n"
+" source repository, and \"new_branch_name\" is the name of the branch\n"
+" is the destination repository. No whitespace is allowed in the\n"
+" branch names. This can be used to (for instance) move code in one\n"
+" repository from \"default\" to a named branch."
+msgstr ""
+
+msgid ""
+" Mercurial Source\n"
+" ''''''''''''''''"
+msgstr ""
+
+msgid ""
+" --config convert.hg.ignoreerrors=False (boolean)\n"
+" ignore integrity errors when reading. Use it to fix Mercurial\n"
+" repositories with missing revlogs, by converting from and to\n"
+" Mercurial.\n"
+" --config convert.hg.saverev=False (boolean)\n"
+" store original revision ID in changeset (forces target IDs to\n"
+" change)\n"
+" --config convert.hg.startrev=0 (hg revision identifier)\n"
+" convert start revision and its descendants"
+msgstr ""
+
+msgid ""
+" CVS Source\n"
+" ''''''''''"
+msgstr ""
+
+msgid ""
+" CVS source will use a sandbox (i.e. a checked-out copy) from CVS\n"
+" to indicate the starting point of what will be converted. Direct\n"
+" access to the repository files is not needed, unless of course the\n"
+" repository is :local:. The conversion uses the top level directory\n"
+" in the sandbox to find the CVS repository, and then uses CVS rlog\n"
+" commands to find files to convert. This means that unless a\n"
+" filemap is given, all files under the starting directory will be\n"
+" converted, and that any directory reorganization in the CVS\n"
+" sandbox is ignored."
+msgstr ""
+
+msgid " The options shown are the defaults."
+msgstr ""
+
+msgid ""
+" --config convert.cvsps.cache=True (boolean)\n"
+" Set to False to disable remote log caching, for testing and\n"
+" debugging purposes.\n"
+" --config convert.cvsps.fuzz=60 (integer)\n"
+" Specify the maximum time (in seconds) that is allowed between\n"
+" commits with identical user and log message in a single\n"
+" changeset. When very large files were checked in as part of a\n"
+" changeset then the default may not be long enough.\n"
+" --config convert.cvsps.mergeto='{{mergetobranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" insert a dummy revision merging the branch on which this log\n"
+" message occurs to the branch indicated in the regex.\n"
+" --config convert.cvsps.mergefrom='{{mergefrombranch ([-\\w]+)}}'\n"
+" Specify a regular expression to which commit log messages are\n"
+" matched. If a match occurs, then the conversion process will\n"
+" add the most recent revision on the branch indicated in the\n"
+" regex as the second parent of the changeset.\n"
+" --config hook.cvslog\n"
+" Specify a Python function to be called at the end of gathering\n"
+" the CVS log. The function is passed a list with the log entries,\n"
+" and can modify the entries in-place, or add or delete them.\n"
+" --config hook.cvschangesets\n"
+" Specify a Python function to be called after the changesets\n"
+" are calculated from the the CVS log. The function is passed\n"
+" a list with the changeset entries, and can modify the changesets\n"
+" in-place, or add or delete them."
+msgstr ""
+
+msgid ""
+" An additional \"debugcvsps\" Mercurial command allows the builtin\n"
+" changeset merging code to be run without doing a conversion. Its\n"
+" parameters and output are similar to that of cvsps 2.1. Please see\n"
+" the command help for more details."
+msgstr ""
+
+msgid ""
+" Subversion Source\n"
+" '''''''''''''''''"
+msgstr ""
+
+msgid ""
+" Subversion source detects classical trunk/branches/tags layouts.\n"
+" By default, the supplied \"svn://repo/path/\" source URL is\n"
+" converted as a single branch. If \"svn://repo/path/trunk\" exists it\n"
+" replaces the default branch. If \"svn://repo/path/branches\" exists,\n"
+" its subdirectories are listed as possible branches. If\n"
+" \"svn://repo/path/tags\" exists, it is looked for tags referencing\n"
+" converted branches. Default \"trunk\", \"branches\" and \"tags\" values\n"
+" can be overridden with following options. Set them to paths\n"
+" relative to the source URL, or leave them blank to disable auto\n"
+" detection."
+msgstr ""
+
+msgid ""
+" --config convert.svn.branches=branches (directory name)\n"
+" specify the directory containing branches\n"
+" --config convert.svn.tags=tags (directory name)\n"
+" specify the directory containing tags\n"
+" --config convert.svn.trunk=trunk (directory name)\n"
+" specify the name of the trunk branch"
+msgstr ""
+
+msgid ""
+" Source history can be retrieved starting at a specific revision,\n"
+" instead of being integrally converted. Only single branch\n"
+" conversions are supported."
+msgstr ""
+
+msgid ""
+" --config convert.svn.startrev=0 (svn revision number)\n"
+" specify start Subversion revision."
+msgstr ""
+
+msgid ""
+" Perforce Source\n"
+" '''''''''''''''"
+msgstr ""
+
+msgid ""
+" The Perforce (P4) importer can be given a p4 depot path or a\n"
+" client specification as source. It will convert all files in the\n"
+" source to a flat Mercurial repository, ignoring labels, branches\n"
+" and integrations. Note that when a depot path is given you then\n"
+" usually should specify a target directory, because otherwise the\n"
+" target may be named ...-hg."
+msgstr ""
+
+msgid ""
+" It is possible to limit the amount of source history to be\n"
+" converted by specifying an initial Perforce revision."
+msgstr ""
+
+msgid ""
+" --config convert.p4.startrev=0 (perforce changelist number)\n"
+" specify initial Perforce revision."
+msgstr ""
+
+msgid ""
+" Mercurial Destination\n"
+" '''''''''''''''''''''"
+msgstr ""
+
+msgid ""
+" --config convert.hg.clonebranches=False (boolean)\n"
+" dispatch source branches in separate clones.\n"
+" --config convert.hg.tagsbranch=default (branch name)\n"
+" tag revisions branch name\n"
+" --config convert.hg.usebranchnames=True (boolean)\n"
+" preserve branch names"
+msgstr ""
+
+msgid " "
+msgstr ""
+
+msgid "create changeset information from CVS"
+msgstr ""
+
+msgid ""
+" This command is intended as a debugging tool for the CVS to\n"
+" Mercurial converter, and can be used as a direct replacement for\n"
+" cvsps."
+msgstr ""
+
+msgid ""
+" Hg debugcvsps reads the CVS rlog for current directory (or any\n"
+" named directory) in the CVS repository, and converts the log to a\n"
+" series of changesets based on matching commit log entries and\n"
+" dates."
+msgstr ""
+
+msgid "username mapping filename (DEPRECATED, use --authormap instead)"
+msgstr ""
+
+msgid "source repository type"
+msgstr ""
+
+msgid "destination repository type"
+msgstr ""
+
+msgid "import up to target revision REV"
+msgstr ""
+
+msgid "remap usernames using this file"
+msgstr ""
+
+msgid "remap file names using contents of file"
+msgstr ""
+
+msgid "splice synthesized history into place"
+msgstr ""
+
+msgid "change branch names while converting"
+msgstr ""
+
+msgid "try to sort changesets by branches"
+msgstr ""
+
+msgid "try to sort changesets by date"
+msgstr ""
+
+msgid "preserve source changesets order"
+msgstr ""
+
+msgid "hg convert [OPTION]... SOURCE [DEST [REVMAP]]"
+msgstr ""
+
+msgid "only return changes on specified branches"
+msgstr ""
+
+msgid "prefix to remove from file names"
+msgstr ""
+
+msgid "only return changes after or between specified tags"
+msgstr ""
+
+msgid "update cvs log cache"
+msgstr ""
+
+msgid "create new cvs log cache"
+msgstr ""
+
+msgid "set commit time fuzz in seconds"
+msgstr ""
+
+msgid "specify cvsroot"
+msgstr ""
+
+msgid "show parent changesets"
+msgstr ""
+
+msgid "show current changeset in ancestor branches"
+msgstr ""
+
+msgid "ignored for compatibility"
+msgstr ""
+
+msgid "hg debugcvsps [OPTION]... [PATH]..."
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Bazaar repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ Bazaar 儲存庫"
+
+msgid "Bazaar modules could not be loaded"
+msgstr "Bazaar 模組ä¸èƒ½è¼‰å…¥"
+
+msgid ""
+"warning: lightweight checkouts may cause conversion failures, try with a "
+"regular branch instead.\n"
+msgstr ""
+
+msgid "bzr source type could not be determined\n"
+msgstr "bazaar 來æºåž‹æ…‹ä¸èƒ½è¢«æ±ºå®š\n"
+
+#, python-format
+msgid "%s is not a valid revision in current branch"
+msgstr "在目å‰çš„分支,%sä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„修定版"
+
+#, python-format
+msgid "%s is not available in %s anymore"
+msgstr ""
+
+#, python-format
+msgid "%s.%s symlink has no target"
+msgstr "%s.%s 符號連çµæ²’有目標"
+
+#, python-format
+msgid "cannot find required \"%s\" tool"
+msgstr "找ä¸åˆ°éœ€è¦çš„ '%s' 工具"
+
+#, python-format
+msgid "%s error:\n"
+msgstr "%s 錯誤:\n"
+
+#, python-format
+msgid "syntax error in %s(%d): key/value pair expected"
+msgstr ""
+
+#, python-format
+msgid "could not open map file %r: %s"
+msgstr "ä¸èƒ½æ‰“é–‹ map 檔 %r: %s"
+
+#, python-format
+msgid "%s: invalid source repository type"
+msgstr "%s: 無效的來æºå„²å­˜åº«åž‹æ…‹"
+
+#, python-format
+msgid "%s: missing or unsupported repository"
+msgstr "%s: éºå¤±äº† 或 ä¸æ”¯æ´çš„儲存庫"
+
+#, python-format
+msgid "%s: invalid destination repository type"
+msgstr "%s: 未知的目的儲存庫型態"
+
+#, python-format
+msgid "convert: %s\n"
+msgstr "轉æ›: %s\n"
+
+#, python-format
+msgid "%s: unknown repository type"
+msgstr "%s: 未知的儲存庫型態"
+
+msgid "getting files"
+msgstr "å–得檔案中..."
+
+msgid "revisions"
+msgstr "修定版"
+
+msgid "scanning"
+msgstr "掃æ中"
+
+#, python-format
+msgid "unknown sort mode: %s"
+msgstr "未知的排åºæ¨¡å¼: %s"
+
+#, python-format
+msgid "cycle detected between %s and %s"
+msgstr ""
+
+msgid "not all revisions were sorted"
+msgstr ""
+
+#, python-format
+msgid "Writing author map file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Ignoring bad line in author map file %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "mapping author %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "overriding mapping for author %s, was %s, will be %s\n"
+msgstr ""
+
+#, python-format
+msgid "spliced in %s as parents of %s\n"
+msgstr ""
+
+msgid "scanning source...\n"
+msgstr "掃æ source 中\n"
+
+msgid "sorting...\n"
+msgstr "排åºä¸­\n"
+
+msgid "converting...\n"
+msgstr "轉æ›ä¸­...\n"
+
+#, python-format
+msgid "source: %s\n"
+msgstr "來æº: %s\n"
+
+msgid "converting"
+msgstr "轉æ›ä¸­"
+
+#, python-format
+msgid "assuming destination %s\n"
+msgstr ""
+
+msgid "more than one sort mode specified"
+msgstr "æ述了ä¸åªä¸€å€‹æŽ’åºæ¨¡å¼"
+
+msgid "--sourcesort is not supported by this data source"
+msgstr "--sourcesort ä¸æ”¯æ´é€™å€‹è³‡æ–™ä¾†æº"
+
+#, python-format
+msgid "%s does not look like a CVS checkout"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ CVS çš„ checkout"
+
+#, python-format
+msgid "revision %s is not a patchset number"
+msgstr ""
+
+#, python-format
+msgid "connecting to %s\n"
+msgstr "連接到 %s\n"
+
+msgid "CVS pserver authentication failed"
+msgstr ""
+
+#, python-format
+msgid ""
+"unexpected response from CVS server (expected \"Valid-requests\", but got %r)"
+msgstr ""
+
+#, python-format
+msgid "%d bytes missing from remote file"
+msgstr "從é ç«¯æª”案éºå¤±äº† %d ä½å…ƒçµ„s"
+
+msgid "malformed response from CVS"
+msgstr "從CVS那收到畸形的回應"
+
+#, python-format
+msgid "cvs server: %s\n"
+msgstr "cvs 伺æœå™¨: %s\n"
+
+#, python-format
+msgid "unknown CVS response: %s"
+msgstr "未知的CVS回應: %s"
+
+msgid "collecting CVS rlog\n"
+msgstr "收集 CVS rlog\n"
+
+msgid "not a CVS sandbox"
+msgstr "ä¸æ˜¯ä¸€å€‹CVS sandbox"
+
+#, python-format
+msgid "reading cvs log cache %s\n"
+msgstr "è®€å– cvs 紀錄快å–(log cache) %s\n"
+
+#, python-format
+msgid "cache has %d log entries\n"
+msgstr ""
+
+#, python-format
+msgid "error reading cache: %r\n"
+msgstr "讀å–å¿«å–錯誤: %r\n"
+
+#, python-format
+msgid "running %s\n"
+msgstr "正在執行 %s\n"
+
+msgid "RCS file must be followed by working file"
+msgstr ""
+
+msgid "must have at least some revisions"
+msgstr ""
+
+msgid "expected revision number"
+msgstr ""
+
+msgid "revision must be followed by date line"
+msgstr ""
+
+msgid "log cache overlaps with new log entries, re-run without cache."
+msgstr ""
+
+#, python-format
+msgid "writing cvs log cache %s\n"
+msgstr "寫入 CVS 紀錄快å–(log cache) %s\n"
+
+#, python-format
+msgid "%d log entries\n"
+msgstr ""
+
+msgid "creating changesets\n"
+msgstr ""
+
+msgid "synthetic changeset cannot have multiple parents"
+msgstr ""
+
+#, python-format
+msgid ""
+"warning: CVS commit message references non-existent branch %r:\n"
+"%s\n"
+msgstr ""
+
+#, python-format
+msgid "%d changeset entries\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a darcs repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ darcs 儲存庫"
+
+#, python-format
+msgid "darcs version 2.1 or newer needed (found %r)"
+msgstr "éœ€è¦ darcs 版本2.1以上 (找到的是 %r)"
+
+msgid "Python ElementTree module is not available"
+msgstr "Python ElementTree module ä¸èƒ½ç”¨"
+
+#, python-format
+msgid "%s repository format is unsupported, please upgrade"
+msgstr "%s 儲存庫格å¼ä¸æ”¯æ´,è«‹æ›´æ–°"
+
+msgid "failed to detect repository format!"
+msgstr "åµæ¸¬å„²å­˜åº«æ ¼å¼å¤±æ•—!"
+
+msgid "internal calling inconsistency"
+msgstr ""
+
+msgid "errors in filemap"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: path to %s is missing\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: %r already in %s list\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: superfluous / in %s %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s:%d: unknown directive %r\n"
+msgstr ""
+
+msgid "source repository doesn't support --filemap"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Git repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ Git 儲存庫"
+
+msgid "cannot retrieve git heads"
+msgstr "ä¸èƒ½å–回git標頭"
+
+#, python-format
+msgid "cannot read %r object at %s"
+msgstr ""
+
+#, python-format
+msgid "cannot read changes in %s"
+msgstr "ä¸èƒ½åœ¨%s讀å–變更"
+
+#, python-format
+msgid "cannot read tags from %s"
+msgstr "ä¸èƒ½å¾ž%s讀å–標記"
+
+#, python-format
+msgid "%s does not look like a GNU Arch repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ GNU Arch 儲存庫"
+
+msgid "cannot find a GNU Arch tool"
+msgstr "找ä¸åˆ° GNU arch 工具"
+
+#, python-format
+msgid "analyzing tree version %s...\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"tree analysis stopped because it points to an unregistered archive %s...\n"
+msgstr ""
+
+#, python-format
+msgid "could not parse cat-log of %s"
+msgstr ""
+
+#, python-format
+msgid "%s is not a local Mercurial repository"
+msgstr "%s ä¸æ˜¯ä¸€å€‹æœ¬åœ°ç«¯çš„ Mercurial 儲存庫"
+
+#, python-format
+msgid "initializing destination %s repository\n"
+msgstr ""
+
+#, python-format
+msgid "could not create hg repository %s as sink"
+msgstr ""
+
+#, python-format
+msgid "pulling from %s into %s\n"
+msgstr ""
+
+msgid "filtering out empty revision\n"
+msgstr ""
+
+msgid "updating tags\n"
+msgstr "正在更新標記\n"
+
+#, python-format
+msgid "%s is not a valid start revision"
+msgstr "%s ä¸æ˜¯ä¸€å€‹æœ‰æ•ˆçš„開始修定版"
+
+#, python-format
+msgid "ignoring: %s\n"
+msgstr "忽略: %s\n"
+
+#, python-format
+msgid "%s does not look like a monotone repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹monotone 儲存庫"
+
+#, python-format
+msgid "copying file in renamed directory from '%s' to '%s'"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a P4 repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ P4 儲存庫"
+
+msgid "reading p4 views\n"
+msgstr "正在讀å–P4視å€\n"
+
+msgid "collecting p4 changelists\n"
+msgstr "收集P4變更列表\n"
+
+msgid "Mercurial failed to run itself, check hg executable is in PATH"
+msgstr ""
+
+msgid ""
+"svn: cannot probe remote repository, assume it could be a subversion "
+"repository. Use --source-type if you know better.\n"
+msgstr ""
+
+#, python-format
+msgid "%s does not look like a Subversion repository"
+msgstr "%s 怎麼看都ä¸åƒæ˜¯ä¸€å€‹ Subversion 儲存庫"
+
+msgid "Subversion python bindings could not be loaded"
+msgstr ""
+
+#, python-format
+msgid "Subversion python bindings %d.%d found, 1.4 or later required"
+msgstr ""
+
+msgid "Subversion python bindings are too old, 1.4 or later required"
+msgstr ""
+
+#, python-format
+msgid "svn: revision %s is not an integer"
+msgstr "svn:修定版 %s ä¸æ˜¯ä¸€å€‹æ•´æ•¸"
+
+#, python-format
+msgid "svn: start revision %s is not an integer"
+msgstr "svn:開始修定版%sä¸æ˜¯ä¸€å€‹æ•´æ•¸"
+
+#, python-format
+msgid "no revision found in module %s"
+msgstr "在%s模組中找ä¸åˆ°ä¿®å®šç‰ˆ"
+
+#, python-format
+msgid "expected %s to be at %r, but not found"
+msgstr ""
+
+#, python-format
+msgid "found %s at %r\n"
+msgstr "找到%s在%r\n"
+
+#, python-format
+msgid "ignoring empty branch %s\n"
+msgstr "忽略空白的分支 %s\n"
+
+#, python-format
+msgid "found branch %s at %d\n"
+msgstr "找到分支 %s 在 %d\n"
+
+msgid "svn: start revision is not supported with more than one branch"
+msgstr ""
+
+#, python-format
+msgid "svn: no revision found after start revision %d"
+msgstr ""
+
+#, python-format
+msgid "%s not found up to revision %d"
+msgstr ""
+
+msgid "scanning paths"
+msgstr "掃æ è£œä¸ ä¸­"
+
+#, python-format
+msgid "found parent of branch %s at %d: %s\n"
+msgstr ""
+
+#, python-format
+msgid "fetching revision log for \"%s\" from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "svn: branch has no revision %s"
+msgstr "svn:分支沒有修定版 %s"
+
+#, python-format
+msgid "initializing svn repository %r\n"
+msgstr "正在åˆå§‹åŒ–subversion儲存庫%r\n"
+
+#, python-format
+msgid "initializing svn working copy %r\n"
+msgstr "åˆå§‹ Subversion 工作副本 %r\n"
+
+msgid "unexpected svn output:\n"
+msgstr "æ„料之外的Subversion 輸出:\n"
+
+msgid "unable to cope with svn output"
+msgstr ""
+
+msgid "writing Subversion tags is not yet implemented\n"
+msgstr "還沒有實作 '寫入Subversion標記' 這個功能\n"
+
+msgid "automatically manage newlines in repository files"
+msgstr ""
+
+msgid ""
+"This extension allows you to manage the type of line endings (CRLF or\n"
+"LF) that are used in the repository and in the local working\n"
+"directory. That way you can get CRLF line endings on Windows and LF on\n"
+"Unix/Mac, thereby letting everybody use their OS native line endings."
+msgstr ""
+
+msgid ""
+"The extension reads its configuration from a versioned ``.hgeol``\n"
+"configuration file every time you run an ``hg`` command. The\n"
+"``.hgeol`` file use the same syntax as all other Mercurial\n"
+"configuration files. It uses two sections, ``[patterns]`` and\n"
+"``[repository]``."
+msgstr ""
+
+msgid ""
+"The ``[patterns]`` section specifies the line endings used in the\n"
+"working directory. The format is specified by a file pattern. The\n"
+"first match is used, so put more specific patterns first. The\n"
+"available line endings are ``LF``, ``CRLF``, and ``BIN``."
+msgstr ""
+
+msgid ""
+"Files with the declared format of ``CRLF`` or ``LF`` are always\n"
+"checked out in that format and files declared to be binary (``BIN``)\n"
+"are left unchanged. Additionally, ``native`` is an alias for the\n"
+"platform's default line ending: ``LF`` on Unix (including Mac OS X)\n"
+"and ``CRLF`` on Windows. Note that ``BIN`` (do nothing to line\n"
+"endings) is Mercurial's default behaviour; it is only needed if you\n"
+"need to override a later, more general pattern."
+msgstr ""
+
+msgid ""
+"The optional ``[repository]`` section specifies the line endings to\n"
+"use for files stored in the repository. It has a single setting,\n"
+"``native``, which determines the storage line endings for files\n"
+"declared as ``native`` in the ``[patterns]`` section. It can be set to\n"
+"``LF`` or ``CRLF``. The default is ``LF``. For example, this means\n"
+"that on Windows, files configured as ``native`` (``CRLF`` by default)\n"
+"will be converted to ``LF`` when stored in the repository. Files\n"
+"declared as ``LF``, ``CRLF``, or ``BIN`` in the ``[patterns]`` section\n"
+"are always stored as-is in the repository."
+msgstr ""
+
+msgid "Example versioned ``.hgeol`` file::"
+msgstr ""
+
+msgid ""
+" [patterns]\n"
+" **.py = native\n"
+" **.vcproj = CRLF\n"
+" **.txt = native\n"
+" Makefile = LF\n"
+" **.jpg = BIN"
+msgstr ""
+
+msgid ""
+" [repository]\n"
+" native = LF"
+msgstr ""
+
+msgid ""
+"The extension uses an optional ``[eol]`` section in your hgrc file\n"
+"(not the ``.hgeol`` file) for settings that control the overall\n"
+"behavior. There are two settings:"
+msgstr ""
+
+msgid ""
+"- ``eol.native`` (default ``os.linesep``) can be set to ``LF`` or\n"
+" ``CRLF`` to override the default interpretation of ``native`` for\n"
+" checkout. This can be used with :hg:`archive` on Unix, say, to\n"
+" generate an archive where files have line endings for Windows."
+msgstr ""
+
+msgid ""
+"- ``eol.only-consistent`` (default True) can be set to False to make\n"
+" the extension convert files with inconsistent EOLs. Inconsistent\n"
+" means that there is both ``CRLF`` and ``LF`` present in the file.\n"
+" Such files are normally not touched under the assumption that they\n"
+" have mixed EOLs on purpose."
+msgstr ""
+
+msgid ""
+"See :hg:`help patterns` for more information about the glob patterns\n"
+"used.\n"
+msgstr ""
+
+#, python-format
+msgid "%s should not have CRLF line endings"
+msgstr "%s ä¸æ‡‰è©²æœ‰CRLFçµæŸ"
+
+#, python-format
+msgid "%s should not have LF line endings"
+msgstr "%s ä¸æ‡‰è©²æœ‰LFçµæŸ"
+
+msgid "the eol extension is incompatible with the win32text extension"
+msgstr ""
+
+#, python-format
+msgid "ignoring unknown EOL style '%s' from %s\n"
+msgstr "忽略未知的æ›è¡Œåž‹æ…‹ '%s' 從 %s\n"
+
+#, python-format
+msgid "inconsistent newline style in %s\n"
+msgstr ""
+
+msgid "command to allow external programs to compare revisions"
+msgstr ""
+
+msgid ""
+"The extdiff Mercurial extension allows you to use external programs\n"
+"to compare revisions, or revision with working directory. The external\n"
+"diff programs are called with a configurable set of options and two\n"
+"non-option arguments: paths to directories containing snapshots of\n"
+"files to compare."
+msgstr ""
+
+msgid ""
+"The extdiff extension also allows to configure new diff commands, so\n"
+"you do not need to type :hg:`extdiff -p kdiff3` always. ::"
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" # add new command that runs GNU diff(1) in 'context diff' mode\n"
+" cdiff = gdiff -Nprc5\n"
+" ## or the old way:\n"
+" #cmd.cdiff = gdiff\n"
+" #opts.cdiff = -Nprc5"
+msgstr ""
+
+msgid ""
+" # add new command called vdiff, runs kdiff3\n"
+" vdiff = kdiff3"
+msgstr ""
+
+msgid ""
+" # add new command called meld, runs meld (no need to name twice)\n"
+" meld ="
+msgstr ""
+
+msgid ""
+" # add new command called vimdiff, runs gvimdiff with DirDiff plugin\n"
+" # (see http://www.vim.org/scripts/script.php?script_id=102) Non\n"
+" # English user, be sure to put \"let g:DirDiffDynamicDiffText = 1\" in\n"
+" # your .vimrc\n"
+" vimdiff = gvim -f '+next' '+execute \"DirDiff\" argv(0) argv(1)'"
+msgstr ""
+
+msgid "Tool arguments can include variables that are expanded at runtime::"
+msgstr ""
+
+msgid ""
+" $parent1, $plabel1 - filename, descriptive label of first parent\n"
+" $child, $clabel - filename, descriptive label of child revision\n"
+" $parent2, $plabel2 - filename, descriptive label of second parent\n"
+" $parent is an alias for $parent1."
+msgstr ""
+
+msgid ""
+"The extdiff extension will look in your [diff-tools] and [merge-tools]\n"
+"sections for diff tool arguments, when none are specified in [extdiff]."
+msgstr ""
+
+msgid ""
+" [extdiff]\n"
+" kdiff3 ="
+msgstr ""
+
+msgid ""
+" [diff-tools]\n"
+" kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child"
+msgstr ""
+
+msgid ""
+"You can use -I/-X and list of file or directory names like normal\n"
+":hg:`diff` command. The extdiff extension makes snapshots of only\n"
+"needed files, so running the external diff program will actually be\n"
+"pretty fast (at least faster than having to compare the entire tree).\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from rev %s\n"
+msgstr ""
+
+#, python-format
+msgid "making snapshot of %d files from working directory\n"
+msgstr ""
+
+msgid "cannot specify --rev and --change at the same time"
+msgstr "ä¸å¯ä»¥åŒæ™‚æè¿° --rev è·Ÿ --change"
+
+msgid "cleaning up temp directory\n"
+msgstr "清掉暫存目錄\n"
+
+msgid "use external program to diff repository (or selected files)"
+msgstr ""
+
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" an external program. The default program used is diff, with\n"
+" default options \"-Npru\"."
+msgstr ""
+
+msgid ""
+" To select a different program, use the -p/--program option. The\n"
+" program will be passed the names of two directories to compare. To\n"
+" pass additional options to the program, use -o/--option. These\n"
+" will be passed before the names of the directories to compare."
+msgstr ""
+
+msgid ""
+" When two revision arguments are given, then changes are shown\n"
+" between those revisions. If only one revision is specified then\n"
+" that revision is compared to the working directory, and, when no\n"
+" revisions are specified, the working directory files are compared\n"
+" to its parent."
+msgstr ""
+
+msgid "CMD"
+msgstr ""
+
+msgid "comparison program to run"
+msgstr ""
+
+msgid "OPT"
+msgstr ""
+
+msgid "pass option to comparison program"
+msgstr ""
+
+msgid "change made by revision"
+msgstr ""
+
+msgid "hg extdiff [OPT]... [FILE]..."
+msgstr ""
+
+#, python-format
+msgid "use %(path)s to diff repository (or selected files)"
+msgstr ""
+
+#, python-format
+msgid ""
+" Show differences between revisions for the specified files, using\n"
+" the %(path)s program."
+msgstr ""
+
+#, python-format
+msgid "hg %s [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "pull, update and merge in one command"
+msgstr ""
+
+msgid "pull changes from a remote repository, merge new changes if needed."
+msgstr ""
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to the local repository."
+msgstr ""
+
+msgid ""
+" If the pulled changes add a new branch head, the head is\n"
+" automatically merged, and the result of the merge is committed.\n"
+" Otherwise, the working directory is updated to include the new\n"
+" changes."
+msgstr ""
+
+msgid ""
+" When a merge occurs, the newly pulled changes are assumed to be\n"
+" \"authoritative\". The head of the new changes is used as the first\n"
+" parent, with local changes as the second. To switch the merge\n"
+" order, use --switch-parent."
+msgstr ""
+
+msgid " See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Returns 0 on success.\n"
+" "
+msgstr ""
+
+msgid ""
+"working dir not at branch tip (use \"hg update\" to check out branch tip)"
+msgstr ""
+
+msgid "outstanding uncommitted merge"
+msgstr ""
+
+msgid "outstanding uncommitted changes"
+msgstr ""
+
+msgid "working directory is missing some files"
+msgstr "工作目錄éºå¤±äº†ä¸€äº›æª”案"
+
+msgid ""
+"multiple heads in this branch (use \"hg heads .\" and \"hg merge\" to merge)"
+msgstr "這個分支有多個標頭(使用'hg heads .' å’Œ 'hg merge' 去åˆä½µ)"
+
+#, python-format
+msgid "pulling from %s\n"
+msgstr "從 %s 拉回中\n"
+
+msgid ""
+"Other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr "其他儲存庫ä¸æ”¯æ´ä¿®å®šç‰ˆæŸ¥é–±,所以ä¸èƒ½æ述一個修定版"
+
+#, python-format
+msgid ""
+"not merging with %d other new branch heads (use \"hg heads .\" and \"hg merge"
+"\" to merge them)\n"
+msgstr ""
+
+#, python-format
+msgid "updating to %d:%s\n"
+msgstr "更新到%d:%s ...\n"
+
+#, python-format
+msgid "merging with %d:%s\n"
+msgstr "è·Ÿ%dåˆä½µ:%s ...\n"
+
+#, python-format
+msgid "new changeset %d:%s merges remote changes with local\n"
+msgstr ""
+
+msgid "a specific revision you would like to pull"
+msgstr ""
+
+msgid "edit commit message"
+msgstr "編輯æ交訊æ¯"
+
+msgid "edit commit message (DEPRECATED)"
+msgstr ""
+
+msgid "switch parents when merging"
+msgstr ""
+
+msgid "hg fetch [SOURCE]"
+msgstr ""
+
+msgid "commands to sign and verify changesets"
+msgstr ""
+
+msgid "error while verifying signature"
+msgstr ""
+
+#, python-format
+msgid "%s Bad signature from \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: Signature has expired (signed by: \"%s\")\n"
+msgstr ""
+
+#, python-format
+msgid "%s Note: This key has expired (signed by: \"%s\")\n"
+msgstr ""
+
+msgid "list signed changesets"
+msgstr ""
+
+#, python-format
+msgid "%s:%d node does not exist\n"
+msgstr "%s:%d 節點ä¸å­˜åœ¨\n"
+
+msgid "verify all the signatures there may be for a particular revision"
+msgstr ""
+
+#, python-format
+msgid "No valid signature for %s\n"
+msgstr ""
+
+msgid "add a signature for the current or given revision"
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" See :hg:`help dates` for a list of formats valid for -d/--date.\n"
+" "
+msgstr ""
+
+msgid "uncommitted merge - please provide a specific revision"
+msgstr ""
+
+#, python-format
+msgid "Signing %d:%s\n"
+msgstr ""
+
+msgid "error while signing"
+msgstr ""
+
+msgid ""
+"working copy of .hgsigs is changed (please commit .hgsigs manually or use --"
+"force)"
+msgstr ""
+
+msgid "unknown signature version"
+msgstr ""
+
+msgid "make the signature local"
+msgstr ""
+
+msgid "sign even if the sigfile is modified"
+msgstr ""
+
+msgid "do not commit the sigfile after signing"
+msgstr ""
+
+msgid "ID"
+msgstr ""
+
+msgid "the key id to sign with"
+msgstr ""
+
+msgid "TEXT"
+msgstr ""
+
+msgid "commit message"
+msgstr "æ交訊æ¯"
+
+msgid "hg sign [OPTION]... [REVISION]..."
+msgstr ""
+
+msgid "hg sigcheck REVISION"
+msgstr ""
+
+msgid "hg sigs"
+msgstr ""
+
+msgid "command to view revision graphs from a shell"
+msgstr ""
+
+msgid ""
+"This extension adds a --graph option to the incoming, outgoing and log\n"
+"commands. When this options is given, an ASCII representation of the\n"
+"revision graph is also shown.\n"
+msgstr ""
+
+#, python-format
+msgid "--graph option is incompatible with --%s"
+msgstr ""
+
+msgid "show revision history alongside an ASCII revision graph"
+msgstr ""
+
+msgid ""
+" Print a revision history alongside a revision graph drawn with\n"
+" ASCII characters."
+msgstr ""
+
+msgid ""
+" Nodes printed as an @ character are parents of the working\n"
+" directory.\n"
+" "
+msgstr ""
+
+msgid "show the revision DAG"
+msgstr ""
+
+msgid "NUM"
+msgstr ""
+
+msgid "limit number of changes displayed"
+msgstr ""
+
+msgid "show patch"
+msgstr ""
+
+msgid "show the specified revision or range"
+msgstr ""
+
+msgid "hg glog [OPTION]... [FILE]"
+msgstr ""
+
+msgid "hooks for integrating with the CIA.vc notification service"
+msgstr ""
+
+msgid ""
+"This is meant to be run as a changegroup or incoming hook. To\n"
+"configure it, set the following options in your hgrc::"
+msgstr ""
+
+msgid ""
+" [cia]\n"
+" # your registered CIA user name\n"
+" user = foo\n"
+" # the name of the project in CIA\n"
+" project = foo\n"
+" # the module (subproject) (optional)\n"
+" #module = foo\n"
+" # Append a diffstat to the log message (optional)\n"
+" #diffstat = False\n"
+" # Template to use for log messages (optional)\n"
+" #template = {desc}\\n{baseurl}/rev/{node}-- {diffstat}\n"
+" # Style to use (optional)\n"
+" #style = foo\n"
+" # The URL of the CIA notification service (optional)\n"
+" # You can use mailto: URLs to send by email, eg\n"
+" # mailto:cia@cia.vc\n"
+" # Make sure to set email.from if you do this.\n"
+" #url = http://cia.vc/\n"
+" # print message instead of sending it (optional)\n"
+" #test = False"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one of these:\n"
+" changegroup.cia = python:hgcia.hook\n"
+" #incoming.cia = python:hgcia.hook"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" # If you want hyperlinks (optional)\n"
+" baseurl = http://server/path/to/repo\n"
+msgstr ""
+
+#, python-format
+msgid "%s returned an error: %s"
+msgstr ""
+
+#, python-format
+msgid "hgcia: sending update to %s\n"
+msgstr ""
+
+msgid "email.from must be defined when sending by email"
+msgstr ""
+
+msgid "browse the repository in a graphical way"
+msgstr ""
+
+msgid ""
+"The hgk extension allows browsing the history of a repository in a\n"
+"graphical way. It requires Tcl/Tk version 8.4 or later. (Tcl/Tk is not\n"
+"distributed with Mercurial.)"
+msgstr ""
+
+msgid ""
+"hgk consists of two parts: a Tcl script that does the displaying and\n"
+"querying of information, and an extension to Mercurial named hgk.py,\n"
+"which provides hooks for hgk to get information. hgk can be found in\n"
+"the contrib directory, and the extension is shipped in the hgext\n"
+"repository, and needs to be enabled."
+msgstr ""
+
+msgid ""
+"The :hg:`view` command will launch the hgk Tcl script. For this command\n"
+"to work, hgk must be in your search path. Alternately, you can specify\n"
+"the path to hgk in your configuration file::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" path=/location/of/hgk"
+msgstr ""
+
+msgid ""
+"hgk can make use of the extdiff extension to visualize revisions.\n"
+"Assuming you had already configured extdiff vdiff command, just add::"
+msgstr ""
+
+msgid ""
+" [hgk]\n"
+" vdiff=vdiff"
+msgstr ""
+
+msgid ""
+"Revisions context menu will now display additional entries to fire\n"
+"vdiff on hovered and selected revisions.\n"
+msgstr ""
+
+msgid "diff trees from two commits"
+msgstr ""
+
+msgid "output common ancestor information"
+msgstr ""
+
+msgid "cat a specific revision"
+msgstr ""
+
+msgid "cat-file: type or revision not supplied\n"
+msgstr "cat-file:型態或修定版ä¸æ”¯æ´\n"
+
+msgid "aborting hg cat-file only understands commits\n"
+msgstr ""
+
+msgid "parse given revisions"
+msgstr ""
+
+msgid "print revisions"
+msgstr ""
+
+msgid "print extension options"
+msgstr ""
+
+msgid "start interactive history viewer"
+msgstr ""
+
+msgid "hg view [-l LIMIT] [REVRANGE]"
+msgstr ""
+
+msgid "generate patch"
+msgstr ""
+
+msgid "recursive"
+msgstr ""
+
+msgid "pretty"
+msgstr ""
+
+msgid "stdin"
+msgstr ""
+
+msgid "detect copies"
+msgstr ""
+
+msgid "search"
+msgstr ""
+
+msgid "hg git-diff-tree [OPTION]... NODE1 NODE2 [FILE]..."
+msgstr ""
+
+msgid "hg debug-cat-file [OPTION]... TYPE FILE"
+msgstr ""
+
+msgid "hg debug-config"
+msgstr ""
+
+msgid "hg debug-merge-base REV REV"
+msgstr ""
+
+msgid "ignored"
+msgstr ""
+
+msgid "hg debug-rev-parse REV"
+msgstr ""
+
+msgid "header"
+msgstr ""
+
+msgid "topo-order"
+msgstr ""
+
+msgid "parents"
+msgstr ""
+
+msgid "max-count"
+msgstr ""
+
+msgid "hg debug-rev-list [OPTION]... REV..."
+msgstr ""
+
+msgid "syntax highlighting for hgweb (requires Pygments)"
+msgstr ""
+
+msgid ""
+"It depends on the Pygments syntax highlighting library:\n"
+"http://pygments.org/"
+msgstr ""
+
+msgid "There is a single configuration option::"
+msgstr ""
+
+msgid ""
+" [web]\n"
+" pygments_style = <style>"
+msgstr ""
+
+msgid "The default is 'colorful'.\n"
+msgstr ""
+
+msgid "accelerate status report using Linux's inotify service"
+msgstr ""
+
+msgid "start an inotify server for this repository"
+msgstr ""
+
+msgid "debugging information for inotify extension"
+msgstr ""
+
+msgid ""
+" Prints the list of directories being watched by the inotify server.\n"
+" "
+msgstr ""
+
+msgid "directories being watched:\n"
+msgstr ""
+
+msgid "run server in background"
+msgstr ""
+
+msgid "used internally by daemon mode"
+msgstr ""
+
+msgid "minutes to sit idle before exiting"
+msgstr ""
+
+msgid "name of file to write process ID to"
+msgstr ""
+
+msgid "hg inserve [OPTION]..."
+msgstr ""
+
+msgid "inotify-client: found dead inotify server socket; removing it\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not start inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: could not talk to new inotify server: %s\n"
+msgstr ""
+
+#, python-format
+msgid "inotify-client: failed to contact inotify server: %s\n"
+msgstr ""
+
+msgid "inotify-client: received empty answer from inotify server"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received response from incompatible server version %d)\n"
+msgstr ""
+
+#, python-format
+msgid "(inotify: received '%s' response when expecting '%s')\n"
+msgstr ""
+
+msgid "this system does not seem to support inotify"
+msgstr ""
+
+#, python-format
+msgid "*** the current per-user limit on the number of inotify watches is %s\n"
+msgstr ""
+
+msgid "*** this limit is too low to watch every directory in this repository\n"
+msgstr ""
+
+msgid "*** counting directories: "
+msgstr ""
+
+#, python-format
+msgid "found %d\n"
+msgstr "找到 %d\n"
+
+#, python-format
+msgid "*** to raise the limit from %d to %d (run as root):\n"
+msgstr ""
+
+#, python-format
+msgid "*** echo %d > %s\n"
+msgstr ""
+
+#, python-format
+msgid "cannot watch %s until inotify watch limit is raised"
+msgstr ""
+
+#, python-format
+msgid "inotify service not available: %s"
+msgstr ""
+
+#, python-format
+msgid "watching %r\n"
+msgstr ""
+
+#, python-format
+msgid "watching directories under %r\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: created %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: deleted %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s event: modified %s\n"
+msgstr ""
+
+#, python-format
+msgid "filesystem containing %s was unmounted\n"
+msgstr ""
+
+#, python-format
+msgid "%s readable: %d bytes\n"
+msgstr ""
+
+#, python-format
+msgid "%s below threshold - unhooking\n"
+msgstr ""
+
+#, python-format
+msgid "%s reading %d events\n"
+msgstr ""
+
+#, python-format
+msgid "%s hooking back up with %d bytes readable\n"
+msgstr ""
+
+msgid "finished setup\n"
+msgstr ""
+
+#, python-format
+msgid "status: %r %s -> %s\n"
+msgstr ""
+
+msgid "rescanning due to .hgignore change\n"
+msgstr ""
+
+msgid "cannot start: socket is already bound"
+msgstr ""
+
+msgid ""
+"cannot start: tried linking .hg/inotify.sock to a temporary socket but .hg/"
+"inotify.sock already exists"
+msgstr ""
+
+#, python-format
+msgid "answering query for %r\n"
+msgstr ""
+
+#, python-format
+msgid "received query from incompatible client version %d\n"
+msgstr ""
+
+#, python-format
+msgid "unrecognized query type: %s\n"
+msgstr ""
+
+msgid "expand expressions into changelog and summaries"
+msgstr ""
+
+msgid ""
+"This extension allows the use of a special syntax in summaries, which\n"
+"will be automatically expanded into links or any other arbitrary\n"
+"expression, much like InterWiki does."
+msgstr ""
+
+msgid ""
+"A few example patterns (link to bug tracking, etc.) that may be used\n"
+"in your hgrc::"
+msgstr ""
+
+msgid ""
+" [interhg]\n"
+" issues = s!issue(\\d+)!<a href=\"http://bts/issue\\1\">issue\\1</a>!\n"
+" bugzilla = s!((?:bug|b=|(?=#?\\d{4,}))(?:\\s*#?)(\\d+))!<a..=\\2\">\\1</a>!"
+"i\n"
+" boldify = s!(^|\\s)#(\\d+)\\b! <b>#\\2</b>!\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid pattern for %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "interhg: invalid regexp for %s: %s\n"
+msgstr ""
+
+msgid "expand keywords in tracked files"
+msgstr ""
+
+msgid ""
+"This extension expands RCS/CVS-like or self-customized $Keywords$ in\n"
+"tracked text files selected by your configuration."
+msgstr ""
+
+msgid ""
+"Keywords are only expanded in local repositories and not stored in the\n"
+"change history. The mechanism can be regarded as a convenience for the\n"
+"current user or for archive distribution."
+msgstr ""
+
+msgid ""
+"Keywords expand to the changeset data pertaining to the latest change\n"
+"relative to the working directory parent of each file."
+msgstr ""
+
+msgid ""
+"Configuration is done in the [keyword], [keywordset] and [keywordmaps]\n"
+"sections of hgrc files."
+msgstr ""
+
+msgid "Example::"
+msgstr ""
+
+msgid ""
+" [keyword]\n"
+" # expand keywords in every python file except those matching \"x*\"\n"
+" **.py =\n"
+" x* = ignore"
+msgstr ""
+
+msgid ""
+" [keywordset]\n"
+" # prefer svn- over cvs-like default keywordmaps\n"
+" svn = True"
+msgstr ""
+
+msgid ""
+".. note::\n"
+" The more specific you are in your filename patterns the less you\n"
+" lose speed in huge repositories."
+msgstr ""
+
+msgid ""
+"For [keywordmaps] template mapping and expansion demonstration and\n"
+"control run :hg:`kwdemo`. See :hg:`help templates` for a list of\n"
+"available templates and filters."
+msgstr ""
+
+msgid "Three additional date template filters are provided::"
+msgstr ""
+
+msgid ""
+" utcdate \"2006/09/18 15:13:13\"\n"
+" svnutcdate \"2006-09-18 15:13:13Z\"\n"
+" svnisodate \"2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)\""
+msgstr ""
+
+msgid ""
+"The default template mappings (view with :hg:`kwdemo -d`) can be\n"
+"replaced with customized keywords and templates. Again, run\n"
+":hg:`kwdemo` to control the results of your config changes."
+msgstr ""
+
+msgid ""
+"Before changing/disabling active keywords, run :hg:`kwshrink` to avoid\n"
+"the risk of inadvertently storing expanded keywords in the change\n"
+"history."
+msgstr ""
+
+msgid ""
+"To force expansion after enabling it, or a configuration change, run\n"
+":hg:`kwexpand`."
+msgstr ""
+
+msgid ""
+"Expansions spanning more than one line and incremental expansions,\n"
+"like CVS' $Log$, are not supported. A keyword template map \"Log =\n"
+"{desc}\" expands to the first line of the changeset description.\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s expanding keywords\n"
+msgstr ""
+
+#, python-format
+msgid "overwriting %s shrinking keywords\n"
+msgstr ""
+
+msgid "[keyword] patterns cannot match"
+msgstr ""
+
+msgid "no [keyword] patterns configured"
+msgstr ""
+
+msgid "print [keywordmaps] configuration and an expansion example"
+msgstr ""
+
+msgid ""
+" Show current, custom, or default keyword template maps and their\n"
+" expansions."
+msgstr ""
+
+msgid ""
+" Extend the current configuration by specifying maps as arguments\n"
+" and using -f/--rcfile to source an external hgrc file."
+msgstr ""
+
+msgid " Use -d/--default to disable current configuration."
+msgstr ""
+
+msgid ""
+" See :hg:`help templates` for information on templates and filters.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "creating temporary repository at %s\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using custom keyword template maps\n"
+msgstr ""
+
+msgid "\textending current template maps\n"
+msgstr ""
+
+msgid "\toverriding default template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using default keyword template maps\n"
+msgstr ""
+
+msgid "\tdisabling current template maps\n"
+msgstr ""
+
+msgid ""
+"\n"
+"\tconfiguration using current keyword template maps\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"keywords written to %s:\n"
+msgstr ""
+
+msgid "hg keyword configuration and expansion example"
+msgstr ""
+
+msgid ""
+"\n"
+"\tkeywords expanded\n"
+msgstr ""
+
+msgid "expand keywords in the working directory"
+msgstr ""
+
+msgid " Run after (re)enabling keyword expansion."
+msgstr ""
+
+msgid ""
+" kwexpand refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show files configured for keyword expansion"
+msgstr ""
+
+msgid ""
+" List which files in the working directory are matched by the\n"
+" [keyword] configuration patterns."
+msgstr ""
+
+msgid ""
+" Useful to prevent inadvertent keyword expansion and to speed up\n"
+" execution by including only files that are actual candidates for\n"
+" expansion."
+msgstr ""
+
+msgid ""
+" See :hg:`help keyword` on how to construct patterns both for\n"
+" inclusion and exclusion of files."
+msgstr ""
+
+msgid ""
+" With -A/--all and -v/--verbose the codes used to show the status\n"
+" of files are::"
+msgstr ""
+
+msgid ""
+" K = keyword expansion candidate\n"
+" k = keyword expansion candidate (not tracked)\n"
+" I = ignored\n"
+" i = ignored (not tracked)\n"
+" "
+msgstr ""
+
+msgid "revert expanded keywords in the working directory"
+msgstr ""
+
+msgid ""
+" Run before changing/disabling active keywords or if you experience\n"
+" problems with :hg:`import` or :hg:`merge`."
+msgstr ""
+
+msgid ""
+" kwshrink refuses to run if given files contain local changes.\n"
+" "
+msgstr ""
+
+msgid "show default keyword template maps"
+msgstr ""
+
+msgid "read maps from rcfile"
+msgstr ""
+
+msgid "hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]..."
+msgstr ""
+
+msgid "hg kwexpand [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "show keyword status flags of all files"
+msgstr ""
+
+msgid "show files excluded from expansion"
+msgstr ""
+
+msgid "only show unknown (not tracked) files"
+msgstr ""
+
+msgid "hg kwfiles [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg kwshrink [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "manage a stack of patches"
+msgstr ""
+
+msgid ""
+"This extension lets you work with a stack of patches in a Mercurial\n"
+"repository. It manages two stacks of patches - all known patches, and\n"
+"applied patches (subset of known patches)."
+msgstr ""
+
+msgid ""
+"Known patches are represented as patch files in the .hg/patches\n"
+"directory. Applied patches are both patch files and changesets."
+msgstr ""
+
+msgid "Common tasks (use :hg:`help command` for more details)::"
+msgstr ""
+
+msgid ""
+" create new patch qnew\n"
+" import existing patch qimport"
+msgstr ""
+
+msgid ""
+" print patch series qseries\n"
+" print applied patches qapplied"
+msgstr ""
+
+msgid ""
+" add known patch to applied stack qpush\n"
+" remove patch from applied stack qpop\n"
+" refresh contents of top applied patch qrefresh"
+msgstr ""
+
+msgid ""
+"By default, mq will automatically use git patches when required to\n"
+"avoid losing file mode changes, copy records, binary files or empty\n"
+"files creations or deletions. This behaviour can be configured with::"
+msgstr ""
+
+msgid ""
+" [mq]\n"
+" git = auto/keep/yes/no"
+msgstr ""
+
+msgid ""
+"If set to 'keep', mq will obey the [diff] section configuration while\n"
+"preserving existing git patches upon qrefresh. If set to 'yes' or\n"
+"'no', mq will override the [diff] section and always generate git or\n"
+"regular patches, possibly losing data in the second case."
+msgstr ""
+
+msgid ""
+"You will by default be managing a patch queue named \"patches\". You can\n"
+"create other, independent patch queues with the :hg:`qqueue` command.\n"
+msgstr ""
+
+#, python-format
+msgid "mq.git option can be auto/keep/yes/no got %s"
+msgstr ""
+
+#, python-format
+msgid "%s appears more than once in %s"
+msgstr ""
+
+msgid "guard cannot be an empty string"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid character: %r"
+msgstr ""
+
+#, python-format
+msgid "invalid character in guard %r: %r"
+msgstr ""
+
+#, python-format
+msgid "guard %r too short"
+msgstr ""
+
+#, python-format
+msgid "guard %r starts with invalid char"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no guards in effect\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - no matching negative guards\n"
+msgstr ""
+
+#, python-format
+msgid "allowing %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - guarded by %r\n"
+msgstr ""
+
+#, python-format
+msgid "skipping %s - no matching guards\n"
+msgstr ""
+
+#, python-format
+msgid "error removing undo: %s\n"
+msgstr ""
+
+#, python-format
+msgid "apply failed for patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch didn't work out, merging %s\n"
+msgstr ""
+
+#, python-format
+msgid "update returned %d"
+msgstr ""
+
+msgid "repo commit failed"
+msgstr ""
+
+#, python-format
+msgid "unable to read %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied\n"
+msgstr ""
+
+msgid "patch failed, unable to continue (try -v)\n"
+msgstr ""
+
+#, python-format
+msgid "applying %s\n"
+msgstr "正在套用 %s\n"
+
+#, python-format
+msgid "unable to read %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is empty\n"
+msgstr ""
+
+#, fuzzy
+msgid "repository commit failed"
+msgstr "找ä¸åˆ° %s 儲存庫"
+
+msgid "patch failed, rejects left in working dir\n"
+msgstr ""
+
+msgid "fuzz found when applying patch, stopping\n"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not managed"
+msgstr ""
+
+#, python-format
+msgid "cannot delete revision %d above applied patches"
+msgstr ""
+
+#, python-format
+msgid "patch %s finalized without changeset message\n"
+msgstr ""
+
+msgid "qdelete requires at least one revision or patch name"
+msgstr ""
+
+#, python-format
+msgid "cannot delete applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series file"
+msgstr ""
+
+msgid "no patches applied"
+msgstr ""
+
+msgid "working directory revision is not qtip"
+msgstr ""
+
+msgid "local changes found, refresh first"
+msgstr ""
+
+msgid "local changes found"
+msgstr ""
+
+#, python-format
+msgid "\"%s\" cannot be used as the name of a patch"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "\"%s\" already exists as a directory"
+msgstr "佇列 %s 已存在"
+
+#, python-format
+msgid "patch \"%s\" already exists"
+msgstr ""
+
+msgid "cannot manage merge changesets"
+msgstr ""
+
+#, fuzzy, python-format
+msgid "cannot write patch \"%s\": %s"
+msgstr "有缺陷的patch %s %s"
+
+#, python-format
+msgid "error unlinking %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch name \"%s\" is ambiguous:\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s not in series"
+msgstr ""
+
+msgid "(working directory not at a head)\n"
+msgstr ""
+
+msgid "no patches in series\n"
+msgstr ""
+
+#, python-format
+msgid "cannot push to a previous patch: %s"
+msgstr ""
+
+#, python-format
+msgid "qpush: %s is already at the top\n"
+msgstr ""
+
+#, python-format
+msgid "guarded by %r"
+msgstr ""
+
+msgid "no matching guards"
+msgstr ""
+
+#, python-format
+msgid "cannot push '%s' - %s\n"
+msgstr ""
+
+msgid "all patches are currently applied\n"
+msgstr ""
+
+msgid "patch series already fully applied\n"
+msgstr ""
+
+msgid "please specify the patch to move"
+msgstr ""
+
+msgid "cleaning up working directory..."
+msgstr "正在清ç†å·¥ä½œç›®éŒ„..."
+
+#, python-format
+msgid "errors during apply, please fix and refresh %s\n"
+msgstr ""
+
+#, python-format
+msgid "now at: %s\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not applied"
+msgstr ""
+
+msgid "no patches applied\n"
+msgstr ""
+
+#, python-format
+msgid "qpop: %s is already at the top\n"
+msgstr ""
+
+msgid "qpop: forcing dirstate update\n"
+msgstr ""
+
+#, python-format
+msgid "trying to pop unknown node %s"
+msgstr ""
+
+msgid "popping would remove a revision not managed by this patch queue"
+msgstr ""
+
+msgid "deletions found between repo revs"
+msgstr ""
+
+#, python-format
+msgid "popping %s\n"
+msgstr ""
+
+msgid "patch queue now empty\n"
+msgstr ""
+
+msgid "cannot refresh a revision with children"
+msgstr ""
+
+msgid ""
+"refresh interrupted while patch was popped! (revert --all, qpush to "
+"recover)\n"
+msgstr ""
+
+msgid "patch queue directory already exists"
+msgstr ""
+
+#, python-format
+msgid "patch %s is not in series file"
+msgstr ""
+
+msgid "No saved patch data found\n"
+msgstr ""
+
+#, python-format
+msgid "restoring status: %s\n"
+msgstr ""
+
+msgid "save entry has children, leaving it alone\n"
+msgstr ""
+
+#, python-format
+msgid "removing save entry %s\n"
+msgstr ""
+
+#, python-format
+msgid "saved queue repository parents: %s %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "updating queue directory\n"
+msgstr "更新工作目錄中\n"
+
+msgid "Unable to load queue repository\n"
+msgstr ""
+
+msgid "save: no patches applied, exiting\n"
+msgstr ""
+
+msgid "status is already saved\n"
+msgstr ""
+
+msgid "hg patches saved state"
+msgstr ""
+
+msgid "repo commit failed\n"
+msgstr ""
+
+#, python-format
+msgid "patch %s is already in the series file"
+msgstr ""
+
+msgid "option \"-r\" not valid when importing files"
+msgstr ""
+
+msgid "option \"-n\" not valid when importing multiple patches"
+msgstr ""
+
+#, python-format
+msgid "revision %d is the root of more than one branch"
+msgstr ""
+
+#, python-format
+msgid "revision %d is already managed"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of the queue"
+msgstr ""
+
+#, python-format
+msgid "revision %d has unmanaged children"
+msgstr ""
+
+#, python-format
+msgid "cannot import merge revision %d"
+msgstr ""
+
+#, python-format
+msgid "revision %d is not the parent of %d"
+msgstr ""
+
+msgid "-e is incompatible with import from -"
+msgstr ""
+
+#, python-format
+msgid "patch %s does not exist"
+msgstr ""
+
+#, python-format
+msgid "renaming %s to %s\n"
+msgstr "%s 改åå­—æˆ %s\n"
+
+msgid "need --name to import a patch from -"
+msgstr ""
+
+#, python-format
+msgid "unable to read file %s"
+msgstr "ä¸èƒ½è®€æª”案 %s"
+
+#, python-format
+msgid "adding %s to series file\n"
+msgstr ""
+
+msgid "remove patches from queue"
+msgstr ""
+
+msgid ""
+" The patches must not be applied, and at least one patch is required. "
+"With\n"
+" -k/--keep, the patch files are preserved in the patch directory."
+msgstr ""
+
+msgid ""
+" To stop managing a patch and move it into permanent history,\n"
+" use the :hg:`qfinish` command."
+msgstr ""
+
+msgid "print the patches already applied"
+msgstr ""
+
+msgid " Returns 0 on success."
+msgstr ""
+
+msgid "only one patch applied\n"
+msgstr ""
+
+msgid "print the patches not yet applied"
+msgstr ""
+
+msgid "all patches applied\n"
+msgstr ""
+
+msgid "import a patch"
+msgstr ""
+
+msgid ""
+" The patch is inserted into the series after the last applied\n"
+" patch. If no patches have been applied, qimport prepends the patch\n"
+" to the series."
+msgstr ""
+
+msgid ""
+" The patch will have the same name as its source file unless you\n"
+" give it a new one with -n/--name."
+msgstr ""
+
+msgid ""
+" You can register an existing patch inside the patch directory with\n"
+" the -e/--existing flag."
+msgstr ""
+
+msgid ""
+" With -f/--force, an existing patch of the same name will be\n"
+" overwritten."
+msgstr ""
+
+msgid ""
+" An existing changeset may be placed under mq control with -r/--rev\n"
+" (e.g. qimport --rev tip -n patch will place tip under mq control).\n"
+" With -g/--git, patches imported with --rev will use the git diff\n"
+" format. See the diffs help topic for information on why this is\n"
+" important for preserving rename/copy information and permission\n"
+" changes."
+msgstr ""
+
+msgid ""
+" To import a patch from standard input, pass - as the patch file.\n"
+" When importing from standard input, a patch name must be specified\n"
+" using the --name flag."
+msgstr ""
+
+msgid " To import an existing patch while renaming it::"
+msgstr ""
+
+msgid " hg qimport -e existing-patch -n new-name"
+msgstr ""
+
+msgid ""
+" Returns 0 if import succeeded.\n"
+" "
+msgstr ""
+
+msgid "init a new queue repository (DEPRECATED)"
+msgstr ""
+
+msgid ""
+" The queue repository is unversioned by default. If\n"
+" -c/--create-repo is specified, qinit will create a separate nested\n"
+" repository for patches (qinit -c may also be run later to convert\n"
+" an unversioned patch repository into a versioned one). You can use\n"
+" qcommit to commit changes to this queue repository."
+msgstr ""
+
+msgid ""
+" This command is deprecated. Without -c, it's implied by other relevant\n"
+" commands. With -c, use :hg:`init --mq` instead."
+msgstr ""
+
+msgid "clone main and patch repository at same time"
+msgstr ""
+
+msgid ""
+" If source is local, destination will have no patches applied. If\n"
+" source is remote, this command can not check if patches are\n"
+" applied in source, so cannot guarantee that patches are not\n"
+" applied in destination. If you clone remote repository, be sure\n"
+" before that it has no patches applied."
+msgstr ""
+
+msgid ""
+" Source patch repository is looked for in <src>/.hg/patches by\n"
+" default. Use -p <url> to change."
+msgstr ""
+
+msgid ""
+" The patch directory must be a nested Mercurial repository, as\n"
+" would be created by :hg:`init --mq`."
+msgstr ""
+
+msgid ""
+" Return 0 on success.\n"
+" "
+msgstr ""
+
+msgid "versioned patch repository not found (see init --mq)"
+msgstr ""
+
+msgid "cloning main repository\n"
+msgstr ""
+
+msgid "cloning patch repository\n"
+msgstr ""
+
+msgid "stripping applied patches from destination repository\n"
+msgstr ""
+
+msgid "updating destination repository\n"
+msgstr ""
+
+msgid "commit changes in the queue repository (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated; use :hg:`commit --mq` instead."
+msgstr ""
+
+msgid "print the entire series file"
+msgstr ""
+
+msgid "print the name of the current patch"
+msgstr ""
+
+msgid "print the name of the next patch"
+msgstr ""
+
+msgid "print the name of the previous patch"
+msgstr ""
+
+msgid "create a new patch"
+msgstr ""
+
+msgid ""
+" qnew creates a new patch on top of the currently-applied patch (if\n"
+" any). The patch will be initialized with any outstanding changes\n"
+" in the working directory. You may also use -I/--include,\n"
+" -X/--exclude, and/or a list of files after the patch name to add\n"
+" only changes to matching files to the new patch, leaving the rest\n"
+" as uncommitted modifications."
+msgstr ""
+
+msgid ""
+" -u/--user and -d/--date can be used to set the (given) user and\n"
+" date, respectively. -U/--currentuser and -D/--currentdate set user\n"
+" to current user and date to current date."
+msgstr ""
+
+msgid ""
+" -e/--edit, -m/--message or -l/--logfile set the patch header as\n"
+" well as the commit message. If none is specified, the header is\n"
+" empty and the commit message is '[mq]: PATCH'."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to keep the patch in the git extended diff\n"
+" format. Read the diffs help topic for more information on why this\n"
+" is important for preserving permission changes and copy/rename\n"
+" information."
+msgstr ""
+
+msgid ""
+" Returns 0 on successful creation of a new patch.\n"
+" "
+msgstr ""
+
+msgid "update the current patch"
+msgstr ""
+
+msgid ""
+" If any file patterns are provided, the refreshed patch will\n"
+" contain only the modifications that match those patterns; the\n"
+" remaining modifications will remain in the working directory."
+msgstr ""
+
+msgid ""
+" If -s/--short is specified, files currently included in the patch\n"
+" will be refreshed just like matched files and remain in the patch."
+msgstr ""
+
+msgid ""
+" If -e/--edit is specified, Mercurial will start your configured editor "
+"for\n"
+" you to enter a message. In case qrefresh fails, you will find a backup "
+"of\n"
+" your message in ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" hg add/remove/copy/rename work as usual, though you might want to\n"
+" use git-style patches (-g/--git or [diff] git=1) to track copies\n"
+" and renames. See the diffs help topic for more information on the\n"
+" git diff format."
+msgstr ""
+
+msgid "option \"-e\" incompatible with \"-m\" or \"-l\""
+msgstr ""
+
+msgid "diff of the current patch and subsequent modifications"
+msgstr ""
+
+msgid ""
+" Shows a diff which includes the current patch as well as any\n"
+" changes which have been made in the working directory since the\n"
+" last refresh (thus showing what the current patch would become\n"
+" after a qrefresh)."
+msgstr ""
+
+msgid ""
+" Use :hg:`diff` if you only want to see the changes made since the\n"
+" last qrefresh, or :hg:`export qtip` if you want to see changes\n"
+" made by the current patch without including changes made since the\n"
+" qrefresh."
+msgstr ""
+
+msgid "fold the named patches into the current patch"
+msgstr ""
+
+msgid ""
+" Patches must not yet be applied. Each patch will be successively\n"
+" applied to the current patch in the order given. If all the\n"
+" patches apply successfully, the current patch will be refreshed\n"
+" with the new cumulative patch, and the folded patches will be\n"
+" deleted. With -k/--keep, the folded patch files will not be\n"
+" removed afterwards."
+msgstr ""
+
+msgid ""
+" The header for each folded patch will be concatenated with the\n"
+" current patch header, separated by a line of ``* * *``."
+msgstr ""
+
+msgid "qfold requires at least one patch name"
+msgstr ""
+
+#, python-format
+msgid "Skipping already folded patch %s\n"
+msgstr ""
+
+#, python-format
+msgid "qfold cannot fold already applied patch %s"
+msgstr ""
+
+#, python-format
+msgid "error folding patch %s"
+msgstr ""
+
+msgid "push or pop patches until named patch is at top of stack"
+msgstr ""
+
+msgid "set or print guards for a patch"
+msgstr ""
+
+msgid ""
+" Guards control whether a patch can be pushed. A patch with no\n"
+" guards is always pushed. A patch with a positive guard (\"+foo\") is\n"
+" pushed only if the :hg:`qselect` command has activated it. A patch with\n"
+" a negative guard (\"-foo\") is never pushed if the :hg:`qselect` "
+"command\n"
+" has activated it."
+msgstr ""
+
+msgid ""
+" With no arguments, print the currently active guards.\n"
+" With arguments, set guards for the named patch."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" Specifying negative guards now requires '--'."
+msgstr ""
+
+msgid " To set guards on another patch::"
+msgstr ""
+
+msgid " hg qguard other.patch -- +2.6.17 -stable"
+msgstr ""
+
+msgid "cannot mix -l/--list with options or arguments"
+msgstr ""
+
+msgid "no patch to work with"
+msgstr ""
+
+#, python-format
+msgid "no patch named %s"
+msgstr ""
+
+msgid "print the header of the topmost or specified patch"
+msgstr ""
+
+msgid "push the next patch onto the stack"
+msgstr ""
+
+msgid ""
+" When -f/--force is applied, all local changes in patched files\n"
+" will be lost."
+msgstr ""
+
+msgid ""
+" Return 0 on succces.\n"
+" "
+msgstr ""
+
+msgid "no saved queues found, please use -n\n"
+msgstr ""
+
+#, python-format
+msgid "merging with queue at: %s\n"
+msgstr ""
+
+msgid "pop the current patch off the stack"
+msgstr ""
+
+msgid ""
+" By default, pops off the top of the patch stack. If given a patch\n"
+" name, keeps popping off patches until the named patch is at the\n"
+" top of the stack."
+msgstr ""
+
+#, python-format
+msgid "using patch queue: %s\n"
+msgstr ""
+
+msgid "rename a patch"
+msgstr ""
+
+msgid ""
+" With one argument, renames the current patch to PATCH1.\n"
+" With two arguments, renames PATCH1 to PATCH2."
+msgstr ""
+
+#, python-format
+msgid "%s already exists"
+msgstr ""
+
+#, python-format
+msgid "A patch named %s already exists in the series file"
+msgstr ""
+
+msgid "restore the queue state saved by a revision (DEPRECATED)"
+msgstr ""
+
+msgid " This command is deprecated, use :hg:`rebase` instead."
+msgstr ""
+
+msgid "save current queue state (DEPRECATED)"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists and is not a directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s exists, use -f to force"
+msgstr ""
+
+#, python-format
+msgid "copy %s to %s\n"
+msgstr ""
+
+msgid "strip changesets and all their descendants from the repository"
+msgstr ""
+
+msgid ""
+" The strip command removes the specified changesets and all their\n"
+" descendants. If the working directory has uncommitted changes,\n"
+" the operation is aborted unless the --force flag is supplied."
+msgstr ""
+
+msgid ""
+" If a parent of the working directory is stripped, then the working\n"
+" directory will automatically be updated to the most recent\n"
+" available ancestor of the stripped parent after the operation\n"
+" completes."
+msgstr ""
+
+msgid ""
+" Any stripped changesets are stored in ``.hg/strip-backup`` as a\n"
+" bundle (see :hg:`help bundle` and :hg:`help unbundle`). They can\n"
+" be restored by running :hg:`unbundle .hg/strip-backup/BUNDLE`,\n"
+" where BUNDLE is the bundle file created by the strip. Note that\n"
+" the local revision numbers will in general be different after the\n"
+" restore."
+msgstr ""
+
+msgid ""
+" Use the --no-backup option to discard the backup bundle once the\n"
+" operation completes."
+msgstr ""
+
+msgid "empty revision set"
+msgstr ""
+
+msgid "set or print guarded patches to push"
+msgstr ""
+
+msgid ""
+" Use the :hg:`qguard` command to set or print guards on patch, then use\n"
+" qselect to tell mq which guards to use. A patch will be pushed if\n"
+" it has no guards or any positive guards match the currently\n"
+" selected guard, but will not be pushed if any negative guards\n"
+" match the current guard. For example::"
+msgstr ""
+
+msgid ""
+" qguard foo.patch -stable (negative guard)\n"
+" qguard bar.patch +stable (positive guard)\n"
+" qselect stable"
+msgstr ""
+
+msgid ""
+" This activates the \"stable\" guard. mq will skip foo.patch (because\n"
+" it has a negative match) but push bar.patch (because it has a\n"
+" positive match)."
+msgstr ""
+
+msgid ""
+" With no arguments, prints the currently active guards.\n"
+" With one argument, sets the active guard."
+msgstr ""
+
+msgid ""
+" Use -n/--none to deactivate guards (no other arguments needed).\n"
+" When no guards are active, patches with positive guards are\n"
+" skipped and patches with negative guards are pushed."
+msgstr ""
+
+msgid ""
+" qselect can change the guards on applied patches. It does not pop\n"
+" guarded patches by default. Use --pop to pop back to the last\n"
+" applied patch that is not guarded. Use --reapply (which implies\n"
+" --pop) to push back to the current patch afterwards, but skip\n"
+" guarded patches."
+msgstr ""
+
+msgid ""
+" Use -s/--series to print a list of all guards in the series file\n"
+" (no other arguments needed). Use -v for more information."
+msgstr ""
+
+msgid "guards deactivated\n"
+msgstr ""
+
+#, python-format
+msgid "number of unguarded, unapplied patches has changed from %d to %d\n"
+msgstr ""
+
+#, python-format
+msgid "number of guarded, applied patches has changed from %d to %d\n"
+msgstr ""
+
+msgid "guards in series file:\n"
+msgstr ""
+
+msgid "no guards in series file\n"
+msgstr ""
+
+msgid "active guards:\n"
+msgstr ""
+
+msgid "no active guards\n"
+msgstr ""
+
+msgid "popping guarded patches\n"
+msgstr ""
+
+msgid "reapplying unguarded patches\n"
+msgstr ""
+
+msgid "move applied patches into repository history"
+msgstr ""
+
+msgid ""
+" Finishes the specified revisions (corresponding to applied\n"
+" patches) by moving them out of mq control into regular repository\n"
+" history."
+msgstr ""
+
+msgid ""
+" Accepts a revision range or the -a/--applied option. If --applied\n"
+" is specified, all applied mq revisions are removed from mq\n"
+" control. Otherwise, the given revisions must be at the base of the\n"
+" stack of applied patches."
+msgstr ""
+
+msgid ""
+" This can be especially useful if your changes have been applied to\n"
+" an upstream repository, or if you are about to push your changes\n"
+" to upstream."
+msgstr ""
+
+msgid "no revisions specified"
+msgstr ""
+
+msgid "manage multiple patch queues"
+msgstr ""
+
+msgid ""
+" Supports switching between different patch queues, as well as creating\n"
+" new patch queues and deleting existing ones."
+msgstr ""
+
+msgid ""
+" Omitting a queue name or specifying -l/--list will show you the "
+"registered\n"
+" queues - by default the \"normal\" patches queue is registered. The "
+"currently\n"
+" active queue will be marked with \"(active)\"."
+msgstr ""
+
+msgid ""
+" To create a new queue, use -c/--create. The queue is automatically made\n"
+" active, except in the case where there are applied patches from the\n"
+" currently active queue in the repository. Then the queue will only be\n"
+" created and switching will fail."
+msgstr ""
+
+msgid ""
+" To delete an existing queue, use --delete. You cannot delete the "
+"currently\n"
+" active queue."
+msgstr ""
+
+msgid "patches applied - cannot set new queue active"
+msgstr ""
+
+msgid "cannot delete queue that does not exist"
+msgstr ""
+
+msgid "cannot delete currently active queue"
+msgstr ""
+
+msgid " (active)\n"
+msgstr ""
+
+msgid "invalid queue name, may not contain the characters \":\\/.\""
+msgstr ""
+
+#, python-format
+msgid "queue \"%s\" already exists"
+msgstr "佇列 %s 已存在"
+
+#, python-format
+msgid "can't rename \"%s\" to its current name"
+msgstr ""
+
+#, python-format
+msgid "non-queue directory \"%s\" already exists"
+msgstr ""
+
+msgid "use --create to create a new queue"
+msgstr ""
+
+msgid "cannot commit over an applied mq patch"
+msgstr ""
+
+msgid "source has mq patches applied"
+msgstr ""
+
+#, python-format
+msgid "mq status file refers to unknown node %s\n"
+msgstr ""
+
+#, python-format
+msgid "Tag %s overrides mq patch of the same name\n"
+msgstr ""
+
+msgid "cannot import over an applied patch"
+msgstr ""
+
+msgid "only a local queue repository may be initialized"
+msgstr ""
+
+msgid "there is no Mercurial repository here (.hg not found)"
+msgstr "這邊沒有Mercurial 儲存庫(找ä¸åˆ° .hg)"
+
+msgid "no queue repository"
+msgstr "沒有佇列儲存庫"
+
+#, python-format
+msgid "%d applied"
+msgstr ""
+
+#, python-format
+msgid "%d unapplied"
+msgstr ""
+
+msgid "mq: (empty queue)\n"
+msgstr ""
+
+msgid "operate on patch repository"
+msgstr ""
+
+msgid "print first line of patch header"
+msgstr ""
+
+msgid "show only the last patch"
+msgstr ""
+
+msgid "hg qapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "use pull protocol to copy metadata"
+msgstr ""
+
+msgid "do not update the new working directories"
+msgstr ""
+
+msgid "use uncompressed transfer (fast over LAN)"
+msgstr ""
+
+msgid "REPO"
+msgstr ""
+
+msgid "location of source patch repository"
+msgstr ""
+
+msgid "hg qclone [OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "hg qcommit [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qdiff [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "keep patch file"
+msgstr ""
+
+msgid "stop managing a revision (DEPRECATED)"
+msgstr ""
+
+msgid "hg qdelete [-k] [PATCH]..."
+msgstr ""
+
+msgid "edit patch header"
+msgstr ""
+
+msgid "keep folded patch files"
+msgstr ""
+
+msgid "hg qfold [-e] [-k] [-m TEXT] [-l FILE] PATCH..."
+msgstr ""
+
+msgid "overwrite any local changes"
+msgstr ""
+
+msgid "hg qgoto [OPTION]... PATCH"
+msgstr ""
+
+msgid "list all patches and guards"
+msgstr ""
+
+msgid "drop all guards"
+msgstr ""
+
+msgid "hg qguard [-l] [-n] [PATCH] [-- [+GUARD]... [-GUARD]...]"
+msgstr ""
+
+msgid "hg qheader [PATCH]"
+msgstr ""
+
+msgid "import file in patch directory"
+msgstr ""
+
+msgid "name of patch file"
+msgstr ""
+
+msgid "overwrite existing files"
+msgstr ""
+
+msgid "place existing revisions under mq control"
+msgstr ""
+
+msgid "use git extended diff format"
+msgstr ""
+
+msgid "qpush after importing"
+msgstr ""
+
+msgid "hg qimport [-e] [-n NAME] [-f] [-g] [-P] [-r REV]... FILE..."
+msgstr ""
+
+msgid "create queue repository"
+msgstr ""
+
+msgid "hg qinit [-c]"
+msgstr ""
+
+msgid "import uncommitted changes (DEPRECATED)"
+msgstr ""
+
+msgid "add \"From: <current user>\" to patch"
+msgstr ""
+
+msgid "USER"
+msgstr ""
+
+msgid "add \"From: <USER>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <current date>\" to patch"
+msgstr ""
+
+msgid "add \"Date: <DATE>\" to patch"
+msgstr ""
+
+msgid "hg qnew [-e] [-m TEXT] [-l FILE] PATCH [FILE]..."
+msgstr ""
+
+msgid "hg qnext [-s]"
+msgstr ""
+
+msgid "hg qprev [-s]"
+msgstr ""
+
+msgid "pop all patches"
+msgstr ""
+
+msgid "queue name to pop (DEPRECATED)"
+msgstr ""
+
+msgid "forget any local changes to patched files"
+msgstr ""
+
+msgid "hg qpop [-a] [-f] [PATCH | INDEX]"
+msgstr ""
+
+msgid "apply on top of local changes"
+msgstr ""
+
+msgid "list patch name in commit text"
+msgstr ""
+
+msgid "apply all patches"
+msgstr ""
+
+msgid "merge from another queue (DEPRECATED)"
+msgstr ""
+
+msgid "merge queue name (DEPRECATED)"
+msgstr ""
+
+msgid "reorder patch series and apply only the patch"
+msgstr ""
+
+msgid "hg qpush [-f] [-l] [-a] [--move] [PATCH | INDEX]"
+msgstr ""
+
+msgid "refresh only files already in the patch and specified files"
+msgstr ""
+
+msgid "add/update author field in patch with current user"
+msgstr ""
+
+msgid "add/update author field in patch with given user"
+msgstr ""
+
+msgid "add/update date field in patch with current date"
+msgstr ""
+
+msgid "add/update date field in patch with given date"
+msgstr ""
+
+msgid "hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]..."
+msgstr ""
+
+msgid "hg qrename PATCH1 [PATCH2]"
+msgstr ""
+
+msgid "delete save entry"
+msgstr ""
+
+msgid "update queue working directory"
+msgstr ""
+
+msgid "hg qrestore [-d] [-u] REV"
+msgstr ""
+
+msgid "copy patch directory"
+msgstr ""
+
+msgid "copy directory name"
+msgstr ""
+
+msgid "clear queue status file"
+msgstr ""
+
+msgid "force copy"
+msgstr ""
+
+msgid "hg qsave [-m TEXT] [-l FILE] [-c] [-n NAME] [-e] [-f]"
+msgstr ""
+
+msgid "disable all guards"
+msgstr ""
+
+msgid "list all guards in series file"
+msgstr ""
+
+msgid "pop to before first guarded applied patch"
+msgstr ""
+
+msgid "pop, then reapply patches"
+msgstr ""
+
+msgid "hg qselect [OPTION]... [GUARD]..."
+msgstr ""
+
+msgid "print patches not in series"
+msgstr ""
+
+msgid "hg qseries [-ms]"
+msgstr ""
+
+msgid ""
+"force removal of changesets even if the working directory has uncommitted "
+"changes"
+msgstr ""
+
+msgid ""
+"bundle only changesets with local revision number greater than REV which are "
+"not descendants of REV (DEPRECATED)"
+msgstr ""
+
+msgid "no backups"
+msgstr ""
+
+msgid "no backups (DEPRECATED)"
+msgstr ""
+
+msgid "do not modify working copy during strip"
+msgstr ""
+
+msgid "hg strip [-k] [-f] [-n] REV..."
+msgstr ""
+
+msgid "hg qtop [-s]"
+msgstr ""
+
+msgid "show only the first patch"
+msgstr ""
+
+msgid "hg qunapplied [-1] [-s] [PATCH]"
+msgstr ""
+
+msgid "finish all applied changesets"
+msgstr ""
+
+msgid "hg qfinish [-a] [REV]..."
+msgstr ""
+
+msgid "list all available queues"
+msgstr ""
+
+msgid "create new queue"
+msgstr ""
+
+msgid "rename active queue"
+msgstr ""
+
+msgid "delete reference to queue"
+msgstr ""
+
+msgid "delete queue, and remove patch dir"
+msgstr ""
+
+msgid "[OPTION] [QUEUE]"
+msgstr ""
+
+msgid "hooks for sending email notifications at commit/push time"
+msgstr ""
+
+msgid ""
+"Subscriptions can be managed through a hgrc file. Default mode is to\n"
+"print messages to stdout, for testing and configuring."
+msgstr ""
+
+msgid ""
+"To use, configure the notify extension and enable it in hgrc like\n"
+"this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" notify ="
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" # one email for each incoming changeset\n"
+" incoming.notify = python:hgext.notify.hook\n"
+" # batch emails when many changesets incoming at one time\n"
+" changegroup.notify = python:hgext.notify.hook"
+msgstr ""
+
+msgid ""
+" [notify]\n"
+" # config items go here"
+msgstr ""
+
+msgid "Required configuration items::"
+msgstr ""
+
+msgid " config = /path/to/file # file containing subscriptions"
+msgstr ""
+
+msgid "Optional configuration items::"
+msgstr ""
+
+msgid ""
+" test = True # print messages to stdout for testing\n"
+" strip = 3 # number of slashes to strip for url paths\n"
+" domain = example.com # domain to use if committer missing domain\n"
+" style = ... # style file to use when formatting email\n"
+" template = ... # template to use when formatting email\n"
+" incoming = ... # template to use when run as incoming hook\n"
+" changegroup = ... # template when run as changegroup hook\n"
+" maxdiff = 300 # max lines of diffs to include (0=none, -1=all)\n"
+" maxsubject = 67 # truncate subject line longer than this\n"
+" diffstat = True # add a diffstat before the diff content\n"
+" sources = serve # notify if source of incoming changes in this "
+"list\n"
+" # (serve == ssh or http, push, pull, bundle)\n"
+" merge = False # send notification for merges (default True)\n"
+" [email]\n"
+" from = user@host.com # email address to send as if none given\n"
+" [web]\n"
+" baseurl = http://hgserver/... # root of hg web site for browsing commits"
+msgstr ""
+
+msgid ""
+"The notify config file has same format as a regular hgrc file. It has\n"
+"two sections so you can express subscriptions in whatever way is\n"
+"handier for you."
+msgstr ""
+
+msgid ""
+" [usersubs]\n"
+" # key is subscriber email, value is \",\"-separated list of glob patterns\n"
+" user@host = pattern"
+msgstr ""
+
+msgid ""
+" [reposubs]\n"
+" # key is glob pattern, value is \",\"-separated list of subscriber emails\n"
+" pattern = user@host"
+msgstr ""
+
+msgid "Glob patterns are matched against path to repository root."
+msgstr ""
+
+msgid ""
+"If you like, you can put notify config file in repository that users\n"
+"can push changes to, they can manage their own subscriptions.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: %d new changesets"
+msgstr ""
+
+#, python-format
+msgid "notify: sending %d subscribers %d changes\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (truncated from %d to %d lines):"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"diffs (%d lines):"
+msgstr ""
+
+#, python-format
+msgid "notify: suppressing notification for merge %d:%s\n"
+msgstr ""
+
+msgid "browse command output with an external pager"
+msgstr ""
+
+msgid "To set the pager that should be used, set the application variable::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" pager = less -FRSX"
+msgstr ""
+
+msgid ""
+"If no pager is set, the pager extensions uses the environment variable\n"
+"$PAGER. If neither pager.pager, nor $PAGER is set, no pager is used."
+msgstr ""
+
+msgid ""
+"If you notice \"BROKEN PIPE\" error messages, you can disable them by\n"
+"setting::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" quiet = True"
+msgstr ""
+
+msgid ""
+"You can disable the pager for certain commands by adding them to the\n"
+"pager.ignore list::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" ignore = version, help, update"
+msgstr ""
+
+msgid ""
+"You can also enable the pager only for certain commands using\n"
+"pager.attend. Below is the default list of commands to be paged::"
+msgstr ""
+
+msgid ""
+" [pager]\n"
+" attend = annotate, cat, diff, export, glog, log, qdiff"
+msgstr ""
+
+msgid ""
+"Setting pager.attend to an empty value will cause all commands to be\n"
+"paged."
+msgstr ""
+
+msgid "If pager.attend is present, pager.ignore will be ignored."
+msgstr ""
+
+msgid ""
+"To ignore global commands like :hg:`version` or :hg:`help`, you have\n"
+"to specify them in your user configuration file."
+msgstr ""
+
+msgid ""
+"The --pager=... option can also be used to control when the pager is\n"
+"used. Use a boolean value like yes, no, on, off, or use auto for\n"
+"normal behavior.\n"
+msgstr ""
+
+msgid "when to paginate (boolean, always, auto, or never)"
+msgstr ""
+
+msgid "interpret suffixes to refer to ancestor revisions"
+msgstr ""
+
+msgid ""
+"This extension allows you to use git-style suffixes to refer to the\n"
+"ancestors of a specific revision."
+msgstr ""
+
+msgid "For example, if you can refer to a revision as \"foo\", then::"
+msgstr ""
+
+msgid ""
+" foo^N = Nth parent of foo\n"
+" foo^0 = foo\n"
+" foo^1 = first parent of foo\n"
+" foo^2 = second parent of foo\n"
+" foo^ = foo^1"
+msgstr ""
+
+msgid ""
+" foo~N = Nth first grandparent of foo\n"
+" foo~0 = foo\n"
+" foo~1 = foo^1 = foo^ = first parent of foo\n"
+" foo~2 = foo^1^1 = foo^^ = first parent of first parent of foo\n"
+msgstr ""
+
+msgid "command to send changesets as (a series of) patch emails"
+msgstr ""
+
+msgid ""
+"The series is started off with a \"[PATCH 0 of N]\" introduction, which\n"
+"describes the series as a whole."
+msgstr ""
+
+msgid ""
+"Each patch email has a Subject line of \"[PATCH M of N] ...\", using the\n"
+"first line of the changeset description as the subject text. The\n"
+"message contains two or three body parts:"
+msgstr ""
+
+msgid ""
+"- The changeset description.\n"
+"- [Optional] The result of running diffstat on the patch.\n"
+"- The patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+"Each message refers to the first in the series using the In-Reply-To\n"
+"and References headers, so they will show up as a sequence in threaded\n"
+"mail and news readers, and in mail archives."
+msgstr ""
+
+msgid ""
+"To configure other defaults, add a section like this to your hgrc\n"
+"file::"
+msgstr ""
+
+msgid ""
+" [email]\n"
+" from = My Name <my@email>\n"
+" to = recipient1, recipient2, ...\n"
+" cc = cc1, cc2, ...\n"
+" bcc = bcc1, bcc2, ...\n"
+" reply-to = address1, address2, ..."
+msgstr ""
+
+msgid ""
+"Use ``[patchbomb]`` as configuration section name if you need to\n"
+"override global ``[email]`` address settings."
+msgstr ""
+
+msgid ""
+"Then you can use the :hg:`email` command to mail a series of\n"
+"changesets as a patchbomb."
+msgstr ""
+
+msgid ""
+"You can also either configure the method option in the email section\n"
+"to be a sendmail compatible mailer or fill out the [smtp] section so\n"
+"that the patchbomb extension can automatically send patchbombs\n"
+"directly from the commandline. See the [email] and [smtp] sections in\n"
+"hgrc(5) for details.\n"
+msgstr ""
+
+#, python-format
+msgid "%s Please enter a valid value"
+msgstr ""
+
+msgid "Please enter a valid value.\n"
+msgstr ""
+
+msgid "send changesets by email"
+msgstr ""
+
+msgid ""
+" By default, diffs are sent in the format generated by\n"
+" :hg:`export`, one per message. The series starts with a \"[PATCH 0\n"
+" of N]\" introduction, which describes the series as a whole."
+msgstr ""
+
+msgid ""
+" Each patch email has a Subject line of \"[PATCH M of N] ...\", using\n"
+" the first line of the changeset description as the subject text.\n"
+" The message contains two or three parts. First, the changeset\n"
+" description."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat option, if the diffstat program is\n"
+" installed, the result of running diffstat on the patch is inserted."
+msgstr ""
+
+msgid " Finally, the patch itself, as generated by :hg:`export`."
+msgstr ""
+
+msgid ""
+" With the -d/--diffstat or -c/--confirm options, you will be presented\n"
+" with a final summary of all messages and asked for confirmation before\n"
+" the messages are sent."
+msgstr ""
+
+msgid ""
+" By default the patch is included as text in the email body for\n"
+" easy reviewing. Using the -a/--attach option will instead create\n"
+" an attachment for the patch. With -i/--inline an inline attachment\n"
+" will be created."
+msgstr ""
+
+msgid ""
+" With -o/--outgoing, emails will be generated for patches not found\n"
+" in the destination repository (or only those which are ancestors\n"
+" of the specified revisions if any are provided)"
+msgstr ""
+
+msgid ""
+" With -b/--bundle, changesets are selected as for --outgoing, but a\n"
+" single email containing a binary Mercurial bundle as an attachment\n"
+" will be sent."
+msgstr ""
+
+msgid ""
+" With -m/--mbox, instead of previewing each patchbomb message in a\n"
+" pager or sending the messages directly, it will create a UNIX\n"
+" mailbox file with the patch emails. This mailbox file can be\n"
+" previewed with any mail user agent which supports UNIX mbox\n"
+" files."
+msgstr ""
+
+msgid ""
+" With -n/--test, all steps will run, but mail will not be sent.\n"
+" You will be prompted for an email recipient address, a subject and\n"
+" an introductory message describing the patches of your patchbomb.\n"
+" Then when all is done, patchbomb messages are displayed. If the\n"
+" PAGER environment variable is set, your pager will be fired up once\n"
+" for each patchbomb message, so you can verify everything is alright."
+msgstr ""
+
+msgid ""
+" hg email -r 3000 # send patch 3000 only\n"
+" hg email -r 3000 -r 3001 # send patches 3000 and 3001\n"
+" hg email -r 3000:3005 # send patches 3000 through 3005\n"
+" hg email 3000 # send patch 3000 (deprecated)"
+msgstr ""
+
+msgid ""
+" hg email -o # send all patches not in default\n"
+" hg email -o DEST # send all patches not in DEST\n"
+" hg email -o -r 3000 # send all ancestors of 3000 not in default\n"
+" hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -b # send bundle of all patches not in default\n"
+" hg email -b DEST # send bundle of all patches not in DEST\n"
+" hg email -b -r 3000 # bundle of all ancestors of 3000 not in "
+"default\n"
+" hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST"
+msgstr ""
+
+msgid ""
+" hg email -o -m mbox && # generate an mbox file...\n"
+" mutt -R -f mbox # ... and view it with mutt\n"
+" hg email -o -m mbox && # generate an mbox file ...\n"
+" formail -s sendmail \\ # ... and use formail to send from the "
+"mbox\n"
+" -bm -t < mbox # ... using sendmail"
+msgstr ""
+
+msgid ""
+" Before using this command, you will need to enable email in your\n"
+" hgrc. See the [email] section in hgrc(5) for details.\n"
+" "
+msgstr ""
+
+msgid "no changes found\n"
+msgstr "找ä¸åˆ°è®Šæ›´\n"
+
+msgid "specify at least one changeset with -r or -o"
+msgstr ""
+
+msgid "--outgoing mode always on with --bundle; do not re-specify --outgoing"
+msgstr ""
+
+msgid "too many destinations"
+msgstr ""
+
+msgid "use only one form to specify the revision"
+msgstr ""
+
+msgid ""
+"\n"
+"Write the introductory message for the patch series."
+msgstr ""
+
+#, python-format
+msgid "This patch series consists of %d patches."
+msgstr "這一系列的patch 包å«äº† %d 個patch"
+
+msgid ""
+"\n"
+"Final summary:"
+msgstr ""
+
+msgid "are you sure you want to send (yn)?"
+msgstr ""
+
+msgid "&No"
+msgstr ""
+
+msgid "&Yes"
+msgstr ""
+
+msgid "patchbomb canceled"
+msgstr ""
+
+msgid "Displaying "
+msgstr "顯示中"
+
+msgid "Writing "
+msgstr "寫入中"
+
+msgid "writing"
+msgstr "寫入中"
+
+msgid "Sending "
+msgstr "傳é€ä¸­"
+
+msgid "sending"
+msgstr "傳é€ä¸­"
+
+msgid "send patches as attachments"
+msgstr ""
+
+msgid "send patches as inline attachments"
+msgstr ""
+
+msgid "email addresses of blind carbon copy recipients"
+msgstr ""
+
+msgid "email addresses of copy recipients"
+msgstr ""
+
+msgid "ask for confirmation before sending"
+msgstr ""
+
+msgid "add diffstat output to messages"
+msgstr ""
+
+msgid "use the given date as the sending date"
+msgstr ""
+
+msgid "use the given file as the series description"
+msgstr ""
+
+msgid "email address of sender"
+msgstr ""
+
+msgid "print messages that would be sent"
+msgstr ""
+
+msgid "write messages to mbox file instead of sending them"
+msgstr ""
+
+msgid "email addresses replies should be sent to"
+msgstr ""
+
+msgid "subject of first message (intro or single patch)"
+msgstr ""
+
+msgid "message identifier to reply to"
+msgstr ""
+
+msgid "flags to add in subject prefixes"
+msgstr ""
+
+msgid "email addresses of recipients"
+msgstr ""
+
+msgid "omit hg patch header"
+msgstr ""
+
+msgid "send changes not found in the target repository"
+msgstr ""
+
+msgid "send changes not in target as a binary bundle"
+msgstr ""
+
+msgid "name of the bundle attachment file"
+msgstr ""
+
+msgid "a revision to send"
+msgstr ""
+
+msgid "run even when remote repository is unrelated (with -b/--bundle)"
+msgstr ""
+
+msgid "a base changeset to specify instead of a destination (with -b/--bundle)"
+msgstr ""
+
+msgid "send an introduction email for a single patch"
+msgstr ""
+
+msgid "hg email [OPTION]... [DEST]..."
+msgstr ""
+
+msgid "show progress bars for some actions"
+msgstr ""
+
+msgid ""
+"This extension uses the progress information logged by hg commands\n"
+"to draw progress bars that are as informative as possible. Some progress\n"
+"bars only offer indeterminate information, while others have a definite\n"
+"end point."
+msgstr ""
+
+msgid "The following settings are available::"
+msgstr ""
+
+msgid ""
+" [progress]\n"
+" delay = 3 # number of seconds (float) before showing the progress bar\n"
+" refresh = 0.1 # time in seconds between refreshes of the progress bar\n"
+" format = topic bar number # format of the progress bar\n"
+" width = <none> # if set, the maximum width of the progress information\n"
+" # (that is, min(width, term width) will be used)\n"
+" clear-complete = True # clear the progress bar after it's done\n"
+" disable = False # if true, don't show a progress bar\n"
+" assume-tty = False # if true, ALWAYS show a progress bar, unless\n"
+" # disable is given"
+msgstr ""
+
+msgid ""
+"Valid entries for the format field are topic, bar, number, unit, and\n"
+"item. item defaults to the last 20 characters of the item, but this\n"
+"can be changed by adding either ``-<num>`` which would take the last\n"
+"num characters, or ``+<num>`` for the first num characters.\n"
+msgstr ""
+
+msgid "command to delete untracked files from the working directory"
+msgstr ""
+
+msgid "removes files not tracked by Mercurial"
+msgstr ""
+
+msgid ""
+" Delete files not known to Mercurial. This is useful to test local\n"
+" and uncommitted changes in an otherwise-clean source tree."
+msgstr ""
+
+msgid " This means that purge will delete:"
+msgstr ""
+
+msgid ""
+" - Unknown files: files marked with \"?\" by :hg:`status`\n"
+" - Empty directories: in fact Mercurial ignores directories unless\n"
+" they contain files under source control management"
+msgstr ""
+
+msgid " But it will leave untouched:"
+msgstr ""
+
+msgid ""
+" - Modified and unmodified tracked files\n"
+" - Ignored files (unless --all is specified)\n"
+" - New files added to the repository (with :hg:`add`)"
+msgstr ""
+
+msgid ""
+" If directories are given on the command line, only files in these\n"
+" directories are considered."
+msgstr ""
+
+msgid ""
+" Be careful with purge, as you could irreversibly delete some files\n"
+" you forgot to add to the repository. If you only want to print the\n"
+" list of files that this program would delete, use the --print\n"
+" option.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "%s cannot be removed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing file %s\n"
+msgstr ""
+
+#, python-format
+msgid "Removing directory %s\n"
+msgstr ""
+
+msgid "abort if an error occurs"
+msgstr ""
+
+msgid "purge ignored files too"
+msgstr ""
+
+msgid "print filenames instead of deleting them"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs (implies -p/--print)"
+msgstr ""
+
+msgid "hg purge [OPTION]... [DIR]..."
+msgstr ""
+
+msgid "command to move sets of revisions to a different ancestor"
+msgstr ""
+
+msgid ""
+"This extension lets you rebase changesets in an existing Mercurial\n"
+"repository."
+msgstr ""
+
+msgid ""
+"For more information:\n"
+"http://mercurial.selenic.com/wiki/RebaseExtension\n"
+msgstr ""
+
+msgid "move changeset (and descendants) to a different branch"
+msgstr ""
+
+msgid ""
+" Rebase uses repeated merging to graft changesets from one part of\n"
+" history (the source) onto another (the destination). This can be\n"
+" useful for linearizing *local* changes relative to a master\n"
+" development tree."
+msgstr ""
+
+msgid ""
+" You should not rebase changesets that have already been shared\n"
+" with others. Doing so will force everybody else to perform the\n"
+" same rebase or they will end up with duplicated changesets after\n"
+" pulling in your rebased changesets."
+msgstr ""
+
+msgid ""
+" If you don't specify a destination changeset (``-d/--dest``),\n"
+" rebase uses the tipmost head of the current named branch as the\n"
+" destination. (The destination changeset is not modified by\n"
+" rebasing, but new changesets are added as its descendants.)"
+msgstr ""
+
+msgid ""
+" You can specify which changesets to rebase in two ways: as a\n"
+" \"source\" changeset or as a \"base\" changeset. Both are shorthand\n"
+" for a topologically related set of changesets (the \"source\n"
+" branch\"). If you specify source (``-s/--source``), rebase will\n"
+" rebase that changeset and all of its descendants onto dest. If you\n"
+" specify base (``-b/--base``), rebase will select ancestors of base\n"
+" back to but not including the common ancestor with dest. Thus,\n"
+" ``-b`` is less precise but more convenient than ``-s``: you can\n"
+" specify any changeset in the source branch, and rebase will select\n"
+" the whole branch. If you specify neither ``-s`` nor ``-b``, rebase\n"
+" uses the parent of the working directory as the base."
+msgstr ""
+
+msgid ""
+" By default, rebase recreates the changesets in the source branch\n"
+" as descendants of dest and then destroys the originals. Use\n"
+" ``--keep`` to preserve the original source changesets. Some\n"
+" changesets in the source branch (e.g. merges from the destination\n"
+" branch) may be dropped if they no longer contribute any change."
+msgstr ""
+
+msgid ""
+" One result of the rules for selecting the destination changeset\n"
+" and source branch is that, unlike ``merge``, rebase will do\n"
+" nothing if you are at the latest (tipmost) head of a named branch\n"
+" with two heads. You need to explicitly specify source and/or\n"
+" destination (or ``update`` to the other head, if it's the head of\n"
+" the intended source branch)."
+msgstr ""
+
+msgid ""
+" If a rebase is interrupted to manually resolve a merge, it can be\n"
+" continued with --continue/-c or aborted with --abort/-a."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing to rebase.\n"
+" "
+msgstr ""
+
+msgid "cannot use both abort and continue"
+msgstr ""
+
+msgid "cannot use collapse with continue or abort"
+msgstr ""
+
+msgid "cannot use detach with continue or abort"
+msgstr ""
+
+msgid "abort and continue do not allow specifying revisions"
+msgstr ""
+
+msgid "cannot specify both a revision and a base"
+msgstr ""
+
+msgid "detach requires a revision to be specified"
+msgstr ""
+
+msgid "cannot specify a base with detach"
+msgstr ""
+
+msgid "nothing to rebase\n"
+msgstr ""
+
+msgid "cannot use both keepbranches and extrafn"
+msgstr ""
+
+msgid "rebasing"
+msgstr ""
+
+msgid "changesets"
+msgstr ""
+
+msgid "fix unresolved conflicts with hg resolve then run hg rebase --continue"
+msgstr ""
+
+#, python-format
+msgid "no changes, revision %d skipped\n"
+msgstr ""
+
+msgid "rebase merging completed\n"
+msgstr ""
+
+msgid "warning: new changesets detected on source branch, not stripping\n"
+msgstr ""
+
+msgid "rebase completed\n"
+msgstr ""
+
+#, python-format
+msgid "%d revisions have been skipped\n"
+msgstr ""
+
+msgid "unable to collapse, there is more than one external parent"
+msgstr ""
+
+#, python-format
+msgid "cannot use revision %d as base, result would have 3 parents"
+msgstr ""
+
+msgid "no rebase in progress"
+msgstr ""
+
+msgid "warning: new changesets detected on target branch, can't abort\n"
+msgstr ""
+
+msgid "rebase aborted\n"
+msgstr "rebase 中止了\n"
+
+msgid "cannot rebase onto an applied mq patch"
+msgstr ""
+
+msgid "source is ancestor of destination"
+msgstr ""
+
+msgid "source is descendant of destination"
+msgstr ""
+
+msgid "rebase working directory to branch head"
+msgstr ""
+
+msgid "rebase from the specified changeset"
+msgstr ""
+
+msgid ""
+"rebase from the base of the specified changeset (up to greatest common "
+"ancestor of base and dest)"
+msgstr ""
+
+msgid "rebase onto the specified changeset"
+msgstr ""
+
+msgid "collapse the rebased changesets"
+msgstr ""
+
+msgid "keep original changesets"
+msgstr ""
+
+msgid "keep original branch names"
+msgstr ""
+
+msgid "force detaching of source from its original branch"
+msgstr ""
+
+msgid "continue an interrupted rebase"
+msgstr ""
+
+msgid "abort an interrupted rebase"
+msgstr ""
+
+msgid ""
+"hg rebase [-s REV | -b REV] [-d REV] [options]\n"
+"hg rebase {-a|-c}"
+msgstr ""
+
+msgid "commands to interactively select changes for commit/qrefresh"
+msgstr ""
+
+msgid "this modifies a binary file (all or nothing)\n"
+msgstr ""
+
+msgid "this is a binary file\n"
+msgstr "這是一個二進ä½æª”\n"
+
+#, python-format
+msgid "%d hunks, %d lines changed\n"
+msgstr ""
+
+msgid "[Ynsfdaq?]"
+msgstr ""
+
+msgid "&Yes, record this change"
+msgstr ""
+
+msgid "&No, skip this change"
+msgstr ""
+
+msgid "&Skip remaining changes to this file"
+msgstr ""
+
+msgid "Record remaining changes to this &file"
+msgstr ""
+
+msgid "&Done, skip remaining changes and files"
+msgstr ""
+
+msgid "Record &all changes to all remaining files"
+msgstr ""
+
+msgid "&Quit, recording no changes"
+msgstr ""
+
+msgid "&?"
+msgstr ""
+
+msgid "user quit"
+msgstr ""
+
+#, python-format
+msgid "examine changes to %s?"
+msgstr ""
+
+msgid " and "
+msgstr ""
+
+#, python-format
+msgid "record this change to %r?"
+msgstr ""
+
+#, python-format
+msgid "record change %d/%d to %r?"
+msgstr ""
+
+msgid "interactively select changes to commit"
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be candidates for recording."
+msgstr ""
+
+msgid ""
+" You will be prompted for whether to record changes to each\n"
+" modified file, and for files with multiple changes, for each\n"
+" change to use. For each query, the following responses are\n"
+" possible::"
+msgstr ""
+
+msgid ""
+" y - record this change\n"
+" n - skip this change"
+msgstr ""
+
+msgid ""
+" s - skip remaining changes to this file\n"
+" f - record remaining changes to this file"
+msgstr ""
+
+msgid ""
+" d - done, skip remaining changes and files\n"
+" a - record all changes to all remaining files\n"
+" q - quit, recording no changes"
+msgstr ""
+
+msgid " ? - display help"
+msgstr ""
+
+msgid " This command is not available when committing a merge."
+msgstr ""
+
+msgid "'mq' extension not loaded"
+msgstr ""
+
+msgid "running non-interactively, use commit instead"
+msgstr ""
+
+msgid "cannot partially commit a merge (use hg commit instead)"
+msgstr ""
+
+msgid "no changes to record\n"
+msgstr ""
+
+msgid "hg record [OPTION]... [FILE]..."
+msgstr ""
+
+msgid "hg qrecord [OPTION]... PATCH [FILE]..."
+msgstr ""
+
+msgid "recreates hardlinks between repository clones"
+msgstr ""
+
+msgid "recreate hardlinks between two repositories"
+msgstr ""
+
+msgid ""
+" When repositories are cloned locally, their data files will be\n"
+" hardlinked so that they only use the space of a single repository."
+msgstr ""
+
+msgid ""
+" Unfortunately, subsequent pulls into either repository will break\n"
+" hardlinks for any files touched by the new changesets, even if\n"
+" both repositories end up pulling the same changes."
+msgstr ""
+
+msgid ""
+" Similarly, passing --rev to \"hg clone\" will fail to use any\n"
+" hardlinks, falling back to a complete copy of the source\n"
+" repository."
+msgstr ""
+
+msgid ""
+" This command lets you recreate those hardlinks and reclaim that\n"
+" wasted space."
+msgstr ""
+
+msgid ""
+" This repository will be relinked to share space with ORIGIN, which\n"
+" must be on the same local disk. If ORIGIN is omitted, looks for\n"
+" \"default-relink\", then \"default\", in [paths]."
+msgstr ""
+
+msgid ""
+" Do not attempt any read operations on this repository while the\n"
+" command is running. (Both repositories will be locked against\n"
+" writes.)\n"
+" "
+msgstr ""
+
+msgid "hardlinks are not supported on this system"
+msgstr "硬å¼é€£çµä¸è¢«æ”¯æ´"
+
+#, python-format
+msgid "relinking %s to %s\n"
+msgstr "%s é‡æ–°é€£çµåˆ° %s\n"
+
+#, python-format
+msgid "tip has %d files, estimated total number of files: %s\n"
+msgstr ""
+
+msgid "collecting"
+msgstr ""
+
+msgid "files"
+msgstr "檔案"
+
+#, python-format
+msgid "collected %d candidate storage files\n"
+msgstr ""
+
+msgid "source and destination are on different devices"
+msgstr "來æºè·Ÿç›®çš„在ä¸åŒçš„è£ç½®ä¸Š"
+
+#, python-format
+msgid "not linkable: %s\n"
+msgstr ""
+
+msgid "pruning"
+msgstr ""
+
+#, python-format
+msgid "pruned down to %d probably relinkable files\n"
+msgstr ""
+
+msgid "relinking"
+msgstr ""
+
+#, python-format
+msgid "relinked %d files (%d bytes reclaimed)\n"
+msgstr ""
+
+msgid "[ORIGIN]"
+msgstr ""
+
+msgid "extend schemes with shortcuts to repository swarms"
+msgstr ""
+
+msgid ""
+"This extension allows you to specify shortcuts for parent URLs with a\n"
+"lot of repositories to act like a scheme, for example::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://code.python.org/hg/"
+msgstr ""
+
+msgid "After that you can use it like::"
+msgstr ""
+
+msgid " hg clone py://trunk/"
+msgstr ""
+
+msgid ""
+"Additionally there is support for some more complex schemas, for\n"
+"example used by Google Code::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" gcode = http://{1}.googlecode.com/hg/"
+msgstr ""
+
+msgid ""
+"The syntax is taken from Mercurial templates, and you have unlimited\n"
+"number of variables, starting with ``{1}`` and continuing with\n"
+"``{2}``, ``{3}`` and so on. This variables will receive parts of URL\n"
+"supplied, split by ``/``. Anything not specified as ``{part}`` will be\n"
+"just appended to an URL."
+msgstr ""
+
+msgid "For convenience, the extension adds these schemes by default::"
+msgstr ""
+
+msgid ""
+" [schemes]\n"
+" py = http://hg.python.org/\n"
+" bb = https://bitbucket.org/\n"
+" bb+ssh = ssh://hg@bitbucket.org/\n"
+" gcode = https://{1}.googlecode.com/hg/\n"
+" kiln = https://{1}.kilnhg.com/Repo/"
+msgstr ""
+
+msgid ""
+"You can override a predefined scheme by defining a new scheme with the\n"
+"same name.\n"
+msgstr ""
+
+msgid "share a common history between several working directories"
+msgstr ""
+
+msgid "create a new shared repository"
+msgstr "建立新的共享儲存庫"
+
+msgid ""
+" Initialize a new repository and working directory that shares its\n"
+" history with another repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" using rollback or extensions that destroy/modify history (mq,\n"
+" rebase, etc.) can cause considerable confusion with shared\n"
+" clones. In particular, if two shared clones are both updated to\n"
+" the same changeset, and one of them destroys that changeset\n"
+" with rollback, the other clone will suddenly stop working: all\n"
+" operations will fail with \"abort: working directory has unknown\n"
+" parent\". The only known workaround is to use debugsetparents on\n"
+" the broken clone to reset it to a changeset that still exists\n"
+" (e.g. tip).\n"
+" "
+msgstr ""
+
+msgid "do not create a working copy"
+msgstr ""
+
+msgid "[-U] SOURCE [DEST]"
+msgstr ""
+
+msgid "command to transplant changesets from another branch"
+msgstr ""
+
+msgid "This extension allows you to transplant patches from another branch."
+msgstr ""
+
+msgid ""
+"Transplanted patches are recorded in .hg/transplant/transplants, as a\n"
+"map from a changeset hash to its hash in the source repository.\n"
+msgstr ""
+
+#, python-format
+msgid "skipping already applied revision %s\n"
+msgstr ""
+
+#, python-format
+msgid "skipping merge changeset %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "%s merged at %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted to %s\n"
+msgstr ""
+
+#, python-format
+msgid "filtering %s\n"
+msgstr ""
+
+msgid "filter failed"
+msgstr ""
+
+msgid "can only omit patchfile if merging"
+msgstr ""
+
+#, python-format
+msgid "%s: empty changeset"
+msgstr ""
+
+msgid "fix up the merge and run hg transplant --continue"
+msgstr ""
+
+#, python-format
+msgid "%s transplanted as %s\n"
+msgstr ""
+
+msgid "transplant log file is corrupt"
+msgstr ""
+
+#, python-format
+msgid "working dir not at transplant parent %s"
+msgstr ""
+
+msgid "commit failed"
+msgstr ""
+
+msgid ""
+"y: transplant this changeset\n"
+"n: skip this changeset\n"
+"m: merge at this changeset\n"
+"p: show patch\n"
+"c: commit selected changesets\n"
+"q: cancel transplant\n"
+"?: show this help\n"
+msgstr ""
+
+msgid "apply changeset? [ynmpcq?]:"
+msgstr ""
+
+msgid "no such option\n"
+msgstr ""
+
+msgid "transplant changesets from another branch"
+msgstr ""
+
+msgid ""
+" Selected changesets will be applied on top of the current working\n"
+" directory with the log of the original changeset. If --log is\n"
+" specified, log messages will have a comment appended of the form::"
+msgstr ""
+
+msgid " (transplanted from CHANGESETHASH)"
+msgstr ""
+
+msgid ""
+" You can rewrite the changelog message with the --filter option.\n"
+" Its argument will be invoked with the current changelog message as\n"
+" $1 and the patch as $2."
+msgstr ""
+
+msgid ""
+" If --source/-s is specified, selects changesets from the named\n"
+" repository. If --branch/-b is specified, selects changesets from\n"
+" the branch holding the named revision, up to that revision. If\n"
+" --all/-a is specified, all changesets on the branch will be\n"
+" transplanted, otherwise you will be prompted to select the\n"
+" changesets you want."
+msgstr ""
+
+msgid ""
+" :hg:`transplant --branch REVISION --all` will rebase the selected\n"
+" branch (up to the named revision) onto your current working\n"
+" directory."
+msgstr ""
+
+msgid ""
+" You can optionally mark selected transplanted changesets as merge\n"
+" changesets. You will not be prompted to transplant any ancestors\n"
+" of a merged transplant, and you can merge descendants of them\n"
+" normally instead of transplanting them."
+msgstr ""
+
+msgid ""
+" If no merges or revisions are provided, :hg:`transplant` will\n"
+" start an interactive changeset browser."
+msgstr ""
+
+msgid ""
+" If a changeset application fails, you can fix the merge by hand\n"
+" and then resume where you left off by calling :hg:`transplant\n"
+" --continue/-c`.\n"
+" "
+msgstr ""
+
+msgid "--continue is incompatible with branch, all or merge"
+msgstr ""
+
+msgid "no source URL, branch tag or revision list provided"
+msgstr ""
+
+msgid "--all requires a branch revision"
+msgstr ""
+
+msgid "--all is incompatible with a revision list"
+msgstr ""
+
+msgid "no revision checked out"
+msgstr ""
+
+msgid "outstanding uncommitted merges"
+msgstr ""
+
+msgid "outstanding local changes"
+msgstr ""
+
+msgid ""
+"``transplanted(set)``\n"
+" Transplanted changesets in set."
+msgstr ""
+
+msgid "pull patches from REPO"
+msgstr ""
+
+msgid "BRANCH"
+msgstr ""
+
+msgid "pull patches from branch BRANCH"
+msgstr ""
+
+msgid "pull all changesets up to BRANCH"
+msgstr ""
+
+msgid "skip over REV"
+msgstr ""
+
+msgid "merge at REV"
+msgstr ""
+
+msgid "append transplant info to log message"
+msgstr ""
+
+msgid "continue last transplant session after repair"
+msgstr ""
+
+msgid "filter changesets through command"
+msgstr ""
+
+msgid "hg transplant [-s REPO] [-b BRANCH [-a]] [-p REV] [-m REV] [REV]..."
+msgstr ""
+
+msgid "allow the use of MBCS paths with problematic encodings"
+msgstr ""
+
+msgid ""
+"Some MBCS encodings are not good for some path operations (i.e.\n"
+"splitting path, case conversion, etc.) with its encoded bytes. We call\n"
+"such a encoding (i.e. shift_jis and big5) as \"problematic encoding\".\n"
+"This extension can be used to fix the issue with those encodings by\n"
+"wrapping some functions to convert to Unicode string before path\n"
+"operation."
+msgstr ""
+
+msgid "This extension is useful for:"
+msgstr ""
+
+msgid ""
+"- Japanese Windows users using shift_jis encoding.\n"
+"- Chinese Windows users using big5 encoding.\n"
+"- All users who use a repository with one of problematic encodings on\n"
+" case-insensitive file system."
+msgstr ""
+
+msgid "This extension is not needed for:"
+msgstr ""
+
+msgid ""
+"- Any user who use only ASCII chars in path.\n"
+"- Any user who do not use any of problematic encodings."
+msgstr ""
+
+msgid "Note that there are some limitations on using this extension:"
+msgstr ""
+
+msgid "- You should use single encoding in one repository."
+msgstr ""
+
+msgid ""
+"\n"
+"By default, win32mbcs uses encoding.encoding decided by Mercurial.\n"
+"You can specify the encoding by config option::"
+msgstr ""
+
+msgid ""
+" [win32mbcs]\n"
+" encoding = sjis"
+msgstr ""
+
+msgid "It is useful for the users who want to commit with UTF-8 log message.\n"
+msgstr ""
+
+#, python-format
+msgid "[win32mbcs] filename conversion failed with %s encoding\n"
+msgstr ""
+
+msgid "[win32mbcs] cannot activate on this platform.\n"
+msgstr ""
+
+msgid "perform automatic newline conversion"
+msgstr ""
+
+msgid ""
+" Deprecation: The win32text extension requires each user to configure\n"
+" the extension again and again for each clone since the configuration\n"
+" is not copied when cloning."
+msgstr ""
+
+msgid ""
+" We have therefore made the ``eol`` as an alternative. The ``eol``\n"
+" uses a version controlled file for its configuration and each clone\n"
+" will therefore use the right settings from the start."
+msgstr ""
+
+msgid "To perform automatic newline conversion, use::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" win32text =\n"
+" [encode]\n"
+" ** = cleverencode:\n"
+" # or ** = macencode:"
+msgstr ""
+
+msgid ""
+" [decode]\n"
+" ** = cleverdecode:\n"
+" # or ** = macdecode:"
+msgstr ""
+
+msgid ""
+"If not doing conversion, to make sure you do not commit CRLF/CR by accident::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxncommit.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxncommit.cr = python:hgext.win32text.forbidcr"
+msgstr ""
+
+msgid ""
+"To do the same check on a server to prevent CRLF/CR from being\n"
+"pushed or pulled::"
+msgstr ""
+
+msgid ""
+" [hooks]\n"
+" pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf\n"
+" # or pretxnchangegroup.cr = python:hgext.win32text.forbidcr\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"WARNING: %s already has %s line endings\n"
+"and does not need EOL conversion by the win32text plugin.\n"
+"Before your next commit, please reconsider your encode/decode settings in \n"
+"Mercurial.ini or %s.\n"
+msgstr ""
+
+#, python-format
+msgid "Attempt to commit or push text file(s) using %s line endings\n"
+msgstr ""
+
+#, python-format
+msgid "in %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"To prevent this mistake in your local repository,\n"
+"add to Mercurial.ini or .hg/hgrc:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[hooks]\n"
+"pretxncommit.%s = python:hgext.win32text.forbid%s"
+msgstr ""
+
+#, python-format
+msgid "and also consider adding:"
+msgstr ""
+
+#, python-format
+msgid ""
+"[extensions]\n"
+"win32text =\n"
+"[encode]\n"
+"** = %sencode:\n"
+"[decode]\n"
+"** = %sdecode:\n"
+msgstr ""
+
+msgid ""
+"win32text is deprecated: http://mercurial.selenic.com/wiki/"
+"Win32TextExtension\n"
+msgstr ""
+
+msgid "discover and advertise repositories on the local network"
+msgstr ""
+
+msgid ""
+"Zeroconf-enabled repositories will be announced in a network without\n"
+"the need to configure a server or a service. They can be discovered\n"
+"without knowing their actual IP address."
+msgstr ""
+
+msgid ""
+"To allow other people to discover your repository using run\n"
+":hg:`serve` in your repository::"
+msgstr ""
+
+msgid ""
+" $ cd test\n"
+" $ hg serve"
+msgstr ""
+
+msgid ""
+"You can discover Zeroconf-enabled repositories by running\n"
+":hg:`paths`::"
+msgstr ""
+
+msgid ""
+" $ hg paths\n"
+" zc-test = http://example.com:8000/test\n"
+msgstr ""
+
+msgid "archive prefix contains illegal components"
+msgstr ""
+
+msgid "cannot give prefix when archiving to files"
+msgstr ""
+
+#, python-format
+msgid "unknown archive type '%s'"
+msgstr ""
+
+msgid "invalid changegroup"
+msgstr ""
+
+msgid "unknown parent"
+msgstr ""
+
+#, python-format
+msgid "integrity check failed on %s:%d"
+msgstr ""
+
+msgid "cannot create new bundle repository"
+msgstr ""
+
+#, python-format
+msgid "premature EOF reading chunk (got %d bytes, expected %d)"
+msgstr ""
+
+#, python-format
+msgid "%s: not a Mercurial bundle"
+msgstr "%s ä¸æ˜¯ä¸€å€‹Mercurial bundle"
+
+#, python-format
+msgid "%s: unknown bundle version %s"
+msgstr "%s: 未知的bundle 版本 %s"
+
+msgid "empty username"
+msgstr "使用者å稱是空白的"
+
+#, python-format
+msgid "username %s contains a newline"
+msgstr "使用者å稱 %s 包å«ä¸€å€‹æ›è¡Œå­—å…ƒ"
+
+#, python-format
+msgid "the name '%s' is reserved"
+msgstr ""
+
+msgid "options --message and --logfile are mutually exclusive"
+msgstr ""
+
+#, python-format
+msgid "can't read commit message '%s': %s"
+msgstr "ä¸èƒ½è®€å–æ交訊æ¯'%s': %s"
+
+msgid "limit must be a positive integer"
+msgstr ""
+
+msgid "limit must be positive"
+msgstr ""
+
+#, python-format
+msgid "invalid format spec '%%%s' in output filename"
+msgstr ""
+
+#, python-format
+msgid "adding %s\n"
+msgstr "新增 %s\n"
+
+#, python-format
+msgid "removing %s\n"
+msgstr "正在刪除 %s\n"
+
+#, python-format
+msgid "recording removal of %s as rename to %s (%d%% similar)\n"
+msgstr ""
+
+#, python-format
+msgid "%s has not been committed yet, so no copy data will be stored for %s.\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file is not managed\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not copying - file has been marked for remove\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - %s collides with %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not overwriting - file exists\n"
+msgstr "%s: ä¸èƒ½è“‹å¯« - 檔案存在\n"
+
+#, python-format
+msgid "%s: not recording move - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: not recording copy - %s does not exist\n"
+msgstr ""
+
+#, python-format
+msgid "%s: deleted in working copy\n"
+msgstr "%s:在工作複本裡被刪除了\n"
+
+#, python-format
+msgid "%s: cannot copy - %s\n"
+msgstr "%s: ä¸èƒ½è¤‡è£½ - %s\n"
+
+#, python-format
+msgid "moving %s to %s\n"
+msgstr "%s æ¬ç§»åˆ° %s\n"
+
+#, python-format
+msgid "copying %s to %s\n"
+msgstr "%s 複製到 %s\n"
+
+msgid "no source or destination specified"
+msgstr "沒有æ述來æºæˆ–目的"
+
+msgid "no destination specified"
+msgstr "沒有æ述目的"
+
+msgid "with multiple sources, destination must be an existing directory"
+msgstr ""
+
+#, python-format
+msgid "destination %s is not a directory"
+msgstr ""
+
+msgid "no files to copy"
+msgstr "沒有檔案å¯è¤‡è£½"
+
+msgid "(consider using --after)\n"
+msgstr ""
+
+msgid "child process failed to start"
+msgstr ""
+
+#, python-format
+msgid "changeset: %d:%s\n"
+msgstr "changeset:\t%d:%s\n"
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "分支:\t\t%s\n"
+
+#, python-format
+msgid "tag: %s\n"
+msgstr "標記:\t\t%s\n"
+
+#, python-format
+msgid "parent: %d:%s\n"
+msgstr "æ¯ç³»:\t\t%d:%s\n"
+
+#, python-format
+msgid "manifest: %d:%s\n"
+msgstr "manifest:\t%d:%s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "使用者:\t\t%s\n"
+
+#, python-format
+msgid "date: %s\n"
+msgstr "日期:\t\t%s\n"
+
+msgid "files+:"
+msgstr "檔案+:"
+
+msgid "files-:"
+msgstr "檔案-:"
+
+msgid "files:"
+msgstr "檔案:"
+
+#, python-format
+msgid "files: %s\n"
+msgstr "檔案:\t\t%s\n"
+
+#, python-format
+msgid "copies: %s\n"
+msgstr "複製:\t\t%s\n"
+
+#, python-format
+msgid "extra: %s=%s\n"
+msgstr "é¡å¤–:\t\t%s=%s\n"
+
+msgid "description:\n"
+msgstr "æè¿°:\n"
+
+#, python-format
+msgid "summary: %s\n"
+msgstr "æ交摘è¦:\t%s\n"
+
+#, python-format
+msgid "%s: no key named '%s'"
+msgstr ""
+
+#, python-format
+msgid "Found revision %s from %s\n"
+msgstr "找到修定版 %s (從 %s 那邊)\n"
+
+msgid "revision matching date not found"
+msgstr ""
+
+#, python-format
+msgid "cannot follow nonexistent file: \"%s\""
+msgstr ""
+
+msgid "can only follow copies/renames for explicit filenames"
+msgstr ""
+
+#, python-format
+msgid "skipping missing subrepository: %s\n"
+msgstr ""
+
+msgid "HG: Enter commit message. Lines beginning with 'HG:' are removed."
+msgstr "HG: 輸入æ交訊æ¯.'HG:'開頭的行到時候都會被拿掉"
+
+msgid "HG: Leave message empty to abort commit."
+msgstr "HG: 如果想è¦å–消æ交,ä¸è¦è¼¸å…¥ä»»ä½•è¨Šæ¯ç„¶å¾Œé›¢é–‹."
+
+#, python-format
+msgid "HG: user: %s"
+msgstr "HG: 使用者 : %s"
+
+msgid "HG: branch merge"
+msgstr ""
+
+#, python-format
+msgid "HG: branch '%s'"
+msgstr "HG: 分支 '%s'"
+
+#, python-format
+msgid "HG: subrepo %s"
+msgstr ""
+
+#, python-format
+msgid "HG: added %s"
+msgstr "HG: 新增 %s"
+
+#, python-format
+msgid "HG: changed %s"
+msgstr "HG: 更改 %s"
+
+#, python-format
+msgid "HG: removed %s"
+msgstr "HG: 移除 %s"
+
+msgid "HG: no files changed"
+msgstr "HG: 沒有檔案被改變"
+
+msgid "empty commit message"
+msgstr "空白的æ交訊æ¯"
+
+msgid "add the specified files on the next commit"
+msgstr "新增下次è¦æ交的檔案"
+
+msgid ""
+" Schedule files to be version controlled and added to the\n"
+" repository."
+msgstr ""
+" 新增è¦ç´å…¥ç‰ˆæœ¬æŽ§åˆ¶ä¸¦åŠ åˆ°å„²å­˜åº«çš„檔案。\n"
+" "
+
+msgid ""
+" The files will be added to the repository at the next commit. To\n"
+" undo an add before that, see :hg:`forget`."
+msgstr ""
+" 這些檔案將於下次æ交時被加到儲存庫\n"
+" 若想è¦å›žåˆ°æ–°å¢žæª”案å‰çš„狀態,請åƒé–± :hg:`forget`."
+
+msgid " If no names are given, add all files to the repository."
+msgstr " 如果沒有指定檔案,所有的檔案都將會加到儲存庫"
+
+msgid " .. container:: verbose"
+msgstr ""
+
+msgid ""
+" An example showing how new (unknown) files are added\n"
+" automatically by :hg:`add`::"
+msgstr ""
+
+msgid ""
+" $ ls\n"
+" foo.c\n"
+" $ hg status\n"
+" ? foo.c\n"
+" $ hg add\n"
+" adding foo.c\n"
+" $ hg status\n"
+" A foo.c"
+msgstr ""
+
+msgid ""
+" Returns 0 if all files are successfully added.\n"
+" "
+msgstr ""
+" 如果所有檔案新增æˆåŠŸçš„話就返回0\n"
+" "
+
+msgid "add all new files, delete all missing files"
+msgstr "新增所有未å—版本控制的檔案,並刪除所有消失的檔案。"
+
+msgid ""
+" Add all new files and remove all missing files from the\n"
+" repository."
+msgstr ""
+" 新增所有未加到 repository 的檔案,並移除已加到 repository\n"
+" å»æ¶ˆå¤±çš„檔案。"
+
+msgid ""
+" New files are ignored if they match any of the patterns in\n"
+" .hgignore. As with add, these changes take effect at the next\n"
+" commit."
+msgstr ""
+" 如果新的檔案中檔å有符åˆä»»ä¸€å­˜åœ¨æ–¼ .hgignore 的樣å¼ï¼Œ\n"
+" å‰‡è©²æª”å°‡è¢«å¿½ç•¥ã€‚å¦‚åŒ add 命令,這些變更將於下次æ交時發生效用。"
+
+msgid ""
+" Use the -s/--similarity option to detect renamed files. With a\n"
+" parameter greater than 0, this compares every removed file with\n"
+" every added file and records those similar enough as renames. This\n"
+" option takes a percentage between 0 (disabled) and 100 (files must\n"
+" be identical) as its parameter. Detecting renamed files this way\n"
+" can be expensive. After using this option, :hg:`status -C` can be\n"
+" used to check which files were identified as moved or renamed."
+msgstr ""
+" å¯ä½¿ç”¨ -s/--similarity é¸é …去åµæ¸¬æ›´å的檔案。後é¢æŽ¥è‘—的是一個\n"
+" 大於 0 çš„åƒæ•¸ï¼Œå¯ç”¨ä¾†æ¯”å°æ¯å€‹è¢«æ–°å¢žæˆ–移除的檔案,並試圖找出其\n"
+" æ›´åçš„å¯èƒ½æ€§ã€‚æ­¤é¸é …需è¦æŒ‡å®šä¸€å€‹ä»‹æ–¼ 0 (ä¸ä½¿ç”¨) 至\n"
+" 100 (檔案必須是åŒä¸€å€‹) çš„åƒæ•¸ã€‚åµæ¸¬æ›´å檔案的動作將需è¦\n"
+" 一點時間。\n"
+" "
+
+msgid "similarity must be a number"
+msgstr "similarity åƒæ•¸å¿…須是數字"
+
+msgid "similarity must be between 0 and 100"
+msgstr "similarity åƒæ•¸å¿…須介於 0 至 100"
+
+msgid "show changeset information by line for each file"
+msgstr "顯示æ¯å€‹æª”案中æ¯ä¸€è¡Œ changeset 的資訊"
+
+msgid ""
+" List changes in files, showing the revision id responsible for\n"
+" each line"
+msgstr ""
+
+msgid ""
+" This command is useful for discovering when a change was made and\n"
+" by whom."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, annotate will avoid processing files\n"
+" it detects as binary. With -a, annotate will annotate the file\n"
+" anyway, although the results will probably be neither useful\n"
+" nor desirable."
+msgstr ""
+
+msgid "at least one filename or pattern is required"
+msgstr ""
+
+msgid "at least one of -n/-c is required for -l"
+msgstr ""
+
+#, python-format
+msgid "%s: binary file\n"
+msgstr ""
+
+msgid "create an unversioned archive of a repository revision"
+msgstr "建立一個沒有版本控制的版本å°å­˜"
+
+msgid ""
+" By default, the revision used is the parent of the working\n"
+" directory; use -r/--rev to specify a different revision."
+msgstr ""
+
+msgid ""
+" The archive type is automatically detected based on file\n"
+" extension (or override using -t/--type)."
+msgstr ""
+
+msgid " Valid types are:"
+msgstr ""
+
+msgid ""
+" :``files``: a directory full of files (default)\n"
+" :``tar``: tar archive, uncompressed\n"
+" :``tbz2``: tar archive, compressed using bzip2\n"
+" :``tgz``: tar archive, compressed using gzip\n"
+" :``uzip``: zip archive, uncompressed\n"
+" :``zip``: zip archive, compressed using deflate"
+msgstr ""
+
+msgid ""
+" The exact name of the destination archive or directory is given\n"
+" using a format string; see :hg:`help export` for details."
+msgstr ""
+
+msgid ""
+" Each member added to an archive file has a directory prefix\n"
+" prepended. Use -p/--prefix to specify a format string for the\n"
+" prefix. The default is the basename of the archive, with suffixes\n"
+" removed."
+msgstr ""
+
+msgid "no working directory: please specify a revision"
+msgstr "沒有工作目錄:è«‹æ述一個版次"
+
+msgid "repository root cannot be destination"
+msgstr ""
+
+msgid "cannot archive plain files to stdout"
+msgstr ""
+
+msgid "reverse effect of earlier changeset"
+msgstr "å›žå¾©å…ˆå‰ changeset 所作的變更"
+
+msgid ""
+" The backout command merges the reverse effect of the reverted\n"
+" changeset into the working directory."
+msgstr ""
+
+msgid ""
+" With the --merge option, it first commits the reverted changes\n"
+" as a new changeset. This new changeset is a child of the reverted\n"
+" changeset.\n"
+" The --merge option remembers the parent of the working directory\n"
+" before starting the backout, then merges the new head with that\n"
+" changeset afterwards.\n"
+" This will result in an explicit merge in the history."
+msgstr ""
+
+msgid ""
+" If you backout a changeset other than the original parent of the\n"
+" working directory, the result of this merge is not committed,\n"
+" as with a normal merge. Otherwise, no merge is needed and the\n"
+" commit is automatic."
+msgstr ""
+
+msgid ""
+" Note that the default behavior (without --merge) has changed in\n"
+" version 1.7. To restore the previous default behavior, use\n"
+" :hg:`backout --merge` and then :hg:`update --clean .` to get rid of\n"
+" the ongoing merge."
+msgstr ""
+
+msgid "please specify just one revision"
+msgstr ""
+
+msgid "please specify a revision to backout"
+msgstr ""
+
+msgid "cannot backout change on a different branch"
+msgstr ""
+
+msgid "cannot backout a change with no parents"
+msgstr ""
+
+msgid "cannot backout a merge changeset without --parent"
+msgstr ""
+
+#, python-format
+msgid "%s is not a parent of %s"
+msgstr ""
+
+msgid "cannot use --parent on non-merge changeset"
+msgstr ""
+
+#, python-format
+msgid "changeset %s backs out changeset %s\n"
+msgstr ""
+
+#, python-format
+msgid "merging with changeset %s\n"
+msgstr ""
+
+msgid "subdivision search of changesets"
+msgstr "å° changesets 作二分法æœå°‹"
+
+msgid ""
+" This command helps to find changesets which introduce problems. To\n"
+" use, mark the earliest changeset you know exhibits the problem as\n"
+" bad, then mark the latest changeset which is free from the problem\n"
+" as good. Bisect will update your working directory to a revision\n"
+" for testing (unless the -U/--noupdate option is specified). Once\n"
+" you have performed tests, mark the working directory as good or\n"
+" bad, and bisect will either update to another candidate changeset\n"
+" or announce that it has found the bad revision."
+msgstr ""
+
+msgid ""
+" As a shortcut, you can also use the revision argument to mark a\n"
+" revision as good or bad without checking it out first."
+msgstr ""
+
+msgid ""
+" If you supply a command, it will be used for automatic bisection.\n"
+" Its exit status will be used to mark revisions as good or bad:\n"
+" status 0 means good, 125 means to skip the revision, 127\n"
+" (command not found) will abort the bisection, and any other\n"
+" non-zero exit status means the revision is bad."
+msgstr ""
+
+msgid "The first good revision is:\n"
+msgstr ""
+
+msgid "The first bad revision is:\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"Not all ancestors of this changeset have been checked.\n"
+"To check the other ancestors, start from the common ancestor, %s.\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first good revision could be any of:\n"
+msgstr ""
+
+msgid "Due to skipped revisions, the first bad revision could be any of:\n"
+msgstr ""
+
+msgid "cannot bisect (no known good revisions)"
+msgstr ""
+
+msgid "cannot bisect (no known bad revisions)"
+msgstr ""
+
+msgid "(use of 'hg bisect <cmd>' is deprecated)\n"
+msgstr ""
+
+msgid "incompatible arguments"
+msgstr ""
+
+#, python-format
+msgid "failed to execute %s"
+msgstr ""
+
+#, python-format
+msgid "%s killed"
+msgstr ""
+
+#, python-format
+msgid "Changeset %d:%s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "Testing changeset %d:%s (%d changesets remaining, ~%d tests)\n"
+msgstr ""
+
+msgid "set or show the current branch name"
+msgstr "設定或顯示目å‰çš„分支å稱"
+
+msgid ""
+" With no argument, show the current branch name. With one argument,\n"
+" set the working directory branch name (the branch will not exist\n"
+" in the repository until the next commit). Standard practice\n"
+" recommends that primary development take place on the 'default'\n"
+" branch."
+msgstr ""
+
+msgid ""
+" Unless -f/--force is specified, branch will not let you set a\n"
+" branch name that already exists, even if it's inactive."
+msgstr ""
+
+msgid ""
+" Use -C/--clean to reset the working directory branch to that of\n"
+" the parent of the working directory, negating a previous branch\n"
+" change."
+msgstr ""
+
+msgid ""
+" Use the command :hg:`update` to switch to an existing branch. Use\n"
+" :hg:`commit --close-branch` to mark this branch as closed."
+msgstr ""
+
+#, python-format
+msgid "reset working directory to branch %s\n"
+msgstr "é‡ç½®å·¥ä½œç›®éŒ„到%s分支\n"
+
+msgid ""
+"a branch of the same name already exists (use 'hg update' to switch to it)"
+msgstr ""
+
+#, python-format
+msgid "marked working directory as branch %s\n"
+msgstr "標記工作目錄為%s分支\n"
+
+msgid "list repository named branches"
+msgstr "顯示 repository 的 named branches"
+
+msgid ""
+" List the repository's named branches, indicating which ones are\n"
+" inactive. If -c/--closed is specified, also list branches which have\n"
+" been marked closed (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If -a/--active is specified, only show active branches. A branch\n"
+" is considered active if it contains repository heads."
+msgstr ""
+
+msgid " Use the command :hg:`update` to switch to an existing branch."
+msgstr ""
+
+msgid ""
+" Returns 0.\n"
+" "
+msgstr ""
+
+msgid " (closed)"
+msgstr ""
+
+msgid " (inactive)"
+msgstr ""
+
+msgid "create a changegroup file"
+msgstr "建立一個 changegroup 檔案"
+
+msgid ""
+" Generate a compressed changegroup file collecting changesets not\n"
+" known to be in another repository."
+msgstr ""
+
+msgid ""
+" If you omit the destination repository, then hg assumes the\n"
+" destination will have all the nodes you specify with --base\n"
+" parameters. To create a bundle containing all changesets, use\n"
+" -a/--all (or --base null)."
+msgstr ""
+
+msgid ""
+" You can change compression method with the -t/--type option.\n"
+" The available compression methods are: none, bzip2, and\n"
+" gzip (by default, bundles are compressed using bzip2)."
+msgstr ""
+
+msgid ""
+" The bundle file can then be transferred using conventional means\n"
+" and applied to another repository with the unbundle or pull\n"
+" command. This is useful when direct push and pull are not\n"
+" available or when exporting an entire repository is undesirable."
+msgstr ""
+
+msgid ""
+" Applying bundles preserves all changeset contents including\n"
+" permissions, copy/rename information, and revision history."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no changes found.\n"
+" "
+msgstr ""
+
+msgid "--base is incompatible with specifying a destination"
+msgstr ""
+
+msgid "unknown bundle type specified with --type"
+msgstr ""
+
+msgid "output the current or given revision of files"
+msgstr "輸出目å‰æˆ–是特定修定版的檔案內容"
+
+msgid ""
+" Print the specified files as they were at the given revision. If\n"
+" no revision is given, the parent of the working directory is used,\n"
+" or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are the same as\n"
+" for the export command, with the following additions:"
+msgstr ""
+
+msgid ""
+" :``%s``: basename of file being printed\n"
+" :``%d``: dirname of file being printed, or '.' if in repository root\n"
+" :``%p``: root-relative path name of file being printed"
+msgstr ""
+
+msgid "make a copy of an existing repository"
+msgstr "å°å·²å­˜åœ¨çš„ repository 複製一份"
+
+msgid " Create a copy of an existing repository in a new directory."
+msgstr ""
+
+msgid ""
+" If no destination directory name is specified, it defaults to the\n"
+" basename of the source."
+msgstr ""
+
+msgid ""
+" The location of the source is added to the new repository's\n"
+" .hg/hgrc file, as the default to be used for future pulls."
+msgstr ""
+
+msgid " See :hg:`help urls` for valid source format details."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination, but no\n"
+" .hg/hgrc and working directory will be created on the remote side.\n"
+" Please see :hg:`help urls` for important details about ``ssh://`` URLs."
+msgstr ""
+
+msgid ""
+" A set of changesets (tags, or branch names) to pull may be specified\n"
+" by listing each changeset (tag, or branch name) with -r/--rev.\n"
+" If -r/--rev is used, the cloned repository will contain only a subset\n"
+" of the changesets of the source repository. Only the set of changesets\n"
+" defined by all -r/--rev options (including all their ancestors)\n"
+" will be pulled into the destination repository.\n"
+" No subsequent changesets (including subsequent tags) will be present\n"
+" in the destination."
+msgstr ""
+
+msgid ""
+" Using -r/--rev (or 'clone src#rev dest') implies --pull, even for\n"
+" local source repositories."
+msgstr ""
+
+msgid ""
+" For efficiency, hardlinks are used for cloning whenever the source\n"
+" and destination are on the same filesystem (note this applies only\n"
+" to the repository data, not to the working directory). Some\n"
+" filesystems, such as AFS, implement hardlinking incorrectly, but\n"
+" do not report errors. In these cases, use the --pull option to\n"
+" avoid hardlinking."
+msgstr ""
+
+msgid ""
+" In some cases, you can clone repositories and the working directory\n"
+" using full hardlinks with ::"
+msgstr ""
+
+msgid " $ cp -al REPO REPOCLONE"
+msgstr ""
+
+msgid ""
+" This is the fastest way to clone, but it is not always safe. The\n"
+" operation is not atomic (making sure REPO is not modified during\n"
+" the operation is up to you) and you have to make sure your editor\n"
+" breaks hardlinks (Emacs and most Linux Kernel tools do so). Also,\n"
+" this is not compatible with certain extensions that place their\n"
+" metadata under the .hg directory, such as mq."
+msgstr ""
+
+msgid ""
+" Mercurial will update the working directory to the first applicable\n"
+" revision from this list:"
+msgstr ""
+
+msgid ""
+" a) null if -U or the source repository has no changesets\n"
+" b) if -u . and the source repository is local, the first parent of\n"
+" the source repository's working directory\n"
+" c) the changeset specified with -u (if a branch name, this means the\n"
+" latest head of that branch)\n"
+" d) the changeset specified with -r\n"
+" e) the tipmost head specified with -b\n"
+" f) the tipmost head specified with the url#branch source syntax\n"
+" g) the tipmost head of the default branch\n"
+" h) tip"
+msgstr ""
+
+msgid "cannot specify both --noupdate and --updaterev"
+msgstr ""
+
+msgid "commit the specified files or all outstanding changes"
+msgstr "將指定的檔案或是目å‰çš„變更 commit"
+
+msgid ""
+" Commit changes to the given files into the repository. Unlike a\n"
+" centralized RCS, this operation is a local operation. See\n"
+" :hg:`push` for a way to actively distribute your changes."
+msgstr ""
+
+msgid ""
+" If a list of files is omitted, all changes reported by :hg:`status`\n"
+" will be committed."
+msgstr ""
+
+msgid ""
+" If you are committing the result of a merge, do not provide any\n"
+" filenames or -I/-X filters."
+msgstr ""
+
+msgid ""
+" If no commit message is specified, Mercurial starts your\n"
+" configured editor where you can enter a message. In case your\n"
+" commit fails, you will find a backup of your message in\n"
+" ``.hg/last-message.txt``."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if nothing changed.\n"
+" "
+msgstr ""
+
+msgid "can only close branch heads"
+msgstr ""
+
+msgid "nothing changed\n"
+msgstr ""
+
+msgid "created new head\n"
+msgstr ""
+
+#, python-format
+msgid "reopening closed branch head %d\n"
+msgstr ""
+
+#, python-format
+msgid "committed changeset %d:%s\n"
+msgstr ""
+
+msgid "mark files as copied for the next commit"
+msgstr "將檔案標示為 copied 並於下次 commit"
+
+msgid ""
+" Mark dest as having copies of source files. If dest is a\n"
+" directory, copies are put in that directory. If dest is a file,\n"
+" the source must be a single file."
+msgstr ""
+
+msgid ""
+" By default, this command copies the contents of files as they\n"
+" exist in the working directory. If invoked with -A/--after, the\n"
+" operation is recorded, but no copying is performed."
+msgstr ""
+
+msgid ""
+" This command takes effect with the next commit. To undo a copy\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if errors are encountered.\n"
+" "
+msgstr ""
+
+msgid "find the ancestor revision of two revisions in a given index"
+msgstr ""
+
+msgid "either two or three arguments required"
+msgstr ""
+
+msgid "builds a repo with a given dag from scratch in the current empty repo"
+msgstr ""
+
+msgid " Elements:"
+msgstr ""
+
+msgid ""
+" - \"+n\" is a linear run of n nodes based on the current default "
+"parent\n"
+" - \".\" is a single node based on the current default parent\n"
+" - \"$\" resets the default parent to null (implied at the start);\n"
+" otherwise the default parent is always the last node created\n"
+" - \"<p\" sets the default parent to the backref p\n"
+" - \"*p\" is a fork at parent p, which is a backref\n"
+" - \"*p1/p2\" is a merge of parents p1 and p2, which are backrefs\n"
+" - \"/p2\" is a merge of the preceding node and p2\n"
+" - \":tag\" defines a local tag for the preceding node\n"
+" - \"@branch\" sets the named branch for subsequent nodes\n"
+" - \"!command\" runs the command using your shell\n"
+" - \"!!my command\\n\" is like \"!\", but to the end of the line\n"
+" - \"#...\\n\" is a comment up to the end of the line"
+msgstr ""
+
+msgid " Whitespace between the above elements is ignored."
+msgstr ""
+
+msgid " A backref is either"
+msgstr ""
+
+msgid ""
+" - a number n, which references the node curr-n, where curr is the "
+"current\n"
+" node, or\n"
+" - the name of a local tag you placed earlier using \":tag\", or\n"
+" - empty to denote the default parent."
+msgstr ""
+
+msgid ""
+" All string valued-elements are either strictly alphanumeric, or must\n"
+" be enclosed in double quotes (\"...\"), with \"\\\" as escape character."
+msgstr ""
+
+msgid ""
+" Note that the --overwritten-file and --appended-file options imply the\n"
+" use of \"HGMERGE=internal:local\" during DAG buildup.\n"
+" "
+msgstr ""
+
+msgid "need at least one of -m, -a, -o, -n"
+msgstr ""
+
+msgid "repository is not empty"
+msgstr "儲存庫ä¸æ˜¯ç©ºç™½çš„"
+
+#, python-format
+msgid "%s command %s"
+msgstr "%s 命令 %s"
+
+msgid "list all available commands and options"
+msgstr ""
+
+msgid "returns the completion list associated with the given command"
+msgstr ""
+
+msgid "show information detected about current filesystem"
+msgstr ""
+
+msgid "rebuild the dirstate as it would look like for the given revision"
+msgstr ""
+
+msgid "validate the correctness of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but also in manifest1\n"
+msgstr ""
+
+#, python-format
+msgid "%s in state %s, but not in either manifest\n"
+msgstr ""
+
+#, python-format
+msgid "%s in manifest1, but listed as state %s"
+msgstr ""
+
+msgid ".hg/dirstate inconsistent with current parent's manifest"
+msgstr ""
+
+msgid "show combined config settings from all hgrc files"
+msgstr "顯示åˆä½µè‡ªæ‰€æœ‰ hgrc 檔案內容的設定值"
+
+msgid " With no arguments, print names and values of all config items."
+msgstr ""
+
+msgid ""
+" With one argument of the form section.name, print just the value\n"
+" of that config item."
+msgstr ""
+
+msgid ""
+" With multiple arguments, print names and values of all config\n"
+" items with matching section names."
+msgstr ""
+
+msgid ""
+" With --debug, the source (filename and line number) is printed\n"
+" for each config item."
+msgstr ""
+
+#, python-format
+msgid "read config from: %s\n"
+msgstr ""
+
+msgid "only one config item permitted"
+msgstr ""
+
+msgid "access the pushkey key/value protocol"
+msgstr ""
+
+msgid " With two args, list the keys in the given namespace."
+msgstr ""
+
+msgid ""
+" With five args, set a key to new if it currently is set to old.\n"
+" Reports success or failure.\n"
+" "
+msgstr ""
+
+msgid "parse and apply a revision specification"
+msgstr ""
+
+msgid "manually set the parents of the current working directory"
+msgstr ""
+
+msgid ""
+" This is useful for writing repository conversion tools, but should\n"
+" be used with care."
+msgstr ""
+
+msgid "show the contents of the current dirstate"
+msgstr ""
+
+#, python-format
+msgid "copy: %s -> %s\n"
+msgstr ""
+
+msgid "format the changelog or an index DAG as a concise textual description"
+msgstr ""
+
+msgid ""
+" If you pass a revlog index, the revlog's DAG is emitted. If you list\n"
+" revision numbers, they get labelled in the output as rN."
+msgstr ""
+
+msgid ""
+" Otherwise, the changelog DAG of the current repo is emitted.\n"
+" "
+msgstr ""
+
+msgid "need repo for changelog dag"
+msgstr ""
+
+msgid "dump the contents of a data file revision"
+msgstr ""
+
+#, python-format
+msgid "invalid revision identifier %s"
+msgstr ""
+
+msgid "parse and display a date"
+msgstr ""
+
+msgid "dump the contents of an index file"
+msgstr ""
+
+msgid "dump an index DAG as a graphviz dot file"
+msgstr ""
+
+msgid "test Mercurial installation"
+msgstr ""
+
+#, python-format
+msgid "Checking encoding (%s)...\n"
+msgstr ""
+
+msgid " (check that your locale is properly set)\n"
+msgstr ""
+
+#, python-format
+msgid "Checking installed modules (%s)...\n"
+msgstr "正在檢查安è£çš„模組 (%s)...\n"
+
+msgid " One or more extensions could not be found"
+msgstr ""
+
+msgid " (check that you compiled the extensions)\n"
+msgstr ""
+
+msgid "Checking templates...\n"
+msgstr ""
+
+msgid " (templates seem to have been installed incorrectly)\n"
+msgstr ""
+
+msgid "Checking patch...\n"
+msgstr ""
+
+msgid " patch call failed:\n"
+msgstr ""
+
+msgid " unexpected patch output!\n"
+msgstr ""
+
+msgid " patch test failed!\n"
+msgstr "路徑測試失敗!\n"
+
+msgid ""
+" (Current patch tool may be incompatible with patch, or misconfigured. "
+"Please check your configuration file)\n"
+msgstr ""
+
+msgid ""
+" Internal patcher failure, please report this error to http://mercurial."
+"selenic.com/wiki/BugTracker\n"
+msgstr ""
+
+msgid "Checking commit editor...\n"
+msgstr "檢查æ交訊æ¯ç·¨è¼¯å™¨...\n"
+
+msgid " No commit editor set and can't find vi in PATH\n"
+msgstr "沒有設定æ交訊æ¯ç·¨è¼¯å™¨,然後在PATH中也沒有vi\n"
+
+msgid " (specify a commit editor in your configuration file)\n"
+msgstr "(在你的設定檔指明一個用來編輯æ交訊æ¯çš„編輯器)\n"
+
+#, python-format
+msgid " Can't find editor '%s' in PATH\n"
+msgstr "在PATH中找ä¸åˆ°ç·¨è¼¯å™¨ '%s'\n"
+
+msgid "Checking username...\n"
+msgstr "檢查使用者å稱...\n"
+
+msgid " (specify a username in your configuration file)\n"
+msgstr "(在你的設定檔指明一個使用者å稱)\n"
+
+msgid "No problems detected\n"
+msgstr "查ä¸åˆ°å•é¡Œ\n"
+
+#, python-format
+msgid "%s problems detected, please check your install!\n"
+msgstr "查到%så•é¡Œ,請檢查你的安è£!\n"
+
+msgid "dump rename information"
+msgstr "倒出改å資訊"
+
+#, python-format
+msgid "%s renamed from %s:%s\n"
+msgstr "%s 改å字從%s:%s\n"
+
+#, python-format
+msgid "%s not renamed\n"
+msgstr "%s 沒有被改å\n"
+
+msgid "show how files match on given patterns"
+msgstr ""
+
+msgid "diff repository (or selected files)"
+msgstr "diff 儲存庫 (或是所é¸æ“‡çš„檔案)"
+
+msgid " Show differences between revisions for the specified files."
+msgstr ""
+
+msgid " Differences between files are shown using the unified diff format."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" diff may generate unexpected results for merges, as it will\n"
+" default to comparing against the working directory's first\n"
+" parent changeset if no revisions are specified."
+msgstr ""
+
+msgid ""
+" Alternatively you can specify -c/--change with a revision to see\n"
+" the changes in that changeset relative to its first parent."
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, diff will avoid generating diffs of\n"
+" files it detects as binary. With -a, diff will generate a diff\n"
+" anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. For more information, read :hg:`help diffs`."
+msgstr ""
+
+msgid "dump the header and diffs for one or more changesets"
+msgstr "將一或多個 changesets çš„ header ä»¥åŠ diffs dump 出來"
+
+msgid " Print the changeset header and diffs for one or more revisions."
+msgstr ""
+
+msgid ""
+" The information shown in the changeset header is: author, date,\n"
+" branch name (if non-default), changeset hash, parent(s) and commit\n"
+" comment."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" export may generate unexpected diff output for merge\n"
+" changesets, as it will compare the merge changeset against its\n"
+" first parent only."
+msgstr ""
+
+msgid ""
+" Output may be to a file, in which case the name of the file is\n"
+" given using a format string. The formatting rules are as follows:"
+msgstr ""
+
+msgid ""
+" :``%%``: literal \"%\" character\n"
+" :``%H``: changeset hash (40 hexadecimal digits)\n"
+" :``%N``: number of patches being generated\n"
+" :``%R``: changeset revision number\n"
+" :``%b``: basename of the exporting repository\n"
+" :``%h``: short-form changeset hash (12 hexadecimal digits)\n"
+" :``%n``: zero-padded sequence number, starting at 1\n"
+" :``%r``: zero-padded changeset revision number"
+msgstr ""
+
+msgid ""
+" Without the -a/--text option, export will avoid generating diffs\n"
+" of files it detects as binary. With -a, export will generate a\n"
+" diff anyway, probably with undesirable results."
+msgstr ""
+
+msgid ""
+" Use the -g/--git option to generate diffs in the git extended diff\n"
+" format. See :hg:`help diffs` for more information."
+msgstr ""
+
+msgid ""
+" With the --switch-parent option, the diff will be against the\n"
+" second parent. It can be useful to review a merge."
+msgstr ""
+
+msgid "export requires at least one changeset"
+msgstr ""
+
+msgid "exporting patches:\n"
+msgstr "匯出路徑(s):\n"
+
+msgid "exporting patch:\n"
+msgstr "匯出路徑:\n"
+
+msgid "forget the specified files on the next commit"
+msgstr "下次æ交時忘記指定的檔案"
+
+msgid ""
+" Mark the specified files so they will no longer be tracked\n"
+" after the next commit."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history, and it does not delete them from the\n"
+" working directory."
+msgstr ""
+
+msgid " To undo a forget before the next commit, see :hg:`add`."
+msgstr ""
+
+msgid "no files specified"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is already untracked\n"
+msgstr ""
+
+msgid "search for a pattern in specified files and revisions"
+msgstr "從指定的檔案或修定版æœå°‹æ¨£å¼"
+
+msgid " Search revisions of files for a regular expression."
+msgstr ""
+
+msgid ""
+" This command behaves differently than Unix grep. It only accepts\n"
+" Python/Perl regexps. It searches repository history, not the\n"
+" working directory. It always prints the revision number in which a\n"
+" match appears."
+msgstr ""
+
+msgid ""
+" By default, grep only prints output for the first revision of a\n"
+" file in which it finds a match. To get it to print every revision\n"
+" that contains a change in match status (\"-\" for a match that\n"
+" becomes a non-match, or \"+\" for a non-match that becomes a match),\n"
+" use the --all flag."
+msgstr ""
+
+msgid ""
+" Returns 0 if a match is found, 1 otherwise.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "grep: invalid match pattern: %s\n"
+msgstr ""
+
+msgid "show current repository heads or show branch heads"
+msgstr "顯示目å‰çš„ repository heads 或是 branch heads"
+
+msgid " With no arguments, show all repository branch heads."
+msgstr ""
+
+msgid ""
+" Repository \"heads\" are changesets with no child changesets. They are\n"
+" where development generally takes place and are the usual targets\n"
+" for update and merge operations. Branch heads are changesets that have\n"
+" no child changeset on the same branch."
+msgstr ""
+
+msgid ""
+" If one or more REVs are given, only branch heads on the branches\n"
+" associated with the specified changesets are shown."
+msgstr ""
+
+msgid ""
+" If -c/--closed is specified, also show branch heads marked closed\n"
+" (see :hg:`commit --close-branch`)."
+msgstr ""
+
+msgid ""
+" If STARTREV is specified, only those heads that are descendants of\n"
+" STARTREV will be displayed."
+msgstr ""
+
+msgid ""
+" If -t/--topo is specified, named branch mechanics will be ignored and "
+"only\n"
+" changesets without children will be shown."
+msgstr ""
+
+msgid ""
+" Returns 0 if matching heads are found, 1 if not.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "no open branch heads found on branches %s"
+msgstr ""
+
+#, python-format
+msgid " (started at %s)"
+msgstr "(開始在: %s)"
+
+msgid "show help for a given topic or a help overview"
+msgstr "顯示特定主題的 help 說明或是 help overview"
+
+msgid ""
+" With no arguments, print a list of commands with short help messages."
+msgstr ""
+
+msgid ""
+" Given a topic, extension, or command name, print help for that\n"
+" topic."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful.\n"
+" "
+msgstr ""
+
+msgid "global options:"
+msgstr "全域é¸é …:"
+
+msgid "use \"hg help\" for the full list of commands"
+msgstr "使用 'hg help' 列出全部的命令"
+
+msgid "use \"hg help\" for the full list of commands or \"hg -v\" for details"
+msgstr "使用 'hg help' 列出全部的命令或 'hg -v'列出詳細資料"
+
+#, python-format
+msgid "use \"hg -v help%s\" to show aliases and global options"
+msgstr "使用 \"hg -v help%s\" 以顯示別å以åŠå…¨åŸŸé¸é …"
+
+#, python-format
+msgid "use \"hg -v help %s\" to show global options"
+msgstr "使用 \"hg -v help %s\" 以顯示全域é¸é …"
+
+msgid "list of commands:"
+msgstr "命令列表:"
+
+#, python-format
+msgid ""
+"\n"
+"aliases: %s\n"
+msgstr ""
+"\n"
+"別å: %s\n"
+
+msgid "(no help text available)"
+msgstr "(沒有å¯ç”¨çš„說明文字)"
+
+#, python-format
+msgid "shell alias for::"
+msgstr ""
+
+#, python-format
+msgid " %s"
+msgstr ""
+
+#, python-format
+msgid "alias for: hg %s"
+msgstr "別å: hg %s"
+
+#, python-format
+msgid "%s"
+msgstr ""
+
+#, python-format
+msgid ""
+"\n"
+"use \"hg -v help %s\" to show verbose help\n"
+msgstr ""
+"\n"
+"使用 \"hg -v help %s\" 以顯示全域é¸é …\n"
+
+msgid "options:\n"
+msgstr "é¸é …:\n"
+
+msgid "no commands defined\n"
+msgstr "沒有定義的命令\n"
+
+msgid "no help text available"
+msgstr "沒有å¯ç”¨çš„說明文字"
+
+#, python-format
+msgid "%s extension - %s"
+msgstr "%s 擴充套件 - %s"
+
+msgid "use \"hg help extensions\" for information on enabling extensions\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' is provided by the following extension:"
+msgstr ""
+
+msgid "Mercurial Distributed SCM\n"
+msgstr "Mercurial 分散å¼ç‰ˆæœ¬æŽ§åˆ¶ç³»çµ±\n"
+
+msgid "basic commands:"
+msgstr "基本命令:"
+
+msgid "enabled extensions:"
+msgstr "已啟用的擴充套件:"
+
+msgid "VALUE"
+msgstr ""
+
+msgid "DEPRECATED"
+msgstr ""
+
+msgid ""
+"\n"
+"[+] marked option can be specified multiple times"
+msgstr ""
+"\n"
+"有標記 [+] çš„åƒæ•¸,å¯ä»¥è¡¨è¿°å¤šæ¬¡"
+
+msgid ""
+"\n"
+"additional help topics:"
+msgstr ""
+"\n"
+"é¡å¤–的說明主題:"
+
+msgid "identify the working copy or specified revision"
+msgstr "識別工作副本或æ述的修定版"
+
+msgid ""
+" With no revision, print a summary of the current state of the\n"
+" repository."
+msgstr ""
+
+msgid ""
+" Specifying a path to a repository root or Mercurial bundle will\n"
+" cause lookup to operate on that repository/bundle."
+msgstr ""
+
+msgid ""
+" This summary identifies the repository state using one or two\n"
+" parent hash identifiers, followed by a \"+\" if there are\n"
+" uncommitted changes in the working directory, a list of tags for\n"
+" this revision and a branch name for non-default branches."
+msgstr ""
+
+msgid "import an ordered set of patches"
+msgstr "import 一組有順åºçš„ patches"
+
+msgid ""
+" Import a list of patches and commit them individually (unless\n"
+" --no-commit is specified)."
+msgstr ""
+
+msgid ""
+" If there are outstanding changes in the working directory, import\n"
+" will abort unless given the -f/--force flag."
+msgstr ""
+
+msgid ""
+" You can import a patch straight from a mail message. Even patches\n"
+" as attachments work (to use the body part, it must have type\n"
+" text/plain or text/x-patch). From and Subject headers of email\n"
+" message are used as default committer and commit message. All\n"
+" text/plain body parts before first diff are added to commit\n"
+" message."
+msgstr ""
+
+msgid ""
+" If the imported patch was generated by :hg:`export`, user and\n"
+" description from patch override values from message headers and\n"
+" body. Values given on command line with -m/--message and -u/--user\n"
+" override these."
+msgstr ""
+
+msgid ""
+" If --exact is specified, import will set the working directory to\n"
+" the parent of each patch before applying it, and will abort if the\n"
+" resulting changeset has a different ID than the one recorded in\n"
+" the patch. This may happen due to character set problems or other\n"
+" deficiencies in the text patch format."
+msgstr ""
+
+msgid ""
+" With -s/--similarity, hg will attempt to discover renames and\n"
+" copies in the patch in the same way as 'addremove'."
+msgstr ""
+
+msgid ""
+" To read a patch from standard input, use \"-\" as the patch name. If\n"
+" a URL is specified, the patch will be downloaded from it.\n"
+" See :hg:`help dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid "to working directory"
+msgstr "到工作目錄"
+
+msgid "not a Mercurial patch"
+msgstr ""
+
+msgid "patch is damaged or loses information"
+msgstr ""
+
+msgid "applying patch from stdin\n"
+msgstr ""
+
+#, python-format
+msgid "applied %s\n"
+msgstr ""
+
+msgid "no diffs found"
+msgstr ""
+
+msgid "show new changesets found in source"
+msgstr "顯示來æºç«¯æ–°çš„ changesets"
+
+msgid ""
+" Show new changesets found in the specified path/URL or the default\n"
+" pull location. These are the changesets that would have been pulled\n"
+" if a pull at the time you issued this command."
+msgstr ""
+
+msgid ""
+" For remote repository, using --bundle avoids downloading the\n"
+" changesets twice if the incoming is followed by a pull."
+msgstr ""
+
+msgid " See pull for valid source format details."
+msgstr ""
+
+msgid ""
+" Returns 0 if there are incoming changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "cannot combine --bundle and --subrepos"
+msgstr ""
+
+msgid "create a new repository in the given directory"
+msgstr "於指定的目錄建立新的 repository"
+
+msgid ""
+" Initialize a new repository in the given directory. If the given\n"
+" directory does not exist, it will be created."
+msgstr ""
+
+msgid " If no directory is given, the current directory is used."
+msgstr ""
+
+msgid ""
+" It is possible to specify an ``ssh://`` URL as the destination.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+
+msgid "locate files matching specific patterns"
+msgstr "找出符åˆæŒ‡å®šæ¨£å¼çš„檔案"
+
+msgid ""
+" Print files under Mercurial control in the working directory whose\n"
+" names match the given patterns."
+msgstr ""
+
+msgid ""
+" By default, this command searches all directories in the working\n"
+" directory. To search just the current directory and its\n"
+" subdirectories, use \"--include .\"."
+msgstr ""
+
+msgid ""
+" If no patterns are given to match, this command prints the names\n"
+" of all files under Mercurial control in the working directory."
+msgstr ""
+
+msgid ""
+" If you want to feed the output of this command into the \"xargs\"\n"
+" command, use the -0 option to both this command and \"xargs\". This\n"
+" will avoid the problem of \"xargs\" treating single filenames that\n"
+" contain whitespace as multiple filenames."
+msgstr ""
+
+msgid "show revision history of entire repository or files"
+msgstr ""
+
+msgid ""
+" Print the revision history of the specified files or the entire\n"
+" project."
+msgstr ""
+
+msgid ""
+" File history is shown without following rename or copy history of\n"
+" files. Use -f/--follow with a filename to follow history across\n"
+" renames and copies. --follow without a filename will only show\n"
+" ancestors or descendants of the starting revision. --follow-first\n"
+" only follows the first parent of merge revisions."
+msgstr ""
+
+msgid ""
+" If no revision range is specified, the default is ``tip:0`` unless\n"
+" --follow is set, in which case the working directory parent is\n"
+" used as the starting revision. You can specify a revision set for\n"
+" log, see :hg:`help revsets` for more information."
+msgstr ""
+
+msgid ""
+" By default this command prints revision number and changeset id,\n"
+" tags, non-trivial parents, user, date and time, and a summary for\n"
+" each commit. When the -v/--verbose switch is used, the list of\n"
+" changed files and full commit message are shown."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" log -p/--patch may generate unexpected diff output for merge\n"
+" changesets, as it will only compare the merge changeset against\n"
+" its first parent. Also, only files different from BOTH parents\n"
+" will appear in files:."
+msgstr ""
+
+msgid "output the current or given revision of the project manifest"
+msgstr ""
+
+msgid ""
+" Print a list of version controlled files for the given revision.\n"
+" If no revision is given, the first parent of the working directory\n"
+" is used, or the null revision if no revision is checked out."
+msgstr ""
+
+msgid ""
+" With -v, print file permissions, symlink and executable bits.\n"
+" With --debug, print file revision hashes."
+msgstr ""
+
+msgid "merge working directory with another revision"
+msgstr "將工作目錄與其他的修定版åˆä½µ"
+
+msgid ""
+" The current working directory is updated with all changes made in\n"
+" the requested revision since the last common predecessor revision."
+msgstr ""
+
+msgid ""
+" Files that changed between either parent are marked as changed for\n"
+" the next commit and a commit must be performed before any further\n"
+" updates to the repository are allowed. The next commit will have\n"
+" two parents."
+msgstr ""
+
+msgid ""
+" ``--tool`` can be used to specify the merge tool used for file\n"
+" merges. It overrides the HGMERGE environment variable and your\n"
+" configuration files."
+msgstr ""
+
+msgid ""
+" If no revision is specified, the working directory's parent is a\n"
+" head revision, and the current branch contains exactly one other\n"
+" head, the other head is merged with by default. Otherwise, an\n"
+" explicit revision with which to merge with must be provided."
+msgstr ""
+
+msgid " :hg:`resolve` must be used to resolve unresolved files."
+msgstr "hg `resolve`必須使用在解決未解決的檔案."
+
+msgid ""
+" To undo an uncommitted merge, use :hg:`update --clean .` which\n"
+" will check out a clean copy of the original merge parent, losing\n"
+" all changes."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if there are unresolved files.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid ""
+"branch '%s' has %d heads - please merge with an explicit rev\n"
+"(run 'hg heads .' to see heads)"
+msgstr ""
+
+#, python-format
+msgid ""
+"branch '%s' has one head - please merge with an explicit rev\n"
+"(run 'hg heads' to see all heads)"
+msgstr ""
+
+msgid "there is nothing to merge"
+msgstr ""
+
+#, python-format
+msgid "%s - use \"hg update\" instead"
+msgstr ""
+
+msgid ""
+"working dir not at a head rev - use \"hg update\" or merge with an explicit "
+"rev"
+msgstr ""
+
+msgid "show changesets not found in the destination"
+msgstr ""
+
+msgid ""
+" Show changesets not found in the specified destination repository\n"
+" or the default push location. These are the changesets that would\n"
+" be pushed if a push was requested."
+msgstr ""
+
+msgid " See pull for details of valid destination formats."
+msgstr ""
+
+msgid ""
+" Returns 0 if there are outgoing changes, 1 otherwise.\n"
+" "
+msgstr ""
+
+msgid "show the parents of the working directory or revision"
+msgstr "顯示工作目錄或修定版的æ¯ç³»"
+
+msgid ""
+" Print the working directory's parent revisions. If a revision is\n"
+" given via -r/--rev, the parent of that revision will be printed.\n"
+" If a file argument is given, the revision in which the file was\n"
+" last changed (before the working directory revision or the\n"
+" argument to --rev if given) is printed."
+msgstr ""
+
+msgid "can only specify an explicit filename"
+msgstr ""
+
+#, python-format
+msgid "'%s' not found in manifest!"
+msgstr ""
+
+msgid "show aliases for remote repositories"
+msgstr "顯示 remote repositories 的別å"
+
+msgid ""
+" Show definition of symbolic path name NAME. If no name is given,\n"
+" show definition of all available names."
+msgstr ""
+
+msgid ""
+" Path names are defined in the [paths] section of your\n"
+" configuration file and in ``/etc/mercurial/hgrc``. If run inside a\n"
+" repository, ``.hg/hgrc`` is used, too."
+msgstr ""
+
+msgid ""
+" The path names ``default`` and ``default-push`` have a special\n"
+" meaning. When performing a push or pull operation, they are used\n"
+" as fallbacks if no location is specified on the command-line.\n"
+" When ``default-push`` is set, it will be used for push and\n"
+" ``default`` will be used for pull; otherwise ``default`` is used\n"
+" as the fallback for both. When cloning a repository, the clone\n"
+" source is written as ``default`` in ``.hg/hgrc``. Note that\n"
+" ``default`` and ``default-push`` apply to all inbound (e.g.\n"
+" :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and\n"
+" :hg:`bundle`) operations."
+msgstr ""
+
+msgid " See :hg:`help urls` for more information."
+msgstr "\tSee 'hg help urls' for more information."
+
+msgid "not found!\n"
+msgstr "沒有找到ï¼\n"
+
+msgid "not updating, since new heads added\n"
+msgstr "沒有更新,因為新的 heads 已加入\n"
+
+msgid "(run 'hg heads' to see heads, 'hg merge' to merge)\n"
+msgstr "(執行 'hg heads' 以顯示 heads,'hg merge' 以執行åˆä½µ)\n"
+
+msgid "(run 'hg update' to get a working copy)\n"
+msgstr "(執行 'hg update' 來å–å¾— working copy)\n"
+
+msgid "pull changes from the specified source"
+msgstr "拉收指定來æºç«¯çš„變更"
+
+msgid " Pull changes from a remote repository to a local one."
+msgstr " Pull changes from a remote repository to a local one."
+
+msgid ""
+" This finds all changes from the repository at the specified path\n"
+" or URL and adds them to a local repository (the current one unless\n"
+" -R is specified). By default, this does not update the copy of the\n"
+" project in the working directory."
+msgstr ""
+
+msgid ""
+" Use :hg:`incoming` if you want to see what would have been added\n"
+" by a pull at the time you issued this command. If you then decide\n"
+" to add those changes to the repository, you should use :hg:`pull\n"
+" -r X` where ``X`` is the last changeset listed by :hg:`incoming`."
+msgstr ""
+
+msgid ""
+" If SOURCE is omitted, the 'default' path will be used.\n"
+" See :hg:`help urls` for more information."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if an update had unresolved files.\n"
+" "
+msgstr ""
+
+msgid ""
+"other repository doesn't support revision lookup, so a rev cannot be "
+"specified."
+msgstr ""
+
+msgid "push changes to the specified destination"
+msgstr "將變更推é€åˆ°è‡³æŒ‡å®šçš„目的端"
+
+msgid ""
+" Push changesets from the local repository to the specified\n"
+" destination."
+msgstr ""
+
+msgid ""
+" This operation is symmetrical to pull: it is identical to a pull\n"
+" in the destination repository from the current one."
+msgstr ""
+
+msgid ""
+" By default, push will not allow creation of new heads at the\n"
+" destination, since multiple heads would make it unclear which head\n"
+" to use. In this situation, it is recommended to pull and merge\n"
+" before pushing."
+msgstr ""
+
+msgid ""
+" Use --new-branch if you want to allow push to create a new named\n"
+" branch that is not present at the destination. This allows you to\n"
+" only create a new branch without forcing other changes."
+msgstr ""
+
+msgid ""
+" Use -f/--force to override the default behavior and push all\n"
+" changesets on all branches."
+msgstr ""
+
+msgid ""
+" If -r/--rev is used, the specified revision and all its ancestors\n"
+" will be pushed to the remote repository."
+msgstr ""
+
+msgid ""
+" Please see :hg:`help urls` for important details about ``ssh://``\n"
+" URLs. If DESTINATION is omitted, a default path will be used."
+msgstr ""
+
+msgid ""
+" Returns 0 if push was successful, 1 if nothing to push.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "pushing to %s\n"
+msgstr ""
+
+msgid "roll back an interrupted transaction"
+msgstr "roll back 一個被中斷的 transaction"
+
+msgid " Recover from an interrupted commit or pull."
+msgstr ""
+
+msgid ""
+" This command tries to fix the repository status after an\n"
+" interrupted operation. It should only be necessary when Mercurial\n"
+" suggests it."
+msgstr ""
+
+msgid ""
+" Returns 0 if successful, 1 if nothing to recover or verify fails.\n"
+" "
+msgstr ""
+
+msgid "remove the specified files on the next commit"
+msgstr "ç§»é™¤ä¸‹æ¬¡è¦ commit 的檔案"
+
+msgid " Schedule the indicated files for removal from the repository."
+msgstr ""
+
+msgid ""
+" This only removes files from the current branch, not from the\n"
+" entire project history. -A/--after can be used to remove only\n"
+" files that have already been deleted, -f/--force can be used to\n"
+" force deletion, and -Af can be used to remove files from the next\n"
+" revision without deleting them from the working directory."
+msgstr ""
+
+msgid ""
+" The following table details the behavior of remove for different\n"
+" file states (columns) and option combinations (rows). The file\n"
+" states are Added [A], Clean [C], Modified [M] and Missing [!] (as\n"
+" reported by :hg:`status`). The actions are Warn, Remove (from\n"
+" branch) and Delete (from disk)::"
+msgstr ""
+
+msgid ""
+" A C M !\n"
+" none W RD W R\n"
+" -f R RD RD R\n"
+" -A W W W R\n"
+" -Af R R R R"
+msgstr ""
+
+msgid ""
+" This command schedules the files to be removed at the next commit.\n"
+" To undo a remove before that, see :hg:`revert`."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any warnings encountered.\n"
+" "
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is untracked\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file still exists (use -f to force removal)\n"
+msgstr ""
+
+#, python-format
+msgid "not removing %s: file is modified (use -f to force removal)\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"not removing %s: file has been marked for add (use -f to force removal)\n"
+msgstr ""
+
+msgid "rename files; equivalent of copy + remove"
+msgstr "é‡æ–°å‘½å檔案;等åŒæ–¼ copy + remove"
+
+msgid ""
+" Mark dest as copies of sources; mark sources for deletion. If dest\n"
+" is a directory, copies are put in that directory. If dest is a\n"
+" file, there can only be one source."
+msgstr ""
+
+msgid ""
+" This command takes effect at the next commit. To undo a rename\n"
+" before that, see :hg:`revert`."
+msgstr ""
+
+msgid "redo merges or set/view the merge status of files"
+msgstr "redoåˆä½µ 或是 設定/觀看 檔案的åˆä½µç‹€æ³"
+
+msgid ""
+" Merges with unresolved conflicts are often the result of\n"
+" non-interactive merging using the ``internal:merge`` configuration\n"
+" setting, or a command-line merge tool like ``diff3``. The resolve\n"
+" command is used to manage the files involved in a merge, after\n"
+" :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the\n"
+" working directory must have two parents)."
+msgstr ""
+
+msgid " The resolve command can be used in the following ways:"
+msgstr ""
+
+msgid ""
+" - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the "
+"specified\n"
+" files, discarding any previous merge attempts. Re-merging is not\n"
+" performed for files already marked as resolved. Use ``--all/-a``\n"
+" to selects all unresolved files. ``--tool`` can be used to specify\n"
+" the merge tool used for the given files. It overrides the HGMERGE\n"
+" environment variable and your configuration files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -m [FILE]`: mark a file as having been resolved\n"
+" (e.g. after having manually fixed-up the files). The default is\n"
+" to mark all unresolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The\n"
+" default is to mark all resolved files."
+msgstr ""
+
+msgid ""
+" - :hg:`resolve -l`: list files which had or still have conflicts.\n"
+" In the printed list, ``U`` = unresolved and ``R`` = resolved."
+msgstr ""
+
+msgid ""
+" Note that Mercurial will not let you commit files with unresolved\n"
+" merge conflicts. You must use :hg:`resolve -m ...` before you can\n"
+" commit after a conflicting merge."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if any files fail a resolve attempt.\n"
+" "
+msgstr ""
+
+msgid "too many options specified"
+msgstr ""
+
+msgid "can't specify --all and patterns"
+msgstr ""
+
+msgid "no files or directories specified; use --all to remerge all files"
+msgstr ""
+
+msgid "restore individual files or directories to an earlier state"
+msgstr "將特定的檔案或目錄回復æˆè¼ƒæ—©çš„狀態"
+
+msgid ""
+" .. note::\n"
+" This command is most likely not what you are looking for.\n"
+" Revert will partially overwrite content in the working\n"
+" directory without changing the working directory parents. Use\n"
+" :hg:`update -r rev` to check out earlier revisions, or\n"
+" :hg:`update --clean .` to undo a merge which has added another\n"
+" parent."
+msgstr ""
+
+msgid ""
+" With no revision specified, revert the named files or directories\n"
+" to the contents they had in the parent of the working directory.\n"
+" This restores the contents of the affected files to an unmodified\n"
+" state and unschedules adds, removes, copies, and renames. If the\n"
+" working directory has two parents, you must explicitly specify a\n"
+" revision."
+msgstr ""
+
+msgid ""
+" Using the -r/--rev option, revert the given files or directories\n"
+" to their contents as of a specific revision. This can be helpful\n"
+" to \"roll back\" some or all of an earlier change. See :hg:`help\n"
+" dates` for a list of formats valid for -d/--date."
+msgstr ""
+
+msgid ""
+" Revert modifies the working directory. It does not commit any\n"
+" changes, or change the parent of the working directory. If you\n"
+" revert to a revision other than the parent of the working\n"
+" directory, the reverted files will thus appear modified\n"
+" afterwards."
+msgstr ""
+
+msgid ""
+" If a file has been deleted, it is restored. If the executable mode\n"
+" of a file was changed, it is reset."
+msgstr ""
+
+msgid ""
+" If names are given, all files matching the names are reverted.\n"
+" If no arguments are given, no files are reverted."
+msgstr ""
+
+msgid ""
+" Modified files are saved with a .orig suffix before reverting.\n"
+" To disable these backups, use --no-backup."
+msgstr ""
+
+msgid "you can't specify a revision and a date"
+msgstr ""
+
+msgid "no files or directories specified; use --all to revert the whole repo"
+msgstr ""
+
+#, python-format
+msgid "forgetting %s\n"
+msgstr ""
+
+#, python-format
+msgid "reverting %s\n"
+msgstr "正在復原 %s\n"
+
+#, python-format
+msgid "undeleting %s\n"
+msgstr ""
+
+#, python-format
+msgid "saving current version of %s as %s\n"
+msgstr ""
+
+#, python-format
+msgid "file not managed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "no changes needed to %s\n"
+msgstr "沒有變更需è¦åŽ» %s\n"
+
+msgid "roll back the last transaction (dangerous)"
+msgstr "roll back 最後一次的 transaction(å±éšª)"
+
+msgid ""
+" This command should be used with care. There is only one level of\n"
+" rollback, and there is no way to undo a rollback. It will also\n"
+" restore the dirstate at the time of the last transaction, losing\n"
+" any dirstate changes since that time. This command does not alter\n"
+" the working directory."
+msgstr ""
+
+msgid ""
+" Transactions are used to encapsulate the effects of all commands\n"
+" that create new changesets or propagate existing changesets into a\n"
+" repository. For example, the following commands are transactional,\n"
+" and their effects can be rolled back:"
+msgstr ""
+
+msgid ""
+" - commit\n"
+" - import\n"
+" - pull\n"
+" - push (with this repository as the destination)\n"
+" - unbundle"
+msgstr ""
+
+msgid ""
+" This command is not intended for use on public repositories. Once\n"
+" changes are visible for pull by other users, rolling a transaction\n"
+" back locally is ineffective (someone else may already have pulled\n"
+" the changes). Furthermore, a race is possible with readers of the\n"
+" repository; for example an in-progress pull from the repository\n"
+" may fail if a rollback is performed."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if no rollback data is available.\n"
+" "
+msgstr ""
+
+msgid "print the root (top) of the current working directory"
+msgstr "顯示目å‰å·¥ä½œç›®éŒ„çš„ root(top)"
+
+msgid " Print the root directory of the current repository."
+msgstr "顯示目å‰å„²å­˜åº«çš„ root 目錄"
+
+msgid "start stand-alone webserver"
+msgstr "啟動常é§web伺æœå™¨"
+
+msgid ""
+" Start a local HTTP repository browser and pull server. You can use\n"
+" this for ad-hoc sharing and browing of repositories. It is\n"
+" recommended to use a real web server to serve a repository for\n"
+" longer periods of time."
+msgstr ""
+
+msgid ""
+" Please note that the server does not implement access control.\n"
+" This means that, by default, anybody can read from the server and\n"
+" nobody can write to it by default. Set the ``web.allow_push``\n"
+" option to ``*`` to allow everybody to push to the server. You\n"
+" should use a real web server if you need to authenticate users."
+msgstr ""
+
+msgid ""
+" By default, the server logs accesses to stdout and errors to\n"
+" stderr. Use the -A/--accesslog and -E/--errorlog options to log to\n"
+" files."
+msgstr ""
+
+msgid ""
+" To have the server choose a free port number to listen on, specify\n"
+" a port number of 0; in this case, the server will print the port\n"
+" number it uses."
+msgstr ""
+
+msgid "There is no Mercurial repository here (.hg not found)"
+msgstr "這邊沒有Mercurial 儲存庫(找ä¸åˆ° .hg)"
+
+#, python-format
+msgid "listening at http://%s%s/%s (bound to %s:%d)\n"
+msgstr ""
+
+msgid "show changed files in the working directory"
+msgstr "顯示工作目錄的狀態"
+
+msgid ""
+" Show status of files in the repository. If names are given, only\n"
+" files that match are shown. Files that are clean or ignored or\n"
+" the source of a copy/move operation, are not listed unless\n"
+" -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.\n"
+" Unless options described with \"show only ...\" are given, the\n"
+" options -mardu are used."
+msgstr ""
+
+msgid ""
+" Option -q/--quiet hides untracked (unknown and ignored) files\n"
+" unless explicitly requested with -u/--unknown or -i/--ignored."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" status may appear to disagree with diff if permissions have\n"
+" changed or a merge has occurred. The standard diff format does\n"
+" not report permission changes and diff only reports changes\n"
+" relative to one merge parent."
+msgstr ""
+
+msgid ""
+" If one revision is given, it is used as the base revision.\n"
+" If two revisions are given, the differences between them are\n"
+" shown. The --change option can also be used as a shortcut to list\n"
+" the changed files of a revision from its first parent."
+msgstr ""
+
+msgid " The codes used to show the status of files are::"
+msgstr ""
+
+msgid ""
+" M = modified\n"
+" A = added\n"
+" R = removed\n"
+" C = clean\n"
+" ! = missing (deleted by non-hg command, but still tracked)\n"
+" ? = not tracked\n"
+" I = ignored\n"
+" = origin of the previous file listed as A (added)"
+msgstr ""
+
+msgid "summarize working directory state"
+msgstr "摘錄工作目錄的狀態"
+
+msgid ""
+" This generates a brief summary of the working directory state,\n"
+" including parents, branch, commit status, and available updates."
+msgstr ""
+
+msgid ""
+" With the --remote option, this will check the default paths for\n"
+" incoming and outgoing changes. This can be time-consuming."
+msgstr ""
+
+#, python-format
+msgid "parent: %d:%s "
+msgstr "æ¯ç³»:\t\t%d:%s"
+
+msgid " (empty repository)"
+msgstr "(空白的儲存庫)"
+
+msgid " (no revision checked out)"
+msgstr ""
+
+#, python-format
+msgid "branch: %s\n"
+msgstr "分支:\t\t %s\n"
+
+#, python-format
+msgid "%d modified"
+msgstr "%d 修改"
+
+#, python-format
+msgid "%d added"
+msgstr "%d 新增"
+
+#, python-format
+msgid "%d removed"
+msgstr "%d 移除"
+
+#, python-format
+msgid "%d renamed"
+msgstr "%d 改åå­—"
+
+#, python-format
+msgid "%d copied"
+msgstr "%d 複製"
+
+#, python-format
+msgid "%d deleted"
+msgstr "%d 刪除"
+
+#, python-format
+msgid "%d unknown"
+msgstr "%d ä¸æ¸…楚"
+
+#, python-format
+msgid "%d ignored"
+msgstr "%d 忽略"
+
+#, python-format
+msgid "%d unresolved"
+msgstr "%d 未解決"
+
+#, python-format
+msgid "%d subrepos"
+msgstr ""
+
+msgid " (merge)"
+msgstr "(åˆä½µ)"
+
+msgid " (new branch)"
+msgstr "(新分支)"
+
+msgid " (head closed)"
+msgstr ""
+
+msgid " (clean)"
+msgstr ""
+
+msgid " (new branch head)"
+msgstr "(新分支標頭)"
+
+#, python-format
+msgid "commit: %s\n"
+msgstr ""
+
+msgid "update: (current)\n"
+msgstr ""
+
+#, python-format
+msgid "update: %d new changesets (update)\n"
+msgstr ""
+
+#, python-format
+msgid "update: %d new changesets, %d branch heads (merge)\n"
+msgstr ""
+
+msgid "1 or more incoming"
+msgstr ""
+
+#, python-format
+msgid "%d outgoing"
+msgstr ""
+
+#, python-format
+msgid "remote: %s\n"
+msgstr "é ç«¯: %s\n"
+
+msgid "remote: (synced)\n"
+msgstr ""
+
+msgid "add one or more tags for the current or given revision"
+msgstr "å°ç›®å‰æˆ–æ供的修定版新增一或多個標記"
+
+msgid " Name a particular revision using <name>."
+msgstr ""
+
+msgid ""
+" Tags are used to name particular revisions of the repository and are\n"
+" very useful to compare different revisions, to go back to significant\n"
+" earlier versions or to mark branch points as releases, etc."
+msgstr ""
+
+msgid ""
+" If no revision is given, the parent of the working directory is\n"
+" used, or tip if no revision is checked out."
+msgstr ""
+
+msgid ""
+" To facilitate version control, distribution, and merging of tags,\n"
+" they are stored as a file named \".hgtags\" which is managed\n"
+" similarly to other project files and can be hand-edited if\n"
+" necessary. The file '.hg/localtags' is used for local tags (not\n"
+" shared among repositories)."
+msgstr ""
+
+msgid ""
+" Since tag names have priority over branch names during revision\n"
+" lookup, using an existing branch name as a tag name is discouraged."
+msgstr ""
+
+msgid "tag names must be unique"
+msgstr "標記å稱必須唯一"
+
+msgid "tag names cannot consist entirely of whitespace"
+msgstr ""
+
+msgid "--rev and --remove are incompatible"
+msgstr ""
+
+#, python-format
+msgid "tag '%s' does not exist"
+msgstr "標記 '%s' ä¸å­˜åœ¨"
+
+#, python-format
+msgid "tag '%s' is not a global tag"
+msgstr "標記'%s' ä¸æ˜¯ä¸€å€‹å…¨åŸŸæ¨™è¨˜"
+
+#, python-format
+msgid "tag '%s' is not a local tag"
+msgstr "標記'%s' ä¸æ˜¯ä¸€å€‹æœ¬åœ°ç«¯æ¨™è¨˜"
+
+#, python-format
+msgid "tag '%s' already exists (use -f to force)"
+msgstr "標記 '%s' 己經有了(使用 -f 去強制)"
+
+msgid "list repository tags"
+msgstr "列出 儲存庫 標記(s)"
+
+msgid ""
+" This lists both regular and local tags. When the -v/--verbose\n"
+" switch is used, a third column \"local\" is printed for local tags."
+msgstr ""
+
+msgid "show the tip revision"
+msgstr "顯示 tip 版本"
+
+msgid ""
+" The tip revision (usually just called the tip) is the changeset\n"
+" most recently added to the repository (and therefore the most\n"
+" recently changed head)."
+msgstr ""
+
+msgid ""
+" If you have just made a commit, that commit will be the tip. If\n"
+" you have just pulled changes from another repository, the tip of\n"
+" that repository becomes the current tip. The \"tip\" tag is special\n"
+" and cannot be renamed or assigned to a different changeset."
+msgstr ""
+
+msgid "apply one or more changegroup files"
+msgstr "套用一或多個 changegroup 檔案"
+
+msgid ""
+" Apply one or more compressed changegroup files generated by the\n"
+" bundle command."
+msgstr ""
+
+msgid ""
+" Returns 0 on success, 1 if an update has unresolved files.\n"
+" "
+msgstr ""
+
+msgid "update working directory (or switch revisions)"
+msgstr "更新工作目錄(也å¯ä»¥ç”¨ä¾†åˆ‡æ›ç‰ˆæœ¬è™Ÿ)"
+
+msgid ""
+" Update the repository's working directory to the specified\n"
+" changeset. If no changeset is specified, update to the tip of the\n"
+" current named branch."
+msgstr ""
+
+msgid ""
+" If the changeset is not a descendant of the working directory's\n"
+" parent, the update is aborted. With the -c/--check option, the\n"
+" working directory is checked for uncommitted changes; if none are\n"
+" found, the working directory is updated to the specified\n"
+" changeset."
+msgstr ""
+
+msgid ""
+" The following rules apply when the working directory contains\n"
+" uncommitted changes:"
+msgstr ""
+
+msgid ""
+" 1. If neither -c/--check nor -C/--clean is specified, and if\n"
+" the requested changeset is an ancestor or descendant of\n"
+" the working directory's parent, the uncommitted changes\n"
+" are merged into the requested changeset and the merged\n"
+" result is left uncommitted. If the requested changeset is\n"
+" not an ancestor or descendant (that is, it is on another\n"
+" branch), the update is aborted and the uncommitted changes\n"
+" are preserved."
+msgstr ""
+
+msgid ""
+" 2. With the -c/--check option, the update is aborted and the\n"
+" uncommitted changes are preserved."
+msgstr ""
+
+msgid ""
+" 3. With the -C/--clean option, uncommitted changes are discarded and\n"
+" the working directory is updated to the requested changeset."
+msgstr ""
+
+msgid ""
+" Use null as the changeset to remove the working directory (like\n"
+" :hg:`clone -U`)."
+msgstr ""
+
+msgid ""
+" If you want to update just one file to an older changeset, use\n"
+" :hg:`revert`."
+msgstr ""
+
+msgid "cannot specify both -c/--check and -C/--clean"
+msgstr ""
+
+msgid "uncommitted local changes"
+msgstr ""
+
+msgid "verify the integrity of the repository"
+msgstr "驗證 repository 的完整性"
+
+msgid " Verify the integrity of the current repository."
+msgstr ""
+
+msgid ""
+" This will perform an extensive check of the repository's\n"
+" integrity, validating the hashes and checksums of each entry in\n"
+" the changelog, manifest, and tracked files, as well as the\n"
+" integrity of their crosslinks and indices."
+msgstr ""
+
+msgid "output version and copyright information"
+msgstr "輸出版本以åŠç‰ˆæ¬Šè³‡è¨Š"
+
+#, python-format
+msgid "Mercurial Distributed SCM (version %s)\n"
+msgstr "mercurial 分散å¼ç‰ˆæœ¬æŽ§åˆ¶ç³»çµ± (版本 %s)\n"
+
+#, fuzzy
+msgid "(see http://mercurial.selenic.com for more information)"
+msgstr "\tSee 'hg help urls' for more information."
+
+msgid ""
+"Copyright (C) 2005-2010 Matt Mackall and others\n"
+"This is free software; see the source for copying conditions. There is NO\n"
+"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+msgstr ""
+
+msgid "repository root directory or name of overlay bundle file"
+msgstr ""
+
+msgid "DIR"
+msgstr ""
+
+msgid "change working directory"
+msgstr ""
+
+msgid "do not prompt, assume 'yes' for any required answers"
+msgstr ""
+
+msgid "suppress output"
+msgstr ""
+
+msgid "enable additional output"
+msgstr ""
+
+msgid "set/override config option (use 'section.name=value')"
+msgstr ""
+
+msgid "CONFIG"
+msgstr ""
+
+msgid "enable debugging output"
+msgstr ""
+
+msgid "start debugger"
+msgstr ""
+
+msgid "set the charset encoding"
+msgstr ""
+
+msgid "ENCODE"
+msgstr ""
+
+msgid "MODE"
+msgstr ""
+
+msgid "set the charset encoding mode"
+msgstr ""
+
+msgid "always print a traceback on exception"
+msgstr ""
+
+msgid "time how long the command takes"
+msgstr ""
+
+msgid "print command execution profile"
+msgstr ""
+
+msgid "output version information and exit"
+msgstr ""
+
+msgid "display help and exit"
+msgstr ""
+
+msgid "do not perform actions, just print output"
+msgstr "ä¸è¦çœŸçš„行動,åªè¦é¡¯ç¤ºè¼¸å‡º"
+
+msgid "specify ssh command to use"
+msgstr ""
+
+msgid "specify hg command to run on the remote side"
+msgstr ""
+
+msgid "PATTERN"
+msgstr ""
+
+msgid "include names matching the given patterns"
+msgstr "å«æ‹¬ç¬¦åˆæª”案表示å¼çš„檔案"
+
+msgid "exclude names matching the given patterns"
+msgstr "排除符åˆæª”案表示å¼çš„檔案"
+
+msgid "use text as commit message"
+msgstr ""
+
+msgid "read commit message from file"
+msgstr ""
+
+msgid "record datecode as commit date"
+msgstr ""
+
+msgid "record the specified user as committer"
+msgstr ""
+
+msgid "STYLE"
+msgstr ""
+
+msgid "display using template map file"
+msgstr ""
+
+msgid "display with template"
+msgstr ""
+
+msgid "do not show merges"
+msgstr ""
+
+msgid "output diffstat-style summary of changes"
+msgstr ""
+
+msgid "treat all files as text"
+msgstr ""
+
+msgid "omit dates from diff headers"
+msgstr ""
+
+msgid "show which function each change is in"
+msgstr ""
+
+msgid "produce a diff that undoes the changes"
+msgstr ""
+
+msgid "ignore white space when comparing lines"
+msgstr ""
+
+msgid "ignore changes in the amount of white space"
+msgstr ""
+
+msgid "ignore changes whose lines are all blank"
+msgstr ""
+
+msgid "number of lines of context to show"
+msgstr ""
+
+msgid "SIMILARITY"
+msgstr ""
+
+msgid "guess renamed files by similarity (0<=s<=100)"
+msgstr ""
+
+msgid "recurse into subrepositories"
+msgstr ""
+
+msgid "[OPTION]... [FILE]..."
+msgstr ""
+
+msgid "annotate the specified revision"
+msgstr "追溯æ述的版本號"
+
+msgid "follow copies/renames and list the filename (DEPRECATED)"
+msgstr ""
+
+msgid "don't follow copies and renames"
+msgstr ""
+
+msgid "list the author (long with -v)"
+msgstr ""
+
+msgid "list the filename"
+msgstr ""
+
+msgid "list the date (short with -q)"
+msgstr ""
+
+msgid "list the revision number (default)"
+msgstr ""
+
+msgid "list the changeset"
+msgstr ""
+
+msgid "show line number at the first appearance"
+msgstr ""
+
+msgid "[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE..."
+msgstr ""
+
+msgid "do not pass files through decoders"
+msgstr ""
+
+msgid "PREFIX"
+msgstr ""
+
+msgid "directory prefix for files in archive"
+msgstr ""
+
+msgid "revision to distribute"
+msgstr ""
+
+msgid "type of distribution to create"
+msgstr ""
+
+msgid "[OPTION]... DEST"
+msgstr ""
+
+msgid "merge with old dirstate parent after backout"
+msgstr ""
+
+msgid "parent to choose when backing out merge"
+msgstr ""
+
+msgid "specify merge tool"
+msgstr ""
+
+msgid "revision to backout"
+msgstr ""
+
+msgid "[OPTION]... [-r] REV"
+msgstr ""
+
+msgid "reset bisect state"
+msgstr ""
+
+msgid "mark changeset good"
+msgstr ""
+
+msgid "mark changeset bad"
+msgstr ""
+
+msgid "skip testing changeset"
+msgstr ""
+
+msgid "use command to check changeset state"
+msgstr ""
+
+msgid "do not update to target"
+msgstr ""
+
+msgid "[-gbsr] [-U] [-c CMD] [REV]"
+msgstr ""
+
+msgid "set branch name even if it shadows an existing branch"
+msgstr ""
+
+msgid "reset branch name to parent branch name"
+msgstr ""
+
+msgid "[-fC] [NAME]"
+msgstr ""
+
+msgid "show only branches that have unmerged heads"
+msgstr ""
+
+msgid "show normal and closed branches"
+msgstr ""
+
+msgid "[-ac]"
+msgstr ""
+
+msgid "run even when the destination is unrelated"
+msgstr ""
+
+msgid "a changeset intended to be added to the destination"
+msgstr ""
+
+msgid "a specific branch you would like to bundle"
+msgstr ""
+
+msgid "a base changeset assumed to be available at the destination"
+msgstr ""
+
+msgid "bundle all changesets in the repository"
+msgstr ""
+
+msgid "bundle compression type to use"
+msgstr ""
+
+msgid "[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]"
+msgstr ""
+
+msgid "print output to file with formatted name"
+msgstr ""
+
+msgid "print the given revision"
+msgstr ""
+
+msgid "apply any matching decode filter"
+msgstr ""
+
+msgid "[OPTION]... FILE..."
+msgstr ""
+
+msgid "the clone will include an empty working copy (only a repository)"
+msgstr ""
+
+msgid "revision, tag or branch to check out"
+msgstr ""
+
+msgid "include the specified changeset"
+msgstr ""
+
+msgid "clone only the specified branch"
+msgstr ""
+
+msgid "[OPTION]... SOURCE [DEST]"
+msgstr ""
+
+msgid "mark new/missing files as added/removed before committing"
+msgstr ""
+
+msgid "mark a branch as closed, hiding it from the branch list"
+msgstr ""
+
+msgid "record a copy that has already occurred"
+msgstr ""
+
+msgid "forcibly copy over an existing managed file"
+msgstr ""
+
+msgid "[OPTION]... [SOURCE]... DEST"
+msgstr ""
+
+msgid "[INDEX] REV1 REV2"
+msgstr ""
+
+msgid "add single file mergeable changes"
+msgstr ""
+
+msgid "add single file all revs append to"
+msgstr ""
+
+msgid "add single file all revs overwrite"
+msgstr ""
+
+msgid "add new file at each rev"
+msgstr ""
+
+msgid "[OPTION]... TEXT"
+msgstr ""
+
+msgid "[COMMAND]"
+msgstr ""
+
+msgid "show the command options"
+msgstr ""
+
+msgid "[-o] CMD"
+msgstr ""
+
+msgid "use tags as labels"
+msgstr ""
+
+msgid "annotate with branch names"
+msgstr ""
+
+msgid "use dots for runs"
+msgstr ""
+
+msgid "separate elements by spaces"
+msgstr ""
+
+msgid "[OPTION]... [FILE [REV]...]"
+msgstr ""
+
+msgid "try extended date formats"
+msgstr ""
+
+msgid "[-e] DATE [RANGE]"
+msgstr ""
+
+msgid "FILE REV"
+msgstr ""
+
+msgid "[PATH]"
+msgstr ""
+
+msgid "revlog format"
+msgstr ""
+
+msgid "REPO NAMESPACE [KEY OLD NEW]"
+msgstr ""
+
+msgid "revision to rebuild to"
+msgstr ""
+
+msgid "[-r REV] [REV]"
+msgstr ""
+
+msgid "revision to debug"
+msgstr ""
+
+msgid "[-r REV] FILE"
+msgstr ""
+
+msgid "REV1 [REV2]"
+msgstr ""
+
+msgid "do not display the saved mtime"
+msgstr ""
+
+msgid "[OPTION]..."
+msgstr ""
+
+msgid "revision to check"
+msgstr ""
+
+msgid "[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]..."
+msgstr ""
+
+msgid "diff against the second parent"
+msgstr ""
+
+msgid "revisions to export"
+msgstr ""
+
+msgid "[OPTION]... [-o OUTFILESPEC] REV..."
+msgstr ""
+
+msgid "end fields with NUL"
+msgstr ""
+
+msgid "print all revisions that match"
+msgstr ""
+
+msgid "follow changeset history, or file history across copies and renames"
+msgstr ""
+
+msgid "ignore case when matching"
+msgstr ""
+
+msgid "print only filenames and revisions that match"
+msgstr ""
+
+msgid "print matching line numbers"
+msgstr ""
+
+msgid "only search files changed within revision range"
+msgstr ""
+
+msgid "[OPTION]... PATTERN [FILE]..."
+msgstr ""
+
+msgid "show only heads which are descendants of STARTREV"
+msgstr ""
+
+msgid "STARTREV"
+msgstr ""
+
+msgid "show topological heads only"
+msgstr ""
+
+msgid "show active branchheads only (DEPRECATED)"
+msgstr ""
+
+msgid "show normal and closed branch heads"
+msgstr ""
+
+msgid "[-ac] [-r STARTREV] [REV]..."
+msgstr ""
+
+msgid "[TOPIC]"
+msgstr ""
+
+msgid "identify the specified revision"
+msgstr ""
+
+msgid "show local revision number"
+msgstr ""
+
+msgid "show global revision id"
+msgstr ""
+
+msgid "show branch"
+msgstr ""
+
+msgid "show tags"
+msgstr ""
+
+msgid "[-nibt] [-r REV] [SOURCE]"
+msgstr ""
+
+msgid ""
+"directory strip option for patch. This has the same meaning as the "
+"corresponding patch option"
+msgstr ""
+
+msgid "PATH"
+msgstr ""
+
+msgid "base path"
+msgstr ""
+
+msgid "skip check for outstanding uncommitted changes"
+msgstr ""
+
+msgid "don't commit, just update the working directory"
+msgstr ""
+
+msgid "apply patch to the nodes from which it was generated"
+msgstr ""
+
+msgid "use any branch information in patch (implied by --exact)"
+msgstr ""
+
+msgid "[OPTION]... PATCH..."
+msgstr ""
+
+msgid "run even if remote repository is unrelated"
+msgstr ""
+
+msgid "show newest record first"
+msgstr ""
+
+msgid "file to store the bundles into"
+msgstr ""
+
+msgid "a remote changeset intended to be added"
+msgstr ""
+
+msgid "a specific branch you would like to pull"
+msgstr ""
+
+msgid "[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]"
+msgstr ""
+
+msgid "[-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "search the repository as it is in REV"
+msgstr ""
+
+msgid "end filenames with NUL, for use with xargs"
+msgstr ""
+
+msgid "print complete paths from the filesystem root"
+msgstr ""
+
+msgid "[OPTION]... [PATTERN]..."
+msgstr ""
+
+msgid "only follow the first parent of merge changesets"
+msgstr ""
+
+msgid "show revisions matching date spec"
+msgstr ""
+
+msgid "show copied files"
+msgstr ""
+
+msgid "do case-insensitive search for a given text"
+msgstr ""
+
+msgid "include revisions where files were removed"
+msgstr ""
+
+msgid "show only merges"
+msgstr ""
+
+msgid "revisions committed by user"
+msgstr ""
+
+msgid "show only changesets within the given named branch (DEPRECATED)"
+msgstr ""
+
+msgid "show changesets within the given named branch"
+msgstr ""
+
+msgid "do not display revision or any of its ancestors"
+msgstr ""
+
+msgid "[OPTION]... [FILE]"
+msgstr ""
+
+msgid "revision to display"
+msgstr ""
+
+msgid "[-r REV]"
+msgstr ""
+
+msgid "force a merge with outstanding changes"
+msgstr ""
+
+msgid "revision to merge"
+msgstr ""
+
+msgid "review revisions to merge (no merge is performed)"
+msgstr ""
+
+msgid "[-P] [-f] [[-r] REV]"
+msgstr ""
+
+msgid "a changeset intended to be included in the destination"
+msgstr ""
+
+msgid "a specific branch you would like to push"
+msgstr ""
+
+msgid "[-M] [-p] [-n] [-f] [-r REV]... [DEST]"
+msgstr ""
+
+msgid "show parents of the specified revision"
+msgstr ""
+
+msgid "[-r REV] [FILE]"
+msgstr ""
+
+msgid "[NAME]"
+msgstr ""
+
+msgid "update to new branch head if changesets were pulled"
+msgstr ""
+
+msgid "run even when remote repository is unrelated"
+msgstr ""
+
+msgid "[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]"
+msgstr ""
+
+msgid "force push"
+msgstr ""
+
+msgid "allow pushing a new branch"
+msgstr ""
+
+msgid "[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]"
+msgstr ""
+
+msgid "record delete for missing files"
+msgstr ""
+
+msgid "remove (and delete) file even if added or modified"
+msgstr ""
+
+msgid "record a rename that has already occurred"
+msgstr ""
+
+msgid "[OPTION]... SOURCE... DEST"
+msgstr ""
+
+msgid "select all unresolved files"
+msgstr ""
+
+msgid "list state of files needing merge"
+msgstr ""
+
+msgid "mark files as resolved"
+msgstr ""
+
+msgid "mark files as unresolved"
+msgstr ""
+
+msgid "hide status prefix"
+msgstr ""
+
+msgid "revert all changes when no arguments given"
+msgstr ""
+
+msgid "tipmost revision matching date"
+msgstr ""
+
+msgid "revert to the specified revision"
+msgstr ""
+
+msgid "do not save backup copies of files"
+msgstr ""
+
+msgid "[OPTION]... [-r REV] [NAME]..."
+msgstr ""
+
+msgid "name of access log file to write to"
+msgstr ""
+
+msgid "name of error log file to write to"
+msgstr ""
+
+msgid "PORT"
+msgstr ""
+
+msgid "port to listen on (default: 8000)"
+msgstr ""
+
+msgid "ADDR"
+msgstr ""
+
+msgid "address to listen on (default: all interfaces)"
+msgstr ""
+
+msgid "prefix path to serve from (default: server root)"
+msgstr ""
+
+msgid "name to show in web pages (default: working directory)"
+msgstr ""
+
+msgid "name of the hgweb config file (see \"hg help hgweb\")"
+msgstr ""
+
+msgid "name of the hgweb config file (DEPRECATED)"
+msgstr ""
+
+msgid "for remote clients"
+msgstr ""
+
+msgid "web templates to use"
+msgstr ""
+
+msgid "template style to use"
+msgstr ""
+
+msgid "use IPv6 in addition to IPv4"
+msgstr ""
+
+msgid "SSL certificate file"
+msgstr ""
+
+msgid "show untrusted configuration options"
+msgstr ""
+
+msgid "[-u] [NAME]..."
+msgstr ""
+
+msgid "check for push and pull"
+msgstr ""
+
+msgid "show status of all files"
+msgstr ""
+
+msgid "show only modified files"
+msgstr ""
+
+msgid "show only added files"
+msgstr ""
+
+msgid "show only removed files"
+msgstr ""
+
+msgid "show only deleted (but tracked) files"
+msgstr ""
+
+msgid "show only files without changes"
+msgstr ""
+
+msgid "show only unknown (not tracked) files"
+msgstr ""
+
+msgid "show only ignored files"
+msgstr ""
+
+msgid "show source of copied files"
+msgstr ""
+
+msgid "show difference from revision"
+msgstr ""
+
+msgid "list the changed files of a revision"
+msgstr ""
+
+msgid "replace existing tag"
+msgstr "覆蓋已存在的標記"
+
+msgid "make the tag local"
+msgstr ""
+
+msgid "revision to tag"
+msgstr ""
+
+msgid "remove a tag"
+msgstr "移除一個標記"
+
+msgid "use <text> as commit message"
+msgstr ""
+
+msgid "[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME..."
+msgstr ""
+
+msgid "[-p] [-g]"
+msgstr ""
+
+msgid "update to new branch head if changesets were unbundled"
+msgstr ""
+
+msgid "[-u] FILE..."
+msgstr ""
+
+msgid "discard uncommitted changes (no backup)"
+msgstr "å–消沒有æ交的變更(沒有備份)"
+
+msgid "update across branches if no uncommitted changes"
+msgstr ""
+
+msgid "[-c] [-C] [-d DATE] [[-r] REV]"
+msgstr ""
+
+#, python-format
+msgid "cannot include %s (%s)"
+msgstr "ä¸èƒ½å¼•å…¥ %s (%s)"
+
+msgid "not found in manifest"
+msgstr ""
+
+#, python-format
+msgid "no such file in rev %s"
+msgstr ""
+
+msgid "branch name not in UTF-8!"
+msgstr "分支å稱ä¸æ˜¯UTF-8編碼!"
+
+#, python-format
+msgid "%s does not exist!\n"
+msgstr "%s ä¸å­˜åœ¨å–”!\n"
+
+#, python-format
+msgid ""
+"%s: up to %d MB of RAM may be required to manage this file\n"
+"(use 'hg revert %s' to cancel the pending addition)\n"
+msgstr ""
+
+#, python-format
+msgid "%s not added: only files and symlinks supported currently\n"
+msgstr "%s ä¸èƒ½æ–°å¢ž : ç›®å‰åªæœ‰æ”¯æ´æª”案跟符號連çµæª”\n"
+
+#, python-format
+msgid "%s already tracked!\n"
+msgstr "%s 已經追蹤!\n"
+
+#, python-format
+msgid "%s not added!\n"
+msgstr "%sä¸èƒ½æ–°å¢ž!\n"
+
+#, python-format
+msgid "%s still exists!\n"
+msgstr "%sä»ç„¶å­˜åœ¨!\n"
+
+#, python-format
+msgid "%s not tracked!\n"
+msgstr "%s ä¸èƒ½è¿½è¹¤!\n"
+
+#, python-format
+msgid "%s not removed!\n"
+msgstr "%s ä¸èƒ½ç§»é™¤!\n"
+
+#, python-format
+msgid "copy failed: %s is not a file or a symbolic link\n"
+msgstr "複製失敗: %s ä¸æ˜¯æª”案或符號連çµæª”\n"
+
+#, python-format
+msgid "invalid character in dag description: %s..."
+msgstr ""
+
+#, python-format
+msgid "expected id %i, got %i"
+msgstr ""
+
+#, python-format
+msgid "parent id %i is larger than current id %i"
+msgstr "æ¯ç³»id %i 大於目å‰çš„id %i"
+
+#, python-format
+msgid "invalid event type in dag: %s"
+msgstr ""
+
+msgid "working directory state appears damaged!"
+msgstr ""
+
+#, python-format
+msgid "'\\n' and '\\r' disallowed in filenames: %r"
+msgstr "檔åä¸å‡†æœ‰\\n è·Ÿ \\r: %r"
+
+#, python-format
+msgid "directory %r already in dirstate"
+msgstr ""
+
+#, python-format
+msgid "file %r in dirstate clashes with %r"
+msgstr ""
+
+#, python-format
+msgid "setting %r to other parent only allowed in merges"
+msgstr ""
+
+#, python-format
+msgid "not in dirstate: %s\n"
+msgstr ""
+
+msgid "unknown"
+msgstr "ä¸æ¸…楚"
+
+msgid "character device"
+msgstr "å­—å…ƒè£ç½®"
+
+msgid "block device"
+msgstr "å€å¡Šè£ç½®"
+
+msgid "fifo"
+msgstr ""
+
+msgid "socket"
+msgstr ""
+
+msgid "directory"
+msgstr "目錄"
+
+#, python-format
+msgid "unsupported file type (type is %s)"
+msgstr "ä¸æ”¯æ´çš„檔案型態 (型態是 %s)"
+
+msgid "searching for changes\n"
+msgstr "正在æœå°‹è®Šæ›´\n"
+
+msgid "queries"
+msgstr ""
+
+msgid "searching"
+msgstr "æœå°‹ä¸­"
+
+msgid "already have changeset "
+msgstr "已經有changeset了"
+
+msgid "warning: repository is unrelated\n"
+msgstr ""
+
+msgid "repository is unrelated"
+msgstr ""
+
+#, python-format
+msgid "push creates new remote branches: %s!"
+msgstr "push 建立新的é ç«¯åˆ†æ”¯ '%s'!"
+
+msgid "use 'hg push --new-branch' to create new remote branches"
+msgstr "使用 'hg push --new-branch' 建立新的é ç«¯åˆ†æ”¯"
+
+#, python-format
+msgid "push creates new remote heads on branch '%s'!"
+msgstr "push 在分支 '%s'建立新的é ç«¯æ¨™é ­!"
+
+msgid "push creates new remote heads!"
+msgstr "push 建立新的é ç«¯æ¨™é ­(heads)!"
+
+msgid "you should pull and merge or use push -f to force"
+msgstr ""
+
+msgid "did you forget to merge? use push -f to force"
+msgstr ""
+
+msgid "note: unsynced remote changes!\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s\n"
+msgstr "中止: %s\n"
+
+#, python-format
+msgid "(%s)\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error at %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: parse error: %s\n"
+msgstr ""
+
+msgid "entering debugger - type c to continue starting hg or h for help\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"hg: command '%s' is ambiguous:\n"
+" %s\n"
+msgstr ""
+
+#, python-format
+msgid "timed out waiting for lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "lock held by %s"
+msgstr ""
+
+#, python-format
+msgid "abort: %s: %s\n"
+msgstr "中止: %s: %s\n"
+
+#, python-format
+msgid "abort: could not lock %s: %s\n"
+msgstr "中止: 我ä¸èƒ½éŽ–ä½ %s: %s\n"
+
+#, python-format
+msgid "hg %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "hg: %s\n"
+msgstr ""
+
+#, python-format
+msgid "abort: %s!\n"
+msgstr "中止: %s!\n"
+
+#, python-format
+msgid "abort: %s"
+msgstr "中止: %s"
+
+msgid " empty string\n"
+msgstr "空字串\n"
+
+msgid "killed!\n"
+msgstr ""
+
+#, python-format
+msgid "hg: unknown command '%s'\n"
+msgstr "hg: ä¸èªå¾—'%s'命令\n"
+
+msgid "(did you forget to compile extensions?)\n"
+msgstr "(你忘記編譯é¡å¤–功能(extensions)?)\n"
+
+msgid "(is your Python install correct?)\n"
+msgstr "(python安è£æ­£ç¢ºå˜›?)\n"
+
+#, python-format
+msgid "abort: error: %s\n"
+msgstr ""
+
+msgid "broken pipe\n"
+msgstr ""
+
+msgid "interrupted!\n"
+msgstr ""
+
+msgid ""
+"\n"
+"broken pipe\n"
+msgstr ""
+
+msgid "abort: out of memory\n"
+msgstr "中止: 記憶體沒了\n"
+
+msgid "** unknown exception encountered, please report by visiting\n"
+msgstr ""
+
+msgid "** http://mercurial.selenic.com/wiki/BugTracker\n"
+msgstr ""
+
+#, python-format
+msgid "** Python %s\n"
+msgstr ""
+
+#, python-format
+msgid "** Mercurial Distributed SCM (version %s)\n"
+msgstr ""
+
+#, python-format
+msgid "** Extensions loaded: %s\n"
+msgstr "** 載入é¡å¤–套件: %s\n"
+
+#, python-format
+msgid "no definition for alias '%s'\n"
+msgstr ""
+
+#, python-format
+msgid ""
+"error in definition for alias '%s': %s may only be given on the command "
+"line\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to unknown command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "alias '%s' resolves to ambiguous command '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "malformed --config option: %r (use --config section.name=value)"
+msgstr ""
+
+#, python-format
+msgid "error getting current working directory: %s"
+msgstr ""
+
+#, python-format
+msgid "extension '%s' overrides commands: %s\n"
+msgstr ""
+
+msgid "option --config may not be abbreviated!"
+msgstr ""
+
+msgid "option --cwd may not be abbreviated!"
+msgstr ""
+
+msgid ""
+"Option -R has to be separated from other options (e.g. not -qR) and --"
+"repository may only be abbreviated as --repo!"
+msgstr ""
+
+#, python-format
+msgid "Time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n"
+msgstr ""
+
+#, python-format
+msgid "repository '%s' is not local"
+msgstr "'%s' 儲存庫ä¸åœ¨æœ¬åœ°ç«¯"
+
+msgid "warning: --repository ignored\n"
+msgstr ""
+
+msgid "invalid arguments"
+msgstr "無效的åƒæ•¸"
+
+#, python-format
+msgid "unrecognized profiling format '%s' - Ignored\n"
+msgstr ""
+
+msgid ""
+"lsprof not available - install from http://codespeak.net/svn/user/arigo/hack/"
+"misc/lsprof/"
+msgstr ""
+
+#, python-format
+msgid "*** failed to import extension %s from %s: %s\n"
+msgstr "*** 匯入é¡å¤–套件 %s 失敗,路徑為 %s: %s\n"
+
+#, python-format
+msgid "*** failed to import extension %s: %s\n"
+msgstr "*** 匯入é¡å¤–套件 %s 失敗: %s\n"
+
+#, python-format
+msgid "couldn't find merge tool %s\n"
+msgstr "找ä¸åˆ°åˆä½µå·¥å…· %s\n"
+
+#, python-format
+msgid "tool %s can't handle symlinks\n"
+msgstr "%s å·¥å…·ç„¡æ³•è™•ç† symlinks\n"
+
+#, python-format
+msgid "tool %s can't handle binary\n"
+msgstr "%s å·¥å…·ç„¡æ³•è™•ç† binary\n"
+
+#, python-format
+msgid "tool %s requires a GUI\n"
+msgstr "%s å·¥å…·éœ€è¦ GUI 環境\n"
+
+#, python-format
+msgid ""
+" no tool found to merge %s\n"
+"keep (l)ocal or take (o)ther?"
+msgstr ""
+" 找ä¸åˆ°å·¥å…·å¯ç”¨ä¾†åˆä½µ %s\n"
+"ç¶­æŒ (l)ocal 還是é¸ç”¨ (o)ther?"
+
+msgid "&Local"
+msgstr ""
+
+msgid "&Other"
+msgstr ""
+
+#, python-format
+msgid "merging %s and %s to %s\n"
+msgstr "åˆä½µ %s å’Œ %s 至 %s\n"
+
+#, python-format
+msgid "merging %s\n"
+msgstr "åˆä½µ %s 中\n"
+
+#, python-format
+msgid "%s.premerge not valid ('%s' is neither boolean nor %s)"
+msgstr ""
+
+#, python-format
+msgid "was merge of '%s' successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid ""
+" output file %s appears unchanged\n"
+"was merge successful (yn)?"
+msgstr ""
+
+#, python-format
+msgid "merging %s failed!\n"
+msgstr "åˆä½µ %s 失敗ï¼\n"
+
+msgid "starting revisions are not directly related"
+msgstr ""
+
+#, python-format
+msgid "inconsistent state, %s:%s is good and bad"
+msgstr ""
+
+#, python-format
+msgid "unknown bisect kind %s"
+msgstr ""
+
+msgid "disabled extensions:"
+msgstr "ä¸èƒ½ä½¿ç”¨çš„é¡å¤–套件:"
+
+msgid "Configuration Files"
+msgstr "設定檔"
+
+msgid "Date Formats"
+msgstr "日期格å¼"
+
+msgid "File Name Patterns"
+msgstr "檔案å稱樣å¼"
+
+msgid "Environment Variables"
+msgstr "環境變數"
+
+msgid "Specifying Single Revisions"
+msgstr "表述一個版本"
+
+msgid "Specifying Multiple Revisions"
+msgstr "表述多個版本"
+
+msgid "Specifying Revision Sets"
+msgstr "表述版本集åˆ"
+
+msgid "Diff Formats"
+msgstr "Diff æ ¼å¼"
+
+msgid "Merge Tools"
+msgstr "åˆä½µå·¥å…·"
+
+msgid "Template Usage"
+msgstr "樣å¼çš„使用"
+
+msgid "URL Paths"
+msgstr "URL路徑"
+
+msgid "Using additional features"
+msgstr "使用é¡å¤–功能"
+
+#, fuzzy
+msgid "Subrepositories"
+msgstr "儲存庫 %s"
+
+msgid "Configuring hgweb"
+msgstr "設定 hgweb"
+
+msgid "Glossary"
+msgstr ""
+
+msgid ""
+"Mercurial reads configuration data from several files, if they exist.\n"
+"Below we list the most specific file first."
+msgstr ""
+
+msgid "On Windows, these configuration files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>\\.hg\\hgrc``\n"
+"- ``%USERPROFILE%\\.hgrc``\n"
+"- ``%USERPROFILE%\\mercurial.ini``\n"
+"- ``%HOME%\\.hgrc``\n"
+"- ``%HOME%\\mercurial.ini``\n"
+"- ``C:\\mercurial\\mercurial.ini`` (unless regkey or hgrc.d\\ or mercurial."
+"ini found)\n"
+"- ``HKEY_LOCAL_MACHINE\\SOFTWARE\\Mercurial`` (unless hgrc.d\\ or mercurial."
+"ini found)\n"
+"- ``<hg.exe-dir>\\hgrc.d\\*.rc`` (unless mercurial.ini found)\n"
+"- ``<hg.exe-dir>\\mercurial.ini``"
+msgstr ""
+
+msgid "On Unix, these files are read:"
+msgstr ""
+
+msgid ""
+"- ``<repo>/.hg/hgrc``\n"
+"- ``$HOME/.hgrc``\n"
+"- ``/etc/mercurial/hgrc``\n"
+"- ``/etc/mercurial/hgrc.d/*.rc``\n"
+"- ``<install-root>/etc/mercurial/hgrc``\n"
+"- ``<install-root>/etc/mercurial/hgrc.d/*.rc``"
+msgstr ""
+
+msgid ""
+"If there is a per-repository configuration file which is not owned by\n"
+"the active user, Mercurial will warn you that the file is skipped::"
+msgstr ""
+
+msgid ""
+" not trusting file <repo>/.hg/hgrc from untrusted user USER, group GROUP"
+msgstr ""
+
+msgid ""
+"If this bothers you, the warning can be silenced (the file would still\n"
+"be ignored) or trust can be established. Use one of the following\n"
+"settings, the syntax is explained below:"
+msgstr ""
+
+msgid ""
+"- ``ui.report_untrusted = False``\n"
+"- ``trusted.users = USER``\n"
+"- ``trusted.groups = GROUP``"
+msgstr ""
+
+msgid ""
+"The configuration files for Mercurial use a simple ini-file format. A\n"
+"configuration file consists of sections, led by a ``[section]`` header\n"
+"and followed by ``name = value`` entries::"
+msgstr ""
+
+msgid ""
+" [ui]\n"
+" username = Firstname Lastname <firstname.lastname@example.net>\n"
+" verbose = True"
+msgstr ""
+
+msgid ""
+"The above entries will be referred to as ``ui.username`` and\n"
+"``ui.verbose``, respectively. Please see the hgrc man page for a full\n"
+"description of the possible configuration values:"
+msgstr ""
+
+msgid ""
+"- on Unix-like systems: ``man hgrc``\n"
+"- online: http://www.selenic.com/mercurial/hgrc.5.html\n"
+msgstr ""
+
+msgid "Some commands allow the user to specify a date, e.g.:"
+msgstr "一些命令å…許使用者表示時間,e.g.:"
+
+msgid ""
+"- backout, commit, import, tag: Specify the commit date.\n"
+"- log, revert, update: Select revision(s) by date."
+msgstr ""
+"- backout, commit, import, tag: æ交的時間.\n"
+"- log, revert, update: 由時間來é¸æ“‡ä¿®å®šç‰ˆ(s)"
+
+msgid "Many date formats are valid. Here are some examples:"
+msgstr "支æ´è¨±å¤šçš„時間格å¼,這邊有一些範例::"
+
+msgid ""
+"- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)\n"
+"- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)\n"
+"- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)\n"
+"- ``Dec 6`` (midnight)\n"
+"- ``13:18`` (today assumed)\n"
+"- ``3:39`` (3:39AM assumed)\n"
+"- ``3:39pm`` (15:39)\n"
+"- ``2006-12-06 13:18:29`` (ISO 8601 format)\n"
+"- ``2006-12-6 13:18``\n"
+"- ``2006-12-6``\n"
+"- ``12-6``\n"
+"- ``12/6``\n"
+"- ``12/6/6`` (Dec 6 2006)"
+msgstr ""
+
+msgid "Lastly, there is Mercurial's internal format:"
+msgstr "最後,是Mercurial 的內部格å¼::"
+
+msgid "- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)"
+msgstr ""
+
+msgid ""
+"This is the internal representation format for dates. unixtime is the\n"
+"number of seconds since the epoch (1970-01-01 00:00 UTC). offset is\n"
+"the offset of the local timezone, in seconds west of UTC (negative if\n"
+"the timezone is east of UTC)."
+msgstr ""
+
+msgid "The log command also accepts date ranges:"
+msgstr "log 命令也接收 時間å€é–“::"
+
+msgid ""
+"- ``<{datetime}`` - at or before a given date/time\n"
+"- ``>{datetime}`` - on or after a given date/time\n"
+"- ``{datetime} to {datetime}`` - a date range, inclusive\n"
+"- ``-{days}`` - within a given number of days of today\n"
+msgstr ""
+
+msgid ""
+"Mercurial's default format for showing changes between two versions of\n"
+"a file is compatible with the unified format of GNU diff, which can be\n"
+"used by GNU patch and many other standard tools."
+msgstr ""
+
+msgid ""
+"While this standard format is often enough, it does not encode the\n"
+"following information:"
+msgstr ""
+
+msgid ""
+"- executable status and other permission bits\n"
+"- copy or rename information\n"
+"- changes in binary files\n"
+"- creation or deletion of empty files"
+msgstr ""
+
+msgid ""
+"Mercurial also supports the extended diff format from the git VCS\n"
+"which addresses these limitations. The git diff format is not produced\n"
+"by default because a few widespread tools still do not understand this\n"
+"format."
+msgstr ""
+
+msgid ""
+"This means that when generating diffs from a Mercurial repository\n"
+"(e.g. with :hg:`export`), you should be careful about things like file\n"
+"copies and renames or other things mentioned above, because when\n"
+"applying a standard diff to a different repository, this extra\n"
+"information is lost. Mercurial's internal operations (like push and\n"
+"pull) are not affected by this, because they use an internal binary\n"
+"format for communicating changes."
+msgstr ""
+
+msgid ""
+"To make Mercurial produce the git extended diff format, use the --git\n"
+"option available for many commands, or set 'git = True' in the [diff]\n"
+"section of your configuration file. You do not need to set this option\n"
+"when importing diffs in this format or using them in the mq extension.\n"
+msgstr ""
+
+msgid ""
+"HG\n"
+" Path to the 'hg' executable, automatically passed when running\n"
+" hooks, extensions or external tools. If unset or empty, this is\n"
+" the hg executable's name if it's frozen, or an executable named\n"
+" 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on\n"
+" Windows) is searched."
+msgstr ""
+
+msgid ""
+"HGEDITOR\n"
+" This is the name of the editor to run when committing. See EDITOR."
+msgstr ""
+
+msgid " (deprecated, use configuration file)"
+msgstr ""
+
+msgid ""
+"HGENCODING\n"
+" This overrides the default locale setting detected by Mercurial.\n"
+" This setting is used to convert data including usernames,\n"
+" changeset descriptions, tag names, and branches. This setting can\n"
+" be overridden with the --encoding command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGMODE\n"
+" This sets Mercurial's behavior for handling unknown characters\n"
+" while transcoding user input. The default is \"strict\", which\n"
+" causes Mercurial to abort if it can't map a character. Other\n"
+" settings include \"replace\", which replaces unknown characters, and\n"
+" \"ignore\", which drops them. This setting can be overridden with\n"
+" the --encodingmode command-line option."
+msgstr ""
+
+msgid ""
+"HGENCODINGAMBIGUOUS\n"
+" This sets Mercurial's behavior for handling characters with\n"
+" \"ambiguous\" widths like accented Latin characters with East Asian\n"
+" fonts. By default, Mercurial assumes ambiguous characters are\n"
+" narrow, set this variable to \"wide\" if such characters cause\n"
+" formatting problems."
+msgstr ""
+
+msgid ""
+"HGMERGE\n"
+" An executable to use for resolving merge conflicts. The program\n"
+" will be executed with three arguments: local file, remote file,\n"
+" ancestor file."
+msgstr ""
+
+msgid ""
+"HGRCPATH\n"
+" A list of files or directories to search for configuration\n"
+" files. Item separator is \":\" on Unix, \";\" on Windows. If HGRCPATH\n"
+" is not set, platform default search path is used. If empty, only\n"
+" the .hg/hgrc from the current repository is read."
+msgstr ""
+
+msgid " For each element in HGRCPATH:"
+msgstr ""
+
+msgid ""
+" - if it's a directory, all files ending with .rc are added\n"
+" - otherwise, the file itself will be added"
+msgstr ""
+
+msgid ""
+"HGPLAIN\n"
+" When set, this disables any configuration settings that might\n"
+" change Mercurial's default output. This includes encoding,\n"
+" defaults, verbose mode, debug mode, quiet mode, tracebacks, and\n"
+" localization. This can be useful when scripting against Mercurial\n"
+" in the face of existing user configuration."
+msgstr ""
+
+msgid ""
+" Equivalent options set via command line flags or environment\n"
+" variables are not overridden."
+msgstr ""
+
+msgid ""
+"HGUSER\n"
+" This is the string used as the author of a commit. If not set,\n"
+" available values will be considered in this order:"
+msgstr ""
+
+msgid ""
+" - HGUSER (deprecated)\n"
+" - configuration files from the HGRCPATH\n"
+" - EMAIL\n"
+" - interactive prompt\n"
+" - LOGNAME (with ``@hostname`` appended)"
+msgstr ""
+
+msgid ""
+"EMAIL\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"LOGNAME\n"
+" May be used as the author of a commit; see HGUSER."
+msgstr ""
+
+msgid ""
+"VISUAL\n"
+" This is the name of the editor to use when committing. See EDITOR."
+msgstr ""
+
+msgid ""
+"EDITOR\n"
+" Sometimes Mercurial needs to open a text file in an editor for a\n"
+" user to modify, for example when writing commit messages. The\n"
+" editor it uses is determined by looking at the environment\n"
+" variables HGEDITOR, VISUAL and EDITOR, in that order. The first\n"
+" non-empty one is chosen. If all of them are empty, the editor\n"
+" defaults to 'vi'."
+msgstr ""
+
+msgid ""
+"PYTHONPATH\n"
+" This is used by Python to find imported modules and may need to be\n"
+" set appropriately if this Mercurial is not installed system-wide.\n"
+msgstr ""
+
+msgid ""
+"Mercurial has the ability to add new features through the use of\n"
+"extensions. Extensions may add new commands, add options to\n"
+"existing commands, change the default behavior of commands, or\n"
+"implement hooks."
+msgstr ""
+
+msgid ""
+"Extensions are not loaded by default for a variety of reasons:\n"
+"they can increase startup overhead; they may be meant for advanced\n"
+"usage only; they may provide potentially dangerous abilities (such\n"
+"as letting you destroy or modify history); they might not be ready\n"
+"for prime time; or they may alter some usual behaviors of stock\n"
+"Mercurial. It is thus up to the user to activate extensions as\n"
+"needed."
+msgstr ""
+
+msgid ""
+"To enable the \"foo\" extension, either shipped with Mercurial or in the\n"
+"Python search path, create an entry for it in your configuration file,\n"
+"like this::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" foo ="
+msgstr ""
+
+msgid "You may also specify the full path to an extension::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" myfeature = ~/.hgext/myfeature.py"
+msgstr ""
+
+msgid ""
+"To explicitly disable an extension enabled in a configuration file of\n"
+"broader scope, prepend its path with !::"
+msgstr ""
+
+msgid ""
+" [extensions]\n"
+" # disabling extension bar residing in /path/to/extension/bar.py\n"
+" bar = !/path/to/extension/bar.py\n"
+" # ditto, but no path was supplied for extension baz\n"
+" baz = !\n"
+msgstr ""
+
+msgid ""
+"Ancestor\n"
+" Any changeset that can be reached by an unbroken chain of parent\n"
+" changesets from a given changeset. More precisely, the ancestors\n"
+" of a changeset can be defined by two properties: a parent of a\n"
+" changeset is an ancestor, and a parent of an ancestor is an\n"
+" ancestor. See also: 'Descendant'."
+msgstr ""
+
+msgid ""
+"Branch\n"
+" (Noun) A child changeset that has been created from a parent that\n"
+" is not a head. These are known as topological branches, see\n"
+" 'Branch, topological'. If a topological branch is named, it becomes\n"
+" a named branch. If a topological branch is not named, it becomes\n"
+" an anonymous branch. See 'Branch, anonymous' and 'Branch, named'."
+msgstr ""
+
+msgid ""
+" Branches may be created when changes are pulled from or pushed to\n"
+" a remote repository, since new heads may be created by these\n"
+" operations. Note that the term branch can also be used informally\n"
+" to describe a development process in which certain development is\n"
+" done independently of other development. This is sometimes done\n"
+" explicitly with a named branch, but it can also be done locally,\n"
+" using bookmarks or clones and anonymous branches."
+msgstr ""
+
+msgid " Example: \"The experimental branch\"."
+msgstr ""
+
+msgid ""
+" (Verb) The action of creating a child changeset which results in\n"
+" its parent having more than one child."
+msgstr ""
+
+msgid " Example: \"I'm going to branch at X\"."
+msgstr ""
+
+msgid ""
+"Branch, anonymous\n"
+" Every time a new child changeset is created from a parent that is not\n"
+" a head and the name of the branch is not changed, a new anonymous\n"
+" branch is created."
+msgstr ""
+
+msgid ""
+"Branch, closed\n"
+" A named branch whose branch heads have all been closed."
+msgstr ""
+
+msgid ""
+"Branch, default\n"
+" The branch assigned to a changeset when no name has previously been\n"
+" assigned."
+msgstr ""
+
+msgid ""
+"Branch head\n"
+" See 'Head, branch'."
+msgstr ""
+
+msgid ""
+"Branch, inactive\n"
+" If a named branch has no topological heads, it is considered to be\n"
+" inactive. As an example, a feature branch becomes inactive when it\n"
+" is merged into the default branch. The :hg:`branches` command\n"
+" shows inactive branches by default, though they can be hidden with\n"
+" :hg:`branches --active`."
+msgstr ""
+
+msgid ""
+" NOTE: this concept is deprecated because it is too implicit.\n"
+" Branches should now be explicitly closed using :hg:`commit\n"
+" --close-branch` when they are no longer needed."
+msgstr ""
+
+msgid ""
+"Branch, named\n"
+" A collection of changesets which have the same branch name. By\n"
+" default, children of a changeset in a named branch belong to the\n"
+" same named branch. A child can be explicitly assigned to a\n"
+" different branch. See :hg:`help branch`, :hg:`help branches` and\n"
+" :hg:`commit --close-branch` for more information on managing\n"
+" branches."
+msgstr ""
+
+msgid ""
+" Named branches can be thought of as a kind of namespace, dividing\n"
+" the collection of changesets that comprise the repository into a\n"
+" collection of disjoint subsets. A named branch is not necessarily\n"
+" a topological branch. If a new named branch is created from the\n"
+" head of another named branch, or the default branch, but no\n"
+" further changesets are added to that previous branch, then that\n"
+" previous branch will be a branch in name only."
+msgstr ""
+
+msgid ""
+"Branch tip\n"
+" See 'Tip, branch'."
+msgstr ""
+
+msgid ""
+"Branch, topological\n"
+" Every time a new child changeset is created from a parent that is\n"
+" not a head, a new topological branch is created. If a topological\n"
+" branch is named, it becomes a named branch. If a topological\n"
+" branch is not named, it becomes an anonymous branch of the\n"
+" current, possibly default, branch."
+msgstr ""
+
+msgid ""
+"Changelog\n"
+" A record of the changesets in the order in which they were added\n"
+" to the repository. This includes details such as changeset id,\n"
+" author, commit message, date, and list of changed files."
+msgstr ""
+
+msgid ""
+"Changeset\n"
+" A snapshot of the state of the repository used to record a change."
+msgstr ""
+
+msgid ""
+"Changeset, child\n"
+" The converse of parent changeset: if P is a parent of C, then C is\n"
+" a child of P. There is no limit to the number of children that a\n"
+" changeset may have."
+msgstr ""
+
+msgid ""
+"Changeset id\n"
+" A SHA-1 hash that uniquely identifies a changeset. It may be\n"
+" represented as either a \"long\" 40 hexadecimal digit string, or a\n"
+" \"short\" 12 hexadecimal digit string."
+msgstr ""
+
+msgid ""
+"Changeset, merge\n"
+" A changeset with two parents. This occurs when a merge is\n"
+" committed."
+msgstr ""
+
+msgid ""
+"Changeset, parent\n"
+" A revision upon which a child changeset is based. Specifically, a\n"
+" parent changeset of a changeset C is a changeset whose node\n"
+" immediately precedes C in the DAG. Changesets have at most two\n"
+" parents."
+msgstr ""
+
+msgid ""
+"Checkout\n"
+" (Noun) The working directory being updated to a specific\n"
+" revision. This use should probably be avoided where possible, as\n"
+" changeset is much more appropriate than checkout in this context."
+msgstr ""
+
+msgid " Example: \"I'm using checkout X.\""
+msgstr ""
+
+msgid ""
+" (Verb) Updating the working directory to a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"I'm going to check out changeset X.\""
+msgstr ""
+
+msgid ""
+"Child changeset\n"
+" See 'Changeset, child'."
+msgstr ""
+
+msgid ""
+"Close changeset\n"
+" See 'Changeset, close'."
+msgstr ""
+
+msgid ""
+"Closed branch\n"
+" See 'Branch, closed'."
+msgstr ""
+
+msgid ""
+"Clone\n"
+" (Noun) An entire or partial copy of a repository. The partial\n"
+" clone must be in the form of a revision and its ancestors."
+msgstr ""
+
+msgid " Example: \"Is your clone up to date?\"."
+msgstr ""
+
+msgid " (Verb) The process of creating a clone, using :hg:`clone`."
+msgstr ""
+
+msgid " Example: \"I'm going to clone the repository\"."
+msgstr ""
+
+msgid ""
+"Closed branch head\n"
+" See 'Head, closed branch'."
+msgstr ""
+
+msgid ""
+"Commit\n"
+" (Noun) A synonym for changeset."
+msgstr ""
+
+msgid " Example: \"Is the bug fixed in your recent commit?\""
+msgstr ""
+
+msgid ""
+" (Verb) The act of recording changes to a repository. When files\n"
+" are committed in a working directory, Mercurial finds the\n"
+" differences between the committed files and their parent\n"
+" changeset, creating a new changeset in the repository."
+msgstr ""
+
+msgid " Example: \"You should commit those changes now.\""
+msgstr ""
+
+msgid ""
+"Cset\n"
+" A common abbreviation of the term changeset."
+msgstr ""
+
+msgid ""
+"DAG\n"
+" The repository of changesets of a distributed version control\n"
+" system (DVCS) can be described as a directed acyclic graph (DAG),\n"
+" consisting of nodes and edges, where nodes correspond to\n"
+" changesets and edges imply a parent -> child relation. This graph\n"
+" can be visualized by graphical tools such as :hg:`glog`\n"
+" (graphlog). In Mercurial, the DAG is limited by the requirement\n"
+" for children to have at most two parents."
+msgstr ""
+
+msgid ""
+"Default branch\n"
+" See 'Branch, default'."
+msgstr ""
+
+msgid ""
+"Descendant\n"
+" Any changeset that can be reached by a chain of child changesets\n"
+" from a given changeset. More precisely, the descendants of a\n"
+" changeset can be defined by two properties: the child of a\n"
+" changeset is a descendant, and the child of a descendant is a\n"
+" descendant. See also: 'Ancestor'."
+msgstr ""
+
+msgid ""
+"Diff\n"
+" (Noun) The difference between the contents and attributes of files\n"
+" in two changesets or a changeset and the current working\n"
+" directory. The difference is usually represented in a standard\n"
+" form called a \"diff\" or \"patch\". The \"git diff\" format is used\n"
+" when the changes include copies, renames, or changes to file\n"
+" attributes, none of which can be represented/handled by classic\n"
+" \"diff\" and \"patch\"."
+msgstr ""
+
+msgid " Example: \"Did you see my correction in the diff?\""
+msgstr ""
+
+msgid ""
+" (Verb) Diffing two changesets is the action of creating a diff or\n"
+" patch."
+msgstr ""
+
+msgid ""
+" Example: \"If you diff with changeset X, you will see what I mean.\""
+msgstr ""
+
+msgid ""
+"Directory, working\n"
+" The working directory represents the state of the files tracked by\n"
+" Mercurial, that will be recorded in the next commit. The working\n"
+" directory initially corresponds to the snapshot at an existing\n"
+" changeset, known as the parent of the working directory. See\n"
+" 'Parent, working directory'. The state may be modified by changes\n"
+" to the files introduced manually or by a merge. The repository\n"
+" metadata exists in the .hg directory inside the working directory."
+msgstr ""
+
+msgid ""
+"Graph\n"
+" See DAG and :hg:`help graphlog`."
+msgstr ""
+
+msgid ""
+"Head\n"
+" The term 'head' may be used to refer to both a branch head or a\n"
+" repository head, depending on the context. See 'Head, branch' and\n"
+" 'Head, repository' for specific definitions."
+msgstr ""
+
+msgid ""
+" Heads are where development generally takes place and are the\n"
+" usual targets for update and merge operations."
+msgstr ""
+
+msgid ""
+"Head, branch\n"
+" A changeset with no descendants on the same named branch."
+msgstr ""
+
+msgid ""
+"Head, closed branch\n"
+" A changeset that marks a head as no longer interesting. The closed\n"
+" head is no longer listed by :hg:`heads`. A branch is considered\n"
+" closed when all its heads are closed and consequently is not\n"
+" listed by :hg:`branches`."
+msgstr ""
+
+msgid ""
+"Head, repository\n"
+" A topological head which has not been closed."
+msgstr ""
+
+msgid ""
+"Head, topological\n"
+" A changeset with no children in the repository."
+msgstr ""
+
+msgid ""
+"History, immutable\n"
+" Once committed, changesets cannot be altered. Extensions which\n"
+" appear to change history actually create new changesets that\n"
+" replace existing ones, and then destroy the old changesets. Doing\n"
+" so in public repositories can result in old changesets being\n"
+" reintroduced to the repository."
+msgstr ""
+
+msgid ""
+"History, rewriting\n"
+" The changesets in a repository are immutable. However, extensions\n"
+" to Mercurial can be used to alter the repository, usually in such\n"
+" a way as to preserve changeset contents."
+msgstr ""
+
+msgid ""
+"Immutable history\n"
+" See 'History, immutable'."
+msgstr ""
+
+msgid ""
+"Merge changeset\n"
+" See 'Changeset, merge'."
+msgstr ""
+
+msgid ""
+"Manifest\n"
+" Each changeset has a manifest, which is the list of files that are\n"
+" tracked by the changeset."
+msgstr ""
+
+msgid ""
+"Merge\n"
+" Used to bring together divergent branches of work. When you update\n"
+" to a changeset and then merge another changeset, you bring the\n"
+" history of the latter changeset into your working directory. Once\n"
+" conflicts are resolved (and marked), this merge may be committed\n"
+" as a merge changeset, bringing two branches together in the DAG."
+msgstr ""
+
+msgid ""
+"Named branch\n"
+" See 'Branch, named'."
+msgstr ""
+
+msgid ""
+"Null changeset\n"
+" The empty changeset. It is the parent state of newly-initialized\n"
+" repositories and repositories with no checked out revision. It is\n"
+" thus the parent of root changesets and the effective ancestor when\n"
+" merging unrelated changesets. Can be specified by the alias 'null'\n"
+" or by the changeset ID '000000000000'."
+msgstr ""
+
+msgid ""
+"Parent\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent changeset\n"
+" See 'Changeset, parent'."
+msgstr ""
+
+msgid ""
+"Parent, working directory\n"
+" The working directory parent reflects a virtual revision which is\n"
+" the child of the changeset (or two changesets with an uncommitted\n"
+" merge) shown by :hg:`parents`. This is changed with\n"
+" :hg:`update`. Other commands to see the working directory parent\n"
+" are :hg:`summary` and :hg:`id`. Can be specified by the alias \".\"."
+msgstr ""
+
+msgid ""
+"Patch\n"
+" (Noun) The product of a diff operation."
+msgstr ""
+
+msgid " Example: \"I've sent you my patch.\""
+msgstr ""
+
+msgid ""
+" (Verb) The process of using a patch file to transform one\n"
+" changeset into another."
+msgstr ""
+
+msgid " Example: \"You will need to patch that revision.\""
+msgstr ""
+
+msgid ""
+"Pull\n"
+" An operation in which changesets in a remote repository which are\n"
+" not in the local repository are brought into the local\n"
+" repository. Note that this operation without special arguments\n"
+" only updates the repository, it does not update the files in the\n"
+" working directory. See :hg:`help pull`."
+msgstr ""
+
+msgid ""
+"Push\n"
+" An operation in which changesets in a local repository which are\n"
+" not in a remote repository are sent to the remote repository. Note\n"
+" that this operation only adds changesets which have been committed\n"
+" locally to the remote repository. Uncommitted changes are not\n"
+" sent. See :hg:`help push`."
+msgstr ""
+
+msgid ""
+"Repository\n"
+" The metadata describing all recorded states of a collection of\n"
+" files. Each recorded state is represented by a changeset. A\n"
+" repository is usually (but not always) found in the ``.hg``\n"
+" subdirectory of a working directory. Any recorded state can be\n"
+" recreated by \"updating\" a working directory to a specific\n"
+" changeset."
+msgstr ""
+
+msgid ""
+"Repository head\n"
+" See 'Head, repository'."
+msgstr ""
+
+msgid ""
+"Revision\n"
+" A state of the repository at some point in time. Earlier revisions\n"
+" can be updated to by using :hg:`update`. See also 'Revision\n"
+" number'; See also 'Changeset'."
+msgstr ""
+
+msgid ""
+"Revision number\n"
+" This integer uniquely identifies a changeset in a specific\n"
+" repository. It represents the order in which changesets were added\n"
+" to a repository, starting with revision number 0. Note that the\n"
+" revision number may be different in each clone of a repository. To\n"
+" identify changesets uniquely between different clones, see\n"
+" 'Changeset id'."
+msgstr ""
+
+msgid ""
+"Revlog\n"
+" History storage mechanism used by Mercurial. It is a form of delta\n"
+" encoding, with occasional full revision of data followed by delta\n"
+" of each successive revision. It includes data and an index\n"
+" pointing to the data."
+msgstr ""
+
+msgid ""
+"Rewriting history\n"
+" See 'History, rewriting'."
+msgstr ""
+
+msgid ""
+"Root\n"
+" A changeset that has only the null changeset as its parent. Most\n"
+" repositories have only a single root changeset."
+msgstr ""
+
+msgid ""
+"Tip\n"
+" The changeset with the highest revision number. It is the changeset\n"
+" most recently added in a repository."
+msgstr ""
+
+msgid ""
+"Tip, branch\n"
+" The head of a given branch with the highest revision number. When\n"
+" a branch name is used as a revision identifier, it refers to the\n"
+" branch tip. See also 'Branch, head'. Note that because revision\n"
+" numbers may be different in different repository clones, the\n"
+" branch tip may be different in different cloned repositories."
+msgstr ""
+
+msgid ""
+"Update\n"
+" (Noun) Another synonym of changeset."
+msgstr ""
+
+msgid " Example: \"I've pushed an update\"."
+msgstr ""
+
+msgid ""
+" (Verb) This term is usually used to describe updating the state of\n"
+" the working directory to that of a specific changeset. See\n"
+" :hg:`help update`."
+msgstr ""
+
+msgid " Example: \"You should update\"."
+msgstr ""
+
+msgid ""
+"Working directory\n"
+" See 'Directory, working'."
+msgstr ""
+
+msgid ""
+"Working directory parent\n"
+" See 'Parent, working directory'.\n"
+msgstr ""
+
+msgid ""
+"Mercurial's internal web server, hgweb, can serve either a single\n"
+"repository, or a collection of them. In the latter case, a special\n"
+"configuration file can be used to specify the repository paths to use\n"
+"and global web configuration options."
+msgstr ""
+
+msgid ""
+"This file uses the same syntax as hgrc configuration files, but only\n"
+"the following sections are recognized:"
+msgstr ""
+
+msgid ""
+" - web\n"
+" - paths\n"
+" - collections"
+msgstr ""
+
+msgid ""
+"The ``web`` section can specify all the settings described in the web\n"
+"section of the hgrc documentation."
+msgstr ""
+
+msgid ""
+"The ``paths`` section provides mappings of physical repository\n"
+"paths to virtual ones. For instance::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" projects/a = /foo/bar\n"
+" projects/b = /baz/quux\n"
+" web/root = /real/root/*\n"
+" / = /real/root2/*\n"
+" virtual/root2 = /real/root2/**"
+msgstr ""
+
+msgid ""
+"- The first two entries make two repositories in different directories\n"
+" appear under the same directory in the web interface\n"
+"- The third entry maps every Mercurial repository found in '/real/root'\n"
+" into 'web/root'. This format is preferred over the [collections] one,\n"
+" since using absolute paths as configuration keys is not supported on "
+"every\n"
+" platform (especially on Windows).\n"
+"- The fourth entry is a special case mapping all repositories in\n"
+" '/real/root2' in the root of the virtual directory.\n"
+"- The fifth entry recursively finds all repositories under the real\n"
+" root, and maps their relative paths under the virtual root."
+msgstr ""
+
+msgid ""
+"The ``collections`` section provides mappings of trees of physical\n"
+"repositories paths to virtual ones, though the paths syntax is generally\n"
+"preferred. For instance::"
+msgstr ""
+
+msgid ""
+" [collections]\n"
+" /foo = /foo"
+msgstr ""
+
+msgid ""
+"Here, the left side will be stripped off all repositories found in the\n"
+"right side. Thus ``/foo/bar`` and ``foo/quux/baz`` will be listed as\n"
+"``bar`` and ``quux/baz`` respectively.\n"
+msgstr ""
+
+msgid "To merge files Mercurial uses merge tools."
+msgstr ""
+
+msgid ""
+"A merge tool combines two different versions of a file into a merged\n"
+"file. Merge tools are given the two files and the greatest common\n"
+"ancestor of the two file versions, so they can determine the changes\n"
+"made on both branches."
+msgstr ""
+
+msgid ""
+"Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,\n"
+":hg:`backout` and in several extensions."
+msgstr ""
+
+msgid ""
+"Usually, the merge tool tries to automatically reconcile the files by\n"
+"combining all non-overlapping changes that occurred separately in\n"
+"the two different evolutions of the same initial base file. Furthermore, "
+"some\n"
+"interactive merge programs make it easier to manually resolve\n"
+"conflicting merges, either in a graphical way, or by inserting some\n"
+"conflict markers. Mercurial does not include any interactive merge\n"
+"programs but relies on external tools for that."
+msgstr ""
+
+msgid ""
+"Available merge tools\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid ""
+"External merge tools and their properties are configured in the\n"
+"merge-tools configuration section - see hgrc(5) - but they can often just\n"
+"be named by their executable."
+msgstr ""
+
+msgid ""
+"A merge tool is generally usable if its executable can be found on the\n"
+"system and if it can handle the merge. The executable is found if it\n"
+"is an absolute or relative executable path or the name of an\n"
+"application in the executable search path. The tool is assumed to be\n"
+"able to handle the merge if it can handle symlinks if the file is a\n"
+"symlink, if it can handle binary files if the file is binary, and if a\n"
+"GUI is available if the tool requires a GUI."
+msgstr ""
+
+msgid ""
+"There are some internal merge tools which can be used. The internal\n"
+"merge tools are:"
+msgstr ""
+
+msgid ""
+"``internal:merge``\n"
+" Uses the internal non-interactive simple merge algorithm for merging\n"
+" files. It will fail if there are any conflicts and leave markers in\n"
+" the partially merged file."
+msgstr ""
+
+msgid ""
+"``internal:fail``\n"
+" Rather than attempting to merge files that were modified on both\n"
+" branches, it marks them as unresolved. The resolve command must be\n"
+" used to resolve these conflicts."
+msgstr ""
+
+msgid ""
+"``internal:local``\n"
+" Uses the local version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:other``\n"
+" Uses the other version of files as the merged version."
+msgstr ""
+
+msgid ""
+"``internal:prompt``\n"
+" Asks the user which of the local or the other version to keep as\n"
+" the merged version."
+msgstr ""
+
+msgid ""
+"``internal:dump``\n"
+" Creates three versions of the files to merge, containing the\n"
+" contents of local, other and base. These files can then be used to\n"
+" perform a merge manually. If the file to be merged is named\n"
+" ``a.txt``, these files will accordingly be named ``a.txt.local``,\n"
+" ``a.txt.other`` and ``a.txt.base`` and they will be placed in the\n"
+" same directory as ``a.txt``."
+msgstr ""
+
+msgid ""
+"Internal tools are always available and do not require a GUI but will by "
+"default\n"
+"not handle symlinks or binary files."
+msgstr ""
+
+msgid ""
+"Choosing a merge tool\n"
+"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\""
+msgstr ""
+
+msgid "Mercurial uses these rules when deciding which merge tool to use:"
+msgstr ""
+
+msgid ""
+"1. If a tool has been specified with the --tool option to merge or resolve, "
+"it\n"
+" is used. If it is the name of a tool in the merge-tools configuration, "
+"its\n"
+" configuration is used. Otherwise the specified tool must be executable "
+"by\n"
+" the shell."
+msgstr ""
+
+msgid ""
+"2. If the ``HGMERGE`` environment variable is present, its value is used "
+"and\n"
+" must be executable by the shell."
+msgstr ""
+
+msgid ""
+"3. If the filename of the file to be merged matches any of the patterns in "
+"the\n"
+" merge-patterns configuration section, the first usable merge tool\n"
+" corresponding to a matching pattern is used. Here, binary capabilities of "
+"the\n"
+" merge tool are not considered."
+msgstr ""
+
+msgid ""
+"4. If ui.merge is set it will be considered next. If the value is not the "
+"name\n"
+" of a configured tool, the specified value is used and must be executable "
+"by\n"
+" the shell. Otherwise the named tool is used if it is usable."
+msgstr ""
+
+msgid ""
+"5. If any usable merge tools are present in the merge-tools configuration\n"
+" section, the one with the highest priority is used."
+msgstr ""
+
+msgid ""
+"6. If a program named ``hgmerge`` can be found on the system, it is used - "
+"but\n"
+" it will by default not be used for symlinks and binary files."
+msgstr ""
+
+msgid ""
+"7. If the file to be merged is not binary and is not a symlink, then\n"
+" ``internal:merge`` is used."
+msgstr ""
+
+msgid "8. The merge of the file fails and must be resolved before commit."
+msgstr ""
+
+msgid ""
+".. note::\n"
+" After selecting a merge program, Mercurial will by default attempt\n"
+" to merge the files using a simple merge algorithm first. Only if it "
+"doesn't\n"
+" succeed because of conflicting changes Mercurial will actually execute "
+"the\n"
+" merge program. Whether to use the simple merge algorithm first can be\n"
+" controlled by the premerge setting of the merge tool. Premerge is enabled "
+"by\n"
+" default unless the file is binary or a symlink."
+msgstr ""
+
+msgid ""
+"See the merge-tools and ui sections of hgrc(5) for details on the\n"
+"configuration of merge tools.\n"
+msgstr ""
+
+msgid ""
+"When Mercurial accepts more than one revision, they may be specified\n"
+"individually, or provided as a topologically continuous range,\n"
+"separated by the \":\" character."
+msgstr ""
+
+msgid ""
+"The syntax of range notation is [BEGIN]:[END], where BEGIN and END are\n"
+"revision identifiers. Both BEGIN and END are optional. If BEGIN is not\n"
+"specified, it defaults to revision number 0. If END is not specified,\n"
+"it defaults to the tip. The range \":\" thus means \"all revisions\"."
+msgstr ""
+
+msgid "If BEGIN is greater than END, revisions are treated in reverse order."
+msgstr ""
+
+msgid ""
+"A range acts as a closed interval. This means that a range of 3:5\n"
+"gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.\n"
+msgstr ""
+
+msgid ""
+"Mercurial accepts several notations for identifying one or more files\n"
+"at a time."
+msgstr ""
+
+msgid ""
+"By default, Mercurial treats filenames as shell-style extended glob\n"
+"patterns."
+msgstr ""
+
+msgid "Alternate pattern notations must be specified explicitly."
+msgstr ""
+
+msgid ""
+"To use a plain path name without any pattern matching, start it with\n"
+"``path:``. These path names must completely match starting at the\n"
+"current repository root."
+msgstr ""
+
+msgid ""
+"To use an extended glob, start a name with ``glob:``. Globs are rooted\n"
+"at the current directory; a glob such as ``*.c`` will only match files\n"
+"in the current directory ending with ``.c``."
+msgstr ""
+
+msgid ""
+"The supported glob syntax extensions are ``**`` to match any string\n"
+"across path separators and ``{a,b}`` to mean \"a or b\"."
+msgstr ""
+
+msgid ""
+"To use a Perl/Python regular expression, start a name with ``re:``.\n"
+"Regexp pattern matching is anchored at the root of the repository."
+msgstr ""
+
+msgid "Plain examples::"
+msgstr ""
+
+msgid ""
+" path:foo/bar a name bar in a directory named foo in the root\n"
+" of the repository\n"
+" path:path:name a file or directory named \"path:name\""
+msgstr ""
+
+msgid "Glob examples::"
+msgstr ""
+
+msgid ""
+" glob:*.c any name ending in \".c\" in the current directory\n"
+" *.c any name ending in \".c\" in the current directory\n"
+" **.c any name ending in \".c\" in any subdirectory of the\n"
+" current directory including itself.\n"
+" foo/*.c any name ending in \".c\" in the directory foo\n"
+" foo/**.c any name ending in \".c\" in any subdirectory of foo\n"
+" including itself."
+msgstr ""
+
+msgid "Regexp examples::"
+msgstr ""
+
+msgid ""
+" re:.*\\.c$ any name ending in \".c\", anywhere in the repository\n"
+msgstr ""
+
+msgid "Mercurial supports several ways to specify individual revisions."
+msgstr ""
+
+msgid ""
+"A plain integer is treated as a revision number. Negative integers are\n"
+"treated as sequential offsets from the tip, with -1 denoting the tip,\n"
+"-2 denoting the revision prior to the tip, and so forth."
+msgstr ""
+
+msgid ""
+"A 40-digit hexadecimal string is treated as a unique revision\n"
+"identifier."
+msgstr ""
+
+msgid ""
+"A hexadecimal string less than 40 characters long is treated as a\n"
+"unique revision identifier and is referred to as a short-form\n"
+"identifier. A short-form identifier is only valid if it is the prefix\n"
+"of exactly one full-length identifier."
+msgstr ""
+
+msgid ""
+"Any other string is treated as a tag or branch name. A tag name is a\n"
+"symbolic name associated with a revision identifier. A branch name\n"
+"denotes the tipmost revision of that branch. Tag and branch names must\n"
+"not contain the \":\" character."
+msgstr ""
+
+msgid ""
+"The reserved name \"tip\" is a special tag that always identifies the\n"
+"most recent revision."
+msgstr ""
+
+msgid ""
+"The reserved name \"null\" indicates the null revision. This is the\n"
+"revision of an empty repository, and the parent of revision 0."
+msgstr ""
+
+msgid ""
+"The reserved name \".\" indicates the working directory parent. If no\n"
+"working directory is checked out, it is equivalent to null. If an\n"
+"uncommitted merge is in progress, \".\" is the revision of the first\n"
+"parent.\n"
+msgstr ""
+
+msgid ""
+"Mercurial supports a functional language for selecting a set of\n"
+"revisions."
+msgstr ""
+
+msgid ""
+"The language supports a number of predicates which are joined by infix\n"
+"operators. Parenthesis can be used for grouping."
+msgstr ""
+
+msgid ""
+"Identifiers such as branch names must be quoted with single or double\n"
+"quotes if they contain characters outside of\n"
+"``[._a-zA-Z0-9\\x80-\\xff]`` or if they match one of the predefined\n"
+"predicates."
+msgstr ""
+
+msgid ""
+"Special characters can be used in quoted identifiers by escaping them,\n"
+"e.g., ``\\n`` is interpreted as a newline. To prevent them from being\n"
+"interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``."
+msgstr ""
+
+msgid "There is a single prefix operator:"
+msgstr ""
+
+msgid ""
+"``not x``\n"
+" Changesets not in x. Short form is ``! x``."
+msgstr ""
+
+msgid "These are the supported infix operators:"
+msgstr ""
+
+msgid ""
+"``x::y``\n"
+" A DAG range, meaning all changesets that are descendants of x and\n"
+" ancestors of y, including x and y themselves. If the first endpoint\n"
+" is left out, this is equivalent to ``ancestors(y)``, if the second\n"
+" is left out it is equivalent to ``descendants(x)``."
+msgstr ""
+
+msgid " An alternative syntax is ``x..y``."
+msgstr ""
+
+msgid ""
+"``x:y``\n"
+" All changesets with revision numbers between x and y, both\n"
+" inclusive. Either endpoint can be left out, they default to 0 and\n"
+" tip."
+msgstr ""
+
+msgid ""
+"``x and y``\n"
+" The intersection of changesets in x and y. Short form is ``x & y``."
+msgstr ""
+
+msgid ""
+"``x or y``\n"
+" The union of changesets in x and y. There are two alternative short\n"
+" forms: ``x | y`` and ``x + y``."
+msgstr ""
+
+msgid ""
+"``x - y``\n"
+" Changesets in x but not in y."
+msgstr ""
+
+msgid "The following predicates are supported:"
+msgstr ""
+
+msgid ".. predicatesmarker"
+msgstr ""
+
+msgid "Command line equivalents for :hg:`log`::"
+msgstr ""
+
+msgid ""
+" -f -> ::.\n"
+" -d x -> date(x)\n"
+" -k x -> keyword(x)\n"
+" -m -> merge()\n"
+" -u x -> user(x)\n"
+" -b x -> branch(x)\n"
+" -P x -> !::x\n"
+" -l x -> limit(expr, x)"
+msgstr ""
+
+msgid "Some sample queries:"
+msgstr ""
+
+msgid "- Changesets on the default branch::"
+msgstr ""
+
+msgid " hg log -r \"branch(default)\""
+msgstr ""
+
+msgid "- Changesets on the default branch since tag 1.5 (excluding merges)::"
+msgstr ""
+
+msgid " hg log -r \"branch(default) and 1.5:: and not merge()\""
+msgstr ""
+
+msgid "- Open branch heads::"
+msgstr ""
+
+msgid " hg log -r \"head() and not closed()\""
+msgstr ""
+
+msgid ""
+"- Changesets between tags 1.3 and 1.5 mentioning \"bug\" that affect\n"
+" ``hgext/*``::"
+msgstr ""
+
+msgid " hg log -r \"1.3::1.5 and keyword(bug) and file('hgext/*')\""
+msgstr ""
+
+msgid "- Changesets in committed May 2008, sorted by user::"
+msgstr ""
+
+msgid " hg log -r \"sort(date('May 2008'), user)\""
+msgstr ""
+
+msgid ""
+"- Changesets mentioning \"bug\" or \"issue\" that are not in a tagged\n"
+" release::"
+msgstr ""
+
+msgid ""
+" hg log -r \"(keyword(bug) or keyword(issue)) and not ancestors(tagged"
+"())\"\n"
+msgstr ""
+
+msgid ""
+"Subrepositories let you nest external repositories or projects into a\n"
+"parent Mercurial repository, and make commands operate on them as a\n"
+"group. External Mercurial and Subversion projects are currently\n"
+"supported."
+msgstr ""
+
+msgid "Subrepositories are made of three components:"
+msgstr ""
+
+msgid ""
+"1. Nested repository checkouts. They can appear anywhere in the\n"
+" parent working directory, and are Mercurial clones or Subversion\n"
+" checkouts."
+msgstr ""
+
+msgid ""
+"2. Nested repository references. They are defined in ``.hgsub`` and\n"
+" tell where the subrepository checkouts come from. Mercurial\n"
+" subrepositories are referenced like:"
+msgstr ""
+
+msgid " path/to/nested = https://example.com/nested/repo/path"
+msgstr ""
+
+msgid ""
+" where ``path/to/nested`` is the checkout location relatively to the\n"
+" parent Mercurial root, and ``https://example.com/nested/repo/path``\n"
+" is the source repository path. The source can also reference a\n"
+" filesystem path. Subversion repositories are defined with:"
+msgstr ""
+
+msgid " path/to/nested = [svn]https://example.com/nested/trunk/path"
+msgstr ""
+
+msgid ""
+" Note that ``.hgsub`` does not exist by default in Mercurial\n"
+" repositories, you have to create and add it to the parent\n"
+" repository before using subrepositories."
+msgstr ""
+
+msgid ""
+"3. Nested repository states. They are defined in ``.hgsubstate`` and\n"
+" capture whatever information is required to restore the\n"
+" subrepositories to the state they were committed in a parent\n"
+" repository changeset. Mercurial automatically record the nested\n"
+" repositories states when committing in the parent repository."
+msgstr ""
+
+msgid ""
+" .. note::\n"
+" The ``.hgsubstate`` file should not be edited manually."
+msgstr ""
+
+msgid ""
+"\n"
+"Adding a Subrepository\n"
+"----------------------"
+msgstr ""
+
+msgid ""
+"If ``.hgsub`` does not exist, create it and add it to the parent\n"
+"repository. Clone or checkout the external projects where you want it\n"
+"to live in the parent repository. Edit ``.hgsub`` and add the\n"
+"subrepository entry as described above. At this point, the\n"
+"subrepository is tracked and the next commit will record its state in\n"
+"``.hgsubstate`` and bind it to the committed changeset."
+msgstr ""
+
+msgid ""
+"Synchronizing a Subrepository\n"
+"-----------------------------"
+msgstr ""
+
+msgid ""
+"Subrepos do not automatically track the latest changeset of their\n"
+"sources. Instead, they are updated to the changeset that corresponds\n"
+"with the changeset checked out in the top-level changeset. This is so\n"
+"developers always get a consistent set of compatible code and\n"
+"libraries when they update."
+msgstr ""
+
+msgid ""
+"Thus, updating subrepos is a manual process. Simply check out target\n"
+"subrepo at the desired revision, test in the top-level repo, then\n"
+"commit in the parent repository to record the new combination."
+msgstr ""
+
+msgid ""
+"Deleting a Subrepository\n"
+"------------------------"
+msgstr ""
+
+msgid ""
+"To remove a subrepository from the parent repository, delete its\n"
+"reference from ``.hgsub``, then remove its files."
+msgstr ""
+
+msgid ""
+"Interaction with Mercurial Commands\n"
+"-----------------------------------"
+msgstr ""
+
+msgid ""
+":add: add does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":archive: archive does not recurse in subrepositories unless\n"
+" -S/--subrepos is specified."
+msgstr ""
+
+msgid ""
+":commit: commit creates a consistent snapshot of the state of the\n"
+" entire project and its subrepositories. It does this by first\n"
+" attempting to commit all modified subrepositories, then recording\n"
+" their state and finally committing it in the parent repository."
+msgstr ""
+
+msgid ""
+":diff: diff does not recurse in subrepos unless -S/--subrepos is\n"
+" specified. Changes are displayed as usual, on the subrepositories\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":incoming: incoming does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":outgoing: outgoing does not recurse in subrepos unless -S/--subrepos\n"
+" is specified. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":pull: pull is not recursive since it is not clear what to pull prior\n"
+" to running :hg:`update`. Listing and retrieving all\n"
+" subrepositories changes referenced by the parent repository pulled\n"
+" changesets is expensive at best, impossible in the Subversion\n"
+" case."
+msgstr ""
+
+msgid ""
+":push: Mercurial will automatically push all subrepositories first\n"
+" when the parent repository is being pushed. This ensures new\n"
+" subrepository changes are available when referenced by top-level\n"
+" repositories."
+msgstr ""
+
+msgid ""
+":status: status does not recurse into subrepositories unless\n"
+" -S/--subrepos is specified. Subrepository changes are displayed as\n"
+" regular Mercurial changes on the subrepository\n"
+" elements. Subversion subrepositories are currently silently\n"
+" ignored."
+msgstr ""
+
+msgid ""
+":update: update restores the subrepos in the state they were\n"
+" originally committed in target changeset. If the recorded\n"
+" changeset is not available in the current subrepository, Mercurial\n"
+" will pull it in first before updating. This means that updating\n"
+" can require network access when using subrepositories."
+msgstr ""
+
+msgid ""
+"Remapping Subrepositories Sources\n"
+"---------------------------------"
+msgstr ""
+
+msgid ""
+"A subrepository source location may change during a project life,\n"
+"invalidating references stored in the parent repository history. To\n"
+"fix this, rewriting rules can be defined in parent repository ``hgrc``\n"
+"file or in Mercurial configuration. See the ``[subpaths]`` section in\n"
+"hgrc(5) for more details."
+msgstr ""
+
+msgid ""
+"Mercurial allows you to customize output of commands through\n"
+"templates. You can either pass in a template from the command\n"
+"line, via the --template option, or select an existing\n"
+"template-style (--style)."
+msgstr ""
+
+msgid ""
+"You can customize output for any \"log-like\" command: log,\n"
+"outgoing, incoming, tip, parents, heads and glog."
+msgstr ""
+
+msgid ""
+"Four styles are packaged with Mercurial: default (the style used\n"
+"when no explicit preference is passed), compact, changelog,\n"
+"and xml.\n"
+"Usage::"
+msgstr ""
+
+msgid " $ hg log -r1 --style changelog"
+msgstr ""
+
+msgid ""
+"A template is a piece of text, with markup to invoke variable\n"
+"expansion::"
+msgstr ""
+
+msgid ""
+" $ hg log -r1 --template \"{node}\\n\"\n"
+" b56ce7b07c52de7d5fd79fb89701ea538af65746"
+msgstr ""
+
+msgid ""
+"Strings in curly braces are called keywords. The availability of\n"
+"keywords depends on the exact context of the templater. These\n"
+"keywords are usually available for templating a log-like command:"
+msgstr ""
+
+msgid ":author: String. The unmodified author of the changeset."
+msgstr ""
+
+msgid ""
+":branches: String. The name of the branch on which the changeset was\n"
+" committed. Will be empty if the branch name was default."
+msgstr ""
+
+msgid ":children: List of strings. The children of the changeset."
+msgstr ""
+
+msgid ":date: Date information. The date when the changeset was committed."
+msgstr ""
+
+msgid ":desc: String. The text of the changeset description."
+msgstr ""
+
+msgid ""
+":diffstat: String. Statistics of changes with the following format:\n"
+" \"modified files: +added/-removed lines\""
+msgstr ""
+
+msgid ""
+":files: List of strings. All files modified, added, or removed by this\n"
+" changeset."
+msgstr ""
+
+msgid ":file_adds: List of strings. Files added by this changeset."
+msgstr ""
+
+msgid ""
+":file_copies: List of strings. Files copied in this changeset with\n"
+" their sources."
+msgstr ""
+
+msgid ""
+":file_copies_switch: List of strings. Like \"file_copies\" but displayed\n"
+" only if the --copied switch is set."
+msgstr ""
+
+msgid ":file_mods: List of strings. Files modified by this changeset."
+msgstr ""
+
+msgid ":file_dels: List of strings. Files removed by this changeset."
+msgstr ""
+
+msgid ""
+":node: String. The changeset identification hash, as a 40 hexadecimal\n"
+" digit string."
+msgstr ""
+
+msgid ":parents: List of strings. The parents of the changeset."
+msgstr ""
+
+msgid ":rev: Integer. The repository-local changeset revision number."
+msgstr ""
+
+msgid ":tags: List of strings. Any tags associated with the changeset."
+msgstr ""
+
+msgid ""
+":latesttag: String. Most recent global tag in the ancestors of this\n"
+" changeset."
+msgstr ""
+
+msgid ":latesttagdistance: Integer. Longest path to the latest tag."
+msgstr ""
+
+msgid ""
+"The \"date\" keyword does not produce human-readable output. If you\n"
+"want to use a date in your output, you can use a filter to process\n"
+"it. Filters are functions which return a string based on the input\n"
+"variable. Be sure to use the stringify filter first when you're\n"
+"applying a string-input filter to a list-like input variable.\n"
+"You can also use a chain of filters to get the desired output::"
+msgstr ""
+
+msgid ""
+" $ hg tip --template \"{date|isodate}\\n\"\n"
+" 2008-08-21 18:22 +0000"
+msgstr ""
+
+msgid "List of filters:"
+msgstr ""
+
+msgid ""
+":addbreaks: Any text. Add an XHTML \"<br />\" tag before the end of\n"
+" every line except the last."
+msgstr ""
+
+msgid ""
+":age: Date. Returns a human-readable date/time difference between the\n"
+" given date/time and the current date/time."
+msgstr ""
+
+msgid ""
+":basename: Any text. Treats the text as a path, and returns the last\n"
+" component of the path after splitting by the path separator\n"
+" (ignoring trailing separators). For example, \"foo/bar/baz\" becomes\n"
+" \"baz\" and \"foo/bar//\" becomes \"bar\"."
+msgstr ""
+
+msgid ""
+":stripdir: Treat the text as path and strip a directory level, if\n"
+" possible. For example, \"foo\" and \"foo/bar\" becomes \"foo\"."
+msgstr ""
+
+msgid ""
+":date: Date. Returns a date in a Unix date format, including the\n"
+" timezone: \"Mon Sep 04 15:13:13 2006 0700\"."
+msgstr ""
+
+msgid ""
+":domain: Any text. Finds the first string that looks like an email\n"
+" address, and extracts just the domain component. Example: ``User\n"
+" <user@example.com>`` becomes ``example.com``."
+msgstr ""
+
+msgid ""
+":email: Any text. Extracts the first string that looks like an email\n"
+" address. Example: ``User <user@example.com>`` becomes\n"
+" ``user@example.com``."
+msgstr ""
+
+msgid ""
+":escape: Any text. Replaces the special XML/XHTML characters \"&\", \"<\"\n"
+" and \">\" with XML entities."
+msgstr ""
+
+msgid ""
+":hex: Any text. Convert a binary Mercurial node identifier into\n"
+" its long hexadecimal representation."
+msgstr ""
+
+msgid ":fill68: Any text. Wraps the text to fit in 68 columns."
+msgstr ""
+
+msgid ":fill76: Any text. Wraps the text to fit in 76 columns."
+msgstr ""
+
+msgid ":firstline: Any text. Returns the first line of text."
+msgstr ""
+
+msgid ":nonempty: Any text. Returns '(none)' if the string is empty."
+msgstr ""
+
+msgid ""
+":hgdate: Date. Returns the date as a pair of numbers: \"1157407993\n"
+" 25200\" (Unix timestamp, timezone offset)."
+msgstr ""
+
+msgid ""
+":isodate: Date. Returns the date in ISO 8601 format: \"2009-08-18 13:00\n"
+" +0200\"."
+msgstr ""
+
+msgid ""
+":isodatesec: Date. Returns the date in ISO 8601 format, including\n"
+" seconds: \"2009-08-18 13:00:13 +0200\". See also the rfc3339date\n"
+" filter."
+msgstr ""
+
+msgid ":localdate: Date. Converts a date to local date."
+msgstr ""
+
+msgid ""
+":obfuscate: Any text. Returns the input text rendered as a sequence of\n"
+" XML entities."
+msgstr ""
+
+msgid ":person: Any text. Returns the text before an email address."
+msgstr ""
+
+msgid ""
+":rfc822date: Date. Returns a date using the same format used in email\n"
+" headers: \"Tue, 18 Aug 2009 13:00:13 +0200\"."
+msgstr ""
+
+msgid ""
+":rfc3339date: Date. Returns a date using the Internet date format\n"
+" specified in RFC 3339: \"2009-08-18T13:00:13+02:00\"."
+msgstr ""
+
+msgid ""
+":short: Changeset hash. Returns the short form of a changeset hash,\n"
+" i.e. a 12 hexadecimal digit string."
+msgstr ""
+
+msgid ":shortdate: Date. Returns a date like \"2006-09-18\"."
+msgstr ""
+
+msgid ""
+":stringify: Any type. Turns the value into text by converting values into\n"
+" text and concatenating them."
+msgstr ""
+
+msgid ":strip: Any text. Strips all leading and trailing whitespace."
+msgstr ""
+
+msgid ""
+":tabindent: Any text. Returns the text, with every line except the\n"
+" first starting with a tab character."
+msgstr ""
+
+msgid ""
+":urlescape: Any text. Escapes all \"special\" characters. For example,\n"
+" \"foo bar\" becomes \"foo%20bar\"."
+msgstr ""
+
+msgid ":user: Any text. Returns the user portion of an email address.\n"
+msgstr ""
+
+msgid "Valid URLs are of the form::"
+msgstr ""
+
+msgid ""
+" local/filesystem/path[#revision]\n"
+" file://local/filesystem/path[#revision]\n"
+" http://[user[:pass]@]host[:port]/[path][#revision]\n"
+" https://[user[:pass]@]host[:port]/[path][#revision]\n"
+" ssh://[user[:pass]@]host[:port]/[path][#revision]"
+msgstr ""
+
+msgid ""
+"Paths in the local filesystem can either point to Mercurial\n"
+"repositories or to bundle files (as created by :hg:`bundle` or :hg:`\n"
+"incoming --bundle`)."
+msgstr ""
+
+msgid ""
+"An optional identifier after # indicates a particular branch, tag, or\n"
+"changeset to use from the remote repository. See also :hg:`help\n"
+"revisions`."
+msgstr ""
+
+msgid ""
+"Some features, such as pushing to http:// and https:// URLs are only\n"
+"possible if the feature is explicitly enabled on the remote Mercurial\n"
+"server."
+msgstr ""
+
+msgid ""
+"Note that the security of HTTPS URLs depends on proper configuration of\n"
+"web.cacerts."
+msgstr ""
+
+msgid "Some notes about using SSH with Mercurial:"
+msgstr ""
+
+msgid ""
+"- SSH requires an accessible shell account on the destination machine\n"
+" and a copy of hg in the remote path or specified with as remotecmd.\n"
+"- path is relative to the remote user's home directory by default. Use\n"
+" an extra slash at the start of a path to specify an absolute path::"
+msgstr ""
+
+msgid " ssh://example.com//tmp/repository"
+msgstr ""
+
+msgid ""
+"- Mercurial doesn't use its own compression via SSH; the right thing\n"
+" to do is to configure it in your ~/.ssh/config, e.g.::"
+msgstr ""
+
+msgid ""
+" Host *.mylocalnetwork.example.com\n"
+" Compression no\n"
+" Host *\n"
+" Compression yes"
+msgstr ""
+
+msgid ""
+" Alternatively specify \"ssh -C\" as your ssh command in your\n"
+" configuration file or with the --ssh command line option."
+msgstr ""
+
+msgid ""
+"These URLs can all be stored in your configuration file with path\n"
+"aliases under the [paths] section like so::"
+msgstr ""
+
+msgid ""
+" [paths]\n"
+" alias1 = URL1\n"
+" alias2 = URL2\n"
+" ..."
+msgstr ""
+
+msgid ""
+"You can then use the alias for any command that uses a URL (for\n"
+"example :hg:`pull alias1` will be treated as :hg:`pull URL1`)."
+msgstr ""
+
+msgid ""
+"Two path aliases are special because they are used as defaults when\n"
+"you do not provide the URL to a command:"
+msgstr ""
+
+msgid ""
+"default:\n"
+" When you create a repository with hg clone, the clone command saves\n"
+" the location of the source repository as the new repository's\n"
+" 'default' path. This is then used when you omit path from push- and\n"
+" pull-like commands (including incoming and outgoing)."
+msgstr ""
+
+msgid ""
+"default-push:\n"
+" The push command will look for a path named 'default-push', and\n"
+" prefer it over 'default' if both are defined.\n"
+msgstr ""
+
+msgid "remote branch lookup not supported"
+msgstr "ä¸æ”¯æ´é ç«¯åˆ†æ”¯æŸ¥é–±"
+
+msgid "dirstate branch not accessible"
+msgstr ""
+
+#, python-format
+msgid "unknown branch '%s'"
+msgstr "ä¸çŸ¥é“的分支 '%s'"
+
+msgid "can only share local repositories"
+msgstr "åªèƒ½åˆ†äº«æœ¬åœ°ç«¯å„²å­˜åº«(s)"
+
+msgid "destination already exists"
+msgstr "目的端已存在"
+
+msgid "updating working directory\n"
+msgstr "更新工作目錄中\n"
+
+#, python-format
+msgid "destination directory: %s\n"
+msgstr "目的端目錄: %s\n"
+
+#, python-format
+msgid "destination '%s' already exists"
+msgstr "目的端 '%s' 已存在"
+
+#, python-format
+msgid "destination '%s' is not empty"
+msgstr "目的端 '%s' ä¸æ˜¯ç©ºçš„"
+
+msgid ""
+"src repository does not support revision lookup and so doesn't support clone "
+"by revision"
+msgstr ""
+
+msgid "clone from remote to remote not supported"
+msgstr "從一個é ç«¯clone到å¦ä¸€å€‹é ç«¯çš„功能是ä¸æ”¯æ´çš„ "
+
+#, python-format
+msgid "updating to branch %s\n"
+msgstr "正在更新到%s分支\n"
+
+#, python-format
+msgid ""
+"%d files updated, %d files merged, %d files removed, %d files unresolved\n"
+msgstr "%d個更新 %d個åˆä½µ %d個移除 %d個未解決\n"
+
+msgid "use 'hg resolve' to retry unresolved file merges\n"
+msgstr "使用'hg resolve'é‡æ–°å˜—試åˆä½µæœªè§£æ±ºçš„檔案\n"
+
+msgid ""
+"use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to "
+"abandon\n"
+msgstr "使用'hg resolve'é‡æ–°å˜—試åˆä½µæœªè§£æ±ºçš„檔案或用 'hg update -C'放棄\n"
+
+msgid "(branch merge, don't forget to commit)\n"
+msgstr "(分支已經åˆä½µäº†,別忘了è¦commitå–”)\n"
+
+#, python-format
+msgid "error reading %s/.hg/hgrc: %s\n"
+msgstr "! %s/.hg/hgrc 讀å–錯誤:%s\n"
+
+#, python-format
+msgid "error accessing repository at %s\n"
+msgstr ""
+
+msgid "SSL support is unavailable"
+msgstr "SSL 支æ´ä¸èƒ½ç”¨"
+
+msgid "IPv6 is not available on this system"
+msgstr "此作業系統ä¸æ”¯æ´ IPv6"
+
+#, python-format
+msgid "cannot start server at '%s:%d': %s"
+msgstr "無法於 '%s:%d' 啟動伺æœå™¨: %s"
+
+#, python-format
+msgid "calling hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" not in a module)"
+msgstr ""
+
+msgid "exception from first failed import attempt:\n"
+msgstr ""
+
+msgid "exception from second failed import attempt:\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (import of \"%s\" failed)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not defined)"
+msgstr ""
+
+#, python-format
+msgid "%s hook is invalid (\"%s\" is not callable)"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook failed: %s\n"
+msgstr ""
+
+#, python-format
+msgid "error: %s hook raised an exception: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook failed"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook failed\n"
+msgstr ""
+
+#, python-format
+msgid "running hook %s: %s\n"
+msgstr ""
+
+#, python-format
+msgid "%s hook %s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s hook %s\n"
+msgstr ""
+
+msgid "connection ended unexpectedly"
+msgstr "連線æ„外的çµæŸäº†"
+
+#, python-format
+msgid "unsupported URL component: \"%s\""
+msgstr "ä¸æ”¯æ´çš„URL元件:'%s'"
+
+msgid "operation not supported over http"
+msgstr ""
+
+msgid "authorization failed"
+msgstr "身份èªè­‰å¤±æ•—"
+
+msgid "http error, possibly caused by proxy setting"
+msgstr "http 錯誤,å¯èƒ½æ˜¯ç”±proxy產生的"
+
+#, python-format
+msgid "real URL is %s\n"
+msgstr "真正的URL是 %s\n"
+
+#, python-format
+msgid ""
+"'%s' does not appear to be an hg repository:\n"
+"---%%<--- (%s)\n"
+"%s\n"
+"---%%<---\n"
+msgstr ""
+
+#, python-format
+msgid "'%s' sent a broken Content-Type header (%s)"
+msgstr ""
+
+#, python-format
+msgid "'%s' uses newer protocol %s"
+msgstr "'%s'使用最新的通訊å”定 %s"
+
+#, python-format
+msgid "push failed: %s"
+msgstr "push 失敗: %s"
+
+msgid "Python support for SSL and HTTPS is not installed"
+msgstr "SSL å’ŒHTTPS çš„python support 沒有安è£"
+
+msgid "cannot create new http repository"
+msgstr "ä¸èƒ½å»ºç«‹æ–°çš„ http 儲存庫"
+
+#, python-format
+msgid "ignoring invalid syntax '%s'"
+msgstr "忽略無效的語法 '%s'"
+
+#, python-format
+msgid "skipping unreadable ignore file '%s': %s\n"
+msgstr "ç•¥éŽä¸èƒ½è®€å–的忽略檔 '%s' : %s\n"
+
+#, python-format
+msgid "repository %s not found"
+msgstr "找ä¸åˆ° %s 儲存庫"
+
+#, python-format
+msgid "repository %s already exists"
+msgstr "%s 儲存庫已經在了"
+
+#, python-format
+msgid "requirement '%s' not supported"
+msgstr "è¦æ±‚ '%s' ä¸è¢«æ”¯æ´"
+
+#, python-format
+msgid ".hg/sharedpath points to nonexistent directory %s"
+msgstr ""
+
+#, python-format
+msgid "%r cannot be used in a tag name"
+msgstr "%r ä¸èƒ½ç•¶æˆæ¨™è¨˜å稱來用"
+
+#, python-format
+msgid "warning: tag %s conflicts with existing branch name\n"
+msgstr "警告: 標記 %s è·Ÿç¾æœ‰çš„分支å稱è¡çªã€‚\n"
+
+msgid "working copy of .hgtags is changed (please commit .hgtags manually)"
+msgstr ".hgtags 的工作複本已經被改變了(請手工æ交 .hgtags)"
+
+#, python-format
+msgid "working directory has unknown parent '%s'!"
+msgstr "工作目錄有未知的æ¯ç³»'%s'!"
+
+#, python-format
+msgid "unknown revision '%s'"
+msgstr "未知的修定版 '%s'"
+
+msgid "abandoned transaction found - run hg recover"
+msgstr ""
+
+msgid "rolling back interrupted transaction\n"
+msgstr ""
+
+msgid "no interrupted transaction available\n"
+msgstr ""
+
+#, python-format
+msgid "rolling back to revision %s (undo %s: %s)\n"
+msgstr ""
+
+#, python-format
+msgid "rolling back to revision %s (undo %s)\n"
+msgstr ""
+
+msgid "rolling back unknown transaction\n"
+msgstr ""
+
+#, python-format
+msgid "Named branch could not be reset, current branch still is: %s\n"
+msgstr "指å的分支ä¸èƒ½è¢«é‡ç½®,ç›®å‰åˆ†æ”¯ä¾ç„¶æ˜¯: %s\n"
+
+msgid "no rollback information available\n"
+msgstr "沒有 rollback 資訊å¯ä»¥ç”¨\n"
+
+#, python-format
+msgid "waiting for lock on %s held by %r\n"
+msgstr ""
+
+#, python-format
+msgid "repository %s"
+msgstr "儲存庫 %s"
+
+#, python-format
+msgid "working directory of %s"
+msgstr "%s 的工作目錄"
+
+msgid "cannot partially commit a merge (do not specify files or patterns)"
+msgstr ""
+
+msgid "can't commit subrepos without .hgsub"
+msgstr ""
+
+msgid "file not found!"
+msgstr "找ä¸åˆ°æª”案!"
+
+msgid "no match under directory!"
+msgstr ""
+
+msgid "file not tracked!"
+msgstr "檔案沒有被追蹤!"
+
+msgid "unresolved merge conflicts (see hg resolve)"
+msgstr "未解決的åˆä½µè¡çª(詳見 hg resolve)"
+
+#, python-format
+msgid "committing subrepository %s\n"
+msgstr "正在æ交å­å„²å­˜åº« %s\n"
+
+#, python-format
+msgid "note: commit message saved in %s\n"
+msgstr "注æ„: æ交訊æ¯å­˜æ”¾åœ¨%s\n"
+
+#, python-format
+msgid "trouble committing %s!\n"
+msgstr ""
+
+msgid "requesting all changes\n"
+msgstr "正在é‡æ–°è¦æ±‚所有的changes\n"
+
+msgid ""
+"partial pull cannot be done because other repository doesn't support "
+"changegroupsubset."
+msgstr "局部pull ä¸èƒ½å®Œæˆ,因為其他儲存庫ä¸æ”¯æ´changegroupsubset."
+
+#, python-format
+msgid "%d changesets found\n"
+msgstr "找到%d個changesets\n"
+
+msgid "bundling changes"
+msgstr ""
+
+msgid "chunks"
+msgstr ""
+
+msgid "bundling manifests"
+msgstr ""
+
+#, python-format
+msgid "empty or missing revlog for %s"
+msgstr ""
+
+msgid "bundling files"
+msgstr ""
+
+msgid "adding changesets\n"
+msgstr "新增changesets\n"
+
+msgid "received changelog group is empty"
+msgstr "接收的changelog group是空白的"
+
+msgid "adding manifests\n"
+msgstr "新增清單\n"
+
+msgid "manifests"
+msgstr "清單"
+
+msgid "adding file changes\n"
+msgstr "新增檔案變更\n"
+
+msgid "received file revlog group is empty"
+msgstr "接收的file revlog group是空白的"
+
+#, python-format
+msgid "missing file data for %s:%s - run hg verify"
+msgstr "éºå¤±æª”案資料 for %s:%s - 執行 hg verify"
+
+#, python-format
+msgid " (%+d heads)"
+msgstr ""
+
+#, python-format
+msgid "added %d changesets with %d changes to %d files%s\n"
+msgstr "增加%d個changesets with %d個變更到%d個檔案%s\n"
+
+msgid "Unexpected response from remote server:"
+msgstr "é ç«¯ä¼ºæœå™¨å›žå‚³ä¸€å€‹æ„料之外的回應:"
+
+msgid "operation forbidden by server"
+msgstr ""
+
+msgid "locking the remote repository failed"
+msgstr "鎖ä½é ç«¯å„²å­˜åº«å¤±æ•—了"
+
+msgid "the server sent an unknown error code"
+msgstr "伺æœå™¨å‚³é€äº†ä¸€å€‹æœªçŸ¥çš„錯誤碼"
+
+msgid "streaming all changes\n"
+msgstr ""
+
+#, python-format
+msgid "%d files to transfer, %s of data\n"
+msgstr ""
+
+#, python-format
+msgid "transferred %s in %.1f seconds (%s/sec)\n"
+msgstr ""
+
+msgid "smtp.host not configured - cannot send mail"
+msgstr "smtp.host 沒有設定 - hg沒有辦法寄信"
+
+#, python-format
+msgid "sending mail: smtp host %s, port %s\n"
+msgstr "正在寄mail: smtp host %s,port %s\n"
+
+msgid "can't use TLS: Python SSL support not installed"
+msgstr "ä¸èƒ½ç”¨ TLS: python çš„ SSL 支æ´æ²’有安è£(?)"
+
+msgid "(using tls)\n"
+msgstr "(使用 TLS)\n"
+
+#, python-format
+msgid "(authenticating to mail server as %s)\n"
+msgstr "(用 %s èªè¨¼åˆ° mail 伺æœå™¨)\n"
+
+#, python-format
+msgid "sending mail: %s\n"
+msgstr "正在寄mail: %s\n"
+
+msgid "smtp specified as email transport, but no smtp host configured"
+msgstr "smtp 被æè¿°æˆæ˜¯ä¸€å€‹email 傳輸器,但是沒有設定 smtp host"
+
+#, python-format
+msgid "%r specified as email transport, but not in PATH"
+msgstr "æè¿°%r是一個email傳輸器,但是他ä¸åœ¨PATH裡"
+
+#, python-format
+msgid "ignoring invalid sendcharset: %s\n"
+msgstr "忽略無效的傳é€å­—元集: %s\n"
+
+#, python-format
+msgid "invalid email address: %s"
+msgstr "ä¸èƒ½ç”¨çš„E mail ä½å€: %s"
+
+#, python-format
+msgid "invalid local address: %s"
+msgstr "ä¸èƒ½ç”¨çš„本地ä½å€: %s"
+
+#, python-format
+msgid "failed to remove %s from manifest"
+msgstr "從清單移除 %s 失敗了"
+
+#, python-format
+msgid "invalid pattern (%s): %s"
+msgstr "無效的表é”å¼(%s): %s"
+
+msgid "invalid pattern"
+msgstr "無效的表é”å¼"
+
+#, python-format
+msgid "diff context lines count must be an integer, not %r"
+msgstr "\"diff context lines count\" 必須是一個整數,ä¸æ˜¯ %r"
+
+#, python-format
+msgid ""
+"untracked file in working directory differs from file in requested revision: "
+"'%s'"
+msgstr ""
+
+#, python-format
+msgid "case-folding collision between %s and %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" conflicting flags for %s\n"
+"(n)one, e(x)ec or sym(l)ink?"
+msgstr ""
+
+msgid "&None"
+msgstr ""
+
+msgid "E&xec"
+msgstr ""
+
+msgid "Sym&link"
+msgstr ""
+
+msgid "resolving manifests\n"
+msgstr "解決清單中\n"
+
+#, python-format
+msgid ""
+" local changed %s which remote deleted\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+msgid "&Changed"
+msgstr ""
+
+msgid "&Delete"
+msgstr ""
+
+#, python-format
+msgid ""
+"remote changed %s which local deleted\n"
+"use (c)hanged version or leave (d)eleted?"
+msgstr ""
+
+msgid "&Deleted"
+msgstr ""
+
+msgid "updating"
+msgstr "更新中"
+
+#, python-format
+msgid "update failed to remove %s: %s!\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s\n"
+msgstr ""
+
+#, python-format
+msgid "getting %s to %s\n"
+msgstr ""
+
+#, python-format
+msgid "note: possible conflict - %s was renamed multiple times to:\n"
+msgstr ""
+
+#, python-format
+msgid "branch %s not found"
+msgstr "找ä¸åˆ° branch %s"
+
+msgid "merging with a working directory ancestor has no effect"
+msgstr ""
+
+msgid "nothing to merge (use 'hg update' or check 'hg heads')"
+msgstr "沒有å¯åˆä½µçš„變更 (請使用 'hg update' 或 'hg heads' 檢查)"
+
+msgid "outstanding uncommitted changes (use 'hg status' to list changes)"
+msgstr "還有未 commit 的變更 (請使用 'hg status' 來列出變更)"
+
+msgid "crosses branches (merge branches or use --clean to discard changes)"
+msgstr ""
+
+msgid "crosses branches (merge branches or use --check to force update)"
+msgstr ""
+
+msgid "Attention:"
+msgstr ""
+
+msgid "Caution:"
+msgstr ""
+
+msgid "!Danger!"
+msgstr "!!å±éšª!!"
+
+msgid "Error:"
+msgstr "錯誤:"
+
+msgid "Hint:"
+msgstr ""
+
+msgid "Important:"
+msgstr "é‡è¦:"
+
+msgid "Note:"
+msgstr "備注:"
+
+msgid "Tip:"
+msgstr "æ示:"
+
+msgid "Warning!"
+msgstr "警報!"
+
+#, python-format
+msgid "cannot create %s: destination already exists"
+msgstr "無法建立 %s: 目的端已存在"
+
+#, python-format
+msgid "cannot create %s: unable to create destination directory"
+msgstr "無法建立 %s: 無法建立目的端目錄"
+
+#, python-format
+msgid "unable to find '%s' for patching\n"
+msgstr "找ä¸åˆ°å¯ patch çš„ '%s'\n"
+
+#, python-format
+msgid "patching file %s\n"
+msgstr "檔案 %s patching 中\n"
+
+#, python-format
+msgid "%d out of %d hunks FAILED -- saving rejects to file %s\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d %s (%d %d %d %d)"
+msgstr ""
+
+#, python-format
+msgid "file %s already exists\n"
+msgstr "檔案 %s 已存在\n"
+
+#, python-format
+msgid "Hunk #%d succeeded at %d with fuzz %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d succeeded at %d (offset %d lines).\n"
+msgstr ""
+
+#, python-format
+msgid "Hunk #%d FAILED at %d\n"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d"
+msgstr ""
+
+#, python-format
+msgid "bad hunk #%d old text line %d"
+msgstr ""
+
+msgid "could not extract binary patch"
+msgstr "無法解開 binary patch"
+
+#, python-format
+msgid "binary patch is %d bytes, not %d"
+msgstr "binary patch 是 %d bytes,而ä¸æ˜¯ %d"
+
+#, python-format
+msgid "unable to strip away %d of %d dirs from %s"
+msgstr "ä¸èƒ½åŽ»é™¤(strip away) %d of %d個目錄從 %s"
+
+msgid "undefined source and destination files"
+msgstr "沒有定義來æºè·Ÿç›®æ¨™æª”案"
+
+#, python-format
+msgid "malformed patch %s %s"
+msgstr "有缺陷的patch %s %s"
+
+#, python-format
+msgid "unsupported parser state: %s"
+msgstr "ä¸æ”¯æ´çš„解æžå™¨ç‹€æ…‹: %s"
+
+#, python-format
+msgid "patch command failed: %s"
+msgstr "patch 命令失敗: %s"
+
+#, python-format
+msgid "unsupported line endings type: %s"
+msgstr "ä¸æ”¯æ´çš„行尾çµæŸé¡žåž‹: %s"
+
+msgid "patch failed to apply"
+msgstr ""
+
+#, python-format
+msgid " %d files changed, %d insertions(+), %d deletions(-)\n"
+msgstr "%d 修改,%d æ’å…¥(+),%d 刪除(-)\n"
+
+#, python-format
+msgid "exited with status %d"
+msgstr "以狀態 %d 離開"
+
+#, python-format
+msgid "killed by signal %d"
+msgstr "已被信號 %d 終止"
+
+#, python-format
+msgid "saved backup bundle to %s\n"
+msgstr ""
+
+msgid "adding branch\n"
+msgstr "正在新增 branch\n"
+
+#, python-format
+msgid "strip failed, full bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "strip failed, partial bundle stored in '%s'\n"
+msgstr ""
+
+#, python-format
+msgid "cannot %s; remote repository does not support the %r capability"
+msgstr "ä¸èƒ½ %s;é ç«¯å„²å­˜åº«ä¸æ”¯æ´ %r 功能"
+
+#, python-format
+msgid "unknown compression type %r"
+msgstr "未知的壓縮類型 %r"
+
+msgid "index entry flags need RevlogNG"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for format v0"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown flags %#04x for revlogng"
+msgstr ""
+
+#, python-format
+msgid "index %s unknown format %d"
+msgstr "index %s æœªçŸ¥çš„æ ¼å¼ %d"
+
+#, python-format
+msgid "index %s is corrupted"
+msgstr "index %s 已被竄改"
+
+msgid "no node"
+msgstr "沒有 node"
+
+msgid "ambiguous identifier"
+msgstr "ä¸æ˜Žç¢ºçš„ identifier"
+
+msgid "no match found"
+msgstr "找ä¸åˆ°ç¬¦åˆçš„"
+
+#, python-format
+msgid "incompatible revision flag %x"
+msgstr "ä¸ç›¸å®¹çš„修定版旗標 %x"
+
+#, python-format
+msgid "%s not found in the transaction"
+msgstr "æ–¼ transaction 中找ä¸åˆ° %s"
+
+msgid "consistency error in delta"
+msgstr ""
+
+msgid "unknown base"
+msgstr "未知的 base"
+
+msgid "unterminated string"
+msgstr "沒有çµæŸçš„字串"
+
+msgid "syntax error"
+msgstr "語法錯誤"
+
+msgid "missing argument"
+msgstr "åƒæ•¸éºå¤±"
+
+#, python-format
+msgid "can't use %s here"
+msgstr "ä¸èƒ½å†é€™è£¡ä½¿ç”¨ %s"
+
+msgid "can't use a list in this context"
+msgstr ""
+
+#, python-format
+msgid "not a function: %s"
+msgstr "%s ä¸æ˜¯å‡½å¼(function)"
+
+msgid ""
+"``id(string)``\n"
+" Revision non-ambiguously specified by the given hex string prefix."
+msgstr ""
+
+#. i18n: "id" is a keyword
+msgid "id requires one argument"
+msgstr "id 需è¦ä¸€å€‹åƒæ•¸"
+
+#. i18n: "id" is a keyword
+msgid "id requires a string"
+msgstr "id 需è¦ä¸€å€‹å­—串"
+
+msgid ""
+"``rev(number)``\n"
+" Revision with the given numeric identifier."
+msgstr ""
+
+#. i18n: "rev" is a keyword
+msgid "rev requires one argument"
+msgstr "rev 需è¦ä¸€å€‹åƒæ•¸"
+
+#. i18n: "rev" is a keyword
+msgid "rev requires a number"
+msgstr "rev 需è¦ä¸€å€‹æ•¸å­—"
+
+#. i18n: "rev" is a keyword
+msgid "rev expects a number"
+msgstr ""
+
+msgid ""
+"``p1(set)``\n"
+" First parent of changesets in set."
+msgstr ""
+
+msgid ""
+"``p2(set)``\n"
+" Second parent of changesets in set."
+msgstr ""
+
+msgid ""
+"``parents(set)``\n"
+" The set of all parents for all changesets in set."
+msgstr ""
+
+msgid ""
+"``max(set)``\n"
+" Changeset with highest revision number in set."
+msgstr ""
+
+msgid ""
+"``min(set)``\n"
+" Changeset with lowest revision number in set."
+msgstr ""
+
+msgid ""
+"``limit(set, n)``\n"
+" First n members of set."
+msgstr ""
+
+#. i18n: "limit" is a keyword
+msgid "limit requires two arguments"
+msgstr "limit 需è¦å…©å€‹åƒæ•¸"
+
+#. i18n: "limit" is a keyword
+msgid "limit requires a number"
+msgstr "limit 需è¦ä¸€å€‹æ•¸å­—"
+
+#. i18n: "limit" is a keyword
+msgid "limit expects a number"
+msgstr ""
+
+msgid ""
+"``children(set)``\n"
+" Child changesets of changesets in set."
+msgstr ""
+
+msgid ""
+"``branch(set)``\n"
+" All changesets belonging to the branches of changesets in set."
+msgstr ""
+
+msgid ""
+"``ancestor(single, single)``\n"
+" Greatest common ancestor of the two changesets."
+msgstr ""
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor requires two arguments"
+msgstr "ancestor 需è¦å…©å€‹åƒæ•¸"
+
+#. i18n: "ancestor" is a keyword
+msgid "ancestor arguments must be single revisions"
+msgstr "ancestorçš„åƒæ•¸å¿…須是單個修訂版"
+
+msgid ""
+"``ancestors(set)``\n"
+" Changesets that are ancestors of a changeset in set."
+msgstr ""
+
+msgid ""
+"``descendants(set)``\n"
+" Changesets which are descendants of changesets in set."
+msgstr ""
+
+msgid ""
+"``follow()``\n"
+" An alias for ``::.`` (ancestors of the working copy's first parent)."
+msgstr ""
+
+#. i18n: "follow" is a keyword
+msgid "follow takes no arguments"
+msgstr "follow ä¸éœ€è¦åƒæ•¸"
+
+msgid ""
+"``date(interval)``\n"
+" Changesets within the interval, see :hg:`help dates`."
+msgstr ""
+
+#. i18n: "date" is a keyword
+msgid "date requires a string"
+msgstr "date 需è¦ä¸€å€‹å­—串"
+
+msgid ""
+"``keyword(string)``\n"
+" Search commit message, user name, and names of changed files for\n"
+" string."
+msgstr ""
+
+#. i18n: "keyword" is a keyword
+msgid "keyword requires a string"
+msgstr "keyword 需è¦ä¸€å€‹å­—串"
+
+msgid ""
+"``grep(regex)``\n"
+" Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``\n"
+" to ensure special escape characters are handled correctly."
+msgstr ""
+
+#. i18n: "grep" is a keyword
+msgid "grep requires a string"
+msgstr "grep 需è¦ä¸€å€‹å­—串"
+
+#, python-format
+msgid "invalid match pattern: %s"
+msgstr "無效的符åˆè¡¨é”å¼: %s"
+
+msgid ""
+"``author(string)``\n"
+" Alias for ``user(string)``."
+msgstr ""
+
+#. i18n: "author" is a keyword
+msgid "author requires a string"
+msgstr "author 需è¦ä¸€å€‹å­—串"
+
+msgid ""
+"``user(string)``\n"
+" User name is string."
+msgstr ""
+
+msgid ""
+"``file(pattern)``\n"
+" Changesets affecting files matched by pattern."
+msgstr ""
+
+#. i18n: "file" is a keyword
+msgid "file requires a pattern"
+msgstr "file 需è¦ä¸€å€‹æª”å表é”å¼"
+
+msgid ""
+"``contains(pattern)``\n"
+" Revision contains pattern."
+msgstr ""
+
+#. i18n: "contains" is a keyword
+msgid "contains requires a pattern"
+msgstr "contains 需è¦ä¸€å€‹è¡¨ç¤ºå¼"
+
+msgid ""
+"``modifies(pattern)``\n"
+" Changesets modifying files matched by pattern."
+msgstr ""
+
+#. i18n: "modifies" is a keyword
+msgid "modifies requires a pattern"
+msgstr "modifies 需è¦ä¸€å€‹æª”å表é”å¼"
+
+msgid ""
+"``adds(pattern)``\n"
+" Changesets that add a file matching pattern."
+msgstr ""
+
+#. i18n: "adds" is a keyword
+msgid "adds requires a pattern"
+msgstr "adds 需è¦ä¸€å€‹æª”å表é”å¼"
+
+msgid ""
+"``removes(pattern)``\n"
+" Changesets which remove files matching pattern."
+msgstr ""
+
+#. i18n: "removes" is a keyword
+msgid "removes requires a pattern"
+msgstr "removes 需è¦ä¸€å€‹æª”å表é”å¼"
+
+msgid ""
+"``merge()``\n"
+" Changeset is a merge changeset."
+msgstr ""
+
+#. i18n: "merge" is a keyword
+msgid "merge takes no arguments"
+msgstr "merge ä¸éœ€è¦åƒæ•¸"
+
+msgid ""
+"``closed()``\n"
+" Changeset is closed."
+msgstr ""
+
+#. i18n: "closed" is a keyword
+msgid "closed takes no arguments"
+msgstr "closed ä¸éœ€è¦åƒæ•¸"
+
+msgid ""
+"``head()``\n"
+" Changeset is a named branch head."
+msgstr ""
+
+#. i18n: "head" is a keyword
+msgid "head takes no arguments"
+msgstr "head ä¸éœ€è¦åƒæ•¸"
+
+msgid ""
+"``reverse(set)``\n"
+" Reverse order of set."
+msgstr ""
+
+msgid ""
+"``present(set)``\n"
+" An empty set, if any revision in set isn't found; otherwise,\n"
+" all revisions in set."
+msgstr ""
+
+msgid ""
+"``sort(set[, [-]key...])``\n"
+" Sort set by keys. The default sort order is ascending, specify a key\n"
+" as ``-key`` to sort in descending order."
+msgstr ""
+
+msgid " The keys can be:"
+msgstr ""
+
+msgid ""
+" - ``rev`` for the revision number,\n"
+" - ``branch`` for the branch name,\n"
+" - ``desc`` for the commit message (description),\n"
+" - ``user`` for user name (``author`` can be used as an alias),\n"
+" - ``date`` for the commit date"
+msgstr ""
+
+#. i18n: "sort" is a keyword
+msgid "sort requires one or two arguments"
+msgstr "sort 需è¦1個或2個åƒæ•¸"
+
+msgid "sort spec must be a string"
+msgstr "排åºæ述必須是一個字串"
+
+#, python-format
+msgid "unknown sort key %r"
+msgstr "未知的排åºéµå€¼ %r"
+
+msgid ""
+"``all()``\n"
+" All changesets, the same as ``0:tip``."
+msgstr ""
+
+#. i18n: "all" is a keyword
+msgid "all takes no arguments"
+msgstr "all ä¸éœ€è¦åƒæ•¸"
+
+msgid ""
+"``heads(set)``\n"
+" Members of set with no children in set."
+msgstr ""
+
+msgid ""
+"``roots(set)``\n"
+" Changesets with no parent changeset in set."
+msgstr ""
+
+msgid ""
+"``outgoing([path])``\n"
+" Changesets not found in the specified destination repository, or the\n"
+" default push location."
+msgstr ""
+
+#. i18n: "outgoing" is a keyword
+msgid "outgoing requires a repository path"
+msgstr "outgoing需è¦ä¸€å€‹å„²å­˜åº«è·¯å¾‘"
+
+msgid ""
+"``tag(name)``\n"
+" The specified tag by name, or all tagged revisions if no name is given."
+msgstr ""
+
+#. i18n: "tag" is a keyword
+msgid "tag takes one or no arguments"
+msgstr "tag 需è¦ä¸€å€‹åƒæ•¸æˆ–ä¸éœ€è¦åƒæ•¸"
+
+#. i18n: "tag" is a keyword
+msgid "the argument to tag must be a string"
+msgstr "tagçš„åƒæ•¸å¿…須是一個字串"
+
+msgid "can't negate that"
+msgstr "ä¸èƒ½å¦å®šé‚£å€‹"
+
+msgid "not a symbol"
+msgstr "ä¸æ˜¯ä¸€å€‹ç¬¦è™Ÿ"
+
+msgid "empty query"
+msgstr "空白的查詢"
+
+msgid "searching for exact renames"
+msgstr ""
+
+msgid "searching for similar files"
+msgstr "æœå°‹é¡žä¼¼çš„檔案"
+
+#, python-format
+msgid "%s looks like a binary file."
+msgstr "%s 看起來åƒæ˜¯äºŒé€²ä½æª”案。"
+
+msgid "can only specify two labels."
+msgstr "åªèƒ½æŒ‡å®šå…©å€‹ labels。"
+
+msgid "warning: conflicts during merge.\n"
+msgstr "警告: åˆä½µä¸­ç™¼ç”Ÿè¡çªã€‚\n"
+
+#, python-format
+msgid "couldn't parse location %s"
+msgstr "無法解æžä½å€ %s"
+
+msgid "could not create remote repo"
+msgstr "無法建立é ç«¯ repo"
+
+msgid "no suitable response from remote hg"
+msgstr "é ç«¯hg沒有é©ç•¶çš„回應"
+
+msgid "remote: "
+msgstr "é ç«¯: "
+
+msgid "unexpected response:"
+msgstr "æ„料之外的回應:"
+
+#, python-format
+msgid "push refused: %s"
+msgstr "push 被拒絕: %s"
+
+#, python-format
+msgid "'%s' does not appear to be an hg repository"
+msgstr ""
+
+msgid "cannot lock static-http repository"
+msgstr "無法鎖定 static-http repository"
+
+msgid "cannot create new static-http repository"
+msgstr "無法建立新的 static-http repository"
+
+#, python-format
+msgid "invalid entry in fncache, line %s"
+msgstr ""
+
+#, python-format
+msgid "subrepo spec file %s not found"
+msgstr "å­å„²å­˜åº«æ述檔 %s 找ä¸åˆ°"
+
+msgid "missing ] in subrepo source"
+msgstr ""
+
+#, python-format
+msgid "bad subrepository pattern in %s: %s"
+msgstr ""
+
+#, python-format
+msgid ""
+" subrepository sources for %s differ\n"
+"use (l)ocal source (%s) or (r)emote source (%s)?"
+msgstr ""
+
+msgid "&Remote"
+msgstr ""
+
+#, python-format
+msgid ""
+" local changed subrepository %s which remote removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid ""
+" remote changed subrepository %s which local removed\n"
+"use (c)hanged version or (d)elete?"
+msgstr ""
+
+#, python-format
+msgid "default path for subrepository %s not found"
+msgstr ""
+
+#, python-format
+msgid "unknown subrepo type %s"
+msgstr "未知的å­å„²å­˜åº«é¡žåž‹ %s"
+
+#, python-format
+msgid "warning: error \"%s\" in subrepository \"%s\"\n"
+msgstr ""
+
+#, python-format
+msgid "removing subrepo %s\n"
+msgstr "移除å­å„²å­˜åº« %s\n"
+
+#, python-format
+msgid "pulling subrepo %s from %s\n"
+msgstr "拉收å­å„²å­˜åº« %s 從 %s\n"
+
+#, python-format
+msgid "pushing subrepo %s to %s\n"
+msgstr "推é€å­å„²å­˜åº« %s 到 %s\n"
+
+msgid "cannot commit svn externals"
+msgstr "ä¸èƒ½æ交 svn externals"
+
+#, python-format
+msgid "not removing repo %s because it has changes.\n"
+msgstr "ä¸èƒ½ç§»é™¤å„²å­˜åº« %s 因為他已經改變了.\n"
+
+#, python-format
+msgid "%s, line %s: %s\n"
+msgstr ""
+
+msgid "cannot parse entry"
+msgstr ""
+
+#, python-format
+msgid "node '%s' is not well formed"
+msgstr ""
+
+msgid ".hg/tags.cache is corrupt, rebuilding it\n"
+msgstr ""
+
+msgid "unmatched quotes"
+msgstr "沒有é…å°çš„引號"
+
+#, python-format
+msgid "error expanding '%s%%%s'"
+msgstr "'%s%%%s'展開失敗"
+
+#, python-format
+msgid "unknown filter '%s'"
+msgstr "未知的éŽæ¿¾å™¨ '%s'"
+
+#, python-format
+msgid "style not found: %s"
+msgstr "找ä¸åˆ°style: %s"
+
+#, python-format
+msgid "template file %s: %s"
+msgstr "佔存檔 %s: %s"
+
+msgid "cannot use transaction when it is already committed/aborted"
+msgstr ""
+
+#, python-format
+msgid "failed to truncate %s\n"
+msgstr "ä¸èƒ½æ¸…除(truncate) %s\n"
+
+msgid "transaction abort!\n"
+msgstr ""
+
+msgid "rollback completed\n"
+msgstr "rollback 完æˆäº†\n"
+
+msgid "rollback failed - please run hg recover\n"
+msgstr "rollback 失敗 - 請執行 hg recover 命令\n"
+
+#, python-format
+msgid "Not trusting file %s from untrusted user %s, group %s\n"
+msgstr "ä¸å—信任的檔案 %s 從ä¸å—信任的使用者 %s,群組 %s\n"
+
+#, python-format
+msgid "Ignored: %s\n"
+msgstr "忽略: %s\n"
+
+#, python-format
+msgid "(deprecated '%%' in path %s=%s from %s)\n"
+msgstr ""
+
+#, python-format
+msgid "ignoring untrusted configuration option %s.%s = %s\n"
+msgstr "忽略未å—信任的設定é¸é … %s.%s=%s\n"
+
+#, python-format
+msgid "%s.%s not a boolean ('%s')"
+msgstr ""
+
+msgid "enter a commit username:"
+msgstr "請輸入一個æ交的使用者å稱:"
+
+#, python-format
+msgid "No username found, using '%s' instead\n"
+msgstr "找ä¸åˆ°åå­—,用 '%s'代替\n"
+
+msgid "no username supplied (see \"hg help config\")"
+msgstr "沒有æ供使用者å稱(查閱 'hg help config')"
+
+#, python-format
+msgid "username %s contains a newline\n"
+msgstr "使用者å稱 '%s' è£é¢æœ‰æ›è¡Œå­—å…ƒ\n"
+
+msgid "response expected"
+msgstr "é æœŸä¹‹ä¸­çš„回應"
+
+msgid "unrecognized response\n"
+msgstr "辨èªä¸å‡ºä¾†çš„回應\n"
+
+msgid "password: "
+msgstr "密碼:"
+
+msgid "edit failed"
+msgstr "編輯失敗"
+
+msgid "http authorization required"
+msgstr "http 需è¦èªè¨¼"
+
+msgid "http authorization required\n"
+msgstr "http 需è¦èªè¨¼\n"
+
+#, python-format
+msgid "realm: %s\n"
+msgstr "領域: %s\n"
+
+#, python-format
+msgid "user: %s\n"
+msgstr "使用者: %s\n"
+
+msgid "user:"
+msgstr "使用者:"
+
+#, python-format
+msgid "http auth: user %s, password %s\n"
+msgstr "http èªè¨¼: 使用者 %s , 密碼 %s\n"
+
+#, python-format
+msgid "ignoring invalid [auth] key '%s'\n"
+msgstr "忽略無效的[èªè¨¼]éµç¢¼ '%s' \n"
+
+msgid "certificate checking requires Python 2.6"
+msgstr "憑證檢驗需è¦Python 2.6版"
+
+msgid "no certificate received"
+msgstr ""
+
+#, python-format
+msgid "certificate is for %s"
+msgstr "憑證是for %s"
+
+msgid "no commonName found in certificate"
+msgstr ""
+
+#, python-format
+msgid "%s certificate error: %s"
+msgstr "%s 憑證錯誤: %s"
+
+#, python-format
+msgid "command '%s' failed: %s"
+msgstr "命令 '%s' 失敗了: %s"
+
+#, python-format
+msgid "path contains illegal component: %s"
+msgstr "path 包å«äº†éžæ³•çš„組æˆå…ƒä»¶: %s"
+
+#, python-format
+msgid "path %r is inside repo %r"
+msgstr ""
+
+#, python-format
+msgid "path %r traverses symbolic link %r"
+msgstr ""
+
+msgid "Hardlinks not supported"
+msgstr "硬å¼é€£çµä¸è¢«æ”¯æ´"
+
+#, python-format
+msgid "could not symlink to %r: %s"
+msgstr "ä¸èƒ½ç”¢ç”Ÿç¬¦è™Ÿé€£çµåˆ° %r: %s"
+
+#, python-format
+msgid "invalid date: %r"
+msgstr "%r 是無效的日期"
+
+#, python-format
+msgid "date exceeds 32 bits: %d"
+msgstr "日期超出 32ä½å…ƒ(s) 了 : %d"
+
+#, python-format
+msgid "impossible time zone offset: %d"
+msgstr ""
+
+#, python-format
+msgid "invalid day spec: %s"
+msgstr "無效的時間: %s"
+
+#, python-format
+msgid "%.0f GB"
+msgstr ""
+
+#, python-format
+msgid "%.1f GB"
+msgstr ""
+
+#, python-format
+msgid "%.2f GB"
+msgstr ""
+
+#, python-format
+msgid "%.0f MB"
+msgstr ""
+
+#, python-format
+msgid "%.1f MB"
+msgstr ""
+
+#, python-format
+msgid "%.2f MB"
+msgstr ""
+
+#, python-format
+msgid "%.0f KB"
+msgstr ""
+
+#, python-format
+msgid "%.1f KB"
+msgstr ""
+
+#, python-format
+msgid "%.2f KB"
+msgstr ""
+
+#, python-format
+msgid "%.0f bytes"
+msgstr ""
+
+#, python-format
+msgid "no port number associated with service '%s'"
+msgstr ""
+
+msgid "cannot verify bundle or remote repos"
+msgstr "ä¸èƒ½ verify bundle 或 é ç«¯å„²å­˜åº«"
+
+msgid "interrupted"
+msgstr "中斷"
+
+#, python-format
+msgid "empty or missing %s"
+msgstr "空白的或éºå¤± %s"
+
+#, python-format
+msgid "data length off by %d bytes"
+msgstr ""
+
+#, python-format
+msgid "index contains %d extra bytes"
+msgstr "index åŒ…å« %d個é¡å¤–çš„ä½å…ƒçµ„"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 1"
+msgstr "警報:`%s' 使用 revlog æ ¼å¼ 1"
+
+#, python-format
+msgid "warning: `%s' uses revlog format 0"
+msgstr "警報:`%s' 使用 revlog æ ¼å¼ 0"
+
+#, python-format
+msgid "rev %d points to nonexistent changeset %d"
+msgstr "rev %d 指到ä¸å­˜åœ¨çš„ changeset %d"
+
+#, python-format
+msgid "rev %d points to unexpected changeset %d"
+msgstr "rev %d 指到æ„料之外的changeset %d"
+
+#, python-format
+msgid " (expected %s)"
+msgstr ""
+
+#, python-format
+msgid "unknown parent 1 %s of %s"
+msgstr "未知的æ¯ç³» 1 %s of %s"
+
+#, python-format
+msgid "unknown parent 2 %s of %s"
+msgstr "未知的æ¯ç³» 2 %s of %s"
+
+#, python-format
+msgid "checking parents of %s"
+msgstr "正在檢查 %s 的 parents"
+
+#, python-format
+msgid "duplicate revision %d (%d)"
+msgstr "é‡è¤‡çš„修定版 %d (%d)"
+
+msgid "abandoned transaction found - run hg recover\n"
+msgstr ""
+
+#, python-format
+msgid "repository uses revlog format %d\n"
+msgstr "儲存庫使用 revlog æ ¼å¼ %d\n"
+
+msgid "checking changesets\n"
+msgstr "檢查changeset中...\n"
+
+msgid "checking"
+msgstr "檢查中..."
+
+#, python-format
+msgid "unpacking changeset %s"
+msgstr "解包(unpacking)changeset %s"
+
+msgid "checking manifests\n"
+msgstr "檢查清單中...\n"
+
+#, python-format
+msgid "%s not in changesets"
+msgstr "%s ä¸åœ¨changesets裡"
+
+msgid "file without name in manifest"
+msgstr ""
+
+#, python-format
+msgid "reading manifest delta %s"
+msgstr "讀å–manifest delta %s"
+
+msgid "crosschecking files in changesets and manifests\n"
+msgstr "在 changesets å’Œ manifests裡交å‰æª¢æŸ¥\n"
+
+msgid "crosschecking"
+msgstr "交å‰æª¢æŸ¥ä¸­"
+
+#, python-format
+msgid "changeset refers to unknown manifest %s"
+msgstr "changeset åƒè€ƒåˆ°æœªçŸ¥çš„清單 %s"
+
+msgid "in changeset but not in manifest"
+msgstr "在changeset 但ä¸åœ¨æ¸…單裡"
+
+msgid "in manifest but not in changeset"
+msgstr "在清單裡但ä¸åœ¨changeset"
+
+msgid "checking files\n"
+msgstr "檢查檔案中...\n"
+
+#, python-format
+msgid "cannot decode filename '%s'"
+msgstr "檔å '%s' ä¸èƒ½è¢«è§£ç¢¼"
+
+#, python-format
+msgid "broken revlog! (%s)"
+msgstr ""
+
+msgid "missing revlog!"
+msgstr "éºå¤± revlog!"
+
+#, python-format
+msgid "%s not in manifests"
+msgstr "%s ä¸åœ¨æ¸…單裡é¢"
+
+#, python-format
+msgid "unpacked size is %s, %s expected"
+msgstr ""
+
+#, python-format
+msgid "unpacking %s"
+msgstr "%s 拆包中(unpacking)"
+
+#, python-format
+msgid "warning: copy source of '%s' not in parents of %s"
+msgstr "警報: '%s'的複製來æºä¸åœ¨ %s çš„æ¯ç³»"
+
+#, python-format
+msgid "empty or missing copy source revlog %s:%s"
+msgstr ""
+
+#, python-format
+msgid "warning: %s@%s: copy source revision is nullid %s:%s\n"
+msgstr ""
+
+#, python-format
+msgid "checking rename of %s"
+msgstr "正在檢查 %s çš„æ›´å"
+
+#, python-format
+msgid "%s in manifests not found"
+msgstr "%s 在清單找ä¸åˆ°"
+
+#, python-format
+msgid "warning: orphan revlog '%s'"
+msgstr "警告: '%s' 是單ç¨çš„revlog"
+
+#, python-format
+msgid "%d files, %d changesets, %d total revisions\n"
+msgstr "%d個檔案,%d個changesets,%d個總修訂版\n"
+
+#, python-format
+msgid "%d warnings encountered!\n"
+msgstr "é‡åˆ°äº† %d 個警告\n"
+
+#, python-format
+msgid "%d integrity errors encountered!\n"
+msgstr "é‡åˆ°äº† %d 個完整性錯誤\n"
+
+#, python-format
+msgid "(first damaged changeset appears to be %d)\n"
+msgstr "(第一個å±éšªçš„changeset 出ç¾åœ¨%d)\n"
+
+msgid "user name not available - set USERNAME environment variable"
+msgstr "使用者åå­—(user name)ä¸èƒ½ç”¨è€¶,設一下 USERNAME å§"
+
+msgid "look up remote revision"
+msgstr "查看é ç«¯ä¿®è¨‚版"
+
+msgid "look up remote changes"
+msgstr "查看é ç«¯changes"
+
+msgid "push failed:"
+msgstr "push 失敗:"
+
+msgid "push failed (unexpected response):"
+msgstr "push 失敗(æ„料之外的回應):"
+
+#~ msgid ""
+#~ "%s: files over 10MB may cause memory and performance problems\n"
+#~ "(use 'hg revert %s' to unadd the file)\n"
+#~ msgstr ""
+#~ "%s: 檔案超éŽ10Må¯èƒ½ç”¢ç”Ÿè¨˜æ†¶é«”跟效能å•é¡Œ\n"
+#~ "(使用 'hg revert %s'來å–消新增)\n"
+
+#~ msgid "journal already exists - run hg recover"
+#~ msgstr "日誌已經存在 - 執行 hg recover"
+
+#~ msgid "abort: could not import module %s!\n"
+#~ msgstr "中止: ä¸èƒ½åŒ¯å…¥ %s 模組!\n"
+
+#~ msgid "overwrite locally modified files (no backup)"
+#~ msgstr "è“‹éŽåŽ»æœ¬åœ°ç«¯ä¿®æ”¹æª”案(沒有備份)"
+
+#~ msgid "export the repository via HTTP"
+#~ msgstr "將 repository 經由 HTTP 發佈"
+
+#, fuzzy
+#~ msgid "retry file merges from a merge or update"
+#~ msgstr "é‡è©¦ç¶“ç”± merge 或 update 命令所造æˆã€å»æœªå®Œæˆçš„åˆä½µ"
+
+#~ msgid "COMMANDS"
+#~ msgstr "命令"
+
+#~ msgid "certificate not valid before %s"
+#~ msgstr "在%s 之å‰æ†‘è­‰ä¸æ˜¯æœ‰æ•ˆçš„"
+
+#~ msgid "unsynced changes"
+#~ msgstr "未åŒæ­¥çš„變更"
+
+#~ msgid " files"
+#~ msgstr "檔案"
+
+#~ msgid " options:"
+#~ msgstr "\té¸é …:"
diff --git a/mercurial/__init__.py b/mercurial/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/mercurial/__init__.py
diff --git a/mercurial/__version__.py b/mercurial/__version__.py
new file mode 100644
index 0000000..74c95c5
--- /dev/null
+++ b/mercurial/__version__.py
@@ -0,0 +1,2 @@
+# this file is autogenerated by setup.py
+version = "2.3"
diff --git a/mercurial/ancestor.py b/mercurial/ancestor.py
new file mode 100644
index 0000000..867d683
--- /dev/null
+++ b/mercurial/ancestor.py
@@ -0,0 +1,91 @@
+# ancestor.py - generic DAG ancestor algorithm for mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import heapq
+
+def ancestor(a, b, pfunc):
+ """
+ Returns the common ancestor of a and b that is furthest from a
+ root (as measured by longest path) or None if no ancestor is
+ found. If there are multiple common ancestors at the same
+ distance, the first one found is returned.
+
+ pfunc must return a list of parent vertices for a given vertex
+ """
+
+ if a == b:
+ return a
+
+ a, b = sorted([a, b])
+
+ # find depth from root of all ancestors
+ # depth is stored as a negative for heapq
+ parentcache = {}
+ visit = [a, b]
+ depth = {}
+ while visit:
+ vertex = visit[-1]
+ pl = pfunc(vertex)
+ parentcache[vertex] = pl
+ if not pl:
+ depth[vertex] = 0
+ visit.pop()
+ else:
+ for p in pl:
+ if p == a or p == b: # did we find a or b as a parent?
+ return p # we're done
+ if p not in depth:
+ visit.append(p)
+ if visit[-1] == vertex:
+ # -(maximum distance of parents + 1)
+ depth[vertex] = min([depth[p] for p in pl]) - 1
+ visit.pop()
+
+ # traverse ancestors in order of decreasing distance from root
+ def ancestors(vertex):
+ h = [(depth[vertex], vertex)]
+ seen = set()
+ while h:
+ d, n = heapq.heappop(h)
+ if n not in seen:
+ seen.add(n)
+ yield (d, n)
+ for p in parentcache[n]:
+ heapq.heappush(h, (depth[p], p))
+
+ def generations(vertex):
+ sg, s = None, set()
+ for g, v in ancestors(vertex):
+ if g != sg:
+ if sg:
+ yield sg, s
+ sg, s = g, set((v,))
+ else:
+ s.add(v)
+ yield sg, s
+
+ x = generations(a)
+ y = generations(b)
+ gx = x.next()
+ gy = y.next()
+
+ # increment each ancestor list until it is closer to root than
+ # the other, or they match
+ try:
+ while True:
+ if gx[0] == gy[0]:
+ for v in gx[1]:
+ if v in gy[1]:
+ return v
+ gy = y.next()
+ gx = x.next()
+ elif gx[0] > gy[0]:
+ gy = y.next()
+ else:
+ gx = x.next()
+ except StopIteration:
+ return None
diff --git a/mercurial/archival.py b/mercurial/archival.py
new file mode 100644
index 0000000..8eddf29
--- /dev/null
+++ b/mercurial/archival.py
@@ -0,0 +1,291 @@
+# archival.py - revision archival for mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+from node import hex
+import match as matchmod
+import cmdutil
+import scmutil, util, encoding
+import cStringIO, os, tarfile, time, zipfile
+import zlib, gzip
+
+def tidyprefix(dest, kind, prefix):
+ '''choose prefix to use for names in archive. make sure prefix is
+ safe for consumers.'''
+
+ if prefix:
+ prefix = util.normpath(prefix)
+ else:
+ if not isinstance(dest, str):
+ raise ValueError('dest must be string if no prefix')
+ prefix = os.path.basename(dest)
+ lower = prefix.lower()
+ for sfx in exts.get(kind, []):
+ if lower.endswith(sfx):
+ prefix = prefix[:-len(sfx)]
+ break
+ lpfx = os.path.normpath(util.localpath(prefix))
+ prefix = util.pconvert(lpfx)
+ if not prefix.endswith('/'):
+ prefix += '/'
+ if prefix.startswith('../') or os.path.isabs(lpfx) or '/../' in prefix:
+ raise util.Abort(_('archive prefix contains illegal components'))
+ return prefix
+
+exts = {
+ 'tar': ['.tar'],
+ 'tbz2': ['.tbz2', '.tar.bz2'],
+ 'tgz': ['.tgz', '.tar.gz'],
+ 'zip': ['.zip'],
+ }
+
+def guesskind(dest):
+ for kind, extensions in exts.iteritems():
+ if util.any(dest.endswith(ext) for ext in extensions):
+ return kind
+ return None
+
+
+class tarit(object):
+ '''write archive to tar file or stream. can write uncompressed,
+ or compress with gzip or bzip2.'''
+
+ class GzipFileWithTime(gzip.GzipFile):
+
+ def __init__(self, *args, **kw):
+ timestamp = None
+ if 'timestamp' in kw:
+ timestamp = kw.pop('timestamp')
+ if timestamp is None:
+ self.timestamp = time.time()
+ else:
+ self.timestamp = timestamp
+ gzip.GzipFile.__init__(self, *args, **kw)
+
+ def _write_gzip_header(self):
+ self.fileobj.write('\037\213') # magic header
+ self.fileobj.write('\010') # compression method
+ # Python 2.6 deprecates self.filename
+ fname = getattr(self, 'name', None) or self.filename
+ if fname and fname.endswith('.gz'):
+ fname = fname[:-3]
+ flags = 0
+ if fname:
+ flags = gzip.FNAME
+ self.fileobj.write(chr(flags))
+ gzip.write32u(self.fileobj, long(self.timestamp))
+ self.fileobj.write('\002')
+ self.fileobj.write('\377')
+ if fname:
+ self.fileobj.write(fname + '\000')
+
+ def __init__(self, dest, mtime, kind=''):
+ self.mtime = mtime
+ self.fileobj = None
+
+ def taropen(name, mode, fileobj=None):
+ if kind == 'gz':
+ mode = mode[0]
+ if not fileobj:
+ fileobj = open(name, mode + 'b')
+ gzfileobj = self.GzipFileWithTime(name, mode + 'b',
+ zlib.Z_BEST_COMPRESSION,
+ fileobj, timestamp=mtime)
+ self.fileobj = gzfileobj
+ return tarfile.TarFile.taropen(name, mode, gzfileobj)
+ else:
+ self.fileobj = fileobj
+ return tarfile.open(name, mode + kind, fileobj)
+
+ if isinstance(dest, str):
+ self.z = taropen(dest, mode='w:')
+ else:
+ # Python 2.5-2.5.1 have a regression that requires a name arg
+ self.z = taropen(name='', mode='w|', fileobj=dest)
+
+ def addfile(self, name, mode, islink, data):
+ i = tarfile.TarInfo(name)
+ i.mtime = self.mtime
+ i.size = len(data)
+ if islink:
+ i.type = tarfile.SYMTYPE
+ i.mode = 0777
+ i.linkname = data
+ data = None
+ i.size = 0
+ else:
+ i.mode = mode
+ data = cStringIO.StringIO(data)
+ self.z.addfile(i, data)
+
+ def done(self):
+ self.z.close()
+ if self.fileobj:
+ self.fileobj.close()
+
+class tellable(object):
+ '''provide tell method for zipfile.ZipFile when writing to http
+ response file object.'''
+
+ def __init__(self, fp):
+ self.fp = fp
+ self.offset = 0
+
+ def __getattr__(self, key):
+ return getattr(self.fp, key)
+
+ def write(self, s):
+ self.fp.write(s)
+ self.offset += len(s)
+
+ def tell(self):
+ return self.offset
+
+class zipit(object):
+ '''write archive to zip file or stream. can write uncompressed,
+ or compressed with deflate.'''
+
+ def __init__(self, dest, mtime, compress=True):
+ if not isinstance(dest, str):
+ try:
+ dest.tell()
+ except (AttributeError, IOError):
+ dest = tellable(dest)
+ self.z = zipfile.ZipFile(dest, 'w',
+ compress and zipfile.ZIP_DEFLATED or
+ zipfile.ZIP_STORED)
+
+ # Python's zipfile module emits deprecation warnings if we try
+ # to store files with a date before 1980.
+ epoch = 315532800 # calendar.timegm((1980, 1, 1, 0, 0, 0, 1, 1, 0))
+ if mtime < epoch:
+ mtime = epoch
+
+ self.date_time = time.gmtime(mtime)[:6]
+
+ def addfile(self, name, mode, islink, data):
+ i = zipfile.ZipInfo(name, self.date_time)
+ i.compress_type = self.z.compression
+ # unzip will not honor unix file modes unless file creator is
+ # set to unix (id 3).
+ i.create_system = 3
+ ftype = 0x8000 # UNX_IFREG in unzip source code
+ if islink:
+ mode = 0777
+ ftype = 0xa000 # UNX_IFLNK in unzip source code
+ i.external_attr = (mode | ftype) << 16L
+ self.z.writestr(i, data)
+
+ def done(self):
+ self.z.close()
+
+class fileit(object):
+ '''write archive as files in directory.'''
+
+ def __init__(self, name, mtime):
+ self.basedir = name
+ self.opener = scmutil.opener(self.basedir)
+
+ def addfile(self, name, mode, islink, data):
+ if islink:
+ self.opener.symlink(data, name)
+ return
+ f = self.opener(name, "w", atomictemp=True)
+ f.write(data)
+ f.close()
+ destfile = os.path.join(self.basedir, name)
+ os.chmod(destfile, mode)
+
+ def done(self):
+ pass
+
+archivers = {
+ 'files': fileit,
+ 'tar': tarit,
+ 'tbz2': lambda name, mtime: tarit(name, mtime, 'bz2'),
+ 'tgz': lambda name, mtime: tarit(name, mtime, 'gz'),
+ 'uzip': lambda name, mtime: zipit(name, mtime, False),
+ 'zip': zipit,
+ }
+
+def archive(repo, dest, node, kind, decode=True, matchfn=None,
+ prefix=None, mtime=None, subrepos=False):
+ '''create archive of repo as it was at node.
+
+ dest can be name of directory, name of archive file, or file
+ object to write archive to.
+
+ kind is type of archive to create.
+
+ decode tells whether to put files through decode filters from
+ hgrc.
+
+ matchfn is function to filter names of files to write to archive.
+
+ prefix is name of path to put before every archive member.'''
+
+ if kind == 'files':
+ if prefix:
+ raise util.Abort(_('cannot give prefix when archiving to files'))
+ else:
+ prefix = tidyprefix(dest, kind, prefix)
+
+ def write(name, mode, islink, getdata):
+ data = getdata()
+ if decode:
+ data = repo.wwritedata(name, data)
+ archiver.addfile(prefix + name, mode, islink, data)
+
+ if kind not in archivers:
+ raise util.Abort(_("unknown archive type '%s'") % kind)
+
+ ctx = repo[node]
+ archiver = archivers[kind](dest, mtime or ctx.date()[0])
+
+ if repo.ui.configbool("ui", "archivemeta", True):
+ def metadata():
+ base = 'repo: %s\nnode: %s\nbranch: %s\n' % (
+ repo[0].hex(), hex(node), encoding.fromlocal(ctx.branch()))
+
+ tags = ''.join('tag: %s\n' % t for t in ctx.tags()
+ if repo.tagtype(t) == 'global')
+ if not tags:
+ repo.ui.pushbuffer()
+ opts = {'template': '{latesttag}\n{latesttagdistance}',
+ 'style': '', 'patch': None, 'git': None}
+ cmdutil.show_changeset(repo.ui, repo, opts).show(ctx)
+ ltags, dist = repo.ui.popbuffer().split('\n')
+ tags = ''.join('latesttag: %s\n' % t for t in ltags.split(':'))
+ tags += 'latesttagdistance: %s\n' % dist
+
+ return base + tags
+
+ name = '.hg_archival.txt'
+ if not matchfn or matchfn(name):
+ write(name, 0644, False, metadata)
+
+ if matchfn:
+ files = [f for f in ctx.manifest().keys() if matchfn(f)]
+ else:
+ files = ctx.manifest().keys()
+ files.sort()
+ total = len(files)
+ repo.ui.progress(_('archiving'), 0, unit=_('files'), total=total)
+ for i, f in enumerate(files):
+ ff = ctx.flags(f)
+ write(f, 'x' in ff and 0755 or 0644, 'l' in ff, ctx[f].data)
+ repo.ui.progress(_('archiving'), i + 1, item=f,
+ unit=_('files'), total=total)
+ repo.ui.progress(_('archiving'), None)
+
+ if subrepos:
+ for subpath in ctx.substate:
+ sub = ctx.sub(subpath)
+ submatch = matchmod.narrowmatcher(subpath, matchfn)
+ sub.archive(repo.ui, archiver, prefix, submatch)
+
+ archiver.done()
diff --git a/mercurial/base85.c b/mercurial/base85.c
new file mode 100644
index 0000000..0d45da2
--- /dev/null
+++ b/mercurial/base85.c
@@ -0,0 +1,185 @@
+/*
+ base85 codec
+
+ Copyright 2006 Brendan Cully <brendan@kublai.com>
+
+ This software may be used and distributed according to the terms of
+ the GNU General Public License, incorporated herein by reference.
+
+ Largely based on git's implementation
+*/
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+
+#include "util.h"
+
+static const char b85chars[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~";
+static char b85dec[256];
+
+static void
+b85prep(void)
+{
+ int i;
+
+ memset(b85dec, 0, sizeof(b85dec));
+ for (i = 0; i < sizeof(b85chars); i++)
+ b85dec[(int)(b85chars[i])] = i + 1;
+}
+
+static PyObject *
+b85encode(PyObject *self, PyObject *args)
+{
+ const unsigned char *text;
+ PyObject *out;
+ char *dst;
+ Py_ssize_t len, olen, i;
+ unsigned int acc, val, ch;
+ int pad = 0;
+
+ if (!PyArg_ParseTuple(args, "s#|i", &text, &len, &pad))
+ return NULL;
+
+ if (pad)
+ olen = ((len + 3) / 4 * 5) - 3;
+ else {
+ olen = len % 4;
+ if (olen)
+ olen++;
+ olen += len / 4 * 5;
+ }
+ if (!(out = PyBytes_FromStringAndSize(NULL, olen + 3)))
+ return NULL;
+
+ dst = PyBytes_AsString(out);
+
+ while (len) {
+ acc = 0;
+ for (i = 24; i >= 0; i -= 8) {
+ ch = *text++;
+ acc |= ch << i;
+ if (--len == 0)
+ break;
+ }
+ for (i = 4; i >= 0; i--) {
+ val = acc % 85;
+ acc /= 85;
+ dst[i] = b85chars[val];
+ }
+ dst += 5;
+ }
+
+ if (!pad)
+ _PyBytes_Resize(&out, olen);
+
+ return out;
+}
+
+static PyObject *
+b85decode(PyObject *self, PyObject *args)
+{
+ PyObject *out;
+ const char *text;
+ char *dst;
+ Py_ssize_t len, i, j, olen, cap;
+ int c;
+ unsigned int acc;
+
+ if (!PyArg_ParseTuple(args, "s#", &text, &len))
+ return NULL;
+
+ olen = len / 5 * 4;
+ i = len % 5;
+ if (i)
+ olen += i - 1;
+ if (!(out = PyBytes_FromStringAndSize(NULL, olen)))
+ return NULL;
+
+ dst = PyBytes_AsString(out);
+
+ i = 0;
+ while (i < len)
+ {
+ acc = 0;
+ cap = len - i - 1;
+ if (cap > 4)
+ cap = 4;
+ for (j = 0; j < cap; i++, j++)
+ {
+ c = b85dec[(int)*text++] - 1;
+ if (c < 0)
+ return PyErr_Format(
+ PyExc_ValueError,
+ "bad base85 character at position %d",
+ (int)i);
+ acc = acc * 85 + c;
+ }
+ if (i++ < len)
+ {
+ c = b85dec[(int)*text++] - 1;
+ if (c < 0)
+ return PyErr_Format(
+ PyExc_ValueError,
+ "bad base85 character at position %d",
+ (int)i);
+ /* overflow detection: 0xffffffff == "|NsC0",
+ * "|NsC" == 0x03030303 */
+ if (acc > 0x03030303 || (acc *= 85) > 0xffffffff - c)
+ return PyErr_Format(
+ PyExc_ValueError,
+ "bad base85 sequence at position %d",
+ (int)i);
+ acc += c;
+ }
+
+ cap = olen < 4 ? olen : 4;
+ olen -= cap;
+ for (j = 0; j < 4 - cap; j++)
+ acc *= 85;
+ if (cap && cap < 4)
+ acc += 0xffffff >> (cap - 1) * 8;
+ for (j = 0; j < cap; j++)
+ {
+ acc = (acc << 8) | (acc >> 24);
+ *dst++ = acc;
+ }
+ }
+
+ return out;
+}
+
+static char base85_doc[] = "Base85 Data Encoding";
+
+static PyMethodDef methods[] = {
+ {"b85encode", b85encode, METH_VARARGS,
+ "Encode text in base85.\n\n"
+ "If the second parameter is true, pad the result to a multiple of "
+ "five characters.\n"},
+ {"b85decode", b85decode, METH_VARARGS, "Decode base85 text.\n"},
+ {NULL, NULL}
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef base85_module = {
+ PyModuleDef_HEAD_INIT,
+ "base85",
+ base85_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_base85(void)
+{
+ b85prep();
+
+ return PyModule_Create(&base85_module);
+}
+#else
+PyMODINIT_FUNC initbase85(void)
+{
+ Py_InitModule3("base85", methods, base85_doc);
+
+ b85prep();
+}
+#endif
diff --git a/mercurial/bdiff.c b/mercurial/bdiff.c
new file mode 100644
index 0000000..be38b53
--- /dev/null
+++ b/mercurial/bdiff.c
@@ -0,0 +1,483 @@
+/*
+ bdiff.c - efficient binary diff extension for Mercurial
+
+ Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+
+ This software may be used and distributed according to the terms of
+ the GNU General Public License, incorporated herein by reference.
+
+ Based roughly on Python difflib
+*/
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#include "util.h"
+
+struct line {
+ int hash, n, e;
+ Py_ssize_t len;
+ const char *l;
+};
+
+struct pos {
+ int pos, len;
+};
+
+struct hunk;
+struct hunk {
+ int a1, a2, b1, b2;
+ struct hunk *next;
+};
+
+static int splitlines(const char *a, Py_ssize_t len, struct line **lr)
+{
+ unsigned hash;
+ int i;
+ const char *p, *b = a;
+ const char * const plast = a + len - 1;
+ struct line *l;
+
+ /* count the lines */
+ i = 1; /* extra line for sentinel */
+ for (p = a; p < a + len; p++)
+ if (*p == '\n' || p == plast)
+ i++;
+
+ *lr = l = (struct line *)malloc(sizeof(struct line) * i);
+ if (!l)
+ return -1;
+
+ /* build the line array and calculate hashes */
+ hash = 0;
+ for (p = a; p < a + len; p++) {
+ /* Leonid Yuriev's hash */
+ hash = (hash * 1664525) + (unsigned char)*p + 1013904223;
+
+ if (*p == '\n' || p == plast) {
+ l->hash = hash;
+ hash = 0;
+ l->len = p - b + 1;
+ l->l = b;
+ l->n = INT_MAX;
+ l++;
+ b = p + 1;
+ }
+ }
+
+ /* set up a sentinel */
+ l->hash = 0;
+ l->len = 0;
+ l->l = a + len;
+ return i - 1;
+}
+
+static inline int cmp(struct line *a, struct line *b)
+{
+ return a->hash != b->hash || a->len != b->len || memcmp(a->l, b->l, a->len);
+}
+
+static int equatelines(struct line *a, int an, struct line *b, int bn)
+{
+ int i, j, buckets = 1, t, scale;
+ struct pos *h = NULL;
+
+ /* build a hash table of the next highest power of 2 */
+ while (buckets < bn + 1)
+ buckets *= 2;
+
+ /* try to allocate a large hash table to avoid collisions */
+ for (scale = 4; scale; scale /= 2) {
+ h = (struct pos *)malloc(scale * buckets * sizeof(struct pos));
+ if (h)
+ break;
+ }
+
+ if (!h)
+ return 0;
+
+ buckets = buckets * scale - 1;
+
+ /* clear the hash table */
+ for (i = 0; i <= buckets; i++) {
+ h[i].pos = INT_MAX;
+ h[i].len = 0;
+ }
+
+ /* add lines to the hash table chains */
+ for (i = bn - 1; i >= 0; i--) {
+ /* find the equivalence class */
+ for (j = b[i].hash & buckets; h[j].pos != INT_MAX;
+ j = (j + 1) & buckets)
+ if (!cmp(b + i, b + h[j].pos))
+ break;
+
+ /* add to the head of the equivalence class */
+ b[i].n = h[j].pos;
+ b[i].e = j;
+ h[j].pos = i;
+ h[j].len++; /* keep track of popularity */
+ }
+
+ /* compute popularity threshold */
+ t = (bn >= 31000) ? bn / 1000 : 1000000 / (bn + 1);
+
+ /* match items in a to their equivalence class in b */
+ for (i = 0; i < an; i++) {
+ /* find the equivalence class */
+ for (j = a[i].hash & buckets; h[j].pos != INT_MAX;
+ j = (j + 1) & buckets)
+ if (!cmp(a + i, b + h[j].pos))
+ break;
+
+ a[i].e = j; /* use equivalence class for quick compare */
+ if (h[j].len <= t)
+ a[i].n = h[j].pos; /* point to head of match list */
+ else
+ a[i].n = INT_MAX; /* too popular */
+ }
+
+ /* discard hash tables */
+ free(h);
+ return 1;
+}
+
+static int longest_match(struct line *a, struct line *b, struct pos *pos,
+ int a1, int a2, int b1, int b2, int *omi, int *omj)
+{
+ int mi = a1, mj = b1, mk = 0, mb = 0, i, j, k;
+
+ for (i = a1; i < a2; i++) {
+ /* skip things before the current block */
+ for (j = a[i].n; j < b1; j = b[j].n)
+ ;
+
+ /* loop through all lines match a[i] in b */
+ for (; j < b2; j = b[j].n) {
+ /* does this extend an earlier match? */
+ if (i > a1 && j > b1 && pos[j - 1].pos == i - 1)
+ k = pos[j - 1].len + 1;
+ else
+ k = 1;
+ pos[j].pos = i;
+ pos[j].len = k;
+
+ /* best match so far? */
+ if (k > mk) {
+ mi = i;
+ mj = j;
+ mk = k;
+ }
+ }
+ }
+
+ if (mk) {
+ mi = mi - mk + 1;
+ mj = mj - mk + 1;
+ }
+
+ /* expand match to include neighboring popular lines */
+ while (mi - mb > a1 && mj - mb > b1 &&
+ a[mi - mb - 1].e == b[mj - mb - 1].e)
+ mb++;
+ while (mi + mk < a2 && mj + mk < b2 &&
+ a[mi + mk].e == b[mj + mk].e)
+ mk++;
+
+ *omi = mi - mb;
+ *omj = mj - mb;
+
+ return mk + mb;
+}
+
+static struct hunk *recurse(struct line *a, struct line *b, struct pos *pos,
+ int a1, int a2, int b1, int b2, struct hunk *l)
+{
+ int i, j, k;
+
+ while (1) {
+ /* find the longest match in this chunk */
+ k = longest_match(a, b, pos, a1, a2, b1, b2, &i, &j);
+ if (!k)
+ return l;
+
+ /* and recurse on the remaining chunks on either side */
+ l = recurse(a, b, pos, a1, i, b1, j, l);
+ if (!l)
+ return NULL;
+
+ l->next = (struct hunk *)malloc(sizeof(struct hunk));
+ if (!l->next)
+ return NULL;
+
+ l = l->next;
+ l->a1 = i;
+ l->a2 = i + k;
+ l->b1 = j;
+ l->b2 = j + k;
+ l->next = NULL;
+
+ /* tail-recursion didn't happen, so do equivalent iteration */
+ a1 = i + k;
+ b1 = j + k;
+ }
+}
+
+static int diff(struct line *a, int an, struct line *b, int bn,
+ struct hunk *base)
+{
+ struct hunk *curr;
+ struct pos *pos;
+ int t, count = 0;
+
+ /* allocate and fill arrays */
+ t = equatelines(a, an, b, bn);
+ pos = (struct pos *)calloc(bn ? bn : 1, sizeof(struct pos));
+
+ if (pos && t) {
+ /* generate the matching block list */
+
+ curr = recurse(a, b, pos, 0, an, 0, bn, base);
+ if (!curr)
+ return -1;
+
+ /* sentinel end hunk */
+ curr->next = (struct hunk *)malloc(sizeof(struct hunk));
+ if (!curr->next)
+ return -1;
+ curr = curr->next;
+ curr->a1 = curr->a2 = an;
+ curr->b1 = curr->b2 = bn;
+ curr->next = NULL;
+ }
+
+ free(pos);
+
+ /* normalize the hunk list, try to push each hunk towards the end */
+ for (curr = base->next; curr; curr = curr->next) {
+ struct hunk *next = curr->next;
+ int shift = 0;
+
+ if (!next)
+ break;
+
+ if (curr->a2 == next->a1)
+ while (curr->a2 + shift < an && curr->b2 + shift < bn
+ && !cmp(a + curr->a2 + shift,
+ b + curr->b2 + shift))
+ shift++;
+ else if (curr->b2 == next->b1)
+ while (curr->b2 + shift < bn && curr->a2 + shift < an
+ && !cmp(b + curr->b2 + shift,
+ a + curr->a2 + shift))
+ shift++;
+ if (!shift)
+ continue;
+ curr->b2 += shift;
+ next->b1 += shift;
+ curr->a2 += shift;
+ next->a1 += shift;
+ }
+
+ for (curr = base->next; curr; curr = curr->next)
+ count++;
+ return count;
+}
+
+static void freehunks(struct hunk *l)
+{
+ struct hunk *n;
+ for (; l; l = n) {
+ n = l->next;
+ free(l);
+ }
+}
+
+static PyObject *blocks(PyObject *self, PyObject *args)
+{
+ PyObject *sa, *sb, *rl = NULL, *m;
+ struct line *a, *b;
+ struct hunk l, *h;
+ int an, bn, count, pos = 0;
+
+ if (!PyArg_ParseTuple(args, "SS:bdiff", &sa, &sb))
+ return NULL;
+
+ an = splitlines(PyBytes_AsString(sa), PyBytes_Size(sa), &a);
+ bn = splitlines(PyBytes_AsString(sb), PyBytes_Size(sb), &b);
+
+ if (!a || !b)
+ goto nomem;
+
+ l.next = NULL;
+ count = diff(a, an, b, bn, &l);
+ if (count < 0)
+ goto nomem;
+
+ rl = PyList_New(count);
+ if (!rl)
+ goto nomem;
+
+ for (h = l.next; h; h = h->next) {
+ m = Py_BuildValue("iiii", h->a1, h->a2, h->b1, h->b2);
+ PyList_SetItem(rl, pos, m);
+ pos++;
+ }
+
+nomem:
+ free(a);
+ free(b);
+ freehunks(l.next);
+ return rl ? rl : PyErr_NoMemory();
+}
+
+static PyObject *bdiff(PyObject *self, PyObject *args)
+{
+ char *sa, *sb, *rb;
+ PyObject *result = NULL;
+ struct line *al, *bl;
+ struct hunk l, *h;
+ int an, bn, count;
+ Py_ssize_t len = 0, la, lb;
+ PyThreadState *_save;
+
+ if (!PyArg_ParseTuple(args, "s#s#:bdiff", &sa, &la, &sb, &lb))
+ return NULL;
+
+ _save = PyEval_SaveThread();
+ an = splitlines(sa, la, &al);
+ bn = splitlines(sb, lb, &bl);
+ if (!al || !bl)
+ goto nomem;
+
+ l.next = NULL;
+ count = diff(al, an, bl, bn, &l);
+ if (count < 0)
+ goto nomem;
+
+ /* calculate length of output */
+ la = lb = 0;
+ for (h = l.next; h; h = h->next) {
+ if (h->a1 != la || h->b1 != lb)
+ len += 12 + bl[h->b1].l - bl[lb].l;
+ la = h->a2;
+ lb = h->b2;
+ }
+ PyEval_RestoreThread(_save);
+ _save = NULL;
+
+ result = PyBytes_FromStringAndSize(NULL, len);
+
+ if (!result)
+ goto nomem;
+
+ /* build binary patch */
+ rb = PyBytes_AsString(result);
+ la = lb = 0;
+
+ for (h = l.next; h; h = h->next) {
+ if (h->a1 != la || h->b1 != lb) {
+ len = bl[h->b1].l - bl[lb].l;
+
+#define checkputbe32(__x, __c) \
+ if (__x > UINT_MAX) { \
+ PyErr_SetString(PyExc_ValueError, \
+ "bdiff: value too large for putbe32"); \
+ goto nomem; \
+ } \
+ putbe32((uint32_t)(__x), __c);
+
+ checkputbe32(al[la].l - al->l, rb);
+ checkputbe32(al[h->a1].l - al->l, rb + 4);
+ checkputbe32(len, rb + 8);
+ memcpy(rb + 12, bl[lb].l, len);
+ rb += 12 + len;
+ }
+ la = h->a2;
+ lb = h->b2;
+ }
+
+nomem:
+ if (_save)
+ PyEval_RestoreThread(_save);
+ free(al);
+ free(bl);
+ freehunks(l.next);
+ return result ? result : PyErr_NoMemory();
+}
+
+/*
+ * If allws != 0, remove all whitespace (' ', \t and \r). Otherwise,
+ * reduce whitespace sequences to a single space and trim remaining whitespace
+ * from end of lines.
+ */
+static PyObject *fixws(PyObject *self, PyObject *args)
+{
+ PyObject *s, *result = NULL;
+ char allws, c;
+ const char *r;
+ Py_ssize_t i, rlen, wlen = 0;
+ char *w;
+
+ if (!PyArg_ParseTuple(args, "Sb:fixws", &s, &allws))
+ return NULL;
+ r = PyBytes_AsString(s);
+ rlen = PyBytes_Size(s);
+
+ w = (char *)malloc(rlen ? rlen : 1);
+ if (!w)
+ goto nomem;
+
+ for (i = 0; i != rlen; i++) {
+ c = r[i];
+ if (c == ' ' || c == '\t' || c == '\r') {
+ if (!allws && (wlen == 0 || w[wlen - 1] != ' '))
+ w[wlen++] = ' ';
+ } else if (c == '\n' && !allws
+ && wlen > 0 && w[wlen - 1] == ' ') {
+ w[wlen - 1] = '\n';
+ } else {
+ w[wlen++] = c;
+ }
+ }
+
+ result = PyBytes_FromStringAndSize(w, wlen);
+
+nomem:
+ free(w);
+ return result ? result : PyErr_NoMemory();
+}
+
+
+static char mdiff_doc[] = "Efficient binary diff.";
+
+static PyMethodDef methods[] = {
+ {"bdiff", bdiff, METH_VARARGS, "calculate a binary diff\n"},
+ {"blocks", blocks, METH_VARARGS, "find a list of matching lines\n"},
+ {"fixws", fixws, METH_VARARGS, "normalize diff whitespaces\n"},
+ {NULL, NULL}
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef bdiff_module = {
+ PyModuleDef_HEAD_INIT,
+ "bdiff",
+ mdiff_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_bdiff(void)
+{
+ return PyModule_Create(&bdiff_module);
+}
+#else
+PyMODINIT_FUNC initbdiff(void)
+{
+ Py_InitModule3("bdiff", methods, mdiff_doc);
+}
+#endif
+
diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
new file mode 100644
index 0000000..a7cd854
--- /dev/null
+++ b/mercurial/bookmarks.py
@@ -0,0 +1,254 @@
+# Mercurial bookmark support code
+#
+# Copyright 2008 David Soria Parra <dsp@php.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.i18n import _
+from mercurial.node import hex
+from mercurial import encoding, error, util
+import errno, os
+
+def valid(mark):
+ for c in (':', '\0', '\n', '\r'):
+ if c in mark:
+ return False
+ return True
+
+def read(repo):
+ '''Parse .hg/bookmarks file and return a dictionary
+
+ Bookmarks are stored as {HASH}\\s{NAME}\\n (localtags format) values
+ in the .hg/bookmarks file.
+ Read the file and return a (name=>nodeid) dictionary
+ '''
+ bookmarks = {}
+ try:
+ for line in repo.opener('bookmarks'):
+ line = line.strip()
+ if not line:
+ continue
+ if ' ' not in line:
+ repo.ui.warn(_('malformed line in .hg/bookmarks: %r\n') % line)
+ continue
+ sha, refspec = line.split(' ', 1)
+ refspec = encoding.tolocal(refspec)
+ try:
+ bookmarks[refspec] = repo.changelog.lookup(sha)
+ except LookupError:
+ pass
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return bookmarks
+
+def readcurrent(repo):
+ '''Get the current bookmark
+
+ If we use gittishsh branches we have a current bookmark that
+ we are on. This function returns the name of the bookmark. It
+ is stored in .hg/bookmarks.current
+ '''
+ mark = None
+ try:
+ file = repo.opener('bookmarks.current')
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return None
+ try:
+ # No readline() in posixfile_nt, reading everything is cheap
+ mark = encoding.tolocal((file.readlines() or [''])[0])
+ if mark == '' or mark not in repo._bookmarks:
+ mark = None
+ finally:
+ file.close()
+ return mark
+
+def write(repo):
+ '''Write bookmarks
+
+ Write the given bookmark => hash dictionary to the .hg/bookmarks file
+ in a format equal to those of localtags.
+
+ We also store a backup of the previous state in undo.bookmarks that
+ can be copied back on rollback.
+ '''
+ refs = repo._bookmarks
+
+ if repo._bookmarkcurrent not in refs:
+ setcurrent(repo, None)
+ for mark in refs.keys():
+ if not valid(mark):
+ raise util.Abort(_("bookmark '%s' contains illegal "
+ "character" % mark))
+
+ wlock = repo.wlock()
+ try:
+
+ file = repo.opener('bookmarks', 'w', atomictemp=True)
+ for refspec, node in refs.iteritems():
+ file.write("%s %s\n" % (hex(node), encoding.fromlocal(refspec)))
+ file.close()
+
+ # touch 00changelog.i so hgweb reloads bookmarks (no lock needed)
+ try:
+ os.utime(repo.sjoin('00changelog.i'), None)
+ except OSError:
+ pass
+
+ finally:
+ wlock.release()
+
+def setcurrent(repo, mark):
+ '''Set the name of the bookmark that we are currently on
+
+ Set the name of the bookmark that we are on (hg update <bookmark>).
+ The name is recorded in .hg/bookmarks.current
+ '''
+ current = repo._bookmarkcurrent
+ if current == mark:
+ return
+
+ if mark not in repo._bookmarks:
+ mark = ''
+ if not valid(mark):
+ raise util.Abort(_("bookmark '%s' contains illegal "
+ "character" % mark))
+
+ wlock = repo.wlock()
+ try:
+ file = repo.opener('bookmarks.current', 'w', atomictemp=True)
+ file.write(encoding.fromlocal(mark))
+ file.close()
+ finally:
+ wlock.release()
+ repo._bookmarkcurrent = mark
+
+def unsetcurrent(repo):
+ wlock = repo.wlock()
+ try:
+ try:
+ util.unlink(repo.join('bookmarks.current'))
+ repo._bookmarkcurrent = None
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ finally:
+ wlock.release()
+
+def updatecurrentbookmark(repo, oldnode, curbranch):
+ try:
+ return update(repo, oldnode, repo.branchtip(curbranch))
+ except error.RepoLookupError:
+ if curbranch == "default": # no default branch!
+ return update(repo, oldnode, repo.lookup("tip"))
+ else:
+ raise util.Abort(_("branch %s not found") % curbranch)
+
+def update(repo, parents, node):
+ marks = repo._bookmarks
+ update = False
+ cur = repo._bookmarkcurrent
+ if not cur:
+ return False
+
+ toupdate = [b for b in marks if b.split('@', 1)[0] == cur.split('@', 1)[0]]
+ for mark in toupdate:
+ if mark and marks[mark] in parents:
+ old = repo[marks[mark]]
+ new = repo[node]
+ if new in old.descendants() and mark == cur:
+ marks[cur] = new.node()
+ update = True
+ if mark != cur:
+ del marks[mark]
+ if update:
+ repo._writebookmarks(marks)
+ return update
+
+def listbookmarks(repo):
+ # We may try to list bookmarks on a repo type that does not
+ # support it (e.g., statichttprepository).
+ marks = getattr(repo, '_bookmarks', {})
+
+ d = {}
+ for k, v in marks.iteritems():
+ # don't expose local divergent bookmarks
+ if '@' not in k or k.endswith('@'):
+ d[k] = hex(v)
+ return d
+
+def pushbookmark(repo, key, old, new):
+ w = repo.wlock()
+ try:
+ marks = repo._bookmarks
+ if hex(marks.get(key, '')) != old:
+ return False
+ if new == '':
+ del marks[key]
+ else:
+ if new not in repo:
+ return False
+ marks[key] = repo[new].node()
+ write(repo)
+ return True
+ finally:
+ w.release()
+
+def updatefromremote(ui, repo, remote, path):
+ ui.debug("checking for updated bookmarks\n")
+ rb = remote.listkeys('bookmarks')
+ changed = False
+ for k in rb.keys():
+ if k in repo._bookmarks:
+ nr, nl = rb[k], repo._bookmarks[k]
+ if nr in repo:
+ cr = repo[nr]
+ cl = repo[nl]
+ if cl.rev() >= cr.rev():
+ continue
+ if cr in cl.descendants():
+ repo._bookmarks[k] = cr.node()
+ changed = True
+ ui.status(_("updating bookmark %s\n") % k)
+ else:
+ # find a unique @ suffix
+ for x in range(1, 100):
+ n = '%s@%d' % (k, x)
+ if n not in repo._bookmarks:
+ break
+ # try to use an @pathalias suffix
+ # if an @pathalias already exists, we overwrite (update) it
+ for p, u in ui.configitems("paths"):
+ if path == u:
+ n = '%s@%s' % (k, p)
+
+ repo._bookmarks[n] = cr.node()
+ changed = True
+ ui.warn(_("divergent bookmark %s stored as %s\n") % (k, n))
+ elif rb[k] in repo:
+ # add remote bookmarks for changes we already have
+ repo._bookmarks[k] = repo[rb[k]].node()
+ changed = True
+ ui.status(_("adding remote bookmark %s\n") % k)
+
+ if changed:
+ write(repo)
+
+def diff(ui, repo, remote):
+ ui.status(_("searching for changed bookmarks\n"))
+
+ lmarks = repo.listkeys('bookmarks')
+ rmarks = remote.listkeys('bookmarks')
+
+ diff = sorted(set(rmarks) - set(lmarks))
+ for k in diff:
+ mark = ui.debugflag and rmarks[k] or rmarks[k][:12]
+ ui.write(" %-25s %s\n" % (k, mark))
+
+ if len(diff) <= 0:
+ ui.status(_("no changed bookmarks found\n"))
+ return 1
+ return 0
diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py
new file mode 100644
index 0000000..fc78b7a
--- /dev/null
+++ b/mercurial/bundlerepo.py
@@ -0,0 +1,387 @@
+# bundlerepo.py - repository class for viewing uncompressed bundles
+#
+# Copyright 2006, 2007 Benoit Boissinot <bboissin@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Repository class for viewing uncompressed bundles.
+
+This provides a read-only repository interface to bundles as if they
+were part of the actual repository.
+"""
+
+from node import nullid
+from i18n import _
+import os, tempfile, shutil
+import changegroup, util, mdiff, discovery, cmdutil
+import localrepo, changelog, manifest, filelog, revlog, error
+
+class bundlerevlog(revlog.revlog):
+ def __init__(self, opener, indexfile, bundle, linkmapper):
+ # How it works:
+ # to retrieve a revision, we need to know the offset of
+ # the revision in the bundle (an unbundle object).
+ #
+ # We store this offset in the index (start), to differentiate a
+ # rev in the bundle and from a rev in the revlog, we check
+ # len(index[r]). If the tuple is bigger than 7, it is a bundle
+ # (it is bigger since we store the node to which the delta is)
+ #
+ revlog.revlog.__init__(self, opener, indexfile)
+ self.bundle = bundle
+ self.basemap = {}
+ n = len(self)
+ chain = None
+ while True:
+ chunkdata = bundle.deltachunk(chain)
+ if not chunkdata:
+ break
+ node = chunkdata['node']
+ p1 = chunkdata['p1']
+ p2 = chunkdata['p2']
+ cs = chunkdata['cs']
+ deltabase = chunkdata['deltabase']
+ delta = chunkdata['delta']
+
+ size = len(delta)
+ start = bundle.tell() - size
+
+ link = linkmapper(cs)
+ if node in self.nodemap:
+ # this can happen if two branches make the same change
+ chain = node
+ continue
+
+ for p in (p1, p2):
+ if p not in self.nodemap:
+ raise error.LookupError(p, self.indexfile,
+ _("unknown parent"))
+ # start, size, full unc. size, base (unused), link, p1, p2, node
+ e = (revlog.offset_type(start, 0), size, -1, -1, link,
+ self.rev(p1), self.rev(p2), node)
+ self.basemap[n] = deltabase
+ self.index.insert(-1, e)
+ self.nodemap[node] = n
+ chain = node
+ n += 1
+
+ def inbundle(self, rev):
+ """is rev from the bundle"""
+ if rev < 0:
+ return False
+ return rev in self.basemap
+ def bundlebase(self, rev):
+ return self.basemap[rev]
+ def _chunk(self, rev):
+ # Warning: in case of bundle, the diff is against bundlebase,
+ # not against rev - 1
+ # XXX: could use some caching
+ if not self.inbundle(rev):
+ return revlog.revlog._chunk(self, rev)
+ self.bundle.seek(self.start(rev))
+ return self.bundle.read(self.length(rev))
+
+ def revdiff(self, rev1, rev2):
+ """return or calculate a delta between two revisions"""
+ if self.inbundle(rev1) and self.inbundle(rev2):
+ # hot path for bundle
+ revb = self.rev(self.bundlebase(rev2))
+ if revb == rev1:
+ return self._chunk(rev2)
+ elif not self.inbundle(rev1) and not self.inbundle(rev2):
+ return revlog.revlog.revdiff(self, rev1, rev2)
+
+ return mdiff.textdiff(self.revision(self.node(rev1)),
+ self.revision(self.node(rev2)))
+
+ def revision(self, nodeorrev):
+ """return an uncompressed revision of a given node or revision
+ number.
+ """
+ if isinstance(nodeorrev, int):
+ rev = nodeorrev
+ node = self.node(rev)
+ else:
+ node = nodeorrev
+ rev = self.rev(node)
+
+ if node == nullid:
+ return ""
+
+ text = None
+ chain = []
+ iter_node = node
+ # reconstruct the revision if it is from a changegroup
+ while self.inbundle(rev):
+ if self._cache and self._cache[0] == iter_node:
+ text = self._cache[2]
+ break
+ chain.append(rev)
+ iter_node = self.bundlebase(rev)
+ rev = self.rev(iter_node)
+ if text is None:
+ text = revlog.revlog.revision(self, iter_node)
+
+ while chain:
+ delta = self._chunk(chain.pop())
+ text = mdiff.patches(text, [delta])
+
+ p1, p2 = self.parents(node)
+ if node != revlog.hash(text, p1, p2):
+ raise error.RevlogError(_("integrity check failed on %s:%d")
+ % (self.datafile, self.rev(node)))
+
+ self._cache = (node, self.rev(node), text)
+ return text
+
+ def addrevision(self, text, transaction, link, p1=None, p2=None, d=None):
+ raise NotImplementedError
+ def addgroup(self, revs, linkmapper, transaction):
+ raise NotImplementedError
+ def strip(self, rev, minlink):
+ raise NotImplementedError
+ def checksize(self):
+ raise NotImplementedError
+
+class bundlechangelog(bundlerevlog, changelog.changelog):
+ def __init__(self, opener, bundle):
+ changelog.changelog.__init__(self, opener)
+ linkmapper = lambda x: x
+ bundlerevlog.__init__(self, opener, self.indexfile, bundle,
+ linkmapper)
+
+class bundlemanifest(bundlerevlog, manifest.manifest):
+ def __init__(self, opener, bundle, linkmapper):
+ manifest.manifest.__init__(self, opener)
+ bundlerevlog.__init__(self, opener, self.indexfile, bundle,
+ linkmapper)
+
+class bundlefilelog(bundlerevlog, filelog.filelog):
+ def __init__(self, opener, path, bundle, linkmapper, repo):
+ filelog.filelog.__init__(self, opener, path)
+ bundlerevlog.__init__(self, opener, self.indexfile, bundle,
+ linkmapper)
+ self._repo = repo
+
+ def _file(self, f):
+ self._repo.file(f)
+
+class bundlepeer(localrepo.localpeer):
+ def canpush(self):
+ return False
+
+class bundlerepository(localrepo.localrepository):
+ def __init__(self, ui, path, bundlename):
+ self._tempparent = None
+ try:
+ localrepo.localrepository.__init__(self, ui, path)
+ except error.RepoError:
+ self._tempparent = tempfile.mkdtemp()
+ localrepo.instance(ui, self._tempparent, 1)
+ localrepo.localrepository.__init__(self, ui, self._tempparent)
+ self.ui.setconfig('phases', 'publish', False)
+
+ if path:
+ self._url = 'bundle:' + util.expandpath(path) + '+' + bundlename
+ else:
+ self._url = 'bundle:' + bundlename
+
+ self.tempfile = None
+ f = util.posixfile(bundlename, "rb")
+ self.bundle = changegroup.readbundle(f, bundlename)
+ if self.bundle.compressed():
+ fdtemp, temp = tempfile.mkstemp(prefix="hg-bundle-",
+ suffix=".hg10un", dir=self.path)
+ self.tempfile = temp
+ fptemp = os.fdopen(fdtemp, 'wb')
+
+ try:
+ fptemp.write("HG10UN")
+ while True:
+ chunk = self.bundle.read(2**18)
+ if not chunk:
+ break
+ fptemp.write(chunk)
+ finally:
+ fptemp.close()
+
+ f = util.posixfile(self.tempfile, "rb")
+ self.bundle = changegroup.readbundle(f, bundlename)
+
+ # dict with the mapping 'filename' -> position in the bundle
+ self.bundlefilespos = {}
+
+ @util.propertycache
+ def changelog(self):
+ # consume the header if it exists
+ self.bundle.changelogheader()
+ c = bundlechangelog(self.sopener, self.bundle)
+ self.manstart = self.bundle.tell()
+ return c
+
+ @util.propertycache
+ def manifest(self):
+ self.bundle.seek(self.manstart)
+ # consume the header if it exists
+ self.bundle.manifestheader()
+ m = bundlemanifest(self.sopener, self.bundle, self.changelog.rev)
+ self.filestart = self.bundle.tell()
+ return m
+
+ @util.propertycache
+ def manstart(self):
+ self.changelog
+ return self.manstart
+
+ @util.propertycache
+ def filestart(self):
+ self.manifest
+ return self.filestart
+
+ def url(self):
+ return self._url
+
+ def file(self, f):
+ if not self.bundlefilespos:
+ self.bundle.seek(self.filestart)
+ while True:
+ chunkdata = self.bundle.filelogheader()
+ if not chunkdata:
+ break
+ fname = chunkdata['filename']
+ self.bundlefilespos[fname] = self.bundle.tell()
+ while True:
+ c = self.bundle.deltachunk(None)
+ if not c:
+ break
+
+ if f[0] == '/':
+ f = f[1:]
+ if f in self.bundlefilespos:
+ self.bundle.seek(self.bundlefilespos[f])
+ return bundlefilelog(self.sopener, f, self.bundle,
+ self.changelog.rev, self)
+ else:
+ return filelog.filelog(self.sopener, f)
+
+ def close(self):
+ """Close assigned bundle file immediately."""
+ self.bundle.close()
+ if self.tempfile is not None:
+ os.unlink(self.tempfile)
+ if self._tempparent:
+ shutil.rmtree(self._tempparent, True)
+
+ def cancopy(self):
+ return False
+
+ def peer(self):
+ return bundlepeer(self)
+
+ def getcwd(self):
+ return os.getcwd() # always outside the repo
+
+ def _writebranchcache(self, branches, tip, tiprev):
+ # don't overwrite the disk cache with bundle-augmented data
+ pass
+
+def instance(ui, path, create):
+ if create:
+ raise util.Abort(_('cannot create new bundle repository'))
+ parentpath = ui.config("bundle", "mainreporoot", "")
+ if not parentpath:
+ # try to find the correct path to the working directory repo
+ parentpath = cmdutil.findrepo(os.getcwd())
+ if parentpath is None:
+ parentpath = ''
+ if parentpath:
+ # Try to make the full path relative so we get a nice, short URL.
+ # In particular, we don't want temp dir names in test outputs.
+ cwd = os.getcwd()
+ if parentpath == cwd:
+ parentpath = ''
+ else:
+ cwd = os.path.join(cwd,'')
+ if parentpath.startswith(cwd):
+ parentpath = parentpath[len(cwd):]
+ u = util.url(path)
+ path = u.localpath()
+ if u.scheme == 'bundle':
+ s = path.split("+", 1)
+ if len(s) == 1:
+ repopath, bundlename = parentpath, s[0]
+ else:
+ repopath, bundlename = s
+ else:
+ repopath, bundlename = parentpath, path
+ return bundlerepository(ui, repopath, bundlename)
+
+def getremotechanges(ui, repo, other, onlyheads=None, bundlename=None,
+ force=False):
+ '''obtains a bundle of changes incoming from other
+
+ "onlyheads" restricts the returned changes to those reachable from the
+ specified heads.
+ "bundlename", if given, stores the bundle to this file path permanently;
+ otherwise it's stored to a temp file and gets deleted again when you call
+ the returned "cleanupfn".
+ "force" indicates whether to proceed on unrelated repos.
+
+ Returns a tuple (local, csets, cleanupfn):
+
+ "local" is a local repo from which to obtain the actual incoming
+ changesets; it is a bundlerepo for the obtained bundle when the
+ original "other" is remote.
+ "csets" lists the incoming changeset node ids.
+ "cleanupfn" must be called without arguments when you're done processing
+ the changes; it closes both the original "other" and the one returned
+ here.
+ '''
+ tmp = discovery.findcommonincoming(repo, other, heads=onlyheads,
+ force=force)
+ common, incoming, rheads = tmp
+ if not incoming:
+ try:
+ if bundlename:
+ os.unlink(bundlename)
+ except OSError:
+ pass
+ return other, [], other.close
+
+ bundle = None
+ bundlerepo = None
+ localrepo = other.local()
+ if bundlename or not localrepo:
+ # create a bundle (uncompressed if other repo is not local)
+
+ if other.capable('getbundle'):
+ cg = other.getbundle('incoming', common=common, heads=rheads)
+ elif onlyheads is None and not other.capable('changegroupsubset'):
+ # compat with older servers when pulling all remote heads
+ cg = other.changegroup(incoming, "incoming")
+ rheads = None
+ else:
+ cg = other.changegroupsubset(incoming, rheads, 'incoming')
+ bundletype = localrepo and "HG10BZ" or "HG10UN"
+ fname = bundle = changegroup.writebundle(cg, bundlename, bundletype)
+ # keep written bundle?
+ if bundlename:
+ bundle = None
+ if not localrepo:
+ # use the created uncompressed bundlerepo
+ localrepo = bundlerepo = bundlerepository(ui, repo.root, fname)
+ # this repo contains local and other now, so filter out local again
+ common = repo.heads()
+
+ csets = localrepo.changelog.findmissing(common, rheads)
+
+ def cleanup():
+ if bundlerepo:
+ bundlerepo.close()
+ if bundle:
+ os.unlink(bundle)
+ other.close()
+
+ return (localrepo, csets, cleanup)
+
diff --git a/mercurial/byterange.py b/mercurial/byterange.py
new file mode 100644
index 0000000..f4f5f53
--- /dev/null
+++ b/mercurial/byterange.py
@@ -0,0 +1,460 @@
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# This file is part of urlgrabber, a high-level cross-protocol url-grabber
+# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
+
+# $Id: byterange.py,v 1.9 2005/02/14 21:55:07 mstenner Exp $
+
+import os
+import stat
+import urllib
+import urllib2
+import email.Utils
+
+class RangeError(IOError):
+ """Error raised when an unsatisfiable range is requested."""
+ pass
+
+class HTTPRangeHandler(urllib2.BaseHandler):
+ """Handler that enables HTTP Range headers.
+
+ This was extremely simple. The Range header is a HTTP feature to
+ begin with so all this class does is tell urllib2 that the
+ "206 Partial Content" reponse from the HTTP server is what we
+ expected.
+
+ Example:
+ import urllib2
+ import byterange
+
+ range_handler = range.HTTPRangeHandler()
+ opener = urllib2.build_opener(range_handler)
+
+ # install it
+ urllib2.install_opener(opener)
+
+ # create Request and set Range header
+ req = urllib2.Request('http://www.python.org/')
+ req.header['Range'] = 'bytes=30-50'
+ f = urllib2.urlopen(req)
+ """
+
+ def http_error_206(self, req, fp, code, msg, hdrs):
+ # 206 Partial Content Response
+ r = urllib.addinfourl(fp, hdrs, req.get_full_url())
+ r.code = code
+ r.msg = msg
+ return r
+
+ def http_error_416(self, req, fp, code, msg, hdrs):
+ # HTTP's Range Not Satisfiable error
+ raise RangeError('Requested Range Not Satisfiable')
+
+class RangeableFileObject(object):
+ """File object wrapper to enable raw range handling.
+ This was implemented primarilary for handling range
+ specifications for file:// urls. This object effectively makes
+ a file object look like it consists only of a range of bytes in
+ the stream.
+
+ Examples:
+ # expose 10 bytes, starting at byte position 20, from
+ # /etc/aliases.
+ >>> fo = RangeableFileObject(file('/etc/passwd', 'r'), (20,30))
+ # seek seeks within the range (to position 23 in this case)
+ >>> fo.seek(3)
+ # tell tells where your at _within the range_ (position 3 in
+ # this case)
+ >>> fo.tell()
+ # read EOFs if an attempt is made to read past the last
+ # byte in the range. the following will return only 7 bytes.
+ >>> fo.read(30)
+ """
+
+ def __init__(self, fo, rangetup):
+ """Create a RangeableFileObject.
+ fo -- a file like object. only the read() method need be
+ supported but supporting an optimized seek() is
+ preferable.
+ rangetup -- a (firstbyte,lastbyte) tuple specifying the range
+ to work over.
+ The file object provided is assumed to be at byte offset 0.
+ """
+ self.fo = fo
+ (self.firstbyte, self.lastbyte) = range_tuple_normalize(rangetup)
+ self.realpos = 0
+ self._do_seek(self.firstbyte)
+
+ def __getattr__(self, name):
+ """This effectively allows us to wrap at the instance level.
+ Any attribute not found in _this_ object will be searched for
+ in self.fo. This includes methods."""
+ return getattr(self.fo, name)
+
+ def tell(self):
+ """Return the position within the range.
+ This is different from fo.seek in that position 0 is the
+ first byte position of the range tuple. For example, if
+ this object was created with a range tuple of (500,899),
+ tell() will return 0 when at byte position 500 of the file.
+ """
+ return (self.realpos - self.firstbyte)
+
+ def seek(self, offset, whence=0):
+ """Seek within the byte range.
+ Positioning is identical to that described under tell().
+ """
+ assert whence in (0, 1, 2)
+ if whence == 0: # absolute seek
+ realoffset = self.firstbyte + offset
+ elif whence == 1: # relative seek
+ realoffset = self.realpos + offset
+ elif whence == 2: # absolute from end of file
+ # XXX: are we raising the right Error here?
+ raise IOError('seek from end of file not supported.')
+
+ # do not allow seek past lastbyte in range
+ if self.lastbyte and (realoffset >= self.lastbyte):
+ realoffset = self.lastbyte
+
+ self._do_seek(realoffset - self.realpos)
+
+ def read(self, size=-1):
+ """Read within the range.
+ This method will limit the size read based on the range.
+ """
+ size = self._calc_read_size(size)
+ rslt = self.fo.read(size)
+ self.realpos += len(rslt)
+ return rslt
+
+ def readline(self, size=-1):
+ """Read lines within the range.
+ This method will limit the size read based on the range.
+ """
+ size = self._calc_read_size(size)
+ rslt = self.fo.readline(size)
+ self.realpos += len(rslt)
+ return rslt
+
+ def _calc_read_size(self, size):
+ """Handles calculating the amount of data to read based on
+ the range.
+ """
+ if self.lastbyte:
+ if size > -1:
+ if ((self.realpos + size) >= self.lastbyte):
+ size = (self.lastbyte - self.realpos)
+ else:
+ size = (self.lastbyte - self.realpos)
+ return size
+
+ def _do_seek(self, offset):
+ """Seek based on whether wrapped object supports seek().
+ offset is relative to the current position (self.realpos).
+ """
+ assert offset >= 0
+ seek = getattr(self.fo, 'seek', self._poor_mans_seek)
+ seek(self.realpos + offset)
+ self.realpos += offset
+
+ def _poor_mans_seek(self, offset):
+ """Seek by calling the wrapped file objects read() method.
+ This is used for file like objects that do not have native
+ seek support. The wrapped objects read() method is called
+ to manually seek to the desired position.
+ offset -- read this number of bytes from the wrapped
+ file object.
+ raise RangeError if we encounter EOF before reaching the
+ specified offset.
+ """
+ pos = 0
+ bufsize = 1024
+ while pos < offset:
+ if (pos + bufsize) > offset:
+ bufsize = offset - pos
+ buf = self.fo.read(bufsize)
+ if len(buf) != bufsize:
+ raise RangeError('Requested Range Not Satisfiable')
+ pos += bufsize
+
+class FileRangeHandler(urllib2.FileHandler):
+ """FileHandler subclass that adds Range support.
+ This class handles Range headers exactly like an HTTP
+ server would.
+ """
+ def open_local_file(self, req):
+ import mimetypes
+ import email
+ host = req.get_host()
+ file = req.get_selector()
+ localfile = urllib.url2pathname(file)
+ stats = os.stat(localfile)
+ size = stats[stat.ST_SIZE]
+ modified = email.Utils.formatdate(stats[stat.ST_MTIME])
+ mtype = mimetypes.guess_type(file)[0]
+ if host:
+ host, port = urllib.splitport(host)
+ if port or socket.gethostbyname(host) not in self.get_names():
+ raise urllib2.URLError('file not on local host')
+ fo = open(localfile,'rb')
+ brange = req.headers.get('Range', None)
+ brange = range_header_to_tuple(brange)
+ assert brange != ()
+ if brange:
+ (fb, lb) = brange
+ if lb == '':
+ lb = size
+ if fb < 0 or fb > size or lb > size:
+ raise RangeError('Requested Range Not Satisfiable')
+ size = (lb - fb)
+ fo = RangeableFileObject(fo, (fb, lb))
+ headers = email.message_from_string(
+ 'Content-Type: %s\nContent-Length: %d\nLast-Modified: %s\n' %
+ (mtype or 'text/plain', size, modified))
+ return urllib.addinfourl(fo, headers, 'file:'+file)
+
+
+# FTP Range Support
+# Unfortunately, a large amount of base FTP code had to be copied
+# from urllib and urllib2 in order to insert the FTP REST command.
+# Code modifications for range support have been commented as
+# follows:
+# -- range support modifications start/end here
+
+from urllib import splitport, splituser, splitpasswd, splitattr, \
+ unquote, addclosehook, addinfourl
+import ftplib
+import socket
+import sys
+import mimetypes
+import email
+
+class FTPRangeHandler(urllib2.FTPHandler):
+ def ftp_open(self, req):
+ host = req.get_host()
+ if not host:
+ raise IOError('ftp error', 'no host given')
+ host, port = splitport(host)
+ if port is None:
+ port = ftplib.FTP_PORT
+ else:
+ port = int(port)
+
+ # username/password handling
+ user, host = splituser(host)
+ if user:
+ user, passwd = splitpasswd(user)
+ else:
+ passwd = None
+ host = unquote(host)
+ user = unquote(user or '')
+ passwd = unquote(passwd or '')
+
+ try:
+ host = socket.gethostbyname(host)
+ except socket.error, msg:
+ raise urllib2.URLError(msg)
+ path, attrs = splitattr(req.get_selector())
+ dirs = path.split('/')
+ dirs = map(unquote, dirs)
+ dirs, file = dirs[:-1], dirs[-1]
+ if dirs and not dirs[0]:
+ dirs = dirs[1:]
+ try:
+ fw = self.connect_ftp(user, passwd, host, port, dirs)
+ type = file and 'I' or 'D'
+ for attr in attrs:
+ attr, value = splitattr(attr)
+ if attr.lower() == 'type' and \
+ value in ('a', 'A', 'i', 'I', 'd', 'D'):
+ type = value.upper()
+
+ # -- range support modifications start here
+ rest = None
+ range_tup = range_header_to_tuple(req.headers.get('Range', None))
+ assert range_tup != ()
+ if range_tup:
+ (fb, lb) = range_tup
+ if fb > 0:
+ rest = fb
+ # -- range support modifications end here
+
+ fp, retrlen = fw.retrfile(file, type, rest)
+
+ # -- range support modifications start here
+ if range_tup:
+ (fb, lb) = range_tup
+ if lb == '':
+ if retrlen is None or retrlen == 0:
+ raise RangeError('Requested Range Not Satisfiable due'
+ ' to unobtainable file length.')
+ lb = retrlen
+ retrlen = lb - fb
+ if retrlen < 0:
+ # beginning of range is larger than file
+ raise RangeError('Requested Range Not Satisfiable')
+ else:
+ retrlen = lb - fb
+ fp = RangeableFileObject(fp, (0, retrlen))
+ # -- range support modifications end here
+
+ headers = ""
+ mtype = mimetypes.guess_type(req.get_full_url())[0]
+ if mtype:
+ headers += "Content-Type: %s\n" % mtype
+ if retrlen is not None and retrlen >= 0:
+ headers += "Content-Length: %d\n" % retrlen
+ headers = email.message_from_string(headers)
+ return addinfourl(fp, headers, req.get_full_url())
+ except ftplib.all_errors, msg:
+ raise IOError('ftp error', msg), sys.exc_info()[2]
+
+ def connect_ftp(self, user, passwd, host, port, dirs):
+ fw = ftpwrapper(user, passwd, host, port, dirs)
+ return fw
+
+class ftpwrapper(urllib.ftpwrapper):
+ # range support note:
+ # this ftpwrapper code is copied directly from
+ # urllib. The only enhancement is to add the rest
+ # argument and pass it on to ftp.ntransfercmd
+ def retrfile(self, file, type, rest=None):
+ self.endtransfer()
+ if type in ('d', 'D'):
+ cmd = 'TYPE A'
+ isdir = 1
+ else:
+ cmd = 'TYPE ' + type
+ isdir = 0
+ try:
+ self.ftp.voidcmd(cmd)
+ except ftplib.all_errors:
+ self.init()
+ self.ftp.voidcmd(cmd)
+ conn = None
+ if file and not isdir:
+ # Use nlst to see if the file exists at all
+ try:
+ self.ftp.nlst(file)
+ except ftplib.error_perm, reason:
+ raise IOError('ftp error', reason), sys.exc_info()[2]
+ # Restore the transfer mode!
+ self.ftp.voidcmd(cmd)
+ # Try to retrieve as a file
+ try:
+ cmd = 'RETR ' + file
+ conn = self.ftp.ntransfercmd(cmd, rest)
+ except ftplib.error_perm, reason:
+ if str(reason).startswith('501'):
+ # workaround for REST not supported error
+ fp, retrlen = self.retrfile(file, type)
+ fp = RangeableFileObject(fp, (rest,''))
+ return (fp, retrlen)
+ elif not str(reason).startswith('550'):
+ raise IOError('ftp error', reason), sys.exc_info()[2]
+ if not conn:
+ # Set transfer mode to ASCII!
+ self.ftp.voidcmd('TYPE A')
+ # Try a directory listing
+ if file:
+ cmd = 'LIST ' + file
+ else:
+ cmd = 'LIST'
+ conn = self.ftp.ntransfercmd(cmd)
+ self.busy = 1
+ # Pass back both a suitably decorated object and a retrieval length
+ return (addclosehook(conn[0].makefile('rb'),
+ self.endtransfer), conn[1])
+
+
+####################################################################
+# Range Tuple Functions
+# XXX: These range tuple functions might go better in a class.
+
+_rangere = None
+def range_header_to_tuple(range_header):
+ """Get a (firstbyte,lastbyte) tuple from a Range header value.
+
+ Range headers have the form "bytes=<firstbyte>-<lastbyte>". This
+ function pulls the firstbyte and lastbyte values and returns
+ a (firstbyte,lastbyte) tuple. If lastbyte is not specified in
+ the header value, it is returned as an empty string in the
+ tuple.
+
+ Return None if range_header is None
+ Return () if range_header does not conform to the range spec
+ pattern.
+
+ """
+ global _rangere
+ if range_header is None:
+ return None
+ if _rangere is None:
+ import re
+ _rangere = re.compile(r'^bytes=(\d{1,})-(\d*)')
+ match = _rangere.match(range_header)
+ if match:
+ tup = range_tuple_normalize(match.group(1, 2))
+ if tup and tup[1]:
+ tup = (tup[0], tup[1]+1)
+ return tup
+ return ()
+
+def range_tuple_to_header(range_tup):
+ """Convert a range tuple to a Range header value.
+ Return a string of the form "bytes=<firstbyte>-<lastbyte>" or None
+ if no range is needed.
+ """
+ if range_tup is None:
+ return None
+ range_tup = range_tuple_normalize(range_tup)
+ if range_tup:
+ if range_tup[1]:
+ range_tup = (range_tup[0], range_tup[1] - 1)
+ return 'bytes=%s-%s' % range_tup
+
+def range_tuple_normalize(range_tup):
+ """Normalize a (first_byte,last_byte) range tuple.
+ Return a tuple whose first element is guaranteed to be an int
+ and whose second element will be '' (meaning: the last byte) or
+ an int. Finally, return None if the normalized tuple == (0,'')
+ as that is equivelant to retrieving the entire file.
+ """
+ if range_tup is None:
+ return None
+ # handle first byte
+ fb = range_tup[0]
+ if fb in (None, ''):
+ fb = 0
+ else:
+ fb = int(fb)
+ # handle last byte
+ try:
+ lb = range_tup[1]
+ except IndexError:
+ lb = ''
+ else:
+ if lb is None:
+ lb = ''
+ elif lb != '':
+ lb = int(lb)
+ # check if range is over the entire file
+ if (fb, lb) == (0, ''):
+ return None
+ # check that the range is valid
+ if lb < fb:
+ raise RangeError('Invalid byte range: %s-%s' % (fb, lb))
+ return (fb, lb)
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
new file mode 100644
index 0000000..236c8a3
--- /dev/null
+++ b/mercurial/changegroup.py
@@ -0,0 +1,256 @@
+# changegroup.py - Mercurial changegroup manipulation functions
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+from node import nullrev
+import mdiff, util
+import struct, os, bz2, zlib, tempfile
+
+_BUNDLE10_DELTA_HEADER = "20s20s20s20s"
+
+def readexactly(stream, n):
+ '''read n bytes from stream.read and abort if less was available'''
+ s = stream.read(n)
+ if len(s) < n:
+ raise util.Abort(_("stream ended unexpectedly"
+ " (got %d bytes, expected %d)")
+ % (len(s), n))
+ return s
+
+def getchunk(stream):
+ """return the next chunk from stream as a string"""
+ d = readexactly(stream, 4)
+ l = struct.unpack(">l", d)[0]
+ if l <= 4:
+ if l:
+ raise util.Abort(_("invalid chunk length %d") % l)
+ return ""
+ return readexactly(stream, l - 4)
+
+def chunkheader(length):
+ """return a changegroup chunk header (string)"""
+ return struct.pack(">l", length + 4)
+
+def closechunk():
+ """return a changegroup chunk header (string) for a zero-length chunk"""
+ return struct.pack(">l", 0)
+
+class nocompress(object):
+ def compress(self, x):
+ return x
+ def flush(self):
+ return ""
+
+bundletypes = {
+ "": ("", nocompress), # only when using unbundle on ssh and old http servers
+ # since the unification ssh accepts a header but there
+ # is no capability signaling it.
+ "HG10UN": ("HG10UN", nocompress),
+ "HG10BZ": ("HG10", lambda: bz2.BZ2Compressor()),
+ "HG10GZ": ("HG10GZ", lambda: zlib.compressobj()),
+}
+
+# hgweb uses this list to communicate its preferred type
+bundlepriority = ['HG10GZ', 'HG10BZ', 'HG10UN']
+
+def writebundle(cg, filename, bundletype):
+ """Write a bundle file and return its filename.
+
+ Existing files will not be overwritten.
+ If no filename is specified, a temporary file is created.
+ bz2 compression can be turned off.
+ The bundle file will be deleted in case of errors.
+ """
+
+ fh = None
+ cleanup = None
+ try:
+ if filename:
+ fh = open(filename, "wb")
+ else:
+ fd, filename = tempfile.mkstemp(prefix="hg-bundle-", suffix=".hg")
+ fh = os.fdopen(fd, "wb")
+ cleanup = filename
+
+ header, compressor = bundletypes[bundletype]
+ fh.write(header)
+ z = compressor()
+
+ # parse the changegroup data, otherwise we will block
+ # in case of sshrepo because we don't know the end of the stream
+
+ # an empty chunkgroup is the end of the changegroup
+ # a changegroup has at least 2 chunkgroups (changelog and manifest).
+ # after that, an empty chunkgroup is the end of the changegroup
+ empty = False
+ count = 0
+ while not empty or count <= 2:
+ empty = True
+ count += 1
+ while True:
+ chunk = getchunk(cg)
+ if not chunk:
+ break
+ empty = False
+ fh.write(z.compress(chunkheader(len(chunk))))
+ pos = 0
+ while pos < len(chunk):
+ next = pos + 2**20
+ fh.write(z.compress(chunk[pos:next]))
+ pos = next
+ fh.write(z.compress(closechunk()))
+ fh.write(z.flush())
+ cleanup = None
+ return filename
+ finally:
+ if fh is not None:
+ fh.close()
+ if cleanup is not None:
+ os.unlink(cleanup)
+
+def decompressor(fh, alg):
+ if alg == 'UN':
+ return fh
+ elif alg == 'GZ':
+ def generator(f):
+ zd = zlib.decompressobj()
+ for chunk in util.filechunkiter(f):
+ yield zd.decompress(chunk)
+ elif alg == 'BZ':
+ def generator(f):
+ zd = bz2.BZ2Decompressor()
+ zd.decompress("BZ")
+ for chunk in util.filechunkiter(f, 4096):
+ yield zd.decompress(chunk)
+ else:
+ raise util.Abort("unknown bundle compression '%s'" % alg)
+ return util.chunkbuffer(generator(fh))
+
+class unbundle10(object):
+ deltaheader = _BUNDLE10_DELTA_HEADER
+ deltaheadersize = struct.calcsize(deltaheader)
+ def __init__(self, fh, alg):
+ self._stream = decompressor(fh, alg)
+ self._type = alg
+ self.callback = None
+ def compressed(self):
+ return self._type != 'UN'
+ def read(self, l):
+ return self._stream.read(l)
+ def seek(self, pos):
+ return self._stream.seek(pos)
+ def tell(self):
+ return self._stream.tell()
+ def close(self):
+ return self._stream.close()
+
+ def chunklength(self):
+ d = readexactly(self._stream, 4)
+ l = struct.unpack(">l", d)[0]
+ if l <= 4:
+ if l:
+ raise util.Abort(_("invalid chunk length %d") % l)
+ return 0
+ if self.callback:
+ self.callback()
+ return l - 4
+
+ def changelogheader(self):
+ """v10 does not have a changelog header chunk"""
+ return {}
+
+ def manifestheader(self):
+ """v10 does not have a manifest header chunk"""
+ return {}
+
+ def filelogheader(self):
+ """return the header of the filelogs chunk, v10 only has the filename"""
+ l = self.chunklength()
+ if not l:
+ return {}
+ fname = readexactly(self._stream, l)
+ return dict(filename=fname)
+
+ def _deltaheader(self, headertuple, prevnode):
+ node, p1, p2, cs = headertuple
+ if prevnode is None:
+ deltabase = p1
+ else:
+ deltabase = prevnode
+ return node, p1, p2, deltabase, cs
+
+ def deltachunk(self, prevnode):
+ l = self.chunklength()
+ if not l:
+ return {}
+ headerdata = readexactly(self._stream, self.deltaheadersize)
+ header = struct.unpack(self.deltaheader, headerdata)
+ delta = readexactly(self._stream, l - self.deltaheadersize)
+ node, p1, p2, deltabase, cs = self._deltaheader(header, prevnode)
+ return dict(node=node, p1=p1, p2=p2, cs=cs,
+ deltabase=deltabase, delta=delta)
+
+class headerlessfixup(object):
+ def __init__(self, fh, h):
+ self._h = h
+ self._fh = fh
+ def read(self, n):
+ if self._h:
+ d, self._h = self._h[:n], self._h[n:]
+ if len(d) < n:
+ d += readexactly(self._fh, n - len(d))
+ return d
+ return readexactly(self._fh, n)
+
+def readbundle(fh, fname):
+ header = readexactly(fh, 6)
+
+ if not fname:
+ fname = "stream"
+ if not header.startswith('HG') and header.startswith('\0'):
+ fh = headerlessfixup(fh, header)
+ header = "HG10UN"
+
+ magic, version, alg = header[0:2], header[2:4], header[4:6]
+
+ if magic != 'HG':
+ raise util.Abort(_('%s: not a Mercurial bundle') % fname)
+ if version != '10':
+ raise util.Abort(_('%s: unknown bundle version %s') % (fname, version))
+ return unbundle10(fh, alg)
+
+class bundle10(object):
+ deltaheader = _BUNDLE10_DELTA_HEADER
+ def __init__(self, lookup):
+ self._lookup = lookup
+ def close(self):
+ return closechunk()
+ def fileheader(self, fname):
+ return chunkheader(len(fname)) + fname
+ def revchunk(self, revlog, rev, prev):
+ node = revlog.node(rev)
+ p1, p2 = revlog.parentrevs(rev)
+ base = prev
+
+ prefix = ''
+ if base == nullrev:
+ delta = revlog.revision(node)
+ prefix = mdiff.trivialdiffheader(len(delta))
+ else:
+ delta = revlog.revdiff(base, rev)
+ linknode = self._lookup(revlog, node)
+ p1n, p2n = revlog.parents(node)
+ basenode = revlog.node(base)
+ meta = self.builddeltaheader(node, p1n, p2n, basenode, linknode)
+ meta += prefix
+ l = len(meta) + len(delta)
+ yield chunkheader(l)
+ yield meta
+ yield delta
+ def builddeltaheader(self, node, p1n, p2n, basenode, linknode):
+ # do nothing with basenode, it is implicitly the previous one in HG10
+ return struct.pack(self.deltaheader, node, p1n, p2n, linknode)
diff --git a/mercurial/changelog.py b/mercurial/changelog.py
new file mode 100644
index 0000000..a3c6450
--- /dev/null
+++ b/mercurial/changelog.py
@@ -0,0 +1,254 @@
+# changelog.py - changelog class for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import bin, hex, nullid
+from i18n import _
+import util, error, revlog, encoding
+
+_defaultextra = {'branch': 'default'}
+
+def _string_escape(text):
+ """
+ >>> d = {'nl': chr(10), 'bs': chr(92), 'cr': chr(13), 'nul': chr(0)}
+ >>> s = "ab%(nl)scd%(bs)s%(bs)sn%(nul)sab%(cr)scd%(bs)s%(nl)s" % d
+ >>> s
+ 'ab\\ncd\\\\\\\\n\\x00ab\\rcd\\\\\\n'
+ >>> res = _string_escape(s)
+ >>> s == res.decode('string_escape')
+ True
+ """
+ # subset of the string_escape codec
+ text = text.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r')
+ return text.replace('\0', '\\0')
+
+def decodeextra(text):
+ """
+ >>> decodeextra(encodeextra({'foo': 'bar', 'baz': chr(0) + '2'}))
+ {'foo': 'bar', 'baz': '\\x002', 'branch': 'default'}
+ >>> decodeextra(encodeextra({'foo': 'bar', 'baz': chr(92) + chr(0) + '2'}))
+ {'foo': 'bar', 'baz': '\\\\\\x002', 'branch': 'default'}
+ """
+ extra = _defaultextra.copy()
+ for l in text.split('\0'):
+ if l:
+ if '\\0' in l:
+ # fix up \0 without getting into trouble with \\0
+ l = l.replace('\\\\', '\\\\\n')
+ l = l.replace('\\0', '\0')
+ l = l.replace('\n', '')
+ k, v = l.decode('string_escape').split(':', 1)
+ extra[k] = v
+ return extra
+
+def encodeextra(d):
+ # keys must be sorted to produce a deterministic changelog entry
+ items = [_string_escape('%s:%s' % (k, d[k])) for k in sorted(d)]
+ return "\0".join(items)
+
+class appender(object):
+ '''the changelog index must be updated last on disk, so we use this class
+ to delay writes to it'''
+ def __init__(self, fp, buf):
+ self.data = buf
+ self.fp = fp
+ self.offset = fp.tell()
+ self.size = util.fstat(fp).st_size
+
+ def end(self):
+ return self.size + len("".join(self.data))
+ def tell(self):
+ return self.offset
+ def flush(self):
+ pass
+ def close(self):
+ self.fp.close()
+
+ def seek(self, offset, whence=0):
+ '''virtual file offset spans real file and data'''
+ if whence == 0:
+ self.offset = offset
+ elif whence == 1:
+ self.offset += offset
+ elif whence == 2:
+ self.offset = self.end() + offset
+ if self.offset < self.size:
+ self.fp.seek(self.offset)
+
+ def read(self, count=-1):
+ '''only trick here is reads that span real file and data'''
+ ret = ""
+ if self.offset < self.size:
+ s = self.fp.read(count)
+ ret = s
+ self.offset += len(s)
+ if count > 0:
+ count -= len(s)
+ if count != 0:
+ doff = self.offset - self.size
+ self.data.insert(0, "".join(self.data))
+ del self.data[1:]
+ s = self.data[0][doff:doff + count]
+ self.offset += len(s)
+ ret += s
+ return ret
+
+ def write(self, s):
+ self.data.append(str(s))
+ self.offset += len(s)
+
+def delayopener(opener, target, divert, buf):
+ def o(name, mode='r'):
+ if name != target:
+ return opener(name, mode)
+ if divert:
+ return opener(name + ".a", mode.replace('a', 'w'))
+ # otherwise, divert to memory
+ return appender(opener(name, mode), buf)
+ return o
+
+class changelog(revlog.revlog):
+ def __init__(self, opener):
+ revlog.revlog.__init__(self, opener, "00changelog.i")
+ if self._initempty:
+ # changelogs don't benefit from generaldelta
+ self.version &= ~revlog.REVLOGGENERALDELTA
+ self._generaldelta = False
+ self._realopener = opener
+ self._delayed = False
+ self._divert = False
+
+ def delayupdate(self):
+ "delay visibility of index updates to other readers"
+ self._delayed = True
+ self._divert = (len(self) == 0)
+ self._delaybuf = []
+ self.opener = delayopener(self._realopener, self.indexfile,
+ self._divert, self._delaybuf)
+
+ def finalize(self, tr):
+ "finalize index updates"
+ self._delayed = False
+ self.opener = self._realopener
+ # move redirected index data back into place
+ if self._divert:
+ nfile = self.opener(self.indexfile + ".a")
+ n = nfile.name
+ nfile.close()
+ util.rename(n, n[:-2])
+ elif self._delaybuf:
+ fp = self.opener(self.indexfile, 'a')
+ fp.write("".join(self._delaybuf))
+ fp.close()
+ self._delaybuf = []
+ # split when we're done
+ self.checkinlinesize(tr)
+
+ def readpending(self, file):
+ r = revlog.revlog(self.opener, file)
+ self.index = r.index
+ self.nodemap = r.nodemap
+ self._nodecache = r._nodecache
+ self._chunkcache = r._chunkcache
+
+ def writepending(self):
+ "create a file containing the unfinalized state for pretxnchangegroup"
+ if self._delaybuf:
+ # make a temporary copy of the index
+ fp1 = self._realopener(self.indexfile)
+ fp2 = self._realopener(self.indexfile + ".a", "w")
+ fp2.write(fp1.read())
+ # add pending data
+ fp2.write("".join(self._delaybuf))
+ fp2.close()
+ # switch modes so finalize can simply rename
+ self._delaybuf = []
+ self._divert = True
+
+ if self._divert:
+ return True
+
+ return False
+
+ def checkinlinesize(self, tr, fp=None):
+ if not self._delayed:
+ revlog.revlog.checkinlinesize(self, tr, fp)
+
+ def read(self, node):
+ """
+ format used:
+ nodeid\n : manifest node in ascii
+ user\n : user, no \n or \r allowed
+ time tz extra\n : date (time is int or float, timezone is int)
+ : extra is metadatas, encoded and separated by '\0'
+ : older versions ignore it
+ files\n\n : files modified by the cset, no \n or \r allowed
+ (.*) : comment (free text, ideally utf-8)
+
+ changelog v0 doesn't use extra
+ """
+ text = self.revision(node)
+ if not text:
+ return (nullid, "", (0, 0), [], "", _defaultextra)
+ last = text.index("\n\n")
+ desc = encoding.tolocal(text[last + 2:])
+ l = text[:last].split('\n')
+ manifest = bin(l[0])
+ user = encoding.tolocal(l[1])
+
+ tdata = l[2].split(' ', 2)
+ if len(tdata) != 3:
+ time = float(tdata[0])
+ try:
+ # various tools did silly things with the time zone field.
+ timezone = int(tdata[1])
+ except ValueError:
+ timezone = 0
+ extra = _defaultextra
+ else:
+ time, timezone = float(tdata[0]), int(tdata[1])
+ extra = decodeextra(tdata[2])
+
+ files = l[3:]
+ return (manifest, user, (time, timezone), files, desc, extra)
+
+ def add(self, manifest, files, desc, transaction, p1, p2,
+ user, date=None, extra=None):
+ # Convert to UTF-8 encoded bytestrings as the very first
+ # thing: calling any method on a localstr object will turn it
+ # into a str object and the cached UTF-8 string is thus lost.
+ user, desc = encoding.fromlocal(user), encoding.fromlocal(desc)
+
+ user = user.strip()
+ # An empty username or a username with a "\n" will make the
+ # revision text contain two "\n\n" sequences -> corrupt
+ # repository since read cannot unpack the revision.
+ if not user:
+ raise error.RevlogError(_("empty username"))
+ if "\n" in user:
+ raise error.RevlogError(_("username %s contains a newline")
+ % repr(user))
+
+ # strip trailing whitespace and leading and trailing empty lines
+ desc = '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
+
+ if date:
+ parseddate = "%d %d" % util.parsedate(date)
+ else:
+ parseddate = "%d %d" % util.makedate()
+ if extra:
+ branch = extra.get("branch")
+ if branch in ("default", ""):
+ del extra["branch"]
+ elif branch in (".", "null", "tip"):
+ raise error.RevlogError(_('the name \'%s\' is reserved')
+ % branch)
+ if extra:
+ extra = encodeextra(extra)
+ parseddate = "%s %s" % (parseddate, extra)
+ l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc]
+ text = "\n".join(l)
+ return self.addrevision(text, transaction, len(self), p1, p2)
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
new file mode 100644
index 0000000..7ccbb62
--- /dev/null
+++ b/mercurial/cmdutil.py
@@ -0,0 +1,1931 @@
+# cmdutil.py - help for command processing in mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import hex, nullid, nullrev, short
+from i18n import _
+import os, sys, errno, re, tempfile
+import util, scmutil, templater, patch, error, templatekw, revlog, copies
+import match as matchmod
+import subrepo, context, repair, bookmarks, graphmod, revset
+
+def parsealiases(cmd):
+ return cmd.lstrip("^").split("|")
+
+def findpossible(cmd, table, strict=False):
+ """
+ Return cmd -> (aliases, command table entry)
+ for each matching command.
+ Return debug commands (or their aliases) only if no normal command matches.
+ """
+ choice = {}
+ debugchoice = {}
+
+ if cmd in table:
+ # short-circuit exact matches, "log" alias beats "^log|history"
+ keys = [cmd]
+ else:
+ keys = table.keys()
+
+ for e in keys:
+ aliases = parsealiases(e)
+ found = None
+ if cmd in aliases:
+ found = cmd
+ elif not strict:
+ for a in aliases:
+ if a.startswith(cmd):
+ found = a
+ break
+ if found is not None:
+ if aliases[0].startswith("debug") or found.startswith("debug"):
+ debugchoice[found] = (aliases, table[e])
+ else:
+ choice[found] = (aliases, table[e])
+
+ if not choice and debugchoice:
+ choice = debugchoice
+
+ return choice
+
+def findcmd(cmd, table, strict=True):
+ """Return (aliases, command table entry) for command string."""
+ choice = findpossible(cmd, table, strict)
+
+ if cmd in choice:
+ return choice[cmd]
+
+ if len(choice) > 1:
+ clist = choice.keys()
+ clist.sort()
+ raise error.AmbiguousCommand(cmd, clist)
+
+ if choice:
+ return choice.values()[0]
+
+ raise error.UnknownCommand(cmd)
+
+def findrepo(p):
+ while not os.path.isdir(os.path.join(p, ".hg")):
+ oldp, p = p, os.path.dirname(p)
+ if p == oldp:
+ return None
+
+ return p
+
+def bailifchanged(repo):
+ if repo.dirstate.p2() != nullid:
+ raise util.Abort(_('outstanding uncommitted merge'))
+ modified, added, removed, deleted = repo.status()[:4]
+ if modified or added or removed or deleted:
+ raise util.Abort(_("outstanding uncommitted changes"))
+ ctx = repo[None]
+ for s in ctx.substate:
+ if ctx.sub(s).dirty():
+ raise util.Abort(_("uncommitted changes in subrepo %s") % s)
+
+def logmessage(ui, opts):
+ """ get the log message according to -m and -l option """
+ message = opts.get('message')
+ logfile = opts.get('logfile')
+
+ if message and logfile:
+ raise util.Abort(_('options --message and --logfile are mutually '
+ 'exclusive'))
+ if not message and logfile:
+ try:
+ if logfile == '-':
+ message = ui.fin.read()
+ else:
+ message = '\n'.join(util.readfile(logfile).splitlines())
+ except IOError, inst:
+ raise util.Abort(_("can't read commit message '%s': %s") %
+ (logfile, inst.strerror))
+ return message
+
+def loglimit(opts):
+ """get the log limit according to option -l/--limit"""
+ limit = opts.get('limit')
+ if limit:
+ try:
+ limit = int(limit)
+ except ValueError:
+ raise util.Abort(_('limit must be a positive integer'))
+ if limit <= 0:
+ raise util.Abort(_('limit must be positive'))
+ else:
+ limit = None
+ return limit
+
+def makefilename(repo, pat, node, desc=None,
+ total=None, seqno=None, revwidth=None, pathname=None):
+ node_expander = {
+ 'H': lambda: hex(node),
+ 'R': lambda: str(repo.changelog.rev(node)),
+ 'h': lambda: short(node),
+ 'm': lambda: re.sub('[^\w]', '_', str(desc))
+ }
+ expander = {
+ '%': lambda: '%',
+ 'b': lambda: os.path.basename(repo.root),
+ }
+
+ try:
+ if node:
+ expander.update(node_expander)
+ if node:
+ expander['r'] = (lambda:
+ str(repo.changelog.rev(node)).zfill(revwidth or 0))
+ if total is not None:
+ expander['N'] = lambda: str(total)
+ if seqno is not None:
+ expander['n'] = lambda: str(seqno)
+ if total is not None and seqno is not None:
+ expander['n'] = lambda: str(seqno).zfill(len(str(total)))
+ if pathname is not None:
+ expander['s'] = lambda: os.path.basename(pathname)
+ expander['d'] = lambda: os.path.dirname(pathname) or '.'
+ expander['p'] = lambda: pathname
+
+ newname = []
+ patlen = len(pat)
+ i = 0
+ while i < patlen:
+ c = pat[i]
+ if c == '%':
+ i += 1
+ c = pat[i]
+ c = expander[c]()
+ newname.append(c)
+ i += 1
+ return ''.join(newname)
+ except KeyError, inst:
+ raise util.Abort(_("invalid format spec '%%%s' in output filename") %
+ inst.args[0])
+
+def makefileobj(repo, pat, node=None, desc=None, total=None,
+ seqno=None, revwidth=None, mode='wb', pathname=None):
+
+ writable = mode not in ('r', 'rb')
+
+ if not pat or pat == '-':
+ fp = writable and repo.ui.fout or repo.ui.fin
+ if util.safehasattr(fp, 'fileno'):
+ return os.fdopen(os.dup(fp.fileno()), mode)
+ else:
+ # if this fp can't be duped properly, return
+ # a dummy object that can be closed
+ class wrappedfileobj(object):
+ noop = lambda x: None
+ def __init__(self, f):
+ self.f = f
+ def __getattr__(self, attr):
+ if attr == 'close':
+ return self.noop
+ else:
+ return getattr(self.f, attr)
+
+ return wrappedfileobj(fp)
+ if util.safehasattr(pat, 'write') and writable:
+ return pat
+ if util.safehasattr(pat, 'read') and 'r' in mode:
+ return pat
+ return open(makefilename(repo, pat, node, desc, total, seqno, revwidth,
+ pathname),
+ mode)
+
+def openrevlog(repo, cmd, file_, opts):
+ """opens the changelog, manifest, a filelog or a given revlog"""
+ cl = opts['changelog']
+ mf = opts['manifest']
+ msg = None
+ if cl and mf:
+ msg = _('cannot specify --changelog and --manifest at the same time')
+ elif cl or mf:
+ if file_:
+ msg = _('cannot specify filename with --changelog or --manifest')
+ elif not repo:
+ msg = _('cannot specify --changelog or --manifest '
+ 'without a repository')
+ if msg:
+ raise util.Abort(msg)
+
+ r = None
+ if repo:
+ if cl:
+ r = repo.changelog
+ elif mf:
+ r = repo.manifest
+ elif file_:
+ filelog = repo.file(file_)
+ if len(filelog):
+ r = filelog
+ if not r:
+ if not file_:
+ raise error.CommandError(cmd, _('invalid arguments'))
+ if not os.path.isfile(file_):
+ raise util.Abort(_("revlog '%s' not found") % file_)
+ r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False),
+ file_[:-2] + ".i")
+ return r
+
+def copy(ui, repo, pats, opts, rename=False):
+ # called with the repo lock held
+ #
+ # hgsep => pathname that uses "/" to separate directories
+ # ossep => pathname that uses os.sep to separate directories
+ cwd = repo.getcwd()
+ targets = {}
+ after = opts.get("after")
+ dryrun = opts.get("dry_run")
+ wctx = repo[None]
+
+ def walkpat(pat):
+ srcs = []
+ badstates = after and '?' or '?r'
+ m = scmutil.match(repo[None], [pat], opts, globbed=True)
+ for abs in repo.walk(m):
+ state = repo.dirstate[abs]
+ rel = m.rel(abs)
+ exact = m.exact(abs)
+ if state in badstates:
+ if exact and state == '?':
+ ui.warn(_('%s: not copying - file is not managed\n') % rel)
+ if exact and state == 'r':
+ ui.warn(_('%s: not copying - file has been marked for'
+ ' remove\n') % rel)
+ continue
+ # abs: hgsep
+ # rel: ossep
+ srcs.append((abs, rel, exact))
+ return srcs
+
+ # abssrc: hgsep
+ # relsrc: ossep
+ # otarget: ossep
+ def copyfile(abssrc, relsrc, otarget, exact):
+ abstarget = scmutil.canonpath(repo.root, cwd, otarget)
+ if '/' in abstarget:
+ # We cannot normalize abstarget itself, this would prevent
+ # case only renames, like a => A.
+ abspath, absname = abstarget.rsplit('/', 1)
+ abstarget = repo.dirstate.normalize(abspath) + '/' + absname
+ reltarget = repo.pathto(abstarget, cwd)
+ target = repo.wjoin(abstarget)
+ src = repo.wjoin(abssrc)
+ state = repo.dirstate[abstarget]
+
+ scmutil.checkportable(ui, abstarget)
+
+ # check for collisions
+ prevsrc = targets.get(abstarget)
+ if prevsrc is not None:
+ ui.warn(_('%s: not overwriting - %s collides with %s\n') %
+ (reltarget, repo.pathto(abssrc, cwd),
+ repo.pathto(prevsrc, cwd)))
+ return
+
+ # check for overwrites
+ exists = os.path.lexists(target)
+ samefile = False
+ if exists and abssrc != abstarget:
+ if (repo.dirstate.normalize(abssrc) ==
+ repo.dirstate.normalize(abstarget)):
+ if not rename:
+ ui.warn(_("%s: can't copy - same file\n") % reltarget)
+ return
+ exists = False
+ samefile = True
+
+ if not after and exists or after and state in 'mn':
+ if not opts['force']:
+ ui.warn(_('%s: not overwriting - file exists\n') %
+ reltarget)
+ return
+
+ if after:
+ if not exists:
+ if rename:
+ ui.warn(_('%s: not recording move - %s does not exist\n') %
+ (relsrc, reltarget))
+ else:
+ ui.warn(_('%s: not recording copy - %s does not exist\n') %
+ (relsrc, reltarget))
+ return
+ elif not dryrun:
+ try:
+ if exists:
+ os.unlink(target)
+ targetdir = os.path.dirname(target) or '.'
+ if not os.path.isdir(targetdir):
+ os.makedirs(targetdir)
+ if samefile:
+ tmp = target + "~hgrename"
+ os.rename(src, tmp)
+ os.rename(tmp, target)
+ else:
+ util.copyfile(src, target)
+ srcexists = True
+ except IOError, inst:
+ if inst.errno == errno.ENOENT:
+ ui.warn(_('%s: deleted in working copy\n') % relsrc)
+ srcexists = False
+ else:
+ ui.warn(_('%s: cannot copy - %s\n') %
+ (relsrc, inst.strerror))
+ return True # report a failure
+
+ if ui.verbose or not exact:
+ if rename:
+ ui.status(_('moving %s to %s\n') % (relsrc, reltarget))
+ else:
+ ui.status(_('copying %s to %s\n') % (relsrc, reltarget))
+
+ targets[abstarget] = abssrc
+
+ # fix up dirstate
+ scmutil.dirstatecopy(ui, repo, wctx, abssrc, abstarget,
+ dryrun=dryrun, cwd=cwd)
+ if rename and not dryrun:
+ if not after and srcexists and not samefile:
+ util.unlinkpath(repo.wjoin(abssrc))
+ wctx.forget([abssrc])
+
+ # pat: ossep
+ # dest ossep
+ # srcs: list of (hgsep, hgsep, ossep, bool)
+ # return: function that takes hgsep and returns ossep
+ def targetpathfn(pat, dest, srcs):
+ if os.path.isdir(pat):
+ abspfx = scmutil.canonpath(repo.root, cwd, pat)
+ abspfx = util.localpath(abspfx)
+ if destdirexists:
+ striplen = len(os.path.split(abspfx)[0])
+ else:
+ striplen = len(abspfx)
+ if striplen:
+ striplen += len(os.sep)
+ res = lambda p: os.path.join(dest, util.localpath(p)[striplen:])
+ elif destdirexists:
+ res = lambda p: os.path.join(dest,
+ os.path.basename(util.localpath(p)))
+ else:
+ res = lambda p: dest
+ return res
+
+ # pat: ossep
+ # dest ossep
+ # srcs: list of (hgsep, hgsep, ossep, bool)
+ # return: function that takes hgsep and returns ossep
+ def targetpathafterfn(pat, dest, srcs):
+ if matchmod.patkind(pat):
+ # a mercurial pattern
+ res = lambda p: os.path.join(dest,
+ os.path.basename(util.localpath(p)))
+ else:
+ abspfx = scmutil.canonpath(repo.root, cwd, pat)
+ if len(abspfx) < len(srcs[0][0]):
+ # A directory. Either the target path contains the last
+ # component of the source path or it does not.
+ def evalpath(striplen):
+ score = 0
+ for s in srcs:
+ t = os.path.join(dest, util.localpath(s[0])[striplen:])
+ if os.path.lexists(t):
+ score += 1
+ return score
+
+ abspfx = util.localpath(abspfx)
+ striplen = len(abspfx)
+ if striplen:
+ striplen += len(os.sep)
+ if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
+ score = evalpath(striplen)
+ striplen1 = len(os.path.split(abspfx)[0])
+ if striplen1:
+ striplen1 += len(os.sep)
+ if evalpath(striplen1) > score:
+ striplen = striplen1
+ res = lambda p: os.path.join(dest,
+ util.localpath(p)[striplen:])
+ else:
+ # a file
+ if destdirexists:
+ res = lambda p: os.path.join(dest,
+ os.path.basename(util.localpath(p)))
+ else:
+ res = lambda p: dest
+ return res
+
+
+ pats = scmutil.expandpats(pats)
+ if not pats:
+ raise util.Abort(_('no source or destination specified'))
+ if len(pats) == 1:
+ raise util.Abort(_('no destination specified'))
+ dest = pats.pop()
+ destdirexists = os.path.isdir(dest) and not os.path.islink(dest)
+ if not destdirexists:
+ if len(pats) > 1 or matchmod.patkind(pats[0]):
+ raise util.Abort(_('with multiple sources, destination must be an '
+ 'existing directory'))
+ if util.endswithsep(dest):
+ raise util.Abort(_('destination %s is not a directory') % dest)
+
+ tfn = targetpathfn
+ if after:
+ tfn = targetpathafterfn
+ copylist = []
+ for pat in pats:
+ srcs = walkpat(pat)
+ if not srcs:
+ continue
+ copylist.append((tfn(pat, dest, srcs), srcs))
+ if not copylist:
+ raise util.Abort(_('no files to copy'))
+
+ errors = 0
+ for targetpath, srcs in copylist:
+ for abssrc, relsrc, exact in srcs:
+ if copyfile(abssrc, relsrc, targetpath(abssrc), exact):
+ errors += 1
+
+ if errors:
+ ui.warn(_('(consider using --after)\n'))
+
+ return errors != 0
+
+def service(opts, parentfn=None, initfn=None, runfn=None, logfile=None,
+ runargs=None, appendpid=False):
+ '''Run a command as a service.'''
+
+ if opts['daemon'] and not opts['daemon_pipefds']:
+ # Signal child process startup with file removal
+ lockfd, lockpath = tempfile.mkstemp(prefix='hg-service-')
+ os.close(lockfd)
+ try:
+ if not runargs:
+ runargs = util.hgcmd() + sys.argv[1:]
+ runargs.append('--daemon-pipefds=%s' % lockpath)
+ # Don't pass --cwd to the child process, because we've already
+ # changed directory.
+ for i in xrange(1, len(runargs)):
+ if runargs[i].startswith('--cwd='):
+ del runargs[i]
+ break
+ elif runargs[i].startswith('--cwd'):
+ del runargs[i:i + 2]
+ break
+ def condfn():
+ return not os.path.exists(lockpath)
+ pid = util.rundetached(runargs, condfn)
+ if pid < 0:
+ raise util.Abort(_('child process failed to start'))
+ finally:
+ try:
+ os.unlink(lockpath)
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ if parentfn:
+ return parentfn(pid)
+ else:
+ return
+
+ if initfn:
+ initfn()
+
+ if opts['pid_file']:
+ mode = appendpid and 'a' or 'w'
+ fp = open(opts['pid_file'], mode)
+ fp.write(str(os.getpid()) + '\n')
+ fp.close()
+
+ if opts['daemon_pipefds']:
+ lockpath = opts['daemon_pipefds']
+ try:
+ os.setsid()
+ except AttributeError:
+ pass
+ os.unlink(lockpath)
+ util.hidewindow()
+ sys.stdout.flush()
+ sys.stderr.flush()
+
+ nullfd = os.open(util.nulldev, os.O_RDWR)
+ logfilefd = nullfd
+ if logfile:
+ logfilefd = os.open(logfile, os.O_RDWR | os.O_CREAT | os.O_APPEND)
+ os.dup2(nullfd, 0)
+ os.dup2(logfilefd, 1)
+ os.dup2(logfilefd, 2)
+ if nullfd not in (0, 1, 2):
+ os.close(nullfd)
+ if logfile and logfilefd not in (0, 1, 2):
+ os.close(logfilefd)
+
+ if runfn:
+ return runfn()
+
+def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
+ opts=None):
+ '''export changesets as hg patches.'''
+
+ total = len(revs)
+ revwidth = max([len(str(rev)) for rev in revs])
+
+ def single(rev, seqno, fp):
+ ctx = repo[rev]
+ node = ctx.node()
+ parents = [p.node() for p in ctx.parents() if p]
+ branch = ctx.branch()
+ if switch_parent:
+ parents.reverse()
+ prev = (parents and parents[0]) or nullid
+
+ shouldclose = False
+ if not fp:
+ desc_lines = ctx.description().rstrip().split('\n')
+ desc = desc_lines[0] #Commit always has a first line.
+ fp = makefileobj(repo, template, node, desc=desc, total=total,
+ seqno=seqno, revwidth=revwidth, mode='ab')
+ if fp != template:
+ shouldclose = True
+ if fp != sys.stdout and util.safehasattr(fp, 'name'):
+ repo.ui.note("%s\n" % fp.name)
+
+ fp.write("# HG changeset patch\n")
+ fp.write("# User %s\n" % ctx.user())
+ fp.write("# Date %d %d\n" % ctx.date())
+ if branch and branch != 'default':
+ fp.write("# Branch %s\n" % branch)
+ fp.write("# Node ID %s\n" % hex(node))
+ fp.write("# Parent %s\n" % hex(prev))
+ if len(parents) > 1:
+ fp.write("# Parent %s\n" % hex(parents[1]))
+ fp.write(ctx.description().rstrip())
+ fp.write("\n\n")
+
+ for chunk in patch.diff(repo, prev, node, opts=opts):
+ fp.write(chunk)
+
+ if shouldclose:
+ fp.close()
+
+ for seqno, rev in enumerate(revs):
+ single(rev, seqno + 1, fp)
+
+def diffordiffstat(ui, repo, diffopts, node1, node2, match,
+ changes=None, stat=False, fp=None, prefix='',
+ listsubrepos=False):
+ '''show diff or diffstat.'''
+ if fp is None:
+ write = ui.write
+ else:
+ def write(s, **kw):
+ fp.write(s)
+
+ if stat:
+ diffopts = diffopts.copy(context=0)
+ width = 80
+ if not ui.plain():
+ width = ui.termwidth()
+ chunks = patch.diff(repo, node1, node2, match, changes, diffopts,
+ prefix=prefix)
+ for chunk, label in patch.diffstatui(util.iterlines(chunks),
+ width=width,
+ git=diffopts.git):
+ write(chunk, label=label)
+ else:
+ for chunk, label in patch.diffui(repo, node1, node2, match,
+ changes, diffopts, prefix=prefix):
+ write(chunk, label=label)
+
+ if listsubrepos:
+ ctx1 = repo[node1]
+ ctx2 = repo[node2]
+ for subpath, sub in subrepo.itersubrepos(ctx1, ctx2):
+ tempnode2 = node2
+ try:
+ if node2 is not None:
+ tempnode2 = ctx2.substate[subpath][1]
+ except KeyError:
+ # A subrepo that existed in node1 was deleted between node1 and
+ # node2 (inclusive). Thus, ctx2's substate won't contain that
+ # subpath. The best we can do is to ignore it.
+ tempnode2 = None
+ submatch = matchmod.narrowmatcher(subpath, match)
+ sub.diff(diffopts, tempnode2, submatch, changes=changes,
+ stat=stat, fp=fp, prefix=prefix)
+
+class changeset_printer(object):
+ '''show changeset information when templating not requested.'''
+
+ def __init__(self, ui, repo, patch, diffopts, buffered):
+ self.ui = ui
+ self.repo = repo
+ self.buffered = buffered
+ self.patch = patch
+ self.diffopts = diffopts
+ self.header = {}
+ self.hunk = {}
+ self.lastheader = None
+ self.footer = None
+
+ def flush(self, rev):
+ if rev in self.header:
+ h = self.header[rev]
+ if h != self.lastheader:
+ self.lastheader = h
+ self.ui.write(h)
+ del self.header[rev]
+ if rev in self.hunk:
+ self.ui.write(self.hunk[rev])
+ del self.hunk[rev]
+ return 1
+ return 0
+
+ def close(self):
+ if self.footer:
+ self.ui.write(self.footer)
+
+ def show(self, ctx, copies=None, matchfn=None, **props):
+ if self.buffered:
+ self.ui.pushbuffer()
+ self._show(ctx, copies, matchfn, props)
+ self.hunk[ctx.rev()] = self.ui.popbuffer(labeled=True)
+ else:
+ self._show(ctx, copies, matchfn, props)
+
+ def _show(self, ctx, copies, matchfn, props):
+ '''show a single changeset or file revision'''
+ changenode = ctx.node()
+ rev = ctx.rev()
+
+ if self.ui.quiet:
+ self.ui.write("%d:%s\n" % (rev, short(changenode)),
+ label='log.node')
+ return
+
+ log = self.repo.changelog
+ date = util.datestr(ctx.date())
+
+ hexfunc = self.ui.debugflag and hex or short
+
+ parents = [(p, hexfunc(log.node(p)))
+ for p in self._meaningful_parentrevs(log, rev)]
+
+ self.ui.write(_("changeset: %d:%s\n") % (rev, hexfunc(changenode)),
+ label='log.changeset')
+
+ branch = ctx.branch()
+ # don't show the default branch name
+ if branch != 'default':
+ self.ui.write(_("branch: %s\n") % branch,
+ label='log.branch')
+ for bookmark in self.repo.nodebookmarks(changenode):
+ self.ui.write(_("bookmark: %s\n") % bookmark,
+ label='log.bookmark')
+ for tag in self.repo.nodetags(changenode):
+ self.ui.write(_("tag: %s\n") % tag,
+ label='log.tag')
+ if self.ui.debugflag and ctx.phase():
+ self.ui.write(_("phase: %s\n") % _(ctx.phasestr()),
+ label='log.phase')
+ for parent in parents:
+ self.ui.write(_("parent: %d:%s\n") % parent,
+ label='log.parent')
+
+ if self.ui.debugflag:
+ mnode = ctx.manifestnode()
+ self.ui.write(_("manifest: %d:%s\n") %
+ (self.repo.manifest.rev(mnode), hex(mnode)),
+ label='ui.debug log.manifest')
+ self.ui.write(_("user: %s\n") % ctx.user(),
+ label='log.user')
+ self.ui.write(_("date: %s\n") % date,
+ label='log.date')
+
+ if self.ui.debugflag:
+ files = self.repo.status(log.parents(changenode)[0], changenode)[:3]
+ for key, value in zip([_("files:"), _("files+:"), _("files-:")],
+ files):
+ if value:
+ self.ui.write("%-12s %s\n" % (key, " ".join(value)),
+ label='ui.debug log.files')
+ elif ctx.files() and self.ui.verbose:
+ self.ui.write(_("files: %s\n") % " ".join(ctx.files()),
+ label='ui.note log.files')
+ if copies and self.ui.verbose:
+ copies = ['%s (%s)' % c for c in copies]
+ self.ui.write(_("copies: %s\n") % ' '.join(copies),
+ label='ui.note log.copies')
+
+ extra = ctx.extra()
+ if extra and self.ui.debugflag:
+ for key, value in sorted(extra.items()):
+ self.ui.write(_("extra: %s=%s\n")
+ % (key, value.encode('string_escape')),
+ label='ui.debug log.extra')
+
+ description = ctx.description().strip()
+ if description:
+ if self.ui.verbose:
+ self.ui.write(_("description:\n"),
+ label='ui.note log.description')
+ self.ui.write(description,
+ label='ui.note log.description')
+ self.ui.write("\n\n")
+ else:
+ self.ui.write(_("summary: %s\n") %
+ description.splitlines()[0],
+ label='log.summary')
+ self.ui.write("\n")
+
+ self.showpatch(changenode, matchfn)
+
+ def showpatch(self, node, matchfn):
+ if not matchfn:
+ matchfn = self.patch
+ if matchfn:
+ stat = self.diffopts.get('stat')
+ diff = self.diffopts.get('patch')
+ diffopts = patch.diffopts(self.ui, self.diffopts)
+ prev = self.repo.changelog.parents(node)[0]
+ if stat:
+ diffordiffstat(self.ui, self.repo, diffopts, prev, node,
+ match=matchfn, stat=True)
+ if diff:
+ if stat:
+ self.ui.write("\n")
+ diffordiffstat(self.ui, self.repo, diffopts, prev, node,
+ match=matchfn, stat=False)
+ self.ui.write("\n")
+
+ def _meaningful_parentrevs(self, log, rev):
+ """Return list of meaningful (or all if debug) parentrevs for rev.
+
+ For merges (two non-nullrev revisions) both parents are meaningful.
+ Otherwise the first parent revision is considered meaningful if it
+ is not the preceding revision.
+ """
+ parents = log.parentrevs(rev)
+ if not self.ui.debugflag and parents[1] == nullrev:
+ if parents[0] >= rev - 1:
+ parents = []
+ else:
+ parents = [parents[0]]
+ return parents
+
+
+class changeset_templater(changeset_printer):
+ '''format changeset information.'''
+
+ def __init__(self, ui, repo, patch, diffopts, mapfile, buffered):
+ changeset_printer.__init__(self, ui, repo, patch, diffopts, buffered)
+ formatnode = ui.debugflag and (lambda x: x) or (lambda x: x[:12])
+ defaulttempl = {
+ 'parent': '{rev}:{node|formatnode} ',
+ 'manifest': '{rev}:{node|formatnode}',
+ 'file_copy': '{name} ({source})',
+ 'extra': '{key}={value|stringescape}'
+ }
+ # filecopy is preserved for compatibility reasons
+ defaulttempl['filecopy'] = defaulttempl['file_copy']
+ self.t = templater.templater(mapfile, {'formatnode': formatnode},
+ cache=defaulttempl)
+ self.cache = {}
+
+ def use_template(self, t):
+ '''set template string to use'''
+ self.t.cache['changeset'] = t
+
+ def _meaningful_parentrevs(self, ctx):
+ """Return list of meaningful (or all if debug) parentrevs for rev.
+ """
+ parents = ctx.parents()
+ if len(parents) > 1:
+ return parents
+ if self.ui.debugflag:
+ return [parents[0], self.repo['null']]
+ if parents[0].rev() >= ctx.rev() - 1:
+ return []
+ return parents
+
+ def _show(self, ctx, copies, matchfn, props):
+ '''show a single changeset or file revision'''
+
+ showlist = templatekw.showlist
+
+ # showparents() behaviour depends on ui trace level which
+ # causes unexpected behaviours at templating level and makes
+ # it harder to extract it in a standalone function. Its
+ # behaviour cannot be changed so leave it here for now.
+ def showparents(**args):
+ ctx = args['ctx']
+ parents = [[('rev', p.rev()), ('node', p.hex())]
+ for p in self._meaningful_parentrevs(ctx)]
+ return showlist('parent', parents, **args)
+
+ props = props.copy()
+ props.update(templatekw.keywords)
+ props['parents'] = showparents
+ props['templ'] = self.t
+ props['ctx'] = ctx
+ props['repo'] = self.repo
+ props['revcache'] = {'copies': copies}
+ props['cache'] = self.cache
+
+ # find correct templates for current mode
+
+ tmplmodes = [
+ (True, None),
+ (self.ui.verbose, 'verbose'),
+ (self.ui.quiet, 'quiet'),
+ (self.ui.debugflag, 'debug'),
+ ]
+
+ types = {'header': '', 'footer':'', 'changeset': 'changeset'}
+ for mode, postfix in tmplmodes:
+ for type in types:
+ cur = postfix and ('%s_%s' % (type, postfix)) or type
+ if mode and cur in self.t:
+ types[type] = cur
+
+ try:
+
+ # write header
+ if types['header']:
+ h = templater.stringify(self.t(types['header'], **props))
+ if self.buffered:
+ self.header[ctx.rev()] = h
+ else:
+ if self.lastheader != h:
+ self.lastheader = h
+ self.ui.write(h)
+
+ # write changeset metadata, then patch if requested
+ key = types['changeset']
+ self.ui.write(templater.stringify(self.t(key, **props)))
+ self.showpatch(ctx.node(), matchfn)
+
+ if types['footer']:
+ if not self.footer:
+ self.footer = templater.stringify(self.t(types['footer'],
+ **props))
+
+ except KeyError, inst:
+ msg = _("%s: no key named '%s'")
+ raise util.Abort(msg % (self.t.mapfile, inst.args[0]))
+ except SyntaxError, inst:
+ raise util.Abort('%s: %s' % (self.t.mapfile, inst.args[0]))
+
+def show_changeset(ui, repo, opts, buffered=False):
+ """show one changeset using template or regular display.
+
+ Display format will be the first non-empty hit of:
+ 1. option 'template'
+ 2. option 'style'
+ 3. [ui] setting 'logtemplate'
+ 4. [ui] setting 'style'
+ If all of these values are either the unset or the empty string,
+ regular display via changeset_printer() is done.
+ """
+ # options
+ patch = False
+ if opts.get('patch') or opts.get('stat'):
+ patch = scmutil.matchall(repo)
+
+ tmpl = opts.get('template')
+ style = None
+ if tmpl:
+ tmpl = templater.parsestring(tmpl, quoted=False)
+ else:
+ style = opts.get('style')
+
+ # ui settings
+ if not (tmpl or style):
+ tmpl = ui.config('ui', 'logtemplate')
+ if tmpl:
+ try:
+ tmpl = templater.parsestring(tmpl)
+ except SyntaxError:
+ tmpl = templater.parsestring(tmpl, quoted=False)
+ else:
+ style = util.expandpath(ui.config('ui', 'style', ''))
+
+ if not (tmpl or style):
+ return changeset_printer(ui, repo, patch, opts, buffered)
+
+ mapfile = None
+ if style and not tmpl:
+ mapfile = style
+ if not os.path.split(mapfile)[0]:
+ mapname = (templater.templatepath('map-cmdline.' + mapfile)
+ or templater.templatepath(mapfile))
+ if mapname:
+ mapfile = mapname
+
+ try:
+ t = changeset_templater(ui, repo, patch, opts, mapfile, buffered)
+ except SyntaxError, inst:
+ raise util.Abort(inst.args[0])
+ if tmpl:
+ t.use_template(tmpl)
+ return t
+
+def finddate(ui, repo, date):
+ """Find the tipmost changeset that matches the given date spec"""
+
+ df = util.matchdate(date)
+ m = scmutil.matchall(repo)
+ results = {}
+
+ def prep(ctx, fns):
+ d = ctx.date()
+ if df(d[0]):
+ results[ctx.rev()] = d
+
+ for ctx in walkchangerevs(repo, m, {'rev': None}, prep):
+ rev = ctx.rev()
+ if rev in results:
+ ui.status(_("found revision %s from %s\n") %
+ (rev, util.datestr(results[rev])))
+ return str(rev)
+
+ raise util.Abort(_("revision matching date not found"))
+
+def increasingwindows(start, end, windowsize=8, sizelimit=512):
+ if start < end:
+ while start < end:
+ yield start, min(windowsize, end - start)
+ start += windowsize
+ if windowsize < sizelimit:
+ windowsize *= 2
+ else:
+ while start > end:
+ yield start, min(windowsize, start - end - 1)
+ start -= windowsize
+ if windowsize < sizelimit:
+ windowsize *= 2
+
+def walkchangerevs(repo, match, opts, prepare):
+ '''Iterate over files and the revs in which they changed.
+
+ Callers most commonly need to iterate backwards over the history
+ in which they are interested. Doing so has awful (quadratic-looking)
+ performance, so we use iterators in a "windowed" way.
+
+ We walk a window of revisions in the desired order. Within the
+ window, we first walk forwards to gather data, then in the desired
+ order (usually backwards) to display it.
+
+ This function returns an iterator yielding contexts. Before
+ yielding each context, the iterator will first call the prepare
+ function on each context in the window in forward order.'''
+
+ follow = opts.get('follow') or opts.get('follow_first')
+
+ if not len(repo):
+ return []
+
+ if follow:
+ defrange = '%s:0' % repo['.'].rev()
+ else:
+ defrange = '-1:0'
+ revs = scmutil.revrange(repo, opts.get('rev') or [defrange])
+ if not revs:
+ return []
+ wanted = set()
+ slowpath = match.anypats() or (match.files() and opts.get('removed'))
+ fncache = {}
+ change = repo.changectx
+
+ # First step is to fill wanted, the set of revisions that we want to yield.
+ # When it does not induce extra cost, we also fill fncache for revisions in
+ # wanted: a cache of filenames that were changed (ctx.files()) and that
+ # match the file filtering conditions.
+
+ if not slowpath and not match.files():
+ # No files, no patterns. Display all revs.
+ wanted = set(revs)
+ copies = []
+
+ if not slowpath and match.files():
+ # We only have to read through the filelog to find wanted revisions
+
+ minrev, maxrev = min(revs), max(revs)
+ def filerevgen(filelog, last):
+ """
+ Only files, no patterns. Check the history of each file.
+
+ Examines filelog entries within minrev, maxrev linkrev range
+ Returns an iterator yielding (linkrev, parentlinkrevs, copied)
+ tuples in backwards order
+ """
+ cl_count = len(repo)
+ revs = []
+ for j in xrange(0, last + 1):
+ linkrev = filelog.linkrev(j)
+ if linkrev < minrev:
+ continue
+ # only yield rev for which we have the changelog, it can
+ # happen while doing "hg log" during a pull or commit
+ if linkrev >= cl_count:
+ break
+
+ parentlinkrevs = []
+ for p in filelog.parentrevs(j):
+ if p != nullrev:
+ parentlinkrevs.append(filelog.linkrev(p))
+ n = filelog.node(j)
+ revs.append((linkrev, parentlinkrevs,
+ follow and filelog.renamed(n)))
+
+ return reversed(revs)
+ def iterfiles():
+ pctx = repo['.']
+ for filename in match.files():
+ if follow:
+ if filename not in pctx:
+ raise util.Abort(_('cannot follow file not in parent '
+ 'revision: "%s"') % filename)
+ yield filename, pctx[filename].filenode()
+ else:
+ yield filename, None
+ for filename_node in copies:
+ yield filename_node
+ for file_, node in iterfiles():
+ filelog = repo.file(file_)
+ if not len(filelog):
+ if node is None:
+ # A zero count may be a directory or deleted file, so
+ # try to find matching entries on the slow path.
+ if follow:
+ raise util.Abort(
+ _('cannot follow nonexistent file: "%s"') % file_)
+ slowpath = True
+ break
+ else:
+ continue
+
+ if node is None:
+ last = len(filelog) - 1
+ else:
+ last = filelog.rev(node)
+
+
+ # keep track of all ancestors of the file
+ ancestors = set([filelog.linkrev(last)])
+
+ # iterate from latest to oldest revision
+ for rev, flparentlinkrevs, copied in filerevgen(filelog, last):
+ if not follow:
+ if rev > maxrev:
+ continue
+ else:
+ # Note that last might not be the first interesting
+ # rev to us:
+ # if the file has been changed after maxrev, we'll
+ # have linkrev(last) > maxrev, and we still need
+ # to explore the file graph
+ if rev not in ancestors:
+ continue
+ # XXX insert 1327 fix here
+ if flparentlinkrevs:
+ ancestors.update(flparentlinkrevs)
+
+ fncache.setdefault(rev, []).append(file_)
+ wanted.add(rev)
+ if copied:
+ copies.append(copied)
+ if slowpath:
+ # We have to read the changelog to match filenames against
+ # changed files
+
+ if follow:
+ raise util.Abort(_('can only follow copies/renames for explicit '
+ 'filenames'))
+
+ # The slow path checks files modified in every changeset.
+ for i in sorted(revs):
+ ctx = change(i)
+ matches = filter(match, ctx.files())
+ if matches:
+ fncache[i] = matches
+ wanted.add(i)
+
+ class followfilter(object):
+ def __init__(self, onlyfirst=False):
+ self.startrev = nullrev
+ self.roots = set()
+ self.onlyfirst = onlyfirst
+
+ def match(self, rev):
+ def realparents(rev):
+ if self.onlyfirst:
+ return repo.changelog.parentrevs(rev)[0:1]
+ else:
+ return filter(lambda x: x != nullrev,
+ repo.changelog.parentrevs(rev))
+
+ if self.startrev == nullrev:
+ self.startrev = rev
+ return True
+
+ if rev > self.startrev:
+ # forward: all descendants
+ if not self.roots:
+ self.roots.add(self.startrev)
+ for parent in realparents(rev):
+ if parent in self.roots:
+ self.roots.add(rev)
+ return True
+ else:
+ # backwards: all parents
+ if not self.roots:
+ self.roots.update(realparents(self.startrev))
+ if rev in self.roots:
+ self.roots.remove(rev)
+ self.roots.update(realparents(rev))
+ return True
+
+ return False
+
+ # it might be worthwhile to do this in the iterator if the rev range
+ # is descending and the prune args are all within that range
+ for rev in opts.get('prune', ()):
+ rev = repo[rev].rev()
+ ff = followfilter()
+ stop = min(revs[0], revs[-1])
+ for x in xrange(rev, stop - 1, -1):
+ if ff.match(x):
+ wanted.discard(x)
+
+ # Now that wanted is correctly initialized, we can iterate over the
+ # revision range, yielding only revisions in wanted.
+ def iterate():
+ if follow and not match.files():
+ ff = followfilter(onlyfirst=opts.get('follow_first'))
+ def want(rev):
+ return ff.match(rev) and rev in wanted
+ else:
+ def want(rev):
+ return rev in wanted
+
+ for i, window in increasingwindows(0, len(revs)):
+ nrevs = [rev for rev in revs[i:i + window] if want(rev)]
+ for rev in sorted(nrevs):
+ fns = fncache.get(rev)
+ ctx = change(rev)
+ if not fns:
+ def fns_generator():
+ for f in ctx.files():
+ if match(f):
+ yield f
+ fns = fns_generator()
+ prepare(ctx, fns)
+ for rev in nrevs:
+ yield change(rev)
+ return iterate()
+
+def _makegraphfilematcher(repo, pats, followfirst):
+ # When displaying a revision with --patch --follow FILE, we have
+ # to know which file of the revision must be diffed. With
+ # --follow, we want the names of the ancestors of FILE in the
+ # revision, stored in "fcache". "fcache" is populated by
+ # reproducing the graph traversal already done by --follow revset
+ # and relating linkrevs to file names (which is not "correct" but
+ # good enough).
+ fcache = {}
+ fcacheready = [False]
+ pctx = repo['.']
+ wctx = repo[None]
+
+ def populate():
+ for fn in pats:
+ for i in ((pctx[fn],), pctx[fn].ancestors(followfirst=followfirst)):
+ for c in i:
+ fcache.setdefault(c.linkrev(), set()).add(c.path())
+
+ def filematcher(rev):
+ if not fcacheready[0]:
+ # Lazy initialization
+ fcacheready[0] = True
+ populate()
+ return scmutil.match(wctx, fcache.get(rev, []), default='path')
+
+ return filematcher
+
+def _makegraphlogrevset(repo, pats, opts, revs):
+ """Return (expr, filematcher) where expr is a revset string built
+ from log options and file patterns or None. If --stat or --patch
+ are not passed filematcher is None. Otherwise it is a callable
+ taking a revision number and returning a match objects filtering
+ the files to be detailed when displaying the revision.
+ """
+ opt2revset = {
+ 'no_merges': ('not merge()', None),
+ 'only_merges': ('merge()', None),
+ '_ancestors': ('ancestors(%(val)s)', None),
+ '_fancestors': ('_firstancestors(%(val)s)', None),
+ '_descendants': ('descendants(%(val)s)', None),
+ '_fdescendants': ('_firstdescendants(%(val)s)', None),
+ '_matchfiles': ('_matchfiles(%(val)s)', None),
+ 'date': ('date(%(val)r)', None),
+ 'branch': ('branch(%(val)r)', ' or '),
+ '_patslog': ('filelog(%(val)r)', ' or '),
+ '_patsfollow': ('follow(%(val)r)', ' or '),
+ '_patsfollowfirst': ('_followfirst(%(val)r)', ' or '),
+ 'keyword': ('keyword(%(val)r)', ' or '),
+ 'prune': ('not (%(val)r or ancestors(%(val)r))', ' and '),
+ 'user': ('user(%(val)r)', ' or '),
+ }
+
+ opts = dict(opts)
+ # follow or not follow?
+ follow = opts.get('follow') or opts.get('follow_first')
+ followfirst = opts.get('follow_first') and 1 or 0
+ # --follow with FILE behaviour depends on revs...
+ startrev = revs[0]
+ followdescendants = (len(revs) > 1 and revs[0] < revs[1]) and 1 or 0
+
+ # branch and only_branch are really aliases and must be handled at
+ # the same time
+ opts['branch'] = opts.get('branch', []) + opts.get('only_branch', [])
+ opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']]
+ # pats/include/exclude are passed to match.match() directly in
+ # _matchfile() revset but walkchangerevs() builds its matcher with
+ # scmutil.match(). The difference is input pats are globbed on
+ # platforms without shell expansion (windows).
+ pctx = repo[None]
+ match, pats = scmutil.matchandpats(pctx, pats, opts)
+ slowpath = match.anypats() or (match.files() and opts.get('removed'))
+ if not slowpath:
+ for f in match.files():
+ if follow and f not in pctx:
+ raise util.Abort(_('cannot follow file not in parent '
+ 'revision: "%s"') % f)
+ filelog = repo.file(f)
+ if not len(filelog):
+ # A zero count may be a directory or deleted file, so
+ # try to find matching entries on the slow path.
+ if follow:
+ raise util.Abort(
+ _('cannot follow nonexistent file: "%s"') % f)
+ slowpath = True
+ if slowpath:
+ # See walkchangerevs() slow path.
+ #
+ if follow:
+ raise util.Abort(_('can only follow copies/renames for explicit '
+ 'filenames'))
+ # pats/include/exclude cannot be represented as separate
+ # revset expressions as their filtering logic applies at file
+ # level. For instance "-I a -X a" matches a revision touching
+ # "a" and "b" while "file(a) and not file(b)" does
+ # not. Besides, filesets are evaluated against the working
+ # directory.
+ matchargs = ['r:', 'd:relpath']
+ for p in pats:
+ matchargs.append('p:' + p)
+ for p in opts.get('include', []):
+ matchargs.append('i:' + p)
+ for p in opts.get('exclude', []):
+ matchargs.append('x:' + p)
+ matchargs = ','.join(('%r' % p) for p in matchargs)
+ opts['_matchfiles'] = matchargs
+ else:
+ if follow:
+ fpats = ('_patsfollow', '_patsfollowfirst')
+ fnopats = (('_ancestors', '_fancestors'),
+ ('_descendants', '_fdescendants'))
+ if pats:
+ # follow() revset inteprets its file argument as a
+ # manifest entry, so use match.files(), not pats.
+ opts[fpats[followfirst]] = list(match.files())
+ else:
+ opts[fnopats[followdescendants][followfirst]] = str(startrev)
+ else:
+ opts['_patslog'] = list(pats)
+
+ filematcher = None
+ if opts.get('patch') or opts.get('stat'):
+ if follow:
+ filematcher = _makegraphfilematcher(repo, pats, followfirst)
+ else:
+ filematcher = lambda rev: match
+
+ expr = []
+ for op, val in opts.iteritems():
+ if not val:
+ continue
+ if op not in opt2revset:
+ continue
+ revop, andor = opt2revset[op]
+ if '%(val)' not in revop:
+ expr.append(revop)
+ else:
+ if not isinstance(val, list):
+ e = revop % {'val': val}
+ else:
+ e = '(' + andor.join((revop % {'val': v}) for v in val) + ')'
+ expr.append(e)
+
+ if expr:
+ expr = '(' + ' and '.join(expr) + ')'
+ else:
+ expr = None
+ return expr, filematcher
+
+def getgraphlogrevs(repo, pats, opts):
+ """Return (revs, expr, filematcher) where revs is an iterable of
+ revision numbers, expr is a revset string built from log options
+ and file patterns or None, and used to filter 'revs'. If --stat or
+ --patch are not passed filematcher is None. Otherwise it is a
+ callable taking a revision number and returning a match objects
+ filtering the files to be detailed when displaying the revision.
+ """
+ def increasingrevs(repo, revs, matcher):
+ # The sorted input rev sequence is chopped in sub-sequences
+ # which are sorted in ascending order and passed to the
+ # matcher. The filtered revs are sorted again as they were in
+ # the original sub-sequence. This achieve several things:
+ #
+ # - getlogrevs() now returns a generator which behaviour is
+ # adapted to log need. First results come fast, last ones
+ # are batched for performances.
+ #
+ # - revset matchers often operate faster on revision in
+ # changelog order, because most filters deal with the
+ # changelog.
+ #
+ # - revset matchers can reorder revisions. "A or B" typically
+ # returns returns the revision matching A then the revision
+ # matching B. We want to hide this internal implementation
+ # detail from the caller, and sorting the filtered revision
+ # again achieves this.
+ for i, window in increasingwindows(0, len(revs), windowsize=1):
+ orevs = revs[i:i + window]
+ nrevs = set(matcher(repo, sorted(orevs)))
+ for rev in orevs:
+ if rev in nrevs:
+ yield rev
+
+ if not len(repo):
+ return iter([]), None, None
+ # Default --rev value depends on --follow but --follow behaviour
+ # depends on revisions resolved from --rev...
+ follow = opts.get('follow') or opts.get('follow_first')
+ if opts.get('rev'):
+ revs = scmutil.revrange(repo, opts['rev'])
+ else:
+ if follow and len(repo) > 0:
+ revs = scmutil.revrange(repo, ['.:0'])
+ else:
+ revs = range(len(repo) - 1, -1, -1)
+ if not revs:
+ return iter([]), None, None
+ expr, filematcher = _makegraphlogrevset(repo, pats, opts, revs)
+ if expr:
+ matcher = revset.match(repo.ui, expr)
+ revs = increasingrevs(repo, revs, matcher)
+ if not opts.get('hidden'):
+ # --hidden is still experimental and not worth a dedicated revset
+ # yet. Fortunately, filtering revision number is fast.
+ revs = (r for r in revs if r not in repo.hiddenrevs)
+ else:
+ revs = iter(revs)
+ return revs, expr, filematcher
+
+def displaygraph(ui, dag, displayer, showparents, edgefn, getrenamed=None,
+ filematcher=None):
+ seen, state = [], graphmod.asciistate()
+ for rev, type, ctx, parents in dag:
+ char = 'o'
+ if ctx.node() in showparents:
+ char = '@'
+ elif ctx.obsolete():
+ char = 'x'
+ copies = None
+ if getrenamed and ctx.rev():
+ copies = []
+ for fn in ctx.files():
+ rename = getrenamed(fn, ctx.rev())
+ if rename:
+ copies.append((fn, rename[0]))
+ revmatchfn = None
+ if filematcher is not None:
+ revmatchfn = filematcher(ctx.rev())
+ displayer.show(ctx, copies=copies, matchfn=revmatchfn)
+ lines = displayer.hunk.pop(rev).split('\n')
+ if not lines[-1]:
+ del lines[-1]
+ displayer.flush(rev)
+ edges = edgefn(type, char, lines, seen, rev, parents)
+ for type, char, lines, coldata in edges:
+ graphmod.ascii(ui, state, type, char, lines, coldata)
+ displayer.close()
+
+def graphlog(ui, repo, *pats, **opts):
+ # Parameters are identical to log command ones
+ revs, expr, filematcher = getgraphlogrevs(repo, pats, opts)
+ revs = sorted(revs, reverse=1)
+ limit = loglimit(opts)
+ if limit is not None:
+ revs = revs[:limit]
+ revdag = graphmod.dagwalker(repo, revs)
+
+ getrenamed = None
+ if opts.get('copies'):
+ endrev = None
+ if opts.get('rev'):
+ endrev = max(scmutil.revrange(repo, opts.get('rev'))) + 1
+ getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
+ displayer = show_changeset(ui, repo, opts, buffered=True)
+ showparents = [ctx.node() for ctx in repo[None].parents()]
+ displaygraph(ui, revdag, displayer, showparents,
+ graphmod.asciiedges, getrenamed, filematcher)
+
+def checkunsupportedgraphflags(pats, opts):
+ for op in ["newest_first"]:
+ if op in opts and opts[op]:
+ raise util.Abort(_("-G/--graph option is incompatible with --%s")
+ % op.replace("_", "-"))
+
+def graphrevs(repo, nodes, opts):
+ limit = loglimit(opts)
+ nodes.reverse()
+ if limit is not None:
+ nodes = nodes[:limit]
+ return graphmod.nodes(repo, nodes)
+
+def add(ui, repo, match, dryrun, listsubrepos, prefix, explicitonly):
+ join = lambda f: os.path.join(prefix, f)
+ bad = []
+ oldbad = match.bad
+ match.bad = lambda x, y: bad.append(x) or oldbad(x, y)
+ names = []
+ wctx = repo[None]
+ cca = None
+ abort, warn = scmutil.checkportabilityalert(ui)
+ if abort or warn:
+ cca = scmutil.casecollisionauditor(ui, abort, repo.dirstate)
+ for f in repo.walk(match):
+ exact = match.exact(f)
+ if exact or not explicitonly and f not in repo.dirstate:
+ if cca:
+ cca(f)
+ names.append(f)
+ if ui.verbose or not exact:
+ ui.status(_('adding %s\n') % match.rel(join(f)))
+
+ for subpath in wctx.substate:
+ sub = wctx.sub(subpath)
+ try:
+ submatch = matchmod.narrowmatcher(subpath, match)
+ if listsubrepos:
+ bad.extend(sub.add(ui, submatch, dryrun, listsubrepos, prefix,
+ False))
+ else:
+ bad.extend(sub.add(ui, submatch, dryrun, listsubrepos, prefix,
+ True))
+ except error.LookupError:
+ ui.status(_("skipping missing subrepository: %s\n")
+ % join(subpath))
+
+ if not dryrun:
+ rejected = wctx.add(names, prefix)
+ bad.extend(f for f in rejected if f in match.files())
+ return bad
+
+def forget(ui, repo, match, prefix, explicitonly):
+ join = lambda f: os.path.join(prefix, f)
+ bad = []
+ oldbad = match.bad
+ match.bad = lambda x, y: bad.append(x) or oldbad(x, y)
+ wctx = repo[None]
+ forgot = []
+ s = repo.status(match=match, clean=True)
+ forget = sorted(s[0] + s[1] + s[3] + s[6])
+ if explicitonly:
+ forget = [f for f in forget if match.exact(f)]
+
+ for subpath in wctx.substate:
+ sub = wctx.sub(subpath)
+ try:
+ submatch = matchmod.narrowmatcher(subpath, match)
+ subbad, subforgot = sub.forget(ui, submatch, prefix)
+ bad.extend([subpath + '/' + f for f in subbad])
+ forgot.extend([subpath + '/' + f for f in subforgot])
+ except error.LookupError:
+ ui.status(_("skipping missing subrepository: %s\n")
+ % join(subpath))
+
+ if not explicitonly:
+ for f in match.files():
+ if f not in repo.dirstate and not os.path.isdir(match.rel(join(f))):
+ if f not in forgot:
+ if os.path.exists(match.rel(join(f))):
+ ui.warn(_('not removing %s: '
+ 'file is already untracked\n')
+ % match.rel(join(f)))
+ bad.append(f)
+
+ for f in forget:
+ if ui.verbose or not match.exact(f):
+ ui.status(_('removing %s\n') % match.rel(join(f)))
+
+ rejected = wctx.forget(forget, prefix)
+ bad.extend(f for f in rejected if f in match.files())
+ forgot.extend(forget)
+ return bad, forgot
+
+def duplicatecopies(repo, rev, p1):
+ "Reproduce copies found in the source revision in the dirstate for grafts"
+ for dst, src in copies.pathcopies(repo[p1], repo[rev]).iteritems():
+ repo.dirstate.copy(src, dst)
+
+def commit(ui, repo, commitfunc, pats, opts):
+ '''commit the specified files or all outstanding changes'''
+ date = opts.get('date')
+ if date:
+ opts['date'] = util.parsedate(date)
+ message = logmessage(ui, opts)
+
+ # extract addremove carefully -- this function can be called from a command
+ # that doesn't support addremove
+ if opts.get('addremove'):
+ scmutil.addremove(repo, pats, opts)
+
+ return commitfunc(ui, repo, message,
+ scmutil.match(repo[None], pats, opts), opts)
+
+def amend(ui, repo, commitfunc, old, extra, pats, opts):
+ ui.note(_('amending changeset %s\n') % old)
+ base = old.p1()
+
+ wlock = repo.wlock()
+ try:
+ # First, do a regular commit to record all changes in the working
+ # directory (if there are any)
+ ui.callhooks = False
+ try:
+ node = commit(ui, repo, commitfunc, pats, opts)
+ finally:
+ ui.callhooks = True
+ ctx = repo[node]
+
+ # Participating changesets:
+ #
+ # node/ctx o - new (intermediate) commit that contains changes from
+ # | working dir to go into amending commit (or a workingctx
+ # | if there were no changes)
+ # |
+ # old o - changeset to amend
+ # |
+ # base o - parent of amending changeset
+
+ # Update extra dict from amended commit (e.g. to preserve graft source)
+ extra.update(old.extra())
+
+ # Also update it from the intermediate commit or from the wctx
+ extra.update(ctx.extra())
+
+ files = set(old.files())
+
+ # Second, we use either the commit we just did, or if there were no
+ # changes the parent of the working directory as the version of the
+ # files in the final amend commit
+ if node:
+ ui.note(_('copying changeset %s to %s\n') % (ctx, base))
+
+ user = ctx.user()
+ date = ctx.date()
+ message = ctx.description()
+ # Recompute copies (avoid recording a -> b -> a)
+ copied = copies.pathcopies(base, ctx)
+
+ # Prune files which were reverted by the updates: if old introduced
+ # file X and our intermediate commit, node, renamed that file, then
+ # those two files are the same and we can discard X from our list
+ # of files. Likewise if X was deleted, it's no longer relevant
+ files.update(ctx.files())
+
+ def samefile(f):
+ if f in ctx.manifest():
+ a = ctx.filectx(f)
+ if f in base.manifest():
+ b = base.filectx(f)
+ return (not a.cmp(b)
+ and a.flags() == b.flags())
+ else:
+ return False
+ else:
+ return f not in base.manifest()
+ files = [f for f in files if not samefile(f)]
+
+ def filectxfn(repo, ctx_, path):
+ try:
+ fctx = ctx[path]
+ flags = fctx.flags()
+ mctx = context.memfilectx(fctx.path(), fctx.data(),
+ islink='l' in flags,
+ isexec='x' in flags,
+ copied=copied.get(path))
+ return mctx
+ except KeyError:
+ raise IOError
+ else:
+ ui.note(_('copying changeset %s to %s\n') % (old, base))
+
+ # Use version of files as in the old cset
+ def filectxfn(repo, ctx_, path):
+ try:
+ return old.filectx(path)
+ except KeyError:
+ raise IOError
+
+ # See if we got a message from -m or -l, if not, open the editor
+ # with the message of the changeset to amend
+ user = opts.get('user') or old.user()
+ date = opts.get('date') or old.date()
+ message = logmessage(ui, opts)
+ if not message:
+ cctx = context.workingctx(repo, old.description(), user, date,
+ extra,
+ repo.status(base.node(), old.node()))
+ message = commitforceeditor(repo, cctx, [])
+
+ new = context.memctx(repo,
+ parents=[base.node(), nullid],
+ text=message,
+ files=files,
+ filectxfn=filectxfn,
+ user=user,
+ date=date,
+ extra=extra)
+ newid = repo.commitctx(new)
+ if newid != old.node():
+ # Reroute the working copy parent to the new changeset
+ repo.setparents(newid, nullid)
+
+ # Move bookmarks from old parent to amend commit
+ bms = repo.nodebookmarks(old.node())
+ if bms:
+ for bm in bms:
+ repo._bookmarks[bm] = newid
+ bookmarks.write(repo)
+
+ # Strip the intermediate commit (if there was one) and the amended
+ # commit
+ lock = repo.lock()
+ try:
+ if node:
+ ui.note(_('stripping intermediate changeset %s\n') % ctx)
+ ui.note(_('stripping amended changeset %s\n') % old)
+ repair.strip(ui, repo, old.node(), topic='amend-backup')
+ finally:
+ lock.release()
+ finally:
+ wlock.release()
+ return newid
+
+def commiteditor(repo, ctx, subs):
+ if ctx.description():
+ return ctx.description()
+ return commitforceeditor(repo, ctx, subs)
+
+def commitforceeditor(repo, ctx, subs):
+ edittext = []
+ modified, added, removed = ctx.modified(), ctx.added(), ctx.removed()
+ if ctx.description():
+ edittext.append(ctx.description())
+ edittext.append("")
+ edittext.append("") # Empty line between message and comments.
+ edittext.append(_("HG: Enter commit message."
+ " Lines beginning with 'HG:' are removed."))
+ edittext.append(_("HG: Leave message empty to abort commit."))
+ edittext.append("HG: --")
+ edittext.append(_("HG: user: %s") % ctx.user())
+ if ctx.p2():
+ edittext.append(_("HG: branch merge"))
+ if ctx.branch():
+ edittext.append(_("HG: branch '%s'") % ctx.branch())
+ edittext.extend([_("HG: subrepo %s") % s for s in subs])
+ edittext.extend([_("HG: added %s") % f for f in added])
+ edittext.extend([_("HG: changed %s") % f for f in modified])
+ edittext.extend([_("HG: removed %s") % f for f in removed])
+ if not added and not modified and not removed:
+ edittext.append(_("HG: no files changed"))
+ edittext.append("")
+ # run editor in the repository root
+ olddir = os.getcwd()
+ os.chdir(repo.root)
+ text = repo.ui.edit("\n".join(edittext), ctx.user())
+ text = re.sub("(?m)^HG:.*(\n|$)", "", text)
+ os.chdir(olddir)
+
+ if not text.strip():
+ raise util.Abort(_("empty commit message"))
+
+ return text
+
+def revert(ui, repo, ctx, parents, *pats, **opts):
+ parent, p2 = parents
+ node = ctx.node()
+
+ mf = ctx.manifest()
+ if node == parent:
+ pmf = mf
+ else:
+ pmf = None
+
+ # need all matching names in dirstate and manifest of target rev,
+ # so have to walk both. do not print errors if files exist in one
+ # but not other.
+
+ names = {}
+
+ wlock = repo.wlock()
+ try:
+ # walk dirstate.
+
+ m = scmutil.match(repo[None], pats, opts)
+ m.bad = lambda x, y: False
+ for abs in repo.walk(m):
+ names[abs] = m.rel(abs), m.exact(abs)
+
+ # walk target manifest.
+
+ def badfn(path, msg):
+ if path in names:
+ return
+ if path in ctx.substate:
+ return
+ path_ = path + '/'
+ for f in names:
+ if f.startswith(path_):
+ return
+ ui.warn("%s: %s\n" % (m.rel(path), msg))
+
+ m = scmutil.match(ctx, pats, opts)
+ m.bad = badfn
+ for abs in ctx.walk(m):
+ if abs not in names:
+ names[abs] = m.rel(abs), m.exact(abs)
+
+ # get the list of subrepos that must be reverted
+ targetsubs = [s for s in ctx.substate if m(s)]
+ m = scmutil.matchfiles(repo, names)
+ changes = repo.status(match=m)[:4]
+ modified, added, removed, deleted = map(set, changes)
+
+ # if f is a rename, also revert the source
+ cwd = repo.getcwd()
+ for f in added:
+ src = repo.dirstate.copied(f)
+ if src and src not in names and repo.dirstate[src] == 'r':
+ removed.add(src)
+ names[src] = (repo.pathto(src, cwd), True)
+
+ def removeforget(abs):
+ if repo.dirstate[abs] == 'a':
+ return _('forgetting %s\n')
+ return _('removing %s\n')
+
+ revert = ([], _('reverting %s\n'))
+ add = ([], _('adding %s\n'))
+ remove = ([], removeforget)
+ undelete = ([], _('undeleting %s\n'))
+
+ disptable = (
+ # dispatch table:
+ # file state
+ # action if in target manifest
+ # action if not in target manifest
+ # make backup if in target manifest
+ # make backup if not in target manifest
+ (modified, revert, remove, True, True),
+ (added, revert, remove, True, False),
+ (removed, undelete, None, False, False),
+ (deleted, revert, remove, False, False),
+ )
+
+ for abs, (rel, exact) in sorted(names.items()):
+ mfentry = mf.get(abs)
+ target = repo.wjoin(abs)
+ def handle(xlist, dobackup):
+ xlist[0].append(abs)
+ if (dobackup and not opts.get('no_backup') and
+ os.path.lexists(target)):
+ bakname = "%s.orig" % rel
+ ui.note(_('saving current version of %s as %s\n') %
+ (rel, bakname))
+ if not opts.get('dry_run'):
+ util.rename(target, bakname)
+ if ui.verbose or not exact:
+ msg = xlist[1]
+ if not isinstance(msg, basestring):
+ msg = msg(abs)
+ ui.status(msg % rel)
+ for table, hitlist, misslist, backuphit, backupmiss in disptable:
+ if abs not in table:
+ continue
+ # file has changed in dirstate
+ if mfentry:
+ handle(hitlist, backuphit)
+ elif misslist is not None:
+ handle(misslist, backupmiss)
+ break
+ else:
+ if abs not in repo.dirstate:
+ if mfentry:
+ handle(add, True)
+ elif exact:
+ ui.warn(_('file not managed: %s\n') % rel)
+ continue
+ # file has not changed in dirstate
+ if node == parent:
+ if exact:
+ ui.warn(_('no changes needed to %s\n') % rel)
+ continue
+ if pmf is None:
+ # only need parent manifest in this unlikely case,
+ # so do not read by default
+ pmf = repo[parent].manifest()
+ if abs in pmf and mfentry:
+ # if version of file is same in parent and target
+ # manifests, do nothing
+ if (pmf[abs] != mfentry or
+ pmf.flags(abs) != mf.flags(abs)):
+ handle(revert, False)
+ else:
+ handle(remove, False)
+
+ if not opts.get('dry_run'):
+ def checkout(f):
+ fc = ctx[f]
+ repo.wwrite(f, fc.data(), fc.flags())
+
+ audit_path = scmutil.pathauditor(repo.root)
+ for f in remove[0]:
+ if repo.dirstate[f] == 'a':
+ repo.dirstate.drop(f)
+ continue
+ audit_path(f)
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError:
+ pass
+ repo.dirstate.remove(f)
+
+ normal = None
+ if node == parent:
+ # We're reverting to our parent. If possible, we'd like status
+ # to report the file as clean. We have to use normallookup for
+ # merges to avoid losing information about merged/dirty files.
+ if p2 != nullid:
+ normal = repo.dirstate.normallookup
+ else:
+ normal = repo.dirstate.normal
+ for f in revert[0]:
+ checkout(f)
+ if normal:
+ normal(f)
+
+ for f in add[0]:
+ checkout(f)
+ repo.dirstate.add(f)
+
+ normal = repo.dirstate.normallookup
+ if node == parent and p2 == nullid:
+ normal = repo.dirstate.normal
+ for f in undelete[0]:
+ checkout(f)
+ normal(f)
+
+ if targetsubs:
+ # Revert the subrepos on the revert list
+ for sub in targetsubs:
+ ctx.sub(sub).revert(ui, ctx.substate[sub], *pats, **opts)
+ finally:
+ wlock.release()
+
+def command(table):
+ '''returns a function object bound to table which can be used as
+ a decorator for populating table as a command table'''
+
+ def cmd(name, options, synopsis=None):
+ def decorator(func):
+ if synopsis:
+ table[name] = func, options[:], synopsis
+ else:
+ table[name] = func, options[:]
+ return func
+ return decorator
+
+ return cmd
diff --git a/mercurial/commands.py b/mercurial/commands.py
new file mode 100644
index 0000000..092da83
--- /dev/null
+++ b/mercurial/commands.py
@@ -0,0 +1,5895 @@
+# commands.py - command processing for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import hex, bin, nullid, nullrev, short
+from lock import release
+from i18n import _, gettext
+import os, re, difflib, time, tempfile, errno
+import hg, scmutil, util, revlog, extensions, copies, error, bookmarks
+import patch, help, url, encoding, templatekw, discovery
+import archival, changegroup, cmdutil, hbisect
+import sshserver, hgweb, hgweb.server, commandserver
+import merge as mergemod
+import minirst, revset, fileset
+import dagparser, context, simplemerge, graphmod
+import random, setdiscovery, treediscovery, dagutil, pvec, localrepo
+import phases, obsolete
+
+table = {}
+
+command = cmdutil.command(table)
+
+# common command options
+
+globalopts = [
+ ('R', 'repository', '',
+ _('repository root directory or name of overlay bundle file'),
+ _('REPO')),
+ ('', 'cwd', '',
+ _('change working directory'), _('DIR')),
+ ('y', 'noninteractive', None,
+ _('do not prompt, automatically pick the first choice for all prompts')),
+ ('q', 'quiet', None, _('suppress output')),
+ ('v', 'verbose', None, _('enable additional output')),
+ ('', 'config', [],
+ _('set/override config option (use \'section.name=value\')'),
+ _('CONFIG')),
+ ('', 'debug', None, _('enable debugging output')),
+ ('', 'debugger', None, _('start debugger')),
+ ('', 'encoding', encoding.encoding, _('set the charset encoding'),
+ _('ENCODE')),
+ ('', 'encodingmode', encoding.encodingmode,
+ _('set the charset encoding mode'), _('MODE')),
+ ('', 'traceback', None, _('always print a traceback on exception')),
+ ('', 'time', None, _('time how long the command takes')),
+ ('', 'profile', None, _('print command execution profile')),
+ ('', 'version', None, _('output version information and exit')),
+ ('h', 'help', None, _('display help and exit')),
+]
+
+dryrunopts = [('n', 'dry-run', None,
+ _('do not perform actions, just print output'))]
+
+remoteopts = [
+ ('e', 'ssh', '',
+ _('specify ssh command to use'), _('CMD')),
+ ('', 'remotecmd', '',
+ _('specify hg command to run on the remote side'), _('CMD')),
+ ('', 'insecure', None,
+ _('do not verify server certificate (ignoring web.cacerts config)')),
+]
+
+walkopts = [
+ ('I', 'include', [],
+ _('include names matching the given patterns'), _('PATTERN')),
+ ('X', 'exclude', [],
+ _('exclude names matching the given patterns'), _('PATTERN')),
+]
+
+commitopts = [
+ ('m', 'message', '',
+ _('use text as commit message'), _('TEXT')),
+ ('l', 'logfile', '',
+ _('read commit message from file'), _('FILE')),
+]
+
+commitopts2 = [
+ ('d', 'date', '',
+ _('record the specified date as commit date'), _('DATE')),
+ ('u', 'user', '',
+ _('record the specified user as committer'), _('USER')),
+]
+
+templateopts = [
+ ('', 'style', '',
+ _('display using template map file'), _('STYLE')),
+ ('', 'template', '',
+ _('display with template'), _('TEMPLATE')),
+]
+
+logopts = [
+ ('p', 'patch', None, _('show patch')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ('l', 'limit', '',
+ _('limit number of changes displayed'), _('NUM')),
+ ('M', 'no-merges', None, _('do not show merges')),
+ ('', 'stat', None, _('output diffstat-style summary of changes')),
+ ('G', 'graph', None, _("show the revision DAG")),
+] + templateopts
+
+diffopts = [
+ ('a', 'text', None, _('treat all files as text')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ('', 'nodates', None, _('omit dates from diff headers'))
+]
+
+diffwsopts = [
+ ('w', 'ignore-all-space', None,
+ _('ignore white space when comparing lines')),
+ ('b', 'ignore-space-change', None,
+ _('ignore changes in the amount of white space')),
+ ('B', 'ignore-blank-lines', None,
+ _('ignore changes whose lines are all blank')),
+ ]
+
+diffopts2 = [
+ ('p', 'show-function', None, _('show which function each change is in')),
+ ('', 'reverse', None, _('produce a diff that undoes the changes')),
+ ] + diffwsopts + [
+ ('U', 'unified', '',
+ _('number of lines of context to show'), _('NUM')),
+ ('', 'stat', None, _('output diffstat-style summary of changes')),
+]
+
+mergetoolopts = [
+ ('t', 'tool', '', _('specify merge tool')),
+]
+
+similarityopts = [
+ ('s', 'similarity', '',
+ _('guess renamed files by similarity (0<=s<=100)'), _('SIMILARITY'))
+]
+
+subrepoopts = [
+ ('S', 'subrepos', None,
+ _('recurse into subrepositories'))
+]
+
+# Commands start here, listed alphabetically
+
+@command('^add',
+ walkopts + subrepoopts + dryrunopts,
+ _('[OPTION]... [FILE]...'))
+def add(ui, repo, *pats, **opts):
+ """add the specified files on the next commit
+
+ Schedule files to be version controlled and added to the
+ repository.
+
+ The files will be added to the repository at the next commit. To
+ undo an add before that, see :hg:`forget`.
+
+ If no names are given, add all files to the repository.
+
+ .. container:: verbose
+
+ An example showing how new (unknown) files are added
+ automatically by :hg:`add`::
+
+ $ ls
+ foo.c
+ $ hg status
+ ? foo.c
+ $ hg add
+ adding foo.c
+ $ hg status
+ A foo.c
+
+ Returns 0 if all files are successfully added.
+ """
+
+ m = scmutil.match(repo[None], pats, opts)
+ rejected = cmdutil.add(ui, repo, m, opts.get('dry_run'),
+ opts.get('subrepos'), prefix="", explicitonly=False)
+ return rejected and 1 or 0
+
+@command('addremove',
+ similarityopts + walkopts + dryrunopts,
+ _('[OPTION]... [FILE]...'))
+def addremove(ui, repo, *pats, **opts):
+ """add all new files, delete all missing files
+
+ Add all new files and remove all missing files from the
+ repository.
+
+ New files are ignored if they match any of the patterns in
+ ``.hgignore``. As with add, these changes take effect at the next
+ commit.
+
+ Use the -s/--similarity option to detect renamed files. This
+ option takes a percentage between 0 (disabled) and 100 (files must
+ be identical) as its parameter. With a parameter greater than 0,
+ this compares every removed file with every added file and records
+ those similar enough as renames. Detecting renamed files this way
+ can be expensive. After using this option, :hg:`status -C` can be
+ used to check which files were identified as moved or renamed. If
+ not specified, -s/--similarity defaults to 100 and only renames of
+ identical files are detected.
+
+ Returns 0 if all files are successfully added.
+ """
+ try:
+ sim = float(opts.get('similarity') or 100)
+ except ValueError:
+ raise util.Abort(_('similarity must be a number'))
+ if sim < 0 or sim > 100:
+ raise util.Abort(_('similarity must be between 0 and 100'))
+ return scmutil.addremove(repo, pats, opts, similarity=sim / 100.0)
+
+@command('^annotate|blame',
+ [('r', 'rev', '', _('annotate the specified revision'), _('REV')),
+ ('', 'follow', None,
+ _('follow copies/renames and list the filename (DEPRECATED)')),
+ ('', 'no-follow', None, _("don't follow copies and renames")),
+ ('a', 'text', None, _('treat all files as text')),
+ ('u', 'user', None, _('list the author (long with -v)')),
+ ('f', 'file', None, _('list the filename')),
+ ('d', 'date', None, _('list the date (short with -q)')),
+ ('n', 'number', None, _('list the revision number (default)')),
+ ('c', 'changeset', None, _('list the changeset')),
+ ('l', 'line-number', None, _('show line number at the first appearance'))
+ ] + diffwsopts + walkopts,
+ _('[-r REV] [-f] [-a] [-u] [-d] [-n] [-c] [-l] FILE...'))
+def annotate(ui, repo, *pats, **opts):
+ """show changeset information by line for each file
+
+ List changes in files, showing the revision id responsible for
+ each line
+
+ This command is useful for discovering when a change was made and
+ by whom.
+
+ Without the -a/--text option, annotate will avoid processing files
+ it detects as binary. With -a, annotate will annotate the file
+ anyway, although the results will probably be neither useful
+ nor desirable.
+
+ Returns 0 on success.
+ """
+ if opts.get('follow'):
+ # --follow is deprecated and now just an alias for -f/--file
+ # to mimic the behavior of Mercurial before version 1.5
+ opts['file'] = True
+
+ datefunc = ui.quiet and util.shortdate or util.datestr
+ getdate = util.cachefunc(lambda x: datefunc(x[0].date()))
+
+ if not pats:
+ raise util.Abort(_('at least one filename or pattern is required'))
+
+ hexfn = ui.debugflag and hex or short
+
+ opmap = [('user', ' ', lambda x: ui.shortuser(x[0].user())),
+ ('number', ' ', lambda x: str(x[0].rev())),
+ ('changeset', ' ', lambda x: hexfn(x[0].node())),
+ ('date', ' ', getdate),
+ ('file', ' ', lambda x: x[0].path()),
+ ('line_number', ':', lambda x: str(x[1])),
+ ]
+
+ if (not opts.get('user') and not opts.get('changeset')
+ and not opts.get('date') and not opts.get('file')):
+ opts['number'] = True
+
+ linenumber = opts.get('line_number') is not None
+ if linenumber and (not opts.get('changeset')) and (not opts.get('number')):
+ raise util.Abort(_('at least one of -n/-c is required for -l'))
+
+ funcmap = [(func, sep) for op, sep, func in opmap if opts.get(op)]
+ funcmap[0] = (funcmap[0][0], '') # no separator in front of first column
+
+ def bad(x, y):
+ raise util.Abort("%s: %s" % (x, y))
+
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ m = scmutil.match(ctx, pats, opts)
+ m.bad = bad
+ follow = not opts.get('no_follow')
+ diffopts = patch.diffopts(ui, opts, section='annotate')
+ for abs in ctx.walk(m):
+ fctx = ctx[abs]
+ if not opts.get('text') and util.binary(fctx.data()):
+ ui.write(_("%s: binary file\n") % ((pats and m.rel(abs)) or abs))
+ continue
+
+ lines = fctx.annotate(follow=follow, linenumber=linenumber,
+ diffopts=diffopts)
+ pieces = []
+
+ for f, sep in funcmap:
+ l = [f(n) for n, dummy in lines]
+ if l:
+ sized = [(x, encoding.colwidth(x)) for x in l]
+ ml = max([w for x, w in sized])
+ pieces.append(["%s%s%s" % (sep, ' ' * (ml - w), x)
+ for x, w in sized])
+
+ if pieces:
+ for p, l in zip(zip(*pieces), lines):
+ ui.write("%s: %s" % ("".join(p), l[1]))
+
+ if lines and not lines[-1][1].endswith('\n'):
+ ui.write('\n')
+
+@command('archive',
+ [('', 'no-decode', None, _('do not pass files through decoders')),
+ ('p', 'prefix', '', _('directory prefix for files in archive'),
+ _('PREFIX')),
+ ('r', 'rev', '', _('revision to distribute'), _('REV')),
+ ('t', 'type', '', _('type of distribution to create'), _('TYPE')),
+ ] + subrepoopts + walkopts,
+ _('[OPTION]... DEST'))
+def archive(ui, repo, dest, **opts):
+ '''create an unversioned archive of a repository revision
+
+ By default, the revision used is the parent of the working
+ directory; use -r/--rev to specify a different revision.
+
+ The archive type is automatically detected based on file
+ extension (or override using -t/--type).
+
+ .. container:: verbose
+
+ Examples:
+
+ - create a zip file containing the 1.0 release::
+
+ hg archive -r 1.0 project-1.0.zip
+
+ - create a tarball excluding .hg files::
+
+ hg archive project.tar.gz -X ".hg*"
+
+ Valid types are:
+
+ :``files``: a directory full of files (default)
+ :``tar``: tar archive, uncompressed
+ :``tbz2``: tar archive, compressed using bzip2
+ :``tgz``: tar archive, compressed using gzip
+ :``uzip``: zip archive, uncompressed
+ :``zip``: zip archive, compressed using deflate
+
+ The exact name of the destination archive or directory is given
+ using a format string; see :hg:`help export` for details.
+
+ Each member added to an archive file has a directory prefix
+ prepended. Use -p/--prefix to specify a format string for the
+ prefix. The default is the basename of the archive, with suffixes
+ removed.
+
+ Returns 0 on success.
+ '''
+
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ if not ctx:
+ raise util.Abort(_('no working directory: please specify a revision'))
+ node = ctx.node()
+ dest = cmdutil.makefilename(repo, dest, node)
+ if os.path.realpath(dest) == repo.root:
+ raise util.Abort(_('repository root cannot be destination'))
+
+ kind = opts.get('type') or archival.guesskind(dest) or 'files'
+ prefix = opts.get('prefix')
+
+ if dest == '-':
+ if kind == 'files':
+ raise util.Abort(_('cannot archive plain files to stdout'))
+ dest = cmdutil.makefileobj(repo, dest)
+ if not prefix:
+ prefix = os.path.basename(repo.root) + '-%h'
+
+ prefix = cmdutil.makefilename(repo, prefix, node)
+ matchfn = scmutil.match(ctx, [], opts)
+ archival.archive(repo, dest, node, kind, not opts.get('no_decode'),
+ matchfn, prefix, subrepos=opts.get('subrepos'))
+
+@command('backout',
+ [('', 'merge', None, _('merge with old dirstate parent after backout')),
+ ('', 'parent', '',
+ _('parent to choose when backing out merge (DEPRECATED)'), _('REV')),
+ ('r', 'rev', '', _('revision to backout'), _('REV')),
+ ] + mergetoolopts + walkopts + commitopts + commitopts2,
+ _('[OPTION]... [-r] REV'))
+def backout(ui, repo, node=None, rev=None, **opts):
+ '''reverse effect of earlier changeset
+
+ Prepare a new changeset with the effect of REV undone in the
+ current working directory.
+
+ If REV is the parent of the working directory, then this new changeset
+ is committed automatically. Otherwise, hg needs to merge the
+ changes and the merged result is left uncommitted.
+
+ .. note::
+ backout cannot be used to fix either an unwanted or
+ incorrect merge.
+
+ .. container:: verbose
+
+ By default, the pending changeset will have one parent,
+ maintaining a linear history. With --merge, the pending
+ changeset will instead have two parents: the old parent of the
+ working directory and a new child of REV that simply undoes REV.
+
+ Before version 1.7, the behavior without --merge was equivalent
+ to specifying --merge followed by :hg:`update --clean .` to
+ cancel the merge and leave the child of REV as a head to be
+ merged separately.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Returns 0 on success.
+ '''
+ if rev and node:
+ raise util.Abort(_("please specify just one revision"))
+
+ if not rev:
+ rev = node
+
+ if not rev:
+ raise util.Abort(_("please specify a revision to backout"))
+
+ date = opts.get('date')
+ if date:
+ opts['date'] = util.parsedate(date)
+
+ cmdutil.bailifchanged(repo)
+ node = scmutil.revsingle(repo, rev).node()
+
+ op1, op2 = repo.dirstate.parents()
+ a = repo.changelog.ancestor(op1, node)
+ if a != node:
+ raise util.Abort(_('cannot backout change on a different branch'))
+
+ p1, p2 = repo.changelog.parents(node)
+ if p1 == nullid:
+ raise util.Abort(_('cannot backout a change with no parents'))
+ if p2 != nullid:
+ if not opts.get('parent'):
+ raise util.Abort(_('cannot backout a merge changeset'))
+ p = repo.lookup(opts['parent'])
+ if p not in (p1, p2):
+ raise util.Abort(_('%s is not a parent of %s') %
+ (short(p), short(node)))
+ parent = p
+ else:
+ if opts.get('parent'):
+ raise util.Abort(_('cannot use --parent on non-merge changeset'))
+ parent = p1
+
+ # the backout should appear on the same branch
+ wlock = repo.wlock()
+ try:
+ branch = repo.dirstate.branch()
+ hg.clean(repo, node, show_stats=False)
+ repo.dirstate.setbranch(branch)
+ revert_opts = opts.copy()
+ revert_opts['date'] = None
+ revert_opts['all'] = True
+ revert_opts['rev'] = hex(parent)
+ revert_opts['no_backup'] = None
+ revert(ui, repo, **revert_opts)
+ if not opts.get('merge') and op1 != node:
+ try:
+ ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ return hg.update(repo, op1)
+ finally:
+ ui.setconfig('ui', 'forcemerge', '')
+
+ commit_opts = opts.copy()
+ commit_opts['addremove'] = False
+ if not commit_opts['message'] and not commit_opts['logfile']:
+ # we don't translate commit messages
+ commit_opts['message'] = "Backed out changeset %s" % short(node)
+ commit_opts['force_editor'] = True
+ commit(ui, repo, **commit_opts)
+ def nice(node):
+ return '%d:%s' % (repo.changelog.rev(node), short(node))
+ ui.status(_('changeset %s backs out changeset %s\n') %
+ (nice(repo.changelog.tip()), nice(node)))
+ if opts.get('merge') and op1 != node:
+ hg.clean(repo, op1, show_stats=False)
+ ui.status(_('merging with changeset %s\n')
+ % nice(repo.changelog.tip()))
+ try:
+ ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ return hg.merge(repo, hex(repo.changelog.tip()))
+ finally:
+ ui.setconfig('ui', 'forcemerge', '')
+ finally:
+ wlock.release()
+ return 0
+
+@command('bisect',
+ [('r', 'reset', False, _('reset bisect state')),
+ ('g', 'good', False, _('mark changeset good')),
+ ('b', 'bad', False, _('mark changeset bad')),
+ ('s', 'skip', False, _('skip testing changeset')),
+ ('e', 'extend', False, _('extend the bisect range')),
+ ('c', 'command', '', _('use command to check changeset state'), _('CMD')),
+ ('U', 'noupdate', False, _('do not update to target'))],
+ _("[-gbsr] [-U] [-c CMD] [REV]"))
+def bisect(ui, repo, rev=None, extra=None, command=None,
+ reset=None, good=None, bad=None, skip=None, extend=None,
+ noupdate=None):
+ """subdivision search of changesets
+
+ This command helps to find changesets which introduce problems. To
+ use, mark the earliest changeset you know exhibits the problem as
+ bad, then mark the latest changeset which is free from the problem
+ as good. Bisect will update your working directory to a revision
+ for testing (unless the -U/--noupdate option is specified). Once
+ you have performed tests, mark the working directory as good or
+ bad, and bisect will either update to another candidate changeset
+ or announce that it has found the bad revision.
+
+ As a shortcut, you can also use the revision argument to mark a
+ revision as good or bad without checking it out first.
+
+ If you supply a command, it will be used for automatic bisection.
+ The environment variable HG_NODE will contain the ID of the
+ changeset being tested. The exit status of the command will be
+ used to mark revisions as good or bad: status 0 means good, 125
+ means to skip the revision, 127 (command not found) will abort the
+ bisection, and any other non-zero exit status means the revision
+ is bad.
+
+ .. container:: verbose
+
+ Some examples:
+
+ - start a bisection with known bad revision 12, and good revision 34::
+
+ hg bisect --bad 34
+ hg bisect --good 12
+
+ - advance the current bisection by marking current revision as good or
+ bad::
+
+ hg bisect --good
+ hg bisect --bad
+
+ - mark the current revision, or a known revision, to be skipped (eg. if
+ that revision is not usable because of another issue)::
+
+ hg bisect --skip
+ hg bisect --skip 23
+
+ - forget the current bisection::
+
+ hg bisect --reset
+
+ - use 'make && make tests' to automatically find the first broken
+ revision::
+
+ hg bisect --reset
+ hg bisect --bad 34
+ hg bisect --good 12
+ hg bisect --command 'make && make tests'
+
+ - see all changesets whose states are already known in the current
+ bisection::
+
+ hg log -r "bisect(pruned)"
+
+ - see the changeset currently being bisected (especially useful
+ if running with -U/--noupdate)::
+
+ hg log -r "bisect(current)"
+
+ - see all changesets that took part in the current bisection::
+
+ hg log -r "bisect(range)"
+
+ - with the graphlog extension, you can even get a nice graph::
+
+ hg log --graph -r "bisect(range)"
+
+ See :hg:`help revsets` for more about the `bisect()` keyword.
+
+ Returns 0 on success.
+ """
+ def extendbisectrange(nodes, good):
+ # bisect is incomplete when it ends on a merge node and
+ # one of the parent was not checked.
+ parents = repo[nodes[0]].parents()
+ if len(parents) > 1:
+ side = good and state['bad'] or state['good']
+ num = len(set(i.node() for i in parents) & set(side))
+ if num == 1:
+ return parents[0].ancestor(parents[1])
+ return None
+
+ def print_result(nodes, good):
+ displayer = cmdutil.show_changeset(ui, repo, {})
+ if len(nodes) == 1:
+ # narrowed it down to a single revision
+ if good:
+ ui.write(_("The first good revision is:\n"))
+ else:
+ ui.write(_("The first bad revision is:\n"))
+ displayer.show(repo[nodes[0]])
+ extendnode = extendbisectrange(nodes, good)
+ if extendnode is not None:
+ ui.write(_('Not all ancestors of this changeset have been'
+ ' checked.\nUse bisect --extend to continue the '
+ 'bisection from\nthe common ancestor, %s.\n')
+ % extendnode)
+ else:
+ # multiple possible revisions
+ if good:
+ ui.write(_("Due to skipped revisions, the first "
+ "good revision could be any of:\n"))
+ else:
+ ui.write(_("Due to skipped revisions, the first "
+ "bad revision could be any of:\n"))
+ for n in nodes:
+ displayer.show(repo[n])
+ displayer.close()
+
+ def check_state(state, interactive=True):
+ if not state['good'] or not state['bad']:
+ if (good or bad or skip or reset) and interactive:
+ return
+ if not state['good']:
+ raise util.Abort(_('cannot bisect (no known good revisions)'))
+ else:
+ raise util.Abort(_('cannot bisect (no known bad revisions)'))
+ return True
+
+ # backward compatibility
+ if rev in "good bad reset init".split():
+ ui.warn(_("(use of 'hg bisect <cmd>' is deprecated)\n"))
+ cmd, rev, extra = rev, extra, None
+ if cmd == "good":
+ good = True
+ elif cmd == "bad":
+ bad = True
+ else:
+ reset = True
+ elif extra or good + bad + skip + reset + extend + bool(command) > 1:
+ raise util.Abort(_('incompatible arguments'))
+
+ if reset:
+ p = repo.join("bisect.state")
+ if os.path.exists(p):
+ os.unlink(p)
+ return
+
+ state = hbisect.load_state(repo)
+
+ if command:
+ changesets = 1
+ try:
+ node = state['current'][0]
+ except LookupError:
+ if noupdate:
+ raise util.Abort(_('current bisect revision is unknown - '
+ 'start a new bisect to fix'))
+ node, p2 = repo.dirstate.parents()
+ if p2 != nullid:
+ raise util.Abort(_('current bisect revision is a merge'))
+ try:
+ while changesets:
+ # update state
+ state['current'] = [node]
+ hbisect.save_state(repo, state)
+ status = util.system(command,
+ environ={'HG_NODE': hex(node)},
+ out=ui.fout)
+ if status == 125:
+ transition = "skip"
+ elif status == 0:
+ transition = "good"
+ # status < 0 means process was killed
+ elif status == 127:
+ raise util.Abort(_("failed to execute %s") % command)
+ elif status < 0:
+ raise util.Abort(_("%s killed") % command)
+ else:
+ transition = "bad"
+ ctx = scmutil.revsingle(repo, rev, node)
+ rev = None # clear for future iterations
+ state[transition].append(ctx.node())
+ ui.status(_('changeset %d:%s: %s\n') % (ctx, ctx, transition))
+ check_state(state, interactive=False)
+ # bisect
+ nodes, changesets, good = hbisect.bisect(repo.changelog, state)
+ # update to next check
+ node = nodes[0]
+ if not noupdate:
+ cmdutil.bailifchanged(repo)
+ hg.clean(repo, node, show_stats=False)
+ finally:
+ state['current'] = [node]
+ hbisect.save_state(repo, state)
+ print_result(nodes, good)
+ return
+
+ # update state
+
+ if rev:
+ nodes = [repo.lookup(i) for i in scmutil.revrange(repo, [rev])]
+ else:
+ nodes = [repo.lookup('.')]
+
+ if good or bad or skip:
+ if good:
+ state['good'] += nodes
+ elif bad:
+ state['bad'] += nodes
+ elif skip:
+ state['skip'] += nodes
+ hbisect.save_state(repo, state)
+
+ if not check_state(state):
+ return
+
+ # actually bisect
+ nodes, changesets, good = hbisect.bisect(repo.changelog, state)
+ if extend:
+ if not changesets:
+ extendnode = extendbisectrange(nodes, good)
+ if extendnode is not None:
+ ui.write(_("Extending search to changeset %d:%s\n"
+ % (extendnode.rev(), extendnode)))
+ state['current'] = [extendnode.node()]
+ hbisect.save_state(repo, state)
+ if noupdate:
+ return
+ cmdutil.bailifchanged(repo)
+ return hg.clean(repo, extendnode.node())
+ raise util.Abort(_("nothing to extend"))
+
+ if changesets == 0:
+ print_result(nodes, good)
+ else:
+ assert len(nodes) == 1 # only a single node can be tested next
+ node = nodes[0]
+ # compute the approximate number of remaining tests
+ tests, size = 0, 2
+ while size <= changesets:
+ tests, size = tests + 1, size * 2
+ rev = repo.changelog.rev(node)
+ ui.write(_("Testing changeset %d:%s "
+ "(%d changesets remaining, ~%d tests)\n")
+ % (rev, short(node), changesets, tests))
+ state['current'] = [node]
+ hbisect.save_state(repo, state)
+ if not noupdate:
+ cmdutil.bailifchanged(repo)
+ return hg.clean(repo, node)
+
+@command('bookmarks',
+ [('f', 'force', False, _('force')),
+ ('r', 'rev', '', _('revision'), _('REV')),
+ ('d', 'delete', False, _('delete a given bookmark')),
+ ('m', 'rename', '', _('rename a given bookmark'), _('NAME')),
+ ('i', 'inactive', False, _('mark a bookmark inactive'))],
+ _('hg bookmarks [-f] [-d] [-i] [-m NAME] [-r REV] [NAME]'))
+def bookmark(ui, repo, mark=None, rev=None, force=False, delete=False,
+ rename=None, inactive=False):
+ '''track a line of development with movable markers
+
+ Bookmarks are pointers to certain commits that move when committing.
+ Bookmarks are local. They can be renamed, copied and deleted. It is
+ possible to use :hg:`merge NAME` to merge from a given bookmark, and
+ :hg:`update NAME` to update to a given bookmark.
+
+ You can use :hg:`bookmark NAME` to set a bookmark on the working
+ directory's parent revision with the given name. If you specify
+ a revision using -r REV (where REV may be an existing bookmark),
+ the bookmark is assigned to that revision.
+
+ Bookmarks can be pushed and pulled between repositories (see :hg:`help
+ push` and :hg:`help pull`). This requires both the local and remote
+ repositories to support bookmarks. For versions prior to 1.8, this means
+ the bookmarks extension must be enabled.
+
+ With -i/--inactive, the new bookmark will not be made the active
+ bookmark. If -r/--rev is given, the new bookmark will not be made
+ active even if -i/--inactive is not given. If no NAME is given, the
+ current active bookmark will be marked inactive.
+ '''
+ hexfn = ui.debugflag and hex or short
+ marks = repo._bookmarks
+ cur = repo.changectx('.').node()
+
+ if delete:
+ if mark is None:
+ raise util.Abort(_("bookmark name required"))
+ if mark not in marks:
+ raise util.Abort(_("bookmark '%s' does not exist") % mark)
+ if mark == repo._bookmarkcurrent:
+ bookmarks.setcurrent(repo, None)
+ del marks[mark]
+ bookmarks.write(repo)
+ return
+
+ if rename:
+ if rename not in marks:
+ raise util.Abort(_("bookmark '%s' does not exist") % rename)
+ if mark in marks and not force:
+ raise util.Abort(_("bookmark '%s' already exists "
+ "(use -f to force)") % mark)
+ if mark is None:
+ raise util.Abort(_("new bookmark name required"))
+ marks[mark] = marks[rename]
+ if repo._bookmarkcurrent == rename and not inactive:
+ bookmarks.setcurrent(repo, mark)
+ del marks[rename]
+ bookmarks.write(repo)
+ return
+
+ if mark is not None:
+ if "\n" in mark:
+ raise util.Abort(_("bookmark name cannot contain newlines"))
+ mark = mark.strip()
+ if not mark:
+ raise util.Abort(_("bookmark names cannot consist entirely of "
+ "whitespace"))
+ if inactive and mark == repo._bookmarkcurrent:
+ bookmarks.setcurrent(repo, None)
+ return
+ if mark in marks and not force:
+ raise util.Abort(_("bookmark '%s' already exists "
+ "(use -f to force)") % mark)
+ if ((mark in repo.branchmap() or mark == repo.dirstate.branch())
+ and not force):
+ raise util.Abort(
+ _("a bookmark cannot have the name of an existing branch"))
+ if rev:
+ marks[mark] = repo.lookup(rev)
+ else:
+ marks[mark] = cur
+ if not inactive and cur == marks[mark]:
+ bookmarks.setcurrent(repo, mark)
+ bookmarks.write(repo)
+ return
+
+ if mark is None:
+ if rev:
+ raise util.Abort(_("bookmark name required"))
+ if len(marks) == 0:
+ ui.status(_("no bookmarks set\n"))
+ else:
+ for bmark, n in sorted(marks.iteritems()):
+ current = repo._bookmarkcurrent
+ if bmark == current and n == cur:
+ prefix, label = '*', 'bookmarks.current'
+ else:
+ prefix, label = ' ', ''
+
+ if ui.quiet:
+ ui.write("%s\n" % bmark, label=label)
+ else:
+ ui.write(" %s %-25s %d:%s\n" % (
+ prefix, bmark, repo.changelog.rev(n), hexfn(n)),
+ label=label)
+ return
+
+@command('branch',
+ [('f', 'force', None,
+ _('set branch name even if it shadows an existing branch')),
+ ('C', 'clean', None, _('reset branch name to parent branch name'))],
+ _('[-fC] [NAME]'))
+def branch(ui, repo, label=None, **opts):
+ """set or show the current branch name
+
+ .. note::
+ Branch names are permanent and global. Use :hg:`bookmark` to create a
+ light-weight bookmark instead. See :hg:`help glossary` for more
+ information about named branches and bookmarks.
+
+ With no argument, show the current branch name. With one argument,
+ set the working directory branch name (the branch will not exist
+ in the repository until the next commit). Standard practice
+ recommends that primary development take place on the 'default'
+ branch.
+
+ Unless -f/--force is specified, branch will not let you set a
+ branch name that already exists, even if it's inactive.
+
+ Use -C/--clean to reset the working directory branch to that of
+ the parent of the working directory, negating a previous branch
+ change.
+
+ Use the command :hg:`update` to switch to an existing branch. Use
+ :hg:`commit --close-branch` to mark this branch as closed.
+
+ Returns 0 on success.
+ """
+ if not opts.get('clean') and not label:
+ ui.write("%s\n" % repo.dirstate.branch())
+ return
+
+ wlock = repo.wlock()
+ try:
+ if opts.get('clean'):
+ label = repo[None].p1().branch()
+ repo.dirstate.setbranch(label)
+ ui.status(_('reset working directory to branch %s\n') % label)
+ elif label:
+ if not opts.get('force') and label in repo.branchmap():
+ if label not in [p.branch() for p in repo.parents()]:
+ raise util.Abort(_('a branch of the same name already'
+ ' exists'),
+ # i18n: "it" refers to an existing branch
+ hint=_("use 'hg update' to switch to it"))
+ repo.dirstate.setbranch(label)
+ ui.status(_('marked working directory as branch %s\n') % label)
+ ui.status(_('(branches are permanent and global, '
+ 'did you want a bookmark?)\n'))
+ finally:
+ wlock.release()
+
+@command('branches',
+ [('a', 'active', False, _('show only branches that have unmerged heads')),
+ ('c', 'closed', False, _('show normal and closed branches'))],
+ _('[-ac]'))
+def branches(ui, repo, active=False, closed=False):
+ """list repository named branches
+
+ List the repository's named branches, indicating which ones are
+ inactive. If -c/--closed is specified, also list branches which have
+ been marked closed (see :hg:`commit --close-branch`).
+
+ If -a/--active is specified, only show active branches. A branch
+ is considered active if it contains repository heads.
+
+ Use the command :hg:`update` to switch to an existing branch.
+
+ Returns 0.
+ """
+
+ hexfunc = ui.debugflag and hex or short
+
+ activebranches = set([repo[n].branch() for n in repo.heads()])
+ branches = []
+ for tag, heads in repo.branchmap().iteritems():
+ for h in reversed(heads):
+ ctx = repo[h]
+ isopen = not ctx.closesbranch()
+ if isopen:
+ tip = ctx
+ break
+ else:
+ tip = repo[heads[-1]]
+ isactive = tag in activebranches and isopen
+ branches.append((tip, isactive, isopen))
+ branches.sort(key=lambda i: (i[1], i[0].rev(), i[0].branch(), i[2]),
+ reverse=True)
+
+ for ctx, isactive, isopen in branches:
+ if (not active) or isactive:
+ if isactive:
+ label = 'branches.active'
+ notice = ''
+ elif not isopen:
+ if not closed:
+ continue
+ label = 'branches.closed'
+ notice = _(' (closed)')
+ else:
+ label = 'branches.inactive'
+ notice = _(' (inactive)')
+ if ctx.branch() == repo.dirstate.branch():
+ label = 'branches.current'
+ rev = str(ctx.rev()).rjust(31 - encoding.colwidth(ctx.branch()))
+ rev = ui.label('%s:%s' % (rev, hexfunc(ctx.node())),
+ 'log.changeset')
+ tag = ui.label(ctx.branch(), label)
+ if ui.quiet:
+ ui.write("%s\n" % tag)
+ else:
+ ui.write("%s %s%s\n" % (tag, rev, notice))
+
+@command('bundle',
+ [('f', 'force', None, _('run even when the destination is unrelated')),
+ ('r', 'rev', [], _('a changeset intended to be added to the destination'),
+ _('REV')),
+ ('b', 'branch', [], _('a specific branch you would like to bundle'),
+ _('BRANCH')),
+ ('', 'base', [],
+ _('a base changeset assumed to be available at the destination'),
+ _('REV')),
+ ('a', 'all', None, _('bundle all changesets in the repository')),
+ ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE')),
+ ] + remoteopts,
+ _('[-f] [-t TYPE] [-a] [-r REV]... [--base REV]... FILE [DEST]'))
+def bundle(ui, repo, fname, dest=None, **opts):
+ """create a changegroup file
+
+ Generate a compressed changegroup file collecting changesets not
+ known to be in another repository.
+
+ If you omit the destination repository, then hg assumes the
+ destination will have all the nodes you specify with --base
+ parameters. To create a bundle containing all changesets, use
+ -a/--all (or --base null).
+
+ You can change compression method with the -t/--type option.
+ The available compression methods are: none, bzip2, and
+ gzip (by default, bundles are compressed using bzip2).
+
+ The bundle file can then be transferred using conventional means
+ and applied to another repository with the unbundle or pull
+ command. This is useful when direct push and pull are not
+ available or when exporting an entire repository is undesirable.
+
+ Applying bundles preserves all changeset contents including
+ permissions, copy/rename information, and revision history.
+
+ Returns 0 on success, 1 if no changes found.
+ """
+ revs = None
+ if 'rev' in opts:
+ revs = scmutil.revrange(repo, opts['rev'])
+
+ bundletype = opts.get('type', 'bzip2').lower()
+ btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
+ bundletype = btypes.get(bundletype)
+ if bundletype not in changegroup.bundletypes:
+ raise util.Abort(_('unknown bundle type specified with --type'))
+
+ if opts.get('all'):
+ base = ['null']
+ else:
+ base = scmutil.revrange(repo, opts.get('base'))
+ if base:
+ if dest:
+ raise util.Abort(_("--base is incompatible with specifying "
+ "a destination"))
+ common = [repo.lookup(rev) for rev in base]
+ heads = revs and map(repo.lookup, revs) or revs
+ cg = repo.getbundle('bundle', heads=heads, common=common)
+ outgoing = None
+ else:
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = hg.parseurl(dest, opts.get('branch'))
+ other = hg.peer(repo, opts, dest)
+ revs, checkout = hg.addbranchrevs(repo, other, branches, revs)
+ heads = revs and map(repo.lookup, revs) or revs
+ outgoing = discovery.findcommonoutgoing(repo, other,
+ onlyheads=heads,
+ force=opts.get('force'),
+ portable=True)
+ cg = repo.getlocalbundle('bundle', outgoing)
+ if not cg:
+ scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded)
+ return 1
+
+ changegroup.writebundle(cg, fname, bundletype)
+
+@command('cat',
+ [('o', 'output', '',
+ _('print output to file with formatted name'), _('FORMAT')),
+ ('r', 'rev', '', _('print the given revision'), _('REV')),
+ ('', 'decode', None, _('apply any matching decode filter')),
+ ] + walkopts,
+ _('[OPTION]... FILE...'))
+def cat(ui, repo, file1, *pats, **opts):
+ """output the current or given revision of files
+
+ Print the specified files as they were at the given revision. If
+ no revision is given, the parent of the working directory is used,
+ or tip if no revision is checked out.
+
+ Output may be to a file, in which case the name of the file is
+ given using a format string. The formatting rules are the same as
+ for the export command, with the following additions:
+
+ :``%s``: basename of file being printed
+ :``%d``: dirname of file being printed, or '.' if in repository root
+ :``%p``: root-relative path name of file being printed
+
+ Returns 0 on success.
+ """
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ err = 1
+ m = scmutil.match(ctx, (file1,) + pats, opts)
+ for abs in ctx.walk(m):
+ fp = cmdutil.makefileobj(repo, opts.get('output'), ctx.node(),
+ pathname=abs)
+ data = ctx[abs].data()
+ if opts.get('decode'):
+ data = repo.wwritedata(abs, data)
+ fp.write(data)
+ fp.close()
+ err = 0
+ return err
+
+@command('^clone',
+ [('U', 'noupdate', None,
+ _('the clone will include an empty working copy (only a repository)')),
+ ('u', 'updaterev', '', _('revision, tag or branch to check out'), _('REV')),
+ ('r', 'rev', [], _('include the specified changeset'), _('REV')),
+ ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
+ ('', 'pull', None, _('use pull protocol to copy metadata')),
+ ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
+ ] + remoteopts,
+ _('[OPTION]... SOURCE [DEST]'))
+def clone(ui, source, dest=None, **opts):
+ """make a copy of an existing repository
+
+ Create a copy of an existing repository in a new directory.
+
+ If no destination directory name is specified, it defaults to the
+ basename of the source.
+
+ The location of the source is added to the new repository's
+ ``.hg/hgrc`` file, as the default to be used for future pulls.
+
+ Only local paths and ``ssh://`` URLs are supported as
+ destinations. For ``ssh://`` destinations, no working directory or
+ ``.hg/hgrc`` will be created on the remote side.
+
+ To pull only a subset of changesets, specify one or more revisions
+ identifiers with -r/--rev or branches with -b/--branch. The
+ resulting clone will contain only the specified changesets and
+ their ancestors. These options (or 'clone src#rev dest') imply
+ --pull, even for local source repositories. Note that specifying a
+ tag will include the tagged changeset but not the changeset
+ containing the tag.
+
+ To check out a particular version, use -u/--update, or
+ -U/--noupdate to create a clone with no working directory.
+
+ .. container:: verbose
+
+ For efficiency, hardlinks are used for cloning whenever the
+ source and destination are on the same filesystem (note this
+ applies only to the repository data, not to the working
+ directory). Some filesystems, such as AFS, implement hardlinking
+ incorrectly, but do not report errors. In these cases, use the
+ --pull option to avoid hardlinking.
+
+ In some cases, you can clone repositories and the working
+ directory using full hardlinks with ::
+
+ $ cp -al REPO REPOCLONE
+
+ This is the fastest way to clone, but it is not always safe. The
+ operation is not atomic (making sure REPO is not modified during
+ the operation is up to you) and you have to make sure your
+ editor breaks hardlinks (Emacs and most Linux Kernel tools do
+ so). Also, this is not compatible with certain extensions that
+ place their metadata under the .hg directory, such as mq.
+
+ Mercurial will update the working directory to the first applicable
+ revision from this list:
+
+ a) null if -U or the source repository has no changesets
+ b) if -u . and the source repository is local, the first parent of
+ the source repository's working directory
+ c) the changeset specified with -u (if a branch name, this means the
+ latest head of that branch)
+ d) the changeset specified with -r
+ e) the tipmost head specified with -b
+ f) the tipmost head specified with the url#branch source syntax
+ g) the tipmost head of the default branch
+ h) tip
+
+ Examples:
+
+ - clone a remote repository to a new directory named hg/::
+
+ hg clone http://selenic.com/hg
+
+ - create a lightweight local clone::
+
+ hg clone project/ project-feature/
+
+ - clone from an absolute path on an ssh server (note double-slash)::
+
+ hg clone ssh://user@server//home/projects/alpha/
+
+ - do a high-speed clone over a LAN while checking out a
+ specified version::
+
+ hg clone --uncompressed http://server/repo -u 1.5
+
+ - create a repository without changesets after a particular revision::
+
+ hg clone -r 04e544 experimental/ good/
+
+ - clone (and track) a particular named branch::
+
+ hg clone http://selenic.com/hg#stable
+
+ See :hg:`help urls` for details on specifying URLs.
+
+ Returns 0 on success.
+ """
+ if opts.get('noupdate') and opts.get('updaterev'):
+ raise util.Abort(_("cannot specify both --noupdate and --updaterev"))
+
+ r = hg.clone(ui, opts, source, dest,
+ pull=opts.get('pull'),
+ stream=opts.get('uncompressed'),
+ rev=opts.get('rev'),
+ update=opts.get('updaterev') or not opts.get('noupdate'),
+ branch=opts.get('branch'))
+
+ return r is None
+
+@command('^commit|ci',
+ [('A', 'addremove', None,
+ _('mark new/missing files as added/removed before committing')),
+ ('', 'close-branch', None,
+ _('mark a branch as closed, hiding it from the branch list')),
+ ('', 'amend', None, _('amend the parent of the working dir')),
+ ] + walkopts + commitopts + commitopts2 + subrepoopts,
+ _('[OPTION]... [FILE]...'))
+def commit(ui, repo, *pats, **opts):
+ """commit the specified files or all outstanding changes
+
+ Commit changes to the given files into the repository. Unlike a
+ centralized SCM, this operation is a local operation. See
+ :hg:`push` for a way to actively distribute your changes.
+
+ If a list of files is omitted, all changes reported by :hg:`status`
+ will be committed.
+
+ If you are committing the result of a merge, do not provide any
+ filenames or -I/-X filters.
+
+ If no commit message is specified, Mercurial starts your
+ configured editor where you can enter a message. In case your
+ commit fails, you will find a backup of your message in
+ ``.hg/last-message.txt``.
+
+ The --amend flag can be used to amend the parent of the
+ working directory with a new commit that contains the changes
+ in the parent in addition to those currently reported by :hg:`status`,
+ if there are any. The old commit is stored in a backup bundle in
+ ``.hg/strip-backup`` (see :hg:`help bundle` and :hg:`help unbundle`
+ on how to restore it).
+
+ Message, user and date are taken from the amended commit unless
+ specified. When a message isn't specified on the command line,
+ the editor will open with the message of the amended commit.
+
+ It is not possible to amend public changesets (see :hg:`help phases`)
+ or changesets that have children.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Returns 0 on success, 1 if nothing changed.
+ """
+ if opts.get('subrepos'):
+ # Let --subrepos on the command line overide config setting.
+ ui.setconfig('ui', 'commitsubrepos', True)
+
+ extra = {}
+ if opts.get('close_branch'):
+ if repo['.'].node() not in repo.branchheads():
+ # The topo heads set is included in the branch heads set of the
+ # current branch, so it's sufficient to test branchheads
+ raise util.Abort(_('can only close branch heads'))
+ extra['close'] = 1
+
+ branch = repo[None].branch()
+ bheads = repo.branchheads(branch)
+
+ if opts.get('amend'):
+ if ui.configbool('ui', 'commitsubrepos'):
+ raise util.Abort(_('cannot amend recursively'))
+
+ old = repo['.']
+ if old.phase() == phases.public:
+ raise util.Abort(_('cannot amend public changesets'))
+ if len(old.parents()) > 1:
+ raise util.Abort(_('cannot amend merge changesets'))
+ if len(repo[None].parents()) > 1:
+ raise util.Abort(_('cannot amend while merging'))
+ if old.children():
+ raise util.Abort(_('cannot amend changeset with children'))
+
+ e = cmdutil.commiteditor
+ if opts.get('force_editor'):
+ e = cmdutil.commitforceeditor
+
+ def commitfunc(ui, repo, message, match, opts):
+ editor = e
+ # message contains text from -m or -l, if it's empty,
+ # open the editor with the old message
+ if not message:
+ message = old.description()
+ editor = cmdutil.commitforceeditor
+ return repo.commit(message,
+ opts.get('user') or old.user(),
+ opts.get('date') or old.date(),
+ match,
+ editor=editor,
+ extra=extra)
+
+ current = repo._bookmarkcurrent
+ marks = old.bookmarks()
+ node = cmdutil.amend(ui, repo, commitfunc, old, extra, pats, opts)
+ if node == old.node():
+ ui.status(_("nothing changed\n"))
+ return 1
+ elif marks:
+ ui.debug('moving bookmarks %r from %s to %s\n' %
+ (marks, old.hex(), hex(node)))
+ for bm in marks:
+ repo._bookmarks[bm] = node
+ if bm == current:
+ bookmarks.setcurrent(repo, bm)
+ bookmarks.write(repo)
+ else:
+ e = cmdutil.commiteditor
+ if opts.get('force_editor'):
+ e = cmdutil.commitforceeditor
+
+ def commitfunc(ui, repo, message, match, opts):
+ return repo.commit(message, opts.get('user'), opts.get('date'),
+ match, editor=e, extra=extra)
+
+ node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
+
+ if not node:
+ stat = repo.status(match=scmutil.match(repo[None], pats, opts))
+ if stat[3]:
+ ui.status(_("nothing changed (%d missing files, see "
+ "'hg status')\n") % len(stat[3]))
+ else:
+ ui.status(_("nothing changed\n"))
+ return 1
+
+ ctx = repo[node]
+ parents = ctx.parents()
+
+ if (not opts.get('amend') and bheads and node not in bheads and not
+ [x for x in parents if x.node() in bheads and x.branch() == branch]):
+ ui.status(_('created new head\n'))
+ # The message is not printed for initial roots. For the other
+ # changesets, it is printed in the following situations:
+ #
+ # Par column: for the 2 parents with ...
+ # N: null or no parent
+ # B: parent is on another named branch
+ # C: parent is a regular non head changeset
+ # H: parent was a branch head of the current branch
+ # Msg column: whether we print "created new head" message
+ # In the following, it is assumed that there already exists some
+ # initial branch heads of the current branch, otherwise nothing is
+ # printed anyway.
+ #
+ # Par Msg Comment
+ # NN y additional topo root
+ #
+ # BN y additional branch root
+ # CN y additional topo head
+ # HN n usual case
+ #
+ # BB y weird additional branch root
+ # CB y branch merge
+ # HB n merge with named branch
+ #
+ # CC y additional head from merge
+ # CH n merge with a head
+ #
+ # HH n head merge: head count decreases
+
+ if not opts.get('close_branch'):
+ for r in parents:
+ if r.closesbranch() and r.branch() == branch:
+ ui.status(_('reopening closed branch head %d\n') % r)
+
+ if ui.debugflag:
+ ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx.hex()))
+ elif ui.verbose:
+ ui.write(_('committed changeset %d:%s\n') % (int(ctx), ctx))
+
+@command('copy|cp',
+ [('A', 'after', None, _('record a copy that has already occurred')),
+ ('f', 'force', None, _('forcibly copy over an existing managed file')),
+ ] + walkopts + dryrunopts,
+ _('[OPTION]... [SOURCE]... DEST'))
+def copy(ui, repo, *pats, **opts):
+ """mark files as copied for the next commit
+
+ Mark dest as having copies of source files. If dest is a
+ directory, copies are put in that directory. If dest is a file,
+ the source must be a single file.
+
+ By default, this command copies the contents of files as they
+ exist in the working directory. If invoked with -A/--after, the
+ operation is recorded, but no copying is performed.
+
+ This command takes effect with the next commit. To undo a copy
+ before that, see :hg:`revert`.
+
+ Returns 0 on success, 1 if errors are encountered.
+ """
+ wlock = repo.wlock(False)
+ try:
+ return cmdutil.copy(ui, repo, pats, opts)
+ finally:
+ wlock.release()
+
+@command('debugancestor', [], _('[INDEX] REV1 REV2'))
+def debugancestor(ui, repo, *args):
+ """find the ancestor revision of two revisions in a given index"""
+ if len(args) == 3:
+ index, rev1, rev2 = args
+ r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), index)
+ lookup = r.lookup
+ elif len(args) == 2:
+ if not repo:
+ raise util.Abort(_("there is no Mercurial repository here "
+ "(.hg not found)"))
+ rev1, rev2 = args
+ r = repo.changelog
+ lookup = repo.lookup
+ else:
+ raise util.Abort(_('either two or three arguments required'))
+ a = r.ancestor(lookup(rev1), lookup(rev2))
+ ui.write("%d:%s\n" % (r.rev(a), hex(a)))
+
+@command('debugbuilddag',
+ [('m', 'mergeable-file', None, _('add single file mergeable changes')),
+ ('o', 'overwritten-file', None, _('add single file all revs overwrite')),
+ ('n', 'new-file', None, _('add new file at each rev'))],
+ _('[OPTION]... [TEXT]'))
+def debugbuilddag(ui, repo, text=None,
+ mergeable_file=False,
+ overwritten_file=False,
+ new_file=False):
+ """builds a repo with a given DAG from scratch in the current empty repo
+
+ The description of the DAG is read from stdin if not given on the
+ command line.
+
+ Elements:
+
+ - "+n" is a linear run of n nodes based on the current default parent
+ - "." is a single node based on the current default parent
+ - "$" resets the default parent to null (implied at the start);
+ otherwise the default parent is always the last node created
+ - "<p" sets the default parent to the backref p
+ - "*p" is a fork at parent p, which is a backref
+ - "*p1/p2" is a merge of parents p1 and p2, which are backrefs
+ - "/p2" is a merge of the preceding node and p2
+ - ":tag" defines a local tag for the preceding node
+ - "@branch" sets the named branch for subsequent nodes
+ - "#...\\n" is a comment up to the end of the line
+
+ Whitespace between the above elements is ignored.
+
+ A backref is either
+
+ - a number n, which references the node curr-n, where curr is the current
+ node, or
+ - the name of a local tag you placed earlier using ":tag", or
+ - empty to denote the default parent.
+
+ All string valued-elements are either strictly alphanumeric, or must
+ be enclosed in double quotes ("..."), with "\\" as escape character.
+ """
+
+ if text is None:
+ ui.status(_("reading DAG from stdin\n"))
+ text = ui.fin.read()
+
+ cl = repo.changelog
+ if len(cl) > 0:
+ raise util.Abort(_('repository is not empty'))
+
+ # determine number of revs in DAG
+ total = 0
+ for type, data in dagparser.parsedag(text):
+ if type == 'n':
+ total += 1
+
+ if mergeable_file:
+ linesperrev = 2
+ # make a file with k lines per rev
+ initialmergedlines = [str(i) for i in xrange(0, total * linesperrev)]
+ initialmergedlines.append("")
+
+ tags = []
+
+ lock = tr = None
+ try:
+ lock = repo.lock()
+ tr = repo.transaction("builddag")
+
+ at = -1
+ atbranch = 'default'
+ nodeids = []
+ id = 0
+ ui.progress(_('building'), id, unit=_('revisions'), total=total)
+ for type, data in dagparser.parsedag(text):
+ if type == 'n':
+ ui.note('node %s\n' % str(data))
+ id, ps = data
+
+ files = []
+ fctxs = {}
+
+ p2 = None
+ if mergeable_file:
+ fn = "mf"
+ p1 = repo[ps[0]]
+ if len(ps) > 1:
+ p2 = repo[ps[1]]
+ pa = p1.ancestor(p2)
+ base, local, other = [x[fn].data() for x in pa, p1, p2]
+ m3 = simplemerge.Merge3Text(base, local, other)
+ ml = [l.strip() for l in m3.merge_lines()]
+ ml.append("")
+ elif at > 0:
+ ml = p1[fn].data().split("\n")
+ else:
+ ml = initialmergedlines
+ ml[id * linesperrev] += " r%i" % id
+ mergedtext = "\n".join(ml)
+ files.append(fn)
+ fctxs[fn] = context.memfilectx(fn, mergedtext)
+
+ if overwritten_file:
+ fn = "of"
+ files.append(fn)
+ fctxs[fn] = context.memfilectx(fn, "r%i\n" % id)
+
+ if new_file:
+ fn = "nf%i" % id
+ files.append(fn)
+ fctxs[fn] = context.memfilectx(fn, "r%i\n" % id)
+ if len(ps) > 1:
+ if not p2:
+ p2 = repo[ps[1]]
+ for fn in p2:
+ if fn.startswith("nf"):
+ files.append(fn)
+ fctxs[fn] = p2[fn]
+
+ def fctxfn(repo, cx, path):
+ return fctxs.get(path)
+
+ if len(ps) == 0 or ps[0] < 0:
+ pars = [None, None]
+ elif len(ps) == 1:
+ pars = [nodeids[ps[0]], None]
+ else:
+ pars = [nodeids[p] for p in ps]
+ cx = context.memctx(repo, pars, "r%i" % id, files, fctxfn,
+ date=(id, 0),
+ user="debugbuilddag",
+ extra={'branch': atbranch})
+ nodeid = repo.commitctx(cx)
+ nodeids.append(nodeid)
+ at = id
+ elif type == 'l':
+ id, name = data
+ ui.note('tag %s\n' % name)
+ tags.append("%s %s\n" % (hex(repo.changelog.node(id)), name))
+ elif type == 'a':
+ ui.note('branch %s\n' % data)
+ atbranch = data
+ ui.progress(_('building'), id, unit=_('revisions'), total=total)
+ tr.close()
+
+ if tags:
+ repo.opener.write("localtags", "".join(tags))
+ finally:
+ ui.progress(_('building'), None)
+ release(tr, lock)
+
+@command('debugbundle', [('a', 'all', None, _('show all details'))], _('FILE'))
+def debugbundle(ui, bundlepath, all=None, **opts):
+ """lists the contents of a bundle"""
+ f = url.open(ui, bundlepath)
+ try:
+ gen = changegroup.readbundle(f, bundlepath)
+ if all:
+ ui.write("format: id, p1, p2, cset, delta base, len(delta)\n")
+
+ def showchunks(named):
+ ui.write("\n%s\n" % named)
+ chain = None
+ while True:
+ chunkdata = gen.deltachunk(chain)
+ if not chunkdata:
+ break
+ node = chunkdata['node']
+ p1 = chunkdata['p1']
+ p2 = chunkdata['p2']
+ cs = chunkdata['cs']
+ deltabase = chunkdata['deltabase']
+ delta = chunkdata['delta']
+ ui.write("%s %s %s %s %s %s\n" %
+ (hex(node), hex(p1), hex(p2),
+ hex(cs), hex(deltabase), len(delta)))
+ chain = node
+
+ chunkdata = gen.changelogheader()
+ showchunks("changelog")
+ chunkdata = gen.manifestheader()
+ showchunks("manifest")
+ while True:
+ chunkdata = gen.filelogheader()
+ if not chunkdata:
+ break
+ fname = chunkdata['filename']
+ showchunks(fname)
+ else:
+ chunkdata = gen.changelogheader()
+ chain = None
+ while True:
+ chunkdata = gen.deltachunk(chain)
+ if not chunkdata:
+ break
+ node = chunkdata['node']
+ ui.write("%s\n" % hex(node))
+ chain = node
+ finally:
+ f.close()
+
+@command('debugcheckstate', [], '')
+def debugcheckstate(ui, repo):
+ """validate the correctness of the current dirstate"""
+ parent1, parent2 = repo.dirstate.parents()
+ m1 = repo[parent1].manifest()
+ m2 = repo[parent2].manifest()
+ errors = 0
+ for f in repo.dirstate:
+ state = repo.dirstate[f]
+ if state in "nr" and f not in m1:
+ ui.warn(_("%s in state %s, but not in manifest1\n") % (f, state))
+ errors += 1
+ if state in "a" and f in m1:
+ ui.warn(_("%s in state %s, but also in manifest1\n") % (f, state))
+ errors += 1
+ if state in "m" and f not in m1 and f not in m2:
+ ui.warn(_("%s in state %s, but not in either manifest\n") %
+ (f, state))
+ errors += 1
+ for f in m1:
+ state = repo.dirstate[f]
+ if state not in "nrm":
+ ui.warn(_("%s in manifest1, but listed as state %s") % (f, state))
+ errors += 1
+ if errors:
+ error = _(".hg/dirstate inconsistent with current parent's manifest")
+ raise util.Abort(error)
+
+@command('debugcommands', [], _('[COMMAND]'))
+def debugcommands(ui, cmd='', *args):
+ """list all available commands and options"""
+ for cmd, vals in sorted(table.iteritems()):
+ cmd = cmd.split('|')[0].strip('^')
+ opts = ', '.join([i[1] for i in vals[1]])
+ ui.write('%s: %s\n' % (cmd, opts))
+
+@command('debugcomplete',
+ [('o', 'options', None, _('show the command options'))],
+ _('[-o] CMD'))
+def debugcomplete(ui, cmd='', **opts):
+ """returns the completion list associated with the given command"""
+
+ if opts.get('options'):
+ options = []
+ otables = [globalopts]
+ if cmd:
+ aliases, entry = cmdutil.findcmd(cmd, table, False)
+ otables.append(entry[1])
+ for t in otables:
+ for o in t:
+ if "(DEPRECATED)" in o[3]:
+ continue
+ if o[0]:
+ options.append('-%s' % o[0])
+ options.append('--%s' % o[1])
+ ui.write("%s\n" % "\n".join(options))
+ return
+
+ cmdlist = cmdutil.findpossible(cmd, table)
+ if ui.verbose:
+ cmdlist = [' '.join(c[0]) for c in cmdlist.values()]
+ ui.write("%s\n" % "\n".join(sorted(cmdlist)))
+
+@command('debugdag',
+ [('t', 'tags', None, _('use tags as labels')),
+ ('b', 'branches', None, _('annotate with branch names')),
+ ('', 'dots', None, _('use dots for runs')),
+ ('s', 'spaces', None, _('separate elements by spaces'))],
+ _('[OPTION]... [FILE [REV]...]'))
+def debugdag(ui, repo, file_=None, *revs, **opts):
+ """format the changelog or an index DAG as a concise textual description
+
+ If you pass a revlog index, the revlog's DAG is emitted. If you list
+ revision numbers, they get labelled in the output as rN.
+
+ Otherwise, the changelog DAG of the current repo is emitted.
+ """
+ spaces = opts.get('spaces')
+ dots = opts.get('dots')
+ if file_:
+ rlog = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
+ revs = set((int(r) for r in revs))
+ def events():
+ for r in rlog:
+ yield 'n', (r, list(set(p for p in rlog.parentrevs(r)
+ if p != -1)))
+ if r in revs:
+ yield 'l', (r, "r%i" % r)
+ elif repo:
+ cl = repo.changelog
+ tags = opts.get('tags')
+ branches = opts.get('branches')
+ if tags:
+ labels = {}
+ for l, n in repo.tags().items():
+ labels.setdefault(cl.rev(n), []).append(l)
+ def events():
+ b = "default"
+ for r in cl:
+ if branches:
+ newb = cl.read(cl.node(r))[5]['branch']
+ if newb != b:
+ yield 'a', newb
+ b = newb
+ yield 'n', (r, list(set(p for p in cl.parentrevs(r)
+ if p != -1)))
+ if tags:
+ ls = labels.get(r)
+ if ls:
+ for l in ls:
+ yield 'l', (r, l)
+ else:
+ raise util.Abort(_('need repo for changelog dag'))
+
+ for line in dagparser.dagtextlines(events(),
+ addspaces=spaces,
+ wraplabels=True,
+ wrapannotations=True,
+ wrapnonlinear=dots,
+ usedots=dots,
+ maxlinewidth=70):
+ ui.write(line)
+ ui.write("\n")
+
+@command('debugdata',
+ [('c', 'changelog', False, _('open changelog')),
+ ('m', 'manifest', False, _('open manifest'))],
+ _('-c|-m|FILE REV'))
+def debugdata(ui, repo, file_, rev = None, **opts):
+ """dump the contents of a data file revision"""
+ if opts.get('changelog') or opts.get('manifest'):
+ file_, rev = None, file_
+ elif rev is None:
+ raise error.CommandError('debugdata', _('invalid arguments'))
+ r = cmdutil.openrevlog(repo, 'debugdata', file_, opts)
+ try:
+ ui.write(r.revision(r.lookup(rev)))
+ except KeyError:
+ raise util.Abort(_('invalid revision identifier %s') % rev)
+
+@command('debugdate',
+ [('e', 'extended', None, _('try extended date formats'))],
+ _('[-e] DATE [RANGE]'))
+def debugdate(ui, date, range=None, **opts):
+ """parse and display a date"""
+ if opts["extended"]:
+ d = util.parsedate(date, util.extendeddateformats)
+ else:
+ d = util.parsedate(date)
+ ui.write("internal: %s %s\n" % d)
+ ui.write("standard: %s\n" % util.datestr(d))
+ if range:
+ m = util.matchdate(range)
+ ui.write("match: %s\n" % m(d[0]))
+
+@command('debugdiscovery',
+ [('', 'old', None, _('use old-style discovery')),
+ ('', 'nonheads', None,
+ _('use old-style discovery with non-heads included')),
+ ] + remoteopts,
+ _('[-l REV] [-r REV] [-b BRANCH]... [OTHER]'))
+def debugdiscovery(ui, repo, remoteurl="default", **opts):
+ """runs the changeset discovery protocol in isolation"""
+ remoteurl, branches = hg.parseurl(ui.expandpath(remoteurl),
+ opts.get('branch'))
+ remote = hg.peer(repo, opts, remoteurl)
+ ui.status(_('comparing with %s\n') % util.hidepassword(remoteurl))
+
+ # make sure tests are repeatable
+ random.seed(12323)
+
+ def doit(localheads, remoteheads, remote=remote):
+ if opts.get('old'):
+ if localheads:
+ raise util.Abort('cannot use localheads with old style '
+ 'discovery')
+ if not util.safehasattr(remote, 'branches'):
+ # enable in-client legacy support
+ remote = localrepo.locallegacypeer(remote.local())
+ common, _in, hds = treediscovery.findcommonincoming(repo, remote,
+ force=True)
+ common = set(common)
+ if not opts.get('nonheads'):
+ ui.write("unpruned common: %s\n" % " ".join([short(n)
+ for n in common]))
+ dag = dagutil.revlogdag(repo.changelog)
+ all = dag.ancestorset(dag.internalizeall(common))
+ common = dag.externalizeall(dag.headsetofconnecteds(all))
+ else:
+ common, any, hds = setdiscovery.findcommonheads(ui, repo, remote)
+ common = set(common)
+ rheads = set(hds)
+ lheads = set(repo.heads())
+ ui.write("common heads: %s\n" % " ".join([short(n) for n in common]))
+ if lheads <= common:
+ ui.write("local is subset\n")
+ elif rheads <= common:
+ ui.write("remote is subset\n")
+
+ serverlogs = opts.get('serverlog')
+ if serverlogs:
+ for filename in serverlogs:
+ logfile = open(filename, 'r')
+ try:
+ line = logfile.readline()
+ while line:
+ parts = line.strip().split(';')
+ op = parts[1]
+ if op == 'cg':
+ pass
+ elif op == 'cgss':
+ doit(parts[2].split(' '), parts[3].split(' '))
+ elif op == 'unb':
+ doit(parts[3].split(' '), parts[2].split(' '))
+ line = logfile.readline()
+ finally:
+ logfile.close()
+
+ else:
+ remoterevs, _checkout = hg.addbranchrevs(repo, remote, branches,
+ opts.get('remote_head'))
+ localrevs = opts.get('local_head')
+ doit(localrevs, remoterevs)
+
+@command('debugfileset', [], ('REVSPEC'))
+def debugfileset(ui, repo, expr):
+ '''parse and apply a fileset specification'''
+ if ui.verbose:
+ tree = fileset.parse(expr)[0]
+ ui.note(tree, "\n")
+
+ for f in fileset.getfileset(repo[None], expr):
+ ui.write("%s\n" % f)
+
+@command('debugfsinfo', [], _('[PATH]'))
+def debugfsinfo(ui, path = "."):
+ """show information detected about current filesystem"""
+ util.writefile('.debugfsinfo', '')
+ ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
+ ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
+ ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
+ and 'yes' or 'no'))
+ os.unlink('.debugfsinfo')
+
+@command('debuggetbundle',
+ [('H', 'head', [], _('id of head node'), _('ID')),
+ ('C', 'common', [], _('id of common node'), _('ID')),
+ ('t', 'type', 'bzip2', _('bundle compression type to use'), _('TYPE'))],
+ _('REPO FILE [-H|-C ID]...'))
+def debuggetbundle(ui, repopath, bundlepath, head=None, common=None, **opts):
+ """retrieves a bundle from a repo
+
+ Every ID must be a full-length hex node id string. Saves the bundle to the
+ given file.
+ """
+ repo = hg.peer(ui, opts, repopath)
+ if not repo.capable('getbundle'):
+ raise util.Abort("getbundle() not supported by target repository")
+ args = {}
+ if common:
+ args['common'] = [bin(s) for s in common]
+ if head:
+ args['heads'] = [bin(s) for s in head]
+ bundle = repo.getbundle('debug', **args)
+
+ bundletype = opts.get('type', 'bzip2').lower()
+ btypes = {'none': 'HG10UN', 'bzip2': 'HG10BZ', 'gzip': 'HG10GZ'}
+ bundletype = btypes.get(bundletype)
+ if bundletype not in changegroup.bundletypes:
+ raise util.Abort(_('unknown bundle type specified with --type'))
+ changegroup.writebundle(bundle, bundlepath, bundletype)
+
+@command('debugignore', [], '')
+def debugignore(ui, repo, *values, **opts):
+ """display the combined ignore pattern"""
+ ignore = repo.dirstate._ignore
+ includepat = getattr(ignore, 'includepat', None)
+ if includepat is not None:
+ ui.write("%s\n" % includepat)
+ else:
+ raise util.Abort(_("no ignore patterns found"))
+
+@command('debugindex',
+ [('c', 'changelog', False, _('open changelog')),
+ ('m', 'manifest', False, _('open manifest')),
+ ('f', 'format', 0, _('revlog format'), _('FORMAT'))],
+ _('[-f FORMAT] -c|-m|FILE'))
+def debugindex(ui, repo, file_ = None, **opts):
+ """dump the contents of an index file"""
+ r = cmdutil.openrevlog(repo, 'debugindex', file_, opts)
+ format = opts.get('format', 0)
+ if format not in (0, 1):
+ raise util.Abort(_("unknown format %d") % format)
+
+ generaldelta = r.version & revlog.REVLOGGENERALDELTA
+ if generaldelta:
+ basehdr = ' delta'
+ else:
+ basehdr = ' base'
+
+ if format == 0:
+ ui.write(" rev offset length " + basehdr + " linkrev"
+ " nodeid p1 p2\n")
+ elif format == 1:
+ ui.write(" rev flag offset length"
+ " size " + basehdr + " link p1 p2"
+ " nodeid\n")
+
+ for i in r:
+ node = r.node(i)
+ if generaldelta:
+ base = r.deltaparent(i)
+ else:
+ base = r.chainbase(i)
+ if format == 0:
+ try:
+ pp = r.parents(node)
+ except Exception:
+ pp = [nullid, nullid]
+ ui.write("% 6d % 9d % 7d % 6d % 7d %s %s %s\n" % (
+ i, r.start(i), r.length(i), base, r.linkrev(i),
+ short(node), short(pp[0]), short(pp[1])))
+ elif format == 1:
+ pr = r.parentrevs(i)
+ ui.write("% 6d %04x % 8d % 8d % 8d % 6d % 6d % 6d % 6d %s\n" % (
+ i, r.flags(i), r.start(i), r.length(i), r.rawsize(i),
+ base, r.linkrev(i), pr[0], pr[1], short(node)))
+
+@command('debugindexdot', [], _('FILE'))
+def debugindexdot(ui, repo, file_):
+ """dump an index DAG as a graphviz dot file"""
+ r = None
+ if repo:
+ filelog = repo.file(file_)
+ if len(filelog):
+ r = filelog
+ if not r:
+ r = revlog.revlog(scmutil.opener(os.getcwd(), audit=False), file_)
+ ui.write("digraph G {\n")
+ for i in r:
+ node = r.node(i)
+ pp = r.parents(node)
+ ui.write("\t%d -> %d\n" % (r.rev(pp[0]), i))
+ if pp[1] != nullid:
+ ui.write("\t%d -> %d\n" % (r.rev(pp[1]), i))
+ ui.write("}\n")
+
+@command('debuginstall', [], '')
+def debuginstall(ui):
+ '''test Mercurial installation
+
+ Returns 0 on success.
+ '''
+
+ def writetemp(contents):
+ (fd, name) = tempfile.mkstemp(prefix="hg-debuginstall-")
+ f = os.fdopen(fd, "wb")
+ f.write(contents)
+ f.close()
+ return name
+
+ problems = 0
+
+ # encoding
+ ui.status(_("checking encoding (%s)...\n") % encoding.encoding)
+ try:
+ encoding.fromlocal("test")
+ except util.Abort, inst:
+ ui.write(" %s\n" % inst)
+ ui.write(_(" (check that your locale is properly set)\n"))
+ problems += 1
+
+ # compiled modules
+ ui.status(_("checking installed modules (%s)...\n")
+ % os.path.dirname(__file__))
+ try:
+ import bdiff, mpatch, base85, osutil
+ dir(bdiff), dir(mpatch), dir(base85), dir(osutil) # quiet pyflakes
+ except Exception, inst:
+ ui.write(" %s\n" % inst)
+ ui.write(_(" One or more extensions could not be found"))
+ ui.write(_(" (check that you compiled the extensions)\n"))
+ problems += 1
+
+ # templates
+ import templater
+ p = templater.templatepath()
+ ui.status(_("checking templates (%s)...\n") % ' '.join(p))
+ try:
+ templater.templater(templater.templatepath("map-cmdline.default"))
+ except Exception, inst:
+ ui.write(" %s\n" % inst)
+ ui.write(_(" (templates seem to have been installed incorrectly)\n"))
+ problems += 1
+
+ # editor
+ ui.status(_("checking commit editor...\n"))
+ editor = ui.geteditor()
+ cmdpath = util.findexe(editor) or util.findexe(editor.split()[0])
+ if not cmdpath:
+ if editor == 'vi':
+ ui.write(_(" No commit editor set and can't find vi in PATH\n"))
+ ui.write(_(" (specify a commit editor in your configuration"
+ " file)\n"))
+ else:
+ ui.write(_(" Can't find editor '%s' in PATH\n") % editor)
+ ui.write(_(" (specify a commit editor in your configuration"
+ " file)\n"))
+ problems += 1
+
+ # check username
+ ui.status(_("checking username...\n"))
+ try:
+ ui.username()
+ except util.Abort, e:
+ ui.write(" %s\n" % e)
+ ui.write(_(" (specify a username in your configuration file)\n"))
+ problems += 1
+
+ if not problems:
+ ui.status(_("no problems detected\n"))
+ else:
+ ui.write(_("%s problems detected,"
+ " please check your install!\n") % problems)
+
+ return problems
+
+@command('debugknown', [], _('REPO ID...'))
+def debugknown(ui, repopath, *ids, **opts):
+ """test whether node ids are known to a repo
+
+ Every ID must be a full-length hex node id string. Returns a list of 0s
+ and 1s indicating unknown/known.
+ """
+ repo = hg.peer(ui, opts, repopath)
+ if not repo.capable('known'):
+ raise util.Abort("known() not supported by target repository")
+ flags = repo.known([bin(s) for s in ids])
+ ui.write("%s\n" % ("".join([f and "1" or "0" for f in flags])))
+
+@command('debugobsolete', [] + commitopts2,
+ _('[OBSOLETED [REPLACEMENT] [REPL... ]'))
+def debugobsolete(ui, repo, precursor=None, *successors, **opts):
+ """create arbitrary obsolete marker"""
+ def parsenodeid(s):
+ try:
+ # We do not use revsingle/revrange functions here to accept
+ # arbitrary node identifiers, possibly not present in the
+ # local repository.
+ n = bin(s)
+ if len(n) != len(nullid):
+ raise TypeError()
+ return n
+ except TypeError:
+ raise util.Abort('changeset references must be full hexadecimal '
+ 'node identifiers')
+
+ if precursor is not None:
+ metadata = {}
+ if 'date' in opts:
+ metadata['date'] = opts['date']
+ metadata['user'] = opts['user'] or ui.username()
+ succs = tuple(parsenodeid(succ) for succ in successors)
+ l = repo.lock()
+ try:
+ tr = repo.transaction('debugobsolete')
+ try:
+ repo.obsstore.create(tr, parsenodeid(precursor), succs, 0,
+ metadata)
+ tr.close()
+ finally:
+ tr.release()
+ finally:
+ l.release()
+ else:
+ for m in obsolete.allmarkers(repo):
+ ui.write(hex(m.precnode()))
+ for repl in m.succnodes():
+ ui.write(' ')
+ ui.write(hex(repl))
+ ui.write(' %X ' % m._data[2])
+ ui.write(m.metadata())
+ ui.write('\n')
+
+@command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'))
+def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
+ '''access the pushkey key/value protocol
+
+ With two args, list the keys in the given namespace.
+
+ With five args, set a key to new if it currently is set to old.
+ Reports success or failure.
+ '''
+
+ target = hg.peer(ui, {}, repopath)
+ if keyinfo:
+ key, old, new = keyinfo
+ r = target.pushkey(namespace, key, old, new)
+ ui.status(str(r) + '\n')
+ return not r
+ else:
+ for k, v in target.listkeys(namespace).iteritems():
+ ui.write("%s\t%s\n" % (k.encode('string-escape'),
+ v.encode('string-escape')))
+
+@command('debugpvec', [], _('A B'))
+def debugpvec(ui, repo, a, b=None):
+ ca = scmutil.revsingle(repo, a)
+ cb = scmutil.revsingle(repo, b)
+ pa = pvec.ctxpvec(ca)
+ pb = pvec.ctxpvec(cb)
+ if pa == pb:
+ rel = "="
+ elif pa > pb:
+ rel = ">"
+ elif pa < pb:
+ rel = "<"
+ elif pa | pb:
+ rel = "|"
+ ui.write(_("a: %s\n") % pa)
+ ui.write(_("b: %s\n") % pb)
+ ui.write(_("depth(a): %d depth(b): %d\n") % (pa._depth, pb._depth))
+ ui.write(_("delta: %d hdist: %d distance: %d relation: %s\n") %
+ (abs(pa._depth - pb._depth), pvec._hamming(pa._vec, pb._vec),
+ pa.distance(pb), rel))
+
+@command('debugrebuildstate',
+ [('r', 'rev', '', _('revision to rebuild to'), _('REV'))],
+ _('[-r REV] [REV]'))
+def debugrebuildstate(ui, repo, rev="tip"):
+ """rebuild the dirstate as it would look like for the given revision"""
+ ctx = scmutil.revsingle(repo, rev)
+ wlock = repo.wlock()
+ try:
+ repo.dirstate.rebuild(ctx.node(), ctx.manifest())
+ finally:
+ wlock.release()
+
+@command('debugrename',
+ [('r', 'rev', '', _('revision to debug'), _('REV'))],
+ _('[-r REV] FILE'))
+def debugrename(ui, repo, file1, *pats, **opts):
+ """dump rename information"""
+
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+ m = scmutil.match(ctx, (file1,) + pats, opts)
+ for abs in ctx.walk(m):
+ fctx = ctx[abs]
+ o = fctx.filelog().renamed(fctx.filenode())
+ rel = m.rel(abs)
+ if o:
+ ui.write(_("%s renamed from %s:%s\n") % (rel, o[0], hex(o[1])))
+ else:
+ ui.write(_("%s not renamed\n") % rel)
+
+@command('debugrevlog',
+ [('c', 'changelog', False, _('open changelog')),
+ ('m', 'manifest', False, _('open manifest')),
+ ('d', 'dump', False, _('dump index data'))],
+ _('-c|-m|FILE'))
+def debugrevlog(ui, repo, file_ = None, **opts):
+ """show data and statistics about a revlog"""
+ r = cmdutil.openrevlog(repo, 'debugrevlog', file_, opts)
+
+ if opts.get("dump"):
+ numrevs = len(r)
+ ui.write("# rev p1rev p2rev start end deltastart base p1 p2"
+ " rawsize totalsize compression heads\n")
+ ts = 0
+ heads = set()
+ for rev in xrange(numrevs):
+ dbase = r.deltaparent(rev)
+ if dbase == -1:
+ dbase = rev
+ cbase = r.chainbase(rev)
+ p1, p2 = r.parentrevs(rev)
+ rs = r.rawsize(rev)
+ ts = ts + rs
+ heads -= set(r.parentrevs(rev))
+ heads.add(rev)
+ ui.write("%d %d %d %d %d %d %d %d %d %d %d %d %d\n" %
+ (rev, p1, p2, r.start(rev), r.end(rev),
+ r.start(dbase), r.start(cbase),
+ r.start(p1), r.start(p2),
+ rs, ts, ts / r.end(rev), len(heads)))
+ return 0
+
+ v = r.version
+ format = v & 0xFFFF
+ flags = []
+ gdelta = False
+ if v & revlog.REVLOGNGINLINEDATA:
+ flags.append('inline')
+ if v & revlog.REVLOGGENERALDELTA:
+ gdelta = True
+ flags.append('generaldelta')
+ if not flags:
+ flags = ['(none)']
+
+ nummerges = 0
+ numfull = 0
+ numprev = 0
+ nump1 = 0
+ nump2 = 0
+ numother = 0
+ nump1prev = 0
+ nump2prev = 0
+ chainlengths = []
+
+ datasize = [None, 0, 0L]
+ fullsize = [None, 0, 0L]
+ deltasize = [None, 0, 0L]
+
+ def addsize(size, l):
+ if l[0] is None or size < l[0]:
+ l[0] = size
+ if size > l[1]:
+ l[1] = size
+ l[2] += size
+
+ numrevs = len(r)
+ for rev in xrange(numrevs):
+ p1, p2 = r.parentrevs(rev)
+ delta = r.deltaparent(rev)
+ if format > 0:
+ addsize(r.rawsize(rev), datasize)
+ if p2 != nullrev:
+ nummerges += 1
+ size = r.length(rev)
+ if delta == nullrev:
+ chainlengths.append(0)
+ numfull += 1
+ addsize(size, fullsize)
+ else:
+ chainlengths.append(chainlengths[delta] + 1)
+ addsize(size, deltasize)
+ if delta == rev - 1:
+ numprev += 1
+ if delta == p1:
+ nump1prev += 1
+ elif delta == p2:
+ nump2prev += 1
+ elif delta == p1:
+ nump1 += 1
+ elif delta == p2:
+ nump2 += 1
+ elif delta != nullrev:
+ numother += 1
+
+ # Adjust size min value for empty cases
+ for size in (datasize, fullsize, deltasize):
+ if size[0] is None:
+ size[0] = 0
+
+ numdeltas = numrevs - numfull
+ numoprev = numprev - nump1prev - nump2prev
+ totalrawsize = datasize[2]
+ datasize[2] /= numrevs
+ fulltotal = fullsize[2]
+ fullsize[2] /= numfull
+ deltatotal = deltasize[2]
+ if numrevs - numfull > 0:
+ deltasize[2] /= numrevs - numfull
+ totalsize = fulltotal + deltatotal
+ avgchainlen = sum(chainlengths) / numrevs
+ compratio = totalrawsize / totalsize
+
+ basedfmtstr = '%%%dd\n'
+ basepcfmtstr = '%%%dd %s(%%5.2f%%%%)\n'
+
+ def dfmtstr(max):
+ return basedfmtstr % len(str(max))
+ def pcfmtstr(max, padding=0):
+ return basepcfmtstr % (len(str(max)), ' ' * padding)
+
+ def pcfmt(value, total):
+ return (value, 100 * float(value) / total)
+
+ ui.write('format : %d\n' % format)
+ ui.write('flags : %s\n' % ', '.join(flags))
+
+ ui.write('\n')
+ fmt = pcfmtstr(totalsize)
+ fmt2 = dfmtstr(totalsize)
+ ui.write('revisions : ' + fmt2 % numrevs)
+ ui.write(' merges : ' + fmt % pcfmt(nummerges, numrevs))
+ ui.write(' normal : ' + fmt % pcfmt(numrevs - nummerges, numrevs))
+ ui.write('revisions : ' + fmt2 % numrevs)
+ ui.write(' full : ' + fmt % pcfmt(numfull, numrevs))
+ ui.write(' deltas : ' + fmt % pcfmt(numdeltas, numrevs))
+ ui.write('revision size : ' + fmt2 % totalsize)
+ ui.write(' full : ' + fmt % pcfmt(fulltotal, totalsize))
+ ui.write(' deltas : ' + fmt % pcfmt(deltatotal, totalsize))
+
+ ui.write('\n')
+ fmt = dfmtstr(max(avgchainlen, compratio))
+ ui.write('avg chain length : ' + fmt % avgchainlen)
+ ui.write('compression ratio : ' + fmt % compratio)
+
+ if format > 0:
+ ui.write('\n')
+ ui.write('uncompressed data size (min/max/avg) : %d / %d / %d\n'
+ % tuple(datasize))
+ ui.write('full revision size (min/max/avg) : %d / %d / %d\n'
+ % tuple(fullsize))
+ ui.write('delta size (min/max/avg) : %d / %d / %d\n'
+ % tuple(deltasize))
+
+ if numdeltas > 0:
+ ui.write('\n')
+ fmt = pcfmtstr(numdeltas)
+ fmt2 = pcfmtstr(numdeltas, 4)
+ ui.write('deltas against prev : ' + fmt % pcfmt(numprev, numdeltas))
+ if numprev > 0:
+ ui.write(' where prev = p1 : ' + fmt2 % pcfmt(nump1prev,
+ numprev))
+ ui.write(' where prev = p2 : ' + fmt2 % pcfmt(nump2prev,
+ numprev))
+ ui.write(' other : ' + fmt2 % pcfmt(numoprev,
+ numprev))
+ if gdelta:
+ ui.write('deltas against p1 : ' + fmt % pcfmt(nump1, numdeltas))
+ ui.write('deltas against p2 : ' + fmt % pcfmt(nump2, numdeltas))
+ ui.write('deltas against other : ' + fmt % pcfmt(numother,
+ numdeltas))
+
+@command('debugrevspec', [], ('REVSPEC'))
+def debugrevspec(ui, repo, expr):
+ """parse and apply a revision specification
+
+ Use --verbose to print the parsed tree before and after aliases
+ expansion.
+ """
+ if ui.verbose:
+ tree = revset.parse(expr)[0]
+ ui.note(revset.prettyformat(tree), "\n")
+ newtree = revset.findaliases(ui, tree)
+ if newtree != tree:
+ ui.note(revset.prettyformat(newtree), "\n")
+ func = revset.match(ui, expr)
+ for c in func(repo, range(len(repo))):
+ ui.write("%s\n" % c)
+
+@command('debugsetparents', [], _('REV1 [REV2]'))
+def debugsetparents(ui, repo, rev1, rev2=None):
+ """manually set the parents of the current working directory
+
+ This is useful for writing repository conversion tools, but should
+ be used with care.
+
+ Returns 0 on success.
+ """
+
+ r1 = scmutil.revsingle(repo, rev1).node()
+ r2 = scmutil.revsingle(repo, rev2, 'null').node()
+
+ wlock = repo.wlock()
+ try:
+ repo.setparents(r1, r2)
+ finally:
+ wlock.release()
+
+@command('debugstate',
+ [('', 'nodates', None, _('do not display the saved mtime')),
+ ('', 'datesort', None, _('sort by saved mtime'))],
+ _('[OPTION]...'))
+def debugstate(ui, repo, nodates=None, datesort=None):
+ """show the contents of the current dirstate"""
+ timestr = ""
+ showdate = not nodates
+ if datesort:
+ keyfunc = lambda x: (x[1][3], x[0]) # sort by mtime, then by filename
+ else:
+ keyfunc = None # sort by filename
+ for file_, ent in sorted(repo.dirstate._map.iteritems(), key=keyfunc):
+ if showdate:
+ if ent[3] == -1:
+ # Pad or slice to locale representation
+ locale_len = len(time.strftime("%Y-%m-%d %H:%M:%S ",
+ time.localtime(0)))
+ timestr = 'unset'
+ timestr = (timestr[:locale_len] +
+ ' ' * (locale_len - len(timestr)))
+ else:
+ timestr = time.strftime("%Y-%m-%d %H:%M:%S ",
+ time.localtime(ent[3]))
+ if ent[1] & 020000:
+ mode = 'lnk'
+ else:
+ mode = '%3o' % (ent[1] & 0777 & ~util.umask)
+ ui.write("%c %s %10d %s%s\n" % (ent[0], mode, ent[2], timestr, file_))
+ for f in repo.dirstate.copies():
+ ui.write(_("copy: %s -> %s\n") % (repo.dirstate.copied(f), f))
+
+@command('debugsub',
+ [('r', 'rev', '',
+ _('revision to check'), _('REV'))],
+ _('[-r REV] [REV]'))
+def debugsub(ui, repo, rev=None):
+ ctx = scmutil.revsingle(repo, rev, None)
+ for k, v in sorted(ctx.substate.items()):
+ ui.write('path %s\n' % k)
+ ui.write(' source %s\n' % v[0])
+ ui.write(' revision %s\n' % v[1])
+
+@command('debugwalk', walkopts, _('[OPTION]... [FILE]...'))
+def debugwalk(ui, repo, *pats, **opts):
+ """show how files match on given patterns"""
+ m = scmutil.match(repo[None], pats, opts)
+ items = list(repo.walk(m))
+ if not items:
+ return
+ f = lambda fn: fn
+ if ui.configbool('ui', 'slash') and os.sep != '/':
+ f = lambda fn: util.normpath(fn)
+ fmt = 'f %%-%ds %%-%ds %%s' % (
+ max([len(abs) for abs in items]),
+ max([len(m.rel(abs)) for abs in items]))
+ for abs in items:
+ line = fmt % (abs, f(m.rel(abs)), m.exact(abs) and 'exact' or '')
+ ui.write("%s\n" % line.rstrip())
+
+@command('debugwireargs',
+ [('', 'three', '', 'three'),
+ ('', 'four', '', 'four'),
+ ('', 'five', '', 'five'),
+ ] + remoteopts,
+ _('REPO [OPTIONS]... [ONE [TWO]]'))
+def debugwireargs(ui, repopath, *vals, **opts):
+ repo = hg.peer(ui, opts, repopath)
+ for opt in remoteopts:
+ del opts[opt[1]]
+ args = {}
+ for k, v in opts.iteritems():
+ if v:
+ args[k] = v
+ # run twice to check that we don't mess up the stream for the next command
+ res1 = repo.debugwireargs(*vals, **args)
+ res2 = repo.debugwireargs(*vals, **args)
+ ui.write("%s\n" % res1)
+ if res1 != res2:
+ ui.warn("%s\n" % res2)
+
+@command('^diff',
+ [('r', 'rev', [], _('revision'), _('REV')),
+ ('c', 'change', '', _('change made by revision'), _('REV'))
+ ] + diffopts + diffopts2 + walkopts + subrepoopts,
+ _('[OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...'))
+def diff(ui, repo, *pats, **opts):
+ """diff repository (or selected files)
+
+ Show differences between revisions for the specified files.
+
+ Differences between files are shown using the unified diff format.
+
+ .. note::
+ diff may generate unexpected results for merges, as it will
+ default to comparing against the working directory's first
+ parent changeset if no revisions are specified.
+
+ When two revision arguments are given, then changes are shown
+ between those revisions. If only one revision is specified then
+ that revision is compared to the working directory, and, when no
+ revisions are specified, the working directory files are compared
+ to its parent.
+
+ Alternatively you can specify -c/--change with a revision to see
+ the changes in that changeset relative to its first parent.
+
+ Without the -a/--text option, diff will avoid generating diffs of
+ files it detects as binary. With -a, diff will generate a diff
+ anyway, probably with undesirable results.
+
+ Use the -g/--git option to generate diffs in the git extended diff
+ format. For more information, read :hg:`help diffs`.
+
+ .. container:: verbose
+
+ Examples:
+
+ - compare a file in the current working directory to its parent::
+
+ hg diff foo.c
+
+ - compare two historical versions of a directory, with rename info::
+
+ hg diff --git -r 1.0:1.2 lib/
+
+ - get change stats relative to the last change on some date::
+
+ hg diff --stat -r "date('may 2')"
+
+ - diff all newly-added files that contain a keyword::
+
+ hg diff "set:added() and grep(GNU)"
+
+ - compare a revision and its parents::
+
+ hg diff -c 9353 # compare against first parent
+ hg diff -r 9353^:9353 # same using revset syntax
+ hg diff -r 9353^2:9353 # compare against the second parent
+
+ Returns 0 on success.
+ """
+
+ revs = opts.get('rev')
+ change = opts.get('change')
+ stat = opts.get('stat')
+ reverse = opts.get('reverse')
+
+ if revs and change:
+ msg = _('cannot specify --rev and --change at the same time')
+ raise util.Abort(msg)
+ elif change:
+ node2 = scmutil.revsingle(repo, change, None).node()
+ node1 = repo[node2].p1().node()
+ else:
+ node1, node2 = scmutil.revpair(repo, revs)
+
+ if reverse:
+ node1, node2 = node2, node1
+
+ diffopts = patch.diffopts(ui, opts)
+ m = scmutil.match(repo[node2], pats, opts)
+ cmdutil.diffordiffstat(ui, repo, diffopts, node1, node2, m, stat=stat,
+ listsubrepos=opts.get('subrepos'))
+
+@command('^export',
+ [('o', 'output', '',
+ _('print output to file with formatted name'), _('FORMAT')),
+ ('', 'switch-parent', None, _('diff against the second parent')),
+ ('r', 'rev', [], _('revisions to export'), _('REV')),
+ ] + diffopts,
+ _('[OPTION]... [-o OUTFILESPEC] [-r] REV...'))
+def export(ui, repo, *changesets, **opts):
+ """dump the header and diffs for one or more changesets
+
+ Print the changeset header and diffs for one or more revisions.
+
+ The information shown in the changeset header is: author, date,
+ branch name (if non-default), changeset hash, parent(s) and commit
+ comment.
+
+ .. note::
+ export may generate unexpected diff output for merge
+ changesets, as it will compare the merge changeset against its
+ first parent only.
+
+ Output may be to a file, in which case the name of the file is
+ given using a format string. The formatting rules are as follows:
+
+ :``%%``: literal "%" character
+ :``%H``: changeset hash (40 hexadecimal digits)
+ :``%N``: number of patches being generated
+ :``%R``: changeset revision number
+ :``%b``: basename of the exporting repository
+ :``%h``: short-form changeset hash (12 hexadecimal digits)
+ :``%m``: first line of the commit message (only alphanumeric characters)
+ :``%n``: zero-padded sequence number, starting at 1
+ :``%r``: zero-padded changeset revision number
+
+ Without the -a/--text option, export will avoid generating diffs
+ of files it detects as binary. With -a, export will generate a
+ diff anyway, probably with undesirable results.
+
+ Use the -g/--git option to generate diffs in the git extended diff
+ format. See :hg:`help diffs` for more information.
+
+ With the --switch-parent option, the diff will be against the
+ second parent. It can be useful to review a merge.
+
+ .. container:: verbose
+
+ Examples:
+
+ - use export and import to transplant a bugfix to the current
+ branch::
+
+ hg export -r 9353 | hg import -
+
+ - export all the changesets between two revisions to a file with
+ rename information::
+
+ hg export --git -r 123:150 > changes.txt
+
+ - split outgoing changes into a series of patches with
+ descriptive names::
+
+ hg export -r "outgoing()" -o "%n-%m.patch"
+
+ Returns 0 on success.
+ """
+ changesets += tuple(opts.get('rev', []))
+ revs = scmutil.revrange(repo, changesets)
+ if not revs:
+ raise util.Abort(_("export requires at least one changeset"))
+ if len(revs) > 1:
+ ui.note(_('exporting patches:\n'))
+ else:
+ ui.note(_('exporting patch:\n'))
+ cmdutil.export(repo, revs, template=opts.get('output'),
+ switch_parent=opts.get('switch_parent'),
+ opts=patch.diffopts(ui, opts))
+
+@command('^forget', walkopts, _('[OPTION]... FILE...'))
+def forget(ui, repo, *pats, **opts):
+ """forget the specified files on the next commit
+
+ Mark the specified files so they will no longer be tracked
+ after the next commit.
+
+ This only removes files from the current branch, not from the
+ entire project history, and it does not delete them from the
+ working directory.
+
+ To undo a forget before the next commit, see :hg:`add`.
+
+ .. container:: verbose
+
+ Examples:
+
+ - forget newly-added binary files::
+
+ hg forget "set:added() and binary()"
+
+ - forget files that would be excluded by .hgignore::
+
+ hg forget "set:hgignore()"
+
+ Returns 0 on success.
+ """
+
+ if not pats:
+ raise util.Abort(_('no files specified'))
+
+ m = scmutil.match(repo[None], pats, opts)
+ rejected = cmdutil.forget(ui, repo, m, prefix="", explicitonly=False)[0]
+ return rejected and 1 or 0
+
+@command(
+ 'graft',
+ [('r', 'rev', [], _('revisions to graft'), _('REV')),
+ ('c', 'continue', False, _('resume interrupted graft')),
+ ('e', 'edit', False, _('invoke editor on commit messages')),
+ ('', 'log', None, _('append graft info to log message')),
+ ('D', 'currentdate', False,
+ _('record the current date as commit date')),
+ ('U', 'currentuser', False,
+ _('record the current user as committer'), _('DATE'))]
+ + commitopts2 + mergetoolopts + dryrunopts,
+ _('[OPTION]... [-r] REV...'))
+def graft(ui, repo, *revs, **opts):
+ '''copy changes from other branches onto the current branch
+
+ This command uses Mercurial's merge logic to copy individual
+ changes from other branches without merging branches in the
+ history graph. This is sometimes known as 'backporting' or
+ 'cherry-picking'. By default, graft will copy user, date, and
+ description from the source changesets.
+
+ Changesets that are ancestors of the current revision, that have
+ already been grafted, or that are merges will be skipped.
+
+ If --log is specified, log messages will have a comment appended
+ of the form::
+
+ (grafted from CHANGESETHASH)
+
+ If a graft merge results in conflicts, the graft process is
+ interrupted so that the current merge can be manually resolved.
+ Once all conflicts are addressed, the graft process can be
+ continued with the -c/--continue option.
+
+ .. note::
+ The -c/--continue option does not reapply earlier options.
+
+ .. container:: verbose
+
+ Examples:
+
+ - copy a single change to the stable branch and edit its description::
+
+ hg update stable
+ hg graft --edit 9393
+
+ - graft a range of changesets with one exception, updating dates::
+
+ hg graft -D "2085::2093 and not 2091"
+
+ - continue a graft after resolving conflicts::
+
+ hg graft -c
+
+ - show the source of a grafted changeset::
+
+ hg log --debug -r tip
+
+ Returns 0 on successful completion.
+ '''
+
+ revs = list(revs)
+ revs.extend(opts['rev'])
+
+ if not opts.get('user') and opts.get('currentuser'):
+ opts['user'] = ui.username()
+ if not opts.get('date') and opts.get('currentdate'):
+ opts['date'] = "%d %d" % util.makedate()
+
+ editor = None
+ if opts.get('edit'):
+ editor = cmdutil.commitforceeditor
+
+ cont = False
+ if opts['continue']:
+ cont = True
+ if revs:
+ raise util.Abort(_("can't specify --continue and revisions"))
+ # read in unfinished revisions
+ try:
+ nodes = repo.opener.read('graftstate').splitlines()
+ revs = [repo[node].rev() for node in nodes]
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ raise util.Abort(_("no graft state found, can't continue"))
+ else:
+ cmdutil.bailifchanged(repo)
+ if not revs:
+ raise util.Abort(_('no revisions specified'))
+ revs = scmutil.revrange(repo, revs)
+
+ # check for merges
+ for rev in repo.revs('%ld and merge()', revs):
+ ui.warn(_('skipping ungraftable merge revision %s\n') % rev)
+ revs.remove(rev)
+ if not revs:
+ return -1
+
+ # check for ancestors of dest branch
+ for rev in repo.revs('::. and %ld', revs):
+ ui.warn(_('skipping ancestor revision %s\n') % rev)
+ revs.remove(rev)
+ if not revs:
+ return -1
+
+ # analyze revs for earlier grafts
+ ids = {}
+ for ctx in repo.set("%ld", revs):
+ ids[ctx.hex()] = ctx.rev()
+ n = ctx.extra().get('source')
+ if n:
+ ids[n] = ctx.rev()
+
+ # check ancestors for earlier grafts
+ ui.debug('scanning for duplicate grafts\n')
+ for ctx in repo.set("::. - ::%ld", revs):
+ n = ctx.extra().get('source')
+ if n in ids:
+ r = repo[n].rev()
+ if r in revs:
+ ui.warn(_('skipping already grafted revision %s\n') % r)
+ revs.remove(r)
+ elif ids[n] in revs:
+ ui.warn(_('skipping already grafted revision %s '
+ '(same origin %d)\n') % (ids[n], r))
+ revs.remove(ids[n])
+ elif ctx.hex() in ids:
+ r = ids[ctx.hex()]
+ ui.warn(_('skipping already grafted revision %s '
+ '(was grafted from %d)\n') % (r, ctx.rev()))
+ revs.remove(r)
+ if not revs:
+ return -1
+
+ wlock = repo.wlock()
+ try:
+ for pos, ctx in enumerate(repo.set("%ld", revs)):
+ current = repo['.']
+
+ ui.status(_('grafting revision %s\n') % ctx.rev())
+ if opts.get('dry_run'):
+ continue
+
+ # we don't merge the first commit when continuing
+ if not cont:
+ # perform the graft merge with p1(rev) as 'ancestor'
+ try:
+ # ui.forcemerge is an internal variable, do not document
+ repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ stats = mergemod.update(repo, ctx.node(), True, True, False,
+ ctx.p1().node())
+ finally:
+ repo.ui.setconfig('ui', 'forcemerge', '')
+ # report any conflicts
+ if stats and stats[3] > 0:
+ # write out state for --continue
+ nodelines = [repo[rev].hex() + "\n" for rev in revs[pos:]]
+ repo.opener.write('graftstate', ''.join(nodelines))
+ raise util.Abort(
+ _("unresolved conflicts, can't continue"),
+ hint=_('use hg resolve and hg graft --continue'))
+ else:
+ cont = False
+
+ # drop the second merge parent
+ repo.setparents(current.node(), nullid)
+ repo.dirstate.write()
+ # fix up dirstate for copies and renames
+ cmdutil.duplicatecopies(repo, ctx.rev(), ctx.p1().rev())
+
+ # commit
+ source = ctx.extra().get('source')
+ if not source:
+ source = ctx.hex()
+ extra = {'source': source}
+ user = ctx.user()
+ if opts.get('user'):
+ user = opts['user']
+ date = ctx.date()
+ if opts.get('date'):
+ date = opts['date']
+ message = ctx.description()
+ if opts.get('log'):
+ message += '\n(grafted from %s)' % ctx.hex()
+ node = repo.commit(text=message, user=user,
+ date=date, extra=extra, editor=editor)
+ if node is None:
+ ui.status(_('graft for revision %s is empty\n') % ctx.rev())
+ finally:
+ wlock.release()
+
+ # remove state when we complete successfully
+ if not opts.get('dry_run') and os.path.exists(repo.join('graftstate')):
+ util.unlinkpath(repo.join('graftstate'))
+
+ return 0
+
+@command('grep',
+ [('0', 'print0', None, _('end fields with NUL')),
+ ('', 'all', None, _('print all revisions that match')),
+ ('a', 'text', None, _('treat all files as text')),
+ ('f', 'follow', None,
+ _('follow changeset history,'
+ ' or file history across copies and renames')),
+ ('i', 'ignore-case', None, _('ignore case when matching')),
+ ('l', 'files-with-matches', None,
+ _('print only filenames and revisions that match')),
+ ('n', 'line-number', None, _('print matching line numbers')),
+ ('r', 'rev', [],
+ _('only search files changed within revision range'), _('REV')),
+ ('u', 'user', None, _('list the author (long with -v)')),
+ ('d', 'date', None, _('list the date (short with -q)')),
+ ] + walkopts,
+ _('[OPTION]... PATTERN [FILE]...'))
+def grep(ui, repo, pattern, *pats, **opts):
+ """search for a pattern in specified files and revisions
+
+ Search revisions of files for a regular expression.
+
+ This command behaves differently than Unix grep. It only accepts
+ Python/Perl regexps. It searches repository history, not the
+ working directory. It always prints the revision number in which a
+ match appears.
+
+ By default, grep only prints output for the first revision of a
+ file in which it finds a match. To get it to print every revision
+ that contains a change in match status ("-" for a match that
+ becomes a non-match, or "+" for a non-match that becomes a match),
+ use the --all flag.
+
+ Returns 0 if a match is found, 1 otherwise.
+ """
+ reflags = re.M
+ if opts.get('ignore_case'):
+ reflags |= re.I
+ try:
+ regexp = re.compile(pattern, reflags)
+ except re.error, inst:
+ ui.warn(_("grep: invalid match pattern: %s\n") % inst)
+ return 1
+ sep, eol = ':', '\n'
+ if opts.get('print0'):
+ sep = eol = '\0'
+
+ getfile = util.lrucachefunc(repo.file)
+
+ def matchlines(body):
+ begin = 0
+ linenum = 0
+ while True:
+ match = regexp.search(body, begin)
+ if not match:
+ break
+ mstart, mend = match.span()
+ linenum += body.count('\n', begin, mstart) + 1
+ lstart = body.rfind('\n', begin, mstart) + 1 or begin
+ begin = body.find('\n', mend) + 1 or len(body) + 1
+ lend = begin - 1
+ yield linenum, mstart - lstart, mend - lstart, body[lstart:lend]
+
+ class linestate(object):
+ def __init__(self, line, linenum, colstart, colend):
+ self.line = line
+ self.linenum = linenum
+ self.colstart = colstart
+ self.colend = colend
+
+ def __hash__(self):
+ return hash((self.linenum, self.line))
+
+ def __eq__(self, other):
+ return self.line == other.line
+
+ matches = {}
+ copies = {}
+ def grepbody(fn, rev, body):
+ matches[rev].setdefault(fn, [])
+ m = matches[rev][fn]
+ for lnum, cstart, cend, line in matchlines(body):
+ s = linestate(line, lnum, cstart, cend)
+ m.append(s)
+
+ def difflinestates(a, b):
+ sm = difflib.SequenceMatcher(None, a, b)
+ for tag, alo, ahi, blo, bhi in sm.get_opcodes():
+ if tag == 'insert':
+ for i in xrange(blo, bhi):
+ yield ('+', b[i])
+ elif tag == 'delete':
+ for i in xrange(alo, ahi):
+ yield ('-', a[i])
+ elif tag == 'replace':
+ for i in xrange(alo, ahi):
+ yield ('-', a[i])
+ for i in xrange(blo, bhi):
+ yield ('+', b[i])
+
+ def display(fn, ctx, pstates, states):
+ rev = ctx.rev()
+ datefunc = ui.quiet and util.shortdate or util.datestr
+ found = False
+ filerevmatches = {}
+ def binary():
+ flog = getfile(fn)
+ return util.binary(flog.read(ctx.filenode(fn)))
+
+ if opts.get('all'):
+ iter = difflinestates(pstates, states)
+ else:
+ iter = [('', l) for l in states]
+ for change, l in iter:
+ cols = [fn, str(rev)]
+ before, match, after = None, None, None
+ if opts.get('line_number'):
+ cols.append(str(l.linenum))
+ if opts.get('all'):
+ cols.append(change)
+ if opts.get('user'):
+ cols.append(ui.shortuser(ctx.user()))
+ if opts.get('date'):
+ cols.append(datefunc(ctx.date()))
+ if opts.get('files_with_matches'):
+ c = (fn, rev)
+ if c in filerevmatches:
+ continue
+ filerevmatches[c] = 1
+ else:
+ before = l.line[:l.colstart]
+ match = l.line[l.colstart:l.colend]
+ after = l.line[l.colend:]
+ ui.write(sep.join(cols))
+ if before is not None:
+ if not opts.get('text') and binary():
+ ui.write(sep + " Binary file matches")
+ else:
+ ui.write(sep + before)
+ ui.write(match, label='grep.match')
+ ui.write(after)
+ ui.write(eol)
+ found = True
+ return found
+
+ skip = {}
+ revfiles = {}
+ matchfn = scmutil.match(repo[None], pats, opts)
+ found = False
+ follow = opts.get('follow')
+
+ def prep(ctx, fns):
+ rev = ctx.rev()
+ pctx = ctx.p1()
+ parent = pctx.rev()
+ matches.setdefault(rev, {})
+ matches.setdefault(parent, {})
+ files = revfiles.setdefault(rev, [])
+ for fn in fns:
+ flog = getfile(fn)
+ try:
+ fnode = ctx.filenode(fn)
+ except error.LookupError:
+ continue
+
+ copied = flog.renamed(fnode)
+ copy = follow and copied and copied[0]
+ if copy:
+ copies.setdefault(rev, {})[fn] = copy
+ if fn in skip:
+ if copy:
+ skip[copy] = True
+ continue
+ files.append(fn)
+
+ if fn not in matches[rev]:
+ grepbody(fn, rev, flog.read(fnode))
+
+ pfn = copy or fn
+ if pfn not in matches[parent]:
+ try:
+ fnode = pctx.filenode(pfn)
+ grepbody(pfn, parent, flog.read(fnode))
+ except error.LookupError:
+ pass
+
+ for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
+ rev = ctx.rev()
+ parent = ctx.p1().rev()
+ for fn in sorted(revfiles.get(rev, [])):
+ states = matches[rev][fn]
+ copy = copies.get(rev, {}).get(fn)
+ if fn in skip:
+ if copy:
+ skip[copy] = True
+ continue
+ pstates = matches.get(parent, {}).get(copy or fn, [])
+ if pstates or states:
+ r = display(fn, ctx, pstates, states)
+ found = found or r
+ if r and not opts.get('all'):
+ skip[fn] = True
+ if copy:
+ skip[copy] = True
+ del matches[rev]
+ del revfiles[rev]
+
+ return not found
+
+@command('heads',
+ [('r', 'rev', '',
+ _('show only heads which are descendants of STARTREV'), _('STARTREV')),
+ ('t', 'topo', False, _('show topological heads only')),
+ ('a', 'active', False, _('show active branchheads only (DEPRECATED)')),
+ ('c', 'closed', False, _('show normal and closed branch heads')),
+ ] + templateopts,
+ _('[-ct] [-r STARTREV] [REV]...'))
+def heads(ui, repo, *branchrevs, **opts):
+ """show current repository heads or show branch heads
+
+ With no arguments, show all repository branch heads.
+
+ Repository "heads" are changesets with no child changesets. They are
+ where development generally takes place and are the usual targets
+ for update and merge operations. Branch heads are changesets that have
+ no child changeset on the same branch.
+
+ If one or more REVs are given, only branch heads on the branches
+ associated with the specified changesets are shown. This means
+ that you can use :hg:`heads foo` to see the heads on a branch
+ named ``foo``.
+
+ If -c/--closed is specified, also show branch heads marked closed
+ (see :hg:`commit --close-branch`).
+
+ If STARTREV is specified, only those heads that are descendants of
+ STARTREV will be displayed.
+
+ If -t/--topo is specified, named branch mechanics will be ignored and only
+ changesets without children will be shown.
+
+ Returns 0 if matching heads are found, 1 if not.
+ """
+
+ start = None
+ if 'rev' in opts:
+ start = scmutil.revsingle(repo, opts['rev'], None).node()
+
+ if opts.get('topo'):
+ heads = [repo[h] for h in repo.heads(start)]
+ else:
+ heads = []
+ for branch in repo.branchmap():
+ heads += repo.branchheads(branch, start, opts.get('closed'))
+ heads = [repo[h] for h in heads]
+
+ if branchrevs:
+ branches = set(repo[br].branch() for br in branchrevs)
+ heads = [h for h in heads if h.branch() in branches]
+
+ if opts.get('active') and branchrevs:
+ dagheads = repo.heads(start)
+ heads = [h for h in heads if h.node() in dagheads]
+
+ if branchrevs:
+ haveheads = set(h.branch() for h in heads)
+ if branches - haveheads:
+ headless = ', '.join(b for b in branches - haveheads)
+ msg = _('no open branch heads found on branches %s')
+ if opts.get('rev'):
+ msg += _(' (started at %s)') % opts['rev']
+ ui.warn((msg + '\n') % headless)
+
+ if not heads:
+ return 1
+
+ heads = sorted(heads, key=lambda x: -x.rev())
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ for ctx in heads:
+ displayer.show(ctx)
+ displayer.close()
+
+@command('help',
+ [('e', 'extension', None, _('show only help for extensions')),
+ ('c', 'command', None, _('show only help for commands')),
+ ('k', 'keyword', '', _('show topics matching keyword')),
+ ],
+ _('[-ec] [TOPIC]'))
+def help_(ui, name=None, unknowncmd=False, full=True, **opts):
+ """show help for a given topic or a help overview
+
+ With no arguments, print a list of commands with short help messages.
+
+ Given a topic, extension, or command name, print help for that
+ topic.
+
+ Returns 0 if successful.
+ """
+
+ textwidth = min(ui.termwidth(), 80) - 2
+
+ def helpcmd(name):
+ try:
+ aliases, entry = cmdutil.findcmd(name, table, strict=unknowncmd)
+ except error.AmbiguousCommand, inst:
+ # py3k fix: except vars can't be used outside the scope of the
+ # except block, nor can be used inside a lambda. python issue4617
+ prefix = inst.args[0]
+ select = lambda c: c.lstrip('^').startswith(prefix)
+ rst = helplist(select)
+ return rst
+
+ rst = []
+
+ # check if it's an invalid alias and display its error if it is
+ if getattr(entry[0], 'badalias', False):
+ if not unknowncmd:
+ ui.pushbuffer()
+ entry[0](ui)
+ rst.append(ui.popbuffer())
+ return rst
+
+ # synopsis
+ if len(entry) > 2:
+ if entry[2].startswith('hg'):
+ rst.append("%s\n" % entry[2])
+ else:
+ rst.append('hg %s %s\n' % (aliases[0], entry[2]))
+ else:
+ rst.append('hg %s\n' % aliases[0])
+ # aliases
+ if full and not ui.quiet and len(aliases) > 1:
+ rst.append(_("\naliases: %s\n") % ', '.join(aliases[1:]))
+ rst.append('\n')
+
+ # description
+ doc = gettext(entry[0].__doc__)
+ if not doc:
+ doc = _("(no help text available)")
+ if util.safehasattr(entry[0], 'definition'): # aliased command
+ if entry[0].definition.startswith('!'): # shell alias
+ doc = _('shell alias for::\n\n %s') % entry[0].definition[1:]
+ else:
+ doc = _('alias for: hg %s\n\n%s') % (entry[0].definition, doc)
+ doc = doc.splitlines(True)
+ if ui.quiet or not full:
+ rst.append(doc[0])
+ else:
+ rst.extend(doc)
+ rst.append('\n')
+
+ # check if this command shadows a non-trivial (multi-line)
+ # extension help text
+ try:
+ mod = extensions.find(name)
+ doc = gettext(mod.__doc__) or ''
+ if '\n' in doc.strip():
+ msg = _('use "hg help -e %s" to show help for '
+ 'the %s extension') % (name, name)
+ rst.append('\n%s\n' % msg)
+ except KeyError:
+ pass
+
+ # options
+ if not ui.quiet and entry[1]:
+ rst.append('\n%s\n\n' % _("options:"))
+ rst.append(help.optrst(entry[1], ui.verbose))
+
+ if ui.verbose:
+ rst.append('\n%s\n\n' % _("global options:"))
+ rst.append(help.optrst(globalopts, ui.verbose))
+
+ if not ui.verbose:
+ if not full:
+ rst.append(_('\nuse "hg help %s" to show the full help text\n')
+ % name)
+ elif not ui.quiet:
+ rst.append(_('\nuse "hg -v help %s" to show more info\n')
+ % name)
+ return rst
+
+
+ def helplist(select=None):
+ # list of commands
+ if name == "shortlist":
+ header = _('basic commands:\n\n')
+ else:
+ header = _('list of commands:\n\n')
+
+ h = {}
+ cmds = {}
+ for c, e in table.iteritems():
+ f = c.split("|", 1)[0]
+ if select and not select(f):
+ continue
+ if (not select and name != 'shortlist' and
+ e[0].__module__ != __name__):
+ continue
+ if name == "shortlist" and not f.startswith("^"):
+ continue
+ f = f.lstrip("^")
+ if not ui.debugflag and f.startswith("debug"):
+ continue
+ doc = e[0].__doc__
+ if doc and 'DEPRECATED' in doc and not ui.verbose:
+ continue
+ doc = gettext(doc)
+ if not doc:
+ doc = _("(no help text available)")
+ h[f] = doc.splitlines()[0].rstrip()
+ cmds[f] = c.lstrip("^")
+
+ rst = []
+ if not h:
+ if not ui.quiet:
+ rst.append(_('no commands defined\n'))
+ return rst
+
+ if not ui.quiet:
+ rst.append(header)
+ fns = sorted(h)
+ for f in fns:
+ if ui.verbose:
+ commands = cmds[f].replace("|",", ")
+ rst.append(" :%s: %s\n" % (commands, h[f]))
+ else:
+ rst.append(' :%s: %s\n' % (f, h[f]))
+
+ if not name:
+ exts = help.listexts(_('enabled extensions:'), extensions.enabled())
+ if exts:
+ rst.append('\n')
+ rst.extend(exts)
+
+ rst.append(_("\nadditional help topics:\n\n"))
+ topics = []
+ for names, header, doc in help.helptable:
+ topics.append((names[0], header))
+ for t, desc in topics:
+ rst.append(" :%s: %s\n" % (t, desc))
+
+ optlist = []
+ if not ui.quiet:
+ if ui.verbose:
+ optlist.append((_("global options:"), globalopts))
+ if name == 'shortlist':
+ optlist.append((_('use "hg help" for the full list '
+ 'of commands'), ()))
+ else:
+ if name == 'shortlist':
+ msg = _('use "hg help" for the full list of commands '
+ 'or "hg -v" for details')
+ elif name and not full:
+ msg = _('use "hg help %s" to show the full help '
+ 'text') % name
+ else:
+ msg = _('use "hg -v help%s" to show builtin aliases and '
+ 'global options') % (name and " " + name or "")
+ optlist.append((msg, ()))
+
+ if optlist:
+ for title, options in optlist:
+ rst.append('\n%s\n' % title)
+ if options:
+ rst.append('\n%s\n' % help.optrst(options, ui.verbose))
+ return rst
+
+ def helptopic(name):
+ for names, header, doc in help.helptable:
+ if name in names:
+ break
+ else:
+ raise error.UnknownCommand(name)
+
+ rst = ["%s\n\n" % header]
+ # description
+ if not doc:
+ rst.append(" %s\n" % _("(no help text available)"))
+ if util.safehasattr(doc, '__call__'):
+ rst += [" %s\n" % l for l in doc().splitlines()]
+
+ try:
+ cmdutil.findcmd(name, table)
+ rst.append(_('\nuse "hg help -c %s" to see help for '
+ 'the %s command\n') % (name, name))
+ except error.UnknownCommand:
+ pass
+ return rst
+
+ def helpext(name):
+ try:
+ mod = extensions.find(name)
+ doc = gettext(mod.__doc__) or _('no help text available')
+ except KeyError:
+ mod = None
+ doc = extensions.disabledext(name)
+ if not doc:
+ raise error.UnknownCommand(name)
+
+ if '\n' not in doc:
+ head, tail = doc, ""
+ else:
+ head, tail = doc.split('\n', 1)
+ rst = [_('%s extension - %s\n\n') % (name.split('.')[-1], head)]
+ if tail:
+ rst.extend(tail.splitlines(True))
+ rst.append('\n')
+
+ if mod:
+ try:
+ ct = mod.cmdtable
+ except AttributeError:
+ ct = {}
+ modcmds = set([c.split('|', 1)[0] for c in ct])
+ rst.extend(helplist(modcmds.__contains__))
+ else:
+ rst.append(_('use "hg help extensions" for information on enabling '
+ 'extensions\n'))
+ return rst
+
+ def helpextcmd(name):
+ cmd, ext, mod = extensions.disabledcmd(ui, name,
+ ui.configbool('ui', 'strict'))
+ doc = gettext(mod.__doc__).splitlines()[0]
+
+ rst = help.listexts(_("'%s' is provided by the following "
+ "extension:") % cmd, {ext: doc}, indent=4)
+ rst.append('\n')
+ rst.append(_('use "hg help extensions" for information on enabling '
+ 'extensions\n'))
+ return rst
+
+
+ rst = []
+ kw = opts.get('keyword')
+ if kw:
+ matches = help.topicmatch(kw)
+ for t, title in (('topics', _('Topics')),
+ ('commands', _('Commands')),
+ ('extensions', _('Extensions')),
+ ('extensioncommands', _('Extension Commands'))):
+ if matches[t]:
+ rst.append('%s:\n\n' % title)
+ rst.extend(minirst.maketable(sorted(matches[t]), 1))
+ rst.append('\n')
+ elif name and name != 'shortlist':
+ i = None
+ if unknowncmd:
+ queries = (helpextcmd,)
+ elif opts.get('extension'):
+ queries = (helpext,)
+ elif opts.get('command'):
+ queries = (helpcmd,)
+ else:
+ queries = (helptopic, helpcmd, helpext, helpextcmd)
+ for f in queries:
+ try:
+ rst = f(name)
+ i = None
+ break
+ except error.UnknownCommand, inst:
+ i = inst
+ if i:
+ raise i
+ else:
+ # program name
+ if not ui.quiet:
+ rst = [_("Mercurial Distributed SCM\n"), '\n']
+ rst.extend(helplist())
+
+ keep = ui.verbose and ['verbose'] or []
+ formatted, pruned = minirst.format(''.join(rst), textwidth, keep=keep)
+ ui.write(formatted)
+
+
+@command('identify|id',
+ [('r', 'rev', '',
+ _('identify the specified revision'), _('REV')),
+ ('n', 'num', None, _('show local revision number')),
+ ('i', 'id', None, _('show global revision id')),
+ ('b', 'branch', None, _('show branch')),
+ ('t', 'tags', None, _('show tags')),
+ ('B', 'bookmarks', None, _('show bookmarks')),
+ ] + remoteopts,
+ _('[-nibtB] [-r REV] [SOURCE]'))
+def identify(ui, repo, source=None, rev=None,
+ num=None, id=None, branch=None, tags=None, bookmarks=None, **opts):
+ """identify the working copy or specified revision
+
+ Print a summary identifying the repository state at REV using one or
+ two parent hash identifiers, followed by a "+" if the working
+ directory has uncommitted changes, the branch name (if not default),
+ a list of tags, and a list of bookmarks.
+
+ When REV is not given, print a summary of the current state of the
+ repository.
+
+ Specifying a path to a repository root or Mercurial bundle will
+ cause lookup to operate on that repository/bundle.
+
+ .. container:: verbose
+
+ Examples:
+
+ - generate a build identifier for the working directory::
+
+ hg id --id > build-id.dat
+
+ - find the revision corresponding to a tag::
+
+ hg id -n -r 1.3
+
+ - check the most recent revision of a remote repository::
+
+ hg id -r tip http://selenic.com/hg/
+
+ Returns 0 if successful.
+ """
+
+ if not repo and not source:
+ raise util.Abort(_("there is no Mercurial repository here "
+ "(.hg not found)"))
+
+ hexfunc = ui.debugflag and hex or short
+ default = not (num or id or branch or tags or bookmarks)
+ output = []
+ revs = []
+
+ if source:
+ source, branches = hg.parseurl(ui.expandpath(source))
+ peer = hg.peer(ui, opts, source)
+ repo = peer.local()
+ revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
+
+ if not repo:
+ if num or branch or tags:
+ raise util.Abort(
+ _("can't query remote revision number, branch, or tags"))
+ if not rev and revs:
+ rev = revs[0]
+ if not rev:
+ rev = "tip"
+
+ remoterev = peer.lookup(rev)
+ if default or id:
+ output = [hexfunc(remoterev)]
+
+ def getbms():
+ bms = []
+
+ if 'bookmarks' in peer.listkeys('namespaces'):
+ hexremoterev = hex(remoterev)
+ bms = [bm for bm, bmr in peer.listkeys('bookmarks').iteritems()
+ if bmr == hexremoterev]
+
+ return bms
+
+ if bookmarks:
+ output.extend(getbms())
+ elif default and not ui.quiet:
+ # multiple bookmarks for a single parent separated by '/'
+ bm = '/'.join(getbms())
+ if bm:
+ output.append(bm)
+ else:
+ if not rev:
+ ctx = repo[None]
+ parents = ctx.parents()
+ changed = ""
+ if default or id or num:
+ if (util.any(repo.status())
+ or util.any(ctx.sub(s).dirty() for s in ctx.substate)):
+ changed = '+'
+ if default or id:
+ output = ["%s%s" %
+ ('+'.join([hexfunc(p.node()) for p in parents]), changed)]
+ if num:
+ output.append("%s%s" %
+ ('+'.join([str(p.rev()) for p in parents]), changed))
+ else:
+ ctx = scmutil.revsingle(repo, rev)
+ if default or id:
+ output = [hexfunc(ctx.node())]
+ if num:
+ output.append(str(ctx.rev()))
+
+ if default and not ui.quiet:
+ b = ctx.branch()
+ if b != 'default':
+ output.append("(%s)" % b)
+
+ # multiple tags for a single parent separated by '/'
+ t = '/'.join(ctx.tags())
+ if t:
+ output.append(t)
+
+ # multiple bookmarks for a single parent separated by '/'
+ bm = '/'.join(ctx.bookmarks())
+ if bm:
+ output.append(bm)
+ else:
+ if branch:
+ output.append(ctx.branch())
+
+ if tags:
+ output.extend(ctx.tags())
+
+ if bookmarks:
+ output.extend(ctx.bookmarks())
+
+ ui.write("%s\n" % ' '.join(output))
+
+@command('import|patch',
+ [('p', 'strip', 1,
+ _('directory strip option for patch. This has the same '
+ 'meaning as the corresponding patch option'), _('NUM')),
+ ('b', 'base', '', _('base path (DEPRECATED)'), _('PATH')),
+ ('e', 'edit', False, _('invoke editor on commit messages')),
+ ('f', 'force', None, _('skip check for outstanding uncommitted changes')),
+ ('', 'no-commit', None,
+ _("don't commit, just update the working directory")),
+ ('', 'bypass', None,
+ _("apply patch without touching the working directory")),
+ ('', 'exact', None,
+ _('apply patch to the nodes from which it was generated')),
+ ('', 'import-branch', None,
+ _('use any branch information in patch (implied by --exact)'))] +
+ commitopts + commitopts2 + similarityopts,
+ _('[OPTION]... PATCH...'))
+def import_(ui, repo, patch1=None, *patches, **opts):
+ """import an ordered set of patches
+
+ Import a list of patches and commit them individually (unless
+ --no-commit is specified).
+
+ If there are outstanding changes in the working directory, import
+ will abort unless given the -f/--force flag.
+
+ You can import a patch straight from a mail message. Even patches
+ as attachments work (to use the body part, it must have type
+ text/plain or text/x-patch). From and Subject headers of email
+ message are used as default committer and commit message. All
+ text/plain body parts before first diff are added to commit
+ message.
+
+ If the imported patch was generated by :hg:`export`, user and
+ description from patch override values from message headers and
+ body. Values given on command line with -m/--message and -u/--user
+ override these.
+
+ If --exact is specified, import will set the working directory to
+ the parent of each patch before applying it, and will abort if the
+ resulting changeset has a different ID than the one recorded in
+ the patch. This may happen due to character set problems or other
+ deficiencies in the text patch format.
+
+ Use --bypass to apply and commit patches directly to the
+ repository, not touching the working directory. Without --exact,
+ patches will be applied on top of the working directory parent
+ revision.
+
+ With -s/--similarity, hg will attempt to discover renames and
+ copies in the patch in the same way as :hg:`addremove`.
+
+ To read a patch from standard input, use "-" as the patch name. If
+ a URL is specified, the patch will be downloaded from it.
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ .. container:: verbose
+
+ Examples:
+
+ - import a traditional patch from a website and detect renames::
+
+ hg import -s 80 http://example.com/bugfix.patch
+
+ - import a changeset from an hgweb server::
+
+ hg import http://www.selenic.com/hg/rev/5ca8c111e9aa
+
+ - import all the patches in an Unix-style mbox::
+
+ hg import incoming-patches.mbox
+
+ - attempt to exactly restore an exported changeset (not always
+ possible)::
+
+ hg import --exact proposed-fix.patch
+
+ Returns 0 on success.
+ """
+
+ if not patch1:
+ raise util.Abort(_('need at least one patch to import'))
+
+ patches = (patch1,) + patches
+
+ date = opts.get('date')
+ if date:
+ opts['date'] = util.parsedate(date)
+
+ editor = cmdutil.commiteditor
+ if opts.get('edit'):
+ editor = cmdutil.commitforceeditor
+
+ update = not opts.get('bypass')
+ if not update and opts.get('no_commit'):
+ raise util.Abort(_('cannot use --no-commit with --bypass'))
+ try:
+ sim = float(opts.get('similarity') or 0)
+ except ValueError:
+ raise util.Abort(_('similarity must be a number'))
+ if sim < 0 or sim > 100:
+ raise util.Abort(_('similarity must be between 0 and 100'))
+ if sim and not update:
+ raise util.Abort(_('cannot use --similarity with --bypass'))
+
+ if (opts.get('exact') or not opts.get('force')) and update:
+ cmdutil.bailifchanged(repo)
+
+ base = opts["base"]
+ strip = opts["strip"]
+ wlock = lock = tr = None
+ msgs = []
+
+ def checkexact(repo, n, nodeid):
+ if opts.get('exact') and hex(n) != nodeid:
+ repo.rollback()
+ raise util.Abort(_('patch is damaged or loses information'))
+
+ def tryone(ui, hunk, parents):
+ tmpname, message, user, date, branch, nodeid, p1, p2 = \
+ patch.extract(ui, hunk)
+
+ if not tmpname:
+ return (None, None)
+ msg = _('applied to working directory')
+
+ try:
+ cmdline_message = cmdutil.logmessage(ui, opts)
+ if cmdline_message:
+ # pickup the cmdline msg
+ message = cmdline_message
+ elif message:
+ # pickup the patch msg
+ message = message.strip()
+ else:
+ # launch the editor
+ message = None
+ ui.debug('message:\n%s\n' % message)
+
+ if len(parents) == 1:
+ parents.append(repo[nullid])
+ if opts.get('exact'):
+ if not nodeid or not p1:
+ raise util.Abort(_('not a Mercurial patch'))
+ p1 = repo[p1]
+ p2 = repo[p2 or nullid]
+ elif p2:
+ try:
+ p1 = repo[p1]
+ p2 = repo[p2]
+ # Without any options, consider p2 only if the
+ # patch is being applied on top of the recorded
+ # first parent.
+ if p1 != parents[0]:
+ p1 = parents[0]
+ p2 = repo[nullid]
+ except error.RepoError:
+ p1, p2 = parents
+ else:
+ p1, p2 = parents
+
+ n = None
+ if update:
+ if p1 != parents[0]:
+ hg.clean(repo, p1.node())
+ if p2 != parents[1]:
+ repo.setparents(p1.node(), p2.node())
+
+ if opts.get('exact') or opts.get('import_branch'):
+ repo.dirstate.setbranch(branch or 'default')
+
+ files = set()
+ patch.patch(ui, repo, tmpname, strip=strip, files=files,
+ eolmode=None, similarity=sim / 100.0)
+ files = list(files)
+ if opts.get('no_commit'):
+ if message:
+ msgs.append(message)
+ else:
+ if opts.get('exact') or p2:
+ # If you got here, you either use --force and know what
+ # you are doing or used --exact or a merge patch while
+ # being updated to its first parent.
+ m = None
+ else:
+ m = scmutil.matchfiles(repo, files or [])
+ n = repo.commit(message, opts.get('user') or user,
+ opts.get('date') or date, match=m,
+ editor=editor)
+ checkexact(repo, n, nodeid)
+ else:
+ if opts.get('exact') or opts.get('import_branch'):
+ branch = branch or 'default'
+ else:
+ branch = p1.branch()
+ store = patch.filestore()
+ try:
+ files = set()
+ try:
+ patch.patchrepo(ui, repo, p1, store, tmpname, strip,
+ files, eolmode=None)
+ except patch.PatchError, e:
+ raise util.Abort(str(e))
+ memctx = patch.makememctx(repo, (p1.node(), p2.node()),
+ message,
+ opts.get('user') or user,
+ opts.get('date') or date,
+ branch, files, store,
+ editor=cmdutil.commiteditor)
+ repo.savecommitmessage(memctx.description())
+ n = memctx.commit()
+ checkexact(repo, n, nodeid)
+ finally:
+ store.close()
+ if n:
+ # i18n: refers to a short changeset id
+ msg = _('created %s') % short(n)
+ return (msg, n)
+ finally:
+ os.unlink(tmpname)
+
+ try:
+ try:
+ wlock = repo.wlock()
+ if not opts.get('no_commit'):
+ lock = repo.lock()
+ tr = repo.transaction('import')
+ parents = repo.parents()
+ for patchurl in patches:
+ if patchurl == '-':
+ ui.status(_('applying patch from stdin\n'))
+ patchfile = ui.fin
+ patchurl = 'stdin' # for error message
+ else:
+ patchurl = os.path.join(base, patchurl)
+ ui.status(_('applying %s\n') % patchurl)
+ patchfile = url.open(ui, patchurl)
+
+ haspatch = False
+ for hunk in patch.split(patchfile):
+ (msg, node) = tryone(ui, hunk, parents)
+ if msg:
+ haspatch = True
+ ui.note(msg + '\n')
+ if update or opts.get('exact'):
+ parents = repo.parents()
+ else:
+ parents = [repo[node]]
+
+ if not haspatch:
+ raise util.Abort(_('%s: no diffs found') % patchurl)
+
+ if tr:
+ tr.close()
+ if msgs:
+ repo.savecommitmessage('\n* * *\n'.join(msgs))
+ except: # re-raises
+ # wlock.release() indirectly calls dirstate.write(): since
+ # we're crashing, we do not want to change the working dir
+ # parent after all, so make sure it writes nothing
+ repo.dirstate.invalidate()
+ raise
+ finally:
+ if tr:
+ tr.release()
+ release(lock, wlock)
+
+@command('incoming|in',
+ [('f', 'force', None,
+ _('run even if remote repository is unrelated')),
+ ('n', 'newest-first', None, _('show newest record first')),
+ ('', 'bundle', '',
+ _('file to store the bundles into'), _('FILE')),
+ ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
+ ('B', 'bookmarks', False, _("compare bookmarks")),
+ ('b', 'branch', [],
+ _('a specific branch you would like to pull'), _('BRANCH')),
+ ] + logopts + remoteopts + subrepoopts,
+ _('[-p] [-n] [-M] [-f] [-r REV]... [--bundle FILENAME] [SOURCE]'))
+def incoming(ui, repo, source="default", **opts):
+ """show new changesets found in source
+
+ Show new changesets found in the specified path/URL or the default
+ pull location. These are the changesets that would have been pulled
+ if a pull at the time you issued this command.
+
+ For remote repository, using --bundle avoids downloading the
+ changesets twice if the incoming is followed by a pull.
+
+ See pull for valid source format details.
+
+ Returns 0 if there are incoming changes, 1 otherwise.
+ """
+ if opts.get('graph'):
+ cmdutil.checkunsupportedgraphflags([], opts)
+ def display(other, chlist, displayer):
+ revdag = cmdutil.graphrevs(other, chlist, opts)
+ showparents = [ctx.node() for ctx in repo[None].parents()]
+ cmdutil.displaygraph(ui, revdag, displayer, showparents,
+ graphmod.asciiedges)
+
+ hg._incoming(display, lambda: 1, ui, repo, source, opts, buffered=True)
+ return 0
+
+ if opts.get('bundle') and opts.get('subrepos'):
+ raise util.Abort(_('cannot combine --bundle and --subrepos'))
+
+ if opts.get('bookmarks'):
+ source, branches = hg.parseurl(ui.expandpath(source),
+ opts.get('branch'))
+ other = hg.peer(repo, opts, source)
+ if 'bookmarks' not in other.listkeys('namespaces'):
+ ui.warn(_("remote doesn't support bookmarks\n"))
+ return 0
+ ui.status(_('comparing with %s\n') % util.hidepassword(source))
+ return bookmarks.diff(ui, repo, other)
+
+ repo._subtoppath = ui.expandpath(source)
+ try:
+ return hg.incoming(ui, repo, source, opts)
+ finally:
+ del repo._subtoppath
+
+
+@command('^init', remoteopts, _('[-e CMD] [--remotecmd CMD] [DEST]'))
+def init(ui, dest=".", **opts):
+ """create a new repository in the given directory
+
+ Initialize a new repository in the given directory. If the given
+ directory does not exist, it will be created.
+
+ If no directory is given, the current directory is used.
+
+ It is possible to specify an ``ssh://`` URL as the destination.
+ See :hg:`help urls` for more information.
+
+ Returns 0 on success.
+ """
+ hg.peer(ui, opts, ui.expandpath(dest), create=True)
+
+@command('locate',
+ [('r', 'rev', '', _('search the repository as it is in REV'), _('REV')),
+ ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
+ ('f', 'fullpath', None, _('print complete paths from the filesystem root')),
+ ] + walkopts,
+ _('[OPTION]... [PATTERN]...'))
+def locate(ui, repo, *pats, **opts):
+ """locate files matching specific patterns
+
+ Print files under Mercurial control in the working directory whose
+ names match the given patterns.
+
+ By default, this command searches all directories in the working
+ directory. To search just the current directory and its
+ subdirectories, use "--include .".
+
+ If no patterns are given to match, this command prints the names
+ of all files under Mercurial control in the working directory.
+
+ If you want to feed the output of this command into the "xargs"
+ command, use the -0 option to both this command and "xargs". This
+ will avoid the problem of "xargs" treating single filenames that
+ contain whitespace as multiple filenames.
+
+ Returns 0 if a match is found, 1 otherwise.
+ """
+ end = opts.get('print0') and '\0' or '\n'
+ rev = scmutil.revsingle(repo, opts.get('rev'), None).node()
+
+ ret = 1
+ m = scmutil.match(repo[rev], pats, opts, default='relglob')
+ m.bad = lambda x, y: False
+ for abs in repo[rev].walk(m):
+ if not rev and abs not in repo.dirstate:
+ continue
+ if opts.get('fullpath'):
+ ui.write(repo.wjoin(abs), end)
+ else:
+ ui.write(((pats and m.rel(abs)) or abs), end)
+ ret = 0
+
+ return ret
+
+@command('^log|history',
+ [('f', 'follow', None,
+ _('follow changeset history, or file history across copies and renames')),
+ ('', 'follow-first', None,
+ _('only follow the first parent of merge changesets (DEPRECATED)')),
+ ('d', 'date', '', _('show revisions matching date spec'), _('DATE')),
+ ('C', 'copies', None, _('show copied files')),
+ ('k', 'keyword', [],
+ _('do case-insensitive search for a given text'), _('TEXT')),
+ ('r', 'rev', [], _('show the specified revision or range'), _('REV')),
+ ('', 'removed', None, _('include revisions where files were removed')),
+ ('m', 'only-merges', None, _('show only merges (DEPRECATED)')),
+ ('u', 'user', [], _('revisions committed by user'), _('USER')),
+ ('', 'only-branch', [],
+ _('show only changesets within the given named branch (DEPRECATED)'),
+ _('BRANCH')),
+ ('b', 'branch', [],
+ _('show changesets within the given named branch'), _('BRANCH')),
+ ('P', 'prune', [],
+ _('do not display revision or any of its ancestors'), _('REV')),
+ ('', 'hidden', False, _('show hidden changesets (DEPRECATED)')),
+ ] + logopts + walkopts,
+ _('[OPTION]... [FILE]'))
+def log(ui, repo, *pats, **opts):
+ """show revision history of entire repository or files
+
+ Print the revision history of the specified files or the entire
+ project.
+
+ If no revision range is specified, the default is ``tip:0`` unless
+ --follow is set, in which case the working directory parent is
+ used as the starting revision.
+
+ File history is shown without following rename or copy history of
+ files. Use -f/--follow with a filename to follow history across
+ renames and copies. --follow without a filename will only show
+ ancestors or descendants of the starting revision.
+
+ By default this command prints revision number and changeset id,
+ tags, non-trivial parents, user, date and time, and a summary for
+ each commit. When the -v/--verbose switch is used, the list of
+ changed files and full commit message are shown.
+
+ .. note::
+ log -p/--patch may generate unexpected diff output for merge
+ changesets, as it will only compare the merge changeset against
+ its first parent. Also, only files different from BOTH parents
+ will appear in files:.
+
+ .. note::
+ for performance reasons, log FILE may omit duplicate changes
+ made on branches and will not show deletions. To see all
+ changes including duplicates and deletions, use the --removed
+ switch.
+
+ .. container:: verbose
+
+ Some examples:
+
+ - changesets with full descriptions and file lists::
+
+ hg log -v
+
+ - changesets ancestral to the working directory::
+
+ hg log -f
+
+ - last 10 commits on the current branch::
+
+ hg log -l 10 -b .
+
+ - changesets showing all modifications of a file, including removals::
+
+ hg log --removed file.c
+
+ - all changesets that touch a directory, with diffs, excluding merges::
+
+ hg log -Mp lib/
+
+ - all revision numbers that match a keyword::
+
+ hg log -k bug --template "{rev}\\n"
+
+ - check if a given changeset is included is a tagged release::
+
+ hg log -r "a21ccf and ancestor(1.9)"
+
+ - find all changesets by some user in a date range::
+
+ hg log -k alice -d "may 2008 to jul 2008"
+
+ - summary of all changesets after the last tag::
+
+ hg log -r "last(tagged())::" --template "{desc|firstline}\\n"
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ See :hg:`help revisions` and :hg:`help revsets` for more about
+ specifying revisions.
+
+ See :hg:`help templates` for more about pre-packaged styles and
+ specifying custom templates.
+
+ Returns 0 on success.
+ """
+ if opts.get('graph'):
+ return cmdutil.graphlog(ui, repo, *pats, **opts)
+
+ matchfn = scmutil.match(repo[None], pats, opts)
+ limit = cmdutil.loglimit(opts)
+ count = 0
+
+ getrenamed, endrev = None, None
+ if opts.get('copies'):
+ if opts.get('rev'):
+ endrev = max(scmutil.revrange(repo, opts.get('rev'))) + 1
+ getrenamed = templatekw.getrenamedfn(repo, endrev=endrev)
+
+ df = False
+ if opts.get("date"):
+ df = util.matchdate(opts["date"])
+
+ branches = opts.get('branch', []) + opts.get('only_branch', [])
+ opts['branch'] = [repo.lookupbranch(b) for b in branches]
+
+ displayer = cmdutil.show_changeset(ui, repo, opts, True)
+ def prep(ctx, fns):
+ rev = ctx.rev()
+ parents = [p for p in repo.changelog.parentrevs(rev)
+ if p != nullrev]
+ if opts.get('no_merges') and len(parents) == 2:
+ return
+ if opts.get('only_merges') and len(parents) != 2:
+ return
+ if opts.get('branch') and ctx.branch() not in opts['branch']:
+ return
+ if not opts.get('hidden') and ctx.hidden():
+ return
+ if df and not df(ctx.date()[0]):
+ return
+
+ lower = encoding.lower
+ if opts.get('user'):
+ luser = lower(ctx.user())
+ for k in [lower(x) for x in opts['user']]:
+ if (k in luser):
+ break
+ else:
+ return
+ if opts.get('keyword'):
+ luser = lower(ctx.user())
+ ldesc = lower(ctx.description())
+ lfiles = lower(" ".join(ctx.files()))
+ for k in [lower(x) for x in opts['keyword']]:
+ if (k in luser or k in ldesc or k in lfiles):
+ break
+ else:
+ return
+
+ copies = None
+ if getrenamed is not None and rev:
+ copies = []
+ for fn in ctx.files():
+ rename = getrenamed(fn, rev)
+ if rename:
+ copies.append((fn, rename[0]))
+
+ revmatchfn = None
+ if opts.get('patch') or opts.get('stat'):
+ if opts.get('follow') or opts.get('follow_first'):
+ # note: this might be wrong when following through merges
+ revmatchfn = scmutil.match(repo[None], fns, default='path')
+ else:
+ revmatchfn = matchfn
+
+ displayer.show(ctx, copies=copies, matchfn=revmatchfn)
+
+ for ctx in cmdutil.walkchangerevs(repo, matchfn, opts, prep):
+ if count == limit:
+ break
+ if displayer.flush(ctx.rev()):
+ count += 1
+ displayer.close()
+
+@command('manifest',
+ [('r', 'rev', '', _('revision to display'), _('REV')),
+ ('', 'all', False, _("list files from all revisions"))],
+ _('[-r REV]'))
+def manifest(ui, repo, node=None, rev=None, **opts):
+ """output the current or given revision of the project manifest
+
+ Print a list of version controlled files for the given revision.
+ If no revision is given, the first parent of the working directory
+ is used, or the null revision if no revision is checked out.
+
+ With -v, print file permissions, symlink and executable bits.
+ With --debug, print file revision hashes.
+
+ If option --all is specified, the list of all files from all revisions
+ is printed. This includes deleted and renamed files.
+
+ Returns 0 on success.
+ """
+ if opts.get('all'):
+ if rev or node:
+ raise util.Abort(_("can't specify a revision with --all"))
+
+ res = []
+ prefix = "data/"
+ suffix = ".i"
+ plen = len(prefix)
+ slen = len(suffix)
+ lock = repo.lock()
+ try:
+ for fn, b, size in repo.store.datafiles():
+ if size != 0 and fn[-slen:] == suffix and fn[:plen] == prefix:
+ res.append(fn[plen:-slen])
+ finally:
+ lock.release()
+ for f in sorted(res):
+ ui.write("%s\n" % f)
+ return
+
+ if rev and node:
+ raise util.Abort(_("please specify just one revision"))
+
+ if not node:
+ node = rev
+
+ decor = {'l':'644 @ ', 'x':'755 * ', '':'644 '}
+ ctx = scmutil.revsingle(repo, node)
+ for f in ctx:
+ if ui.debugflag:
+ ui.write("%40s " % hex(ctx.manifest()[f]))
+ if ui.verbose:
+ ui.write(decor[ctx.flags(f)])
+ ui.write("%s\n" % f)
+
+@command('^merge',
+ [('f', 'force', None, _('force a merge with outstanding changes')),
+ ('r', 'rev', '', _('revision to merge'), _('REV')),
+ ('P', 'preview', None,
+ _('review revisions to merge (no merge is performed)'))
+ ] + mergetoolopts,
+ _('[-P] [-f] [[-r] REV]'))
+def merge(ui, repo, node=None, **opts):
+ """merge working directory with another revision
+
+ The current working directory is updated with all changes made in
+ the requested revision since the last common predecessor revision.
+
+ Files that changed between either parent are marked as changed for
+ the next commit and a commit must be performed before any further
+ updates to the repository are allowed. The next commit will have
+ two parents.
+
+ ``--tool`` can be used to specify the merge tool used for file
+ merges. It overrides the HGMERGE environment variable and your
+ configuration files. See :hg:`help merge-tools` for options.
+
+ If no revision is specified, the working directory's parent is a
+ head revision, and the current branch contains exactly one other
+ head, the other head is merged with by default. Otherwise, an
+ explicit revision with which to merge with must be provided.
+
+ :hg:`resolve` must be used to resolve unresolved files.
+
+ To undo an uncommitted merge, use :hg:`update --clean .` which
+ will check out a clean copy of the original merge parent, losing
+ all changes.
+
+ Returns 0 on success, 1 if there are unresolved files.
+ """
+
+ if opts.get('rev') and node:
+ raise util.Abort(_("please specify just one revision"))
+ if not node:
+ node = opts.get('rev')
+
+ if node:
+ node = scmutil.revsingle(repo, node).node()
+
+ if not node and repo._bookmarkcurrent:
+ bmheads = repo.bookmarkheads(repo._bookmarkcurrent)
+ curhead = repo[repo._bookmarkcurrent]
+ if len(bmheads) == 2:
+ if curhead == bmheads[0]:
+ node = bmheads[1]
+ else:
+ node = bmheads[0]
+ elif len(bmheads) > 2:
+ raise util.Abort(_("multiple matching bookmarks to merge - "
+ "please merge with an explicit rev or bookmark"),
+ hint=_("run 'hg heads' to see all heads"))
+ elif len(bmheads) <= 1:
+ raise util.Abort(_("no matching bookmark to merge - "
+ "please merge with an explicit rev or bookmark"),
+ hint=_("run 'hg heads' to see all heads"))
+
+ if not node and not repo._bookmarkcurrent:
+ branch = repo[None].branch()
+ bheads = repo.branchheads(branch)
+ nbhs = [bh for bh in bheads if not repo[bh].bookmarks()]
+
+ if len(nbhs) > 2:
+ raise util.Abort(_("branch '%s' has %d heads - "
+ "please merge with an explicit rev")
+ % (branch, len(bheads)),
+ hint=_("run 'hg heads .' to see heads"))
+
+ parent = repo.dirstate.p1()
+ if len(nbhs) == 1:
+ if len(bheads) > 1:
+ raise util.Abort(_("heads are bookmarked - "
+ "please merge with an explicit rev"),
+ hint=_("run 'hg heads' to see all heads"))
+ if len(repo.heads()) > 1:
+ raise util.Abort(_("branch '%s' has one head - "
+ "please merge with an explicit rev")
+ % branch,
+ hint=_("run 'hg heads' to see all heads"))
+ msg, hint = _('nothing to merge'), None
+ if parent != repo.lookup(branch):
+ hint = _("use 'hg update' instead")
+ raise util.Abort(msg, hint=hint)
+
+ if parent not in bheads:
+ raise util.Abort(_('working directory not at a head revision'),
+ hint=_("use 'hg update' or merge with an "
+ "explicit revision"))
+ if parent == nbhs[0]:
+ node = nbhs[-1]
+ else:
+ node = nbhs[0]
+
+ if opts.get('preview'):
+ # find nodes that are ancestors of p2 but not of p1
+ p1 = repo.lookup('.')
+ p2 = repo.lookup(node)
+ nodes = repo.changelog.findmissing(common=[p1], heads=[p2])
+
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ for node in nodes:
+ displayer.show(repo[node])
+ displayer.close()
+ return 0
+
+ try:
+ # ui.forcemerge is an internal variable, do not document
+ repo.ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ return hg.merge(repo, node, force=opts.get('force'))
+ finally:
+ ui.setconfig('ui', 'forcemerge', '')
+
+@command('outgoing|out',
+ [('f', 'force', None, _('run even when the destination is unrelated')),
+ ('r', 'rev', [],
+ _('a changeset intended to be included in the destination'), _('REV')),
+ ('n', 'newest-first', None, _('show newest record first')),
+ ('B', 'bookmarks', False, _('compare bookmarks')),
+ ('b', 'branch', [], _('a specific branch you would like to push'),
+ _('BRANCH')),
+ ] + logopts + remoteopts + subrepoopts,
+ _('[-M] [-p] [-n] [-f] [-r REV]... [DEST]'))
+def outgoing(ui, repo, dest=None, **opts):
+ """show changesets not found in the destination
+
+ Show changesets not found in the specified destination repository
+ or the default push location. These are the changesets that would
+ be pushed if a push was requested.
+
+ See pull for details of valid destination formats.
+
+ Returns 0 if there are outgoing changes, 1 otherwise.
+ """
+ if opts.get('graph'):
+ cmdutil.checkunsupportedgraphflags([], opts)
+ o = hg._outgoing(ui, repo, dest, opts)
+ if o is None:
+ return
+
+ revdag = cmdutil.graphrevs(repo, o, opts)
+ displayer = cmdutil.show_changeset(ui, repo, opts, buffered=True)
+ showparents = [ctx.node() for ctx in repo[None].parents()]
+ cmdutil.displaygraph(ui, revdag, displayer, showparents,
+ graphmod.asciiedges)
+ return 0
+
+ if opts.get('bookmarks'):
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = hg.parseurl(dest, opts.get('branch'))
+ other = hg.peer(repo, opts, dest)
+ if 'bookmarks' not in other.listkeys('namespaces'):
+ ui.warn(_("remote doesn't support bookmarks\n"))
+ return 0
+ ui.status(_('comparing with %s\n') % util.hidepassword(dest))
+ return bookmarks.diff(ui, other, repo)
+
+ repo._subtoppath = ui.expandpath(dest or 'default-push', dest or 'default')
+ try:
+ return hg.outgoing(ui, repo, dest, opts)
+ finally:
+ del repo._subtoppath
+
+@command('parents',
+ [('r', 'rev', '', _('show parents of the specified revision'), _('REV')),
+ ] + templateopts,
+ _('[-r REV] [FILE]'))
+def parents(ui, repo, file_=None, **opts):
+ """show the parents of the working directory or revision
+
+ Print the working directory's parent revisions. If a revision is
+ given via -r/--rev, the parent of that revision will be printed.
+ If a file argument is given, the revision in which the file was
+ last changed (before the working directory revision or the
+ argument to --rev if given) is printed.
+
+ Returns 0 on success.
+ """
+
+ ctx = scmutil.revsingle(repo, opts.get('rev'), None)
+
+ if file_:
+ m = scmutil.match(ctx, (file_,), opts)
+ if m.anypats() or len(m.files()) != 1:
+ raise util.Abort(_('can only specify an explicit filename'))
+ file_ = m.files()[0]
+ filenodes = []
+ for cp in ctx.parents():
+ if not cp:
+ continue
+ try:
+ filenodes.append(cp.filenode(file_))
+ except error.LookupError:
+ pass
+ if not filenodes:
+ raise util.Abort(_("'%s' not found in manifest!") % file_)
+ fl = repo.file(file_)
+ p = [repo.lookup(fl.linkrev(fl.rev(fn))) for fn in filenodes]
+ else:
+ p = [cp.node() for cp in ctx.parents()]
+
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ for n in p:
+ if n != nullid:
+ displayer.show(repo[n])
+ displayer.close()
+
+@command('paths', [], _('[NAME]'))
+def paths(ui, repo, search=None):
+ """show aliases for remote repositories
+
+ Show definition of symbolic path name NAME. If no name is given,
+ show definition of all available names.
+
+ Option -q/--quiet suppresses all output when searching for NAME
+ and shows only the path names when listing all definitions.
+
+ Path names are defined in the [paths] section of your
+ configuration file and in ``/etc/mercurial/hgrc``. If run inside a
+ repository, ``.hg/hgrc`` is used, too.
+
+ The path names ``default`` and ``default-push`` have a special
+ meaning. When performing a push or pull operation, they are used
+ as fallbacks if no location is specified on the command-line.
+ When ``default-push`` is set, it will be used for push and
+ ``default`` will be used for pull; otherwise ``default`` is used
+ as the fallback for both. When cloning a repository, the clone
+ source is written as ``default`` in ``.hg/hgrc``. Note that
+ ``default`` and ``default-push`` apply to all inbound (e.g.
+ :hg:`incoming`) and outbound (e.g. :hg:`outgoing`, :hg:`email` and
+ :hg:`bundle`) operations.
+
+ See :hg:`help urls` for more information.
+
+ Returns 0 on success.
+ """
+ if search:
+ for name, path in ui.configitems("paths"):
+ if name == search:
+ ui.status("%s\n" % util.hidepassword(path))
+ return
+ if not ui.quiet:
+ ui.warn(_("not found!\n"))
+ return 1
+ else:
+ for name, path in ui.configitems("paths"):
+ if ui.quiet:
+ ui.write("%s\n" % name)
+ else:
+ ui.write("%s = %s\n" % (name, util.hidepassword(path)))
+
+@command('^phase',
+ [('p', 'public', False, _('set changeset phase to public')),
+ ('d', 'draft', False, _('set changeset phase to draft')),
+ ('s', 'secret', False, _('set changeset phase to secret')),
+ ('f', 'force', False, _('allow to move boundary backward')),
+ ('r', 'rev', [], _('target revision'), _('REV')),
+ ],
+ _('[-p|-d|-s] [-f] [-r] REV...'))
+def phase(ui, repo, *revs, **opts):
+ """set or show the current phase name
+
+ With no argument, show the phase name of specified revisions.
+
+ With one of -p/--public, -d/--draft or -s/--secret, change the
+ phase value of the specified revisions.
+
+ Unless -f/--force is specified, :hg:`phase` won't move changeset from a
+ lower phase to an higher phase. Phases are ordered as follows::
+
+ public < draft < secret
+
+ Return 0 on success, 1 if no phases were changed or some could not
+ be changed.
+ """
+ # search for a unique phase argument
+ targetphase = None
+ for idx, name in enumerate(phases.phasenames):
+ if opts[name]:
+ if targetphase is not None:
+ raise util.Abort(_('only one phase can be specified'))
+ targetphase = idx
+
+ # look for specified revision
+ revs = list(revs)
+ revs.extend(opts['rev'])
+ if not revs:
+ raise util.Abort(_('no revisions specified'))
+
+ revs = scmutil.revrange(repo, revs)
+
+ lock = None
+ ret = 0
+ if targetphase is None:
+ # display
+ for r in revs:
+ ctx = repo[r]
+ ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
+ else:
+ lock = repo.lock()
+ try:
+ # set phase
+ if not revs:
+ raise util.Abort(_('empty revision set'))
+ nodes = [repo[r].node() for r in revs]
+ olddata = repo._phasecache.getphaserevs(repo)[:]
+ phases.advanceboundary(repo, targetphase, nodes)
+ if opts['force']:
+ phases.retractboundary(repo, targetphase, nodes)
+ finally:
+ lock.release()
+ newdata = repo._phasecache.getphaserevs(repo)
+ changes = sum(o != newdata[i] for i, o in enumerate(olddata))
+ rejected = [n for n in nodes
+ if newdata[repo[n].rev()] < targetphase]
+ if rejected:
+ ui.warn(_('cannot move %i changesets to a more permissive '
+ 'phase, use --force\n') % len(rejected))
+ ret = 1
+ if changes:
+ msg = _('phase changed for %i changesets\n') % changes
+ if ret:
+ ui.status(msg)
+ else:
+ ui.note(msg)
+ else:
+ ui.warn(_('no phases changed\n'))
+ ret = 1
+ return ret
+
+def postincoming(ui, repo, modheads, optupdate, checkout):
+ if modheads == 0:
+ return
+ if optupdate:
+ movemarkfrom = repo['.'].node()
+ try:
+ ret = hg.update(repo, checkout)
+ except util.Abort, inst:
+ ui.warn(_("not updating: %s\n") % str(inst))
+ return 0
+ if not ret and not checkout:
+ if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
+ ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
+ return ret
+ if modheads > 1:
+ currentbranchheads = len(repo.branchheads())
+ if currentbranchheads == modheads:
+ ui.status(_("(run 'hg heads' to see heads, 'hg merge' to merge)\n"))
+ elif currentbranchheads > 1:
+ ui.status(_("(run 'hg heads .' to see heads, 'hg merge' to "
+ "merge)\n"))
+ else:
+ ui.status(_("(run 'hg heads' to see heads)\n"))
+ else:
+ ui.status(_("(run 'hg update' to get a working copy)\n"))
+
+@command('^pull',
+ [('u', 'update', None,
+ _('update to new branch head if changesets were pulled')),
+ ('f', 'force', None, _('run even when remote repository is unrelated')),
+ ('r', 'rev', [], _('a remote changeset intended to be added'), _('REV')),
+ ('B', 'bookmark', [], _("bookmark to pull"), _('BOOKMARK')),
+ ('b', 'branch', [], _('a specific branch you would like to pull'),
+ _('BRANCH')),
+ ] + remoteopts,
+ _('[-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [SOURCE]'))
+def pull(ui, repo, source="default", **opts):
+ """pull changes from the specified source
+
+ Pull changes from a remote repository to a local one.
+
+ This finds all changes from the repository at the specified path
+ or URL and adds them to a local repository (the current one unless
+ -R is specified). By default, this does not update the copy of the
+ project in the working directory.
+
+ Use :hg:`incoming` if you want to see what would have been added
+ by a pull at the time you issued this command. If you then decide
+ to add those changes to the repository, you should use :hg:`pull
+ -r X` where ``X`` is the last changeset listed by :hg:`incoming`.
+
+ If SOURCE is omitted, the 'default' path will be used.
+ See :hg:`help urls` for more information.
+
+ Returns 0 on success, 1 if an update had unresolved files.
+ """
+ source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
+ other = hg.peer(repo, opts, source)
+ ui.status(_('pulling from %s\n') % util.hidepassword(source))
+ revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
+
+ if opts.get('bookmark'):
+ if not revs:
+ revs = []
+ rb = other.listkeys('bookmarks')
+ for b in opts['bookmark']:
+ if b not in rb:
+ raise util.Abort(_('remote bookmark %s not found!') % b)
+ revs.append(rb[b])
+
+ if revs:
+ try:
+ revs = [other.lookup(rev) for rev in revs]
+ except error.CapabilityError:
+ err = _("other repository doesn't support revision lookup, "
+ "so a rev cannot be specified.")
+ raise util.Abort(err)
+
+ modheads = repo.pull(other, heads=revs, force=opts.get('force'))
+ bookmarks.updatefromremote(ui, repo, other, source)
+ if checkout:
+ checkout = str(repo.changelog.rev(other.lookup(checkout)))
+ repo._subtoppath = source
+ try:
+ ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
+
+ finally:
+ del repo._subtoppath
+
+ # update specified bookmarks
+ if opts.get('bookmark'):
+ for b in opts['bookmark']:
+ # explicit pull overrides local bookmark if any
+ ui.status(_("importing bookmark %s\n") % b)
+ repo._bookmarks[b] = repo[rb[b]].node()
+ bookmarks.write(repo)
+
+ return ret
+
+@command('^push',
+ [('f', 'force', None, _('force push')),
+ ('r', 'rev', [],
+ _('a changeset intended to be included in the destination'),
+ _('REV')),
+ ('B', 'bookmark', [], _("bookmark to push"), _('BOOKMARK')),
+ ('b', 'branch', [],
+ _('a specific branch you would like to push'), _('BRANCH')),
+ ('', 'new-branch', False, _('allow pushing a new branch')),
+ ] + remoteopts,
+ _('[-f] [-r REV]... [-e CMD] [--remotecmd CMD] [DEST]'))
+def push(ui, repo, dest=None, **opts):
+ """push changes to the specified destination
+
+ Push changesets from the local repository to the specified
+ destination.
+
+ This operation is symmetrical to pull: it is identical to a pull
+ in the destination repository from the current one.
+
+ By default, push will not allow creation of new heads at the
+ destination, since multiple heads would make it unclear which head
+ to use. In this situation, it is recommended to pull and merge
+ before pushing.
+
+ Use --new-branch if you want to allow push to create a new named
+ branch that is not present at the destination. This allows you to
+ only create a new branch without forcing other changes.
+
+ Use -f/--force to override the default behavior and push all
+ changesets on all branches.
+
+ If -r/--rev is used, the specified revision and all its ancestors
+ will be pushed to the remote repository.
+
+ If -B/--bookmark is used, the specified bookmarked revision, its
+ ancestors, and the bookmark will be pushed to the remote
+ repository.
+
+ Please see :hg:`help urls` for important details about ``ssh://``
+ URLs. If DESTINATION is omitted, a default path will be used.
+
+ Returns 0 if push was successful, 1 if nothing to push.
+ """
+
+ if opts.get('bookmark'):
+ for b in opts['bookmark']:
+ # translate -B options to -r so changesets get pushed
+ if b in repo._bookmarks:
+ opts.setdefault('rev', []).append(b)
+ else:
+ # if we try to push a deleted bookmark, translate it to null
+ # this lets simultaneous -r, -b options continue working
+ opts.setdefault('rev', []).append("null")
+
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = hg.parseurl(dest, opts.get('branch'))
+ ui.status(_('pushing to %s\n') % util.hidepassword(dest))
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get('rev'))
+ other = hg.peer(repo, opts, dest)
+ if revs:
+ revs = [repo.lookup(r) for r in scmutil.revrange(repo, revs)]
+
+ repo._subtoppath = dest
+ try:
+ # push subrepos depth-first for coherent ordering
+ c = repo['']
+ subs = c.substate # only repos that are committed
+ for s in sorted(subs):
+ if c.sub(s).push(opts) == 0:
+ return False
+ finally:
+ del repo._subtoppath
+ result = repo.push(other, opts.get('force'), revs=revs,
+ newbranch=opts.get('new_branch'))
+
+ result = not result
+
+ if opts.get('bookmark'):
+ rb = other.listkeys('bookmarks')
+ for b in opts['bookmark']:
+ # explicit push overrides remote bookmark if any
+ if b in repo._bookmarks:
+ ui.status(_("exporting bookmark %s\n") % b)
+ new = repo[b].hex()
+ elif b in rb:
+ ui.status(_("deleting remote bookmark %s\n") % b)
+ new = '' # delete
+ else:
+ ui.warn(_('bookmark %s does not exist on the local '
+ 'or remote repository!\n') % b)
+ return 2
+ old = rb.get(b, '')
+ r = other.pushkey('bookmarks', b, old, new)
+ if not r:
+ ui.warn(_('updating bookmark %s failed!\n') % b)
+ if not result:
+ result = 2
+
+ return result
+
+@command('recover', [])
+def recover(ui, repo):
+ """roll back an interrupted transaction
+
+ Recover from an interrupted commit or pull.
+
+ This command tries to fix the repository status after an
+ interrupted operation. It should only be necessary when Mercurial
+ suggests it.
+
+ Returns 0 if successful, 1 if nothing to recover or verify fails.
+ """
+ if repo.recover():
+ return hg.verify(repo)
+ return 1
+
+@command('^remove|rm',
+ [('A', 'after', None, _('record delete for missing files')),
+ ('f', 'force', None,
+ _('remove (and delete) file even if added or modified')),
+ ] + walkopts,
+ _('[OPTION]... FILE...'))
+def remove(ui, repo, *pats, **opts):
+ """remove the specified files on the next commit
+
+ Schedule the indicated files for removal from the current branch.
+
+ This command schedules the files to be removed at the next commit.
+ To undo a remove before that, see :hg:`revert`. To undo added
+ files, see :hg:`forget`.
+
+ .. container:: verbose
+
+ -A/--after can be used to remove only files that have already
+ been deleted, -f/--force can be used to force deletion, and -Af
+ can be used to remove files from the next revision without
+ deleting them from the working directory.
+
+ The following table details the behavior of remove for different
+ file states (columns) and option combinations (rows). The file
+ states are Added [A], Clean [C], Modified [M] and Missing [!]
+ (as reported by :hg:`status`). The actions are Warn, Remove
+ (from branch) and Delete (from disk):
+
+ ======= == == == ==
+ A C M !
+ ======= == == == ==
+ none W RD W R
+ -f R RD RD R
+ -A W W W R
+ -Af R R R R
+ ======= == == == ==
+
+ Note that remove never deletes files in Added [A] state from the
+ working directory, not even if option --force is specified.
+
+ Returns 0 on success, 1 if any warnings encountered.
+ """
+
+ ret = 0
+ after, force = opts.get('after'), opts.get('force')
+ if not pats and not after:
+ raise util.Abort(_('no files specified'))
+
+ m = scmutil.match(repo[None], pats, opts)
+ s = repo.status(match=m, clean=True)
+ modified, added, deleted, clean = s[0], s[1], s[3], s[6]
+
+ for f in m.files():
+ if f not in repo.dirstate and not os.path.isdir(m.rel(f)):
+ if os.path.exists(m.rel(f)):
+ ui.warn(_('not removing %s: file is untracked\n') % m.rel(f))
+ ret = 1
+
+ if force:
+ list = modified + deleted + clean + added
+ elif after:
+ list = deleted
+ for f in modified + added + clean:
+ ui.warn(_('not removing %s: file still exists (use -f'
+ ' to force removal)\n') % m.rel(f))
+ ret = 1
+ else:
+ list = deleted + clean
+ for f in modified:
+ ui.warn(_('not removing %s: file is modified (use -f'
+ ' to force removal)\n') % m.rel(f))
+ ret = 1
+ for f in added:
+ ui.warn(_('not removing %s: file has been marked for add'
+ ' (use forget to undo)\n') % m.rel(f))
+ ret = 1
+
+ for f in sorted(list):
+ if ui.verbose or not m.exact(f):
+ ui.status(_('removing %s\n') % m.rel(f))
+
+ wlock = repo.wlock()
+ try:
+ if not after:
+ for f in list:
+ if f in added:
+ continue # we never unlink added files on remove
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ repo[None].forget(list)
+ finally:
+ wlock.release()
+
+ return ret
+
+@command('rename|move|mv',
+ [('A', 'after', None, _('record a rename that has already occurred')),
+ ('f', 'force', None, _('forcibly copy over an existing managed file')),
+ ] + walkopts + dryrunopts,
+ _('[OPTION]... SOURCE... DEST'))
+def rename(ui, repo, *pats, **opts):
+ """rename files; equivalent of copy + remove
+
+ Mark dest as copies of sources; mark sources for deletion. If dest
+ is a directory, copies are put in that directory. If dest is a
+ file, there can only be one source.
+
+ By default, this command copies the contents of files as they
+ exist in the working directory. If invoked with -A/--after, the
+ operation is recorded, but no copying is performed.
+
+ This command takes effect at the next commit. To undo a rename
+ before that, see :hg:`revert`.
+
+ Returns 0 on success, 1 if errors are encountered.
+ """
+ wlock = repo.wlock(False)
+ try:
+ return cmdutil.copy(ui, repo, pats, opts, rename=True)
+ finally:
+ wlock.release()
+
+@command('resolve',
+ [('a', 'all', None, _('select all unresolved files')),
+ ('l', 'list', None, _('list state of files needing merge')),
+ ('m', 'mark', None, _('mark files as resolved')),
+ ('u', 'unmark', None, _('mark files as unresolved')),
+ ('n', 'no-status', None, _('hide status prefix'))]
+ + mergetoolopts + walkopts,
+ _('[OPTION]... [FILE]...'))
+def resolve(ui, repo, *pats, **opts):
+ """redo merges or set/view the merge status of files
+
+ Merges with unresolved conflicts are often the result of
+ non-interactive merging using the ``internal:merge`` configuration
+ setting, or a command-line merge tool like ``diff3``. The resolve
+ command is used to manage the files involved in a merge, after
+ :hg:`merge` has been run, and before :hg:`commit` is run (i.e. the
+ working directory must have two parents). See :hg:`help
+ merge-tools` for information on configuring merge tools.
+
+ The resolve command can be used in the following ways:
+
+ - :hg:`resolve [--tool TOOL] FILE...`: attempt to re-merge the specified
+ files, discarding any previous merge attempts. Re-merging is not
+ performed for files already marked as resolved. Use ``--all/-a``
+ to select all unresolved files. ``--tool`` can be used to specify
+ the merge tool used for the given files. It overrides the HGMERGE
+ environment variable and your configuration files. Previous file
+ contents are saved with a ``.orig`` suffix.
+
+ - :hg:`resolve -m [FILE]`: mark a file as having been resolved
+ (e.g. after having manually fixed-up the files). The default is
+ to mark all unresolved files.
+
+ - :hg:`resolve -u [FILE]...`: mark a file as unresolved. The
+ default is to mark all resolved files.
+
+ - :hg:`resolve -l`: list files which had or still have conflicts.
+ In the printed list, ``U`` = unresolved and ``R`` = resolved.
+
+ Note that Mercurial will not let you commit files with unresolved
+ merge conflicts. You must use :hg:`resolve -m ...` before you can
+ commit after a conflicting merge.
+
+ Returns 0 on success, 1 if any files fail a resolve attempt.
+ """
+
+ all, mark, unmark, show, nostatus = \
+ [opts.get(o) for o in 'all mark unmark list no_status'.split()]
+
+ if (show and (mark or unmark)) or (mark and unmark):
+ raise util.Abort(_("too many options specified"))
+ if pats and all:
+ raise util.Abort(_("can't specify --all and patterns"))
+ if not (all or pats or show or mark or unmark):
+ raise util.Abort(_('no files or directories specified; '
+ 'use --all to remerge all files'))
+
+ ms = mergemod.mergestate(repo)
+ m = scmutil.match(repo[None], pats, opts)
+ ret = 0
+
+ for f in ms:
+ if m(f):
+ if show:
+ if nostatus:
+ ui.write("%s\n" % f)
+ else:
+ ui.write("%s %s\n" % (ms[f].upper(), f),
+ label='resolve.' +
+ {'u': 'unresolved', 'r': 'resolved'}[ms[f]])
+ elif mark:
+ ms.mark(f, "r")
+ elif unmark:
+ ms.mark(f, "u")
+ else:
+ wctx = repo[None]
+ mctx = wctx.parents()[-1]
+
+ # backup pre-resolve (merge uses .orig for its own purposes)
+ a = repo.wjoin(f)
+ util.copyfile(a, a + ".resolve")
+
+ try:
+ # resolve file
+ ui.setconfig('ui', 'forcemerge', opts.get('tool', ''))
+ if ms.resolve(f, wctx, mctx):
+ ret = 1
+ finally:
+ ui.setconfig('ui', 'forcemerge', '')
+
+ # replace filemerge's .orig file with our resolve file
+ util.rename(a + ".resolve", a + ".orig")
+
+ ms.commit()
+ return ret
+
+@command('revert',
+ [('a', 'all', None, _('revert all changes when no arguments given')),
+ ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
+ ('r', 'rev', '', _('revert to the specified revision'), _('REV')),
+ ('C', 'no-backup', None, _('do not save backup copies of files')),
+ ] + walkopts + dryrunopts,
+ _('[OPTION]... [-r REV] [NAME]...'))
+def revert(ui, repo, *pats, **opts):
+ """restore files to their checkout state
+
+ .. note::
+
+ To check out earlier revisions, you should use :hg:`update REV`.
+ To cancel an uncommitted merge (and lose your changes), use
+ :hg:`update --clean .`.
+
+ With no revision specified, revert the specified files or directories
+ to the contents they had in the parent of the working directory.
+ This restores the contents of files to an unmodified
+ state and unschedules adds, removes, copies, and renames. If the
+ working directory has two parents, you must explicitly specify a
+ revision.
+
+ Using the -r/--rev or -d/--date options, revert the given files or
+ directories to their states as of a specific revision. Because
+ revert does not change the working directory parents, this will
+ cause these files to appear modified. This can be helpful to "back
+ out" some or all of an earlier change. See :hg:`backout` for a
+ related method.
+
+ Modified files are saved with a .orig suffix before reverting.
+ To disable these backups, use --no-backup.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Returns 0 on success.
+ """
+
+ if opts.get("date"):
+ if opts.get("rev"):
+ raise util.Abort(_("you can't specify a revision and a date"))
+ opts["rev"] = cmdutil.finddate(ui, repo, opts["date"])
+
+ parent, p2 = repo.dirstate.parents()
+ if not opts.get('rev') and p2 != nullid:
+ # revert after merge is a trap for new users (issue2915)
+ raise util.Abort(_('uncommitted merge with no revision specified'),
+ hint=_('use "hg update" or see "hg help revert"'))
+
+ ctx = scmutil.revsingle(repo, opts.get('rev'))
+
+ if not pats and not opts.get('all'):
+ msg = _("no files or directories specified")
+ if p2 != nullid:
+ hint = _("uncommitted merge, use --all to discard all changes,"
+ " or 'hg update -C .' to abort the merge")
+ raise util.Abort(msg, hint=hint)
+ dirty = util.any(repo.status())
+ node = ctx.node()
+ if node != parent:
+ if dirty:
+ hint = _("uncommitted changes, use --all to discard all"
+ " changes, or 'hg update %s' to update") % ctx.rev()
+ else:
+ hint = _("use --all to revert all files,"
+ " or 'hg update %s' to update") % ctx.rev()
+ elif dirty:
+ hint = _("uncommitted changes, use --all to discard all changes")
+ else:
+ hint = _("use --all to revert all files")
+ raise util.Abort(msg, hint=hint)
+
+ return cmdutil.revert(ui, repo, ctx, (parent, p2), *pats, **opts)
+
+@command('rollback', dryrunopts +
+ [('f', 'force', False, _('ignore safety measures'))])
+def rollback(ui, repo, **opts):
+ """roll back the last transaction (dangerous)
+
+ This command should be used with care. There is only one level of
+ rollback, and there is no way to undo a rollback. It will also
+ restore the dirstate at the time of the last transaction, losing
+ any dirstate changes since that time. This command does not alter
+ the working directory.
+
+ Transactions are used to encapsulate the effects of all commands
+ that create new changesets or propagate existing changesets into a
+ repository.
+
+ .. container:: verbose
+
+ For example, the following commands are transactional, and their
+ effects can be rolled back:
+
+ - commit
+ - import
+ - pull
+ - push (with this repository as the destination)
+ - unbundle
+
+ To avoid permanent data loss, rollback will refuse to rollback a
+ commit transaction if it isn't checked out. Use --force to
+ override this protection.
+
+ This command is not intended for use on public repositories. Once
+ changes are visible for pull by other users, rolling a transaction
+ back locally is ineffective (someone else may already have pulled
+ the changes). Furthermore, a race is possible with readers of the
+ repository; for example an in-progress pull from the repository
+ may fail if a rollback is performed.
+
+ Returns 0 on success, 1 if no rollback data is available.
+ """
+ return repo.rollback(dryrun=opts.get('dry_run'),
+ force=opts.get('force'))
+
+@command('root', [])
+def root(ui, repo):
+ """print the root (top) of the current working directory
+
+ Print the root directory of the current repository.
+
+ Returns 0 on success.
+ """
+ ui.write(repo.root + "\n")
+
+@command('^serve',
+ [('A', 'accesslog', '', _('name of access log file to write to'),
+ _('FILE')),
+ ('d', 'daemon', None, _('run server in background')),
+ ('', 'daemon-pipefds', '', _('used internally by daemon mode'), _('NUM')),
+ ('E', 'errorlog', '', _('name of error log file to write to'), _('FILE')),
+ # use string type, then we can check if something was passed
+ ('p', 'port', '', _('port to listen on (default: 8000)'), _('PORT')),
+ ('a', 'address', '', _('address to listen on (default: all interfaces)'),
+ _('ADDR')),
+ ('', 'prefix', '', _('prefix path to serve from (default: server root)'),
+ _('PREFIX')),
+ ('n', 'name', '',
+ _('name to show in web pages (default: working directory)'), _('NAME')),
+ ('', 'web-conf', '',
+ _('name of the hgweb config file (see "hg help hgweb")'), _('FILE')),
+ ('', 'webdir-conf', '', _('name of the hgweb config file (DEPRECATED)'),
+ _('FILE')),
+ ('', 'pid-file', '', _('name of file to write process ID to'), _('FILE')),
+ ('', 'stdio', None, _('for remote clients')),
+ ('', 'cmdserver', '', _('for remote clients'), _('MODE')),
+ ('t', 'templates', '', _('web templates to use'), _('TEMPLATE')),
+ ('', 'style', '', _('template style to use'), _('STYLE')),
+ ('6', 'ipv6', None, _('use IPv6 in addition to IPv4')),
+ ('', 'certificate', '', _('SSL certificate file'), _('FILE'))],
+ _('[OPTION]...'))
+def serve(ui, repo, **opts):
+ """start stand-alone webserver
+
+ Start a local HTTP repository browser and pull server. You can use
+ this for ad-hoc sharing and browsing of repositories. It is
+ recommended to use a real web server to serve a repository for
+ longer periods of time.
+
+ Please note that the server does not implement access control.
+ This means that, by default, anybody can read from the server and
+ nobody can write to it by default. Set the ``web.allow_push``
+ option to ``*`` to allow everybody to push to the server. You
+ should use a real web server if you need to authenticate users.
+
+ By default, the server logs accesses to stdout and errors to
+ stderr. Use the -A/--accesslog and -E/--errorlog options to log to
+ files.
+
+ To have the server choose a free port number to listen on, specify
+ a port number of 0; in this case, the server will print the port
+ number it uses.
+
+ Returns 0 on success.
+ """
+
+ if opts["stdio"] and opts["cmdserver"]:
+ raise util.Abort(_("cannot use --stdio with --cmdserver"))
+
+ def checkrepo():
+ if repo is None:
+ raise error.RepoError(_("there is no Mercurial repository here"
+ " (.hg not found)"))
+
+ if opts["stdio"]:
+ checkrepo()
+ s = sshserver.sshserver(ui, repo)
+ s.serve_forever()
+
+ if opts["cmdserver"]:
+ checkrepo()
+ s = commandserver.server(ui, repo, opts["cmdserver"])
+ return s.serve()
+
+ # this way we can check if something was given in the command-line
+ if opts.get('port'):
+ opts['port'] = util.getport(opts.get('port'))
+
+ baseui = repo and repo.baseui or ui
+ optlist = ("name templates style address port prefix ipv6"
+ " accesslog errorlog certificate encoding")
+ for o in optlist.split():
+ val = opts.get(o, '')
+ if val in (None, ''): # should check against default options instead
+ continue
+ baseui.setconfig("web", o, val)
+ if repo and repo.ui != baseui:
+ repo.ui.setconfig("web", o, val)
+
+ o = opts.get('web_conf') or opts.get('webdir_conf')
+ if not o:
+ if not repo:
+ raise error.RepoError(_("there is no Mercurial repository"
+ " here (.hg not found)"))
+ o = repo.root
+
+ app = hgweb.hgweb(o, baseui=ui)
+
+ class service(object):
+ def init(self):
+ util.setsignalhandler()
+ self.httpd = hgweb.server.create_server(ui, app)
+
+ if opts['port'] and not ui.verbose:
+ return
+
+ if self.httpd.prefix:
+ prefix = self.httpd.prefix.strip('/') + '/'
+ else:
+ prefix = ''
+
+ port = ':%d' % self.httpd.port
+ if port == ':80':
+ port = ''
+
+ bindaddr = self.httpd.addr
+ if bindaddr == '0.0.0.0':
+ bindaddr = '*'
+ elif ':' in bindaddr: # IPv6
+ bindaddr = '[%s]' % bindaddr
+
+ fqaddr = self.httpd.fqaddr
+ if ':' in fqaddr:
+ fqaddr = '[%s]' % fqaddr
+ if opts['port']:
+ write = ui.status
+ else:
+ write = ui.write
+ write(_('listening at http://%s%s/%s (bound to %s:%d)\n') %
+ (fqaddr, port, prefix, bindaddr, self.httpd.port))
+
+ def run(self):
+ self.httpd.serve_forever()
+
+ service = service()
+
+ cmdutil.service(opts, initfn=service.init, runfn=service.run)
+
+@command('showconfig|debugconfig',
+ [('u', 'untrusted', None, _('show untrusted configuration options'))],
+ _('[-u] [NAME]...'))
+def showconfig(ui, repo, *values, **opts):
+ """show combined config settings from all hgrc files
+
+ With no arguments, print names and values of all config items.
+
+ With one argument of the form section.name, print just the value
+ of that config item.
+
+ With multiple arguments, print names and values of all config
+ items with matching section names.
+
+ With --debug, the source (filename and line number) is printed
+ for each config item.
+
+ Returns 0 on success.
+ """
+
+ for f in scmutil.rcpath():
+ ui.debug('read config from: %s\n' % f)
+ untrusted = bool(opts.get('untrusted'))
+ if values:
+ sections = [v for v in values if '.' not in v]
+ items = [v for v in values if '.' in v]
+ if len(items) > 1 or items and sections:
+ raise util.Abort(_('only one config item permitted'))
+ for section, name, value in ui.walkconfig(untrusted=untrusted):
+ value = str(value).replace('\n', '\\n')
+ sectname = section + '.' + name
+ if values:
+ for v in values:
+ if v == section:
+ ui.debug('%s: ' %
+ ui.configsource(section, name, untrusted))
+ ui.write('%s=%s\n' % (sectname, value))
+ elif v == sectname:
+ ui.debug('%s: ' %
+ ui.configsource(section, name, untrusted))
+ ui.write(value, '\n')
+ else:
+ ui.debug('%s: ' %
+ ui.configsource(section, name, untrusted))
+ ui.write('%s=%s\n' % (sectname, value))
+
+@command('^status|st',
+ [('A', 'all', None, _('show status of all files')),
+ ('m', 'modified', None, _('show only modified files')),
+ ('a', 'added', None, _('show only added files')),
+ ('r', 'removed', None, _('show only removed files')),
+ ('d', 'deleted', None, _('show only deleted (but tracked) files')),
+ ('c', 'clean', None, _('show only files without changes')),
+ ('u', 'unknown', None, _('show only unknown (not tracked) files')),
+ ('i', 'ignored', None, _('show only ignored files')),
+ ('n', 'no-status', None, _('hide status prefix')),
+ ('C', 'copies', None, _('show source of copied files')),
+ ('0', 'print0', None, _('end filenames with NUL, for use with xargs')),
+ ('', 'rev', [], _('show difference from revision'), _('REV')),
+ ('', 'change', '', _('list the changed files of a revision'), _('REV')),
+ ] + walkopts + subrepoopts,
+ _('[OPTION]... [FILE]...'))
+def status(ui, repo, *pats, **opts):
+ """show changed files in the working directory
+
+ Show status of files in the repository. If names are given, only
+ files that match are shown. Files that are clean or ignored or
+ the source of a copy/move operation, are not listed unless
+ -c/--clean, -i/--ignored, -C/--copies or -A/--all are given.
+ Unless options described with "show only ..." are given, the
+ options -mardu are used.
+
+ Option -q/--quiet hides untracked (unknown and ignored) files
+ unless explicitly requested with -u/--unknown or -i/--ignored.
+
+ .. note::
+ status may appear to disagree with diff if permissions have
+ changed or a merge has occurred. The standard diff format does
+ not report permission changes and diff only reports changes
+ relative to one merge parent.
+
+ If one revision is given, it is used as the base revision.
+ If two revisions are given, the differences between them are
+ shown. The --change option can also be used as a shortcut to list
+ the changed files of a revision from its first parent.
+
+ The codes used to show the status of files are::
+
+ M = modified
+ A = added
+ R = removed
+ C = clean
+ ! = missing (deleted by non-hg command, but still tracked)
+ ? = not tracked
+ I = ignored
+ = origin of the previous file listed as A (added)
+
+ .. container:: verbose
+
+ Examples:
+
+ - show changes in the working directory relative to a
+ changeset::
+
+ hg status --rev 9353
+
+ - show all changes including copies in an existing changeset::
+
+ hg status --copies --change 9353
+
+ - get a NUL separated list of added files, suitable for xargs::
+
+ hg status -an0
+
+ Returns 0 on success.
+ """
+
+ revs = opts.get('rev')
+ change = opts.get('change')
+
+ if revs and change:
+ msg = _('cannot specify --rev and --change at the same time')
+ raise util.Abort(msg)
+ elif change:
+ node2 = scmutil.revsingle(repo, change, None).node()
+ node1 = repo[node2].p1().node()
+ else:
+ node1, node2 = scmutil.revpair(repo, revs)
+
+ cwd = (pats and repo.getcwd()) or ''
+ end = opts.get('print0') and '\0' or '\n'
+ copy = {}
+ states = 'modified added removed deleted unknown ignored clean'.split()
+ show = [k for k in states if opts.get(k)]
+ if opts.get('all'):
+ show += ui.quiet and (states[:4] + ['clean']) or states
+ if not show:
+ show = ui.quiet and states[:4] or states[:5]
+
+ stat = repo.status(node1, node2, scmutil.match(repo[node2], pats, opts),
+ 'ignored' in show, 'clean' in show, 'unknown' in show,
+ opts.get('subrepos'))
+ changestates = zip(states, 'MAR!?IC', stat)
+
+ if (opts.get('all') or opts.get('copies')) and not opts.get('no_status'):
+ copy = copies.pathcopies(repo[node1], repo[node2])
+
+ fm = ui.formatter('status', opts)
+ format = '%s %s' + end
+ if opts.get('no_status'):
+ format = '%.0s%s' + end
+
+ for state, char, files in changestates:
+ if state in show:
+ label = 'status.' + state
+ for f in files:
+ fm.startitem()
+ fm.write("status path", format, char,
+ repo.pathto(f, cwd), label=label)
+ if f in copy:
+ fm.write("copy", ' %s' + end, repo.pathto(copy[f], cwd),
+ label='status.copied')
+ fm.end()
+
+@command('^summary|sum',
+ [('', 'remote', None, _('check for push and pull'))], '[--remote]')
+def summary(ui, repo, **opts):
+ """summarize working directory state
+
+ This generates a brief summary of the working directory state,
+ including parents, branch, commit status, and available updates.
+
+ With the --remote option, this will check the default paths for
+ incoming and outgoing changes. This can be time-consuming.
+
+ Returns 0 on success.
+ """
+
+ ctx = repo[None]
+ parents = ctx.parents()
+ pnode = parents[0].node()
+ marks = []
+
+ for p in parents:
+ # label with log.changeset (instead of log.parent) since this
+ # shows a working directory parent *changeset*:
+ ui.write(_('parent: %d:%s ') % (p.rev(), str(p)),
+ label='log.changeset')
+ ui.write(' '.join(p.tags()), label='log.tag')
+ if p.bookmarks():
+ marks.extend(p.bookmarks())
+ if p.rev() == -1:
+ if not len(repo):
+ ui.write(_(' (empty repository)'))
+ else:
+ ui.write(_(' (no revision checked out)'))
+ ui.write('\n')
+ if p.description():
+ ui.status(' ' + p.description().splitlines()[0].strip() + '\n',
+ label='log.summary')
+
+ branch = ctx.branch()
+ bheads = repo.branchheads(branch)
+ m = _('branch: %s\n') % branch
+ if branch != 'default':
+ ui.write(m, label='log.branch')
+ else:
+ ui.status(m, label='log.branch')
+
+ if marks:
+ current = repo._bookmarkcurrent
+ ui.write(_('bookmarks:'), label='log.bookmark')
+ if current is not None:
+ try:
+ marks.remove(current)
+ ui.write(' *' + current, label='bookmarks.current')
+ except ValueError:
+ # current bookmark not in parent ctx marks
+ pass
+ for m in marks:
+ ui.write(' ' + m, label='log.bookmark')
+ ui.write('\n', label='log.bookmark')
+
+ st = list(repo.status(unknown=True))[:6]
+
+ c = repo.dirstate.copies()
+ copied, renamed = [], []
+ for d, s in c.iteritems():
+ if s in st[2]:
+ st[2].remove(s)
+ renamed.append(d)
+ else:
+ copied.append(d)
+ if d in st[1]:
+ st[1].remove(d)
+ st.insert(3, renamed)
+ st.insert(4, copied)
+
+ ms = mergemod.mergestate(repo)
+ st.append([f for f in ms if ms[f] == 'u'])
+
+ subs = [s for s in ctx.substate if ctx.sub(s).dirty()]
+ st.append(subs)
+
+ labels = [ui.label(_('%d modified'), 'status.modified'),
+ ui.label(_('%d added'), 'status.added'),
+ ui.label(_('%d removed'), 'status.removed'),
+ ui.label(_('%d renamed'), 'status.copied'),
+ ui.label(_('%d copied'), 'status.copied'),
+ ui.label(_('%d deleted'), 'status.deleted'),
+ ui.label(_('%d unknown'), 'status.unknown'),
+ ui.label(_('%d ignored'), 'status.ignored'),
+ ui.label(_('%d unresolved'), 'resolve.unresolved'),
+ ui.label(_('%d subrepos'), 'status.modified')]
+ t = []
+ for s, l in zip(st, labels):
+ if s:
+ t.append(l % len(s))
+
+ t = ', '.join(t)
+ cleanworkdir = False
+
+ if len(parents) > 1:
+ t += _(' (merge)')
+ elif branch != parents[0].branch():
+ t += _(' (new branch)')
+ elif (parents[0].closesbranch() and
+ pnode in repo.branchheads(branch, closed=True)):
+ t += _(' (head closed)')
+ elif not (st[0] or st[1] or st[2] or st[3] or st[4] or st[9]):
+ t += _(' (clean)')
+ cleanworkdir = True
+ elif pnode not in bheads:
+ t += _(' (new branch head)')
+
+ if cleanworkdir:
+ ui.status(_('commit: %s\n') % t.strip())
+ else:
+ ui.write(_('commit: %s\n') % t.strip())
+
+ # all ancestors of branch heads - all ancestors of parent = new csets
+ new = [0] * len(repo)
+ cl = repo.changelog
+ for a in [cl.rev(n) for n in bheads]:
+ new[a] = 1
+ for a in cl.ancestors([cl.rev(n) for n in bheads]):
+ new[a] = 1
+ for a in [p.rev() for p in parents]:
+ if a >= 0:
+ new[a] = 0
+ for a in cl.ancestors([p.rev() for p in parents]):
+ new[a] = 0
+ new = sum(new)
+
+ if new == 0:
+ ui.status(_('update: (current)\n'))
+ elif pnode not in bheads:
+ ui.write(_('update: %d new changesets (update)\n') % new)
+ else:
+ ui.write(_('update: %d new changesets, %d branch heads (merge)\n') %
+ (new, len(bheads)))
+
+ if opts.get('remote'):
+ t = []
+ source, branches = hg.parseurl(ui.expandpath('default'))
+ other = hg.peer(repo, {}, source)
+ revs, checkout = hg.addbranchrevs(repo, other, branches,
+ opts.get('rev'))
+ ui.debug('comparing with %s\n' % util.hidepassword(source))
+ repo.ui.pushbuffer()
+ commoninc = discovery.findcommonincoming(repo, other)
+ _common, incoming, _rheads = commoninc
+ repo.ui.popbuffer()
+ if incoming:
+ t.append(_('1 or more incoming'))
+
+ dest, branches = hg.parseurl(ui.expandpath('default-push', 'default'))
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, None)
+ if source != dest:
+ other = hg.peer(repo, {}, dest)
+ commoninc = None
+ ui.debug('comparing with %s\n' % util.hidepassword(dest))
+ repo.ui.pushbuffer()
+ outgoing = discovery.findcommonoutgoing(repo, other,
+ commoninc=commoninc)
+ repo.ui.popbuffer()
+ o = outgoing.missing
+ if o:
+ t.append(_('%d outgoing') % len(o))
+ if 'bookmarks' in other.listkeys('namespaces'):
+ lmarks = repo.listkeys('bookmarks')
+ rmarks = other.listkeys('bookmarks')
+ diff = set(rmarks) - set(lmarks)
+ if len(diff) > 0:
+ t.append(_('%d incoming bookmarks') % len(diff))
+ diff = set(lmarks) - set(rmarks)
+ if len(diff) > 0:
+ t.append(_('%d outgoing bookmarks') % len(diff))
+
+ if t:
+ ui.write(_('remote: %s\n') % (', '.join(t)))
+ else:
+ ui.status(_('remote: (synced)\n'))
+
+@command('tag',
+ [('f', 'force', None, _('force tag')),
+ ('l', 'local', None, _('make the tag local')),
+ ('r', 'rev', '', _('revision to tag'), _('REV')),
+ ('', 'remove', None, _('remove a tag')),
+ # -l/--local is already there, commitopts cannot be used
+ ('e', 'edit', None, _('edit commit message')),
+ ('m', 'message', '', _('use <text> as commit message'), _('TEXT')),
+ ] + commitopts2,
+ _('[-f] [-l] [-m TEXT] [-d DATE] [-u USER] [-r REV] NAME...'))
+def tag(ui, repo, name1, *names, **opts):
+ """add one or more tags for the current or given revision
+
+ Name a particular revision using <name>.
+
+ Tags are used to name particular revisions of the repository and are
+ very useful to compare different revisions, to go back to significant
+ earlier versions or to mark branch points as releases, etc. Changing
+ an existing tag is normally disallowed; use -f/--force to override.
+
+ If no revision is given, the parent of the working directory is
+ used, or tip if no revision is checked out.
+
+ To facilitate version control, distribution, and merging of tags,
+ they are stored as a file named ".hgtags" which is managed similarly
+ to other project files and can be hand-edited if necessary. This
+ also means that tagging creates a new commit. The file
+ ".hg/localtags" is used for local tags (not shared among
+ repositories).
+
+ Tag commits are usually made at the head of a branch. If the parent
+ of the working directory is not a branch head, :hg:`tag` aborts; use
+ -f/--force to force the tag commit to be based on a non-head
+ changeset.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Since tag names have priority over branch names during revision
+ lookup, using an existing branch name as a tag name is discouraged.
+
+ Returns 0 on success.
+ """
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ rev_ = "."
+ names = [t.strip() for t in (name1,) + names]
+ if len(names) != len(set(names)):
+ raise util.Abort(_('tag names must be unique'))
+ for n in names:
+ if n in ['tip', '.', 'null']:
+ raise util.Abort(_("the name '%s' is reserved") % n)
+ if not n:
+ raise util.Abort(_('tag names cannot consist entirely of '
+ 'whitespace'))
+ if opts.get('rev') and opts.get('remove'):
+ raise util.Abort(_("--rev and --remove are incompatible"))
+ if opts.get('rev'):
+ rev_ = opts['rev']
+ message = opts.get('message')
+ if opts.get('remove'):
+ expectedtype = opts.get('local') and 'local' or 'global'
+ for n in names:
+ if not repo.tagtype(n):
+ raise util.Abort(_("tag '%s' does not exist") % n)
+ if repo.tagtype(n) != expectedtype:
+ if expectedtype == 'global':
+ raise util.Abort(_("tag '%s' is not a global tag") % n)
+ else:
+ raise util.Abort(_("tag '%s' is not a local tag") % n)
+ rev_ = nullid
+ if not message:
+ # we don't translate commit messages
+ message = 'Removed tag %s' % ', '.join(names)
+ elif not opts.get('force'):
+ for n in names:
+ if n in repo.tags():
+ raise util.Abort(_("tag '%s' already exists "
+ "(use -f to force)") % n)
+ if not opts.get('local'):
+ p1, p2 = repo.dirstate.parents()
+ if p2 != nullid:
+ raise util.Abort(_('uncommitted merge'))
+ bheads = repo.branchheads()
+ if not opts.get('force') and bheads and p1 not in bheads:
+ raise util.Abort(_('not at a branch head (use -f to force)'))
+ r = scmutil.revsingle(repo, rev_).node()
+
+ if not message:
+ # we don't translate commit messages
+ message = ('Added tag %s for changeset %s' %
+ (', '.join(names), short(r)))
+
+ date = opts.get('date')
+ if date:
+ date = util.parsedate(date)
+
+ if opts.get('edit'):
+ message = ui.edit(message, ui.username())
+
+ # don't allow tagging the null rev
+ if (not opts.get('remove') and
+ scmutil.revsingle(repo, rev_).rev() == nullrev):
+ raise util.Abort(_("null revision specified"))
+
+ repo.tag(names, r, message, opts.get('local'), opts.get('user'), date)
+ finally:
+ release(lock, wlock)
+
+@command('tags', [], '')
+def tags(ui, repo):
+ """list repository tags
+
+ This lists both regular and local tags. When the -v/--verbose
+ switch is used, a third column "local" is printed for local tags.
+
+ Returns 0 on success.
+ """
+
+ hexfunc = ui.debugflag and hex or short
+ tagtype = ""
+
+ for t, n in reversed(repo.tagslist()):
+ if ui.quiet:
+ ui.write("%s\n" % t, label='tags.normal')
+ continue
+
+ hn = hexfunc(n)
+ r = "%5d:%s" % (repo.changelog.rev(n), hn)
+ rev = ui.label(r, 'log.changeset')
+ spaces = " " * (30 - encoding.colwidth(t))
+
+ tag = ui.label(t, 'tags.normal')
+ if ui.verbose:
+ if repo.tagtype(t) == 'local':
+ tagtype = " local"
+ tag = ui.label(t, 'tags.local')
+ else:
+ tagtype = ""
+ ui.write("%s%s %s%s\n" % (tag, spaces, rev, tagtype))
+
+@command('tip',
+ [('p', 'patch', None, _('show patch')),
+ ('g', 'git', None, _('use git extended diff format')),
+ ] + templateopts,
+ _('[-p] [-g]'))
+def tip(ui, repo, **opts):
+ """show the tip revision
+
+ The tip revision (usually just called the tip) is the changeset
+ most recently added to the repository (and therefore the most
+ recently changed head).
+
+ If you have just made a commit, that commit will be the tip. If
+ you have just pulled changes from another repository, the tip of
+ that repository becomes the current tip. The "tip" tag is special
+ and cannot be renamed or assigned to a different changeset.
+
+ Returns 0 on success.
+ """
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ displayer.show(repo[len(repo) - 1])
+ displayer.close()
+
+@command('unbundle',
+ [('u', 'update', None,
+ _('update to new branch head if changesets were unbundled'))],
+ _('[-u] FILE...'))
+def unbundle(ui, repo, fname1, *fnames, **opts):
+ """apply one or more changegroup files
+
+ Apply one or more compressed changegroup files generated by the
+ bundle command.
+
+ Returns 0 on success, 1 if an update has unresolved files.
+ """
+ fnames = (fname1,) + fnames
+
+ lock = repo.lock()
+ wc = repo['.']
+ try:
+ for fname in fnames:
+ f = url.open(ui, fname)
+ gen = changegroup.readbundle(f, fname)
+ modheads = repo.addchangegroup(gen, 'unbundle', 'bundle:' + fname)
+ finally:
+ lock.release()
+ bookmarks.updatecurrentbookmark(repo, wc.node(), wc.branch())
+ return postincoming(ui, repo, modheads, opts.get('update'), None)
+
+@command('^update|up|checkout|co',
+ [('C', 'clean', None, _('discard uncommitted changes (no backup)')),
+ ('c', 'check', None,
+ _('update across branches if no uncommitted changes')),
+ ('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
+ ('r', 'rev', '', _('revision'), _('REV'))],
+ _('[-c] [-C] [-d DATE] [[-r] REV]'))
+def update(ui, repo, node=None, rev=None, clean=False, date=None, check=False):
+ """update working directory (or switch revisions)
+
+ Update the repository's working directory to the specified
+ changeset. If no changeset is specified, update to the tip of the
+ current named branch and move the current bookmark (see :hg:`help
+ bookmarks`).
+
+ Update sets the working directory's parent revison to the specified
+ changeset (see :hg:`help parents`).
+
+ If the changeset is not a descendant or ancestor of the working
+ directory's parent, the update is aborted. With the -c/--check
+ option, the working directory is checked for uncommitted changes; if
+ none are found, the working directory is updated to the specified
+ changeset.
+
+ .. container:: verbose
+
+ The following rules apply when the working directory contains
+ uncommitted changes:
+
+ 1. If neither -c/--check nor -C/--clean is specified, and if
+ the requested changeset is an ancestor or descendant of
+ the working directory's parent, the uncommitted changes
+ are merged into the requested changeset and the merged
+ result is left uncommitted. If the requested changeset is
+ not an ancestor or descendant (that is, it is on another
+ branch), the update is aborted and the uncommitted changes
+ are preserved.
+
+ 2. With the -c/--check option, the update is aborted and the
+ uncommitted changes are preserved.
+
+ 3. With the -C/--clean option, uncommitted changes are discarded and
+ the working directory is updated to the requested changeset.
+
+ To cancel an uncommitted merge (and lose your changes), use
+ :hg:`update --clean .`.
+
+ Use null as the changeset to remove the working directory (like
+ :hg:`clone -U`).
+
+ If you want to revert just one file to an older revision, use
+ :hg:`revert [-r REV] NAME`.
+
+ See :hg:`help dates` for a list of formats valid for -d/--date.
+
+ Returns 0 on success, 1 if there are unresolved files.
+ """
+ if rev and node:
+ raise util.Abort(_("please specify just one revision"))
+
+ if rev is None or rev == '':
+ rev = node
+
+ # with no argument, we also move the current bookmark, if any
+ movemarkfrom = None
+ if rev is None or node == '':
+ movemarkfrom = repo['.'].node()
+
+ # if we defined a bookmark, we have to remember the original bookmark name
+ brev = rev
+ rev = scmutil.revsingle(repo, rev, rev).rev()
+
+ if check and clean:
+ raise util.Abort(_("cannot specify both -c/--check and -C/--clean"))
+
+ if date:
+ if rev is not None:
+ raise util.Abort(_("you can't specify a revision and a date"))
+ rev = cmdutil.finddate(ui, repo, date)
+
+ if check:
+ c = repo[None]
+ if c.dirty(merge=False, branch=False):
+ raise util.Abort(_("uncommitted local changes"))
+ if rev is None:
+ rev = repo[repo[None].branch()].rev()
+ mergemod._checkunknown(repo, repo[None], repo[rev])
+
+ if clean:
+ ret = hg.clean(repo, rev)
+ else:
+ ret = hg.update(repo, rev)
+
+ if not ret and movemarkfrom:
+ if bookmarks.update(repo, [movemarkfrom], repo['.'].node()):
+ ui.status(_("updating bookmark %s\n") % repo._bookmarkcurrent)
+ elif brev in repo._bookmarks:
+ bookmarks.setcurrent(repo, brev)
+ elif brev:
+ bookmarks.unsetcurrent(repo)
+
+ return ret
+
+@command('verify', [])
+def verify(ui, repo):
+ """verify the integrity of the repository
+
+ Verify the integrity of the current repository.
+
+ This will perform an extensive check of the repository's
+ integrity, validating the hashes and checksums of each entry in
+ the changelog, manifest, and tracked files, as well as the
+ integrity of their crosslinks and indices.
+
+ Returns 0 on success, 1 if errors are encountered.
+ """
+ return hg.verify(repo)
+
+@command('version', [])
+def version_(ui):
+ """output version and copyright information"""
+ ui.write(_("Mercurial Distributed SCM (version %s)\n")
+ % util.version())
+ ui.status(_(
+ "(see http://mercurial.selenic.com for more information)\n"
+ "\nCopyright (C) 2005-2012 Matt Mackall and others\n"
+ "This is free software; see the source for copying conditions. "
+ "There is NO\nwarranty; "
+ "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"
+ ))
+
+norepo = ("clone init version help debugcommands debugcomplete"
+ " debugdate debuginstall debugfsinfo debugpushkey debugwireargs"
+ " debugknown debuggetbundle debugbundle")
+optionalrepo = ("identify paths serve showconfig debugancestor debugdag"
+ " debugdata debugindex debugindexdot debugrevlog")
diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py
new file mode 100644
index 0000000..4cd1583
--- /dev/null
+++ b/mercurial/commandserver.py
@@ -0,0 +1,238 @@
+# commandserver.py - communicate with Mercurial's API over a pipe
+#
+# Copyright Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import struct
+import sys, os
+import dispatch, encoding, util
+
+logfile = None
+
+def log(*args):
+ if not logfile:
+ return
+
+ for a in args:
+ logfile.write(str(a))
+
+ logfile.flush()
+
+class channeledoutput(object):
+ """
+ Write data from in_ to out in the following format:
+
+ data length (unsigned int),
+ data
+ """
+ def __init__(self, in_, out, channel):
+ self.in_ = in_
+ self.out = out
+ self.channel = channel
+
+ def write(self, data):
+ if not data:
+ return
+ self.out.write(struct.pack('>cI', self.channel, len(data)))
+ self.out.write(data)
+ self.out.flush()
+
+ def __getattr__(self, attr):
+ if attr in ('isatty', 'fileno'):
+ raise AttributeError, attr
+ return getattr(self.in_, attr)
+
+class channeledinput(object):
+ """
+ Read data from in_.
+
+ Requests for input are written to out in the following format:
+ channel identifier - 'I' for plain input, 'L' line based (1 byte)
+ how many bytes to send at most (unsigned int),
+
+ The client replies with:
+ data length (unsigned int), 0 meaning EOF
+ data
+ """
+
+ maxchunksize = 4 * 1024
+
+ def __init__(self, in_, out, channel):
+ self.in_ = in_
+ self.out = out
+ self.channel = channel
+
+ def read(self, size=-1):
+ if size < 0:
+ # if we need to consume all the clients input, ask for 4k chunks
+ # so the pipe doesn't fill up risking a deadlock
+ size = self.maxchunksize
+ s = self._read(size, self.channel)
+ buf = s
+ while s:
+ s = self._read(size, self.channel)
+ buf += s
+
+ return buf
+ else:
+ return self._read(size, self.channel)
+
+ def _read(self, size, channel):
+ if not size:
+ return ''
+ assert size > 0
+
+ # tell the client we need at most size bytes
+ self.out.write(struct.pack('>cI', channel, size))
+ self.out.flush()
+
+ length = self.in_.read(4)
+ length = struct.unpack('>I', length)[0]
+ if not length:
+ return ''
+ else:
+ return self.in_.read(length)
+
+ def readline(self, size=-1):
+ if size < 0:
+ size = self.maxchunksize
+ s = self._read(size, 'L')
+ buf = s
+ # keep asking for more until there's either no more or
+ # we got a full line
+ while s and s[-1] != '\n':
+ s = self._read(size, 'L')
+ buf += s
+
+ return buf
+ else:
+ return self._read(size, 'L')
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ l = self.readline()
+ if not l:
+ raise StopIteration
+ return l
+
+ def __getattr__(self, attr):
+ if attr in ('isatty', 'fileno'):
+ raise AttributeError, attr
+ return getattr(self.in_, attr)
+
+class server(object):
+ """
+ Listens for commands on stdin, runs them and writes the output on a channel
+ based stream to stdout.
+ """
+ def __init__(self, ui, repo, mode):
+ self.cwd = os.getcwd()
+
+ logpath = ui.config("cmdserver", "log", None)
+ if logpath:
+ global logfile
+ if logpath == '-':
+ # write log on a special 'd'ebug channel
+ logfile = channeledoutput(sys.stdout, sys.stdout, 'd')
+ else:
+ logfile = open(logpath, 'a')
+
+ # the ui here is really the repo ui so take its baseui so we don't end
+ # up with its local configuration
+ self.ui = repo.baseui
+ self.repo = repo
+ self.repoui = repo.ui
+
+ if mode == 'pipe':
+ self.cerr = channeledoutput(sys.stderr, sys.stdout, 'e')
+ self.cout = channeledoutput(sys.stdout, sys.stdout, 'o')
+ self.cin = channeledinput(sys.stdin, sys.stdout, 'I')
+ self.cresult = channeledoutput(sys.stdout, sys.stdout, 'r')
+
+ self.client = sys.stdin
+ else:
+ raise util.Abort(_('unknown mode %s') % mode)
+
+ def _read(self, size):
+ if not size:
+ return ''
+
+ data = self.client.read(size)
+
+ # is the other end closed?
+ if not data:
+ raise EOFError
+
+ return data
+
+ def runcommand(self):
+ """ reads a list of \0 terminated arguments, executes
+ and writes the return code to the result channel """
+
+ length = struct.unpack('>I', self._read(4))[0]
+ if not length:
+ args = []
+ else:
+ args = self._read(length).split('\0')
+
+ # copy the uis so changes (e.g. --config or --verbose) don't
+ # persist between requests
+ copiedui = self.ui.copy()
+ self.repo.baseui = copiedui
+ self.repo.ui = self.repo.dirstate._ui = self.repoui.copy()
+ self.repo.invalidate()
+ self.repo.invalidatedirstate()
+
+ req = dispatch.request(args[:], copiedui, self.repo, self.cin,
+ self.cout, self.cerr)
+
+ ret = dispatch.dispatch(req) or 0 # might return None
+
+ # restore old cwd
+ if '--cwd' in args:
+ os.chdir(self.cwd)
+
+ self.cresult.write(struct.pack('>i', int(ret)))
+
+ def getencoding(self):
+ """ writes the current encoding to the result channel """
+ self.cresult.write(encoding.encoding)
+
+ def serveone(self):
+ cmd = self.client.readline()[:-1]
+ if cmd:
+ handler = self.capabilities.get(cmd)
+ if handler:
+ handler(self)
+ else:
+ # clients are expected to check what commands are supported by
+ # looking at the servers capabilities
+ raise util.Abort(_('unknown command %s') % cmd)
+
+ return cmd != ''
+
+ capabilities = {'runcommand' : runcommand,
+ 'getencoding' : getencoding}
+
+ def serve(self):
+ hellomsg = 'capabilities: ' + ' '.join(self.capabilities.keys())
+ hellomsg += '\n'
+ hellomsg += 'encoding: ' + encoding.encoding
+
+ # write the hello msg in -one- chunk
+ self.cout.write(hellomsg)
+
+ try:
+ while self.serveone():
+ pass
+ except EOFError:
+ # we'll get here if the client disconnected while we were reading
+ # its request
+ return 1
+
+ return 0
diff --git a/mercurial/config.py b/mercurial/config.py
new file mode 100644
index 0000000..9906d6e
--- /dev/null
+++ b/mercurial/config.py
@@ -0,0 +1,183 @@
+# config.py - configuration parsing for Mercurial
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import error, util
+import os, errno
+
+class sortdict(dict):
+ 'a simple sorted dictionary'
+ def __init__(self, data=None):
+ self._list = []
+ if data:
+ self.update(data)
+ def copy(self):
+ return sortdict(self)
+ def __setitem__(self, key, val):
+ if key in self:
+ self._list.remove(key)
+ self._list.append(key)
+ dict.__setitem__(self, key, val)
+ def __iter__(self):
+ return self._list.__iter__()
+ def update(self, src):
+ for k in src:
+ self[k] = src[k]
+ def clear(self):
+ dict.clear(self)
+ self._list = []
+ def items(self):
+ return [(k, self[k]) for k in self._list]
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
+ self._list.remove(key)
+ def keys(self):
+ return self._list
+ def iterkeys(self):
+ return self._list.__iter__()
+
+class config(object):
+ def __init__(self, data=None):
+ self._data = {}
+ self._source = {}
+ if data:
+ for k in data._data:
+ self._data[k] = data[k].copy()
+ self._source = data._source.copy()
+ def copy(self):
+ return config(self)
+ def __contains__(self, section):
+ return section in self._data
+ def __getitem__(self, section):
+ return self._data.get(section, {})
+ def __iter__(self):
+ for d in self.sections():
+ yield d
+ def update(self, src):
+ for s in src:
+ if s not in self:
+ self._data[s] = sortdict()
+ self._data[s].update(src._data[s])
+ self._source.update(src._source)
+ def get(self, section, item, default=None):
+ return self._data.get(section, {}).get(item, default)
+
+ def backup(self, section, item):
+ """return a tuple allowing restore to reinstall a previous valuesi
+
+ The main reason we need it is because it handle the "no data" case.
+ """
+ try:
+ value = self._data[section][item]
+ source = self.source(section, item)
+ return (section, item, value, source)
+ except KeyError:
+ return (section, item)
+
+ def source(self, section, item):
+ return self._source.get((section, item), "")
+ def sections(self):
+ return sorted(self._data.keys())
+ def items(self, section):
+ return self._data.get(section, {}).items()
+ def set(self, section, item, value, source=""):
+ if section not in self:
+ self._data[section] = sortdict()
+ self._data[section][item] = value
+ self._source[(section, item)] = source
+
+ def restore(self, data):
+ """restore data returned by self.backup"""
+ if len(data) == 4:
+ # restore old data
+ section, item, value, source = data
+ self._data[section][item] = value
+ self._source[(section, item)] = source
+ else:
+ # no data before, remove everything
+ section, item = data
+ if section in self._data:
+ del self._data[section][item]
+ self._source.pop((section, item), None)
+
+ def parse(self, src, data, sections=None, remap=None, include=None):
+ sectionre = util.compilere(r'\[([^\[]+)\]')
+ itemre = util.compilere(r'([^=\s][^=]*?)\s*=\s*(.*\S|)')
+ contre = util.compilere(r'\s+(\S|\S.*\S)\s*$')
+ emptyre = util.compilere(r'(;|#|\s*$)')
+ commentre = util.compilere(r'(;|#)')
+ unsetre = util.compilere(r'%unset\s+(\S+)')
+ includere = util.compilere(r'%include\s+(\S|\S.*\S)\s*$')
+ section = ""
+ item = None
+ line = 0
+ cont = False
+
+ for l in data.splitlines(True):
+ line += 1
+ if line == 1 and l.startswith('\xef\xbb\xbf'):
+ # Someone set us up the BOM
+ l = l[3:]
+ if cont:
+ if commentre.match(l):
+ continue
+ m = contre.match(l)
+ if m:
+ if sections and section not in sections:
+ continue
+ v = self.get(section, item) + "\n" + m.group(1)
+ self.set(section, item, v, "%s:%d" % (src, line))
+ continue
+ item = None
+ cont = False
+ m = includere.match(l)
+ if m:
+ inc = util.expandpath(m.group(1))
+ base = os.path.dirname(src)
+ inc = os.path.normpath(os.path.join(base, inc))
+ if include:
+ try:
+ include(inc, remap=remap, sections=sections)
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise error.ParseError(_("cannot include %s (%s)")
+ % (inc, inst.strerror),
+ "%s:%s" % (src, line))
+ continue
+ if emptyre.match(l):
+ continue
+ m = sectionre.match(l)
+ if m:
+ section = m.group(1)
+ if remap:
+ section = remap.get(section, section)
+ if section not in self:
+ self._data[section] = sortdict()
+ continue
+ m = itemre.match(l)
+ if m:
+ item = m.group(1)
+ cont = True
+ if sections and section not in sections:
+ continue
+ self.set(section, item, m.group(2), "%s:%d" % (src, line))
+ continue
+ m = unsetre.match(l)
+ if m:
+ name = m.group(1)
+ if sections and section not in sections:
+ continue
+ if self.get(section, name) is not None:
+ del self._data[section][name]
+ continue
+
+ raise error.ParseError(l.rstrip(), ("%s:%s" % (src, line)))
+
+ def read(self, path, fp=None, sections=None, remap=None):
+ if not fp:
+ fp = util.posixfile(path)
+ self.parse(path, fp.read(), sections, remap, self.read)
diff --git a/mercurial/context.py b/mercurial/context.py
new file mode 100644
index 0000000..88ea3e4
--- /dev/null
+++ b/mercurial/context.py
@@ -0,0 +1,1314 @@
+# context.py - changeset and file context objects for mercurial
+#
+# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid, nullrev, short, hex, bin
+from i18n import _
+import ancestor, mdiff, error, util, scmutil, subrepo, patch, encoding, phases
+import copies
+import match as matchmod
+import os, errno, stat
+
+propertycache = util.propertycache
+
+class changectx(object):
+ """A changecontext object makes access to data related to a particular
+ changeset convenient."""
+ def __init__(self, repo, changeid=''):
+ """changeid is a revision number, node, or tag"""
+ if changeid == '':
+ changeid = '.'
+ self._repo = repo
+
+ if isinstance(changeid, int):
+ self._rev = changeid
+ self._node = repo.changelog.node(changeid)
+ return
+ if isinstance(changeid, long):
+ changeid = str(changeid)
+ if changeid == '.':
+ self._node = repo.dirstate.p1()
+ self._rev = repo.changelog.rev(self._node)
+ return
+ if changeid == 'null':
+ self._node = nullid
+ self._rev = nullrev
+ return
+ if changeid == 'tip':
+ self._rev = len(repo.changelog) - 1
+ self._node = repo.changelog.node(self._rev)
+ return
+ if len(changeid) == 20:
+ try:
+ self._node = changeid
+ self._rev = repo.changelog.rev(changeid)
+ return
+ except LookupError:
+ pass
+
+ try:
+ r = int(changeid)
+ if str(r) != changeid:
+ raise ValueError
+ l = len(repo.changelog)
+ if r < 0:
+ r += l
+ if r < 0 or r >= l:
+ raise ValueError
+ self._rev = r
+ self._node = repo.changelog.node(r)
+ return
+ except (ValueError, OverflowError):
+ pass
+
+ if len(changeid) == 40:
+ try:
+ self._node = bin(changeid)
+ self._rev = repo.changelog.rev(self._node)
+ return
+ except (TypeError, LookupError):
+ pass
+
+ if changeid in repo._bookmarks:
+ self._node = repo._bookmarks[changeid]
+ self._rev = repo.changelog.rev(self._node)
+ return
+ if changeid in repo._tagscache.tags:
+ self._node = repo._tagscache.tags[changeid]
+ self._rev = repo.changelog.rev(self._node)
+ return
+ try:
+ self._node = repo.branchtip(changeid)
+ self._rev = repo.changelog.rev(self._node)
+ return
+ except error.RepoLookupError:
+ pass
+
+ self._node = repo.changelog._partialmatch(changeid)
+ if self._node is not None:
+ self._rev = repo.changelog.rev(self._node)
+ return
+
+ # lookup failed
+ # check if it might have come from damaged dirstate
+ if changeid in repo.dirstate.parents():
+ raise error.Abort(_("working directory has unknown parent '%s'!")
+ % short(changeid))
+ try:
+ if len(changeid) == 20:
+ changeid = hex(changeid)
+ except TypeError:
+ pass
+ raise error.RepoLookupError(
+ _("unknown revision '%s'") % changeid)
+
+ def __str__(self):
+ return short(self.node())
+
+ def __int__(self):
+ return self.rev()
+
+ def __repr__(self):
+ return "<changectx %s>" % str(self)
+
+ def __hash__(self):
+ try:
+ return hash(self._rev)
+ except AttributeError:
+ return id(self)
+
+ def __eq__(self, other):
+ try:
+ return self._rev == other._rev
+ except AttributeError:
+ return False
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ def __nonzero__(self):
+ return self._rev != nullrev
+
+ @propertycache
+ def _changeset(self):
+ return self._repo.changelog.read(self.rev())
+
+ @propertycache
+ def _manifest(self):
+ return self._repo.manifest.read(self._changeset[0])
+
+ @propertycache
+ def _manifestdelta(self):
+ return self._repo.manifest.readdelta(self._changeset[0])
+
+ @propertycache
+ def _parents(self):
+ p = self._repo.changelog.parentrevs(self._rev)
+ if p[1] == nullrev:
+ p = p[:-1]
+ return [changectx(self._repo, x) for x in p]
+
+ @propertycache
+ def substate(self):
+ return subrepo.state(self, self._repo.ui)
+
+ def __contains__(self, key):
+ return key in self._manifest
+
+ def __getitem__(self, key):
+ return self.filectx(key)
+
+ def __iter__(self):
+ for f in sorted(self._manifest):
+ yield f
+
+ def changeset(self):
+ return self._changeset
+ def manifest(self):
+ return self._manifest
+ def manifestnode(self):
+ return self._changeset[0]
+
+ def rev(self):
+ return self._rev
+ def node(self):
+ return self._node
+ def hex(self):
+ return hex(self._node)
+ def user(self):
+ return self._changeset[1]
+ def date(self):
+ return self._changeset[2]
+ def files(self):
+ return self._changeset[3]
+ def description(self):
+ return self._changeset[4]
+ def branch(self):
+ return encoding.tolocal(self._changeset[5].get("branch"))
+ def closesbranch(self):
+ return 'close' in self._changeset[5]
+ def extra(self):
+ return self._changeset[5]
+ def tags(self):
+ return self._repo.nodetags(self._node)
+ def bookmarks(self):
+ return self._repo.nodebookmarks(self._node)
+ def phase(self):
+ return self._repo._phasecache.phase(self._repo, self._rev)
+ def phasestr(self):
+ return phases.phasenames[self.phase()]
+ def mutable(self):
+ return self.phase() > phases.public
+ def hidden(self):
+ return self._rev in self._repo.hiddenrevs
+
+ def parents(self):
+ """return contexts for each parent changeset"""
+ return self._parents
+
+ def p1(self):
+ return self._parents[0]
+
+ def p2(self):
+ if len(self._parents) == 2:
+ return self._parents[1]
+ return changectx(self._repo, -1)
+
+ def children(self):
+ """return contexts for each child changeset"""
+ c = self._repo.changelog.children(self._node)
+ return [changectx(self._repo, x) for x in c]
+
+ def ancestors(self):
+ for a in self._repo.changelog.ancestors([self._rev]):
+ yield changectx(self._repo, a)
+
+ def descendants(self):
+ for d in self._repo.changelog.descendants([self._rev]):
+ yield changectx(self._repo, d)
+
+ def obsolete(self):
+ """True if the changeset is obsolete"""
+ return (self.node() in self._repo.obsstore.precursors
+ and self.phase() > phases.public)
+
+ def extinct(self):
+ """True if the changeset is extinct"""
+ # We should just compute a cache a check againts it.
+ # see revset implementation for details
+ #
+ # But this naive implementation does not require cache
+ if self.phase() <= phases.public:
+ return False
+ if not self.obsolete():
+ return False
+ for desc in self.descendants():
+ if not desc.obsolete():
+ return False
+ return True
+
+ def unstable(self):
+ """True if the changeset is not obsolete but it's ancestor are"""
+ # We should just compute /(obsolete()::) - obsolete()/
+ # and keep it in a cache.
+ #
+ # But this naive implementation does not require cache
+ if self.phase() <= phases.public:
+ return False
+ if self.obsolete():
+ return False
+ for anc in self.ancestors():
+ if anc.obsolete():
+ return True
+ return False
+
+ def _fileinfo(self, path):
+ if '_manifest' in self.__dict__:
+ try:
+ return self._manifest[path], self._manifest.flags(path)
+ except KeyError:
+ raise error.LookupError(self._node, path,
+ _('not found in manifest'))
+ if '_manifestdelta' in self.__dict__ or path in self.files():
+ if path in self._manifestdelta:
+ return (self._manifestdelta[path],
+ self._manifestdelta.flags(path))
+ node, flag = self._repo.manifest.find(self._changeset[0], path)
+ if not node:
+ raise error.LookupError(self._node, path,
+ _('not found in manifest'))
+
+ return node, flag
+
+ def filenode(self, path):
+ return self._fileinfo(path)[0]
+
+ def flags(self, path):
+ try:
+ return self._fileinfo(path)[1]
+ except error.LookupError:
+ return ''
+
+ def filectx(self, path, fileid=None, filelog=None):
+ """get a file context from this changeset"""
+ if fileid is None:
+ fileid = self.filenode(path)
+ return filectx(self._repo, path, fileid=fileid,
+ changectx=self, filelog=filelog)
+
+ def ancestor(self, c2):
+ """
+ return the ancestor context of self and c2
+ """
+ # deal with workingctxs
+ n2 = c2._node
+ if n2 is None:
+ n2 = c2._parents[0]._node
+ n = self._repo.changelog.ancestor(self._node, n2)
+ return changectx(self._repo, n)
+
+ def walk(self, match):
+ fset = set(match.files())
+ # for dirstate.walk, files=['.'] means "walk the whole tree".
+ # follow that here, too
+ fset.discard('.')
+ for fn in self:
+ if fn in fset:
+ # specified pattern is the exact name
+ fset.remove(fn)
+ if match(fn):
+ yield fn
+ for fn in sorted(fset):
+ if fn in self._dirs:
+ # specified pattern is a directory
+ continue
+ if match.bad(fn, _('no such file in rev %s') % self) and match(fn):
+ yield fn
+
+ def sub(self, path):
+ return subrepo.subrepo(self, path)
+
+ def match(self, pats=[], include=None, exclude=None, default='glob'):
+ r = self._repo
+ return matchmod.match(r.root, r.getcwd(), pats,
+ include, exclude, default,
+ auditor=r.auditor, ctx=self)
+
+ def diff(self, ctx2=None, match=None, **opts):
+ """Returns a diff generator for the given contexts and matcher"""
+ if ctx2 is None:
+ ctx2 = self.p1()
+ if ctx2 is not None and not isinstance(ctx2, changectx):
+ ctx2 = self._repo[ctx2]
+ diffopts = patch.diffopts(self._repo.ui, opts)
+ return patch.diff(self._repo, ctx2.node(), self.node(),
+ match=match, opts=diffopts)
+
+ @propertycache
+ def _dirs(self):
+ dirs = set()
+ for f in self._manifest:
+ pos = f.rfind('/')
+ while pos != -1:
+ f = f[:pos]
+ if f in dirs:
+ break # dirs already contains this and above
+ dirs.add(f)
+ pos = f.rfind('/')
+ return dirs
+
+ def dirs(self):
+ return self._dirs
+
+class filectx(object):
+ """A filecontext object makes access to data related to a particular
+ filerevision convenient."""
+ def __init__(self, repo, path, changeid=None, fileid=None,
+ filelog=None, changectx=None):
+ """changeid can be a changeset revision, node, or tag.
+ fileid can be a file revision or node."""
+ self._repo = repo
+ self._path = path
+
+ assert (changeid is not None
+ or fileid is not None
+ or changectx is not None), \
+ ("bad args: changeid=%r, fileid=%r, changectx=%r"
+ % (changeid, fileid, changectx))
+
+ if filelog:
+ self._filelog = filelog
+
+ if changeid is not None:
+ self._changeid = changeid
+ if changectx is not None:
+ self._changectx = changectx
+ if fileid is not None:
+ self._fileid = fileid
+
+ @propertycache
+ def _changectx(self):
+ return changectx(self._repo, self._changeid)
+
+ @propertycache
+ def _filelog(self):
+ return self._repo.file(self._path)
+
+ @propertycache
+ def _changeid(self):
+ if '_changectx' in self.__dict__:
+ return self._changectx.rev()
+ else:
+ return self._filelog.linkrev(self._filerev)
+
+ @propertycache
+ def _filenode(self):
+ if '_fileid' in self.__dict__:
+ return self._filelog.lookup(self._fileid)
+ else:
+ return self._changectx.filenode(self._path)
+
+ @propertycache
+ def _filerev(self):
+ return self._filelog.rev(self._filenode)
+
+ @propertycache
+ def _repopath(self):
+ return self._path
+
+ def __nonzero__(self):
+ try:
+ self._filenode
+ return True
+ except error.LookupError:
+ # file is missing
+ return False
+
+ def __str__(self):
+ return "%s@%s" % (self.path(), short(self.node()))
+
+ def __repr__(self):
+ return "<filectx %s>" % str(self)
+
+ def __hash__(self):
+ try:
+ return hash((self._path, self._filenode))
+ except AttributeError:
+ return id(self)
+
+ def __eq__(self, other):
+ try:
+ return (self._path == other._path
+ and self._filenode == other._filenode)
+ except AttributeError:
+ return False
+
+ def __ne__(self, other):
+ return not (self == other)
+
+ def filectx(self, fileid):
+ '''opens an arbitrary revision of the file without
+ opening a new filelog'''
+ return filectx(self._repo, self._path, fileid=fileid,
+ filelog=self._filelog)
+
+ def filerev(self):
+ return self._filerev
+ def filenode(self):
+ return self._filenode
+ def flags(self):
+ return self._changectx.flags(self._path)
+ def filelog(self):
+ return self._filelog
+
+ def rev(self):
+ if '_changectx' in self.__dict__:
+ return self._changectx.rev()
+ if '_changeid' in self.__dict__:
+ return self._changectx.rev()
+ return self._filelog.linkrev(self._filerev)
+
+ def linkrev(self):
+ return self._filelog.linkrev(self._filerev)
+ def node(self):
+ return self._changectx.node()
+ def hex(self):
+ return hex(self.node())
+ def user(self):
+ return self._changectx.user()
+ def date(self):
+ return self._changectx.date()
+ def files(self):
+ return self._changectx.files()
+ def description(self):
+ return self._changectx.description()
+ def branch(self):
+ return self._changectx.branch()
+ def extra(self):
+ return self._changectx.extra()
+ def manifest(self):
+ return self._changectx.manifest()
+ def changectx(self):
+ return self._changectx
+
+ def data(self):
+ return self._filelog.read(self._filenode)
+ def path(self):
+ return self._path
+ def size(self):
+ return self._filelog.size(self._filerev)
+
+ def isbinary(self):
+ try:
+ return util.binary(self.data())
+ except IOError:
+ return False
+
+ def cmp(self, fctx):
+ """compare with other file context
+
+ returns True if different than fctx.
+ """
+ if (fctx._filerev is None
+ and (self._repo._encodefilterpats
+ # if file data starts with '\1\n', empty metadata block is
+ # prepended, which adds 4 bytes to filelog.size().
+ or self.size() - 4 == fctx.size())
+ or self.size() == fctx.size()):
+ return self._filelog.cmp(self._filenode, fctx.data())
+
+ return True
+
+ def renamed(self):
+ """check if file was actually renamed in this changeset revision
+
+ If rename logged in file revision, we report copy for changeset only
+ if file revisions linkrev points back to the changeset in question
+ or both changeset parents contain different file revisions.
+ """
+
+ renamed = self._filelog.renamed(self._filenode)
+ if not renamed:
+ return renamed
+
+ if self.rev() == self.linkrev():
+ return renamed
+
+ name = self.path()
+ fnode = self._filenode
+ for p in self._changectx.parents():
+ try:
+ if fnode == p.filenode(name):
+ return None
+ except error.LookupError:
+ pass
+ return renamed
+
+ def parents(self):
+ p = self._path
+ fl = self._filelog
+ pl = [(p, n, fl) for n in self._filelog.parents(self._filenode)]
+
+ r = self._filelog.renamed(self._filenode)
+ if r:
+ pl[0] = (r[0], r[1], None)
+
+ return [filectx(self._repo, p, fileid=n, filelog=l)
+ for p, n, l in pl if n != nullid]
+
+ def p1(self):
+ return self.parents()[0]
+
+ def p2(self):
+ p = self.parents()
+ if len(p) == 2:
+ return p[1]
+ return filectx(self._repo, self._path, fileid=-1, filelog=self._filelog)
+
+ def children(self):
+ # hard for renames
+ c = self._filelog.children(self._filenode)
+ return [filectx(self._repo, self._path, fileid=x,
+ filelog=self._filelog) for x in c]
+
+ def annotate(self, follow=False, linenumber=None, diffopts=None):
+ '''returns a list of tuples of (ctx, line) for each line
+ in the file, where ctx is the filectx of the node where
+ that line was last changed.
+ This returns tuples of ((ctx, linenumber), line) for each line,
+ if "linenumber" parameter is NOT "None".
+ In such tuples, linenumber means one at the first appearance
+ in the managed file.
+ To reduce annotation cost,
+ this returns fixed value(False is used) as linenumber,
+ if "linenumber" parameter is "False".'''
+
+ def decorate_compat(text, rev):
+ return ([rev] * len(text.splitlines()), text)
+
+ def without_linenumber(text, rev):
+ return ([(rev, False)] * len(text.splitlines()), text)
+
+ def with_linenumber(text, rev):
+ size = len(text.splitlines())
+ return ([(rev, i) for i in xrange(1, size + 1)], text)
+
+ decorate = (((linenumber is None) and decorate_compat) or
+ (linenumber and with_linenumber) or
+ without_linenumber)
+
+ def pair(parent, child):
+ blocks = mdiff.allblocks(parent[1], child[1], opts=diffopts,
+ refine=True)
+ for (a1, a2, b1, b2), t in blocks:
+ # Changed blocks ('!') or blocks made only of blank lines ('~')
+ # belong to the child.
+ if t == '=':
+ child[0][b1:b2] = parent[0][a1:a2]
+ return child
+
+ getlog = util.lrucachefunc(lambda x: self._repo.file(x))
+ def getctx(path, fileid):
+ log = path == self._path and self._filelog or getlog(path)
+ return filectx(self._repo, path, fileid=fileid, filelog=log)
+ getctx = util.lrucachefunc(getctx)
+
+ def parents(f):
+ # we want to reuse filectx objects as much as possible
+ p = f._path
+ if f._filerev is None: # working dir
+ pl = [(n.path(), n.filerev()) for n in f.parents()]
+ else:
+ pl = [(p, n) for n in f._filelog.parentrevs(f._filerev)]
+
+ if follow:
+ r = f.renamed()
+ if r:
+ pl[0] = (r[0], getlog(r[0]).rev(r[1]))
+
+ return [getctx(p, n) for p, n in pl if n != nullrev]
+
+ # use linkrev to find the first changeset where self appeared
+ if self.rev() != self.linkrev():
+ base = self.filectx(self.filerev())
+ else:
+ base = self
+
+ # This algorithm would prefer to be recursive, but Python is a
+ # bit recursion-hostile. Instead we do an iterative
+ # depth-first search.
+
+ visit = [base]
+ hist = {}
+ pcache = {}
+ needed = {base: 1}
+ while visit:
+ f = visit[-1]
+ if f not in pcache:
+ pcache[f] = parents(f)
+
+ ready = True
+ pl = pcache[f]
+ for p in pl:
+ if p not in hist:
+ ready = False
+ visit.append(p)
+ needed[p] = needed.get(p, 0) + 1
+ if ready:
+ visit.pop()
+ curr = decorate(f.data(), f)
+ for p in pl:
+ curr = pair(hist[p], curr)
+ if needed[p] == 1:
+ del hist[p]
+ else:
+ needed[p] -= 1
+
+ hist[f] = curr
+ pcache[f] = []
+
+ return zip(hist[base][0], hist[base][1].splitlines(True))
+
+ def ancestor(self, fc2, actx):
+ """
+ find the common ancestor file context, if any, of self, and fc2
+
+ actx must be the changectx of the common ancestor
+ of self's and fc2's respective changesets.
+ """
+
+ # the easy case: no (relevant) renames
+ if fc2.path() == self.path() and self.path() in actx:
+ return actx[self.path()]
+
+ # the next easiest cases: unambiguous predecessor (name trumps
+ # history)
+ if self.path() in actx and fc2.path() not in actx:
+ return actx[self.path()]
+ if fc2.path() in actx and self.path() not in actx:
+ return actx[fc2.path()]
+
+ # prime the ancestor cache for the working directory
+ acache = {}
+ for c in (self, fc2):
+ if c._filerev is None:
+ pl = [(n.path(), n.filenode()) for n in c.parents()]
+ acache[(c._path, None)] = pl
+
+ flcache = {self._repopath:self._filelog, fc2._repopath:fc2._filelog}
+ def parents(vertex):
+ if vertex in acache:
+ return acache[vertex]
+ f, n = vertex
+ if f not in flcache:
+ flcache[f] = self._repo.file(f)
+ fl = flcache[f]
+ pl = [(f, p) for p in fl.parents(n) if p != nullid]
+ re = fl.renamed(n)
+ if re:
+ pl.append(re)
+ acache[vertex] = pl
+ return pl
+
+ a, b = (self._path, self._filenode), (fc2._path, fc2._filenode)
+ v = ancestor.ancestor(a, b, parents)
+ if v:
+ f, n = v
+ return filectx(self._repo, f, fileid=n, filelog=flcache[f])
+
+ return None
+
+ def ancestors(self, followfirst=False):
+ visit = {}
+ c = self
+ cut = followfirst and 1 or None
+ while True:
+ for parent in c.parents()[:cut]:
+ visit[(parent.rev(), parent.node())] = parent
+ if not visit:
+ break
+ c = visit.pop(max(visit))
+ yield c
+
+ def copies(self, c2):
+ if not util.safehasattr(self, "_copycache"):
+ self._copycache = {}
+ sc2 = str(c2)
+ if sc2 not in self._copycache:
+ self._copycache[sc2] = copies.pathcopies(c2)
+ return self._copycache[sc2]
+
+class workingctx(changectx):
+ """A workingctx object makes access to data related to
+ the current working directory convenient.
+ date - any valid date string or (unixtime, offset), or None.
+ user - username string, or None.
+ extra - a dictionary of extra values, or None.
+ changes - a list of file lists as returned by localrepo.status()
+ or None to use the repository status.
+ """
+ def __init__(self, repo, text="", user=None, date=None, extra=None,
+ changes=None):
+ self._repo = repo
+ self._rev = None
+ self._node = None
+ self._text = text
+ if date:
+ self._date = util.parsedate(date)
+ if user:
+ self._user = user
+ if changes:
+ self._status = list(changes[:4])
+ self._unknown = changes[4]
+ self._ignored = changes[5]
+ self._clean = changes[6]
+ else:
+ self._unknown = None
+ self._ignored = None
+ self._clean = None
+
+ self._extra = {}
+ if extra:
+ self._extra = extra.copy()
+ if 'branch' not in self._extra:
+ try:
+ branch = encoding.fromlocal(self._repo.dirstate.branch())
+ except UnicodeDecodeError:
+ raise util.Abort(_('branch name not in UTF-8!'))
+ self._extra['branch'] = branch
+ if self._extra['branch'] == '':
+ self._extra['branch'] = 'default'
+
+ def __str__(self):
+ return str(self._parents[0]) + "+"
+
+ def __repr__(self):
+ return "<workingctx %s>" % str(self)
+
+ def __nonzero__(self):
+ return True
+
+ def __contains__(self, key):
+ return self._repo.dirstate[key] not in "?r"
+
+ def _buildflagfunc(self):
+ # Create a fallback function for getting file flags when the
+ # filesystem doesn't support them
+
+ copiesget = self._repo.dirstate.copies().get
+
+ if len(self._parents) < 2:
+ # when we have one parent, it's easy: copy from parent
+ man = self._parents[0].manifest()
+ def func(f):
+ f = copiesget(f, f)
+ return man.flags(f)
+ else:
+ # merges are tricky: we try to reconstruct the unstored
+ # result from the merge (issue1802)
+ p1, p2 = self._parents
+ pa = p1.ancestor(p2)
+ m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
+
+ def func(f):
+ f = copiesget(f, f) # may be wrong for merges with copies
+ fl1, fl2, fla = m1.flags(f), m2.flags(f), ma.flags(f)
+ if fl1 == fl2:
+ return fl1
+ if fl1 == fla:
+ return fl2
+ if fl2 == fla:
+ return fl1
+ return '' # punt for conflicts
+
+ return func
+
+ @propertycache
+ def _flagfunc(self):
+ return self._repo.dirstate.flagfunc(self._buildflagfunc)
+
+ @propertycache
+ def _manifest(self):
+ """generate a manifest corresponding to the working directory"""
+
+ man = self._parents[0].manifest().copy()
+ if len(self._parents) > 1:
+ man2 = self.p2().manifest()
+ def getman(f):
+ if f in man:
+ return man
+ return man2
+ else:
+ getman = lambda f: man
+
+ copied = self._repo.dirstate.copies()
+ ff = self._flagfunc
+ modified, added, removed, deleted = self._status
+ for i, l in (("a", added), ("m", modified)):
+ for f in l:
+ orig = copied.get(f, f)
+ man[f] = getman(orig).get(orig, nullid) + i
+ try:
+ man.set(f, ff(f))
+ except OSError:
+ pass
+
+ for f in deleted + removed:
+ if f in man:
+ del man[f]
+
+ return man
+
+ def __iter__(self):
+ d = self._repo.dirstate
+ for f in d:
+ if d[f] != 'r':
+ yield f
+
+ @propertycache
+ def _status(self):
+ return self._repo.status()[:4]
+
+ @propertycache
+ def _user(self):
+ return self._repo.ui.username()
+
+ @propertycache
+ def _date(self):
+ return util.makedate()
+
+ @propertycache
+ def _parents(self):
+ p = self._repo.dirstate.parents()
+ if p[1] == nullid:
+ p = p[:-1]
+ self._parents = [changectx(self._repo, x) for x in p]
+ return self._parents
+
+ def status(self, ignored=False, clean=False, unknown=False):
+ """Explicit status query
+ Unless this method is used to query the working copy status, the
+ _status property will implicitly read the status using its default
+ arguments."""
+ stat = self._repo.status(ignored=ignored, clean=clean, unknown=unknown)
+ self._unknown = self._ignored = self._clean = None
+ if unknown:
+ self._unknown = stat[4]
+ if ignored:
+ self._ignored = stat[5]
+ if clean:
+ self._clean = stat[6]
+ self._status = stat[:4]
+ return stat
+
+ def manifest(self):
+ return self._manifest
+ def user(self):
+ return self._user or self._repo.ui.username()
+ def date(self):
+ return self._date
+ def description(self):
+ return self._text
+ def files(self):
+ return sorted(self._status[0] + self._status[1] + self._status[2])
+
+ def modified(self):
+ return self._status[0]
+ def added(self):
+ return self._status[1]
+ def removed(self):
+ return self._status[2]
+ def deleted(self):
+ return self._status[3]
+ def unknown(self):
+ assert self._unknown is not None # must call status first
+ return self._unknown
+ def ignored(self):
+ assert self._ignored is not None # must call status first
+ return self._ignored
+ def clean(self):
+ assert self._clean is not None # must call status first
+ return self._clean
+ def branch(self):
+ return encoding.tolocal(self._extra['branch'])
+ def closesbranch(self):
+ return 'close' in self._extra
+ def extra(self):
+ return self._extra
+
+ def tags(self):
+ t = []
+ for p in self.parents():
+ t.extend(p.tags())
+ return t
+
+ def bookmarks(self):
+ b = []
+ for p in self.parents():
+ b.extend(p.bookmarks())
+ return b
+
+ def phase(self):
+ phase = phases.draft # default phase to draft
+ for p in self.parents():
+ phase = max(phase, p.phase())
+ return phase
+
+ def hidden(self):
+ return False
+
+ def children(self):
+ return []
+
+ def flags(self, path):
+ if '_manifest' in self.__dict__:
+ try:
+ return self._manifest.flags(path)
+ except KeyError:
+ return ''
+
+ try:
+ return self._flagfunc(path)
+ except OSError:
+ return ''
+
+ def filectx(self, path, filelog=None):
+ """get a file context from the working directory"""
+ return workingfilectx(self._repo, path, workingctx=self,
+ filelog=filelog)
+
+ def ancestor(self, c2):
+ """return the ancestor context of self and c2"""
+ return self._parents[0].ancestor(c2) # punt on two parents for now
+
+ def walk(self, match):
+ return sorted(self._repo.dirstate.walk(match, self.substate.keys(),
+ True, False))
+
+ def dirty(self, missing=False, merge=True, branch=True):
+ "check whether a working directory is modified"
+ # check subrepos first
+ for s in self.substate:
+ if self.sub(s).dirty():
+ return True
+ # check current working dir
+ return ((merge and self.p2()) or
+ (branch and self.branch() != self.p1().branch()) or
+ self.modified() or self.added() or self.removed() or
+ (missing and self.deleted()))
+
+ def add(self, list, prefix=""):
+ join = lambda f: os.path.join(prefix, f)
+ wlock = self._repo.wlock()
+ ui, ds = self._repo.ui, self._repo.dirstate
+ try:
+ rejected = []
+ for f in list:
+ scmutil.checkportable(ui, join(f))
+ p = self._repo.wjoin(f)
+ try:
+ st = os.lstat(p)
+ except OSError:
+ ui.warn(_("%s does not exist!\n") % join(f))
+ rejected.append(f)
+ continue
+ if st.st_size > 10000000:
+ ui.warn(_("%s: up to %d MB of RAM may be required "
+ "to manage this file\n"
+ "(use 'hg revert %s' to cancel the "
+ "pending addition)\n")
+ % (f, 3 * st.st_size // 1000000, join(f)))
+ if not (stat.S_ISREG(st.st_mode) or stat.S_ISLNK(st.st_mode)):
+ ui.warn(_("%s not added: only files and symlinks "
+ "supported currently\n") % join(f))
+ rejected.append(p)
+ elif ds[f] in 'amn':
+ ui.warn(_("%s already tracked!\n") % join(f))
+ elif ds[f] == 'r':
+ ds.normallookup(f)
+ else:
+ ds.add(f)
+ return rejected
+ finally:
+ wlock.release()
+
+ def forget(self, files, prefix=""):
+ join = lambda f: os.path.join(prefix, f)
+ wlock = self._repo.wlock()
+ try:
+ rejected = []
+ for f in files:
+ if f not in self._repo.dirstate:
+ self._repo.ui.warn(_("%s not tracked!\n") % join(f))
+ rejected.append(f)
+ elif self._repo.dirstate[f] != 'a':
+ self._repo.dirstate.remove(f)
+ else:
+ self._repo.dirstate.drop(f)
+ return rejected
+ finally:
+ wlock.release()
+
+ def ancestors(self):
+ for a in self._repo.changelog.ancestors(
+ [p.rev() for p in self._parents]):
+ yield changectx(self._repo, a)
+
+ def undelete(self, list):
+ pctxs = self.parents()
+ wlock = self._repo.wlock()
+ try:
+ for f in list:
+ if self._repo.dirstate[f] != 'r':
+ self._repo.ui.warn(_("%s not removed!\n") % f)
+ else:
+ fctx = f in pctxs[0] and pctxs[0][f] or pctxs[1][f]
+ t = fctx.data()
+ self._repo.wwrite(f, t, fctx.flags())
+ self._repo.dirstate.normal(f)
+ finally:
+ wlock.release()
+
+ def copy(self, source, dest):
+ p = self._repo.wjoin(dest)
+ if not os.path.lexists(p):
+ self._repo.ui.warn(_("%s does not exist!\n") % dest)
+ elif not (os.path.isfile(p) or os.path.islink(p)):
+ self._repo.ui.warn(_("copy failed: %s is not a file or a "
+ "symbolic link\n") % dest)
+ else:
+ wlock = self._repo.wlock()
+ try:
+ if self._repo.dirstate[dest] in '?r':
+ self._repo.dirstate.add(dest)
+ self._repo.dirstate.copy(source, dest)
+ finally:
+ wlock.release()
+
+ def dirs(self):
+ return set(self._repo.dirstate.dirs())
+
+class workingfilectx(filectx):
+ """A workingfilectx object makes access to data related to a particular
+ file in the working directory convenient."""
+ def __init__(self, repo, path, filelog=None, workingctx=None):
+ """changeid can be a changeset revision, node, or tag.
+ fileid can be a file revision or node."""
+ self._repo = repo
+ self._path = path
+ self._changeid = None
+ self._filerev = self._filenode = None
+
+ if filelog:
+ self._filelog = filelog
+ if workingctx:
+ self._changectx = workingctx
+
+ @propertycache
+ def _changectx(self):
+ return workingctx(self._repo)
+
+ def __nonzero__(self):
+ return True
+
+ def __str__(self):
+ return "%s@%s" % (self.path(), self._changectx)
+
+ def __repr__(self):
+ return "<workingfilectx %s>" % str(self)
+
+ def data(self):
+ return self._repo.wread(self._path)
+ def renamed(self):
+ rp = self._repo.dirstate.copied(self._path)
+ if not rp:
+ return None
+ return rp, self._changectx._parents[0]._manifest.get(rp, nullid)
+
+ def parents(self):
+ '''return parent filectxs, following copies if necessary'''
+ def filenode(ctx, path):
+ return ctx._manifest.get(path, nullid)
+
+ path = self._path
+ fl = self._filelog
+ pcl = self._changectx._parents
+ renamed = self.renamed()
+
+ if renamed:
+ pl = [renamed + (None,)]
+ else:
+ pl = [(path, filenode(pcl[0], path), fl)]
+
+ for pc in pcl[1:]:
+ pl.append((path, filenode(pc, path), fl))
+
+ return [filectx(self._repo, p, fileid=n, filelog=l)
+ for p, n, l in pl if n != nullid]
+
+ def children(self):
+ return []
+
+ def size(self):
+ return os.lstat(self._repo.wjoin(self._path)).st_size
+ def date(self):
+ t, tz = self._changectx.date()
+ try:
+ return (int(os.lstat(self._repo.wjoin(self._path)).st_mtime), tz)
+ except OSError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return (t, tz)
+
+ def cmp(self, fctx):
+ """compare with other file context
+
+ returns True if different than fctx.
+ """
+ # fctx should be a filectx (not a wfctx)
+ # invert comparison to reuse the same code path
+ return fctx.cmp(self)
+
+class memctx(object):
+ """Use memctx to perform in-memory commits via localrepo.commitctx().
+
+ Revision information is supplied at initialization time while
+ related files data and is made available through a callback
+ mechanism. 'repo' is the current localrepo, 'parents' is a
+ sequence of two parent revisions identifiers (pass None for every
+ missing parent), 'text' is the commit message and 'files' lists
+ names of files touched by the revision (normalized and relative to
+ repository root).
+
+ filectxfn(repo, memctx, path) is a callable receiving the
+ repository, the current memctx object and the normalized path of
+ requested file, relative to repository root. It is fired by the
+ commit function for every file in 'files', but calls order is
+ undefined. If the file is available in the revision being
+ committed (updated or added), filectxfn returns a memfilectx
+ object. If the file was removed, filectxfn raises an
+ IOError. Moved files are represented by marking the source file
+ removed and the new file added with copy information (see
+ memfilectx).
+
+ user receives the committer name and defaults to current
+ repository username, date is the commit date in any format
+ supported by util.parsedate() and defaults to current date, extra
+ is a dictionary of metadata or is left empty.
+ """
+ def __init__(self, repo, parents, text, files, filectxfn, user=None,
+ date=None, extra=None):
+ self._repo = repo
+ self._rev = None
+ self._node = None
+ self._text = text
+ self._date = date and util.parsedate(date) or util.makedate()
+ self._user = user
+ parents = [(p or nullid) for p in parents]
+ p1, p2 = parents
+ self._parents = [changectx(self._repo, p) for p in (p1, p2)]
+ files = sorted(set(files))
+ self._status = [files, [], [], [], []]
+ self._filectxfn = filectxfn
+
+ self._extra = extra and extra.copy() or {}
+ if self._extra.get('branch', '') == '':
+ self._extra['branch'] = 'default'
+
+ def __str__(self):
+ return str(self._parents[0]) + "+"
+
+ def __int__(self):
+ return self._rev
+
+ def __nonzero__(self):
+ return True
+
+ def __getitem__(self, key):
+ return self.filectx(key)
+
+ def p1(self):
+ return self._parents[0]
+ def p2(self):
+ return self._parents[1]
+
+ def user(self):
+ return self._user or self._repo.ui.username()
+ def date(self):
+ return self._date
+ def description(self):
+ return self._text
+ def files(self):
+ return self.modified()
+ def modified(self):
+ return self._status[0]
+ def added(self):
+ return self._status[1]
+ def removed(self):
+ return self._status[2]
+ def deleted(self):
+ return self._status[3]
+ def unknown(self):
+ return self._status[4]
+ def ignored(self):
+ return self._status[5]
+ def clean(self):
+ return self._status[6]
+ def branch(self):
+ return encoding.tolocal(self._extra['branch'])
+ def extra(self):
+ return self._extra
+ def flags(self, f):
+ return self[f].flags()
+
+ def parents(self):
+ """return contexts for each parent changeset"""
+ return self._parents
+
+ def filectx(self, path, filelog=None):
+ """get a file context from the working directory"""
+ return self._filectxfn(self._repo, self, path)
+
+ def commit(self):
+ """commit context to the repo"""
+ return self._repo.commitctx(self)
+
+class memfilectx(object):
+ """memfilectx represents an in-memory file to commit.
+
+ See memctx for more details.
+ """
+ def __init__(self, path, data, islink=False, isexec=False, copied=None):
+ """
+ path is the normalized file path relative to repository root.
+ data is the file content as a string.
+ islink is True if the file is a symbolic link.
+ isexec is True if the file is executable.
+ copied is the source file path if current file was copied in the
+ revision being committed, or None."""
+ self._path = path
+ self._data = data
+ self._flags = (islink and 'l' or '') + (isexec and 'x' or '')
+ self._copied = None
+ if copied:
+ self._copied = (copied, nullid)
+
+ def __nonzero__(self):
+ return True
+ def __str__(self):
+ return "%s@%s" % (self.path(), self._changectx)
+ def path(self):
+ return self._path
+ def data(self):
+ return self._data
+ def flags(self):
+ return self._flags
+ def isexec(self):
+ return 'x' in self._flags
+ def islink(self):
+ return 'l' in self._flags
+ def renamed(self):
+ return self._copied
diff --git a/mercurial/copies.py b/mercurial/copies.py
new file mode 100644
index 0000000..90aa036
--- /dev/null
+++ b/mercurial/copies.py
@@ -0,0 +1,372 @@
+# copies.py - copy detection for Mercurial
+#
+# Copyright 2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import util
+import heapq
+
+def _nonoverlap(d1, d2, d3):
+ "Return list of elements in d1 not in d2 or d3"
+ return sorted([d for d in d1 if d not in d3 and d not in d2])
+
+def _dirname(f):
+ s = f.rfind("/")
+ if s == -1:
+ return ""
+ return f[:s]
+
+def _findlimit(repo, a, b):
+ """Find the earliest revision that's an ancestor of a or b but not both,
+ None if no such revision exists.
+ """
+ # basic idea:
+ # - mark a and b with different sides
+ # - if a parent's children are all on the same side, the parent is
+ # on that side, otherwise it is on no side
+ # - walk the graph in topological order with the help of a heap;
+ # - add unseen parents to side map
+ # - clear side of any parent that has children on different sides
+ # - track number of interesting revs that might still be on a side
+ # - track the lowest interesting rev seen
+ # - quit when interesting revs is zero
+
+ cl = repo.changelog
+ working = len(cl) # pseudo rev for the working directory
+ if a is None:
+ a = working
+ if b is None:
+ b = working
+
+ side = {a: -1, b: 1}
+ visit = [-a, -b]
+ heapq.heapify(visit)
+ interesting = len(visit)
+ hascommonancestor = False
+ limit = working
+
+ while interesting:
+ r = -heapq.heappop(visit)
+ if r == working:
+ parents = [cl.rev(p) for p in repo.dirstate.parents()]
+ else:
+ parents = cl.parentrevs(r)
+ for p in parents:
+ if p < 0:
+ continue
+ if p not in side:
+ # first time we see p; add it to visit
+ side[p] = side[r]
+ if side[p]:
+ interesting += 1
+ heapq.heappush(visit, -p)
+ elif side[p] and side[p] != side[r]:
+ # p was interesting but now we know better
+ side[p] = 0
+ interesting -= 1
+ hascommonancestor = True
+ if side[r]:
+ limit = r # lowest rev visited
+ interesting -= 1
+
+ if not hascommonancestor:
+ return None
+ return limit
+
+def _chain(src, dst, a, b):
+ '''chain two sets of copies a->b'''
+ t = a.copy()
+ for k, v in b.iteritems():
+ if v in t:
+ # found a chain
+ if t[v] != k:
+ # file wasn't renamed back to itself
+ t[k] = t[v]
+ if v not in dst:
+ # chain was a rename, not a copy
+ del t[v]
+ if v in src:
+ # file is a copy of an existing file
+ t[k] = v
+
+ # remove criss-crossed copies
+ for k, v in t.items():
+ if k in src and v in dst:
+ del t[k]
+
+ return t
+
+def _tracefile(fctx, actx):
+ '''return file context that is the ancestor of fctx present in actx'''
+ stop = actx.rev()
+ am = actx.manifest()
+
+ for f in fctx.ancestors():
+ if am.get(f.path(), None) == f.filenode():
+ return f
+ if f.rev() < stop:
+ return None
+
+def _dirstatecopies(d):
+ ds = d._repo.dirstate
+ c = ds.copies().copy()
+ for k in c.keys():
+ if ds[k] not in 'anm':
+ del c[k]
+ return c
+
+def _forwardcopies(a, b):
+ '''find {dst@b: src@a} copy mapping where a is an ancestor of b'''
+
+ # check for working copy
+ w = None
+ if b.rev() is None:
+ w = b
+ b = w.p1()
+ if a == b:
+ # short-circuit to avoid issues with merge states
+ return _dirstatecopies(w)
+
+ # find where new files came from
+ # we currently don't try to find where old files went, too expensive
+ # this means we can miss a case like 'hg rm b; hg cp a b'
+ cm = {}
+ for f in b:
+ if f not in a:
+ ofctx = _tracefile(b[f], a)
+ if ofctx:
+ cm[f] = ofctx.path()
+
+ # combine copies from dirstate if necessary
+ if w is not None:
+ cm = _chain(a, w, cm, _dirstatecopies(w))
+
+ return cm
+
+def _backwardcopies(a, b):
+ # because the forward mapping is 1:n, we can lose renames here
+ # in particular, we find renames better than copies
+ f = _forwardcopies(b, a)
+ r = {}
+ for k, v in f.iteritems():
+ r[v] = k
+ return r
+
+def pathcopies(x, y):
+ '''find {dst@y: src@x} copy mapping for directed compare'''
+ if x == y or not x or not y:
+ return {}
+ a = y.ancestor(x)
+ if a == x:
+ return _forwardcopies(x, y)
+ if a == y:
+ return _backwardcopies(x, y)
+ return _chain(x, y, _backwardcopies(x, a), _forwardcopies(a, y))
+
+def mergecopies(repo, c1, c2, ca):
+ """
+ Find moves and copies between context c1 and c2 that are relevant
+ for merging.
+
+ Returns two dicts, "copy" and "diverge".
+
+ "copy" is a mapping from destination name -> source name,
+ where source is in c1 and destination is in c2 or vice-versa.
+
+ "diverge" is a mapping of source name -> list of destination names
+ for divergent renames.
+
+ "renamedelete" is a mapping of source name -> list of destination
+ names for files deleted in c1 that were renamed in c2 or vice-versa.
+ """
+ # avoid silly behavior for update from empty dir
+ if not c1 or not c2 or c1 == c2:
+ return {}, {}, {}
+
+ # avoid silly behavior for parent -> working dir
+ if c2.node() is None and c1.node() == repo.dirstate.p1():
+ return repo.dirstate.copies(), {}, {}
+
+ limit = _findlimit(repo, c1.rev(), c2.rev())
+ if limit is None:
+ # no common ancestor, no copies
+ return {}, {}, {}
+ m1 = c1.manifest()
+ m2 = c2.manifest()
+ ma = ca.manifest()
+
+ def makectx(f, n):
+ if len(n) != 20: # in a working context?
+ if c1.rev() is None:
+ return c1.filectx(f)
+ return c2.filectx(f)
+ return repo.filectx(f, fileid=n)
+
+ ctx = util.lrucachefunc(makectx)
+ copy = {}
+ fullcopy = {}
+ diverge = {}
+
+ def related(f1, f2, limit):
+ # Walk back to common ancestor to see if the two files originate
+ # from the same file. Since workingfilectx's rev() is None it messes
+ # up the integer comparison logic, hence the pre-step check for
+ # None (f1 and f2 can only be workingfilectx's initially).
+
+ if f1 == f2:
+ return f1 # a match
+
+ g1, g2 = f1.ancestors(), f2.ancestors()
+ try:
+ f1r, f2r = f1.rev(), f2.rev()
+
+ if f1r is None:
+ f1 = g1.next()
+ if f2r is None:
+ f2 = g2.next()
+
+ while True:
+ f1r, f2r = f1.rev(), f2.rev()
+ if f1r > f2r:
+ f1 = g1.next()
+ elif f2r > f1r:
+ f2 = g2.next()
+ elif f1 == f2:
+ return f1 # a match
+ elif f1r == f2r or f1r < limit or f2r < limit:
+ return False # copy no longer relevant
+ except StopIteration:
+ return False
+
+ def checkcopies(f, m1, m2):
+ '''check possible copies of f from m1 to m2'''
+ of = None
+ seen = set([f])
+ for oc in ctx(f, m1[f]).ancestors():
+ ocr = oc.rev()
+ of = oc.path()
+ if of in seen:
+ # check limit late - grab last rename before
+ if ocr < limit:
+ break
+ continue
+ seen.add(of)
+
+ fullcopy[f] = of # remember for dir rename detection
+ if of not in m2:
+ continue # no match, keep looking
+ if m2[of] == ma.get(of):
+ break # no merge needed, quit early
+ c2 = ctx(of, m2[of])
+ cr = related(oc, c2, ca.rev())
+ if cr and (of == f or of == c2.path()): # non-divergent
+ copy[f] = of
+ of = None
+ break
+
+ if of in ma:
+ diverge.setdefault(of, []).append(f)
+
+ repo.ui.debug(" searching for copies back to rev %d\n" % limit)
+
+ u1 = _nonoverlap(m1, m2, ma)
+ u2 = _nonoverlap(m2, m1, ma)
+
+ if u1:
+ repo.ui.debug(" unmatched files in local:\n %s\n"
+ % "\n ".join(u1))
+ if u2:
+ repo.ui.debug(" unmatched files in other:\n %s\n"
+ % "\n ".join(u2))
+
+ for f in u1:
+ checkcopies(f, m1, m2)
+ for f in u2:
+ checkcopies(f, m2, m1)
+
+ renamedelete = {}
+ renamedelete2 = set()
+ diverge2 = set()
+ for of, fl in diverge.items():
+ if len(fl) == 1 or of in c1 or of in c2:
+ del diverge[of] # not actually divergent, or not a rename
+ if of not in c1 and of not in c2:
+ # renamed on one side, deleted on the other side, but filter
+ # out files that have been renamed and then deleted
+ renamedelete[of] = [f for f in fl if f in c1 or f in c2]
+ renamedelete2.update(fl) # reverse map for below
+ else:
+ diverge2.update(fl) # reverse map for below
+
+ if fullcopy:
+ repo.ui.debug(" all copies found (* = to merge, ! = divergent, "
+ "% = renamed and deleted):\n")
+ for f in fullcopy:
+ note = ""
+ if f in copy:
+ note += "*"
+ if f in diverge2:
+ note += "!"
+ if f in renamedelete2:
+ note += "%"
+ repo.ui.debug(" %s -> %s %s\n" % (f, fullcopy[f], note))
+ del diverge2
+
+ if not fullcopy:
+ return copy, diverge, renamedelete
+
+ repo.ui.debug(" checking for directory renames\n")
+
+ # generate a directory move map
+ d1, d2 = c1.dirs(), c2.dirs()
+ d1.add('')
+ d2.add('')
+ invalid = set()
+ dirmove = {}
+
+ # examine each file copy for a potential directory move, which is
+ # when all the files in a directory are moved to a new directory
+ for dst, src in fullcopy.iteritems():
+ dsrc, ddst = _dirname(src), _dirname(dst)
+ if dsrc in invalid:
+ # already seen to be uninteresting
+ continue
+ elif dsrc in d1 and ddst in d1:
+ # directory wasn't entirely moved locally
+ invalid.add(dsrc)
+ elif dsrc in d2 and ddst in d2:
+ # directory wasn't entirely moved remotely
+ invalid.add(dsrc)
+ elif dsrc in dirmove and dirmove[dsrc] != ddst:
+ # files from the same directory moved to two different places
+ invalid.add(dsrc)
+ else:
+ # looks good so far
+ dirmove[dsrc + "/"] = ddst + "/"
+
+ for i in invalid:
+ if i in dirmove:
+ del dirmove[i]
+ del d1, d2, invalid
+
+ if not dirmove:
+ return copy, diverge, renamedelete
+
+ for d in dirmove:
+ repo.ui.debug(" dir %s -> %s\n" % (d, dirmove[d]))
+
+ # check unaccounted nonoverlapping files against directory moves
+ for f in u1 + u2:
+ if f not in fullcopy:
+ for d in dirmove:
+ if f.startswith(d):
+ # new file added in a directory that was moved, move it
+ df = dirmove[d] + f[len(d):]
+ if df not in copy:
+ copy[f] = df
+ repo.ui.debug(" file %s -> %s\n" % (f, copy[f]))
+ break
+
+ return copy, diverge, renamedelete
diff --git a/mercurial/dagparser.py b/mercurial/dagparser.py
new file mode 100644
index 0000000..92bd4f0
--- /dev/null
+++ b/mercurial/dagparser.py
@@ -0,0 +1,479 @@
+# dagparser.py - parser and generator for concise description of DAGs
+#
+# Copyright 2010 Peter Arrenbrecht <peter@arrenbrecht.ch>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import re, string
+import util
+from i18n import _
+
+def parsedag(desc):
+ '''parses a DAG from a concise textual description; generates events
+
+ "+n" is a linear run of n nodes based on the current default parent
+ "." is a single node based on the current default parent
+ "$" resets the default parent to -1 (implied at the start);
+ otherwise the default parent is always the last node created
+ "<p" sets the default parent to the backref p
+ "*p" is a fork at parent p, where p is a backref
+ "*p1/p2/.../pn" is a merge of parents p1..pn, where the pi are backrefs
+ "/p2/.../pn" is a merge of the preceding node and p2..pn
+ ":name" defines a label for the preceding node; labels can be redefined
+ "@text" emits an annotation event for text
+ "!command" emits an action event for the current node
+ "!!my command\n" is like "!", but to the end of the line
+ "#...\n" is a comment up to the end of the line
+
+ Whitespace between the above elements is ignored.
+
+ A backref is either
+ * a number n, which references the node curr-n, where curr is the current
+ node, or
+ * the name of a label you placed earlier using ":name", or
+ * empty to denote the default parent.
+
+ All string valued-elements are either strictly alphanumeric, or must
+ be enclosed in double quotes ("..."), with "\" as escape character.
+
+ Generates sequence of
+
+ ('n', (id, [parentids])) for node creation
+ ('l', (id, labelname)) for labels on nodes
+ ('a', text) for annotations
+ ('c', command) for actions (!)
+ ('C', command) for line actions (!!)
+
+ Examples
+ --------
+
+ Example of a complex graph (output not shown for brevity):
+
+ >>> len(list(parsedag("""
+ ...
+ ... +3 # 3 nodes in linear run
+ ... :forkhere # a label for the last of the 3 nodes from above
+ ... +5 # 5 more nodes on one branch
+ ... :mergethis # label again
+ ... <forkhere # set default parent to labelled fork node
+ ... +10 # 10 more nodes on a parallel branch
+ ... @stable # following nodes will be annotated as "stable"
+ ... +5 # 5 nodes in stable
+ ... !addfile # custom command; could trigger new file in next node
+ ... +2 # two more nodes
+ ... /mergethis # merge last node with labelled node
+ ... +4 # 4 more nodes descending from merge node
+ ...
+ ... """)))
+ 34
+
+ Empty list:
+
+ >>> list(parsedag(""))
+ []
+
+ A simple linear run:
+
+ >>> list(parsedag("+3"))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))]
+
+ Some non-standard ways to define such runs:
+
+ >>> list(parsedag("+1+2"))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))]
+
+ >>> list(parsedag("+1*1*"))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))]
+
+ >>> list(parsedag("*"))
+ [('n', (0, [-1]))]
+
+ >>> list(parsedag("..."))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [1]))]
+
+ A fork and a join, using numeric back references:
+
+ >>> list(parsedag("+2*2*/2"))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [0])), ('n', (3, [2, 1]))]
+
+ >>> list(parsedag("+2<2+1/2"))
+ [('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [0])), ('n', (3, [2, 1]))]
+
+ Placing a label:
+
+ >>> list(parsedag("+1 :mylabel +1"))
+ [('n', (0, [-1])), ('l', (0, 'mylabel')), ('n', (1, [0]))]
+
+ An empty label (silly, really):
+
+ >>> list(parsedag("+1:+1"))
+ [('n', (0, [-1])), ('l', (0, '')), ('n', (1, [0]))]
+
+ Fork and join, but with labels instead of numeric back references:
+
+ >>> list(parsedag("+1:f +1:p2 *f */p2"))
+ [('n', (0, [-1])), ('l', (0, 'f')), ('n', (1, [0])), ('l', (1, 'p2')),
+ ('n', (2, [0])), ('n', (3, [2, 1]))]
+
+ >>> list(parsedag("+1:f +1:p2 <f +1 /p2"))
+ [('n', (0, [-1])), ('l', (0, 'f')), ('n', (1, [0])), ('l', (1, 'p2')),
+ ('n', (2, [0])), ('n', (3, [2, 1]))]
+
+ Restarting from the root:
+
+ >>> list(parsedag("+1 $ +1"))
+ [('n', (0, [-1])), ('n', (1, [-1]))]
+
+ Annotations, which are meant to introduce sticky state for subsequent nodes:
+
+ >>> list(parsedag("+1 @ann +1"))
+ [('n', (0, [-1])), ('a', 'ann'), ('n', (1, [0]))]
+
+ >>> list(parsedag('+1 @"my annotation" +1'))
+ [('n', (0, [-1])), ('a', 'my annotation'), ('n', (1, [0]))]
+
+ Commands, which are meant to operate on the most recently created node:
+
+ >>> list(parsedag("+1 !cmd +1"))
+ [('n', (0, [-1])), ('c', 'cmd'), ('n', (1, [0]))]
+
+ >>> list(parsedag('+1 !"my command" +1'))
+ [('n', (0, [-1])), ('c', 'my command'), ('n', (1, [0]))]
+
+ >>> list(parsedag('+1 !!my command line\\n +1'))
+ [('n', (0, [-1])), ('C', 'my command line'), ('n', (1, [0]))]
+
+ Comments, which extend to the end of the line:
+
+ >>> list(parsedag('+1 # comment\\n+1'))
+ [('n', (0, [-1])), ('n', (1, [0]))]
+
+ Error:
+
+ >>> try: list(parsedag('+1 bad'))
+ ... except Exception, e: print e
+ invalid character in dag description: bad...
+
+ '''
+ if not desc:
+ return
+
+ wordchars = string.ascii_letters + string.digits
+
+ labels = {}
+ p1 = -1
+ r = 0
+
+ def resolve(ref):
+ if not ref:
+ return p1
+ elif ref[0] in string.digits:
+ return r - int(ref)
+ else:
+ return labels[ref]
+
+ chiter = (c for c in desc)
+
+ def nextch():
+ try:
+ return chiter.next()
+ except StopIteration:
+ return '\0'
+
+ def nextrun(c, allow):
+ s = ''
+ while c in allow:
+ s += c
+ c = nextch()
+ return c, s
+
+ def nextdelimited(c, limit, escape):
+ s = ''
+ while c != limit:
+ if c == escape:
+ c = nextch()
+ s += c
+ c = nextch()
+ return nextch(), s
+
+ def nextstring(c):
+ if c == '"':
+ return nextdelimited(nextch(), '"', '\\')
+ else:
+ return nextrun(c, wordchars)
+
+ c = nextch()
+ while c != '\0':
+ while c in string.whitespace:
+ c = nextch()
+ if c == '.':
+ yield 'n', (r, [p1])
+ p1 = r
+ r += 1
+ c = nextch()
+ elif c == '+':
+ c, digs = nextrun(nextch(), string.digits)
+ n = int(digs)
+ for i in xrange(0, n):
+ yield 'n', (r, [p1])
+ p1 = r
+ r += 1
+ elif c in '*/':
+ if c == '*':
+ c = nextch()
+ c, pref = nextstring(c)
+ prefs = [pref]
+ while c == '/':
+ c, pref = nextstring(nextch())
+ prefs.append(pref)
+ ps = [resolve(ref) for ref in prefs]
+ yield 'n', (r, ps)
+ p1 = r
+ r += 1
+ elif c == '<':
+ c, ref = nextstring(nextch())
+ p1 = resolve(ref)
+ elif c == ':':
+ c, name = nextstring(nextch())
+ labels[name] = p1
+ yield 'l', (p1, name)
+ elif c == '@':
+ c, text = nextstring(nextch())
+ yield 'a', text
+ elif c == '!':
+ c = nextch()
+ if c == '!':
+ cmd = ''
+ c = nextch()
+ while c not in '\n\r\0':
+ cmd += c
+ c = nextch()
+ yield 'C', cmd
+ else:
+ c, cmd = nextstring(c)
+ yield 'c', cmd
+ elif c == '#':
+ while c not in '\n\r\0':
+ c = nextch()
+ elif c == '$':
+ p1 = -1
+ c = nextch()
+ elif c == '\0':
+ return # in case it was preceded by whitespace
+ else:
+ s = ''
+ i = 0
+ while c != '\0' and i < 10:
+ s += c
+ i += 1
+ c = nextch()
+ raise util.Abort(_('invalid character in dag description: '
+ '%s...') % s)
+
+def dagtextlines(events,
+ addspaces=True,
+ wraplabels=False,
+ wrapannotations=False,
+ wrapcommands=False,
+ wrapnonlinear=False,
+ usedots=False,
+ maxlinewidth=70):
+ '''generates single lines for dagtext()'''
+
+ def wrapstring(text):
+ if re.match("^[0-9a-z]*$", text):
+ return text
+ return '"' + text.replace('\\', '\\\\').replace('"', '\"') + '"'
+
+ def gen():
+ labels = {}
+ run = 0
+ wantr = 0
+ needroot = False
+ for kind, data in events:
+ if kind == 'n':
+ r, ps = data
+
+ # sanity check
+ if r != wantr:
+ raise util.Abort(_("expected id %i, got %i") % (wantr, r))
+ if not ps:
+ ps = [-1]
+ else:
+ for p in ps:
+ if p >= r:
+ raise util.Abort(_("parent id %i is larger than "
+ "current id %i") % (p, r))
+ wantr += 1
+
+ # new root?
+ p1 = r - 1
+ if len(ps) == 1 and ps[0] == -1:
+ if needroot:
+ if run:
+ yield '+' + str(run)
+ run = 0
+ if wrapnonlinear:
+ yield '\n'
+ yield '$'
+ p1 = -1
+ else:
+ needroot = True
+ if len(ps) == 1 and ps[0] == p1:
+ if usedots:
+ yield "."
+ else:
+ run += 1
+ else:
+ if run:
+ yield '+' + str(run)
+ run = 0
+ if wrapnonlinear:
+ yield '\n'
+ prefs = []
+ for p in ps:
+ if p == p1:
+ prefs.append('')
+ elif p in labels:
+ prefs.append(labels[p])
+ else:
+ prefs.append(str(r - p))
+ yield '*' + '/'.join(prefs)
+ else:
+ if run:
+ yield '+' + str(run)
+ run = 0
+ if kind == 'l':
+ rid, name = data
+ labels[rid] = name
+ yield ':' + name
+ if wraplabels:
+ yield '\n'
+ elif kind == 'c':
+ yield '!' + wrapstring(data)
+ if wrapcommands:
+ yield '\n'
+ elif kind == 'C':
+ yield '!!' + data
+ yield '\n'
+ elif kind == 'a':
+ if wrapannotations:
+ yield '\n'
+ yield '@' + wrapstring(data)
+ elif kind == '#':
+ yield '#' + data
+ yield '\n'
+ else:
+ raise util.Abort(_("invalid event type in dag: %s")
+ % str((type, data)))
+ if run:
+ yield '+' + str(run)
+
+ line = ''
+ for part in gen():
+ if part == '\n':
+ if line:
+ yield line
+ line = ''
+ else:
+ if len(line) + len(part) >= maxlinewidth:
+ yield line
+ line = ''
+ elif addspaces and line and part != '.':
+ line += ' '
+ line += part
+ if line:
+ yield line
+
+def dagtext(dag,
+ addspaces=True,
+ wraplabels=False,
+ wrapannotations=False,
+ wrapcommands=False,
+ wrapnonlinear=False,
+ usedots=False,
+ maxlinewidth=70):
+ '''generates lines of a textual representation for a dag event stream
+
+ events should generate what parsedag() does, so:
+
+ ('n', (id, [parentids])) for node creation
+ ('l', (id, labelname)) for labels on nodes
+ ('a', text) for annotations
+ ('c', text) for commands
+ ('C', text) for line commands ('!!')
+ ('#', text) for comment lines
+
+ Parent nodes must come before child nodes.
+
+ Examples
+ --------
+
+ Linear run:
+
+ >>> dagtext([('n', (0, [-1])), ('n', (1, [0]))])
+ '+2'
+
+ Two roots:
+
+ >>> dagtext([('n', (0, [-1])), ('n', (1, [-1]))])
+ '+1 $ +1'
+
+ Fork and join:
+
+ >>> dagtext([('n', (0, [-1])), ('n', (1, [0])), ('n', (2, [0])),
+ ... ('n', (3, [2, 1]))])
+ '+2 *2 */2'
+
+ Fork and join with labels:
+
+ >>> dagtext([('n', (0, [-1])), ('l', (0, 'f')), ('n', (1, [0])),
+ ... ('l', (1, 'p2')), ('n', (2, [0])), ('n', (3, [2, 1]))])
+ '+1 :f +1 :p2 *f */p2'
+
+ Annotations:
+
+ >>> dagtext([('n', (0, [-1])), ('a', 'ann'), ('n', (1, [0]))])
+ '+1 @ann +1'
+
+ >>> dagtext([('n', (0, [-1])),
+ ... ('a', 'my annotation'),
+ ... ('n', (1, [0]))])
+ '+1 @"my annotation" +1'
+
+ Commands:
+
+ >>> dagtext([('n', (0, [-1])), ('c', 'cmd'), ('n', (1, [0]))])
+ '+1 !cmd +1'
+
+ >>> dagtext([('n', (0, [-1])), ('c', 'my command'), ('n', (1, [0]))])
+ '+1 !"my command" +1'
+
+ >>> dagtext([('n', (0, [-1])),
+ ... ('C', 'my command line'),
+ ... ('n', (1, [0]))])
+ '+1 !!my command line\\n+1'
+
+ Comments:
+
+ >>> dagtext([('n', (0, [-1])), ('#', ' comment'), ('n', (1, [0]))])
+ '+1 # comment\\n+1'
+
+ >>> dagtext([])
+ ''
+
+ Combining parsedag and dagtext:
+
+ >>> dagtext(parsedag('+1 :f +1 :p2 *f */p2'))
+ '+1 :f +1 :p2 *f */p2'
+
+ '''
+ return "\n".join(dagtextlines(dag,
+ addspaces,
+ wraplabels,
+ wrapannotations,
+ wrapcommands,
+ wrapnonlinear,
+ usedots,
+ maxlinewidth))
diff --git a/mercurial/dagutil.py b/mercurial/dagutil.py
new file mode 100644
index 0000000..a9d8fb8
--- /dev/null
+++ b/mercurial/dagutil.py
@@ -0,0 +1,277 @@
+# dagutil.py - dag utilities for mercurial
+#
+# Copyright 2010 Benoit Boissinot <bboissin@gmail.com>
+# and Peter Arrenbrecht <peter@arrenbrecht.ch>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullrev
+from i18n import _
+
+
+class basedag(object):
+ '''generic interface for DAGs
+
+ terms:
+ "ix" (short for index) identifies a nodes internally,
+ "id" identifies one externally.
+
+ All params are ixs unless explicitly suffixed otherwise.
+ Pluralized params are lists or sets.
+ '''
+
+ def __init__(self):
+ self._inverse = None
+
+ def nodeset(self):
+ '''set of all node idxs'''
+ raise NotImplementedError
+
+ def heads(self):
+ '''list of head ixs'''
+ raise NotImplementedError
+
+ def parents(self, ix):
+ '''list of parents ixs of ix'''
+ raise NotImplementedError
+
+ def inverse(self):
+ '''inverse DAG, where parents becomes children, etc.'''
+ raise NotImplementedError
+
+ def ancestorset(self, starts, stops=None):
+ '''
+ set of all ancestors of starts (incl), but stop walk at stops (excl)
+ '''
+ raise NotImplementedError
+
+ def descendantset(self, starts, stops=None):
+ '''
+ set of all descendants of starts (incl), but stop walk at stops (excl)
+ '''
+ return self.inverse().ancestorset(starts, stops)
+
+ def headsetofconnecteds(self, ixs):
+ '''
+ subset of connected list of ixs so that no node has a descendant in it
+
+ By "connected list" we mean that if an ancestor and a descendant are in
+ the list, then so is at least one path connecting them.
+ '''
+ raise NotImplementedError
+
+ def externalize(self, ix):
+ '''return a list of (or set if given a set) of node ids'''
+ return self._externalize(ix)
+
+ def externalizeall(self, ixs):
+ '''return a list of (or set if given a set) of node ids'''
+ ids = self._externalizeall(ixs)
+ if isinstance(ixs, set):
+ return set(ids)
+ return list(ids)
+
+ def internalize(self, id):
+ '''return a list of (or set if given a set) of node ixs'''
+ return self._internalize(id)
+
+ def internalizeall(self, ids, filterunknown=False):
+ '''return a list of (or set if given a set) of node ids'''
+ ixs = self._internalizeall(ids, filterunknown)
+ if isinstance(ids, set):
+ return set(ixs)
+ return list(ixs)
+
+
+class genericdag(basedag):
+ '''generic implementations for DAGs'''
+
+ def ancestorset(self, starts, stops=None):
+ stops = stops and set(stops) or set()
+ seen = set()
+ pending = list(starts)
+ while pending:
+ n = pending.pop()
+ if n not in seen and n not in stops:
+ seen.add(n)
+ pending.extend(self.parents(n))
+ return seen
+
+ def headsetofconnecteds(self, ixs):
+ hds = set(ixs)
+ if not hds:
+ return hds
+ for n in ixs:
+ for p in self.parents(n):
+ hds.discard(p)
+ assert hds
+ return hds
+
+
+class revlogbaseddag(basedag):
+ '''generic dag interface to a revlog'''
+
+ def __init__(self, revlog, nodeset):
+ basedag.__init__(self)
+ self._revlog = revlog
+ self._heads = None
+ self._nodeset = nodeset
+
+ def nodeset(self):
+ return self._nodeset
+
+ def heads(self):
+ if self._heads is None:
+ self._heads = self._getheads()
+ return self._heads
+
+ def _externalize(self, ix):
+ return self._revlog.index[ix][7]
+ def _externalizeall(self, ixs):
+ idx = self._revlog.index
+ return [idx[i][7] for i in ixs]
+
+ def _internalize(self, id):
+ ix = self._revlog.rev(id)
+ if ix == nullrev:
+ raise LookupError(id, self._revlog.indexfile, _('nullid'))
+ return ix
+ def _internalizeall(self, ids, filterunknown):
+ rl = self._revlog
+ if filterunknown:
+ return [r for r in map(rl.nodemap.get, ids)
+ if r is not None and r != nullrev]
+ return map(self._internalize, ids)
+
+
+class revlogdag(revlogbaseddag):
+ '''dag interface to a revlog'''
+
+ def __init__(self, revlog):
+ revlogbaseddag.__init__(self, revlog, set(xrange(len(revlog))))
+
+ def _getheads(self):
+ return [r for r in self._revlog.headrevs() if r != nullrev]
+
+ def parents(self, ix):
+ rlog = self._revlog
+ idx = rlog.index
+ revdata = idx[ix]
+ prev = revdata[5]
+ if prev != nullrev:
+ prev2 = revdata[6]
+ if prev2 == nullrev:
+ return [prev]
+ return [prev, prev2]
+ prev2 = revdata[6]
+ if prev2 != nullrev:
+ return [prev2]
+ return []
+
+ def inverse(self):
+ if self._inverse is None:
+ self._inverse = inverserevlogdag(self)
+ return self._inverse
+
+ def ancestorset(self, starts, stops=None):
+ rlog = self._revlog
+ idx = rlog.index
+ stops = stops and set(stops) or set()
+ seen = set()
+ pending = list(starts)
+ while pending:
+ rev = pending.pop()
+ if rev not in seen and rev not in stops:
+ seen.add(rev)
+ revdata = idx[rev]
+ for i in [5, 6]:
+ prev = revdata[i]
+ if prev != nullrev:
+ pending.append(prev)
+ return seen
+
+ def headsetofconnecteds(self, ixs):
+ if not ixs:
+ return set()
+ rlog = self._revlog
+ idx = rlog.index
+ headrevs = set(ixs)
+ for rev in ixs:
+ revdata = idx[rev]
+ for i in [5, 6]:
+ prev = revdata[i]
+ if prev != nullrev:
+ headrevs.discard(prev)
+ assert headrevs
+ return headrevs
+
+ def linearize(self, ixs):
+ '''linearize and topologically sort a list of revisions
+
+ The linearization process tries to create long runs of revs where
+ a child rev comes immediately after its first parent. This is done by
+ visiting the heads of the given revs in inverse topological order,
+ and for each visited rev, visiting its second parent, then its first
+ parent, then adding the rev itself to the output list.
+ '''
+ sorted = []
+ visit = list(self.headsetofconnecteds(ixs))
+ visit.sort(reverse=True)
+ finished = set()
+
+ while visit:
+ cur = visit.pop()
+ if cur < 0:
+ cur = -cur - 1
+ if cur not in finished:
+ sorted.append(cur)
+ finished.add(cur)
+ else:
+ visit.append(-cur - 1)
+ visit += [p for p in self.parents(cur)
+ if p in ixs and p not in finished]
+ assert len(sorted) == len(ixs)
+ return sorted
+
+
+class inverserevlogdag(revlogbaseddag, genericdag):
+ '''inverse of an existing revlog dag; see revlogdag.inverse()'''
+
+ def __init__(self, orig):
+ revlogbaseddag.__init__(self, orig._revlog, orig._nodeset)
+ self._orig = orig
+ self._children = {}
+ self._roots = []
+ self._walkfrom = len(self._revlog) - 1
+
+ def _walkto(self, walkto):
+ rev = self._walkfrom
+ cs = self._children
+ roots = self._roots
+ idx = self._revlog.index
+ while rev >= walkto:
+ data = idx[rev]
+ isroot = True
+ for prev in [data[5], data[6]]: # parent revs
+ if prev != nullrev:
+ cs.setdefault(prev, []).append(rev)
+ isroot = False
+ if isroot:
+ roots.append(rev)
+ rev -= 1
+ self._walkfrom = rev
+
+ def _getheads(self):
+ self._walkto(nullrev)
+ return self._roots
+
+ def parents(self, ix):
+ if ix is None:
+ return []
+ if ix <= self._walkfrom:
+ self._walkto(ix)
+ return self._children.get(ix, [])
+
+ def inverse(self):
+ return self._orig
diff --git a/mercurial/demandimport.py b/mercurial/demandimport.py
new file mode 100644
index 0000000..e439487
--- /dev/null
+++ b/mercurial/demandimport.py
@@ -0,0 +1,155 @@
+# demandimport.py - global demand-loading of modules for Mercurial
+#
+# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''
+demandimport - automatic demandloading of modules
+
+To enable this module, do:
+
+ import demandimport; demandimport.enable()
+
+Imports of the following forms will be demand-loaded:
+
+ import a, b.c
+ import a.b as c
+ from a import b,c # a will be loaded immediately
+
+These imports will not be delayed:
+
+ from a import *
+ b = __import__(a)
+'''
+
+import __builtin__
+_origimport = __import__
+
+nothing = object()
+
+try:
+ _origimport(__builtin__.__name__, {}, {}, None, -1)
+except TypeError: # no level argument
+ def _import(name, globals, locals, fromlist, level):
+ "call _origimport with no level argument"
+ return _origimport(name, globals, locals, fromlist)
+else:
+ _import = _origimport
+
+class _demandmod(object):
+ """module demand-loader and proxy"""
+ def __init__(self, name, globals, locals):
+ if '.' in name:
+ head, rest = name.split('.', 1)
+ after = [rest]
+ else:
+ head = name
+ after = []
+ object.__setattr__(self, "_data", (head, globals, locals, after))
+ object.__setattr__(self, "_module", None)
+ def _extend(self, name):
+ """add to the list of submodules to load"""
+ self._data[3].append(name)
+ def _load(self):
+ if not self._module:
+ head, globals, locals, after = self._data
+ mod = _origimport(head, globals, locals)
+ # load submodules
+ def subload(mod, p):
+ h, t = p, None
+ if '.' in p:
+ h, t = p.split('.', 1)
+ if getattr(mod, h, nothing) is nothing:
+ setattr(mod, h, _demandmod(p, mod.__dict__, mod.__dict__))
+ elif t:
+ subload(getattr(mod, h), t)
+
+ for x in after:
+ subload(mod, x)
+
+ # are we in the locals dictionary still?
+ if locals and locals.get(head) == self:
+ locals[head] = mod
+ object.__setattr__(self, "_module", mod)
+
+ def __repr__(self):
+ if self._module:
+ return "<proxied module '%s'>" % self._data[0]
+ return "<unloaded module '%s'>" % self._data[0]
+ def __call__(self, *args, **kwargs):
+ raise TypeError("%s object is not callable" % repr(self))
+ def __getattribute__(self, attr):
+ if attr in ('_data', '_extend', '_load', '_module'):
+ return object.__getattribute__(self, attr)
+ self._load()
+ return getattr(self._module, attr)
+ def __setattr__(self, attr, val):
+ self._load()
+ setattr(self._module, attr, val)
+
+def _demandimport(name, globals=None, locals=None, fromlist=None, level=-1):
+ if not locals or name in ignore or fromlist == ('*',):
+ # these cases we can't really delay
+ return _import(name, globals, locals, fromlist, level)
+ elif not fromlist:
+ # import a [as b]
+ if '.' in name: # a.b
+ base, rest = name.split('.', 1)
+ # email.__init__ loading email.mime
+ if globals and globals.get('__name__', None) == base:
+ return _import(name, globals, locals, fromlist, level)
+ # if a is already demand-loaded, add b to its submodule list
+ if base in locals:
+ if isinstance(locals[base], _demandmod):
+ locals[base]._extend(rest)
+ return locals[base]
+ return _demandmod(name, globals, locals)
+ else:
+ if level != -1:
+ # from . import b,c,d or from .a import b,c,d
+ return _origimport(name, globals, locals, fromlist, level)
+ # from a import b,c,d
+ mod = _origimport(name, globals, locals)
+ # recurse down the module chain
+ for comp in name.split('.')[1:]:
+ if getattr(mod, comp, nothing) is nothing:
+ setattr(mod, comp, _demandmod(comp, mod.__dict__, mod.__dict__))
+ mod = getattr(mod, comp)
+ for x in fromlist:
+ # set requested submodules for demand load
+ if getattr(mod, x, nothing) is nothing:
+ setattr(mod, x, _demandmod(x, mod.__dict__, locals))
+ return mod
+
+ignore = [
+ '_hashlib',
+ '_xmlplus',
+ 'fcntl',
+ 'win32com.gen_py',
+ '_winreg', # 2.7 mimetypes needs immediate ImportError
+ 'pythoncom',
+ # imported by tarfile, not available under Windows
+ 'pwd',
+ 'grp',
+ # imported by profile, itself imported by hotshot.stats,
+ # not available under Windows
+ 'resource',
+ # this trips up many extension authors
+ 'gtk',
+ # setuptools' pkg_resources.py expects "from __main__ import x" to
+ # raise ImportError if x not defined
+ '__main__',
+ '_ssl', # conditional imports in the stdlib, issue1964
+ 'rfc822',
+ 'mimetools',
+ ]
+
+def enable():
+ "enable global demand-loading of modules"
+ __builtin__.__import__ = _demandimport
+
+def disable():
+ "disable global demand-loading of modules"
+ __builtin__.__import__ = _origimport
diff --git a/mercurial/diffhelpers.c b/mercurial/diffhelpers.c
new file mode 100644
index 0000000..b0fd766
--- /dev/null
+++ b/mercurial/diffhelpers.c
@@ -0,0 +1,197 @@
+/*
+ * diffhelpers.c - helper routines for mpatch
+ *
+ * Copyright 2007 Chris Mason <chris.mason@oracle.com>
+ *
+ * This software may be used and distributed according to the terms
+ * of the GNU General Public License v2, incorporated herein by reference.
+ */
+
+#include <Python.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "util.h"
+
+static char diffhelpers_doc[] = "Efficient diff parsing";
+static PyObject *diffhelpers_Error;
+
+
+/* fixup the last lines of a and b when the patch has no newline at eof */
+static void _fix_newline(PyObject *hunk, PyObject *a, PyObject *b)
+{
+ Py_ssize_t hunksz = PyList_Size(hunk);
+ PyObject *s = PyList_GET_ITEM(hunk, hunksz-1);
+ char *l = PyBytes_AsString(s);
+ Py_ssize_t alen = PyList_Size(a);
+ Py_ssize_t blen = PyList_Size(b);
+ char c = l[0];
+ PyObject *hline;
+ Py_ssize_t sz = PyBytes_GET_SIZE(s);
+
+ if (sz > 1 && l[sz-2] == '\r')
+ /* tolerate CRLF in last line */
+ sz -= 1;
+
+ hline = PyBytes_FromStringAndSize(l, sz-1);
+
+ if (c == ' ' || c == '+') {
+ PyObject *rline = PyBytes_FromStringAndSize(l + 1, sz - 2);
+ PyList_SetItem(b, blen-1, rline);
+ }
+ if (c == ' ' || c == '-') {
+ Py_INCREF(hline);
+ PyList_SetItem(a, alen-1, hline);
+ }
+ PyList_SetItem(hunk, hunksz-1, hline);
+}
+
+/* python callable form of _fix_newline */
+static PyObject *
+fix_newline(PyObject *self, PyObject *args)
+{
+ PyObject *hunk, *a, *b;
+ if (!PyArg_ParseTuple(args, "OOO", &hunk, &a, &b))
+ return NULL;
+ _fix_newline(hunk, a, b);
+ return Py_BuildValue("l", 0);
+}
+
+#if (PY_VERSION_HEX < 0x02050000)
+static const char *addlines_format = "OOiiOO";
+#else
+static const char *addlines_format = "OOnnOO";
+#endif
+
+/*
+ * read lines from fp into the hunk. The hunk is parsed into two arrays
+ * a and b. a gets the old state of the text, b gets the new state
+ * The control char from the hunk is saved when inserting into a, but not b
+ * (for performance while deleting files)
+ */
+static PyObject *
+addlines(PyObject *self, PyObject *args)
+{
+
+ PyObject *fp, *hunk, *a, *b, *x;
+ Py_ssize_t i;
+ Py_ssize_t lena, lenb;
+ Py_ssize_t num;
+ Py_ssize_t todoa, todob;
+ char *s, c;
+ PyObject *l;
+ if (!PyArg_ParseTuple(args, addlines_format,
+ &fp, &hunk, &lena, &lenb, &a, &b))
+ return NULL;
+
+ while (1) {
+ todoa = lena - PyList_Size(a);
+ todob = lenb - PyList_Size(b);
+ num = todoa > todob ? todoa : todob;
+ if (num == 0)
+ break;
+ for (i = 0; i < num; i++) {
+ x = PyFile_GetLine(fp, 0);
+ s = PyBytes_AsString(x);
+ c = *s;
+ if (strcmp(s, "\\ No newline at end of file\n") == 0) {
+ _fix_newline(hunk, a, b);
+ continue;
+ }
+ if (c == '\n') {
+ /* Some patches may be missing the control char
+ * on empty lines. Supply a leading space. */
+ Py_DECREF(x);
+ x = PyBytes_FromString(" \n");
+ }
+ PyList_Append(hunk, x);
+ if (c == '+') {
+ l = PyBytes_FromString(s + 1);
+ PyList_Append(b, l);
+ Py_DECREF(l);
+ } else if (c == '-') {
+ PyList_Append(a, x);
+ } else {
+ l = PyBytes_FromString(s + 1);
+ PyList_Append(b, l);
+ Py_DECREF(l);
+ PyList_Append(a, x);
+ }
+ Py_DECREF(x);
+ }
+ }
+ return Py_BuildValue("l", 0);
+}
+
+/*
+ * compare the lines in a with the lines in b. a is assumed to have
+ * a control char at the start of each line, this char is ignored in the
+ * compare
+ */
+static PyObject *
+testhunk(PyObject *self, PyObject *args)
+{
+
+ PyObject *a, *b;
+ long bstart;
+ Py_ssize_t alen, blen;
+ Py_ssize_t i;
+ char *sa, *sb;
+
+ if (!PyArg_ParseTuple(args, "OOl", &a, &b, &bstart))
+ return NULL;
+ alen = PyList_Size(a);
+ blen = PyList_Size(b);
+ if (alen > blen - bstart || bstart < 0) {
+ return Py_BuildValue("l", -1);
+ }
+ for (i = 0; i < alen; i++) {
+ sa = PyBytes_AsString(PyList_GET_ITEM(a, i));
+ sb = PyBytes_AsString(PyList_GET_ITEM(b, i + bstart));
+ if (strcmp(sa + 1, sb) != 0)
+ return Py_BuildValue("l", -1);
+ }
+ return Py_BuildValue("l", 0);
+}
+
+static PyMethodDef methods[] = {
+ {"addlines", addlines, METH_VARARGS, "add lines to a hunk\n"},
+ {"fix_newline", fix_newline, METH_VARARGS, "fixup newline counters\n"},
+ {"testhunk", testhunk, METH_VARARGS, "test lines in a hunk\n"},
+ {NULL, NULL}
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef diffhelpers_module = {
+ PyModuleDef_HEAD_INIT,
+ "diffhelpers",
+ diffhelpers_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_diffhelpers(void)
+{
+ PyObject *m;
+
+ m = PyModule_Create(&diffhelpers_module);
+ if (m == NULL)
+ return NULL;
+
+ diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError",
+ NULL, NULL);
+ Py_INCREF(diffhelpers_Error);
+ PyModule_AddObject(m, "diffhelpersError", diffhelpers_Error);
+
+ return m;
+}
+#else
+PyMODINIT_FUNC
+initdiffhelpers(void)
+{
+ Py_InitModule3("diffhelpers", methods, diffhelpers_doc);
+ diffhelpers_Error = PyErr_NewException("diffhelpers.diffhelpersError",
+ NULL, NULL);
+}
+#endif
+
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
new file mode 100644
index 0000000..e516d93
--- /dev/null
+++ b/mercurial/dirstate.py
@@ -0,0 +1,797 @@
+# dirstate.py - working directory tracking for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+import errno
+
+from node import nullid
+from i18n import _
+import scmutil, util, ignore, osutil, parsers, encoding
+import struct, os, stat, errno
+import cStringIO
+
+_format = ">cllll"
+propertycache = util.propertycache
+filecache = scmutil.filecache
+
+class repocache(filecache):
+ """filecache for files in .hg/"""
+ def join(self, obj, fname):
+ return obj._opener.join(fname)
+
+class rootcache(filecache):
+ """filecache for files in the repository root"""
+ def join(self, obj, fname):
+ return obj._join(fname)
+
+def _finddirs(path):
+ pos = path.rfind('/')
+ while pos != -1:
+ yield path[:pos]
+ pos = path.rfind('/', 0, pos)
+
+def _incdirs(dirs, path):
+ for base in _finddirs(path):
+ if base in dirs:
+ dirs[base] += 1
+ return
+ dirs[base] = 1
+
+def _decdirs(dirs, path):
+ for base in _finddirs(path):
+ if dirs[base] > 1:
+ dirs[base] -= 1
+ return
+ del dirs[base]
+
+class dirstate(object):
+
+ def __init__(self, opener, ui, root, validate):
+ '''Create a new dirstate object.
+
+ opener is an open()-like callable that can be used to open the
+ dirstate file; root is the root of the directory tracked by
+ the dirstate.
+ '''
+ self._opener = opener
+ self._validate = validate
+ self._root = root
+ self._rootdir = os.path.join(root, '')
+ self._dirty = False
+ self._dirtypl = False
+ self._lastnormaltime = 0
+ self._ui = ui
+ self._filecache = {}
+
+ @propertycache
+ def _map(self):
+ '''Return the dirstate contents as a map from filename to
+ (state, mode, size, time).'''
+ self._read()
+ return self._map
+
+ @propertycache
+ def _copymap(self):
+ self._read()
+ return self._copymap
+
+ @propertycache
+ def _foldmap(self):
+ f = {}
+ for name in self._map:
+ f[util.normcase(name)] = name
+ for name in self._dirs:
+ f[util.normcase(name)] = name
+ f['.'] = '.' # prevents useless util.fspath() invocation
+ return f
+
+ @repocache('branch')
+ def _branch(self):
+ try:
+ return self._opener.read("branch").strip() or "default"
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return "default"
+
+ @propertycache
+ def _pl(self):
+ try:
+ fp = self._opener("dirstate")
+ st = fp.read(40)
+ fp.close()
+ l = len(st)
+ if l == 40:
+ return st[:20], st[20:40]
+ elif l > 0 and l < 40:
+ raise util.Abort(_('working directory state appears damaged!'))
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return [nullid, nullid]
+
+ @propertycache
+ def _dirs(self):
+ dirs = {}
+ for f, s in self._map.iteritems():
+ if s[0] != 'r':
+ _incdirs(dirs, f)
+ return dirs
+
+ def dirs(self):
+ return self._dirs
+
+ @rootcache('.hgignore')
+ def _ignore(self):
+ files = [self._join('.hgignore')]
+ for name, path in self._ui.configitems("ui"):
+ if name == 'ignore' or name.startswith('ignore.'):
+ files.append(util.expandpath(path))
+ return ignore.ignore(self._root, files, self._ui.warn)
+
+ @propertycache
+ def _slash(self):
+ return self._ui.configbool('ui', 'slash') and os.sep != '/'
+
+ @propertycache
+ def _checklink(self):
+ return util.checklink(self._root)
+
+ @propertycache
+ def _checkexec(self):
+ return util.checkexec(self._root)
+
+ @propertycache
+ def _checkcase(self):
+ return not util.checkcase(self._join('.hg'))
+
+ def _join(self, f):
+ # much faster than os.path.join()
+ # it's safe because f is always a relative path
+ return self._rootdir + f
+
+ def flagfunc(self, buildfallback):
+ if self._checklink and self._checkexec:
+ def f(x):
+ p = self._join(x)
+ if os.path.islink(p):
+ return 'l'
+ if util.isexec(p):
+ return 'x'
+ return ''
+ return f
+
+ fallback = buildfallback()
+ if self._checklink:
+ def f(x):
+ if os.path.islink(self._join(x)):
+ return 'l'
+ if 'x' in fallback(x):
+ return 'x'
+ return ''
+ return f
+ if self._checkexec:
+ def f(x):
+ if 'l' in fallback(x):
+ return 'l'
+ if util.isexec(self._join(x)):
+ return 'x'
+ return ''
+ return f
+ else:
+ return fallback
+
+ def getcwd(self):
+ cwd = os.getcwd()
+ if cwd == self._root:
+ return ''
+ # self._root ends with a path separator if self._root is '/' or 'C:\'
+ rootsep = self._root
+ if not util.endswithsep(rootsep):
+ rootsep += os.sep
+ if cwd.startswith(rootsep):
+ return cwd[len(rootsep):]
+ else:
+ # we're outside the repo. return an absolute path.
+ return cwd
+
+ def pathto(self, f, cwd=None):
+ if cwd is None:
+ cwd = self.getcwd()
+ path = util.pathto(self._root, cwd, f)
+ if self._slash:
+ return util.normpath(path)
+ return path
+
+ def __getitem__(self, key):
+ '''Return the current state of key (a filename) in the dirstate.
+
+ States are:
+ n normal
+ m needs merging
+ r marked for removal
+ a marked for addition
+ ? not tracked
+ '''
+ return self._map.get(key, ("?",))[0]
+
+ def __contains__(self, key):
+ return key in self._map
+
+ def __iter__(self):
+ for x in sorted(self._map):
+ yield x
+
+ def parents(self):
+ return [self._validate(p) for p in self._pl]
+
+ def p1(self):
+ return self._validate(self._pl[0])
+
+ def p2(self):
+ return self._validate(self._pl[1])
+
+ def branch(self):
+ return encoding.tolocal(self._branch)
+
+ def setparents(self, p1, p2=nullid):
+ """Set dirstate parents to p1 and p2.
+
+ When moving from two parents to one, 'm' merged entries a
+ adjusted to normal and previous copy records discarded and
+ returned by the call.
+
+ See localrepo.setparents()
+ """
+ self._dirty = self._dirtypl = True
+ oldp2 = self._pl[1]
+ self._pl = p1, p2
+ copies = {}
+ if oldp2 != nullid and p2 == nullid:
+ # Discard 'm' markers when moving away from a merge state
+ for f, s in self._map.iteritems():
+ if s[0] == 'm':
+ if f in self._copymap:
+ copies[f] = self._copymap[f]
+ self.normallookup(f)
+ return copies
+
+ def setbranch(self, branch):
+ if branch in ['tip', '.', 'null']:
+ raise util.Abort(_('the name \'%s\' is reserved') % branch)
+ self._branch = encoding.fromlocal(branch)
+ f = self._opener('branch', 'w', atomictemp=True)
+ try:
+ f.write(self._branch + '\n')
+ finally:
+ f.close()
+
+ def _read(self):
+ self._map = {}
+ self._copymap = {}
+ try:
+ st = self._opener.read("dirstate")
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ return
+ if not st:
+ return
+
+ p = parsers.parse_dirstate(self._map, self._copymap, st)
+ if not self._dirtypl:
+ self._pl = p
+
+ def invalidate(self):
+ for a in ("_map", "_copymap", "_foldmap", "_branch", "_pl", "_dirs",
+ "_ignore"):
+ if a in self.__dict__:
+ delattr(self, a)
+ self._lastnormaltime = 0
+ self._dirty = False
+
+ def copy(self, source, dest):
+ """Mark dest as a copy of source. Unmark dest if source is None."""
+ if source == dest:
+ return
+ self._dirty = True
+ if source is not None:
+ self._copymap[dest] = source
+ elif dest in self._copymap:
+ del self._copymap[dest]
+
+ def copied(self, file):
+ return self._copymap.get(file, None)
+
+ def copies(self):
+ return self._copymap
+
+ def _droppath(self, f):
+ if self[f] not in "?r" and "_dirs" in self.__dict__:
+ _decdirs(self._dirs, f)
+
+ def _addpath(self, f, state, mode, size, mtime):
+ oldstate = self[f]
+ if state == 'a' or oldstate == 'r':
+ scmutil.checkfilename(f)
+ if f in self._dirs:
+ raise util.Abort(_('directory %r already in dirstate') % f)
+ # shadows
+ for d in _finddirs(f):
+ if d in self._dirs:
+ break
+ if d in self._map and self[d] != 'r':
+ raise util.Abort(
+ _('file %r in dirstate clashes with %r') % (d, f))
+ if oldstate in "?r" and "_dirs" in self.__dict__:
+ _incdirs(self._dirs, f)
+ self._dirty = True
+ self._map[f] = (state, mode, size, mtime)
+
+ def normal(self, f):
+ '''Mark a file normal and clean.'''
+ s = os.lstat(self._join(f))
+ mtime = int(s.st_mtime)
+ self._addpath(f, 'n', s.st_mode, s.st_size, mtime)
+ if f in self._copymap:
+ del self._copymap[f]
+ if mtime > self._lastnormaltime:
+ # Remember the most recent modification timeslot for status(),
+ # to make sure we won't miss future size-preserving file content
+ # modifications that happen within the same timeslot.
+ self._lastnormaltime = mtime
+
+ def normallookup(self, f):
+ '''Mark a file normal, but possibly dirty.'''
+ if self._pl[1] != nullid and f in self._map:
+ # if there is a merge going on and the file was either
+ # in state 'm' (-1) or coming from other parent (-2) before
+ # being removed, restore that state.
+ entry = self._map[f]
+ if entry[0] == 'r' and entry[2] in (-1, -2):
+ source = self._copymap.get(f)
+ if entry[2] == -1:
+ self.merge(f)
+ elif entry[2] == -2:
+ self.otherparent(f)
+ if source:
+ self.copy(source, f)
+ return
+ if entry[0] == 'm' or entry[0] == 'n' and entry[2] == -2:
+ return
+ self._addpath(f, 'n', 0, -1, -1)
+ if f in self._copymap:
+ del self._copymap[f]
+
+ def otherparent(self, f):
+ '''Mark as coming from the other parent, always dirty.'''
+ if self._pl[1] == nullid:
+ raise util.Abort(_("setting %r to other parent "
+ "only allowed in merges") % f)
+ self._addpath(f, 'n', 0, -2, -1)
+ if f in self._copymap:
+ del self._copymap[f]
+
+ def add(self, f):
+ '''Mark a file added.'''
+ self._addpath(f, 'a', 0, -1, -1)
+ if f in self._copymap:
+ del self._copymap[f]
+
+ def remove(self, f):
+ '''Mark a file removed.'''
+ self._dirty = True
+ self._droppath(f)
+ size = 0
+ if self._pl[1] != nullid and f in self._map:
+ # backup the previous state
+ entry = self._map[f]
+ if entry[0] == 'm': # merge
+ size = -1
+ elif entry[0] == 'n' and entry[2] == -2: # other parent
+ size = -2
+ self._map[f] = ('r', 0, size, 0)
+ if size == 0 and f in self._copymap:
+ del self._copymap[f]
+
+ def merge(self, f):
+ '''Mark a file merged.'''
+ if self._pl[1] == nullid:
+ return self.normallookup(f)
+ s = os.lstat(self._join(f))
+ self._addpath(f, 'm', s.st_mode, s.st_size, int(s.st_mtime))
+ if f in self._copymap:
+ del self._copymap[f]
+
+ def drop(self, f):
+ '''Drop a file from the dirstate'''
+ if f in self._map:
+ self._dirty = True
+ self._droppath(f)
+ del self._map[f]
+
+ def _normalize(self, path, isknown, ignoremissing=False, exists=None):
+ normed = util.normcase(path)
+ folded = self._foldmap.get(normed, None)
+ if folded is None:
+ if isknown:
+ folded = path
+ else:
+ if exists is None:
+ exists = os.path.lexists(os.path.join(self._root, path))
+ if not exists:
+ # Maybe a path component exists
+ if not ignoremissing and '/' in path:
+ d, f = path.rsplit('/', 1)
+ d = self._normalize(d, isknown, ignoremissing, None)
+ folded = d + "/" + f
+ else:
+ # No path components, preserve original case
+ folded = path
+ else:
+ # recursively normalize leading directory components
+ # against dirstate
+ if '/' in normed:
+ d, f = normed.rsplit('/', 1)
+ d = self._normalize(d, isknown, ignoremissing, True)
+ r = self._root + "/" + d
+ folded = d + "/" + util.fspath(f, r)
+ else:
+ folded = util.fspath(normed, self._root)
+ self._foldmap[normed] = folded
+
+ return folded
+
+ def normalize(self, path, isknown=False, ignoremissing=False):
+ '''
+ normalize the case of a pathname when on a casefolding filesystem
+
+ isknown specifies whether the filename came from walking the
+ disk, to avoid extra filesystem access.
+
+ If ignoremissing is True, missing path are returned
+ unchanged. Otherwise, we try harder to normalize possibly
+ existing path components.
+
+ The normalized case is determined based on the following precedence:
+
+ - version of name already stored in the dirstate
+ - version of name stored on disk
+ - version provided via command arguments
+ '''
+
+ if self._checkcase:
+ return self._normalize(path, isknown, ignoremissing)
+ return path
+
+ def clear(self):
+ self._map = {}
+ if "_dirs" in self.__dict__:
+ delattr(self, "_dirs")
+ self._copymap = {}
+ self._pl = [nullid, nullid]
+ self._lastnormaltime = 0
+ self._dirty = True
+
+ def rebuild(self, parent, files):
+ self.clear()
+ for f in files:
+ if 'x' in files.flags(f):
+ self._map[f] = ('n', 0777, -1, 0)
+ else:
+ self._map[f] = ('n', 0666, -1, 0)
+ self._pl = (parent, nullid)
+ self._dirty = True
+
+ def write(self):
+ if not self._dirty:
+ return
+ st = self._opener("dirstate", "w", atomictemp=True)
+
+ def finish(s):
+ st.write(s)
+ st.close()
+ self._lastnormaltime = 0
+ self._dirty = self._dirtypl = False
+
+ # use the modification time of the newly created temporary file as the
+ # filesystem's notion of 'now'
+ now = util.fstat(st).st_mtime
+ copymap = self._copymap
+ try:
+ finish(parsers.pack_dirstate(self._map, copymap, self._pl, now))
+ return
+ except AttributeError:
+ pass
+
+ now = int(now)
+ cs = cStringIO.StringIO()
+ pack = struct.pack
+ write = cs.write
+ write("".join(self._pl))
+ for f, e in self._map.iteritems():
+ if e[0] == 'n' and e[3] == now:
+ # The file was last modified "simultaneously" with the current
+ # write to dirstate (i.e. within the same second for file-
+ # systems with a granularity of 1 sec). This commonly happens
+ # for at least a couple of files on 'update'.
+ # The user could change the file without changing its size
+ # within the same second. Invalidate the file's stat data in
+ # dirstate, forcing future 'status' calls to compare the
+ # contents of the file. This prevents mistakenly treating such
+ # files as clean.
+ e = (e[0], 0, -1, -1) # mark entry as 'unset'
+ self._map[f] = e
+
+ if f in copymap:
+ f = "%s\0%s" % (f, copymap[f])
+ e = pack(_format, e[0], e[1], e[2], e[3], len(f))
+ write(e)
+ write(f)
+ finish(cs.getvalue())
+
+ def _dirignore(self, f):
+ if f == '.':
+ return False
+ if self._ignore(f):
+ return True
+ for p in _finddirs(f):
+ if self._ignore(p):
+ return True
+ return False
+
+ def walk(self, match, subrepos, unknown, ignored):
+ '''
+ Walk recursively through the directory tree, finding all files
+ matched by match.
+
+ Return a dict mapping filename to stat-like object (either
+ mercurial.osutil.stat instance or return value of os.stat()).
+ '''
+
+ def fwarn(f, msg):
+ self._ui.warn('%s: %s\n' % (self.pathto(f), msg))
+ return False
+
+ def badtype(mode):
+ kind = _('unknown')
+ if stat.S_ISCHR(mode):
+ kind = _('character device')
+ elif stat.S_ISBLK(mode):
+ kind = _('block device')
+ elif stat.S_ISFIFO(mode):
+ kind = _('fifo')
+ elif stat.S_ISSOCK(mode):
+ kind = _('socket')
+ elif stat.S_ISDIR(mode):
+ kind = _('directory')
+ return _('unsupported file type (type is %s)') % kind
+
+ ignore = self._ignore
+ dirignore = self._dirignore
+ if ignored:
+ ignore = util.never
+ dirignore = util.never
+ elif not unknown:
+ # if unknown and ignored are False, skip step 2
+ ignore = util.always
+ dirignore = util.always
+
+ matchfn = match.matchfn
+ badfn = match.bad
+ dmap = self._map
+ normpath = util.normpath
+ listdir = osutil.listdir
+ lstat = os.lstat
+ getkind = stat.S_IFMT
+ dirkind = stat.S_IFDIR
+ regkind = stat.S_IFREG
+ lnkkind = stat.S_IFLNK
+ join = self._join
+ work = []
+ wadd = work.append
+
+ exact = skipstep3 = False
+ if matchfn == match.exact: # match.exact
+ exact = True
+ dirignore = util.always # skip step 2
+ elif match.files() and not match.anypats(): # match.match, no patterns
+ skipstep3 = True
+
+ if not exact and self._checkcase:
+ normalize = self._normalize
+ skipstep3 = False
+ else:
+ normalize = lambda x, y, z: x
+
+ files = sorted(match.files())
+ subrepos.sort()
+ i, j = 0, 0
+ while i < len(files) and j < len(subrepos):
+ subpath = subrepos[j] + "/"
+ if files[i] < subpath:
+ i += 1
+ continue
+ while i < len(files) and files[i].startswith(subpath):
+ del files[i]
+ j += 1
+
+ if not files or '.' in files:
+ files = ['']
+ results = dict.fromkeys(subrepos)
+ results['.hg'] = None
+
+ # step 1: find all explicit files
+ for ff in files:
+ nf = normalize(normpath(ff), False, True)
+ if nf in results:
+ continue
+
+ try:
+ st = lstat(join(nf))
+ kind = getkind(st.st_mode)
+ if kind == dirkind:
+ skipstep3 = False
+ if nf in dmap:
+ #file deleted on disk but still in dirstate
+ results[nf] = None
+ match.dir(nf)
+ if not dirignore(nf):
+ wadd(nf)
+ elif kind == regkind or kind == lnkkind:
+ results[nf] = st
+ else:
+ badfn(ff, badtype(kind))
+ if nf in dmap:
+ results[nf] = None
+ except OSError, inst:
+ if nf in dmap: # does it exactly match a file?
+ results[nf] = None
+ else: # does it match a directory?
+ prefix = nf + "/"
+ for fn in dmap:
+ if fn.startswith(prefix):
+ match.dir(nf)
+ skipstep3 = False
+ break
+ else:
+ badfn(ff, inst.strerror)
+
+ # step 2: visit subdirectories
+ while work:
+ nd = work.pop()
+ skip = None
+ if nd == '.':
+ nd = ''
+ else:
+ skip = '.hg'
+ try:
+ entries = listdir(join(nd), stat=True, skip=skip)
+ except OSError, inst:
+ if inst.errno == errno.EACCES:
+ fwarn(nd, inst.strerror)
+ continue
+ raise
+ for f, kind, st in entries:
+ nf = normalize(nd and (nd + "/" + f) or f, True, True)
+ if nf not in results:
+ if kind == dirkind:
+ if not ignore(nf):
+ match.dir(nf)
+ wadd(nf)
+ if nf in dmap and matchfn(nf):
+ results[nf] = None
+ elif kind == regkind or kind == lnkkind:
+ if nf in dmap:
+ if matchfn(nf):
+ results[nf] = st
+ elif matchfn(nf) and not ignore(nf):
+ results[nf] = st
+ elif nf in dmap and matchfn(nf):
+ results[nf] = None
+
+ # step 3: report unseen items in the dmap hash
+ if not skipstep3 and not exact:
+ visit = sorted([f for f in dmap if f not in results and matchfn(f)])
+ for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
+ if (not st is None and
+ getkind(st.st_mode) not in (regkind, lnkkind)):
+ st = None
+ results[nf] = st
+ for s in subrepos:
+ del results[s]
+ del results['.hg']
+ return results
+
+ def status(self, match, subrepos, ignored, clean, unknown):
+ '''Determine the status of the working copy relative to the
+ dirstate and return a tuple of lists (unsure, modified, added,
+ removed, deleted, unknown, ignored, clean), where:
+
+ unsure:
+ files that might have been modified since the dirstate was
+ written, but need to be read to be sure (size is the same
+ but mtime differs)
+ modified:
+ files that have definitely been modified since the dirstate
+ was written (different size or mode)
+ added:
+ files that have been explicitly added with hg add
+ removed:
+ files that have been explicitly removed with hg remove
+ deleted:
+ files that have been deleted through other means ("missing")
+ unknown:
+ files not in the dirstate that are not ignored
+ ignored:
+ files not in the dirstate that are ignored
+ (by _dirignore())
+ clean:
+ files that have definitely not been modified since the
+ dirstate was written
+ '''
+ listignored, listclean, listunknown = ignored, clean, unknown
+ lookup, modified, added, unknown, ignored = [], [], [], [], []
+ removed, deleted, clean = [], [], []
+
+ dmap = self._map
+ ladd = lookup.append # aka "unsure"
+ madd = modified.append
+ aadd = added.append
+ uadd = unknown.append
+ iadd = ignored.append
+ radd = removed.append
+ dadd = deleted.append
+ cadd = clean.append
+
+ lnkkind = stat.S_IFLNK
+
+ for fn, st in self.walk(match, subrepos, listunknown,
+ listignored).iteritems():
+ if fn not in dmap:
+ if (listignored or match.exact(fn)) and self._dirignore(fn):
+ if listignored:
+ iadd(fn)
+ elif listunknown:
+ uadd(fn)
+ continue
+
+ state, mode, size, time = dmap[fn]
+
+ if not st and state in "nma":
+ dadd(fn)
+ elif state == 'n':
+ # The "mode & lnkkind != lnkkind or self._checklink"
+ # lines are an expansion of "islink => checklink"
+ # where islink means "is this a link?" and checklink
+ # means "can we check links?".
+ mtime = int(st.st_mtime)
+ if (size >= 0 and
+ (size != st.st_size
+ or ((mode ^ st.st_mode) & 0100 and self._checkexec))
+ and (mode & lnkkind != lnkkind or self._checklink)
+ or size == -2 # other parent
+ or fn in self._copymap):
+ madd(fn)
+ elif (mtime != time
+ and (mode & lnkkind != lnkkind or self._checklink)):
+ ladd(fn)
+ elif mtime == self._lastnormaltime:
+ # fn may have been changed in the same timeslot without
+ # changing its size. This can happen if we quickly do
+ # multiple commits in a single transaction.
+ # Force lookup, so we don't miss such a racy file change.
+ ladd(fn)
+ elif listclean:
+ cadd(fn)
+ elif state == 'm':
+ madd(fn)
+ elif state == 'a':
+ aadd(fn)
+ elif state == 'r':
+ radd(fn)
+
+ return (lookup, modified, added, removed, deleted, unknown, ignored,
+ clean)
diff --git a/mercurial/discovery.py b/mercurial/discovery.py
new file mode 100644
index 0000000..0eb27a8
--- /dev/null
+++ b/mercurial/discovery.py
@@ -0,0 +1,369 @@
+# discovery.py - protocol changeset discovery functions
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid, short
+from i18n import _
+import util, setdiscovery, treediscovery, phases, obsolete
+
+def findcommonincoming(repo, remote, heads=None, force=False):
+ """Return a tuple (common, anyincoming, heads) used to identify the common
+ subset of nodes between repo and remote.
+
+ "common" is a list of (at least) the heads of the common subset.
+ "anyincoming" is testable as a boolean indicating if any nodes are missing
+ locally. If remote does not support getbundle, this actually is a list of
+ roots of the nodes that would be incoming, to be supplied to
+ changegroupsubset. No code except for pull should be relying on this fact
+ any longer.
+ "heads" is either the supplied heads, or else the remote's heads.
+
+ If you pass heads and they are all known locally, the reponse lists justs
+ these heads in "common" and in "heads".
+
+ Please use findcommonoutgoing to compute the set of outgoing nodes to give
+ extensions a good hook into outgoing.
+ """
+
+ if not remote.capable('getbundle'):
+ return treediscovery.findcommonincoming(repo, remote, heads, force)
+
+ if heads:
+ allknown = True
+ nm = repo.changelog.nodemap
+ for h in heads:
+ if nm.get(h) is None:
+ allknown = False
+ break
+ if allknown:
+ return (heads, False, heads)
+
+ res = setdiscovery.findcommonheads(repo.ui, repo, remote,
+ abortwhenunrelated=not force)
+ common, anyinc, srvheads = res
+ return (list(common), anyinc, heads or list(srvheads))
+
+class outgoing(object):
+ '''Represents the set of nodes present in a local repo but not in a
+ (possibly) remote one.
+
+ Members:
+
+ missing is a list of all nodes present in local but not in remote.
+ common is a list of all nodes shared between the two repos.
+ excluded is the list of missing changeset that shouldn't be sent remotely.
+ missingheads is the list of heads of missing.
+ commonheads is the list of heads of common.
+
+ The sets are computed on demand from the heads, unless provided upfront
+ by discovery.'''
+
+ def __init__(self, revlog, commonheads, missingheads):
+ self.commonheads = commonheads
+ self.missingheads = missingheads
+ self._revlog = revlog
+ self._common = None
+ self._missing = None
+ self.excluded = []
+
+ def _computecommonmissing(self):
+ sets = self._revlog.findcommonmissing(self.commonheads,
+ self.missingheads)
+ self._common, self._missing = sets
+
+ @util.propertycache
+ def common(self):
+ if self._common is None:
+ self._computecommonmissing()
+ return self._common
+
+ @util.propertycache
+ def missing(self):
+ if self._missing is None:
+ self._computecommonmissing()
+ return self._missing
+
+def findcommonoutgoing(repo, other, onlyheads=None, force=False,
+ commoninc=None, portable=False):
+ '''Return an outgoing instance to identify the nodes present in repo but
+ not in other.
+
+ If onlyheads is given, only nodes ancestral to nodes in onlyheads
+ (inclusive) are included. If you already know the local repo's heads,
+ passing them in onlyheads is faster than letting them be recomputed here.
+
+ If commoninc is given, it must be the result of a prior call to
+ findcommonincoming(repo, other, force) to avoid recomputing it here.
+
+ If portable is given, compute more conservative common and missingheads,
+ to make bundles created from the instance more portable.'''
+ # declare an empty outgoing object to be filled later
+ og = outgoing(repo.changelog, None, None)
+
+ # get common set if not provided
+ if commoninc is None:
+ commoninc = findcommonincoming(repo, other, force=force)
+ og.commonheads, _any, _hds = commoninc
+
+ # compute outgoing
+ mayexclude = (repo._phasecache.phaseroots[phases.secret] or repo.obsstore)
+ if not mayexclude:
+ og.missingheads = onlyheads or repo.heads()
+ elif onlyheads is None:
+ # use visible heads as it should be cached
+ og.missingheads = visibleheads(repo)
+ og.excluded = [ctx.node() for ctx in repo.set('secret() or extinct()')]
+ else:
+ # compute common, missing and exclude secret stuff
+ sets = repo.changelog.findcommonmissing(og.commonheads, onlyheads)
+ og._common, allmissing = sets
+ og._missing = missing = []
+ og.excluded = excluded = []
+ for node in allmissing:
+ ctx = repo[node]
+ if ctx.phase() >= phases.secret or ctx.extinct():
+ excluded.append(node)
+ else:
+ missing.append(node)
+ if len(missing) == len(allmissing):
+ missingheads = onlyheads
+ else: # update missing heads
+ missingheads = phases.newheads(repo, onlyheads, excluded)
+ og.missingheads = missingheads
+ if portable:
+ # recompute common and missingheads as if -r<rev> had been given for
+ # each head of missing, and --base <rev> for each head of the proper
+ # ancestors of missing
+ og._computecommonmissing()
+ cl = repo.changelog
+ missingrevs = set(cl.rev(n) for n in og._missing)
+ og._common = set(cl.ancestors(missingrevs)) - missingrevs
+ commonheads = set(og.commonheads)
+ og.missingheads = [h for h in og.missingheads if h not in commonheads]
+
+ return og
+
+def _headssummary(repo, remote, outgoing):
+ """compute a summary of branch and heads status before and after push
+
+ return {'branch': ([remoteheads], [newheads], [unsyncedheads])} mapping
+
+ - branch: the branch name
+ - remoteheads: the list of remote heads known locally
+ None is the branch is new
+ - newheads: the new remote heads (known locally) with outgoing pushed
+ - unsyncedheads: the list of remote heads unknown locally.
+ """
+ cl = repo.changelog
+ headssum = {}
+ # A. Create set of branches involved in the push.
+ branches = set(repo[n].branch() for n in outgoing.missing)
+ remotemap = remote.branchmap()
+ newbranches = branches - set(remotemap)
+ branches.difference_update(newbranches)
+
+ # A. register remote heads
+ remotebranches = set()
+ for branch, heads in remote.branchmap().iteritems():
+ remotebranches.add(branch)
+ known = []
+ unsynced = []
+ for h in heads:
+ if h in cl.nodemap:
+ known.append(h)
+ else:
+ unsynced.append(h)
+ headssum[branch] = (known, list(known), unsynced)
+ # B. add new branch data
+ missingctx = list(repo[n] for n in outgoing.missing)
+ touchedbranches = set()
+ for ctx in missingctx:
+ branch = ctx.branch()
+ touchedbranches.add(branch)
+ if branch not in headssum:
+ headssum[branch] = (None, [], [])
+
+ # C drop data about untouched branches:
+ for branch in remotebranches - touchedbranches:
+ del headssum[branch]
+
+ # D. Update newmap with outgoing changes.
+ # This will possibly add new heads and remove existing ones.
+ newmap = dict((branch, heads[1]) for branch, heads in headssum.iteritems()
+ if heads[0] is not None)
+ repo._updatebranchcache(newmap, missingctx)
+ for branch, newheads in newmap.iteritems():
+ headssum[branch][1][:] = newheads
+ return headssum
+
+def _oldheadssummary(repo, remoteheads, outgoing, inc=False):
+ """Compute branchmapsummary for repo without branchmap support"""
+
+ cl = repo.changelog
+ # 1-4b. old servers: Check for new topological heads.
+ # Construct {old,new}map with branch = None (topological branch).
+ # (code based on _updatebranchcache)
+ oldheads = set(h for h in remoteheads if h in cl.nodemap)
+ # all nodes in outgoing.missing are children of either:
+ # - an element of oldheads
+ # - another element of outgoing.missing
+ # - nullrev
+ # This explains why the new head are very simple to compute.
+ r = repo.set('heads(%ln + %ln)', oldheads, outgoing.missing)
+ newheads = list(c.node() for c in r)
+ unsynced = inc and set([None]) or set()
+ return {None: (oldheads, newheads, unsynced)}
+
+def checkheads(repo, remote, outgoing, remoteheads, newbranch=False, inc=False):
+ """Check that a push won't add any outgoing head
+
+ raise Abort error and display ui message as needed.
+ """
+ # Check for each named branch if we're creating new remote heads.
+ # To be a remote head after push, node must be either:
+ # - unknown locally
+ # - a local outgoing head descended from update
+ # - a remote head that's known locally and not
+ # ancestral to an outgoing head
+ if remoteheads == [nullid]:
+ # remote is empty, nothing to check.
+ return
+
+ if remote.capable('branchmap'):
+ headssum = _headssummary(repo, remote, outgoing)
+ else:
+ headssum = _oldheadssummary(repo, remoteheads, outgoing, inc)
+ newbranches = [branch for branch, heads in headssum.iteritems()
+ if heads[0] is None]
+ # 1. Check for new branches on the remote.
+ if newbranches and not newbranch: # new branch requires --new-branch
+ branchnames = ', '.join(sorted(newbranches))
+ raise util.Abort(_("push creates new remote branches: %s!")
+ % branchnames,
+ hint=_("use 'hg push --new-branch' to create"
+ " new remote branches"))
+
+ # 2 compute newly pushed bookmarks. We
+ # we don't warned about bookmarked heads.
+ localbookmarks = repo._bookmarks
+ remotebookmarks = remote.listkeys('bookmarks')
+ bookmarkedheads = set()
+ for bm in localbookmarks:
+ rnode = remotebookmarks.get(bm)
+ if rnode and rnode in repo:
+ lctx, rctx = repo[bm], repo[rnode]
+ if rctx == lctx.ancestor(rctx):
+ bookmarkedheads.add(lctx.node())
+
+ # 3. Check for new heads.
+ # If there are more heads after the push than before, a suitable
+ # error message, depending on unsynced status, is displayed.
+ error = None
+ unsynced = False
+ allmissing = set(outgoing.missing)
+ for branch, heads in headssum.iteritems():
+ if heads[0] is None:
+ # Maybe we should abort if we push more that one head
+ # for new branches ?
+ continue
+ if heads[2]:
+ unsynced = True
+ oldhs = set(heads[0])
+ candidate_newhs = set(heads[1])
+ # add unsynced data
+ oldhs.update(heads[2])
+ candidate_newhs.update(heads[2])
+ dhs = None
+ if repo.obsstore:
+ # remove future heads which are actually obsolete by another
+ # pushed element:
+ #
+ # XXX There is several case this case does not handle properly
+ #
+ # (1) if <nh> is public, it won't be affected by obsolete marker
+ # and a new is created
+ #
+ # (2) if the new heads have ancestors which are not obsolete and
+ # not ancestors of any other heads we will have a new head too.
+ #
+ # This two case will be easy to handle for know changeset but much
+ # more tricky for unsynced changes.
+ newhs = set()
+ for nh in candidate_newhs:
+ for suc in obsolete.anysuccessors(repo.obsstore, nh):
+ if suc != nh and suc in allmissing:
+ break
+ else:
+ newhs.add(nh)
+ else:
+ newhs = candidate_newhs
+ if len(newhs) > len(oldhs):
+ # strip updates to existing remote heads from the new heads list
+ dhs = list(newhs - bookmarkedheads - oldhs)
+ if dhs:
+ if error is None:
+ if branch not in ('default', None):
+ error = _("push creates new remote head %s "
+ "on branch '%s'!") % (short(dhs[0]), branch)
+ else:
+ error = _("push creates new remote head %s!"
+ ) % short(dhs[0])
+ if heads[2]: # unsynced
+ hint = _("you should pull and merge or "
+ "use push -f to force")
+ else:
+ hint = _("did you forget to merge? "
+ "use push -f to force")
+ if branch is not None:
+ repo.ui.note(_("new remote heads on branch '%s'\n") % branch)
+ for h in dhs:
+ repo.ui.note(_("new remote head %s\n") % short(h))
+ if error:
+ raise util.Abort(error, hint=hint)
+
+ # 6. Check for unsynced changes on involved branches.
+ if unsynced:
+ repo.ui.warn(_("note: unsynced remote changes!\n"))
+
+def visibleheads(repo):
+ """return the set of visible head of this repo"""
+ # XXX we want a cache on this
+ sroots = repo._phasecache.phaseroots[phases.secret]
+ if sroots or repo.obsstore:
+ # XXX very slow revset. storing heads or secret "boundary"
+ # would help.
+ revset = repo.set('heads(not (%ln:: + extinct()))', sroots)
+
+ vheads = [ctx.node() for ctx in revset]
+ if not vheads:
+ vheads.append(nullid)
+ else:
+ vheads = repo.heads()
+ return vheads
+
+
+def visiblebranchmap(repo):
+ """return a branchmap for the visible set"""
+ # XXX Recomputing this data on the fly is very slow. We should build a
+ # XXX cached version while computin the standard branchmap version.
+ sroots = repo._phasecache.phaseroots[phases.secret]
+ if sroots or repo.obsstore:
+ vbranchmap = {}
+ for branch, nodes in repo.branchmap().iteritems():
+ # search for secret heads.
+ for n in nodes:
+ if repo[n].phase() >= phases.secret:
+ nodes = None
+ break
+ # if secret heads were found we must compute them again
+ if nodes is None:
+ s = repo.set('heads(branch(%s) - secret() - extinct())',
+ branch)
+ nodes = [c.node() for c in s]
+ vbranchmap[branch] = nodes
+ else:
+ vbranchmap = repo.branchmap()
+ return vbranchmap
diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py
new file mode 100644
index 0000000..520fe59
--- /dev/null
+++ b/mercurial/dispatch.py
@@ -0,0 +1,830 @@
+# dispatch.py - command dispatching for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import os, sys, atexit, signal, pdb, socket, errno, shlex, time, traceback, re
+import util, commands, hg, fancyopts, extensions, hook, error
+import cmdutil, encoding
+import ui as uimod
+
+class request(object):
+ def __init__(self, args, ui=None, repo=None, fin=None, fout=None,
+ ferr=None):
+ self.args = args
+ self.ui = ui
+ self.repo = repo
+
+ # input/output/error streams
+ self.fin = fin
+ self.fout = fout
+ self.ferr = ferr
+
+def run():
+ "run the command in sys.argv"
+ sys.exit((dispatch(request(sys.argv[1:])) or 0) & 255)
+
+def dispatch(req):
+ "run the command specified in req.args"
+ if req.ferr:
+ ferr = req.ferr
+ elif req.ui:
+ ferr = req.ui.ferr
+ else:
+ ferr = sys.stderr
+
+ try:
+ if not req.ui:
+ req.ui = uimod.ui()
+ if '--traceback' in req.args:
+ req.ui.setconfig('ui', 'traceback', 'on')
+
+ # set ui streams from the request
+ if req.fin:
+ req.ui.fin = req.fin
+ if req.fout:
+ req.ui.fout = req.fout
+ if req.ferr:
+ req.ui.ferr = req.ferr
+ except util.Abort, inst:
+ ferr.write(_("abort: %s\n") % inst)
+ if inst.hint:
+ ferr.write(_("(%s)\n") % inst.hint)
+ return -1
+ except error.ParseError, inst:
+ if len(inst.args) > 1:
+ ferr.write(_("hg: parse error at %s: %s\n") %
+ (inst.args[1], inst.args[0]))
+ else:
+ ferr.write(_("hg: parse error: %s\n") % inst.args[0])
+ return -1
+
+ return _runcatch(req)
+
+def _runcatch(req):
+ def catchterm(*args):
+ raise error.SignalInterrupt
+
+ ui = req.ui
+ try:
+ for name in 'SIGBREAK', 'SIGHUP', 'SIGTERM':
+ num = getattr(signal, name, None)
+ if num:
+ signal.signal(num, catchterm)
+ except ValueError:
+ pass # happens if called in a thread
+
+ try:
+ try:
+ # enter the debugger before command execution
+ if '--debugger' in req.args:
+ ui.warn(_("entering debugger - "
+ "type c to continue starting hg or h for help\n"))
+ pdb.set_trace()
+ try:
+ return _dispatch(req)
+ finally:
+ ui.flush()
+ except: # re-raises
+ # enter the debugger when we hit an exception
+ if '--debugger' in req.args:
+ traceback.print_exc()
+ pdb.post_mortem(sys.exc_info()[2])
+ ui.traceback()
+ raise
+
+ # Global exception handling, alphabetically
+ # Mercurial-specific first, followed by built-in and library exceptions
+ except error.AmbiguousCommand, inst:
+ ui.warn(_("hg: command '%s' is ambiguous:\n %s\n") %
+ (inst.args[0], " ".join(inst.args[1])))
+ except error.ParseError, inst:
+ if len(inst.args) > 1:
+ ui.warn(_("hg: parse error at %s: %s\n") %
+ (inst.args[1], inst.args[0]))
+ else:
+ ui.warn(_("hg: parse error: %s\n") % inst.args[0])
+ return -1
+ except error.LockHeld, inst:
+ if inst.errno == errno.ETIMEDOUT:
+ reason = _('timed out waiting for lock held by %s') % inst.locker
+ else:
+ reason = _('lock held by %s') % inst.locker
+ ui.warn(_("abort: %s: %s\n") % (inst.desc or inst.filename, reason))
+ except error.LockUnavailable, inst:
+ ui.warn(_("abort: could not lock %s: %s\n") %
+ (inst.desc or inst.filename, inst.strerror))
+ except error.CommandError, inst:
+ if inst.args[0]:
+ ui.warn(_("hg %s: %s\n") % (inst.args[0], inst.args[1]))
+ commands.help_(ui, inst.args[0], full=False, command=True)
+ else:
+ ui.warn(_("hg: %s\n") % inst.args[1])
+ commands.help_(ui, 'shortlist')
+ except error.OutOfBandError, inst:
+ ui.warn(_("abort: remote error:\n"))
+ ui.warn(''.join(inst.args))
+ except error.RepoError, inst:
+ ui.warn(_("abort: %s!\n") % inst)
+ if inst.hint:
+ ui.warn(_("(%s)\n") % inst.hint)
+ except error.ResponseError, inst:
+ ui.warn(_("abort: %s") % inst.args[0])
+ if not isinstance(inst.args[1], basestring):
+ ui.warn(" %r\n" % (inst.args[1],))
+ elif not inst.args[1]:
+ ui.warn(_(" empty string\n"))
+ else:
+ ui.warn("\n%r\n" % util.ellipsis(inst.args[1]))
+ except error.RevlogError, inst:
+ ui.warn(_("abort: %s!\n") % inst)
+ except error.SignalInterrupt:
+ ui.warn(_("killed!\n"))
+ except error.UnknownCommand, inst:
+ ui.warn(_("hg: unknown command '%s'\n") % inst.args[0])
+ try:
+ # check if the command is in a disabled extension
+ # (but don't check for extensions themselves)
+ commands.help_(ui, inst.args[0], unknowncmd=True)
+ except error.UnknownCommand:
+ commands.help_(ui, 'shortlist')
+ except util.Abort, inst:
+ ui.warn(_("abort: %s\n") % inst)
+ if inst.hint:
+ ui.warn(_("(%s)\n") % inst.hint)
+ except ImportError, inst:
+ ui.warn(_("abort: %s!\n") % inst)
+ m = str(inst).split()[-1]
+ if m in "mpatch bdiff".split():
+ ui.warn(_("(did you forget to compile extensions?)\n"))
+ elif m in "zlib".split():
+ ui.warn(_("(is your Python install correct?)\n"))
+ except IOError, inst:
+ if util.safehasattr(inst, "code"):
+ ui.warn(_("abort: %s\n") % inst)
+ elif util.safehasattr(inst, "reason"):
+ try: # usually it is in the form (errno, strerror)
+ reason = inst.reason.args[1]
+ except (AttributeError, IndexError):
+ # it might be anything, for example a string
+ reason = inst.reason
+ ui.warn(_("abort: error: %s\n") % reason)
+ elif util.safehasattr(inst, "args") and inst.args[0] == errno.EPIPE:
+ if ui.debugflag:
+ ui.warn(_("broken pipe\n"))
+ elif getattr(inst, "strerror", None):
+ if getattr(inst, "filename", None):
+ ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
+ else:
+ ui.warn(_("abort: %s\n") % inst.strerror)
+ else:
+ raise
+ except OSError, inst:
+ if getattr(inst, "filename", None):
+ ui.warn(_("abort: %s: %s\n") % (inst.strerror, inst.filename))
+ else:
+ ui.warn(_("abort: %s\n") % inst.strerror)
+ except KeyboardInterrupt:
+ try:
+ ui.warn(_("interrupted!\n"))
+ except IOError, inst:
+ if inst.errno == errno.EPIPE:
+ if ui.debugflag:
+ ui.warn(_("\nbroken pipe\n"))
+ else:
+ raise
+ except MemoryError:
+ ui.warn(_("abort: out of memory\n"))
+ except SystemExit, inst:
+ # Commands shouldn't sys.exit directly, but give a return code.
+ # Just in case catch this and and pass exit code to caller.
+ return inst.code
+ except socket.error, inst:
+ ui.warn(_("abort: %s\n") % inst.args[-1])
+ except: # re-raises
+ myver = util.version()
+ # For compatibility checking, we discard the portion of the hg
+ # version after the + on the assumption that if a "normal
+ # user" is running a build with a + in it the packager
+ # probably built from fairly close to a tag and anyone with a
+ # 'make local' copy of hg (where the version number can be out
+ # of date) will be clueful enough to notice the implausible
+ # version number and try updating.
+ compare = myver.split('+')[0]
+ ct = tuplever(compare)
+ worst = None, ct, ''
+ for name, mod in extensions.extensions():
+ testedwith = getattr(mod, 'testedwith', 'unknown')
+ report = getattr(mod, 'buglink', _('the extension author.'))
+ if testedwith == 'unknown':
+ # We found an untested extension. It's likely the culprit.
+ worst = name, testedwith, report
+ break
+ if compare not in testedwith.split() and testedwith != 'internal':
+ tested = [tuplever(v) for v in testedwith.split()]
+ lower = [t for t in tested if t < ct]
+ nearest = max(lower or tested)
+ if worst[0] is None or nearest < worst[1]:
+ worst = name, nearest, report
+ if worst[0] is not None:
+ name, testedwith, report = worst
+ if not isinstance(testedwith, str):
+ testedwith = '.'.join([str(c) for c in testedwith])
+ warning = (_('** Unknown exception encountered with '
+ 'possibly-broken third-party extension %s\n'
+ '** which supports versions %s of Mercurial.\n'
+ '** Please disable %s and try your action again.\n'
+ '** If that fixes the bug please report it to %s\n')
+ % (name, testedwith, name, report))
+ else:
+ warning = (_("** unknown exception encountered, "
+ "please report by visiting\n") +
+ _("** http://mercurial.selenic.com/wiki/BugTracker\n"))
+ warning += ((_("** Python %s\n") % sys.version.replace('\n', '')) +
+ (_("** Mercurial Distributed SCM (version %s)\n") % myver) +
+ (_("** Extensions loaded: %s\n") %
+ ", ".join([x[0] for x in extensions.extensions()])))
+ ui.warn(warning)
+ raise
+
+ return -1
+
+def tuplever(v):
+ try:
+ return tuple([int(i) for i in v.split('.')])
+ except ValueError:
+ return tuple()
+
+def aliasargs(fn, givenargs):
+ args = getattr(fn, 'args', [])
+ if args:
+ cmd = ' '.join(map(util.shellquote, args))
+
+ nums = []
+ def replacer(m):
+ num = int(m.group(1)) - 1
+ nums.append(num)
+ if num < len(givenargs):
+ return givenargs[num]
+ raise util.Abort(_('too few arguments for command alias'))
+ cmd = re.sub(r'\$(\d+|\$)', replacer, cmd)
+ givenargs = [x for i, x in enumerate(givenargs)
+ if i not in nums]
+ args = shlex.split(cmd)
+ return args + givenargs
+
+class cmdalias(object):
+ def __init__(self, name, definition, cmdtable):
+ self.name = self.cmd = name
+ self.cmdname = ''
+ self.definition = definition
+ self.args = []
+ self.opts = []
+ self.help = ''
+ self.norepo = True
+ self.optionalrepo = False
+ self.badalias = False
+
+ try:
+ aliases, entry = cmdutil.findcmd(self.name, cmdtable)
+ for alias, e in cmdtable.iteritems():
+ if e is entry:
+ self.cmd = alias
+ break
+ self.shadows = True
+ except error.UnknownCommand:
+ self.shadows = False
+
+ if not self.definition:
+ def fn(ui, *args):
+ ui.warn(_("no definition for alias '%s'\n") % self.name)
+ return 1
+ self.fn = fn
+ self.badalias = True
+ return
+
+ if self.definition.startswith('!'):
+ self.shell = True
+ def fn(ui, *args):
+ env = {'HG_ARGS': ' '.join((self.name,) + args)}
+ def _checkvar(m):
+ if m.groups()[0] == '$':
+ return m.group()
+ elif int(m.groups()[0]) <= len(args):
+ return m.group()
+ else:
+ ui.debug("No argument found for substitution "
+ "of %i variable in alias '%s' definition."
+ % (int(m.groups()[0]), self.name))
+ return ''
+ cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:])
+ replace = dict((str(i + 1), arg) for i, arg in enumerate(args))
+ replace['0'] = self.name
+ replace['@'] = ' '.join(args)
+ cmd = util.interpolate(r'\$', replace, cmd, escape_prefix=True)
+ return util.system(cmd, environ=env, out=ui.fout)
+ self.fn = fn
+ return
+
+ args = shlex.split(self.definition)
+ self.cmdname = cmd = args.pop(0)
+ args = map(util.expandpath, args)
+
+ for invalidarg in ("--cwd", "-R", "--repository", "--repo"):
+ if _earlygetopt([invalidarg], args):
+ def fn(ui, *args):
+ ui.warn(_("error in definition for alias '%s': %s may only "
+ "be given on the command line\n")
+ % (self.name, invalidarg))
+ return 1
+
+ self.fn = fn
+ self.badalias = True
+ return
+
+ try:
+ tableentry = cmdutil.findcmd(cmd, cmdtable, False)[1]
+ if len(tableentry) > 2:
+ self.fn, self.opts, self.help = tableentry
+ else:
+ self.fn, self.opts = tableentry
+
+ self.args = aliasargs(self.fn, args)
+ if cmd not in commands.norepo.split(' '):
+ self.norepo = False
+ if cmd in commands.optionalrepo.split(' '):
+ self.optionalrepo = True
+ if self.help.startswith("hg " + cmd):
+ # drop prefix in old-style help lines so hg shows the alias
+ self.help = self.help[4 + len(cmd):]
+ self.__doc__ = self.fn.__doc__
+
+ except error.UnknownCommand:
+ def fn(ui, *args):
+ ui.warn(_("alias '%s' resolves to unknown command '%s'\n") \
+ % (self.name, cmd))
+ try:
+ # check if the command is in a disabled extension
+ commands.help_(ui, cmd, unknowncmd=True)
+ except error.UnknownCommand:
+ pass
+ return 1
+ self.fn = fn
+ self.badalias = True
+ except error.AmbiguousCommand:
+ def fn(ui, *args):
+ ui.warn(_("alias '%s' resolves to ambiguous command '%s'\n") \
+ % (self.name, cmd))
+ return 1
+ self.fn = fn
+ self.badalias = True
+
+ def __call__(self, ui, *args, **opts):
+ if self.shadows:
+ ui.debug("alias '%s' shadows command '%s'\n" %
+ (self.name, self.cmdname))
+
+ if util.safehasattr(self, 'shell'):
+ return self.fn(ui, *args, **opts)
+ else:
+ try:
+ util.checksignature(self.fn)(ui, *args, **opts)
+ except error.SignatureError:
+ args = ' '.join([self.cmdname] + self.args)
+ ui.debug("alias '%s' expands to '%s'\n" % (self.name, args))
+ raise
+
+def addaliases(ui, cmdtable):
+ # aliases are processed after extensions have been loaded, so they
+ # may use extension commands. Aliases can also use other alias definitions,
+ # but only if they have been defined prior to the current definition.
+ for alias, definition in ui.configitems('alias'):
+ aliasdef = cmdalias(alias, definition, cmdtable)
+
+ try:
+ olddef = cmdtable[aliasdef.cmd][0]
+ if olddef.definition == aliasdef.definition:
+ continue
+ except (KeyError, AttributeError):
+ # definition might not exist or it might not be a cmdalias
+ pass
+
+ cmdtable[aliasdef.name] = (aliasdef, aliasdef.opts, aliasdef.help)
+ if aliasdef.norepo:
+ commands.norepo += ' %s' % alias
+ if aliasdef.optionalrepo:
+ commands.optionalrepo += ' %s' % alias
+
+def _parse(ui, args):
+ options = {}
+ cmdoptions = {}
+
+ try:
+ args = fancyopts.fancyopts(args, commands.globalopts, options)
+ except fancyopts.getopt.GetoptError, inst:
+ raise error.CommandError(None, inst)
+
+ if args:
+ cmd, args = args[0], args[1:]
+ aliases, entry = cmdutil.findcmd(cmd, commands.table,
+ ui.configbool("ui", "strict"))
+ cmd = aliases[0]
+ args = aliasargs(entry[0], args)
+ defaults = ui.config("defaults", cmd)
+ if defaults:
+ args = map(util.expandpath, shlex.split(defaults)) + args
+ c = list(entry[1])
+ else:
+ cmd = None
+ c = []
+
+ # combine global options into local
+ for o in commands.globalopts:
+ c.append((o[0], o[1], options[o[1]], o[3]))
+
+ try:
+ args = fancyopts.fancyopts(args, c, cmdoptions, True)
+ except fancyopts.getopt.GetoptError, inst:
+ raise error.CommandError(cmd, inst)
+
+ # separate global options back out
+ for o in commands.globalopts:
+ n = o[1]
+ options[n] = cmdoptions[n]
+ del cmdoptions[n]
+
+ return (cmd, cmd and entry[0] or None, args, options, cmdoptions)
+
+def _parseconfig(ui, config):
+ """parse the --config options from the command line"""
+ configs = []
+
+ for cfg in config:
+ try:
+ name, value = cfg.split('=', 1)
+ section, name = name.split('.', 1)
+ if not section or not name:
+ raise IndexError
+ ui.setconfig(section, name, value)
+ configs.append((section, name, value))
+ except (IndexError, ValueError):
+ raise util.Abort(_('malformed --config option: %r '
+ '(use --config section.name=value)') % cfg)
+
+ return configs
+
+def _earlygetopt(aliases, args):
+ """Return list of values for an option (or aliases).
+
+ The values are listed in the order they appear in args.
+ The options and values are removed from args.
+ """
+ try:
+ argcount = args.index("--")
+ except ValueError:
+ argcount = len(args)
+ shortopts = [opt for opt in aliases if len(opt) == 2]
+ values = []
+ pos = 0
+ while pos < argcount:
+ if args[pos] in aliases:
+ if pos + 1 >= argcount:
+ # ignore and let getopt report an error if there is no value
+ break
+ del args[pos]
+ values.append(args.pop(pos))
+ argcount -= 2
+ elif args[pos][:2] in shortopts:
+ # short option can have no following space, e.g. hg log -Rfoo
+ values.append(args.pop(pos)[2:])
+ argcount -= 1
+ else:
+ pos += 1
+ return values
+
+def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions):
+ # run pre-hook, and abort if it fails
+ ret = hook.hook(lui, repo, "pre-%s" % cmd, False, args=" ".join(fullargs),
+ pats=cmdpats, opts=cmdoptions)
+ if ret:
+ return ret
+ ret = _runcommand(ui, options, cmd, d)
+ # run post-hook, passing command result
+ hook.hook(lui, repo, "post-%s" % cmd, False, args=" ".join(fullargs),
+ result=ret, pats=cmdpats, opts=cmdoptions)
+ return ret
+
+def _getlocal(ui, rpath):
+ """Return (path, local ui object) for the given target path.
+
+ Takes paths in [cwd]/.hg/hgrc into account."
+ """
+ try:
+ wd = os.getcwd()
+ except OSError, e:
+ raise util.Abort(_("error getting current working directory: %s") %
+ e.strerror)
+ path = cmdutil.findrepo(wd) or ""
+ if not path:
+ lui = ui
+ else:
+ lui = ui.copy()
+ lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
+
+ if rpath and rpath[-1]:
+ path = lui.expandpath(rpath[-1])
+ lui = ui.copy()
+ lui.readconfig(os.path.join(path, ".hg", "hgrc"), path)
+
+ return path, lui
+
+def _checkshellalias(lui, ui, args):
+ options = {}
+
+ try:
+ args = fancyopts.fancyopts(args, commands.globalopts, options)
+ except fancyopts.getopt.GetoptError:
+ return
+
+ if not args:
+ return
+
+ norepo = commands.norepo
+ optionalrepo = commands.optionalrepo
+ def restorecommands():
+ commands.norepo = norepo
+ commands.optionalrepo = optionalrepo
+
+ cmdtable = commands.table.copy()
+ addaliases(lui, cmdtable)
+
+ cmd = args[0]
+ try:
+ aliases, entry = cmdutil.findcmd(cmd, cmdtable,
+ lui.configbool("ui", "strict"))
+ except (error.AmbiguousCommand, error.UnknownCommand):
+ restorecommands()
+ return
+
+ cmd = aliases[0]
+ fn = entry[0]
+
+ if cmd and util.safehasattr(fn, 'shell'):
+ d = lambda: fn(ui, *args[1:])
+ return lambda: runcommand(lui, None, cmd, args[:1], ui, options, d,
+ [], {})
+
+ restorecommands()
+
+_loaded = set()
+def _dispatch(req):
+ args = req.args
+ ui = req.ui
+
+ # read --config before doing anything else
+ # (e.g. to change trust settings for reading .hg/hgrc)
+ cfgs = _parseconfig(ui, _earlygetopt(['--config'], args))
+
+ # check for cwd
+ cwd = _earlygetopt(['--cwd'], args)
+ if cwd:
+ os.chdir(cwd[-1])
+
+ rpath = _earlygetopt(["-R", "--repository", "--repo"], args)
+ path, lui = _getlocal(ui, rpath)
+
+ # Now that we're operating in the right directory/repository with
+ # the right config settings, check for shell aliases
+ shellaliasfn = _checkshellalias(lui, ui, args)
+ if shellaliasfn:
+ return shellaliasfn()
+
+ # Configure extensions in phases: uisetup, extsetup, cmdtable, and
+ # reposetup. Programs like TortoiseHg will call _dispatch several
+ # times so we keep track of configured extensions in _loaded.
+ extensions.loadall(lui)
+ exts = [ext for ext in extensions.extensions() if ext[0] not in _loaded]
+ # Propagate any changes to lui.__class__ by extensions
+ ui.__class__ = lui.__class__
+
+ # (uisetup and extsetup are handled in extensions.loadall)
+
+ for name, module in exts:
+ cmdtable = getattr(module, 'cmdtable', {})
+ overrides = [cmd for cmd in cmdtable if cmd in commands.table]
+ if overrides:
+ ui.warn(_("extension '%s' overrides commands: %s\n")
+ % (name, " ".join(overrides)))
+ commands.table.update(cmdtable)
+ _loaded.add(name)
+
+ # (reposetup is handled in hg.repository)
+
+ addaliases(lui, commands.table)
+
+ # check for fallback encoding
+ fallback = lui.config('ui', 'fallbackencoding')
+ if fallback:
+ encoding.fallbackencoding = fallback
+
+ fullargs = args
+ cmd, func, args, options, cmdoptions = _parse(lui, args)
+
+ if options["config"]:
+ raise util.Abort(_("option --config may not be abbreviated!"))
+ if options["cwd"]:
+ raise util.Abort(_("option --cwd may not be abbreviated!"))
+ if options["repository"]:
+ raise util.Abort(_(
+ "option -R has to be separated from other options (e.g. not -qR) "
+ "and --repository may only be abbreviated as --repo!"))
+
+ if options["encoding"]:
+ encoding.encoding = options["encoding"]
+ if options["encodingmode"]:
+ encoding.encodingmode = options["encodingmode"]
+ if options["time"]:
+ def get_times():
+ t = os.times()
+ if t[4] == 0.0: # Windows leaves this as zero, so use time.clock()
+ t = (t[0], t[1], t[2], t[3], time.clock())
+ return t
+ s = get_times()
+ def print_time():
+ t = get_times()
+ ui.warn(_("time: real %.3f secs (user %.3f+%.3f sys %.3f+%.3f)\n") %
+ (t[4]-s[4], t[0]-s[0], t[2]-s[2], t[1]-s[1], t[3]-s[3]))
+ atexit.register(print_time)
+
+ uis = set([ui, lui])
+
+ if req.repo:
+ uis.add(req.repo.ui)
+
+ # copy configs that were passed on the cmdline (--config) to the repo ui
+ for cfg in cfgs:
+ req.repo.ui.setconfig(*cfg)
+
+ if options['verbose'] or options['debug'] or options['quiet']:
+ for opt in ('verbose', 'debug', 'quiet'):
+ val = str(bool(options[opt]))
+ for ui_ in uis:
+ ui_.setconfig('ui', opt, val)
+
+ if options['traceback']:
+ for ui_ in uis:
+ ui_.setconfig('ui', 'traceback', 'on')
+
+ if options['noninteractive']:
+ for ui_ in uis:
+ ui_.setconfig('ui', 'interactive', 'off')
+
+ if cmdoptions.get('insecure', False):
+ for ui_ in uis:
+ ui_.setconfig('web', 'cacerts', '')
+
+ if options['version']:
+ return commands.version_(ui)
+ if options['help']:
+ return commands.help_(ui, cmd)
+ elif not cmd:
+ return commands.help_(ui, 'shortlist')
+
+ repo = None
+ cmdpats = args[:]
+ if cmd not in commands.norepo.split():
+ # use the repo from the request only if we don't have -R
+ if not rpath and not cwd:
+ repo = req.repo
+
+ if repo:
+ # set the descriptors of the repo ui to those of ui
+ repo.ui.fin = ui.fin
+ repo.ui.fout = ui.fout
+ repo.ui.ferr = ui.ferr
+ else:
+ try:
+ repo = hg.repository(ui, path=path)
+ if not repo.local():
+ raise util.Abort(_("repository '%s' is not local") % path)
+ repo.ui.setconfig("bundle", "mainreporoot", repo.root)
+ except error.RequirementError:
+ raise
+ except error.RepoError:
+ if cmd not in commands.optionalrepo.split():
+ if args and not path: # try to infer -R from command args
+ repos = map(cmdutil.findrepo, args)
+ guess = repos[0]
+ if guess and repos.count(guess) == len(repos):
+ req.args = ['--repository', guess] + fullargs
+ return _dispatch(req)
+ if not path:
+ raise error.RepoError(_("no repository found in '%s'"
+ " (.hg not found)")
+ % os.getcwd())
+ raise
+ if repo:
+ ui = repo.ui
+ args.insert(0, repo)
+ elif rpath:
+ ui.warn(_("warning: --repository ignored\n"))
+
+ msg = ' '.join(' ' in a and repr(a) or a for a in fullargs)
+ ui.log("command", msg + "\n")
+ d = lambda: util.checksignature(func)(ui, *args, **cmdoptions)
+ try:
+ return runcommand(lui, repo, cmd, fullargs, ui, options, d,
+ cmdpats, cmdoptions)
+ finally:
+ if repo and repo != req.repo:
+ repo.close()
+
+def lsprofile(ui, func, fp):
+ format = ui.config('profiling', 'format', default='text')
+ field = ui.config('profiling', 'sort', default='inlinetime')
+ climit = ui.configint('profiling', 'nested', default=5)
+
+ if format not in ['text', 'kcachegrind']:
+ ui.warn(_("unrecognized profiling format '%s'"
+ " - Ignored\n") % format)
+ format = 'text'
+
+ try:
+ from mercurial import lsprof
+ except ImportError:
+ raise util.Abort(_(
+ 'lsprof not available - install from '
+ 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/'))
+ p = lsprof.Profiler()
+ p.enable(subcalls=True)
+ try:
+ return func()
+ finally:
+ p.disable()
+
+ if format == 'kcachegrind':
+ import lsprofcalltree
+ calltree = lsprofcalltree.KCacheGrind(p)
+ calltree.output(fp)
+ else:
+ # format == 'text'
+ stats = lsprof.Stats(p.getstats())
+ stats.sort(field)
+ stats.pprint(limit=30, file=fp, climit=climit)
+
+def statprofile(ui, func, fp):
+ try:
+ import statprof
+ except ImportError:
+ raise util.Abort(_(
+ 'statprof not available - install using "easy_install statprof"'))
+
+ freq = ui.configint('profiling', 'freq', default=1000)
+ if freq > 0:
+ statprof.reset(freq)
+ else:
+ ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq)
+
+ statprof.start()
+ try:
+ return func()
+ finally:
+ statprof.stop()
+ statprof.display(fp)
+
+def _runcommand(ui, options, cmd, cmdfunc):
+ def checkargs():
+ try:
+ return cmdfunc()
+ except error.SignatureError:
+ raise error.CommandError(cmd, _("invalid arguments"))
+
+ if options['profile']:
+ profiler = os.getenv('HGPROF')
+ if profiler is None:
+ profiler = ui.config('profiling', 'type', default='ls')
+ if profiler not in ('ls', 'stat'):
+ ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler)
+ profiler = 'ls'
+
+ output = ui.config('profiling', 'output')
+
+ if output:
+ path = ui.expandpath(output)
+ fp = open(path, 'wb')
+ else:
+ fp = sys.stderr
+
+ try:
+ if profiler == 'ls':
+ return lsprofile(ui, checkargs, fp)
+ else:
+ return statprofile(ui, checkargs, fp)
+ finally:
+ if output:
+ fp.close()
+ else:
+ return checkargs()
diff --git a/mercurial/encoding.py b/mercurial/encoding.py
new file mode 100644
index 0000000..781d03b
--- /dev/null
+++ b/mercurial/encoding.py
@@ -0,0 +1,287 @@
+# encoding.py - character transcoding support for Mercurial
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import error
+import unicodedata, locale, os
+
+def _getpreferredencoding():
+ '''
+ On darwin, getpreferredencoding ignores the locale environment and
+ always returns mac-roman. http://bugs.python.org/issue6202 fixes this
+ for Python 2.7 and up. This is the same corrected code for earlier
+ Python versions.
+
+ However, we can't use a version check for this method, as some distributions
+ patch Python to fix this. Instead, we use it as a 'fixer' for the mac-roman
+ encoding, as it is unlikely that this encoding is the actually expected.
+ '''
+ try:
+ locale.CODESET
+ except AttributeError:
+ # Fall back to parsing environment variables :-(
+ return locale.getdefaultlocale()[1]
+
+ oldloc = locale.setlocale(locale.LC_CTYPE)
+ locale.setlocale(locale.LC_CTYPE, "")
+ result = locale.nl_langinfo(locale.CODESET)
+ locale.setlocale(locale.LC_CTYPE, oldloc)
+
+ return result
+
+_encodingfixers = {
+ '646': lambda: 'ascii',
+ 'ANSI_X3.4-1968': lambda: 'ascii',
+ 'mac-roman': _getpreferredencoding
+}
+
+try:
+ encoding = os.environ.get("HGENCODING")
+ if not encoding:
+ encoding = locale.getpreferredencoding() or 'ascii'
+ encoding = _encodingfixers.get(encoding, lambda: encoding)()
+except locale.Error:
+ encoding = 'ascii'
+encodingmode = os.environ.get("HGENCODINGMODE", "strict")
+fallbackencoding = 'ISO-8859-1'
+
+class localstr(str):
+ '''This class allows strings that are unmodified to be
+ round-tripped to the local encoding and back'''
+ def __new__(cls, u, l):
+ s = str.__new__(cls, l)
+ s._utf8 = u
+ return s
+ def __hash__(self):
+ return hash(self._utf8) # avoid collisions in local string space
+
+def tolocal(s):
+ """
+ Convert a string from internal UTF-8 to local encoding
+
+ All internal strings should be UTF-8 but some repos before the
+ implementation of locale support may contain latin1 or possibly
+ other character sets. We attempt to decode everything strictly
+ using UTF-8, then Latin-1, and failing that, we use UTF-8 and
+ replace unknown characters.
+
+ The localstr class is used to cache the known UTF-8 encoding of
+ strings next to their local representation to allow lossless
+ round-trip conversion back to UTF-8.
+
+ >>> u = 'foo: \\xc3\\xa4' # utf-8
+ >>> l = tolocal(u)
+ >>> l
+ 'foo: ?'
+ >>> fromlocal(l)
+ 'foo: \\xc3\\xa4'
+ >>> u2 = 'foo: \\xc3\\xa1'
+ >>> d = { l: 1, tolocal(u2): 2 }
+ >>> d # no collision
+ {'foo: ?': 1, 'foo: ?': 2}
+ >>> 'foo: ?' in d
+ False
+ >>> l1 = 'foo: \\xe4' # historical latin1 fallback
+ >>> l = tolocal(l1)
+ >>> l
+ 'foo: ?'
+ >>> fromlocal(l) # magically in utf-8
+ 'foo: \\xc3\\xa4'
+ """
+
+ try:
+ try:
+ # make sure string is actually stored in UTF-8
+ u = s.decode('UTF-8')
+ if encoding == 'UTF-8':
+ # fast path
+ return s
+ r = u.encode(encoding, "replace")
+ if u == r.decode(encoding):
+ # r is a safe, non-lossy encoding of s
+ return r
+ return localstr(s, r)
+ except UnicodeDecodeError:
+ # we should only get here if we're looking at an ancient changeset
+ try:
+ u = s.decode(fallbackencoding)
+ r = u.encode(encoding, "replace")
+ if u == r.decode(encoding):
+ # r is a safe, non-lossy encoding of s
+ return r
+ return localstr(u.encode('UTF-8'), r)
+ except UnicodeDecodeError:
+ u = s.decode("utf-8", "replace") # last ditch
+ return u.encode(encoding, "replace") # can't round-trip
+ except LookupError, k:
+ raise error.Abort(k, hint="please check your locale settings")
+
+def fromlocal(s):
+ """
+ Convert a string from the local character encoding to UTF-8
+
+ We attempt to decode strings using the encoding mode set by
+ HGENCODINGMODE, which defaults to 'strict'. In this mode, unknown
+ characters will cause an error message. Other modes include
+ 'replace', which replaces unknown characters with a special
+ Unicode character, and 'ignore', which drops the character.
+ """
+
+ # can we do a lossless round-trip?
+ if isinstance(s, localstr):
+ return s._utf8
+
+ try:
+ return s.decode(encoding, encodingmode).encode("utf-8")
+ except UnicodeDecodeError, inst:
+ sub = s[max(0, inst.start - 10):inst.start + 10]
+ raise error.Abort("decoding near '%s': %s!" % (sub, inst))
+ except LookupError, k:
+ raise error.Abort(k, hint="please check your locale settings")
+
+# How to treat ambiguous-width characters. Set to 'wide' to treat as wide.
+wide = (os.environ.get("HGENCODINGAMBIGUOUS", "narrow") == "wide"
+ and "WFA" or "WF")
+
+def colwidth(s):
+ "Find the column width of a string for display in the local encoding"
+ return ucolwidth(s.decode(encoding, 'replace'))
+
+def ucolwidth(d):
+ "Find the column width of a Unicode string for display"
+ eaw = getattr(unicodedata, 'east_asian_width', None)
+ if eaw is not None:
+ return sum([eaw(c) in wide and 2 or 1 for c in d])
+ return len(d)
+
+def getcols(s, start, c):
+ '''Use colwidth to find a c-column substring of s starting at byte
+ index start'''
+ for x in xrange(start + c, len(s)):
+ t = s[start:x]
+ if colwidth(t) == c:
+ return t
+
+def lower(s):
+ "best-effort encoding-aware case-folding of local string s"
+ try:
+ s.decode('ascii') # throw exception for non-ASCII character
+ return s.lower()
+ except UnicodeDecodeError:
+ pass
+ try:
+ if isinstance(s, localstr):
+ u = s._utf8.decode("utf-8")
+ else:
+ u = s.decode(encoding, encodingmode)
+
+ lu = u.lower()
+ if u == lu:
+ return s # preserve localstring
+ return lu.encode(encoding)
+ except UnicodeError:
+ return s.lower() # we don't know how to fold this except in ASCII
+ except LookupError, k:
+ raise error.Abort(k, hint="please check your locale settings")
+
+def upper(s):
+ "best-effort encoding-aware case-folding of local string s"
+ try:
+ s.decode('ascii') # throw exception for non-ASCII character
+ return s.upper()
+ except UnicodeDecodeError:
+ pass
+ try:
+ if isinstance(s, localstr):
+ u = s._utf8.decode("utf-8")
+ else:
+ u = s.decode(encoding, encodingmode)
+
+ uu = u.upper()
+ if u == uu:
+ return s # preserve localstring
+ return uu.encode(encoding)
+ except UnicodeError:
+ return s.upper() # we don't know how to fold this except in ASCII
+ except LookupError, k:
+ raise error.Abort(k, hint="please check your locale settings")
+
+def toutf8b(s):
+ '''convert a local, possibly-binary string into UTF-8b
+
+ This is intended as a generic method to preserve data when working
+ with schemes like JSON and XML that have no provision for
+ arbitrary byte strings. As Mercurial often doesn't know
+ what encoding data is in, we use so-called UTF-8b.
+
+ If a string is already valid UTF-8 (or ASCII), it passes unmodified.
+ Otherwise, unsupported bytes are mapped to UTF-16 surrogate range,
+ uDC00-uDCFF.
+
+ Principles of operation:
+
+ - ASCII and UTF-8 data sucessfully round-trips and is understood
+ by Unicode-oriented clients
+ - filenames and file contents in arbitrary other encodings can have
+ be round-tripped or recovered by clueful clients
+ - local strings that have a cached known UTF-8 encoding (aka
+ localstr) get sent as UTF-8 so Unicode-oriented clients get the
+ Unicode data they want
+ - because we must preserve UTF-8 bytestring in places such as
+ filenames, metadata can't be roundtripped without help
+
+ (Note: "UTF-8b" often refers to decoding a mix of valid UTF-8 and
+ arbitrary bytes into an internal Unicode format that can be
+ re-encoded back into the original. Here we are exposing the
+ internal surrogate encoding as a UTF-8 string.)
+ '''
+
+ if isinstance(s, localstr):
+ return s._utf8
+
+ try:
+ if s.decode('utf-8'):
+ return s
+ except UnicodeDecodeError:
+ # surrogate-encode any characters that don't round-trip
+ s2 = s.decode('utf-8', 'ignore').encode('utf-8')
+ r = ""
+ pos = 0
+ for c in s:
+ if s2[pos:pos + 1] == c:
+ r += c
+ pos += 1
+ else:
+ r += unichr(0xdc00 + ord(c)).encode('utf-8')
+ return r
+
+def fromutf8b(s):
+ '''Given a UTF-8b string, return a local, possibly-binary string.
+
+ return the original binary string. This
+ is a round-trip process for strings like filenames, but metadata
+ that's was passed through tolocal will remain in UTF-8.
+
+ >>> m = "\\xc3\\xa9\\x99abcd"
+ >>> n = toutf8b(m)
+ >>> n
+ '\\xc3\\xa9\\xed\\xb2\\x99abcd'
+ >>> fromutf8b(n) == m
+ True
+ '''
+
+ # fast path - look for uDxxx prefixes in s
+ if "\xed" not in s:
+ return s
+
+ u = s.decode("utf-8")
+ r = ""
+ for c in u:
+ if ord(c) & 0xff00 == 0xdc00:
+ r += chr(ord(c) & 0xff)
+ else:
+ r += c.encode("utf-8")
+ return r
diff --git a/mercurial/error.py b/mercurial/error.py
new file mode 100644
index 0000000..462b971
--- /dev/null
+++ b/mercurial/error.py
@@ -0,0 +1,90 @@
+# error.py - Mercurial exceptions
+#
+# Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Mercurial exceptions.
+
+This allows us to catch exceptions at higher levels without forcing
+imports.
+"""
+
+# Do not import anything here, please
+
+class RevlogError(Exception):
+ pass
+
+class LookupError(RevlogError, KeyError):
+ def __init__(self, name, index, message):
+ self.name = name
+ if isinstance(name, str) and len(name) == 20:
+ from node import short
+ name = short(name)
+ RevlogError.__init__(self, '%s@%s: %s' % (index, name, message))
+
+ def __str__(self):
+ return RevlogError.__str__(self)
+
+class CommandError(Exception):
+ """Exception raised on errors in parsing the command line."""
+
+class Abort(Exception):
+ """Raised if a command needs to print an error and exit."""
+ def __init__(self, *args, **kw):
+ Exception.__init__(self, *args)
+ self.hint = kw.get('hint')
+
+class ConfigError(Abort):
+ 'Exception raised when parsing config files'
+
+class OutOfBandError(Exception):
+ 'Exception raised when a remote repo reports failure'
+
+class ParseError(Exception):
+ 'Exception raised when parsing config files (msg[, pos])'
+
+class RepoError(Exception):
+ def __init__(self, *args, **kw):
+ Exception.__init__(self, *args)
+ self.hint = kw.get('hint')
+
+class RepoLookupError(RepoError):
+ pass
+
+class CapabilityError(RepoError):
+ pass
+
+class RequirementError(RepoError):
+ """Exception raised if .hg/requires has an unknown entry."""
+ pass
+
+class LockError(IOError):
+ def __init__(self, errno, strerror, filename, desc):
+ IOError.__init__(self, errno, strerror, filename)
+ self.desc = desc
+
+class LockHeld(LockError):
+ def __init__(self, errno, filename, desc, locker):
+ LockError.__init__(self, errno, 'Lock held', filename, desc)
+ self.locker = locker
+
+class LockUnavailable(LockError):
+ pass
+
+class ResponseError(Exception):
+ """Raised to print an error with part of output and exit."""
+
+class UnknownCommand(Exception):
+ """Exception raised if command is not in the command table."""
+
+class AmbiguousCommand(Exception):
+ """Exception raised if command shortcut matches more than one command."""
+
+# derived from KeyboardInterrupt to simplify some breakout code
+class SignalInterrupt(KeyboardInterrupt):
+ """Exception raised on SIGTERM and SIGHUP."""
+
+class SignatureError(Exception):
+ pass
diff --git a/mercurial/exewrapper.c b/mercurial/exewrapper.c
new file mode 100644
index 0000000..882e7b8
--- /dev/null
+++ b/mercurial/exewrapper.c
@@ -0,0 +1,101 @@
+/*
+ exewrapper.c - wrapper for calling a python script on Windows
+
+ Copyright 2012 Adrian Buehlmann <adrian@cadifra.com> and others
+
+ This software may be used and distributed according to the terms of the
+ GNU General Public License version 2 or any later version.
+*/
+
+#include <Python.h>
+#include <windows.h>
+
+
+#ifdef __GNUC__
+int strcat_s(char *d, size_t n, const char *s)
+{
+ return !strncat(d, s, n);
+}
+#endif
+
+
+static char pyscript[MAX_PATH + 10];
+
+int main(int argc, char *argv[])
+{
+ char *dot;
+ int ret;
+ int i;
+ int n;
+ char **pyargv;
+ WIN32_FIND_DATA fdata;
+ HANDLE hfind;
+ const char *err;
+
+ if (GetModuleFileName(NULL, pyscript, sizeof(pyscript)) == 0)
+ {
+ err = "GetModuleFileName failed";
+ goto bail;
+ }
+
+ dot = strrchr(pyscript, '.');
+ if (dot == NULL) {
+ err = "malformed module filename";
+ goto bail;
+ }
+ *dot = 0; /* cut trailing ".exe" */
+
+ hfind = FindFirstFile(pyscript, &fdata);
+ if (hfind != INVALID_HANDLE_VALUE) {
+ /* pyscript exists, close handle */
+ FindClose(hfind);
+ } else {
+ /* file pyscript isn't there, take <pyscript>exe.py */
+ strcat_s(pyscript, sizeof(pyscript), "exe.py");
+ }
+
+ /*
+ Only add the pyscript to the args, if it's not already there. It may
+ already be there, if the script spawned a child process of itself, in
+ the same way as it got called, that is, with the pyscript already in
+ place. So we optionally accept the pyscript as the first argument
+ (argv[1]), letting our exe taking the role of the python interpreter.
+ */
+ if (argc >= 2 && strcmp(argv[1], pyscript) == 0) {
+ /*
+ pyscript is already in the args, so there is no need to copy
+ the args and we can directly call the python interpreter with
+ the original args.
+ */
+ return Py_Main(argc, argv);
+ }
+
+ /*
+ Start assembling the args for the Python interpreter call. We put the
+ name of our exe (argv[0]) in the position where the python.exe
+ canonically is, and insert the pyscript next.
+ */
+ pyargv = malloc((argc + 5) * sizeof(char*));
+ if (pyargv == NULL) {
+ err = "not enough memory";
+ goto bail;
+ }
+ n = 0;
+ pyargv[n++] = argv[0];
+ pyargv[n++] = pyscript;
+
+ /* copy remaining args from the command line */
+ for (i = 1; i < argc; i++)
+ pyargv[n++] = argv[i];
+ /* argv[argc] is guaranteed to be NULL, so we forward that guarantee */
+ pyargv[n] = NULL;
+
+ ret = Py_Main(n, pyargv); /* The Python interpreter call */
+
+ free(pyargv);
+ return ret;
+
+bail:
+ fprintf(stderr, "abort: %s\n", err);
+ return 255;
+}
diff --git a/mercurial/extensions.py b/mercurial/extensions.py
new file mode 100644
index 0000000..3f74d4e
--- /dev/null
+++ b/mercurial/extensions.py
@@ -0,0 +1,361 @@
+# extensions.py - extension handling for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import imp, os
+import util, cmdutil, error
+from i18n import _, gettext
+
+_extensions = {}
+_order = []
+_ignore = ['hbisect', 'bookmarks', 'parentrevspec']
+
+def extensions():
+ for name in _order:
+ module = _extensions[name]
+ if module:
+ yield name, module
+
+def find(name):
+ '''return module with given extension name'''
+ mod = None
+ try:
+ mod = _extensions[name]
+ except KeyError:
+ for k, v in _extensions.iteritems():
+ if k.endswith('.' + name) or k.endswith('/' + name):
+ mod = v
+ break
+ if not mod:
+ raise KeyError(name)
+ return mod
+
+def loadpath(path, module_name):
+ module_name = module_name.replace('.', '_')
+ path = util.expandpath(path)
+ if os.path.isdir(path):
+ # module/__init__.py style
+ d, f = os.path.split(path.rstrip('/'))
+ fd, fpath, desc = imp.find_module(f, [d])
+ return imp.load_module(module_name, fd, fpath, desc)
+ else:
+ try:
+ return imp.load_source(module_name, path)
+ except IOError, exc:
+ if not exc.filename:
+ exc.filename = path # python does not fill this
+ raise
+
+def load(ui, name, path):
+ # unused ui argument kept for backwards compatibility
+ if name.startswith('hgext.') or name.startswith('hgext/'):
+ shortname = name[6:]
+ else:
+ shortname = name
+ if shortname in _ignore:
+ return None
+ if shortname in _extensions:
+ return _extensions[shortname]
+ _extensions[shortname] = None
+ if path:
+ # the module will be loaded in sys.modules
+ # choose an unique name so that it doesn't
+ # conflicts with other modules
+ mod = loadpath(path, 'hgext.%s' % name)
+ else:
+ def importh(name):
+ mod = __import__(name)
+ components = name.split('.')
+ for comp in components[1:]:
+ mod = getattr(mod, comp)
+ return mod
+ try:
+ mod = importh("hgext.%s" % name)
+ except ImportError, err:
+ ui.debug('could not import hgext.%s (%s): trying %s\n'
+ % (name, err, name))
+ mod = importh(name)
+ _extensions[shortname] = mod
+ _order.append(shortname)
+ return mod
+
+def loadall(ui):
+ result = ui.configitems("extensions")
+ newindex = len(_order)
+ for (name, path) in result:
+ if path:
+ if path[0] == '!':
+ continue
+ try:
+ load(ui, name, path)
+ except KeyboardInterrupt:
+ raise
+ except Exception, inst:
+ if path:
+ ui.warn(_("*** failed to import extension %s from %s: %s\n")
+ % (name, path, inst))
+ else:
+ ui.warn(_("*** failed to import extension %s: %s\n")
+ % (name, inst))
+ if ui.traceback():
+ return 1
+
+ for name in _order[newindex:]:
+ uisetup = getattr(_extensions[name], 'uisetup', None)
+ if uisetup:
+ uisetup(ui)
+
+ for name in _order[newindex:]:
+ extsetup = getattr(_extensions[name], 'extsetup', None)
+ if extsetup:
+ try:
+ extsetup(ui)
+ except TypeError:
+ if extsetup.func_code.co_argcount != 0:
+ raise
+ extsetup() # old extsetup with no ui argument
+
+def wrapcommand(table, command, wrapper):
+ '''Wrap the command named `command' in table
+
+ Replace command in the command table with wrapper. The wrapped command will
+ be inserted into the command table specified by the table argument.
+
+ The wrapper will be called like
+
+ wrapper(orig, *args, **kwargs)
+
+ where orig is the original (wrapped) function, and *args, **kwargs
+ are the arguments passed to it.
+ '''
+ assert util.safehasattr(wrapper, '__call__')
+ aliases, entry = cmdutil.findcmd(command, table)
+ for alias, e in table.iteritems():
+ if e is entry:
+ key = alias
+ break
+
+ origfn = entry[0]
+ def wrap(*args, **kwargs):
+ return util.checksignature(wrapper)(
+ util.checksignature(origfn), *args, **kwargs)
+
+ wrap.__doc__ = getattr(origfn, '__doc__')
+ wrap.__module__ = getattr(origfn, '__module__')
+
+ newentry = list(entry)
+ newentry[0] = wrap
+ table[key] = tuple(newentry)
+ return entry
+
+def wrapfunction(container, funcname, wrapper):
+ '''Wrap the function named funcname in container
+
+ Replace the funcname member in the given container with the specified
+ wrapper. The container is typically a module, class, or instance.
+
+ The wrapper will be called like
+
+ wrapper(orig, *args, **kwargs)
+
+ where orig is the original (wrapped) function, and *args, **kwargs
+ are the arguments passed to it.
+
+ Wrapping methods of the repository object is not recommended since
+ it conflicts with extensions that extend the repository by
+ subclassing. All extensions that need to extend methods of
+ localrepository should use this subclassing trick: namely,
+ reposetup() should look like
+
+ def reposetup(ui, repo):
+ class myrepo(repo.__class__):
+ def whatever(self, *args, **kwargs):
+ [...extension stuff...]
+ super(myrepo, self).whatever(*args, **kwargs)
+ [...extension stuff...]
+
+ repo.__class__ = myrepo
+
+ In general, combining wrapfunction() with subclassing does not
+ work. Since you cannot control what other extensions are loaded by
+ your end users, you should play nicely with others by using the
+ subclass trick.
+ '''
+ assert util.safehasattr(wrapper, '__call__')
+ def wrap(*args, **kwargs):
+ return wrapper(origfn, *args, **kwargs)
+
+ origfn = getattr(container, funcname)
+ assert util.safehasattr(origfn, '__call__')
+ setattr(container, funcname, wrap)
+ return origfn
+
+def _disabledpaths(strip_init=False):
+ '''find paths of disabled extensions. returns a dict of {name: path}
+ removes /__init__.py from packages if strip_init is True'''
+ import hgext
+ extpath = os.path.dirname(os.path.abspath(hgext.__file__))
+ try: # might not be a filesystem path
+ files = os.listdir(extpath)
+ except OSError:
+ return {}
+
+ exts = {}
+ for e in files:
+ if e.endswith('.py'):
+ name = e.rsplit('.', 1)[0]
+ path = os.path.join(extpath, e)
+ else:
+ name = e
+ path = os.path.join(extpath, e, '__init__.py')
+ if not os.path.exists(path):
+ continue
+ if strip_init:
+ path = os.path.dirname(path)
+ if name in exts or name in _order or name == '__init__':
+ continue
+ exts[name] = path
+ return exts
+
+def _moduledoc(file):
+ '''return the top-level python documentation for the given file
+
+ Loosely inspired by pydoc.source_synopsis(), but rewritten to
+ handle triple quotes and to return the whole text instead of just
+ the synopsis'''
+ result = []
+
+ line = file.readline()
+ while line[:1] == '#' or not line.strip():
+ line = file.readline()
+ if not line:
+ break
+
+ start = line[:3]
+ if start == '"""' or start == "'''":
+ line = line[3:]
+ while line:
+ if line.rstrip().endswith(start):
+ line = line.split(start)[0]
+ if line:
+ result.append(line)
+ break
+ elif not line:
+ return None # unmatched delimiter
+ result.append(line)
+ line = file.readline()
+ else:
+ return None
+
+ return ''.join(result)
+
+def _disabledhelp(path):
+ '''retrieve help synopsis of a disabled extension (without importing)'''
+ try:
+ file = open(path)
+ except IOError:
+ return
+ else:
+ doc = _moduledoc(file)
+ file.close()
+
+ if doc: # extracting localized synopsis
+ return gettext(doc).splitlines()[0]
+ else:
+ return _('(no help text available)')
+
+def disabled():
+ '''find disabled extensions from hgext. returns a dict of {name: desc}'''
+ try:
+ from hgext import __index__
+ return dict((name, gettext(desc))
+ for name, desc in __index__.docs.iteritems()
+ if name not in _order)
+ except ImportError:
+ pass
+
+ paths = _disabledpaths()
+ if not paths:
+ return {}
+
+ exts = {}
+ for name, path in paths.iteritems():
+ doc = _disabledhelp(path)
+ if doc:
+ exts[name] = doc
+
+ return exts
+
+def disabledext(name):
+ '''find a specific disabled extension from hgext. returns desc'''
+ try:
+ from hgext import __index__
+ if name in _order: # enabled
+ return
+ else:
+ return gettext(__index__.docs.get(name))
+ except ImportError:
+ pass
+
+ paths = _disabledpaths()
+ if name in paths:
+ return _disabledhelp(paths[name])
+
+def disabledcmd(ui, cmd, strict=False):
+ '''import disabled extensions until cmd is found.
+ returns (cmdname, extname, module)'''
+
+ paths = _disabledpaths(strip_init=True)
+ if not paths:
+ raise error.UnknownCommand(cmd)
+
+ def findcmd(cmd, name, path):
+ try:
+ mod = loadpath(path, 'hgext.%s' % name)
+ except Exception:
+ return
+ try:
+ aliases, entry = cmdutil.findcmd(cmd,
+ getattr(mod, 'cmdtable', {}), strict)
+ except (error.AmbiguousCommand, error.UnknownCommand):
+ return
+ except Exception:
+ ui.warn(_('warning: error finding commands in %s\n') % path)
+ ui.traceback()
+ return
+ for c in aliases:
+ if c.startswith(cmd):
+ cmd = c
+ break
+ else:
+ cmd = aliases[0]
+ return (cmd, name, mod)
+
+ ext = None
+ # first, search for an extension with the same name as the command
+ path = paths.pop(cmd, None)
+ if path:
+ ext = findcmd(cmd, cmd, path)
+ if not ext:
+ # otherwise, interrogate each extension until there's a match
+ for name, path in paths.iteritems():
+ ext = findcmd(cmd, name, path)
+ if ext:
+ break
+ if ext and 'DEPRECATED' not in ext.__doc__:
+ return ext
+
+ raise error.UnknownCommand(cmd)
+
+def enabled():
+ '''return a dict of {name: desc} of extensions'''
+ exts = {}
+ for ename, ext in extensions():
+ doc = (gettext(ext.__doc__) or _('(no help text available)'))
+ ename = ename.split('.')[-1]
+ exts[ename] = doc.splitlines()[0].strip()
+
+ return exts
diff --git a/mercurial/fancyopts.py b/mercurial/fancyopts.py
new file mode 100644
index 0000000..ae18083
--- /dev/null
+++ b/mercurial/fancyopts.py
@@ -0,0 +1,117 @@
+# fancyopts.py - better command line parsing
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import getopt
+
+def gnugetopt(args, options, longoptions):
+ """Parse options mostly like getopt.gnu_getopt.
+
+ This is different from getopt.gnu_getopt in that an argument of - will
+ become an argument of - instead of vanishing completely.
+ """
+ extraargs = []
+ if '--' in args:
+ stopindex = args.index('--')
+ extraargs = args[stopindex + 1:]
+ args = args[:stopindex]
+ opts, parseargs = getopt.getopt(args, options, longoptions)
+ args = []
+ while parseargs:
+ arg = parseargs.pop(0)
+ if arg and arg[0] == '-' and len(arg) > 1:
+ parseargs.insert(0, arg)
+ topts, newparseargs = getopt.getopt(parseargs, options, longoptions)
+ opts = opts + topts
+ parseargs = newparseargs
+ else:
+ args.append(arg)
+ args.extend(extraargs)
+ return opts, args
+
+
+def fancyopts(args, options, state, gnu=False):
+ """
+ read args, parse options, and store options in state
+
+ each option is a tuple of:
+
+ short option or ''
+ long option
+ default value
+ description
+ option value label(optional)
+
+ option types include:
+
+ boolean or none - option sets variable in state to true
+ string - parameter string is stored in state
+ list - parameter string is added to a list
+ integer - parameter strings is stored as int
+ function - call function with parameter
+
+ non-option args are returned
+ """
+ namelist = []
+ shortlist = ''
+ argmap = {}
+ defmap = {}
+
+ for option in options:
+ if len(option) == 5:
+ short, name, default, comment, dummy = option
+ else:
+ short, name, default, comment = option
+ # convert opts to getopt format
+ oname = name
+ name = name.replace('-', '_')
+
+ argmap['-' + short] = argmap['--' + oname] = name
+ defmap[name] = default
+
+ # copy defaults to state
+ if isinstance(default, list):
+ state[name] = default[:]
+ elif getattr(default, '__call__', False):
+ state[name] = None
+ else:
+ state[name] = default
+
+ # does it take a parameter?
+ if not (default is None or default is True or default is False):
+ if short:
+ short += ':'
+ if oname:
+ oname += '='
+ if short:
+ shortlist += short
+ if name:
+ namelist.append(oname)
+
+ # parse arguments
+ if gnu:
+ parse = gnugetopt
+ else:
+ parse = getopt.getopt
+ opts, args = parse(args, shortlist, namelist)
+
+ # transfer result to state
+ for opt, val in opts:
+ name = argmap[opt]
+ t = type(defmap[name])
+ if t is type(fancyopts):
+ state[name] = defmap[name](val)
+ elif t is type(1):
+ state[name] = int(val)
+ elif t is type(''):
+ state[name] = val
+ elif t is type([]):
+ state[name].append(val)
+ elif t is type(None) or t is type(False):
+ state[name] = True
+
+ # return unparsed args
+ return args
diff --git a/mercurial/filelog.py b/mercurial/filelog.py
new file mode 100644
index 0000000..33f3d0c
--- /dev/null
+++ b/mercurial/filelog.py
@@ -0,0 +1,92 @@
+# filelog.py - file history class for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import revlog
+import re
+
+_mdre = re.compile('\1\n')
+def _parsemeta(text):
+ """return (metadatadict, keylist, metadatasize)"""
+ # text can be buffer, so we can't use .startswith or .index
+ if text[:2] != '\1\n':
+ return None, None, None
+ s = _mdre.search(text, 2).start()
+ mtext = text[2:s]
+ meta = {}
+ keys = []
+ for l in mtext.splitlines():
+ k, v = l.split(": ", 1)
+ meta[k] = v
+ keys.append(k)
+ return meta, keys, (s + 2)
+
+def _packmeta(meta, keys=None):
+ if not keys:
+ keys = sorted(meta.iterkeys())
+ return "".join("%s: %s\n" % (k, meta[k]) for k in keys)
+
+class filelog(revlog.revlog):
+ def __init__(self, opener, path):
+ revlog.revlog.__init__(self, opener,
+ "/".join(("data", path + ".i")))
+
+ def read(self, node):
+ t = self.revision(node)
+ if not t.startswith('\1\n'):
+ return t
+ s = t.index('\1\n', 2)
+ return t[s + 2:]
+
+ def add(self, text, meta, transaction, link, p1=None, p2=None):
+ if meta or text.startswith('\1\n'):
+ text = "\1\n%s\1\n%s" % (_packmeta(meta), text)
+ return self.addrevision(text, transaction, link, p1, p2)
+
+ def renamed(self, node):
+ if self.parents(node)[0] != revlog.nullid:
+ return False
+ t = self.revision(node)
+ m = _parsemeta(t)[0]
+ if m and "copy" in m:
+ return (m["copy"], revlog.bin(m["copyrev"]))
+ return False
+
+ def size(self, rev):
+ """return the size of a given revision"""
+
+ # for revisions with renames, we have to go the slow way
+ node = self.node(rev)
+ if self.renamed(node):
+ return len(self.read(node))
+
+ # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
+ return revlog.revlog.size(self, rev)
+
+ def cmp(self, node, text):
+ """compare text with a given file revision
+
+ returns True if text is different than what is stored.
+ """
+
+ t = text
+ if text.startswith('\1\n'):
+ t = '\1\n\1\n' + text
+
+ samehashes = not revlog.revlog.cmp(self, node, t)
+ if samehashes:
+ return False
+
+ # renaming a file produces a different hash, even if the data
+ # remains unchanged. Check if it's the case (slow):
+ if self.renamed(node):
+ t2 = self.read(node)
+ return t2 != text
+
+ return True
+
+ def _file(self, f):
+ return filelog(self.opener, f)
diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
new file mode 100644
index 0000000..d51f076
--- /dev/null
+++ b/mercurial/filemerge.py
@@ -0,0 +1,369 @@
+# filemerge.py - file-level merge handling for Mercurial
+#
+# Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import short
+from i18n import _
+import util, simplemerge, match, error
+import os, tempfile, re, filecmp
+
+def _toolstr(ui, tool, part, default=""):
+ return ui.config("merge-tools", tool + "." + part, default)
+
+def _toolbool(ui, tool, part, default=False):
+ return ui.configbool("merge-tools", tool + "." + part, default)
+
+def _toollist(ui, tool, part, default=[]):
+ return ui.configlist("merge-tools", tool + "." + part, default)
+
+internals = {}
+
+def internaltool(name, trymerge, onfailure=None):
+ '''return a decorator for populating internal merge tool table'''
+ def decorator(func):
+ fullname = 'internal:' + name
+ func.__doc__ = "``%s``\n" % fullname + func.__doc__.strip()
+ internals[fullname] = func
+ func.trymerge = trymerge
+ func.onfailure = onfailure
+ return func
+ return decorator
+
+def _findtool(ui, tool):
+ if tool in internals:
+ return tool
+ for kn in ("regkey", "regkeyalt"):
+ k = _toolstr(ui, tool, kn)
+ if not k:
+ continue
+ p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
+ if p:
+ p = util.findexe(p + _toolstr(ui, tool, "regappend"))
+ if p:
+ return p
+ exe = _toolstr(ui, tool, "executable", tool)
+ return util.findexe(util.expandpath(exe))
+
+def _picktool(repo, ui, path, binary, symlink):
+ def check(tool, pat, symlink, binary):
+ tmsg = tool
+ if pat:
+ tmsg += " specified for " + pat
+ if not _findtool(ui, tool):
+ if pat: # explicitly requested tool deserves a warning
+ ui.warn(_("couldn't find merge tool %s\n") % tmsg)
+ else: # configured but non-existing tools are more silent
+ ui.note(_("couldn't find merge tool %s\n") % tmsg)
+ elif symlink and not _toolbool(ui, tool, "symlink"):
+ ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
+ elif binary and not _toolbool(ui, tool, "binary"):
+ ui.warn(_("tool %s can't handle binary\n") % tmsg)
+ elif not util.gui() and _toolbool(ui, tool, "gui"):
+ ui.warn(_("tool %s requires a GUI\n") % tmsg)
+ else:
+ return True
+ return False
+
+ # forcemerge comes from command line arguments, highest priority
+ force = ui.config('ui', 'forcemerge')
+ if force:
+ toolpath = _findtool(ui, force)
+ if toolpath:
+ return (force, '"' + toolpath + '"')
+ else:
+ # mimic HGMERGE if given tool not found
+ return (force, force)
+
+ # HGMERGE takes next precedence
+ hgmerge = os.environ.get("HGMERGE")
+ if hgmerge:
+ return (hgmerge, hgmerge)
+
+ # then patterns
+ for pat, tool in ui.configitems("merge-patterns"):
+ mf = match.match(repo.root, '', [pat])
+ if mf(path) and check(tool, pat, symlink, False):
+ toolpath = _findtool(ui, tool)
+ return (tool, '"' + toolpath + '"')
+
+ # then merge tools
+ tools = {}
+ for k, v in ui.configitems("merge-tools"):
+ t = k.split('.')[0]
+ if t not in tools:
+ tools[t] = int(_toolstr(ui, t, "priority", "0"))
+ names = tools.keys()
+ tools = sorted([(-p, t) for t, p in tools.items()])
+ uimerge = ui.config("ui", "merge")
+ if uimerge:
+ if uimerge not in names:
+ return (uimerge, uimerge)
+ tools.insert(0, (None, uimerge)) # highest priority
+ tools.append((None, "hgmerge")) # the old default, if found
+ for p, t in tools:
+ if check(t, None, symlink, binary):
+ toolpath = _findtool(ui, t)
+ return (t, '"' + toolpath + '"')
+
+ # internal merge or prompt as last resort
+ if symlink or binary:
+ return "internal:prompt", None
+ return "internal:merge", None
+
+def _eoltype(data):
+ "Guess the EOL type of a file"
+ if '\0' in data: # binary
+ return None
+ if '\r\n' in data: # Windows
+ return '\r\n'
+ if '\r' in data: # Old Mac
+ return '\r'
+ if '\n' in data: # UNIX
+ return '\n'
+ return None # unknown
+
+def _matcheol(file, origfile):
+ "Convert EOL markers in a file to match origfile"
+ tostyle = _eoltype(util.readfile(origfile))
+ if tostyle:
+ data = util.readfile(file)
+ style = _eoltype(data)
+ if style:
+ newdata = data.replace(style, tostyle)
+ if newdata != data:
+ util.writefile(file, newdata)
+
+@internaltool('prompt', False)
+def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
+ """Asks the user which of the local or the other version to keep as
+ the merged version."""
+ ui = repo.ui
+ fd = fcd.path()
+
+ if ui.promptchoice(_(" no tool found to merge %s\n"
+ "keep (l)ocal or take (o)ther?") % fd,
+ (_("&Local"), _("&Other")), 0):
+ return _iother(repo, mynode, orig, fcd, fco, fca, toolconf)
+ else:
+ return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
+
+@internaltool('local', False)
+def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
+ """Uses the local version of files as the merged version."""
+ return 0
+
+@internaltool('other', False)
+def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
+ """Uses the other version of files as the merged version."""
+ repo.wwrite(fcd.path(), fco.data(), fco.flags())
+ return 0
+
+@internaltool('fail', False)
+def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
+ """
+ Rather than attempting to merge files that were modified on both
+ branches, it marks them as unresolved. The resolve command must be
+ used to resolve these conflicts."""
+ return 1
+
+def _premerge(repo, toolconf, files):
+ tool, toolpath, binary, symlink = toolconf
+ a, b, c, back = files
+
+ ui = repo.ui
+
+ # do we attempt to simplemerge first?
+ try:
+ premerge = _toolbool(ui, tool, "premerge", not (binary or symlink))
+ except error.ConfigError:
+ premerge = _toolstr(ui, tool, "premerge").lower()
+ valid = 'keep'.split()
+ if premerge not in valid:
+ _valid = ', '.join(["'" + v + "'" for v in valid])
+ raise error.ConfigError(_("%s.premerge not valid "
+ "('%s' is neither boolean nor %s)") %
+ (tool, premerge, _valid))
+
+ if premerge:
+ r = simplemerge.simplemerge(ui, a, b, c, quiet=True)
+ if not r:
+ ui.debug(" premerge successful\n")
+ return 0
+ if premerge != 'keep':
+ util.copyfile(back, a) # restore from backup and try again
+ return 1 # continue merging
+
+@internaltool('merge', True,
+ _("merging %s incomplete! "
+ "(edit conflicts, then use 'hg resolve --mark')\n"))
+def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files):
+ """
+ Uses the internal non-interactive simple merge algorithm for merging
+ files. It will fail if there are any conflicts and leave markers in
+ the partially merged file."""
+ r = _premerge(repo, toolconf, files)
+ if r:
+ a, b, c, back = files
+
+ ui = repo.ui
+
+ r = simplemerge.simplemerge(ui, a, b, c, label=['local', 'other'])
+ return True, r
+ return False, 0
+
+@internaltool('dump', True)
+def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files):
+ """
+ Creates three versions of the files to merge, containing the
+ contents of local, other and base. These files can then be used to
+ perform a merge manually. If the file to be merged is named
+ ``a.txt``, these files will accordingly be named ``a.txt.local``,
+ ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
+ same directory as ``a.txt``."""
+ r = _premerge(repo, toolconf, files)
+ if r:
+ a, b, c, back = files
+
+ fd = fcd.path()
+
+ util.copyfile(a, a + ".local")
+ repo.wwrite(fd + ".other", fco.data(), fco.flags())
+ repo.wwrite(fd + ".base", fca.data(), fca.flags())
+ return False, r
+
+def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files):
+ r = _premerge(repo, toolconf, files)
+ if r:
+ tool, toolpath, binary, symlink = toolconf
+ a, b, c, back = files
+ out = ""
+ env = dict(HG_FILE=fcd.path(),
+ HG_MY_NODE=short(mynode),
+ HG_OTHER_NODE=str(fco.changectx()),
+ HG_BASE_NODE=str(fca.changectx()),
+ HG_MY_ISLINK='l' in fcd.flags(),
+ HG_OTHER_ISLINK='l' in fco.flags(),
+ HG_BASE_ISLINK='l' in fca.flags())
+
+ ui = repo.ui
+
+ args = _toolstr(ui, tool, "args", '$local $base $other')
+ if "$output" in args:
+ out, a = a, back # read input from backup, write to original
+ replace = dict(local=a, base=b, other=c, output=out)
+ args = util.interpolate(r'\$', replace, args,
+ lambda s: '"%s"' % util.localpath(s))
+ r = util.system(toolpath + ' ' + args, cwd=repo.root, environ=env,
+ out=ui.fout)
+ return True, r
+ return False, 0
+
+def filemerge(repo, mynode, orig, fcd, fco, fca):
+ """perform a 3-way merge in the working directory
+
+ mynode = parent node before merge
+ orig = original local filename before merge
+ fco = other file context
+ fca = ancestor file context
+ fcd = local file context for current/destination file
+ """
+
+ def temp(prefix, ctx):
+ pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
+ (fd, name) = tempfile.mkstemp(prefix=pre)
+ data = repo.wwritedata(ctx.path(), ctx.data())
+ f = os.fdopen(fd, "wb")
+ f.write(data)
+ f.close()
+ return name
+
+ if not fco.cmp(fcd): # files identical?
+ return None
+
+ ui = repo.ui
+ fd = fcd.path()
+ binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
+ symlink = 'l' in fcd.flags() + fco.flags()
+ tool, toolpath = _picktool(repo, ui, fd, binary, symlink)
+ ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" %
+ (tool, fd, binary, symlink))
+
+ if tool in internals:
+ func = internals[tool]
+ trymerge = func.trymerge
+ onfailure = func.onfailure
+ else:
+ func = _xmerge
+ trymerge = True
+ onfailure = _("merging %s failed!\n")
+
+ toolconf = tool, toolpath, binary, symlink
+
+ if not trymerge:
+ return func(repo, mynode, orig, fcd, fco, fca, toolconf)
+
+ a = repo.wjoin(fd)
+ b = temp("base", fca)
+ c = temp("other", fco)
+ back = a + ".orig"
+ util.copyfile(a, back)
+
+ if orig != fco.path():
+ ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
+ else:
+ ui.status(_("merging %s\n") % fd)
+
+ ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
+
+ needcheck, r = func(repo, mynode, orig, fcd, fco, fca, toolconf,
+ (a, b, c, back))
+ if not needcheck:
+ if r:
+ if onfailure:
+ ui.warn(onfailure % fd)
+ else:
+ os.unlink(back)
+
+ os.unlink(b)
+ os.unlink(c)
+ return r
+
+ if not r and (_toolbool(ui, tool, "checkconflicts") or
+ 'conflicts' in _toollist(ui, tool, "check")):
+ if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
+ re.MULTILINE):
+ r = 1
+
+ checked = False
+ if 'prompt' in _toollist(ui, tool, "check"):
+ checked = True
+ if ui.promptchoice(_("was merge of '%s' successful (yn)?") % fd,
+ (_("&Yes"), _("&No")), 1):
+ r = 1
+
+ if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
+ 'changed' in _toollist(ui, tool, "check")):
+ if filecmp.cmp(a, back):
+ if ui.promptchoice(_(" output file %s appears unchanged\n"
+ "was merge successful (yn)?") % fd,
+ (_("&Yes"), _("&No")), 1):
+ r = 1
+
+ if _toolbool(ui, tool, "fixeol"):
+ _matcheol(a, back)
+
+ if r:
+ if onfailure:
+ ui.warn(onfailure % fd)
+ else:
+ os.unlink(back)
+
+ os.unlink(b)
+ os.unlink(c)
+ return r
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = internals.values()
diff --git a/mercurial/fileset.py b/mercurial/fileset.py
new file mode 100644
index 0000000..5c1f7eb
--- /dev/null
+++ b/mercurial/fileset.py
@@ -0,0 +1,465 @@
+# fileset.py - file set queries for mercurial
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import parser, error, util, merge, re
+from i18n import _
+
+elements = {
+ "(": (20, ("group", 1, ")"), ("func", 1, ")")),
+ "-": (5, ("negate", 19), ("minus", 5)),
+ "not": (10, ("not", 10)),
+ "!": (10, ("not", 10)),
+ "and": (5, None, ("and", 5)),
+ "&": (5, None, ("and", 5)),
+ "or": (4, None, ("or", 4)),
+ "|": (4, None, ("or", 4)),
+ "+": (4, None, ("or", 4)),
+ ",": (2, None, ("list", 2)),
+ ")": (0, None, None),
+ "symbol": (0, ("symbol",), None),
+ "string": (0, ("string",), None),
+ "end": (0, None, None),
+}
+
+keywords = set(['and', 'or', 'not'])
+
+globchars = ".*{}[]?/\\"
+
+def tokenize(program):
+ pos, l = 0, len(program)
+ while pos < l:
+ c = program[pos]
+ if c.isspace(): # skip inter-token whitespace
+ pass
+ elif c in "(),-|&+!": # handle simple operators
+ yield (c, None, pos)
+ elif (c in '"\'' or c == 'r' and
+ program[pos:pos + 2] in ("r'", 'r"')): # handle quoted strings
+ if c == 'r':
+ pos += 1
+ c = program[pos]
+ decode = lambda x: x
+ else:
+ decode = lambda x: x.decode('string-escape')
+ pos += 1
+ s = pos
+ while pos < l: # find closing quote
+ d = program[pos]
+ if d == '\\': # skip over escaped characters
+ pos += 2
+ continue
+ if d == c:
+ yield ('string', decode(program[s:pos]), s)
+ break
+ pos += 1
+ else:
+ raise error.ParseError(_("unterminated string"), s)
+ elif c.isalnum() or c in globchars or ord(c) > 127:
+ # gather up a symbol/keyword
+ s = pos
+ pos += 1
+ while pos < l: # find end of symbol
+ d = program[pos]
+ if not (d.isalnum() or d in globchars or ord(d) > 127):
+ break
+ pos += 1
+ sym = program[s:pos]
+ if sym in keywords: # operator keywords
+ yield (sym, None, s)
+ else:
+ yield ('symbol', sym, s)
+ pos -= 1
+ else:
+ raise error.ParseError(_("syntax error"), pos)
+ pos += 1
+ yield ('end', None, pos)
+
+parse = parser.parser(tokenize, elements).parse
+
+def getstring(x, err):
+ if x and (x[0] == 'string' or x[0] == 'symbol'):
+ return x[1]
+ raise error.ParseError(err)
+
+def getset(mctx, x):
+ if not x:
+ raise error.ParseError(_("missing argument"))
+ return methods[x[0]](mctx, *x[1:])
+
+def stringset(mctx, x):
+ m = mctx.matcher([x])
+ return [f for f in mctx.subset if m(f)]
+
+def andset(mctx, x, y):
+ return getset(mctx.narrow(getset(mctx, x)), y)
+
+def orset(mctx, x, y):
+ # needs optimizing
+ xl = getset(mctx, x)
+ yl = getset(mctx, y)
+ return xl + [f for f in yl if f not in xl]
+
+def notset(mctx, x):
+ s = set(getset(mctx, x))
+ return [r for r in mctx.subset if r not in s]
+
+def listset(mctx, a, b):
+ raise error.ParseError(_("can't use a list in this context"))
+
+def modified(mctx, x):
+ """``modified()``
+ File that is modified according to status.
+ """
+ # i18n: "modified" is a keyword
+ getargs(x, 0, 0, _("modified takes no arguments"))
+ s = mctx.status()[0]
+ return [f for f in mctx.subset if f in s]
+
+def added(mctx, x):
+ """``added()``
+ File that is added according to status.
+ """
+ # i18n: "added" is a keyword
+ getargs(x, 0, 0, _("added takes no arguments"))
+ s = mctx.status()[1]
+ return [f for f in mctx.subset if f in s]
+
+def removed(mctx, x):
+ """``removed()``
+ File that is removed according to status.
+ """
+ # i18n: "removed" is a keyword
+ getargs(x, 0, 0, _("removed takes no arguments"))
+ s = mctx.status()[2]
+ return [f for f in mctx.subset if f in s]
+
+def deleted(mctx, x):
+ """``deleted()``
+ File that is deleted according to status.
+ """
+ # i18n: "deleted" is a keyword
+ getargs(x, 0, 0, _("deleted takes no arguments"))
+ s = mctx.status()[3]
+ return [f for f in mctx.subset if f in s]
+
+def unknown(mctx, x):
+ """``unknown()``
+ File that is unknown according to status. These files will only be
+ considered if this predicate is used.
+ """
+ # i18n: "unknown" is a keyword
+ getargs(x, 0, 0, _("unknown takes no arguments"))
+ s = mctx.status()[4]
+ return [f for f in mctx.subset if f in s]
+
+def ignored(mctx, x):
+ """``ignored()``
+ File that is ignored according to status. These files will only be
+ considered if this predicate is used.
+ """
+ # i18n: "ignored" is a keyword
+ getargs(x, 0, 0, _("ignored takes no arguments"))
+ s = mctx.status()[5]
+ return [f for f in mctx.subset if f in s]
+
+def clean(mctx, x):
+ """``clean()``
+ File that is clean according to status.
+ """
+ # i18n: "clean" is a keyword
+ getargs(x, 0, 0, _("clean takes no arguments"))
+ s = mctx.status()[6]
+ return [f for f in mctx.subset if f in s]
+
+def func(mctx, a, b):
+ if a[0] == 'symbol' and a[1] in symbols:
+ return symbols[a[1]](mctx, b)
+ raise error.ParseError(_("not a function: %s") % a[1])
+
+def getlist(x):
+ if not x:
+ return []
+ if x[0] == 'list':
+ return getlist(x[1]) + [x[2]]
+ return [x]
+
+def getargs(x, min, max, err):
+ l = getlist(x)
+ if len(l) < min or len(l) > max:
+ raise error.ParseError(err)
+ return l
+
+def binary(mctx, x):
+ """``binary()``
+ File that appears to be binary (contains NUL bytes).
+ """
+ # i18n: "binary" is a keyword
+ getargs(x, 0, 0, _("binary takes no arguments"))
+ return [f for f in mctx.existing() if util.binary(mctx.ctx[f].data())]
+
+def exec_(mctx, x):
+ """``exec()``
+ File that is marked as executable.
+ """
+ # i18n: "exec" is a keyword
+ getargs(x, 0, 0, _("exec takes no arguments"))
+ return [f for f in mctx.existing() if mctx.ctx.flags(f) == 'x']
+
+def symlink(mctx, x):
+ """``symlink()``
+ File that is marked as a symlink.
+ """
+ # i18n: "symlink" is a keyword
+ getargs(x, 0, 0, _("symlink takes no arguments"))
+ return [f for f in mctx.existing() if mctx.ctx.flags(f) == 'l']
+
+def resolved(mctx, x):
+ """``resolved()``
+ File that is marked resolved according to the resolve state.
+ """
+ # i18n: "resolved" is a keyword
+ getargs(x, 0, 0, _("resolved takes no arguments"))
+ if mctx.ctx.rev() is not None:
+ return []
+ ms = merge.mergestate(mctx.ctx._repo)
+ return [f for f in mctx.subset if f in ms and ms[f] == 'r']
+
+def unresolved(mctx, x):
+ """``unresolved()``
+ File that is marked unresolved according to the resolve state.
+ """
+ # i18n: "unresolved" is a keyword
+ getargs(x, 0, 0, _("unresolved takes no arguments"))
+ if mctx.ctx.rev() is not None:
+ return []
+ ms = merge.mergestate(mctx.ctx._repo)
+ return [f for f in mctx.subset if f in ms and ms[f] == 'u']
+
+def hgignore(mctx, x):
+ """``hgignore()``
+ File that matches the active .hgignore pattern.
+ """
+ getargs(x, 0, 0, _("hgignore takes no arguments"))
+ ignore = mctx.ctx._repo.dirstate._ignore
+ return [f for f in mctx.subset if ignore(f)]
+
+def grep(mctx, x):
+ """``grep(regex)``
+ File contains the given regular expression.
+ """
+ pat = getstring(x, _("grep requires a pattern"))
+ r = re.compile(pat)
+ return [f for f in mctx.existing() if r.search(mctx.ctx[f].data())]
+
+_units = dict(k=2**10, K=2**10, kB=2**10, KB=2**10,
+ M=2**20, MB=2**20, G=2**30, GB=2**30)
+
+def _sizetoint(s):
+ try:
+ s = s.strip()
+ for k, v in _units.items():
+ if s.endswith(k):
+ return int(float(s[:-len(k)]) * v)
+ return int(s)
+ except ValueError:
+ raise error.ParseError(_("couldn't parse size: %s") % s)
+
+def _sizetomax(s):
+ try:
+ s = s.strip()
+ for k, v in _units.items():
+ if s.endswith(k):
+ # max(4k) = 5k - 1, max(4.5k) = 4.6k - 1
+ n = s[:-len(k)]
+ inc = 1.0
+ if "." in n:
+ inc /= 10 ** len(n.split(".")[1])
+ return int((float(n) + inc) * v) - 1
+ # no extension, this is a precise value
+ return int(s)
+ except ValueError:
+ raise error.ParseError(_("couldn't parse size: %s") % s)
+
+def size(mctx, x):
+ """``size(expression)``
+ File size matches the given expression. Examples:
+
+ - 1k (files from 1024 to 2047 bytes)
+ - < 20k (files less than 20480 bytes)
+ - >= .5MB (files at least 524288 bytes)
+ - 4k - 1MB (files from 4096 bytes to 1048576 bytes)
+ """
+
+ # i18n: "size" is a keyword
+ expr = getstring(x, _("size requires an expression")).strip()
+ if '-' in expr: # do we have a range?
+ a, b = expr.split('-', 1)
+ a = _sizetoint(a)
+ b = _sizetoint(b)
+ m = lambda x: x >= a and x <= b
+ elif expr.startswith("<="):
+ a = _sizetoint(expr[2:])
+ m = lambda x: x <= a
+ elif expr.startswith("<"):
+ a = _sizetoint(expr[1:])
+ m = lambda x: x < a
+ elif expr.startswith(">="):
+ a = _sizetoint(expr[2:])
+ m = lambda x: x >= a
+ elif expr.startswith(">"):
+ a = _sizetoint(expr[1:])
+ m = lambda x: x > a
+ elif expr[0].isdigit or expr[0] == '.':
+ a = _sizetoint(expr)
+ b = _sizetomax(expr)
+ m = lambda x: x >= a and x <= b
+ else:
+ raise error.ParseError(_("couldn't parse size: %s") % expr)
+
+ return [f for f in mctx.existing() if m(mctx.ctx[f].size())]
+
+def encoding(mctx, x):
+ """``encoding(name)``
+ File can be successfully decoded with the given character
+ encoding. May not be useful for encodings other than ASCII and
+ UTF-8.
+ """
+
+ # i18n: "encoding" is a keyword
+ enc = getstring(x, _("encoding requires an encoding name"))
+
+ s = []
+ for f in mctx.existing():
+ d = mctx.ctx[f].data()
+ try:
+ d.decode(enc)
+ except LookupError:
+ raise util.Abort(_("unknown encoding '%s'") % enc)
+ except UnicodeDecodeError:
+ continue
+ s.append(f)
+
+ return s
+
+def copied(mctx, x):
+ """``copied()``
+ File that is recorded as being copied.
+ """
+ # i18n: "copied" is a keyword
+ getargs(x, 0, 0, _("copied takes no arguments"))
+ s = []
+ for f in mctx.subset:
+ p = mctx.ctx[f].parents()
+ if p and p[0].path() != f:
+ s.append(f)
+ return s
+
+def subrepo(mctx, x):
+ """``subrepo([pattern])``
+ Subrepositories whose paths match the given pattern.
+ """
+ # i18n: "subrepo" is a keyword
+ getargs(x, 0, 1, _("subrepo takes at most one argument"))
+ ctx = mctx.ctx
+ sstate = ctx.substate
+ if x:
+ pat = getstring(x, _("subrepo requires a pattern or no arguments"))
+
+ import match as matchmod # avoid circular import issues
+ fast = not matchmod.patkind(pat)
+ if fast:
+ def m(s):
+ return (s == pat)
+ else:
+ m = matchmod.match(ctx._repo.root, '', [pat], ctx=ctx)
+ return [sub for sub in sstate if m(sub)]
+ else:
+ return [sub for sub in sstate]
+
+symbols = {
+ 'added': added,
+ 'binary': binary,
+ 'clean': clean,
+ 'copied': copied,
+ 'deleted': deleted,
+ 'encoding': encoding,
+ 'exec': exec_,
+ 'grep': grep,
+ 'ignored': ignored,
+ 'hgignore': hgignore,
+ 'modified': modified,
+ 'removed': removed,
+ 'resolved': resolved,
+ 'size': size,
+ 'symlink': symlink,
+ 'unknown': unknown,
+ 'unresolved': unresolved,
+ 'subrepo': subrepo,
+}
+
+methods = {
+ 'string': stringset,
+ 'symbol': stringset,
+ 'and': andset,
+ 'or': orset,
+ 'list': listset,
+ 'group': getset,
+ 'not': notset,
+ 'func': func,
+}
+
+class matchctx(object):
+ def __init__(self, ctx, subset=None, status=None):
+ self.ctx = ctx
+ self.subset = subset
+ self._status = status
+ def status(self):
+ return self._status
+ def matcher(self, patterns):
+ return self.ctx.match(patterns)
+ def filter(self, files):
+ return [f for f in files if f in self.subset]
+ def existing(self):
+ return (f for f in self.subset if f in self.ctx)
+ def narrow(self, files):
+ return matchctx(self.ctx, self.filter(files), self._status)
+
+def _intree(funcs, tree):
+ if isinstance(tree, tuple):
+ if tree[0] == 'func' and tree[1][0] == 'symbol':
+ if tree[1][1] in funcs:
+ return True
+ for s in tree[1:]:
+ if _intree(funcs, s):
+ return True
+ return False
+
+def getfileset(ctx, expr):
+ tree, pos = parse(expr)
+ if (pos != len(expr)):
+ raise error.ParseError(_("invalid token"), pos)
+
+ # do we need status info?
+ if _intree(['modified', 'added', 'removed', 'deleted',
+ 'unknown', 'ignored', 'clean'], tree):
+ unknown = _intree(['unknown'], tree)
+ ignored = _intree(['ignored'], tree)
+
+ r = ctx._repo
+ status = r.status(ctx.p1(), ctx,
+ unknown=unknown, ignored=ignored, clean=True)
+ subset = []
+ for c in status:
+ subset.extend(c)
+ else:
+ status = None
+ subset = ctx.walk(ctx.match([]))
+
+ return getset(matchctx(ctx, subset, status), tree)
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = symbols.values()
diff --git a/mercurial/formatter.py b/mercurial/formatter.py
new file mode 100644
index 0000000..53a2022
--- /dev/null
+++ b/mercurial/formatter.py
@@ -0,0 +1,71 @@
+# formatter.py - generic output formatting for mercurial
+#
+# Copyright 2012 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+class baseformatter(object):
+ def __init__(self, ui, topic, opts):
+ self._ui = ui
+ self._topic = topic
+ self._style = opts.get("style")
+ self._template = opts.get("template")
+ self._item = None
+ def __bool__(self):
+ '''return False if we're not doing real templating so we can
+ skip extra work'''
+ return True
+ def _showitem(self):
+ '''show a formatted item once all data is collected'''
+ pass
+ def startitem(self):
+ '''begin an item in the format list'''
+ if self._item is not None:
+ self._showitem()
+ self._item = {}
+ def data(self, **data):
+ '''insert data into item that's not shown in default output'''
+ def write(self, fields, deftext, *fielddata, **opts):
+ '''do default text output while assigning data to item'''
+ for k, v in zip(fields.split(), fielddata):
+ self._item[k] = v
+ def plain(self, text, **opts):
+ '''show raw text for non-templated mode'''
+ pass
+ def end(self):
+ '''end output for the formatter'''
+ if self._item is not None:
+ self._showitem()
+
+class plainformatter(baseformatter):
+ '''the default text output scheme'''
+ def __init__(self, ui, topic, opts):
+ baseformatter.__init__(self, ui, topic, opts)
+ def __bool__(self):
+ return False
+ def startitem(self):
+ pass
+ def data(self, **data):
+ pass
+ def write(self, fields, deftext, *fielddata, **opts):
+ self._ui.write(deftext % fielddata, **opts)
+ def plain(self, text, **opts):
+ self._ui.write(text, **opts)
+ def end(self):
+ pass
+
+class debugformatter(baseformatter):
+ def __init__(self, ui, topic, opts):
+ baseformatter.__init__(self, ui, topic, opts)
+ self._ui.write("%s = {\n" % self._topic)
+ def _showitem(self):
+ self._ui.write(" " + repr(self._item) + ",\n")
+ def end(self):
+ baseformatter.end(self)
+ self._ui.write("}\n")
+
+def formatter(ui, topic, opts):
+ if ui.configbool('ui', 'formatdebug'):
+ return debugformatter(ui, topic, opts)
+ return plainformatter(ui, topic, opts)
diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py
new file mode 100644
index 0000000..84be437
--- /dev/null
+++ b/mercurial/graphmod.py
@@ -0,0 +1,368 @@
+# Revision graph generator for Mercurial
+#
+# Copyright 2008 Dirkjan Ochtman <dirkjan@ochtman.nl>
+# Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""supports walking the history as DAGs suitable for graphical output
+
+The most basic format we use is that of::
+
+ (id, type, data, [parentids])
+
+The node and parent ids are arbitrary integers which identify a node in the
+context of the graph returned. Type is a constant specifying the node type.
+Data depends on type.
+"""
+
+from mercurial.node import nullrev
+import util
+
+CHANGESET = 'C'
+
+def dagwalker(repo, revs):
+ """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
+
+ This generator function walks through revisions (which should be ordered
+ from bigger to lower). It returns a tuple for each node. The node and parent
+ ids are arbitrary integers which identify a node in the context of the graph
+ returned.
+ """
+ if not revs:
+ return
+
+ cl = repo.changelog
+ lowestrev = min(revs)
+ gpcache = {}
+
+ knownrevs = set(revs)
+ for rev in revs:
+ ctx = repo[rev]
+ parents = sorted(set([p.rev() for p in ctx.parents()
+ if p.rev() in knownrevs]))
+ mpars = [p.rev() for p in ctx.parents() if
+ p.rev() != nullrev and p.rev() not in parents]
+
+ for mpar in mpars:
+ gp = gpcache.get(mpar)
+ if gp is None:
+ gp = gpcache[mpar] = grandparent(cl, lowestrev, revs, mpar)
+ if not gp:
+ parents.append(mpar)
+ else:
+ parents.extend(g for g in gp if g not in parents)
+
+ yield (ctx.rev(), CHANGESET, ctx, parents)
+
+def nodes(repo, nodes):
+ """cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
+
+ This generator function walks the given nodes. It only returns parents
+ that are in nodes, too.
+ """
+ include = set(nodes)
+ for node in nodes:
+ ctx = repo[node]
+ parents = set([p.rev() for p in ctx.parents() if p.node() in include])
+ yield (ctx.rev(), CHANGESET, ctx, sorted(parents))
+
+def colored(dag, repo):
+ """annotates a DAG with colored edge information
+
+ For each DAG node this function emits tuples::
+
+ (id, type, data, (col, color), [(col, nextcol, color)])
+
+ with the following new elements:
+
+ - Tuple (col, color) with column and color index for the current node
+ - A list of tuples indicating the edges between the current node and its
+ parents.
+ """
+ seen = []
+ colors = {}
+ newcolor = 1
+ config = {}
+
+ for key, val in repo.ui.configitems('graph'):
+ if '.' in key:
+ branch, setting = key.rsplit('.', 1)
+ # Validation
+ if setting == "width" and val.isdigit():
+ config.setdefault(branch, {})[setting] = int(val)
+ elif setting == "color" and val.isalnum():
+ config.setdefault(branch, {})[setting] = val
+
+ if config:
+ getconf = util.lrucachefunc(
+ lambda rev: config.get(repo[rev].branch(), {}))
+ else:
+ getconf = lambda rev: {}
+
+ for (cur, type, data, parents) in dag:
+
+ # Compute seen and next
+ if cur not in seen:
+ seen.append(cur) # new head
+ colors[cur] = newcolor
+ newcolor += 1
+
+ col = seen.index(cur)
+ color = colors.pop(cur)
+ next = seen[:]
+
+ # Add parents to next
+ addparents = [p for p in parents if p not in next]
+ next[col:col + 1] = addparents
+
+ # Set colors for the parents
+ for i, p in enumerate(addparents):
+ if not i:
+ colors[p] = color
+ else:
+ colors[p] = newcolor
+ newcolor += 1
+
+ # Add edges to the graph
+ edges = []
+ for ecol, eid in enumerate(seen):
+ if eid in next:
+ bconf = getconf(eid)
+ edges.append((
+ ecol, next.index(eid), colors[eid],
+ bconf.get('width', -1),
+ bconf.get('color', '')))
+ elif eid == cur:
+ for p in parents:
+ bconf = getconf(p)
+ edges.append((
+ ecol, next.index(p), color,
+ bconf.get('width', -1),
+ bconf.get('color', '')))
+
+ # Yield and move on
+ yield (cur, type, data, (col, color), edges)
+ seen = next
+
+def grandparent(cl, lowestrev, roots, head):
+ """Return all ancestors of head in roots which revision is
+ greater or equal to lowestrev.
+ """
+ pending = set([head])
+ seen = set()
+ kept = set()
+ llowestrev = max(nullrev, lowestrev)
+ while pending:
+ r = pending.pop()
+ if r >= llowestrev and r not in seen:
+ if r in roots:
+ kept.add(r)
+ else:
+ pending.update([p for p in cl.parentrevs(r)])
+ seen.add(r)
+ return sorted(kept)
+
+def asciiedges(type, char, lines, seen, rev, parents):
+ """adds edge info to changelog DAG walk suitable for ascii()"""
+ if rev not in seen:
+ seen.append(rev)
+ nodeidx = seen.index(rev)
+
+ knownparents = []
+ newparents = []
+ for parent in parents:
+ if parent in seen:
+ knownparents.append(parent)
+ else:
+ newparents.append(parent)
+
+ ncols = len(seen)
+ nextseen = seen[:]
+ nextseen[nodeidx:nodeidx + 1] = newparents
+ edges = [(nodeidx, nextseen.index(p)) for p in knownparents]
+
+ while len(newparents) > 2:
+ # ascii() only knows how to add or remove a single column between two
+ # calls. Nodes with more than two parents break this constraint so we
+ # introduce intermediate expansion lines to grow the active node list
+ # slowly.
+ edges.append((nodeidx, nodeidx))
+ edges.append((nodeidx, nodeidx + 1))
+ nmorecols = 1
+ yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
+ char = '\\'
+ lines = []
+ nodeidx += 1
+ ncols += 1
+ edges = []
+ del newparents[0]
+
+ if len(newparents) > 0:
+ edges.append((nodeidx, nodeidx))
+ if len(newparents) > 1:
+ edges.append((nodeidx, nodeidx + 1))
+ nmorecols = len(nextseen) - ncols
+ seen[:] = nextseen
+ yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
+
+def _fixlongrightedges(edges):
+ for (i, (start, end)) in enumerate(edges):
+ if end > start:
+ edges[i] = (start, end + 1)
+
+def _getnodelineedgestail(
+ node_index, p_node_index, n_columns, n_columns_diff, p_diff, fix_tail):
+ if fix_tail and n_columns_diff == p_diff and n_columns_diff != 0:
+ # Still going in the same non-vertical direction.
+ if n_columns_diff == -1:
+ start = max(node_index + 1, p_node_index)
+ tail = ["|", " "] * (start - node_index - 1)
+ tail.extend(["/", " "] * (n_columns - start))
+ return tail
+ else:
+ return ["\\", " "] * (n_columns - node_index - 1)
+ else:
+ return ["|", " "] * (n_columns - node_index - 1)
+
+def _drawedges(edges, nodeline, interline):
+ for (start, end) in edges:
+ if start == end + 1:
+ interline[2 * end + 1] = "/"
+ elif start == end - 1:
+ interline[2 * start + 1] = "\\"
+ elif start == end:
+ interline[2 * start] = "|"
+ else:
+ if 2 * end >= len(nodeline):
+ continue
+ nodeline[2 * end] = "+"
+ if start > end:
+ (start, end) = (end, start)
+ for i in range(2 * start + 1, 2 * end):
+ if nodeline[i] != "+":
+ nodeline[i] = "-"
+
+def _getpaddingline(ni, n_columns, edges):
+ line = []
+ line.extend(["|", " "] * ni)
+ if (ni, ni - 1) in edges or (ni, ni) in edges:
+ # (ni, ni - 1) (ni, ni)
+ # | | | | | | | |
+ # +---o | | o---+
+ # | | c | | c | |
+ # | |/ / | |/ /
+ # | | | | | |
+ c = "|"
+ else:
+ c = " "
+ line.extend([c, " "])
+ line.extend(["|", " "] * (n_columns - ni - 1))
+ return line
+
+def asciistate():
+ """returns the initial value for the "state" argument to ascii()"""
+ return [0, 0]
+
+def ascii(ui, state, type, char, text, coldata):
+ """prints an ASCII graph of the DAG
+
+ takes the following arguments (one call per node in the graph):
+
+ - ui to write to
+ - Somewhere to keep the needed state in (init to asciistate())
+ - Column of the current node in the set of ongoing edges.
+ - Type indicator of node data, usually 'C' for changesets.
+ - Payload: (char, lines):
+ - Character to use as node's symbol.
+ - List of lines to display as the node's text.
+ - Edges; a list of (col, next_col) indicating the edges between
+ the current node and its parents.
+ - Number of columns (ongoing edges) in the current revision.
+ - The difference between the number of columns (ongoing edges)
+ in the next revision and the number of columns (ongoing edges)
+ in the current revision. That is: -1 means one column removed;
+ 0 means no columns added or removed; 1 means one column added.
+ """
+
+ idx, edges, ncols, coldiff = coldata
+ assert -2 < coldiff < 2
+ if coldiff == -1:
+ # Transform
+ #
+ # | | | | | |
+ # o | | into o---+
+ # |X / |/ /
+ # | | | |
+ _fixlongrightedges(edges)
+
+ # add_padding_line says whether to rewrite
+ #
+ # | | | | | | | |
+ # | o---+ into | o---+
+ # | / / | | | # <--- padding line
+ # o | | | / /
+ # o | |
+ add_padding_line = (len(text) > 2 and coldiff == -1 and
+ [x for (x, y) in edges if x + 1 < y])
+
+ # fix_nodeline_tail says whether to rewrite
+ #
+ # | | o | | | | o | |
+ # | | |/ / | | |/ /
+ # | o | | into | o / / # <--- fixed nodeline tail
+ # | |/ / | |/ /
+ # o | | o | |
+ fix_nodeline_tail = len(text) <= 2 and not add_padding_line
+
+ # nodeline is the line containing the node character (typically o)
+ nodeline = ["|", " "] * idx
+ nodeline.extend([char, " "])
+
+ nodeline.extend(
+ _getnodelineedgestail(idx, state[1], ncols, coldiff,
+ state[0], fix_nodeline_tail))
+
+ # shift_interline is the line containing the non-vertical
+ # edges between this entry and the next
+ shift_interline = ["|", " "] * idx
+ if coldiff == -1:
+ n_spaces = 1
+ edge_ch = "/"
+ elif coldiff == 0:
+ n_spaces = 2
+ edge_ch = "|"
+ else:
+ n_spaces = 3
+ edge_ch = "\\"
+ shift_interline.extend(n_spaces * [" "])
+ shift_interline.extend([edge_ch, " "] * (ncols - idx - 1))
+
+ # draw edges from the current node to its parents
+ _drawedges(edges, nodeline, shift_interline)
+
+ # lines is the list of all graph lines to print
+ lines = [nodeline]
+ if add_padding_line:
+ lines.append(_getpaddingline(idx, ncols, edges))
+ lines.append(shift_interline)
+
+ # make sure that there are as many graph lines as there are
+ # log strings
+ while len(text) < len(lines):
+ text.append("")
+ if len(lines) < len(text):
+ extra_interline = ["|", " "] * (ncols + coldiff)
+ while len(lines) < len(text):
+ lines.append(extra_interline)
+
+ # print lines
+ indentation_level = max(ncols, ncols + coldiff)
+ for (line, logstr) in zip(lines, text):
+ ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
+ ui.write(ln.rstrip() + '\n')
+
+ # ... and start over
+ state[0] = coldiff
+ state[1] = idx
diff --git a/mercurial/hbisect.py b/mercurial/hbisect.py
new file mode 100644
index 0000000..0ce8182
--- /dev/null
+++ b/mercurial/hbisect.py
@@ -0,0 +1,258 @@
+# changelog bisection for mercurial
+#
+# Copyright 2007 Matt Mackall
+# Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org>
+#
+# Inspired by git bisect, extension skeleton taken from mq.py.
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, error
+from i18n import _
+from node import short, hex
+import util
+
+def bisect(changelog, state):
+ """find the next node (if any) for testing during a bisect search.
+ returns a (nodes, number, good) tuple.
+
+ 'nodes' is the final result of the bisect if 'number' is 0.
+ Otherwise 'number' indicates the remaining possible candidates for
+ the search and 'nodes' contains the next bisect target.
+ 'good' is True if bisect is searching for a first good changeset, False
+ if searching for a first bad one.
+ """
+
+ clparents = changelog.parentrevs
+ skip = set([changelog.rev(n) for n in state['skip']])
+
+ def buildancestors(bad, good):
+ # only the earliest bad revision matters
+ badrev = min([changelog.rev(n) for n in bad])
+ goodrevs = [changelog.rev(n) for n in good]
+ goodrev = min(goodrevs)
+ # build visit array
+ ancestors = [None] * (len(changelog) + 1) # an extra for [-1]
+
+ # set nodes descended from goodrevs
+ for rev in goodrevs:
+ ancestors[rev] = []
+ for rev in xrange(goodrev + 1, len(changelog)):
+ for prev in clparents(rev):
+ if ancestors[prev] == []:
+ ancestors[rev] = []
+
+ # clear good revs from array
+ for rev in goodrevs:
+ ancestors[rev] = None
+ for rev in xrange(len(changelog), goodrev, -1):
+ if ancestors[rev] is None:
+ for prev in clparents(rev):
+ ancestors[prev] = None
+
+ if ancestors[badrev] is None:
+ return badrev, None
+ return badrev, ancestors
+
+ good = False
+ badrev, ancestors = buildancestors(state['bad'], state['good'])
+ if not ancestors: # looking for bad to good transition?
+ good = True
+ badrev, ancestors = buildancestors(state['good'], state['bad'])
+ bad = changelog.node(badrev)
+ if not ancestors: # now we're confused
+ if len(state['bad']) == 1 and len(state['good']) == 1:
+ raise util.Abort(_("starting revisions are not directly related"))
+ raise util.Abort(_("inconsistent state, %s:%s is good and bad")
+ % (badrev, short(bad)))
+
+ # build children dict
+ children = {}
+ visit = util.deque([badrev])
+ candidates = []
+ while visit:
+ rev = visit.popleft()
+ if ancestors[rev] == []:
+ candidates.append(rev)
+ for prev in clparents(rev):
+ if prev != -1:
+ if prev in children:
+ children[prev].append(rev)
+ else:
+ children[prev] = [rev]
+ visit.append(prev)
+
+ candidates.sort()
+ # have we narrowed it down to one entry?
+ # or have all other possible candidates besides 'bad' have been skipped?
+ tot = len(candidates)
+ unskipped = [c for c in candidates if (c not in skip) and (c != badrev)]
+ if tot == 1 or not unskipped:
+ return ([changelog.node(rev) for rev in candidates], 0, good)
+ perfect = tot // 2
+
+ # find the best node to test
+ best_rev = None
+ best_len = -1
+ poison = set()
+ for rev in candidates:
+ if rev in poison:
+ # poison children
+ poison.update(children.get(rev, []))
+ continue
+
+ a = ancestors[rev] or [rev]
+ ancestors[rev] = None
+
+ x = len(a) # number of ancestors
+ y = tot - x # number of non-ancestors
+ value = min(x, y) # how good is this test?
+ if value > best_len and rev not in skip:
+ best_len = value
+ best_rev = rev
+ if value == perfect: # found a perfect candidate? quit early
+ break
+
+ if y < perfect and rev not in skip: # all downhill from here?
+ # poison children
+ poison.update(children.get(rev, []))
+ continue
+
+ for c in children.get(rev, []):
+ if ancestors[c]:
+ ancestors[c] = list(set(ancestors[c] + a))
+ else:
+ ancestors[c] = a + [c]
+
+ assert best_rev is not None
+ best_node = changelog.node(best_rev)
+
+ return ([best_node], tot, good)
+
+
+def load_state(repo):
+ state = {'current': [], 'good': [], 'bad': [], 'skip': []}
+ if os.path.exists(repo.join("bisect.state")):
+ for l in repo.opener("bisect.state"):
+ kind, node = l[:-1].split()
+ node = repo.lookup(node)
+ if kind not in state:
+ raise util.Abort(_("unknown bisect kind %s") % kind)
+ state[kind].append(node)
+ return state
+
+
+def save_state(repo, state):
+ f = repo.opener("bisect.state", "w", atomictemp=True)
+ wlock = repo.wlock()
+ try:
+ for kind in state:
+ for node in state[kind]:
+ f.write("%s %s\n" % (kind, hex(node)))
+ f.close()
+ finally:
+ wlock.release()
+
+def get(repo, status):
+ """
+ Return a list of revision(s) that match the given status:
+
+ - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
+ - ``goods``, ``bads`` : csets topologicaly good/bad
+ - ``range`` : csets taking part in the bisection
+ - ``pruned`` : csets that are goods, bads or skipped
+ - ``untested`` : csets whose fate is yet unknown
+ - ``ignored`` : csets ignored due to DAG topology
+ - ``current`` : the cset currently being bisected
+ """
+ state = load_state(repo)
+ if status in ('good', 'bad', 'skip', 'current'):
+ return map(repo.changelog.rev, state[status])
+ else:
+ # In the floowing sets, we do *not* call 'bisect()' with more
+ # than one level of recusrsion, because that can be very, very
+ # time consuming. Instead, we always develop the expression as
+ # much as possible.
+
+ # 'range' is all csets that make the bisection:
+ # - have a good ancestor and a bad descendant, or conversely
+ # that's because the bisection can go either way
+ range = '( bisect(bad)::bisect(good) | bisect(good)::bisect(bad) )'
+
+ _t = repo.revs('bisect(good)::bisect(bad)')
+ # The sets of topologically good or bad csets
+ if len(_t) == 0:
+ # Goods are topologically after bads
+ goods = 'bisect(good)::' # Pruned good csets
+ bads = '::bisect(bad)' # Pruned bad csets
+ else:
+ # Goods are topologically before bads
+ goods = '::bisect(good)' # Pruned good csets
+ bads = 'bisect(bad)::' # Pruned bad csets
+
+ # 'pruned' is all csets whose fate is already known: good, bad, skip
+ skips = 'bisect(skip)' # Pruned skipped csets
+ pruned = '( (%s) | (%s) | (%s) )' % (goods, bads, skips)
+
+ # 'untested' is all cset that are- in 'range', but not in 'pruned'
+ untested = '( (%s) - (%s) )' % (range, pruned)
+
+ # 'ignored' is all csets that were not used during the bisection
+ # due to DAG topology, but may however have had an impact.
+ # Eg., a branch merged between bads and goods, but whose branch-
+ # point is out-side of the range.
+ iba = '::bisect(bad) - ::bisect(good)' # Ignored bads' ancestors
+ iga = '::bisect(good) - ::bisect(bad)' # Ignored goods' ancestors
+ ignored = '( ( (%s) | (%s) ) - (%s) )' % (iba, iga, range)
+
+ if status == 'range':
+ return repo.revs(range)
+ elif status == 'pruned':
+ return repo.revs(pruned)
+ elif status == 'untested':
+ return repo.revs(untested)
+ elif status == 'ignored':
+ return repo.revs(ignored)
+ elif status == "goods":
+ return repo.revs(goods)
+ elif status == "bads":
+ return repo.revs(bads)
+ else:
+ raise error.ParseError(_('invalid bisect state'))
+
+def label(repo, node):
+ rev = repo.changelog.rev(node)
+
+ # Try explicit sets
+ if rev in get(repo, 'good'):
+ # i18n: bisect changeset status
+ return _('good')
+ if rev in get(repo, 'bad'):
+ # i18n: bisect changeset status
+ return _('bad')
+ if rev in get(repo, 'skip'):
+ # i18n: bisect changeset status
+ return _('skipped')
+ if rev in get(repo, 'untested') or rev in get(repo, 'current'):
+ # i18n: bisect changeset status
+ return _('untested')
+ if rev in get(repo, 'ignored'):
+ # i18n: bisect changeset status
+ return _('ignored')
+
+ # Try implicit sets
+ if rev in get(repo, 'goods'):
+ # i18n: bisect changeset status
+ return _('good (implicit)')
+ if rev in get(repo, 'bads'):
+ # i18n: bisect changeset status
+ return _('bad (implicit)')
+
+ return None
+
+def shortlabel(label):
+ if label:
+ return label[0].upper()
+
+ return None
diff --git a/mercurial/help.py b/mercurial/help.py
new file mode 100644
index 0000000..79d9966
--- /dev/null
+++ b/mercurial/help.py
@@ -0,0 +1,203 @@
+# help.py - help data for mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import gettext, _
+import itertools, sys, os
+import extensions, revset, fileset, templatekw, templatefilters, filemerge
+import encoding, util, minirst
+
+def listexts(header, exts, indent=1):
+ '''return a text listing of the given extensions'''
+ rst = []
+ if exts:
+ rst.append('\n%s\n\n' % header)
+ for name, desc in sorted(exts.iteritems()):
+ rst.append('%s:%s: %s\n' % (' ' * indent, name, desc))
+ return rst
+
+def extshelp():
+ rst = loaddoc('extensions')().splitlines(True)
+ rst.extend(listexts(_('enabled extensions:'), extensions.enabled()))
+ rst.extend(listexts(_('disabled extensions:'), extensions.disabled()))
+ doc = ''.join(rst)
+ return doc
+
+def optrst(options, verbose):
+ data = []
+ multioccur = False
+ for option in options:
+ if len(option) == 5:
+ shortopt, longopt, default, desc, optlabel = option
+ else:
+ shortopt, longopt, default, desc = option
+ optlabel = _("VALUE") # default label
+
+ if _("DEPRECATED") in desc and not verbose:
+ continue
+
+ so = ''
+ if shortopt:
+ so = '-' + shortopt
+ lo = '--' + longopt
+ if default:
+ desc += _(" (default: %s)") % default
+
+ if isinstance(default, list):
+ lo += " %s [+]" % optlabel
+ multioccur = True
+ elif (default is not None) and not isinstance(default, bool):
+ lo += " %s" % optlabel
+
+ data.append((so, lo, desc))
+
+ rst = minirst.maketable(data, 1)
+
+ if multioccur:
+ rst.append(_("\n[+] marked option can be specified multiple times\n"))
+
+ return ''.join(rst)
+
+def topicmatch(kw):
+ """Return help topics matching kw.
+
+ Returns {'section': [(name, summary), ...], ...} where section is
+ one of topics, commands, extensions, or extensioncommands.
+ """
+ kw = encoding.lower(kw)
+ def lowercontains(container):
+ return kw in encoding.lower(container) # translated in helptable
+ results = {'topics': [],
+ 'commands': [],
+ 'extensions': [],
+ 'extensioncommands': [],
+ }
+ for names, header, doc in helptable:
+ if (sum(map(lowercontains, names))
+ or lowercontains(header)
+ or lowercontains(doc())):
+ results['topics'].append((names[0], header))
+ import commands # avoid cycle
+ for cmd, entry in commands.table.iteritems():
+ if cmd.startswith('debug'):
+ continue
+ if len(entry) == 3:
+ summary = entry[2]
+ else:
+ summary = ''
+ # translate docs *before* searching there
+ docs = _(getattr(entry[0], '__doc__', None)) or ''
+ if kw in cmd or lowercontains(summary) or lowercontains(docs):
+ doclines = docs.splitlines()
+ if doclines:
+ summary = doclines[0]
+ cmdname = cmd.split('|')[0].lstrip('^')
+ results['commands'].append((cmdname, summary))
+ for name, docs in itertools.chain(
+ extensions.enabled().iteritems(),
+ extensions.disabled().iteritems()):
+ # extensions.load ignores the UI argument
+ mod = extensions.load(None, name, '')
+ if lowercontains(name) or lowercontains(docs):
+ # extension docs are already translated
+ results['extensions'].append((name, docs.splitlines()[0]))
+ for cmd, entry in getattr(mod, 'cmdtable', {}).iteritems():
+ if kw in cmd or (len(entry) > 2 and lowercontains(entry[2])):
+ cmdname = cmd.split('|')[0].lstrip('^')
+ if entry[0].__doc__:
+ cmddoc = gettext(entry[0].__doc__).splitlines()[0]
+ else:
+ cmddoc = _('(no help text available)')
+ results['extensioncommands'].append((cmdname, cmddoc))
+ return results
+
+def loaddoc(topic):
+ """Return a delayed loader for help/topic.txt."""
+
+ def loader():
+ if util.mainfrozen():
+ module = sys.executable
+ else:
+ module = __file__
+ base = os.path.dirname(module)
+
+ for dir in ('.', '..'):
+ docdir = os.path.join(base, dir, 'help')
+ if os.path.isdir(docdir):
+ break
+
+ path = os.path.join(docdir, topic + ".txt")
+ doc = gettext(util.readfile(path))
+ for rewriter in helphooks.get(topic, []):
+ doc = rewriter(topic, doc)
+ return doc
+
+ return loader
+
+helptable = sorted([
+ (["config", "hgrc"], _("Configuration Files"), loaddoc('config')),
+ (["dates"], _("Date Formats"), loaddoc('dates')),
+ (["patterns"], _("File Name Patterns"), loaddoc('patterns')),
+ (['environment', 'env'], _('Environment Variables'),
+ loaddoc('environment')),
+ (['revisions', 'revs'], _('Specifying Single Revisions'),
+ loaddoc('revisions')),
+ (['multirevs', 'mrevs'], _('Specifying Multiple Revisions'),
+ loaddoc('multirevs')),
+ (['revsets', 'revset'], _("Specifying Revision Sets"), loaddoc('revsets')),
+ (['filesets', 'fileset'], _("Specifying File Sets"), loaddoc('filesets')),
+ (['diffs'], _('Diff Formats'), loaddoc('diffs')),
+ (['merge-tools', 'mergetools'], _('Merge Tools'), loaddoc('merge-tools')),
+ (['templating', 'templates', 'template', 'style'], _('Template Usage'),
+ loaddoc('templates')),
+ (['urls'], _('URL Paths'), loaddoc('urls')),
+ (["extensions"], _("Using Additional Features"), extshelp),
+ (["subrepos", "subrepo"], _("Subrepositories"), loaddoc('subrepos')),
+ (["hgweb"], _("Configuring hgweb"), loaddoc('hgweb')),
+ (["glossary"], _("Glossary"), loaddoc('glossary')),
+ (["hgignore", "ignore"], _("Syntax for Mercurial Ignore Files"),
+ loaddoc('hgignore')),
+ (["phases"], _("Working with Phases"), loaddoc('phases')),
+])
+
+# Map topics to lists of callable taking the current topic help and
+# returning the updated version
+helphooks = {}
+
+def addtopichook(topic, rewriter):
+ helphooks.setdefault(topic, []).append(rewriter)
+
+def makeitemsdoc(topic, doc, marker, items):
+ """Extract docstring from the items key to function mapping, build a
+ .single documentation block and use it to overwrite the marker in doc
+ """
+ entries = []
+ for name in sorted(items):
+ text = (items[name].__doc__ or '').rstrip()
+ if not text:
+ continue
+ text = gettext(text)
+ lines = text.splitlines()
+ doclines = [(lines[0])]
+ for l in lines[1:]:
+ # Stop once we find some Python doctest
+ if l.strip().startswith('>>>'):
+ break
+ doclines.append(' ' + l.strip())
+ entries.append('\n'.join(doclines))
+ entries = '\n\n'.join(entries)
+ return doc.replace(marker, entries)
+
+def addtopicsymbols(topic, marker, symbols):
+ def add(topic, doc):
+ return makeitemsdoc(topic, doc, marker, symbols)
+ addtopichook(topic, add)
+
+addtopicsymbols('filesets', '.. predicatesmarker', fileset.symbols)
+addtopicsymbols('merge-tools', '.. internaltoolsmarker', filemerge.internals)
+addtopicsymbols('revsets', '.. predicatesmarker', revset.symbols)
+addtopicsymbols('templates', '.. keywordsmarker', templatekw.dockeywords)
+addtopicsymbols('templates', '.. filtersmarker', templatefilters.filters)
diff --git a/mercurial/help/config.txt b/mercurial/help/config.txt
new file mode 100644
index 0000000..557948b
--- /dev/null
+++ b/mercurial/help/config.txt
@@ -0,0 +1,1441 @@
+The Mercurial system uses a set of configuration files to control
+aspects of its behavior.
+
+The configuration files use a simple ini-file format. A configuration
+file consists of sections, led by a ``[section]`` header and followed
+by ``name = value`` entries::
+
+ [ui]
+ username = Firstname Lastname <firstname.lastname@example.net>
+ verbose = True
+
+The above entries will be referred to as ``ui.username`` and
+``ui.verbose``, respectively. See the Syntax section below.
+
+Files
+=====
+
+Mercurial reads configuration data from several files, if they exist.
+These files do not exist by default and you will have to create the
+appropriate configuration files yourself: global configuration like
+the username setting is typically put into
+``%USERPROFILE%\mercurial.ini`` or ``$HOME/.hgrc`` and local
+configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
+
+The names of these files depend on the system on which Mercurial is
+installed. ``*.rc`` files from a single directory are read in
+alphabetical order, later ones overriding earlier ones. Where multiple
+paths are given below, settings from earlier paths override later
+ones.
+
+| (All) ``<repo>/.hg/hgrc``
+
+ Per-repository configuration options that only apply in a
+ particular repository. This file is not version-controlled, and
+ will not get transferred during a "clone" operation. Options in
+ this file override options in all other configuration files. On
+ Plan 9 and Unix, most of this file will be ignored if it doesn't
+ belong to a trusted user or to a trusted group. See the documentation
+ for the ``[trusted]`` section below for more details.
+
+| (Plan 9) ``$home/lib/hgrc``
+| (Unix) ``$HOME/.hgrc``
+| (Windows) ``%USERPROFILE%\.hgrc``
+| (Windows) ``%USERPROFILE%\Mercurial.ini``
+| (Windows) ``%HOME%\.hgrc``
+| (Windows) ``%HOME%\Mercurial.ini``
+
+ Per-user configuration file(s), for the user running Mercurial. On
+ Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these
+ files apply to all Mercurial commands executed by this user in any
+ directory. Options in these files override per-system and per-installation
+ options.
+
+| (Plan 9) ``/lib/mercurial/hgrc``
+| (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``
+| (Unix) ``/etc/mercurial/hgrc``
+| (Unix) ``/etc/mercurial/hgrc.d/*.rc``
+
+ Per-system configuration files, for the system on which Mercurial
+ is running. Options in these files apply to all Mercurial commands
+ executed by any user in any directory. Options in these files
+ override per-installation options.
+
+| (Plan 9) ``<install-root>/lib/mercurial/hgrc``
+| (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``
+| (Unix) ``<install-root>/etc/mercurial/hgrc``
+| (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``
+
+ Per-installation configuration files, searched for in the
+ directory where Mercurial is installed. ``<install-root>`` is the
+ parent directory of the **hg** executable (or symlink) being run. For
+ example, if installed in ``/shared/tools/bin/hg``, Mercurial will look
+ in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply
+ to all Mercurial commands executed by any user in any directory.
+
+| (Windows) ``<install-dir>\Mercurial.ini`` **or**
+| (Windows) ``<install-dir>\hgrc.d\*.rc`` **or**
+| (Windows) ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial``
+
+ Per-installation/system configuration files, for the system on
+ which Mercurial is running. Options in these files apply to all
+ Mercurial commands executed by any user in any directory. Registry
+ keys contain PATH-like strings, every part of which must reference
+ a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
+ be read. Mercurial checks each of these locations in the specified
+ order until one or more configuration files are detected.
+
+Syntax
+======
+
+A configuration file consists of sections, led by a ``[section]`` header
+and followed by ``name = value`` entries (sometimes called
+``configuration keys``)::
+
+ [spam]
+ eggs=ham
+ green=
+ eggs
+
+Each line contains one entry. If the lines that follow are indented,
+they are treated as continuations of that entry. Leading whitespace is
+removed from values. Empty lines are skipped. Lines beginning with
+``#`` or ``;`` are ignored and may be used to provide comments.
+
+Configuration keys can be set multiple times, in which case Mercurial
+will use the value that was configured last. As an example::
+
+ [spam]
+ eggs=large
+ ham=serrano
+ eggs=small
+
+This would set the configuration key named ``eggs`` to ``small``.
+
+It is also possible to define a section multiple times. A section can
+be redefined on the same and/or on different configuration files. For
+example::
+
+ [foo]
+ eggs=large
+ ham=serrano
+ eggs=small
+
+ [bar]
+ eggs=ham
+ green=
+ eggs
+
+ [foo]
+ ham=prosciutto
+ eggs=medium
+ bread=toasted
+
+This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
+of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
+respectively. As you can see there only thing that matters is the last
+value that was set for each of the configuration keys.
+
+If a configuration key is set multiple times in different
+configuration files the final value will depend on the order in which
+the different configuration files are read, with settings from earlier
+paths overriding later ones as described on the ``Files`` section
+above.
+
+A line of the form ``%include file`` will include ``file`` into the
+current configuration file. The inclusion is recursive, which means
+that included files can include other files. Filenames are relative to
+the configuration file in which the ``%include`` directive is found.
+Environment variables and ``~user`` constructs are expanded in
+``file``. This lets you do something like::
+
+ %include ~/.hgrc.d/$HOST.rc
+
+to include a different configuration file on each computer you use.
+
+A line with ``%unset name`` will remove ``name`` from the current
+section, if it has been set previously.
+
+The values are either free-form text strings, lists of text strings,
+or Boolean values. Boolean values can be set to true using any of "1",
+"yes", "true", or "on" and to false using "0", "no", "false", or "off"
+(all case insensitive).
+
+List values are separated by whitespace or comma, except when values are
+placed in double quotation marks::
+
+ allow_read = "John Doe, PhD", brian, betty
+
+Quotation marks can be escaped by prefixing them with a backslash. Only
+quotation marks at the beginning of a word is counted as a quotation
+(e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
+
+Sections
+========
+
+This section describes the different sections that may appear in a
+Mercurial configuration file, the purpose of each section, its possible
+keys, and their possible values.
+
+``alias``
+---------
+
+Defines command aliases.
+Aliases allow you to define your own commands in terms of other
+commands (or aliases), optionally including arguments. Positional
+arguments in the form of ``$1``, ``$2``, etc in the alias definition
+are expanded by Mercurial before execution. Positional arguments not
+already used by ``$N`` in the definition are put at the end of the
+command to be executed.
+
+Alias definitions consist of lines of the form::
+
+ <alias> = <command> [<argument>]...
+
+For example, this definition::
+
+ latest = log --limit 5
+
+creates a new command ``latest`` that shows only the five most recent
+changesets. You can define subsequent aliases using earlier ones::
+
+ stable5 = latest -b stable
+
+.. note:: It is possible to create aliases with the same names as
+ existing commands, which will then override the original
+ definitions. This is almost always a bad idea!
+
+An alias can start with an exclamation point (``!``) to make it a
+shell alias. A shell alias is executed with the shell and will let you
+run arbitrary commands. As an example, ::
+
+ echo = !echo $@
+
+will let you do ``hg echo foo`` to have ``foo`` printed in your
+terminal. A better example might be::
+
+ purge = !$HG status --no-status --unknown -0 | xargs -0 rm
+
+which will make ``hg purge`` delete all unknown files in the
+repository in the same manner as the purge extension.
+
+Positional arguments like ``$1``, ``$2``, etc. in the alias definition
+expand to the command arguments. Unmatched arguments are
+removed. ``$0`` expands to the alias name and ``$@`` expands to all
+arguments separated by a space. These expansions happen before the
+command is passed to the shell.
+
+Shell aliases are executed in an environment where ``$HG`` expands to
+the path of the Mercurial that was used to execute the alias. This is
+useful when you want to call further Mercurial commands in a shell
+alias, as was done above for the purge alias. In addition,
+``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
+echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
+
+.. note:: Some global configuration options such as ``-R`` are
+ processed before shell aliases and will thus not be passed to
+ aliases.
+
+
+``annotate``
+------------
+
+Settings used when displaying file annotations. All values are
+Booleans and default to False. See ``diff`` section for related
+options for the diff command.
+
+``ignorews``
+ Ignore white space when comparing lines.
+
+``ignorewsamount``
+ Ignore changes in the amount of white space.
+
+``ignoreblanklines``
+ Ignore changes whose lines are all blank.
+
+
+``auth``
+--------
+
+Authentication credentials for HTTP authentication. This section
+allows you to store usernames and passwords for use when logging
+*into* HTTP servers. See the ``[web]`` configuration section if
+you want to configure *who* can login to your HTTP server.
+
+Each line has the following format::
+
+ <name>.<argument> = <value>
+
+where ``<name>`` is used to group arguments into authentication
+entries. Example::
+
+ foo.prefix = hg.intevation.org/mercurial
+ foo.username = foo
+ foo.password = bar
+ foo.schemes = http https
+
+ bar.prefix = secure.example.org
+ bar.key = path/to/file.key
+ bar.cert = path/to/file.cert
+ bar.schemes = https
+
+Supported arguments:
+
+``prefix``
+ Either ``*`` or a URI prefix with or without the scheme part.
+ The authentication entry with the longest matching prefix is used
+ (where ``*`` matches everything and counts as a match of length
+ 1). If the prefix doesn't include a scheme, the match is performed
+ against the URI with its scheme stripped as well, and the schemes
+ argument, q.v., is then subsequently consulted.
+
+``username``
+ Optional. Username to authenticate with. If not given, and the
+ remote site requires basic or digest authentication, the user will
+ be prompted for it. Environment variables are expanded in the
+ username letting you do ``foo.username = $USER``. If the URI
+ includes a username, only ``[auth]`` entries with a matching
+ username or without a username will be considered.
+
+``password``
+ Optional. Password to authenticate with. If not given, and the
+ remote site requires basic or digest authentication, the user
+ will be prompted for it.
+
+``key``
+ Optional. PEM encoded client certificate key file. Environment
+ variables are expanded in the filename.
+
+``cert``
+ Optional. PEM encoded client certificate chain file. Environment
+ variables are expanded in the filename.
+
+``schemes``
+ Optional. Space separated list of URI schemes to use this
+ authentication entry with. Only used if the prefix doesn't include
+ a scheme. Supported schemes are http and https. They will match
+ static-http and static-https respectively, as well.
+ Default: https.
+
+If no suitable authentication entry is found, the user is prompted
+for credentials as usual if required by the remote.
+
+
+``decode/encode``
+-----------------
+
+Filters for transforming files on checkout/checkin. This would
+typically be used for newline processing or other
+localization/canonicalization of files.
+
+Filters consist of a filter pattern followed by a filter command.
+Filter patterns are globs by default, rooted at the repository root.
+For example, to match any file ending in ``.txt`` in the root
+directory only, use the pattern ``*.txt``. To match any file ending
+in ``.c`` anywhere in the repository, use the pattern ``**.c``.
+For each file only the first matching filter applies.
+
+The filter command can start with a specifier, either ``pipe:`` or
+``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
+
+A ``pipe:`` command must accept data on stdin and return the transformed
+data on stdout.
+
+Pipe example::
+
+ [encode]
+ # uncompress gzip files on checkin to improve delta compression
+ # note: not necessarily a good idea, just an example
+ *.gz = pipe: gunzip
+
+ [decode]
+ # recompress gzip files when writing them to the working dir (we
+ # can safely omit "pipe:", because it's the default)
+ *.gz = gzip
+
+A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
+with the name of a temporary file that contains the data to be
+filtered by the command. The string ``OUTFILE`` is replaced with the name
+of an empty temporary file, where the filtered data must be written by
+the command.
+
+.. note:: The tempfile mechanism is recommended for Windows systems,
+ where the standard shell I/O redirection operators often have
+ strange effects and may corrupt the contents of your files.
+
+This filter mechanism is used internally by the ``eol`` extension to
+translate line ending characters between Windows (CRLF) and Unix (LF)
+format. We suggest you use the ``eol`` extension for convenience.
+
+
+``defaults``
+------------
+
+(defaults are deprecated. Don't use them. Use aliases instead)
+
+Use the ``[defaults]`` section to define command defaults, i.e. the
+default options/arguments to pass to the specified commands.
+
+The following example makes :hg:`log` run in verbose mode, and
+:hg:`status` show only the modified files, by default::
+
+ [defaults]
+ log = -v
+ status = -m
+
+The actual commands, instead of their aliases, must be used when
+defining command defaults. The command defaults will also be applied
+to the aliases of the commands defined.
+
+
+``diff``
+--------
+
+Settings used when displaying diffs. Everything except for ``unified``
+is a Boolean and defaults to False. See ``annotate`` section for
+related options for the annotate command.
+
+``git``
+ Use git extended diff format.
+
+``nodates``
+ Don't include dates in diff headers.
+
+``showfunc``
+ Show which function each change is in.
+
+``ignorews``
+ Ignore white space when comparing lines.
+
+``ignorewsamount``
+ Ignore changes in the amount of white space.
+
+``ignoreblanklines``
+ Ignore changes whose lines are all blank.
+
+``unified``
+ Number of lines of context to show.
+
+``email``
+---------
+
+Settings for extensions that send email messages.
+
+``from``
+ Optional. Email address to use in "From" header and SMTP envelope
+ of outgoing messages.
+
+``to``
+ Optional. Comma-separated list of recipients' email addresses.
+
+``cc``
+ Optional. Comma-separated list of carbon copy recipients'
+ email addresses.
+
+``bcc``
+ Optional. Comma-separated list of blind carbon copy recipients'
+ email addresses.
+
+``method``
+ Optional. Method to use to send email messages. If value is ``smtp``
+ (default), use SMTP (see the ``[smtp]`` section for configuration).
+ Otherwise, use as name of program to run that acts like sendmail
+ (takes ``-f`` option for sender, list of recipients on command line,
+ message on stdin). Normally, setting this to ``sendmail`` or
+ ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
+
+``charsets``
+ Optional. Comma-separated list of character sets considered
+ convenient for recipients. Addresses, headers, and parts not
+ containing patches of outgoing messages will be encoded in the
+ first character set to which conversion from local encoding
+ (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
+ conversion fails, the text in question is sent as is. Defaults to
+ empty (explicit) list.
+
+ Order of outgoing email character sets:
+
+ 1. ``us-ascii``: always first, regardless of settings
+ 2. ``email.charsets``: in order given by user
+ 3. ``ui.fallbackencoding``: if not in email.charsets
+ 4. ``$HGENCODING``: if not in email.charsets
+ 5. ``utf-8``: always last, regardless of settings
+
+Email example::
+
+ [email]
+ from = Joseph User <joe.user@example.com>
+ method = /usr/sbin/sendmail
+ # charsets for western Europeans
+ # us-ascii, utf-8 omitted, as they are tried first and last
+ charsets = iso-8859-1, iso-8859-15, windows-1252
+
+
+``extensions``
+--------------
+
+Mercurial has an extension mechanism for adding new features. To
+enable an extension, create an entry for it in this section.
+
+If you know that the extension is already in Python's search path,
+you can give the name of the module, followed by ``=``, with nothing
+after the ``=``.
+
+Otherwise, give a name that you choose, followed by ``=``, followed by
+the path to the ``.py`` file (including the file name extension) that
+defines the extension.
+
+To explicitly disable an extension that is enabled in an hgrc of
+broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
+or ``foo = !`` when path is not supplied.
+
+Example for ``~/.hgrc``::
+
+ [extensions]
+ # (the mq extension will get loaded from Mercurial's path)
+ mq =
+ # (this extension will get loaded from the file specified)
+ myfeature = ~/.hgext/myfeature.py
+
+
+``format``
+----------
+
+``usestore``
+ Enable or disable the "store" repository format which improves
+ compatibility with systems that fold case or otherwise mangle
+ filenames. Enabled by default. Disabling this option will allow
+ you to store longer filenames in some situations at the expense of
+ compatibility and ensures that the on-disk format of newly created
+ repositories will be compatible with Mercurial before version 0.9.4.
+
+``usefncache``
+ Enable or disable the "fncache" repository format which enhances
+ the "store" repository format (which has to be enabled to use
+ fncache) to allow longer filenames and avoids using Windows
+ reserved names, e.g. "nul". Enabled by default. Disabling this
+ option ensures that the on-disk format of newly created
+ repositories will be compatible with Mercurial before version 1.1.
+
+``dotencode``
+ Enable or disable the "dotencode" repository format which enhances
+ the "fncache" repository format (which has to be enabled to use
+ dotencode) to avoid issues with filenames starting with ._ on
+ Mac OS X and spaces on Windows. Enabled by default. Disabling this
+ option ensures that the on-disk format of newly created
+ repositories will be compatible with Mercurial before version 1.7.
+
+``graph``
+---------
+
+Web graph view configuration. This section let you change graph
+elements display properties by branches, for instance to make the
+``default`` branch stand out.
+
+Each line has the following format::
+
+ <branch>.<argument> = <value>
+
+where ``<branch>`` is the name of the branch being
+customized. Example::
+
+ [graph]
+ # 2px width
+ default.width = 2
+ # red color
+ default.color = FF0000
+
+Supported arguments:
+
+``width``
+ Set branch edges width in pixels.
+
+``color``
+ Set branch edges color in hexadecimal RGB notation.
+
+``hooks``
+---------
+
+Commands or Python functions that get automatically executed by
+various actions such as starting or finishing a commit. Multiple
+hooks can be run for the same action by appending a suffix to the
+action. Overriding a site-wide hook can be done by changing its
+value or setting it to an empty string. Hooks can be prioritized
+by adding a prefix of ``priority`` to the hook name on a new line
+and setting the priority. The default priority is 0 if
+not specified.
+
+Example ``.hg/hgrc``::
+
+ [hooks]
+ # update working directory after adding changesets
+ changegroup.update = hg update
+ # do not use the site-wide hook
+ incoming =
+ incoming.email = /my/email/hook
+ incoming.autobuild = /my/build/hook
+ # force autobuild hook to run before other incoming hooks
+ priority.incoming.autobuild = 1
+
+Most hooks are run with environment variables set that give useful
+additional information. For each hook below, the environment
+variables it is passed are listed with names of the form ``$HG_foo``.
+
+``changegroup``
+ Run after a changegroup has been added via push, pull or unbundle.
+ ID of the first new changeset is in ``$HG_NODE``. URL from which
+ changes came is in ``$HG_URL``.
+
+``commit``
+ Run after a changeset has been created in the local repository. ID
+ of the newly created changeset is in ``$HG_NODE``. Parent changeset
+ IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
+
+``incoming``
+ Run after a changeset has been pulled, pushed, or unbundled into
+ the local repository. The ID of the newly arrived changeset is in
+ ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
+
+``outgoing``
+ Run after sending changes from local repository to another. ID of
+ first changeset sent is in ``$HG_NODE``. Source of operation is in
+ ``$HG_SOURCE``; see "preoutgoing" hook for description.
+
+``post-<command>``
+ Run after successful invocations of the associated command. The
+ contents of the command line are passed as ``$HG_ARGS`` and the result
+ code in ``$HG_RESULT``. Parsed command line arguments are passed as
+ ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
+ the python data internally passed to <command>. ``$HG_OPTS`` is a
+ dictionary of options (with unspecified options set to their defaults).
+ ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
+
+``pre-<command>``
+ Run before executing the associated command. The contents of the
+ command line are passed as ``$HG_ARGS``. Parsed command line arguments
+ are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
+ representations of the data internally passed to <command>. ``$HG_OPTS``
+ is a dictionary of options (with unspecified options set to their
+ defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
+ failure, the command doesn't execute and Mercurial returns the failure
+ code.
+
+``prechangegroup``
+ Run before a changegroup is added via push, pull or unbundle. Exit
+ status 0 allows the changegroup to proceed. Non-zero status will
+ cause the push, pull or unbundle to fail. URL from which changes
+ will come is in ``$HG_URL``.
+
+``precommit``
+ Run before starting a local commit. Exit status 0 allows the
+ commit to proceed. Non-zero status will cause the commit to fail.
+ Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
+
+``prelistkeys``
+ Run before listing pushkeys (like bookmarks) in the
+ repository. Non-zero status will cause failure. The key namespace is
+ in ``$HG_NAMESPACE``.
+
+``preoutgoing``
+ Run before collecting changes to send from the local repository to
+ another. Non-zero status will cause failure. This lets you prevent
+ pull over HTTP or SSH. Also prevents against local pull, push
+ (outbound) or bundle commands, but not effective, since you can
+ just copy files instead then. Source of operation is in
+ ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
+ SSH or HTTP repository. If "push", "pull" or "bundle", operation
+ is happening on behalf of repository on same system.
+
+``prepushkey``
+ Run before a pushkey (like a bookmark) is added to the
+ repository. Non-zero status will cause the key to be rejected. The
+ key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
+ the old value (if any) is in ``$HG_OLD``, and the new value is in
+ ``$HG_NEW``.
+
+``pretag``
+ Run before creating a tag. Exit status 0 allows the tag to be
+ created. Non-zero status will cause the tag to fail. ID of
+ changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
+ local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
+
+``pretxnchangegroup``
+ Run after a changegroup has been added via push, pull or unbundle,
+ but before the transaction has been committed. Changegroup is
+ visible to hook program. This lets you validate incoming changes
+ before accepting them. Passed the ID of the first new changeset in
+ ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero
+ status will cause the transaction to be rolled back and the push,
+ pull or unbundle will fail. URL that was source of changes is in
+ ``$HG_URL``.
+
+``pretxncommit``
+ Run after a changeset has been created but the transaction not yet
+ committed. Changeset is visible to hook program. This lets you
+ validate commit message and changes. Exit status 0 allows the
+ commit to proceed. Non-zero status will cause the transaction to
+ be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
+ IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
+
+``preupdate``
+ Run before updating the working directory. Exit status 0 allows
+ the update to proceed. Non-zero status will prevent the update.
+ Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
+ of second new parent is in ``$HG_PARENT2``.
+
+``listkeys``
+ Run after listing pushkeys (like bookmarks) in the repository. The
+ key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
+ dictionary containing the keys and values.
+
+``pushkey``
+ Run after a pushkey (like a bookmark) is added to the
+ repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
+ ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
+ value is in ``$HG_NEW``.
+
+``tag``
+ Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
+ Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
+ repository if ``$HG_LOCAL=0``.
+
+``update``
+ Run after updating the working directory. Changeset ID of first
+ new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
+ in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
+ update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
+
+.. note:: It is generally better to use standard hooks rather than the
+ generic pre- and post- command hooks as they are guaranteed to be
+ called in the appropriate contexts for influencing transactions.
+ Also, hooks like "commit" will be called in all contexts that
+ generate a commit (e.g. tag) and not just the commit command.
+
+.. note:: Environment variables with empty values may not be passed to
+ hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
+ will have an empty value under Unix-like platforms for non-merge
+ changesets, while it will not be available at all under Windows.
+
+The syntax for Python hooks is as follows::
+
+ hookname = python:modulename.submodule.callable
+ hookname = python:/path/to/python/module.py:callable
+
+Python hooks are run within the Mercurial process. Each hook is
+called with at least three keyword arguments: a ui object (keyword
+``ui``), a repository object (keyword ``repo``), and a ``hooktype``
+keyword that tells what kind of hook is used. Arguments listed as
+environment variables above are passed as keyword arguments, with no
+``HG_`` prefix, and names in lower case.
+
+If a Python hook returns a "true" value or raises an exception, this
+is treated as a failure.
+
+
+``hostfingerprints``
+--------------------
+
+Fingerprints of the certificates of known HTTPS servers.
+A HTTPS connection to a server with a fingerprint configured here will
+only succeed if the servers certificate matches the fingerprint.
+This is very similar to how ssh known hosts works.
+The fingerprint is the SHA-1 hash value of the DER encoded certificate.
+The CA chain and web.cacerts is not used for servers with a fingerprint.
+
+For example::
+
+ [hostfingerprints]
+ hg.intevation.org = 38:76:52:7c:87:26:9a:8f:4a:f8:d3:de:08:45:3b:ea:d6:4b:ee:cc
+
+This feature is only supported when using Python 2.6 or later.
+
+
+``http_proxy``
+--------------
+
+Used to access web-based Mercurial repositories through a HTTP
+proxy.
+
+``host``
+ Host name and (optional) port of the proxy server, for example
+ "myproxy:8000".
+
+``no``
+ Optional. Comma-separated list of host names that should bypass
+ the proxy.
+
+``passwd``
+ Optional. Password to authenticate with at the proxy server.
+
+``user``
+ Optional. User name to authenticate with at the proxy server.
+
+``always``
+ Optional. Always use the proxy, even for localhost and any entries
+ in ``http_proxy.no``. True or False. Default: False.
+
+``merge-patterns``
+------------------
+
+This section specifies merge tools to associate with particular file
+patterns. Tools matched here will take precedence over the default
+merge tool. Patterns are globs by default, rooted at the repository
+root.
+
+Example::
+
+ [merge-patterns]
+ **.c = kdiff3
+ **.jpg = myimgmerge
+
+``merge-tools``
+---------------
+
+This section configures external merge tools to use for file-level
+merges.
+
+Example ``~/.hgrc``::
+
+ [merge-tools]
+ # Override stock tool location
+ kdiff3.executable = ~/bin/kdiff3
+ # Specify command line
+ kdiff3.args = $base $local $other -o $output
+ # Give higher priority
+ kdiff3.priority = 1
+
+ # Define new tool
+ myHtmlTool.args = -m $local $other $base $output
+ myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
+ myHtmlTool.priority = 1
+
+Supported arguments:
+
+``priority``
+ The priority in which to evaluate this tool.
+ Default: 0.
+
+``executable``
+ Either just the name of the executable or its pathname. On Windows,
+ the path can use environment variables with ${ProgramFiles} syntax.
+ Default: the tool name.
+
+``args``
+ The arguments to pass to the tool executable. You can refer to the
+ files being merged as well as the output file through these
+ variables: ``$base``, ``$local``, ``$other``, ``$output``.
+ Default: ``$local $base $other``
+
+``premerge``
+ Attempt to run internal non-interactive 3-way merge tool before
+ launching external tool. Options are ``true``, ``false``, or ``keep``
+ to leave markers in the file if the premerge fails.
+ Default: True
+
+``binary``
+ This tool can merge binary files. Defaults to False, unless tool
+ was selected by file pattern match.
+
+``symlink``
+ This tool can merge symlinks. Defaults to False, even if tool was
+ selected by file pattern match.
+
+``check``
+ A list of merge success-checking options:
+
+ ``changed``
+ Ask whether merge was successful when the merged file shows no changes.
+ ``conflicts``
+ Check whether there are conflicts even though the tool reported success.
+ ``prompt``
+ Always prompt for merge success, regardless of success reported by tool.
+
+``checkchanged``
+ True is equivalent to ``check = changed``.
+ Default: False
+
+``checkconflicts``
+ True is equivalent to ``check = conflicts``.
+ Default: False
+
+``fixeol``
+ Attempt to fix up EOL changes caused by the merge tool.
+ Default: False
+
+``gui``
+ This tool requires a graphical interface to run. Default: False
+
+``regkey``
+ Windows registry key which describes install location of this
+ tool. Mercurial will search for this key first under
+ ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
+ Default: None
+
+``regkeyalt``
+ An alternate Windows registry key to try if the first key is not
+ found. The alternate key uses the same ``regname`` and ``regappend``
+ semantics of the primary key. The most common use for this key
+ is to search for 32bit applications on 64bit operating systems.
+ Default: None
+
+``regname``
+ Name of value to read from specified registry key. Defaults to the
+ unnamed (default) value.
+
+``regappend``
+ String to append to the value read from the registry, typically
+ the executable name of the tool.
+ Default: None
+
+
+``patch``
+---------
+
+Settings used when applying patches, for instance through the 'import'
+command or with Mercurial Queues extension.
+
+``eol``
+ When set to 'strict' patch content and patched files end of lines
+ are preserved. When set to ``lf`` or ``crlf``, both files end of
+ lines are ignored when patching and the result line endings are
+ normalized to either LF (Unix) or CRLF (Windows). When set to
+ ``auto``, end of lines are again ignored while patching but line
+ endings in patched files are normalized to their original setting
+ on a per-file basis. If target file does not exist or has no end
+ of line, patch line endings are preserved.
+ Default: strict.
+
+
+``paths``
+---------
+
+Assigns symbolic names to repositories. The left side is the
+symbolic name, and the right gives the directory or URL that is the
+location of the repository. Default paths can be declared by setting
+the following entries.
+
+``default``
+ Directory or URL to use when pulling if no source is specified.
+ Default is set to repository from which the current repository was
+ cloned.
+
+``default-push``
+ Optional. Directory or URL to use when pushing if no destination
+ is specified.
+
+``phases``
+----------
+
+Specifies default handling of phases. See :hg:`help phases` for more
+information about working with phases.
+
+``publish``
+ Controls draft phase behavior when working as a server. When true,
+ pushed changesets are set to public in both client and server and
+ pulled or cloned changesets are set to public in the client.
+ Default: True
+
+``new-commit``
+ Phase of newly-created commits.
+ Default: draft
+
+``profiling``
+-------------
+
+Specifies profiling type, format, and file output. Two profilers are
+supported: an instrumenting profiler (named ``ls``), and a sampling
+profiler (named ``stat``).
+
+In this section description, 'profiling data' stands for the raw data
+collected during profiling, while 'profiling report' stands for a
+statistical text report generated from the profiling data. The
+profiling is done using lsprof.
+
+``type``
+ The type of profiler to use.
+ Default: ls.
+
+ ``ls``
+ Use Python's built-in instrumenting profiler. This profiler
+ works on all platforms, but each line number it reports is the
+ first line of a function. This restriction makes it difficult to
+ identify the expensive parts of a non-trivial function.
+ ``stat``
+ Use a third-party statistical profiler, statprof. This profiler
+ currently runs only on Unix systems, and is most useful for
+ profiling commands that run for longer than about 0.1 seconds.
+
+``format``
+ Profiling format. Specific to the ``ls`` instrumenting profiler.
+ Default: text.
+
+ ``text``
+ Generate a profiling report. When saving to a file, it should be
+ noted that only the report is saved, and the profiling data is
+ not kept.
+ ``kcachegrind``
+ Format profiling data for kcachegrind use: when saving to a
+ file, the generated file can directly be loaded into
+ kcachegrind.
+
+``frequency``
+ Sampling frequency. Specific to the ``stat`` sampling profiler.
+ Default: 1000.
+
+``output``
+ File path where profiling data or report should be saved. If the
+ file exists, it is replaced. Default: None, data is printed on
+ stderr
+
+``revsetalias``
+---------------
+
+Alias definitions for revsets. See :hg:`help revsets` for details.
+
+``server``
+----------
+
+Controls generic server settings.
+
+``uncompressed``
+ Whether to allow clients to clone a repository using the
+ uncompressed streaming protocol. This transfers about 40% more
+ data than a regular clone, but uses less memory and CPU on both
+ server and client. Over a LAN (100 Mbps or better) or a very fast
+ WAN, an uncompressed streaming clone is a lot faster (~10x) than a
+ regular clone. Over most WAN connections (anything slower than
+ about 6 Mbps), uncompressed streaming is slower, because of the
+ extra data transfer overhead. This mode will also temporarily hold
+ the write lock while determining what data to transfer.
+ Default is True.
+
+``preferuncompressed``
+ When set, clients will try to use the uncompressed streaming
+ protocol. Default is False.
+
+``validate``
+ Whether to validate the completeness of pushed changesets by
+ checking that all new file revisions specified in manifests are
+ present. Default is False.
+
+``smtp``
+--------
+
+Configuration for extensions that need to send email messages.
+
+``host``
+ Host name of mail server, e.g. "mail.example.com".
+
+``port``
+ Optional. Port to connect to on mail server. Default: 25.
+
+``tls``
+ Optional. Method to enable TLS when connecting to mail server: starttls,
+ smtps or none. Default: none.
+
+``username``
+ Optional. User name for authenticating with the SMTP server.
+ Default: none.
+
+``password``
+ Optional. Password for authenticating with the SMTP server. If not
+ specified, interactive sessions will prompt the user for a
+ password; non-interactive sessions will fail. Default: none.
+
+``local_hostname``
+ Optional. It's the hostname that the sender can use to identify
+ itself to the MTA.
+
+
+``subpaths``
+------------
+
+Subrepository source URLs can go stale if a remote server changes name
+or becomes temporarily unavailable. This section lets you define
+rewrite rules of the form::
+
+ <pattern> = <replacement>
+
+where ``pattern`` is a regular expression matching a subrepository
+source URL and ``replacement`` is the replacement string used to
+rewrite it. Groups can be matched in ``pattern`` and referenced in
+``replacements``. For instance::
+
+ http://server/(.*)-hg/ = http://hg.server/\1/
+
+rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
+
+Relative subrepository paths are first made absolute, and the
+rewrite rules are then applied on the full (absolute) path. The rules
+are applied in definition order.
+
+``trusted``
+-----------
+
+Mercurial will not use the settings in the
+``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
+user or to a trusted group, as various hgrc features allow arbitrary
+commands to be run. This issue is often encountered when configuring
+hooks or extensions for shared repositories or servers. However,
+the web interface will use some safe settings from the ``[web]``
+section.
+
+This section specifies what users and groups are trusted. The
+current user is always trusted. To trust everybody, list a user or a
+group with name ``*``. These settings must be placed in an
+*already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
+user or service running Mercurial.
+
+``users``
+ Comma-separated list of trusted users.
+
+``groups``
+ Comma-separated list of trusted groups.
+
+
+``ui``
+------
+
+User interface controls.
+
+``archivemeta``
+ Whether to include the .hg_archival.txt file containing meta data
+ (hashes for the repository base and for tip) in archives created
+ by the :hg:`archive` command or downloaded via hgweb.
+ Default is True.
+
+``askusername``
+ Whether to prompt for a username when committing. If True, and
+ neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
+ be prompted to enter a username. If no username is entered, the
+ default ``USER@HOST`` is used instead.
+ Default is False.
+
+``commitsubrepos``
+ Whether to commit modified subrepositories when committing the
+ parent repository. If False and one subrepository has uncommitted
+ changes, abort the commit.
+ Default is False.
+
+``debug``
+ Print debugging information. True or False. Default is False.
+
+``editor``
+ The editor to use during a commit. Default is ``$EDITOR`` or ``vi``.
+
+``fallbackencoding``
+ Encoding to try if it's not possible to decode the changelog using
+ UTF-8. Default is ISO-8859-1.
+
+``ignore``
+ A file to read per-user ignore patterns from. This file should be
+ in the same format as a repository-wide .hgignore file. This
+ option supports hook syntax, so if you want to specify multiple
+ ignore files, you can do so by setting something like
+ ``ignore.other = ~/.hgignore2``. For details of the ignore file
+ format, see the ``hgignore(5)`` man page.
+
+``interactive``
+ Allow to prompt the user. True or False. Default is True.
+
+``logtemplate``
+ Template string for commands that print changesets.
+
+``merge``
+ The conflict resolution program to use during a manual merge.
+ For more information on merge tools see :hg:`help merge-tools`.
+ For configuring merge tools see the ``[merge-tools]`` section.
+
+``portablefilenames``
+ Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
+ Default is ``warn``.
+ If set to ``warn`` (or ``true``), a warning message is printed on POSIX
+ platforms, if a file with a non-portable filename is added (e.g. a file
+ with a name that can't be created on Windows because it contains reserved
+ parts like ``AUX``, reserved characters like ``:``, or would cause a case
+ collision with an existing file).
+ If set to ``ignore`` (or ``false``), no warning is printed.
+ If set to ``abort``, the command is aborted.
+ On Windows, this configuration option is ignored and the command aborted.
+
+``quiet``
+ Reduce the amount of output printed. True or False. Default is False.
+
+``remotecmd``
+ remote command to use for clone/push/pull operations. Default is ``hg``.
+
+``reportoldssl``
+ Warn if an SSL certificate is unable to be due to using Python
+ 2.5 or earlier. True or False. Default is True.
+
+``report_untrusted``
+ Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
+ trusted user or group. True or False. Default is True.
+
+``slash``
+ Display paths using a slash (``/``) as the path separator. This
+ only makes a difference on systems where the default path
+ separator is not the slash character (e.g. Windows uses the
+ backslash character (``\``)).
+ Default is False.
+
+``ssh``
+ command to use for SSH connections. Default is ``ssh``.
+
+``strict``
+ Require exact command names, instead of allowing unambiguous
+ abbreviations. True or False. Default is False.
+
+``style``
+ Name of style to use for command output.
+
+``timeout``
+ The timeout used when a lock is held (in seconds), a negative value
+ means no timeout. Default is 600.
+
+``traceback``
+ Mercurial always prints a traceback when an unknown exception
+ occurs. Setting this to True will make Mercurial print a traceback
+ on all exceptions, even those recognized by Mercurial (such as
+ IOError or MemoryError). Default is False.
+
+``username``
+ The committer of a changeset created when running "commit".
+ Typically a person's name and email address, e.g. ``Fred Widget
+ <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. If
+ the username in hgrc is empty, it has to be specified manually or
+ in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set
+ ``username =`` in the system hgrc). Environment variables in the
+ username are expanded.
+
+``verbose``
+ Increase the amount of output printed. True or False. Default is False.
+
+
+``web``
+-------
+
+Web interface configuration. The settings in this section apply to
+both the builtin webserver (started by :hg:`serve`) and the script you
+run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
+and WSGI).
+
+The Mercurial webserver does no authentication (it does not prompt for
+usernames and passwords to validate *who* users are), but it does do
+authorization (it grants or denies access for *authenticated users*
+based on settings in this section). You must either configure your
+webserver to do authentication for you, or disable the authorization
+checks.
+
+For a quick setup in a trusted environment, e.g., a private LAN, where
+you want it to accept pushes from anybody, you can use the following
+command line::
+
+ $ hg --config web.allow_push=* --config web.push_ssl=False serve
+
+Note that this will allow anybody to push anything to the server and
+that this should not be used for public servers.
+
+The full set of options is:
+
+``accesslog``
+ Where to output the access log. Default is stdout.
+
+``address``
+ Interface address to bind to. Default is all.
+
+``allow_archive``
+ List of archive format (bz2, gz, zip) allowed for downloading.
+ Default is empty.
+
+``allowbz2``
+ (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
+ revisions.
+ Default is False.
+
+``allowgz``
+ (DEPRECATED) Whether to allow .tar.gz downloading of repository
+ revisions.
+ Default is False.
+
+``allowpull``
+ Whether to allow pulling from the repository. Default is True.
+
+``allow_push``
+ Whether to allow pushing to the repository. If empty or not set,
+ push is not allowed. If the special value ``*``, any remote user can
+ push, including unauthenticated users. Otherwise, the remote user
+ must have been authenticated, and the authenticated user name must
+ be present in this list. The contents of the allow_push list are
+ examined after the deny_push list.
+
+``allow_read``
+ If the user has not already been denied repository access due to
+ the contents of deny_read, this list determines whether to grant
+ repository access to the user. If this list is not empty, and the
+ user is unauthenticated or not present in the list, then access is
+ denied for the user. If the list is empty or not set, then access
+ is permitted to all users by default. Setting allow_read to the
+ special value ``*`` is equivalent to it not being set (i.e. access
+ is permitted to all users). The contents of the allow_read list are
+ examined after the deny_read list.
+
+``allowzip``
+ (DEPRECATED) Whether to allow .zip downloading of repository
+ revisions. Default is False. This feature creates temporary files.
+
+``baseurl``
+ Base URL to use when publishing URLs in other locations, so
+ third-party tools like email notification hooks can construct
+ URLs. Example: ``http://hgserver/repos/``.
+
+``cacerts``
+ Path to file containing a list of PEM encoded certificate
+ authority certificates. Environment variables and ``~user``
+ constructs are expanded in the filename. If specified on the
+ client, then it will verify the identity of remote HTTPS servers
+ with these certificates.
+
+ This feature is only supported when using Python 2.6 or later. If you wish
+ to use it with earlier versions of Python, install the backported
+ version of the ssl library that is available from
+ ``http://pypi.python.org``.
+
+ To disable SSL verification temporarily, specify ``--insecure`` from
+ command line.
+
+ You can use OpenSSL's CA certificate file if your platform has
+ one. On most Linux systems this will be
+ ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
+ generate this file manually. The form must be as follows::
+
+ -----BEGIN CERTIFICATE-----
+ ... (certificate in base64 PEM encoding) ...
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+ ... (certificate in base64 PEM encoding) ...
+ -----END CERTIFICATE-----
+
+``cache``
+ Whether to support caching in hgweb. Defaults to True.
+
+``collapse``
+ With ``descend`` enabled, repositories in subdirectories are shown at
+ a single level alongside repositories in the current path. With
+ ``collapse`` also enabled, repositories residing at a deeper level than
+ the current path are grouped behind navigable directory entries that
+ lead to the locations of these repositories. In effect, this setting
+ collapses each collection of repositories found within a subdirectory
+ into a single entry for that subdirectory. Default is False.
+
+``comparisoncontext``
+ Number of lines of context to show in side-by-side file comparison. If
+ negative or the value ``full``, whole files are shown. Default is 5.
+ This setting can be overridden by a ``context`` request parameter to the
+ ``comparison`` command, taking the same values.
+
+``contact``
+ Name or email address of the person in charge of the repository.
+ Defaults to ui.username or ``$EMAIL`` or "unknown" if unset or empty.
+
+``deny_push``
+ Whether to deny pushing to the repository. If empty or not set,
+ push is not denied. If the special value ``*``, all remote users are
+ denied push. Otherwise, unauthenticated users are all denied, and
+ any authenticated user name present in this list is also denied. The
+ contents of the deny_push list are examined before the allow_push list.
+
+``deny_read``
+ Whether to deny reading/viewing of the repository. If this list is
+ not empty, unauthenticated users are all denied, and any
+ authenticated user name present in this list is also denied access to
+ the repository. If set to the special value ``*``, all remote users
+ are denied access (rarely needed ;). If deny_read is empty or not set,
+ the determination of repository access depends on the presence and
+ content of the allow_read list (see description). If both
+ deny_read and allow_read are empty or not set, then access is
+ permitted to all users by default. If the repository is being
+ served via hgwebdir, denied users will not be able to see it in
+ the list of repositories. The contents of the deny_read list have
+ priority over (are examined before) the contents of the allow_read
+ list.
+
+``descend``
+ hgwebdir indexes will not descend into subdirectories. Only repositories
+ directly in the current path will be shown (other repositories are still
+ available from the index corresponding to their containing path).
+
+``description``
+ Textual description of the repository's purpose or contents.
+ Default is "unknown".
+
+``encoding``
+ Character encoding name. Default is the current locale charset.
+ Example: "UTF-8"
+
+``errorlog``
+ Where to output the error log. Default is stderr.
+
+``guessmime``
+ Control MIME types for raw download of file content.
+ Set to True to let hgweb guess the content type from the file
+ extension. This will serve HTML files as ``text/html`` and might
+ allow cross-site scripting attacks when serving untrusted
+ repositories. Default is False.
+
+``hidden``
+ Whether to hide the repository in the hgwebdir index.
+ Default is False.
+
+``ipv6``
+ Whether to use IPv6. Default is False.
+
+``logoimg``
+ File name of the logo image that some templates display on each page.
+ The file name is relative to ``staticurl``. That is, the full path to
+ the logo image is "staticurl/logoimg".
+ If unset, ``hglogo.png`` will be used.
+
+``logourl``
+ Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``
+ will be used.
+
+``maxchanges``
+ Maximum number of changes to list on the changelog. Default is 10.
+
+``maxfiles``
+ Maximum number of files to list per changeset. Default is 10.
+
+``maxshortchanges``
+ Maximum number of changes to list on the shortlog, graph or filelog
+ pages. Default is 60.
+
+``name``
+ Repository name to use in the web interface. Default is current
+ working directory.
+
+``port``
+ Port to listen on. Default is 8000.
+
+``prefix``
+ Prefix path to serve from. Default is '' (server root).
+
+``push_ssl``
+ Whether to require that inbound pushes be transported over SSL to
+ prevent password sniffing. Default is True.
+
+``staticurl``
+ Base URL to use for static files. If unset, static files (e.g. the
+ hgicon.png favicon) will be served by the CGI script itself. Use
+ this setting to serve them directly with the HTTP server.
+ Example: ``http://hgserver/static/``.
+
+``stripes``
+ How many lines a "zebra stripe" should span in multiline output.
+ Default is 1; set to 0 to disable.
+
+``style``
+ Which template map style to use.
+
+``templates``
+ Where to find the HTML templates. Default is install path.
diff --git a/mercurial/help/dates.txt b/mercurial/help/dates.txt
new file mode 100644
index 0000000..5f48979
--- /dev/null
+++ b/mercurial/help/dates.txt
@@ -0,0 +1,36 @@
+Some commands allow the user to specify a date, e.g.:
+
+- backout, commit, import, tag: Specify the commit date.
+- log, revert, update: Select revision(s) by date.
+
+Many date formats are valid. Here are some examples:
+
+- ``Wed Dec 6 13:18:29 2006`` (local timezone assumed)
+- ``Dec 6 13:18 -0600`` (year assumed, time offset provided)
+- ``Dec 6 13:18 UTC`` (UTC and GMT are aliases for +0000)
+- ``Dec 6`` (midnight)
+- ``13:18`` (today assumed)
+- ``3:39`` (3:39AM assumed)
+- ``3:39pm`` (15:39)
+- ``2006-12-06 13:18:29`` (ISO 8601 format)
+- ``2006-12-6 13:18``
+- ``2006-12-6``
+- ``12-6``
+- ``12/6``
+- ``12/6/6`` (Dec 6 2006)
+
+Lastly, there is Mercurial's internal format:
+
+- ``1165432709 0`` (Wed Dec 6 13:18:29 2006 UTC)
+
+This is the internal representation format for dates. The first number
+is the number of seconds since the epoch (1970-01-01 00:00 UTC). The
+second is the offset of the local timezone, in seconds west of UTC
+(negative if the timezone is east of UTC).
+
+The log command also accepts date ranges:
+
+- ``<DATE`` - at or before a given date/time
+- ``>DATE`` - on or after a given date/time
+- ``DATE to DATE`` - a date range, inclusive
+- ``-DAYS`` - within a given number of days of today
diff --git a/mercurial/help/diffs.txt b/mercurial/help/diffs.txt
new file mode 100644
index 0000000..9ede0a5
--- /dev/null
+++ b/mercurial/help/diffs.txt
@@ -0,0 +1,29 @@
+Mercurial's default format for showing changes between two versions of
+a file is compatible with the unified format of GNU diff, which can be
+used by GNU patch and many other standard tools.
+
+While this standard format is often enough, it does not encode the
+following information:
+
+- executable status and other permission bits
+- copy or rename information
+- changes in binary files
+- creation or deletion of empty files
+
+Mercurial also supports the extended diff format from the git VCS
+which addresses these limitations. The git diff format is not produced
+by default because a few widespread tools still do not understand this
+format.
+
+This means that when generating diffs from a Mercurial repository
+(e.g. with :hg:`export`), you should be careful about things like file
+copies and renames or other things mentioned above, because when
+applying a standard diff to a different repository, this extra
+information is lost. Mercurial's internal operations (like push and
+pull) are not affected by this, because they use an internal binary
+format for communicating changes.
+
+To make Mercurial produce the git extended diff format, use the --git
+option available for many commands, or set 'git = True' in the [diff]
+section of your configuration file. You do not need to set this option
+when importing diffs in this format or using them in the mq extension.
diff --git a/mercurial/help/environment.txt b/mercurial/help/environment.txt
new file mode 100644
index 0000000..5e6771f
--- /dev/null
+++ b/mercurial/help/environment.txt
@@ -0,0 +1,101 @@
+HG
+ Path to the 'hg' executable, automatically passed when running
+ hooks, extensions or external tools. If unset or empty, this is
+ the hg executable's name if it's frozen, or an executable named
+ 'hg' (with %PATHEXT% [defaulting to COM/EXE/BAT/CMD] extensions on
+ Windows) is searched.
+
+HGEDITOR
+ This is the name of the editor to run when committing. See EDITOR.
+
+ (deprecated, use configuration file)
+
+HGENCODING
+ This overrides the default locale setting detected by Mercurial.
+ This setting is used to convert data including usernames,
+ changeset descriptions, tag names, and branches. This setting can
+ be overridden with the --encoding command-line option.
+
+HGENCODINGMODE
+ This sets Mercurial's behavior for handling unknown characters
+ while transcoding user input. The default is "strict", which
+ causes Mercurial to abort if it can't map a character. Other
+ settings include "replace", which replaces unknown characters, and
+ "ignore", which drops them. This setting can be overridden with
+ the --encodingmode command-line option.
+
+HGENCODINGAMBIGUOUS
+ This sets Mercurial's behavior for handling characters with
+ "ambiguous" widths like accented Latin characters with East Asian
+ fonts. By default, Mercurial assumes ambiguous characters are
+ narrow, set this variable to "wide" if such characters cause
+ formatting problems.
+
+HGMERGE
+ An executable to use for resolving merge conflicts. The program
+ will be executed with three arguments: local file, remote file,
+ ancestor file.
+
+ (deprecated, use configuration file)
+
+HGRCPATH
+ A list of files or directories to search for configuration
+ files. Item separator is ":" on Unix, ";" on Windows. If HGRCPATH
+ is not set, platform default search path is used. If empty, only
+ the .hg/hgrc from the current repository is read.
+
+ For each element in HGRCPATH:
+
+ - if it's a directory, all files ending with .rc are added
+ - otherwise, the file itself will be added
+
+HGPLAIN
+ When set, this disables any configuration settings that might
+ change Mercurial's default output. This includes encoding,
+ defaults, verbose mode, debug mode, quiet mode, tracebacks, and
+ localization. This can be useful when scripting against Mercurial
+ in the face of existing user configuration.
+
+ Equivalent options set via command line flags or environment
+ variables are not overridden.
+
+HGPLAINEXCEPT
+ This is a comma-separated list of features to preserve when
+ HGPLAIN is enabled. Currently the only value supported is "i18n",
+ which preserves internationalization in plain mode.
+
+ Setting HGPLAINEXCEPT to anything (even an empty string) will
+ enable plain mode.
+
+HGUSER
+ This is the string used as the author of a commit. If not set,
+ available values will be considered in this order:
+
+ - HGUSER (deprecated)
+ - configuration files from the HGRCPATH
+ - EMAIL
+ - interactive prompt
+ - LOGNAME (with ``@hostname`` appended)
+
+ (deprecated, use configuration file)
+
+EMAIL
+ May be used as the author of a commit; see HGUSER.
+
+LOGNAME
+ May be used as the author of a commit; see HGUSER.
+
+VISUAL
+ This is the name of the editor to use when committing. See EDITOR.
+
+EDITOR
+ Sometimes Mercurial needs to open a text file in an editor for a
+ user to modify, for example when writing commit messages. The
+ editor it uses is determined by looking at the environment
+ variables HGEDITOR, VISUAL and EDITOR, in that order. The first
+ non-empty one is chosen. If all of them are empty, the editor
+ defaults to 'vi'.
+
+PYTHONPATH
+ This is used by Python to find imported modules and may need to be
+ set appropriately if this Mercurial is not installed system-wide.
diff --git a/mercurial/help/extensions.txt b/mercurial/help/extensions.txt
new file mode 100644
index 0000000..f3d2992
--- /dev/null
+++ b/mercurial/help/extensions.txt
@@ -0,0 +1,33 @@
+Mercurial has the ability to add new features through the use of
+extensions. Extensions may add new commands, add options to
+existing commands, change the default behavior of commands, or
+implement hooks.
+
+Extensions are not loaded by default for a variety of reasons:
+they can increase startup overhead; they may be meant for advanced
+usage only; they may provide potentially dangerous abilities (such
+as letting you destroy or modify history); they might not be ready
+for prime time; or they may alter some usual behaviors of stock
+Mercurial. It is thus up to the user to activate extensions as
+needed.
+
+To enable the "foo" extension, either shipped with Mercurial or in the
+Python search path, create an entry for it in your configuration file,
+like this::
+
+ [extensions]
+ foo =
+
+You may also specify the full path to an extension::
+
+ [extensions]
+ myfeature = ~/.hgext/myfeature.py
+
+To explicitly disable an extension enabled in a configuration file of
+broader scope, prepend its path with !::
+
+ [extensions]
+ # disabling extension bar residing in /path/to/extension/bar.py
+ bar = !/path/to/extension/bar.py
+ # ditto, but no path was supplied for extension baz
+ baz = !
diff --git a/mercurial/help/filesets.txt b/mercurial/help/filesets.txt
new file mode 100644
index 0000000..afad752
--- /dev/null
+++ b/mercurial/help/filesets.txt
@@ -0,0 +1,65 @@
+Mercurial supports a functional language for selecting a set of
+files.
+
+Like other file patterns, this pattern type is indicated by a prefix,
+'set:'. The language supports a number of predicates which are joined
+by infix operators. Parenthesis can be used for grouping.
+
+Identifiers such as filenames or patterns must be quoted with single
+or double quotes if they contain characters outside of
+``[.*{}[]?/\_a-zA-Z0-9\x80-\xff]`` or if they match one of the
+predefined predicates. This generally applies to file patterns other
+than globs and arguments for predicates.
+
+Special characters can be used in quoted identifiers by escaping them,
+e.g., ``\n`` is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``.
+
+There is a single prefix operator:
+
+``not x``
+ Files not in x. Short form is ``! x``.
+
+These are the supported infix operators:
+
+``x and y``
+ The intersection of files in x and y. Short form is ``x & y``.
+
+``x or y``
+ The union of files in x and y. There are two alternative short
+ forms: ``x | y`` and ``x + y``.
+
+``x - y``
+ Files in x but not in y.
+
+The following predicates are supported:
+
+.. predicatesmarker
+
+Some sample queries:
+
+- Show status of files that appear to be binary in the working directory::
+
+ hg status -A "set:binary()"
+
+- Forget files that are in .hgignore but are already tracked::
+
+ hg forget "set:hgignore() and not ignored()"
+
+- Find text files that contain a string::
+
+ hg locate "set:grep(magic) and not binary()"
+
+- Find C files in a non-standard encoding::
+
+ hg locate "set:**.c and not encoding('UTF-8')"
+
+- Revert copies of large binary files::
+
+ hg revert "set:copied() and binary() and size('>1M')"
+
+- Remove files listed in foo.lst that contain the letter a or b::
+
+ hg remove "set: 'listfile:foo.lst' and (**a* or **b*)"
+
+See also :hg:`help patterns`.
diff --git a/mercurial/help/glossary.txt b/mercurial/help/glossary.txt
new file mode 100644
index 0000000..59a9d03
--- /dev/null
+++ b/mercurial/help/glossary.txt
@@ -0,0 +1,407 @@
+Ancestor
+ Any changeset that can be reached by an unbroken chain of parent
+ changesets from a given changeset. More precisely, the ancestors
+ of a changeset can be defined by two properties: a parent of a
+ changeset is an ancestor, and a parent of an ancestor is an
+ ancestor. See also: 'Descendant'.
+
+Bookmark
+ Bookmarks are pointers to certain commits that move when
+ committing. They are similar to tags in that it is possible to use
+ bookmark names in all places where Mercurial expects a changeset
+ ID, e.g., with :hg:`update`. Unlike tags, bookmarks move along
+ when you make a commit.
+
+ Bookmarks can be renamed, copied and deleted. Bookmarks are local,
+ unless they are explicitly pushed or pulled between repositories.
+ Pushing and pulling bookmarks allow you to collaborate with others
+ on a branch without creating a named branch.
+
+Branch
+ (Noun) A child changeset that has been created from a parent that
+ is not a head. These are known as topological branches, see
+ 'Branch, topological'. If a topological branch is named, it becomes
+ a named branch. If a topological branch is not named, it becomes
+ an anonymous branch. See 'Branch, anonymous' and 'Branch, named'.
+
+ Branches may be created when changes are pulled from or pushed to
+ a remote repository, since new heads may be created by these
+ operations. Note that the term branch can also be used informally
+ to describe a development process in which certain development is
+ done independently of other development. This is sometimes done
+ explicitly with a named branch, but it can also be done locally,
+ using bookmarks or clones and anonymous branches.
+
+ Example: "The experimental branch".
+
+ (Verb) The action of creating a child changeset which results in
+ its parent having more than one child.
+
+ Example: "I'm going to branch at X".
+
+Branch, anonymous
+ Every time a new child changeset is created from a parent that is not
+ a head and the name of the branch is not changed, a new anonymous
+ branch is created.
+
+Branch, closed
+ A named branch whose branch heads have all been closed.
+
+Branch, default
+ The branch assigned to a changeset when no name has previously been
+ assigned.
+
+Branch head
+ See 'Head, branch'.
+
+Branch, inactive
+ If a named branch has no topological heads, it is considered to be
+ inactive. As an example, a feature branch becomes inactive when it
+ is merged into the default branch. The :hg:`branches` command
+ shows inactive branches by default, though they can be hidden with
+ :hg:`branches --active`.
+
+ NOTE: this concept is deprecated because it is too implicit.
+ Branches should now be explicitly closed using :hg:`commit
+ --close-branch` when they are no longer needed.
+
+Branch, named
+ A collection of changesets which have the same branch name. By
+ default, children of a changeset in a named branch belong to the
+ same named branch. A child can be explicitly assigned to a
+ different branch. See :hg:`help branch`, :hg:`help branches` and
+ :hg:`commit --close-branch` for more information on managing
+ branches.
+
+ Named branches can be thought of as a kind of namespace, dividing
+ the collection of changesets that comprise the repository into a
+ collection of disjoint subsets. A named branch is not necessarily
+ a topological branch. If a new named branch is created from the
+ head of another named branch, or the default branch, but no
+ further changesets are added to that previous branch, then that
+ previous branch will be a branch in name only.
+
+Branch tip
+ See 'Tip, branch'.
+
+Branch, topological
+ Every time a new child changeset is created from a parent that is
+ not a head, a new topological branch is created. If a topological
+ branch is named, it becomes a named branch. If a topological
+ branch is not named, it becomes an anonymous branch of the
+ current, possibly default, branch.
+
+Changelog
+ A record of the changesets in the order in which they were added
+ to the repository. This includes details such as changeset id,
+ author, commit message, date, and list of changed files.
+
+Changeset
+ A snapshot of the state of the repository used to record a change.
+
+Changeset, child
+ The converse of parent changeset: if P is a parent of C, then C is
+ a child of P. There is no limit to the number of children that a
+ changeset may have.
+
+Changeset id
+ A SHA-1 hash that uniquely identifies a changeset. It may be
+ represented as either a "long" 40 hexadecimal digit string, or a
+ "short" 12 hexadecimal digit string.
+
+Changeset, merge
+ A changeset with two parents. This occurs when a merge is
+ committed.
+
+Changeset, parent
+ A revision upon which a child changeset is based. Specifically, a
+ parent changeset of a changeset C is a changeset whose node
+ immediately precedes C in the DAG. Changesets have at most two
+ parents.
+
+Checkout
+ (Noun) The working directory being updated to a specific
+ revision. This use should probably be avoided where possible, as
+ changeset is much more appropriate than checkout in this context.
+
+ Example: "I'm using checkout X."
+
+ (Verb) Updating the working directory to a specific changeset. See
+ :hg:`help update`.
+
+ Example: "I'm going to check out changeset X."
+
+Child changeset
+ See 'Changeset, child'.
+
+Close changeset
+ See 'Head, closed branch'
+
+Closed branch
+ See 'Branch, closed'.
+
+Clone
+ (Noun) An entire or partial copy of a repository. The partial
+ clone must be in the form of a revision and its ancestors.
+
+ Example: "Is your clone up to date?".
+
+ (Verb) The process of creating a clone, using :hg:`clone`.
+
+ Example: "I'm going to clone the repository".
+
+Closed branch head
+ See 'Head, closed branch'.
+
+Commit
+ (Noun) A synonym for changeset.
+
+ Example: "Is the bug fixed in your recent commit?"
+
+ (Verb) The act of recording changes to a repository. When files
+ are committed in a working directory, Mercurial finds the
+ differences between the committed files and their parent
+ changeset, creating a new changeset in the repository.
+
+ Example: "You should commit those changes now."
+
+Cset
+ A common abbreviation of the term changeset.
+
+DAG
+ The repository of changesets of a distributed version control
+ system (DVCS) can be described as a directed acyclic graph (DAG),
+ consisting of nodes and edges, where nodes correspond to
+ changesets and edges imply a parent -> child relation. This graph
+ can be visualized by graphical tools such as :hg:`glog`
+ (graphlog). In Mercurial, the DAG is limited by the requirement
+ for children to have at most two parents.
+
+Default branch
+ See 'Branch, default'.
+
+Descendant
+ Any changeset that can be reached by a chain of child changesets
+ from a given changeset. More precisely, the descendants of a
+ changeset can be defined by two properties: the child of a
+ changeset is a descendant, and the child of a descendant is a
+ descendant. See also: 'Ancestor'.
+
+Diff
+ (Noun) The difference between the contents and attributes of files
+ in two changesets or a changeset and the current working
+ directory. The difference is usually represented in a standard
+ form called a "diff" or "patch". The "git diff" format is used
+ when the changes include copies, renames, or changes to file
+ attributes, none of which can be represented/handled by classic
+ "diff" and "patch".
+
+ Example: "Did you see my correction in the diff?"
+
+ (Verb) Diffing two changesets is the action of creating a diff or
+ patch.
+
+ Example: "If you diff with changeset X, you will see what I mean."
+
+Directory, working
+ The working directory represents the state of the files tracked by
+ Mercurial, that will be recorded in the next commit. The working
+ directory initially corresponds to the snapshot at an existing
+ changeset, known as the parent of the working directory. See
+ 'Parent, working directory'. The state may be modified by changes
+ to the files introduced manually or by a merge. The repository
+ metadata exists in the .hg directory inside the working directory.
+
+Draft
+ Changesets in the draft phase have not been shared with publishing
+ repositories and may thus be safely changed by history-modifying
+ extensions. See :hg:`help phases`.
+
+Graph
+ See DAG and :hg:`help graphlog`.
+
+Head
+ The term 'head' may be used to refer to both a branch head or a
+ repository head, depending on the context. See 'Head, branch' and
+ 'Head, repository' for specific definitions.
+
+ Heads are where development generally takes place and are the
+ usual targets for update and merge operations.
+
+Head, branch
+ A changeset with no descendants on the same named branch.
+
+Head, closed branch
+ A changeset that marks a head as no longer interesting. The closed
+ head is no longer listed by :hg:`heads`. A branch is considered
+ closed when all its heads are closed and consequently is not
+ listed by :hg:`branches`.
+
+ Closed heads can be re-opened by committing new changeset as the
+ child of the changeset that marks a head as closed.
+
+Head, repository
+ A topological head which has not been closed.
+
+Head, topological
+ A changeset with no children in the repository.
+
+History, immutable
+ Once committed, changesets cannot be altered. Extensions which
+ appear to change history actually create new changesets that
+ replace existing ones, and then destroy the old changesets. Doing
+ so in public repositories can result in old changesets being
+ reintroduced to the repository.
+
+History, rewriting
+ The changesets in a repository are immutable. However, extensions
+ to Mercurial can be used to alter the repository, usually in such
+ a way as to preserve changeset contents.
+
+Immutable history
+ See 'History, immutable'.
+
+Merge changeset
+ See 'Changeset, merge'.
+
+Manifest
+ Each changeset has a manifest, which is the list of files that are
+ tracked by the changeset.
+
+Merge
+ Used to bring together divergent branches of work. When you update
+ to a changeset and then merge another changeset, you bring the
+ history of the latter changeset into your working directory. Once
+ conflicts are resolved (and marked), this merge may be committed
+ as a merge changeset, bringing two branches together in the DAG.
+
+Named branch
+ See 'Branch, named'.
+
+Null changeset
+ The empty changeset. It is the parent state of newly-initialized
+ repositories and repositories with no checked out revision. It is
+ thus the parent of root changesets and the effective ancestor when
+ merging unrelated changesets. Can be specified by the alias 'null'
+ or by the changeset ID '000000000000'.
+
+Parent
+ See 'Changeset, parent'.
+
+Parent changeset
+ See 'Changeset, parent'.
+
+Parent, working directory
+ The working directory parent reflects a virtual revision which is
+ the child of the changeset (or two changesets with an uncommitted
+ merge) shown by :hg:`parents`. This is changed with
+ :hg:`update`. Other commands to see the working directory parent
+ are :hg:`summary` and :hg:`id`. Can be specified by the alias ".".
+
+Patch
+ (Noun) The product of a diff operation.
+
+ Example: "I've sent you my patch."
+
+ (Verb) The process of using a patch file to transform one
+ changeset into another.
+
+ Example: "You will need to patch that revision."
+
+Phase
+ A per-changeset state tracking how the changeset has been or
+ should be shared. See :hg:`help phases`.
+
+Public
+ Changesets in the public phase have been shared with publishing
+ repositories and are therefore considered immutable. See :hg:`help
+ phases`.
+
+Pull
+ An operation in which changesets in a remote repository which are
+ not in the local repository are brought into the local
+ repository. Note that this operation without special arguments
+ only updates the repository, it does not update the files in the
+ working directory. See :hg:`help pull`.
+
+Push
+ An operation in which changesets in a local repository which are
+ not in a remote repository are sent to the remote repository. Note
+ that this operation only adds changesets which have been committed
+ locally to the remote repository. Uncommitted changes are not
+ sent. See :hg:`help push`.
+
+Repository
+ The metadata describing all recorded states of a collection of
+ files. Each recorded state is represented by a changeset. A
+ repository is usually (but not always) found in the ``.hg``
+ subdirectory of a working directory. Any recorded state can be
+ recreated by "updating" a working directory to a specific
+ changeset.
+
+Repository head
+ See 'Head, repository'.
+
+Revision
+ A state of the repository at some point in time. Earlier revisions
+ can be updated to by using :hg:`update`. See also 'Revision
+ number'; See also 'Changeset'.
+
+Revision number
+ This integer uniquely identifies a changeset in a specific
+ repository. It represents the order in which changesets were added
+ to a repository, starting with revision number 0. Note that the
+ revision number may be different in each clone of a repository. To
+ identify changesets uniquely between different clones, see
+ 'Changeset id'.
+
+Revlog
+ History storage mechanism used by Mercurial. It is a form of delta
+ encoding, with occasional full revision of data followed by delta
+ of each successive revision. It includes data and an index
+ pointing to the data.
+
+Rewriting history
+ See 'History, rewriting'.
+
+Root
+ A changeset that has only the null changeset as its parent. Most
+ repositories have only a single root changeset.
+
+Secret
+ Changesets in the secret phase may not be shared via push, pull,
+ or clone. See :hg:`help phases`.
+
+Tag
+ An alternative name given to a changeset. Tags can be used in all
+ places where Mercurial expects a changeset ID, e.g., with
+ :hg:`update`. The creation of a tag is stored in the history and
+ will thus automatically be shared with other using push and pull.
+
+Tip
+ The changeset with the highest revision number. It is the changeset
+ most recently added in a repository.
+
+Tip, branch
+ The head of a given branch with the highest revision number. When
+ a branch name is used as a revision identifier, it refers to the
+ branch tip. See also 'Branch, head'. Note that because revision
+ numbers may be different in different repository clones, the
+ branch tip may be different in different cloned repositories.
+
+Update
+ (Noun) Another synonym of changeset.
+
+ Example: "I've pushed an update".
+
+ (Verb) This term is usually used to describe updating the state of
+ the working directory to that of a specific changeset. See
+ :hg:`help update`.
+
+ Example: "You should update".
+
+Working directory
+ See 'Directory, working'.
+
+Working directory parent
+ See 'Parent, working directory'.
diff --git a/mercurial/help/hgignore.txt b/mercurial/help/hgignore.txt
new file mode 100644
index 0000000..3f82177
--- /dev/null
+++ b/mercurial/help/hgignore.txt
@@ -0,0 +1,89 @@
+Synopsis
+========
+
+The Mercurial system uses a file called ``.hgignore`` in the root
+directory of a repository to control its behavior when it searches
+for files that it is not currently tracking.
+
+Description
+===========
+
+The working directory of a Mercurial repository will often contain
+files that should not be tracked by Mercurial. These include backup
+files created by editors and build products created by compilers.
+These files can be ignored by listing them in a ``.hgignore`` file in
+the root of the working directory. The ``.hgignore`` file must be
+created manually. It is typically put under version control, so that
+the settings will propagate to other repositories with push and pull.
+
+An untracked file is ignored if its path relative to the repository
+root directory, or any prefix path of that path, is matched against
+any pattern in ``.hgignore``.
+
+For example, say we have an untracked file, ``file.c``, at
+``a/b/file.c`` inside our repository. Mercurial will ignore ``file.c``
+if any pattern in ``.hgignore`` matches ``a/b/file.c``, ``a/b`` or ``a``.
+
+In addition, a Mercurial configuration file can reference a set of
+per-user or global ignore files. See the ``ignore`` configuration
+key on the ``[ui]`` section of :hg:`help config` for details of how to
+configure these files.
+
+To control Mercurial's handling of files that it manages, many
+commands support the ``-I`` and ``-X`` options; see
+:hg:`help <command>` and :hg:`help patterns` for details.
+
+Files that are already tracked are not affected by .hgignore, even
+if they appear in .hgignore. An untracked file X can be explicitly
+added with :hg:`add X`, even if X would be excluded by a pattern
+in .hgignore.
+
+Syntax
+======
+
+An ignore file is a plain text file consisting of a list of patterns,
+with one pattern per line. Empty lines are skipped. The ``#``
+character is treated as a comment character, and the ``\`` character
+is treated as an escape character.
+
+Mercurial supports several pattern syntaxes. The default syntax used
+is Python/Perl-style regular expressions.
+
+To change the syntax used, use a line of the following form::
+
+ syntax: NAME
+
+where ``NAME`` is one of the following:
+
+``regexp``
+ Regular expression, Python/Perl syntax.
+``glob``
+ Shell-style glob.
+
+The chosen syntax stays in effect when parsing all patterns that
+follow, until another syntax is selected.
+
+Neither glob nor regexp patterns are rooted. A glob-syntax pattern of
+the form ``*.c`` will match a file ending in ``.c`` in any directory,
+and a regexp pattern of the form ``\.c$`` will do the same. To root a
+regexp pattern, start it with ``^``.
+
+.. note::
+ Patterns specified in other than ``.hgignore`` are always rooted.
+ Please see :hg:`help patterns` for details.
+
+Example
+=======
+
+Here is an example ignore file. ::
+
+ # use glob syntax.
+ syntax: glob
+
+ *.elc
+ *.pyc
+ *~
+
+ # switch to regexp syntax.
+ syntax: regexp
+ ^\.pc/
diff --git a/mercurial/help/hgweb.txt b/mercurial/help/hgweb.txt
new file mode 100644
index 0000000..9ac557e
--- /dev/null
+++ b/mercurial/help/hgweb.txt
@@ -0,0 +1,50 @@
+Mercurial's internal web server, hgweb, can serve either a single
+repository, or a tree of repositories. In the second case, repository
+paths and global options can be defined using a dedicated
+configuration file common to :hg:`serve`, ``hgweb.wsgi``,
+``hgweb.cgi`` and ``hgweb.fcgi``.
+
+This file uses the same syntax as other Mercurial configuration files
+but recognizes only the following sections:
+
+ - web
+ - paths
+ - collections
+
+The ``web`` options are thorougly described in :hg:`help config`.
+
+The ``paths`` section maps URL paths to paths of repositories in the
+filesystem. hgweb will not expose the filesystem directly - only
+Mercurial repositories can be published and only according to the
+configuration.
+
+The left hand side is the path in the URL. Note that hgweb reserves
+subpaths like ``rev`` or ``file``, try using different names for
+nested repositories to avoid confusing effects.
+
+The right hand side is the path in the filesystem. If the specified
+path ends with ``*`` or ``**`` the filesystem will be searched
+recursively for repositories below that point.
+With ``*`` it will not recurse into the repositories it finds (except for
+``.hg/patches``).
+With ``**`` it will also search inside repository working directories
+and possibly find subrepositories.
+
+In this example::
+
+ [paths]
+ /projects/a = /srv/tmprepos/a
+ /projects/b = c:/repos/b
+ / = /srv/repos/*
+ /user/bob = /home/bob/repos/**
+
+- The first two entries make two repositories in different directories
+ appear under the same directory in the web interface
+- The third entry will publish every Mercurial repository found in
+ ``/srv/repos/``, for instance the repository ``/srv/repos/quux/``
+ will appear as ``http://server/quux/``
+- The fourth entry will publish both ``http://server/user/bob/quux/``
+ and ``http://server/user/bob/quux/testsubrepo/``
+
+The ``collections`` section is deprecated and has been superseeded by
+``paths``.
diff --git a/mercurial/help/merge-tools.txt b/mercurial/help/merge-tools.txt
new file mode 100644
index 0000000..b7ed1ea
--- /dev/null
+++ b/mercurial/help/merge-tools.txt
@@ -0,0 +1,84 @@
+To merge files Mercurial uses merge tools.
+
+A merge tool combines two different versions of a file into a merged
+file. Merge tools are given the two files and the greatest common
+ancestor of the two file versions, so they can determine the changes
+made on both branches.
+
+Merge tools are used both for :hg:`resolve`, :hg:`merge`, :hg:`update`,
+:hg:`backout` and in several extensions.
+
+Usually, the merge tool tries to automatically reconcile the files by
+combining all non-overlapping changes that occurred separately in
+the two different evolutions of the same initial base file. Furthermore, some
+interactive merge programs make it easier to manually resolve
+conflicting merges, either in a graphical way, or by inserting some
+conflict markers. Mercurial does not include any interactive merge
+programs but relies on external tools for that.
+
+Available merge tools
+=====================
+
+External merge tools and their properties are configured in the
+merge-tools configuration section - see hgrc(5) - but they can often just
+be named by their executable.
+
+A merge tool is generally usable if its executable can be found on the
+system and if it can handle the merge. The executable is found if it
+is an absolute or relative executable path or the name of an
+application in the executable search path. The tool is assumed to be
+able to handle the merge if it can handle symlinks if the file is a
+symlink, if it can handle binary files if the file is binary, and if a
+GUI is available if the tool requires a GUI.
+
+There are some internal merge tools which can be used. The internal
+merge tools are:
+
+.. internaltoolsmarker
+
+Internal tools are always available and do not require a GUI but will by default
+not handle symlinks or binary files.
+
+Choosing a merge tool
+=====================
+
+Mercurial uses these rules when deciding which merge tool to use:
+
+1. If a tool has been specified with the --tool option to merge or resolve, it
+ is used. If it is the name of a tool in the merge-tools configuration, its
+ configuration is used. Otherwise the specified tool must be executable by
+ the shell.
+
+2. If the ``HGMERGE`` environment variable is present, its value is used and
+ must be executable by the shell.
+
+3. If the filename of the file to be merged matches any of the patterns in the
+ merge-patterns configuration section, the first usable merge tool
+ corresponding to a matching pattern is used. Here, binary capabilities of the
+ merge tool are not considered.
+
+4. If ui.merge is set it will be considered next. If the value is not the name
+ of a configured tool, the specified value is used and must be executable by
+ the shell. Otherwise the named tool is used if it is usable.
+
+5. If any usable merge tools are present in the merge-tools configuration
+ section, the one with the highest priority is used.
+
+6. If a program named ``hgmerge`` can be found on the system, it is used - but
+ it will by default not be used for symlinks and binary files.
+
+7. If the file to be merged is not binary and is not a symlink, then
+ ``internal:merge`` is used.
+
+8. The merge of the file fails and must be resolved before commit.
+
+.. note::
+ After selecting a merge program, Mercurial will by default attempt
+ to merge the files using a simple merge algorithm first. Only if it doesn't
+ succeed because of conflicting changes Mercurial will actually execute the
+ merge program. Whether to use the simple merge algorithm first can be
+ controlled by the premerge setting of the merge tool. Premerge is enabled by
+ default unless the file is binary or a symlink.
+
+See the merge-tools and ui sections of hgrc(5) for details on the
+configuration of merge tools.
diff --git a/mercurial/help/multirevs.txt b/mercurial/help/multirevs.txt
new file mode 100644
index 0000000..c8a2833
--- /dev/null
+++ b/mercurial/help/multirevs.txt
@@ -0,0 +1,13 @@
+When Mercurial accepts more than one revision, they may be specified
+individually, or provided as a topologically continuous range,
+separated by the ":" character.
+
+The syntax of range notation is [BEGIN]:[END], where BEGIN and END are
+revision identifiers. Both BEGIN and END are optional. If BEGIN is not
+specified, it defaults to revision number 0. If END is not specified,
+it defaults to the tip. The range ":" thus means "all revisions".
+
+If BEGIN is greater than END, revisions are treated in reverse order.
+
+A range acts as a closed interval. This means that a range of 3:5
+gives 3, 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.
diff --git a/mercurial/help/patterns.txt b/mercurial/help/patterns.txt
new file mode 100644
index 0000000..30133a3
--- /dev/null
+++ b/mercurial/help/patterns.txt
@@ -0,0 +1,57 @@
+Mercurial accepts several notations for identifying one or more files
+at a time.
+
+By default, Mercurial treats filenames as shell-style extended glob
+patterns.
+
+Alternate pattern notations must be specified explicitly.
+
+.. note::
+ Patterns specified in ``.hgignore`` are not rooted.
+ Please see :hg:`help hgignore` for details.
+
+To use a plain path name without any pattern matching, start it with
+``path:``. These path names must completely match starting at the
+current repository root.
+
+To use an extended glob, start a name with ``glob:``. Globs are rooted
+at the current directory; a glob such as ``*.c`` will only match files
+in the current directory ending with ``.c``.
+
+The supported glob syntax extensions are ``**`` to match any string
+across path separators and ``{a,b}`` to mean "a or b".
+
+To use a Perl/Python regular expression, start a name with ``re:``.
+Regexp pattern matching is anchored at the root of the repository.
+
+To read name patterns from a file, use ``listfile:`` or ``listfile0:``.
+The latter expects null delimited patterns while the former expects line
+feeds. Each string read from the file is itself treated as a file
+pattern.
+
+Plain examples::
+
+ path:foo/bar a name bar in a directory named foo in the root
+ of the repository
+ path:path:name a file or directory named "path:name"
+
+Glob examples::
+
+ glob:*.c any name ending in ".c" in the current directory
+ *.c any name ending in ".c" in the current directory
+ **.c any name ending in ".c" in any subdirectory of the
+ current directory including itself.
+ foo/*.c any name ending in ".c" in the directory foo
+ foo/**.c any name ending in ".c" in any subdirectory of foo
+ including itself.
+
+Regexp examples::
+
+ re:.*\.c$ any name ending in ".c", anywhere in the repository
+
+File examples::
+
+ listfile:list.txt read list from list.txt with one file pattern per line
+ listfile0:list.txt read list from list.txt with null byte delimiters
+
+See also :hg:`help filesets`.
diff --git a/mercurial/help/phases.txt b/mercurial/help/phases.txt
new file mode 100644
index 0000000..19023dc
--- /dev/null
+++ b/mercurial/help/phases.txt
@@ -0,0 +1,84 @@
+What are phases?
+================
+
+Phases are a system for tracking which changesets have been or should
+be shared. This helps prevent common mistakes when modifying history
+(for instance, with the mq or rebase extensions).
+
+Each changeset in a repository is in one of the following phases:
+
+ - public : changeset is visible on a public server
+ - draft : changeset is not yet published
+ - secret : changeset should not be pushed, pulled, or cloned
+
+These phases are ordered (public < draft < secret) and no changeset
+can be in a lower phase than its ancestors. For instance, if a
+changeset is public, all its ancestors are also public. Lastly,
+changeset phases should only be changed towards the public phase.
+
+How are phases managed?
+=======================
+
+For the most part, phases should work transparently. By default, a
+changeset is created in the draft phase and is moved into the public
+phase when it is pushed to another repository.
+
+Once changesets become public, extensions like mq and rebase will
+refuse to operate on them to prevent creating duplicate changesets.
+Phases can also be manually manipulated with the :hg:`phase` command
+if needed. See :hg:`help -v phase` for examples.
+
+Phases and servers
+==================
+
+Normally, all servers are ``publishing`` by default. This means::
+
+ - all draft changesets that are pulled or cloned appear in phase
+ public on the client
+
+ - all draft changesets that are pushed appear as public on both
+ client and server
+
+ - secret changesets are neither pushed, pulled, or cloned
+
+.. note::
+ Pulling a draft changeset from a publishing server does not mark it
+ as public on the server side due to the read-only nature of pull.
+
+Sometimes it may be desirable to push and pull changesets in the draft
+phase to share unfinished work. This can be done by setting a
+repository to disable publishing in its configuration file::
+
+ [phases]
+ publish = False
+
+See :hg:`help config` for more information on config files.
+
+.. note::
+ Servers running older versions of Mercurial are treated as
+ publishing.
+
+Examples
+========
+
+ - list changesets in draft or secret phase::
+
+ hg log -r "not public()"
+
+ - change all secret changesets to draft::
+
+ hg phase --draft "secret()"
+
+ - forcibly move the current changeset and descendants from public to draft::
+
+ hg phase --force --draft .
+
+ - show a list of changeset revision and phase::
+
+ hg log --template "{rev} {phase}\n"
+
+ - resynchronize draft changesets relative to a remote repository::
+
+ hg phase -fd 'outgoing(URL)'
+
+See :hg:`help phase` for more information on manually manipulating phases.
diff --git a/mercurial/help/revisions.txt b/mercurial/help/revisions.txt
new file mode 100644
index 0000000..f0c2cb2
--- /dev/null
+++ b/mercurial/help/revisions.txt
@@ -0,0 +1,29 @@
+Mercurial supports several ways to specify individual revisions.
+
+A plain integer is treated as a revision number. Negative integers are
+treated as sequential offsets from the tip, with -1 denoting the tip,
+-2 denoting the revision prior to the tip, and so forth.
+
+A 40-digit hexadecimal string is treated as a unique revision
+identifier.
+
+A hexadecimal string less than 40 characters long is treated as a
+unique revision identifier and is referred to as a short-form
+identifier. A short-form identifier is only valid if it is the prefix
+of exactly one full-length identifier.
+
+Any other string is treated as a bookmark, tag, or branch name. A
+bookmark is a movable pointer to a revision. A tag is a permanent name
+associated with a revision. A branch name denotes the tipmost revision
+of that branch. Bookmark, tag, and branch names must not contain the ":"
+character.
+
+The reserved name "tip" always identifies the most recent revision.
+
+The reserved name "null" indicates the null revision. This is the
+revision of an empty repository, and the parent of revision 0.
+
+The reserved name "." indicates the working directory parent. If no
+working directory is checked out, it is equivalent to null. If an
+uncommitted merge is in progress, "." is the revision of the first
+parent.
diff --git a/mercurial/help/revsets.txt b/mercurial/help/revsets.txt
new file mode 100644
index 0000000..6511668
--- /dev/null
+++ b/mercurial/help/revsets.txt
@@ -0,0 +1,121 @@
+Mercurial supports a functional language for selecting a set of
+revisions.
+
+The language supports a number of predicates which are joined by infix
+operators. Parenthesis can be used for grouping.
+
+Identifiers such as branch names may need quoting with single or
+double quotes if they contain characters like ``-`` or if they match
+one of the predefined predicates.
+
+Special characters can be used in quoted identifiers by escaping them,
+e.g., ``\n`` is interpreted as a newline. To prevent them from being
+interpreted, strings can be prefixed with ``r``, e.g. ``r'...'``.
+
+There is a single prefix operator:
+
+``not x``
+ Changesets not in x. Short form is ``! x``.
+
+These are the supported infix operators:
+
+``x::y``
+ A DAG range, meaning all changesets that are descendants of x and
+ ancestors of y, including x and y themselves. If the first endpoint
+ is left out, this is equivalent to ``ancestors(y)``, if the second
+ is left out it is equivalent to ``descendants(x)``.
+
+ An alternative syntax is ``x..y``.
+
+``x:y``
+ All changesets with revision numbers between x and y, both
+ inclusive. Either endpoint can be left out, they default to 0 and
+ tip.
+
+``x and y``
+ The intersection of changesets in x and y. Short form is ``x & y``.
+
+``x or y``
+ The union of changesets in x and y. There are two alternative short
+ forms: ``x | y`` and ``x + y``.
+
+``x - y``
+ Changesets in x but not in y.
+
+``x^n``
+ The nth parent of x, n == 0, 1, or 2.
+ For n == 0, x; for n == 1, the first parent of each changeset in x;
+ for n == 2, the second parent of changeset in x.
+
+``x~n``
+ The nth first ancestor of x; ``x~0`` is x; ``x~3`` is ``x^^^``.
+
+There is a single postfix operator:
+
+``x^``
+ Equivalent to ``x^1``, the first parent of each changeset in x.
+
+
+The following predicates are supported:
+
+.. predicatesmarker
+
+New predicates (known as "aliases") can be defined, using any combination of
+existing predicates or other aliases. An alias definition looks like::
+
+ <alias> = <definition>
+
+in the ``revsetalias`` section of a Mercurial configuration file. Arguments
+of the form `$1`, `$2`, etc. are substituted from the alias into the
+definition.
+
+For example,
+
+::
+
+ [revsetalias]
+ h = heads()
+ d($1) = sort($1, date)
+ rs($1, $2) = reverse(sort($1, $2))
+
+defines three aliases, ``h``, ``d``, and ``rs``. ``rs(0:tip, author)`` is
+exactly equivalent to ``reverse(sort(0:tip, author))``.
+
+Command line equivalents for :hg:`log`::
+
+ -f -> ::.
+ -d x -> date(x)
+ -k x -> keyword(x)
+ -m -> merge()
+ -u x -> user(x)
+ -b x -> branch(x)
+ -P x -> !::x
+ -l x -> limit(expr, x)
+
+Some sample queries:
+
+- Changesets on the default branch::
+
+ hg log -r "branch(default)"
+
+- Changesets on the default branch since tag 1.5 (excluding merges)::
+
+ hg log -r "branch(default) and 1.5:: and not merge()"
+
+- Open branch heads::
+
+ hg log -r "head() and not closed()"
+
+- Changesets between tags 1.3 and 1.5 mentioning "bug" that affect
+ ``hgext/*``::
+
+ hg log -r "1.3::1.5 and keyword(bug) and file('hgext/*')"
+
+- Changesets committed in May 2008, sorted by user::
+
+ hg log -r "sort(date('May 2008'), user)"
+
+- Changesets mentioning "bug" or "issue" that are not in a tagged
+ release::
+
+ hg log -r "(keyword(bug) or keyword(issue)) and not ancestors(tagged())"
diff --git a/mercurial/help/subrepos.txt b/mercurial/help/subrepos.txt
new file mode 100644
index 0000000..bf5925a
--- /dev/null
+++ b/mercurial/help/subrepos.txt
@@ -0,0 +1,142 @@
+Subrepositories let you nest external repositories or projects into a
+parent Mercurial repository, and make commands operate on them as a
+group.
+
+Mercurial currently supports Mercurial, Git, and Subversion
+subrepositories.
+
+Subrepositories are made of three components:
+
+1. Nested repository checkouts. They can appear anywhere in the
+ parent working directory.
+
+2. Nested repository references. They are defined in ``.hgsub``, which
+ should be placed in the root of working directory, and
+ tell where the subrepository checkouts come from. Mercurial
+ subrepositories are referenced like:
+
+ path/to/nested = https://example.com/nested/repo/path
+
+ Git and Subversion subrepos are also supported:
+
+ path/to/nested = [git]git://example.com/nested/repo/path
+ path/to/nested = [svn]https://example.com/nested/trunk/path
+
+ where ``path/to/nested`` is the checkout location relatively to the
+ parent Mercurial root, and ``https://example.com/nested/repo/path``
+ is the source repository path. The source can also reference a
+ filesystem path.
+
+ Note that ``.hgsub`` does not exist by default in Mercurial
+ repositories, you have to create and add it to the parent
+ repository before using subrepositories.
+
+3. Nested repository states. They are defined in ``.hgsubstate``, which
+ is placed in the root of working directory, and
+ capture whatever information is required to restore the
+ subrepositories to the state they were committed in a parent
+ repository changeset. Mercurial automatically record the nested
+ repositories states when committing in the parent repository.
+
+ .. note::
+ The ``.hgsubstate`` file should not be edited manually.
+
+
+Adding a Subrepository
+======================
+
+If ``.hgsub`` does not exist, create it and add it to the parent
+repository. Clone or checkout the external projects where you want it
+to live in the parent repository. Edit ``.hgsub`` and add the
+subrepository entry as described above. At this point, the
+subrepository is tracked and the next commit will record its state in
+``.hgsubstate`` and bind it to the committed changeset.
+
+Synchronizing a Subrepository
+=============================
+
+Subrepos do not automatically track the latest changeset of their
+sources. Instead, they are updated to the changeset that corresponds
+with the changeset checked out in the top-level changeset. This is so
+developers always get a consistent set of compatible code and
+libraries when they update.
+
+Thus, updating subrepos is a manual process. Simply check out target
+subrepo at the desired revision, test in the top-level repo, then
+commit in the parent repository to record the new combination.
+
+Deleting a Subrepository
+========================
+
+To remove a subrepository from the parent repository, delete its
+reference from ``.hgsub``, then remove its files.
+
+Interaction with Mercurial Commands
+===================================
+
+:add: add does not recurse in subrepos unless -S/--subrepos is
+ specified. However, if you specify the full path of a file in a
+ subrepo, it will be added even without -S/--subrepos specified.
+ Git and Subversion subrepositories are currently silently
+ ignored.
+
+:archive: archive does not recurse in subrepositories unless
+ -S/--subrepos is specified.
+
+:commit: commit creates a consistent snapshot of the state of the
+ entire project and its subrepositories. If any subrepositories
+ have been modified, Mercurial will abort. Mercurial can be made
+ to instead commit all modified subrepositories by specifying
+ -S/--subrepos, or setting "ui.commitsubrepos=True" in a
+ configuration file (see :hg:`help config`). After there are no
+ longer any modified subrepositories, it records their state and
+ finally commits it in the parent repository.
+
+:diff: diff does not recurse in subrepos unless -S/--subrepos is
+ specified. Changes are displayed as usual, on the subrepositories
+ elements. Git and Subversion subrepositories are currently
+ silently ignored.
+
+:forget: forget currently only handles exact file matches in subrepos.
+ Git and Subversion subrepositories are currently silently ignored.
+
+:incoming: incoming does not recurse in subrepos unless -S/--subrepos
+ is specified. Git and Subversion subrepositories are currently
+ silently ignored.
+
+:outgoing: outgoing does not recurse in subrepos unless -S/--subrepos
+ is specified. Git and Subversion subrepositories are currently
+ silently ignored.
+
+:pull: pull is not recursive since it is not clear what to pull prior
+ to running :hg:`update`. Listing and retrieving all
+ subrepositories changes referenced by the parent repository pulled
+ changesets is expensive at best, impossible in the Subversion
+ case.
+
+:push: Mercurial will automatically push all subrepositories first
+ when the parent repository is being pushed. This ensures new
+ subrepository changes are available when referenced by top-level
+ repositories. Push is a no-op for Subversion subrepositories.
+
+:status: status does not recurse into subrepositories unless
+ -S/--subrepos is specified. Subrepository changes are displayed as
+ regular Mercurial changes on the subrepository
+ elements. Subversion subrepositories are currently silently
+ ignored.
+
+:update: update restores the subrepos in the state they were
+ originally committed in target changeset. If the recorded
+ changeset is not available in the current subrepository, Mercurial
+ will pull it in first before updating. This means that updating
+ can require network access when using subrepositories.
+
+Remapping Subrepositories Sources
+=================================
+
+A subrepository source location may change during a project life,
+invalidating references stored in the parent repository history. To
+fix this, rewriting rules can be defined in parent repository ``hgrc``
+file or in Mercurial configuration. See the ``[subpaths]`` section in
+hgrc(5) for more details.
+
diff --git a/mercurial/help/templates.txt b/mercurial/help/templates.txt
new file mode 100644
index 0000000..ffc7b34
--- /dev/null
+++ b/mercurial/help/templates.txt
@@ -0,0 +1,40 @@
+Mercurial allows you to customize output of commands through
+templates. You can either pass in a template from the command
+line, via the --template option, or select an existing
+template-style (--style).
+
+You can customize output for any "log-like" command: log,
+outgoing, incoming, tip, parents, heads and glog.
+
+Four styles are packaged with Mercurial: default (the style used
+when no explicit preference is passed), compact, changelog,
+and xml.
+Usage::
+
+ $ hg log -r1 --style changelog
+
+A template is a piece of text, with markup to invoke variable
+expansion::
+
+ $ hg log -r1 --template "{node}\n"
+ b56ce7b07c52de7d5fd79fb89701ea538af65746
+
+Strings in curly braces are called keywords. The availability of
+keywords depends on the exact context of the templater. These
+keywords are usually available for templating a log-like command:
+
+.. keywordsmarker
+
+The "date" keyword does not produce human-readable output. If you
+want to use a date in your output, you can use a filter to process
+it. Filters are functions which return a string based on the input
+variable. Be sure to use the stringify filter first when you're
+applying a string-input filter to a list-like input variable.
+You can also use a chain of filters to get the desired output::
+
+ $ hg tip --template "{date|isodate}\n"
+ 2008-08-21 18:22 +0000
+
+List of filters:
+
+.. filtersmarker
diff --git a/mercurial/help/urls.txt b/mercurial/help/urls.txt
new file mode 100644
index 0000000..016d5bd
--- /dev/null
+++ b/mercurial/help/urls.txt
@@ -0,0 +1,66 @@
+Valid URLs are of the form::
+
+ local/filesystem/path[#revision]
+ file://local/filesystem/path[#revision]
+ http://[user[:pass]@]host[:port]/[path][#revision]
+ https://[user[:pass]@]host[:port]/[path][#revision]
+ ssh://[user@]host[:port]/[path][#revision]
+
+Paths in the local filesystem can either point to Mercurial
+repositories or to bundle files (as created by :hg:`bundle` or :hg:`
+incoming --bundle`). See also :hg:`help paths`.
+
+An optional identifier after # indicates a particular branch, tag, or
+changeset to use from the remote repository. See also :hg:`help
+revisions`.
+
+Some features, such as pushing to http:// and https:// URLs are only
+possible if the feature is explicitly enabled on the remote Mercurial
+server.
+
+Note that the security of HTTPS URLs depends on proper configuration of
+web.cacerts.
+
+Some notes about using SSH with Mercurial:
+
+- SSH requires an accessible shell account on the destination machine
+ and a copy of hg in the remote path or specified with as remotecmd.
+- path is relative to the remote user's home directory by default. Use
+ an extra slash at the start of a path to specify an absolute path::
+
+ ssh://example.com//tmp/repository
+
+- Mercurial doesn't use its own compression via SSH; the right thing
+ to do is to configure it in your ~/.ssh/config, e.g.::
+
+ Host *.mylocalnetwork.example.com
+ Compression no
+ Host *
+ Compression yes
+
+ Alternatively specify "ssh -C" as your ssh command in your
+ configuration file or with the --ssh command line option.
+
+These URLs can all be stored in your configuration file with path
+aliases under the [paths] section like so::
+
+ [paths]
+ alias1 = URL1
+ alias2 = URL2
+ ...
+
+You can then use the alias for any command that uses a URL (for
+example :hg:`pull alias1` will be treated as :hg:`pull URL1`).
+
+Two path aliases are special because they are used as defaults when
+you do not provide the URL to a command:
+
+default:
+ When you create a repository with hg clone, the clone command saves
+ the location of the source repository as the new repository's
+ 'default' path. This is then used when you omit path from push- and
+ pull-like commands (including incoming and outgoing).
+
+default-push:
+ The push command will look for a path named 'default-push', and
+ prefer it over 'default' if both are defined.
diff --git a/mercurial/hg.py b/mercurial/hg.py
new file mode 100644
index 0000000..7d452df
--- /dev/null
+++ b/mercurial/hg.py
@@ -0,0 +1,598 @@
+# hg.py - repository classes for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+from lock import release
+from node import hex, nullid
+import localrepo, bundlerepo, httppeer, sshpeer, statichttprepo, bookmarks
+import lock, util, extensions, error, node, scmutil
+import cmdutil, discovery
+import merge as mergemod
+import verify as verifymod
+import errno, os, shutil
+
+def _local(path):
+ path = util.expandpath(util.urllocalpath(path))
+ return (os.path.isfile(path) and bundlerepo or localrepo)
+
+def addbranchrevs(lrepo, other, branches, revs):
+ peer = other.peer() # a courtesy to callers using a localrepo for other
+ hashbranch, branches = branches
+ if not hashbranch and not branches:
+ return revs or None, revs and revs[0] or None
+ revs = revs and list(revs) or []
+ if not peer.capable('branchmap'):
+ if branches:
+ raise util.Abort(_("remote branch lookup not supported"))
+ revs.append(hashbranch)
+ return revs, revs[0]
+ branchmap = peer.branchmap()
+
+ def primary(branch):
+ if branch == '.':
+ if not lrepo:
+ raise util.Abort(_("dirstate branch not accessible"))
+ branch = lrepo.dirstate.branch()
+ if branch in branchmap:
+ revs.extend(node.hex(r) for r in reversed(branchmap[branch]))
+ return True
+ else:
+ return False
+
+ for branch in branches:
+ if not primary(branch):
+ raise error.RepoLookupError(_("unknown branch '%s'") % branch)
+ if hashbranch:
+ if not primary(hashbranch):
+ revs.append(hashbranch)
+ return revs, revs[0]
+
+def parseurl(path, branches=None):
+ '''parse url#branch, returning (url, (branch, branches))'''
+
+ u = util.url(path)
+ branch = None
+ if u.fragment:
+ branch = u.fragment
+ u.fragment = None
+ return str(u), (branch, branches or [])
+
+schemes = {
+ 'bundle': bundlerepo,
+ 'file': _local,
+ 'http': httppeer,
+ 'https': httppeer,
+ 'ssh': sshpeer,
+ 'static-http': statichttprepo,
+}
+
+def _peerlookup(path):
+ u = util.url(path)
+ scheme = u.scheme or 'file'
+ thing = schemes.get(scheme) or schemes['file']
+ try:
+ return thing(path)
+ except TypeError:
+ return thing
+
+def islocal(repo):
+ '''return true if repo or path is local'''
+ if isinstance(repo, str):
+ try:
+ return _peerlookup(repo).islocal(repo)
+ except AttributeError:
+ return False
+ return repo.local()
+
+def _peerorrepo(ui, path, create=False):
+ """return a repository object for the specified path"""
+ obj = _peerlookup(path).instance(ui, path, create)
+ ui = getattr(obj, "ui", ui)
+ for name, module in extensions.extensions():
+ hook = getattr(module, 'reposetup', None)
+ if hook:
+ hook(ui, obj)
+ return obj
+
+def repository(ui, path='', create=False):
+ """return a repository object for the specified path"""
+ peer = _peerorrepo(ui, path, create)
+ repo = peer.local()
+ if not repo:
+ raise util.Abort(_("repository '%s' is not local") %
+ (path or peer.url()))
+ return repo
+
+def peer(uiorrepo, opts, path, create=False):
+ '''return a repository peer for the specified path'''
+ rui = remoteui(uiorrepo, opts)
+ return _peerorrepo(rui, path, create).peer()
+
+def defaultdest(source):
+ '''return default destination of clone if none is given'''
+ return os.path.basename(os.path.normpath(source))
+
+def share(ui, source, dest=None, update=True):
+ '''create a shared repository'''
+
+ if not islocal(source):
+ raise util.Abort(_('can only share local repositories'))
+
+ if not dest:
+ dest = defaultdest(source)
+ else:
+ dest = ui.expandpath(dest)
+
+ if isinstance(source, str):
+ origsource = ui.expandpath(source)
+ source, branches = parseurl(origsource)
+ srcrepo = repository(ui, source)
+ rev, checkout = addbranchrevs(srcrepo, srcrepo, branches, None)
+ else:
+ srcrepo = source.local()
+ origsource = source = srcrepo.url()
+ checkout = None
+
+ sharedpath = srcrepo.sharedpath # if our source is already sharing
+
+ root = os.path.realpath(dest)
+ roothg = os.path.join(root, '.hg')
+
+ if os.path.exists(roothg):
+ raise util.Abort(_('destination already exists'))
+
+ if not os.path.isdir(root):
+ os.mkdir(root)
+ util.makedir(roothg, notindexed=True)
+
+ requirements = ''
+ try:
+ requirements = srcrepo.opener.read('requires')
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+
+ requirements += 'shared\n'
+ util.writefile(os.path.join(roothg, 'requires'), requirements)
+ util.writefile(os.path.join(roothg, 'sharedpath'), sharedpath)
+
+ r = repository(ui, root)
+
+ default = srcrepo.ui.config('paths', 'default')
+ if default:
+ fp = r.opener("hgrc", "w", text=True)
+ fp.write("[paths]\n")
+ fp.write("default = %s\n" % default)
+ fp.close()
+
+ if update:
+ r.ui.status(_("updating working directory\n"))
+ if update is not True:
+ checkout = update
+ for test in (checkout, 'default', 'tip'):
+ if test is None:
+ continue
+ try:
+ uprev = r.lookup(test)
+ break
+ except error.RepoLookupError:
+ continue
+ _update(r, uprev)
+
+def copystore(ui, srcrepo, destpath):
+ '''copy files from store of srcrepo in destpath
+
+ returns destlock
+ '''
+ destlock = None
+ try:
+ hardlink = None
+ num = 0
+ srcpublishing = srcrepo.ui.configbool('phases', 'publish', True)
+ for f in srcrepo.store.copylist():
+ if srcpublishing and f.endswith('phaseroots'):
+ continue
+ src = os.path.join(srcrepo.sharedpath, f)
+ dst = os.path.join(destpath, f)
+ dstbase = os.path.dirname(dst)
+ if dstbase and not os.path.exists(dstbase):
+ os.mkdir(dstbase)
+ if os.path.exists(src):
+ if dst.endswith('data'):
+ # lock to avoid premature writing to the target
+ destlock = lock.lock(os.path.join(dstbase, "lock"))
+ hardlink, n = util.copyfiles(src, dst, hardlink)
+ num += n
+ if hardlink:
+ ui.debug("linked %d files\n" % num)
+ else:
+ ui.debug("copied %d files\n" % num)
+ return destlock
+ except: # re-raises
+ release(destlock)
+ raise
+
+def clone(ui, peeropts, source, dest=None, pull=False, rev=None,
+ update=True, stream=False, branch=None):
+ """Make a copy of an existing repository.
+
+ Create a copy of an existing repository in a new directory. The
+ source and destination are URLs, as passed to the repository
+ function. Returns a pair of repository peers, the source and
+ newly created destination.
+
+ The location of the source is added to the new repository's
+ .hg/hgrc file, as the default to be used for future pulls and
+ pushes.
+
+ If an exception is raised, the partly cloned/updated destination
+ repository will be deleted.
+
+ Arguments:
+
+ source: repository object or URL
+
+ dest: URL of destination repository to create (defaults to base
+ name of source repository)
+
+ pull: always pull from source repository, even in local case
+
+ stream: stream raw data uncompressed from repository (fast over
+ LAN, slow over WAN)
+
+ rev: revision to clone up to (implies pull=True)
+
+ update: update working directory after clone completes, if
+ destination is local repository (True means update to default rev,
+ anything else is treated as a revision)
+
+ branch: branches to clone
+ """
+
+ if isinstance(source, str):
+ origsource = ui.expandpath(source)
+ source, branch = parseurl(origsource, branch)
+ srcpeer = peer(ui, peeropts, source)
+ else:
+ srcpeer = source.peer() # in case we were called with a localrepo
+ branch = (None, branch or [])
+ origsource = source = srcpeer.url()
+ rev, checkout = addbranchrevs(srcpeer, srcpeer, branch, rev)
+
+ if dest is None:
+ dest = defaultdest(source)
+ ui.status(_("destination directory: %s\n") % dest)
+ else:
+ dest = ui.expandpath(dest)
+
+ dest = util.urllocalpath(dest)
+ source = util.urllocalpath(source)
+
+ if not dest:
+ raise util.Abort(_("empty destination path is not valid"))
+ if os.path.exists(dest):
+ if not os.path.isdir(dest):
+ raise util.Abort(_("destination '%s' already exists") % dest)
+ elif os.listdir(dest):
+ raise util.Abort(_("destination '%s' is not empty") % dest)
+
+ class DirCleanup(object):
+ def __init__(self, dir_):
+ self.rmtree = shutil.rmtree
+ self.dir_ = dir_
+ def close(self):
+ self.dir_ = None
+ def cleanup(self):
+ if self.dir_:
+ self.rmtree(self.dir_, True)
+
+ srclock = destlock = dircleanup = None
+ srcrepo = srcpeer.local()
+ try:
+ abspath = origsource
+ if islocal(origsource):
+ abspath = os.path.abspath(util.urllocalpath(origsource))
+
+ if islocal(dest):
+ dircleanup = DirCleanup(dest)
+
+ copy = False
+ if (srcrepo and srcrepo.cancopy() and islocal(dest)
+ and not srcrepo.revs("secret()")):
+ copy = not pull and not rev
+
+ if copy:
+ try:
+ # we use a lock here because if we race with commit, we
+ # can end up with extra data in the cloned revlogs that's
+ # not pointed to by changesets, thus causing verify to
+ # fail
+ srclock = srcrepo.lock(wait=False)
+ except error.LockError:
+ copy = False
+
+ if copy:
+ srcrepo.hook('preoutgoing', throw=True, source='clone')
+ hgdir = os.path.realpath(os.path.join(dest, ".hg"))
+ if not os.path.exists(dest):
+ os.mkdir(dest)
+ else:
+ # only clean up directories we create ourselves
+ dircleanup.dir_ = hgdir
+ try:
+ destpath = hgdir
+ util.makedir(destpath, notindexed=True)
+ except OSError, inst:
+ if inst.errno == errno.EEXIST:
+ dircleanup.close()
+ raise util.Abort(_("destination '%s' already exists")
+ % dest)
+ raise
+
+ destlock = copystore(ui, srcrepo, destpath)
+
+ # we need to re-init the repo after manually copying the data
+ # into it
+ destpeer = peer(ui, peeropts, dest)
+ srcrepo.hook('outgoing', source='clone',
+ node=node.hex(node.nullid))
+ else:
+ try:
+ destpeer = peer(ui, peeropts, dest, create=True)
+ except OSError, inst:
+ if inst.errno == errno.EEXIST:
+ dircleanup.close()
+ raise util.Abort(_("destination '%s' already exists")
+ % dest)
+ raise
+
+ revs = None
+ if rev:
+ if not srcpeer.capable('lookup'):
+ raise util.Abort(_("src repository does not support "
+ "revision lookup and so doesn't "
+ "support clone by revision"))
+ revs = [srcpeer.lookup(r) for r in rev]
+ checkout = revs[0]
+ if destpeer.local():
+ destpeer.local().clone(srcpeer, heads=revs, stream=stream)
+ elif srcrepo:
+ srcrepo.push(destpeer, revs=revs)
+ else:
+ raise util.Abort(_("clone from remote to remote not supported"))
+
+ if dircleanup:
+ dircleanup.close()
+
+ # clone all bookmarks except divergent ones
+ destrepo = destpeer.local()
+ if destrepo and srcpeer.capable("pushkey"):
+ rb = srcpeer.listkeys('bookmarks')
+ for k, n in rb.iteritems():
+ try:
+ m = destrepo.lookup(n)
+ destrepo._bookmarks[k] = m
+ except error.RepoLookupError:
+ pass
+ if rb:
+ bookmarks.write(destrepo)
+ elif srcrepo and destpeer.capable("pushkey"):
+ for k, n in srcrepo._bookmarks.iteritems():
+ destpeer.pushkey('bookmarks', k, '', hex(n))
+
+ if destrepo:
+ fp = destrepo.opener("hgrc", "w", text=True)
+ fp.write("[paths]\n")
+ u = util.url(abspath)
+ u.passwd = None
+ defaulturl = str(u)
+ fp.write("default = %s\n" % defaulturl)
+ fp.close()
+
+ destrepo.ui.setconfig('paths', 'default', defaulturl)
+
+ if update:
+ if update is not True:
+ checkout = srcrepo.lookup(update)
+ for test in (checkout, 'default', 'tip'):
+ if test is None:
+ continue
+ try:
+ uprev = destrepo.lookup(test)
+ break
+ except error.RepoLookupError:
+ continue
+ bn = destrepo[uprev].branch()
+ destrepo.ui.status(_("updating to branch %s\n") % bn)
+ _update(destrepo, uprev)
+
+ return srcpeer, destpeer
+ finally:
+ release(srclock, destlock)
+ if dircleanup is not None:
+ dircleanup.cleanup()
+ if srcpeer is not None:
+ srcpeer.close()
+
+def _showstats(repo, stats):
+ repo.ui.status(_("%d files updated, %d files merged, "
+ "%d files removed, %d files unresolved\n") % stats)
+
+def update(repo, node):
+ """update the working directory to node, merging linear changes"""
+ stats = mergemod.update(repo, node, False, False, None)
+ _showstats(repo, stats)
+ if stats[3]:
+ repo.ui.status(_("use 'hg resolve' to retry unresolved file merges\n"))
+ return stats[3] > 0
+
+# naming conflict in clone()
+_update = update
+
+def clean(repo, node, show_stats=True):
+ """forcibly switch the working directory to node, clobbering changes"""
+ stats = mergemod.update(repo, node, False, True, None)
+ if show_stats:
+ _showstats(repo, stats)
+ return stats[3] > 0
+
+def merge(repo, node, force=None, remind=True):
+ """Branch merge with node, resolving changes. Return true if any
+ unresolved conflicts."""
+ stats = mergemod.update(repo, node, True, force, False)
+ _showstats(repo, stats)
+ if stats[3]:
+ repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
+ "or 'hg update -C .' to abandon\n"))
+ elif remind:
+ repo.ui.status(_("(branch merge, don't forget to commit)\n"))
+ return stats[3] > 0
+
+def _incoming(displaychlist, subreporecurse, ui, repo, source,
+ opts, buffered=False):
+ """
+ Helper for incoming / gincoming.
+ displaychlist gets called with
+ (remoterepo, incomingchangesetlist, displayer) parameters,
+ and is supposed to contain only code that can't be unified.
+ """
+ source, branches = parseurl(ui.expandpath(source), opts.get('branch'))
+ other = peer(repo, opts, source)
+ ui.status(_('comparing with %s\n') % util.hidepassword(source))
+ revs, checkout = addbranchrevs(repo, other, branches, opts.get('rev'))
+
+ if revs:
+ revs = [other.lookup(rev) for rev in revs]
+ other, chlist, cleanupfn = bundlerepo.getremotechanges(ui, repo, other,
+ revs, opts["bundle"], opts["force"])
+ try:
+ if not chlist:
+ ui.status(_("no changes found\n"))
+ return subreporecurse()
+
+ displayer = cmdutil.show_changeset(ui, other, opts, buffered)
+
+ # XXX once graphlog extension makes it into core,
+ # should be replaced by a if graph/else
+ displaychlist(other, chlist, displayer)
+
+ displayer.close()
+ finally:
+ cleanupfn()
+ subreporecurse()
+ return 0 # exit code is zero since we found incoming changes
+
+def incoming(ui, repo, source, opts):
+ def subreporecurse():
+ ret = 1
+ if opts.get('subrepos'):
+ ctx = repo[None]
+ for subpath in sorted(ctx.substate):
+ sub = ctx.sub(subpath)
+ ret = min(ret, sub.incoming(ui, source, opts))
+ return ret
+
+ def display(other, chlist, displayer):
+ limit = cmdutil.loglimit(opts)
+ if opts.get('newest_first'):
+ chlist.reverse()
+ count = 0
+ for n in chlist:
+ if limit is not None and count >= limit:
+ break
+ parents = [p for p in other.changelog.parents(n) if p != nullid]
+ if opts.get('no_merges') and len(parents) == 2:
+ continue
+ count += 1
+ displayer.show(other[n])
+ return _incoming(display, subreporecurse, ui, repo, source, opts)
+
+def _outgoing(ui, repo, dest, opts):
+ dest = ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = parseurl(dest, opts.get('branch'))
+ ui.status(_('comparing with %s\n') % util.hidepassword(dest))
+ revs, checkout = addbranchrevs(repo, repo, branches, opts.get('rev'))
+ if revs:
+ revs = [repo.lookup(rev) for rev in scmutil.revrange(repo, revs)]
+
+ other = peer(repo, opts, dest)
+ outgoing = discovery.findcommonoutgoing(repo, other, revs,
+ force=opts.get('force'))
+ o = outgoing.missing
+ if not o:
+ scmutil.nochangesfound(repo.ui, repo, outgoing.excluded)
+ return None
+ return o
+
+def outgoing(ui, repo, dest, opts):
+ def recurse():
+ ret = 1
+ if opts.get('subrepos'):
+ ctx = repo[None]
+ for subpath in sorted(ctx.substate):
+ sub = ctx.sub(subpath)
+ ret = min(ret, sub.outgoing(ui, dest, opts))
+ return ret
+
+ limit = cmdutil.loglimit(opts)
+ o = _outgoing(ui, repo, dest, opts)
+ if o is None:
+ return recurse()
+
+ if opts.get('newest_first'):
+ o.reverse()
+ displayer = cmdutil.show_changeset(ui, repo, opts)
+ count = 0
+ for n in o:
+ if limit is not None and count >= limit:
+ break
+ parents = [p for p in repo.changelog.parents(n) if p != nullid]
+ if opts.get('no_merges') and len(parents) == 2:
+ continue
+ count += 1
+ displayer.show(repo[n])
+ displayer.close()
+ recurse()
+ return 0 # exit code is zero since we found outgoing changes
+
+def revert(repo, node, choose):
+ """revert changes to revision in node without updating dirstate"""
+ return mergemod.update(repo, node, False, True, choose)[3] > 0
+
+def verify(repo):
+ """verify the consistency of a repository"""
+ return verifymod.verify(repo)
+
+def remoteui(src, opts):
+ 'build a remote ui from ui or repo and opts'
+ if util.safehasattr(src, 'baseui'): # looks like a repository
+ dst = src.baseui.copy() # drop repo-specific config
+ src = src.ui # copy target options from repo
+ else: # assume it's a global ui object
+ dst = src.copy() # keep all global options
+
+ # copy ssh-specific options
+ for o in 'ssh', 'remotecmd':
+ v = opts.get(o) or src.config('ui', o)
+ if v:
+ dst.setconfig("ui", o, v)
+
+ # copy bundle-specific options
+ r = src.config('bundle', 'mainreporoot')
+ if r:
+ dst.setconfig('bundle', 'mainreporoot', r)
+
+ # copy selected local settings to the remote ui
+ for sect in ('auth', 'hostfingerprints', 'http_proxy'):
+ for key, val in src.configitems(sect):
+ dst.setconfig(sect, key, val)
+ v = src.config('web', 'cacerts')
+ if v:
+ dst.setconfig('web', 'cacerts', util.expandpath(v))
+
+ return dst
diff --git a/mercurial/hgweb/__init__.py b/mercurial/hgweb/__init__.py
new file mode 100644
index 0000000..dd4d089
--- /dev/null
+++ b/mercurial/hgweb/__init__.py
@@ -0,0 +1,31 @@
+# hgweb/__init__.py - web interface to a mercurial repository
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+import hgweb_mod, hgwebdir_mod
+
+def hgweb(config, name=None, baseui=None):
+ '''create an hgweb wsgi object
+
+ config can be one of:
+ - repo object (single repo view)
+ - path to repo (single repo view)
+ - path to config file (multi-repo view)
+ - dict of virtual:real pairs (multi-repo view)
+ - list of virtual:real tuples (multi-repo view)
+ '''
+
+ if ((isinstance(config, str) and not os.path.isdir(config)) or
+ isinstance(config, dict) or isinstance(config, list)):
+ # create a multi-dir interface
+ return hgwebdir_mod.hgwebdir(config, baseui=baseui)
+ return hgweb_mod.hgweb(config, name=name, baseui=baseui)
+
+def hgwebdir(config, baseui=None):
+ return hgwebdir_mod.hgwebdir(config, baseui=baseui)
+
diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py
new file mode 100644
index 0000000..3628c36
--- /dev/null
+++ b/mercurial/hgweb/common.py
@@ -0,0 +1,186 @@
+# hgweb/common.py - Utility functions needed by hgweb_mod and hgwebdir_mod
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import errno, mimetypes, os
+
+HTTP_OK = 200
+HTTP_NOT_MODIFIED = 304
+HTTP_BAD_REQUEST = 400
+HTTP_UNAUTHORIZED = 401
+HTTP_FORBIDDEN = 403
+HTTP_NOT_FOUND = 404
+HTTP_METHOD_NOT_ALLOWED = 405
+HTTP_SERVER_ERROR = 500
+
+
+def checkauthz(hgweb, req, op):
+ '''Check permission for operation based on request data (including
+ authentication info). Return if op allowed, else raise an ErrorResponse
+ exception.'''
+
+ user = req.env.get('REMOTE_USER')
+
+ deny_read = hgweb.configlist('web', 'deny_read')
+ if deny_read and (not user or deny_read == ['*'] or user in deny_read):
+ raise ErrorResponse(HTTP_UNAUTHORIZED, 'read not authorized')
+
+ allow_read = hgweb.configlist('web', 'allow_read')
+ result = (not allow_read) or (allow_read == ['*'])
+ if not (result or user in allow_read):
+ raise ErrorResponse(HTTP_UNAUTHORIZED, 'read not authorized')
+
+ if op == 'pull' and not hgweb.allowpull:
+ raise ErrorResponse(HTTP_UNAUTHORIZED, 'pull not authorized')
+ elif op == 'pull' or op is None: # op is None for interface requests
+ return
+
+ # enforce that you can only push using POST requests
+ if req.env['REQUEST_METHOD'] != 'POST':
+ msg = 'push requires POST request'
+ raise ErrorResponse(HTTP_METHOD_NOT_ALLOWED, msg)
+
+ # require ssl by default for pushing, auth info cannot be sniffed
+ # and replayed
+ scheme = req.env.get('wsgi.url_scheme')
+ if hgweb.configbool('web', 'push_ssl', True) and scheme != 'https':
+ raise ErrorResponse(HTTP_OK, 'ssl required')
+
+ deny = hgweb.configlist('web', 'deny_push')
+ if deny and (not user or deny == ['*'] or user in deny):
+ raise ErrorResponse(HTTP_UNAUTHORIZED, 'push not authorized')
+
+ allow = hgweb.configlist('web', 'allow_push')
+ result = allow and (allow == ['*'] or user in allow)
+ if not result:
+ raise ErrorResponse(HTTP_UNAUTHORIZED, 'push not authorized')
+
+# Hooks for hgweb permission checks; extensions can add hooks here.
+# Each hook is invoked like this: hook(hgweb, request, operation),
+# where operation is either read, pull or push. Hooks should either
+# raise an ErrorResponse exception, or just return.
+#
+# It is possible to do both authentication and authorization through
+# this.
+permhooks = [checkauthz]
+
+
+class ErrorResponse(Exception):
+ def __init__(self, code, message=None, headers=[]):
+ if message is None:
+ message = _statusmessage(code)
+ Exception.__init__(self)
+ self.code = code
+ self.message = message
+ self.headers = headers
+ def __str__(self):
+ return self.message
+
+class continuereader(object):
+ def __init__(self, f, write):
+ self.f = f
+ self._write = write
+ self.continued = False
+
+ def read(self, amt=-1):
+ if not self.continued:
+ self.continued = True
+ self._write('HTTP/1.1 100 Continue\r\n\r\n')
+ return self.f.read(amt)
+
+ def __getattr__(self, attr):
+ if attr in ('close', 'readline', 'readlines', '__iter__'):
+ return getattr(self.f, attr)
+ raise AttributeError
+
+def _statusmessage(code):
+ from BaseHTTPServer import BaseHTTPRequestHandler
+ responses = BaseHTTPRequestHandler.responses
+ return responses.get(code, ('Error', 'Unknown error'))[0]
+
+def statusmessage(code, message=None):
+ return '%d %s' % (code, message or _statusmessage(code))
+
+def get_stat(spath):
+ """stat changelog if it exists, spath otherwise"""
+ cl_path = os.path.join(spath, "00changelog.i")
+ if os.path.exists(cl_path):
+ return os.stat(cl_path)
+ else:
+ return os.stat(spath)
+
+def get_mtime(spath):
+ return get_stat(spath).st_mtime
+
+def staticfile(directory, fname, req):
+ """return a file inside directory with guessed Content-Type header
+
+ fname always uses '/' as directory separator and isn't allowed to
+ contain unusual path components.
+ Content-Type is guessed using the mimetypes module.
+ Return an empty string if fname is illegal or file not found.
+
+ """
+ parts = fname.split('/')
+ for part in parts:
+ if (part in ('', os.curdir, os.pardir) or
+ os.sep in part or os.altsep is not None and os.altsep in part):
+ return ""
+ fpath = os.path.join(*parts)
+ if isinstance(directory, str):
+ directory = [directory]
+ for d in directory:
+ path = os.path.join(d, fpath)
+ if os.path.exists(path):
+ break
+ try:
+ os.stat(path)
+ ct = mimetypes.guess_type(path)[0] or "text/plain"
+ req.respond(HTTP_OK, ct, length = os.path.getsize(path))
+ fp = open(path, 'rb')
+ data = fp.read()
+ fp.close()
+ return data
+ except TypeError:
+ raise ErrorResponse(HTTP_SERVER_ERROR, 'illegal filename')
+ except OSError, err:
+ if err.errno == errno.ENOENT:
+ raise ErrorResponse(HTTP_NOT_FOUND)
+ else:
+ raise ErrorResponse(HTTP_SERVER_ERROR, err.strerror)
+
+def paritygen(stripecount, offset=0):
+ """count parity of horizontal stripes for easier reading"""
+ if stripecount and offset:
+ # account for offset, e.g. due to building the list in reverse
+ count = (stripecount + offset) % stripecount
+ parity = (stripecount + offset) / stripecount & 1
+ else:
+ count = 0
+ parity = 0
+ while True:
+ yield parity
+ count += 1
+ if stripecount and count >= stripecount:
+ parity = 1 - parity
+ count = 0
+
+def get_contact(config):
+ """Return repo contact information or empty string.
+
+ web.contact is the primary source, but if that is not set, try
+ ui.username or $EMAIL as a fallback to display something useful.
+ """
+ return (config("web", "contact") or
+ config("ui", "username") or
+ os.environ.get("EMAIL") or "")
+
+def caching(web, req):
+ tag = str(web.mtime)
+ if req.env.get('HTTP_IF_NONE_MATCH') == tag:
+ raise ErrorResponse(HTTP_NOT_MODIFIED)
+ req.headers.append(('ETag', tag))
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
new file mode 100644
index 0000000..63a9c6c
--- /dev/null
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -0,0 +1,306 @@
+# hgweb/hgweb_mod.py - Web interface for a repository.
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+from mercurial import ui, hg, hook, error, encoding, templater, util
+from common import get_stat, ErrorResponse, permhooks, caching
+from common import HTTP_OK, HTTP_NOT_MODIFIED, HTTP_BAD_REQUEST
+from common import HTTP_NOT_FOUND, HTTP_SERVER_ERROR
+from request import wsgirequest
+import webcommands, protocol, webutil
+
+perms = {
+ 'changegroup': 'pull',
+ 'changegroupsubset': 'pull',
+ 'getbundle': 'pull',
+ 'stream_out': 'pull',
+ 'listkeys': 'pull',
+ 'unbundle': 'push',
+ 'pushkey': 'push',
+}
+
+class hgweb(object):
+ def __init__(self, repo, name=None, baseui=None):
+ if isinstance(repo, str):
+ if baseui:
+ u = baseui.copy()
+ else:
+ u = ui.ui()
+ self.repo = hg.repository(u, repo)
+ else:
+ self.repo = repo
+
+ self.repo.ui.setconfig('ui', 'report_untrusted', 'off')
+ self.repo.ui.setconfig('ui', 'nontty', 'true')
+ hook.redirect(True)
+ self.mtime = -1
+ self.size = -1
+ self.reponame = name
+ self.archives = 'zip', 'gz', 'bz2'
+ self.stripecount = 1
+ # a repo owner may set web.templates in .hg/hgrc to get any file
+ # readable by the user running the CGI script
+ self.templatepath = self.config('web', 'templates')
+
+ # The CGI scripts are often run by a user different from the repo owner.
+ # Trust the settings from the .hg/hgrc files by default.
+ def config(self, section, name, default=None, untrusted=True):
+ return self.repo.ui.config(section, name, default,
+ untrusted=untrusted)
+
+ def configbool(self, section, name, default=False, untrusted=True):
+ return self.repo.ui.configbool(section, name, default,
+ untrusted=untrusted)
+
+ def configlist(self, section, name, default=None, untrusted=True):
+ return self.repo.ui.configlist(section, name, default,
+ untrusted=untrusted)
+
+ def refresh(self, request=None):
+ if request:
+ self.repo.ui.environ = request.env
+ st = get_stat(self.repo.spath)
+ # compare changelog size in addition to mtime to catch
+ # rollbacks made less than a second ago
+ if st.st_mtime != self.mtime or st.st_size != self.size:
+ self.mtime = st.st_mtime
+ self.size = st.st_size
+ self.repo = hg.repository(self.repo.ui, self.repo.root)
+ self.maxchanges = int(self.config("web", "maxchanges", 10))
+ self.stripecount = int(self.config("web", "stripes", 1))
+ self.maxshortchanges = int(self.config("web", "maxshortchanges",
+ 60))
+ self.maxfiles = int(self.config("web", "maxfiles", 10))
+ self.allowpull = self.configbool("web", "allowpull", True)
+ encoding.encoding = self.config("web", "encoding",
+ encoding.encoding)
+
+ def run(self):
+ if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
+ raise RuntimeError("This function is only intended to be "
+ "called while running as a CGI script.")
+ import mercurial.hgweb.wsgicgi as wsgicgi
+ wsgicgi.launch(self)
+
+ def __call__(self, env, respond):
+ req = wsgirequest(env, respond)
+ return self.run_wsgi(req)
+
+ def run_wsgi(self, req):
+
+ self.refresh(req)
+
+ # work with CGI variables to create coherent structure
+ # use SCRIPT_NAME, PATH_INFO and QUERY_STRING as well as our REPO_NAME
+
+ req.url = req.env['SCRIPT_NAME']
+ if not req.url.endswith('/'):
+ req.url += '/'
+ if 'REPO_NAME' in req.env:
+ req.url += req.env['REPO_NAME'] + '/'
+
+ if 'PATH_INFO' in req.env:
+ parts = req.env['PATH_INFO'].strip('/').split('/')
+ repo_parts = req.env.get('REPO_NAME', '').split('/')
+ if parts[:len(repo_parts)] == repo_parts:
+ parts = parts[len(repo_parts):]
+ query = '/'.join(parts)
+ else:
+ query = req.env['QUERY_STRING'].split('&', 1)[0]
+ query = query.split(';', 1)[0]
+
+ # process this if it's a protocol request
+ # protocol bits don't need to create any URLs
+ # and the clients always use the old URL structure
+
+ cmd = req.form.get('cmd', [''])[0]
+ if protocol.iscmd(cmd):
+ try:
+ if query:
+ raise ErrorResponse(HTTP_NOT_FOUND)
+ if cmd in perms:
+ self.check_perm(req, perms[cmd])
+ return protocol.call(self.repo, req, cmd)
+ except ErrorResponse, inst:
+ # A client that sends unbundle without 100-continue will
+ # break if we respond early.
+ if (cmd == 'unbundle' and
+ (req.env.get('HTTP_EXPECT',
+ '').lower() != '100-continue') or
+ req.env.get('X-HgHttp2', '')):
+ req.drain()
+ req.respond(inst, protocol.HGTYPE)
+ return '0\n%s\n' % inst.message
+
+ # translate user-visible url structure to internal structure
+
+ args = query.split('/', 2)
+ if 'cmd' not in req.form and args and args[0]:
+
+ cmd = args.pop(0)
+ style = cmd.rfind('-')
+ if style != -1:
+ req.form['style'] = [cmd[:style]]
+ cmd = cmd[style + 1:]
+
+ # avoid accepting e.g. style parameter as command
+ if util.safehasattr(webcommands, cmd):
+ req.form['cmd'] = [cmd]
+ else:
+ cmd = ''
+
+ if cmd == 'static':
+ req.form['file'] = ['/'.join(args)]
+ else:
+ if args and args[0]:
+ node = args.pop(0)
+ req.form['node'] = [node]
+ if args:
+ req.form['file'] = args
+
+ ua = req.env.get('HTTP_USER_AGENT', '')
+ if cmd == 'rev' and 'mercurial' in ua:
+ req.form['style'] = ['raw']
+
+ if cmd == 'archive':
+ fn = req.form['node'][0]
+ for type_, spec in self.archive_specs.iteritems():
+ ext = spec[2]
+ if fn.endswith(ext):
+ req.form['node'] = [fn[:-len(ext)]]
+ req.form['type'] = [type_]
+
+ # process the web interface request
+
+ try:
+ tmpl = self.templater(req)
+ ctype = tmpl('mimetype', encoding=encoding.encoding)
+ ctype = templater.stringify(ctype)
+
+ # check read permissions non-static content
+ if cmd != 'static':
+ self.check_perm(req, None)
+
+ if cmd == '':
+ req.form['cmd'] = [tmpl.cache['default']]
+ cmd = req.form['cmd'][0]
+
+ if self.configbool('web', 'cache', True):
+ caching(self, req) # sets ETag header or raises NOT_MODIFIED
+ if cmd not in webcommands.__all__:
+ msg = 'no such method: %s' % cmd
+ raise ErrorResponse(HTTP_BAD_REQUEST, msg)
+ elif cmd == 'file' and 'raw' in req.form.get('style', []):
+ self.ctype = ctype
+ content = webcommands.rawfile(self, req, tmpl)
+ else:
+ content = getattr(webcommands, cmd)(self, req, tmpl)
+ req.respond(HTTP_OK, ctype)
+
+ return content
+
+ except error.LookupError, err:
+ req.respond(HTTP_NOT_FOUND, ctype)
+ msg = str(err)
+ if 'manifest' not in msg:
+ msg = 'revision not found: %s' % err.name
+ return tmpl('error', error=msg)
+ except (error.RepoError, error.RevlogError), inst:
+ req.respond(HTTP_SERVER_ERROR, ctype)
+ return tmpl('error', error=str(inst))
+ except ErrorResponse, inst:
+ req.respond(inst, ctype)
+ if inst.code == HTTP_NOT_MODIFIED:
+ # Not allowed to return a body on a 304
+ return ['']
+ return tmpl('error', error=inst.message)
+
+ def templater(self, req):
+
+ # determine scheme, port and server name
+ # this is needed to create absolute urls
+
+ proto = req.env.get('wsgi.url_scheme')
+ if proto == 'https':
+ proto = 'https'
+ default_port = "443"
+ else:
+ proto = 'http'
+ default_port = "80"
+
+ port = req.env["SERVER_PORT"]
+ port = port != default_port and (":" + port) or ""
+ urlbase = '%s://%s%s' % (proto, req.env['SERVER_NAME'], port)
+ logourl = self.config("web", "logourl", "http://mercurial.selenic.com/")
+ logoimg = self.config("web", "logoimg", "hglogo.png")
+ staticurl = self.config("web", "staticurl") or req.url + 'static/'
+ if not staticurl.endswith('/'):
+ staticurl += '/'
+
+ # some functions for the templater
+
+ def header(**map):
+ yield tmpl('header', encoding=encoding.encoding, **map)
+
+ def footer(**map):
+ yield tmpl("footer", **map)
+
+ def motd(**map):
+ yield self.config("web", "motd", "")
+
+ # figure out which style to use
+
+ vars = {}
+ styles = (
+ req.form.get('style', [None])[0],
+ self.config('web', 'style'),
+ 'paper',
+ )
+ style, mapfile = templater.stylemap(styles, self.templatepath)
+ if style == styles[0]:
+ vars['style'] = style
+
+ start = req.url[-1] == '?' and '&' or '?'
+ sessionvars = webutil.sessionvars(vars, start)
+
+ if not self.reponame:
+ self.reponame = (self.config("web", "name")
+ or req.env.get('REPO_NAME')
+ or req.url.strip('/') or self.repo.root)
+
+ # create the templater
+
+ tmpl = templater.templater(mapfile,
+ defaults={"url": req.url,
+ "logourl": logourl,
+ "logoimg": logoimg,
+ "staticurl": staticurl,
+ "urlbase": urlbase,
+ "repo": self.reponame,
+ "header": header,
+ "footer": footer,
+ "motd": motd,
+ "sessionvars": sessionvars
+ })
+ return tmpl
+
+ def archivelist(self, nodeid):
+ allowed = self.configlist("web", "allow_archive")
+ for i, spec in self.archive_specs.iteritems():
+ if i in allowed or self.configbool("web", "allow" + i):
+ yield {"type" : i, "extension" : spec[2], "node" : nodeid}
+
+ archive_specs = {
+ 'bz2': ('application/x-bzip2', 'tbz2', '.tar.bz2', None),
+ 'gz': ('application/x-gzip', 'tgz', '.tar.gz', None),
+ 'zip': ('application/zip', 'zip', '.zip', None),
+ }
+
+ def check_perm(self, req, op):
+ for hook in permhooks:
+ hook(self, req, op)
diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
new file mode 100644
index 0000000..7cb083e
--- /dev/null
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -0,0 +1,449 @@
+# hgweb/hgwebdir_mod.py - Web interface for a directory of repositories.
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, re, time
+from mercurial.i18n import _
+from mercurial import ui, hg, scmutil, util, templater
+from mercurial import error, encoding
+from common import ErrorResponse, get_mtime, staticfile, paritygen, \
+ get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
+from hgweb_mod import hgweb
+from request import wsgirequest
+import webutil
+
+def cleannames(items):
+ return [(util.pconvert(name).strip('/'), path) for name, path in items]
+
+def findrepos(paths):
+ repos = []
+ for prefix, root in cleannames(paths):
+ roothead, roottail = os.path.split(root)
+ # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
+ # /bar/ be served as as foo/N .
+ # '*' will not search inside dirs with .hg (except .hg/patches),
+ # '**' will search inside dirs with .hg (and thus also find subrepos).
+ try:
+ recurse = {'*': False, '**': True}[roottail]
+ except KeyError:
+ repos.append((prefix, root))
+ continue
+ roothead = os.path.normpath(os.path.abspath(roothead))
+ paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
+ repos.extend(urlrepos(prefix, roothead, paths))
+ return repos
+
+def urlrepos(prefix, roothead, paths):
+ """yield url paths and filesystem paths from a list of repo paths
+
+ >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
+ >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
+ [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
+ >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
+ [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
+ """
+ for path in paths:
+ path = os.path.normpath(path)
+ yield (prefix + '/' +
+ util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
+
+def geturlcgivars(baseurl, port):
+ """
+ Extract CGI variables from baseurl
+
+ >>> geturlcgivars("http://host.org/base", "80")
+ ('host.org', '80', '/base')
+ >>> geturlcgivars("http://host.org:8000/base", "80")
+ ('host.org', '8000', '/base')
+ >>> geturlcgivars('/base', 8000)
+ ('', '8000', '/base')
+ >>> geturlcgivars("base", '8000')
+ ('', '8000', '/base')
+ >>> geturlcgivars("http://host", '8000')
+ ('host', '8000', '/')
+ >>> geturlcgivars("http://host/", '8000')
+ ('host', '8000', '/')
+ """
+ u = util.url(baseurl)
+ name = u.host or ''
+ if u.port:
+ port = u.port
+ path = u.path or ""
+ if not path.startswith('/'):
+ path = '/' + path
+
+ return name, str(port), path
+
+class hgwebdir(object):
+ refreshinterval = 20
+
+ def __init__(self, conf, baseui=None):
+ self.conf = conf
+ self.baseui = baseui
+ self.lastrefresh = 0
+ self.motd = None
+ self.refresh()
+
+ def refresh(self):
+ if self.lastrefresh + self.refreshinterval > time.time():
+ return
+
+ if self.baseui:
+ u = self.baseui.copy()
+ else:
+ u = ui.ui()
+ u.setconfig('ui', 'report_untrusted', 'off')
+ u.setconfig('ui', 'nontty', 'true')
+
+ if not isinstance(self.conf, (dict, list, tuple)):
+ map = {'paths': 'hgweb-paths'}
+ if not os.path.exists(self.conf):
+ raise util.Abort(_('config file %s not found!') % self.conf)
+ u.readconfig(self.conf, remap=map, trust=True)
+ paths = []
+ for name, ignored in u.configitems('hgweb-paths'):
+ for path in u.configlist('hgweb-paths', name):
+ paths.append((name, path))
+ elif isinstance(self.conf, (list, tuple)):
+ paths = self.conf
+ elif isinstance(self.conf, dict):
+ paths = self.conf.items()
+
+ repos = findrepos(paths)
+ for prefix, root in u.configitems('collections'):
+ prefix = util.pconvert(prefix)
+ for path in scmutil.walkrepos(root, followsym=True):
+ repo = os.path.normpath(path)
+ name = util.pconvert(repo)
+ if name.startswith(prefix):
+ name = name[len(prefix):]
+ repos.append((name.lstrip('/'), repo))
+
+ self.repos = repos
+ self.ui = u
+ encoding.encoding = self.ui.config('web', 'encoding',
+ encoding.encoding)
+ self.style = self.ui.config('web', 'style', 'paper')
+ self.templatepath = self.ui.config('web', 'templates', None)
+ self.stripecount = self.ui.config('web', 'stripes', 1)
+ if self.stripecount:
+ self.stripecount = int(self.stripecount)
+ self._baseurl = self.ui.config('web', 'baseurl')
+ self.lastrefresh = time.time()
+
+ def run(self):
+ if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
+ raise RuntimeError("This function is only intended to be "
+ "called while running as a CGI script.")
+ import mercurial.hgweb.wsgicgi as wsgicgi
+ wsgicgi.launch(self)
+
+ def __call__(self, env, respond):
+ req = wsgirequest(env, respond)
+ return self.run_wsgi(req)
+
+ def read_allowed(self, ui, req):
+ """Check allow_read and deny_read config options of a repo's ui object
+ to determine user permissions. By default, with neither option set (or
+ both empty), allow all users to read the repo. There are two ways a
+ user can be denied read access: (1) deny_read is not empty, and the
+ user is unauthenticated or deny_read contains user (or *), and (2)
+ allow_read is not empty and the user is not in allow_read. Return True
+ if user is allowed to read the repo, else return False."""
+
+ user = req.env.get('REMOTE_USER')
+
+ deny_read = ui.configlist('web', 'deny_read', untrusted=True)
+ if deny_read and (not user or deny_read == ['*'] or user in deny_read):
+ return False
+
+ allow_read = ui.configlist('web', 'allow_read', untrusted=True)
+ # by default, allow reading if no allow_read option has been set
+ if (not allow_read) or (allow_read == ['*']) or (user in allow_read):
+ return True
+
+ return False
+
+ def run_wsgi(self, req):
+ try:
+ try:
+ self.refresh()
+
+ virtual = req.env.get("PATH_INFO", "").strip('/')
+ tmpl = self.templater(req)
+ ctype = tmpl('mimetype', encoding=encoding.encoding)
+ ctype = templater.stringify(ctype)
+
+ # a static file
+ if virtual.startswith('static/') or 'static' in req.form:
+ if virtual.startswith('static/'):
+ fname = virtual[7:]
+ else:
+ fname = req.form['static'][0]
+ static = templater.templatepath('static')
+ return (staticfile(static, fname, req),)
+
+ # top-level index
+ elif not virtual:
+ req.respond(HTTP_OK, ctype)
+ return self.makeindex(req, tmpl)
+
+ # nested indexes and hgwebs
+
+ repos = dict(self.repos)
+ virtualrepo = virtual
+ while virtualrepo:
+ real = repos.get(virtualrepo)
+ if real:
+ req.env['REPO_NAME'] = virtualrepo
+ try:
+ repo = hg.repository(self.ui, real)
+ return hgweb(repo).run_wsgi(req)
+ except IOError, inst:
+ msg = inst.strerror
+ raise ErrorResponse(HTTP_SERVER_ERROR, msg)
+ except error.RepoError, inst:
+ raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
+
+ up = virtualrepo.rfind('/')
+ if up < 0:
+ break
+ virtualrepo = virtualrepo[:up]
+
+ # browse subdirectories
+ subdir = virtual + '/'
+ if [r for r in repos if r.startswith(subdir)]:
+ req.respond(HTTP_OK, ctype)
+ return self.makeindex(req, tmpl, subdir)
+
+ # prefixes not found
+ req.respond(HTTP_NOT_FOUND, ctype)
+ return tmpl("notfound", repo=virtual)
+
+ except ErrorResponse, err:
+ req.respond(err, ctype)
+ return tmpl('error', error=err.message or '')
+ finally:
+ tmpl = None
+
+ def makeindex(self, req, tmpl, subdir=""):
+
+ def archivelist(ui, nodeid, url):
+ allowed = ui.configlist("web", "allow_archive", untrusted=True)
+ archives = []
+ for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
+ if i[0] in allowed or ui.configbool("web", "allow" + i[0],
+ untrusted=True):
+ archives.append({"type" : i[0], "extension": i[1],
+ "node": nodeid, "url": url})
+ return archives
+
+ def rawentries(subdir="", **map):
+
+ descend = self.ui.configbool('web', 'descend', True)
+ collapse = self.ui.configbool('web', 'collapse', False)
+ seenrepos = set()
+ seendirs = set()
+ for name, path in self.repos:
+
+ if not name.startswith(subdir):
+ continue
+ name = name[len(subdir):]
+ directory = False
+
+ if '/' in name:
+ if not descend:
+ continue
+
+ nameparts = name.split('/')
+ rootname = nameparts[0]
+
+ if not collapse:
+ pass
+ elif rootname in seendirs:
+ continue
+ elif rootname in seenrepos:
+ pass
+ else:
+ directory = True
+ name = rootname
+
+ # redefine the path to refer to the directory
+ discarded = '/'.join(nameparts[1:])
+
+ # remove name parts plus accompanying slash
+ path = path[:-len(discarded) - 1]
+
+ parts = [name]
+ if 'PATH_INFO' in req.env:
+ parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
+ if req.env['SCRIPT_NAME']:
+ parts.insert(0, req.env['SCRIPT_NAME'])
+ url = re.sub(r'/+', '/', '/'.join(parts) + '/')
+
+ # show either a directory entry or a repository
+ if directory:
+ # get the directory's time information
+ try:
+ d = (get_mtime(path), util.makedate()[1])
+ except OSError:
+ continue
+
+ row = dict(contact="",
+ contact_sort="",
+ name=name,
+ name_sort=name,
+ url=url,
+ description="",
+ description_sort="",
+ lastchange=d,
+ lastchange_sort=d[1]-d[0],
+ archives=[])
+
+ seendirs.add(name)
+ yield row
+ continue
+
+ u = self.ui.copy()
+ try:
+ u.readconfig(os.path.join(path, '.hg', 'hgrc'))
+ except Exception, e:
+ u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
+ continue
+ def get(section, name, default=None):
+ return u.config(section, name, default, untrusted=True)
+
+ if u.configbool("web", "hidden", untrusted=True):
+ continue
+
+ if not self.read_allowed(u, req):
+ continue
+
+ # update time with local timezone
+ try:
+ r = hg.repository(self.ui, path)
+ except IOError:
+ u.warn(_('error accessing repository at %s\n') % path)
+ continue
+ except error.RepoError:
+ u.warn(_('error accessing repository at %s\n') % path)
+ continue
+ try:
+ d = (get_mtime(r.spath), util.makedate()[1])
+ except OSError:
+ continue
+
+ contact = get_contact(get)
+ description = get("web", "description", "")
+ name = get("web", "name", name)
+ row = dict(contact=contact or "unknown",
+ contact_sort=contact.upper() or "unknown",
+ name=name,
+ name_sort=name,
+ url=url,
+ description=description or "unknown",
+ description_sort=description.upper() or "unknown",
+ lastchange=d,
+ lastchange_sort=d[1]-d[0],
+ archives=archivelist(u, "tip", url))
+
+ seenrepos.add(name)
+ yield row
+
+ sortdefault = None, False
+ def entries(sortcolumn="", descending=False, subdir="", **map):
+ rows = rawentries(subdir=subdir, **map)
+
+ if sortcolumn and sortdefault != (sortcolumn, descending):
+ sortkey = '%s_sort' % sortcolumn
+ rows = sorted(rows, key=lambda x: x[sortkey],
+ reverse=descending)
+ for row, parity in zip(rows, paritygen(self.stripecount)):
+ row['parity'] = parity
+ yield row
+
+ self.refresh()
+ sortable = ["name", "description", "contact", "lastchange"]
+ sortcolumn, descending = sortdefault
+ if 'sort' in req.form:
+ sortcolumn = req.form['sort'][0]
+ descending = sortcolumn.startswith('-')
+ if descending:
+ sortcolumn = sortcolumn[1:]
+ if sortcolumn not in sortable:
+ sortcolumn = ""
+
+ sort = [("sort_%s" % column,
+ "%s%s" % ((not descending and column == sortcolumn)
+ and "-" or "", column))
+ for column in sortable]
+
+ self.refresh()
+ self.updatereqenv(req.env)
+
+ return tmpl("index", entries=entries, subdir=subdir,
+ sortcolumn=sortcolumn, descending=descending,
+ **dict(sort))
+
+ def templater(self, req):
+
+ def header(**map):
+ yield tmpl('header', encoding=encoding.encoding, **map)
+
+ def footer(**map):
+ yield tmpl("footer", **map)
+
+ def motd(**map):
+ if self.motd is not None:
+ yield self.motd
+ else:
+ yield config('web', 'motd', '')
+
+ def config(section, name, default=None, untrusted=True):
+ return self.ui.config(section, name, default, untrusted)
+
+ self.updatereqenv(req.env)
+
+ url = req.env.get('SCRIPT_NAME', '')
+ if not url.endswith('/'):
+ url += '/'
+
+ vars = {}
+ styles = (
+ req.form.get('style', [None])[0],
+ config('web', 'style'),
+ 'paper'
+ )
+ style, mapfile = templater.stylemap(styles, self.templatepath)
+ if style == styles[0]:
+ vars['style'] = style
+
+ start = url[-1] == '?' and '&' or '?'
+ sessionvars = webutil.sessionvars(vars, start)
+ logourl = config('web', 'logourl', 'http://mercurial.selenic.com/')
+ logoimg = config('web', 'logoimg', 'hglogo.png')
+ staticurl = config('web', 'staticurl') or url + 'static/'
+ if not staticurl.endswith('/'):
+ staticurl += '/'
+
+ tmpl = templater.templater(mapfile,
+ defaults={"header": header,
+ "footer": footer,
+ "motd": motd,
+ "url": url,
+ "logourl": logourl,
+ "logoimg": logoimg,
+ "staticurl": staticurl,
+ "sessionvars": sessionvars})
+ return tmpl
+
+ def updatereqenv(self, env):
+ if self._baseurl is not None:
+ name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT'])
+ env['SERVER_NAME'] = name
+ env['SERVER_PORT'] = port
+ env['SCRIPT_NAME'] = path
diff --git a/mercurial/hgweb/protocol.py b/mercurial/hgweb/protocol.py
new file mode 100644
index 0000000..84aa6b1
--- /dev/null
+++ b/mercurial/hgweb/protocol.py
@@ -0,0 +1,97 @@
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import cgi, cStringIO, zlib, urllib
+from mercurial import util, wireproto
+from common import HTTP_OK
+
+HGTYPE = 'application/mercurial-0.1'
+HGERRTYPE = 'application/hg-error'
+
+class webproto(object):
+ def __init__(self, req, ui):
+ self.req = req
+ self.response = ''
+ self.ui = ui
+ def getargs(self, args):
+ knownargs = self._args()
+ data = {}
+ keys = args.split()
+ for k in keys:
+ if k == '*':
+ star = {}
+ for key in knownargs.keys():
+ if key != 'cmd' and key not in keys:
+ star[key] = knownargs[key][0]
+ data['*'] = star
+ else:
+ data[k] = knownargs[k][0]
+ return [data[k] for k in keys]
+ def _args(self):
+ args = self.req.form.copy()
+ chunks = []
+ i = 1
+ while True:
+ h = self.req.env.get('HTTP_X_HGARG_' + str(i))
+ if h is None:
+ break
+ chunks += [h]
+ i += 1
+ args.update(cgi.parse_qs(''.join(chunks), keep_blank_values=True))
+ return args
+ def getfile(self, fp):
+ length = int(self.req.env['CONTENT_LENGTH'])
+ for s in util.filechunkiter(self.req, limit=length):
+ fp.write(s)
+ def redirect(self):
+ self.oldio = self.ui.fout, self.ui.ferr
+ self.ui.ferr = self.ui.fout = cStringIO.StringIO()
+ def restore(self):
+ val = self.ui.fout.getvalue()
+ self.ui.ferr, self.ui.fout = self.oldio
+ return val
+ def groupchunks(self, cg):
+ z = zlib.compressobj()
+ while True:
+ chunk = cg.read(4096)
+ if not chunk:
+ break
+ yield z.compress(chunk)
+ yield z.flush()
+ def _client(self):
+ return 'remote:%s:%s:%s' % (
+ self.req.env.get('wsgi.url_scheme') or 'http',
+ urllib.quote(self.req.env.get('REMOTE_HOST', '')),
+ urllib.quote(self.req.env.get('REMOTE_USER', '')))
+
+def iscmd(cmd):
+ return cmd in wireproto.commands
+
+def call(repo, req, cmd):
+ p = webproto(req, repo.ui)
+ rsp = wireproto.dispatch(repo, p, cmd)
+ if isinstance(rsp, str):
+ req.respond(HTTP_OK, HGTYPE, length=len(rsp))
+ return [rsp]
+ elif isinstance(rsp, wireproto.streamres):
+ req.respond(HTTP_OK, HGTYPE)
+ return rsp.gen
+ elif isinstance(rsp, wireproto.pushres):
+ val = p.restore()
+ req.respond(HTTP_OK, HGTYPE)
+ return ['%d\n%s' % (rsp.res, val)]
+ elif isinstance(rsp, wireproto.pusherr):
+ # drain the incoming bundle
+ req.drain()
+ p.restore()
+ rsp = '0\n%s\n' % rsp.res
+ req.respond(HTTP_OK, HGTYPE, length=len(rsp))
+ return [rsp]
+ elif isinstance(rsp, wireproto.ooberror):
+ rsp = rsp.message
+ req.respond(HTTP_OK, HGERRTYPE, length=len(rsp))
+ return [rsp]
diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py
new file mode 100644
index 0000000..1fddc95
--- /dev/null
+++ b/mercurial/hgweb/request.py
@@ -0,0 +1,147 @@
+# hgweb/request.py - An http request from either CGI or the standalone server.
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import socket, cgi, errno
+from mercurial import util
+from common import ErrorResponse, statusmessage, HTTP_NOT_MODIFIED
+
+shortcuts = {
+ 'cl': [('cmd', ['changelog']), ('rev', None)],
+ 'sl': [('cmd', ['shortlog']), ('rev', None)],
+ 'cs': [('cmd', ['changeset']), ('node', None)],
+ 'f': [('cmd', ['file']), ('filenode', None)],
+ 'fl': [('cmd', ['filelog']), ('filenode', None)],
+ 'fd': [('cmd', ['filediff']), ('node', None)],
+ 'fa': [('cmd', ['annotate']), ('filenode', None)],
+ 'mf': [('cmd', ['manifest']), ('manifest', None)],
+ 'ca': [('cmd', ['archive']), ('node', None)],
+ 'tags': [('cmd', ['tags'])],
+ 'tip': [('cmd', ['changeset']), ('node', ['tip'])],
+ 'static': [('cmd', ['static']), ('file', None)]
+}
+
+def normalize(form):
+ # first expand the shortcuts
+ for k in shortcuts.iterkeys():
+ if k in form:
+ for name, value in shortcuts[k]:
+ if value is None:
+ value = form[k]
+ form[name] = value
+ del form[k]
+ # And strip the values
+ for k, v in form.iteritems():
+ form[k] = [i.strip() for i in v]
+ return form
+
+class wsgirequest(object):
+ def __init__(self, wsgienv, start_response):
+ version = wsgienv['wsgi.version']
+ if (version < (1, 0)) or (version >= (2, 0)):
+ raise RuntimeError("Unknown and unsupported WSGI version %d.%d"
+ % version)
+ self.inp = wsgienv['wsgi.input']
+ self.err = wsgienv['wsgi.errors']
+ self.threaded = wsgienv['wsgi.multithread']
+ self.multiprocess = wsgienv['wsgi.multiprocess']
+ self.run_once = wsgienv['wsgi.run_once']
+ self.env = wsgienv
+ self.form = normalize(cgi.parse(self.inp,
+ self.env,
+ keep_blank_values=1))
+ self._start_response = start_response
+ self.server_write = None
+ self.headers = []
+
+ def __iter__(self):
+ return iter([])
+
+ def read(self, count=-1):
+ return self.inp.read(count)
+
+ def drain(self):
+ '''need to read all data from request, httplib is half-duplex'''
+ length = int(self.env.get('CONTENT_LENGTH') or 0)
+ for s in util.filechunkiter(self.inp, limit=length):
+ pass
+
+ def respond(self, status, type=None, filename=None, length=0):
+ if self._start_response is not None:
+
+ self.httphdr(type, filename, length)
+ if not self.headers:
+ raise RuntimeError("request.write called before headers sent")
+
+ for k, v in self.headers:
+ if not isinstance(v, str):
+ raise TypeError('header value must be string: %r' % v)
+
+ if isinstance(status, ErrorResponse):
+ self.header(status.headers)
+ if status.code == HTTP_NOT_MODIFIED:
+ # RFC 2616 Section 10.3.5: 304 Not Modified has cases where
+ # it MUST NOT include any headers other than these and no
+ # body
+ self.headers = [(k, v) for (k, v) in self.headers if
+ k in ('Date', 'ETag', 'Expires',
+ 'Cache-Control', 'Vary')]
+ status = statusmessage(status.code, status.message)
+ elif status == 200:
+ status = '200 Script output follows'
+ elif isinstance(status, int):
+ status = statusmessage(status)
+
+ self.server_write = self._start_response(status, self.headers)
+ self._start_response = None
+ self.headers = []
+
+ def write(self, thing):
+ if util.safehasattr(thing, "__iter__"):
+ for part in thing:
+ self.write(part)
+ else:
+ thing = str(thing)
+ try:
+ self.server_write(thing)
+ except socket.error, inst:
+ if inst[0] != errno.ECONNRESET:
+ raise
+
+ def writelines(self, lines):
+ for line in lines:
+ self.write(line)
+
+ def flush(self):
+ return None
+
+ def close(self):
+ return None
+
+ def header(self, headers=[('Content-Type','text/html')]):
+ self.headers.extend(headers)
+
+ def httphdr(self, type=None, filename=None, length=0, headers={}):
+ headers = headers.items()
+ if type is not None:
+ headers.append(('Content-Type', type))
+ if filename:
+ filename = (filename.split('/')[-1]
+ .replace('\\', '\\\\').replace('"', '\\"'))
+ headers.append(('Content-Disposition',
+ 'inline; filename="%s"' % filename))
+ if length:
+ headers.append(('Content-Length', str(length)))
+ self.header(headers)
+
+def wsgiapplication(app_maker):
+ '''For compatibility with old CGI scripts. A plain hgweb() or hgwebdir()
+ can and should now be used as a WSGI application.'''
+ application = app_maker()
+ def run_wsgi(env, respond):
+ return application(env, respond)
+ return run_wsgi
diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
new file mode 100644
index 0000000..3ad99f4
--- /dev/null
+++ b/mercurial/hgweb/server.py
@@ -0,0 +1,320 @@
+# hgweb/server.py - The standalone hg web server.
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, sys, errno, urllib, BaseHTTPServer, socket, SocketServer, traceback
+from mercurial import util, error
+from mercurial.hgweb import common
+from mercurial.i18n import _
+
+def _splitURI(uri):
+ """ Return path and query splited from uri
+
+ Just like CGI environment, the path is unquoted, the query is
+ not.
+ """
+ if '?' in uri:
+ path, query = uri.split('?', 1)
+ else:
+ path, query = uri, ''
+ return urllib.unquote(path), query
+
+class _error_logger(object):
+ def __init__(self, handler):
+ self.handler = handler
+ def flush(self):
+ pass
+ def write(self, str):
+ self.writelines(str.split('\n'))
+ def writelines(self, seq):
+ for msg in seq:
+ self.handler.log_error("HG error: %s", msg)
+
+class _httprequesthandler(BaseHTTPServer.BaseHTTPRequestHandler):
+
+ url_scheme = 'http'
+
+ @staticmethod
+ def preparehttpserver(httpserver, ssl_cert):
+ """Prepare .socket of new HTTPServer instance"""
+ pass
+
+ def __init__(self, *args, **kargs):
+ self.protocol_version = 'HTTP/1.1'
+ BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs)
+
+ def _log_any(self, fp, format, *args):
+ fp.write("%s - - [%s] %s\n" % (self.client_address[0],
+ self.log_date_time_string(),
+ format % args))
+ fp.flush()
+
+ def log_error(self, format, *args):
+ self._log_any(self.server.errorlog, format, *args)
+
+ def log_message(self, format, *args):
+ self._log_any(self.server.accesslog, format, *args)
+
+ def log_request(self, code='-', size='-'):
+ xheaders = [h for h in self.headers.items() if h[0].startswith('x-')]
+ self.log_message('"%s" %s %s%s',
+ self.requestline, str(code), str(size),
+ ''.join([' %s:%s' % h for h in sorted(xheaders)]))
+
+ def do_write(self):
+ try:
+ self.do_hgweb()
+ except socket.error, inst:
+ if inst[0] != errno.EPIPE:
+ raise
+
+ def do_POST(self):
+ try:
+ self.do_write()
+ except Exception:
+ self._start_response("500 Internal Server Error", [])
+ self._write("Internal Server Error")
+ tb = "".join(traceback.format_exception(*sys.exc_info()))
+ self.log_error("Exception happened during processing "
+ "request '%s':\n%s", self.path, tb)
+
+ def do_GET(self):
+ self.do_POST()
+
+ def do_hgweb(self):
+ path, query = _splitURI(self.path)
+
+ env = {}
+ env['GATEWAY_INTERFACE'] = 'CGI/1.1'
+ env['REQUEST_METHOD'] = self.command
+ env['SERVER_NAME'] = self.server.server_name
+ env['SERVER_PORT'] = str(self.server.server_port)
+ env['REQUEST_URI'] = self.path
+ env['SCRIPT_NAME'] = self.server.prefix
+ env['PATH_INFO'] = path[len(self.server.prefix):]
+ env['REMOTE_HOST'] = self.client_address[0]
+ env['REMOTE_ADDR'] = self.client_address[0]
+ if query:
+ env['QUERY_STRING'] = query
+
+ if self.headers.typeheader is None:
+ env['CONTENT_TYPE'] = self.headers.type
+ else:
+ env['CONTENT_TYPE'] = self.headers.typeheader
+ length = self.headers.getheader('content-length')
+ if length:
+ env['CONTENT_LENGTH'] = length
+ for header in [h for h in self.headers.keys()
+ if h not in ('content-type', 'content-length')]:
+ hkey = 'HTTP_' + header.replace('-', '_').upper()
+ hval = self.headers.getheader(header)
+ hval = hval.replace('\n', '').strip()
+ if hval:
+ env[hkey] = hval
+ env['SERVER_PROTOCOL'] = self.request_version
+ env['wsgi.version'] = (1, 0)
+ env['wsgi.url_scheme'] = self.url_scheme
+ if env.get('HTTP_EXPECT', '').lower() == '100-continue':
+ self.rfile = common.continuereader(self.rfile, self.wfile.write)
+
+ env['wsgi.input'] = self.rfile
+ env['wsgi.errors'] = _error_logger(self)
+ env['wsgi.multithread'] = isinstance(self.server,
+ SocketServer.ThreadingMixIn)
+ env['wsgi.multiprocess'] = isinstance(self.server,
+ SocketServer.ForkingMixIn)
+ env['wsgi.run_once'] = 0
+
+ self.close_connection = True
+ self.saved_status = None
+ self.saved_headers = []
+ self.sent_headers = False
+ self.length = None
+ for chunk in self.server.application(env, self._start_response):
+ self._write(chunk)
+
+ def send_headers(self):
+ if not self.saved_status:
+ raise AssertionError("Sending headers before "
+ "start_response() called")
+ saved_status = self.saved_status.split(None, 1)
+ saved_status[0] = int(saved_status[0])
+ self.send_response(*saved_status)
+ should_close = True
+ for h in self.saved_headers:
+ self.send_header(*h)
+ if h[0].lower() == 'content-length':
+ should_close = False
+ self.length = int(h[1])
+ # The value of the Connection header is a list of case-insensitive
+ # tokens separated by commas and optional whitespace.
+ if 'close' in [token.strip().lower() for token in
+ self.headers.get('connection', '').split(',')]:
+ should_close = True
+ if should_close:
+ self.send_header('Connection', 'close')
+ self.close_connection = should_close
+ self.end_headers()
+ self.sent_headers = True
+
+ def _start_response(self, http_status, headers, exc_info=None):
+ code, msg = http_status.split(None, 1)
+ code = int(code)
+ self.saved_status = http_status
+ bad_headers = ('connection', 'transfer-encoding')
+ self.saved_headers = [h for h in headers
+ if h[0].lower() not in bad_headers]
+ return self._write
+
+ def _write(self, data):
+ if not self.saved_status:
+ raise AssertionError("data written before start_response() called")
+ elif not self.sent_headers:
+ self.send_headers()
+ if self.length is not None:
+ if len(data) > self.length:
+ raise AssertionError("Content-length header sent, but more "
+ "bytes than specified are being written.")
+ self.length = self.length - len(data)
+ self.wfile.write(data)
+ self.wfile.flush()
+
+class _httprequesthandleropenssl(_httprequesthandler):
+ """HTTPS handler based on pyOpenSSL"""
+
+ url_scheme = 'https'
+
+ @staticmethod
+ def preparehttpserver(httpserver, ssl_cert):
+ try:
+ import OpenSSL
+ OpenSSL.SSL.Context
+ except ImportError:
+ raise util.Abort(_("SSL support is unavailable"))
+ ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
+ ctx.use_privatekey_file(ssl_cert)
+ ctx.use_certificate_file(ssl_cert)
+ sock = socket.socket(httpserver.address_family, httpserver.socket_type)
+ httpserver.socket = OpenSSL.SSL.Connection(ctx, sock)
+ httpserver.server_bind()
+ httpserver.server_activate()
+
+ def setup(self):
+ self.connection = self.request
+ self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
+ self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
+
+ def do_write(self):
+ import OpenSSL
+ try:
+ _httprequesthandler.do_write(self)
+ except OpenSSL.SSL.SysCallError, inst:
+ if inst.args[0] != errno.EPIPE:
+ raise
+
+ def handle_one_request(self):
+ import OpenSSL
+ try:
+ _httprequesthandler.handle_one_request(self)
+ except (OpenSSL.SSL.SysCallError, OpenSSL.SSL.ZeroReturnError):
+ self.close_connection = True
+ pass
+
+class _httprequesthandlerssl(_httprequesthandler):
+ """HTTPS handler based on Pythons ssl module (introduced in 2.6)"""
+
+ url_scheme = 'https'
+
+ @staticmethod
+ def preparehttpserver(httpserver, ssl_cert):
+ try:
+ import ssl
+ ssl.wrap_socket
+ except ImportError:
+ raise util.Abort(_("SSL support is unavailable"))
+ httpserver.socket = ssl.wrap_socket(httpserver.socket, server_side=True,
+ certfile=ssl_cert, ssl_version=ssl.PROTOCOL_SSLv23)
+
+ def setup(self):
+ self.connection = self.request
+ self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
+ self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
+
+try:
+ from threading import activeCount
+ activeCount() # silence pyflakes
+ _mixin = SocketServer.ThreadingMixIn
+except ImportError:
+ if util.safehasattr(os, "fork"):
+ _mixin = SocketServer.ForkingMixIn
+ else:
+ class _mixin(object):
+ pass
+
+def openlog(opt, default):
+ if opt and opt != '-':
+ return open(opt, 'a')
+ return default
+
+class MercurialHTTPServer(object, _mixin, BaseHTTPServer.HTTPServer):
+
+ # SO_REUSEADDR has broken semantics on windows
+ if os.name == 'nt':
+ allow_reuse_address = 0
+
+ def __init__(self, ui, app, addr, handler, **kwargs):
+ BaseHTTPServer.HTTPServer.__init__(self, addr, handler, **kwargs)
+ self.daemon_threads = True
+ self.application = app
+
+ handler.preparehttpserver(self, ui.config('web', 'certificate'))
+
+ prefix = ui.config('web', 'prefix', '')
+ if prefix:
+ prefix = '/' + prefix.strip('/')
+ self.prefix = prefix
+
+ alog = openlog(ui.config('web', 'accesslog', '-'), sys.stdout)
+ elog = openlog(ui.config('web', 'errorlog', '-'), sys.stderr)
+ self.accesslog = alog
+ self.errorlog = elog
+
+ self.addr, self.port = self.socket.getsockname()[0:2]
+ self.fqaddr = socket.getfqdn(addr[0])
+
+class IPv6HTTPServer(MercurialHTTPServer):
+ address_family = getattr(socket, 'AF_INET6', None)
+ def __init__(self, *args, **kwargs):
+ if self.address_family is None:
+ raise error.RepoError(_('IPv6 is not available on this system'))
+ super(IPv6HTTPServer, self).__init__(*args, **kwargs)
+
+def create_server(ui, app):
+
+ if ui.config('web', 'certificate'):
+ if sys.version_info >= (2, 6):
+ handler = _httprequesthandlerssl
+ else:
+ handler = _httprequesthandleropenssl
+ else:
+ handler = _httprequesthandler
+
+ if ui.configbool('web', 'ipv6'):
+ cls = IPv6HTTPServer
+ else:
+ cls = MercurialHTTPServer
+
+ # ugly hack due to python issue5853 (for threaded use)
+ import mimetypes; mimetypes.init()
+
+ address = ui.config('web', 'address', '')
+ port = util.getport(ui.config('web', 'port', 8000))
+ try:
+ return cls(ui, app, (address, port), handler)
+ except socket.error, inst:
+ raise util.Abort(_("cannot start server at '%s:%d': %s")
+ % (address, port, inst.args[1]))
diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
new file mode 100644
index 0000000..9cd5c0a
--- /dev/null
+++ b/mercurial/hgweb/webcommands.py
@@ -0,0 +1,970 @@
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, mimetypes, re, cgi, copy
+import webutil
+from mercurial import error, encoding, archival, templater, templatefilters
+from mercurial.node import short, hex, nullid
+from mercurial.util import binary
+from common import paritygen, staticfile, get_contact, ErrorResponse
+from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
+from mercurial import graphmod, patch
+from mercurial import help as helpmod
+from mercurial.i18n import _
+
+# __all__ is populated with the allowed commands. Be sure to add to it if
+# you're adding a new command, or the new command won't work.
+
+__all__ = [
+ 'log', 'rawfile', 'file', 'changelog', 'shortlog', 'changeset', 'rev',
+ 'manifest', 'tags', 'bookmarks', 'branches', 'summary', 'filediff', 'diff',
+ 'comparison', 'annotate', 'filelog', 'archive', 'static', 'graph', 'help',
+]
+
+def log(web, req, tmpl):
+ if 'file' in req.form and req.form['file'][0]:
+ return filelog(web, req, tmpl)
+ else:
+ return changelog(web, req, tmpl)
+
+def rawfile(web, req, tmpl):
+ guessmime = web.configbool('web', 'guessmime', False)
+
+ path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
+ if not path:
+ content = manifest(web, req, tmpl)
+ req.respond(HTTP_OK, web.ctype)
+ return content
+
+ try:
+ fctx = webutil.filectx(web.repo, req)
+ except error.LookupError, inst:
+ try:
+ content = manifest(web, req, tmpl)
+ req.respond(HTTP_OK, web.ctype)
+ return content
+ except ErrorResponse:
+ raise inst
+
+ path = fctx.path()
+ text = fctx.data()
+ mt = 'application/binary'
+ if guessmime:
+ mt = mimetypes.guess_type(path)[0]
+ if mt is None:
+ mt = binary(text) and 'application/binary' or 'text/plain'
+ if mt.startswith('text/'):
+ mt += '; charset="%s"' % encoding.encoding
+
+ req.respond(HTTP_OK, mt, path, len(text))
+ return [text]
+
+def _filerevision(web, tmpl, fctx):
+ f = fctx.path()
+ text = fctx.data()
+ parity = paritygen(web.stripecount)
+
+ if binary(text):
+ mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
+ text = '(binary:%s)' % mt
+
+ def lines():
+ for lineno, t in enumerate(text.splitlines(True)):
+ yield {"line": t,
+ "lineid": "l%d" % (lineno + 1),
+ "linenumber": "% 6d" % (lineno + 1),
+ "parity": parity.next()}
+
+ return tmpl("filerevision",
+ file=f,
+ path=webutil.up(f),
+ text=lines(),
+ rev=fctx.rev(),
+ node=fctx.hex(),
+ author=fctx.user(),
+ date=fctx.date(),
+ desc=fctx.description(),
+ branch=webutil.nodebranchnodefault(fctx),
+ parent=webutil.parents(fctx),
+ child=webutil.children(fctx),
+ rename=webutil.renamelink(fctx),
+ permissions=fctx.manifest().flags(f))
+
+def file(web, req, tmpl):
+ path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
+ if not path:
+ return manifest(web, req, tmpl)
+ try:
+ return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
+ except error.LookupError, inst:
+ try:
+ return manifest(web, req, tmpl)
+ except ErrorResponse:
+ raise inst
+
+def _search(web, req, tmpl):
+
+ query = req.form['rev'][0]
+ revcount = web.maxchanges
+ if 'revcount' in req.form:
+ revcount = int(req.form.get('revcount', [revcount])[0])
+ revcount = max(revcount, 1)
+ tmpl.defaults['sessionvars']['revcount'] = revcount
+
+ lessvars = copy.copy(tmpl.defaults['sessionvars'])
+ lessvars['revcount'] = max(revcount / 2, 1)
+ lessvars['rev'] = query
+ morevars = copy.copy(tmpl.defaults['sessionvars'])
+ morevars['revcount'] = revcount * 2
+ morevars['rev'] = query
+
+ def changelist(**map):
+ count = 0
+ lower = encoding.lower
+ qw = lower(query).split()
+
+ def revgen():
+ for i in xrange(len(web.repo) - 1, 0, -100):
+ l = []
+ for j in xrange(max(0, i - 100), i + 1):
+ ctx = web.repo[j]
+ l.append(ctx)
+ l.reverse()
+ for e in l:
+ yield e
+
+ for ctx in revgen():
+ miss = 0
+ for q in qw:
+ if not (q in lower(ctx.user()) or
+ q in lower(ctx.description()) or
+ q in lower(" ".join(ctx.files()))):
+ miss = 1
+ break
+ if miss:
+ continue
+
+ count += 1
+ n = ctx.node()
+ showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
+ files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
+
+ yield tmpl('searchentry',
+ parity=parity.next(),
+ author=ctx.user(),
+ parent=webutil.parents(ctx),
+ child=webutil.children(ctx),
+ changelogtag=showtags,
+ desc=ctx.description(),
+ date=ctx.date(),
+ files=files,
+ rev=ctx.rev(),
+ node=hex(n),
+ tags=webutil.nodetagsdict(web.repo, n),
+ bookmarks=webutil.nodebookmarksdict(web.repo, n),
+ inbranch=webutil.nodeinbranch(web.repo, ctx),
+ branches=webutil.nodebranchdict(web.repo, ctx))
+
+ if count >= revcount:
+ break
+
+ tip = web.repo['tip']
+ parity = paritygen(web.stripecount)
+
+ return tmpl('search', query=query, node=tip.hex(),
+ entries=changelist, archives=web.archivelist("tip"),
+ morevars=morevars, lessvars=lessvars)
+
+def changelog(web, req, tmpl, shortlog=False):
+
+ if 'node' in req.form:
+ ctx = webutil.changectx(web.repo, req)
+ else:
+ if 'rev' in req.form:
+ hi = req.form['rev'][0]
+ else:
+ hi = len(web.repo) - 1
+ try:
+ ctx = web.repo[hi]
+ except error.RepoError:
+ return _search(web, req, tmpl) # XXX redirect to 404 page?
+
+ def changelist(limit=0, **map):
+ l = [] # build a list in forward order for efficiency
+ for i in xrange(start, end):
+ ctx = web.repo[i]
+ n = ctx.node()
+ showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
+ files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
+
+ l.insert(0, {"parity": parity.next(),
+ "author": ctx.user(),
+ "parent": webutil.parents(ctx, i - 1),
+ "child": webutil.children(ctx, i + 1),
+ "changelogtag": showtags,
+ "desc": ctx.description(),
+ "date": ctx.date(),
+ "files": files,
+ "rev": i,
+ "node": hex(n),
+ "tags": webutil.nodetagsdict(web.repo, n),
+ "bookmarks": webutil.nodebookmarksdict(web.repo, n),
+ "inbranch": webutil.nodeinbranch(web.repo, ctx),
+ "branches": webutil.nodebranchdict(web.repo, ctx)
+ })
+
+ if limit > 0:
+ l = l[:limit]
+
+ for e in l:
+ yield e
+
+ revcount = shortlog and web.maxshortchanges or web.maxchanges
+ if 'revcount' in req.form:
+ revcount = int(req.form.get('revcount', [revcount])[0])
+ revcount = max(revcount, 1)
+ tmpl.defaults['sessionvars']['revcount'] = revcount
+
+ lessvars = copy.copy(tmpl.defaults['sessionvars'])
+ lessvars['revcount'] = max(revcount / 2, 1)
+ morevars = copy.copy(tmpl.defaults['sessionvars'])
+ morevars['revcount'] = revcount * 2
+
+ count = len(web.repo)
+ pos = ctx.rev()
+ start = max(0, pos - revcount + 1)
+ end = min(count, start + revcount)
+ pos = end - 1
+ parity = paritygen(web.stripecount, offset=start - end)
+
+ changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
+
+ return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
+ node=ctx.hex(), rev=pos, changesets=count,
+ entries=lambda **x: changelist(limit=0,**x),
+ latestentry=lambda **x: changelist(limit=1,**x),
+ archives=web.archivelist("tip"), revcount=revcount,
+ morevars=morevars, lessvars=lessvars)
+
+def shortlog(web, req, tmpl):
+ return changelog(web, req, tmpl, shortlog = True)
+
+def changeset(web, req, tmpl):
+ ctx = webutil.changectx(web.repo, req)
+ showtags = webutil.showtag(web.repo, tmpl, 'changesettag', ctx.node())
+ showbookmarks = webutil.showbookmark(web.repo, tmpl, 'changesetbookmark',
+ ctx.node())
+ showbranch = webutil.nodebranchnodefault(ctx)
+
+ files = []
+ parity = paritygen(web.stripecount)
+ for blockno, f in enumerate(ctx.files()):
+ template = f in ctx and 'filenodelink' or 'filenolink'
+ files.append(tmpl(template,
+ node=ctx.hex(), file=f, blockno=blockno + 1,
+ parity=parity.next()))
+
+ style = web.config('web', 'style', 'paper')
+ if 'style' in req.form:
+ style = req.form['style'][0]
+
+ parity = paritygen(web.stripecount)
+ diffs = webutil.diffs(web.repo, tmpl, ctx, None, parity, style)
+
+ parity = paritygen(web.stripecount)
+ diffstatgen = webutil.diffstatgen(ctx)
+ diffstat = webutil.diffstat(tmpl, ctx, diffstatgen, parity)
+
+ return tmpl('changeset',
+ diff=diffs,
+ rev=ctx.rev(),
+ node=ctx.hex(),
+ parent=webutil.parents(ctx),
+ child=webutil.children(ctx),
+ changesettag=showtags,
+ changesetbookmark=showbookmarks,
+ changesetbranch=showbranch,
+ author=ctx.user(),
+ desc=ctx.description(),
+ date=ctx.date(),
+ files=files,
+ diffsummary=lambda **x: webutil.diffsummary(diffstatgen),
+ diffstat=diffstat,
+ archives=web.archivelist(ctx.hex()),
+ tags=webutil.nodetagsdict(web.repo, ctx.node()),
+ bookmarks=webutil.nodebookmarksdict(web.repo, ctx.node()),
+ branch=webutil.nodebranchnodefault(ctx),
+ inbranch=webutil.nodeinbranch(web.repo, ctx),
+ branches=webutil.nodebranchdict(web.repo, ctx))
+
+rev = changeset
+
+def decodepath(path):
+ """Hook for mapping a path in the repository to a path in the
+ working copy.
+
+ Extensions (e.g., largefiles) can override this to remap files in
+ the virtual file system presented by the manifest command below."""
+ return path
+
+def manifest(web, req, tmpl):
+ ctx = webutil.changectx(web.repo, req)
+ path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
+ mf = ctx.manifest()
+ node = ctx.node()
+
+ files = {}
+ dirs = {}
+ parity = paritygen(web.stripecount)
+
+ if path and path[-1] != "/":
+ path += "/"
+ l = len(path)
+ abspath = "/" + path
+
+ for full, n in mf.iteritems():
+ # the virtual path (working copy path) used for the full
+ # (repository) path
+ f = decodepath(full)
+
+ if f[:l] != path:
+ continue
+ remain = f[l:]
+ elements = remain.split('/')
+ if len(elements) == 1:
+ files[remain] = full
+ else:
+ h = dirs # need to retain ref to dirs (root)
+ for elem in elements[0:-1]:
+ if elem not in h:
+ h[elem] = {}
+ h = h[elem]
+ if len(h) > 1:
+ break
+ h[None] = None # denotes files present
+
+ if mf and not files and not dirs:
+ raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
+
+ def filelist(**map):
+ for f in sorted(files):
+ full = files[f]
+
+ fctx = ctx.filectx(full)
+ yield {"file": full,
+ "parity": parity.next(),
+ "basename": f,
+ "date": fctx.date(),
+ "size": fctx.size(),
+ "permissions": mf.flags(full)}
+
+ def dirlist(**map):
+ for d in sorted(dirs):
+
+ emptydirs = []
+ h = dirs[d]
+ while isinstance(h, dict) and len(h) == 1:
+ k, v = h.items()[0]
+ if v:
+ emptydirs.append(k)
+ h = v
+
+ path = "%s%s" % (abspath, d)
+ yield {"parity": parity.next(),
+ "path": path,
+ "emptydirs": "/".join(emptydirs),
+ "basename": d}
+
+ return tmpl("manifest",
+ rev=ctx.rev(),
+ node=hex(node),
+ path=abspath,
+ up=webutil.up(abspath),
+ upparity=parity.next(),
+ fentries=filelist,
+ dentries=dirlist,
+ archives=web.archivelist(hex(node)),
+ tags=webutil.nodetagsdict(web.repo, node),
+ bookmarks=webutil.nodebookmarksdict(web.repo, node),
+ inbranch=webutil.nodeinbranch(web.repo, ctx),
+ branches=webutil.nodebranchdict(web.repo, ctx))
+
+def tags(web, req, tmpl):
+ i = reversed(web.repo.tagslist())
+ parity = paritygen(web.stripecount)
+
+ def entries(notip=False, limit=0, **map):
+ count = 0
+ for k, n in i:
+ if notip and k == "tip":
+ continue
+ if limit > 0 and count >= limit:
+ continue
+ count = count + 1
+ yield {"parity": parity.next(),
+ "tag": k,
+ "date": web.repo[n].date(),
+ "node": hex(n)}
+
+ return tmpl("tags",
+ node=hex(web.repo.changelog.tip()),
+ entries=lambda **x: entries(False, 0, **x),
+ entriesnotip=lambda **x: entries(True, 0, **x),
+ latestentry=lambda **x: entries(True, 1, **x))
+
+def bookmarks(web, req, tmpl):
+ i = web.repo._bookmarks.items()
+ parity = paritygen(web.stripecount)
+
+ def entries(limit=0, **map):
+ count = 0
+ for k, n in sorted(i):
+ if limit > 0 and count >= limit:
+ continue
+ count = count + 1
+ yield {"parity": parity.next(),
+ "bookmark": k,
+ "date": web.repo[n].date(),
+ "node": hex(n)}
+
+ return tmpl("bookmarks",
+ node=hex(web.repo.changelog.tip()),
+ entries=lambda **x: entries(0, **x),
+ latestentry=lambda **x: entries(1, **x))
+
+def branches(web, req, tmpl):
+ tips = (web.repo[n] for t, n in web.repo.branchtags().iteritems())
+ heads = web.repo.heads()
+ parity = paritygen(web.stripecount)
+ sortkey = lambda ctx: (not ctx.closesbranch(), ctx.rev())
+
+ def entries(limit, **map):
+ count = 0
+ for ctx in sorted(tips, key=sortkey, reverse=True):
+ if limit > 0 and count >= limit:
+ return
+ count += 1
+ if not web.repo.branchheads(ctx.branch()):
+ status = 'closed'
+ elif ctx.node() not in heads:
+ status = 'inactive'
+ else:
+ status = 'open'
+ yield {'parity': parity.next(),
+ 'branch': ctx.branch(),
+ 'status': status,
+ 'node': ctx.hex(),
+ 'date': ctx.date()}
+
+ return tmpl('branches', node=hex(web.repo.changelog.tip()),
+ entries=lambda **x: entries(0, **x),
+ latestentry=lambda **x: entries(1, **x))
+
+def summary(web, req, tmpl):
+ i = reversed(web.repo.tagslist())
+
+ def tagentries(**map):
+ parity = paritygen(web.stripecount)
+ count = 0
+ for k, n in i:
+ if k == "tip": # skip tip
+ continue
+
+ count += 1
+ if count > 10: # limit to 10 tags
+ break
+
+ yield tmpl("tagentry",
+ parity=parity.next(),
+ tag=k,
+ node=hex(n),
+ date=web.repo[n].date())
+
+ def bookmarks(**map):
+ parity = paritygen(web.stripecount)
+ b = web.repo._bookmarks.items()
+ for k, n in sorted(b)[:10]: # limit to 10 bookmarks
+ yield {'parity': parity.next(),
+ 'bookmark': k,
+ 'date': web.repo[n].date(),
+ 'node': hex(n)}
+
+ def branches(**map):
+ parity = paritygen(web.stripecount)
+
+ b = web.repo.branchtags()
+ l = [(-web.repo.changelog.rev(n), n, t) for t, n in b.iteritems()]
+ for r, n, t in sorted(l):
+ yield {'parity': parity.next(),
+ 'branch': t,
+ 'node': hex(n),
+ 'date': web.repo[n].date()}
+
+ def changelist(**map):
+ parity = paritygen(web.stripecount, offset=start - end)
+ l = [] # build a list in forward order for efficiency
+ for i in xrange(start, end):
+ ctx = web.repo[i]
+ n = ctx.node()
+ hn = hex(n)
+
+ l.insert(0, tmpl(
+ 'shortlogentry',
+ parity=parity.next(),
+ author=ctx.user(),
+ desc=ctx.description(),
+ date=ctx.date(),
+ rev=i,
+ node=hn,
+ tags=webutil.nodetagsdict(web.repo, n),
+ bookmarks=webutil.nodebookmarksdict(web.repo, n),
+ inbranch=webutil.nodeinbranch(web.repo, ctx),
+ branches=webutil.nodebranchdict(web.repo, ctx)))
+
+ yield l
+
+ tip = web.repo['tip']
+ count = len(web.repo)
+ start = max(0, count - web.maxchanges)
+ end = min(count, start + web.maxchanges)
+
+ return tmpl("summary",
+ desc=web.config("web", "description", "unknown"),
+ owner=get_contact(web.config) or "unknown",
+ lastchange=tip.date(),
+ tags=tagentries,
+ bookmarks=bookmarks,
+ branches=branches,
+ shortlog=changelist,
+ node=tip.hex(),
+ archives=web.archivelist("tip"))
+
+def filediff(web, req, tmpl):
+ fctx, ctx = None, None
+ try:
+ fctx = webutil.filectx(web.repo, req)
+ except LookupError:
+ ctx = webutil.changectx(web.repo, req)
+ path = webutil.cleanpath(web.repo, req.form['file'][0])
+ if path not in ctx.files():
+ raise
+
+ if fctx is not None:
+ n = fctx.node()
+ path = fctx.path()
+ ctx = fctx.changectx()
+ else:
+ n = ctx.node()
+ # path already defined in except clause
+
+ parity = paritygen(web.stripecount)
+ style = web.config('web', 'style', 'paper')
+ if 'style' in req.form:
+ style = req.form['style'][0]
+
+ diffs = webutil.diffs(web.repo, tmpl, ctx, [path], parity, style)
+ rename = fctx and webutil.renamelink(fctx) or []
+ ctx = fctx and fctx or ctx
+ return tmpl("filediff",
+ file=path,
+ node=hex(n),
+ rev=ctx.rev(),
+ date=ctx.date(),
+ desc=ctx.description(),
+ author=ctx.user(),
+ rename=rename,
+ branch=webutil.nodebranchnodefault(ctx),
+ parent=webutil.parents(ctx),
+ child=webutil.children(ctx),
+ diff=diffs)
+
+diff = filediff
+
+def comparison(web, req, tmpl):
+ ctx = webutil.changectx(web.repo, req)
+ if 'file' not in req.form:
+ raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
+ path = webutil.cleanpath(web.repo, req.form['file'][0])
+ rename = path in ctx and webutil.renamelink(ctx[path]) or []
+
+ parsecontext = lambda v: v == 'full' and -1 or int(v)
+ if 'context' in req.form:
+ context = parsecontext(req.form['context'][0])
+ else:
+ context = parsecontext(web.config('web', 'comparisoncontext', '5'))
+
+ def filelines(f):
+ if binary(f.data()):
+ mt = mimetypes.guess_type(f.path())[0]
+ if not mt:
+ mt = 'application/octet-stream'
+ return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))]
+ return f.data().splitlines()
+
+ if path in ctx:
+ fctx = ctx[path]
+ rightrev = fctx.filerev()
+ rightnode = fctx.filenode()
+ rightlines = filelines(fctx)
+ parents = fctx.parents()
+ if not parents:
+ leftrev = -1
+ leftnode = nullid
+ leftlines = ()
+ else:
+ pfctx = parents[0]
+ leftrev = pfctx.filerev()
+ leftnode = pfctx.filenode()
+ leftlines = filelines(pfctx)
+ else:
+ rightrev = -1
+ rightnode = nullid
+ rightlines = ()
+ fctx = ctx.parents()[0][path]
+ leftrev = fctx.filerev()
+ leftnode = fctx.filenode()
+ leftlines = filelines(fctx)
+
+ comparison = webutil.compare(tmpl, context, leftlines, rightlines)
+ return tmpl('filecomparison',
+ file=path,
+ node=hex(ctx.node()),
+ rev=ctx.rev(),
+ date=ctx.date(),
+ desc=ctx.description(),
+ author=ctx.user(),
+ rename=rename,
+ branch=webutil.nodebranchnodefault(ctx),
+ parent=webutil.parents(fctx),
+ child=webutil.children(fctx),
+ leftrev=leftrev,
+ leftnode=hex(leftnode),
+ rightrev=rightrev,
+ rightnode=hex(rightnode),
+ comparison=comparison)
+
+def annotate(web, req, tmpl):
+ fctx = webutil.filectx(web.repo, req)
+ f = fctx.path()
+ parity = paritygen(web.stripecount)
+ diffopts = patch.diffopts(web.repo.ui, untrusted=True, section='annotate')
+
+ def annotate(**map):
+ last = None
+ if binary(fctx.data()):
+ mt = (mimetypes.guess_type(fctx.path())[0]
+ or 'application/octet-stream')
+ lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
+ '(binary:%s)' % mt)])
+ else:
+ lines = enumerate(fctx.annotate(follow=True, linenumber=True,
+ diffopts=diffopts))
+ for lineno, ((f, targetline), l) in lines:
+ fnode = f.filenode()
+
+ if last != fnode:
+ last = fnode
+
+ yield {"parity": parity.next(),
+ "node": f.hex(),
+ "rev": f.rev(),
+ "author": f.user(),
+ "desc": f.description(),
+ "file": f.path(),
+ "targetline": targetline,
+ "line": l,
+ "lineid": "l%d" % (lineno + 1),
+ "linenumber": "% 6d" % (lineno + 1),
+ "revdate": f.date()}
+
+ return tmpl("fileannotate",
+ file=f,
+ annotate=annotate,
+ path=webutil.up(f),
+ rev=fctx.rev(),
+ node=fctx.hex(),
+ author=fctx.user(),
+ date=fctx.date(),
+ desc=fctx.description(),
+ rename=webutil.renamelink(fctx),
+ branch=webutil.nodebranchnodefault(fctx),
+ parent=webutil.parents(fctx),
+ child=webutil.children(fctx),
+ permissions=fctx.manifest().flags(f))
+
+def filelog(web, req, tmpl):
+
+ try:
+ fctx = webutil.filectx(web.repo, req)
+ f = fctx.path()
+ fl = fctx.filelog()
+ except error.LookupError:
+ f = webutil.cleanpath(web.repo, req.form['file'][0])
+ fl = web.repo.file(f)
+ numrevs = len(fl)
+ if not numrevs: # file doesn't exist at all
+ raise
+ rev = webutil.changectx(web.repo, req).rev()
+ first = fl.linkrev(0)
+ if rev < first: # current rev is from before file existed
+ raise
+ frev = numrevs - 1
+ while fl.linkrev(frev) > rev:
+ frev -= 1
+ fctx = web.repo.filectx(f, fl.linkrev(frev))
+
+ revcount = web.maxshortchanges
+ if 'revcount' in req.form:
+ revcount = int(req.form.get('revcount', [revcount])[0])
+ revcount = max(revcount, 1)
+ tmpl.defaults['sessionvars']['revcount'] = revcount
+
+ lessvars = copy.copy(tmpl.defaults['sessionvars'])
+ lessvars['revcount'] = max(revcount / 2, 1)
+ morevars = copy.copy(tmpl.defaults['sessionvars'])
+ morevars['revcount'] = revcount * 2
+
+ count = fctx.filerev() + 1
+ start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
+ end = min(count, start + revcount) # last rev on this page
+ parity = paritygen(web.stripecount, offset=start - end)
+
+ def entries(limit=0, **map):
+ l = []
+
+ repo = web.repo
+ for i in xrange(start, end):
+ iterfctx = fctx.filectx(i)
+
+ l.insert(0, {"parity": parity.next(),
+ "filerev": i,
+ "file": f,
+ "node": iterfctx.hex(),
+ "author": iterfctx.user(),
+ "date": iterfctx.date(),
+ "rename": webutil.renamelink(iterfctx),
+ "parent": webutil.parents(iterfctx),
+ "child": webutil.children(iterfctx),
+ "desc": iterfctx.description(),
+ "tags": webutil.nodetagsdict(repo, iterfctx.node()),
+ "bookmarks": webutil.nodebookmarksdict(
+ repo, iterfctx.node()),
+ "branch": webutil.nodebranchnodefault(iterfctx),
+ "inbranch": webutil.nodeinbranch(repo, iterfctx),
+ "branches": webutil.nodebranchdict(repo, iterfctx)})
+
+ if limit > 0:
+ l = l[:limit]
+
+ for e in l:
+ yield e
+
+ nodefunc = lambda x: fctx.filectx(fileid=x)
+ nav = webutil.revnavgen(end - 1, revcount, count, nodefunc)
+ return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
+ entries=lambda **x: entries(limit=0, **x),
+ latestentry=lambda **x: entries(limit=1, **x),
+ revcount=revcount, morevars=morevars, lessvars=lessvars)
+
+def archive(web, req, tmpl):
+ type_ = req.form.get('type', [None])[0]
+ allowed = web.configlist("web", "allow_archive")
+ key = req.form['node'][0]
+
+ if type_ not in web.archives:
+ msg = 'Unsupported archive type: %s' % type_
+ raise ErrorResponse(HTTP_NOT_FOUND, msg)
+
+ if not ((type_ in allowed or
+ web.configbool("web", "allow" + type_, False))):
+ msg = 'Archive type not allowed: %s' % type_
+ raise ErrorResponse(HTTP_FORBIDDEN, msg)
+
+ reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
+ cnode = web.repo.lookup(key)
+ arch_version = key
+ if cnode == key or key == 'tip':
+ arch_version = short(cnode)
+ name = "%s-%s" % (reponame, arch_version)
+ mimetype, artype, extension, encoding = web.archive_specs[type_]
+ headers = [
+ ('Content-Type', mimetype),
+ ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
+ ]
+ if encoding:
+ headers.append(('Content-Encoding', encoding))
+ req.header(headers)
+ req.respond(HTTP_OK)
+ archival.archive(web.repo, req, cnode, artype, prefix=name)
+ return []
+
+
+def static(web, req, tmpl):
+ fname = req.form['file'][0]
+ # a repo owner may set web.static in .hg/hgrc to get any file
+ # readable by the user running the CGI script
+ static = web.config("web", "static", None, untrusted=False)
+ if not static:
+ tp = web.templatepath or templater.templatepath()
+ if isinstance(tp, str):
+ tp = [tp]
+ static = [os.path.join(p, 'static') for p in tp]
+ return [staticfile(static, fname, req)]
+
+def graph(web, req, tmpl):
+
+ ctx = webutil.changectx(web.repo, req)
+ rev = ctx.rev()
+
+ bg_height = 39
+ revcount = web.maxshortchanges
+ if 'revcount' in req.form:
+ revcount = int(req.form.get('revcount', [revcount])[0])
+ revcount = max(revcount, 1)
+ tmpl.defaults['sessionvars']['revcount'] = revcount
+
+ lessvars = copy.copy(tmpl.defaults['sessionvars'])
+ lessvars['revcount'] = max(revcount / 2, 1)
+ morevars = copy.copy(tmpl.defaults['sessionvars'])
+ morevars['revcount'] = revcount * 2
+
+ count = len(web.repo)
+ pos = rev
+ start = max(0, pos - revcount + 1)
+ end = min(count, start + revcount)
+ pos = end - 1
+
+ uprev = min(max(0, count - 1), rev + revcount)
+ downrev = max(0, rev - revcount)
+ changenav = webutil.revnavgen(pos, revcount, count, web.repo.changectx)
+
+ dag = graphmod.dagwalker(web.repo, range(start, end)[::-1])
+ tree = list(graphmod.colored(dag, web.repo))
+
+ def getcolumns(tree):
+ cols = 0
+ for (id, type, ctx, vtx, edges) in tree:
+ if type != graphmod.CHANGESET:
+ continue
+ cols = max(cols, max([edge[0] for edge in edges] or [0]),
+ max([edge[1] for edge in edges] or [0]))
+ return cols
+
+ def graphdata(usetuples, **map):
+ data = []
+
+ row = 0
+ for (id, type, ctx, vtx, edges) in tree:
+ if type != graphmod.CHANGESET:
+ continue
+ node = str(ctx)
+ age = templatefilters.age(ctx.date())
+ desc = templatefilters.firstline(ctx.description())
+ desc = cgi.escape(templatefilters.nonempty(desc))
+ user = cgi.escape(templatefilters.person(ctx.user()))
+ branch = ctx.branch()
+ try:
+ branchnode = web.repo.branchtip(branch)
+ except error.RepoLookupError:
+ branchnode = None
+ branch = branch, branchnode == ctx.node()
+
+ if usetuples:
+ data.append((node, vtx, edges, desc, user, age, branch,
+ ctx.tags(), ctx.bookmarks()))
+ else:
+ edgedata = [dict(col=edge[0], nextcol=edge[1],
+ color=(edge[2] - 1) % 6 + 1,
+ width=edge[3], bcolor=edge[4])
+ for edge in edges]
+
+ data.append(
+ dict(node=node,
+ col=vtx[0],
+ color=(vtx[1] - 1) % 6 + 1,
+ edges=edgedata,
+ row=row,
+ nextrow=row + 1,
+ desc=desc,
+ user=user,
+ age=age,
+ bookmarks=webutil.nodebookmarksdict(
+ web.repo, ctx.node()),
+ branches=webutil.nodebranchdict(web.repo, ctx),
+ inbranch=webutil.nodeinbranch(web.repo, ctx),
+ tags=webutil.nodetagsdict(web.repo, ctx.node())))
+
+ row += 1
+
+ return data
+
+ cols = getcolumns(tree)
+ rows = len(tree)
+ canvasheight = (rows + 1) * bg_height - 27
+
+ return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
+ lessvars=lessvars, morevars=morevars, downrev=downrev,
+ cols=cols, rows=rows,
+ canvaswidth=(cols + 1) * bg_height,
+ truecanvasheight=rows * bg_height,
+ canvasheight=canvasheight, bg_height=bg_height,
+ jsdata=lambda **x: graphdata(True, **x),
+ nodes=lambda **x: graphdata(False, **x),
+ node=ctx.hex(), changenav=changenav)
+
+def _getdoc(e):
+ doc = e[0].__doc__
+ if doc:
+ doc = _(doc).split('\n')[0]
+ else:
+ doc = _('(no help text available)')
+ return doc
+
+def help(web, req, tmpl):
+ from mercurial import commands # avoid cycle
+
+ topicname = req.form.get('node', [None])[0]
+ if not topicname:
+ def topics(**map):
+ for entries, summary, _ in helpmod.helptable:
+ yield {'topic': entries[0], 'summary': summary}
+
+ early, other = [], []
+ primary = lambda s: s.split('|')[0]
+ for c, e in commands.table.iteritems():
+ doc = _getdoc(e)
+ if 'DEPRECATED' in doc or c.startswith('debug'):
+ continue
+ cmd = primary(c)
+ if cmd.startswith('^'):
+ early.append((cmd[1:], doc))
+ else:
+ other.append((cmd, doc))
+
+ early.sort()
+ other.sort()
+
+ def earlycommands(**map):
+ for c, doc in early:
+ yield {'topic': c, 'summary': doc}
+
+ def othercommands(**map):
+ for c, doc in other:
+ yield {'topic': c, 'summary': doc}
+
+ return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
+ othercommands=othercommands, title='Index')
+
+ u = webutil.wsgiui()
+ u.pushbuffer()
+ u.verbose = True
+ try:
+ commands.help_(u, topicname)
+ except error.UnknownCommand:
+ raise ErrorResponse(HTTP_NOT_FOUND)
+ doc = u.popbuffer()
+ return tmpl('help', topic=topicname, doc=doc)
diff --git a/mercurial/hgweb/webutil.py b/mercurial/hgweb/webutil.py
new file mode 100644
index 0000000..ca5e7d8
--- /dev/null
+++ b/mercurial/hgweb/webutil.py
@@ -0,0 +1,331 @@
+# hgweb/webutil.py - utility library for the web interface.
+#
+# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, copy
+from mercurial import match, patch, scmutil, error, ui, util
+from mercurial.i18n import _
+from mercurial.node import hex, nullid
+from common import ErrorResponse
+from common import HTTP_NOT_FOUND
+import difflib
+
+def up(p):
+ if p[0] != "/":
+ p = "/" + p
+ if p[-1] == "/":
+ p = p[:-1]
+ up = os.path.dirname(p)
+ if up == "/":
+ return "/"
+ return up + "/"
+
+def revnavgen(pos, pagelen, limit, nodefunc):
+ def seq(factor, limit=None):
+ if limit:
+ yield limit
+ if limit >= 20 and limit <= 40:
+ yield 50
+ else:
+ yield 1 * factor
+ yield 3 * factor
+ for f in seq(factor * 10):
+ yield f
+
+ navbefore = []
+ navafter = []
+
+ last = 0
+ for f in seq(1, pagelen):
+ if f < pagelen or f <= last:
+ continue
+ if f > limit:
+ break
+ last = f
+ if pos + f < limit:
+ navafter.append(("+%d" % f, hex(nodefunc(pos + f).node())))
+ if pos - f >= 0:
+ navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
+
+ navafter.append(("tip", "tip"))
+ try:
+ navbefore.insert(0, ("(0)", hex(nodefunc('0').node())))
+ except error.RepoError:
+ pass
+
+ def gen(l):
+ def f(**map):
+ for label, node in l:
+ yield {"label": label, "node": node}
+ return f
+
+ return (dict(before=gen(navbefore), after=gen(navafter)),)
+
+def _siblings(siblings=[], hiderev=None):
+ siblings = [s for s in siblings if s.node() != nullid]
+ if len(siblings) == 1 and siblings[0].rev() == hiderev:
+ return
+ for s in siblings:
+ d = {'node': s.hex(), 'rev': s.rev()}
+ d['user'] = s.user()
+ d['date'] = s.date()
+ d['description'] = s.description()
+ d['branch'] = s.branch()
+ if util.safehasattr(s, 'path'):
+ d['file'] = s.path()
+ yield d
+
+def parents(ctx, hide=None):
+ return _siblings(ctx.parents(), hide)
+
+def children(ctx, hide=None):
+ return _siblings(ctx.children(), hide)
+
+def renamelink(fctx):
+ r = fctx.renamed()
+ if r:
+ return [dict(file=r[0], node=hex(r[1]))]
+ return []
+
+def nodetagsdict(repo, node):
+ return [{"name": i} for i in repo.nodetags(node)]
+
+def nodebookmarksdict(repo, node):
+ return [{"name": i} for i in repo.nodebookmarks(node)]
+
+def nodebranchdict(repo, ctx):
+ branches = []
+ branch = ctx.branch()
+ # If this is an empty repo, ctx.node() == nullid,
+ # ctx.branch() == 'default'.
+ try:
+ branchnode = repo.branchtip(branch)
+ except error.RepoLookupError:
+ branchnode = None
+ if branchnode == ctx.node():
+ branches.append({"name": branch})
+ return branches
+
+def nodeinbranch(repo, ctx):
+ branches = []
+ branch = ctx.branch()
+ try:
+ branchnode = repo.branchtip(branch)
+ except error.RepoLookupError:
+ branchnode = None
+ if branch != 'default' and branchnode != ctx.node():
+ branches.append({"name": branch})
+ return branches
+
+def nodebranchnodefault(ctx):
+ branches = []
+ branch = ctx.branch()
+ if branch != 'default':
+ branches.append({"name": branch})
+ return branches
+
+def showtag(repo, tmpl, t1, node=nullid, **args):
+ for t in repo.nodetags(node):
+ yield tmpl(t1, tag=t, **args)
+
+def showbookmark(repo, tmpl, t1, node=nullid, **args):
+ for t in repo.nodebookmarks(node):
+ yield tmpl(t1, bookmark=t, **args)
+
+def cleanpath(repo, path):
+ path = path.lstrip('/')
+ return scmutil.canonpath(repo.root, '', path)
+
+def changectx(repo, req):
+ changeid = "tip"
+ if 'node' in req.form:
+ changeid = req.form['node'][0]
+ elif 'manifest' in req.form:
+ changeid = req.form['manifest'][0]
+
+ try:
+ ctx = repo[changeid]
+ except error.RepoError:
+ man = repo.manifest
+ ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
+
+ return ctx
+
+def filectx(repo, req):
+ if 'file' not in req.form:
+ raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
+ path = cleanpath(repo, req.form['file'][0])
+ if 'node' in req.form:
+ changeid = req.form['node'][0]
+ elif 'filenode' in req.form:
+ changeid = req.form['filenode'][0]
+ else:
+ raise ErrorResponse(HTTP_NOT_FOUND, 'node or filenode not given')
+ try:
+ fctx = repo[changeid][path]
+ except error.RepoError:
+ fctx = repo.filectx(path, fileid=changeid)
+
+ return fctx
+
+def listfilediffs(tmpl, files, node, max):
+ for f in files[:max]:
+ yield tmpl('filedifflink', node=hex(node), file=f)
+ if len(files) > max:
+ yield tmpl('fileellipses')
+
+def diffs(repo, tmpl, ctx, files, parity, style):
+
+ def countgen():
+ start = 1
+ while True:
+ yield start
+ start += 1
+
+ blockcount = countgen()
+ def prettyprintlines(diff, blockno):
+ for lineno, l in enumerate(diff.splitlines(True)):
+ lineno = "%d.%d" % (blockno, lineno + 1)
+ if l.startswith('+'):
+ ltype = "difflineplus"
+ elif l.startswith('-'):
+ ltype = "difflineminus"
+ elif l.startswith('@'):
+ ltype = "difflineat"
+ else:
+ ltype = "diffline"
+ yield tmpl(ltype,
+ line=l,
+ lineid="l%s" % lineno,
+ linenumber="% 8s" % lineno)
+
+ if files:
+ m = match.exact(repo.root, repo.getcwd(), files)
+ else:
+ m = match.always(repo.root, repo.getcwd())
+
+ diffopts = patch.diffopts(repo.ui, untrusted=True)
+ parents = ctx.parents()
+ node1 = parents and parents[0].node() or nullid
+ node2 = ctx.node()
+
+ block = []
+ for chunk in patch.diff(repo, node1, node2, m, opts=diffopts):
+ if chunk.startswith('diff') and block:
+ blockno = blockcount.next()
+ yield tmpl('diffblock', parity=parity.next(), blockno=blockno,
+ lines=prettyprintlines(''.join(block), blockno))
+ block = []
+ if chunk.startswith('diff') and style != 'raw':
+ chunk = ''.join(chunk.splitlines(True)[1:])
+ block.append(chunk)
+ blockno = blockcount.next()
+ yield tmpl('diffblock', parity=parity.next(), blockno=blockno,
+ lines=prettyprintlines(''.join(block), blockno))
+
+def compare(tmpl, context, leftlines, rightlines):
+ '''Generator function that provides side-by-side comparison data.'''
+
+ def compline(type, leftlineno, leftline, rightlineno, rightline):
+ lineid = leftlineno and ("l%s" % leftlineno) or ''
+ lineid += rightlineno and ("r%s" % rightlineno) or ''
+ return tmpl('comparisonline',
+ type=type,
+ lineid=lineid,
+ leftlinenumber="% 6s" % (leftlineno or ''),
+ leftline=leftline or '',
+ rightlinenumber="% 6s" % (rightlineno or ''),
+ rightline=rightline or '')
+
+ def getblock(opcodes):
+ for type, llo, lhi, rlo, rhi in opcodes:
+ len1 = lhi - llo
+ len2 = rhi - rlo
+ count = min(len1, len2)
+ for i in xrange(count):
+ yield compline(type=type,
+ leftlineno=llo + i + 1,
+ leftline=leftlines[llo + i],
+ rightlineno=rlo + i + 1,
+ rightline=rightlines[rlo + i])
+ if len1 > len2:
+ for i in xrange(llo + count, lhi):
+ yield compline(type=type,
+ leftlineno=i + 1,
+ leftline=leftlines[i],
+ rightlineno=None,
+ rightline=None)
+ elif len2 > len1:
+ for i in xrange(rlo + count, rhi):
+ yield compline(type=type,
+ leftlineno=None,
+ leftline=None,
+ rightlineno=i + 1,
+ rightline=rightlines[i])
+
+ s = difflib.SequenceMatcher(None, leftlines, rightlines)
+ if context < 0:
+ yield tmpl('comparisonblock', lines=getblock(s.get_opcodes()))
+ else:
+ for oc in s.get_grouped_opcodes(n=context):
+ yield tmpl('comparisonblock', lines=getblock(oc))
+
+def diffstatgen(ctx):
+ '''Generator function that provides the diffstat data.'''
+
+ stats = patch.diffstatdata(util.iterlines(ctx.diff()))
+ maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
+ while True:
+ yield stats, maxname, maxtotal, addtotal, removetotal, binary
+
+def diffsummary(statgen):
+ '''Return a short summary of the diff.'''
+
+ stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
+ return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % (
+ len(stats), addtotal, removetotal)
+
+def diffstat(tmpl, ctx, statgen, parity):
+ '''Return a diffstat template for each file in the diff.'''
+
+ stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
+ files = ctx.files()
+
+ def pct(i):
+ if maxtotal == 0:
+ return 0
+ return (float(i) / maxtotal) * 100
+
+ fileno = 0
+ for filename, adds, removes, isbinary in stats:
+ template = filename in files and 'diffstatlink' or 'diffstatnolink'
+ total = adds + removes
+ fileno += 1
+ yield tmpl(template, node=ctx.hex(), file=filename, fileno=fileno,
+ total=total, addpct=pct(adds), removepct=pct(removes),
+ parity=parity.next())
+
+class sessionvars(object):
+ def __init__(self, vars, start='?'):
+ self.start = start
+ self.vars = vars
+ def __getitem__(self, key):
+ return self.vars[key]
+ def __setitem__(self, key, value):
+ self.vars[key] = value
+ def __copy__(self):
+ return sessionvars(copy.copy(self.vars), self.start)
+ def __iter__(self):
+ separator = self.start
+ for key, value in self.vars.iteritems():
+ yield {'name': key, 'value': str(value), 'separator': separator}
+ separator = '&'
+
+class wsgiui(ui.ui):
+ # default termwidth breaks under mod_wsgi
+ def termwidth(self):
+ return 80
diff --git a/mercurial/hgweb/wsgicgi.py b/mercurial/hgweb/wsgicgi.py
new file mode 100644
index 0000000..5d18d8e
--- /dev/null
+++ b/mercurial/hgweb/wsgicgi.py
@@ -0,0 +1,81 @@
+# hgweb/wsgicgi.py - CGI->WSGI translator
+#
+# Copyright 2006 Eric Hopper <hopper@omnifarious.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+#
+# This was originally copied from the public domain code at
+# http://www.python.org/dev/peps/pep-0333/#the-server-gateway-side
+
+import os, sys
+from mercurial import util
+from mercurial.hgweb import common
+
+def launch(application):
+ util.setbinary(sys.stdin)
+ util.setbinary(sys.stdout)
+
+ environ = dict(os.environ.iteritems())
+ environ.setdefault('PATH_INFO', '')
+ if environ.get('SERVER_SOFTWARE', '').startswith('Microsoft-IIS'):
+ # IIS includes script_name in path_info
+ scriptname = environ['SCRIPT_NAME']
+ if environ['PATH_INFO'].startswith(scriptname):
+ environ['PATH_INFO'] = environ['PATH_INFO'][len(scriptname):]
+
+ stdin = sys.stdin
+ if environ.get('HTTP_EXPECT', '').lower() == '100-continue':
+ stdin = common.continuereader(stdin, sys.stdout.write)
+
+ environ['wsgi.input'] = stdin
+ environ['wsgi.errors'] = sys.stderr
+ environ['wsgi.version'] = (1, 0)
+ environ['wsgi.multithread'] = False
+ environ['wsgi.multiprocess'] = True
+ environ['wsgi.run_once'] = True
+
+ if environ.get('HTTPS', 'off').lower() in ('on', '1', 'yes'):
+ environ['wsgi.url_scheme'] = 'https'
+ else:
+ environ['wsgi.url_scheme'] = 'http'
+
+ headers_set = []
+ headers_sent = []
+ out = sys.stdout
+
+ def write(data):
+ if not headers_set:
+ raise AssertionError("write() before start_response()")
+
+ elif not headers_sent:
+ # Before the first output, send the stored headers
+ status, response_headers = headers_sent[:] = headers_set
+ out.write('Status: %s\r\n' % status)
+ for header in response_headers:
+ out.write('%s: %s\r\n' % header)
+ out.write('\r\n')
+
+ out.write(data)
+ out.flush()
+
+ def start_response(status, response_headers, exc_info=None):
+ if exc_info:
+ try:
+ if headers_sent:
+ # Re-raise original exception if headers sent
+ raise exc_info[0](exc_info[1], exc_info[2])
+ finally:
+ exc_info = None # avoid dangling circular ref
+ elif headers_set:
+ raise AssertionError("Headers already set!")
+
+ headers_set[:] = [status, response_headers]
+ return write
+
+ content = application(environ, start_response)
+ try:
+ for chunk in content:
+ write(chunk)
+ finally:
+ getattr(content, 'close', lambda : None)()
diff --git a/mercurial/hook.py b/mercurial/hook.py
new file mode 100644
index 0000000..9831353
--- /dev/null
+++ b/mercurial/hook.py
@@ -0,0 +1,188 @@
+# hook.py - hook support for mercurial
+#
+# Copyright 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import os, sys
+import extensions, util
+
+def _pythonhook(ui, repo, name, hname, funcname, args, throw):
+ '''call python hook. hook is callable object, looked up as
+ name in python module. if callable returns "true", hook
+ fails, else passes. if hook raises exception, treated as
+ hook failure. exception propagates if throw is "true".
+
+ reason for "true" meaning "hook failed" is so that
+ unmodified commands (e.g. mercurial.commands.update) can
+ be run as hooks without wrappers to convert return values.'''
+
+ ui.note(_("calling hook %s: %s\n") % (hname, funcname))
+ obj = funcname
+ if not util.safehasattr(obj, '__call__'):
+ d = funcname.rfind('.')
+ if d == -1:
+ raise util.Abort(_('%s hook is invalid ("%s" not in '
+ 'a module)') % (hname, funcname))
+ modname = funcname[:d]
+ oldpaths = sys.path
+ if util.mainfrozen():
+ # binary installs require sys.path manipulation
+ modpath, modfile = os.path.split(modname)
+ if modpath and modfile:
+ sys.path = sys.path[:] + [modpath]
+ modname = modfile
+ try:
+ obj = __import__(modname)
+ except ImportError:
+ e1 = sys.exc_type, sys.exc_value, sys.exc_traceback
+ try:
+ # extensions are loaded with hgext_ prefix
+ obj = __import__("hgext_%s" % modname)
+ except ImportError:
+ e2 = sys.exc_type, sys.exc_value, sys.exc_traceback
+ if ui.tracebackflag:
+ ui.warn(_('exception from first failed import attempt:\n'))
+ ui.traceback(e1)
+ if ui.tracebackflag:
+ ui.warn(_('exception from second failed import attempt:\n'))
+ ui.traceback(e2)
+ raise util.Abort(_('%s hook is invalid '
+ '(import of "%s" failed)') %
+ (hname, modname))
+ sys.path = oldpaths
+ try:
+ for p in funcname.split('.')[1:]:
+ obj = getattr(obj, p)
+ except AttributeError:
+ raise util.Abort(_('%s hook is invalid '
+ '("%s" is not defined)') %
+ (hname, funcname))
+ if not util.safehasattr(obj, '__call__'):
+ raise util.Abort(_('%s hook is invalid '
+ '("%s" is not callable)') %
+ (hname, funcname))
+ try:
+ try:
+ # redirect IO descriptors to the ui descriptors so hooks
+ # that write directly to these don't mess up the command
+ # protocol when running through the command server
+ old = sys.stdout, sys.stderr, sys.stdin
+ sys.stdout, sys.stderr, sys.stdin = ui.fout, ui.ferr, ui.fin
+
+ r = obj(ui=ui, repo=repo, hooktype=name, **args)
+ except KeyboardInterrupt:
+ raise
+ except Exception, exc:
+ if isinstance(exc, util.Abort):
+ ui.warn(_('error: %s hook failed: %s\n') %
+ (hname, exc.args[0]))
+ else:
+ ui.warn(_('error: %s hook raised an exception: '
+ '%s\n') % (hname, exc))
+ if throw:
+ raise
+ ui.traceback()
+ return True
+ finally:
+ sys.stdout, sys.stderr, sys.stdin = old
+ if r:
+ if throw:
+ raise util.Abort(_('%s hook failed') % hname)
+ ui.warn(_('warning: %s hook failed\n') % hname)
+ return r
+
+def _exthook(ui, repo, name, cmd, args, throw):
+ ui.note(_("running hook %s: %s\n") % (name, cmd))
+
+ env = {}
+ for k, v in args.iteritems():
+ if util.safehasattr(v, '__call__'):
+ v = v()
+ if isinstance(v, dict):
+ # make the dictionary element order stable across Python
+ # implementations
+ v = ('{' +
+ ', '.join('%r: %r' % i for i in sorted(v.iteritems())) +
+ '}')
+ env['HG_' + k.upper()] = v
+
+ if repo:
+ cwd = repo.root
+ else:
+ cwd = os.getcwd()
+ if 'HG_URL' in env and env['HG_URL'].startswith('remote:http'):
+ r = util.system(cmd, environ=env, cwd=cwd, out=ui)
+ else:
+ r = util.system(cmd, environ=env, cwd=cwd, out=ui.fout)
+ if r:
+ desc, r = util.explainexit(r)
+ if throw:
+ raise util.Abort(_('%s hook %s') % (name, desc))
+ ui.warn(_('warning: %s hook %s\n') % (name, desc))
+ return r
+
+def _allhooks(ui):
+ hooks = []
+ for name, cmd in ui.configitems('hooks'):
+ if not name.startswith('priority'):
+ priority = ui.configint('hooks', 'priority.%s' % name, 0)
+ hooks.append((-priority, len(hooks), name, cmd))
+ return [(k, v) for p, o, k, v in sorted(hooks)]
+
+_redirect = False
+def redirect(state):
+ global _redirect
+ _redirect = state
+
+def hook(ui, repo, name, throw=False, **args):
+ if not ui.callhooks:
+ return False
+
+ r = False
+
+ oldstdout = -1
+ if _redirect:
+ try:
+ stdoutno = sys.__stdout__.fileno()
+ stderrno = sys.__stderr__.fileno()
+ # temporarily redirect stdout to stderr, if possible
+ if stdoutno >= 0 and stderrno >= 0:
+ sys.__stdout__.flush()
+ oldstdout = os.dup(stdoutno)
+ os.dup2(stderrno, stdoutno)
+ except AttributeError:
+ # __stdout/err__ doesn't have fileno(), it's not a real file
+ pass
+
+ try:
+ for hname, cmd in _allhooks(ui):
+ if hname.split('.')[0] != name or not cmd:
+ continue
+ if util.safehasattr(cmd, '__call__'):
+ r = _pythonhook(ui, repo, name, hname, cmd, args, throw) or r
+ elif cmd.startswith('python:'):
+ if cmd.count(':') >= 2:
+ path, cmd = cmd[7:].rsplit(':', 1)
+ path = util.expandpath(path)
+ if repo:
+ path = os.path.join(repo.root, path)
+ try:
+ mod = extensions.loadpath(path, 'hghook.%s' % hname)
+ except Exception:
+ ui.write(_("loading %s hook failed:\n") % hname)
+ raise
+ hookfn = getattr(mod, cmd)
+ else:
+ hookfn = cmd[7:].strip()
+ r = _pythonhook(ui, repo, name, hname, hookfn, args, throw) or r
+ else:
+ r = _exthook(ui, repo, hname, cmd, args, throw) or r
+ finally:
+ if _redirect and oldstdout >= 0:
+ os.dup2(oldstdout, stdoutno)
+ os.close(oldstdout)
+
+ return r
diff --git a/mercurial/httpclient/__init__.py b/mercurial/httpclient/__init__.py
new file mode 100644
index 0000000..f5c3baf
--- /dev/null
+++ b/mercurial/httpclient/__init__.py
@@ -0,0 +1,674 @@
+# Copyright 2010, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Improved HTTP/1.1 client library
+
+This library contains an HTTPConnection which is similar to the one in
+httplib, but has several additional features:
+
+ * supports keepalives natively
+ * uses select() to block for incoming data
+ * notices when the server responds early to a request
+ * implements ssl inline instead of in a different class
+"""
+
+import cStringIO
+import errno
+import httplib
+import logging
+import rfc822
+import select
+import socket
+
+import _readers
+import socketutil
+
+logger = logging.getLogger(__name__)
+
+__all__ = ['HTTPConnection', 'HTTPResponse']
+
+HTTP_VER_1_0 = 'HTTP/1.0'
+HTTP_VER_1_1 = 'HTTP/1.1'
+
+OUTGOING_BUFFER_SIZE = 1 << 15
+INCOMING_BUFFER_SIZE = 1 << 20
+
+HDR_ACCEPT_ENCODING = 'accept-encoding'
+HDR_CONNECTION_CTRL = 'connection'
+HDR_CONTENT_LENGTH = 'content-length'
+HDR_XFER_ENCODING = 'transfer-encoding'
+
+XFER_ENCODING_CHUNKED = 'chunked'
+
+CONNECTION_CLOSE = 'close'
+
+EOL = '\r\n'
+_END_HEADERS = EOL * 2
+
+# Based on some searching around, 1 second seems like a reasonable
+# default here.
+TIMEOUT_ASSUME_CONTINUE = 1
+TIMEOUT_DEFAULT = None
+
+
+class HTTPResponse(object):
+ """Response from an HTTP server.
+
+ The response will continue to load as available. If you need the
+ complete response before continuing, check the .complete() method.
+ """
+ def __init__(self, sock, timeout, method):
+ self.sock = sock
+ self.method = method
+ self.raw_response = ''
+ self._headers_len = 0
+ self.headers = None
+ self.will_close = False
+ self.status_line = ''
+ self.status = None
+ self.continued = False
+ self.http_version = None
+ self.reason = None
+ self._reader = None
+
+ self._read_location = 0
+ self._eol = EOL
+
+ self._timeout = timeout
+
+ @property
+ def _end_headers(self):
+ return self._eol * 2
+
+ def complete(self):
+ """Returns true if this response is completely loaded.
+
+ Note that if this is a connection where complete means the
+ socket is closed, this will nearly always return False, even
+ in cases where all the data has actually been loaded.
+ """
+ if self._reader:
+ return self._reader.done()
+
+ def _close(self):
+ if self._reader is not None:
+ self._reader._close()
+
+ def readline(self):
+ """Read a single line from the response body.
+
+ This may block until either a line ending is found or the
+ response is complete.
+ """
+ # TODO: move this into the reader interface where it can be
+ # smarter (and probably avoid copies)
+ bytes = []
+ while not bytes:
+ try:
+ bytes = [self._reader.read(1)]
+ except _readers.ReadNotReady:
+ self._select()
+ while bytes[-1] != '\n' and not self.complete():
+ self._select()
+ bytes.append(self._reader.read(1))
+ if bytes[-1] != '\n':
+ next = self._reader.read(1)
+ while next and next != '\n':
+ bytes.append(next)
+ next = self._reader.read(1)
+ bytes.append(next)
+ return ''.join(bytes)
+
+ def read(self, length=None):
+ # if length is None, unbounded read
+ while (not self.complete() # never select on a finished read
+ and (not length # unbounded, so we wait for complete()
+ or length > self._reader.available_data)):
+ self._select()
+ if not length:
+ length = self._reader.available_data
+ r = self._reader.read(length)
+ if self.complete() and self.will_close:
+ self.sock.close()
+ return r
+
+ def _select(self):
+ r, _, _ = select.select([self.sock], [], [], self._timeout)
+ if not r:
+ # socket was not readable. If the response is not
+ # complete, raise a timeout.
+ if not self.complete():
+ logger.info('timed out with timeout of %s', self._timeout)
+ raise HTTPTimeoutException('timeout reading data')
+ try:
+ data = self.sock.recv(INCOMING_BUFFER_SIZE)
+ except socket.sslerror, e:
+ if e.args[0] != socket.SSL_ERROR_WANT_READ:
+ raise
+ logger.debug('SSL_WANT_READ in _select, should retry later')
+ return True
+ logger.debug('response read %d data during _select', len(data))
+ # If the socket was readable and no data was read, that means
+ # the socket was closed. Inform the reader (if any) so it can
+ # raise an exception if this is an invalid situation.
+ if not data:
+ if self._reader:
+ self._reader._close()
+ return False
+ else:
+ self._load_response(data)
+ return True
+
+ def _load_response(self, data):
+ # Being here implies we're not at the end of the headers yet,
+ # since at the end of this method if headers were completely
+ # loaded we replace this method with the load() method of the
+ # reader we created.
+ self.raw_response += data
+ # This is a bogus server with bad line endings
+ if self._eol not in self.raw_response:
+ for bad_eol in ('\n', '\r'):
+ if (bad_eol in self.raw_response
+ # verify that bad_eol is not the end of the incoming data
+ # as this could be a response line that just got
+ # split between \r and \n.
+ and (self.raw_response.index(bad_eol) <
+ (len(self.raw_response) - 1))):
+ logger.info('bogus line endings detected, '
+ 'using %r for EOL', bad_eol)
+ self._eol = bad_eol
+ break
+ # exit early if not at end of headers
+ if self._end_headers not in self.raw_response or self.headers:
+ return
+
+ # handle 100-continue response
+ hdrs, body = self.raw_response.split(self._end_headers, 1)
+ http_ver, status = hdrs.split(' ', 1)
+ if status.startswith('100'):
+ self.raw_response = body
+ self.continued = True
+ logger.debug('continue seen, setting body to %r', body)
+ return
+
+ # arriving here means we should parse response headers
+ # as all headers have arrived completely
+ hdrs, body = self.raw_response.split(self._end_headers, 1)
+ del self.raw_response
+ if self._eol in hdrs:
+ self.status_line, hdrs = hdrs.split(self._eol, 1)
+ else:
+ self.status_line = hdrs
+ hdrs = ''
+ # TODO HTTP < 1.0 support
+ (self.http_version, self.status,
+ self.reason) = self.status_line.split(' ', 2)
+ self.status = int(self.status)
+ if self._eol != EOL:
+ hdrs = hdrs.replace(self._eol, '\r\n')
+ headers = rfc822.Message(cStringIO.StringIO(hdrs))
+ content_len = None
+ if HDR_CONTENT_LENGTH in headers:
+ content_len = int(headers[HDR_CONTENT_LENGTH])
+ if self.http_version == HTTP_VER_1_0:
+ self.will_close = True
+ elif HDR_CONNECTION_CTRL in headers:
+ self.will_close = (
+ headers[HDR_CONNECTION_CTRL].lower() == CONNECTION_CLOSE)
+ if (HDR_XFER_ENCODING in headers
+ and headers[HDR_XFER_ENCODING].lower() == XFER_ENCODING_CHUNKED):
+ self._reader = _readers.ChunkedReader(self._eol)
+ logger.debug('using a chunked reader')
+ else:
+ # HEAD responses are forbidden from returning a body, and
+ # it's implausible for a CONNECT response to use
+ # close-is-end logic for an OK response.
+ if (self.method == 'HEAD' or
+ (self.method == 'CONNECT' and content_len is None)):
+ content_len = 0
+ if content_len is not None:
+ logger.debug('using a content-length reader with length %d',
+ content_len)
+ self._reader = _readers.ContentLengthReader(content_len)
+ else:
+ # Response body had no length specified and is not
+ # chunked, so the end of the body will only be
+ # identifiable by the termination of the socket by the
+ # server. My interpretation of the spec means that we
+ # are correct in hitting this case if
+ # transfer-encoding, content-length, and
+ # connection-control were left unspecified.
+ self._reader = _readers.CloseIsEndReader()
+ logger.debug('using a close-is-end reader')
+ self.will_close = True
+
+ if body:
+ self._reader._load(body)
+ logger.debug('headers complete')
+ self.headers = headers
+ self._load_response = self._reader._load
+
+
+class HTTPConnection(object):
+ """Connection to a single http server.
+
+ Supports 100-continue and keepalives natively. Uses select() for
+ non-blocking socket operations.
+ """
+ http_version = HTTP_VER_1_1
+ response_class = HTTPResponse
+
+ def __init__(self, host, port=None, use_ssl=None, ssl_validator=None,
+ timeout=TIMEOUT_DEFAULT,
+ continue_timeout=TIMEOUT_ASSUME_CONTINUE,
+ proxy_hostport=None, **ssl_opts):
+ """Create a new HTTPConnection.
+
+ Args:
+ host: The host to which we'll connect.
+ port: Optional. The port over which we'll connect. Default 80 for
+ non-ssl, 443 for ssl.
+ use_ssl: Optional. Wether to use ssl. Defaults to False if port is
+ not 443, true if port is 443.
+ ssl_validator: a function(socket) to validate the ssl cert
+ timeout: Optional. Connection timeout, default is TIMEOUT_DEFAULT.
+ continue_timeout: Optional. Timeout for waiting on an expected
+ "100 Continue" response. Default is TIMEOUT_ASSUME_CONTINUE.
+ proxy_hostport: Optional. Tuple of (host, port) to use as an http
+ proxy for the connection. Default is to not use a proxy.
+ """
+ if port is None and host.count(':') == 1 or ']:' in host:
+ host, port = host.rsplit(':', 1)
+ port = int(port)
+ if '[' in host:
+ host = host[1:-1]
+ if use_ssl is None and port is None:
+ use_ssl = False
+ port = 80
+ elif use_ssl is None:
+ use_ssl = (port == 443)
+ elif port is None:
+ port = (use_ssl and 443 or 80)
+ self.port = port
+ if use_ssl and not socketutil.have_ssl:
+ raise Exception('ssl requested but unavailable on this Python')
+ self.ssl = use_ssl
+ self.ssl_opts = ssl_opts
+ self._ssl_validator = ssl_validator
+ self.host = host
+ self.sock = None
+ self._current_response = None
+ self._current_response_taken = False
+ if proxy_hostport is None:
+ self._proxy_host = self._proxy_port = None
+ else:
+ self._proxy_host, self._proxy_port = proxy_hostport
+
+ self.timeout = timeout
+ self.continue_timeout = continue_timeout
+
+ def _connect(self):
+ """Connect to the host and port specified in __init__."""
+ if self.sock:
+ return
+ if self._proxy_host is not None:
+ logger.info('Connecting to http proxy %s:%s',
+ self._proxy_host, self._proxy_port)
+ sock = socketutil.create_connection((self._proxy_host,
+ self._proxy_port))
+ if self.ssl:
+ # TODO proxy header support
+ data = self.buildheaders('CONNECT', '%s:%d' % (self.host,
+ self.port),
+ {}, HTTP_VER_1_0)
+ sock.send(data)
+ sock.setblocking(0)
+ r = self.response_class(sock, self.timeout, 'CONNECT')
+ timeout_exc = HTTPTimeoutException(
+ 'Timed out waiting for CONNECT response from proxy')
+ while not r.complete():
+ try:
+ if not r._select():
+ if not r.complete():
+ raise timeout_exc
+ except HTTPTimeoutException:
+ # This raise/except pattern looks goofy, but
+ # _select can raise the timeout as well as the
+ # loop body. I wish it wasn't this convoluted,
+ # but I don't have a better solution
+ # immediately handy.
+ raise timeout_exc
+ if r.status != 200:
+ raise HTTPProxyConnectFailedException(
+ 'Proxy connection failed: %d %s' % (r.status,
+ r.read()))
+ logger.info('CONNECT (for SSL) to %s:%s via proxy succeeded.',
+ self.host, self.port)
+ else:
+ sock = socketutil.create_connection((self.host, self.port))
+ if self.ssl:
+ # This is the default, but in the case of proxied SSL
+ # requests the proxy logic above will have cleared
+ # blocking mode, so reenable it just to be safe.
+ sock.setblocking(1)
+ logger.debug('wrapping socket for ssl with options %r',
+ self.ssl_opts)
+ sock = socketutil.wrap_socket(sock, **self.ssl_opts)
+ if self._ssl_validator:
+ self._ssl_validator(sock)
+ sock.setblocking(0)
+ self.sock = sock
+
+ def buildheaders(self, method, path, headers, http_ver):
+ if self.ssl and self.port == 443 or self.port == 80:
+ # default port for protocol, so leave it out
+ hdrhost = self.host
+ else:
+ # include nonstandard port in header
+ if ':' in self.host: # must be IPv6
+ hdrhost = '[%s]:%d' % (self.host, self.port)
+ else:
+ hdrhost = '%s:%d' % (self.host, self.port)
+ if self._proxy_host and not self.ssl:
+ # When talking to a regular http proxy we must send the
+ # full URI, but in all other cases we must not (although
+ # technically RFC 2616 says servers must accept our
+ # request if we screw up, experimentally few do that
+ # correctly.)
+ assert path[0] == '/', 'path must start with a /'
+ path = 'http://%s%s' % (hdrhost, path)
+ outgoing = ['%s %s %s%s' % (method, path, http_ver, EOL)]
+ headers['host'] = ('Host', hdrhost)
+ headers[HDR_ACCEPT_ENCODING] = (HDR_ACCEPT_ENCODING, 'identity')
+ for hdr, val in headers.itervalues():
+ outgoing.append('%s: %s%s' % (hdr, val, EOL))
+ outgoing.append(EOL)
+ return ''.join(outgoing)
+
+ def close(self):
+ """Close the connection to the server.
+
+ This is a no-op if the connection is already closed. The
+ connection may automatically close if requessted by the server
+ or required by the nature of a response.
+ """
+ if self.sock is None:
+ return
+ self.sock.close()
+ self.sock = None
+ logger.info('closed connection to %s on %s', self.host, self.port)
+
+ def busy(self):
+ """Returns True if this connection object is currently in use.
+
+ If a response is still pending, this will return True, even if
+ the request has finished sending. In the future,
+ HTTPConnection may transparently juggle multiple connections
+ to the server, in which case this will be useful to detect if
+ any of those connections is ready for use.
+ """
+ cr = self._current_response
+ if cr is not None:
+ if self._current_response_taken:
+ if cr.will_close:
+ self.sock = None
+ self._current_response = None
+ return False
+ elif cr.complete():
+ self._current_response = None
+ return False
+ return True
+ return False
+
+ def request(self, method, path, body=None, headers={},
+ expect_continue=False):
+ """Send a request to the server.
+
+ For increased flexibility, this does not return the response
+ object. Future versions of HTTPConnection that juggle multiple
+ sockets will be able to send (for example) 5 requests all at
+ once, and then let the requests arrive as data is
+ available. Use the `getresponse()` method to retrieve the
+ response.
+ """
+ if self.busy():
+ raise httplib.CannotSendRequest(
+ 'Can not send another request before '
+ 'current response is read!')
+ self._current_response_taken = False
+
+ logger.info('sending %s request for %s to %s on port %s',
+ method, path, self.host, self.port)
+ hdrs = dict((k.lower(), (k, v)) for k, v in headers.iteritems())
+ if hdrs.get('expect', ('', ''))[1].lower() == '100-continue':
+ expect_continue = True
+ elif expect_continue:
+ hdrs['expect'] = ('Expect', '100-Continue')
+
+ chunked = False
+ if body and HDR_CONTENT_LENGTH not in hdrs:
+ if getattr(body, '__len__', False):
+ hdrs[HDR_CONTENT_LENGTH] = (HDR_CONTENT_LENGTH, len(body))
+ elif getattr(body, 'read', False):
+ hdrs[HDR_XFER_ENCODING] = (HDR_XFER_ENCODING,
+ XFER_ENCODING_CHUNKED)
+ chunked = True
+ else:
+ raise BadRequestData('body has no __len__() nor read()')
+
+ self._connect()
+ outgoing_headers = self.buildheaders(
+ method, path, hdrs, self.http_version)
+ response = None
+ first = True
+
+ def reconnect(where):
+ logger.info('reconnecting during %s', where)
+ self.close()
+ self._connect()
+
+ while ((outgoing_headers or body)
+ and not (response and response.complete())):
+ select_timeout = self.timeout
+ out = outgoing_headers or body
+ blocking_on_continue = False
+ if expect_continue and not outgoing_headers and not (
+ response and (response.headers or response.continued)):
+ logger.info(
+ 'waiting up to %s seconds for'
+ ' continue response from server',
+ self.continue_timeout)
+ select_timeout = self.continue_timeout
+ blocking_on_continue = True
+ out = False
+ if out:
+ w = [self.sock]
+ else:
+ w = []
+ r, w, x = select.select([self.sock], w, [], select_timeout)
+ # if we were expecting a 100 continue and it's been long
+ # enough, just go ahead and assume it's ok. This is the
+ # recommended behavior from the RFC.
+ if r == w == x == []:
+ if blocking_on_continue:
+ expect_continue = False
+ logger.info('no response to continue expectation from '
+ 'server, optimistically sending request body')
+ else:
+ raise HTTPTimeoutException('timeout sending data')
+ was_first = first
+
+ # incoming data
+ if r:
+ try:
+ try:
+ data = r[0].recv(INCOMING_BUFFER_SIZE)
+ except socket.sslerror, e:
+ if e.args[0] != socket.SSL_ERROR_WANT_READ:
+ raise
+ logger.debug(
+ 'SSL_WANT_READ while sending data, retrying...')
+ continue
+ if not data:
+ logger.info('socket appears closed in read')
+ self.sock = None
+ self._current_response = None
+ if response is not None:
+ response._close()
+ # This if/elif ladder is a bit subtle,
+ # comments in each branch should help.
+ if response is not None and response.complete():
+ # Server responded completely and then
+ # closed the socket. We should just shut
+ # things down and let the caller get their
+ # response.
+ logger.info('Got an early response, '
+ 'aborting remaining request.')
+ break
+ elif was_first and response is None:
+ # Most likely a keepalive that got killed
+ # on the server's end. Commonly happens
+ # after getting a really large response
+ # from the server.
+ logger.info(
+ 'Connection appeared closed in read on first'
+ ' request loop iteration, will retry.')
+ reconnect('read')
+ continue
+ else:
+ # We didn't just send the first data hunk,
+ # and either have a partial response or no
+ # response at all. There's really nothing
+ # meaningful we can do here.
+ raise HTTPStateError(
+ 'Connection appears closed after '
+ 'some request data was written, but the '
+ 'response was missing or incomplete!')
+ logger.debug('read %d bytes in request()', len(data))
+ if response is None:
+ response = self.response_class(r[0], self.timeout, method)
+ response._load_response(data)
+ # Jump to the next select() call so we load more
+ # data if the server is still sending us content.
+ continue
+ except socket.error, e:
+ if e[0] != errno.EPIPE and not was_first:
+ raise
+
+ # outgoing data
+ if w and out:
+ try:
+ if getattr(out, 'read', False):
+ data = out.read(OUTGOING_BUFFER_SIZE)
+ if not data:
+ continue
+ if len(data) < OUTGOING_BUFFER_SIZE:
+ if chunked:
+ body = '0' + EOL + EOL
+ else:
+ body = None
+ if chunked:
+ out = hex(len(data))[2:] + EOL + data + EOL
+ else:
+ out = data
+ amt = w[0].send(out)
+ except socket.error, e:
+ if e[0] == socket.SSL_ERROR_WANT_WRITE and self.ssl:
+ # This means that SSL hasn't flushed its buffer into
+ # the socket yet.
+ # TODO: find a way to block on ssl flushing its buffer
+ # similar to selecting on a raw socket.
+ continue
+ elif (e[0] not in (errno.ECONNRESET, errno.EPIPE)
+ and not first):
+ raise
+ reconnect('write')
+ amt = self.sock.send(out)
+ logger.debug('sent %d', amt)
+ first = False
+ # stash data we think we sent in case the socket breaks
+ # when we read from it
+ if was_first:
+ sent_data = out[:amt]
+ if out is body:
+ body = out[amt:]
+ else:
+ outgoing_headers = out[amt:]
+
+ # close if the server response said to or responded before eating
+ # the whole request
+ if response is None:
+ response = self.response_class(self.sock, self.timeout, method)
+ complete = response.complete()
+ data_left = bool(outgoing_headers or body)
+ if data_left:
+ logger.info('stopped sending request early, '
+ 'will close the socket to be safe.')
+ response.will_close = True
+ if response.will_close:
+ # The socket will be closed by the response, so we disown
+ # the socket
+ self.sock = None
+ self._current_response = response
+
+ def getresponse(self):
+ if self._current_response is None:
+ raise httplib.ResponseNotReady()
+ r = self._current_response
+ while r.headers is None:
+ if not r._select() and not r.complete():
+ raise _readers.HTTPRemoteClosedError()
+ if r.will_close:
+ self.sock = None
+ self._current_response = None
+ elif r.complete():
+ self._current_response = None
+ else:
+ self._current_response_taken = True
+ return r
+
+
+class HTTPTimeoutException(httplib.HTTPException):
+ """A timeout occurred while waiting on the server."""
+
+
+class BadRequestData(httplib.HTTPException):
+ """Request body object has neither __len__ nor read."""
+
+
+class HTTPProxyConnectFailedException(httplib.HTTPException):
+ """Connecting to the HTTP proxy failed."""
+
+
+class HTTPStateError(httplib.HTTPException):
+ """Invalid internal state encountered."""
+
+# Forward this exception type from _readers since it needs to be part
+# of the public API.
+HTTPRemoteClosedError = _readers.HTTPRemoteClosedError
+# no-check-code
diff --git a/mercurial/httpclient/_readers.py b/mercurial/httpclient/_readers.py
new file mode 100644
index 0000000..0beb551
--- /dev/null
+++ b/mercurial/httpclient/_readers.py
@@ -0,0 +1,195 @@
+# Copyright 2011, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Reader objects to abstract out different body response types.
+
+This module is package-private. It is not expected that these will
+have any clients outside of httpplus.
+"""
+
+import httplib
+import itertools
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class ReadNotReady(Exception):
+ """Raised when read() is attempted but not enough data is loaded."""
+
+
+class HTTPRemoteClosedError(httplib.HTTPException):
+ """The server closed the remote socket in the middle of a response."""
+
+
+class AbstractReader(object):
+ """Abstract base class for response readers.
+
+ Subclasses must implement _load, and should implement _close if
+ it's not an error for the server to close their socket without
+ some termination condition being detected during _load.
+ """
+ def __init__(self):
+ self._finished = False
+ self._done_chunks = []
+
+ @property
+ def available_data(self):
+ return sum(map(len, self._done_chunks))
+
+ def done(self):
+ return self._finished
+
+ def read(self, amt):
+ if self.available_data < amt and not self._finished:
+ raise ReadNotReady()
+ need = [amt]
+ def pred(s):
+ needed = need[0] > 0
+ need[0] -= len(s)
+ return needed
+ blocks = list(itertools.takewhile(pred, self._done_chunks))
+ self._done_chunks = self._done_chunks[len(blocks):]
+ over_read = sum(map(len, blocks)) - amt
+ if over_read > 0 and blocks:
+ logger.debug('need to reinsert %d data into done chunks', over_read)
+ last = blocks[-1]
+ blocks[-1], reinsert = last[:-over_read], last[-over_read:]
+ self._done_chunks.insert(0, reinsert)
+ result = ''.join(blocks)
+ assert len(result) == amt or (self._finished and len(result) < amt)
+ return result
+
+ def _load(self, data): # pragma: no cover
+ """Subclasses must implement this.
+
+ As data is available to be read out of this object, it should
+ be placed into the _done_chunks list. Subclasses should not
+ rely on data remaining in _done_chunks forever, as it may be
+ reaped if the client is parsing data as it comes in.
+ """
+ raise NotImplementedError
+
+ def _close(self):
+ """Default implementation of close.
+
+ The default implementation assumes that the reader will mark
+ the response as finished on the _finished attribute once the
+ entire response body has been read. In the event that this is
+ not true, the subclass should override the implementation of
+ close (for example, close-is-end responses have to set
+ self._finished in the close handler.)
+ """
+ if not self._finished:
+ raise HTTPRemoteClosedError(
+ 'server appears to have closed the socket mid-response')
+
+
+class AbstractSimpleReader(AbstractReader):
+ """Abstract base class for simple readers that require no response decoding.
+
+ Examples of such responses are Connection: Close (close-is-end)
+ and responses that specify a content length.
+ """
+ def _load(self, data):
+ if data:
+ assert not self._finished, (
+ 'tried to add data (%r) to a closed reader!' % data)
+ logger.debug('%s read an addtional %d data', self.name, len(data))
+ self._done_chunks.append(data)
+
+
+class CloseIsEndReader(AbstractSimpleReader):
+ """Reader for responses that specify Connection: Close for length."""
+ name = 'close-is-end'
+
+ def _close(self):
+ logger.info('Marking close-is-end reader as closed.')
+ self._finished = True
+
+
+class ContentLengthReader(AbstractSimpleReader):
+ """Reader for responses that specify an exact content length."""
+ name = 'content-length'
+
+ def __init__(self, amount):
+ AbstractReader.__init__(self)
+ self._amount = amount
+ if amount == 0:
+ self._finished = True
+ self._amount_seen = 0
+
+ def _load(self, data):
+ AbstractSimpleReader._load(self, data)
+ self._amount_seen += len(data)
+ if self._amount_seen >= self._amount:
+ self._finished = True
+ logger.debug('content-length read complete')
+
+
+class ChunkedReader(AbstractReader):
+ """Reader for chunked transfer encoding responses."""
+ def __init__(self, eol):
+ AbstractReader.__init__(self)
+ self._eol = eol
+ self._leftover_skip_amt = 0
+ self._leftover_data = ''
+
+ def _load(self, data):
+ assert not self._finished, 'tried to add data to a closed reader!'
+ logger.debug('chunked read an addtional %d data', len(data))
+ position = 0
+ if self._leftover_data:
+ logger.debug('chunked reader trying to finish block from leftover data')
+ # TODO: avoid this string concatenation if possible
+ data = self._leftover_data + data
+ position = self._leftover_skip_amt
+ self._leftover_data = ''
+ self._leftover_skip_amt = 0
+ datalen = len(data)
+ while position < datalen:
+ split = data.find(self._eol, position)
+ if split == -1:
+ self._leftover_data = data
+ self._leftover_skip_amt = position
+ return
+ amt = int(data[position:split], base=16)
+ block_start = split + len(self._eol)
+ # If the whole data chunk plus the eol trailer hasn't
+ # loaded, we'll wait for the next load.
+ if block_start + amt + len(self._eol) > len(data):
+ self._leftover_data = data
+ self._leftover_skip_amt = position
+ return
+ if amt == 0:
+ self._finished = True
+ logger.debug('closing chunked redaer due to chunk of length 0')
+ return
+ self._done_chunks.append(data[block_start:block_start + amt])
+ position = block_start + amt + len(self._eol)
+# no-check-code
diff --git a/mercurial/httpclient/socketutil.py b/mercurial/httpclient/socketutil.py
new file mode 100644
index 0000000..6f06a3c
--- /dev/null
+++ b/mercurial/httpclient/socketutil.py
@@ -0,0 +1,127 @@
+# Copyright 2010, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""Abstraction to simplify socket use for Python < 2.6
+
+This will attempt to use the ssl module and the new
+socket.create_connection method, but fall back to the old
+methods if those are unavailable.
+"""
+import logging
+import socket
+
+logger = logging.getLogger(__name__)
+
+try:
+ import ssl
+ ssl.wrap_socket # make demandimporters load the module
+ have_ssl = True
+except ImportError:
+ import httplib
+ import urllib2
+ have_ssl = getattr(urllib2, 'HTTPSHandler', False)
+ ssl = False
+
+
+try:
+ create_connection = socket.create_connection
+except AttributeError:
+ def create_connection(address):
+ host, port = address
+ msg = "getaddrinfo returns an empty list"
+ sock = None
+ for res in socket.getaddrinfo(host, port, 0,
+ socket.SOCK_STREAM):
+ af, socktype, proto, _canonname, sa = res
+ try:
+ sock = socket.socket(af, socktype, proto)
+ logger.info("connect: (%s, %s)", host, port)
+ sock.connect(sa)
+ except socket.error, msg:
+ logger.info('connect fail: %s %s', host, port)
+ if sock:
+ sock.close()
+ sock = None
+ continue
+ break
+ if not sock:
+ raise socket.error, msg
+ return sock
+
+if ssl:
+ wrap_socket = ssl.wrap_socket
+ CERT_NONE = ssl.CERT_NONE
+ CERT_OPTIONAL = ssl.CERT_OPTIONAL
+ CERT_REQUIRED = ssl.CERT_REQUIRED
+else:
+ class FakeSocket(httplib.FakeSocket):
+ """Socket wrapper that supports SSL.
+ """
+ # backport the behavior from Python 2.6, which is to busy wait
+ # on the socket instead of anything nice. Sigh.
+ # See http://bugs.python.org/issue3890 for more info.
+ def recv(self, buflen=1024, flags=0):
+ """ssl-aware wrapper around socket.recv
+ """
+ if flags != 0:
+ raise ValueError(
+ "non-zero flags not allowed in calls to recv() on %s" %
+ self.__class__)
+ while True:
+ try:
+ return self._ssl.read(buflen)
+ except socket.sslerror, x:
+ if x.args[0] == socket.SSL_ERROR_WANT_READ:
+ continue
+ else:
+ raise x
+
+ _PROTOCOL_SSLv23 = 2
+
+ CERT_NONE = 0
+ CERT_OPTIONAL = 1
+ CERT_REQUIRED = 2
+
+ def wrap_socket(sock, keyfile=None, certfile=None,
+ server_side=False, cert_reqs=CERT_NONE,
+ ssl_version=_PROTOCOL_SSLv23, ca_certs=None,
+ do_handshake_on_connect=True,
+ suppress_ragged_eofs=True):
+ if cert_reqs != CERT_NONE and ca_certs:
+ raise CertificateValidationUnsupported(
+ 'SSL certificate validation requires the ssl module'
+ '(included in Python 2.6 and later.)')
+ sslob = socket.ssl(sock)
+ # borrow httplib's workaround for no ssl.wrap_socket
+ sock = FakeSocket(sock, sslob)
+ return sock
+
+
+class CertificateValidationUnsupported(Exception):
+ """Exception raised when cert validation is requested but unavailable."""
+# no-check-code
diff --git a/mercurial/httpconnection.py b/mercurial/httpconnection.py
new file mode 100644
index 0000000..ce316d9
--- /dev/null
+++ b/mercurial/httpconnection.py
@@ -0,0 +1,284 @@
+# httpconnection.py - urllib2 handler for new http support
+#
+# Copyright 2005, 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
+# Copyright 2006, 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+# Copyright 2011 Google, Inc.
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+import logging
+import socket
+import urllib
+import urllib2
+import os
+
+from mercurial import httpclient
+from mercurial import sslutil
+from mercurial import util
+from mercurial.i18n import _
+
+# moved here from url.py to avoid a cycle
+class httpsendfile(object):
+ """This is a wrapper around the objects returned by python's "open".
+
+ Its purpose is to send file-like objects via HTTP.
+ It do however not define a __len__ attribute because the length
+ might be more than Py_ssize_t can handle.
+ """
+
+ def __init__(self, ui, *args, **kwargs):
+ # We can't just "self._data = open(*args, **kwargs)" here because there
+ # is an "open" function defined in this module that shadows the global
+ # one
+ self.ui = ui
+ self._data = open(*args, **kwargs)
+ self.seek = self._data.seek
+ self.close = self._data.close
+ self.write = self._data.write
+ self.length = os.fstat(self._data.fileno()).st_size
+ self._pos = 0
+ self._total = self.length // 1024 * 2
+
+ def read(self, *args, **kwargs):
+ try:
+ ret = self._data.read(*args, **kwargs)
+ except EOFError:
+ self.ui.progress(_('sending'), None)
+ self._pos += len(ret)
+ # We pass double the max for total because we currently have
+ # to send the bundle twice in the case of a server that
+ # requires authentication. Since we can't know until we try
+ # once whether authentication will be required, just lie to
+ # the user and maybe the push succeeds suddenly at 50%.
+ self.ui.progress(_('sending'), self._pos // 1024,
+ unit=_('kb'), total=self._total)
+ return ret
+
+# moved here from url.py to avoid a cycle
+def readauthforuri(ui, uri, user):
+ # Read configuration
+ config = dict()
+ for key, val in ui.configitems('auth'):
+ if '.' not in key:
+ ui.warn(_("ignoring invalid [auth] key '%s'\n") % key)
+ continue
+ group, setting = key.rsplit('.', 1)
+ gdict = config.setdefault(group, dict())
+ if setting in ('username', 'cert', 'key'):
+ val = util.expandpath(val)
+ gdict[setting] = val
+
+ # Find the best match
+ if '://' in uri:
+ scheme, hostpath = uri.split('://', 1)
+ else:
+ # py2.4.1 doesn't provide the full URI
+ scheme, hostpath = 'http', uri
+ bestuser = None
+ bestlen = 0
+ bestauth = None
+ for group, auth in config.iteritems():
+ if user and user != auth.get('username', user):
+ # If a username was set in the URI, the entry username
+ # must either match it or be unset
+ continue
+ prefix = auth.get('prefix')
+ if not prefix:
+ continue
+ p = prefix.split('://', 1)
+ if len(p) > 1:
+ schemes, prefix = [p[0]], p[1]
+ else:
+ schemes = (auth.get('schemes') or 'https').split()
+ if (prefix == '*' or hostpath.startswith(prefix)) and \
+ (len(prefix) > bestlen or (len(prefix) == bestlen and \
+ not bestuser and 'username' in auth)) \
+ and scheme in schemes:
+ bestlen = len(prefix)
+ bestauth = group, auth
+ bestuser = auth.get('username')
+ if user and not bestuser:
+ auth['username'] = user
+ return bestauth
+
+# Mercurial (at least until we can remove the old codepath) requires
+# that the http response object be sufficiently file-like, so we
+# provide a close() method here.
+class HTTPResponse(httpclient.HTTPResponse):
+ def close(self):
+ pass
+
+class HTTPConnection(httpclient.HTTPConnection):
+ response_class = HTTPResponse
+ def request(self, method, uri, body=None, headers={}):
+ if isinstance(body, httpsendfile):
+ body.seek(0)
+ httpclient.HTTPConnection.request(self, method, uri, body=body,
+ headers=headers)
+
+
+_configuredlogging = False
+LOGFMT = '%(levelname)s:%(name)s:%(lineno)d:%(message)s'
+# Subclass BOTH of these because otherwise urllib2 "helpfully"
+# reinserts them since it notices we don't include any subclasses of
+# them.
+class http2handler(urllib2.HTTPHandler, urllib2.HTTPSHandler):
+ def __init__(self, ui, pwmgr):
+ global _configuredlogging
+ urllib2.AbstractHTTPHandler.__init__(self)
+ self.ui = ui
+ self.pwmgr = pwmgr
+ self._connections = {}
+ loglevel = ui.config('ui', 'http2debuglevel', default=None)
+ if loglevel and not _configuredlogging:
+ _configuredlogging = True
+ logger = logging.getLogger('mercurial.httpclient')
+ logger.setLevel(getattr(logging, loglevel.upper()))
+ handler = logging.StreamHandler()
+ handler.setFormatter(logging.Formatter(LOGFMT))
+ logger.addHandler(handler)
+
+ def close_all(self):
+ """Close and remove all connection objects being kept for reuse."""
+ for openconns in self._connections.values():
+ for conn in openconns:
+ conn.close()
+ self._connections = {}
+
+ # shamelessly borrowed from urllib2.AbstractHTTPHandler
+ def do_open(self, http_class, req, use_ssl):
+ """Return an addinfourl object for the request, using http_class.
+
+ http_class must implement the HTTPConnection API from httplib.
+ The addinfourl return value is a file-like object. It also
+ has methods and attributes including:
+ - info(): return a mimetools.Message object for the headers
+ - geturl(): return the original request URL
+ - code: HTTP status code
+ """
+ # If using a proxy, the host returned by get_host() is
+ # actually the proxy. On Python 2.6.1, the real destination
+ # hostname is encoded in the URI in the urllib2 request
+ # object. On Python 2.6.5, it's stored in the _tunnel_host
+ # attribute which has no accessor.
+ tunhost = getattr(req, '_tunnel_host', None)
+ host = req.get_host()
+ if tunhost:
+ proxyhost = host
+ host = tunhost
+ elif req.has_proxy():
+ proxyhost = req.get_host()
+ host = req.get_selector().split('://', 1)[1].split('/', 1)[0]
+ else:
+ proxyhost = None
+
+ if proxyhost:
+ if ':' in proxyhost:
+ # Note: this means we'll explode if we try and use an
+ # IPv6 http proxy. This isn't a regression, so we
+ # won't worry about it for now.
+ proxyhost, proxyport = proxyhost.rsplit(':', 1)
+ else:
+ proxyport = 3128 # squid default
+ proxy = (proxyhost, proxyport)
+ else:
+ proxy = None
+
+ if not host:
+ raise urllib2.URLError('no host given')
+
+ connkey = use_ssl, host, proxy
+ allconns = self._connections.get(connkey, [])
+ conns = [c for c in allconns if not c.busy()]
+ if conns:
+ h = conns[0]
+ else:
+ if allconns:
+ self.ui.debug('all connections for %s busy, making a new '
+ 'one\n' % host)
+ timeout = None
+ if req.timeout is not socket._GLOBAL_DEFAULT_TIMEOUT:
+ timeout = req.timeout
+ h = http_class(host, timeout=timeout, proxy_hostport=proxy)
+ self._connections.setdefault(connkey, []).append(h)
+
+ headers = dict(req.headers)
+ headers.update(req.unredirected_hdrs)
+ headers = dict(
+ (name.title(), val) for name, val in headers.items())
+ try:
+ path = req.get_selector()
+ if '://' in path:
+ path = path.split('://', 1)[1].split('/', 1)[1]
+ if path[0] != '/':
+ path = '/' + path
+ h.request(req.get_method(), path, req.data, headers)
+ r = h.getresponse()
+ except socket.error, err: # XXX what error?
+ raise urllib2.URLError(err)
+
+ # Pick apart the HTTPResponse object to get the addinfourl
+ # object initialized properly.
+ r.recv = r.read
+
+ resp = urllib.addinfourl(r, r.headers, req.get_full_url())
+ resp.code = r.status
+ resp.msg = r.reason
+ return resp
+
+ # httplib always uses the given host/port as the socket connect
+ # target, and then allows full URIs in the request path, which it
+ # then observes and treats as a signal to do proxying instead.
+ def http_open(self, req):
+ if req.get_full_url().startswith('https'):
+ return self.https_open(req)
+ return self.do_open(HTTPConnection, req, False)
+
+ def https_open(self, req):
+ # req.get_full_url() does not contain credentials and we may
+ # need them to match the certificates.
+ url = req.get_full_url()
+ user, password = self.pwmgr.find_stored_password(url)
+ res = readauthforuri(self.ui, url, user)
+ if res:
+ group, auth = res
+ self.auth = auth
+ self.ui.debug("using auth.%s.* for authentication\n" % group)
+ else:
+ self.auth = None
+ return self.do_open(self._makesslconnection, req, True)
+
+ def _makesslconnection(self, host, port=443, *args, **kwargs):
+ keyfile = None
+ certfile = None
+
+ if args: # key_file
+ keyfile = args.pop(0)
+ if args: # cert_file
+ certfile = args.pop(0)
+
+ # if the user has specified different key/cert files in
+ # hgrc, we prefer these
+ if self.auth and 'key' in self.auth and 'cert' in self.auth:
+ keyfile = self.auth['key']
+ certfile = self.auth['cert']
+
+ # let host port take precedence
+ if ':' in host and '[' not in host or ']:' in host:
+ host, port = host.rsplit(':', 1)
+ port = int(port)
+ if '[' in host:
+ host = host[1:-1]
+
+ if keyfile:
+ kwargs['keyfile'] = keyfile
+ if certfile:
+ kwargs['certfile'] = certfile
+
+ kwargs.update(sslutil.sslkwargs(self.ui, host))
+
+ con = HTTPConnection(host, port, use_ssl=True,
+ ssl_validator=sslutil.validator(self.ui, host),
+ **kwargs)
+ return con
diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py
new file mode 100644
index 0000000..9b84d32
--- /dev/null
+++ b/mercurial/httppeer.py
@@ -0,0 +1,248 @@
+# httppeer.py - HTTP repository proxy classes for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid
+from i18n import _
+import changegroup, statichttprepo, error, httpconnection, url, util, wireproto
+import os, urllib, urllib2, zlib, httplib
+import errno, socket
+
+def zgenerator(f):
+ zd = zlib.decompressobj()
+ try:
+ for chunk in util.filechunkiter(f):
+ while chunk:
+ yield zd.decompress(chunk, 2**18)
+ chunk = zd.unconsumed_tail
+ except httplib.HTTPException:
+ raise IOError(None, _('connection ended unexpectedly'))
+ yield zd.flush()
+
+class httppeer(wireproto.wirepeer):
+ def __init__(self, ui, path):
+ self.path = path
+ self.caps = None
+ self.handler = None
+ self.urlopener = None
+ u = util.url(path)
+ if u.query or u.fragment:
+ raise util.Abort(_('unsupported URL component: "%s"') %
+ (u.query or u.fragment))
+
+ # urllib cannot handle URLs with embedded user or passwd
+ self._url, authinfo = u.authinfo()
+
+ self.ui = ui
+ self.ui.debug('using %s\n' % self._url)
+
+ self.urlopener = url.opener(ui, authinfo)
+
+ def __del__(self):
+ if self.urlopener:
+ for h in self.urlopener.handlers:
+ h.close()
+ getattr(h, "close_all", lambda : None)()
+
+ def url(self):
+ return self.path
+
+ # look up capabilities only when needed
+
+ def _fetchcaps(self):
+ self.caps = set(self._call('capabilities').split())
+
+ def _capabilities(self):
+ if self.caps is None:
+ try:
+ self._fetchcaps()
+ except error.RepoError:
+ self.caps = set()
+ self.ui.debug('capabilities: %s\n' %
+ (' '.join(self.caps or ['none'])))
+ return self.caps
+
+ def lock(self):
+ raise util.Abort(_('operation not supported over http'))
+
+ def _callstream(self, cmd, **args):
+ if cmd == 'pushkey':
+ args['data'] = ''
+ data = args.pop('data', None)
+ size = 0
+ if util.safehasattr(data, 'length'):
+ size = data.length
+ elif data is not None:
+ size = len(data)
+ headers = args.pop('headers', {})
+ if data is not None and 'Content-Type' not in headers:
+ headers['Content-Type'] = 'application/mercurial-0.1'
+
+
+ if size and self.ui.configbool('ui', 'usehttp2', False):
+ headers['Expect'] = '100-Continue'
+ headers['X-HgHttp2'] = '1'
+
+ self.ui.debug("sending %s command\n" % cmd)
+ q = [('cmd', cmd)]
+ headersize = 0
+ if len(args) > 0:
+ httpheader = self.capable('httpheader')
+ if httpheader:
+ headersize = int(httpheader.split(',')[0])
+ if headersize > 0:
+ # The headers can typically carry more data than the URL.
+ encargs = urllib.urlencode(sorted(args.items()))
+ headerfmt = 'X-HgArg-%s'
+ contentlen = headersize - len(headerfmt % '000' + ': \r\n')
+ headernum = 0
+ for i in xrange(0, len(encargs), contentlen):
+ headernum += 1
+ header = headerfmt % str(headernum)
+ headers[header] = encargs[i:i + contentlen]
+ varyheaders = [headerfmt % str(h) for h in range(1, headernum + 1)]
+ headers['Vary'] = ','.join(varyheaders)
+ else:
+ q += sorted(args.items())
+ qs = '?%s' % urllib.urlencode(q)
+ cu = "%s%s" % (self._url, qs)
+ req = urllib2.Request(cu, data, headers)
+ if data is not None:
+ self.ui.debug("sending %s bytes\n" % size)
+ req.add_unredirected_header('Content-Length', '%d' % size)
+ try:
+ resp = self.urlopener.open(req)
+ except urllib2.HTTPError, inst:
+ if inst.code == 401:
+ raise util.Abort(_('authorization failed'))
+ raise
+ except httplib.HTTPException, inst:
+ self.ui.debug('http error while sending %s command\n' % cmd)
+ self.ui.traceback()
+ raise IOError(None, inst)
+ except IndexError:
+ # this only happens with Python 2.3, later versions raise URLError
+ raise util.Abort(_('http error, possibly caused by proxy setting'))
+ # record the url we got redirected to
+ resp_url = resp.geturl()
+ if resp_url.endswith(qs):
+ resp_url = resp_url[:-len(qs)]
+ if self._url.rstrip('/') != resp_url.rstrip('/'):
+ if not self.ui.quiet:
+ self.ui.warn(_('real URL is %s\n') % resp_url)
+ self._url = resp_url
+ try:
+ proto = resp.getheader('content-type')
+ except AttributeError:
+ proto = resp.headers.get('content-type', '')
+
+ safeurl = util.hidepassword(self._url)
+ if proto.startswith('application/hg-error'):
+ raise error.OutOfBandError(resp.read())
+ # accept old "text/plain" and "application/hg-changegroup" for now
+ if not (proto.startswith('application/mercurial-') or
+ proto.startswith('text/plain') or
+ proto.startswith('application/hg-changegroup')):
+ self.ui.debug("requested URL: '%s'\n" % util.hidepassword(cu))
+ raise error.RepoError(
+ _("'%s' does not appear to be an hg repository:\n"
+ "---%%<--- (%s)\n%s\n---%%<---\n")
+ % (safeurl, proto or 'no content-type', resp.read()))
+
+ if proto.startswith('application/mercurial-'):
+ try:
+ version = proto.split('-', 1)[1]
+ version_info = tuple([int(n) for n in version.split('.')])
+ except ValueError:
+ raise error.RepoError(_("'%s' sent a broken Content-Type "
+ "header (%s)") % (safeurl, proto))
+ if version_info > (0, 1):
+ raise error.RepoError(_("'%s' uses newer protocol %s") %
+ (safeurl, version))
+
+ return resp
+
+ def _call(self, cmd, **args):
+ fp = self._callstream(cmd, **args)
+ try:
+ return fp.read()
+ finally:
+ # if using keepalive, allow connection to be reused
+ fp.close()
+
+ def _callpush(self, cmd, cg, **args):
+ # have to stream bundle to a temp file because we do not have
+ # http 1.1 chunked transfer.
+
+ types = self.capable('unbundle')
+ try:
+ types = types.split(',')
+ except AttributeError:
+ # servers older than d1b16a746db6 will send 'unbundle' as a
+ # boolean capability. They only support headerless/uncompressed
+ # bundles.
+ types = [""]
+ for x in types:
+ if x in changegroup.bundletypes:
+ type = x
+ break
+
+ tempname = changegroup.writebundle(cg, None, type)
+ fp = httpconnection.httpsendfile(self.ui, tempname, "rb")
+ headers = {'Content-Type': 'application/mercurial-0.1'}
+
+ try:
+ try:
+ r = self._call(cmd, data=fp, headers=headers, **args)
+ vals = r.split('\n', 1)
+ if len(vals) < 2:
+ raise error.ResponseError(_("unexpected response:"), r)
+ return vals
+ except socket.error, err:
+ if err.args[0] in (errno.ECONNRESET, errno.EPIPE):
+ raise util.Abort(_('push failed: %s') % err.args[1])
+ raise util.Abort(err.args[1])
+ finally:
+ fp.close()
+ os.unlink(tempname)
+
+ def _abort(self, exception):
+ raise exception
+
+ def _decompress(self, stream):
+ return util.chunkbuffer(zgenerator(stream))
+
+class httpspeer(httppeer):
+ def __init__(self, ui, path):
+ if not url.has_https:
+ raise util.Abort(_('Python support for SSL and HTTPS '
+ 'is not installed'))
+ httppeer.__init__(self, ui, path)
+
+def instance(ui, path, create):
+ if create:
+ raise util.Abort(_('cannot create new http repository'))
+ try:
+ if path.startswith('https:'):
+ inst = httpspeer(ui, path)
+ else:
+ inst = httppeer(ui, path)
+ try:
+ # Try to do useful work when checking compatibility.
+ # Usually saves a roundtrip since we want the caps anyway.
+ inst._fetchcaps()
+ except error.RepoError:
+ # No luck, try older compatibility check.
+ inst.between([(nullid, nullid)])
+ return inst
+ except error.RepoError, httpexception:
+ try:
+ r = statichttprepo.instance(ui, "static-" + path, create)
+ ui.note('(falling back to static-http)\n')
+ return r
+ except error.RepoError:
+ raise httpexception # use the original http RepoError instead
diff --git a/mercurial/i18n.py b/mercurial/i18n.py
new file mode 100644
index 0000000..b06a02e
--- /dev/null
+++ b/mercurial/i18n.py
@@ -0,0 +1,63 @@
+# i18n.py - internationalization support for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import encoding
+import gettext, sys, os
+
+# modelled after templater.templatepath:
+if getattr(sys, 'frozen', None) is not None:
+ module = sys.executable
+else:
+ module = __file__
+
+base = os.path.dirname(module)
+for dir in ('.', '..'):
+ localedir = os.path.join(base, dir, 'locale')
+ if os.path.isdir(localedir):
+ break
+
+t = gettext.translation('hg', localedir, fallback=True)
+
+def gettext(message):
+ """Translate message.
+
+ The message is looked up in the catalog to get a Unicode string,
+ which is encoded in the local encoding before being returned.
+
+ Important: message is restricted to characters in the encoding
+ given by sys.getdefaultencoding() which is most likely 'ascii'.
+ """
+ # If message is None, t.ugettext will return u'None' as the
+ # translation whereas our callers expect us to return None.
+ if message is None:
+ return message
+
+ paragraphs = message.split('\n\n')
+ # Be careful not to translate the empty string -- it holds the
+ # meta data of the .po file.
+ u = u'\n\n'.join([p and t.ugettext(p) or '' for p in paragraphs])
+ try:
+ # encoding.tolocal cannot be used since it will first try to
+ # decode the Unicode string. Calling u.decode(enc) really
+ # means u.encode(sys.getdefaultencoding()).decode(enc). Since
+ # the Python encoding defaults to 'ascii', this fails if the
+ # translated string use non-ASCII characters.
+ return u.encode(encoding.encoding, "replace")
+ except LookupError:
+ # An unknown encoding results in a LookupError.
+ return message
+
+def _plain():
+ if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ:
+ return False
+ exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',')
+ return 'i18n' not in exceptions
+
+if _plain():
+ _ = lambda message: message
+else:
+ _ = gettext
diff --git a/mercurial/ignore.py b/mercurial/ignore.py
new file mode 100644
index 0000000..9c2e9cf
--- /dev/null
+++ b/mercurial/ignore.py
@@ -0,0 +1,105 @@
+# ignore.py - ignored file handling for mercurial
+#
+# Copyright 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import util, match
+import re
+
+_commentre = None
+
+def ignorepats(lines):
+ '''parse lines (iterable) of .hgignore text, returning a tuple of
+ (patterns, parse errors). These patterns should be given to compile()
+ to be validated and converted into a match function.'''
+ syntaxes = {'re': 'relre:', 'regexp': 'relre:', 'glob': 'relglob:'}
+ syntax = 'relre:'
+ patterns = []
+ warnings = []
+
+ for line in lines:
+ if "#" in line:
+ global _commentre
+ if not _commentre:
+ _commentre = re.compile(r'((^|[^\\])(\\\\)*)#.*')
+ # remove comments prefixed by an even number of escapes
+ line = _commentre.sub(r'\1', line)
+ # fixup properly escaped comments that survived the above
+ line = line.replace("\\#", "#")
+ line = line.rstrip()
+ if not line:
+ continue
+
+ if line.startswith('syntax:'):
+ s = line[7:].strip()
+ try:
+ syntax = syntaxes[s]
+ except KeyError:
+ warnings.append(_("ignoring invalid syntax '%s'") % s)
+ continue
+ pat = syntax + line
+ for s, rels in syntaxes.iteritems():
+ if line.startswith(rels):
+ pat = line
+ break
+ elif line.startswith(s+':'):
+ pat = rels + line[len(s)+1:]
+ break
+ patterns.append(pat)
+
+ return patterns, warnings
+
+def ignore(root, files, warn):
+ '''return matcher covering patterns in 'files'.
+
+ the files parsed for patterns include:
+ .hgignore in the repository root
+ any additional files specified in the [ui] section of ~/.hgrc
+
+ trailing white space is dropped.
+ the escape character is backslash.
+ comments start with #.
+ empty lines are skipped.
+
+ lines can be of the following formats:
+
+ syntax: regexp # defaults following lines to non-rooted regexps
+ syntax: glob # defaults following lines to non-rooted globs
+ re:pattern # non-rooted regular expression
+ glob:pattern # non-rooted glob
+ pattern # pattern of the current default type'''
+
+ pats = {}
+ for f in files:
+ try:
+ pats[f] = []
+ fp = open(f)
+ pats[f], warnings = ignorepats(fp)
+ fp.close()
+ for warning in warnings:
+ warn("%s: %s\n" % (f, warning))
+ except IOError, inst:
+ if f != files[0]:
+ warn(_("skipping unreadable ignore file '%s': %s\n") %
+ (f, inst.strerror))
+
+ allpats = []
+ for patlist in pats.values():
+ allpats.extend(patlist)
+ if not allpats:
+ return util.never
+
+ try:
+ ignorefunc = match.match(root, '', [], allpats)
+ except util.Abort:
+ # Re-raise an exception where the src is the right file
+ for f, patlist in pats.iteritems():
+ try:
+ match.match(root, '', [], patlist)
+ except util.Abort, inst:
+ raise util.Abort('%s: %s' % (f, inst[0]))
+
+ return ignorefunc
diff --git a/mercurial/keepalive.py b/mercurial/keepalive.py
new file mode 100644
index 0000000..13243ba
--- /dev/null
+++ b/mercurial/keepalive.py
@@ -0,0 +1,764 @@
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, see
+# <http://www.gnu.org/licenses/>.
+
+# This file is part of urlgrabber, a high-level cross-protocol url-grabber
+# Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
+
+# Modified by Benoit Boissinot:
+# - fix for digest auth (inspired from urllib2.py @ Python v2.4)
+# Modified by Dirkjan Ochtman:
+# - import md5 function from a local util module
+# Modified by Martin Geisler:
+# - moved md5 function from local util module to this module
+# Modified by Augie Fackler:
+# - add safesend method and use it to prevent broken pipe errors
+# on large POST requests
+
+"""An HTTP handler for urllib2 that supports HTTP 1.1 and keepalive.
+
+>>> import urllib2
+>>> from keepalive import HTTPHandler
+>>> keepalive_handler = HTTPHandler()
+>>> opener = urllib2.build_opener(keepalive_handler)
+>>> urllib2.install_opener(opener)
+>>>
+>>> fo = urllib2.urlopen('http://www.python.org')
+
+If a connection to a given host is requested, and all of the existing
+connections are still in use, another connection will be opened. If
+the handler tries to use an existing connection but it fails in some
+way, it will be closed and removed from the pool.
+
+To remove the handler, simply re-run build_opener with no arguments, and
+install that opener.
+
+You can explicitly close connections by using the close_connection()
+method of the returned file-like object (described below) or you can
+use the handler methods:
+
+ close_connection(host)
+ close_all()
+ open_connections()
+
+NOTE: using the close_connection and close_all methods of the handler
+should be done with care when using multiple threads.
+ * there is nothing that prevents another thread from creating new
+ connections immediately after connections are closed
+ * no checks are done to prevent in-use connections from being closed
+
+>>> keepalive_handler.close_all()
+
+EXTRA ATTRIBUTES AND METHODS
+
+ Upon a status of 200, the object returned has a few additional
+ attributes and methods, which should not be used if you want to
+ remain consistent with the normal urllib2-returned objects:
+
+ close_connection() - close the connection to the host
+ readlines() - you know, readlines()
+ status - the return status (ie 404)
+ reason - english translation of status (ie 'File not found')
+
+ If you want the best of both worlds, use this inside an
+ AttributeError-catching try:
+
+ >>> try: status = fo.status
+ >>> except AttributeError: status = None
+
+ Unfortunately, these are ONLY there if status == 200, so it's not
+ easy to distinguish between non-200 responses. The reason is that
+ urllib2 tries to do clever things with error codes 301, 302, 401,
+ and 407, and it wraps the object upon return.
+
+ For python versions earlier than 2.4, you can avoid this fancy error
+ handling by setting the module-level global HANDLE_ERRORS to zero.
+ You see, prior to 2.4, it's the HTTP Handler's job to determine what
+ to handle specially, and what to just pass up. HANDLE_ERRORS == 0
+ means "pass everything up". In python 2.4, however, this job no
+ longer belongs to the HTTP Handler and is now done by a NEW handler,
+ HTTPErrorProcessor. Here's the bottom line:
+
+ python version < 2.4
+ HANDLE_ERRORS == 1 (default) pass up 200, treat the rest as
+ errors
+ HANDLE_ERRORS == 0 pass everything up, error processing is
+ left to the calling code
+ python version >= 2.4
+ HANDLE_ERRORS == 1 pass up 200, treat the rest as errors
+ HANDLE_ERRORS == 0 (default) pass everything up, let the
+ other handlers (specifically,
+ HTTPErrorProcessor) decide what to do
+
+ In practice, setting the variable either way makes little difference
+ in python 2.4, so for the most consistent behavior across versions,
+ you probably just want to use the defaults, which will give you
+ exceptions on errors.
+
+"""
+
+# $Id: keepalive.py,v 1.14 2006/04/04 21:00:32 mstenner Exp $
+
+import errno
+import httplib
+import socket
+import thread
+import urllib2
+
+DEBUG = None
+
+import sys
+if sys.version_info < (2, 4):
+ HANDLE_ERRORS = 1
+else: HANDLE_ERRORS = 0
+
+class ConnectionManager(object):
+ """
+ The connection manager must be able to:
+ * keep track of all existing
+ """
+ def __init__(self):
+ self._lock = thread.allocate_lock()
+ self._hostmap = {} # map hosts to a list of connections
+ self._connmap = {} # map connections to host
+ self._readymap = {} # map connection to ready state
+
+ def add(self, host, connection, ready):
+ self._lock.acquire()
+ try:
+ if host not in self._hostmap:
+ self._hostmap[host] = []
+ self._hostmap[host].append(connection)
+ self._connmap[connection] = host
+ self._readymap[connection] = ready
+ finally:
+ self._lock.release()
+
+ def remove(self, connection):
+ self._lock.acquire()
+ try:
+ try:
+ host = self._connmap[connection]
+ except KeyError:
+ pass
+ else:
+ del self._connmap[connection]
+ del self._readymap[connection]
+ self._hostmap[host].remove(connection)
+ if not self._hostmap[host]: del self._hostmap[host]
+ finally:
+ self._lock.release()
+
+ def set_ready(self, connection, ready):
+ try:
+ self._readymap[connection] = ready
+ except KeyError:
+ pass
+
+ def get_ready_conn(self, host):
+ conn = None
+ self._lock.acquire()
+ try:
+ if host in self._hostmap:
+ for c in self._hostmap[host]:
+ if self._readymap[c]:
+ self._readymap[c] = 0
+ conn = c
+ break
+ finally:
+ self._lock.release()
+ return conn
+
+ def get_all(self, host=None):
+ if host:
+ return list(self._hostmap.get(host, []))
+ else:
+ return dict(self._hostmap)
+
+class KeepAliveHandler(object):
+ def __init__(self):
+ self._cm = ConnectionManager()
+
+ #### Connection Management
+ def open_connections(self):
+ """return a list of connected hosts and the number of connections
+ to each. [('foo.com:80', 2), ('bar.org', 1)]"""
+ return [(host, len(li)) for (host, li) in self._cm.get_all().items()]
+
+ def close_connection(self, host):
+ """close connection(s) to <host>
+ host is the host:port spec, as in 'www.cnn.com:8080' as passed in.
+ no error occurs if there is no connection to that host."""
+ for h in self._cm.get_all(host):
+ self._cm.remove(h)
+ h.close()
+
+ def close_all(self):
+ """close all open connections"""
+ for host, conns in self._cm.get_all().iteritems():
+ for h in conns:
+ self._cm.remove(h)
+ h.close()
+
+ def _request_closed(self, request, host, connection):
+ """tells us that this request is now closed and that the
+ connection is ready for another request"""
+ self._cm.set_ready(connection, 1)
+
+ def _remove_connection(self, host, connection, close=0):
+ if close:
+ connection.close()
+ self._cm.remove(connection)
+
+ #### Transaction Execution
+ def http_open(self, req):
+ return self.do_open(HTTPConnection, req)
+
+ def do_open(self, http_class, req):
+ host = req.get_host()
+ if not host:
+ raise urllib2.URLError('no host given')
+
+ try:
+ h = self._cm.get_ready_conn(host)
+ while h:
+ r = self._reuse_connection(h, req, host)
+
+ # if this response is non-None, then it worked and we're
+ # done. Break out, skipping the else block.
+ if r:
+ break
+
+ # connection is bad - possibly closed by server
+ # discard it and ask for the next free connection
+ h.close()
+ self._cm.remove(h)
+ h = self._cm.get_ready_conn(host)
+ else:
+ # no (working) free connections were found. Create a new one.
+ h = http_class(host)
+ if DEBUG:
+ DEBUG.info("creating new connection to %s (%d)",
+ host, id(h))
+ self._cm.add(host, h, 0)
+ self._start_transaction(h, req)
+ r = h.getresponse()
+ except (socket.error, httplib.HTTPException), err:
+ raise urllib2.URLError(err)
+
+ # if not a persistent connection, don't try to reuse it
+ if r.will_close:
+ self._cm.remove(h)
+
+ if DEBUG:
+ DEBUG.info("STATUS: %s, %s", r.status, r.reason)
+ r._handler = self
+ r._host = host
+ r._url = req.get_full_url()
+ r._connection = h
+ r.code = r.status
+ r.headers = r.msg
+ r.msg = r.reason
+
+ if r.status == 200 or not HANDLE_ERRORS:
+ return r
+ else:
+ return self.parent.error('http', req, r,
+ r.status, r.msg, r.headers)
+
+ def _reuse_connection(self, h, req, host):
+ """start the transaction with a re-used connection
+ return a response object (r) upon success or None on failure.
+ This DOES not close or remove bad connections in cases where
+ it returns. However, if an unexpected exception occurs, it
+ will close and remove the connection before re-raising.
+ """
+ try:
+ self._start_transaction(h, req)
+ r = h.getresponse()
+ # note: just because we got something back doesn't mean it
+ # worked. We'll check the version below, too.
+ except (socket.error, httplib.HTTPException):
+ r = None
+ except: # re-raises
+ # adding this block just in case we've missed
+ # something we will still raise the exception, but
+ # lets try and close the connection and remove it
+ # first. We previously got into a nasty loop
+ # where an exception was uncaught, and so the
+ # connection stayed open. On the next try, the
+ # same exception was raised, etc. The tradeoff is
+ # that it's now possible this call will raise
+ # a DIFFERENT exception
+ if DEBUG:
+ DEBUG.error("unexpected exception - closing "
+ "connection to %s (%d)", host, id(h))
+ self._cm.remove(h)
+ h.close()
+ raise
+
+ if r is None or r.version == 9:
+ # httplib falls back to assuming HTTP 0.9 if it gets a
+ # bad header back. This is most likely to happen if
+ # the socket has been closed by the server since we
+ # last used the connection.
+ if DEBUG:
+ DEBUG.info("failed to re-use connection to %s (%d)",
+ host, id(h))
+ r = None
+ else:
+ if DEBUG:
+ DEBUG.info("re-using connection to %s (%d)", host, id(h))
+
+ return r
+
+ def _start_transaction(self, h, req):
+ # What follows mostly reimplements HTTPConnection.request()
+ # except it adds self.parent.addheaders in the mix.
+ headers = req.headers.copy()
+ if sys.version_info >= (2, 4):
+ headers.update(req.unredirected_hdrs)
+ headers.update(self.parent.addheaders)
+ headers = dict((n.lower(), v) for n, v in headers.items())
+ skipheaders = {}
+ for n in ('host', 'accept-encoding'):
+ if n in headers:
+ skipheaders['skip_' + n.replace('-', '_')] = 1
+ try:
+ if req.has_data():
+ data = req.get_data()
+ h.putrequest('POST', req.get_selector(), **skipheaders)
+ if 'content-type' not in headers:
+ h.putheader('Content-type',
+ 'application/x-www-form-urlencoded')
+ if 'content-length' not in headers:
+ h.putheader('Content-length', '%d' % len(data))
+ else:
+ h.putrequest('GET', req.get_selector(), **skipheaders)
+ except (socket.error), err:
+ raise urllib2.URLError(err)
+ for k, v in headers.items():
+ h.putheader(k, v)
+ h.endheaders()
+ if req.has_data():
+ h.send(data)
+
+class HTTPHandler(KeepAliveHandler, urllib2.HTTPHandler):
+ pass
+
+class HTTPResponse(httplib.HTTPResponse):
+ # we need to subclass HTTPResponse in order to
+ # 1) add readline() and readlines() methods
+ # 2) add close_connection() methods
+ # 3) add info() and geturl() methods
+
+ # in order to add readline(), read must be modified to deal with a
+ # buffer. example: readline must read a buffer and then spit back
+ # one line at a time. The only real alternative is to read one
+ # BYTE at a time (ick). Once something has been read, it can't be
+ # put back (ok, maybe it can, but that's even uglier than this),
+ # so if you THEN do a normal read, you must first take stuff from
+ # the buffer.
+
+ # the read method wraps the original to accomodate buffering,
+ # although read() never adds to the buffer.
+ # Both readline and readlines have been stolen with almost no
+ # modification from socket.py
+
+
+ def __init__(self, sock, debuglevel=0, strict=0, method=None):
+ if method: # the httplib in python 2.3 uses the method arg
+ httplib.HTTPResponse.__init__(self, sock, debuglevel, method)
+ else: # 2.2 doesn't
+ httplib.HTTPResponse.__init__(self, sock, debuglevel)
+ self.fileno = sock.fileno
+ self.code = None
+ self._rbuf = ''
+ self._rbufsize = 8096
+ self._handler = None # inserted by the handler later
+ self._host = None # (same)
+ self._url = None # (same)
+ self._connection = None # (same)
+
+ _raw_read = httplib.HTTPResponse.read
+
+ def close(self):
+ if self.fp:
+ self.fp.close()
+ self.fp = None
+ if self._handler:
+ self._handler._request_closed(self, self._host,
+ self._connection)
+
+ def close_connection(self):
+ self._handler._remove_connection(self._host, self._connection, close=1)
+ self.close()
+
+ def info(self):
+ return self.headers
+
+ def geturl(self):
+ return self._url
+
+ def read(self, amt=None):
+ # the _rbuf test is only in this first if for speed. It's not
+ # logically necessary
+ if self._rbuf and not amt is None:
+ L = len(self._rbuf)
+ if amt > L:
+ amt -= L
+ else:
+ s = self._rbuf[:amt]
+ self._rbuf = self._rbuf[amt:]
+ return s
+
+ s = self._rbuf + self._raw_read(amt)
+ self._rbuf = ''
+ return s
+
+ # stolen from Python SVN #68532 to fix issue1088
+ def _read_chunked(self, amt):
+ chunk_left = self.chunk_left
+ value = ''
+
+ # XXX This accumulates chunks by repeated string concatenation,
+ # which is not efficient as the number or size of chunks gets big.
+ while True:
+ if chunk_left is None:
+ line = self.fp.readline()
+ i = line.find(';')
+ if i >= 0:
+ line = line[:i] # strip chunk-extensions
+ try:
+ chunk_left = int(line, 16)
+ except ValueError:
+ # close the connection as protocol synchronisation is
+ # probably lost
+ self.close()
+ raise httplib.IncompleteRead(value)
+ if chunk_left == 0:
+ break
+ if amt is None:
+ value += self._safe_read(chunk_left)
+ elif amt < chunk_left:
+ value += self._safe_read(amt)
+ self.chunk_left = chunk_left - amt
+ return value
+ elif amt == chunk_left:
+ value += self._safe_read(amt)
+ self._safe_read(2) # toss the CRLF at the end of the chunk
+ self.chunk_left = None
+ return value
+ else:
+ value += self._safe_read(chunk_left)
+ amt -= chunk_left
+
+ # we read the whole chunk, get another
+ self._safe_read(2) # toss the CRLF at the end of the chunk
+ chunk_left = None
+
+ # read and discard trailer up to the CRLF terminator
+ ### note: we shouldn't have any trailers!
+ while True:
+ line = self.fp.readline()
+ if not line:
+ # a vanishingly small number of sites EOF without
+ # sending the trailer
+ break
+ if line == '\r\n':
+ break
+
+ # we read everything; close the "file"
+ self.close()
+
+ return value
+
+ def readline(self, limit=-1):
+ i = self._rbuf.find('\n')
+ while i < 0 and not (0 < limit <= len(self._rbuf)):
+ new = self._raw_read(self._rbufsize)
+ if not new:
+ break
+ i = new.find('\n')
+ if i >= 0:
+ i = i + len(self._rbuf)
+ self._rbuf = self._rbuf + new
+ if i < 0:
+ i = len(self._rbuf)
+ else:
+ i = i + 1
+ if 0 <= limit < len(self._rbuf):
+ i = limit
+ data, self._rbuf = self._rbuf[:i], self._rbuf[i:]
+ return data
+
+ def readlines(self, sizehint = 0):
+ total = 0
+ list = []
+ while True:
+ line = self.readline()
+ if not line:
+ break
+ list.append(line)
+ total += len(line)
+ if sizehint and total >= sizehint:
+ break
+ return list
+
+def safesend(self, str):
+ """Send `str' to the server.
+
+ Shamelessly ripped off from httplib to patch a bad behavior.
+ """
+ # _broken_pipe_resp is an attribute we set in this function
+ # if the socket is closed while we're sending data but
+ # the server sent us a response before hanging up.
+ # In that case, we want to pretend to send the rest of the
+ # outgoing data, and then let the user use getresponse()
+ # (which we wrap) to get this last response before
+ # opening a new socket.
+ if getattr(self, '_broken_pipe_resp', None) is not None:
+ return
+
+ if self.sock is None:
+ if self.auto_open:
+ self.connect()
+ else:
+ raise httplib.NotConnected
+
+ # send the data to the server. if we get a broken pipe, then close
+ # the socket. we want to reconnect when somebody tries to send again.
+ #
+ # NOTE: we DO propagate the error, though, because we cannot simply
+ # ignore the error... the caller will know if they can retry.
+ if self.debuglevel > 0:
+ print "send:", repr(str)
+ try:
+ blocksize = 8192
+ read = getattr(str, 'read', None)
+ if read is not None:
+ if self.debuglevel > 0:
+ print "sendIng a read()able"
+ data = read(blocksize)
+ while data:
+ self.sock.sendall(data)
+ data = read(blocksize)
+ else:
+ self.sock.sendall(str)
+ except socket.error, v:
+ reraise = True
+ if v[0] == errno.EPIPE: # Broken pipe
+ if self._HTTPConnection__state == httplib._CS_REQ_SENT:
+ self._broken_pipe_resp = None
+ self._broken_pipe_resp = self.getresponse()
+ reraise = False
+ self.close()
+ if reraise:
+ raise
+
+def wrapgetresponse(cls):
+ """Wraps getresponse in cls with a broken-pipe sane version.
+ """
+ def safegetresponse(self):
+ # In safesend() we might set the _broken_pipe_resp
+ # attribute, in which case the socket has already
+ # been closed and we just need to give them the response
+ # back. Otherwise, we use the normal response path.
+ r = getattr(self, '_broken_pipe_resp', None)
+ if r is not None:
+ return r
+ return cls.getresponse(self)
+ safegetresponse.__doc__ = cls.getresponse.__doc__
+ return safegetresponse
+
+class HTTPConnection(httplib.HTTPConnection):
+ # use the modified response class
+ response_class = HTTPResponse
+ send = safesend
+ getresponse = wrapgetresponse(httplib.HTTPConnection)
+
+
+#########################################################################
+##### TEST FUNCTIONS
+#########################################################################
+
+def error_handler(url):
+ global HANDLE_ERRORS
+ orig = HANDLE_ERRORS
+ keepalive_handler = HTTPHandler()
+ opener = urllib2.build_opener(keepalive_handler)
+ urllib2.install_opener(opener)
+ pos = {0: 'off', 1: 'on'}
+ for i in (0, 1):
+ print " fancy error handling %s (HANDLE_ERRORS = %i)" % (pos[i], i)
+ HANDLE_ERRORS = i
+ try:
+ fo = urllib2.urlopen(url)
+ fo.read()
+ fo.close()
+ try:
+ status, reason = fo.status, fo.reason
+ except AttributeError:
+ status, reason = None, None
+ except IOError, e:
+ print " EXCEPTION: %s" % e
+ raise
+ else:
+ print " status = %s, reason = %s" % (status, reason)
+ HANDLE_ERRORS = orig
+ hosts = keepalive_handler.open_connections()
+ print "open connections:", hosts
+ keepalive_handler.close_all()
+
+def md5(s):
+ try:
+ from hashlib import md5 as _md5
+ except ImportError:
+ from md5 import md5 as _md5
+ global md5
+ md5 = _md5
+ return _md5(s)
+
+def continuity(url):
+ format = '%25s: %s'
+
+ # first fetch the file with the normal http handler
+ opener = urllib2.build_opener()
+ urllib2.install_opener(opener)
+ fo = urllib2.urlopen(url)
+ foo = fo.read()
+ fo.close()
+ m = md5.new(foo)
+ print format % ('normal urllib', m.hexdigest())
+
+ # now install the keepalive handler and try again
+ opener = urllib2.build_opener(HTTPHandler())
+ urllib2.install_opener(opener)
+
+ fo = urllib2.urlopen(url)
+ foo = fo.read()
+ fo.close()
+ m = md5.new(foo)
+ print format % ('keepalive read', m.hexdigest())
+
+ fo = urllib2.urlopen(url)
+ foo = ''
+ while True:
+ f = fo.readline()
+ if f:
+ foo = foo + f
+ else: break
+ fo.close()
+ m = md5.new(foo)
+ print format % ('keepalive readline', m.hexdigest())
+
+def comp(N, url):
+ print ' making %i connections to:\n %s' % (N, url)
+
+ sys.stdout.write(' first using the normal urllib handlers')
+ # first use normal opener
+ opener = urllib2.build_opener()
+ urllib2.install_opener(opener)
+ t1 = fetch(N, url)
+ print ' TIME: %.3f s' % t1
+
+ sys.stdout.write(' now using the keepalive handler ')
+ # now install the keepalive handler and try again
+ opener = urllib2.build_opener(HTTPHandler())
+ urllib2.install_opener(opener)
+ t2 = fetch(N, url)
+ print ' TIME: %.3f s' % t2
+ print ' improvement factor: %.2f' % (t1 / t2)
+
+def fetch(N, url, delay=0):
+ import time
+ lens = []
+ starttime = time.time()
+ for i in range(N):
+ if delay and i > 0:
+ time.sleep(delay)
+ fo = urllib2.urlopen(url)
+ foo = fo.read()
+ fo.close()
+ lens.append(len(foo))
+ diff = time.time() - starttime
+
+ j = 0
+ for i in lens[1:]:
+ j = j + 1
+ if not i == lens[0]:
+ print "WARNING: inconsistent length on read %i: %i" % (j, i)
+
+ return diff
+
+def test_timeout(url):
+ global DEBUG
+ dbbackup = DEBUG
+ class FakeLogger(object):
+ def debug(self, msg, *args):
+ print msg % args
+ info = warning = error = debug
+ DEBUG = FakeLogger()
+ print " fetching the file to establish a connection"
+ fo = urllib2.urlopen(url)
+ data1 = fo.read()
+ fo.close()
+
+ i = 20
+ print " waiting %i seconds for the server to close the connection" % i
+ while i > 0:
+ sys.stdout.write('\r %2i' % i)
+ sys.stdout.flush()
+ time.sleep(1)
+ i -= 1
+ sys.stderr.write('\r')
+
+ print " fetching the file a second time"
+ fo = urllib2.urlopen(url)
+ data2 = fo.read()
+ fo.close()
+
+ if data1 == data2:
+ print ' data are identical'
+ else:
+ print ' ERROR: DATA DIFFER'
+
+ DEBUG = dbbackup
+
+
+def test(url, N=10):
+ print "checking error hander (do this on a non-200)"
+ try: error_handler(url)
+ except IOError:
+ print "exiting - exception will prevent further tests"
+ sys.exit()
+ print
+ print "performing continuity test (making sure stuff isn't corrupted)"
+ continuity(url)
+ print
+ print "performing speed comparison"
+ comp(N, url)
+ print
+ print "performing dropped-connection check"
+ test_timeout(url)
+
+if __name__ == '__main__':
+ import time
+ import sys
+ try:
+ N = int(sys.argv[1])
+ url = sys.argv[2]
+ except (IndexError, ValueError):
+ print "%s <integer> <url>" % sys.argv[0]
+ else:
+ test(url, N)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
new file mode 100644
index 0000000..89c1edd
--- /dev/null
+++ b/mercurial/localrepo.py
@@ -0,0 +1,2605 @@
+# localrepo.py - read/write repository class for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+from node import bin, hex, nullid, nullrev, short
+from i18n import _
+import peer, changegroup, subrepo, discovery, pushkey, obsolete
+import changelog, dirstate, filelog, manifest, context, bookmarks, phases
+import lock, transaction, store, encoding, base85
+import scmutil, util, extensions, hook, error, revset
+import match as matchmod
+import merge as mergemod
+import tags as tagsmod
+from lock import release
+import weakref, errno, os, time, inspect
+propertycache = util.propertycache
+filecache = scmutil.filecache
+
+class storecache(filecache):
+ """filecache for files in the store"""
+ def join(self, obj, fname):
+ return obj.sjoin(fname)
+
+MODERNCAPS = set(('lookup', 'branchmap', 'pushkey', 'known', 'getbundle'))
+LEGACYCAPS = MODERNCAPS.union(set(['changegroupsubset']))
+
+class localpeer(peer.peerrepository):
+ '''peer for a local repo; reflects only the most recent API'''
+
+ def __init__(self, repo, caps=MODERNCAPS):
+ peer.peerrepository.__init__(self)
+ self._repo = repo
+ self.ui = repo.ui
+ self._caps = repo._restrictcapabilities(caps)
+ self.requirements = repo.requirements
+ self.supportedformats = repo.supportedformats
+
+ def close(self):
+ self._repo.close()
+
+ def _capabilities(self):
+ return self._caps
+
+ def local(self):
+ return self._repo
+
+ def canpush(self):
+ return True
+
+ def url(self):
+ return self._repo.url()
+
+ def lookup(self, key):
+ return self._repo.lookup(key)
+
+ def branchmap(self):
+ return discovery.visiblebranchmap(self._repo)
+
+ def heads(self):
+ return discovery.visibleheads(self._repo)
+
+ def known(self, nodes):
+ return self._repo.known(nodes)
+
+ def getbundle(self, source, heads=None, common=None):
+ return self._repo.getbundle(source, heads=heads, common=common)
+
+ # TODO We might want to move the next two calls into legacypeer and add
+ # unbundle instead.
+
+ def lock(self):
+ return self._repo.lock()
+
+ def addchangegroup(self, cg, source, url):
+ return self._repo.addchangegroup(cg, source, url)
+
+ def pushkey(self, namespace, key, old, new):
+ return self._repo.pushkey(namespace, key, old, new)
+
+ def listkeys(self, namespace):
+ return self._repo.listkeys(namespace)
+
+ def debugwireargs(self, one, two, three=None, four=None, five=None):
+ '''used to test argument passing over the wire'''
+ return "%s %s %s %s %s" % (one, two, three, four, five)
+
+class locallegacypeer(localpeer):
+ '''peer extension which implements legacy methods too; used for tests with
+ restricted capabilities'''
+
+ def __init__(self, repo):
+ localpeer.__init__(self, repo, caps=LEGACYCAPS)
+
+ def branches(self, nodes):
+ return self._repo.branches(nodes)
+
+ def between(self, pairs):
+ return self._repo.between(pairs)
+
+ def changegroup(self, basenodes, source):
+ return self._repo.changegroup(basenodes, source)
+
+ def changegroupsubset(self, bases, heads, source):
+ return self._repo.changegroupsubset(bases, heads, source)
+
+class localrepository(object):
+
+ supportedformats = set(('revlogv1', 'generaldelta'))
+ supported = supportedformats | set(('store', 'fncache', 'shared',
+ 'dotencode'))
+ openerreqs = set(('revlogv1', 'generaldelta'))
+ requirements = ['revlogv1']
+
+ def _baserequirements(self, create):
+ return self.requirements[:]
+
+ def __init__(self, baseui, path=None, create=False):
+ self.wopener = scmutil.opener(path, expand=True)
+ self.wvfs = self.wopener
+ self.root = self.wvfs.base
+ self.path = self.wvfs.join(".hg")
+ self.origroot = path
+ self.auditor = scmutil.pathauditor(self.root, self._checknested)
+ self.opener = scmutil.opener(self.path)
+ self.vfs = self.opener
+ self.baseui = baseui
+ self.ui = baseui.copy()
+ # A list of callback to shape the phase if no data were found.
+ # Callback are in the form: func(repo, roots) --> processed root.
+ # This list it to be filled by extension during repo setup
+ self._phasedefaults = []
+ try:
+ self.ui.readconfig(self.join("hgrc"), self.root)
+ extensions.loadall(self.ui)
+ except IOError:
+ pass
+
+ if not self.vfs.isdir():
+ if create:
+ if not self.wvfs.exists():
+ self.wvfs.makedirs()
+ self.vfs.makedir(notindexed=True)
+ requirements = self._baserequirements(create)
+ if self.ui.configbool('format', 'usestore', True):
+ self.vfs.mkdir("store")
+ requirements.append("store")
+ if self.ui.configbool('format', 'usefncache', True):
+ requirements.append("fncache")
+ if self.ui.configbool('format', 'dotencode', True):
+ requirements.append('dotencode')
+ # create an invalid changelog
+ self.vfs.append(
+ "00changelog.i",
+ '\0\0\0\2' # represents revlogv2
+ ' dummy changelog to prevent using the old repo layout'
+ )
+ if self.ui.configbool('format', 'generaldelta', False):
+ requirements.append("generaldelta")
+ requirements = set(requirements)
+ else:
+ raise error.RepoError(_("repository %s not found") % path)
+ elif create:
+ raise error.RepoError(_("repository %s already exists") % path)
+ else:
+ try:
+ requirements = scmutil.readrequires(self.vfs, self.supported)
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ requirements = set()
+
+ self.sharedpath = self.path
+ try:
+ s = os.path.realpath(self.opener.read("sharedpath").rstrip('\n'))
+ if not os.path.exists(s):
+ raise error.RepoError(
+ _('.hg/sharedpath points to nonexistent directory %s') % s)
+ self.sharedpath = s
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+
+ self.store = store.store(requirements, self.sharedpath, scmutil.opener)
+ self.spath = self.store.path
+ self.sopener = self.store.opener
+ self.svfs = self.sopener
+ self.sjoin = self.store.join
+ self.opener.createmode = self.store.createmode
+ self._applyrequirements(requirements)
+ if create:
+ self._writerequirements()
+
+
+ self._branchcache = None
+ self._branchcachetip = None
+ self.filterpats = {}
+ self._datafilters = {}
+ self._transref = self._lockref = self._wlockref = None
+
+ # A cache for various files under .hg/ that tracks file changes,
+ # (used by the filecache decorator)
+ #
+ # Maps a property name to its util.filecacheentry
+ self._filecache = {}
+
+ def close(self):
+ pass
+
+ def _restrictcapabilities(self, caps):
+ return caps
+
+ def _applyrequirements(self, requirements):
+ self.requirements = requirements
+ self.sopener.options = dict((r, 1) for r in requirements
+ if r in self.openerreqs)
+
+ def _writerequirements(self):
+ reqfile = self.opener("requires", "w")
+ for r in self.requirements:
+ reqfile.write("%s\n" % r)
+ reqfile.close()
+
+ def _checknested(self, path):
+ """Determine if path is a legal nested repository."""
+ if not path.startswith(self.root):
+ return False
+ subpath = path[len(self.root) + 1:]
+ normsubpath = util.pconvert(subpath)
+
+ # XXX: Checking against the current working copy is wrong in
+ # the sense that it can reject things like
+ #
+ # $ hg cat -r 10 sub/x.txt
+ #
+ # if sub/ is no longer a subrepository in the working copy
+ # parent revision.
+ #
+ # However, it can of course also allow things that would have
+ # been rejected before, such as the above cat command if sub/
+ # is a subrepository now, but was a normal directory before.
+ # The old path auditor would have rejected by mistake since it
+ # panics when it sees sub/.hg/.
+ #
+ # All in all, checking against the working copy seems sensible
+ # since we want to prevent access to nested repositories on
+ # the filesystem *now*.
+ ctx = self[None]
+ parts = util.splitpath(subpath)
+ while parts:
+ prefix = '/'.join(parts)
+ if prefix in ctx.substate:
+ if prefix == normsubpath:
+ return True
+ else:
+ sub = ctx.sub(prefix)
+ return sub.checknested(subpath[len(prefix) + 1:])
+ else:
+ parts.pop()
+ return False
+
+ def peer(self):
+ return localpeer(self) # not cached to avoid reference cycle
+
+ @filecache('bookmarks')
+ def _bookmarks(self):
+ return bookmarks.read(self)
+
+ @filecache('bookmarks.current')
+ def _bookmarkcurrent(self):
+ return bookmarks.readcurrent(self)
+
+ def _writebookmarks(self, marks):
+ bookmarks.write(self)
+
+ def bookmarkheads(self, bookmark):
+ name = bookmark.split('@', 1)[0]
+ heads = []
+ for mark, n in self._bookmarks.iteritems():
+ if mark.split('@', 1)[0] == name:
+ heads.append(n)
+ return heads
+
+ @storecache('phaseroots')
+ def _phasecache(self):
+ return phases.phasecache(self, self._phasedefaults)
+
+ @storecache('obsstore')
+ def obsstore(self):
+ store = obsolete.obsstore(self.sopener)
+ if store and not obsolete._enabled:
+ # message is rare enough to not be translated
+ msg = 'obsolete feature not enabled but %i markers found!\n'
+ self.ui.warn(msg % len(list(store)))
+ return store
+
+ @propertycache
+ def hiddenrevs(self):
+ """hiddenrevs: revs that should be hidden by command and tools
+
+ This set is carried on the repo to ease initialisation and lazy
+ loading it'll probably move back to changelog for efficienty and
+ consistency reason
+
+ Note that the hiddenrevs will needs invalidations when
+ - a new changesets is added (possible unstable above extinct)
+ - a new obsolete marker is added (possible new extinct changeset)
+ """
+ hidden = set()
+ if self.obsstore:
+ ### hide extinct changeset that are not accessible by any mean
+ hiddenquery = 'extinct() - ::(. + bookmark() + tagged())'
+ hidden.update(self.revs(hiddenquery))
+ return hidden
+
+ @storecache('00changelog.i')
+ def changelog(self):
+ c = changelog.changelog(self.sopener)
+ if 'HG_PENDING' in os.environ:
+ p = os.environ['HG_PENDING']
+ if p.startswith(self.root):
+ c.readpending('00changelog.i.a')
+ return c
+
+ @storecache('00manifest.i')
+ def manifest(self):
+ return manifest.manifest(self.sopener)
+
+ @filecache('dirstate')
+ def dirstate(self):
+ warned = [0]
+ def validate(node):
+ try:
+ self.changelog.rev(node)
+ return node
+ except error.LookupError:
+ if not warned[0]:
+ warned[0] = True
+ self.ui.warn(_("warning: ignoring unknown"
+ " working parent %s!\n") % short(node))
+ return nullid
+
+ return dirstate.dirstate(self.opener, self.ui, self.root, validate)
+
+ def __getitem__(self, changeid):
+ if changeid is None:
+ return context.workingctx(self)
+ return context.changectx(self, changeid)
+
+ def __contains__(self, changeid):
+ try:
+ return bool(self.lookup(changeid))
+ except error.RepoLookupError:
+ return False
+
+ def __nonzero__(self):
+ return True
+
+ def __len__(self):
+ return len(self.changelog)
+
+ def __iter__(self):
+ for i in xrange(len(self)):
+ yield i
+
+ def revs(self, expr, *args):
+ '''Return a list of revisions matching the given revset'''
+ expr = revset.formatspec(expr, *args)
+ m = revset.match(None, expr)
+ return [r for r in m(self, range(len(self)))]
+
+ def set(self, expr, *args):
+ '''
+ Yield a context for each matching revision, after doing arg
+ replacement via revset.formatspec
+ '''
+ for r in self.revs(expr, *args):
+ yield self[r]
+
+ def url(self):
+ return 'file:' + self.root
+
+ def hook(self, name, throw=False, **args):
+ return hook.hook(self.ui, self, name, throw, **args)
+
+ tag_disallowed = ':\r\n'
+
+ def _tag(self, names, node, message, local, user, date, extra={}):
+ if isinstance(names, str):
+ allchars = names
+ names = (names,)
+ else:
+ allchars = ''.join(names)
+ for c in self.tag_disallowed:
+ if c in allchars:
+ raise util.Abort(_('%r cannot be used in a tag name') % c)
+
+ branches = self.branchmap()
+ for name in names:
+ self.hook('pretag', throw=True, node=hex(node), tag=name,
+ local=local)
+ if name in branches:
+ self.ui.warn(_("warning: tag %s conflicts with existing"
+ " branch name\n") % name)
+
+ def writetags(fp, names, munge, prevtags):
+ fp.seek(0, 2)
+ if prevtags and prevtags[-1] != '\n':
+ fp.write('\n')
+ for name in names:
+ m = munge and munge(name) or name
+ if (self._tagscache.tagtypes and
+ name in self._tagscache.tagtypes):
+ old = self.tags().get(name, nullid)
+ fp.write('%s %s\n' % (hex(old), m))
+ fp.write('%s %s\n' % (hex(node), m))
+ fp.close()
+
+ prevtags = ''
+ if local:
+ try:
+ fp = self.opener('localtags', 'r+')
+ except IOError:
+ fp = self.opener('localtags', 'a')
+ else:
+ prevtags = fp.read()
+
+ # local tags are stored in the current charset
+ writetags(fp, names, None, prevtags)
+ for name in names:
+ self.hook('tag', node=hex(node), tag=name, local=local)
+ return
+
+ try:
+ fp = self.wfile('.hgtags', 'rb+')
+ except IOError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ fp = self.wfile('.hgtags', 'ab')
+ else:
+ prevtags = fp.read()
+
+ # committed tags are stored in UTF-8
+ writetags(fp, names, encoding.fromlocal, prevtags)
+
+ fp.close()
+
+ self.invalidatecaches()
+
+ if '.hgtags' not in self.dirstate:
+ self[None].add(['.hgtags'])
+
+ m = matchmod.exact(self.root, '', ['.hgtags'])
+ tagnode = self.commit(message, user, date, extra=extra, match=m)
+
+ for name in names:
+ self.hook('tag', node=hex(node), tag=name, local=local)
+
+ return tagnode
+
+ def tag(self, names, node, message, local, user, date):
+ '''tag a revision with one or more symbolic names.
+
+ names is a list of strings or, when adding a single tag, names may be a
+ string.
+
+ if local is True, the tags are stored in a per-repository file.
+ otherwise, they are stored in the .hgtags file, and a new
+ changeset is committed with the change.
+
+ keyword arguments:
+
+ local: whether to store tags in non-version-controlled file
+ (default False)
+
+ message: commit message to use if committing
+
+ user: name of user to use if committing
+
+ date: date tuple to use if committing'''
+
+ if not local:
+ for x in self.status()[:5]:
+ if '.hgtags' in x:
+ raise util.Abort(_('working copy of .hgtags is changed '
+ '(please commit .hgtags manually)'))
+
+ self.tags() # instantiate the cache
+ self._tag(names, node, message, local, user, date)
+
+ @propertycache
+ def _tagscache(self):
+ '''Returns a tagscache object that contains various tags related
+ caches.'''
+
+ # This simplifies its cache management by having one decorated
+ # function (this one) and the rest simply fetch things from it.
+ class tagscache(object):
+ def __init__(self):
+ # These two define the set of tags for this repository. tags
+ # maps tag name to node; tagtypes maps tag name to 'global' or
+ # 'local'. (Global tags are defined by .hgtags across all
+ # heads, and local tags are defined in .hg/localtags.)
+ # They constitute the in-memory cache of tags.
+ self.tags = self.tagtypes = None
+
+ self.nodetagscache = self.tagslist = None
+
+ cache = tagscache()
+ cache.tags, cache.tagtypes = self._findtags()
+
+ return cache
+
+ def tags(self):
+ '''return a mapping of tag to node'''
+ t = {}
+ for k, v in self._tagscache.tags.iteritems():
+ try:
+ # ignore tags to unknown nodes
+ self.changelog.rev(v)
+ t[k] = v
+ except (error.LookupError, ValueError):
+ pass
+ return t
+
+ def _findtags(self):
+ '''Do the hard work of finding tags. Return a pair of dicts
+ (tags, tagtypes) where tags maps tag name to node, and tagtypes
+ maps tag name to a string like \'global\' or \'local\'.
+ Subclasses or extensions are free to add their own tags, but
+ should be aware that the returned dicts will be retained for the
+ duration of the localrepo object.'''
+
+ # XXX what tagtype should subclasses/extensions use? Currently
+ # mq and bookmarks add tags, but do not set the tagtype at all.
+ # Should each extension invent its own tag type? Should there
+ # be one tagtype for all such "virtual" tags? Or is the status
+ # quo fine?
+
+ alltags = {} # map tag name to (node, hist)
+ tagtypes = {}
+
+ tagsmod.findglobaltags(self.ui, self, alltags, tagtypes)
+ tagsmod.readlocaltags(self.ui, self, alltags, tagtypes)
+
+ # Build the return dicts. Have to re-encode tag names because
+ # the tags module always uses UTF-8 (in order not to lose info
+ # writing to the cache), but the rest of Mercurial wants them in
+ # local encoding.
+ tags = {}
+ for (name, (node, hist)) in alltags.iteritems():
+ if node != nullid:
+ tags[encoding.tolocal(name)] = node
+ tags['tip'] = self.changelog.tip()
+ tagtypes = dict([(encoding.tolocal(name), value)
+ for (name, value) in tagtypes.iteritems()])
+ return (tags, tagtypes)
+
+ def tagtype(self, tagname):
+ '''
+ return the type of the given tag. result can be:
+
+ 'local' : a local tag
+ 'global' : a global tag
+ None : tag does not exist
+ '''
+
+ return self._tagscache.tagtypes.get(tagname)
+
+ def tagslist(self):
+ '''return a list of tags ordered by revision'''
+ if not self._tagscache.tagslist:
+ l = []
+ for t, n in self.tags().iteritems():
+ r = self.changelog.rev(n)
+ l.append((r, t, n))
+ self._tagscache.tagslist = [(t, n) for r, t, n in sorted(l)]
+
+ return self._tagscache.tagslist
+
+ def nodetags(self, node):
+ '''return the tags associated with a node'''
+ if not self._tagscache.nodetagscache:
+ nodetagscache = {}
+ for t, n in self._tagscache.tags.iteritems():
+ nodetagscache.setdefault(n, []).append(t)
+ for tags in nodetagscache.itervalues():
+ tags.sort()
+ self._tagscache.nodetagscache = nodetagscache
+ return self._tagscache.nodetagscache.get(node, [])
+
+ def nodebookmarks(self, node):
+ marks = []
+ for bookmark, n in self._bookmarks.iteritems():
+ if n == node:
+ marks.append(bookmark)
+ return sorted(marks)
+
+ def _branchtags(self, partial, lrev):
+ # TODO: rename this function?
+ tiprev = len(self) - 1
+ if lrev != tiprev:
+ ctxgen = (self[r] for r in xrange(lrev + 1, tiprev + 1))
+ self._updatebranchcache(partial, ctxgen)
+ self._writebranchcache(partial, self.changelog.tip(), tiprev)
+
+ return partial
+
+ def updatebranchcache(self):
+ tip = self.changelog.tip()
+ if self._branchcache is not None and self._branchcachetip == tip:
+ return
+
+ oldtip = self._branchcachetip
+ self._branchcachetip = tip
+ if oldtip is None or oldtip not in self.changelog.nodemap:
+ partial, last, lrev = self._readbranchcache()
+ else:
+ lrev = self.changelog.rev(oldtip)
+ partial = self._branchcache
+
+ self._branchtags(partial, lrev)
+ # this private cache holds all heads (not just the branch tips)
+ self._branchcache = partial
+
+ def branchmap(self):
+ '''returns a dictionary {branch: [branchheads]}'''
+ self.updatebranchcache()
+ return self._branchcache
+
+ def _branchtip(self, heads):
+ '''return the tipmost branch head in heads'''
+ tip = heads[-1]
+ for h in reversed(heads):
+ if not self[h].closesbranch():
+ tip = h
+ break
+ return tip
+
+ def branchtip(self, branch):
+ '''return the tip node for a given branch'''
+ if branch not in self.branchmap():
+ raise error.RepoLookupError(_("unknown branch '%s'") % branch)
+ return self._branchtip(self.branchmap()[branch])
+
+ def branchtags(self):
+ '''return a dict where branch names map to the tipmost head of
+ the branch, open heads come before closed'''
+ bt = {}
+ for bn, heads in self.branchmap().iteritems():
+ bt[bn] = self._branchtip(heads)
+ return bt
+
+ def _readbranchcache(self):
+ partial = {}
+ try:
+ f = self.opener("cache/branchheads")
+ lines = f.read().split('\n')
+ f.close()
+ except (IOError, OSError):
+ return {}, nullid, nullrev
+
+ try:
+ last, lrev = lines.pop(0).split(" ", 1)
+ last, lrev = bin(last), int(lrev)
+ if lrev >= len(self) or self[lrev].node() != last:
+ # invalidate the cache
+ raise ValueError('invalidating branch cache (tip differs)')
+ for l in lines:
+ if not l:
+ continue
+ node, label = l.split(" ", 1)
+ label = encoding.tolocal(label.strip())
+ if not node in self:
+ raise ValueError('invalidating branch cache because node '+
+ '%s does not exist' % node)
+ partial.setdefault(label, []).append(bin(node))
+ except KeyboardInterrupt:
+ raise
+ except Exception, inst:
+ if self.ui.debugflag:
+ self.ui.warn(str(inst), '\n')
+ partial, last, lrev = {}, nullid, nullrev
+ return partial, last, lrev
+
+ def _writebranchcache(self, branches, tip, tiprev):
+ try:
+ f = self.opener("cache/branchheads", "w", atomictemp=True)
+ f.write("%s %s\n" % (hex(tip), tiprev))
+ for label, nodes in branches.iteritems():
+ for node in nodes:
+ f.write("%s %s\n" % (hex(node), encoding.fromlocal(label)))
+ f.close()
+ except (IOError, OSError):
+ pass
+
+ def _updatebranchcache(self, partial, ctxgen):
+ """Given a branchhead cache, partial, that may have extra nodes or be
+ missing heads, and a generator of nodes that are at least a superset of
+ heads missing, this function updates partial to be correct.
+ """
+ # collect new branch entries
+ newbranches = {}
+ for c in ctxgen:
+ newbranches.setdefault(c.branch(), []).append(c.node())
+ # if older branchheads are reachable from new ones, they aren't
+ # really branchheads. Note checking parents is insufficient:
+ # 1 (branch a) -> 2 (branch b) -> 3 (branch a)
+ for branch, newnodes in newbranches.iteritems():
+ bheads = partial.setdefault(branch, [])
+ # Remove candidate heads that no longer are in the repo (e.g., as
+ # the result of a strip that just happened). Avoid using 'node in
+ # self' here because that dives down into branchcache code somewhat
+ # recrusively.
+ bheadrevs = [self.changelog.rev(node) for node in bheads
+ if self.changelog.hasnode(node)]
+ newheadrevs = [self.changelog.rev(node) for node in newnodes
+ if self.changelog.hasnode(node)]
+ ctxisnew = bheadrevs and min(newheadrevs) > max(bheadrevs)
+ # Remove duplicates - nodes that are in newheadrevs and are already
+ # in bheadrevs. This can happen if you strip a node whose parent
+ # was already a head (because they're on different branches).
+ bheadrevs = sorted(set(bheadrevs).union(newheadrevs))
+
+ # Starting from tip means fewer passes over reachable. If we know
+ # the new candidates are not ancestors of existing heads, we don't
+ # have to examine ancestors of existing heads
+ if ctxisnew:
+ iterrevs = sorted(newheadrevs)
+ else:
+ iterrevs = list(bheadrevs)
+
+ # This loop prunes out two kinds of heads - heads that are
+ # superceded by a head in newheadrevs, and newheadrevs that are not
+ # heads because an existing head is their descendant.
+ while iterrevs:
+ latest = iterrevs.pop()
+ if latest not in bheadrevs:
+ continue
+ ancestors = set(self.changelog.ancestors([latest],
+ bheadrevs[0]))
+ if ancestors:
+ bheadrevs = [b for b in bheadrevs if b not in ancestors]
+ partial[branch] = [self.changelog.node(rev) for rev in bheadrevs]
+
+ # There may be branches that cease to exist when the last commit in the
+ # branch was stripped. This code filters them out. Note that the
+ # branch that ceased to exist may not be in newbranches because
+ # newbranches is the set of candidate heads, which when you strip the
+ # last commit in a branch will be the parent branch.
+ for branch in partial.keys():
+ nodes = [head for head in partial[branch]
+ if self.changelog.hasnode(head)]
+ if not nodes:
+ del partial[branch]
+
+ def lookup(self, key):
+ return self[key].node()
+
+ def lookupbranch(self, key, remote=None):
+ repo = remote or self
+ if key in repo.branchmap():
+ return key
+
+ repo = (remote and remote.local()) and remote or self
+ return repo[key].branch()
+
+ def known(self, nodes):
+ nm = self.changelog.nodemap
+ pc = self._phasecache
+ result = []
+ for n in nodes:
+ r = nm.get(n)
+ resp = not (r is None or pc.phase(self, r) >= phases.secret)
+ result.append(resp)
+ return result
+
+ def local(self):
+ return self
+
+ def cancopy(self):
+ return self.local() # so statichttprepo's override of local() works
+
+ def join(self, f):
+ return os.path.join(self.path, f)
+
+ def wjoin(self, f):
+ return os.path.join(self.root, f)
+
+ def file(self, f):
+ if f[0] == '/':
+ f = f[1:]
+ return filelog.filelog(self.sopener, f)
+
+ def changectx(self, changeid):
+ return self[changeid]
+
+ def parents(self, changeid=None):
+ '''get list of changectxs for parents of changeid'''
+ return self[changeid].parents()
+
+ def setparents(self, p1, p2=nullid):
+ copies = self.dirstate.setparents(p1, p2)
+ if copies:
+ # Adjust copy records, the dirstate cannot do it, it
+ # requires access to parents manifests. Preserve them
+ # only for entries added to first parent.
+ pctx = self[p1]
+ for f in copies:
+ if f not in pctx and copies[f] in pctx:
+ self.dirstate.copy(copies[f], f)
+
+ def filectx(self, path, changeid=None, fileid=None):
+ """changeid can be a changeset revision, node, or tag.
+ fileid can be a file revision or node."""
+ return context.filectx(self, path, changeid, fileid)
+
+ def getcwd(self):
+ return self.dirstate.getcwd()
+
+ def pathto(self, f, cwd=None):
+ return self.dirstate.pathto(f, cwd)
+
+ def wfile(self, f, mode='r'):
+ return self.wopener(f, mode)
+
+ def _link(self, f):
+ return os.path.islink(self.wjoin(f))
+
+ def _loadfilter(self, filter):
+ if filter not in self.filterpats:
+ l = []
+ for pat, cmd in self.ui.configitems(filter):
+ if cmd == '!':
+ continue
+ mf = matchmod.match(self.root, '', [pat])
+ fn = None
+ params = cmd
+ for name, filterfn in self._datafilters.iteritems():
+ if cmd.startswith(name):
+ fn = filterfn
+ params = cmd[len(name):].lstrip()
+ break
+ if not fn:
+ fn = lambda s, c, **kwargs: util.filter(s, c)
+ # Wrap old filters not supporting keyword arguments
+ if not inspect.getargspec(fn)[2]:
+ oldfn = fn
+ fn = lambda s, c, **kwargs: oldfn(s, c)
+ l.append((mf, fn, params))
+ self.filterpats[filter] = l
+ return self.filterpats[filter]
+
+ def _filter(self, filterpats, filename, data):
+ for mf, fn, cmd in filterpats:
+ if mf(filename):
+ self.ui.debug("filtering %s through %s\n" % (filename, cmd))
+ data = fn(data, cmd, ui=self.ui, repo=self, filename=filename)
+ break
+
+ return data
+
+ @propertycache
+ def _encodefilterpats(self):
+ return self._loadfilter('encode')
+
+ @propertycache
+ def _decodefilterpats(self):
+ return self._loadfilter('decode')
+
+ def adddatafilter(self, name, filter):
+ self._datafilters[name] = filter
+
+ def wread(self, filename):
+ if self._link(filename):
+ data = os.readlink(self.wjoin(filename))
+ else:
+ data = self.wopener.read(filename)
+ return self._filter(self._encodefilterpats, filename, data)
+
+ def wwrite(self, filename, data, flags):
+ data = self._filter(self._decodefilterpats, filename, data)
+ if 'l' in flags:
+ self.wopener.symlink(data, filename)
+ else:
+ self.wopener.write(filename, data)
+ if 'x' in flags:
+ util.setflags(self.wjoin(filename), False, True)
+
+ def wwritedata(self, filename, data):
+ return self._filter(self._decodefilterpats, filename, data)
+
+ def transaction(self, desc):
+ tr = self._transref and self._transref() or None
+ if tr and tr.running():
+ return tr.nest()
+
+ # abort here if the journal already exists
+ if os.path.exists(self.sjoin("journal")):
+ raise error.RepoError(
+ _("abandoned transaction found - run hg recover"))
+
+ self._writejournal(desc)
+ renames = [(x, undoname(x)) for x in self._journalfiles()]
+
+ tr = transaction.transaction(self.ui.warn, self.sopener,
+ self.sjoin("journal"),
+ aftertrans(renames),
+ self.store.createmode)
+ self._transref = weakref.ref(tr)
+ return tr
+
+ def _journalfiles(self):
+ return (self.sjoin('journal'), self.join('journal.dirstate'),
+ self.join('journal.branch'), self.join('journal.desc'),
+ self.join('journal.bookmarks'),
+ self.sjoin('journal.phaseroots'))
+
+ def undofiles(self):
+ return [undoname(x) for x in self._journalfiles()]
+
+ def _writejournal(self, desc):
+ self.opener.write("journal.dirstate",
+ self.opener.tryread("dirstate"))
+ self.opener.write("journal.branch",
+ encoding.fromlocal(self.dirstate.branch()))
+ self.opener.write("journal.desc",
+ "%d\n%s\n" % (len(self), desc))
+ self.opener.write("journal.bookmarks",
+ self.opener.tryread("bookmarks"))
+ self.sopener.write("journal.phaseroots",
+ self.sopener.tryread("phaseroots"))
+
+ def recover(self):
+ lock = self.lock()
+ try:
+ if os.path.exists(self.sjoin("journal")):
+ self.ui.status(_("rolling back interrupted transaction\n"))
+ transaction.rollback(self.sopener, self.sjoin("journal"),
+ self.ui.warn)
+ self.invalidate()
+ return True
+ else:
+ self.ui.warn(_("no interrupted transaction available\n"))
+ return False
+ finally:
+ lock.release()
+
+ def rollback(self, dryrun=False, force=False):
+ wlock = lock = None
+ try:
+ wlock = self.wlock()
+ lock = self.lock()
+ if os.path.exists(self.sjoin("undo")):
+ return self._rollback(dryrun, force)
+ else:
+ self.ui.warn(_("no rollback information available\n"))
+ return 1
+ finally:
+ release(lock, wlock)
+
+ def _rollback(self, dryrun, force):
+ ui = self.ui
+ try:
+ args = self.opener.read('undo.desc').splitlines()
+ (oldlen, desc, detail) = (int(args[0]), args[1], None)
+ if len(args) >= 3:
+ detail = args[2]
+ oldtip = oldlen - 1
+
+ if detail and ui.verbose:
+ msg = (_('repository tip rolled back to revision %s'
+ ' (undo %s: %s)\n')
+ % (oldtip, desc, detail))
+ else:
+ msg = (_('repository tip rolled back to revision %s'
+ ' (undo %s)\n')
+ % (oldtip, desc))
+ except IOError:
+ msg = _('rolling back unknown transaction\n')
+ desc = None
+
+ if not force and self['.'] != self['tip'] and desc == 'commit':
+ raise util.Abort(
+ _('rollback of last commit while not checked out '
+ 'may lose data'), hint=_('use -f to force'))
+
+ ui.status(msg)
+ if dryrun:
+ return 0
+
+ parents = self.dirstate.parents()
+ transaction.rollback(self.sopener, self.sjoin('undo'), ui.warn)
+ if os.path.exists(self.join('undo.bookmarks')):
+ util.rename(self.join('undo.bookmarks'),
+ self.join('bookmarks'))
+ if os.path.exists(self.sjoin('undo.phaseroots')):
+ util.rename(self.sjoin('undo.phaseroots'),
+ self.sjoin('phaseroots'))
+ self.invalidate()
+
+ # Discard all cache entries to force reloading everything.
+ self._filecache.clear()
+
+ parentgone = (parents[0] not in self.changelog.nodemap or
+ parents[1] not in self.changelog.nodemap)
+ if parentgone:
+ util.rename(self.join('undo.dirstate'), self.join('dirstate'))
+ try:
+ branch = self.opener.read('undo.branch')
+ self.dirstate.setbranch(branch)
+ except IOError:
+ ui.warn(_('named branch could not be reset: '
+ 'current branch is still \'%s\'\n')
+ % self.dirstate.branch())
+
+ self.dirstate.invalidate()
+ parents = tuple([p.rev() for p in self.parents()])
+ if len(parents) > 1:
+ ui.status(_('working directory now based on '
+ 'revisions %d and %d\n') % parents)
+ else:
+ ui.status(_('working directory now based on '
+ 'revision %d\n') % parents)
+ # TODO: if we know which new heads may result from this rollback, pass
+ # them to destroy(), which will prevent the branchhead cache from being
+ # invalidated.
+ self.destroyed()
+ return 0
+
+ def invalidatecaches(self):
+ def delcache(name):
+ try:
+ delattr(self, name)
+ except AttributeError:
+ pass
+
+ delcache('_tagscache')
+
+ self._branchcache = None # in UTF-8
+ self._branchcachetip = None
+
+ def invalidatedirstate(self):
+ '''Invalidates the dirstate, causing the next call to dirstate
+ to check if it was modified since the last time it was read,
+ rereading it if it has.
+
+ This is different to dirstate.invalidate() that it doesn't always
+ rereads the dirstate. Use dirstate.invalidate() if you want to
+ explicitly read the dirstate again (i.e. restoring it to a previous
+ known good state).'''
+ if 'dirstate' in self.__dict__:
+ for k in self.dirstate._filecache:
+ try:
+ delattr(self.dirstate, k)
+ except AttributeError:
+ pass
+ delattr(self, 'dirstate')
+
+ def invalidate(self):
+ for k in self._filecache:
+ # dirstate is invalidated separately in invalidatedirstate()
+ if k == 'dirstate':
+ continue
+
+ try:
+ delattr(self, k)
+ except AttributeError:
+ pass
+ self.invalidatecaches()
+
+ def _lock(self, lockname, wait, releasefn, acquirefn, desc):
+ try:
+ l = lock.lock(lockname, 0, releasefn, desc=desc)
+ except error.LockHeld, inst:
+ if not wait:
+ raise
+ self.ui.warn(_("waiting for lock on %s held by %r\n") %
+ (desc, inst.locker))
+ # default to 600 seconds timeout
+ l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")),
+ releasefn, desc=desc)
+ if acquirefn:
+ acquirefn()
+ return l
+
+ def _afterlock(self, callback):
+ """add a callback to the current repository lock.
+
+ The callback will be executed on lock release."""
+ l = self._lockref and self._lockref()
+ if l:
+ l.postrelease.append(callback)
+ else:
+ callback()
+
+ def lock(self, wait=True):
+ '''Lock the repository store (.hg/store) and return a weak reference
+ to the lock. Use this before modifying the store (e.g. committing or
+ stripping). If you are opening a transaction, get a lock as well.)'''
+ l = self._lockref and self._lockref()
+ if l is not None and l.held:
+ l.lock()
+ return l
+
+ def unlock():
+ self.store.write()
+ if '_phasecache' in vars(self):
+ self._phasecache.write()
+ for k, ce in self._filecache.items():
+ if k == 'dirstate':
+ continue
+ ce.refresh()
+
+ l = self._lock(self.sjoin("lock"), wait, unlock,
+ self.invalidate, _('repository %s') % self.origroot)
+ self._lockref = weakref.ref(l)
+ return l
+
+ def wlock(self, wait=True):
+ '''Lock the non-store parts of the repository (everything under
+ .hg except .hg/store) and return a weak reference to the lock.
+ Use this before modifying files in .hg.'''
+ l = self._wlockref and self._wlockref()
+ if l is not None and l.held:
+ l.lock()
+ return l
+
+ def unlock():
+ self.dirstate.write()
+ ce = self._filecache.get('dirstate')
+ if ce:
+ ce.refresh()
+
+ l = self._lock(self.join("wlock"), wait, unlock,
+ self.invalidatedirstate, _('working directory of %s') %
+ self.origroot)
+ self._wlockref = weakref.ref(l)
+ return l
+
+ def _filecommit(self, fctx, manifest1, manifest2, linkrev, tr, changelist):
+ """
+ commit an individual file as part of a larger transaction
+ """
+
+ fname = fctx.path()
+ text = fctx.data()
+ flog = self.file(fname)
+ fparent1 = manifest1.get(fname, nullid)
+ fparent2 = fparent2o = manifest2.get(fname, nullid)
+
+ meta = {}
+ copy = fctx.renamed()
+ if copy and copy[0] != fname:
+ # Mark the new revision of this file as a copy of another
+ # file. This copy data will effectively act as a parent
+ # of this new revision. If this is a merge, the first
+ # parent will be the nullid (meaning "look up the copy data")
+ # and the second one will be the other parent. For example:
+ #
+ # 0 --- 1 --- 3 rev1 changes file foo
+ # \ / rev2 renames foo to bar and changes it
+ # \- 2 -/ rev3 should have bar with all changes and
+ # should record that bar descends from
+ # bar in rev2 and foo in rev1
+ #
+ # this allows this merge to succeed:
+ #
+ # 0 --- 1 --- 3 rev4 reverts the content change from rev2
+ # \ / merging rev3 and rev4 should use bar@rev2
+ # \- 2 --- 4 as the merge base
+ #
+
+ cfname = copy[0]
+ crev = manifest1.get(cfname)
+ newfparent = fparent2
+
+ if manifest2: # branch merge
+ if fparent2 == nullid or crev is None: # copied on remote side
+ if cfname in manifest2:
+ crev = manifest2[cfname]
+ newfparent = fparent1
+
+ # find source in nearest ancestor if we've lost track
+ if not crev:
+ self.ui.debug(" %s: searching for copy revision for %s\n" %
+ (fname, cfname))
+ for ancestor in self[None].ancestors():
+ if cfname in ancestor:
+ crev = ancestor[cfname].filenode()
+ break
+
+ if crev:
+ self.ui.debug(" %s: copy %s:%s\n" % (fname, cfname, hex(crev)))
+ meta["copy"] = cfname
+ meta["copyrev"] = hex(crev)
+ fparent1, fparent2 = nullid, newfparent
+ else:
+ self.ui.warn(_("warning: can't find ancestor for '%s' "
+ "copied from '%s'!\n") % (fname, cfname))
+
+ elif fparent2 != nullid:
+ # is one parent an ancestor of the other?
+ fparentancestor = flog.ancestor(fparent1, fparent2)
+ if fparentancestor == fparent1:
+ fparent1, fparent2 = fparent2, nullid
+ elif fparentancestor == fparent2:
+ fparent2 = nullid
+
+ # is the file changed?
+ if fparent2 != nullid or flog.cmp(fparent1, text) or meta:
+ changelist.append(fname)
+ return flog.add(text, meta, tr, linkrev, fparent1, fparent2)
+
+ # are just the flags changed during merge?
+ if fparent1 != fparent2o and manifest1.flags(fname) != fctx.flags():
+ changelist.append(fname)
+
+ return fparent1
+
+ def commit(self, text="", user=None, date=None, match=None, force=False,
+ editor=False, extra={}):
+ """Add a new revision to current repository.
+
+ Revision information is gathered from the working directory,
+ match can be used to filter the committed files. If editor is
+ supplied, it is called to get a commit message.
+ """
+
+ def fail(f, msg):
+ raise util.Abort('%s: %s' % (f, msg))
+
+ if not match:
+ match = matchmod.always(self.root, '')
+
+ if not force:
+ vdirs = []
+ match.dir = vdirs.append
+ match.bad = fail
+
+ wlock = self.wlock()
+ try:
+ wctx = self[None]
+ merge = len(wctx.parents()) > 1
+
+ if (not force and merge and match and
+ (match.files() or match.anypats())):
+ raise util.Abort(_('cannot partially commit a merge '
+ '(do not specify files or patterns)'))
+
+ changes = self.status(match=match, clean=force)
+ if force:
+ changes[0].extend(changes[6]) # mq may commit unchanged files
+
+ # check subrepos
+ subs = []
+ commitsubs = set()
+ newstate = wctx.substate.copy()
+ # only manage subrepos and .hgsubstate if .hgsub is present
+ if '.hgsub' in wctx:
+ # we'll decide whether to track this ourselves, thanks
+ if '.hgsubstate' in changes[0]:
+ changes[0].remove('.hgsubstate')
+ if '.hgsubstate' in changes[2]:
+ changes[2].remove('.hgsubstate')
+
+ # compare current state to last committed state
+ # build new substate based on last committed state
+ oldstate = wctx.p1().substate
+ for s in sorted(newstate.keys()):
+ if not match(s):
+ # ignore working copy, use old state if present
+ if s in oldstate:
+ newstate[s] = oldstate[s]
+ continue
+ if not force:
+ raise util.Abort(
+ _("commit with new subrepo %s excluded") % s)
+ if wctx.sub(s).dirty(True):
+ if not self.ui.configbool('ui', 'commitsubrepos'):
+ raise util.Abort(
+ _("uncommitted changes in subrepo %s") % s,
+ hint=_("use --subrepos for recursive commit"))
+ subs.append(s)
+ commitsubs.add(s)
+ else:
+ bs = wctx.sub(s).basestate()
+ newstate[s] = (newstate[s][0], bs, newstate[s][2])
+ if oldstate.get(s, (None, None, None))[1] != bs:
+ subs.append(s)
+
+ # check for removed subrepos
+ for p in wctx.parents():
+ r = [s for s in p.substate if s not in newstate]
+ subs += [s for s in r if match(s)]
+ if subs:
+ if (not match('.hgsub') and
+ '.hgsub' in (wctx.modified() + wctx.added())):
+ raise util.Abort(
+ _("can't commit subrepos without .hgsub"))
+ changes[0].insert(0, '.hgsubstate')
+
+ elif '.hgsub' in changes[2]:
+ # clean up .hgsubstate when .hgsub is removed
+ if ('.hgsubstate' in wctx and
+ '.hgsubstate' not in changes[0] + changes[1] + changes[2]):
+ changes[2].insert(0, '.hgsubstate')
+
+ # make sure all explicit patterns are matched
+ if not force and match.files():
+ matched = set(changes[0] + changes[1] + changes[2])
+
+ for f in match.files():
+ if f == '.' or f in matched or f in wctx.substate:
+ continue
+ if f in changes[3]: # missing
+ fail(f, _('file not found!'))
+ if f in vdirs: # visited directory
+ d = f + '/'
+ for mf in matched:
+ if mf.startswith(d):
+ break
+ else:
+ fail(f, _("no match under directory!"))
+ elif f not in self.dirstate:
+ fail(f, _("file not tracked!"))
+
+ if (not force and not extra.get("close") and not merge
+ and not (changes[0] or changes[1] or changes[2])
+ and wctx.branch() == wctx.p1().branch()):
+ return None
+
+ if merge and changes[3]:
+ raise util.Abort(_("cannot commit merge with missing files"))
+
+ ms = mergemod.mergestate(self)
+ for f in changes[0]:
+ if f in ms and ms[f] == 'u':
+ raise util.Abort(_("unresolved merge conflicts "
+ "(see hg help resolve)"))
+
+ cctx = context.workingctx(self, text, user, date, extra, changes)
+ if editor:
+ cctx._text = editor(self, cctx, subs)
+ edited = (text != cctx._text)
+
+ # commit subs and write new state
+ if subs:
+ for s in sorted(commitsubs):
+ sub = wctx.sub(s)
+ self.ui.status(_('committing subrepository %s\n') %
+ subrepo.subrelpath(sub))
+ sr = sub.commit(cctx._text, user, date)
+ newstate[s] = (newstate[s][0], sr)
+ subrepo.writestate(self, newstate)
+
+ # Save commit message in case this transaction gets rolled back
+ # (e.g. by a pretxncommit hook). Leave the content alone on
+ # the assumption that the user will use the same editor again.
+ msgfn = self.savecommitmessage(cctx._text)
+
+ p1, p2 = self.dirstate.parents()
+ hookp1, hookp2 = hex(p1), (p2 != nullid and hex(p2) or '')
+ try:
+ self.hook("precommit", throw=True, parent1=hookp1,
+ parent2=hookp2)
+ ret = self.commitctx(cctx, True)
+ except: # re-raises
+ if edited:
+ self.ui.write(
+ _('note: commit message saved in %s\n') % msgfn)
+ raise
+
+ # update bookmarks, dirstate and mergestate
+ bookmarks.update(self, [p1, p2], ret)
+ for f in changes[0] + changes[1]:
+ self.dirstate.normal(f)
+ for f in changes[2]:
+ self.dirstate.drop(f)
+ self.dirstate.setparents(ret)
+ ms.reset()
+ finally:
+ wlock.release()
+
+ def commithook(node=hex(ret), parent1=hookp1, parent2=hookp2):
+ self.hook("commit", node=node, parent1=parent1, parent2=parent2)
+ self._afterlock(commithook)
+ return ret
+
+ def commitctx(self, ctx, error=False):
+ """Add a new revision to current repository.
+ Revision information is passed via the context argument.
+ """
+
+ tr = lock = None
+ removed = list(ctx.removed())
+ p1, p2 = ctx.p1(), ctx.p2()
+ user = ctx.user()
+
+ lock = self.lock()
+ try:
+ tr = self.transaction("commit")
+ trp = weakref.proxy(tr)
+
+ if ctx.files():
+ m1 = p1.manifest().copy()
+ m2 = p2.manifest()
+
+ # check in files
+ new = {}
+ changed = []
+ linkrev = len(self)
+ for f in sorted(ctx.modified() + ctx.added()):
+ self.ui.note(f + "\n")
+ try:
+ fctx = ctx[f]
+ new[f] = self._filecommit(fctx, m1, m2, linkrev, trp,
+ changed)
+ m1.set(f, fctx.flags())
+ except OSError, inst:
+ self.ui.warn(_("trouble committing %s!\n") % f)
+ raise
+ except IOError, inst:
+ errcode = getattr(inst, 'errno', errno.ENOENT)
+ if error or errcode and errcode != errno.ENOENT:
+ self.ui.warn(_("trouble committing %s!\n") % f)
+ raise
+ else:
+ removed.append(f)
+
+ # update manifest
+ m1.update(new)
+ removed = [f for f in sorted(removed) if f in m1 or f in m2]
+ drop = [f for f in removed if f in m1]
+ for f in drop:
+ del m1[f]
+ mn = self.manifest.add(m1, trp, linkrev, p1.manifestnode(),
+ p2.manifestnode(), (new, drop))
+ files = changed + removed
+ else:
+ mn = p1.manifestnode()
+ files = []
+
+ # update changelog
+ self.changelog.delayupdate()
+ n = self.changelog.add(mn, files, ctx.description(),
+ trp, p1.node(), p2.node(),
+ user, ctx.date(), ctx.extra().copy())
+ p = lambda: self.changelog.writepending() and self.root or ""
+ xp1, xp2 = p1.hex(), p2 and p2.hex() or ''
+ self.hook('pretxncommit', throw=True, node=hex(n), parent1=xp1,
+ parent2=xp2, pending=p)
+ self.changelog.finalize(trp)
+ # set the new commit is proper phase
+ targetphase = phases.newcommitphase(self.ui)
+ if targetphase:
+ # retract boundary do not alter parent changeset.
+ # if a parent have higher the resulting phase will
+ # be compliant anyway
+ #
+ # if minimal phase was 0 we don't need to retract anything
+ phases.retractboundary(self, targetphase, [n])
+ tr.close()
+ self.updatebranchcache()
+ return n
+ finally:
+ if tr:
+ tr.release()
+ lock.release()
+
+ def destroyed(self, newheadnodes=None):
+ '''Inform the repository that nodes have been destroyed.
+ Intended for use by strip and rollback, so there's a common
+ place for anything that has to be done after destroying history.
+
+ If you know the branchheadcache was uptodate before nodes were removed
+ and you also know the set of candidate new heads that may have resulted
+ from the destruction, you can set newheadnodes. This will enable the
+ code to update the branchheads cache, rather than having future code
+ decide it's invalid and regenrating it from scratch.
+ '''
+ # If we have info, newheadnodes, on how to update the branch cache, do
+ # it, Otherwise, since nodes were destroyed, the cache is stale and this
+ # will be caught the next time it is read.
+ if newheadnodes:
+ tiprev = len(self) - 1
+ ctxgen = (self[node] for node in newheadnodes
+ if self.changelog.hasnode(node))
+ self._updatebranchcache(self._branchcache, ctxgen)
+ self._writebranchcache(self._branchcache, self.changelog.tip(),
+ tiprev)
+
+ # Ensure the persistent tag cache is updated. Doing it now
+ # means that the tag cache only has to worry about destroyed
+ # heads immediately after a strip/rollback. That in turn
+ # guarantees that "cachetip == currenttip" (comparing both rev
+ # and node) always means no nodes have been added or destroyed.
+
+ # XXX this is suboptimal when qrefresh'ing: we strip the current
+ # head, refresh the tag cache, then immediately add a new head.
+ # But I think doing it this way is necessary for the "instant
+ # tag cache retrieval" case to work.
+ self.invalidatecaches()
+
+ # Discard all cache entries to force reloading everything.
+ self._filecache.clear()
+
+ def walk(self, match, node=None):
+ '''
+ walk recursively through the directory tree or a given
+ changeset, finding all files matched by the match
+ function
+ '''
+ return self[node].walk(match)
+
+ def status(self, node1='.', node2=None, match=None,
+ ignored=False, clean=False, unknown=False,
+ listsubrepos=False):
+ """return status of files between two nodes or node and working
+ directory.
+
+ If node1 is None, use the first dirstate parent instead.
+ If node2 is None, compare node1 with working directory.
+ """
+
+ def mfmatches(ctx):
+ mf = ctx.manifest().copy()
+ if match.always():
+ return mf
+ for fn in mf.keys():
+ if not match(fn):
+ del mf[fn]
+ return mf
+
+ if isinstance(node1, context.changectx):
+ ctx1 = node1
+ else:
+ ctx1 = self[node1]
+ if isinstance(node2, context.changectx):
+ ctx2 = node2
+ else:
+ ctx2 = self[node2]
+
+ working = ctx2.rev() is None
+ parentworking = working and ctx1 == self['.']
+ match = match or matchmod.always(self.root, self.getcwd())
+ listignored, listclean, listunknown = ignored, clean, unknown
+
+ # load earliest manifest first for caching reasons
+ if not working and ctx2.rev() < ctx1.rev():
+ ctx2.manifest()
+
+ if not parentworking:
+ def bad(f, msg):
+ # 'f' may be a directory pattern from 'match.files()',
+ # so 'f not in ctx1' is not enough
+ if f not in ctx1 and f not in ctx1.dirs():
+ self.ui.warn('%s: %s\n' % (self.dirstate.pathto(f), msg))
+ match.bad = bad
+
+ if working: # we need to scan the working dir
+ subrepos = []
+ if '.hgsub' in self.dirstate:
+ subrepos = ctx2.substate.keys()
+ s = self.dirstate.status(match, subrepos, listignored,
+ listclean, listunknown)
+ cmp, modified, added, removed, deleted, unknown, ignored, clean = s
+
+ # check for any possibly clean files
+ if parentworking and cmp:
+ fixup = []
+ # do a full compare of any files that might have changed
+ for f in sorted(cmp):
+ if (f not in ctx1 or ctx2.flags(f) != ctx1.flags(f)
+ or ctx1[f].cmp(ctx2[f])):
+ modified.append(f)
+ else:
+ fixup.append(f)
+
+ # update dirstate for files that are actually clean
+ if fixup:
+ if listclean:
+ clean += fixup
+
+ try:
+ # updating the dirstate is optional
+ # so we don't wait on the lock
+ wlock = self.wlock(False)
+ try:
+ for f in fixup:
+ self.dirstate.normal(f)
+ finally:
+ wlock.release()
+ except error.LockError:
+ pass
+
+ if not parentworking:
+ mf1 = mfmatches(ctx1)
+ if working:
+ # we are comparing working dir against non-parent
+ # generate a pseudo-manifest for the working dir
+ mf2 = mfmatches(self['.'])
+ for f in cmp + modified + added:
+ mf2[f] = None
+ mf2.set(f, ctx2.flags(f))
+ for f in removed:
+ if f in mf2:
+ del mf2[f]
+ else:
+ # we are comparing two revisions
+ deleted, unknown, ignored = [], [], []
+ mf2 = mfmatches(ctx2)
+
+ modified, added, clean = [], [], []
+ withflags = mf1.withflags() | mf2.withflags()
+ for fn in mf2:
+ if fn in mf1:
+ if (fn not in deleted and
+ ((fn in withflags and mf1.flags(fn) != mf2.flags(fn)) or
+ (mf1[fn] != mf2[fn] and
+ (mf2[fn] or ctx1[fn].cmp(ctx2[fn]))))):
+ modified.append(fn)
+ elif listclean:
+ clean.append(fn)
+ del mf1[fn]
+ elif fn not in deleted:
+ added.append(fn)
+ removed = mf1.keys()
+
+ if working and modified and not self.dirstate._checklink:
+ # Symlink placeholders may get non-symlink-like contents
+ # via user error or dereferencing by NFS or Samba servers,
+ # so we filter out any placeholders that don't look like a
+ # symlink
+ sane = []
+ for f in modified:
+ if ctx2.flags(f) == 'l':
+ d = ctx2[f].data()
+ if len(d) >= 1024 or '\n' in d or util.binary(d):
+ self.ui.debug('ignoring suspect symlink placeholder'
+ ' "%s"\n' % f)
+ continue
+ sane.append(f)
+ modified = sane
+
+ r = modified, added, removed, deleted, unknown, ignored, clean
+
+ if listsubrepos:
+ for subpath, sub in subrepo.itersubrepos(ctx1, ctx2):
+ if working:
+ rev2 = None
+ else:
+ rev2 = ctx2.substate[subpath][1]
+ try:
+ submatch = matchmod.narrowmatcher(subpath, match)
+ s = sub.status(rev2, match=submatch, ignored=listignored,
+ clean=listclean, unknown=listunknown,
+ listsubrepos=True)
+ for rfiles, sfiles in zip(r, s):
+ rfiles.extend("%s/%s" % (subpath, f) for f in sfiles)
+ except error.LookupError:
+ self.ui.status(_("skipping missing subrepository: %s\n")
+ % subpath)
+
+ for l in r:
+ l.sort()
+ return r
+
+ def heads(self, start=None):
+ heads = self.changelog.heads(start)
+ # sort the output in rev descending order
+ return sorted(heads, key=self.changelog.rev, reverse=True)
+
+ def branchheads(self, branch=None, start=None, closed=False):
+ '''return a (possibly filtered) list of heads for the given branch
+
+ Heads are returned in topological order, from newest to oldest.
+ If branch is None, use the dirstate branch.
+ If start is not None, return only heads reachable from start.
+ If closed is True, return heads that are marked as closed as well.
+ '''
+ if branch is None:
+ branch = self[None].branch()
+ branches = self.branchmap()
+ if branch not in branches:
+ return []
+ # the cache returns heads ordered lowest to highest
+ bheads = list(reversed(branches[branch]))
+ if start is not None:
+ # filter out the heads that cannot be reached from startrev
+ fbheads = set(self.changelog.nodesbetween([start], bheads)[2])
+ bheads = [h for h in bheads if h in fbheads]
+ if not closed:
+ bheads = [h for h in bheads if not self[h].closesbranch()]
+ return bheads
+
+ def branches(self, nodes):
+ if not nodes:
+ nodes = [self.changelog.tip()]
+ b = []
+ for n in nodes:
+ t = n
+ while True:
+ p = self.changelog.parents(n)
+ if p[1] != nullid or p[0] == nullid:
+ b.append((t, n, p[0], p[1]))
+ break
+ n = p[0]
+ return b
+
+ def between(self, pairs):
+ r = []
+
+ for top, bottom in pairs:
+ n, l, i = top, [], 0
+ f = 1
+
+ while n != bottom and n != nullid:
+ p = self.changelog.parents(n)[0]
+ if i == f:
+ l.append(n)
+ f = f * 2
+ n = p
+ i += 1
+
+ r.append(l)
+
+ return r
+
+ def pull(self, remote, heads=None, force=False):
+ # don't open transaction for nothing or you break future useful
+ # rollback call
+ tr = None
+ trname = 'pull\n' + util.hidepassword(remote.url())
+ lock = self.lock()
+ try:
+ tmp = discovery.findcommonincoming(self, remote, heads=heads,
+ force=force)
+ common, fetch, rheads = tmp
+ if not fetch:
+ self.ui.status(_("no changes found\n"))
+ added = []
+ result = 0
+ else:
+ tr = self.transaction(trname)
+ if heads is None and list(common) == [nullid]:
+ self.ui.status(_("requesting all changes\n"))
+ elif heads is None and remote.capable('changegroupsubset'):
+ # issue1320, avoid a race if remote changed after discovery
+ heads = rheads
+
+ if remote.capable('getbundle'):
+ cg = remote.getbundle('pull', common=common,
+ heads=heads or rheads)
+ elif heads is None:
+ cg = remote.changegroup(fetch, 'pull')
+ elif not remote.capable('changegroupsubset'):
+ raise util.Abort(_("partial pull cannot be done because "
+ "other repository doesn't support "
+ "changegroupsubset."))
+ else:
+ cg = remote.changegroupsubset(fetch, heads, 'pull')
+ clstart = len(self.changelog)
+ result = self.addchangegroup(cg, 'pull', remote.url())
+ clend = len(self.changelog)
+ added = [self.changelog.node(r) for r in xrange(clstart, clend)]
+
+ # compute target subset
+ if heads is None:
+ # We pulled every thing possible
+ # sync on everything common
+ subset = common + added
+ else:
+ # We pulled a specific subset
+ # sync on this subset
+ subset = heads
+
+ # Get remote phases data from remote
+ remotephases = remote.listkeys('phases')
+ publishing = bool(remotephases.get('publishing', False))
+ if remotephases and not publishing:
+ # remote is new and unpublishing
+ pheads, _dr = phases.analyzeremotephases(self, subset,
+ remotephases)
+ phases.advanceboundary(self, phases.public, pheads)
+ phases.advanceboundary(self, phases.draft, subset)
+ else:
+ # Remote is old or publishing all common changesets
+ # should be seen as public
+ phases.advanceboundary(self, phases.public, subset)
+
+ if obsolete._enabled:
+ self.ui.debug('fetching remote obsolete markers')
+ remoteobs = remote.listkeys('obsolete')
+ if 'dump0' in remoteobs:
+ if tr is None:
+ tr = self.transaction(trname)
+ for key in sorted(remoteobs, reverse=True):
+ if key.startswith('dump'):
+ data = base85.b85decode(remoteobs[key])
+ self.obsstore.mergemarkers(tr, data)
+ if tr is not None:
+ tr.close()
+ finally:
+ if tr is not None:
+ tr.release()
+ lock.release()
+
+ return result
+
+ def checkpush(self, force, revs):
+ """Extensions can override this function if additional checks have
+ to be performed before pushing, or call it if they override push
+ command.
+ """
+ pass
+
+ def push(self, remote, force=False, revs=None, newbranch=False):
+ '''Push outgoing changesets (limited by revs) from the current
+ repository to remote. Return an integer:
+ - None means nothing to push
+ - 0 means HTTP error
+ - 1 means we pushed and remote head count is unchanged *or*
+ we have outgoing changesets but refused to push
+ - other values as described by addchangegroup()
+ '''
+ # there are two ways to push to remote repo:
+ #
+ # addchangegroup assumes local user can lock remote
+ # repo (local filesystem, old ssh servers).
+ #
+ # unbundle assumes local user cannot lock remote repo (new ssh
+ # servers, http servers).
+
+ if not remote.canpush():
+ raise util.Abort(_("destination does not support push"))
+ # get local lock as we might write phase data
+ locallock = self.lock()
+ try:
+ self.checkpush(force, revs)
+ lock = None
+ unbundle = remote.capable('unbundle')
+ if not unbundle:
+ lock = remote.lock()
+ try:
+ # discovery
+ fci = discovery.findcommonincoming
+ commoninc = fci(self, remote, force=force)
+ common, inc, remoteheads = commoninc
+ fco = discovery.findcommonoutgoing
+ outgoing = fco(self, remote, onlyheads=revs,
+ commoninc=commoninc, force=force)
+
+
+ if not outgoing.missing:
+ # nothing to push
+ scmutil.nochangesfound(self.ui, self, outgoing.excluded)
+ ret = None
+ else:
+ # something to push
+ if not force:
+ # if self.obsstore == False --> no obsolete
+ # then, save the iteration
+ if self.obsstore:
+ # this message are here for 80 char limit reason
+ mso = _("push includes an obsolete changeset: %s!")
+ msu = _("push includes an unstable changeset: %s!")
+ # If we are to push if there is at least one
+ # obsolete or unstable changeset in missing, at
+ # least one of the missinghead will be obsolete or
+ # unstable. So checking heads only is ok
+ for node in outgoing.missingheads:
+ ctx = self[node]
+ if ctx.obsolete():
+ raise util.Abort(_(mso) % ctx)
+ elif ctx.unstable():
+ raise util.Abort(_(msu) % ctx)
+ discovery.checkheads(self, remote, outgoing,
+ remoteheads, newbranch,
+ bool(inc))
+
+ # create a changegroup from local
+ if revs is None and not outgoing.excluded:
+ # push everything,
+ # use the fast path, no race possible on push
+ cg = self._changegroup(outgoing.missing, 'push')
+ else:
+ cg = self.getlocalbundle('push', outgoing)
+
+ # apply changegroup to remote
+ if unbundle:
+ # local repo finds heads on server, finds out what
+ # revs it must push. once revs transferred, if server
+ # finds it has different heads (someone else won
+ # commit/push race), server aborts.
+ if force:
+ remoteheads = ['force']
+ # ssh: return remote's addchangegroup()
+ # http: return remote's addchangegroup() or 0 for error
+ ret = remote.unbundle(cg, remoteheads, 'push')
+ else:
+ # we return an integer indicating remote head count
+ # change
+ ret = remote.addchangegroup(cg, 'push', self.url())
+
+ if ret:
+ # push succeed, synchonize target of the push
+ cheads = outgoing.missingheads
+ elif revs is None:
+ # All out push fails. synchronize all common
+ cheads = outgoing.commonheads
+ else:
+ # I want cheads = heads(::missingheads and ::commonheads)
+ # (missingheads is revs with secret changeset filtered out)
+ #
+ # This can be expressed as:
+ # cheads = ( (missingheads and ::commonheads)
+ # + (commonheads and ::missingheads))"
+ # )
+ #
+ # while trying to push we already computed the following:
+ # common = (::commonheads)
+ # missing = ((commonheads::missingheads) - commonheads)
+ #
+ # We can pick:
+ # * missingheads part of comon (::commonheads)
+ common = set(outgoing.common)
+ cheads = [node for node in revs if node in common]
+ # and
+ # * commonheads parents on missing
+ revset = self.set('%ln and parents(roots(%ln))',
+ outgoing.commonheads,
+ outgoing.missing)
+ cheads.extend(c.node() for c in revset)
+ # even when we don't push, exchanging phase data is useful
+ remotephases = remote.listkeys('phases')
+ if not remotephases: # old server or public only repo
+ phases.advanceboundary(self, phases.public, cheads)
+ # don't push any phase data as there is nothing to push
+ else:
+ ana = phases.analyzeremotephases(self, cheads, remotephases)
+ pheads, droots = ana
+ ### Apply remote phase on local
+ if remotephases.get('publishing', False):
+ phases.advanceboundary(self, phases.public, cheads)
+ else: # publish = False
+ phases.advanceboundary(self, phases.public, pheads)
+ phases.advanceboundary(self, phases.draft, cheads)
+ ### Apply local phase on remote
+
+ # Get the list of all revs draft on remote by public here.
+ # XXX Beware that revset break if droots is not strictly
+ # XXX root we may want to ensure it is but it is costly
+ outdated = self.set('heads((%ln::%ln) and public())',
+ droots, cheads)
+ for newremotehead in outdated:
+ r = remote.pushkey('phases',
+ newremotehead.hex(),
+ str(phases.draft),
+ str(phases.public))
+ if not r:
+ self.ui.warn(_('updating %s to public failed!\n')
+ % newremotehead)
+ self.ui.debug('try to push obsolete markers to remote\n')
+ if (obsolete._enabled and self.obsstore and
+ 'obsolete' in remote.listkeys('namespaces')):
+ rslts = []
+ remotedata = self.listkeys('obsolete')
+ for key in sorted(remotedata, reverse=True):
+ # reverse sort to ensure we end with dump0
+ data = remotedata[key]
+ rslts.append(remote.pushkey('obsolete', key, '', data))
+ if [r for r in rslts if not r]:
+ msg = _('failed to push some obsolete markers!\n')
+ self.ui.warn(msg)
+ finally:
+ if lock is not None:
+ lock.release()
+ finally:
+ locallock.release()
+
+ self.ui.debug("checking for updated bookmarks\n")
+ rb = remote.listkeys('bookmarks')
+ for k in rb.keys():
+ if k in self._bookmarks:
+ nr, nl = rb[k], hex(self._bookmarks[k])
+ if nr in self:
+ cr = self[nr]
+ cl = self[nl]
+ if cl in cr.descendants():
+ r = remote.pushkey('bookmarks', k, nr, nl)
+ if r:
+ self.ui.status(_("updating bookmark %s\n") % k)
+ else:
+ self.ui.warn(_('updating bookmark %s'
+ ' failed!\n') % k)
+
+ return ret
+
+ def changegroupinfo(self, nodes, source):
+ if self.ui.verbose or source == 'bundle':
+ self.ui.status(_("%d changesets found\n") % len(nodes))
+ if self.ui.debugflag:
+ self.ui.debug("list of changesets:\n")
+ for node in nodes:
+ self.ui.debug("%s\n" % hex(node))
+
+ def changegroupsubset(self, bases, heads, source):
+ """Compute a changegroup consisting of all the nodes that are
+ descendants of any of the bases and ancestors of any of the heads.
+ Return a chunkbuffer object whose read() method will return
+ successive changegroup chunks.
+
+ It is fairly complex as determining which filenodes and which
+ manifest nodes need to be included for the changeset to be complete
+ is non-trivial.
+
+ Another wrinkle is doing the reverse, figuring out which changeset in
+ the changegroup a particular filenode or manifestnode belongs to.
+ """
+ cl = self.changelog
+ if not bases:
+ bases = [nullid]
+ csets, bases, heads = cl.nodesbetween(bases, heads)
+ # We assume that all ancestors of bases are known
+ common = set(cl.ancestors([cl.rev(n) for n in bases]))
+ return self._changegroupsubset(common, csets, heads, source)
+
+ def getlocalbundle(self, source, outgoing):
+ """Like getbundle, but taking a discovery.outgoing as an argument.
+
+ This is only implemented for local repos and reuses potentially
+ precomputed sets in outgoing."""
+ if not outgoing.missing:
+ return None
+ return self._changegroupsubset(outgoing.common,
+ outgoing.missing,
+ outgoing.missingheads,
+ source)
+
+ def getbundle(self, source, heads=None, common=None):
+ """Like changegroupsubset, but returns the set difference between the
+ ancestors of heads and the ancestors common.
+
+ If heads is None, use the local heads. If common is None, use [nullid].
+
+ The nodes in common might not all be known locally due to the way the
+ current discovery protocol works.
+ """
+ cl = self.changelog
+ if common:
+ nm = cl.nodemap
+ common = [n for n in common if n in nm]
+ else:
+ common = [nullid]
+ if not heads:
+ heads = cl.heads()
+ return self.getlocalbundle(source,
+ discovery.outgoing(cl, common, heads))
+
+ def _changegroupsubset(self, commonrevs, csets, heads, source):
+
+ cl = self.changelog
+ mf = self.manifest
+ mfs = {} # needed manifests
+ fnodes = {} # needed file nodes
+ changedfiles = set()
+ fstate = ['', {}]
+ count = [0, 0]
+
+ # can we go through the fast path ?
+ heads.sort()
+ if heads == sorted(self.heads()):
+ return self._changegroup(csets, source)
+
+ # slow path
+ self.hook('preoutgoing', throw=True, source=source)
+ self.changegroupinfo(csets, source)
+
+ # filter any nodes that claim to be part of the known set
+ def prune(revlog, missing):
+ rr, rl = revlog.rev, revlog.linkrev
+ return [n for n in missing
+ if rl(rr(n)) not in commonrevs]
+
+ progress = self.ui.progress
+ _bundling = _('bundling')
+ _changesets = _('changesets')
+ _manifests = _('manifests')
+ _files = _('files')
+
+ def lookup(revlog, x):
+ if revlog == cl:
+ c = cl.read(x)
+ changedfiles.update(c[3])
+ mfs.setdefault(c[0], x)
+ count[0] += 1
+ progress(_bundling, count[0],
+ unit=_changesets, total=count[1])
+ return x
+ elif revlog == mf:
+ clnode = mfs[x]
+ mdata = mf.readfast(x)
+ for f, n in mdata.iteritems():
+ if f in changedfiles:
+ fnodes[f].setdefault(n, clnode)
+ count[0] += 1
+ progress(_bundling, count[0],
+ unit=_manifests, total=count[1])
+ return clnode
+ else:
+ progress(_bundling, count[0], item=fstate[0],
+ unit=_files, total=count[1])
+ return fstate[1][x]
+
+ bundler = changegroup.bundle10(lookup)
+ reorder = self.ui.config('bundle', 'reorder', 'auto')
+ if reorder == 'auto':
+ reorder = None
+ else:
+ reorder = util.parsebool(reorder)
+
+ def gengroup():
+ # Create a changenode group generator that will call our functions
+ # back to lookup the owning changenode and collect information.
+ count[:] = [0, len(csets)]
+ for chunk in cl.group(csets, bundler, reorder=reorder):
+ yield chunk
+ progress(_bundling, None)
+
+ # Create a generator for the manifestnodes that calls our lookup
+ # and data collection functions back.
+ for f in changedfiles:
+ fnodes[f] = {}
+ count[:] = [0, len(mfs)]
+ for chunk in mf.group(prune(mf, mfs), bundler, reorder=reorder):
+ yield chunk
+ progress(_bundling, None)
+
+ mfs.clear()
+
+ # Go through all our files in order sorted by name.
+ count[:] = [0, len(changedfiles)]
+ for fname in sorted(changedfiles):
+ filerevlog = self.file(fname)
+ if not len(filerevlog):
+ raise util.Abort(_("empty or missing revlog for %s")
+ % fname)
+ fstate[0] = fname
+ fstate[1] = fnodes.pop(fname, {})
+
+ nodelist = prune(filerevlog, fstate[1])
+ if nodelist:
+ count[0] += 1
+ yield bundler.fileheader(fname)
+ for chunk in filerevlog.group(nodelist, bundler, reorder):
+ yield chunk
+
+ # Signal that no more groups are left.
+ yield bundler.close()
+ progress(_bundling, None)
+
+ if csets:
+ self.hook('outgoing', node=hex(csets[0]), source=source)
+
+ return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN')
+
+ def changegroup(self, basenodes, source):
+ # to avoid a race we use changegroupsubset() (issue1320)
+ return self.changegroupsubset(basenodes, self.heads(), source)
+
+ def _changegroup(self, nodes, source):
+ """Compute the changegroup of all nodes that we have that a recipient
+ doesn't. Return a chunkbuffer object whose read() method will return
+ successive changegroup chunks.
+
+ This is much easier than the previous function as we can assume that
+ the recipient has any changenode we aren't sending them.
+
+ nodes is the set of nodes to send"""
+
+ cl = self.changelog
+ mf = self.manifest
+ mfs = {}
+ changedfiles = set()
+ fstate = ['']
+ count = [0, 0]
+
+ self.hook('preoutgoing', throw=True, source=source)
+ self.changegroupinfo(nodes, source)
+
+ revset = set([cl.rev(n) for n in nodes])
+
+ def gennodelst(log):
+ ln, llr = log.node, log.linkrev
+ return [ln(r) for r in log if llr(r) in revset]
+
+ progress = self.ui.progress
+ _bundling = _('bundling')
+ _changesets = _('changesets')
+ _manifests = _('manifests')
+ _files = _('files')
+
+ def lookup(revlog, x):
+ if revlog == cl:
+ c = cl.read(x)
+ changedfiles.update(c[3])
+ mfs.setdefault(c[0], x)
+ count[0] += 1
+ progress(_bundling, count[0],
+ unit=_changesets, total=count[1])
+ return x
+ elif revlog == mf:
+ count[0] += 1
+ progress(_bundling, count[0],
+ unit=_manifests, total=count[1])
+ return cl.node(revlog.linkrev(revlog.rev(x)))
+ else:
+ progress(_bundling, count[0], item=fstate[0],
+ total=count[1], unit=_files)
+ return cl.node(revlog.linkrev(revlog.rev(x)))
+
+ bundler = changegroup.bundle10(lookup)
+ reorder = self.ui.config('bundle', 'reorder', 'auto')
+ if reorder == 'auto':
+ reorder = None
+ else:
+ reorder = util.parsebool(reorder)
+
+ def gengroup():
+ '''yield a sequence of changegroup chunks (strings)'''
+ # construct a list of all changed files
+
+ count[:] = [0, len(nodes)]
+ for chunk in cl.group(nodes, bundler, reorder=reorder):
+ yield chunk
+ progress(_bundling, None)
+
+ count[:] = [0, len(mfs)]
+ for chunk in mf.group(gennodelst(mf), bundler, reorder=reorder):
+ yield chunk
+ progress(_bundling, None)
+
+ count[:] = [0, len(changedfiles)]
+ for fname in sorted(changedfiles):
+ filerevlog = self.file(fname)
+ if not len(filerevlog):
+ raise util.Abort(_("empty or missing revlog for %s")
+ % fname)
+ fstate[0] = fname
+ nodelist = gennodelst(filerevlog)
+ if nodelist:
+ count[0] += 1
+ yield bundler.fileheader(fname)
+ for chunk in filerevlog.group(nodelist, bundler, reorder):
+ yield chunk
+ yield bundler.close()
+ progress(_bundling, None)
+
+ if nodes:
+ self.hook('outgoing', node=hex(nodes[0]), source=source)
+
+ return changegroup.unbundle10(util.chunkbuffer(gengroup()), 'UN')
+
+ def addchangegroup(self, source, srctype, url, emptyok=False):
+ """Add the changegroup returned by source.read() to this repo.
+ srctype is a string like 'push', 'pull', or 'unbundle'. url is
+ the URL of the repo where this changegroup is coming from.
+
+ Return an integer summarizing the change to this repo:
+ - nothing changed or no source: 0
+ - more heads than before: 1+added heads (2..n)
+ - fewer heads than before: -1-removed heads (-2..-n)
+ - number of heads stays the same: 1
+ """
+ def csmap(x):
+ self.ui.debug("add changeset %s\n" % short(x))
+ return len(cl)
+
+ def revmap(x):
+ return cl.rev(x)
+
+ if not source:
+ return 0
+
+ self.hook('prechangegroup', throw=True, source=srctype, url=url)
+
+ changesets = files = revisions = 0
+ efiles = set()
+
+ # write changelog data to temp files so concurrent readers will not see
+ # inconsistent view
+ cl = self.changelog
+ cl.delayupdate()
+ oldheads = cl.heads()
+
+ tr = self.transaction("\n".join([srctype, util.hidepassword(url)]))
+ try:
+ trp = weakref.proxy(tr)
+ # pull off the changeset group
+ self.ui.status(_("adding changesets\n"))
+ clstart = len(cl)
+ class prog(object):
+ step = _('changesets')
+ count = 1
+ ui = self.ui
+ total = None
+ def __call__(self):
+ self.ui.progress(self.step, self.count, unit=_('chunks'),
+ total=self.total)
+ self.count += 1
+ pr = prog()
+ source.callback = pr
+
+ source.changelogheader()
+ srccontent = cl.addgroup(source, csmap, trp)
+ if not (srccontent or emptyok):
+ raise util.Abort(_("received changelog group is empty"))
+ clend = len(cl)
+ changesets = clend - clstart
+ for c in xrange(clstart, clend):
+ efiles.update(self[c].files())
+ efiles = len(efiles)
+ self.ui.progress(_('changesets'), None)
+
+ # pull off the manifest group
+ self.ui.status(_("adding manifests\n"))
+ pr.step = _('manifests')
+ pr.count = 1
+ pr.total = changesets # manifests <= changesets
+ # no need to check for empty manifest group here:
+ # if the result of the merge of 1 and 2 is the same in 3 and 4,
+ # no new manifest will be created and the manifest group will
+ # be empty during the pull
+ source.manifestheader()
+ self.manifest.addgroup(source, revmap, trp)
+ self.ui.progress(_('manifests'), None)
+
+ needfiles = {}
+ if self.ui.configbool('server', 'validate', default=False):
+ # validate incoming csets have their manifests
+ for cset in xrange(clstart, clend):
+ mfest = self.changelog.read(self.changelog.node(cset))[0]
+ mfest = self.manifest.readdelta(mfest)
+ # store file nodes we must see
+ for f, n in mfest.iteritems():
+ needfiles.setdefault(f, set()).add(n)
+
+ # process the files
+ self.ui.status(_("adding file changes\n"))
+ pr.step = _('files')
+ pr.count = 1
+ pr.total = efiles
+ source.callback = None
+
+ while True:
+ chunkdata = source.filelogheader()
+ if not chunkdata:
+ break
+ f = chunkdata["filename"]
+ self.ui.debug("adding %s revisions\n" % f)
+ pr()
+ fl = self.file(f)
+ o = len(fl)
+ if not fl.addgroup(source, revmap, trp):
+ raise util.Abort(_("received file revlog group is empty"))
+ revisions += len(fl) - o
+ files += 1
+ if f in needfiles:
+ needs = needfiles[f]
+ for new in xrange(o, len(fl)):
+ n = fl.node(new)
+ if n in needs:
+ needs.remove(n)
+ if not needs:
+ del needfiles[f]
+ self.ui.progress(_('files'), None)
+
+ for f, needs in needfiles.iteritems():
+ fl = self.file(f)
+ for n in needs:
+ try:
+ fl.rev(n)
+ except error.LookupError:
+ raise util.Abort(
+ _('missing file data for %s:%s - run hg verify') %
+ (f, hex(n)))
+
+ dh = 0
+ if oldheads:
+ heads = cl.heads()
+ dh = len(heads) - len(oldheads)
+ for h in heads:
+ if h not in oldheads and self[h].closesbranch():
+ dh -= 1
+ htext = ""
+ if dh:
+ htext = _(" (%+d heads)") % dh
+
+ self.ui.status(_("added %d changesets"
+ " with %d changes to %d files%s\n")
+ % (changesets, revisions, files, htext))
+
+ if changesets > 0:
+ p = lambda: cl.writepending() and self.root or ""
+ self.hook('pretxnchangegroup', throw=True,
+ node=hex(cl.node(clstart)), source=srctype,
+ url=url, pending=p)
+
+ added = [cl.node(r) for r in xrange(clstart, clend)]
+ publishing = self.ui.configbool('phases', 'publish', True)
+ if srctype == 'push':
+ # Old server can not push the boundary themself.
+ # New server won't push the boundary if changeset already
+ # existed locally as secrete
+ #
+ # We should not use added here but the list of all change in
+ # the bundle
+ if publishing:
+ phases.advanceboundary(self, phases.public, srccontent)
+ else:
+ phases.advanceboundary(self, phases.draft, srccontent)
+ phases.retractboundary(self, phases.draft, added)
+ elif srctype != 'strip':
+ # publishing only alter behavior during push
+ #
+ # strip should not touch boundary at all
+ phases.retractboundary(self, phases.draft, added)
+
+ # make changelog see real files again
+ cl.finalize(trp)
+
+ tr.close()
+
+ if changesets > 0:
+ def runhooks():
+ # forcefully update the on-disk branch cache
+ self.ui.debug("updating the branch cache\n")
+ self.updatebranchcache()
+ self.hook("changegroup", node=hex(cl.node(clstart)),
+ source=srctype, url=url)
+
+ for n in added:
+ self.hook("incoming", node=hex(n), source=srctype,
+ url=url)
+ self._afterlock(runhooks)
+
+ finally:
+ tr.release()
+ # never return 0 here:
+ if dh < 0:
+ return dh - 1
+ else:
+ return dh + 1
+
+ def stream_in(self, remote, requirements):
+ lock = self.lock()
+ try:
+ fp = remote.stream_out()
+ l = fp.readline()
+ try:
+ resp = int(l)
+ except ValueError:
+ raise error.ResponseError(
+ _('unexpected response from remote server:'), l)
+ if resp == 1:
+ raise util.Abort(_('operation forbidden by server'))
+ elif resp == 2:
+ raise util.Abort(_('locking the remote repository failed'))
+ elif resp != 0:
+ raise util.Abort(_('the server sent an unknown error code'))
+ self.ui.status(_('streaming all changes\n'))
+ l = fp.readline()
+ try:
+ total_files, total_bytes = map(int, l.split(' ', 1))
+ except (ValueError, TypeError):
+ raise error.ResponseError(
+ _('unexpected response from remote server:'), l)
+ self.ui.status(_('%d files to transfer, %s of data\n') %
+ (total_files, util.bytecount(total_bytes)))
+ handled_bytes = 0
+ self.ui.progress(_('clone'), 0, total=total_bytes)
+ start = time.time()
+ for i in xrange(total_files):
+ # XXX doesn't support '\n' or '\r' in filenames
+ l = fp.readline()
+ try:
+ name, size = l.split('\0', 1)
+ size = int(size)
+ except (ValueError, TypeError):
+ raise error.ResponseError(
+ _('unexpected response from remote server:'), l)
+ if self.ui.debugflag:
+ self.ui.debug('adding %s (%s)\n' %
+ (name, util.bytecount(size)))
+ # for backwards compat, name was partially encoded
+ ofp = self.sopener(store.decodedir(name), 'w')
+ for chunk in util.filechunkiter(fp, limit=size):
+ handled_bytes += len(chunk)
+ self.ui.progress(_('clone'), handled_bytes,
+ total=total_bytes)
+ ofp.write(chunk)
+ ofp.close()
+ elapsed = time.time() - start
+ if elapsed <= 0:
+ elapsed = 0.001
+ self.ui.progress(_('clone'), None)
+ self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') %
+ (util.bytecount(total_bytes), elapsed,
+ util.bytecount(total_bytes / elapsed)))
+
+ # new requirements = old non-format requirements +
+ # new format-related
+ # requirements from the streamed-in repository
+ requirements.update(set(self.requirements) - self.supportedformats)
+ self._applyrequirements(requirements)
+ self._writerequirements()
+
+ self.invalidate()
+ return len(self.heads()) + 1
+ finally:
+ lock.release()
+
+ def clone(self, remote, heads=[], stream=False):
+ '''clone remote repository.
+
+ keyword arguments:
+ heads: list of revs to clone (forces use of pull)
+ stream: use streaming clone if possible'''
+
+ # now, all clients that can request uncompressed clones can
+ # read repo formats supported by all servers that can serve
+ # them.
+
+ # if revlog format changes, client will have to check version
+ # and format flags on "stream" capability, and use
+ # uncompressed only if compatible.
+
+ if not stream:
+ # if the server explicitely prefer to stream (for fast LANs)
+ stream = remote.capable('stream-preferred')
+
+ if stream and not heads:
+ # 'stream' means remote revlog format is revlogv1 only
+ if remote.capable('stream'):
+ return self.stream_in(remote, set(('revlogv1',)))
+ # otherwise, 'streamreqs' contains the remote revlog format
+ streamreqs = remote.capable('streamreqs')
+ if streamreqs:
+ streamreqs = set(streamreqs.split(','))
+ # if we support it, stream in and adjust our requirements
+ if not streamreqs - self.supportedformats:
+ return self.stream_in(remote, streamreqs)
+ return self.pull(remote, heads)
+
+ def pushkey(self, namespace, key, old, new):
+ self.hook('prepushkey', throw=True, namespace=namespace, key=key,
+ old=old, new=new)
+ self.ui.debug('pushing key for "%s:%s"\n' % (namespace, key))
+ ret = pushkey.push(self, namespace, key, old, new)
+ self.hook('pushkey', namespace=namespace, key=key, old=old, new=new,
+ ret=ret)
+ return ret
+
+ def listkeys(self, namespace):
+ self.hook('prelistkeys', throw=True, namespace=namespace)
+ self.ui.debug('listing keys for "%s"\n' % namespace)
+ values = pushkey.list(self, namespace)
+ self.hook('listkeys', namespace=namespace, values=values)
+ return values
+
+ def debugwireargs(self, one, two, three=None, four=None, five=None):
+ '''used to test argument passing over the wire'''
+ return "%s %s %s %s %s" % (one, two, three, four, five)
+
+ def savecommitmessage(self, text):
+ fp = self.opener('last-message.txt', 'wb')
+ try:
+ fp.write(text)
+ finally:
+ fp.close()
+ return self.pathto(fp.name[len(self.root)+1:])
+
+# used to avoid circular references so destructors work
+def aftertrans(files):
+ renamefiles = [tuple(t) for t in files]
+ def a():
+ for src, dest in renamefiles:
+ try:
+ util.rename(src, dest)
+ except OSError: # journal file does not yet exist
+ pass
+ return a
+
+def undoname(fn):
+ base, name = os.path.split(fn)
+ assert name.startswith('journal')
+ return os.path.join(base, name.replace('journal', 'undo', 1))
+
+def instance(ui, path, create):
+ return localrepository(ui, util.urllocalpath(path), create)
+
+def islocal(path):
+ return True
diff --git a/mercurial/lock.py b/mercurial/lock.py
new file mode 100644
index 0000000..cc2c533
--- /dev/null
+++ b/mercurial/lock.py
@@ -0,0 +1,143 @@
+# lock.py - simple advisory locking scheme for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import util, error
+import errno, os, socket, time
+import warnings
+
+class lock(object):
+ '''An advisory lock held by one process to control access to a set
+ of files. Non-cooperating processes or incorrectly written scripts
+ can ignore Mercurial's locking scheme and stomp all over the
+ repository, so don't do that.
+
+ Typically used via localrepository.lock() to lock the repository
+ store (.hg/store/) or localrepository.wlock() to lock everything
+ else under .hg/.'''
+
+ # lock is symlink on platforms that support it, file on others.
+
+ # symlink is used because create of directory entry and contents
+ # are atomic even over nfs.
+
+ # old-style lock: symlink to pid
+ # new-style lock: symlink to hostname:pid
+
+ _host = None
+
+ def __init__(self, file, timeout=-1, releasefn=None, desc=None):
+ self.f = file
+ self.held = 0
+ self.timeout = timeout
+ self.releasefn = releasefn
+ self.desc = desc
+ self.postrelease = []
+ self.lock()
+
+ def __del__(self):
+ if self.held:
+ warnings.warn("use lock.release instead of del lock",
+ category=DeprecationWarning,
+ stacklevel=2)
+
+ # ensure the lock will be removed
+ # even if recursive locking did occur
+ self.held = 1
+
+ self.release()
+
+ def lock(self):
+ timeout = self.timeout
+ while True:
+ try:
+ self.trylock()
+ return 1
+ except error.LockHeld, inst:
+ if timeout != 0:
+ time.sleep(1)
+ if timeout > 0:
+ timeout -= 1
+ continue
+ raise error.LockHeld(errno.ETIMEDOUT, inst.filename, self.desc,
+ inst.locker)
+
+ def trylock(self):
+ if self.held:
+ self.held += 1
+ return
+ if lock._host is None:
+ lock._host = socket.gethostname()
+ lockname = '%s:%s' % (lock._host, os.getpid())
+ while not self.held:
+ try:
+ util.makelock(lockname, self.f)
+ self.held = 1
+ except (OSError, IOError), why:
+ if why.errno == errno.EEXIST:
+ locker = self.testlock()
+ if locker is not None:
+ raise error.LockHeld(errno.EAGAIN, self.f, self.desc,
+ locker)
+ else:
+ raise error.LockUnavailable(why.errno, why.strerror,
+ why.filename, self.desc)
+
+ def testlock(self):
+ """return id of locker if lock is valid, else None.
+
+ If old-style lock, we cannot tell what machine locker is on.
+ with new-style lock, if locker is on this machine, we can
+ see if locker is alive. If locker is on this machine but
+ not alive, we can safely break lock.
+
+ The lock file is only deleted when None is returned.
+
+ """
+ locker = util.readlock(self.f)
+ try:
+ host, pid = locker.split(":", 1)
+ except ValueError:
+ return locker
+ if host != lock._host:
+ return locker
+ try:
+ pid = int(pid)
+ except ValueError:
+ return locker
+ if util.testpid(pid):
+ return locker
+ # if locker dead, break lock. must do this with another lock
+ # held, or can race and break valid lock.
+ try:
+ l = lock(self.f + '.break', timeout=0)
+ util.unlink(self.f)
+ l.release()
+ except error.LockError:
+ return locker
+
+ def release(self):
+ """release the lock and execute callback function if any
+
+ If the lock have been aquired multiple time, the actual release is
+ delayed to the last relase call."""
+ if self.held > 1:
+ self.held -= 1
+ elif self.held == 1:
+ self.held = 0
+ if self.releasefn:
+ self.releasefn()
+ try:
+ util.unlink(self.f)
+ except OSError:
+ pass
+ for callback in self.postrelease:
+ callback()
+
+def release(*locks):
+ for lock in locks:
+ if lock is not None:
+ lock.release()
diff --git a/mercurial/lsprof.py b/mercurial/lsprof.py
new file mode 100644
index 0000000..4970f06
--- /dev/null
+++ b/mercurial/lsprof.py
@@ -0,0 +1,109 @@
+import sys
+from _lsprof import Profiler, profiler_entry
+
+__all__ = ['profile', 'Stats']
+
+def profile(f, *args, **kwds):
+ """XXX docstring"""
+ p = Profiler()
+ p.enable(subcalls=True, builtins=True)
+ try:
+ f(*args, **kwds)
+ finally:
+ p.disable()
+ return Stats(p.getstats())
+
+
+class Stats(object):
+ """XXX docstring"""
+
+ def __init__(self, data):
+ self.data = data
+
+ def sort(self, crit="inlinetime"):
+ """XXX docstring"""
+ if crit not in profiler_entry.__dict__:
+ raise ValueError("Can't sort by %s" % crit)
+ self.data.sort(key=lambda x: getattr(x, crit), reverse=True)
+ for e in self.data:
+ if e.calls:
+ e.calls.sort(key=lambda x: getattr(x, crit), reverse=True)
+
+ def pprint(self, top=None, file=None, limit=None, climit=None):
+ """XXX docstring"""
+ if file is None:
+ file = sys.stdout
+ d = self.data
+ if top is not None:
+ d = d[:top]
+ cols = "% 12s %12s %11.4f %11.4f %s\n"
+ hcols = "% 12s %12s %12s %12s %s\n"
+ file.write(hcols % ("CallCount", "Recursive", "Total(s)",
+ "Inline(s)", "module:lineno(function)"))
+ count = 0
+ for e in d:
+ file.write(cols % (e.callcount, e.reccallcount, e.totaltime,
+ e.inlinetime, label(e.code)))
+ count += 1
+ if limit is not None and count == limit:
+ return
+ ccount = 0
+ if climit and e.calls:
+ for se in e.calls:
+ file.write(cols % ("+%s" % se.callcount, se.reccallcount,
+ se.totaltime, se.inlinetime,
+ "+%s" % label(se.code)))
+ count += 1
+ ccount += 1
+ if limit is not None and count == limit:
+ return
+ if climit is not None and ccount == climit:
+ break
+
+ def freeze(self):
+ """Replace all references to code objects with string
+ descriptions; this makes it possible to pickle the instance."""
+
+ # this code is probably rather ickier than it needs to be!
+ for i in range(len(self.data)):
+ e = self.data[i]
+ if not isinstance(e.code, str):
+ self.data[i] = type(e)((label(e.code),) + e[1:])
+ if e.calls:
+ for j in range(len(e.calls)):
+ se = e.calls[j]
+ if not isinstance(se.code, str):
+ e.calls[j] = type(se)((label(se.code),) + se[1:])
+
+_fn2mod = {}
+
+def label(code):
+ if isinstance(code, str):
+ return code
+ try:
+ mname = _fn2mod[code.co_filename]
+ except KeyError:
+ for k, v in list(sys.modules.iteritems()):
+ if v is None:
+ continue
+ if not isinstance(getattr(v, '__file__', None), str):
+ continue
+ if v.__file__.startswith(code.co_filename):
+ mname = _fn2mod[code.co_filename] = k
+ break
+ else:
+ mname = _fn2mod[code.co_filename] = '<%s>' % code.co_filename
+
+ return '%s:%d(%s)' % (mname, code.co_firstlineno, code.co_name)
+
+
+if __name__ == '__main__':
+ import os
+ sys.argv = sys.argv[1:]
+ if not sys.argv:
+ print >> sys.stderr, "usage: lsprof.py <script> <arguments...>"
+ sys.exit(2)
+ sys.path.insert(0, os.path.abspath(os.path.dirname(sys.argv[0])))
+ stats = profile(execfile, sys.argv[0], globals(), locals())
+ stats.sort()
+ stats.pprint()
diff --git a/mercurial/lsprofcalltree.py b/mercurial/lsprofcalltree.py
new file mode 100644
index 0000000..358b951
--- /dev/null
+++ b/mercurial/lsprofcalltree.py
@@ -0,0 +1,86 @@
+"""
+lsprofcalltree.py - lsprof output which is readable by kcachegrind
+
+Authors:
+ * David Allouche <david <at> allouche.net>
+ * Jp Calderone & Itamar Shtull-Trauring
+ * Johan Dahlin
+
+This software may be used and distributed according to the terms
+of the GNU General Public License, incorporated herein by reference.
+"""
+
+def label(code):
+ if isinstance(code, str):
+ return '~' + code # built-in functions ('~' sorts at the end)
+ else:
+ return '%s %s:%d' % (code.co_name,
+ code.co_filename,
+ code.co_firstlineno)
+
+class KCacheGrind(object):
+ def __init__(self, profiler):
+ self.data = profiler.getstats()
+ self.out_file = None
+
+ def output(self, out_file):
+ self.out_file = out_file
+ print >> out_file, 'events: Ticks'
+ self._print_summary()
+ for entry in self.data:
+ self._entry(entry)
+
+ def _print_summary(self):
+ max_cost = 0
+ for entry in self.data:
+ totaltime = int(entry.totaltime * 1000)
+ max_cost = max(max_cost, totaltime)
+ print >> self.out_file, 'summary: %d' % (max_cost,)
+
+ def _entry(self, entry):
+ out_file = self.out_file
+
+ code = entry.code
+ #print >> out_file, 'ob=%s' % (code.co_filename,)
+ if isinstance(code, str):
+ print >> out_file, 'fi=~'
+ else:
+ print >> out_file, 'fi=%s' % (code.co_filename,)
+ print >> out_file, 'fn=%s' % (label(code),)
+
+ inlinetime = int(entry.inlinetime * 1000)
+ if isinstance(code, str):
+ print >> out_file, '0 ', inlinetime
+ else:
+ print >> out_file, '%d %d' % (code.co_firstlineno, inlinetime)
+
+ # recursive calls are counted in entry.calls
+ if entry.calls:
+ calls = entry.calls
+ else:
+ calls = []
+
+ if isinstance(code, str):
+ lineno = 0
+ else:
+ lineno = code.co_firstlineno
+
+ for subentry in calls:
+ self._subentry(lineno, subentry)
+ print >> out_file
+
+ def _subentry(self, lineno, subentry):
+ out_file = self.out_file
+ code = subentry.code
+ #print >> out_file, 'cob=%s' % (code.co_filename,)
+ print >> out_file, 'cfn=%s' % (label(code),)
+ if isinstance(code, str):
+ print >> out_file, 'cfi=~'
+ print >> out_file, 'calls=%d 0' % (subentry.callcount,)
+ else:
+ print >> out_file, 'cfi=%s' % (code.co_filename,)
+ print >> out_file, 'calls=%d %d' % (
+ subentry.callcount, code.co_firstlineno)
+
+ totaltime = int(subentry.totaltime * 1000)
+ print >> out_file, '%d %d' % (lineno, totaltime)
diff --git a/mercurial/mail.py b/mercurial/mail.py
new file mode 100644
index 0000000..1154a4a
--- /dev/null
+++ b/mercurial/mail.py
@@ -0,0 +1,255 @@
+# mail.py - mail sending bits for mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import util, encoding
+import os, smtplib, socket, quopri, time
+import email.Header, email.MIMEText, email.Utils
+
+_oldheaderinit = email.Header.Header.__init__
+def _unifiedheaderinit(self, *args, **kw):
+ """
+ Python2.7 introduces a backwards incompatible change
+ (Python issue1974, r70772) in email.Generator.Generator code:
+ pre-2.7 code passed "continuation_ws='\t'" to the Header
+ constructor, and 2.7 removed this parameter.
+
+ Default argument is continuation_ws=' ', which means that the
+ behaviour is different in <2.7 and 2.7
+
+ We consider the 2.7 behaviour to be preferable, but need
+ to have an unified behaviour for versions 2.4 to 2.7
+ """
+ # override continuation_ws
+ kw['continuation_ws'] = ' '
+ _oldheaderinit(self, *args, **kw)
+
+email.Header.Header.__dict__['__init__'] = _unifiedheaderinit
+
+def _smtp(ui):
+ '''build an smtp connection and return a function to send mail'''
+ local_hostname = ui.config('smtp', 'local_hostname')
+ tls = ui.config('smtp', 'tls', 'none')
+ # backward compatible: when tls = true, we use starttls.
+ starttls = tls == 'starttls' or util.parsebool(tls)
+ smtps = tls == 'smtps'
+ if (starttls or smtps) and not util.safehasattr(socket, 'ssl'):
+ raise util.Abort(_("can't use TLS: Python SSL support not installed"))
+ if smtps:
+ ui.note(_('(using smtps)\n'))
+ s = smtplib.SMTP_SSL(local_hostname=local_hostname)
+ else:
+ s = smtplib.SMTP(local_hostname=local_hostname)
+ mailhost = ui.config('smtp', 'host')
+ if not mailhost:
+ raise util.Abort(_('smtp.host not configured - cannot send mail'))
+ mailport = util.getport(ui.config('smtp', 'port', 25))
+ ui.note(_('sending mail: smtp host %s, port %s\n') %
+ (mailhost, mailport))
+ s.connect(host=mailhost, port=mailport)
+ if starttls:
+ ui.note(_('(using starttls)\n'))
+ s.ehlo()
+ s.starttls()
+ s.ehlo()
+ username = ui.config('smtp', 'username')
+ password = ui.config('smtp', 'password')
+ if username and not password:
+ password = ui.getpass()
+ if username and password:
+ ui.note(_('(authenticating to mail server as %s)\n') %
+ (username))
+ try:
+ s.login(username, password)
+ except smtplib.SMTPException, inst:
+ raise util.Abort(inst)
+
+ def send(sender, recipients, msg):
+ try:
+ return s.sendmail(sender, recipients, msg)
+ except smtplib.SMTPRecipientsRefused, inst:
+ recipients = [r[1] for r in inst.recipients.values()]
+ raise util.Abort('\n' + '\n'.join(recipients))
+ except smtplib.SMTPException, inst:
+ raise util.Abort(inst)
+
+ return send
+
+def _sendmail(ui, sender, recipients, msg):
+ '''send mail using sendmail.'''
+ program = ui.config('email', 'method')
+ cmdline = '%s -f %s %s' % (program, util.email(sender),
+ ' '.join(map(util.email, recipients)))
+ ui.note(_('sending mail: %s\n') % cmdline)
+ fp = util.popen(cmdline, 'w')
+ fp.write(msg)
+ ret = fp.close()
+ if ret:
+ raise util.Abort('%s %s' % (
+ os.path.basename(program.split(None, 1)[0]),
+ util.explainexit(ret)[0]))
+
+def _mbox(mbox, sender, recipients, msg):
+ '''write mails to mbox'''
+ fp = open(mbox, 'ab+')
+ # Should be time.asctime(), but Windows prints 2-characters day
+ # of month instead of one. Make them print the same thing.
+ date = time.strftime('%a %b %d %H:%M:%S %Y', time.localtime())
+ fp.write('From %s %s\n' % (sender, date))
+ fp.write(msg)
+ fp.write('\n\n')
+ fp.close()
+
+def connect(ui, mbox=None):
+ '''make a mail connection. return a function to send mail.
+ call as sendmail(sender, list-of-recipients, msg).'''
+ if mbox:
+ open(mbox, 'wb').close()
+ return lambda s, r, m: _mbox(mbox, s, r, m)
+ if ui.config('email', 'method', 'smtp') == 'smtp':
+ return _smtp(ui)
+ return lambda s, r, m: _sendmail(ui, s, r, m)
+
+def sendmail(ui, sender, recipients, msg, mbox=None):
+ send = connect(ui, mbox=mbox)
+ return send(sender, recipients, msg)
+
+def validateconfig(ui):
+ '''determine if we have enough config data to try sending email.'''
+ method = ui.config('email', 'method', 'smtp')
+ if method == 'smtp':
+ if not ui.config('smtp', 'host'):
+ raise util.Abort(_('smtp specified as email transport, '
+ 'but no smtp host configured'))
+ else:
+ if not util.findexe(method):
+ raise util.Abort(_('%r specified as email transport, '
+ 'but not in PATH') % method)
+
+def mimetextpatch(s, subtype='plain', display=False):
+ '''Return MIME message suitable for a patch.
+ Charset will be detected as utf-8 or (possibly fake) us-ascii.
+ Transfer encodings will be used if necessary.'''
+
+ cs = 'us-ascii'
+ if not display:
+ try:
+ s.decode('us-ascii')
+ except UnicodeDecodeError:
+ try:
+ s.decode('utf-8')
+ cs = 'utf-8'
+ except UnicodeDecodeError:
+ # We'll go with us-ascii as a fallback.
+ pass
+
+ return mimetextqp(s, subtype, cs)
+
+def mimetextqp(body, subtype, charset):
+ '''Return MIME message.
+ Qouted-printable transfer encoding will be used if necessary.
+ '''
+ enc = None
+ for line in body.splitlines():
+ if len(line) > 950:
+ body = quopri.encodestring(body)
+ enc = "quoted-printable"
+ break
+
+ msg = email.MIMEText.MIMEText(body, subtype, charset)
+ if enc:
+ del msg['Content-Transfer-Encoding']
+ msg['Content-Transfer-Encoding'] = enc
+ return msg
+
+def _charsets(ui):
+ '''Obtains charsets to send mail parts not containing patches.'''
+ charsets = [cs.lower() for cs in ui.configlist('email', 'charsets')]
+ fallbacks = [encoding.fallbackencoding.lower(),
+ encoding.encoding.lower(), 'utf-8']
+ for cs in fallbacks: # find unique charsets while keeping order
+ if cs not in charsets:
+ charsets.append(cs)
+ return [cs for cs in charsets if not cs.endswith('ascii')]
+
+def _encode(ui, s, charsets):
+ '''Returns (converted) string, charset tuple.
+ Finds out best charset by cycling through sendcharsets in descending
+ order. Tries both encoding and fallbackencoding for input. Only as
+ last resort send as is in fake ascii.
+ Caveat: Do not use for mail parts containing patches!'''
+ try:
+ s.decode('ascii')
+ except UnicodeDecodeError:
+ sendcharsets = charsets or _charsets(ui)
+ for ics in (encoding.encoding, encoding.fallbackencoding):
+ try:
+ u = s.decode(ics)
+ except UnicodeDecodeError:
+ continue
+ for ocs in sendcharsets:
+ try:
+ return u.encode(ocs), ocs
+ except UnicodeEncodeError:
+ pass
+ except LookupError:
+ ui.warn(_('ignoring invalid sendcharset: %s\n') % ocs)
+ # if ascii, or all conversion attempts fail, send (broken) ascii
+ return s, 'us-ascii'
+
+def headencode(ui, s, charsets=None, display=False):
+ '''Returns RFC-2047 compliant header from given string.'''
+ if not display:
+ # split into words?
+ s, cs = _encode(ui, s, charsets)
+ return str(email.Header.Header(s, cs))
+ return s
+
+def _addressencode(ui, name, addr, charsets=None):
+ name = headencode(ui, name, charsets)
+ try:
+ acc, dom = addr.split('@')
+ acc = acc.encode('ascii')
+ dom = dom.decode(encoding.encoding).encode('idna')
+ addr = '%s@%s' % (acc, dom)
+ except UnicodeDecodeError:
+ raise util.Abort(_('invalid email address: %s') % addr)
+ except ValueError:
+ try:
+ # too strict?
+ addr = addr.encode('ascii')
+ except UnicodeDecodeError:
+ raise util.Abort(_('invalid local address: %s') % addr)
+ return email.Utils.formataddr((name, addr))
+
+def addressencode(ui, address, charsets=None, display=False):
+ '''Turns address into RFC-2047 compliant header.'''
+ if display or not address:
+ return address or ''
+ name, addr = email.Utils.parseaddr(address)
+ return _addressencode(ui, name, addr, charsets)
+
+def addrlistencode(ui, addrs, charsets=None, display=False):
+ '''Turns a list of addresses into a list of RFC-2047 compliant headers.
+ A single element of input list may contain multiple addresses, but output
+ always has one address per item'''
+ if display:
+ return [a.strip() for a in addrs if a.strip()]
+
+ result = []
+ for name, addr in email.Utils.getaddresses(addrs):
+ if name or addr:
+ result.append(_addressencode(ui, name, addr, charsets))
+ return result
+
+def mimeencode(ui, s, charsets=None, display=False):
+ '''creates mime text object, encodes it if needed, and sets
+ charset and transfer-encoding accordingly.'''
+ cs = 'us-ascii'
+ if not display:
+ s, cs = _encode(ui, s, charsets)
+ return mimetextqp(s, 'plain', cs)
diff --git a/mercurial/manifest.py b/mercurial/manifest.py
new file mode 100644
index 0000000..07f0b6d
--- /dev/null
+++ b/mercurial/manifest.py
@@ -0,0 +1,206 @@
+# manifest.py - manifest revision class for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import mdiff, parsers, error, revlog, util
+import array, struct
+
+class manifestdict(dict):
+ def __init__(self, mapping=None, flags=None):
+ if mapping is None:
+ mapping = {}
+ if flags is None:
+ flags = {}
+ dict.__init__(self, mapping)
+ self._flags = flags
+ def flags(self, f):
+ return self._flags.get(f, "")
+ def withflags(self):
+ return set(self._flags.keys())
+ def set(self, f, flags):
+ self._flags[f] = flags
+ def copy(self):
+ return manifestdict(self, dict.copy(self._flags))
+
+class manifest(revlog.revlog):
+ def __init__(self, opener):
+ self._mancache = None
+ revlog.revlog.__init__(self, opener, "00manifest.i")
+
+ def parse(self, lines):
+ mfdict = manifestdict()
+ parsers.parse_manifest(mfdict, mfdict._flags, lines)
+ return mfdict
+
+ def readdelta(self, node):
+ r = self.rev(node)
+ return self.parse(mdiff.patchtext(self.revdiff(self.deltaparent(r), r)))
+
+ def readfast(self, node):
+ '''use the faster of readdelta or read'''
+ r = self.rev(node)
+ deltaparent = self.deltaparent(r)
+ if deltaparent != revlog.nullrev and deltaparent in self.parentrevs(r):
+ return self.readdelta(node)
+ return self.read(node)
+
+ def read(self, node):
+ if node == revlog.nullid:
+ return manifestdict() # don't upset local cache
+ if self._mancache and self._mancache[0] == node:
+ return self._mancache[1]
+ text = self.revision(node)
+ arraytext = array.array('c', text)
+ mapping = self.parse(text)
+ self._mancache = (node, mapping, arraytext)
+ return mapping
+
+ def _search(self, m, s, lo=0, hi=None):
+ '''return a tuple (start, end) that says where to find s within m.
+
+ If the string is found m[start:end] are the line containing
+ that string. If start == end the string was not found and
+ they indicate the proper sorted insertion point. This was
+ taken from bisect_left, and modified to find line start/end as
+ it goes along.
+
+ m should be a buffer or a string
+ s is a string'''
+ def advance(i, c):
+ while i < lenm and m[i] != c:
+ i += 1
+ return i
+ if not s:
+ return (lo, lo)
+ lenm = len(m)
+ if not hi:
+ hi = lenm
+ while lo < hi:
+ mid = (lo + hi) // 2
+ start = mid
+ while start > 0 and m[start - 1] != '\n':
+ start -= 1
+ end = advance(start, '\0')
+ if m[start:end] < s:
+ # we know that after the null there are 40 bytes of sha1
+ # this translates to the bisect lo = mid + 1
+ lo = advance(end + 40, '\n') + 1
+ else:
+ # this translates to the bisect hi = mid
+ hi = start
+ end = advance(lo, '\0')
+ found = m[lo:end]
+ if s == found:
+ # we know that after the null there are 40 bytes of sha1
+ end = advance(end + 40, '\n')
+ return (lo, end + 1)
+ else:
+ return (lo, lo)
+
+ def find(self, node, f):
+ '''look up entry for a single file efficiently.
+ return (node, flags) pair if found, (None, None) if not.'''
+ if self._mancache and self._mancache[0] == node:
+ return self._mancache[1].get(f), self._mancache[1].flags(f)
+ text = self.revision(node)
+ start, end = self._search(text, f)
+ if start == end:
+ return None, None
+ l = text[start:end]
+ f, n = l.split('\0')
+ return revlog.bin(n[:40]), n[40:-1]
+
+ def add(self, map, transaction, link, p1=None, p2=None,
+ changed=None):
+ # apply the changes collected during the bisect loop to our addlist
+ # return a delta suitable for addrevision
+ def addlistdelta(addlist, x):
+ # start from the bottom up
+ # so changes to the offsets don't mess things up.
+ for start, end, content in reversed(x):
+ if content:
+ addlist[start:end] = array.array('c', content)
+ else:
+ del addlist[start:end]
+ return "".join(struct.pack(">lll", start, end, len(content))
+ + content for start, end, content in x)
+
+ def checkforbidden(l):
+ for f in l:
+ if '\n' in f or '\r' in f:
+ raise error.RevlogError(
+ _("'\\n' and '\\r' disallowed in filenames: %r") % f)
+
+ # if we're using the cache, make sure it is valid and
+ # parented by the same node we're diffing against
+ if not (changed and self._mancache and p1 and self._mancache[0] == p1):
+ files = sorted(map)
+ checkforbidden(files)
+
+ # if this is changed to support newlines in filenames,
+ # be sure to check the templates/ dir again (especially *-raw.tmpl)
+ hex, flags = revlog.hex, map.flags
+ text = ''.join("%s\0%s%s\n" % (f, hex(map[f]), flags(f))
+ for f in files)
+ arraytext = array.array('c', text)
+ cachedelta = None
+ else:
+ added, removed = changed
+ addlist = self._mancache[2]
+
+ checkforbidden(added)
+ # combine the changed lists into one list for sorting
+ work = [(x, False) for x in added]
+ work.extend((x, True) for x in removed)
+ # this could use heapq.merge() (from python2.6+) or equivalent
+ # since the lists are already sorted
+ work.sort()
+
+ delta = []
+ dstart = None
+ dend = None
+ dline = [""]
+ start = 0
+ # zero copy representation of addlist as a buffer
+ addbuf = util.buffer(addlist)
+
+ # start with a readonly loop that finds the offset of
+ # each line and creates the deltas
+ for f, todelete in work:
+ # bs will either be the index of the item or the insert point
+ start, end = self._search(addbuf, f, start)
+ if not todelete:
+ l = "%s\0%s%s\n" % (f, revlog.hex(map[f]), map.flags(f))
+ else:
+ if start == end:
+ # item we want to delete was not found, error out
+ raise AssertionError(
+ _("failed to remove %s from manifest") % f)
+ l = ""
+ if dstart is not None and dstart <= start and dend >= start:
+ if dend < end:
+ dend = end
+ if l:
+ dline.append(l)
+ else:
+ if dstart is not None:
+ delta.append([dstart, dend, "".join(dline)])
+ dstart = start
+ dend = end
+ dline = [l]
+
+ if dstart is not None:
+ delta.append([dstart, dend, "".join(dline)])
+ # apply the delta to the addlist, and get a delta for addrevision
+ cachedelta = (self.rev(p1), addlistdelta(addlist, delta))
+ arraytext = addlist
+ text = util.buffer(arraytext)
+
+ n = self.addrevision(text, transaction, link, p1, p2, cachedelta)
+ self._mancache = (n, map, arraytext)
+
+ return n
diff --git a/mercurial/match.py b/mercurial/match.py
new file mode 100644
index 0000000..927cd59
--- /dev/null
+++ b/mercurial/match.py
@@ -0,0 +1,352 @@
+# match.py - filename matching
+#
+# Copyright 2008, 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import re
+import scmutil, util, fileset
+from i18n import _
+
+def _rematcher(pat):
+ m = util.compilere(pat)
+ try:
+ # slightly faster, provided by facebook's re2 bindings
+ return m.test_match
+ except AttributeError:
+ return m.match
+
+def _expandsets(pats, ctx):
+ '''convert set: patterns into a list of files in the given context'''
+ fset = set()
+ other = []
+
+ for kind, expr in pats:
+ if kind == 'set':
+ if not ctx:
+ raise util.Abort("fileset expression with no context")
+ s = fileset.getfileset(ctx, expr)
+ fset.update(s)
+ continue
+ other.append((kind, expr))
+ return fset, other
+
+class match(object):
+ def __init__(self, root, cwd, patterns, include=[], exclude=[],
+ default='glob', exact=False, auditor=None, ctx=None):
+ """build an object to match a set of file patterns
+
+ arguments:
+ root - the canonical root of the tree you're matching against
+ cwd - the current working directory, if relevant
+ patterns - patterns to find
+ include - patterns to include
+ exclude - patterns to exclude
+ default - if a pattern in names has no explicit type, assume this one
+ exact - patterns are actually literals
+
+ a pattern is one of:
+ 'glob:<glob>' - a glob relative to cwd
+ 're:<regexp>' - a regular expression
+ 'path:<path>' - a path relative to canonroot
+ 'relglob:<glob>' - an unrooted glob (*.c matches C files in all dirs)
+ 'relpath:<path>' - a path relative to cwd
+ 'relre:<regexp>' - a regexp that needn't match the start of a name
+ 'set:<fileset>' - a fileset expression
+ '<something>' - a pattern of the specified default type
+ """
+
+ self._root = root
+ self._cwd = cwd
+ self._files = []
+ self._anypats = bool(include or exclude)
+ self._ctx = ctx
+
+ if include:
+ pats = _normalize(include, 'glob', root, cwd, auditor)
+ self.includepat, im = _buildmatch(ctx, pats, '(?:/|$)')
+ if exclude:
+ pats = _normalize(exclude, 'glob', root, cwd, auditor)
+ self.excludepat, em = _buildmatch(ctx, pats, '(?:/|$)')
+ if exact:
+ if isinstance(patterns, list):
+ self._files = patterns
+ else:
+ self._files = list(patterns)
+ pm = self.exact
+ elif patterns:
+ pats = _normalize(patterns, default, root, cwd, auditor)
+ self._files = _roots(pats)
+ self._anypats = self._anypats or _anypats(pats)
+ self.patternspat, pm = _buildmatch(ctx, pats, '$')
+
+ if patterns or exact:
+ if include:
+ if exclude:
+ m = lambda f: im(f) and not em(f) and pm(f)
+ else:
+ m = lambda f: im(f) and pm(f)
+ else:
+ if exclude:
+ m = lambda f: not em(f) and pm(f)
+ else:
+ m = pm
+ else:
+ if include:
+ if exclude:
+ m = lambda f: im(f) and not em(f)
+ else:
+ m = im
+ else:
+ if exclude:
+ m = lambda f: not em(f)
+ else:
+ m = lambda f: True
+
+ self.matchfn = m
+ self._fmap = set(self._files)
+
+ def __call__(self, fn):
+ return self.matchfn(fn)
+ def __iter__(self):
+ for f in self._files:
+ yield f
+ def bad(self, f, msg):
+ '''callback for each explicit file that can't be
+ found/accessed, with an error message
+ '''
+ pass
+ def dir(self, f):
+ pass
+ def missing(self, f):
+ pass
+ def exact(self, f):
+ return f in self._fmap
+ def rel(self, f):
+ return util.pathto(self._root, self._cwd, f)
+ def files(self):
+ return self._files
+ def anypats(self):
+ return self._anypats
+ def always(self):
+ return False
+
+class exact(match):
+ def __init__(self, root, cwd, files):
+ match.__init__(self, root, cwd, files, exact = True)
+
+class always(match):
+ def __init__(self, root, cwd):
+ match.__init__(self, root, cwd, [])
+ def always(self):
+ return True
+
+class narrowmatcher(match):
+ """Adapt a matcher to work on a subdirectory only.
+
+ The paths are remapped to remove/insert the path as needed:
+
+ >>> m1 = match('root', '', ['a.txt', 'sub/b.txt'])
+ >>> m2 = narrowmatcher('sub', m1)
+ >>> bool(m2('a.txt'))
+ False
+ >>> bool(m2('b.txt'))
+ True
+ >>> bool(m2.matchfn('a.txt'))
+ False
+ >>> bool(m2.matchfn('b.txt'))
+ True
+ >>> m2.files()
+ ['b.txt']
+ >>> m2.exact('b.txt')
+ True
+ >>> m2.rel('b.txt')
+ 'b.txt'
+ >>> def bad(f, msg):
+ ... print "%s: %s" % (f, msg)
+ >>> m1.bad = bad
+ >>> m2.bad('x.txt', 'No such file')
+ sub/x.txt: No such file
+ """
+
+ def __init__(self, path, matcher):
+ self._root = matcher._root
+ self._cwd = matcher._cwd
+ self._path = path
+ self._matcher = matcher
+
+ self._files = [f[len(path) + 1:] for f in matcher._files
+ if f.startswith(path + "/")]
+ self._anypats = matcher._anypats
+ self.matchfn = lambda fn: matcher.matchfn(self._path + "/" + fn)
+ self._fmap = set(self._files)
+
+ def bad(self, f, msg):
+ self._matcher.bad(self._path + "/" + f, msg)
+
+def patkind(pat):
+ return _patsplit(pat, None)[0]
+
+def _patsplit(pat, default):
+ """Split a string into an optional pattern kind prefix and the
+ actual pattern."""
+ if ':' in pat:
+ kind, val = pat.split(':', 1)
+ if kind in ('re', 'glob', 'path', 'relglob', 'relpath', 'relre',
+ 'listfile', 'listfile0', 'set'):
+ return kind, val
+ return default, pat
+
+def _globre(pat):
+ "convert a glob pattern into a regexp"
+ i, n = 0, len(pat)
+ res = ''
+ group = 0
+ escape = re.escape
+ def peek():
+ return i < n and pat[i]
+ while i < n:
+ c = pat[i]
+ i += 1
+ if c not in '*?[{},\\':
+ res += escape(c)
+ elif c == '*':
+ if peek() == '*':
+ i += 1
+ res += '.*'
+ else:
+ res += '[^/]*'
+ elif c == '?':
+ res += '.'
+ elif c == '[':
+ j = i
+ if j < n and pat[j] in '!]':
+ j += 1
+ while j < n and pat[j] != ']':
+ j += 1
+ if j >= n:
+ res += '\\['
+ else:
+ stuff = pat[i:j].replace('\\','\\\\')
+ i = j + 1
+ if stuff[0] == '!':
+ stuff = '^' + stuff[1:]
+ elif stuff[0] == '^':
+ stuff = '\\' + stuff
+ res = '%s[%s]' % (res, stuff)
+ elif c == '{':
+ group += 1
+ res += '(?:'
+ elif c == '}' and group:
+ res += ')'
+ group -= 1
+ elif c == ',' and group:
+ res += '|'
+ elif c == '\\':
+ p = peek()
+ if p:
+ i += 1
+ res += escape(p)
+ else:
+ res += escape(c)
+ else:
+ res += escape(c)
+ return res
+
+def _regex(kind, name, tail):
+ '''convert a pattern into a regular expression'''
+ if not name:
+ return ''
+ if kind == 're':
+ return name
+ elif kind == 'path':
+ return '^' + re.escape(name) + '(?:/|$)'
+ elif kind == 'relglob':
+ return '(?:|.*/)' + _globre(name) + tail
+ elif kind == 'relpath':
+ return re.escape(name) + '(?:/|$)'
+ elif kind == 'relre':
+ if name.startswith('^'):
+ return name
+ return '.*' + name
+ return _globre(name) + tail
+
+def _buildmatch(ctx, pats, tail):
+ fset, pats = _expandsets(pats, ctx)
+ if not pats:
+ return "", fset.__contains__
+
+ pat, mf = _buildregexmatch(pats, tail)
+ if fset:
+ return pat, lambda f: f in fset or mf(f)
+ return pat, mf
+
+def _buildregexmatch(pats, tail):
+ """build a matching function from a set of patterns"""
+ try:
+ pat = '(?:%s)' % '|'.join([_regex(k, p, tail) for (k, p) in pats])
+ if len(pat) > 20000:
+ raise OverflowError
+ return pat, _rematcher(pat)
+ except OverflowError:
+ # We're using a Python with a tiny regex engine and we
+ # made it explode, so we'll divide the pattern list in two
+ # until it works
+ l = len(pats)
+ if l < 2:
+ raise
+ pata, a = _buildregexmatch(pats[:l//2], tail)
+ patb, b = _buildregexmatch(pats[l//2:], tail)
+ return pat, lambda s: a(s) or b(s)
+ except re.error:
+ for k, p in pats:
+ try:
+ _rematcher('(?:%s)' % _regex(k, p, tail))
+ except re.error:
+ raise util.Abort(_("invalid pattern (%s): %s") % (k, p))
+ raise util.Abort(_("invalid pattern"))
+
+def _normalize(names, default, root, cwd, auditor):
+ pats = []
+ for kind, name in [_patsplit(p, default) for p in names]:
+ if kind in ('glob', 'relpath'):
+ name = scmutil.canonpath(root, cwd, name, auditor)
+ elif kind in ('relglob', 'path'):
+ name = util.normpath(name)
+ elif kind in ('listfile', 'listfile0'):
+ try:
+ files = util.readfile(name)
+ if kind == 'listfile0':
+ files = files.split('\0')
+ else:
+ files = files.splitlines()
+ files = [f for f in files if f]
+ except EnvironmentError:
+ raise util.Abort(_("unable to read file list (%s)") % name)
+ pats += _normalize(files, default, root, cwd, auditor)
+ continue
+
+ pats.append((kind, name))
+ return pats
+
+def _roots(patterns):
+ r = []
+ for kind, name in patterns:
+ if kind == 'glob': # find the non-glob prefix
+ root = []
+ for p in name.split('/'):
+ if '[' in p or '{' in p or '*' in p or '?' in p:
+ break
+ root.append(p)
+ r.append('/'.join(root) or '.')
+ elif kind in ('relpath', 'path'):
+ r.append(name or '.')
+ elif kind == 'relglob':
+ r.append('.')
+ return r
+
+def _anypats(patterns):
+ for kind, name in patterns:
+ if kind in ('glob', 're', 'relglob', 'relre', 'set'):
+ return True
diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py
new file mode 100644
index 0000000..f93a8a6
--- /dev/null
+++ b/mercurial/mdiff.py
@@ -0,0 +1,342 @@
+# mdiff.py - diff and patch routines for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import bdiff, mpatch, util
+import re, struct
+
+def splitnewlines(text):
+ '''like str.splitlines, but only split on newlines.'''
+ lines = [l + '\n' for l in text.split('\n')]
+ if lines:
+ if lines[-1] == '\n':
+ lines.pop()
+ else:
+ lines[-1] = lines[-1][:-1]
+ return lines
+
+class diffopts(object):
+ '''context is the number of context lines
+ text treats all files as text
+ showfunc enables diff -p output
+ git enables the git extended patch format
+ nodates removes dates from diff headers
+ ignorews ignores all whitespace changes in the diff
+ ignorewsamount ignores changes in the amount of whitespace
+ ignoreblanklines ignores changes whose lines are all blank
+ upgrade generates git diffs to avoid data loss
+ '''
+
+ defaults = {
+ 'context': 3,
+ 'text': False,
+ 'showfunc': False,
+ 'git': False,
+ 'nodates': False,
+ 'ignorews': False,
+ 'ignorewsamount': False,
+ 'ignoreblanklines': False,
+ 'upgrade': False,
+ }
+
+ __slots__ = defaults.keys()
+
+ def __init__(self, **opts):
+ for k in self.__slots__:
+ v = opts.get(k)
+ if v is None:
+ v = self.defaults[k]
+ setattr(self, k, v)
+
+ try:
+ self.context = int(self.context)
+ except ValueError:
+ raise util.Abort(_('diff context lines count must be '
+ 'an integer, not %r') % self.context)
+
+ def copy(self, **kwargs):
+ opts = dict((k, getattr(self, k)) for k in self.defaults)
+ opts.update(kwargs)
+ return diffopts(**opts)
+
+defaultopts = diffopts()
+
+def wsclean(opts, text, blank=True):
+ if opts.ignorews:
+ text = bdiff.fixws(text, 1)
+ elif opts.ignorewsamount:
+ text = bdiff.fixws(text, 0)
+ if blank and opts.ignoreblanklines:
+ text = re.sub('\n+', '\n', text).strip('\n')
+ return text
+
+def splitblock(base1, lines1, base2, lines2, opts):
+ # The input lines matches except for interwoven blank lines. We
+ # transform it into a sequence of matching blocks and blank blocks.
+ lines1 = [(wsclean(opts, l) and 1 or 0) for l in lines1]
+ lines2 = [(wsclean(opts, l) and 1 or 0) for l in lines2]
+ s1, e1 = 0, len(lines1)
+ s2, e2 = 0, len(lines2)
+ while s1 < e1 or s2 < e2:
+ i1, i2, btype = s1, s2, '='
+ if (i1 >= e1 or lines1[i1] == 0
+ or i2 >= e2 or lines2[i2] == 0):
+ # Consume the block of blank lines
+ btype = '~'
+ while i1 < e1 and lines1[i1] == 0:
+ i1 += 1
+ while i2 < e2 and lines2[i2] == 0:
+ i2 += 1
+ else:
+ # Consume the matching lines
+ while i1 < e1 and lines1[i1] == 1 and lines2[i2] == 1:
+ i1 += 1
+ i2 += 1
+ yield [base1 + s1, base1 + i1, base2 + s2, base2 + i2], btype
+ s1 = i1
+ s2 = i2
+
+def allblocks(text1, text2, opts=None, lines1=None, lines2=None, refine=False):
+ """Return (block, type) tuples, where block is an mdiff.blocks
+ line entry. type is '=' for blocks matching exactly one another
+ (bdiff blocks), '!' for non-matching blocks and '~' for blocks
+ matching only after having filtered blank lines. If refine is True,
+ then '~' blocks are refined and are only made of blank lines.
+ line1 and line2 are text1 and text2 split with splitnewlines() if
+ they are already available.
+ """
+ if opts is None:
+ opts = defaultopts
+ if opts.ignorews or opts.ignorewsamount:
+ text1 = wsclean(opts, text1, False)
+ text2 = wsclean(opts, text2, False)
+ diff = bdiff.blocks(text1, text2)
+ for i, s1 in enumerate(diff):
+ # The first match is special.
+ # we've either found a match starting at line 0 or a match later
+ # in the file. If it starts later, old and new below will both be
+ # empty and we'll continue to the next match.
+ if i > 0:
+ s = diff[i - 1]
+ else:
+ s = [0, 0, 0, 0]
+ s = [s[1], s1[0], s[3], s1[2]]
+
+ # bdiff sometimes gives huge matches past eof, this check eats them,
+ # and deals with the special first match case described above
+ if s[0] != s[1] or s[2] != s[3]:
+ type = '!'
+ if opts.ignoreblanklines:
+ if lines1 is None:
+ lines1 = splitnewlines(text1)
+ if lines2 is None:
+ lines2 = splitnewlines(text2)
+ old = wsclean(opts, "".join(lines1[s[0]:s[1]]))
+ new = wsclean(opts, "".join(lines2[s[2]:s[3]]))
+ if old == new:
+ type = '~'
+ yield s, type
+ yield s1, '='
+
+def diffline(revs, a, b, opts):
+ parts = ['diff']
+ if opts.git:
+ parts.append('--git')
+ if revs and not opts.git:
+ parts.append(' '.join(["-r %s" % rev for rev in revs]))
+ if opts.git:
+ parts.append('a/%s' % a)
+ parts.append('b/%s' % b)
+ else:
+ parts.append(a)
+ return ' '.join(parts) + '\n'
+
+def unidiff(a, ad, b, bd, fn1, fn2, r=None, opts=defaultopts):
+ def datetag(date, fn=None):
+ if not opts.git and not opts.nodates:
+ return '\t%s\n' % date
+ if fn and ' ' in fn:
+ return '\t\n'
+ return '\n'
+
+ if not a and not b:
+ return ""
+ epoch = util.datestr((0, 0))
+
+ fn1 = util.pconvert(fn1)
+ fn2 = util.pconvert(fn2)
+
+ if not opts.text and (util.binary(a) or util.binary(b)):
+ if a and b and len(a) == len(b) and a == b:
+ return ""
+ l = ['Binary file %s has changed\n' % fn1]
+ elif not a:
+ b = splitnewlines(b)
+ if a is None:
+ l1 = '--- /dev/null%s' % datetag(epoch)
+ else:
+ l1 = "--- %s%s" % ("a/" + fn1, datetag(ad, fn1))
+ l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd, fn2))
+ l3 = "@@ -0,0 +1,%d @@\n" % len(b)
+ l = [l1, l2, l3] + ["+" + e for e in b]
+ elif not b:
+ a = splitnewlines(a)
+ l1 = "--- %s%s" % ("a/" + fn1, datetag(ad, fn1))
+ if b is None:
+ l2 = '+++ /dev/null%s' % datetag(epoch)
+ else:
+ l2 = "+++ %s%s" % ("b/" + fn2, datetag(bd, fn2))
+ l3 = "@@ -1,%d +0,0 @@\n" % len(a)
+ l = [l1, l2, l3] + ["-" + e for e in a]
+ else:
+ al = splitnewlines(a)
+ bl = splitnewlines(b)
+ l = list(_unidiff(a, b, al, bl, opts=opts))
+ if not l:
+ return ""
+
+ l.insert(0, "--- a/%s%s" % (fn1, datetag(ad, fn1)))
+ l.insert(1, "+++ b/%s%s" % (fn2, datetag(bd, fn2)))
+
+ for ln in xrange(len(l)):
+ if l[ln][-1] != '\n':
+ l[ln] += "\n\ No newline at end of file\n"
+
+ if r:
+ l.insert(0, diffline(r, fn1, fn2, opts))
+
+ return "".join(l)
+
+# creates a headerless unified diff
+# t1 and t2 are the text to be diffed
+# l1 and l2 are the text broken up into lines
+def _unidiff(t1, t2, l1, l2, opts=defaultopts):
+ def contextend(l, len):
+ ret = l + opts.context
+ if ret > len:
+ ret = len
+ return ret
+
+ def contextstart(l):
+ ret = l - opts.context
+ if ret < 0:
+ return 0
+ return ret
+
+ lastfunc = [0, '']
+ def yieldhunk(hunk):
+ (astart, a2, bstart, b2, delta) = hunk
+ aend = contextend(a2, len(l1))
+ alen = aend - astart
+ blen = b2 - bstart + aend - a2
+
+ func = ""
+ if opts.showfunc:
+ lastpos, func = lastfunc
+ # walk backwards from the start of the context up to the start of
+ # the previous hunk context until we find a line starting with an
+ # alphanumeric char.
+ for i in xrange(astart - 1, lastpos - 1, -1):
+ if l1[i][0].isalnum():
+ func = ' ' + l1[i].rstrip()[:40]
+ lastfunc[1] = func
+ break
+ # by recording this hunk's starting point as the next place to
+ # start looking for function lines, we avoid reading any line in
+ # the file more than once.
+ lastfunc[0] = astart
+
+ # zero-length hunk ranges report their start line as one less
+ if alen:
+ astart += 1
+ if blen:
+ bstart += 1
+
+ yield "@@ -%d,%d +%d,%d @@%s\n" % (astart, alen,
+ bstart, blen, func)
+ for x in delta:
+ yield x
+ for x in xrange(a2, aend):
+ yield ' ' + l1[x]
+
+ # bdiff.blocks gives us the matching sequences in the files. The loop
+ # below finds the spaces between those matching sequences and translates
+ # them into diff output.
+ #
+ hunk = None
+ ignoredlines = 0
+ for s, stype in allblocks(t1, t2, opts, l1, l2):
+ a1, a2, b1, b2 = s
+ if stype != '!':
+ if stype == '~':
+ # The diff context lines are based on t1 content. When
+ # blank lines are ignored, the new lines offsets must
+ # be adjusted as if equivalent blocks ('~') had the
+ # same sizes on both sides.
+ ignoredlines += (b2 - b1) - (a2 - a1)
+ continue
+ delta = []
+ old = l1[a1:a2]
+ new = l2[b1:b2]
+
+ b1 -= ignoredlines
+ b2 -= ignoredlines
+ astart = contextstart(a1)
+ bstart = contextstart(b1)
+ prev = None
+ if hunk:
+ # join with the previous hunk if it falls inside the context
+ if astart < hunk[1] + opts.context + 1:
+ prev = hunk
+ astart = hunk[1]
+ bstart = hunk[3]
+ else:
+ for x in yieldhunk(hunk):
+ yield x
+ if prev:
+ # we've joined the previous hunk, record the new ending points.
+ hunk[1] = a2
+ hunk[3] = b2
+ delta = hunk[4]
+ else:
+ # create a new hunk
+ hunk = [astart, a2, bstart, b2, delta]
+
+ delta[len(delta):] = [' ' + x for x in l1[astart:a1]]
+ delta[len(delta):] = ['-' + x for x in old]
+ delta[len(delta):] = ['+' + x for x in new]
+
+ if hunk:
+ for x in yieldhunk(hunk):
+ yield x
+
+def patchtext(bin):
+ pos = 0
+ t = []
+ while pos < len(bin):
+ p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
+ pos += 12
+ t.append(bin[pos:pos + l])
+ pos += l
+ return "".join(t)
+
+def patch(a, bin):
+ if len(a) == 0:
+ # skip over trivial delta header
+ return util.buffer(bin, 12)
+ return mpatch.patches(a, [bin])
+
+# similar to difflib.SequenceMatcher.get_matching_blocks
+def get_matching_blocks(a, b):
+ return [(d[0], d[2], d[1] - d[0]) for d in bdiff.blocks(a, b)]
+
+def trivialdiffheader(length):
+ return struct.pack(">lll", 0, 0, length)
+
+patches = mpatch.patches
+patchedsize = mpatch.patchedsize
+textdiff = bdiff.bdiff
diff --git a/mercurial/merge.py b/mercurial/merge.py
new file mode 100644
index 0000000..19ffb28
--- /dev/null
+++ b/mercurial/merge.py
@@ -0,0 +1,622 @@
+# merge.py - directory-level update/merge handling for Mercurial
+#
+# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid, nullrev, hex, bin
+from i18n import _
+import error, scmutil, util, filemerge, copies, subrepo
+import errno, os, shutil
+
+class mergestate(object):
+ '''track 3-way merge state of individual files'''
+ def __init__(self, repo):
+ self._repo = repo
+ self._dirty = False
+ self._read()
+ def reset(self, node=None):
+ self._state = {}
+ if node:
+ self._local = node
+ shutil.rmtree(self._repo.join("merge"), True)
+ self._dirty = False
+ def _read(self):
+ self._state = {}
+ try:
+ f = self._repo.opener("merge/state")
+ for i, l in enumerate(f):
+ if i == 0:
+ self._local = bin(l[:-1])
+ else:
+ bits = l[:-1].split("\0")
+ self._state[bits[0]] = bits[1:]
+ f.close()
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ self._dirty = False
+ def commit(self):
+ if self._dirty:
+ f = self._repo.opener("merge/state", "w")
+ f.write(hex(self._local) + "\n")
+ for d, v in self._state.iteritems():
+ f.write("\0".join([d] + v) + "\n")
+ f.close()
+ self._dirty = False
+ def add(self, fcl, fco, fca, fd, flags):
+ hash = util.sha1(fcl.path()).hexdigest()
+ self._repo.opener.write("merge/" + hash, fcl.data())
+ self._state[fd] = ['u', hash, fcl.path(), fca.path(),
+ hex(fca.filenode()), fco.path(), flags]
+ self._dirty = True
+ def __contains__(self, dfile):
+ return dfile in self._state
+ def __getitem__(self, dfile):
+ return self._state[dfile][0]
+ def __iter__(self):
+ l = self._state.keys()
+ l.sort()
+ for f in l:
+ yield f
+ def mark(self, dfile, state):
+ self._state[dfile][0] = state
+ self._dirty = True
+ def resolve(self, dfile, wctx, octx):
+ if self[dfile] == 'r':
+ return 0
+ state, hash, lfile, afile, anode, ofile, flags = self._state[dfile]
+ f = self._repo.opener("merge/" + hash)
+ self._repo.wwrite(dfile, f.read(), flags)
+ f.close()
+ fcd = wctx[dfile]
+ fco = octx[ofile]
+ fca = self._repo.filectx(afile, fileid=anode)
+ r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca)
+ if r is None:
+ # no real conflict
+ del self._state[dfile]
+ elif not r:
+ self.mark(dfile, 'r')
+ return r
+
+def _checkunknownfile(repo, wctx, mctx, f):
+ return (not repo.dirstate._ignore(f)
+ and os.path.isfile(repo.wjoin(f))
+ and repo.dirstate.normalize(f) not in repo.dirstate
+ and mctx[f].cmp(wctx[f]))
+
+def _checkunknown(repo, wctx, mctx):
+ "check for collisions between unknown files and files in mctx"
+
+ error = False
+ for f in mctx:
+ if f not in wctx and _checkunknownfile(repo, wctx, mctx, f):
+ error = True
+ wctx._repo.ui.warn(_("%s: untracked file differs\n") % f)
+ if error:
+ raise util.Abort(_("untracked files in working directory differ "
+ "from files in requested revision"))
+
+def _checkcollision(mctx, wctx):
+ "check for case folding collisions in the destination context"
+ folded = {}
+ for fn in mctx:
+ fold = util.normcase(fn)
+ if fold in folded:
+ raise util.Abort(_("case-folding collision between %s and %s")
+ % (fn, folded[fold]))
+ folded[fold] = fn
+
+ if wctx:
+ # class to delay looking up copy mapping
+ class pathcopies(object):
+ @util.propertycache
+ def map(self):
+ # {dst@mctx: src@wctx} copy mapping
+ return copies.pathcopies(wctx, mctx)
+ pc = pathcopies()
+
+ for fn in wctx:
+ fold = util.normcase(fn)
+ mfn = folded.get(fold, None)
+ if mfn and mfn != fn and pc.map.get(mfn) != fn:
+ raise util.Abort(_("case-folding collision between %s and %s")
+ % (mfn, fn))
+
+def _forgetremoved(wctx, mctx, branchmerge):
+ """
+ Forget removed files
+
+ If we're jumping between revisions (as opposed to merging), and if
+ neither the working directory nor the target rev has the file,
+ then we need to remove it from the dirstate, to prevent the
+ dirstate from listing the file when it is no longer in the
+ manifest.
+
+ If we're merging, and the other revision has removed a file
+ that is not present in the working directory, we need to mark it
+ as removed.
+ """
+
+ action = []
+ state = branchmerge and 'r' or 'f'
+ for f in wctx.deleted():
+ if f not in mctx:
+ action.append((f, state))
+
+ if not branchmerge:
+ for f in wctx.removed():
+ if f not in mctx:
+ action.append((f, "f"))
+
+ return action
+
+def manifestmerge(repo, p1, p2, pa, overwrite, partial):
+ """
+ Merge p1 and p2 with ancestor pa and generate merge action list
+
+ overwrite = whether we clobber working files
+ partial = function to filter file lists
+ """
+
+ def fmerge(f, f2, fa):
+ """merge flags"""
+ a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2)
+ if m == n: # flags agree
+ return m # unchanged
+ if m and n and not a: # flags set, don't agree, differ from parent
+ r = repo.ui.promptchoice(
+ _(" conflicting flags for %s\n"
+ "(n)one, e(x)ec or sym(l)ink?") % f,
+ (_("&None"), _("E&xec"), _("Sym&link")), 0)
+ if r == 1:
+ return "x" # Exec
+ if r == 2:
+ return "l" # Symlink
+ return ""
+ if m and m != a: # changed from a to m
+ return m
+ if n and n != a: # changed from a to n
+ if (n == 'l' or a == 'l') and m1.get(f) != ma.get(f):
+ # can't automatically merge symlink flag when there
+ # are file-level conflicts here, let filemerge take
+ # care of it
+ return m
+ return n
+ return '' # flag was cleared
+
+ def act(msg, m, f, *args):
+ repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
+ action.append((f, m) + args)
+
+ action, copy = [], {}
+
+ if overwrite:
+ pa = p1
+ elif pa == p2: # backwards
+ pa = p1.p1()
+ elif pa and repo.ui.configbool("merge", "followcopies", True):
+ copy, diverge, renamedelete = copies.mergecopies(repo, p1, p2, pa)
+ for of, fl in diverge.iteritems():
+ act("divergent renames", "dr", of, fl)
+ for of, fl in renamedelete.iteritems():
+ act("rename and delete", "rd", of, fl)
+
+ repo.ui.note(_("resolving manifests\n"))
+ repo.ui.debug(" overwrite: %s, partial: %s\n"
+ % (bool(overwrite), bool(partial)))
+ repo.ui.debug(" ancestor: %s, local: %s, remote: %s\n" % (pa, p1, p2))
+
+ m1, m2, ma = p1.manifest(), p2.manifest(), pa.manifest()
+ copied = set(copy.values())
+
+ if '.hgsubstate' in m1:
+ # check whether sub state is modified
+ for s in p1.substate:
+ if p1.sub(s).dirty():
+ m1['.hgsubstate'] += "+"
+ break
+
+ # Compare manifests
+ for f, n in m1.iteritems():
+ if partial and not partial(f):
+ continue
+ if f in m2:
+ rflags = fmerge(f, f, f)
+ a = ma.get(f, nullid)
+ if n == m2[f] or m2[f] == a: # same or local newer
+ # is file locally modified or flags need changing?
+ # dirstate flags may need to be made current
+ if m1.flags(f) != rflags or n[20:]:
+ act("update permissions", "e", f, rflags)
+ elif n == a: # remote newer
+ act("remote is newer", "g", f, rflags)
+ else: # both changed
+ act("versions differ", "m", f, f, f, rflags, False)
+ elif f in copied: # files we'll deal with on m2 side
+ pass
+ elif f in copy:
+ f2 = copy[f]
+ if f2 not in m2: # directory rename
+ act("remote renamed directory to " + f2, "d",
+ f, None, f2, m1.flags(f))
+ else: # case 2 A,B/B/B or case 4,21 A/B/B
+ act("local copied/moved to " + f2, "m",
+ f, f2, f, fmerge(f, f2, f2), False)
+ elif f in ma: # clean, a different, no remote
+ if n != ma[f]:
+ if repo.ui.promptchoice(
+ _(" local changed %s which remote deleted\n"
+ "use (c)hanged version or (d)elete?") % f,
+ (_("&Changed"), _("&Delete")), 0):
+ act("prompt delete", "r", f)
+ else:
+ act("prompt keep", "a", f)
+ elif n[20:] == "a": # added, no remote
+ act("remote deleted", "f", f)
+ else:
+ act("other deleted", "r", f)
+
+ for f, n in m2.iteritems():
+ if partial and not partial(f):
+ continue
+ if f in m1 or f in copied: # files already visited
+ continue
+ if f in copy:
+ f2 = copy[f]
+ if f2 not in m1: # directory rename
+ act("local renamed directory to " + f2, "d",
+ None, f, f2, m2.flags(f))
+ elif f2 in m2: # rename case 1, A/A,B/A
+ act("remote copied to " + f, "m",
+ f2, f, f, fmerge(f2, f, f2), False)
+ else: # case 3,20 A/B/A
+ act("remote moved to " + f, "m",
+ f2, f, f, fmerge(f2, f, f2), True)
+ elif f not in ma:
+ if (not overwrite
+ and _checkunknownfile(repo, p1, p2, f)):
+ rflags = fmerge(f, f, f)
+ act("remote differs from untracked local",
+ "m", f, f, f, rflags, False)
+ else:
+ act("remote created", "g", f, m2.flags(f))
+ elif n != ma[f]:
+ if repo.ui.promptchoice(
+ _("remote changed %s which local deleted\n"
+ "use (c)hanged version or leave (d)eleted?") % f,
+ (_("&Changed"), _("&Deleted")), 0) == 0:
+ act("prompt recreating", "g", f, m2.flags(f))
+
+ return action
+
+def actionkey(a):
+ return a[1] == 'r' and -1 or 0, a
+
+def applyupdates(repo, action, wctx, mctx, actx, overwrite):
+ """apply the merge action list to the working directory
+
+ wctx is the working copy context
+ mctx is the context to be merged into the working copy
+ actx is the context of the common ancestor
+
+ Return a tuple of counts (updated, merged, removed, unresolved) that
+ describes how many files were affected by the update.
+ """
+
+ updated, merged, removed, unresolved = 0, 0, 0, 0
+ ms = mergestate(repo)
+ ms.reset(wctx.p1().node())
+ moves = []
+ action.sort(key=actionkey)
+
+ # prescan for merges
+ for a in action:
+ f, m = a[:2]
+ if m == 'm': # merge
+ f2, fd, flags, move = a[2:]
+ if f == '.hgsubstate': # merged internally
+ continue
+ repo.ui.debug("preserving %s for resolve of %s\n" % (f, fd))
+ fcl = wctx[f]
+ fco = mctx[f2]
+ if mctx == actx: # backwards, use working dir parent as ancestor
+ if fcl.parents():
+ fca = fcl.p1()
+ else:
+ fca = repo.filectx(f, fileid=nullrev)
+ else:
+ fca = fcl.ancestor(fco, actx)
+ if not fca:
+ fca = repo.filectx(f, fileid=nullrev)
+ ms.add(fcl, fco, fca, fd, flags)
+ if f != fd and move:
+ moves.append(f)
+
+ audit = scmutil.pathauditor(repo.root)
+
+ # remove renamed files after safely stored
+ for f in moves:
+ if os.path.lexists(repo.wjoin(f)):
+ repo.ui.debug("removing %s\n" % f)
+ audit(f)
+ os.unlink(repo.wjoin(f))
+
+ numupdates = len(action)
+ for i, a in enumerate(action):
+ f, m = a[:2]
+ repo.ui.progress(_('updating'), i + 1, item=f, total=numupdates,
+ unit=_('files'))
+ if f and f[0] == "/":
+ continue
+ if m == "r": # remove
+ repo.ui.note(_("removing %s\n") % f)
+ audit(f)
+ if f == '.hgsubstate': # subrepo states need updating
+ subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
+ try:
+ util.unlinkpath(repo.wjoin(f))
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ repo.ui.warn(_("update failed to remove %s: %s!\n") %
+ (f, inst.strerror))
+ removed += 1
+ elif m == "m": # merge
+ if f == '.hgsubstate': # subrepo states need updating
+ subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
+ overwrite)
+ continue
+ f2, fd, flags, move = a[2:]
+ repo.wopener.audit(fd)
+ r = ms.resolve(fd, wctx, mctx)
+ if r is not None and r > 0:
+ unresolved += 1
+ else:
+ if r is None:
+ updated += 1
+ else:
+ merged += 1
+ if (move and repo.dirstate.normalize(fd) != f
+ and os.path.lexists(repo.wjoin(f))):
+ repo.ui.debug("removing %s\n" % f)
+ audit(f)
+ os.unlink(repo.wjoin(f))
+ elif m == "g": # get
+ flags = a[2]
+ repo.ui.note(_("getting %s\n") % f)
+ t = mctx.filectx(f).data()
+ repo.wwrite(f, t, flags)
+ t = None
+ updated += 1
+ if f == '.hgsubstate': # subrepo states need updating
+ subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
+ elif m == "d": # directory rename
+ f2, fd, flags = a[2:]
+ if f:
+ repo.ui.note(_("moving %s to %s\n") % (f, fd))
+ audit(f)
+ t = wctx.filectx(f).data()
+ repo.wwrite(fd, t, flags)
+ util.unlinkpath(repo.wjoin(f))
+ if f2:
+ repo.ui.note(_("getting %s to %s\n") % (f2, fd))
+ t = mctx.filectx(f2).data()
+ repo.wwrite(fd, t, flags)
+ updated += 1
+ elif m == "dr": # divergent renames
+ fl = a[2]
+ repo.ui.warn(_("note: possible conflict - %s was renamed "
+ "multiple times to:\n") % f)
+ for nf in fl:
+ repo.ui.warn(" %s\n" % nf)
+ elif m == "rd": # rename and delete
+ fl = a[2]
+ repo.ui.warn(_("note: possible conflict - %s was deleted "
+ "and renamed to:\n") % f)
+ for nf in fl:
+ repo.ui.warn(" %s\n" % nf)
+ elif m == "e": # exec
+ flags = a[2]
+ repo.wopener.audit(f)
+ util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags)
+ ms.commit()
+ repo.ui.progress(_('updating'), None, total=numupdates, unit=_('files'))
+
+ return updated, merged, removed, unresolved
+
+def recordupdates(repo, action, branchmerge):
+ "record merge actions to the dirstate"
+
+ for a in action:
+ f, m = a[:2]
+ if m == "r": # remove
+ if branchmerge:
+ repo.dirstate.remove(f)
+ else:
+ repo.dirstate.drop(f)
+ elif m == "a": # re-add
+ if not branchmerge:
+ repo.dirstate.add(f)
+ elif m == "f": # forget
+ repo.dirstate.drop(f)
+ elif m == "e": # exec change
+ repo.dirstate.normallookup(f)
+ elif m == "g": # get
+ if branchmerge:
+ repo.dirstate.otherparent(f)
+ else:
+ repo.dirstate.normal(f)
+ elif m == "m": # merge
+ f2, fd, flag, move = a[2:]
+ if branchmerge:
+ # We've done a branch merge, mark this file as merged
+ # so that we properly record the merger later
+ repo.dirstate.merge(fd)
+ if f != f2: # copy/rename
+ if move:
+ repo.dirstate.remove(f)
+ if f != fd:
+ repo.dirstate.copy(f, fd)
+ else:
+ repo.dirstate.copy(f2, fd)
+ else:
+ # We've update-merged a locally modified file, so
+ # we set the dirstate to emulate a normal checkout
+ # of that file some time in the past. Thus our
+ # merge will appear as a normal local file
+ # modification.
+ if f2 == fd: # file not locally copied/moved
+ repo.dirstate.normallookup(fd)
+ if move:
+ repo.dirstate.drop(f)
+ elif m == "d": # directory rename
+ f2, fd, flag = a[2:]
+ if not f2 and f not in repo.dirstate:
+ # untracked file moved
+ continue
+ if branchmerge:
+ repo.dirstate.add(fd)
+ if f:
+ repo.dirstate.remove(f)
+ repo.dirstate.copy(f, fd)
+ if f2:
+ repo.dirstate.copy(f2, fd)
+ else:
+ repo.dirstate.normal(fd)
+ if f:
+ repo.dirstate.drop(f)
+
+def update(repo, node, branchmerge, force, partial, ancestor=None,
+ mergeancestor=False):
+ """
+ Perform a merge between the working directory and the given node
+
+ node = the node to update to, or None if unspecified
+ branchmerge = whether to merge between branches
+ force = whether to force branch merging or file overwriting
+ partial = a function to filter file lists (dirstate not updated)
+ mergeancestor = if false, merging with an ancestor (fast-forward)
+ is only allowed between different named branches. This flag
+ is used by rebase extension as a temporary fix and should be
+ avoided in general.
+
+ The table below shows all the behaviors of the update command
+ given the -c and -C or no options, whether the working directory
+ is dirty, whether a revision is specified, and the relationship of
+ the parent rev to the target rev (linear, on the same named
+ branch, or on another named branch).
+
+ This logic is tested by test-update-branches.t.
+
+ -c -C dirty rev | linear same cross
+ n n n n | ok (1) x
+ n n n y | ok ok ok
+ n n y * | merge (2) (2)
+ n y * * | --- discard ---
+ y n y * | --- (3) ---
+ y n n * | --- ok ---
+ y y * * | --- (4) ---
+
+ x = can't happen
+ * = don't-care
+ 1 = abort: crosses branches (use 'hg merge' or 'hg update -c')
+ 2 = abort: crosses branches (use 'hg merge' to merge or
+ use 'hg update -C' to discard changes)
+ 3 = abort: uncommitted local changes
+ 4 = incompatible options (checked in commands.py)
+
+ Return the same tuple as applyupdates().
+ """
+
+ onode = node
+ wlock = repo.wlock()
+ try:
+ wc = repo[None]
+ if node is None:
+ # tip of current branch
+ try:
+ node = repo.branchtip(wc.branch())
+ except error.RepoLookupError:
+ if wc.branch() == "default": # no default branch!
+ node = repo.lookup("tip") # update to tip
+ else:
+ raise util.Abort(_("branch %s not found") % wc.branch())
+ overwrite = force and not branchmerge
+ pl = wc.parents()
+ p1, p2 = pl[0], repo[node]
+ if ancestor:
+ pa = repo[ancestor]
+ else:
+ pa = p1.ancestor(p2)
+
+ fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
+
+ ### check phase
+ if not overwrite and len(pl) > 1:
+ raise util.Abort(_("outstanding uncommitted merges"))
+ if branchmerge:
+ if pa == p2:
+ raise util.Abort(_("merging with a working directory ancestor"
+ " has no effect"))
+ elif pa == p1:
+ if not mergeancestor and p1.branch() == p2.branch():
+ raise util.Abort(_("nothing to merge"),
+ hint=_("use 'hg update' "
+ "or check 'hg heads'"))
+ if not force and (wc.files() or wc.deleted()):
+ raise util.Abort(_("outstanding uncommitted changes"),
+ hint=_("use 'hg status' to list changes"))
+ for s in wc.substate:
+ if wc.sub(s).dirty():
+ raise util.Abort(_("outstanding uncommitted changes in "
+ "subrepository '%s'") % s)
+
+ elif not overwrite:
+ if pa == p1 or pa == p2: # linear
+ pass # all good
+ elif wc.dirty(missing=True):
+ raise util.Abort(_("crosses branches (merge branches or use"
+ " --clean to discard changes)"))
+ elif onode is None:
+ raise util.Abort(_("crosses branches (merge branches or update"
+ " --check to force update)"))
+ else:
+ # Allow jumping branches if clean and specific rev given
+ pa = p1
+
+ ### calculate phase
+ action = []
+ folding = not util.checkcase(repo.path)
+ if folding:
+ # collision check is not needed for clean update
+ if (not branchmerge and
+ (force or not wc.dirty(missing=True, branch=False))):
+ _checkcollision(p2, None)
+ else:
+ _checkcollision(p2, wc)
+ if not force:
+ _checkunknown(repo, wc, p2)
+ action += _forgetremoved(wc, p2, branchmerge)
+ action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
+
+ ### apply phase
+ if not branchmerge: # just jump to the new rev
+ fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
+ if not partial:
+ repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
+
+ stats = applyupdates(repo, action, wc, p2, pa, overwrite)
+
+ if not partial:
+ repo.setparents(fp1, fp2)
+ recordupdates(repo, action, branchmerge)
+ if not branchmerge:
+ repo.dirstate.setbranch(p2.branch())
+ finally:
+ wlock.release()
+
+ if not partial:
+ repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
+ return stats
diff --git a/mercurial/minirst.py b/mercurial/minirst.py
new file mode 100644
index 0000000..0586213
--- /dev/null
+++ b/mercurial/minirst.py
@@ -0,0 +1,677 @@
+# minirst.py - minimal reStructuredText parser
+#
+# Copyright 2009, 2010 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""simplified reStructuredText parser.
+
+This parser knows just enough about reStructuredText to parse the
+Mercurial docstrings.
+
+It cheats in a major way: nested blocks are not really nested. They
+are just indented blocks that look like they are nested. This relies
+on the user to keep the right indentation for the blocks.
+
+Remember to update http://mercurial.selenic.com/wiki/HelpStyleGuide
+when adding support for new constructs.
+"""
+
+import re
+import util, encoding
+from i18n import _
+
+def replace(text, substs):
+ '''
+ Apply a list of (find, replace) pairs to a text.
+
+ >>> replace("foo bar", [('f', 'F'), ('b', 'B')])
+ 'Foo Bar'
+ >>> encoding.encoding = 'latin1'
+ >>> replace('\\x81\\\\', [('\\\\', '/')])
+ '\\x81/'
+ >>> encoding.encoding = 'shiftjis'
+ >>> replace('\\x81\\\\', [('\\\\', '/')])
+ '\\x81\\\\'
+ '''
+
+ # some character encodings (cp932 for Japanese, at least) use
+ # ASCII characters other than control/alphabet/digit as a part of
+ # multi-bytes characters, so direct replacing with such characters
+ # on strings in local encoding causes invalid byte sequences.
+ utext = text.decode(encoding.encoding)
+ for f, t in substs:
+ utext = utext.replace(f, t)
+ return utext.encode(encoding.encoding)
+
+_blockre = re.compile(r"\n(?:\s*\n)+")
+
+def findblocks(text):
+ """Find continuous blocks of lines in text.
+
+ Returns a list of dictionaries representing the blocks. Each block
+ has an 'indent' field and a 'lines' field.
+ """
+ blocks = []
+ for b in _blockre.split(text.lstrip('\n').rstrip()):
+ lines = b.splitlines()
+ if lines:
+ indent = min((len(l) - len(l.lstrip())) for l in lines)
+ lines = [l[indent:] for l in lines]
+ blocks.append(dict(indent=indent, lines=lines))
+ return blocks
+
+def findliteralblocks(blocks):
+ """Finds literal blocks and adds a 'type' field to the blocks.
+
+ Literal blocks are given the type 'literal', all other blocks are
+ given type the 'paragraph'.
+ """
+ i = 0
+ while i < len(blocks):
+ # Searching for a block that looks like this:
+ #
+ # +------------------------------+
+ # | paragraph |
+ # | (ends with "::") |
+ # +------------------------------+
+ # +---------------------------+
+ # | indented literal block |
+ # +---------------------------+
+ blocks[i]['type'] = 'paragraph'
+ if blocks[i]['lines'][-1].endswith('::') and i + 1 < len(blocks):
+ indent = blocks[i]['indent']
+ adjustment = blocks[i + 1]['indent'] - indent
+
+ if blocks[i]['lines'] == ['::']:
+ # Expanded form: remove block
+ del blocks[i]
+ i -= 1
+ elif blocks[i]['lines'][-1].endswith(' ::'):
+ # Partially minimized form: remove space and both
+ # colons.
+ blocks[i]['lines'][-1] = blocks[i]['lines'][-1][:-3]
+ else:
+ # Fully minimized form: remove just one colon.
+ blocks[i]['lines'][-1] = blocks[i]['lines'][-1][:-1]
+
+ # List items are formatted with a hanging indent. We must
+ # correct for this here while we still have the original
+ # information on the indentation of the subsequent literal
+ # blocks available.
+ m = _bulletre.match(blocks[i]['lines'][0])
+ if m:
+ indent += m.end()
+ adjustment -= m.end()
+
+ # Mark the following indented blocks.
+ while i + 1 < len(blocks) and blocks[i + 1]['indent'] > indent:
+ blocks[i + 1]['type'] = 'literal'
+ blocks[i + 1]['indent'] -= adjustment
+ i += 1
+ i += 1
+ return blocks
+
+_bulletre = re.compile(r'(-|[0-9A-Za-z]+\.|\(?[0-9A-Za-z]+\)|\|) ')
+_optionre = re.compile(r'^(-([a-zA-Z0-9]), )?(--[a-z0-9-]+)'
+ r'((.*) +)(.*)$')
+_fieldre = re.compile(r':(?![: ])([^:]*)(?<! ):[ ]+(.*)')
+_definitionre = re.compile(r'[^ ]')
+_tablere = re.compile(r'(=+\s+)*=+')
+
+def splitparagraphs(blocks):
+ """Split paragraphs into lists."""
+ # Tuples with (list type, item regexp, single line items?). Order
+ # matters: definition lists has the least specific regexp and must
+ # come last.
+ listtypes = [('bullet', _bulletre, True),
+ ('option', _optionre, True),
+ ('field', _fieldre, True),
+ ('definition', _definitionre, False)]
+
+ def match(lines, i, itemre, singleline):
+ """Does itemre match an item at line i?
+
+ A list item can be followed by an idented line or another list
+ item (but only if singleline is True).
+ """
+ line1 = lines[i]
+ line2 = i + 1 < len(lines) and lines[i + 1] or ''
+ if not itemre.match(line1):
+ return False
+ if singleline:
+ return line2 == '' or line2[0] == ' ' or itemre.match(line2)
+ else:
+ return line2.startswith(' ')
+
+ i = 0
+ while i < len(blocks):
+ if blocks[i]['type'] == 'paragraph':
+ lines = blocks[i]['lines']
+ for type, itemre, singleline in listtypes:
+ if match(lines, 0, itemre, singleline):
+ items = []
+ for j, line in enumerate(lines):
+ if match(lines, j, itemre, singleline):
+ items.append(dict(type=type, lines=[],
+ indent=blocks[i]['indent']))
+ items[-1]['lines'].append(line)
+ blocks[i:i + 1] = items
+ break
+ i += 1
+ return blocks
+
+_fieldwidth = 14
+
+def updatefieldlists(blocks):
+ """Find key for field lists."""
+ i = 0
+ while i < len(blocks):
+ if blocks[i]['type'] != 'field':
+ i += 1
+ continue
+
+ j = i
+ while j < len(blocks) and blocks[j]['type'] == 'field':
+ m = _fieldre.match(blocks[j]['lines'][0])
+ key, rest = m.groups()
+ blocks[j]['lines'][0] = rest
+ blocks[j]['key'] = key
+ j += 1
+
+ i = j + 1
+
+ return blocks
+
+def updateoptionlists(blocks):
+ i = 0
+ while i < len(blocks):
+ if blocks[i]['type'] != 'option':
+ i += 1
+ continue
+
+ optstrwidth = 0
+ j = i
+ while j < len(blocks) and blocks[j]['type'] == 'option':
+ m = _optionre.match(blocks[j]['lines'][0])
+
+ shortoption = m.group(2)
+ group3 = m.group(3)
+ longoption = group3[2:].strip()
+ desc = m.group(6).strip()
+ longoptionarg = m.group(5).strip()
+ blocks[j]['lines'][0] = desc
+
+ noshortop = ''
+ if not shortoption:
+ noshortop = ' '
+
+ opt = "%s%s" % (shortoption and "-%s " % shortoption or '',
+ ("%s--%s %s") % (noshortop, longoption,
+ longoptionarg))
+ opt = opt.rstrip()
+ blocks[j]['optstr'] = opt
+ optstrwidth = max(optstrwidth, encoding.colwidth(opt))
+ j += 1
+
+ for block in blocks[i:j]:
+ block['optstrwidth'] = optstrwidth
+ i = j + 1
+ return blocks
+
+def prunecontainers(blocks, keep):
+ """Prune unwanted containers.
+
+ The blocks must have a 'type' field, i.e., they should have been
+ run through findliteralblocks first.
+ """
+ pruned = []
+ i = 0
+ while i + 1 < len(blocks):
+ # Searching for a block that looks like this:
+ #
+ # +-------+---------------------------+
+ # | ".. container ::" type |
+ # +---+ |
+ # | blocks |
+ # +-------------------------------+
+ if (blocks[i]['type'] == 'paragraph' and
+ blocks[i]['lines'][0].startswith('.. container::')):
+ indent = blocks[i]['indent']
+ adjustment = blocks[i + 1]['indent'] - indent
+ containertype = blocks[i]['lines'][0][15:]
+ prune = containertype not in keep
+ if prune:
+ pruned.append(containertype)
+
+ # Always delete "..container:: type" block
+ del blocks[i]
+ j = i
+ i -= 1
+ while j < len(blocks) and blocks[j]['indent'] > indent:
+ if prune:
+ del blocks[j]
+ else:
+ blocks[j]['indent'] -= adjustment
+ j += 1
+ i += 1
+ return blocks, pruned
+
+_sectionre = re.compile(r"""^([-=`:.'"~^_*+#])\1+$""")
+
+def findtables(blocks):
+ '''Find simple tables
+
+ Only simple one-line table elements are supported
+ '''
+
+ for block in blocks:
+ # Searching for a block that looks like this:
+ #
+ # === ==== ===
+ # A B C
+ # === ==== === <- optional
+ # 1 2 3
+ # x y z
+ # === ==== ===
+ if (block['type'] == 'paragraph' and
+ len(block['lines']) > 2 and
+ _tablere.match(block['lines'][0]) and
+ block['lines'][0] == block['lines'][-1]):
+ block['type'] = 'table'
+ block['header'] = False
+ div = block['lines'][0]
+
+ # column markers are ASCII so we can calculate column
+ # position in bytes
+ columns = [x for x in xrange(len(div))
+ if div[x] == '=' and (x == 0 or div[x - 1] == ' ')]
+ rows = []
+ for l in block['lines'][1:-1]:
+ if l == div:
+ block['header'] = True
+ continue
+ row = []
+ # we measure columns not in bytes or characters but in
+ # colwidth which makes things tricky
+ pos = columns[0] # leading whitespace is bytes
+ for n, start in enumerate(columns):
+ if n + 1 < len(columns):
+ width = columns[n + 1] - start
+ v = encoding.getcols(l, pos, width) # gather columns
+ pos += len(v) # calculate byte position of end
+ row.append(v.strip())
+ else:
+ row.append(l[pos:].strip())
+ rows.append(row)
+
+ block['table'] = rows
+
+ return blocks
+
+def findsections(blocks):
+ """Finds sections.
+
+ The blocks must have a 'type' field, i.e., they should have been
+ run through findliteralblocks first.
+ """
+ for block in blocks:
+ # Searching for a block that looks like this:
+ #
+ # +------------------------------+
+ # | Section title |
+ # | ------------- |
+ # +------------------------------+
+ if (block['type'] == 'paragraph' and
+ len(block['lines']) == 2 and
+ encoding.colwidth(block['lines'][0]) == len(block['lines'][1]) and
+ _sectionre.match(block['lines'][1])):
+ block['underline'] = block['lines'][1][0]
+ block['type'] = 'section'
+ del block['lines'][1]
+ return blocks
+
+def inlineliterals(blocks):
+ substs = [('``', '"')]
+ for b in blocks:
+ if b['type'] in ('paragraph', 'section'):
+ b['lines'] = [replace(l, substs) for l in b['lines']]
+ return blocks
+
+def hgrole(blocks):
+ substs = [(':hg:`', '"hg '), ('`', '"')]
+ for b in blocks:
+ if b['type'] in ('paragraph', 'section'):
+ # Turn :hg:`command` into "hg command". This also works
+ # when there is a line break in the command and relies on
+ # the fact that we have no stray back-quotes in the input
+ # (run the blocks through inlineliterals first).
+ b['lines'] = [replace(l, substs) for l in b['lines']]
+ return blocks
+
+def addmargins(blocks):
+ """Adds empty blocks for vertical spacing.
+
+ This groups bullets, options, and definitions together with no vertical
+ space between them, and adds an empty block between all other blocks.
+ """
+ i = 1
+ while i < len(blocks):
+ if (blocks[i]['type'] == blocks[i - 1]['type'] and
+ blocks[i]['type'] in ('bullet', 'option', 'field')):
+ i += 1
+ else:
+ blocks.insert(i, dict(lines=[''], indent=0, type='margin'))
+ i += 2
+ return blocks
+
+def prunecomments(blocks):
+ """Remove comments."""
+ i = 0
+ while i < len(blocks):
+ b = blocks[i]
+ if b['type'] == 'paragraph' and (b['lines'][0].startswith('.. ') or
+ b['lines'] == ['..']):
+ del blocks[i]
+ if i < len(blocks) and blocks[i]['type'] == 'margin':
+ del blocks[i]
+ else:
+ i += 1
+ return blocks
+
+_admonitionre = re.compile(r"\.\. (admonition|attention|caution|danger|"
+ r"error|hint|important|note|tip|warning)::",
+ flags=re.IGNORECASE)
+
+def findadmonitions(blocks):
+ """
+ Makes the type of the block an admonition block if
+ the first line is an admonition directive
+ """
+ i = 0
+ while i < len(blocks):
+ m = _admonitionre.match(blocks[i]['lines'][0])
+ if m:
+ blocks[i]['type'] = 'admonition'
+ admonitiontitle = blocks[i]['lines'][0][3:m.end() - 2].lower()
+
+ firstline = blocks[i]['lines'][0][m.end() + 1:]
+ if firstline:
+ blocks[i]['lines'].insert(1, ' ' + firstline)
+
+ blocks[i]['admonitiontitle'] = admonitiontitle
+ del blocks[i]['lines'][0]
+ i = i + 1
+ return blocks
+
+_admonitiontitles = {'attention': _('Attention:'),
+ 'caution': _('Caution:'),
+ 'danger': _('!Danger!') ,
+ 'error': _('Error:'),
+ 'hint': _('Hint:'),
+ 'important': _('Important:'),
+ 'note': _('Note:'),
+ 'tip': _('Tip:'),
+ 'warning': _('Warning!')}
+
+def formatoption(block, width):
+ desc = ' '.join(map(str.strip, block['lines']))
+ colwidth = encoding.colwidth(block['optstr'])
+ usablewidth = width - 1
+ hanging = block['optstrwidth']
+ initindent = '%s%s ' % (block['optstr'], ' ' * ((hanging - colwidth)))
+ hangindent = ' ' * (encoding.colwidth(initindent) + 1)
+ return ' %s\n' % (util.wrap(desc, usablewidth,
+ initindent=initindent,
+ hangindent=hangindent))
+
+def formatblock(block, width):
+ """Format a block according to width."""
+ if width <= 0:
+ width = 78
+ indent = ' ' * block['indent']
+ if block['type'] == 'admonition':
+ admonition = _admonitiontitles[block['admonitiontitle']]
+ hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip())
+
+ defindent = indent + hang * ' '
+ text = ' '.join(map(str.strip, block['lines']))
+ return '%s\n%s\n' % (indent + admonition,
+ util.wrap(text, width=width,
+ initindent=defindent,
+ hangindent=defindent))
+ if block['type'] == 'margin':
+ return '\n'
+ if block['type'] == 'literal':
+ indent += ' '
+ return indent + ('\n' + indent).join(block['lines']) + '\n'
+ if block['type'] == 'section':
+ underline = encoding.colwidth(block['lines'][0]) * block['underline']
+ return "%s%s\n%s%s\n" % (indent, block['lines'][0],indent, underline)
+ if block['type'] == 'table':
+ table = block['table']
+ # compute column widths
+ widths = [max([encoding.colwidth(e) for e in c]) for c in zip(*table)]
+ text = ''
+ span = sum(widths) + len(widths) - 1
+ indent = ' ' * block['indent']
+ hang = ' ' * (len(indent) + span - widths[-1])
+
+ for row in table:
+ l = []
+ for w, v in zip(widths, row):
+ pad = ' ' * (w - encoding.colwidth(v))
+ l.append(v + pad)
+ l = ' '.join(l)
+ l = util.wrap(l, width=width, initindent=indent, hangindent=hang)
+ if not text and block['header']:
+ text = l + '\n' + indent + '-' * (min(width, span)) + '\n'
+ else:
+ text += l + "\n"
+ return text
+ if block['type'] == 'definition':
+ term = indent + block['lines'][0]
+ hang = len(block['lines'][-1]) - len(block['lines'][-1].lstrip())
+ defindent = indent + hang * ' '
+ text = ' '.join(map(str.strip, block['lines'][1:]))
+ return '%s\n%s\n' % (term, util.wrap(text, width=width,
+ initindent=defindent,
+ hangindent=defindent))
+ subindent = indent
+ if block['type'] == 'bullet':
+ if block['lines'][0].startswith('| '):
+ # Remove bullet for line blocks and add no extra
+ # indention.
+ block['lines'][0] = block['lines'][0][2:]
+ else:
+ m = _bulletre.match(block['lines'][0])
+ subindent = indent + m.end() * ' '
+ elif block['type'] == 'field':
+ key = block['key']
+ subindent = indent + _fieldwidth * ' '
+ if len(key) + 2 > _fieldwidth:
+ # key too large, use full line width
+ key = key.ljust(width)
+ else:
+ # key fits within field width
+ key = key.ljust(_fieldwidth)
+ block['lines'][0] = key + block['lines'][0]
+ elif block['type'] == 'option':
+ return formatoption(block, width)
+
+ text = ' '.join(map(str.strip, block['lines']))
+ return util.wrap(text, width=width,
+ initindent=indent,
+ hangindent=subindent) + '\n'
+
+def formathtml(blocks):
+ """Format RST blocks as HTML"""
+
+ out = []
+ headernest = ''
+ listnest = []
+
+ def openlist(start, level):
+ if not listnest or listnest[-1][0] != start:
+ listnest.append((start, level))
+ out.append('<%s>\n' % start)
+
+ blocks = [b for b in blocks if b['type'] != 'margin']
+
+ for pos, b in enumerate(blocks):
+ btype = b['type']
+ level = b['indent']
+ lines = b['lines']
+
+ if btype == 'admonition':
+ admonition = _admonitiontitles[b['admonitiontitle']]
+ text = ' '.join(map(str.strip, lines))
+ out.append('<p>\n<b>%s</b> %s\n</p>\n' % (admonition, text))
+ elif btype == 'paragraph':
+ out.append('<p>\n%s\n</p>\n' % '\n'.join(lines))
+ elif btype == 'margin':
+ pass
+ elif btype == 'literal':
+ out.append('<pre>\n%s\n</pre>\n' % '\n'.join(lines))
+ elif btype == 'section':
+ i = b['underline']
+ if i not in headernest:
+ headernest += i
+ level = headernest.index(i) + 1
+ out.append('<h%d>%s</h%d>\n' % (level, lines[0], level))
+ elif btype == 'table':
+ table = b['table']
+ t = []
+ for row in table:
+ l = []
+ for v in zip(row):
+ if not t:
+ l.append('<th>%s</th>' % v)
+ else:
+ l.append('<td>%s</td>' % v)
+ t.append(' <tr>%s</tr>\n' % ''.join(l))
+ out.append('<table>\n%s</table>\n' % ''.join(t))
+ elif btype == 'definition':
+ openlist('dl', level)
+ term = lines[0]
+ text = ' '.join(map(str.strip, lines[1:]))
+ out.append(' <dt>%s\n <dd>%s\n' % (term, text))
+ elif btype == 'bullet':
+ bullet, head = lines[0].split(' ', 1)
+ if bullet == '-':
+ openlist('ul', level)
+ else:
+ openlist('ol', level)
+ out.append(' <li> %s\n' % ' '.join([head] + lines[1:]))
+ elif btype == 'field':
+ openlist('dl', level)
+ key = b['key']
+ text = ' '.join(map(str.strip, lines))
+ out.append(' <dt>%s\n <dd>%s\n' % (key, text))
+ elif btype == 'option':
+ openlist('dl', level)
+ opt = b['optstr']
+ desc = ' '.join(map(str.strip, lines))
+ out.append(' <dt>%s\n <dd>%s\n' % (opt, desc))
+
+ # close lists if indent level of next block is lower
+ if listnest:
+ start, level = listnest[-1]
+ if pos == len(blocks) - 1:
+ out.append('</%s>\n' % start)
+ listnest.pop()
+ else:
+ nb = blocks[pos + 1]
+ ni = nb['indent']
+ if (ni < level or
+ (ni == level and
+ nb['type'] not in 'definition bullet field option')):
+ out.append('</%s>\n' % start)
+ listnest.pop()
+
+ return ''.join(out)
+
+def parse(text, indent=0, keep=None):
+ """Parse text into a list of blocks"""
+ pruned = []
+ blocks = findblocks(text)
+ for b in blocks:
+ b['indent'] += indent
+ blocks = findliteralblocks(blocks)
+ blocks = findtables(blocks)
+ blocks, pruned = prunecontainers(blocks, keep or [])
+ blocks = findsections(blocks)
+ blocks = inlineliterals(blocks)
+ blocks = hgrole(blocks)
+ blocks = splitparagraphs(blocks)
+ blocks = updatefieldlists(blocks)
+ blocks = updateoptionlists(blocks)
+ blocks = addmargins(blocks)
+ blocks = prunecomments(blocks)
+ blocks = findadmonitions(blocks)
+ return blocks, pruned
+
+def formatblocks(blocks, width):
+ text = ''.join(formatblock(b, width) for b in blocks)
+ return text
+
+def format(text, width=80, indent=0, keep=None, style='plain'):
+ """Parse and format the text according to width."""
+ blocks, pruned = parse(text, indent, keep or [])
+ if style == 'html':
+ text = formathtml(blocks)
+ else:
+ text = ''.join(formatblock(b, width) for b in blocks)
+ if keep is None:
+ return text
+ else:
+ return text, pruned
+
+def getsections(blocks):
+ '''return a list of (section name, nesting level, blocks) tuples'''
+ nest = ""
+ level = 0
+ secs = []
+ for b in blocks:
+ if b['type'] == 'section':
+ i = b['underline']
+ if i not in nest:
+ nest += i
+ level = nest.index(i) + 1
+ nest = nest[:level]
+ secs.append((b['lines'][0], level, [b]))
+ else:
+ if not secs:
+ # add an initial empty section
+ secs = [('', 0, [])]
+ secs[-1][2].append(b)
+ return secs
+
+def decorateblocks(blocks, width):
+ '''generate a list of (section name, line text) pairs for search'''
+ lines = []
+ for s in getsections(blocks):
+ section = s[0]
+ text = formatblocks(s[2], width)
+ lines.append([(section, l) for l in text.splitlines(True)])
+ return lines
+
+def maketable(data, indent=0, header=False):
+ '''Generate an RST table for the given table data as a list of lines'''
+
+ widths = [max(encoding.colwidth(e) for e in c) for c in zip(*data)]
+ indent = ' ' * indent
+ div = indent + ' '.join('=' * w for w in widths) + '\n'
+
+ out = [div]
+ for row in data:
+ l = []
+ for w, v in zip(widths, row):
+ pad = ' ' * (w - encoding.colwidth(v))
+ l.append(v + pad)
+ out.append(indent + ' '.join(l) + "\n")
+ if header and len(data) > 1:
+ out.insert(2, div)
+ out.append(div)
+ return out
diff --git a/mercurial/mpatch.c b/mercurial/mpatch.c
new file mode 100644
index 0000000..ab429b5
--- /dev/null
+++ b/mercurial/mpatch.c
@@ -0,0 +1,429 @@
+/*
+ mpatch.c - efficient binary patching for Mercurial
+
+ This implements a patch algorithm that's O(m + nlog n) where m is the
+ size of the output and n is the number of patches.
+
+ Given a list of binary patches, it unpacks each into a hunk list,
+ then combines the hunk lists with a treewise recursion to form a
+ single hunk list. This hunk list is then applied to the original
+ text.
+
+ The text (or binary) fragments are copied directly from their source
+ Python objects into a preallocated output string to avoid the
+ allocation of intermediate Python objects. Working memory is about 2x
+ the total number of hunks.
+
+ Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+
+ This software may be used and distributed according to the terms
+ of the GNU General Public License, incorporated herein by reference.
+*/
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "util.h"
+
+static char mpatch_doc[] = "Efficient binary patching.";
+static PyObject *mpatch_Error;
+
+struct frag {
+ int start, end, len;
+ const char *data;
+};
+
+struct flist {
+ struct frag *base, *head, *tail;
+};
+
+static struct flist *lalloc(Py_ssize_t size)
+{
+ struct flist *a = NULL;
+
+ if (size < 1)
+ size = 1;
+
+ a = (struct flist *)malloc(sizeof(struct flist));
+ if (a) {
+ a->base = (struct frag *)malloc(sizeof(struct frag) * size);
+ if (a->base) {
+ a->head = a->tail = a->base;
+ return a;
+ }
+ free(a);
+ a = NULL;
+ }
+ if (!PyErr_Occurred())
+ PyErr_NoMemory();
+ return NULL;
+}
+
+static void lfree(struct flist *a)
+{
+ if (a) {
+ free(a->base);
+ free(a);
+ }
+}
+
+static Py_ssize_t lsize(struct flist *a)
+{
+ return a->tail - a->head;
+}
+
+/* move hunks in source that are less cut to dest, compensating
+ for changes in offset. the last hunk may be split if necessary.
+*/
+static int gather(struct flist *dest, struct flist *src, int cut, int offset)
+{
+ struct frag *d = dest->tail, *s = src->head;
+ int postend, c, l;
+
+ while (s != src->tail) {
+ if (s->start + offset >= cut)
+ break; /* we've gone far enough */
+
+ postend = offset + s->start + s->len;
+ if (postend <= cut) {
+ /* save this hunk */
+ offset += s->start + s->len - s->end;
+ *d++ = *s++;
+ }
+ else {
+ /* break up this hunk */
+ c = cut - offset;
+ if (s->end < c)
+ c = s->end;
+ l = cut - offset - s->start;
+ if (s->len < l)
+ l = s->len;
+
+ offset += s->start + l - c;
+
+ d->start = s->start;
+ d->end = c;
+ d->len = l;
+ d->data = s->data;
+ d++;
+ s->start = c;
+ s->len = s->len - l;
+ s->data = s->data + l;
+
+ break;
+ }
+ }
+
+ dest->tail = d;
+ src->head = s;
+ return offset;
+}
+
+/* like gather, but with no output list */
+static int discard(struct flist *src, int cut, int offset)
+{
+ struct frag *s = src->head;
+ int postend, c, l;
+
+ while (s != src->tail) {
+ if (s->start + offset >= cut)
+ break;
+
+ postend = offset + s->start + s->len;
+ if (postend <= cut) {
+ offset += s->start + s->len - s->end;
+ s++;
+ }
+ else {
+ c = cut - offset;
+ if (s->end < c)
+ c = s->end;
+ l = cut - offset - s->start;
+ if (s->len < l)
+ l = s->len;
+
+ offset += s->start + l - c;
+ s->start = c;
+ s->len = s->len - l;
+ s->data = s->data + l;
+
+ break;
+ }
+ }
+
+ src->head = s;
+ return offset;
+}
+
+/* combine hunk lists a and b, while adjusting b for offset changes in a/
+ this deletes a and b and returns the resultant list. */
+static struct flist *combine(struct flist *a, struct flist *b)
+{
+ struct flist *c = NULL;
+ struct frag *bh, *ct;
+ int offset = 0, post;
+
+ if (a && b)
+ c = lalloc((lsize(a) + lsize(b)) * 2);
+
+ if (c) {
+
+ for (bh = b->head; bh != b->tail; bh++) {
+ /* save old hunks */
+ offset = gather(c, a, bh->start, offset);
+
+ /* discard replaced hunks */
+ post = discard(a, bh->end, offset);
+
+ /* insert new hunk */
+ ct = c->tail;
+ ct->start = bh->start - offset;
+ ct->end = bh->end - post;
+ ct->len = bh->len;
+ ct->data = bh->data;
+ c->tail++;
+ offset = post;
+ }
+
+ /* hold on to tail from a */
+ memcpy(c->tail, a->head, sizeof(struct frag) * lsize(a));
+ c->tail += lsize(a);
+ }
+
+ lfree(a);
+ lfree(b);
+ return c;
+}
+
+/* decode a binary patch into a hunk list */
+static struct flist *decode(const char *bin, Py_ssize_t len)
+{
+ struct flist *l;
+ struct frag *lt;
+ const char *data = bin + 12, *end = bin + len;
+
+ /* assume worst case size, we won't have many of these lists */
+ l = lalloc(len / 12);
+ if (!l)
+ return NULL;
+
+ lt = l->tail;
+
+ while (data <= end) {
+ lt->start = getbe32(bin);
+ lt->end = getbe32(bin + 4);
+ lt->len = getbe32(bin + 8);
+ if (lt->start > lt->end)
+ break; /* sanity check */
+ bin = data + lt->len;
+ if (bin < data)
+ break; /* big data + big (bogus) len can wrap around */
+ lt->data = data;
+ data = bin + 12;
+ lt++;
+ }
+
+ if (bin != end) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(mpatch_Error, "patch cannot be decoded");
+ lfree(l);
+ return NULL;
+ }
+
+ l->tail = lt;
+ return l;
+}
+
+/* calculate the size of resultant text */
+static Py_ssize_t calcsize(Py_ssize_t len, struct flist *l)
+{
+ Py_ssize_t outlen = 0, last = 0;
+ struct frag *f = l->head;
+
+ while (f != l->tail) {
+ if (f->start < last || f->end > len) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(mpatch_Error,
+ "invalid patch");
+ return -1;
+ }
+ outlen += f->start - last;
+ last = f->end;
+ outlen += f->len;
+ f++;
+ }
+
+ outlen += len - last;
+ return outlen;
+}
+
+static int apply(char *buf, const char *orig, Py_ssize_t len, struct flist *l)
+{
+ struct frag *f = l->head;
+ int last = 0;
+ char *p = buf;
+
+ while (f != l->tail) {
+ if (f->start < last || f->end > len) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(mpatch_Error,
+ "invalid patch");
+ return 0;
+ }
+ memcpy(p, orig + last, f->start - last);
+ p += f->start - last;
+ memcpy(p, f->data, f->len);
+ last = f->end;
+ p += f->len;
+ f++;
+ }
+ memcpy(p, orig + last, len - last);
+ return 1;
+}
+
+/* recursively generate a patch of all bins between start and end */
+static struct flist *fold(PyObject *bins, Py_ssize_t start, Py_ssize_t end)
+{
+ Py_ssize_t len, blen;
+ const char *buffer;
+
+ if (start + 1 == end) {
+ /* trivial case, output a decoded list */
+ PyObject *tmp = PyList_GetItem(bins, start);
+ if (!tmp)
+ return NULL;
+ if (PyObject_AsCharBuffer(tmp, &buffer, &blen))
+ return NULL;
+ return decode(buffer, blen);
+ }
+
+ /* divide and conquer, memory management is elsewhere */
+ len = (end - start) / 2;
+ return combine(fold(bins, start, start + len),
+ fold(bins, start + len, end));
+}
+
+static PyObject *
+patches(PyObject *self, PyObject *args)
+{
+ PyObject *text, *bins, *result;
+ struct flist *patch;
+ const char *in;
+ char *out;
+ Py_ssize_t len, outlen, inlen;
+
+ if (!PyArg_ParseTuple(args, "OO:mpatch", &text, &bins))
+ return NULL;
+
+ len = PyList_Size(bins);
+ if (!len) {
+ /* nothing to do */
+ Py_INCREF(text);
+ return text;
+ }
+
+ if (PyObject_AsCharBuffer(text, &in, &inlen))
+ return NULL;
+
+ patch = fold(bins, 0, len);
+ if (!patch)
+ return NULL;
+
+ outlen = calcsize(inlen, patch);
+ if (outlen < 0) {
+ result = NULL;
+ goto cleanup;
+ }
+ result = PyBytes_FromStringAndSize(NULL, outlen);
+ if (!result) {
+ result = NULL;
+ goto cleanup;
+ }
+ out = PyBytes_AsString(result);
+ if (!apply(out, in, inlen, patch)) {
+ Py_DECREF(result);
+ result = NULL;
+ }
+cleanup:
+ lfree(patch);
+ return result;
+}
+
+/* calculate size of a patched file directly */
+static PyObject *
+patchedsize(PyObject *self, PyObject *args)
+{
+ long orig, start, end, len, outlen = 0, last = 0;
+ Py_ssize_t patchlen;
+ char *bin, *binend, *data;
+
+ if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen))
+ return NULL;
+
+ binend = bin + patchlen;
+ data = bin + 12;
+
+ while (data <= binend) {
+ start = getbe32(bin);
+ end = getbe32(bin + 4);
+ len = getbe32(bin + 8);
+ if (start > end)
+ break; /* sanity check */
+ bin = data + len;
+ if (bin < data)
+ break; /* big data + big (bogus) len can wrap around */
+ data = bin + 12;
+ outlen += start - last;
+ last = end;
+ outlen += len;
+ }
+
+ if (bin != binend) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(mpatch_Error, "patch cannot be decoded");
+ return NULL;
+ }
+
+ outlen += orig - last;
+ return Py_BuildValue("l", outlen);
+}
+
+static PyMethodDef methods[] = {
+ {"patches", patches, METH_VARARGS, "apply a series of patches\n"},
+ {"patchedsize", patchedsize, METH_VARARGS, "calculed patched size\n"},
+ {NULL, NULL}
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef mpatch_module = {
+ PyModuleDef_HEAD_INIT,
+ "mpatch",
+ mpatch_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_mpatch(void)
+{
+ PyObject *m;
+
+ m = PyModule_Create(&mpatch_module);
+ if (m == NULL)
+ return NULL;
+
+ mpatch_Error = PyErr_NewException("mpatch.mpatchError", NULL, NULL);
+ Py_INCREF(mpatch_Error);
+ PyModule_AddObject(m, "mpatchError", mpatch_Error);
+
+ return m;
+}
+#else
+PyMODINIT_FUNC
+initmpatch(void)
+{
+ Py_InitModule3("mpatch", methods, mpatch_doc);
+ mpatch_Error = PyErr_NewException("mpatch.mpatchError", NULL, NULL);
+}
+#endif
diff --git a/mercurial/node.py b/mercurial/node.py
new file mode 100644
index 0000000..9debeaf
--- /dev/null
+++ b/mercurial/node.py
@@ -0,0 +1,18 @@
+# node.py - basic nodeid manipulation for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import binascii
+
+nullrev = -1
+nullid = "\0" * 20
+
+# This ugly style has a noticeable effect in manifest parsing
+hex = binascii.hexlify
+bin = binascii.unhexlify
+
+def short(node):
+ return hex(node[:6])
diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
new file mode 100644
index 0000000..aea116d
--- /dev/null
+++ b/mercurial/obsolete.py
@@ -0,0 +1,331 @@
+# obsolete.py - obsolete markers handling
+#
+# Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+# Logilab SA <contact@logilab.fr>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Obsolete markers handling
+
+An obsolete marker maps an old changeset to a list of new
+changesets. If the list of new changesets is empty, the old changeset
+is said to be "killed". Otherwise, the old changeset is being
+"replaced" by the new changesets.
+
+Obsolete markers can be used to record and distribute changeset graph
+transformations performed by history rewriting operations, and help
+building new tools to reconciliate conflicting rewriting actions. To
+facilitate conflicts resolution, markers include various annotations
+besides old and news changeset identifiers, such as creation date or
+author name.
+
+
+Format
+------
+
+Markers are stored in an append-only file stored in
+'.hg/store/obsstore'.
+
+The file starts with a version header:
+
+- 1 unsigned byte: version number, starting at zero.
+
+
+The header is followed by the markers. Each marker is made of:
+
+- 1 unsigned byte: number of new changesets "R", could be zero.
+
+- 1 unsigned 32-bits integer: metadata size "M" in bytes.
+
+- 1 byte: a bit field. It is reserved for flags used in obsolete
+ markers common operations, to avoid repeated decoding of metadata
+ entries.
+
+- 20 bytes: obsoleted changeset identifier.
+
+- N*20 bytes: new changesets identifiers.
+
+- M bytes: metadata as a sequence of nul-terminated strings. Each
+ string contains a key and a value, separated by a color ':', without
+ additional encoding. Keys cannot contain '\0' or ':' and values
+ cannot contain '\0'.
+"""
+import struct
+from mercurial import util, base85
+from i18n import _
+
+# the obsolete feature is not mature enought to be enabled by default.
+# you have to rely on third party extension extension to enable this.
+_enabled = False
+
+_pack = struct.pack
+_unpack = struct.unpack
+
+# the obsolete feature is not mature enought to be enabled by default.
+# you have to rely on third party extension extension to enable this.
+_enabled = False
+
+# data used for parsing and writing
+_fmversion = 0
+_fmfixed = '>BIB20s'
+_fmnode = '20s'
+_fmfsize = struct.calcsize(_fmfixed)
+_fnodesize = struct.calcsize(_fmnode)
+
+def _readmarkers(data):
+ """Read and enumerate markers from raw data"""
+ off = 0
+ diskversion = _unpack('>B', data[off:off + 1])[0]
+ off += 1
+ if diskversion != _fmversion:
+ raise util.Abort(_('parsing obsolete marker: unknown version %r')
+ % diskversion)
+
+ # Loop on markers
+ l = len(data)
+ while off + _fmfsize <= l:
+ # read fixed part
+ cur = data[off:off + _fmfsize]
+ off += _fmfsize
+ nbsuc, mdsize, flags, pre = _unpack(_fmfixed, cur)
+ # read replacement
+ sucs = ()
+ if nbsuc:
+ s = (_fnodesize * nbsuc)
+ cur = data[off:off + s]
+ sucs = _unpack(_fmnode * nbsuc, cur)
+ off += s
+ # read metadata
+ # (metadata will be decoded on demand)
+ metadata = data[off:off + mdsize]
+ if len(metadata) != mdsize:
+ raise util.Abort(_('parsing obsolete marker: metadata is too '
+ 'short, %d bytes expected, got %d')
+ % (mdsize, len(metadata)))
+ off += mdsize
+ yield (pre, sucs, flags, metadata)
+
+def encodemeta(meta):
+ """Return encoded metadata string to string mapping.
+
+ Assume no ':' in key and no '\0' in both key and value."""
+ for key, value in meta.iteritems():
+ if ':' in key or '\0' in key:
+ raise ValueError("':' and '\0' are forbidden in metadata key'")
+ if '\0' in value:
+ raise ValueError("':' are forbidden in metadata value'")
+ return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)])
+
+def decodemeta(data):
+ """Return string to string dictionary from encoded version."""
+ d = {}
+ for l in data.split('\0'):
+ if l:
+ key, value = l.split(':')
+ d[key] = value
+ return d
+
+class marker(object):
+ """Wrap obsolete marker raw data"""
+
+ def __init__(self, repo, data):
+ # the repo argument will be used to create changectx in later version
+ self._repo = repo
+ self._data = data
+ self._decodedmeta = None
+
+ def precnode(self):
+ """Precursor changeset node identifier"""
+ return self._data[0]
+
+ def succnodes(self):
+ """List of successor changesets node identifiers"""
+ return self._data[1]
+
+ def metadata(self):
+ """Decoded metadata dictionary"""
+ if self._decodedmeta is None:
+ self._decodedmeta = decodemeta(self._data[3])
+ return self._decodedmeta
+
+ def date(self):
+ """Creation date as (unixtime, offset)"""
+ parts = self.metadata()['date'].split(' ')
+ return (float(parts[0]), int(parts[1]))
+
+class obsstore(object):
+ """Store obsolete markers
+
+ Markers can be accessed with two mappings:
+ - precursors: old -> set(new)
+ - successors: new -> set(old)
+ """
+
+ def __init__(self, sopener):
+ self._all = []
+ # new markers to serialize
+ self.precursors = {}
+ self.successors = {}
+ self.sopener = sopener
+ data = sopener.tryread('obsstore')
+ if data:
+ self._load(_readmarkers(data))
+
+ def __iter__(self):
+ return iter(self._all)
+
+ def __nonzero__(self):
+ return bool(self._all)
+
+ def create(self, transaction, prec, succs=(), flag=0, metadata=None):
+ """obsolete: add a new obsolete marker
+
+ * ensuring it is hashable
+ * check mandatory metadata
+ * encode metadata
+ """
+ if metadata is None:
+ metadata = {}
+ if len(prec) != 20:
+ raise ValueError(prec)
+ for succ in succs:
+ if len(succ) != 20:
+ raise ValueError(succ)
+ marker = (str(prec), tuple(succs), int(flag), encodemeta(metadata))
+ self.add(transaction, [marker])
+
+ def add(self, transaction, markers):
+ """Add new markers to the store
+
+ Take care of filtering duplicate.
+ Return the number of new marker."""
+ if not _enabled:
+ raise util.Abort('obsolete feature is not enabled on this repo')
+ new = [m for m in markers if m not in self._all]
+ if new:
+ f = self.sopener('obsstore', 'ab')
+ try:
+ # Whether the file's current position is at the begin or at
+ # the end after opening a file for appending is implementation
+ # defined. So we must seek to the end before calling tell(),
+ # or we may get a zero offset for non-zero sized files on
+ # some platforms (issue3543).
+ f.seek(0, 2) # os.SEEK_END
+ offset = f.tell()
+ transaction.add('obsstore', offset)
+ # offset == 0: new file - add the version header
+ for bytes in _encodemarkers(new, offset == 0):
+ f.write(bytes)
+ finally:
+ # XXX: f.close() == filecache invalidation == obsstore rebuilt.
+ # call 'filecacheentry.refresh()' here
+ f.close()
+ self._load(new)
+ return len(new)
+
+ def mergemarkers(self, transation, data):
+ markers = _readmarkers(data)
+ self.add(transation, markers)
+
+ def _load(self, markers):
+ for mark in markers:
+ self._all.append(mark)
+ pre, sucs = mark[:2]
+ self.precursors.setdefault(pre, set()).add(mark)
+ for suc in sucs:
+ self.successors.setdefault(suc, set()).add(mark)
+
+def _encodemarkers(markers, addheader=False):
+ # Kept separate from flushmarkers(), it will be reused for
+ # markers exchange.
+ if addheader:
+ yield _pack('>B', _fmversion)
+ for marker in markers:
+ yield _encodeonemarker(marker)
+
+
+def _encodeonemarker(marker):
+ pre, sucs, flags, metadata = marker
+ nbsuc = len(sucs)
+ format = _fmfixed + (_fmnode * nbsuc)
+ data = [nbsuc, len(metadata), flags, pre]
+ data.extend(sucs)
+ return _pack(format, *data) + metadata
+
+# arbitrary picked to fit into 8K limit from HTTP server
+# you have to take in account:
+# - the version header
+# - the base85 encoding
+_maxpayload = 5300
+
+def listmarkers(repo):
+ """List markers over pushkey"""
+ if not repo.obsstore:
+ return {}
+ keys = {}
+ parts = []
+ currentlen = _maxpayload * 2 # ensure we create a new part
+ for marker in repo.obsstore:
+ nextdata = _encodeonemarker(marker)
+ if (len(nextdata) + currentlen > _maxpayload):
+ currentpart = []
+ currentlen = 0
+ parts.append(currentpart)
+ currentpart.append(nextdata)
+ currentlen += len(nextdata)
+ for idx, part in enumerate(reversed(parts)):
+ data = ''.join([_pack('>B', _fmversion)] + part)
+ keys['dump%i' % idx] = base85.b85encode(data)
+ return keys
+
+def pushmarker(repo, key, old, new):
+ """Push markers over pushkey"""
+ if not key.startswith('dump'):
+ repo.ui.warn(_('unknown key: %r') % key)
+ return 0
+ if old:
+ repo.ui.warn(_('unexpected old value') % key)
+ return 0
+ data = base85.b85decode(new)
+ lock = repo.lock()
+ try:
+ tr = repo.transaction('pushkey: obsolete markers')
+ try:
+ repo.obsstore.mergemarkers(tr, data)
+ tr.close()
+ return 1
+ finally:
+ tr.release()
+ finally:
+ lock.release()
+
+def allmarkers(repo):
+ """all obsolete markers known in a repository"""
+ for markerdata in repo.obsstore:
+ yield marker(repo, markerdata)
+
+def precursormarkers(ctx):
+ """obsolete marker making this changeset obsolete"""
+ for data in ctx._repo.obsstore.precursors.get(ctx.node(), ()):
+ yield marker(ctx._repo, data)
+
+def successormarkers(ctx):
+ """obsolete marker marking this changeset as a successors"""
+ for data in ctx._repo.obsstore.successors.get(ctx.node(), ()):
+ yield marker(ctx._repo, data)
+
+def anysuccessors(obsstore, node):
+ """Yield every successor of <node>
+
+ This this a linear yield unsuitable to detect splitted changeset."""
+ remaining = set([node])
+ seen = set(remaining)
+ while remaining:
+ current = remaining.pop()
+ yield current
+ for mark in obsstore.precursors.get(current, ()):
+ for suc in mark[1]:
+ if suc not in seen:
+ seen.add(suc)
+ remaining.add(suc)
diff --git a/mercurial/osutil.c b/mercurial/osutil.c
new file mode 100644
index 0000000..5c3efb7
--- /dev/null
+++ b/mercurial/osutil.c
@@ -0,0 +1,581 @@
+/*
+ osutil.c - native operating system services
+
+ Copyright 2007 Matt Mackall and others
+
+ This software may be used and distributed according to the terms of
+ the GNU General Public License, incorporated herein by reference.
+*/
+
+#define _ATFILE_SOURCE
+#include <Python.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#include <io.h>
+#else
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#include "util.h"
+
+/* some platforms lack the PATH_MAX definition (eg. GNU/Hurd) */
+#ifndef PATH_MAX
+#define PATH_MAX 4096
+#endif
+
+#ifdef _WIN32
+/*
+stat struct compatible with hg expectations
+Mercurial only uses st_mode, st_size and st_mtime
+the rest is kept to minimize changes between implementations
+*/
+struct hg_stat {
+ int st_dev;
+ int st_mode;
+ int st_nlink;
+ __int64 st_size;
+ int st_mtime;
+ int st_ctime;
+};
+struct listdir_stat {
+ PyObject_HEAD
+ struct hg_stat st;
+};
+#else
+struct listdir_stat {
+ PyObject_HEAD
+ struct stat st;
+};
+#endif
+
+#define listdir_slot(name) \
+ static PyObject *listdir_stat_##name(PyObject *self, void *x) \
+ { \
+ return PyInt_FromLong(((struct listdir_stat *)self)->st.name); \
+ }
+
+listdir_slot(st_dev)
+listdir_slot(st_mode)
+listdir_slot(st_nlink)
+#ifdef _WIN32
+static PyObject *listdir_stat_st_size(PyObject *self, void *x)
+{
+ return PyLong_FromLongLong(
+ (PY_LONG_LONG)((struct listdir_stat *)self)->st.st_size);
+}
+#else
+listdir_slot(st_size)
+#endif
+listdir_slot(st_mtime)
+listdir_slot(st_ctime)
+
+static struct PyGetSetDef listdir_stat_getsets[] = {
+ {"st_dev", listdir_stat_st_dev, 0, 0, 0},
+ {"st_mode", listdir_stat_st_mode, 0, 0, 0},
+ {"st_nlink", listdir_stat_st_nlink, 0, 0, 0},
+ {"st_size", listdir_stat_st_size, 0, 0, 0},
+ {"st_mtime", listdir_stat_st_mtime, 0, 0, 0},
+ {"st_ctime", listdir_stat_st_ctime, 0, 0, 0},
+ {0, 0, 0, 0, 0}
+};
+
+static PyObject *listdir_stat_new(PyTypeObject *t, PyObject *a, PyObject *k)
+{
+ return t->tp_alloc(t, 0);
+}
+
+static void listdir_stat_dealloc(PyObject *o)
+{
+ o->ob_type->tp_free(o);
+}
+
+static PyTypeObject listdir_stat_type = {
+ PyVarObject_HEAD_INIT(NULL, 0)
+ "osutil.stat", /*tp_name*/
+ sizeof(struct listdir_stat), /*tp_basicsize*/
+ 0, /*tp_itemsize*/
+ (destructor)listdir_stat_dealloc, /*tp_dealloc*/
+ 0, /*tp_print*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
+ 0, /*tp_compare*/
+ 0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash */
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ 0, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
+ "stat objects", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ 0, /* tp_methods */
+ 0, /* tp_members */
+ listdir_stat_getsets, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ 0, /* tp_init */
+ 0, /* tp_alloc */
+ listdir_stat_new, /* tp_new */
+};
+
+#ifdef _WIN32
+
+static int to_python_time(const FILETIME *tm)
+{
+ /* number of seconds between epoch and January 1 1601 */
+ const __int64 a0 = (__int64)134774L * (__int64)24L * (__int64)3600L;
+ /* conversion factor from 100ns to 1s */
+ const __int64 a1 = 10000000;
+ /* explicit (int) cast to suspend compiler warnings */
+ return (int)((((__int64)tm->dwHighDateTime << 32)
+ + tm->dwLowDateTime) / a1 - a0);
+}
+
+static PyObject *make_item(const WIN32_FIND_DATAA *fd, int wantstat)
+{
+ PyObject *py_st;
+ struct hg_stat *stp;
+
+ int kind = (fd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ ? _S_IFDIR : _S_IFREG;
+
+ if (!wantstat)
+ return Py_BuildValue("si", fd->cFileName, kind);
+
+ py_st = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
+ if (!py_st)
+ return NULL;
+
+ stp = &((struct listdir_stat *)py_st)->st;
+ /*
+ use kind as st_mode
+ rwx bits on Win32 are meaningless
+ and Hg does not use them anyway
+ */
+ stp->st_mode = kind;
+ stp->st_mtime = to_python_time(&fd->ftLastWriteTime);
+ stp->st_ctime = to_python_time(&fd->ftCreationTime);
+ if (kind == _S_IFREG)
+ stp->st_size = ((__int64)fd->nFileSizeHigh << 32)
+ + fd->nFileSizeLow;
+ return Py_BuildValue("siN", fd->cFileName,
+ kind, py_st);
+}
+
+static PyObject *_listdir(char *path, int plen, int wantstat, char *skip)
+{
+ PyObject *rval = NULL; /* initialize - return value */
+ PyObject *list;
+ HANDLE fh;
+ WIN32_FIND_DATAA fd;
+ char *pattern;
+
+ /* build the path + \* pattern string */
+ pattern = malloc(plen + 3); /* path + \* + \0 */
+ if (!pattern) {
+ PyErr_NoMemory();
+ goto error_nomem;
+ }
+ strcpy(pattern, path);
+
+ if (plen > 0) {
+ char c = path[plen-1];
+ if (c != ':' && c != '/' && c != '\\')
+ pattern[plen++] = '\\';
+ }
+ strcpy(pattern + plen, "*");
+
+ fh = FindFirstFileA(pattern, &fd);
+ if (fh == INVALID_HANDLE_VALUE) {
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
+ goto error_file;
+ }
+
+ list = PyList_New(0);
+ if (!list)
+ goto error_list;
+
+ do {
+ PyObject *item;
+
+ if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ if (!strcmp(fd.cFileName, ".")
+ || !strcmp(fd.cFileName, ".."))
+ continue;
+
+ if (skip && !strcmp(fd.cFileName, skip)) {
+ rval = PyList_New(0);
+ goto error;
+ }
+ }
+
+ item = make_item(&fd, wantstat);
+ if (!item)
+ goto error;
+
+ if (PyList_Append(list, item)) {
+ Py_XDECREF(item);
+ goto error;
+ }
+
+ Py_XDECREF(item);
+ } while (FindNextFileA(fh, &fd));
+
+ if (GetLastError() != ERROR_NO_MORE_FILES) {
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), path);
+ goto error;
+ }
+
+ rval = list;
+ Py_XINCREF(rval);
+error:
+ Py_XDECREF(list);
+error_list:
+ FindClose(fh);
+error_file:
+ free(pattern);
+error_nomem:
+ return rval;
+}
+
+#else
+
+int entkind(struct dirent *ent)
+{
+#ifdef DT_REG
+ switch (ent->d_type) {
+ case DT_REG: return S_IFREG;
+ case DT_DIR: return S_IFDIR;
+ case DT_LNK: return S_IFLNK;
+ case DT_BLK: return S_IFBLK;
+ case DT_CHR: return S_IFCHR;
+ case DT_FIFO: return S_IFIFO;
+ case DT_SOCK: return S_IFSOCK;
+ }
+#endif
+ return -1;
+}
+
+static PyObject *_listdir(char *path, int pathlen, int keepstat, char *skip)
+{
+ PyObject *list, *elem, *stat, *ret = NULL;
+ char fullpath[PATH_MAX + 10];
+ int kind, err;
+ struct stat st;
+ struct dirent *ent;
+ DIR *dir;
+#ifdef AT_SYMLINK_NOFOLLOW
+ int dfd = -1;
+#endif
+
+ if (pathlen >= PATH_MAX) {
+ errno = ENAMETOOLONG;
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
+ goto error_value;
+ }
+ strncpy(fullpath, path, PATH_MAX);
+ fullpath[pathlen] = '/';
+
+#ifdef AT_SYMLINK_NOFOLLOW
+ dfd = open(path, O_RDONLY);
+ if (dfd == -1) {
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
+ goto error_value;
+ }
+ dir = fdopendir(dfd);
+#else
+ dir = opendir(path);
+#endif
+ if (!dir) {
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError, path);
+ goto error_dir;
+ }
+
+ list = PyList_New(0);
+ if (!list)
+ goto error_list;
+
+ while ((ent = readdir(dir))) {
+ if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, ".."))
+ continue;
+
+ kind = entkind(ent);
+ if (kind == -1 || keepstat) {
+#ifdef AT_SYMLINK_NOFOLLOW
+ err = fstatat(dfd, ent->d_name, &st,
+ AT_SYMLINK_NOFOLLOW);
+#else
+ strncpy(fullpath + pathlen + 1, ent->d_name,
+ PATH_MAX - pathlen);
+ fullpath[PATH_MAX] = 0;
+ err = lstat(fullpath, &st);
+#endif
+ if (err == -1) {
+ /* race with file deletion? */
+ if (errno == ENOENT)
+ continue;
+ strncpy(fullpath + pathlen + 1, ent->d_name,
+ PATH_MAX - pathlen);
+ fullpath[PATH_MAX] = 0;
+ PyErr_SetFromErrnoWithFilename(PyExc_OSError,
+ fullpath);
+ goto error;
+ }
+ kind = st.st_mode & S_IFMT;
+ }
+
+ /* quit early? */
+ if (skip && kind == S_IFDIR && !strcmp(ent->d_name, skip)) {
+ ret = PyList_New(0);
+ goto error;
+ }
+
+ if (keepstat) {
+ stat = PyObject_CallObject((PyObject *)&listdir_stat_type, NULL);
+ if (!stat)
+ goto error;
+ memcpy(&((struct listdir_stat *)stat)->st, &st, sizeof(st));
+ elem = Py_BuildValue("siN", ent->d_name, kind, stat);
+ } else
+ elem = Py_BuildValue("si", ent->d_name, kind);
+ if (!elem)
+ goto error;
+
+ PyList_Append(list, elem);
+ Py_DECREF(elem);
+ }
+
+ ret = list;
+ Py_INCREF(ret);
+
+error:
+ Py_DECREF(list);
+error_list:
+ closedir(dir);
+error_dir:
+#ifdef AT_SYMLINK_NOFOLLOW
+ close(dfd);
+#endif
+error_value:
+ return ret;
+}
+
+#endif /* ndef _WIN32 */
+
+static PyObject *listdir(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ PyObject *statobj = NULL; /* initialize - optional arg */
+ PyObject *skipobj = NULL; /* initialize - optional arg */
+ char *path, *skip = NULL;
+ int wantstat, plen;
+
+ static char *kwlist[] = {"path", "stat", "skip", NULL};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s#|OO:listdir",
+ kwlist, &path, &plen, &statobj, &skipobj))
+ return NULL;
+
+ wantstat = statobj && PyObject_IsTrue(statobj);
+
+ if (skipobj && skipobj != Py_None) {
+ skip = PyBytes_AsString(skipobj);
+ if (!skip)
+ return NULL;
+ }
+
+ return _listdir(path, plen, wantstat, skip);
+}
+
+#ifdef _WIN32
+static PyObject *posixfile(PyObject *self, PyObject *args, PyObject *kwds)
+{
+ static char *kwlist[] = {"name", "mode", "buffering", NULL};
+ PyObject *file_obj = NULL;
+ char *name = NULL;
+ char *mode = "rb";
+ DWORD access = 0;
+ DWORD creation;
+ HANDLE handle;
+ int fd, flags = 0;
+ int bufsize = -1;
+ char m0, m1, m2;
+ char fpmode[4];
+ int fppos = 0;
+ int plus;
+ FILE *fp;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "et|si:posixfile", kwlist,
+ Py_FileSystemDefaultEncoding,
+ &name, &mode, &bufsize))
+ return NULL;
+
+ m0 = mode[0];
+ m1 = m0 ? mode[1] : '\0';
+ m2 = m1 ? mode[2] : '\0';
+ plus = m1 == '+' || m2 == '+';
+
+ fpmode[fppos++] = m0;
+ if (m1 == 'b' || m2 == 'b') {
+ flags = _O_BINARY;
+ fpmode[fppos++] = 'b';
+ }
+ else
+ flags = _O_TEXT;
+ if (m0 == 'r' && !plus) {
+ flags |= _O_RDONLY;
+ access = GENERIC_READ;
+ } else {
+ /*
+ work around http://support.microsoft.com/kb/899149 and
+ set _O_RDWR for 'w' and 'a', even if mode has no '+'
+ */
+ flags |= _O_RDWR;
+ access = GENERIC_READ | GENERIC_WRITE;
+ fpmode[fppos++] = '+';
+ }
+ fpmode[fppos++] = '\0';
+
+ switch (m0) {
+ case 'r':
+ creation = OPEN_EXISTING;
+ break;
+ case 'w':
+ creation = CREATE_ALWAYS;
+ break;
+ case 'a':
+ creation = OPEN_ALWAYS;
+ flags |= _O_APPEND;
+ break;
+ default:
+ PyErr_Format(PyExc_ValueError,
+ "mode string must begin with one of 'r', 'w', "
+ "or 'a', not '%c'", m0);
+ goto bail;
+ }
+
+ handle = CreateFile(name, access,
+ FILE_SHARE_READ | FILE_SHARE_WRITE |
+ FILE_SHARE_DELETE,
+ NULL,
+ creation,
+ FILE_ATTRIBUTE_NORMAL,
+ 0);
+
+ if (handle == INVALID_HANDLE_VALUE) {
+ PyErr_SetFromWindowsErrWithFilename(GetLastError(), name);
+ goto bail;
+ }
+
+ fd = _open_osfhandle((intptr_t)handle, flags);
+
+ if (fd == -1) {
+ CloseHandle(handle);
+ PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+ goto bail;
+ }
+#ifndef IS_PY3K
+ fp = _fdopen(fd, fpmode);
+ if (fp == NULL) {
+ _close(fd);
+ PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);
+ goto bail;
+ }
+
+ file_obj = PyFile_FromFile(fp, name, mode, fclose);
+ if (file_obj == NULL) {
+ fclose(fp);
+ goto bail;
+ }
+
+ PyFile_SetBufSize(file_obj, bufsize);
+#else
+ file_obj = PyFile_FromFd(fd, name, mode, bufsize, NULL, NULL, NULL, 1);
+ if (file_obj == NULL)
+ goto bail;
+#endif
+bail:
+ PyMem_Free(name);
+ return file_obj;
+}
+#endif
+
+#ifdef __APPLE__
+#include <ApplicationServices/ApplicationServices.h>
+
+static PyObject *isgui(PyObject *self)
+{
+ CFDictionaryRef dict = CGSessionCopyCurrentDictionary();
+
+ if (dict != NULL) {
+ CFRelease(dict);
+ Py_RETURN_TRUE;
+ } else {
+ Py_RETURN_FALSE;
+ }
+}
+#endif
+
+static char osutil_doc[] = "Native operating system services.";
+
+static PyMethodDef methods[] = {
+ {"listdir", (PyCFunction)listdir, METH_VARARGS | METH_KEYWORDS,
+ "list a directory\n"},
+#ifdef _WIN32
+ {"posixfile", (PyCFunction)posixfile, METH_VARARGS | METH_KEYWORDS,
+ "Open a file with POSIX-like semantics.\n"
+"On error, this function may raise either a WindowsError or an IOError."},
+#endif
+#ifdef __APPLE__
+ {
+ "isgui", (PyCFunction)isgui, METH_NOARGS,
+ "Is a CoreGraphics session available?"
+ },
+#endif
+ {NULL, NULL}
+};
+
+#ifdef IS_PY3K
+static struct PyModuleDef osutil_module = {
+ PyModuleDef_HEAD_INIT,
+ "osutil",
+ osutil_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_osutil(void)
+{
+ if (PyType_Ready(&listdir_stat_type) < 0)
+ return NULL;
+
+ return PyModule_Create(&osutil_module);
+}
+#else
+PyMODINIT_FUNC initosutil(void)
+{
+ if (PyType_Ready(&listdir_stat_type) == -1)
+ return;
+
+ Py_InitModule3("osutil", methods, osutil_doc);
+}
+#endif
diff --git a/mercurial/parser.py b/mercurial/parser.py
new file mode 100644
index 0000000..5c32faa
--- /dev/null
+++ b/mercurial/parser.py
@@ -0,0 +1,95 @@
+# parser.py - simple top-down operator precedence parser for mercurial
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# see http://effbot.org/zone/simple-top-down-parsing.htm and
+# http://eli.thegreenplace.net/2010/01/02/top-down-operator-precedence-parsing/
+# for background
+
+# takes a tokenizer and elements
+# tokenizer is an iterator that returns type, value pairs
+# elements is a mapping of types to binding strength, prefix and infix actions
+# an action is a tree node name, a tree label, and an optional match
+# __call__(program) parses program into a labelled tree
+
+import error
+from i18n import _
+
+class parser(object):
+ def __init__(self, tokenizer, elements, methods=None):
+ self._tokenizer = tokenizer
+ self._elements = elements
+ self._methods = methods
+ self.current = None
+ def _advance(self):
+ 'advance the tokenizer'
+ t = self.current
+ try:
+ self.current = self._iter.next()
+ except StopIteration:
+ pass
+ return t
+ def _match(self, m, pos):
+ 'make sure the tokenizer matches an end condition'
+ if self.current[0] != m:
+ raise error.ParseError(_("unexpected token: %s") % self.current[0],
+ self.current[2])
+ self._advance()
+ def _parse(self, bind=0):
+ token, value, pos = self._advance()
+ # handle prefix rules on current token
+ prefix = self._elements[token][1]
+ if not prefix:
+ raise error.ParseError(_("not a prefix: %s") % token, pos)
+ if len(prefix) == 1:
+ expr = (prefix[0], value)
+ else:
+ if len(prefix) > 2 and prefix[2] == self.current[0]:
+ self._match(prefix[2], pos)
+ expr = (prefix[0], None)
+ else:
+ expr = (prefix[0], self._parse(prefix[1]))
+ if len(prefix) > 2:
+ self._match(prefix[2], pos)
+ # gather tokens until we meet a lower binding strength
+ while bind < self._elements[self.current[0]][0]:
+ token, value, pos = self._advance()
+ e = self._elements[token]
+ # check for suffix - next token isn't a valid prefix
+ if len(e) == 4 and not self._elements[self.current[0]][1]:
+ suffix = e[3]
+ expr = (suffix[0], expr)
+ else:
+ # handle infix rules
+ if len(e) < 3 or not e[2]:
+ raise error.ParseError(_("not an infix: %s") % token, pos)
+ infix = e[2]
+ if len(infix) == 3 and infix[2] == self.current[0]:
+ self._match(infix[2], pos)
+ expr = (infix[0], expr, (None))
+ else:
+ expr = (infix[0], expr, self._parse(infix[1]))
+ if len(infix) == 3:
+ self._match(infix[2], pos)
+ return expr
+ def parse(self, message):
+ 'generate a parse tree from a message'
+ self._iter = self._tokenizer(message)
+ self._advance()
+ res = self._parse()
+ token, value, pos = self.current
+ return res, pos
+ def eval(self, tree):
+ 'recursively evaluate a parse tree using node methods'
+ if not isinstance(tree, tuple):
+ return tree
+ return self._methods[tree[0]](*[self.eval(t) for t in tree[1:]])
+ def __call__(self, message):
+ 'parse a message into a parse tree and evaluate if methods given'
+ t = self.parse(message)
+ if self._methods:
+ return self.eval(t)
+ return t
diff --git a/mercurial/parsers.c b/mercurial/parsers.c
new file mode 100644
index 0000000..6710ea6
--- /dev/null
+++ b/mercurial/parsers.c
@@ -0,0 +1,1552 @@
+/*
+ parsers.c - efficient content parsing
+
+ Copyright 2008 Matt Mackall <mpm@selenic.com> and others
+
+ This software may be used and distributed according to the terms of
+ the GNU General Public License, incorporated herein by reference.
+*/
+
+#include <Python.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "util.h"
+
+static inline int hexdigit(const char *p, Py_ssize_t off)
+{
+ char c = p[off];
+
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+
+ PyErr_SetString(PyExc_ValueError, "input contains non-hex character");
+ return 0;
+}
+
+/*
+ * Turn a hex-encoded string into binary.
+ */
+static PyObject *unhexlify(const char *str, int len)
+{
+ PyObject *ret;
+ char *d;
+ int i;
+
+ ret = PyBytes_FromStringAndSize(NULL, len / 2);
+
+ if (!ret)
+ return NULL;
+
+ d = PyBytes_AsString(ret);
+
+ for (i = 0; i < len;) {
+ int hi = hexdigit(str, i++);
+ int lo = hexdigit(str, i++);
+ *d++ = (hi << 4) | lo;
+ }
+
+ return ret;
+}
+
+/*
+ * This code assumes that a manifest is stitched together with newline
+ * ('\n') characters.
+ */
+static PyObject *parse_manifest(PyObject *self, PyObject *args)
+{
+ PyObject *mfdict, *fdict;
+ char *str, *cur, *start, *zero;
+ int len;
+
+ if (!PyArg_ParseTuple(args, "O!O!s#:parse_manifest",
+ &PyDict_Type, &mfdict,
+ &PyDict_Type, &fdict,
+ &str, &len))
+ goto quit;
+
+ for (start = cur = str, zero = NULL; cur < str + len; cur++) {
+ PyObject *file = NULL, *node = NULL;
+ PyObject *flags = NULL;
+ int nlen;
+
+ if (!*cur) {
+ zero = cur;
+ continue;
+ }
+ else if (*cur != '\n')
+ continue;
+
+ if (!zero) {
+ PyErr_SetString(PyExc_ValueError,
+ "manifest entry has no separator");
+ goto quit;
+ }
+
+ file = PyBytes_FromStringAndSize(start, zero - start);
+
+ if (!file)
+ goto bail;
+
+ nlen = cur - zero - 1;
+
+ node = unhexlify(zero + 1, nlen > 40 ? 40 : nlen);
+ if (!node)
+ goto bail;
+
+ if (nlen > 40) {
+ flags = PyBytes_FromStringAndSize(zero + 41,
+ nlen - 40);
+ if (!flags)
+ goto bail;
+
+ if (PyDict_SetItem(fdict, file, flags) == -1)
+ goto bail;
+ }
+
+ if (PyDict_SetItem(mfdict, file, node) == -1)
+ goto bail;
+
+ start = cur + 1;
+ zero = NULL;
+
+ Py_XDECREF(flags);
+ Py_XDECREF(node);
+ Py_XDECREF(file);
+ continue;
+ bail:
+ Py_XDECREF(flags);
+ Py_XDECREF(node);
+ Py_XDECREF(file);
+ goto quit;
+ }
+
+ if (len > 0 && *(cur - 1) != '\n') {
+ PyErr_SetString(PyExc_ValueError,
+ "manifest contains trailing garbage");
+ goto quit;
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+quit:
+ return NULL;
+}
+
+static PyObject *parse_dirstate(PyObject *self, PyObject *args)
+{
+ PyObject *dmap, *cmap, *parents = NULL, *ret = NULL;
+ PyObject *fname = NULL, *cname = NULL, *entry = NULL;
+ char *str, *cur, *end, *cpos;
+ int state, mode, size, mtime;
+ unsigned int flen;
+ int len;
+
+ if (!PyArg_ParseTuple(args, "O!O!s#:parse_dirstate",
+ &PyDict_Type, &dmap,
+ &PyDict_Type, &cmap,
+ &str, &len))
+ goto quit;
+
+ /* read parents */
+ if (len < 40)
+ goto quit;
+
+ parents = Py_BuildValue("s#s#", str, 20, str + 20, 20);
+ if (!parents)
+ goto quit;
+
+ /* read filenames */
+ cur = str + 40;
+ end = str + len;
+
+ while (cur < end - 17) {
+ /* unpack header */
+ state = *cur;
+ mode = getbe32(cur + 1);
+ size = getbe32(cur + 5);
+ mtime = getbe32(cur + 9);
+ flen = getbe32(cur + 13);
+ cur += 17;
+ if (cur + flen > end || cur + flen < cur) {
+ PyErr_SetString(PyExc_ValueError, "overflow in dirstate");
+ goto quit;
+ }
+
+ entry = Py_BuildValue("ciii", state, mode, size, mtime);
+ if (!entry)
+ goto quit;
+ PyObject_GC_UnTrack(entry); /* don't waste time with this */
+
+ cpos = memchr(cur, 0, flen);
+ if (cpos) {
+ fname = PyBytes_FromStringAndSize(cur, cpos - cur);
+ cname = PyBytes_FromStringAndSize(cpos + 1,
+ flen - (cpos - cur) - 1);
+ if (!fname || !cname ||
+ PyDict_SetItem(cmap, fname, cname) == -1 ||
+ PyDict_SetItem(dmap, fname, entry) == -1)
+ goto quit;
+ Py_DECREF(cname);
+ } else {
+ fname = PyBytes_FromStringAndSize(cur, flen);
+ if (!fname ||
+ PyDict_SetItem(dmap, fname, entry) == -1)
+ goto quit;
+ }
+ cur += flen;
+ Py_DECREF(fname);
+ Py_DECREF(entry);
+ fname = cname = entry = NULL;
+ }
+
+ ret = parents;
+ Py_INCREF(ret);
+quit:
+ Py_XDECREF(fname);
+ Py_XDECREF(cname);
+ Py_XDECREF(entry);
+ Py_XDECREF(parents);
+ return ret;
+}
+
+static inline int getintat(PyObject *tuple, int off, uint32_t *v)
+{
+ PyObject *o = PyTuple_GET_ITEM(tuple, off);
+ long val;
+
+ if (PyInt_Check(o))
+ val = PyInt_AS_LONG(o);
+ else if (PyLong_Check(o)) {
+ val = PyLong_AsLong(o);
+ if (val == -1 && PyErr_Occurred())
+ return -1;
+ } else {
+ PyErr_SetString(PyExc_TypeError, "expected an int or long");
+ return -1;
+ }
+ if (LONG_MAX > INT_MAX && (val > INT_MAX || val < INT_MIN)) {
+ PyErr_SetString(PyExc_OverflowError,
+ "Python value to large to convert to uint32_t");
+ return -1;
+ }
+ *v = (uint32_t)val;
+ return 0;
+}
+
+static PyObject *dirstate_unset;
+
+/*
+ * Efficiently pack a dirstate object into its on-disk format.
+ */
+static PyObject *pack_dirstate(PyObject *self, PyObject *args)
+{
+ PyObject *packobj = NULL;
+ PyObject *map, *copymap, *pl;
+ Py_ssize_t nbytes, pos, l;
+ PyObject *k, *v, *pn;
+ char *p, *s;
+ double now;
+
+ if (!PyArg_ParseTuple(args, "O!O!Od:pack_dirstate",
+ &PyDict_Type, &map, &PyDict_Type, &copymap,
+ &pl, &now))
+ return NULL;
+
+ if (!PySequence_Check(pl) || PySequence_Size(pl) != 2) {
+ PyErr_SetString(PyExc_TypeError, "expected 2-element sequence");
+ return NULL;
+ }
+
+ /* Figure out how much we need to allocate. */
+ for (nbytes = 40, pos = 0; PyDict_Next(map, &pos, &k, &v);) {
+ PyObject *c;
+ if (!PyString_Check(k)) {
+ PyErr_SetString(PyExc_TypeError, "expected string key");
+ goto bail;
+ }
+ nbytes += PyString_GET_SIZE(k) + 17;
+ c = PyDict_GetItem(copymap, k);
+ if (c) {
+ if (!PyString_Check(c)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expected string key");
+ goto bail;
+ }
+ nbytes += PyString_GET_SIZE(c) + 1;
+ }
+ }
+
+ packobj = PyString_FromStringAndSize(NULL, nbytes);
+ if (packobj == NULL)
+ goto bail;
+
+ p = PyString_AS_STRING(packobj);
+
+ pn = PySequence_ITEM(pl, 0);
+ if (PyString_AsStringAndSize(pn, &s, &l) == -1 || l != 20) {
+ PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash");
+ goto bail;
+ }
+ memcpy(p, s, l);
+ p += 20;
+ pn = PySequence_ITEM(pl, 1);
+ if (PyString_AsStringAndSize(pn, &s, &l) == -1 || l != 20) {
+ PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash");
+ goto bail;
+ }
+ memcpy(p, s, l);
+ p += 20;
+
+ for (pos = 0; PyDict_Next(map, &pos, &k, &v); ) {
+ uint32_t mode, size, mtime;
+ Py_ssize_t len, l;
+ PyObject *o;
+ char *s, *t;
+
+ if (!PyTuple_Check(v) || PyTuple_GET_SIZE(v) != 4) {
+ PyErr_SetString(PyExc_TypeError, "expected a 4-tuple");
+ goto bail;
+ }
+ o = PyTuple_GET_ITEM(v, 0);
+ if (PyString_AsStringAndSize(o, &s, &l) == -1 || l != 1) {
+ PyErr_SetString(PyExc_TypeError, "expected one byte");
+ goto bail;
+ }
+ *p++ = *s;
+ if (getintat(v, 1, &mode) == -1)
+ goto bail;
+ if (getintat(v, 2, &size) == -1)
+ goto bail;
+ if (getintat(v, 3, &mtime) == -1)
+ goto bail;
+ if (*s == 'n' && mtime == (uint32_t)now) {
+ /* See dirstate.py:write for why we do this. */
+ if (PyDict_SetItem(map, k, dirstate_unset) == -1)
+ goto bail;
+ mode = 0, size = -1, mtime = -1;
+ }
+ putbe32(mode, p);
+ putbe32(size, p + 4);
+ putbe32(mtime, p + 8);
+ t = p + 12;
+ p += 16;
+ len = PyString_GET_SIZE(k);
+ memcpy(p, PyString_AS_STRING(k), len);
+ p += len;
+ o = PyDict_GetItem(copymap, k);
+ if (o) {
+ *p++ = '\0';
+ l = PyString_GET_SIZE(o);
+ memcpy(p, PyString_AS_STRING(o), l);
+ p += l;
+ len += l + 1;
+ }
+ putbe32((uint32_t)len, t);
+ }
+
+ pos = p - PyString_AS_STRING(packobj);
+ if (pos != nbytes) {
+ PyErr_Format(PyExc_SystemError, "bad dirstate size: %ld != %ld",
+ (long)pos, (long)nbytes);
+ goto bail;
+ }
+
+ return packobj;
+bail:
+ Py_XDECREF(packobj);
+ return NULL;
+}
+
+/*
+ * A base-16 trie for fast node->rev mapping.
+ *
+ * Positive value is index of the next node in the trie
+ * Negative value is a leaf: -(rev + 1)
+ * Zero is empty
+ */
+typedef struct {
+ int children[16];
+} nodetree;
+
+/*
+ * This class has two behaviours.
+ *
+ * When used in a list-like way (with integer keys), we decode an
+ * entry in a RevlogNG index file on demand. Our last entry is a
+ * sentinel, always a nullid. We have limited support for
+ * integer-keyed insert and delete, only at elements right before the
+ * sentinel.
+ *
+ * With string keys, we lazily perform a reverse mapping from node to
+ * rev, using a base-16 trie.
+ */
+typedef struct {
+ PyObject_HEAD
+ /* Type-specific fields go here. */
+ PyObject *data; /* raw bytes of index */
+ PyObject **cache; /* cached tuples */
+ const char **offsets; /* populated on demand */
+ Py_ssize_t raw_length; /* original number of elements */
+ Py_ssize_t length; /* current number of elements */
+ PyObject *added; /* populated on demand */
+ PyObject *headrevs; /* cache, invalidated on changes */
+ nodetree *nt; /* base-16 trie */
+ int ntlength; /* # nodes in use */
+ int ntcapacity; /* # nodes allocated */
+ int ntdepth; /* maximum depth of tree */
+ int ntsplits; /* # splits performed */
+ int ntrev; /* last rev scanned */
+ int ntlookups; /* # lookups */
+ int ntmisses; /* # lookups that miss the cache */
+ int inlined;
+} indexObject;
+
+static Py_ssize_t index_length(const indexObject *self)
+{
+ if (self->added == NULL)
+ return self->length;
+ return self->length + PyList_GET_SIZE(self->added);
+}
+
+static PyObject *nullentry;
+static const char nullid[20];
+
+static long inline_scan(indexObject *self, const char **offsets);
+
+#if LONG_MAX == 0x7fffffffL
+static char *tuple_format = "Kiiiiiis#";
+#else
+static char *tuple_format = "kiiiiiis#";
+#endif
+
+/* A RevlogNG v1 index entry is 64 bytes long. */
+static const long v1_hdrsize = 64;
+
+/*
+ * Return a pointer to the beginning of a RevlogNG record.
+ */
+static const char *index_deref(indexObject *self, Py_ssize_t pos)
+{
+ if (self->inlined && pos > 0) {
+ if (self->offsets == NULL) {
+ self->offsets = malloc(self->raw_length *
+ sizeof(*self->offsets));
+ if (self->offsets == NULL)
+ return (const char *)PyErr_NoMemory();
+ inline_scan(self, self->offsets);
+ }
+ return self->offsets[pos];
+ }
+
+ return PyString_AS_STRING(self->data) + pos * v1_hdrsize;
+}
+
+/*
+ * RevlogNG format (all in big endian, data may be inlined):
+ * 6 bytes: offset
+ * 2 bytes: flags
+ * 4 bytes: compressed length
+ * 4 bytes: uncompressed length
+ * 4 bytes: base revision
+ * 4 bytes: link revision
+ * 4 bytes: parent 1 revision
+ * 4 bytes: parent 2 revision
+ * 32 bytes: nodeid (only 20 bytes used)
+ */
+static PyObject *index_get(indexObject *self, Py_ssize_t pos)
+{
+ uint64_t offset_flags;
+ int comp_len, uncomp_len, base_rev, link_rev, parent_1, parent_2;
+ const char *c_node_id;
+ const char *data;
+ Py_ssize_t length = index_length(self);
+ PyObject *entry;
+
+ if (pos < 0)
+ pos += length;
+
+ if (pos < 0 || pos >= length) {
+ PyErr_SetString(PyExc_IndexError, "revlog index out of range");
+ return NULL;
+ }
+
+ if (pos == length - 1) {
+ Py_INCREF(nullentry);
+ return nullentry;
+ }
+
+ if (pos >= self->length - 1) {
+ PyObject *obj;
+ obj = PyList_GET_ITEM(self->added, pos - self->length + 1);
+ Py_INCREF(obj);
+ return obj;
+ }
+
+ if (self->cache) {
+ if (self->cache[pos]) {
+ Py_INCREF(self->cache[pos]);
+ return self->cache[pos];
+ }
+ } else {
+ self->cache = calloc(self->raw_length, sizeof(PyObject *));
+ if (self->cache == NULL)
+ return PyErr_NoMemory();
+ }
+
+ data = index_deref(self, pos);
+ if (data == NULL)
+ return NULL;
+
+ offset_flags = getbe32(data + 4);
+ if (pos == 0) /* mask out version number for the first entry */
+ offset_flags &= 0xFFFF;
+ else {
+ uint32_t offset_high = getbe32(data);
+ offset_flags |= ((uint64_t)offset_high) << 32;
+ }
+
+ comp_len = getbe32(data + 8);
+ uncomp_len = getbe32(data + 12);
+ base_rev = getbe32(data + 16);
+ link_rev = getbe32(data + 20);
+ parent_1 = getbe32(data + 24);
+ parent_2 = getbe32(data + 28);
+ c_node_id = data + 32;
+
+ entry = Py_BuildValue(tuple_format, offset_flags, comp_len,
+ uncomp_len, base_rev, link_rev,
+ parent_1, parent_2, c_node_id, 20);
+
+ if (entry)
+ PyObject_GC_UnTrack(entry);
+
+ self->cache[pos] = entry;
+ Py_INCREF(entry);
+
+ return entry;
+}
+
+/*
+ * Return the 20-byte SHA of the node corresponding to the given rev.
+ */
+static const char *index_node(indexObject *self, Py_ssize_t pos)
+{
+ Py_ssize_t length = index_length(self);
+ const char *data;
+
+ if (pos == length - 1 || pos == INT_MAX)
+ return nullid;
+
+ if (pos >= length)
+ return NULL;
+
+ if (pos >= self->length - 1) {
+ PyObject *tuple, *str;
+ tuple = PyList_GET_ITEM(self->added, pos - self->length + 1);
+ str = PyTuple_GetItem(tuple, 7);
+ return str ? PyString_AS_STRING(str) : NULL;
+ }
+
+ data = index_deref(self, pos);
+ return data ? data + 32 : NULL;
+}
+
+static int nt_insert(indexObject *self, const char *node, int rev);
+
+static int node_check(PyObject *obj, char **node, Py_ssize_t *nodelen)
+{
+ if (PyString_AsStringAndSize(obj, node, nodelen) == -1)
+ return -1;
+ if (*nodelen == 20)
+ return 0;
+ PyErr_SetString(PyExc_ValueError, "20-byte hash required");
+ return -1;
+}
+
+static PyObject *index_insert(indexObject *self, PyObject *args)
+{
+ PyObject *obj;
+ char *node;
+ long offset;
+ Py_ssize_t len, nodelen;
+
+ if (!PyArg_ParseTuple(args, "lO", &offset, &obj))
+ return NULL;
+
+ if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 8) {
+ PyErr_SetString(PyExc_TypeError, "8-tuple required");
+ return NULL;
+ }
+
+ if (node_check(PyTuple_GET_ITEM(obj, 7), &node, &nodelen) == -1)
+ return NULL;
+
+ len = index_length(self);
+
+ if (offset < 0)
+ offset += len;
+
+ if (offset != len - 1) {
+ PyErr_SetString(PyExc_IndexError,
+ "insert only supported at index -1");
+ return NULL;
+ }
+
+ if (offset > INT_MAX) {
+ PyErr_SetString(PyExc_ValueError,
+ "currently only 2**31 revs supported");
+ return NULL;
+ }
+
+ if (self->added == NULL) {
+ self->added = PyList_New(0);
+ if (self->added == NULL)
+ return NULL;
+ }
+
+ if (PyList_Append(self->added, obj) == -1)
+ return NULL;
+
+ if (self->nt)
+ nt_insert(self, node, (int)offset);
+
+ Py_CLEAR(self->headrevs);
+ Py_RETURN_NONE;
+}
+
+static void _index_clearcaches(indexObject *self)
+{
+ if (self->cache) {
+ Py_ssize_t i;
+
+ for (i = 0; i < self->raw_length; i++)
+ Py_CLEAR(self->cache[i]);
+ free(self->cache);
+ self->cache = NULL;
+ }
+ if (self->offsets) {
+ free(self->offsets);
+ self->offsets = NULL;
+ }
+ if (self->nt) {
+ free(self->nt);
+ self->nt = NULL;
+ }
+ Py_CLEAR(self->headrevs);
+}
+
+static PyObject *index_clearcaches(indexObject *self)
+{
+ _index_clearcaches(self);
+ self->ntlength = self->ntcapacity = 0;
+ self->ntdepth = self->ntsplits = 0;
+ self->ntrev = -1;
+ self->ntlookups = self->ntmisses = 0;
+ Py_RETURN_NONE;
+}
+
+static PyObject *index_stats(indexObject *self)
+{
+ PyObject *obj = PyDict_New();
+
+ if (obj == NULL)
+ return NULL;
+
+#define istat(__n, __d) \
+ if (PyDict_SetItemString(obj, __d, PyInt_FromSsize_t(self->__n)) == -1) \
+ goto bail;
+
+ if (self->added) {
+ Py_ssize_t len = PyList_GET_SIZE(self->added);
+ if (PyDict_SetItemString(obj, "index entries added",
+ PyInt_FromSsize_t(len)) == -1)
+ goto bail;
+ }
+
+ if (self->raw_length != self->length - 1)
+ istat(raw_length, "revs on disk");
+ istat(length, "revs in memory");
+ istat(ntcapacity, "node trie capacity");
+ istat(ntdepth, "node trie depth");
+ istat(ntlength, "node trie count");
+ istat(ntlookups, "node trie lookups");
+ istat(ntmisses, "node trie misses");
+ istat(ntrev, "node trie last rev scanned");
+ istat(ntsplits, "node trie splits");
+
+#undef istat
+
+ return obj;
+
+bail:
+ Py_XDECREF(obj);
+ return NULL;
+}
+
+/*
+ * When we cache a list, we want to be sure the caller can't mutate
+ * the cached copy.
+ */
+static PyObject *list_copy(PyObject *list)
+{
+ Py_ssize_t len = PyList_GET_SIZE(list);
+ PyObject *newlist = PyList_New(len);
+ Py_ssize_t i;
+
+ if (newlist == NULL)
+ return NULL;
+
+ for (i = 0; i < len; i++) {
+ PyObject *obj = PyList_GET_ITEM(list, i);
+ Py_INCREF(obj);
+ PyList_SET_ITEM(newlist, i, obj);
+ }
+
+ return newlist;
+}
+
+static PyObject *index_headrevs(indexObject *self)
+{
+ Py_ssize_t i, len, addlen;
+ char *nothead = NULL;
+ PyObject *heads;
+
+ if (self->headrevs)
+ return list_copy(self->headrevs);
+
+ len = index_length(self) - 1;
+ heads = PyList_New(0);
+ if (heads == NULL)
+ goto bail;
+ if (len == 0) {
+ PyObject *nullid = PyInt_FromLong(-1);
+ if (nullid == NULL || PyList_Append(heads, nullid) == -1) {
+ Py_XDECREF(nullid);
+ goto bail;
+ }
+ goto done;
+ }
+
+ nothead = calloc(len, 1);
+ if (nothead == NULL)
+ goto bail;
+
+ for (i = 0; i < self->raw_length; i++) {
+ const char *data = index_deref(self, i);
+ int parent_1 = getbe32(data + 24);
+ int parent_2 = getbe32(data + 28);
+ if (parent_1 >= 0)
+ nothead[parent_1] = 1;
+ if (parent_2 >= 0)
+ nothead[parent_2] = 1;
+ }
+
+ addlen = self->added ? PyList_GET_SIZE(self->added) : 0;
+
+ for (i = 0; i < addlen; i++) {
+ PyObject *rev = PyList_GET_ITEM(self->added, i);
+ PyObject *p1 = PyTuple_GET_ITEM(rev, 5);
+ PyObject *p2 = PyTuple_GET_ITEM(rev, 6);
+ long parent_1, parent_2;
+
+ if (!PyInt_Check(p1) || !PyInt_Check(p2)) {
+ PyErr_SetString(PyExc_TypeError,
+ "revlog parents are invalid");
+ goto bail;
+ }
+ parent_1 = PyInt_AS_LONG(p1);
+ parent_2 = PyInt_AS_LONG(p2);
+ if (parent_1 >= 0)
+ nothead[parent_1] = 1;
+ if (parent_2 >= 0)
+ nothead[parent_2] = 1;
+ }
+
+ for (i = 0; i < len; i++) {
+ PyObject *head;
+
+ if (nothead[i])
+ continue;
+ head = PyInt_FromLong(i);
+ if (head == NULL || PyList_Append(heads, head) == -1) {
+ Py_XDECREF(head);
+ goto bail;
+ }
+ }
+
+done:
+ self->headrevs = heads;
+ free(nothead);
+ return list_copy(self->headrevs);
+bail:
+ Py_XDECREF(heads);
+ free(nothead);
+ return NULL;
+}
+
+static inline int nt_level(const char *node, Py_ssize_t level)
+{
+ int v = node[level>>1];
+ if (!(level & 1))
+ v >>= 4;
+ return v & 0xf;
+}
+
+/*
+ * Return values:
+ *
+ * -4: match is ambiguous (multiple candidates)
+ * -2: not found
+ * rest: valid rev
+ */
+static int nt_find(indexObject *self, const char *node, Py_ssize_t nodelen,
+ int hex)
+{
+ int (*getnybble)(const char *, Py_ssize_t) = hex ? hexdigit : nt_level;
+ int level, maxlevel, off;
+
+ if (nodelen == 20 && node[0] == '\0' && memcmp(node, nullid, 20) == 0)
+ return -1;
+
+ if (self->nt == NULL)
+ return -2;
+
+ if (hex)
+ maxlevel = nodelen > 40 ? 40 : (int)nodelen;
+ else
+ maxlevel = nodelen > 20 ? 40 : ((int)nodelen * 2);
+
+ for (level = off = 0; level < maxlevel; level++) {
+ int k = getnybble(node, level);
+ nodetree *n = &self->nt[off];
+ int v = n->children[k];
+
+ if (v < 0) {
+ const char *n;
+ Py_ssize_t i;
+
+ v = -v - 1;
+ n = index_node(self, v);
+ if (n == NULL)
+ return -2;
+ for (i = level; i < maxlevel; i++)
+ if (getnybble(node, i) != nt_level(n, i))
+ return -2;
+ return v;
+ }
+ if (v == 0)
+ return -2;
+ off = v;
+ }
+ /* multiple matches against an ambiguous prefix */
+ return -4;
+}
+
+static int nt_new(indexObject *self)
+{
+ if (self->ntlength == self->ntcapacity) {
+ self->ntcapacity *= 2;
+ self->nt = realloc(self->nt,
+ self->ntcapacity * sizeof(nodetree));
+ if (self->nt == NULL) {
+ PyErr_SetString(PyExc_MemoryError, "out of memory");
+ return -1;
+ }
+ memset(&self->nt[self->ntlength], 0,
+ sizeof(nodetree) * (self->ntcapacity - self->ntlength));
+ }
+ return self->ntlength++;
+}
+
+static int nt_insert(indexObject *self, const char *node, int rev)
+{
+ int level = 0;
+ int off = 0;
+
+ while (level < 40) {
+ int k = nt_level(node, level);
+ nodetree *n;
+ int v;
+
+ n = &self->nt[off];
+ v = n->children[k];
+
+ if (v == 0) {
+ n->children[k] = -rev - 1;
+ return 0;
+ }
+ if (v < 0) {
+ const char *oldnode = index_node(self, -v - 1);
+ int noff;
+
+ if (!oldnode || !memcmp(oldnode, node, 20)) {
+ n->children[k] = -rev - 1;
+ return 0;
+ }
+ noff = nt_new(self);
+ if (noff == -1)
+ return -1;
+ /* self->nt may have been changed by realloc */
+ self->nt[off].children[k] = noff;
+ off = noff;
+ n = &self->nt[off];
+ n->children[nt_level(oldnode, ++level)] = v;
+ if (level > self->ntdepth)
+ self->ntdepth = level;
+ self->ntsplits += 1;
+ } else {
+ level += 1;
+ off = v;
+ }
+ }
+
+ return -1;
+}
+
+static int nt_init(indexObject *self)
+{
+ if (self->nt == NULL) {
+ self->ntcapacity = self->raw_length < 4
+ ? 4 : self->raw_length / 2;
+ self->nt = calloc(self->ntcapacity, sizeof(nodetree));
+ if (self->nt == NULL) {
+ PyErr_NoMemory();
+ return -1;
+ }
+ self->ntlength = 1;
+ self->ntrev = (int)index_length(self) - 1;
+ self->ntlookups = 1;
+ self->ntmisses = 0;
+ if (nt_insert(self, nullid, INT_MAX) == -1)
+ return -1;
+ }
+ return 0;
+}
+
+/*
+ * Return values:
+ *
+ * -3: error (exception set)
+ * -2: not found (no exception set)
+ * rest: valid rev
+ */
+static int index_find_node(indexObject *self,
+ const char *node, Py_ssize_t nodelen)
+{
+ int rev;
+
+ self->ntlookups++;
+ rev = nt_find(self, node, nodelen, 0);
+ if (rev >= -1)
+ return rev;
+
+ if (nt_init(self) == -1)
+ return -3;
+
+ /*
+ * For the first handful of lookups, we scan the entire index,
+ * and cache only the matching nodes. This optimizes for cases
+ * like "hg tip", where only a few nodes are accessed.
+ *
+ * After that, we cache every node we visit, using a single
+ * scan amortized over multiple lookups. This gives the best
+ * bulk performance, e.g. for "hg log".
+ */
+ if (self->ntmisses++ < 4) {
+ for (rev = self->ntrev - 1; rev >= 0; rev--) {
+ const char *n = index_node(self, rev);
+ if (n == NULL)
+ return -2;
+ if (memcmp(node, n, nodelen > 20 ? 20 : nodelen) == 0) {
+ if (nt_insert(self, n, rev) == -1)
+ return -3;
+ break;
+ }
+ }
+ } else {
+ for (rev = self->ntrev - 1; rev >= 0; rev--) {
+ const char *n = index_node(self, rev);
+ if (n == NULL) {
+ self->ntrev = rev + 1;
+ return -2;
+ }
+ if (nt_insert(self, n, rev) == -1) {
+ self->ntrev = rev + 1;
+ return -3;
+ }
+ if (memcmp(node, n, nodelen > 20 ? 20 : nodelen) == 0) {
+ break;
+ }
+ }
+ self->ntrev = rev;
+ }
+
+ if (rev >= 0)
+ return rev;
+ return -2;
+}
+
+static PyObject *raise_revlog_error(void)
+{
+ static PyObject *errclass;
+ PyObject *mod = NULL, *errobj;
+
+ if (errclass == NULL) {
+ PyObject *dict;
+
+ mod = PyImport_ImportModule("mercurial.error");
+ if (mod == NULL)
+ goto classfail;
+
+ dict = PyModule_GetDict(mod);
+ if (dict == NULL)
+ goto classfail;
+
+ errclass = PyDict_GetItemString(dict, "RevlogError");
+ if (errclass == NULL) {
+ PyErr_SetString(PyExc_SystemError,
+ "could not find RevlogError");
+ goto classfail;
+ }
+ Py_INCREF(errclass);
+ }
+
+ errobj = PyObject_CallFunction(errclass, NULL);
+ if (errobj == NULL)
+ return NULL;
+ PyErr_SetObject(errclass, errobj);
+ return errobj;
+
+classfail:
+ Py_XDECREF(mod);
+ return NULL;
+}
+
+static PyObject *index_getitem(indexObject *self, PyObject *value)
+{
+ char *node;
+ Py_ssize_t nodelen;
+ int rev;
+
+ if (PyInt_Check(value))
+ return index_get(self, PyInt_AS_LONG(value));
+
+ if (node_check(value, &node, &nodelen) == -1)
+ return NULL;
+ rev = index_find_node(self, node, nodelen);
+ if (rev >= -1)
+ return PyInt_FromLong(rev);
+ if (rev == -2)
+ raise_revlog_error();
+ return NULL;
+}
+
+static int nt_partialmatch(indexObject *self, const char *node,
+ Py_ssize_t nodelen)
+{
+ int rev;
+
+ if (nt_init(self) == -1)
+ return -3;
+
+ if (self->ntrev > 0) {
+ /* ensure that the radix tree is fully populated */
+ for (rev = self->ntrev - 1; rev >= 0; rev--) {
+ const char *n = index_node(self, rev);
+ if (n == NULL)
+ return -2;
+ if (nt_insert(self, n, rev) == -1)
+ return -3;
+ }
+ self->ntrev = rev;
+ }
+
+ return nt_find(self, node, nodelen, 1);
+}
+
+static PyObject *index_partialmatch(indexObject *self, PyObject *args)
+{
+ const char *fullnode;
+ int nodelen;
+ char *node;
+ int rev, i;
+
+ if (!PyArg_ParseTuple(args, "s#", &node, &nodelen))
+ return NULL;
+
+ if (nodelen < 4) {
+ PyErr_SetString(PyExc_ValueError, "key too short");
+ return NULL;
+ }
+
+ if (nodelen > 40)
+ nodelen = 40;
+
+ for (i = 0; i < nodelen; i++)
+ hexdigit(node, i);
+ if (PyErr_Occurred()) {
+ /* input contains non-hex characters */
+ PyErr_Clear();
+ Py_RETURN_NONE;
+ }
+
+ rev = nt_partialmatch(self, node, nodelen);
+
+ switch (rev) {
+ case -4:
+ raise_revlog_error();
+ case -3:
+ return NULL;
+ case -2:
+ Py_RETURN_NONE;
+ case -1:
+ return PyString_FromStringAndSize(nullid, 20);
+ }
+
+ fullnode = index_node(self, rev);
+ if (fullnode == NULL) {
+ PyErr_Format(PyExc_IndexError,
+ "could not access rev %d", rev);
+ return NULL;
+ }
+ return PyString_FromStringAndSize(fullnode, 20);
+}
+
+static PyObject *index_m_get(indexObject *self, PyObject *args)
+{
+ Py_ssize_t nodelen;
+ PyObject *val;
+ char *node;
+ int rev;
+
+ if (!PyArg_ParseTuple(args, "O", &val))
+ return NULL;
+ if (node_check(val, &node, &nodelen) == -1)
+ return NULL;
+ rev = index_find_node(self, node, nodelen);
+ if (rev == -3)
+ return NULL;
+ if (rev == -2)
+ Py_RETURN_NONE;
+ return PyInt_FromLong(rev);
+}
+
+static int index_contains(indexObject *self, PyObject *value)
+{
+ char *node;
+ Py_ssize_t nodelen;
+
+ if (PyInt_Check(value)) {
+ long rev = PyInt_AS_LONG(value);
+ return rev >= -1 && rev < index_length(self);
+ }
+
+ if (node_check(value, &node, &nodelen) == -1)
+ return -1;
+
+ switch (index_find_node(self, node, nodelen)) {
+ case -3:
+ return -1;
+ case -2:
+ return 0;
+ default:
+ return 1;
+ }
+}
+
+/*
+ * Invalidate any trie entries introduced by added revs.
+ */
+static void nt_invalidate_added(indexObject *self, Py_ssize_t start)
+{
+ Py_ssize_t i, len = PyList_GET_SIZE(self->added);
+
+ for (i = start; i < len; i++) {
+ PyObject *tuple = PyList_GET_ITEM(self->added, i);
+ PyObject *node = PyTuple_GET_ITEM(tuple, 7);
+
+ nt_insert(self, PyString_AS_STRING(node), -1);
+ }
+
+ if (start == 0)
+ Py_CLEAR(self->added);
+}
+
+/*
+ * Delete a numeric range of revs, which must be at the end of the
+ * range, but exclude the sentinel nullid entry.
+ */
+static int index_slice_del(indexObject *self, PyObject *item)
+{
+ Py_ssize_t start, stop, step, slicelength;
+ Py_ssize_t length = index_length(self);
+ int ret = 0;
+
+ if (PySlice_GetIndicesEx((PySliceObject*)item, length,
+ &start, &stop, &step, &slicelength) < 0)
+ return -1;
+
+ if (slicelength <= 0)
+ return 0;
+
+ if ((step < 0 && start < stop) || (step > 0 && start > stop))
+ stop = start;
+
+ if (step < 0) {
+ stop = start + 1;
+ start = stop + step*(slicelength - 1) - 1;
+ step = -step;
+ }
+
+ if (step != 1) {
+ PyErr_SetString(PyExc_ValueError,
+ "revlog index delete requires step size of 1");
+ return -1;
+ }
+
+ if (stop != length - 1) {
+ PyErr_SetString(PyExc_IndexError,
+ "revlog index deletion indices are invalid");
+ return -1;
+ }
+
+ if (start < self->length - 1) {
+ if (self->nt) {
+ Py_ssize_t i;
+
+ for (i = start + 1; i < self->length - 1; i++) {
+ const char *node = index_node(self, i);
+
+ if (node)
+ nt_insert(self, node, -1);
+ }
+ if (self->added)
+ nt_invalidate_added(self, 0);
+ if (self->ntrev > start)
+ self->ntrev = (int)start;
+ }
+ self->length = start + 1;
+ if (start < self->raw_length)
+ self->raw_length = start;
+ goto done;
+ }
+
+ if (self->nt) {
+ nt_invalidate_added(self, start - self->length + 1);
+ if (self->ntrev > start)
+ self->ntrev = (int)start;
+ }
+ if (self->added)
+ ret = PyList_SetSlice(self->added, start - self->length + 1,
+ PyList_GET_SIZE(self->added), NULL);
+done:
+ Py_CLEAR(self->headrevs);
+ return ret;
+}
+
+/*
+ * Supported ops:
+ *
+ * slice deletion
+ * string assignment (extend node->rev mapping)
+ * string deletion (shrink node->rev mapping)
+ */
+static int index_assign_subscript(indexObject *self, PyObject *item,
+ PyObject *value)
+{
+ char *node;
+ Py_ssize_t nodelen;
+ long rev;
+
+ if (PySlice_Check(item) && value == NULL)
+ return index_slice_del(self, item);
+
+ if (node_check(item, &node, &nodelen) == -1)
+ return -1;
+
+ if (value == NULL)
+ return self->nt ? nt_insert(self, node, -1) : 0;
+ rev = PyInt_AsLong(value);
+ if (rev > INT_MAX || rev < 0) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_ValueError, "rev out of range");
+ return -1;
+ }
+ return nt_insert(self, node, (int)rev);
+}
+
+/*
+ * Find all RevlogNG entries in an index that has inline data. Update
+ * the optional "offsets" table with those entries.
+ */
+static long inline_scan(indexObject *self, const char **offsets)
+{
+ const char *data = PyString_AS_STRING(self->data);
+ const char *end = data + PyString_GET_SIZE(self->data);
+ long incr = v1_hdrsize;
+ Py_ssize_t len = 0;
+
+ while (data + v1_hdrsize <= end) {
+ uint32_t comp_len;
+ const char *old_data;
+ /* 3rd element of header is length of compressed inline data */
+ comp_len = getbe32(data + 8);
+ incr = v1_hdrsize + comp_len;
+ if (incr < v1_hdrsize)
+ break;
+ if (offsets)
+ offsets[len] = data;
+ len++;
+ old_data = data;
+ data += incr;
+ if (data <= old_data)
+ break;
+ }
+
+ if (data != end && data + v1_hdrsize != end) {
+ if (!PyErr_Occurred())
+ PyErr_SetString(PyExc_ValueError, "corrupt index file");
+ return -1;
+ }
+
+ return len;
+}
+
+static int index_init(indexObject *self, PyObject *args)
+{
+ PyObject *data_obj, *inlined_obj;
+ Py_ssize_t size;
+
+ if (!PyArg_ParseTuple(args, "OO", &data_obj, &inlined_obj))
+ return -1;
+ if (!PyString_Check(data_obj)) {
+ PyErr_SetString(PyExc_TypeError, "data is not a string");
+ return -1;
+ }
+ size = PyString_GET_SIZE(data_obj);
+
+ self->inlined = inlined_obj && PyObject_IsTrue(inlined_obj);
+ self->data = data_obj;
+ self->cache = NULL;
+
+ self->added = NULL;
+ self->headrevs = NULL;
+ self->offsets = NULL;
+ self->nt = NULL;
+ self->ntlength = self->ntcapacity = 0;
+ self->ntdepth = self->ntsplits = 0;
+ self->ntlookups = self->ntmisses = 0;
+ self->ntrev = -1;
+ Py_INCREF(self->data);
+
+ if (self->inlined) {
+ long len = inline_scan(self, NULL);
+ if (len == -1)
+ goto bail;
+ self->raw_length = len;
+ self->length = len + 1;
+ } else {
+ if (size % v1_hdrsize) {
+ PyErr_SetString(PyExc_ValueError, "corrupt index file");
+ goto bail;
+ }
+ self->raw_length = size / v1_hdrsize;
+ self->length = self->raw_length + 1;
+ }
+
+ return 0;
+bail:
+ return -1;
+}
+
+static PyObject *index_nodemap(indexObject *self)
+{
+ Py_INCREF(self);
+ return (PyObject *)self;
+}
+
+static void index_dealloc(indexObject *self)
+{
+ _index_clearcaches(self);
+ Py_DECREF(self->data);
+ Py_XDECREF(self->added);
+ PyObject_Del(self);
+}
+
+static PySequenceMethods index_sequence_methods = {
+ (lenfunc)index_length, /* sq_length */
+ 0, /* sq_concat */
+ 0, /* sq_repeat */
+ (ssizeargfunc)index_get, /* sq_item */
+ 0, /* sq_slice */
+ 0, /* sq_ass_item */
+ 0, /* sq_ass_slice */
+ (objobjproc)index_contains, /* sq_contains */
+};
+
+static PyMappingMethods index_mapping_methods = {
+ (lenfunc)index_length, /* mp_length */
+ (binaryfunc)index_getitem, /* mp_subscript */
+ (objobjargproc)index_assign_subscript, /* mp_ass_subscript */
+};
+
+static PyMethodDef index_methods[] = {
+ {"clearcaches", (PyCFunction)index_clearcaches, METH_NOARGS,
+ "clear the index caches"},
+ {"get", (PyCFunction)index_m_get, METH_VARARGS,
+ "get an index entry"},
+ {"headrevs", (PyCFunction)index_headrevs, METH_NOARGS,
+ "get head revisions"},
+ {"insert", (PyCFunction)index_insert, METH_VARARGS,
+ "insert an index entry"},
+ {"partialmatch", (PyCFunction)index_partialmatch, METH_VARARGS,
+ "match a potentially ambiguous node ID"},
+ {"stats", (PyCFunction)index_stats, METH_NOARGS,
+ "stats for the index"},
+ {NULL} /* Sentinel */
+};
+
+static PyGetSetDef index_getset[] = {
+ {"nodemap", (getter)index_nodemap, NULL, "nodemap", NULL},
+ {NULL} /* Sentinel */
+};
+
+static PyTypeObject indexType = {
+ PyObject_HEAD_INIT(NULL)
+ 0, /* ob_size */
+ "parsers.index", /* tp_name */
+ sizeof(indexObject), /* tp_basicsize */
+ 0, /* tp_itemsize */
+ (destructor)index_dealloc, /* tp_dealloc */
+ 0, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ 0, /* tp_compare */
+ 0, /* tp_repr */
+ 0, /* tp_as_number */
+ &index_sequence_methods, /* tp_as_sequence */
+ &index_mapping_methods, /* tp_as_mapping */
+ 0, /* tp_hash */
+ 0, /* tp_call */
+ 0, /* tp_str */
+ 0, /* tp_getattro */
+ 0, /* tp_setattro */
+ 0, /* tp_as_buffer */
+ Py_TPFLAGS_DEFAULT, /* tp_flags */
+ "revlog index", /* tp_doc */
+ 0, /* tp_traverse */
+ 0, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ 0, /* tp_iter */
+ 0, /* tp_iternext */
+ index_methods, /* tp_methods */
+ 0, /* tp_members */
+ index_getset, /* tp_getset */
+ 0, /* tp_base */
+ 0, /* tp_dict */
+ 0, /* tp_descr_get */
+ 0, /* tp_descr_set */
+ 0, /* tp_dictoffset */
+ (initproc)index_init, /* tp_init */
+ 0, /* tp_alloc */
+};
+
+/*
+ * returns a tuple of the form (index, index, cache) with elements as
+ * follows:
+ *
+ * index: an index object that lazily parses RevlogNG records
+ * cache: if data is inlined, a tuple (index_file_content, 0), else None
+ *
+ * added complications are for backwards compatibility
+ */
+static PyObject *parse_index2(PyObject *self, PyObject *args)
+{
+ PyObject *tuple = NULL, *cache = NULL;
+ indexObject *idx;
+ int ret;
+
+ idx = PyObject_New(indexObject, &indexType);
+ if (idx == NULL)
+ goto bail;
+
+ ret = index_init(idx, args);
+ if (ret == -1)
+ goto bail;
+
+ if (idx->inlined) {
+ cache = Py_BuildValue("iO", 0, idx->data);
+ if (cache == NULL)
+ goto bail;
+ } else {
+ cache = Py_None;
+ Py_INCREF(cache);
+ }
+
+ tuple = Py_BuildValue("NN", idx, cache);
+ if (!tuple)
+ goto bail;
+ return tuple;
+
+bail:
+ Py_XDECREF(idx);
+ Py_XDECREF(cache);
+ Py_XDECREF(tuple);
+ return NULL;
+}
+
+static char parsers_doc[] = "Efficient content parsing.";
+
+static PyMethodDef methods[] = {
+ {"pack_dirstate", pack_dirstate, METH_VARARGS, "pack a dirstate\n"},
+ {"parse_manifest", parse_manifest, METH_VARARGS, "parse a manifest\n"},
+ {"parse_dirstate", parse_dirstate, METH_VARARGS, "parse a dirstate\n"},
+ {"parse_index2", parse_index2, METH_VARARGS, "parse a revlog index\n"},
+ {NULL, NULL}
+};
+
+static void module_init(PyObject *mod)
+{
+ indexType.tp_new = PyType_GenericNew;
+ if (PyType_Ready(&indexType) < 0)
+ return;
+ Py_INCREF(&indexType);
+
+ PyModule_AddObject(mod, "index", (PyObject *)&indexType);
+
+ nullentry = Py_BuildValue("iiiiiiis#", 0, 0, 0,
+ -1, -1, -1, -1, nullid, 20);
+ if (nullentry)
+ PyObject_GC_UnTrack(nullentry);
+
+ dirstate_unset = Py_BuildValue("ciii", 'n', 0, -1, -1);
+}
+
+#ifdef IS_PY3K
+static struct PyModuleDef parsers_module = {
+ PyModuleDef_HEAD_INIT,
+ "parsers",
+ parsers_doc,
+ -1,
+ methods
+};
+
+PyMODINIT_FUNC PyInit_parsers(void)
+{
+ PyObject *mod = PyModule_Create(&parsers_module);
+ module_init(mod);
+ return mod;
+}
+#else
+PyMODINIT_FUNC initparsers(void)
+{
+ PyObject *mod = Py_InitModule3("parsers", methods, parsers_doc);
+ module_init(mod);
+}
+#endif
diff --git a/mercurial/patch.py b/mercurial/patch.py
new file mode 100644
index 0000000..b216734
--- /dev/null
+++ b/mercurial/patch.py
@@ -0,0 +1,1899 @@
+# patch.py - patch file parsing routines
+#
+# Copyright 2006 Brendan Cully <brendan@kublai.com>
+# Copyright 2007 Chris Mason <chris.mason@oracle.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import cStringIO, email.Parser, os, errno, re
+import tempfile, zlib, shutil
+
+from i18n import _
+from node import hex, nullid, short
+import base85, mdiff, scmutil, util, diffhelpers, copies, encoding, error
+import context
+
+gitre = re.compile('diff --git a/(.*) b/(.*)')
+
+class PatchError(Exception):
+ pass
+
+
+# public functions
+
+def split(stream):
+ '''return an iterator of individual patches from a stream'''
+ def isheader(line, inheader):
+ if inheader and line[0] in (' ', '\t'):
+ # continuation
+ return True
+ if line[0] in (' ', '-', '+'):
+ # diff line - don't check for header pattern in there
+ return False
+ l = line.split(': ', 1)
+ return len(l) == 2 and ' ' not in l[0]
+
+ def chunk(lines):
+ return cStringIO.StringIO(''.join(lines))
+
+ def hgsplit(stream, cur):
+ inheader = True
+
+ for line in stream:
+ if not line.strip():
+ inheader = False
+ if not inheader and line.startswith('# HG changeset patch'):
+ yield chunk(cur)
+ cur = []
+ inheader = True
+
+ cur.append(line)
+
+ if cur:
+ yield chunk(cur)
+
+ def mboxsplit(stream, cur):
+ for line in stream:
+ if line.startswith('From '):
+ for c in split(chunk(cur[1:])):
+ yield c
+ cur = []
+
+ cur.append(line)
+
+ if cur:
+ for c in split(chunk(cur[1:])):
+ yield c
+
+ def mimesplit(stream, cur):
+ def msgfp(m):
+ fp = cStringIO.StringIO()
+ g = email.Generator.Generator(fp, mangle_from_=False)
+ g.flatten(m)
+ fp.seek(0)
+ return fp
+
+ for line in stream:
+ cur.append(line)
+ c = chunk(cur)
+
+ m = email.Parser.Parser().parse(c)
+ if not m.is_multipart():
+ yield msgfp(m)
+ else:
+ ok_types = ('text/plain', 'text/x-diff', 'text/x-patch')
+ for part in m.walk():
+ ct = part.get_content_type()
+ if ct not in ok_types:
+ continue
+ yield msgfp(part)
+
+ def headersplit(stream, cur):
+ inheader = False
+
+ for line in stream:
+ if not inheader and isheader(line, inheader):
+ yield chunk(cur)
+ cur = []
+ inheader = True
+ if inheader and not isheader(line, inheader):
+ inheader = False
+
+ cur.append(line)
+
+ if cur:
+ yield chunk(cur)
+
+ def remainder(cur):
+ yield chunk(cur)
+
+ class fiter(object):
+ def __init__(self, fp):
+ self.fp = fp
+
+ def __iter__(self):
+ return self
+
+ def next(self):
+ l = self.fp.readline()
+ if not l:
+ raise StopIteration
+ return l
+
+ inheader = False
+ cur = []
+
+ mimeheaders = ['content-type']
+
+ if not util.safehasattr(stream, 'next'):
+ # http responses, for example, have readline but not next
+ stream = fiter(stream)
+
+ for line in stream:
+ cur.append(line)
+ if line.startswith('# HG changeset patch'):
+ return hgsplit(stream, cur)
+ elif line.startswith('From '):
+ return mboxsplit(stream, cur)
+ elif isheader(line, inheader):
+ inheader = True
+ if line.split(':', 1)[0].lower() in mimeheaders:
+ # let email parser handle this
+ return mimesplit(stream, cur)
+ elif line.startswith('--- ') and inheader:
+ # No evil headers seen by diff start, split by hand
+ return headersplit(stream, cur)
+ # Not enough info, keep reading
+
+ # if we are here, we have a very plain patch
+ return remainder(cur)
+
+def extract(ui, fileobj):
+ '''extract patch from data read from fileobj.
+
+ patch can be a normal patch or contained in an email message.
+
+ return tuple (filename, message, user, date, branch, node, p1, p2).
+ Any item in the returned tuple can be None. If filename is None,
+ fileobj did not contain a patch. Caller must unlink filename when done.'''
+
+ # attempt to detect the start of a patch
+ # (this heuristic is borrowed from quilt)
+ diffre = re.compile(r'^(?:Index:[ \t]|diff[ \t]|RCS file: |'
+ r'retrieving revision [0-9]+(\.[0-9]+)*$|'
+ r'---[ \t].*?^\+\+\+[ \t]|'
+ r'\*\*\*[ \t].*?^---[ \t])', re.MULTILINE|re.DOTALL)
+
+ fd, tmpname = tempfile.mkstemp(prefix='hg-patch-')
+ tmpfp = os.fdopen(fd, 'w')
+ try:
+ msg = email.Parser.Parser().parse(fileobj)
+
+ subject = msg['Subject']
+ user = msg['From']
+ if not subject and not user:
+ # Not an email, restore parsed headers if any
+ subject = '\n'.join(': '.join(h) for h in msg.items()) + '\n'
+
+ gitsendmail = 'git-send-email' in msg.get('X-Mailer', '')
+ # should try to parse msg['Date']
+ date = None
+ nodeid = None
+ branch = None
+ parents = []
+
+ if subject:
+ if subject.startswith('[PATCH'):
+ pend = subject.find(']')
+ if pend >= 0:
+ subject = subject[pend + 1:].lstrip()
+ subject = re.sub(r'\n[ \t]+', ' ', subject)
+ ui.debug('Subject: %s\n' % subject)
+ if user:
+ ui.debug('From: %s\n' % user)
+ diffs_seen = 0
+ ok_types = ('text/plain', 'text/x-diff', 'text/x-patch')
+ message = ''
+ for part in msg.walk():
+ content_type = part.get_content_type()
+ ui.debug('Content-Type: %s\n' % content_type)
+ if content_type not in ok_types:
+ continue
+ payload = part.get_payload(decode=True)
+ m = diffre.search(payload)
+ if m:
+ hgpatch = False
+ hgpatchheader = False
+ ignoretext = False
+
+ ui.debug('found patch at byte %d\n' % m.start(0))
+ diffs_seen += 1
+ cfp = cStringIO.StringIO()
+ for line in payload[:m.start(0)].splitlines():
+ if line.startswith('# HG changeset patch') and not hgpatch:
+ ui.debug('patch generated by hg export\n')
+ hgpatch = True
+ hgpatchheader = True
+ # drop earlier commit message content
+ cfp.seek(0)
+ cfp.truncate()
+ subject = None
+ elif hgpatchheader:
+ if line.startswith('# User '):
+ user = line[7:]
+ ui.debug('From: %s\n' % user)
+ elif line.startswith("# Date "):
+ date = line[7:]
+ elif line.startswith("# Branch "):
+ branch = line[9:]
+ elif line.startswith("# Node ID "):
+ nodeid = line[10:]
+ elif line.startswith("# Parent "):
+ parents.append(line[9:].lstrip())
+ elif not line.startswith("# "):
+ hgpatchheader = False
+ elif line == '---' and gitsendmail:
+ ignoretext = True
+ if not hgpatchheader and not ignoretext:
+ cfp.write(line)
+ cfp.write('\n')
+ message = cfp.getvalue()
+ if tmpfp:
+ tmpfp.write(payload)
+ if not payload.endswith('\n'):
+ tmpfp.write('\n')
+ elif not diffs_seen and message and content_type == 'text/plain':
+ message += '\n' + payload
+ except: # re-raises
+ tmpfp.close()
+ os.unlink(tmpname)
+ raise
+
+ if subject and not message.startswith(subject):
+ message = '%s\n%s' % (subject, message)
+ tmpfp.close()
+ if not diffs_seen:
+ os.unlink(tmpname)
+ return None, message, user, date, branch, None, None, None
+ p1 = parents and parents.pop(0) or None
+ p2 = parents and parents.pop(0) or None
+ return tmpname, message, user, date, branch, nodeid, p1, p2
+
+class patchmeta(object):
+ """Patched file metadata
+
+ 'op' is the performed operation within ADD, DELETE, RENAME, MODIFY
+ or COPY. 'path' is patched file path. 'oldpath' is set to the
+ origin file when 'op' is either COPY or RENAME, None otherwise. If
+ file mode is changed, 'mode' is a tuple (islink, isexec) where
+ 'islink' is True if the file is a symlink and 'isexec' is True if
+ the file is executable. Otherwise, 'mode' is None.
+ """
+ def __init__(self, path):
+ self.path = path
+ self.oldpath = None
+ self.mode = None
+ self.op = 'MODIFY'
+ self.binary = False
+
+ def setmode(self, mode):
+ islink = mode & 020000
+ isexec = mode & 0100
+ self.mode = (islink, isexec)
+
+ def copy(self):
+ other = patchmeta(self.path)
+ other.oldpath = self.oldpath
+ other.mode = self.mode
+ other.op = self.op
+ other.binary = self.binary
+ return other
+
+ def _ispatchinga(self, afile):
+ if afile == '/dev/null':
+ return self.op == 'ADD'
+ return afile == 'a/' + (self.oldpath or self.path)
+
+ def _ispatchingb(self, bfile):
+ if bfile == '/dev/null':
+ return self.op == 'DELETE'
+ return bfile == 'b/' + self.path
+
+ def ispatching(self, afile, bfile):
+ return self._ispatchinga(afile) and self._ispatchingb(bfile)
+
+ def __repr__(self):
+ return "<patchmeta %s %r>" % (self.op, self.path)
+
+def readgitpatch(lr):
+ """extract git-style metadata about patches from <patchname>"""
+
+ # Filter patch for git information
+ gp = None
+ gitpatches = []
+ for line in lr:
+ line = line.rstrip(' \r\n')
+ if line.startswith('diff --git'):
+ m = gitre.match(line)
+ if m:
+ if gp:
+ gitpatches.append(gp)
+ dst = m.group(2)
+ gp = patchmeta(dst)
+ elif gp:
+ if line.startswith('--- '):
+ gitpatches.append(gp)
+ gp = None
+ continue
+ if line.startswith('rename from '):
+ gp.op = 'RENAME'
+ gp.oldpath = line[12:]
+ elif line.startswith('rename to '):
+ gp.path = line[10:]
+ elif line.startswith('copy from '):
+ gp.op = 'COPY'
+ gp.oldpath = line[10:]
+ elif line.startswith('copy to '):
+ gp.path = line[8:]
+ elif line.startswith('deleted file'):
+ gp.op = 'DELETE'
+ elif line.startswith('new file mode '):
+ gp.op = 'ADD'
+ gp.setmode(int(line[-6:], 8))
+ elif line.startswith('new mode '):
+ gp.setmode(int(line[-6:], 8))
+ elif line.startswith('GIT binary patch'):
+ gp.binary = True
+ if gp:
+ gitpatches.append(gp)
+
+ return gitpatches
+
+class linereader(object):
+ # simple class to allow pushing lines back into the input stream
+ def __init__(self, fp):
+ self.fp = fp
+ self.buf = []
+
+ def push(self, line):
+ if line is not None:
+ self.buf.append(line)
+
+ def readline(self):
+ if self.buf:
+ l = self.buf[0]
+ del self.buf[0]
+ return l
+ return self.fp.readline()
+
+ def __iter__(self):
+ while True:
+ l = self.readline()
+ if not l:
+ break
+ yield l
+
+class abstractbackend(object):
+ def __init__(self, ui):
+ self.ui = ui
+
+ def getfile(self, fname):
+ """Return target file data and flags as a (data, (islink,
+ isexec)) tuple.
+ """
+ raise NotImplementedError
+
+ def setfile(self, fname, data, mode, copysource):
+ """Write data to target file fname and set its mode. mode is a
+ (islink, isexec) tuple. If data is None, the file content should
+ be left unchanged. If the file is modified after being copied,
+ copysource is set to the original file name.
+ """
+ raise NotImplementedError
+
+ def unlink(self, fname):
+ """Unlink target file."""
+ raise NotImplementedError
+
+ def writerej(self, fname, failed, total, lines):
+ """Write rejected lines for fname. total is the number of hunks
+ which failed to apply and total the total number of hunks for this
+ files.
+ """
+ pass
+
+ def exists(self, fname):
+ raise NotImplementedError
+
+class fsbackend(abstractbackend):
+ def __init__(self, ui, basedir):
+ super(fsbackend, self).__init__(ui)
+ self.opener = scmutil.opener(basedir)
+
+ def _join(self, f):
+ return os.path.join(self.opener.base, f)
+
+ def getfile(self, fname):
+ path = self._join(fname)
+ if os.path.islink(path):
+ return (os.readlink(path), (True, False))
+ isexec = False
+ try:
+ isexec = os.lstat(path).st_mode & 0100 != 0
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ return (self.opener.read(fname), (False, isexec))
+
+ def setfile(self, fname, data, mode, copysource):
+ islink, isexec = mode
+ if data is None:
+ util.setflags(self._join(fname), islink, isexec)
+ return
+ if islink:
+ self.opener.symlink(data, fname)
+ else:
+ self.opener.write(fname, data)
+ if isexec:
+ util.setflags(self._join(fname), False, True)
+
+ def unlink(self, fname):
+ try:
+ util.unlinkpath(self._join(fname))
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+
+ def writerej(self, fname, failed, total, lines):
+ fname = fname + ".rej"
+ self.ui.warn(
+ _("%d out of %d hunks FAILED -- saving rejects to file %s\n") %
+ (failed, total, fname))
+ fp = self.opener(fname, 'w')
+ fp.writelines(lines)
+ fp.close()
+
+ def exists(self, fname):
+ return os.path.lexists(self._join(fname))
+
+class workingbackend(fsbackend):
+ def __init__(self, ui, repo, similarity):
+ super(workingbackend, self).__init__(ui, repo.root)
+ self.repo = repo
+ self.similarity = similarity
+ self.removed = set()
+ self.changed = set()
+ self.copied = []
+
+ def _checkknown(self, fname):
+ if self.repo.dirstate[fname] == '?' and self.exists(fname):
+ raise PatchError(_('cannot patch %s: file is not tracked') % fname)
+
+ def setfile(self, fname, data, mode, copysource):
+ self._checkknown(fname)
+ super(workingbackend, self).setfile(fname, data, mode, copysource)
+ if copysource is not None:
+ self.copied.append((copysource, fname))
+ self.changed.add(fname)
+
+ def unlink(self, fname):
+ self._checkknown(fname)
+ super(workingbackend, self).unlink(fname)
+ self.removed.add(fname)
+ self.changed.add(fname)
+
+ def close(self):
+ wctx = self.repo[None]
+ addremoved = set(self.changed)
+ for src, dst in self.copied:
+ scmutil.dirstatecopy(self.ui, self.repo, wctx, src, dst)
+ if self.removed:
+ wctx.forget(sorted(self.removed))
+ for f in self.removed:
+ if f not in self.repo.dirstate:
+ # File was deleted and no longer belongs to the
+ # dirstate, it was probably marked added then
+ # deleted, and should not be considered by
+ # addremove().
+ addremoved.discard(f)
+ if addremoved:
+ cwd = self.repo.getcwd()
+ if cwd:
+ addremoved = [util.pathto(self.repo.root, cwd, f)
+ for f in addremoved]
+ scmutil.addremove(self.repo, addremoved, similarity=self.similarity)
+ return sorted(self.changed)
+
+class filestore(object):
+ def __init__(self, maxsize=None):
+ self.opener = None
+ self.files = {}
+ self.created = 0
+ self.maxsize = maxsize
+ if self.maxsize is None:
+ self.maxsize = 4*(2**20)
+ self.size = 0
+ self.data = {}
+
+ def setfile(self, fname, data, mode, copied=None):
+ if self.maxsize < 0 or (len(data) + self.size) <= self.maxsize:
+ self.data[fname] = (data, mode, copied)
+ self.size += len(data)
+ else:
+ if self.opener is None:
+ root = tempfile.mkdtemp(prefix='hg-patch-')
+ self.opener = scmutil.opener(root)
+ # Avoid filename issues with these simple names
+ fn = str(self.created)
+ self.opener.write(fn, data)
+ self.created += 1
+ self.files[fname] = (fn, mode, copied)
+
+ def getfile(self, fname):
+ if fname in self.data:
+ return self.data[fname]
+ if not self.opener or fname not in self.files:
+ raise IOError
+ fn, mode, copied = self.files[fname]
+ return self.opener.read(fn), mode, copied
+
+ def close(self):
+ if self.opener:
+ shutil.rmtree(self.opener.base)
+
+class repobackend(abstractbackend):
+ def __init__(self, ui, repo, ctx, store):
+ super(repobackend, self).__init__(ui)
+ self.repo = repo
+ self.ctx = ctx
+ self.store = store
+ self.changed = set()
+ self.removed = set()
+ self.copied = {}
+
+ def _checkknown(self, fname):
+ if fname not in self.ctx:
+ raise PatchError(_('cannot patch %s: file is not tracked') % fname)
+
+ def getfile(self, fname):
+ try:
+ fctx = self.ctx[fname]
+ except error.LookupError:
+ raise IOError
+ flags = fctx.flags()
+ return fctx.data(), ('l' in flags, 'x' in flags)
+
+ def setfile(self, fname, data, mode, copysource):
+ if copysource:
+ self._checkknown(copysource)
+ if data is None:
+ data = self.ctx[fname].data()
+ self.store.setfile(fname, data, mode, copysource)
+ self.changed.add(fname)
+ if copysource:
+ self.copied[fname] = copysource
+
+ def unlink(self, fname):
+ self._checkknown(fname)
+ self.removed.add(fname)
+
+ def exists(self, fname):
+ return fname in self.ctx
+
+ def close(self):
+ return self.changed | self.removed
+
+# @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1
+unidesc = re.compile('@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@')
+contextdesc = re.compile('(?:---|\*\*\*) (\d+)(?:,(\d+))? (?:---|\*\*\*)')
+eolmodes = ['strict', 'crlf', 'lf', 'auto']
+
+class patchfile(object):
+ def __init__(self, ui, gp, backend, store, eolmode='strict'):
+ self.fname = gp.path
+ self.eolmode = eolmode
+ self.eol = None
+ self.backend = backend
+ self.ui = ui
+ self.lines = []
+ self.exists = False
+ self.missing = True
+ self.mode = gp.mode
+ self.copysource = gp.oldpath
+ self.create = gp.op in ('ADD', 'COPY', 'RENAME')
+ self.remove = gp.op == 'DELETE'
+ try:
+ if self.copysource is None:
+ data, mode = backend.getfile(self.fname)
+ self.exists = True
+ else:
+ data, mode = store.getfile(self.copysource)[:2]
+ self.exists = backend.exists(self.fname)
+ self.missing = False
+ if data:
+ self.lines = mdiff.splitnewlines(data)
+ if self.mode is None:
+ self.mode = mode
+ if self.lines:
+ # Normalize line endings
+ if self.lines[0].endswith('\r\n'):
+ self.eol = '\r\n'
+ elif self.lines[0].endswith('\n'):
+ self.eol = '\n'
+ if eolmode != 'strict':
+ nlines = []
+ for l in self.lines:
+ if l.endswith('\r\n'):
+ l = l[:-2] + '\n'
+ nlines.append(l)
+ self.lines = nlines
+ except IOError:
+ if self.create:
+ self.missing = False
+ if self.mode is None:
+ self.mode = (False, False)
+ if self.missing:
+ self.ui.warn(_("unable to find '%s' for patching\n") % self.fname)
+
+ self.hash = {}
+ self.dirty = 0
+ self.offset = 0
+ self.skew = 0
+ self.rej = []
+ self.fileprinted = False
+ self.printfile(False)
+ self.hunks = 0
+
+ def writelines(self, fname, lines, mode):
+ if self.eolmode == 'auto':
+ eol = self.eol
+ elif self.eolmode == 'crlf':
+ eol = '\r\n'
+ else:
+ eol = '\n'
+
+ if self.eolmode != 'strict' and eol and eol != '\n':
+ rawlines = []
+ for l in lines:
+ if l and l[-1] == '\n':
+ l = l[:-1] + eol
+ rawlines.append(l)
+ lines = rawlines
+
+ self.backend.setfile(fname, ''.join(lines), mode, self.copysource)
+
+ def printfile(self, warn):
+ if self.fileprinted:
+ return
+ if warn or self.ui.verbose:
+ self.fileprinted = True
+ s = _("patching file %s\n") % self.fname
+ if warn:
+ self.ui.warn(s)
+ else:
+ self.ui.note(s)
+
+
+ def findlines(self, l, linenum):
+ # looks through the hash and finds candidate lines. The
+ # result is a list of line numbers sorted based on distance
+ # from linenum
+
+ cand = self.hash.get(l, [])
+ if len(cand) > 1:
+ # resort our list of potentials forward then back.
+ cand.sort(key=lambda x: abs(x - linenum))
+ return cand
+
+ def write_rej(self):
+ # our rejects are a little different from patch(1). This always
+ # creates rejects in the same form as the original patch. A file
+ # header is inserted so that you can run the reject through patch again
+ # without having to type the filename.
+ if not self.rej:
+ return
+ base = os.path.basename(self.fname)
+ lines = ["--- %s\n+++ %s\n" % (base, base)]
+ for x in self.rej:
+ for l in x.hunk:
+ lines.append(l)
+ if l[-1] != '\n':
+ lines.append("\n\ No newline at end of file\n")
+ self.backend.writerej(self.fname, len(self.rej), self.hunks, lines)
+
+ def apply(self, h):
+ if not h.complete():
+ raise PatchError(_("bad hunk #%d %s (%d %d %d %d)") %
+ (h.number, h.desc, len(h.a), h.lena, len(h.b),
+ h.lenb))
+
+ self.hunks += 1
+
+ if self.missing:
+ self.rej.append(h)
+ return -1
+
+ if self.exists and self.create:
+ if self.copysource:
+ self.ui.warn(_("cannot create %s: destination already "
+ "exists\n" % self.fname))
+ else:
+ self.ui.warn(_("file %s already exists\n") % self.fname)
+ self.rej.append(h)
+ return -1
+
+ if isinstance(h, binhunk):
+ if self.remove:
+ self.backend.unlink(self.fname)
+ else:
+ self.lines[:] = h.new()
+ self.offset += len(h.new())
+ self.dirty = True
+ return 0
+
+ horig = h
+ if (self.eolmode in ('crlf', 'lf')
+ or self.eolmode == 'auto' and self.eol):
+ # If new eols are going to be normalized, then normalize
+ # hunk data before patching. Otherwise, preserve input
+ # line-endings.
+ h = h.getnormalized()
+
+ # fast case first, no offsets, no fuzz
+ old, oldstart, new, newstart = h.fuzzit(0, False)
+ oldstart += self.offset
+ orig_start = oldstart
+ # if there's skew we want to emit the "(offset %d lines)" even
+ # when the hunk cleanly applies at start + skew, so skip the
+ # fast case code
+ if (self.skew == 0 and
+ diffhelpers.testhunk(old, self.lines, oldstart) == 0):
+ if self.remove:
+ self.backend.unlink(self.fname)
+ else:
+ self.lines[oldstart:oldstart + len(old)] = new
+ self.offset += len(new) - len(old)
+ self.dirty = True
+ return 0
+
+ # ok, we couldn't match the hunk. Lets look for offsets and fuzz it
+ self.hash = {}
+ for x, s in enumerate(self.lines):
+ self.hash.setdefault(s, []).append(x)
+
+ for fuzzlen in xrange(3):
+ for toponly in [True, False]:
+ old, oldstart, new, newstart = h.fuzzit(fuzzlen, toponly)
+ oldstart = oldstart + self.offset + self.skew
+ oldstart = min(oldstart, len(self.lines))
+ if old:
+ cand = self.findlines(old[0][1:], oldstart)
+ else:
+ # Only adding lines with no or fuzzed context, just
+ # take the skew in account
+ cand = [oldstart]
+
+ for l in cand:
+ if not old or diffhelpers.testhunk(old, self.lines, l) == 0:
+ self.lines[l : l + len(old)] = new
+ self.offset += len(new) - len(old)
+ self.skew = l - orig_start
+ self.dirty = True
+ offset = l - orig_start - fuzzlen
+ if fuzzlen:
+ msg = _("Hunk #%d succeeded at %d "
+ "with fuzz %d "
+ "(offset %d lines).\n")
+ self.printfile(True)
+ self.ui.warn(msg %
+ (h.number, l + 1, fuzzlen, offset))
+ else:
+ msg = _("Hunk #%d succeeded at %d "
+ "(offset %d lines).\n")
+ self.ui.note(msg % (h.number, l + 1, offset))
+ return fuzzlen
+ self.printfile(True)
+ self.ui.warn(_("Hunk #%d FAILED at %d\n") % (h.number, orig_start))
+ self.rej.append(horig)
+ return -1
+
+ def close(self):
+ if self.dirty:
+ self.writelines(self.fname, self.lines, self.mode)
+ self.write_rej()
+ return len(self.rej)
+
+class hunk(object):
+ def __init__(self, desc, num, lr, context):
+ self.number = num
+ self.desc = desc
+ self.hunk = [desc]
+ self.a = []
+ self.b = []
+ self.starta = self.lena = None
+ self.startb = self.lenb = None
+ if lr is not None:
+ if context:
+ self.read_context_hunk(lr)
+ else:
+ self.read_unified_hunk(lr)
+
+ def getnormalized(self):
+ """Return a copy with line endings normalized to LF."""
+
+ def normalize(lines):
+ nlines = []
+ for line in lines:
+ if line.endswith('\r\n'):
+ line = line[:-2] + '\n'
+ nlines.append(line)
+ return nlines
+
+ # Dummy object, it is rebuilt manually
+ nh = hunk(self.desc, self.number, None, None)
+ nh.number = self.number
+ nh.desc = self.desc
+ nh.hunk = self.hunk
+ nh.a = normalize(self.a)
+ nh.b = normalize(self.b)
+ nh.starta = self.starta
+ nh.startb = self.startb
+ nh.lena = self.lena
+ nh.lenb = self.lenb
+ return nh
+
+ def read_unified_hunk(self, lr):
+ m = unidesc.match(self.desc)
+ if not m:
+ raise PatchError(_("bad hunk #%d") % self.number)
+ self.starta, self.lena, self.startb, self.lenb = m.groups()
+ if self.lena is None:
+ self.lena = 1
+ else:
+ self.lena = int(self.lena)
+ if self.lenb is None:
+ self.lenb = 1
+ else:
+ self.lenb = int(self.lenb)
+ self.starta = int(self.starta)
+ self.startb = int(self.startb)
+ diffhelpers.addlines(lr, self.hunk, self.lena, self.lenb, self.a,
+ self.b)
+ # if we hit eof before finishing out the hunk, the last line will
+ # be zero length. Lets try to fix it up.
+ while len(self.hunk[-1]) == 0:
+ del self.hunk[-1]
+ del self.a[-1]
+ del self.b[-1]
+ self.lena -= 1
+ self.lenb -= 1
+ self._fixnewline(lr)
+
+ def read_context_hunk(self, lr):
+ self.desc = lr.readline()
+ m = contextdesc.match(self.desc)
+ if not m:
+ raise PatchError(_("bad hunk #%d") % self.number)
+ self.starta, aend = m.groups()
+ self.starta = int(self.starta)
+ if aend is None:
+ aend = self.starta
+ self.lena = int(aend) - self.starta
+ if self.starta:
+ self.lena += 1
+ for x in xrange(self.lena):
+ l = lr.readline()
+ if l.startswith('---'):
+ # lines addition, old block is empty
+ lr.push(l)
+ break
+ s = l[2:]
+ if l.startswith('- ') or l.startswith('! '):
+ u = '-' + s
+ elif l.startswith(' '):
+ u = ' ' + s
+ else:
+ raise PatchError(_("bad hunk #%d old text line %d") %
+ (self.number, x))
+ self.a.append(u)
+ self.hunk.append(u)
+
+ l = lr.readline()
+ if l.startswith('\ '):
+ s = self.a[-1][:-1]
+ self.a[-1] = s
+ self.hunk[-1] = s
+ l = lr.readline()
+ m = contextdesc.match(l)
+ if not m:
+ raise PatchError(_("bad hunk #%d") % self.number)
+ self.startb, bend = m.groups()
+ self.startb = int(self.startb)
+ if bend is None:
+ bend = self.startb
+ self.lenb = int(bend) - self.startb
+ if self.startb:
+ self.lenb += 1
+ hunki = 1
+ for x in xrange(self.lenb):
+ l = lr.readline()
+ if l.startswith('\ '):
+ # XXX: the only way to hit this is with an invalid line range.
+ # The no-eol marker is not counted in the line range, but I
+ # guess there are diff(1) out there which behave differently.
+ s = self.b[-1][:-1]
+ self.b[-1] = s
+ self.hunk[hunki - 1] = s
+ continue
+ if not l:
+ # line deletions, new block is empty and we hit EOF
+ lr.push(l)
+ break
+ s = l[2:]
+ if l.startswith('+ ') or l.startswith('! '):
+ u = '+' + s
+ elif l.startswith(' '):
+ u = ' ' + s
+ elif len(self.b) == 0:
+ # line deletions, new block is empty
+ lr.push(l)
+ break
+ else:
+ raise PatchError(_("bad hunk #%d old text line %d") %
+ (self.number, x))
+ self.b.append(s)
+ while True:
+ if hunki >= len(self.hunk):
+ h = ""
+ else:
+ h = self.hunk[hunki]
+ hunki += 1
+ if h == u:
+ break
+ elif h.startswith('-'):
+ continue
+ else:
+ self.hunk.insert(hunki - 1, u)
+ break
+
+ if not self.a:
+ # this happens when lines were only added to the hunk
+ for x in self.hunk:
+ if x.startswith('-') or x.startswith(' '):
+ self.a.append(x)
+ if not self.b:
+ # this happens when lines were only deleted from the hunk
+ for x in self.hunk:
+ if x.startswith('+') or x.startswith(' '):
+ self.b.append(x[1:])
+ # @@ -start,len +start,len @@
+ self.desc = "@@ -%d,%d +%d,%d @@\n" % (self.starta, self.lena,
+ self.startb, self.lenb)
+ self.hunk[0] = self.desc
+ self._fixnewline(lr)
+
+ def _fixnewline(self, lr):
+ l = lr.readline()
+ if l.startswith('\ '):
+ diffhelpers.fix_newline(self.hunk, self.a, self.b)
+ else:
+ lr.push(l)
+
+ def complete(self):
+ return len(self.a) == self.lena and len(self.b) == self.lenb
+
+ def _fuzzit(self, old, new, fuzz, toponly):
+ # this removes context lines from the top and bottom of list 'l'. It
+ # checks the hunk to make sure only context lines are removed, and then
+ # returns a new shortened list of lines.
+ fuzz = min(fuzz, len(old))
+ if fuzz:
+ top = 0
+ bot = 0
+ hlen = len(self.hunk)
+ for x in xrange(hlen - 1):
+ # the hunk starts with the @@ line, so use x+1
+ if self.hunk[x + 1][0] == ' ':
+ top += 1
+ else:
+ break
+ if not toponly:
+ for x in xrange(hlen - 1):
+ if self.hunk[hlen - bot - 1][0] == ' ':
+ bot += 1
+ else:
+ break
+
+ bot = min(fuzz, bot)
+ top = min(fuzz, top)
+ return old[top:len(old)-bot], new[top:len(new)-bot], top
+ return old, new, 0
+
+ def fuzzit(self, fuzz, toponly):
+ old, new, top = self._fuzzit(self.a, self.b, fuzz, toponly)
+ oldstart = self.starta + top
+ newstart = self.startb + top
+ # zero length hunk ranges already have their start decremented
+ if self.lena and oldstart > 0:
+ oldstart -= 1
+ if self.lenb and newstart > 0:
+ newstart -= 1
+ return old, oldstart, new, newstart
+
+class binhunk(object):
+ 'A binary patch file. Only understands literals so far.'
+ def __init__(self, lr, fname):
+ self.text = None
+ self.hunk = ['GIT binary patch\n']
+ self._fname = fname
+ self._read(lr)
+
+ def complete(self):
+ return self.text is not None
+
+ def new(self):
+ return [self.text]
+
+ def _read(self, lr):
+ def getline(lr, hunk):
+ l = lr.readline()
+ hunk.append(l)
+ return l.rstrip('\r\n')
+
+ while True:
+ line = getline(lr, self.hunk)
+ if not line:
+ raise PatchError(_('could not extract "%s" binary data')
+ % self._fname)
+ if line.startswith('literal '):
+ break
+ size = int(line[8:].rstrip())
+ dec = []
+ line = getline(lr, self.hunk)
+ while len(line) > 1:
+ l = line[0]
+ if l <= 'Z' and l >= 'A':
+ l = ord(l) - ord('A') + 1
+ else:
+ l = ord(l) - ord('a') + 27
+ try:
+ dec.append(base85.b85decode(line[1:])[:l])
+ except ValueError, e:
+ raise PatchError(_('could not decode "%s" binary patch: %s')
+ % (self._fname, str(e)))
+ line = getline(lr, self.hunk)
+ text = zlib.decompress(''.join(dec))
+ if len(text) != size:
+ raise PatchError(_('"%s" length is %d bytes, should be %d')
+ % (self._fname, len(text), size))
+ self.text = text
+
+def parsefilename(str):
+ # --- filename \t|space stuff
+ s = str[4:].rstrip('\r\n')
+ i = s.find('\t')
+ if i < 0:
+ i = s.find(' ')
+ if i < 0:
+ return s
+ return s[:i]
+
+def pathstrip(path, strip):
+ pathlen = len(path)
+ i = 0
+ if strip == 0:
+ return '', path.rstrip()
+ count = strip
+ while count > 0:
+ i = path.find('/', i)
+ if i == -1:
+ raise PatchError(_("unable to strip away %d of %d dirs from %s") %
+ (count, strip, path))
+ i += 1
+ # consume '//' in the path
+ while i < pathlen - 1 and path[i] == '/':
+ i += 1
+ count -= 1
+ return path[:i].lstrip(), path[i:].rstrip()
+
+def makepatchmeta(backend, afile_orig, bfile_orig, hunk, strip):
+ nulla = afile_orig == "/dev/null"
+ nullb = bfile_orig == "/dev/null"
+ create = nulla and hunk.starta == 0 and hunk.lena == 0
+ remove = nullb and hunk.startb == 0 and hunk.lenb == 0
+ abase, afile = pathstrip(afile_orig, strip)
+ gooda = not nulla and backend.exists(afile)
+ bbase, bfile = pathstrip(bfile_orig, strip)
+ if afile == bfile:
+ goodb = gooda
+ else:
+ goodb = not nullb and backend.exists(bfile)
+ missing = not goodb and not gooda and not create
+
+ # some diff programs apparently produce patches where the afile is
+ # not /dev/null, but afile starts with bfile
+ abasedir = afile[:afile.rfind('/') + 1]
+ bbasedir = bfile[:bfile.rfind('/') + 1]
+ if (missing and abasedir == bbasedir and afile.startswith(bfile)
+ and hunk.starta == 0 and hunk.lena == 0):
+ create = True
+ missing = False
+
+ # If afile is "a/b/foo" and bfile is "a/b/foo.orig" we assume the
+ # diff is between a file and its backup. In this case, the original
+ # file should be patched (see original mpatch code).
+ isbackup = (abase == bbase and bfile.startswith(afile))
+ fname = None
+ if not missing:
+ if gooda and goodb:
+ fname = isbackup and afile or bfile
+ elif gooda:
+ fname = afile
+
+ if not fname:
+ if not nullb:
+ fname = isbackup and afile or bfile
+ elif not nulla:
+ fname = afile
+ else:
+ raise PatchError(_("undefined source and destination files"))
+
+ gp = patchmeta(fname)
+ if create:
+ gp.op = 'ADD'
+ elif remove:
+ gp.op = 'DELETE'
+ return gp
+
+def scangitpatch(lr, firstline):
+ """
+ Git patches can emit:
+ - rename a to b
+ - change b
+ - copy a to c
+ - change c
+
+ We cannot apply this sequence as-is, the renamed 'a' could not be
+ found for it would have been renamed already. And we cannot copy
+ from 'b' instead because 'b' would have been changed already. So
+ we scan the git patch for copy and rename commands so we can
+ perform the copies ahead of time.
+ """
+ pos = 0
+ try:
+ pos = lr.fp.tell()
+ fp = lr.fp
+ except IOError:
+ fp = cStringIO.StringIO(lr.fp.read())
+ gitlr = linereader(fp)
+ gitlr.push(firstline)
+ gitpatches = readgitpatch(gitlr)
+ fp.seek(pos)
+ return gitpatches
+
+def iterhunks(fp):
+ """Read a patch and yield the following events:
+ - ("file", afile, bfile, firsthunk): select a new target file.
+ - ("hunk", hunk): a new hunk is ready to be applied, follows a
+ "file" event.
+ - ("git", gitchanges): current diff is in git format, gitchanges
+ maps filenames to gitpatch records. Unique event.
+ """
+ afile = ""
+ bfile = ""
+ state = None
+ hunknum = 0
+ emitfile = newfile = False
+ gitpatches = None
+
+ # our states
+ BFILE = 1
+ context = None
+ lr = linereader(fp)
+
+ while True:
+ x = lr.readline()
+ if not x:
+ break
+ if state == BFILE and (
+ (not context and x[0] == '@')
+ or (context is not False and x.startswith('***************'))
+ or x.startswith('GIT binary patch')):
+ gp = None
+ if (gitpatches and
+ gitpatches[-1].ispatching(afile, bfile)):
+ gp = gitpatches.pop()
+ if x.startswith('GIT binary patch'):
+ h = binhunk(lr, gp.path)
+ else:
+ if context is None and x.startswith('***************'):
+ context = True
+ h = hunk(x, hunknum + 1, lr, context)
+ hunknum += 1
+ if emitfile:
+ emitfile = False
+ yield 'file', (afile, bfile, h, gp and gp.copy() or None)
+ yield 'hunk', h
+ elif x.startswith('diff --git'):
+ m = gitre.match(x.rstrip(' \r\n'))
+ if not m:
+ continue
+ if gitpatches is None:
+ # scan whole input for git metadata
+ gitpatches = scangitpatch(lr, x)
+ yield 'git', [g.copy() for g in gitpatches
+ if g.op in ('COPY', 'RENAME')]
+ gitpatches.reverse()
+ afile = 'a/' + m.group(1)
+ bfile = 'b/' + m.group(2)
+ while gitpatches and not gitpatches[-1].ispatching(afile, bfile):
+ gp = gitpatches.pop()
+ yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp.copy())
+ if not gitpatches:
+ raise PatchError(_('failed to synchronize metadata for "%s"')
+ % afile[2:])
+ gp = gitpatches[-1]
+ newfile = True
+ elif x.startswith('---'):
+ # check for a unified diff
+ l2 = lr.readline()
+ if not l2.startswith('+++'):
+ lr.push(l2)
+ continue
+ newfile = True
+ context = False
+ afile = parsefilename(x)
+ bfile = parsefilename(l2)
+ elif x.startswith('***'):
+ # check for a context diff
+ l2 = lr.readline()
+ if not l2.startswith('---'):
+ lr.push(l2)
+ continue
+ l3 = lr.readline()
+ lr.push(l3)
+ if not l3.startswith("***************"):
+ lr.push(l2)
+ continue
+ newfile = True
+ context = True
+ afile = parsefilename(x)
+ bfile = parsefilename(l2)
+
+ if newfile:
+ newfile = False
+ emitfile = True
+ state = BFILE
+ hunknum = 0
+
+ while gitpatches:
+ gp = gitpatches.pop()
+ yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp.copy())
+
+def applydiff(ui, fp, backend, store, strip=1, eolmode='strict'):
+ """Reads a patch from fp and tries to apply it.
+
+ Returns 0 for a clean patch, -1 if any rejects were found and 1 if
+ there was any fuzz.
+
+ If 'eolmode' is 'strict', the patch content and patched file are
+ read in binary mode. Otherwise, line endings are ignored when
+ patching then normalized according to 'eolmode'.
+ """
+ return _applydiff(ui, fp, patchfile, backend, store, strip=strip,
+ eolmode=eolmode)
+
+def _applydiff(ui, fp, patcher, backend, store, strip=1,
+ eolmode='strict'):
+
+ def pstrip(p):
+ return pathstrip(p, strip - 1)[1]
+
+ rejects = 0
+ err = 0
+ current_file = None
+
+ for state, values in iterhunks(fp):
+ if state == 'hunk':
+ if not current_file:
+ continue
+ ret = current_file.apply(values)
+ if ret > 0:
+ err = 1
+ elif state == 'file':
+ if current_file:
+ rejects += current_file.close()
+ current_file = None
+ afile, bfile, first_hunk, gp = values
+ if gp:
+ gp.path = pstrip(gp.path)
+ if gp.oldpath:
+ gp.oldpath = pstrip(gp.oldpath)
+ else:
+ gp = makepatchmeta(backend, afile, bfile, first_hunk, strip)
+ if gp.op == 'RENAME':
+ backend.unlink(gp.oldpath)
+ if not first_hunk:
+ if gp.op == 'DELETE':
+ backend.unlink(gp.path)
+ continue
+ data, mode = None, None
+ if gp.op in ('RENAME', 'COPY'):
+ data, mode = store.getfile(gp.oldpath)[:2]
+ if gp.mode:
+ mode = gp.mode
+ if gp.op == 'ADD':
+ # Added files without content have no hunk and
+ # must be created
+ data = ''
+ if data or mode:
+ if (gp.op in ('ADD', 'RENAME', 'COPY')
+ and backend.exists(gp.path)):
+ raise PatchError(_("cannot create %s: destination "
+ "already exists") % gp.path)
+ backend.setfile(gp.path, data, mode, gp.oldpath)
+ continue
+ try:
+ current_file = patcher(ui, gp, backend, store,
+ eolmode=eolmode)
+ except PatchError, inst:
+ ui.warn(str(inst) + '\n')
+ current_file = None
+ rejects += 1
+ continue
+ elif state == 'git':
+ for gp in values:
+ path = pstrip(gp.oldpath)
+ try:
+ data, mode = backend.getfile(path)
+ except IOError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ # The error ignored here will trigger a getfile()
+ # error in a place more appropriate for error
+ # handling, and will not interrupt the patching
+ # process.
+ else:
+ store.setfile(path, data, mode)
+ else:
+ raise util.Abort(_('unsupported parser state: %s') % state)
+
+ if current_file:
+ rejects += current_file.close()
+
+ if rejects:
+ return -1
+ return err
+
+def _externalpatch(ui, repo, patcher, patchname, strip, files,
+ similarity):
+ """use <patcher> to apply <patchname> to the working directory.
+ returns whether patch was applied with fuzz factor."""
+
+ fuzz = False
+ args = []
+ cwd = repo.root
+ if cwd:
+ args.append('-d %s' % util.shellquote(cwd))
+ fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip,
+ util.shellquote(patchname)))
+ try:
+ for line in fp:
+ line = line.rstrip()
+ ui.note(line + '\n')
+ if line.startswith('patching file '):
+ pf = util.parsepatchoutput(line)
+ printed_file = False
+ files.add(pf)
+ elif line.find('with fuzz') >= 0:
+ fuzz = True
+ if not printed_file:
+ ui.warn(pf + '\n')
+ printed_file = True
+ ui.warn(line + '\n')
+ elif line.find('saving rejects to file') >= 0:
+ ui.warn(line + '\n')
+ elif line.find('FAILED') >= 0:
+ if not printed_file:
+ ui.warn(pf + '\n')
+ printed_file = True
+ ui.warn(line + '\n')
+ finally:
+ if files:
+ cfiles = list(files)
+ cwd = repo.getcwd()
+ if cwd:
+ cfiles = [util.pathto(repo.root, cwd, f)
+ for f in cfiles]
+ scmutil.addremove(repo, cfiles, similarity=similarity)
+ code = fp.close()
+ if code:
+ raise PatchError(_("patch command failed: %s") %
+ util.explainexit(code)[0])
+ return fuzz
+
+def patchbackend(ui, backend, patchobj, strip, files=None, eolmode='strict'):
+ if files is None:
+ files = set()
+ if eolmode is None:
+ eolmode = ui.config('patch', 'eol', 'strict')
+ if eolmode.lower() not in eolmodes:
+ raise util.Abort(_('unsupported line endings type: %s') % eolmode)
+ eolmode = eolmode.lower()
+
+ store = filestore()
+ try:
+ fp = open(patchobj, 'rb')
+ except TypeError:
+ fp = patchobj
+ try:
+ ret = applydiff(ui, fp, backend, store, strip=strip,
+ eolmode=eolmode)
+ finally:
+ if fp != patchobj:
+ fp.close()
+ files.update(backend.close())
+ store.close()
+ if ret < 0:
+ raise PatchError(_('patch failed to apply'))
+ return ret > 0
+
+def internalpatch(ui, repo, patchobj, strip, files=None, eolmode='strict',
+ similarity=0):
+ """use builtin patch to apply <patchobj> to the working directory.
+ returns whether patch was applied with fuzz factor."""
+ backend = workingbackend(ui, repo, similarity)
+ return patchbackend(ui, backend, patchobj, strip, files, eolmode)
+
+def patchrepo(ui, repo, ctx, store, patchobj, strip, files=None,
+ eolmode='strict'):
+ backend = repobackend(ui, repo, ctx, store)
+ return patchbackend(ui, backend, patchobj, strip, files, eolmode)
+
+def makememctx(repo, parents, text, user, date, branch, files, store,
+ editor=None):
+ def getfilectx(repo, memctx, path):
+ data, (islink, isexec), copied = store.getfile(path)
+ return context.memfilectx(path, data, islink=islink, isexec=isexec,
+ copied=copied)
+ extra = {}
+ if branch:
+ extra['branch'] = encoding.fromlocal(branch)
+ ctx = context.memctx(repo, parents, text, files, getfilectx, user,
+ date, extra)
+ if editor:
+ ctx._text = editor(repo, ctx, [])
+ return ctx
+
+def patch(ui, repo, patchname, strip=1, files=None, eolmode='strict',
+ similarity=0):
+ """Apply <patchname> to the working directory.
+
+ 'eolmode' specifies how end of lines should be handled. It can be:
+ - 'strict': inputs are read in binary mode, EOLs are preserved
+ - 'crlf': EOLs are ignored when patching and reset to CRLF
+ - 'lf': EOLs are ignored when patching and reset to LF
+ - None: get it from user settings, default to 'strict'
+ 'eolmode' is ignored when using an external patcher program.
+
+ Returns whether patch was applied with fuzz factor.
+ """
+ patcher = ui.config('ui', 'patch')
+ if files is None:
+ files = set()
+ try:
+ if patcher:
+ return _externalpatch(ui, repo, patcher, patchname, strip,
+ files, similarity)
+ return internalpatch(ui, repo, patchname, strip, files, eolmode,
+ similarity)
+ except PatchError, err:
+ raise util.Abort(str(err))
+
+def changedfiles(ui, repo, patchpath, strip=1):
+ backend = fsbackend(ui, repo.root)
+ fp = open(patchpath, 'rb')
+ try:
+ changed = set()
+ for state, values in iterhunks(fp):
+ if state == 'file':
+ afile, bfile, first_hunk, gp = values
+ if gp:
+ gp.path = pathstrip(gp.path, strip - 1)[1]
+ if gp.oldpath:
+ gp.oldpath = pathstrip(gp.oldpath, strip - 1)[1]
+ else:
+ gp = makepatchmeta(backend, afile, bfile, first_hunk, strip)
+ changed.add(gp.path)
+ if gp.op == 'RENAME':
+ changed.add(gp.oldpath)
+ elif state not in ('hunk', 'git'):
+ raise util.Abort(_('unsupported parser state: %s') % state)
+ return changed
+ finally:
+ fp.close()
+
+def b85diff(to, tn):
+ '''print base85-encoded binary diff'''
+ def gitindex(text):
+ if not text:
+ return hex(nullid)
+ l = len(text)
+ s = util.sha1('blob %d\0' % l)
+ s.update(text)
+ return s.hexdigest()
+
+ def fmtline(line):
+ l = len(line)
+ if l <= 26:
+ l = chr(ord('A') + l - 1)
+ else:
+ l = chr(l - 26 + ord('a') - 1)
+ return '%c%s\n' % (l, base85.b85encode(line, True))
+
+ def chunk(text, csize=52):
+ l = len(text)
+ i = 0
+ while i < l:
+ yield text[i:i + csize]
+ i += csize
+
+ tohash = gitindex(to)
+ tnhash = gitindex(tn)
+ if tohash == tnhash:
+ return ""
+
+ # TODO: deltas
+ ret = ['index %s..%s\nGIT binary patch\nliteral %s\n' %
+ (tohash, tnhash, len(tn))]
+ for l in chunk(zlib.compress(tn)):
+ ret.append(fmtline(l))
+ ret.append('\n')
+ return ''.join(ret)
+
+class GitDiffRequired(Exception):
+ pass
+
+def diffopts(ui, opts=None, untrusted=False, section='diff'):
+ def get(key, name=None, getter=ui.configbool):
+ return ((opts and opts.get(key)) or
+ getter(section, name or key, None, untrusted=untrusted))
+ return mdiff.diffopts(
+ text=opts and opts.get('text'),
+ git=get('git'),
+ nodates=get('nodates'),
+ showfunc=get('show_function', 'showfunc'),
+ ignorews=get('ignore_all_space', 'ignorews'),
+ ignorewsamount=get('ignore_space_change', 'ignorewsamount'),
+ ignoreblanklines=get('ignore_blank_lines', 'ignoreblanklines'),
+ context=get('unified', getter=ui.config))
+
+def diff(repo, node1=None, node2=None, match=None, changes=None, opts=None,
+ losedatafn=None, prefix=''):
+ '''yields diff of changes to files between two nodes, or node and
+ working directory.
+
+ if node1 is None, use first dirstate parent instead.
+ if node2 is None, compare node1 with working directory.
+
+ losedatafn(**kwarg) is a callable run when opts.upgrade=True and
+ every time some change cannot be represented with the current
+ patch format. Return False to upgrade to git patch format, True to
+ accept the loss or raise an exception to abort the diff. It is
+ called with the name of current file being diffed as 'fn'. If set
+ to None, patches will always be upgraded to git format when
+ necessary.
+
+ prefix is a filename prefix that is prepended to all filenames on
+ display (used for subrepos).
+ '''
+
+ if opts is None:
+ opts = mdiff.defaultopts
+
+ if not node1 and not node2:
+ node1 = repo.dirstate.p1()
+
+ def lrugetfilectx():
+ cache = {}
+ order = util.deque()
+ def getfilectx(f, ctx):
+ fctx = ctx.filectx(f, filelog=cache.get(f))
+ if f not in cache:
+ if len(cache) > 20:
+ del cache[order.popleft()]
+ cache[f] = fctx.filelog()
+ else:
+ order.remove(f)
+ order.append(f)
+ return fctx
+ return getfilectx
+ getfilectx = lrugetfilectx()
+
+ ctx1 = repo[node1]
+ ctx2 = repo[node2]
+
+ if not changes:
+ changes = repo.status(ctx1, ctx2, match=match)
+ modified, added, removed = changes[:3]
+
+ if not modified and not added and not removed:
+ return []
+
+ revs = None
+ if not repo.ui.quiet:
+ hexfunc = repo.ui.debugflag and hex or short
+ revs = [hexfunc(node) for node in [node1, node2] if node]
+
+ copy = {}
+ if opts.git or opts.upgrade:
+ copy = copies.pathcopies(ctx1, ctx2)
+
+ def difffn(opts, losedata):
+ return trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
+ copy, getfilectx, opts, losedata, prefix)
+ if opts.upgrade and not opts.git:
+ try:
+ def losedata(fn):
+ if not losedatafn or not losedatafn(fn=fn):
+ raise GitDiffRequired
+ # Buffer the whole output until we are sure it can be generated
+ return list(difffn(opts.copy(git=False), losedata))
+ except GitDiffRequired:
+ return difffn(opts.copy(git=True), None)
+ else:
+ return difffn(opts, None)
+
+def difflabel(func, *args, **kw):
+ '''yields 2-tuples of (output, label) based on the output of func()'''
+ headprefixes = [('diff', 'diff.diffline'),
+ ('copy', 'diff.extended'),
+ ('rename', 'diff.extended'),
+ ('old', 'diff.extended'),
+ ('new', 'diff.extended'),
+ ('deleted', 'diff.extended'),
+ ('---', 'diff.file_a'),
+ ('+++', 'diff.file_b')]
+ textprefixes = [('@', 'diff.hunk'),
+ ('-', 'diff.deleted'),
+ ('+', 'diff.inserted')]
+ head = False
+ for chunk in func(*args, **kw):
+ lines = chunk.split('\n')
+ for i, line in enumerate(lines):
+ if i != 0:
+ yield ('\n', '')
+ if head:
+ if line.startswith('@'):
+ head = False
+ else:
+ if line and line[0] not in ' +-@\\':
+ head = True
+ stripline = line
+ if not head and line and line[0] in '+-':
+ # highlight trailing whitespace, but only in changed lines
+ stripline = line.rstrip()
+ prefixes = textprefixes
+ if head:
+ prefixes = headprefixes
+ for prefix, label in prefixes:
+ if stripline.startswith(prefix):
+ yield (stripline, label)
+ break
+ else:
+ yield (line, '')
+ if line != stripline:
+ yield (line[len(stripline):], 'diff.trailingwhitespace')
+
+def diffui(*args, **kw):
+ '''like diff(), but yields 2-tuples of (output, label) for ui.write()'''
+ return difflabel(diff, *args, **kw)
+
+
+def _addmodehdr(header, omode, nmode):
+ if omode != nmode:
+ header.append('old mode %s\n' % omode)
+ header.append('new mode %s\n' % nmode)
+
+def trydiff(repo, revs, ctx1, ctx2, modified, added, removed,
+ copy, getfilectx, opts, losedatafn, prefix):
+
+ def join(f):
+ return os.path.join(prefix, f)
+
+ date1 = util.datestr(ctx1.date())
+ man1 = ctx1.manifest()
+
+ gone = set()
+ gitmode = {'l': '120000', 'x': '100755', '': '100644'}
+
+ copyto = dict([(v, k) for k, v in copy.items()])
+
+ if opts.git:
+ revs = None
+
+ for f in sorted(modified + added + removed):
+ to = None
+ tn = None
+ dodiff = True
+ header = []
+ if f in man1:
+ to = getfilectx(f, ctx1).data()
+ if f not in removed:
+ tn = getfilectx(f, ctx2).data()
+ a, b = f, f
+ if opts.git or losedatafn:
+ if f in added:
+ mode = gitmode[ctx2.flags(f)]
+ if f in copy or f in copyto:
+ if opts.git:
+ if f in copy:
+ a = copy[f]
+ else:
+ a = copyto[f]
+ omode = gitmode[man1.flags(a)]
+ _addmodehdr(header, omode, mode)
+ if a in removed and a not in gone:
+ op = 'rename'
+ gone.add(a)
+ else:
+ op = 'copy'
+ header.append('%s from %s\n' % (op, join(a)))
+ header.append('%s to %s\n' % (op, join(f)))
+ to = getfilectx(a, ctx1).data()
+ else:
+ losedatafn(f)
+ else:
+ if opts.git:
+ header.append('new file mode %s\n' % mode)
+ elif ctx2.flags(f):
+ losedatafn(f)
+ # In theory, if tn was copied or renamed we should check
+ # if the source is binary too but the copy record already
+ # forces git mode.
+ if util.binary(tn):
+ if opts.git:
+ dodiff = 'binary'
+ else:
+ losedatafn(f)
+ if not opts.git and not tn:
+ # regular diffs cannot represent new empty file
+ losedatafn(f)
+ elif f in removed:
+ if opts.git:
+ # have we already reported a copy above?
+ if ((f in copy and copy[f] in added
+ and copyto[copy[f]] == f) or
+ (f in copyto and copyto[f] in added
+ and copy[copyto[f]] == f)):
+ dodiff = False
+ else:
+ header.append('deleted file mode %s\n' %
+ gitmode[man1.flags(f)])
+ elif not to or util.binary(to):
+ # regular diffs cannot represent empty file deletion
+ losedatafn(f)
+ else:
+ oflag = man1.flags(f)
+ nflag = ctx2.flags(f)
+ binary = util.binary(to) or util.binary(tn)
+ if opts.git:
+ _addmodehdr(header, gitmode[oflag], gitmode[nflag])
+ if binary:
+ dodiff = 'binary'
+ elif binary or nflag != oflag:
+ losedatafn(f)
+ if opts.git:
+ header.insert(0, mdiff.diffline(revs, join(a), join(b), opts))
+
+ if dodiff:
+ if dodiff == 'binary':
+ text = b85diff(to, tn)
+ else:
+ text = mdiff.unidiff(to, date1,
+ # ctx2 date may be dynamic
+ tn, util.datestr(ctx2.date()),
+ join(a), join(b), revs, opts=opts)
+ if header and (text or len(header) > 1):
+ yield ''.join(header)
+ if text:
+ yield text
+
+def diffstatsum(stats):
+ maxfile, maxtotal, addtotal, removetotal, binary = 0, 0, 0, 0, False
+ for f, a, r, b in stats:
+ maxfile = max(maxfile, encoding.colwidth(f))
+ maxtotal = max(maxtotal, a + r)
+ addtotal += a
+ removetotal += r
+ binary = binary or b
+
+ return maxfile, maxtotal, addtotal, removetotal, binary
+
+def diffstatdata(lines):
+ diffre = re.compile('^diff .*-r [a-z0-9]+\s(.*)$')
+
+ results = []
+ filename, adds, removes, isbinary = None, 0, 0, False
+
+ def addresult():
+ if filename:
+ results.append((filename, adds, removes, isbinary))
+
+ for line in lines:
+ if line.startswith('diff'):
+ addresult()
+ # set numbers to 0 anyway when starting new file
+ adds, removes, isbinary = 0, 0, False
+ if line.startswith('diff --git'):
+ filename = gitre.search(line).group(1)
+ elif line.startswith('diff -r'):
+ # format: "diff -r ... -r ... filename"
+ filename = diffre.search(line).group(1)
+ elif line.startswith('+') and not line.startswith('+++ '):
+ adds += 1
+ elif line.startswith('-') and not line.startswith('--- '):
+ removes += 1
+ elif (line.startswith('GIT binary patch') or
+ line.startswith('Binary file')):
+ isbinary = True
+ addresult()
+ return results
+
+def diffstat(lines, width=80, git=False):
+ output = []
+ stats = diffstatdata(lines)
+ maxname, maxtotal, totaladds, totalremoves, hasbinary = diffstatsum(stats)
+
+ countwidth = len(str(maxtotal))
+ if hasbinary and countwidth < 3:
+ countwidth = 3
+ graphwidth = width - countwidth - maxname - 6
+ if graphwidth < 10:
+ graphwidth = 10
+
+ def scale(i):
+ if maxtotal <= graphwidth:
+ return i
+ # If diffstat runs out of room it doesn't print anything,
+ # which isn't very useful, so always print at least one + or -
+ # if there were at least some changes.
+ return max(i * graphwidth // maxtotal, int(bool(i)))
+
+ for filename, adds, removes, isbinary in stats:
+ if isbinary:
+ count = 'Bin'
+ else:
+ count = adds + removes
+ pluses = '+' * scale(adds)
+ minuses = '-' * scale(removes)
+ output.append(' %s%s | %*s %s%s\n' %
+ (filename, ' ' * (maxname - encoding.colwidth(filename)),
+ countwidth, count, pluses, minuses))
+
+ if stats:
+ output.append(_(' %d files changed, %d insertions(+), '
+ '%d deletions(-)\n')
+ % (len(stats), totaladds, totalremoves))
+
+ return ''.join(output)
+
+def diffstatui(*args, **kw):
+ '''like diffstat(), but yields 2-tuples of (output, label) for
+ ui.write()
+ '''
+
+ for line in diffstat(*args, **kw).splitlines():
+ if line and line[-1] in '+-':
+ name, graph = line.rsplit(' ', 1)
+ yield (name + ' ', '')
+ m = re.search(r'\++', graph)
+ if m:
+ yield (m.group(0), 'diffstat.inserted')
+ m = re.search(r'-+', graph)
+ if m:
+ yield (m.group(0), 'diffstat.deleted')
+ else:
+ yield (line, '')
+ yield ('\n', '')
diff --git a/mercurial/peer.py b/mercurial/peer.py
new file mode 100644
index 0000000..40841ca
--- /dev/null
+++ b/mercurial/peer.py
@@ -0,0 +1,46 @@
+# peer.py - repository base classes for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import error
+
+class peerrepository(object):
+
+ def capable(self, name):
+ '''tell whether repo supports named capability.
+ return False if not supported.
+ if boolean capability, return True.
+ if string capability, return string.'''
+ caps = self._capabilities()
+ if name in caps:
+ return True
+ name_eq = name + '='
+ for cap in caps:
+ if cap.startswith(name_eq):
+ return cap[len(name_eq):]
+ return False
+
+ def requirecap(self, name, purpose):
+ '''raise an exception if the given capability is not present'''
+ if not self.capable(name):
+ raise error.CapabilityError(
+ _('cannot %s; remote repository does not '
+ 'support the %r capability') % (purpose, name))
+
+ def local(self):
+ '''return peer as a localrepo, or None'''
+ return None
+
+ def peer(self):
+ return self
+
+ def canpush(self):
+ return True
+
+ def close(self):
+ pass
diff --git a/mercurial/phases.py b/mercurial/phases.py
new file mode 100644
index 0000000..614bcbb
--- /dev/null
+++ b/mercurial/phases.py
@@ -0,0 +1,387 @@
+""" Mercurial phases support code
+
+ ---
+
+ Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+ Logilab SA <contact@logilab.fr>
+ Augie Fackler <durin42@gmail.com>
+
+ This software may be used and distributed according to the terms
+ of the GNU General Public License version 2 or any later version.
+
+ ---
+
+This module implements most phase logic in mercurial.
+
+
+Basic Concept
+=============
+
+A 'changeset phase' is an indicator that tells us how a changeset is
+manipulated and communicated. The details of each phase is described
+below, here we describe the properties they have in common.
+
+Like bookmarks, phases are not stored in history and thus are not
+permanent and leave no audit trail.
+
+First, no changeset can be in two phases at once. Phases are ordered,
+so they can be considered from lowest to highest. The default, lowest
+phase is 'public' - this is the normal phase of existing changesets. A
+child changeset can not be in a lower phase than its parents.
+
+These phases share a hierarchy of traits:
+
+ immutable shared
+ public: X X
+ draft: X
+ secret:
+
+Local commits are draft by default.
+
+Phase Movement and Exchange
+===========================
+
+Phase data is exchanged by pushkey on pull and push. Some servers have
+a publish option set, we call such a server a "publishing server".
+Pushing a draft changeset to a publishing server changes the phase to
+public.
+
+A small list of fact/rules define the exchange of phase:
+
+* old client never changes server states
+* pull never changes server states
+* publish and old server changesets are seen as public by client
+* any secret changeset seen in another repository is lowered to at
+ least draft
+
+Here is the final table summing up the 49 possible use cases of phase
+exchange:
+
+ server
+ old publish non-publish
+ N X N D P N D P
+ old client
+ pull
+ N - X/X - X/D X/P - X/D X/P
+ X - X/X - X/D X/P - X/D X/P
+ push
+ X X/X X/X X/P X/P X/P X/D X/D X/P
+ new client
+ pull
+ N - P/X - P/D P/P - D/D P/P
+ D - P/X - P/D P/P - D/D P/P
+ P - P/X - P/D P/P - P/D P/P
+ push
+ D P/X P/X P/P P/P P/P D/D D/D P/P
+ P P/X P/X P/P P/P P/P P/P P/P P/P
+
+Legend:
+
+ A/B = final state on client / state on server
+
+ * N = new/not present,
+ * P = public,
+ * D = draft,
+ * X = not tracked (i.e., the old client or server has no internal
+ way of recording the phase.)
+
+ passive = only pushes
+
+
+ A cell here can be read like this:
+
+ "When a new client pushes a draft changeset (D) to a publishing
+ server where it's not present (N), it's marked public on both
+ sides (P/P)."
+
+Note: old client behave as a publishing server with draft only content
+- other people see it as public
+- content is pushed as draft
+
+"""
+
+import errno
+from node import nullid, nullrev, bin, hex, short
+from i18n import _
+import util
+
+allphases = public, draft, secret = range(3)
+trackedphases = allphases[1:]
+phasenames = ['public', 'draft', 'secret']
+
+def _filterunknown(ui, changelog, phaseroots):
+ """remove unknown nodes from the phase boundary
+
+ Nothing is lost as unknown nodes only hold data for their descendants.
+ """
+ updated = False
+ nodemap = changelog.nodemap # to filter unknown nodes
+ for phase, nodes in enumerate(phaseroots):
+ missing = [node for node in nodes if node not in nodemap]
+ if missing:
+ for mnode in missing:
+ ui.debug(
+ 'removing unknown node %s from %i-phase boundary\n'
+ % (short(mnode), phase))
+ nodes.symmetric_difference_update(missing)
+ updated = True
+ return updated
+
+def _readroots(repo, phasedefaults=None):
+ """Read phase roots from disk
+
+ phasedefaults is a list of fn(repo, roots) callable, which are
+ executed if the phase roots file does not exist. When phases are
+ being initialized on an existing repository, this could be used to
+ set selected changesets phase to something else than public.
+
+ Return (roots, dirty) where dirty is true if roots differ from
+ what is being stored.
+ """
+ dirty = False
+ roots = [set() for i in allphases]
+ try:
+ f = repo.sopener('phaseroots')
+ try:
+ for line in f:
+ phase, nh = line.split()
+ roots[int(phase)].add(bin(nh))
+ finally:
+ f.close()
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ if phasedefaults:
+ for f in phasedefaults:
+ roots = f(repo, roots)
+ dirty = True
+ if _filterunknown(repo.ui, repo.changelog, roots):
+ dirty = True
+ return roots, dirty
+
+class phasecache(object):
+ def __init__(self, repo, phasedefaults, _load=True):
+ if _load:
+ # Cheap trick to allow shallow-copy without copy module
+ self.phaseroots, self.dirty = _readroots(repo, phasedefaults)
+ self.opener = repo.sopener
+ self._phaserevs = None
+
+ def copy(self):
+ # Shallow copy meant to ensure isolation in
+ # advance/retractboundary(), nothing more.
+ ph = phasecache(None, None, _load=False)
+ ph.phaseroots = self.phaseroots[:]
+ ph.dirty = self.dirty
+ ph.opener = self.opener
+ ph._phaserevs = self._phaserevs
+ return ph
+
+ def replace(self, phcache):
+ for a in 'phaseroots dirty opener _phaserevs'.split():
+ setattr(self, a, getattr(phcache, a))
+
+ def getphaserevs(self, repo, rebuild=False):
+ if rebuild or self._phaserevs is None:
+ revs = [public] * len(repo.changelog)
+ for phase in trackedphases:
+ roots = map(repo.changelog.rev, self.phaseroots[phase])
+ if roots:
+ for rev in roots:
+ revs[rev] = phase
+ for rev in repo.changelog.descendants(roots):
+ revs[rev] = phase
+ self._phaserevs = revs
+ return self._phaserevs
+
+ def phase(self, repo, rev):
+ # We need a repo argument here to be able to build _phaserev
+ # if necessary. The repository instance is not stored in
+ # phasecache to avoid reference cycles. The changelog instance
+ # is not stored because it is a filecache() property and can
+ # be replaced without us being notified.
+ if rev == nullrev:
+ return public
+ if self._phaserevs is None or rev >= len(self._phaserevs):
+ self._phaserevs = self.getphaserevs(repo, rebuild=True)
+ return self._phaserevs[rev]
+
+ def write(self):
+ if not self.dirty:
+ return
+ f = self.opener('phaseroots', 'w', atomictemp=True)
+ try:
+ for phase, roots in enumerate(self.phaseroots):
+ for h in roots:
+ f.write('%i %s\n' % (phase, hex(h)))
+ finally:
+ f.close()
+ self.dirty = False
+
+ def _updateroots(self, phase, newroots):
+ self.phaseroots[phase] = newroots
+ self._phaserevs = None
+ self.dirty = True
+
+ def advanceboundary(self, repo, targetphase, nodes):
+ # Be careful to preserve shallow-copied values: do not update
+ # phaseroots values, replace them.
+
+ delroots = [] # set of root deleted by this path
+ for phase in xrange(targetphase + 1, len(allphases)):
+ # filter nodes that are not in a compatible phase already
+ nodes = [n for n in nodes
+ if self.phase(repo, repo[n].rev()) >= phase]
+ if not nodes:
+ break # no roots to move anymore
+ olds = self.phaseroots[phase]
+ roots = set(ctx.node() for ctx in repo.set(
+ 'roots((%ln::) - (%ln::%ln))', olds, olds, nodes))
+ if olds != roots:
+ self._updateroots(phase, roots)
+ # some roots may need to be declared for lower phases
+ delroots.extend(olds - roots)
+ # declare deleted root in the target phase
+ if targetphase != 0:
+ self.retractboundary(repo, targetphase, delroots)
+
+ def retractboundary(self, repo, targetphase, nodes):
+ # Be careful to preserve shallow-copied values: do not update
+ # phaseroots values, replace them.
+
+ currentroots = self.phaseroots[targetphase]
+ newroots = [n for n in nodes
+ if self.phase(repo, repo[n].rev()) < targetphase]
+ if newroots:
+ if nullid in newroots:
+ raise util.Abort(_('cannot change null revision phase'))
+ currentroots = currentroots.copy()
+ currentroots.update(newroots)
+ ctxs = repo.set('roots(%ln::)', currentroots)
+ currentroots.intersection_update(ctx.node() for ctx in ctxs)
+ self._updateroots(targetphase, currentroots)
+
+def advanceboundary(repo, targetphase, nodes):
+ """Add nodes to a phase changing other nodes phases if necessary.
+
+ This function move boundary *forward* this means that all nodes
+ are set in the target phase or kept in a *lower* phase.
+
+ Simplify boundary to contains phase roots only."""
+ phcache = repo._phasecache.copy()
+ phcache.advanceboundary(repo, targetphase, nodes)
+ repo._phasecache.replace(phcache)
+
+def retractboundary(repo, targetphase, nodes):
+ """Set nodes back to a phase changing other nodes phases if
+ necessary.
+
+ This function move boundary *backward* this means that all nodes
+ are set in the target phase or kept in a *higher* phase.
+
+ Simplify boundary to contains phase roots only."""
+ phcache = repo._phasecache.copy()
+ phcache.retractboundary(repo, targetphase, nodes)
+ repo._phasecache.replace(phcache)
+
+def listphases(repo):
+ """List phases root for serialization over pushkey"""
+ keys = {}
+ value = '%i' % draft
+ for root in repo._phasecache.phaseroots[draft]:
+ keys[hex(root)] = value
+
+ if repo.ui.configbool('phases', 'publish', True):
+ # Add an extra data to let remote know we are a publishing
+ # repo. Publishing repo can't just pretend they are old repo.
+ # When pushing to a publishing repo, the client still need to
+ # push phase boundary
+ #
+ # Push do not only push changeset. It also push phase data.
+ # New phase data may apply to common changeset which won't be
+ # push (as they are common). Here is a very simple example:
+ #
+ # 1) repo A push changeset X as draft to repo B
+ # 2) repo B make changeset X public
+ # 3) repo B push to repo A. X is not pushed but the data that
+ # X as now public should
+ #
+ # The server can't handle it on it's own as it has no idea of
+ # client phase data.
+ keys['publishing'] = 'True'
+ return keys
+
+def pushphase(repo, nhex, oldphasestr, newphasestr):
+ """List phases root for serialisation over pushkey"""
+ lock = repo.lock()
+ try:
+ currentphase = repo[nhex].phase()
+ newphase = abs(int(newphasestr)) # let's avoid negative index surprise
+ oldphase = abs(int(oldphasestr)) # let's avoid negative index surprise
+ if currentphase == oldphase and newphase < oldphase:
+ advanceboundary(repo, newphase, [bin(nhex)])
+ return 1
+ elif currentphase == newphase:
+ # raced, but got correct result
+ return 1
+ else:
+ return 0
+ finally:
+ lock.release()
+
+def analyzeremotephases(repo, subset, roots):
+ """Compute phases heads and root in a subset of node from root dict
+
+ * subset is heads of the subset
+ * roots is {<nodeid> => phase} mapping. key and value are string.
+
+ Accept unknown element input
+ """
+ # build list from dictionary
+ draftroots = []
+ nodemap = repo.changelog.nodemap # to filter unknown nodes
+ for nhex, phase in roots.iteritems():
+ if nhex == 'publishing': # ignore data related to publish option
+ continue
+ node = bin(nhex)
+ phase = int(phase)
+ if phase == 0:
+ if node != nullid:
+ repo.ui.warn(_('ignoring inconsistent public root'
+ ' from remote: %s\n') % nhex)
+ elif phase == 1:
+ if node in nodemap:
+ draftroots.append(node)
+ else:
+ repo.ui.warn(_('ignoring unexpected root from remote: %i %s\n')
+ % (phase, nhex))
+ # compute heads
+ publicheads = newheads(repo, subset, draftroots)
+ return publicheads, draftroots
+
+def newheads(repo, heads, roots):
+ """compute new head of a subset minus another
+
+ * `heads`: define the first subset
+ * `rroots`: define the second we substract to the first"""
+ revset = repo.set('heads((%ln + parents(%ln)) - (%ln::%ln))',
+ heads, roots, roots, heads)
+ return [c.node() for c in revset]
+
+
+def newcommitphase(ui):
+ """helper to get the target phase of new commit
+
+ Handle all possible values for the phases.new-commit options.
+
+ """
+ v = ui.config('phases', 'new-commit', draft)
+ try:
+ return phasenames.index(v)
+ except ValueError:
+ try:
+ return int(v)
+ except ValueError:
+ msg = _("phases.new-commit: not a valid phase name ('%s')")
+ raise error.ConfigError(msg % v)
+
diff --git a/mercurial/posix.py b/mercurial/posix.py
new file mode 100644
index 0000000..a97c076
--- /dev/null
+++ b/mercurial/posix.py
@@ -0,0 +1,470 @@
+# posix.py - Posix utility function implementations for Mercurial
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import encoding
+import os, sys, errno, stat, getpass, pwd, grp, tempfile, unicodedata
+
+posixfile = open
+nulldev = '/dev/null'
+normpath = os.path.normpath
+samestat = os.path.samestat
+oslink = os.link
+unlink = os.unlink
+rename = os.rename
+expandglobs = False
+
+umask = os.umask(0)
+os.umask(umask)
+
+def openhardlinks():
+ '''return true if it is safe to hold open file handles to hardlinks'''
+ return True
+
+def nlinks(name):
+ '''return number of hardlinks for the given file'''
+ return os.lstat(name).st_nlink
+
+def parsepatchoutput(output_line):
+ """parses the output produced by patch and returns the filename"""
+ pf = output_line[14:]
+ if os.sys.platform == 'OpenVMS':
+ if pf[0] == '`':
+ pf = pf[1:-1] # Remove the quotes
+ else:
+ if pf.startswith("'") and pf.endswith("'") and " " in pf:
+ pf = pf[1:-1] # Remove the quotes
+ return pf
+
+def sshargs(sshcmd, host, user, port):
+ '''Build argument list for ssh'''
+ args = user and ("%s@%s" % (user, host)) or host
+ return port and ("%s -p %s" % (args, port)) or args
+
+def isexec(f):
+ """check whether a file is executable"""
+ return (os.lstat(f).st_mode & 0100 != 0)
+
+def setflags(f, l, x):
+ s = os.lstat(f).st_mode
+ if l:
+ if not stat.S_ISLNK(s):
+ # switch file to link
+ fp = open(f)
+ data = fp.read()
+ fp.close()
+ os.unlink(f)
+ try:
+ os.symlink(data, f)
+ except OSError:
+ # failed to make a link, rewrite file
+ fp = open(f, "w")
+ fp.write(data)
+ fp.close()
+ # no chmod needed at this point
+ return
+ if stat.S_ISLNK(s):
+ # switch link to file
+ data = os.readlink(f)
+ os.unlink(f)
+ fp = open(f, "w")
+ fp.write(data)
+ fp.close()
+ s = 0666 & ~umask # avoid restatting for chmod
+
+ sx = s & 0100
+ if x and not sx:
+ # Turn on +x for every +r bit when making a file executable
+ # and obey umask.
+ os.chmod(f, s | (s & 0444) >> 2 & ~umask)
+ elif not x and sx:
+ # Turn off all +x bits
+ os.chmod(f, s & 0666)
+
+def copymode(src, dst, mode=None):
+ '''Copy the file mode from the file at path src to dst.
+ If src doesn't exist, we're using mode instead. If mode is None, we're
+ using umask.'''
+ try:
+ st_mode = os.lstat(src).st_mode & 0777
+ except OSError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ st_mode = mode
+ if st_mode is None:
+ st_mode = ~umask
+ st_mode &= 0666
+ os.chmod(dst, st_mode)
+
+def checkexec(path):
+ """
+ Check whether the given path is on a filesystem with UNIX-like exec flags
+
+ Requires a directory (like /foo/.hg)
+ """
+
+ # VFAT on some Linux versions can flip mode but it doesn't persist
+ # a FS remount. Frequently we can detect it if files are created
+ # with exec bit on.
+
+ try:
+ EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
+ fh, fn = tempfile.mkstemp(dir=path, prefix='hg-checkexec-')
+ try:
+ os.close(fh)
+ m = os.stat(fn).st_mode & 0777
+ new_file_has_exec = m & EXECFLAGS
+ os.chmod(fn, m ^ EXECFLAGS)
+ exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
+ finally:
+ os.unlink(fn)
+ except (IOError, OSError):
+ # we don't care, the user probably won't be able to commit anyway
+ return False
+ return not (new_file_has_exec or exec_flags_cannot_flip)
+
+def checklink(path):
+ """check whether the given path is on a symlink-capable filesystem"""
+ # mktemp is not racy because symlink creation will fail if the
+ # file already exists
+ name = tempfile.mktemp(dir=path, prefix='hg-checklink-')
+ try:
+ os.symlink(".", name)
+ os.unlink(name)
+ return True
+ except (OSError, AttributeError):
+ return False
+
+def checkosfilename(path):
+ '''Check that the base-relative path is a valid filename on this platform.
+ Returns None if the path is ok, or a UI string describing the problem.'''
+ pass # on posix platforms, every path is ok
+
+def setbinary(fd):
+ pass
+
+def pconvert(path):
+ return path
+
+def localpath(path):
+ return path
+
+def samefile(fpath1, fpath2):
+ """Returns whether path1 and path2 refer to the same file. This is only
+ guaranteed to work for files, not directories."""
+ return os.path.samefile(fpath1, fpath2)
+
+def samedevice(fpath1, fpath2):
+ """Returns whether fpath1 and fpath2 are on the same device. This is only
+ guaranteed to work for files, not directories."""
+ st1 = os.lstat(fpath1)
+ st2 = os.lstat(fpath2)
+ return st1.st_dev == st2.st_dev
+
+# os.path.normcase is a no-op, which doesn't help us on non-native filesystems
+def normcase(path):
+ return path.lower()
+
+if sys.platform == 'darwin':
+ import fcntl # only needed on darwin, missing on jython
+
+ def normcase(path):
+ try:
+ u = path.decode('utf-8')
+ except UnicodeDecodeError:
+ # percent-encode any characters that don't round-trip
+ p2 = path.decode('utf-8', 'ignore').encode('utf-8')
+ s = ""
+ pos = 0
+ for c in path:
+ if p2[pos:pos + 1] == c:
+ s += c
+ pos += 1
+ else:
+ s += "%%%02X" % ord(c)
+ u = s.decode('utf-8')
+
+ # Decompose then lowercase (HFS+ technote specifies lower)
+ return unicodedata.normalize('NFD', u).lower().encode('utf-8')
+
+ def realpath(path):
+ '''
+ Returns the true, canonical file system path equivalent to the given
+ path.
+
+ Equivalent means, in this case, resulting in the same, unique
+ file system link to the path. Every file system entry, whether a file,
+ directory, hard link or symbolic link or special, will have a single
+ path preferred by the system, but may allow multiple, differing path
+ lookups to point to it.
+
+ Most regular UNIX file systems only allow a file system entry to be
+ looked up by its distinct path. Obviously, this does not apply to case
+ insensitive file systems, whether case preserving or not. The most
+ complex issue to deal with is file systems transparently reencoding the
+ path, such as the non-standard Unicode normalisation required for HFS+
+ and HFSX.
+ '''
+ # Constants copied from /usr/include/sys/fcntl.h
+ F_GETPATH = 50
+ O_SYMLINK = 0x200000
+
+ try:
+ fd = os.open(path, O_SYMLINK)
+ except OSError, err:
+ if err.errno == errno.ENOENT:
+ return path
+ raise
+
+ try:
+ return fcntl.fcntl(fd, F_GETPATH, '\0' * 1024).rstrip('\0')
+ finally:
+ os.close(fd)
+elif sys.version_info < (2, 4, 2, 'final'):
+ # Workaround for http://bugs.python.org/issue1213894 (os.path.realpath
+ # didn't resolve symlinks that were the first component of the path.)
+ def realpath(path):
+ if os.path.isabs(path):
+ return os.path.realpath(path)
+ else:
+ return os.path.realpath('./' + path)
+else:
+ # Fallback to the likely inadequate Python builtin function.
+ realpath = os.path.realpath
+
+if sys.platform == 'cygwin':
+ # workaround for cygwin, in which mount point part of path is
+ # treated as case sensitive, even though underlying NTFS is case
+ # insensitive.
+
+ # default mount points
+ cygwinmountpoints = sorted([
+ "/usr/bin",
+ "/usr/lib",
+ "/cygdrive",
+ ], reverse=True)
+
+ # use upper-ing as normcase as same as NTFS workaround
+ def normcase(path):
+ pathlen = len(path)
+ if (pathlen == 0) or (path[0] != os.sep):
+ # treat as relative
+ return encoding.upper(path)
+
+ # to preserve case of mountpoint part
+ for mp in cygwinmountpoints:
+ if not path.startswith(mp):
+ continue
+
+ mplen = len(mp)
+ if mplen == pathlen: # mount point itself
+ return mp
+ if path[mplen] == os.sep:
+ return mp + encoding.upper(path[mplen:])
+
+ return encoding.upper(path)
+
+ # Cygwin translates native ACLs to POSIX permissions,
+ # but these translations are not supported by native
+ # tools, so the exec bit tends to be set erroneously.
+ # Therefore, disable executable bit access on Cygwin.
+ def checkexec(path):
+ return False
+
+ # Similarly, Cygwin's symlink emulation is likely to create
+ # problems when Mercurial is used from both Cygwin and native
+ # Windows, with other native tools, or on shared volumes
+ def checklink(path):
+ return False
+
+def shellquote(s):
+ if os.sys.platform == 'OpenVMS':
+ return '"%s"' % s
+ else:
+ return "'%s'" % s.replace("'", "'\\''")
+
+def quotecommand(cmd):
+ return cmd
+
+def popen(command, mode='r'):
+ return os.popen(command, mode)
+
+def testpid(pid):
+ '''return False if pid dead, True if running or not sure'''
+ if os.sys.platform == 'OpenVMS':
+ return True
+ try:
+ os.kill(pid, 0)
+ return True
+ except OSError, inst:
+ return inst.errno != errno.ESRCH
+
+def explainexit(code):
+ """return a 2-tuple (desc, code) describing a subprocess status
+ (codes from kill are negative - not os.system/wait encoding)"""
+ if code >= 0:
+ return _("exited with status %d") % code, code
+ return _("killed by signal %d") % -code, -code
+
+def isowner(st):
+ """Return True if the stat object st is from the current user."""
+ return st.st_uid == os.getuid()
+
+def findexe(command):
+ '''Find executable for command searching like which does.
+ If command is a basename then PATH is searched for command.
+ PATH isn't searched if command is an absolute or relative path.
+ If command isn't found None is returned.'''
+ if sys.platform == 'OpenVMS':
+ return command
+
+ def findexisting(executable):
+ 'Will return executable if existing file'
+ if os.path.isfile(executable) and os.access(executable, os.X_OK):
+ return executable
+ return None
+
+ if os.sep in command:
+ return findexisting(command)
+
+ if sys.platform == 'plan9':
+ return findexisting(os.path.join('/bin', command))
+
+ for path in os.environ.get('PATH', '').split(os.pathsep):
+ executable = findexisting(os.path.join(path, command))
+ if executable is not None:
+ return executable
+ return None
+
+def setsignalhandler():
+ pass
+
+def statfiles(files):
+ 'Stat each file in files and yield stat or None if file does not exist.'
+ lstat = os.lstat
+ for nf in files:
+ try:
+ st = lstat(nf)
+ except OSError, err:
+ if err.errno not in (errno.ENOENT, errno.ENOTDIR):
+ raise
+ st = None
+ yield st
+
+def getuser():
+ '''return name of current user'''
+ return getpass.getuser()
+
+def username(uid=None):
+ """Return the name of the user with the given uid.
+
+ If uid is None, return the name of the current user."""
+
+ if uid is None:
+ uid = os.getuid()
+ try:
+ return pwd.getpwuid(uid)[0]
+ except KeyError:
+ return str(uid)
+
+def groupname(gid=None):
+ """Return the name of the group with the given gid.
+
+ If gid is None, return the name of the current group."""
+
+ if gid is None:
+ gid = os.getgid()
+ try:
+ return grp.getgrgid(gid)[0]
+ except KeyError:
+ return str(gid)
+
+def groupmembers(name):
+ """Return the list of members of the group with the given
+ name, KeyError if the group does not exist.
+ """
+ return list(grp.getgrnam(name).gr_mem)
+
+def spawndetached(args):
+ return os.spawnvp(os.P_NOWAIT | getattr(os, 'P_DETACH', 0),
+ args[0], args)
+
+def gethgcmd():
+ return sys.argv[:1]
+
+def termwidth():
+ try:
+ import termios, array, fcntl
+ for dev in (sys.stderr, sys.stdout, sys.stdin):
+ try:
+ try:
+ fd = dev.fileno()
+ except AttributeError:
+ continue
+ if not os.isatty(fd):
+ continue
+ try:
+ arri = fcntl.ioctl(fd, termios.TIOCGWINSZ, '\0' * 8)
+ width = array.array('h', arri)[1]
+ if width > 0:
+ return width
+ except AttributeError:
+ pass
+ except ValueError:
+ pass
+ except IOError, e:
+ if e[0] == errno.EINVAL:
+ pass
+ else:
+ raise
+ except ImportError:
+ pass
+ return 80
+
+def makedir(path, notindexed):
+ os.mkdir(path)
+
+def unlinkpath(f):
+ """unlink and remove the directory if it is empty"""
+ os.unlink(f)
+ # try removing directories that might now be empty
+ try:
+ os.removedirs(os.path.dirname(f))
+ except OSError:
+ pass
+
+def lookupreg(key, name=None, scope=None):
+ return None
+
+def hidewindow():
+ """Hide current shell window.
+
+ Used to hide the window opened when starting asynchronous
+ child process under Windows, unneeded on other systems.
+ """
+ pass
+
+class cachestat(object):
+ def __init__(self, path):
+ self.stat = os.stat(path)
+
+ def cacheable(self):
+ return bool(self.stat.st_ino)
+
+ __hash__ = object.__hash__
+
+ def __eq__(self, other):
+ try:
+ return self.stat == other.stat
+ except AttributeError:
+ return False
+
+ def __ne__(self, other):
+ return not self == other
+
+def executablepath():
+ return None # available on Windows only
diff --git a/mercurial/pure/__init__.py b/mercurial/pure/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/mercurial/pure/__init__.py
diff --git a/mercurial/pure/base85.py b/mercurial/pure/base85.py
new file mode 100644
index 0000000..8b93192
--- /dev/null
+++ b/mercurial/pure/base85.py
@@ -0,0 +1,75 @@
+# base85.py: pure python base85 codec
+#
+# Copyright (C) 2009 Brendan Cully <brendan@kublai.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import struct
+
+_b85chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+ "abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
+_b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
+_b85dec = {}
+
+def _mkb85dec():
+ for i, c in enumerate(_b85chars):
+ _b85dec[c] = i
+
+def b85encode(text, pad=False):
+ """encode text in base85 format"""
+ l = len(text)
+ r = l % 4
+ if r:
+ text += '\0' * (4 - r)
+ longs = len(text) >> 2
+ words = struct.unpack('>%dL' % (longs), text)
+
+ out = ''.join(_b85chars[(word // 52200625) % 85] +
+ _b85chars2[(word // 7225) % 7225] +
+ _b85chars2[word % 7225]
+ for word in words)
+
+ if pad:
+ return out
+
+ # Trim padding
+ olen = l % 4
+ if olen:
+ olen += 1
+ olen += l // 4 * 5
+ return out[:olen]
+
+def b85decode(text):
+ """decode base85-encoded text"""
+ if not _b85dec:
+ _mkb85dec()
+
+ l = len(text)
+ out = []
+ for i in range(0, len(text), 5):
+ chunk = text[i:i + 5]
+ acc = 0
+ for j, c in enumerate(chunk):
+ try:
+ acc = acc * 85 + _b85dec[c]
+ except KeyError:
+ raise ValueError('bad base85 character at position %d'
+ % (i + j))
+ if acc > 4294967295:
+ raise ValueError('Base85 overflow in hunk starting at byte %d' % i)
+ out.append(acc)
+
+ # Pad final chunk if necessary
+ cl = l % 5
+ if cl:
+ acc *= 85 ** (5 - cl)
+ if cl > 1:
+ acc += 0xffffff >> (cl - 2) * 8
+ out[-1] = acc
+
+ out = struct.pack('>%dL' % (len(out)), *out)
+ if cl:
+ out = out[:-(5 - cl)]
+
+ return out
diff --git a/mercurial/pure/bdiff.py b/mercurial/pure/bdiff.py
new file mode 100644
index 0000000..06f0bd3
--- /dev/null
+++ b/mercurial/pure/bdiff.py
@@ -0,0 +1,87 @@
+# bdiff.py - Python implementation of bdiff.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import struct, difflib, re
+
+def splitnewlines(text):
+ '''like str.splitlines, but only split on newlines.'''
+ lines = [l + '\n' for l in text.split('\n')]
+ if lines:
+ if lines[-1] == '\n':
+ lines.pop()
+ else:
+ lines[-1] = lines[-1][:-1]
+ return lines
+
+def _normalizeblocks(a, b, blocks):
+ prev = None
+ r = []
+ for curr in blocks:
+ if prev is None:
+ prev = curr
+ continue
+ shift = 0
+
+ a1, b1, l1 = prev
+ a1end = a1 + l1
+ b1end = b1 + l1
+
+ a2, b2, l2 = curr
+ a2end = a2 + l2
+ b2end = b2 + l2
+ if a1end == a2:
+ while (a1end + shift < a2end and
+ a[a1end + shift] == b[b1end + shift]):
+ shift += 1
+ elif b1end == b2:
+ while (b1end + shift < b2end and
+ a[a1end + shift] == b[b1end + shift]):
+ shift += 1
+ r.append((a1, b1, l1 + shift))
+ prev = a2 + shift, b2 + shift, l2 - shift
+ r.append(prev)
+ return r
+
+def bdiff(a, b):
+ a = str(a).splitlines(True)
+ b = str(b).splitlines(True)
+
+ if not a:
+ s = "".join(b)
+ return s and (struct.pack(">lll", 0, 0, len(s)) + s)
+
+ bin = []
+ p = [0]
+ for i in a: p.append(p[-1] + len(i))
+
+ d = difflib.SequenceMatcher(None, a, b).get_matching_blocks()
+ d = _normalizeblocks(a, b, d)
+ la = 0
+ lb = 0
+ for am, bm, size in d:
+ s = "".join(b[lb:bm])
+ if am > la or s:
+ bin.append(struct.pack(">lll", p[la], p[am], len(s)) + s)
+ la = am + size
+ lb = bm + size
+
+ return "".join(bin)
+
+def blocks(a, b):
+ an = splitnewlines(a)
+ bn = splitnewlines(b)
+ d = difflib.SequenceMatcher(None, an, bn).get_matching_blocks()
+ d = _normalizeblocks(an, bn, d)
+ return [(i, i + n, j, j + n) for (i, j, n) in d]
+
+def fixws(text, allws):
+ if allws:
+ text = re.sub('[ \t\r]+', '', text)
+ else:
+ text = re.sub('[ \t\r]+', ' ', text)
+ text = text.replace(' \n', '\n')
+ return text
diff --git a/mercurial/pure/diffhelpers.py b/mercurial/pure/diffhelpers.py
new file mode 100644
index 0000000..681fa26
--- /dev/null
+++ b/mercurial/pure/diffhelpers.py
@@ -0,0 +1,60 @@
+# diffhelpers.py - pure Python implementation of diffhelpers.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+def addlines(fp, hunk, lena, lenb, a, b):
+ while True:
+ todoa = lena - len(a)
+ todob = lenb - len(b)
+ num = max(todoa, todob)
+ if num == 0:
+ break
+ for i in xrange(num):
+ s = fp.readline()
+ c = s[0]
+ if s == "\\ No newline at end of file\n":
+ fix_newline(hunk, a, b)
+ continue
+ if c == "\n":
+ # Some patches may be missing the control char
+ # on empty lines. Supply a leading space.
+ s = " \n"
+ hunk.append(s)
+ if c == "+":
+ b.append(s[1:])
+ elif c == "-":
+ a.append(s)
+ else:
+ b.append(s[1:])
+ a.append(s)
+ return 0
+
+def fix_newline(hunk, a, b):
+ l = hunk[-1]
+ # tolerate CRLF in last line
+ if l.endswith('\r\n'):
+ hline = l[:-2]
+ else:
+ hline = l[:-1]
+ c = hline[0]
+
+ if c in " +":
+ b[-1] = hline[1:]
+ if c in " -":
+ a[-1] = hline
+ hunk[-1] = hline
+ return 0
+
+
+def testhunk(a, b, bstart):
+ alen = len(a)
+ blen = len(b)
+ if alen > blen - bstart:
+ return -1
+ for i in xrange(alen):
+ if a[i][1:] != b[i + bstart]:
+ return -1
+ return 0
diff --git a/mercurial/pure/mpatch.py b/mercurial/pure/mpatch.py
new file mode 100644
index 0000000..1738d97
--- /dev/null
+++ b/mercurial/pure/mpatch.py
@@ -0,0 +1,118 @@
+# mpatch.py - Python implementation of mpatch.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import struct
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+
+# This attempts to apply a series of patches in time proportional to
+# the total size of the patches, rather than patches * len(text). This
+# means rather than shuffling strings around, we shuffle around
+# pointers to fragments with fragment lists.
+#
+# When the fragment lists get too long, we collapse them. To do this
+# efficiently, we do all our operations inside a buffer created by
+# mmap and simply use memmove. This avoids creating a bunch of large
+# temporary string buffers.
+
+def patches(a, bins):
+ if not bins:
+ return a
+
+ plens = [len(x) for x in bins]
+ pl = sum(plens)
+ bl = len(a) + pl
+ tl = bl + bl + pl # enough for the patches and two working texts
+ b1, b2 = 0, bl
+
+ if not tl:
+ return a
+
+ m = StringIO()
+ def move(dest, src, count):
+ """move count bytes from src to dest
+
+ The file pointer is left at the end of dest.
+ """
+ m.seek(src)
+ buf = m.read(count)
+ m.seek(dest)
+ m.write(buf)
+
+ # load our original text
+ m.write(a)
+ frags = [(len(a), b1)]
+
+ # copy all the patches into our segment so we can memmove from them
+ pos = b2 + bl
+ m.seek(pos)
+ for p in bins: m.write(p)
+
+ def pull(dst, src, l): # pull l bytes from src
+ while l:
+ f = src.pop()
+ if f[0] > l: # do we need to split?
+ src.append((f[0] - l, f[1] + l))
+ dst.append((l, f[1]))
+ return
+ dst.append(f)
+ l -= f[0]
+
+ def collect(buf, list):
+ start = buf
+ for l, p in reversed(list):
+ move(buf, p, l)
+ buf += l
+ return (buf - start, start)
+
+ for plen in plens:
+ # if our list gets too long, execute it
+ if len(frags) > 128:
+ b2, b1 = b1, b2
+ frags = [collect(b1, frags)]
+
+ new = []
+ end = pos + plen
+ last = 0
+ while pos < end:
+ m.seek(pos)
+ p1, p2, l = struct.unpack(">lll", m.read(12))
+ pull(new, frags, p1 - last) # what didn't change
+ pull([], frags, p2 - p1) # what got deleted
+ new.append((l, pos + 12)) # what got added
+ pos += l + 12
+ last = p2
+ frags.extend(reversed(new)) # what was left at the end
+
+ t = collect(b2, frags)
+
+ m.seek(t[1])
+ return m.read(t[0])
+
+def patchedsize(orig, delta):
+ outlen, last, bin = 0, 0, 0
+ binend = len(delta)
+ data = 12
+
+ while data <= binend:
+ decode = delta[bin:bin + 12]
+ start, end, length = struct.unpack(">lll", decode)
+ if start > end:
+ break
+ bin = data + length
+ data = bin + 12
+ outlen += start - last
+ last = end
+ outlen += length
+
+ if bin != binend:
+ raise ValueError("patch cannot be decoded")
+
+ outlen += orig - last
+ return outlen
diff --git a/mercurial/pure/osutil.py b/mercurial/pure/osutil.py
new file mode 100644
index 0000000..2476bd6
--- /dev/null
+++ b/mercurial/pure/osutil.py
@@ -0,0 +1,170 @@
+# osutil.py - pure Python version of osutil.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os
+import stat as statmod
+
+def _mode_to_kind(mode):
+ if statmod.S_ISREG(mode):
+ return statmod.S_IFREG
+ if statmod.S_ISDIR(mode):
+ return statmod.S_IFDIR
+ if statmod.S_ISLNK(mode):
+ return statmod.S_IFLNK
+ if statmod.S_ISBLK(mode):
+ return statmod.S_IFBLK
+ if statmod.S_ISCHR(mode):
+ return statmod.S_IFCHR
+ if statmod.S_ISFIFO(mode):
+ return statmod.S_IFIFO
+ if statmod.S_ISSOCK(mode):
+ return statmod.S_IFSOCK
+ return mode
+
+def listdir(path, stat=False, skip=None):
+ '''listdir(path, stat=False) -> list_of_tuples
+
+ Return a sorted list containing information about the entries
+ in the directory.
+
+ If stat is True, each element is a 3-tuple:
+
+ (name, type, stat object)
+
+ Otherwise, each element is a 2-tuple:
+
+ (name, type)
+ '''
+ result = []
+ prefix = path
+ if not prefix.endswith(os.sep):
+ prefix += os.sep
+ names = os.listdir(path)
+ names.sort()
+ for fn in names:
+ st = os.lstat(prefix + fn)
+ if fn == skip and statmod.S_ISDIR(st.st_mode):
+ return []
+ if stat:
+ result.append((fn, _mode_to_kind(st.st_mode), st))
+ else:
+ result.append((fn, _mode_to_kind(st.st_mode)))
+ return result
+
+if os.name != 'nt':
+ posixfile = open
+else:
+ import ctypes, msvcrt
+
+ _kernel32 = ctypes.windll.kernel32
+
+ _DWORD = ctypes.c_ulong
+ _LPCSTR = _LPSTR = ctypes.c_char_p
+ _HANDLE = ctypes.c_void_p
+
+ _INVALID_HANDLE_VALUE = _HANDLE(-1).value
+
+ # CreateFile
+ _FILE_SHARE_READ = 0x00000001
+ _FILE_SHARE_WRITE = 0x00000002
+ _FILE_SHARE_DELETE = 0x00000004
+
+ _CREATE_ALWAYS = 2
+ _OPEN_EXISTING = 3
+ _OPEN_ALWAYS = 4
+
+ _GENERIC_READ = 0x80000000
+ _GENERIC_WRITE = 0x40000000
+
+ _FILE_ATTRIBUTE_NORMAL = 0x80
+
+ # _open_osfhandle
+ _O_RDONLY = 0x0000
+ _O_RDWR = 0x0002
+ _O_APPEND = 0x0008
+
+ _O_TEXT = 0x4000
+ _O_BINARY = 0x8000
+
+ # types of parameters of C functions used (required by pypy)
+
+ _kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p,
+ _DWORD, _DWORD, _HANDLE]
+ _kernel32.CreateFileA.restype = _HANDLE
+
+ def _raiseioerror(name):
+ err = ctypes.WinError()
+ raise IOError(err.errno, '%s: %s' % (name, err.strerror))
+
+ class posixfile(object):
+ '''a file object aiming for POSIX-like semantics
+
+ CPython's open() returns a file that was opened *without* setting the
+ _FILE_SHARE_DELETE flag, which causes rename and unlink to abort.
+ This even happens if any hardlinked copy of the file is in open state.
+ We set _FILE_SHARE_DELETE here, so files opened with posixfile can be
+ renamed and deleted while they are held open.
+ Note that if a file opened with posixfile is unlinked, the file
+ remains but cannot be opened again or be recreated under the same name,
+ until all reading processes have closed the file.'''
+
+ def __init__(self, name, mode='r', bufsize=-1):
+ if 'b' in mode:
+ flags = _O_BINARY
+ else:
+ flags = _O_TEXT
+
+ m0 = mode[0]
+ if m0 == 'r' and '+' not in mode:
+ flags |= _O_RDONLY
+ access = _GENERIC_READ
+ else:
+ # work around http://support.microsoft.com/kb/899149 and
+ # set _O_RDWR for 'w' and 'a', even if mode has no '+'
+ flags |= _O_RDWR
+ access = _GENERIC_READ | _GENERIC_WRITE
+
+ if m0 == 'r':
+ creation = _OPEN_EXISTING
+ elif m0 == 'w':
+ creation = _CREATE_ALWAYS
+ elif m0 == 'a':
+ creation = _OPEN_ALWAYS
+ flags |= _O_APPEND
+ else:
+ raise ValueError("invalid mode: %s" % mode)
+
+ fh = _kernel32.CreateFileA(name, access,
+ _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
+ None, creation, _FILE_ATTRIBUTE_NORMAL, None)
+ if fh == _INVALID_HANDLE_VALUE:
+ _raiseioerror(name)
+
+ fd = msvcrt.open_osfhandle(fh, flags)
+ if fd == -1:
+ _kernel32.CloseHandle(fh)
+ _raiseioerror(name)
+
+ f = os.fdopen(fd, mode, bufsize)
+ # unfortunately, f.name is '<fdopen>' at this point -- so we store
+ # the name on this wrapper. We cannot just assign to f.name,
+ # because that attribute is read-only.
+ object.__setattr__(self, 'name', name)
+ object.__setattr__(self, '_file', f)
+
+ def __iter__(self):
+ return self._file
+
+ def __getattr__(self, name):
+ return getattr(self._file, name)
+
+ def __setattr__(self, name, value):
+ '''mimics the read-only attributes of Python file objects
+ by raising 'TypeError: readonly attribute' if someone tries:
+ f = posixfile('foo.txt')
+ f.name = 'bla' '''
+ return self._file.__setattr__(name, value)
diff --git a/mercurial/pure/parsers.py b/mercurial/pure/parsers.py
new file mode 100644
index 0000000..c4fe285
--- /dev/null
+++ b/mercurial/pure/parsers.py
@@ -0,0 +1,89 @@
+# parsers.py - Python implementation of parsers.c
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.node import bin, nullid
+from mercurial import util
+import struct, zlib
+
+_pack = struct.pack
+_unpack = struct.unpack
+_compress = zlib.compress
+_decompress = zlib.decompress
+_sha = util.sha1
+
+def parse_manifest(mfdict, fdict, lines):
+ for l in lines.splitlines():
+ f, n = l.split('\0')
+ if len(n) > 40:
+ fdict[f] = n[40:]
+ mfdict[f] = bin(n[:40])
+ else:
+ mfdict[f] = bin(n)
+
+def parse_index2(data, inline):
+ def gettype(q):
+ return int(q & 0xFFFF)
+
+ def offset_type(offset, type):
+ return long(long(offset) << 16 | type)
+
+ indexformatng = ">Qiiiiii20s12x"
+
+ s = struct.calcsize(indexformatng)
+ index = []
+ cache = None
+ off = 0
+
+ l = len(data) - s
+ append = index.append
+ if inline:
+ cache = (0, data)
+ while off <= l:
+ e = _unpack(indexformatng, data[off:off + s])
+ append(e)
+ if e[1] < 0:
+ break
+ off += e[1] + s
+ else:
+ while off <= l:
+ e = _unpack(indexformatng, data[off:off + s])
+ append(e)
+ off += s
+
+ if off != len(data):
+ raise ValueError('corrupt index file')
+
+ if index:
+ e = list(index[0])
+ type = gettype(e[0])
+ e[0] = offset_type(0, type)
+ index[0] = tuple(e)
+
+ # add the magic null revision at -1
+ index.append((0, 0, 0, -1, -1, -1, -1, nullid))
+
+ return index, cache
+
+def parse_dirstate(dmap, copymap, st):
+ parents = [st[:20], st[20: 40]]
+ # deref fields so they will be local in loop
+ format = ">cllll"
+ e_size = struct.calcsize(format)
+ pos1 = 40
+ l = len(st)
+
+ # the inner loop
+ while pos1 < l:
+ pos2 = pos1 + e_size
+ e = _unpack(">cllll", st[pos1:pos2]) # a literal here is faster
+ pos1 = pos2 + e[4]
+ f = st[pos2:pos1]
+ if '\0' in f:
+ f, c = f.split('\0')
+ copymap[f] = c
+ dmap[f] = e[:4]
+ return parents
diff --git a/mercurial/pushkey.py b/mercurial/pushkey.py
new file mode 100644
index 0000000..7d692d0
--- /dev/null
+++ b/mercurial/pushkey.py
@@ -0,0 +1,39 @@
+# pushkey.py - dispatching for pushing and pulling keys
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import bookmarks, phases, obsolete
+
+def _nslist(repo):
+ n = {}
+ for k in _namespaces:
+ n[k] = ""
+ if not obsolete._enabled:
+ n.pop('obsolete')
+ return n
+
+_namespaces = {"namespaces": (lambda *x: False, _nslist),
+ "bookmarks": (bookmarks.pushbookmark, bookmarks.listbookmarks),
+ "phases": (phases.pushphase, phases.listphases),
+ "obsolete": (obsolete.pushmarker, obsolete.listmarkers),
+ }
+
+def register(namespace, pushkey, listkeys):
+ _namespaces[namespace] = (pushkey, listkeys)
+
+def _get(namespace):
+ return _namespaces.get(namespace, (lambda *x: False, lambda *x: {}))
+
+def push(repo, namespace, key, old, new):
+ '''should succeed iff value was old'''
+ pk = _get(namespace)[0]
+ return pk(repo, key, old, new)
+
+def list(repo, namespace):
+ '''return a dict'''
+ lk = _get(namespace)[1]
+ return lk(repo)
+
diff --git a/mercurial/pvec.py b/mercurial/pvec.py
new file mode 100644
index 0000000..d29bbbc
--- /dev/null
+++ b/mercurial/pvec.py
@@ -0,0 +1,210 @@
+# pvec.py - probabilistic vector clocks for Mercurial
+#
+# Copyright 2012 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''
+A "pvec" is a changeset property based on the theory of vector clocks
+that can be compared to discover relatedness without consulting a
+graph. This can be useful for tasks like determining how a
+disconnected patch relates to a repository.
+
+Currently a pvec consist of 448 bits, of which 24 are 'depth' and the
+remainder are a bit vector. It is represented as a 70-character base85
+string.
+
+Construction:
+
+- a root changeset has a depth of 0 and a bit vector based on its hash
+- a normal commit has a changeset where depth is increased by one and
+ one bit vector bit is flipped based on its hash
+- a merge changeset pvec is constructed by copying changes from one pvec into
+ the other to balance its depth
+
+Properties:
+
+- for linear changes, difference in depth is always <= hamming distance
+- otherwise, changes are probably divergent
+- when hamming distance is < 200, we can reliably detect when pvecs are near
+
+Issues:
+
+- hamming distance ceases to work over distances of ~ 200
+- detecting divergence is less accurate when the common ancestor is very close
+ to either revision or total distance is high
+- this could probably be improved by modeling the relation between
+ delta and hdist
+
+Uses:
+
+- a patch pvec can be used to locate the nearest available common ancestor for
+ resolving conflicts
+- ordering of patches can be established without a DAG
+- two head pvecs can be compared to determine whether push/pull/merge is needed
+ and approximately how many changesets are involved
+- can be used to find a heuristic divergence measure between changesets on
+ different branches
+'''
+
+import base85, util
+from node import nullrev
+
+_size = 448 # 70 chars b85-encoded
+_bytes = _size / 8
+_depthbits = 24
+_depthbytes = _depthbits / 8
+_vecbytes = _bytes - _depthbytes
+_vecbits = _vecbytes * 8
+_radius = (_vecbits - 30) / 2 # high probability vecs are related
+
+def _bin(bs):
+ '''convert a bytestring to a long'''
+ v = 0
+ for b in bs:
+ v = v * 256 + ord(b)
+ return v
+
+def _str(v, l):
+ bs = ""
+ for p in xrange(l):
+ bs = chr(v & 255) + bs
+ v >>= 8
+ return bs
+
+def _split(b):
+ '''depth and bitvec'''
+ return _bin(b[:_depthbytes]), _bin(b[_depthbytes:])
+
+def _join(depth, bitvec):
+ return _str(depth, _depthbytes) + _str(bitvec, _vecbytes)
+
+def _hweight(x):
+ c = 0
+ while x:
+ if x & 1:
+ c += 1
+ x >>= 1
+ return c
+_htab = [_hweight(x) for x in xrange(256)]
+
+def _hamming(a, b):
+ '''find the hamming distance between two longs'''
+ d = a ^ b
+ c = 0
+ while d:
+ c += _htab[d & 0xff]
+ d >>= 8
+ return c
+
+def _mergevec(x, y, c):
+ # Ideally, this function would be x ^ y ^ ancestor, but finding
+ # ancestors is a nuisance. So instead we find the minimal number
+ # of changes to balance the depth and hamming distance
+
+ d1, v1 = x
+ d2, v2 = y
+ if d1 < d2:
+ d1, d2, v1, v2 = d2, d1, v2, v1
+
+ hdist = _hamming(v1, v2)
+ ddist = d1 - d2
+ v = v1
+ m = v1 ^ v2 # mask of different bits
+ i = 1
+
+ if hdist > ddist:
+ # if delta = 10 and hdist = 100, then we need to go up 55 steps
+ # to the ancestor and down 45
+ changes = (hdist - ddist + 1) / 2
+ else:
+ # must make at least one change
+ changes = 1
+ depth = d1 + changes
+
+ # copy changes from v2
+ if m:
+ while changes:
+ if m & i:
+ v ^= i
+ changes -= 1
+ i <<= 1
+ else:
+ v = _flipbit(v, c)
+
+ return depth, v
+
+def _flipbit(v, node):
+ # converting bit strings to longs is slow
+ bit = (hash(node) & 0xffffffff) % _vecbits
+ return v ^ (1<<bit)
+
+def ctxpvec(ctx):
+ '''construct a pvec for ctx while filling in the cache'''
+ r = ctx._repo
+ if not util.safehasattr(r, "_pveccache"):
+ r._pveccache = {}
+ pvc = r._pveccache
+ if ctx.rev() not in pvc:
+ cl = r.changelog
+ for n in xrange(ctx.rev() + 1):
+ if n not in pvc:
+ node = cl.node(n)
+ p1, p2 = cl.parentrevs(n)
+ if p1 == nullrev:
+ # start with a 'random' vector at root
+ pvc[n] = (0, _bin((node * 3)[:_vecbytes]))
+ elif p2 == nullrev:
+ d, v = pvc[p1]
+ pvc[n] = (d + 1, _flipbit(v, node))
+ else:
+ pvc[n] = _mergevec(pvc[p1], pvc[p2], node)
+ bs = _join(*pvc[ctx.rev()])
+ return pvec(base85.b85encode(bs))
+
+class pvec(object):
+ def __init__(self, hashorctx):
+ if isinstance(hashorctx, str):
+ self._bs = hashorctx
+ self._depth, self._vec = _split(base85.b85decode(hashorctx))
+ else:
+ self._vec = ctxpvec(ctx)
+
+ def __str__(self):
+ return self._bs
+
+ def __eq__(self, b):
+ return self._vec == b._vec and self._depth == b._depth
+
+ def __lt__(self, b):
+ delta = b._depth - self._depth
+ if delta < 0:
+ return False # always correct
+ if _hamming(self._vec, b._vec) > delta:
+ return False
+ return True
+
+ def __gt__(self, b):
+ return b < self
+
+ def __or__(self, b):
+ delta = abs(b._depth - self._depth)
+ if _hamming(self._vec, b._vec) <= delta:
+ return False
+ return True
+
+ def __sub__(self, b):
+ if self | b:
+ raise ValueError("concurrent pvecs")
+ return self._depth - b._depth
+
+ def distance(self, b):
+ d = abs(b._depth - self._depth)
+ h = _hamming(self._vec, b._vec)
+ return max(d, h)
+
+ def near(self, b):
+ dist = abs(b.depth - self._depth)
+ if dist > _radius or _hamming(self._vec, b._vec) > _radius:
+ return False
diff --git a/mercurial/py3kcompat.py b/mercurial/py3kcompat.py
new file mode 100644
index 0000000..8843e9e
--- /dev/null
+++ b/mercurial/py3kcompat.py
@@ -0,0 +1,72 @@
+# py3kcompat.py - compatibility definitions for running hg in py3k
+#
+# Copyright 2010 Renato Cunha <renatoc@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import os, builtins
+
+from numbers import Number
+
+def bytesformatter(format, args):
+ '''Custom implementation of a formatter for bytestrings.
+
+ This function currently relias on the string formatter to do the
+ formatting and always returns bytes objects.
+
+ >>> bytesformatter(20, 10)
+ 0
+ >>> bytesformatter('unicode %s, %s!', ('string', 'foo'))
+ b'unicode string, foo!'
+ >>> bytesformatter(b'test %s', 'me')
+ b'test me'
+ >>> bytesformatter('test %s', 'me')
+ b'test me'
+ >>> bytesformatter(b'test %s', b'me')
+ b'test me'
+ >>> bytesformatter('test %s', b'me')
+ b'test me'
+ >>> bytesformatter('test %d: %s', (1, b'result'))
+ b'test 1: result'
+ '''
+ # The current implementation just converts from bytes to unicode, do
+ # what's needed and then convert the results back to bytes.
+ # Another alternative is to use the Python C API implementation.
+ if isinstance(format, Number):
+ # If the fixer erroneously passes a number remainder operation to
+ # bytesformatter, we just return the correct operation
+ return format % args
+ if isinstance(format, bytes):
+ format = format.decode('utf-8', 'surrogateescape')
+ if isinstance(args, bytes):
+ args = args.decode('utf-8', 'surrogateescape')
+ if isinstance(args, tuple):
+ newargs = []
+ for arg in args:
+ if isinstance(arg, bytes):
+ arg = arg.decode('utf-8', 'surrogateescape')
+ newargs.append(arg)
+ args = tuple(newargs)
+ ret = format % args
+ return ret.encode('utf-8', 'surrogateescape')
+builtins.bytesformatter = bytesformatter
+
+# Create bytes equivalents for os.environ values
+for key in list(os.environ.keys()):
+ # UTF-8 is fine for us
+ bkey = key.encode('utf-8', 'surrogateescape')
+ bvalue = os.environ[key].encode('utf-8', 'surrogateescape')
+ os.environ[bkey] = bvalue
+
+origord = builtins.ord
+def fakeord(char):
+ if isinstance(char, int):
+ return char
+ return origord(char)
+builtins.ord = fakeord
+
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod()
+
diff --git a/mercurial/repair.py b/mercurial/repair.py
new file mode 100644
index 0000000..9ccaa34
--- /dev/null
+++ b/mercurial/repair.py
@@ -0,0 +1,201 @@
+# repair.py - functions for repository repair for mercurial
+#
+# Copyright 2005, 2006 Chris Mason <mason@suse.com>
+# Copyright 2007 Matt Mackall
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial import changegroup, bookmarks
+from mercurial.node import short
+from mercurial.i18n import _
+import os
+import errno
+
+def _bundle(repo, bases, heads, node, suffix, compress=True):
+ """create a bundle with the specified revisions as a backup"""
+ cg = repo.changegroupsubset(bases, heads, 'strip')
+ backupdir = repo.join("strip-backup")
+ if not os.path.isdir(backupdir):
+ os.mkdir(backupdir)
+ name = os.path.join(backupdir, "%s-%s.hg" % (short(node), suffix))
+ if compress:
+ bundletype = "HG10BZ"
+ else:
+ bundletype = "HG10UN"
+ return changegroup.writebundle(cg, name, bundletype)
+
+def _collectfiles(repo, striprev):
+ """find out the filelogs affected by the strip"""
+ files = set()
+
+ for x in xrange(striprev, len(repo)):
+ files.update(repo[x].files())
+
+ return sorted(files)
+
+def _collectbrokencsets(repo, files, striprev):
+ """return the changesets which will be broken by the truncation"""
+ s = set()
+ def collectone(revlog):
+ linkgen = (revlog.linkrev(i) for i in revlog)
+ # find the truncation point of the revlog
+ for lrev in linkgen:
+ if lrev >= striprev:
+ break
+ # see if any revision after this point has a linkrev
+ # less than striprev (those will be broken by strip)
+ for lrev in linkgen:
+ if lrev < striprev:
+ s.add(lrev)
+
+ collectone(repo.manifest)
+ for fname in files:
+ collectone(repo.file(fname))
+
+ return s
+
+def strip(ui, repo, nodelist, backup="all", topic='backup'):
+ # It simplifies the logic around updating the branchheads cache if we only
+ # have to consider the effect of the stripped revisions and not revisions
+ # missing because the cache is out-of-date.
+ repo.updatebranchcache()
+
+ cl = repo.changelog
+ # TODO handle undo of merge sets
+ if isinstance(nodelist, str):
+ nodelist = [nodelist]
+ striplist = [cl.rev(node) for node in nodelist]
+ striprev = min(striplist)
+
+ # Generate set of branches who will have nodes stripped.
+ striprevs = repo.revs("%ld::", striplist)
+ stripbranches = set([repo[rev].branch() for rev in striprevs])
+
+ # Set of potential new heads resulting from the strip. The parents of any
+ # node removed could be a new head because the node to be removed could have
+ # been the only child of the parent.
+ newheadrevs = repo.revs("parents(%ld::) - %ld::", striprevs, striprevs)
+ newheadnodes = set([cl.node(rev) for rev in newheadrevs])
+ newheadbranches = set([repo[rev].branch() for rev in newheadrevs])
+
+ keeppartialbundle = backup == 'strip'
+
+ # Some revisions with rev > striprev may not be descendants of striprev.
+ # We have to find these revisions and put them in a bundle, so that
+ # we can restore them after the truncations.
+ # To create the bundle we use repo.changegroupsubset which requires
+ # the list of heads and bases of the set of interesting revisions.
+ # (head = revision in the set that has no descendant in the set;
+ # base = revision in the set that has no ancestor in the set)
+ tostrip = set(striplist)
+ for rev in striplist:
+ for desc in cl.descendants([rev]):
+ tostrip.add(desc)
+
+ files = _collectfiles(repo, striprev)
+ saverevs = _collectbrokencsets(repo, files, striprev)
+
+ # compute heads
+ saveheads = set(saverevs)
+ for r in xrange(striprev + 1, len(cl)):
+ if r not in tostrip:
+ saverevs.add(r)
+ saveheads.difference_update(cl.parentrevs(r))
+ saveheads.add(r)
+ saveheads = [cl.node(r) for r in saveheads]
+
+ # compute base nodes
+ if saverevs:
+ descendants = set(cl.descendants(saverevs))
+ saverevs.difference_update(descendants)
+ savebases = [cl.node(r) for r in saverevs]
+ stripbases = [cl.node(r) for r in tostrip]
+ rset = ' or '.join([str(r) for r in tostrip])
+ newbmtarget = repo.revs('sort(heads(ancestors(%r) - (%r)), -rev)',
+ rset, rset)
+ if newbmtarget:
+ newbmtarget = newbmtarget[0]
+ else:
+ newbmtarget = '.'
+
+ bm = repo._bookmarks
+ updatebm = []
+ for m in bm:
+ rev = repo[bm[m]].rev()
+ if rev in tostrip:
+ updatebm.append(m)
+
+ # create a changegroup for all the branches we need to keep
+ backupfile = None
+ if backup == "all":
+ backupfile = _bundle(repo, stripbases, cl.heads(), node, topic)
+ repo.ui.status(_("saved backup bundle to %s\n") % backupfile)
+ if saveheads or savebases:
+ # do not compress partial bundle if we remove it from disk later
+ chgrpfile = _bundle(repo, savebases, saveheads, node, 'temp',
+ compress=keeppartialbundle)
+
+ mfst = repo.manifest
+
+ tr = repo.transaction("strip")
+ offset = len(tr.entries)
+
+ try:
+ tr.startgroup()
+ cl.strip(striprev, tr)
+ mfst.strip(striprev, tr)
+ for fn in files:
+ repo.file(fn).strip(striprev, tr)
+ tr.endgroup()
+
+ try:
+ for i in xrange(offset, len(tr.entries)):
+ file, troffset, ignore = tr.entries[i]
+ repo.sopener(file, 'a').truncate(troffset)
+ tr.close()
+ except: # re-raises
+ tr.abort()
+ raise
+
+ if saveheads or savebases:
+ ui.note(_("adding branch\n"))
+ f = open(chgrpfile, "rb")
+ gen = changegroup.readbundle(f, chgrpfile)
+ if not repo.ui.verbose:
+ # silence internal shuffling chatter
+ repo.ui.pushbuffer()
+ repo.addchangegroup(gen, 'strip', 'bundle:' + chgrpfile, True)
+ if not repo.ui.verbose:
+ repo.ui.popbuffer()
+ f.close()
+ if not keeppartialbundle:
+ os.unlink(chgrpfile)
+
+ # remove undo files
+ for undofile in repo.undofiles():
+ try:
+ os.unlink(undofile)
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ ui.warn(_('error removing %s: %s\n') % (undofile, str(e)))
+
+ for m in updatebm:
+ bm[m] = repo[newbmtarget].node()
+ bookmarks.write(repo)
+ except: # re-raises
+ if backupfile:
+ ui.warn(_("strip failed, full bundle stored in '%s'\n")
+ % backupfile)
+ elif saveheads:
+ ui.warn(_("strip failed, partial bundle stored in '%s'\n")
+ % chgrpfile)
+ raise
+
+ if len(stripbranches) == 1 and len(newheadbranches) == 1 \
+ and stripbranches == newheadbranches:
+ repo.destroyed(newheadnodes)
+ else:
+ # Multiple branches involved in strip. Will allow branchcache to become
+ # invalid and later on rebuilt from scratch
+ repo.destroyed()
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
new file mode 100644
index 0000000..8ed1d82
--- /dev/null
+++ b/mercurial/revlog.py
@@ -0,0 +1,1312 @@
+# revlog.py - storage back-end for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Storage back-end for Mercurial.
+
+This provides efficient delta storage with O(1) retrieve and append
+and O(changes) merge between branches.
+"""
+
+# import stuff from node for others to import from revlog
+from node import bin, hex, nullid, nullrev
+from i18n import _
+import ancestor, mdiff, parsers, error, util, dagutil
+import struct, zlib, errno
+
+_pack = struct.pack
+_unpack = struct.unpack
+_compress = zlib.compress
+_decompress = zlib.decompress
+_sha = util.sha1
+
+# revlog header flags
+REVLOGV0 = 0
+REVLOGNG = 1
+REVLOGNGINLINEDATA = (1 << 16)
+REVLOGGENERALDELTA = (1 << 17)
+REVLOG_DEFAULT_FLAGS = REVLOGNGINLINEDATA
+REVLOG_DEFAULT_FORMAT = REVLOGNG
+REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS
+REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGGENERALDELTA
+
+# revlog index flags
+REVIDX_KNOWN_FLAGS = 0
+
+# max size of revlog with inline data
+_maxinline = 131072
+_chunksize = 1048576
+
+RevlogError = error.RevlogError
+LookupError = error.LookupError
+
+def getoffset(q):
+ return int(q >> 16)
+
+def gettype(q):
+ return int(q & 0xFFFF)
+
+def offset_type(offset, type):
+ return long(long(offset) << 16 | type)
+
+nullhash = _sha(nullid)
+
+def hash(text, p1, p2):
+ """generate a hash from the given text and its parent hashes
+
+ This hash combines both the current file contents and its history
+ in a manner that makes it easy to distinguish nodes with the same
+ content in the revision graph.
+ """
+ # As of now, if one of the parent node is null, p2 is null
+ if p2 == nullid:
+ # deep copy of a hash is faster than creating one
+ s = nullhash.copy()
+ s.update(p1)
+ else:
+ # none of the parent nodes are nullid
+ l = [p1, p2]
+ l.sort()
+ s = _sha(l[0])
+ s.update(l[1])
+ s.update(text)
+ return s.digest()
+
+def decompress(bin):
+ """ decompress the given input """
+ if not bin:
+ return bin
+ t = bin[0]
+ if t == '\0':
+ return bin
+ if t == 'x':
+ try:
+ return _decompress(bin)
+ except zlib.error, e:
+ raise RevlogError(_("revlog decompress error: %s") % str(e))
+ if t == 'u':
+ return bin[1:]
+ raise RevlogError(_("unknown compression type %r") % t)
+
+indexformatv0 = ">4l20s20s20s"
+v0shaoffset = 56
+
+class revlogoldio(object):
+ def __init__(self):
+ self.size = struct.calcsize(indexformatv0)
+
+ def parseindex(self, data, inline):
+ s = self.size
+ index = []
+ nodemap = {nullid: nullrev}
+ n = off = 0
+ l = len(data)
+ while off + s <= l:
+ cur = data[off:off + s]
+ off += s
+ e = _unpack(indexformatv0, cur)
+ # transform to revlogv1 format
+ e2 = (offset_type(e[0], 0), e[1], -1, e[2], e[3],
+ nodemap.get(e[4], nullrev), nodemap.get(e[5], nullrev), e[6])
+ index.append(e2)
+ nodemap[e[6]] = n
+ n += 1
+
+ # add the magic null revision at -1
+ index.append((0, 0, 0, -1, -1, -1, -1, nullid))
+
+ return index, nodemap, None
+
+ def packentry(self, entry, node, version, rev):
+ if gettype(entry[0]):
+ raise RevlogError(_("index entry flags need RevlogNG"))
+ e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4],
+ node(entry[5]), node(entry[6]), entry[7])
+ return _pack(indexformatv0, *e2)
+
+# index ng:
+# 6 bytes: offset
+# 2 bytes: flags
+# 4 bytes: compressed length
+# 4 bytes: uncompressed length
+# 4 bytes: base rev
+# 4 bytes: link rev
+# 4 bytes: parent 1 rev
+# 4 bytes: parent 2 rev
+# 32 bytes: nodeid
+indexformatng = ">Qiiiiii20s12x"
+ngshaoffset = 32
+versionformat = ">I"
+
+class revlogio(object):
+ def __init__(self):
+ self.size = struct.calcsize(indexformatng)
+
+ def parseindex(self, data, inline):
+ # call the C implementation to parse the index data
+ index, cache = parsers.parse_index2(data, inline)
+ return index, getattr(index, 'nodemap', None), cache
+
+ def packentry(self, entry, node, version, rev):
+ p = _pack(indexformatng, *entry)
+ if rev == 0:
+ p = _pack(versionformat, version) + p[4:]
+ return p
+
+class revlog(object):
+ """
+ the underlying revision storage object
+
+ A revlog consists of two parts, an index and the revision data.
+
+ The index is a file with a fixed record size containing
+ information on each revision, including its nodeid (hash), the
+ nodeids of its parents, the position and offset of its data within
+ the data file, and the revision it's based on. Finally, each entry
+ contains a linkrev entry that can serve as a pointer to external
+ data.
+
+ The revision data itself is a linear collection of data chunks.
+ Each chunk represents a revision and is usually represented as a
+ delta against the previous chunk. To bound lookup time, runs of
+ deltas are limited to about 2 times the length of the original
+ version data. This makes retrieval of a version proportional to
+ its size, or O(1) relative to the number of revisions.
+
+ Both pieces of the revlog are written to in an append-only
+ fashion, which means we never need to rewrite a file to insert or
+ remove data, and can use some simple techniques to avoid the need
+ for locking while reading.
+ """
+ def __init__(self, opener, indexfile):
+ """
+ create a revlog object
+
+ opener is a function that abstracts the file opening operation
+ and can be used to implement COW semantics or the like.
+ """
+ self.indexfile = indexfile
+ self.datafile = indexfile[:-2] + ".d"
+ self.opener = opener
+ self._cache = None
+ self._basecache = (0, 0)
+ self._chunkcache = (0, '')
+ self.index = []
+ self._pcache = {}
+ self._nodecache = {nullid: nullrev}
+ self._nodepos = None
+
+ v = REVLOG_DEFAULT_VERSION
+ opts = getattr(opener, 'options', None)
+ if opts is not None:
+ if 'revlogv1' in opts:
+ if 'generaldelta' in opts:
+ v |= REVLOGGENERALDELTA
+ else:
+ v = 0
+
+ i = ''
+ self._initempty = True
+ try:
+ f = self.opener(self.indexfile)
+ i = f.read()
+ f.close()
+ if len(i) > 0:
+ v = struct.unpack(versionformat, i[:4])[0]
+ self._initempty = False
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+
+ self.version = v
+ self._inline = v & REVLOGNGINLINEDATA
+ self._generaldelta = v & REVLOGGENERALDELTA
+ flags = v & ~0xFFFF
+ fmt = v & 0xFFFF
+ if fmt == REVLOGV0 and flags:
+ raise RevlogError(_("index %s unknown flags %#04x for format v0")
+ % (self.indexfile, flags >> 16))
+ elif fmt == REVLOGNG and flags & ~REVLOGNG_FLAGS:
+ raise RevlogError(_("index %s unknown flags %#04x for revlogng")
+ % (self.indexfile, flags >> 16))
+ elif fmt > REVLOGNG:
+ raise RevlogError(_("index %s unknown format %d")
+ % (self.indexfile, fmt))
+
+ self._io = revlogio()
+ if self.version == REVLOGV0:
+ self._io = revlogoldio()
+ try:
+ d = self._io.parseindex(i, self._inline)
+ except (ValueError, IndexError):
+ raise RevlogError(_("index %s is corrupted") % (self.indexfile))
+ self.index, nodemap, self._chunkcache = d
+ if nodemap is not None:
+ self.nodemap = self._nodecache = nodemap
+ if not self._chunkcache:
+ self._chunkclear()
+
+ def tip(self):
+ return self.node(len(self.index) - 2)
+ def __len__(self):
+ return len(self.index) - 1
+ def __iter__(self):
+ for i in xrange(len(self)):
+ yield i
+
+ @util.propertycache
+ def nodemap(self):
+ self.rev(self.node(0))
+ return self._nodecache
+
+ def hasnode(self, node):
+ try:
+ self.rev(node)
+ return True
+ except KeyError:
+ return False
+
+ def clearcaches(self):
+ try:
+ self._nodecache.clearcaches()
+ except AttributeError:
+ self._nodecache = {nullid: nullrev}
+ self._nodepos = None
+
+ def rev(self, node):
+ try:
+ return self._nodecache[node]
+ except RevlogError:
+ # parsers.c radix tree lookup failed
+ raise LookupError(node, self.indexfile, _('no node'))
+ except KeyError:
+ # pure python cache lookup failed
+ n = self._nodecache
+ i = self.index
+ p = self._nodepos
+ if p is None:
+ p = len(i) - 2
+ for r in xrange(p, -1, -1):
+ v = i[r][7]
+ n[v] = r
+ if v == node:
+ self._nodepos = r - 1
+ return r
+ raise LookupError(node, self.indexfile, _('no node'))
+
+ def node(self, rev):
+ return self.index[rev][7]
+ def linkrev(self, rev):
+ return self.index[rev][4]
+ def parents(self, node):
+ i = self.index
+ d = i[self.rev(node)]
+ return i[d[5]][7], i[d[6]][7] # map revisions to nodes inline
+ def parentrevs(self, rev):
+ return self.index[rev][5:7]
+ def start(self, rev):
+ return int(self.index[rev][0] >> 16)
+ def end(self, rev):
+ return self.start(rev) + self.length(rev)
+ def length(self, rev):
+ return self.index[rev][1]
+ def chainbase(self, rev):
+ index = self.index
+ base = index[rev][3]
+ while base != rev:
+ rev = base
+ base = index[rev][3]
+ return base
+ def flags(self, rev):
+ return self.index[rev][0] & 0xFFFF
+ def rawsize(self, rev):
+ """return the length of the uncompressed text for a given revision"""
+ l = self.index[rev][2]
+ if l >= 0:
+ return l
+
+ t = self.revision(self.node(rev))
+ return len(t)
+ size = rawsize
+
+ def ancestors(self, revs, stoprev=0):
+ """Generate the ancestors of 'revs' in reverse topological order.
+ Does not generate revs lower than stoprev.
+
+ Yield a sequence of revision numbers starting with the parents
+ of each revision in revs, i.e., each revision is *not* considered
+ an ancestor of itself. Results are in breadth-first order:
+ parents of each rev in revs, then parents of those, etc. Result
+ does not include the null revision."""
+ visit = util.deque(revs)
+ seen = set([nullrev])
+ while visit:
+ for parent in self.parentrevs(visit.popleft()):
+ if parent < stoprev:
+ continue
+ if parent not in seen:
+ visit.append(parent)
+ seen.add(parent)
+ yield parent
+
+ def incancestors(self, revs, stoprev=0):
+ """Identical to ancestors() except it also generates the
+ revisions, 'revs'"""
+ for rev in revs:
+ yield rev
+ for rev in self.ancestors(revs, stoprev):
+ yield rev
+
+ def descendants(self, revs):
+ """Generate the descendants of 'revs' in revision order.
+
+ Yield a sequence of revision numbers starting with a child of
+ some rev in revs, i.e., each revision is *not* considered a
+ descendant of itself. Results are ordered by revision number (a
+ topological sort)."""
+ first = min(revs)
+ if first == nullrev:
+ for i in self:
+ yield i
+ return
+
+ seen = set(revs)
+ for i in xrange(first + 1, len(self)):
+ for x in self.parentrevs(i):
+ if x != nullrev and x in seen:
+ seen.add(i)
+ yield i
+ break
+
+ def findcommonmissing(self, common=None, heads=None):
+ """Return a tuple of the ancestors of common and the ancestors of heads
+ that are not ancestors of common. In revset terminology, we return the
+ tuple:
+
+ ::common, (::heads) - (::common)
+
+ The list is sorted by revision number, meaning it is
+ topologically sorted.
+
+ 'heads' and 'common' are both lists of node IDs. If heads is
+ not supplied, uses all of the revlog's heads. If common is not
+ supplied, uses nullid."""
+ if common is None:
+ common = [nullid]
+ if heads is None:
+ heads = self.heads()
+
+ common = [self.rev(n) for n in common]
+ heads = [self.rev(n) for n in heads]
+
+ # we want the ancestors, but inclusive
+ has = set(self.ancestors(common))
+ has.add(nullrev)
+ has.update(common)
+
+ # take all ancestors from heads that aren't in has
+ missing = set()
+ visit = util.deque(r for r in heads if r not in has)
+ while visit:
+ r = visit.popleft()
+ if r in missing:
+ continue
+ else:
+ missing.add(r)
+ for p in self.parentrevs(r):
+ if p not in has:
+ visit.append(p)
+ missing = list(missing)
+ missing.sort()
+ return has, [self.node(r) for r in missing]
+
+ def findmissing(self, common=None, heads=None):
+ """Return the ancestors of heads that are not ancestors of common.
+
+ More specifically, return a list of nodes N such that every N
+ satisfies the following constraints:
+
+ 1. N is an ancestor of some node in 'heads'
+ 2. N is not an ancestor of any node in 'common'
+
+ The list is sorted by revision number, meaning it is
+ topologically sorted.
+
+ 'heads' and 'common' are both lists of node IDs. If heads is
+ not supplied, uses all of the revlog's heads. If common is not
+ supplied, uses nullid."""
+ _common, missing = self.findcommonmissing(common, heads)
+ return missing
+
+ def nodesbetween(self, roots=None, heads=None):
+ """Return a topological path from 'roots' to 'heads'.
+
+ Return a tuple (nodes, outroots, outheads) where 'nodes' is a
+ topologically sorted list of all nodes N that satisfy both of
+ these constraints:
+
+ 1. N is a descendant of some node in 'roots'
+ 2. N is an ancestor of some node in 'heads'
+
+ Every node is considered to be both a descendant and an ancestor
+ of itself, so every reachable node in 'roots' and 'heads' will be
+ included in 'nodes'.
+
+ 'outroots' is the list of reachable nodes in 'roots', i.e., the
+ subset of 'roots' that is returned in 'nodes'. Likewise,
+ 'outheads' is the subset of 'heads' that is also in 'nodes'.
+
+ 'roots' and 'heads' are both lists of node IDs. If 'roots' is
+ unspecified, uses nullid as the only root. If 'heads' is
+ unspecified, uses list of all of the revlog's heads."""
+ nonodes = ([], [], [])
+ if roots is not None:
+ roots = list(roots)
+ if not roots:
+ return nonodes
+ lowestrev = min([self.rev(n) for n in roots])
+ else:
+ roots = [nullid] # Everybody's a descendant of nullid
+ lowestrev = nullrev
+ if (lowestrev == nullrev) and (heads is None):
+ # We want _all_ the nodes!
+ return ([self.node(r) for r in self], [nullid], list(self.heads()))
+ if heads is None:
+ # All nodes are ancestors, so the latest ancestor is the last
+ # node.
+ highestrev = len(self) - 1
+ # Set ancestors to None to signal that every node is an ancestor.
+ ancestors = None
+ # Set heads to an empty dictionary for later discovery of heads
+ heads = {}
+ else:
+ heads = list(heads)
+ if not heads:
+ return nonodes
+ ancestors = set()
+ # Turn heads into a dictionary so we can remove 'fake' heads.
+ # Also, later we will be using it to filter out the heads we can't
+ # find from roots.
+ heads = dict.fromkeys(heads, False)
+ # Start at the top and keep marking parents until we're done.
+ nodestotag = set(heads)
+ # Remember where the top was so we can use it as a limit later.
+ highestrev = max([self.rev(n) for n in nodestotag])
+ while nodestotag:
+ # grab a node to tag
+ n = nodestotag.pop()
+ # Never tag nullid
+ if n == nullid:
+ continue
+ # A node's revision number represents its place in a
+ # topologically sorted list of nodes.
+ r = self.rev(n)
+ if r >= lowestrev:
+ if n not in ancestors:
+ # If we are possibly a descendant of one of the roots
+ # and we haven't already been marked as an ancestor
+ ancestors.add(n) # Mark as ancestor
+ # Add non-nullid parents to list of nodes to tag.
+ nodestotag.update([p for p in self.parents(n) if
+ p != nullid])
+ elif n in heads: # We've seen it before, is it a fake head?
+ # So it is, real heads should not be the ancestors of
+ # any other heads.
+ heads.pop(n)
+ if not ancestors:
+ return nonodes
+ # Now that we have our set of ancestors, we want to remove any
+ # roots that are not ancestors.
+
+ # If one of the roots was nullid, everything is included anyway.
+ if lowestrev > nullrev:
+ # But, since we weren't, let's recompute the lowest rev to not
+ # include roots that aren't ancestors.
+
+ # Filter out roots that aren't ancestors of heads
+ roots = [n for n in roots if n in ancestors]
+ # Recompute the lowest revision
+ if roots:
+ lowestrev = min([self.rev(n) for n in roots])
+ else:
+ # No more roots? Return empty list
+ return nonodes
+ else:
+ # We are descending from nullid, and don't need to care about
+ # any other roots.
+ lowestrev = nullrev
+ roots = [nullid]
+ # Transform our roots list into a set.
+ descendants = set(roots)
+ # Also, keep the original roots so we can filter out roots that aren't
+ # 'real' roots (i.e. are descended from other roots).
+ roots = descendants.copy()
+ # Our topologically sorted list of output nodes.
+ orderedout = []
+ # Don't start at nullid since we don't want nullid in our output list,
+ # and if nullid shows up in descedents, empty parents will look like
+ # they're descendants.
+ for r in xrange(max(lowestrev, 0), highestrev + 1):
+ n = self.node(r)
+ isdescendant = False
+ if lowestrev == nullrev: # Everybody is a descendant of nullid
+ isdescendant = True
+ elif n in descendants:
+ # n is already a descendant
+ isdescendant = True
+ # This check only needs to be done here because all the roots
+ # will start being marked is descendants before the loop.
+ if n in roots:
+ # If n was a root, check if it's a 'real' root.
+ p = tuple(self.parents(n))
+ # If any of its parents are descendants, it's not a root.
+ if (p[0] in descendants) or (p[1] in descendants):
+ roots.remove(n)
+ else:
+ p = tuple(self.parents(n))
+ # A node is a descendant if either of its parents are
+ # descendants. (We seeded the dependents list with the roots
+ # up there, remember?)
+ if (p[0] in descendants) or (p[1] in descendants):
+ descendants.add(n)
+ isdescendant = True
+ if isdescendant and ((ancestors is None) or (n in ancestors)):
+ # Only include nodes that are both descendants and ancestors.
+ orderedout.append(n)
+ if (ancestors is not None) and (n in heads):
+ # We're trying to figure out which heads are reachable
+ # from roots.
+ # Mark this head as having been reached
+ heads[n] = True
+ elif ancestors is None:
+ # Otherwise, we're trying to discover the heads.
+ # Assume this is a head because if it isn't, the next step
+ # will eventually remove it.
+ heads[n] = True
+ # But, obviously its parents aren't.
+ for p in self.parents(n):
+ heads.pop(p, None)
+ heads = [n for n, flag in heads.iteritems() if flag]
+ roots = list(roots)
+ assert orderedout
+ assert roots
+ assert heads
+ return (orderedout, roots, heads)
+
+ def headrevs(self):
+ try:
+ return self.index.headrevs()
+ except AttributeError:
+ pass
+ count = len(self)
+ if not count:
+ return [nullrev]
+ ishead = [1] * (count + 1)
+ index = self.index
+ for r in xrange(count):
+ e = index[r]
+ ishead[e[5]] = ishead[e[6]] = 0
+ return [r for r in xrange(count) if ishead[r]]
+
+ def heads(self, start=None, stop=None):
+ """return the list of all nodes that have no children
+
+ if start is specified, only heads that are descendants of
+ start will be returned
+ if stop is specified, it will consider all the revs from stop
+ as if they had no children
+ """
+ if start is None and stop is None:
+ if not len(self):
+ return [nullid]
+ return [self.node(r) for r in self.headrevs()]
+
+ if start is None:
+ start = nullid
+ if stop is None:
+ stop = []
+ stoprevs = set([self.rev(n) for n in stop])
+ startrev = self.rev(start)
+ reachable = set((startrev,))
+ heads = set((startrev,))
+
+ parentrevs = self.parentrevs
+ for r in xrange(startrev + 1, len(self)):
+ for p in parentrevs(r):
+ if p in reachable:
+ if r not in stoprevs:
+ reachable.add(r)
+ heads.add(r)
+ if p in heads and p not in stoprevs:
+ heads.remove(p)
+
+ return [self.node(r) for r in heads]
+
+ def children(self, node):
+ """find the children of a given node"""
+ c = []
+ p = self.rev(node)
+ for r in range(p + 1, len(self)):
+ prevs = [pr for pr in self.parentrevs(r) if pr != nullrev]
+ if prevs:
+ for pr in prevs:
+ if pr == p:
+ c.append(self.node(r))
+ elif p == nullrev:
+ c.append(self.node(r))
+ return c
+
+ def descendant(self, start, end):
+ if start == nullrev:
+ return True
+ for i in self.descendants([start]):
+ if i == end:
+ return True
+ elif i > end:
+ break
+ return False
+
+ def ancestor(self, a, b):
+ """calculate the least common ancestor of nodes a and b"""
+
+ # fast path, check if it is a descendant
+ a, b = self.rev(a), self.rev(b)
+ start, end = sorted((a, b))
+ if self.descendant(start, end):
+ return self.node(start)
+
+ def parents(rev):
+ return [p for p in self.parentrevs(rev) if p != nullrev]
+
+ c = ancestor.ancestor(a, b, parents)
+ if c is None:
+ return nullid
+
+ return self.node(c)
+
+ def _match(self, id):
+ if isinstance(id, int):
+ # rev
+ return self.node(id)
+ if len(id) == 20:
+ # possibly a binary node
+ # odds of a binary node being all hex in ASCII are 1 in 10**25
+ try:
+ node = id
+ self.rev(node) # quick search the index
+ return node
+ except LookupError:
+ pass # may be partial hex id
+ try:
+ # str(rev)
+ rev = int(id)
+ if str(rev) != id:
+ raise ValueError
+ if rev < 0:
+ rev = len(self) + rev
+ if rev < 0 or rev >= len(self):
+ raise ValueError
+ return self.node(rev)
+ except (ValueError, OverflowError):
+ pass
+ if len(id) == 40:
+ try:
+ # a full hex nodeid?
+ node = bin(id)
+ self.rev(node)
+ return node
+ except (TypeError, LookupError):
+ pass
+
+ def _partialmatch(self, id):
+ try:
+ return self.index.partialmatch(id)
+ except RevlogError:
+ # parsers.c radix tree lookup gave multiple matches
+ raise LookupError(id, self.indexfile, _("ambiguous identifier"))
+ except (AttributeError, ValueError):
+ # we are pure python, or key was too short to search radix tree
+ pass
+
+ if id in self._pcache:
+ return self._pcache[id]
+
+ if len(id) < 40:
+ try:
+ # hex(node)[:...]
+ l = len(id) // 2 # grab an even number of digits
+ prefix = bin(id[:l * 2])
+ nl = [e[7] for e in self.index if e[7].startswith(prefix)]
+ nl = [n for n in nl if hex(n).startswith(id)]
+ if len(nl) > 0:
+ if len(nl) == 1:
+ self._pcache[id] = nl[0]
+ return nl[0]
+ raise LookupError(id, self.indexfile,
+ _('ambiguous identifier'))
+ return None
+ except TypeError:
+ pass
+
+ def lookup(self, id):
+ """locate a node based on:
+ - revision number or str(revision number)
+ - nodeid or subset of hex nodeid
+ """
+ n = self._match(id)
+ if n is not None:
+ return n
+ n = self._partialmatch(id)
+ if n:
+ return n
+
+ raise LookupError(id, self.indexfile, _('no match found'))
+
+ def cmp(self, node, text):
+ """compare text with a given file revision
+
+ returns True if text is different than what is stored.
+ """
+ p1, p2 = self.parents(node)
+ return hash(text, p1, p2) != node
+
+ def _addchunk(self, offset, data):
+ o, d = self._chunkcache
+ # try to add to existing cache
+ if o + len(d) == offset and len(d) + len(data) < _chunksize:
+ self._chunkcache = o, d + data
+ else:
+ self._chunkcache = offset, data
+
+ def _loadchunk(self, offset, length):
+ if self._inline:
+ df = self.opener(self.indexfile)
+ else:
+ df = self.opener(self.datafile)
+
+ readahead = max(65536, length)
+ df.seek(offset)
+ d = df.read(readahead)
+ df.close()
+ self._addchunk(offset, d)
+ if readahead > length:
+ return util.buffer(d, 0, length)
+ return d
+
+ def _getchunk(self, offset, length):
+ o, d = self._chunkcache
+ l = len(d)
+
+ # is it in the cache?
+ cachestart = offset - o
+ cacheend = cachestart + length
+ if cachestart >= 0 and cacheend <= l:
+ if cachestart == 0 and cacheend == l:
+ return d # avoid a copy
+ return util.buffer(d, cachestart, cacheend - cachestart)
+
+ return self._loadchunk(offset, length)
+
+ def _chunkraw(self, startrev, endrev):
+ start = self.start(startrev)
+ length = self.end(endrev) - start
+ if self._inline:
+ start += (startrev + 1) * self._io.size
+ return self._getchunk(start, length)
+
+ def _chunk(self, rev):
+ return decompress(self._chunkraw(rev, rev))
+
+ def _chunkbase(self, rev):
+ return self._chunk(rev)
+
+ def _chunkclear(self):
+ self._chunkcache = (0, '')
+
+ def deltaparent(self, rev):
+ """return deltaparent of the given revision"""
+ base = self.index[rev][3]
+ if base == rev:
+ return nullrev
+ elif self._generaldelta:
+ return base
+ else:
+ return rev - 1
+
+ def revdiff(self, rev1, rev2):
+ """return or calculate a delta between two revisions"""
+ if rev1 != nullrev and self.deltaparent(rev2) == rev1:
+ return str(self._chunk(rev2))
+
+ return mdiff.textdiff(self.revision(rev1),
+ self.revision(rev2))
+
+ def revision(self, nodeorrev):
+ """return an uncompressed revision of a given node or revision
+ number.
+ """
+ if isinstance(nodeorrev, int):
+ rev = nodeorrev
+ node = self.node(rev)
+ else:
+ node = nodeorrev
+ rev = None
+
+ cachedrev = None
+ if node == nullid:
+ return ""
+ if self._cache:
+ if self._cache[0] == node:
+ return self._cache[2]
+ cachedrev = self._cache[1]
+
+ # look up what we need to read
+ text = None
+ if rev is None:
+ rev = self.rev(node)
+
+ # check rev flags
+ if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
+ raise RevlogError(_('incompatible revision flag %x') %
+ (self.flags(rev) & ~REVIDX_KNOWN_FLAGS))
+
+ # build delta chain
+ chain = []
+ index = self.index # for performance
+ generaldelta = self._generaldelta
+ iterrev = rev
+ e = index[iterrev]
+ while iterrev != e[3] and iterrev != cachedrev:
+ chain.append(iterrev)
+ if generaldelta:
+ iterrev = e[3]
+ else:
+ iterrev -= 1
+ e = index[iterrev]
+ chain.reverse()
+ base = iterrev
+
+ if iterrev == cachedrev:
+ # cache hit
+ text = self._cache[2]
+
+ # drop cache to save memory
+ self._cache = None
+
+ self._chunkraw(base, rev)
+ if text is None:
+ text = str(self._chunkbase(base))
+
+ bins = [self._chunk(r) for r in chain]
+ text = mdiff.patches(text, bins)
+
+ text = self._checkhash(text, node, rev)
+
+ self._cache = (node, rev, text)
+ return text
+
+ def _checkhash(self, text, node, rev):
+ p1, p2 = self.parents(node)
+ if node != hash(text, p1, p2):
+ raise RevlogError(_("integrity check failed on %s:%d")
+ % (self.indexfile, rev))
+ return text
+
+ def checkinlinesize(self, tr, fp=None):
+ if not self._inline or (self.start(-2) + self.length(-2)) < _maxinline:
+ return
+
+ trinfo = tr.find(self.indexfile)
+ if trinfo is None:
+ raise RevlogError(_("%s not found in the transaction")
+ % self.indexfile)
+
+ trindex = trinfo[2]
+ dataoff = self.start(trindex)
+
+ tr.add(self.datafile, dataoff)
+
+ if fp:
+ fp.flush()
+ fp.close()
+
+ df = self.opener(self.datafile, 'w')
+ try:
+ for r in self:
+ df.write(self._chunkraw(r, r))
+ finally:
+ df.close()
+
+ fp = self.opener(self.indexfile, 'w', atomictemp=True)
+ self.version &= ~(REVLOGNGINLINEDATA)
+ self._inline = False
+ for i in self:
+ e = self._io.packentry(self.index[i], self.node, self.version, i)
+ fp.write(e)
+
+ # if we don't call close, the temp file will never replace the
+ # real index
+ fp.close()
+
+ tr.replace(self.indexfile, trindex * self._io.size)
+ self._chunkclear()
+
+ def addrevision(self, text, transaction, link, p1, p2, cachedelta=None):
+ """add a revision to the log
+
+ text - the revision data to add
+ transaction - the transaction object used for rollback
+ link - the linkrev data to add
+ p1, p2 - the parent nodeids of the revision
+ cachedelta - an optional precomputed delta
+ """
+ node = hash(text, p1, p2)
+ if node in self.nodemap:
+ return node
+
+ dfh = None
+ if not self._inline:
+ dfh = self.opener(self.datafile, "a")
+ ifh = self.opener(self.indexfile, "a+")
+ try:
+ return self._addrevision(node, text, transaction, link, p1, p2,
+ cachedelta, ifh, dfh)
+ finally:
+ if dfh:
+ dfh.close()
+ ifh.close()
+
+ def compress(self, text):
+ """ generate a possibly-compressed representation of text """
+ if not text:
+ return ("", text)
+ l = len(text)
+ bin = None
+ if l < 44:
+ pass
+ elif l > 1000000:
+ # zlib makes an internal copy, thus doubling memory usage for
+ # large files, so lets do this in pieces
+ z = zlib.compressobj()
+ p = []
+ pos = 0
+ while pos < l:
+ pos2 = pos + 2**20
+ p.append(z.compress(text[pos:pos2]))
+ pos = pos2
+ p.append(z.flush())
+ if sum(map(len, p)) < l:
+ bin = "".join(p)
+ else:
+ bin = _compress(text)
+ if bin is None or len(bin) > l:
+ if text[0] == '\0':
+ return ("", text)
+ return ('u', text)
+ return ("", bin)
+
+ def _addrevision(self, node, text, transaction, link, p1, p2,
+ cachedelta, ifh, dfh):
+ """internal function to add revisions to the log
+
+ see addrevision for argument descriptions.
+ invariants:
+ - text is optional (can be None); if not set, cachedelta must be set.
+ if both are set, they must correspond to eachother.
+ """
+ btext = [text]
+ def buildtext():
+ if btext[0] is not None:
+ return btext[0]
+ # flush any pending writes here so we can read it in revision
+ if dfh:
+ dfh.flush()
+ ifh.flush()
+ basetext = self.revision(self.node(cachedelta[0]))
+ btext[0] = mdiff.patch(basetext, cachedelta[1])
+ chk = hash(btext[0], p1, p2)
+ if chk != node:
+ raise RevlogError(_("consistency error in delta"))
+ return btext[0]
+
+ def builddelta(rev):
+ # can we use the cached delta?
+ if cachedelta and cachedelta[0] == rev:
+ delta = cachedelta[1]
+ else:
+ t = buildtext()
+ ptext = self.revision(self.node(rev))
+ delta = mdiff.textdiff(ptext, t)
+ data = self.compress(delta)
+ l = len(data[1]) + len(data[0])
+ if basecache[0] == rev:
+ chainbase = basecache[1]
+ else:
+ chainbase = self.chainbase(rev)
+ dist = l + offset - self.start(chainbase)
+ if self._generaldelta:
+ base = rev
+ else:
+ base = chainbase
+ return dist, l, data, base, chainbase
+
+ curr = len(self)
+ prev = curr - 1
+ base = chainbase = curr
+ offset = self.end(prev)
+ flags = 0
+ d = None
+ basecache = self._basecache
+ p1r, p2r = self.rev(p1), self.rev(p2)
+
+ # should we try to build a delta?
+ if prev != nullrev:
+ if self._generaldelta:
+ if p1r >= basecache[1]:
+ d = builddelta(p1r)
+ elif p2r >= basecache[1]:
+ d = builddelta(p2r)
+ else:
+ d = builddelta(prev)
+ else:
+ d = builddelta(prev)
+ dist, l, data, base, chainbase = d
+
+ # full versions are inserted when the needed deltas
+ # become comparable to the uncompressed text
+ if text is None:
+ textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]),
+ cachedelta[1])
+ else:
+ textlen = len(text)
+ if d is None or dist > textlen * 2:
+ text = buildtext()
+ data = self.compress(text)
+ l = len(data[1]) + len(data[0])
+ base = chainbase = curr
+
+ e = (offset_type(offset, flags), l, textlen,
+ base, link, p1r, p2r, node)
+ self.index.insert(-1, e)
+ self.nodemap[node] = curr
+
+ entry = self._io.packentry(e, self.node, self.version, curr)
+ if not self._inline:
+ transaction.add(self.datafile, offset)
+ transaction.add(self.indexfile, curr * len(entry))
+ if data[0]:
+ dfh.write(data[0])
+ dfh.write(data[1])
+ dfh.flush()
+ ifh.write(entry)
+ else:
+ offset += curr * self._io.size
+ transaction.add(self.indexfile, offset, curr)
+ ifh.write(entry)
+ ifh.write(data[0])
+ ifh.write(data[1])
+ self.checkinlinesize(transaction, ifh)
+
+ if type(text) == str: # only accept immutable objects
+ self._cache = (node, curr, text)
+ self._basecache = (curr, chainbase)
+ return node
+
+ def group(self, nodelist, bundler, reorder=None):
+ """Calculate a delta group, yielding a sequence of changegroup chunks
+ (strings).
+
+ Given a list of changeset revs, return a set of deltas and
+ metadata corresponding to nodes. The first delta is
+ first parent(nodelist[0]) -> nodelist[0], the receiver is
+ guaranteed to have this parent as it has all history before
+ these changesets. In the case firstparent is nullrev the
+ changegroup starts with a full revision.
+ """
+
+ # if we don't have any revisions touched by these changesets, bail
+ if len(nodelist) == 0:
+ yield bundler.close()
+ return
+
+ # for generaldelta revlogs, we linearize the revs; this will both be
+ # much quicker and generate a much smaller bundle
+ if (self._generaldelta and reorder is not False) or reorder:
+ dag = dagutil.revlogdag(self)
+ revs = set(self.rev(n) for n in nodelist)
+ revs = dag.linearize(revs)
+ else:
+ revs = sorted([self.rev(n) for n in nodelist])
+
+ # add the parent of the first rev
+ p = self.parentrevs(revs[0])[0]
+ revs.insert(0, p)
+
+ # build deltas
+ for r in xrange(len(revs) - 1):
+ prev, curr = revs[r], revs[r + 1]
+ for c in bundler.revchunk(self, curr, prev):
+ yield c
+
+ yield bundler.close()
+
+ def addgroup(self, bundle, linkmapper, transaction):
+ """
+ add a delta group
+
+ given a set of deltas, add them to the revision log. the
+ first delta is against its parent, which should be in our
+ log, the rest are against the previous delta.
+ """
+
+ # track the base of the current delta log
+ content = []
+ node = None
+
+ r = len(self)
+ end = 0
+ if r:
+ end = self.end(r - 1)
+ ifh = self.opener(self.indexfile, "a+")
+ isize = r * self._io.size
+ if self._inline:
+ transaction.add(self.indexfile, end + isize, r)
+ dfh = None
+ else:
+ transaction.add(self.indexfile, isize, r)
+ transaction.add(self.datafile, end)
+ dfh = self.opener(self.datafile, "a")
+
+ try:
+ # loop through our set of deltas
+ chain = None
+ while True:
+ chunkdata = bundle.deltachunk(chain)
+ if not chunkdata:
+ break
+ node = chunkdata['node']
+ p1 = chunkdata['p1']
+ p2 = chunkdata['p2']
+ cs = chunkdata['cs']
+ deltabase = chunkdata['deltabase']
+ delta = chunkdata['delta']
+
+ content.append(node)
+
+ link = linkmapper(cs)
+ if node in self.nodemap:
+ # this can happen if two branches make the same change
+ chain = node
+ continue
+
+ for p in (p1, p2):
+ if p not in self.nodemap:
+ raise LookupError(p, self.indexfile,
+ _('unknown parent'))
+
+ if deltabase not in self.nodemap:
+ raise LookupError(deltabase, self.indexfile,
+ _('unknown delta base'))
+
+ baserev = self.rev(deltabase)
+ chain = self._addrevision(node, None, transaction, link,
+ p1, p2, (baserev, delta), ifh, dfh)
+ if not dfh and not self._inline:
+ # addrevision switched from inline to conventional
+ # reopen the index
+ ifh.close()
+ dfh = self.opener(self.datafile, "a")
+ ifh = self.opener(self.indexfile, "a")
+ finally:
+ if dfh:
+ dfh.close()
+ ifh.close()
+
+ return content
+
+ def strip(self, minlink, transaction):
+ """truncate the revlog on the first revision with a linkrev >= minlink
+
+ This function is called when we're stripping revision minlink and
+ its descendants from the repository.
+
+ We have to remove all revisions with linkrev >= minlink, because
+ the equivalent changelog revisions will be renumbered after the
+ strip.
+
+ So we truncate the revlog on the first of these revisions, and
+ trust that the caller has saved the revisions that shouldn't be
+ removed and that it'll re-add them after this truncation.
+ """
+ if len(self) == 0:
+ return
+
+ for rev in self:
+ if self.index[rev][4] >= minlink:
+ break
+ else:
+ return
+
+ # first truncate the files on disk
+ end = self.start(rev)
+ if not self._inline:
+ transaction.add(self.datafile, end)
+ end = rev * self._io.size
+ else:
+ end += rev * self._io.size
+
+ transaction.add(self.indexfile, end)
+
+ # then reset internal state in memory to forget those revisions
+ self._cache = None
+ self._chunkclear()
+ for x in xrange(rev, len(self)):
+ del self.nodemap[self.node(x)]
+
+ del self.index[rev:-1]
+
+ def checksize(self):
+ expected = 0
+ if len(self):
+ expected = max(0, self.end(len(self) - 1))
+
+ try:
+ f = self.opener(self.datafile)
+ f.seek(0, 2)
+ actual = f.tell()
+ f.close()
+ dd = actual - expected
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ dd = 0
+
+ try:
+ f = self.opener(self.indexfile)
+ f.seek(0, 2)
+ actual = f.tell()
+ f.close()
+ s = self._io.size
+ i = max(0, actual // s)
+ di = actual - (i * s)
+ if self._inline:
+ databytes = 0
+ for r in self:
+ databytes += max(0, self.length(r))
+ dd = 0
+ di = actual - len(self) * s - databytes
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ di = 0
+
+ return (dd, di)
+
+ def files(self):
+ res = [self.indexfile]
+ if not self._inline:
+ res.append(self.datafile)
+ return res
diff --git a/mercurial/revset.py b/mercurial/revset.py
new file mode 100644
index 0000000..a7e9d07
--- /dev/null
+++ b/mercurial/revset.py
@@ -0,0 +1,1856 @@
+# revset.py - revision set queries for mercurial
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import re
+import parser, util, error, discovery, hbisect, phases
+import node
+import bookmarks as bookmarksmod
+import match as matchmod
+from i18n import _
+import encoding
+
+def _revancestors(repo, revs, followfirst):
+ """Like revlog.ancestors(), but supports followfirst."""
+ cut = followfirst and 1 or None
+ cl = repo.changelog
+ visit = util.deque(revs)
+ seen = set([node.nullrev])
+ while visit:
+ for parent in cl.parentrevs(visit.popleft())[:cut]:
+ if parent not in seen:
+ visit.append(parent)
+ seen.add(parent)
+ yield parent
+
+def _revdescendants(repo, revs, followfirst):
+ """Like revlog.descendants() but supports followfirst."""
+ cut = followfirst and 1 or None
+ cl = repo.changelog
+ first = min(revs)
+ nullrev = node.nullrev
+ if first == nullrev:
+ # Are there nodes with a null first parent and a non-null
+ # second one? Maybe. Do we care? Probably not.
+ for i in cl:
+ yield i
+ return
+
+ seen = set(revs)
+ for i in xrange(first + 1, len(cl)):
+ for x in cl.parentrevs(i)[:cut]:
+ if x != nullrev and x in seen:
+ seen.add(i)
+ yield i
+ break
+
+def _revsbetween(repo, roots, heads):
+ """Return all paths between roots and heads, inclusive of both endpoint
+ sets."""
+ if not roots:
+ return []
+ parentrevs = repo.changelog.parentrevs
+ visit = heads[:]
+ reachable = set()
+ seen = {}
+ minroot = min(roots)
+ roots = set(roots)
+ # open-code the post-order traversal due to the tiny size of
+ # sys.getrecursionlimit()
+ while visit:
+ rev = visit.pop()
+ if rev in roots:
+ reachable.add(rev)
+ parents = parentrevs(rev)
+ seen[rev] = parents
+ for parent in parents:
+ if parent >= minroot and parent not in seen:
+ visit.append(parent)
+ if not reachable:
+ return []
+ for rev in sorted(seen):
+ for parent in seen[rev]:
+ if parent in reachable:
+ reachable.add(rev)
+ return sorted(reachable)
+
+elements = {
+ "(": (20, ("group", 1, ")"), ("func", 1, ")")),
+ "~": (18, None, ("ancestor", 18)),
+ "^": (18, None, ("parent", 18), ("parentpost", 18)),
+ "-": (5, ("negate", 19), ("minus", 5)),
+ "::": (17, ("dagrangepre", 17), ("dagrange", 17),
+ ("dagrangepost", 17)),
+ "..": (17, ("dagrangepre", 17), ("dagrange", 17),
+ ("dagrangepost", 17)),
+ ":": (15, ("rangepre", 15), ("range", 15), ("rangepost", 15)),
+ "not": (10, ("not", 10)),
+ "!": (10, ("not", 10)),
+ "and": (5, None, ("and", 5)),
+ "&": (5, None, ("and", 5)),
+ "or": (4, None, ("or", 4)),
+ "|": (4, None, ("or", 4)),
+ "+": (4, None, ("or", 4)),
+ ",": (2, None, ("list", 2)),
+ ")": (0, None, None),
+ "symbol": (0, ("symbol",), None),
+ "string": (0, ("string",), None),
+ "end": (0, None, None),
+}
+
+keywords = set(['and', 'or', 'not'])
+
+def tokenize(program):
+ pos, l = 0, len(program)
+ while pos < l:
+ c = program[pos]
+ if c.isspace(): # skip inter-token whitespace
+ pass
+ elif c == ':' and program[pos:pos + 2] == '::': # look ahead carefully
+ yield ('::', None, pos)
+ pos += 1 # skip ahead
+ elif c == '.' and program[pos:pos + 2] == '..': # look ahead carefully
+ yield ('..', None, pos)
+ pos += 1 # skip ahead
+ elif c in "():,-|&+!~^": # handle simple operators
+ yield (c, None, pos)
+ elif (c in '"\'' or c == 'r' and
+ program[pos:pos + 2] in ("r'", 'r"')): # handle quoted strings
+ if c == 'r':
+ pos += 1
+ c = program[pos]
+ decode = lambda x: x
+ else:
+ decode = lambda x: x.decode('string-escape')
+ pos += 1
+ s = pos
+ while pos < l: # find closing quote
+ d = program[pos]
+ if d == '\\': # skip over escaped characters
+ pos += 2
+ continue
+ if d == c:
+ yield ('string', decode(program[s:pos]), s)
+ break
+ pos += 1
+ else:
+ raise error.ParseError(_("unterminated string"), s)
+ # gather up a symbol/keyword
+ elif c.isalnum() or c in '._' or ord(c) > 127:
+ s = pos
+ pos += 1
+ while pos < l: # find end of symbol
+ d = program[pos]
+ if not (d.isalnum() or d in "._/" or ord(d) > 127):
+ break
+ if d == '.' and program[pos - 1] == '.': # special case for ..
+ pos -= 1
+ break
+ pos += 1
+ sym = program[s:pos]
+ if sym in keywords: # operator keywords
+ yield (sym, None, s)
+ else:
+ yield ('symbol', sym, s)
+ pos -= 1
+ else:
+ raise error.ParseError(_("syntax error"), pos)
+ pos += 1
+ yield ('end', None, pos)
+
+# helpers
+
+def getstring(x, err):
+ if x and (x[0] == 'string' or x[0] == 'symbol'):
+ return x[1]
+ raise error.ParseError(err)
+
+def getlist(x):
+ if not x:
+ return []
+ if x[0] == 'list':
+ return getlist(x[1]) + [x[2]]
+ return [x]
+
+def getargs(x, min, max, err):
+ l = getlist(x)
+ if len(l) < min or (max >= 0 and len(l) > max):
+ raise error.ParseError(err)
+ return l
+
+def getset(repo, subset, x):
+ if not x:
+ raise error.ParseError(_("missing argument"))
+ return methods[x[0]](repo, subset, *x[1:])
+
+def _getrevsource(repo, r):
+ extra = repo[r].extra()
+ for label in ('source', 'transplant_source', 'rebase_source'):
+ if label in extra:
+ try:
+ return repo[extra[label]].rev()
+ except error.RepoLookupError:
+ pass
+ return None
+
+# operator methods
+
+def stringset(repo, subset, x):
+ x = repo[x].rev()
+ if x == -1 and len(subset) == len(repo):
+ return [-1]
+ if len(subset) == len(repo) or x in subset:
+ return [x]
+ return []
+
+def symbolset(repo, subset, x):
+ if x in symbols:
+ raise error.ParseError(_("can't use %s here") % x)
+ return stringset(repo, subset, x)
+
+def rangeset(repo, subset, x, y):
+ m = getset(repo, subset, x)
+ if not m:
+ m = getset(repo, range(len(repo)), x)
+
+ n = getset(repo, subset, y)
+ if not n:
+ n = getset(repo, range(len(repo)), y)
+
+ if not m or not n:
+ return []
+ m, n = m[0], n[-1]
+
+ if m < n:
+ r = range(m, n + 1)
+ else:
+ r = range(m, n - 1, -1)
+ s = set(subset)
+ return [x for x in r if x in s]
+
+def dagrange(repo, subset, x, y):
+ if subset:
+ r = range(len(repo))
+ xs = _revsbetween(repo, getset(repo, r, x), getset(repo, r, y))
+ s = set(subset)
+ return [r for r in xs if r in s]
+ return []
+
+def andset(repo, subset, x, y):
+ return getset(repo, getset(repo, subset, x), y)
+
+def orset(repo, subset, x, y):
+ xl = getset(repo, subset, x)
+ s = set(xl)
+ yl = getset(repo, [r for r in subset if r not in s], y)
+ return xl + yl
+
+def notset(repo, subset, x):
+ s = set(getset(repo, subset, x))
+ return [r for r in subset if r not in s]
+
+def listset(repo, subset, a, b):
+ raise error.ParseError(_("can't use a list in this context"))
+
+def func(repo, subset, a, b):
+ if a[0] == 'symbol' and a[1] in symbols:
+ return symbols[a[1]](repo, subset, b)
+ raise error.ParseError(_("not a function: %s") % a[1])
+
+# functions
+
+def adds(repo, subset, x):
+ """``adds(pattern)``
+ Changesets that add a file matching pattern.
+ """
+ # i18n: "adds" is a keyword
+ pat = getstring(x, _("adds requires a pattern"))
+ return checkstatus(repo, subset, pat, 1)
+
+def ancestor(repo, subset, x):
+ """``ancestor(single, single)``
+ Greatest common ancestor of the two changesets.
+ """
+ # i18n: "ancestor" is a keyword
+ l = getargs(x, 2, 2, _("ancestor requires two arguments"))
+ r = range(len(repo))
+ a = getset(repo, r, l[0])
+ b = getset(repo, r, l[1])
+ if len(a) != 1 or len(b) != 1:
+ # i18n: "ancestor" is a keyword
+ raise error.ParseError(_("ancestor arguments must be single revisions"))
+ an = [repo[a[0]].ancestor(repo[b[0]]).rev()]
+
+ return [r for r in an if r in subset]
+
+def _ancestors(repo, subset, x, followfirst=False):
+ args = getset(repo, range(len(repo)), x)
+ if not args:
+ return []
+ s = set(_revancestors(repo, args, followfirst)) | set(args)
+ return [r for r in subset if r in s]
+
+def ancestors(repo, subset, x):
+ """``ancestors(set)``
+ Changesets that are ancestors of a changeset in set.
+ """
+ return _ancestors(repo, subset, x)
+
+def _firstancestors(repo, subset, x):
+ # ``_firstancestors(set)``
+ # Like ``ancestors(set)`` but follows only the first parents.
+ return _ancestors(repo, subset, x, followfirst=True)
+
+def ancestorspec(repo, subset, x, n):
+ """``set~n``
+ Changesets that are the Nth ancestor (first parents only) of a changeset
+ in set.
+ """
+ try:
+ n = int(n[1])
+ except (TypeError, ValueError):
+ raise error.ParseError(_("~ expects a number"))
+ ps = set()
+ cl = repo.changelog
+ for r in getset(repo, subset, x):
+ for i in range(n):
+ r = cl.parentrevs(r)[0]
+ ps.add(r)
+ return [r for r in subset if r in ps]
+
+def author(repo, subset, x):
+ """``author(string)``
+ Alias for ``user(string)``.
+ """
+ # i18n: "author" is a keyword
+ n = encoding.lower(getstring(x, _("author requires a string")))
+ kind, pattern, matcher = _substringmatcher(n)
+ return [r for r in subset if matcher(encoding.lower(repo[r].user()))]
+
+def bisect(repo, subset, x):
+ """``bisect(string)``
+ Changesets marked in the specified bisect status:
+
+ - ``good``, ``bad``, ``skip``: csets explicitly marked as good/bad/skip
+ - ``goods``, ``bads`` : csets topologicaly good/bad
+ - ``range`` : csets taking part in the bisection
+ - ``pruned`` : csets that are goods, bads or skipped
+ - ``untested`` : csets whose fate is yet unknown
+ - ``ignored`` : csets ignored due to DAG topology
+ - ``current`` : the cset currently being bisected
+ """
+ # i18n: "bisect" is a keyword
+ status = getstring(x, _("bisect requires a string")).lower()
+ state = set(hbisect.get(repo, status))
+ return [r for r in subset if r in state]
+
+# Backward-compatibility
+# - no help entry so that we do not advertise it any more
+def bisected(repo, subset, x):
+ return bisect(repo, subset, x)
+
+def bookmark(repo, subset, x):
+ """``bookmark([name])``
+ The named bookmark or all bookmarks.
+
+ If `name` starts with `re:`, the remainder of the name is treated as
+ a regular expression. To match a bookmark that actually starts with `re:`,
+ use the prefix `literal:`.
+ """
+ # i18n: "bookmark" is a keyword
+ args = getargs(x, 0, 1, _('bookmark takes one or no arguments'))
+ if args:
+ bm = getstring(args[0],
+ # i18n: "bookmark" is a keyword
+ _('the argument to bookmark must be a string'))
+ kind, pattern, matcher = _stringmatcher(bm)
+ if kind == 'literal':
+ bmrev = bookmarksmod.listbookmarks(repo).get(bm, None)
+ if not bmrev:
+ raise util.Abort(_("bookmark '%s' does not exist") % bm)
+ bmrev = repo[bmrev].rev()
+ return [r for r in subset if r == bmrev]
+ else:
+ matchrevs = set()
+ for name, bmrev in bookmarksmod.listbookmarks(repo).iteritems():
+ if matcher(name):
+ matchrevs.add(bmrev)
+ if not matchrevs:
+ raise util.Abort(_("no bookmarks exist that match '%s'")
+ % pattern)
+ bmrevs = set()
+ for bmrev in matchrevs:
+ bmrevs.add(repo[bmrev].rev())
+ return [r for r in subset if r in bmrevs]
+
+ bms = set([repo[r].rev()
+ for r in bookmarksmod.listbookmarks(repo).values()])
+ return [r for r in subset if r in bms]
+
+def branch(repo, subset, x):
+ """``branch(string or set)``
+ All changesets belonging to the given branch or the branches of the given
+ changesets.
+
+ If `string` starts with `re:`, the remainder of the name is treated as
+ a regular expression. To match a branch that actually starts with `re:`,
+ use the prefix `literal:`.
+ """
+ try:
+ b = getstring(x, '')
+ except error.ParseError:
+ # not a string, but another revspec, e.g. tip()
+ pass
+ else:
+ kind, pattern, matcher = _stringmatcher(b)
+ if kind == 'literal':
+ # note: falls through to the revspec case if no branch with
+ # this name exists
+ if pattern in repo.branchmap():
+ return [r for r in subset if matcher(repo[r].branch())]
+ else:
+ return [r for r in subset if matcher(repo[r].branch())]
+
+ s = getset(repo, range(len(repo)), x)
+ b = set()
+ for r in s:
+ b.add(repo[r].branch())
+ s = set(s)
+ return [r for r in subset if r in s or repo[r].branch() in b]
+
+def checkstatus(repo, subset, pat, field):
+ m = None
+ s = []
+ hasset = matchmod.patkind(pat) == 'set'
+ fname = None
+ for r in subset:
+ c = repo[r]
+ if not m or hasset:
+ m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
+ if not m.anypats() and len(m.files()) == 1:
+ fname = m.files()[0]
+ if fname is not None:
+ if fname not in c.files():
+ continue
+ else:
+ for f in c.files():
+ if m(f):
+ break
+ else:
+ continue
+ files = repo.status(c.p1().node(), c.node())[field]
+ if fname is not None:
+ if fname in files:
+ s.append(r)
+ else:
+ for f in files:
+ if m(f):
+ s.append(r)
+ break
+ return s
+
+def _children(repo, narrow, parentset):
+ cs = set()
+ pr = repo.changelog.parentrevs
+ for r in narrow:
+ for p in pr(r):
+ if p in parentset:
+ cs.add(r)
+ return cs
+
+def children(repo, subset, x):
+ """``children(set)``
+ Child changesets of changesets in set.
+ """
+ s = set(getset(repo, range(len(repo)), x))
+ cs = _children(repo, subset, s)
+ return [r for r in subset if r in cs]
+
+def closed(repo, subset, x):
+ """``closed()``
+ Changeset is closed.
+ """
+ # i18n: "closed" is a keyword
+ getargs(x, 0, 0, _("closed takes no arguments"))
+ return [r for r in subset if repo[r].closesbranch()]
+
+def contains(repo, subset, x):
+ """``contains(pattern)``
+ Revision contains a file matching pattern. See :hg:`help patterns`
+ for information about file patterns.
+ """
+ # i18n: "contains" is a keyword
+ pat = getstring(x, _("contains requires a pattern"))
+ m = None
+ s = []
+ if not matchmod.patkind(pat):
+ for r in subset:
+ if pat in repo[r]:
+ s.append(r)
+ else:
+ for r in subset:
+ c = repo[r]
+ if not m or matchmod.patkind(pat) == 'set':
+ m = matchmod.match(repo.root, repo.getcwd(), [pat], ctx=c)
+ for f in c.manifest():
+ if m(f):
+ s.append(r)
+ break
+ return s
+
+def converted(repo, subset, x):
+ """``converted([id])``
+ Changesets converted from the given identifier in the old repository if
+ present, or all converted changesets if no identifier is specified.
+ """
+
+ # There is exactly no chance of resolving the revision, so do a simple
+ # string compare and hope for the best
+
+ rev = None
+ # i18n: "converted" is a keyword
+ l = getargs(x, 0, 1, _('converted takes one or no arguments'))
+ if l:
+ # i18n: "converted" is a keyword
+ rev = getstring(l[0], _('converted requires a revision'))
+
+ def _matchvalue(r):
+ source = repo[r].extra().get('convert_revision', None)
+ return source is not None and (rev is None or source.startswith(rev))
+
+ return [r for r in subset if _matchvalue(r)]
+
+def date(repo, subset, x):
+ """``date(interval)``
+ Changesets within the interval, see :hg:`help dates`.
+ """
+ # i18n: "date" is a keyword
+ ds = getstring(x, _("date requires a string"))
+ dm = util.matchdate(ds)
+ return [r for r in subset if dm(repo[r].date()[0])]
+
+def desc(repo, subset, x):
+ """``desc(string)``
+ Search commit message for string. The match is case-insensitive.
+ """
+ # i18n: "desc" is a keyword
+ ds = encoding.lower(getstring(x, _("desc requires a string")))
+ l = []
+ for r in subset:
+ c = repo[r]
+ if ds in encoding.lower(c.description()):
+ l.append(r)
+ return l
+
+def _descendants(repo, subset, x, followfirst=False):
+ args = getset(repo, range(len(repo)), x)
+ if not args:
+ return []
+ s = set(_revdescendants(repo, args, followfirst)) | set(args)
+ return [r for r in subset if r in s]
+
+def descendants(repo, subset, x):
+ """``descendants(set)``
+ Changesets which are descendants of changesets in set.
+ """
+ return _descendants(repo, subset, x)
+
+def _firstdescendants(repo, subset, x):
+ # ``_firstdescendants(set)``
+ # Like ``descendants(set)`` but follows only the first parents.
+ return _descendants(repo, subset, x, followfirst=True)
+
+def destination(repo, subset, x):
+ """``destination([set])``
+ Changesets that were created by a graft, transplant or rebase operation,
+ with the given revisions specified as the source. Omitting the optional set
+ is the same as passing all().
+ """
+ if x is not None:
+ args = set(getset(repo, range(len(repo)), x))
+ else:
+ args = set(getall(repo, range(len(repo)), x))
+
+ dests = set()
+
+ # subset contains all of the possible destinations that can be returned, so
+ # iterate over them and see if their source(s) were provided in the args.
+ # Even if the immediate src of r is not in the args, src's source (or
+ # further back) may be. Scanning back further than the immediate src allows
+ # transitive transplants and rebases to yield the same results as transitive
+ # grafts.
+ for r in subset:
+ src = _getrevsource(repo, r)
+ lineage = None
+
+ while src is not None:
+ if lineage is None:
+ lineage = list()
+
+ lineage.append(r)
+
+ # The visited lineage is a match if the current source is in the arg
+ # set. Since every candidate dest is visited by way of iterating
+ # subset, any dests futher back in the lineage will be tested by a
+ # different iteration over subset. Likewise, if the src was already
+ # selected, the current lineage can be selected without going back
+ # further.
+ if src in args or src in dests:
+ dests.update(lineage)
+ break
+
+ r = src
+ src = _getrevsource(repo, r)
+
+ return [r for r in subset if r in dests]
+
+def draft(repo, subset, x):
+ """``draft()``
+ Changeset in draft phase."""
+ # i18n: "draft" is a keyword
+ getargs(x, 0, 0, _("draft takes no arguments"))
+ pc = repo._phasecache
+ return [r for r in subset if pc.phase(repo, r) == phases.draft]
+
+def extinct(repo, subset, x):
+ """``extinct()``
+ Obsolete changesets with obsolete descendants only.
+ """
+ # i18n: "extinct" is a keyword
+ getargs(x, 0, 0, _("extinct takes no arguments"))
+ extinctset = set(repo.revs('(obsolete()::) - (::(not obsolete()))'))
+ return [r for r in subset if r in extinctset]
+
+def extra(repo, subset, x):
+ """``extra(label, [value])``
+ Changesets with the given label in the extra metadata, with the given
+ optional value.
+
+ If `value` starts with `re:`, the remainder of the value is treated as
+ a regular expression. To match a value that actually starts with `re:`,
+ use the prefix `literal:`.
+ """
+
+ # i18n: "extra" is a keyword
+ l = getargs(x, 1, 2, _('extra takes at least 1 and at most 2 arguments'))
+ # i18n: "extra" is a keyword
+ label = getstring(l[0], _('first argument to extra must be a string'))
+ value = None
+
+ if len(l) > 1:
+ # i18n: "extra" is a keyword
+ value = getstring(l[1], _('second argument to extra must be a string'))
+ kind, value, matcher = _stringmatcher(value)
+
+ def _matchvalue(r):
+ extra = repo[r].extra()
+ return label in extra and (value is None or matcher(extra[label]))
+
+ return [r for r in subset if _matchvalue(r)]
+
+def filelog(repo, subset, x):
+ """``filelog(pattern)``
+ Changesets connected to the specified filelog.
+
+ For performance reasons, ``filelog()`` does not show every changeset
+ that affects the requested file(s). See :hg:`help log` for details. For
+ a slower, more accurate result, use ``file()``.
+ """
+
+ # i18n: "filelog" is a keyword
+ pat = getstring(x, _("filelog requires a pattern"))
+ m = matchmod.match(repo.root, repo.getcwd(), [pat], default='relpath',
+ ctx=repo[None])
+ s = set()
+
+ if not matchmod.patkind(pat):
+ for f in m.files():
+ fl = repo.file(f)
+ for fr in fl:
+ s.add(fl.linkrev(fr))
+ else:
+ for f in repo[None]:
+ if m(f):
+ fl = repo.file(f)
+ for fr in fl:
+ s.add(fl.linkrev(fr))
+
+ return [r for r in subset if r in s]
+
+def first(repo, subset, x):
+ """``first(set, [n])``
+ An alias for limit().
+ """
+ return limit(repo, subset, x)
+
+def _follow(repo, subset, x, name, followfirst=False):
+ l = getargs(x, 0, 1, _("%s takes no arguments or a filename") % name)
+ c = repo['.']
+ if l:
+ x = getstring(l[0], _("%s expected a filename") % name)
+ if x in c:
+ cx = c[x]
+ s = set(ctx.rev() for ctx in cx.ancestors(followfirst=followfirst))
+ # include the revision responsible for the most recent version
+ s.add(cx.linkrev())
+ else:
+ return []
+ else:
+ s = set(_revancestors(repo, [c.rev()], followfirst)) | set([c.rev()])
+
+ return [r for r in subset if r in s]
+
+def follow(repo, subset, x):
+ """``follow([file])``
+ An alias for ``::.`` (ancestors of the working copy's first parent).
+ If a filename is specified, the history of the given file is followed,
+ including copies.
+ """
+ return _follow(repo, subset, x, 'follow')
+
+def _followfirst(repo, subset, x):
+ # ``followfirst([file])``
+ # Like ``follow([file])`` but follows only the first parent of
+ # every revision or file revision.
+ return _follow(repo, subset, x, '_followfirst', followfirst=True)
+
+def getall(repo, subset, x):
+ """``all()``
+ All changesets, the same as ``0:tip``.
+ """
+ # i18n: "all" is a keyword
+ getargs(x, 0, 0, _("all takes no arguments"))
+ return subset
+
+def grep(repo, subset, x):
+ """``grep(regex)``
+ Like ``keyword(string)`` but accepts a regex. Use ``grep(r'...')``
+ to ensure special escape characters are handled correctly. Unlike
+ ``keyword(string)``, the match is case-sensitive.
+ """
+ try:
+ # i18n: "grep" is a keyword
+ gr = re.compile(getstring(x, _("grep requires a string")))
+ except re.error, e:
+ raise error.ParseError(_('invalid match pattern: %s') % e)
+ l = []
+ for r in subset:
+ c = repo[r]
+ for e in c.files() + [c.user(), c.description()]:
+ if gr.search(e):
+ l.append(r)
+ break
+ return l
+
+def _matchfiles(repo, subset, x):
+ # _matchfiles takes a revset list of prefixed arguments:
+ #
+ # [p:foo, i:bar, x:baz]
+ #
+ # builds a match object from them and filters subset. Allowed
+ # prefixes are 'p:' for regular patterns, 'i:' for include
+ # patterns and 'x:' for exclude patterns. Use 'r:' prefix to pass
+ # a revision identifier, or the empty string to reference the
+ # working directory, from which the match object is
+ # initialized. Use 'd:' to set the default matching mode, default
+ # to 'glob'. At most one 'r:' and 'd:' argument can be passed.
+
+ # i18n: "_matchfiles" is a keyword
+ l = getargs(x, 1, -1, _("_matchfiles requires at least one argument"))
+ pats, inc, exc = [], [], []
+ hasset = False
+ rev, default = None, None
+ for arg in l:
+ # i18n: "_matchfiles" is a keyword
+ s = getstring(arg, _("_matchfiles requires string arguments"))
+ prefix, value = s[:2], s[2:]
+ if prefix == 'p:':
+ pats.append(value)
+ elif prefix == 'i:':
+ inc.append(value)
+ elif prefix == 'x:':
+ exc.append(value)
+ elif prefix == 'r:':
+ if rev is not None:
+ # i18n: "_matchfiles" is a keyword
+ raise error.ParseError(_('_matchfiles expected at most one '
+ 'revision'))
+ rev = value
+ elif prefix == 'd:':
+ if default is not None:
+ # i18n: "_matchfiles" is a keyword
+ raise error.ParseError(_('_matchfiles expected at most one '
+ 'default mode'))
+ default = value
+ else:
+ # i18n: "_matchfiles" is a keyword
+ raise error.ParseError(_('invalid _matchfiles prefix: %s') % prefix)
+ if not hasset and matchmod.patkind(value) == 'set':
+ hasset = True
+ if not default:
+ default = 'glob'
+ m = None
+ s = []
+ for r in subset:
+ c = repo[r]
+ if not m or (hasset and rev is None):
+ ctx = c
+ if rev is not None:
+ ctx = repo[rev or None]
+ m = matchmod.match(repo.root, repo.getcwd(), pats, include=inc,
+ exclude=exc, ctx=ctx, default=default)
+ for f in c.files():
+ if m(f):
+ s.append(r)
+ break
+ return s
+
+def hasfile(repo, subset, x):
+ """``file(pattern)``
+ Changesets affecting files matched by pattern.
+
+ For a faster but less accurate result, consider using ``filelog()``
+ instead.
+ """
+ # i18n: "file" is a keyword
+ pat = getstring(x, _("file requires a pattern"))
+ return _matchfiles(repo, subset, ('string', 'p:' + pat))
+
+def head(repo, subset, x):
+ """``head()``
+ Changeset is a named branch head.
+ """
+ # i18n: "head" is a keyword
+ getargs(x, 0, 0, _("head takes no arguments"))
+ hs = set()
+ for b, ls in repo.branchmap().iteritems():
+ hs.update(repo[h].rev() for h in ls)
+ return [r for r in subset if r in hs]
+
+def heads(repo, subset, x):
+ """``heads(set)``
+ Members of set with no children in set.
+ """
+ s = getset(repo, subset, x)
+ ps = set(parents(repo, subset, x))
+ return [r for r in s if r not in ps]
+
+def keyword(repo, subset, x):
+ """``keyword(string)``
+ Search commit message, user name, and names of changed files for
+ string. The match is case-insensitive.
+ """
+ # i18n: "keyword" is a keyword
+ kw = encoding.lower(getstring(x, _("keyword requires a string")))
+ l = []
+ for r in subset:
+ c = repo[r]
+ t = " ".join(c.files() + [c.user(), c.description()])
+ if kw in encoding.lower(t):
+ l.append(r)
+ return l
+
+def limit(repo, subset, x):
+ """``limit(set, [n])``
+ First n members of set, defaulting to 1.
+ """
+ # i18n: "limit" is a keyword
+ l = getargs(x, 1, 2, _("limit requires one or two arguments"))
+ try:
+ lim = 1
+ if len(l) == 2:
+ # i18n: "limit" is a keyword
+ lim = int(getstring(l[1], _("limit requires a number")))
+ except (TypeError, ValueError):
+ # i18n: "limit" is a keyword
+ raise error.ParseError(_("limit expects a number"))
+ ss = set(subset)
+ os = getset(repo, range(len(repo)), l[0])[:lim]
+ return [r for r in os if r in ss]
+
+def last(repo, subset, x):
+ """``last(set, [n])``
+ Last n members of set, defaulting to 1.
+ """
+ # i18n: "last" is a keyword
+ l = getargs(x, 1, 2, _("last requires one or two arguments"))
+ try:
+ lim = 1
+ if len(l) == 2:
+ # i18n: "last" is a keyword
+ lim = int(getstring(l[1], _("last requires a number")))
+ except (TypeError, ValueError):
+ # i18n: "last" is a keyword
+ raise error.ParseError(_("last expects a number"))
+ ss = set(subset)
+ os = getset(repo, range(len(repo)), l[0])[-lim:]
+ return [r for r in os if r in ss]
+
+def maxrev(repo, subset, x):
+ """``max(set)``
+ Changeset with highest revision number in set.
+ """
+ os = getset(repo, range(len(repo)), x)
+ if os:
+ m = max(os)
+ if m in subset:
+ return [m]
+ return []
+
+def merge(repo, subset, x):
+ """``merge()``
+ Changeset is a merge changeset.
+ """
+ # i18n: "merge" is a keyword
+ getargs(x, 0, 0, _("merge takes no arguments"))
+ cl = repo.changelog
+ return [r for r in subset if cl.parentrevs(r)[1] != -1]
+
+def minrev(repo, subset, x):
+ """``min(set)``
+ Changeset with lowest revision number in set.
+ """
+ os = getset(repo, range(len(repo)), x)
+ if os:
+ m = min(os)
+ if m in subset:
+ return [m]
+ return []
+
+def modifies(repo, subset, x):
+ """``modifies(pattern)``
+ Changesets modifying files matched by pattern.
+ """
+ # i18n: "modifies" is a keyword
+ pat = getstring(x, _("modifies requires a pattern"))
+ return checkstatus(repo, subset, pat, 0)
+
+def node_(repo, subset, x):
+ """``id(string)``
+ Revision non-ambiguously specified by the given hex string prefix.
+ """
+ # i18n: "id" is a keyword
+ l = getargs(x, 1, 1, _("id requires one argument"))
+ # i18n: "id" is a keyword
+ n = getstring(l[0], _("id requires a string"))
+ if len(n) == 40:
+ rn = repo[n].rev()
+ else:
+ rn = None
+ pm = repo.changelog._partialmatch(n)
+ if pm is not None:
+ rn = repo.changelog.rev(pm)
+
+ return [r for r in subset if r == rn]
+
+def obsolete(repo, subset, x):
+ """``obsolete()``
+ Mutable changeset with a newer version."""
+ # i18n: "obsolete" is a keyword
+ getargs(x, 0, 0, _("obsolete takes no arguments"))
+ return [r for r in subset if repo[r].obsolete()]
+
+def origin(repo, subset, x):
+ """``origin([set])``
+ Changesets that were specified as a source for the grafts, transplants or
+ rebases that created the given revisions. Omitting the optional set is the
+ same as passing all(). If a changeset created by these operations is itself
+ specified as a source for one of these operations, only the source changeset
+ for the first operation is selected.
+ """
+ if x is not None:
+ args = set(getset(repo, range(len(repo)), x))
+ else:
+ args = set(getall(repo, range(len(repo)), x))
+
+ def _firstsrc(rev):
+ src = _getrevsource(repo, rev)
+ if src is None:
+ return None
+
+ while True:
+ prev = _getrevsource(repo, src)
+
+ if prev is None:
+ return src
+ src = prev
+
+ o = set([_firstsrc(r) for r in args])
+ return [r for r in subset if r in o]
+
+def outgoing(repo, subset, x):
+ """``outgoing([path])``
+ Changesets not found in the specified destination repository, or the
+ default push location.
+ """
+ import hg # avoid start-up nasties
+ # i18n: "outgoing" is a keyword
+ l = getargs(x, 0, 1, _("outgoing takes one or no arguments"))
+ # i18n: "outgoing" is a keyword
+ dest = l and getstring(l[0], _("outgoing requires a repository path")) or ''
+ dest = repo.ui.expandpath(dest or 'default-push', dest or 'default')
+ dest, branches = hg.parseurl(dest)
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, [])
+ if revs:
+ revs = [repo.lookup(rev) for rev in revs]
+ other = hg.peer(repo, {}, dest)
+ repo.ui.pushbuffer()
+ outgoing = discovery.findcommonoutgoing(repo, other, onlyheads=revs)
+ repo.ui.popbuffer()
+ cl = repo.changelog
+ o = set([cl.rev(r) for r in outgoing.missing])
+ return [r for r in subset if r in o]
+
+def p1(repo, subset, x):
+ """``p1([set])``
+ First parent of changesets in set, or the working directory.
+ """
+ if x is None:
+ p = repo[x].p1().rev()
+ return [r for r in subset if r == p]
+
+ ps = set()
+ cl = repo.changelog
+ for r in getset(repo, range(len(repo)), x):
+ ps.add(cl.parentrevs(r)[0])
+ return [r for r in subset if r in ps]
+
+def p2(repo, subset, x):
+ """``p2([set])``
+ Second parent of changesets in set, or the working directory.
+ """
+ if x is None:
+ ps = repo[x].parents()
+ try:
+ p = ps[1].rev()
+ return [r for r in subset if r == p]
+ except IndexError:
+ return []
+
+ ps = set()
+ cl = repo.changelog
+ for r in getset(repo, range(len(repo)), x):
+ ps.add(cl.parentrevs(r)[1])
+ return [r for r in subset if r in ps]
+
+def parents(repo, subset, x):
+ """``parents([set])``
+ The set of all parents for all changesets in set, or the working directory.
+ """
+ if x is None:
+ ps = tuple(p.rev() for p in repo[x].parents())
+ return [r for r in subset if r in ps]
+
+ ps = set()
+ cl = repo.changelog
+ for r in getset(repo, range(len(repo)), x):
+ ps.update(cl.parentrevs(r))
+ return [r for r in subset if r in ps]
+
+def parentspec(repo, subset, x, n):
+ """``set^0``
+ The set.
+ ``set^1`` (or ``set^``), ``set^2``
+ First or second parent, respectively, of all changesets in set.
+ """
+ try:
+ n = int(n[1])
+ if n not in (0, 1, 2):
+ raise ValueError
+ except (TypeError, ValueError):
+ raise error.ParseError(_("^ expects a number 0, 1, or 2"))
+ ps = set()
+ cl = repo.changelog
+ for r in getset(repo, subset, x):
+ if n == 0:
+ ps.add(r)
+ elif n == 1:
+ ps.add(cl.parentrevs(r)[0])
+ elif n == 2:
+ parents = cl.parentrevs(r)
+ if len(parents) > 1:
+ ps.add(parents[1])
+ return [r for r in subset if r in ps]
+
+def present(repo, subset, x):
+ """``present(set)``
+ An empty set, if any revision in set isn't found; otherwise,
+ all revisions in set.
+
+ If any of specified revisions is not present in the local repository,
+ the query is normally aborted. But this predicate allows the query
+ to continue even in such cases.
+ """
+ try:
+ return getset(repo, subset, x)
+ except error.RepoLookupError:
+ return []
+
+def public(repo, subset, x):
+ """``public()``
+ Changeset in public phase."""
+ # i18n: "public" is a keyword
+ getargs(x, 0, 0, _("public takes no arguments"))
+ pc = repo._phasecache
+ return [r for r in subset if pc.phase(repo, r) == phases.public]
+
+def remote(repo, subset, x):
+ """``remote([id [,path]])``
+ Local revision that corresponds to the given identifier in a
+ remote repository, if present. Here, the '.' identifier is a
+ synonym for the current local branch.
+ """
+
+ import hg # avoid start-up nasties
+ # i18n: "remote" is a keyword
+ l = getargs(x, 0, 2, _("remote takes one, two or no arguments"))
+
+ q = '.'
+ if len(l) > 0:
+ # i18n: "remote" is a keyword
+ q = getstring(l[0], _("remote requires a string id"))
+ if q == '.':
+ q = repo['.'].branch()
+
+ dest = ''
+ if len(l) > 1:
+ # i18n: "remote" is a keyword
+ dest = getstring(l[1], _("remote requires a repository path"))
+ dest = repo.ui.expandpath(dest or 'default')
+ dest, branches = hg.parseurl(dest)
+ revs, checkout = hg.addbranchrevs(repo, repo, branches, [])
+ if revs:
+ revs = [repo.lookup(rev) for rev in revs]
+ other = hg.peer(repo, {}, dest)
+ n = other.lookup(q)
+ if n in repo:
+ r = repo[n].rev()
+ if r in subset:
+ return [r]
+ return []
+
+def removes(repo, subset, x):
+ """``removes(pattern)``
+ Changesets which remove files matching pattern.
+ """
+ # i18n: "removes" is a keyword
+ pat = getstring(x, _("removes requires a pattern"))
+ return checkstatus(repo, subset, pat, 2)
+
+def rev(repo, subset, x):
+ """``rev(number)``
+ Revision with the given numeric identifier.
+ """
+ # i18n: "rev" is a keyword
+ l = getargs(x, 1, 1, _("rev requires one argument"))
+ try:
+ # i18n: "rev" is a keyword
+ l = int(getstring(l[0], _("rev requires a number")))
+ except (TypeError, ValueError):
+ # i18n: "rev" is a keyword
+ raise error.ParseError(_("rev expects a number"))
+ return [r for r in subset if r == l]
+
+def matching(repo, subset, x):
+ """``matching(revision [, field])``
+ Changesets in which a given set of fields match the set of fields in the
+ selected revision or set.
+
+ To match more than one field pass the list of fields to match separated
+ by spaces (e.g. ``author description``).
+
+ Valid fields are most regular revision fields and some special fields.
+
+ Regular revision fields are ``description``, ``author``, ``branch``,
+ ``date``, ``files``, ``phase``, ``parents``, ``substate``, ``user``
+ and ``diff``.
+ Note that ``author`` and ``user`` are synonyms. ``diff`` refers to the
+ contents of the revision. Two revisions matching their ``diff`` will
+ also match their ``files``.
+
+ Special fields are ``summary`` and ``metadata``:
+ ``summary`` matches the first line of the description.
+ ``metadata`` is equivalent to matching ``description user date``
+ (i.e. it matches the main metadata fields).
+
+ ``metadata`` is the default field which is used when no fields are
+ specified. You can match more than one field at a time.
+ """
+ # i18n: "matching" is a keyword
+ l = getargs(x, 1, 2, _("matching takes 1 or 2 arguments"))
+
+ revs = getset(repo, xrange(len(repo)), l[0])
+
+ fieldlist = ['metadata']
+ if len(l) > 1:
+ fieldlist = getstring(l[1],
+ # i18n: "matching" is a keyword
+ _("matching requires a string "
+ "as its second argument")).split()
+
+ # Make sure that there are no repeated fields,
+ # expand the 'special' 'metadata' field type
+ # and check the 'files' whenever we check the 'diff'
+ fields = []
+ for field in fieldlist:
+ if field == 'metadata':
+ fields += ['user', 'description', 'date']
+ elif field == 'diff':
+ # a revision matching the diff must also match the files
+ # since matching the diff is very costly, make sure to
+ # also match the files first
+ fields += ['files', 'diff']
+ else:
+ if field == 'author':
+ field = 'user'
+ fields.append(field)
+ fields = set(fields)
+ if 'summary' in fields and 'description' in fields:
+ # If a revision matches its description it also matches its summary
+ fields.discard('summary')
+
+ # We may want to match more than one field
+ # Not all fields take the same amount of time to be matched
+ # Sort the selected fields in order of increasing matching cost
+ fieldorder = ['phase', 'parents', 'user', 'date', 'branch', 'summary',
+ 'files', 'description', 'substate', 'diff']
+ def fieldkeyfunc(f):
+ try:
+ return fieldorder.index(f)
+ except ValueError:
+ # assume an unknown field is very costly
+ return len(fieldorder)
+ fields = list(fields)
+ fields.sort(key=fieldkeyfunc)
+
+ # Each field will be matched with its own "getfield" function
+ # which will be added to the getfieldfuncs array of functions
+ getfieldfuncs = []
+ _funcs = {
+ 'user': lambda r: repo[r].user(),
+ 'branch': lambda r: repo[r].branch(),
+ 'date': lambda r: repo[r].date(),
+ 'description': lambda r: repo[r].description(),
+ 'files': lambda r: repo[r].files(),
+ 'parents': lambda r: repo[r].parents(),
+ 'phase': lambda r: repo[r].phase(),
+ 'substate': lambda r: repo[r].substate,
+ 'summary': lambda r: repo[r].description().splitlines()[0],
+ 'diff': lambda r: list(repo[r].diff(git=True),)
+ }
+ for info in fields:
+ getfield = _funcs.get(info, None)
+ if getfield is None:
+ raise error.ParseError(
+ # i18n: "matching" is a keyword
+ _("unexpected field name passed to matching: %s") % info)
+ getfieldfuncs.append(getfield)
+ # convert the getfield array of functions into a "getinfo" function
+ # which returns an array of field values (or a single value if there
+ # is only one field to match)
+ getinfo = lambda r: [f(r) for f in getfieldfuncs]
+
+ matches = set()
+ for rev in revs:
+ target = getinfo(rev)
+ for r in subset:
+ match = True
+ for n, f in enumerate(getfieldfuncs):
+ if target[n] != f(r):
+ match = False
+ break
+ if match:
+ matches.add(r)
+ return [r for r in subset if r in matches]
+
+def reverse(repo, subset, x):
+ """``reverse(set)``
+ Reverse order of set.
+ """
+ l = getset(repo, subset, x)
+ if not isinstance(l, list):
+ l = list(l)
+ l.reverse()
+ return l
+
+def roots(repo, subset, x):
+ """``roots(set)``
+ Changesets in set with no parent changeset in set.
+ """
+ s = set(getset(repo, xrange(len(repo)), x))
+ subset = [r for r in subset if r in s]
+ cs = _children(repo, subset, s)
+ return [r for r in subset if r not in cs]
+
+def secret(repo, subset, x):
+ """``secret()``
+ Changeset in secret phase."""
+ # i18n: "secret" is a keyword
+ getargs(x, 0, 0, _("secret takes no arguments"))
+ pc = repo._phasecache
+ return [r for r in subset if pc.phase(repo, r) == phases.secret]
+
+def sort(repo, subset, x):
+ """``sort(set[, [-]key...])``
+ Sort set by keys. The default sort order is ascending, specify a key
+ as ``-key`` to sort in descending order.
+
+ The keys can be:
+
+ - ``rev`` for the revision number,
+ - ``branch`` for the branch name,
+ - ``desc`` for the commit message (description),
+ - ``user`` for user name (``author`` can be used as an alias),
+ - ``date`` for the commit date
+ """
+ # i18n: "sort" is a keyword
+ l = getargs(x, 1, 2, _("sort requires one or two arguments"))
+ keys = "rev"
+ if len(l) == 2:
+ # i18n: "sort" is a keyword
+ keys = getstring(l[1], _("sort spec must be a string"))
+
+ s = l[0]
+ keys = keys.split()
+ l = []
+ def invert(s):
+ return "".join(chr(255 - ord(c)) for c in s)
+ for r in getset(repo, subset, s):
+ c = repo[r]
+ e = []
+ for k in keys:
+ if k == 'rev':
+ e.append(r)
+ elif k == '-rev':
+ e.append(-r)
+ elif k == 'branch':
+ e.append(c.branch())
+ elif k == '-branch':
+ e.append(invert(c.branch()))
+ elif k == 'desc':
+ e.append(c.description())
+ elif k == '-desc':
+ e.append(invert(c.description()))
+ elif k in 'user author':
+ e.append(c.user())
+ elif k in '-user -author':
+ e.append(invert(c.user()))
+ elif k == 'date':
+ e.append(c.date()[0])
+ elif k == '-date':
+ e.append(-c.date()[0])
+ else:
+ raise error.ParseError(_("unknown sort key %r") % k)
+ e.append(r)
+ l.append(e)
+ l.sort()
+ return [e[-1] for e in l]
+
+def _stringmatcher(pattern):
+ """
+ accepts a string, possibly starting with 're:' or 'literal:' prefix.
+ returns the matcher name, pattern, and matcher function.
+ missing or unknown prefixes are treated as literal matches.
+
+ helper for tests:
+ >>> def test(pattern, *tests):
+ ... kind, pattern, matcher = _stringmatcher(pattern)
+ ... return (kind, pattern, [bool(matcher(t)) for t in tests])
+
+ exact matching (no prefix):
+ >>> test('abcdefg', 'abc', 'def', 'abcdefg')
+ ('literal', 'abcdefg', [False, False, True])
+
+ regex matching ('re:' prefix)
+ >>> test('re:a.+b', 'nomatch', 'fooadef', 'fooadefbar')
+ ('re', 'a.+b', [False, False, True])
+
+ force exact matches ('literal:' prefix)
+ >>> test('literal:re:foobar', 'foobar', 're:foobar')
+ ('literal', 're:foobar', [False, True])
+
+ unknown prefixes are ignored and treated as literals
+ >>> test('foo:bar', 'foo', 'bar', 'foo:bar')
+ ('literal', 'foo:bar', [False, False, True])
+ """
+ if pattern.startswith('re:'):
+ pattern = pattern[3:]
+ try:
+ regex = re.compile(pattern)
+ except re.error, e:
+ raise error.ParseError(_('invalid regular expression: %s')
+ % e)
+ return 're', pattern, regex.search
+ elif pattern.startswith('literal:'):
+ pattern = pattern[8:]
+ return 'literal', pattern, pattern.__eq__
+
+def _substringmatcher(pattern):
+ kind, pattern, matcher = _stringmatcher(pattern)
+ if kind == 'literal':
+ matcher = lambda s: pattern in s
+ return kind, pattern, matcher
+
+def tag(repo, subset, x):
+ """``tag([name])``
+ The specified tag by name, or all tagged revisions if no name is given.
+ """
+ # i18n: "tag" is a keyword
+ args = getargs(x, 0, 1, _("tag takes one or no arguments"))
+ cl = repo.changelog
+ if args:
+ pattern = getstring(args[0],
+ # i18n: "tag" is a keyword
+ _('the argument to tag must be a string'))
+ kind, pattern, matcher = _stringmatcher(pattern)
+ if kind == 'literal':
+ # avoid resolving all tags
+ tn = repo._tagscache.tags.get(pattern, None)
+ if tn is None:
+ raise util.Abort(_("tag '%s' does not exist") % pattern)
+ s = set([repo[tn].rev()])
+ else:
+ s = set([cl.rev(n) for t, n in repo.tagslist() if matcher(t)])
+ if not s:
+ raise util.Abort(_("no tags exist that match '%s'") % pattern)
+ else:
+ s = set([cl.rev(n) for t, n in repo.tagslist() if t != 'tip'])
+ return [r for r in subset if r in s]
+
+def tagged(repo, subset, x):
+ return tag(repo, subset, x)
+
+def unstable(repo, subset, x):
+ """``unstable()``
+ Non-obsolete changesets with obsolete ancestors.
+ """
+ # i18n: "unstable" is a keyword
+ getargs(x, 0, 0, _("unstable takes no arguments"))
+ unstableset = set(repo.revs('(obsolete()::) - obsolete()'))
+ return [r for r in subset if r in unstableset]
+
+
+def user(repo, subset, x):
+ """``user(string)``
+ User name contains string. The match is case-insensitive.
+
+ If `string` starts with `re:`, the remainder of the string is treated as
+ a regular expression. To match a user that actually contains `re:`, use
+ the prefix `literal:`.
+ """
+ return author(repo, subset, x)
+
+# for internal use
+def _list(repo, subset, x):
+ s = getstring(x, "internal error")
+ if not s:
+ return []
+ if not isinstance(subset, set):
+ subset = set(subset)
+ ls = [repo[r].rev() for r in s.split('\0')]
+ return [r for r in ls if r in subset]
+
+symbols = {
+ "adds": adds,
+ "all": getall,
+ "ancestor": ancestor,
+ "ancestors": ancestors,
+ "_firstancestors": _firstancestors,
+ "author": author,
+ "bisect": bisect,
+ "bisected": bisected,
+ "bookmark": bookmark,
+ "branch": branch,
+ "children": children,
+ "closed": closed,
+ "contains": contains,
+ "converted": converted,
+ "date": date,
+ "desc": desc,
+ "descendants": descendants,
+ "_firstdescendants": _firstdescendants,
+ "destination": destination,
+ "draft": draft,
+ "extinct": extinct,
+ "extra": extra,
+ "file": hasfile,
+ "filelog": filelog,
+ "first": first,
+ "follow": follow,
+ "_followfirst": _followfirst,
+ "grep": grep,
+ "head": head,
+ "heads": heads,
+ "id": node_,
+ "keyword": keyword,
+ "last": last,
+ "limit": limit,
+ "_matchfiles": _matchfiles,
+ "max": maxrev,
+ "merge": merge,
+ "min": minrev,
+ "modifies": modifies,
+ "obsolete": obsolete,
+ "origin": origin,
+ "outgoing": outgoing,
+ "p1": p1,
+ "p2": p2,
+ "parents": parents,
+ "present": present,
+ "public": public,
+ "remote": remote,
+ "removes": removes,
+ "rev": rev,
+ "reverse": reverse,
+ "roots": roots,
+ "sort": sort,
+ "secret": secret,
+ "matching": matching,
+ "tag": tag,
+ "tagged": tagged,
+ "user": user,
+ "unstable": unstable,
+ "_list": _list,
+}
+
+methods = {
+ "range": rangeset,
+ "dagrange": dagrange,
+ "string": stringset,
+ "symbol": symbolset,
+ "and": andset,
+ "or": orset,
+ "not": notset,
+ "list": listset,
+ "func": func,
+ "ancestor": ancestorspec,
+ "parent": parentspec,
+ "parentpost": p1,
+}
+
+def optimize(x, small):
+ if x is None:
+ return 0, x
+
+ smallbonus = 1
+ if small:
+ smallbonus = .5
+
+ op = x[0]
+ if op == 'minus':
+ return optimize(('and', x[1], ('not', x[2])), small)
+ elif op == 'dagrangepre':
+ return optimize(('func', ('symbol', 'ancestors'), x[1]), small)
+ elif op == 'dagrangepost':
+ return optimize(('func', ('symbol', 'descendants'), x[1]), small)
+ elif op == 'rangepre':
+ return optimize(('range', ('string', '0'), x[1]), small)
+ elif op == 'rangepost':
+ return optimize(('range', x[1], ('string', 'tip')), small)
+ elif op == 'negate':
+ return optimize(('string',
+ '-' + getstring(x[1], _("can't negate that"))), small)
+ elif op in 'string symbol negate':
+ return smallbonus, x # single revisions are small
+ elif op == 'and':
+ wa, ta = optimize(x[1], True)
+ wb, tb = optimize(x[2], True)
+ w = min(wa, wb)
+ if wa > wb:
+ return w, (op, tb, ta)
+ return w, (op, ta, tb)
+ elif op == 'or':
+ wa, ta = optimize(x[1], False)
+ wb, tb = optimize(x[2], False)
+ if wb < wa:
+ wb, wa = wa, wb
+ return max(wa, wb), (op, ta, tb)
+ elif op == 'not':
+ o = optimize(x[1], not small)
+ return o[0], (op, o[1])
+ elif op == 'parentpost':
+ o = optimize(x[1], small)
+ return o[0], (op, o[1])
+ elif op == 'group':
+ return optimize(x[1], small)
+ elif op in 'dagrange range list parent ancestorspec':
+ if op == 'parent':
+ # x^:y means (x^) : y, not x ^ (:y)
+ post = ('parentpost', x[1])
+ if x[2][0] == 'dagrangepre':
+ return optimize(('dagrange', post, x[2][1]), small)
+ elif x[2][0] == 'rangepre':
+ return optimize(('range', post, x[2][1]), small)
+
+ wa, ta = optimize(x[1], small)
+ wb, tb = optimize(x[2], small)
+ return wa + wb, (op, ta, tb)
+ elif op == 'func':
+ f = getstring(x[1], _("not a symbol"))
+ wa, ta = optimize(x[2], small)
+ if f in ("author branch closed date desc file grep keyword "
+ "outgoing user"):
+ w = 10 # slow
+ elif f in "modifies adds removes":
+ w = 30 # slower
+ elif f == "contains":
+ w = 100 # very slow
+ elif f == "ancestor":
+ w = 1 * smallbonus
+ elif f in "reverse limit first":
+ w = 0
+ elif f in "sort":
+ w = 10 # assume most sorts look at changelog
+ else:
+ w = 1
+ return w + wa, (op, x[1], ta)
+ return 1, x
+
+_aliasarg = ('func', ('symbol', '_aliasarg'))
+def _getaliasarg(tree):
+ """If tree matches ('func', ('symbol', '_aliasarg'), ('string', X))
+ return X, None otherwise.
+ """
+ if (len(tree) == 3 and tree[:2] == _aliasarg
+ and tree[2][0] == 'string'):
+ return tree[2][1]
+ return None
+
+def _checkaliasarg(tree, known=None):
+ """Check tree contains no _aliasarg construct or only ones which
+ value is in known. Used to avoid alias placeholders injection.
+ """
+ if isinstance(tree, tuple):
+ arg = _getaliasarg(tree)
+ if arg is not None and (not known or arg not in known):
+ raise error.ParseError(_("not a function: %s") % '_aliasarg')
+ for t in tree:
+ _checkaliasarg(t, known)
+
+class revsetalias(object):
+ funcre = re.compile('^([^(]+)\(([^)]+)\)$')
+ args = None
+
+ def __init__(self, name, value):
+ '''Aliases like:
+
+ h = heads(default)
+ b($1) = ancestors($1) - ancestors(default)
+ '''
+ m = self.funcre.search(name)
+ if m:
+ self.name = m.group(1)
+ self.tree = ('func', ('symbol', m.group(1)))
+ self.args = [x.strip() for x in m.group(2).split(',')]
+ for arg in self.args:
+ # _aliasarg() is an unknown symbol only used separate
+ # alias argument placeholders from regular strings.
+ value = value.replace(arg, '_aliasarg(%r)' % (arg,))
+ else:
+ self.name = name
+ self.tree = ('symbol', name)
+
+ self.replacement, pos = parse(value)
+ if pos != len(value):
+ raise error.ParseError(_('invalid token'), pos)
+ # Check for placeholder injection
+ _checkaliasarg(self.replacement, self.args)
+
+def _getalias(aliases, tree):
+ """If tree looks like an unexpanded alias, return it. Return None
+ otherwise.
+ """
+ if isinstance(tree, tuple) and tree:
+ if tree[0] == 'symbol' and len(tree) == 2:
+ name = tree[1]
+ alias = aliases.get(name)
+ if alias and alias.args is None and alias.tree == tree:
+ return alias
+ if tree[0] == 'func' and len(tree) > 1:
+ if tree[1][0] == 'symbol' and len(tree[1]) == 2:
+ name = tree[1][1]
+ alias = aliases.get(name)
+ if alias and alias.args is not None and alias.tree == tree[:2]:
+ return alias
+ return None
+
+def _expandargs(tree, args):
+ """Replace _aliasarg instances with the substitution value of the
+ same name in args, recursively.
+ """
+ if not tree or not isinstance(tree, tuple):
+ return tree
+ arg = _getaliasarg(tree)
+ if arg is not None:
+ return args[arg]
+ return tuple(_expandargs(t, args) for t in tree)
+
+def _expandaliases(aliases, tree, expanding, cache):
+ """Expand aliases in tree, recursively.
+
+ 'aliases' is a dictionary mapping user defined aliases to
+ revsetalias objects.
+ """
+ if not isinstance(tree, tuple):
+ # Do not expand raw strings
+ return tree
+ alias = _getalias(aliases, tree)
+ if alias is not None:
+ if alias in expanding:
+ raise error.ParseError(_('infinite expansion of revset alias "%s" '
+ 'detected') % alias.name)
+ expanding.append(alias)
+ if alias.name not in cache:
+ cache[alias.name] = _expandaliases(aliases, alias.replacement,
+ expanding, cache)
+ result = cache[alias.name]
+ expanding.pop()
+ if alias.args is not None:
+ l = getlist(tree[2])
+ if len(l) != len(alias.args):
+ raise error.ParseError(
+ _('invalid number of arguments: %s') % len(l))
+ l = [_expandaliases(aliases, a, [], cache) for a in l]
+ result = _expandargs(result, dict(zip(alias.args, l)))
+ else:
+ result = tuple(_expandaliases(aliases, t, expanding, cache)
+ for t in tree)
+ return result
+
+def findaliases(ui, tree):
+ _checkaliasarg(tree)
+ aliases = {}
+ for k, v in ui.configitems('revsetalias'):
+ alias = revsetalias(k, v)
+ aliases[alias.name] = alias
+ return _expandaliases(aliases, tree, [], {})
+
+parse = parser.parser(tokenize, elements).parse
+
+def match(ui, spec):
+ if not spec:
+ raise error.ParseError(_("empty query"))
+ tree, pos = parse(spec)
+ if (pos != len(spec)):
+ raise error.ParseError(_("invalid token"), pos)
+ if ui:
+ tree = findaliases(ui, tree)
+ weight, tree = optimize(tree, True)
+ def mfunc(repo, subset):
+ return getset(repo, subset, tree)
+ return mfunc
+
+def formatspec(expr, *args):
+ '''
+ This is a convenience function for using revsets internally, and
+ escapes arguments appropriately. Aliases are intentionally ignored
+ so that intended expression behavior isn't accidentally subverted.
+
+ Supported arguments:
+
+ %r = revset expression, parenthesized
+ %d = int(arg), no quoting
+ %s = string(arg), escaped and single-quoted
+ %b = arg.branch(), escaped and single-quoted
+ %n = hex(arg), single-quoted
+ %% = a literal '%'
+
+ Prefixing the type with 'l' specifies a parenthesized list of that type.
+
+ >>> formatspec('%r:: and %lr', '10 or 11', ("this()", "that()"))
+ '(10 or 11):: and ((this()) or (that()))'
+ >>> formatspec('%d:: and not %d::', 10, 20)
+ '10:: and not 20::'
+ >>> formatspec('%ld or %ld', [], [1])
+ "_list('') or 1"
+ >>> formatspec('keyword(%s)', 'foo\\xe9')
+ "keyword('foo\\\\xe9')"
+ >>> b = lambda: 'default'
+ >>> b.branch = b
+ >>> formatspec('branch(%b)', b)
+ "branch('default')"
+ >>> formatspec('root(%ls)', ['a', 'b', 'c', 'd'])
+ "root(_list('a\\x00b\\x00c\\x00d'))"
+ '''
+
+ def quote(s):
+ return repr(str(s))
+
+ def argtype(c, arg):
+ if c == 'd':
+ return str(int(arg))
+ elif c == 's':
+ return quote(arg)
+ elif c == 'r':
+ parse(arg) # make sure syntax errors are confined
+ return '(%s)' % arg
+ elif c == 'n':
+ return quote(node.hex(arg))
+ elif c == 'b':
+ return quote(arg.branch())
+
+ def listexp(s, t):
+ l = len(s)
+ if l == 0:
+ return "_list('')"
+ elif l == 1:
+ return argtype(t, s[0])
+ elif t == 'd':
+ return "_list('%s')" % "\0".join(str(int(a)) for a in s)
+ elif t == 's':
+ return "_list('%s')" % "\0".join(s)
+ elif t == 'n':
+ return "_list('%s')" % "\0".join(node.hex(a) for a in s)
+ elif t == 'b':
+ return "_list('%s')" % "\0".join(a.branch() for a in s)
+
+ m = l // 2
+ return '(%s or %s)' % (listexp(s[:m], t), listexp(s[m:], t))
+
+ ret = ''
+ pos = 0
+ arg = 0
+ while pos < len(expr):
+ c = expr[pos]
+ if c == '%':
+ pos += 1
+ d = expr[pos]
+ if d == '%':
+ ret += d
+ elif d in 'dsnbr':
+ ret += argtype(d, args[arg])
+ arg += 1
+ elif d == 'l':
+ # a list of some type
+ pos += 1
+ d = expr[pos]
+ ret += listexp(list(args[arg]), d)
+ arg += 1
+ else:
+ raise util.Abort('unexpected revspec format character %s' % d)
+ else:
+ ret += c
+ pos += 1
+
+ return ret
+
+def prettyformat(tree):
+ def _prettyformat(tree, level, lines):
+ if not isinstance(tree, tuple) or tree[0] in ('string', 'symbol'):
+ lines.append((level, str(tree)))
+ else:
+ lines.append((level, '(%s' % tree[0]))
+ for s in tree[1:]:
+ _prettyformat(s, level + 1, lines)
+ lines[-1:] = [(lines[-1][0], lines[-1][1] + ')')]
+
+ lines = []
+ _prettyformat(tree, 0, lines)
+ output = '\n'.join((' '*l + s) for l, s in lines)
+ return output
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = symbols.values()
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
new file mode 100644
index 0000000..96acfff
--- /dev/null
+++ b/mercurial/scmutil.py
@@ -0,0 +1,921 @@
+# scmutil.py - Mercurial core utility functions
+#
+# Copyright Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import util, error, osutil, revset, similar, encoding, phases
+import match as matchmod
+import os, errno, re, stat, sys, glob
+
+def nochangesfound(ui, repo, excluded=None):
+ '''Report no changes for push/pull, excluded is None or a list of
+ nodes excluded from the push/pull.
+ '''
+ secretlist = []
+ if excluded:
+ for n in excluded:
+ ctx = repo[n]
+ if ctx.phase() >= phases.secret and not ctx.extinct():
+ secretlist.append(n)
+
+ if secretlist:
+ ui.status(_("no changes found (ignored %d secret changesets)\n")
+ % len(secretlist))
+ else:
+ ui.status(_("no changes found\n"))
+
+def checkfilename(f):
+ '''Check that the filename f is an acceptable filename for a tracked file'''
+ if '\r' in f or '\n' in f:
+ raise util.Abort(_("'\\n' and '\\r' disallowed in filenames: %r") % f)
+
+def checkportable(ui, f):
+ '''Check if filename f is portable and warn or abort depending on config'''
+ checkfilename(f)
+ abort, warn = checkportabilityalert(ui)
+ if abort or warn:
+ msg = util.checkwinfilename(f)
+ if msg:
+ msg = "%s: %r" % (msg, f)
+ if abort:
+ raise util.Abort(msg)
+ ui.warn(_("warning: %s\n") % msg)
+
+def checkportabilityalert(ui):
+ '''check if the user's config requests nothing, a warning, or abort for
+ non-portable filenames'''
+ val = ui.config('ui', 'portablefilenames', 'warn')
+ lval = val.lower()
+ bval = util.parsebool(val)
+ abort = os.name == 'nt' or lval == 'abort'
+ warn = bval or lval == 'warn'
+ if bval is None and not (warn or abort or lval == 'ignore'):
+ raise error.ConfigError(
+ _("ui.portablefilenames value is invalid ('%s')") % val)
+ return abort, warn
+
+class casecollisionauditor(object):
+ def __init__(self, ui, abort, dirstate):
+ self._ui = ui
+ self._abort = abort
+ allfiles = '\0'.join(dirstate._map)
+ self._loweredfiles = set(encoding.lower(allfiles).split('\0'))
+ self._dirstate = dirstate
+ # The purpose of _newfiles is so that we don't complain about
+ # case collisions if someone were to call this object with the
+ # same filename twice.
+ self._newfiles = set()
+
+ def __call__(self, f):
+ fl = encoding.lower(f)
+ if (fl in self._loweredfiles and f not in self._dirstate and
+ f not in self._newfiles):
+ msg = _('possible case-folding collision for %s') % f
+ if self._abort:
+ raise util.Abort(msg)
+ self._ui.warn(_("warning: %s\n") % msg)
+ self._loweredfiles.add(fl)
+ self._newfiles.add(f)
+
+class pathauditor(object):
+ '''ensure that a filesystem path contains no banned components.
+ the following properties of a path are checked:
+
+ - ends with a directory separator
+ - under top-level .hg
+ - starts at the root of a windows drive
+ - contains ".."
+ - traverses a symlink (e.g. a/symlink_here/b)
+ - inside a nested repository (a callback can be used to approve
+ some nested repositories, e.g., subrepositories)
+ '''
+
+ def __init__(self, root, callback=None):
+ self.audited = set()
+ self.auditeddir = set()
+ self.root = root
+ self.callback = callback
+ if os.path.lexists(root) and not util.checkcase(root):
+ self.normcase = util.normcase
+ else:
+ self.normcase = lambda x: x
+
+ def __call__(self, path):
+ '''Check the relative path.
+ path may contain a pattern (e.g. foodir/**.txt)'''
+
+ path = util.localpath(path)
+ normpath = self.normcase(path)
+ if normpath in self.audited:
+ return
+ # AIX ignores "/" at end of path, others raise EISDIR.
+ if util.endswithsep(path):
+ raise util.Abort(_("path ends in directory separator: %s") % path)
+ parts = util.splitpath(path)
+ if (os.path.splitdrive(path)[0]
+ or parts[0].lower() in ('.hg', '.hg.', '')
+ or os.pardir in parts):
+ raise util.Abort(_("path contains illegal component: %s") % path)
+ if '.hg' in path.lower():
+ lparts = [p.lower() for p in parts]
+ for p in '.hg', '.hg.':
+ if p in lparts[1:]:
+ pos = lparts.index(p)
+ base = os.path.join(*parts[:pos])
+ raise util.Abort(_("path '%s' is inside nested repo %r")
+ % (path, base))
+
+ normparts = util.splitpath(normpath)
+ assert len(parts) == len(normparts)
+
+ parts.pop()
+ normparts.pop()
+ prefixes = []
+ while parts:
+ prefix = os.sep.join(parts)
+ normprefix = os.sep.join(normparts)
+ if normprefix in self.auditeddir:
+ break
+ curpath = os.path.join(self.root, prefix)
+ try:
+ st = os.lstat(curpath)
+ except OSError, err:
+ # EINVAL can be raised as invalid path syntax under win32.
+ # They must be ignored for patterns can be checked too.
+ if err.errno not in (errno.ENOENT, errno.ENOTDIR, errno.EINVAL):
+ raise
+ else:
+ if stat.S_ISLNK(st.st_mode):
+ raise util.Abort(
+ _('path %r traverses symbolic link %r')
+ % (path, prefix))
+ elif (stat.S_ISDIR(st.st_mode) and
+ os.path.isdir(os.path.join(curpath, '.hg'))):
+ if not self.callback or not self.callback(curpath):
+ raise util.Abort(_("path '%s' is inside nested "
+ "repo %r")
+ % (path, prefix))
+ prefixes.append(normprefix)
+ parts.pop()
+ normparts.pop()
+
+ self.audited.add(normpath)
+ # only add prefixes to the cache after checking everything: we don't
+ # want to add "foo/bar/baz" before checking if there's a "foo/.hg"
+ self.auditeddir.update(prefixes)
+
+class abstractopener(object):
+ """Abstract base class; cannot be instantiated"""
+
+ def __init__(self, *args, **kwargs):
+ '''Prevent instantiation; don't call this from subclasses.'''
+ raise NotImplementedError('attempted instantiating ' + str(type(self)))
+
+ def tryread(self, path):
+ '''gracefully return an empty string for missing files'''
+ try:
+ return self.read(path)
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return ""
+
+ def read(self, path):
+ fp = self(path, 'rb')
+ try:
+ return fp.read()
+ finally:
+ fp.close()
+
+ def write(self, path, data):
+ fp = self(path, 'wb')
+ try:
+ return fp.write(data)
+ finally:
+ fp.close()
+
+ def append(self, path, data):
+ fp = self(path, 'ab')
+ try:
+ return fp.write(data)
+ finally:
+ fp.close()
+
+ def mkdir(self, path=None):
+ return os.mkdir(self.join(path))
+
+ def exists(self, path=None):
+ return os.path.exists(self.join(path))
+
+ def isdir(self, path=None):
+ return os.path.isdir(self.join(path))
+
+ def makedir(self, path=None, notindexed=True):
+ return util.makedir(self.join(path), notindexed)
+
+ def makedirs(self, path=None, mode=None):
+ return util.makedirs(self.join(path), mode)
+
+class opener(abstractopener):
+ '''Open files relative to a base directory
+
+ This class is used to hide the details of COW semantics and
+ remote file access from higher level code.
+ '''
+ def __init__(self, base, audit=True, expand=False):
+ if expand:
+ base = os.path.realpath(util.expandpath(base))
+ self.base = base
+ self._audit = audit
+ if audit:
+ self.auditor = pathauditor(base)
+ else:
+ self.auditor = util.always
+ self.createmode = None
+ self._trustnlink = None
+
+ @util.propertycache
+ def _cansymlink(self):
+ return util.checklink(self.base)
+
+ def _fixfilemode(self, name):
+ if self.createmode is None:
+ return
+ os.chmod(name, self.createmode & 0666)
+
+ def __call__(self, path, mode="r", text=False, atomictemp=False):
+ if self._audit:
+ r = util.checkosfilename(path)
+ if r:
+ raise util.Abort("%s: %r" % (r, path))
+ self.auditor(path)
+ f = self.join(path)
+
+ if not text and "b" not in mode:
+ mode += "b" # for that other OS
+
+ nlink = -1
+ dirname, basename = os.path.split(f)
+ # If basename is empty, then the path is malformed because it points
+ # to a directory. Let the posixfile() call below raise IOError.
+ if basename and mode not in ('r', 'rb'):
+ if atomictemp:
+ if not os.path.isdir(dirname):
+ util.makedirs(dirname, self.createmode)
+ return util.atomictempfile(f, mode, self.createmode)
+ try:
+ if 'w' in mode:
+ util.unlink(f)
+ nlink = 0
+ else:
+ # nlinks() may behave differently for files on Windows
+ # shares if the file is open.
+ fd = util.posixfile(f)
+ nlink = util.nlinks(f)
+ if nlink < 1:
+ nlink = 2 # force mktempcopy (issue1922)
+ fd.close()
+ except (OSError, IOError), e:
+ if e.errno != errno.ENOENT:
+ raise
+ nlink = 0
+ if not os.path.isdir(dirname):
+ util.makedirs(dirname, self.createmode)
+ if nlink > 0:
+ if self._trustnlink is None:
+ self._trustnlink = nlink > 1 or util.checknlink(f)
+ if nlink > 1 or not self._trustnlink:
+ util.rename(util.mktempcopy(f), f)
+ fp = util.posixfile(f, mode)
+ if nlink == 0:
+ self._fixfilemode(f)
+ return fp
+
+ def symlink(self, src, dst):
+ self.auditor(dst)
+ linkname = self.join(dst)
+ try:
+ os.unlink(linkname)
+ except OSError:
+ pass
+
+ dirname = os.path.dirname(linkname)
+ if not os.path.exists(dirname):
+ util.makedirs(dirname, self.createmode)
+
+ if self._cansymlink:
+ try:
+ os.symlink(src, linkname)
+ except OSError, err:
+ raise OSError(err.errno, _('could not symlink to %r: %s') %
+ (src, err.strerror), linkname)
+ else:
+ f = self(dst, "w")
+ f.write(src)
+ f.close()
+ self._fixfilemode(dst)
+
+ def audit(self, path):
+ self.auditor(path)
+
+ def join(self, path):
+ if path:
+ return os.path.join(self.base, path)
+ else:
+ return self.base
+
+class filteropener(abstractopener):
+ '''Wrapper opener for filtering filenames with a function.'''
+
+ def __init__(self, opener, filter):
+ self._filter = filter
+ self._orig = opener
+
+ def __call__(self, path, *args, **kwargs):
+ return self._orig(self._filter(path), *args, **kwargs)
+
+def canonpath(root, cwd, myname, auditor=None):
+ '''return the canonical path of myname, given cwd and root'''
+ if util.endswithsep(root):
+ rootsep = root
+ else:
+ rootsep = root + os.sep
+ name = myname
+ if not os.path.isabs(name):
+ name = os.path.join(root, cwd, name)
+ name = os.path.normpath(name)
+ if auditor is None:
+ auditor = pathauditor(root)
+ if name != rootsep and name.startswith(rootsep):
+ name = name[len(rootsep):]
+ auditor(name)
+ return util.pconvert(name)
+ elif name == root:
+ return ''
+ else:
+ # Determine whether `name' is in the hierarchy at or beneath `root',
+ # by iterating name=dirname(name) until that causes no change (can't
+ # check name == '/', because that doesn't work on windows). The list
+ # `rel' holds the reversed list of components making up the relative
+ # file name we want.
+ rel = []
+ while True:
+ try:
+ s = util.samefile(name, root)
+ except OSError:
+ s = False
+ if s:
+ if not rel:
+ # name was actually the same as root (maybe a symlink)
+ return ''
+ rel.reverse()
+ name = os.path.join(*rel)
+ auditor(name)
+ return util.pconvert(name)
+ dirname, basename = os.path.split(name)
+ rel.append(basename)
+ if dirname == name:
+ break
+ name = dirname
+
+ raise util.Abort('%s not under root' % myname)
+
+def walkrepos(path, followsym=False, seen_dirs=None, recurse=False):
+ '''yield every hg repository under path, always recursively.
+ The recurse flag will only control recursion into repo working dirs'''
+ def errhandler(err):
+ if err.filename == path:
+ raise err
+ samestat = getattr(os.path, 'samestat', None)
+ if followsym and samestat is not None:
+ def adddir(dirlst, dirname):
+ match = False
+ dirstat = os.stat(dirname)
+ for lstdirstat in dirlst:
+ if samestat(dirstat, lstdirstat):
+ match = True
+ break
+ if not match:
+ dirlst.append(dirstat)
+ return not match
+ else:
+ followsym = False
+
+ if (seen_dirs is None) and followsym:
+ seen_dirs = []
+ adddir(seen_dirs, path)
+ for root, dirs, files in os.walk(path, topdown=True, onerror=errhandler):
+ dirs.sort()
+ if '.hg' in dirs:
+ yield root # found a repository
+ qroot = os.path.join(root, '.hg', 'patches')
+ if os.path.isdir(os.path.join(qroot, '.hg')):
+ yield qroot # we have a patch queue repo here
+ if recurse:
+ # avoid recursing inside the .hg directory
+ dirs.remove('.hg')
+ else:
+ dirs[:] = [] # don't descend further
+ elif followsym:
+ newdirs = []
+ for d in dirs:
+ fname = os.path.join(root, d)
+ if adddir(seen_dirs, fname):
+ if os.path.islink(fname):
+ for hgname in walkrepos(fname, True, seen_dirs):
+ yield hgname
+ else:
+ newdirs.append(d)
+ dirs[:] = newdirs
+
+def osrcpath():
+ '''return default os-specific hgrc search path'''
+ path = systemrcpath()
+ path.extend(userrcpath())
+ path = [os.path.normpath(f) for f in path]
+ return path
+
+_rcpath = None
+
+def rcpath():
+ '''return hgrc search path. if env var HGRCPATH is set, use it.
+ for each item in path, if directory, use files ending in .rc,
+ else use item.
+ make HGRCPATH empty to only look in .hg/hgrc of current repo.
+ if no HGRCPATH, use default os-specific path.'''
+ global _rcpath
+ if _rcpath is None:
+ if 'HGRCPATH' in os.environ:
+ _rcpath = []
+ for p in os.environ['HGRCPATH'].split(os.pathsep):
+ if not p:
+ continue
+ p = util.expandpath(p)
+ if os.path.isdir(p):
+ for f, kind in osutil.listdir(p):
+ if f.endswith('.rc'):
+ _rcpath.append(os.path.join(p, f))
+ else:
+ _rcpath.append(p)
+ else:
+ _rcpath = osrcpath()
+ return _rcpath
+
+if os.name != 'nt':
+
+ def rcfiles(path):
+ rcs = [os.path.join(path, 'hgrc')]
+ rcdir = os.path.join(path, 'hgrc.d')
+ try:
+ rcs.extend([os.path.join(rcdir, f)
+ for f, kind in osutil.listdir(rcdir)
+ if f.endswith(".rc")])
+ except OSError:
+ pass
+ return rcs
+
+ def systemrcpath():
+ path = []
+ if sys.platform == 'plan9':
+ root = 'lib/mercurial'
+ else:
+ root = 'etc/mercurial'
+ # old mod_python does not set sys.argv
+ if len(getattr(sys, 'argv', [])) > 0:
+ p = os.path.dirname(os.path.dirname(sys.argv[0]))
+ path.extend(rcfiles(os.path.join(p, root)))
+ path.extend(rcfiles('/' + root))
+ return path
+
+ def userrcpath():
+ if sys.platform == 'plan9':
+ return [os.environ['home'] + '/lib/hgrc']
+ else:
+ return [os.path.expanduser('~/.hgrc')]
+
+else:
+
+ import _winreg
+
+ def systemrcpath():
+ '''return default os-specific hgrc search path'''
+ rcpath = []
+ filename = util.executablepath()
+ # Use mercurial.ini found in directory with hg.exe
+ progrc = os.path.join(os.path.dirname(filename), 'mercurial.ini')
+ if os.path.isfile(progrc):
+ rcpath.append(progrc)
+ return rcpath
+ # Use hgrc.d found in directory with hg.exe
+ progrcd = os.path.join(os.path.dirname(filename), 'hgrc.d')
+ if os.path.isdir(progrcd):
+ for f, kind in osutil.listdir(progrcd):
+ if f.endswith('.rc'):
+ rcpath.append(os.path.join(progrcd, f))
+ return rcpath
+ # else look for a system rcpath in the registry
+ value = util.lookupreg('SOFTWARE\\Mercurial', None,
+ _winreg.HKEY_LOCAL_MACHINE)
+ if not isinstance(value, str) or not value:
+ return rcpath
+ value = util.localpath(value)
+ for p in value.split(os.pathsep):
+ if p.lower().endswith('mercurial.ini'):
+ rcpath.append(p)
+ elif os.path.isdir(p):
+ for f, kind in osutil.listdir(p):
+ if f.endswith('.rc'):
+ rcpath.append(os.path.join(p, f))
+ return rcpath
+
+ def userrcpath():
+ '''return os-specific hgrc search path to the user dir'''
+ home = os.path.expanduser('~')
+ path = [os.path.join(home, 'mercurial.ini'),
+ os.path.join(home, '.hgrc')]
+ userprofile = os.environ.get('USERPROFILE')
+ if userprofile:
+ path.append(os.path.join(userprofile, 'mercurial.ini'))
+ path.append(os.path.join(userprofile, '.hgrc'))
+ return path
+
+def revsingle(repo, revspec, default='.'):
+ if not revspec:
+ return repo[default]
+
+ l = revrange(repo, [revspec])
+ if len(l) < 1:
+ raise util.Abort(_('empty revision set'))
+ return repo[l[-1]]
+
+def revpair(repo, revs):
+ if not revs:
+ return repo.dirstate.p1(), None
+
+ l = revrange(repo, revs)
+
+ if len(l) == 0:
+ if revs:
+ raise util.Abort(_('empty revision range'))
+ return repo.dirstate.p1(), None
+
+ if len(l) == 1 and len(revs) == 1 and _revrangesep not in revs[0]:
+ return repo.lookup(l[0]), None
+
+ return repo.lookup(l[0]), repo.lookup(l[-1])
+
+_revrangesep = ':'
+
+def revrange(repo, revs):
+ """Yield revision as strings from a list of revision specifications."""
+
+ def revfix(repo, val, defval):
+ if not val and val != 0 and defval is not None:
+ return defval
+ return repo[val].rev()
+
+ seen, l = set(), []
+ for spec in revs:
+ if l and not seen:
+ seen = set(l)
+ # attempt to parse old-style ranges first to deal with
+ # things like old-tag which contain query metacharacters
+ try:
+ if isinstance(spec, int):
+ seen.add(spec)
+ l.append(spec)
+ continue
+
+ if _revrangesep in spec:
+ start, end = spec.split(_revrangesep, 1)
+ start = revfix(repo, start, 0)
+ end = revfix(repo, end, len(repo) - 1)
+ step = start > end and -1 or 1
+ if not seen and not l:
+ # by far the most common case: revs = ["-1:0"]
+ l = range(start, end + step, step)
+ # defer syncing seen until next iteration
+ continue
+ newrevs = set(xrange(start, end + step, step))
+ if seen:
+ newrevs.difference_update(seen)
+ seen.update(newrevs)
+ else:
+ seen = newrevs
+ l.extend(sorted(newrevs, reverse=start > end))
+ continue
+ elif spec and spec in repo: # single unquoted rev
+ rev = revfix(repo, spec, None)
+ if rev in seen:
+ continue
+ seen.add(rev)
+ l.append(rev)
+ continue
+ except error.RepoLookupError:
+ pass
+
+ # fall through to new-style queries if old-style fails
+ m = revset.match(repo.ui, spec)
+ dl = [r for r in m(repo, xrange(len(repo))) if r not in seen]
+ l.extend(dl)
+ seen.update(dl)
+
+ return l
+
+def expandpats(pats):
+ if not util.expandglobs:
+ return list(pats)
+ ret = []
+ for p in pats:
+ kind, name = matchmod._patsplit(p, None)
+ if kind is None:
+ try:
+ globbed = glob.glob(name)
+ except re.error:
+ globbed = [name]
+ if globbed:
+ ret.extend(globbed)
+ continue
+ ret.append(p)
+ return ret
+
+def matchandpats(ctx, pats=[], opts={}, globbed=False, default='relpath'):
+ if pats == ("",):
+ pats = []
+ if not globbed and default == 'relpath':
+ pats = expandpats(pats or [])
+
+ m = ctx.match(pats, opts.get('include'), opts.get('exclude'),
+ default)
+ def badfn(f, msg):
+ ctx._repo.ui.warn("%s: %s\n" % (m.rel(f), msg))
+ m.bad = badfn
+ return m, pats
+
+def match(ctx, pats=[], opts={}, globbed=False, default='relpath'):
+ return matchandpats(ctx, pats, opts, globbed, default)[0]
+
+def matchall(repo):
+ return matchmod.always(repo.root, repo.getcwd())
+
+def matchfiles(repo, files):
+ return matchmod.exact(repo.root, repo.getcwd(), files)
+
+def addremove(repo, pats=[], opts={}, dry_run=None, similarity=None):
+ if dry_run is None:
+ dry_run = opts.get('dry_run')
+ if similarity is None:
+ similarity = float(opts.get('similarity') or 0)
+ # we'd use status here, except handling of symlinks and ignore is tricky
+ added, unknown, deleted, removed = [], [], [], []
+ audit_path = pathauditor(repo.root)
+ m = match(repo[None], pats, opts)
+ rejected = []
+ m.bad = lambda x, y: rejected.append(x)
+
+ for abs in repo.walk(m):
+ target = repo.wjoin(abs)
+ good = True
+ try:
+ audit_path(abs)
+ except (OSError, util.Abort):
+ good = False
+ rel = m.rel(abs)
+ exact = m.exact(abs)
+ if good and abs not in repo.dirstate:
+ unknown.append(abs)
+ if repo.ui.verbose or not exact:
+ repo.ui.status(_('adding %s\n') % ((pats and rel) or abs))
+ elif (repo.dirstate[abs] != 'r' and
+ (not good or not os.path.lexists(target) or
+ (os.path.isdir(target) and not os.path.islink(target)))):
+ deleted.append(abs)
+ if repo.ui.verbose or not exact:
+ repo.ui.status(_('removing %s\n') % ((pats and rel) or abs))
+ # for finding renames
+ elif repo.dirstate[abs] == 'r':
+ removed.append(abs)
+ elif repo.dirstate[abs] == 'a':
+ added.append(abs)
+ copies = {}
+ if similarity > 0:
+ for old, new, score in similar.findrenames(repo,
+ added + unknown, removed + deleted, similarity):
+ if repo.ui.verbose or not m.exact(old) or not m.exact(new):
+ repo.ui.status(_('recording removal of %s as rename to %s '
+ '(%d%% similar)\n') %
+ (m.rel(old), m.rel(new), score * 100))
+ copies[new] = old
+
+ if not dry_run:
+ wctx = repo[None]
+ wlock = repo.wlock()
+ try:
+ wctx.forget(deleted)
+ wctx.add(unknown)
+ for new, old in copies.iteritems():
+ wctx.copy(old, new)
+ finally:
+ wlock.release()
+
+ for f in rejected:
+ if f in m.files():
+ return 1
+ return 0
+
+def updatedir(ui, repo, patches, similarity=0):
+ '''Update dirstate after patch application according to metadata'''
+ if not patches:
+ return []
+ copies = []
+ removes = set()
+ cfiles = patches.keys()
+ cwd = repo.getcwd()
+ if cwd:
+ cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
+ for f in patches:
+ gp = patches[f]
+ if not gp:
+ continue
+ if gp.op == 'RENAME':
+ copies.append((gp.oldpath, gp.path))
+ removes.add(gp.oldpath)
+ elif gp.op == 'COPY':
+ copies.append((gp.oldpath, gp.path))
+ elif gp.op == 'DELETE':
+ removes.add(gp.path)
+
+ wctx = repo[None]
+ for src, dst in copies:
+ dirstatecopy(ui, repo, wctx, src, dst, cwd=cwd)
+ if (not similarity) and removes:
+ wctx.remove(sorted(removes), True)
+
+ for f in patches:
+ gp = patches[f]
+ if gp and gp.mode:
+ islink, isexec = gp.mode
+ dst = repo.wjoin(gp.path)
+ # patch won't create empty files
+ if gp.op == 'ADD' and not os.path.lexists(dst):
+ flags = (isexec and 'x' or '') + (islink and 'l' or '')
+ repo.wwrite(gp.path, '', flags)
+ util.setflags(dst, islink, isexec)
+ addremove(repo, cfiles, similarity=similarity)
+ files = patches.keys()
+ files.extend([r for r in removes if r not in files])
+ return sorted(files)
+
+def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None):
+ """Update the dirstate to reflect the intent of copying src to dst. For
+ different reasons it might not end with dst being marked as copied from src.
+ """
+ origsrc = repo.dirstate.copied(src) or src
+ if dst == origsrc: # copying back a copy?
+ if repo.dirstate[dst] not in 'mn' and not dryrun:
+ repo.dirstate.normallookup(dst)
+ else:
+ if repo.dirstate[origsrc] == 'a' and origsrc == src:
+ if not ui.quiet:
+ ui.warn(_("%s has not been committed yet, so no copy "
+ "data will be stored for %s.\n")
+ % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd)))
+ if repo.dirstate[dst] in '?r' and not dryrun:
+ wctx.add([dst])
+ elif not dryrun:
+ wctx.copy(origsrc, dst)
+
+def readrequires(opener, supported):
+ '''Reads and parses .hg/requires and checks if all entries found
+ are in the list of supported features.'''
+ requirements = set(opener.read("requires").splitlines())
+ missings = []
+ for r in requirements:
+ if r not in supported:
+ if not r or not r[0].isalnum():
+ raise error.RequirementError(_(".hg/requires file is corrupt"))
+ missings.append(r)
+ missings.sort()
+ if missings:
+ raise error.RequirementError(
+ _("unknown repository format: requires features '%s' (upgrade "
+ "Mercurial)") % "', '".join(missings))
+ return requirements
+
+class filecacheentry(object):
+ def __init__(self, path):
+ self.path = path
+ self.cachestat = filecacheentry.stat(self.path)
+
+ if self.cachestat:
+ self._cacheable = self.cachestat.cacheable()
+ else:
+ # None means we don't know yet
+ self._cacheable = None
+
+ def refresh(self):
+ if self.cacheable():
+ self.cachestat = filecacheentry.stat(self.path)
+
+ def cacheable(self):
+ if self._cacheable is not None:
+ return self._cacheable
+
+ # we don't know yet, assume it is for now
+ return True
+
+ def changed(self):
+ # no point in going further if we can't cache it
+ if not self.cacheable():
+ return True
+
+ newstat = filecacheentry.stat(self.path)
+
+ # we may not know if it's cacheable yet, check again now
+ if newstat and self._cacheable is None:
+ self._cacheable = newstat.cacheable()
+
+ # check again
+ if not self._cacheable:
+ return True
+
+ if self.cachestat != newstat:
+ self.cachestat = newstat
+ return True
+ else:
+ return False
+
+ @staticmethod
+ def stat(path):
+ try:
+ return util.cachestat(path)
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+
+class filecache(object):
+ '''A property like decorator that tracks a file under .hg/ for updates.
+
+ Records stat info when called in _filecache.
+
+ On subsequent calls, compares old stat info with new info, and recreates
+ the object when needed, updating the new stat info in _filecache.
+
+ Mercurial either atomic renames or appends for files under .hg,
+ so to ensure the cache is reliable we need the filesystem to be able
+ to tell us if a file has been replaced. If it can't, we fallback to
+ recreating the object on every call (essentially the same behaviour as
+ propertycache).'''
+ def __init__(self, path):
+ self.path = path
+
+ def join(self, obj, fname):
+ """Used to compute the runtime path of the cached file.
+
+ Users should subclass filecache and provide their own version of this
+ function to call the appropriate join function on 'obj' (an instance
+ of the class that its member function was decorated).
+ """
+ return obj.join(fname)
+
+ def __call__(self, func):
+ self.func = func
+ self.name = func.__name__
+ return self
+
+ def __get__(self, obj, type=None):
+ # do we need to check if the file changed?
+ if self.name in obj.__dict__:
+ return obj.__dict__[self.name]
+
+ entry = obj._filecache.get(self.name)
+
+ if entry:
+ if entry.changed():
+ entry.obj = self.func(obj)
+ else:
+ path = self.join(obj, self.path)
+
+ # We stat -before- creating the object so our cache doesn't lie if
+ # a writer modified between the time we read and stat
+ entry = filecacheentry(path)
+ entry.obj = self.func(obj)
+
+ obj._filecache[self.name] = entry
+
+ obj.__dict__[self.name] = entry.obj
+ return entry.obj
+
+ def __set__(self, obj, value):
+ if self.name in obj._filecache:
+ obj._filecache[self.name].obj = value # update cached copy
+ obj.__dict__[self.name] = value # update copy returned by obj.x
+
+ def __delete__(self, obj):
+ try:
+ del obj.__dict__[self.name]
+ except KeyError:
+ raise AttributeError, self.name
diff --git a/mercurial/setdiscovery.py b/mercurial/setdiscovery.py
new file mode 100644
index 0000000..94d8bb0
--- /dev/null
+++ b/mercurial/setdiscovery.py
@@ -0,0 +1,199 @@
+# setdiscovery.py - improved discovery of common nodeset for mercurial
+#
+# Copyright 2010 Benoit Boissinot <bboissin@gmail.com>
+# and Peter Arrenbrecht <peter@arrenbrecht.ch>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid
+from i18n import _
+import random, util, dagutil
+
+def _updatesample(dag, nodes, sample, always, quicksamplesize=0):
+ # if nodes is empty we scan the entire graph
+ if nodes:
+ heads = dag.headsetofconnecteds(nodes)
+ else:
+ heads = dag.heads()
+ dist = {}
+ visit = util.deque(heads)
+ seen = set()
+ factor = 1
+ while visit:
+ curr = visit.popleft()
+ if curr in seen:
+ continue
+ d = dist.setdefault(curr, 1)
+ if d > factor:
+ factor *= 2
+ if d == factor:
+ if curr not in always: # need this check for the early exit below
+ sample.add(curr)
+ if quicksamplesize and (len(sample) >= quicksamplesize):
+ return
+ seen.add(curr)
+ for p in dag.parents(curr):
+ if not nodes or p in nodes:
+ dist.setdefault(p, d + 1)
+ visit.append(p)
+
+def _setupsample(dag, nodes, size):
+ if len(nodes) <= size:
+ return set(nodes), None, 0
+ always = dag.headsetofconnecteds(nodes)
+ desiredlen = size - len(always)
+ if desiredlen <= 0:
+ # This could be bad if there are very many heads, all unknown to the
+ # server. We're counting on long request support here.
+ return always, None, desiredlen
+ return always, set(), desiredlen
+
+def _takequicksample(dag, nodes, size, initial):
+ always, sample, desiredlen = _setupsample(dag, nodes, size)
+ if sample is None:
+ return always
+ if initial:
+ fromset = None
+ else:
+ fromset = nodes
+ _updatesample(dag, fromset, sample, always, quicksamplesize=desiredlen)
+ sample.update(always)
+ return sample
+
+def _takefullsample(dag, nodes, size):
+ always, sample, desiredlen = _setupsample(dag, nodes, size)
+ if sample is None:
+ return always
+ # update from heads
+ _updatesample(dag, nodes, sample, always)
+ # update from roots
+ _updatesample(dag.inverse(), nodes, sample, always)
+ assert sample
+ if len(sample) > desiredlen:
+ sample = set(random.sample(sample, desiredlen))
+ elif len(sample) < desiredlen:
+ more = desiredlen - len(sample)
+ sample.update(random.sample(list(nodes - sample - always), more))
+ sample.update(always)
+ return sample
+
+def findcommonheads(ui, local, remote,
+ initialsamplesize=100,
+ fullsamplesize=200,
+ abortwhenunrelated=True):
+ '''Return a tuple (common, anyincoming, remoteheads) used to identify
+ missing nodes from or in remote.
+
+ shortcutlocal determines whether we try use direct access to localrepo if
+ remote is actually local.
+ '''
+ roundtrips = 0
+ cl = local.changelog
+ dag = dagutil.revlogdag(cl)
+
+ # early exit if we know all the specified remote heads already
+ ui.debug("query 1; heads\n")
+ roundtrips += 1
+ ownheads = dag.heads()
+ sample = ownheads
+ if remote.local():
+ # stopgap until we have a proper localpeer that supports batch()
+ srvheadhashes = remote.heads()
+ yesno = remote.known(dag.externalizeall(sample))
+ elif remote.capable('batch'):
+ batch = remote.batch()
+ srvheadhashesref = batch.heads()
+ yesnoref = batch.known(dag.externalizeall(sample))
+ batch.submit()
+ srvheadhashes = srvheadhashesref.value
+ yesno = yesnoref.value
+ else:
+ # compatibitity with pre-batch, but post-known remotes during 1.9 devel
+ srvheadhashes = remote.heads()
+ sample = []
+
+ if cl.tip() == nullid:
+ if srvheadhashes != [nullid]:
+ return [nullid], True, srvheadhashes
+ return [nullid], False, []
+
+ # start actual discovery (we note this before the next "if" for
+ # compatibility reasons)
+ ui.status(_("searching for changes\n"))
+
+ srvheads = dag.internalizeall(srvheadhashes, filterunknown=True)
+ if len(srvheads) == len(srvheadhashes):
+ ui.debug("all remote heads known locally\n")
+ return (srvheadhashes, False, srvheadhashes,)
+
+ if sample and util.all(yesno):
+ ui.note(_("all local heads known remotely\n"))
+ ownheadhashes = dag.externalizeall(ownheads)
+ return (ownheadhashes, True, srvheadhashes,)
+
+ # full blown discovery
+
+ # own nodes where I don't know if remote knows them
+ undecided = dag.nodeset()
+ # own nodes I know we both know
+ common = set()
+ # own nodes I know remote lacks
+ missing = set()
+
+ # treat remote heads (and maybe own heads) as a first implicit sample
+ # response
+ common.update(dag.ancestorset(srvheads))
+ undecided.difference_update(common)
+
+ full = False
+ while undecided:
+
+ if sample:
+ commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
+ common.update(dag.ancestorset(commoninsample, common))
+
+ missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
+ missing.update(dag.descendantset(missinginsample, missing))
+
+ undecided.difference_update(missing)
+ undecided.difference_update(common)
+
+ if not undecided:
+ break
+
+ if full:
+ ui.note(_("sampling from both directions\n"))
+ sample = _takefullsample(dag, undecided, size=fullsamplesize)
+ elif common:
+ # use cheapish initial sample
+ ui.debug("taking initial sample\n")
+ sample = _takefullsample(dag, undecided, size=fullsamplesize)
+ else:
+ # use even cheaper initial sample
+ ui.debug("taking quick initial sample\n")
+ sample = _takequicksample(dag, undecided, size=initialsamplesize,
+ initial=True)
+
+ roundtrips += 1
+ ui.progress(_('searching'), roundtrips, unit=_('queries'))
+ ui.debug("query %i; still undecided: %i, sample size is: %i\n"
+ % (roundtrips, len(undecided), len(sample)))
+ # indices between sample and externalized version must match
+ sample = list(sample)
+ yesno = remote.known(dag.externalizeall(sample))
+ full = True
+
+ result = dag.headsetofconnecteds(common)
+ ui.progress(_('searching'), None)
+ ui.debug("%d total queries\n" % roundtrips)
+
+ if not result and srvheadhashes != [nullid]:
+ if abortwhenunrelated:
+ raise util.Abort(_("repository is unrelated"))
+ else:
+ ui.warn(_("warning: repository is unrelated\n"))
+ return (set([nullid]), True, srvheadhashes,)
+
+ anyincoming = (srvheadhashes != [nullid])
+ return dag.externalizeall(result), anyincoming, srvheadhashes
diff --git a/mercurial/similar.py b/mercurial/similar.py
new file mode 100644
index 0000000..8d4b581
--- /dev/null
+++ b/mercurial/similar.py
@@ -0,0 +1,104 @@
+# similar.py - mechanisms for finding similar files
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import util
+import mdiff
+import bdiff
+
+def _findexactmatches(repo, added, removed):
+ '''find renamed files that have no changes
+
+ Takes a list of new filectxs and a list of removed filectxs, and yields
+ (before, after) tuples of exact matches.
+ '''
+ numfiles = len(added) + len(removed)
+
+ # Get hashes of removed files.
+ hashes = {}
+ for i, fctx in enumerate(removed):
+ repo.ui.progress(_('searching for exact renames'), i, total=numfiles)
+ h = util.sha1(fctx.data()).digest()
+ hashes[h] = fctx
+
+ # For each added file, see if it corresponds to a removed file.
+ for i, fctx in enumerate(added):
+ repo.ui.progress(_('searching for exact renames'), i + len(removed),
+ total=numfiles)
+ h = util.sha1(fctx.data()).digest()
+ if h in hashes:
+ yield (hashes[h], fctx)
+
+ # Done
+ repo.ui.progress(_('searching for exact renames'), None)
+
+def _findsimilarmatches(repo, added, removed, threshold):
+ '''find potentially renamed files based on similar file content
+
+ Takes a list of new filectxs and a list of removed filectxs, and yields
+ (before, after, score) tuples of partial matches.
+ '''
+ copies = {}
+ for i, r in enumerate(removed):
+ repo.ui.progress(_('searching for similar files'), i,
+ total=len(removed))
+
+ # lazily load text
+ @util.cachefunc
+ def data():
+ orig = r.data()
+ return orig, mdiff.splitnewlines(orig)
+
+ def score(text):
+ orig, lines = data()
+ # bdiff.blocks() returns blocks of matching lines
+ # count the number of bytes in each
+ equal = 0
+ matches = bdiff.blocks(text, orig)
+ for x1, x2, y1, y2 in matches:
+ for line in lines[y1:y2]:
+ equal += len(line)
+
+ lengths = len(text) + len(orig)
+ return equal * 2.0 / lengths
+
+ for a in added:
+ bestscore = copies.get(a, (None, threshold))[1]
+ myscore = score(a.data())
+ if myscore >= bestscore:
+ copies[a] = (r, myscore)
+ repo.ui.progress(_('searching'), None)
+
+ for dest, v in copies.iteritems():
+ source, score = v
+ yield source, dest, score
+
+def findrenames(repo, added, removed, threshold):
+ '''find renamed files -- yields (before, after, score) tuples'''
+ parentctx = repo['.']
+ workingctx = repo[None]
+
+ # Zero length files will be frequently unrelated to each other, and
+ # tracking the deletion/addition of such a file will probably cause more
+ # harm than good. We strip them out here to avoid matching them later on.
+ addedfiles = set([workingctx[fp] for fp in added
+ if workingctx[fp].size() > 0])
+ removedfiles = set([parentctx[fp] for fp in removed
+ if fp in parentctx and parentctx[fp].size() > 0])
+
+ # Find exact matches.
+ for (a, b) in _findexactmatches(repo,
+ sorted(addedfiles), sorted(removedfiles)):
+ addedfiles.remove(b)
+ yield (a.path(), b.path(), 1.0)
+
+ # If the user requested similar files to be matched, search for them also.
+ if threshold < 1.0:
+ for (a, b, score) in _findsimilarmatches(repo,
+ sorted(addedfiles), sorted(removedfiles), threshold):
+ yield (a.path(), b.path(), score)
+
diff --git a/mercurial/simplemerge.py b/mercurial/simplemerge.py
new file mode 100644
index 0000000..10d7f54
--- /dev/null
+++ b/mercurial/simplemerge.py
@@ -0,0 +1,453 @@
+# Copyright (C) 2004, 2005 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+# mbp: "you know that thing where cvs gives you conflict markers?"
+# s: "i hate that."
+
+from i18n import _
+import scmutil, util, mdiff
+import sys, os
+
+class CantReprocessAndShowBase(Exception):
+ pass
+
+def intersect(ra, rb):
+ """Given two ranges return the range where they intersect or None.
+
+ >>> intersect((0, 10), (0, 6))
+ (0, 6)
+ >>> intersect((0, 10), (5, 15))
+ (5, 10)
+ >>> intersect((0, 10), (10, 15))
+ >>> intersect((0, 9), (10, 15))
+ >>> intersect((0, 9), (7, 15))
+ (7, 9)
+ """
+ assert ra[0] <= ra[1]
+ assert rb[0] <= rb[1]
+
+ sa = max(ra[0], rb[0])
+ sb = min(ra[1], rb[1])
+ if sa < sb:
+ return sa, sb
+ else:
+ return None
+
+def compare_range(a, astart, aend, b, bstart, bend):
+ """Compare a[astart:aend] == b[bstart:bend], without slicing.
+ """
+ if (aend - astart) != (bend - bstart):
+ return False
+ for ia, ib in zip(xrange(astart, aend), xrange(bstart, bend)):
+ if a[ia] != b[ib]:
+ return False
+ else:
+ return True
+
+class Merge3Text(object):
+ """3-way merge of texts.
+
+ Given strings BASE, OTHER, THIS, tries to produce a combined text
+ incorporating the changes from both BASE->OTHER and BASE->THIS."""
+ def __init__(self, basetext, atext, btext, base=None, a=None, b=None):
+ self.basetext = basetext
+ self.atext = atext
+ self.btext = btext
+ if base is None:
+ base = mdiff.splitnewlines(basetext)
+ if a is None:
+ a = mdiff.splitnewlines(atext)
+ if b is None:
+ b = mdiff.splitnewlines(btext)
+ self.base = base
+ self.a = a
+ self.b = b
+
+ def merge_lines(self,
+ name_a=None,
+ name_b=None,
+ name_base=None,
+ start_marker='<<<<<<<',
+ mid_marker='=======',
+ end_marker='>>>>>>>',
+ base_marker=None,
+ reprocess=False):
+ """Return merge in cvs-like form.
+ """
+ self.conflicts = False
+ newline = '\n'
+ if len(self.a) > 0:
+ if self.a[0].endswith('\r\n'):
+ newline = '\r\n'
+ elif self.a[0].endswith('\r'):
+ newline = '\r'
+ if base_marker and reprocess:
+ raise CantReprocessAndShowBase
+ if name_a:
+ start_marker = start_marker + ' ' + name_a
+ if name_b:
+ end_marker = end_marker + ' ' + name_b
+ if name_base and base_marker:
+ base_marker = base_marker + ' ' + name_base
+ merge_regions = self.merge_regions()
+ if reprocess is True:
+ merge_regions = self.reprocess_merge_regions(merge_regions)
+ for t in merge_regions:
+ what = t[0]
+ if what == 'unchanged':
+ for i in range(t[1], t[2]):
+ yield self.base[i]
+ elif what == 'a' or what == 'same':
+ for i in range(t[1], t[2]):
+ yield self.a[i]
+ elif what == 'b':
+ for i in range(t[1], t[2]):
+ yield self.b[i]
+ elif what == 'conflict':
+ self.conflicts = True
+ yield start_marker + newline
+ for i in range(t[3], t[4]):
+ yield self.a[i]
+ if base_marker is not None:
+ yield base_marker + newline
+ for i in range(t[1], t[2]):
+ yield self.base[i]
+ yield mid_marker + newline
+ for i in range(t[5], t[6]):
+ yield self.b[i]
+ yield end_marker + newline
+ else:
+ raise ValueError(what)
+
+ def merge_annotated(self):
+ """Return merge with conflicts, showing origin of lines.
+
+ Most useful for debugging merge.
+ """
+ for t in self.merge_regions():
+ what = t[0]
+ if what == 'unchanged':
+ for i in range(t[1], t[2]):
+ yield 'u | ' + self.base[i]
+ elif what == 'a' or what == 'same':
+ for i in range(t[1], t[2]):
+ yield what[0] + ' | ' + self.a[i]
+ elif what == 'b':
+ for i in range(t[1], t[2]):
+ yield 'b | ' + self.b[i]
+ elif what == 'conflict':
+ yield '<<<<\n'
+ for i in range(t[3], t[4]):
+ yield 'A | ' + self.a[i]
+ yield '----\n'
+ for i in range(t[5], t[6]):
+ yield 'B | ' + self.b[i]
+ yield '>>>>\n'
+ else:
+ raise ValueError(what)
+
+ def merge_groups(self):
+ """Yield sequence of line groups. Each one is a tuple:
+
+ 'unchanged', lines
+ Lines unchanged from base
+
+ 'a', lines
+ Lines taken from a
+
+ 'same', lines
+ Lines taken from a (and equal to b)
+
+ 'b', lines
+ Lines taken from b
+
+ 'conflict', base_lines, a_lines, b_lines
+ Lines from base were changed to either a or b and conflict.
+ """
+ for t in self.merge_regions():
+ what = t[0]
+ if what == 'unchanged':
+ yield what, self.base[t[1]:t[2]]
+ elif what == 'a' or what == 'same':
+ yield what, self.a[t[1]:t[2]]
+ elif what == 'b':
+ yield what, self.b[t[1]:t[2]]
+ elif what == 'conflict':
+ yield (what,
+ self.base[t[1]:t[2]],
+ self.a[t[3]:t[4]],
+ self.b[t[5]:t[6]])
+ else:
+ raise ValueError(what)
+
+ def merge_regions(self):
+ """Return sequences of matching and conflicting regions.
+
+ This returns tuples, where the first value says what kind we
+ have:
+
+ 'unchanged', start, end
+ Take a region of base[start:end]
+
+ 'same', astart, aend
+ b and a are different from base but give the same result
+
+ 'a', start, end
+ Non-clashing insertion from a[start:end]
+
+ Method is as follows:
+
+ The two sequences align only on regions which match the base
+ and both descendants. These are found by doing a two-way diff
+ of each one against the base, and then finding the
+ intersections between those regions. These "sync regions"
+ are by definition unchanged in both and easily dealt with.
+
+ The regions in between can be in any of three cases:
+ conflicted, or changed on only one side.
+ """
+
+ # section a[0:ia] has been disposed of, etc
+ iz = ia = ib = 0
+
+ for region in self.find_sync_regions():
+ zmatch, zend, amatch, aend, bmatch, bend = region
+ #print 'match base [%d:%d]' % (zmatch, zend)
+
+ matchlen = zend - zmatch
+ assert matchlen >= 0
+ assert matchlen == (aend - amatch)
+ assert matchlen == (bend - bmatch)
+
+ len_a = amatch - ia
+ len_b = bmatch - ib
+ len_base = zmatch - iz
+ assert len_a >= 0
+ assert len_b >= 0
+ assert len_base >= 0
+
+ #print 'unmatched a=%d, b=%d' % (len_a, len_b)
+
+ if len_a or len_b:
+ # try to avoid actually slicing the lists
+ equal_a = compare_range(self.a, ia, amatch,
+ self.base, iz, zmatch)
+ equal_b = compare_range(self.b, ib, bmatch,
+ self.base, iz, zmatch)
+ same = compare_range(self.a, ia, amatch,
+ self.b, ib, bmatch)
+
+ if same:
+ yield 'same', ia, amatch
+ elif equal_a and not equal_b:
+ yield 'b', ib, bmatch
+ elif equal_b and not equal_a:
+ yield 'a', ia, amatch
+ elif not equal_a and not equal_b:
+ yield 'conflict', iz, zmatch, ia, amatch, ib, bmatch
+ else:
+ raise AssertionError("can't handle a=b=base but unmatched")
+
+ ia = amatch
+ ib = bmatch
+ iz = zmatch
+
+ # if the same part of the base was deleted on both sides
+ # that's OK, we can just skip it.
+
+
+ if matchlen > 0:
+ assert ia == amatch
+ assert ib == bmatch
+ assert iz == zmatch
+
+ yield 'unchanged', zmatch, zend
+ iz = zend
+ ia = aend
+ ib = bend
+
+ def reprocess_merge_regions(self, merge_regions):
+ """Where there are conflict regions, remove the agreed lines.
+
+ Lines where both A and B have made the same changes are
+ eliminated.
+ """
+ for region in merge_regions:
+ if region[0] != "conflict":
+ yield region
+ continue
+ type, iz, zmatch, ia, amatch, ib, bmatch = region
+ a_region = self.a[ia:amatch]
+ b_region = self.b[ib:bmatch]
+ matches = mdiff.get_matching_blocks(''.join(a_region),
+ ''.join(b_region))
+ next_a = ia
+ next_b = ib
+ for region_ia, region_ib, region_len in matches[:-1]:
+ region_ia += ia
+ region_ib += ib
+ reg = self.mismatch_region(next_a, region_ia, next_b,
+ region_ib)
+ if reg is not None:
+ yield reg
+ yield 'same', region_ia, region_len + region_ia
+ next_a = region_ia + region_len
+ next_b = region_ib + region_len
+ reg = self.mismatch_region(next_a, amatch, next_b, bmatch)
+ if reg is not None:
+ yield reg
+
+ def mismatch_region(next_a, region_ia, next_b, region_ib):
+ if next_a < region_ia or next_b < region_ib:
+ return 'conflict', None, None, next_a, region_ia, next_b, region_ib
+ mismatch_region = staticmethod(mismatch_region)
+
+ def find_sync_regions(self):
+ """Return a list of sync regions, where both descendants match the base.
+
+ Generates a list of (base1, base2, a1, a2, b1, b2). There is
+ always a zero-length sync region at the end of all the files.
+ """
+
+ ia = ib = 0
+ amatches = mdiff.get_matching_blocks(self.basetext, self.atext)
+ bmatches = mdiff.get_matching_blocks(self.basetext, self.btext)
+ len_a = len(amatches)
+ len_b = len(bmatches)
+
+ sl = []
+
+ while ia < len_a and ib < len_b:
+ abase, amatch, alen = amatches[ia]
+ bbase, bmatch, blen = bmatches[ib]
+
+ # there is an unconflicted block at i; how long does it
+ # extend? until whichever one ends earlier.
+ i = intersect((abase, abase + alen), (bbase, bbase + blen))
+ if i:
+ intbase = i[0]
+ intend = i[1]
+ intlen = intend - intbase
+
+ # found a match of base[i[0], i[1]]; this may be less than
+ # the region that matches in either one
+ assert intlen <= alen
+ assert intlen <= blen
+ assert abase <= intbase
+ assert bbase <= intbase
+
+ asub = amatch + (intbase - abase)
+ bsub = bmatch + (intbase - bbase)
+ aend = asub + intlen
+ bend = bsub + intlen
+
+ assert self.base[intbase:intend] == self.a[asub:aend], \
+ (self.base[intbase:intend], self.a[asub:aend])
+
+ assert self.base[intbase:intend] == self.b[bsub:bend]
+
+ sl.append((intbase, intend,
+ asub, aend,
+ bsub, bend))
+
+ # advance whichever one ends first in the base text
+ if (abase + alen) < (bbase + blen):
+ ia += 1
+ else:
+ ib += 1
+
+ intbase = len(self.base)
+ abase = len(self.a)
+ bbase = len(self.b)
+ sl.append((intbase, intbase, abase, abase, bbase, bbase))
+
+ return sl
+
+ def find_unconflicted(self):
+ """Return a list of ranges in base that are not conflicted."""
+ am = mdiff.get_matching_blocks(self.basetext, self.atext)
+ bm = mdiff.get_matching_blocks(self.basetext, self.btext)
+
+ unc = []
+
+ while am and bm:
+ # there is an unconflicted block at i; how long does it
+ # extend? until whichever one ends earlier.
+ a1 = am[0][0]
+ a2 = a1 + am[0][2]
+ b1 = bm[0][0]
+ b2 = b1 + bm[0][2]
+ i = intersect((a1, a2), (b1, b2))
+ if i:
+ unc.append(i)
+
+ if a2 < b2:
+ del am[0]
+ else:
+ del bm[0]
+
+ return unc
+
+def simplemerge(ui, local, base, other, **opts):
+ def readfile(filename):
+ f = open(filename, "rb")
+ text = f.read()
+ f.close()
+ if util.binary(text):
+ msg = _("%s looks like a binary file.") % filename
+ if not opts.get('quiet'):
+ ui.warn(_('warning: %s\n') % msg)
+ if not opts.get('text'):
+ raise util.Abort(msg)
+ return text
+
+ name_a = local
+ name_b = other
+ labels = opts.get('label', [])
+ if labels:
+ name_a = labels.pop(0)
+ if labels:
+ name_b = labels.pop(0)
+ if labels:
+ raise util.Abort(_("can only specify two labels."))
+
+ try:
+ localtext = readfile(local)
+ basetext = readfile(base)
+ othertext = readfile(other)
+ except util.Abort:
+ return 1
+
+ local = os.path.realpath(local)
+ if not opts.get('print'):
+ opener = scmutil.opener(os.path.dirname(local))
+ out = opener(os.path.basename(local), "w", atomictemp=True)
+ else:
+ out = sys.stdout
+
+ reprocess = not opts.get('no_minimal')
+
+ m3 = Merge3Text(basetext, localtext, othertext)
+ for line in m3.merge_lines(name_a=name_a, name_b=name_b,
+ reprocess=reprocess):
+ out.write(line)
+
+ if not opts.get('print'):
+ out.close()
+
+ if m3.conflicts:
+ if not opts.get('quiet'):
+ ui.warn(_("warning: conflicts during merge.\n"))
+ return 1
diff --git a/mercurial/sshpeer.py b/mercurial/sshpeer.py
new file mode 100644
index 0000000..c9a48c0
--- /dev/null
+++ b/mercurial/sshpeer.py
@@ -0,0 +1,239 @@
+# sshpeer.py - ssh repository proxy class for mercurial
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import re
+from i18n import _
+import util, error, wireproto
+
+class remotelock(object):
+ def __init__(self, repo):
+ self.repo = repo
+ def release(self):
+ self.repo.unlock()
+ self.repo = None
+ def __del__(self):
+ if self.repo:
+ self.release()
+
+def _serverquote(s):
+ '''quote a string for the remote shell ... which we assume is sh'''
+ if re.match('[a-zA-Z0-9@%_+=:,./-]*$', s):
+ return s
+ return "'%s'" % s.replace("'", "'\\''")
+
+class sshpeer(wireproto.wirepeer):
+ def __init__(self, ui, path, create=False):
+ self._url = path
+ self.ui = ui
+ self.pipeo = self.pipei = self.pipee = None
+
+ u = util.url(path, parsequery=False, parsefragment=False)
+ if u.scheme != 'ssh' or not u.host or u.path is None:
+ self._abort(error.RepoError(_("couldn't parse location %s") % path))
+
+ self.user = u.user
+ if u.passwd is not None:
+ self._abort(error.RepoError(_("password in URL not supported")))
+ self.host = u.host
+ self.port = u.port
+ self.path = u.path or "."
+
+ sshcmd = self.ui.config("ui", "ssh", "ssh")
+ remotecmd = self.ui.config("ui", "remotecmd", "hg")
+
+ args = util.sshargs(sshcmd, self.host, self.user, self.port)
+
+ if create:
+ cmd = '%s %s %s' % (sshcmd, args,
+ util.shellquote("%s init %s" %
+ (_serverquote(remotecmd), _serverquote(self.path))))
+ ui.note(_('running %s\n') % cmd)
+ res = util.system(cmd)
+ if res != 0:
+ self._abort(error.RepoError(_("could not create remote repo")))
+
+ self.validate_repo(ui, sshcmd, args, remotecmd)
+
+ def url(self):
+ return self._url
+
+ def validate_repo(self, ui, sshcmd, args, remotecmd):
+ # cleanup up previous run
+ self.cleanup()
+
+ cmd = '%s %s %s' % (sshcmd, args,
+ util.shellquote("%s -R %s serve --stdio" %
+ (_serverquote(remotecmd), _serverquote(self.path))))
+ ui.note(_('running %s\n') % cmd)
+ cmd = util.quotecommand(cmd)
+ self.pipeo, self.pipei, self.pipee = util.popen3(cmd)
+
+ # skip any noise generated by remote shell
+ self._callstream("hello")
+ r = self._callstream("between", pairs=("%s-%s" % ("0"*40, "0"*40)))
+ lines = ["", "dummy"]
+ max_noise = 500
+ while lines[-1] and max_noise:
+ l = r.readline()
+ self.readerr()
+ if lines[-1] == "1\n" and l == "\n":
+ break
+ if l:
+ ui.debug("remote: ", l)
+ lines.append(l)
+ max_noise -= 1
+ else:
+ self._abort(error.RepoError(_('no suitable response from '
+ 'remote hg')))
+
+ self._caps = set()
+ for l in reversed(lines):
+ if l.startswith("capabilities:"):
+ self._caps.update(l[:-1].split(":")[1].split())
+ break
+
+ def _capabilities(self):
+ return self._caps
+
+ def readerr(self):
+ while True:
+ size = util.fstat(self.pipee).st_size
+ if size == 0:
+ break
+ s = self.pipee.read(size)
+ if not s:
+ break
+ for l in s.splitlines():
+ self.ui.status(_("remote: "), l, '\n')
+
+ def _abort(self, exception):
+ self.cleanup()
+ raise exception
+
+ def cleanup(self):
+ if self.pipeo is None:
+ return
+ self.pipeo.close()
+ self.pipei.close()
+ try:
+ # read the error descriptor until EOF
+ for l in self.pipee:
+ self.ui.status(_("remote: "), l)
+ except (IOError, ValueError):
+ pass
+ self.pipee.close()
+
+ __del__ = cleanup
+
+ def _callstream(self, cmd, **args):
+ self.ui.debug("sending %s command\n" % cmd)
+ self.pipeo.write("%s\n" % cmd)
+ _func, names = wireproto.commands[cmd]
+ keys = names.split()
+ wireargs = {}
+ for k in keys:
+ if k == '*':
+ wireargs['*'] = args
+ break
+ else:
+ wireargs[k] = args[k]
+ del args[k]
+ for k, v in sorted(wireargs.iteritems()):
+ self.pipeo.write("%s %d\n" % (k, len(v)))
+ if isinstance(v, dict):
+ for dk, dv in v.iteritems():
+ self.pipeo.write("%s %d\n" % (dk, len(dv)))
+ self.pipeo.write(dv)
+ else:
+ self.pipeo.write(v)
+ self.pipeo.flush()
+
+ return self.pipei
+
+ def _call(self, cmd, **args):
+ self._callstream(cmd, **args)
+ return self._recv()
+
+ def _callpush(self, cmd, fp, **args):
+ r = self._call(cmd, **args)
+ if r:
+ return '', r
+ while True:
+ d = fp.read(4096)
+ if not d:
+ break
+ self._send(d)
+ self._send("", flush=True)
+ r = self._recv()
+ if r:
+ return '', r
+ return self._recv(), ''
+
+ def _decompress(self, stream):
+ return stream
+
+ def _recv(self):
+ l = self.pipei.readline()
+ if l == '\n':
+ err = []
+ while True:
+ line = self.pipee.readline()
+ if line == '-\n':
+ break
+ err.extend([line])
+ if len(err) > 0:
+ # strip the trailing newline added to the last line server-side
+ err[-1] = err[-1][:-1]
+ self._abort(error.OutOfBandError(*err))
+ self.readerr()
+ try:
+ l = int(l)
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), l))
+ return self.pipei.read(l)
+
+ def _send(self, data, flush=False):
+ self.pipeo.write("%d\n" % len(data))
+ if data:
+ self.pipeo.write(data)
+ if flush:
+ self.pipeo.flush()
+ self.readerr()
+
+ def lock(self):
+ self._call("lock")
+ return remotelock(self)
+
+ def unlock(self):
+ self._call("unlock")
+
+ def addchangegroup(self, cg, source, url, lock=None):
+ '''Send a changegroup to the remote server. Return an integer
+ similar to unbundle(). DEPRECATED, since it requires locking the
+ remote.'''
+ d = self._call("addchangegroup")
+ if d:
+ self._abort(error.RepoError(_("push refused: %s") % d))
+ while True:
+ d = cg.read(4096)
+ if not d:
+ break
+ self.pipeo.write(d)
+ self.readerr()
+
+ self.pipeo.flush()
+
+ self.readerr()
+ r = self._recv()
+ if not r:
+ return 1
+ try:
+ return int(r)
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), r))
+
+instance = sshpeer
diff --git a/mercurial/sshserver.py b/mercurial/sshserver.py
new file mode 100644
index 0000000..7c0a4e8
--- /dev/null
+++ b/mercurial/sshserver.py
@@ -0,0 +1,151 @@
+# sshserver.py - ssh protocol server support for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import util, hook, wireproto, changegroup
+import os, sys
+
+class sshserver(object):
+ def __init__(self, ui, repo):
+ self.ui = ui
+ self.repo = repo
+ self.lock = None
+ self.fin = ui.fin
+ self.fout = ui.fout
+
+ hook.redirect(True)
+ ui.fout = repo.ui.fout = ui.ferr
+
+ # Prevent insertion/deletion of CRs
+ util.setbinary(self.fin)
+ util.setbinary(self.fout)
+
+ def getargs(self, args):
+ data = {}
+ keys = args.split()
+ for n in xrange(len(keys)):
+ argline = self.fin.readline()[:-1]
+ arg, l = argline.split()
+ if arg not in keys:
+ raise util.Abort("unexpected parameter %r" % arg)
+ if arg == '*':
+ star = {}
+ for k in xrange(int(l)):
+ argline = self.fin.readline()[:-1]
+ arg, l = argline.split()
+ val = self.fin.read(int(l))
+ star[arg] = val
+ data['*'] = star
+ else:
+ val = self.fin.read(int(l))
+ data[arg] = val
+ return [data[k] for k in keys]
+
+ def getarg(self, name):
+ return self.getargs(name)[0]
+
+ def getfile(self, fpout):
+ self.sendresponse('')
+ count = int(self.fin.readline())
+ while count:
+ fpout.write(self.fin.read(count))
+ count = int(self.fin.readline())
+
+ def redirect(self):
+ pass
+
+ def groupchunks(self, changegroup):
+ while True:
+ d = changegroup.read(4096)
+ if not d:
+ break
+ yield d
+
+ def sendresponse(self, v):
+ self.fout.write("%d\n" % len(v))
+ self.fout.write(v)
+ self.fout.flush()
+
+ def sendstream(self, source):
+ for chunk in source.gen:
+ self.fout.write(chunk)
+ self.fout.flush()
+
+ def sendpushresponse(self, rsp):
+ self.sendresponse('')
+ self.sendresponse(str(rsp.res))
+
+ def sendpusherror(self, rsp):
+ self.sendresponse(rsp.res)
+
+ def sendooberror(self, rsp):
+ self.ui.ferr.write('%s\n-\n' % rsp.message)
+ self.ui.ferr.flush()
+ self.fout.write('\n')
+ self.fout.flush()
+
+ def serve_forever(self):
+ try:
+ while self.serve_one():
+ pass
+ finally:
+ if self.lock is not None:
+ self.lock.release()
+ sys.exit(0)
+
+ handlers = {
+ str: sendresponse,
+ wireproto.streamres: sendstream,
+ wireproto.pushres: sendpushresponse,
+ wireproto.pusherr: sendpusherror,
+ wireproto.ooberror: sendooberror,
+ }
+
+ def serve_one(self):
+ cmd = self.fin.readline()[:-1]
+ if cmd and cmd in wireproto.commands:
+ rsp = wireproto.dispatch(self.repo, self, cmd)
+ self.handlers[rsp.__class__](self, rsp)
+ elif cmd:
+ impl = getattr(self, 'do_' + cmd, None)
+ if impl:
+ r = impl()
+ if r is not None:
+ self.sendresponse(r)
+ else: self.sendresponse("")
+ return cmd != ''
+
+ def do_lock(self):
+ '''DEPRECATED - allowing remote client to lock repo is not safe'''
+
+ self.lock = self.repo.lock()
+ return ""
+
+ def do_unlock(self):
+ '''DEPRECATED'''
+
+ if self.lock:
+ self.lock.release()
+ self.lock = None
+ return ""
+
+ def do_addchangegroup(self):
+ '''DEPRECATED'''
+
+ if not self.lock:
+ self.sendresponse("not locked")
+ return
+
+ self.sendresponse("")
+ cg = changegroup.unbundle10(self.fin, "UN")
+ r = self.repo.addchangegroup(cg, 'serve', self._client())
+ self.lock.release()
+ return str(r)
+
+ def _client(self):
+ client = os.environ.get('SSH_CLIENT', '').split(' ', 1)[0]
+ return 'remote:ssh:' + client
diff --git a/mercurial/sslutil.py b/mercurial/sslutil.py
new file mode 100644
index 0000000..c6fe18b
--- /dev/null
+++ b/mercurial/sslutil.py
@@ -0,0 +1,143 @@
+# sslutil.py - SSL handling for mercurial
+#
+# Copyright 2005, 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
+# Copyright 2006, 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+import os
+
+from mercurial import util
+from mercurial.i18n import _
+try:
+ # avoid using deprecated/broken FakeSocket in python 2.6
+ import ssl
+ CERT_REQUIRED = ssl.CERT_REQUIRED
+ def ssl_wrap_socket(sock, keyfile, certfile,
+ cert_reqs=ssl.CERT_NONE, ca_certs=None):
+ sslsocket = ssl.wrap_socket(sock, keyfile, certfile,
+ cert_reqs=cert_reqs, ca_certs=ca_certs)
+ # check if wrap_socket failed silently because socket had been closed
+ # - see http://bugs.python.org/issue13721
+ if not sslsocket.cipher():
+ raise util.Abort(_('ssl connection failed'))
+ return sslsocket
+except ImportError:
+ CERT_REQUIRED = 2
+
+ import socket, httplib
+
+ def ssl_wrap_socket(sock, key_file, cert_file,
+ cert_reqs=CERT_REQUIRED, ca_certs=None):
+ if not util.safehasattr(socket, 'ssl'):
+ raise util.Abort(_('Python SSL support not found'))
+ if ca_certs:
+ raise util.Abort(_(
+ 'certificate checking requires Python 2.6'))
+
+ ssl = socket.ssl(sock, key_file, cert_file)
+ return httplib.FakeSocket(sock, ssl)
+
+def _verifycert(cert, hostname):
+ '''Verify that cert (in socket.getpeercert() format) matches hostname.
+ CRLs is not handled.
+
+ Returns error message if any problems are found and None on success.
+ '''
+ if not cert:
+ return _('no certificate received')
+ dnsname = hostname.lower()
+ def matchdnsname(certname):
+ return (certname == dnsname or
+ '.' in dnsname and certname == '*.' + dnsname.split('.', 1)[1])
+
+ san = cert.get('subjectAltName', [])
+ if san:
+ certnames = [value.lower() for key, value in san if key == 'DNS']
+ for name in certnames:
+ if matchdnsname(name):
+ return None
+ if certnames:
+ return _('certificate is for %s') % ', '.join(certnames)
+
+ # subject is only checked when subjectAltName is empty
+ for s in cert.get('subject', []):
+ key, value = s[0]
+ if key == 'commonName':
+ try:
+ # 'subject' entries are unicode
+ certname = value.lower().encode('ascii')
+ except UnicodeEncodeError:
+ return _('IDN in certificate not supported')
+ if matchdnsname(certname):
+ return None
+ return _('certificate is for %s') % certname
+ return _('no commonName or subjectAltName found in certificate')
+
+
+# CERT_REQUIRED means fetch the cert from the server all the time AND
+# validate it against the CA store provided in web.cacerts.
+#
+# We COMPLETELY ignore CERT_REQUIRED on Python <= 2.5, as it's totally
+# busted on those versions.
+
+def sslkwargs(ui, host):
+ cacerts = ui.config('web', 'cacerts')
+ hostfingerprint = ui.config('hostfingerprints', host)
+ if cacerts and not hostfingerprint:
+ cacerts = util.expandpath(cacerts)
+ if not os.path.exists(cacerts):
+ raise util.Abort(_('could not find web.cacerts: %s') % cacerts)
+ return {'ca_certs': cacerts,
+ 'cert_reqs': CERT_REQUIRED,
+ }
+ return {}
+
+class validator(object):
+ def __init__(self, ui, host):
+ self.ui = ui
+ self.host = host
+
+ def __call__(self, sock):
+ host = self.host
+ cacerts = self.ui.config('web', 'cacerts')
+ hostfingerprint = self.ui.config('hostfingerprints', host)
+ if not getattr(sock, 'getpeercert', False): # python 2.5 ?
+ if hostfingerprint:
+ raise util.Abort(_("host fingerprint for %s can't be "
+ "verified (Python too old)") % host)
+ if self.ui.configbool('ui', 'reportoldssl', True):
+ self.ui.warn(_("warning: certificate for %s can't be verified "
+ "(Python too old)\n") % host)
+ return
+ if not sock.cipher(): # work around http://bugs.python.org/issue13721
+ raise util.Abort(_('%s ssl connection error') % host)
+ peercert = sock.getpeercert(True)
+ if not peercert:
+ raise util.Abort(_('%s certificate error: '
+ 'no certificate received') % host)
+ peerfingerprint = util.sha1(peercert).hexdigest()
+ nicefingerprint = ":".join([peerfingerprint[x:x + 2]
+ for x in xrange(0, len(peerfingerprint), 2)])
+ if hostfingerprint:
+ if peerfingerprint.lower() != \
+ hostfingerprint.replace(':', '').lower():
+ raise util.Abort(_('certificate for %s has unexpected '
+ 'fingerprint %s') % (host, nicefingerprint),
+ hint=_('check hostfingerprint configuration'))
+ self.ui.debug('%s certificate matched fingerprint %s\n' %
+ (host, nicefingerprint))
+ elif cacerts:
+ msg = _verifycert(sock.getpeercert(), host)
+ if msg:
+ raise util.Abort(_('%s certificate error: %s') % (host, msg),
+ hint=_('configure hostfingerprint %s or use '
+ '--insecure to connect insecurely') %
+ nicefingerprint)
+ self.ui.debug('%s certificate successfully verified\n' % host)
+ else:
+ self.ui.warn(_('warning: %s certificate with fingerprint %s not '
+ 'verified (check hostfingerprints or web.cacerts '
+ 'config setting)\n') %
+ (host, nicefingerprint))
diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
new file mode 100644
index 0000000..c9274cd
--- /dev/null
+++ b/mercurial/statichttprepo.py
@@ -0,0 +1,154 @@
+# statichttprepo.py - simple http repository class for mercurial
+#
+# This provides read-only repo access to repositories exported via static http
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import changelog, byterange, url, error
+import localrepo, manifest, util, scmutil, store
+import urllib, urllib2, errno
+
+class httprangereader(object):
+ def __init__(self, url, opener):
+ # we assume opener has HTTPRangeHandler
+ self.url = url
+ self.pos = 0
+ self.opener = opener
+ self.name = url
+ def seek(self, pos):
+ self.pos = pos
+ def read(self, bytes=None):
+ req = urllib2.Request(self.url)
+ end = ''
+ if bytes:
+ end = self.pos + bytes - 1
+ if self.pos or end:
+ req.add_header('Range', 'bytes=%d-%s' % (self.pos, end))
+
+ try:
+ f = self.opener.open(req)
+ data = f.read()
+ # Python 2.6+ defines a getcode() function, and 2.4 and
+ # 2.5 appear to always have an undocumented code attribute
+ # set. If we can't read either of those, fall back to 206
+ # and hope for the best.
+ code = getattr(f, 'getcode', lambda : getattr(f, 'code', 206))()
+ except urllib2.HTTPError, inst:
+ num = inst.code == 404 and errno.ENOENT or None
+ raise IOError(num, inst)
+ except urllib2.URLError, inst:
+ raise IOError(None, inst.reason[1])
+
+ if code == 200:
+ # HTTPRangeHandler does nothing if remote does not support
+ # Range headers and returns the full entity. Let's slice it.
+ if bytes:
+ data = data[self.pos:self.pos + bytes]
+ else:
+ data = data[self.pos:]
+ elif bytes:
+ data = data[:bytes]
+ self.pos += len(data)
+ return data
+ def __iter__(self):
+ return iter(self.read().splitlines(1))
+ def close(self):
+ pass
+
+def build_opener(ui, authinfo):
+ # urllib cannot handle URLs with embedded user or passwd
+ urlopener = url.opener(ui, authinfo)
+ urlopener.add_handler(byterange.HTTPRangeHandler())
+
+ class statichttpopener(scmutil.abstractopener):
+ def __init__(self, base):
+ self.base = base
+
+ def __call__(self, path, mode="r", atomictemp=None):
+ if mode not in ('r', 'rb'):
+ raise IOError('Permission denied')
+ f = "/".join((self.base, urllib.quote(path)))
+ return httprangereader(f, urlopener)
+
+ return statichttpopener
+
+class statichttppeer(localrepo.localpeer):
+ def local(self):
+ return None
+ def canpush(self):
+ return False
+
+class statichttprepository(localrepo.localrepository):
+ def __init__(self, ui, path):
+ self._url = path
+ self.ui = ui
+
+ self.root = path
+ u = util.url(path.rstrip('/') + "/.hg")
+ self.path, authinfo = u.authinfo()
+
+ opener = build_opener(ui, authinfo)
+ self.opener = opener(self.path)
+ self.vfs = self.opener
+ self._phasedefaults = []
+
+ try:
+ requirements = scmutil.readrequires(self.opener, self.supported)
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ requirements = set()
+
+ # check if it is a non-empty old-style repository
+ try:
+ fp = self.opener("00changelog.i")
+ fp.read(1)
+ fp.close()
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ # we do not care about empty old-style repositories here
+ msg = _("'%s' does not appear to be an hg repository") % path
+ raise error.RepoError(msg)
+
+ # setup store
+ self.store = store.store(requirements, self.path, opener)
+ self.spath = self.store.path
+ self.sopener = self.store.opener
+ self.svfs = self.sopener
+ self.sjoin = self.store.join
+ self._filecache = {}
+ self.requirements = requirements
+
+ self.manifest = manifest.manifest(self.sopener)
+ self.changelog = changelog.changelog(self.sopener)
+ self._tags = None
+ self.nodetagscache = None
+ self._branchcache = None
+ self._branchcachetip = None
+ self.encodepats = None
+ self.decodepats = None
+
+ def _restrictcapabilities(self, caps):
+ return caps.difference(["pushkey"])
+
+ def url(self):
+ return self._url
+
+ def local(self):
+ return False
+
+ def peer(self):
+ return statichttppeer(self)
+
+ def lock(self, wait=True):
+ raise util.Abort(_('cannot lock static-http repository'))
+
+def instance(ui, path, create):
+ if create:
+ raise util.Abort(_('cannot create new static-http repository'))
+ return statichttprepository(ui, path[7:])
diff --git a/mercurial/store.py b/mercurial/store.py
new file mode 100644
index 0000000..b6eb8b3
--- /dev/null
+++ b/mercurial/store.py
@@ -0,0 +1,430 @@
+# store.py - repository store handling for Mercurial
+#
+# Copyright 2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import osutil, scmutil, util
+import os, stat
+
+_sha = util.sha1
+
+# This avoids a collision between a file named foo and a dir named
+# foo.i or foo.d
+def encodedir(path):
+ '''
+ >>> encodedir('data/foo.i')
+ 'data/foo.i'
+ >>> encodedir('data/foo.i/bla.i')
+ 'data/foo.i.hg/bla.i'
+ >>> encodedir('data/foo.i.hg/bla.i')
+ 'data/foo.i.hg.hg/bla.i'
+ '''
+ if not path.startswith('data/'):
+ return path
+ return (path
+ .replace(".hg/", ".hg.hg/")
+ .replace(".i/", ".i.hg/")
+ .replace(".d/", ".d.hg/"))
+
+def decodedir(path):
+ '''
+ >>> decodedir('data/foo.i')
+ 'data/foo.i'
+ >>> decodedir('data/foo.i.hg/bla.i')
+ 'data/foo.i/bla.i'
+ >>> decodedir('data/foo.i.hg.hg/bla.i')
+ 'data/foo.i.hg/bla.i'
+ '''
+ if not path.startswith('data/') or ".hg/" not in path:
+ return path
+ return (path
+ .replace(".d.hg/", ".d/")
+ .replace(".i.hg/", ".i/")
+ .replace(".hg.hg/", ".hg/"))
+
+def _buildencodefun():
+ '''
+ >>> enc, dec = _buildencodefun()
+
+ >>> enc('nothing/special.txt')
+ 'nothing/special.txt'
+ >>> dec('nothing/special.txt')
+ 'nothing/special.txt'
+
+ >>> enc('HELLO')
+ '_h_e_l_l_o'
+ >>> dec('_h_e_l_l_o')
+ 'HELLO'
+
+ >>> enc('hello:world?')
+ 'hello~3aworld~3f'
+ >>> dec('hello~3aworld~3f')
+ 'hello:world?'
+
+ >>> enc('the\x07quick\xADshot')
+ 'the~07quick~adshot'
+ >>> dec('the~07quick~adshot')
+ 'the\\x07quick\\xadshot'
+ '''
+ e = '_'
+ winreserved = [ord(x) for x in '\\:*?"<>|']
+ cmap = dict([(chr(x), chr(x)) for x in xrange(127)])
+ for x in (range(32) + range(126, 256) + winreserved):
+ cmap[chr(x)] = "~%02x" % x
+ for x in range(ord("A"), ord("Z")+1) + [ord(e)]:
+ cmap[chr(x)] = e + chr(x).lower()
+ dmap = {}
+ for k, v in cmap.iteritems():
+ dmap[v] = k
+ def decode(s):
+ i = 0
+ while i < len(s):
+ for l in xrange(1, 4):
+ try:
+ yield dmap[s[i:i + l]]
+ i += l
+ break
+ except KeyError:
+ pass
+ else:
+ raise KeyError
+ return (lambda s: "".join([cmap[c] for c in encodedir(s)]),
+ lambda s: decodedir("".join(list(decode(s)))))
+
+encodefilename, decodefilename = _buildencodefun()
+
+def _buildlowerencodefun():
+ '''
+ >>> f = _buildlowerencodefun()
+ >>> f('nothing/special.txt')
+ 'nothing/special.txt'
+ >>> f('HELLO')
+ 'hello'
+ >>> f('hello:world?')
+ 'hello~3aworld~3f'
+ >>> f('the\x07quick\xADshot')
+ 'the~07quick~adshot'
+ '''
+ winreserved = [ord(x) for x in '\\:*?"<>|']
+ cmap = dict([(chr(x), chr(x)) for x in xrange(127)])
+ for x in (range(32) + range(126, 256) + winreserved):
+ cmap[chr(x)] = "~%02x" % x
+ for x in range(ord("A"), ord("Z")+1):
+ cmap[chr(x)] = chr(x).lower()
+ return lambda s: "".join([cmap[c] for c in s])
+
+lowerencode = _buildlowerencodefun()
+
+_winreservednames = '''con prn aux nul
+ com1 com2 com3 com4 com5 com6 com7 com8 com9
+ lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9'''.split()
+def _auxencode(path, dotencode):
+ '''
+ Encodes filenames containing names reserved by Windows or which end in
+ period or space. Does not touch other single reserved characters c.
+ Specifically, c in '\\:*?"<>|' or ord(c) <= 31 are *not* encoded here.
+ Additionally encodes space or period at the beginning, if dotencode is
+ True.
+ path is assumed to be all lowercase.
+
+ >>> _auxencode('.foo/aux.txt/txt.aux/con/prn/nul/foo.', True)
+ '~2efoo/au~78.txt/txt.aux/co~6e/pr~6e/nu~6c/foo~2e'
+ >>> _auxencode('.com1com2/lpt9.lpt4.lpt1/conprn/foo.', False)
+ '.com1com2/lp~749.lpt4.lpt1/conprn/foo~2e'
+ >>> _auxencode('foo. ', True)
+ 'foo.~20'
+ >>> _auxencode(' .foo', True)
+ '~20.foo'
+ '''
+ res = []
+ for n in path.split('/'):
+ if n:
+ base = n.split('.')[0]
+ if base and (base in _winreservednames):
+ # encode third letter ('aux' -> 'au~78')
+ ec = "~%02x" % ord(n[2])
+ n = n[0:2] + ec + n[3:]
+ if n[-1] in '. ':
+ # encode last period or space ('foo...' -> 'foo..~2e')
+ n = n[:-1] + "~%02x" % ord(n[-1])
+ if dotencode and n[0] in '. ':
+ n = "~%02x" % ord(n[0]) + n[1:]
+ res.append(n)
+ return '/'.join(res)
+
+_maxstorepathlen = 120
+_dirprefixlen = 8
+_maxshortdirslen = 8 * (_dirprefixlen + 1) - 4
+def _hybridencode(path, auxencode):
+ '''encodes path with a length limit
+
+ Encodes all paths that begin with 'data/', according to the following.
+
+ Default encoding (reversible):
+
+ Encodes all uppercase letters 'X' as '_x'. All reserved or illegal
+ characters are encoded as '~xx', where xx is the two digit hex code
+ of the character (see encodefilename).
+ Relevant path components consisting of Windows reserved filenames are
+ masked by encoding the third character ('aux' -> 'au~78', see auxencode).
+
+ Hashed encoding (not reversible):
+
+ If the default-encoded path is longer than _maxstorepathlen, a
+ non-reversible hybrid hashing of the path is done instead.
+ This encoding uses up to _dirprefixlen characters of all directory
+ levels of the lowerencoded path, but not more levels than can fit into
+ _maxshortdirslen.
+ Then follows the filler followed by the sha digest of the full path.
+ The filler is the beginning of the basename of the lowerencoded path
+ (the basename is everything after the last path separator). The filler
+ is as long as possible, filling in characters from the basename until
+ the encoded path has _maxstorepathlen characters (or all chars of the
+ basename have been taken).
+ The extension (e.g. '.i' or '.d') is preserved.
+
+ The string 'data/' at the beginning is replaced with 'dh/', if the hashed
+ encoding was used.
+ '''
+ if not path.startswith('data/'):
+ return path
+ # escape directories ending with .i and .d
+ path = encodedir(path)
+ ndpath = path[len('data/'):]
+ res = 'data/' + auxencode(encodefilename(ndpath))
+ if len(res) > _maxstorepathlen:
+ digest = _sha(path).hexdigest()
+ aep = auxencode(lowerencode(ndpath))
+ _root, ext = os.path.splitext(aep)
+ parts = aep.split('/')
+ basename = parts[-1]
+ sdirs = []
+ for p in parts[:-1]:
+ d = p[:_dirprefixlen]
+ if d[-1] in '. ':
+ # Windows can't access dirs ending in period or space
+ d = d[:-1] + '_'
+ t = '/'.join(sdirs) + '/' + d
+ if len(t) > _maxshortdirslen:
+ break
+ sdirs.append(d)
+ dirs = '/'.join(sdirs)
+ if len(dirs) > 0:
+ dirs += '/'
+ res = 'dh/' + dirs + digest + ext
+ spaceleft = _maxstorepathlen - len(res)
+ if spaceleft > 0:
+ filler = basename[:spaceleft]
+ res = 'dh/' + dirs + filler + digest + ext
+ return res
+
+def _calcmode(path):
+ try:
+ # files in .hg/ will be created using this mode
+ mode = os.stat(path).st_mode
+ # avoid some useless chmods
+ if (0777 & ~util.umask) == (0777 & mode):
+ mode = None
+ except OSError:
+ mode = None
+ return mode
+
+_data = ('data 00manifest.d 00manifest.i 00changelog.d 00changelog.i'
+ ' phaseroots obsstore')
+
+class basicstore(object):
+ '''base class for local repository stores'''
+ def __init__(self, path, openertype):
+ self.path = path
+ self.createmode = _calcmode(path)
+ op = openertype(self.path)
+ op.createmode = self.createmode
+ self.opener = scmutil.filteropener(op, encodedir)
+
+ def join(self, f):
+ return self.path + '/' + encodedir(f)
+
+ def _walk(self, relpath, recurse):
+ '''yields (unencoded, encoded, size)'''
+ path = self.path
+ if relpath:
+ path += '/' + relpath
+ striplen = len(self.path) + 1
+ l = []
+ if os.path.isdir(path):
+ visit = [path]
+ while visit:
+ p = visit.pop()
+ for f, kind, st in osutil.listdir(p, stat=True):
+ fp = p + '/' + f
+ if kind == stat.S_IFREG and f[-2:] in ('.d', '.i'):
+ n = util.pconvert(fp[striplen:])
+ l.append((decodedir(n), n, st.st_size))
+ elif kind == stat.S_IFDIR and recurse:
+ visit.append(fp)
+ l.sort()
+ return l
+
+ def datafiles(self):
+ return self._walk('data', True)
+
+ def walk(self):
+ '''yields (unencoded, encoded, size)'''
+ # yield data files first
+ for x in self.datafiles():
+ yield x
+ # yield manifest before changelog
+ for x in reversed(self._walk('', False)):
+ yield x
+
+ def copylist(self):
+ return ['requires'] + _data.split()
+
+ def write(self):
+ pass
+
+class encodedstore(basicstore):
+ def __init__(self, path, openertype):
+ self.path = path + '/store'
+ self.createmode = _calcmode(self.path)
+ op = openertype(self.path)
+ op.createmode = self.createmode
+ self.opener = scmutil.filteropener(op, encodefilename)
+
+ def datafiles(self):
+ for a, b, size in self._walk('data', True):
+ try:
+ a = decodefilename(a)
+ except KeyError:
+ a = None
+ yield a, b, size
+
+ def join(self, f):
+ return self.path + '/' + encodefilename(f)
+
+ def copylist(self):
+ return (['requires', '00changelog.i'] +
+ ['store/' + f for f in _data.split()])
+
+class fncache(object):
+ # the filename used to be partially encoded
+ # hence the encodedir/decodedir dance
+ def __init__(self, opener):
+ self.opener = opener
+ self.entries = None
+ self._dirty = False
+
+ def _load(self):
+ '''fill the entries from the fncache file'''
+ self._dirty = False
+ try:
+ fp = self.opener('fncache', mode='rb')
+ except IOError:
+ # skip nonexistent file
+ self.entries = set()
+ return
+ self.entries = set(map(decodedir, fp.read().splitlines()))
+ if '' in self.entries:
+ fp.seek(0)
+ for n, line in enumerate(fp):
+ if not line.rstrip('\n'):
+ t = _('invalid entry in fncache, line %s') % (n + 1)
+ raise util.Abort(t)
+ fp.close()
+
+ def _write(self, files, atomictemp):
+ fp = self.opener('fncache', mode='wb', atomictemp=atomictemp)
+ if files:
+ fp.write('\n'.join(map(encodedir, files)) + '\n')
+ fp.close()
+ self._dirty = False
+
+ def rewrite(self, files):
+ self._write(files, False)
+ self.entries = set(files)
+
+ def write(self):
+ if self._dirty:
+ self._write(self.entries, True)
+
+ def add(self, fn):
+ if self.entries is None:
+ self._load()
+ if fn not in self.entries:
+ self._dirty = True
+ self.entries.add(fn)
+
+ def __contains__(self, fn):
+ if self.entries is None:
+ self._load()
+ return fn in self.entries
+
+ def __iter__(self):
+ if self.entries is None:
+ self._load()
+ return iter(self.entries)
+
+class _fncacheopener(scmutil.abstractopener):
+ def __init__(self, op, fnc, encode):
+ self.opener = op
+ self.fncache = fnc
+ self.encode = encode
+
+ def __call__(self, path, mode='r', *args, **kw):
+ if mode not in ('r', 'rb') and path.startswith('data/'):
+ self.fncache.add(path)
+ return self.opener(self.encode(path), mode, *args, **kw)
+
+class fncachestore(basicstore):
+ def __init__(self, path, openertype, encode):
+ self.encode = encode
+ self.path = path + '/store'
+ self.createmode = _calcmode(self.path)
+ op = openertype(self.path)
+ op.createmode = self.createmode
+ fnc = fncache(op)
+ self.fncache = fnc
+ self.opener = _fncacheopener(op, fnc, encode)
+
+ def join(self, f):
+ return self.path + '/' + self.encode(f)
+
+ def getsize(self, path):
+ return os.stat(self.path + '/' + path).st_size
+
+ def datafiles(self):
+ rewrite = False
+ existing = []
+ for f in self.fncache:
+ ef = self.encode(f)
+ try:
+ yield f, ef, self.getsize(ef)
+ existing.append(f)
+ except OSError:
+ # nonexistent entry
+ rewrite = True
+ if rewrite:
+ # rewrite fncache to remove nonexistent entries
+ # (may be caused by rollback / strip)
+ self.fncache.rewrite(existing)
+
+ def copylist(self):
+ d = ('data dh fncache phaseroots obsstore'
+ ' 00manifest.d 00manifest.i 00changelog.d 00changelog.i')
+ return (['requires', '00changelog.i'] +
+ ['store/' + f for f in d.split()])
+
+ def write(self):
+ self.fncache.write()
+
+def store(requirements, path, openertype):
+ if 'store' in requirements:
+ if 'fncache' in requirements:
+ auxencode = lambda f: _auxencode(f, 'dotencode' in requirements)
+ encode = lambda f: _hybridencode(f, auxencode)
+ return fncachestore(path, openertype, encode)
+ return encodedstore(path, openertype)
+ return basicstore(path, openertype)
diff --git a/mercurial/strutil.py b/mercurial/strutil.py
new file mode 100644
index 0000000..b33fb6b
--- /dev/null
+++ b/mercurial/strutil.py
@@ -0,0 +1,34 @@
+# strutil.py - string utilities for Mercurial
+#
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+def findall(haystack, needle, start=0, end=None):
+ if end is None:
+ end = len(haystack)
+ if end < 0:
+ end += len(haystack)
+ if start < 0:
+ start += len(haystack)
+ while start < end:
+ c = haystack.find(needle, start, end)
+ if c == -1:
+ break
+ yield c
+ start = c + 1
+
+def rfindall(haystack, needle, start=0, end=None):
+ if end is None:
+ end = len(haystack)
+ if end < 0:
+ end += len(haystack)
+ if start < 0:
+ start += len(haystack)
+ while end >= 0:
+ c = haystack.rfind(needle, start, end)
+ if c == -1:
+ break
+ yield c
+ end = c - 1
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
new file mode 100644
index 0000000..437d8b9
--- /dev/null
+++ b/mercurial/subrepo.py
@@ -0,0 +1,1273 @@
+# subrepo.py - sub-repository handling for Mercurial
+#
+# Copyright 2009-2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import errno, os, re, xml.dom.minidom, shutil, posixpath
+import stat, subprocess, tarfile
+from i18n import _
+import config, scmutil, util, node, error, cmdutil, bookmarks, match as matchmod
+hg = None
+propertycache = util.propertycache
+
+nullstate = ('', '', 'empty')
+
+def state(ctx, ui):
+ """return a state dict, mapping subrepo paths configured in .hgsub
+ to tuple: (source from .hgsub, revision from .hgsubstate, kind
+ (key in types dict))
+ """
+ p = config.config()
+ def read(f, sections=None, remap=None):
+ if f in ctx:
+ try:
+ data = ctx[f].data()
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ # handle missing subrepo spec files as removed
+ ui.warn(_("warning: subrepo spec file %s not found\n") % f)
+ return
+ p.parse(f, data, sections, remap, read)
+ else:
+ raise util.Abort(_("subrepo spec file %s not found") % f)
+
+ if '.hgsub' in ctx:
+ read('.hgsub')
+
+ for path, src in ui.configitems('subpaths'):
+ p.set('subpaths', path, src, ui.configsource('subpaths', path))
+
+ rev = {}
+ if '.hgsubstate' in ctx:
+ try:
+ for i, l in enumerate(ctx['.hgsubstate'].data().splitlines()):
+ l = l.lstrip()
+ if not l:
+ continue
+ try:
+ revision, path = l.split(" ", 1)
+ except ValueError:
+ raise util.Abort(_("invalid subrepository revision "
+ "specifier in .hgsubstate line %d")
+ % (i + 1))
+ rev[path] = revision
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+
+ def remap(src):
+ for pattern, repl in p.items('subpaths'):
+ # Turn r'C:\foo\bar' into r'C:\\foo\\bar' since re.sub
+ # does a string decode.
+ repl = repl.encode('string-escape')
+ # However, we still want to allow back references to go
+ # through unharmed, so we turn r'\\1' into r'\1'. Again,
+ # extra escapes are needed because re.sub string decodes.
+ repl = re.sub(r'\\\\([0-9]+)', r'\\\1', repl)
+ try:
+ src = re.sub(pattern, repl, src, 1)
+ except re.error, e:
+ raise util.Abort(_("bad subrepository pattern in %s: %s")
+ % (p.source('subpaths', pattern), e))
+ return src
+
+ state = {}
+ for path, src in p[''].items():
+ kind = 'hg'
+ if src.startswith('['):
+ if ']' not in src:
+ raise util.Abort(_('missing ] in subrepo source'))
+ kind, src = src.split(']', 1)
+ kind = kind[1:]
+ src = src.lstrip() # strip any extra whitespace after ']'
+
+ if not util.url(src).isabs():
+ parent = _abssource(ctx._repo, abort=False)
+ if parent:
+ parent = util.url(parent)
+ parent.path = posixpath.join(parent.path or '', src)
+ parent.path = posixpath.normpath(parent.path)
+ joined = str(parent)
+ # Remap the full joined path and use it if it changes,
+ # else remap the original source.
+ remapped = remap(joined)
+ if remapped == joined:
+ src = remap(src)
+ else:
+ src = remapped
+
+ src = remap(src)
+ state[util.pconvert(path)] = (src.strip(), rev.get(path, ''), kind)
+
+ return state
+
+def writestate(repo, state):
+ """rewrite .hgsubstate in (outer) repo with these subrepo states"""
+ lines = ['%s %s\n' % (state[s][1], s) for s in sorted(state)]
+ repo.wwrite('.hgsubstate', ''.join(lines), '')
+
+def submerge(repo, wctx, mctx, actx, overwrite):
+ """delegated from merge.applyupdates: merging of .hgsubstate file
+ in working context, merging context and ancestor context"""
+ if mctx == actx: # backwards?
+ actx = wctx.p1()
+ s1 = wctx.substate
+ s2 = mctx.substate
+ sa = actx.substate
+ sm = {}
+
+ repo.ui.debug("subrepo merge %s %s %s\n" % (wctx, mctx, actx))
+
+ def debug(s, msg, r=""):
+ if r:
+ r = "%s:%s:%s" % r
+ repo.ui.debug(" subrepo %s: %s %s\n" % (s, msg, r))
+
+ for s, l in s1.items():
+ a = sa.get(s, nullstate)
+ ld = l # local state with possible dirty flag for compares
+ if wctx.sub(s).dirty():
+ ld = (l[0], l[1] + "+")
+ if wctx == actx: # overwrite
+ a = ld
+
+ if s in s2:
+ r = s2[s]
+ if ld == r or r == a: # no change or local is newer
+ sm[s] = l
+ continue
+ elif ld == a: # other side changed
+ debug(s, "other changed, get", r)
+ wctx.sub(s).get(r, overwrite)
+ sm[s] = r
+ elif ld[0] != r[0]: # sources differ
+ if repo.ui.promptchoice(
+ _(' subrepository sources for %s differ\n'
+ 'use (l)ocal source (%s) or (r)emote source (%s)?')
+ % (s, l[0], r[0]),
+ (_('&Local'), _('&Remote')), 0):
+ debug(s, "prompt changed, get", r)
+ wctx.sub(s).get(r, overwrite)
+ sm[s] = r
+ elif ld[1] == a[1]: # local side is unchanged
+ debug(s, "other side changed, get", r)
+ wctx.sub(s).get(r, overwrite)
+ sm[s] = r
+ else:
+ debug(s, "both sides changed, merge with", r)
+ wctx.sub(s).merge(r)
+ sm[s] = l
+ elif ld == a: # remote removed, local unchanged
+ debug(s, "remote removed, remove")
+ wctx.sub(s).remove()
+ elif a == nullstate: # not present in remote or ancestor
+ debug(s, "local added, keep")
+ sm[s] = l
+ continue
+ else:
+ if repo.ui.promptchoice(
+ _(' local changed subrepository %s which remote removed\n'
+ 'use (c)hanged version or (d)elete?') % s,
+ (_('&Changed'), _('&Delete')), 0):
+ debug(s, "prompt remove")
+ wctx.sub(s).remove()
+
+ for s, r in sorted(s2.items()):
+ if s in s1:
+ continue
+ elif s not in sa:
+ debug(s, "remote added, get", r)
+ mctx.sub(s).get(r)
+ sm[s] = r
+ elif r != sa[s]:
+ if repo.ui.promptchoice(
+ _(' remote changed subrepository %s which local removed\n'
+ 'use (c)hanged version or (d)elete?') % s,
+ (_('&Changed'), _('&Delete')), 0) == 0:
+ debug(s, "prompt recreate", r)
+ wctx.sub(s).get(r)
+ sm[s] = r
+
+ # record merged .hgsubstate
+ writestate(repo, sm)
+
+def _updateprompt(ui, sub, dirty, local, remote):
+ if dirty:
+ msg = (_(' subrepository sources for %s differ\n'
+ 'use (l)ocal source (%s) or (r)emote source (%s)?\n')
+ % (subrelpath(sub), local, remote))
+ else:
+ msg = (_(' subrepository sources for %s differ (in checked out '
+ 'version)\n'
+ 'use (l)ocal source (%s) or (r)emote source (%s)?\n')
+ % (subrelpath(sub), local, remote))
+ return ui.promptchoice(msg, (_('&Local'), _('&Remote')), 0)
+
+def reporelpath(repo):
+ """return path to this (sub)repo as seen from outermost repo"""
+ parent = repo
+ while util.safehasattr(parent, '_subparent'):
+ parent = parent._subparent
+ p = parent.root.rstrip(os.sep)
+ return repo.root[len(p) + 1:]
+
+def subrelpath(sub):
+ """return path to this subrepo as seen from outermost repo"""
+ if util.safehasattr(sub, '_relpath'):
+ return sub._relpath
+ if not util.safehasattr(sub, '_repo'):
+ return sub._path
+ return reporelpath(sub._repo)
+
+def _abssource(repo, push=False, abort=True):
+ """return pull/push path of repo - either based on parent repo .hgsub info
+ or on the top repo config. Abort or return None if no source found."""
+ if util.safehasattr(repo, '_subparent'):
+ source = util.url(repo._subsource)
+ if source.isabs():
+ return str(source)
+ source.path = posixpath.normpath(source.path)
+ parent = _abssource(repo._subparent, push, abort=False)
+ if parent:
+ parent = util.url(util.pconvert(parent))
+ parent.path = posixpath.join(parent.path or '', source.path)
+ parent.path = posixpath.normpath(parent.path)
+ return str(parent)
+ else: # recursion reached top repo
+ if util.safehasattr(repo, '_subtoppath'):
+ return repo._subtoppath
+ if push and repo.ui.config('paths', 'default-push'):
+ return repo.ui.config('paths', 'default-push')
+ if repo.ui.config('paths', 'default'):
+ return repo.ui.config('paths', 'default')
+ if abort:
+ raise util.Abort(_("default path for subrepository %s not found") %
+ reporelpath(repo))
+
+def itersubrepos(ctx1, ctx2):
+ """find subrepos in ctx1 or ctx2"""
+ # Create a (subpath, ctx) mapping where we prefer subpaths from
+ # ctx1. The subpaths from ctx2 are important when the .hgsub file
+ # has been modified (in ctx2) but not yet committed (in ctx1).
+ subpaths = dict.fromkeys(ctx2.substate, ctx2)
+ subpaths.update(dict.fromkeys(ctx1.substate, ctx1))
+ for subpath, ctx in sorted(subpaths.iteritems()):
+ yield subpath, ctx.sub(subpath)
+
+def subrepo(ctx, path):
+ """return instance of the right subrepo class for subrepo in path"""
+ # subrepo inherently violates our import layering rules
+ # because it wants to make repo objects from deep inside the stack
+ # so we manually delay the circular imports to not break
+ # scripts that don't use our demand-loading
+ global hg
+ import hg as h
+ hg = h
+
+ scmutil.pathauditor(ctx._repo.root)(path)
+ state = ctx.substate[path]
+ if state[2] not in types:
+ raise util.Abort(_('unknown subrepo type %s') % state[2])
+ return types[state[2]](ctx, path, state[:2])
+
+# subrepo classes need to implement the following abstract class:
+
+class abstractsubrepo(object):
+
+ def dirty(self, ignoreupdate=False):
+ """returns true if the dirstate of the subrepo is dirty or does not
+ match current stored state. If ignoreupdate is true, only check
+ whether the subrepo has uncommitted changes in its dirstate.
+ """
+ raise NotImplementedError
+
+ def basestate(self):
+ """current working directory base state, disregarding .hgsubstate
+ state and working directory modifications"""
+ raise NotImplementedError
+
+ def checknested(self, path):
+ """check if path is a subrepository within this repository"""
+ return False
+
+ def commit(self, text, user, date):
+ """commit the current changes to the subrepo with the given
+ log message. Use given user and date if possible. Return the
+ new state of the subrepo.
+ """
+ raise NotImplementedError
+
+ def remove(self):
+ """remove the subrepo
+
+ (should verify the dirstate is not dirty first)
+ """
+ raise NotImplementedError
+
+ def get(self, state, overwrite=False):
+ """run whatever commands are needed to put the subrepo into
+ this state
+ """
+ raise NotImplementedError
+
+ def merge(self, state):
+ """merge currently-saved state with the new state."""
+ raise NotImplementedError
+
+ def push(self, opts):
+ """perform whatever action is analogous to 'hg push'
+
+ This may be a no-op on some systems.
+ """
+ raise NotImplementedError
+
+ def add(self, ui, match, dryrun, listsubrepos, prefix, explicitonly):
+ return []
+
+ def status(self, rev2, **opts):
+ return [], [], [], [], [], [], []
+
+ def diff(self, diffopts, node2, match, prefix, **opts):
+ pass
+
+ def outgoing(self, ui, dest, opts):
+ return 1
+
+ def incoming(self, ui, source, opts):
+ return 1
+
+ def files(self):
+ """return filename iterator"""
+ raise NotImplementedError
+
+ def filedata(self, name):
+ """return file data"""
+ raise NotImplementedError
+
+ def fileflags(self, name):
+ """return file flags"""
+ return ''
+
+ def archive(self, ui, archiver, prefix, match=None):
+ if match is not None:
+ files = [f for f in self.files() if match(f)]
+ else:
+ files = self.files()
+ total = len(files)
+ relpath = subrelpath(self)
+ ui.progress(_('archiving (%s)') % relpath, 0,
+ unit=_('files'), total=total)
+ for i, name in enumerate(files):
+ flags = self.fileflags(name)
+ mode = 'x' in flags and 0755 or 0644
+ symlink = 'l' in flags
+ archiver.addfile(os.path.join(prefix, self._path, name),
+ mode, symlink, self.filedata(name))
+ ui.progress(_('archiving (%s)') % relpath, i + 1,
+ unit=_('files'), total=total)
+ ui.progress(_('archiving (%s)') % relpath, None)
+
+ def walk(self, match):
+ '''
+ walk recursively through the directory tree, finding all files
+ matched by the match function
+ '''
+ pass
+
+ def forget(self, ui, match, prefix):
+ return ([], [])
+
+ def revert(self, ui, substate, *pats, **opts):
+ ui.warn('%s: reverting %s subrepos is unsupported\n' \
+ % (substate[0], substate[2]))
+ return []
+
+class hgsubrepo(abstractsubrepo):
+ def __init__(self, ctx, path, state):
+ self._path = path
+ self._state = state
+ r = ctx._repo
+ root = r.wjoin(path)
+ create = False
+ if not os.path.exists(os.path.join(root, '.hg')):
+ create = True
+ util.makedirs(root)
+ self._repo = hg.repository(r.ui, root, create=create)
+ self._initrepo(r, state[0], create)
+
+ def _initrepo(self, parentrepo, source, create):
+ self._repo._subparent = parentrepo
+ self._repo._subsource = source
+
+ if create:
+ fp = self._repo.opener("hgrc", "w", text=True)
+ fp.write('[paths]\n')
+
+ def addpathconfig(key, value):
+ if value:
+ fp.write('%s = %s\n' % (key, value))
+ self._repo.ui.setconfig('paths', key, value)
+
+ defpath = _abssource(self._repo, abort=False)
+ defpushpath = _abssource(self._repo, True, abort=False)
+ addpathconfig('default', defpath)
+ if defpath != defpushpath:
+ addpathconfig('default-push', defpushpath)
+ fp.close()
+
+ def add(self, ui, match, dryrun, listsubrepos, prefix, explicitonly):
+ return cmdutil.add(ui, self._repo, match, dryrun, listsubrepos,
+ os.path.join(prefix, self._path), explicitonly)
+
+ def status(self, rev2, **opts):
+ try:
+ rev1 = self._state[1]
+ ctx1 = self._repo[rev1]
+ ctx2 = self._repo[rev2]
+ return self._repo.status(ctx1, ctx2, **opts)
+ except error.RepoLookupError, inst:
+ self._repo.ui.warn(_('warning: error "%s" in subrepository "%s"\n')
+ % (inst, subrelpath(self)))
+ return [], [], [], [], [], [], []
+
+ def diff(self, diffopts, node2, match, prefix, **opts):
+ try:
+ node1 = node.bin(self._state[1])
+ # We currently expect node2 to come from substate and be
+ # in hex format
+ if node2 is not None:
+ node2 = node.bin(node2)
+ cmdutil.diffordiffstat(self._repo.ui, self._repo, diffopts,
+ node1, node2, match,
+ prefix=os.path.join(prefix, self._path),
+ listsubrepos=True, **opts)
+ except error.RepoLookupError, inst:
+ self._repo.ui.warn(_('warning: error "%s" in subrepository "%s"\n')
+ % (inst, subrelpath(self)))
+
+ def archive(self, ui, archiver, prefix, match=None):
+ self._get(self._state + ('hg',))
+ abstractsubrepo.archive(self, ui, archiver, prefix, match)
+
+ rev = self._state[1]
+ ctx = self._repo[rev]
+ for subpath in ctx.substate:
+ s = subrepo(ctx, subpath)
+ submatch = matchmod.narrowmatcher(subpath, match)
+ s.archive(ui, archiver, os.path.join(prefix, self._path), submatch)
+
+ def dirty(self, ignoreupdate=False):
+ r = self._state[1]
+ if r == '' and not ignoreupdate: # no state recorded
+ return True
+ w = self._repo[None]
+ if r != w.p1().hex() and not ignoreupdate:
+ # different version checked out
+ return True
+ return w.dirty() # working directory changed
+
+ def basestate(self):
+ return self._repo['.'].hex()
+
+ def checknested(self, path):
+ return self._repo._checknested(self._repo.wjoin(path))
+
+ def commit(self, text, user, date):
+ # don't bother committing in the subrepo if it's only been
+ # updated
+ if not self.dirty(True):
+ return self._repo['.'].hex()
+ self._repo.ui.debug("committing subrepo %s\n" % subrelpath(self))
+ n = self._repo.commit(text, user, date)
+ if not n:
+ return self._repo['.'].hex() # different version checked out
+ return node.hex(n)
+
+ def remove(self):
+ # we can't fully delete the repository as it may contain
+ # local-only history
+ self._repo.ui.note(_('removing subrepo %s\n') % subrelpath(self))
+ hg.clean(self._repo, node.nullid, False)
+
+ def _get(self, state):
+ source, revision, kind = state
+ if revision not in self._repo:
+ self._repo._subsource = source
+ srcurl = _abssource(self._repo)
+ other = hg.peer(self._repo.ui, {}, srcurl)
+ if len(self._repo) == 0:
+ self._repo.ui.status(_('cloning subrepo %s from %s\n')
+ % (subrelpath(self), srcurl))
+ parentrepo = self._repo._subparent
+ shutil.rmtree(self._repo.path)
+ other, cloned = hg.clone(self._repo._subparent.ui, {},
+ other, self._repo.root,
+ update=False)
+ self._repo = cloned.local()
+ self._initrepo(parentrepo, source, create=True)
+ else:
+ self._repo.ui.status(_('pulling subrepo %s from %s\n')
+ % (subrelpath(self), srcurl))
+ self._repo.pull(other)
+ bookmarks.updatefromremote(self._repo.ui, self._repo, other,
+ srcurl)
+
+ def get(self, state, overwrite=False):
+ self._get(state)
+ source, revision, kind = state
+ self._repo.ui.debug("getting subrepo %s\n" % self._path)
+ hg.clean(self._repo, revision, False)
+
+ def merge(self, state):
+ self._get(state)
+ cur = self._repo['.']
+ dst = self._repo[state[1]]
+ anc = dst.ancestor(cur)
+
+ def mergefunc():
+ if anc == cur and dst.branch() == cur.branch():
+ self._repo.ui.debug("updating subrepo %s\n" % subrelpath(self))
+ hg.update(self._repo, state[1])
+ elif anc == dst:
+ self._repo.ui.debug("skipping subrepo %s\n" % subrelpath(self))
+ else:
+ self._repo.ui.debug("merging subrepo %s\n" % subrelpath(self))
+ hg.merge(self._repo, state[1], remind=False)
+
+ wctx = self._repo[None]
+ if self.dirty():
+ if anc != dst:
+ if _updateprompt(self._repo.ui, self, wctx.dirty(), cur, dst):
+ mergefunc()
+ else:
+ mergefunc()
+ else:
+ mergefunc()
+
+ def push(self, opts):
+ force = opts.get('force')
+ newbranch = opts.get('new_branch')
+ ssh = opts.get('ssh')
+
+ # push subrepos depth-first for coherent ordering
+ c = self._repo['']
+ subs = c.substate # only repos that are committed
+ for s in sorted(subs):
+ if c.sub(s).push(opts) == 0:
+ return False
+
+ dsturl = _abssource(self._repo, True)
+ self._repo.ui.status(_('pushing subrepo %s to %s\n') %
+ (subrelpath(self), dsturl))
+ other = hg.peer(self._repo.ui, {'ssh': ssh}, dsturl)
+ return self._repo.push(other, force, newbranch=newbranch)
+
+ def outgoing(self, ui, dest, opts):
+ return hg.outgoing(ui, self._repo, _abssource(self._repo, True), opts)
+
+ def incoming(self, ui, source, opts):
+ return hg.incoming(ui, self._repo, _abssource(self._repo, False), opts)
+
+ def files(self):
+ rev = self._state[1]
+ ctx = self._repo[rev]
+ return ctx.manifest()
+
+ def filedata(self, name):
+ rev = self._state[1]
+ return self._repo[rev][name].data()
+
+ def fileflags(self, name):
+ rev = self._state[1]
+ ctx = self._repo[rev]
+ return ctx.flags(name)
+
+ def walk(self, match):
+ ctx = self._repo[None]
+ return ctx.walk(match)
+
+ def forget(self, ui, match, prefix):
+ return cmdutil.forget(ui, self._repo, match,
+ os.path.join(prefix, self._path), True)
+
+ def revert(self, ui, substate, *pats, **opts):
+ # reverting a subrepo is a 2 step process:
+ # 1. if the no_backup is not set, revert all modified
+ # files inside the subrepo
+ # 2. update the subrepo to the revision specified in
+ # the corresponding substate dictionary
+ ui.status(_('reverting subrepo %s\n') % substate[0])
+ if not opts.get('no_backup'):
+ # Revert all files on the subrepo, creating backups
+ # Note that this will not recursively revert subrepos
+ # We could do it if there was a set:subrepos() predicate
+ opts = opts.copy()
+ opts['date'] = None
+ opts['rev'] = substate[1]
+
+ pats = []
+ if not opts['all']:
+ pats = ['set:modified()']
+ self.filerevert(ui, *pats, **opts)
+
+ # Update the repo to the revision specified in the given substate
+ self.get(substate, overwrite=True)
+
+ def filerevert(self, ui, *pats, **opts):
+ ctx = self._repo[opts['rev']]
+ parents = self._repo.dirstate.parents()
+ if opts['all']:
+ pats = ['set:modified()']
+ else:
+ pats = []
+ cmdutil.revert(ui, self._repo, ctx, parents, *pats, **opts)
+
+class svnsubrepo(abstractsubrepo):
+ def __init__(self, ctx, path, state):
+ self._path = path
+ self._state = state
+ self._ctx = ctx
+ self._ui = ctx._repo.ui
+ self._exe = util.findexe('svn')
+ if not self._exe:
+ raise util.Abort(_("'svn' executable not found for subrepo '%s'")
+ % self._path)
+
+ def _svncommand(self, commands, filename='', failok=False):
+ cmd = [self._exe]
+ extrakw = {}
+ if not self._ui.interactive():
+ # Making stdin be a pipe should prevent svn from behaving
+ # interactively even if we can't pass --non-interactive.
+ extrakw['stdin'] = subprocess.PIPE
+ # Starting in svn 1.5 --non-interactive is a global flag
+ # instead of being per-command, but we need to support 1.4 so
+ # we have to be intelligent about what commands take
+ # --non-interactive.
+ if commands[0] in ('update', 'checkout', 'commit'):
+ cmd.append('--non-interactive')
+ cmd.extend(commands)
+ if filename is not None:
+ path = os.path.join(self._ctx._repo.origroot, self._path, filename)
+ cmd.append(path)
+ env = dict(os.environ)
+ # Avoid localized output, preserve current locale for everything else.
+ env['LC_MESSAGES'] = 'C'
+ p = subprocess.Popen(cmd, bufsize=-1, close_fds=util.closefds,
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE,
+ universal_newlines=True, env=env, **extrakw)
+ stdout, stderr = p.communicate()
+ stderr = stderr.strip()
+ if not failok:
+ if p.returncode:
+ raise util.Abort(stderr or 'exited with code %d' % p.returncode)
+ if stderr:
+ self._ui.warn(stderr + '\n')
+ return stdout, stderr
+
+ @propertycache
+ def _svnversion(self):
+ output, err = self._svncommand(['--version'], filename=None)
+ m = re.search(r'^svn,\s+version\s+(\d+)\.(\d+)', output)
+ if not m:
+ raise util.Abort(_('cannot retrieve svn tool version'))
+ return (int(m.group(1)), int(m.group(2)))
+
+ def _wcrevs(self):
+ # Get the working directory revision as well as the last
+ # commit revision so we can compare the subrepo state with
+ # both. We used to store the working directory one.
+ output, err = self._svncommand(['info', '--xml'])
+ doc = xml.dom.minidom.parseString(output)
+ entries = doc.getElementsByTagName('entry')
+ lastrev, rev = '0', '0'
+ if entries:
+ rev = str(entries[0].getAttribute('revision')) or '0'
+ commits = entries[0].getElementsByTagName('commit')
+ if commits:
+ lastrev = str(commits[0].getAttribute('revision')) or '0'
+ return (lastrev, rev)
+
+ def _wcrev(self):
+ return self._wcrevs()[0]
+
+ def _wcchanged(self):
+ """Return (changes, extchanges, missing) where changes is True
+ if the working directory was changed, extchanges is
+ True if any of these changes concern an external entry and missing
+ is True if any change is a missing entry.
+ """
+ output, err = self._svncommand(['status', '--xml'])
+ externals, changes, missing = [], [], []
+ doc = xml.dom.minidom.parseString(output)
+ for e in doc.getElementsByTagName('entry'):
+ s = e.getElementsByTagName('wc-status')
+ if not s:
+ continue
+ item = s[0].getAttribute('item')
+ props = s[0].getAttribute('props')
+ path = e.getAttribute('path')
+ if item == 'external':
+ externals.append(path)
+ elif item == 'missing':
+ missing.append(path)
+ if (item not in ('', 'normal', 'unversioned', 'external')
+ or props not in ('', 'none', 'normal')):
+ changes.append(path)
+ for path in changes:
+ for ext in externals:
+ if path == ext or path.startswith(ext + os.sep):
+ return True, True, bool(missing)
+ return bool(changes), False, bool(missing)
+
+ def dirty(self, ignoreupdate=False):
+ if not self._wcchanged()[0]:
+ if self._state[1] in self._wcrevs() or ignoreupdate:
+ return False
+ return True
+
+ def basestate(self):
+ lastrev, rev = self._wcrevs()
+ if lastrev != rev:
+ # Last committed rev is not the same than rev. We would
+ # like to take lastrev but we do not know if the subrepo
+ # URL exists at lastrev. Test it and fallback to rev it
+ # is not there.
+ try:
+ self._svncommand(['list', '%s@%s' % (self._state[0], lastrev)])
+ return lastrev
+ except error.Abort:
+ pass
+ return rev
+
+ def commit(self, text, user, date):
+ # user and date are out of our hands since svn is centralized
+ changed, extchanged, missing = self._wcchanged()
+ if not changed:
+ return self.basestate()
+ if extchanged:
+ # Do not try to commit externals
+ raise util.Abort(_('cannot commit svn externals'))
+ if missing:
+ # svn can commit with missing entries but aborting like hg
+ # seems a better approach.
+ raise util.Abort(_('cannot commit missing svn entries'))
+ commitinfo, err = self._svncommand(['commit', '-m', text])
+ self._ui.status(commitinfo)
+ newrev = re.search('Committed revision ([0-9]+).', commitinfo)
+ if not newrev:
+ if not commitinfo.strip():
+ # Sometimes, our definition of "changed" differs from
+ # svn one. For instance, svn ignores missing files
+ # when committing. If there are only missing files, no
+ # commit is made, no output and no error code.
+ raise util.Abort(_('failed to commit svn changes'))
+ raise util.Abort(commitinfo.splitlines()[-1])
+ newrev = newrev.groups()[0]
+ self._ui.status(self._svncommand(['update', '-r', newrev])[0])
+ return newrev
+
+ def remove(self):
+ if self.dirty():
+ self._ui.warn(_('not removing repo %s because '
+ 'it has changes.\n' % self._path))
+ return
+ self._ui.note(_('removing subrepo %s\n') % self._path)
+
+ def onerror(function, path, excinfo):
+ if function is not os.remove:
+ raise
+ # read-only files cannot be unlinked under Windows
+ s = os.stat(path)
+ if (s.st_mode & stat.S_IWRITE) != 0:
+ raise
+ os.chmod(path, stat.S_IMODE(s.st_mode) | stat.S_IWRITE)
+ os.remove(path)
+
+ path = self._ctx._repo.wjoin(self._path)
+ shutil.rmtree(path, onerror=onerror)
+ try:
+ os.removedirs(os.path.dirname(path))
+ except OSError:
+ pass
+
+ def get(self, state, overwrite=False):
+ if overwrite:
+ self._svncommand(['revert', '--recursive'])
+ args = ['checkout']
+ if self._svnversion >= (1, 5):
+ args.append('--force')
+ # The revision must be specified at the end of the URL to properly
+ # update to a directory which has since been deleted and recreated.
+ args.append('%s@%s' % (state[0], state[1]))
+ status, err = self._svncommand(args, failok=True)
+ if not re.search('Checked out revision [0-9]+.', status):
+ if ('is already a working copy for a different URL' in err
+ and (self._wcchanged()[:2] == (False, False))):
+ # obstructed but clean working copy, so just blow it away.
+ self.remove()
+ self.get(state, overwrite=False)
+ return
+ raise util.Abort((status or err).splitlines()[-1])
+ self._ui.status(status)
+
+ def merge(self, state):
+ old = self._state[1]
+ new = state[1]
+ wcrev = self._wcrev()
+ if new != wcrev:
+ dirty = old == wcrev or self._wcchanged()[0]
+ if _updateprompt(self._ui, self, dirty, wcrev, new):
+ self.get(state, False)
+
+ def push(self, opts):
+ # push is a no-op for SVN
+ return True
+
+ def files(self):
+ output = self._svncommand(['list', '--recursive', '--xml'])[0]
+ doc = xml.dom.minidom.parseString(output)
+ paths = []
+ for e in doc.getElementsByTagName('entry'):
+ kind = str(e.getAttribute('kind'))
+ if kind != 'file':
+ continue
+ name = ''.join(c.data for c
+ in e.getElementsByTagName('name')[0].childNodes
+ if c.nodeType == c.TEXT_NODE)
+ paths.append(name)
+ return paths
+
+ def filedata(self, name):
+ return self._svncommand(['cat'], name)[0]
+
+
+class gitsubrepo(abstractsubrepo):
+ def __init__(self, ctx, path, state):
+ self._state = state
+ self._ctx = ctx
+ self._path = path
+ self._relpath = os.path.join(reporelpath(ctx._repo), path)
+ self._abspath = ctx._repo.wjoin(path)
+ self._subparent = ctx._repo
+ self._ui = ctx._repo.ui
+ self._ensuregit()
+
+ def _ensuregit(self):
+ try:
+ self._gitexecutable = 'git'
+ out, err = self._gitnodir(['--version'])
+ except OSError, e:
+ if e.errno != 2 or os.name != 'nt':
+ raise
+ self._gitexecutable = 'git.cmd'
+ out, err = self._gitnodir(['--version'])
+ m = re.search(r'^git version (\d+)\.(\d+)\.(\d+)', out)
+ if not m:
+ self._ui.warn(_('cannot retrieve git version'))
+ return
+ version = (int(m.group(1)), m.group(2), m.group(3))
+ # git 1.4.0 can't work at all, but 1.5.X can in at least some cases,
+ # despite the docstring comment. For now, error on 1.4.0, warn on
+ # 1.5.0 but attempt to continue.
+ if version < (1, 5, 0):
+ raise util.Abort(_('git subrepo requires at least 1.6.0 or later'))
+ elif version < (1, 6, 0):
+ self._ui.warn(_('git subrepo requires at least 1.6.0 or later'))
+
+ def _gitcommand(self, commands, env=None, stream=False):
+ return self._gitdir(commands, env=env, stream=stream)[0]
+
+ def _gitdir(self, commands, env=None, stream=False):
+ return self._gitnodir(commands, env=env, stream=stream,
+ cwd=self._abspath)
+
+ def _gitnodir(self, commands, env=None, stream=False, cwd=None):
+ """Calls the git command
+
+ The methods tries to call the git command. versions previor to 1.6.0
+ are not supported and very probably fail.
+ """
+ self._ui.debug('%s: git %s\n' % (self._relpath, ' '.join(commands)))
+ # unless ui.quiet is set, print git's stderr,
+ # which is mostly progress and useful info
+ errpipe = None
+ if self._ui.quiet:
+ errpipe = open(os.devnull, 'w')
+ p = subprocess.Popen([self._gitexecutable] + commands, bufsize=-1,
+ cwd=cwd, env=env, close_fds=util.closefds,
+ stdout=subprocess.PIPE, stderr=errpipe)
+ if stream:
+ return p.stdout, None
+
+ retdata = p.stdout.read().strip()
+ # wait for the child to exit to avoid race condition.
+ p.wait()
+
+ if p.returncode != 0 and p.returncode != 1:
+ # there are certain error codes that are ok
+ command = commands[0]
+ if command in ('cat-file', 'symbolic-ref'):
+ return retdata, p.returncode
+ # for all others, abort
+ raise util.Abort('git %s error %d in %s' %
+ (command, p.returncode, self._relpath))
+
+ return retdata, p.returncode
+
+ def _gitmissing(self):
+ return not os.path.exists(os.path.join(self._abspath, '.git'))
+
+ def _gitstate(self):
+ return self._gitcommand(['rev-parse', 'HEAD'])
+
+ def _gitcurrentbranch(self):
+ current, err = self._gitdir(['symbolic-ref', 'HEAD', '--quiet'])
+ if err:
+ current = None
+ return current
+
+ def _gitremote(self, remote):
+ out = self._gitcommand(['remote', 'show', '-n', remote])
+ line = out.split('\n')[1]
+ i = line.index('URL: ') + len('URL: ')
+ return line[i:]
+
+ def _githavelocally(self, revision):
+ out, code = self._gitdir(['cat-file', '-e', revision])
+ return code == 0
+
+ def _gitisancestor(self, r1, r2):
+ base = self._gitcommand(['merge-base', r1, r2])
+ return base == r1
+
+ def _gitisbare(self):
+ return self._gitcommand(['config', '--bool', 'core.bare']) == 'true'
+
+ def _gitupdatestat(self):
+ """This must be run before git diff-index.
+ diff-index only looks at changes to file stat;
+ this command looks at file contents and updates the stat."""
+ self._gitcommand(['update-index', '-q', '--refresh'])
+
+ def _gitbranchmap(self):
+ '''returns 2 things:
+ a map from git branch to revision
+ a map from revision to branches'''
+ branch2rev = {}
+ rev2branch = {}
+
+ out = self._gitcommand(['for-each-ref', '--format',
+ '%(objectname) %(refname)'])
+ for line in out.split('\n'):
+ revision, ref = line.split(' ')
+ if (not ref.startswith('refs/heads/') and
+ not ref.startswith('refs/remotes/')):
+ continue
+ if ref.startswith('refs/remotes/') and ref.endswith('/HEAD'):
+ continue # ignore remote/HEAD redirects
+ branch2rev[ref] = revision
+ rev2branch.setdefault(revision, []).append(ref)
+ return branch2rev, rev2branch
+
+ def _gittracking(self, branches):
+ 'return map of remote branch to local tracking branch'
+ # assumes no more than one local tracking branch for each remote
+ tracking = {}
+ for b in branches:
+ if b.startswith('refs/remotes/'):
+ continue
+ bname = b.split('/', 2)[2]
+ remote = self._gitcommand(['config', 'branch.%s.remote' % bname])
+ if remote:
+ ref = self._gitcommand(['config', 'branch.%s.merge' % bname])
+ tracking['refs/remotes/%s/%s' %
+ (remote, ref.split('/', 2)[2])] = b
+ return tracking
+
+ def _abssource(self, source):
+ if '://' not in source:
+ # recognize the scp syntax as an absolute source
+ colon = source.find(':')
+ if colon != -1 and '/' not in source[:colon]:
+ return source
+ self._subsource = source
+ return _abssource(self)
+
+ def _fetch(self, source, revision):
+ if self._gitmissing():
+ source = self._abssource(source)
+ self._ui.status(_('cloning subrepo %s from %s\n') %
+ (self._relpath, source))
+ self._gitnodir(['clone', source, self._abspath])
+ if self._githavelocally(revision):
+ return
+ self._ui.status(_('pulling subrepo %s from %s\n') %
+ (self._relpath, self._gitremote('origin')))
+ # try only origin: the originally cloned repo
+ self._gitcommand(['fetch'])
+ if not self._githavelocally(revision):
+ raise util.Abort(_("revision %s does not exist in subrepo %s\n") %
+ (revision, self._relpath))
+
+ def dirty(self, ignoreupdate=False):
+ if self._gitmissing():
+ return self._state[1] != ''
+ if self._gitisbare():
+ return True
+ if not ignoreupdate and self._state[1] != self._gitstate():
+ # different version checked out
+ return True
+ # check for staged changes or modified files; ignore untracked files
+ self._gitupdatestat()
+ out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
+ return code == 1
+
+ def basestate(self):
+ return self._gitstate()
+
+ def get(self, state, overwrite=False):
+ source, revision, kind = state
+ if not revision:
+ self.remove()
+ return
+ self._fetch(source, revision)
+ # if the repo was set to be bare, unbare it
+ if self._gitisbare():
+ self._gitcommand(['config', 'core.bare', 'false'])
+ if self._gitstate() == revision:
+ self._gitcommand(['reset', '--hard', 'HEAD'])
+ return
+ elif self._gitstate() == revision:
+ if overwrite:
+ # first reset the index to unmark new files for commit, because
+ # reset --hard will otherwise throw away files added for commit,
+ # not just unmark them.
+ self._gitcommand(['reset', 'HEAD'])
+ self._gitcommand(['reset', '--hard', 'HEAD'])
+ return
+ branch2rev, rev2branch = self._gitbranchmap()
+
+ def checkout(args):
+ cmd = ['checkout']
+ if overwrite:
+ # first reset the index to unmark new files for commit, because
+ # the -f option will otherwise throw away files added for
+ # commit, not just unmark them.
+ self._gitcommand(['reset', 'HEAD'])
+ cmd.append('-f')
+ self._gitcommand(cmd + args)
+
+ def rawcheckout():
+ # no branch to checkout, check it out with no branch
+ self._ui.warn(_('checking out detached HEAD in subrepo %s\n') %
+ self._relpath)
+ self._ui.warn(_('check out a git branch if you intend '
+ 'to make changes\n'))
+ checkout(['-q', revision])
+
+ if revision not in rev2branch:
+ rawcheckout()
+ return
+ branches = rev2branch[revision]
+ firstlocalbranch = None
+ for b in branches:
+ if b == 'refs/heads/master':
+ # master trumps all other branches
+ checkout(['refs/heads/master'])
+ return
+ if not firstlocalbranch and not b.startswith('refs/remotes/'):
+ firstlocalbranch = b
+ if firstlocalbranch:
+ checkout([firstlocalbranch])
+ return
+
+ tracking = self._gittracking(branch2rev.keys())
+ # choose a remote branch already tracked if possible
+ remote = branches[0]
+ if remote not in tracking:
+ for b in branches:
+ if b in tracking:
+ remote = b
+ break
+
+ if remote not in tracking:
+ # create a new local tracking branch
+ local = remote.split('/', 2)[2]
+ checkout(['-b', local, remote])
+ elif self._gitisancestor(branch2rev[tracking[remote]], remote):
+ # When updating to a tracked remote branch,
+ # if the local tracking branch is downstream of it,
+ # a normal `git pull` would have performed a "fast-forward merge"
+ # which is equivalent to updating the local branch to the remote.
+ # Since we are only looking at branching at update, we need to
+ # detect this situation and perform this action lazily.
+ if tracking[remote] != self._gitcurrentbranch():
+ checkout([tracking[remote]])
+ self._gitcommand(['merge', '--ff', remote])
+ else:
+ # a real merge would be required, just checkout the revision
+ rawcheckout()
+
+ def commit(self, text, user, date):
+ if self._gitmissing():
+ raise util.Abort(_("subrepo %s is missing") % self._relpath)
+ cmd = ['commit', '-a', '-m', text]
+ env = os.environ.copy()
+ if user:
+ cmd += ['--author', user]
+ if date:
+ # git's date parser silently ignores when seconds < 1e9
+ # convert to ISO8601
+ env['GIT_AUTHOR_DATE'] = util.datestr(date,
+ '%Y-%m-%dT%H:%M:%S %1%2')
+ self._gitcommand(cmd, env=env)
+ # make sure commit works otherwise HEAD might not exist under certain
+ # circumstances
+ return self._gitstate()
+
+ def merge(self, state):
+ source, revision, kind = state
+ self._fetch(source, revision)
+ base = self._gitcommand(['merge-base', revision, self._state[1]])
+ self._gitupdatestat()
+ out, code = self._gitdir(['diff-index', '--quiet', 'HEAD'])
+
+ def mergefunc():
+ if base == revision:
+ self.get(state) # fast forward merge
+ elif base != self._state[1]:
+ self._gitcommand(['merge', '--no-commit', revision])
+
+ if self.dirty():
+ if self._gitstate() != revision:
+ dirty = self._gitstate() == self._state[1] or code != 0
+ if _updateprompt(self._ui, self, dirty,
+ self._state[1][:7], revision[:7]):
+ mergefunc()
+ else:
+ mergefunc()
+
+ def push(self, opts):
+ force = opts.get('force')
+
+ if not self._state[1]:
+ return True
+ if self._gitmissing():
+ raise util.Abort(_("subrepo %s is missing") % self._relpath)
+ # if a branch in origin contains the revision, nothing to do
+ branch2rev, rev2branch = self._gitbranchmap()
+ if self._state[1] in rev2branch:
+ for b in rev2branch[self._state[1]]:
+ if b.startswith('refs/remotes/origin/'):
+ return True
+ for b, revision in branch2rev.iteritems():
+ if b.startswith('refs/remotes/origin/'):
+ if self._gitisancestor(self._state[1], revision):
+ return True
+ # otherwise, try to push the currently checked out branch
+ cmd = ['push']
+ if force:
+ cmd.append('--force')
+
+ current = self._gitcurrentbranch()
+ if current:
+ # determine if the current branch is even useful
+ if not self._gitisancestor(self._state[1], current):
+ self._ui.warn(_('unrelated git branch checked out '
+ 'in subrepo %s\n') % self._relpath)
+ return False
+ self._ui.status(_('pushing branch %s of subrepo %s\n') %
+ (current.split('/', 2)[2], self._relpath))
+ self._gitcommand(cmd + ['origin', current])
+ return True
+ else:
+ self._ui.warn(_('no branch checked out in subrepo %s\n'
+ 'cannot push revision %s\n') %
+ (self._relpath, self._state[1]))
+ return False
+
+ def remove(self):
+ if self._gitmissing():
+ return
+ if self.dirty():
+ self._ui.warn(_('not removing repo %s because '
+ 'it has changes.\n') % self._relpath)
+ return
+ # we can't fully delete the repository as it may contain
+ # local-only history
+ self._ui.note(_('removing subrepo %s\n') % self._relpath)
+ self._gitcommand(['config', 'core.bare', 'true'])
+ for f in os.listdir(self._abspath):
+ if f == '.git':
+ continue
+ path = os.path.join(self._abspath, f)
+ if os.path.isdir(path) and not os.path.islink(path):
+ shutil.rmtree(path)
+ else:
+ os.remove(path)
+
+ def archive(self, ui, archiver, prefix, match=None):
+ source, revision = self._state
+ if not revision:
+ return
+ self._fetch(source, revision)
+
+ # Parse git's native archive command.
+ # This should be much faster than manually traversing the trees
+ # and objects with many subprocess calls.
+ tarstream = self._gitcommand(['archive', revision], stream=True)
+ tar = tarfile.open(fileobj=tarstream, mode='r|')
+ relpath = subrelpath(self)
+ ui.progress(_('archiving (%s)') % relpath, 0, unit=_('files'))
+ for i, info in enumerate(tar):
+ if info.isdir():
+ continue
+ if match and not match(info.name):
+ continue
+ if info.issym():
+ data = info.linkname
+ else:
+ data = tar.extractfile(info).read()
+ archiver.addfile(os.path.join(prefix, self._path, info.name),
+ info.mode, info.issym(), data)
+ ui.progress(_('archiving (%s)') % relpath, i + 1,
+ unit=_('files'))
+ ui.progress(_('archiving (%s)') % relpath, None)
+
+
+ def status(self, rev2, **opts):
+ rev1 = self._state[1]
+ if self._gitmissing() or not rev1:
+ # if the repo is missing, return no results
+ return [], [], [], [], [], [], []
+ modified, added, removed = [], [], []
+ self._gitupdatestat()
+ if rev2:
+ command = ['diff-tree', rev1, rev2]
+ else:
+ command = ['diff-index', rev1]
+ out = self._gitcommand(command)
+ for line in out.split('\n'):
+ tab = line.find('\t')
+ if tab == -1:
+ continue
+ status, f = line[tab - 1], line[tab + 1:]
+ if status == 'M':
+ modified.append(f)
+ elif status == 'A':
+ added.append(f)
+ elif status == 'D':
+ removed.append(f)
+
+ deleted = unknown = ignored = clean = []
+ return modified, added, removed, deleted, unknown, ignored, clean
+
+types = {
+ 'hg': hgsubrepo,
+ 'svn': svnsubrepo,
+ 'git': gitsubrepo,
+ }
diff --git a/mercurial/tags.py b/mercurial/tags.py
new file mode 100644
index 0000000..e4e0129
--- /dev/null
+++ b/mercurial/tags.py
@@ -0,0 +1,297 @@
+# tags.py - read tag info from local repository
+#
+# Copyright 2009 Matt Mackall <mpm@selenic.com>
+# Copyright 2009 Greg Ward <greg@gerg.ca>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# Currently this module only deals with reading and caching tags.
+# Eventually, it could take care of updating (adding/removing/moving)
+# tags too.
+
+from node import nullid, bin, hex, short
+from i18n import _
+import encoding
+import error
+import errno
+
+def findglobaltags(ui, repo, alltags, tagtypes):
+ '''Find global tags in repo by reading .hgtags from every head that
+ has a distinct version of it, using a cache to avoid excess work.
+ Updates the dicts alltags, tagtypes in place: alltags maps tag name
+ to (node, hist) pair (see _readtags() below), and tagtypes maps tag
+ name to tag type ("global" in this case).'''
+ # This is so we can be lazy and assume alltags contains only global
+ # tags when we pass it to _writetagcache().
+ assert len(alltags) == len(tagtypes) == 0, \
+ "findglobaltags() should be called first"
+
+ (heads, tagfnode, cachetags, shouldwrite) = _readtagcache(ui, repo)
+ if cachetags is not None:
+ assert not shouldwrite
+ # XXX is this really 100% correct? are there oddball special
+ # cases where a global tag should outrank a local tag but won't,
+ # because cachetags does not contain rank info?
+ _updatetags(cachetags, 'global', alltags, tagtypes)
+ return
+
+ seen = set() # set of fnode
+ fctx = None
+ for head in reversed(heads): # oldest to newest
+ assert head in repo.changelog.nodemap, \
+ "tag cache returned bogus head %s" % short(head)
+
+ fnode = tagfnode.get(head)
+ if fnode and fnode not in seen:
+ seen.add(fnode)
+ if not fctx:
+ fctx = repo.filectx('.hgtags', fileid=fnode)
+ else:
+ fctx = fctx.filectx(fnode)
+
+ filetags = _readtags(ui, repo, fctx.data().splitlines(), fctx)
+ _updatetags(filetags, 'global', alltags, tagtypes)
+
+ # and update the cache (if necessary)
+ if shouldwrite:
+ _writetagcache(ui, repo, heads, tagfnode, alltags)
+
+def readlocaltags(ui, repo, alltags, tagtypes):
+ '''Read local tags in repo. Update alltags and tagtypes.'''
+ try:
+ data = repo.opener.read("localtags")
+ except IOError, inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ return
+
+ # localtags is in the local encoding; re-encode to UTF-8 on
+ # input for consistency with the rest of this module.
+ filetags = _readtags(
+ ui, repo, data.splitlines(), "localtags",
+ recode=encoding.fromlocal)
+ _updatetags(filetags, "local", alltags, tagtypes)
+
+def _readtags(ui, repo, lines, fn, recode=None):
+ '''Read tag definitions from a file (or any source of lines).
+ Return a mapping from tag name to (node, hist): node is the node id
+ from the last line read for that name, and hist is the list of node
+ ids previously associated with it (in file order). All node ids are
+ binary, not hex.'''
+
+ filetags = {} # map tag name to (node, hist)
+ count = 0
+
+ def warn(msg):
+ ui.warn(_("%s, line %s: %s\n") % (fn, count, msg))
+
+ for line in lines:
+ count += 1
+ if not line:
+ continue
+ try:
+ (nodehex, name) = line.split(" ", 1)
+ except ValueError:
+ warn(_("cannot parse entry"))
+ continue
+ name = name.strip()
+ if recode:
+ name = recode(name)
+ try:
+ nodebin = bin(nodehex)
+ except TypeError:
+ warn(_("node '%s' is not well formed") % nodehex)
+ continue
+
+ # update filetags
+ hist = []
+ if name in filetags:
+ n, hist = filetags[name]
+ hist.append(n)
+ filetags[name] = (nodebin, hist)
+ return filetags
+
+def _updatetags(filetags, tagtype, alltags, tagtypes):
+ '''Incorporate the tag info read from one file into the two
+ dictionaries, alltags and tagtypes, that contain all tag
+ info (global across all heads plus local).'''
+
+ for name, nodehist in filetags.iteritems():
+ if name not in alltags:
+ alltags[name] = nodehist
+ tagtypes[name] = tagtype
+ continue
+
+ # we prefer alltags[name] if:
+ # it supercedes us OR
+ # mutual supercedes and it has a higher rank
+ # otherwise we win because we're tip-most
+ anode, ahist = nodehist
+ bnode, bhist = alltags[name]
+ if (bnode != anode and anode in bhist and
+ (bnode not in ahist or len(bhist) > len(ahist))):
+ anode = bnode
+ ahist.extend([n for n in bhist if n not in ahist])
+ alltags[name] = anode, ahist
+ tagtypes[name] = tagtype
+
+
+# The tag cache only stores info about heads, not the tag contents
+# from each head. I.e. it doesn't try to squeeze out the maximum
+# performance, but is simpler has a better chance of actually
+# working correctly. And this gives the biggest performance win: it
+# avoids looking up .hgtags in the manifest for every head, and it
+# can avoid calling heads() at all if there have been no changes to
+# the repo.
+
+def _readtagcache(ui, repo):
+ '''Read the tag cache and return a tuple (heads, fnodes, cachetags,
+ shouldwrite). If the cache is completely up-to-date, cachetags is a
+ dict of the form returned by _readtags(); otherwise, it is None and
+ heads and fnodes are set. In that case, heads is the list of all
+ heads currently in the repository (ordered from tip to oldest) and
+ fnodes is a mapping from head to .hgtags filenode. If those two are
+ set, caller is responsible for reading tag info from each head.'''
+
+ try:
+ cachefile = repo.opener('cache/tags', 'r')
+ # force reading the file for static-http
+ cachelines = iter(cachefile)
+ except IOError:
+ cachefile = None
+
+ # The cache file consists of lines like
+ # <headrev> <headnode> [<tagnode>]
+ # where <headrev> and <headnode> redundantly identify a repository
+ # head from the time the cache was written, and <tagnode> is the
+ # filenode of .hgtags on that head. Heads with no .hgtags file will
+ # have no <tagnode>. The cache is ordered from tip to oldest (which
+ # is part of why <headrev> is there: a quick visual check is all
+ # that's required to ensure correct order).
+ #
+ # This information is enough to let us avoid the most expensive part
+ # of finding global tags, which is looking up <tagnode> in the
+ # manifest for each head.
+ cacherevs = [] # list of headrev
+ cacheheads = [] # list of headnode
+ cachefnode = {} # map headnode to filenode
+ if cachefile:
+ try:
+ for line in cachelines:
+ if line == "\n":
+ break
+ line = line.split()
+ cacherevs.append(int(line[0]))
+ headnode = bin(line[1])
+ cacheheads.append(headnode)
+ if len(line) == 3:
+ fnode = bin(line[2])
+ cachefnode[headnode] = fnode
+ except Exception:
+ # corruption of the tags cache, just recompute it
+ ui.warn(_('.hg/cache/tags is corrupt, rebuilding it\n'))
+ cacheheads = []
+ cacherevs = []
+ cachefnode = {}
+
+ tipnode = repo.changelog.tip()
+ tiprev = len(repo.changelog) - 1
+
+ # Case 1 (common): tip is the same, so nothing has changed.
+ # (Unchanged tip trivially means no changesets have been added.
+ # But, thanks to localrepository.destroyed(), it also means none
+ # have been destroyed by strip or rollback.)
+ if cacheheads and cacheheads[0] == tipnode and cacherevs[0] == tiprev:
+ tags = _readtags(ui, repo, cachelines, cachefile.name)
+ cachefile.close()
+ return (None, None, tags, False)
+ if cachefile:
+ cachefile.close() # ignore rest of file
+
+ repoheads = repo.heads()
+ # Case 2 (uncommon): empty repo; get out quickly and don't bother
+ # writing an empty cache.
+ if repoheads == [nullid]:
+ return ([], {}, {}, False)
+
+ # Case 3 (uncommon): cache file missing or empty.
+
+ # Case 4 (uncommon): tip rev decreased. This should only happen
+ # when we're called from localrepository.destroyed(). Refresh the
+ # cache so future invocations will not see disappeared heads in the
+ # cache.
+
+ # Case 5 (common): tip has changed, so we've added/replaced heads.
+
+ # As it happens, the code to handle cases 3, 4, 5 is the same.
+
+ # N.B. in case 4 (nodes destroyed), "new head" really means "newly
+ # exposed".
+ if not len(repo.file('.hgtags')):
+ # No tags have ever been committed, so we can avoid a
+ # potentially expensive search.
+ return (repoheads, cachefnode, None, True)
+
+ newheads = [head
+ for head in repoheads
+ if head not in set(cacheheads)]
+
+ # Now we have to lookup the .hgtags filenode for every new head.
+ # This is the most expensive part of finding tags, so performance
+ # depends primarily on the size of newheads. Worst case: no cache
+ # file, so newheads == repoheads.
+ for head in reversed(newheads):
+ cctx = repo[head]
+ try:
+ fnode = cctx.filenode('.hgtags')
+ cachefnode[head] = fnode
+ except error.LookupError:
+ # no .hgtags file on this head
+ pass
+
+ # Caller has to iterate over all heads, but can use the filenodes in
+ # cachefnode to get to each .hgtags revision quickly.
+ return (repoheads, cachefnode, None, True)
+
+def _writetagcache(ui, repo, heads, tagfnode, cachetags):
+
+ try:
+ cachefile = repo.opener('cache/tags', 'w', atomictemp=True)
+ except (OSError, IOError):
+ return
+
+ realheads = repo.heads() # for sanity checks below
+ for head in heads:
+ # temporary sanity checks; these can probably be removed
+ # once this code has been in crew for a few weeks
+ assert head in repo.changelog.nodemap, \
+ 'trying to write non-existent node %s to tag cache' % short(head)
+ assert head in realheads, \
+ 'trying to write non-head %s to tag cache' % short(head)
+ assert head != nullid, \
+ 'trying to write nullid to tag cache'
+
+ # This can't fail because of the first assert above. When/if we
+ # remove that assert, we might want to catch LookupError here
+ # and downgrade it to a warning.
+ rev = repo.changelog.rev(head)
+
+ fnode = tagfnode.get(head)
+ if fnode:
+ cachefile.write('%d %s %s\n' % (rev, hex(head), hex(fnode)))
+ else:
+ cachefile.write('%d %s\n' % (rev, hex(head)))
+
+ # Tag names in the cache are in UTF-8 -- which is the whole reason
+ # we keep them in UTF-8 throughout this module. If we converted
+ # them local encoding on input, we would lose info writing them to
+ # the cache.
+ cachefile.write('\n')
+ for (name, (node, hist)) in cachetags.iteritems():
+ cachefile.write("%s %s\n" % (hex(node), name))
+
+ try:
+ cachefile.close()
+ except (OSError, IOError):
+ pass
diff --git a/mercurial/templatefilters.py b/mercurial/templatefilters.py
new file mode 100644
index 0000000..b5264f2
--- /dev/null
+++ b/mercurial/templatefilters.py
@@ -0,0 +1,395 @@
+# template-filters.py - common template expansion filters
+#
+# Copyright 2005-2008 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import cgi, re, os, time, urllib
+import encoding, node, util
+import hbisect
+
+def addbreaks(text):
+ """:addbreaks: Any text. Add an XHTML "<br />" tag before the end of
+ every line except the last.
+ """
+ return text.replace('\n', '<br/>\n')
+
+agescales = [("year", 3600 * 24 * 365),
+ ("month", 3600 * 24 * 30),
+ ("week", 3600 * 24 * 7),
+ ("day", 3600 * 24),
+ ("hour", 3600),
+ ("minute", 60),
+ ("second", 1)]
+
+def age(date):
+ """:age: Date. Returns a human-readable date/time difference between the
+ given date/time and the current date/time.
+ """
+
+ def plural(t, c):
+ if c == 1:
+ return t
+ return t + "s"
+ def fmt(t, c):
+ return "%d %s" % (c, plural(t, c))
+
+ now = time.time()
+ then = date[0]
+ future = False
+ if then > now:
+ future = True
+ delta = max(1, int(then - now))
+ if delta > agescales[0][1] * 30:
+ return 'in the distant future'
+ else:
+ delta = max(1, int(now - then))
+ if delta > agescales[0][1] * 2:
+ return util.shortdate(date)
+
+ for t, s in agescales:
+ n = delta // s
+ if n >= 2 or s == 1:
+ if future:
+ return '%s from now' % fmt(t, n)
+ return '%s ago' % fmt(t, n)
+
+def basename(path):
+ """:basename: Any text. Treats the text as a path, and returns the last
+ component of the path after splitting by the path separator
+ (ignoring trailing separators). For example, "foo/bar/baz" becomes
+ "baz" and "foo/bar//" becomes "bar".
+ """
+ return os.path.basename(path)
+
+def datefilter(text):
+ """:date: Date. Returns a date in a Unix date format, including the
+ timezone: "Mon Sep 04 15:13:13 2006 0700".
+ """
+ return util.datestr(text)
+
+def domain(author):
+ """:domain: Any text. Finds the first string that looks like an email
+ address, and extracts just the domain component. Example: ``User
+ <user@example.com>`` becomes ``example.com``.
+ """
+ f = author.find('@')
+ if f == -1:
+ return ''
+ author = author[f + 1:]
+ f = author.find('>')
+ if f >= 0:
+ author = author[:f]
+ return author
+
+def email(text):
+ """:email: Any text. Extracts the first string that looks like an email
+ address. Example: ``User <user@example.com>`` becomes
+ ``user@example.com``.
+ """
+ return util.email(text)
+
+def escape(text):
+ """:escape: Any text. Replaces the special XML/XHTML characters "&", "<"
+ and ">" with XML entities.
+ """
+ return cgi.escape(text, True)
+
+para_re = None
+space_re = None
+
+def fill(text, width):
+ '''fill many paragraphs.'''
+ global para_re, space_re
+ if para_re is None:
+ para_re = re.compile('(\n\n|\n\\s*[-*]\\s*)', re.M)
+ space_re = re.compile(r' +')
+
+ def findparas():
+ start = 0
+ while True:
+ m = para_re.search(text, start)
+ if not m:
+ uctext = unicode(text[start:], encoding.encoding)
+ w = len(uctext)
+ while 0 < w and uctext[w - 1].isspace():
+ w -= 1
+ yield (uctext[:w].encode(encoding.encoding),
+ uctext[w:].encode(encoding.encoding))
+ break
+ yield text[start:m.start(0)], m.group(1)
+ start = m.end(1)
+
+ return "".join([space_re.sub(' ', util.wrap(para, width=width)) + rest
+ for para, rest in findparas()])
+
+def fill68(text):
+ """:fill68: Any text. Wraps the text to fit in 68 columns."""
+ return fill(text, 68)
+
+def fill76(text):
+ """:fill76: Any text. Wraps the text to fit in 76 columns."""
+ return fill(text, 76)
+
+def firstline(text):
+ """:firstline: Any text. Returns the first line of text."""
+ try:
+ return text.splitlines(True)[0].rstrip('\r\n')
+ except IndexError:
+ return ''
+
+def hexfilter(text):
+ """:hex: Any text. Convert a binary Mercurial node identifier into
+ its long hexadecimal representation.
+ """
+ return node.hex(text)
+
+def hgdate(text):
+ """:hgdate: Date. Returns the date as a pair of numbers: "1157407993
+ 25200" (Unix timestamp, timezone offset).
+ """
+ return "%d %d" % text
+
+def isodate(text):
+ """:isodate: Date. Returns the date in ISO 8601 format: "2009-08-18 13:00
+ +0200".
+ """
+ return util.datestr(text, '%Y-%m-%d %H:%M %1%2')
+
+def isodatesec(text):
+ """:isodatesec: Date. Returns the date in ISO 8601 format, including
+ seconds: "2009-08-18 13:00:13 +0200". See also the rfc3339date
+ filter.
+ """
+ return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2')
+
+def indent(text, prefix):
+ '''indent each non-empty line of text after first with prefix.'''
+ lines = text.splitlines()
+ num_lines = len(lines)
+ endswithnewline = text[-1:] == '\n'
+ def indenter():
+ for i in xrange(num_lines):
+ l = lines[i]
+ if i and l.strip():
+ yield prefix
+ yield l
+ if i < num_lines - 1 or endswithnewline:
+ yield '\n'
+ return "".join(indenter())
+
+def json(obj):
+ if obj is None or obj is False or obj is True:
+ return {None: 'null', False: 'false', True: 'true'}[obj]
+ elif isinstance(obj, int) or isinstance(obj, float):
+ return str(obj)
+ elif isinstance(obj, str):
+ u = unicode(obj, encoding.encoding, 'replace')
+ return '"%s"' % jsonescape(u)
+ elif isinstance(obj, unicode):
+ return '"%s"' % jsonescape(obj)
+ elif util.safehasattr(obj, 'keys'):
+ out = []
+ for k, v in obj.iteritems():
+ s = '%s: %s' % (json(k), json(v))
+ out.append(s)
+ return '{' + ', '.join(out) + '}'
+ elif util.safehasattr(obj, '__iter__'):
+ out = []
+ for i in obj:
+ out.append(json(i))
+ return '[' + ', '.join(out) + ']'
+ else:
+ raise TypeError('cannot encode type %s' % obj.__class__.__name__)
+
+def _uescape(c):
+ if ord(c) < 0x80:
+ return c
+ else:
+ return '\\u%04x' % ord(c)
+
+_escapes = [
+ ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'),
+ ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'),
+]
+
+def jsonescape(s):
+ for k, v in _escapes:
+ s = s.replace(k, v)
+ return ''.join(_uescape(c) for c in s)
+
+def localdate(text):
+ """:localdate: Date. Converts a date to local date."""
+ return (text[0], util.makedate()[1])
+
+def nonempty(str):
+ """:nonempty: Any text. Returns '(none)' if the string is empty."""
+ return str or "(none)"
+
+def obfuscate(text):
+ """:obfuscate: Any text. Returns the input text rendered as a sequence of
+ XML entities.
+ """
+ text = unicode(text, encoding.encoding, 'replace')
+ return ''.join(['&#%d;' % ord(c) for c in text])
+
+def permissions(flags):
+ if "l" in flags:
+ return "lrwxrwxrwx"
+ if "x" in flags:
+ return "-rwxr-xr-x"
+ return "-rw-r--r--"
+
+def person(author):
+ """:person: Any text. Returns the name before an email address,
+ interpreting it as per RFC 5322.
+
+ >>> person('foo@bar')
+ 'foo'
+ >>> person('Foo Bar <foo@bar>')
+ 'Foo Bar'
+ >>> person('"Foo Bar" <foo@bar>')
+ 'Foo Bar'
+ >>> person('"Foo \"buz\" Bar" <foo@bar>')
+ 'Foo "buz" Bar'
+ >>> # The following are invalid, but do exist in real-life
+ ...
+ >>> person('Foo "buz" Bar <foo@bar>')
+ 'Foo "buz" Bar'
+ >>> person('"Foo Bar <foo@bar>')
+ 'Foo Bar'
+ """
+ if '@' not in author:
+ return author
+ f = author.find('<')
+ if f != -1:
+ return author[:f].strip(' "').replace('\\"', '"')
+ f = author.find('@')
+ return author[:f].replace('.', ' ')
+
+def rfc3339date(text):
+ """:rfc3339date: Date. Returns a date using the Internet date format
+ specified in RFC 3339: "2009-08-18T13:00:13+02:00".
+ """
+ return util.datestr(text, "%Y-%m-%dT%H:%M:%S%1:%2")
+
+def rfc822date(text):
+ """:rfc822date: Date. Returns a date using the same format used in email
+ headers: "Tue, 18 Aug 2009 13:00:13 +0200".
+ """
+ return util.datestr(text, "%a, %d %b %Y %H:%M:%S %1%2")
+
+def short(text):
+ """:short: Changeset hash. Returns the short form of a changeset hash,
+ i.e. a 12 hexadecimal digit string.
+ """
+ return text[:12]
+
+def shortbisect(text):
+ """:shortbisect: Any text. Treats `text` as a bisection status, and
+ returns a single-character representing the status (G: good, B: bad,
+ S: skipped, U: untested, I: ignored). Returns single space if `text`
+ is not a valid bisection status.
+ """
+ return hbisect.shortlabel(text) or ' '
+
+def shortdate(text):
+ """:shortdate: Date. Returns a date like "2006-09-18"."""
+ return util.shortdate(text)
+
+def stringescape(text):
+ return text.encode('string_escape')
+
+def stringify(thing):
+ """:stringify: Any type. Turns the value into text by converting values into
+ text and concatenating them.
+ """
+ if util.safehasattr(thing, '__iter__') and not isinstance(thing, str):
+ return "".join([stringify(t) for t in thing if t is not None])
+ return str(thing)
+
+def strip(text):
+ """:strip: Any text. Strips all leading and trailing whitespace."""
+ return text.strip()
+
+def stripdir(text):
+ """:stripdir: Treat the text as path and strip a directory level, if
+ possible. For example, "foo" and "foo/bar" becomes "foo".
+ """
+ dir = os.path.dirname(text)
+ if dir == "":
+ return os.path.basename(text)
+ else:
+ return dir
+
+def tabindent(text):
+ """:tabindent: Any text. Returns the text, with every line except the
+ first starting with a tab character.
+ """
+ return indent(text, '\t')
+
+def urlescape(text):
+ """:urlescape: Any text. Escapes all "special" characters. For example,
+ "foo bar" becomes "foo%20bar".
+ """
+ return urllib.quote(text)
+
+def userfilter(text):
+ """:user: Any text. Returns a short representation of a user name or email
+ address."""
+ return util.shortuser(text)
+
+def emailuser(text):
+ """:emailuser: Any text. Returns the user portion of an email address."""
+ return util.emailuser(text)
+
+def xmlescape(text):
+ text = (text
+ .replace('&', '&amp;')
+ .replace('<', '&lt;')
+ .replace('>', '&gt;')
+ .replace('"', '&quot;')
+ .replace("'", '&#39;')) # &apos; invalid in HTML
+ return re.sub('[\x00-\x08\x0B\x0C\x0E-\x1F]', ' ', text)
+
+filters = {
+ "addbreaks": addbreaks,
+ "age": age,
+ "basename": basename,
+ "date": datefilter,
+ "domain": domain,
+ "email": email,
+ "escape": escape,
+ "fill68": fill68,
+ "fill76": fill76,
+ "firstline": firstline,
+ "hex": hexfilter,
+ "hgdate": hgdate,
+ "isodate": isodate,
+ "isodatesec": isodatesec,
+ "json": json,
+ "jsonescape": jsonescape,
+ "localdate": localdate,
+ "nonempty": nonempty,
+ "obfuscate": obfuscate,
+ "permissions": permissions,
+ "person": person,
+ "rfc3339date": rfc3339date,
+ "rfc822date": rfc822date,
+ "short": short,
+ "shortbisect": shortbisect,
+ "shortdate": shortdate,
+ "stringescape": stringescape,
+ "stringify": stringify,
+ "strip": strip,
+ "stripdir": stripdir,
+ "tabindent": tabindent,
+ "urlescape": urlescape,
+ "user": userfilter,
+ "emailuser": emailuser,
+ "xmlescape": xmlescape,
+}
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = filters.values()
diff --git a/mercurial/templatekw.py b/mercurial/templatekw.py
new file mode 100644
index 0000000..489dda6
--- /dev/null
+++ b/mercurial/templatekw.py
@@ -0,0 +1,341 @@
+# templatekw.py - common changeset template keywords
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import hex
+import patch, util, error
+import hbisect
+
+def showlist(name, values, plural=None, **args):
+ '''expand set of values.
+ name is name of key in template map.
+ values is list of strings or dicts.
+ plural is plural of name, if not simply name + 's'.
+
+ expansion works like this, given name 'foo'.
+
+ if values is empty, expand 'no_foos'.
+
+ if 'foo' not in template map, return values as a string,
+ joined by space.
+
+ expand 'start_foos'.
+
+ for each value, expand 'foo'. if 'last_foo' in template
+ map, expand it instead of 'foo' for last key.
+
+ expand 'end_foos'.
+ '''
+ templ = args['templ']
+ if plural:
+ names = plural
+ else: names = name + 's'
+ if not values:
+ noname = 'no_' + names
+ if noname in templ:
+ yield templ(noname, **args)
+ return
+ if name not in templ:
+ if isinstance(values[0], str):
+ yield ' '.join(values)
+ else:
+ for v in values:
+ yield dict(v, **args)
+ return
+ startname = 'start_' + names
+ if startname in templ:
+ yield templ(startname, **args)
+ vargs = args.copy()
+ def one(v, tag=name):
+ try:
+ vargs.update(v)
+ except (AttributeError, ValueError):
+ try:
+ for a, b in v:
+ vargs[a] = b
+ except ValueError:
+ vargs[name] = v
+ return templ(tag, **vargs)
+ lastname = 'last_' + name
+ if lastname in templ:
+ last = values.pop()
+ else:
+ last = None
+ for v in values:
+ yield one(v)
+ if last is not None:
+ yield one(last, tag=lastname)
+ endname = 'end_' + names
+ if endname in templ:
+ yield templ(endname, **args)
+
+def getfiles(repo, ctx, revcache):
+ if 'files' not in revcache:
+ revcache['files'] = repo.status(ctx.p1().node(), ctx.node())[:3]
+ return revcache['files']
+
+def getlatesttags(repo, ctx, cache):
+ '''return date, distance and name for the latest tag of rev'''
+
+ if 'latesttags' not in cache:
+ # Cache mapping from rev to a tuple with tag date, tag
+ # distance and tag name
+ cache['latesttags'] = {-1: (0, 0, 'null')}
+ latesttags = cache['latesttags']
+
+ rev = ctx.rev()
+ todo = [rev]
+ while todo:
+ rev = todo.pop()
+ if rev in latesttags:
+ continue
+ ctx = repo[rev]
+ tags = [t for t in ctx.tags() if repo.tagtype(t) == 'global']
+ if tags:
+ latesttags[rev] = ctx.date()[0], 0, ':'.join(sorted(tags))
+ continue
+ try:
+ # The tuples are laid out so the right one can be found by
+ # comparison.
+ pdate, pdist, ptag = max(
+ latesttags[p.rev()] for p in ctx.parents())
+ except KeyError:
+ # Cache miss - recurse
+ todo.append(rev)
+ todo.extend(p.rev() for p in ctx.parents())
+ continue
+ latesttags[rev] = pdate, pdist + 1, ptag
+ return latesttags[rev]
+
+def getrenamedfn(repo, endrev=None):
+ rcache = {}
+ if endrev is None:
+ endrev = len(repo)
+
+ def getrenamed(fn, rev):
+ '''looks up all renames for a file (up to endrev) the first
+ time the file is given. It indexes on the changerev and only
+ parses the manifest if linkrev != changerev.
+ Returns rename info for fn at changerev rev.'''
+ if fn not in rcache:
+ rcache[fn] = {}
+ fl = repo.file(fn)
+ for i in fl:
+ lr = fl.linkrev(i)
+ renamed = fl.renamed(fl.node(i))
+ rcache[fn][lr] = renamed
+ if lr >= endrev:
+ break
+ if rev in rcache[fn]:
+ return rcache[fn][rev]
+
+ # If linkrev != rev (i.e. rev not found in rcache) fallback to
+ # filectx logic.
+ try:
+ return repo[rev][fn].renamed()
+ except error.LookupError:
+ return None
+
+ return getrenamed
+
+
+def showauthor(repo, ctx, templ, **args):
+ """:author: String. The unmodified author of the changeset."""
+ return ctx.user()
+
+def showbisect(repo, ctx, templ, **args):
+ """:bisect: String. The changeset bisection status."""
+ return hbisect.label(repo, ctx.node())
+
+def showbranch(**args):
+ """:branch: String. The name of the branch on which the changeset was
+ committed.
+ """
+ return args['ctx'].branch()
+
+def showbranches(**args):
+ """:branches: List of strings. The name of the branch on which the
+ changeset was committed. Will be empty if the branch name was
+ default.
+ """
+ branch = args['ctx'].branch()
+ if branch != 'default':
+ return showlist('branch', [branch], plural='branches', **args)
+
+def showbookmarks(**args):
+ """:bookmarks: List of strings. Any bookmarks associated with the
+ changeset.
+ """
+ bookmarks = args['ctx'].bookmarks()
+ return showlist('bookmark', bookmarks, **args)
+
+def showchildren(**args):
+ """:children: List of strings. The children of the changeset."""
+ ctx = args['ctx']
+ childrevs = ['%d:%s' % (cctx, cctx) for cctx in ctx.children()]
+ return showlist('children', childrevs, **args)
+
+def showdate(repo, ctx, templ, **args):
+ """:date: Date information. The date when the changeset was committed."""
+ return ctx.date()
+
+def showdescription(repo, ctx, templ, **args):
+ """:desc: String. The text of the changeset description."""
+ return ctx.description().strip()
+
+def showdiffstat(repo, ctx, templ, **args):
+ """:diffstat: String. Statistics of changes with the following format:
+ "modified files: +added/-removed lines"
+ """
+ stats = patch.diffstatdata(util.iterlines(ctx.diff()))
+ maxname, maxtotal, adds, removes, binary = patch.diffstatsum(stats)
+ return '%s: +%s/-%s' % (len(stats), adds, removes)
+
+def showextras(**args):
+ templ = args['templ']
+ for key, value in sorted(args['ctx'].extra().items()):
+ args = args.copy()
+ args.update(dict(key=key, value=value))
+ yield templ('extra', **args)
+
+def showfileadds(**args):
+ """:file_adds: List of strings. Files added by this changeset."""
+ repo, ctx, revcache = args['repo'], args['ctx'], args['revcache']
+ return showlist('file_add', getfiles(repo, ctx, revcache)[1], **args)
+
+def showfilecopies(**args):
+ """:file_copies: List of strings. Files copied in this changeset with
+ their sources.
+ """
+ cache, ctx = args['cache'], args['ctx']
+ copies = args['revcache'].get('copies')
+ if copies is None:
+ if 'getrenamed' not in cache:
+ cache['getrenamed'] = getrenamedfn(args['repo'])
+ copies = []
+ getrenamed = cache['getrenamed']
+ for fn in ctx.files():
+ rename = getrenamed(fn, ctx.rev())
+ if rename:
+ copies.append((fn, rename[0]))
+
+ c = [{'name': x[0], 'source': x[1]} for x in copies]
+ return showlist('file_copy', c, plural='file_copies', **args)
+
+# showfilecopiesswitch() displays file copies only if copy records are
+# provided before calling the templater, usually with a --copies
+# command line switch.
+def showfilecopiesswitch(**args):
+ """:file_copies_switch: List of strings. Like "file_copies" but displayed
+ only if the --copied switch is set.
+ """
+ copies = args['revcache'].get('copies') or []
+ c = [{'name': x[0], 'source': x[1]} for x in copies]
+ return showlist('file_copy', c, plural='file_copies', **args)
+
+def showfiledels(**args):
+ """:file_dels: List of strings. Files removed by this changeset."""
+ repo, ctx, revcache = args['repo'], args['ctx'], args['revcache']
+ return showlist('file_del', getfiles(repo, ctx, revcache)[2], **args)
+
+def showfilemods(**args):
+ """:file_mods: List of strings. Files modified by this changeset."""
+ repo, ctx, revcache = args['repo'], args['ctx'], args['revcache']
+ return showlist('file_mod', getfiles(repo, ctx, revcache)[0], **args)
+
+def showfiles(**args):
+ """:files: List of strings. All files modified, added, or removed by this
+ changeset.
+ """
+ return showlist('file', args['ctx'].files(), **args)
+
+def showlatesttag(repo, ctx, templ, cache, **args):
+ """:latesttag: String. Most recent global tag in the ancestors of this
+ changeset.
+ """
+ return getlatesttags(repo, ctx, cache)[2]
+
+def showlatesttagdistance(repo, ctx, templ, cache, **args):
+ """:latesttagdistance: Integer. Longest path to the latest tag."""
+ return getlatesttags(repo, ctx, cache)[1]
+
+def showmanifest(**args):
+ repo, ctx, templ = args['repo'], args['ctx'], args['templ']
+ args = args.copy()
+ args.update(dict(rev=repo.manifest.rev(ctx.changeset()[0]),
+ node=hex(ctx.changeset()[0])))
+ return templ('manifest', **args)
+
+def shownode(repo, ctx, templ, **args):
+ """:node: String. The changeset identification hash, as a 40 hexadecimal
+ digit string.
+ """
+ return ctx.hex()
+
+def showphase(repo, ctx, templ, **args):
+ """:phase: String. The changeset phase name."""
+ return ctx.phasestr()
+
+def showphaseidx(repo, ctx, templ, **args):
+ """:phaseidx: Integer. The changeset phase index."""
+ return ctx.phase()
+
+def showrev(repo, ctx, templ, **args):
+ """:rev: Integer. The repository-local changeset revision number."""
+ return ctx.rev()
+
+def showtags(**args):
+ """:tags: List of strings. Any tags associated with the changeset."""
+ return showlist('tag', args['ctx'].tags(), **args)
+
+# keywords are callables like:
+# fn(repo, ctx, templ, cache, revcache, **args)
+# with:
+# repo - current repository instance
+# ctx - the changectx being displayed
+# templ - the templater instance
+# cache - a cache dictionary for the whole templater run
+# revcache - a cache dictionary for the current revision
+keywords = {
+ 'author': showauthor,
+ 'bisect': showbisect,
+ 'branch': showbranch,
+ 'branches': showbranches,
+ 'bookmarks': showbookmarks,
+ 'children': showchildren,
+ 'date': showdate,
+ 'desc': showdescription,
+ 'diffstat': showdiffstat,
+ 'extras': showextras,
+ 'file_adds': showfileadds,
+ 'file_copies': showfilecopies,
+ 'file_copies_switch': showfilecopiesswitch,
+ 'file_dels': showfiledels,
+ 'file_mods': showfilemods,
+ 'files': showfiles,
+ 'latesttag': showlatesttag,
+ 'latesttagdistance': showlatesttagdistance,
+ 'manifest': showmanifest,
+ 'node': shownode,
+ 'phase': showphase,
+ 'phaseidx': showphaseidx,
+ 'rev': showrev,
+ 'tags': showtags,
+}
+
+def _showparents(**args):
+ """:parents: List of strings. The parents of the changeset in "rev:node"
+ format. If the changeset has only one "natural" parent (the predecessor
+ revision) nothing is shown."""
+ pass
+
+dockeywords = {
+ 'parents': _showparents,
+}
+dockeywords.update(keywords)
+
+# tell hggettext to extract docstrings from these functions:
+i18nfunctions = dockeywords.values()
diff --git a/mercurial/templater.py b/mercurial/templater.py
new file mode 100644
index 0000000..16558da
--- /dev/null
+++ b/mercurial/templater.py
@@ -0,0 +1,392 @@
+# templater.py - template expansion for output
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import sys, os
+import util, config, templatefilters, parser, error
+
+# template parsing
+
+elements = {
+ "(": (20, ("group", 1, ")"), ("func", 1, ")")),
+ ",": (2, None, ("list", 2)),
+ "|": (5, None, ("|", 5)),
+ "%": (6, None, ("%", 6)),
+ ")": (0, None, None),
+ "symbol": (0, ("symbol",), None),
+ "string": (0, ("string",), None),
+ "end": (0, None, None),
+}
+
+def tokenizer(data):
+ program, start, end = data
+ pos = start
+ while pos < end:
+ c = program[pos]
+ if c.isspace(): # skip inter-token whitespace
+ pass
+ elif c in "(,)%|": # handle simple operators
+ yield (c, None, pos)
+ elif (c in '"\'' or c == 'r' and
+ program[pos:pos + 2] in ("r'", 'r"')): # handle quoted strings
+ if c == 'r':
+ pos += 1
+ c = program[pos]
+ decode = lambda x: x
+ else:
+ decode = lambda x: x.decode('string-escape')
+ pos += 1
+ s = pos
+ while pos < end: # find closing quote
+ d = program[pos]
+ if d == '\\': # skip over escaped characters
+ pos += 2
+ continue
+ if d == c:
+ yield ('string', decode(program[s:pos]), s)
+ break
+ pos += 1
+ else:
+ raise error.ParseError(_("unterminated string"), s)
+ elif c.isalnum() or c in '_':
+ s = pos
+ pos += 1
+ while pos < end: # find end of symbol
+ d = program[pos]
+ if not (d.isalnum() or d == "_"):
+ break
+ pos += 1
+ sym = program[s:pos]
+ yield ('symbol', sym, s)
+ pos -= 1
+ elif c == '}':
+ pos += 1
+ break
+ else:
+ raise error.ParseError(_("syntax error"), pos)
+ pos += 1
+ yield ('end', None, pos)
+
+def compiletemplate(tmpl, context):
+ parsed = []
+ pos, stop = 0, len(tmpl)
+ p = parser.parser(tokenizer, elements)
+
+ while pos < stop:
+ n = tmpl.find('{', pos)
+ if n < 0:
+ parsed.append(("string", tmpl[pos:]))
+ break
+ if n > 0 and tmpl[n - 1] == '\\':
+ # escaped
+ parsed.append(("string", tmpl[pos:n - 1] + "{"))
+ pos = n + 1
+ continue
+ if n > pos:
+ parsed.append(("string", tmpl[pos:n]))
+
+ pd = [tmpl, n + 1, stop]
+ parseres, pos = p.parse(pd)
+ parsed.append(parseres)
+
+ return [compileexp(e, context) for e in parsed]
+
+def compileexp(exp, context):
+ t = exp[0]
+ if t in methods:
+ return methods[t](exp, context)
+ raise error.ParseError(_("unknown method '%s'") % t)
+
+# template evaluation
+
+def getsymbol(exp):
+ if exp[0] == 'symbol':
+ return exp[1]
+ raise error.ParseError(_("expected a symbol"))
+
+def getlist(x):
+ if not x:
+ return []
+ if x[0] == 'list':
+ return getlist(x[1]) + [x[2]]
+ return [x]
+
+def getfilter(exp, context):
+ f = getsymbol(exp)
+ if f not in context._filters:
+ raise error.ParseError(_("unknown function '%s'") % f)
+ return context._filters[f]
+
+def gettemplate(exp, context):
+ if exp[0] == 'string':
+ return compiletemplate(exp[1], context)
+ if exp[0] == 'symbol':
+ return context._load(exp[1])
+ raise error.ParseError(_("expected template specifier"))
+
+def runstring(context, mapping, data):
+ return data
+
+def runsymbol(context, mapping, key):
+ v = mapping.get(key)
+ if v is None:
+ v = context._defaults.get(key, '')
+ if util.safehasattr(v, '__call__'):
+ return v(**mapping)
+ return v
+
+def buildfilter(exp, context):
+ func, data = compileexp(exp[1], context)
+ filt = getfilter(exp[2], context)
+ return (runfilter, (func, data, filt))
+
+def runfilter(context, mapping, data):
+ func, data, filt = data
+ return filt(func(context, mapping, data))
+
+def buildmap(exp, context):
+ func, data = compileexp(exp[1], context)
+ ctmpl = gettemplate(exp[2], context)
+ return (runmap, (func, data, ctmpl))
+
+def runmap(context, mapping, data):
+ func, data, ctmpl = data
+ d = func(context, mapping, data)
+ lm = mapping.copy()
+
+ for i in d:
+ if isinstance(i, dict):
+ lm.update(i)
+ for f, d in ctmpl:
+ yield f(context, lm, d)
+ else:
+ # v is not an iterable of dicts, this happen when 'key'
+ # has been fully expanded already and format is useless.
+ # If so, return the expanded value.
+ yield i
+
+def buildfunc(exp, context):
+ n = getsymbol(exp[1])
+ args = [compileexp(x, context) for x in getlist(exp[2])]
+ if n in funcs:
+ f = funcs[n]
+ return (f, args)
+ if n in context._filters:
+ if len(args) != 1:
+ raise error.ParseError(_("filter %s expects one argument") % n)
+ f = context._filters[n]
+ return (runfilter, (args[0][0], args[0][1], f))
+
+methods = {
+ "string": lambda e, c: (runstring, e[1]),
+ "symbol": lambda e, c: (runsymbol, e[1]),
+ "group": lambda e, c: compileexp(e[1], c),
+# ".": buildmember,
+ "|": buildfilter,
+ "%": buildmap,
+ "func": buildfunc,
+ }
+
+funcs = {
+}
+
+# template engine
+
+path = ['templates', '../templates']
+stringify = templatefilters.stringify
+
+def _flatten(thing):
+ '''yield a single stream from a possibly nested set of iterators'''
+ if isinstance(thing, str):
+ yield thing
+ elif not util.safehasattr(thing, '__iter__'):
+ if thing is not None:
+ yield str(thing)
+ else:
+ for i in thing:
+ if isinstance(i, str):
+ yield i
+ elif not util.safehasattr(i, '__iter__'):
+ if i is not None:
+ yield str(i)
+ elif i is not None:
+ for j in _flatten(i):
+ yield j
+
+def parsestring(s, quoted=True):
+ '''parse a string using simple c-like syntax.
+ string must be in quotes if quoted is True.'''
+ if quoted:
+ if len(s) < 2 or s[0] != s[-1]:
+ raise SyntaxError(_('unmatched quotes'))
+ return s[1:-1].decode('string_escape')
+
+ return s.decode('string_escape')
+
+class engine(object):
+ '''template expansion engine.
+
+ template expansion works like this. a map file contains key=value
+ pairs. if value is quoted, it is treated as string. otherwise, it
+ is treated as name of template file.
+
+ templater is asked to expand a key in map. it looks up key, and
+ looks for strings like this: {foo}. it expands {foo} by looking up
+ foo in map, and substituting it. expansion is recursive: it stops
+ when there is no more {foo} to replace.
+
+ expansion also allows formatting and filtering.
+
+ format uses key to expand each item in list. syntax is
+ {key%format}.
+
+ filter uses function to transform value. syntax is
+ {key|filter1|filter2|...}.'''
+
+ def __init__(self, loader, filters={}, defaults={}):
+ self._loader = loader
+ self._filters = filters
+ self._defaults = defaults
+ self._cache = {}
+
+ def _load(self, t):
+ '''load, parse, and cache a template'''
+ if t not in self._cache:
+ self._cache[t] = compiletemplate(self._loader(t), self)
+ return self._cache[t]
+
+ def process(self, t, mapping):
+ '''Perform expansion. t is name of map element to expand.
+ mapping contains added elements for use during expansion. Is a
+ generator.'''
+ return _flatten(func(self, mapping, data) for func, data in
+ self._load(t))
+
+engines = {'default': engine}
+
+class templater(object):
+
+ def __init__(self, mapfile, filters={}, defaults={}, cache={},
+ minchunk=1024, maxchunk=65536):
+ '''set up template engine.
+ mapfile is name of file to read map definitions from.
+ filters is dict of functions. each transforms a value into another.
+ defaults is dict of default map definitions.'''
+ self.mapfile = mapfile or 'template'
+ self.cache = cache.copy()
+ self.map = {}
+ self.base = (mapfile and os.path.dirname(mapfile)) or ''
+ self.filters = templatefilters.filters.copy()
+ self.filters.update(filters)
+ self.defaults = defaults
+ self.minchunk, self.maxchunk = minchunk, maxchunk
+ self.ecache = {}
+
+ if not mapfile:
+ return
+ if not os.path.exists(mapfile):
+ raise util.Abort(_('style not found: %s') % mapfile)
+
+ conf = config.config()
+ conf.read(mapfile)
+
+ for key, val in conf[''].items():
+ if val[0] in "'\"":
+ try:
+ self.cache[key] = parsestring(val)
+ except SyntaxError, inst:
+ raise SyntaxError('%s: %s' %
+ (conf.source('', key), inst.args[0]))
+ else:
+ val = 'default', val
+ if ':' in val[1]:
+ val = val[1].split(':', 1)
+ self.map[key] = val[0], os.path.join(self.base, val[1])
+
+ def __contains__(self, key):
+ return key in self.cache or key in self.map
+
+ def load(self, t):
+ '''Get the template for the given template name. Use a local cache.'''
+ if t not in self.cache:
+ try:
+ self.cache[t] = util.readfile(self.map[t][1])
+ except KeyError, inst:
+ raise util.Abort(_('"%s" not in template map') % inst.args[0])
+ except IOError, inst:
+ raise IOError(inst.args[0], _('template file %s: %s') %
+ (self.map[t][1], inst.args[1]))
+ return self.cache[t]
+
+ def __call__(self, t, **mapping):
+ ttype = t in self.map and self.map[t][0] or 'default'
+ if ttype not in self.ecache:
+ self.ecache[ttype] = engines[ttype](self.load,
+ self.filters, self.defaults)
+ proc = self.ecache[ttype]
+
+ stream = proc.process(t, mapping)
+ if self.minchunk:
+ stream = util.increasingchunks(stream, min=self.minchunk,
+ max=self.maxchunk)
+ return stream
+
+def templatepath(name=None):
+ '''return location of template file or directory (if no name).
+ returns None if not found.'''
+ normpaths = []
+
+ # executable version (py2exe) doesn't support __file__
+ if util.mainfrozen():
+ module = sys.executable
+ else:
+ module = __file__
+ for f in path:
+ if f.startswith('/'):
+ p = f
+ else:
+ fl = f.split('/')
+ p = os.path.join(os.path.dirname(module), *fl)
+ if name:
+ p = os.path.join(p, name)
+ if name and os.path.exists(p):
+ return os.path.normpath(p)
+ elif os.path.isdir(p):
+ normpaths.append(os.path.normpath(p))
+
+ return normpaths
+
+def stylemap(styles, paths=None):
+ """Return path to mapfile for a given style.
+
+ Searches mapfile in the following locations:
+ 1. templatepath/style/map
+ 2. templatepath/map-style
+ 3. templatepath/map
+ """
+
+ if paths is None:
+ paths = templatepath()
+ elif isinstance(paths, str):
+ paths = [paths]
+
+ if isinstance(styles, str):
+ styles = [styles]
+
+ for style in styles:
+ if not style:
+ continue
+ locations = [os.path.join(style, 'map'), 'map-' + style]
+ locations.append('map')
+
+ for path in paths:
+ for location in locations:
+ mapfile = os.path.join(path, location)
+ if os.path.isfile(mapfile):
+ return style, mapfile
+
+ raise RuntimeError("No hgweb templates found in %r" % paths)
diff --git a/mercurial/templates/atom/bookmarkentry.tmpl b/mercurial/templates/atom/bookmarkentry.tmpl
new file mode 100644
index 0000000..3edef27
--- /dev/null
+++ b/mercurial/templates/atom/bookmarkentry.tmpl
@@ -0,0 +1,8 @@
+ <entry>
+ <title>{bookmark|escape}</title>
+ <link rel="alternate" href="{urlbase}{url}rev/{node|short}"/>
+ <id>{urlbase}{url}#bookmark-{node}</id>
+ <updated>{date|rfc3339date}</updated>
+ <published>{date|rfc3339date}</published>
+ <content type="text">{bookmark|strip|escape}</content>
+ </entry>
diff --git a/mercurial/templates/atom/bookmarks.tmpl b/mercurial/templates/atom/bookmarks.tmpl
new file mode 100644
index 0000000..547c3a9
--- /dev/null
+++ b/mercurial/templates/atom/bookmarks.tmpl
@@ -0,0 +1,11 @@
+{header}
+ <id>{urlbase}{url}</id>
+ <link rel="self" href="{urlbase}{url}atom-bookmarks"/>
+ <link rel="alternate" href="{urlbase}{url}bookmarks"/>
+ <title>{repo|escape}: bookmarks</title>
+ <summary>{repo|escape} bookmark history</summary>
+ <author><name>Mercurial SCM</name></author>
+ {latestentry%feedupdated}
+
+{entries%bookmarkentry}
+</feed>
diff --git a/mercurial/templates/atom/changelog.tmpl b/mercurial/templates/atom/changelog.tmpl
new file mode 100644
index 0000000..29902ab
--- /dev/null
+++ b/mercurial/templates/atom/changelog.tmpl
@@ -0,0 +1,10 @@
+{header}
+ <!-- Changelog -->
+ <id>{urlbase}{url}</id>
+ <link rel="self" href="{urlbase}{url}atom-log"/>
+ <link rel="alternate" href="{urlbase}{url}"/>
+ <title>{repo|escape} Changelog</title>
+ {latestentry%feedupdated}
+
+{entries%changelogentry}
+</feed>
diff --git a/mercurial/templates/atom/changelogentry.tmpl b/mercurial/templates/atom/changelogentry.tmpl
new file mode 100644
index 0000000..068b5ea
--- /dev/null
+++ b/mercurial/templates/atom/changelogentry.tmpl
@@ -0,0 +1,16 @@
+ <entry>
+ <title>{desc|strip|firstline|strip|escape|nonempty}</title>
+ <id>{urlbase}{url}#changeset-{node}</id>
+ <link href="{urlbase}{url}rev/{node|short}"/>
+ <author>
+ <name>{author|person|escape}</name>
+ <email>{author|email|obfuscate}</email>
+ </author>
+ <updated>{date|rfc3339date}</updated>
+ <published>{date|rfc3339date}</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">{desc|escape|nonempty}</pre>
+ </div>
+ </content>
+ </entry>
diff --git a/mercurial/templates/atom/error.tmpl b/mercurial/templates/atom/error.tmpl
new file mode 100644
index 0000000..5735fba
--- /dev/null
+++ b/mercurial/templates/atom/error.tmpl
@@ -0,0 +1,17 @@
+{header}
+ <!-- Error -->
+ <id>{urlbase}{url}</id>
+ <link rel="self" href="{urlbase}{url}atom-log"/>
+ <link rel="alternate" href="{urlbase}{url}"/>
+ <title>Error</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <entry>
+ <title>Error</title>
+ <id>http://mercurial.selenic.com/#error</id>
+ <author>
+ <name>mercurial</name>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <content type="text">{error|escape}</content>
+ </entry>
+</feed>
diff --git a/mercurial/templates/atom/filelog.tmpl b/mercurial/templates/atom/filelog.tmpl
new file mode 100644
index 0000000..99d4e9b
--- /dev/null
+++ b/mercurial/templates/atom/filelog.tmpl
@@ -0,0 +1,8 @@
+{header}
+ <id>{urlbase}{url}atom-log/tip/{file|escape}</id>
+ <link rel="self" href="{urlbase}{url}atom-log/tip/{file|urlescape}"/>
+ <title>{repo|escape}: {file|escape} history</title>
+ {latestentry%feedupdated}
+
+{entries%changelogentry}
+</feed>
diff --git a/mercurial/templates/atom/header.tmpl b/mercurial/templates/atom/header.tmpl
new file mode 100644
index 0000000..90ffceb
--- /dev/null
+++ b/mercurial/templates/atom/header.tmpl
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="{encoding}"?>
+<feed xmlns="http://www.w3.org/2005/Atom"> \ No newline at end of file
diff --git a/mercurial/templates/atom/map b/mercurial/templates/atom/map
new file mode 100644
index 0000000..b4d9324
--- /dev/null
+++ b/mercurial/templates/atom/map
@@ -0,0 +1,13 @@
+default = 'changelog'
+feedupdated = '<updated>{date|rfc3339date}</updated>'
+mimetype = 'application/atom+xml; charset={encoding}'
+header = header.tmpl
+changelog = changelog.tmpl
+changelogentry = changelogentry.tmpl
+filelog = filelog.tmpl
+filelogentry = filelogentry.tmpl
+tags = tags.tmpl
+tagentry = tagentry.tmpl
+bookmarks = bookmarks.tmpl
+bookmarkentry = bookmarkentry.tmpl
+error = error.tmpl
diff --git a/mercurial/templates/atom/tagentry.tmpl b/mercurial/templates/atom/tagentry.tmpl
new file mode 100644
index 0000000..857df12
--- /dev/null
+++ b/mercurial/templates/atom/tagentry.tmpl
@@ -0,0 +1,8 @@
+ <entry>
+ <title>{tag|escape}</title>
+ <link rel="alternate" href="{urlbase}{url}rev/{node|short}"/>
+ <id>{urlbase}{url}#tag-{node}</id>
+ <updated>{date|rfc3339date}</updated>
+ <published>{date|rfc3339date}</published>
+ <content type="text">{tag|strip|escape}</content>
+ </entry>
diff --git a/mercurial/templates/atom/tags.tmpl b/mercurial/templates/atom/tags.tmpl
new file mode 100644
index 0000000..82294ec
--- /dev/null
+++ b/mercurial/templates/atom/tags.tmpl
@@ -0,0 +1,11 @@
+{header}
+ <id>{urlbase}{url}</id>
+ <link rel="self" href="{urlbase}{url}atom-tags"/>
+ <link rel="alternate" href="{urlbase}{url}tags"/>
+ <title>{repo|escape}: tags</title>
+ <summary>{repo|escape} tag history</summary>
+ <author><name>Mercurial SCM</name></author>
+ {latestentry%feedupdated}
+
+{entriesnotip%tagentry}
+</feed>
diff --git a/mercurial/templates/coal/header.tmpl b/mercurial/templates/coal/header.tmpl
new file mode 100644
index 0000000..f44f73a
--- /dev/null
+++ b/mercurial/templates/coal/header.tmpl
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<link rel="icon" href="{staticurl}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="{staticurl}style-coal.css" type="text/css" />
+<script type="text/javascript" src="{staticurl}mercurial.js"></script>
diff --git a/mercurial/templates/coal/map b/mercurial/templates/coal/map
new file mode 100644
index 0000000..320996f
--- /dev/null
+++ b/mercurial/templates/coal/map
@@ -0,0 +1,225 @@
+default = 'shortlog'
+
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = ../paper/footer.tmpl
+search = ../paper/search.tmpl
+
+changelog = ../paper/shortlog.tmpl
+shortlog = ../paper/shortlog.tmpl
+shortlogentry = ../paper/shortlogentry.tmpl
+graph = ../paper/graph.tmpl
+
+help = ../paper/help.tmpl
+helptopics = ../paper/helptopics.tmpl
+
+helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
+
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+diffstatlink = ../paper/diffstat.tmpl
+diffstatnolink = ../paper/diffstat.tmpl
+changelogentry = ../paper/shortlogentry.tmpl
+searchentry = ../paper/shortlogentry.tmpl
+changeset = ../paper/changeset.tmpl
+manifest = ../paper/manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+direntry = '
+ <tr class="fileline parity{parity}">
+ <td class="name">
+ <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">
+ <img src="{staticurl}coal-folder.png" alt="dir."/> {basename|escape}/
+ </a>
+ <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
+ {emptydirs|escape}
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>'
+
+fileentry = '
+ <tr class="fileline parity{parity}">
+ <td class="filename">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ <img src="{staticurl}coal-file.png" alt="file"/> {basename|escape}
+ </a>
+ </td>
+ <td class="size">{size}</td>
+ <td class="permissions">{permissions|permissions}</td>
+ </tr>'
+
+filerevision = ../paper/filerevision.tmpl
+fileannotate = ../paper/fileannotate.tmpl
+filediff = ../paper/filediff.tmpl
+filecomparison = ../paper/filecomparison.tmpl
+filelog = ../paper/filelog.tmpl
+fileline = '
+ <div class="parity{parity} source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</div>'
+filelogentry = ../paper/filelogentry.tmpl
+
+annotateline = '
+ <tr class="parity{parity}">
+ <td class="annotate">
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#{targetline}"
+ title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+ </td>
+ <td class="source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</td>
+ </tr>'
+
+diffblock = '<div class="source bottomline parity{parity}"><pre>{lines}</pre></div>'
+difflineplus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="plusline">{line|escape}</span>'
+difflineminus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="minusline">{line|escape}</span>'
+difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>'
+diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}'
+
+comparisonblock ='
+ <tbody class="block">
+ {lines}
+ </tbody>'
+comparisonline = '
+ <tr>
+ <td class="source {type}"><a href="#{lineid}" id="{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+ <td class="source {type}"><a href="#{lineid}" id="{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+ </tr>'
+
+changelogparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+
+changesetparent = '<a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerevparent = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
+filerevchild = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerename = '{file|escape}@'
+filelogrename = '
+ <span class="base">
+ base
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {file|escape}@{node|short}
+ </a>
+ </span>'
+fileannotateparent = '
+ <tr>
+ <td class="metatag">parent:</td>
+ <td>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+changesetchild = ' <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
+changelogchild = '
+ <tr>
+ <th class="child">child</th>
+ <td class="child">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+fileannotatechild = '
+ <tr>
+ <td class="metatag">child:</td>
+ <td>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+tags = ../paper/tags.tmpl
+tagentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {tag|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+bookmarks = ../paper/bookmarks.tmpl
+bookmarkentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {bookmark|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+branches = ../paper/branches.tmpl
+branchentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
+ {branch|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+changelogtag = '<span class="tag">{name|escape}</span> '
+changesettag = '<span class="tag">{tag|escape}</span> '
+changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
+changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
+changelogbranchname = '<span class="branchname">{name|escape}</span> '
+
+filediffparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filelogparent = '
+ <tr>
+ <th>parent {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filediffchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filelogchild = '
+ <tr>
+ <th>child {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+
+indexentry = '
+ <tr class="parity{parity}">
+ <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
+ <td>{description}</td>
+ <td>{contact|obfuscate}</td>
+ <td class="age">{lastchange|rfc822date}</td>
+ <td class="indexlinks">{archives%indexarchiveentry}</td>
+ </tr>\n'
+indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
+index = ../paper/index.tmpl
+archiveentry = '
+ <li>
+ <a href="{url}archive/{node|short}{extension|urlescape}">{type|escape}</a>
+ </li>'
+notfound = ../paper/notfound.tmpl
+error = ../paper/error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
diff --git a/mercurial/templates/gitweb/bookmarks.tmpl b/mercurial/templates/gitweb/bookmarks.tmpl
new file mode 100644
index 0000000..fc0e66a
--- /dev/null
+++ b/mercurial/templates/gitweb/bookmarks.tmpl
@@ -0,0 +1,32 @@
+{header}
+<title>{repo|escape}: Bookmarks</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-bookmarks" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-bookmarks" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / bookmarks
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+bookmarks |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+{entries%bookmarkentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/gitweb/branches.tmpl b/mercurial/templates/gitweb/branches.tmpl
new file mode 100644
index 0000000..89f5457
--- /dev/null
+++ b/mercurial/templates/gitweb/branches.tmpl
@@ -0,0 +1,32 @@
+{header}
+<title>{repo|escape}: Branches</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / branches
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+branches |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+{entries%branchentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/gitweb/changelog.tmpl b/mercurial/templates/gitweb/changelog.tmpl
new file mode 100644
index 0000000..56d16d0
--- /dev/null
+++ b/mercurial/templates/gitweb/changelog.tmpl
@@ -0,0 +1,41 @@
+{header}
+<title>{repo|escape}: Changelog</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changelog
+</div>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<div class="search">
+<input type="text" name="rev" />
+</div>
+</form>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a> |
+changelog |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+{changenav%nav}<br/>
+</div>
+
+{entries%changelogentry}
+
+<div class="page_nav">
+{changenav%nav}<br/>
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/changelogentry.tmpl b/mercurial/templates/gitweb/changelogentry.tmpl
new file mode 100644
index 0000000..3935de6
--- /dev/null
+++ b/mercurial/templates/gitweb/changelogentry.tmpl
@@ -0,0 +1,14 @@
+<div>
+<a class="title" href="{url}rev/{node|short}{sessionvars%urlparameter}"><span class="age">{date|rfc822date}</span>{desc|strip|firstline|escape|nonempty}<span class="logtags"> {inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a>
+</div>
+<div class="title_text">
+<div class="log_link">
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a><br/>
+</div>
+<i>{author|obfuscate} [{date|rfc822date}] rev {rev}</i><br/>
+</div>
+<div class="log_body">
+{desc|strip|escape|addbreaks|nonempty}
+<br/>
+<br/>
+</div>
diff --git a/mercurial/templates/gitweb/changeset.tmpl b/mercurial/templates/gitweb/changeset.tmpl
new file mode 100644
index 0000000..7c8f731
--- /dev/null
+++ b/mercurial/templates/gitweb/changeset.tmpl
@@ -0,0 +1,53 @@
+{header}
+<title>{repo|escape}: changeset {rev}:{node|short}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changeset
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+changeset |
+<a href="{url}raw-rev/{node|short}">raw</a> {archives%archiveentry} |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div>
+<a class="title" href="{url}raw-rev/{node|short}">{desc|strip|escape|firstline|nonempty} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a>
+</div>
+<div class="title_text">
+<table cellspacing="0">
+<tr><td>author</td><td>{author|obfuscate}</td></tr>
+<tr><td></td><td class="date age">{date|rfc822date}</td></tr>
+{branch%changesetbranch}
+<tr><td>changeset {rev}</td><td style="font-family:monospace">{node|short}</td></tr>
+{parent%changesetparent}
+{child%changesetchild}
+</table></div>
+
+<div class="page_body">
+{desc|strip|escape|addbreaks|nonempty}
+</div>
+<div class="list_head"></div>
+<div class="title_text">
+<table cellspacing="0">
+{files}
+</table></div>
+
+<div class="page_body">{diff}</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/error.tmpl b/mercurial/templates/gitweb/error.tmpl
new file mode 100644
index 0000000..b59046f
--- /dev/null
+++ b/mercurial/templates/gitweb/error.tmpl
@@ -0,0 +1,33 @@
+{header}
+<title>{repo|escape}: Error</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / error
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="page_body">
+<br/>
+<i>An error occurred while processing your request</i><br/>
+<br/>
+{error|escape}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/fileannotate.tmpl b/mercurial/templates/gitweb/fileannotate.tmpl
new file mode 100644
index 0000000..66b4aac
--- /dev/null
+++ b/mercurial/templates/gitweb/fileannotate.tmpl
@@ -0,0 +1,66 @@
+{header}
+<title>{repo|escape}: {file|escape}@{node|short} (annotated)</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / annotate
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+<a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+annotate |
+<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+<a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+<a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">{file|escape}</div>
+
+<div class="title_text">
+<table cellspacing="0">
+<tr>
+ <td>author</td>
+ <td>{author|obfuscate}</td></tr>
+<tr>
+ <td></td>
+ <td class="date age">{date|rfc822date}</td></tr>
+{branch%filerevbranch}
+<tr>
+ <td>changeset {rev}</td>
+ <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%fileannotateparent}
+{child%fileannotatechild}
+<tr>
+ <td>permissions</td>
+ <td style="font-family:monospace">{permissions|permissions}</td></tr>
+</table>
+</div>
+
+<div class="page_path">
+{desc|strip|escape|addbreaks|nonempty}
+</div>
+<div class="page_body">
+<table>
+{annotate%annotateline}
+</table>
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/filecomparison.tmpl b/mercurial/templates/gitweb/filecomparison.tmpl
new file mode 100644
index 0000000..e062486
--- /dev/null
+++ b/mercurial/templates/gitweb/filecomparison.tmpl
@@ -0,0 +1,71 @@
+{header}
+<title>{repo|escape}: comparison {file|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / comparison
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+<a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+comparison |
+<a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">{file|escape}</div>
+
+<table>
+{branch%filerevbranch}
+<tr>
+ <td>changeset {rev}</td>
+ <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%filecompparent}
+{child%filecompchild}
+</table>
+
+<div class="list_head"></div>
+
+<div class="page_body">
+
+<div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+</div>
+
+<div class="comparison">
+ <table style="border-collapse:collapse;">
+ <thead class="header">
+ <tr>
+ <th>{leftrev}:{leftnode|short}</th>
+ <th>{rightrev}:{rightnode|short}</th>
+ </tr>
+ </thead>
+ {comparison}
+ </table>
+</div>
+
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/filediff.tmpl b/mercurial/templates/gitweb/filediff.tmpl
new file mode 100644
index 0000000..42d0602
--- /dev/null
+++ b/mercurial/templates/gitweb/filediff.tmpl
@@ -0,0 +1,52 @@
+{header}
+<title>{repo|escape}: diff {file|escape}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / diff
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+<a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+diff |
+<a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+<a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">{file|escape}</div>
+
+<table>
+{branch%filerevbranch}
+<tr>
+ <td>changeset {rev}</td>
+ <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%filediffparent}
+{child%filediffchild}
+</table>
+
+<div class="list_head"></div>
+
+<div class="page_body">
+{diff}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/filelog.tmpl b/mercurial/templates/gitweb/filelog.tmpl
new file mode 100644
index 0000000..0591726
--- /dev/null
+++ b/mercurial/templates/gitweb/filelog.tmpl
@@ -0,0 +1,43 @@
+{header}
+<title>{repo|escape}: File revisions</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revisions
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+revisions |
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+<a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+<a href="{url}rss-log/tip/{file|urlescape}">rss</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+{nav%filenav}
+</div>
+
+<div class="title" >{file|urlescape}</div>
+
+<table>
+{entries%filelogentry}
+</table>
+
+<div class="page_nav">
+{nav%filenav}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/filerevision.tmpl b/mercurial/templates/gitweb/filerevision.tmpl
new file mode 100644
index 0000000..f47320d
--- /dev/null
+++ b/mercurial/templates/gitweb/filerevision.tmpl
@@ -0,0 +1,65 @@
+{header}
+<title>{repo|escape}: {file|escape}@{node|short}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revision
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a> |
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+file |
+<a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a> |
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+<a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+<a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">{file|escape}</div>
+
+<div class="title_text">
+<table cellspacing="0">
+<tr>
+ <td>author</td>
+ <td>{author|obfuscate}</td></tr>
+<tr>
+ <td></td>
+ <td class="date age">{date|rfc822date}</td></tr>
+{branch%filerevbranch}
+<tr>
+ <td>changeset {rev}</td>
+ <td style="font-family:monospace"><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%filerevparent}
+{child%filerevchild}
+<tr>
+ <td>permissions</td>
+ <td style="font-family:monospace">{permissions|permissions}</td></tr>
+</table>
+</div>
+
+<div class="page_path">
+{desc|strip|escape|addbreaks|nonempty}
+</div>
+
+<div class="page_body">
+{text%fileline}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/footer.tmpl b/mercurial/templates/gitweb/footer.tmpl
new file mode 100644
index 0000000..298800b
--- /dev/null
+++ b/mercurial/templates/gitweb/footer.tmpl
@@ -0,0 +1,12 @@
+<script type="text/javascript">process_dates()</script>
+<div class="page_footer">
+<div class="page_footer_text">{repo|escape}</div>
+<div class="rss_logo">
+<a href="{url}rss-log">RSS</a>
+<a href="{url}atom-log">Atom</a>
+</div>
+<br />
+{motd}
+</div>
+</body>
+</html>
diff --git a/mercurial/templates/gitweb/graph.tmpl b/mercurial/templates/gitweb/graph.tmpl
new file mode 100644
index 0000000..039ef8b
--- /dev/null
+++ b/mercurial/templates/gitweb/graph.tmpl
@@ -0,0 +1,118 @@
+{header}
+<title>{repo|escape}: Graph</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+<!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / graph
+</div>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<div class="search">
+<input type="text" name="rev" />
+</div>
+</form>
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
+graph |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
+| {changenav%navgraph}<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+
+<noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
+
+<div id="wrapper">
+<ul id="nodebgs"></ul>
+<canvas id="graph" width="480" height="{canvasheight}"></canvas>
+<ul id="graphnodes"></ul>
+</div>
+
+<script>
+<!-- hide script content
+
+var data = {jsdata|json};
+var graph = new Graph();
+graph.scale({bg_height});
+
+var revlink = '<li style="_STYLE"><span class="desc">';
+revlink += '<a class="list" href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID"><b>_DESC</b></a>';
+revlink += '</span> _TAGS';
+revlink += '<span class="info">_DATE, by _USER</span></li>';
+
+graph.vertex = function(x, y, color, parity, cur) \{
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ var tagspan = '';
+ if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
+ tagspan = '<span class="logtags">';
+ if (cur[6][1]) \{
+ tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ } else if (!cur[6][1] && cur[6][0] != 'default') \{
+ tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ }
+ if (cur[7].length) \{
+ for (var t in cur[7]) \{
+ var tag = cur[7][t];
+ tagspan += '<span class="tagtag">' + tag + '</span> ';
+ }
+ }
+ if (cur[8].length) \{
+ for (var t in cur[8]) \{
+ var bookmark = cur[8][t];
+ tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
+ }
+ }
+ tagspan += '</span>';
+ }
+
+ item = item.replace(/_TAGS/, tagspan);
+ return [bg, item];
+
+}
+
+graph.render(data);
+
+// stop hiding script -->
+</script>
+
+<div class="page_nav">
+<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
+| {changenav%navgraph}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/header.tmpl b/mercurial/templates/gitweb/header.tmpl
new file mode 100644
index 0000000..8074dde
--- /dev/null
+++ b/mercurial/templates/gitweb/header.tmpl
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="{encoding}"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
+<head>
+<link rel="icon" href="{staticurl}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow"/>
+<link rel="stylesheet" href="{staticurl}style-gitweb.css" type="text/css" />
+<script type="text/javascript" src="{staticurl}mercurial.js"></script>
diff --git a/mercurial/templates/gitweb/help.tmpl b/mercurial/templates/gitweb/help.tmpl
new file mode 100644
index 0000000..2e90b82
--- /dev/null
+++ b/mercurial/templates/gitweb/help.tmpl
@@ -0,0 +1,33 @@
+{header}
+<title>{repo|escape}: Branches</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+help
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+
+<pre>
+{doc|escape}
+</pre>
+
+{footer}
diff --git a/mercurial/templates/gitweb/helptopics.tmpl b/mercurial/templates/gitweb/helptopics.tmpl
new file mode 100644
index 0000000..2f6c26d
--- /dev/null
+++ b/mercurial/templates/gitweb/helptopics.tmpl
@@ -0,0 +1,39 @@
+{header}
+<title>{repo|escape}: Branches</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+help
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+<tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
+{topics % helpentry}
+
+<tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+{earlycommands % helpentry}
+
+<tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+{othercommands % helpentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/gitweb/index.tmpl b/mercurial/templates/gitweb/index.tmpl
new file mode 100644
index 0000000..3e0f4a2
--- /dev/null
+++ b/mercurial/templates/gitweb/index.tmpl
@@ -0,0 +1,26 @@
+{header}
+<title>Mercurial repositories index</title>
+</head>
+<body>
+
+<div class="page_header">
+ <a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a>
+ Repositories list
+</div>
+
+<table cellspacing="0">
+ <tr>
+ <td><a href="?sort={sort_name}">Name</a></td>
+ <td><a href="?sort={sort_description}">Description</a></td>
+ <td><a href="?sort={sort_contact}">Contact</a></td>
+ <td><a href="?sort={sort_lastchange}">Last modified</a></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ {entries%indexentry}
+</table>
+<div class="page_footer">
+{motd}
+</div>
+</body>
+</html>
diff --git a/mercurial/templates/gitweb/manifest.tmpl b/mercurial/templates/gitweb/manifest.tmpl
new file mode 100644
index 0000000..41e8c81
--- /dev/null
+++ b/mercurial/templates/gitweb/manifest.tmpl
@@ -0,0 +1,41 @@
+{header}
+<title>{repo|escape}: files</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / files
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+files |
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> {archives%archiveentry} |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">{path|escape} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></div>
+<table cellspacing="0">
+<tr class="parity{upparity}">
+<td style="font-family:monospace">drwxr-xr-x</td>
+<td style="font-family:monospace"></td>
+<td style="font-family:monospace"></td>
+<td><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
+<td class="link">&nbsp;</td>
+</tr>
+{dentries%direntry}
+{fentries%fileentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/gitweb/map b/mercurial/templates/gitweb/map
new file mode 100644
index 0000000..a1e93f5
--- /dev/null
+++ b/mercurial/templates/gitweb/map
@@ -0,0 +1,302 @@
+default = 'summary'
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+changelog = changelog.tmpl
+summary = summary.tmpl
+error = error.tmpl
+notfound = notfound.tmpl
+
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
+
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '
+ <tr class="parity{parity}">
+ <td><a class="list" href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
+ <td></td>
+ <td class="link">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+ <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+ <a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+ </td>
+ </tr>'
+filenolink = '
+ <tr class="parity{parity}">
+ <td><a class="list" href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
+ <td></td>
+ <td class="link">
+ file |
+ annotate |
+ <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+ <a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+ </td>
+ </tr>'
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+fileellipses = '...'
+changelogentry = changelogentry.tmpl
+searchentry = changelogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+direntry = '
+ <tr class="parity{parity}">
+ <td style="font-family:monospace">drwxr-xr-x</td>
+ <td style="font-family:monospace"></td>
+ <td style="font-family:monospace"></td>
+ <td>
+ <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
+ <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
+ </td>
+ <td class="link">
+ <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+fileentry = '
+ <tr class="parity{parity}">
+ <td style="font-family:monospace">{permissions|permissions}</td>
+ <td style="font-family:monospace" align=right>{date|isodate}</td>
+ <td style="font-family:monospace" align=right>{size}</td>
+ <td class="list">
+ <a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
+ </td>
+ <td class="link">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+ </td>
+ </tr>'
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+ <div style="font-family:monospace" class="parity{parity}">
+ <pre><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</pre>
+ </div>'
+annotateline = '
+ <tr style="font-family:monospace" class="parity{parity}">
+ <td class="linenr" style="text-align: right;">
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
+ title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+ </td>
+ <td><pre><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a></pre></td>
+ <td><pre>{line|escape}</pre></td>
+ </tr>'
+difflineplus = '<span style="color:#008800;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+difflineminus = '<span style="color:#cc0000;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+difflineat = '<span style="color:#990099;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+diffline = '<span><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+
+comparisonblock ='
+ <tbody class="block">
+ {lines}
+ </tbody>'
+comparisonline = '
+ <tr style="font-family:monospace">
+ <td class="{type}"><pre><a class="linenr" href="#{lineid}" id="{lineid}">{leftlinenumber}</a> {leftline|escape}</pre></td>
+ <td class="{type}"><pre><a class="linenr" href="#{lineid}" id="{lineid}">{rightlinenumber}</a> {rightline|escape}</pre></td>
+ </tr>'
+
+changelogparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+changesetbranch = '<tr><td>branch</td><td>{name}</td></tr>'
+changesetparent = '
+ <tr>
+ <td>parent {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filerevbranch = '<tr><td>branch</td><td>{name}</td></tr>'
+filerevparent = '
+ <tr>
+ <td>parent {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+filerename = '{file|escape}@'
+filelogrename = '| <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
+fileannotateparent = '
+ <tr>
+ <td>parent {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+changelogchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+changesetchild = '
+ <tr>
+ <td>child {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filerevchild = '
+ <tr>
+ <td>child {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+fileannotatechild = '
+ <tr>
+ <td>child {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+tags = tags.tmpl
+tagentry = '
+ <tr class="parity{parity}">
+ <td class="age"><i class="age">{date|rfc822date}</i></td>
+ <td><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}"><b>{tag|escape}</b></a></td>
+ <td class="link">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+ <tr class="parity{parity}">
+ <td class="age"><i class="age">{date|rfc822date}</i></td>
+ <td><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}"><b>{bookmark|escape}</b></a></td>
+ <td class="link">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+branches = branches.tmpl
+branchentry = '
+ <tr class="parity{parity}">
+ <td class="age"><i class="age">{date|rfc822date}</i></td>
+ <td><a class="list" href="{url}shortlog/{node|short}{sessionvars%urlparameter}"><b>{node|short}</b></a></td>
+ <td class="{status}">{branch|escape}</td>
+ <td class="link">
+ <a href="{url}changeset/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+diffblock = '<pre>{lines}</pre>'
+filediffparent = '
+ <tr>
+ <td>parent {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+filecompparent = '
+ <tr>
+ <td>parent {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+filelogparent = '
+ <tr>
+ <td align="right">parent {rev}:&nbsp;</td>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filediffchild = '
+ <tr>
+ <td>child {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filecompchild = '
+ <tr>
+ <td>child {rev}</td>
+ <td style="font-family:monospace">
+ <a class="list" href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filelogchild = '
+ <tr>
+ <td align="right">child {rev}:&nbsp;</td>
+ <td><a href="{url}file{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+shortlog = shortlog.tmpl
+graph = graph.tmpl
+tagtag = '<span class="tagtag" title="{name}">{name}</span> '
+branchtag = '<span class="branchtag" title="{name}">{name}</span> '
+inbranchtag = '<span class="inbranchtag" title="{name}">{name}</span> '
+bookmarktag = '<span class="bookmarktag" title="{name}">{name}</span> '
+shortlogentry = '
+ <tr class="parity{parity}">
+ <td class="age"><i class="age">{date|rfc822date}</i></td>
+ <td><i>{author|person}</i></td>
+ <td>
+ <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ <b>{desc|strip|firstline|escape|nonempty}</b>
+ <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>
+ </a>
+ </td>
+ <td class="link" nowrap>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+filelogentry = '
+ <tr class="parity{parity}">
+ <td class="age"><i class="age">{date|rfc822date}</i></td>
+ <td>
+ <a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ <b>{desc|strip|firstline|escape|nonempty}</b>
+ </a>
+ </td>
+ <td class="link">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>&nbsp;|&nbsp;<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>&nbsp;|&nbsp;<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> {rename%filelogrename}</td>
+ </tr>'
+archiveentry = ' | <a href="{url}archive/{node|short}{extension}">{type|escape}</a> '
+indexentry = '
+ <tr class="parity{parity}">
+ <td>
+ <a class="list" href="{url}{sessionvars%urlparameter}">
+ <b>{name|escape}</b>
+ </a>
+ </td>
+ <td>{description}</td>
+ <td>{contact|obfuscate}</td>
+ <td class="age">{lastchange|rfc822date}</td>
+ <td class="indexlinks">{archives%indexarchiveentry}</td>
+ <td><div class="rss_logo"><a href="{url}rss-log">RSS</a> <a href="{url}atom-log">Atom</a></div></td>
+ </tr>\n'
+indexarchiveentry = ' <a href="{url}archive/{node|short}{extension}">{type|escape}</a> '
+index = index.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
diff --git a/mercurial/templates/gitweb/notfound.tmpl b/mercurial/templates/gitweb/notfound.tmpl
new file mode 100644
index 0000000..e9f74a3
--- /dev/null
+++ b/mercurial/templates/gitweb/notfound.tmpl
@@ -0,0 +1,18 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a> Not found: {repo|escape}
+</div>
+
+<div class="page_body">
+The specified repository "{repo|escape}" is unknown, sorry.
+<br/>
+<br/>
+Please go back to the <a href="{url}">main repository list page</a>.
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/search.tmpl b/mercurial/templates/gitweb/search.tmpl
new file mode 100644
index 0000000..2d77ed6
--- /dev/null
+++ b/mercurial/templates/gitweb/search.tmpl
@@ -0,0 +1,39 @@
+{header}
+<title>{repo|escape}: Search</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / search
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<div class="search">
+<input type="text" name="rev" value="{query|escape}" />
+</div>
+</form>
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry}
+ |
+ <a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">searching for {query|escape}</div>
+
+{entries}
+
+{footer}
diff --git a/mercurial/templates/gitweb/shortlog.tmpl b/mercurial/templates/gitweb/shortlog.tmpl
new file mode 100644
index 0000000..2e89dbc
--- /dev/null
+++ b/mercurial/templates/gitweb/shortlog.tmpl
@@ -0,0 +1,42 @@
+{header}
+<title>{repo|escape}: Shortlog</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / shortlog
+</div>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<div class="search">
+<input type="text" name="rev" />
+</div>
+</form>
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+shortlog |
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>{changenav%navshort}<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+{entries%shortlogentry}
+</table>
+
+<div class="page_nav">
+{changenav%navshort}
+</div>
+
+{footer}
diff --git a/mercurial/templates/gitweb/summary.tmpl b/mercurial/templates/gitweb/summary.tmpl
new file mode 100644
index 0000000..2d1aca2
--- /dev/null
+++ b/mercurial/templates/gitweb/summary.tmpl
@@ -0,0 +1,66 @@
+{header}
+<title>{repo|escape}: Summary</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / summary
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<div class="search">
+<input type="text" name="rev" />
+</div>
+</form>
+</div>
+
+<div class="page_nav">
+summary |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+<a href="{url}tags{sessionvars%urlparameter}">tags</a> |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry} |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+<tr><td>description</td><td>{desc}</td></tr>
+<tr><td>owner</td><td>{owner|obfuscate}</td></tr>
+<tr><td>last change</td><td>{lastchange|rfc822date}</td></tr>
+</table>
+
+<div><a class="title" href="{url}shortlog{sessionvars%urlparameter}">changes</a></div>
+<table cellspacing="0">
+{shortlog}
+<tr class="light"><td colspan="4"><a class="list" href="{url}shortlog{sessionvars%urlparameter}">...</a></td></tr>
+</table>
+
+<div><a class="title" href="{url}tags{sessionvars%urlparameter}">tags</a></div>
+<table cellspacing="0">
+{tags}
+<tr class="light"><td colspan="3"><a class="list" href="{url}tags{sessionvars%urlparameter}">...</a></td></tr>
+</table>
+
+<div><a class="title" href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></div>
+<table cellspacing="0">
+{bookmarks%bookmarkentry}
+<tr class="light"><td colspan="3"><a class="list" href="{url}bookmarks{sessionvars%urlparameter}">...</a></td></tr>
+</table>
+
+<div><a class="title" href="{url}branches{sessionvars%urlparameter}">branches</a></div>
+<table cellspacing="0">
+{branches%branchentry}
+<tr class="light">
+ <td colspan="4"><a class="list" href="{url}branches{sessionvars%urlparameter}">...</a></td>
+</tr>
+</table>
+{footer}
diff --git a/mercurial/templates/gitweb/tags.tmpl b/mercurial/templates/gitweb/tags.tmpl
new file mode 100644
index 0000000..54cbe06
--- /dev/null
+++ b/mercurial/templates/gitweb/tags.tmpl
@@ -0,0 +1,32 @@
+{header}
+<title>{repo|escape}: Tags</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}"/>
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}"/>
+</head>
+<body>
+
+<div class="page_header">
+<a href="{logourl}" title="Mercurial" style="float: right;">Mercurial</a><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / tags
+</div>
+
+<div class="page_nav">
+<a href="{url}summary{sessionvars%urlparameter}">summary</a> |
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a> |
+<a href="{url}log{sessionvars%urlparameter}">changelog</a> |
+<a href="{url}graph{sessionvars%urlparameter}">graph</a> |
+tags |
+<a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a> |
+<a href="{url}branches{sessionvars%urlparameter}">branches</a> |
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a> |
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<br/>
+</div>
+
+<div class="title">&nbsp;</div>
+<table cellspacing="0">
+{entries%tagentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/map-cmdline.bisect b/mercurial/templates/map-cmdline.bisect
new file mode 100644
index 0000000..37c5ffb
--- /dev/null
+++ b/mercurial/templates/map-cmdline.bisect
@@ -0,0 +1,25 @@
+changeset = 'changeset: {rev}:{node|short}\nbisect: {bisect}\n{branches}{bookmarks}{tags}{parents}user: {author}\ndate: {date|date}\nsummary: {desc|firstline}\n\n'
+changeset_quiet = '{bisect|shortbisect} {rev}:{node|short}\n'
+changeset_verbose = 'changeset: {rev}:{node|short}\nbisect: {bisect}\n{branches}{bookmarks}{tags}{parents}user: {author}\ndate: {date|date}\n{files}{file_copies_switch}description:\n{desc|strip}\n\n\n'
+changeset_debug = 'changeset: {rev}:{node}\nbisect: {bisect}\n{branches}{bookmarks}{tags}{parents}{manifest}user: {author}\ndate: {date|date}\n{file_mods}{file_adds}{file_dels}{file_copies_switch}{extras}description:\n{desc|strip}\n\n\n'
+start_files = 'files: '
+file = ' {file}'
+end_files = '\n'
+start_file_mods = 'files: '
+file_mod = ' {file_mod}'
+end_file_mods = '\n'
+start_file_adds = 'files+: '
+file_add = ' {file_add}'
+end_file_adds = '\n'
+start_file_dels = 'files-: '
+file_del = ' {file_del}'
+end_file_dels = '\n'
+start_file_copies = 'copies: '
+file_copy = ' {name} ({source})'
+end_file_copies = '\n'
+parent = 'parent: {rev}:{node|formatnode}\n'
+manifest = 'manifest: {rev}:{node}\n'
+branch = 'branch: {branch}\n'
+tag = 'tag: {tag}\n'
+bookmark = 'bookmark: {bookmark}\n'
+extra = 'extra: {key}={value|stringescape}\n'
diff --git a/mercurial/templates/map-cmdline.changelog b/mercurial/templates/map-cmdline.changelog
new file mode 100644
index 0000000..f54134a
--- /dev/null
+++ b/mercurial/templates/map-cmdline.changelog
@@ -0,0 +1,17 @@
+header = '{date|shortdate} {author|person} <{author|email}>\n\n'
+header_verbose = ''
+changeset = '\t* {files|stringify|fill68|tabindent}{desc|fill68|tabindent|strip}\n\t[{node|short}]{tags}{branches}\n\n'
+changeset_quiet = '\t* {desc|firstline|fill68|tabindent|strip}\n\n'
+changeset_verbose = '{date|isodate} {author|person} <{author|email}> ({node|short}{tags}{branches})\n\n\t* {file_adds|stringify|fill68|tabindent}{file_dels|stringify|fill68|tabindent}{files|stringify|fill68|tabindent}{desc|fill68|tabindent|strip}\n\n'
+start_tags = ' ['
+tag = '{tag}, '
+last_tag = '{tag}]'
+start_branches = ' <'
+branch = '{branch}, '
+last_branch = '{branch}>'
+file = '{file}, '
+last_file = '{file}:\n\t'
+file_add = '{file_add}, '
+last_file_add = '{file_add}: new file.\n* '
+file_del = '{file_del}, '
+last_file_del = '{file_del}: deleted file.\n* '
diff --git a/mercurial/templates/map-cmdline.compact b/mercurial/templates/map-cmdline.compact
new file mode 100644
index 0000000..0a71639
--- /dev/null
+++ b/mercurial/templates/map-cmdline.compact
@@ -0,0 +1,12 @@
+changeset = '{rev}{tags}{bookmarks}{parents} {node|short} {date|isodate} {author|user}\n {desc|firstline|strip}\n\n'
+changeset_quiet = '{rev}:{node|short}\n'
+changeset_verbose = '{rev}{tags}{parents} {node|short} {date|isodate} {author}\n {desc|strip}\n\n'
+start_tags = '['
+tag = '{tag},'
+last_tag = '{tag}]'
+start_parents = ':'
+parent = '{rev},'
+last_parent = '{rev}'
+start_bookmarks = '['
+bookmark = '{bookmark},'
+last_bookmark = '{bookmark}]'
diff --git a/mercurial/templates/map-cmdline.default b/mercurial/templates/map-cmdline.default
new file mode 100644
index 0000000..41131de
--- /dev/null
+++ b/mercurial/templates/map-cmdline.default
@@ -0,0 +1,25 @@
+changeset = 'changeset: {rev}:{node|short}\n{branches}{bookmarks}{tags}{parents}user: {author}\ndate: {date|date}\nsummary: {desc|firstline}\n\n'
+changeset_quiet = '{rev}:{node|short}\n'
+changeset_verbose = 'changeset: {rev}:{node|short}\n{branches}{bookmarks}{tags}{parents}user: {author}\ndate: {date|date}\n{files}{file_copies_switch}description:\n{desc|strip}\n\n\n'
+changeset_debug = 'changeset: {rev}:{node}\n{branches}{bookmarks}{tags}phase: {phase}\n{parents}{manifest}user: {author}\ndate: {date|date}\n{file_mods}{file_adds}{file_dels}{file_copies_switch}{extras}description:\n{desc|strip}\n\n\n'
+start_files = 'files: '
+file = ' {file}'
+end_files = '\n'
+start_file_mods = 'files: '
+file_mod = ' {file_mod}'
+end_file_mods = '\n'
+start_file_adds = 'files+: '
+file_add = ' {file_add}'
+end_file_adds = '\n'
+start_file_dels = 'files-: '
+file_del = ' {file_del}'
+end_file_dels = '\n'
+start_file_copies = 'copies: '
+file_copy = ' {name} ({source})'
+end_file_copies = '\n'
+parent = 'parent: {rev}:{node|formatnode}\n'
+manifest = 'manifest: {rev}:{node}\n'
+branch = 'branch: {branch}\n'
+tag = 'tag: {tag}\n'
+bookmark = 'bookmark: {bookmark}\n'
+extra = 'extra: {key}={value|stringescape}\n'
diff --git a/mercurial/templates/map-cmdline.xml b/mercurial/templates/map-cmdline.xml
new file mode 100644
index 0000000..ea1cfc6
--- /dev/null
+++ b/mercurial/templates/map-cmdline.xml
@@ -0,0 +1,20 @@
+header = '<?xml version="1.0"?>\n<log>\n'
+footer = '</log>\n'
+
+changeset = '<logentry revision="{rev}" node="{node}">\n{branches}{bookmarks}{tags}{parents}<author email="{author|email|xmlescape}">{author|person|xmlescape}</author>\n<date>{date|rfc3339date}</date>\n<msg xml:space="preserve">{desc|xmlescape}</msg>\n</logentry>\n'
+changeset_verbose = '<logentry revision="{rev}" node="{node}">\n{branches}{bookmarks}{tags}{parents}<author email="{author|email|xmlescape}">{author|person|xmlescape}</author>\n<date>{date|rfc3339date}</date>\n<msg xml:space="preserve">{desc|xmlescape}</msg>\n<paths>\n{file_adds}{file_dels}{file_mods}</paths>\n{file_copies}</logentry>\n'
+changeset_debug = '<logentry revision="{rev}" node="{node}">\n{branches}{bookmarks}{tags}{parents}<author email="{author|email|xmlescape}">{author|person|xmlescape}</author>\n<date>{date|rfc3339date}</date>\n<msg xml:space="preserve">{desc|xmlescape}</msg>\n<paths>\n{file_adds}{file_dels}{file_mods}</paths>\n{file_copies}{extras}</logentry>\n'
+
+file_add = '<path action="A">{file_add|xmlescape}</path>\n'
+file_mod = '<path action="M">{file_mod|xmlescape}</path>\n'
+file_del = '<path action="R">{file_del|xmlescape}</path>\n'
+
+start_file_copies = '<copies>\n'
+file_copy = '<copy source="{source|xmlescape}">{name|xmlescape}</copy>\n'
+end_file_copies = '</copies>\n'
+
+parent = '<parent revision="{rev}" node="{node}" />\n'
+branch = '<branch>{branch|xmlescape}</branch>\n'
+tag = '<tag>{tag|xmlescape}</tag>\n'
+bookmark = '<bookmark>{bookmark|xmlescape}</bookmark>\n'
+extra = '<extra key="{key|xmlescape}">{value|xmlescape}</extra>\n'
diff --git a/mercurial/templates/monoblue/bookmarks.tmpl b/mercurial/templates/monoblue/bookmarks.tmpl
new file mode 100644
index 0000000..d3870da
--- /dev/null
+++ b/mercurial/templates/monoblue/bookmarks.tmpl
@@ -0,0 +1,38 @@
+{header}
+ <title>{repo|escape}: Bookmarks</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / bookmarks</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li class="current">bookmarks</li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">bookmarks</h2>
+ <table cellspacing="0">
+{entries%bookmarkentry}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/monoblue/branches.tmpl b/mercurial/templates/monoblue/branches.tmpl
new file mode 100644
index 0000000..4ef9c25
--- /dev/null
+++ b/mercurial/templates/monoblue/branches.tmpl
@@ -0,0 +1,38 @@
+{header}
+ <title>{repo|escape}: Branches</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / branches</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li class="current">branches</li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">branches</h2>
+ <table cellspacing="0">
+{entries%branchentry}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/monoblue/changelog.tmpl b/mercurial/templates/monoblue/changelog.tmpl
new file mode 100644
index 0000000..430c388
--- /dev/null
+++ b/mercurial/templates/monoblue/changelog.tmpl
@@ -0,0 +1,42 @@
+{header}
+ <title>{repo|escape}: changelog</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changelog</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li class="current">changelog</li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry}</li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">changelog</h2>
+ <div>
+ {entries%changelogentry}
+ </div>
+
+ <div class="page-path">
+{changenav%nav}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/changelogentry.tmpl b/mercurial/templates/monoblue/changelogentry.tmpl
new file mode 100644
index 0000000..1c04f07
--- /dev/null
+++ b/mercurial/templates/monoblue/changelogentry.tmpl
@@ -0,0 +1,6 @@
+<h3 class="changelog"><a class="title" href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}<span class="logtags"> {inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a></h3>
+<ul class="changelog-entry">
+ <li class="age">{date|rfc822date}</li>
+ <li>by <span class="name">{author|obfuscate}</span> <span class="revdate">[{date|rfc822date}] rev {rev}</span></li>
+ <li class="description">{desc|strip|escape|addbreaks|nonempty}</li>
+</ul>
diff --git a/mercurial/templates/monoblue/changeset.tmpl b/mercurial/templates/monoblue/changeset.tmpl
new file mode 100644
index 0000000..0ecbffb
--- /dev/null
+++ b/mercurial/templates/monoblue/changeset.tmpl
@@ -0,0 +1,65 @@
+{header}
+<title>{repo|escape}: changeset {rev}:{node|short}</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / changeset</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li class="current">changeset</li>
+ <li><a href="{url}raw-rev/{node|short}">raw</a> {archives%archiveentry}</li>
+ </ul>
+
+ <h2 class="no-link no-border">changeset</h2>
+
+ <h3 class="changeset"><a href="{url}raw-rev/{node|short}">{desc|strip|escape|firstline|nonempty} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></a></h3>
+ <p class="changeset-age age">{date|rfc822date}</p>
+
+ <dl class="overview">
+ <dt>author</dt>
+ <dd>{author|obfuscate}</dd>
+ <dt>date</dt>
+ <dd>{date|rfc822date}</dd>
+ {branch%changesetbranch}
+ <dt>changeset {rev}</dt>
+ <dd>{node|short}</dd>
+ {parent%changesetparent}
+ {child%changesetchild}
+ </dl>
+
+ <p class="description">{desc|strip|escape|addbreaks|nonempty}</p>
+
+ <table>
+ {files}
+ </table>
+
+ <div class="diff">
+ {diff}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/error.tmpl b/mercurial/templates/monoblue/error.tmpl
new file mode 100644
index 0000000..61f3215
--- /dev/null
+++ b/mercurial/templates/monoblue/error.tmpl
@@ -0,0 +1,36 @@
+{header}
+ <title>{repo|escape}: Error</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / not found: {repo|escape}</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li class="current">summary</li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">An error occurred while processing your request</h2>
+ <p class="normal">{error|escape}</p>
+
+{footer}
diff --git a/mercurial/templates/monoblue/fileannotate.tmpl b/mercurial/templates/monoblue/fileannotate.tmpl
new file mode 100644
index 0000000..38563cf
--- /dev/null
+++ b/mercurial/templates/monoblue/fileannotate.tmpl
@@ -0,0 +1,66 @@
+{header}
+<title>{repo|escape}: {file|escape}@{node|short} (annotated)</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / annotate</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+ <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a></li>
+ <li class="current">annotate</li>
+ <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+ <li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+ <li><a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a></li>
+ </ul>
+
+ <h2 class="no-link no-border">{file|escape}@{node|short} (annotated)</h2>
+ <h3 class="changeset">{file|escape}</h3>
+ <p class="changeset-age age">{date|rfc822date}</p>
+
+ <dl class="overview">
+ <dt>author</dt>
+ <dd>{author|obfuscate}</dd>
+ <dt>date</dt>
+ <dd>{date|rfc822date}</dd>
+ {branch%filerevbranch}
+ <dt>changeset {rev}</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
+ {parent%fileannotateparent}
+ {child%fileannotatechild}
+ <dt>permissions</dt>
+ <dd>{permissions|permissions}</dd>
+ </dl>
+
+ <p class="description">{desc|strip|escape|addbreaks|nonempty}</p>
+
+ <table class="annotated">
+ {annotate%annotateline}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/monoblue/filecomparison.tmpl b/mercurial/templates/monoblue/filecomparison.tmpl
new file mode 100644
index 0000000..99204a6
--- /dev/null
+++ b/mercurial/templates/monoblue/filecomparison.tmpl
@@ -0,0 +1,72 @@
+{header}
+<title>{repo|escape}: comparison {file|escape}</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file comparison</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+ <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a></li>
+ <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+ <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+ <li class="current">comparison</li>
+ <li><a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a></li>
+ </ul>
+
+ <h2 class="no-link no-border">comparison: {file|escape}</h2>
+ <h3 class="changeset">{file|escape}</h3>
+
+ <dl class="overview">
+ {branch%filerevbranch}
+ <dt>changeset {rev}</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
+ {parent%filecompparent}
+ {child%filecompchild}
+ </dl>
+
+ <div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+ </div>
+
+ <div class="comparison">
+ <table class="bigtable">
+ <thead class="header">
+ <tr>
+ <th>{leftrev}:{leftnode|short}</th>
+ <th>{rightrev}:{rightnode|short}</th>
+ </tr>
+ </thead>
+ {comparison}
+ </table>
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/filediff.tmpl b/mercurial/templates/monoblue/filediff.tmpl
new file mode 100644
index 0000000..2c2fa70
--- /dev/null
+++ b/mercurial/templates/monoblue/filediff.tmpl
@@ -0,0 +1,57 @@
+{header}
+<title>{repo|escape}: diff {file|escape}</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file diff</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+ <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a></li>
+ <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+ <li class="current">diff</li>
+ <li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+ <li><a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a></li>
+ </ul>
+
+ <h2 class="no-link no-border">diff: {file|escape}</h2>
+ <h3 class="changeset">{file|escape}</h3>
+
+ <dl class="overview">
+ {branch%filerevbranch}
+ <dt>changeset {rev}</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
+ {parent%filediffparent}
+ {child%filediffchild}
+ </dl>
+
+ <div class="diff">
+ {diff}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/filelog.tmpl b/mercurial/templates/monoblue/filelog.tmpl
new file mode 100644
index 0000000..d737cd4
--- /dev/null
+++ b/mercurial/templates/monoblue/filelog.tmpl
@@ -0,0 +1,52 @@
+{header}
+<title>{repo|escape}: File revisions</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revisions</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+ <li class="current">revisions</li>
+ <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+ <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+ <li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+ <li><a href="{url}rss-log/tip/{file|urlescape}">rss</a></li>
+ </ul>
+
+ <h2 class="no-link no-border">{file|urlescape}</h2>
+
+ <table>
+ {entries%filelogentry}
+ </table>
+
+ <div class="page-path">
+ {nav%filenav}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/filerevision.tmpl b/mercurial/templates/monoblue/filerevision.tmpl
new file mode 100644
index 0000000..6d404d7
--- /dev/null
+++ b/mercurial/templates/monoblue/filerevision.tmpl
@@ -0,0 +1,66 @@
+{header}
+<title>{repo|escape}: {file|escape}@{node|short}</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / file revision</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li class="current">file</li>
+ <li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a></li>
+ <li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+ <li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+ <li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+ <li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
+ </ul>
+
+ <h2 class="no-link no-border">{file|escape}@{node|short}</h2>
+ <h3 class="changeset">{file|escape}</h3>
+ <p class="changeset-age age">{date|rfc822date}</p>
+
+ <dl class="overview">
+ <dt>author</dt>
+ <dd>{author|obfuscate}</dd>
+ <dt>date</dt>
+ <dd>{date|rfc822date}</dd>
+ {branch%filerevbranch}
+ <dt>changeset {rev}</dt>
+ <dd><a class="list" href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>
+ {parent%filerevparent}
+ {child%filerevchild}
+ <dt>permissions</dt>
+ <dd>{permissions|permissions}</dd>
+ </dl>
+
+ <p class="description">{desc|strip|escape|addbreaks|nonempty}</p>
+
+ <div class="source">
+ {text%fileline}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/footer.tmpl b/mercurial/templates/monoblue/footer.tmpl
new file mode 100644
index 0000000..c19bdae
--- /dev/null
+++ b/mercurial/templates/monoblue/footer.tmpl
@@ -0,0 +1,23 @@
+ <script type="text/javascript">process_dates()</script>
+ <div class="page-footer">
+ <p>Mercurial Repository: {repo|escape}</p>
+ <ul class="rss-logo">
+ <li><a href="{url}rss-log">RSS</a></li>
+ <li><a href="{url}atom-log">Atom</a></li>
+ </ul>
+ {motd}
+ </div>
+
+ <div id="powered-by">
+ <p><a href="{logourl}" title="Mercurial"><img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a></p>
+ </div>
+
+ <div id="corner-top-left"></div>
+ <div id="corner-top-right"></div>
+ <div id="corner-bottom-left"></div>
+ <div id="corner-bottom-right"></div>
+
+</div>
+
+</body>
+</html>
diff --git a/mercurial/templates/monoblue/graph.tmpl b/mercurial/templates/monoblue/graph.tmpl
new file mode 100644
index 0000000..fad0d82
--- /dev/null
+++ b/mercurial/templates/monoblue/graph.tmpl
@@ -0,0 +1,115 @@
+{header}
+ <title>{repo|escape}: graph</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+ <!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / graph</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li class="current">graph</li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">graph</h2>
+
+ <div id="noscript">The revision graph only works with JavaScript-enabled browsers.</div>
+ <div id="wrapper">
+ <ul id="nodebgs"></ul>
+ <canvas id="graph" width="480" height="{canvasheight}"></canvas>
+ <ul id="graphnodes"></ul>
+ </div>
+
+ <script>
+ <!-- hide script content
+
+ document.getElementById('noscript').style.display = 'none';
+
+ var data = {jsdata|json};
+ var graph = new Graph();
+ graph.scale({bg_height});
+
+ var revlink = '<li style="_STYLE"><span class="desc">';
+ revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
+ revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
+
+ graph.vertex = function(x, y, color, parity, cur) \{
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ var tagspan = '';
+ if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
+ tagspan = '<span class="logtags">';
+ if (cur[6][1]) \{
+ tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ } else if (!cur[6][1] && cur[6][0] != 'default') \{
+ tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ }
+ if (cur[7].length) \{
+ for (var t in cur[7]) \{
+ var tag = cur[7][t];
+ tagspan += '<span class="tagtag">' + tag + '</span> ';
+ }
+ }
+ if (cur[8].length) \{
+ for (var t in cur[8]) \{
+ var bookmark = cur[8][t];
+ tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
+ }
+ }
+ tagspan += '</span>';
+ }
+
+ item = item.replace(/_TAGS/, tagspan);
+ return [bg, item];
+
+ }
+
+ graph.render(data);
+
+ // stop hiding script -->
+ </script>
+
+ <div class="page-path">
+ <a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
+ <a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
+ | {changenav%navgraph}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/header.tmpl b/mercurial/templates/monoblue/header.tmpl
new file mode 100644
index 0000000..0c1f580
--- /dev/null
+++ b/mercurial/templates/monoblue/header.tmpl
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <link rel="icon" href="{staticurl}hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow"/>
+ <link rel="stylesheet" href="{staticurl}style-monoblue.css" type="text/css" />
+ <script type="text/javascript" src="{staticurl}mercurial.js"></script>
diff --git a/mercurial/templates/monoblue/help.tmpl b/mercurial/templates/monoblue/help.tmpl
new file mode 100644
index 0000000..8cdb77b
--- /dev/null
+++ b/mercurial/templates/monoblue/help.tmpl
@@ -0,0 +1,38 @@
+{header}
+ <title>{repo|escape}: Branches</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li class="current">help</li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">branches</h2>
+ <pre>
+ {doc|escape}
+ </pre>
+
+{footer}
diff --git a/mercurial/templates/monoblue/helptopics.tmpl b/mercurial/templates/monoblue/helptopics.tmpl
new file mode 100644
index 0000000..364dd28
--- /dev/null
+++ b/mercurial/templates/monoblue/helptopics.tmpl
@@ -0,0 +1,45 @@
+{header}
+ <title>{repo|escape}: Branches</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / help</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li class="current">help</li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">branches</h2>
+ <table cellspacing="0">
+ <tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
+ {topics % helpentry}
+
+ <tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+ {earlycommands % helpentry}
+
+ <tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+ {othercommands % helpentry}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/monoblue/index.tmpl b/mercurial/templates/monoblue/index.tmpl
new file mode 100644
index 0000000..e5086f7
--- /dev/null
+++ b/mercurial/templates/monoblue/index.tmpl
@@ -0,0 +1,39 @@
+{header}
+ <title>{repo|escape}: Mercurial repositories index</title>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1>Mercurial Repositories</h1>
+ <ul class="page-nav">
+ </ul>
+ </div>
+
+ <table cellspacing="0">
+ <tr>
+ <td><a href="?sort={sort_name}">Name</a></td>
+ <td><a href="?sort={sort_description}">Description</a></td>
+ <td><a href="?sort={sort_contact}">Contact</a></td>
+ <td><a href="?sort={sort_lastchange}">Last modified</a></td>
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ </tr>
+ {entries%indexentry}
+ </table>
+ <div class="page-footer">
+ {motd}
+ </div>
+
+ <div id="powered-by">
+ <p><a href="{logourl}" title="Mercurial"><img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a></p>
+ </div>
+
+ <div id="corner-top-left"></div>
+ <div id="corner-top-right"></div>
+ <div id="corner-bottom-left"></div>
+ <div id="corner-bottom-right"></div>
+
+</div>
+</body>
+</html>
diff --git a/mercurial/templates/monoblue/manifest.tmpl b/mercurial/templates/monoblue/manifest.tmpl
new file mode 100644
index 0000000..c99af7c
--- /dev/null
+++ b/mercurial/templates/monoblue/manifest.tmpl
@@ -0,0 +1,53 @@
+{header}
+<title>{repo|escape}: files</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / files</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li class="current">files</li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <ul class="submenu">
+ <li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> {archives%archiveentry}</li>
+ {archives%archiveentry}
+ </ul>
+
+ <h2 class="no-link no-border">files</h2>
+ <p class="files">{path|escape} <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span></p>
+
+ <table>
+ <tr class="parity{upparity}">
+ <td>drwxr-xr-x</td>
+ <td></td>
+ <td></td>
+ <td><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
+ <td class="link">&nbsp;</td>
+ </tr>
+ {dentries%direntry}
+ {fentries%fileentry}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/monoblue/map b/mercurial/templates/monoblue/map
new file mode 100644
index 0000000..209254d
--- /dev/null
+++ b/mercurial/templates/monoblue/map
@@ -0,0 +1,260 @@
+default = 'summary'
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+changelog = changelog.tmpl
+summary = summary.tmpl
+error = error.tmpl
+notfound = notfound.tmpl
+
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
+
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a>'
+filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '
+ <tr class="parity{parity}">
+ <td><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
+ <td></td>
+ <td>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
+ <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+ <a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+ </td>
+ </tr>'
+filenolink = '
+ <tr class="parity{parity}">
+ <td><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
+ <td></td>
+ <td>
+ file |
+ annotate |
+ <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
+ <a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+ </td>
+ </tr>'
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+fileellipses = '...'
+changelogentry = changelogentry.tmpl
+searchentry = changelogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+direntry = '
+ <tr class="parity{parity}">
+ <td>drwxr-xr-x</td>
+ <td></td>
+ <td></td>
+ <td><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a></td>
+ <td><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a></td>
+ </tr>'
+fileentry = '
+ <tr class="parity{parity}">
+ <td>{permissions|permissions}</td>
+ <td>{date|isodate}</td>
+ <td>{size}</td>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a></td>
+ <td>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
+ <a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+ </td>
+ </tr>'
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+ <div style="font-family:monospace" class="parity{parity}">
+ <pre><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</pre>
+ </div>'
+annotateline = '
+ <tr class="parity{parity}">
+ <td class="linenr">
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
+ title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+ </td>
+ <td class="lineno">
+ <a href="#{lineid}" id="{lineid}">{linenumber}</a>
+ </td>
+ <td class="source">{line|escape}</td>
+ </tr>'
+difflineplus = '<span style="color:#008800;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+difflineminus = '<span style="color:#cc0000;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+difflineat = '<span style="color:#990099;"><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+diffline = '<span><a class="linenr" href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</span>'
+
+comparisonblock ='
+ <tbody class="block">
+ {lines}
+ </tbody>'
+comparisonline = '
+ <tr>
+ <td class="source {type}"><a class="linenr" href="#{lineid}" id="{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+ <td class="source {type}"><a class="linenr" href="#{lineid}" id="{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+ </tr>'
+
+changelogparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+changesetbranch = '<dt>branch</dt><dd>{name}</dd>'
+changesetparent = '
+ <dt>parent {rev}</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filerevbranch = '<dt>branch</dt><dd>{name}</dd>'
+filerevparent = '
+ <dt>parent {rev}</dt>
+ <dd>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </dd>'
+filerename = '{file|escape}@'
+filelogrename = '| <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
+fileannotateparent = '
+ <dt>parent {rev}</dt>
+ <dd>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </dd>'
+changelogchild = '
+ <dt>child {rev}:</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
+changesetchild = '
+ <dt>child {rev}</dt>
+ <dd><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filerevchild = '
+ <dt>child {rev}</dt>
+ <dd>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+ </dd>'
+fileannotatechild = '
+ <dt>child {rev}</dt>
+ <dd>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+ </dd>'
+tags = tags.tmpl
+tagentry = '
+ <tr class="parity{parity}">
+ <td class="nowrap age">{date|rfc822date}</td>
+ <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{tag|escape}</a></td>
+ <td class="nowrap">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+ <tr class="parity{parity}">
+ <td class="nowrap date">{date|rfc822date}</td>
+ <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{bookmark|escape}</a></td>
+ <td class="nowrap">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+branches = branches.tmpl
+branchentry = '
+ <tr class="parity{parity}">
+ <td class="nowrap age">{date|rfc822date}</td>
+ <td><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ <td class="{status}">{branch|escape}</td>
+ <td class="nowrap">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+diffblock = '<pre>{lines}</pre>'
+filediffparent = '
+ <dt>parent {rev}</dt>
+ <dd><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filecompparent = '
+ <dt>parent {rev}</dt>
+ <dd><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filelogparent = '
+ <tr>
+ <td align="right">parent {rev}:&nbsp;</td>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filediffchild = '
+ <dt>child {rev}</dt>
+ <dd><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filecompchild = '
+ <dt>child {rev}</dt>
+ <dd><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
+filelogchild = '
+ <tr>
+ <td align="right">child {rev}:&nbsp;</td>
+ <td><a href="{url}file{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+shortlog = shortlog.tmpl
+tagtag = '<span class="tagtag" title="{name}">{name}</span> '
+branchtag = '<span class="branchtag" title="{name}">{name}</span> '
+inbranchtag = '<span class="inbranchtag" title="{name}">{name}</span> '
+bookmarktag = '<span class="bookmarktag" title="{name}">{name}</span> '
+shortlogentry = '
+ <tr class="parity{parity}">
+ <td class="nowrap age">{date|rfc822date}</td>
+ <td>{author|person}</td>
+ <td>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {desc|strip|firstline|escape|nonempty}
+ <span class="logtags">{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>
+ </a>
+ </td>
+ <td class="nowrap">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
+ <a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+ </td>
+ </tr>'
+filelogentry = '
+ <tr class="parity{parity}">
+ <td class="nowrap age">{date|rfc822date}</td>
+ <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></td>
+ <td class="nowrap">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>&nbsp;|&nbsp;<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>&nbsp;|&nbsp;<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+ {rename%filelogrename}
+ </td>
+ </tr>'
+archiveentry = '<li><a href="{url}archive/{node|short}{extension}">{type|escape}</a></li>'
+indexentry = '
+ <tr class="parity{parity}">
+ <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
+ <td>{description}</td>
+ <td>{contact|obfuscate}</td>
+ <td class="age">{lastchange|rfc822date}</td>
+ <td class="indexlinks">{archives%indexarchiveentry}</td>
+ <td>
+ <div class="rss_logo">
+ <a href="{url}rss-log">RSS</a>
+ <a href="{url}atom-log">Atom</a>
+ </div>
+ </td>
+ </tr>\n'
+indexarchiveentry = '<a href="{url}archive/{node|short}{extension}">{type|escape}</a> '
+index = index.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
+graph = graph.tmpl
diff --git a/mercurial/templates/monoblue/notfound.tmpl b/mercurial/templates/monoblue/notfound.tmpl
new file mode 100644
index 0000000..3410e6c
--- /dev/null
+++ b/mercurial/templates/monoblue/notfound.tmpl
@@ -0,0 +1,37 @@
+{header}
+ <title>{repo|escape}: Mercurial repository not found</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / not found: {repo|escape}</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li class="current">summary</li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry}</li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">Not Found</h2>
+ <p class="normal">The specified repository "{repo|escape}" is unknown, sorry.</p>
+ <p class="normal">Please go back to the <a href="{url}">main repository list page</a>.</p>
+
+{footer}
diff --git a/mercurial/templates/monoblue/search.tmpl b/mercurial/templates/monoblue/search.tmpl
new file mode 100644
index 0000000..2be816a
--- /dev/null
+++ b/mercurial/templates/monoblue/search.tmpl
@@ -0,0 +1,36 @@
+{header}
+ <title>{repo|escape}: Search</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / search</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" value="{query|escape}" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>{archives%archiveentry}
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">searching for {query|escape}</h2>
+ {entries}
+
+{footer}
diff --git a/mercurial/templates/monoblue/shortlog.tmpl b/mercurial/templates/monoblue/shortlog.tmpl
new file mode 100644
index 0000000..56c4584
--- /dev/null
+++ b/mercurial/templates/monoblue/shortlog.tmpl
@@ -0,0 +1,44 @@
+{header}
+ <title>{repo|escape}: shortlog</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / shortlog</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li class="current">shortlog</li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ {archives%archiveentry}
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">shortlog</h2>
+
+ <table>
+{entries%shortlogentry}
+ </table>
+
+ <div class="page-path">
+ {changenav%navshort}
+ </div>
+
+{footer}
diff --git a/mercurial/templates/monoblue/summary.tmpl b/mercurial/templates/monoblue/summary.tmpl
new file mode 100644
index 0000000..9528dc6
--- /dev/null
+++ b/mercurial/templates/monoblue/summary.tmpl
@@ -0,0 +1,76 @@
+{header}
+ <title>{repo|escape}: Summary</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / summary</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li class="current">summary</li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}log{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">Mercurial Repository Overview</h2>
+ <dl class="overview">
+ <dt>name</dt>
+ <dd>{repo|escape}</dd>
+ <dt>description</dt>
+ <dd>{desc}</dd>
+ <dt>owner</dt>
+ <dd>{owner|obfuscate}</dd>
+ <dt>last change</dt>
+ <dd>{lastchange|rfc822date}</dd>
+ </dl>
+
+ <h2><a href="{url}shortlog{sessionvars%urlparameter}">Changes</a></h2>
+ <table>
+{shortlog}
+ <tr class="light">
+ <td colspan="4"><a class="list" href="{url}shortlog{sessionvars%urlparameter}">...</a></td>
+ </tr>
+ </table>
+
+ <h2><a href="{url}tags{sessionvars%urlparameter}">Tags</a></h2>
+ <table>
+{tags}
+ <tr class="light">
+ <td colspan="3"><a class="list" href="{url}tags{sessionvars%urlparameter}">...</a></td>
+ </tr>
+ </table>
+
+ <h2><a href="{url}bookmarks{sessionvars%urlparameter}">Bookmarks</a></h2>
+ <table>
+ {bookmarks%bookmarkentry}
+ <tr class="light">
+ <td colspan="3"><a class="list" href="{url}bookmarks{sessionvars%urlparameter}">...</a></td>
+ </tr>
+ </table>
+
+ <h2 class="no-link">Branches</h2>
+ <table>
+ {branches%branchentry}
+ <tr class="light">
+ <td colspan="4"><a class="list" href="#">...</a></td>
+ </tr>
+ </table>
+{footer}
diff --git a/mercurial/templates/monoblue/tags.tmpl b/mercurial/templates/monoblue/tags.tmpl
new file mode 100644
index 0000000..3e08735
--- /dev/null
+++ b/mercurial/templates/monoblue/tags.tmpl
@@ -0,0 +1,38 @@
+{header}
+ <title>{repo|escape}: Tags</title>
+ <link rel="alternate" type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}"/>
+ <link rel="alternate" type="application/rss+xml" href="{url}rss-log" title="RSS feed for {repo|escape}"/>
+</head>
+
+<body>
+<div id="container">
+ <div class="page-header">
+ <h1><a href="{url}summary{sessionvars%urlparameter}">{repo|escape}</a> / tags</h1>
+
+ <form action="{url}log">
+ {sessionvars%hiddenformentry}
+ <dl class="search">
+ <dt><label>Search: </label></dt>
+ <dd><input type="text" name="rev" /></dd>
+ </dl>
+ </form>
+
+ <ul class="page-nav">
+ <li><a href="{url}summary{sessionvars%urlparameter}">summary</a></li>
+ <li><a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a></li>
+ <li><a href="{url}changelog{sessionvars%urlparameter}">changelog</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li class="current">tags</li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a></li>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+ </ul>
+ </div>
+
+ <h2 class="no-link no-border">tags</h2>
+ <table cellspacing="0">
+{entries%tagentry}
+ </table>
+
+{footer}
diff --git a/mercurial/templates/paper/bookmarks.tmpl b/mercurial/templates/paper/bookmarks.tmpl
new file mode 100644
index 0000000..5989243
--- /dev/null
+++ b/mercurial/templates/paper/bookmarks.tmpl
@@ -0,0 +1,49 @@
+{header}
+<title>{repo|escape}: bookmarks</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-bookmarks" title="Atom feed for {repo|escape}: bookmarks" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-bookmarks" title="RSS feed for {repo|escape}: bookmarks" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li class="active">bookmarks</li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>bookmarks</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<table class="bigtable">
+<tr>
+ <th>bookmark</th>
+ <th>node</th>
+</tr>
+{entries%bookmarkentry}
+</table>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/branches.tmpl b/mercurial/templates/paper/branches.tmpl
new file mode 100644
index 0000000..b26a04d
--- /dev/null
+++ b/mercurial/templates/paper/branches.tmpl
@@ -0,0 +1,60 @@
+{header}
+<title>{repo|escape}: branches</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}: branches" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}: branches" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li class="active">branches</li>
+</ul>
+<ul>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>branches</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<table class="bigtable">
+<tr>
+ <th>branch</th>
+ <th>node</th>
+</tr>
+{entries %
+' <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
+ {branch|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+}
+</table>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/changeset.tmpl b/mercurial/templates/paper/changeset.tmpl
new file mode 100644
index 0000000..b7cc62b
--- /dev/null
+++ b/mercurial/templates/paper/changeset.tmpl
@@ -0,0 +1,87 @@
+{header}
+<title>{repo|escape}: {node|short}</title>
+</head>
+<body>
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+ <li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+ <li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+ <li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+ <li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+ <li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+ <li class="active">changeset</li>
+ <li><a href="{url}raw-rev/{node|short}{sessionvars%urlparameter}">raw</a></li>
+ <li><a href="{url}file/{node|short}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+ {archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>changeset {rev}:{node|short} {changesetbranch%changelogbranchname} {changesettag} {changesetbookmark}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">{desc|strip|escape|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td></tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%changesetparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%changesetchild}</td>
+</tr>
+<tr>
+ <th class="files">files</th>
+ <td class="files">{files}</td>
+</tr>
+<tr>
+ <th class="diffstat">diffstat</th>
+ <td class="diffstat">
+ {diffsummary}
+ <a id="diffstatexpand" href="javascript:showDiffstat()"/>[<tt>+</tt>]</a>
+ <div id="diffstatdetails" style="display:none;">
+ <a href="javascript:hideDiffstat()"/>[<tt>-</tt>]</a>
+ <p>
+ <table>{diffstat}</table>
+ </div>
+ </td>
+</tr>
+</table>
+
+<div class="overflow">
+<div class="sourcefirst"> line diff</div>
+
+{diff}
+</div>
+
+</div>
+</div>
+{footer}
diff --git a/mercurial/templates/paper/diffstat.tmpl b/mercurial/templates/paper/diffstat.tmpl
new file mode 100644
index 0000000..90261c9
--- /dev/null
+++ b/mercurial/templates/paper/diffstat.tmpl
@@ -0,0 +1,8 @@
+ <tr class="parity{parity}">
+ <td class="diffstat-file"><a href="#l{fileno}.1">{file|escape}</a></td>
+ <td class="diffstat-total" align="right">{total}</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:{addpct}%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:{removepct}%;">&nbsp;</span>
+ </td>
+ </tr>
diff --git a/mercurial/templates/paper/error.tmpl b/mercurial/templates/paper/error.tmpl
new file mode 100644
index 0000000..6d17a80
--- /dev/null
+++ b/mercurial/templates/paper/error.tmpl
@@ -0,0 +1,47 @@
+{header}
+<title>{repo|escape}: error</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>error</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30"></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">
+<p>
+An error occurred while processing your request:
+</p>
+<p>
+{error|escape}
+</p>
+</div>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/fileannotate.tmpl b/mercurial/templates/paper/fileannotate.tmpl
new file mode 100644
index 0000000..1388337
--- /dev/null
+++ b/mercurial/templates/paper/fileannotate.tmpl
@@ -0,0 +1,83 @@
+{header}
+<title>{repo|escape}: {file|escape} annotate</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li class="active">annotate</li>
+<li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>annotate {file|escape} @ {rev}:{node|short}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">{desc|strip|escape|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+{changesettag}
+</table>
+
+<div class="overflow">
+<table class="bigtable">
+<tr>
+ <th class="annotate">rev</th>
+ <th class="line">&nbsp;&nbsp;line source</th>
+</tr>
+{annotate%annotateline}
+</table>
+</div>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/filecomparison.tmpl b/mercurial/templates/paper/filecomparison.tmpl
new file mode 100644
index 0000000..9d3421a
--- /dev/null
+++ b/mercurial/templates/paper/filecomparison.tmpl
@@ -0,0 +1,93 @@
+{header}
+<title>{repo|escape}: {file|escape} comparison</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li class="active">comparison</li>
+<li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>comparison {file|escape} @ {rev}:{node|short}</h3>
+
+<form class="search" action="{url}log">
+<p>{sessionvars%hiddenformentry}</p>
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">{desc|strip|escape|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+{changesettag}
+</table>
+
+<div class="overflow">
+<div class="sourcefirst"> comparison</div>
+<div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+</div>
+
+<table class="bigtable">
+ <thead class="header">
+ <tr>
+ <th>{leftrev}:{leftnode|short}</th>
+ <th>{rightrev}:{rightnode|short}</th>
+ </tr>
+ </thead>
+ {comparison}
+</table>
+
+</div>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/filediff.tmpl b/mercurial/templates/paper/filediff.tmpl
new file mode 100644
index 0000000..b8d83de
--- /dev/null
+++ b/mercurial/templates/paper/filediff.tmpl
@@ -0,0 +1,78 @@
+{header}
+<title>{repo|escape}: {file|escape} diff</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li class="active">diff</li>
+<li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>diff {file|escape} @ {rev}:{node|short}</h3>
+
+<form class="search" action="{url}log">
+<p>{sessionvars%hiddenformentry}</p>
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">{desc|strip|escape|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th>author</th>
+ <td>{author|obfuscate}</td>
+</tr>
+<tr>
+ <th>date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th>parents</th>
+ <td>{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th>children</th>
+ <td>{child%filerevchild}</td>
+</tr>
+{changesettag}
+</table>
+
+<div class="overflow">
+<div class="sourcefirst"> line diff</div>
+
+{diff}
+</div>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/filelog.tmpl b/mercurial/templates/paper/filelog.tmpl
new file mode 100644
index 0000000..8b043da
--- /dev/null
+++ b/mercurial/templates/paper/filelog.tmpl
@@ -0,0 +1,74 @@
+{header}
+<title>{repo|escape}: {file|escape} history</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a></li>
+<li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li class="active">file log</li>
+<li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>log {file|escape}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="navigate">
+<a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}</div>
+
+<table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+{entries%filelogentry}
+</table>
+
+<div class="navigate">
+<a href="{url}log/{node|short}/{file|urlescape}{lessvars%urlparameter}">less</a>
+<a href="{url}log/{node|short}/{file|urlescape}{morevars%urlparameter}">more</a>
+| {nav%filenav}
+</div>
+
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/filelogentry.tmpl b/mercurial/templates/paper/filelogentry.tmpl
new file mode 100644
index 0000000..8b4ae84
--- /dev/null
+++ b/mercurial/templates/paper/filelogentry.tmpl
@@ -0,0 +1,5 @@
+ <tr class="parity{parity}">
+ <td class="age">{date|rfc822date}</td>
+ <td class="author">{author|person}</td>
+ <td class="description"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{rename%filelogrename}</td>
+ </tr>
diff --git a/mercurial/templates/paper/filerevision.tmpl b/mercurial/templates/paper/filerevision.tmpl
new file mode 100644
index 0000000..c2a7468
--- /dev/null
+++ b/mercurial/templates/paper/filerevision.tmpl
@@ -0,0 +1,77 @@
+{header}
+<title>{repo|escape}: {node|short} {file|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+<li class="active">file</li>
+<li><a href="{url}file/tip/{file|urlescape}{sessionvars%urlparameter}">latest</a></li>
+<li><a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a></li>
+<li><a href="{url}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a></li>
+<li><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a></li>
+<li><a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file log</a></li>
+<li><a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>view {file|escape} @ {rev}:{node|short}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="description">{desc|strip|escape|nonempty}</div>
+
+<table id="changesetEntry">
+<tr>
+ <th class="author">author</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="author">parents</th>
+ <td class="author">{parent%filerevparent}</td>
+</tr>
+<tr>
+ <th class="author">children</th>
+ <td class="author">{child%filerevchild}</td>
+</tr>
+{changesettag}
+</table>
+
+<div class="overflow">
+<div class="sourcefirst"> line source</div>
+{text%fileline}
+<div class="sourcelast"></div>
+</div>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/footer.tmpl b/mercurial/templates/paper/footer.tmpl
new file mode 100644
index 0000000..4eb2d46
--- /dev/null
+++ b/mercurial/templates/paper/footer.tmpl
@@ -0,0 +1,5 @@
+<script type="text/javascript">process_dates()</script>
+{motd}
+
+</body>
+</html>
diff --git a/mercurial/templates/paper/graph.tmpl b/mercurial/templates/paper/graph.tmpl
new file mode 100644
index 0000000..bee94ae
--- /dev/null
+++ b/mercurial/templates/paper/graph.tmpl
@@ -0,0 +1,131 @@
+{header}
+<title>{repo|escape}: revision graph</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}: log" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}: log" />
+<!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li class="active">graph</li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>graph</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="navigate">
+<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navgraph}
+</div>
+
+<noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
+
+<div id="wrapper">
+<ul id="nodebgs"></ul>
+<canvas id="graph" width="480" height="{canvasheight}"></canvas>
+<ul id="graphnodes"></ul>
+</div>
+
+<script type="text/javascript">
+<!-- hide script content
+
+var data = {jsdata|json};
+var graph = new Graph();
+graph.scale({bg_height});
+
+var revlink = '<li style="_STYLE"><span class="desc">';
+revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
+revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
+
+graph.vertex = function(x, y, color, parity, cur) \{
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ var tagspan = '';
+ if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) \{
+ tagspan = '<span class="logtags">';
+ if (cur[6][1]) \{
+ tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ } else if (!cur[6][1] && cur[6][0] != 'default') \{
+ tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ }
+ if (cur[7].length) \{
+ for (var t in cur[7]) \{
+ var tag = cur[7][t];
+ tagspan += '<span class="tag">' + tag + '</span> ';
+ }
+ }
+ if (cur[8].length) \{
+ for (var b in cur[8]) \{
+ var bookmark = cur[8][b];
+ tagspan += '<span class="tag">' + bookmark + '</span> ';
+ }
+ }
+ tagspan += '</span>';
+ }
+
+ item = item.replace(/_TAGS/, tagspan);
+ return [bg, item];
+
+}
+
+graph.render(data);
+
+// stop hiding script -->
+</script>
+
+<div class="navigate">
+<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navgraph}
+</div>
+
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/header.tmpl b/mercurial/templates/paper/header.tmpl
new file mode 100644
index 0000000..f24d768
--- /dev/null
+++ b/mercurial/templates/paper/header.tmpl
@@ -0,0 +1,7 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+<head>
+<link rel="icon" href="{staticurl}hgicon.png" type="image/png" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="{staticurl}style-paper.css" type="text/css" />
+<script type="text/javascript" src="{staticurl}mercurial.js"></script>
diff --git a/mercurial/templates/paper/help.tmpl b/mercurial/templates/paper/help.tmpl
new file mode 100644
index 0000000..f490918
--- /dev/null
+++ b/mercurial/templates/paper/help.tmpl
@@ -0,0 +1,44 @@
+{header}
+<title>Help: {topic}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+ <li class="active"><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>Help: {topic}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+<pre>
+{doc|escape}
+</pre>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/helptopics.tmpl b/mercurial/templates/paper/helptopics.tmpl
new file mode 100644
index 0000000..a723b53
--- /dev/null
+++ b/mercurial/templates/paper/helptopics.tmpl
@@ -0,0 +1,49 @@
+{header}
+<title>Help: {title}</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li class="active">help</li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+<table class="bigtable">
+<tr><td colspan="2"><h2><a name="main" href="#topics">Topics</a></h2></td></tr>
+{topics % helpentry}
+
+<tr><td colspan="2"><h2><a name="main" href="#main">Main Commands</a></h2></td></tr>
+{earlycommands % helpentry}
+
+<tr><td colspan="2"><h2><a name="other" href="#other">Other Commands</a></h2></td></tr>
+{othercommands % helpentry}
+</table>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/index.tmpl b/mercurial/templates/paper/index.tmpl
new file mode 100644
index 0000000..04b4ffb
--- /dev/null
+++ b/mercurial/templates/paper/index.tmpl
@@ -0,0 +1,26 @@
+{header}
+<title>Mercurial repositories index</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+</div>
+<div class="main">
+<h2>Mercurial Repositories</h2>
+
+<table class="bigtable">
+ <tr>
+ <th><a href="?sort={sort_name}">Name</a></th>
+ <th><a href="?sort={sort_description}">Description</a></th>
+ <th><a href="?sort={sort_contact}">Contact</a></th>
+ <th><a href="?sort={sort_lastchange}">Last modified</a></th>
+ <th>&nbsp;</th>
+ </tr>
+ {entries%indexentry}
+</table>
+</div>
+</div>
+{footer}
diff --git a/mercurial/templates/paper/manifest.tmpl b/mercurial/templates/paper/manifest.tmpl
new file mode 100644
index 0000000..3dc7e77
--- /dev/null
+++ b/mercurial/templates/paper/manifest.tmpl
@@ -0,0 +1,58 @@
+{header}
+<title>{repo|escape}: {node|short} {path|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li class="active">browse</li>
+</ul>
+<ul>
+{archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>directory {path|escape} @ {rev}:{node|short} {tags%changelogtag}</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<table class="bigtable">
+<tr>
+ <th class="name">name</th>
+ <th class="size">size</th>
+ <th class="permissions">permissions</th>
+</tr>
+<tr class="fileline parity{upparity}">
+ <td class="name"><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a></td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+</tr>
+{dentries%direntry}
+{fentries%fileentry}
+</table>
+</div>
+</div>
+{footer}
diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map
new file mode 100644
index 0000000..d384cc6
--- /dev/null
+++ b/mercurial/templates/paper/map
@@ -0,0 +1,224 @@
+default = 'shortlog'
+
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+
+changelog = shortlog.tmpl
+shortlog = shortlog.tmpl
+shortlogentry = shortlogentry.tmpl
+graph = graph.tmpl
+help = help.tmpl
+helptopics = helptopics.tmpl
+
+helpentry = '<tr><td><a href="{url}help/{topic|escape}{sessionvars%urlparameter}">{topic|escape}</a></td><td>{summary|escape}</td></tr>'
+
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+diffstatlink = diffstat.tmpl
+diffstatnolink = diffstat.tmpl
+changelogentry = shortlogentry.tmpl
+searchentry = shortlogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+direntry = '
+ <tr class="fileline parity{parity}">
+ <td class="name">
+ <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">
+ <img src="{staticurl}coal-folder.png" alt="dir."/> {basename|escape}/
+ </a>
+ <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
+ {emptydirs|escape}
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>'
+
+fileentry = '
+ <tr class="fileline parity{parity}">
+ <td class="filename">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ <img src="{staticurl}coal-file.png" alt="file"/> {basename|escape}
+ </a>
+ </td>
+ <td class="size">{size}</td>
+ <td class="permissions">{permissions|permissions}</td>
+ </tr>'
+
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filecomparison = filecomparison.tmpl
+filelog = filelog.tmpl
+fileline = '
+ <div class="parity{parity} source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</div>'
+filelogentry = filelogentry.tmpl
+
+annotateline = '
+ <tr class="parity{parity}">
+ <td class="annotate">
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
+ title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+ </td>
+ <td class="source"><a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}</td>
+ </tr>'
+
+diffblock = '<div class="source bottomline parity{parity}"><pre>{lines}</pre></div>'
+difflineplus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="plusline">{line|escape}</span>'
+difflineminus = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="minusline">{line|escape}</span>'
+difflineat = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> <span class="atline">{line|escape}</span>'
+diffline = '<a href="#{lineid}" id="{lineid}">{linenumber}</a> {line|escape}'
+
+comparisonblock ='
+ <tbody class="block">
+ {lines}
+ </tbody>'
+comparisonline = '
+ <tr>
+ <td class="source {type}"><a href="#{lineid}" id="{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
+ <td class="source {type}"><a href="#{lineid}" id="{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
+ </tr>'
+
+changelogparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+
+changesetparent = '<a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerevparent = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
+filerevchild = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
+
+filerename = '{file|escape}@'
+filelogrename = '
+ <span class="base">
+ base
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {file|escape}@{node|short}
+ </a>
+ </span>'
+fileannotateparent = '
+ <tr>
+ <td class="metatag">parent:</td>
+ <td>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+changesetchild = ' <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
+changelogchild = '
+ <tr>
+ <th class="child">child</th>
+ <td class="child">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+fileannotatechild = '
+ <tr>
+ <td class="metatag">child:</td>
+ <td>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {node|short}
+ </a>
+ </td>
+ </tr>'
+tags = tags.tmpl
+tagentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {tag|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+bookmarks = bookmarks.tmpl
+bookmarkentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">
+ {bookmark|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+branches = branches.tmpl
+branchentry = '
+ <tr class="tagEntry parity{parity}">
+ <td>
+ <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
+ {branch|escape}
+ </a>
+ </td>
+ <td class="node">
+ {node|short}
+ </td>
+ </tr>'
+changelogtag = '<span class="tag">{name|escape}</span> '
+changesettag = '<span class="tag">{tag|escape}</span> '
+changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
+changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
+changelogbranchname = '<span class="branchname">{name|escape}</span> '
+
+filediffparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filelogparent = '
+ <tr>
+ <th>parent {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filediffchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+filelogchild = '
+ <tr>
+ <th>child {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+
+indexentry = '
+ <tr class="parity{parity}">
+ <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
+ <td>{description}</td>
+ <td>{contact|obfuscate}</td>
+ <td class="age">{lastchange|rfc822date}</td>
+ <td class="indexlinks">{archives%indexarchiveentry}</td>
+ </tr>\n'
+indexarchiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
+index = index.tmpl
+archiveentry = '
+ <li>
+ <a href="{url}archive/{node|short}{extension|urlescape}">{type|escape}</a>
+ </li>'
+notfound = notfound.tmpl
+error = error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
diff --git a/mercurial/templates/paper/notfound.tmpl b/mercurial/templates/paper/notfound.tmpl
new file mode 100644
index 0000000..e9e6ba4
--- /dev/null
+++ b/mercurial/templates/paper/notfound.tmpl
@@ -0,0 +1,12 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+<body>
+
+<h2>Mercurial repository not found</h2>
+
+The specified repository "{repo|escape}" is unknown, sorry.
+
+Please go back to the <a href="{url}">main repository list page</a>.
+
+{footer}
diff --git a/mercurial/templates/paper/search.tmpl b/mercurial/templates/paper/search.tmpl
new file mode 100644
index 0000000..feee155
--- /dev/null
+++ b/mercurial/templates/paper/search.tmpl
@@ -0,0 +1,55 @@
+{header}
+<title>{repo|escape}: searching for {query|escape}</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>searching for '{query|escape}'</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30"></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="navigate">
+<a href="{url}search/{lessvars%urlparameter}">less</a>
+<a href="{url}search/{morevars%urlparameter}">more</a>
+</div>
+
+<table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+{entries}
+</table>
+
+<div class="navigate">
+<a href="{url}search/{lessvars%urlparameter}">less</a>
+<a href="{url}search/{morevars%urlparameter}">more</a>
+</div>
+
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/shortlog.tmpl b/mercurial/templates/paper/shortlog.tmpl
new file mode 100644
index 0000000..b69d4b0
--- /dev/null
+++ b/mercurial/templates/paper/shortlog.tmpl
@@ -0,0 +1,70 @@
+{header}
+<title>{repo|escape}: log</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li class="active">log</li>
+<li><a href="{url}graph/{node|short}{sessionvars%urlparameter}">graph</a></li>
+<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
+<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
+</ul>
+<ul>
+{archives%archiveentry}
+</ul>
+<ul>
+ <li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>log</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<div class="navigate">
+<a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+<table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+{entries%shortlogentry}
+</table>
+
+<div class="navigate">
+<a href="{url}shortlog/{rev}{lessvars%urlparameter}">less</a>
+<a href="{url}shortlog/{rev}{morevars%urlparameter}">more</a>
+| rev {rev}: {changenav%navshort}
+</div>
+
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/paper/shortlogentry.tmpl b/mercurial/templates/paper/shortlogentry.tmpl
new file mode 100644
index 0000000..09e94c0
--- /dev/null
+++ b/mercurial/templates/paper/shortlogentry.tmpl
@@ -0,0 +1,5 @@
+ <tr class="parity{parity}">
+ <td class="age">{date|rfc822date}</td>
+ <td class="author">{author|person}</td>
+ <td class="description"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a>{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags % '<span class="tag">{name|escape}</span> '}{bookmarks % '<span class="tag">{name|escape}</span> '}</td>
+ </tr>
diff --git a/mercurial/templates/paper/tags.tmpl b/mercurial/templates/paper/tags.tmpl
new file mode 100644
index 0000000..9b4e623
--- /dev/null
+++ b/mercurial/templates/paper/tags.tmpl
@@ -0,0 +1,49 @@
+{header}
+<title>{repo|escape}: tags</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}: tags" />
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}: tags" />
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="{url}shortlog{sessionvars%urlparameter}">log</a></li>
+<li><a href="{url}graph{sessionvars%urlparameter}">graph</a></li>
+<li class="active">tags</li>
+<li><a href="{url}bookmarks{sessionvars%urlparameter}">bookmarks</a></li>
+<li><a href="{url}branches{sessionvars%urlparameter}">branches</a></li>
+</ul>
+<ul>
+<li><a href="{url}help{sessionvars%urlparameter}">help</a></li>
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
+<h3>tags</h3>
+
+<form class="search" action="{url}log">
+{sessionvars%hiddenformentry}
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<table class="bigtable">
+<tr>
+ <th>tag</th>
+ <th>node</th>
+</tr>
+{entries%tagentry}
+</table>
+</div>
+</div>
+
+{footer}
diff --git a/mercurial/templates/raw/changeset.tmpl b/mercurial/templates/raw/changeset.tmpl
new file mode 100644
index 0000000..b59d99b
--- /dev/null
+++ b/mercurial/templates/raw/changeset.tmpl
@@ -0,0 +1,9 @@
+{header}
+# HG changeset patch
+# User {author}
+# Date {date|hgdate}
+# Node ID {node}
+{parent%changesetparent}
+{desc}
+
+{diff}
diff --git a/mercurial/templates/raw/error.tmpl b/mercurial/templates/raw/error.tmpl
new file mode 100644
index 0000000..9407c13
--- /dev/null
+++ b/mercurial/templates/raw/error.tmpl
@@ -0,0 +1,2 @@
+{header}
+error: {error}
diff --git a/mercurial/templates/raw/fileannotate.tmpl b/mercurial/templates/raw/fileannotate.tmpl
new file mode 100644
index 0000000..ad1bed6
--- /dev/null
+++ b/mercurial/templates/raw/fileannotate.tmpl
@@ -0,0 +1,5 @@
+{header}
+{annotate%annotateline}
+{footer}
+
+
diff --git a/mercurial/templates/raw/filediff.tmpl b/mercurial/templates/raw/filediff.tmpl
new file mode 100644
index 0000000..c4014bc
--- /dev/null
+++ b/mercurial/templates/raw/filediff.tmpl
@@ -0,0 +1,5 @@
+{header}
+{diff}
+{footer}
+
+
diff --git a/mercurial/templates/raw/graph.tmpl b/mercurial/templates/raw/graph.tmpl
new file mode 100644
index 0000000..da2a81a
--- /dev/null
+++ b/mercurial/templates/raw/graph.tmpl
@@ -0,0 +1,6 @@
+{header}
+# HG graph
+# Node ID {node}
+# Rows shown {rows}
+
+{nodes%graphnode}
diff --git a/mercurial/templates/raw/graphedge.tmpl b/mercurial/templates/raw/graphedge.tmpl
new file mode 100644
index 0000000..cb84efa
--- /dev/null
+++ b/mercurial/templates/raw/graphedge.tmpl
@@ -0,0 +1 @@
+edge: ({col}, {row}) -> ({nextcol}, {nextrow}) (color {color})
diff --git a/mercurial/templates/raw/graphnode.tmpl b/mercurial/templates/raw/graphnode.tmpl
new file mode 100644
index 0000000..b1c9983
--- /dev/null
+++ b/mercurial/templates/raw/graphnode.tmpl
@@ -0,0 +1,7 @@
+changeset: {node}
+user: {user}
+date: {age}
+summary: {desc}
+{branches%branchname}{tags%tagname}{bookmarks%bookmarkname}
+node: ({col}, {row}) (color {color})
+{edges%graphedge}
diff --git a/mercurial/templates/raw/index.tmpl b/mercurial/templates/raw/index.tmpl
new file mode 100644
index 0000000..29d7c9e
--- /dev/null
+++ b/mercurial/templates/raw/index.tmpl
@@ -0,0 +1,2 @@
+{header}
+{entries%indexentry}
diff --git a/mercurial/templates/raw/manifest.tmpl b/mercurial/templates/raw/manifest.tmpl
new file mode 100644
index 0000000..8d4a934
--- /dev/null
+++ b/mercurial/templates/raw/manifest.tmpl
@@ -0,0 +1,3 @@
+{header}
+{dentries%direntry}{fentries%fileentry}
+{footer}
diff --git a/mercurial/templates/raw/map b/mercurial/templates/raw/map
new file mode 100644
index 0000000..5a682b2
--- /dev/null
+++ b/mercurial/templates/raw/map
@@ -0,0 +1,38 @@
+default = 'shortlog'
+shortlog = "'raw' is not a browsable style"
+mimetype = 'text/plain; charset={encoding}'
+header = ''
+footer = ''
+changeset = changeset.tmpl
+difflineplus = '{line}'
+difflineminus = '{line}'
+difflineat = '{line}'
+diffline = '{line}'
+changesetparent = '# Parent {node}'
+changesetchild = '# Child {node}'
+filenodelink = ''
+filenolink = ''
+fileline = '{line}'
+diffblock = '{lines}'
+filediff = filediff.tmpl
+fileannotate = fileannotate.tmpl
+annotateline = '{author|user}@{rev}: {line}'
+manifest = manifest.tmpl
+direntry = 'drwxr-xr-x {basename}\n'
+fileentry = '{permissions|permissions} {size} {basename}\n'
+index = index.tmpl
+notfound = notfound.tmpl
+error = error.tmpl
+indexentry = '{url}\n'
+tags = '{entries%tagentry}'
+tagentry = '{tag} {node}\n'
+bookmarks = '{entries%bookmarkentry}'
+bookmarkentry = '{bookmark} {node}\n'
+branches = '{entries%branchentry}'
+branchentry = '{branch} {node} {status}\n'
+graph = graph.tmpl
+graphnode = graphnode.tmpl
+graphedge = graphedge.tmpl
+bookmarkname = 'bookmark: {name}\n'
+branchname = 'branch: {name}\n'
+tagname = 'tag: {name}\n'
diff --git a/mercurial/templates/raw/notfound.tmpl b/mercurial/templates/raw/notfound.tmpl
new file mode 100644
index 0000000..a7b3251
--- /dev/null
+++ b/mercurial/templates/raw/notfound.tmpl
@@ -0,0 +1,2 @@
+{header}
+error: repository {repo} not found
diff --git a/mercurial/templates/rss/bookmarkentry.tmpl b/mercurial/templates/rss/bookmarkentry.tmpl
new file mode 100644
index 0000000..93b5614
--- /dev/null
+++ b/mercurial/templates/rss/bookmarkentry.tmpl
@@ -0,0 +1,6 @@
+<item>
+ <title>{bookmark|escape}</title>
+ <link>{urlbase}{url}rev/{node|short}</link>
+ <description><![CDATA[{bookmark|strip|escape|addbreaks}]]></description>
+ <pubDate>{date|rfc822date}</pubDate>
+</item>
diff --git a/mercurial/templates/rss/bookmarks.tmpl b/mercurial/templates/rss/bookmarks.tmpl
new file mode 100644
index 0000000..8cc8172
--- /dev/null
+++ b/mercurial/templates/rss/bookmarks.tmpl
@@ -0,0 +1,6 @@
+{header}
+ <title>{repo|escape}: bookmarks </title>
+ <description>{repo|escape} bookmark history</description>
+ {entries%bookmarkentry}
+ </channel>
+</rss>
diff --git a/mercurial/templates/rss/changelog.tmpl b/mercurial/templates/rss/changelog.tmpl
new file mode 100644
index 0000000..65b96ad
--- /dev/null
+++ b/mercurial/templates/rss/changelog.tmpl
@@ -0,0 +1,6 @@
+{header}
+ <title>{repo|escape} Changelog</title>
+ <description>{repo|escape} Changelog</description>
+ {entries%changelogentry}
+ </channel>
+</rss> \ No newline at end of file
diff --git a/mercurial/templates/rss/changelogentry.tmpl b/mercurial/templates/rss/changelogentry.tmpl
new file mode 100644
index 0000000..12fe8e0
--- /dev/null
+++ b/mercurial/templates/rss/changelogentry.tmpl
@@ -0,0 +1,7 @@
+<item>
+ <title>{desc|strip|firstline|strip|escape}</title>
+ <guid isPermaLink="true">{urlbase}{url}rev/{node|short}</guid>
+ <description><![CDATA[{desc|strip|escape|addbreaks|nonempty}]]></description>
+ <author>{author|obfuscate}</author>
+ <pubDate>{date|rfc822date}</pubDate>
+</item>
diff --git a/mercurial/templates/rss/error.tmpl b/mercurial/templates/rss/error.tmpl
new file mode 100644
index 0000000..87e6009
--- /dev/null
+++ b/mercurial/templates/rss/error.tmpl
@@ -0,0 +1,10 @@
+{header}
+ <title>Error</title>
+ <description>Error</description>
+ <item>
+ <title>Error</title>
+ <description>{error|escape}</description>
+ <guid>http://mercurial.selenic.com/#error</guid>
+ </item>
+ </channel>
+</rss>
diff --git a/mercurial/templates/rss/filelog.tmpl b/mercurial/templates/rss/filelog.tmpl
new file mode 100644
index 0000000..31f4dc7
--- /dev/null
+++ b/mercurial/templates/rss/filelog.tmpl
@@ -0,0 +1,6 @@
+{header}
+ <title>{repo|escape}: {file|escape} history</title>
+ <description>{file|escape} revision history</description>
+ {entries%filelogentry}
+ </channel>
+</rss>
diff --git a/mercurial/templates/rss/filelogentry.tmpl b/mercurial/templates/rss/filelogentry.tmpl
new file mode 100644
index 0000000..51cd3af
--- /dev/null
+++ b/mercurial/templates/rss/filelogentry.tmpl
@@ -0,0 +1,7 @@
+<item>
+ <title>{desc|strip|firstline|strip|escape}</title>
+ <link>{urlbase}{url}log{node|short}/{file|urlescape}</link>
+ <description><![CDATA[{desc|strip|escape|addbreaks|nonempty}]]></description>
+ <author>{author|obfuscate}</author>
+ <pubDate>{date|rfc822date}</pubDate>
+</item>
diff --git a/mercurial/templates/rss/header.tmpl b/mercurial/templates/rss/header.tmpl
new file mode 100644
index 0000000..ed29196
--- /dev/null
+++ b/mercurial/templates/rss/header.tmpl
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="{encoding}"?>
+<rss version="2.0">
+ <channel>
+ <link>{urlbase}{url}</link>
+ <language>en-us</language>
diff --git a/mercurial/templates/rss/map b/mercurial/templates/rss/map
new file mode 100644
index 0000000..0f141be
--- /dev/null
+++ b/mercurial/templates/rss/map
@@ -0,0 +1,12 @@
+default = 'changelog'
+mimetype = 'text/xml; charset={encoding}'
+header = header.tmpl
+changelog = changelog.tmpl
+changelogentry = changelogentry.tmpl
+filelog = filelog.tmpl
+filelogentry = filelogentry.tmpl
+tags = tags.tmpl
+tagentry = tagentry.tmpl
+bookmarks = bookmarks.tmpl
+bookmarkentry = bookmarkentry.tmpl
+error = error.tmpl
diff --git a/mercurial/templates/rss/tagentry.tmpl b/mercurial/templates/rss/tagentry.tmpl
new file mode 100644
index 0000000..42fa038
--- /dev/null
+++ b/mercurial/templates/rss/tagentry.tmpl
@@ -0,0 +1,6 @@
+<item>
+ <title>{tag|escape}</title>
+ <link>{urlbase}{url}rev/{node|short}</link>
+ <description><![CDATA[{tag|strip|escape|addbreaks}]]></description>
+ <pubDate>{date|rfc822date}</pubDate>
+</item>
diff --git a/mercurial/templates/rss/tags.tmpl b/mercurial/templates/rss/tags.tmpl
new file mode 100644
index 0000000..93f1e96
--- /dev/null
+++ b/mercurial/templates/rss/tags.tmpl
@@ -0,0 +1,6 @@
+{header}
+ <title>{repo|escape}: tags </title>
+ <description>{repo|escape} tag history</description>
+ {entriesnotip%tagentry}
+ </channel>
+</rss>
diff --git a/mercurial/templates/spartan/branches.tmpl b/mercurial/templates/spartan/branches.tmpl
new file mode 100644
index 0000000..43e3bdb
--- /dev/null
+++ b/mercurial/templates/spartan/branches.tmpl
@@ -0,0 +1,27 @@
+{header}
+<title>{repo|escape}: branches</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-branches" title="Atom feed for {repo|escape}: branches">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-branches" title="RSS feed for {repo|escape}: branches">
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}file/{node|short}/{sessionvars%urlparameter}">files</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<a type="application/rss+xml" href="{url}rss-branches">rss</a>
+<a type="application/atom+xml" href="{url}atom-branches">atom</a>
+</div>
+
+<h2>branches:</h2>
+
+<ul id="tagEntries">
+{entries%branchentry}
+</ul>
+
+{footer}
diff --git a/mercurial/templates/spartan/changelog.tmpl b/mercurial/templates/spartan/changelog.tmpl
new file mode 100644
index 0000000..466e681
--- /dev/null
+++ b/mercurial/templates/spartan/changelog.tmpl
@@ -0,0 +1,44 @@
+{header}
+<title>{repo|escape}: changelog</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}">
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+{archives%archiveentry}
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<a type="application/rss+xml" href="{url}rss-log">rss</a>
+<a type="application/atom+xml" href="{url}atom-log" title="Atom feed for {repo|escape}">atom</a>
+</div>
+
+<h2>changelog for {repo|escape}</h2>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search1">search:</label>
+<input name="rev" id="search1" type="text" size="30">
+navigate: <small class="navigate">{changenav%nav}</small>
+</p>
+</form>
+
+{entries%changelogentry}
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search2">search:</label>
+<input name="rev" id="search2" type="text" size="30">
+navigate: <small class="navigate">{changenav%nav}</small>
+</p>
+</form>
+
+{footer}
diff --git a/mercurial/templates/spartan/changelogentry.tmpl b/mercurial/templates/spartan/changelogentry.tmpl
new file mode 100644
index 0000000..f506b94
--- /dev/null
+++ b/mercurial/templates/spartan/changelogentry.tmpl
@@ -0,0 +1,25 @@
+<table class="logEntry parity{parity}">
+ <tr>
+ <th><span class="age">{date|rfc822date}</span>:</th>
+ <th class="firstline">{desc|strip|firstline|escape|nonempty}</th>
+ </tr>
+ <tr>
+ <th class="revision">changeset {rev}:</th>
+ <td class="node"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>
+ {parent%changelogparent}
+ {child%changelogchild}
+ {changelogtag}
+ <tr>
+ <th class="author">author:</th>
+ <td class="author">{author|obfuscate}</td>
+ </tr>
+ <tr>
+ <th class="date">date:</th>
+ <td class="date">{date|rfc822date}</td>
+ </tr>
+ <tr>
+ <th class="files"><a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>:</th>
+ <td class="files">{files}</td>
+ </tr>
+</table>
diff --git a/mercurial/templates/spartan/changeset.tmpl b/mercurial/templates/spartan/changeset.tmpl
new file mode 100644
index 0000000..b357126
--- /dev/null
+++ b/mercurial/templates/spartan/changeset.tmpl
@@ -0,0 +1,52 @@
+{header}
+<title>{repo|escape}: changeset {node|short}</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+<a href="{url}raw-rev/{node|short}">raw</a>
+{archives%archiveentry}
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>changeset: {desc|strip|escape|firstline|nonempty}</h2>
+
+<table id="changesetEntry">
+<tr>
+ <th class="changeset">changeset {rev}:</th>
+ <td class="changeset"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+</tr>
+{parent%changesetparent}
+{child%changesetchild}
+{changesettag}
+<tr>
+ <th class="author">author:</th>
+ <td class="author">{author|obfuscate}</td>
+</tr>
+<tr>
+ <th class="date">date:</th>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <th class="files">files:</th>
+ <td class="files">{files}</td>
+</tr>
+<tr>
+ <th class="description">description:</th>
+ <td class="description">{desc|strip|escape|addbreaks|nonempty}</td>
+</tr>
+</table>
+
+<div id="changesetDiff">
+{diff}
+</div>
+
+{footer}
+
+
diff --git a/mercurial/templates/spartan/error.tmpl b/mercurial/templates/spartan/error.tmpl
new file mode 100644
index 0000000..fc2c788
--- /dev/null
+++ b/mercurial/templates/spartan/error.tmpl
@@ -0,0 +1,15 @@
+{header}
+<title>Mercurial Error</title>
+</head>
+<body>
+
+<h2>Mercurial Error</h2>
+
+<p>
+An error occurred while processing your request:
+</p>
+<p>
+{error|escape}
+</p>
+
+{footer}
diff --git a/mercurial/templates/spartan/fileannotate.tmpl b/mercurial/templates/spartan/fileannotate.tmpl
new file mode 100644
index 0000000..5d6a72b
--- /dev/null
+++ b/mercurial/templates/spartan/fileannotate.tmpl
@@ -0,0 +1,49 @@
+{header}
+<title>{repo|escape}: {file|escape} annotate</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a>
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+<a href="{url}raw-annotate/{node|short}/{file|urlescape}">raw</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>Annotate {file|escape}</h2>
+
+<table>
+<tr>
+ <td class="metatag">changeset {rev}:</td>
+ <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%fileannotateparent}
+{child%fileannotatechild}
+<tr>
+ <td class="metatag">author:</td>
+ <td>{author|obfuscate}</td></tr>
+<tr>
+ <td class="metatag">date:</td>
+ <td class="date age">{date|rfc822date}</td>
+</tr>
+<tr>
+ <td class="metatag">permissions:</td>
+ <td>{permissions|permissions}</td>
+</tr>
+<tr>
+ <td class="metatag">description:</td>
+ <td>{desc|strip|escape|addbreaks|nonempty}</td>
+</tr>
+</table>
+
+<table cellspacing="0" cellpadding="0">
+{annotate%annotateline}
+</table>
+
+{footer}
diff --git a/mercurial/templates/spartan/filediff.tmpl b/mercurial/templates/spartan/filediff.tmpl
new file mode 100644
index 0000000..7640cba
--- /dev/null
+++ b/mercurial/templates/spartan/filediff.tmpl
@@ -0,0 +1,37 @@
+{header}
+<title>{repo|escape}: {file|escape} diff</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+<a href="{url}raw-diff/{node|short}/{file|urlescape}">raw</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>{file|escape}</h2>
+
+<table id="filediffEntry">
+<tr>
+ <th class="revision">revision {rev}:</th>
+ <td class="revision"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+</tr>
+{parent%filediffparent}
+{child%filediffchild}
+</table>
+
+<div id="fileDiff">
+{diff}
+</div>
+
+{footer}
+
+
diff --git a/mercurial/templates/spartan/filelog.tmpl b/mercurial/templates/spartan/filelog.tmpl
new file mode 100644
index 0000000..d003f79
--- /dev/null
+++ b/mercurial/templates/spartan/filelog.tmpl
@@ -0,0 +1,29 @@
+{header}
+<title>{repo|escape}: {file|escape} history</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log/tip/{file|urlescape}" title="RSS feed for {repo|escape}:{file}">
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a>
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<a type="application/rss+xml" href="{url}rss-log/tip/{file|urlescape}">rss</a>
+<a type="application/atom+xml" href="{url}atom-log/tip/{file|urlescape}" title="Atom feed for {repo|escape}:{file}">atom</a>
+</div>
+
+<h2>{file|escape} revision history</h2>
+
+<p>navigate: <small class="navigate">{nav%filenav}</small></p>
+
+{entries%filelogentry}
+
+{footer}
diff --git a/mercurial/templates/spartan/filelogentry.tmpl b/mercurial/templates/spartan/filelogentry.tmpl
new file mode 100644
index 0000000..baff52d
--- /dev/null
+++ b/mercurial/templates/spartan/filelogentry.tmpl
@@ -0,0 +1,25 @@
+<table class="logEntry parity{parity}">
+ <tr>
+ <th><span class="age">{date|rfc822date}</span>:</th>
+ <th class="firstline"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></th>
+ </tr>
+ <tr>
+ <th class="revision">revision {filerev}:</td>
+ <td class="node">
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
+ <a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">(diff)</a>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">(annotate)</a>
+ </td>
+ </tr>
+ {rename%filelogrename}
+ <tr>
+ <th class="author">author:</th>
+ <td class="author">{author|obfuscate}</td>
+ </tr>
+ <tr>
+ <th class="date">date:</th>
+ <td class="date">{date|rfc822date}</td>
+ </tr>
+</table>
+
+
diff --git a/mercurial/templates/spartan/filerevision.tmpl b/mercurial/templates/spartan/filerevision.tmpl
new file mode 100644
index 0000000..548d3c6
--- /dev/null
+++ b/mercurial/templates/spartan/filerevision.tmpl
@@ -0,0 +1,47 @@
+{header}
+<title>{repo|escape}:{file|escape}</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+<a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">files</a>
+<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
+<a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
+<a href="{url}raw-file/{node|short}/{file|urlescape}">raw</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>{file|escape}</h2>
+
+<table>
+<tr>
+ <td class="metatag">changeset {rev}:</td>
+ <td><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td></tr>
+{parent%filerevparent}
+{child%filerevchild}
+<tr>
+ <td class="metatag">author:</td>
+ <td>{author|obfuscate}</td></tr>
+<tr>
+ <td class="metatag">date:</td>
+ <td class="date age">{date|rfc822date}</td></tr>
+<tr>
+ <td class="metatag">permissions:</td>
+ <td>{permissions|permissions}</td></tr>
+<tr>
+ <td class="metatag">description:</td>
+ <td>{desc|strip|escape|addbreaks|nonempty}</td>
+</tr>
+</table>
+
+<pre>
+{text%fileline}
+</pre>
+
+{footer}
diff --git a/mercurial/templates/spartan/footer.tmpl b/mercurial/templates/spartan/footer.tmpl
new file mode 100644
index 0000000..665bdb2
--- /dev/null
+++ b/mercurial/templates/spartan/footer.tmpl
@@ -0,0 +1,9 @@
+<script type="text/javascript">process_dates()</script>
+{motd}
+<div class="logo">
+<a href="{logourl}">
+<img src="{staticurl}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a>
+</div>
+
+</body>
+</html>
diff --git a/mercurial/templates/spartan/graph.tmpl b/mercurial/templates/spartan/graph.tmpl
new file mode 100644
index 0000000..054bc42
--- /dev/null
+++ b/mercurial/templates/spartan/graph.tmpl
@@ -0,0 +1,86 @@
+{header}
+<title>{repo|escape}: graph</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}: tags">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}: tags">
+<!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}/{sessionvars%urlparameter}">files</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>graph</h2>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search1">search:</label>
+<input name="rev" id="search1" type="text" size="30">
+navigate: <small class="navigate">{changenav%navgraph}</small>
+</p>
+</form>
+
+<noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
+
+<div id="wrapper">
+<ul id="nodebgs"></ul>
+<canvas id="graph" width="480" height="{canvasheight}"></canvas>
+<ul id="graphnodes"></ul>
+</div>
+
+<script type="text/javascript">
+<!-- hide script content
+
+var data = {jsdata|json};
+var graph = new Graph();
+graph.scale({bg_height});
+
+var revlink = '<li style="_STYLE"><span class="desc">';
+revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
+revlink += '</span><span class="info">_DATE, by _USER</span></li>';
+
+graph.vertex = function(x, y, color, parity, cur) \{
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ return [bg, item];
+
+}
+
+graph.render(data);
+
+// stop hiding script -->
+</script>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search1">search:</label>
+<input name="rev" id="search1" type="text" size="30">
+navigate: <small class="navigate">{changenav%navgraph}</small>
+</p>
+</form>
+
+{footer}
diff --git a/mercurial/templates/spartan/header.tmpl b/mercurial/templates/spartan/header.tmpl
new file mode 100644
index 0000000..cd40d80
--- /dev/null
+++ b/mercurial/templates/spartan/header.tmpl
@@ -0,0 +1,7 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="icon" href="{staticurl}hgicon.png" type="image/png">
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="{staticurl}style.css" type="text/css" />
+<script type="text/javascript" src="{staticurl}mercurial.js"></script>
diff --git a/mercurial/templates/spartan/index.tmpl b/mercurial/templates/spartan/index.tmpl
new file mode 100644
index 0000000..f399813
--- /dev/null
+++ b/mercurial/templates/spartan/index.tmpl
@@ -0,0 +1,19 @@
+{header}
+<title>Mercurial repositories index</title>
+</head>
+<body>
+
+<h2>Mercurial Repositories</h2>
+
+<table>
+ <tr>
+ <td><a href="?sort={sort_name}">Name</a></td>
+ <td><a href="?sort={sort_description}">Description</a></td>
+ <td><a href="?sort={sort_contact}">Contact</a></td>
+ <td><a href="?sort={sort_lastchange}">Last modified</a></td>
+ <td>&nbsp;</td>
+ </tr>
+ {entries%indexentry}
+</table>
+
+{footer}
diff --git a/mercurial/templates/spartan/manifest.tmpl b/mercurial/templates/spartan/manifest.tmpl
new file mode 100644
index 0000000..24a0973
--- /dev/null
+++ b/mercurial/templates/spartan/manifest.tmpl
@@ -0,0 +1,29 @@
+{header}
+<title>{repo|escape}: files for changeset {node|short}</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog/{rev}{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
+{archives%archiveentry}
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>files for changeset {node|short}: {path|escape}</h2>
+
+<table cellpadding="0" cellspacing="0">
+<tr class="parity{upparity}">
+ <td><tt>drwxr-xr-x</tt>&nbsp;
+ <td>&nbsp;
+ <td>&nbsp;
+ <td><a href="{url}file/{node|short}{up|urlescape}{sessionvars%urlparameter}">[up]</a>
+</tr>
+{dentries%direntry}
+{fentries%fileentry}
+</table>
+{footer}
diff --git a/mercurial/templates/spartan/map b/mercurial/templates/spartan/map
new file mode 100644
index 0000000..8280723
--- /dev/null
+++ b/mercurial/templates/spartan/map
@@ -0,0 +1,183 @@
+default = 'shortlog'
+mimetype = 'text/html; charset={encoding}'
+header = header.tmpl
+footer = footer.tmpl
+search = search.tmpl
+changelog = changelog.tmpl
+shortlog = shortlog.tmpl
+shortlogentry = shortlogentry.tmpl
+graph = graph.tmpl
+naventry = '<a href="{url}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navshortentry = '<a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+navgraphentry = '<a href="{url}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
+filenaventry = '<a href="{url}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
+filedifflink = '<a href="{url}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenodelink = '<a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
+filenolink = '{file|escape} '
+fileellipses = '...'
+changelogentry = changelogentry.tmpl
+searchentry = changelogentry.tmpl
+changeset = changeset.tmpl
+manifest = manifest.tmpl
+
+nav = '{before%naventry} {after%naventry}'
+navshort = '{before%navshortentry}{after%navshortentry}'
+navgraph = '{before%navgraphentry}{after%navgraphentry}'
+filenav = '{before%filenaventry}{after%filenaventry}'
+
+direntry = '
+ <tr class="parity{parity}">
+ <td><tt>drwxr-xr-x</tt>&nbsp;
+ <td>&nbsp;
+ <td>&nbsp;
+ <td>
+ <a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}/</a>
+ <a href="{url}file/{node|short}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
+ {emptydirs|urlescape}
+ </a>'
+
+fileentry = '
+ <tr class="parity{parity}">
+ <td><tt>{permissions|permissions}</tt>&nbsp;
+ <td align=right><tt class="date">{date|isodate}</tt>&nbsp;
+ <td align=right><tt>{size}</tt>&nbsp;
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>'
+
+filerevision = filerevision.tmpl
+fileannotate = fileannotate.tmpl
+filediff = filediff.tmpl
+filelog = filelog.tmpl
+fileline = '<div class="parity{parity}"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>&nbsp;{line|escape}</div>'
+filelogentry = filelogentry.tmpl
+
+# The &nbsp; ensures that all table cells have content (even if there
+# is an empty line in the annotated file), which in turn ensures that
+# all table rows have equal height.
+annotateline = '
+ <tr class="parity{parity}">
+ <td class="annotate">
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
+ title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+ </td>
+ <td>
+ <a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>
+ </td>
+ <td><pre>&nbsp;{line|escape}</pre></td>
+ </tr>'
+difflineplus = '<span class="plusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
+difflineminus = '<span class="minusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
+difflineat = '<span class="atline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
+diffline = '<a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}'
+changelogparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent">
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
+ </td>
+ </tr>'
+changesetparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filerevparent = '
+ <tr>
+ <td class="metatag">parent:</td>
+ <td>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+filerename = '{file|escape}@'
+filelogrename = '
+ <tr>
+ <th>base:</th>
+ <td>
+ <a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {file|escape}@{node|short}
+ </a>
+ </td>
+ </tr>'
+fileannotateparent = '
+ <tr>
+ <td class="metatag">parent:</td>
+ <td>
+ <a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
+ {rename%filerename}{node|short}
+ </a>
+ </td>
+ </tr>'
+changesetchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+changelogchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filerevchild = '
+ <tr>
+ <td class="metatag">child:</td>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+fileannotatechild = '
+ <tr>
+ <td class="metatag">child:</td>
+ <td><a href="{url}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+tags = tags.tmpl
+tagentry = '
+ <li class="tagEntry parity{parity}">
+ <tt class="node">{node}</tt>
+ <a href="{url}rev/{node|short}{sessionvars%urlparameter}">{tag|escape}</a>
+ </li>'
+branches = branches.tmpl
+branchentry = '
+ <li class="tagEntry parity{parity}">
+ <tt class="node">{node}</tt>
+ <a href="{url}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">{branch|escape}</a>
+ </li>'
+diffblock = '<pre class="parity{parity}">{lines}</pre>'
+changelogtag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
+changesettag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
+filediffparent = '
+ <tr>
+ <th class="parent">parent {rev}:</th>
+ <td class="parent"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filelogparent = '
+ <tr>
+ <th>parent {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filediffchild = '
+ <tr>
+ <th class="child">child {rev}:</th>
+ <td class="child"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+filelogchild = '
+ <tr>
+ <th>child {rev}:</th>
+ <td><a href="{url}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
+ </tr>'
+indexentry = '
+ <tr class="parity{parity}">
+ <td><a href="{url}{sessionvars%urlparameter}">{name|escape}</a></td>
+ <td>{description}</td>
+ <td>{contact|obfuscate}</td>
+ <td class="age">{lastchange|rfc822date}</td>
+ <td class="indexlinks">
+ <a href="{url}rss-log">RSS</a>
+ <a href="{url}atom-log">Atom</a>
+ {archives%archiveentry}
+ </td>
+ </tr>'
+index = index.tmpl
+archiveentry = '<a href="{url}archive/{node|short}{extension|urlescape}">{type|escape}</a> '
+notfound = notfound.tmpl
+error = error.tmpl
+urlparameter = '{separator}{name}={value|urlescape}'
+hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
diff --git a/mercurial/templates/spartan/notfound.tmpl b/mercurial/templates/spartan/notfound.tmpl
new file mode 100644
index 0000000..e9e6ba4
--- /dev/null
+++ b/mercurial/templates/spartan/notfound.tmpl
@@ -0,0 +1,12 @@
+{header}
+<title>Mercurial repository not found</title>
+</head>
+<body>
+
+<h2>Mercurial repository not found</h2>
+
+The specified repository "{repo|escape}" is unknown, sorry.
+
+Please go back to the <a href="{url}">main repository list page</a>.
+
+{footer}
diff --git a/mercurial/templates/spartan/search.tmpl b/mercurial/templates/spartan/search.tmpl
new file mode 100644
index 0000000..9ace1eb
--- /dev/null
+++ b/mercurial/templates/spartan/search.tmpl
@@ -0,0 +1,37 @@
+{header}
+<title>{repo|escape}: searching for {query|escape}</title>
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}{sessionvars%urlparameter}">files</a>
+{archives%archiveentry}
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+</div>
+
+<h2>searching for {query|escape}</h2>
+
+<form>
+{sessionvars%hiddenformentry}
+<p>
+search:
+<input name="rev" type="text" width="30" value="{query|escape}">
+</p>
+</form>
+
+{entries}
+
+<form>
+{sessionvars%hiddenformentry}
+<p>
+search:
+<input name="rev" type="text" width="30" value="{query|escape}">
+</p>
+</form>
+
+{footer}
diff --git a/mercurial/templates/spartan/shortlog.tmpl b/mercurial/templates/spartan/shortlog.tmpl
new file mode 100644
index 0000000..1f70a53
--- /dev/null
+++ b/mercurial/templates/spartan/shortlog.tmpl
@@ -0,0 +1,44 @@
+{header}
+<title>{repo|escape}: shortlog</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-log" title="Atom feed for {repo|escape}">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-log" title="RSS feed for {repo|escape}">
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log/{rev}{sessionvars%urlparameter}">changelog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}tags{sessionvars%urlparameter}">tags</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}/{sessionvars%urlparameter}">files</a>
+{archives%archiveentry}
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<a type="application/rss+xml" href="{url}rss-log">rss</a>
+<a type="application/rss+xml" href="{url}atom-log" title="Atom feed for {repo|escape}">atom</a>
+</div>
+
+<h2>shortlog for {repo|escape}</h2>
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search1">search:</label>
+<input name="rev" id="search1" type="text" size="30">
+navigate: <small class="navigate">{changenav%navshort}</small>
+</p>
+</form>
+
+{entries%shortlogentry}
+
+<form action="{url}log">
+{sessionvars%hiddenformentry}
+<p>
+<label for="search2">search:</label>
+<input name="rev" id="search2" type="text" size="30">
+navigate: <small class="navigate">{changenav%navshort}</small>
+</p>
+</form>
+
+{footer}
diff --git a/mercurial/templates/spartan/shortlogentry.tmpl b/mercurial/templates/spartan/shortlogentry.tmpl
new file mode 100644
index 0000000..d104753
--- /dev/null
+++ b/mercurial/templates/spartan/shortlogentry.tmpl
@@ -0,0 +1,7 @@
+<table class="slogEntry parity{parity}">
+ <tr>
+ <td class="age">{date|rfc822date}</td>
+ <td class="author">{author|person}</td>
+ <td class="node"><a href="{url}rev/{node|short}{sessionvars%urlparameter}">{desc|strip|firstline|escape|nonempty}</a></td>
+ </tr>
+</table>
diff --git a/mercurial/templates/spartan/tags.tmpl b/mercurial/templates/spartan/tags.tmpl
new file mode 100644
index 0000000..4c41551
--- /dev/null
+++ b/mercurial/templates/spartan/tags.tmpl
@@ -0,0 +1,27 @@
+{header}
+<title>{repo|escape}: tags</title>
+<link rel="alternate" type="application/atom+xml"
+ href="{url}atom-tags" title="Atom feed for {repo|escape}: tags">
+<link rel="alternate" type="application/rss+xml"
+ href="{url}rss-tags" title="RSS feed for {repo|escape}: tags">
+</head>
+<body>
+
+<div class="buttons">
+<a href="{url}log{sessionvars%urlparameter}">changelog</a>
+<a href="{url}shortlog{sessionvars%urlparameter}">shortlog</a>
+<a href="{url}graph{sessionvars%urlparameter}">graph</a>
+<a href="{url}branches{sessionvars%urlparameter}">branches</a>
+<a href="{url}file/{node|short}/{sessionvars%urlparameter}">files</a>
+<a href="{url}help{sessionvars%urlparameter}">help</a>
+<a type="application/rss+xml" href="{url}rss-tags">rss</a>
+<a type="application/atom+xml" href="{url}atom-tags">atom</a>
+</div>
+
+<h2>tags:</h2>
+
+<ul id="tagEntries">
+{entries%tagentry}
+</ul>
+
+{footer}
diff --git a/mercurial/templates/static/background.png b/mercurial/templates/static/background.png
new file mode 100644
index 0000000..af8a0aa
--- /dev/null
+++ b/mercurial/templates/static/background.png
Binary files differ
diff --git a/mercurial/templates/static/coal-file.png b/mercurial/templates/static/coal-file.png
new file mode 100644
index 0000000..7ecf463
--- /dev/null
+++ b/mercurial/templates/static/coal-file.png
Binary files differ
diff --git a/mercurial/templates/static/coal-folder.png b/mercurial/templates/static/coal-folder.png
new file mode 100644
index 0000000..d1b8ecc
--- /dev/null
+++ b/mercurial/templates/static/coal-folder.png
Binary files differ
diff --git a/mercurial/templates/static/excanvas.js b/mercurial/templates/static/excanvas.js
new file mode 100644
index 0000000..9d71658
--- /dev/null
+++ b/mercurial/templates/static/excanvas.js
@@ -0,0 +1,19 @@
+if(!window.CanvasRenderingContext2D){(function(){var I=Math,i=I.round,L=I.sin,M=I.cos,m=10,A=m/2,Q={init:function(a){var b=a||document;if(/MSIE/.test(navigator.userAgent)&&!window.opera){var c=this;b.attachEvent("onreadystatechange",function(){c.r(b)})}},r:function(a){if(a.readyState=="complete"){if(!a.namespaces["s"]){a.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml")}var b=a.createStyleSheet();b.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}";
+var c=a.getElementsByTagName("canvas");for(var d=0;d<c.length;d++){if(!c[d].getContext){this.initElement(c[d])}}}},q:function(a){var b=a.outerHTML,c=a.ownerDocument.createElement(b);if(b.slice(-2)!="/>"){var d="/"+a.tagName,e;while((e=a.nextSibling)&&e.tagName!=d){e.removeNode()}if(e){e.removeNode()}}a.parentNode.replaceChild(c,a);return c},initElement:function(a){a=this.q(a);a.getContext=function(){if(this.l){return this.l}return this.l=new K(this)};a.attachEvent("onpropertychange",V);a.attachEvent("onresize",
+W);var b=a.attributes;if(b.width&&b.width.specified){a.style.width=b.width.nodeValue+"px"}else{a.width=a.clientWidth}if(b.height&&b.height.specified){a.style.height=b.height.nodeValue+"px"}else{a.height=a.clientHeight}return a}};function V(a){var b=a.srcElement;switch(a.propertyName){case "width":b.style.width=b.attributes.width.nodeValue+"px";b.getContext().clearRect();break;case "height":b.style.height=b.attributes.height.nodeValue+"px";b.getContext().clearRect();break}}function W(a){var b=a.srcElement;
+if(b.firstChild){b.firstChild.style.width=b.clientWidth+"px";b.firstChild.style.height=b.clientHeight+"px"}}Q.init();var R=[];for(var E=0;E<16;E++){for(var F=0;F<16;F++){R[E*16+F]=E.toString(16)+F.toString(16)}}function J(){return[[1,0,0],[0,1,0],[0,0,1]]}function G(a,b){var c=J();for(var d=0;d<3;d++){for(var e=0;e<3;e++){var g=0;for(var h=0;h<3;h++){g+=a[d][h]*b[h][e]}c[d][e]=g}}return c}function N(a,b){b.fillStyle=a.fillStyle;b.lineCap=a.lineCap;b.lineJoin=a.lineJoin;b.lineWidth=a.lineWidth;b.miterLimit=
+a.miterLimit;b.shadowBlur=a.shadowBlur;b.shadowColor=a.shadowColor;b.shadowOffsetX=a.shadowOffsetX;b.shadowOffsetY=a.shadowOffsetY;b.strokeStyle=a.strokeStyle;b.d=a.d;b.e=a.e}function O(a){var b,c=1;a=String(a);if(a.substring(0,3)=="rgb"){var d=a.indexOf("(",3),e=a.indexOf(")",d+1),g=a.substring(d+1,e).split(",");b="#";for(var h=0;h<3;h++){b+=R[Number(g[h])]}if(g.length==4&&a.substr(3,1)=="a"){c=g[3]}}else{b=a}return[b,c]}function S(a){switch(a){case "butt":return"flat";case "round":return"round";
+case "square":default:return"square"}}function K(a){this.a=J();this.m=[];this.k=[];this.c=[];this.strokeStyle="#000";this.fillStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=m*1;this.globalAlpha=1;this.canvas=a;var b=a.ownerDocument.createElement("div");b.style.width=a.clientWidth+"px";b.style.height=a.clientHeight+"px";b.style.overflow="hidden";b.style.position="absolute";a.appendChild(b);this.j=b;this.d=1;this.e=1}var j=K.prototype;j.clearRect=function(){this.j.innerHTML=
+"";this.c=[]};j.beginPath=function(){this.c=[]};j.moveTo=function(a,b){this.c.push({type:"moveTo",x:a,y:b});this.f=a;this.g=b};j.lineTo=function(a,b){this.c.push({type:"lineTo",x:a,y:b});this.f=a;this.g=b};j.bezierCurveTo=function(a,b,c,d,e,g){this.c.push({type:"bezierCurveTo",cp1x:a,cp1y:b,cp2x:c,cp2y:d,x:e,y:g});this.f=e;this.g=g};j.quadraticCurveTo=function(a,b,c,d){var e=this.f+0.6666666666666666*(a-this.f),g=this.g+0.6666666666666666*(b-this.g),h=e+(c-this.f)/3,l=g+(d-this.g)/3;this.bezierCurveTo(e,
+g,h,l,c,d)};j.arc=function(a,b,c,d,e,g){c*=m;var h=g?"at":"wa",l=a+M(d)*c-A,n=b+L(d)*c-A,o=a+M(e)*c-A,f=b+L(e)*c-A;if(l==o&&!g){l+=0.125}this.c.push({type:h,x:a,y:b,radius:c,xStart:l,yStart:n,xEnd:o,yEnd:f})};j.rect=function(a,b,c,d){this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath()};j.strokeRect=function(a,b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.stroke()};j.fillRect=function(a,
+b,c,d){this.beginPath();this.moveTo(a,b);this.lineTo(a+c,b);this.lineTo(a+c,b+d);this.lineTo(a,b+d);this.closePath();this.fill()};j.createLinearGradient=function(a,b,c,d){var e=new H("gradient");return e};j.createRadialGradient=function(a,b,c,d,e,g){var h=new H("gradientradial");h.n=c;h.o=g;h.i.x=a;h.i.y=b;return h};j.drawImage=function(a,b){var c,d,e,g,h,l,n,o,f=a.runtimeStyle.width,k=a.runtimeStyle.height;a.runtimeStyle.width="auto";a.runtimeStyle.height="auto";var q=a.width,r=a.height;a.runtimeStyle.width=
+f;a.runtimeStyle.height=k;if(arguments.length==3){c=arguments[1];d=arguments[2];h=(l=0);n=(e=q);o=(g=r)}else if(arguments.length==5){c=arguments[1];d=arguments[2];e=arguments[3];g=arguments[4];h=(l=0);n=q;o=r}else if(arguments.length==9){h=arguments[1];l=arguments[2];n=arguments[3];o=arguments[4];c=arguments[5];d=arguments[6];e=arguments[7];g=arguments[8]}else{throw"Invalid number of arguments";}var s=this.b(c,d),t=[],v=10,w=10;t.push(" <g_vml_:group",' coordsize="',m*v,",",m*w,'"',' coordorigin="0,0"',
+' style="width:',v,";height:",w,";position:absolute;");if(this.a[0][0]!=1||this.a[0][1]){var x=[];x.push("M11='",this.a[0][0],"',","M12='",this.a[1][0],"',","M21='",this.a[0][1],"',","M22='",this.a[1][1],"',","Dx='",i(s.x/m),"',","Dy='",i(s.y/m),"'");var p=s,y=this.b(c+e,d),z=this.b(c,d+g),B=this.b(c+e,d+g);p.x=Math.max(p.x,y.x,z.x,B.x);p.y=Math.max(p.y,y.y,z.y,B.y);t.push("padding:0 ",i(p.x/m),"px ",i(p.y/m),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",x.join(""),", sizingmethod='clip');")}else{t.push("top:",
+i(s.y/m),"px;left:",i(s.x/m),"px;")}t.push(' ">','<g_vml_:image src="',a.src,'"',' style="width:',m*e,";"," height:",m*g,';"',' cropleft="',h/q,'"',' croptop="',l/r,'"',' cropright="',(q-h-n)/q,'"',' cropbottom="',(r-l-o)/r,'"'," />","</g_vml_:group>");this.j.insertAdjacentHTML("BeforeEnd",t.join(""))};j.stroke=function(a){var b=[],c=O(a?this.fillStyle:this.strokeStyle),d=c[0],e=c[1]*this.globalAlpha,g=10,h=10;b.push("<g_vml_:shape",' fillcolor="',d,'"',' filled="',Boolean(a),'"',' style="position:absolute;width:',
+g,";height:",h,';"',' coordorigin="0 0" coordsize="',m*g," ",m*h,'"',' stroked="',!a,'"',' strokeweight="',this.lineWidth,'"',' strokecolor="',d,'"',' path="');var l={x:null,y:null},n={x:null,y:null};for(var o=0;o<this.c.length;o++){var f=this.c[o];if(f.type=="moveTo"){b.push(" m ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="lineTo"){b.push(" l ");var k=this.b(f.x,f.y);b.push(i(k.x),",",i(k.y))}else if(f.type=="close"){b.push(" x ")}else if(f.type=="bezierCurveTo"){b.push(" c ");
+var k=this.b(f.x,f.y),q=this.b(f.cp1x,f.cp1y),r=this.b(f.cp2x,f.cp2y);b.push(i(q.x),",",i(q.y),",",i(r.x),",",i(r.y),",",i(k.x),",",i(k.y))}else if(f.type=="at"||f.type=="wa"){b.push(" ",f.type," ");var k=this.b(f.x,f.y),s=this.b(f.xStart,f.yStart),t=this.b(f.xEnd,f.yEnd);b.push(i(k.x-this.d*f.radius),",",i(k.y-this.e*f.radius)," ",i(k.x+this.d*f.radius),",",i(k.y+this.e*f.radius)," ",i(s.x),",",i(s.y)," ",i(t.x),",",i(t.y))}if(k){if(l.x==null||k.x<l.x){l.x=k.x}if(n.x==null||k.x>n.x){n.x=k.x}if(l.y==
+null||k.y<l.y){l.y=k.y}if(n.y==null||k.y>n.y){n.y=k.y}}}b.push(' ">');if(typeof this.fillStyle=="object"){var v={x:"50%",y:"50%"},w=n.x-l.x,x=n.y-l.y,p=w>x?w:x;v.x=i(this.fillStyle.i.x/w*100+50)+"%";v.y=i(this.fillStyle.i.y/x*100+50)+"%";var y=[];if(this.fillStyle.p=="gradientradial"){var z=this.fillStyle.n/p*100,B=this.fillStyle.o/p*100-z}else{var z=0,B=100}var C={offset:null,color:null},D={offset:null,color:null};this.fillStyle.h.sort(function(T,U){return T.offset-U.offset});for(var o=0;o<this.fillStyle.h.length;o++){var u=
+this.fillStyle.h[o];y.push(u.offset*B+z,"% ",u.color,",");if(u.offset>C.offset||C.offset==null){C.offset=u.offset;C.color=u.color}if(u.offset<D.offset||D.offset==null){D.offset=u.offset;D.color=u.color}}y.pop();b.push("<g_vml_:fill",' color="',D.color,'"',' color2="',C.color,'"',' type="',this.fillStyle.p,'"',' focusposition="',v.x,", ",v.y,'"',' colors="',y.join(""),'"',' opacity="',e,'" />')}else if(a){b.push('<g_vml_:fill color="',d,'" opacity="',e,'" />')}else{b.push("<g_vml_:stroke",' opacity="',
+e,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',S(this.lineCap),'"',' weight="',this.lineWidth,'px"',' color="',d,'" />')}b.push("</g_vml_:shape>");this.j.insertAdjacentHTML("beforeEnd",b.join(""));this.c=[]};j.fill=function(){this.stroke(true)};j.closePath=function(){this.c.push({type:"close"})};j.b=function(a,b){return{x:m*(a*this.a[0][0]+b*this.a[1][0]+this.a[2][0])-A,y:m*(a*this.a[0][1]+b*this.a[1][1]+this.a[2][1])-A}};j.save=function(){var a={};N(this,a);
+this.k.push(a);this.m.push(this.a);this.a=G(J(),this.a)};j.restore=function(){N(this.k.pop(),this);this.a=this.m.pop()};j.translate=function(a,b){var c=[[1,0,0],[0,1,0],[a,b,1]];this.a=G(c,this.a)};j.rotate=function(a){var b=M(a),c=L(a),d=[[b,c,0],[-c,b,0],[0,0,1]];this.a=G(d,this.a)};j.scale=function(a,b){this.d*=a;this.e*=b;var c=[[a,0,0],[0,b,0],[0,0,1]];this.a=G(c,this.a)};j.clip=function(){};j.arcTo=function(){};j.createPattern=function(){return new P};function H(a){this.p=a;this.n=0;this.o=
+0;this.h=[];this.i={x:0,y:0}}H.prototype.addColorStop=function(a,b){b=O(b);this.h.push({offset:1-a,color:b})};function P(){}G_vmlCanvasManager=Q;CanvasRenderingContext2D=K;CanvasGradient=H;CanvasPattern=P})()};
diff --git a/mercurial/templates/static/hgicon.png b/mercurial/templates/static/hgicon.png
new file mode 100644
index 0000000..60effbc
--- /dev/null
+++ b/mercurial/templates/static/hgicon.png
Binary files differ
diff --git a/mercurial/templates/static/hglogo.png b/mercurial/templates/static/hglogo.png
new file mode 100644
index 0000000..adc6e65
--- /dev/null
+++ b/mercurial/templates/static/hglogo.png
Binary files differ
diff --git a/mercurial/templates/static/mercurial.js b/mercurial/templates/static/mercurial.js
new file mode 100644
index 0000000..70347d7
--- /dev/null
+++ b/mercurial/templates/static/mercurial.js
@@ -0,0 +1,276 @@
+// mercurial.js - JavaScript utility functions
+//
+// Rendering of branch DAGs on the client side
+// Display of elapsed time
+// Show or hide diffstat
+//
+// Copyright 2008 Dirkjan Ochtman <dirkjan AT ochtman DOT nl>
+// Copyright 2006 Alexander Schremmer <alex AT alexanderweb DOT de>
+//
+// derived from code written by Scott James Remnant <scott@ubuntu.com>
+// Copyright 2005 Canonical Ltd.
+//
+// This software may be used and distributed according to the terms
+// of the GNU General Public License, incorporated herein by reference.
+
+var colors = [
+ [ 1.0, 0.0, 0.0 ],
+ [ 1.0, 1.0, 0.0 ],
+ [ 0.0, 1.0, 0.0 ],
+ [ 0.0, 1.0, 1.0 ],
+ [ 0.0, 0.0, 1.0 ],
+ [ 1.0, 0.0, 1.0 ]
+];
+
+function Graph() {
+
+ this.canvas = document.getElementById('graph');
+ if (navigator.userAgent.indexOf('MSIE') >= 0) this.canvas = window.G_vmlCanvasManager.initElement(this.canvas);
+ this.ctx = this.canvas.getContext('2d');
+ this.ctx.strokeStyle = 'rgb(0, 0, 0)';
+ this.ctx.fillStyle = 'rgb(0, 0, 0)';
+ this.cur = [0, 0];
+ this.line_width = 3;
+ this.bg = [0, 4];
+ this.cell = [2, 0];
+ this.columns = 0;
+ this.revlink = '';
+
+ this.scale = function(height) {
+ this.bg_height = height;
+ this.box_size = Math.floor(this.bg_height / 1.2);
+ this.cell_height = this.box_size;
+ }
+
+ function colorPart(num) {
+ num *= 255
+ num = num < 0 ? 0 : num;
+ num = num > 255 ? 255 : num;
+ var digits = Math.round(num).toString(16);
+ if (num < 16) {
+ return '0' + digits;
+ } else {
+ return digits;
+ }
+ }
+
+ this.setColor = function(color, bg, fg) {
+
+ // Set the colour.
+ //
+ // If color is a string, expect an hexadecimal RGB
+ // value and apply it unchanged. If color is a number,
+ // pick a distinct colour based on an internal wheel;
+ // the bg parameter provides the value that should be
+ // assigned to the 'zero' colours and the fg parameter
+ // provides the multiplier that should be applied to
+ // the foreground colours.
+ var s;
+ if(typeof color == "string") {
+ s = "#" + color;
+ } else { //typeof color == "number"
+ color %= colors.length;
+ var red = (colors[color][0] * fg) || bg;
+ var green = (colors[color][1] * fg) || bg;
+ var blue = (colors[color][2] * fg) || bg;
+ red = Math.round(red * 255);
+ green = Math.round(green * 255);
+ blue = Math.round(blue * 255);
+ s = 'rgb(' + red + ', ' + green + ', ' + blue + ')';
+ }
+ this.ctx.strokeStyle = s;
+ this.ctx.fillStyle = s;
+ return s;
+
+ }
+
+ this.edge = function(x0, y0, x1, y1, color, width) {
+
+ this.setColor(color, 0.0, 0.65);
+ if(width >= 0)
+ this.ctx.lineWidth = width;
+ this.ctx.beginPath();
+ this.ctx.moveTo(x0, y0);
+ this.ctx.lineTo(x1, y1);
+ this.ctx.stroke();
+
+ }
+
+ this.render = function(data) {
+
+ var backgrounds = '';
+ var nodedata = '';
+
+ for (var i in data) {
+
+ var parity = i % 2;
+ this.cell[1] += this.bg_height;
+ this.bg[1] += this.bg_height;
+
+ var cur = data[i];
+ var node = cur[1];
+ var edges = cur[2];
+ var fold = false;
+
+ var prevWidth = this.ctx.lineWidth;
+ for (var j in edges) {
+
+ line = edges[j];
+ start = line[0];
+ end = line[1];
+ color = line[2];
+ var width = line[3];
+ if(width < 0)
+ width = prevWidth;
+ var branchcolor = line[4];
+ if(branchcolor)
+ color = branchcolor;
+
+ if (end > this.columns || start > this.columns) {
+ this.columns += 1;
+ }
+
+ if (start == this.columns && start > end) {
+ var fold = true;
+ }
+
+ x0 = this.cell[0] + this.box_size * start + this.box_size / 2;
+ y0 = this.bg[1] - this.bg_height / 2;
+ x1 = this.cell[0] + this.box_size * end + this.box_size / 2;
+ y1 = this.bg[1] + this.bg_height / 2;
+
+ this.edge(x0, y0, x1, y1, color, width);
+
+ }
+ this.ctx.lineWidth = prevWidth;
+
+ // Draw the revision node in the right column
+
+ column = node[0]
+ color = node[1]
+
+ radius = this.box_size / 8;
+ x = this.cell[0] + this.box_size * column + this.box_size / 2;
+ y = this.bg[1] - this.bg_height / 2;
+ var add = this.vertex(x, y, color, parity, cur);
+ backgrounds += add[0];
+ nodedata += add[1];
+
+ if (fold) this.columns -= 1;
+
+ }
+
+ document.getElementById('nodebgs').innerHTML += backgrounds;
+ document.getElementById('graphnodes').innerHTML += nodedata;
+
+ }
+
+}
+
+
+process_dates = (function(document, RegExp, Math, isNaN, Date, _false, _true){
+
+ // derived from code from mercurial/templatefilter.py
+
+ var scales = {
+ 'year': 365 * 24 * 60 * 60,
+ 'month': 30 * 24 * 60 * 60,
+ 'week': 7 * 24 * 60 * 60,
+ 'day': 24 * 60 * 60,
+ 'hour': 60 * 60,
+ 'minute': 60,
+ 'second': 1
+ };
+
+ function format(count, string){
+ var ret = count + ' ' + string;
+ if (count > 1){
+ ret = ret + 's';
+ }
+ return ret;
+ }
+
+ function shortdate(date){
+ var ret = date.getFullYear() + '-';
+ // getMonth() gives a 0-11 result
+ var month = date.getMonth() + 1;
+ if (month <= 9){
+ ret += '0' + month;
+ } else {
+ ret += month;
+ }
+ ret += '-';
+ var day = date.getDate();
+ if (day <= 9){
+ ret += '0' + day;
+ } else {
+ ret += day;
+ }
+ return ret;
+ }
+
+ function age(datestr){
+ var now = new Date();
+ var once = new Date(datestr);
+ if (isNaN(once.getTime())){
+ // parsing error
+ return datestr;
+ }
+
+ var delta = Math.floor((now.getTime() - once.getTime()) / 1000);
+
+ var future = _false;
+ if (delta < 0){
+ future = _true;
+ delta = -delta;
+ if (delta > (30 * scales.year)){
+ return "in the distant future";
+ }
+ }
+
+ if (delta > (2 * scales.year)){
+ return shortdate(once);
+ }
+
+ for (unit in scales){
+ var s = scales[unit];
+ var n = Math.floor(delta / s);
+ if ((n >= 2) || (s == 1)){
+ if (future){
+ return format(n, unit) + ' from now';
+ } else {
+ return format(n, unit) + ' ago';
+ }
+ }
+ }
+ }
+
+ return function(){
+ var nodes = document.getElementsByTagName('*');
+ var ageclass = new RegExp('\\bage\\b');
+ var dateclass = new RegExp('\\bdate\\b');
+ for (var i=0; i<nodes.length; ++i){
+ var node = nodes[i];
+ var classes = node.className;
+ if (ageclass.test(classes)){
+ var agevalue = age(node.textContent);
+ if (dateclass.test(classes)){
+ // We want both: date + (age)
+ node.textContent += ' ('+agevalue+')';
+ } else {
+ node.textContent = agevalue;
+ }
+ }
+ }
+ }
+})(document, RegExp, Math, isNaN, Date, false, true)
+
+function showDiffstat() {
+ document.getElementById('diffstatdetails').style.display = 'inline';
+ document.getElementById('diffstatexpand').style.display = 'none';
+}
+
+function hideDiffstat() {
+ document.getElementById('diffstatdetails').style.display = 'none';
+ document.getElementById('diffstatexpand').style.display = 'inline';
+}
diff --git a/mercurial/templates/static/style-coal.css b/mercurial/templates/static/style-coal.css
new file mode 100644
index 0000000..1dee828
--- /dev/null
+++ b/mercurial/templates/static/style-coal.css
@@ -0,0 +1,325 @@
+body {
+ margin: 0;
+ padding: 0;
+ background: black url(background.png) repeat-x;
+ font-family: sans-serif;
+}
+
+.container {
+ padding-right: 150px;
+}
+
+.main {
+ position: relative;
+ background: white;
+ padding: 2em;
+ border-right: 15px solid black;
+ border-bottom: 15px solid black;
+}
+
+#.main {
+ width: 98%;
+}
+
+.overflow {
+ width: 100%;
+ overflow: auto;
+}
+
+.menu {
+ background: #999;
+ padding: 10px;
+ width: 75px;
+ margin: 0;
+ font-size: 80%;
+ text-align: left;
+ position: fixed;
+ top: 27px;
+ left: auto;
+ right: 27px;
+}
+
+#.menu {
+ position: absolute !important;
+ top:expression(eval(document.body.scrollTop + 27));
+}
+
+.menu ul {
+ list-style: none;
+ padding: 0;
+ margin: 10px 0 0 0;
+}
+
+.menu li {
+ margin-bottom: 3px;
+ padding: 2px 4px;
+ background: white;
+ color: black;
+ font-weight: normal;
+}
+
+.menu li.active {
+ background: black;
+ color: white;
+}
+
+.menu img {
+ width: 75px;
+ height: 90px;
+ border: 0;
+}
+
+.menu a { color: black; display: block; }
+
+.search {
+ position: absolute;
+ top: .7em;
+ right: 2em;
+}
+
+form.search div#hint {
+ display: none;
+ position: absolute;
+ top: 40px;
+ right: 0px;
+ width: 190px;
+ padding: 5px;
+ background: #ffc;
+ font-size: 70%;
+ border: 1px solid yellow;
+ -moz-border-radius: 5px; /* this works only in camino/firefox */
+ -webkit-border-radius: 5px; /* this is just for Safari */
+}
+
+form.search:hover div#hint { display: block; }
+
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0 { background-color: #f0f0f0; }
+.parity1 { background-color: white; }
+.plusline { color: green; }
+.minusline { color: #dc143c; } /* crimson */
+.atline { color: purple; }
+
+.diffstat-file {
+ white-space: nowrap;
+ font-size: 90%;
+}
+.diffstat-total {
+ white-space: nowrap;
+ font-size: 90%;
+}
+.diffstat-graph {
+ width: 100%;
+}
+.diffstat-add {
+ background-color: green;
+ float: left;
+}
+.diffstat-remove {
+ background-color: red;
+ float: left;
+}
+
+.navigate {
+ text-align: right;
+ font-size: 60%;
+ margin: 1em 0;
+}
+
+.tag {
+ color: #999;
+ font-size: 70%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+.branchhead {
+ color: #000;
+ font-size: 80%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+ul#graphnodes .branchhead {
+ font-size: 75%;
+}
+
+.branchname {
+ color: #000;
+ font-size: 60%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+h3 .branchname {
+ font-size: 80%;
+}
+
+/* Common */
+pre { margin: 0; }
+
+h2 { font-size: 120%; border-bottom: 1px solid #999; }
+h2 a { color: #000; }
+h3 {
+ margin-top: -.7em;
+ font-size: 100%;
+}
+
+/* log and tags tables */
+.bigtable {
+ border-bottom: 1px solid #999;
+ border-collapse: collapse;
+ font-size: 90%;
+ width: 100%;
+ font-weight: normal;
+ text-align: left;
+}
+
+.bigtable td {
+ vertical-align: top;
+}
+
+.bigtable th {
+ padding: 1px 4px;
+ border-bottom: 1px solid #999;
+}
+.bigtable tr { border: none; }
+.bigtable .age { width: 6em; }
+.bigtable .author { width: 12em; }
+.bigtable .description { }
+.bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
+.bigtable .node { width: 5em; font-family: monospace;}
+.bigtable .lineno { width: 2em; text-align: right;}
+.bigtable .lineno a { color: #999; font-size: smaller; font-family: monospace;}
+.bigtable .permissions { width: 8em; text-align: left;}
+.bigtable .size { width: 5em; text-align: right; }
+.bigtable .annotate { text-align: right; }
+.bigtable td.annotate { font-size: smaller; }
+.bigtable td.source { font-size: inherit; }
+
+.source, .sourcefirst, .sourcelast {
+ font-family: monospace;
+ white-space: pre;
+ padding: 1px 4px;
+ font-size: 90%;
+}
+.sourcefirst { border-bottom: 1px solid #999; font-weight: bold; }
+.sourcelast { border-top: 1px solid #999; }
+.source a { color: #999; font-size: smaller; font-family: monospace;}
+.bottomline { border-bottom: 1px solid #999; }
+
+.fileline { font-family: monospace; }
+.fileline img { border: 0; }
+
+.tagEntry .closed { color: #99f; }
+
+/* Changeset entry */
+#changesetEntry {
+ border-collapse: collapse;
+ font-size: 90%;
+ width: 100%;
+ margin-bottom: 1em;
+}
+
+#changesetEntry th {
+ padding: 1px 4px;
+ width: 4em;
+ text-align: right;
+ font-weight: normal;
+ color: #999;
+ margin-right: .5em;
+ vertical-align: top;
+}
+
+div.description {
+ border-left: 3px solid #999;
+ margin: 1em 0 1em 0;
+ padding: .3em;
+ white-space: pre;
+ font-family: monospace;
+}
+
+/* Graph */
+div#wrapper {
+ position: relative;
+ border-top: 1px solid black;
+ border-bottom: 1px solid black;
+ margin: 0;
+ padding: 0;
+}
+
+canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.7em;
+ margin: 0;
+}
+
+ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -1.0em;
+ list-style: none inside none;
+ padding: 0;
+}
+
+ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+}
+
+ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+}
+
+ul#graphnodes li .info {
+ display: block;
+ font-size: 70%;
+ position: relative;
+ top: -3px;
+}
+
+/* Comparison */
+.legend {
+ padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+ border: 1px solid #999;
+ font-size: 80%;
+ text-align: center;
+ padding: 0.5%;
+}
+
+.equal {
+ background-color: #ffffff;
+}
+
+.delete {
+ background-color: #faa;
+ color: #333;
+}
+
+.insert {
+ background-color: #ffa;
+}
+
+.replace {
+ background-color: #e8e8e8;
+}
+
+.header {
+ text-align: center;
+}
+
+.block {
+ border-top: 1px solid #999;
+}
diff --git a/mercurial/templates/static/style-gitweb.css b/mercurial/templates/static/style-gitweb.css
new file mode 100644
index 0000000..c5e9514
--- /dev/null
+++ b/mercurial/templates/static/style-gitweb.css
@@ -0,0 +1,169 @@
+body { font-family: sans-serif; font-size: 12px; margin:0px; border:solid #d9d8d1; border-width:1px; margin:10px; }
+a { color:#0000cc; }
+a:hover, a:visited, a:active { color:#880000; }
+div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
+div.page_header a:visited { color:#0000cc; }
+div.page_header a:hover { color:#880000; }
+div.page_nav { padding:8px; }
+div.page_nav a:visited { color:#0000cc; }
+div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
+div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
+div.page_footer_text { float:left; color:#555555; font-style:italic; }
+div.page_body { padding:8px; }
+div.title, a.title {
+ display:block; padding:6px 8px;
+ font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
+}
+a.title:hover { background-color: #d9d8d1; }
+div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
+div.log_body { padding:8px 8px 8px 150px; }
+.age { white-space:nowrap; }
+span.age { position:relative; float:left; width:142px; font-style:italic; }
+div.log_link {
+ padding:0px 8px;
+ font-size:10px; font-family:sans-serif; font-style:normal;
+ position:relative; float:left; width:136px;
+}
+div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
+a.list { text-decoration:none; color:#000000; }
+a.list:hover { text-decoration:underline; color:#880000; }
+table { padding:8px 4px; }
+th { padding:2px 5px; font-size:12px; text-align:left; }
+tr.light:hover, .parity0:hover { background-color:#edece6; }
+tr.dark, .parity1 { background-color:#f6f6f0; }
+tr.dark:hover, .parity1:hover { background-color:#edece6; }
+td { padding:2px 5px; font-size:12px; vertical-align:top; }
+td.closed { background-color: #99f; }
+td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
+td.indexlinks { white-space: nowrap; }
+td.indexlinks a {
+ padding: 2px 5px; line-height: 10px;
+ border: 1px solid;
+ color: #ffffff; background-color: #7777bb;
+ border-color: #aaaadd #333366 #333366 #aaaadd;
+ font-weight: bold; text-align: center; text-decoration: none;
+ font-size: 10px;
+}
+td.indexlinks a:hover { background-color: #6666aa; }
+div.pre { font-family:monospace; font-size:12px; white-space:pre; }
+div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
+div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
+div.search { margin:4px 8px; position:absolute; top:56px; right:12px }
+.linenr { color:#999999; text-decoration:none }
+div.rss_logo { float: right; white-space: nowrap; }
+div.rss_logo a {
+ padding:3px 6px; line-height:10px;
+ border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
+ color:#ffffff; background-color:#ff6600;
+ font-weight:bold; font-family:sans-serif; font-size:10px;
+ text-align:center; text-decoration:none;
+}
+div.rss_logo a:hover { background-color:#ee5500; }
+pre { margin: 0; }
+span.logtags span {
+ padding: 0px 4px;
+ font-size: 10px;
+ font-weight: normal;
+ border: 1px solid;
+ background-color: #ffaaff;
+ border-color: #ffccff #ff00ee #ff00ee #ffccff;
+}
+span.logtags span.tagtag {
+ background-color: #ffffaa;
+ border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
+}
+span.logtags span.branchtag {
+ background-color: #aaffaa;
+ border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+span.logtags span.inbranchtag {
+ background-color: #d5dde6;
+ border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
+}
+span.logtags span.bookmarktag {
+ background-color: #afdffa;
+ border-color: #ccecff #46ace6 #46ace6 #ccecff;
+}
+
+/* Graph */
+div#wrapper {
+ position: relative;
+ margin: 0;
+ padding: 0;
+ margin-top: 3px;
+}
+
+canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.9em;
+ margin: 0;
+}
+
+ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+}
+
+ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+}
+
+ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -0.8em;
+ list-style: none inside none;
+ padding: 0;
+}
+
+ul#graphnodes li .info {
+ display: block;
+ font-size: 100%;
+ position: relative;
+ top: -3px;
+ font-style: italic;
+}
+
+/* Comparison */
+.legend {
+ padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+ border: 1px solid #d9d8d1;
+ font-size: 80%;
+ text-align: center;
+ padding: 0.5%;
+}
+
+.equal {
+ background-color: #ffffff;
+}
+
+.delete {
+ background-color: #faa;
+ color: #333;
+}
+
+.insert {
+ background-color: #ffa;
+}
+
+.replace {
+ background-color: #e8e8e8;
+}
+
+.comparison {
+ overflow-x: auto;
+}
+
+.header th {
+ text-align: center;
+}
+
+.block {
+ border-top: 1px solid #d9d8d1;
+}
diff --git a/mercurial/templates/static/style-monoblue.css b/mercurial/templates/static/style-monoblue.css
new file mode 100644
index 0000000..b4e3579
--- /dev/null
+++ b/mercurial/templates/static/style-monoblue.css
@@ -0,0 +1,526 @@
+/*** Initial Settings ***/
+* {
+ margin: 0;
+ padding: 0;
+ font-weight: normal;
+ font-style: normal;
+}
+
+html {
+ font-size: 100%;
+ font-family: sans-serif;
+}
+
+body {
+ font-size: 77%;
+ margin: 15px 50px;
+ background: #4B4B4C;
+}
+
+a {
+ color:#0000cc;
+ text-decoration: none;
+}
+/*** end of Initial Settings ***/
+
+
+/** common settings **/
+div#container {
+ background: #FFFFFF;
+ position: relative;
+ color: #666;
+}
+
+div.page-header {
+ padding: 50px 20px 0;
+ background: #006699 top left repeat-x;
+ position: relative;
+}
+ div.page-header h1 {
+ margin: 10px 0 30px;
+ font-size: 1.8em;
+ font-weight: bold;
+ font-family: osaka,'MS P Gothic', Georgia, serif;
+ letter-spacing: 1px;
+ color: #DDD;
+ }
+ div.page-header h1 a {
+ font-weight: bold;
+ color: #FFF;
+ }
+ div.page-header a {
+ text-decoration: none;
+ }
+
+ div.page-header form {
+ position: absolute;
+ margin-bottom: 2px;
+ bottom: 0;
+ right: 20px;
+ }
+ div.page-header form label {
+ color: #DDD;
+ }
+ div.page-header form input {
+ padding: 2px;
+ border: solid 1px #DDD;
+ }
+ div.page-header form dl {
+ overflow: hidden;
+ }
+ div.page-header form dl dt {
+ font-size: 1.2em;
+ }
+ div.page-header form dl dt,
+ div.page-header form dl dd {
+ margin: 0 0 0 5px;
+ float: left;
+ height: 24px;
+ line-height: 20px;
+ }
+
+ ul.page-nav {
+ margin: 10px 0 0 0;
+ list-style-type: none;
+ overflow: hidden;
+ width: 900px;
+ }
+ ul.page-nav li {
+ margin: 0 2px 0 0;
+ float: left;
+ width: 80px;
+ height: 24px;
+ font-size: 1.1em;
+ line-height: 24px;
+ text-align: center;
+ }
+ ul.page-nav li.current {
+ background: #FFF;
+ }
+ ul.page-nav li a {
+ height: 24px;
+ color: #666;
+ background: #DDD;
+ display: block;
+ text-decoration: none;
+ }
+ ul.page-nav li a:hover {
+ color:#333;
+ background: #FFF;
+ }
+
+ul.submenu {
+ margin: 10px 0 -10px 20px;
+ list-style-type: none;
+}
+ul.submenu li {
+ margin: 0 10px 0 0;
+ font-size: 1.2em;
+ display: inline;
+}
+
+h2 {
+ margin: 20px 0 10px;
+ height: 30px;
+ line-height: 30px;
+ text-indent: 20px;
+ background: #FFF;
+ font-size: 1.2em;
+ border-top: dotted 1px #D5E1E6;
+ font-weight: bold;
+}
+h2.no-link {
+ color:#006699;
+}
+h2.no-border {
+ color: #FFF;
+ background: #006699;
+ border: 0;
+}
+h2 a {
+ font-weight:bold;
+ color:#006699;
+}
+
+div.page-path {
+ text-align: right;
+ padding: 20px 30px 10px 0;
+ border:solid #d9d8d1;
+ border-width:0px 0px 1px;
+ font-size: 1.2em;
+}
+
+div.page-footer {
+ margin: 50px 0 0;
+ position: relative;
+}
+ div.page-footer p {
+ position: relative;
+ left: 20px;
+ bottom: 5px;
+ font-size: 1.2em;
+ }
+
+ ul.rss-logo {
+ position: absolute;
+ top: -10px;
+ right: 20px;
+ height: 20px;
+ list-style-type: none;
+ }
+ ul.rss-logo li {
+ display: inline;
+ }
+ ul.rss-logo li a {
+ padding: 3px 6px;
+ line-height: 10px;
+ border:1px solid;
+ border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
+ color:#ffffff;
+ background-color:#ff6600;
+ font-weight:bold;
+ font-family:sans-serif;
+ font-size:10px;
+ text-align:center;
+ text-decoration:none;
+ }
+ div.rss-logo li a:hover {
+ background-color:#ee5500;
+ }
+
+p.normal {
+ margin: 20px 0 20px 30px;
+ font-size: 1.2em;
+}
+
+table {
+ margin: 10px 0 0 20px;
+ width: 95%;
+ border-collapse: collapse;
+}
+table tr td {
+ font-size: 1.1em;
+}
+table tr td.nowrap {
+ white-space: nowrap;
+}
+table tr td.closed {
+ background-color: #99f;
+}
+/*
+table tr.parity0:hover,
+table tr.parity1:hover {
+ background: #D5E1E6;
+}
+*/
+table tr.parity0 {
+ background: #F1F6F7;
+}
+table tr.parity1 {
+ background: #FFFFFF;
+}
+table tr td {
+ padding: 5px 5px;
+}
+table.annotated tr td {
+ padding: 0px 5px;
+}
+
+span.logtags span {
+ padding: 2px 6px;
+ font-weight: normal;
+ font-size: 11px;
+ border: 1px solid;
+ background-color: #ffaaff;
+ border-color: #ffccff #ff00ee #ff00ee #ffccff;
+}
+span.logtags span.tagtag {
+ background-color: #ffffaa;
+ border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
+}
+span.logtags span.branchtag {
+ background-color: #aaffaa;
+ border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+span.logtags span.inbranchtag {
+ background-color: #d5dde6;
+ border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
+}
+span.logtags span.bookmarktag {
+ background-color: #afdffa;
+ border-color: #ccecff #46ace6 #46ace6 #ccecff;
+}
+
+div.diff pre {
+ margin: 10px 0 0 0;
+}
+div.diff pre span {
+ font-family: monospace;
+ white-space: pre;
+ font-size: 1.2em;
+ padding: 3px 0;
+}
+td.source {
+ white-space: pre;
+ font-family: monospace;
+ margin: 10px 30px 0;
+ font-size: 1.2em;
+ font-family: monospace;
+}
+ div.source div.parity0,
+ div.source div.parity1 {
+ padding: 1px;
+ font-size: 1.2em;
+ }
+ div.source div.parity0 {
+ background: #F1F6F7;
+ }
+ div.source div.parity1 {
+ background: #FFFFFF;
+ }
+div.parity0:hover,
+div.parity1:hover {
+ background: #D5E1E6;
+}
+.linenr {
+ color: #999;
+ text-align: right;
+}
+.lineno {
+ text-align: right;
+}
+.lineno a {
+ color: #999;
+}
+td.linenr {
+ width: 60px;
+}
+
+div#powered-by {
+ position: absolute;
+ width: 75px;
+ top: 15px;
+ right: 20px;
+ font-size: 1.2em;
+}
+div#powered-by a {
+ color: #EEE;
+ text-decoration: none;
+}
+div#powered-by a:hover {
+ text-decoration: underline;
+}
+/*
+div#monoblue-corner-top-left {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 10px;
+ height: 10px;
+ background: url(./monoblue-corner.png) top left no-repeat !important;
+ background: none;
+}
+div#monoblue-corner-top-right {
+ position: absolute;
+ top: 0;
+ right: 0;
+ width: 10px;
+ height: 10px;
+ background: url(./monoblue-corner.png) top right no-repeat !important;
+ background: none;
+}
+div#monoblue-corner-bottom-left {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 10px;
+ height: 10px;
+ background: url(./monoblue-corner.png) bottom left no-repeat !important;
+ background: none;
+}
+div#monoblue-corner-bottom-right {
+ position: absolute;
+ bottom: 0;
+ right: 0;
+ width: 10px;
+ height: 10px;
+ background: url(./monoblue-corner.png) bottom right no-repeat !important;
+ background: none;
+}
+*/
+/** end of common settings **/
+
+/** summary **/
+dl.overview {
+ margin: 0 0 0 30px;
+ font-size: 1.1em;
+ overflow: hidden;
+}
+ dl.overview dt,
+ dl.overview dd {
+ margin: 5px 0;
+ float: left;
+ }
+ dl.overview dt {
+ clear: left;
+ font-weight: bold;
+ width: 150px;
+ }
+/** end of summary **/
+
+/** chagelog **/
+h3.changelog {
+ margin: 20px 0 5px 30px;
+ padding: 0 0 2px;
+ font-size: 1.4em;
+ border-bottom: dotted 1px #D5E1E6;
+}
+ul.changelog-entry {
+ margin: 0 0 10px 30px;
+ list-style-type: none;
+ position: relative;
+}
+ul.changelog-entry li span.revdate {
+ font-size: 1.1em;
+}
+ul.changelog-entry li.age {
+ position: absolute;
+ top: -25px;
+ right: 10px;
+ font-size: 1.4em;
+ color: #CCC;
+ font-weight: bold;
+ font-style: italic;
+}
+ul.changelog-entry li span.name {
+ font-size: 1.2em;
+ font-weight: bold;
+}
+ul.changelog-entry li.description {
+ margin: 10px 0 0;
+ font-size: 1.1em;
+}
+/** end of changelog **/
+
+/** file **/
+p.files {
+ margin: 0 0 0 20px;
+ font-size: 2.0em;
+ font-weight: bold;
+}
+/** end of file **/
+
+/** changeset **/
+h3.changeset {
+ margin: 20px 0 5px 20px;
+ padding: 0 0 2px;
+ font-size: 1.6em;
+ border-bottom: dotted 1px #D5E1E6;
+}
+p.changeset-age {
+ position: relative;
+}
+p.changeset-age span {
+ position: absolute;
+ top: -25px;
+ right: 10px;
+ font-size: 1.4em;
+ color: #CCC;
+ font-weight: bold;
+ font-style: italic;
+}
+p.description {
+ margin: 10px 30px 0 30px;
+ padding: 10px;
+ border: solid 1px #CCC;
+ font-size: 1.2em;
+}
+/** end of changeset **/
+
+/** canvas **/
+div#wrapper {
+ position: relative;
+ font-size: 1.2em;
+}
+
+canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.7em;
+}
+
+ul#nodebgs li.parity0 {
+ background: #F1F6F7;
+}
+
+ul#nodebgs li.parity1 {
+ background: #FFFFFF;
+}
+
+ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: 7px;
+ list-style: none inside none;
+}
+
+ul#nodebgs {
+ list-style: none inside none;
+}
+
+ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+}
+
+ul#graphnodes li .info {
+ display: block;
+ position: relative;
+}
+/** end of canvas **/
+
+/** comparison **/
+.legend {
+ margin-left: 20px;
+ padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+ border: 1px solid #999;
+ font-size: 80%;
+ text-align: center;
+ padding: 0.5%;
+}
+
+.equal {
+ background-color: #ffffff;
+}
+
+.delete {
+ background-color: #faa;
+ color: #333;
+}
+
+.insert {
+ background-color: #ffa;
+}
+
+.replace {
+ background-color: #e8e8e8;
+}
+
+.comparison {
+ overflow-x: auto;
+}
+
+.comparison table td {
+ padding: 0px 5px;
+}
+
+.header th {
+ font-weight: bold;
+}
+
+.block {
+ border-top: 1px solid #999;
+}
+/** end of comparison **/
diff --git a/mercurial/templates/static/style-paper.css b/mercurial/templates/static/style-paper.css
new file mode 100644
index 0000000..e881c1c
--- /dev/null
+++ b/mercurial/templates/static/style-paper.css
@@ -0,0 +1,314 @@
+body {
+ margin: 0;
+ padding: 0;
+ background: white;
+ font-family: sans-serif;
+}
+
+.container {
+ padding-left: 115px;
+}
+
+.main {
+ position: relative;
+ background: white;
+ padding: 2em 2em 2em 0;
+}
+
+#.main {
+ width: 98%;
+}
+
+.overflow {
+ width: 100%;
+ overflow: auto;
+}
+
+.menu {
+ width: 90px;
+ margin: 0;
+ font-size: 80%;
+ text-align: left;
+ position: absolute;
+ top: 20px;
+ left: 20px;
+ right: auto;
+}
+
+.menu ul {
+ list-style: none;
+ padding: 0;
+ margin: 10px 0 0 0;
+ border-left: 2px solid #999;
+}
+
+.menu li {
+ margin-bottom: 3px;
+ padding: 2px 4px;
+ background: white;
+ color: black;
+ font-weight: normal;
+}
+
+.menu li.active {
+ font-weight: bold;
+}
+
+.menu img {
+ width: 75px;
+ height: 90px;
+ border: 0;
+}
+
+.menu a { color: black; display: block; }
+
+.search {
+ position: absolute;
+ top: .7em;
+ right: 2em;
+}
+
+form.search div#hint {
+ display: none;
+ position: absolute;
+ top: 40px;
+ right: 0px;
+ width: 190px;
+ padding: 5px;
+ background: #ffc;
+ font-size: 70%;
+ border: 1px solid yellow;
+ -moz-border-radius: 5px; /* this works only in camino/firefox */
+ -webkit-border-radius: 5px; /* this is just for Safari */
+}
+
+form.search:hover div#hint { display: block; }
+
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0 { background-color: #f0f0f0; }
+.parity1 { background-color: white; }
+.plusline { color: green; }
+.minusline { color: #dc143c; } /* crimson */
+.atline { color: purple; }
+
+.diffstat-file {
+ white-space: nowrap;
+ font-size: 90%;
+}
+.diffstat-total {
+ white-space: nowrap;
+ font-size: 90%;
+}
+.diffstat-graph {
+ width: 100%;
+}
+.diffstat-add {
+ background-color: green;
+ float: left;
+}
+.diffstat-remove {
+ background-color: red;
+ float: left;
+}
+
+.navigate {
+ text-align: right;
+ font-size: 60%;
+ margin: 1em 0;
+}
+
+.tag {
+ color: #999;
+ font-size: 70%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+.branchhead {
+ color: #000;
+ font-size: 80%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+ul#graphnodes .branchhead {
+ font-size: 75%;
+}
+
+.branchname {
+ color: #000;
+ font-size: 60%;
+ font-weight: normal;
+ margin-left: .5em;
+ vertical-align: baseline;
+}
+
+h3 .branchname {
+ font-size: 80%;
+}
+
+/* Common */
+pre { margin: 0; }
+
+h2 { font-size: 120%; border-bottom: 1px solid #999; }
+h2 a { color: #000; }
+h3 {
+ margin-top: -.7em;
+ font-size: 100%;
+}
+
+/* log and tags tables */
+.bigtable {
+ border-bottom: 1px solid #999;
+ border-collapse: collapse;
+ font-size: 90%;
+ width: 100%;
+ font-weight: normal;
+ text-align: left;
+}
+
+.bigtable td {
+ vertical-align: top;
+}
+
+.bigtable th {
+ padding: 1px 4px;
+ border-bottom: 1px solid #999;
+}
+.bigtable tr { border: none; }
+.bigtable .age { width: 7em; }
+.bigtable .author { width: 12em; }
+.bigtable .description { }
+.bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
+.bigtable .node { width: 5em; font-family: monospace;}
+.bigtable .permissions { width: 8em; text-align: left;}
+.bigtable .size { width: 5em; text-align: right; }
+.bigtable .annotate { text-align: right; }
+.bigtable td.annotate { font-size: smaller; }
+.bigtable td.source { font-size: inherit; }
+
+.source, .sourcefirst, .sourcelast {
+ font-family: monospace;
+ white-space: pre;
+ padding: 1px 4px;
+ font-size: 90%;
+}
+.sourcefirst { border-bottom: 1px solid #999; font-weight: bold; }
+.sourcelast { border-top: 1px solid #999; }
+.source a { color: #999; font-size: smaller; font-family: monospace;}
+.bottomline { border-bottom: 1px solid #999; }
+
+.fileline { font-family: monospace; }
+.fileline img { border: 0; }
+
+.tagEntry .closed { color: #99f; }
+
+/* Changeset entry */
+#changesetEntry {
+ border-collapse: collapse;
+ font-size: 90%;
+ width: 100%;
+ margin-bottom: 1em;
+}
+
+#changesetEntry th {
+ padding: 1px 4px;
+ width: 4em;
+ text-align: right;
+ font-weight: normal;
+ color: #999;
+ margin-right: .5em;
+ vertical-align: top;
+}
+
+div.description {
+ border-left: 2px solid #999;
+ margin: 1em 0 1em 0;
+ padding: .3em;
+ white-space: pre;
+ font-family: monospace;
+}
+
+/* Graph */
+div#wrapper {
+ position: relative;
+ border-top: 1px solid black;
+ border-bottom: 1px solid black;
+ margin: 0;
+ padding: 0;
+}
+
+canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.7em;
+ margin: 0;
+}
+
+ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -1.0em;
+ list-style: none inside none;
+ padding: 0;
+}
+
+ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+}
+
+ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+}
+
+ul#graphnodes li .info {
+ display: block;
+ font-size: 70%;
+ position: relative;
+ top: -3px;
+}
+
+/* Comparison */
+.legend {
+ padding: 1.5% 0 1.5% 0;
+}
+
+.legendinfo {
+ border: 1px solid #999;
+ font-size: 80%;
+ text-align: center;
+ padding: 0.5%;
+}
+
+.equal {
+ background-color: #ffffff;
+}
+
+.delete {
+ background-color: #faa;
+ color: #333;
+}
+
+.insert {
+ background-color: #ffa;
+}
+
+.replace {
+ background-color: #e8e8e8;
+}
+
+.header {
+ text-align: center;
+}
+
+.block {
+ border-top: 1px solid #999;
+}
diff --git a/mercurial/templates/static/style.css b/mercurial/templates/static/style.css
new file mode 100644
index 0000000..66bd96d
--- /dev/null
+++ b/mercurial/templates/static/style.css
@@ -0,0 +1,105 @@
+a { text-decoration:none; }
+.age { white-space:nowrap; }
+.date { white-space:nowrap; }
+.indexlinks { white-space:nowrap; }
+.parity0 { background-color: #ddd; }
+.parity1 { background-color: #eee; }
+.lineno { width: 60px; color: #aaa; font-size: smaller;
+ text-align: right; }
+.plusline { color: green; }
+.minusline { color: red; }
+.atline { color: purple; }
+.annotate { font-size: smaller; text-align: right; padding-right: 1em; }
+.buttons a {
+ background-color: #666;
+ padding: 2pt;
+ color: white;
+ font-family: sans;
+ font-weight: bold;
+}
+.navigate a {
+ background-color: #ccc;
+ padding: 2pt;
+ font-family: sans;
+ color: black;
+}
+
+.metatag {
+ background-color: #888;
+ color: white;
+ text-align: right;
+}
+
+/* Common */
+pre { margin: 0; }
+
+.logo {
+ float: right;
+ clear: right;
+}
+
+/* Changelog/Filelog entries */
+.logEntry { width: 100%; }
+.logEntry .age { width: 15%; }
+.logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
+.logEntry th.age, .logEntry th.firstline { font-weight: bold; }
+.logEntry th.firstline { text-align: left; width: inherit; }
+
+/* Shortlog entries */
+.slogEntry { width: 100%; }
+.slogEntry .age { width: 8em; }
+.slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
+.slogEntry td.author { width: 15em; }
+
+/* Tag entries */
+#tagEntries { list-style: none; margin: 0; padding: 0; }
+#tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
+
+/* Changeset entry */
+#changesetEntry { }
+#changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+#changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
+
+/* File diff view */
+#filediffEntry { }
+#filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+
+/* Graph */
+div#wrapper {
+ position: relative;
+ margin: 0;
+ padding: 0;
+}
+
+canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.6em;
+ margin: 0;
+}
+
+ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+}
+
+ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+}
+
+ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -0.85em;
+ list-style: none inside none;
+ padding: 0;
+}
+
+ul#graphnodes li .info {
+ display: block;
+ font-size: 70%;
+ position: relative;
+ top: -1px;
+}
diff --git a/mercurial/templates/template-vars.txt b/mercurial/templates/template-vars.txt
new file mode 100644
index 0000000..772284d
--- /dev/null
+++ b/mercurial/templates/template-vars.txt
@@ -0,0 +1,42 @@
+repo the name of the repo
+rev a changeset.manifest revision
+node a changeset node
+changesets total number of changesets
+file a filename
+filerev a file revision
+filerevs total number of file revisions
+up the directory of the relevant file
+path a path in the manifest, starting with "/"
+basename a short pathname
+date a date string
+age age in hours, days, etc
+line a line of text (escaped)
+desc a description (escaped, with breaks)
+shortdesc a short description (escaped)
+author a name or email addressv(obfuscated)
+parent a list of the parent
+child a list of the children
+tags a list of tag
+
+header the global page header
+footer the global page footer
+
+files a list of file links
+file_copies a list of pairs of name, source filenames
+dirs a set of directory links
+diff a diff of one or more files
+annotate an annotated file
+entries the entries relevant to the page
+
+url base url of hgweb interface
+logourl base url of logo
+staticurl base url for static resources
+
+
+Templates and commands:
+ changelog(rev) - a page for browsing changesets
+ naventry - a link for jumping to a changeset number
+ filenodelink - jump to file diff
+ fileellipses - printed after maxfiles
+ changelogentry - an entry in the log
+ manifest - browse a manifest as a directory tree
diff --git a/mercurial/transaction.py b/mercurial/transaction.py
new file mode 100644
index 0000000..a7e9180
--- /dev/null
+++ b/mercurial/transaction.py
@@ -0,0 +1,183 @@
+# transaction.py - simple journalling scheme for mercurial
+#
+# This transaction scheme is intended to gracefully handle program
+# errors and interruptions. More serious failures like system crashes
+# can be recovered with an fsck-like tool. As the whole repository is
+# effectively log-structured, this should amount to simply truncating
+# anything that isn't referenced in the changelog.
+#
+# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import os, errno
+import error, util
+
+def active(func):
+ def _active(self, *args, **kwds):
+ if self.count == 0:
+ raise error.Abort(_(
+ 'cannot use transaction when it is already committed/aborted'))
+ return func(self, *args, **kwds)
+ return _active
+
+def _playback(journal, report, opener, entries, unlink=True):
+ for f, o, ignore in entries:
+ if o or not unlink:
+ try:
+ fp = opener(f, 'a')
+ fp.truncate(o)
+ fp.close()
+ except IOError:
+ report(_("failed to truncate %s\n") % f)
+ raise
+ else:
+ try:
+ fp = opener(f)
+ fn = fp.name
+ fp.close()
+ util.unlink(fn)
+ except (IOError, OSError), inst:
+ if inst.errno != errno.ENOENT:
+ raise
+ util.unlink(journal)
+
+class transaction(object):
+ def __init__(self, report, opener, journal, after=None, createmode=None):
+ self.count = 1
+ self.usages = 1
+ self.report = report
+ self.opener = opener
+ self.after = after
+ self.entries = []
+ self.map = {}
+ self.journal = journal
+ self._queue = []
+
+ self.file = util.posixfile(self.journal, "w")
+ if createmode is not None:
+ os.chmod(self.journal, createmode & 0666)
+
+ def __del__(self):
+ if self.journal:
+ self._abort()
+
+ @active
+ def startgroup(self):
+ self._queue.append([])
+
+ @active
+ def endgroup(self):
+ q = self._queue.pop()
+ d = ''.join(['%s\0%d\n' % (x[0], x[1]) for x in q])
+ self.entries.extend(q)
+ self.file.write(d)
+ self.file.flush()
+
+ @active
+ def add(self, file, offset, data=None):
+ if file in self.map:
+ return
+ if self._queue:
+ self._queue[-1].append((file, offset, data))
+ return
+
+ self.entries.append((file, offset, data))
+ self.map[file] = len(self.entries) - 1
+ # add enough data to the journal to do the truncate
+ self.file.write("%s\0%d\n" % (file, offset))
+ self.file.flush()
+
+ @active
+ def find(self, file):
+ if file in self.map:
+ return self.entries[self.map[file]]
+ return None
+
+ @active
+ def replace(self, file, offset, data=None):
+ '''
+ replace can only replace already committed entries
+ that are not pending in the queue
+ '''
+
+ if file not in self.map:
+ raise KeyError(file)
+ index = self.map[file]
+ self.entries[index] = (file, offset, data)
+ self.file.write("%s\0%d\n" % (file, offset))
+ self.file.flush()
+
+ @active
+ def nest(self):
+ self.count += 1
+ self.usages += 1
+ return self
+
+ def release(self):
+ if self.count > 0:
+ self.usages -= 1
+ # if the transaction scopes are left without being closed, fail
+ if self.count > 0 and self.usages == 0:
+ self._abort()
+
+ def running(self):
+ return self.count > 0
+
+ @active
+ def close(self):
+ '''commit the transaction'''
+ self.count -= 1
+ if self.count != 0:
+ return
+ self.file.close()
+ self.entries = []
+ if self.after:
+ self.after()
+ if os.path.isfile(self.journal):
+ util.unlink(self.journal)
+ self.journal = None
+
+ @active
+ def abort(self):
+ '''abort the transaction (generally called on error, or when the
+ transaction is not explicitly committed before going out of
+ scope)'''
+ self._abort()
+
+ def _abort(self):
+ self.count = 0
+ self.usages = 0
+ self.file.close()
+
+ try:
+ if not self.entries:
+ if self.journal:
+ util.unlink(self.journal)
+ return
+
+ self.report(_("transaction abort!\n"))
+
+ try:
+ _playback(self.journal, self.report, self.opener,
+ self.entries, False)
+ self.report(_("rollback completed\n"))
+ except Exception:
+ self.report(_("rollback failed - please run hg recover\n"))
+ finally:
+ self.journal = None
+
+
+def rollback(opener, file, report):
+ entries = []
+
+ fp = util.posixfile(file)
+ lines = fp.readlines()
+ fp.close()
+ for l in lines:
+ f, o = l.split('\0')
+ entries.append((f, int(o), None))
+
+ _playback(file, report, opener, entries)
diff --git a/mercurial/treediscovery.py b/mercurial/treediscovery.py
new file mode 100644
index 0000000..09a4afb
--- /dev/null
+++ b/mercurial/treediscovery.py
@@ -0,0 +1,150 @@
+# discovery.py - protocol changeset discovery functions
+#
+# Copyright 2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid, short
+from i18n import _
+import util, error
+
+def findcommonincoming(repo, remote, heads=None, force=False):
+ """Return a tuple (common, fetch, heads) used to identify the common
+ subset of nodes between repo and remote.
+
+ "common" is a list of (at least) the heads of the common subset.
+ "fetch" is a list of roots of the nodes that would be incoming, to be
+ supplied to changegroupsubset.
+ "heads" is either the supplied heads, or else the remote's heads.
+ """
+
+ m = repo.changelog.nodemap
+ search = []
+ fetch = set()
+ seen = set()
+ seenbranch = set()
+ base = set()
+
+ if not heads:
+ heads = remote.heads()
+
+ if repo.changelog.tip() == nullid:
+ base.add(nullid)
+ if heads != [nullid]:
+ return [nullid], [nullid], list(heads)
+ return [nullid], [], heads
+
+ # assume we're closer to the tip than the root
+ # and start by examining the heads
+ repo.ui.status(_("searching for changes\n"))
+
+ unknown = []
+ for h in heads:
+ if h not in m:
+ unknown.append(h)
+ else:
+ base.add(h)
+
+ if not unknown:
+ return list(base), [], list(heads)
+
+ req = set(unknown)
+ reqcnt = 0
+
+ # search through remote branches
+ # a 'branch' here is a linear segment of history, with four parts:
+ # head, root, first parent, second parent
+ # (a branch always has two parents (or none) by definition)
+ unknown = util.deque(remote.branches(unknown))
+ while unknown:
+ r = []
+ while unknown:
+ n = unknown.popleft()
+ if n[0] in seen:
+ continue
+
+ repo.ui.debug("examining %s:%s\n"
+ % (short(n[0]), short(n[1])))
+ if n[0] == nullid: # found the end of the branch
+ pass
+ elif n in seenbranch:
+ repo.ui.debug("branch already found\n")
+ continue
+ elif n[1] and n[1] in m: # do we know the base?
+ repo.ui.debug("found incomplete branch %s:%s\n"
+ % (short(n[0]), short(n[1])))
+ search.append(n[0:2]) # schedule branch range for scanning
+ seenbranch.add(n)
+ else:
+ if n[1] not in seen and n[1] not in fetch:
+ if n[2] in m and n[3] in m:
+ repo.ui.debug("found new changeset %s\n" %
+ short(n[1]))
+ fetch.add(n[1]) # earliest unknown
+ for p in n[2:4]:
+ if p in m:
+ base.add(p) # latest known
+
+ for p in n[2:4]:
+ if p not in req and p not in m:
+ r.append(p)
+ req.add(p)
+ seen.add(n[0])
+
+ if r:
+ reqcnt += 1
+ repo.ui.progress(_('searching'), reqcnt, unit=_('queries'))
+ repo.ui.debug("request %d: %s\n" %
+ (reqcnt, " ".join(map(short, r))))
+ for p in xrange(0, len(r), 10):
+ for b in remote.branches(r[p:p + 10]):
+ repo.ui.debug("received %s:%s\n" %
+ (short(b[0]), short(b[1])))
+ unknown.append(b)
+
+ # do binary search on the branches we found
+ while search:
+ newsearch = []
+ reqcnt += 1
+ repo.ui.progress(_('searching'), reqcnt, unit=_('queries'))
+ for n, l in zip(search, remote.between(search)):
+ l.append(n[1])
+ p = n[0]
+ f = 1
+ for i in l:
+ repo.ui.debug("narrowing %d:%d %s\n" % (f, len(l), short(i)))
+ if i in m:
+ if f <= 2:
+ repo.ui.debug("found new branch changeset %s\n" %
+ short(p))
+ fetch.add(p)
+ base.add(i)
+ else:
+ repo.ui.debug("narrowed branch search to %s:%s\n"
+ % (short(p), short(i)))
+ newsearch.append((p, i))
+ break
+ p, f = i, f * 2
+ search = newsearch
+
+ # sanity check our fetch list
+ for f in fetch:
+ if f in m:
+ raise error.RepoError(_("already have changeset ")
+ + short(f[:4]))
+
+ base = list(base)
+ if base == [nullid]:
+ if force:
+ repo.ui.warn(_("warning: repository is unrelated\n"))
+ else:
+ raise util.Abort(_("repository is unrelated"))
+
+ repo.ui.debug("found new changesets starting at " +
+ " ".join([short(f) for f in fetch]) + "\n")
+
+ repo.ui.progress(_('searching'), None)
+ repo.ui.debug("%d total queries\n" % reqcnt)
+
+ return base, list(fetch), heads
diff --git a/mercurial/ui.py b/mercurial/ui.py
new file mode 100644
index 0000000..5d80df4
--- /dev/null
+++ b/mercurial/ui.py
@@ -0,0 +1,761 @@
+# ui.py - user interface bits for mercurial
+#
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import errno, getpass, os, socket, sys, tempfile, traceback
+import config, scmutil, util, error, formatter
+
+class ui(object):
+ def __init__(self, src=None):
+ self._buffers = []
+ self.quiet = self.verbose = self.debugflag = self.tracebackflag = False
+ self._reportuntrusted = True
+ self._ocfg = config.config() # overlay
+ self._tcfg = config.config() # trusted
+ self._ucfg = config.config() # untrusted
+ self._trustusers = set()
+ self._trustgroups = set()
+ self.callhooks = True
+
+ if src:
+ self.fout = src.fout
+ self.ferr = src.ferr
+ self.fin = src.fin
+
+ self._tcfg = src._tcfg.copy()
+ self._ucfg = src._ucfg.copy()
+ self._ocfg = src._ocfg.copy()
+ self._trustusers = src._trustusers.copy()
+ self._trustgroups = src._trustgroups.copy()
+ self.environ = src.environ
+ self.callhooks = src.callhooks
+ self.fixconfig()
+ else:
+ self.fout = sys.stdout
+ self.ferr = sys.stderr
+ self.fin = sys.stdin
+
+ # shared read-only environment
+ self.environ = os.environ
+ # we always trust global config files
+ for f in scmutil.rcpath():
+ self.readconfig(f, trust=True)
+
+ def copy(self):
+ return self.__class__(self)
+
+ def formatter(self, topic, opts):
+ return formatter.formatter(self, topic, opts)
+
+ def _trusted(self, fp, f):
+ st = util.fstat(fp)
+ if util.isowner(st):
+ return True
+
+ tusers, tgroups = self._trustusers, self._trustgroups
+ if '*' in tusers or '*' in tgroups:
+ return True
+
+ user = util.username(st.st_uid)
+ group = util.groupname(st.st_gid)
+ if user in tusers or group in tgroups or user == util.username():
+ return True
+
+ if self._reportuntrusted:
+ self.warn(_('not trusting file %s from untrusted '
+ 'user %s, group %s\n') % (f, user, group))
+ return False
+
+ def readconfig(self, filename, root=None, trust=False,
+ sections=None, remap=None):
+ try:
+ fp = open(filename)
+ except IOError:
+ if not sections: # ignore unless we were looking for something
+ return
+ raise
+
+ cfg = config.config()
+ trusted = sections or trust or self._trusted(fp, filename)
+
+ try:
+ cfg.read(filename, fp, sections=sections, remap=remap)
+ fp.close()
+ except error.ConfigError, inst:
+ if trusted:
+ raise
+ self.warn(_("ignored: %s\n") % str(inst))
+
+ if self.plain():
+ for k in ('debug', 'fallbackencoding', 'quiet', 'slash',
+ 'logtemplate', 'style',
+ 'traceback', 'verbose'):
+ if k in cfg['ui']:
+ del cfg['ui'][k]
+ for k, v in cfg.items('defaults'):
+ del cfg['defaults'][k]
+ # Don't remove aliases from the configuration if in the exceptionlist
+ if self.plain('alias'):
+ for k, v in cfg.items('alias'):
+ del cfg['alias'][k]
+
+ if trusted:
+ self._tcfg.update(cfg)
+ self._tcfg.update(self._ocfg)
+ self._ucfg.update(cfg)
+ self._ucfg.update(self._ocfg)
+
+ if root is None:
+ root = os.path.expanduser('~')
+ self.fixconfig(root=root)
+
+ def fixconfig(self, root=None, section=None):
+ if section in (None, 'paths'):
+ # expand vars and ~
+ # translate paths relative to root (or home) into absolute paths
+ root = root or os.getcwd()
+ for c in self._tcfg, self._ucfg, self._ocfg:
+ for n, p in c.items('paths'):
+ if not p:
+ continue
+ if '%%' in p:
+ self.warn(_("(deprecated '%%' in path %s=%s from %s)\n")
+ % (n, p, self.configsource('paths', n)))
+ p = p.replace('%%', '%')
+ p = util.expandpath(p)
+ if not util.hasscheme(p) and not os.path.isabs(p):
+ p = os.path.normpath(os.path.join(root, p))
+ c.set("paths", n, p)
+
+ if section in (None, 'ui'):
+ # update ui options
+ self.debugflag = self.configbool('ui', 'debug')
+ self.verbose = self.debugflag or self.configbool('ui', 'verbose')
+ self.quiet = not self.debugflag and self.configbool('ui', 'quiet')
+ if self.verbose and self.quiet:
+ self.quiet = self.verbose = False
+ self._reportuntrusted = self.debugflag or self.configbool("ui",
+ "report_untrusted", True)
+ self.tracebackflag = self.configbool('ui', 'traceback', False)
+
+ if section in (None, 'trusted'):
+ # update trust information
+ self._trustusers.update(self.configlist('trusted', 'users'))
+ self._trustgroups.update(self.configlist('trusted', 'groups'))
+
+ def backupconfig(self, section, item):
+ return (self._ocfg.backup(section, item),
+ self._tcfg.backup(section, item),
+ self._ucfg.backup(section, item),)
+ def restoreconfig(self, data):
+ self._ocfg.restore(data[0])
+ self._tcfg.restore(data[1])
+ self._ucfg.restore(data[2])
+
+ def setconfig(self, section, name, value, overlay=True):
+ if overlay:
+ self._ocfg.set(section, name, value)
+ self._tcfg.set(section, name, value)
+ self._ucfg.set(section, name, value)
+ self.fixconfig(section=section)
+
+ def _data(self, untrusted):
+ return untrusted and self._ucfg or self._tcfg
+
+ def configsource(self, section, name, untrusted=False):
+ return self._data(untrusted).source(section, name) or 'none'
+
+ def config(self, section, name, default=None, untrusted=False):
+ if isinstance(name, list):
+ alternates = name
+ else:
+ alternates = [name]
+
+ for n in alternates:
+ value = self._data(untrusted).get(section, name, None)
+ if value is not None:
+ name = n
+ break
+ else:
+ value = default
+
+ if self.debugflag and not untrusted and self._reportuntrusted:
+ uvalue = self._ucfg.get(section, name)
+ if uvalue is not None and uvalue != value:
+ self.debug("ignoring untrusted configuration option "
+ "%s.%s = %s\n" % (section, name, uvalue))
+ return value
+
+ def configpath(self, section, name, default=None, untrusted=False):
+ 'get a path config item, expanded relative to repo root or config file'
+ v = self.config(section, name, default, untrusted)
+ if v is None:
+ return None
+ if not os.path.isabs(v) or "://" not in v:
+ src = self.configsource(section, name, untrusted)
+ if ':' in src:
+ base = os.path.dirname(src.rsplit(':')[0])
+ v = os.path.join(base, os.path.expanduser(v))
+ return v
+
+ def configbool(self, section, name, default=False, untrusted=False):
+ """parse a configuration element as a boolean
+
+ >>> u = ui(); s = 'foo'
+ >>> u.setconfig(s, 'true', 'yes')
+ >>> u.configbool(s, 'true')
+ True
+ >>> u.setconfig(s, 'false', 'no')
+ >>> u.configbool(s, 'false')
+ False
+ >>> u.configbool(s, 'unknown')
+ False
+ >>> u.configbool(s, 'unknown', True)
+ True
+ >>> u.setconfig(s, 'invalid', 'somevalue')
+ >>> u.configbool(s, 'invalid')
+ Traceback (most recent call last):
+ ...
+ ConfigError: foo.invalid is not a boolean ('somevalue')
+ """
+
+ v = self.config(section, name, None, untrusted)
+ if v is None:
+ return default
+ if isinstance(v, bool):
+ return v
+ b = util.parsebool(v)
+ if b is None:
+ raise error.ConfigError(_("%s.%s is not a boolean ('%s')")
+ % (section, name, v))
+ return b
+
+ def configint(self, section, name, default=None, untrusted=False):
+ """parse a configuration element as an integer
+
+ >>> u = ui(); s = 'foo'
+ >>> u.setconfig(s, 'int1', '42')
+ >>> u.configint(s, 'int1')
+ 42
+ >>> u.setconfig(s, 'int2', '-42')
+ >>> u.configint(s, 'int2')
+ -42
+ >>> u.configint(s, 'unknown', 7)
+ 7
+ >>> u.setconfig(s, 'invalid', 'somevalue')
+ >>> u.configint(s, 'invalid')
+ Traceback (most recent call last):
+ ...
+ ConfigError: foo.invalid is not an integer ('somevalue')
+ """
+
+ v = self.config(section, name, None, untrusted)
+ if v is None:
+ return default
+ try:
+ return int(v)
+ except ValueError:
+ raise error.ConfigError(_("%s.%s is not an integer ('%s')")
+ % (section, name, v))
+
+ def configlist(self, section, name, default=None, untrusted=False):
+ """parse a configuration element as a list of comma/space separated
+ strings
+
+ >>> u = ui(); s = 'foo'
+ >>> u.setconfig(s, 'list1', 'this,is "a small" ,test')
+ >>> u.configlist(s, 'list1')
+ ['this', 'is', 'a small', 'test']
+ """
+
+ def _parse_plain(parts, s, offset):
+ whitespace = False
+ while offset < len(s) and (s[offset].isspace() or s[offset] == ','):
+ whitespace = True
+ offset += 1
+ if offset >= len(s):
+ return None, parts, offset
+ if whitespace:
+ parts.append('')
+ if s[offset] == '"' and not parts[-1]:
+ return _parse_quote, parts, offset + 1
+ elif s[offset] == '"' and parts[-1][-1] == '\\':
+ parts[-1] = parts[-1][:-1] + s[offset]
+ return _parse_plain, parts, offset + 1
+ parts[-1] += s[offset]
+ return _parse_plain, parts, offset + 1
+
+ def _parse_quote(parts, s, offset):
+ if offset < len(s) and s[offset] == '"': # ""
+ parts.append('')
+ offset += 1
+ while offset < len(s) and (s[offset].isspace() or
+ s[offset] == ','):
+ offset += 1
+ return _parse_plain, parts, offset
+
+ while offset < len(s) and s[offset] != '"':
+ if (s[offset] == '\\' and offset + 1 < len(s)
+ and s[offset + 1] == '"'):
+ offset += 1
+ parts[-1] += '"'
+ else:
+ parts[-1] += s[offset]
+ offset += 1
+
+ if offset >= len(s):
+ real_parts = _configlist(parts[-1])
+ if not real_parts:
+ parts[-1] = '"'
+ else:
+ real_parts[0] = '"' + real_parts[0]
+ parts = parts[:-1]
+ parts.extend(real_parts)
+ return None, parts, offset
+
+ offset += 1
+ while offset < len(s) and s[offset] in [' ', ',']:
+ offset += 1
+
+ if offset < len(s):
+ if offset + 1 == len(s) and s[offset] == '"':
+ parts[-1] += '"'
+ offset += 1
+ else:
+ parts.append('')
+ else:
+ return None, parts, offset
+
+ return _parse_plain, parts, offset
+
+ def _configlist(s):
+ s = s.rstrip(' ,')
+ if not s:
+ return []
+ parser, parts, offset = _parse_plain, [''], 0
+ while parser:
+ parser, parts, offset = parser(parts, s, offset)
+ return parts
+
+ result = self.config(section, name, untrusted=untrusted)
+ if result is None:
+ result = default or []
+ if isinstance(result, basestring):
+ result = _configlist(result.lstrip(' ,\n'))
+ if result is None:
+ result = default or []
+ return result
+
+ def has_section(self, section, untrusted=False):
+ '''tell whether section exists in config.'''
+ return section in self._data(untrusted)
+
+ def configitems(self, section, untrusted=False):
+ items = self._data(untrusted).items(section)
+ if self.debugflag and not untrusted and self._reportuntrusted:
+ for k, v in self._ucfg.items(section):
+ if self._tcfg.get(section, k) != v:
+ self.debug("ignoring untrusted configuration option "
+ "%s.%s = %s\n" % (section, k, v))
+ return items
+
+ def walkconfig(self, untrusted=False):
+ cfg = self._data(untrusted)
+ for section in cfg.sections():
+ for name, value in self.configitems(section, untrusted):
+ yield section, name, value
+
+ def plain(self, feature=None):
+ '''is plain mode active?
+
+ Plain mode means that all configuration variables which affect
+ the behavior and output of Mercurial should be
+ ignored. Additionally, the output should be stable,
+ reproducible and suitable for use in scripts or applications.
+
+ The only way to trigger plain mode is by setting either the
+ `HGPLAIN' or `HGPLAINEXCEPT' environment variables.
+
+ The return value can either be
+ - False if HGPLAIN is not set, or feature is in HGPLAINEXCEPT
+ - True otherwise
+ '''
+ if 'HGPLAIN' not in os.environ and 'HGPLAINEXCEPT' not in os.environ:
+ return False
+ exceptions = os.environ.get('HGPLAINEXCEPT', '').strip().split(',')
+ if feature and exceptions:
+ return feature not in exceptions
+ return True
+
+ def username(self):
+ """Return default username to be used in commits.
+
+ Searched in this order: $HGUSER, [ui] section of hgrcs, $EMAIL
+ and stop searching if one of these is set.
+ If not found and ui.askusername is True, ask the user, else use
+ ($LOGNAME or $USER or $LNAME or $USERNAME) + "@full.hostname".
+ """
+ user = os.environ.get("HGUSER")
+ if user is None:
+ user = self.config("ui", "username")
+ if user is not None:
+ user = os.path.expandvars(user)
+ if user is None:
+ user = os.environ.get("EMAIL")
+ if user is None and self.configbool("ui", "askusername"):
+ user = self.prompt(_("enter a commit username:"), default=None)
+ if user is None and not self.interactive():
+ try:
+ user = '%s@%s' % (util.getuser(), socket.getfqdn())
+ self.warn(_("no username found, using '%s' instead\n") % user)
+ except KeyError:
+ pass
+ if not user:
+ raise util.Abort(_('no username supplied (see "hg help config")'))
+ if "\n" in user:
+ raise util.Abort(_("username %s contains a newline\n") % repr(user))
+ return user
+
+ def shortuser(self, user):
+ """Return a short representation of a user name or email address."""
+ if not self.verbose:
+ user = util.shortuser(user)
+ return user
+
+ def expandpath(self, loc, default=None):
+ """Return repository location relative to cwd or from [paths]"""
+ if util.hasscheme(loc) or os.path.isdir(os.path.join(loc, '.hg')):
+ return loc
+
+ path = self.config('paths', loc)
+ if not path and default is not None:
+ path = self.config('paths', default)
+ return path or loc
+
+ def pushbuffer(self):
+ self._buffers.append([])
+
+ def popbuffer(self, labeled=False):
+ '''pop the last buffer and return the buffered output
+
+ If labeled is True, any labels associated with buffered
+ output will be handled. By default, this has no effect
+ on the output returned, but extensions and GUI tools may
+ handle this argument and returned styled output. If output
+ is being buffered so it can be captured and parsed or
+ processed, labeled should not be set to True.
+ '''
+ return "".join(self._buffers.pop())
+
+ def write(self, *args, **opts):
+ '''write args to output
+
+ By default, this method simply writes to the buffer or stdout,
+ but extensions or GUI tools may override this method,
+ write_err(), popbuffer(), and label() to style output from
+ various parts of hg.
+
+ An optional keyword argument, "label", can be passed in.
+ This should be a string containing label names separated by
+ space. Label names take the form of "topic.type". For example,
+ ui.debug() issues a label of "ui.debug".
+
+ When labeling output for a specific command, a label of
+ "cmdname.type" is recommended. For example, status issues
+ a label of "status.modified" for modified files.
+ '''
+ if self._buffers:
+ self._buffers[-1].extend([str(a) for a in args])
+ else:
+ for a in args:
+ self.fout.write(str(a))
+
+ def write_err(self, *args, **opts):
+ try:
+ if not getattr(self.fout, 'closed', False):
+ self.fout.flush()
+ for a in args:
+ self.ferr.write(str(a))
+ # stderr may be buffered under win32 when redirected to files,
+ # including stdout.
+ if not getattr(self.ferr, 'closed', False):
+ self.ferr.flush()
+ except IOError, inst:
+ if inst.errno not in (errno.EPIPE, errno.EIO, errno.EBADF):
+ raise
+
+ def flush(self):
+ try: self.fout.flush()
+ except (IOError, ValueError): pass
+ try: self.ferr.flush()
+ except (IOError, ValueError): pass
+
+ def _isatty(self, fh):
+ if self.configbool('ui', 'nontty', False):
+ return False
+ return util.isatty(fh)
+
+ def interactive(self):
+ '''is interactive input allowed?
+
+ An interactive session is a session where input can be reasonably read
+ from `sys.stdin'. If this function returns false, any attempt to read
+ from stdin should fail with an error, unless a sensible default has been
+ specified.
+
+ Interactiveness is triggered by the value of the `ui.interactive'
+ configuration variable or - if it is unset - when `sys.stdin' points
+ to a terminal device.
+
+ This function refers to input only; for output, see `ui.formatted()'.
+ '''
+ i = self.configbool("ui", "interactive", None)
+ if i is None:
+ # some environments replace stdin without implementing isatty
+ # usually those are non-interactive
+ return self._isatty(self.fin)
+
+ return i
+
+ def termwidth(self):
+ '''how wide is the terminal in columns?
+ '''
+ if 'COLUMNS' in os.environ:
+ try:
+ return int(os.environ['COLUMNS'])
+ except ValueError:
+ pass
+ return util.termwidth()
+
+ def formatted(self):
+ '''should formatted output be used?
+
+ It is often desirable to format the output to suite the output medium.
+ Examples of this are truncating long lines or colorizing messages.
+ However, this is not often not desirable when piping output into other
+ utilities, e.g. `grep'.
+
+ Formatted output is triggered by the value of the `ui.formatted'
+ configuration variable or - if it is unset - when `sys.stdout' points
+ to a terminal device. Please note that `ui.formatted' should be
+ considered an implementation detail; it is not intended for use outside
+ Mercurial or its extensions.
+
+ This function refers to output only; for input, see `ui.interactive()'.
+ This function always returns false when in plain mode, see `ui.plain()'.
+ '''
+ if self.plain():
+ return False
+
+ i = self.configbool("ui", "formatted", None)
+ if i is None:
+ # some environments replace stdout without implementing isatty
+ # usually those are non-interactive
+ return self._isatty(self.fout)
+
+ return i
+
+ def _readline(self, prompt=''):
+ if self._isatty(self.fin):
+ try:
+ # magically add command line editing support, where
+ # available
+ import readline
+ # force demandimport to really load the module
+ readline.read_history_file
+ # windows sometimes raises something other than ImportError
+ except Exception:
+ pass
+
+ # call write() so output goes through subclassed implementation
+ # e.g. color extension on Windows
+ self.write(prompt)
+
+ # instead of trying to emulate raw_input, swap (self.fin,
+ # self.fout) with (sys.stdin, sys.stdout)
+ oldin = sys.stdin
+ oldout = sys.stdout
+ sys.stdin = self.fin
+ sys.stdout = self.fout
+ line = raw_input(' ')
+ sys.stdin = oldin
+ sys.stdout = oldout
+
+ # When stdin is in binary mode on Windows, it can cause
+ # raw_input() to emit an extra trailing carriage return
+ if os.linesep == '\r\n' and line and line[-1] == '\r':
+ line = line[:-1]
+ return line
+
+ def prompt(self, msg, default="y"):
+ """Prompt user with msg, read response.
+ If ui is not interactive, the default is returned.
+ """
+ if not self.interactive():
+ self.write(msg, ' ', default, "\n")
+ return default
+ try:
+ r = self._readline(self.label(msg, 'ui.prompt'))
+ if not r:
+ return default
+ return r
+ except EOFError:
+ raise util.Abort(_('response expected'))
+
+ def promptchoice(self, msg, choices, default=0):
+ """Prompt user with msg, read response, and ensure it matches
+ one of the provided choices. The index of the choice is returned.
+ choices is a sequence of acceptable responses with the format:
+ ('&None', 'E&xec', 'Sym&link') Responses are case insensitive.
+ If ui is not interactive, the default is returned.
+ """
+ resps = [s[s.index('&')+1].lower() for s in choices]
+ while True:
+ r = self.prompt(msg, resps[default])
+ if r.lower() in resps:
+ return resps.index(r.lower())
+ self.write(_("unrecognized response\n"))
+
+ def getpass(self, prompt=None, default=None):
+ if not self.interactive():
+ return default
+ try:
+ return getpass.getpass(prompt or _('password: '))
+ except EOFError:
+ raise util.Abort(_('response expected'))
+ def status(self, *msg, **opts):
+ '''write status message to output (if ui.quiet is False)
+
+ This adds an output label of "ui.status".
+ '''
+ if not self.quiet:
+ opts['label'] = opts.get('label', '') + ' ui.status'
+ self.write(*msg, **opts)
+ def warn(self, *msg, **opts):
+ '''write warning message to output (stderr)
+
+ This adds an output label of "ui.warning".
+ '''
+ opts['label'] = opts.get('label', '') + ' ui.warning'
+ self.write_err(*msg, **opts)
+ def note(self, *msg, **opts):
+ '''write note to output (if ui.verbose is True)
+
+ This adds an output label of "ui.note".
+ '''
+ if self.verbose:
+ opts['label'] = opts.get('label', '') + ' ui.note'
+ self.write(*msg, **opts)
+ def debug(self, *msg, **opts):
+ '''write debug message to output (if ui.debugflag is True)
+
+ This adds an output label of "ui.debug".
+ '''
+ if self.debugflag:
+ opts['label'] = opts.get('label', '') + ' ui.debug'
+ self.write(*msg, **opts)
+ def edit(self, text, user):
+ (fd, name) = tempfile.mkstemp(prefix="hg-editor-", suffix=".txt",
+ text=True)
+ try:
+ f = os.fdopen(fd, "w")
+ f.write(text)
+ f.close()
+
+ editor = self.geteditor()
+
+ util.system("%s \"%s\"" % (editor, name),
+ environ={'HGUSER': user},
+ onerr=util.Abort, errprefix=_("edit failed"),
+ out=self.fout)
+
+ f = open(name)
+ t = f.read()
+ f.close()
+ finally:
+ os.unlink(name)
+
+ return t
+
+ def traceback(self, exc=None):
+ '''print exception traceback if traceback printing enabled.
+ only to call in exception handler. returns true if traceback
+ printed.'''
+ if self.tracebackflag:
+ if exc:
+ traceback.print_exception(exc[0], exc[1], exc[2],
+ file=self.ferr)
+ else:
+ traceback.print_exc(file=self.ferr)
+ return self.tracebackflag
+
+ def geteditor(self):
+ '''return editor to use'''
+ if sys.platform == 'plan9':
+ # vi is the MIPS instruction simulator on Plan 9. We
+ # instead default to E to plumb commit messages to
+ # avoid confusion.
+ editor = 'E'
+ else:
+ editor = 'vi'
+ return (os.environ.get("HGEDITOR") or
+ self.config("ui", "editor") or
+ os.environ.get("VISUAL") or
+ os.environ.get("EDITOR", editor))
+
+ def progress(self, topic, pos, item="", unit="", total=None):
+ '''show a progress message
+
+ With stock hg, this is simply a debug message that is hidden
+ by default, but with extensions or GUI tools it may be
+ visible. 'topic' is the current operation, 'item' is a
+ non-numeric marker of the current position (ie the currently
+ in-process file), 'pos' is the current numeric position (ie
+ revision, bytes, etc.), unit is a corresponding unit label,
+ and total is the highest expected pos.
+
+ Multiple nested topics may be active at a time.
+
+ All topics should be marked closed by setting pos to None at
+ termination.
+ '''
+
+ if pos is None or not self.debugflag:
+ return
+
+ if unit:
+ unit = ' ' + unit
+ if item:
+ item = ' ' + item
+
+ if total:
+ pct = 100.0 * pos / total
+ self.debug('%s:%s %s/%s%s (%4.2f%%)\n'
+ % (topic, item, pos, total, unit, pct))
+ else:
+ self.debug('%s:%s %s%s\n' % (topic, item, pos, unit))
+
+ def log(self, service, message):
+ '''hook for logging facility extensions
+
+ service should be a readily-identifiable subsystem, which will
+ allow filtering.
+ message should be a newline-terminated string to log.
+ '''
+ pass
+
+ def label(self, msg, label):
+ '''style msg based on supplied label
+
+ Like ui.write(), this just returns msg unchanged, but extensions
+ and GUI tools can override it to allow styling output without
+ writing it.
+
+ ui.write(s, 'label') is equivalent to
+ ui.write(ui.label(s, 'label')).
+ '''
+ return msg
diff --git a/mercurial/url.py b/mercurial/url.py
new file mode 100644
index 0000000..9cb88e0
--- /dev/null
+++ b/mercurial/url.py
@@ -0,0 +1,474 @@
+# url.py - HTTP handling for mercurial
+#
+# Copyright 2005, 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
+# Copyright 2006, 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import urllib, urllib2, httplib, os, socket, cStringIO
+from i18n import _
+import keepalive, util, sslutil
+import httpconnection as httpconnectionmod
+
+class passwordmgr(urllib2.HTTPPasswordMgrWithDefaultRealm):
+ def __init__(self, ui):
+ urllib2.HTTPPasswordMgrWithDefaultRealm.__init__(self)
+ self.ui = ui
+
+ def find_user_password(self, realm, authuri):
+ authinfo = urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password(
+ self, realm, authuri)
+ user, passwd = authinfo
+ if user and passwd:
+ self._writedebug(user, passwd)
+ return (user, passwd)
+
+ if not user or not passwd:
+ res = httpconnectionmod.readauthforuri(self.ui, authuri, user)
+ if res:
+ group, auth = res
+ user, passwd = auth.get('username'), auth.get('password')
+ self.ui.debug("using auth.%s.* for authentication\n" % group)
+ if not user or not passwd:
+ if not self.ui.interactive():
+ raise util.Abort(_('http authorization required'))
+
+ self.ui.write(_("http authorization required\n"))
+ self.ui.write(_("realm: %s\n") % realm)
+ if user:
+ self.ui.write(_("user: %s\n") % user)
+ else:
+ user = self.ui.prompt(_("user:"), default=None)
+
+ if not passwd:
+ passwd = self.ui.getpass()
+
+ self.add_password(realm, authuri, user, passwd)
+ self._writedebug(user, passwd)
+ return (user, passwd)
+
+ def _writedebug(self, user, passwd):
+ msg = _('http auth: user %s, password %s\n')
+ self.ui.debug(msg % (user, passwd and '*' * len(passwd) or 'not set'))
+
+ def find_stored_password(self, authuri):
+ return urllib2.HTTPPasswordMgrWithDefaultRealm.find_user_password(
+ self, None, authuri)
+
+class proxyhandler(urllib2.ProxyHandler):
+ def __init__(self, ui):
+ proxyurl = ui.config("http_proxy", "host") or os.getenv('http_proxy')
+ # XXX proxyauthinfo = None
+
+ if proxyurl:
+ # proxy can be proper url or host[:port]
+ if not (proxyurl.startswith('http:') or
+ proxyurl.startswith('https:')):
+ proxyurl = 'http://' + proxyurl + '/'
+ proxy = util.url(proxyurl)
+ if not proxy.user:
+ proxy.user = ui.config("http_proxy", "user")
+ proxy.passwd = ui.config("http_proxy", "passwd")
+
+ # see if we should use a proxy for this url
+ no_list = ["localhost", "127.0.0.1"]
+ no_list.extend([p.lower() for
+ p in ui.configlist("http_proxy", "no")])
+ no_list.extend([p.strip().lower() for
+ p in os.getenv("no_proxy", '').split(',')
+ if p.strip()])
+ # "http_proxy.always" config is for running tests on localhost
+ if ui.configbool("http_proxy", "always"):
+ self.no_list = []
+ else:
+ self.no_list = no_list
+
+ proxyurl = str(proxy)
+ proxies = {'http': proxyurl, 'https': proxyurl}
+ ui.debug('proxying through http://%s:%s\n' %
+ (proxy.host, proxy.port))
+ else:
+ proxies = {}
+
+ # urllib2 takes proxy values from the environment and those
+ # will take precedence if found. So, if there's a config entry
+ # defining a proxy, drop the environment ones
+ if ui.config("http_proxy", "host"):
+ for env in ["HTTP_PROXY", "http_proxy", "no_proxy"]:
+ try:
+ if env in os.environ:
+ del os.environ[env]
+ except OSError:
+ pass
+
+ urllib2.ProxyHandler.__init__(self, proxies)
+ self.ui = ui
+
+ def proxy_open(self, req, proxy, type_):
+ host = req.get_host().split(':')[0]
+ if host in self.no_list:
+ return None
+
+ # work around a bug in Python < 2.4.2
+ # (it leaves a "\n" at the end of Proxy-authorization headers)
+ baseclass = req.__class__
+ class _request(baseclass):
+ def add_header(self, key, val):
+ if key.lower() == 'proxy-authorization':
+ val = val.strip()
+ return baseclass.add_header(self, key, val)
+ req.__class__ = _request
+
+ return urllib2.ProxyHandler.proxy_open(self, req, proxy, type_)
+
+def _gen_sendfile(orgsend):
+ def _sendfile(self, data):
+ # send a file
+ if isinstance(data, httpconnectionmod.httpsendfile):
+ # if auth required, some data sent twice, so rewind here
+ data.seek(0)
+ for chunk in util.filechunkiter(data):
+ orgsend(self, chunk)
+ else:
+ orgsend(self, data)
+ return _sendfile
+
+has_https = util.safehasattr(urllib2, 'HTTPSHandler')
+if has_https:
+ try:
+ _create_connection = socket.create_connection
+ except AttributeError:
+ _GLOBAL_DEFAULT_TIMEOUT = object()
+
+ def _create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
+ source_address=None):
+ # lifted from Python 2.6
+
+ msg = "getaddrinfo returns an empty list"
+ host, port = address
+ for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
+ af, socktype, proto, canonname, sa = res
+ sock = None
+ try:
+ sock = socket.socket(af, socktype, proto)
+ if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
+ sock.settimeout(timeout)
+ if source_address:
+ sock.bind(source_address)
+ sock.connect(sa)
+ return sock
+
+ except socket.error, msg:
+ if sock is not None:
+ sock.close()
+
+ raise socket.error, msg
+
+class httpconnection(keepalive.HTTPConnection):
+ # must be able to send big bundle as stream.
+ send = _gen_sendfile(keepalive.HTTPConnection.send)
+
+ def connect(self):
+ if has_https and self.realhostport: # use CONNECT proxy
+ self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.sock.connect((self.host, self.port))
+ if _generic_proxytunnel(self):
+ # we do not support client x509 certificates
+ self.sock = sslutil.ssl_wrap_socket(self.sock, None, None)
+ else:
+ keepalive.HTTPConnection.connect(self)
+
+ def getresponse(self):
+ proxyres = getattr(self, 'proxyres', None)
+ if proxyres:
+ if proxyres.will_close:
+ self.close()
+ self.proxyres = None
+ return proxyres
+ return keepalive.HTTPConnection.getresponse(self)
+
+# general transaction handler to support different ways to handle
+# HTTPS proxying before and after Python 2.6.3.
+def _generic_start_transaction(handler, h, req):
+ tunnel_host = getattr(req, '_tunnel_host', None)
+ if tunnel_host:
+ if tunnel_host[:7] not in ['http://', 'https:/']:
+ tunnel_host = 'https://' + tunnel_host
+ new_tunnel = True
+ else:
+ tunnel_host = req.get_selector()
+ new_tunnel = False
+
+ if new_tunnel or tunnel_host == req.get_full_url(): # has proxy
+ u = util.url(tunnel_host)
+ if new_tunnel or u.scheme == 'https': # only use CONNECT for HTTPS
+ h.realhostport = ':'.join([u.host, (u.port or '443')])
+ h.headers = req.headers.copy()
+ h.headers.update(handler.parent.addheaders)
+ return
+
+ h.realhostport = None
+ h.headers = None
+
+def _generic_proxytunnel(self):
+ proxyheaders = dict(
+ [(x, self.headers[x]) for x in self.headers
+ if x.lower().startswith('proxy-')])
+ self._set_hostport(self.host, self.port)
+ self.send('CONNECT %s HTTP/1.0\r\n' % self.realhostport)
+ for header in proxyheaders.iteritems():
+ self.send('%s: %s\r\n' % header)
+ self.send('\r\n')
+
+ # majority of the following code is duplicated from
+ # httplib.HTTPConnection as there are no adequate places to
+ # override functions to provide the needed functionality
+ res = self.response_class(self.sock,
+ strict=self.strict,
+ method=self._method)
+
+ while True:
+ version, status, reason = res._read_status()
+ if status != httplib.CONTINUE:
+ break
+ while True:
+ skip = res.fp.readline().strip()
+ if not skip:
+ break
+ res.status = status
+ res.reason = reason.strip()
+
+ if res.status == 200:
+ while True:
+ line = res.fp.readline()
+ if line == '\r\n':
+ break
+ return True
+
+ if version == 'HTTP/1.0':
+ res.version = 10
+ elif version.startswith('HTTP/1.'):
+ res.version = 11
+ elif version == 'HTTP/0.9':
+ res.version = 9
+ else:
+ raise httplib.UnknownProtocol(version)
+
+ if res.version == 9:
+ res.length = None
+ res.chunked = 0
+ res.will_close = 1
+ res.msg = httplib.HTTPMessage(cStringIO.StringIO())
+ return False
+
+ res.msg = httplib.HTTPMessage(res.fp)
+ res.msg.fp = None
+
+ # are we using the chunked-style of transfer encoding?
+ trenc = res.msg.getheader('transfer-encoding')
+ if trenc and trenc.lower() == "chunked":
+ res.chunked = 1
+ res.chunk_left = None
+ else:
+ res.chunked = 0
+
+ # will the connection close at the end of the response?
+ res.will_close = res._check_close()
+
+ # do we have a Content-Length?
+ # NOTE: RFC 2616, S4.4, #3 says we ignore this if tr_enc is "chunked"
+ length = res.msg.getheader('content-length')
+ if length and not res.chunked:
+ try:
+ res.length = int(length)
+ except ValueError:
+ res.length = None
+ else:
+ if res.length < 0: # ignore nonsensical negative lengths
+ res.length = None
+ else:
+ res.length = None
+
+ # does the body have a fixed length? (of zero)
+ if (status == httplib.NO_CONTENT or status == httplib.NOT_MODIFIED or
+ 100 <= status < 200 or # 1xx codes
+ res._method == 'HEAD'):
+ res.length = 0
+
+ # if the connection remains open, and we aren't using chunked, and
+ # a content-length was not provided, then assume that the connection
+ # WILL close.
+ if (not res.will_close and
+ not res.chunked and
+ res.length is None):
+ res.will_close = 1
+
+ self.proxyres = res
+
+ return False
+
+class httphandler(keepalive.HTTPHandler):
+ def http_open(self, req):
+ return self.do_open(httpconnection, req)
+
+ def _start_transaction(self, h, req):
+ _generic_start_transaction(self, h, req)
+ return keepalive.HTTPHandler._start_transaction(self, h, req)
+
+if has_https:
+ class httpsconnection(httplib.HTTPSConnection):
+ response_class = keepalive.HTTPResponse
+ # must be able to send big bundle as stream.
+ send = _gen_sendfile(keepalive.safesend)
+ getresponse = keepalive.wrapgetresponse(httplib.HTTPSConnection)
+
+ def connect(self):
+ self.sock = _create_connection((self.host, self.port))
+
+ host = self.host
+ if self.realhostport: # use CONNECT proxy
+ _generic_proxytunnel(self)
+ host = self.realhostport.rsplit(':', 1)[0]
+ self.sock = sslutil.ssl_wrap_socket(
+ self.sock, self.key_file, self.cert_file,
+ **sslutil.sslkwargs(self.ui, host))
+ sslutil.validator(self.ui, host)(self.sock)
+
+ class httpshandler(keepalive.KeepAliveHandler, urllib2.HTTPSHandler):
+ def __init__(self, ui):
+ keepalive.KeepAliveHandler.__init__(self)
+ urllib2.HTTPSHandler.__init__(self)
+ self.ui = ui
+ self.pwmgr = passwordmgr(self.ui)
+
+ def _start_transaction(self, h, req):
+ _generic_start_transaction(self, h, req)
+ return keepalive.KeepAliveHandler._start_transaction(self, h, req)
+
+ def https_open(self, req):
+ # req.get_full_url() does not contain credentials and we may
+ # need them to match the certificates.
+ url = req.get_full_url()
+ user, password = self.pwmgr.find_stored_password(url)
+ res = httpconnectionmod.readauthforuri(self.ui, url, user)
+ if res:
+ group, auth = res
+ self.auth = auth
+ self.ui.debug("using auth.%s.* for authentication\n" % group)
+ else:
+ self.auth = None
+ return self.do_open(self._makeconnection, req)
+
+ def _makeconnection(self, host, port=None, *args, **kwargs):
+ keyfile = None
+ certfile = None
+
+ if len(args) >= 1: # key_file
+ keyfile = args[0]
+ if len(args) >= 2: # cert_file
+ certfile = args[1]
+ args = args[2:]
+
+ # if the user has specified different key/cert files in
+ # hgrc, we prefer these
+ if self.auth and 'key' in self.auth and 'cert' in self.auth:
+ keyfile = self.auth['key']
+ certfile = self.auth['cert']
+
+ conn = httpsconnection(host, port, keyfile, certfile, *args,
+ **kwargs)
+ conn.ui = self.ui
+ return conn
+
+class httpdigestauthhandler(urllib2.HTTPDigestAuthHandler):
+ def __init__(self, *args, **kwargs):
+ urllib2.HTTPDigestAuthHandler.__init__(self, *args, **kwargs)
+ self.retried_req = None
+
+ def reset_retry_count(self):
+ # Python 2.6.5 will call this on 401 or 407 errors and thus loop
+ # forever. We disable reset_retry_count completely and reset in
+ # http_error_auth_reqed instead.
+ pass
+
+ def http_error_auth_reqed(self, auth_header, host, req, headers):
+ # Reset the retry counter once for each request.
+ if req is not self.retried_req:
+ self.retried_req = req
+ self.retried = 0
+ # In python < 2.5 AbstractDigestAuthHandler raises a ValueError if
+ # it doesn't know about the auth type requested. This can happen if
+ # somebody is using BasicAuth and types a bad password.
+ try:
+ return urllib2.HTTPDigestAuthHandler.http_error_auth_reqed(
+ self, auth_header, host, req, headers)
+ except ValueError, inst:
+ arg = inst.args[0]
+ if arg.startswith("AbstractDigestAuthHandler doesn't know "):
+ return
+ raise
+
+class httpbasicauthhandler(urllib2.HTTPBasicAuthHandler):
+ def __init__(self, *args, **kwargs):
+ urllib2.HTTPBasicAuthHandler.__init__(self, *args, **kwargs)
+ self.retried_req = None
+
+ def reset_retry_count(self):
+ # Python 2.6.5 will call this on 401 or 407 errors and thus loop
+ # forever. We disable reset_retry_count completely and reset in
+ # http_error_auth_reqed instead.
+ pass
+
+ def http_error_auth_reqed(self, auth_header, host, req, headers):
+ # Reset the retry counter once for each request.
+ if req is not self.retried_req:
+ self.retried_req = req
+ self.retried = 0
+ return urllib2.HTTPBasicAuthHandler.http_error_auth_reqed(
+ self, auth_header, host, req, headers)
+
+handlerfuncs = []
+
+def opener(ui, authinfo=None):
+ '''
+ construct an opener suitable for urllib2
+ authinfo will be added to the password manager
+ '''
+ if ui.configbool('ui', 'usehttp2', False):
+ handlers = [httpconnectionmod.http2handler(ui, passwordmgr(ui))]
+ else:
+ handlers = [httphandler()]
+ if has_https:
+ handlers.append(httpshandler(ui))
+
+ handlers.append(proxyhandler(ui))
+
+ passmgr = passwordmgr(ui)
+ if authinfo is not None:
+ passmgr.add_password(*authinfo)
+ user, passwd = authinfo[2:4]
+ ui.debug('http auth: user %s, password %s\n' %
+ (user, passwd and '*' * len(passwd) or 'not set'))
+
+ handlers.extend((httpbasicauthhandler(passmgr),
+ httpdigestauthhandler(passmgr)))
+ handlers.extend([h(ui, passmgr) for h in handlerfuncs])
+ opener = urllib2.build_opener(*handlers)
+
+ # 1.0 here is the _protocol_ version
+ opener.addheaders = [('User-agent', 'mercurial/proto-1.0')]
+ opener.addheaders.append(('Accept', 'application/mercurial-0.1'))
+ return opener
+
+def open(ui, url_, data=None):
+ u = util.url(url_)
+ if u.scheme:
+ u.scheme = u.scheme.lower()
+ url_, authinfo = u.authinfo()
+ else:
+ path = util.normpath(os.path.abspath(url_))
+ url_ = 'file://' + urllib.pathname2url(path)
+ authinfo = None
+ return opener(ui, authinfo).open(url_, data)
diff --git a/mercurial/util.h b/mercurial/util.h
new file mode 100644
index 0000000..facfd8b
--- /dev/null
+++ b/mercurial/util.h
@@ -0,0 +1,166 @@
+/*
+ util.h - utility functions for interfacing with the various python APIs.
+
+ This software may be used and distributed according to the terms of
+ the GNU General Public License, incorporated herein by reference.
+*/
+
+#ifndef _HG_UTIL_H_
+#define _HG_UTIL_H_
+
+#if PY_MAJOR_VERSION >= 3
+
+#define IS_PY3K
+#define PyInt_FromLong PyLong_FromLong
+#define PyInt_AsLong PyLong_AsLong
+
+/*
+ Mapping of some of the python < 2.x PyString* functions to py3k's PyUnicode.
+
+ The commented names below represent those that are present in the PyBytes
+ definitions for python < 2.6 (below in this file) that don't have a direct
+ implementation.
+*/
+
+#define PyStringObject PyUnicodeObject
+#define PyString_Type PyUnicode_Type
+
+#define PyString_Check PyUnicode_Check
+#define PyString_CheckExact PyUnicode_CheckExact
+#define PyString_CHECK_INTERNED PyUnicode_CHECK_INTERNED
+#define PyString_AS_STRING PyUnicode_AsLatin1String
+#define PyString_GET_SIZE PyUnicode_GET_SIZE
+
+#define PyString_FromStringAndSize PyUnicode_FromStringAndSize
+#define PyString_FromString PyUnicode_FromString
+#define PyString_FromFormatV PyUnicode_FromFormatV
+#define PyString_FromFormat PyUnicode_FromFormat
+/* #define PyString_Size PyUnicode_GET_SIZE */
+/* #define PyString_AsString */
+/* #define PyString_Repr */
+#define PyString_Concat PyUnicode_Concat
+#define PyString_ConcatAndDel PyUnicode_AppendAndDel
+#define _PyString_Resize PyUnicode_Resize
+/* #define _PyString_Eq */
+#define PyString_Format PyUnicode_Format
+/* #define _PyString_FormatLong */
+/* #define PyString_DecodeEscape */
+#define _PyString_Join PyUnicode_Join
+#define PyString_Decode PyUnicode_Decode
+#define PyString_Encode PyUnicode_Encode
+#define PyString_AsEncodedObject PyUnicode_AsEncodedObject
+#define PyString_AsEncodedString PyUnicode_AsEncodedString
+#define PyString_AsDecodedObject PyUnicode_AsDecodedObject
+#define PyString_AsDecodedString PyUnicode_AsDecodedUnicode
+/* #define PyString_AsStringAndSize */
+#define _PyString_InsertThousandsGrouping _PyUnicode_InsertThousandsGrouping
+
+#endif /* PY_MAJOR_VERSION */
+
+/* Backports from 2.6 */
+#if PY_VERSION_HEX < 0x02060000
+
+#define Py_TYPE(ob) (ob)->ob_type
+#define Py_SIZE(ob) (ob)->ob_size
+#define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
+
+/* Shamelessly stolen from bytesobject.h */
+#define PyBytesObject PyStringObject
+#define PyBytes_Type PyString_Type
+
+#define PyBytes_Check PyString_Check
+#define PyBytes_CheckExact PyString_CheckExact
+#define PyBytes_CHECK_INTERNED PyString_CHECK_INTERNED
+#define PyBytes_AS_STRING PyString_AS_STRING
+#define PyBytes_GET_SIZE PyString_GET_SIZE
+#define Py_TPFLAGS_BYTES_SUBCLASS Py_TPFLAGS_STRING_SUBCLASS
+
+#define PyBytes_FromStringAndSize PyString_FromStringAndSize
+#define PyBytes_FromString PyString_FromString
+#define PyBytes_FromFormatV PyString_FromFormatV
+#define PyBytes_FromFormat PyString_FromFormat
+#define PyBytes_Size PyString_Size
+#define PyBytes_AsString PyString_AsString
+#define PyBytes_Repr PyString_Repr
+#define PyBytes_Concat PyString_Concat
+#define PyBytes_ConcatAndDel PyString_ConcatAndDel
+#define _PyBytes_Resize _PyString_Resize
+#define _PyBytes_Eq _PyString_Eq
+#define PyBytes_Format PyString_Format
+#define _PyBytes_FormatLong _PyString_FormatLong
+#define PyBytes_DecodeEscape PyString_DecodeEscape
+#define _PyBytes_Join _PyString_Join
+#define PyBytes_Decode PyString_Decode
+#define PyBytes_Encode PyString_Encode
+#define PyBytes_AsEncodedObject PyString_AsEncodedObject
+#define PyBytes_AsEncodedString PyString_AsEncodedString
+#define PyBytes_AsDecodedObject PyString_AsDecodedObject
+#define PyBytes_AsDecodedString PyString_AsDecodedString
+#define PyBytes_AsStringAndSize PyString_AsStringAndSize
+#define _PyBytes_InsertThousandsGrouping _PyString_InsertThousandsGrouping
+
+#endif /* PY_VERSION_HEX */
+
+#if (PY_VERSION_HEX < 0x02050000)
+/* Definitions to get compatibility with python 2.4 and earlier which
+ does not have Py_ssize_t. See also PEP 353.
+ Note: msvc (8 or earlier) does not have ssize_t, so we use Py_ssize_t.
+*/
+typedef int Py_ssize_t;
+typedef Py_ssize_t (*lenfunc)(PyObject *);
+typedef PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t);
+#define PyInt_FromSsize_t PyInt_FromLong
+
+#if !defined(PY_SSIZE_T_MIN)
+#define PY_SSIZE_T_MAX INT_MAX
+#define PY_SSIZE_T_MIN INT_MIN
+#endif
+#endif
+
+#ifdef _WIN32
+#ifdef _MSC_VER
+/* msvc 6.0 has problems */
+#define inline __inline
+typedef unsigned long uint32_t;
+typedef unsigned __int64 uint64_t;
+#else
+#include <stdint.h>
+#endif
+#else
+/* not windows */
+#include <sys/types.h>
+#if defined __BEOS__ && !defined __HAIKU__
+#include <ByteOrder.h>
+#else
+#include <arpa/inet.h>
+#endif
+#include <inttypes.h>
+#endif
+
+#if defined __hpux || defined __SUNPRO_C || defined _AIX
+#define inline
+#endif
+
+#ifdef __linux
+#define inline __inline
+#endif
+
+static inline uint32_t getbe32(const char *c)
+{
+ const unsigned char *d = (const unsigned char *)c;
+
+ return ((d[0] << 24) |
+ (d[1] << 16) |
+ (d[2] << 8) |
+ (d[3]));
+}
+
+static inline void putbe32(uint32_t x, char *c)
+{
+ c[0] = (x >> 24) & 0xff;
+ c[1] = (x >> 16) & 0xff;
+ c[2] = (x >> 8) & 0xff;
+ c[3] = (x) & 0xff;
+}
+
+#endif /* _HG_UTIL_H_ */
diff --git a/mercurial/util.py b/mercurial/util.py
new file mode 100644
index 0000000..4a6e215
--- /dev/null
+++ b/mercurial/util.py
@@ -0,0 +1,1801 @@
+# util.py - Mercurial utility functions and platform specfic implementations
+#
+# Copyright 2005 K. Thananchayan <thananck@yahoo.com>
+# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
+# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Mercurial utility functions and platform specfic implementations.
+
+This contains helper routines that are independent of the SCM core and
+hide platform-specific details from the core.
+"""
+
+from i18n import _
+import error, osutil, encoding, collections
+import errno, re, shutil, sys, tempfile, traceback
+import os, time, datetime, calendar, textwrap, signal
+import imp, socket, urllib
+
+if os.name == 'nt':
+ import windows as platform
+else:
+ import posix as platform
+
+cachestat = platform.cachestat
+checkexec = platform.checkexec
+checklink = platform.checklink
+copymode = platform.copymode
+executablepath = platform.executablepath
+expandglobs = platform.expandglobs
+explainexit = platform.explainexit
+findexe = platform.findexe
+gethgcmd = platform.gethgcmd
+getuser = platform.getuser
+groupmembers = platform.groupmembers
+groupname = platform.groupname
+hidewindow = platform.hidewindow
+isexec = platform.isexec
+isowner = platform.isowner
+localpath = platform.localpath
+lookupreg = platform.lookupreg
+makedir = platform.makedir
+nlinks = platform.nlinks
+normpath = platform.normpath
+normcase = platform.normcase
+nulldev = platform.nulldev
+openhardlinks = platform.openhardlinks
+oslink = platform.oslink
+parsepatchoutput = platform.parsepatchoutput
+pconvert = platform.pconvert
+popen = platform.popen
+posixfile = platform.posixfile
+quotecommand = platform.quotecommand
+realpath = platform.realpath
+rename = platform.rename
+samedevice = platform.samedevice
+samefile = platform.samefile
+samestat = platform.samestat
+setbinary = platform.setbinary
+setflags = platform.setflags
+setsignalhandler = platform.setsignalhandler
+shellquote = platform.shellquote
+spawndetached = platform.spawndetached
+sshargs = platform.sshargs
+statfiles = platform.statfiles
+termwidth = platform.termwidth
+testpid = platform.testpid
+umask = platform.umask
+unlink = platform.unlink
+unlinkpath = platform.unlinkpath
+username = platform.username
+
+# Python compatibility
+
+_notset = object()
+
+def safehasattr(thing, attr):
+ return getattr(thing, attr, _notset) is not _notset
+
+def sha1(s=''):
+ '''
+ Low-overhead wrapper around Python's SHA support
+
+ >>> f = _fastsha1
+ >>> a = sha1()
+ >>> a = f()
+ >>> a.hexdigest()
+ 'da39a3ee5e6b4b0d3255bfef95601890afd80709'
+ '''
+
+ return _fastsha1(s)
+
+def _fastsha1(s=''):
+ # This function will import sha1 from hashlib or sha (whichever is
+ # available) and overwrite itself with it on the first call.
+ # Subsequent calls will go directly to the imported function.
+ if sys.version_info >= (2, 5):
+ from hashlib import sha1 as _sha1
+ else:
+ from sha import sha as _sha1
+ global _fastsha1, sha1
+ _fastsha1 = sha1 = _sha1
+ return _sha1(s)
+
+try:
+ buffer = buffer
+except NameError:
+ if sys.version_info[0] < 3:
+ def buffer(sliceable, offset=0):
+ return sliceable[offset:]
+ else:
+ def buffer(sliceable, offset=0):
+ return memoryview(sliceable)[offset:]
+
+import subprocess
+closefds = os.name == 'posix'
+
+def popen2(cmd, env=None, newlines=False):
+ # Setting bufsize to -1 lets the system decide the buffer size.
+ # The default for bufsize is 0, meaning unbuffered. This leads to
+ # poor performance on Mac OS X: http://bugs.python.org/issue4194
+ p = subprocess.Popen(cmd, shell=True, bufsize=-1,
+ close_fds=closefds,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ universal_newlines=newlines,
+ env=env)
+ return p.stdin, p.stdout
+
+def popen3(cmd, env=None, newlines=False):
+ p = subprocess.Popen(cmd, shell=True, bufsize=-1,
+ close_fds=closefds,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ universal_newlines=newlines,
+ env=env)
+ return p.stdin, p.stdout, p.stderr
+
+def version():
+ """Return version information if available."""
+ try:
+ import __version__
+ return __version__.version
+ except ImportError:
+ return 'unknown'
+
+# used by parsedate
+defaultdateformats = (
+ '%Y-%m-%d %H:%M:%S',
+ '%Y-%m-%d %I:%M:%S%p',
+ '%Y-%m-%d %H:%M',
+ '%Y-%m-%d %I:%M%p',
+ '%Y-%m-%d',
+ '%m-%d',
+ '%m/%d',
+ '%m/%d/%y',
+ '%m/%d/%Y',
+ '%a %b %d %H:%M:%S %Y',
+ '%a %b %d %I:%M:%S%p %Y',
+ '%a, %d %b %Y %H:%M:%S', # GNU coreutils "/bin/date --rfc-2822"
+ '%b %d %H:%M:%S %Y',
+ '%b %d %I:%M:%S%p %Y',
+ '%b %d %H:%M:%S',
+ '%b %d %I:%M:%S%p',
+ '%b %d %H:%M',
+ '%b %d %I:%M%p',
+ '%b %d %Y',
+ '%b %d',
+ '%H:%M:%S',
+ '%I:%M:%S%p',
+ '%H:%M',
+ '%I:%M%p',
+)
+
+extendeddateformats = defaultdateformats + (
+ "%Y",
+ "%Y-%m",
+ "%b",
+ "%b %Y",
+ )
+
+def cachefunc(func):
+ '''cache the result of function calls'''
+ # XXX doesn't handle keywords args
+ cache = {}
+ if func.func_code.co_argcount == 1:
+ # we gain a small amount of time because
+ # we don't need to pack/unpack the list
+ def f(arg):
+ if arg not in cache:
+ cache[arg] = func(arg)
+ return cache[arg]
+ else:
+ def f(*args):
+ if args not in cache:
+ cache[args] = func(*args)
+ return cache[args]
+
+ return f
+
+try:
+ collections.deque.remove
+ deque = collections.deque
+except AttributeError:
+ # python 2.4 lacks deque.remove
+ class deque(collections.deque):
+ def remove(self, val):
+ for i, v in enumerate(self):
+ if v == val:
+ del self[i]
+ break
+
+def lrucachefunc(func):
+ '''cache most recent results of function calls'''
+ cache = {}
+ order = deque()
+ if func.func_code.co_argcount == 1:
+ def f(arg):
+ if arg not in cache:
+ if len(cache) > 20:
+ del cache[order.popleft()]
+ cache[arg] = func(arg)
+ else:
+ order.remove(arg)
+ order.append(arg)
+ return cache[arg]
+ else:
+ def f(*args):
+ if args not in cache:
+ if len(cache) > 20:
+ del cache[order.popleft()]
+ cache[args] = func(*args)
+ else:
+ order.remove(args)
+ order.append(args)
+ return cache[args]
+
+ return f
+
+class propertycache(object):
+ def __init__(self, func):
+ self.func = func
+ self.name = func.__name__
+ def __get__(self, obj, type=None):
+ result = self.func(obj)
+ setattr(obj, self.name, result)
+ return result
+
+def pipefilter(s, cmd):
+ '''filter string S through command CMD, returning its output'''
+ p = subprocess.Popen(cmd, shell=True, close_fds=closefds,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ pout, perr = p.communicate(s)
+ return pout
+
+def tempfilter(s, cmd):
+ '''filter string S through a pair of temporary files with CMD.
+ CMD is used as a template to create the real command to be run,
+ with the strings INFILE and OUTFILE replaced by the real names of
+ the temporary files generated.'''
+ inname, outname = None, None
+ try:
+ infd, inname = tempfile.mkstemp(prefix='hg-filter-in-')
+ fp = os.fdopen(infd, 'wb')
+ fp.write(s)
+ fp.close()
+ outfd, outname = tempfile.mkstemp(prefix='hg-filter-out-')
+ os.close(outfd)
+ cmd = cmd.replace('INFILE', inname)
+ cmd = cmd.replace('OUTFILE', outname)
+ code = os.system(cmd)
+ if sys.platform == 'OpenVMS' and code & 1:
+ code = 0
+ if code:
+ raise Abort(_("command '%s' failed: %s") %
+ (cmd, explainexit(code)))
+ fp = open(outname, 'rb')
+ r = fp.read()
+ fp.close()
+ return r
+ finally:
+ try:
+ if inname:
+ os.unlink(inname)
+ except OSError:
+ pass
+ try:
+ if outname:
+ os.unlink(outname)
+ except OSError:
+ pass
+
+filtertable = {
+ 'tempfile:': tempfilter,
+ 'pipe:': pipefilter,
+ }
+
+def filter(s, cmd):
+ "filter a string through a command that transforms its input to its output"
+ for name, fn in filtertable.iteritems():
+ if cmd.startswith(name):
+ return fn(s, cmd[len(name):].lstrip())
+ return pipefilter(s, cmd)
+
+def binary(s):
+ """return true if a string is binary data"""
+ return bool(s and '\0' in s)
+
+def increasingchunks(source, min=1024, max=65536):
+ '''return no less than min bytes per chunk while data remains,
+ doubling min after each chunk until it reaches max'''
+ def log2(x):
+ if not x:
+ return 0
+ i = 0
+ while x:
+ x >>= 1
+ i += 1
+ return i - 1
+
+ buf = []
+ blen = 0
+ for chunk in source:
+ buf.append(chunk)
+ blen += len(chunk)
+ if blen >= min:
+ if min < max:
+ min = min << 1
+ nmin = 1 << log2(blen)
+ if nmin > min:
+ min = nmin
+ if min > max:
+ min = max
+ yield ''.join(buf)
+ blen = 0
+ buf = []
+ if buf:
+ yield ''.join(buf)
+
+Abort = error.Abort
+
+def always(fn):
+ return True
+
+def never(fn):
+ return False
+
+def pathto(root, n1, n2):
+ '''return the relative path from one place to another.
+ root should use os.sep to separate directories
+ n1 should use os.sep to separate directories
+ n2 should use "/" to separate directories
+ returns an os.sep-separated path.
+
+ If n1 is a relative path, it's assumed it's
+ relative to root.
+ n2 should always be relative to root.
+ '''
+ if not n1:
+ return localpath(n2)
+ if os.path.isabs(n1):
+ if os.path.splitdrive(root)[0] != os.path.splitdrive(n1)[0]:
+ return os.path.join(root, localpath(n2))
+ n2 = '/'.join((pconvert(root), n2))
+ a, b = splitpath(n1), n2.split('/')
+ a.reverse()
+ b.reverse()
+ while a and b and a[-1] == b[-1]:
+ a.pop()
+ b.pop()
+ b.reverse()
+ return os.sep.join((['..'] * len(a)) + b) or '.'
+
+_hgexecutable = None
+
+def mainfrozen():
+ """return True if we are a frozen executable.
+
+ The code supports py2exe (most common, Windows only) and tools/freeze
+ (portable, not much used).
+ """
+ return (safehasattr(sys, "frozen") or # new py2exe
+ safehasattr(sys, "importers") or # old py2exe
+ imp.is_frozen("__main__")) # tools/freeze
+
+def hgexecutable():
+ """return location of the 'hg' executable.
+
+ Defaults to $HG or 'hg' in the search path.
+ """
+ if _hgexecutable is None:
+ hg = os.environ.get('HG')
+ mainmod = sys.modules['__main__']
+ if hg:
+ _sethgexecutable(hg)
+ elif mainfrozen():
+ _sethgexecutable(sys.executable)
+ elif os.path.basename(getattr(mainmod, '__file__', '')) == 'hg':
+ _sethgexecutable(mainmod.__file__)
+ else:
+ exe = findexe('hg') or os.path.basename(sys.argv[0])
+ _sethgexecutable(exe)
+ return _hgexecutable
+
+def _sethgexecutable(path):
+ """set location of the 'hg' executable"""
+ global _hgexecutable
+ _hgexecutable = path
+
+def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None, out=None):
+ '''enhanced shell command execution.
+ run with environment maybe modified, maybe in different dir.
+
+ if command fails and onerr is None, return status. if ui object,
+ print error message and return status, else raise onerr object as
+ exception.
+
+ if out is specified, it is assumed to be a file-like object that has a
+ write() method. stdout and stderr will be redirected to out.'''
+ try:
+ sys.stdout.flush()
+ except Exception:
+ pass
+ def py2shell(val):
+ 'convert python object into string that is useful to shell'
+ if val is None or val is False:
+ return '0'
+ if val is True:
+ return '1'
+ return str(val)
+ origcmd = cmd
+ cmd = quotecommand(cmd)
+ if sys.platform == 'plan9':
+ # subprocess kludge to work around issues in half-baked Python
+ # ports, notably bichued/python:
+ if not cwd is None:
+ os.chdir(cwd)
+ rc = os.system(cmd)
+ else:
+ env = dict(os.environ)
+ env.update((k, py2shell(v)) for k, v in environ.iteritems())
+ env['HG'] = hgexecutable()
+ if out is None or out == sys.__stdout__:
+ rc = subprocess.call(cmd, shell=True, close_fds=closefds,
+ env=env, cwd=cwd)
+ else:
+ proc = subprocess.Popen(cmd, shell=True, close_fds=closefds,
+ env=env, cwd=cwd, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ for line in proc.stdout:
+ out.write(line)
+ proc.wait()
+ rc = proc.returncode
+ if sys.platform == 'OpenVMS' and rc & 1:
+ rc = 0
+ if rc and onerr:
+ errmsg = '%s %s' % (os.path.basename(origcmd.split(None, 1)[0]),
+ explainexit(rc)[0])
+ if errprefix:
+ errmsg = '%s: %s' % (errprefix, errmsg)
+ try:
+ onerr.warn(errmsg + '\n')
+ except AttributeError:
+ raise onerr(errmsg)
+ return rc
+
+def checksignature(func):
+ '''wrap a function with code to check for calling errors'''
+ def check(*args, **kwargs):
+ try:
+ return func(*args, **kwargs)
+ except TypeError:
+ if len(traceback.extract_tb(sys.exc_info()[2])) == 1:
+ raise error.SignatureError
+ raise
+
+ return check
+
+def copyfile(src, dest):
+ "copy a file, preserving mode and atime/mtime"
+ if os.path.islink(src):
+ try:
+ os.unlink(dest)
+ except OSError:
+ pass
+ os.symlink(os.readlink(src), dest)
+ else:
+ try:
+ shutil.copyfile(src, dest)
+ shutil.copymode(src, dest)
+ except shutil.Error, inst:
+ raise Abort(str(inst))
+
+def copyfiles(src, dst, hardlink=None):
+ """Copy a directory tree using hardlinks if possible"""
+
+ if hardlink is None:
+ hardlink = (os.stat(src).st_dev ==
+ os.stat(os.path.dirname(dst)).st_dev)
+
+ num = 0
+ if os.path.isdir(src):
+ os.mkdir(dst)
+ for name, kind in osutil.listdir(src):
+ srcname = os.path.join(src, name)
+ dstname = os.path.join(dst, name)
+ hardlink, n = copyfiles(srcname, dstname, hardlink)
+ num += n
+ else:
+ if hardlink:
+ try:
+ oslink(src, dst)
+ except (IOError, OSError):
+ hardlink = False
+ shutil.copy(src, dst)
+ else:
+ shutil.copy(src, dst)
+ num += 1
+
+ return hardlink, num
+
+_winreservednames = '''con prn aux nul
+ com1 com2 com3 com4 com5 com6 com7 com8 com9
+ lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9'''.split()
+_winreservedchars = ':*?"<>|'
+def checkwinfilename(path):
+ '''Check that the base-relative path is a valid filename on Windows.
+ Returns None if the path is ok, or a UI string describing the problem.
+
+ >>> checkwinfilename("just/a/normal/path")
+ >>> checkwinfilename("foo/bar/con.xml")
+ "filename contains 'con', which is reserved on Windows"
+ >>> checkwinfilename("foo/con.xml/bar")
+ "filename contains 'con', which is reserved on Windows"
+ >>> checkwinfilename("foo/bar/xml.con")
+ >>> checkwinfilename("foo/bar/AUX/bla.txt")
+ "filename contains 'AUX', which is reserved on Windows"
+ >>> checkwinfilename("foo/bar/bla:.txt")
+ "filename contains ':', which is reserved on Windows"
+ >>> checkwinfilename("foo/bar/b\07la.txt")
+ "filename contains '\\\\x07', which is invalid on Windows"
+ >>> checkwinfilename("foo/bar/bla ")
+ "filename ends with ' ', which is not allowed on Windows"
+ >>> checkwinfilename("../bar")
+ '''
+ for n in path.replace('\\', '/').split('/'):
+ if not n:
+ continue
+ for c in n:
+ if c in _winreservedchars:
+ return _("filename contains '%s', which is reserved "
+ "on Windows") % c
+ if ord(c) <= 31:
+ return _("filename contains %r, which is invalid "
+ "on Windows") % c
+ base = n.split('.')[0]
+ if base and base.lower() in _winreservednames:
+ return _("filename contains '%s', which is reserved "
+ "on Windows") % base
+ t = n[-1]
+ if t in '. ' and n not in '..':
+ return _("filename ends with '%s', which is not allowed "
+ "on Windows") % t
+
+if os.name == 'nt':
+ checkosfilename = checkwinfilename
+else:
+ checkosfilename = platform.checkosfilename
+
+def makelock(info, pathname):
+ try:
+ return os.symlink(info, pathname)
+ except OSError, why:
+ if why.errno == errno.EEXIST:
+ raise
+ except AttributeError: # no symlink in os
+ pass
+
+ ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
+ os.write(ld, info)
+ os.close(ld)
+
+def readlock(pathname):
+ try:
+ return os.readlink(pathname)
+ except OSError, why:
+ if why.errno not in (errno.EINVAL, errno.ENOSYS):
+ raise
+ except AttributeError: # no symlink in os
+ pass
+ fp = posixfile(pathname)
+ r = fp.read()
+ fp.close()
+ return r
+
+def fstat(fp):
+ '''stat file object that may not have fileno method.'''
+ try:
+ return os.fstat(fp.fileno())
+ except AttributeError:
+ return os.stat(fp.name)
+
+# File system features
+
+def checkcase(path):
+ """
+ Check whether the given path is on a case-sensitive filesystem
+
+ Requires a path (like /foo/.hg) ending with a foldable final
+ directory component.
+ """
+ s1 = os.stat(path)
+ d, b = os.path.split(path)
+ b2 = b.upper()
+ if b == b2:
+ b2 = b.lower()
+ if b == b2:
+ return True # no evidence against case sensitivity
+ p2 = os.path.join(d, b2)
+ try:
+ s2 = os.stat(p2)
+ if s2 == s1:
+ return False
+ return True
+ except OSError:
+ return True
+
+try:
+ import re2
+ _re2 = None
+except ImportError:
+ _re2 = False
+
+def compilere(pat):
+ '''Compile a regular expression, using re2 if possible
+
+ For best performance, use only re2-compatible regexp features.'''
+ global _re2
+ if _re2 is None:
+ try:
+ re2.compile
+ _re2 = True
+ except ImportError:
+ _re2 = False
+ if _re2:
+ try:
+ return re2.compile(pat)
+ except re2.error:
+ pass
+ return re.compile(pat)
+
+_fspathcache = {}
+def fspath(name, root):
+ '''Get name in the case stored in the filesystem
+
+ The name should be relative to root, and be normcase-ed for efficiency.
+
+ Note that this function is unnecessary, and should not be
+ called, for case-sensitive filesystems (simply because it's expensive).
+
+ The root should be normcase-ed, too.
+ '''
+ def find(p, contents):
+ for n in contents:
+ if normcase(n) == p:
+ return n
+ return None
+
+ seps = os.sep
+ if os.altsep:
+ seps = seps + os.altsep
+ # Protect backslashes. This gets silly very quickly.
+ seps.replace('\\','\\\\')
+ pattern = re.compile(r'([^%s]+)|([%s]+)' % (seps, seps))
+ dir = os.path.normpath(root)
+ result = []
+ for part, sep in pattern.findall(name):
+ if sep:
+ result.append(sep)
+ continue
+
+ if dir not in _fspathcache:
+ _fspathcache[dir] = os.listdir(dir)
+ contents = _fspathcache[dir]
+
+ found = find(part, contents)
+ if not found:
+ # retry "once per directory" per "dirstate.walk" which
+ # may take place for each patches of "hg qpush", for example
+ contents = os.listdir(dir)
+ _fspathcache[dir] = contents
+ found = find(part, contents)
+
+ result.append(found or part)
+ dir = os.path.join(dir, part)
+
+ return ''.join(result)
+
+def checknlink(testfile):
+ '''check whether hardlink count reporting works properly'''
+
+ # testfile may be open, so we need a separate file for checking to
+ # work around issue2543 (or testfile may get lost on Samba shares)
+ f1 = testfile + ".hgtmp1"
+ if os.path.lexists(f1):
+ return False
+ try:
+ posixfile(f1, 'w').close()
+ except IOError:
+ return False
+
+ f2 = testfile + ".hgtmp2"
+ fd = None
+ try:
+ try:
+ oslink(f1, f2)
+ except OSError:
+ return False
+
+ # nlinks() may behave differently for files on Windows shares if
+ # the file is open.
+ fd = posixfile(f2)
+ return nlinks(f2) > 1
+ finally:
+ if fd is not None:
+ fd.close()
+ for f in (f1, f2):
+ try:
+ os.unlink(f)
+ except OSError:
+ pass
+
+ return False
+
+def endswithsep(path):
+ '''Check path ends with os.sep or os.altsep.'''
+ return path.endswith(os.sep) or os.altsep and path.endswith(os.altsep)
+
+def splitpath(path):
+ '''Split path by os.sep.
+ Note that this function does not use os.altsep because this is
+ an alternative of simple "xxx.split(os.sep)".
+ It is recommended to use os.path.normpath() before using this
+ function if need.'''
+ return path.split(os.sep)
+
+def gui():
+ '''Are we running in a GUI?'''
+ if sys.platform == 'darwin':
+ if 'SSH_CONNECTION' in os.environ:
+ # handle SSH access to a box where the user is logged in
+ return False
+ elif getattr(osutil, 'isgui', None):
+ # check if a CoreGraphics session is available
+ return osutil.isgui()
+ else:
+ # pure build; use a safe default
+ return True
+ else:
+ return os.name == "nt" or os.environ.get("DISPLAY")
+
+def mktempcopy(name, emptyok=False, createmode=None):
+ """Create a temporary file with the same contents from name
+
+ The permission bits are copied from the original file.
+
+ If the temporary file is going to be truncated immediately, you
+ can use emptyok=True as an optimization.
+
+ Returns the name of the temporary file.
+ """
+ d, fn = os.path.split(name)
+ fd, temp = tempfile.mkstemp(prefix='.%s-' % fn, dir=d)
+ os.close(fd)
+ # Temporary files are created with mode 0600, which is usually not
+ # what we want. If the original file already exists, just copy
+ # its mode. Otherwise, manually obey umask.
+ copymode(name, temp, createmode)
+ if emptyok:
+ return temp
+ try:
+ try:
+ ifp = posixfile(name, "rb")
+ except IOError, inst:
+ if inst.errno == errno.ENOENT:
+ return temp
+ if not getattr(inst, 'filename', None):
+ inst.filename = name
+ raise
+ ofp = posixfile(temp, "wb")
+ for chunk in filechunkiter(ifp):
+ ofp.write(chunk)
+ ifp.close()
+ ofp.close()
+ except: # re-raises
+ try: os.unlink(temp)
+ except OSError: pass
+ raise
+ return temp
+
+class atomictempfile(object):
+ '''writeable file object that atomically updates a file
+
+ All writes will go to a temporary copy of the original file. Call
+ close() when you are done writing, and atomictempfile will rename
+ the temporary copy to the original name, making the changes
+ visible. If the object is destroyed without being closed, all your
+ writes are discarded.
+ '''
+ def __init__(self, name, mode='w+b', createmode=None):
+ self.__name = name # permanent name
+ self._tempname = mktempcopy(name, emptyok=('w' in mode),
+ createmode=createmode)
+ self._fp = posixfile(self._tempname, mode)
+
+ # delegated methods
+ self.write = self._fp.write
+ self.seek = self._fp.seek
+ self.tell = self._fp.tell
+ self.fileno = self._fp.fileno
+
+ def close(self):
+ if not self._fp.closed:
+ self._fp.close()
+ rename(self._tempname, localpath(self.__name))
+
+ def discard(self):
+ if not self._fp.closed:
+ try:
+ os.unlink(self._tempname)
+ except OSError:
+ pass
+ self._fp.close()
+
+ def __del__(self):
+ if safehasattr(self, '_fp'): # constructor actually did something
+ self.discard()
+
+def makedirs(name, mode=None):
+ """recursive directory creation with parent mode inheritance"""
+ try:
+ os.mkdir(name)
+ except OSError, err:
+ if err.errno == errno.EEXIST:
+ return
+ if err.errno != errno.ENOENT or not name:
+ raise
+ parent = os.path.dirname(os.path.abspath(name))
+ if parent == name:
+ raise
+ makedirs(parent, mode)
+ os.mkdir(name)
+ if mode is not None:
+ os.chmod(name, mode)
+
+def readfile(path):
+ fp = open(path, 'rb')
+ try:
+ return fp.read()
+ finally:
+ fp.close()
+
+def writefile(path, text):
+ fp = open(path, 'wb')
+ try:
+ fp.write(text)
+ finally:
+ fp.close()
+
+def appendfile(path, text):
+ fp = open(path, 'ab')
+ try:
+ fp.write(text)
+ finally:
+ fp.close()
+
+class chunkbuffer(object):
+ """Allow arbitrary sized chunks of data to be efficiently read from an
+ iterator over chunks of arbitrary size."""
+
+ def __init__(self, in_iter):
+ """in_iter is the iterator that's iterating over the input chunks.
+ targetsize is how big a buffer to try to maintain."""
+ def splitbig(chunks):
+ for chunk in chunks:
+ if len(chunk) > 2**20:
+ pos = 0
+ while pos < len(chunk):
+ end = pos + 2 ** 18
+ yield chunk[pos:end]
+ pos = end
+ else:
+ yield chunk
+ self.iter = splitbig(in_iter)
+ self._queue = deque()
+
+ def read(self, l):
+ """Read L bytes of data from the iterator of chunks of data.
+ Returns less than L bytes if the iterator runs dry."""
+ left = l
+ buf = ''
+ queue = self._queue
+ while left > 0:
+ # refill the queue
+ if not queue:
+ target = 2**18
+ for chunk in self.iter:
+ queue.append(chunk)
+ target -= len(chunk)
+ if target <= 0:
+ break
+ if not queue:
+ break
+
+ chunk = queue.popleft()
+ left -= len(chunk)
+ if left < 0:
+ queue.appendleft(chunk[left:])
+ buf += chunk[:left]
+ else:
+ buf += chunk
+
+ return buf
+
+def filechunkiter(f, size=65536, limit=None):
+ """Create a generator that produces the data in the file size
+ (default 65536) bytes at a time, up to optional limit (default is
+ to read all data). Chunks may be less than size bytes if the
+ chunk is the last chunk in the file, or the file is a socket or
+ some other type of file that sometimes reads less data than is
+ requested."""
+ assert size >= 0
+ assert limit is None or limit >= 0
+ while True:
+ if limit is None:
+ nbytes = size
+ else:
+ nbytes = min(limit, size)
+ s = nbytes and f.read(nbytes)
+ if not s:
+ break
+ if limit:
+ limit -= len(s)
+ yield s
+
+def makedate():
+ ct = time.time()
+ if ct < 0:
+ hint = _("check your clock")
+ raise Abort(_("negative timestamp: %d") % ct, hint=hint)
+ delta = (datetime.datetime.utcfromtimestamp(ct) -
+ datetime.datetime.fromtimestamp(ct))
+ tz = delta.days * 86400 + delta.seconds
+ return ct, tz
+
+def datestr(date=None, format='%a %b %d %H:%M:%S %Y %1%2'):
+ """represent a (unixtime, offset) tuple as a localized time.
+ unixtime is seconds since the epoch, and offset is the time zone's
+ number of seconds away from UTC. if timezone is false, do not
+ append time zone to string."""
+ t, tz = date or makedate()
+ if t < 0:
+ t = 0 # time.gmtime(lt) fails on Windows for lt < -43200
+ tz = 0
+ if "%1" in format or "%2" in format:
+ sign = (tz > 0) and "-" or "+"
+ minutes = abs(tz) // 60
+ format = format.replace("%1", "%c%02d" % (sign, minutes // 60))
+ format = format.replace("%2", "%02d" % (minutes % 60))
+ try:
+ t = time.gmtime(float(t) - tz)
+ except ValueError:
+ # time was out of range
+ t = time.gmtime(sys.maxint)
+ s = time.strftime(format, t)
+ return s
+
+def shortdate(date=None):
+ """turn (timestamp, tzoff) tuple into iso 8631 date."""
+ return datestr(date, format='%Y-%m-%d')
+
+def strdate(string, format, defaults=[]):
+ """parse a localized time string and return a (unixtime, offset) tuple.
+ if the string cannot be parsed, ValueError is raised."""
+ def timezone(string):
+ tz = string.split()[-1]
+ if tz[0] in "+-" and len(tz) == 5 and tz[1:].isdigit():
+ sign = (tz[0] == "+") and 1 or -1
+ hours = int(tz[1:3])
+ minutes = int(tz[3:5])
+ return -sign * (hours * 60 + minutes) * 60
+ if tz == "GMT" or tz == "UTC":
+ return 0
+ return None
+
+ # NOTE: unixtime = localunixtime + offset
+ offset, date = timezone(string), string
+ if offset is not None:
+ date = " ".join(string.split()[:-1])
+
+ # add missing elements from defaults
+ usenow = False # default to using biased defaults
+ for part in ("S", "M", "HI", "d", "mb", "yY"): # decreasing specificity
+ found = [True for p in part if ("%"+p) in format]
+ if not found:
+ date += "@" + defaults[part][usenow]
+ format += "@%" + part[0]
+ else:
+ # We've found a specific time element, less specific time
+ # elements are relative to today
+ usenow = True
+
+ timetuple = time.strptime(date, format)
+ localunixtime = int(calendar.timegm(timetuple))
+ if offset is None:
+ # local timezone
+ unixtime = int(time.mktime(timetuple))
+ offset = unixtime - localunixtime
+ else:
+ unixtime = localunixtime + offset
+ return unixtime, offset
+
+def parsedate(date, formats=None, bias={}):
+ """parse a localized date/time and return a (unixtime, offset) tuple.
+
+ The date may be a "unixtime offset" string or in one of the specified
+ formats. If the date already is a (unixtime, offset) tuple, it is returned.
+ """
+ if not date:
+ return 0, 0
+ if isinstance(date, tuple) and len(date) == 2:
+ return date
+ if not formats:
+ formats = defaultdateformats
+ date = date.strip()
+ try:
+ when, offset = map(int, date.split(' '))
+ except ValueError:
+ # fill out defaults
+ now = makedate()
+ defaults = {}
+ for part in ("d", "mb", "yY", "HI", "M", "S"):
+ # this piece is for rounding the specific end of unknowns
+ b = bias.get(part)
+ if b is None:
+ if part[0] in "HMS":
+ b = "00"
+ else:
+ b = "0"
+
+ # this piece is for matching the generic end to today's date
+ n = datestr(now, "%" + part[0])
+
+ defaults[part] = (b, n)
+
+ for format in formats:
+ try:
+ when, offset = strdate(date, format, defaults)
+ except (ValueError, OverflowError):
+ pass
+ else:
+ break
+ else:
+ raise Abort(_('invalid date: %r') % date)
+ # validate explicit (probably user-specified) date and
+ # time zone offset. values must fit in signed 32 bits for
+ # current 32-bit linux runtimes. timezones go from UTC-12
+ # to UTC+14
+ if abs(when) > 0x7fffffff:
+ raise Abort(_('date exceeds 32 bits: %d') % when)
+ if when < 0:
+ raise Abort(_('negative date value: %d') % when)
+ if offset < -50400 or offset > 43200:
+ raise Abort(_('impossible time zone offset: %d') % offset)
+ return when, offset
+
+def matchdate(date):
+ """Return a function that matches a given date match specifier
+
+ Formats include:
+
+ '{date}' match a given date to the accuracy provided
+
+ '<{date}' on or before a given date
+
+ '>{date}' on or after a given date
+
+ >>> p1 = parsedate("10:29:59")
+ >>> p2 = parsedate("10:30:00")
+ >>> p3 = parsedate("10:30:59")
+ >>> p4 = parsedate("10:31:00")
+ >>> p5 = parsedate("Sep 15 10:30:00 1999")
+ >>> f = matchdate("10:30")
+ >>> f(p1[0])
+ False
+ >>> f(p2[0])
+ True
+ >>> f(p3[0])
+ True
+ >>> f(p4[0])
+ False
+ >>> f(p5[0])
+ False
+ """
+
+ def lower(date):
+ d = dict(mb="1", d="1")
+ return parsedate(date, extendeddateformats, d)[0]
+
+ def upper(date):
+ d = dict(mb="12", HI="23", M="59", S="59")
+ for days in ("31", "30", "29"):
+ try:
+ d["d"] = days
+ return parsedate(date, extendeddateformats, d)[0]
+ except Abort:
+ pass
+ d["d"] = "28"
+ return parsedate(date, extendeddateformats, d)[0]
+
+ date = date.strip()
+
+ if not date:
+ raise Abort(_("dates cannot consist entirely of whitespace"))
+ elif date[0] == "<":
+ if not date[1:]:
+ raise Abort(_("invalid day spec, use '<DATE'"))
+ when = upper(date[1:])
+ return lambda x: x <= when
+ elif date[0] == ">":
+ if not date[1:]:
+ raise Abort(_("invalid day spec, use '>DATE'"))
+ when = lower(date[1:])
+ return lambda x: x >= when
+ elif date[0] == "-":
+ try:
+ days = int(date[1:])
+ except ValueError:
+ raise Abort(_("invalid day spec: %s") % date[1:])
+ if days < 0:
+ raise Abort(_("%s must be nonnegative (see 'hg help dates')")
+ % date[1:])
+ when = makedate()[0] - days * 3600 * 24
+ return lambda x: x >= when
+ elif " to " in date:
+ a, b = date.split(" to ")
+ start, stop = lower(a), upper(b)
+ return lambda x: x >= start and x <= stop
+ else:
+ start, stop = lower(date), upper(date)
+ return lambda x: x >= start and x <= stop
+
+def shortuser(user):
+ """Return a short representation of a user name or email address."""
+ f = user.find('@')
+ if f >= 0:
+ user = user[:f]
+ f = user.find('<')
+ if f >= 0:
+ user = user[f + 1:]
+ f = user.find(' ')
+ if f >= 0:
+ user = user[:f]
+ f = user.find('.')
+ if f >= 0:
+ user = user[:f]
+ return user
+
+def emailuser(user):
+ """Return the user portion of an email address."""
+ f = user.find('@')
+ if f >= 0:
+ user = user[:f]
+ f = user.find('<')
+ if f >= 0:
+ user = user[f + 1:]
+ return user
+
+def email(author):
+ '''get email of author.'''
+ r = author.find('>')
+ if r == -1:
+ r = None
+ return author[author.find('<') + 1:r]
+
+def _ellipsis(text, maxlength):
+ if len(text) <= maxlength:
+ return text, False
+ else:
+ return "%s..." % (text[:maxlength - 3]), True
+
+def ellipsis(text, maxlength=400):
+ """Trim string to at most maxlength (default: 400) characters."""
+ try:
+ # use unicode not to split at intermediate multi-byte sequence
+ utext, truncated = _ellipsis(text.decode(encoding.encoding),
+ maxlength)
+ if not truncated:
+ return text
+ return utext.encode(encoding.encoding)
+ except (UnicodeDecodeError, UnicodeEncodeError):
+ return _ellipsis(text, maxlength)[0]
+
+_byteunits = (
+ (100, 1 << 30, _('%.0f GB')),
+ (10, 1 << 30, _('%.1f GB')),
+ (1, 1 << 30, _('%.2f GB')),
+ (100, 1 << 20, _('%.0f MB')),
+ (10, 1 << 20, _('%.1f MB')),
+ (1, 1 << 20, _('%.2f MB')),
+ (100, 1 << 10, _('%.0f KB')),
+ (10, 1 << 10, _('%.1f KB')),
+ (1, 1 << 10, _('%.2f KB')),
+ (1, 1, _('%.0f bytes')),
+ )
+
+def bytecount(nbytes):
+ '''return byte count formatted as readable string, with units'''
+
+ for multiplier, divisor, format in _byteunits:
+ if nbytes >= divisor * multiplier:
+ return format % (nbytes / float(divisor))
+ return _byteunits[-1][2] % nbytes
+
+def uirepr(s):
+ # Avoid double backslash in Windows path repr()
+ return repr(s).replace('\\\\', '\\')
+
+# delay import of textwrap
+def MBTextWrapper(**kwargs):
+ class tw(textwrap.TextWrapper):
+ """
+ Extend TextWrapper for width-awareness.
+
+ Neither number of 'bytes' in any encoding nor 'characters' is
+ appropriate to calculate terminal columns for specified string.
+
+ Original TextWrapper implementation uses built-in 'len()' directly,
+ so overriding is needed to use width information of each characters.
+
+ In addition, characters classified into 'ambiguous' width are
+ treated as wide in east asian area, but as narrow in other.
+
+ This requires use decision to determine width of such characters.
+ """
+ def __init__(self, **kwargs):
+ textwrap.TextWrapper.__init__(self, **kwargs)
+
+ # for compatibility between 2.4 and 2.6
+ if getattr(self, 'drop_whitespace', None) is None:
+ self.drop_whitespace = kwargs.get('drop_whitespace', True)
+
+ def _cutdown(self, ucstr, space_left):
+ l = 0
+ colwidth = encoding.ucolwidth
+ for i in xrange(len(ucstr)):
+ l += colwidth(ucstr[i])
+ if space_left < l:
+ return (ucstr[:i], ucstr[i:])
+ return ucstr, ''
+
+ # overriding of base class
+ def _handle_long_word(self, reversed_chunks, cur_line, cur_len, width):
+ space_left = max(width - cur_len, 1)
+
+ if self.break_long_words:
+ cut, res = self._cutdown(reversed_chunks[-1], space_left)
+ cur_line.append(cut)
+ reversed_chunks[-1] = res
+ elif not cur_line:
+ cur_line.append(reversed_chunks.pop())
+
+ # this overriding code is imported from TextWrapper of python 2.6
+ # to calculate columns of string by 'encoding.ucolwidth()'
+ def _wrap_chunks(self, chunks):
+ colwidth = encoding.ucolwidth
+
+ lines = []
+ if self.width <= 0:
+ raise ValueError("invalid width %r (must be > 0)" % self.width)
+
+ # Arrange in reverse order so items can be efficiently popped
+ # from a stack of chucks.
+ chunks.reverse()
+
+ while chunks:
+
+ # Start the list of chunks that will make up the current line.
+ # cur_len is just the length of all the chunks in cur_line.
+ cur_line = []
+ cur_len = 0
+
+ # Figure out which static string will prefix this line.
+ if lines:
+ indent = self.subsequent_indent
+ else:
+ indent = self.initial_indent
+
+ # Maximum width for this line.
+ width = self.width - len(indent)
+
+ # First chunk on line is whitespace -- drop it, unless this
+ # is the very beginning of the text (ie. no lines started yet).
+ if self.drop_whitespace and chunks[-1].strip() == '' and lines:
+ del chunks[-1]
+
+ while chunks:
+ l = colwidth(chunks[-1])
+
+ # Can at least squeeze this chunk onto the current line.
+ if cur_len + l <= width:
+ cur_line.append(chunks.pop())
+ cur_len += l
+
+ # Nope, this line is full.
+ else:
+ break
+
+ # The current line is full, and the next chunk is too big to
+ # fit on *any* line (not just this one).
+ if chunks and colwidth(chunks[-1]) > width:
+ self._handle_long_word(chunks, cur_line, cur_len, width)
+
+ # If the last chunk on this line is all whitespace, drop it.
+ if (self.drop_whitespace and
+ cur_line and cur_line[-1].strip() == ''):
+ del cur_line[-1]
+
+ # Convert current line back to a string and store it in list
+ # of all lines (return value).
+ if cur_line:
+ lines.append(indent + ''.join(cur_line))
+
+ return lines
+
+ global MBTextWrapper
+ MBTextWrapper = tw
+ return tw(**kwargs)
+
+def wrap(line, width, initindent='', hangindent=''):
+ maxindent = max(len(hangindent), len(initindent))
+ if width <= maxindent:
+ # adjust for weird terminal size
+ width = max(78, maxindent + 1)
+ line = line.decode(encoding.encoding, encoding.encodingmode)
+ initindent = initindent.decode(encoding.encoding, encoding.encodingmode)
+ hangindent = hangindent.decode(encoding.encoding, encoding.encodingmode)
+ wrapper = MBTextWrapper(width=width,
+ initial_indent=initindent,
+ subsequent_indent=hangindent)
+ return wrapper.fill(line).encode(encoding.encoding)
+
+def iterlines(iterator):
+ for chunk in iterator:
+ for line in chunk.splitlines():
+ yield line
+
+def expandpath(path):
+ return os.path.expanduser(os.path.expandvars(path))
+
+def hgcmd():
+ """Return the command used to execute current hg
+
+ This is different from hgexecutable() because on Windows we want
+ to avoid things opening new shell windows like batch files, so we
+ get either the python call or current executable.
+ """
+ if mainfrozen():
+ return [sys.executable]
+ return gethgcmd()
+
+def rundetached(args, condfn):
+ """Execute the argument list in a detached process.
+
+ condfn is a callable which is called repeatedly and should return
+ True once the child process is known to have started successfully.
+ At this point, the child process PID is returned. If the child
+ process fails to start or finishes before condfn() evaluates to
+ True, return -1.
+ """
+ # Windows case is easier because the child process is either
+ # successfully starting and validating the condition or exiting
+ # on failure. We just poll on its PID. On Unix, if the child
+ # process fails to start, it will be left in a zombie state until
+ # the parent wait on it, which we cannot do since we expect a long
+ # running process on success. Instead we listen for SIGCHLD telling
+ # us our child process terminated.
+ terminated = set()
+ def handler(signum, frame):
+ terminated.add(os.wait())
+ prevhandler = None
+ SIGCHLD = getattr(signal, 'SIGCHLD', None)
+ if SIGCHLD is not None:
+ prevhandler = signal.signal(SIGCHLD, handler)
+ try:
+ pid = spawndetached(args)
+ while not condfn():
+ if ((pid in terminated or not testpid(pid))
+ and not condfn()):
+ return -1
+ time.sleep(0.1)
+ return pid
+ finally:
+ if prevhandler is not None:
+ signal.signal(signal.SIGCHLD, prevhandler)
+
+try:
+ any, all = any, all
+except NameError:
+ def any(iterable):
+ for i in iterable:
+ if i:
+ return True
+ return False
+
+ def all(iterable):
+ for i in iterable:
+ if not i:
+ return False
+ return True
+
+def interpolate(prefix, mapping, s, fn=None, escape_prefix=False):
+ """Return the result of interpolating items in the mapping into string s.
+
+ prefix is a single character string, or a two character string with
+ a backslash as the first character if the prefix needs to be escaped in
+ a regular expression.
+
+ fn is an optional function that will be applied to the replacement text
+ just before replacement.
+
+ escape_prefix is an optional flag that allows using doubled prefix for
+ its escaping.
+ """
+ fn = fn or (lambda s: s)
+ patterns = '|'.join(mapping.keys())
+ if escape_prefix:
+ patterns += '|' + prefix
+ if len(prefix) > 1:
+ prefix_char = prefix[1:]
+ else:
+ prefix_char = prefix
+ mapping[prefix_char] = prefix_char
+ r = re.compile(r'%s(%s)' % (prefix, patterns))
+ return r.sub(lambda x: fn(mapping[x.group()[1:]]), s)
+
+def getport(port):
+ """Return the port for a given network service.
+
+ If port is an integer, it's returned as is. If it's a string, it's
+ looked up using socket.getservbyname(). If there's no matching
+ service, util.Abort is raised.
+ """
+ try:
+ return int(port)
+ except ValueError:
+ pass
+
+ try:
+ return socket.getservbyname(port)
+ except socket.error:
+ raise Abort(_("no port number associated with service '%s'") % port)
+
+_booleans = {'1': True, 'yes': True, 'true': True, 'on': True, 'always': True,
+ '0': False, 'no': False, 'false': False, 'off': False,
+ 'never': False}
+
+def parsebool(s):
+ """Parse s into a boolean.
+
+ If s is not a valid boolean, returns None.
+ """
+ return _booleans.get(s.lower(), None)
+
+_hexdig = '0123456789ABCDEFabcdef'
+_hextochr = dict((a + b, chr(int(a + b, 16)))
+ for a in _hexdig for b in _hexdig)
+
+def _urlunquote(s):
+ """unquote('abc%20def') -> 'abc def'."""
+ res = s.split('%')
+ # fastpath
+ if len(res) == 1:
+ return s
+ s = res[0]
+ for item in res[1:]:
+ try:
+ s += _hextochr[item[:2]] + item[2:]
+ except KeyError:
+ s += '%' + item
+ except UnicodeDecodeError:
+ s += unichr(int(item[:2], 16)) + item[2:]
+ return s
+
+class url(object):
+ r"""Reliable URL parser.
+
+ This parses URLs and provides attributes for the following
+ components:
+
+ <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment>
+
+ Missing components are set to None. The only exception is
+ fragment, which is set to '' if present but empty.
+
+ If parsefragment is False, fragment is included in query. If
+ parsequery is False, query is included in path. If both are
+ False, both fragment and query are included in path.
+
+ See http://www.ietf.org/rfc/rfc2396.txt for more information.
+
+ Note that for backward compatibility reasons, bundle URLs do not
+ take host names. That means 'bundle://../' has a path of '../'.
+
+ Examples:
+
+ >>> url('http://www.ietf.org/rfc/rfc2396.txt')
+ <url scheme: 'http', host: 'www.ietf.org', path: 'rfc/rfc2396.txt'>
+ >>> url('ssh://[::1]:2200//home/joe/repo')
+ <url scheme: 'ssh', host: '[::1]', port: '2200', path: '/home/joe/repo'>
+ >>> url('file:///home/joe/repo')
+ <url scheme: 'file', path: '/home/joe/repo'>
+ >>> url('file:///c:/temp/foo/')
+ <url scheme: 'file', path: 'c:/temp/foo/'>
+ >>> url('bundle:foo')
+ <url scheme: 'bundle', path: 'foo'>
+ >>> url('bundle://../foo')
+ <url scheme: 'bundle', path: '../foo'>
+ >>> url(r'c:\foo\bar')
+ <url path: 'c:\\foo\\bar'>
+ >>> url(r'\\blah\blah\blah')
+ <url path: '\\\\blah\\blah\\blah'>
+ >>> url(r'\\blah\blah\blah#baz')
+ <url path: '\\\\blah\\blah\\blah', fragment: 'baz'>
+
+ Authentication credentials:
+
+ >>> url('ssh://joe:xyz@x/repo')
+ <url scheme: 'ssh', user: 'joe', passwd: 'xyz', host: 'x', path: 'repo'>
+ >>> url('ssh://joe@x/repo')
+ <url scheme: 'ssh', user: 'joe', host: 'x', path: 'repo'>
+
+ Query strings and fragments:
+
+ >>> url('http://host/a?b#c')
+ <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
+ >>> url('http://host/a?b#c', parsequery=False, parsefragment=False)
+ <url scheme: 'http', host: 'host', path: 'a?b#c'>
+ """
+
+ _safechars = "!~*'()+"
+ _safepchars = "/!~*'()+:"
+ _matchscheme = re.compile(r'^[a-zA-Z0-9+.\-]+:').match
+
+ def __init__(self, path, parsequery=True, parsefragment=True):
+ # We slowly chomp away at path until we have only the path left
+ self.scheme = self.user = self.passwd = self.host = None
+ self.port = self.path = self.query = self.fragment = None
+ self._localpath = True
+ self._hostport = ''
+ self._origpath = path
+
+ if parsefragment and '#' in path:
+ path, self.fragment = path.split('#', 1)
+ if not path:
+ path = None
+
+ # special case for Windows drive letters and UNC paths
+ if hasdriveletter(path) or path.startswith(r'\\'):
+ self.path = path
+ return
+
+ # For compatibility reasons, we can't handle bundle paths as
+ # normal URLS
+ if path.startswith('bundle:'):
+ self.scheme = 'bundle'
+ path = path[7:]
+ if path.startswith('//'):
+ path = path[2:]
+ self.path = path
+ return
+
+ if self._matchscheme(path):
+ parts = path.split(':', 1)
+ if parts[0]:
+ self.scheme, path = parts
+ self._localpath = False
+
+ if not path:
+ path = None
+ if self._localpath:
+ self.path = ''
+ return
+ else:
+ if self._localpath:
+ self.path = path
+ return
+
+ if parsequery and '?' in path:
+ path, self.query = path.split('?', 1)
+ if not path:
+ path = None
+ if not self.query:
+ self.query = None
+
+ # // is required to specify a host/authority
+ if path and path.startswith('//'):
+ parts = path[2:].split('/', 1)
+ if len(parts) > 1:
+ self.host, path = parts
+ path = path
+ else:
+ self.host = parts[0]
+ path = None
+ if not self.host:
+ self.host = None
+ # path of file:///d is /d
+ # path of file:///d:/ is d:/, not /d:/
+ if path and not hasdriveletter(path):
+ path = '/' + path
+
+ if self.host and '@' in self.host:
+ self.user, self.host = self.host.rsplit('@', 1)
+ if ':' in self.user:
+ self.user, self.passwd = self.user.split(':', 1)
+ if not self.host:
+ self.host = None
+
+ # Don't split on colons in IPv6 addresses without ports
+ if (self.host and ':' in self.host and
+ not (self.host.startswith('[') and self.host.endswith(']'))):
+ self._hostport = self.host
+ self.host, self.port = self.host.rsplit(':', 1)
+ if not self.host:
+ self.host = None
+
+ if (self.host and self.scheme == 'file' and
+ self.host not in ('localhost', '127.0.0.1', '[::1]')):
+ raise Abort(_('file:// URLs can only refer to localhost'))
+
+ self.path = path
+
+ # leave the query string escaped
+ for a in ('user', 'passwd', 'host', 'port',
+ 'path', 'fragment'):
+ v = getattr(self, a)
+ if v is not None:
+ setattr(self, a, _urlunquote(v))
+
+ def __repr__(self):
+ attrs = []
+ for a in ('scheme', 'user', 'passwd', 'host', 'port', 'path',
+ 'query', 'fragment'):
+ v = getattr(self, a)
+ if v is not None:
+ attrs.append('%s: %r' % (a, v))
+ return '<url %s>' % ', '.join(attrs)
+
+ def __str__(self):
+ r"""Join the URL's components back into a URL string.
+
+ Examples:
+
+ >>> str(url('http://user:pw@host:80/c:/bob?fo:oo#ba:ar'))
+ 'http://user:pw@host:80/c:/bob?fo:oo#ba:ar'
+ >>> str(url('http://user:pw@host:80/?foo=bar&baz=42'))
+ 'http://user:pw@host:80/?foo=bar&baz=42'
+ >>> str(url('http://user:pw@host:80/?foo=bar%3dbaz'))
+ 'http://user:pw@host:80/?foo=bar%3dbaz'
+ >>> str(url('ssh://user:pw@[::1]:2200//home/joe#'))
+ 'ssh://user:pw@[::1]:2200//home/joe#'
+ >>> str(url('http://localhost:80//'))
+ 'http://localhost:80//'
+ >>> str(url('http://localhost:80/'))
+ 'http://localhost:80/'
+ >>> str(url('http://localhost:80'))
+ 'http://localhost:80/'
+ >>> str(url('bundle:foo'))
+ 'bundle:foo'
+ >>> str(url('bundle://../foo'))
+ 'bundle:../foo'
+ >>> str(url('path'))
+ 'path'
+ >>> str(url('file:///tmp/foo/bar'))
+ 'file:///tmp/foo/bar'
+ >>> str(url('file:///c:/tmp/foo/bar'))
+ 'file:///c:/tmp/foo/bar'
+ >>> print url(r'bundle:foo\bar')
+ bundle:foo\bar
+ """
+ if self._localpath:
+ s = self.path
+ if self.scheme == 'bundle':
+ s = 'bundle:' + s
+ if self.fragment:
+ s += '#' + self.fragment
+ return s
+
+ s = self.scheme + ':'
+ if self.user or self.passwd or self.host:
+ s += '//'
+ elif self.scheme and (not self.path or self.path.startswith('/')
+ or hasdriveletter(self.path)):
+ s += '//'
+ if hasdriveletter(self.path):
+ s += '/'
+ if self.user:
+ s += urllib.quote(self.user, safe=self._safechars)
+ if self.passwd:
+ s += ':' + urllib.quote(self.passwd, safe=self._safechars)
+ if self.user or self.passwd:
+ s += '@'
+ if self.host:
+ if not (self.host.startswith('[') and self.host.endswith(']')):
+ s += urllib.quote(self.host)
+ else:
+ s += self.host
+ if self.port:
+ s += ':' + urllib.quote(self.port)
+ if self.host:
+ s += '/'
+ if self.path:
+ # TODO: similar to the query string, we should not unescape the
+ # path when we store it, the path might contain '%2f' = '/',
+ # which we should *not* escape.
+ s += urllib.quote(self.path, safe=self._safepchars)
+ if self.query:
+ # we store the query in escaped form.
+ s += '?' + self.query
+ if self.fragment is not None:
+ s += '#' + urllib.quote(self.fragment, safe=self._safepchars)
+ return s
+
+ def authinfo(self):
+ user, passwd = self.user, self.passwd
+ try:
+ self.user, self.passwd = None, None
+ s = str(self)
+ finally:
+ self.user, self.passwd = user, passwd
+ if not self.user:
+ return (s, None)
+ # authinfo[1] is passed to urllib2 password manager, and its
+ # URIs must not contain credentials. The host is passed in the
+ # URIs list because Python < 2.4.3 uses only that to search for
+ # a password.
+ return (s, (None, (s, self.host),
+ self.user, self.passwd or ''))
+
+ def isabs(self):
+ if self.scheme and self.scheme != 'file':
+ return True # remote URL
+ if hasdriveletter(self.path):
+ return True # absolute for our purposes - can't be joined()
+ if self.path.startswith(r'\\'):
+ return True # Windows UNC path
+ if self.path.startswith('/'):
+ return True # POSIX-style
+ return False
+
+ def localpath(self):
+ if self.scheme == 'file' or self.scheme == 'bundle':
+ path = self.path or '/'
+ # For Windows, we need to promote hosts containing drive
+ # letters to paths with drive letters.
+ if hasdriveletter(self._hostport):
+ path = self._hostport + '/' + self.path
+ elif (self.host is not None and self.path
+ and not hasdriveletter(path)):
+ path = '/' + path
+ return path
+ return self._origpath
+
+def hasscheme(path):
+ return bool(url(path).scheme)
+
+def hasdriveletter(path):
+ return path and path[1:2] == ':' and path[0:1].isalpha()
+
+def urllocalpath(path):
+ return url(path, parsequery=False, parsefragment=False).localpath()
+
+def hidepassword(u):
+ '''hide user credential in a url string'''
+ u = url(u)
+ if u.passwd:
+ u.passwd = '***'
+ return str(u)
+
+def removeauth(u):
+ '''remove all authentication information from a url string'''
+ u = url(u)
+ u.user = u.passwd = None
+ return str(u)
+
+def isatty(fd):
+ try:
+ return fd.isatty()
+ except AttributeError:
+ return False
diff --git a/mercurial/verify.py b/mercurial/verify.py
new file mode 100644
index 0000000..eb31faf
--- /dev/null
+++ b/mercurial/verify.py
@@ -0,0 +1,303 @@
+# verify.py - repository integrity checking for Mercurial
+#
+# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from node import nullid, short
+from i18n import _
+import os
+import revlog, util, error
+
+def verify(repo):
+ lock = repo.lock()
+ try:
+ return _verify(repo)
+ finally:
+ lock.release()
+
+def _verify(repo):
+ mflinkrevs = {}
+ filelinkrevs = {}
+ filenodes = {}
+ revisions = 0
+ badrevs = set()
+ errors = [0]
+ warnings = [0]
+ ui = repo.ui
+ cl = repo.changelog
+ mf = repo.manifest
+ lrugetctx = util.lrucachefunc(repo.changectx)
+
+ if not repo.cancopy():
+ raise util.Abort(_("cannot verify bundle or remote repos"))
+
+ def err(linkrev, msg, filename=None):
+ if linkrev is not None:
+ badrevs.add(linkrev)
+ else:
+ linkrev = '?'
+ msg = "%s: %s" % (linkrev, msg)
+ if filename:
+ msg = "%s@%s" % (filename, msg)
+ ui.warn(" " + msg + "\n")
+ errors[0] += 1
+
+ def exc(linkrev, msg, inst, filename=None):
+ if isinstance(inst, KeyboardInterrupt):
+ ui.warn(_("interrupted"))
+ raise
+ if not str(inst):
+ inst = repr(inst)
+ err(linkrev, "%s: %s" % (msg, inst), filename)
+
+ def warn(msg):
+ ui.warn(msg + "\n")
+ warnings[0] += 1
+
+ def checklog(obj, name, linkrev):
+ if not len(obj) and (havecl or havemf):
+ err(linkrev, _("empty or missing %s") % name)
+ return
+
+ d = obj.checksize()
+ if d[0]:
+ err(None, _("data length off by %d bytes") % d[0], name)
+ if d[1]:
+ err(None, _("index contains %d extra bytes") % d[1], name)
+
+ if obj.version != revlog.REVLOGV0:
+ if not revlogv1:
+ warn(_("warning: `%s' uses revlog format 1") % name)
+ elif revlogv1:
+ warn(_("warning: `%s' uses revlog format 0") % name)
+
+ def checkentry(obj, i, node, seen, linkrevs, f):
+ lr = obj.linkrev(obj.rev(node))
+ if lr < 0 or (havecl and lr not in linkrevs):
+ if lr < 0 or lr >= len(cl):
+ msg = _("rev %d points to nonexistent changeset %d")
+ else:
+ msg = _("rev %d points to unexpected changeset %d")
+ err(None, msg % (i, lr), f)
+ if linkrevs:
+ if f and len(linkrevs) > 1:
+ try:
+ # attempt to filter down to real linkrevs
+ linkrevs = [l for l in linkrevs
+ if lrugetctx(l)[f].filenode() == node]
+ except Exception:
+ pass
+ warn(_(" (expected %s)") % " ".join(map(str, linkrevs)))
+ lr = None # can't be trusted
+
+ try:
+ p1, p2 = obj.parents(node)
+ if p1 not in seen and p1 != nullid:
+ err(lr, _("unknown parent 1 %s of %s") %
+ (short(p1), short(n)), f)
+ if p2 not in seen and p2 != nullid:
+ err(lr, _("unknown parent 2 %s of %s") %
+ (short(p2), short(p1)), f)
+ except Exception, inst:
+ exc(lr, _("checking parents of %s") % short(node), inst, f)
+
+ if node in seen:
+ err(lr, _("duplicate revision %d (%d)") % (i, seen[n]), f)
+ seen[n] = i
+ return lr
+
+ if os.path.exists(repo.sjoin("journal")):
+ ui.warn(_("abandoned transaction found - run hg recover\n"))
+
+ revlogv1 = cl.version != revlog.REVLOGV0
+ if ui.verbose or not revlogv1:
+ ui.status(_("repository uses revlog format %d\n") %
+ (revlogv1 and 1 or 0))
+
+ havecl = len(cl) > 0
+ havemf = len(mf) > 0
+
+ ui.status(_("checking changesets\n"))
+ seen = {}
+ checklog(cl, "changelog", 0)
+ total = len(repo)
+ for i in repo:
+ ui.progress(_('checking'), i, total=total, unit=_('changesets'))
+ n = cl.node(i)
+ checkentry(cl, i, n, seen, [i], "changelog")
+
+ try:
+ changes = cl.read(n)
+ mflinkrevs.setdefault(changes[0], []).append(i)
+ for f in changes[3]:
+ filelinkrevs.setdefault(f, []).append(i)
+ except Exception, inst:
+ exc(i, _("unpacking changeset %s") % short(n), inst)
+ ui.progress(_('checking'), None)
+
+ ui.status(_("checking manifests\n"))
+ seen = {}
+ checklog(mf, "manifest", 0)
+ total = len(mf)
+ for i in mf:
+ ui.progress(_('checking'), i, total=total, unit=_('manifests'))
+ n = mf.node(i)
+ lr = checkentry(mf, i, n, seen, mflinkrevs.get(n, []), "manifest")
+ if n in mflinkrevs:
+ del mflinkrevs[n]
+ else:
+ err(lr, _("%s not in changesets") % short(n), "manifest")
+
+ try:
+ for f, fn in mf.readdelta(n).iteritems():
+ if not f:
+ err(lr, _("file without name in manifest"))
+ elif f != "/dev/null":
+ filenodes.setdefault(f, {}).setdefault(fn, lr)
+ except Exception, inst:
+ exc(lr, _("reading manifest delta %s") % short(n), inst)
+ ui.progress(_('checking'), None)
+
+ ui.status(_("crosschecking files in changesets and manifests\n"))
+
+ total = len(mflinkrevs) + len(filelinkrevs) + len(filenodes)
+ count = 0
+ if havemf:
+ for c, m in sorted([(c, m) for m in mflinkrevs
+ for c in mflinkrevs[m]]):
+ count += 1
+ if m == nullid:
+ continue
+ ui.progress(_('crosschecking'), count, total=total)
+ err(c, _("changeset refers to unknown manifest %s") % short(m))
+ mflinkrevs = None # del is bad here due to scope issues
+
+ for f in sorted(filelinkrevs):
+ count += 1
+ ui.progress(_('crosschecking'), count, total=total)
+ if f not in filenodes:
+ lr = filelinkrevs[f][0]
+ err(lr, _("in changeset but not in manifest"), f)
+
+ if havecl:
+ for f in sorted(filenodes):
+ count += 1
+ ui.progress(_('crosschecking'), count, total=total)
+ if f not in filelinkrevs:
+ try:
+ fl = repo.file(f)
+ lr = min([fl.linkrev(fl.rev(n)) for n in filenodes[f]])
+ except Exception:
+ lr = None
+ err(lr, _("in manifest but not in changeset"), f)
+
+ ui.progress(_('crosschecking'), None)
+
+ ui.status(_("checking files\n"))
+
+ storefiles = set()
+ for f, f2, size in repo.store.datafiles():
+ if not f:
+ err(None, _("cannot decode filename '%s'") % f2)
+ elif size > 0 or not revlogv1:
+ storefiles.add(f)
+
+ files = sorted(set(filenodes) | set(filelinkrevs))
+ total = len(files)
+ for i, f in enumerate(files):
+ ui.progress(_('checking'), i, item=f, total=total)
+ try:
+ linkrevs = filelinkrevs[f]
+ except KeyError:
+ # in manifest but not in changelog
+ linkrevs = []
+
+ if linkrevs:
+ lr = linkrevs[0]
+ else:
+ lr = None
+
+ try:
+ fl = repo.file(f)
+ except error.RevlogError, e:
+ err(lr, _("broken revlog! (%s)") % e, f)
+ continue
+
+ for ff in fl.files():
+ try:
+ storefiles.remove(ff)
+ except KeyError:
+ err(lr, _("missing revlog!"), ff)
+
+ checklog(fl, f, lr)
+ seen = {}
+ rp = None
+ for i in fl:
+ revisions += 1
+ n = fl.node(i)
+ lr = checkentry(fl, i, n, seen, linkrevs, f)
+ if f in filenodes:
+ if havemf and n not in filenodes[f]:
+ err(lr, _("%s not in manifests") % (short(n)), f)
+ else:
+ del filenodes[f][n]
+
+ # verify contents
+ try:
+ l = len(fl.read(n))
+ rp = fl.renamed(n)
+ if l != fl.size(i):
+ if len(fl.revision(n)) != fl.size(i):
+ err(lr, _("unpacked size is %s, %s expected") %
+ (l, fl.size(i)), f)
+ except Exception, inst:
+ exc(lr, _("unpacking %s") % short(n), inst, f)
+
+ # check renames
+ try:
+ if rp:
+ if lr is not None and ui.verbose:
+ ctx = lrugetctx(lr)
+ found = False
+ for pctx in ctx.parents():
+ if rp[0] in pctx:
+ found = True
+ break
+ if not found:
+ warn(_("warning: copy source of '%s' not"
+ " in parents of %s") % (f, ctx))
+ fl2 = repo.file(rp[0])
+ if not len(fl2):
+ err(lr, _("empty or missing copy source revlog %s:%s")
+ % (rp[0], short(rp[1])), f)
+ elif rp[1] == nullid:
+ ui.note(_("warning: %s@%s: copy source"
+ " revision is nullid %s:%s\n")
+ % (f, lr, rp[0], short(rp[1])))
+ else:
+ fl2.rev(rp[1])
+ except Exception, inst:
+ exc(lr, _("checking rename of %s") % short(n), inst, f)
+
+ # cross-check
+ if f in filenodes:
+ fns = [(lr, n) for n, lr in filenodes[f].iteritems()]
+ for lr, node in sorted(fns):
+ err(lr, _("%s in manifests not found") % short(node), f)
+ ui.progress(_('checking'), None)
+
+ for f in storefiles:
+ warn(_("warning: orphan revlog '%s'") % f)
+
+ ui.status(_("%d files, %d changesets, %d total revisions\n") %
+ (len(files), len(cl), revisions))
+ if warnings[0]:
+ ui.warn(_("%d warnings encountered!\n") % warnings[0])
+ if errors[0]:
+ ui.warn(_("%d integrity errors encountered!\n") % errors[0])
+ if badrevs:
+ ui.warn(_("(first damaged changeset appears to be %d)\n")
+ % min(badrevs))
+ return 1
diff --git a/mercurial/win32.py b/mercurial/win32.py
new file mode 100644
index 0000000..6b3650f
--- /dev/null
+++ b/mercurial/win32.py
@@ -0,0 +1,393 @@
+# win32.py - utility functions that use win32 API
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import ctypes, errno, os, subprocess, random
+
+_kernel32 = ctypes.windll.kernel32
+_advapi32 = ctypes.windll.advapi32
+_user32 = ctypes.windll.user32
+
+_BOOL = ctypes.c_long
+_WORD = ctypes.c_ushort
+_DWORD = ctypes.c_ulong
+_UINT = ctypes.c_uint
+_LONG = ctypes.c_long
+_LPCSTR = _LPSTR = ctypes.c_char_p
+_HANDLE = ctypes.c_void_p
+_HWND = _HANDLE
+
+_INVALID_HANDLE_VALUE = _HANDLE(-1).value
+
+# GetLastError
+_ERROR_SUCCESS = 0
+_ERROR_INVALID_PARAMETER = 87
+_ERROR_INSUFFICIENT_BUFFER = 122
+
+# WPARAM is defined as UINT_PTR (unsigned type)
+# LPARAM is defined as LONG_PTR (signed type)
+if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):
+ _WPARAM = ctypes.c_ulong
+ _LPARAM = ctypes.c_long
+elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):
+ _WPARAM = ctypes.c_ulonglong
+ _LPARAM = ctypes.c_longlong
+
+class _FILETIME(ctypes.Structure):
+ _fields_ = [('dwLowDateTime', _DWORD),
+ ('dwHighDateTime', _DWORD)]
+
+class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
+ _fields_ = [('dwFileAttributes', _DWORD),
+ ('ftCreationTime', _FILETIME),
+ ('ftLastAccessTime', _FILETIME),
+ ('ftLastWriteTime', _FILETIME),
+ ('dwVolumeSerialNumber', _DWORD),
+ ('nFileSizeHigh', _DWORD),
+ ('nFileSizeLow', _DWORD),
+ ('nNumberOfLinks', _DWORD),
+ ('nFileIndexHigh', _DWORD),
+ ('nFileIndexLow', _DWORD)]
+
+# CreateFile
+_FILE_SHARE_READ = 0x00000001
+_FILE_SHARE_WRITE = 0x00000002
+_FILE_SHARE_DELETE = 0x00000004
+
+_OPEN_EXISTING = 3
+
+_FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
+
+# SetFileAttributes
+_FILE_ATTRIBUTE_NORMAL = 0x80
+_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
+
+# Process Security and Access Rights
+_PROCESS_QUERY_INFORMATION = 0x0400
+
+# GetExitCodeProcess
+_STILL_ACTIVE = 259
+
+class _STARTUPINFO(ctypes.Structure):
+ _fields_ = [('cb', _DWORD),
+ ('lpReserved', _LPSTR),
+ ('lpDesktop', _LPSTR),
+ ('lpTitle', _LPSTR),
+ ('dwX', _DWORD),
+ ('dwY', _DWORD),
+ ('dwXSize', _DWORD),
+ ('dwYSize', _DWORD),
+ ('dwXCountChars', _DWORD),
+ ('dwYCountChars', _DWORD),
+ ('dwFillAttribute', _DWORD),
+ ('dwFlags', _DWORD),
+ ('wShowWindow', _WORD),
+ ('cbReserved2', _WORD),
+ ('lpReserved2', ctypes.c_char_p),
+ ('hStdInput', _HANDLE),
+ ('hStdOutput', _HANDLE),
+ ('hStdError', _HANDLE)]
+
+class _PROCESS_INFORMATION(ctypes.Structure):
+ _fields_ = [('hProcess', _HANDLE),
+ ('hThread', _HANDLE),
+ ('dwProcessId', _DWORD),
+ ('dwThreadId', _DWORD)]
+
+_CREATE_NO_WINDOW = 0x08000000
+_SW_HIDE = 0
+
+class _COORD(ctypes.Structure):
+ _fields_ = [('X', ctypes.c_short),
+ ('Y', ctypes.c_short)]
+
+class _SMALL_RECT(ctypes.Structure):
+ _fields_ = [('Left', ctypes.c_short),
+ ('Top', ctypes.c_short),
+ ('Right', ctypes.c_short),
+ ('Bottom', ctypes.c_short)]
+
+class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
+ _fields_ = [('dwSize', _COORD),
+ ('dwCursorPosition', _COORD),
+ ('wAttributes', _WORD),
+ ('srWindow', _SMALL_RECT),
+ ('dwMaximumWindowSize', _COORD)]
+
+_STD_ERROR_HANDLE = _DWORD(-12).value
+
+# types of parameters of C functions used (required by pypy)
+
+_kernel32.CreateFileA.argtypes = [_LPCSTR, _DWORD, _DWORD, ctypes.c_void_p,
+ _DWORD, _DWORD, _HANDLE]
+_kernel32.CreateFileA.restype = _HANDLE
+
+_kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p]
+_kernel32.GetFileInformationByHandle.restype = _BOOL
+
+_kernel32.CloseHandle.argtypes = [_HANDLE]
+_kernel32.CloseHandle.restype = _BOOL
+
+try:
+ _kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p]
+ _kernel32.CreateHardLinkA.restype = _BOOL
+except AttributeError:
+ pass
+
+_kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD]
+_kernel32.SetFileAttributesA.restype = _BOOL
+
+_kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD]
+_kernel32.OpenProcess.restype = _HANDLE
+
+_kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p]
+_kernel32.GetExitCodeProcess.restype = _BOOL
+
+_kernel32.GetLastError.argtypes = []
+_kernel32.GetLastError.restype = _DWORD
+
+_kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD]
+_kernel32.GetModuleFileNameA.restype = _DWORD
+
+_kernel32.CreateProcessA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p,
+ ctypes.c_void_p, _BOOL, _DWORD, ctypes.c_void_p, _LPCSTR, ctypes.c_void_p,
+ ctypes.c_void_p]
+_kernel32.CreateProcessA.restype = _BOOL
+
+_kernel32.ExitProcess.argtypes = [_UINT]
+_kernel32.ExitProcess.restype = None
+
+_kernel32.GetCurrentProcessId.argtypes = []
+_kernel32.GetCurrentProcessId.restype = _DWORD
+
+_SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
+_kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL]
+_kernel32.SetConsoleCtrlHandler.restype = _BOOL
+
+_kernel32.GetStdHandle.argtypes = [_DWORD]
+_kernel32.GetStdHandle.restype = _HANDLE
+
+_kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p]
+_kernel32.GetConsoleScreenBufferInfo.restype = _BOOL
+
+_advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
+_advapi32.GetUserNameA.restype = _BOOL
+
+_user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p]
+_user32.GetWindowThreadProcessId.restype = _DWORD
+
+_user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int]
+_user32.ShowWindow.restype = _BOOL
+
+_WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
+_user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM]
+_user32.EnumWindows.restype = _BOOL
+
+def _raiseoserror(name):
+ err = ctypes.WinError()
+ raise OSError(err.errno, '%s: %s' % (name, err.strerror))
+
+def _getfileinfo(name):
+ fh = _kernel32.CreateFileA(name, 0,
+ _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
+ None, _OPEN_EXISTING, _FILE_FLAG_BACKUP_SEMANTICS, None)
+ if fh == _INVALID_HANDLE_VALUE:
+ _raiseoserror(name)
+ try:
+ fi = _BY_HANDLE_FILE_INFORMATION()
+ if not _kernel32.GetFileInformationByHandle(fh, ctypes.byref(fi)):
+ _raiseoserror(name)
+ return fi
+ finally:
+ _kernel32.CloseHandle(fh)
+
+def oslink(src, dst):
+ try:
+ if not _kernel32.CreateHardLinkA(dst, src, None):
+ _raiseoserror(src)
+ except AttributeError: # Wine doesn't support this function
+ _raiseoserror(src)
+
+def nlinks(name):
+ '''return number of hardlinks for the given file'''
+ return _getfileinfo(name).nNumberOfLinks
+
+def samefile(path1, path2):
+ '''Returns whether path1 and path2 refer to the same file or directory.'''
+ res1 = _getfileinfo(path1)
+ res2 = _getfileinfo(path2)
+ return (res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
+ and res1.nFileIndexHigh == res2.nFileIndexHigh
+ and res1.nFileIndexLow == res2.nFileIndexLow)
+
+def samedevice(path1, path2):
+ '''Returns whether path1 and path2 are on the same device.'''
+ res1 = _getfileinfo(path1)
+ res2 = _getfileinfo(path2)
+ return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
+
+def testpid(pid):
+ '''return True if pid is still running or unable to
+ determine, False otherwise'''
+ h = _kernel32.OpenProcess(_PROCESS_QUERY_INFORMATION, False, pid)
+ if h:
+ try:
+ status = _DWORD()
+ if _kernel32.GetExitCodeProcess(h, ctypes.byref(status)):
+ return status.value == _STILL_ACTIVE
+ finally:
+ _kernel32.CloseHandle(h)
+ return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
+
+def executablepath():
+ '''return full path of hg.exe'''
+ size = 600
+ buf = ctypes.create_string_buffer(size + 1)
+ len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size)
+ if len == 0:
+ raise ctypes.WinError
+ elif len == size:
+ raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
+ return buf.value
+
+def getuser():
+ '''return name of current user'''
+ size = _DWORD(300)
+ buf = ctypes.create_string_buffer(size.value + 1)
+ if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)):
+ raise ctypes.WinError
+ return buf.value
+
+_signalhandler = []
+
+def setsignalhandler():
+ '''Register a termination handler for console events including
+ CTRL+C. python signal handlers do not work well with socket
+ operations.
+ '''
+ def handler(event):
+ _kernel32.ExitProcess(1)
+
+ if _signalhandler:
+ return # already registered
+ h = _SIGNAL_HANDLER(handler)
+ _signalhandler.append(h) # needed to prevent garbage collection
+ if not _kernel32.SetConsoleCtrlHandler(h, True):
+ raise ctypes.WinError
+
+def hidewindow():
+
+ def callback(hwnd, pid):
+ wpid = _DWORD()
+ _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid))
+ if pid == wpid.value:
+ _user32.ShowWindow(hwnd, _SW_HIDE)
+ return False # stop enumerating windows
+ return True
+
+ pid = _kernel32.GetCurrentProcessId()
+ _user32.EnumWindows(_WNDENUMPROC(callback), pid)
+
+def termwidth():
+ # cmd.exe does not handle CR like a unix console, the CR is
+ # counted in the line length. On 80 columns consoles, if 80
+ # characters are written, the following CR won't apply on the
+ # current line but on the new one. Keep room for it.
+ width = 79
+ # Query stderr to avoid problems with redirections
+ screenbuf = _kernel32.GetStdHandle(
+ _STD_ERROR_HANDLE) # don't close the handle returned
+ if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
+ return width
+ csbi = _CONSOLE_SCREEN_BUFFER_INFO()
+ if not _kernel32.GetConsoleScreenBufferInfo(
+ screenbuf, ctypes.byref(csbi)):
+ return width
+ width = csbi.srWindow.Right - csbi.srWindow.Left
+ return width
+
+def spawndetached(args):
+ # No standard library function really spawns a fully detached
+ # process under win32 because they allocate pipes or other objects
+ # to handle standard streams communications. Passing these objects
+ # to the child process requires handle inheritance to be enabled
+ # which makes really detached processes impossible.
+ si = _STARTUPINFO()
+ si.cb = ctypes.sizeof(_STARTUPINFO)
+
+ pi = _PROCESS_INFORMATION()
+
+ env = ''
+ for k in os.environ:
+ env += "%s=%s\0" % (k, os.environ[k])
+ if not env:
+ env = '\0'
+ env += '\0'
+
+ args = subprocess.list2cmdline(args)
+ # Not running the command in shell mode makes python26 hang when
+ # writing to hgweb output socket.
+ comspec = os.environ.get("COMSPEC", "cmd.exe")
+ args = comspec + " /c " + args
+
+ res = _kernel32.CreateProcessA(
+ None, args, None, None, False, _CREATE_NO_WINDOW,
+ env, os.getcwd(), ctypes.byref(si), ctypes.byref(pi))
+ if not res:
+ raise ctypes.WinError
+
+ return pi.dwProcessId
+
+def unlink(f):
+ '''try to implement POSIX' unlink semantics on Windows'''
+
+ # POSIX allows to unlink and rename open files. Windows has serious
+ # problems with doing that:
+ # - Calling os.unlink (or os.rename) on a file f fails if f or any
+ # hardlinked copy of f has been opened with Python's open(). There is no
+ # way such a file can be deleted or renamed on Windows (other than
+ # scheduling the delete or rename for the next reboot).
+ # - Calling os.unlink on a file that has been opened with Mercurial's
+ # posixfile (or comparable methods) will delay the actual deletion of
+ # the file for as long as the file is held open. The filename is blocked
+ # during that time and cannot be used for recreating a new file under
+ # that same name ("zombie file"). Directories containing such zombie files
+ # cannot be removed or moved.
+ # A file that has been opened with posixfile can be renamed, so we rename
+ # f to a random temporary name before calling os.unlink on it. This allows
+ # callers to recreate f immediately while having other readers do their
+ # implicit zombie filename blocking on a temporary name.
+
+ for tries in xrange(10):
+ temp = '%s-%08x' % (f, random.randint(0, 0xffffffff))
+ try:
+ os.rename(f, temp) # raises OSError EEXIST if temp exists
+ break
+ except OSError, e:
+ if e.errno != errno.EEXIST:
+ raise
+ else:
+ raise IOError, (errno.EEXIST, "No usable temporary filename found")
+
+ try:
+ os.unlink(temp)
+ except OSError:
+ # The unlink might have failed because the READONLY attribute may heave
+ # been set on the original file. Rename works fine with READONLY set,
+ # but not os.unlink. Reset all attributes and try again.
+ _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
+ try:
+ os.unlink(temp)
+ except OSError:
+ # The unlink might have failed due to some very rude AV-Scanners.
+ # Leaking a tempfile is the lesser evil than aborting here and
+ # leaving some potentially serious inconsistencies.
+ pass
+
+def makedir(path, notindexed):
+ os.mkdir(path)
+ if notindexed:
+ _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)
diff --git a/mercurial/windows.py b/mercurial/windows.py
new file mode 100644
index 0000000..aade404
--- /dev/null
+++ b/mercurial/windows.py
@@ -0,0 +1,329 @@
+# windows.py - Windows utility function implementations for Mercurial
+#
+# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from i18n import _
+import osutil, encoding
+import errno, msvcrt, os, re, sys, _winreg
+
+import win32
+executablepath = win32.executablepath
+getuser = win32.getuser
+hidewindow = win32.hidewindow
+makedir = win32.makedir
+nlinks = win32.nlinks
+oslink = win32.oslink
+samedevice = win32.samedevice
+samefile = win32.samefile
+setsignalhandler = win32.setsignalhandler
+spawndetached = win32.spawndetached
+termwidth = win32.termwidth
+testpid = win32.testpid
+unlink = win32.unlink
+
+nulldev = 'NUL:'
+umask = 0022
+
+# wrap osutil.posixfile to provide friendlier exceptions
+def posixfile(name, mode='r', buffering=-1):
+ try:
+ return osutil.posixfile(name, mode, buffering)
+ except WindowsError, err:
+ raise IOError(err.errno, '%s: %s' % (name, err.strerror))
+posixfile.__doc__ = osutil.posixfile.__doc__
+
+class winstdout(object):
+ '''stdout on windows misbehaves if sent through a pipe'''
+
+ def __init__(self, fp):
+ self.fp = fp
+
+ def __getattr__(self, key):
+ return getattr(self.fp, key)
+
+ def close(self):
+ try:
+ self.fp.close()
+ except IOError:
+ pass
+
+ def write(self, s):
+ try:
+ # This is workaround for "Not enough space" error on
+ # writing large size of data to console.
+ limit = 16000
+ l = len(s)
+ start = 0
+ self.softspace = 0
+ while start < l:
+ end = start + limit
+ self.fp.write(s[start:end])
+ start = end
+ except IOError, inst:
+ if inst.errno != 0:
+ raise
+ self.close()
+ raise IOError(errno.EPIPE, 'Broken pipe')
+
+ def flush(self):
+ try:
+ return self.fp.flush()
+ except IOError, inst:
+ if inst.errno != errno.EINVAL:
+ raise
+ self.close()
+ raise IOError(errno.EPIPE, 'Broken pipe')
+
+sys.__stdout__ = sys.stdout = winstdout(sys.stdout)
+
+def _is_win_9x():
+ '''return true if run on windows 95, 98 or me.'''
+ try:
+ return sys.getwindowsversion()[3] == 1
+ except AttributeError:
+ return 'command' in os.environ.get('comspec', '')
+
+def openhardlinks():
+ return not _is_win_9x()
+
+def parsepatchoutput(output_line):
+ """parses the output produced by patch and returns the filename"""
+ pf = output_line[14:]
+ if pf[0] == '`':
+ pf = pf[1:-1] # Remove the quotes
+ return pf
+
+def sshargs(sshcmd, host, user, port):
+ '''Build argument list for ssh or Plink'''
+ pflag = 'plink' in sshcmd.lower() and '-P' or '-p'
+ args = user and ("%s@%s" % (user, host)) or host
+ return port and ("%s %s %s" % (args, pflag, port)) or args
+
+def setflags(f, l, x):
+ pass
+
+def copymode(src, dst, mode=None):
+ pass
+
+def checkexec(path):
+ return False
+
+def checklink(path):
+ return False
+
+def setbinary(fd):
+ # When run without console, pipes may expose invalid
+ # fileno(), usually set to -1.
+ fno = getattr(fd, 'fileno', None)
+ if fno is not None and fno() >= 0:
+ msvcrt.setmode(fno(), os.O_BINARY)
+
+def pconvert(path):
+ return path.replace(os.sep, '/')
+
+def localpath(path):
+ return path.replace('/', '\\')
+
+def normpath(path):
+ return pconvert(os.path.normpath(path))
+
+def normcase(path):
+ return encoding.upper(path)
+
+def realpath(path):
+ '''
+ Returns the true, canonical file system path equivalent to the given
+ path.
+ '''
+ # TODO: There may be a more clever way to do this that also handles other,
+ # less common file systems.
+ return os.path.normpath(normcase(os.path.realpath(path)))
+
+def samestat(s1, s2):
+ return False
+
+# A sequence of backslashes is special iff it precedes a double quote:
+# - if there's an even number of backslashes, the double quote is not
+# quoted (i.e. it ends the quoted region)
+# - if there's an odd number of backslashes, the double quote is quoted
+# - in both cases, every pair of backslashes is unquoted into a single
+# backslash
+# (See http://msdn2.microsoft.com/en-us/library/a1y7w461.aspx )
+# So, to quote a string, we must surround it in double quotes, double
+# the number of backslashes that preceed double quotes and add another
+# backslash before every double quote (being careful with the double
+# quote we've appended to the end)
+_quotere = None
+def shellquote(s):
+ global _quotere
+ if _quotere is None:
+ _quotere = re.compile(r'(\\*)("|\\$)')
+ return '"%s"' % _quotere.sub(r'\1\1\\\2', s)
+
+def quotecommand(cmd):
+ """Build a command string suitable for os.popen* calls."""
+ if sys.version_info < (2, 7, 1):
+ # Python versions since 2.7.1 do this extra quoting themselves
+ return '"' + cmd + '"'
+ return cmd
+
+def popen(command, mode='r'):
+ # Work around "popen spawned process may not write to stdout
+ # under windows"
+ # http://bugs.python.org/issue1366
+ command += " 2> %s" % nulldev
+ return os.popen(quotecommand(command), mode)
+
+def explainexit(code):
+ return _("exited with status %d") % code, code
+
+# if you change this stub into a real check, please try to implement the
+# username and groupname functions above, too.
+def isowner(st):
+ return True
+
+def findexe(command):
+ '''Find executable for command searching like cmd.exe does.
+ If command is a basename then PATH is searched for command.
+ PATH isn't searched if command is an absolute or relative path.
+ An extension from PATHEXT is found and added if not present.
+ If command isn't found None is returned.'''
+ pathext = os.environ.get('PATHEXT', '.COM;.EXE;.BAT;.CMD')
+ pathexts = [ext for ext in pathext.lower().split(os.pathsep)]
+ if os.path.splitext(command)[1].lower() in pathexts:
+ pathexts = ['']
+
+ def findexisting(pathcommand):
+ 'Will append extension (if needed) and return existing file'
+ for ext in pathexts:
+ executable = pathcommand + ext
+ if os.path.exists(executable):
+ return executable
+ return None
+
+ if os.sep in command:
+ return findexisting(command)
+
+ for path in os.environ.get('PATH', '').split(os.pathsep):
+ executable = findexisting(os.path.join(path, command))
+ if executable is not None:
+ return executable
+ return findexisting(os.path.expanduser(os.path.expandvars(command)))
+
+def statfiles(files):
+ '''Stat each file in files and yield stat or None if file does not exist.
+ Cluster and cache stat per directory to minimize number of OS stat calls.'''
+ dircache = {} # dirname -> filename -> status | None if file does not exist
+ for nf in files:
+ nf = normcase(nf)
+ dir, base = os.path.split(nf)
+ if not dir:
+ dir = '.'
+ cache = dircache.get(dir, None)
+ if cache is None:
+ try:
+ dmap = dict([(normcase(n), s)
+ for n, k, s in osutil.listdir(dir, True)])
+ except OSError, err:
+ # handle directory not found in Python version prior to 2.5
+ # Python <= 2.4 returns native Windows code 3 in errno
+ # Python >= 2.5 returns ENOENT and adds winerror field
+ # EINVAL is raised if dir is not a directory.
+ if err.errno not in (3, errno.ENOENT, errno.EINVAL,
+ errno.ENOTDIR):
+ raise
+ dmap = {}
+ cache = dircache.setdefault(dir, dmap)
+ yield cache.get(base, None)
+
+def username(uid=None):
+ """Return the name of the user with the given uid.
+
+ If uid is None, return the name of the current user."""
+ return None
+
+def groupname(gid=None):
+ """Return the name of the group with the given gid.
+
+ If gid is None, return the name of the current group."""
+ return None
+
+def _removedirs(name):
+ """special version of os.removedirs that does not remove symlinked
+ directories or junction points if they actually contain files"""
+ if osutil.listdir(name):
+ return
+ os.rmdir(name)
+ head, tail = os.path.split(name)
+ if not tail:
+ head, tail = os.path.split(head)
+ while head and tail:
+ try:
+ if osutil.listdir(head):
+ return
+ os.rmdir(head)
+ except (ValueError, OSError):
+ break
+ head, tail = os.path.split(head)
+
+def unlinkpath(f):
+ """unlink and remove the directory if it is empty"""
+ unlink(f)
+ # try removing directories that might now be empty
+ try:
+ _removedirs(os.path.dirname(f))
+ except OSError:
+ pass
+
+def rename(src, dst):
+ '''atomically rename file src to dst, replacing dst if it exists'''
+ try:
+ os.rename(src, dst)
+ except OSError, e:
+ if e.errno != errno.EEXIST:
+ raise
+ unlink(dst)
+ os.rename(src, dst)
+
+def gethgcmd():
+ return [sys.executable] + sys.argv[:1]
+
+def groupmembers(name):
+ # Don't support groups on Windows for now
+ raise KeyError
+
+def isexec(f):
+ return False
+
+class cachestat(object):
+ def __init__(self, path):
+ pass
+
+ def cacheable(self):
+ return False
+
+def lookupreg(key, valname=None, scope=None):
+ ''' Look up a key/value name in the Windows registry.
+
+ valname: value name. If unspecified, the default value for the key
+ is used.
+ scope: optionally specify scope for registry lookup, this can be
+ a sequence of scopes to look up in order. Default (CURRENT_USER,
+ LOCAL_MACHINE).
+ '''
+ if scope is None:
+ scope = (_winreg.HKEY_CURRENT_USER, _winreg.HKEY_LOCAL_MACHINE)
+ elif not isinstance(scope, (list, tuple)):
+ scope = (scope,)
+ for s in scope:
+ try:
+ val = _winreg.QueryValueEx(_winreg.OpenKey(s, key), valname)[0]
+ # never let a Unicode string escape into the wild
+ return encoding.tolocal(val.encode('UTF-8'))
+ except EnvironmentError:
+ pass
+
+expandglobs = True
diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py
new file mode 100644
index 0000000..2b44fd6
--- /dev/null
+++ b/mercurial/wireproto.py
@@ -0,0 +1,619 @@
+# wireproto.py - generic wire protocol support functions
+#
+# Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+import urllib, tempfile, os, sys
+from i18n import _
+from node import bin, hex
+import changegroup as changegroupmod
+import peer, error, encoding, util, store
+import discovery, phases
+
+# abstract batching support
+
+class future(object):
+ '''placeholder for a value to be set later'''
+ def set(self, value):
+ if util.safehasattr(self, 'value'):
+ raise error.RepoError("future is already set")
+ self.value = value
+
+class batcher(object):
+ '''base class for batches of commands submittable in a single request
+
+ All methods invoked on instances of this class are simply queued and
+ return a a future for the result. Once you call submit(), all the queued
+ calls are performed and the results set in their respective futures.
+ '''
+ def __init__(self):
+ self.calls = []
+ def __getattr__(self, name):
+ def call(*args, **opts):
+ resref = future()
+ self.calls.append((name, args, opts, resref,))
+ return resref
+ return call
+ def submit(self):
+ pass
+
+class localbatch(batcher):
+ '''performs the queued calls directly'''
+ def __init__(self, local):
+ batcher.__init__(self)
+ self.local = local
+ def submit(self):
+ for name, args, opts, resref in self.calls:
+ resref.set(getattr(self.local, name)(*args, **opts))
+
+class remotebatch(batcher):
+ '''batches the queued calls; uses as few roundtrips as possible'''
+ def __init__(self, remote):
+ '''remote must support _submitbatch(encbatch) and
+ _submitone(op, encargs)'''
+ batcher.__init__(self)
+ self.remote = remote
+ def submit(self):
+ req, rsp = [], []
+ for name, args, opts, resref in self.calls:
+ mtd = getattr(self.remote, name)
+ batchablefn = getattr(mtd, 'batchable', None)
+ if batchablefn is not None:
+ batchable = batchablefn(mtd.im_self, *args, **opts)
+ encargsorres, encresref = batchable.next()
+ if encresref:
+ req.append((name, encargsorres,))
+ rsp.append((batchable, encresref, resref,))
+ else:
+ resref.set(encargsorres)
+ else:
+ if req:
+ self._submitreq(req, rsp)
+ req, rsp = [], []
+ resref.set(mtd(*args, **opts))
+ if req:
+ self._submitreq(req, rsp)
+ def _submitreq(self, req, rsp):
+ encresults = self.remote._submitbatch(req)
+ for encres, r in zip(encresults, rsp):
+ batchable, encresref, resref = r
+ encresref.set(encres)
+ resref.set(batchable.next())
+
+def batchable(f):
+ '''annotation for batchable methods
+
+ Such methods must implement a coroutine as follows:
+
+ @batchable
+ def sample(self, one, two=None):
+ # Handle locally computable results first:
+ if not one:
+ yield "a local result", None
+ # Build list of encoded arguments suitable for your wire protocol:
+ encargs = [('one', encode(one),), ('two', encode(two),)]
+ # Create future for injection of encoded result:
+ encresref = future()
+ # Return encoded arguments and future:
+ yield encargs, encresref
+ # Assuming the future to be filled with the result from the batched
+ # request now. Decode it:
+ yield decode(encresref.value)
+
+ The decorator returns a function which wraps this coroutine as a plain
+ method, but adds the original method as an attribute called "batchable",
+ which is used by remotebatch to split the call into separate encoding and
+ decoding phases.
+ '''
+ def plain(*args, **opts):
+ batchable = f(*args, **opts)
+ encargsorres, encresref = batchable.next()
+ if not encresref:
+ return encargsorres # a local result in this case
+ self = args[0]
+ encresref.set(self._submitone(f.func_name, encargsorres))
+ return batchable.next()
+ setattr(plain, 'batchable', f)
+ return plain
+
+# list of nodes encoding / decoding
+
+def decodelist(l, sep=' '):
+ if l:
+ return map(bin, l.split(sep))
+ return []
+
+def encodelist(l, sep=' '):
+ return sep.join(map(hex, l))
+
+# batched call argument encoding
+
+def escapearg(plain):
+ return (plain
+ .replace(':', '::')
+ .replace(',', ':,')
+ .replace(';', ':;')
+ .replace('=', ':='))
+
+def unescapearg(escaped):
+ return (escaped
+ .replace(':=', '=')
+ .replace(':;', ';')
+ .replace(':,', ',')
+ .replace('::', ':'))
+
+# client side
+
+def todict(**args):
+ return args
+
+class wirepeer(peer.peerrepository):
+
+ def batch(self):
+ return remotebatch(self)
+ def _submitbatch(self, req):
+ cmds = []
+ for op, argsdict in req:
+ args = ','.join('%s=%s' % p for p in argsdict.iteritems())
+ cmds.append('%s %s' % (op, args))
+ rsp = self._call("batch", cmds=';'.join(cmds))
+ return rsp.split(';')
+ def _submitone(self, op, args):
+ return self._call(op, **args)
+
+ @batchable
+ def lookup(self, key):
+ self.requirecap('lookup', _('look up remote revision'))
+ f = future()
+ yield todict(key=encoding.fromlocal(key)), f
+ d = f.value
+ success, data = d[:-1].split(" ", 1)
+ if int(success):
+ yield bin(data)
+ self._abort(error.RepoError(data))
+
+ @batchable
+ def heads(self):
+ f = future()
+ yield {}, f
+ d = f.value
+ try:
+ yield decodelist(d[:-1])
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), d))
+
+ @batchable
+ def known(self, nodes):
+ f = future()
+ yield todict(nodes=encodelist(nodes)), f
+ d = f.value
+ try:
+ yield [bool(int(f)) for f in d]
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), d))
+
+ @batchable
+ def branchmap(self):
+ f = future()
+ yield {}, f
+ d = f.value
+ try:
+ branchmap = {}
+ for branchpart in d.splitlines():
+ branchname, branchheads = branchpart.split(' ', 1)
+ branchname = encoding.tolocal(urllib.unquote(branchname))
+ branchheads = decodelist(branchheads)
+ branchmap[branchname] = branchheads
+ yield branchmap
+ except TypeError:
+ self._abort(error.ResponseError(_("unexpected response:"), d))
+
+ def branches(self, nodes):
+ n = encodelist(nodes)
+ d = self._call("branches", nodes=n)
+ try:
+ br = [tuple(decodelist(b)) for b in d.splitlines()]
+ return br
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), d))
+
+ def between(self, pairs):
+ batch = 8 # avoid giant requests
+ r = []
+ for i in xrange(0, len(pairs), batch):
+ n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]])
+ d = self._call("between", pairs=n)
+ try:
+ r.extend(l and decodelist(l) or [] for l in d.splitlines())
+ except ValueError:
+ self._abort(error.ResponseError(_("unexpected response:"), d))
+ return r
+
+ @batchable
+ def pushkey(self, namespace, key, old, new):
+ if not self.capable('pushkey'):
+ yield False, None
+ f = future()
+ self.ui.debug('preparing pushkey for "%s:%s"\n' % (namespace, key))
+ yield todict(namespace=encoding.fromlocal(namespace),
+ key=encoding.fromlocal(key),
+ old=encoding.fromlocal(old),
+ new=encoding.fromlocal(new)), f
+ d = f.value
+ d, output = d.split('\n', 1)
+ try:
+ d = bool(int(d))
+ except ValueError:
+ raise error.ResponseError(
+ _('push failed (unexpected response):'), d)
+ for l in output.splitlines(True):
+ self.ui.status(_('remote: '), l)
+ yield d
+
+ @batchable
+ def listkeys(self, namespace):
+ if not self.capable('pushkey'):
+ yield {}, None
+ f = future()
+ self.ui.debug('preparing listkeys for "%s"\n' % namespace)
+ yield todict(namespace=encoding.fromlocal(namespace)), f
+ d = f.value
+ r = {}
+ for l in d.splitlines():
+ k, v = l.split('\t')
+ r[encoding.tolocal(k)] = encoding.tolocal(v)
+ yield r
+
+ def stream_out(self):
+ return self._callstream('stream_out')
+
+ def changegroup(self, nodes, kind):
+ n = encodelist(nodes)
+ f = self._callstream("changegroup", roots=n)
+ return changegroupmod.unbundle10(self._decompress(f), 'UN')
+
+ def changegroupsubset(self, bases, heads, kind):
+ self.requirecap('changegroupsubset', _('look up remote changes'))
+ bases = encodelist(bases)
+ heads = encodelist(heads)
+ f = self._callstream("changegroupsubset",
+ bases=bases, heads=heads)
+ return changegroupmod.unbundle10(self._decompress(f), 'UN')
+
+ def getbundle(self, source, heads=None, common=None):
+ self.requirecap('getbundle', _('look up remote changes'))
+ opts = {}
+ if heads is not None:
+ opts['heads'] = encodelist(heads)
+ if common is not None:
+ opts['common'] = encodelist(common)
+ f = self._callstream("getbundle", **opts)
+ return changegroupmod.unbundle10(self._decompress(f), 'UN')
+
+ def unbundle(self, cg, heads, source):
+ '''Send cg (a readable file-like object representing the
+ changegroup to push, typically a chunkbuffer object) to the
+ remote server as a bundle. Return an integer indicating the
+ result of the push (see localrepository.addchangegroup()).'''
+
+ if heads != ['force'] and self.capable('unbundlehash'):
+ heads = encodelist(['hashed',
+ util.sha1(''.join(sorted(heads))).digest()])
+ else:
+ heads = encodelist(heads)
+
+ ret, output = self._callpush("unbundle", cg, heads=heads)
+ if ret == "":
+ raise error.ResponseError(
+ _('push failed:'), output)
+ try:
+ ret = int(ret)
+ except ValueError:
+ raise error.ResponseError(
+ _('push failed (unexpected response):'), ret)
+
+ for l in output.splitlines(True):
+ self.ui.status(_('remote: '), l)
+ return ret
+
+ def debugwireargs(self, one, two, three=None, four=None, five=None):
+ # don't pass optional arguments left at their default value
+ opts = {}
+ if three is not None:
+ opts['three'] = three
+ if four is not None:
+ opts['four'] = four
+ return self._call('debugwireargs', one=one, two=two, **opts)
+
+# server side
+
+class streamres(object):
+ def __init__(self, gen):
+ self.gen = gen
+
+class pushres(object):
+ def __init__(self, res):
+ self.res = res
+
+class pusherr(object):
+ def __init__(self, res):
+ self.res = res
+
+class ooberror(object):
+ def __init__(self, message):
+ self.message = message
+
+def dispatch(repo, proto, command):
+ func, spec = commands[command]
+ args = proto.getargs(spec)
+ return func(repo, proto, *args)
+
+def options(cmd, keys, others):
+ opts = {}
+ for k in keys:
+ if k in others:
+ opts[k] = others[k]
+ del others[k]
+ if others:
+ sys.stderr.write("abort: %s got unexpected arguments %s\n"
+ % (cmd, ",".join(others)))
+ return opts
+
+def batch(repo, proto, cmds, others):
+ res = []
+ for pair in cmds.split(';'):
+ op, args = pair.split(' ', 1)
+ vals = {}
+ for a in args.split(','):
+ if a:
+ n, v = a.split('=')
+ vals[n] = unescapearg(v)
+ func, spec = commands[op]
+ if spec:
+ keys = spec.split()
+ data = {}
+ for k in keys:
+ if k == '*':
+ star = {}
+ for key in vals.keys():
+ if key not in keys:
+ star[key] = vals[key]
+ data['*'] = star
+ else:
+ data[k] = vals[k]
+ result = func(repo, proto, *[data[k] for k in keys])
+ else:
+ result = func(repo, proto)
+ if isinstance(result, ooberror):
+ return result
+ res.append(escapearg(result))
+ return ';'.join(res)
+
+def between(repo, proto, pairs):
+ pairs = [decodelist(p, '-') for p in pairs.split(" ")]
+ r = []
+ for b in repo.between(pairs):
+ r.append(encodelist(b) + "\n")
+ return "".join(r)
+
+def branchmap(repo, proto):
+ branchmap = discovery.visiblebranchmap(repo)
+ heads = []
+ for branch, nodes in branchmap.iteritems():
+ branchname = urllib.quote(encoding.fromlocal(branch))
+ branchnodes = encodelist(nodes)
+ heads.append('%s %s' % (branchname, branchnodes))
+ return '\n'.join(heads)
+
+def branches(repo, proto, nodes):
+ nodes = decodelist(nodes)
+ r = []
+ for b in repo.branches(nodes):
+ r.append(encodelist(b) + "\n")
+ return "".join(r)
+
+def capabilities(repo, proto):
+ caps = ('lookup changegroupsubset branchmap pushkey known getbundle '
+ 'unbundlehash batch').split()
+ if _allowstream(repo.ui):
+ if repo.ui.configbool('server', 'preferuncompressed', False):
+ caps.append('stream-preferred')
+ requiredformats = repo.requirements & repo.supportedformats
+ # if our local revlogs are just revlogv1, add 'stream' cap
+ if not requiredformats - set(('revlogv1',)):
+ caps.append('stream')
+ # otherwise, add 'streamreqs' detailing our local revlog format
+ else:
+ caps.append('streamreqs=%s' % ','.join(requiredformats))
+ caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
+ caps.append('httpheader=1024')
+ return ' '.join(caps)
+
+def changegroup(repo, proto, roots):
+ nodes = decodelist(roots)
+ cg = repo.changegroup(nodes, 'serve')
+ return streamres(proto.groupchunks(cg))
+
+def changegroupsubset(repo, proto, bases, heads):
+ bases = decodelist(bases)
+ heads = decodelist(heads)
+ cg = repo.changegroupsubset(bases, heads, 'serve')
+ return streamres(proto.groupchunks(cg))
+
+def debugwireargs(repo, proto, one, two, others):
+ # only accept optional args from the known set
+ opts = options('debugwireargs', ['three', 'four'], others)
+ return repo.debugwireargs(one, two, **opts)
+
+def getbundle(repo, proto, others):
+ opts = options('getbundle', ['heads', 'common'], others)
+ for k, v in opts.iteritems():
+ opts[k] = decodelist(v)
+ cg = repo.getbundle('serve', **opts)
+ return streamres(proto.groupchunks(cg))
+
+def heads(repo, proto):
+ h = discovery.visibleheads(repo)
+ return encodelist(h) + "\n"
+
+def hello(repo, proto):
+ '''the hello command returns a set of lines describing various
+ interesting things about the server, in an RFC822-like format.
+ Currently the only one defined is "capabilities", which
+ consists of a line in the form:
+
+ capabilities: space separated list of tokens
+ '''
+ return "capabilities: %s\n" % (capabilities(repo, proto))
+
+def listkeys(repo, proto, namespace):
+ d = repo.listkeys(encoding.tolocal(namespace)).items()
+ t = '\n'.join(['%s\t%s' % (encoding.fromlocal(k), encoding.fromlocal(v))
+ for k, v in d])
+ return t
+
+def lookup(repo, proto, key):
+ try:
+ k = encoding.tolocal(key)
+ c = repo[k]
+ if c.phase() == phases.secret:
+ raise error.RepoLookupError(_("unknown revision '%s'") % k)
+ r = c.hex()
+ success = 1
+ except Exception, inst:
+ r = str(inst)
+ success = 0
+ return "%s %s\n" % (success, r)
+
+def known(repo, proto, nodes, others):
+ return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes)))
+
+def pushkey(repo, proto, namespace, key, old, new):
+ # compatibility with pre-1.8 clients which were accidentally
+ # sending raw binary nodes rather than utf-8-encoded hex
+ if len(new) == 20 and new.encode('string-escape') != new:
+ # looks like it could be a binary node
+ try:
+ new.decode('utf-8')
+ new = encoding.tolocal(new) # but cleanly decodes as UTF-8
+ except UnicodeDecodeError:
+ pass # binary, leave unmodified
+ else:
+ new = encoding.tolocal(new) # normal path
+
+ r = repo.pushkey(encoding.tolocal(namespace), encoding.tolocal(key),
+ encoding.tolocal(old), new)
+ return '%s\n' % int(r)
+
+def _allowstream(ui):
+ return ui.configbool('server', 'uncompressed', True, untrusted=True)
+
+def stream(repo, proto):
+ '''If the server supports streaming clone, it advertises the "stream"
+ capability with a value representing the version and flags of the repo
+ it is serving. Client checks to see if it understands the format.
+
+ The format is simple: the server writes out a line with the amount
+ of files, then the total amount of bytes to be transfered (separated
+ by a space). Then, for each file, the server first writes the filename
+ and filesize (separated by the null character), then the file contents.
+ '''
+
+ if not _allowstream(repo.ui):
+ return '1\n'
+
+ entries = []
+ total_bytes = 0
+ try:
+ # get consistent snapshot of repo, lock during scan
+ lock = repo.lock()
+ try:
+ repo.ui.debug('scanning\n')
+ for name, ename, size in repo.store.walk():
+ entries.append((name, size))
+ total_bytes += size
+ finally:
+ lock.release()
+ except error.LockError:
+ return '2\n' # error: 2
+
+ def streamer(repo, entries, total):
+ '''stream out all metadata files in repository.'''
+ yield '0\n' # success
+ repo.ui.debug('%d files, %d bytes to transfer\n' %
+ (len(entries), total_bytes))
+ yield '%d %d\n' % (len(entries), total_bytes)
+ for name, size in entries:
+ repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
+ # partially encode name over the wire for backwards compat
+ yield '%s\0%d\n' % (store.encodedir(name), size)
+ for chunk in util.filechunkiter(repo.sopener(name), limit=size):
+ yield chunk
+
+ return streamres(streamer(repo, entries, total_bytes))
+
+def unbundle(repo, proto, heads):
+ their_heads = decodelist(heads)
+
+ def check_heads():
+ heads = discovery.visibleheads(repo)
+ heads_hash = util.sha1(''.join(sorted(heads))).digest()
+ return (their_heads == ['force'] or their_heads == heads or
+ their_heads == ['hashed', heads_hash])
+
+ proto.redirect()
+
+ # fail early if possible
+ if not check_heads():
+ return pusherr('unsynced changes')
+
+ # write bundle data to temporary file because it can be big
+ fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
+ fp = os.fdopen(fd, 'wb+')
+ r = 0
+ try:
+ proto.getfile(fp)
+ lock = repo.lock()
+ try:
+ if not check_heads():
+ # someone else committed/pushed/unbundled while we
+ # were transferring data
+ return pusherr('unsynced changes')
+
+ # push can proceed
+ fp.seek(0)
+ gen = changegroupmod.readbundle(fp, None)
+
+ try:
+ r = repo.addchangegroup(gen, 'serve', proto._client())
+ except util.Abort, inst:
+ sys.stderr.write("abort: %s\n" % inst)
+ finally:
+ lock.release()
+ return pushres(r)
+
+ finally:
+ fp.close()
+ os.unlink(tempname)
+
+commands = {
+ 'batch': (batch, 'cmds *'),
+ 'between': (between, 'pairs'),
+ 'branchmap': (branchmap, ''),
+ 'branches': (branches, 'nodes'),
+ 'capabilities': (capabilities, ''),
+ 'changegroup': (changegroup, 'roots'),
+ 'changegroupsubset': (changegroupsubset, 'bases heads'),
+ 'debugwireargs': (debugwireargs, 'one two *'),
+ 'getbundle': (getbundle, '*'),
+ 'heads': (heads, ''),
+ 'hello': (hello, ''),
+ 'known': (known, 'nodes *'),
+ 'listkeys': (listkeys, 'namespace'),
+ 'lookup': (lookup, 'key'),
+ 'pushkey': (pushkey, 'namespace key old new'),
+ 'stream_out': (stream, ''),
+ 'unbundle': (unbundle, 'heads'),
+}
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..33efc05
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,534 @@
+#
+# This is the mercurial setup script.
+#
+# 'python setup.py install', or
+# 'python setup.py --help' for more options
+
+import sys, platform
+if getattr(sys, 'version_info', (0, 0, 0)) < (2, 4, 0, 'final'):
+ raise SystemExit("Mercurial requires Python 2.4 or later.")
+
+if sys.version_info[0] >= 3:
+ def b(s):
+ '''A helper function to emulate 2.6+ bytes literals using string
+ literals.'''
+ return s.encode('latin1')
+else:
+ def b(s):
+ '''A helper function to emulate 2.6+ bytes literals using string
+ literals.'''
+ return s
+
+# Solaris Python packaging brain damage
+try:
+ import hashlib
+ sha = hashlib.sha1()
+except ImportError:
+ try:
+ import sha
+ except ImportError:
+ raise SystemExit(
+ "Couldn't import standard hashlib (incomplete Python install).")
+
+try:
+ import zlib
+except ImportError:
+ raise SystemExit(
+ "Couldn't import standard zlib (incomplete Python install).")
+
+# The base IronPython distribution (as of 2.7.1) doesn't support bz2
+isironpython = False
+try:
+ isironpython = (platform.python_implementation()
+ .lower().find("ironpython") != -1)
+except AttributeError:
+ pass
+
+if isironpython:
+ sys.stderr.write("warning: IronPython detected (no bz2 support)\n")
+else:
+ try:
+ import bz2
+ except ImportError:
+ raise SystemExit(
+ "Couldn't import standard bz2 (incomplete Python install).")
+
+import os, subprocess, time
+import shutil
+import tempfile
+from distutils import log
+from distutils.core import setup, Command, Extension
+from distutils.dist import Distribution
+from distutils.command.build import build
+from distutils.command.build_ext import build_ext
+from distutils.command.build_py import build_py
+from distutils.command.install_scripts import install_scripts
+from distutils.spawn import spawn, find_executable
+from distutils.ccompiler import new_compiler
+from distutils import cygwinccompiler
+from distutils.errors import CCompilerError, DistutilsExecError
+from distutils.sysconfig import get_python_inc
+from distutils.version import StrictVersion
+
+convert2to3 = '--c2to3' in sys.argv
+if convert2to3:
+ try:
+ from distutils.command.build_py import build_py_2to3 as build_py
+ from lib2to3.refactor import get_fixers_from_package as getfixers
+ except ImportError:
+ if sys.version_info[0] < 3:
+ raise SystemExit("--c2to3 is only compatible with python3.")
+ raise
+ sys.path.append('contrib')
+elif sys.version_info[0] >= 3:
+ raise SystemExit("setup.py with python3 needs --c2to3 (experimental)")
+
+scripts = ['hg']
+if os.name == 'nt':
+ scripts.append('contrib/win32/hg.bat')
+
+# simplified version of distutils.ccompiler.CCompiler.has_function
+# that actually removes its temporary files.
+def hasfunction(cc, funcname):
+ tmpdir = tempfile.mkdtemp(prefix='hg-install-')
+ devnull = oldstderr = None
+ try:
+ try:
+ fname = os.path.join(tmpdir, 'funcname.c')
+ f = open(fname, 'w')
+ f.write('int main(void) {\n')
+ f.write(' %s();\n' % funcname)
+ f.write('}\n')
+ f.close()
+ # Redirect stderr to /dev/null to hide any error messages
+ # from the compiler.
+ # This will have to be changed if we ever have to check
+ # for a function on Windows.
+ devnull = open('/dev/null', 'w')
+ oldstderr = os.dup(sys.stderr.fileno())
+ os.dup2(devnull.fileno(), sys.stderr.fileno())
+ objects = cc.compile([fname], output_dir=tmpdir)
+ cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
+ except Exception:
+ return False
+ return True
+ finally:
+ if oldstderr is not None:
+ os.dup2(oldstderr, sys.stderr.fileno())
+ if devnull is not None:
+ devnull.close()
+ shutil.rmtree(tmpdir)
+
+# py2exe needs to be installed to work
+try:
+ import py2exe
+ py2exeloaded = True
+ # import py2exe's patched Distribution class
+ from distutils.core import Distribution
+except ImportError:
+ py2exeloaded = False
+
+def runcmd(cmd, env):
+ if sys.platform == 'plan9':
+ # subprocess kludge to work around issues in half-baked Python
+ # ports, notably bichued/python:
+ _, out, err = os.popen3(cmd)
+ return str(out), str(err)
+ else:
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE, env=env)
+ out, err = p.communicate()
+ return out, err
+
+def runhg(cmd, env):
+ out, err = runcmd(cmd, env)
+ # If root is executing setup.py, but the repository is owned by
+ # another user (as in "sudo python setup.py install") we will get
+ # trust warnings since the .hg/hgrc file is untrusted. That is
+ # fine, we don't want to load it anyway. Python may warn about
+ # a missing __init__.py in mercurial/locale, we also ignore that.
+ err = [e for e in err.splitlines()
+ if not e.startswith(b('Not trusting file')) \
+ and not e.startswith(b('warning: Not importing'))]
+ if err:
+ return ''
+ return out
+
+version = ''
+
+# Execute hg out of this directory with a custom environment which
+# includes the pure Python modules in mercurial/pure. We also take
+# care to not use any hgrc files and do no localization.
+pypath = ['mercurial', os.path.join('mercurial', 'pure')]
+env = {'PYTHONPATH': os.pathsep.join(pypath),
+ 'HGRCPATH': '',
+ 'LANGUAGE': 'C'}
+if 'LD_LIBRARY_PATH' in os.environ:
+ env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
+if 'SystemRoot' in os.environ:
+ # Copy SystemRoot into the custom environment for Python 2.6
+ # under Windows. Otherwise, the subprocess will fail with
+ # error 0xc0150004. See: http://bugs.python.org/issue3440
+ env['SystemRoot'] = os.environ['SystemRoot']
+
+if os.path.isdir('.hg'):
+ cmd = [sys.executable, 'hg', 'id', '-i', '-t']
+ l = runhg(cmd, env).split()
+ while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
+ l.pop()
+ if len(l) > 1: # tag found
+ version = l[-1]
+ if l[0].endswith('+'): # propagate the dirty status to the tag
+ version += '+'
+ elif len(l) == 1: # no tag found
+ cmd = [sys.executable, 'hg', 'parents', '--template',
+ '{latesttag}+{latesttagdistance}-']
+ version = runhg(cmd, env) + l[0]
+ if version.endswith('+'):
+ version += time.strftime('%Y%m%d')
+elif os.path.exists('.hg_archival.txt'):
+ kw = dict([[t.strip() for t in l.split(':', 1)]
+ for l in open('.hg_archival.txt')])
+ if 'tag' in kw:
+ version = kw['tag']
+ elif 'latesttag' in kw:
+ version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
+ else:
+ version = kw.get('node', '')[:12]
+
+if version:
+ f = open("mercurial/__version__.py", "w")
+ f.write('# this file is autogenerated by setup.py\n')
+ f.write('version = "%s"\n' % version)
+ f.close()
+
+
+try:
+ from mercurial import __version__
+ version = __version__.version
+except ImportError:
+ version = 'unknown'
+
+class hgbuild(build):
+ # Insert hgbuildmo first so that files in mercurial/locale/ are found
+ # when build_py is run next.
+ sub_commands = [('build_mo', None),
+
+ # We also need build_ext before build_py. Otherwise, when 2to3 is
+ # called (in build_py), it will not find osutil & friends,
+ # thinking that those modules are global and, consequently, making
+ # a mess, now that all module imports are global.
+
+ ('build_ext', build.has_ext_modules),
+ ] + build.sub_commands
+
+class hgbuildmo(build):
+
+ description = "build translations (.mo files)"
+
+ def run(self):
+ if not find_executable('msgfmt'):
+ self.warn("could not find msgfmt executable, no translations "
+ "will be built")
+ return
+
+ podir = 'i18n'
+ if not os.path.isdir(podir):
+ self.warn("could not find %s/ directory" % podir)
+ return
+
+ join = os.path.join
+ for po in os.listdir(podir):
+ if not po.endswith('.po'):
+ continue
+ pofile = join(podir, po)
+ modir = join('locale', po[:-3], 'LC_MESSAGES')
+ mofile = join(modir, 'hg.mo')
+ mobuildfile = join('mercurial', mofile)
+ cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
+ if sys.platform != 'sunos5':
+ # msgfmt on Solaris does not know about -c
+ cmd.append('-c')
+ self.mkpath(join('mercurial', modir))
+ self.make_file([pofile], mobuildfile, spawn, (cmd,))
+
+
+class hgdist(Distribution):
+ pure = 0
+
+ global_options = Distribution.global_options + \
+ [('pure', None, "use pure (slow) Python "
+ "code instead of C extensions"),
+ ('c2to3', None, "(experimental!) convert "
+ "code with 2to3"),
+ ]
+
+ def has_ext_modules(self):
+ # self.ext_modules is emptied in hgbuildpy.finalize_options which is
+ # too late for some cases
+ return not self.pure and Distribution.has_ext_modules(self)
+
+class hgbuildext(build_ext):
+
+ def build_extension(self, ext):
+ try:
+ build_ext.build_extension(self, ext)
+ except CCompilerError:
+ if not getattr(ext, 'optional', False):
+ raise
+ log.warn("Failed to build optional extension '%s' (skipping)",
+ ext.name)
+
+class hgbuildpy(build_py):
+ if convert2to3:
+ fixer_names = sorted(set(getfixers("lib2to3.fixes") +
+ getfixers("hgfixes")))
+
+ def finalize_options(self):
+ build_py.finalize_options(self)
+
+ if self.distribution.pure:
+ if self.py_modules is None:
+ self.py_modules = []
+ for ext in self.distribution.ext_modules:
+ if ext.name.startswith("mercurial."):
+ self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
+ self.distribution.ext_modules = []
+ else:
+ if not os.path.exists(os.path.join(get_python_inc(), 'Python.h')):
+ raise SystemExit('Python headers are required to build '
+ 'Mercurial')
+
+ def find_modules(self):
+ modules = build_py.find_modules(self)
+ for module in modules:
+ if module[0] == "mercurial.pure":
+ if module[1] != "__init__":
+ yield ("mercurial", module[1], module[2])
+ else:
+ yield module
+
+class buildhgextindex(Command):
+ description = 'generate prebuilt index of hgext (for frozen package)'
+ user_options = []
+ _indexfilename = 'hgext/__index__.py'
+
+ def initialize_options(self):
+ pass
+
+ def finalize_options(self):
+ pass
+
+ def run(self):
+ if os.path.exists(self._indexfilename):
+ os.unlink(self._indexfilename)
+
+ # here no extension enabled, disabled() lists up everything
+ code = ('import pprint; from mercurial import extensions; '
+ 'pprint.pprint(extensions.disabled())')
+ out, err = runcmd([sys.executable, '-c', code], env)
+ if err:
+ raise DistutilsExecError(err)
+
+ f = open(self._indexfilename, 'w')
+ f.write('# this file is autogenerated by setup.py\n')
+ f.write('docs = ')
+ f.write(out)
+ f.close()
+
+class buildhgexe(build_ext):
+ description = 'compile hg.exe from mercurial/exewrapper.c'
+
+ def build_extensions(self):
+ if os.name != 'nt':
+ return
+ if isinstance(self.compiler, HackedMingw32CCompiler):
+ self.compiler.compiler_so = self.compiler.compiler # no -mdll
+ self.compiler.dll_libraries = [] # no -lmsrvc90
+ objects = self.compiler.compile(['mercurial/exewrapper.c'],
+ output_dir=self.build_temp)
+ dir = os.path.dirname(self.get_ext_fullpath('dummy'))
+ target = os.path.join(dir, 'hg')
+ pythonlib = ("python%d%d" %
+ (sys.hexversion >> 24, (sys.hexversion >> 16) & 0xff))
+ self.compiler.link_executable(objects, target,
+ libraries=[pythonlib],
+ output_dir=self.build_temp)
+
+class hginstallscripts(install_scripts):
+ '''
+ This is a specialization of install_scripts that replaces the @LIBDIR@ with
+ the configured directory for modules. If possible, the path is made relative
+ to the directory for scripts.
+ '''
+
+ def initialize_options(self):
+ install_scripts.initialize_options(self)
+
+ self.install_lib = None
+
+ def finalize_options(self):
+ install_scripts.finalize_options(self)
+ self.set_undefined_options('install',
+ ('install_lib', 'install_lib'))
+
+ def run(self):
+ install_scripts.run(self)
+
+ if (os.path.splitdrive(self.install_dir)[0] !=
+ os.path.splitdrive(self.install_lib)[0]):
+ # can't make relative paths from one drive to another, so use an
+ # absolute path instead
+ libdir = self.install_lib
+ else:
+ common = os.path.commonprefix((self.install_dir, self.install_lib))
+ rest = self.install_dir[len(common):]
+ uplevel = len([n for n in os.path.split(rest) if n])
+
+ libdir = uplevel * ('..' + os.sep) + self.install_lib[len(common):]
+
+ for outfile in self.outfiles:
+ fp = open(outfile, 'rb')
+ data = fp.read()
+ fp.close()
+
+ # skip binary files
+ if b('\0') in data:
+ continue
+
+ data = data.replace('@LIBDIR@', libdir.encode('string_escape'))
+ fp = open(outfile, 'wb')
+ fp.write(data)
+ fp.close()
+
+cmdclass = {'build': hgbuild,
+ 'build_mo': hgbuildmo,
+ 'build_ext': hgbuildext,
+ 'build_py': hgbuildpy,
+ 'build_hgextindex': buildhgextindex,
+ 'install_scripts': hginstallscripts,
+ 'build_hgexe': buildhgexe,
+ }
+
+packages = ['mercurial', 'mercurial.hgweb', 'mercurial.httpclient',
+ 'hgext', 'hgext.convert', 'hgext.highlight', 'hgext.zeroconf',
+ 'hgext.largefiles']
+
+pymodules = []
+
+extmodules = [
+ Extension('mercurial.base85', ['mercurial/base85.c']),
+ Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
+ Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']),
+ Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
+ Extension('mercurial.parsers', ['mercurial/parsers.c']),
+ ]
+
+osutil_ldflags = []
+
+if sys.platform == 'darwin':
+ osutil_ldflags += ['-framework', 'ApplicationServices']
+
+# disable osutil.c under windows + python 2.4 (issue1364)
+if sys.platform == 'win32' and sys.version_info < (2, 5, 0, 'final'):
+ pymodules.append('mercurial.pure.osutil')
+else:
+ extmodules.append(Extension('mercurial.osutil', ['mercurial/osutil.c'],
+ extra_link_args=osutil_ldflags))
+
+# the -mno-cygwin option has been deprecated for years
+Mingw32CCompiler = cygwinccompiler.Mingw32CCompiler
+
+class HackedMingw32CCompiler(cygwinccompiler.Mingw32CCompiler):
+ def __init__(self, *args, **kwargs):
+ Mingw32CCompiler.__init__(self, *args, **kwargs)
+ for i in 'compiler compiler_so linker_exe linker_so'.split():
+ try:
+ getattr(self, i).remove('-mno-cygwin')
+ except ValueError:
+ pass
+
+cygwinccompiler.Mingw32CCompiler = HackedMingw32CCompiler
+
+if sys.platform.startswith('linux') and os.uname()[2] > '2.6':
+ # The inotify extension is only usable with Linux 2.6 kernels.
+ # You also need a reasonably recent C library.
+ # In any case, if it fails to build the error will be skipped ('optional').
+ cc = new_compiler()
+ if hasfunction(cc, 'inotify_add_watch'):
+ inotify = Extension('hgext.inotify.linux._inotify',
+ ['hgext/inotify/linux/_inotify.c'],
+ ['mercurial'])
+ inotify.optional = True
+ extmodules.append(inotify)
+ packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
+
+packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
+ 'help/*.txt']}
+
+def ordinarypath(p):
+ return p and p[0] != '.' and p[-1] != '~'
+
+for root in ('templates',):
+ for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
+ curdir = curdir.split(os.sep, 1)[1]
+ dirs[:] = filter(ordinarypath, dirs)
+ for f in filter(ordinarypath, files):
+ f = os.path.join(curdir, f)
+ packagedata['mercurial'].append(f)
+
+datafiles = []
+setupversion = version
+extra = {}
+
+if py2exeloaded:
+ extra['console'] = [
+ {'script':'hg',
+ 'copyright':'Copyright (C) 2005-2010 Matt Mackall and others',
+ 'product_version':version}]
+ # sub command of 'build' because 'py2exe' does not handle sub_commands
+ build.sub_commands.insert(0, ('build_hgextindex', None))
+
+if os.name == 'nt':
+ # Windows binary file versions for exe/dll files must have the
+ # form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535
+ setupversion = version.split('+', 1)[0]
+
+if sys.platform == 'darwin' and os.path.exists('/usr/bin/xcodebuild'):
+ # XCode 4.0 dropped support for ppc architecture, which is hardcoded in
+ # distutils.sysconfig
+ version = runcmd(['/usr/bin/xcodebuild', '-version'], {})[0].splitlines()
+ if version:
+ version = version[0]
+ xcode4 = (version.startswith('Xcode') and
+ StrictVersion(version.split()[1]) >= StrictVersion('4.0'))
+ else:
+ # xcodebuild returns empty on OS X Lion with XCode 4.3 not
+ # installed, but instead with only command-line tools. Assume
+ # that only happens on >= Lion, thus no PPC support.
+ xcode4 = True
+
+ if xcode4:
+ os.environ['ARCHFLAGS'] = ''
+
+setup(name='mercurial',
+ version=setupversion,
+ author='Matt Mackall',
+ author_email='mpm@selenic.com',
+ url='http://mercurial.selenic.com/',
+ description='Scalable distributed SCM',
+ license='GNU GPLv2+',
+ scripts=scripts,
+ packages=packages,
+ py_modules=pymodules,
+ ext_modules=extmodules,
+ data_files=datafiles,
+ package_data=packagedata,
+ cmdclass=cmdclass,
+ distclass=hgdist,
+ options=dict(py2exe=dict(packages=['hgext', 'email']),
+ bdist_mpkg=dict(zipdist=True,
+ license='COPYING',
+ readme='contrib/macosx/Readme.html',
+ welcome='contrib/macosx/Welcome.html')),
+ **extra)
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..41fe083
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,7 @@
+To run the tests, do:
+
+cd tests/
+python run-tests.py
+
+See http://mercurial.selenic.com/wiki/WritingTests for
+more information on writing tests.
diff --git a/tests/autodiff.py b/tests/autodiff.py
new file mode 100644
index 0000000..155b9a0
--- /dev/null
+++ b/tests/autodiff.py
@@ -0,0 +1,46 @@
+# Extension dedicated to test patch.diff() upgrade modes
+#
+#
+from mercurial import scmutil, patch, util
+
+def autodiff(ui, repo, *pats, **opts):
+ diffopts = patch.diffopts(ui, opts)
+ git = opts.get('git', 'no')
+ brokenfiles = set()
+ losedatafn = None
+ if git in ('yes', 'no'):
+ diffopts.git = git == 'yes'
+ diffopts.upgrade = False
+ elif git == 'auto':
+ diffopts.git = False
+ diffopts.upgrade = True
+ elif git == 'warn':
+ diffopts.git = False
+ diffopts.upgrade = True
+ def losedatafn(fn=None, **kwargs):
+ brokenfiles.add(fn)
+ return True
+ elif git == 'abort':
+ diffopts.git = False
+ diffopts.upgrade = True
+ def losedatafn(fn=None, **kwargs):
+ raise util.Abort('losing data for %s' % fn)
+ else:
+ raise util.Abort('--git must be yes, no or auto')
+
+ node1, node2 = scmutil.revpair(repo, [])
+ m = scmutil.match(repo[node2], pats, opts)
+ it = patch.diff(repo, node1, node2, match=m, opts=diffopts,
+ losedatafn=losedatafn)
+ for chunk in it:
+ ui.write(chunk)
+ for fn in sorted(brokenfiles):
+ ui.write('data lost for: %s\n' % fn)
+
+cmdtable = {
+ "autodiff":
+ (autodiff,
+ [('', 'git', '', 'git upgrade mode (yes/no/auto/warn/abort)'),
+ ],
+ '[OPTION]... [FILE]...'),
+}
diff --git a/tests/binfile.bin b/tests/binfile.bin
new file mode 100644
index 0000000..37ba3d1
--- /dev/null
+++ b/tests/binfile.bin
Binary files differ
diff --git a/tests/blacklists/README b/tests/blacklists/README
new file mode 100644
index 0000000..e72906d
--- /dev/null
+++ b/tests/blacklists/README
@@ -0,0 +1,14 @@
+Put here definitions of blacklists for run-tests.py
+
+Create a file per blacklist. Each file should list the names of tests that you
+want to be skipped.
+File names are meant to be used as targets for run-tests.py --blacklist
+option.
+Lines starting with # are ignored. White spaces are stripped.
+
+e.g. if you create a blacklist/example file containing:
+ test-hgrc
+ # some comment
+ test-help
+then calling "run-tests.py --blacklist blacklists/example" will exclude
+test-hgrc and test-help from the list of tests to run.
diff --git a/tests/blacklists/inotify-failures b/tests/blacklists/inotify-failures
new file mode 100644
index 0000000..4860e08
--- /dev/null
+++ b/tests/blacklists/inotify-failures
@@ -0,0 +1,21 @@
+# When --inotify is activated, help output and config changes:
+test-debugcomplete
+test-empty
+test-fncache
+test-globalopts
+test-help
+test-hgrc
+test-inherit-mode
+test-qrecord
+test-strict
+
+# --inotify activates de facto the inotify extension. It does not play well
+# with inotify-specific tests, which activate/desactivate inotify at will:
+test-inotify
+test-inotify-debuginotify
+test-inotify-dirty-dirstate
+test-inotify-issue1208
+test-inotify-issue1371
+test-inotify-issue1542
+test-inotify-issue1556
+test-inotify-lookup
diff --git a/tests/blacklists/linux-vfat b/tests/blacklists/linux-vfat
new file mode 100644
index 0000000..2812bf0
--- /dev/null
+++ b/tests/blacklists/linux-vfat
@@ -0,0 +1,35 @@
+# invalid filenames
+test-add.t
+test-init.t
+test-clone.t
+test-contrib.t
+test-hgweb-raw.t
+test-walk.t
+
+# no sockets or fifos
+test-hup.t
+test-inotify-debuginotify.t
+test-inotify-dirty-dirstate.t
+test-inotify-issue1208.t
+test-inotify-issue1371.t
+test-inotify-issue1542.t
+test-inotify-lookup.t
+test-inotify.t
+test-inotify-issue1556.t
+
+# no hardlinks
+test-hardlinks.t
+test-relink.t
+
+# exec bit problems
+test-convert-bzr-114.t
+test-convert-bzr-directories.t
+test-convert-bzr-merges.t
+test-convert-bzr-treeroot.t
+test-convert-darcs.t
+test-merge-tools.t
+
+# debugstate exec bit false positives
+test-dirstate.t
+test-filebranch.t
+test-merge-remove.t
diff --git a/tests/bundles/darcs1.hg b/tests/bundles/darcs1.hg
new file mode 100644
index 0000000..130d07f
--- /dev/null
+++ b/tests/bundles/darcs1.hg
Binary files differ
diff --git a/tests/bundles/legacy-encoding.hg b/tests/bundles/legacy-encoding.hg
new file mode 100644
index 0000000..b3b9b25
--- /dev/null
+++ b/tests/bundles/legacy-encoding.hg
Binary files differ
diff --git a/tests/bundles/rebase-revset.hg b/tests/bundles/rebase-revset.hg
new file mode 100644
index 0000000..2a016a3
--- /dev/null
+++ b/tests/bundles/rebase-revset.hg
Binary files differ
diff --git a/tests/bundles/rebase.hg b/tests/bundles/rebase.hg
new file mode 100644
index 0000000..69f1b6d
--- /dev/null
+++ b/tests/bundles/rebase.hg
Binary files differ
diff --git a/tests/bundles/rebase.sh b/tests/bundles/rebase.sh
new file mode 100755
index 0000000..adae27a
--- /dev/null
+++ b/tests/bundles/rebase.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+hg init rebase
+cd rebase
+
+# @ 7: 'H'
+# |
+# | o 6: 'G'
+# |/|
+# o | 5: 'F'
+# | |
+# | o 4: 'E'
+# |/
+# | o 3: 'D'
+# | |
+# | o 2: 'C'
+# | |
+# | o 1: 'B'
+# |/
+# o 0: 'A'
+
+echo A > A
+hg ci -Am A
+echo B > B
+hg ci -Am B
+echo C > C
+hg ci -Am C
+echo D > D
+hg ci -Am D
+hg up -q -C 0
+echo E > E
+hg ci -Am E
+hg up -q -C 0
+echo F > F
+hg ci -Am F
+hg merge -r 4
+hg ci -m G
+hg up -q -C 5
+echo H > H
+hg ci -Am H
+
+hg bundle -a ../rebase.hg
+
+cd ..
+rm -Rf rebase
diff --git a/tests/bundles/remote.hg b/tests/bundles/remote.hg
new file mode 100644
index 0000000..04be619
--- /dev/null
+++ b/tests/bundles/remote.hg
Binary files differ
diff --git a/tests/bundles/remote.sh b/tests/bundles/remote.sh
new file mode 100755
index 0000000..9e8d923
--- /dev/null
+++ b/tests/bundles/remote.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+hg init remote
+cd remote
+
+echo "0" >> afile
+hg add afile
+hg commit -m "0.0"
+echo "1" >> afile
+hg commit -m "0.1"
+echo "2" >> afile
+hg commit -m "0.2"
+echo "3" >> afile
+hg commit -m "0.3"
+hg update -C 0
+echo "1" >> afile
+hg commit -m "1.1"
+echo "2" >> afile
+hg commit -m "1.2"
+echo "a line" > fred
+echo "3" >> afile
+hg add fred
+hg commit -m "1.3"
+hg mv afile adifferentfile
+hg commit -m "1.3m"
+hg update -C 3
+hg mv afile anotherfile
+hg commit -m "0.3m"
+
+hg bundle -a ../remote.hg
+
+cd ..
+rm -Rf remote
diff --git a/tests/bundles/rename.sh b/tests/bundles/rename.sh
new file mode 100755
index 0000000..f8eccf8
--- /dev/null
+++ b/tests/bundles/rename.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# @ 3: 'move2'
+# |
+# o 2: 'move1'
+# |
+# | o 1: 'change'
+# |/
+# o 0: 'add'
+
+hg init copies
+cd copies
+echo a > a
+echo b > b
+echo c > c
+hg ci -Am add
+echo a >> a
+echo b >> b
+echo c >> c
+hg ci -m change
+hg up -qC 0
+hg cp a d
+hg mv b e
+hg mv c f
+hg ci -m move1
+hg mv e g
+hg mv f c
+hg ci -m move2
+hg bundle -a ../renames.hg
+cd ..
diff --git a/tests/bundles/renames.hg b/tests/bundles/renames.hg
new file mode 100644
index 0000000..977a845
--- /dev/null
+++ b/tests/bundles/renames.hg
Binary files differ
diff --git a/tests/bundles/tampered.hg b/tests/bundles/tampered.hg
new file mode 100644
index 0000000..9270540
--- /dev/null
+++ b/tests/bundles/tampered.hg
Binary files differ
diff --git a/tests/bundles/test-keyword.hg b/tests/bundles/test-keyword.hg
new file mode 100644
index 0000000..2d0305f
--- /dev/null
+++ b/tests/bundles/test-keyword.hg
Binary files differ
diff --git a/tests/bundles/test-manifest.hg b/tests/bundles/test-manifest.hg
new file mode 100644
index 0000000..6ad9b5c
--- /dev/null
+++ b/tests/bundles/test-manifest.hg
Binary files differ
diff --git a/tests/bundles/test-merge-symlinks.hg b/tests/bundles/test-merge-symlinks.hg
new file mode 100644
index 0000000..2e1bb7d
--- /dev/null
+++ b/tests/bundles/test-merge-symlinks.hg
Binary files differ
diff --git a/tests/bundles/test-no-symlinks.hg b/tests/bundles/test-no-symlinks.hg
new file mode 100644
index 0000000..6c4b94a
--- /dev/null
+++ b/tests/bundles/test-no-symlinks.hg
Binary files differ
diff --git a/tests/bzr-definitions b/tests/bzr-definitions
new file mode 100644
index 0000000..5e9895f
--- /dev/null
+++ b/tests/bzr-definitions
@@ -0,0 +1,19 @@
+# this file holds the definitions that are used in various bzr tests
+
+"$TESTDIR/hghave" bzr || exit 80
+
+TERM=dumb; export TERM
+echo '[extensions]' >> $HGRCPATH
+echo 'convert = ' >> $HGRCPATH
+echo 'hgext.graphlog = ' >> $HGRCPATH
+
+glog()
+{
+ hg glog --template '{rev}@{branch} "{desc|firstline}" files: {files}\n' "$@"
+}
+
+manifest()
+{
+ echo "% manifest of $2"
+ hg -R $1 manifest -v -r $2
+}
diff --git a/tests/cgienv b/tests/cgienv
new file mode 100644
index 0000000..fd987d4
--- /dev/null
+++ b/tests/cgienv
@@ -0,0 +1,29 @@
+DOCUMENT_ROOT="/var/www/hg"; export DOCUMENT_ROOT
+GATEWAY_INTERFACE="CGI/1.1"; export GATEWAY_INTERFACE
+HTTP_ACCEPT="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; export HTTP_ACCEPT
+HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"; export HTTP_ACCEPT_CHARSET
+HTTP_ACCEPT_ENCODING="gzip,deflate"; export HTTP_ACCEPT_ENCODING
+HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"; export HTTP_ACCEPT_LANGUAGE
+HTTP_CACHE_CONTROL="max-age=0"; export HTTP_CACHE_CONTROL
+HTTP_CONNECTION="keep-alive"; export HTTP_CONNECTION
+HTTP_HOST="hg.omnifarious.org"; export HTTP_HOST
+HTTP_KEEP_ALIVE="300"; export HTTP_KEEP_ALIVE
+HTTP_USER_AGENT="Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.0.4) Gecko/20060608 Ubuntu/dapper-security Firefox/1.5.0.4"; export HTTP_USER_AGENT
+PATH_INFO="/"; export PATH_INFO
+PATH_TRANSLATED="/var/www/hg/index.html"; export PATH_TRANSLATED
+QUERY_STRING=""; export QUERY_STRING
+REMOTE_ADDR="127.0.0.2"; export REMOTE_ADDR
+REMOTE_PORT="44703"; export REMOTE_PORT
+REQUEST_METHOD="GET"; export REQUEST_METHOD
+REQUEST_URI="/test/"; export REQUEST_URI
+SCRIPT_FILENAME="/home/hopper/hg_public/test.cgi"; export SCRIPT_FILENAME
+SCRIPT_NAME="/test"; export SCRIPT_NAME
+SCRIPT_URI="http://hg.omnifarious.org/test/"; export SCRIPT_URI
+SCRIPT_URL="/test/"; export SCRIPT_URL
+SERVER_ADDR="127.0.0.1"; export SERVER_ADDR
+SERVER_ADMIN="eric@localhost"; export SERVER_ADMIN
+SERVER_NAME="hg.omnifarious.org"; export SERVER_NAME
+SERVER_PORT="80"; export SERVER_PORT
+SERVER_PROTOCOL="HTTP/1.1"; export SERVER_PROTOCOL
+SERVER_SIGNATURE="<address>Apache/2.0.53 (Fedora) Server at hg.omnifarious.org Port 80</address>"; export SERVER_SIGNATURE
+SERVER_SOFTWARE="Apache/2.0.53 (Fedora)"; export SERVER_SOFTWARE
diff --git a/tests/dummyssh b/tests/dummyssh
new file mode 100755
index 0000000..9b1430a
--- /dev/null
+++ b/tests/dummyssh
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+
+import sys
+import os
+
+os.chdir(os.getenv('TESTTMP'))
+
+if sys.argv[1] != "user@dummy":
+ sys.exit(-1)
+
+os.environ["SSH_CLIENT"] = "127.0.0.1 1 2"
+
+log = open("dummylog", "ab")
+log.write("Got arguments")
+for i, arg in enumerate(sys.argv[1:]):
+ log.write(" %d:%s" % (i+1, arg))
+log.write("\n")
+log.close()
+hgcmd = sys.argv[2]
+if os.name == 'nt':
+ # hack to make simple unix single quote quoting work on windows
+ hgcmd = hgcmd.replace("'", '"')
+r = os.system(hgcmd)
+sys.exit(bool(r))
diff --git a/tests/filtercr.py b/tests/filtercr.py
new file mode 100755
index 0000000..c743b22
--- /dev/null
+++ b/tests/filtercr.py
@@ -0,0 +1,10 @@
+#!/usr/bin/env python
+
+# Filter output by the progress extension to make it readable in tests
+
+import sys, re
+
+for line in sys.stdin:
+ line = re.sub(r'\r+[^\n]', lambda m: '\n' + m.group()[-1:], line)
+ sys.stdout.write(line)
+print
diff --git a/tests/filterpyflakes.py b/tests/filterpyflakes.py
new file mode 100755
index 0000000..240f1e1
--- /dev/null
+++ b/tests/filterpyflakes.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+
+# Filter output by pyflakes to control which warnings we check
+
+import sys, re, os
+
+def makekey(message):
+ # "path/file:line: message"
+ match = re.search(r"(line \d+)", message)
+ line = ''
+ if match:
+ line = match.group(0)
+ message = re.sub(r"(line \d+)", '', message)
+ return re.sub(r"([^:]*):([^:]+):([^']*)('[^']*')(.*)$",
+ r'\3:\5:\4:\1:\2:' + line,
+ message)
+
+lines = []
+for line in sys.stdin:
+ # We whitelist tests
+ pats = [
+ r"imported but unused",
+ r"local variable '.*' is assigned to but never used",
+ r"unable to detect undefined names",
+ ]
+ if not re.search('|'.join(pats), line):
+ continue
+ fn = line.split(':', 1)[0]
+ f = open(os.path.join(os.path.dirname(os.path.dirname(__file__)), fn))
+ data = f.read()
+ f.close()
+ if 'no-check-code' in data:
+ continue
+ lines.append(line)
+
+for line in sorted(lines, key = makekey):
+ sys.stdout.write(line)
+print
diff --git a/tests/get-with-headers.py b/tests/get-with-headers.py
new file mode 100755
index 0000000..6d20dfc
--- /dev/null
+++ b/tests/get-with-headers.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python
+
+"""This does HTTP GET requests given a host:port and path and returns
+a subset of the headers plus the body of the result."""
+
+import httplib, sys
+
+try:
+ import msvcrt, os
+ msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
+except ImportError:
+ pass
+
+twice = False
+if '--twice' in sys.argv:
+ sys.argv.remove('--twice')
+ twice = True
+
+reasons = {'Not modified': 'Not Modified'} # python 2.4
+
+tag = None
+def request(host, path, show):
+ assert not path.startswith('/'), path
+ global tag
+ headers = {}
+ if tag:
+ headers['If-None-Match'] = tag
+
+ conn = httplib.HTTPConnection(host)
+ conn.request("GET", '/' + path, None, headers)
+ response = conn.getresponse()
+ print response.status, reasons.get(response.reason, response.reason)
+ for h in [h.lower() for h in show]:
+ if response.getheader(h, None) is not None:
+ print "%s: %s" % (h, response.getheader(h))
+
+ print
+ data = response.read()
+ sys.stdout.write(data)
+
+ if twice and response.getheader('ETag', None):
+ tag = response.getheader('ETag')
+
+ return response.status
+
+status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
+if twice:
+ status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
+
+if 200 <= status <= 305:
+ sys.exit(0)
+sys.exit(1)
diff --git a/tests/gpg/pubring.gpg b/tests/gpg/pubring.gpg
new file mode 100644
index 0000000..1968054
--- /dev/null
+++ b/tests/gpg/pubring.gpg
Binary files differ
diff --git a/tests/gpg/random_seed b/tests/gpg/random_seed
new file mode 100644
index 0000000..87e0fc6
--- /dev/null
+++ b/tests/gpg/random_seed
Binary files differ
diff --git a/tests/gpg/secring.gpg b/tests/gpg/secring.gpg
new file mode 100644
index 0000000..aca0361
--- /dev/null
+++ b/tests/gpg/secring.gpg
Binary files differ
diff --git a/tests/gpg/trustdb.gpg b/tests/gpg/trustdb.gpg
new file mode 100644
index 0000000..4008cda
--- /dev/null
+++ b/tests/gpg/trustdb.gpg
Binary files differ
diff --git a/tests/heredoctest.py b/tests/heredoctest.py
new file mode 100644
index 0000000..7508c18
--- /dev/null
+++ b/tests/heredoctest.py
@@ -0,0 +1,19 @@
+import sys
+
+globalvars = {}
+localvars = {}
+lines = sys.stdin.readlines()
+while lines:
+ l = lines.pop(0)
+ if l.startswith('SALT'):
+ print l[:-1]
+ elif l.startswith('>>> '):
+ snippet = l[4:]
+ while lines and lines[0].startswith('... '):
+ l = lines.pop(0)
+ snippet += "\n" + l[4:]
+ c = compile(snippet, '<heredoc>', 'single')
+ try:
+ exec c in globalvars, localvars
+ except Exception, inst:
+ print repr(inst)
diff --git a/tests/hghave b/tests/hghave
new file mode 100755
index 0000000..dad1667
--- /dev/null
+++ b/tests/hghave
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+"""Test the running system for features availability. Exit with zero
+if all features are there, non-zero otherwise. If a feature name is
+prefixed with "no-", the absence of feature is tested.
+"""
+import optparse
+import sys
+import hghave
+
+checks = hghave.checks
+
+def list_features():
+ for name, feature in checks.iteritems():
+ desc = feature[1]
+ print name + ':', desc
+
+def test_features():
+ failed = 0
+ for name, feature in checks.iteritems():
+ check, _ = feature
+ try:
+ check()
+ except Exception, e:
+ print "feature %s failed: %s" % (name, e)
+ failed += 1
+ return failed
+
+parser = optparse.OptionParser("%prog [options] [features]")
+parser.add_option("--test-features", action="store_true",
+ help="test available features")
+parser.add_option("--list-features", action="store_true",
+ help="list available features")
+parser.add_option("-q", "--quiet", action="store_true",
+ help="check features silently")
+
+if __name__ == '__main__':
+ options, args = parser.parse_args()
+ if options.list_features:
+ list_features()
+ sys.exit(0)
+
+ if options.test_features:
+ sys.exit(test_features())
+
+ quiet = options.quiet
+
+ failures = 0
+
+ def error(msg):
+ global failures
+ if not quiet:
+ sys.stderr.write(msg + '\n')
+ failures += 1
+
+ for feature in args:
+ negate = feature.startswith('no-')
+ if negate:
+ feature = feature[3:]
+
+ if feature not in checks:
+ error('skipped: unknown feature: ' + feature)
+ continue
+
+ check, desc = checks[feature]
+ try:
+ available = check()
+ except Exception, e:
+ error('hghave check failed: ' + feature)
+ continue
+
+ if not negate and not available:
+ error('skipped: missing feature: ' + desc)
+ elif negate and available:
+ error('skipped: system supports %s' % desc)
+
+ if failures != 0:
+ sys.exit(1)
diff --git a/tests/hghave.py b/tests/hghave.py
new file mode 100755
index 0000000..9b93ec5
--- /dev/null
+++ b/tests/hghave.py
@@ -0,0 +1,308 @@
+import os, stat, socket
+import re
+import sys
+import tempfile
+
+tempprefix = 'hg-hghave-'
+
+def matchoutput(cmd, regexp, ignorestatus=False):
+ """Return True if cmd executes successfully and its output
+ is matched by the supplied regular expression.
+ """
+ r = re.compile(regexp)
+ fh = os.popen(cmd)
+ s = fh.read()
+ try:
+ ret = fh.close()
+ except IOError:
+ # Happen in Windows test environment
+ ret = 1
+ return (ignorestatus or ret is None) and r.search(s)
+
+def has_baz():
+ return matchoutput('baz --version 2>&1', r'baz Bazaar version')
+
+def has_bzr():
+ try:
+ import bzrlib
+ return bzrlib.__doc__ is not None
+ except ImportError:
+ return False
+
+def has_bzr114():
+ try:
+ import bzrlib
+ return (bzrlib.__doc__ is not None
+ and bzrlib.version_info[:2] >= (1, 14))
+ except ImportError:
+ return False
+
+def has_cvs():
+ re = r'Concurrent Versions System.*?server'
+ return matchoutput('cvs --version 2>&1', re) and not has_msys()
+
+def has_darcs():
+ return matchoutput('darcs --version', r'2\.[2-9]', True)
+
+def has_mtn():
+ return matchoutput('mtn --version', r'monotone', True) and not matchoutput(
+ 'mtn --version', r'monotone 0\.', True)
+
+def has_eol_in_paths():
+ try:
+ fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix, suffix='\n\r')
+ os.close(fd)
+ os.remove(path)
+ return True
+ except (IOError, OSError):
+ return False
+
+def has_executablebit():
+ try:
+ EXECFLAGS = stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
+ fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
+ try:
+ os.close(fh)
+ m = os.stat(fn).st_mode & 0777
+ new_file_has_exec = m & EXECFLAGS
+ os.chmod(fn, m ^ EXECFLAGS)
+ exec_flags_cannot_flip = ((os.stat(fn).st_mode & 0777) == m)
+ finally:
+ os.unlink(fn)
+ except (IOError, OSError):
+ # we don't care, the user probably won't be able to commit anyway
+ return False
+ return not (new_file_has_exec or exec_flags_cannot_flip)
+
+def has_icasefs():
+ # Stolen from mercurial.util
+ fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
+ os.close(fd)
+ try:
+ s1 = os.stat(path)
+ d, b = os.path.split(path)
+ p2 = os.path.join(d, b.upper())
+ if path == p2:
+ p2 = os.path.join(d, b.lower())
+ try:
+ s2 = os.stat(p2)
+ return s2 == s1
+ except OSError:
+ return False
+ finally:
+ os.remove(path)
+
+def has_inotify():
+ try:
+ import hgext.inotify.linux.watcher
+ except ImportError:
+ return False
+ name = tempfile.mktemp(dir='.', prefix=tempprefix)
+ sock = socket.socket(socket.AF_UNIX)
+ try:
+ sock.bind(name)
+ except socket.error, err:
+ return False
+ sock.close()
+ os.unlink(name)
+ return True
+
+def has_fifo():
+ if getattr(os, "mkfifo", None) is None:
+ return False
+ name = tempfile.mktemp(dir='.', prefix=tempprefix)
+ try:
+ os.mkfifo(name)
+ os.unlink(name)
+ return True
+ except OSError:
+ return False
+
+def has_cacheable_fs():
+ from mercurial import util
+
+ fd, path = tempfile.mkstemp(dir='.', prefix=tempprefix)
+ os.close(fd)
+ try:
+ return util.cachestat(path).cacheable()
+ finally:
+ os.remove(path)
+
+def has_lsprof():
+ try:
+ import _lsprof
+ return True
+ except ImportError:
+ return False
+
+def has_gettext():
+ return matchoutput('msgfmt --version', 'GNU gettext-tools')
+
+def has_git():
+ return matchoutput('git --version 2>&1', r'^git version')
+
+def has_docutils():
+ try:
+ from docutils.core import publish_cmdline
+ return True
+ except ImportError:
+ return False
+
+def getsvnversion():
+ m = matchoutput('svn --version 2>&1', r'^svn,\s+version\s+(\d+)\.(\d+)')
+ if not m:
+ return (0, 0)
+ return (int(m.group(1)), int(m.group(2)))
+
+def has_svn15():
+ return getsvnversion() >= (1, 5)
+
+def has_svn13():
+ return getsvnversion() >= (1, 3)
+
+def has_svn():
+ return matchoutput('svn --version 2>&1', r'^svn, version') and \
+ matchoutput('svnadmin --version 2>&1', r'^svnadmin, version')
+
+def has_svn_bindings():
+ try:
+ import svn.core
+ version = svn.core.SVN_VER_MAJOR, svn.core.SVN_VER_MINOR
+ if version < (1, 4):
+ return False
+ return True
+ except ImportError:
+ return False
+
+def has_p4():
+ return (matchoutput('p4 -V', r'Rev\. P4/') and
+ matchoutput('p4d -V', r'Rev\. P4D/'))
+
+def has_symlink():
+ if getattr(os, "symlink", None) is None:
+ return False
+ name = tempfile.mktemp(dir='.', prefix=tempprefix)
+ try:
+ os.symlink(".", name)
+ os.unlink(name)
+ return True
+ except (OSError, AttributeError):
+ return False
+
+def has_hardlink():
+ from mercurial import util
+ fh, fn = tempfile.mkstemp(dir='.', prefix=tempprefix)
+ os.close(fh)
+ name = tempfile.mktemp(dir='.', prefix=tempprefix)
+ try:
+ try:
+ util.oslink(fn, name)
+ os.unlink(name)
+ return True
+ except OSError:
+ return False
+ finally:
+ os.unlink(fn)
+
+def has_tla():
+ return matchoutput('tla --version 2>&1', r'The GNU Arch Revision')
+
+def has_gpg():
+ return matchoutput('gpg --version 2>&1', r'GnuPG')
+
+def has_unix_permissions():
+ d = tempfile.mkdtemp(dir='.', prefix=tempprefix)
+ try:
+ fname = os.path.join(d, 'foo')
+ for umask in (077, 007, 022):
+ os.umask(umask)
+ f = open(fname, 'w')
+ f.close()
+ mode = os.stat(fname).st_mode
+ os.unlink(fname)
+ if mode & 0777 != ~umask & 0666:
+ return False
+ return True
+ finally:
+ os.rmdir(d)
+
+def has_pyflakes():
+ return matchoutput("sh -c \"echo 'import re' 2>&1 | pyflakes\"",
+ r"<stdin>:1: 're' imported but unused",
+ True)
+
+def has_pygments():
+ try:
+ import pygments
+ return True
+ except ImportError:
+ return False
+
+def has_outer_repo():
+ # failing for other reasons than 'no repo' imply that there is a repo
+ return not matchoutput('hg root 2>&1',
+ r'abort: no repository found', True)
+
+def has_ssl():
+ try:
+ import ssl
+ import OpenSSL
+ OpenSSL.SSL.Context
+ return True
+ except ImportError:
+ return False
+
+def has_windows():
+ return os.name == 'nt'
+
+def has_system_sh():
+ return os.name != 'nt'
+
+def has_serve():
+ return os.name != 'nt' # gross approximation
+
+def has_tic():
+ return matchoutput('test -x "`which tic`"', '')
+
+def has_msys():
+ return os.getenv('MSYSTEM')
+
+checks = {
+ "true": (lambda: True, "yak shaving"),
+ "false": (lambda: False, "nail clipper"),
+ "baz": (has_baz, "GNU Arch baz client"),
+ "bzr": (has_bzr, "Canonical's Bazaar client"),
+ "bzr114": (has_bzr114, "Canonical's Bazaar client >= 1.14"),
+ "cacheable": (has_cacheable_fs, "cacheable filesystem"),
+ "cvs": (has_cvs, "cvs client/server"),
+ "darcs": (has_darcs, "darcs client"),
+ "docutils": (has_docutils, "Docutils text processing library"),
+ "eol-in-paths": (has_eol_in_paths, "end-of-lines in paths"),
+ "execbit": (has_executablebit, "executable bit"),
+ "fifo": (has_fifo, "named pipes"),
+ "gettext": (has_gettext, "GNU Gettext (msgfmt)"),
+ "git": (has_git, "git command line client"),
+ "gpg": (has_gpg, "gpg client"),
+ "hardlink": (has_hardlink, "hardlinks"),
+ "icasefs": (has_icasefs, "case insensitive file system"),
+ "inotify": (has_inotify, "inotify extension support"),
+ "lsprof": (has_lsprof, "python lsprof module"),
+ "mtn": (has_mtn, "monotone client (>= 1.0)"),
+ "outer-repo": (has_outer_repo, "outer repo"),
+ "p4": (has_p4, "Perforce server and client"),
+ "pyflakes": (has_pyflakes, "Pyflakes python linter"),
+ "pygments": (has_pygments, "Pygments source highlighting library"),
+ "serve": (has_serve, "platform and python can manage 'hg serve -d'"),
+ "ssl": (has_ssl, "python >= 2.6 ssl module and python OpenSSL"),
+ "svn": (has_svn, "subversion client and admin tools"),
+ "svn13": (has_svn13, "subversion client and admin tools >= 1.3"),
+ "svn15": (has_svn15, "subversion client and admin tools >= 1.5"),
+ "svn-bindings": (has_svn_bindings, "subversion python bindings"),
+ "symlink": (has_symlink, "symbolic links"),
+ "system-sh": (has_system_sh, "system() uses sh"),
+ "tic": (has_tic, "terminfo compiler"),
+ "tla": (has_tla, "GNU Arch tla client"),
+ "unix-permissions": (has_unix_permissions, "unix-style permissions"),
+ "windows": (has_windows, "Windows"),
+ "msys": (has_msys, "Windows with MSYS"),
+}
diff --git a/tests/hgterm.ti b/tests/hgterm.ti
new file mode 100644
index 0000000..0a192b4
--- /dev/null
+++ b/tests/hgterm.ti
@@ -0,0 +1,27 @@
+hgterm,
+ am, km, mir, msgr, xenl,
+ colors#8, cols#80, it#8, lines#24, pairs#64,
+ acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
+ bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=\r,
+ csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=\b,
+ cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C,
+ cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
+ dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M,
+ ed=\E[J, el=\E[K, enacs=\E)0, home=\E[H, ht=\t,
+ hts=\EH, il=\E[%p1%dL, il1=\E[L, ind=\n,
+ is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=\b,
+ kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
+ kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
+ kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
+ kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
+ kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
+ kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
+ kf9=\E[20~, kfnd=\E[1~, kich1=\E[2~, kmous=\E[M,
+ knp=\E[6~, kpp=\E[5~, kslt=\E[4~, op=\E[m, rc=\E8,
+ rev=\E[7m, ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8,
+ rmir=\E[4l, rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
+ rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7,
+ setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m,
+ smacs=^N, smcup=\E7\E[?47h, smir=\E[4h,
+ smkx=\E[?1h\E=, smso=\E[7m, smul=\E[4m, tbc=\E[3g,
+ u6=\E[%i%d;%dR, u7=\E[6n, u8=\E[?1;2c, u9=\E[c,
diff --git a/tests/histedit-helpers.sh b/tests/histedit-helpers.sh
new file mode 100644
index 0000000..4475883
--- /dev/null
+++ b/tests/histedit-helpers.sh
@@ -0,0 +1,6 @@
+fixbundle() {
+ grep -v 'saving bundle' | grep -v 'saved backup' | \
+ grep -v added | grep -v adding | \
+ grep -v "unable to find 'e' for patching" | \
+ grep -v "e: No such file or directory"
+}
diff --git a/tests/killdaemons.py b/tests/killdaemons.py
new file mode 100755
index 0000000..63828fc
--- /dev/null
+++ b/tests/killdaemons.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+import os, time, errno, signal
+
+# Kill off any leftover daemon processes
+try:
+ fp = open(os.environ['DAEMON_PIDS'])
+ for line in fp:
+ try:
+ pid = int(line)
+ except ValueError:
+ continue
+ try:
+ os.kill(pid, 0)
+ os.kill(pid, signal.SIGTERM)
+ for i in range(10):
+ time.sleep(0.05)
+ os.kill(pid, 0)
+ os.kill(pid, signal.SIGKILL)
+ except OSError, err:
+ if err.errno != errno.ESRCH:
+ raise
+ fp.close()
+except IOError:
+ pass
diff --git a/tests/md5sum.py b/tests/md5sum.py
new file mode 100755
index 0000000..3eae5ed
--- /dev/null
+++ b/tests/md5sum.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+#
+# Based on python's Tools/scripts/md5sum.py
+#
+# This software may be used and distributed according to the terms
+# of the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2, which is
+# GPL-compatible.
+
+import sys, os
+
+try:
+ from hashlib import md5
+except ImportError:
+ from md5 import md5
+
+try:
+ import msvcrt
+ msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
+except ImportError:
+ pass
+
+for filename in sys.argv[1:]:
+ try:
+ fp = open(filename, 'rb')
+ except IOError, msg:
+ sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg))
+ sys.exit(1)
+
+ m = md5()
+ try:
+ while True:
+ data = fp.read(8192)
+ if not data:
+ break
+ m.update(data)
+ except IOError, msg:
+ sys.stderr.write('%s: I/O error: %s\n' % (filename, msg))
+ sys.exit(1)
+ sys.stdout.write('%s %s\n' % (m.hexdigest(), filename))
+
+sys.exit(0)
diff --git a/tests/missing-comment.hg b/tests/missing-comment.hg
new file mode 100644
index 0000000..7a5be69
--- /dev/null
+++ b/tests/missing-comment.hg
Binary files differ
diff --git a/tests/notcapable b/tests/notcapable
new file mode 100644
index 0000000..ef8dc22
--- /dev/null
+++ b/tests/notcapable
@@ -0,0 +1,24 @@
+# Disable the $CAP wire protocol capability.
+
+if test -z "$CAP"
+then
+ echo "CAP environment variable not set."
+fi
+
+cat > notcapable-$CAP.py << EOF
+from mercurial import extensions, peer, localrepo
+def extsetup():
+ extensions.wrapfunction(peer.peerrepository, 'capable', wrapcapable)
+ extensions.wrapfunction(localrepo.localrepository, 'peer', wrappeer)
+def wrapcapable(orig, self, name, *args, **kwargs):
+ if name in '$CAP'.split(' '):
+ return False
+ return orig(self, name, *args, **kwargs)
+def wrappeer(orig, self):
+ # Since we're disabling some newer features, we need to make sure local
+ # repos add in the legacy features again.
+ return localrepo.locallegacypeer(self)
+EOF
+
+echo '[extensions]' >> $HGRCPATH
+echo "notcapable-$CAP = `pwd`/notcapable-$CAP.py" >> $HGRCPATH
diff --git a/tests/printenv.py b/tests/printenv.py
new file mode 100644
index 0000000..d00e149
--- /dev/null
+++ b/tests/printenv.py
@@ -0,0 +1,49 @@
+# simple script to be used in hooks
+#
+# put something like this in the repo .hg/hgrc:
+#
+# [hooks]
+# changegroup = python "$TESTDIR/printenv.py" <hookname> [exit] [output]
+#
+# - <hookname> is a mandatory argument (e.g. "changegroup")
+# - [exit] is the exit code of the hook (default: 0)
+# - [output] is the name of the output file (default: use sys.stdout)
+# the file will be opened in append mode.
+#
+import os
+import sys
+
+try:
+ import msvcrt
+ msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
+ msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
+except ImportError:
+ pass
+
+exitcode = 0
+out = sys.stdout
+
+name = sys.argv[1]
+if len(sys.argv) > 2:
+ exitcode = int(sys.argv[2])
+ if len(sys.argv) > 3:
+ out = open(sys.argv[3], "ab")
+
+# variables with empty values may not exist on all platforms, filter
+# them now for portability sake.
+env = [(k, v) for k, v in os.environ.iteritems()
+ if k.startswith("HG_") and v]
+env.sort()
+
+out.write("%s hook: " % name)
+if os.name == 'nt':
+ filter = lambda x: x.replace('\\', '/')
+else:
+ filter = lambda x: x
+vars = ["%s=%s" % (k, filter(v)) for k, v in env]
+out.write(" ".join(vars))
+out.write("\n")
+out.close()
+
+sys.exit(exitcode)
diff --git a/tests/readlink.py b/tests/readlink.py
new file mode 100755
index 0000000..0e86a67
--- /dev/null
+++ b/tests/readlink.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python
+
+import errno, os, sys
+
+for f in sys.argv[1:]:
+ try:
+ print f, '->', os.readlink(f)
+ except OSError, err:
+ if err.errno != errno.EINVAL:
+ raise
+ print f, 'not a symlink'
+
+sys.exit(0)
diff --git a/tests/revlog-formatv0.py b/tests/revlog-formatv0.py
new file mode 100755
index 0000000..e88b8cb
--- /dev/null
+++ b/tests/revlog-formatv0.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+# Copyright 2010 Intevation GmbH
+# Author(s):
+# Thomas Arendsen Hein <thomas@intevation.de>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+"""Create a Mercurial repository in revlog format 0
+
+changeset: 0:a1ef0b125355
+tag: tip
+user: user
+date: Thu Jan 01 00:00:00 1970 +0000
+files: empty
+description:
+empty file
+"""
+
+import os, sys
+
+files = [
+ ('formatv0/.hg/00changelog.i',
+ '000000000000004400000000000000000000000000000000000000'
+ '000000000000000000000000000000000000000000000000000000'
+ '0000a1ef0b125355d27765928be600cfe85784284ab3'),
+ ('formatv0/.hg/00changelog.d',
+ '756163613935613961356635353036303562366138343738336237'
+ '61623536363738616436356635380a757365720a3020300a656d70'
+ '74790a0a656d7074792066696c65'),
+ ('formatv0/.hg/00manifest.i',
+ '000000000000003000000000000000000000000000000000000000'
+ '000000000000000000000000000000000000000000000000000000'
+ '0000aca95a9a5f550605b6a84783b7ab56678ad65f58'),
+ ('formatv0/.hg/00manifest.d',
+ '75656d707479006238306465356431333837353835343163356630'
+ '35323635616431343461623966613836643164620a'),
+ ('formatv0/.hg/data/empty.i',
+ '000000000000000000000000000000000000000000000000000000'
+ '000000000000000000000000000000000000000000000000000000'
+ '0000b80de5d138758541c5f05265ad144ab9fa86d1db'),
+ ('formatv0/.hg/data/empty.d',
+ ''),
+]
+
+def makedirs(name):
+ """recursive directory creation"""
+ parent = os.path.dirname(name)
+ if parent:
+ makedirs(parent)
+ os.mkdir(name)
+
+makedirs(os.path.join(*'formatv0/.hg/data'.split('/')))
+
+for name, data in files:
+ f = open(name, 'wb')
+ f.write(data.decode('hex'))
+ f.close()
+
+sys.exit(0)
diff --git a/tests/run-tests.py b/tests/run-tests.py
new file mode 100755
index 0000000..c9ef7d5
--- /dev/null
+++ b/tests/run-tests.py
@@ -0,0 +1,1324 @@
+#!/usr/bin/env python
+#
+# run-tests.py - Run a set of tests on Mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# Modifying this script is tricky because it has many modes:
+# - serial (default) vs parallel (-jN, N > 1)
+# - no coverage (default) vs coverage (-c, -C, -s)
+# - temp install (default) vs specific hg script (--with-hg, --local)
+# - tests are a mix of shell scripts and Python scripts
+#
+# If you change this script, it is recommended that you ensure you
+# haven't broken it by running it in various modes with a representative
+# sample of test scripts. For example:
+#
+# 1) serial, no coverage, temp install:
+# ./run-tests.py test-s*
+# 2) serial, no coverage, local hg:
+# ./run-tests.py --local test-s*
+# 3) serial, coverage, temp install:
+# ./run-tests.py -c test-s*
+# 4) serial, coverage, local hg:
+# ./run-tests.py -c --local test-s* # unsupported
+# 5) parallel, no coverage, temp install:
+# ./run-tests.py -j2 test-s*
+# 6) parallel, no coverage, local hg:
+# ./run-tests.py -j2 --local test-s*
+# 7) parallel, coverage, temp install:
+# ./run-tests.py -j2 -c test-s* # currently broken
+# 8) parallel, coverage, local install:
+# ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
+# 9) parallel, custom tmp dir:
+# ./run-tests.py -j2 --tmpdir /tmp/myhgtests
+#
+# (You could use any subset of the tests: test-s* happens to match
+# enough that it's worth doing parallel runs, few enough that it
+# completes fairly quickly, includes both shell and Python scripts, and
+# includes some scripts that run daemon processes.)
+
+from distutils import version
+import difflib
+import errno
+import optparse
+import os
+import shutil
+import subprocess
+import signal
+import sys
+import tempfile
+import time
+import re
+import threading
+
+processlock = threading.Lock()
+
+closefds = os.name == 'posix'
+def Popen4(cmd, wd, timeout):
+ processlock.acquire()
+ p = subprocess.Popen(cmd, shell=True, bufsize=-1, cwd=wd,
+ close_fds=closefds,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ processlock.release()
+
+ p.fromchild = p.stdout
+ p.tochild = p.stdin
+ p.childerr = p.stderr
+
+ p.timeout = False
+ if timeout:
+ def t():
+ start = time.time()
+ while time.time() - start < timeout and p.returncode is None:
+ time.sleep(.1)
+ p.timeout = True
+ if p.returncode is None:
+ terminate(p)
+ threading.Thread(target=t).start()
+
+ return p
+
+# reserved exit code to skip test (used by hghave)
+SKIPPED_STATUS = 80
+SKIPPED_PREFIX = 'skipped: '
+FAILED_PREFIX = 'hghave check failed: '
+PYTHON = sys.executable.replace('\\', '/')
+IMPL_PATH = 'PYTHONPATH'
+if 'java' in sys.platform:
+ IMPL_PATH = 'JYTHONPATH'
+
+requiredtools = ["python", "diff", "grep", "unzip", "gunzip", "bunzip2", "sed"]
+
+defaults = {
+ 'jobs': ('HGTEST_JOBS', 1),
+ 'timeout': ('HGTEST_TIMEOUT', 180),
+ 'port': ('HGTEST_PORT', 20059),
+ 'shell': ('HGTEST_SHELL', 'sh'),
+}
+
+def parselistfiles(files, listtype, warn=True):
+ entries = dict()
+ for filename in files:
+ try:
+ path = os.path.expanduser(os.path.expandvars(filename))
+ f = open(path, "r")
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ if warn:
+ print "warning: no such %s file: %s" % (listtype, filename)
+ continue
+
+ for line in f.readlines():
+ line = line.split('#', 1)[0].strip()
+ if line:
+ entries[line] = filename
+
+ f.close()
+ return entries
+
+def parseargs():
+ parser = optparse.OptionParser("%prog [options] [tests]")
+
+ # keep these sorted
+ parser.add_option("--blacklist", action="append",
+ help="skip tests listed in the specified blacklist file")
+ parser.add_option("--whitelist", action="append",
+ help="always run tests listed in the specified whitelist file")
+ parser.add_option("-C", "--annotate", action="store_true",
+ help="output files annotated with coverage")
+ parser.add_option("--child", type="int",
+ help="run as child process, summary to given fd")
+ parser.add_option("-c", "--cover", action="store_true",
+ help="print a test coverage report")
+ parser.add_option("-d", "--debug", action="store_true",
+ help="debug mode: write output of test scripts to console"
+ " rather than capturing and diff'ing it (disables timeout)")
+ parser.add_option("-f", "--first", action="store_true",
+ help="exit on the first test failure")
+ parser.add_option("-H", "--htmlcov", action="store_true",
+ help="create an HTML report of the coverage of the files")
+ parser.add_option("--inotify", action="store_true",
+ help="enable inotify extension when running tests")
+ parser.add_option("-i", "--interactive", action="store_true",
+ help="prompt to accept changed output")
+ parser.add_option("-j", "--jobs", type="int",
+ help="number of jobs to run in parallel"
+ " (default: $%s or %d)" % defaults['jobs'])
+ parser.add_option("--keep-tmpdir", action="store_true",
+ help="keep temporary directory after running tests")
+ parser.add_option("-k", "--keywords",
+ help="run tests matching keywords")
+ parser.add_option("-l", "--local", action="store_true",
+ help="shortcut for --with-hg=<testdir>/../hg")
+ parser.add_option("-n", "--nodiff", action="store_true",
+ help="skip showing test changes")
+ parser.add_option("-p", "--port", type="int",
+ help="port on which servers should listen"
+ " (default: $%s or %d)" % defaults['port'])
+ parser.add_option("--pure", action="store_true",
+ help="use pure Python code instead of C extensions")
+ parser.add_option("-R", "--restart", action="store_true",
+ help="restart at last error")
+ parser.add_option("-r", "--retest", action="store_true",
+ help="retest failed tests")
+ parser.add_option("-S", "--noskips", action="store_true",
+ help="don't report skip tests verbosely")
+ parser.add_option("--shell", type="string",
+ help="shell to use (default: $%s or %s)" % defaults['shell'])
+ parser.add_option("-t", "--timeout", type="int",
+ help="kill errant tests after TIMEOUT seconds"
+ " (default: $%s or %d)" % defaults['timeout'])
+ parser.add_option("--tmpdir", type="string",
+ help="run tests in the given temporary directory"
+ " (implies --keep-tmpdir)")
+ parser.add_option("-v", "--verbose", action="store_true",
+ help="output verbose messages")
+ parser.add_option("--view", type="string",
+ help="external diff viewer")
+ parser.add_option("--with-hg", type="string",
+ metavar="HG",
+ help="test using specified hg script rather than a "
+ "temporary installation")
+ parser.add_option("-3", "--py3k-warnings", action="store_true",
+ help="enable Py3k warnings on Python 2.6+")
+ parser.add_option('--extra-config-opt', action="append",
+ help='set the given config opt in the test hgrc')
+
+ for option, (envvar, default) in defaults.items():
+ defaults[option] = type(default)(os.environ.get(envvar, default))
+ parser.set_defaults(**defaults)
+ (options, args) = parser.parse_args()
+
+ # jython is always pure
+ if 'java' in sys.platform or '__pypy__' in sys.modules:
+ options.pure = True
+
+ if options.with_hg:
+ options.with_hg = os.path.expanduser(options.with_hg)
+ if not (os.path.isfile(options.with_hg) and
+ os.access(options.with_hg, os.X_OK)):
+ parser.error('--with-hg must specify an executable hg script')
+ if not os.path.basename(options.with_hg) == 'hg':
+ sys.stderr.write('warning: --with-hg should specify an hg script\n')
+ if options.local:
+ testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
+ hgbin = os.path.join(os.path.dirname(testdir), 'hg')
+ if os.name != 'nt' and not os.access(hgbin, os.X_OK):
+ parser.error('--local specified, but %r not found or not executable'
+ % hgbin)
+ options.with_hg = hgbin
+
+ options.anycoverage = options.cover or options.annotate or options.htmlcov
+ if options.anycoverage:
+ try:
+ import coverage
+ covver = version.StrictVersion(coverage.__version__).version
+ if covver < (3, 3):
+ parser.error('coverage options require coverage 3.3 or later')
+ except ImportError:
+ parser.error('coverage options now require the coverage package')
+
+ if options.anycoverage and options.local:
+ # this needs some path mangling somewhere, I guess
+ parser.error("sorry, coverage options do not work when --local "
+ "is specified")
+
+ global vlog
+ if options.verbose:
+ if options.jobs > 1 or options.child is not None:
+ pid = "[%d]" % os.getpid()
+ else:
+ pid = None
+ def vlog(*msg):
+ iolock.acquire()
+ if pid:
+ print pid,
+ for m in msg:
+ print m,
+ print
+ sys.stdout.flush()
+ iolock.release()
+ else:
+ vlog = lambda *msg: None
+
+ if options.tmpdir:
+ options.tmpdir = os.path.expanduser(options.tmpdir)
+
+ if options.jobs < 1:
+ parser.error('--jobs must be positive')
+ if options.interactive and options.jobs > 1:
+ print '(--interactive overrides --jobs)'
+ options.jobs = 1
+ if options.interactive and options.debug:
+ parser.error("-i/--interactive and -d/--debug are incompatible")
+ if options.debug:
+ if options.timeout != defaults['timeout']:
+ sys.stderr.write(
+ 'warning: --timeout option ignored with --debug\n')
+ options.timeout = 0
+ if options.py3k_warnings:
+ if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
+ parser.error('--py3k-warnings can only be used on Python 2.6+')
+ if options.blacklist:
+ options.blacklist = parselistfiles(options.blacklist, 'blacklist')
+ if options.whitelist:
+ options.whitelisted = parselistfiles(options.whitelist, 'whitelist',
+ warn=options.child is None)
+ else:
+ options.whitelisted = {}
+
+ return (options, args)
+
+def rename(src, dst):
+ """Like os.rename(), trade atomicity and opened files friendliness
+ for existing destination support.
+ """
+ shutil.copy(src, dst)
+ os.remove(src)
+
+def splitnewlines(text):
+ '''like str.splitlines, but only split on newlines.
+ keep line endings.'''
+ i = 0
+ lines = []
+ while True:
+ n = text.find('\n', i)
+ if n == -1:
+ last = text[i:]
+ if last:
+ lines.append(last)
+ return lines
+ lines.append(text[i:n + 1])
+ i = n + 1
+
+def parsehghaveoutput(lines):
+ '''Parse hghave log lines.
+ Return tuple of lists (missing, failed):
+ * the missing/unknown features
+ * the features for which existence check failed'''
+ missing = []
+ failed = []
+ for line in lines:
+ if line.startswith(SKIPPED_PREFIX):
+ line = line.splitlines()[0]
+ missing.append(line[len(SKIPPED_PREFIX):])
+ elif line.startswith(FAILED_PREFIX):
+ line = line.splitlines()[0]
+ failed.append(line[len(FAILED_PREFIX):])
+
+ return missing, failed
+
+def showdiff(expected, output, ref, err):
+ print
+ for line in difflib.unified_diff(expected, output, ref, err):
+ sys.stdout.write(line)
+
+def findprogram(program):
+ """Search PATH for a executable program"""
+ for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
+ name = os.path.join(p, program)
+ if os.name == 'nt' or os.access(name, os.X_OK):
+ return name
+ return None
+
+def checktools():
+ # Before we go any further, check for pre-requisite tools
+ # stuff from coreutils (cat, rm, etc) are not tested
+ for p in requiredtools:
+ if os.name == 'nt':
+ p += '.exe'
+ found = findprogram(p)
+ if found:
+ vlog("# Found prerequisite", p, "at", found)
+ else:
+ print "WARNING: Did not find prerequisite tool: "+p
+
+def terminate(proc):
+ """Terminate subprocess (with fallback for Python versions < 2.6)"""
+ vlog('# Terminating process %d' % proc.pid)
+ try:
+ getattr(proc, 'terminate', lambda : os.kill(proc.pid, signal.SIGTERM))()
+ except OSError:
+ pass
+
+def killdaemons():
+ # Kill off any leftover daemon processes
+ try:
+ fp = open(DAEMON_PIDS)
+ for line in fp:
+ try:
+ pid = int(line)
+ except ValueError:
+ continue
+ try:
+ os.kill(pid, 0)
+ vlog('# Killing daemon process %d' % pid)
+ os.kill(pid, signal.SIGTERM)
+ time.sleep(0.1)
+ os.kill(pid, 0)
+ vlog('# Daemon process %d is stuck - really killing it' % pid)
+ os.kill(pid, signal.SIGKILL)
+ except OSError, err:
+ if err.errno != errno.ESRCH:
+ raise
+ fp.close()
+ os.unlink(DAEMON_PIDS)
+ except IOError:
+ pass
+
+def cleanup(options):
+ if not options.keep_tmpdir:
+ vlog("# Cleaning up HGTMP", HGTMP)
+ shutil.rmtree(HGTMP, True)
+
+def usecorrectpython():
+ # some tests run python interpreter. they must use same
+ # interpreter we use or bad things will happen.
+ exedir, exename = os.path.split(sys.executable)
+ if exename in ('python', 'python.exe'):
+ path = findprogram(exename)
+ if os.path.dirname(path) == exedir:
+ return
+ else:
+ exename = 'python'
+ vlog('# Making python executable in test path use correct Python')
+ mypython = os.path.join(BINDIR, exename)
+ try:
+ os.symlink(sys.executable, mypython)
+ except AttributeError:
+ # windows fallback
+ shutil.copyfile(sys.executable, mypython)
+ shutil.copymode(sys.executable, mypython)
+
+def installhg(options):
+ vlog("# Performing temporary installation of HG")
+ installerrs = os.path.join("tests", "install.err")
+ pure = options.pure and "--pure" or ""
+
+ # Run installer in hg root
+ script = os.path.realpath(sys.argv[0])
+ hgroot = os.path.dirname(os.path.dirname(script))
+ os.chdir(hgroot)
+ nohome = '--home=""'
+ if os.name == 'nt':
+ # The --home="" trick works only on OS where os.sep == '/'
+ # because of a distutils convert_path() fast-path. Avoid it at
+ # least on Windows for now, deal with .pydistutils.cfg bugs
+ # when they happen.
+ nohome = ''
+ cmd = ('%s setup.py %s clean --all'
+ ' build --build-base="%s"'
+ ' install --force --prefix="%s" --install-lib="%s"'
+ ' --install-scripts="%s" %s >%s 2>&1'
+ % (sys.executable, pure, os.path.join(HGTMP, "build"),
+ INST, PYTHONDIR, BINDIR, nohome, installerrs))
+ vlog("# Running", cmd)
+ if os.system(cmd) == 0:
+ if not options.verbose:
+ os.remove(installerrs)
+ else:
+ f = open(installerrs)
+ for line in f:
+ print line,
+ f.close()
+ sys.exit(1)
+ os.chdir(TESTDIR)
+
+ usecorrectpython()
+
+ vlog("# Installing dummy diffstat")
+ f = open(os.path.join(BINDIR, 'diffstat'), 'w')
+ f.write('#!' + sys.executable + '\n'
+ 'import sys\n'
+ 'files = 0\n'
+ 'for line in sys.stdin:\n'
+ ' if line.startswith("diff "):\n'
+ ' files += 1\n'
+ 'sys.stdout.write("files patched: %d\\n" % files)\n')
+ f.close()
+ os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
+
+ if options.py3k_warnings and not options.anycoverage:
+ vlog("# Updating hg command to enable Py3k Warnings switch")
+ f = open(os.path.join(BINDIR, 'hg'), 'r')
+ lines = [line.rstrip() for line in f]
+ lines[0] += ' -3'
+ f.close()
+ f = open(os.path.join(BINDIR, 'hg'), 'w')
+ for line in lines:
+ f.write(line + '\n')
+ f.close()
+
+ hgbat = os.path.join(BINDIR, 'hg.bat')
+ if os.path.isfile(hgbat):
+ # hg.bat expects to be put in bin/scripts while run-tests.py
+ # installation layout put it in bin/ directly. Fix it
+ f = open(hgbat, 'rb')
+ data = f.read()
+ f.close()
+ if '"%~dp0..\python" "%~dp0hg" %*' in data:
+ data = data.replace('"%~dp0..\python" "%~dp0hg" %*',
+ '"%~dp0python" "%~dp0hg" %*')
+ f = open(hgbat, 'wb')
+ f.write(data)
+ f.close()
+ else:
+ print 'WARNING: cannot fix hg.bat reference to python.exe'
+
+ if options.anycoverage:
+ custom = os.path.join(TESTDIR, 'sitecustomize.py')
+ target = os.path.join(PYTHONDIR, 'sitecustomize.py')
+ vlog('# Installing coverage trigger to %s' % target)
+ shutil.copyfile(custom, target)
+ rc = os.path.join(TESTDIR, '.coveragerc')
+ vlog('# Installing coverage rc to %s' % rc)
+ os.environ['COVERAGE_PROCESS_START'] = rc
+ fn = os.path.join(INST, '..', '.coverage')
+ os.environ['COVERAGE_FILE'] = fn
+
+def outputcoverage(options):
+
+ vlog('# Producing coverage report')
+ os.chdir(PYTHONDIR)
+
+ def covrun(*args):
+ cmd = 'coverage %s' % ' '.join(args)
+ vlog('# Running: %s' % cmd)
+ os.system(cmd)
+
+ if options.child:
+ return
+
+ covrun('-c')
+ omit = ','.join(os.path.join(x, '*') for x in [BINDIR, TESTDIR])
+ covrun('-i', '-r', '"--omit=%s"' % omit) # report
+ if options.htmlcov:
+ htmldir = os.path.join(TESTDIR, 'htmlcov')
+ covrun('-i', '-b', '"--directory=%s"' % htmldir, '"--omit=%s"' % omit)
+ if options.annotate:
+ adir = os.path.join(TESTDIR, 'annotated')
+ if not os.path.isdir(adir):
+ os.mkdir(adir)
+ covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
+
+def pytest(test, wd, options, replacements):
+ py3kswitch = options.py3k_warnings and ' -3' or ''
+ cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
+ vlog("# Running", cmd)
+ return run(cmd, wd, options, replacements)
+
+def shtest(test, wd, options, replacements):
+ cmd = '%s "%s"' % (options.shell, test)
+ vlog("# Running", cmd)
+ return run(cmd, wd, options, replacements)
+
+needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
+escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
+escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
+escapemap.update({'\\': '\\\\', '\r': r'\r'})
+def escapef(m):
+ return escapemap[m.group(0)]
+def stringescape(s):
+ return escapesub(escapef, s)
+
+def rematch(el, l):
+ try:
+ # ensure that the regex matches to the end of the string
+ return re.match(el + r'\Z', l)
+ except re.error:
+ # el is an invalid regex
+ return False
+
+def globmatch(el, l):
+ # The only supported special characters are * and ? plus / which also
+ # matches \ on windows. Escaping of these caracters is supported.
+ i, n = 0, len(el)
+ res = ''
+ while i < n:
+ c = el[i]
+ i += 1
+ if c == '\\' and el[i] in '*?\\/':
+ res += el[i - 1:i + 1]
+ i += 1
+ elif c == '*':
+ res += '.*'
+ elif c == '?':
+ res += '.'
+ elif c == '/' and os.name == 'nt':
+ res += '[/\\\\]'
+ else:
+ res += re.escape(c)
+ return rematch(res, l)
+
+def linematch(el, l):
+ if el == l: # perfect match (fast)
+ return True
+ if (el and
+ (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', l) or
+ el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', l) or
+ el.endswith(" (esc)\n") and
+ (el[:-7].decode('string-escape') + '\n' == l or
+ el[:-7].decode('string-escape').replace('\r', '') +
+ '\n' == l and os.name == 'nt'))):
+ return True
+ return False
+
+def tsttest(test, wd, options, replacements):
+ # We generate a shell script which outputs unique markers to line
+ # up script results with our source. These markers include input
+ # line number and the last return code
+ salt = "SALT" + str(time.time())
+ def addsalt(line, inpython):
+ if inpython:
+ script.append('%s %d 0\n' % (salt, line))
+ else:
+ script.append('echo %s %s $?\n' % (salt, line))
+
+ # After we run the shell script, we re-unify the script output
+ # with non-active parts of the source, with synchronization by our
+ # SALT line number markers. The after table contains the
+ # non-active components, ordered by line number
+ after = {}
+ pos = prepos = -1
+
+ # Expected shellscript output
+ expected = {}
+
+ # We keep track of whether or not we're in a Python block so we
+ # can generate the surrounding doctest magic
+ inpython = False
+
+ # True or False when in a true or false conditional section
+ skipping = None
+
+ def hghave(reqs):
+ # TODO: do something smarter when all other uses of hghave is gone
+ tdir = TESTDIR.replace('\\', '/')
+ proc = Popen4('%s -c "%s/hghave %s"' %
+ (options.shell, tdir, ' '.join(reqs)), wd, 0)
+ proc.communicate()
+ ret = proc.wait()
+ if wifexited(ret):
+ ret = os.WEXITSTATUS(ret)
+ return ret == 0
+
+ f = open(test)
+ t = f.readlines()
+ f.close()
+
+ script = []
+ if options.debug:
+ script.append('set -x\n')
+ if os.getenv('MSYSTEM'):
+ script.append('alias pwd="pwd -W"\n')
+ for n, l in enumerate(t):
+ if not l.endswith('\n'):
+ l += '\n'
+ if l.startswith('#if'):
+ if skipping is not None:
+ after.setdefault(pos, []).append(' !!! nested #if\n')
+ skipping = not hghave(l.split()[1:])
+ after.setdefault(pos, []).append(l)
+ elif l.startswith('#else'):
+ if skipping is None:
+ after.setdefault(pos, []).append(' !!! missing #if\n')
+ skipping = not skipping
+ after.setdefault(pos, []).append(l)
+ elif l.startswith('#endif'):
+ if skipping is None:
+ after.setdefault(pos, []).append(' !!! missing #if\n')
+ skipping = None
+ after.setdefault(pos, []).append(l)
+ elif skipping:
+ after.setdefault(pos, []).append(l)
+ elif l.startswith(' >>> '): # python inlines
+ after.setdefault(pos, []).append(l)
+ prepos = pos
+ pos = n
+ if not inpython:
+ # we've just entered a Python block, add the header
+ inpython = True
+ addsalt(prepos, False) # make sure we report the exit code
+ script.append('%s -m heredoctest <<EOF\n' % PYTHON)
+ addsalt(n, True)
+ script.append(l[2:])
+ elif l.startswith(' ... '): # python inlines
+ after.setdefault(prepos, []).append(l)
+ script.append(l[2:])
+ elif l.startswith(' $ '): # commands
+ if inpython:
+ script.append("EOF\n")
+ inpython = False
+ after.setdefault(pos, []).append(l)
+ prepos = pos
+ pos = n
+ addsalt(n, False)
+ cmd = l[4:].split()
+ if len(cmd) == 2 and cmd[0] == 'cd':
+ l = ' $ cd %s || exit 1\n' % cmd[1]
+ script.append(l[4:])
+ elif l.startswith(' > '): # continuations
+ after.setdefault(prepos, []).append(l)
+ script.append(l[4:])
+ elif l.startswith(' '): # results
+ # queue up a list of expected results
+ expected.setdefault(pos, []).append(l[2:])
+ else:
+ if inpython:
+ script.append("EOF\n")
+ inpython = False
+ # non-command/result - queue up for merged output
+ after.setdefault(pos, []).append(l)
+
+ if inpython:
+ script.append("EOF\n")
+ if skipping is not None:
+ after.setdefault(pos, []).append(' !!! missing #endif\n')
+ addsalt(n + 1, False)
+
+ # Write out the script and execute it
+ fd, name = tempfile.mkstemp(suffix='hg-tst')
+ try:
+ for l in script:
+ os.write(fd, l)
+ os.close(fd)
+
+ cmd = '%s "%s"' % (options.shell, name)
+ vlog("# Running", cmd)
+ exitcode, output = run(cmd, wd, options, replacements)
+ # do not merge output if skipped, return hghave message instead
+ # similarly, with --debug, output is None
+ if exitcode == SKIPPED_STATUS or output is None:
+ return exitcode, output
+ finally:
+ os.remove(name)
+
+ # Merge the script output back into a unified test
+
+ pos = -1
+ postout = []
+ ret = 0
+ for n, l in enumerate(output):
+ lout, lcmd = l, None
+ if salt in l:
+ lout, lcmd = l.split(salt, 1)
+
+ if lout:
+ if lcmd:
+ # output block had no trailing newline, clean up
+ lout += ' (no-eol)\n'
+
+ # find the expected output at the current position
+ el = None
+ if pos in expected and expected[pos]:
+ el = expected[pos].pop(0)
+
+ if linematch(el, lout):
+ postout.append(" " + el)
+ else:
+ if needescape(lout):
+ lout = stringescape(lout.rstrip('\n')) + " (esc)\n"
+ postout.append(" " + lout) # let diff deal with it
+
+ if lcmd:
+ # add on last return code
+ ret = int(lcmd.split()[1])
+ if ret != 0:
+ postout.append(" [%s]\n" % ret)
+ if pos in after:
+ # merge in non-active test bits
+ postout += after.pop(pos)
+ pos = int(lcmd.split()[0])
+
+ if pos in after:
+ postout += after.pop(pos)
+
+ return exitcode, postout
+
+wifexited = getattr(os, "WIFEXITED", lambda x: False)
+def run(cmd, wd, options, replacements):
+ """Run command in a sub-process, capturing the output (stdout and stderr).
+ Return a tuple (exitcode, output). output is None in debug mode."""
+ # TODO: Use subprocess.Popen if we're running on Python 2.4
+ if options.debug:
+ proc = subprocess.Popen(cmd, shell=True, cwd=wd)
+ ret = proc.wait()
+ return (ret, None)
+
+ proc = Popen4(cmd, wd, options.timeout)
+ def cleanup():
+ terminate(proc)
+ ret = proc.wait()
+ if ret == 0:
+ ret = signal.SIGTERM << 8
+ killdaemons()
+ return ret
+
+ output = ''
+ proc.tochild.close()
+
+ try:
+ output = proc.fromchild.read()
+ except KeyboardInterrupt:
+ vlog('# Handling keyboard interrupt')
+ cleanup()
+ raise
+
+ ret = proc.wait()
+ if wifexited(ret):
+ ret = os.WEXITSTATUS(ret)
+
+ if proc.timeout:
+ ret = 'timeout'
+
+ if ret:
+ killdaemons()
+
+ for s, r in replacements:
+ output = re.sub(s, r, output)
+ return ret, splitnewlines(output)
+
+def runone(options, test):
+ '''tristate output:
+ None -> skipped
+ True -> passed
+ False -> failed'''
+
+ global results, resultslock, iolock
+
+ testpath = os.path.join(TESTDIR, test)
+
+ def result(l, e):
+ resultslock.acquire()
+ results[l].append(e)
+ resultslock.release()
+
+ def skip(msg):
+ if not options.verbose:
+ result('s', (test, msg))
+ else:
+ iolock.acquire()
+ print "\nSkipping %s: %s" % (testpath, msg)
+ iolock.release()
+ return None
+
+ def fail(msg, ret):
+ if not options.nodiff:
+ iolock.acquire()
+ print "\nERROR: %s %s" % (testpath, msg)
+ iolock.release()
+ if (not ret and options.interactive
+ and os.path.exists(testpath + ".err")):
+ iolock.acquire()
+ print "Accept this change? [n] ",
+ answer = sys.stdin.readline().strip()
+ iolock.release()
+ if answer.lower() in "y yes".split():
+ if test.endswith(".t"):
+ rename(testpath + ".err", testpath)
+ else:
+ rename(testpath + ".err", testpath + ".out")
+ result('p', test)
+ return
+ result('f', (test, msg))
+
+ def success():
+ result('p', test)
+
+ def ignore(msg):
+ result('i', (test, msg))
+
+ if (os.path.basename(test).startswith("test-") and '~' not in test and
+ ('.' not in test or test.endswith('.py') or
+ test.endswith('.bat') or test.endswith('.t'))):
+ if not os.path.exists(test):
+ skip("doesn't exist")
+ return None
+ else:
+ vlog('# Test file', test, 'not supported, ignoring')
+ return None # not a supported test, don't record
+
+ if not (options.whitelisted and test in options.whitelisted):
+ if options.blacklist and test in options.blacklist:
+ skip("blacklisted")
+ return None
+
+ if options.retest and not os.path.exists(test + ".err"):
+ ignore("not retesting")
+ return None
+
+ if options.keywords:
+ fp = open(test)
+ t = fp.read().lower() + test.lower()
+ fp.close()
+ for k in options.keywords.lower().split():
+ if k in t:
+ break
+ else:
+ ignore("doesn't match keyword")
+ return None
+
+ vlog("# Test", test)
+
+ # create a fresh hgrc
+ hgrc = open(HGRCPATH, 'w+')
+ hgrc.write('[ui]\n')
+ hgrc.write('slash = True\n')
+ hgrc.write('[defaults]\n')
+ hgrc.write('backout = -d "0 0"\n')
+ hgrc.write('commit = -d "0 0"\n')
+ hgrc.write('tag = -d "0 0"\n')
+ if options.inotify:
+ hgrc.write('[extensions]\n')
+ hgrc.write('inotify=\n')
+ hgrc.write('[inotify]\n')
+ hgrc.write('pidfile=%s\n' % DAEMON_PIDS)
+ hgrc.write('appendpid=True\n')
+ if options.extra_config_opt:
+ for opt in options.extra_config_opt:
+ section, key = opt.split('.', 1)
+ assert '=' in key, ('extra config opt %s must '
+ 'have an = for assignment' % opt)
+ hgrc.write('[%s]\n%s\n' % (section, key))
+ hgrc.close()
+
+ ref = os.path.join(TESTDIR, test+".out")
+ err = os.path.join(TESTDIR, test+".err")
+ if os.path.exists(err):
+ os.remove(err) # Remove any previous output files
+ try:
+ tf = open(testpath)
+ firstline = tf.readline().rstrip()
+ tf.close()
+ except IOError:
+ firstline = ''
+ lctest = test.lower()
+
+ if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
+ runner = pytest
+ elif lctest.endswith('.t'):
+ runner = tsttest
+ ref = testpath
+ else:
+ # do not try to run non-executable programs
+ if not os.access(testpath, os.X_OK):
+ return skip("not executable")
+ runner = shtest
+
+ # Make a tmp subdirectory to work in
+ testtmp = os.environ["TESTTMP"] = os.environ["HOME"] = \
+ os.path.join(HGTMP, os.path.basename(test))
+
+ replacements = [
+ (r':%s\b' % options.port, ':$HGPORT'),
+ (r':%s\b' % (options.port + 1), ':$HGPORT1'),
+ (r':%s\b' % (options.port + 2), ':$HGPORT2'),
+ ]
+ if os.name == 'nt':
+ replacements.append((r'\r\n', '\n'))
+ replacements.append(
+ (''.join(c.isalpha() and '[%s%s]' % (c.lower(), c.upper()) or
+ c in '/\\' and r'[/\\]' or
+ c.isdigit() and c or
+ '\\' + c
+ for c in testtmp), '$TESTTMP'))
+ else:
+ replacements.append((re.escape(testtmp), '$TESTTMP'))
+
+ os.mkdir(testtmp)
+ ret, out = runner(testpath, testtmp, options, replacements)
+ vlog("# Ret was:", ret)
+
+ mark = '.'
+
+ skipped = (ret == SKIPPED_STATUS)
+
+ # If we're not in --debug mode and reference output file exists,
+ # check test output against it.
+ if options.debug:
+ refout = None # to match "out is None"
+ elif os.path.exists(ref):
+ f = open(ref, "r")
+ refout = list(splitnewlines(f.read()))
+ f.close()
+ else:
+ refout = []
+
+ if (ret != 0 or out != refout) and not skipped and not options.debug:
+ # Save errors to a file for diagnosis
+ f = open(err, "wb")
+ for line in out:
+ f.write(line)
+ f.close()
+
+ if skipped:
+ mark = 's'
+ if out is None: # debug mode: nothing to parse
+ missing = ['unknown']
+ failed = None
+ else:
+ missing, failed = parsehghaveoutput(out)
+ if not missing:
+ missing = ['irrelevant']
+ if failed:
+ fail("hghave failed checking for %s" % failed[-1], ret)
+ skipped = False
+ else:
+ skip(missing[-1])
+ elif ret == 'timeout':
+ mark = 't'
+ fail("timed out", ret)
+ elif out != refout:
+ mark = '!'
+ if not options.nodiff:
+ iolock.acquire()
+ if options.view:
+ os.system("%s %s %s" % (options.view, ref, err))
+ else:
+ showdiff(refout, out, ref, err)
+ iolock.release()
+ if ret:
+ fail("output changed and returned error code %d" % ret, ret)
+ else:
+ fail("output changed", ret)
+ ret = 1
+ elif ret:
+ mark = '!'
+ fail("returned error code %d" % ret, ret)
+ else:
+ success()
+
+ if not options.verbose:
+ iolock.acquire()
+ sys.stdout.write(mark)
+ sys.stdout.flush()
+ iolock.release()
+
+ killdaemons()
+
+ if not options.keep_tmpdir:
+ shutil.rmtree(testtmp, True)
+ if skipped:
+ return None
+ return ret == 0
+
+_hgpath = None
+
+def _gethgpath():
+ """Return the path to the mercurial package that is actually found by
+ the current Python interpreter."""
+ global _hgpath
+ if _hgpath is not None:
+ return _hgpath
+
+ cmd = '%s -c "import mercurial; print mercurial.__path__[0]"'
+ pipe = os.popen(cmd % PYTHON)
+ try:
+ _hgpath = pipe.read().strip()
+ finally:
+ pipe.close()
+ return _hgpath
+
+def _checkhglib(verb):
+ """Ensure that the 'mercurial' package imported by python is
+ the one we expect it to be. If not, print a warning to stderr."""
+ expecthg = os.path.join(PYTHONDIR, 'mercurial')
+ actualhg = _gethgpath()
+ if os.path.abspath(actualhg) != os.path.abspath(expecthg):
+ sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
+ ' (expected %s)\n'
+ % (verb, actualhg, expecthg))
+
+def runchildren(options, tests):
+ if INST:
+ installhg(options)
+ _checkhglib("Testing")
+
+ optcopy = dict(options.__dict__)
+ optcopy['jobs'] = 1
+
+ # Because whitelist has to override keyword matches, we have to
+ # actually load the whitelist in the children as well, so we allow
+ # the list of whitelist files to pass through and be parsed in the
+ # children, but not the dict of whitelisted tests resulting from
+ # the parse, used here to override blacklisted tests.
+ whitelist = optcopy['whitelisted'] or []
+ del optcopy['whitelisted']
+
+ blacklist = optcopy['blacklist'] or []
+ del optcopy['blacklist']
+ blacklisted = []
+
+ if optcopy['with_hg'] is None:
+ optcopy['with_hg'] = os.path.join(BINDIR, "hg")
+ optcopy.pop('anycoverage', None)
+
+ opts = []
+ for opt, value in optcopy.iteritems():
+ name = '--' + opt.replace('_', '-')
+ if value is True:
+ opts.append(name)
+ elif isinstance(value, list):
+ for v in value:
+ opts.append(name + '=' + str(v))
+ elif value is not None:
+ opts.append(name + '=' + str(value))
+
+ tests.reverse()
+ jobs = [[] for j in xrange(options.jobs)]
+ while tests:
+ for job in jobs:
+ if not tests:
+ break
+ test = tests.pop()
+ if test not in whitelist and test in blacklist:
+ blacklisted.append(test)
+ else:
+ job.append(test)
+ fps = {}
+
+ for j, job in enumerate(jobs):
+ if not job:
+ continue
+ rfd, wfd = os.pipe()
+ childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
+ childtmp = os.path.join(HGTMP, 'child%d' % j)
+ childopts += ['--tmpdir', childtmp]
+ cmdline = [PYTHON, sys.argv[0]] + opts + childopts + job
+ vlog(' '.join(cmdline))
+ fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
+ os.close(wfd)
+ signal.signal(signal.SIGINT, signal.SIG_IGN)
+ failures = 0
+ tested, skipped, failed = 0, 0, 0
+ skips = []
+ fails = []
+ while fps:
+ pid, status = os.wait()
+ fp = fps.pop(pid)
+ l = fp.read().splitlines()
+ try:
+ test, skip, fail = map(int, l[:3])
+ except ValueError:
+ test, skip, fail = 0, 0, 0
+ split = -fail or len(l)
+ for s in l[3:split]:
+ skips.append(s.split(" ", 1))
+ for s in l[split:]:
+ fails.append(s.split(" ", 1))
+ tested += test
+ skipped += skip
+ failed += fail
+ vlog('pid %d exited, status %d' % (pid, status))
+ failures |= status
+ print
+ skipped += len(blacklisted)
+ if not options.noskips:
+ for s in skips:
+ print "Skipped %s: %s" % (s[0], s[1])
+ for s in blacklisted:
+ print "Skipped %s: blacklisted" % s
+ for s in fails:
+ print "Failed %s: %s" % (s[0], s[1])
+
+ _checkhglib("Tested")
+ print "# Ran %d tests, %d skipped, %d failed." % (
+ tested, skipped, failed)
+
+ if options.anycoverage:
+ outputcoverage(options)
+ sys.exit(failures != 0)
+
+results = dict(p=[], f=[], s=[], i=[])
+resultslock = threading.Lock()
+iolock = threading.Lock()
+
+def runqueue(options, tests, results):
+ for test in tests:
+ ret = runone(options, test)
+ if options.first and ret is not None and not ret:
+ break
+
+def runtests(options, tests):
+ global DAEMON_PIDS, HGRCPATH
+ DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
+ HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
+
+ try:
+ if INST:
+ installhg(options)
+ _checkhglib("Testing")
+
+ if options.restart:
+ orig = list(tests)
+ while tests:
+ if os.path.exists(tests[0] + ".err"):
+ break
+ tests.pop(0)
+ if not tests:
+ print "running all tests"
+ tests = orig
+
+ runqueue(options, tests, results)
+
+ failed = len(results['f'])
+ tested = len(results['p']) + failed
+ skipped = len(results['s'])
+ ignored = len(results['i'])
+
+ if options.child:
+ fp = os.fdopen(options.child, 'w')
+ fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
+ for s in results['s']:
+ fp.write("%s %s\n" % s)
+ for s in results['f']:
+ fp.write("%s %s\n" % s)
+ fp.close()
+ else:
+ print
+ for s in results['s']:
+ print "Skipped %s: %s" % s
+ for s in results['f']:
+ print "Failed %s: %s" % s
+ _checkhglib("Tested")
+ print "# Ran %d tests, %d skipped, %d failed." % (
+ tested, skipped + ignored, failed)
+
+ if options.anycoverage:
+ outputcoverage(options)
+ except KeyboardInterrupt:
+ failed = True
+ print "\ninterrupted!"
+
+ if failed:
+ sys.exit(1)
+
+def main():
+ (options, args) = parseargs()
+ if not options.child:
+ os.umask(022)
+
+ checktools()
+
+ if len(args) == 0:
+ args = os.listdir(".")
+ args.sort()
+
+ tests = args
+
+ # Reset some environment variables to well-known values so that
+ # the tests produce repeatable output.
+ os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C'
+ os.environ['TZ'] = 'GMT'
+ os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
+ os.environ['CDPATH'] = ''
+ os.environ['COLUMNS'] = '80'
+ os.environ['GREP_OPTIONS'] = ''
+ os.environ['http_proxy'] = ''
+ os.environ['no_proxy'] = ''
+ os.environ['NO_PROXY'] = ''
+ os.environ['TERM'] = 'xterm'
+
+ # unset env related to hooks
+ for k in os.environ.keys():
+ if k.startswith('HG_'):
+ # can't remove on solaris
+ os.environ[k] = ''
+ del os.environ[k]
+
+ global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
+ TESTDIR = os.environ["TESTDIR"] = os.getcwd()
+ if options.tmpdir:
+ options.keep_tmpdir = True
+ tmpdir = options.tmpdir
+ if os.path.exists(tmpdir):
+ # Meaning of tmpdir has changed since 1.3: we used to create
+ # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
+ # tmpdir already exists.
+ sys.exit("error: temp dir %r already exists" % tmpdir)
+
+ # Automatically removing tmpdir sounds convenient, but could
+ # really annoy anyone in the habit of using "--tmpdir=/tmp"
+ # or "--tmpdir=$HOME".
+ #vlog("# Removing temp dir", tmpdir)
+ #shutil.rmtree(tmpdir)
+ os.makedirs(tmpdir)
+ else:
+ d = None
+ if os.name == 'nt':
+ # without this, we get the default temp dir location, but
+ # in all lowercase, which causes troubles with paths (issue3490)
+ d = os.getenv('TMP')
+ tmpdir = tempfile.mkdtemp('', 'hgtests.', d)
+ HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
+ DAEMON_PIDS = None
+ HGRCPATH = None
+
+ os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
+ os.environ["HGMERGE"] = "internal:merge"
+ os.environ["HGUSER"] = "test"
+ os.environ["HGENCODING"] = "ascii"
+ os.environ["HGENCODINGMODE"] = "strict"
+ os.environ["HGPORT"] = str(options.port)
+ os.environ["HGPORT1"] = str(options.port + 1)
+ os.environ["HGPORT2"] = str(options.port + 2)
+
+ if options.with_hg:
+ INST = None
+ BINDIR = os.path.dirname(os.path.realpath(options.with_hg))
+
+ # This looks redundant with how Python initializes sys.path from
+ # the location of the script being executed. Needed because the
+ # "hg" specified by --with-hg is not the only Python script
+ # executed in the test suite that needs to import 'mercurial'
+ # ... which means it's not really redundant at all.
+ PYTHONDIR = BINDIR
+ else:
+ INST = os.path.join(HGTMP, "install")
+ BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
+ PYTHONDIR = os.path.join(INST, "lib", "python")
+
+ os.environ["BINDIR"] = BINDIR
+ os.environ["PYTHON"] = PYTHON
+
+ if not options.child:
+ path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
+ os.environ["PATH"] = os.pathsep.join(path)
+
+ # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
+ # can run .../tests/run-tests.py test-foo where test-foo
+ # adds an extension to HGRC
+ pypath = [PYTHONDIR, TESTDIR]
+ # We have to augment PYTHONPATH, rather than simply replacing
+ # it, in case external libraries are only available via current
+ # PYTHONPATH. (In particular, the Subversion bindings on OS X
+ # are in /opt/subversion.)
+ oldpypath = os.environ.get(IMPL_PATH)
+ if oldpypath:
+ pypath.append(oldpypath)
+ os.environ[IMPL_PATH] = os.pathsep.join(pypath)
+
+ COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
+
+ vlog("# Using TESTDIR", TESTDIR)
+ vlog("# Using HGTMP", HGTMP)
+ vlog("# Using PATH", os.environ["PATH"])
+ vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
+
+ try:
+ if len(tests) > 1 and options.jobs > 1:
+ runchildren(options, tests)
+ else:
+ runtests(options, tests)
+ finally:
+ time.sleep(.1)
+ cleanup(options)
+
+if __name__ == '__main__':
+ main()
diff --git a/tests/sitecustomize.py b/tests/sitecustomize.py
new file mode 100644
index 0000000..50d281f
--- /dev/null
+++ b/tests/sitecustomize.py
@@ -0,0 +1,5 @@
+try:
+ import coverage
+ getattr(coverage, 'process_startup', lambda: None)()
+except ImportError:
+ pass
diff --git a/tests/svn-safe-append.py b/tests/svn-safe-append.py
new file mode 100755
index 0000000..bc70419
--- /dev/null
+++ b/tests/svn-safe-append.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+__doc__ = """Same as `echo a >> b`, but ensures a changed mtime of b.
+Without this svn will not detect workspace changes."""
+
+import sys, os
+
+text = sys.argv[1]
+fname = sys.argv[2]
+
+f = open(fname, "ab")
+try:
+ before = os.fstat(f.fileno()).st_mtime
+ f.write(text)
+ f.write("\n")
+finally:
+ f.close()
+inc = 1
+now = os.stat(fname).st_mtime
+while now == before:
+ t = now + inc
+ inc += 1
+ os.utime(fname, (t, t))
+ now = os.stat(fname).st_mtime
+
diff --git a/tests/svn/branches.svndump b/tests/svn/branches.svndump
new file mode 100644
index 0000000..650980b
--- /dev/null
+++ b/tests/svn/branches.svndump
@@ -0,0 +1,416 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 644ede6c-2b81-4367-9dc8-d786514f2cde
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2010-05-19T20:16:07.429098Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:07.461283Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 5
+hello
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:08.121436Z
+PROPS-END
+
+Node-path: branches/notinbranch
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+Content-length: 12
+
+PROPS-END
+d
+
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Node-path: trunk/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
+Content-length: 12
+
+PROPS-END
+b
+
+
+Node-path: trunk/c
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
+Content-length: 12
+
+PROPS-END
+c
+
+
+Node-path: trunk/dir
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/dir/e
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
+Revision-number: 3
+Prop-content-length: 132
+Content-length: 132
+
+K 7
+svn:log
+V 30
+branch trunk, remove c and dir
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:11.113124Z
+PROPS-END
+
+Node-path: branches/old
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk
+
+
+Node-path: branches/old/dir
+Node-action: delete
+
+
+Node-path: branches/old/c
+Node-action: delete
+
+
+Revision-number: 4
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+change a
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:13.060877Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29
+Content-length: 4
+
+a
+a
+
+
+Revision-number: 5
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+change b
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:14.066212Z
+PROPS-END
+
+Node-path: branches/old/b
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2
+Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95
+Content-length: 4
+
+b
+b
+
+
+Revision-number: 6
+Prop-content-length: 119
+Content-length: 119
+
+K 7
+svn:log
+V 17
+move and update c
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:16.069449Z
+PROPS-END
+
+Node-path: branches/old/c
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 3
+Node-copyfrom-path: trunk/b
+Text-copy-source-md5: 3b5d5c3712955042212316173ccf37be
+Text-copy-source-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
+Text-content-length: 4
+Text-content-md5: 33cb6785d50937d8d307ebb66d6259a7
+Text-content-sha1: 7a6478264aa11a0f4befef356c03e83f2b1f6eba
+Content-length: 4
+
+b
+c
+
+
+Node-path: trunk/b
+Node-action: delete
+
+
+Revision-number: 7
+Prop-content-length: 116
+Content-length: 116
+
+K 7
+svn:log
+V 14
+change b again
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:17.070868Z
+PROPS-END
+
+Node-path: branches/old/b
+Node-kind: file
+Node-action: change
+Text-content-length: 6
+Text-content-md5: cdcfb41554e2d092c13f5e6839e63577
+Text-content-sha1: 17ac58cabedebea235d1b5605531d5b1559797e9
+Content-length: 6
+
+b
+b
+b
+
+
+Revision-number: 8
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+move to old2
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:20.063098Z
+PROPS-END
+
+Node-path: branches/old2
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 7
+Node-copyfrom-path: branches/old
+
+
+Node-path: branches/old
+Node-action: delete
+
+
+Revision-number: 9
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+move back to old
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:22.062931Z
+PROPS-END
+
+Node-path: branches/old
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 8
+Node-copyfrom-path: branches/old2
+
+
+Node-path: branches/old2
+Node-action: delete
+
+
+Revision-number: 10
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+last change to a
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:23.075562Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 2
+
+a
+
+
+Revision-number: 11
+Prop-content-length: 126
+Content-length: 126
+
+K 7
+svn:log
+V 24
+branch trunk@1 into old3
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-19T20:16:25.107655Z
+PROPS-END
+
+Node-path: branches/old3
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 1
+Node-copyfrom-path: trunk
+
+
diff --git a/tests/svn/empty.svndump b/tests/svn/empty.svndump
new file mode 100644
index 0000000..6bd513f
--- /dev/null
+++ b/tests/svn/empty.svndump
@@ -0,0 +1,129 @@
+SVN-fs-dump-format-version: 2
+
+UUID: b70c45d5-2b76-4722-a373-d9babae61626
+
+Revision-number: 0
+Prop-content-length: 260
+Content-length: 260
+
+K 8
+svn:date
+V 27
+2012-04-18T11:35:14.752409Z
+K 17
+svn:sync-from-url
+V 73
+file:///Users/pmezard/dev/hg/hg-pmezard/tests/svn/temp/svn-repo/trunk/dir
+K 18
+svn:sync-from-uuid
+V 36
+56625b9e-e7e9-45be-ab61-052d41f0e1dd
+K 24
+svn:sync-last-merged-rev
+V 1
+4
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:14.769622Z
+K 7
+svn:log
+V 10
+init projA
+PROPS-END
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 107
+Content-length: 107
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:15.052989Z
+K 7
+svn:log
+V 6
+adddir
+PROPS-END
+
+Node-path: trunk/dir
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/dir/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Revision-number: 3
+Prop-content-length: 105
+Content-length: 105
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:16.050353Z
+K 7
+svn:log
+V 4
+addb
+PROPS-END
+
+Revision-number: 4
+Prop-content-length: 105
+Content-length: 105
+
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2012-04-18T11:35:17.050768Z
+K 7
+svn:log
+V 4
+addc
+PROPS-END
+
diff --git a/tests/svn/encoding.svndump b/tests/svn/encoding.svndump
new file mode 100644
index 0000000..350635e
--- /dev/null
+++ b/tests/svn/encoding.svndump
@@ -0,0 +1,280 @@
+SVN-fs-dump-format-version: 2
+
+UUID: afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2009-06-21T16:34:55.835945Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:55.909545Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: tags
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 5
+hello
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:56.150049Z
+PROPS-END
+
+Node-path: trunk/à
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/à/eÌ
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+Content-length: 12
+
+PROPS-END
+d
+
+
+Node-path: trunk/é
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
+Revision-number: 3
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+copy files
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:34:59.089402Z
+PROPS-END
+
+Node-path: trunk/è
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/é
+Text-copy-source-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-copy-source-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+
+
+Node-path: trunk/ù
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/à
+
+
+Node-path: trunk/à
+Node-action: delete
+
+
+Node-path: trunk/é
+Node-action: delete
+
+
+Revision-number: 4
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+remove files
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:00.165121Z
+PROPS-END
+
+Node-path: trunk/è
+Node-action: delete
+
+
+Node-path: trunk/ù
+Node-action: delete
+
+
+Revision-number: 5
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 18
+branch to branché
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:03.079138Z
+PROPS-END
+
+Node-path: branches/branché
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 4
+Node-copyfrom-path: trunk
+
+
+Revision-number: 6
+Prop-content-length: 121
+Content-length: 121
+
+K 7
+svn:log
+V 19
+branch to branchée
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:06.060801Z
+PROPS-END
+
+Node-path: branches/branchée
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: branches/branché
+
+
+Revision-number: 7
+Prop-content-length: 110
+Content-length: 110
+
+K 7
+svn:log
+V 9
+tag trunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:09.061530Z
+PROPS-END
+
+Node-path: tags/branché
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: trunk
+
+
+Revision-number: 8
+Prop-content-length: 114
+Content-length: 114
+
+K 7
+svn:log
+V 12
+tag branché
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T16:35:11.068562Z
+PROPS-END
+
+Node-path: tags/branchée
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: branches/branchée
+
+
diff --git a/tests/svn/move.svndump b/tests/svn/move.svndump
new file mode 100644
index 0000000..eaf08d9
--- /dev/null
+++ b/tests/svn/move.svndump
@@ -0,0 +1,569 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 7d15f7c2-5863-4c16-aa2a-3418b1721d3a
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2010-05-09T13:02:37.336239Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:37.372834Z
+PROPS-END
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Node-path: trunk/d1
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/d1/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
+Content-length: 12
+
+PROPS-END
+b
+
+
+Node-path: trunk/d1/c
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
+Content-length: 12
+
+PROPS-END
+c
+
+
+Node-path: trunk/d2
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/d2/d
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+Content-length: 12
+
+PROPS-END
+d
+
+
+Revision-number: 2
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+commitbeforemove
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:38.049068Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29
+Content-length: 4
+
+a
+a
+
+
+Node-path: trunk/d1/c
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 63fad9092ad37713ebe26b3193f89c41
+Text-content-sha1: ccfb93b7bac6f1520f0adc0eebc2cafe9da80f42
+Content-length: 4
+
+c
+c
+
+
+Revision-number: 3
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+movedtrunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:39.044479Z
+PROPS-END
+
+Node-path: subproject
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk
+
+
+Node-path: trunk
+Node-action: delete
+
+
+Revision-number: 4
+Prop-content-length: 113
+Content-length: 113
+
+K 7
+svn:log
+V 11
+createtrunk
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:40.057804Z
+PROPS-END
+
+Node-path: subproject/trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 5
+Prop-content-length: 116
+Content-length: 116
+
+K 7
+svn:log
+V 14
+createbranches
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:41.058871Z
+PROPS-END
+
+Node-path: subproject/branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 6
+Prop-content-length: 107
+Content-length: 107
+
+K 7
+svn:log
+V 6
+moved1
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:42.046689Z
+PROPS-END
+
+Node-path: subproject/trunk/d1
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: subproject/d1
+
+
+Node-path: subproject/d1
+Node-action: delete
+
+
+Revision-number: 7
+Prop-content-length: 107
+Content-length: 107
+
+K 7
+svn:log
+V 6
+moved2
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:42.071413Z
+PROPS-END
+
+Node-path: subproject/trunk/d2
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: subproject/d2
+
+
+Node-path: subproject/d2
+Node-action: delete
+
+
+Revision-number: 8
+Prop-content-length: 119
+Content-length: 119
+
+K 7
+svn:log
+V 17
+changeb and rm d2
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:43.062018Z
+PROPS-END
+
+Node-path: subproject/trunk/d1/b
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 06ac26ed8b614fc0b141e4542aa067c2
+Text-content-sha1: f6980469e74f7125178e88ec571e06fe6ce86e95
+Content-length: 4
+
+b
+b
+
+
+Node-path: subproject/trunk/d2
+Node-action: delete
+
+
+Revision-number: 9
+Prop-content-length: 113
+Content-length: 113
+
+K 7
+svn:log
+V 11
+moved1again
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:44.047997Z
+PROPS-END
+
+Node-path: subproject/branches/d1
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 8
+Node-copyfrom-path: subproject/trunk/d1
+
+
+Node-path: subproject/trunk/d1
+Node-action: delete
+
+
+Revision-number: 10
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+copyfilefrompast
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:44.086619Z
+PROPS-END
+
+Node-path: subproject/trunk/d
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 7
+Node-copyfrom-path: subproject/trunk/d2/d
+Text-copy-source-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-copy-source-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+
+
+Revision-number: 11
+Prop-content-length: 117
+Content-length: 117
+
+K 7
+svn:log
+V 15
+copydirfrompast
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:44.111550Z
+PROPS-END
+
+Node-path: subproject/trunk/d2
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 7
+Node-copyfrom-path: subproject/trunk/d2
+
+
+Revision-number: 12
+Prop-content-length: 107
+Content-length: 107
+
+K 7
+svn:log
+V 6
+add d3
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:45.067982Z
+PROPS-END
+
+Node-path: subproject/trunk/d3
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: subproject/trunk/d3/d31
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: subproject/trunk/d3/d31/e
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9ffbf43126e33be52cd2bf7e01d627f9
+Text-content-sha1: 094e3afb2fe8dfe82f63731cdcd3b999f4856cff
+Content-length: 12
+
+PROPS-END
+e
+
+
+Node-path: subproject/trunk/d3/f
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 9a8ad92c50cae39aa2c5604fd0ab6d8c
+Text-content-sha1: a9fcd54b25e7e863d72cd47c08af46e61b74b561
+Content-length: 12
+
+PROPS-END
+f
+
+
+Revision-number: 13
+Prop-content-length: 128
+Content-length: 128
+
+K 7
+svn:log
+V 26
+copy dir and remove subdir
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:47.061259Z
+PROPS-END
+
+Node-path: subproject/trunk/d3/d31
+Node-action: delete
+
+
+Node-path: subproject/trunk/d4
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 12
+Node-copyfrom-path: subproject/trunk/d3
+
+
+Revision-number: 14
+Prop-content-length: 110
+Content-length: 110
+
+K 7
+svn:log
+V 9
+add d4old
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:49.063363Z
+PROPS-END
+
+Node-path: subproject/trunk/d4old
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: subproject/trunk/d4old/g
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: f5302386464f953ed581edac03556e55
+Text-content-sha1: a5938ace3f424be1a26904781cdb06d55b614e6b
+Content-length: 12
+
+PROPS-END
+g
+
+
+Revision-number: 15
+Prop-content-length: 125
+Content-length: 125
+
+K 7
+svn:log
+V 23
+rename d4old into d4new
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-05-09T13:02:51.047304Z
+PROPS-END
+
+Node-path: subproject/trunk/d4new
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 14
+Node-copyfrom-path: subproject/trunk/d4old
+
+
+Node-path: subproject/trunk/d4old
+Node-action: delete
+
+
diff --git a/tests/svn/replace.svndump b/tests/svn/replace.svndump
new file mode 100644
index 0000000..8fe58ba
--- /dev/null
+++ b/tests/svn/replace.svndump
@@ -0,0 +1,367 @@
+SVN-fs-dump-format-version: 2
+
+UUID: 97a955ef-0269-44f2-a58f-abd4ad400b2b
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2010-11-26T18:01:12.912988Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 108
+Content-length: 108
+
+K 7
+svn:log
+V 7
+initial
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-11-26T18:01:13.106933Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Node-path: trunk/d
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/d/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
+Content-length: 12
+
+PROPS-END
+b
+
+
+Node-path: trunk/d2
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk/d2/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Node-path: trunk/dlink
+Node-kind: file
+Node-action: add
+Prop-content-length: 33
+Text-content-length: 6
+Text-content-md5: cca56829f18345718a4980bb02b6d8c3
+Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
+Content-length: 39
+
+K 11
+svn:special
+V 1
+*
+PROPS-END
+link d
+
+Node-path: trunk/dlink2
+Node-kind: file
+Node-action: add
+Prop-content-length: 33
+Text-content-length: 6
+Text-content-md5: cca56829f18345718a4980bb02b6d8c3
+Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
+Content-length: 39
+
+K 11
+svn:special
+V 1
+*
+PROPS-END
+link d
+
+Node-path: trunk/dlink3
+Node-kind: file
+Node-action: add
+Prop-content-length: 33
+Text-content-length: 6
+Text-content-md5: cca56829f18345718a4980bb02b6d8c3
+Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
+Content-length: 39
+
+K 11
+svn:special
+V 1
+*
+PROPS-END
+link d
+
+Revision-number: 2
+Prop-content-length: 117
+Content-length: 117
+
+K 7
+svn:log
+V 15
+clobber symlink
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-11-26T18:01:14.073483Z
+PROPS-END
+
+Node-path: trunk/dlink3
+Node-kind: file
+Node-action: change
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
+Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
+Content-length: 12
+
+PROPS-END
+d
+
+
+Revision-number: 3
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 8
+clobber1
+K 10
+svn:author
+V 4
+evil
+K 8
+svn:date
+V 27
+2010-11-26T18:01:16.205184Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: dir
+Node-action: delete
+
+Node-path: trunk/a
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/d
+
+
+
+
+Node-path: trunk/dlink
+Node-kind: dir
+Node-action: delete
+
+Node-path: trunk/dlink
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 2
+Node-copyfrom-path: trunk/d
+
+
+
+
+Revision-number: 4
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 8
+clobber2
+K 10
+svn:author
+V 4
+evil
+K 8
+svn:date
+V 27
+2010-11-26T18:01:16.395962Z
+PROPS-END
+
+Node-path: trunk/dlink3
+Node-kind: file
+Node-action: delete
+
+Node-path: trunk/dlink3
+Node-kind: file
+Node-action: add
+Node-copyfrom-rev: 3
+Node-copyfrom-path: trunk/dlink2
+Text-copy-source-md5: cca56829f18345718a4980bb02b6d8c3
+Text-copy-source-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
+
+
+
+
+Revision-number: 5
+Prop-content-length: 106
+Content-length: 106
+
+K 7
+svn:log
+V 5
+adddb
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-11-26T18:01:16.445072Z
+PROPS-END
+
+Node-path: trunk/d2/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
+Content-length: 12
+
+PROPS-END
+b
+
+
+Revision-number: 6
+Prop-content-length: 107
+Content-length: 107
+
+K 7
+svn:log
+V 6
+branch
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2010-11-26T18:01:19.075874Z
+PROPS-END
+
+Node-path: branches/branch
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: trunk
+
+
+Node-path: branches/branch/d2/c
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
+Content-length: 12
+
+PROPS-END
+c
+
+
+Node-path: branches/branch/d2/b
+Node-action: delete
+
+
+Revision-number: 7
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 10
+clobberdir
+K 10
+svn:author
+V 4
+evil
+K 8
+svn:date
+V 27
+2010-11-26T18:01:21.202158Z
+PROPS-END
+
+Node-path: trunk/d2
+Node-kind: dir
+Node-action: delete
+
+Node-path: trunk/d2
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 6
+Node-copyfrom-path: branches/branch/d2
+
+
+
+
diff --git a/tests/svn/startrev.svndump b/tests/svn/startrev.svndump
new file mode 100644
index 0000000..00c6fec
--- /dev/null
+++ b/tests/svn/startrev.svndump
@@ -0,0 +1,240 @@
+SVN-fs-dump-format-version: 2
+
+UUID: c731c652-65e9-4325-a17e-fed96a319f22
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2008-12-06T13:44:21.642421Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:21.759281Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: tags
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+createab
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:22.179257Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Content-length: 12
+
+PROPS-END
+a
+
+
+Node-path: trunk/b
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 3b5d5c3712955042212316173ccf37be
+Content-length: 12
+
+PROPS-END
+b
+
+
+Revision-number: 3
+Prop-content-length: 108
+Content-length: 108
+
+K 7
+svn:log
+V 7
+removeb
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:23.176546Z
+PROPS-END
+
+Node-path: trunk/b
+Node-action: delete
+
+
+Revision-number: 4
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+changeaa
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:25.147151Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Content-length: 4
+
+a
+a
+
+
+Revision-number: 5
+Prop-content-length: 119
+Content-length: 119
+
+K 7
+svn:log
+V 17
+branch, changeaaa
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:28.158475Z
+PROPS-END
+
+Node-path: branches/branch1
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 4
+Node-copyfrom-path: trunk
+Prop-content-length: 34
+Content-length: 34
+
+K 13
+svn:mergeinfo
+V 0
+
+PROPS-END
+
+
+Node-path: branches/branch1/a
+Node-kind: file
+Node-action: change
+Text-content-length: 6
+Text-content-md5: 7d4ebf8f298d22fc349a91725b00af1c
+Content-length: 6
+
+a
+a
+a
+
+
+Revision-number: 6
+Prop-content-length: 117
+Content-length: 117
+
+K 7
+svn:log
+V 15
+addc,changeaaaa
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2008-12-06T13:44:29.180655Z
+PROPS-END
+
+Node-path: branches/branch1/a
+Node-kind: file
+Node-action: change
+Text-content-length: 8
+Text-content-md5: d12178e74d8774e34361e0a08d1fd2b7
+Content-length: 8
+
+a
+a
+a
+a
+
+
+Node-path: branches/branch1/c
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
+Content-length: 12
+
+PROPS-END
+c
+
+
diff --git a/tests/svn/svndump-branches.sh b/tests/svn/svndump-branches.sh
new file mode 100755
index 0000000..c721758
--- /dev/null
+++ b/tests/svn/svndump-branches.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+#
+# Use this script to generate branches.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+echo a > trunk/a
+echo b > trunk/b
+echo c > trunk/c
+mkdir trunk/dir
+echo e > trunk/dir/e
+# Add a file within branches, used to confuse branch detection
+echo d > branches/notinbranch
+svn add trunk/a trunk/b trunk/c trunk/dir branches/notinbranch
+svn ci -m hello
+svn up
+
+# Branch to old
+svn copy trunk branches/old
+svn rm branches/old/c
+svn rm branches/old/dir
+svn ci -m "branch trunk, remove c and dir"
+svn up
+
+# Update trunk
+echo a >> trunk/a
+svn ci -m "change a"
+
+# Update old branch
+echo b >> branches/old/b
+svn ci -m "change b"
+
+# Create a cross-branch revision
+svn move trunk/b branches/old/c
+echo c >> branches/old/c
+svn ci -m "move and update c"
+
+# Update old branch again
+echo b >> branches/old/b
+svn ci -m "change b again"
+
+# Move back and forth between branch of similar names
+# This used to generate fake copy records
+svn up
+svn move branches/old branches/old2
+svn ci -m "move to old2"
+svn move branches/old2 branches/old
+svn ci -m "move back to old"
+
+# Update trunk again
+echo a > trunk/a
+svn ci -m "last change to a"
+
+# Branch again from a converted revision
+svn copy -r 1 $svnurl/trunk branches/old3
+svn ci -m "branch trunk@1 into old3"
+cd ..
+
+svnadmin dump svn-repo > ../branches.svndump
diff --git a/tests/svn/svndump-empty.sh b/tests/svn/svndump-empty.sh
new file mode 100755
index 0000000..a4e96b2
--- /dev/null
+++ b/tests/svn/svndump-empty.sh
@@ -0,0 +1,47 @@
+#!/bin/sh
+#
+# Use this script to generate empty.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+mkdir trunk/dir
+echo a > trunk/dir/a
+svn add trunk/dir
+svn ci -m adddir
+
+echo b > trunk/b
+svn add trunk/b
+svn ci -m addb
+
+echo c > c
+svn add c
+svn ci -m addc
+cd ..
+
+# svnsync repo/trunk/dir only so the last two revisions are empty
+svnadmin create svn-empty
+cat > svn-empty/hooks/pre-revprop-change <<EOF
+#!/bin/sh
+exit 0
+EOF
+chmod +x svn-empty/hooks/pre-revprop-change
+svnsync init --username svnsync file://`pwd`/svn-empty file://`pwd`/svn-repo/trunk/dir
+svnsync sync file://`pwd`/svn-empty
+svn log -v file://`pwd`/svn-empty
+
+svnadmin dump svn-empty > ../empty.svndump
diff --git a/tests/svn/svndump-encoding.sh b/tests/svn/svndump-encoding.sh
new file mode 100755
index 0000000..d3f6711
--- /dev/null
+++ b/tests/svn/svndump-encoding.sh
@@ -0,0 +1,57 @@
+# -*- coding: utf-8 -*-
+#!/bin/sh
+#
+# Use this script to generate encoding.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+echo e > trunk/é
+mkdir trunk/à
+echo d > trunk/à/é
+svn add trunk/é trunk/à
+svn ci -m hello
+
+# Copy files and directories
+svn mv trunk/é trunk/è
+svn mv trunk/à trunk/ù
+svn ci -m "copy files"
+
+# Remove files
+svn rm trunk/è
+svn rm trunk/ù
+svn ci -m 'remove files'
+
+# Create branches with and from weird names
+svn up
+svn cp trunk branches/branché
+echo a > branches/branché/a
+svn ci -m 'branch to branché'
+svn up
+svn cp branches/branché branches/branchée
+echo a >> branches/branché/a
+svn ci -m 'branch to branchée'
+
+# Create tag with weird name
+svn up
+svn cp trunk tags/branché
+svn ci -m 'tag trunk'
+svn cp branches/branchée tags/branchée
+svn ci -m 'tag branché'
+cd ..
+
+svnadmin dump svn-repo > ../encoding.svndump
diff --git a/tests/svn/svndump-move.sh b/tests/svn/svndump-move.sh
new file mode 100755
index 0000000..21b8c32
--- /dev/null
+++ b/tests/svn/svndump-move.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# Use this script to generate move.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+echo a > trunk/a
+mkdir trunk/d1
+mkdir trunk/d2
+echo b > trunk/d1/b
+echo c > trunk/d1/c
+echo d > trunk/d2/d
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+# Build a module renaming chain which used to confuse the converter.
+# Update svn repository
+echo a >> trunk/a
+echo c >> trunk/d1/c
+svn ci -m commitbeforemove
+svn mv $svnurl/trunk $svnurl/subproject -m movedtrunk
+svn up
+mkdir subproject/trunk
+svn add subproject/trunk
+svn ci -m createtrunk
+mkdir subproject/branches
+svn add subproject/branches
+svn ci -m createbranches
+svn mv $svnurl/subproject/d1 $svnurl/subproject/trunk/d1 -m moved1
+svn mv $svnurl/subproject/d2 $svnurl/subproject/trunk/d2 -m moved2
+svn up
+echo b >> subproject/trunk/d1/b
+
+svn rm subproject/trunk/d2
+svn ci -m "changeb and rm d2"
+svn mv $svnurl/subproject/trunk/d1 $svnurl/subproject/branches/d1 -m moved1again
+
+if svn help copy | grep 'SRC\[@REV\]' > /dev/null 2>&1; then
+ # SVN >= 1.5 replaced the -r REV syntax with @REV
+ # Copy a file from a past revision
+ svn copy $svnurl/subproject/trunk/d2/d@7 $svnurl/subproject/trunk -m copyfilefrompast
+ # Copy a directory from a past revision
+ svn copy $svnurl/subproject/trunk/d2@7 $svnurl/subproject/trunk -m copydirfrompast
+else
+ # Copy a file from a past revision
+ svn copy -r 7 $svnurl/subproject/trunk/d2/d $svnurl/subproject/trunk -m copyfilefrompast
+ # Copy a directory from a past revision
+ svn copy -r 7 $svnurl/subproject/trunk/d2 $svnurl/subproject/trunk -m copydirfrompast
+fi
+
+# Copy a directory while removing a subdirectory
+svn up
+mkdir -p subproject/trunk/d3/d31
+echo e > subproject/trunk/d3/d31/e
+echo f > subproject/trunk/d3/f
+svn add subproject/trunk/d3
+svn ci -m "add d3"
+svn copy subproject/trunk/d3 subproject/trunk/d4
+svn rm subproject/trunk/d3/d31
+svn ci -m "copy dir and remove subdir"
+
+# Test directory moves
+svn up
+mkdir -p subproject/trunk/d4old
+echo g > subproject/trunk/d4old/g
+svn add subproject/trunk/d4old
+svn ci -m "add d4old"
+svn mv subproject/trunk/d4old subproject/trunk/d4new
+svn ci -m "rename d4old into d4new"
+
+cd ..
+
+svnadmin dump svn-repo > ../move.svndump \ No newline at end of file
diff --git a/tests/svn/svndump-replace.sh b/tests/svn/svndump-replace.sh
new file mode 100755
index 0000000..c427431
--- /dev/null
+++ b/tests/svn/svndump-replace.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+RSVN="`pwd`/rsvn.py"
+export PATH=/bin:/usr/bin
+mkdir temp
+cd temp
+
+svnadmin create repo
+svn co file://`pwd`/repo wc
+
+cd wc
+mkdir trunk branches
+cd trunk
+echo a > a
+mkdir d
+echo b > d/b
+ln -s d dlink
+ln -s d dlink2
+ln -s d dlink3
+mkdir d2
+echo a > d2/a
+cd ..
+svn add *
+svn ci -m 'initial'
+# Clobber symlink with file with similar content
+cd trunk
+ls -Alh
+readlink dlink3 > dlink3tmp
+rm dlink3
+mv dlink3tmp dlink3
+svn propdel svn:special dlink3
+svn ci -m 'clobber symlink'
+cd ..
+svn up
+
+# Clobber files and symlink with directories
+cd ..
+cat > clobber.rsvn <<EOF
+rdelete trunk/a
+rdelete trunk/dlink
+rcopy trunk/d trunk/a
+rcopy trunk/d trunk/dlink
+EOF
+
+python $RSVN --message=clobber1 --username=evil `pwd`/repo < clobber.rsvn
+
+# Clobber non-symlink with symlink with same content (kudos openwrt)
+cat > clobber.rsvn <<EOF
+rdelete trunk/dlink3
+rcopy trunk/dlink2 trunk/dlink3
+EOF
+
+python $RSVN --message=clobber2 --username=evil `pwd`/repo < clobber.rsvn
+
+# Create d2 in branch so d2 has 'a' is in branch/d2 and trunk/d2,
+# 'b' is in trunk/d2 and 'c' is in branch/d2
+cd wc/trunk
+echo b > d2/b
+svn add d2/b
+svn ci -m adddb
+cd ..
+svn up
+svn cp trunk branches/branch
+cd branches/branch
+svn rm d2/b
+echo c > d2/c
+svn add d2/c
+cd ../..
+svn ci -m branch
+svn up
+cd ..
+
+cat > clobber.rsvn <<EOF
+rdelete trunk/d2
+rcopy branches/branch/d2 trunk/d2
+EOF
+python $RSVN --message=clobberdir --username=evil `pwd`/repo < clobber.rsvn
+
+svn log -v file://`pwd`/repo
+
+svnadmin dump repo > ../replace.svndump
diff --git a/tests/svn/svndump-startrev.sh b/tests/svn/svndump-startrev.sh
new file mode 100755
index 0000000..36c3a9f
--- /dev/null
+++ b/tests/svn/svndump-startrev.sh
@@ -0,0 +1,45 @@
+#!/bin/sh
+#
+# Use this script to generate startrev.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+echo a > trunk/a
+echo b > trunk/b
+svn add trunk/a trunk/b
+svn ci -m createab
+svn rm trunk/b
+svn ci -m removeb
+svn up
+echo a >> trunk/a
+svn ci -m changeaa
+
+# Branch
+svn up
+svn copy trunk branches/branch1
+echo a >> branches/branch1/a
+svn ci -m "branch, changeaaa"
+
+echo a >> branches/branch1/a
+echo c > branches/branch1/c
+svn add branches/branch1/c
+svn ci -m "addc,changeaaaa"
+svn up
+cd ..
+
+svnadmin dump svn-repo > ../startrev.svndump \ No newline at end of file
diff --git a/tests/svn/svndump-tags.sh b/tests/svn/svndump-tags.sh
new file mode 100755
index 0000000..71cfd96
--- /dev/null
+++ b/tests/svn/svndump-tags.sh
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# Use this script to generate tags.svndump
+#
+
+mkdir temp
+cd temp
+
+mkdir project-orig
+cd project-orig
+mkdir trunk
+mkdir branches
+mkdir tags
+mkdir unrelated
+cd ..
+
+svnadmin create svn-repo
+svnurl=file://`pwd`/svn-repo
+svn import project-orig $svnurl -m "init projA"
+
+svn co $svnurl project
+cd project
+echo a > trunk/a
+svn add trunk/a
+svn ci -m adda
+echo a >> trunk/a
+svn ci -m changea
+echo a >> trunk/a
+svn ci -m changea2
+# Add an unrelated commit to test that tags are bound to the
+# correct "from" revision and not a dummy one
+echo a >> unrelated/dummy
+svn add unrelated/dummy
+svn ci -m unrelatedchange
+# Tag current revision
+svn up
+svn copy trunk tags/trunk.v1
+svn copy trunk tags/trunk.badtag
+svn ci -m "tagging trunk.v1 trunk.badtag"
+echo a >> trunk/a
+svn ci -m changea3
+# Fix the bad tag
+# trunk.badtag should not show in converted tags
+svn up
+svn mv tags/trunk.badtag tags/trunk.goodtag
+svn ci -m "fix trunk.badtag"
+echo a >> trunk/a
+svn ci -m changea
+# Delete goodtag and recreate it, to test we pick the good one
+svn rm tags/trunk.goodtag
+svn ci -m removegoodtag
+svn up
+svn copy trunk tags/trunk.goodtag
+svn ci -m recreategoodtag
+cd ..
+
+svnadmin dump svn-repo > ../tags.svndump \ No newline at end of file
diff --git a/tests/svn/tags.svndump b/tests/svn/tags.svndump
new file mode 100644
index 0000000..154b390
--- /dev/null
+++ b/tests/svn/tags.svndump
@@ -0,0 +1,364 @@
+SVN-fs-dump-format-version: 2
+
+UUID: a9c3b03d-cffa-4248-8023-ecf4b2bdf5d5
+
+Revision-number: 0
+Prop-content-length: 56
+Content-length: 56
+
+K 8
+svn:date
+V 27
+2009-04-29T19:26:51.708679Z
+PROPS-END
+
+Revision-number: 1
+Prop-content-length: 112
+Content-length: 112
+
+K 7
+svn:log
+V 10
+init projA
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:26:52.115023Z
+PROPS-END
+
+Node-path: branches
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: tags
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: trunk
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Node-path: unrelated
+Node-kind: dir
+Node-action: add
+Prop-content-length: 10
+Content-length: 10
+
+PROPS-END
+
+
+Revision-number: 2
+Prop-content-length: 105
+Content-length: 105
+
+K 7
+svn:log
+V 4
+adda
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:26:53.109819Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Revision-number: 3
+Prop-content-length: 108
+Content-length: 108
+
+K 7
+svn:log
+V 7
+changea
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:26:54.073017Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 4
+Text-content-md5: 0d227f1abf8c2932d342e9b99cc957eb
+Text-content-sha1: d7c8127a20a396cff08af086a1c695b0636f0c29
+Content-length: 4
+
+a
+a
+
+
+Revision-number: 4
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+changea2
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:26:55.076032Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 6
+Text-content-md5: 7d4ebf8f298d22fc349a91725b00af1c
+Text-content-sha1: 92f31bc48f52339253fce6cad9f2f0c95b302f7e
+Content-length: 6
+
+a
+a
+a
+
+
+Revision-number: 5
+Prop-content-length: 117
+Content-length: 117
+
+K 7
+svn:log
+V 15
+unrelatedchange
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:26:56.095784Z
+PROPS-END
+
+Node-path: unrelated/dummy
+Node-kind: file
+Node-action: add
+Prop-content-length: 10
+Text-content-length: 2
+Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
+Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
+Content-length: 12
+
+PROPS-END
+a
+
+
+Revision-number: 6
+Prop-content-length: 131
+Content-length: 131
+
+K 7
+svn:log
+V 29
+tagging trunk.v1 trunk.badtag
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:00.074864Z
+PROPS-END
+
+Node-path: tags/trunk.badtag
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: trunk
+
+
+Node-path: tags/trunk.v1
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: trunk
+
+
+Revision-number: 7
+Prop-content-length: 109
+Content-length: 109
+
+K 7
+svn:log
+V 8
+changea3
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:01.073910Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 8
+Text-content-md5: d12178e74d8774e34361e0a08d1fd2b7
+Text-content-sha1: cce0b2a263066e26610df9082b7b3c810f71262e
+Content-length: 8
+
+a
+a
+a
+a
+
+
+Revision-number: 8
+Prop-content-length: 118
+Content-length: 118
+
+K 7
+svn:log
+V 16
+fix trunk.badtag
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:04.073542Z
+PROPS-END
+
+Node-path: tags/trunk.goodtag
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 7
+Node-copyfrom-path: tags/trunk.badtag
+
+
+Node-path: tags/trunk.badtag
+Node-action: delete
+
+
+Revision-number: 9
+Prop-content-length: 108
+Content-length: 108
+
+K 7
+svn:log
+V 7
+changea
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:05.095204Z
+PROPS-END
+
+Node-path: trunk/a
+Node-kind: file
+Node-action: change
+Text-content-length: 10
+Text-content-md5: 3f65cbdca1b64c2f8f574fccae24f3a4
+Text-content-sha1: 5c077263421de2abff9dbe867921bc6810811aa2
+Content-length: 10
+
+a
+a
+a
+a
+a
+
+
+Revision-number: 10
+Prop-content-length: 115
+Content-length: 115
+
+K 7
+svn:log
+V 13
+removegoodtag
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:06.089193Z
+PROPS-END
+
+Node-path: tags/trunk.goodtag
+Node-action: delete
+
+
+Revision-number: 11
+Prop-content-length: 117
+Content-length: 117
+
+K 7
+svn:log
+V 15
+recreategoodtag
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-04-29T19:27:09.070471Z
+PROPS-END
+
+Node-path: tags/trunk.goodtag
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 10
+Node-copyfrom-path: trunk
+
+
diff --git a/tests/svnxml.py b/tests/svnxml.py
new file mode 100644
index 0000000..b3b2b63
--- /dev/null
+++ b/tests/svnxml.py
@@ -0,0 +1,51 @@
+# Read the output of a "svn log --xml" command on stdin, parse it and
+# print a subset of attributes common to all svn versions tested by
+# hg.
+import xml.dom.minidom, sys
+
+def xmltext(e):
+ return ''.join(c.data for c
+ in e.childNodes
+ if c.nodeType == c.TEXT_NODE)
+
+def parseentry(entry):
+ e = {}
+ e['revision'] = entry.getAttribute('revision')
+ e['author'] = xmltext(entry.getElementsByTagName('author')[0])
+ e['msg'] = xmltext(entry.getElementsByTagName('msg')[0])
+ e['paths'] = []
+ paths = entry.getElementsByTagName('paths')
+ if paths:
+ paths = paths[0]
+ for p in paths.getElementsByTagName('path'):
+ action = p.getAttribute('action')
+ path = xmltext(p)
+ frompath = p.getAttribute('copyfrom-path')
+ fromrev = p.getAttribute('copyfrom-rev')
+ e['paths'].append((path, action, frompath, fromrev))
+ return e
+
+def parselog(data):
+ entries = []
+ doc = xml.dom.minidom.parseString(data)
+ for e in doc.getElementsByTagName('logentry'):
+ entries.append(parseentry(e))
+ return entries
+
+def printentries(entries):
+ fp = sys.stdout
+ for e in entries:
+ for k in ('revision', 'author', 'msg'):
+ fp.write(('%s: %s\n' % (k, e[k])).encode('utf-8'))
+ for path, action, fpath, frev in sorted(e['paths']):
+ frominfo = ''
+ if frev:
+ frominfo = ' (from %s@%s)' % (fpath, frev)
+ p = ' %s %s%s\n' % (action, path, frominfo)
+ fp.write(p.encode('utf-8'))
+
+if __name__ == '__main__':
+ data = sys.stdin.read()
+ entries = parselog(data)
+ printentries(entries)
+
diff --git a/tests/test-1102.t b/tests/test-1102.t
new file mode 100644
index 0000000..61e01e5
--- /dev/null
+++ b/tests/test-1102.t
@@ -0,0 +1,17 @@
+ $ rm -rf a
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+ $ hg tag t1 # 1
+ $ hg tag --remove t1 # 2
+
+ $ hg co 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg tag -f -r0 t1
+ $ hg tags
+ tip 3:a49829c4fc11
+ t1 0:f7b1eb17ad24
+
+ $ cd ..
diff --git a/tests/test-1993.t b/tests/test-1993.t
new file mode 100644
index 0000000..317cba2
--- /dev/null
+++ b/tests/test-1993.t
@@ -0,0 +1,48 @@
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+ $ echo b > b
+ $ hg ci -Am1
+ adding b
+ $ hg tag -r0 default
+ warning: tag default conflicts with existing branch name
+ $ hg log
+ changeset: 2:30a83d1e4a1e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag default for changeset f7b1eb17ad24
+
+ changeset: 1:925d80f479bb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 0:f7b1eb17ad24
+ tag: default
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ $ hg update 'tag(default)'
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 0:f7b1eb17ad24
+ tag: default
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ $ hg update 'branch(default)'
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 2:30a83d1e4a1e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag default for changeset f7b1eb17ad24
+
+
+ $ cd ..
diff --git a/tests/test-586.t b/tests/test-586.t
new file mode 100644
index 0000000..71b3cbf
--- /dev/null
+++ b/tests/test-586.t
@@ -0,0 +1,92 @@
+Issue586: removing remote files after merge appears to corrupt the
+dirstate
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg init ../b
+ $ cd ../b
+ $ echo b > b
+ $ hg ci -Amb
+ adding b
+
+ $ hg pull -f ../a
+ pulling from ../a
+ searching for changes
+ warning: repository is unrelated
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg rm -f a
+ $ hg ci -Amc
+
+ $ hg st -A
+ C b
+ $ cd ..
+
+Issue1433: Traceback after two unrelated pull, two move, a merge and
+a commit (related to issue586)
+
+create test repos
+
+ $ hg init repoa
+ $ touch repoa/a
+ $ hg -R repoa ci -Am adda
+ adding a
+
+ $ hg init repob
+ $ touch repob/b
+ $ hg -R repob ci -Am addb
+ adding b
+
+ $ hg init repoc
+ $ cd repoc
+ $ hg pull ../repoa
+ pulling from ../repoa
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkdir tst
+ $ hg mv * tst
+ $ hg ci -m "import a in tst"
+ $ hg pull -f ../repob
+ pulling from ../repob
+ searching for changes
+ warning: repository is unrelated
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+merge both repos
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ mkdir src
+
+move b content
+
+ $ hg mv b src
+ $ hg ci -m "import b in src"
+ $ hg manifest
+ src/b
+ tst/a
+
+ $ cd ..
diff --git a/tests/test-abort-checkin.t b/tests/test-abort-checkin.t
new file mode 100644
index 0000000..c7a3c98
--- /dev/null
+++ b/tests/test-abort-checkin.t
@@ -0,0 +1,35 @@
+ $ cat > abortcommit.py <<EOF
+ > from mercurial import util
+ > def hook(**args):
+ > raise util.Abort("no commits allowed")
+ > def reposetup(ui, repo):
+ > repo.ui.setconfig("hooks", "pretxncommit.nocommits", hook)
+ > EOF
+ $ abspath=`pwd`/abortcommit.py
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "abortcommit = $abspath" >> $HGRCPATH
+
+ $ hg init foo
+ $ cd foo
+ $ echo foo > foo
+ $ hg add foo
+
+mq may keep a reference to the repository so __del__ will not be
+called and .hg/journal.dirstate will not be deleted:
+
+ $ hg ci -m foo
+ error: pretxncommit.nocommits hook failed: no commits allowed
+ transaction abort!
+ rollback completed
+ abort: no commits allowed
+ [255]
+ $ hg ci -m foo
+ error: pretxncommit.nocommits hook failed: no commits allowed
+ transaction abort!
+ rollback completed
+ abort: no commits allowed
+ [255]
+
+ $ cd ..
diff --git a/tests/test-acl.t b/tests/test-acl.t
new file mode 100644
index 0000000..6105d5d
--- /dev/null
+++ b/tests/test-acl.t
@@ -0,0 +1,2133 @@
+ > do_push()
+ > {
+ > user=$1
+ > shift
+ > echo "Pushing as user $user"
+ > echo 'hgrc = """'
+ > sed -e 1,2d b/.hg/hgrc | grep -v fakegroups.py
+ > echo '"""'
+ > if test -f acl.config; then
+ > echo 'acl.config = """'
+ > cat acl.config
+ > echo '"""'
+ > fi
+ > # On AIX /etc/profile sets LOGNAME read-only. So
+ > # LOGNAME=$user hg --cws a --debug push ../b
+ > # fails with "This variable is read only."
+ > # Use env to work around this.
+ > env LOGNAME=$user hg --cwd a --debug push ../b
+ > hg --cwd b rollback
+ > hg --cwd b --quiet tip
+ > echo
+ > }
+
+ > init_config()
+ > {
+ > cat > fakegroups.py <<EOF
+ > from hgext import acl
+ > def fakegetusers(ui, group):
+ > try:
+ > return acl._getusersorig(ui, group)
+ > except:
+ > return ["fred", "betty"]
+ > acl._getusersorig = acl._getusers
+ > acl._getusers = fakegetusers
+ > EOF
+ > rm -f acl.config
+ > cat > $config <<EOF
+ > [hooks]
+ > pretxnchangegroup.acl = python:hgext.acl.hook
+ > [acl]
+ > sources = push
+ > [extensions]
+ > f=`pwd`/fakegroups.py
+ > EOF
+ > }
+
+ $ hg init a
+ $ cd a
+ $ mkdir foo foo/Bar quux
+ $ echo 'in foo' > foo/file.txt
+ $ echo 'in foo/Bar' > foo/Bar/file.txt
+ $ echo 'in quux' > quux/file.py
+ $ hg add -q
+ $ hg ci -m 'add files' -d '1000000 0'
+ $ echo >> foo/file.txt
+ $ hg ci -m 'change foo/file' -d '1000001 0'
+ $ echo >> foo/Bar/file.txt
+ $ hg ci -m 'change foo/Bar/file' -d '1000002 0'
+ $ echo >> quux/file.py
+ $ hg ci -m 'change quux/file' -d '1000003 0'
+ $ hg tip --quiet
+ 3:911600dab2ae
+
+ $ cd ..
+ $ hg clone -r 0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ config=b/.hg/hgrc
+
+Extension disabled for lack of a hook
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+ $ echo '[hooks]' >> $config
+ $ echo 'pretxnchangegroup.acl = python:hgext.acl.hook' >> $config
+
+Extension disabled for lack of acl.sources
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: changes have source "push" - skipping
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+No [acl.allow]/[acl.deny]
+
+ $ echo '[acl]' >> $config
+ $ echo 'sources = push' >> $config
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+Empty [acl.allow]
+
+ $ echo '[acl.allow]' >> $config
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 0 entries for user fred
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ no rollback information available
+ 0:6675d58eff77
+
+
+fred is allowed inside foo/
+
+ $ echo 'foo/** = fred' >> $config
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ no rollback information available
+ 0:6675d58eff77
+
+
+Empty [acl.deny]
+
+ $ echo '[acl.deny]' >> $config
+ $ do_push barney
+ Pushing as user barney
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "barney"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 0 entries for user barney
+ acl: acl.deny enabled, 0 entries for user barney
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "barney" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "barney" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ no rollback information available
+ 0:6675d58eff77
+
+
+fred is allowed inside foo/, but not foo/bar/ (case matters)
+
+ $ echo 'foo/bar/** = fred' >> $config
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny enabled, 1 entries for user fred
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ no rollback information available
+ 0:6675d58eff77
+
+
+fred is allowed inside foo/, but not foo/Bar/
+
+ $ echo 'foo/Bar/** = fred' >> $config
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny enabled, 2 entries for user fred
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ no rollback information available
+ 0:6675d58eff77
+
+
+ $ echo 'barney is not mentioned => not allowed anywhere'
+ barney is not mentioned => not allowed anywhere
+ $ do_push barney
+ Pushing as user barney
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "barney"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 0 entries for user barney
+ acl: acl.deny enabled, 0 entries for user barney
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "barney" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "barney" not allowed on "foo/file.txt" (changeset "ef1ea85a6374")
+ no rollback information available
+ 0:6675d58eff77
+
+
+barney is allowed everywhere
+
+ $ echo '[acl.allow]' >> $config
+ $ echo '** = barney' >> $config
+ $ do_push barney
+ Pushing as user barney
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ [acl.allow]
+ ** = barney
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "barney"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user barney
+ acl: acl.deny enabled, 0 entries for user barney
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+wilma can change files with a .txt extension
+
+ $ echo '**/*.txt = wilma' >> $config
+ $ do_push wilma
+ Pushing as user wilma
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ [acl.allow]
+ ** = barney
+ **/*.txt = wilma
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "wilma"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user wilma
+ acl: acl.deny enabled, 0 entries for user wilma
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "wilma" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ transaction abort!
+ rollback completed
+ abort: acl: user "wilma" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ no rollback information available
+ 0:6675d58eff77
+
+
+file specified by acl.config does not exist
+
+ $ echo '[acl]' >> $config
+ $ echo 'config = ../acl.config' >> $config
+ $ do_push barney
+ Pushing as user barney
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ [acl.allow]
+ ** = barney
+ **/*.txt = wilma
+ [acl]
+ config = ../acl.config
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "barney"
+ error: pretxnchangegroup.acl hook raised an exception: [Errno 2] *: '../acl.config' (glob)
+ transaction abort!
+ rollback completed
+ abort: *: ../acl.config (glob)
+ no rollback information available
+ 0:6675d58eff77
+
+
+betty is allowed inside foo/ by a acl.config file
+
+ $ echo '[acl.allow]' >> acl.config
+ $ echo 'foo/** = betty' >> acl.config
+ $ do_push betty
+ Pushing as user betty
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ [acl.allow]
+ ** = barney
+ **/*.txt = wilma
+ [acl]
+ config = ../acl.config
+ """
+ acl.config = """
+ [acl.allow]
+ foo/** = betty
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "betty"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user betty
+ acl: acl.deny enabled, 0 entries for user betty
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "betty" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ transaction abort!
+ rollback completed
+ abort: acl: user "betty" not allowed on "quux/file.py" (changeset "911600dab2ae")
+ no rollback information available
+ 0:6675d58eff77
+
+
+acl.config can set only [acl.allow]/[acl.deny]
+
+ $ echo '[hooks]' >> acl.config
+ $ echo 'changegroup.acl = false' >> acl.config
+ $ do_push barney
+ Pushing as user barney
+ hgrc = """
+ [hooks]
+ pretxnchangegroup.acl = python:hgext.acl.hook
+ [acl]
+ sources = push
+ [acl.allow]
+ foo/** = fred
+ [acl.deny]
+ foo/bar/** = fred
+ foo/Bar/** = fred
+ [acl.allow]
+ ** = barney
+ **/*.txt = wilma
+ [acl]
+ config = ../acl.config
+ """
+ acl.config = """
+ [acl.allow]
+ foo/** = betty
+ [hooks]
+ changegroup.acl = false
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "barney"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user barney
+ acl: acl.deny enabled, 0 entries for user barney
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+asterisk
+
+ $ init_config
+
+asterisk test
+
+ $ echo '[acl.allow]' >> $config
+ $ echo "** = fred" >> $config
+
+fred is always allowed
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow]
+ ** = fred
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+ $ echo '[acl.deny]' >> $config
+ $ echo "foo/Bar/** = *" >> $config
+
+no one is allowed inside foo/Bar/
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow]
+ ** = fred
+ [acl.deny]
+ foo/Bar/** = *
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny enabled, 1 entries for user fred
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ no rollback information available
+ 0:6675d58eff77
+
+
+Groups
+
+ $ init_config
+
+OS-level groups
+
+ $ echo '[acl.allow]' >> $config
+ $ echo "** = @group1" >> $config
+
+@group1 is always allowed
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow]
+ ** = @group1
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: "group1" not defined in [acl.groups]
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 0 (undo push)
+ 0:6675d58eff77
+
+
+ $ echo '[acl.deny]' >> $config
+ $ echo "foo/Bar/** = @group1" >> $config
+
+@group is allowed inside anything but foo/Bar/
+
+ $ do_push fred
+ Pushing as user fred
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow]
+ ** = @group1
+ [acl.deny]
+ foo/Bar/** = @group1
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 3 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ adding changesets
+ bundling: 1/3 changesets (33.33%)
+ bundling: 2/3 changesets (66.67%)
+ bundling: 3/3 changesets (100.00%)
+ bundling: 1/3 manifests (33.33%)
+ bundling: 2/3 manifests (66.67%)
+ bundling: 3/3 manifests (100.00%)
+ bundling: foo/Bar/file.txt 1/3 files (33.33%)
+ bundling: foo/file.txt 2/3 files (66.67%)
+ bundling: quux/file.py 3/3 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ adding manifests
+ manifests: 1/3 chunks (33.33%)
+ manifests: 2/3 chunks (66.67%)
+ manifests: 3/3 chunks (100.00%)
+ adding file changes
+ adding foo/Bar/file.txt revisions
+ files: 1/3 chunks (33.33%)
+ adding foo/file.txt revisions
+ files: 2/3 chunks (66.67%)
+ adding quux/file.py revisions
+ files: 3/3 chunks (100.00%)
+ added 3 changesets with 3 changes to 3 files
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "fred"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: "group1" not defined in [acl.groups]
+ acl: acl.allow enabled, 1 entries for user fred
+ acl: "group1" not defined in [acl.groups]
+ acl: acl.deny enabled, 1 entries for user fred
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ error: pretxnchangegroup.acl hook failed: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ transaction abort!
+ rollback completed
+ abort: acl: user "fred" denied on "foo/Bar/file.txt" (changeset "f9cafe1212c8")
+ no rollback information available
+ 0:6675d58eff77
+
+
+Invalid group
+
+Disable the fakegroups trick to get real failures
+
+ $ grep -v fakegroups $config > config.tmp
+ $ mv config.tmp $config
+ $ echo '[acl.allow]' >> $config
+ $ echo "** = @unlikelytoexist" >> $config
+ $ do_push fred 2>&1 | grep unlikelytoexist
+ ** = @unlikelytoexist
+ acl: "unlikelytoexist" not defined in [acl.groups]
+ error: pretxnchangegroup.acl hook failed: group 'unlikelytoexist' is undefined
+ abort: group 'unlikelytoexist' is undefined
+
+
+Branch acl tests setup
+
+ $ init_config
+ $ cd b
+ $ hg up
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch foobar
+ marked working directory as branch foobar
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -m 'create foobar'
+ $ echo 'foo contents' > abc.txt
+ $ hg add abc.txt
+ $ hg commit -m 'foobar contents'
+ $ cd ..
+ $ hg --cwd a pull ../b
+ pulling from ../b
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads)
+
+Create additional changeset on foobar branch
+
+ $ cd a
+ $ hg up -C foobar
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 'foo contents2' > abc.txt
+ $ hg commit -m 'foobar contents2'
+ $ cd ..
+
+
+No branch acls specified
+
+ $ do_push astro
+ Pushing as user astro
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "astro"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ acl: branch access granted: "e8fc755d4d82" on branch "foobar"
+ acl: path access granted: "e8fc755d4d82"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 2 (undo push)
+ 2:fb35475503ef
+
+
+Branch acl deny test
+
+ $ echo "[acl.deny.branches]" >> $config
+ $ echo "foobar = *" >> $config
+ $ do_push astro
+ Pushing as user astro
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.deny.branches]
+ foobar = *
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "astro"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches enabled, 1 entries for user astro
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ error: pretxnchangegroup.acl hook failed: acl: user "astro" denied on branch "foobar" (changeset "e8fc755d4d82")
+ transaction abort!
+ rollback completed
+ abort: acl: user "astro" denied on branch "foobar" (changeset "e8fc755d4d82")
+ no rollback information available
+ 2:fb35475503ef
+
+
+Branch acl empty allow test
+
+ $ init_config
+ $ echo "[acl.allow.branches]" >> $config
+ $ do_push astro
+ Pushing as user astro
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow.branches]
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "astro"
+ acl: acl.allow.branches enabled, 0 entries for user astro
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ error: pretxnchangegroup.acl hook failed: acl: user "astro" not allowed on branch "default" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "astro" not allowed on branch "default" (changeset "ef1ea85a6374")
+ no rollback information available
+ 2:fb35475503ef
+
+
+Branch acl allow other
+
+ $ init_config
+ $ echo "[acl.allow.branches]" >> $config
+ $ echo "* = george" >> $config
+ $ do_push astro
+ Pushing as user astro
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow.branches]
+ * = george
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "astro"
+ acl: acl.allow.branches enabled, 0 entries for user astro
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ error: pretxnchangegroup.acl hook failed: acl: user "astro" not allowed on branch "default" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "astro" not allowed on branch "default" (changeset "ef1ea85a6374")
+ no rollback information available
+ 2:fb35475503ef
+
+ $ do_push george
+ Pushing as user george
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow.branches]
+ * = george
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "george"
+ acl: acl.allow.branches enabled, 1 entries for user george
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ acl: branch access granted: "e8fc755d4d82" on branch "foobar"
+ acl: path access granted: "e8fc755d4d82"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 2 (undo push)
+ 2:fb35475503ef
+
+
+Branch acl conflicting allow
+asterisk ends up applying to all branches and allowing george to
+push foobar into the remote
+
+ $ init_config
+ $ echo "[acl.allow.branches]" >> $config
+ $ echo "foobar = astro" >> $config
+ $ echo "* = george" >> $config
+ $ do_push george
+ Pushing as user george
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.allow.branches]
+ foobar = astro
+ * = george
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "george"
+ acl: acl.allow.branches enabled, 1 entries for user george
+ acl: acl.deny.branches not enabled
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ acl: branch access granted: "e8fc755d4d82" on branch "foobar"
+ acl: path access granted: "e8fc755d4d82"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 2 (undo push)
+ 2:fb35475503ef
+
+Branch acl conflicting deny
+
+ $ init_config
+ $ echo "[acl.deny.branches]" >> $config
+ $ echo "foobar = astro" >> $config
+ $ echo "default = astro" >> $config
+ $ echo "* = george" >> $config
+ $ do_push george
+ Pushing as user george
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.deny.branches]
+ foobar = astro
+ default = astro
+ * = george
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "george"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches enabled, 1 entries for user george
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ error: pretxnchangegroup.acl hook failed: acl: user "george" denied on branch "default" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "george" denied on branch "default" (changeset "ef1ea85a6374")
+ no rollback information available
+ 2:fb35475503ef
+
+User 'astro' must not be denied
+
+ $ init_config
+ $ echo "[acl.deny.branches]" >> $config
+ $ echo "default = !astro" >> $config
+ $ do_push astro
+ Pushing as user astro
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.deny.branches]
+ default = !astro
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "astro"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches enabled, 0 entries for user astro
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ acl: branch access granted: "ef1ea85a6374" on branch "default"
+ acl: path access granted: "ef1ea85a6374"
+ acl: branch access granted: "f9cafe1212c8" on branch "default"
+ acl: path access granted: "f9cafe1212c8"
+ acl: branch access granted: "911600dab2ae" on branch "default"
+ acl: path access granted: "911600dab2ae"
+ acl: branch access granted: "e8fc755d4d82" on branch "foobar"
+ acl: path access granted: "e8fc755d4d82"
+ listing keys for "phases"
+ try to push obsolete markers to remote
+ updating the branch cache
+ checking for updated bookmarks
+ listing keys for "bookmarks"
+ repository tip rolled back to revision 2 (undo push)
+ 2:fb35475503ef
+
+
+Non-astro users must be denied
+
+ $ do_push george
+ Pushing as user george
+ hgrc = """
+ [acl]
+ sources = push
+ [extensions]
+ [acl.deny.branches]
+ default = !astro
+ """
+ pushing to ../b
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ invalidating branch cache (tip differs)
+ listing keys for "bookmarks"
+ 4 changesets found
+ list of changesets:
+ ef1ea85a6374b77d6da9dcda9541f498f2d17df7
+ f9cafe1212c8c6fa1120d14a556e18cc44ff8bdd
+ 911600dab2ae7a9baff75958b84fe606851ce955
+ e8fc755d4d8217ee5b0c2bb41558c40d43b92c01
+ adding changesets
+ bundling: 1/4 changesets (25.00%)
+ bundling: 2/4 changesets (50.00%)
+ bundling: 3/4 changesets (75.00%)
+ bundling: 4/4 changesets (100.00%)
+ bundling: 1/4 manifests (25.00%)
+ bundling: 2/4 manifests (50.00%)
+ bundling: 3/4 manifests (75.00%)
+ bundling: 4/4 manifests (100.00%)
+ bundling: abc.txt 1/4 files (25.00%)
+ bundling: foo/Bar/file.txt 2/4 files (50.00%)
+ bundling: foo/file.txt 3/4 files (75.00%)
+ bundling: quux/file.py 4/4 files (100.00%)
+ changesets: 1 chunks
+ add changeset ef1ea85a6374
+ changesets: 2 chunks
+ add changeset f9cafe1212c8
+ changesets: 3 chunks
+ add changeset 911600dab2ae
+ changesets: 4 chunks
+ add changeset e8fc755d4d82
+ adding manifests
+ manifests: 1/4 chunks (25.00%)
+ manifests: 2/4 chunks (50.00%)
+ manifests: 3/4 chunks (75.00%)
+ manifests: 4/4 chunks (100.00%)
+ adding file changes
+ adding abc.txt revisions
+ files: 1/4 chunks (25.00%)
+ adding foo/Bar/file.txt revisions
+ files: 2/4 chunks (50.00%)
+ adding foo/file.txt revisions
+ files: 3/4 chunks (75.00%)
+ adding quux/file.py revisions
+ files: 4/4 chunks (100.00%)
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ calling hook pretxnchangegroup.acl: hgext.acl.hook
+ acl: checking access for user "george"
+ acl: acl.allow.branches not enabled
+ acl: acl.deny.branches enabled, 1 entries for user george
+ acl: acl.allow not enabled
+ acl: acl.deny not enabled
+ error: pretxnchangegroup.acl hook failed: acl: user "george" denied on branch "default" (changeset "ef1ea85a6374")
+ transaction abort!
+ rollback completed
+ abort: acl: user "george" denied on branch "default" (changeset "ef1ea85a6374")
+ no rollback information available
+ 2:fb35475503ef
+
+
diff --git a/tests/test-add.t b/tests/test-add.t
new file mode 100644
index 0000000..85a9b4e
--- /dev/null
+++ b/tests/test-add.t
@@ -0,0 +1,140 @@
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg add -n
+ adding a
+ $ hg st
+ ? a
+ $ hg add
+ adding a
+ $ hg st
+ A a
+ $ hg forget a
+ $ hg add
+ adding a
+ $ hg st
+ A a
+
+ $ echo b > b
+ $ hg add -n b
+ $ hg st
+ A a
+ ? b
+ $ hg add b
+ $ hg st
+ A a
+ A b
+
+should fail
+
+ $ hg add b
+ b already tracked!
+ $ hg st
+ A a
+ A b
+
+#if no-windows
+ $ echo foo > con.xml
+ $ hg --config ui.portablefilenames=jump add con.xml
+ abort: ui.portablefilenames value is invalid ('jump')
+ [255]
+ $ hg --config ui.portablefilenames=abort add con.xml
+ abort: filename contains 'con', which is reserved on Windows: 'con.xml'
+ [255]
+ $ hg st
+ A a
+ A b
+ ? con.xml
+ $ hg add con.xml
+ warning: filename contains 'con', which is reserved on Windows: 'con.xml'
+ $ hg st
+ A a
+ A b
+ A con.xml
+ $ hg forget con.xml
+ $ rm con.xml
+#endif
+
+#if eol-in-paths
+ $ echo bla > 'hello:world'
+ $ hg --config ui.portablefilenames=abort add
+ adding hello:world
+ abort: filename contains ':', which is reserved on Windows: 'hello:world'
+ [255]
+ $ hg st
+ A a
+ A b
+ ? hello:world
+ $ hg --config ui.portablefilenames=ignore add
+ adding hello:world
+ $ hg st
+ A a
+ A b
+ A hello:world
+#endif
+
+ $ hg ci -m 0 --traceback
+
+should fail
+
+ $ hg add a
+ a already tracked!
+
+ $ echo aa > a
+ $ hg ci -m 1
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo aaa > a
+ $ hg ci -m 2
+ created new head
+
+ $ hg merge
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ hg st
+ M a
+ ? a.orig
+
+should fail
+
+ $ hg add a
+ a already tracked!
+ $ hg st
+ M a
+ ? a.orig
+ $ hg resolve -m a
+ $ hg ci -m merge
+
+Issue683: peculiarity with hg revert of an removed then added file
+
+ $ hg forget a
+ $ hg add a
+ $ hg st
+ ? a.orig
+ $ hg rm a
+ $ hg st
+ R a
+ ? a.orig
+ $ echo a > a
+ $ hg add a
+ $ hg st
+ M a
+ ? a.orig
+
+ $ hg add c && echo "unexpected addition of missing file"
+ c: * (glob)
+ [1]
+ $ echo c > c
+ $ hg add d c && echo "unexpected addition of missing file"
+ d: * (glob)
+ [1]
+ $ hg st
+ M a
+ A c
+ ? a.orig
+
+ $ cd ..
diff --git a/tests/test-addremove-similar.t b/tests/test-addremove-similar.t
new file mode 100644
index 0000000..0da9c69
--- /dev/null
+++ b/tests/test-addremove-similar.t
@@ -0,0 +1,102 @@
+ $ hg init rep; cd rep
+
+ $ touch empty-file
+ $ python -c 'for x in range(10000): print x' > large-file
+
+ $ hg addremove
+ adding empty-file
+ adding large-file
+
+ $ hg commit -m A
+
+ $ rm large-file empty-file
+ $ python -c 'for x in range(10,10000): print x' > another-file
+
+ $ hg addremove -s50
+ adding another-file
+ removing empty-file
+ removing large-file
+ recording removal of large-file as rename to another-file (99% similar)
+
+ $ hg commit -m B
+
+comparing two empty files caused ZeroDivisionError in the past
+
+ $ hg update -C 0
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ rm empty-file
+ $ touch another-empty-file
+ $ hg addremove -s50
+ adding another-empty-file
+ removing empty-file
+
+ $ cd ..
+
+ $ hg init rep2; cd rep2
+
+ $ python -c 'for x in range(10000): print x' > large-file
+ $ python -c 'for x in range(50): print x' > tiny-file
+
+ $ hg addremove
+ adding large-file
+ adding tiny-file
+
+ $ hg commit -m A
+
+ $ python -c 'for x in range(70): print x' > small-file
+ $ rm tiny-file
+ $ rm large-file
+
+ $ hg addremove -s50
+ removing large-file
+ adding small-file
+ removing tiny-file
+ recording removal of tiny-file as rename to small-file (82% similar)
+
+ $ hg commit -m B
+
+should all fail
+
+ $ hg addremove -s foo
+ abort: similarity must be a number
+ [255]
+ $ hg addremove -s -1
+ abort: similarity must be between 0 and 100
+ [255]
+ $ hg addremove -s 1e6
+ abort: similarity must be between 0 and 100
+ [255]
+
+ $ cd ..
+
+Issue1527: repeated addremove causes util.Abort
+
+ $ hg init rep3; cd rep3
+ $ mkdir d
+ $ echo a > d/a
+ $ hg add d/a
+ $ hg commit -m 1
+
+ $ mv d/a d/b
+ $ hg addremove -s80
+ removing d/a
+ adding d/b
+ recording removal of d/a as rename to d/b (100% similar) (glob)
+ $ hg debugstate
+ r 0 0 1970-01-01 00:00:00 d/a
+ a 0 -1 unset d/b
+ copy: d/a -> d/b
+ $ mv d/b c
+
+no copies found here (since the target isn't in d
+
+ $ hg addremove -s80 d
+ removing d/b (glob)
+
+copies here
+
+ $ hg addremove -s80
+ adding c
+ recording removal of d/a as rename to c (100% similar) (glob)
+
+ $ cd ..
diff --git a/tests/test-addremove.t b/tests/test-addremove.t
new file mode 100644
index 0000000..45be3f4
--- /dev/null
+++ b/tests/test-addremove.t
@@ -0,0 +1,48 @@
+ $ hg init rep
+ $ cd rep
+ $ mkdir dir
+ $ touch foo dir/bar
+ $ hg -v addremove
+ adding dir/bar
+ adding foo
+ $ hg -v commit -m "add 1"
+ dir/bar
+ foo
+ committed changeset 0:6f7f953567a2
+ $ cd dir/
+ $ touch ../foo_2 bar_2
+ $ hg -v addremove
+ adding dir/bar_2
+ adding foo_2
+ $ hg -v commit -m "add 2"
+ dir/bar_2
+ foo_2
+ committed changeset 1:e65414bf35c5
+ $ cd ../..
+
+ $ hg init sim
+ $ cd sim
+ $ echo a > a
+ $ echo a >> a
+ $ echo a >> a
+ $ echo c > c
+ $ hg commit -Ama
+ adding a
+ adding c
+ $ mv a b
+ $ rm c
+ $ echo d > d
+ $ hg addremove -n -s 50 # issue 1696
+ removing a
+ adding b
+ removing c
+ adding d
+ recording removal of a as rename to b (100% similar)
+ $ hg addremove -s 50
+ removing a
+ adding b
+ removing c
+ adding d
+ recording removal of a as rename to b (100% similar)
+ $ hg commit -mb
+ $ cd ..
diff --git a/tests/test-alias.t b/tests/test-alias.t
new file mode 100644
index 0000000..cf19233
--- /dev/null
+++ b/tests/test-alias.t
@@ -0,0 +1,428 @@
+ $ HGFOO=BAR; export HGFOO
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ >
+ > [alias]
+ > # should clobber ci but not commit (issue2993)
+ > ci = version
+ > myinit = init
+ > optionalrepo = showconfig alias.myinit
+ > cleanstatus = status -c
+ > unknown = bargle
+ > ambiguous = s
+ > recursive = recursive
+ > nodefinition =
+ > no--cwd = status --cwd elsewhere
+ > no-R = status -R elsewhere
+ > no--repo = status --repo elsewhere
+ > no--repository = status --repository elsewhere
+ > mylog = log
+ > lognull = log -r null
+ > shortlog = log --template '{rev} {node|short} | {date|isodate}\n'
+ > positional = log --template '{\$2} {\$1} | {date|isodate}\n'
+ > dln = lognull --debug
+ > nousage = rollback
+ > put = export -r 0 -o "\$FOO/%R.diff"
+ > blank = !printf '\n'
+ > self = !printf '\$0\n'
+ > echoall = !printf '\$@\n'
+ > echo1 = !printf '\$1\n'
+ > echo2 = !printf '\$2\n'
+ > echo13 = !printf '\$1 \$3\n'
+ > count = !hg log -r "\$@" --template=. | wc -c | sed -e 's/ //g'
+ > mcount = !hg log \$@ --template=. | wc -c | sed -e 's/ //g'
+ > rt = root
+ > tglog = glog --template "{rev}:{node|short}: '{desc}' {branches}\n"
+ > idalias = id
+ > idaliaslong = id
+ > idaliasshell = !echo test
+ > parentsshell1 = !echo one
+ > parentsshell2 = !echo two
+ > escaped1 = !printf 'test\$\$test\n'
+ > escaped2 = !sh -c 'echo "HGFOO is \$\$HGFOO"'
+ > escaped3 = !sh -c 'echo "\$1 is \$\$\$1"'
+ > escaped4 = !printf '\$\$0 \$\$@\n'
+ >
+ > [defaults]
+ > mylog = -q
+ > lognull = -q
+ > log = -v
+ > EOF
+
+
+basic
+
+ $ hg myinit alias
+
+
+unknown
+
+ $ hg unknown
+ alias 'unknown' resolves to unknown command 'bargle'
+ $ hg help unknown
+ alias 'unknown' resolves to unknown command 'bargle'
+
+
+ambiguous
+
+ $ hg ambiguous
+ alias 'ambiguous' resolves to ambiguous command 's'
+ $ hg help ambiguous
+ alias 'ambiguous' resolves to ambiguous command 's'
+
+
+recursive
+
+ $ hg recursive
+ alias 'recursive' resolves to unknown command 'recursive'
+ $ hg help recursive
+ alias 'recursive' resolves to unknown command 'recursive'
+
+
+no definition
+
+ $ hg nodef
+ no definition for alias 'nodefinition'
+ $ hg help nodef
+ no definition for alias 'nodefinition'
+
+
+invalid options
+
+ $ hg no--cwd
+ error in definition for alias 'no--cwd': --cwd may only be given on the command line
+ $ hg help no--cwd
+ error in definition for alias 'no--cwd': --cwd may only be given on the command line
+ $ hg no-R
+ error in definition for alias 'no-R': -R may only be given on the command line
+ $ hg help no-R
+ error in definition for alias 'no-R': -R may only be given on the command line
+ $ hg no--repo
+ error in definition for alias 'no--repo': --repo may only be given on the command line
+ $ hg help no--repo
+ error in definition for alias 'no--repo': --repo may only be given on the command line
+ $ hg no--repository
+ error in definition for alias 'no--repository': --repository may only be given on the command line
+ $ hg help no--repository
+ error in definition for alias 'no--repository': --repository may only be given on the command line
+
+optional repository
+
+#if no-outer-repo
+ $ hg optionalrepo
+ init
+#endif
+ $ cd alias
+ $ cat > .hg/hgrc <<EOF
+ > [alias]
+ > myinit = init -q
+ > EOF
+ $ hg optionalrepo
+ init -q
+
+no usage
+
+ $ hg nousage
+ no rollback information available
+
+ $ echo foo > foo
+ $ hg commit -Amfoo
+ adding foo
+
+
+with opts
+
+ $ hg cleanst
+ C foo
+
+
+with opts and whitespace
+
+ $ hg shortlog
+ 0 e63c23eaa88a | 1970-01-01 00:00 +0000
+
+positional arguments
+
+ $ hg positional
+ abort: too few arguments for command alias
+ [255]
+ $ hg positional a
+ abort: too few arguments for command alias
+ [255]
+ $ hg positional 'node|short' rev
+ 0 e63c23eaa88a | 1970-01-01 00:00 +0000
+
+interaction with defaults
+
+ $ hg mylog
+ 0:e63c23eaa88a
+ $ hg lognull
+ -1:000000000000
+
+
+properly recursive
+
+ $ hg dln
+ changeset: -1:0000000000000000000000000000000000000000
+ parent: -1:0000000000000000000000000000000000000000
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: -1:0000000000000000000000000000000000000000
+ user:
+ date: Thu Jan 01 00:00:00 1970 +0000
+ extra: branch=default
+
+
+
+path expanding
+
+ $ FOO=`pwd` hg put
+ $ cat 0.diff
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID e63c23eaa88ae77967edcf4ea194d31167c478b0
+ # Parent 0000000000000000000000000000000000000000
+ foo
+
+ diff -r 000000000000 -r e63c23eaa88a foo
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +foo
+
+
+simple shell aliases
+
+ $ hg blank
+
+ $ hg blank foo
+
+ $ hg self
+ self
+ $ hg echoall
+
+ $ hg echoall foo
+ foo
+ $ hg echoall 'test $2' foo
+ test $2 foo
+ $ hg echo1 foo bar baz
+ foo
+ $ hg echo2 foo bar baz
+ bar
+ $ hg echo13 foo bar baz test
+ foo baz
+ $ hg echo2 foo
+
+ $ echo bar > bar
+ $ hg commit -qA -m bar
+ $ hg count .
+ 1
+ $ hg count 'branch(default)'
+ 2
+ $ hg mcount -r '"branch(default)"'
+ 2
+
+ $ hg tglog
+ @ 1:7e7f92de180e: 'bar'
+ |
+ o 0:e63c23eaa88a: 'foo'
+
+
+
+shadowing
+
+ $ hg i
+ hg: command 'i' is ambiguous:
+ idalias idaliaslong idaliasshell identify import incoming init
+ [255]
+ $ hg id
+ 7e7f92de180e tip
+ $ hg ida
+ hg: command 'ida' is ambiguous:
+ idalias idaliaslong idaliasshell
+ [255]
+ $ hg idalias
+ 7e7f92de180e tip
+ $ hg idaliasl
+ 7e7f92de180e tip
+ $ hg idaliass
+ test
+ $ hg parentsshell
+ hg: command 'parentsshell' is ambiguous:
+ parentsshell1 parentsshell2
+ [255]
+ $ hg parentsshell1
+ one
+ $ hg parentsshell2
+ two
+
+
+shell aliases with global options
+
+ $ hg init sub
+ $ cd sub
+ $ hg count 'branch(default)'
+ 0
+ $ hg -v count 'branch(default)'
+ 0
+ $ hg -R .. count 'branch(default)'
+ 0
+ $ hg --cwd .. count 'branch(default)'
+ 2
+ $ hg echoall --cwd ..
+
+
+
+repo specific shell aliases
+
+ $ cat >> .hg/hgrc <<EOF
+ > [alias]
+ > subalias = !echo sub
+ > EOF
+ $ cat >> ../.hg/hgrc <<EOF
+ > [alias]
+ > mainalias = !echo main
+ > EOF
+
+
+shell alias defined in current repo
+
+ $ hg subalias
+ sub
+ $ hg --cwd .. subalias > /dev/null
+ hg: unknown command 'subalias'
+ [255]
+ $ hg -R .. subalias > /dev/null
+ hg: unknown command 'subalias'
+ [255]
+
+
+shell alias defined in other repo
+
+ $ hg mainalias > /dev/null
+ hg: unknown command 'mainalias'
+ [255]
+ $ hg -R .. mainalias
+ main
+ $ hg --cwd .. mainalias
+ main
+
+
+shell aliases with escaped $ chars
+
+ $ hg escaped1
+ test$test
+ $ hg escaped2
+ HGFOO is BAR
+ $ hg escaped3 HGFOO
+ HGFOO is BAR
+ $ hg escaped4 test
+ $0 $@
+
+
+invalid arguments
+
+ $ hg rt foo
+ hg rt: invalid arguments
+ hg rt
+
+ alias for: hg root
+
+ use "hg help rt" to show the full help text
+ [255]
+
+invalid global arguments for normal commands, aliases, and shell aliases
+
+ $ hg --invalid root
+ hg: option --invalid not recognized
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+ $ hg --invalid mylog
+ hg: option --invalid not recognized
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+ $ hg --invalid blank
+ hg: option --invalid not recognized
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+
+This should show id:
+
+ $ hg --config alias.log='id' log
+ 000000000000 tip
+
+This shouldn't:
+
+ $ hg --config alias.log='id' history
+
+ $ cd ../..
diff --git a/tests/test-annotate.t b/tests/test-annotate.t
new file mode 100644
index 0000000..85a0985
--- /dev/null
+++ b/tests/test-annotate.t
@@ -0,0 +1,322 @@
+ $ HGMERGE=true; export HGMERGE
+
+init
+
+ $ hg init repo
+ $ cd repo
+
+commit
+
+ $ echo 'a' > a
+ $ hg ci -A -m test -u nobody -d '1 0'
+ adding a
+
+annotate -c
+
+ $ hg annotate -c a
+ 8435f90966e4: a
+
+annotate -cl
+
+ $ hg annotate -cl a
+ 8435f90966e4:1: a
+
+annotate -d
+
+ $ hg annotate -d a
+ Thu Jan 01 00:00:01 1970 +0000: a
+
+annotate -n
+
+ $ hg annotate -n a
+ 0: a
+
+annotate -nl
+
+ $ hg annotate -nl a
+ 0:1: a
+
+annotate -u
+
+ $ hg annotate -u a
+ nobody: a
+
+annotate -cdnu
+
+ $ hg annotate -cdnu a
+ nobody 0 8435f90966e4 Thu Jan 01 00:00:01 1970 +0000: a
+
+annotate -cdnul
+
+ $ hg annotate -cdnul a
+ nobody 0 8435f90966e4 Thu Jan 01 00:00:01 1970 +0000:1: a
+
+ $ cat <<EOF >>a
+ > a
+ > a
+ > EOF
+ $ hg ci -ma1 -d '1 0'
+ $ hg cp a b
+ $ hg ci -mb -d '1 0'
+ $ cat <<EOF >> b
+ > b4
+ > b5
+ > b6
+ > EOF
+ $ hg ci -mb2 -d '2 0'
+
+annotate -n b
+
+ $ hg annotate -n b
+ 0: a
+ 1: a
+ 1: a
+ 3: b4
+ 3: b5
+ 3: b6
+
+annotate --no-follow b
+
+ $ hg annotate --no-follow b
+ 2: a
+ 2: a
+ 2: a
+ 3: b4
+ 3: b5
+ 3: b6
+
+annotate -nl b
+
+ $ hg annotate -nl b
+ 0:1: a
+ 1:2: a
+ 1:3: a
+ 3:4: b4
+ 3:5: b5
+ 3:6: b6
+
+annotate -nf b
+
+ $ hg annotate -nf b
+ 0 a: a
+ 1 a: a
+ 1 a: a
+ 3 b: b4
+ 3 b: b5
+ 3 b: b6
+
+annotate -nlf b
+
+ $ hg annotate -nlf b
+ 0 a:1: a
+ 1 a:2: a
+ 1 a:3: a
+ 3 b:4: b4
+ 3 b:5: b5
+ 3 b:6: b6
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat <<EOF >> b
+ > b4
+ > c
+ > b5
+ > EOF
+ $ hg ci -mb2.1 -d '2 0'
+ created new head
+ $ hg merge
+ merging b
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -mmergeb -d '3 0'
+
+annotate after merge
+
+ $ hg annotate -nf b
+ 0 a: a
+ 1 a: a
+ 1 a: a
+ 3 b: b4
+ 4 b: c
+ 3 b: b5
+
+annotate after merge with -l
+
+ $ hg annotate -nlf b
+ 0 a:1: a
+ 1 a:2: a
+ 1 a:3: a
+ 3 b:4: b4
+ 4 b:5: c
+ 3 b:5: b5
+
+ $ hg up -C 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg cp a b
+ $ cat <<EOF > b
+ > a
+ > z
+ > a
+ > EOF
+ $ hg ci -mc -d '3 0'
+ created new head
+ $ hg merge
+ merging b
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ cat <<EOF >> b
+ > b4
+ > c
+ > b5
+ > EOF
+ $ echo d >> b
+ $ hg ci -mmerge2 -d '4 0'
+
+annotate after rename merge
+
+ $ hg annotate -nf b
+ 0 a: a
+ 6 b: z
+ 1 a: a
+ 3 b: b4
+ 4 b: c
+ 3 b: b5
+ 7 b: d
+
+annotate after rename merge with -l
+
+ $ hg annotate -nlf b
+ 0 a:1: a
+ 6 b:2: z
+ 1 a:3: a
+ 3 b:4: b4
+ 4 b:5: c
+ 3 b:5: b5
+ 7 b:7: d
+
+Issue2807: alignment of line numbers with -l
+
+ $ echo more >> b
+ $ hg ci -mmore -d '5 0'
+ $ echo more >> b
+ $ hg ci -mmore -d '6 0'
+ $ echo more >> b
+ $ hg ci -mmore -d '7 0'
+ $ hg annotate -nlf b
+ 0 a: 1: a
+ 6 b: 2: z
+ 1 a: 3: a
+ 3 b: 4: b4
+ 4 b: 5: c
+ 3 b: 5: b5
+ 7 b: 7: d
+ 8 b: 8: more
+ 9 b: 9: more
+ 10 b:10: more
+
+linkrev vs rev
+
+ $ hg annotate -r tip -n a
+ 0: a
+ 1: a
+ 1: a
+
+linkrev vs rev with -l
+
+ $ hg annotate -r tip -nl a
+ 0:1: a
+ 1:2: a
+ 1:3: a
+
+Issue589: "undelete" sequence leads to crash
+
+annotate was crashing when trying to --follow something
+
+like A -> B -> A
+
+generate ABA rename configuration
+
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m addfoo
+ $ hg rename foo bar
+ $ hg ci -m renamefoo
+ $ hg rename bar foo
+ $ hg ci -m renamebar
+
+annotate after ABA with follow
+
+ $ hg annotate --follow foo
+ foo: foo
+
+missing file
+
+ $ hg ann nosuchfile
+ abort: nosuchfile: no such file in rev e9e6b4fa872f
+ [255]
+
+annotate file without '\n' on last line
+
+ $ printf "" > c
+ $ hg ci -A -m test -u nobody -d '1 0'
+ adding c
+ $ hg annotate c
+ $ printf "a\nb" > c
+ $ hg ci -m test
+ $ hg annotate c
+ [0-9]+: a (re)
+ [0-9]+: b (re)
+
+Test annotate with whitespace options
+
+ $ cd ..
+ $ hg init repo-ws
+ $ cd repo-ws
+ $ cat > a <<EOF
+ > aa
+ >
+ > b b
+ > EOF
+ $ hg ci -Am "adda"
+ adding a
+ $ cat > a <<EOF
+ > a a
+ >
+ >
+ > b b
+ > EOF
+ $ hg ci -m "changea"
+
+Annotate with no option
+
+ $ hg annotate a
+ 1: a a
+ 0:
+ 1:
+ 1: b b
+
+Annotate with --ignore-space-change
+
+ $ hg annotate --ignore-space-change a
+ 1: a a
+ 1:
+ 0:
+ 0: b b
+
+Annotate with --ignore-all-space
+
+ $ hg annotate --ignore-all-space a
+ 0: a a
+ 0:
+ 1:
+ 0: b b
+
+Annotate with --ignore-blank-lines (similar to no options case)
+
+ $ hg annotate --ignore-blank-lines a
+ 1: a a
+ 0:
+ 1:
+ 1: b b
+
+ $ cd ..
diff --git a/tests/test-archive-symlinks.t b/tests/test-archive-symlinks.t
new file mode 100644
index 0000000..a0f15b5
--- /dev/null
+++ b/tests/test-archive-symlinks.t
@@ -0,0 +1,40 @@
+ $ "$TESTDIR/hghave" symlink || exit 80
+
+ $ origdir=`pwd`
+
+ $ hg init repo
+ $ cd repo
+ $ ln -s nothing dangling
+
+avoid tar warnings about old timestamp
+
+ $ hg ci -d '2000-01-01 00:00:00 +0000' -qAm 'add symlink'
+
+ $ hg archive -t files ../archive
+ $ hg archive -t tar -p tar ../archive.tar
+ $ hg archive -t zip -p zip ../archive.zip
+
+files
+
+ $ cd "$origdir"
+ $ cd archive
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> nothing
+
+tar
+
+ $ cd "$origdir"
+ $ tar xf archive.tar
+ $ cd tar
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> nothing
+
+zip
+
+ $ cd "$origdir"
+ $ unzip archive.zip > /dev/null
+ $ cd zip
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> nothing
+
+ $ cd ..
diff --git a/tests/test-archive.t b/tests/test-archive.t
new file mode 100644
index 0000000..6da530f
--- /dev/null
+++ b/tests/test-archive.t
@@ -0,0 +1,272 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ echo foo>foo
+ $ hg commit -Am 1 -d '1 0'
+ adding foo
+ $ echo bar>bar
+ $ hg commit -Am 2 -d '2 0'
+ adding bar
+ $ mkdir baz
+ $ echo bletch>baz/bletch
+ $ hg commit -Am 3 -d '1000000000 0'
+ adding baz/bletch
+ $ echo "[web]" >> .hg/hgrc
+ $ echo "name = test-archive" >> .hg/hgrc
+ $ cp .hg/hgrc .hg/hgrc-base
+ > test_archtype() {
+ > echo "allow_archive = $1" >> .hg/hgrc
+ > hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ > echo % $1 allowed should give 200
+ > "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.$2" | head -n 1
+ > echo % $3 and $4 disallowed should both give 403
+ > "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.$3" | head -n 1
+ > "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.$4" | head -n 1
+ > "$TESTDIR/killdaemons.py"
+ > cat errors.log
+ > cp .hg/hgrc-base .hg/hgrc
+ > }
+
+check http return codes
+
+ $ test_archtype gz tar.gz tar.bz2 zip
+ % gz allowed should give 200
+ 200 Script output follows
+ % tar.bz2 and zip disallowed should both give 403
+ 403 Archive type not allowed: bz2
+ 403 Archive type not allowed: zip
+ $ test_archtype bz2 tar.bz2 zip tar.gz
+ % bz2 allowed should give 200
+ 200 Script output follows
+ % zip and tar.gz disallowed should both give 403
+ 403 Archive type not allowed: zip
+ 403 Archive type not allowed: gz
+ $ test_archtype zip zip tar.gz tar.bz2
+ % zip allowed should give 200
+ 200 Script output follows
+ % tar.gz and tar.bz2 disallowed should both give 403
+ 403 Archive type not allowed: gz
+ 403 Archive type not allowed: bz2
+
+ $ echo "allow_archive = gz bz2 zip" >> .hg/hgrc
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+invalid arch type should give 404
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT "archive/tip.invalid" | head -n 1
+ 404 Unsupported archive type: None
+
+ $ TIP=`hg id -v | cut -f1 -d' '`
+ $ QTIP=`hg id -q`
+ $ cat > getarchive.py <<EOF
+ > import os, sys, urllib2
+ > try:
+ > # Set stdout to binary mode for win32 platforms
+ > import msvcrt
+ > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ > except ImportError:
+ > pass
+ > node, archive = sys.argv[1:]
+ > f = urllib2.urlopen('http://127.0.0.1:%s/?cmd=archive;node=%s;type=%s'
+ > % (os.environ['HGPORT'], node, archive))
+ > sys.stdout.write(f.read())
+ > EOF
+ $ python getarchive.py "$TIP" gz | gunzip | tar tf - 2>/dev/null
+ test-archive-2c0277f05ed4/.hg_archival.txt
+ test-archive-2c0277f05ed4/bar
+ test-archive-2c0277f05ed4/baz/bletch
+ test-archive-2c0277f05ed4/foo
+ $ python getarchive.py "$TIP" bz2 | bunzip2 | tar tf - 2>/dev/null
+ test-archive-2c0277f05ed4/.hg_archival.txt
+ test-archive-2c0277f05ed4/bar
+ test-archive-2c0277f05ed4/baz/bletch
+ test-archive-2c0277f05ed4/foo
+ $ python getarchive.py "$TIP" zip > archive.zip
+ $ unzip -t archive.zip
+ Archive: archive.zip
+ testing: test-archive-2c0277f05ed4/.hg_archival.txt OK
+ testing: test-archive-2c0277f05ed4/bar OK
+ testing: test-archive-2c0277f05ed4/baz/bletch OK
+ testing: test-archive-2c0277f05ed4/foo OK
+ No errors detected in compressed data of archive.zip.
+
+ $ "$TESTDIR/killdaemons.py"
+
+ $ hg archive -t tar test.tar
+ $ tar tf test.tar
+ test/.hg_archival.txt
+ test/bar
+ test/baz/bletch
+ test/foo
+
+ $ hg archive --debug -t tbz2 -X baz test.tar.bz2
+ archiving: 0/2 files (0.00%)
+ archiving: bar 1/2 files (50.00%)
+ archiving: foo 2/2 files (100.00%)
+ $ bunzip2 -dc test.tar.bz2 | tar tf - 2>/dev/null
+ test/.hg_archival.txt
+ test/bar
+ test/foo
+
+ $ hg archive -t tgz -p %b-%h test-%h.tar.gz
+ $ gzip -dc test-$QTIP.tar.gz | tar tf - 2>/dev/null
+ test-2c0277f05ed4/.hg_archival.txt
+ test-2c0277f05ed4/bar
+ test-2c0277f05ed4/baz/bletch
+ test-2c0277f05ed4/foo
+
+ $ hg archive autodetected_test.tar
+ $ tar tf autodetected_test.tar
+ autodetected_test/.hg_archival.txt
+ autodetected_test/bar
+ autodetected_test/baz/bletch
+ autodetected_test/foo
+
+The '-t' should override autodetection
+
+ $ hg archive -t tar autodetect_override_test.zip
+ $ tar tf autodetect_override_test.zip
+ autodetect_override_test.zip/.hg_archival.txt
+ autodetect_override_test.zip/bar
+ autodetect_override_test.zip/baz/bletch
+ autodetect_override_test.zip/foo
+
+ $ for ext in tar tar.gz tgz tar.bz2 tbz2 zip; do
+ > hg archive auto_test.$ext
+ > if [ -d auto_test.$ext ]; then
+ > echo "extension $ext was not autodetected."
+ > fi
+ > done
+
+ $ cat > md5comp.py <<EOF
+ > try:
+ > from hashlib import md5
+ > except ImportError:
+ > from md5 import md5
+ > import sys
+ > f1, f2 = sys.argv[1:3]
+ > h1 = md5(file(f1, 'rb').read()).hexdigest()
+ > h2 = md5(file(f2, 'rb').read()).hexdigest()
+ > print h1 == h2 or "md5 differ: " + repr((h1, h2))
+ > EOF
+
+archive name is stored in the archive, so create similar archives and
+rename them afterwards.
+
+ $ hg archive -t tgz tip.tar.gz
+ $ mv tip.tar.gz tip1.tar.gz
+ $ sleep 1
+ $ hg archive -t tgz tip.tar.gz
+ $ mv tip.tar.gz tip2.tar.gz
+ $ python md5comp.py tip1.tar.gz tip2.tar.gz
+ True
+
+ $ hg archive -t zip -p /illegal test.zip
+ abort: archive prefix contains illegal components
+ [255]
+ $ hg archive -t zip -p very/../bad test.zip
+
+ $ hg archive --config ui.archivemeta=false -t zip -r 2 test.zip
+ $ unzip -t test.zip
+ Archive: test.zip
+ testing: test/bar OK
+ testing: test/baz/bletch OK
+ testing: test/foo OK
+ No errors detected in compressed data of test.zip.
+
+ $ hg archive -t tar - | tar tf - 2>/dev/null
+ test-2c0277f05ed4/.hg_archival.txt
+ test-2c0277f05ed4/bar
+ test-2c0277f05ed4/baz/bletch
+ test-2c0277f05ed4/foo
+
+ $ hg archive -r 0 -t tar rev-%r.tar
+ $ if [ -f rev-0.tar ]; then
+ $ fi
+
+test .hg_archival.txt
+
+ $ hg archive ../test-tags
+ $ cat ../test-tags/.hg_archival.txt
+ repo: daa7f7c60e0a224faa4ff77ca41b2760562af264
+ node: 2c0277f05ed49d1c8328fb9ba92fba7a5ebcb33e
+ branch: default
+ latesttag: null
+ latesttagdistance: 3
+ $ hg tag -r 2 mytag
+ $ hg tag -r 2 anothertag
+ $ hg archive -r 2 ../test-lasttag
+ $ cat ../test-lasttag/.hg_archival.txt
+ repo: daa7f7c60e0a224faa4ff77ca41b2760562af264
+ node: 2c0277f05ed49d1c8328fb9ba92fba7a5ebcb33e
+ branch: default
+ tag: anothertag
+ tag: mytag
+
+ $ hg archive -t bogus test.bogus
+ abort: unknown archive type 'bogus'
+ [255]
+
+enable progress extension:
+
+ $ cp $HGRCPATH $HGRCPATH.no-progress
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > progress =
+ > [progress]
+ > assume-tty = 1
+ > format = topic bar number
+ > delay = 0
+ > refresh = 0
+ > width = 60
+ > EOF
+
+ $ hg archive ../with-progress 2>&1 | "$TESTDIR/filtercr.py"
+
+ archiving [ ] 0/4
+ archiving [ ] 0/4
+ archiving [=========> ] 1/4
+ archiving [=========> ] 1/4
+ archiving [====================> ] 2/4
+ archiving [====================> ] 2/4
+ archiving [===============================> ] 3/4
+ archiving [===============================> ] 3/4
+ archiving [==========================================>] 4/4
+ archiving [==========================================>] 4/4
+ \r (esc)
+
+cleanup after progress extension test:
+
+ $ cp $HGRCPATH.no-progress $HGRCPATH
+
+server errors
+
+ $ cat errors.log
+
+empty repo
+
+ $ hg init ../empty
+ $ cd ../empty
+ $ hg archive ../test-empty
+ abort: no working directory: please specify a revision
+ [255]
+
+old file -- date clamped to 1980
+
+ $ touch -t 197501010000 old
+ $ hg add old
+ $ hg commit -m old
+ $ hg archive ../old.zip
+ $ unzip -l ../old.zip
+ Archive: ../old.zip
+ \s*Length.* (re)
+ *-----* (glob)
+ *147*80*00:00*old/.hg_archival.txt (glob)
+ *0*80*00:00*old/old (glob)
+ *-----* (glob)
+ \s*147\s+2 files (re)
+
+ $ cd ..
diff --git a/tests/test-atomictempfile.py b/tests/test-atomictempfile.py
new file mode 100644
index 0000000..9ebd7c0
--- /dev/null
+++ b/tests/test-atomictempfile.py
@@ -0,0 +1,48 @@
+import os
+import glob
+from mercurial.util import atomictempfile
+
+# basic usage
+def test1_simple():
+ if os.path.exists('foo'):
+ os.remove('foo')
+ file = atomictempfile('foo')
+ (dir, basename) = os.path.split(file._tempname)
+ assert not os.path.isfile('foo')
+ assert basename in glob.glob('.foo-*')
+
+ file.write('argh\n')
+ file.close()
+
+ assert os.path.isfile('foo')
+ assert basename not in glob.glob('.foo-*')
+ print 'OK'
+
+# discard() removes the temp file without making the write permanent
+def test2_discard():
+ if os.path.exists('foo'):
+ os.remove('foo')
+ file = atomictempfile('foo')
+ (dir, basename) = os.path.split(file._tempname)
+
+ file.write('yo\n')
+ file.discard()
+
+ assert not os.path.isfile('foo')
+ assert basename not in os.listdir('.')
+ print 'OK'
+
+# if a programmer screws up and passes bad args to atomictempfile, they
+# get a plain ordinary TypeError, not infinite recursion
+def test3_oops():
+ try:
+ file = atomictempfile()
+ except TypeError:
+ print "OK"
+ else:
+ print "expected TypeError"
+
+if __name__ == '__main__':
+ test1_simple()
+ test2_discard()
+ test3_oops()
diff --git a/tests/test-atomictempfile.py.out b/tests/test-atomictempfile.py.out
new file mode 100644
index 0000000..0eabe36
--- /dev/null
+++ b/tests/test-atomictempfile.py.out
@@ -0,0 +1,3 @@
+OK
+OK
+OK
diff --git a/tests/test-audit-path.t b/tests/test-audit-path.t
new file mode 100644
index 0000000..d105e94
--- /dev/null
+++ b/tests/test-audit-path.t
@@ -0,0 +1,92 @@
+ $ hg init
+
+audit of .hg
+
+ $ hg add .hg/00changelog.i
+ abort: path contains illegal component: .hg/00changelog.i (glob)
+ [255]
+
+#if symlink
+
+Symlinks
+
+ $ mkdir a
+ $ echo a > a/a
+ $ hg ci -Ama
+ adding a/a
+ $ ln -s a b
+ $ echo b > a/b
+ $ hg add b/b
+ abort: path 'b/b' traverses symbolic link 'b' (glob)
+ [255]
+ $ hg add b
+
+should still fail - maybe
+
+ $ hg add b/b
+ abort: path 'b/b' traverses symbolic link 'b' (glob)
+ [255]
+
+#endif
+
+
+unbundle tampered bundle
+
+ $ hg init target
+ $ cd target
+ $ hg unbundle "$TESTDIR/bundles/tampered.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 6 files (+4 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+attack .hg/test
+
+ $ hg manifest -r0
+ .hg/test
+ $ hg update -Cr0
+ abort: path contains illegal component: .hg/test (glob)
+ [255]
+
+attack foo/.hg/test
+
+ $ hg manifest -r1
+ foo/.hg/test
+ $ hg update -Cr1
+ abort: path 'foo/.hg/test' is inside nested repo 'foo' (glob)
+ [255]
+
+attack back/test where back symlinks to ..
+
+ $ hg manifest -r2
+ back
+ back/test
+#if symlink
+ $ hg update -Cr2
+ abort: path 'back/test' traverses symbolic link 'back'
+ [255]
+#else
+('back' will be a file and cause some other system specific error)
+ $ hg update -Cr2
+ abort: * (glob)
+ [255]
+#endif
+
+attack ../test
+
+ $ hg manifest -r3
+ ../test
+ $ hg update -Cr3
+ abort: path contains illegal component: ../test (glob)
+ [255]
+
+attack /tmp/test
+
+ $ hg manifest -r4
+ /tmp/test
+ $ hg update -Cr4
+ abort: *: $TESTTMP/target//tmp/test (glob)
+ [255]
+
+ $ cd ..
diff --git a/tests/test-backout.t b/tests/test-backout.t
new file mode 100644
index 0000000..c2404f5
--- /dev/null
+++ b/tests/test-backout.t
@@ -0,0 +1,294 @@
+ $ hg init basic
+ $ cd basic
+
+should complain
+
+ $ hg backout
+ abort: please specify a revision to backout
+ [255]
+ $ hg backout -r 0 0
+ abort: please specify just one revision
+ [255]
+
+basic operation
+
+ $ echo a > a
+ $ hg commit -d '0 0' -A -m a
+ adding a
+ $ echo b >> a
+ $ hg commit -d '1 0' -m b
+
+ $ hg backout -d '2 0' tip --tool=true
+ reverting a
+ changeset 2:2929462c3dff backs out changeset 1:a820f4f40a57
+ $ cat a
+ a
+
+file that was removed is recreated
+
+ $ cd ..
+ $ hg init remove
+ $ cd remove
+
+ $ echo content > a
+ $ hg commit -d '0 0' -A -m a
+ adding a
+
+ $ hg rm a
+ $ hg commit -d '1 0' -m b
+
+ $ hg backout -d '2 0' tip --tool=true
+ adding a
+ changeset 2:de31bdc76c0d backs out changeset 1:76862dcce372
+ $ cat a
+ content
+
+backout of backout is as if nothing happened
+
+ $ hg backout -d '3 0' --merge tip --tool=true
+ removing a
+ changeset 3:7f6d0f120113 backs out changeset 2:de31bdc76c0d
+ $ test -f a
+ [1]
+
+across branch
+
+ $ cd ..
+ $ hg init branch
+ $ cd branch
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+ $ echo b > b
+ $ hg ci -Am1
+ adding b
+ $ hg co -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+should fail
+
+ $ hg backout 1
+ abort: cannot backout change on a different branch
+ [255]
+ $ echo c > c
+ $ hg ci -Am2
+ adding c
+ created new head
+
+should fail
+
+ $ hg backout 1
+ abort: cannot backout change on a different branch
+ [255]
+
+backout with merge
+
+ $ cd ..
+ $ hg init merge
+ $ cd merge
+
+ $ echo line 1 > a
+ $ echo line 2 >> a
+ $ hg commit -d '0 0' -A -m a
+ adding a
+
+remove line 1
+
+ $ echo line 2 > a
+ $ hg commit -d '1 0' -m b
+
+ $ echo line 3 >> a
+ $ hg commit -d '2 0' -m c
+
+ $ hg backout --merge -d '3 0' 1 --tool=true
+ reverting a
+ created new head
+ changeset 3:26b8ccb9ad91 backs out changeset 1:5a50a024c182
+ merging with changeset 3:26b8ccb9ad91
+ merging a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -d '4 0' -m d
+
+check line 1 is back
+
+ $ cat a
+ line 1
+ line 2
+ line 3
+
+ $ cd ..
+
+backout should not back out subsequent changesets
+
+ $ hg init onecs
+ $ cd onecs
+ $ echo 1 > a
+ $ hg commit -d '0 0' -A -m a
+ adding a
+ $ echo 2 >> a
+ $ hg commit -d '1 0' -m b
+ $ echo 1 > b
+ $ hg commit -d '2 0' -A -m c
+ adding b
+
+without --merge
+ $ hg backout -d '3 0' 1 --tool=true
+ reverting a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg locate b
+ b
+ $ hg update -C tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg locate b
+ b
+
+with --merge
+ $ hg backout --merge -d '3 0' 1 --tool=true
+ reverting a
+ created new head
+ changeset 3:3202beb76721 backs out changeset 1:22bca4c721e5
+ merging with changeset 3:3202beb76721
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg locate b
+ b
+ $ hg update -C tip
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg locate b
+ [1]
+
+ $ cd ..
+ $ hg init m
+ $ cd m
+ $ echo a > a
+ $ hg commit -d '0 0' -A -m a
+ adding a
+ $ echo b > b
+ $ hg commit -d '1 0' -A -m b
+ adding b
+ $ echo c > c
+ $ hg commit -d '2 0' -A -m b
+ adding c
+ $ hg update 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo d > d
+ $ hg commit -d '3 0' -A -m c
+ adding d
+ created new head
+ $ hg merge 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -d '4 0' -A -m d
+
+backout of merge should fail
+
+ $ hg backout 4
+ abort: cannot backout a merge changeset
+ [255]
+
+backout of merge with bad parent should fail
+
+ $ hg backout --parent 0 4
+ abort: cb9a9f314b8b is not a parent of b2f3bb92043e
+ [255]
+
+backout of non-merge with parent should fail
+
+ $ hg backout --parent 0 3
+ abort: cannot use --parent on non-merge changeset
+ [255]
+
+backout with valid parent should be ok
+
+ $ hg backout -d '5 0' --parent 2 4 --tool=true
+ removing d
+ changeset 5:10e5328c8435 backs out changeset 4:b2f3bb92043e
+
+ $ hg rollback
+ repository tip rolled back to revision 4 (undo commit)
+ working directory now based on revision 4
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg backout -d '6 0' --parent 3 4 --tool=true
+ removing c
+ changeset 5:033590168430 backs out changeset 4:b2f3bb92043e
+
+ $ cd ..
+
+named branches
+
+ $ hg init named_branches
+ $ cd named_branches
+
+ $ echo default > default
+ $ hg ci -d '0 0' -Am default
+ adding default
+ $ hg branch branch1
+ marked working directory as branch branch1
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo branch1 > file1
+ $ hg ci -d '1 0' -Am file1
+ adding file1
+ $ hg branch branch2
+ marked working directory as branch branch2
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo branch2 > file2
+ $ hg ci -d '2 0' -Am file2
+ adding file2
+
+without --merge
+ $ hg backout -r 1 --tool=true
+ removing file1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch
+ branch2
+ $ hg status -A
+ R file1
+ C default
+ C file2
+
+with --merge
+ $ hg update -qC
+ $ hg backout --merge -d '3 0' -r 1 -m 'backout on branch1' --tool=true
+ removing file1
+ created new head
+ changeset 3:d4e8f6db59fb backs out changeset 1:bf1602f437f3
+ merging with changeset 3:d4e8f6db59fb
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg update -q -C 2
+
+on branch2 with branch1 not merged, so file1 should still exist:
+
+ $ hg id
+ 45bbcd363bf0 (branch2)
+ $ hg st -A
+ C default
+ C file1
+ C file2
+
+on branch2 with branch1 merged, so file1 should be gone:
+
+ $ hg merge
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -d '4 0' -m 'merge backout of branch1'
+ $ hg id
+ 22149cdde76d (branch2) tip
+ $ hg st -A
+ C default
+ C file2
+
+on branch1, so no file1 and file2:
+
+ $ hg co -C branch1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg id
+ bf1602f437f3 (branch1)
+ $ hg st -A
+ C default
+ C file1
+
+ $ cd ..
diff --git a/tests/test-backwards-remove.t b/tests/test-backwards-remove.t
new file mode 100644
index 0000000..044a44d
--- /dev/null
+++ b/tests/test-backwards-remove.t
@@ -0,0 +1,16 @@
+ $ hg init
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ ls
+ a
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ hg co 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+B should disappear
+
+ $ ls
+ a
diff --git a/tests/test-bad-extension.t b/tests/test-bad-extension.t
new file mode 100644
index 0000000..5476c1b
--- /dev/null
+++ b/tests/test-bad-extension.t
@@ -0,0 +1,15 @@
+ $ echo 'raise Exception("bit bucket overflow")' > badext.py
+ $ abspath=`pwd`/badext.py
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "gpg =" >> $HGRCPATH
+ $ echo "hgext.gpg =" >> $HGRCPATH
+ $ echo "badext = $abspath" >> $HGRCPATH
+ $ echo "badext2 =" >> $HGRCPATH
+
+ $ hg -q help help
+ *** failed to import extension badext from $TESTTMP/badext.py: bit bucket overflow
+ *** failed to import extension badext2: No module named badext2
+ hg help [-ec] [TOPIC]
+
+ show help for a given topic or a help overview
diff --git a/tests/test-bad-pull.t b/tests/test-bad-pull.t
new file mode 100644
index 0000000..7e32388
--- /dev/null
+++ b/tests/test-bad-pull.t
@@ -0,0 +1,33 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+#if windows
+ $ hg clone http://localhost:$HGPORT/ copy
+ abort: * (glob)
+ [255]
+#else
+ $ hg clone http://localhost:$HGPORT/ copy
+ abort: error: Connection refused
+ [255]
+#endif
+
+ $ test -d copy
+ [1]
+
+ $ cat > dumb.py <<EOF
+ > import BaseHTTPServer, SimpleHTTPServer, os, signal
+ > def run(server_class=BaseHTTPServer.HTTPServer,
+ > handler_class=SimpleHTTPServer.SimpleHTTPRequestHandler):
+ > server_address = ('localhost', int(os.environ['HGPORT']))
+ > httpd = server_class(server_address, handler_class)
+ > open("listening", "w")
+ > httpd.handle_request()
+ > run()
+ > EOF
+
+ $ python dumb.py 2> log &
+ $ P=$!
+ $ while [ ! -f listening ]; do sleep 0; done
+ $ hg clone http://localhost:$HGPORT/foo copy2
+ abort: HTTP Error 404: * (glob)
+ [255]
+ $ wait $P
diff --git a/tests/test-basic.t b/tests/test-basic.t
new file mode 100644
index 0000000..4d350a5
--- /dev/null
+++ b/tests/test-basic.t
@@ -0,0 +1,57 @@
+Create a repository:
+
+ $ hg init t
+ $ cd t
+
+Make a changeset:
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m test
+
+This command is ancient:
+
+ $ hg history
+ changeset: 0:acb14030fe0a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+Verify that updating to revision 0 via commands.update() works properly
+
+ $ cat <<EOF > update_to_rev0.py
+ > from mercurial import ui, hg, commands
+ > myui = ui.ui()
+ > repo = hg.repository(myui, path='.')
+ > commands.update(myui, repo, rev=0)
+ > EOF
+ $ hg up null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ python ./update_to_rev0.py
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg identify -n
+ 0
+
+
+Poke around at hashes:
+
+ $ hg manifest --debug
+ b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 644 a
+
+ $ hg cat a
+ a
+
+Verify should succeed:
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+At the end...
+
+ $ cd ..
diff --git a/tests/test-batching.py b/tests/test-batching.py
new file mode 100644
index 0000000..22fefb3
--- /dev/null
+++ b/tests/test-batching.py
@@ -0,0 +1,175 @@
+# test-batching.py - tests for transparent command batching
+#
+# Copyright 2011 Peter Arrenbrecht <peter@arrenbrecht.ch>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from mercurial.wireproto import localbatch, remotebatch, batchable, future
+
+# equivalent of repo.repository
+class thing(object):
+ def hello(self):
+ return "Ready."
+
+# equivalent of localrepo.localrepository
+class localthing(thing):
+ def foo(self, one, two=None):
+ if one:
+ return "%s and %s" % (one, two,)
+ return "Nope"
+ def bar(self, b, a):
+ return "%s und %s" % (b, a,)
+ def greet(self, name=None):
+ return "Hello, %s" % name
+ def batch(self):
+ '''Support for local batching.'''
+ return localbatch(self)
+
+# usage of "thing" interface
+def use(it):
+
+ # Direct call to base method shared between client and server.
+ print it.hello()
+
+ # Direct calls to proxied methods. They cause individual roundtrips.
+ print it.foo("Un", two="Deux")
+ print it.bar("Eins", "Zwei")
+
+ # Batched call to a couple of (possibly proxied) methods.
+ batch = it.batch()
+ # The calls return futures to eventually hold results.
+ foo = batch.foo(one="One", two="Two")
+ foo2 = batch.foo(None)
+ bar = batch.bar("Eins", "Zwei")
+ # We can call non-batchable proxy methods, but the break the current batch
+ # request and cause additional roundtrips.
+ greet = batch.greet(name="John Smith")
+ # We can also add local methods into the mix, but they break the batch too.
+ hello = batch.hello()
+ bar2 = batch.bar(b="Uno", a="Due")
+ # Only now are all the calls executed in sequence, with as few roundtrips
+ # as possible.
+ batch.submit()
+ # After the call to submit, the futures actually contain values.
+ print foo.value
+ print foo2.value
+ print bar.value
+ print greet.value
+ print hello.value
+ print bar2.value
+
+# local usage
+mylocal = localthing()
+print
+print "== Local"
+use(mylocal)
+
+# demo remoting; mimicks what wireproto and HTTP/SSH do
+
+# shared
+
+def escapearg(plain):
+ return (plain
+ .replace(':', '::')
+ .replace(',', ':,')
+ .replace(';', ':;')
+ .replace('=', ':='))
+def unescapearg(escaped):
+ return (escaped
+ .replace(':=', '=')
+ .replace(':;', ';')
+ .replace(':,', ',')
+ .replace('::', ':'))
+
+# server side
+
+# equivalent of wireproto's global functions
+class server(object):
+ def __init__(self, local):
+ self.local = local
+ def _call(self, name, args):
+ args = dict(arg.split('=', 1) for arg in args)
+ return getattr(self, name)(**args)
+ def perform(self, req):
+ print "REQ:", req
+ name, args = req.split('?', 1)
+ args = args.split('&')
+ vals = dict(arg.split('=', 1) for arg in args)
+ res = getattr(self, name)(**vals)
+ print " ->", res
+ return res
+ def batch(self, cmds):
+ res = []
+ for pair in cmds.split(';'):
+ name, args = pair.split(':', 1)
+ vals = {}
+ for a in args.split(','):
+ if a:
+ n, v = a.split('=')
+ vals[n] = unescapearg(v)
+ res.append(escapearg(getattr(self, name)(**vals)))
+ return ';'.join(res)
+ def foo(self, one, two):
+ return mangle(self.local.foo(unmangle(one), unmangle(two)))
+ def bar(self, b, a):
+ return mangle(self.local.bar(unmangle(b), unmangle(a)))
+ def greet(self, name):
+ return mangle(self.local.greet(unmangle(name)))
+myserver = server(mylocal)
+
+# local side
+
+# equivalent of wireproto.encode/decodelist, that is, type-specific marshalling
+# here we just transform the strings a bit to check we're properly en-/decoding
+def mangle(s):
+ return ''.join(chr(ord(c) + 1) for c in s)
+def unmangle(s):
+ return ''.join(chr(ord(c) - 1) for c in s)
+
+# equivalent of wireproto.wirerepository and something like http's wire format
+class remotething(thing):
+ def __init__(self, server):
+ self.server = server
+ def _submitone(self, name, args):
+ req = name + '?' + '&'.join(['%s=%s' % (n, v) for n, v in args])
+ return self.server.perform(req)
+ def _submitbatch(self, cmds):
+ req = []
+ for name, args in cmds:
+ args = ','.join(n + '=' + escapearg(v) for n, v in args)
+ req.append(name + ':' + args)
+ req = ';'.join(req)
+ res = self._submitone('batch', [('cmds', req,)])
+ return res.split(';')
+
+ def batch(self):
+ return remotebatch(self)
+
+ @batchable
+ def foo(self, one, two=None):
+ if not one:
+ yield "Nope", None
+ encargs = [('one', mangle(one),), ('two', mangle(two),)]
+ encresref = future()
+ yield encargs, encresref
+ yield unmangle(encresref.value)
+
+ @batchable
+ def bar(self, b, a):
+ encresref = future()
+ yield [('b', mangle(b),), ('a', mangle(a),)], encresref
+ yield unmangle(encresref.value)
+
+ # greet is coded directly. It therefore does not support batching. If it
+ # does appear in a batch, the batch is split around greet, and the call to
+ # greet is done in its own roundtrip.
+ def greet(self, name=None):
+ return unmangle(self._submitone('greet', [('name', mangle(name),)]))
+
+# demo remote usage
+
+myproxy = remotething(myserver)
+print
+print "== Remote"
+use(myproxy)
diff --git a/tests/test-batching.py.out b/tests/test-batching.py.out
new file mode 100644
index 0000000..4b677c2
--- /dev/null
+++ b/tests/test-batching.py.out
@@ -0,0 +1,32 @@
+
+== Local
+Ready.
+Un and Deux
+Eins und Zwei
+One and Two
+Nope
+Eins und Zwei
+Hello, John Smith
+Ready.
+Uno und Due
+
+== Remote
+Ready.
+REQ: foo?one=Vo&two=Efvy
+ -> Vo!boe!Efvy
+Un and Deux
+REQ: bar?b=Fjot&a=[xfj
+ -> Fjot!voe![xfj
+Eins und Zwei
+REQ: batch?cmds=foo:one=Pof,two=Uxp;bar:b=Fjot,a=[xfj
+ -> Pof!boe!Uxp;Fjot!voe![xfj
+REQ: greet?name=Kpio!Tnjui
+ -> Ifmmp-!Kpio!Tnjui
+REQ: batch?cmds=bar:b=Vop,a=Evf
+ -> Vop!voe!Evf
+One and Two
+Nope
+Eins und Zwei
+Hello, John Smith
+Ready.
+Uno und Due
diff --git a/tests/test-bdiff.py b/tests/test-bdiff.py
new file mode 100644
index 0000000..c17dfb0
--- /dev/null
+++ b/tests/test-bdiff.py
@@ -0,0 +1,66 @@
+import struct
+from mercurial import bdiff, mpatch
+
+def test1(a, b):
+ d = bdiff.bdiff(a, b)
+ c = a
+ if d:
+ c = mpatch.patches(a, [d])
+ if c != b:
+ print "***", repr(a), repr(b)
+ print "bad:"
+ print repr(c)[:200]
+ print repr(d)
+
+def test(a, b):
+ print "***", repr(a), repr(b)
+ test1(a, b)
+ test1(b, a)
+
+test("a\nc\n\n\n\n", "a\nb\n\n\n")
+test("a\nb\nc\n", "a\nc\n")
+test("", "")
+test("a\nb\nc", "a\nb\nc")
+test("a\nb\nc\nd\n", "a\nd\n")
+test("a\nb\nc\nd\n", "a\nc\ne\n")
+test("a\nb\nc\n", "a\nc\n")
+test("a\n", "c\na\nb\n")
+test("a\n", "")
+test("a\n", "b\nc\n")
+test("a\n", "c\na\n")
+test("", "adjfkjdjksdhfksj")
+test("", "ab")
+test("", "abc")
+test("a", "a")
+test("ab", "ab")
+test("abc", "abc")
+test("a\n", "a\n")
+test("a\nb", "a\nb")
+
+#issue1295
+def showdiff(a, b):
+ bin = bdiff.bdiff(a, b)
+ pos = 0
+ while pos < len(bin):
+ p1, p2, l = struct.unpack(">lll", bin[pos:pos + 12])
+ pos += 12
+ print p1, p2, repr(bin[pos:pos + l])
+ pos += l
+showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\nx\n\nz\n")
+showdiff("x\n\nx\n\nx\n\nx\n\nz\n", "x\n\nx\n\ny\n\nx\n\ny\n\nx\n\nz\n")
+
+print "done"
+
+def testfixws(a, b, allws):
+ c = bdiff.fixws(a, allws)
+ if c != b:
+ print "*** fixws", repr(a), repr(b), allws
+ print "got:"
+ print repr(c)
+
+testfixws(" \ta\r b\t\n", "ab\n", 1)
+testfixws(" \ta\r b\t\n", " a b\n", 0)
+testfixws("", "", 1)
+testfixws("", "", 0)
+
+print "done"
diff --git a/tests/test-bdiff.py.out b/tests/test-bdiff.py.out
new file mode 100644
index 0000000..9c00d05
--- /dev/null
+++ b/tests/test-bdiff.py.out
@@ -0,0 +1,24 @@
+*** 'a\nc\n\n\n\n' 'a\nb\n\n\n'
+*** 'a\nb\nc\n' 'a\nc\n'
+*** '' ''
+*** 'a\nb\nc' 'a\nb\nc'
+*** 'a\nb\nc\nd\n' 'a\nd\n'
+*** 'a\nb\nc\nd\n' 'a\nc\ne\n'
+*** 'a\nb\nc\n' 'a\nc\n'
+*** 'a\n' 'c\na\nb\n'
+*** 'a\n' ''
+*** 'a\n' 'b\nc\n'
+*** 'a\n' 'c\na\n'
+*** '' 'adjfkjdjksdhfksj'
+*** '' 'ab'
+*** '' 'abc'
+*** 'a' 'a'
+*** 'ab' 'ab'
+*** 'abc' 'abc'
+*** 'a\n' 'a\n'
+*** 'a\nb' 'a\nb'
+6 6 'y\n\n'
+6 6 'y\n\n'
+9 9 'y\n\n'
+done
+done
diff --git a/tests/test-bheads.t b/tests/test-bheads.t
new file mode 100644
index 0000000..2093813
--- /dev/null
+++ b/tests/test-bheads.t
@@ -0,0 +1,375 @@
+ $ heads()
+ > {
+ > hg heads --template '{rev}: {desc|firstline|strip} ({branches})\n' "$@"
+ > }
+
+ $ hg init a
+ $ cd a
+ $ echo 'root' >root
+ $ hg add root
+ $ hg commit -m "Adding root node"
+ $ heads
+ 0: Adding root node ()
+-------
+ $ heads .
+ 0: Adding root node ()
+
+=======
+
+ $ echo 'a' >a
+ $ hg add a
+ $ hg branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -m "Adding a branch"
+ $ heads
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 1: Adding a branch (a)
+
+=======
+
+ $ hg update -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'b' >b
+ $ hg add b
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -m "Adding b branch"
+ $ heads
+ 2: Adding b branch (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 2: Adding b branch (b)
+
+=======
+
+ $ echo 'bh1' >bh1
+ $ hg add bh1
+ $ hg commit -m "Adding b branch head 1"
+ $ heads
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 3: Adding b branch head 1 (b)
+
+=======
+
+ $ hg update -C 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'bh2' >bh2
+ $ hg add bh2
+ $ hg commit -m "Adding b branch head 2"
+ created new head
+ $ heads
+ 4: Adding b branch head 2 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ $ heads .
+ 4: Adding b branch head 2 (b)
+ 3: Adding b branch head 1 (b)
+
+=======
+
+ $ hg update -C 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'bh3' >bh3
+ $ hg add bh3
+ $ hg commit -m "Adding b branch head 3"
+ created new head
+ $ heads
+ 5: Adding b branch head 3 (b)
+ 4: Adding b branch head 2 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 5: Adding b branch head 3 (b)
+ 4: Adding b branch head 2 (b)
+ 3: Adding b branch head 1 (b)
+
+=======
+
+ $ hg merge 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m "Merging b branch head 2 and b branch head 3"
+ $ heads
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+
+=======
+
+ $ echo 'c' >c
+ $ hg add c
+ $ hg branch c
+ marked working directory as branch c
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -m "Adding c branch"
+ $ heads
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+-------
+ $ heads .
+ 7: Adding c branch (c)
+
+=======
+
+ $ heads -r 3 .
+ no open branch heads found on branches c (started at 3)
+ [1]
+ $ heads -r 2 .
+ 7: Adding c branch (c)
+-------
+ $ hg update -C 4
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+-------
+ $ heads -r 3 .
+ 3: Adding b branch head 1 (b)
+-------
+ $ heads -r 2 .
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+-------
+ $ heads -r 7 .
+ no open branch heads found on branches b (started at 7)
+ [1]
+
+=======
+
+ $ for i in 0 1 2 3 4 5 6 7; do
+ > hg update -C "$i"
+ > heads
+ > echo '-------'
+ > heads .
+ > echo '-------'
+ > done
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 0: Adding root node ()
+ -------
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 1: Adding a branch (a)
+ -------
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+ -------
+ 7: Adding c branch (c)
+ -------
+
+=======
+
+ $ for i in a b c z; do
+ > heads "$i"
+ > echo '-------'
+ > done
+ 1: Adding a branch (a)
+ -------
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ -------
+ 7: Adding c branch (c)
+ -------
+ abort: unknown revision 'z'!
+ -------
+
+=======
+
+ $ heads 0 1 2 3 4 5 6 7
+ 7: Adding c branch (c)
+ 6: Merging b branch head 2 and b branch head 3 (b)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+ 0: Adding root node ()
+
+Topological heads:
+
+ $ heads -t
+ 7: Adding c branch (c)
+ 3: Adding b branch head 1 (b)
+ 1: Adding a branch (a)
+
+ $ cd ..
+______________
+
+"created new head" message tests
+
+ $ hg init newheadmsg
+ $ cd newheadmsg
+
+Init: no msg
+
+ $ echo 1 > a
+ $ hg ci -Am "a0: Initial root"
+ adding a
+ $ echo 2 >> a
+ $ hg ci -m "a1 (HN)"
+
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 1 > b
+ $ hg ci -Am "b2: Initial root for branch b"
+ adding b
+ $ echo 2 >> b
+ $ hg ci -m "b3 (HN)"
+
+Case NN: msg
+
+ $ hg up -q null
+ $ hg branch -f b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 1 > bb
+ $ hg ci -Am "b4 (NN): new topo root for branch b"
+ adding bb
+ created new head
+
+Case HN: no msg
+
+ $ echo 2 >> bb
+ $ hg ci -m "b5 (HN)"
+
+Case BN: msg
+
+ $ hg branch -f default
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 1 > aa
+ $ hg ci -Am "a6 (BN): new branch root"
+ adding aa
+ created new head
+
+Case CN: msg
+
+ $ hg up -q 4
+ $ echo 3 >> bbb
+ $ hg ci -Am "b7 (CN): regular new head"
+ adding bbb
+ created new head
+
+Case BB: msg
+
+ $ hg up -q 4
+ $ hg merge -q 3
+ $ hg branch -f default
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m "a8 (BB): weird new branch root"
+ created new head
+
+Case CB: msg
+
+ $ hg up -q 4
+ $ hg merge -q 1
+ $ hg ci -m "b9 (CB): new head from branch merge"
+ created new head
+
+Case HB: no msg
+
+ $ hg up -q 7
+ $ hg merge -q 6
+ $ hg ci -m "b10 (HB): continuing head from branch merge"
+
+Case CC: msg
+
+ $ hg up -q 4
+ $ hg merge -q 2
+ $ hg ci -m "b11 (CC): new head from merge"
+ created new head
+
+Case CH: no msg
+
+ $ hg up -q 2
+ $ hg merge -q 10
+ $ hg ci -m "b12 (CH): continuing head from merge"
+
+Case HH: no msg
+
+ $ hg merge -q 3
+ $ hg ci -m "b12 (HH): merging two heads"
+
+ $ cd ..
diff --git a/tests/test-bisect.t b/tests/test-bisect.t
new file mode 100644
index 0000000..4e8b771
--- /dev/null
+++ b/tests/test-bisect.t
@@ -0,0 +1,510 @@
+ $ hg init
+
+
+committing changes
+
+ $ count=0
+ $ echo > a
+ $ while test $count -lt 32 ; do
+ > echo 'a' >> a
+ > test $count -eq 0 && hg add
+ > hg ci -m "msg $count" -d "$count 0"
+ > count=`expr $count + 1`
+ > done
+ adding a
+
+
+ $ hg log
+ changeset: 31:58c80a7c8a40
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:31 1970 +0000
+ summary: msg 31
+
+ changeset: 30:ed2d2f24b11c
+ user: test
+ date: Thu Jan 01 00:00:30 1970 +0000
+ summary: msg 30
+
+ changeset: 29:b5bd63375ab9
+ user: test
+ date: Thu Jan 01 00:00:29 1970 +0000
+ summary: msg 29
+
+ changeset: 28:8e0c2264c8af
+ user: test
+ date: Thu Jan 01 00:00:28 1970 +0000
+ summary: msg 28
+
+ changeset: 27:288867a866e9
+ user: test
+ date: Thu Jan 01 00:00:27 1970 +0000
+ summary: msg 27
+
+ changeset: 26:3efc6fd51aeb
+ user: test
+ date: Thu Jan 01 00:00:26 1970 +0000
+ summary: msg 26
+
+ changeset: 25:02a84173a97a
+ user: test
+ date: Thu Jan 01 00:00:25 1970 +0000
+ summary: msg 25
+
+ changeset: 24:10e0acd3809e
+ user: test
+ date: Thu Jan 01 00:00:24 1970 +0000
+ summary: msg 24
+
+ changeset: 23:5ec79163bff4
+ user: test
+ date: Thu Jan 01 00:00:23 1970 +0000
+ summary: msg 23
+
+ changeset: 22:06c7993750ce
+ user: test
+ date: Thu Jan 01 00:00:22 1970 +0000
+ summary: msg 22
+
+ changeset: 21:e5db6aa3fe2a
+ user: test
+ date: Thu Jan 01 00:00:21 1970 +0000
+ summary: msg 21
+
+ changeset: 20:7128fb4fdbc9
+ user: test
+ date: Thu Jan 01 00:00:20 1970 +0000
+ summary: msg 20
+
+ changeset: 19:52798545b482
+ user: test
+ date: Thu Jan 01 00:00:19 1970 +0000
+ summary: msg 19
+
+ changeset: 18:86977a90077e
+ user: test
+ date: Thu Jan 01 00:00:18 1970 +0000
+ summary: msg 18
+
+ changeset: 17:03515f4a9080
+ user: test
+ date: Thu Jan 01 00:00:17 1970 +0000
+ summary: msg 17
+
+ changeset: 16:a2e6ea4973e9
+ user: test
+ date: Thu Jan 01 00:00:16 1970 +0000
+ summary: msg 16
+
+ changeset: 15:e7fa0811edb0
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: msg 15
+
+ changeset: 14:ce8f0998e922
+ user: test
+ date: Thu Jan 01 00:00:14 1970 +0000
+ summary: msg 14
+
+ changeset: 13:9d7d07bc967c
+ user: test
+ date: Thu Jan 01 00:00:13 1970 +0000
+ summary: msg 13
+
+ changeset: 12:1941b52820a5
+ user: test
+ date: Thu Jan 01 00:00:12 1970 +0000
+ summary: msg 12
+
+ changeset: 11:7b4cd9578619
+ user: test
+ date: Thu Jan 01 00:00:11 1970 +0000
+ summary: msg 11
+
+ changeset: 10:7c5eff49a6b6
+ user: test
+ date: Thu Jan 01 00:00:10 1970 +0000
+ summary: msg 10
+
+ changeset: 9:eb44510ef29a
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: msg 9
+
+ changeset: 8:453eb4dba229
+ user: test
+ date: Thu Jan 01 00:00:08 1970 +0000
+ summary: msg 8
+
+ changeset: 7:03750880c6b5
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: msg 7
+
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+ changeset: 5:7874a09ea728
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: msg 5
+
+ changeset: 4:9b2ba8336a65
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: msg 4
+
+ changeset: 3:b53bea5e2fcb
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: msg 3
+
+ changeset: 2:db07c04beaca
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: msg 2
+
+ changeset: 1:5cd978ea5149
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: msg 1
+
+ changeset: 0:b99c7b9c8e11
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: msg 0
+
+
+ $ hg up -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+bisect test
+
+ $ hg bisect -r
+ $ hg bisect -b
+ $ hg bisect -g 1
+ Testing changeset 16:a2e6ea4973e9 (30 changesets remaining, ~4 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 23:5ec79163bff4 (15 changesets remaining, ~3 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+skip
+
+ $ hg bisect -s
+ Testing changeset 24:10e0acd3809e (15 changesets remaining, ~3 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 27:288867a866e9 (7 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 29:b5bd63375ab9 (4 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -b
+ Testing changeset 28:8e0c2264c8af (2 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ The first bad revision is:
+ changeset: 29:b5bd63375ab9
+ user: test
+ date: Thu Jan 01 00:00:29 1970 +0000
+ summary: msg 29
+
+
+mark revsets instead of single revs
+
+ $ hg bisect -r
+ $ hg bisect -b "0::3"
+ $ hg bisect -s "13::16"
+ $ hg bisect -g "26::tip"
+ Testing changeset 12:1941b52820a5 (23 changesets remaining, ~4 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat .hg/bisect.state
+ current 1941b52820a544549596820a8ae006842b0e2c64
+ skip 9d7d07bc967ca98ad0600c24953fd289ad5fa991
+ skip ce8f0998e922c179e80819d5066fbe46e2998784
+ skip e7fa0811edb063f6319531f0d0a865882138e180
+ skip a2e6ea4973e9196ddd3386493b0c214b41fd97d3
+ bad b99c7b9c8e11558adef3fad9af211c58d46f325b
+ bad 5cd978ea51499179507ee7b6f340d2dbaa401185
+ bad db07c04beaca44cf24832541e7f4a2346a95275b
+ bad b53bea5e2fcb30d3e00bd3409507a5659ce0fd8b
+ good 3efc6fd51aeb8594398044c6c846ca59ae021203
+ good 288867a866e9adb7a29880b66936c874b80f4651
+ good 8e0c2264c8af790daf3585ada0669d93dee09c83
+ good b5bd63375ab9a290419f2024b7f4ee9ea7ce90a8
+ good ed2d2f24b11c368fa8aa0da9f4e1db580abade59
+ good 58c80a7c8a4025a94cedaf7b4a4e3124e8909a96
+
+bisect reverse test
+
+ $ hg bisect -r
+ $ hg bisect -b null
+ $ hg bisect -g tip
+ Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 7:03750880c6b5 (16 changesets remaining, ~4 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+skip
+
+ $ hg bisect -s
+ Testing changeset 6:a3d5c6fdf0d3 (16 changesets remaining, ~4 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 2:db07c04beaca (7 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ Testing changeset 0:b99c7b9c8e11 (3 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -b
+ Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ The first good revision is:
+ changeset: 1:5cd978ea5149
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: msg 1
+
+
+ $ hg bisect -r
+ $ hg bisect -g tip
+ $ hg bisect -b tip
+ abort: starting revisions are not directly related
+ [255]
+
+ $ hg bisect -r
+ $ hg bisect -g null
+ $ hg bisect -bU tip
+ Testing changeset 15:e7fa0811edb0 (32 changesets remaining, ~5 tests)
+ $ hg id
+ 5cd978ea5149
+
+
+Issue1228: hg bisect crashes when you skip the last rev in bisection
+Issue1182: hg bisect exception
+
+ $ hg bisect -r
+ $ hg bisect -b 4
+ $ hg bisect -g 0
+ Testing changeset 2:db07c04beaca (4 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 1:5cd978ea5149 (4 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 3:b53bea5e2fcb (4 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Due to skipped revisions, the first bad revision could be any of:
+ changeset: 1:5cd978ea5149
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: msg 1
+
+ changeset: 2:db07c04beaca
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: msg 2
+
+ changeset: 3:b53bea5e2fcb
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: msg 3
+
+ changeset: 4:9b2ba8336a65
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: msg 4
+
+
+
+reproduce non converging bisect, issue1182
+
+ $ hg bisect -r
+ $ hg bisect -g 0
+ $ hg bisect -b 2
+ Testing changeset 1:5cd978ea5149 (2 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Due to skipped revisions, the first bad revision could be any of:
+ changeset: 1:5cd978ea5149
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: msg 1
+
+ changeset: 2:db07c04beaca
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: msg 2
+
+
+
+test no action
+
+ $ hg bisect -r
+ $ hg bisect
+ abort: cannot bisect (no known good revisions)
+ [255]
+
+
+reproduce AssertionError, issue1445
+
+ $ hg bisect -r
+ $ hg bisect -b 6
+ $ hg bisect -g 0
+ Testing changeset 3:b53bea5e2fcb (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 2:db07c04beaca (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 4:9b2ba8336a65 (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 1:5cd978ea5149 (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -s
+ Testing changeset 5:7874a09ea728 (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ The first bad revision is:
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+ $ hg log -r "bisect(good)"
+ changeset: 0:b99c7b9c8e11
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: msg 0
+
+ changeset: 5:7874a09ea728
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: msg 5
+
+ $ hg log -r "bisect(bad)"
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+ $ hg log -r "bisect(current)"
+ changeset: 5:7874a09ea728
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: msg 5
+
+ $ hg log -r "bisect(skip)"
+ changeset: 1:5cd978ea5149
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: msg 1
+
+ changeset: 2:db07c04beaca
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: msg 2
+
+ changeset: 3:b53bea5e2fcb
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: msg 3
+
+ changeset: 4:9b2ba8336a65
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: msg 4
+
+
+test legacy bisected() keyword
+
+ $ hg log -r "bisected(bad)"
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+
+ $ set +e
+
+test invalid command
+assuming that the shell returns 127 if command not found ...
+
+ $ hg bisect -r
+ $ hg bisect --command 'exit 127'
+ abort: failed to execute exit 127
+ [255]
+
+
+test bisecting command
+
+ $ cat > script.py <<EOF
+ > #!/usr/bin/env python
+ > import sys
+ > from mercurial import ui, hg
+ > repo = hg.repository(ui.ui(), '.')
+ > if repo['.'].rev() < 6:
+ > sys.exit(1)
+ > EOF
+ $ chmod +x script.py
+ $ hg bisect -r
+ $ hg bisect --good tip
+ $ hg bisect --bad 0
+ Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect --command "python \"$TESTTMP/script.py\" and some parameters"
+ changeset 15:e7fa0811edb0: good
+ changeset 7:03750880c6b5: good
+ changeset 3:b53bea5e2fcb: bad
+ changeset 5:7874a09ea728: bad
+ changeset 6:a3d5c6fdf0d3: good
+ The first good revision is:
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+
+
+test bisecting via a command without updating the working dir, and
+ensure that the bisect state file is updated before running a test
+command
+
+ $ hg update null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ cat > script.sh <<'EOF'
+ > #!/bin/sh
+ > test -n "$HG_NODE" || (echo HG_NODE missing; exit 127)
+ > current="`hg log -r \"bisect(current)\" --template {node}`"
+ > test "$current" = "$HG_NODE" || (echo current is bad: $current; exit 127)
+ > rev="`hg log -r $HG_NODE --template {rev}`"
+ > test "$rev" -ge 6
+ > EOF
+ $ chmod +x script.sh
+ $ hg bisect -r
+ $ hg bisect --good tip --noupdate
+ $ hg bisect --bad 0 --noupdate
+ Testing changeset 15:e7fa0811edb0 (31 changesets remaining, ~4 tests)
+ $ hg bisect --command "sh \"$TESTTMP/script.sh\" and some params" --noupdate
+ changeset 15:e7fa0811edb0: good
+ changeset 7:03750880c6b5: good
+ changeset 3:b53bea5e2fcb: bad
+ changeset 5:7874a09ea728: bad
+ changeset 6:a3d5c6fdf0d3: good
+ The first good revision is:
+ changeset: 6:a3d5c6fdf0d3
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: msg 6
+
+
+ensure that we still don't have a working dir
+
+ $ hg parents
diff --git a/tests/test-bisect2.t b/tests/test-bisect2.t
new file mode 100644
index 0000000..5414df7
--- /dev/null
+++ b/tests/test-bisect2.t
@@ -0,0 +1,795 @@
+# The tests in test-bisect are done on a linear history. Here the
+# following repository history is used for testing:
+#
+# 17
+# |
+# 18 16
+# \ /
+# 15
+# / \
+# / \
+# 10 13
+# / \ |
+# / \ | 14
+# 7 6 9 12 /
+# \ / \ | |/
+# 4 \ | 11
+# \ \ | /
+# 3 5 | /
+# \ / |/
+# 2 8
+# \ /
+# 1
+# |
+# 0
+
+init
+
+ $ hg init
+
+committing changes
+
+ $ echo > a
+ $ echo '0' >> a
+ $ hg add a
+ $ hg ci -m "0" -d "0 0"
+ $ echo '1' >> a
+ $ hg ci -m "1" -d "1 0"
+ $ echo '2' >> a
+ $ hg ci -m "2" -d "2 0"
+ $ echo '3' >> a
+ $ hg ci -m "3" -d "3 0"
+ $ echo '4' >> a
+ $ hg ci -m "4" -d "4 0"
+
+create branch
+
+ $ hg up -r 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo '5' >> b
+ $ hg add b
+ $ hg ci -m "5" -d "5 0"
+ created new head
+
+merge
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "merge 4,5" -d "6 0"
+
+create branch
+
+ $ hg up -r 4
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo '7' > c
+ $ hg add c
+ $ hg ci -m "7" -d "7 0"
+ created new head
+
+create branch
+
+ $ hg up -r 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo '8' > d
+ $ hg add d
+ $ hg ci -m "8" -d "8 0"
+ created new head
+ $ echo '9' >> d
+ $ hg ci -m "9" -d "9 0"
+
+merge
+
+ $ hg merge -r 6
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "merge 6,9" -d "10 0"
+
+create branch
+
+ $ hg up -r 8
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo '11' > e
+ $ hg add e
+ $ hg ci -m "11" -d "11 0"
+ created new head
+ $ echo '12' >> e
+ $ hg ci -m "12" -d "12 0"
+ $ echo '13' >> e
+ $ hg ci -m "13" -d "13 0"
+
+create branch
+
+ $ hg up -r 11
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo '14' > f
+ $ hg add f
+ $ hg ci -m "14" -d "14 0"
+ created new head
+
+merge
+
+ $ hg up -r 13 -C
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge -r 10
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "merge 10,13" -d "15 0"
+ $ echo '16' >> e
+ $ hg ci -m "16" -d "16 0"
+ $ echo '17' >> e
+ $ hg ci -m "17" -d "17 0"
+
+create branch
+
+ $ hg up -r 15
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo '18' >> e
+ $ hg ci -m "18" -d "18 0"
+ created new head
+
+log
+
+ $ hg log
+ changeset: 18:d42e18c7bc9b
+ tag: tip
+ parent: 15:857b178a7cf3
+ user: test
+ date: Thu Jan 01 00:00:18 1970 +0000
+ summary: 18
+
+ changeset: 17:228c06deef46
+ user: test
+ date: Thu Jan 01 00:00:17 1970 +0000
+ summary: 17
+
+ changeset: 16:609d82a7ebae
+ user: test
+ date: Thu Jan 01 00:00:16 1970 +0000
+ summary: 16
+
+ changeset: 15:857b178a7cf3
+ parent: 13:b0a32c86eb31
+ parent: 10:429fcd26f52d
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: merge 10,13
+
+ changeset: 14:faa450606157
+ parent: 11:82ca6f06eccd
+ user: test
+ date: Thu Jan 01 00:00:14 1970 +0000
+ summary: 14
+
+ changeset: 13:b0a32c86eb31
+ user: test
+ date: Thu Jan 01 00:00:13 1970 +0000
+ summary: 13
+
+ changeset: 12:9f259202bbe7
+ user: test
+ date: Thu Jan 01 00:00:12 1970 +0000
+ summary: 12
+
+ changeset: 11:82ca6f06eccd
+ parent: 8:dab8161ac8fc
+ user: test
+ date: Thu Jan 01 00:00:11 1970 +0000
+ summary: 11
+
+ changeset: 10:429fcd26f52d
+ parent: 9:3c77083deb4a
+ parent: 6:a214d5d3811a
+ user: test
+ date: Thu Jan 01 00:00:10 1970 +0000
+ summary: merge 6,9
+
+ changeset: 9:3c77083deb4a
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: 9
+
+ changeset: 8:dab8161ac8fc
+ parent: 1:4ca5088da217
+ user: test
+ date: Thu Jan 01 00:00:08 1970 +0000
+ summary: 8
+
+ changeset: 7:50c76098bbf2
+ parent: 4:5c668c22234f
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: 7
+
+ changeset: 6:a214d5d3811a
+ parent: 5:385a529b6670
+ parent: 4:5c668c22234f
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: merge 4,5
+
+ changeset: 5:385a529b6670
+ parent: 2:051e12f87bf1
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: 5
+
+ changeset: 4:5c668c22234f
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: 4
+
+ changeset: 3:0950834f0a9c
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: 3
+
+ changeset: 2:051e12f87bf1
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+ changeset: 1:4ca5088da217
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: 1
+
+ changeset: 0:33b1f9bc8bc5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+
+hg up -C
+
+ $ hg up -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+complex bisect test 1 # first bad rev is 9
+
+ $ hg bisect -r
+ $ hg bisect -g 0
+ $ hg bisect -b 17 # -> update to rev 6
+ Testing changeset 6:a214d5d3811a (15 changesets remaining, ~3 tests)
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 17:228c06deef46
+ $ hg log -q -r 'bisect(untested)'
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ $ hg log -q -r 'bisect(ignored)'
+ $ hg bisect -g # -> update to rev 13
+ Testing changeset 13:b0a32c86eb31 (9 changesets remaining, ~3 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -s # -> update to rev 10
+ Testing changeset 10:429fcd26f52d (9 changesets remaining, ~3 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -b # -> update to rev 8
+ Testing changeset 8:dab8161ac8fc (3 changesets remaining, ~1 tests)
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -g # -> update to rev 9
+ Testing changeset 9:3c77083deb4a (2 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -b
+ The first bad revision is:
+ changeset: 9:3c77083deb4a
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: 9
+
+ $ hg log -q -r 'bisect(range)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+ $ hg log -q -r 'bisect(untested)'
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ $ hg log -q -r 'bisect(bads)'
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+
+complex bisect test 2 # first good rev is 13
+
+ $ hg bisect -r
+ $ hg bisect -g 18
+ $ hg bisect -b 1 # -> update to rev 6
+ Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -s # -> update to rev 10
+ Testing changeset 10:429fcd26f52d (13 changesets remaining, ~3 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 6:a214d5d3811a
+ 18:d42e18c7bc9b
+ $ hg bisect -b # -> update to rev 12
+ Testing changeset 12:9f259202bbe7 (5 changesets remaining, ~2 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 18:d42e18c7bc9b
+ $ hg log -q -r 'bisect(untested)'
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ $ hg bisect -b # -> update to rev 13
+ Testing changeset 13:b0a32c86eb31 (3 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -g
+ The first good revision is:
+ changeset: 13:b0a32c86eb31
+ user: test
+ date: Thu Jan 01 00:00:13 1970 +0000
+ summary: 13
+
+ $ hg log -q -r 'bisect(range)'
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 18:d42e18c7bc9b
+
+complex bisect test 3
+
+first bad rev is 15
+10,9,13 are skipped an might be the first bad revisions as well
+
+ $ hg bisect -r
+ $ hg bisect -g 1
+ $ hg bisect -b 16 # -> update to rev 6
+ Testing changeset 6:a214d5d3811a (13 changesets remaining, ~3 tests)
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg bisect -g # -> update to rev 13
+ Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -s # -> update to rev 10
+ Testing changeset 10:429fcd26f52d (8 changesets remaining, ~3 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -s # -> update to rev 12
+ Testing changeset 12:9f259202bbe7 (8 changesets remaining, ~3 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 10:429fcd26f52d
+ 13:b0a32c86eb31
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg bisect -g # -> update to rev 9
+ Testing changeset 9:3c77083deb4a (5 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -s # -> update to rev 15
+ Testing changeset 15:857b178a7cf3 (5 changesets remaining, ~2 tests)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(ignored)'
+ $ hg bisect -b
+ Due to skipped revisions, the first bad revision could be any of:
+ changeset: 9:3c77083deb4a
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: 9
+
+ changeset: 10:429fcd26f52d
+ parent: 9:3c77083deb4a
+ parent: 6:a214d5d3811a
+ user: test
+ date: Thu Jan 01 00:00:10 1970 +0000
+ summary: merge 6,9
+
+ changeset: 13:b0a32c86eb31
+ user: test
+ date: Thu Jan 01 00:00:13 1970 +0000
+ summary: 13
+
+ changeset: 15:857b178a7cf3
+ parent: 13:b0a32c86eb31
+ parent: 10:429fcd26f52d
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: merge 10,13
+
+ $ hg log -q -r 'bisect(range)'
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ $ hg log -q -r 'bisect(ignored)'
+
+complex bisect test 4
+
+first good revision is 17
+15,16 are skipped an might be the first good revisions as well
+
+ $ hg bisect -r
+ $ hg bisect -g 17
+ $ hg bisect -b 8 # -> update to rev 10
+ Testing changeset 13:b0a32c86eb31 (8 changesets remaining, ~3 tests)
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -b # -> update to rev 13
+ Testing changeset 10:429fcd26f52d (5 changesets remaining, ~2 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect -b # -> update to rev 15
+ Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 17:228c06deef46
+ $ hg bisect -s # -> update to rev 16
+ Testing changeset 16:609d82a7ebae (3 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 17:228c06deef46
+ $ hg bisect -s
+ Due to skipped revisions, the first good revision could be any of:
+ changeset: 15:857b178a7cf3
+ parent: 13:b0a32c86eb31
+ parent: 10:429fcd26f52d
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: merge 10,13
+
+ changeset: 16:609d82a7ebae
+ user: test
+ date: Thu Jan 01 00:00:16 1970 +0000
+ summary: 16
+
+ changeset: 17:228c06deef46
+ user: test
+ date: Thu Jan 01 00:00:17 1970 +0000
+ summary: 17
+
+ $ hg log -q -r 'bisect(range)'
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+
+test unrelated revs:
+
+ $ hg bisect --reset
+ $ hg bisect -b 7
+ $ hg bisect -g 14
+ abort: starting revisions are not directly related
+ [255]
+ $ hg log -q -r 'bisect(range)'
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 7:50c76098bbf2
+ 14:faa450606157
+ $ hg bisect --reset
+
+end at merge: 17 bad, 11 good (but 9 is first bad)
+
+ $ hg bisect -r
+ $ hg bisect -b 17
+ $ hg bisect -g 11
+ Testing changeset 13:b0a32c86eb31 (5 changesets remaining, ~2 tests)
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(ignored)'
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ $ hg bisect -g
+ Testing changeset 15:857b178a7cf3 (3 changesets remaining, ~1 tests)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bisect -b
+ The first bad revision is:
+ changeset: 15:857b178a7cf3
+ parent: 13:b0a32c86eb31
+ parent: 10:429fcd26f52d
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: merge 10,13
+
+ Not all ancestors of this changeset have been checked.
+ Use bisect --extend to continue the bisection from
+ the common ancestor, dab8161ac8fc.
+ $ hg log -q -r 'bisect(range)'
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+ $ hg log -q -r 'bisect(untested)'
+ $ hg log -q -r 'bisect(ignored)'
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ $ hg bisect --extend
+ Extending search to changeset 8:dab8161ac8fc
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(untested)'
+ $ hg log -q -r 'bisect(ignored)'
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ $ hg bisect -g # dab8161ac8fc
+ Testing changeset 9:3c77083deb4a (3 changesets remaining, ~1 tests)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(untested)'
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ $ hg log -q -r 'bisect(ignored)'
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ $ hg log -q -r 'bisect(bads)'
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+ $ hg bisect -b
+ The first bad revision is:
+ changeset: 9:3c77083deb4a
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: 9
+
+ $ hg log -q -r 'bisect(range)'
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+ $ hg log -q -r 'bisect(untested)'
+ $ hg log -q -r 'bisect(ignored)'
+ 2:051e12f87bf1
+ 3:0950834f0a9c
+ 4:5c668c22234f
+ 5:385a529b6670
+ 6:a214d5d3811a
+ $ hg log -q -r 'bisect(goods)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ $ hg log -q -r 'bisect(bads)'
+ 9:3c77083deb4a
+ 10:429fcd26f52d
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+
+user adds irrelevant but consistent information (here: -g 2) to bisect state
+
+ $ hg bisect -r
+ $ hg bisect -b 13
+ $ hg bisect -g 8
+ Testing changeset 11:82ca6f06eccd (3 changesets remaining, ~1 tests)
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(untested)'
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ $ hg bisect -g 2
+ Testing changeset 11:82ca6f06eccd (3 changesets remaining, ~1 tests)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log -q -r 'bisect(untested)'
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ $ hg bisect -b
+ The first bad revision is:
+ changeset: 11:82ca6f06eccd
+ parent: 8:dab8161ac8fc
+ user: test
+ date: Thu Jan 01 00:00:11 1970 +0000
+ summary: 11
+
+ $ hg log -q -r 'bisect(range)'
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ $ hg log -q -r 'bisect(pruned)'
+ 0:33b1f9bc8bc5
+ 1:4ca5088da217
+ 2:051e12f87bf1
+ 8:dab8161ac8fc
+ 11:82ca6f06eccd
+ 12:9f259202bbe7
+ 13:b0a32c86eb31
+ 14:faa450606157
+ 15:857b178a7cf3
+ 16:609d82a7ebae
+ 17:228c06deef46
+ 18:d42e18c7bc9b
+ $ hg log -q -r 'bisect(untested)'
diff --git a/tests/test-bisect3.t b/tests/test-bisect3.t
new file mode 100644
index 0000000..5d62120
--- /dev/null
+++ b/tests/test-bisect3.t
@@ -0,0 +1,232 @@
+# Here we create a simple DAG which has just enough of the required
+# topology to test all the bisection status labels:
+#
+# 13--14
+# /
+# 0--1--2--3---------9--10--11--12
+# \ /
+# 4--5--6--7--8
+
+
+ $ hg init
+
+ $ echo '0' >a
+ $ hg add a
+ $ hg ci -u test -d '0 0' -m '0'
+ $ echo '1' >a
+ $ hg ci -u test -d '1 0' -m '1'
+
+branch 2-3
+
+ $ echo '2' >b
+ $ hg add b
+ $ hg ci -u test -d '2 0' -m '2'
+ $ echo '3' >b
+ $ hg ci -u test -d '3 0' -m '3'
+
+branch 4-8
+
+ $ hg up -r 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo '4' >c
+ $ hg add c
+ $ hg ci -u test -d '4 0' -m '4'
+ created new head
+ $ echo '5' >c
+ $ hg ci -u test -d '5 0' -m '5'
+ $ echo '6' >c
+ $ hg ci -u test -d '6 0' -m '6'
+ $ echo '7' >c
+ $ hg ci -u test -d '7 0' -m '7'
+ $ echo '8' >c
+ $ hg ci -u test -d '8 0' -m '8'
+
+merge
+
+ $ hg merge -r 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -u test -d '9 0' -m '9=8+3'
+
+ $ echo '10' >a
+ $ hg ci -u test -d '10 0' -m '10'
+ $ echo '11' >a
+ $ hg ci -u test -d '11 0' -m '11'
+ $ echo '12' >a
+ $ hg ci -u test -d '12 0' -m '12'
+
+unrelated branch
+
+ $ hg up -r 3
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo '13' >d
+ $ hg add d
+ $ hg ci -u test -d '13 0' -m '13'
+ created new head
+ $ echo '14' >d
+ $ hg ci -u test -d '14 0' -m '14'
+
+mark changesets
+
+ $ hg bisect --reset
+ $ hg bisect --good 4
+ $ hg bisect --good 6
+ $ hg bisect --bad 12
+ Testing changeset 9:2197c557e14c (6 changesets remaining, ~2 tests)
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect --bad 10
+ Testing changeset 8:e74a86251f58 (4 changesets remaining, ~2 tests)
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bisect --skip 7
+ Testing changeset 8:e74a86251f58 (4 changesets remaining, ~2 tests)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test template
+
+ $ hg log --template '{rev}:{node|short} {bisect}\n'
+ 14:cbf2f3105bbf
+ 13:e07efca37c43
+ 12:98c6b56349c0 bad
+ 11:03f491376e63 bad (implicit)
+ 10:c012b15e2409 bad
+ 9:2197c557e14c untested
+ 8:e74a86251f58 untested
+ 7:a5f87041c899 skipped
+ 6:7d997bedcd8d good
+ 5:2dd1875f1028 good (implicit)
+ 4:2a1daef14cd4 good
+ 3:8417d459b90c ignored
+ 2:e1355ee1f23e ignored
+ 1:ce7c85e06a9f good (implicit)
+ 0:b4e73ffab476 good (implicit)
+ $ hg log --template '{bisect|shortbisect} {rev}:{node|short}\n'
+ 14:cbf2f3105bbf
+ 13:e07efca37c43
+ B 12:98c6b56349c0
+ B 11:03f491376e63
+ B 10:c012b15e2409
+ U 9:2197c557e14c
+ U 8:e74a86251f58
+ S 7:a5f87041c899
+ G 6:7d997bedcd8d
+ G 5:2dd1875f1028
+ G 4:2a1daef14cd4
+ I 3:8417d459b90c
+ I 2:e1355ee1f23e
+ G 1:ce7c85e06a9f
+ G 0:b4e73ffab476
+
+test style
+
+ $ hg log --style bisect
+ changeset: 14:cbf2f3105bbf
+ bisect:
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:14 1970 +0000
+ summary: 14
+
+ changeset: 13:e07efca37c43
+ bisect:
+ parent: 3:8417d459b90c
+ user: test
+ date: Thu Jan 01 00:00:13 1970 +0000
+ summary: 13
+
+ changeset: 12:98c6b56349c0
+ bisect: bad
+ user: test
+ date: Thu Jan 01 00:00:12 1970 +0000
+ summary: 12
+
+ changeset: 11:03f491376e63
+ bisect: bad (implicit)
+ user: test
+ date: Thu Jan 01 00:00:11 1970 +0000
+ summary: 11
+
+ changeset: 10:c012b15e2409
+ bisect: bad
+ user: test
+ date: Thu Jan 01 00:00:10 1970 +0000
+ summary: 10
+
+ changeset: 9:2197c557e14c
+ bisect: untested
+ parent: 8:e74a86251f58
+ parent: 3:8417d459b90c
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: 9=8+3
+
+ changeset: 8:e74a86251f58
+ bisect: untested
+ user: test
+ date: Thu Jan 01 00:00:08 1970 +0000
+ summary: 8
+
+ changeset: 7:a5f87041c899
+ bisect: skipped
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: 7
+
+ changeset: 6:7d997bedcd8d
+ bisect: good
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: 6
+
+ changeset: 5:2dd1875f1028
+ bisect: good (implicit)
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: 5
+
+ changeset: 4:2a1daef14cd4
+ bisect: good
+ parent: 1:ce7c85e06a9f
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: 4
+
+ changeset: 3:8417d459b90c
+ bisect: ignored
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: 3
+
+ changeset: 2:e1355ee1f23e
+ bisect: ignored
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+ changeset: 1:ce7c85e06a9f
+ bisect: good (implicit)
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: 1
+
+ changeset: 0:b4e73ffab476
+ bisect: good (implicit)
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ $ hg log --quiet --style bisect
+ 14:cbf2f3105bbf
+ 13:e07efca37c43
+ B 12:98c6b56349c0
+ B 11:03f491376e63
+ B 10:c012b15e2409
+ U 9:2197c557e14c
+ U 8:e74a86251f58
+ S 7:a5f87041c899
+ G 6:7d997bedcd8d
+ G 5:2dd1875f1028
+ G 4:2a1daef14cd4
+ I 3:8417d459b90c
+ I 2:e1355ee1f23e
+ G 1:ce7c85e06a9f
+ G 0:b4e73ffab476
diff --git a/tests/test-bookmarks-current.t b/tests/test-bookmarks-current.t
new file mode 100644
index 0000000..cc31c3e
--- /dev/null
+++ b/tests/test-bookmarks-current.t
@@ -0,0 +1,170 @@
+ $ hg init
+
+no bookmarks
+
+ $ hg bookmarks
+ no bookmarks set
+
+set bookmark X
+
+ $ hg bookmark X
+
+list bookmarks
+
+ $ hg bookmark
+ * X -1:000000000000
+
+list bookmarks with color
+
+ $ hg --config extensions.color= --config color.mode=ansi \
+ > bookmark --color=always
+ \x1b[0;32m * X -1:000000000000\x1b[0m (esc)
+
+update to bookmark X
+
+ $ hg update X
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+list bookmarks
+
+ $ hg bookmarks
+ * X -1:000000000000
+
+rename
+
+ $ hg bookmark -m X Z
+
+list bookmarks
+
+ $ cat .hg/bookmarks.current
+ Z (no-eol)
+ $ cat .hg/bookmarks
+ 0000000000000000000000000000000000000000 Z
+ $ hg bookmarks
+ * Z -1:000000000000
+
+new bookmark Y
+
+ $ hg bookmark Y
+
+list bookmarks
+
+ $ hg bookmark
+ * Y -1:000000000000
+ Z -1:000000000000
+
+commit
+
+ $ echo 'b' > b
+ $ hg add b
+ $ hg commit -m'test'
+
+list bookmarks
+
+ $ hg bookmark
+ * Y 0:719295282060
+ Z -1:000000000000
+
+Verify that switching to Z updates the current bookmark:
+ $ hg update Z
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bookmark
+ Y 0:719295282060
+ * Z -1:000000000000
+
+Switch back to Y for the remaining tests in this file:
+ $ hg update Y
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+delete bookmarks
+
+ $ hg bookmark -d Y
+ $ hg bookmark -d Z
+
+list bookmarks
+
+ $ hg bookmark
+ no bookmarks set
+
+update to tip
+
+ $ hg update tip
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+set bookmark Y using -r .
+
+ $ hg bookmark -r . Y
+
+list bookmarks
+
+ $ hg bookmark
+ * Y 0:719295282060
+
+set bookmark Z using -i
+
+ $ hg bookmark -r . -i Z
+ $ hg bookmarks
+ * Y 0:719295282060
+ Z 0:719295282060
+
+deactivate current bookmark using -i
+
+ $ hg bookmark -i Y
+ $ hg bookmarks
+ Y 0:719295282060
+ Z 0:719295282060
+
+ $ hg up -q Y
+ $ hg bookmarks
+ * Y 0:719295282060
+ Z 0:719295282060
+
+deactivate current bookmark while renaming
+
+ $ hg bookmark -i -m Y X
+ $ hg bookmarks
+ X 0:719295282060
+ Z 0:719295282060
+
+bare update moves the active bookmark forward
+
+ $ echo a > a
+ $ hg ci -Am1
+ adding a
+ $ hg update X
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bookmarks
+ * X 0:719295282060
+ Z 0:719295282060
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ updating bookmark X
+ $ hg bookmarks
+ * X 1:cc586d725fbe
+ Z 0:719295282060
+
+test deleting .hg/bookmarks.current when explicitly updating
+to a revision
+
+ $ echo a >> b
+ $ hg ci -m.
+ $ hg up -q X
+ $ test -f .hg/bookmarks.current
+
+try to update to it again to make sure we don't
+set and then unset it
+
+ $ hg up -q X
+ $ test -f .hg/bookmarks.current
+
+ $ hg up -q 1
+ $ test -f .hg/bookmarks.current
+ [1]
+
+when a bookmark is active, hg up -r . is
+analogus to hg book -i <active bookmark>
+
+ $ hg up -q X
+ $ hg up -q .
+ $ test -f .hg/bookmarks.current
+ [1]
diff --git a/tests/test-bookmarks-merge.t b/tests/test-bookmarks-merge.t
new file mode 100644
index 0000000..96ed2c9
--- /dev/null
+++ b/tests/test-bookmarks-merge.t
@@ -0,0 +1,93 @@
+# init
+
+ $ hg init
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m'a'
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m'b'
+ $ hg up -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg add c
+ $ hg commit -m'c'
+ created new head
+
+# test merging of diverged bookmarks
+ $ hg bookmark -r 1 "c@diverge"
+ $ hg bookmark -r 1 b
+ $ hg bookmark c
+ $ hg bookmarks
+ b 1:d2ae7f538514
+ * c 2:d36c0562f908
+ c@diverge 1:d2ae7f538514
+ $ hg merge "c@diverge"
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m'merge'
+ $ hg bookmarks
+ b 1:d2ae7f538514
+ * c 3:b8f96cf4688b
+
+ $ hg up -C 3
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo d > d
+ $ hg add d
+ $ hg commit -m'd'
+
+ $ hg up -C 3
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo e > e
+ $ hg add e
+ $ hg commit -m'e'
+ created new head
+ $ hg up -C 5
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bookmark e
+ $ hg bookmarks
+ b 1:d2ae7f538514
+ c 3:b8f96cf4688b
+ * e 5:26bee9c5bcf3
+
+# the picked side is bookmarked
+
+ $ hg up -C 4
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge
+ abort: heads are bookmarked - please merge with an explicit rev
+ (run 'hg heads' to see all heads)
+ [255]
+
+# our revision is bookmarked
+
+ $ hg up -C e
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge
+ abort: no matching bookmark to merge - please merge with an explicit rev or bookmark
+ (run 'hg heads' to see all heads)
+ [255]
+
+# merge bookmark heads
+
+ $ hg up -C 4
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo f > f
+ $ hg commit -Am "f"
+ adding f
+ $ hg up -C e
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg bookmarks -r 4 "e@diverged"
+ $ hg bookmarks
+ b 1:d2ae7f538514
+ c 3:b8f96cf4688b
+ * e 5:26bee9c5bcf3
+ e@diverged 4:a0546fcfe0fb
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m'merge'
+ $ hg bookmarks
+ b 1:d2ae7f538514
+ c 3:b8f96cf4688b
+ * e 7:ca784329f0ba
diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t
new file mode 100644
index 0000000..b62ca47
--- /dev/null
+++ b/tests/test-bookmarks-pushpull.t
@@ -0,0 +1,298 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+initialize
+
+ $ hg init a
+ $ cd a
+ $ echo 'test' > test
+ $ hg commit -Am'test'
+ adding test
+
+set bookmarks
+
+ $ hg bookmark X
+ $ hg bookmark Y
+ $ hg bookmark Z
+
+import bookmark by name
+
+ $ hg init ../b
+ $ cd ../b
+ $ hg book Y
+ $ hg book
+ * Y -1:000000000000
+ $ hg pull ../a
+ pulling from ../a
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating bookmark Y
+ adding remote bookmark X
+ adding remote bookmark Z
+ (run 'hg update' to get a working copy)
+ $ hg bookmarks
+ X 0:4e3505fd9583
+ Y 0:4e3505fd9583
+ Z 0:4e3505fd9583
+ $ hg debugpushkey ../a namespaces
+ bookmarks
+ phases
+ namespaces
+ $ hg debugpushkey ../a bookmarks
+ Y 4e3505fd95835d721066b76e75dbb8cc554d7f77
+ X 4e3505fd95835d721066b76e75dbb8cc554d7f77
+ Z 4e3505fd95835d721066b76e75dbb8cc554d7f77
+ $ hg pull -B X ../a
+ pulling from ../a
+ no changes found
+ importing bookmark X
+ $ hg bookmark
+ X 0:4e3505fd9583
+ Y 0:4e3505fd9583
+ Z 0:4e3505fd9583
+
+export bookmark by name
+
+ $ hg bookmark W
+ $ hg bookmark foo
+ $ hg bookmark foobar
+ $ hg push -B W ../a
+ pushing to ../a
+ searching for changes
+ no changes found
+ exporting bookmark W
+ [1]
+ $ hg -R ../a bookmarks
+ W -1:000000000000
+ X 0:4e3505fd9583
+ Y 0:4e3505fd9583
+ * Z 0:4e3505fd9583
+
+delete a remote bookmark
+
+ $ hg book -d W
+ $ hg push -B W ../a
+ pushing to ../a
+ searching for changes
+ no changes found
+ deleting remote bookmark W
+ [1]
+
+push/pull name that doesn't exist
+
+ $ hg push -B badname ../a
+ pushing to ../a
+ searching for changes
+ no changes found
+ bookmark badname does not exist on the local or remote repository!
+ [2]
+ $ hg pull -B anotherbadname ../a
+ pulling from ../a
+ abort: remote bookmark anotherbadname not found!
+ [255]
+
+divergent bookmarks
+
+ $ cd ../a
+ $ echo c1 > f1
+ $ hg ci -Am1
+ adding f1
+ $ hg book -f X
+ $ hg book
+ * X 1:0d2164f0ce0d
+ Y 0:4e3505fd9583
+ Z 1:0d2164f0ce0d
+
+ $ cd ../b
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ updating bookmark foobar
+ $ echo c2 > f2
+ $ hg ci -Am2
+ adding f2
+ $ hg book -f X
+ $ hg book
+ * X 1:9b140be10808
+ Y 0:4e3505fd9583
+ Z 0:4e3505fd9583
+ foo -1:000000000000
+ foobar 1:9b140be10808
+
+ $ hg pull --config paths.foo=../a foo
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ divergent bookmark X stored as X@foo
+ updating bookmark Z
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg book
+ * X 1:9b140be10808
+ X@foo 2:0d2164f0ce0d
+ Y 0:4e3505fd9583
+ Z 2:0d2164f0ce0d
+ foo -1:000000000000
+ foobar 1:9b140be10808
+ $ hg push -f ../a
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ $ hg -R ../a book
+ * X 1:0d2164f0ce0d
+ Y 0:4e3505fd9583
+ Z 1:0d2164f0ce0d
+
+update a remote bookmark from a non-head to a head
+
+ $ hg up -q Y
+ $ echo c3 > f2
+ $ hg ci -Am3
+ adding f2
+ created new head
+ $ hg push ../a
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ updating bookmark Y
+ $ hg -R ../a book
+ * X 1:0d2164f0ce0d
+ Y 3:f6fc62dde3c0
+ Z 1:0d2164f0ce0d
+
+diverging a remote bookmark fails
+
+ $ hg up -q 4e3505fd9583
+ $ echo c4 > f2
+ $ hg ci -Am4
+ adding f2
+ created new head
+ $ hg book -f Y
+
+ $ cat <<EOF > ../a/.hg/hgrc
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > EOF
+
+ $ hg -R ../a serve -p $HGPORT2 -d --pid-file=../hg2.pid
+ $ cat ../hg2.pid >> $DAEMON_PIDS
+
+ $ hg push http://localhost:$HGPORT2/
+ pushing to http://localhost:$HGPORT2/
+ searching for changes
+ abort: push creates new remote head 4efff6d98829!
+ (did you forget to merge? use push -f to force)
+ [255]
+ $ hg -R ../a book
+ * X 1:0d2164f0ce0d
+ Y 3:f6fc62dde3c0
+ Z 1:0d2164f0ce0d
+
+hgweb
+
+ $ cat <<EOF > .hg/hgrc
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > EOF
+
+ $ hg serve -p $HGPORT -d --pid-file=../hg.pid -E errors.log
+ $ cat ../hg.pid >> $DAEMON_PIDS
+ $ cd ../a
+
+ $ hg debugpushkey http://localhost:$HGPORT/ namespaces
+ bookmarks
+ phases
+ namespaces
+ $ hg debugpushkey http://localhost:$HGPORT/ bookmarks
+ Y 4efff6d98829d9c824c621afd6e3f01865f5439f
+ foobar 9b140be1080824d768c5a4691a564088eede71f9
+ Z 0d2164f0ce0d8f1d6f94351eba04b794909be66c
+ foo 0000000000000000000000000000000000000000
+ X 9b140be1080824d768c5a4691a564088eede71f9
+ $ hg out -B http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ searching for changed bookmarks
+ no changed bookmarks found
+ [1]
+ $ hg push -B Z http://localhost:$HGPORT/
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ exporting bookmark Z
+ [1]
+ $ hg book -d Z
+ $ hg in -B http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ searching for changed bookmarks
+ Z 0d2164f0ce0d
+ foo 000000000000
+ foobar 9b140be10808
+ $ hg pull -B Z http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ no changes found
+ adding remote bookmark foobar
+ adding remote bookmark Z
+ adding remote bookmark foo
+ divergent bookmark X stored as X@1
+ importing bookmark Z
+ $ hg clone http://localhost:$HGPORT/ cloned-bookmarks
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 3 files (+3 heads)
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R cloned-bookmarks bookmarks
+ X 1:9b140be10808
+ Y 4:4efff6d98829
+ Z 2:0d2164f0ce0d
+ foo -1:000000000000
+ foobar 1:9b140be10808
+
+ $ cd ..
+
+Pushing a bookmark should only push the changes required by that
+bookmark, not all outgoing changes:
+ $ hg clone http://localhost:$HGPORT/ addmarks
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 3 files (+3 heads)
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd addmarks
+ $ echo foo > foo
+ $ hg add foo
+ $ hg commit -m 'add foo'
+ $ echo bar > bar
+ $ hg add bar
+ $ hg commit -m 'add bar'
+ $ hg co "tip^"
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg book add-foo
+ $ hg book -r tip add-bar
+Note: this push *must* push only a single changeset, as that's the point
+of this test.
+ $ hg push -B add-foo
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ exporting bookmark add-foo
+
+ $ cd ..
diff --git a/tests/test-bookmarks-rebase.t b/tests/test-bookmarks-rebase.t
new file mode 100644
index 0000000..1b89620
--- /dev/null
+++ b/tests/test-bookmarks-rebase.t
@@ -0,0 +1,66 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "rebase=" >> $HGRCPATH
+
+initialize repository
+
+ $ hg init
+
+ $ echo 'a' > a
+ $ hg ci -A -m "0"
+ adding a
+
+ $ echo 'b' > b
+ $ hg ci -A -m "1"
+ adding b
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'c' > c
+ $ hg ci -A -m "2"
+ adding c
+ created new head
+
+ $ echo 'd' > d
+ $ hg ci -A -m "3"
+ adding d
+
+ $ hg bookmark -r 1 one
+ $ hg bookmark -r 3 two
+
+bookmark list
+
+ $ hg bookmark
+ one 1:925d80f479bb
+ * two 3:2ae46b1d99a7
+
+rebase
+
+ $ hg rebase -s two -d one
+ saved backup bundle to $TESTTMP/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg log
+ changeset: 3:42e5ed2cdcf4
+ bookmark: two
+ tag: tip
+ parent: 1:925d80f479bb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 2:db815d6d32e6
+ parent: 0:f7b1eb17ad24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 1:925d80f479bb
+ bookmark: one
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 0:f7b1eb17ad24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
diff --git a/tests/test-bookmarks-strip.t b/tests/test-bookmarks-strip.t
new file mode 100644
index 0000000..3c46d76
--- /dev/null
+++ b/tests/test-bookmarks-strip.t
@@ -0,0 +1,116 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init
+
+ $ echo qqq>qqq.txt
+
+rollback dry run without rollback information
+
+ $ hg rollback
+ no rollback information available
+ [1]
+
+add file
+
+ $ hg add
+ adding qqq.txt
+
+commit first revision
+
+ $ hg ci -m 1
+
+set bookmark
+
+ $ hg book test
+
+ $ echo www>>qqq.txt
+
+commit second revision
+
+ $ hg ci -m 2
+
+set bookmark
+
+ $ hg book test2
+
+update to -2 (inactives the active bookmark)
+
+ $ hg update -r -2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo eee>>qqq.txt
+
+commit new head
+
+ $ hg ci -m 3
+ created new head
+
+bookmarks updated?
+
+ $ hg book
+ test 1:25e1ee7a0081
+ test2 1:25e1ee7a0081
+
+strip to revision 1
+
+ $ hg strip 1
+ saved backup bundle to $TESTTMP/.hg/strip-backup/*-backup.hg (glob)
+
+list bookmarks
+
+ $ hg book
+ test 0:5c9ad3787638
+ test2 0:5c9ad3787638
+
+immediate rollback and reentrancy issue
+
+ $ echo "mq=!" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+ $ hg bookmarks markb
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo commit)
+ working directory now based on revision 0
+
+are you there?
+
+ $ hg bookmarks
+ no bookmarks set
+
+can we commit? (issue2692)
+
+ $ echo c > c
+ $ hg ci -Am rockon
+ adding c
+
+can you be added again?
+
+ $ hg bookmarks markb
+ $ hg bookmarks
+ * markb 1:fdb34407462c
+
+rollback dry run with rollback information
+
+ $ hg rollback -n
+ repository tip rolled back to revision 0 (undo commit)
+ $ hg bookmarks
+ * markb 1:fdb34407462c
+
+rollback dry run with rollback information and no commit undo
+
+ $ rm .hg/store/undo
+ $ hg rollback -n
+ no rollback information available
+ [1]
+ $ hg bookmarks
+ * markb 1:fdb34407462c
+
+ $ cd ..
+
diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
new file mode 100644
index 0000000..8b8d062
--- /dev/null
+++ b/tests/test-bookmarks.t
@@ -0,0 +1,459 @@
+ $ hg init
+
+no bookmarks
+
+ $ hg bookmarks
+ no bookmarks set
+
+bookmark rev -1
+
+ $ hg bookmark X
+
+list bookmarks
+
+ $ hg bookmarks
+ * X -1:000000000000
+
+list bookmarks with color
+
+ $ hg --config extensions.color= --config color.mode=ansi \
+ > bookmarks --color=always
+ \x1b[0;32m * X -1:000000000000\x1b[0m (esc)
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m 0
+
+bookmark X moved to rev 0
+
+ $ hg bookmarks
+ * X 0:f7b1eb17ad24
+
+look up bookmark
+
+ $ hg log -r X
+ changeset: 0:f7b1eb17ad24
+ bookmark: X
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+
+second bookmark for rev 0
+
+ $ hg bookmark X2
+
+bookmark rev -1 again
+
+ $ hg bookmark -r null Y
+
+list bookmarks
+
+ $ hg bookmarks
+ X 0:f7b1eb17ad24
+ * X2 0:f7b1eb17ad24
+ Y -1:000000000000
+
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m 1
+
+bookmarks revset
+
+ $ hg log -r 'bookmark()'
+ changeset: 0:f7b1eb17ad24
+ bookmark: X
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:925d80f479bb
+ bookmark: X2
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg log -r 'bookmark(Y)'
+ $ hg log -r 'bookmark(X2)'
+ changeset: 1:925d80f479bb
+ bookmark: X2
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg log -r 'bookmark("re:X")'
+ changeset: 0:f7b1eb17ad24
+ bookmark: X
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:925d80f479bb
+ bookmark: X2
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg log -r 'bookmark(unknown)'
+ abort: bookmark 'unknown' does not exist
+ [255]
+
+ $ hg help revsets | grep 'bookmark('
+ "bookmark([name])"
+
+bookmarks X and X2 moved to rev 1, Y at rev -1
+
+ $ hg bookmarks
+ X 0:f7b1eb17ad24
+ * X2 1:925d80f479bb
+ Y -1:000000000000
+
+bookmark rev 0 again
+
+ $ hg bookmark -r 0 Z
+
+ $ hg update X
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg add c
+ $ hg commit -m 2
+ created new head
+
+bookmarks X moved to rev 2, Y at rev -1, Z at rev 0
+
+ $ hg bookmarks
+ * X 2:db815d6d32e6
+ X2 1:925d80f479bb
+ Y -1:000000000000
+ Z 0:f7b1eb17ad24
+
+rename nonexistent bookmark
+
+ $ hg bookmark -m A B
+ abort: bookmark 'A' does not exist
+ [255]
+
+rename to existent bookmark
+
+ $ hg bookmark -m X Y
+ abort: bookmark 'Y' already exists (use -f to force)
+ [255]
+
+force rename to existent bookmark
+
+ $ hg bookmark -f -m X Y
+
+list bookmarks
+
+ $ hg bookmark
+ X2 1:925d80f479bb
+ * Y 2:db815d6d32e6
+ Z 0:f7b1eb17ad24
+
+rename without new name
+
+ $ hg bookmark -m Y
+ abort: new bookmark name required
+ [255]
+
+delete without name
+
+ $ hg bookmark -d
+ abort: bookmark name required
+ [255]
+
+delete nonexistent bookmark
+
+ $ hg bookmark -d A
+ abort: bookmark 'A' does not exist
+ [255]
+
+bookmark name with spaces should be stripped
+
+ $ hg bookmark ' x y '
+
+list bookmarks
+
+ $ hg bookmarks
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ Z 0:f7b1eb17ad24
+ * x y 2:db815d6d32e6
+
+look up stripped bookmark name
+
+ $ hg log -r '"x y"'
+ changeset: 2:db815d6d32e6
+ bookmark: Y
+ bookmark: x y
+ tag: tip
+ parent: 0:f7b1eb17ad24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+
+reject bookmark name with newline
+
+ $ hg bookmark '
+ > '
+ abort: bookmark name cannot contain newlines
+ [255]
+
+bookmark with existing name
+
+ $ hg bookmark Z
+ abort: bookmark 'Z' already exists (use -f to force)
+ [255]
+
+force bookmark with existing name
+
+ $ hg bookmark -f Z
+
+list bookmarks
+
+ $ hg bookmark
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 2:db815d6d32e6
+ x y 2:db815d6d32e6
+
+revision but no bookmark name
+
+ $ hg bookmark -r .
+ abort: bookmark name required
+ [255]
+
+bookmark name with whitespace only
+
+ $ hg bookmark ' '
+ abort: bookmark names cannot consist entirely of whitespace
+ [255]
+
+invalid bookmark
+
+ $ hg bookmark 'foo:bar'
+ abort: bookmark 'foo:bar' contains illegal character
+ [255]
+
+the bookmark extension should be ignored now that it is part of core
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "bookmarks=" >> $HGRCPATH
+ $ hg bookmarks
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 2:db815d6d32e6
+ x y 2:db815d6d32e6
+
+test summary
+
+ $ hg summary
+ parent: 2:db815d6d32e6 tip
+ 2
+ branch: default
+ bookmarks: *Z Y x y
+ commit: (clean)
+ update: 1 new changesets, 2 branch heads (merge)
+
+test id
+
+ $ hg id
+ db815d6d32e6 tip Y/Z/x y
+
+test rollback
+
+ $ echo foo > f1
+ $ hg ci -Amr
+ adding f1
+ $ hg bookmark -f Y -r 1
+ $ hg bookmark -f Z -r 1
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+ $ hg bookmarks
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 2:db815d6d32e6
+ x y 2:db815d6d32e6
+
+test clone
+
+ $ hg bookmark -r 2 -i @
+ $ hg bookmark -r 2 -i a@
+ $ hg bookmarks
+ @ 2:db815d6d32e6
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 2:db815d6d32e6
+ a@ 2:db815d6d32e6
+ x y 2:db815d6d32e6
+ $ hg clone . cloned-bookmarks
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R cloned-bookmarks bookmarks
+ @ 2:db815d6d32e6
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ Z 2:db815d6d32e6
+ a@ 2:db815d6d32e6
+ x y 2:db815d6d32e6
+
+test clone with pull protocol
+
+ $ hg clone --pull . cloned-bookmarks-pull
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+1 heads)
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R cloned-bookmarks-pull bookmarks
+ @ 2:db815d6d32e6
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ Z 2:db815d6d32e6
+ a@ 2:db815d6d32e6
+ x y 2:db815d6d32e6
+
+ $ hg bookmark -d @
+ $ hg bookmark -d a@
+
+test clone with a specific revision
+
+ $ hg clone -r 925d80 . cloned-bookmarks-rev
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R cloned-bookmarks-rev bookmarks
+ X2 1:925d80f479bb
+
+create bundle with two heads
+
+ $ hg clone . tobundle
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo x > tobundle/x
+ $ hg -R tobundle add tobundle/x
+ $ hg -R tobundle commit -m'x'
+ $ hg -R tobundle update -r -2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo y > tobundle/y
+ $ hg -R tobundle branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg -R tobundle add tobundle/y
+ $ hg -R tobundle commit -m'y'
+ $ hg -R tobundle bundle tobundle.hg
+ searching for changes
+ 2 changesets found
+ $ hg unbundle tobundle.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg bookmarks
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 3:125c9a1d6df6
+ x y 2:db815d6d32e6
+
+test wrongly formated bookmark
+
+ $ echo '' >> .hg/bookmarks
+ $ hg bookmarks
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 3:125c9a1d6df6
+ x y 2:db815d6d32e6
+ $ echo "Ican'thasformatedlines" >> .hg/bookmarks
+ $ hg bookmarks
+ malformed line in .hg/bookmarks: "Ican'thasformatedlines"
+ X2 1:925d80f479bb
+ Y 2:db815d6d32e6
+ * Z 3:125c9a1d6df6
+ x y 2:db815d6d32e6
+
+test missing revisions
+
+ $ echo "925d80f479bc z" > .hg/bookmarks
+ $ hg book
+ no bookmarks set
+
+test stripping a non-checked-out but bookmarked revision
+
+ $ hg --config extensions.graphlog= log --graph
+ o changeset: 4:9ba5f110a0b3
+ | branch: test
+ | tag: tip
+ | parent: 2:db815d6d32e6
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: y
+ |
+ | @ changeset: 3:125c9a1d6df6
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: x
+ |
+ o changeset: 2:db815d6d32e6
+ | parent: 0:f7b1eb17ad24
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: 2
+ |
+ | o changeset: 1:925d80f479bb
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: 1
+ |
+ o changeset: 0:f7b1eb17ad24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ $ hg book should-end-on-two
+ $ hg co --clean 4
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg book four
+ $ hg --config extensions.mq= strip 3
+ saved backup bundle to * (glob)
+should-end-on-two should end up pointing to revision 2, as that's the
+tipmost surviving ancestor of the stripped revision.
+ $ hg --config extensions.graphlog= log --graph
+ @ changeset: 3:9ba5f110a0b3
+ | branch: test
+ | bookmark: four
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: y
+ |
+ o changeset: 2:db815d6d32e6
+ | bookmark: should-end-on-two
+ | parent: 0:f7b1eb17ad24
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: 2
+ |
+ | o changeset: 1:925d80f479bb
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: 1
+ |
+ o changeset: 0:f7b1eb17ad24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
diff --git a/tests/test-branch-option.t b/tests/test-branch-option.t
new file mode 100644
index 0000000..fa81c33
--- /dev/null
+++ b/tests/test-branch-option.t
@@ -0,0 +1,132 @@
+test branch selection options
+
+ $ hg init branch
+ $ cd branch
+ $ hg branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a > foo
+ $ hg ci -d '0 0' -Ama
+ adding foo
+ $ echo a2 > foo
+ $ hg ci -d '0 0' -ma2
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch c
+ marked working directory as branch c
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo c > foo
+ $ hg ci -d '0 0' -mc
+ $ hg tag -l z
+ $ cd ..
+ $ hg clone -r 0 branch branch2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd branch2
+ $ hg up 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > foo
+ $ hg ci -d '0 0' -mb
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --encoding utf-8 branch æ
+ marked working directory as branch \xc3\xa6 (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo ae1 > foo
+ $ hg ci -d '0 0' -mae1
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --encoding utf-8 branch -f æ
+ marked working directory as branch \xc3\xa6 (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo ae2 > foo
+ $ hg ci -d '0 0' -mae2
+ created new head
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch -f b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b2 > foo
+ $ hg ci -d '0 0' -mb2
+ created new head
+
+unknown branch and fallback
+
+ $ hg in -qbz
+ abort: unknown branch 'z'!
+ [255]
+ $ hg in -q ../branch#z
+ 2:f25d57ab0566
+ $ hg out -qbz
+ abort: unknown branch 'z'!
+ [255]
+
+in rev c branch a
+
+ $ hg in -qr c ../branch#a
+ 1:dd6e60a716c6
+ 2:f25d57ab0566
+ $ hg in -qr c -b a
+ 1:dd6e60a716c6
+ 2:f25d57ab0566
+
+out branch .
+
+ $ hg out -q ../branch#.
+ 1:b84708d77ab7
+ 4:65511d0e2b55
+ $ hg out -q -b .
+ 1:b84708d77ab7
+ 4:65511d0e2b55
+
+out branch . non-ascii
+
+ $ hg --encoding utf-8 up æ
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --encoding latin1 out -q ../branch#.
+ 2:df5a44224d4e
+ 3:4f4a5125ca10
+ $ hg --encoding latin1 out -q -b .
+ 2:df5a44224d4e
+ 3:4f4a5125ca10
+
+clone branch b
+
+ $ cd ..
+ $ hg clone branch2#b branch3
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files (+1 heads)
+ updating to branch b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -q -R branch3 heads b
+ 2:65511d0e2b55
+ 1:b84708d77ab7
+ $ hg -q -R branch3 parents
+ 2:65511d0e2b55
+ $ rm -rf branch3
+
+clone rev a branch b
+
+ $ hg clone -r a branch2#b branch3
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files (+1 heads)
+ updating to branch a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -q -R branch3 heads b
+ 2:65511d0e2b55
+ 1:b84708d77ab7
+ $ hg -q -R branch3 parents
+ 0:5b65ba7c951d
+ $ rm -rf branch3
diff --git a/tests/test-branch-tag-confict.t b/tests/test-branch-tag-confict.t
new file mode 100644
index 0000000..0bb6ffa
--- /dev/null
+++ b/tests/test-branch-tag-confict.t
@@ -0,0 +1,65 @@
+Initial setup.
+
+ $ hg init repo
+ $ cd repo
+ $ touch thefile
+ $ hg ci -A -m 'Initial commit.'
+ adding thefile
+
+Create a tag.
+
+ $ hg tag branchortag
+
+Create a branch with the same name as the tag.
+
+ $ hg branch branchortag
+ marked working directory as branch branchortag
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'Create a branch with the same name as a tag.'
+
+This is what we have:
+
+ $ hg log
+ changeset: 2:10519b3f489a
+ branch: branchortag
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Create a branch with the same name as a tag.
+
+ changeset: 1:2635c45ca99b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag branchortag for changeset f57387372b5d
+
+ changeset: 0:f57387372b5d
+ tag: branchortag
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Initial commit.
+
+Update to the tag:
+
+ $ hg up 'tag(branchortag)'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 0:f57387372b5d
+ tag: branchortag
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Initial commit.
+
+Updating to the branch:
+
+ $ hg up 'branch(branchortag)'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 2:10519b3f489a
+ branch: branchortag
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Create a branch with the same name as a tag.
+
+
+ $ cd ..
diff --git a/tests/test-branches.t b/tests/test-branches.t
new file mode 100644
index 0000000..29d9c13
--- /dev/null
+++ b/tests/test-branches.t
@@ -0,0 +1,412 @@
+ $ hg init a
+ $ cd a
+ $ echo 'root' >root
+ $ hg add root
+ $ hg commit -d '0 0' -m "Adding root node"
+
+ $ echo 'a' >a
+ $ hg add a
+ $ hg branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -d '1 0' -m "Adding a branch"
+
+ $ hg branch q
+ marked working directory as branch q
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 'aa' >a
+ $ hg branch -C
+ reset working directory to branch a
+ $ hg commit -d '2 0' -m "Adding to a branch"
+
+ $ hg update -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'b' >b
+ $ hg add b
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -d '2 0' -m "Adding b branch"
+
+ $ echo 'bh1' >bh1
+ $ hg add bh1
+ $ hg commit -d '3 0' -m "Adding b branch head 1"
+
+ $ hg update -C 2
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo 'bh2' >bh2
+ $ hg add bh2
+ $ hg commit -d '4 0' -m "Adding b branch head 2"
+
+ $ echo 'c' >c
+ $ hg add c
+ $ hg branch c
+ marked working directory as branch c
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -d '5 0' -m "Adding c branch"
+
+ $ hg branch tip
+ abort: the name 'tip' is reserved
+ [255]
+ $ hg branch null
+ abort: the name 'null' is reserved
+ [255]
+ $ hg branch .
+ abort: the name '.' is reserved
+ [255]
+
+ $ echo 'd' >d
+ $ hg add d
+ $ hg branch 'a branch name much longer than the default justification used by branches'
+ marked working directory as branch a branch name much longer than the default justification used by branches
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -d '6 0' -m "Adding d branch"
+
+ $ hg branches
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ b 4:aee39cd168d0
+ c 6:589736a22561 (inactive)
+ a 5:d8cbc61dbaa6 (inactive)
+ default 0:19709c5a4e75 (inactive)
+
+-------
+
+ $ hg branches -a
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ b 4:aee39cd168d0
+
+--- Branch a
+
+ $ hg log -b a
+ changeset: 5:d8cbc61dbaa6
+ branch: a
+ parent: 2:881fe2b92ad0
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: Adding b branch head 2
+
+ changeset: 2:881fe2b92ad0
+ branch: a
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: Adding to a branch
+
+ changeset: 1:dd6b440dd85a
+ branch: a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: Adding a branch
+
+
+---- Branch b
+
+ $ hg log -b b
+ changeset: 4:aee39cd168d0
+ branch: b
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: Adding b branch head 1
+
+ changeset: 3:ac22033332d1
+ branch: b
+ parent: 0:19709c5a4e75
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: Adding b branch
+
+
+---- going to test branch closing
+
+ $ hg branches
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ b 4:aee39cd168d0
+ c 6:589736a22561 (inactive)
+ a 5:d8cbc61dbaa6 (inactive)
+ default 0:19709c5a4e75 (inactive)
+ $ hg up -C b
+ 2 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ $ echo 'xxx1' >> b
+ $ hg commit -d '7 0' -m 'adding cset to branch b'
+ $ hg up -C aee39cd168d0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 'xxx2' >> b
+ $ hg commit -d '8 0' -m 'adding head to branch b'
+ created new head
+ $ echo 'xxx3' >> b
+ $ hg commit -d '9 0' -m 'adding another cset to branch b'
+ $ hg branches
+ b 10:bfbe841b666e
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ c 6:589736a22561 (inactive)
+ a 5:d8cbc61dbaa6 (inactive)
+ default 0:19709c5a4e75 (inactive)
+ $ hg heads --closed
+ changeset: 10:bfbe841b666e
+ branch: b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: adding another cset to branch b
+
+ changeset: 8:eebb944467c9
+ branch: b
+ parent: 4:aee39cd168d0
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: adding cset to branch b
+
+ changeset: 7:10ff5895aa57
+ branch: a branch name much longer than the default justification used by branches
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: Adding d branch
+
+ changeset: 6:589736a22561
+ branch: c
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: Adding c branch
+
+ changeset: 5:d8cbc61dbaa6
+ branch: a
+ parent: 2:881fe2b92ad0
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: Adding b branch head 2
+
+ changeset: 0:19709c5a4e75
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Adding root node
+
+ $ hg heads
+ changeset: 10:bfbe841b666e
+ branch: b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: adding another cset to branch b
+
+ changeset: 8:eebb944467c9
+ branch: b
+ parent: 4:aee39cd168d0
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: adding cset to branch b
+
+ changeset: 7:10ff5895aa57
+ branch: a branch name much longer than the default justification used by branches
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: Adding d branch
+
+ changeset: 6:589736a22561
+ branch: c
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: Adding c branch
+
+ changeset: 5:d8cbc61dbaa6
+ branch: a
+ parent: 2:881fe2b92ad0
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: Adding b branch head 2
+
+ changeset: 0:19709c5a4e75
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Adding root node
+
+ $ hg commit -d '9 0' --close-branch -m 'prune bad branch'
+ $ hg branches -a
+ b 8:eebb944467c9
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ $ hg up -C b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg commit -d '9 0' --close-branch -m 'close this part branch too'
+
+--- b branch should be inactive
+
+ $ hg branches
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ c 6:589736a22561 (inactive)
+ a 5:d8cbc61dbaa6 (inactive)
+ default 0:19709c5a4e75 (inactive)
+ $ hg branches -c
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ b 12:e3d49c0575d8 (closed)
+ c 6:589736a22561 (inactive)
+ a 5:d8cbc61dbaa6 (inactive)
+ default 0:19709c5a4e75 (inactive)
+ $ hg branches -a
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+ $ hg branches -q
+ a branch name much longer than the default justification used by branches
+ c
+ a
+ default
+ $ hg heads b
+ no open branch heads found on branches b
+ [1]
+ $ hg heads --closed b
+ changeset: 12:e3d49c0575d8
+ branch: b
+ tag: tip
+ parent: 8:eebb944467c9
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: close this part branch too
+
+ changeset: 11:d3f163457ebf
+ branch: b
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: prune bad branch
+
+ $ echo 'xxx4' >> b
+ $ hg commit -d '9 0' -m 'reopen branch with a change'
+ reopening closed branch head 12
+
+--- branch b is back in action
+
+ $ hg branches -a
+ b 13:e23b5505d1ad
+ a branch name much longer than the default justification used by branches 7:10ff5895aa57
+
+---- test heads listings
+
+ $ hg heads
+ changeset: 13:e23b5505d1ad
+ branch: b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: reopen branch with a change
+
+ changeset: 7:10ff5895aa57
+ branch: a branch name much longer than the default justification used by branches
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: Adding d branch
+
+ changeset: 6:589736a22561
+ branch: c
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: Adding c branch
+
+ changeset: 5:d8cbc61dbaa6
+ branch: a
+ parent: 2:881fe2b92ad0
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: Adding b branch head 2
+
+ changeset: 0:19709c5a4e75
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Adding root node
+
+
+branch default
+
+ $ hg heads default
+ changeset: 0:19709c5a4e75
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Adding root node
+
+
+branch a
+
+ $ hg heads a
+ changeset: 5:d8cbc61dbaa6
+ branch: a
+ parent: 2:881fe2b92ad0
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: Adding b branch head 2
+
+ $ hg heads --active a
+ no open branch heads found on branches a
+ [1]
+
+branch b
+
+ $ hg heads b
+ changeset: 13:e23b5505d1ad
+ branch: b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: reopen branch with a change
+
+ $ hg heads --closed b
+ changeset: 13:e23b5505d1ad
+ branch: b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: reopen branch with a change
+
+ changeset: 11:d3f163457ebf
+ branch: b
+ user: test
+ date: Thu Jan 01 00:00:09 1970 +0000
+ summary: prune bad branch
+
+default branch colors:
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "color =" >> $HGRCPATH
+ $ echo "[color]" >> $HGRCPATH
+ $ echo "mode = ansi" >> $HGRCPATH
+
+ $ hg up -C c
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg commit -d '9 0' --close-branch -m 'reclosing this branch'
+ $ hg up -C b
+ 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg branches --color=always
+ \x1b[0;32mb\x1b[0m \x1b[0;33m 13:e23b5505d1ad\x1b[0m (esc)
+ \x1b[0;0ma branch name much longer than the default justification used by branches\x1b[0m \x1b[0;33m7:10ff5895aa57\x1b[0m (esc)
+ \x1b[0;0ma\x1b[0m \x1b[0;33m 5:d8cbc61dbaa6\x1b[0m (inactive) (esc)
+ \x1b[0;0mdefault\x1b[0m \x1b[0;33m 0:19709c5a4e75\x1b[0m (inactive) (esc)
+
+default closed branch color:
+
+ $ hg branches --color=always --closed
+ \x1b[0;32mb\x1b[0m \x1b[0;33m 13:e23b5505d1ad\x1b[0m (esc)
+ \x1b[0;0ma branch name much longer than the default justification used by branches\x1b[0m \x1b[0;33m7:10ff5895aa57\x1b[0m (esc)
+ \x1b[0;30;1mc\x1b[0m \x1b[0;33m 14:f894c25619d3\x1b[0m (closed) (esc)
+ \x1b[0;0ma\x1b[0m \x1b[0;33m 5:d8cbc61dbaa6\x1b[0m (inactive) (esc)
+ \x1b[0;0mdefault\x1b[0m \x1b[0;33m 0:19709c5a4e75\x1b[0m (inactive) (esc)
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "color =" >> $HGRCPATH
+ $ echo "[color]" >> $HGRCPATH
+ $ echo "branches.active = green" >> $HGRCPATH
+ $ echo "branches.closed = blue" >> $HGRCPATH
+ $ echo "branches.current = red" >> $HGRCPATH
+ $ echo "branches.inactive = magenta" >> $HGRCPATH
+ $ echo "log.changeset = cyan" >> $HGRCPATH
+
+custom branch colors:
+
+ $ hg branches --color=always
+ \x1b[0;31mb\x1b[0m \x1b[0;36m 13:e23b5505d1ad\x1b[0m (esc)
+ \x1b[0;32ma branch name much longer than the default justification used by branches\x1b[0m \x1b[0;36m7:10ff5895aa57\x1b[0m (esc)
+ \x1b[0;35ma\x1b[0m \x1b[0;36m 5:d8cbc61dbaa6\x1b[0m (inactive) (esc)
+ \x1b[0;35mdefault\x1b[0m \x1b[0;36m 0:19709c5a4e75\x1b[0m (inactive) (esc)
+
+custom closed branch color:
+
+ $ hg branches --color=always --closed
+ \x1b[0;31mb\x1b[0m \x1b[0;36m 13:e23b5505d1ad\x1b[0m (esc)
+ \x1b[0;32ma branch name much longer than the default justification used by branches\x1b[0m \x1b[0;36m7:10ff5895aa57\x1b[0m (esc)
+ \x1b[0;34mc\x1b[0m \x1b[0;36m 14:f894c25619d3\x1b[0m (closed) (esc)
+ \x1b[0;35ma\x1b[0m \x1b[0;36m 5:d8cbc61dbaa6\x1b[0m (inactive) (esc)
+ \x1b[0;35mdefault\x1b[0m \x1b[0;36m 0:19709c5a4e75\x1b[0m (inactive) (esc)
+
+ $ cd ..
diff --git a/tests/test-bundle-r.t b/tests/test-bundle-r.t
new file mode 100644
index 0000000..ce03f01
--- /dev/null
+++ b/tests/test-bundle-r.t
@@ -0,0 +1,328 @@
+ $ hg init test
+ $ cd test
+ $ hg unbundle "$TESTDIR/bundles/remote.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > mkdir test-"$i"
+ > hg --cwd test-"$i" init
+ > hg -R test bundle -r "$i" test-"$i".hg test-"$i"
+ > cd test-"$i"
+ > hg unbundle ../test-"$i".hg
+ > hg verify
+ > hg tip -q
+ > cd ..
+ > done
+ searching for changes
+ 1 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ 0:bfaf4b5cbf01
+ searching for changes
+ 2 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ 1:21f32785131f
+ searching for changes
+ 3 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ 2:4ce51a113780
+ searching for changes
+ 4 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 4 changesets, 4 total revisions
+ 3:93ee6ab32777
+ searching for changes
+ 2 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ 1:c70afb1ee985
+ searching for changes
+ 3 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ 2:f03ae5a9b979
+ searching for changes
+ 4 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 2 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 4 changesets, 5 total revisions
+ 3:095cb14b1b4d
+ searching for changes
+ 5 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 3 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 6 total revisions
+ 4:faa2e4234c7a
+ searching for changes
+ 5 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 2 files
+ (run 'hg update' to get a working copy)
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+ 4:916f1afdef90
+ $ cd test-8
+ $ hg pull ../test-7
+ pulling from ../test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 2 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ hg rollback
+ repository tip rolled back to revision 4 (undo pull)
+ $ cd ..
+
+should fail
+
+ $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg test-3
+ abort: --base is incompatible with specifying a destination
+ [255]
+ $ hg -R test bundle -r tip test-bundle-branch1.hg
+ abort: repository default-push not found!
+ [255]
+
+ $ hg -R test bundle --base 2 -r tip test-bundle-branch1.hg
+ 2 changesets found
+ $ hg -R test bundle --base 2 -r 7 test-bundle-branch2.hg
+ 4 changesets found
+ $ hg -R test bundle --base 2 test-bundle-all.hg
+ 6 changesets found
+ $ hg -R test bundle --base 3 -r tip test-bundle-should-fail.hg
+ 1 changesets found
+
+empty bundle
+
+ $ hg -R test bundle --base 7 --base 8 test-bundle-empty.hg
+ no changes found
+ [1]
+
+issue76 msg2163
+
+ $ hg -R test bundle --base 3 -r 3 -r 3 test-bundle-cset-3.hg
+ no changes found
+ [1]
+
+Issue1910: 'hg bundle --base $head' does not exclude $head from
+result
+
+ $ hg -R test bundle --base 7 test-bundle-cset-7.hg
+ 4 changesets found
+
+ $ hg clone test-2 test-9
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test-9
+
+revision 2
+
+ $ hg tip -q
+ 2:4ce51a113780
+ $ hg unbundle ../test-bundle-should-fail.hg
+ adding changesets
+ transaction abort!
+ rollback completed
+ abort: 00changelog.i@93ee6ab32777: unknown parent!
+ [255]
+
+revision 2
+
+ $ hg tip -q
+ 2:4ce51a113780
+ $ hg unbundle ../test-bundle-all.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 4 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+revision 8
+
+ $ hg tip -q
+ 8:916f1afdef90
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo unbundle)
+
+revision 2
+
+ $ hg tip -q
+ 2:4ce51a113780
+ $ hg unbundle ../test-bundle-branch1.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+
+revision 4
+
+ $ hg tip -q
+ 4:916f1afdef90
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo unbundle)
+ $ hg unbundle ../test-bundle-branch2.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 3 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+revision 6
+
+ $ hg tip -q
+ 6:faa2e4234c7a
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 7 changesets, 6 total revisions
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo unbundle)
+ $ hg unbundle ../test-bundle-cset-7.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+
+revision 4
+
+ $ hg tip -q
+ 4:916f1afdef90
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+
+ $ cd ../test
+ $ hg merge 7
+ note: possible conflict - afile was renamed multiple times to:
+ anotherfile
+ adifferentfile
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ cd ..
+ $ hg -R test bundle --base 2 test-bundle-head.hg
+ 7 changesets found
+ $ hg clone test-2 test-10
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test-10
+ $ hg unbundle ../test-bundle-head.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 7 changesets with 4 changes to 4 files
+ (run 'hg update' to get a working copy)
+
+revision 9
+
+ $ hg tip -q
+ 9:03fc0b0e347c
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 10 changesets, 7 total revisions
+
+ $ cd ..
diff --git a/tests/test-bundle-type.t b/tests/test-bundle-type.t
new file mode 100644
index 0000000..5b8fc24
--- /dev/null
+++ b/tests/test-bundle-type.t
@@ -0,0 +1,100 @@
+bundle w/o type option
+
+ $ hg init t1
+ $ hg init t2
+ $ cd t1
+ $ echo blablablablabla > file.txt
+ $ hg ci -Ama
+ adding file.txt
+ $ hg log | grep summary
+ summary: a
+ $ hg bundle ../b1 ../t2
+ searching for changes
+ 1 changesets found
+
+ $ cd ../t2
+ $ hg pull ../b1
+ pulling from ../b1
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log | grep summary
+ summary: a
+ $ cd ..
+
+test bundle types
+
+ $ for t in "None" "bzip2" "gzip"; do
+ > echo % test bundle type $t
+ > hg init t$t
+ > cd t1
+ > hg bundle -t $t ../b$t ../t$t
+ > cut -b 1-6 ../b$t | head -n 1
+ > cd ../t$t
+ > hg pull ../b$t
+ > hg up
+ > hg log | grep summary
+ > cd ..
+ > done
+ % test bundle type None
+ searching for changes
+ 1 changesets found
+ HG10UN
+ pulling from ../bNone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ summary: a
+ % test bundle type bzip2
+ searching for changes
+ 1 changesets found
+ HG10BZ
+ pulling from ../bbzip2
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ summary: a
+ % test bundle type gzip
+ searching for changes
+ 1 changesets found
+ HG10GZ
+ pulling from ../bgzip
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ summary: a
+
+test garbage file
+
+ $ echo garbage > bgarbage
+ $ hg init tgarbage
+ $ cd tgarbage
+ $ hg pull ../bgarbage
+ abort: ../bgarbage: not a Mercurial bundle
+ [255]
+ $ cd ..
+
+test invalid bundle type
+
+ $ cd t1
+ $ hg bundle -a -t garbage ../bgarbage
+ abort: unknown bundle type specified with --type
+ [255]
+ $ cd ..
diff --git a/tests/test-bundle-vs-outgoing.t b/tests/test-bundle-vs-outgoing.t
new file mode 100644
index 0000000..f4bab19
--- /dev/null
+++ b/tests/test-bundle-vs-outgoing.t
@@ -0,0 +1,145 @@
+this structure seems to tickle a bug in bundle's search for
+changesets, so first we have to recreate it
+
+o 8
+|
+| o 7
+| |
+| o 6
+|/|
+o | 5
+| |
+o | 4
+| |
+| o 3
+| |
+| o 2
+|/
+o 1
+|
+o 0
+
+ $ mkrev()
+ > {
+ > revno=$1
+ > echo "rev $revno"
+ > echo "rev $revno" > foo.txt
+ > hg -q ci -m"rev $revno"
+ > }
+
+setup test repo1
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo "rev 0" > foo.txt
+ $ hg ci -Am"rev 0"
+ adding foo.txt
+ $ mkrev 1
+ rev 1
+
+first branch
+
+ $ mkrev 2
+ rev 2
+ $ mkrev 3
+ rev 3
+
+back to rev 1 to create second branch
+
+ $ hg up -r1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkrev 4
+ rev 4
+ $ mkrev 5
+ rev 5
+
+merge first branch to second branch
+
+ $ hg up -C -r5
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ HGMERGE=internal:local hg merge
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ echo "merge rev 5, rev 3" > foo.txt
+ $ hg ci -m"merge first branch to second branch"
+
+one more commit following the merge
+
+ $ mkrev 7
+ rev 7
+
+back to "second branch" to make another head
+
+ $ hg up -r5
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkrev 8
+ rev 8
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+the story so far
+
+ $ hg glog --template "{rev}\n"
+ @ 8
+ |
+ | o 7
+ | |
+ | o 6
+ |/|
+ o | 5
+ | |
+ o | 4
+ | |
+ | o 3
+ | |
+ | o 2
+ |/
+ o 1
+ |
+ o 0
+
+
+check that "hg outgoing" really does the right thing
+
+sanity check of outgoing: expect revs 4 5 6 7 8
+
+ $ hg clone -r3 . ../repo2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+this should (and does) report 5 outgoing revisions: 4 5 6 7 8
+
+ $ hg outgoing --template "{rev}\n" ../repo2
+ comparing with ../repo2
+ searching for changes
+ 4
+ 5
+ 6
+ 7
+ 8
+
+test bundle (destination repo): expect 5 revisions
+
+this should bundle the same 5 revisions that outgoing reported, but it
+
+actually bundles 7
+
+ $ hg bundle foo.bundle ../repo2
+ searching for changes
+ 5 changesets found
+
+test bundle (base revision): expect 5 revisions
+
+this should (and does) give exactly the same result as bundle
+
+with a destination repo... i.e. it's wrong too
+
+ $ hg bundle --base 3 foo.bundle
+ 5 changesets found
+
+ $ cd ..
diff --git a/tests/test-bundle.t b/tests/test-bundle.t
new file mode 100644
index 0000000..305d8eb
--- /dev/null
+++ b/tests/test-bundle.t
@@ -0,0 +1,603 @@
+Setting up test
+
+ $ hg init test
+ $ cd test
+ $ echo 0 > afile
+ $ hg add afile
+ $ hg commit -m "0.0"
+ $ echo 1 >> afile
+ $ hg commit -m "0.1"
+ $ echo 2 >> afile
+ $ hg commit -m "0.2"
+ $ echo 3 >> afile
+ $ hg commit -m "0.3"
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 1 >> afile
+ $ hg commit -m "1.1"
+ created new head
+ $ echo 2 >> afile
+ $ hg commit -m "1.2"
+ $ echo "a line" > fred
+ $ echo 3 >> afile
+ $ hg add fred
+ $ hg commit -m "1.3"
+ $ hg mv afile adifferentfile
+ $ hg commit -m "1.3m"
+ $ hg update -C 3
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg mv afile anotherfile
+ $ hg commit -m "0.3m"
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ cd ..
+ $ hg init empty
+
+Bundle and phase
+
+ $ hg -R test phase --force --secret 0
+ $ hg -R test bundle phase.hg empty
+ searching for changes
+ no changes found (ignored 9 secret changesets)
+ [1]
+ $ hg -R test phase --draft -r 'head()'
+
+Bundle --all
+
+ $ hg -R test bundle --all all.hg
+ 9 changesets found
+
+Bundle test to full.hg
+
+ $ hg -R test bundle full.hg empty
+ searching for changes
+ 9 changesets found
+
+Unbundle full.hg in test
+
+ $ hg -R test unbundle full.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 0 changesets with 0 changes to 4 files
+ (run 'hg update' to get a working copy)
+
+Verify empty
+
+ $ hg -R empty heads
+ [1]
+ $ hg -R empty verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 0 files, 0 changesets, 0 total revisions
+
+Pull full.hg into test (using --cwd)
+
+ $ hg --cwd test pull ../full.hg
+ pulling from ../full.hg
+ searching for changes
+ no changes found
+
+Pull full.hg into empty (using --cwd)
+
+ $ hg --cwd empty pull ../full.hg
+ pulling from ../full.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Rollback empty
+
+ $ hg -R empty rollback
+ repository tip rolled back to revision -1 (undo pull)
+
+Pull full.hg into empty again (using --cwd)
+
+ $ hg --cwd empty pull ../full.hg
+ pulling from ../full.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Pull full.hg into test (using -R)
+
+ $ hg -R test pull full.hg
+ pulling from full.hg
+ searching for changes
+ no changes found
+
+Pull full.hg into empty (using -R)
+
+ $ hg -R empty pull full.hg
+ pulling from full.hg
+ searching for changes
+ no changes found
+
+Rollback empty
+
+ $ hg -R empty rollback
+ repository tip rolled back to revision -1 (undo pull)
+
+Pull full.hg into empty again (using -R)
+
+ $ hg -R empty pull full.hg
+ pulling from full.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Log -R full.hg in fresh empty
+
+ $ rm -r empty
+ $ hg init empty
+ $ cd empty
+ $ hg -R bundle://../full.hg log
+ changeset: 8:aa35859c02ea
+ tag: tip
+ parent: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3m
+
+ changeset: 7:a6a34bfa0076
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3m
+
+ changeset: 6:7373c1169842
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3
+
+ changeset: 5:1bb50a9436a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.2
+
+ changeset: 4:095197eb4973
+ parent: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.1
+
+ changeset: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3
+
+ changeset: 2:e38ba6f5b7e0
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.2
+
+ changeset: 1:34c2bf6b0626
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.1
+
+ changeset: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.0
+
+Make sure bundlerepo doesn't leak tempfiles (issue2491)
+
+ $ ls .hg
+ 00changelog.i
+ cache
+ requires
+ store
+
+Pull ../full.hg into empty (with hook)
+
+ $ echo "[hooks]" >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup" >> .hg/hgrc
+
+doesn't work (yet ?)
+
+hg -R bundle://../full.hg verify
+
+ $ hg pull bundle://../full.hg
+ pulling from bundle:../full.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_URL=bundle:../full.hg
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Rollback empty
+
+ $ hg rollback
+ repository tip rolled back to revision -1 (undo pull)
+ $ cd ..
+
+Log -R bundle:empty+full.hg
+
+ $ hg -R bundle:empty+full.hg log --template="{rev} "; echo ""
+ 8 7 6 5 4 3 2 1 0
+
+Pull full.hg into empty again (using -R; with hook)
+
+ $ hg -R empty pull full.hg
+ pulling from full.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ changegroup hook: HG_NODE=f9ee2f85a263049e9ae6d37a0e67e96194ffb735 HG_SOURCE=pull HG_URL=bundle:empty+full.hg
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Create partial clones
+
+ $ rm -r empty
+ $ hg init empty
+ $ hg clone -r 3 test partial
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone partial partial2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd partial
+
+Log -R full.hg in partial
+
+ $ hg -R bundle://../full.hg log
+ changeset: 8:aa35859c02ea
+ tag: tip
+ parent: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3m
+
+ changeset: 7:a6a34bfa0076
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3m
+
+ changeset: 6:7373c1169842
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3
+
+ changeset: 5:1bb50a9436a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.2
+
+ changeset: 4:095197eb4973
+ parent: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.1
+
+ changeset: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3
+
+ changeset: 2:e38ba6f5b7e0
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.2
+
+ changeset: 1:34c2bf6b0626
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.1
+
+ changeset: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.0
+
+
+Incoming full.hg in partial
+
+ $ hg incoming bundle://../full.hg
+ comparing with bundle:../full.hg
+ searching for changes
+ changeset: 4:095197eb4973
+ parent: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.1
+
+ changeset: 5:1bb50a9436a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.2
+
+ changeset: 6:7373c1169842
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3
+
+ changeset: 7:a6a34bfa0076
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3m
+
+ changeset: 8:aa35859c02ea
+ tag: tip
+ parent: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3m
+
+
+Outgoing -R full.hg vs partial2 in partial
+
+ $ hg -R bundle://../full.hg outgoing ../partial2
+ comparing with ../partial2
+ searching for changes
+ changeset: 4:095197eb4973
+ parent: 0:f9ee2f85a263
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.1
+
+ changeset: 5:1bb50a9436a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.2
+
+ changeset: 6:7373c1169842
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3
+
+ changeset: 7:a6a34bfa0076
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3m
+
+ changeset: 8:aa35859c02ea
+ tag: tip
+ parent: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3m
+
+
+Outgoing -R does-not-exist.hg vs partial2 in partial
+
+ $ hg -R bundle://../does-not-exist.hg outgoing ../partial2
+ abort: *../does-not-exist.hg* (glob)
+ [255]
+ $ cd ..
+
+hide outer repo
+ $ hg init
+
+Direct clone from bundle (all-history)
+
+ $ hg clone full.hg full-clone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R full-clone heads
+ changeset: 8:aa35859c02ea
+ tag: tip
+ parent: 3:eebf5a27f8ca
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0.3m
+
+ changeset: 7:a6a34bfa0076
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1.3m
+
+ $ rm -r full-clone
+
+When cloning from a non-copiable repository into '', do not
+recurse infinitely (issue 2528)
+
+ $ hg clone full.hg ''
+ abort: empty destination path is not valid
+ [255]
+
+test for http://mercurial.selenic.com/bts/issue216
+
+Unbundle incremental bundles into fresh empty in one go
+
+ $ rm -r empty
+ $ hg init empty
+ $ hg -R test bundle --base null -r 0 ../0.hg
+ 1 changesets found
+ $ hg -R test bundle --base 0 -r 1 ../1.hg
+ 1 changesets found
+ $ hg -R empty unbundle -u ../0.hg ../1.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test for 540d1059c802
+
+test for 540d1059c802
+
+ $ hg init orig
+ $ cd orig
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+
+ $ hg clone . ../copy
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg tag foo
+
+ $ cd ../copy
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+ $ hg bundle ../bundle.hg ../orig
+ searching for changes
+ 1 changesets found
+
+ $ cd ../orig
+ $ hg incoming ../bundle.hg
+ comparing with ../bundle.hg
+ searching for changes
+ changeset: 2:ed1b79f46b9a
+ tag: tip
+ parent: 0:bbd179dfa0a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo
+
+ $ cd ..
+
+test bundle with # in the filename (issue2154):
+
+ $ cp bundle.hg 'test#bundle.hg'
+ $ cd orig
+ $ hg incoming '../test#bundle.hg'
+ comparing with ../test
+ abort: unknown revision 'bundle.hg'!
+ [255]
+
+note that percent encoding is not handled:
+
+ $ hg incoming ../test%23bundle.hg
+ abort: repository ../test%23bundle.hg not found!
+ [255]
+ $ cd ..
+
+test for http://mercurial.selenic.com/bts/issue1144
+
+test that verify bundle does not traceback
+
+partial history bundle, fails w/ unkown parent
+
+ $ hg -R bundle.hg verify
+ abort: 00changelog.i@bbd179dfa0a7: unknown parent!
+ [255]
+
+full history bundle, refuses to verify non-local repo
+
+ $ hg -R all.hg verify
+ abort: cannot verify bundle or remote repos
+ [255]
+
+but, regular verify must continue to work
+
+ $ hg -R orig verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+
+diff against bundle
+
+ $ hg init b
+ $ cd b
+ $ hg -R ../all.hg diff -r tip
+ diff -r aa35859c02ea anotherfile
+ --- a/anotherfile Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,4 +0,0 @@
+ -0
+ -1
+ -2
+ -3
+ $ cd ..
+
+bundle single branch
+
+ $ hg init branchy
+ $ cd branchy
+ $ echo a >a
+ $ echo x >x
+ $ hg ci -Ama
+ adding a
+ adding x
+ $ echo c >c
+ $ echo xx >x
+ $ hg ci -Amc
+ adding c
+ $ echo c1 >c1
+ $ hg ci -Amc1
+ adding c1
+ $ hg up 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo b >b
+ $ hg ci -Amb
+ adding b
+ created new head
+ $ echo b1 >b1
+ $ echo xx >x
+ $ hg ci -Amb1
+ adding b1
+ $ hg clone -q -r2 . part
+
+== bundling via incoming
+
+ $ hg in -R part --bundle incoming.hg --template "{node}\n" .
+ comparing with .
+ searching for changes
+ 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
+ 057f4db07f61970e1c11e83be79e9d08adc4dc31
+
+== bundling
+
+ $ hg bundle bundle.hg part --debug
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ 2 changesets found
+ list of changesets:
+ 1a38c1b849e8b70c756d2d80b0b9a3ac0b7ea11a
+ 057f4db07f61970e1c11e83be79e9d08adc4dc31
+ bundling: 1/2 changesets (50.00%)
+ bundling: 2/2 changesets (100.00%)
+ bundling: 1/2 manifests (50.00%)
+ bundling: 2/2 manifests (100.00%)
+ bundling: b 1/3 files (33.33%)
+ bundling: b1 2/3 files (66.67%)
+ bundling: x 3/3 files (100.00%)
+
+== Test for issue3441
+
+ $ hg clone -q -r0 . part2
+ $ hg -q -R part2 pull bundle.hg
+ $ hg -R part2 verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 3 changesets, 5 total revisions
+
+ $ cd ..
diff --git a/tests/test-casecollision-merge.t b/tests/test-casecollision-merge.t
new file mode 100644
index 0000000..39e0ed2
--- /dev/null
+++ b/tests/test-casecollision-merge.t
@@ -0,0 +1,209 @@
+run only on case-insensitive filesystems
+
+ $ "$TESTDIR/hghave" icasefs || exit 80
+
+################################
+test for branch merging
+################################
+
+test for rename awareness of case-folding collision check:
+
+(1) colliding file is one renamed from collided file:
+this is also case for issue3370.
+
+ $ hg init merge_renameaware_1
+ $ cd merge_renameaware_1
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m '#0'
+ $ hg rename a tmp
+ $ hg rename tmp A
+ $ hg commit -m '#1'
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'modified at #2' > a
+ $ hg commit -m '#2'
+ created new head
+
+ $ hg merge
+ merging a and A to A
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg status -A
+ M A
+ a
+ R a
+ $ cat A
+ modified at #2
+
+ $ hg update --clean 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge
+ merging A and a to A
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg status -A
+ M A
+ a
+ $ cat A
+ modified at #2
+
+ $ cd ..
+
+(2) colliding file is not related to collided file
+
+ $ hg init merge_renameaware_2
+ $ cd merge_renameaware_2
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m '#0'
+ $ hg remove a
+ $ hg commit -m '#1'
+ $ echo A > A
+ $ hg add A
+ $ hg commit -m '#2'
+ $ hg update --clean 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'modified at #3' > a
+ $ hg commit -m '#3'
+ created new head
+
+ $ hg merge
+ abort: case-folding collision between A and a
+ [255]
+ $ hg parents --template '{rev}\n'
+ 3
+ $ hg status -A
+ C a
+ $ cat a
+ modified at #3
+
+ $ hg update --clean 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge
+ abort: case-folding collision between a and A
+ [255]
+ $ hg parents --template '{rev}\n'
+ 2
+ $ hg status -A
+ C A
+ $ cat A
+ A
+
+ $ cd ..
+
+
+################################
+test for linear updates
+################################
+
+test for rename awareness of case-folding collision check:
+
+(1) colliding file is one renamed from collided file
+
+ $ hg init linearupdate_renameaware_1
+ $ cd linearupdate_renameaware_1
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m '#0'
+ $ hg rename a tmp
+ $ hg rename tmp A
+ $ hg commit -m '#1'
+
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo 'this is added line' >> a
+ $ hg update 1
+ merging a and A to A
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg status -A
+ M A
+ $ cat A
+ a
+ this is added line
+
+ $ cd ..
+
+(2) colliding file is not related to collided file
+
+ $ hg init linearupdate_renameaware_2
+ $ cd linearupdate_renameaware_2
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m '#0'
+ $ hg remove a
+ $ hg commit -m '#1'
+ $ echo A > A
+ $ hg add A
+ $ hg commit -m '#2'
+
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents --template '{rev}\n'
+ 0
+ $ hg status -A
+ C a
+ $ cat A
+ a
+ $ hg up -qC 2
+
+ $ hg update --check 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents --template '{rev}\n'
+ 0
+ $ hg status -A
+ C a
+ $ cat a
+ a
+
+ $ hg update --clean 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents --template '{rev}\n'
+ 2
+ $ hg status -A
+ C A
+ $ cat A
+ A
+
+ $ cd ..
+
+(3) colliding file is not related to collided file: added in working dir
+
+ $ hg init linearupdate_renameaware_3
+ $ cd linearupdate_renameaware_3
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m '#0'
+ $ hg rename a b
+ $ hg commit -m '#1'
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo B > B
+ $ hg add B
+ $ hg status
+ A B
+ $ hg update
+ abort: case-folding collision between b and B
+ [255]
+
+ $ hg update --check
+ abort: uncommitted local changes
+ [255]
+
+ $ hg update --clean
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents --template '{rev}\n'
+ 1
+ $ hg status -A
+ C b
+ $ cat b
+ a
+
+ $ cd ..
diff --git a/tests/test-casecollision.t b/tests/test-casecollision.t
new file mode 100644
index 0000000..235c7f2
--- /dev/null
+++ b/tests/test-casecollision.t
@@ -0,0 +1,71 @@
+run only on case-sensitive filesystems
+
+ $ "$TESTDIR/hghave" no-icasefs || exit 80
+
+test file addition with colliding case
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo a > a
+ $ echo A > A
+ $ hg add a
+ $ hg st
+ A a
+ ? A
+ $ hg add --config ui.portablefilenames=abort A
+ abort: possible case-folding collision for A
+ [255]
+ $ hg st
+ A a
+ ? A
+ $ hg add A
+ warning: possible case-folding collision for A
+ $ hg st
+ A A
+ A a
+ $ hg forget A
+ $ hg st
+ A a
+ ? A
+ $ hg add --config ui.portablefilenames=no A
+ $ hg st
+ A A
+ A a
+ $ mkdir b
+ $ touch b/c b/D
+ $ hg add b
+ adding b/D
+ adding b/c
+ $ touch b/d b/C
+ $ hg add b/C
+ warning: possible case-folding collision for b/C
+ $ hg add b/d
+ warning: possible case-folding collision for b/d
+ $ touch b/a1 b/a2
+ $ hg add b
+ adding b/a1
+ adding b/a2
+ $ touch b/A2 b/a1.1
+ $ hg add b/a1.1 b/A2
+ warning: possible case-folding collision for b/A2
+ $ touch b/f b/F
+ $ hg add b/f b/F
+ warning: possible case-folding collision for b/f
+ $ touch g G
+ $ hg add g G
+ warning: possible case-folding collision for g
+ $ mkdir h H
+ $ touch h/x H/x
+ $ hg add h/x H/x
+ warning: possible case-folding collision for h/x
+ $ touch h/s H/s
+ $ hg add h/s
+ $ hg add H/s
+ warning: possible case-folding collision for H/s
+
+case changing rename must not warn or abort
+
+ $ echo c > c
+ $ hg ci -qAmx
+ $ hg mv c C
+ $ cd ..
diff --git a/tests/test-casefolding.t b/tests/test-casefolding.t
new file mode 100644
index 0000000..5f59617
--- /dev/null
+++ b/tests/test-casefolding.t
@@ -0,0 +1,163 @@
+ $ "$TESTDIR/hghave" icasefs || exit 80
+
+ $ hg debugfs | grep 'case-sensitive:'
+ case-sensitive: no
+
+test file addition with bad case
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo a > a
+ $ hg add A
+ adding a
+ $ hg st
+ A a
+ $ hg ci -m adda
+ $ hg manifest
+ a
+ $ cd ..
+
+test case collision on rename (issue750)
+
+ $ hg init repo2
+ $ cd repo2
+ $ echo a > a
+ $ hg --debug ci -Am adda
+ adding a
+ a
+ committed changeset 0:07f4944404050f47db2e5c5071e0e84e7a27bba9
+
+Case-changing renames should work:
+
+ $ hg mv a A
+ $ hg mv A a
+ $ hg st
+
+test changing case of path components
+
+ $ mkdir D
+ $ echo b > D/b
+ $ hg ci -Am addb D/b
+ $ hg mv D/b d/b
+ D/b: not overwriting - file exists
+ $ hg mv D/b d/c
+ $ hg st
+ A D/c
+ R D/b
+ $ mv D temp
+ $ mv temp d
+ $ hg st
+ A D/c
+ R D/b
+ $ hg revert -aq
+ $ rm d/c
+ $ echo c > D/c
+ $ hg add D/c
+ $ hg st
+ A D/c
+ $ hg ci -m addc D/c
+ $ hg mv d/b d/e
+ moving D/b to D/e (glob)
+ $ hg st
+ A D/e
+ R D/b
+ $ hg revert -aq
+ $ rm d/e
+ $ hg mv d/b D/B
+ moving D/b to D/B (glob)
+ $ hg st
+ A D/B
+ R D/b
+ $ cd ..
+
+test case collision between revisions (issue912)
+
+ $ hg init repo3
+ $ cd repo3
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg rm a
+ $ hg ci -Am removea
+ $ echo A > A
+
+on linux hfs keeps the old case stored, force it
+
+ $ mv a aa
+ $ mv aa A
+ $ hg ci -Am addA
+ adding A
+
+used to fail under case insensitive fs
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg up -C
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+no clobbering of untracked files with wrong casing
+
+ $ hg up -r null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo gold > a
+ $ hg up
+ A: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
+ [255]
+ $ cat a
+ gold
+
+ $ cd ..
+
+issue 3342: file in nested directory causes unexpected abort
+
+ $ hg init issue3342
+ $ cd issue3342
+
+ $ mkdir -p a/B/c/D
+ $ echo e > a/B/c/D/e
+ $ hg add a/B/c/D/e
+
+ $ cd ..
+
+issue 3340: mq does not handle case changes correctly
+
+in addition to reported case, 'hg qrefresh' is also tested against
+case changes.
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init issue3340
+ $ cd issue3340
+
+ $ echo a > mIxEdCaSe
+ $ hg add mIxEdCaSe
+ $ hg commit -m '#0'
+ $ hg rename mIxEdCaSe tmp
+ $ hg rename tmp MiXeDcAsE
+ $ hg status -A
+ A MiXeDcAsE
+ mIxEdCaSe
+ R mIxEdCaSe
+ $ hg qnew changecase
+ $ hg status -A
+ C MiXeDcAsE
+
+ $ hg qpop -a
+ popping changecase
+ patch queue now empty
+ $ hg qnew refresh-casechange
+ $ hg status -A
+ C mIxEdCaSe
+ $ hg rename mIxEdCaSe tmp
+ $ hg rename tmp MiXeDcAsE
+ $ hg status -A
+ A MiXeDcAsE
+ mIxEdCaSe
+ R mIxEdCaSe
+ $ hg qrefresh
+ $ hg status -A
+ C MiXeDcAsE
+
+ $ cd ..
diff --git a/tests/test-cat.t b/tests/test-cat.t
new file mode 100644
index 0000000..d069262
--- /dev/null
+++ b/tests/test-cat.t
@@ -0,0 +1,23 @@
+ $ hg init
+ $ echo 0 > a
+ $ echo 0 > b
+ $ hg ci -A -m m
+ adding a
+ adding b
+ $ hg rm a
+ $ hg cat a
+ 0
+ $ hg cat --decode a # more tests in test-encode
+ 0
+ $ echo 1 > b
+ $ hg ci -m m
+ $ echo 2 > b
+ $ hg cat -r 0 a
+ 0
+ $ hg cat -r 0 b
+ 0
+ $ hg cat -r 1 a
+ a: no such file in rev 7040230c159c
+ [1]
+ $ hg cat -r 1 b
+ 1
diff --git a/tests/test-changelog-exec.t b/tests/test-changelog-exec.t
new file mode 100644
index 0000000..028f8e5
--- /dev/null
+++ b/tests/test-changelog-exec.t
@@ -0,0 +1,55 @@
+b51a8138292a introduced a regression where we would mention in the
+changelog executable files added by the second parent of a merge. Test
+that that doesn't happen anymore
+
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ hg init repo
+ $ cd repo
+ $ echo foo > foo
+ $ hg ci -qAm 'add foo'
+
+ $ echo bar > bar
+ $ chmod +x bar
+ $ hg ci -qAm 'add bar'
+
+manifest of p2:
+
+ $ hg manifest
+ bar
+ foo
+
+ $ hg up -qC 0
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+ created new head
+
+manifest of p1:
+
+ $ hg manifest
+ foo
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'merge'
+
+this should not mention bar:
+
+ $ hg tip -v
+ changeset: 3:ef2fc9b4a51b
+ tag: tip
+ parent: 2:ed1b79f46b9a
+ parent: 1:d394a8db219b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ description:
+ merge
+
+
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 5 ..... 1 b004912a8510 000000000000 000000000000 (re)
+
+ $ cd ..
diff --git a/tests/test-check-code-hg.t b/tests/test-check-code-hg.t
new file mode 100644
index 0000000..89f1d1a
--- /dev/null
+++ b/tests/test-check-code-hg.t
@@ -0,0 +1,183 @@
+ $ check_code="$TESTDIR"/../contrib/check-code.py
+ $ cd "$TESTDIR"/..
+ $ if hg identify -q > /dev/null; then :
+ > else
+ > echo "skipped: not a Mercurial working dir" >&2
+ > exit 80
+ > fi
+ $ hg manifest | xargs "$check_code" || echo 'FAILURE IS NOT AN OPTION!!!'
+
+ $ hg manifest | xargs "$check_code" --warnings --nolineno --per-file=0 || true
+ hgext/convert/cvsps.py:0:
+ > ui.write('Ancestors: %s\n' % (','.join(r)))
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Parent: %d\n' % cs.parents[0].id)
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Parents: %s\n' %
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Branchpoints: %s \n' % ', '.join(branchpoints))
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Author: %s\n' % cs.author)
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Branch: %s\n' % (cs.branch or 'HEAD'))
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Date: %s\n' % util.datestr(cs.date,
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Log:\n')
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Members: \n')
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('PatchSet %d \n' % cs.id)
+ warning: unwrapped ui message
+ hgext/convert/cvsps.py:0:
+ > ui.write('Tag%s: %s \n' % (['', 's'][len(cs.tags) > 1],
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("parent %s\n" % p)
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write('k=%s\nv=%s\n' % (name, value))
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("author %s %s %s\n" % (ctx.user(), int(date[0]), date[1]))
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("branch %s\n\n" % ctx.branch())
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("committer %s %s %s\n" % (committer, int(date[0]), date[1]))
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("revision %d\n" % ctx.rev())
+ warning: unwrapped ui message
+ hgext/hgk.py:0:
+ > ui.write("tree %s\n" % short(ctx.changeset()[0]))
+ warning: unwrapped ui message
+ hgext/mq.py:0:
+ > ui.write("mq: %s\n" % ', '.join(m))
+ warning: unwrapped ui message
+ hgext/patchbomb.py:0:
+ > ui.write('Subject: %s\n' % subj)
+ warning: unwrapped ui message
+ hgext/patchbomb.py:0:
+ > ui.write('From: %s\n' % sender)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.note('branch %s\n' % data)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.note('node %s\n' % str(data))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.note('tag %s\n' % name)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("unpruned common: %s\n" % " ".join([short(n)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("format: id, p1, p2, cset, delta base, len(delta)\n")
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("local is subset\n")
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("remote is subset\n")
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('deltas against other : ' + fmt % pcfmt(numother,
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('deltas against p1 : ' + fmt % pcfmt(nump1, numdeltas))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('deltas against p2 : ' + fmt % pcfmt(nump2, numdeltas))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("common heads: %s\n" % " ".join([short(n) for n in common]))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("match: %s\n" % m(d[0]))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('deltas against prev : ' + fmt % pcfmt(numprev, numdeltas))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('path %s\n' % k)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('uncompressed data size (min/max/avg) : %d / %d / %d\n'
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("digraph G {\n")
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("internal: %s %s\n" % d)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write("standard: %s\n" % util.datestr(d))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('avg chain length : ' + fmt % avgchainlen)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('case-sensitive: %s\n' % (util.checkcase('.debugfsinfo')
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('compression ratio : ' + fmt % compratio)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('delta size (min/max/avg) : %d / %d / %d\n'
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('exec: %s\n' % (util.checkexec(path) and 'yes' or 'no'))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('flags : %s\n' % ', '.join(flags))
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('format : %d\n' % format)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('full revision size (min/max/avg) : %d / %d / %d\n'
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('revision size : ' + fmt2 % totalsize)
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('revisions : ' + fmt2 % numrevs)
+ warning: unwrapped ui message
+ warning: unwrapped ui message
+ mercurial/commands.py:0:
+ > ui.write('symlink: %s\n' % (util.checklink(path) and 'yes' or 'no'))
+ warning: unwrapped ui message
+ tests/autodiff.py:0:
+ > ui.write('data lost for: %s\n' % fn)
+ warning: unwrapped ui message
+ tests/test-convert-mtn.t:0:
+ > > function get_passphrase(keypair_id)
+ don't use 'function', use old style
+ tests/test-import-git.t:0:
+ > > Mc\${NkU|\`?^000jF3jhEB
+ ^ must be quoted
+ tests/test-import.t:0:
+ > > diff -Naur proj-orig/foo proj-new/foo
+ don't use 'diff -N'
+ don't use 'diff -N'
+ tests/test-schemes.t:0:
+ > > z = file:\$PWD/
+ don't use $PWD, use `pwd`
+ tests/test-ui-color.py:0:
+ > testui.warn('warning\n')
+ warning: unwrapped ui message
+ tests/test-ui-color.py:0:
+ > testui.write('buffered\n')
+ warning: unwrapped ui message
diff --git a/tests/test-check-code.t b/tests/test-check-code.t
new file mode 100644
index 0000000..ee061d8
--- /dev/null
+++ b/tests/test-check-code.t
@@ -0,0 +1,142 @@
+ $ cat > correct.py <<EOF
+ > def toto(arg1, arg2):
+ > del arg2
+ > return (5 + 6, 9)
+ > EOF
+ $ cat > wrong.py <<EOF
+ > def toto( arg1, arg2):
+ > del(arg2)
+ > return ( 5+6, 9)
+ > EOF
+ $ cat > quote.py <<EOF
+ > # let's use quote in comments
+ > (''' ( 4x5 )
+ > but """\\''' and finally''',
+ > """let's fool checkpatch""", '1+2',
+ > '"""', 42+1, """and
+ > ( 4-1 ) """, "( 1+1 )\" and ")
+ > a, '\\\\\\\\', "\\\\\\" x-2", "c-1"
+ > EOF
+ $ cat > non-py24.py <<EOF
+ > # Using builtins that does not exist in Python 2.4
+ > if any():
+ > x = all()
+ > y = format(x)
+ >
+ > # Do not complain about our own definition
+ > def any(x):
+ > pass
+ >
+ > # try/except/finally block does not exist in Python 2.4
+ > try:
+ > pass
+ > except StandardError, inst:
+ > pass
+ > finally:
+ > pass
+ >
+ > # nested try/finally+try/except is allowed
+ > try:
+ > try:
+ > pass
+ > except StandardError, inst:
+ > pass
+ > finally:
+ > pass
+ > EOF
+ $ cat > classstyle.py <<EOF
+ > class newstyle_class(object):
+ > pass
+ >
+ > class oldstyle_class:
+ > pass
+ >
+ > class empty():
+ > pass
+ >
+ > no_class = 1:
+ > pass
+ > EOF
+ $ check_code="$TESTDIR"/../contrib/check-code.py
+ $ "$check_code" ./wrong.py ./correct.py ./quote.py ./non-py24.py ./classstyle.py
+ ./wrong.py:1:
+ > def toto( arg1, arg2):
+ gratuitous whitespace in () or []
+ ./wrong.py:2:
+ > del(arg2)
+ Python keyword is not a function
+ ./wrong.py:3:
+ > return ( 5+6, 9)
+ gratuitous whitespace in () or []
+ missing whitespace in expression
+ ./quote.py:5:
+ > '"""', 42+1, """and
+ missing whitespace in expression
+ ./non-py24.py:2:
+ > if any():
+ any/all/format not available in Python 2.4
+ ./non-py24.py:3:
+ > x = all()
+ any/all/format not available in Python 2.4
+ ./non-py24.py:4:
+ > y = format(x)
+ any/all/format not available in Python 2.4
+ ./non-py24.py:11:
+ > try:
+ no try/except/finally in Py2.4
+ ./classstyle.py:4:
+ > class oldstyle_class:
+ old-style class, use class foo(object)
+ ./classstyle.py:7:
+ > class empty():
+ class foo() not available in Python 2.4, use class foo(object)
+ [1]
+
+ $ cat > is-op.py <<EOF
+ > # is-operator comparing number or string literal
+ > x = None
+ > y = x is 'foo'
+ > y = x is "foo"
+ > y = x is 5346
+ > y = x is -6
+ > y = x is not 'foo'
+ > y = x is not "foo"
+ > y = x is not 5346
+ > y = x is not -6
+ > EOF
+
+ $ "$check_code" ./is-op.py
+ ./is-op.py:3:
+ > y = x is 'foo'
+ object comparison with literal
+ ./is-op.py:4:
+ > y = x is "foo"
+ object comparison with literal
+ ./is-op.py:5:
+ > y = x is 5346
+ object comparison with literal
+ ./is-op.py:6:
+ > y = x is -6
+ object comparison with literal
+ ./is-op.py:7:
+ > y = x is not 'foo'
+ object comparison with literal
+ ./is-op.py:8:
+ > y = x is not "foo"
+ object comparison with literal
+ ./is-op.py:9:
+ > y = x is not 5346
+ object comparison with literal
+ ./is-op.py:10:
+ > y = x is not -6
+ object comparison with literal
+ [1]
+
+ $ cat > warning.py <<EOF
+ > except:
+ > EOF
+ $ "$check_code" warning.py --warning --nolineno
+ warning.py:0:
+ > except:
+ warning: naked except clause
+ [1]
diff --git a/tests/test-check-pyflakes.t b/tests/test-check-pyflakes.t
new file mode 100644
index 0000000..3b5c272
--- /dev/null
+++ b/tests/test-check-pyflakes.t
@@ -0,0 +1,6 @@
+ $ "$TESTDIR/hghave" pyflakes || exit 80
+ $ cd "`dirname "$TESTDIR"`"
+ $ pyflakes mercurial hgext 2>&1 | "$TESTDIR/filterpyflakes.py"
+ hgext/inotify/linux/__init__.py:*: 'from _inotify import *' used; unable to detect undefined names (glob)
+
+
diff --git a/tests/test-children.t b/tests/test-children.t
new file mode 100644
index 0000000..ca812ef
--- /dev/null
+++ b/tests/test-children.t
@@ -0,0 +1,125 @@
+test children command
+
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > children =
+ > EOF
+
+init
+ $ hg init t
+ $ cd t
+
+no working directory
+ $ hg children
+
+setup
+ $ echo 0 > file0
+ $ hg ci -qAm 0 -d '0 0'
+
+ $ echo 1 > file1
+ $ hg ci -qAm 1 -d '1 0'
+
+ $ echo 2 >> file0
+ $ hg ci -qAm 2 -d '2 0'
+
+ $ hg co null
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo 3 > file3
+ $ hg ci -qAm 3 -d '3 0'
+
+hg children at revision 3 (tip)
+ $ hg children
+
+ $ hg co null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+hg children at nullrev (should be 0 and 3)
+ $ hg children
+ changeset: 0:4df8521a7374
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 3:e2962852269d
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: 3
+
+ $ hg co 1
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+hg children at revision 1 (should be 2)
+ $ hg children
+ changeset: 2:8f5eea5023c2
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+ $ hg co 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+hg children at revision 2 (other head)
+ $ hg children
+
+ $ for i in null 0 1 2 3; do
+ > echo "hg children -r $i"
+ > hg children -r $i
+ > done
+ hg children -r null
+ changeset: 0:4df8521a7374
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 3:e2962852269d
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: 3
+
+ hg children -r 0
+ changeset: 1:708c093edef0
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: 1
+
+ hg children -r 1
+ changeset: 2:8f5eea5023c2
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+ hg children -r 2
+ hg children -r 3
+
+hg children -r 0 file0 (should be 2)
+ $ hg children -r 0 file0
+ changeset: 2:8f5eea5023c2
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+
+hg children -r 1 file0 (should be 2)
+ $ hg children -r 1 file0
+ changeset: 2:8f5eea5023c2
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+
+ $ hg co 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+hg children file0 at revision 0 (should be 2)
+ $ hg children file0
+ changeset: 2:8f5eea5023c2
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2
+
+
+ $ cd ..
diff --git a/tests/test-churn.t b/tests/test-churn.t
new file mode 100644
index 0000000..b744d64
--- /dev/null
+++ b/tests/test-churn.t
@@ -0,0 +1,162 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "churn=" >> $HGRCPATH
+
+create test repository
+
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda -u user1 -d 6:00
+ adding a
+ $ echo b >> a
+ $ echo b > b
+ $ hg ci -m changeba -u user2 -d 9:00 a
+ $ hg ci -Am addb -u user2 -d 9:30
+ adding b
+ $ echo c >> a
+ $ echo c >> b
+ $ echo c > c
+ $ hg ci -m changeca -u user3 -d 12:00 a
+ $ hg ci -m changecb -u user3 -d 12:15 b
+ $ hg ci -Am addc -u user3 -d 12:30
+ adding c
+ $ mkdir -p d/e
+ $ echo abc > d/e/f1.txt
+ $ hg ci -Am "add d/e/f1.txt" -u user1 -d 12:45 d/e/f1.txt
+ $ mkdir -p d/g
+ $ echo def > d/g/f2.txt
+ $ hg ci -Am "add d/g/f2.txt" -u user1 -d 13:00 d/g/f2.txt
+
+
+churn separate directories
+
+ $ cd d
+ $ hg churn e
+ user1 1 ***************************************************************
+
+churn all
+
+ $ hg churn
+ user3 3 ***************************************************************
+ user1 3 ***************************************************************
+ user2 2 ******************************************
+
+churn excluding one dir
+
+ $ hg churn -X e
+ user3 3 ***************************************************************
+ user2 2 ******************************************
+ user1 2 ******************************************
+
+churn up to rev 2
+
+ $ hg churn -r :2
+ user2 2 ***************************************************************
+ user1 1 ********************************
+ $ cd ..
+
+churn with aliases
+
+ $ cat > ../aliases <<EOF
+ > user1 alias1
+ > user3 alias3
+ > not-an-alias
+ > EOF
+
+churn with .hgchurn
+
+ $ mv ../aliases .hgchurn
+ $ hg churn
+ skipping malformed alias: not-an-alias
+ alias3 3 **************************************************************
+ alias1 3 **************************************************************
+ user2 2 *****************************************
+ $ rm .hgchurn
+
+churn with column specifier
+
+ $ COLUMNS=40 hg churn
+ user3 3 ***********************
+ user1 3 ***********************
+ user2 2 ***************
+
+churn by hour
+
+ $ hg churn -f '%H' -s
+ 06 1 *****************
+ 09 2 *********************************
+ 12 4 ******************************************************************
+ 13 1 *****************
+
+
+churn with separated added/removed lines
+
+ $ hg rm d/g/f2.txt
+ $ hg ci -Am "removed d/g/f2.txt" -u user1 -d 14:00 d/g/f2.txt
+ $ hg churn --diffstat
+ user1 +3/-1 +++++++++++++++++++++++++++++++++++++++++--------------
+ user3 +3/-0 +++++++++++++++++++++++++++++++++++++++++
+ user2 +2/-0 +++++++++++++++++++++++++++
+
+churn --diffstat with color
+
+ $ hg --config extensions.color= churn --config color.mode=ansi \
+ > --diffstat --color=always
+ user1 +3/-1 \x1b[0;32m+++++++++++++++++++++++++++++++++++++++++\x1b[0m\x1b[0;31m--------------\x1b[0m (esc)
+ user3 +3/-0 \x1b[0;32m+++++++++++++++++++++++++++++++++++++++++\x1b[0m (esc)
+ user2 +2/-0 \x1b[0;32m+++++++++++++++++++++++++++\x1b[0m (esc)
+
+
+changeset number churn
+
+ $ hg churn -c
+ user1 4 ***************************************************************
+ user3 3 ***********************************************
+ user2 2 ********************************
+
+ $ echo 'with space = no-space' >> ../aliases
+ $ echo a >> a
+ $ hg commit -m a -u 'with space' -d 15:00
+
+churn with space in alias
+
+ $ hg churn --aliases ../aliases -r tip
+ no-space 1 ************************************************************
+
+ $ cd ..
+
+
+Issue833: ZeroDivisionError
+
+ $ hg init issue-833
+ $ cd issue-833
+ $ touch foo
+ $ hg ci -Am foo
+ adding foo
+
+this was failing with a ZeroDivisionError
+
+ $ hg churn
+ test 0
+ $ cd ..
+
+Ignore trailing or leading spaces in emails
+
+ $ cd repo
+ $ touch bar
+ $ hg ci -Am'bar' -u 'user4 <user4@x.com>'
+ adding bar
+ $ touch foo
+ $ hg ci -Am'foo' -u 'user4 < user4@x.com >'
+ adding foo
+ $ hg log -l2 --template '[{author|email}]\n'
+ [ user4@x.com ]
+ [user4@x.com]
+ $ hg churn -c
+ user1 4 *********************************************************
+ user3 3 *******************************************
+ user4@x.com 2 *****************************
+ user2 2 *****************************
+ with space 1 **************
+
+ $ cd ..
diff --git a/tests/test-clone-cgi.t b/tests/test-clone-cgi.t
new file mode 100644
index 0000000..f857f07
--- /dev/null
+++ b/tests/test-clone-cgi.t
@@ -0,0 +1,31 @@
+ $ "$TESTDIR/hghave" no-msys || exit 80 # MSYS will translate web paths as if they were file paths
+
+This is a test of the wire protocol over CGI-based hgweb.
+initialize repository
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ cd ..
+ $ cat >hgweb.cgi <<HGWEB
+ > #
+ > # An example CGI script to use hgweb, edit as necessary
+ > import cgitb
+ > cgitb.enable()
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgweb
+ > from mercurial.hgweb import wsgicgi
+ > application = hgweb("test", "Empty test repository")
+ > wsgicgi.launch(application)
+ > HGWEB
+ $ chmod 755 hgweb.cgi
+
+try hgweb request
+
+ $ . "$TESTDIR/cgienv"
+ $ QUERY_STRING="cmd=changegroup&roots=0000000000000000000000000000000000000000"; export QUERY_STRING
+ $ python hgweb.cgi >page1 2>&1
+ $ python "$TESTDIR/md5sum.py" page1
+ 1f424bb22ec05c3c6bc866b6e67efe43 page1
diff --git a/tests/test-clone-pull-corruption.t b/tests/test-clone-pull-corruption.t
new file mode 100644
index 0000000..b92269c
--- /dev/null
+++ b/tests/test-clone-pull-corruption.t
@@ -0,0 +1,52 @@
+Corrupt an hg repo with a pull started during an aborted commit
+Create two repos, so that one of them can pull from the other one.
+
+ $ hg init source
+ $ cd source
+ $ touch foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+ $ hg clone . ../corrupted
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+
+Add a hook to wait 5 seconds and then abort the commit
+
+ $ cd ../corrupted
+ $ echo "[hooks]" >> .hg/hgrc
+ $ echo "pretxncommit = sh -c 'sleep 5; exit 1'" >> .hg/hgrc
+
+start a commit...
+
+ $ touch bar
+ $ hg add bar
+ $ hg ci -m 'add bar' &
+
+... and start a pull while the commit is still running
+
+ $ sleep 1
+ $ hg pull ../source 2>/dev/null
+ pulling from ../source
+ transaction abort!
+ rollback completed
+ abort: pretxncommit hook exited with status 1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+see what happened
+
+ $ wait
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ $ cd ..
diff --git a/tests/test-clone-r.t b/tests/test-clone-r.t
new file mode 100644
index 0000000..afd8498
--- /dev/null
+++ b/tests/test-clone-r.t
@@ -0,0 +1,220 @@
+ $ hg init test
+ $ cd test
+
+ $ echo 0 >> afile
+ $ hg add afile
+ $ hg commit -m "0.0"
+
+ $ echo 1 >> afile
+ $ hg commit -m "0.1"
+
+ $ echo 2 >> afile
+ $ hg commit -m "0.2"
+
+ $ echo 3 >> afile
+ $ hg commit -m "0.3"
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo 1 >> afile
+ $ hg commit -m "1.1"
+ created new head
+
+ $ echo 2 >> afile
+ $ hg commit -m "1.2"
+
+ $ echo a line > fred
+ $ echo 3 >> afile
+ $ hg add fred
+ $ hg commit -m "1.3"
+ $ hg mv afile adifferentfile
+ $ hg commit -m "1.3m"
+
+ $ hg update -C 3
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ hg mv afile anotherfile
+ $ hg commit -m "0.3m"
+
+ $ hg debugindex -f 1 afile
+ rev flag offset length size ..... link p1 p2 nodeid (re)
+ 0 0000 0 3 2 ..... 0 -1 -1 362fef284ce2 (re)
+ 1 0000 3 5 4 ..... 1 0 -1 125144f7e028 (re)
+ 2 0000 8 7 6 ..... 2 1 -1 4c982badb186 (re)
+ 3 0000 15 9 8 ..... 3 2 -1 19b1fc555737 (re)
+
+ $ hg debugindex adifferentfile
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 75 ..... 7 2565f3199a74 000000000000 000000000000 (re)
+
+ $ hg debugindex anotherfile
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 75 ..... 8 2565f3199a74 000000000000 000000000000 (re)
+
+ $ hg debugindex fred
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 8 ..... 6 12ab3bcc5ea4 000000000000 000000000000 (re)
+
+ $ hg debugindex --manifest
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 48 ..... 0 43eadb1d2d06 000000000000 000000000000 (re)
+ 1 48 48 ..... 1 8b89697eba2c 43eadb1d2d06 000000000000 (re)
+ 2 96 48 ..... 2 626a32663c2f 8b89697eba2c 000000000000 (re)
+ 3 144 48 ..... 3 f54c32f13478 626a32663c2f 000000000000 (re)
+ 4 192 .. ..... 6 de68e904d169 626a32663c2f 000000000000 (re)
+ 5 2.. 68 ..... 7 09bb521d218d de68e904d169 000000000000 (re)
+ 6 3.. 54 ..... 8 1fde233dfb0f f54c32f13478 000000000000 (re)
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+
+ $ cd ..
+
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > echo
+ > echo ---- hg clone -r "$i" test test-"$i"
+ > hg clone -r "$i" test test-"$i"
+ > cd test-"$i"
+ > hg verify
+ > cd ..
+ > done
+
+ ---- hg clone -r 0 test test-0
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ ---- hg clone -r 1 test test-1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ ---- hg clone -r 2 test test-2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+ ---- hg clone -r 3 test test-3
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 4 changesets, 4 total revisions
+
+ ---- hg clone -r 4 test test-4
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ ---- hg clone -r 5 test test-5
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+ ---- hg clone -r 6 test test-6
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 4 changesets, 5 total revisions
+
+ ---- hg clone -r 7 test test-7
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 3 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 6 total revisions
+
+ ---- hg clone -r 8 test test-8
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 2 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+
+ $ cd test-8
+ $ hg pull ../test-7
+ pulling from ../test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 2 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ cd ..
+
diff --git a/tests/test-clone-update-order.t b/tests/test-clone-update-order.t
new file mode 100644
index 0000000..8a4f89d
--- /dev/null
+++ b/tests/test-clone-update-order.t
@@ -0,0 +1,105 @@
+ $ hg init
+ $ echo foo > bar
+ $ hg commit -Am default
+ adding bar
+ $ hg up -r null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch mine
+ marked working directory as branch mine
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo hello > world
+ $ hg commit -Am hello
+ adding world
+ $ hg up -r null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch other
+ marked working directory as branch other
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo good > bye
+ $ hg commit -Am other
+ adding bye
+ $ hg up -r mine
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg clone -U -u . .#other ../b -r 0 -r 1 -r 2 -b other
+ abort: cannot specify both --noupdate and --updaterev
+ [255]
+
+ $ hg clone -U .#other ../b -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ $ rm -rf ../b
+
+ $ hg clone -u . .#other ../b -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch mine
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone -u 0 .#other ../b -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone -u 1 .#other ../b -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch mine
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone -u 2 .#other ../b -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch other
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+Test -r mine ... mine is ignored:
+
+ $ hg clone -u 2 .#other ../b -r mine -r 0 -r 1 -r 2 -b other
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch other
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone .#other ../b -b default -b mine
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files (+2 heads)
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone .#other ../b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch other
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b
+
+ $ hg clone -U . ../c -r 1 -r 2 > /dev/null
+ $ hg clone ../c ../b
+ updating to branch other
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf ../b ../c
+
diff --git a/tests/test-clone.t b/tests/test-clone.t
new file mode 100644
index 0000000..3f83949
--- /dev/null
+++ b/tests/test-clone.t
@@ -0,0 +1,567 @@
+Prepare repo a:
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m test
+ $ echo first line > b
+ $ hg add b
+
+Create a non-inlined filelog:
+
+ $ python -c 'file("data1", "wb").write("".join("%s\n" % x for x in range(10000)))'
+ $ for j in 0 1 2 3 4 5 6 7 8 9; do
+ > cat data1 >> b
+ > hg commit -m test
+ > done
+
+List files in store/data (should show a 'b.d'):
+
+ $ for i in .hg/store/data/*; do
+ > echo $i
+ > done
+ .hg/store/data/a.i
+ .hg/store/data/b.d
+ .hg/store/data/b.i
+
+Default operation:
+
+ $ hg clone . ../b
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../b
+ $ cat a
+ a
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 11 changesets, 11 total revisions
+
+Invalid dest '' must abort:
+
+ $ hg clone . ''
+ abort: empty destination path is not valid
+ [255]
+
+No update, with debug option:
+
+#if hardlink
+ $ hg --debug clone -U . ../c
+ linked 8 files
+ listing keys for "bookmarks"
+#else
+ $ hg --debug clone -U . ../c
+ copied 8 files
+ listing keys for "bookmarks"
+#endif
+ $ cd ../c
+ $ cat a 2>/dev/null || echo "a not present"
+ a not present
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 11 changesets, 11 total revisions
+
+Default destination:
+
+ $ mkdir ../d
+ $ cd ../d
+ $ hg clone ../a
+ destination directory: a
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd a
+ $ hg cat a
+ a
+ $ cd ../..
+
+Check that we drop the 'file:' from the path before writing the .hgrc:
+
+ $ hg clone file:a e
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ grep 'file:' e/.hg/hgrc
+ [1]
+
+Check that path aliases are expanded:
+
+ $ hg clone -q -U --config 'paths.foobar=a#0' foobar f
+ $ hg -R f showconfig paths.default
+ $TESTTMP/a#0 (glob)
+
+Use --pull:
+
+ $ hg clone --pull a g
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 11 changesets with 11 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R g verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 11 changesets, 11 total revisions
+
+Invalid dest '' with --pull must abort (issue2528):
+
+ $ hg clone --pull a ''
+ abort: empty destination path is not valid
+ [255]
+
+Clone to '.':
+
+ $ mkdir h
+ $ cd h
+ $ hg clone ../a .
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+
+*** Tests for option -u ***
+
+Adding some more history to repo a:
+
+ $ cd a
+ $ hg tag ref1
+ $ echo the quick brown fox >a
+ $ hg ci -m "hacked default"
+ $ hg up ref1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch stable
+ marked working directory as branch stable
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo some text >a
+ $ hg ci -m "starting branch stable"
+ $ hg tag ref2
+ $ echo some more text >a
+ $ hg ci -m "another change for branch stable"
+ $ hg up ref2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 13:e8ece76546a6
+ branch: stable
+ tag: ref2
+ parent: 10:a7949464abda
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: starting branch stable
+
+
+Repo a has two heads:
+
+ $ hg heads
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+ $ cd ..
+
+
+Testing --noupdate with --updaterev (must abort):
+
+ $ hg clone --noupdate --updaterev 1 a ua
+ abort: cannot specify both --noupdate and --updaterev
+ [255]
+
+
+Testing clone -u:
+
+ $ hg clone -u . a ua
+ updating to branch stable
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has both heads:
+
+ $ hg -R ua heads
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+Same revision checked out in repo a and ua:
+
+ $ hg -R a parents --template "{node|short}\n"
+ e8ece76546a6
+ $ hg -R ua parents --template "{node|short}\n"
+ e8ece76546a6
+
+ $ rm -r ua
+
+
+Testing clone --pull -u:
+
+ $ hg clone --pull -u . a ua
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 16 changesets with 16 changes to 3 files (+1 heads)
+ updating to branch stable
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has both heads:
+
+ $ hg -R ua heads
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+Same revision checked out in repo a and ua:
+
+ $ hg -R a parents --template "{node|short}\n"
+ e8ece76546a6
+ $ hg -R ua parents --template "{node|short}\n"
+ e8ece76546a6
+
+ $ rm -r ua
+
+
+Testing clone -u <branch>:
+
+ $ hg clone -u stable a ua
+ updating to branch stable
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has both heads:
+
+ $ hg -R ua heads
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+Branch 'stable' is checked out:
+
+ $ hg -R ua parents
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+
+ $ rm -r ua
+
+
+Testing default checkout:
+
+ $ hg clone a ua
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has both heads:
+
+ $ hg -R ua heads
+ changeset: 15:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+Branch 'default' is checked out:
+
+ $ hg -R ua parents
+ changeset: 12:f21241060d6a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: hacked default
+
+
+ $ rm -r ua
+
+
+Testing #<branch>:
+
+ $ hg clone -u . a#stable ua
+ adding changesets
+ adding manifests
+ adding file changes
+ added 14 changesets with 14 changes to 3 files
+ updating to branch stable
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
+
+ $ hg -R ua heads
+ changeset: 13:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 10:a7949464abda
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+Same revision checked out in repo a and ua:
+
+ $ hg -R a parents --template "{node|short}\n"
+ e8ece76546a6
+ $ hg -R ua parents --template "{node|short}\n"
+ e8ece76546a6
+
+ $ rm -r ua
+
+
+Testing -u -r <branch>:
+
+ $ hg clone -u . -r stable a ua
+ adding changesets
+ adding manifests
+ adding file changes
+ added 14 changesets with 14 changes to 3 files
+ updating to branch stable
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
+
+ $ hg -R ua heads
+ changeset: 13:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 10:a7949464abda
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+Same revision checked out in repo a and ua:
+
+ $ hg -R a parents --template "{node|short}\n"
+ e8ece76546a6
+ $ hg -R ua parents --template "{node|short}\n"
+ e8ece76546a6
+
+ $ rm -r ua
+
+
+Testing -r <branch>:
+
+ $ hg clone -r stable a ua
+ adding changesets
+ adding manifests
+ adding file changes
+ added 14 changesets with 14 changes to 3 files
+ updating to branch stable
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Repo ua has branch 'stable' and 'default' (was changed in fd511e9eeea6):
+
+ $ hg -R ua heads
+ changeset: 13:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+ changeset: 10:a7949464abda
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+Branch 'stable' is checked out:
+
+ $ hg -R ua parents
+ changeset: 13:0aae7cf88f0d
+ branch: stable
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another change for branch stable
+
+
+ $ rm -r ua
+
+
+Issue2267: Error in 1.6 hg.py: TypeError: 'NoneType' object is not
+iterable in addbranchrevs()
+
+ $ cat <<EOF > simpleclone.py
+ > from mercurial import ui, hg
+ > myui = ui.ui()
+ > repo = hg.repository(myui, 'a')
+ > hg.clone(myui, {}, repo, dest="ua")
+ > EOF
+
+ $ python simpleclone.py
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ rm -r ua
+
+ $ cat <<EOF > branchclone.py
+ > from mercurial import ui, hg, extensions
+ > myui = ui.ui()
+ > extensions.loadall(myui)
+ > repo = hg.repository(myui, 'a')
+ > hg.clone(myui, {}, repo, dest="ua", branch=["stable",])
+ > EOF
+
+ $ python branchclone.py
+ adding changesets
+ adding manifests
+ adding file changes
+ added 14 changesets with 14 changes to 3 files
+ updating to branch stable
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -r ua
+
+
+Testing failures:
+
+ $ mkdir fail
+ $ cd fail
+
+No local source
+
+ $ hg clone a b
+ abort: repository a not found!
+ [255]
+
+No remote source
+
+ $ hg clone http://127.0.0.1:3121/a b
+ abort: error: *refused* (glob)
+ [255]
+ $ rm -rf b # work around bug with http clone
+
+
+#if unix-permissions
+
+Inaccessible source
+
+ $ mkdir a
+ $ chmod 000 a
+ $ hg clone a b
+ abort: repository a not found!
+ [255]
+
+Inaccessible destination
+
+ $ hg init b
+ $ cd b
+ $ hg clone . ../a
+ abort: Permission denied: ../a
+ [255]
+ $ cd ..
+ $ chmod 700 a
+ $ rm -r a b
+
+#endif
+
+
+#if fifo
+
+Source of wrong type
+
+ $ mkfifo a
+ $ hg clone a b
+ abort: repository a not found!
+ [255]
+ $ rm a
+
+#endif
+
+Default destination, same directory
+
+ $ hg init q
+ $ hg clone q
+ destination directory: q
+ abort: destination 'q' is not empty
+ [255]
+
+destination directory not empty
+
+ $ mkdir a
+ $ echo stuff > a/a
+ $ hg clone q a
+ abort: destination 'a' is not empty
+ [255]
+
+
+#if unix-permissions
+
+leave existing directory in place after clone failure
+
+ $ hg init c
+ $ cd c
+ $ echo c > c
+ $ hg commit -A -m test
+ adding c
+ $ chmod -rx .hg/store/data
+ $ cd ..
+ $ mkdir d
+ $ hg clone c d 2> err
+ [255]
+ $ test -d d
+ $ test -d d/.hg
+ [1]
+
+reenable perm to allow deletion
+
+ $ chmod +rx c/.hg/store/data
+
+#endif
+
+ $ cd ..
diff --git a/tests/test-command-template.t b/tests/test-command-template.t
new file mode 100644
index 0000000..d3fa338
--- /dev/null
+++ b/tests/test-command-template.t
@@ -0,0 +1,1383 @@
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg add a
+ $ echo line 1 > b
+ $ echo line 2 >> b
+ $ hg commit -l b -d '1000000 0' -u 'User Name <user@hostname>'
+
+ $ hg add b
+ $ echo other 1 > c
+ $ echo other 2 >> c
+ $ echo >> c
+ $ echo other 3 >> c
+ $ hg commit -l c -d '1100000 0' -u 'A. N. Other <other@place>'
+
+ $ hg add c
+ $ hg commit -m 'no person' -d '1200000 0' -u 'other@place'
+ $ echo c >> c
+ $ hg commit -m 'no user, no domain' -d '1300000 0' -u 'person'
+
+ $ echo foo > .hg/branch
+ $ hg commit -m 'new branch' -d '1400000 0' -u 'person'
+
+ $ hg co -q 3
+ $ echo other 4 >> d
+ $ hg add d
+ $ hg commit -m 'new head' -d '1500000 0' -u 'person'
+
+ $ hg merge -q foo
+ $ hg commit -m 'merge' -d '1500001 0' -u 'person'
+
+Second branch starting at nullrev:
+
+ $ hg update null
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ $ echo second > second
+ $ hg add second
+ $ hg commit -m second -d '1000000 0' -u 'User Name <user@hostname>'
+ created new head
+
+ $ echo third > third
+ $ hg add third
+ $ hg mv second fourth
+ $ hg commit -m third -d "2020-01-01 10:01"
+
+Quoting for ui.logtemplate
+
+ $ hg tip --config "ui.logtemplate={rev}\n"
+ 8
+ $ hg tip --config "ui.logtemplate='{rev}\n'"
+ 8
+ $ hg tip --config 'ui.logtemplate="{rev}\n"'
+ 8
+
+Make sure user/global hgrc does not affect tests
+
+ $ echo '[ui]' > .hg/hgrc
+ $ echo 'logtemplate =' >> .hg/hgrc
+ $ echo 'style =' >> .hg/hgrc
+
+Default style is like normal output:
+
+ $ hg log > log.out
+ $ hg log --style default > style.out
+ $ cmp log.out style.out || diff -u log.out style.out
+
+ $ hg log -v > log.out
+ $ hg log -v --style default > style.out
+ $ cmp log.out style.out || diff -u log.out style.out
+
+ $ hg log --debug > log.out
+ $ hg log --debug --style default > style.out
+ $ cmp log.out style.out || diff -u log.out style.out
+
+Revision with no copies (used to print a traceback):
+
+ $ hg tip -v --template '\n'
+
+
+Compact style works:
+
+ $ hg log --style compact
+ 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
+ third
+
+ 7:-1 29114dbae42b 1970-01-12 13:46 +0000 user
+ second
+
+ 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
+ merge
+
+ 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
+ new head
+
+ 4 bbe44766e73d 1970-01-17 04:53 +0000 person
+ new branch
+
+ 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
+ no user, no domain
+
+ 2 97054abb4ab8 1970-01-14 21:20 +0000 other
+ no person
+
+ 1 b608e9d1a3f0 1970-01-13 17:33 +0000 other
+ other 1
+
+ 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 user
+ line 1
+
+
+ $ hg log -v --style compact
+ 8[tip] 95c24699272e 2020-01-01 10:01 +0000 test
+ third
+
+ 7:-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
+ second
+
+ 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
+ merge
+
+ 5:3 13207e5a10d9 1970-01-18 08:40 +0000 person
+ new head
+
+ 4 bbe44766e73d 1970-01-17 04:53 +0000 person
+ new branch
+
+ 3 10e46f2dcbf4 1970-01-16 01:06 +0000 person
+ no user, no domain
+
+ 2 97054abb4ab8 1970-01-14 21:20 +0000 other@place
+ no person
+
+ 1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
+ other 1
+ other 2
+
+ other 3
+
+ 0 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
+ line 1
+ line 2
+
+
+ $ hg log --debug --style compact
+ 8[tip]:7,-1 95c24699272e 2020-01-01 10:01 +0000 test
+ third
+
+ 7:-1,-1 29114dbae42b 1970-01-12 13:46 +0000 User Name <user@hostname>
+ second
+
+ 6:5,4 d41e714fe50d 1970-01-18 08:40 +0000 person
+ merge
+
+ 5:3,-1 13207e5a10d9 1970-01-18 08:40 +0000 person
+ new head
+
+ 4:3,-1 bbe44766e73d 1970-01-17 04:53 +0000 person
+ new branch
+
+ 3:2,-1 10e46f2dcbf4 1970-01-16 01:06 +0000 person
+ no user, no domain
+
+ 2:1,-1 97054abb4ab8 1970-01-14 21:20 +0000 other@place
+ no person
+
+ 1:0,-1 b608e9d1a3f0 1970-01-13 17:33 +0000 A. N. Other <other@place>
+ other 1
+ other 2
+
+ other 3
+
+ 0:-1,-1 1e4e1b8f71e0 1970-01-12 13:46 +0000 User Name <user@hostname>
+ line 1
+ line 2
+
+
+Test xml styles:
+
+ $ hg log --style xml
+ <?xml version="1.0"?>
+ <log>
+ <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
+ <tag>tip</tag>
+ <author email="test">test</author>
+ <date>2020-01-01T10:01:00+00:00</date>
+ <msg xml:space="preserve">third</msg>
+ </logentry>
+ <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">second</msg>
+ </logentry>
+ <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
+ <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
+ <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:01+00:00</date>
+ <msg xml:space="preserve">merge</msg>
+ </logentry>
+ <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
+ <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:00+00:00</date>
+ <msg xml:space="preserve">new head</msg>
+ </logentry>
+ <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
+ <branch>foo</branch>
+ <author email="person">person</author>
+ <date>1970-01-17T04:53:20+00:00</date>
+ <msg xml:space="preserve">new branch</msg>
+ </logentry>
+ <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
+ <author email="person">person</author>
+ <date>1970-01-16T01:06:40+00:00</date>
+ <msg xml:space="preserve">no user, no domain</msg>
+ </logentry>
+ <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
+ <author email="other@place">other</author>
+ <date>1970-01-14T21:20:00+00:00</date>
+ <msg xml:space="preserve">no person</msg>
+ </logentry>
+ <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
+ <author email="other@place">A. N. Other</author>
+ <date>1970-01-13T17:33:20+00:00</date>
+ <msg xml:space="preserve">other 1
+ other 2
+
+ other 3</msg>
+ </logentry>
+ <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">line 1
+ line 2</msg>
+ </logentry>
+ </log>
+
+ $ hg log -v --style xml
+ <?xml version="1.0"?>
+ <log>
+ <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
+ <tag>tip</tag>
+ <author email="test">test</author>
+ <date>2020-01-01T10:01:00+00:00</date>
+ <msg xml:space="preserve">third</msg>
+ <paths>
+ <path action="A">fourth</path>
+ <path action="A">third</path>
+ <path action="R">second</path>
+ </paths>
+ <copies>
+ <copy source="second">fourth</copy>
+ </copies>
+ </logentry>
+ <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">second</msg>
+ <paths>
+ <path action="A">second</path>
+ </paths>
+ </logentry>
+ <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
+ <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
+ <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:01+00:00</date>
+ <msg xml:space="preserve">merge</msg>
+ <paths>
+ </paths>
+ </logentry>
+ <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
+ <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:00+00:00</date>
+ <msg xml:space="preserve">new head</msg>
+ <paths>
+ <path action="A">d</path>
+ </paths>
+ </logentry>
+ <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
+ <branch>foo</branch>
+ <author email="person">person</author>
+ <date>1970-01-17T04:53:20+00:00</date>
+ <msg xml:space="preserve">new branch</msg>
+ <paths>
+ </paths>
+ </logentry>
+ <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
+ <author email="person">person</author>
+ <date>1970-01-16T01:06:40+00:00</date>
+ <msg xml:space="preserve">no user, no domain</msg>
+ <paths>
+ <path action="M">c</path>
+ </paths>
+ </logentry>
+ <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
+ <author email="other@place">other</author>
+ <date>1970-01-14T21:20:00+00:00</date>
+ <msg xml:space="preserve">no person</msg>
+ <paths>
+ <path action="A">c</path>
+ </paths>
+ </logentry>
+ <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
+ <author email="other@place">A. N. Other</author>
+ <date>1970-01-13T17:33:20+00:00</date>
+ <msg xml:space="preserve">other 1
+ other 2
+
+ other 3</msg>
+ <paths>
+ <path action="A">b</path>
+ </paths>
+ </logentry>
+ <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">line 1
+ line 2</msg>
+ <paths>
+ <path action="A">a</path>
+ </paths>
+ </logentry>
+ </log>
+
+ $ hg log --debug --style xml
+ <?xml version="1.0"?>
+ <log>
+ <logentry revision="8" node="95c24699272ef57d062b8bccc32c878bf841784a">
+ <tag>tip</tag>
+ <parent revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="test">test</author>
+ <date>2020-01-01T10:01:00+00:00</date>
+ <msg xml:space="preserve">third</msg>
+ <paths>
+ <path action="A">fourth</path>
+ <path action="A">third</path>
+ <path action="R">second</path>
+ </paths>
+ <copies>
+ <copy source="second">fourth</copy>
+ </copies>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="7" node="29114dbae42b9f078cf2714dbe3a86bba8ec7453">
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">second</msg>
+ <paths>
+ <path action="A">second</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="6" node="d41e714fe50d9e4a5f11b4d595d543481b5f980b">
+ <parent revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f" />
+ <parent revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:01+00:00</date>
+ <msg xml:space="preserve">merge</msg>
+ <paths>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="5" node="13207e5a10d9fd28ec424934298e176197f2c67f">
+ <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="person">person</author>
+ <date>1970-01-18T08:40:00+00:00</date>
+ <msg xml:space="preserve">new head</msg>
+ <paths>
+ <path action="A">d</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="4" node="bbe44766e73d5f11ed2177f1838de10c53ef3e74">
+ <branch>foo</branch>
+ <parent revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="person">person</author>
+ <date>1970-01-17T04:53:20+00:00</date>
+ <msg xml:space="preserve">new branch</msg>
+ <paths>
+ </paths>
+ <extra key="branch">foo</extra>
+ </logentry>
+ <logentry revision="3" node="10e46f2dcbf4823578cf180f33ecf0b957964c47">
+ <parent revision="2" node="97054abb4ab824450e9164180baf491ae0078465" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="person">person</author>
+ <date>1970-01-16T01:06:40+00:00</date>
+ <msg xml:space="preserve">no user, no domain</msg>
+ <paths>
+ <path action="M">c</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="2" node="97054abb4ab824450e9164180baf491ae0078465">
+ <parent revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="other@place">other</author>
+ <date>1970-01-14T21:20:00+00:00</date>
+ <msg xml:space="preserve">no person</msg>
+ <paths>
+ <path action="A">c</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="1" node="b608e9d1a3f0273ccf70fb85fd6866b3482bf965">
+ <parent revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="other@place">A. N. Other</author>
+ <date>1970-01-13T17:33:20+00:00</date>
+ <msg xml:space="preserve">other 1
+ other 2
+
+ other 3</msg>
+ <paths>
+ <path action="A">b</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ <logentry revision="0" node="1e4e1b8f71e05681d422154f5421e385fec3454f">
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <parent revision="-1" node="0000000000000000000000000000000000000000" />
+ <author email="user@hostname">User Name</author>
+ <date>1970-01-12T13:46:40+00:00</date>
+ <msg xml:space="preserve">line 1
+ line 2</msg>
+ <paths>
+ <path action="A">a</path>
+ </paths>
+ <extra key="branch">default</extra>
+ </logentry>
+ </log>
+
+
+Error if style not readable:
+
+#if unix-permissions
+ $ touch q
+ $ chmod 0 q
+ $ hg log --style ./q
+ abort: Permission denied: ./q
+ [255]
+#endif
+
+Error if no style:
+
+ $ hg log --style notexist
+ abort: style not found: notexist
+ [255]
+
+Error if style missing key:
+
+ $ echo 'q = q' > t
+ $ hg log --style ./t
+ abort: "changeset" not in template map
+ [255]
+
+Error if include fails:
+
+ $ echo 'changeset = q' >> t
+#if unix-permissions
+ $ hg log --style ./t
+ abort: template file ./q: Permission denied
+ [255]
+ $ rm q
+#endif
+
+Include works:
+
+ $ echo '{rev}' > q
+ $ hg log --style ./t
+ 8
+ 7
+ 6
+ 5
+ 4
+ 3
+ 2
+ 1
+ 0
+
+ui.style works:
+
+ $ echo '[ui]' > .hg/hgrc
+ $ echo 'style = t' >> .hg/hgrc
+ $ hg log
+ 8
+ 7
+ 6
+ 5
+ 4
+ 3
+ 2
+ 1
+ 0
+
+
+Issue338:
+
+ $ hg log --style=changelog > changelog
+
+ $ cat changelog
+ 2020-01-01 test <test>
+
+ * fourth, second, third:
+ third
+ [95c24699272e] [tip]
+
+ 1970-01-12 User Name <user@hostname>
+
+ * second:
+ second
+ [29114dbae42b]
+
+ 1970-01-18 person <person>
+
+ * merge
+ [d41e714fe50d]
+
+ * d:
+ new head
+ [13207e5a10d9]
+
+ 1970-01-17 person <person>
+
+ * new branch
+ [bbe44766e73d] <foo>
+
+ 1970-01-16 person <person>
+
+ * c:
+ no user, no domain
+ [10e46f2dcbf4]
+
+ 1970-01-14 other <other@place>
+
+ * c:
+ no person
+ [97054abb4ab8]
+
+ 1970-01-13 A. N. Other <other@place>
+
+ * b:
+ other 1 other 2
+
+ other 3
+ [b608e9d1a3f0]
+
+ 1970-01-12 User Name <user@hostname>
+
+ * a:
+ line 1 line 2
+ [1e4e1b8f71e0]
+
+
+Issue2130: xml output for 'hg heads' is malformed
+
+ $ hg heads --style changelog
+ 2020-01-01 test <test>
+
+ * fourth, second, third:
+ third
+ [95c24699272e] [tip]
+
+ 1970-01-18 person <person>
+
+ * merge
+ [d41e714fe50d]
+
+ 1970-01-17 person <person>
+
+ * new branch
+ [bbe44766e73d] <foo>
+
+
+Keys work:
+
+ $ for key in author branch branches date desc file_adds file_dels file_mods \
+ > file_copies file_copies_switch files \
+ > manifest node parents rev tags diffstat extras; do
+ > for mode in '' --verbose --debug; do
+ > hg log $mode --template "$key$mode: {$key}\n"
+ > done
+ > done
+ author: test
+ author: User Name <user@hostname>
+ author: person
+ author: person
+ author: person
+ author: person
+ author: other@place
+ author: A. N. Other <other@place>
+ author: User Name <user@hostname>
+ author--verbose: test
+ author--verbose: User Name <user@hostname>
+ author--verbose: person
+ author--verbose: person
+ author--verbose: person
+ author--verbose: person
+ author--verbose: other@place
+ author--verbose: A. N. Other <other@place>
+ author--verbose: User Name <user@hostname>
+ author--debug: test
+ author--debug: User Name <user@hostname>
+ author--debug: person
+ author--debug: person
+ author--debug: person
+ author--debug: person
+ author--debug: other@place
+ author--debug: A. N. Other <other@place>
+ author--debug: User Name <user@hostname>
+ branch: default
+ branch: default
+ branch: default
+ branch: default
+ branch: foo
+ branch: default
+ branch: default
+ branch: default
+ branch: default
+ branch--verbose: default
+ branch--verbose: default
+ branch--verbose: default
+ branch--verbose: default
+ branch--verbose: foo
+ branch--verbose: default
+ branch--verbose: default
+ branch--verbose: default
+ branch--verbose: default
+ branch--debug: default
+ branch--debug: default
+ branch--debug: default
+ branch--debug: default
+ branch--debug: foo
+ branch--debug: default
+ branch--debug: default
+ branch--debug: default
+ branch--debug: default
+ branches:
+ branches:
+ branches:
+ branches:
+ branches: foo
+ branches:
+ branches:
+ branches:
+ branches:
+ branches--verbose:
+ branches--verbose:
+ branches--verbose:
+ branches--verbose:
+ branches--verbose: foo
+ branches--verbose:
+ branches--verbose:
+ branches--verbose:
+ branches--verbose:
+ branches--debug:
+ branches--debug:
+ branches--debug:
+ branches--debug:
+ branches--debug: foo
+ branches--debug:
+ branches--debug:
+ branches--debug:
+ branches--debug:
+ date: 1577872860.00
+ date: 1000000.00
+ date: 1500001.00
+ date: 1500000.00
+ date: 1400000.00
+ date: 1300000.00
+ date: 1200000.00
+ date: 1100000.00
+ date: 1000000.00
+ date--verbose: 1577872860.00
+ date--verbose: 1000000.00
+ date--verbose: 1500001.00
+ date--verbose: 1500000.00
+ date--verbose: 1400000.00
+ date--verbose: 1300000.00
+ date--verbose: 1200000.00
+ date--verbose: 1100000.00
+ date--verbose: 1000000.00
+ date--debug: 1577872860.00
+ date--debug: 1000000.00
+ date--debug: 1500001.00
+ date--debug: 1500000.00
+ date--debug: 1400000.00
+ date--debug: 1300000.00
+ date--debug: 1200000.00
+ date--debug: 1100000.00
+ date--debug: 1000000.00
+ desc: third
+ desc: second
+ desc: merge
+ desc: new head
+ desc: new branch
+ desc: no user, no domain
+ desc: no person
+ desc: other 1
+ other 2
+
+ other 3
+ desc: line 1
+ line 2
+ desc--verbose: third
+ desc--verbose: second
+ desc--verbose: merge
+ desc--verbose: new head
+ desc--verbose: new branch
+ desc--verbose: no user, no domain
+ desc--verbose: no person
+ desc--verbose: other 1
+ other 2
+
+ other 3
+ desc--verbose: line 1
+ line 2
+ desc--debug: third
+ desc--debug: second
+ desc--debug: merge
+ desc--debug: new head
+ desc--debug: new branch
+ desc--debug: no user, no domain
+ desc--debug: no person
+ desc--debug: other 1
+ other 2
+
+ other 3
+ desc--debug: line 1
+ line 2
+ file_adds: fourth third
+ file_adds: second
+ file_adds:
+ file_adds: d
+ file_adds:
+ file_adds:
+ file_adds: c
+ file_adds: b
+ file_adds: a
+ file_adds--verbose: fourth third
+ file_adds--verbose: second
+ file_adds--verbose:
+ file_adds--verbose: d
+ file_adds--verbose:
+ file_adds--verbose:
+ file_adds--verbose: c
+ file_adds--verbose: b
+ file_adds--verbose: a
+ file_adds--debug: fourth third
+ file_adds--debug: second
+ file_adds--debug:
+ file_adds--debug: d
+ file_adds--debug:
+ file_adds--debug:
+ file_adds--debug: c
+ file_adds--debug: b
+ file_adds--debug: a
+ file_dels: second
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels:
+ file_dels--verbose: second
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--verbose:
+ file_dels--debug: second
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_dels--debug:
+ file_mods:
+ file_mods:
+ file_mods:
+ file_mods:
+ file_mods:
+ file_mods: c
+ file_mods:
+ file_mods:
+ file_mods:
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--verbose: c
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--verbose:
+ file_mods--debug:
+ file_mods--debug:
+ file_mods--debug:
+ file_mods--debug:
+ file_mods--debug:
+ file_mods--debug: c
+ file_mods--debug:
+ file_mods--debug:
+ file_mods--debug:
+ file_copies: fourth (second)
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies:
+ file_copies--verbose: fourth (second)
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--verbose:
+ file_copies--debug: fourth (second)
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies--debug:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--verbose:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ file_copies_switch--debug:
+ files: fourth second third
+ files: second
+ files:
+ files: d
+ files:
+ files: c
+ files: c
+ files: b
+ files: a
+ files--verbose: fourth second third
+ files--verbose: second
+ files--verbose:
+ files--verbose: d
+ files--verbose:
+ files--verbose: c
+ files--verbose: c
+ files--verbose: b
+ files--verbose: a
+ files--debug: fourth second third
+ files--debug: second
+ files--debug:
+ files--debug: d
+ files--debug:
+ files--debug: c
+ files--debug: c
+ files--debug: b
+ files--debug: a
+ manifest: 6:94961b75a2da
+ manifest: 5:f2dbc354b94e
+ manifest: 4:4dc3def4f9b4
+ manifest: 4:4dc3def4f9b4
+ manifest: 3:cb5a1327723b
+ manifest: 3:cb5a1327723b
+ manifest: 2:6e0e82995c35
+ manifest: 1:4e8d705b1e53
+ manifest: 0:a0c8bcbbb45c
+ manifest--verbose: 6:94961b75a2da
+ manifest--verbose: 5:f2dbc354b94e
+ manifest--verbose: 4:4dc3def4f9b4
+ manifest--verbose: 4:4dc3def4f9b4
+ manifest--verbose: 3:cb5a1327723b
+ manifest--verbose: 3:cb5a1327723b
+ manifest--verbose: 2:6e0e82995c35
+ manifest--verbose: 1:4e8d705b1e53
+ manifest--verbose: 0:a0c8bcbbb45c
+ manifest--debug: 6:94961b75a2da554b4df6fb599e5bfc7d48de0c64
+ manifest--debug: 5:f2dbc354b94e5ec0b4f10680ee0cee816101d0bf
+ manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
+ manifest--debug: 4:4dc3def4f9b4c6e8de820f6ee74737f91e96a216
+ manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
+ manifest--debug: 3:cb5a1327723bada42f117e4c55a303246eaf9ccc
+ manifest--debug: 2:6e0e82995c35d0d57a52aca8da4e56139e06b4b1
+ manifest--debug: 1:4e8d705b1e53e3f9375e0e60dc7b525d8211fe55
+ manifest--debug: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
+ node: 95c24699272ef57d062b8bccc32c878bf841784a
+ node: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+ node: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+ node: 13207e5a10d9fd28ec424934298e176197f2c67f
+ node: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+ node: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+ node: 97054abb4ab824450e9164180baf491ae0078465
+ node: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+ node: 1e4e1b8f71e05681d422154f5421e385fec3454f
+ node--verbose: 95c24699272ef57d062b8bccc32c878bf841784a
+ node--verbose: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+ node--verbose: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+ node--verbose: 13207e5a10d9fd28ec424934298e176197f2c67f
+ node--verbose: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+ node--verbose: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+ node--verbose: 97054abb4ab824450e9164180baf491ae0078465
+ node--verbose: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+ node--verbose: 1e4e1b8f71e05681d422154f5421e385fec3454f
+ node--debug: 95c24699272ef57d062b8bccc32c878bf841784a
+ node--debug: 29114dbae42b9f078cf2714dbe3a86bba8ec7453
+ node--debug: d41e714fe50d9e4a5f11b4d595d543481b5f980b
+ node--debug: 13207e5a10d9fd28ec424934298e176197f2c67f
+ node--debug: bbe44766e73d5f11ed2177f1838de10c53ef3e74
+ node--debug: 10e46f2dcbf4823578cf180f33ecf0b957964c47
+ node--debug: 97054abb4ab824450e9164180baf491ae0078465
+ node--debug: b608e9d1a3f0273ccf70fb85fd6866b3482bf965
+ node--debug: 1e4e1b8f71e05681d422154f5421e385fec3454f
+ parents:
+ parents: -1:000000000000
+ parents: 5:13207e5a10d9 4:bbe44766e73d
+ parents: 3:10e46f2dcbf4
+ parents:
+ parents:
+ parents:
+ parents:
+ parents:
+ parents--verbose:
+ parents--verbose: -1:000000000000
+ parents--verbose: 5:13207e5a10d9 4:bbe44766e73d
+ parents--verbose: 3:10e46f2dcbf4
+ parents--verbose:
+ parents--verbose:
+ parents--verbose:
+ parents--verbose:
+ parents--verbose:
+ parents--debug: 7:29114dbae42b9f078cf2714dbe3a86bba8ec7453 -1:0000000000000000000000000000000000000000
+ parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
+ parents--debug: 5:13207e5a10d9fd28ec424934298e176197f2c67f 4:bbe44766e73d5f11ed2177f1838de10c53ef3e74
+ parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
+ parents--debug: 3:10e46f2dcbf4823578cf180f33ecf0b957964c47 -1:0000000000000000000000000000000000000000
+ parents--debug: 2:97054abb4ab824450e9164180baf491ae0078465 -1:0000000000000000000000000000000000000000
+ parents--debug: 1:b608e9d1a3f0273ccf70fb85fd6866b3482bf965 -1:0000000000000000000000000000000000000000
+ parents--debug: 0:1e4e1b8f71e05681d422154f5421e385fec3454f -1:0000000000000000000000000000000000000000
+ parents--debug: -1:0000000000000000000000000000000000000000 -1:0000000000000000000000000000000000000000
+ rev: 8
+ rev: 7
+ rev: 6
+ rev: 5
+ rev: 4
+ rev: 3
+ rev: 2
+ rev: 1
+ rev: 0
+ rev--verbose: 8
+ rev--verbose: 7
+ rev--verbose: 6
+ rev--verbose: 5
+ rev--verbose: 4
+ rev--verbose: 3
+ rev--verbose: 2
+ rev--verbose: 1
+ rev--verbose: 0
+ rev--debug: 8
+ rev--debug: 7
+ rev--debug: 6
+ rev--debug: 5
+ rev--debug: 4
+ rev--debug: 3
+ rev--debug: 2
+ rev--debug: 1
+ rev--debug: 0
+ tags: tip
+ tags:
+ tags:
+ tags:
+ tags:
+ tags:
+ tags:
+ tags:
+ tags:
+ tags--verbose: tip
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--verbose:
+ tags--debug: tip
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ tags--debug:
+ diffstat: 3: +2/-1
+ diffstat: 1: +1/-0
+ diffstat: 0: +0/-0
+ diffstat: 1: +1/-0
+ diffstat: 0: +0/-0
+ diffstat: 1: +1/-0
+ diffstat: 1: +4/-0
+ diffstat: 1: +2/-0
+ diffstat: 1: +1/-0
+ diffstat--verbose: 3: +2/-1
+ diffstat--verbose: 1: +1/-0
+ diffstat--verbose: 0: +0/-0
+ diffstat--verbose: 1: +1/-0
+ diffstat--verbose: 0: +0/-0
+ diffstat--verbose: 1: +1/-0
+ diffstat--verbose: 1: +4/-0
+ diffstat--verbose: 1: +2/-0
+ diffstat--verbose: 1: +1/-0
+ diffstat--debug: 3: +2/-1
+ diffstat--debug: 1: +1/-0
+ diffstat--debug: 0: +0/-0
+ diffstat--debug: 1: +1/-0
+ diffstat--debug: 0: +0/-0
+ diffstat--debug: 1: +1/-0
+ diffstat--debug: 1: +4/-0
+ diffstat--debug: 1: +2/-0
+ diffstat--debug: 1: +1/-0
+ extras: branch=default
+ extras: branch=default
+ extras: branch=default
+ extras: branch=default
+ extras: branch=foo
+ extras: branch=default
+ extras: branch=default
+ extras: branch=default
+ extras: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=foo
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--verbose: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=foo
+ extras--debug: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=default
+ extras--debug: branch=default
+
+
+Filters work:
+
+ $ hg log --template '{author|domain}\n'
+
+ hostname
+
+
+
+
+ place
+ place
+ hostname
+
+ $ hg log --template '{author|person}\n'
+ test
+ User Name
+ person
+ person
+ person
+ person
+ other
+ A. N. Other
+ User Name
+
+ $ hg log --template '{author|user}\n'
+ test
+ user
+ person
+ person
+ person
+ person
+ other
+ other
+ user
+
+ $ hg log --template '{date|date}\n'
+ Wed Jan 01 10:01:00 2020 +0000
+ Mon Jan 12 13:46:40 1970 +0000
+ Sun Jan 18 08:40:01 1970 +0000
+ Sun Jan 18 08:40:00 1970 +0000
+ Sat Jan 17 04:53:20 1970 +0000
+ Fri Jan 16 01:06:40 1970 +0000
+ Wed Jan 14 21:20:00 1970 +0000
+ Tue Jan 13 17:33:20 1970 +0000
+ Mon Jan 12 13:46:40 1970 +0000
+
+ $ hg log --template '{date|isodate}\n'
+ 2020-01-01 10:01 +0000
+ 1970-01-12 13:46 +0000
+ 1970-01-18 08:40 +0000
+ 1970-01-18 08:40 +0000
+ 1970-01-17 04:53 +0000
+ 1970-01-16 01:06 +0000
+ 1970-01-14 21:20 +0000
+ 1970-01-13 17:33 +0000
+ 1970-01-12 13:46 +0000
+
+ $ hg log --template '{date|isodatesec}\n'
+ 2020-01-01 10:01:00 +0000
+ 1970-01-12 13:46:40 +0000
+ 1970-01-18 08:40:01 +0000
+ 1970-01-18 08:40:00 +0000
+ 1970-01-17 04:53:20 +0000
+ 1970-01-16 01:06:40 +0000
+ 1970-01-14 21:20:00 +0000
+ 1970-01-13 17:33:20 +0000
+ 1970-01-12 13:46:40 +0000
+
+ $ hg log --template '{date|rfc822date}\n'
+ Wed, 01 Jan 2020 10:01:00 +0000
+ Mon, 12 Jan 1970 13:46:40 +0000
+ Sun, 18 Jan 1970 08:40:01 +0000
+ Sun, 18 Jan 1970 08:40:00 +0000
+ Sat, 17 Jan 1970 04:53:20 +0000
+ Fri, 16 Jan 1970 01:06:40 +0000
+ Wed, 14 Jan 1970 21:20:00 +0000
+ Tue, 13 Jan 1970 17:33:20 +0000
+ Mon, 12 Jan 1970 13:46:40 +0000
+
+ $ hg log --template '{desc|firstline}\n'
+ third
+ second
+ merge
+ new head
+ new branch
+ no user, no domain
+ no person
+ other 1
+ line 1
+
+ $ hg log --template '{node|short}\n'
+ 95c24699272e
+ 29114dbae42b
+ d41e714fe50d
+ 13207e5a10d9
+ bbe44766e73d
+ 10e46f2dcbf4
+ 97054abb4ab8
+ b608e9d1a3f0
+ 1e4e1b8f71e0
+
+ $ hg log --template '<changeset author="{author|xmlescape}"/>\n'
+ <changeset author="test"/>
+ <changeset author="User Name &lt;user@hostname&gt;"/>
+ <changeset author="person"/>
+ <changeset author="person"/>
+ <changeset author="person"/>
+ <changeset author="person"/>
+ <changeset author="other@place"/>
+ <changeset author="A. N. Other &lt;other@place&gt;"/>
+ <changeset author="User Name &lt;user@hostname&gt;"/>
+
+ $ hg log --template '{rev}: {children}\n'
+ 8:
+ 7: 8:95c24699272e
+ 6:
+ 5: 6:d41e714fe50d
+ 4: 6:d41e714fe50d
+ 3: 4:bbe44766e73d 5:13207e5a10d9
+ 2: 3:10e46f2dcbf4
+ 1: 2:97054abb4ab8
+ 0: 1:b608e9d1a3f0
+
+Formatnode filter works:
+
+ $ hg -q log -r 0 --template '{node|formatnode}\n'
+ 1e4e1b8f71e0
+
+ $ hg log -r 0 --template '{node|formatnode}\n'
+ 1e4e1b8f71e0
+
+ $ hg -v log -r 0 --template '{node|formatnode}\n'
+ 1e4e1b8f71e0
+
+ $ hg --debug log -r 0 --template '{node|formatnode}\n'
+ 1e4e1b8f71e05681d422154f5421e385fec3454f
+
+Age filter:
+
+ $ hg log --template '{date|age}\n' > /dev/null || exit 1
+
+ >>> from datetime import datetime
+ >>> fp = open('a', 'w')
+ >>> fp.write(str(datetime.now().year + 8) + '-01-01 00:00')
+ >>> fp.close()
+ $ hg add a
+ $ hg commit -m future -d "`cat a`"
+
+ $ hg log -l1 --template '{date|age}\n'
+ 7 years from now
+
+Error on syntax:
+
+ $ echo 'x = "f' >> t
+ $ hg log
+ abort: t:3: unmatched quotes
+ [255]
+
+ $ cd ..
+
+
+latesttag:
+
+ $ hg init latesttag
+ $ cd latesttag
+
+ $ echo a > file
+ $ hg ci -Am a -d '0 0'
+ adding file
+
+ $ echo b >> file
+ $ hg ci -m b -d '1 0'
+
+ $ echo c >> head1
+ $ hg ci -Am h1c -d '2 0'
+ adding head1
+
+ $ hg update -q 1
+ $ echo d >> head2
+ $ hg ci -Am h2d -d '3 0'
+ adding head2
+ created new head
+
+ $ echo e >> head2
+ $ hg ci -m h2e -d '4 0'
+
+ $ hg merge -q
+ $ hg ci -m merge -d '5 0'
+
+No tag set:
+
+ $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
+ 5: null+5
+ 4: null+4
+ 3: null+3
+ 2: null+3
+ 1: null+2
+ 0: null+1
+
+One common tag: longuest path wins:
+
+ $ hg tag -r 1 -m t1 -d '6 0' t1
+ $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
+ 6: t1+4
+ 5: t1+3
+ 4: t1+2
+ 3: t1+1
+ 2: t1+1
+ 1: t1+0
+ 0: null+1
+
+One ancestor tag: more recent wins:
+
+ $ hg tag -r 2 -m t2 -d '7 0' t2
+ $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
+ 7: t2+3
+ 6: t2+2
+ 5: t2+1
+ 4: t1+2
+ 3: t1+1
+ 2: t2+0
+ 1: t1+0
+ 0: null+1
+
+Two branch tags: more recent wins:
+
+ $ hg tag -r 3 -m t3 -d '8 0' t3
+ $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
+ 8: t3+5
+ 7: t3+4
+ 6: t3+3
+ 5: t3+2
+ 4: t3+1
+ 3: t3+0
+ 2: t2+0
+ 1: t1+0
+ 0: null+1
+
+Merged tag overrides:
+
+ $ hg tag -r 5 -m t5 -d '9 0' t5
+ $ hg tag -r 3 -m at3 -d '10 0' at3
+ $ hg log --template '{rev}: {latesttag}+{latesttagdistance}\n'
+ 10: t5+5
+ 9: t5+4
+ 8: t5+3
+ 7: t5+2
+ 6: t5+1
+ 5: t5+0
+ 4: at3:t3+1
+ 3: at3:t3+0
+ 2: t2+0
+ 1: t1+0
+ 0: null+1
+
+ $ cd ..
+
+
+Style path expansion: issue1948 - ui.style option doesn't work on OSX
+if it is a relative path
+
+ $ mkdir -p home/styles
+
+ $ cat > home/styles/teststyle <<EOF
+ > changeset = 'test {rev}:{node|short}\n'
+ > EOF
+
+ $ HOME=`pwd`/home; export HOME
+
+ $ cat > latesttag/.hg/hgrc <<EOF
+ > [ui]
+ > style = ~/styles/teststyle
+ > EOF
+
+ $ hg -R latesttag tip
+ test 10:dee8f28249af
+
+Test recursive showlist template (issue1989):
+
+ $ cat > style1989 <<EOF
+ > changeset = '{file_mods}{manifest}{extras}'
+ > file_mod = 'M|{author|person}\n'
+ > manifest = '{rev},{author}\n'
+ > extra = '{key}: {author}\n'
+ > EOF
+
+ $ hg -R latesttag log -r tip --style=style1989
+ M|test
+ 10,test
+ branch: test
+
diff --git a/tests/test-commandserver.py b/tests/test-commandserver.py
new file mode 100644
index 0000000..db6e76d
--- /dev/null
+++ b/tests/test-commandserver.py
@@ -0,0 +1,260 @@
+import sys, os, struct, subprocess, cStringIO, re, shutil
+
+def connect(path=None):
+ cmdline = ['hg', 'serve', '--cmdserver', 'pipe']
+ if path:
+ cmdline += ['-R', path]
+
+ server = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE)
+
+ return server
+
+def writeblock(server, data):
+ server.stdin.write(struct.pack('>I', len(data)))
+ server.stdin.write(data)
+ server.stdin.flush()
+
+def readchannel(server):
+ data = server.stdout.read(5)
+ if not data:
+ raise EOFError
+ channel, length = struct.unpack('>cI', data)
+ if channel in 'IL':
+ return channel, length
+ else:
+ return channel, server.stdout.read(length)
+
+def runcommand(server, args, output=sys.stdout, error=sys.stderr, input=None):
+ print ' runcommand', ' '.join(args)
+ sys.stdout.flush()
+ server.stdin.write('runcommand\n')
+ writeblock(server, '\0'.join(args))
+
+ if not input:
+ input = cStringIO.StringIO()
+
+ while True:
+ ch, data = readchannel(server)
+ if ch == 'o':
+ output.write(data)
+ output.flush()
+ elif ch == 'e':
+ error.write(data)
+ error.flush()
+ elif ch == 'I':
+ writeblock(server, input.read(data))
+ elif ch == 'L':
+ writeblock(server, input.readline(data))
+ elif ch == 'r':
+ return struct.unpack('>i', data)[0]
+ else:
+ print "unexpected channel %c: %r" % (ch, data)
+ if ch.isupper():
+ return
+
+def check(func, repopath=None):
+ print
+ print 'testing %s:' % func.__name__
+ print
+ sys.stdout.flush()
+ server = connect(repopath)
+ try:
+ return func(server)
+ finally:
+ server.stdin.close()
+ server.wait()
+
+def unknowncommand(server):
+ server.stdin.write('unknowncommand\n')
+
+def hellomessage(server):
+ ch, data = readchannel(server)
+ # escaping python tests output not supported
+ print '%c, %r' % (ch, re.sub('encoding: [a-zA-Z0-9-]+', 'encoding: ***',
+ data))
+
+ # run an arbitrary command to make sure the next thing the server sends
+ # isn't part of the hello message
+ runcommand(server, ['id'])
+
+def checkruncommand(server):
+ # hello block
+ readchannel(server)
+
+ # no args
+ runcommand(server, [])
+
+ # global options
+ runcommand(server, ['id', '--quiet'])
+
+ # make sure global options don't stick through requests
+ runcommand(server, ['id'])
+
+ # --config
+ runcommand(server, ['id', '--config', 'ui.quiet=True'])
+
+ # make sure --config doesn't stick
+ runcommand(server, ['id'])
+
+def inputeof(server):
+ readchannel(server)
+ server.stdin.write('runcommand\n')
+ # close stdin while server is waiting for input
+ server.stdin.close()
+
+ # server exits with 1 if the pipe closed while reading the command
+ print 'server exit code =', server.wait()
+
+def serverinput(server):
+ readchannel(server)
+
+ patch = """
+# HG changeset patch
+# User test
+# Date 0 0
+# Node ID c103a3dec114d882c98382d684d8af798d09d857
+# Parent 0000000000000000000000000000000000000000
+1
+
+diff -r 000000000000 -r c103a3dec114 a
+--- /dev/null Thu Jan 01 00:00:00 1970 +0000
++++ b/a Thu Jan 01 00:00:00 1970 +0000
+@@ -0,0 +1,1 @@
++1
+"""
+
+ runcommand(server, ['import', '-'], input=cStringIO.StringIO(patch))
+ runcommand(server, ['log'])
+
+def cwd(server):
+ """ check that --cwd doesn't persist between requests """
+ readchannel(server)
+ os.mkdir('foo')
+ f = open('foo/bar', 'wb')
+ f.write('a')
+ f.close()
+ runcommand(server, ['--cwd', 'foo', 'st', 'bar'])
+ runcommand(server, ['st', 'foo/bar'])
+ os.remove('foo/bar')
+
+def localhgrc(server):
+ """ check that local configs for the cached repo aren't inherited when -R
+ is used """
+ readchannel(server)
+
+ # the cached repo local hgrc contains ui.foo=bar, so showconfig should
+ # show it
+ runcommand(server, ['showconfig'])
+
+ # but not for this repo
+ runcommand(server, ['init', 'foo'])
+ runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults'])
+ shutil.rmtree('foo')
+
+def hook(**args):
+ print 'hook talking'
+ print 'now try to read something: %r' % sys.stdin.read()
+
+def hookoutput(server):
+ readchannel(server)
+ runcommand(server, ['--config',
+ 'hooks.pre-identify=python:test-commandserver.hook',
+ 'id'],
+ input=cStringIO.StringIO('some input'))
+
+def outsidechanges(server):
+ readchannel(server)
+ f = open('a', 'ab')
+ f.write('a\n')
+ f.close()
+ runcommand(server, ['status'])
+ os.system('hg ci -Am2')
+ runcommand(server, ['tip'])
+ runcommand(server, ['status'])
+
+def bookmarks(server):
+ readchannel(server)
+ runcommand(server, ['bookmarks'])
+
+ # changes .hg/bookmarks
+ os.system('hg bookmark -i bm1')
+ os.system('hg bookmark -i bm2')
+ runcommand(server, ['bookmarks'])
+
+ # changes .hg/bookmarks.current
+ os.system('hg upd bm1 -q')
+ runcommand(server, ['bookmarks'])
+
+ runcommand(server, ['bookmarks', 'bm3'])
+ f = open('a', 'ab')
+ f.write('a\n')
+ f.close()
+ runcommand(server, ['commit', '-Amm'])
+ runcommand(server, ['bookmarks'])
+
+def tagscache(server):
+ readchannel(server)
+ runcommand(server, ['id', '-t', '-r', '0'])
+ os.system('hg tag -r 0 foo')
+ runcommand(server, ['id', '-t', '-r', '0'])
+
+def setphase(server):
+ readchannel(server)
+ runcommand(server, ['phase', '-r', '.'])
+ os.system('hg phase -r . -p')
+ runcommand(server, ['phase', '-r', '.'])
+
+def rollback(server):
+ readchannel(server)
+ runcommand(server, ['phase', '-r', '.', '-p'])
+ f = open('a', 'ab')
+ f.write('a\n')
+ f.close()
+ runcommand(server, ['commit', '-Am.'])
+ runcommand(server, ['rollback'])
+ runcommand(server, ['phase', '-r', '.'])
+
+def branch(server):
+ readchannel(server)
+ runcommand(server, ['branch'])
+ os.system('hg branch foo')
+ runcommand(server, ['branch'])
+ os.system('hg branch default')
+
+def hgignore(server):
+ readchannel(server)
+ f = open('.hgignore', 'ab')
+ f.write('')
+ f.close()
+ runcommand(server, ['commit', '-Am.'])
+ f = open('ignored-file', 'ab')
+ f.write('')
+ f.close()
+ f = open('.hgignore', 'ab')
+ f.write('ignored-file')
+ f.close()
+ runcommand(server, ['status', '-i', '-u'])
+
+if __name__ == '__main__':
+ os.system('hg init')
+
+ check(hellomessage)
+ check(unknowncommand)
+ check(checkruncommand)
+ check(inputeof)
+ check(serverinput)
+ check(cwd)
+
+ hgrc = open('.hg/hgrc', 'a')
+ hgrc.write('[ui]\nfoo=bar\n')
+ hgrc.close()
+ check(localhgrc)
+ check(hookoutput)
+ check(outsidechanges)
+ check(bookmarks)
+ check(tagscache)
+ check(setphase)
+ check(rollback)
+ check(branch)
+ check(hgignore)
diff --git a/tests/test-commandserver.py.out b/tests/test-commandserver.py.out
new file mode 100644
index 0000000..054ba6c
--- /dev/null
+++ b/tests/test-commandserver.py.out
@@ -0,0 +1,165 @@
+
+testing hellomessage:
+
+o, 'capabilities: getencoding runcommand\nencoding: ***'
+ runcommand id
+000000000000 tip
+
+testing unknowncommand:
+
+abort: unknown command unknowncommand
+
+testing checkruncommand:
+
+ runcommand
+Mercurial Distributed SCM
+
+basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+use "hg help" for the full list of commands or "hg -v" for details
+ runcommand id --quiet
+000000000000
+ runcommand id
+000000000000 tip
+ runcommand id --config ui.quiet=True
+000000000000
+ runcommand id
+000000000000 tip
+
+testing inputeof:
+
+server exit code = 1
+
+testing serverinput:
+
+ runcommand import -
+applying patch from stdin
+ runcommand log
+changeset: 0:eff892de26ec
+tag: tip
+user: test
+date: Thu Jan 01 00:00:00 1970 +0000
+summary: 1
+
+
+testing cwd:
+
+ runcommand --cwd foo st bar
+? bar
+ runcommand st foo/bar
+? foo/bar
+
+testing localhgrc:
+
+ runcommand showconfig
+bundle.mainreporoot=$TESTTMP
+defaults.backout=-d "0 0"
+defaults.commit=-d "0 0"
+defaults.tag=-d "0 0"
+ui.slash=True
+ui.foo=bar
+ runcommand init foo
+ runcommand -R foo showconfig ui defaults
+defaults.backout=-d "0 0"
+defaults.commit=-d "0 0"
+defaults.tag=-d "0 0"
+ui.slash=True
+
+testing hookoutput:
+
+ runcommand --config hooks.pre-identify=python:test-commandserver.hook id
+hook talking
+now try to read something: 'some input'
+eff892de26ec tip
+
+testing outsidechanges:
+
+ runcommand status
+M a
+ runcommand tip
+changeset: 1:d3a0a68be6de
+tag: tip
+user: test
+date: Thu Jan 01 00:00:00 1970 +0000
+summary: 2
+
+ runcommand status
+
+testing bookmarks:
+
+ runcommand bookmarks
+no bookmarks set
+ runcommand bookmarks
+ bm1 1:d3a0a68be6de
+ bm2 1:d3a0a68be6de
+ runcommand bookmarks
+ * bm1 1:d3a0a68be6de
+ bm2 1:d3a0a68be6de
+ runcommand bookmarks bm3
+ runcommand commit -Amm
+ runcommand bookmarks
+ bm1 1:d3a0a68be6de
+ bm2 1:d3a0a68be6de
+ * bm3 2:aef17e88f5f0
+
+testing tagscache:
+
+ runcommand id -t -r 0
+
+ runcommand id -t -r 0
+foo
+
+testing setphase:
+
+ runcommand phase -r .
+3: draft
+ runcommand phase -r .
+3: public
+
+testing rollback:
+
+ runcommand phase -r . -p
+no phases changed
+ runcommand commit -Am.
+ runcommand rollback
+repository tip rolled back to revision 3 (undo commit)
+working directory now based on revision 3
+ runcommand phase -r .
+3: public
+
+testing branch:
+
+ runcommand branch
+default
+marked working directory as branch foo
+(branches are permanent and global, did you want a bookmark?)
+ runcommand branch
+foo
+marked working directory as branch default
+(branches are permanent and global, did you want a bookmark?)
+
+testing hgignore:
+
+ runcommand commit -Am.
+adding .hgignore
+ runcommand status -i -u
+I ignored-file
diff --git a/tests/test-commit-amend.t b/tests/test-commit-amend.t
new file mode 100644
index 0000000..8550fb5
--- /dev/null
+++ b/tests/test-commit-amend.t
@@ -0,0 +1,357 @@
+ $ hg init
+
+Setup:
+
+ $ echo a >> a
+ $ hg ci -Am 'base'
+ adding a
+
+Refuse to amend public csets:
+
+ $ hg phase -r . -p
+ $ hg ci --amend
+ abort: cannot amend public changesets
+ [255]
+ $ hg phase -r . -f -d
+
+ $ echo a >> a
+ $ hg ci -Am 'base1'
+
+Nothing to amend:
+
+ $ hg ci --amend
+ nothing changed
+ [1]
+
+ $ cat >> $HGRCPATH <<EOF
+ > [hooks]
+ > pretxncommit.foo = sh -c "echo \"pretxncommit \$HG_NODE\"; hg id -r \$HG_NODE"
+ > EOF
+
+Amending changeset with changes in working dir:
+
+ $ echo a >> a
+ $ hg ci --amend -m 'amend base1'
+ pretxncommit 9cd25b479c51be2f4ed2c38e7abdf7ce67d8e0dc
+ 9cd25b479c51 tip
+ saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-amend-backup.hg (glob)
+ $ echo 'pretxncommit.foo = ' >> $HGRCPATH
+ $ hg diff -c .
+ diff -r ad120869acf0 -r 9cd25b479c51 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,3 @@
+ a
+ +a
+ +a
+ $ hg log
+ changeset: 1:9cd25b479c51
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: amend base1
+
+ changeset: 0:ad120869acf0
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: base
+
+
+Add new file:
+
+ $ echo b > b
+ $ hg ci --amend -Am 'amend base1 new file'
+ adding b
+ saved backup bundle to $TESTTMP/.hg/strip-backup/9cd25b479c51-amend-backup.hg (glob)
+
+Remove file that was added in amended commit:
+
+ $ hg rm b
+ $ hg ci --amend -m 'amend base1 remove new file'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/e2bb3ecffd2f-amend-backup.hg (glob)
+
+ $ hg cat b
+ b: no such file in rev 664a9b2d60cd
+ [1]
+
+No changes, just a different message:
+
+ $ hg ci -v --amend -m 'no changes, new message'
+ amending changeset 664a9b2d60cd
+ copying changeset 664a9b2d60cd to ad120869acf0
+ a
+ stripping amended changeset 664a9b2d60cd
+ 1 changesets found
+ saved backup bundle to $TESTTMP/.hg/strip-backup/664a9b2d60cd-amend-backup.hg (glob)
+ 1 changesets found
+ adding branch
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ committed changeset 1:ea6e356ff2ad
+ $ hg diff -c .
+ diff -r ad120869acf0 -r ea6e356ff2ad a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,3 @@
+ a
+ +a
+ +a
+ $ hg log
+ changeset: 1:ea6e356ff2ad
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: no changes, new message
+
+ changeset: 0:ad120869acf0
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: base
+
+
+Disable default date on commit so when -d isn't given, the old date is preserved:
+
+ $ echo '[defaults]' >> $HGRCPATH
+ $ echo 'commit=' >> $HGRCPATH
+
+Test -u/-d:
+
+ $ hg ci --amend -u foo -d '1 0'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/ea6e356ff2ad-amend-backup.hg (glob)
+ $ echo a >> a
+ $ hg ci --amend -u foo -d '1 0'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/377b91ce8b56-amend-backup.hg (glob)
+ $ hg log -r .
+ changeset: 1:2c94e4a5756f
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: no changes, new message
+
+
+Open editor with old commit message if a message isn't given otherwise:
+
+ $ cat > editor.sh << '__EOF__'
+ > #!/bin/sh
+ > cat $1
+ > echo "another precious commit message" > "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
+ amending changeset 2c94e4a5756f
+ copying changeset 2c94e4a5756f to ad120869acf0
+ no changes, new message
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: foo
+ HG: branch 'default'
+ HG: changed a
+ a
+ stripping amended changeset 2c94e4a5756f
+ 1 changesets found
+ saved backup bundle to $TESTTMP/.hg/strip-backup/2c94e4a5756f-amend-backup.hg (glob)
+ 1 changesets found
+ adding branch
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ committed changeset 1:ffb49186f961
+
+Same, but with changes in working dir (different code path):
+
+ $ echo a >> a
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
+ amending changeset ffb49186f961
+ another precious commit message
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: foo
+ HG: branch 'default'
+ HG: changed a
+ a
+ copying changeset 27f3aacd3011 to ad120869acf0
+ a
+ stripping intermediate changeset 27f3aacd3011
+ stripping amended changeset ffb49186f961
+ 2 changesets found
+ saved backup bundle to $TESTTMP/.hg/strip-backup/ffb49186f961-amend-backup.hg (glob)
+ 1 changesets found
+ adding branch
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ committed changeset 1:fb6cca43446f
+
+ $ rm editor.sh
+ $ hg log -r .
+ changeset: 1:fb6cca43446f
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: another precious commit message
+
+
+Moving bookmarks, preserve active bookmark:
+
+ $ hg book book1
+ $ hg book book2
+ $ hg ci --amend -m 'move bookmarks'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/fb6cca43446f-amend-backup.hg (glob)
+ $ hg book
+ book1 1:0cf1c7a51bcf
+ * book2 1:0cf1c7a51bcf
+ $ echo a >> a
+ $ hg ci --amend -m 'move bookmarks'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/0cf1c7a51bcf-amend-backup.hg (glob)
+ $ hg book
+ book1 1:7344472bd951
+ * book2 1:7344472bd951
+
+ $ echo '[defaults]' >> $HGRCPATH
+ $ echo "commit=-d '0 0'" >> $HGRCPATH
+
+Moving branches:
+
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >> a
+ $ hg ci -m 'branch foo'
+ $ hg branch default -f
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci --amend -m 'back to default'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/1661ca36a2db-amend-backup.hg (glob)
+ $ hg branches
+ default 2:f24ee5961967
+
+Close branch:
+
+ $ hg up -q 0
+ $ echo b >> b
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Am 'fork'
+ adding b
+ $ echo b >> b
+ $ hg ci -mb
+ $ hg ci --amend --close-branch -m 'closing branch foo'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-amend-backup.hg (glob)
+
+Same thing, different code path:
+
+ $ echo b >> b
+ $ hg ci -m 'reopen branch'
+ reopening closed branch head 4
+ $ echo b >> b
+ $ hg ci --amend --close-branch
+ saved backup bundle to $TESTTMP/.hg/strip-backup/5e302dcc12b8-amend-backup.hg (glob)
+ $ hg branches
+ default 2:f24ee5961967
+
+Refuse to amend merges:
+
+ $ hg up -q default
+ $ hg merge foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci --amend
+ abort: cannot amend while merging
+ [255]
+ $ hg ci -m 'merge'
+ $ hg ci --amend
+ abort: cannot amend merge changesets
+ [255]
+
+Follow copies/renames:
+
+ $ hg mv b c
+ $ hg ci -m 'b -> c'
+ $ hg mv c d
+ $ hg ci --amend -m 'b -> d'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/9c207120aa98-amend-backup.hg (glob)
+ $ hg st --rev '.^' --copies d
+ A d
+ b
+ $ hg cp d e
+ $ hg ci -m 'e = d'
+ $ hg cp e f
+ $ hg ci --amend -m 'f = d'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/fda2b3b27b22-amend-backup.hg (glob)
+ $ hg st --rev '.^' --copies f
+ A f
+ d
+
+ $ mv f f.orig
+ $ hg rm -A f
+ $ hg ci -m removef
+ $ hg cp a f
+ $ mv f.orig f
+ $ hg ci --amend -m replacef
+ saved backup bundle to $TESTTMP/.hg/strip-backup/20a7413547f9-amend-backup.hg (glob)
+ $ hg st --change . --copies
+ $ hg log -r . --template "{file_copies}\n"
+
+
+Move added file (issue3410):
+
+ $ echo g >> g
+ $ hg ci -Am g
+ adding g
+ $ hg mv g h
+ $ hg ci --amend
+ saved backup bundle to $TESTTMP/.hg/strip-backup/5daa77a5d616-amend-backup.hg (glob)
+ $ hg st --change . --copies h
+ A h
+ $ hg log -r . --template "{file_copies}\n"
+
+
+Can't rollback an amend:
+
+ $ hg rollback
+ no rollback information available
+ [1]
+
+Preserve extra dict (issue3430):
+
+ $ hg branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >> a
+ $ hg ci -ma
+ $ hg ci --amend -m "a'"
+ saved backup bundle to $TESTTMP/.hg/strip-backup/167f8e3031df-amend-backup.hg (glob)
+ $ hg log -r . --template "{branch}\n"
+ a
+ $ hg ci --amend -m "a''"
+ saved backup bundle to $TESTTMP/.hg/strip-backup/ceac1a44c806-amend-backup.hg (glob)
+ $ hg log -r . --template "{branch}\n"
+ a
+
+Also preserve other entries in the dict that are in the old commit,
+first graft something so there's an additional entry:
+
+ $ hg up 0 -q
+ $ echo z > z
+ $ hg ci -Am 'fork'
+ adding z
+ created new head
+ $ hg up 11
+ 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg graft 12
+ grafting revision 12
+ $ hg ci --amend -m 'graft amend'
+ saved backup bundle to $TESTTMP/.hg/strip-backup/18a5124daf7a-amend-backup.hg (glob)
+ $ hg log -r . --debug | grep extra
+ extra: branch=a
+ extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
diff --git a/tests/test-commit-multiple.t b/tests/test-commit-multiple.t
new file mode 100644
index 0000000..3337b76
--- /dev/null
+++ b/tests/test-commit-multiple.t
@@ -0,0 +1,133 @@
+# reproduce issue2264, issue2516
+
+create test repo
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > transplant =
+ > graphlog =
+ > EOF
+ $ hg init repo
+ $ cd repo
+ $ template="{rev} {desc|firstline} [{branch}]\n"
+
+# we need to start out with two changesets on the default branch
+# in order to avoid the cute little optimization where transplant
+# pulls rather than transplants
+add initial changesets
+ $ echo feature1 > file1
+ $ hg ci -Am"feature 1"
+ adding file1
+ $ echo feature2 >> file2
+ $ hg ci -Am"feature 2"
+ adding file2
+
+# The changes to 'bugfix' are enough to show the bug: in fact, with only
+# those changes, it's a very noisy crash ("RuntimeError: nothing
+# committed after transplant"). But if we modify a second file in the
+# transplanted changesets, the bug is much more subtle: transplant
+# silently drops the second change to 'bugfix' on the floor, and we only
+# see it when we run 'hg status' after transplanting. Subtle data loss
+# bugs are worse than crashes, so reproduce the subtle case here.
+commit bug fixes on bug fix branch
+ $ hg branch fixes
+ marked working directory as branch fixes
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo fix1 > bugfix
+ $ echo fix1 >> file1
+ $ hg ci -Am"fix 1"
+ adding bugfix
+ $ echo fix2 > bugfix
+ $ echo fix2 >> file1
+ $ hg ci -Am"fix 2"
+ $ hg glog --template="$template"
+ @ 3 fix 2 [fixes]
+ |
+ o 2 fix 1 [fixes]
+ |
+ o 1 feature 2 [default]
+ |
+ o 0 feature 1 [default]
+
+transplant bug fixes onto release branch
+ $ hg update 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg branch release
+ marked working directory as branch release
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg transplant 2 3
+ applying [0-9a-f]{12} (re)
+ [0-9a-f]{12} transplanted to [0-9a-f]{12} (re)
+ applying [0-9a-f]{12} (re)
+ [0-9a-f]{12} transplanted to [0-9a-f]{12} (re)
+ $ hg glog --template="$template"
+ @ 5 fix 2 [release]
+ |
+ o 4 fix 1 [release]
+ |
+ | o 3 fix 2 [fixes]
+ | |
+ | o 2 fix 1 [fixes]
+ | |
+ | o 1 feature 2 [default]
+ |/
+ o 0 feature 1 [default]
+
+ $ hg status
+ $ hg status --rev 0:4
+ M file1
+ A bugfix
+ $ hg status --rev 4:5
+ M bugfix
+ M file1
+
+now test that we fixed the bug for all scripts/extensions
+ $ cat > $TESTTMP/committwice.py <<__EOF__
+ > from mercurial import ui, hg, match, node
+ > from time import sleep
+ >
+ > def replacebyte(fn, b):
+ > f = open(fn, "rb+")
+ > f.seek(0, 0)
+ > f.write(b)
+ > f.close()
+ >
+ > def printfiles(repo, rev):
+ > print "revision %s files: %s" % (rev, repo[rev].files())
+ >
+ > repo = hg.repository(ui.ui(), '.')
+ > assert len(repo) == 6, \
+ > "initial: len(repo): %d, expected: 6" % len(repo)
+ >
+ > replacebyte("bugfix", "u")
+ > sleep(2)
+ > try:
+ > print "PRE: len(repo): %d" % len(repo)
+ > wlock = repo.wlock()
+ > lock = repo.lock()
+ > replacebyte("file1", "x")
+ > repo.commit(text="x", user="test", date=(0, 0))
+ > replacebyte("file1", "y")
+ > repo.commit(text="y", user="test", date=(0, 0))
+ > print "POST: len(repo): %d" % len(repo)
+ > finally:
+ > lock.release()
+ > wlock.release()
+ > printfiles(repo, 6)
+ > printfiles(repo, 7)
+ > __EOF__
+ $ $PYTHON $TESTTMP/committwice.py
+ PRE: len(repo): 6
+ POST: len(repo): 8
+ revision 6 files: ['bugfix', 'file1']
+ revision 7 files: ['file1']
+
+Do a size-preserving modification outside of that process
+ $ echo abcd > bugfix
+ $ hg status
+ M bugfix
+ $ hg log --template "{rev} {desc} {files}\n" -r5:
+ 5 fix 2 bugfix file1
+ 6 x bugfix file1
+ 7 y file1
+
+ $ cd ..
diff --git a/tests/test-commit-unresolved.t b/tests/test-commit-unresolved.t
new file mode 100644
index 0000000..70a3300
--- /dev/null
+++ b/tests/test-commit-unresolved.t
@@ -0,0 +1,49 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+ $ addcommit () {
+ > echo $1 > $1
+ > hg add $1
+ > hg commit -d "${2} 0" -m $1
+ > }
+
+ $ commit () {
+ > hg commit -d "${2} 0" -m $1
+ > }
+
+ $ hg init a
+ $ cd a
+ $ addcommit "A" 0
+ $ addcommit "B" 1
+ $ echo "C" >> A
+ $ commit "C" 2
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo "D" >> A
+ $ commit "D" 3
+ created new head
+
+Merging a conflict araises
+
+ $ hg merge
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+Correct the conflict without marking the file as resolved
+
+ $ echo "ABCD" > A
+ $ hg commit -m "Merged"
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+
+Mark the conflict as resolved and commit
+
+ $ hg resolve -m A
+ $ hg commit -m "Merged"
+
+ $ cd ..
diff --git a/tests/test-commit.t b/tests/test-commit.t
new file mode 100644
index 0000000..21fd277
--- /dev/null
+++ b/tests/test-commit.t
@@ -0,0 +1,307 @@
+commit date test
+
+ $ hg init test
+ $ cd test
+ $ echo foo > foo
+ $ hg add foo
+ $ HGEDITOR=true hg commit -m ""
+ abort: empty commit message
+ [255]
+ $ hg commit -d '0 0' -m commit-1
+ $ echo foo >> foo
+ $ hg commit -d '1 4444444' -m commit-3
+ abort: impossible time zone offset: 4444444
+ [255]
+ $ hg commit -d '1 15.1' -m commit-4
+ abort: invalid date: '1\t15.1'
+ [255]
+ $ hg commit -d 'foo bar' -m commit-5
+ abort: invalid date: 'foo bar'
+ [255]
+ $ hg commit -d ' 1 4444' -m commit-6
+ $ hg commit -d '111111111111 0' -m commit-7
+ abort: date exceeds 32 bits: 111111111111
+ [255]
+ $ hg commit -d '-7654321 3600' -m commit-7
+ abort: negative date value: -7654321
+ [255]
+
+commit added file that has been deleted
+
+ $ echo bar > bar
+ $ hg add bar
+ $ rm bar
+ $ hg commit -m commit-8
+ nothing changed (1 missing files, see 'hg status')
+ [1]
+ $ hg commit -m commit-8-2 bar
+ abort: bar: file not found!
+ [255]
+
+ $ hg -q revert -a --no-backup
+
+ $ mkdir dir
+ $ echo boo > dir/file
+ $ hg add
+ adding dir/file (glob)
+ $ hg -v commit -m commit-9 dir
+ dir/file
+ committed changeset 2:d2a76177cb42
+
+ $ echo > dir.file
+ $ hg add
+ adding dir.file
+ $ hg commit -m commit-10 dir dir.file
+ abort: dir: no match under directory!
+ [255]
+
+ $ echo >> dir/file
+ $ mkdir bleh
+ $ mkdir dir2
+ $ cd bleh
+ $ hg commit -m commit-11 .
+ abort: bleh: no match under directory!
+ [255]
+ $ hg commit -m commit-12 ../dir ../dir2
+ abort: dir2: no match under directory!
+ [255]
+ $ hg -v commit -m commit-13 ../dir
+ dir/file
+ committed changeset 3:1cd62a2d8db5
+ $ cd ..
+
+ $ hg commit -m commit-14 does-not-exist
+ abort: does-not-exist: * (glob)
+ [255]
+
+#if symlink
+ $ ln -s foo baz
+ $ hg commit -m commit-15 baz
+ abort: baz: file not tracked!
+ [255]
+#endif
+
+ $ touch quux
+ $ hg commit -m commit-16 quux
+ abort: quux: file not tracked!
+ [255]
+ $ echo >> dir/file
+ $ hg -v commit -m commit-17 dir/file
+ dir/file
+ committed changeset 4:49176991390e
+
+An empty date was interpreted as epoch origin
+
+ $ echo foo >> foo
+ $ hg commit -d '' -m commit-no-date
+ $ hg tip --template '{date|isodate}\n' | grep '1970'
+ [1]
+
+Make sure we do not obscure unknown requires file entries (issue2649)
+
+ $ echo foo >> foo
+ $ echo fake >> .hg/requires
+ $ hg commit -m bla
+ abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
+ [255]
+
+ $ cd ..
+
+
+partial subdir commit test
+
+ $ hg init test2
+ $ cd test2
+ $ mkdir foo
+ $ echo foo > foo/foo
+ $ mkdir bar
+ $ echo bar > bar/bar
+ $ hg add
+ adding bar/bar (glob)
+ adding foo/foo (glob)
+ $ hg ci -m commit-subdir-1 foo
+ $ hg ci -m commit-subdir-2 bar
+
+subdir log 1
+
+ $ hg log -v foo
+ changeset: 0:f97e73a25882
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: foo/foo
+ description:
+ commit-subdir-1
+
+
+
+subdir log 2
+
+ $ hg log -v bar
+ changeset: 1:aa809156d50d
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: bar/bar
+ description:
+ commit-subdir-2
+
+
+
+full log
+
+ $ hg log -v
+ changeset: 1:aa809156d50d
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: bar/bar
+ description:
+ commit-subdir-2
+
+
+ changeset: 0:f97e73a25882
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: foo/foo
+ description:
+ commit-subdir-1
+
+
+ $ cd ..
+
+
+dot and subdir commit test
+
+ $ hg init test3
+ $ cd test3
+ $ mkdir foo
+ $ echo foo content > foo/plain-file
+ $ hg add foo/plain-file
+ $ hg ci -m commit-foo-subdir foo
+ $ echo modified foo content > foo/plain-file
+ $ hg ci -m commit-foo-dot .
+
+full log
+
+ $ hg log -v
+ changeset: 1:95b38e3a5b2e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: foo/plain-file
+ description:
+ commit-foo-dot
+
+
+ changeset: 0:65d4e9386227
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: foo/plain-file
+ description:
+ commit-foo-subdir
+
+
+
+subdir log
+
+ $ cd foo
+ $ hg log .
+ changeset: 1:95b38e3a5b2e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-foo-dot
+
+ changeset: 0:65d4e9386227
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-foo-subdir
+
+ $ cd ..
+ $ cd ..
+
+Issue1049: Hg permits partial commit of merge without warning
+
+ $ hg init issue1049
+ $ cd issue1049
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ echo a >> a
+ $ hg ci -mb
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b >> a
+ $ hg ci -mc
+ created new head
+ $ HGMERGE=true hg merge
+ merging a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+should fail because we are specifying a file name
+
+ $ hg ci -mmerge a
+ abort: cannot partially commit a merge (do not specify files or patterns)
+ [255]
+
+should fail because we are specifying a pattern
+
+ $ hg ci -mmerge -I a
+ abort: cannot partially commit a merge (do not specify files or patterns)
+ [255]
+
+should succeed
+
+ $ hg ci -mmerge
+ $ cd ..
+
+
+test commit message content
+
+ $ hg init commitmsg
+ $ cd commitmsg
+ $ echo changed > changed
+ $ echo removed > removed
+ $ hg ci -qAm init
+
+ $ hg rm removed
+ $ echo changed >> changed
+ $ echo added > added
+ $ hg add added
+ $ HGEDITOR=cat hg ci -A
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: test
+ HG: branch 'default'
+ HG: added added
+ HG: changed changed
+ HG: removed removed
+ abort: empty commit message
+ [255]
+ $ cd ..
+
+
+commit copy
+
+ $ hg init dir2
+ $ cd dir2
+ $ echo bleh > bar
+ $ hg add bar
+ $ hg ci -m 'add bar'
+
+ $ hg cp bar foo
+ $ echo >> bar
+ $ hg ci -m 'cp bar foo; change bar'
+
+ $ hg debugrename foo
+ foo renamed from bar:26d3ca0dfd18e44d796b564e38dd173c9668d3a9
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 6 ..... 0 26d3ca0dfd18 000000000000 000000000000 (re)
+ 1 6 7 ..... 1 d267bddd54f7 26d3ca0dfd18 000000000000 (re)
+
+ $ cd ..
diff --git a/tests/test-committer.t b/tests/test-committer.t
new file mode 100644
index 0000000..5208f4e
--- /dev/null
+++ b/tests/test-committer.t
@@ -0,0 +1,65 @@
+ $ unset HGUSER
+ $ EMAIL="My Name <myname@example.com>"
+ $ export EMAIL
+
+ $ hg init test
+ $ cd test
+ $ touch asdf
+ $ hg add asdf
+ $ hg commit -m commit-1
+ $ hg tip
+ changeset: 0:53f268a58230
+ tag: tip
+ user: My Name <myname@example.com>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-1
+
+
+ $ unset EMAIL
+ $ echo 1234 > asdf
+ $ hg commit -u "foo@bar.com" -m commit-1
+ $ hg tip
+ changeset: 1:3871b2a9e9bf
+ tag: tip
+ user: foo@bar.com
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-1
+
+ $ echo "[ui]" >> .hg/hgrc
+ $ echo "username = foobar <foo@bar.com>" >> .hg/hgrc
+ $ echo 12 > asdf
+ $ hg commit -m commit-1
+ $ hg tip
+ changeset: 2:8eeac6695c1c
+ tag: tip
+ user: foobar <foo@bar.com>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-1
+
+ $ echo 1 > asdf
+ $ hg commit -u "foo@bar.com" -m commit-1
+ $ hg tip
+ changeset: 3:957606a725e4
+ tag: tip
+ user: foo@bar.com
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit-1
+
+ $ echo 123 > asdf
+ $ echo "[ui]" > .hg/hgrc
+ $ echo "username = " >> .hg/hgrc
+ $ hg commit -m commit-1
+ abort: no username supplied (see "hg help config")
+ [255]
+ $ rm .hg/hgrc
+ $ hg commit -m commit-1 2>&1
+ no username found, using '[^']*' instead (re)
+
+ $ echo space > asdf
+ $ hg commit -u ' ' -m commit-1
+ transaction abort!
+ rollback completed
+ abort: empty username!
+ [255]
+
+ $ cd ..
diff --git a/tests/test-config-case.t b/tests/test-config-case.t
new file mode 100644
index 0000000..9ef0be8
--- /dev/null
+++ b/tests/test-config-case.t
@@ -0,0 +1,11 @@
+hide outer repo
+ $ hg init
+
+ $ echo '[Section]' >> $HGRCPATH
+ $ echo 'KeY = Case Sensitive' >> $HGRCPATH
+ $ echo 'key = lower case' >> $HGRCPATH
+
+ $ hg showconfig Section
+ Section.KeY=Case Sensitive
+ Section.key=lower case
+
diff --git a/tests/test-conflict.t b/tests/test-conflict.t
new file mode 100644
index 0000000..113b429
--- /dev/null
+++ b/tests/test-conflict.t
@@ -0,0 +1,33 @@
+ $ hg init
+ $ echo "nothing" > a
+ $ hg add a
+ $ hg commit -m ancestor
+ $ echo "something" > a
+ $ hg commit -m branch1
+ $ hg co 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "something else" > a
+ $ hg commit -m branch2
+ created new head
+
+ $ hg merge 1
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+ $ hg id
+ 32e80765d7fe+75234512624c+ tip
+
+ $ cat a
+ <<<<<<< local
+ something else
+ =======
+ something
+ >>>>>>> other
+
+ $ hg status
+ M a
+ ? a.orig
diff --git a/tests/test-confused-revert.t b/tests/test-confused-revert.t
new file mode 100644
index 0000000..3a1e0f4
--- /dev/null
+++ b/tests/test-confused-revert.t
@@ -0,0 +1,82 @@
+ $ hg init
+ $ echo foo > a
+ $ hg add a
+ $ hg commit -m "1"
+
+ $ echo bar > b
+ $ hg add b
+ $ hg remove a
+
+Should show a removed and b added:
+
+ $ hg status
+ A b
+ R a
+
+ $ hg revert --all
+ undeleting a
+ forgetting b
+
+Should show b unknown and a back to normal:
+
+ $ hg status
+ ? b
+
+ $ rm b
+
+ $ hg co -C 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo foo-a > a
+ $ hg commit -m "2a"
+
+ $ hg co -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo foo-b > a
+ $ hg commit -m "2b"
+ created new head
+
+ $ HGMERGE=true hg merge 1
+ merging a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Should show foo-b:
+
+ $ cat a
+ foo-b
+
+ $ echo bar > b
+ $ hg add b
+ $ rm a
+ $ hg remove a
+
+Should show a removed and b added:
+
+ $ hg status
+ A b
+ R a
+
+Revert should fail:
+
+ $ hg revert
+ abort: uncommitted merge with no revision specified
+ (use "hg update" or see "hg help revert")
+ [255]
+
+Revert should be ok now:
+
+ $ hg revert -r2 --all
+ undeleting a
+ forgetting b
+
+Should show b unknown and a marked modified (merged):
+
+ $ hg status
+ M a
+ ? b
+
+Should show foo-b:
+
+ $ cat a
+ foo-b
+
diff --git a/tests/test-context.py b/tests/test-context.py
new file mode 100644
index 0000000..e54e526
--- /dev/null
+++ b/tests/test-context.py
@@ -0,0 +1,32 @@
+import os
+from mercurial import hg, ui, context, encoding
+
+u = ui.ui()
+
+repo = hg.repository(u, 'test1', create=1)
+os.chdir('test1')
+
+# create 'foo' with fixed time stamp
+f = open('foo', 'w')
+f.write('foo\n')
+f.close()
+os.utime('foo', (1000, 1000))
+
+# add+commit 'foo'
+repo[None].add(['foo'])
+repo.commit(text='commit1', date="0 0")
+
+print "workingfilectx.date =", repo[None]['foo'].date()
+
+# test memctx with non-ASCII commit message
+
+def filectxfn(repo, memctx, path):
+ return context.memfilectx("foo", "")
+
+ctx = context.memctx(repo, ['tip', None],
+ encoding.tolocal("Gr\xc3\xbcezi!"),
+ ["foo"], filectxfn)
+ctx.commit()
+for enc in "ASCII", "Latin-1", "UTF-8":
+ encoding.encoding = enc
+ print "%-8s: %s" % (enc, repo["tip"].description())
diff --git a/tests/test-context.py.out b/tests/test-context.py.out
new file mode 100644
index 0000000..9ad193d
--- /dev/null
+++ b/tests/test-context.py.out
@@ -0,0 +1,4 @@
+workingfilectx.date = (1000, 0)
+ASCII : Gr?ezi!
+Latin-1 : Grüezi!
+UTF-8 : Grüezi!
diff --git a/tests/test-contrib.t b/tests/test-contrib.t
new file mode 100644
index 0000000..98acb43
--- /dev/null
+++ b/tests/test-contrib.t
@@ -0,0 +1,306 @@
+Set vars:
+
+ $ CONTRIBDIR="$TESTDIR/../contrib"
+
+Prepare repo-a:
+
+ $ hg init repo-a
+ $ cd repo-a
+
+ $ echo this is file a > a
+ $ hg add a
+ $ hg commit -m first
+
+ $ echo adding to file a >> a
+ $ hg commit -m second
+
+ $ echo adding more to file a >> a
+ $ hg commit -m third
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+Dumping revlog of file a to stdout:
+
+ $ python "$CONTRIBDIR/dumprevlog" .hg/store/data/a.i
+ file: .hg/store/data/a.i
+ node: 183d2312b35066fb6b3b449b84efc370d50993d0
+ linkrev: 0
+ parents: 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
+ length: 15
+ -start-
+ this is file a
+
+ -end-
+ node: b1047953b6e6b633c0d8197eaa5116fbdfd3095b
+ linkrev: 1
+ parents: 183d2312b35066fb6b3b449b84efc370d50993d0 0000000000000000000000000000000000000000
+ length: 32
+ -start-
+ this is file a
+ adding to file a
+
+ -end-
+ node: 8c4fd1f7129b8cdec6c7f58bf48fb5237a4030c1
+ linkrev: 2
+ parents: b1047953b6e6b633c0d8197eaa5116fbdfd3095b 0000000000000000000000000000000000000000
+ length: 54
+ -start-
+ this is file a
+ adding to file a
+ adding more to file a
+
+ -end-
+
+Dump all revlogs to file repo.dump:
+
+ $ find .hg/store -name "*.i" | sort | xargs python "$CONTRIBDIR/dumprevlog" > ../repo.dump
+ $ cd ..
+
+Undumping into repo-b:
+
+ $ hg init repo-b
+ $ cd repo-b
+ $ python "$CONTRIBDIR/undumprevlog" < ../repo.dump
+ .hg/store/00changelog.i
+ .hg/store/00manifest.i
+ .hg/store/data/a.i
+ $ cd ..
+
+Rebuild fncache with clone --pull:
+
+ $ hg clone --pull -U repo-b repo-c
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+
+Verify:
+
+ $ hg -R repo-c verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+Compare repos:
+
+ $ hg -R repo-c incoming repo-a
+ comparing with repo-a
+ searching for changes
+ no changes found
+ [1]
+
+ $ hg -R repo-a incoming repo-c
+ comparing with repo-c
+ searching for changes
+ no changes found
+ [1]
+
+
+#if hardlink
+
+Test shrink-revlog:
+ $ cd repo-a
+ $ hg --config extensions.shrink="$CONTRIBDIR/shrink-revlog.py" shrink
+ shrinking $TESTTMP/repo-a/.hg/store/00manifest.i (glob)
+ reading revs
+ sorting revs
+ writing revs
+ old file size: 324 bytes ( 0.0 MiB)
+ new file size: 324 bytes ( 0.0 MiB)
+ shrinkage: 0.0% (1.0x)
+ note: old revlog saved in:
+ $TESTTMP/repo-a/.hg/store/00manifest.i.old (glob)
+ $TESTTMP/repo-a/.hg/store/00manifest.d.old (glob)
+ (You can delete those files when you are satisfied that your
+ repository is still sane. Running 'hg verify' is strongly recommended.)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ $ cd ..
+
+#endif
+
+Test simplemerge command:
+
+ $ cp "$CONTRIBDIR/simplemerge" .
+ $ echo base > base
+ $ echo local > local
+ $ cat base >> local
+ $ cp local orig
+ $ cat base > other
+ $ echo other >> other
+
+changing local directly
+
+ $ python simplemerge local base other && echo "merge succeeded"
+ merge succeeded
+ $ cat local
+ local
+ base
+ other
+ $ cp orig local
+
+printing to stdout
+
+ $ python simplemerge -p local base other
+ local
+ base
+ other
+
+local:
+
+ $ cat local
+ local
+ base
+
+conflicts
+
+ $ cp base conflict-local
+ $ cp other conflict-other
+ $ echo not other >> conflict-local
+ $ echo end >> conflict-local
+ $ echo end >> conflict-other
+ $ python simplemerge -p conflict-local base conflict-other
+ base
+ <<<<<<< conflict-local
+ not other
+ =======
+ other
+ >>>>>>> conflict-other
+ end
+ warning: conflicts during merge.
+ [1]
+
+--no-minimal
+
+ $ python simplemerge -p --no-minimal conflict-local base conflict-other
+ base
+ <<<<<<< conflict-local
+ not other
+ end
+ =======
+ other
+ end
+ >>>>>>> conflict-other
+ warning: conflicts during merge.
+ [1]
+
+1 label
+
+ $ python simplemerge -p -L foo conflict-local base conflict-other
+ base
+ <<<<<<< foo
+ not other
+ =======
+ other
+ >>>>>>> conflict-other
+ end
+ warning: conflicts during merge.
+ [1]
+
+2 labels
+
+ $ python simplemerge -p -L foo -L bar conflict-local base conflict-other
+ base
+ <<<<<<< foo
+ not other
+ =======
+ other
+ >>>>>>> bar
+ end
+ warning: conflicts during merge.
+ [1]
+
+too many labels
+
+ $ python simplemerge -p -L foo -L bar -L baz conflict-local base conflict-other
+ abort: can only specify two labels.
+ [255]
+
+binary file
+
+ $ python -c "f = file('binary-local', 'w'); f.write('\x00'); f.close()"
+ $ cat orig >> binary-local
+ $ python simplemerge -p binary-local base other
+ warning: binary-local looks like a binary file.
+ [1]
+
+binary file --text
+
+ $ python simplemerge -a -p binary-local base other 2>&1
+ warning: binary-local looks like a binary file.
+ \x00local (esc)
+ base
+ other
+
+help
+
+ $ python simplemerge --help
+ simplemerge [OPTS] LOCAL BASE OTHER
+
+ Simple three-way file merge utility with a minimal feature set.
+
+ Apply to LOCAL the changes necessary to go from BASE to OTHER.
+
+ By default, LOCAL is overwritten with the results of this operation.
+
+ options:
+ -L --label labels to use on conflict markers
+ -a --text treat all files as text
+ -p --print print results instead of overwriting LOCAL
+ --no-minimal do not try to minimize conflict regions
+ -h --help display help and exit
+ -q --quiet suppress output
+
+wrong number of arguments
+
+ $ python simplemerge
+ simplemerge: wrong number of arguments
+ simplemerge [OPTS] LOCAL BASE OTHER
+
+ Simple three-way file merge utility with a minimal feature set.
+
+ Apply to LOCAL the changes necessary to go from BASE to OTHER.
+
+ By default, LOCAL is overwritten with the results of this operation.
+
+ options:
+ -L --label labels to use on conflict markers
+ -a --text treat all files as text
+ -p --print print results instead of overwriting LOCAL
+ --no-minimal do not try to minimize conflict regions
+ -h --help display help and exit
+ -q --quiet suppress output
+ [1]
+
+bad option
+
+ $ python simplemerge --foo -p local base other
+ simplemerge: option --foo not recognized
+ simplemerge [OPTS] LOCAL BASE OTHER
+
+ Simple three-way file merge utility with a minimal feature set.
+
+ Apply to LOCAL the changes necessary to go from BASE to OTHER.
+
+ By default, LOCAL is overwritten with the results of this operation.
+
+ options:
+ -L --label labels to use on conflict markers
+ -a --text treat all files as text
+ -p --print print results instead of overwriting LOCAL
+ --no-minimal do not try to minimize conflict regions
+ -h --help display help and exit
+ -q --quiet suppress output
+ [1]
diff --git a/tests/test-convert-authormap.t b/tests/test-convert-authormap.t
new file mode 100644
index 0000000..9d5ca9f
--- /dev/null
+++ b/tests/test-convert-authormap.t
@@ -0,0 +1,58 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > EOF
+
+Prepare orig repo
+
+ $ hg init orig
+ $ cd orig
+ $ echo foo > foo
+ $ HGUSER='user name' hg ci -qAm 'foo'
+ $ cd ..
+
+Explicit --authors
+
+ $ cat > authormap.txt <<EOF
+ > user name = Long User Name
+ >
+ > # comment
+ > this line is ignored
+ > EOF
+ $ hg convert --authors authormap.txt orig new
+ initializing destination new repository
+ ignoring bad line in author map file authormap.txt: this line is ignored
+ scanning source...
+ sorting...
+ converting...
+ 0 foo
+ writing author map file $TESTTMP/new/.hg/authormap (glob)
+ $ cat new/.hg/authormap
+ user name=Long User Name
+ $ hg -Rnew log
+ changeset: 0:d89716e88087
+ tag: tip
+ user: Long User Name
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: foo
+
+ $ rm -rf new
+
+Implicit .hg/authormap
+
+ $ hg init new
+ $ mv authormap.txt new/.hg/authormap
+ $ hg convert orig new
+ ignoring bad line in author map file $TESTTMP/new/.hg/authormap: this line is ignored (glob)
+ scanning source...
+ sorting...
+ converting...
+ 0 foo
+ $ hg -Rnew log
+ changeset: 0:d89716e88087
+ tag: tip
+ user: Long User Name
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: foo
+
diff --git a/tests/test-convert-baz.t b/tests/test-convert-baz.t
new file mode 100644
index 0000000..763e83c
--- /dev/null
+++ b/tests/test-convert-baz.t
@@ -0,0 +1,163 @@
+ $ "$TESTDIR/hghave" baz symlink || exit 80
+
+ $ baz my-id "mercurial <mercurial@selenic.com>"
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+
+create baz archive
+ $ baz make-archive baz@mercurial--convert hg-test-convert-baz
+
+initialize baz repo
+ $ mkdir baz-repo
+ $ cd baz-repo/
+ $ baz init-tree baz@mercurial--convert/baz--test--0
+ $ baz import
+ * creating version baz@mercurial--convert/baz--test--0
+ * imported baz@mercurial--convert/baz--test--0
+
+create initial files
+ $ echo 'this is a file' > a
+ $ baz add a
+ $ mkdir src
+ $ baz add src
+ $ cd src
+ $ dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+ $ baz add b
+HACK: hide GNU tar-1.22 "tar: The --preserve option is deprecated, use --preserve-permissions --preserve-order instead"
+ $ baz commit -s "added a file, src and src/b (binary)" 2>&1 | grep -v '^tar'
+ * build pristine tree for baz@mercurial--convert/baz--test--0--base-0
+ * Scanning for full-tree revision: .
+ * from import revision: baz@mercurial--convert/baz--test--0--base-0
+ A/ .arch-ids
+ A/ src
+ A/ src/.arch-ids
+ A .arch-ids/a.id
+ A a
+ A src/.arch-ids/=id
+ A src/.arch-ids/b.id
+ A src/b
+ * update pristine tree (baz@mercurial--convert/baz--test--0--base-0 => baz--test--0--patch-1)
+ * committed baz@mercurial--convert/baz--test--0--patch-1
+
+create link file and modify a
+ $ ln -s ../a a-link
+ $ baz add a-link
+ $ echo 'this a modification to a' >> ../a
+ $ baz commit -s "added link to a and modify a"
+ A src/.arch-ids/a-link.id
+ A src/a-link
+ M a
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-1 => baz--test--0--patch-2)
+ * committed baz@mercurial--convert/baz--test--0--patch-2
+
+create second link and modify b
+ $ ln -s ../a a-link-2
+ $ baz add a-link-2
+ $ dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+ $ baz commit -s "added second link and modify b"
+ A src/.arch-ids/a-link-2.id
+ A src/a-link-2
+ Mb src/b
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-2 => baz--test--0--patch-3)
+ * committed baz@mercurial--convert/baz--test--0--patch-3
+
+b file to link and a-link-2 to regular file
+ $ rm -f a-link-2
+ $ echo 'this is now a regular file' > a-link-2
+ $ ln -sf ../a b
+ $ baz commit -s "file to link and link to file test"
+ fl src/b
+ lf src/a-link-2
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-3 => baz--test--0--patch-4)
+ * committed baz@mercurial--convert/baz--test--0--patch-4
+
+move a-link-2 file and src directory
+ $ cd ..
+ $ baz mv src/a-link-2 c
+ $ baz mv src test
+ $ baz commit -s "move and rename a-link-2 file and src directory"
+ D/ src/.arch-ids
+ A/ test/.arch-ids
+ /> src test
+ => src/.arch-ids/a-link-2.id .arch-ids/c.id
+ => src/a-link-2 c
+ => src/.arch-ids/=id test/.arch-ids/=id
+ => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
+ => src/.arch-ids/b.id test/.arch-ids/b.id
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-4 => baz--test--0--patch-5)
+ * committed baz@mercurial--convert/baz--test--0--patch-5
+
+move and add the moved file again
+ $ echo e > e
+ $ baz add e
+ $ baz commit -s "add e"
+ A .arch-ids/e.id
+ A e
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-5 => baz--test--0--patch-6)
+ * committed baz@mercurial--convert/baz--test--0--patch-6
+ $ baz mv e f
+ $ echo ee > e
+ $ baz add e
+ $ baz commit -s "move e and recreate it again"
+ A .arch-ids/e.id
+ A e
+ => .arch-ids/e.id .arch-ids/f.id
+ => e f
+ * update pristine tree (baz@mercurial--convert/baz--test--0--patch-6 => baz--test--0--patch-7)
+ * committed baz@mercurial--convert/baz--test--0--patch-7
+ $ cd ..
+
+converting baz repo to Mercurial
+ $ hg convert baz-repo baz-repo-hg
+ initializing destination baz-repo-hg repository
+ analyzing tree version baz@mercurial--convert/baz--test--0...
+ scanning source...
+ sorting...
+ converting...
+ 7 initial import
+ 6 added a file, src and src/b (binary)
+ 5 added link to a and modify a
+ 4 added second link and modify b
+ 3 file to link and link to file test
+ 2 move and rename a-link-2 file and src directory
+ 1 add e
+ 0 move e and recreate it again
+
+ $ baz register-archive -d baz@mercurial--convert
+
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc|firstline}" files: {files}\n' "$@"
+ > }
+
+show graph log
+ $ glog -R baz-repo-hg
+ o 7 "move e and recreate it again" files: e f
+ |
+ o 6 "add e" files: e
+ |
+ o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
+ |
+ o 4 "file to link and link to file test" files: src/a-link-2 src/b
+ |
+ o 3 "added second link and modify b" files: src/a-link-2 src/b
+ |
+ o 2 "added link to a and modify a" files: a src/a-link
+ |
+ o 1 "added a file, src and src/b (binary)" files: a src/b
+ |
+ o 0 "initial import" files:
+
+ $ hg up -q -R baz-repo-hg
+ $ hg -R baz-repo-hg manifest --debug
+ c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
+ 0201ac32a3a8e86e303dff60366382a54b48a72e 644 c
+ 1a4a864db0073705a11b1439f563bfa4b46d9246 644 e
+ 09e0222742fc3f75777fa9d68a5d8af7294cb5e7 644 f
+ c0067ba5ff0b7c9a3eb17270839d04614c435623 644 @ test/a-link
+ 375f4263d86feacdea7e3c27100abd1560f2a973 644 @ test/b
+ $ hg -R baz-repo-hg log -r 5 -r 7 -C --debug | grep copies
+ copies: c (src/a-link-2) test/a-link (src/a-link) test/b (src/b)
+ copies: f (e)
diff --git a/tests/test-convert-bzr-114.t b/tests/test-convert-bzr-114.t
new file mode 100644
index 0000000..47df890
--- /dev/null
+++ b/tests/test-convert-bzr-114.t
@@ -0,0 +1,39 @@
+
+ $ "$TESTDIR/hghave" bzr114 || exit 80
+ $ . "$TESTDIR/bzr-definitions"
+
+The file/directory replacement can only be reproduced on
+bzr >= 1.4. Merge it back in test-convert-bzr-directories once
+this version becomes mainstream.
+replace file with dir
+
+ $ mkdir test-replace-file-with-dir
+ $ cd test-replace-file-with-dir
+ $ bzr init -q source
+ $ cd source
+ $ echo d > d
+ $ bzr add -q d
+ $ bzr commit -q -m 'add d file'
+ $ rm d
+ $ mkdir d
+ $ bzr add -q d
+ $ bzr commit -q -m 'replace with d dir'
+ $ echo a > d/a
+ $ bzr add -q d/a
+ $ bzr commit -q -m 'add d/a'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 2 add d file
+ 1 replace with d dir
+ 0 add d/a
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 d/a
+ $ cd source-hg
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../..
diff --git a/tests/test-convert-bzr-directories.t b/tests/test-convert-bzr-directories.t
new file mode 100644
index 0000000..653d7b1
--- /dev/null
+++ b/tests/test-convert-bzr-directories.t
@@ -0,0 +1,193 @@
+
+ $ . "$TESTDIR/bzr-definitions"
+
+empty directory
+
+ $ mkdir test-empty
+ $ cd test-empty
+ $ bzr init -q source
+ $ cd source
+ $ echo content > a
+ $ bzr add -q a
+ $ bzr commit -q -m 'Initial add'
+ $ mkdir empty
+ $ bzr add -q empty
+ $ bzr commit -q -m 'Empty directory added'
+ $ echo content > empty/something
+ $ bzr add -q empty/something
+ $ bzr commit -q -m 'Added file into directory'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 2 Initial add
+ 1 Empty directory added
+ 0 Added file into directory
+ $ manifest source-hg 1
+ % manifest of 1
+ 644 a
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 a
+ 644 empty/something
+ $ cd ..
+
+directory renames
+
+ $ mkdir test-dir-rename
+ $ cd test-dir-rename
+ $ bzr init -q source
+ $ cd source
+ $ mkdir tpyo
+ $ echo content > tpyo/something
+ $ bzr add -q tpyo
+ $ bzr commit -q -m 'Added directory'
+ $ bzr mv tpyo typo
+ tpyo => typo
+ $ bzr commit -q -m 'Oops, typo'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Added directory
+ 0 Oops, typo
+ $ manifest source-hg 0
+ % manifest of 0
+ 644 tpyo/something
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 typo/something
+ $ cd ..
+
+nested directory renames
+
+ $ mkdir test-nested-dir-rename
+ $ cd test-nested-dir-rename
+ $ bzr init -q source
+ $ cd source
+ $ mkdir -p firstlevel/secondlevel/thirdlevel
+ $ echo content > firstlevel/secondlevel/file
+ $ echo this_needs_to_be_there_too > firstlevel/secondlevel/thirdlevel/stuff
+ $ bzr add -q firstlevel
+ $ bzr commit -q -m 'Added nested directories'
+ $ bzr mv firstlevel/secondlevel secondlevel
+ firstlevel/secondlevel => secondlevel
+ $ bzr commit -q -m 'Moved secondlevel one level up'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Added nested directories
+ 0 Moved secondlevel one level up
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 secondlevel/file
+ 644 secondlevel/thirdlevel/stuff
+ $ cd ..
+
+directory remove
+
+ $ mkdir test-dir-remove
+ $ cd test-dir-remove
+ $ bzr init -q source
+ $ cd source
+ $ mkdir src
+ $ echo content > src/sourcecode
+ $ bzr add -q src
+ $ bzr commit -q -m 'Added directory'
+ $ bzr rm -q src
+ $ bzr commit -q -m 'Removed directory'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Added directory
+ 0 Removed directory
+ $ manifest source-hg 0
+ % manifest of 0
+ 644 src/sourcecode
+ $ manifest source-hg tip
+ % manifest of tip
+ $ cd ..
+
+directory replace
+
+ $ mkdir test-dir-replace
+ $ cd test-dir-replace
+ $ bzr init -q source
+ $ cd source
+ $ mkdir first second
+ $ echo content > first/file
+ $ echo morecontent > first/dummy
+ $ echo othercontent > second/something
+ $ bzr add -q first second
+ $ bzr commit -q -m 'Initial layout'
+ $ bzr mv first/file second/file
+ first/file => second/file
+ $ bzr mv first third
+ first => third
+ $ bzr commit -q -m 'Some conflicting moves'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial layout
+ 0 Some conflicting moves
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 second/file
+ 644 second/something
+ 644 third/dummy
+ $ cd ..
+
+divergent nested renames (issue3089)
+
+ $ mkdir test-divergent-renames
+ $ cd test-divergent-renames
+ $ bzr init -q source
+ $ cd source
+ $ mkdir -p a/c
+ $ echo a > a/fa
+ $ echo c > a/c/fc
+ $ bzr add -q a
+ $ bzr commit -q -m 'Initial layout'
+ $ bzr mv a b
+ a => b
+ $ mkdir a
+ $ bzr add a
+ add(ed|ing) a (re)
+ $ bzr mv b/c a/c
+ b/c => a/c
+ $ bzr status
+ added:
+ a/
+ renamed:
+ a/? => b/? (re)
+ a/c/? => a/c/? (re)
+ $ bzr commit -q -m 'Divergent renames'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial layout
+ 0 Divergent renames
+ $ hg -R source-hg st -C --change 1
+ A b/fa
+ a/fa
+ R a/fa
+ $ hg -R source-hg manifest -r 1
+ a/c/fc
+ b/fa
+ $ cd ..
diff --git a/tests/test-convert-bzr-ghosts.t b/tests/test-convert-bzr-ghosts.t
new file mode 100644
index 0000000..ef9cd96
--- /dev/null
+++ b/tests/test-convert-bzr-ghosts.t
@@ -0,0 +1,38 @@
+
+ $ . "$TESTDIR/bzr-definitions"
+ $ cat > ghostcreator.py <<EOF
+ > import sys
+ > from bzrlib import workingtree
+ > wt = workingtree.WorkingTree.open('.')
+ >
+ > message, ghostrev = sys.argv[1:]
+ > wt.set_parent_ids(wt.get_parent_ids() + [ghostrev])
+ > wt.commit(message)
+ > EOF
+
+ghost revisions
+
+ $ mkdir test-ghost-revisions
+ $ cd test-ghost-revisions
+ $ bzr init -q source
+ $ cd source
+ $ echo content > somefile
+ $ bzr add -q somefile
+ $ bzr commit -q -m 'Initial layout setup'
+ $ echo morecontent >> somefile
+ $ python ../../ghostcreator.py 'Commit with ghost revision' ghostrev
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial layout setup
+ 0 Commit with ghost revision
+ $ glog -R source-hg
+ o 1@source "Commit with ghost revision" files: somefile
+ |
+ o 0@source "Initial layout setup" files: somefile
+
+
+ $ cd ..
diff --git a/tests/test-convert-bzr-merges.t b/tests/test-convert-bzr-merges.t
new file mode 100644
index 0000000..1c10bbc
--- /dev/null
+++ b/tests/test-convert-bzr-merges.t
@@ -0,0 +1,70 @@
+N.B. bzr 1.13 has a bug that breaks this test. If you see this
+test fail, check your bzr version. Upgrading to bzr 1.13.1
+should fix it.
+
+ $ . "$TESTDIR/bzr-definitions"
+
+test multiple merges at once
+
+ $ mkdir test-multimerge
+ $ cd test-multimerge
+ $ bzr init -q source
+ $ cd source
+ $ echo content > file
+ $ bzr add -q file
+ $ bzr commit -q -m 'Initial add'
+ $ cd ..
+ $ bzr branch -q source source-branch1
+ $ cd source-branch1
+ $ echo morecontent >> file
+ $ echo evenmorecontent > file-branch1
+ $ bzr add -q file-branch1
+ $ bzr commit -q -m 'Added branch1 file'
+ $ cd ../source
+ $ sleep 1
+ $ echo content > file-parent
+ $ bzr add -q file-parent
+ $ bzr commit -q -m 'Added parent file'
+ $ cd ..
+ $ bzr branch -q source source-branch2
+ $ cd source-branch2
+ $ echo somecontent > file-branch2
+ $ bzr add -q file-branch2
+ $ bzr commit -q -m 'Added brach2 file'
+ $ sleep 1
+ $ cd ../source
+ $ bzr merge -q ../source-branch1
+ $ bzr merge -q --force ../source-branch2
+ $ bzr commit -q -m 'Merged branches'
+ $ cd ..
+ $ hg convert --datesort source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 4 Initial add
+ 3 Added branch1 file
+ 2 Added parent file
+ 1 Added brach2 file
+ 0 Merged branches
+ $ glog -R source-hg
+ o 5@source "(octopus merge fixup)" files:
+ |\
+ | o 4@source "Merged branches" files: file-branch2
+ | |\
+ o---+ 3@source-branch2 "Added brach2 file" files: file-branch2
+ / /
+ | o 2@source "Added parent file" files: file-parent
+ | |
+ o | 1@source-branch1 "Added branch1 file" files: file file-branch1
+ |/
+ o 0@source "Initial add" files: file
+
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 file
+ 644 file-branch1
+ 644 file-branch2
+ 644 file-parent
+
+ $ cd ..
diff --git a/tests/test-convert-bzr-treeroot.t b/tests/test-convert-bzr-treeroot.t
new file mode 100644
index 0000000..5e59e32
--- /dev/null
+++ b/tests/test-convert-bzr-treeroot.t
@@ -0,0 +1,35 @@
+
+ $ . "$TESTDIR/bzr-definitions"
+ $ cat > treeset.py <<EOF
+ > import sys
+ > from bzrlib import workingtree
+ > wt = workingtree.WorkingTree.open('.')
+ >
+ > message, rootid = sys.argv[1:]
+ > wt.set_root_id('tree_root-%s' % rootid)
+ > wt.commit(message)
+ > EOF
+
+change the id of the tree root
+
+ $ mkdir test-change-treeroot-id
+ $ cd test-change-treeroot-id
+ $ bzr init -q source
+ $ cd source
+ $ echo content > file
+ $ bzr add -q file
+ $ bzr commit -q -m 'Initial add'
+ $ python ../../treeset.py 'Changed root' new
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial add
+ 0 Changed root
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 file
+
+ $ cd ..
diff --git a/tests/test-convert-bzr.t b/tests/test-convert-bzr.t
new file mode 100644
index 0000000..709df79
--- /dev/null
+++ b/tests/test-convert-bzr.t
@@ -0,0 +1,286 @@
+ $ . "$TESTDIR/bzr-definitions"
+
+create and rename on the same file in the same step
+
+ $ mkdir test-createandrename
+ $ cd test-createandrename
+ $ bzr init -q source
+
+test empty repo conversion (issue3233)
+
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+
+back to the rename stuff
+
+ $ cd source
+ $ echo a > a
+ $ echo c > c
+ $ echo e > e
+ $ bzr add -q a c e
+ $ bzr commit -q -m 'Initial add: a, c, e'
+ $ bzr mv a b
+ a => b
+ $ bzr mv c d
+ c => d
+ $ bzr mv e f
+ e => f
+ $ echo a2 >> a
+ $ mkdir e
+ $ bzr add -q a e
+ $ bzr commit -q -m 'rename a into b, create a, rename c into d'
+ $ cd ..
+ $ hg convert source source-hg
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial add: a, c, e
+ 0 rename a into b, create a, rename c into d
+ $ glog -R source-hg
+ o 1@source "rename a into b, create a, rename c into d" files: a b c d e f
+ |
+ o 0@source "Initial add: a, c, e" files: a c e
+
+
+manifest
+
+ $ hg manifest -R source-hg -r tip
+ a
+ b
+ d
+ f
+
+test --rev option
+
+ $ hg convert -r 1 source source-1-hg
+ initializing destination source-1-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 0 Initial add: a, c, e
+ $ glog -R source-1-hg
+ o 0@source "Initial add: a, c, e" files: a c e
+
+
+test with filemap
+
+ $ cat > filemap <<EOF
+ > exclude a
+ > EOF
+ $ hg convert --filemap filemap source source-filemap-hg
+ initializing destination source-filemap-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial add: a, c, e
+ 0 rename a into b, create a, rename c into d
+ $ hg -R source-filemap-hg manifest -r tip
+ b
+ d
+ f
+
+convert from lightweight checkout
+
+ $ bzr checkout --lightweight source source-light
+ $ hg convert -s bzr source-light source-light-hg
+ initializing destination source-light-hg repository
+ warning: lightweight checkouts may cause conversion failures, try with a regular branch instead.
+ $TESTTMP/test-createandrename/source-light does not look like a Bazaar repository
+ abort: source-light: missing or unsupported repository
+ [255]
+
+extract timestamps that look just like hg's {date|isodate}:
+yyyy-mm-dd HH:MM zzzz (no seconds!)
+compare timestamps
+
+ $ cd source
+ $ bzr log | \
+ > sed '/timestamp/!d;s/.\{15\}\([0-9: -]\{16\}\):.. \(.[0-9]\{4\}\)/\1 \2/' \
+ > > ../bzr-timestamps
+ $ cd ..
+ $ hg -R source-hg log --template "{date|isodate}\n" > hg-timestamps
+ $ diff -u bzr-timestamps hg-timestamps
+ $ cd ..
+
+merge
+
+ $ mkdir test-merge
+ $ cd test-merge
+ $ cat > helper.py <<EOF
+ > import sys
+ > from bzrlib import workingtree
+ > wt = workingtree.WorkingTree.open('.')
+ >
+ > message, stamp = sys.argv[1:]
+ > wt.commit(message, timestamp=int(stamp))
+ > EOF
+ $ bzr init -q source
+ $ cd source
+ $ echo content > a
+ $ echo content2 > b
+ $ bzr add -q a b
+ $ bzr commit -q -m 'Initial add'
+ $ cd ..
+ $ bzr branch -q source source-improve
+ $ cd source
+ $ echo more >> a
+ $ python ../helper.py 'Editing a' 100
+ $ cd ../source-improve
+ $ echo content3 >> b
+ $ python ../helper.py 'Editing b' 200
+ $ cd ../source
+ $ bzr merge -q ../source-improve
+ $ bzr commit -q -m 'Merged improve branch'
+ $ cd ..
+ $ hg convert --datesort source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 3 Initial add
+ 2 Editing a
+ 1 Editing b
+ 0 Merged improve branch
+ $ glog -R source-hg
+ o 3@source "Merged improve branch" files:
+ |\
+ | o 2@source-improve "Editing b" files: b
+ | |
+ o | 1@source "Editing a" files: a
+ |/
+ o 0@source "Initial add" files: a b
+
+ $ cd ..
+
+#if symlink execbit
+
+symlinks and executable files
+
+ $ mkdir test-symlinks
+ $ cd test-symlinks
+ $ bzr init -q source
+ $ cd source
+ $ touch program
+ $ chmod +x program
+ $ ln -s program altname
+ $ mkdir d
+ $ echo a > d/a
+ $ ln -s a syma
+ $ bzr add -q altname program syma d/a
+ $ bzr commit -q -m 'Initial setup'
+ $ touch newprog
+ $ chmod +x newprog
+ $ rm altname
+ $ ln -s newprog altname
+ $ chmod -x program
+ $ bzr add -q newprog
+ $ bzr commit -q -m 'Symlink changed, x bits changed'
+ $ cd ..
+ $ hg convert source source-hg
+ initializing destination source-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 Initial setup
+ 0 Symlink changed, x bits changed
+ $ manifest source-hg 0
+ % manifest of 0
+ 644 @ altname
+ 644 d/a
+ 755 * program
+ 644 @ syma
+ $ manifest source-hg tip
+ % manifest of tip
+ 644 @ altname
+ 644 d/a
+ 755 * newprog
+ 644 program
+ 644 @ syma
+
+test the symlinks can be recreated
+
+ $ cd source-hg
+ $ hg up
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg cat syma; echo
+ a
+ $ cd ../..
+
+#endif
+
+Multiple branches
+
+ $ bzr init-repo -q --no-trees repo
+ $ bzr init -q repo/trunk
+ $ bzr co repo/trunk repo-trunk
+ $ cd repo-trunk
+ $ echo a > a
+ $ bzr add -q a
+ $ bzr ci -qm adda
+ $ bzr tag trunk-tag
+ Created tag trunk-tag.
+ $ bzr switch -b branch
+ Tree is up to date at revision 1.
+ Switched to branch: *repo/branch/ (glob)
+ $ sleep 1
+ $ echo b > b
+ $ bzr add -q b
+ $ bzr ci -qm addb
+ $ bzr tag branch-tag
+ Created tag branch-tag.
+ $ bzr switch --force ../repo/trunk
+ Updated to revision 1.
+ Switched to branch: */repo/trunk/ (glob)
+ $ sleep 1
+ $ echo a >> a
+ $ bzr ci -qm changea
+ $ cd ..
+ $ hg convert --datesort repo repo-bzr
+ initializing destination repo-bzr repository
+ scanning source...
+ sorting...
+ converting...
+ 2 adda
+ 1 addb
+ 0 changea
+ updating tags
+ $ (cd repo-bzr; glog)
+ o 3@default "update tags" files: .hgtags
+ |
+ o 2@default "changea" files: a
+ |
+ | o 1@branch "addb" files: b
+ |/
+ o 0@default "adda" files: a
+
+
+Test tags (converted identifiers are not stable because bzr ones are
+not and get incorporated in extra fields).
+
+ $ hg -R repo-bzr tags
+ tip 3:* (glob)
+ branch-tag 1:* (glob)
+ trunk-tag 0:* (glob)
+
+Nested repositories (issue3254)
+
+ $ bzr init-repo -q --no-trees repo/inner
+ $ bzr init -q repo/inner/trunk
+ $ bzr co repo/inner/trunk inner-trunk
+ $ cd inner-trunk
+ $ echo b > b
+ $ bzr add -q b
+ $ bzr ci -qm addb
+ $ cd ..
+ $ hg convert --datesort repo noinner-bzr
+ initializing destination noinner-bzr repository
+ scanning source...
+ sorting...
+ converting...
+ 2 adda
+ 1 addb
+ 0 changea
+ updating tags
diff --git a/tests/test-convert-clonebranches.t b/tests/test-convert-clonebranches.t
new file mode 100644
index 0000000..6a297ef
--- /dev/null
+++ b/tests/test-convert-clonebranches.t
@@ -0,0 +1,88 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "[convert]" >> $HGRCPATH
+ $ echo "hg.tagsbranch=0" >> $HGRCPATH
+ $ hg init source
+ $ cd source
+ $ echo a > a
+ $ hg ci -qAm adda
+
+Add a merge with one parent in the same branch
+
+ $ echo a >> a
+ $ hg ci -qAm changea
+ $ hg up -qC 0
+ $ hg branch branch0
+ marked working directory as branch branch0
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > b
+ $ hg ci -qAm addb
+ $ hg up -qC
+ $ hg merge default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -qm mergeab
+ $ hg tag -ql mergeab
+ $ cd ..
+
+Miss perl... sometimes
+
+ $ cat > filter.py <<EOF
+ > import sys, re
+ >
+ > r = re.compile(r'^(?:\d+|pulling from)')
+ > sys.stdout.writelines([l for l in sys.stdin if r.search(l)])
+ > EOF
+
+convert
+
+ $ hg convert -v --config convert.hg.clonebranches=1 source dest |
+ > python filter.py
+ 3 adda
+ 2 changea
+ 1 addb
+ pulling from default into branch0
+ 1 changesets found
+ 0 mergeab
+ pulling from default into branch0
+ 1 changesets found
+
+Add a merge with both parents and child in different branches
+
+ $ cd source
+ $ hg branch branch1
+ marked working directory as branch branch1
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a > file1
+ $ hg ci -qAm c1
+ $ hg up -qC mergeab
+ $ hg branch branch2
+ marked working directory as branch branch2
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a > file2
+ $ hg ci -qAm c2
+ $ hg merge branch1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg branch branch3
+ marked working directory as branch branch3
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -qAm c3
+ $ cd ..
+
+incremental conversion
+
+ $ hg convert -v --config convert.hg.clonebranches=1 source dest |
+ > python filter.py
+ 2 c1
+ pulling from branch0 into branch1
+ 4 changesets found
+ 1 c2
+ pulling from branch0 into branch2
+ 4 changesets found
+ 0 c3
+ pulling from branch2 into branch3
+ 5 changesets found
+ pulling from branch1 into branch3
+ 1 changesets found
diff --git a/tests/test-convert-cvs-branch.t b/tests/test-convert-cvs-branch.t
new file mode 100644
index 0000000..ba35c02
--- /dev/null
+++ b/tests/test-convert-cvs-branch.t
@@ -0,0 +1,193 @@
+This is http://mercurial.selenic.com/bts/issue1148
+and http://mercurial.selenic.com/bts/issue1447
+
+ $ "$TESTDIR/hghave" cvs || exit 80
+ $ cvscall()
+ > {
+ > cvs -f "$@" > /dev/null
+ > }
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "graphlog = " >> $HGRCPATH
+ $ echo "[convert]" >> $HGRCPATH
+ $ echo "cvsps.cache=0" >> $HGRCPATH
+
+create cvs repository
+
+ $ mkdir cvsrepo
+ $ cd cvsrepo
+ $ CVSROOT=`pwd`
+ $ export CVSROOT
+ $ CVS_OPTIONS=-f
+ $ export CVS_OPTIONS
+ $ cd ..
+ $ cvscall -q -d "$CVSROOT" init
+
+Create a new project
+
+ $ mkdir src
+ $ cd src
+ $ echo "1" > a
+ $ echo "1" > b
+ $ cvscall import -m "init" src v0 r0 | sort
+ $ cd ..
+ $ cvscall co src
+ cvs checkout: Updating src
+ $ cd src
+
+Branch the project
+
+ $ cvscall tag -b BRANCH
+ cvs tag: Tagging .
+ $ cvscall up -r BRANCH > /dev/null
+ cvs update: Updating .
+
+Modify file a, then b, then a
+
+ $ sleep 1
+ $ echo "2" > a
+ $ cvscall ci -m "mod a"
+ cvs commit: Examining .
+ $ echo "2" > b
+ $ cvscall ci -m "mod b"
+ cvs commit: Examining .
+ $ sleep 1
+ $ echo "3" > a
+ $ cvscall ci -m "mod a again"
+ cvs commit: Examining .
+
+Convert
+
+ $ cd ..
+ $ hg convert src
+ assuming destination src-hg
+ initializing destination src-hg repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 7 log entries
+ creating changesets
+ 5 changeset entries
+ sorting...
+ converting...
+ 4 Initial revision
+ 3 init
+ 2 mod a
+ 1 mod b
+ 0 mod a again
+ updating tags
+
+Check the result
+
+ $ hg -R src-hg glog --template '{rev} ({branches}) {desc} files: {files}\n'
+ o 5 () update tags files: .hgtags
+ |
+ | o 4 (BRANCH) mod a again files: a
+ | |
+ | o 3 (BRANCH) mod b files: b
+ | |
+ | o 2 (BRANCH) mod a files: a
+ | |
+ | o 1 (v0) init files:
+ |/
+ o 0 () Initial revision files: a b
+
+
+
+issue 1447
+
+ $ cvscall()
+ > {
+ > cvs -f "$@" > /dev/null
+ > sleep 1
+ > }
+ $ cvsci()
+ > {
+ > cvs -f ci "$@" >/dev/null
+ > sleep 1
+ > }
+ $ cvscall -Q -d `pwd`/cvsmaster2 init
+ $ cd cvsmaster2
+ $ CVSROOT=`pwd`
+ $ export CVSROOT
+ $ mkdir foo
+ $ cd ..
+ $ cvscall -Q co -d cvswork2 foo
+ $ cd cvswork2
+ $ echo foo > a.txt
+ $ echo bar > b.txt
+ $ cvscall -Q add a.txt b.txt
+ $ cvsci -m "Initial commit"
+ cvs commit: Examining .
+ $ echo foo > b.txt
+ $ cvsci -m "Fix b on HEAD"
+ cvs commit: Examining .
+ $ echo bar > a.txt
+ $ cvsci -m "Small fix in a on HEAD"
+ cvs commit: Examining .
+ $ cvscall -Q tag -b BRANCH
+ $ cvscall -Q up -P -rBRANCH
+ $ echo baz > b.txt
+ $ cvsci -m "Change on BRANCH in b"
+ cvs commit: Examining .
+ $ hg debugcvsps -x --parents foo
+ collecting CVS rlog
+ 5 log entries
+ creating changesets
+ 4 changeset entries
+ ---------------------
+ PatchSet 1
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Log:
+ Initial commit
+
+ Members:
+ a.txt:INITIAL->1.1
+ b.txt:INITIAL->1.1
+
+ ---------------------
+ PatchSet 2
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: BRANCH
+ Parent: 1
+ Log:
+ Fix b on HEAD
+
+ Members:
+ b.txt:1.1->1.2
+
+ ---------------------
+ PatchSet 3
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: BRANCH
+ Parent: 2
+ Log:
+ Small fix in a on HEAD
+
+ Members:
+ a.txt:1.1->1.2
+
+ ---------------------
+ PatchSet 4
+ Date: * (glob)
+ Author: * (glob)
+ Branch: BRANCH
+ Tag: (none)
+ Parent: 3
+ Log:
+ Change on BRANCH in b
+
+ Members:
+ b.txt:1.2->1.2.2.1
+
+
+ $ cd ..
diff --git a/tests/test-convert-cvs-detectmerge.t b/tests/test-convert-cvs-detectmerge.t
new file mode 100644
index 0000000..9807782
--- /dev/null
+++ b/tests/test-convert-cvs-detectmerge.t
@@ -0,0 +1,233 @@
+Test config convert.cvsps.mergefrom config setting.
+(Should test similar mergeto feature, but I don't understand it yet.)
+Requires builtin cvsps.
+
+ $ "$TESTDIR/hghave" cvs || exit 80
+ $ CVSROOT=`pwd`/cvsrepo
+ $ export CVSROOT
+
+ $ cvscall()
+ > {
+ > cvs -f "$@"
+ > }
+
+output of 'cvs ci' varies unpredictably, so just discard it
+XXX copied from test-convert-cvs-synthetic
+
+ $ cvsci()
+ > {
+ > sleep 1
+ > cvs -f ci "$@" > /dev/null
+ > }
+
+XXX copied from test-convert-cvs-synthetic
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "graphlog = " >> $HGRCPATH
+ $ echo "[convert]" >> $HGRCPATH
+ $ echo "cvsps.cache=0" >> $HGRCPATH
+ $ echo "cvsps.mergefrom=\[MERGE from (\S+)\]" >> $HGRCPATH
+
+create cvs repository with one project
+
+ $ mkdir cvsrepo
+ $ cvscall -q -d "$CVSROOT" init
+ $ mkdir cvsrepo/proj
+
+populate cvs repository
+
+ $ cvscall -Q co proj
+ $ cd proj
+ $ touch file1
+ $ cvscall -Q add file1
+ $ cvsci -m"add file1 on trunk"
+ cvs commit: Examining .
+
+create two release branches
+
+ $ cvscall -q tag -b v1_0
+ T file1
+ $ cvscall -q tag -b v1_1
+ T file1
+
+modify file1 on branch v1_0
+
+ $ cvscall -Q update -rv1_0
+ $ sleep 1
+ $ echo "change" >> file1
+ $ cvsci -m"add text"
+ cvs commit: Examining .
+
+make unrelated change on v1_1
+
+ $ cvscall -Q update -rv1_1
+ $ touch unrelated
+ $ cvscall -Q add unrelated
+ $ cvsci -m"unrelated change"
+ cvs commit: Examining .
+
+merge file1 to v1_1
+
+ $ cvscall -Q update -jv1_0
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ retrieving revision 1.1
+ retrieving revision 1.1.2.1
+ Merging differences between 1.1 and 1.1.2.1 into file1
+ $ cvsci -m"add text [MERGE from v1_0]"
+ cvs commit: Examining .
+
+merge change to trunk
+
+ $ cvscall -Q update -A
+ $ cvscall -Q update -jv1_1
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ retrieving revision 1.1
+ retrieving revision 1.1.4.1
+ Merging differences between 1.1 and 1.1.4.1 into file1
+ $ cvsci -m"add text [MERGE from v1_1]"
+ cvs commit: Examining .
+
+non-merged change on trunk
+
+ $ echo "foo" > file2
+ $ cvscall -Q add file2
+ $ cvsci -m"add file2 on trunk" file2
+
+this will create rev 1.3
+change on trunk to backport
+
+ $ echo "backport me" >> file1
+ $ cvsci -m"add other text" file1
+ $ cvscall log file1
+
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ Working file: file1
+ head: 1.3
+ branch:
+ locks: strict
+ access list:
+ symbolic names:
+ v1_1: 1.1.0.4
+ v1_0: 1.1.0.2
+ keyword substitution: kv
+ total revisions: 5; selected revisions: 5
+ description:
+ ----------------------------
+ revision 1.3
+ date: * (glob)
+ add other text
+ ----------------------------
+ revision 1.2
+ date: * (glob)
+ add text [MERGE from v1_1]
+ ----------------------------
+ revision 1.1
+ date: * (glob)
+ branches: 1.1.2; 1.1.4;
+ add file1 on trunk
+ ----------------------------
+ revision 1.1.4.1
+ date: * (glob)
+ add text [MERGE from v1_0]
+ ----------------------------
+ revision 1.1.2.1
+ date: * (glob)
+ add text
+ =============================================================================
+
+XXX how many ways are there to spell "trunk" with CVS?
+backport trunk change to v1_1
+
+ $ cvscall -Q update -rv1_1
+ $ cvscall -Q update -j1.2 -j1.3 file1
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ retrieving revision 1.2
+ retrieving revision 1.3
+ Merging differences between 1.2 and 1.3 into file1
+ $ cvsci -m"add other text [MERGE from HEAD]" file1
+
+fix bug on v1_1, merge to trunk with error
+
+ $ cvscall -Q update -rv1_1
+ $ echo "merge forward" >> file1
+ $ cvscall -Q tag unmerged
+ $ cvsci -m"fix file1"
+ cvs commit: Examining .
+ $ cvscall -Q update -A
+ $ cvscall -Q update -junmerged -jv1_1
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ retrieving revision 1.1.4.2
+ retrieving revision 1.1.4.3
+ Merging differences between 1.1.4.2 and 1.1.4.3 into file1
+
+note the typo in the commit log message
+
+ $ cvsci -m"fix file1 [MERGE from v1-1]"
+ cvs commit: Examining .
+ $ cvs -Q tag -d unmerged
+
+convert to hg
+
+ $ cd ..
+ $ hg convert proj proj.hg
+ initializing destination proj.hg repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 12 log entries
+ creating changesets
+ warning: CVS commit message references non-existent branch 'v1-1':
+ fix file1 [MERGE from v1-1]
+ 10 changeset entries
+ sorting...
+ converting...
+ 9 add file1 on trunk
+ 8 add text
+ 7 unrelated change
+ 6 add text [MERGE from v1_0]
+ 5 add text [MERGE from v1_1]
+ 4 add file2 on trunk
+ 3 add other text
+ 2 add other text [MERGE from HEAD]
+ 1 fix file1
+ 0 fix file1 [MERGE from v1-1]
+
+complete log
+
+ $ template="{rev}: '{branches}' {desc}\n"
+ $ hg -R proj.hg log --template="$template"
+ 9: '' fix file1 [MERGE from v1-1]
+ 8: 'v1_1' fix file1
+ 7: 'v1_1' add other text [MERGE from HEAD]
+ 6: '' add other text
+ 5: '' add file2 on trunk
+ 4: '' add text [MERGE from v1_1]
+ 3: 'v1_1' add text [MERGE from v1_0]
+ 2: 'v1_1' unrelated change
+ 1: 'v1_0' add text
+ 0: '' add file1 on trunk
+
+graphical log
+
+ $ hg -R proj.hg glog --template="$template"
+ o 9: '' fix file1 [MERGE from v1-1]
+ |
+ | o 8: 'v1_1' fix file1
+ | |
+ | o 7: 'v1_1' add other text [MERGE from HEAD]
+ |/|
+ o | 6: '' add other text
+ | |
+ o | 5: '' add file2 on trunk
+ | |
+ o | 4: '' add text [MERGE from v1_1]
+ |\|
+ | o 3: 'v1_1' add text [MERGE from v1_0]
+ | |\
+ +---o 2: 'v1_1' unrelated change
+ | |
+ | o 1: 'v1_0' add text
+ |/
+ o 0: '' add file1 on trunk
+
diff --git a/tests/test-convert-cvs-synthetic.t b/tests/test-convert-cvs-synthetic.t
new file mode 100644
index 0000000..fe6cc5d
--- /dev/null
+++ b/tests/test-convert-cvs-synthetic.t
@@ -0,0 +1,217 @@
+This feature requires use of builtin cvsps!
+
+ $ "$TESTDIR/hghave" cvs || exit 80
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "graphlog = " >> $HGRCPATH
+
+create cvs repository with one project
+
+ $ mkdir cvsrepo
+ $ cd cvsrepo
+ $ CVSROOT=`pwd`
+ $ export CVSROOT
+ $ CVS_OPTIONS=-f
+ $ export CVS_OPTIONS
+ $ cd ..
+ $ cvscall()
+ > {
+ > cvs -f "$@"
+ > }
+
+output of 'cvs ci' varies unpredictably, so just discard it
+
+ $ cvsci()
+ > {
+ > sleep 1
+ > cvs -f ci "$@" >/dev/null
+ > }
+ $ cvscall -d "$CVSROOT" init
+ $ mkdir cvsrepo/proj
+ $ cvscall -q co proj
+
+create file1 on the trunk
+
+ $ cd proj
+ $ touch file1
+ $ cvscall -Q add file1
+ $ cvsci -m"add file1 on trunk" file1
+
+create two branches
+
+ $ cvscall -q tag -b v1_0
+ T file1
+ $ cvscall -q tag -b v1_1
+ T file1
+
+create file2 on branch v1_0
+
+ $ cvscall -Q up -rv1_0
+ $ touch file2
+ $ cvscall -Q add file2
+ $ cvsci -m"add file2" file2
+
+create file3, file4 on branch v1_1
+
+ $ cvscall -Q up -rv1_1
+ $ touch file3
+ $ touch file4
+ $ cvscall -Q add file3 file4
+ $ cvsci -m"add file3, file4 on branch v1_1" file3 file4
+
+merge file2 from v1_0 to v1_1
+
+ $ cvscall -Q up -jv1_0
+ $ cvsci -m"MERGE from v1_0: add file2"
+ cvs commit: Examining .
+
+Step things up a notch: now we make the history really hairy, with
+changes bouncing back and forth between trunk and v1_2 and merges
+going both ways. (I.e., try to model the real world.)
+create branch v1_2
+
+ $ cvscall -Q up -A
+ $ cvscall -q tag -b v1_2
+ T file1
+
+create file5 on branch v1_2
+
+ $ cvscall -Q up -rv1_2
+ $ touch file5
+ $ cvs -Q add file5
+ $ cvsci -m"add file5 on v1_2"
+ cvs commit: Examining .
+
+create file6 on trunk post-v1_2
+
+ $ cvscall -Q up -A
+ $ touch file6
+ $ cvscall -Q add file6
+ $ cvsci -m"add file6 on trunk post-v1_2"
+ cvs commit: Examining .
+
+merge file5 from v1_2 to trunk
+
+ $ cvscall -Q up -A
+ $ cvscall -Q up -jv1_2 file5
+ $ cvsci -m"MERGE from v1_2: add file5"
+ cvs commit: Examining .
+
+merge file6 from trunk to v1_2
+
+ $ cvscall -Q up -rv1_2
+ $ cvscall up -jHEAD file6
+ U file6
+ $ cvsci -m"MERGE from HEAD: add file6"
+ cvs commit: Examining .
+
+cvs rlog output
+
+ $ cvscall -q rlog proj | egrep '^(RCS file|revision)'
+ RCS file: $TESTTMP/cvsrepo/proj/file1,v
+ revision 1.1
+ RCS file: $TESTTMP/cvsrepo/proj/Attic/file2,v
+ revision 1.1
+ revision 1.1.4.2
+ revision 1.1.4.1
+ revision 1.1.2.1
+ RCS file: $TESTTMP/cvsrepo/proj/Attic/file3,v
+ revision 1.1
+ revision 1.1.2.1
+ RCS file: $TESTTMP/cvsrepo/proj/Attic/file4,v
+ revision 1.1
+ revision 1.1.2.1
+ RCS file: $TESTTMP/cvsrepo/proj/file5,v
+ revision 1.2
+ revision 1.1
+ revision 1.1.2.1
+ RCS file: $TESTTMP/cvsrepo/proj/file6,v
+ revision 1.1
+ revision 1.1.2.2
+ revision 1.1.2.1
+
+convert to hg (#1)
+
+ $ cd ..
+ $ hg convert --datesort proj proj.hg
+ initializing destination proj.hg repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 15 log entries
+ creating changesets
+ 8 changeset entries
+ sorting...
+ converting...
+ 7 add file1 on trunk
+ 6 add file2
+ 5 add file3, file4 on branch v1_1
+ 4 MERGE from v1_0: add file2
+ 3 add file5 on v1_2
+ 2 add file6 on trunk post-v1_2
+ 1 MERGE from v1_2: add file5
+ 0 MERGE from HEAD: add file6
+
+hg glog output (#1)
+
+ $ hg -R proj.hg glog --template "{rev} {desc}\n"
+ o 7 MERGE from HEAD: add file6
+ |
+ | o 6 MERGE from v1_2: add file5
+ | |
+ | o 5 add file6 on trunk post-v1_2
+ | |
+ o | 4 add file5 on v1_2
+ |/
+ | o 3 MERGE from v1_0: add file2
+ | |
+ | o 2 add file3, file4 on branch v1_1
+ |/
+ | o 1 add file2
+ |/
+ o 0 add file1 on trunk
+
+
+convert to hg (#2: with merge detection)
+
+ $ hg convert \
+ > --config convert.cvsps.mergefrom='"^MERGE from (\S+):"' \
+ > --datesort \
+ > proj proj.hg2
+ initializing destination proj.hg2 repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 15 log entries
+ creating changesets
+ 8 changeset entries
+ sorting...
+ converting...
+ 7 add file1 on trunk
+ 6 add file2
+ 5 add file3, file4 on branch v1_1
+ 4 MERGE from v1_0: add file2
+ 3 add file5 on v1_2
+ 2 add file6 on trunk post-v1_2
+ 1 MERGE from v1_2: add file5
+ 0 MERGE from HEAD: add file6
+
+hg glog output (#2)
+
+ $ hg -R proj.hg2 glog --template "{rev} {desc}\n"
+ o 7 MERGE from HEAD: add file6
+ |
+ | o 6 MERGE from v1_2: add file5
+ | |
+ | o 5 add file6 on trunk post-v1_2
+ | |
+ o | 4 add file5 on v1_2
+ |/
+ | o 3 MERGE from v1_0: add file2
+ | |
+ | o 2 add file3, file4 on branch v1_1
+ |/
+ | o 1 add file2
+ |/
+ o 0 add file1 on trunk
+
diff --git a/tests/test-convert-cvs.t b/tests/test-convert-cvs.t
new file mode 100644
index 0000000..365db71
--- /dev/null
+++ b/tests/test-convert-cvs.t
@@ -0,0 +1,461 @@
+
+ $ "$TESTDIR/hghave" cvs || exit 80
+ $ cvscall()
+ > {
+ > cvs -f "$@"
+ > }
+ $ hgcat()
+ > {
+ > hg --cwd src-hg cat -r tip "$1"
+ > }
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "graphlog = " >> $HGRCPATH
+ $ cat > cvshooks.py <<EOF
+ > def cvslog(ui,repo,hooktype,log):
+ > print "%s hook: %d entries"%(hooktype,len(log))
+ >
+ > def cvschangesets(ui,repo,hooktype,changesets):
+ > print "%s hook: %d changesets"%(hooktype,len(changesets))
+ > EOF
+ $ hookpath=`pwd`
+ $ echo "[hooks]" >> $HGRCPATH
+ $ echo "cvslog=python:$hookpath/cvshooks.py:cvslog" >> $HGRCPATH
+ $ echo "cvschangesets=python:$hookpath/cvshooks.py:cvschangesets" >> $HGRCPATH
+
+create cvs repository
+
+ $ mkdir cvsrepo
+ $ cd cvsrepo
+ $ CVSROOT=`pwd`
+ $ export CVSROOT
+ $ CVS_OPTIONS=-f
+ $ export CVS_OPTIONS
+ $ cd ..
+ $ cvscall -q -d "$CVSROOT" init
+
+create source directory
+
+ $ mkdir src-temp
+ $ cd src-temp
+ $ echo a > a
+ $ mkdir b
+ $ cd b
+ $ echo c > c
+ $ cd ..
+
+import source directory
+
+ $ cvscall -q import -m import src INITIAL start
+ N src/a
+ N src/b/c
+
+ No conflicts created by this import
+
+ $ cd ..
+
+checkout source directory
+
+ $ cvscall -q checkout src
+ U src/a
+ U src/b/c
+
+commit a new revision changing b/c
+
+ $ cd src
+ $ sleep 1
+ $ echo c >> b/c
+ $ cvscall -q commit -mci0 . | grep '<--'
+ $TESTTMP/cvsrepo/src/b/c,v <-- *c (glob)
+ $ cd ..
+
+convert fresh repo
+
+ $ hg convert src src-hg
+ initializing destination src-hg repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 5 log entries
+ cvslog hook: 5 entries
+ creating changesets
+ 3 changeset entries
+ cvschangesets hook: 3 changesets
+ sorting...
+ converting...
+ 2 Initial revision
+ 1 import
+ 0 ci0
+ updating tags
+ $ hgcat a
+ a
+ $ hgcat b/c
+ c
+ c
+
+convert fresh repo with --filemap
+
+ $ echo include b/c > filemap
+ $ hg convert --filemap filemap src src-filemap
+ initializing destination src-filemap repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 5 log entries
+ cvslog hook: 5 entries
+ creating changesets
+ 3 changeset entries
+ cvschangesets hook: 3 changesets
+ sorting...
+ converting...
+ 2 Initial revision
+ 1 import
+ filtering out empty revision
+ repository tip rolled back to revision 0 (undo commit)
+ 0 ci0
+ updating tags
+ $ hgcat b/c
+ c
+ c
+ $ hg -R src-filemap log --template '{rev} {desc} files: {files}\n'
+ 2 update tags files: .hgtags
+ 1 ci0 files: b/c
+ 0 Initial revision files: b/c
+
+convert full repository (issue1649)
+
+ $ cvscall -q -d "$CVSROOT" checkout -d srcfull "." | grep -v CVSROOT
+ U srcfull/src/a
+ U srcfull/src/b/c
+ $ ls srcfull
+ CVS
+ CVSROOT
+ src
+ $ hg convert srcfull srcfull-hg \
+ > | grep -v 'log entries' | grep -v 'hook:' \
+ > | grep -v '^[0-3] .*' # filter instable changeset order
+ initializing destination srcfull-hg repository
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ creating changesets
+ 4 changeset entries
+ sorting...
+ converting...
+ updating tags
+ $ hg cat -r tip --cwd srcfull-hg src/a
+ a
+ $ hg cat -r tip --cwd srcfull-hg src/b/c
+ c
+ c
+
+commit new file revisions
+
+ $ cd src
+ $ echo a >> a
+ $ echo c >> b/c
+ $ cvscall -q commit -mci1 . | grep '<--'
+ $TESTTMP/cvsrepo/src/a,v <-- a
+ $TESTTMP/cvsrepo/src/b/c,v <-- *c (glob)
+ $ cd ..
+
+convert again
+
+ $ hg convert src src-hg
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 7 log entries
+ cvslog hook: 7 entries
+ creating changesets
+ 4 changeset entries
+ cvschangesets hook: 4 changesets
+ sorting...
+ converting...
+ 0 ci1
+ $ hgcat a
+ a
+ a
+ $ hgcat b/c
+ c
+ c
+ c
+
+convert again with --filemap
+
+ $ hg convert --filemap filemap src src-filemap
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 7 log entries
+ cvslog hook: 7 entries
+ creating changesets
+ 4 changeset entries
+ cvschangesets hook: 4 changesets
+ sorting...
+ converting...
+ 0 ci1
+ $ hgcat b/c
+ c
+ c
+ c
+ $ hg -R src-filemap log --template '{rev} {desc} files: {files}\n'
+ 3 ci1 files: b/c
+ 2 update tags files: .hgtags
+ 1 ci0 files: b/c
+ 0 Initial revision files: b/c
+
+commit branch
+
+ $ cd src
+ $ cvs -q update -r1.1 b/c
+ U b/c
+ $ cvs -q tag -b branch
+ T a
+ T b/c
+ $ cvs -q update -r branch > /dev/null
+ $ echo d >> b/c
+ $ cvs -q commit -mci2 . | grep '<--'
+ $TESTTMP/cvsrepo/src/b/c,v <-- *c (glob)
+ $ cd ..
+
+convert again
+
+ $ hg convert src src-hg
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 8 log entries
+ cvslog hook: 8 entries
+ creating changesets
+ 5 changeset entries
+ cvschangesets hook: 5 changesets
+ sorting...
+ converting...
+ 0 ci2
+ $ hgcat b/c
+ c
+ d
+
+convert again with --filemap
+
+ $ hg convert --filemap filemap src src-filemap
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 8 log entries
+ cvslog hook: 8 entries
+ creating changesets
+ 5 changeset entries
+ cvschangesets hook: 5 changesets
+ sorting...
+ converting...
+ 0 ci2
+ $ hgcat b/c
+ c
+ d
+ $ hg -R src-filemap log --template '{rev} {desc} files: {files}\n'
+ 4 ci2 files: b/c
+ 3 ci1 files: b/c
+ 2 update tags files: .hgtags
+ 1 ci0 files: b/c
+ 0 Initial revision files: b/c
+
+commit a new revision with funny log message
+
+ $ cd src
+ $ sleep 1
+ $ echo e >> a
+ $ cvscall -q commit -m'funny
+ > ----------------------------
+ > log message' . | grep '<--' |\
+ > sed -e 's:.*src/\(.*\),v.*:checking in src/\1,v:g'
+ checking in src/a,v
+
+commit new file revisions with some fuzz
+
+ $ sleep 1
+ $ echo f >> a
+ $ cvscall -q commit -mfuzzy . | grep '<--'
+ $TESTTMP/cvsrepo/src/a,v <-- a
+ $ sleep 4 # the two changes will be split if fuzz < 4
+ $ echo g >> b/c
+ $ cvscall -q commit -mfuzzy . | grep '<--'
+ $TESTTMP/cvsrepo/src/b/c,v <-- *c (glob)
+ $ cd ..
+
+convert again
+
+ $ hg convert --config convert.cvsps.fuzz=2 src src-hg
+ connecting to $TESTTMP/cvsrepo
+ scanning source...
+ collecting CVS rlog
+ 11 log entries
+ cvslog hook: 11 entries
+ creating changesets
+ 8 changeset entries
+ cvschangesets hook: 8 changesets
+ sorting...
+ converting...
+ 2 funny
+ 1 fuzzy
+ 0 fuzzy
+ $ hg -R src-hg glog --template '{rev} ({branches}) {desc} files: {files}\n'
+ o 8 (branch) fuzzy files: b/c
+ |
+ o 7 (branch) fuzzy files: a
+ |
+ o 6 (branch) funny
+ | ----------------------------
+ | log message files: a
+ o 5 (branch) ci2 files: b/c
+
+ o 4 () ci1 files: a b/c
+ |
+ o 3 () update tags files: .hgtags
+ |
+ o 2 () ci0 files: b/c
+ |
+ | o 1 (INITIAL) import files:
+ |/
+ o 0 () Initial revision files: a b/c
+
+
+testing debugcvsps
+
+ $ cd src
+ $ hg debugcvsps --fuzz=2
+ collecting CVS rlog
+ 11 log entries
+ cvslog hook: 11 entries
+ creating changesets
+ 10 changeset entries
+ cvschangesets hook: 10 changesets
+ ---------------------
+ PatchSet 1
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: INITIAL
+ Log:
+ Initial revision
+
+ Members:
+ a:INITIAL->1.1
+
+ ---------------------
+ PatchSet 2
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: INITIAL, branch
+ Log:
+ Initial revision
+
+ Members:
+ b/c:INITIAL->1.1
+
+ ---------------------
+ PatchSet 3
+ Date: * (glob)
+ Author: * (glob)
+ Branch: INITIAL
+ Tag: start
+ Log:
+ import
+
+ Members:
+ a:1.1->1.1.1.1
+ b/c:1.1->1.1.1.1
+
+ ---------------------
+ PatchSet 4
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Log:
+ ci0
+
+ Members:
+ b/c:1.1->1.2
+
+ ---------------------
+ PatchSet 5
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: branch
+ Log:
+ ci1
+
+ Members:
+ a:1.1->1.2
+
+ ---------------------
+ PatchSet 6
+ Date: * (glob)
+ Author: * (glob)
+ Branch: HEAD
+ Tag: (none)
+ Log:
+ ci1
+
+ Members:
+ b/c:1.2->1.3
+
+ ---------------------
+ PatchSet 7
+ Date: * (glob)
+ Author: * (glob)
+ Branch: branch
+ Tag: (none)
+ Log:
+ ci2
+
+ Members:
+ b/c:1.1->1.1.2.1
+
+ ---------------------
+ PatchSet 8
+ Date: * (glob)
+ Author: * (glob)
+ Branch: branch
+ Tag: (none)
+ Log:
+ funny
+ ----------------------------
+ log message
+
+ Members:
+ a:1.2->1.2.2.1
+
+ ---------------------
+ PatchSet 9
+ Date: * (glob)
+ Author: * (glob)
+ Branch: branch
+ Tag: (none)
+ Log:
+ fuzzy
+
+ Members:
+ a:1.2.2.1->1.2.2.2
+
+ ---------------------
+ PatchSet 10
+ Date: * (glob)
+ Author: * (glob)
+ Branch: branch
+ Tag: (none)
+ Log:
+ fuzzy
+
+ Members:
+ b/c:1.1.2.1->1.1.2.2
+
+
+ $ cd ..
diff --git a/tests/test-convert-cvsnt-mergepoints.rlog b/tests/test-convert-cvsnt-mergepoints.rlog
new file mode 100644
index 0000000..a690f81
--- /dev/null
+++ b/tests/test-convert-cvsnt-mergepoints.rlog
@@ -0,0 +1,42 @@
+head: 1.2
+branch:
+locks: strict
+access list:
+symbolic names:
+ MYBRANCH1_2: 1.1.2.2.0.2
+ MYBRANCH1_1: 1.1.0.4
+ MYBRANCH1: 1.1.0.2
+keyword substitution: kv
+total revisions: 8; selected revisions: 8
+description:
+----------------------------
+revision 1.2
+date: 2009/04/02 07:00:32; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 14d449d462903487; mergepoint: 1.1.2.2.2.1; filename: foo.txt;
+merge
+----------------------------
+revision 1.1
+date: 2009/04/02 06:50:43; author: user; state: Exp; kopt: kv; commitid: 17ac49d460432d04; filename: foo.txt;
+branches: 1.1.2; 1.1.4;
+foo.txt
+----------------------------
+revision 1.1.4.2
+date: 2009/04/02 07:02:51; author: user; state: Exp; lines: +1 -0; kopt: kv; commitid: 170049d4631b364d; mergepoint: 1.1.2.2; filename: foo.txt;
+merge
+----------------------------
+revision 1.1.4.1
+date: 2009/04/02 06:53:42; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: dc849d460f52f49; filename: foo.txt;
+quux
+----------------------------
+revision 1.1.2.2
+date: 2009/04/02 06:53:20; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 8ec49d460e02f04; filename: foo.txt;
+branches: 1.1.2.2.2;
+baz
+----------------------------
+revision 1.1.2.1
+date: 2009/04/02 06:52:38; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: d5049d460b62e7b; filename: foo.txt;
+bar
+----------------------------
+revision 1.1.2.2.2.1
+date: 2009/04/02 06:55:42; author: user; state: Exp; lines: +1 -1; kopt: kv; commitid: 11c849d4616d30d1; filename: foo.txt;
+bazzie
+=============================================================================
diff --git a/tests/test-convert-cvsnt-mergepoints.t b/tests/test-convert-cvsnt-mergepoints.t
new file mode 100644
index 0000000..1e3d02b
--- /dev/null
+++ b/tests/test-convert-cvsnt-mergepoints.t
@@ -0,0 +1,207 @@
+
+ $ "$TESTDIR/hghave" cvs || exit 80
+ $ filterpath()
+ > {
+ > eval "$@" | sed "s:$CVSROOT:*REPO*:g"
+ > }
+ $ cvscall()
+ > {
+ > cvs -f "$@"
+ > }
+
+output of 'cvs ci' varies unpredictably, so discard most of it
+-- just keep the part that matters
+
+ $ cvsci()
+ > {
+ > cvs -f ci -f "$@" > /dev/null
+ > }
+ $ hgcat()
+ > {
+ > hg --cwd src-hg cat -r tip "$1"
+ > }
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "graphlog = " >> $HGRCPATH
+
+create cvs repository
+
+ $ mkdir cvsmaster
+ $ cd cvsmaster
+ $ CVSROOT=`pwd`
+ $ export CVSROOT
+ $ CVS_OPTIONS=-f
+ $ export CVS_OPTIONS
+ $ cd ..
+ $ filterpath cvscall -Q -d "$CVSROOT" init
+
+checkout #1: add foo.txt
+
+ $ cvscall -Q checkout -d cvsworktmp .
+ $ cd cvsworktmp
+ $ mkdir foo
+ $ cvscall -Q add foo
+ $ cd foo
+ $ echo foo > foo.txt
+ $ cvscall -Q add foo.txt
+ $ cvsci -m "add foo.txt" foo.txt
+ $ cd ../..
+ $ rm -rf cvsworktmp
+
+checkout #2: create MYBRANCH1 and modify foo.txt on it
+
+ $ cvscall -Q checkout -d cvswork foo
+ $ cd cvswork
+ $ cvscall -q rtag -b -R MYBRANCH1 foo
+ $ cvscall -Q update -P -r MYBRANCH1
+ $ echo bar > foo.txt
+ $ cvsci -m "bar" foo.txt
+ $ echo baz > foo.txt
+ $ cvsci -m "baz" foo.txt
+
+create MYBRANCH1_2 and modify foo.txt some more
+
+ $ cvscall -q rtag -b -R -r MYBRANCH1 MYBRANCH1_2 foo
+ $ cvscall -Q update -P -r MYBRANCH1_2
+ $ echo bazzie > foo.txt
+ $ cvsci -m "bazzie" foo.txt
+
+create MYBRANCH1_1 and modify foo.txt yet again
+
+ $ cvscall -q rtag -b -R MYBRANCH1_1 foo
+ $ cvscall -Q update -P -r MYBRANCH1_1
+ $ echo quux > foo.txt
+ $ cvsci -m "quux" foo.txt
+
+merge MYBRANCH1 to MYBRANCH1_1
+
+ $ filterpath cvscall -Q update -P -jMYBRANCH1
+ rcsmerge: warning: conflicts during merge
+ RCS file: *REPO*/foo/foo.txt,v
+ retrieving revision 1.1
+ retrieving revision 1.1.2.2
+ Merging differences between 1.1 and 1.1.2.2 into foo.txt
+
+carefully placed sleep to dodge cvs bug (optimization?) where it
+sometimes ignores a "commit" command if it comes too fast (the -f
+option in cvsci seems to work for all the other commits in this
+script)
+
+ $ sleep 1
+ $ echo xyzzy > foo.txt
+ $ cvsci -m "merge1+clobber" foo.txt
+
+#if unix-permissions
+
+return to trunk and merge MYBRANCH1_2
+
+ $ cvscall -Q update -P -A
+ $ filterpath cvscall -Q update -P -jMYBRANCH1_2
+ RCS file: *REPO*/foo/foo.txt,v
+ retrieving revision 1.1
+ retrieving revision 1.1.2.2.2.1
+ Merging differences between 1.1 and 1.1.2.2.2.1 into foo.txt
+ $ cvsci -m "merge2" foo.txt
+ $ REALCVS=`which cvs`
+ $ echo "for x in \$*; do if [ \"\$x\" = \"rlog\" ]; then echo \"RCS file: $CVSROOT/foo/foo.txt,v\"; cat \"$TESTDIR/test-convert-cvsnt-mergepoints.rlog\"; exit 0; fi; done; $REALCVS \$*" > ../cvs
+ $ chmod +x ../cvs
+ $ PATH=..:${PATH} hg debugcvsps --parents foo
+ collecting CVS rlog
+ 7 log entries
+ creating changesets
+ 7 changeset entries
+ ---------------------
+ PatchSet 1
+ Date: * (glob)
+ Author: user
+ Branch: HEAD
+ Tag: (none)
+ Branchpoints: MYBRANCH1_1, MYBRANCH1
+ Log:
+ foo.txt
+
+ Members:
+ foo.txt:INITIAL->1.1
+
+ ---------------------
+ PatchSet 2
+ Date: * (glob)
+ Author: user
+ Branch: MYBRANCH1
+ Tag: (none)
+ Parent: 1
+ Log:
+ bar
+
+ Members:
+ foo.txt:1.1->1.1.2.1
+
+ ---------------------
+ PatchSet 3
+ Date: * (glob)
+ Author: user
+ Branch: MYBRANCH1
+ Tag: (none)
+ Branchpoints: MYBRANCH1_2
+ Parent: 2
+ Log:
+ baz
+
+ Members:
+ foo.txt:1.1.2.1->1.1.2.2
+
+ ---------------------
+ PatchSet 4
+ Date: * (glob)
+ Author: user
+ Branch: MYBRANCH1_1
+ Tag: (none)
+ Parent: 1
+ Log:
+ quux
+
+ Members:
+ foo.txt:1.1->1.1.4.1
+
+ ---------------------
+ PatchSet 5
+ Date: * (glob)
+ Author: user
+ Branch: MYBRANCH1_2
+ Tag: (none)
+ Parent: 3
+ Log:
+ bazzie
+
+ Members:
+ foo.txt:1.1.2.2->1.1.2.2.2.1
+
+ ---------------------
+ PatchSet 6
+ Date: * (glob)
+ Author: user
+ Branch: HEAD
+ Tag: (none)
+ Parents: 1,5
+ Log:
+ merge
+
+ Members:
+ foo.txt:1.1->1.2
+
+ ---------------------
+ PatchSet 7
+ Date: * (glob)
+ Author: user
+ Branch: MYBRANCH1_1
+ Tag: (none)
+ Parents: 4,3
+ Log:
+ merge
+
+ Members:
+ foo.txt:1.1.4.1->1.1.4.2
+
+#endif
+
+ $ cd ..
diff --git a/tests/test-convert-darcs.t b/tests/test-convert-darcs.t
new file mode 100644
index 0000000..b32cbde
--- /dev/null
+++ b/tests/test-convert-darcs.t
@@ -0,0 +1,110 @@
+
+ $ "$TESTDIR/hghave" darcs || exit 80
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+ $ DARCS_EMAIL='test@example.org'; export DARCS_EMAIL
+
+skip if we can't import elementtree
+
+ $ mkdir dummy
+ $ mkdir dummy/_darcs
+ $ if hg convert dummy 2>&1 | grep ElementTree > /dev/null; then
+ > echo 'skipped: missing feature: elementtree module'
+ > exit 80
+ > fi
+
+#if no-outer-repo
+
+try converting darcs1 repository
+
+ $ hg clone -q "$TESTDIR/bundles/darcs1.hg" darcs
+ $ hg convert -s darcs darcs/darcs1 2>&1 | grep darcs-1.0
+ darcs-1.0 repository format is unsupported, please upgrade
+
+#endif
+
+initialize darcs repo
+
+ $ mkdir darcs-repo
+ $ cd darcs-repo
+ $ darcs init
+ $ echo a > a
+ $ darcs record -a -l -m p0
+ Finished recording patch 'p0'
+ $ cd ..
+
+branch and update
+
+ $ darcs get -q darcs-repo darcs-clone >/dev/null
+ $ cd darcs-clone
+ $ echo c >> a
+ $ echo c > c
+ $ darcs record -a -l -m p1.1
+ Finished recording patch 'p1.1'
+ $ cd ..
+
+update source
+
+ $ cd darcs-repo
+ $ echo b >> a
+ $ echo b > b
+ $ darcs record -a -l -m p1.2
+ Finished recording patch 'p1.2'
+
+ $ darcs pull -q -a --no-set-default ../darcs-clone
+ Backing up ./a(*) (glob)
+ We have conflicts in the following files:
+ ./a
+ $ sleep 1
+ $ echo e > a
+ $ echo f > f
+ $ mkdir dir
+ $ echo d > dir/d
+ $ echo d > dir/d2
+ $ darcs record -a -l -m p2
+ Finished recording patch 'p2'
+
+test file and directory move
+
+ $ darcs mv f ff
+
+Test remove + move
+
+ $ darcs remove dir/d2
+ $ rm dir/d2
+ $ darcs mv dir dir2
+ $ darcs record -a -l -m p3
+ Finished recording patch 'p3'
+
+The converter does not currently handle patch conflicts very well.
+When they occur, it reverts *all* changes and moves forward,
+letting the conflict resolving patch fix collisions.
+Unfortunately, non-conflicting changes, like the addition of the
+"c" file in p1.1 patch are reverted too.
+Just to say that manifest not listing "c" here is a bug.
+
+ $ cd ..
+ $ hg convert darcs-repo darcs-repo-hg
+ initializing destination darcs-repo-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 4 p0
+ 3 p1.2
+ 2 p1.1
+ 1 p2
+ 0 p3
+ $ hg log -R darcs-repo-hg -g --template '{rev} "{desc|firstline}" ({author}) files: {files}\n' "$@"
+ 4 "p3" (test@example.org) files: dir/d dir/d2 dir2/d f ff
+ 3 "p2" (test@example.org) files: a dir/d dir/d2 f
+ 2 "p1.1" (test@example.org) files:
+ 1 "p1.2" (test@example.org) files: a b
+ 0 "p0" (test@example.org) files: a
+
+ $ hg up -q -R darcs-repo-hg
+ $ hg -R darcs-repo-hg manifest --debug
+ 7225b30cdf38257d5cc7780772c051b6f33e6d6b 644 a
+ 1e88685f5ddec574a34c70af492f95b6debc8741 644 b
+ 37406831adc447ec2385014019599dfec953c806 644 dir2/d
+ b783a337463792a5c7d548ad85a7d3253c16ba8c 644 ff
diff --git a/tests/test-convert-datesort.t b/tests/test-convert-datesort.t
new file mode 100644
index 0000000..486f656
--- /dev/null
+++ b/tests/test-convert-datesort.t
@@ -0,0 +1,119 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > graphlog=
+ > EOF
+ $ hg init t
+ $ cd t
+ $ echo a >> a
+ $ hg ci -Am a0 -d '1 0'
+ adding a
+ $ hg branch brancha
+ marked working directory as branch brancha
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >> a
+ $ hg ci -m a1 -d '2 0'
+ $ echo a >> a
+ $ hg ci -m a2 -d '3 0'
+ $ echo a >> a
+ $ hg ci -m a3 -d '4 0'
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch branchb
+ marked working directory as branch branchb
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b >> b
+ $ hg ci -Am b0 -d '6 0'
+ adding b
+ $ hg up -C brancha
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg ci -m a4 -d '5 0'
+ $ echo a >> a
+ $ hg ci -m a5 -d '7 0'
+ $ echo a >> a
+ $ hg ci -m a6 -d '8 0'
+ $ hg up -C branchb
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b >> b
+ $ hg ci -m b1 -d '9 0'
+ $ cd ..
+
+convert with datesort
+
+ $ hg convert --datesort t t-datesort
+ initializing destination t-datesort repository
+ scanning source...
+ sorting...
+ converting...
+ 8 a0
+ 7 a1
+ 6 a2
+ 5 a3
+ 4 a4
+ 3 b0
+ 2 a5
+ 1 a6
+ 0 b1
+
+graph converted repo
+
+ $ hg -R t-datesort glog --template '{rev} "{desc}"\n'
+ o 8 "b1"
+ |
+ | o 7 "a6"
+ | |
+ | o 6 "a5"
+ | |
+ o | 5 "b0"
+ | |
+ | o 4 "a4"
+ | |
+ | o 3 "a3"
+ | |
+ | o 2 "a2"
+ | |
+ | o 1 "a1"
+ |/
+ o 0 "a0"
+
+
+convert with datesort (default mode)
+
+ $ hg convert t t-sourcesort
+ initializing destination t-sourcesort repository
+ scanning source...
+ sorting...
+ converting...
+ 8 a0
+ 7 a1
+ 6 a2
+ 5 a3
+ 4 b0
+ 3 a4
+ 2 a5
+ 1 a6
+ 0 b1
+
+graph converted repo
+
+ $ hg -R t-sourcesort glog --template '{rev} "{desc}"\n'
+ o 8 "b1"
+ |
+ | o 7 "a6"
+ | |
+ | o 6 "a5"
+ | |
+ | o 5 "a4"
+ | |
+ o | 4 "b0"
+ | |
+ | o 3 "a3"
+ | |
+ | o 2 "a2"
+ | |
+ | o 1 "a1"
+ |/
+ o 0 "a0"
+
diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t
new file mode 100644
index 0000000..e351d7c
--- /dev/null
+++ b/tests/test-convert-filemap.t
@@ -0,0 +1,596 @@
+
+ $ HGMERGE=true; export HGMERGE
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+ $ echo 'convert =' >> $HGRCPATH
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc}" files: {files}\n' "$@"
+ > }
+ $ hg init source
+ $ cd source
+ $ echo foo > foo
+ $ echo baz > baz
+ $ mkdir -p dir/subdir
+ $ echo dir/file >> dir/file
+ $ echo dir/file2 >> dir/file2
+ $ echo dir/file3 >> dir/file3 # to be corrupted in rev 0
+ $ echo dir/subdir/file3 >> dir/subdir/file3
+ $ echo dir/subdir/file4 >> dir/subdir/file4
+ $ hg ci -d '0 0' -qAm '0: add foo baz dir/'
+ $ echo bar > bar
+ $ echo quux > quux
+ $ echo dir/file4 >> dir/file4 # to be corrupted in rev 1
+ $ hg copy foo copied
+ $ hg ci -d '1 0' -qAm '1: add bar quux; copy foo to copied'
+ $ echo >> foo
+ $ hg ci -d '2 0' -m '2: change foo'
+ $ hg up -qC 1
+ $ echo >> bar
+ $ echo >> quux
+ $ hg ci -d '3 0' -m '3: change bar quux'
+ created new head
+ $ hg up -qC 2
+ $ hg merge -qr 3
+ $ echo >> bar
+ $ echo >> baz
+ $ hg ci -d '4 0' -m '4: first merge; change bar baz'
+ $ echo >> bar
+ $ echo 1 >> baz
+ $ echo >> quux
+ $ hg ci -d '5 0' -m '5: change bar baz quux'
+ $ hg up -qC 4
+ $ echo >> foo
+ $ echo 2 >> baz
+ $ hg ci -d '6 0' -m '6: change foo baz'
+ created new head
+ $ hg up -qC 5
+ $ hg merge -qr 6
+ $ echo >> bar
+ $ hg ci -d '7 0' -m '7: second merge; change bar'
+ $ echo >> foo
+ $ hg ci -m '8: change foo'
+ $ glog
+ @ 8 "8: change foo" files: foo
+ |
+ o 7 "7: second merge; change bar" files: bar baz
+ |\
+ | o 6 "6: change foo baz" files: baz foo
+ | |
+ o | 5 "5: change bar baz quux" files: bar baz quux
+ |/
+ o 4 "4: first merge; change bar baz" files: bar baz
+ |\
+ | o 3 "3: change bar quux" files: bar quux
+ | |
+ o | 2 "2: change foo" files: foo
+ |/
+ o 1 "1: add bar quux; copy foo to copied" files: bar copied dir/file4 quux
+ |
+ o 0 "0: add foo baz dir/" files: baz dir/file dir/file2 dir/file3 dir/subdir/file3 dir/subdir/file4 foo
+
+
+final file versions in this repo:
+
+ $ hg manifest --debug
+ 9463f52fe115e377cf2878d4fc548117211063f2 644 bar
+ 94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644 baz
+ 7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644 copied
+ 3e20847584beff41d7cd16136b7331ab3d754be0 644 dir/file
+ 75e6d3f8328f5f6ace6bf10b98df793416a09dca 644 dir/file2
+ e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c 644 dir/file3
+ 6edd55f559cdce67132b12ca09e09cee08b60442 644 dir/file4
+ 5fe139720576e18e34bcc9f79174db8897c8afe9 644 dir/subdir/file3
+ 57a1c1511590f3de52874adfa04effe8a77d64af 644 dir/subdir/file4
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+ bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux
+ $ hg debugrename copied
+ copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+
+ $ cd ..
+ $ splitrepo()
+ > {
+ > msg="$1"
+ > files="$2"
+ > opts=$3
+ > echo "% $files: $msg"
+ > prefix=`echo "$files" | sed -e 's/ /-/g'`
+ > fmap="$prefix.fmap"
+ > repo="$prefix.repo"
+ > for i in $files; do
+ > echo "include $i" >> "$fmap"
+ > done
+ > hg -q convert $opts --filemap "$fmap" --datesort source "$repo"
+ > hg up -q -R "$repo"
+ > glog -R "$repo"
+ > hg -R "$repo" manifest --debug
+ > }
+ $ splitrepo 'skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd' foo
+ % foo: skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd
+ @ 3 "8: change foo" files: foo
+ |
+ o 2 "6: change foo baz" files: foo
+ |
+ o 1 "2: change foo" files: foo
+ |
+ o 0 "0: add foo baz dir/" files: foo
+
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+ $ splitrepo 'merges are not merges anymore' bar
+ % bar: merges are not merges anymore
+ @ 4 "7: second merge; change bar" files: bar
+ |
+ o 3 "5: change bar baz quux" files: bar
+ |
+ o 2 "4: first merge; change bar baz" files: bar
+ |
+ o 1 "3: change bar quux" files: bar
+ |
+ o 0 "1: add bar quux; copy foo to copied" files: bar
+
+ 9463f52fe115e377cf2878d4fc548117211063f2 644 bar
+ $ splitrepo '1st merge is not a merge anymore; 2nd still is' baz
+ % baz: 1st merge is not a merge anymore; 2nd still is
+ @ 4 "7: second merge; change bar" files: baz
+ |\
+ | o 3 "6: change foo baz" files: baz
+ | |
+ o | 2 "5: change bar baz quux" files: baz
+ |/
+ o 1 "4: first merge; change bar baz" files: baz
+ |
+ o 0 "0: add foo baz dir/" files: baz
+
+ 94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644 baz
+ $ splitrepo 'we add additional merges when they are interesting' 'foo quux'
+ % foo quux: we add additional merges when they are interesting
+ @ 8 "8: change foo" files: foo
+ |
+ o 7 "7: second merge; change bar" files:
+ |\
+ | o 6 "6: change foo baz" files: foo
+ | |
+ o | 5 "5: change bar baz quux" files: quux
+ |/
+ o 4 "4: first merge; change bar baz" files:
+ |\
+ | o 3 "3: change bar quux" files: quux
+ | |
+ o | 2 "2: change foo" files: foo
+ |/
+ o 1 "1: add bar quux; copy foo to copied" files: quux
+ |
+ o 0 "0: add foo baz dir/" files: foo
+
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+ bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux
+ $ splitrepo 'partial conversion' 'bar quux' '-r 3'
+ % bar quux: partial conversion
+ @ 1 "3: change bar quux" files: bar quux
+ |
+ o 0 "1: add bar quux; copy foo to copied" files: bar quux
+
+ b79105bedc55102f394e90a789c9c380117c1b4a 644 bar
+ db0421cc6b685a458c8d86c7d5c004f94429ea23 644 quux
+ $ splitrepo 'complete the partial conversion' 'bar quux'
+ % bar quux: complete the partial conversion
+ @ 4 "7: second merge; change bar" files: bar
+ |
+ o 3 "5: change bar baz quux" files: bar quux
+ |
+ o 2 "4: first merge; change bar baz" files: bar
+ |
+ o 1 "3: change bar quux" files: bar quux
+ |
+ o 0 "1: add bar quux; copy foo to copied" files: bar quux
+
+ 9463f52fe115e377cf2878d4fc548117211063f2 644 bar
+ bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux
+ $ rm -r foo.repo
+ $ splitrepo 'partial conversion' 'foo' '-r 3'
+ % foo: partial conversion
+ @ 0 "0: add foo baz dir/" files: foo
+
+ 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 foo
+ $ splitrepo 'complete the partial conversion' 'foo'
+ % foo: complete the partial conversion
+ @ 3 "8: change foo" files: foo
+ |
+ o 2 "6: change foo baz" files: foo
+ |
+ o 1 "2: change foo" files: foo
+ |
+ o 0 "0: add foo baz dir/" files: foo
+
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+ $ splitrepo 'copied file; source not included in new repo' copied
+ % copied: copied file; source not included in new repo
+ @ 0 "1: add bar quux; copy foo to copied" files: copied
+
+ 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 copied
+ $ hg --cwd copied.repo debugrename copied
+ copied not renamed
+ $ splitrepo 'copied file; source included in new repo' 'foo copied'
+ % foo copied: copied file; source included in new repo
+ @ 4 "8: change foo" files: foo
+ |
+ o 3 "6: change foo baz" files: foo
+ |
+ o 2 "2: change foo" files: foo
+ |
+ o 1 "1: add bar quux; copy foo to copied" files: copied
+ |
+ o 0 "0: add foo baz dir/" files: foo
+
+ 7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644 copied
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+ $ hg --cwd foo-copied.repo debugrename copied
+ copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+ $ cat > renames.fmap <<EOF
+ > include dir
+ > exclude dir/file2
+ > rename dir dir2
+ > include foo
+ > include copied
+ > rename foo foo2
+ > rename copied copied2
+ > exclude dir/subdir
+ > include dir/subdir/file3
+ > EOF
+ $ rm source/.hg/store/data/dir/file3.i
+ $ rm source/.hg/store/data/dir/file4.i
+ $ hg -q convert --filemap renames.fmap --datesort source dummydest
+ abort: data/dir/file3.i@e96dce0bc6a2: no match found!
+ [255]
+ $ hg -q convert --filemap renames.fmap --datesort --config convert.hg.ignoreerrors=1 source renames.repo
+ ignoring: data/dir/file3.i@e96dce0bc6a2: no match found
+ ignoring: data/dir/file4.i@6edd55f559cd: no match found
+ $ hg up -q -R renames.repo
+ $ glog -R renames.repo
+ @ 4 "8: change foo" files: foo2
+ |
+ o 3 "6: change foo baz" files: foo2
+ |
+ o 2 "2: change foo" files: foo2
+ |
+ o 1 "1: add bar quux; copy foo to copied" files: copied2
+ |
+ o 0 "0: add foo baz dir/" files: dir2/file dir2/subdir/file3 foo2
+
+ $ hg -R renames.repo manifest --debug
+ d43feacba7a4f1f2080dde4a4b985bd8a0236d46 644 copied2
+ 3e20847584beff41d7cd16136b7331ab3d754be0 644 dir2/file
+ 5fe139720576e18e34bcc9f79174db8897c8afe9 644 dir2/subdir/file3
+ 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo2
+ $ hg --cwd renames.repo debugrename copied2
+ copied2 renamed from foo2:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+
+copied:
+
+ $ hg --cwd source cat copied
+ foo
+
+copied2:
+
+ $ hg --cwd renames.repo cat copied2
+ foo
+
+filemap errors
+
+ $ cat > errors.fmap <<EOF
+ > include dir/ # beware that comments changes error line numbers!
+ > exclude /dir
+ > rename dir//dir /dir//dir/ "out of sync"
+ > include
+ > EOF
+ $ hg -q convert --filemap errors.fmap source errors.repo
+ errors.fmap:1: superfluous / in exclude 'dir/'
+ errors.fmap:3: superfluous / in include '/dir'
+ errors.fmap:3: superfluous / in rename '/dir'
+ errors.fmap:3: superfluous / in exclude 'dir//dir'
+ errors.fmap:4: unknown directive 'out of sync'
+ errors.fmap:5: path to exclude is missing
+ abort: errors in filemap
+ [255]
+
+test branch closing revision pruning if branch is pruned
+
+ $ hg init branchpruning
+ $ cd branchpruning
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg ci --close-branch -m closefoo
+ $ hg up 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch empty
+ marked working directory as branch empty
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m emptybranch
+ $ hg ci --close-branch -m closeempty
+ $ hg up 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch default
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+ $ hg ci --close-branch -m closedefault
+ $ cat > filemap <<EOF
+ > include b
+ > EOF
+ $ cd ..
+ $ hg convert branchpruning branchpruning-hg1
+ initializing destination branchpruning-hg1 repository
+ scanning source...
+ sorting...
+ converting...
+ 5 adda
+ 4 closefoo
+ 3 emptybranch
+ 2 closeempty
+ 1 addb
+ 0 closedefault
+ $ glog -R branchpruning-hg1
+ o 5 "closedefault" files:
+ |
+ o 4 "addb" files: b
+ |
+ | o 3 "closeempty" files:
+ | |
+ | o 2 "emptybranch" files:
+ |/
+ | o 1 "closefoo" files:
+ |/
+ o 0 "adda" files: a
+
+
+exercise incremental conversion at the same time
+
+ $ hg convert -r0 --filemap branchpruning/filemap branchpruning branchpruning-hg2
+ initializing destination branchpruning-hg2 repository
+ scanning source...
+ sorting...
+ converting...
+ 0 adda
+ $ hg convert -r4 --filemap branchpruning/filemap branchpruning branchpruning-hg2
+ scanning source...
+ sorting...
+ converting...
+ 0 addb
+ $ hg convert --filemap branchpruning/filemap branchpruning branchpruning-hg2
+ scanning source...
+ sorting...
+ converting...
+ 3 closefoo
+ 2 emptybranch
+ 1 closeempty
+ 0 closedefault
+ $ glog -R branchpruning-hg2
+ o 1 "closedefault" files:
+ |
+ o 0 "addb" files: b
+
+
+filemap rename undoing revision rename
+
+ $ hg init renameundo
+ $ cd renameundo
+ $ echo 1 > a
+ $ echo 1 > c
+ $ hg ci -qAm add
+ $ hg mv -q a b/a
+ $ hg mv -q c b/c
+ $ hg ci -qm rename
+ $ echo 2 > b/a
+ $ echo 2 > b/c
+ $ hg ci -qm modify
+ $ cd ..
+
+ $ echo "rename b ." > renameundo.fmap
+ $ hg convert --filemap renameundo.fmap renameundo renameundo2
+ initializing destination renameundo2 repository
+ scanning source...
+ sorting...
+ converting...
+ 2 add
+ 1 rename
+ filtering out empty revision
+ repository tip rolled back to revision 0 (undo commit)
+ 0 modify
+ $ glog -R renameundo2
+ o 1 "modify" files: a c
+ |
+ o 0 "add" files: a c
+
+
+
+test merge parents/empty merges pruning
+
+ $ glog()
+ > {
+ > hg glog --template '{rev}:{node|short}@{branch} "{desc}" files: {files}\n' "$@"
+ > }
+
+test anonymous branch pruning
+
+ $ hg init anonymousbranch
+ $ cd anonymousbranch
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Am add
+ adding a
+ adding b
+ $ echo a >> a
+ $ hg ci -m changea
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b >> b
+ $ hg ci -m changeb
+ created new head
+ $ hg up 1
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ cd ..
+
+ $ cat > filemap <<EOF
+ > include a
+ > EOF
+ $ hg convert --filemap filemap anonymousbranch anonymousbranch-hg
+ initializing destination anonymousbranch-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 3 add
+ 2 changea
+ 1 changeb
+ 0 merge
+ $ glog -R anonymousbranch
+ @ 3:c71d5201a498@default "merge" files:
+ |\
+ | o 2:607eb44b17f9@default "changeb" files: b
+ | |
+ o | 1:1f60ea617824@default "changea" files: a
+ |/
+ o 0:0146e6129113@default "add" files: a b
+
+ $ glog -R anonymousbranch-hg
+ o 1:cda818e7219b@default "changea" files: a
+ |
+ o 0:c334dc3be0da@default "add" files: a
+
+ $ cat anonymousbranch-hg/.hg/shamap
+ 0146e6129113dba9ac90207cfdf2d7ed35257ae5 c334dc3be0daa2a4e9ce4d2e2bdcba40c09d4916
+ 1f60ea61782421edf8d051ff4fcb61b330f26a4a cda818e7219b5f7f3fb9f49780054ed6a1905ec3
+ 607eb44b17f9348cd5cbd26e16af87ba77b0b037 c334dc3be0daa2a4e9ce4d2e2bdcba40c09d4916
+ c71d5201a498b2658d105a6bf69d7a0df2649aea cda818e7219b5f7f3fb9f49780054ed6a1905ec3
+
+ $ cat > filemap <<EOF
+ > include b
+ > EOF
+ $ hg convert --filemap filemap anonymousbranch anonymousbranch-hg2
+ initializing destination anonymousbranch-hg2 repository
+ scanning source...
+ sorting...
+ converting...
+ 3 add
+ 2 changea
+ 1 changeb
+ 0 merge
+ $ glog -R anonymousbranch
+ @ 3:c71d5201a498@default "merge" files:
+ |\
+ | o 2:607eb44b17f9@default "changeb" files: b
+ | |
+ o | 1:1f60ea617824@default "changea" files: a
+ |/
+ o 0:0146e6129113@default "add" files: a b
+
+ $ glog -R anonymousbranch-hg2
+ o 1:62dd350b0df6@default "changeb" files: b
+ |
+ o 0:4b9ced861657@default "add" files: b
+
+ $ cat anonymousbranch-hg2/.hg/shamap
+ 0146e6129113dba9ac90207cfdf2d7ed35257ae5 4b9ced86165703791653059a1db6ed864630a523
+ 1f60ea61782421edf8d051ff4fcb61b330f26a4a 4b9ced86165703791653059a1db6ed864630a523
+ 607eb44b17f9348cd5cbd26e16af87ba77b0b037 62dd350b0df695f7d2c82a02e0499b16fd790f22
+ c71d5201a498b2658d105a6bf69d7a0df2649aea 62dd350b0df695f7d2c82a02e0499b16fd790f22
+
+test named branch pruning
+
+ $ hg init namedbranch
+ $ cd namedbranch
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Am add
+ adding a
+ adding b
+ $ echo a >> a
+ $ hg ci -m changea
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b >> b
+ $ hg ci -m changeb
+ $ hg up default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ cd ..
+
+ $ cat > filemap <<EOF
+ > include a
+ > EOF
+ $ hg convert --filemap filemap namedbranch namedbranch-hg
+ initializing destination namedbranch-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 3 add
+ 2 changea
+ 1 changeb
+ 0 merge
+ $ glog -R namedbranch
+ @ 3:73899bcbe45c@default "merge" files:
+ |\
+ | o 2:8097982d19fc@foo "changeb" files: b
+ | |
+ o | 1:1f60ea617824@default "changea" files: a
+ |/
+ o 0:0146e6129113@default "add" files: a b
+
+ $ glog -R namedbranch-hg
+ o 1:cda818e7219b@default "changea" files: a
+ |
+ o 0:c334dc3be0da@default "add" files: a
+
+
+ $ cd namedbranch
+ $ hg --config extensions.mq= strip tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/namedbranch/.hg/strip-backup/73899bcbe45c-backup.hg (glob)
+ $ hg up foo
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ cd ..
+
+ $ hg convert --filemap filemap namedbranch namedbranch-hg2
+ initializing destination namedbranch-hg2 repository
+ scanning source...
+ sorting...
+ converting...
+ 3 add
+ 2 changea
+ 1 changeb
+ 0 merge
+ $ glog -R namedbranch
+ @ 3:e1959de76e1b@foo "merge" files:
+ |\
+ | o 2:8097982d19fc@foo "changeb" files: b
+ | |
+ o | 1:1f60ea617824@default "changea" files: a
+ |/
+ o 0:0146e6129113@default "add" files: a b
+
+ $ glog -R namedbranch-hg2
+ o 2:dcf314454667@foo "merge" files:
+ |\
+ | o 1:cda818e7219b@default "changea" files: a
+ |/
+ o 0:c334dc3be0da@default "add" files: a
+
diff --git a/tests/test-convert-git.t b/tests/test-convert-git.t
new file mode 100644
index 0000000..e4261b7
--- /dev/null
+++ b/tests/test-convert-git.t
@@ -0,0 +1,300 @@
+
+ $ "$TESTDIR/hghave" git || exit 80
+ $ echo "[core]" >> $HOME/.gitconfig
+ $ echo "autocrlf = false" >> $HOME/.gitconfig
+ $ echo "[core]" >> $HOME/.gitconfig
+ $ echo "autocrlf = false" >> $HOME/.gitconfig
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'hgext.graphlog =' >> $HGRCPATH
+ $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
+ $ GIT_AUTHOR_EMAIL='test@example.org'; export GIT_AUTHOR_EMAIL
+ $ GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0000"; export GIT_AUTHOR_DATE
+ $ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
+ $ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
+ $ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
+ $ count=10
+ $ commit()
+ > {
+ > GIT_AUTHOR_DATE="2007-01-01 00:00:$count +0000"
+ > GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
+ > git commit "$@" >/dev/null 2>/dev/null || echo "git commit error"
+ > count=`expr $count + 1`
+ > }
+ $ mkdir git-repo
+ $ cd git-repo
+ $ git init-db >/dev/null 2>/dev/null
+ $ echo a > a
+ $ mkdir d
+ $ echo b > d/b
+ $ git add a d
+ $ commit -a -m t1
+
+Remove the directory, then try to replace it with a file
+(issue 754)
+
+ $ git rm -f d/b
+ rm 'd/b'
+ $ commit -m t2
+ $ echo d > d
+ $ git add d
+ $ commit -m t3
+ $ echo b >> a
+ $ commit -a -m t4.1
+ $ git checkout -b other HEAD~ >/dev/null 2>/dev/null
+ $ echo c > a
+ $ echo a >> a
+ $ commit -a -m t4.2
+ $ git checkout master >/dev/null 2>/dev/null
+ $ git pull --no-commit . other > /dev/null 2>/dev/null
+ $ commit -m 'Merge branch other'
+ $ cd ..
+ $ hg convert --datesort git-repo
+ assuming destination git-repo-hg
+ initializing destination git-repo-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 5 t1
+ 4 t2
+ 3 t3
+ 2 t4.1
+ 1 t4.2
+ 0 Merge branch other
+ updating bookmarks
+ $ hg up -q -R git-repo-hg
+ $ hg -R git-repo-hg tip -v
+ changeset: 5:c78094926be2
+ bookmark: master
+ tag: tip
+ parent: 3:f5f5cb45432b
+ parent: 4:4e174f80c67c
+ user: test <test@example.org>
+ date: Mon Jan 01 00:00:15 2007 +0000
+ files: a
+ description:
+ Merge branch other
+
+
+ $ count=10
+ $ mkdir git-repo2
+ $ cd git-repo2
+ $ git init-db >/dev/null 2>/dev/null
+ $ echo foo > foo
+ $ git add foo
+ $ commit -a -m 'add foo'
+ $ echo >> foo
+ $ commit -a -m 'change foo'
+ $ git checkout -b Bar HEAD~ >/dev/null 2>/dev/null
+ $ echo quux >> quux
+ $ git add quux
+ $ commit -a -m 'add quux'
+ $ echo bar > bar
+ $ git add bar
+ $ commit -a -m 'add bar'
+ $ git checkout -b Baz HEAD~ >/dev/null 2>/dev/null
+ $ echo baz > baz
+ $ git add baz
+ $ commit -a -m 'add baz'
+ $ git checkout master >/dev/null 2>/dev/null
+ $ git pull --no-commit . Bar Baz > /dev/null 2>/dev/null
+ $ commit -m 'Octopus merge'
+ $ echo bar >> bar
+ $ commit -a -m 'change bar'
+ $ git checkout -b Foo HEAD~ >/dev/null 2>/dev/null
+ $ echo >> foo
+ $ commit -a -m 'change foo'
+ $ git checkout master >/dev/null 2>/dev/null
+ $ git pull --no-commit -s ours . Foo > /dev/null 2>/dev/null
+ $ commit -m 'Discard change to foo'
+ $ cd ..
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc|firstline}" files: {files}\n' "$@"
+ > }
+ $ splitrepo()
+ > {
+ > msg="$1"
+ > files="$2"
+ > opts=$3
+ > echo "% $files: $msg"
+ > prefix=`echo "$files" | sed -e 's/ /-/g'`
+ > fmap="$prefix.fmap"
+ > repo="$prefix.repo"
+ > for i in $files; do
+ > echo "include $i" >> "$fmap"
+ > done
+ > hg -q convert $opts --filemap "$fmap" --datesort git-repo2 "$repo"
+ > hg up -q -R "$repo"
+ > glog -R "$repo"
+ > hg -R "$repo" manifest --debug
+ > }
+
+full conversion
+
+ $ hg -q convert --datesort git-repo2 fullrepo
+ $ hg up -q -R fullrepo
+ $ glog -R fullrepo
+ @ 9 "Discard change to foo" files: foo
+ |\
+ | o 8 "change foo" files: foo
+ | |
+ o | 7 "change bar" files: bar
+ |/
+ o 6 "(octopus merge fixup)" files:
+ |\
+ | o 5 "Octopus merge" files: baz
+ | |\
+ o | | 4 "add baz" files: baz
+ | | |
+ +---o 3 "add bar" files: bar
+ | |
+ o | 2 "add quux" files: quux
+ | |
+ | o 1 "change foo" files: foo
+ |/
+ o 0 "add foo" files: foo
+
+ $ hg -R fullrepo manifest --debug
+ 245a3b8bc653999c2b22cdabd517ccb47aecafdf 644 bar
+ 354ae8da6e890359ef49ade27b68bbc361f3ca88 644 baz
+ 9277c9cc8dd4576fc01a17939b4351e5ada93466 644 foo
+ 88dfeab657e8cf2cef3dec67b914f49791ae76b1 644 quux
+ $ splitrepo 'octopus merge' 'foo bar baz'
+ % foo bar baz: octopus merge
+ @ 8 "Discard change to foo" files: foo
+ |\
+ | o 7 "change foo" files: foo
+ | |
+ o | 6 "change bar" files: bar
+ |/
+ o 5 "(octopus merge fixup)" files:
+ |\
+ | o 4 "Octopus merge" files: baz
+ | |\
+ o | | 3 "add baz" files: baz
+ | | |
+ +---o 2 "add bar" files: bar
+ | |
+ | o 1 "change foo" files: foo
+ |/
+ o 0 "add foo" files: foo
+
+ 245a3b8bc653999c2b22cdabd517ccb47aecafdf 644 bar
+ 354ae8da6e890359ef49ade27b68bbc361f3ca88 644 baz
+ 9277c9cc8dd4576fc01a17939b4351e5ada93466 644 foo
+ $ splitrepo 'only some parents of an octopus merge; "discard" a head' 'foo baz quux'
+ % foo baz quux: only some parents of an octopus merge; "discard" a head
+ @ 6 "Discard change to foo" files: foo
+ |
+ o 5 "change foo" files: foo
+ |
+ o 4 "Octopus merge" files:
+ |\
+ | o 3 "add baz" files: baz
+ | |
+ | o 2 "add quux" files: quux
+ | |
+ o | 1 "change foo" files: foo
+ |/
+ o 0 "add foo" files: foo
+
+ 354ae8da6e890359ef49ade27b68bbc361f3ca88 644 baz
+ 9277c9cc8dd4576fc01a17939b4351e5ada93466 644 foo
+ 88dfeab657e8cf2cef3dec67b914f49791ae76b1 644 quux
+
+test binary conversion (issue 1359)
+
+ $ mkdir git-repo3
+ $ cd git-repo3
+ $ git init-db >/dev/null 2>/dev/null
+ $ python -c 'file("b", "wb").write("".join([chr(i) for i in range(256)])*16)'
+ $ git add b
+ $ commit -a -m addbinary
+ $ cd ..
+
+convert binary file
+
+ $ hg convert git-repo3 git-repo3-hg
+ initializing destination git-repo3-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 0 addbinary
+ updating bookmarks
+ $ cd git-repo3-hg
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ python -c 'print len(file("b", "rb").read())'
+ 4096
+ $ cd ..
+
+test author vs committer
+
+ $ mkdir git-repo4
+ $ cd git-repo4
+ $ git init-db >/dev/null 2>/dev/null
+ $ echo >> foo
+ $ git add foo
+ $ commit -a -m addfoo
+ $ echo >> foo
+ $ GIT_AUTHOR_NAME="nottest"
+ $ commit -a -m addfoo2
+ $ cd ..
+
+convert author committer
+
+ $ hg convert git-repo4 git-repo4-hg
+ initializing destination git-repo4-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 addfoo
+ 0 addfoo2
+ updating bookmarks
+ $ hg -R git-repo4-hg log -v
+ changeset: 1:d63e967f93da
+ bookmark: master
+ tag: tip
+ user: nottest <test@example.org>
+ date: Mon Jan 01 00:00:21 2007 +0000
+ files: foo
+ description:
+ addfoo2
+
+ committer: test <test@example.org>
+
+
+ changeset: 0:0735477b0224
+ user: test <test@example.org>
+ date: Mon Jan 01 00:00:20 2007 +0000
+ files: foo
+ description:
+ addfoo
+
+
+
+--sourceorder should fail
+
+ $ hg convert --sourcesort git-repo4 git-repo4-sourcesort-hg
+ initializing destination git-repo4-sourcesort-hg repository
+ abort: --sourcesort is not supported by this data source
+ [255]
+
+damage git repository and convert again
+
+ $ cat > damage.py <<EOF
+ > import os
+ > import stat
+ > for root, dirs, files in os.walk('git-repo4/.git/objects'):
+ > if files:
+ > path = os.path.join(root, files[0])
+ > if os.name == 'nt':
+ > os.chmod(path, stat.S_IWUSR)
+ > os.remove(path)
+ > break
+ > EOF
+ $ python damage.py
+ $ hg convert git-repo4 git-repo4-broken-hg 2>&1 | \
+ > grep 'abort:' | sed 's/abort:.*/abort:/g'
+ abort:
diff --git a/tests/test-convert-hg-sink.t b/tests/test-convert-hg-sink.t
new file mode 100644
index 0000000..999faf8
--- /dev/null
+++ b/tests/test-convert-hg-sink.t
@@ -0,0 +1,124 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > [convert]
+ > hg.saverev=False
+ > EOF
+ $ hg init orig
+ $ cd orig
+ $ echo foo > foo
+ $ echo bar > bar
+ $ hg ci -qAm 'add foo and bar'
+ $ hg rm foo
+ $ hg ci -m 'remove foo'
+ $ mkdir foo
+ $ echo file > foo/file
+ $ hg ci -qAm 'add foo/file'
+ $ hg tag some-tag
+ $ hg log
+ changeset: 3:593cbf6fb2b4
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag some-tag for changeset ad681a868e44
+
+ changeset: 2:ad681a868e44
+ tag: some-tag
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo/file
+
+ changeset: 1:cbba8ecc03b7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: remove foo
+
+ changeset: 0:327daa9251fa
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo and bar
+
+ $ cd ..
+ $ hg convert orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ initializing destination new repository
+ scanning source...
+ sorting...
+ converting...
+ 3 add foo and bar
+ 2 remove foo
+ 1 add foo/file
+ 0 Added tag some-tag for changeset ad681a868e44
+ $ cd new
+ $ hg out ../orig
+ comparing with ../orig
+ searching for changes
+ no changes found
+ [1]
+
+dirstate should be empty:
+
+ $ hg debugstate
+ $ hg parents -q
+ $ hg up -C
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg copy bar baz
+
+put something in the dirstate:
+
+ $ hg debugstate > debugstate
+ $ grep baz debugstate
+ a 0 -1 unset baz
+ copy: bar -> baz
+
+add a new revision in the original repo
+
+ $ cd ../orig
+ $ echo baz > baz
+ $ hg ci -qAm 'add baz'
+ $ cd ..
+ $ hg convert orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ scanning source...
+ sorting...
+ converting...
+ 0 add baz
+ $ cd new
+ $ hg out ../orig
+ comparing with ../orig
+ searching for changes
+ no changes found
+ [1]
+
+dirstate should be the same (no output below):
+
+ $ hg debugstate > new-debugstate
+ $ diff debugstate new-debugstate
+
+no copies
+
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg debugrename baz
+ baz not renamed
+ $ cd ..
+
+test tag rewriting
+
+ $ cat > filemap <<EOF
+ > exclude foo
+ > EOF
+ $ hg convert --filemap filemap orig new-filemap 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ initializing destination new-filemap repository
+ scanning source...
+ sorting...
+ converting...
+ 4 add foo and bar
+ 3 remove foo
+ 2 add foo/file
+ 1 Added tag some-tag for changeset ad681a868e44
+ 0 add baz
+ $ cd new-filemap
+ $ hg tags
+ tip 2:6f4fd1df87fb
+ some-tag 0:ba8636729451
+ $ cd ..
diff --git a/tests/test-convert-hg-source.t b/tests/test-convert-hg-source.t
new file mode 100644
index 0000000..a39b2b7
--- /dev/null
+++ b/tests/test-convert-hg-source.t
@@ -0,0 +1,149 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > [convert]
+ > hg.saverev=False
+ > EOF
+ $ hg init orig
+ $ cd orig
+ $ echo foo > foo
+ $ echo bar > bar
+ $ hg ci -qAm 'add foo bar' -d '0 0'
+ $ echo >> foo
+ $ hg ci -m 'change foo' -d '1 0'
+ $ hg up -qC 0
+ $ hg copy --after --force foo bar
+ $ hg copy foo baz
+ $ hg ci -m 'make bar and baz copies of foo' -d '2 0'
+ created new head
+ $ hg bookmark premerge1
+ $ hg merge -r 1
+ merging baz and foo to baz
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'merge local copy' -d '3 0'
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bookmark premerge2
+ $ hg merge 2
+ merging foo and baz to baz
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'merge remote copy' -d '4 0'
+ created new head
+#if execbit
+ $ chmod +x baz
+#else
+ $ echo some other change to make sure we get a rev 5 > baz
+#endif
+ $ hg ci -m 'mark baz executable' -d '5 0'
+ $ cd ..
+ $ hg convert --datesort orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ initializing destination new repository
+ scanning source...
+ sorting...
+ converting...
+ 5 add foo bar
+ 4 change foo
+ 3 make bar and baz copies of foo
+ 2 merge local copy
+ 1 merge remote copy
+ 0 mark baz executable
+ updating bookmarks
+ $ cd new
+ $ hg out ../orig
+ comparing with ../orig
+ searching for changes
+ no changes found
+ [1]
+#if execbit
+ $ hg bookmarks
+ premerge1 3:973ef48a98a4
+ premerge2 5:13d9b87cf8f8
+#else
+Different hash because no x bit
+ $ hg bookmarks
+ premerge1 3:973ef48a98a4
+ premerge2 5:df0779bcf33c
+#endif
+ $ cd ..
+
+check shamap LF and CRLF handling
+
+ $ cat > rewrite.py <<EOF
+ > import sys
+ > # Interlace LF and CRLF
+ > lines = [(l.rstrip() + ((i % 2) and '\n' or '\r\n'))
+ > for i, l in enumerate(file(sys.argv[1]))]
+ > file(sys.argv[1], 'wb').write(''.join(lines))
+ > EOF
+ $ python rewrite.py new/.hg/shamap
+ $ cd orig
+ $ hg up -qC 1
+ $ echo foo >> foo
+ $ hg ci -qm 'change foo again'
+ $ hg up -qC 2
+ $ echo foo >> foo
+ $ hg ci -qm 'change foo again again'
+ $ cd ..
+ $ hg convert --datesort orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ scanning source...
+ sorting...
+ converting...
+ 1 change foo again again
+ 0 change foo again
+ updating bookmarks
+
+init broken repository
+
+ $ hg init broken
+ $ cd broken
+ $ echo a >> a
+ $ echo b >> b
+ $ hg ci -qAm init
+ $ echo a >> a
+ $ echo b >> b
+ $ hg copy b c
+ $ hg ci -qAm changeall
+ $ hg up -qC 0
+ $ echo bc >> b
+ $ hg ci -m changebagain
+ created new head
+ $ HGMERGE=internal:local hg -q merge
+ $ hg ci -m merge
+ $ hg mv b d
+ $ hg ci -m moveb
+
+break it
+
+ $ rm .hg/store/data/b.*
+ $ cd ..
+ $ hg --config convert.hg.ignoreerrors=True convert broken fixed
+ initializing destination fixed repository
+ scanning source...
+ sorting...
+ converting...
+ 4 init
+ ignoring: data/b.i@1e88685f5dde: no match found
+ 3 changeall
+ 2 changebagain
+ 1 merge
+ 0 moveb
+ $ hg -R fixed verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 5 total revisions
+
+manifest -r 0
+
+ $ hg -R fixed manifest -r 0
+ a
+
+manifest -r tip
+
+ $ hg -R fixed manifest -r tip
+ a
+ c
+ d
diff --git a/tests/test-convert-hg-startrev.t b/tests/test-convert-hg-startrev.t
new file mode 100644
index 0000000..4d62cf2
--- /dev/null
+++ b/tests/test-convert-hg-startrev.t
@@ -0,0 +1,174 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog =
+ > convert =
+ > [convert]
+ > hg.saverev = yes
+ > EOF
+
+ $ glog()
+ > {
+ > hg -R "$1" glog --template '{rev} "{desc}" files: {files}\n'
+ > }
+
+ $ hg init source
+ $ cd source
+
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -d '0 0' -qAm '0: add a b'
+ $ echo c > c
+ $ hg ci -d '1 0' -qAm '1: add c'
+ $ hg copy a e
+ $ echo b >> b
+ $ hg ci -d '2 0' -qAm '2: copy e from a, change b'
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg ci -d '3 0' -qAm '3: change a'
+ $ hg merge
+ merging a and e to e
+ 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg copy b d
+ $ hg ci -d '4 0' -qAm '4: merge 2 and 3, copy d from b'
+ $ echo a >> a
+ $ hg ci -d '5 0' -qAm '5: change a'
+ $ cd ..
+
+Convert from null revision
+
+ $ hg convert --config convert.hg.startrev=null source full
+ initializing destination full repository
+ scanning source...
+ sorting...
+ converting...
+ 5 0: add a b
+ 4 1: add c
+ 3 2: copy e from a, change b
+ 2 3: change a
+ 1 4: merge 2 and 3, copy d from b
+ 0 5: change a
+
+ $ glog full
+ o 5 "5: change a" files: a
+ |
+ o 4 "4: merge 2 and 3, copy d from b" files: d e
+ |\
+ | o 3 "3: change a" files: a
+ | |
+ o | 2 "2: copy e from a, change b" files: b e
+ | |
+ o | 1 "1: add c" files: c
+ |/
+ o 0 "0: add a b" files: a b
+
+ $ rm -Rf full
+
+Convert from zero revision
+
+ $ hg convert --config convert.hg.startrev=0 source full
+ initializing destination full repository
+ scanning source...
+ sorting...
+ converting...
+ 5 0: add a b
+ 4 1: add c
+ 3 2: copy e from a, change b
+ 2 3: change a
+ 1 4: merge 2 and 3, copy d from b
+ 0 5: change a
+
+ $ glog full
+ o 5 "5: change a" files: a
+ |
+ o 4 "4: merge 2 and 3, copy d from b" files: d e
+ |\
+ | o 3 "3: change a" files: a
+ | |
+ o | 2 "2: copy e from a, change b" files: b e
+ | |
+ o | 1 "1: add c" files: c
+ |/
+ o 0 "0: add a b" files: a b
+
+Convert from merge parent
+
+ $ hg convert --config convert.hg.startrev=1 source conv1
+ initializing destination conv1 repository
+ scanning source...
+ sorting...
+ converting...
+ 3 1: add c
+ 2 2: copy e from a, change b
+ 1 4: merge 2 and 3, copy d from b
+ 0 5: change a
+
+ $ glog conv1
+ o 3 "5: change a" files: a
+ |
+ o 2 "4: merge 2 and 3, copy d from b" files: a d e
+ |
+ o 1 "2: copy e from a, change b" files: b e
+ |
+ o 0 "1: add c" files: a b c
+
+ $ cd conv1
+ $ hg up -q
+
+Check copy preservation
+
+ $ hg log --follow --copies e
+ changeset: 2:79818a521a40
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: 4: merge 2 and 3, copy d from b
+
+ changeset: 1:3e6201832cce
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: 2: copy e from a, change b
+
+Check copy removal on missing parent
+
+ $ hg log --follow --copies d
+ changeset: 2:79818a521a40
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: 4: merge 2 and 3, copy d from b
+
+ $ hg cat -r tip a b
+ a
+ a
+ a
+ b
+ b
+ $ hg -q verify
+ $ cd ..
+
+Convert from merge
+
+ $ hg convert --config convert.hg.startrev=4 source conv4
+ initializing destination conv4 repository
+ scanning source...
+ sorting...
+ converting...
+ 1 4: merge 2 and 3, copy d from b
+ 0 5: change a
+ $ glog conv4
+ o 1 "5: change a" files: a
+ |
+ o 0 "4: merge 2 and 3, copy d from b" files: a b c d e
+
+ $ cd conv4
+ $ hg up -C
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg cat -r tip a b
+ a
+ a
+ a
+ b
+ b
+ $ hg -q verify
+ $ cd ..
diff --git a/tests/test-convert-hg-svn.t b/tests/test-convert-hg-svn.t
new file mode 100644
index 0000000..d7ebedd
--- /dev/null
+++ b/tests/test-convert-hg-svn.t
@@ -0,0 +1,105 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+ $ echo "mq = " >> $HGRCPATH
+
+ $ SVNREPOPATH=`pwd`/svn-repo
+#if windows
+ $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#else
+ $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#endif
+
+ $ svnadmin create "$SVNREPOPATH"
+ $ cat > "$SVNREPOPATH"/hooks/pre-revprop-change <<EOF
+ > #!/bin/sh
+ >
+ > REPOS="$1"
+ > REV="$2"
+ > USER="$3"
+ > PROPNAME="$4"
+ > ACTION="$5"
+ >
+ > if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi
+ > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-branch" ]; then exit 0; fi
+ > if [ "$ACTION" = "A" -a "$PROPNAME" = "hg:convert-rev" ]; then exit 0; fi
+ >
+ > echo "Changing prohibited revision property" >&2
+ > exit 1
+ > EOF
+ $ chmod +x "$SVNREPOPATH"/hooks/pre-revprop-change
+ $ svn co "$SVNREPOURL" "$SVNREPOPATH"-wc
+ Checked out revision 0.
+ $ cd "$SVNREPOPATH"-wc
+ $ echo a > a
+ $ svn add a
+ A a
+ $ svn ci -m'added a' a
+ Adding a
+ Transmitting file data .
+ Committed revision 1.
+ $ cd ..
+
+initial roundtrip
+
+ $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg | grep -v initializing
+ scanning source...
+ sorting...
+ converting...
+ 0 added a
+ $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
+ scanning source...
+ sorting...
+ converting...
+
+second roundtrip should do nothing
+
+ $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg
+ scanning source...
+ sorting...
+ converting...
+ $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
+ scanning source...
+ sorting...
+ converting...
+
+new hg rev
+
+ $ hg clone "$SVNREPOPATH"-hg "$SVNREPOPATH"-work
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd "$SVNREPOPATH"-work
+ $ echo b > b
+ $ hg add b
+ $ hg ci -mb
+
+adding an empty revision
+
+ $ hg qnew -m emtpy empty
+ $ hg qfinish -a
+ $ cd ..
+
+echo hg to svn
+
+ $ hg --cwd "$SVNREPOPATH"-hg pull -q "$SVNREPOPATH"-work
+ $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
+ scanning source...
+ sorting...
+ converting...
+ 1 b
+ 0 emtpy
+
+svn back to hg should do nothing
+
+ $ hg convert -s svn -d hg "$SVNREPOPATH"-wc "$SVNREPOPATH"-hg
+ scanning source...
+ sorting...
+ converting...
+
+hg back to svn should do nothing
+
+ $ hg convert -s hg -d svn "$SVNREPOPATH"-hg "$SVNREPOPATH"-wc
+ scanning source...
+ sorting...
+ converting...
diff --git a/tests/test-convert-mtn-rename-directory.out b/tests/test-convert-mtn-rename-directory.out
new file mode 100644
index 0000000..4ec1d87
--- /dev/null
+++ b/tests/test-convert-mtn-rename-directory.out
@@ -0,0 +1,23 @@
+% tedious monotone keys configuration
+% create monotone repository
+mtn: adding dir1 to workspace manifest
+mtn: adding dir1/subdir1 to workspace manifest
+mtn: adding dir1/subdir1/file1 to workspace manifest
+mtn: beginning commit on branch 'com.selenic.test'
+mtn: committed revision 5ed13ff5582d8d1e319f079b694a37d2b45edfc8
+% rename directory
+mtn: skipping dir1, already accounted for in workspace
+mtn: renaming dir1/subdir1 to dir1/subdir2 in workspace manifest
+mtn: beginning commit on branch 'com.selenic.test'
+mtn: committed revision 985204142a822b22ee86b509d61f3c5ab6857d2b
+% convert
+assuming destination repo.mtn-hg
+initializing destination repo.mtn-hg repository
+scanning source...
+sorting...
+converting...
+1 initialize
+0 rename
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% manifest
+dir1/subdir2/file1
diff --git a/tests/test-convert-mtn.t b/tests/test-convert-mtn.t
new file mode 100644
index 0000000..17083ee
--- /dev/null
+++ b/tests/test-convert-mtn.t
@@ -0,0 +1,388 @@
+
+ $ "$TESTDIR/hghave" mtn || exit 80
+
+Monotone directory is called .monotone on *nix and monotone
+on Windows. Having a variable here ease test patching.
+
+ $ mtndir=.monotone
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+
+Windows version of monotone home
+
+ $ APPDATA=$HOME; export APPDATA
+
+tedious monotone keys configuration
+The /dev/null redirection is necessary under Windows, or
+it complains about home directory permissions
+
+ $ mtn --quiet genkey test@selenic.com 1>/dev/null 2>&1 <<EOF
+ > passphrase
+ > passphrase
+ > EOF
+ $ cat >> $HOME/$mtndir/monotonerc <<EOF
+ > function get_passphrase(keypair_id)
+ > return "passphrase"
+ > end
+ > EOF
+
+create monotone repository
+
+ $ mtn db init --db=repo.mtn
+ $ mtn --db=repo.mtn --branch=com.selenic.test setup workingdir
+ $ cd workingdir
+ $ echo a > a
+ $ mkdir dir
+ $ echo b > dir/b
+ $ echo d > dir/d
+ $ python -c 'file("bin", "wb").write("a\\x00b")'
+ $ echo c > c
+ $ mtn add a dir/b dir/d c bin
+ mtn: adding 'a' to workspace manifest
+ mtn: adding 'bin' to workspace manifest
+ mtn: adding 'c' to workspace manifest
+ mtn: adding 'dir' to workspace manifest
+ mtn: adding 'dir/b' to workspace manifest
+ mtn: adding 'dir/d' to workspace manifest
+ $ mtn ci -m initialize
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 0f6e5e4f2e7d2a8ef312408f57618abf026afd90
+
+update monotone working directory
+
+ $ mtn mv a dir/a
+ mtn: skipping 'dir', already accounted for in workspace
+ mtn: renaming 'a' to 'dir/a' in workspace manifest
+ $ echo a >> dir/a
+ $ echo b >> dir/b
+ $ mtn drop c
+ mtn: dropping 'c' from workspace manifest
+ $ python -c 'file("bin", "wb").write("b\\x00c")'
+ $ mtn ci -m update1
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 51d0a982464573a2a2cf5ee2c9219c652aaebeff
+ $ cd ..
+
+convert once
+
+ $ hg convert -s mtn repo.mtn
+ assuming destination repo.mtn-hg
+ initializing destination repo.mtn-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 initialize
+ 0 update1
+ $ cd workingdir
+ $ echo e > e
+ $ mtn add e
+ mtn: adding 'e' to workspace manifest
+ $ mtn drop dir/b
+ mtn: dropping 'dir/b' from workspace manifest
+ $ mtn mv bin bin2
+ mtn: renaming 'bin' to 'bin2' in workspace manifest
+ $ mtn ci -m 'update2 "with" quotes'
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision ebe58335d85d8cb176b6d0a12be04f5314b998da
+
+test directory move
+
+ $ mkdir -p dir1/subdir1
+ $ mkdir -p dir1/subdir2_other
+ $ echo file1 > dir1/subdir1/file1
+ $ echo file2 > dir1/subdir2_other/file1
+ $ mtn add dir1/subdir1/file1 dir1/subdir2_other/file1
+ mtn: adding 'dir1' to workspace manifest
+ mtn: adding 'dir1/subdir1' to workspace manifest
+ mtn: adding 'dir1/subdir1/file1' to workspace manifest
+ mtn: adding 'dir1/subdir2_other' to workspace manifest
+ mtn: adding 'dir1/subdir2_other/file1' to workspace manifest
+ $ mtn ci -m createdir1
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision a8d62bc04fee4d2936d28e98bbcc81686dd74306
+ $ mtn rename dir1/subdir1 dir1/subdir2
+ mtn: skipping 'dir1', already accounted for in workspace
+ mtn: renaming 'dir1/subdir1' to 'dir1/subdir2' in workspace manifest
+ $ mtn ci -m movedir1
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 2c3d241bbbfe538b1b51d910f5676407e3f4d3a6
+
+test subdirectory move
+
+ $ mtn mv dir dir2
+ mtn: renaming 'dir' to 'dir2' in workspace manifest
+ $ echo newfile > dir2/newfile
+ $ mtn drop dir2/d
+ mtn: dropping 'dir2/d' from workspace manifest
+ $ mtn add dir2/newfile
+ mtn: adding 'dir2/newfile' to workspace manifest
+ $ mtn ci -m movedir
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision fdb5a02dae8bfce3a79b3393680af471016e1b4c
+
+Test directory removal with empty directory
+
+ $ mkdir dir2/dir
+ $ mkdir dir2/dir/subdir
+ $ echo f > dir2/dir/subdir/f
+ $ mkdir dir2/dir/emptydir
+ $ mtn add --quiet -R dir2/dir
+ $ mtn ci -m emptydir
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 8bbf76d717001d24964e4604739fdcd0f539fc88
+ $ mtn drop -R dir2/dir
+ mtn: dropping 'dir2/dir/subdir/f' from workspace manifest
+ mtn: dropping 'dir2/dir/subdir' from workspace manifest
+ mtn: dropping 'dir2/dir/emptydir' from workspace manifest
+ mtn: dropping 'dir2/dir' from workspace manifest
+ $ mtn ci -m dropdirectory
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 2323d4bc324e6c82628dc04d47a9fd32ad24e322
+
+test directory and file move
+
+ $ mkdir -p dir3/d1
+ $ echo a > dir3/a
+ $ mtn add dir3/a dir3/d1
+ mtn: adding 'dir3' to workspace manifest
+ mtn: adding 'dir3/a' to workspace manifest
+ mtn: adding 'dir3/d1' to workspace manifest
+ $ mtn ci -m dirfilemove
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 47b192f720faa622f48c68d1eb075b26d405aa8b
+ $ mtn mv dir3/a dir3/d1/a
+ mtn: skipping 'dir3/d1', already accounted for in workspace
+ mtn: renaming 'dir3/a' to 'dir3/d1/a' in workspace manifest
+ $ mtn mv dir3/d1 dir3/d2
+ mtn: skipping 'dir3', already accounted for in workspace
+ mtn: renaming 'dir3/d1' to 'dir3/d2' in workspace manifest
+ $ mtn ci -m dirfilemove2
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 8b543a400d3ee7f6d4bb1835b9b9e3747c8cb632
+
+test directory move into another directory move
+
+ $ mkdir dir4
+ $ mkdir dir5
+ $ echo a > dir4/a
+ $ mtn add dir4/a dir5
+ mtn: adding 'dir4' to workspace manifest
+ mtn: adding 'dir4/a' to workspace manifest
+ mtn: adding 'dir5' to workspace manifest
+ $ mtn ci -m dirdirmove
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 466e0b2afc7a55aa2b4ab2f57cb240bb6cd66fc7
+ $ mtn mv dir5 dir6
+ mtn: renaming 'dir5' to 'dir6' in workspace manifest
+ $ mtn mv dir4 dir6/dir4
+ mtn: skipping 'dir6', already accounted for in workspace
+ mtn: renaming 'dir4' to 'dir6/dir4' in workspace manifest
+ $ mtn ci -m dirdirmove2
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 3d1f77ebad0c23a5d14911be3b670f990991b749
+
+test diverging directory moves
+
+ $ mkdir -p dir7/dir9/dir8
+ $ echo a > dir7/dir9/dir8/a
+ $ echo b > dir7/dir9/b
+ $ echo c > dir7/c
+ $ mtn add -R dir7
+ mtn: adding 'dir7' to workspace manifest
+ mtn: adding 'dir7/c' to workspace manifest
+ mtn: adding 'dir7/dir9' to workspace manifest
+ mtn: adding 'dir7/dir9/b' to workspace manifest
+ mtn: adding 'dir7/dir9/dir8' to workspace manifest
+ mtn: adding 'dir7/dir9/dir8/a' to workspace manifest
+ $ mtn ci -m divergentdirmove
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 08a08511f18b428d840199b062de90d0396bc2ed
+ $ mtn mv dir7 dir7-2
+ mtn: renaming 'dir7' to 'dir7-2' in workspace manifest
+ $ mtn mv dir7-2/dir9 dir9-2
+ mtn: renaming 'dir7-2/dir9' to 'dir9-2' in workspace manifest
+ $ mtn mv dir9-2/dir8 dir8-2
+ mtn: renaming 'dir9-2/dir8' to 'dir8-2' in workspace manifest
+ $ mtn ci -m divergentdirmove2
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision 4a736634505795f17786fffdf2c9cbf5b11df6f6
+
+test large file support (> 32kB)
+
+ $ python -c 'for x in range(10000): print x' > large-file
+ $ $TESTDIR/md5sum.py large-file
+ 5d6de8a95c3b6bf9e0ffb808ba5299c1 large-file
+ $ mtn add large-file
+ mtn: adding 'large-file' to workspace manifest
+ $ mtn ci -m largefile
+ mtn: beginning commit on branch 'com.selenic.test'
+ mtn: committed revision f0a20fecd10dc4392d18fe69a03f1f4919d3387b
+
+test suspending (closing a branch)
+
+ $ mtn suspend f0a20fecd10dc4392d18fe69a03f1f4919d3387b 2> /dev/null
+ $ cd ..
+
+convert incrementally
+
+ $ hg convert -s mtn repo.mtn
+ assuming destination repo.mtn-hg
+ scanning source...
+ sorting...
+ converting...
+ 12 update2 "with" quotes
+ 11 createdir1
+ 10 movedir1
+ 9 movedir
+ 8 emptydir
+ 7 dropdirectory
+ 6 dirfilemove
+ 5 dirfilemove2
+ 4 dirdirmove
+ 3 dirdirmove2
+ 2 divergentdirmove
+ 1 divergentdirmove2
+ 0 largefile
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc|firstline}" files: {files}\n' "$@"
+ > }
+ $ cd repo.mtn-hg
+ $ hg up -C
+ 12 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ glog
+ @ 14 "largefile" files: large-file
+ |
+ o 13 "divergentdirmove2" files: dir7-2/c dir7/c dir7/dir9/b dir7/dir9/dir8/a dir8-2/a dir9-2/b
+ |
+ o 12 "divergentdirmove" files: dir7/c dir7/dir9/b dir7/dir9/dir8/a
+ |
+ o 11 "dirdirmove2" files: dir4/a dir6/dir4/a
+ |
+ o 10 "dirdirmove" files: dir4/a
+ |
+ o 9 "dirfilemove2" files: dir3/a dir3/d2/a
+ |
+ o 8 "dirfilemove" files: dir3/a
+ |
+ o 7 "dropdirectory" files: dir2/dir/subdir/f
+ |
+ o 6 "emptydir" files: dir2/dir/subdir/f
+ |
+ o 5 "movedir" files: dir/a dir/d dir2/a dir2/newfile
+ |
+ o 4 "movedir1" files: dir1/subdir1/file1 dir1/subdir2/file1
+ |
+ o 3 "createdir1" files: dir1/subdir1/file1 dir1/subdir2_other/file1
+ |
+ o 2 "update2 "with" quotes" files: bin bin2 dir/b e
+ |
+ o 1 "update1" files: a bin c dir/a dir/b
+ |
+ o 0 "initialize" files: a bin c dir/b dir/d
+
+
+manifest
+
+ $ hg manifest
+ bin2
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ dir2/a
+ dir2/newfile
+ dir3/d2/a
+ dir6/dir4/a
+ dir7-2/c
+ dir8-2/a
+ dir9-2/b
+ e
+ large-file
+
+contents
+
+ $ cat dir2/a
+ a
+ a
+ $ test -d dir2/dir && echo 'removed dir2/dir is still there!'
+ [1]
+
+file move
+
+ $ hg log -v -C -r 1 | grep copies
+ copies: dir/a (a)
+
+check directory move
+
+ $ hg manifest -r 4
+ bin2
+ dir/a
+ dir/d
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ e
+ $ test -d dir1/subdir2 || echo 'new dir1/subdir2 does not exist!'
+ $ test -d dir1/subdir1 && echo 'renamed dir1/subdir1 is still there!'
+ [1]
+ $ hg log -v -C -r 4 | grep copies
+ copies: dir1/subdir2/file1 (dir1/subdir1/file1)
+
+check file remove with directory move
+
+ $ hg manifest -r 5
+ bin2
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ dir2/a
+ dir2/newfile
+ e
+
+check file move with directory move
+
+ $ hg manifest -r 9
+ bin2
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ dir2/a
+ dir2/newfile
+ dir3/d2/a
+ e
+
+check file directory directory move
+
+ $ hg manifest -r 11
+ bin2
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ dir2/a
+ dir2/newfile
+ dir3/d2/a
+ dir6/dir4/a
+ e
+
+check divergent directory moves
+
+ $ hg manifest -r 13
+ bin2
+ dir1/subdir2/file1
+ dir1/subdir2_other/file1
+ dir2/a
+ dir2/newfile
+ dir3/d2/a
+ dir6/dir4/a
+ dir7-2/c
+ dir8-2/a
+ dir9-2/b
+ e
+
+test large file support (> 32kB)
+
+ $ $TESTDIR/md5sum.py large-file
+ 5d6de8a95c3b6bf9e0ffb808ba5299c1 large-file
+
+check branch closing
+
+ $ hg branches -a
+ $ hg branches -c
+ com.selenic.test 14:* (closed) (glob)
+
diff --git a/tests/test-convert-p4-filetypes.t b/tests/test-convert-p4-filetypes.t
new file mode 100644
index 0000000..3405486
--- /dev/null
+++ b/tests/test-convert-p4-filetypes.t
@@ -0,0 +1,733 @@
+ $ "$TESTDIR/hghave" p4 execbit symlink || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+
+create p4 depot
+ $ P4ROOT=`pwd`/depot; export P4ROOT
+ $ P4AUDIT=$P4ROOT/audit; export P4AUDIT
+ $ P4JOURNAL=$P4ROOT/journal; export P4JOURNAL
+ $ P4LOG=$P4ROOT/log; export P4LOG
+ $ P4PORT=localhost:16661; export P4PORT
+ $ P4DEBUG=1; export P4DEBUG
+ $ P4CHARSET=utf8; export P4CHARSET
+
+start the p4 server
+ $ [ ! -d $P4ROOT ] && mkdir $P4ROOT
+ $ p4d -f -J off -xi >$P4ROOT/stdout 2>$P4ROOT/stderr
+ $ p4d -f -J off >$P4ROOT/stdout 2>$P4ROOT/stderr &
+ $ echo $! >> $DAEMON_PIDS
+ $ trap "echo stopping the p4 server ; p4 admin stop" EXIT
+
+wait for the server to initialize
+ $ while ! p4 ; do
+ > sleep 1
+ > done >/dev/null 2>/dev/null
+
+create a client spec
+ $ P4CLIENT=hg-p4-import; export P4CLIENT
+ $ DEPOTPATH=//depot/test-mercurial-import/...
+ $ p4 client -o | sed '/^View:/,$ d' >p4client
+ $ echo View: >>p4client
+ $ echo " $DEPOTPATH //$P4CLIENT/..." >>p4client
+ $ p4 client -i <p4client
+ Client hg-p4-import saved.
+
+populate the depot
+ $ TYPES="text binary symlink"
+ $ TYPES="$TYPES text+m text+w text+x text+k text+kx text+ko text+l text+C text+D text+F text+S text+S2"
+ $ TYPES="$TYPES binary+k binary+x binary+kx symlink+k"
+ $ TYPES="$TYPES ctext cxtext ktext kxtext ltext tempobj ubinary uxbinary xbinary xltext xtempobj xtext"
+not testing these
+ $ #TYPES="$TYPES apple resource unicode utf16 uresource xunicode xutf16"
+ $ for T in $TYPES ; do
+ > T2=`echo $T | tr [:upper:] [:lower:]`
+ > case $T in
+ > apple)
+ > ;;
+ > symlink*)
+ > echo "this is target $T" >target_$T2
+ > ln -s target_$T file_$T2
+ > p4 add target_$T2
+ > p4 add -t $T file_$T2
+ > ;;
+ > binary*)
+ > python -c "file('file_$T2', 'wb').write('this is $T')"
+ > p4 add -t $T file_$T2
+ > ;;
+ > *)
+ > echo "this is $T" >file_$T2
+ > p4 add -t $T file_$T2
+ > ;;
+ > esac
+ > done
+ //depot/test-mercurial-import/file_text#1 - opened for add
+ //depot/test-mercurial-import/file_binary#1 - opened for add
+ //depot/test-mercurial-import/target_symlink#1 - opened for add
+ //depot/test-mercurial-import/file_symlink#1 - opened for add
+ //depot/test-mercurial-import/file_text+m#1 - opened for add
+ //depot/test-mercurial-import/file_text+w#1 - opened for add
+ //depot/test-mercurial-import/file_text+x#1 - opened for add
+ //depot/test-mercurial-import/file_text+k#1 - opened for add
+ //depot/test-mercurial-import/file_text+kx#1 - opened for add
+ //depot/test-mercurial-import/file_text+ko#1 - opened for add
+ //depot/test-mercurial-import/file_text+l#1 - opened for add
+ //depot/test-mercurial-import/file_text+c#1 - opened for add
+ //depot/test-mercurial-import/file_text+d#1 - opened for add
+ //depot/test-mercurial-import/file_text+f#1 - opened for add
+ //depot/test-mercurial-import/file_text+s#1 - opened for add
+ //depot/test-mercurial-import/file_text+s2#1 - opened for add
+ //depot/test-mercurial-import/file_binary+k#1 - opened for add
+ //depot/test-mercurial-import/file_binary+x#1 - opened for add
+ //depot/test-mercurial-import/file_binary+kx#1 - opened for add
+ //depot/test-mercurial-import/target_symlink+k#1 - opened for add
+ //depot/test-mercurial-import/file_symlink+k#1 - opened for add
+ //depot/test-mercurial-import/file_ctext#1 - opened for add
+ //depot/test-mercurial-import/file_cxtext#1 - opened for add
+ //depot/test-mercurial-import/file_ktext#1 - opened for add
+ //depot/test-mercurial-import/file_kxtext#1 - opened for add
+ //depot/test-mercurial-import/file_ltext#1 - opened for add
+ //depot/test-mercurial-import/file_tempobj#1 - opened for add
+ //depot/test-mercurial-import/file_ubinary#1 - opened for add
+ //depot/test-mercurial-import/file_uxbinary#1 - opened for add
+ //depot/test-mercurial-import/file_xbinary#1 - opened for add
+ //depot/test-mercurial-import/file_xltext#1 - opened for add
+ //depot/test-mercurial-import/file_xtempobj#1 - opened for add
+ //depot/test-mercurial-import/file_xtext#1 - opened for add
+ $ p4 submit -d initial
+ Submitting change 1.
+ Locking 33 files ...
+ add //depot/test-mercurial-import/file_binary#1
+ add //depot/test-mercurial-import/file_binary+k#1
+ add //depot/test-mercurial-import/file_binary+kx#1
+ add //depot/test-mercurial-import/file_binary+x#1
+ add //depot/test-mercurial-import/file_ctext#1
+ add //depot/test-mercurial-import/file_cxtext#1
+ add //depot/test-mercurial-import/file_ktext#1
+ add //depot/test-mercurial-import/file_kxtext#1
+ add //depot/test-mercurial-import/file_ltext#1
+ add //depot/test-mercurial-import/file_symlink#1
+ add //depot/test-mercurial-import/file_symlink+k#1
+ add //depot/test-mercurial-import/file_tempobj#1
+ add //depot/test-mercurial-import/file_text#1
+ add //depot/test-mercurial-import/file_text+c#1
+ add //depot/test-mercurial-import/file_text+d#1
+ add //depot/test-mercurial-import/file_text+f#1
+ add //depot/test-mercurial-import/file_text+k#1
+ add //depot/test-mercurial-import/file_text+ko#1
+ add //depot/test-mercurial-import/file_text+kx#1
+ add //depot/test-mercurial-import/file_text+l#1
+ add //depot/test-mercurial-import/file_text+m#1
+ add //depot/test-mercurial-import/file_text+s#1
+ add //depot/test-mercurial-import/file_text+s2#1
+ add //depot/test-mercurial-import/file_text+w#1
+ add //depot/test-mercurial-import/file_text+x#1
+ add //depot/test-mercurial-import/file_ubinary#1
+ add //depot/test-mercurial-import/file_uxbinary#1
+ add //depot/test-mercurial-import/file_xbinary#1
+ add //depot/test-mercurial-import/file_xltext#1
+ add //depot/test-mercurial-import/file_xtempobj#1
+ add //depot/test-mercurial-import/file_xtext#1
+ add //depot/test-mercurial-import/target_symlink#1
+ add //depot/test-mercurial-import/target_symlink+k#1
+ Change 1 submitted.
+ //depot/test-mercurial-import/file_binary+k#1 - refreshing
+ //depot/test-mercurial-import/file_binary+kx#1 - refreshing
+ //depot/test-mercurial-import/file_ktext#1 - refreshing
+ //depot/test-mercurial-import/file_kxtext#1 - refreshing
+ //depot/test-mercurial-import/file_symlink+k#1 - refreshing
+ //depot/test-mercurial-import/file_text+k#1 - refreshing
+ //depot/test-mercurial-import/file_text+ko#1 - refreshing
+ //depot/test-mercurial-import/file_text+kx#1 - refreshing
+
+test keyword expansion
+ $ p4 edit file_* target_*
+ //depot/test-mercurial-import/file_binary#1 - opened for edit
+ //depot/test-mercurial-import/file_binary+k#1 - opened for edit
+ //depot/test-mercurial-import/file_binary+kx#1 - opened for edit
+ //depot/test-mercurial-import/file_binary+x#1 - opened for edit
+ //depot/test-mercurial-import/file_ctext#1 - opened for edit
+ //depot/test-mercurial-import/file_cxtext#1 - opened for edit
+ //depot/test-mercurial-import/file_ktext#1 - opened for edit
+ //depot/test-mercurial-import/file_kxtext#1 - opened for edit
+ //depot/test-mercurial-import/file_ltext#1 - opened for edit
+ //depot/test-mercurial-import/file_symlink#1 - opened for edit
+ //depot/test-mercurial-import/file_symlink+k#1 - opened for edit
+ //depot/test-mercurial-import/file_tempobj#1 - opened for edit
+ //depot/test-mercurial-import/file_text#1 - opened for edit
+ //depot/test-mercurial-import/file_text+c#1 - opened for edit
+ //depot/test-mercurial-import/file_text+d#1 - opened for edit
+ //depot/test-mercurial-import/file_text+f#1 - opened for edit
+ //depot/test-mercurial-import/file_text+k#1 - opened for edit
+ //depot/test-mercurial-import/file_text+ko#1 - opened for edit
+ //depot/test-mercurial-import/file_text+kx#1 - opened for edit
+ //depot/test-mercurial-import/file_text+l#1 - opened for edit
+ //depot/test-mercurial-import/file_text+m#1 - opened for edit
+ //depot/test-mercurial-import/file_text+s#1 - opened for edit
+ //depot/test-mercurial-import/file_text+s2#1 - opened for edit
+ //depot/test-mercurial-import/file_text+w#1 - opened for edit
+ //depot/test-mercurial-import/file_text+x#1 - opened for edit
+ //depot/test-mercurial-import/file_ubinary#1 - opened for edit
+ //depot/test-mercurial-import/file_uxbinary#1 - opened for edit
+ //depot/test-mercurial-import/file_xbinary#1 - opened for edit
+ //depot/test-mercurial-import/file_xltext#1 - opened for edit
+ //depot/test-mercurial-import/file_xtempobj#1 - opened for edit
+ //depot/test-mercurial-import/file_xtext#1 - opened for edit
+ //depot/test-mercurial-import/target_symlink#1 - opened for edit
+ //depot/test-mercurial-import/target_symlink+k#1 - opened for edit
+ $ for T in $TYPES ; do
+ > T2=`echo $T | tr [:upper:] [:lower:]`
+ > echo '$Id$' >>file_$T2
+ > echo '$Header$' >>file_$T2
+ > echo '$Date$' >>file_$T2
+ > echo '$DateTime$' >>file_$T2
+ > echo '$Change$' >>file_$T2
+ > echo '$File$' >>file_$T2
+ > echo '$Revision$' >>file_$T2
+ > echo '$Header$$Header$Header$' >>file_$T2
+ > done
+
+ $ ln -s 'target_$Header$' crazy_symlink+k
+ $ p4 add -t symlink+k crazy_symlink+k
+ //depot/test-mercurial-import/crazy_symlink+k#1 - opened for add
+
+ $ p4 submit -d keywords
+ Submitting change 2.
+ Locking 34 files ...
+ add //depot/test-mercurial-import/crazy_symlink+k#1
+ edit //depot/test-mercurial-import/file_binary#2
+ edit //depot/test-mercurial-import/file_binary+k#2
+ edit //depot/test-mercurial-import/file_binary+kx#2
+ edit //depot/test-mercurial-import/file_binary+x#2
+ edit //depot/test-mercurial-import/file_ctext#2
+ edit //depot/test-mercurial-import/file_cxtext#2
+ edit //depot/test-mercurial-import/file_ktext#2
+ edit //depot/test-mercurial-import/file_kxtext#2
+ edit //depot/test-mercurial-import/file_ltext#2
+ edit //depot/test-mercurial-import/file_symlink#2
+ edit //depot/test-mercurial-import/file_symlink+k#2
+ edit //depot/test-mercurial-import/file_tempobj#2
+ edit //depot/test-mercurial-import/file_text#2
+ edit //depot/test-mercurial-import/file_text+c#2
+ edit //depot/test-mercurial-import/file_text+d#2
+ edit //depot/test-mercurial-import/file_text+f#2
+ edit //depot/test-mercurial-import/file_text+k#2
+ edit //depot/test-mercurial-import/file_text+ko#2
+ edit //depot/test-mercurial-import/file_text+kx#2
+ edit //depot/test-mercurial-import/file_text+l#2
+ edit //depot/test-mercurial-import/file_text+m#2
+ edit //depot/test-mercurial-import/file_text+s#2
+ edit //depot/test-mercurial-import/file_text+s2#2
+ edit //depot/test-mercurial-import/file_text+w#2
+ edit //depot/test-mercurial-import/file_text+x#2
+ edit //depot/test-mercurial-import/file_ubinary#2
+ edit //depot/test-mercurial-import/file_uxbinary#2
+ edit //depot/test-mercurial-import/file_xbinary#2
+ edit //depot/test-mercurial-import/file_xltext#2
+ edit //depot/test-mercurial-import/file_xtempobj#2
+ edit //depot/test-mercurial-import/file_xtext#2
+ edit //depot/test-mercurial-import/target_symlink#2
+ edit //depot/test-mercurial-import/target_symlink+k#2
+ Change 2 submitted.
+ //depot/test-mercurial-import/crazy_symlink+k#1 - refreshing
+ //depot/test-mercurial-import/file_binary+k#2 - refreshing
+ //depot/test-mercurial-import/file_binary+kx#2 - refreshing
+ //depot/test-mercurial-import/file_ktext#2 - refreshing
+ //depot/test-mercurial-import/file_kxtext#2 - refreshing
+ //depot/test-mercurial-import/file_symlink+k#2 - refreshing
+ //depot/test-mercurial-import/file_text+k#2 - refreshing
+ //depot/test-mercurial-import/file_text+ko#2 - refreshing
+ //depot/test-mercurial-import/file_text+kx#2 - refreshing
+
+check keywords in p4
+ $ grep -H Header file_*
+ file_binary:$Header$
+ file_binary:$Header$$Header$Header$
+ file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $
+ file_binary+k:$Header: //depot/test-mercurial-import/file_binary+k#2 $$Header: //depot/test-mercurial-import/file_binary+k#2 $Header$
+ file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $
+ file_binary+kx:$Header: //depot/test-mercurial-import/file_binary+kx#2 $$Header: //depot/test-mercurial-import/file_binary+kx#2 $Header$
+ file_binary+x:$Header$
+ file_binary+x:$Header$$Header$Header$
+ file_ctext:$Header$
+ file_ctext:$Header$$Header$Header$
+ file_cxtext:$Header$
+ file_cxtext:$Header$$Header$Header$
+ file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $
+ file_ktext:$Header: //depot/test-mercurial-import/file_ktext#2 $$Header: //depot/test-mercurial-import/file_ktext#2 $Header$
+ file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $
+ file_kxtext:$Header: //depot/test-mercurial-import/file_kxtext#2 $$Header: //depot/test-mercurial-import/file_kxtext#2 $Header$
+ file_ltext:$Header$
+ file_ltext:$Header$$Header$Header$
+ file_symlink:$Header$
+ file_symlink:$Header$$Header$Header$
+ file_symlink+k:$Header$
+ file_symlink+k:$Header$$Header$Header$
+ file_tempobj:$Header$
+ file_tempobj:$Header$$Header$Header$
+ file_text:$Header$
+ file_text:$Header$$Header$Header$
+ file_text+c:$Header$
+ file_text+c:$Header$$Header$Header$
+ file_text+d:$Header$
+ file_text+d:$Header$$Header$Header$
+ file_text+f:$Header$
+ file_text+f:$Header$$Header$Header$
+ file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $
+ file_text+k:$Header: //depot/test-mercurial-import/file_text+k#2 $$Header: //depot/test-mercurial-import/file_text+k#2 $Header$
+ file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $
+ file_text+ko:$Header: //depot/test-mercurial-import/file_text+ko#2 $$Header: //depot/test-mercurial-import/file_text+ko#2 $Header$
+ file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $
+ file_text+kx:$Header: //depot/test-mercurial-import/file_text+kx#2 $$Header: //depot/test-mercurial-import/file_text+kx#2 $Header$
+ file_text+l:$Header$
+ file_text+l:$Header$$Header$Header$
+ file_text+m:$Header$
+ file_text+m:$Header$$Header$Header$
+ file_text+s:$Header$
+ file_text+s:$Header$$Header$Header$
+ file_text+s2:$Header$
+ file_text+s2:$Header$$Header$Header$
+ file_text+w:$Header$
+ file_text+w:$Header$$Header$Header$
+ file_text+x:$Header$
+ file_text+x:$Header$$Header$Header$
+ file_ubinary:$Header$
+ file_ubinary:$Header$$Header$Header$
+ file_uxbinary:$Header$
+ file_uxbinary:$Header$$Header$Header$
+ file_xbinary:$Header$
+ file_xbinary:$Header$$Header$Header$
+ file_xltext:$Header$
+ file_xltext:$Header$$Header$Header$
+ file_xtempobj:$Header$
+ file_xtempobj:$Header$$Header$Header$
+ file_xtext:$Header$
+ file_xtext:$Header$$Header$Header$
+
+convert
+ $ hg convert -s p4 $DEPOTPATH dst
+ initializing destination dst repository
+ reading p4 views
+ collecting p4 changelists
+ 1 initial
+ 2 keywords
+ scanning source...
+ sorting...
+ converting...
+ 1 initial
+ 0 keywords
+ $ hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'
+ rev=1 desc="keywords" tags="tip" files="crazy_symlink+k file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k"
+ rev=0 desc="initial" tags="" files="file_binary file_binary+k file_binary+kx file_binary+x file_ctext file_cxtext file_ktext file_kxtext file_ltext file_symlink file_symlink+k file_text file_text+c file_text+d file_text+f file_text+k file_text+ko file_text+kx file_text+l file_text+m file_text+s2 file_text+w file_text+x file_ubinary file_uxbinary file_xbinary file_xltext file_xtext target_symlink target_symlink+k"
+
+revision 0
+ $ hg -R dst update 0
+ 30 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ head dst/file_* | cat -v
+ ==> dst/file_binary <==
+ this is binary
+ ==> dst/file_binary+k <==
+ this is binary+k
+ ==> dst/file_binary+kx <==
+ this is binary+kx
+ ==> dst/file_binary+x <==
+ this is binary+x
+ ==> dst/file_ctext <==
+ this is ctext
+
+ ==> dst/file_cxtext <==
+ this is cxtext
+
+ ==> dst/file_ktext <==
+ this is ktext
+
+ ==> dst/file_kxtext <==
+ this is kxtext
+
+ ==> dst/file_ltext <==
+ this is ltext
+
+ ==> dst/file_symlink <==
+ this is target symlink
+
+ ==> dst/file_symlink+k <==
+ this is target symlink+k
+
+ ==> dst/file_text <==
+ this is text
+
+ ==> dst/file_text+c <==
+ this is text+C
+
+ ==> dst/file_text+d <==
+ this is text+D
+
+ ==> dst/file_text+f <==
+ this is text+F
+
+ ==> dst/file_text+k <==
+ this is text+k
+
+ ==> dst/file_text+ko <==
+ this is text+ko
+
+ ==> dst/file_text+kx <==
+ this is text+kx
+
+ ==> dst/file_text+l <==
+ this is text+l
+
+ ==> dst/file_text+m <==
+ this is text+m
+
+ ==> dst/file_text+s2 <==
+ this is text+S2
+
+ ==> dst/file_text+w <==
+ this is text+w
+
+ ==> dst/file_text+x <==
+ this is text+x
+
+ ==> dst/file_ubinary <==
+ this is ubinary
+
+ ==> dst/file_uxbinary <==
+ this is uxbinary
+
+ ==> dst/file_xbinary <==
+ this is xbinary
+
+ ==> dst/file_xltext <==
+ this is xltext
+
+ ==> dst/file_xtext <==
+ this is xtext
+
+revision 1
+ $ hg -R dst update 1
+ 30 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ head dst/file_* | cat -v
+ ==> dst/file_binary <==
+ this is binary$Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_binary+k <==
+ this is binary+k$Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_binary+kx <==
+ this is binary+kx$Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_binary+x <==
+ this is binary+x$Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_ctext <==
+ this is ctext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_cxtext <==
+ this is cxtext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_ktext <==
+ this is ktext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_kxtext <==
+ this is kxtext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_ltext <==
+ this is ltext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_symlink <==
+ this is target symlink
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_symlink+k <==
+ this is target symlink+k
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text <==
+ this is text
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+c <==
+ this is text+C
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+d <==
+ this is text+D
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+f <==
+ this is text+F
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+k <==
+ this is text+k
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+ko <==
+ this is text+ko
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+kx <==
+ this is text+kx
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+l <==
+ this is text+l
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+m <==
+ this is text+m
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+s <==
+ this is text+S
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+s2 <==
+ this is text+S2
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+w <==
+ this is text+w
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_text+x <==
+ this is text+x
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_ubinary <==
+ this is ubinary
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_uxbinary <==
+ this is uxbinary
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_xbinary <==
+ this is xbinary
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_xltext <==
+ this is xltext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+ ==> dst/file_xtext <==
+ this is xtext
+ $Id$
+ $Header$
+ $Date$
+ $DateTime$
+ $Change$
+ $File$
+ $Revision$
+ $Header$$Header$Header$
+
+crazy_symlink
+ $ readlink crazy_symlink+k
+ target_$Header: //depot/test-mercurial-import/crazy_symlink+k#1 $
+ $ readlink dst/crazy_symlink+k
+ target_$Header$
+
+exit trap:
+ stopping the p4 server
diff --git a/tests/test-convert-p4.t b/tests/test-convert-p4.t
new file mode 100644
index 0000000..6a59759
--- /dev/null
+++ b/tests/test-convert-p4.t
@@ -0,0 +1,152 @@
+ $ "$TESTDIR/hghave" p4 || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert = " >> $HGRCPATH
+
+create p4 depot
+ $ P4ROOT=`pwd`/depot; export P4ROOT
+ $ P4AUDIT=$P4ROOT/audit; export P4AUDIT
+ $ P4JOURNAL=$P4ROOT/journal; export P4JOURNAL
+ $ P4LOG=$P4ROOT/log; export P4LOG
+ $ P4PORT=localhost:16661; export P4PORT
+ $ P4DEBUG=1; export P4DEBUG
+
+start the p4 server
+ $ [ ! -d $P4ROOT ] && mkdir $P4ROOT
+ $ p4d -f -J off >$P4ROOT/stdout 2>$P4ROOT/stderr &
+ $ echo $! >> $DAEMON_PIDS
+ $ trap "echo stopping the p4 server ; p4 admin stop" EXIT
+
+ $ # wait for the server to initialize
+ $ while ! p4 ; do
+ > sleep 1
+ > done >/dev/null 2>/dev/null
+
+create a client spec
+ $ P4CLIENT=hg-p4-import; export P4CLIENT
+ $ DEPOTPATH=//depot/test-mercurial-import/...
+ $ p4 client -o | sed '/^View:/,$ d' >p4client
+ $ echo View: >>p4client
+ $ echo " $DEPOTPATH //$P4CLIENT/..." >>p4client
+ $ p4 client -i <p4client
+ Client hg-p4-import saved.
+
+populate the depot
+ $ echo a > a
+ $ mkdir b
+ $ echo c > b/c
+ $ p4 add a b/c
+ //depot/test-mercurial-import/a#1 - opened for add
+ //depot/test-mercurial-import/b/c#1 - opened for add
+ $ p4 submit -d initial
+ Submitting change 1.
+ Locking 2 files ...
+ add //depot/test-mercurial-import/a#1
+ add //depot/test-mercurial-import/b/c#1
+ Change 1 submitted.
+
+change some files
+ $ p4 edit a
+ //depot/test-mercurial-import/a#1 - opened for edit
+ $ echo aa >> a
+ $ p4 submit -d "change a"
+ Submitting change 2.
+ Locking 1 files ...
+ edit //depot/test-mercurial-import/a#2
+ Change 2 submitted.
+
+ $ p4 edit b/c
+ //depot/test-mercurial-import/b/c#1 - opened for edit
+ $ echo cc >> b/c
+ $ p4 submit -d "change b/c"
+ Submitting change 3.
+ Locking 1 files ...
+ edit //depot/test-mercurial-import/b/c#2
+ Change 3 submitted.
+
+convert
+ $ hg convert -s p4 $DEPOTPATH dst
+ initializing destination dst repository
+ reading p4 views
+ collecting p4 changelists
+ 1 initial
+ 2 change a
+ 3 change b/c
+ scanning source...
+ sorting...
+ converting...
+ 2 initial
+ 1 change a
+ 0 change b/c
+ $ hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'
+ rev=2 desc="change b/c" tags="tip" files="b/c"
+ rev=1 desc="change a" tags="" files="a"
+ rev=0 desc="initial" tags="" files="a b/c"
+
+change some files
+ $ p4 edit a b/c
+ //depot/test-mercurial-import/a#2 - opened for edit
+ //depot/test-mercurial-import/b/c#2 - opened for edit
+ $ echo aaa >> a
+ $ echo ccc >> b/c
+ $ p4 submit -d "change a b/c"
+ Submitting change 4.
+ Locking 2 files ...
+ edit //depot/test-mercurial-import/a#3
+ edit //depot/test-mercurial-import/b/c#3
+ Change 4 submitted.
+
+convert again
+ $ hg convert -s p4 $DEPOTPATH dst
+ reading p4 views
+ collecting p4 changelists
+ 1 initial
+ 2 change a
+ 3 change b/c
+ 4 change a b/c
+ scanning source...
+ sorting...
+ converting...
+ 0 change a b/c
+ $ hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'
+ rev=3 desc="change a b/c" tags="tip" files="a b/c"
+ rev=2 desc="change b/c" tags="" files="b/c"
+ rev=1 desc="change a" tags="" files="a"
+ rev=0 desc="initial" tags="" files="a b/c"
+
+interesting names
+ $ echo dddd > "d d"
+ $ mkdir " e"
+ $ echo fff >" e/ f"
+ $ p4 add "d d" " e/ f"
+ //depot/test-mercurial-import/d d#1 - opened for add
+ //depot/test-mercurial-import/ e/ f#1 - opened for add
+ $ p4 submit -d "add d e f"
+ Submitting change 5.
+ Locking 2 files ...
+ add //depot/test-mercurial-import/ e/ f#1
+ add //depot/test-mercurial-import/d d#1
+ Change 5 submitted.
+
+convert again
+ $ hg convert -s p4 $DEPOTPATH dst
+ reading p4 views
+ collecting p4 changelists
+ 1 initial
+ 2 change a
+ 3 change b/c
+ 4 change a b/c
+ 5 add d e f
+ scanning source...
+ sorting...
+ converting...
+ 0 add d e f
+ $ hg -R dst log --template 'rev={rev} desc="{desc}" tags="{tags}" files="{files}"\n'
+ rev=4 desc="add d e f" tags="tip" files=" e/ f d d"
+ rev=3 desc="change a b/c" tags="" files="a b/c"
+ rev=2 desc="change b/c" tags="" files="b/c"
+ rev=1 desc="change a" tags="" files="a"
+ rev=0 desc="initial" tags="" files="a b/c"
+
+exit trap:
+ stopping the p4 server
diff --git a/tests/test-convert-splicemap.t b/tests/test-convert-splicemap.t
new file mode 100644
index 0000000..d5bb15f
--- /dev/null
+++ b/tests/test-convert-splicemap.t
@@ -0,0 +1,222 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+ $ glog()
+ > {
+ > hg glog --template '{rev}:{node|short} "{desc|firstline}"\
+ > files: {files}\n' "$@"
+ > }
+ $ hg init repo1
+ $ cd repo1
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo b > b
+ $ echo a >> a
+ $ hg ci -Am addb
+ adding b
+ $ PARENTID1=`hg id --debug -i`
+ $ echo c > c
+ $ hg ci -Am addc
+ adding c
+ $ PARENTID2=`hg id --debug -i`
+ $ cd ..
+ $ glog -R repo1
+ @ 2:e55c719b85b6 "addc" files: c
+ |
+ o 1:6d4c2037ddc2 "addb" files: a b
+ |
+ o 0:07f494440405 "adda" files: a
+
+
+ $ hg init repo2
+ $ cd repo2
+ $ echo b > a
+ $ echo d > d
+ $ hg ci -Am addaandd
+ adding a
+ adding d
+ $ CHILDID1=`hg id --debug -i`
+ $ echo d >> d
+ $ hg ci -Am changed
+ $ CHILDID2=`hg id --debug -i`
+ $ echo e > e
+ $ hg ci -Am adde
+ adding e
+ $ cd ..
+ $ glog -R repo2
+ @ 2:a39b65753b0a "adde" files: e
+ |
+ o 1:e4ea00df9189 "changed" files: d
+ |
+ o 0:527cdedf31fb "addaandd" files: a d
+
+
+test invalid splicemap
+
+ $ cat > splicemap <<EOF
+ > $CHILDID2
+ > EOF
+ $ hg convert --splicemap splicemap repo2 repo1
+ abort: syntax error in splicemap(1): child parent1[,parent2] expected
+ [255]
+
+splice repo2 on repo1
+
+ $ cat > splicemap <<EOF
+ > $CHILDID1 $PARENTID1
+ > $CHILDID2 $PARENTID2,$CHILDID1
+ >
+ > EOF
+ $ cat splicemap
+ 527cdedf31fbd5ea708aa14eeecf53d4676f38db 6d4c2037ddc2cb2627ac3a244ecce35283268f8e
+ e4ea00df91897da3079a10fab658c1eddba6617b e55c719b85b60e5102fac26110ba626e7cb6b7dc,527cdedf31fbd5ea708aa14eeecf53d4676f38db
+
+ $ hg clone repo1 target1
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg convert --splicemap splicemap repo2 target1
+ scanning source...
+ sorting...
+ converting...
+ 2 addaandd
+ spliced in ['6d4c2037ddc2cb2627ac3a244ecce35283268f8e'] as parents of 527cdedf31fbd5ea708aa14eeecf53d4676f38db
+ 1 changed
+ spliced in ['e55c719b85b60e5102fac26110ba626e7cb6b7dc', '527cdedf31fbd5ea708aa14eeecf53d4676f38db'] as parents of e4ea00df91897da3079a10fab658c1eddba6617b
+ 0 adde
+ $ glog -R target1
+ o 5:16bc847b02aa "adde" files: e
+ |
+ o 4:e30e4fee3418 "changed" files: d
+ |\
+ | o 3:e673348c3a3c "addaandd" files: a d
+ | |
+ @ | 2:e55c719b85b6 "addc" files: c
+ |/
+ o 1:6d4c2037ddc2 "addb" files: a b
+ |
+ o 0:07f494440405 "adda" files: a
+
+
+
+
+Test splicemap and conversion order
+
+ $ hg init ordered
+ $ cd ordered
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg branch branch
+ marked working directory as branch branch
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >> a
+ $ hg ci -Am changea
+ $ echo a >> a
+ $ hg ci -Am changeaagain
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+
+We want 2 to depend on 1 and 3. Since 3 is always converted after 2,
+the bug should be exhibited with all conversion orders.
+
+ $ cat > ../splicemap <<EOF
+ > `(hg id -r 2 -i --debug)` `(hg id -r 1 -i --debug)`, `(hg id -r 3 -i --debug)`
+ > EOF
+ $ cd ..
+ $ cat splicemap
+ 7c364e7fa7d70ae525610c016317ed717b519d97 717d54d67e6c31fd75ffef2ff3042bdd98418437, 102a90ea7b4a3361e4082ed620918c261189a36a
+
+Test regular conversion
+
+ $ hg convert --splicemap splicemap ordered ordered-hg1
+ initializing destination ordered-hg1 repository
+ scanning source...
+ sorting...
+ converting...
+ 3 adda
+ 2 changea
+ 1 addb
+ 0 changeaagain
+ spliced in ['717d54d67e6c31fd75ffef2ff3042bdd98418437', '102a90ea7b4a3361e4082ed620918c261189a36a'] as parents of 7c364e7fa7d70ae525610c016317ed717b519d97
+ $ glog -R ordered-hg1
+ o 3:4cb04b9afbf2 "changeaagain" files: a
+ |\
+ | o 2:102a90ea7b4a "addb" files: b
+ | |
+ o | 1:717d54d67e6c "changea" files: a
+ |/
+ o 0:07f494440405 "adda" files: a
+
+
+Test conversion with parent revisions already in dest, using source
+and destination identifiers. Test unknown splicemap target.
+
+ $ hg convert -r1 ordered ordered-hg2
+ initializing destination ordered-hg2 repository
+ scanning source...
+ sorting...
+ converting...
+ 1 adda
+ 0 changea
+ $ hg convert -r3 ordered ordered-hg2
+ scanning source...
+ sorting...
+ converting...
+ 0 addb
+ $ cat > splicemap <<EOF
+ > `(hg -R ordered id -r 2 -i --debug)` \
+ > `(hg -R ordered-hg2 id -r 1 -i --debug)`,\
+ > `(hg -R ordered-hg2 id -r 2 -i --debug)`
+ > deadbeef102a90ea7b4a3361e4082ed620918c26 deadbeef102a90ea7b4a3361e4082ed620918c27
+ > EOF
+ $ hg convert --splicemap splicemap ordered ordered-hg2
+ scanning source...
+ splice map revision deadbeef102a90ea7b4a3361e4082ed620918c26 is not being converted, ignoring
+ sorting...
+ converting...
+ 0 changeaagain
+ spliced in ['717d54d67e6c31fd75ffef2ff3042bdd98418437', '102a90ea7b4a3361e4082ed620918c261189a36a'] as parents of 7c364e7fa7d70ae525610c016317ed717b519d97
+ $ glog -R ordered-hg2
+ o 3:4cb04b9afbf2 "changeaagain" files: a
+ |\
+ | o 2:102a90ea7b4a "addb" files: b
+ | |
+ o | 1:717d54d67e6c "changea" files: a
+ |/
+ o 0:07f494440405 "adda" files: a
+
+
+Test empty conversion
+
+ $ hg convert --splicemap splicemap ordered ordered-hg2
+ scanning source...
+ splice map revision deadbeef102a90ea7b4a3361e4082ed620918c26 is not being converted, ignoring
+ sorting...
+ converting...
+
+Test clonebranches
+
+ $ hg --config convert.hg.clonebranches=true convert \
+ > --splicemap splicemap ordered ordered-hg3
+ initializing destination ordered-hg3 repository
+ scanning source...
+ abort: revision 717d54d67e6c31fd75ffef2ff3042bdd98418437 not found in destination repository (lookups with clonebranches=true are not implemented)
+ [255]
+
+Test invalid dependency
+
+ $ cat > splicemap <<EOF
+ > `(hg -R ordered id -r 2 -i --debug)` \
+ > deadbeef102a90ea7b4a3361e4082ed620918c26,\
+ > `(hg -R ordered-hg2 id -r 2 -i --debug)`
+ > EOF
+ $ hg convert --splicemap splicemap ordered ordered-hg4
+ initializing destination ordered-hg4 repository
+ scanning source...
+ abort: unknown splice map parent: deadbeef102a90ea7b4a3361e4082ed620918c26
+ [255]
diff --git a/tests/test-convert-svn-branches.t b/tests/test-convert-svn-branches.t
new file mode 100644
index 0000000..95df843
--- /dev/null
+++ b/tests/test-convert-svn-branches.t
@@ -0,0 +1,103 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/branches.svndump"
+
+Convert trunk and branches
+
+ $ cat > branchmap <<EOF
+ > old3 newbranch
+ >
+ >
+ > EOF
+ $ hg convert --branchmap=branchmap --datesort -r 10 svn-repo A-hg
+ initializing destination A-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 10 init projA
+ 9 hello
+ 8 branch trunk, remove c and dir
+ 7 change a
+ 6 change b
+ 5 move and update c
+ 4 move and update c
+ 3 change b again
+ 2 move to old2
+ 1 move back to old
+ 0 last change to a
+
+Test template keywords
+
+ $ hg -R A-hg log --template '{rev} {svnuuid}{svnpath}@{svnrev}\n'
+ 10 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@10
+ 9 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@9
+ 8 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old2@8
+ 7 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@7
+ 6 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@6
+ 5 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@6
+ 4 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@5
+ 3 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@4
+ 2 644ede6c-2b81-4367-9dc8-d786514f2cde/branches/old@3
+ 1 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@2
+ 0 644ede6c-2b81-4367-9dc8-d786514f2cde/trunk@1
+
+Convert again
+
+ $ hg convert --branchmap=branchmap --datesort svn-repo A-hg
+ scanning source...
+ sorting...
+ converting...
+ 0 branch trunk@1 into old3
+
+ $ cd A-hg
+ $ hg glog --template 'branch={branches} {rev} {desc|firstline} files: {files}\n'
+ o branch=newbranch 11 branch trunk@1 into old3 files:
+ |
+ | o branch= 10 last change to a files: a
+ | |
+ | | o branch=old 9 move back to old files:
+ | | |
+ | | o branch=old2 8 move to old2 files:
+ | | |
+ | | o branch=old 7 change b again files: b
+ | | |
+ | o | branch= 6 move and update c files: b
+ | | |
+ | | o branch=old 5 move and update c files: c
+ | | |
+ | | o branch=old 4 change b files: b
+ | | |
+ | o | branch= 3 change a files: a
+ | | |
+ | | o branch=old 2 branch trunk, remove c and dir files: c
+ | |/
+ | o branch= 1 hello files: a b c dir/e
+ |/
+ o branch= 0 init projA files:
+
+
+ $ hg branches
+ newbranch 11:a6d7cc050ad1
+ default 10:6e2b33404495
+ old 9:93c4b0f99529
+ old2 8:b52884d7bead (inactive)
+ $ hg tags -q
+ tip
+ $ cd ..
+
+Test hg failing to call itself
+
+ $ HG=foobar hg convert svn-repo B-hg
+ * (glob)
+ initializing destination B-hg repository
+ abort: Mercurial failed to run itself, check hg executable is in PATH
+ [255]
+
diff --git a/tests/test-convert-svn-encoding.t b/tests/test-convert-svn-encoding.t
new file mode 100644
index 0000000..744b2b2
--- /dev/null
+++ b/tests/test-convert-svn-encoding.t
@@ -0,0 +1,135 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/encoding.svndump"
+
+Convert while testing all possible outputs
+
+ $ hg --debug convert svn-repo A-hg
+ initializing destination A-hg repository
+ reparent to file://*/svn-repo (glob)
+ run hg sink pre-conversion action
+ scanning source...
+ found trunk at 'trunk'
+ found tags at 'tags'
+ found branches at 'branches'
+ found branch branch\xc3\xa9 at 5 (esc)
+ found branch branch\xc3\xa9e at 6 (esc)
+ scanning: 1 revisions
+ reparent to file://*/svn-repo/trunk (glob)
+ fetching revision log for "/trunk" from 4 to 0
+ parsing revision 4 (2 changes)
+ parsing revision 3 (4 changes)
+ parsing revision 2 (3 changes)
+ parsing revision 1 (3 changes)
+ no copyfrom path, don't know what to do.
+ '/branches' is not under '/trunk', ignoring
+ '/tags' is not under '/trunk', ignoring
+ scanning: 2 revisions
+ reparent to file://*/svn-repo/branches/branch%C3%A9 (glob)
+ fetching revision log for "/branches/branch\xc3\xa9" from 5 to 0 (esc)
+ parsing revision 5 (1 changes)
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/branches/branch%C3%A9 (glob)
+ found parent of branch /branches/branch\xc3\xa9 at 4: /trunk (esc)
+ scanning: 3 revisions
+ reparent to file://*/svn-repo/branches/branch%C3%A9e (glob)
+ fetching revision log for "/branches/branch\xc3\xa9e" from 6 to 0 (esc)
+ parsing revision 6 (1 changes)
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/branches/branch%C3%A9e (glob)
+ found parent of branch /branches/branch\xc3\xa9e at 5: /branches/branch\xc3\xa9 (esc)
+ scanning: 4 revisions
+ scanning: 5 revisions
+ scanning: 6 revisions
+ sorting...
+ converting...
+ 5 init projA
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/trunk@1
+ converting: 0/6 revisions (0.00%)
+ 4 hello
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/trunk@2
+ converting: 1/6 revisions (16.67%)
+ reparent to file://*/svn-repo/trunk (glob)
+ scanning paths: /trunk/\xc3\xa0 0/3 (0.00%) (esc)
+ scanning paths: /trunk/\xc3\xa0/e\xcc\x81 1/3 (33.33%) (esc)
+ scanning paths: /trunk/\xc3\xa9 2/3 (66.67%) (esc)
+ \xc3\xa0/e\xcc\x81 (esc)
+ getting files: \xc3\xa0/e\xcc\x81 1/2 (50.00%) (esc)
+ \xc3\xa9 (esc)
+ getting files: \xc3\xa9 2/2 (100.00%) (esc)
+ 3 copy files
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/trunk@3
+ converting: 2/6 revisions (33.33%)
+ scanning paths: /trunk/\xc3\xa0 0/4 (0.00%) (esc)
+ gone from -1
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/trunk (glob)
+ scanning paths: /trunk/\xc3\xa8 1/4 (25.00%) (esc)
+ copied to \xc3\xa8 from \xc3\xa9@2 (esc)
+ scanning paths: /trunk/\xc3\xa9 2/4 (50.00%) (esc)
+ gone from -1
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/trunk (glob)
+ scanning paths: /trunk/\xc3\xb9 3/4 (75.00%) (esc)
+ mark /trunk/\xc3\xb9 came from \xc3\xa0:2 (esc)
+ \xc3\xa0/e\xcc\x81 (esc)
+ getting files: \xc3\xa0/e\xcc\x81 1/4 (25.00%) (esc)
+ \xc3\xa8 (esc)
+ getting files: \xc3\xa8 2/4 (50.00%) (esc)
+ \xc3\xa8: copy \xc3\xa9:6b67ccefd5ce6de77e7ead4f5292843a0255329f (esc)
+ \xc3\xa9 (esc)
+ getting files: \xc3\xa9 3/4 (75.00%) (esc)
+ \xc3\xb9/e\xcc\x81 (esc)
+ getting files: \xc3\xb9/e\xcc\x81 4/4 (100.00%) (esc)
+ \xc3\xb9/e\xcc\x81: copy \xc3\xa0/e\xcc\x81:a9092a3d84a37b9993b5c73576f6de29b7ea50f6 (esc)
+ 2 remove files
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/trunk@4
+ converting: 3/6 revisions (50.00%)
+ scanning paths: /trunk/\xc3\xa8 0/2 (0.00%) (esc)
+ gone from -1
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/trunk (glob)
+ scanning paths: /trunk/\xc3\xb9 1/2 (50.00%) (esc)
+ gone from -1
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/trunk (glob)
+ \xc3\xa8 (esc)
+ getting files: \xc3\xa8 1/2 (50.00%) (esc)
+ \xc3\xb9/e\xcc\x81 (esc)
+ getting files: \xc3\xb9/e\xcc\x81 2/2 (100.00%) (esc)
+ 1 branch to branch?
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/branches/branch?@5
+ converting: 4/6 revisions (66.67%)
+ reparent to file://*/svn-repo/branches/branch%C3%A9 (glob)
+ scanning paths: /branches/branch\xc3\xa9 0/1 (0.00%) (esc)
+ 0 branch to branch?e
+ source: svn:afeb9c47-92ff-4c0c-9f72-e1f6eb8ac9af/branches/branch?e@6
+ converting: 5/6 revisions (83.33%)
+ reparent to file://*/svn-repo/branches/branch%C3%A9e (glob)
+ scanning paths: /branches/branch\xc3\xa9e 0/1 (0.00%) (esc)
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/branches/branch%C3%A9e (glob)
+ reparent to file://*/svn-repo (glob)
+ reparent to file://*/svn-repo/branches/branch%C3%A9e (glob)
+ updating tags
+ .hgtags
+ run hg sink post-conversion action
+ $ cd A-hg
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Check tags are in UTF-8
+
+ $ cat .hgtags
+ e94e4422020e715add80525e8f0f46c9968689f1 branch\xc3\xa9e (esc)
+ f7e66f98380ed1e53a797c5c7a7a2616a7ab377d branch\xc3\xa9 (esc)
+
+ $ cd ..
diff --git a/tests/test-convert-svn-move.t b/tests/test-convert-svn-move.t
new file mode 100644
index 0000000..b8f0dde
--- /dev/null
+++ b/tests/test-convert-svn-move.t
@@ -0,0 +1,243 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/move.svndump"
+ $ SVNREPOPATH=`pwd`/svn-repo
+#if windows
+ $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#else
+ $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#endif
+
+Convert trunk and branches
+
+ $ hg convert --datesort "$SVNREPOURL"/subproject A-hg
+ initializing destination A-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 13 createtrunk
+ 12 moved1
+ 11 moved1
+ 10 moved2
+ 9 changeb and rm d2
+ 8 changeb and rm d2
+ 7 moved1again
+ 6 moved1again
+ 5 copyfilefrompast
+ 4 copydirfrompast
+ 3 add d3
+ 2 copy dir and remove subdir
+ 1 add d4old
+ 0 rename d4old into d4new
+
+ $ cd A-hg
+ $ hg glog --template '{rev} {desc|firstline} files: {files}\n'
+ o 13 rename d4old into d4new files: d4new/g d4old/g
+ |
+ o 12 add d4old files: d4old/g
+ |
+ o 11 copy dir and remove subdir files: d3/d31/e d4/d31/e d4/f
+ |
+ o 10 add d3 files: d3/d31/e d3/f
+ |
+ o 9 copydirfrompast files: d2/d
+ |
+ o 8 copyfilefrompast files: d
+ |
+ o 7 moved1again files: d1/b d1/c
+ |
+ | o 6 moved1again files:
+ | |
+ o | 5 changeb and rm d2 files: d1/b d2/d
+ | |
+ | o 4 changeb and rm d2 files: b
+ | |
+ o | 3 moved2 files: d2/d
+ | |
+ o | 2 moved1 files: d1/b d1/c
+ | |
+ | o 1 moved1 files: b c
+ |
+ o 0 createtrunk files:
+
+
+Check move copy records
+
+ $ hg st --rev 12:13 --copies
+ A d4new/g
+ d4old/g
+ R d4old/g
+
+Check branches
+
+ $ hg branches
+ default 13:* (glob)
+ d1 6:* (glob)
+ $ cd ..
+
+ $ mkdir test-replace
+ $ cd test-replace
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/replace.svndump"
+
+Convert files being replaced by directories
+
+ $ hg convert svn-repo hg-repo
+ initializing destination hg-repo repository
+ scanning source...
+ sorting...
+ converting...
+ 6 initial
+ 5 clobber symlink
+ 4 clobber1
+ 3 clobber2
+ 2 adddb
+ 1 branch
+ 0 clobberdir
+
+ $ cd hg-repo
+
+Manifest before
+
+ $ hg -v manifest -r 1
+ 644 a
+ 644 d/b
+ 644 d2/a
+ 644 @ dlink
+ 644 @ dlink2
+ 644 dlink3
+
+Manifest after clobber1
+
+ $ hg -v manifest -r 2
+ 644 a/b
+ 644 d/b
+ 644 d2/a
+ 644 dlink/b
+ 644 @ dlink2
+ 644 dlink3
+
+Manifest after clobber2
+
+ $ hg -v manifest -r 3
+ 644 a/b
+ 644 d/b
+ 644 d2/a
+ 644 dlink/b
+ 644 @ dlink2
+ 644 @ dlink3
+
+Manifest after clobberdir
+
+ $ hg -v manifest -r 6
+ 644 a/b
+ 644 d/b
+ 644 d2/a
+ 644 d2/c
+ 644 dlink/b
+ 644 @ dlink2
+ 644 @ dlink3
+
+Try updating
+
+ $ hg up -qC default
+ $ cd ..
+
+Test convert progress bar'
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > progress =
+ > [progress]
+ > assume-tty = 1
+ > delay = 0
+ > changedelay = 0
+ > format = topic bar number
+ > refresh = 0
+ > width = 60
+ > EOF
+
+ $ hg convert svn-repo hg-progress 2>&1 | "$TESTDIR/filtercr.py"
+
+ scanning [ <=> ] 1
+ scanning [ <=> ] 2
+ scanning [ <=> ] 3
+ scanning [ <=> ] 4
+ scanning [ <=> ] 5
+ scanning [ <=> ] 6
+ scanning [ <=> ] 7
+
+ converting [ ] 0/7
+ getting files [=====> ] 1/6
+ getting files [============> ] 2/6
+ getting files [==================> ] 3/6
+ getting files [=========================> ] 4/6
+ getting files [===============================> ] 5/6
+ getting files [======================================>] 6/6
+
+ converting [=====> ] 1/7
+ scanning paths [ ] 0/1
+ getting files [======================================>] 1/1
+
+ converting [===========> ] 2/7
+ scanning paths [ ] 0/2
+ scanning paths [==================> ] 1/2
+ getting files [========> ] 1/4
+ getting files [==================> ] 2/4
+ getting files [============================> ] 3/4
+ getting files [======================================>] 4/4
+
+ converting [=================> ] 3/7
+ scanning paths [ ] 0/1
+ getting files [======================================>] 1/1
+
+ converting [=======================> ] 4/7
+ scanning paths [ ] 0/1
+ getting files [======================================>] 1/1
+
+ converting [=============================> ] 5/7
+ scanning paths [ ] 0/3
+ scanning paths [===========> ] 1/3
+ scanning paths [========================> ] 2/3
+ getting files [===> ] 1/8
+ getting files [========> ] 2/8
+ getting files [=============> ] 3/8
+ getting files [==================> ] 4/8
+ getting files [=======================> ] 5/8
+ getting files [============================> ] 6/8
+ getting files [=================================> ] 7/8
+ getting files [======================================>] 8/8
+
+ converting [===================================> ] 6/7
+ scanning paths [ ] 0/1
+ getting files [===> ] 1/8
+ getting files [========> ] 2/8
+ getting files [=============> ] 3/8
+ getting files [==================> ] 4/8
+ getting files [=======================> ] 5/8
+ getting files [============================> ] 6/8
+ getting files [=================================> ] 7/8
+ getting files [======================================>] 8/8
+
+ initializing destination hg-progress repository
+ scanning source...
+ sorting...
+ converting...
+ 6 initial
+ 5 clobber symlink
+ 4 clobber1
+ 3 clobber2
+ 2 adddb
+ 1 branch
+ 0 clobberdir
+
+
+ $ cd ..
diff --git a/tests/test-convert-svn-sink.t b/tests/test-convert-svn-sink.t
new file mode 100644
index 0000000..ab39f7f
--- /dev/null
+++ b/tests/test-convert-svn-sink.t
@@ -0,0 +1,432 @@
+ $ "$TESTDIR/hghave" svn13 || exit 80
+
+ $ svnupanddisplay()
+ > {
+ > (
+ > cd $1;
+ > svn up -q;
+ > svn st -v | sed 's/ */ /g' | sort
+ > limit=''
+ > if [ $2 -gt 0 ]; then
+ > limit="--limit=$2"
+ > fi
+ > svn log --xml -v $limit | python "$TESTDIR/svnxml.py"
+ > )
+ > }
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+
+ $ hg init a
+
+Add
+
+ $ echo a > a/a
+ $ mkdir -p a/d1/d2
+ $ echo b > a/d1/d2/b
+ $ hg --cwd a ci -d '0 0' -A -m 'add a file'
+ adding a
+ adding d1/d2/b
+
+Modify
+
+ $ "$TESTDIR/svn-safe-append.py" a a/a
+ $ hg --cwd a ci -d '1 0' -m 'modify a file'
+ $ hg --cwd a tip -q
+ 1:e0e2b8a9156b
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn repository 'a-hg'
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 1 add a file
+ 0 modify a file
+ $ svnupanddisplay a-hg-wc 2
+ 2 1 test d1
+ 2 1 test d1/d2 (glob)
+ 2 1 test d1/d2/b (glob)
+ 2 2 test .
+ 2 2 test a
+ revision: 2
+ author: test
+ msg: modify a file
+ M /a
+ revision: 1
+ author: test
+ msg: add a file
+ A /a
+ A /d1
+ A /d1/d2
+ A /d1/d2/b
+ $ ls a a-hg-wc
+ a:
+ a
+ d1
+
+ a-hg-wc:
+ a
+ d1
+ $ cmp a/a a-hg-wc/a
+
+Rename
+
+ $ hg --cwd a mv a b
+ $ hg --cwd a ci -d '2 0' -m 'rename a file'
+ $ hg --cwd a tip -q
+ 2:eb5169441d43
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 rename a file
+ $ svnupanddisplay a-hg-wc 1
+ 3 1 test d1
+ 3 1 test d1/d2 (glob)
+ 3 1 test d1/d2/b (glob)
+ 3 3 test .
+ 3 3 test b
+ revision: 3
+ author: test
+ msg: rename a file
+ D /a
+ A /b (from /a@2)
+ $ ls a a-hg-wc
+ a:
+ b
+ d1
+
+ a-hg-wc:
+ b
+ d1
+
+Copy
+
+ $ hg --cwd a cp b c
+
+ $ hg --cwd a ci -d '3 0' -m 'copy a file'
+ $ hg --cwd a tip -q
+ 3:60effef6ab48
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 copy a file
+ $ svnupanddisplay a-hg-wc 1
+ 4 1 test d1
+ 4 1 test d1/d2 (glob)
+ 4 1 test d1/d2/b (glob)
+ 4 3 test b
+ 4 4 test .
+ 4 4 test c
+ revision: 4
+ author: test
+ msg: copy a file
+ A /c (from /b@3)
+ $ ls a a-hg-wc
+ a:
+ b
+ c
+ d1
+
+ a-hg-wc:
+ b
+ c
+ d1
+
+ $ hg --cwd a rm b
+
+Remove
+
+ $ hg --cwd a ci -d '4 0' -m 'remove a file'
+ $ hg --cwd a tip -q
+ 4:87bbe3013fb6
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 remove a file
+ $ svnupanddisplay a-hg-wc 1
+ 5 1 test d1
+ 5 1 test d1/d2 (glob)
+ 5 1 test d1/d2/b (glob)
+ 5 4 test c
+ 5 5 test .
+ revision: 5
+ author: test
+ msg: remove a file
+ D /b
+ $ ls a a-hg-wc
+ a:
+ c
+ d1
+
+ a-hg-wc:
+ c
+ d1
+
+Executable
+
+#if execbit
+ $ chmod +x a/c
+#else
+ $ echo fake >> a/c
+#endif
+ $ hg --cwd a ci -d '5 0' -m 'make a file executable'
+#if execbit
+ $ hg --cwd a tip -q
+ 5:ff42e473c340
+#else
+ $ hg --cwd a tip -q
+ 5:817a700c8cf1
+#endif
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 make a file executable
+ $ svnupanddisplay a-hg-wc 1
+ 6 1 test d1
+ 6 1 test d1/d2 (glob)
+ 6 1 test d1/d2/b (glob)
+ 6 6 test .
+ 6 6 test c
+ revision: 6
+ author: test
+ msg: make a file executable
+ M /c
+#if execbit
+ $ test -x a-hg-wc/c
+#endif
+
+#if symlink
+
+Symlinks
+
+ $ ln -s a/missing a/link
+ $ hg --cwd a commit -Am 'add symlink'
+ adding link
+ $ hg --cwd a mv link newlink
+ $ hg --cwd a commit -m 'move symlink'
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 1 add symlink
+ 0 move symlink
+ $ svnupanddisplay a-hg-wc 1
+ 8 1 test d1
+ 8 1 test d1/d2
+ 8 1 test d1/d2/b
+ 8 6 test c
+ 8 8 test .
+ 8 8 test newlink
+ revision: 8
+ author: test
+ msg: move symlink
+ D /link
+ A /newlink (from /link@7)
+
+#endif
+
+ $ rm -rf a a-hg a-hg-wc
+
+
+Executable in new directory
+
+ $ hg init a
+
+ $ mkdir a/d1
+ $ echo a > a/d1/a
+#if execbit
+ $ chmod +x a/d1/a
+#else
+ $ echo fake >> a/d1/a
+#endif
+ $ hg --cwd a ci -d '0 0' -A -m 'add executable file in new directory'
+ adding d1/a
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn repository 'a-hg'
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 add executable file in new directory
+ $ svnupanddisplay a-hg-wc 1
+ 1 1 test .
+ 1 1 test d1
+ 1 1 test d1/a (glob)
+ revision: 1
+ author: test
+ msg: add executable file in new directory
+ A /d1
+ A /d1/a
+#if execbit
+ $ test -x a-hg-wc/d1/a
+#endif
+
+Copy to new directory
+
+ $ mkdir a/d2
+ $ hg --cwd a cp d1/a d2/a
+ $ hg --cwd a ci -d '1 0' -A -m 'copy file to new directory'
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 0 copy file to new directory
+ $ svnupanddisplay a-hg-wc 1
+ 2 1 test d1
+ 2 1 test d1/a (glob)
+ 2 2 test .
+ 2 2 test d2
+ 2 2 test d2/a (glob)
+ revision: 2
+ author: test
+ msg: copy file to new directory
+ A /d2
+ A /d2/a (from /d1/a@1)
+
+Branchy history
+
+ $ hg init b
+ $ echo base > b/b
+ $ hg --cwd b ci -d '0 0' -Ambase
+ adding b
+
+ $ "$TESTDIR/svn-safe-append.py" left-1 b/b
+ $ echo left-1 > b/left-1
+ $ hg --cwd b ci -d '1 0' -Amleft-1
+ adding left-1
+
+ $ "$TESTDIR/svn-safe-append.py" left-2 b/b
+ $ echo left-2 > b/left-2
+ $ hg --cwd b ci -d '2 0' -Amleft-2
+ adding left-2
+
+ $ hg --cwd b up 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ "$TESTDIR/svn-safe-append.py" right-1 b/b
+ $ echo right-1 > b/right-1
+ $ hg --cwd b ci -d '3 0' -Amright-1
+ adding right-1
+ created new head
+
+ $ "$TESTDIR/svn-safe-append.py" right-2 b/b
+ $ echo right-2 > b/right-2
+ $ hg --cwd b ci -d '4 0' -Amright-2
+ adding right-2
+
+ $ hg --cwd b up -C 2
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg --cwd b merge
+ merging b
+ warning: conflicts during merge.
+ merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 2 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ hg --cwd b revert -r 2 b
+ $ hg --cwd b resolve -m b
+ $ hg --cwd b ci -d '5 0' -m 'merge'
+
+Expect 4 changes
+
+ $ hg convert -d svn b
+ assuming destination b-hg
+ initializing svn repository 'b-hg'
+ initializing svn working copy 'b-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 5 base
+ 4 left-1
+ 3 left-2
+ 2 right-1
+ 1 right-2
+ 0 merge
+
+ $ svnupanddisplay b-hg-wc 0
+ 4 2 test left-1
+ 4 3 test b
+ 4 3 test left-2
+ 4 4 test .
+ 4 4 test right-1
+ 4 4 test right-2
+ revision: 4
+ author: test
+ msg: merge
+ A /right-1
+ A /right-2
+ revision: 3
+ author: test
+ msg: left-2
+ M /b
+ A /left-2
+ revision: 2
+ author: test
+ msg: left-1
+ M /b
+ A /left-1
+ revision: 1
+ author: test
+ msg: base
+ A /b
+
+Tags are not supported, but must not break conversion
+
+ $ rm -rf a a-hg a-hg-wc
+ $ hg init a
+ $ echo a > a/a
+ $ hg --cwd a ci -d '0 0' -A -m 'Add file a'
+ adding a
+ $ hg --cwd a tag -d '1 0' -m 'Tagged as v1.0' v1.0
+
+ $ hg convert -d svn a
+ assuming destination a-hg
+ initializing svn repository 'a-hg'
+ initializing svn working copy 'a-hg-wc'
+ scanning source...
+ sorting...
+ converting...
+ 1 Add file a
+ 0 Tagged as v1.0
+ writing Subversion tags is not yet implemented
+ $ svnupanddisplay a-hg-wc 2
+ 2 1 test a
+ 2 2 test .
+ 2 2 test .hgtags
+ revision: 2
+ author: test
+ msg: Tagged as v1.0
+ A /.hgtags
+ revision: 1
+ author: test
+ msg: Add file a
+ A /a
+ $ rm -rf a a-hg a-hg-wc
diff --git a/tests/test-convert-svn-source.t b/tests/test-convert-svn-source.t
new file mode 100644
index 0000000..544f3a5
--- /dev/null
+++ b/tests/test-convert-svn-source.t
@@ -0,0 +1,203 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > [convert]
+ > svn.trunk = mytrunk
+ > EOF
+
+ $ svnadmin create svn-repo
+ $ SVNREPOPATH=`pwd`/svn-repo
+#if windows
+ $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#else
+ $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#endif
+
+Now test that it works with trunk/tags layout, but no branches yet.
+
+Initial svn import
+
+ $ mkdir projB
+ $ cd projB
+ $ mkdir mytrunk
+ $ mkdir tags
+ $ cd ..
+
+ $ svn import -m "init projB" projB "$SVNREPOURL/proj%20B" | sort
+
+ Adding projB/mytrunk (glob)
+ Adding projB/tags (glob)
+ Committed revision 1.
+
+Update svn repository
+
+ $ svn co "$SVNREPOURL/proj%20B/mytrunk" B
+ Checked out revision 1.
+ $ cd B
+ $ echo hello > 'letter .txt'
+ $ svn add 'letter .txt'
+ A letter .txt
+ $ svn ci -m hello
+ Adding letter .txt
+ Transmitting file data .
+ Committed revision 2.
+
+ $ "$TESTDIR/svn-safe-append.py" world 'letter .txt'
+ $ svn ci -m world
+ Sending letter .txt
+ Transmitting file data .
+ Committed revision 3.
+
+ $ svn copy -m "tag v0.1" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.1"
+
+ Committed revision 4.
+
+ $ "$TESTDIR/svn-safe-append.py" 'nice day today!' 'letter .txt'
+ $ svn ci -m "nice day"
+ Sending letter .txt
+ Transmitting file data .
+ Committed revision 5.
+ $ cd ..
+
+Convert to hg once
+
+ $ hg convert "$SVNREPOURL/proj%20B" B-hg
+ initializing destination B-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 3 init projB
+ 2 hello
+ 1 world
+ 0 nice day
+ updating tags
+
+Update svn repository again
+
+ $ cd B
+ $ "$TESTDIR/svn-safe-append.py" "see second letter" 'letter .txt'
+ $ echo "nice to meet you" > letter2.txt
+ $ svn add letter2.txt
+ A letter2.txt
+ $ svn ci -m "second letter"
+ Sending letter .txt
+ Adding letter2.txt
+ Transmitting file data ..
+ Committed revision 6.
+
+ $ svn copy -m "tag v0.2" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.2"
+
+ Committed revision 7.
+
+ $ "$TESTDIR/svn-safe-append.py" "blah-blah-blah" letter2.txt
+ $ svn ci -m "work in progress"
+ Sending letter2.txt
+ Transmitting file data .
+ Committed revision 8.
+ $ cd ..
+
+ $ hg convert -s svn "$SVNREPOURL/proj%20B/non-existent-path" dest
+ initializing destination dest repository
+ abort: no revision found in module /proj B/non-existent-path
+ [255]
+
+########################################
+
+Test incremental conversion
+
+ $ hg convert "$SVNREPOURL/proj%20B" B-hg
+ scanning source...
+ sorting...
+ converting...
+ 1 second letter
+ 0 work in progress
+ updating tags
+
+ $ cd B-hg
+ $ hg glog --template '{rev} {desc|firstline} files: {files}\n'
+ o 7 update tags files: .hgtags
+ |
+ o 6 work in progress files: letter2.txt
+ |
+ o 5 second letter files: letter .txt letter2.txt
+ |
+ o 4 update tags files: .hgtags
+ |
+ o 3 nice day files: letter .txt
+ |
+ o 2 world files: letter .txt
+ |
+ o 1 hello files: letter .txt
+ |
+ o 0 init projB files:
+
+ $ hg tags -q
+ tip
+ v0.2
+ v0.1
+ $ cd ..
+
+Test filemap
+ $ echo 'include letter2.txt' > filemap
+ $ hg convert --filemap filemap "$SVNREPOURL/proj%20B/mytrunk" fmap
+ initializing destination fmap repository
+ scanning source...
+ sorting...
+ converting...
+ 5 init projB
+ 4 hello
+ 3 world
+ 2 nice day
+ 1 second letter
+ 0 work in progress
+ $ hg -R fmap branch -q
+ default
+ $ hg glog -R fmap --template '{rev} {desc|firstline} files: {files}\n'
+ o 1 work in progress files: letter2.txt
+ |
+ o 0 second letter files: letter2.txt
+
+
+Test stop revision
+ $ hg convert --rev 1 "$SVNREPOURL/proj%20B/mytrunk" stoprev
+ initializing destination stoprev repository
+ scanning source...
+ sorting...
+ converting...
+ 0 init projB
+ $ hg -R stoprev branch -q
+ default
+
+Check convert_revision extra-records.
+This is also the only place testing more than one extra field in a revision.
+
+ $ cd stoprev
+ $ hg tip --debug | grep extra
+ extra: branch=default
+ extra: convert_revision=svn:........-....-....-....-............/proj B/mytrunk@1 (re)
+ $ cd ..
+
+Test converting empty heads (issue3347)
+
+ $ svnadmin create svn-empty
+ $ svnadmin load -q svn-empty < "$TESTDIR/svn/empty.svndump"
+ $ hg --config convert.svn.trunk= convert svn-empty
+ assuming destination svn-empty-hg
+ initializing destination svn-empty-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 init projA
+ 0 adddir
+ $ hg --config convert.svn.trunk= convert "$SVNREPOURL/../svn-empty/trunk"
+ assuming destination trunk-hg
+ initializing destination trunk-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 init projA
+ 0 adddir
diff --git a/tests/test-convert-svn-startrev.t b/tests/test-convert-svn-startrev.t
new file mode 100644
index 0000000..3ce1f55
--- /dev/null
+++ b/tests/test-convert-svn-startrev.t
@@ -0,0 +1,90 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+ $ convert()
+ > {
+ > startrev=$1
+ > repopath=A-r$startrev-hg
+ > hg convert --config convert.svn.startrev=$startrev \
+ > --config convert.svn.trunk=branches/branch1 \
+ > --config convert.svn.branches=" " \
+ > --config convert.svn.tags= \
+ > --datesort svn-repo $repopath
+ > hg -R $repopath glog \
+ > --template '{rev} {desc|firstline} files: {files}\n'
+ > echo
+ > }
+
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/startrev.svndump"
+
+Convert before branching point
+
+ $ convert 3
+ initializing destination A-r3-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 3 removeb
+ 2 changeaa
+ 1 branch, changeaaa
+ 0 addc,changeaaaa
+ o 3 addc,changeaaaa files: a c
+ |
+ o 2 branch, changeaaa files: a
+ |
+ o 1 changeaa files: a
+ |
+ o 0 removeb files: a
+
+
+
+Convert before branching point
+
+ $ convert 4
+ initializing destination A-r4-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 2 changeaa
+ 1 branch, changeaaa
+ 0 addc,changeaaaa
+ o 2 addc,changeaaaa files: a c
+ |
+ o 1 branch, changeaaa files: a
+ |
+ o 0 changeaa files: a
+
+
+
+Convert at branching point
+
+ $ convert 5
+ initializing destination A-r5-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 1 branch, changeaaa
+ 0 addc,changeaaaa
+ o 1 addc,changeaaaa files: a c
+ |
+ o 0 branch, changeaaa files: a
+
+
+
+Convert last revision only
+
+ $ convert 6
+ initializing destination A-r6-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 0 addc,changeaaaa
+ o 0 addc,changeaaaa files: a c
+
+
diff --git a/tests/test-convert-svn-tags.t b/tests/test-convert-svn-tags.t
new file mode 100644
index 0000000..2f93e0e
--- /dev/null
+++ b/tests/test-convert-svn-tags.t
@@ -0,0 +1,67 @@
+
+ $ "$TESTDIR/hghave" svn svn-bindings || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert =
+ > graphlog =
+ > EOF
+
+ $ svnadmin create svn-repo
+ $ svnadmin load -q svn-repo < "$TESTDIR/svn/tags.svndump"
+
+Convert
+ $ hg convert --datesort svn-repo A-hg
+ initializing destination A-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 5 init projA
+ 4 adda
+ 3 changea
+ 2 changea2
+ 1 changea3
+ 0 changea
+ updating tags
+
+ $ cd A-hg
+ $ hg glog --template '{rev} {desc|firstline} tags: {tags}\n'
+ o 6 update tags tags: tip
+ |
+ o 5 changea tags: trunk.goodtag
+ |
+ o 4 changea3 tags:
+ |
+ o 3 changea2 tags: trunk.v1
+ |
+ o 2 changea tags:
+ |
+ o 1 adda tags:
+ |
+ o 0 init projA tags:
+
+
+ $ hg tags -q
+ tip
+ trunk.goodtag
+ trunk.v1
+
+ $ cd ..
+
+Convert without tags
+
+ $ hg convert --datesort --config convert.svn.tags= svn-repo A-notags-hg
+ initializing destination A-notags-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 5 init projA
+ 4 adda
+ 3 changea
+ 2 changea2
+ 1 changea3
+ 0 changea
+
+ $ hg -R A-notags-hg tags -q
+ tip
+
diff --git a/tests/test-convert-tagsbranch-topology.t b/tests/test-convert-tagsbranch-topology.t
new file mode 100644
index 0000000..0af7e79
--- /dev/null
+++ b/tests/test-convert-tagsbranch-topology.t
@@ -0,0 +1,90 @@
+
+ $ "$TESTDIR/hghave" git || exit 80
+ $ echo "[core]" >> $HOME/.gitconfig
+ $ echo "autocrlf = false" >> $HOME/.gitconfig
+ $ echo "[core]" >> $HOME/.gitconfig
+ $ echo "autocrlf = false" >> $HOME/.gitconfig
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'hgext.graphlog =' >> $HGRCPATH
+ $ echo '[convert]' >> $HGRCPATH
+ $ echo 'hg.usebranchnames = True' >> $HGRCPATH
+ $ echo 'hg.tagsbranch = tags-update' >> $HGRCPATH
+ $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
+ $ GIT_AUTHOR_EMAIL='test@example.org'; export GIT_AUTHOR_EMAIL
+ $ GIT_AUTHOR_DATE="2007-01-01 00:00:00 +0000"; export GIT_AUTHOR_DATE
+ $ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
+ $ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
+ $ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
+ $ count=10
+ $ action()
+ > {
+ > GIT_AUTHOR_DATE="2007-01-01 00:00:$count +0000"
+ > GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"
+ > git "$@" >/dev/null 2>/dev/null || echo "git command error"
+ > count=`expr $count + 1`
+ > }
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc|firstline}" files: {files}\n' "$@"
+ > }
+ $ convertrepo()
+ > {
+ > hg convert --datesort git-repo hg-repo
+ > }
+
+Build a GIT repo with at least 1 tag
+
+ $ mkdir git-repo
+ $ cd git-repo
+ $ git init >/dev/null 2>&1
+ $ echo a > a
+ $ git add a
+ $ action commit -m "rev1"
+ $ action tag -m "tag1" tag1
+ $ cd ..
+
+Do a first conversion
+
+ $ convertrepo
+ initializing destination hg-repo repository
+ scanning source...
+ sorting...
+ converting...
+ 0 rev1
+ updating tags
+ updating bookmarks
+
+Simulate upstream updates after first conversion
+
+ $ cd git-repo
+ $ echo b > a
+ $ git add a
+ $ action commit -m "rev2"
+ $ action tag -m "tag2" tag2
+ $ cd ..
+
+Perform an incremental conversion
+
+ $ convertrepo
+ scanning source...
+ sorting...
+ converting...
+ 0 rev2
+ updating tags
+ updating bookmarks
+
+Print the log
+
+ $ cd hg-repo
+ $ glog
+ o 3 "update tags" files: .hgtags
+ |
+ | o 2 "rev2" files: a
+ | |
+ o | 1 "update tags" files: .hgtags
+ /
+ o 0 "rev1" files: a
+
+
+ $ cd ..
diff --git a/tests/test-convert-tla.t b/tests/test-convert-tla.t
new file mode 100644
index 0000000..8437e57
--- /dev/null
+++ b/tests/test-convert-tla.t
@@ -0,0 +1,135 @@
+
+ $ "$TESTDIR/hghave" tla symlink || exit 80
+ $ tla my-id "mercurial <mercurial@selenic.com>"
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "convert=" >> $HGRCPATH
+ $ echo 'graphlog =' >> $HGRCPATH
+
+create tla archive
+
+ $ tla make-archive tla@mercurial--convert `pwd`/hg-test-convert-tla
+
+initialize tla repo
+
+ $ mkdir tla-repo
+ $ cd tla-repo/
+ $ tla init-tree tla@mercurial--convert/tla--test--0
+ $ tla import
+ * creating version tla@mercurial--convert/tla--test--0
+ * imported tla@mercurial--convert/tla--test--0
+
+create initial files
+
+ $ echo 'this is a file' > a
+ $ tla add a
+ $ mkdir src
+ $ tla add src
+ $ cd src
+ $ dd count=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+ $ tla add b
+ $ tla commit -s "added a file, src and src/b (binary)"
+ A/ .arch-ids
+ A/ src
+ A/ src/.arch-ids
+ A .arch-ids/a.id
+ A a
+ A src/.arch-ids/=id
+ A src/.arch-ids/b.id
+ A src/b
+ * update pristine tree (tla@mercurial--convert/tla--test--0--base-0 => tla--test--0--patch-1)
+ * committed tla@mercurial--convert/tla--test--0--patch-1
+
+create link file and modify a
+
+ $ ln -s ../a a-link
+ $ tla add a-link
+ $ echo 'this a modification to a' >> ../a
+ $ tla commit -s "added link to a and modify a"
+ A src/.arch-ids/a-link.id
+ A src/a-link
+ M a
+ * update pristine tree (tla@mercurial--convert/tla--test--0--patch-1 => tla--test--0--patch-2)
+ * committed tla@mercurial--convert/tla--test--0--patch-2
+
+create second link and modify b
+
+ $ ln -s ../a a-link-2
+ $ tla add a-link-2
+ $ dd count=1 seek=1 if=/dev/zero of=b > /dev/null 2> /dev/null
+ $ tla commit -s "added second link and modify b"
+ A src/.arch-ids/a-link-2.id
+ A src/a-link-2
+ Mb src/b
+ * update pristine tree (tla@mercurial--convert/tla--test--0--patch-2 => tla--test--0--patch-3)
+ * committed tla@mercurial--convert/tla--test--0--patch-3
+
+b file to link and a-link-2 to regular file
+
+ $ rm -f a-link-2
+ $ echo 'this is now a regular file' > a-link-2
+ $ ln -sf ../a b
+ $ tla commit -s "file to link and link to file test"
+ fl src/b
+ lf src/a-link-2
+ * update pristine tree (tla@mercurial--convert/tla--test--0--patch-3 => tla--test--0--patch-4)
+ * committed tla@mercurial--convert/tla--test--0--patch-4
+
+move a-link-2 file and src directory
+
+ $ cd ..
+ $ tla mv src/a-link-2 c
+ $ tla mv src test
+ $ tla commit -s "move and rename a-link-2 file and src directory"
+ D/ src/.arch-ids
+ A/ test/.arch-ids
+ /> src test
+ => src/.arch-ids/a-link-2.id .arch-ids/c.id
+ => src/a-link-2 c
+ => src/.arch-ids/=id test/.arch-ids/=id
+ => src/.arch-ids/a-link.id test/.arch-ids/a-link.id
+ => src/.arch-ids/b.id test/.arch-ids/b.id
+ * update pristine tree (tla@mercurial--convert/tla--test--0--patch-4 => tla--test--0--patch-5)
+ * committed tla@mercurial--convert/tla--test--0--patch-5
+ $ cd ..
+
+converting tla repo to Mercurial
+
+ $ hg convert tla-repo tla-repo-hg
+ initializing destination tla-repo-hg repository
+ analyzing tree version tla@mercurial--convert/tla--test--0...
+ scanning source...
+ sorting...
+ converting...
+ 5 initial import
+ 4 added a file, src and src/b (binary)
+ 3 added link to a and modify a
+ 2 added second link and modify b
+ 1 file to link and link to file test
+ 0 move and rename a-link-2 file and src directory
+ $ tla register-archive -d tla@mercurial--convert
+ $ glog()
+ > {
+ > hg glog --template '{rev} "{desc|firstline}" files: {files}\n' "$@"
+ > }
+
+show graph log
+
+ $ glog -R tla-repo-hg
+ o 5 "move and rename a-link-2 file and src directory" files: c src/a-link src/a-link-2 src/b test/a-link test/b
+ |
+ o 4 "file to link and link to file test" files: src/a-link-2 src/b
+ |
+ o 3 "added second link and modify b" files: src/a-link-2 src/b
+ |
+ o 2 "added link to a and modify a" files: a src/a-link
+ |
+ o 1 "added a file, src and src/b (binary)" files: a src/b
+ |
+ o 0 "initial import" files:
+
+ $ hg up -q -R tla-repo-hg
+ $ hg -R tla-repo-hg manifest --debug
+ c4072c4b72e1cabace081888efa148ee80ca3cbb 644 a
+ 0201ac32a3a8e86e303dff60366382a54b48a72e 644 c
+ c0067ba5ff0b7c9a3eb17270839d04614c435623 644 @ test/a-link
+ 375f4263d86feacdea7e3c27100abd1560f2a973 644 @ test/b
diff --git a/tests/test-convert.t b/tests/test-convert.t
new file mode 100644
index 0000000..26a7441
--- /dev/null
+++ b/tests/test-convert.t
@@ -0,0 +1,447 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > convert=
+ > [convert]
+ > hg.saverev=False
+ > EOF
+ $ hg help convert
+ hg convert [OPTION]... SOURCE [DEST [REVMAP]]
+
+ convert a foreign SCM repository to a Mercurial one.
+
+ Accepted source formats [identifiers]:
+
+ - Mercurial [hg]
+ - CVS [cvs]
+ - Darcs [darcs]
+ - git [git]
+ - Subversion [svn]
+ - Monotone [mtn]
+ - GNU Arch [gnuarch]
+ - Bazaar [bzr]
+ - Perforce [p4]
+
+ Accepted destination formats [identifiers]:
+
+ - Mercurial [hg]
+ - Subversion [svn] (history on branches is not preserved)
+
+ If no revision is given, all revisions will be converted. Otherwise,
+ convert will only import up to the named revision (given in a format
+ understood by the source).
+
+ If no destination directory name is specified, it defaults to the basename
+ of the source with "-hg" appended. If the destination repository doesn't
+ exist, it will be created.
+
+ By default, all sources except Mercurial will use --branchsort. Mercurial
+ uses --sourcesort to preserve original revision numbers order. Sort modes
+ have the following effects:
+
+ --branchsort convert from parent to child revision when possible, which
+ means branches are usually converted one after the other.
+ It generates more compact repositories.
+ --datesort sort revisions by date. Converted repositories have good-
+ looking changelogs but are often an order of magnitude
+ larger than the same ones generated by --branchsort.
+ --sourcesort try to preserve source revisions order, only supported by
+ Mercurial sources.
+
+ If "REVMAP" isn't given, it will be put in a default location
+ ("<dest>/.hg/shamap" by default). The "REVMAP" is a simple text file that
+ maps each source commit ID to the destination ID for that revision, like
+ so:
+
+ <source ID> <destination ID>
+
+ If the file doesn't exist, it's automatically created. It's updated on
+ each commit copied, so "hg convert" can be interrupted and can be run
+ repeatedly to copy new commits.
+
+ The authormap is a simple text file that maps each source commit author to
+ a destination commit author. It is handy for source SCMs that use unix
+ logins to identify authors (eg: CVS). One line per author mapping and the
+ line format is:
+
+ source author = destination author
+
+ Empty lines and lines starting with a "#" are ignored.
+
+ The filemap is a file that allows filtering and remapping of files and
+ directories. Each line can contain one of the following directives:
+
+ include path/to/file-or-dir
+
+ exclude path/to/file-or-dir
+
+ rename path/to/source path/to/destination
+
+ Comment lines start with "#". A specified path matches if it equals the
+ full relative name of a file or one of its parent directories. The
+ "include" or "exclude" directive with the longest matching path applies,
+ so line order does not matter.
+
+ The "include" directive causes a file, or all files under a directory, to
+ be included in the destination repository, and the exclusion of all other
+ files and directories not explicitly included. The "exclude" directive
+ causes files or directories to be omitted. The "rename" directive renames
+ a file or directory if it is converted. To rename from a subdirectory into
+ the root of the repository, use "." as the path to rename to.
+
+ The splicemap is a file that allows insertion of synthetic history,
+ letting you specify the parents of a revision. This is useful if you want
+ to e.g. give a Subversion merge two parents, or graft two disconnected
+ series of history together. Each entry contains a key, followed by a
+ space, followed by one or two comma-separated values:
+
+ key parent1, parent2
+
+ The key is the revision ID in the source revision control system whose
+ parents should be modified (same format as a key in .hg/shamap). The
+ values are the revision IDs (in either the source or destination revision
+ control system) that should be used as the new parents for that node. For
+ example, if you have merged "release-1.0" into "trunk", then you should
+ specify the revision on "trunk" as the first parent and the one on the
+ "release-1.0" branch as the second.
+
+ The branchmap is a file that allows you to rename a branch when it is
+ being brought in from whatever external repository. When used in
+ conjunction with a splicemap, it allows for a powerful combination to help
+ fix even the most badly mismanaged repositories and turn them into nicely
+ structured Mercurial repositories. The branchmap contains lines of the
+ form:
+
+ original_branch_name new_branch_name
+
+ where "original_branch_name" is the name of the branch in the source
+ repository, and "new_branch_name" is the name of the branch is the
+ destination repository. No whitespace is allowed in the branch names. This
+ can be used to (for instance) move code in one repository from "default"
+ to a named branch.
+
+ Mercurial Source
+ ################
+
+ The Mercurial source recognizes the following configuration options, which
+ you can set on the command line with "--config":
+
+ convert.hg.ignoreerrors
+ ignore integrity errors when reading. Use it to fix
+ Mercurial repositories with missing revlogs, by converting
+ from and to Mercurial. Default is False.
+ convert.hg.saverev
+ store original revision ID in changeset (forces target IDs
+ to change). It takes a boolean argument and defaults to
+ False.
+ convert.hg.startrev
+ convert start revision and its descendants. It takes a hg
+ revision identifier and defaults to 0.
+
+ CVS Source
+ ##########
+
+ CVS source will use a sandbox (i.e. a checked-out copy) from CVS to
+ indicate the starting point of what will be converted. Direct access to
+ the repository files is not needed, unless of course the repository is
+ ":local:". The conversion uses the top level directory in the sandbox to
+ find the CVS repository, and then uses CVS rlog commands to find files to
+ convert. This means that unless a filemap is given, all files under the
+ starting directory will be converted, and that any directory
+ reorganization in the CVS sandbox is ignored.
+
+ The following options can be used with "--config":
+
+ convert.cvsps.cache
+ Set to False to disable remote log caching, for testing and
+ debugging purposes. Default is True.
+ convert.cvsps.fuzz
+ Specify the maximum time (in seconds) that is allowed
+ between commits with identical user and log message in a
+ single changeset. When very large files were checked in as
+ part of a changeset then the default may not be long enough.
+ The default is 60.
+ convert.cvsps.mergeto
+ Specify a regular expression to which commit log messages
+ are matched. If a match occurs, then the conversion process
+ will insert a dummy revision merging the branch on which
+ this log message occurs to the branch indicated in the
+ regex. Default is "{{mergetobranch ([-\w]+)}}"
+ convert.cvsps.mergefrom
+ Specify a regular expression to which commit log messages
+ are matched. If a match occurs, then the conversion process
+ will add the most recent revision on the branch indicated in
+ the regex as the second parent of the changeset. Default is
+ "{{mergefrombranch ([-\w]+)}}"
+ hook.cvslog Specify a Python function to be called at the end of
+ gathering the CVS log. The function is passed a list with
+ the log entries, and can modify the entries in-place, or add
+ or delete them.
+ hook.cvschangesets
+ Specify a Python function to be called after the changesets
+ are calculated from the CVS log. The function is passed a
+ list with the changeset entries, and can modify the
+ changesets in-place, or add or delete them.
+
+ An additional "debugcvsps" Mercurial command allows the builtin changeset
+ merging code to be run without doing a conversion. Its parameters and
+ output are similar to that of cvsps 2.1. Please see the command help for
+ more details.
+
+ Subversion Source
+ #################
+
+ Subversion source detects classical trunk/branches/tags layouts. By
+ default, the supplied "svn://repo/path/" source URL is converted as a
+ single branch. If "svn://repo/path/trunk" exists it replaces the default
+ branch. If "svn://repo/path/branches" exists, its subdirectories are
+ listed as possible branches. If "svn://repo/path/tags" exists, it is
+ looked for tags referencing converted branches. Default "trunk",
+ "branches" and "tags" values can be overridden with following options. Set
+ them to paths relative to the source URL, or leave them blank to disable
+ auto detection.
+
+ The following options can be set with "--config":
+
+ convert.svn.branches
+ specify the directory containing branches. The default is
+ "branches".
+ convert.svn.tags
+ specify the directory containing tags. The default is
+ "tags".
+ convert.svn.trunk
+ specify the name of the trunk branch. The default is
+ "trunk".
+
+ Source history can be retrieved starting at a specific revision, instead
+ of being integrally converted. Only single branch conversions are
+ supported.
+
+ convert.svn.startrev
+ specify start Subversion revision number. The default is 0.
+
+ Perforce Source
+ ###############
+
+ The Perforce (P4) importer can be given a p4 depot path or a client
+ specification as source. It will convert all files in the source to a flat
+ Mercurial repository, ignoring labels, branches and integrations. Note
+ that when a depot path is given you then usually should specify a target
+ directory, because otherwise the target may be named "...-hg".
+
+ It is possible to limit the amount of source history to be converted by
+ specifying an initial Perforce revision:
+
+ convert.p4.startrev
+ specify initial Perforce revision (a Perforce changelist
+ number).
+
+ Mercurial Destination
+ #####################
+
+ The following options are supported:
+
+ convert.hg.clonebranches
+ dispatch source branches in separate clones. The default is
+ False.
+ convert.hg.tagsbranch
+ branch name for tag revisions, defaults to "default".
+ convert.hg.usebranchnames
+ preserve branch names. The default is True.
+
+ options:
+
+ -s --source-type TYPE source repository type
+ -d --dest-type TYPE destination repository type
+ -r --rev REV import up to target revision REV
+ -A --authormap FILE remap usernames using this file
+ --filemap FILE remap file names using contents of file
+ --splicemap FILE splice synthesized history into place
+ --branchmap FILE change branch names while converting
+ --branchsort try to sort changesets by branches
+ --datesort try to sort changesets by date
+ --sourcesort preserve source changesets order
+
+ use "hg -v help convert" to show more info
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -d'0 0' -Ama
+ adding a
+ $ hg cp a b
+ $ hg ci -d'1 0' -mb
+ $ hg rm a
+ $ hg ci -d'2 0' -mc
+ $ hg mv b a
+ $ hg ci -d'3 0' -md
+ $ echo a >> a
+ $ hg ci -d'4 0' -me
+ $ cd ..
+ $ hg convert a 2>&1 | grep -v 'subversion python bindings could not be loaded'
+ assuming destination a-hg
+ initializing destination a-hg repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+ $ hg --cwd a-hg pull ../a
+ pulling from ../a
+ searching for changes
+ no changes found
+
+conversion to existing file should fail
+
+ $ touch bogusfile
+ $ hg convert a bogusfile
+ initializing destination bogusfile repository
+ abort: cannot create new bundle repository
+ [255]
+
+#if unix-permissions
+
+conversion to dir without permissions should fail
+
+ $ mkdir bogusdir
+ $ chmod 000 bogusdir
+
+ $ hg convert a bogusdir
+ abort: Permission denied: bogusdir
+ [255]
+
+user permissions should succeed
+
+ $ chmod 700 bogusdir
+ $ hg convert a bogusdir
+ initializing destination bogusdir repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+
+#endif
+
+test pre and post conversion actions
+
+ $ echo 'include b' > filemap
+ $ hg convert --debug --filemap filemap a partialb | \
+ > grep 'run hg'
+ run hg source pre-conversion action
+ run hg sink pre-conversion action
+ run hg sink post-conversion action
+ run hg source post-conversion action
+
+converting empty dir should fail "nicely
+
+ $ mkdir emptydir
+
+override $PATH to ensure p4 not visible; use $PYTHON in case we're
+running from a devel copy, not a temp installation
+
+ $ PATH="$BINDIR" $PYTHON "$BINDIR"/hg convert emptydir
+ assuming destination emptydir-hg
+ initializing destination emptydir-hg repository
+ emptydir does not look like a CVS checkout
+ emptydir does not look like a Git repository
+ emptydir does not look like a Subversion repository
+ emptydir is not a local Mercurial repository
+ emptydir does not look like a darcs repository
+ emptydir does not look like a monotone repository
+ emptydir does not look like a GNU Arch repository
+ emptydir does not look like a Bazaar repository
+ cannot find required "p4" tool
+ abort: emptydir: missing or unsupported repository
+ [255]
+
+convert with imaginary source type
+
+ $ hg convert --source-type foo a a-foo
+ initializing destination a-foo repository
+ abort: foo: invalid source repository type
+ [255]
+
+convert with imaginary sink type
+
+ $ hg convert --dest-type foo a a-foo
+ abort: foo: invalid destination repository type
+ [255]
+
+testing: convert must not produce duplicate entries in fncache
+
+ $ hg convert a b
+ initializing destination b repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+
+contents of fncache file:
+
+ $ cat b/.hg/store/fncache | sort
+ data/a.i
+ data/b.i
+
+test bogus URL
+
+ $ hg convert -q bzr+ssh://foobar@selenic.com/baz baz
+ abort: bzr+ssh://foobar@selenic.com/baz: missing or unsupported repository
+ [255]
+
+test revset converted() lookup
+
+ $ hg --config convert.hg.saverev=True convert a c
+ initializing destination c repository
+ scanning source...
+ sorting...
+ converting...
+ 4 a
+ 3 b
+ 2 c
+ 1 d
+ 0 e
+ $ echo f > c/f
+ $ hg -R c ci -d'0 0' -Amf
+ adding f
+ created new head
+ $ hg -R c log -r "converted(09d945a62ce6)"
+ changeset: 1:98c3dd46a874
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b
+
+ $ hg -R c log -r "converted()"
+ changeset: 0:31ed57b2037c
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ changeset: 1:98c3dd46a874
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b
+
+ changeset: 2:3b9ca06ef716
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: c
+
+ changeset: 3:4e0debd37cf2
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: d
+
+ changeset: 4:9de3bc9349c5
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: e
+
diff --git a/tests/test-copy-move-merge.t b/tests/test-copy-move-merge.t
new file mode 100644
index 0000000..cc64b4c
--- /dev/null
+++ b/tests/test-copy-move-merge.t
@@ -0,0 +1,64 @@
+ $ hg init t
+ $ cd t
+
+ $ echo 1 > a
+ $ hg ci -qAm "first"
+
+ $ hg cp a b
+ $ hg mv a c
+ $ echo 2 >> b
+ $ echo 2 >> c
+
+ $ hg ci -qAm "second"
+
+ $ hg co -C 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ echo 0 > a
+ $ echo 1 >> a
+
+ $ hg ci -qAm "other"
+
+ $ hg merge --debug
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ c
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ c -> a *
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: b8bf91eeebbc, local: add3f11052fa+, remote: 17c05bb7fcb6
+ a: remote moved to c -> m
+ a: remote moved to b -> m
+ preserving a for resolve of b
+ preserving a for resolve of c
+ removing a
+ updating: a 1/2 files (50.00%)
+ picked tool 'internal:merge' for b (binary False symlink False)
+ merging a and b to b
+ my b@add3f11052fa+ other b@17c05bb7fcb6 ancestor a@b8bf91eeebbc
+ premerge successful
+ updating: a 2/2 files (100.00%)
+ picked tool 'internal:merge' for c (binary False symlink False)
+ merging a and c to c
+ my c@add3f11052fa+ other c@17c05bb7fcb6 ancestor a@b8bf91eeebbc
+ premerge successful
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+file b
+ $ cat b
+ 0
+ 1
+ 2
+
+file c
+ $ cat c
+ 0
+ 1
+ 2
+
+ $ cd ..
diff --git a/tests/test-copy.t b/tests/test-copy.t
new file mode 100644
index 0000000..a3cd463
--- /dev/null
+++ b/tests/test-copy.t
@@ -0,0 +1,216 @@
+
+ $ mkdir part1
+ $ cd part1
+
+ $ hg init
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m "1"
+ $ hg status
+ $ hg copy a b
+ $ hg --config ui.portablefilenames=abort copy a con.xml
+ abort: filename contains 'con', which is reserved on Windows: 'con.xml'
+ [255]
+ $ hg status
+ A b
+ $ hg sum
+ parent: 0:c19d34741b0a tip
+ 1
+ branch: default
+ commit: 1 copied
+ update: (current)
+ $ hg --debug commit -m "2"
+ b
+ b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
+ committed changeset 1:93580a2c28a50a56f63526fb305067e6fbf739c4
+
+we should see two history entries
+
+ $ hg history -v
+ changeset: 1:93580a2c28a5
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: b
+ description:
+ 2
+
+
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ 1
+
+
+
+we should see one log entry for a
+
+ $ hg log a
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+
+this should show a revision linked to changeset 0
+
+ $ hg debugindex a
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b789fdd96dc2 000000000000 000000000000 (re)
+
+we should see one log entry for b
+
+ $ hg log b
+ changeset: 1:93580a2c28a5
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+
+this should show a revision linked to changeset 1
+
+ $ hg debugindex b
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 65 ..... 1 37d9b5d994ea 000000000000 000000000000 (re)
+
+this should show the rename information in the metadata
+
+ $ hg debugdata b 0 | head -3 | tail -2
+ copy: a
+ copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
+
+ $ "$TESTDIR/md5sum.py" .hg/store/data/b.i
+ 4999f120a3b88713bbefddd195cf5133 .hg/store/data/b.i
+ $ hg cat b > bsum
+ $ "$TESTDIR/md5sum.py" bsum
+ 60b725f10c9c85c70d97880dfe8191b3 bsum
+ $ hg cat a > asum
+ $ "$TESTDIR/md5sum.py" asum
+ 60b725f10c9c85c70d97880dfe8191b3 asum
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+
+ $ cd ..
+
+
+ $ mkdir part2
+ $ cd part2
+
+ $ hg init
+ $ echo foo > foo
+should fail - foo is not managed
+ $ hg mv foo bar
+ foo: not copying - file is not managed
+ abort: no files to copy
+ [255]
+ $ hg st -A
+ ? foo
+ $ hg add foo
+dry-run; print a warning that this is not a real copy; foo is added
+ $ hg mv --dry-run foo bar
+ foo has not been committed yet, so no copy data will be stored for bar.
+ $ hg st -A
+ A foo
+should print a warning that this is not a real copy; bar is added
+ $ hg mv foo bar
+ foo has not been committed yet, so no copy data will be stored for bar.
+ $ hg st -A
+ A bar
+should print a warning that this is not a real copy; foo is added
+ $ hg cp bar foo
+ bar has not been committed yet, so no copy data will be stored for foo.
+ $ hg rm -f bar
+ $ rm bar
+ $ hg st -A
+ A foo
+ $ hg commit -m1
+
+moving a missing file
+ $ rm foo
+ $ hg mv foo foo3
+ foo: deleted in working copy
+ foo3 does not exist!
+ $ hg up -qC .
+
+copy --after to a nonexistant target filename
+ $ hg cp -A foo dummy
+ foo: not recording copy - dummy does not exist
+
+dry-run; should show that foo is clean
+ $ hg copy --dry-run foo bar
+ $ hg st -A
+ C foo
+should show copy
+ $ hg copy foo bar
+ $ hg st -C
+ A bar
+ foo
+
+shouldn't show copy
+ $ hg commit -m2
+ $ hg st -C
+
+should match
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re)
+ $ hg debugrename bar
+ bar renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+
+ $ echo bleah > foo
+ $ echo quux > bar
+ $ hg commit -m3
+
+should not be renamed
+ $ hg debugrename bar
+ bar not renamed
+
+ $ hg copy -f foo bar
+should show copy
+ $ hg st -C
+ M bar
+ foo
+ $ hg commit -m3
+
+should show no parents for tip
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 69 ..... 1 7711d36246cc 000000000000 000000000000 (re)
+ 1 69 6 ..... 2 bdf70a2b8d03 7711d36246cc 000000000000 (re)
+ 2 75 81 ..... 3 b2558327ea8d 000000000000 000000000000 (re)
+should match
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re)
+ 1 5 7 ..... 2 dd12c926cf16 2ed2a3912a0b 000000000000 (re)
+ $ hg debugrename bar
+ bar renamed from foo:dd12c926cf165e3eb4cf87b084955cb617221c17
+
+should show no copies
+ $ hg st -C
+
+copy --after on an added file
+ $ cp bar baz
+ $ hg add baz
+ $ hg cp -A bar baz
+ $ hg st -C
+ A baz
+ bar
+
+foo was clean:
+ $ hg st -AC foo
+ C foo
+but it's considered modified after a copy --after --force
+ $ hg copy -Af bar foo
+ $ hg st -AC foo
+ M foo
+ bar
+
+ $ cd ..
diff --git a/tests/test-custom-filters.t b/tests/test-custom-filters.t
new file mode 100644
index 0000000..cd4acdf
--- /dev/null
+++ b/tests/test-custom-filters.t
@@ -0,0 +1,66 @@
+ $ hg init
+
+ $ cat > .hg/hgrc <<EOF
+ > [extensions]
+ > prefixfilter = prefix.py
+ > [encode]
+ > *.txt = stripprefix: Copyright 2046, The Masters
+ > [decode]
+ > *.txt = insertprefix: Copyright 2046, The Masters
+ > EOF
+
+ $ cat > prefix.py <<EOF
+ > from mercurial import util
+ > def stripprefix(s, cmd, filename, **kwargs):
+ > header = '%s\n' % cmd
+ > if s[:len(header)] != header:
+ > raise util.Abort('missing header "%s" in %s' % (cmd, filename))
+ > return s[len(header):]
+ > def insertprefix(s, cmd):
+ > return '%s\n%s' % (cmd, s)
+ > def reposetup(ui, repo):
+ > repo.adddatafilter('stripprefix:', stripprefix)
+ > repo.adddatafilter('insertprefix:', insertprefix)
+ > EOF
+
+ $ cat > .hgignore <<EOF
+ > .hgignore
+ > prefix.py
+ > prefix.pyc
+ > EOF
+
+ $ cat > stuff.txt <<EOF
+ > Copyright 2046, The Masters
+ > Some stuff to ponder very carefully.
+ > EOF
+ $ hg add stuff.txt
+ $ hg ci -m stuff
+
+Repository data:
+
+ $ hg cat stuff.txt
+ Some stuff to ponder very carefully.
+
+Fresh checkout:
+
+ $ rm stuff.txt
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat stuff.txt
+ Copyright 2046, The Masters
+ Some stuff to ponder very carefully.
+ $ echo "Very very carefully." >> stuff.txt
+ $ hg stat
+ M stuff.txt
+
+ $ echo "Unauthorized material subject to destruction." > morestuff.txt
+
+Problem encoding:
+
+ $ hg add morestuff.txt
+ $ hg ci -m morestuff
+ abort: missing header "Copyright 2046, The Masters" in morestuff.txt
+ [255]
+ $ hg stat
+ M stuff.txt
+ A morestuff.txt
diff --git a/tests/test-debugbuilddag.t b/tests/test-debugbuilddag.t
new file mode 100644
index 0000000..e07941a
--- /dev/null
+++ b/tests/test-debugbuilddag.t
@@ -0,0 +1,350 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+plain
+
+ $ hg init
+ $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' \
+ > --config extensions.progress= --config progress.assume-tty=1 \
+ > --config progress.delay=0 --config progress.refresh=0 \
+ > --config progress.format=topic,bar,number \
+ > --config progress.width=60 2>&1 | \
+ > python "$TESTDIR/filtercr.py"
+
+ building [ ] 0/12
+ building [ ] 0/12
+ building [ ] 0/12
+ building [ ] 0/12
+ building [==> ] 1/12
+ building [==> ] 1/12
+ building [==> ] 1/12
+ building [==> ] 1/12
+ building [======> ] 2/12
+ building [======> ] 2/12
+ building [=========> ] 3/12
+ building [=========> ] 3/12
+ building [=============> ] 4/12
+ building [=============> ] 4/12
+ building [=============> ] 4/12
+ building [=============> ] 4/12
+ building [=============> ] 4/12
+ building [=============> ] 4/12
+ building [================> ] 5/12
+ building [================> ] 5/12
+ building [====================> ] 6/12
+ building [====================> ] 6/12
+ building [=======================> ] 7/12
+ building [=======================> ] 7/12
+ building [===========================> ] 8/12
+ building [===========================> ] 8/12
+ building [===========================> ] 8/12
+ building [===========================> ] 8/12
+ building [==============================> ] 9/12
+ building [==============================> ] 9/12
+ building [==================================> ] 10/12
+ building [==================================> ] 10/12
+ building [=====================================> ] 11/12
+ building [=====================================> ] 11/12
+ \r (esc)
+
+tags
+ $ cat .hg/localtags
+ 66f7d451a68b85ed82ff5fcc254daf50c74144bd f
+ bebd167eb94d257ace0e814aeb98e6972ed2970d p2
+dag
+ $ hg debugdag -t -b
+ +2:f
+ +3:p2
+ @temp*f+3
+ @default*/p2+2:tip
+tip
+ $ hg id
+ 000000000000
+glog
+ $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
+ o 11: r11 [] @ 11.00
+ |
+ o 10: r10 [] @ 10.00
+ |
+ o 9: r9 [] @ 9.00
+ |\
+ | o 8: r8 [temp] @ 8.00
+ | |
+ | o 7: r7 [temp] @ 7.00
+ | |
+ | o 6: r6 [temp] @ 6.00
+ | |
+ | o 5: r5 [temp] @ 5.00
+ | |
+ o | 4: r4 [] @ 4.00
+ | |
+ o | 3: r3 [] @ 3.00
+ | |
+ o | 2: r2 [] @ 2.00
+ |/
+ o 1: r1 [] @ 1.00
+ |
+ o 0: r0 [] @ 0.00
+
+
+overwritten files, starting on a non-default branch
+
+ $ rm -r .hg
+ $ hg init
+ $ hg debugbuilddag '@start.@default.:f +3:p2 @temp <f+4 @default /p2 +2' -q -o
+tags
+ $ cat .hg/localtags
+ f778700ebd50fcf282b23a4446bd155da6453eb6 f
+ bbccf169769006e2490efd2a02f11c3d38d462bd p2
+dag
+ $ hg debugdag -t -b
+ @start+1
+ @default+1:f
+ +3:p2
+ @temp*f+3
+ @default*/p2+2:tip
+tip
+ $ hg id
+ 000000000000
+glog
+ $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
+ o 11: r11 [] @ 11.00
+ |
+ o 10: r10 [] @ 10.00
+ |
+ o 9: r9 [] @ 9.00
+ |\
+ | o 8: r8 [temp] @ 8.00
+ | |
+ | o 7: r7 [temp] @ 7.00
+ | |
+ | o 6: r6 [temp] @ 6.00
+ | |
+ | o 5: r5 [temp] @ 5.00
+ | |
+ o | 4: r4 [] @ 4.00
+ | |
+ o | 3: r3 [] @ 3.00
+ | |
+ o | 2: r2 [] @ 2.00
+ |/
+ o 1: r1 [] @ 1.00
+ |
+ o 0: r0 [start] @ 0.00
+
+glog of
+ $ hg glog --template '{rev}: {desc} [{branches}]\n' of
+ o 11: r11 []
+ |
+ o 10: r10 []
+ |
+ o 9: r9 []
+ |\
+ | o 8: r8 [temp]
+ | |
+ | o 7: r7 [temp]
+ | |
+ | o 6: r6 [temp]
+ | |
+ | o 5: r5 [temp]
+ | |
+ o | 4: r4 []
+ | |
+ o | 3: r3 []
+ | |
+ o | 2: r2 []
+ |/
+ o 1: r1 []
+ |
+ o 0: r0 [start]
+
+tags
+ $ hg tags -v
+ tip 11:9ffe238a67a2
+ p2 4:bbccf1697690 local
+ f 1:f778700ebd50 local
+cat of
+ $ hg cat of --rev tip
+ r11
+
+
+new and mergeable files
+
+ $ rm -r .hg
+ $ hg init
+ $ hg debugbuilddag '+2:f +3:p2 @temp <f+4 @default /p2 +2' -q -mn
+dag
+ $ hg debugdag -t -b
+ +2:f
+ +3:p2
+ @temp*f+3
+ @default*/p2+2:tip
+tip
+ $ hg id
+ 000000000000
+glog
+ $ hg glog --template '{rev}: {desc} [{branches}] @ {date}\n'
+ o 11: r11 [] @ 11.00
+ |
+ o 10: r10 [] @ 10.00
+ |
+ o 9: r9 [] @ 9.00
+ |\
+ | o 8: r8 [temp] @ 8.00
+ | |
+ | o 7: r7 [temp] @ 7.00
+ | |
+ | o 6: r6 [temp] @ 6.00
+ | |
+ | o 5: r5 [temp] @ 5.00
+ | |
+ o | 4: r4 [] @ 4.00
+ | |
+ o | 3: r3 [] @ 3.00
+ | |
+ o | 2: r2 [] @ 2.00
+ |/
+ o 1: r1 [] @ 1.00
+ |
+ o 0: r0 [] @ 0.00
+
+glog mf
+ $ hg glog --template '{rev}: {desc} [{branches}]\n' mf
+ o 11: r11 []
+ |
+ o 10: r10 []
+ |
+ o 9: r9 []
+ |\
+ | o 8: r8 [temp]
+ | |
+ | o 7: r7 [temp]
+ | |
+ | o 6: r6 [temp]
+ | |
+ | o 5: r5 [temp]
+ | |
+ o | 4: r4 []
+ | |
+ o | 3: r3 []
+ | |
+ o | 2: r2 []
+ |/
+ o 1: r1 []
+ |
+ o 0: r0 []
+
+
+man r4
+ $ hg manifest -r4
+ mf
+ nf0
+ nf1
+ nf2
+ nf3
+ nf4
+cat r4 mf
+ $ hg cat -r4 mf
+ 0 r0
+ 1
+ 2 r1
+ 3
+ 4 r2
+ 5
+ 6 r3
+ 7
+ 8 r4
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+man r8
+ $ hg manifest -r8
+ mf
+ nf0
+ nf1
+ nf5
+ nf6
+ nf7
+ nf8
+cat r8 mf
+ $ hg cat -r8 mf
+ 0 r0
+ 1
+ 2 r1
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10 r5
+ 11
+ 12 r6
+ 13
+ 14 r7
+ 15
+ 16 r8
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+man
+ $ hg manifest --rev tip
+ mf
+ nf0
+ nf1
+ nf10
+ nf11
+ nf2
+ nf3
+ nf4
+ nf5
+ nf6
+ nf7
+ nf8
+ nf9
+cat mf
+ $ hg cat mf --rev tip
+ 0 r0
+ 1
+ 2 r1
+ 3
+ 4 r2
+ 5
+ 6 r3
+ 7
+ 8 r4
+ 9
+ 10 r5
+ 11
+ 12 r6
+ 13
+ 14 r7
+ 15
+ 16 r8
+ 17
+ 18 r9
+ 19
+ 20 r10
+ 21
+ 22 r11
+ 23
+
+
+
diff --git a/tests/test-debugbundle.t b/tests/test-debugbundle.t
new file mode 100644
index 0000000..4e911ea
--- /dev/null
+++ b/tests/test-debugbundle.t
@@ -0,0 +1,37 @@
+
+Create a test repository:
+
+ $ hg init repo
+ $ cd repo
+ $ touch a ; hg add a ; hg ci -ma
+ $ touch b ; hg add b ; hg ci -mb
+ $ touch c ; hg add c ; hg ci -mc
+ $ hg bundle --base 0 --rev tip bundle.hg
+ 2 changesets found
+
+Terse output:
+
+ $ hg debugbundle bundle.hg
+ 0e067c57feba1a5694ca4844f05588bb1bf82342
+ 991a3460af53952d10ec8a295d3d2cc2e5fa9690
+
+Verbose output:
+
+ $ hg debugbundle --all bundle.hg
+ format: id, p1, p2, cset, delta base, len(delta)
+
+ changelog
+ 0e067c57feba1a5694ca4844f05588bb1bf82342 3903775176ed42b1458a6281db4a0ccf4d9f287a 0000000000000000000000000000000000000000 0e067c57feba1a5694ca4844f05588bb1bf82342 3903775176ed42b1458a6281db4a0ccf4d9f287a 80
+ 991a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 0000000000000000000000000000000000000000 991a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 80
+
+ manifest
+ 686dbf0aeca417636fa26a9121c681eabbb15a20 8515d4bfda768e04af4c13a69a72e28c7effbea7 0000000000000000000000000000000000000000 0e067c57feba1a5694ca4844f05588bb1bf82342 8515d4bfda768e04af4c13a69a72e28c7effbea7 55
+ ae25a31b30b3490a981e7b96a3238cc69583fda1 686dbf0aeca417636fa26a9121c681eabbb15a20 0000000000000000000000000000000000000000 991a3460af53952d10ec8a295d3d2cc2e5fa9690 686dbf0aeca417636fa26a9121c681eabbb15a20 55
+
+ b
+ b80de5d138758541c5f05265ad144ab9fa86d1db 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0e067c57feba1a5694ca4844f05588bb1bf82342 0000000000000000000000000000000000000000 12
+
+ c
+ b80de5d138758541c5f05265ad144ab9fa86d1db 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 991a3460af53952d10ec8a295d3d2cc2e5fa9690 0000000000000000000000000000000000000000 12
+
+ $ cd ..
diff --git a/tests/test-debugcommands.t b/tests/test-debugcommands.t
new file mode 100644
index 0000000..ecd1eb1
--- /dev/null
+++ b/tests/test-debugcommands.t
@@ -0,0 +1,25 @@
+ $ hg init debugrevlog
+ $ cd debugrevlog
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg debugrevlog -m
+ format : 1
+ flags : inline
+
+ revisions : 1
+ merges : 0 ( 0.00%)
+ normal : 1 (100.00%)
+ revisions : 1
+ full : 1 (100.00%)
+ deltas : 0 ( 0.00%)
+ revision size : 44
+ full : 44 (100.00%)
+ deltas : 0 ( 0.00%)
+
+ avg chain length : 0
+ compression ratio : 0
+
+ uncompressed data size (min/max/avg) : 43 / 43 / 43
+ full revision size (min/max/avg) : 44 / 44 / 44
+ delta size (min/max/avg) : 0 / 0 / 0
diff --git a/tests/test-debugcomplete.t b/tests/test-debugcomplete.t
new file mode 100644
index 0000000..b23b23d
--- /dev/null
+++ b/tests/test-debugcomplete.t
@@ -0,0 +1,276 @@
+Show all commands except debug commands
+ $ hg debugcomplete
+ add
+ addremove
+ annotate
+ archive
+ backout
+ bisect
+ bookmarks
+ branch
+ branches
+ bundle
+ cat
+ clone
+ commit
+ copy
+ diff
+ export
+ forget
+ graft
+ grep
+ heads
+ help
+ identify
+ import
+ incoming
+ init
+ locate
+ log
+ manifest
+ merge
+ outgoing
+ parents
+ paths
+ phase
+ pull
+ push
+ recover
+ remove
+ rename
+ resolve
+ revert
+ rollback
+ root
+ serve
+ showconfig
+ status
+ summary
+ tag
+ tags
+ tip
+ unbundle
+ update
+ verify
+ version
+
+Show all commands that start with "a"
+ $ hg debugcomplete a
+ add
+ addremove
+ annotate
+ archive
+
+Do not show debug commands if there are other candidates
+ $ hg debugcomplete d
+ diff
+
+Show debug commands if there are no other candidates
+ $ hg debugcomplete debug
+ debugancestor
+ debugbuilddag
+ debugbundle
+ debugcheckstate
+ debugcommands
+ debugcomplete
+ debugconfig
+ debugdag
+ debugdata
+ debugdate
+ debugdiscovery
+ debugfileset
+ debugfsinfo
+ debuggetbundle
+ debugignore
+ debugindex
+ debugindexdot
+ debuginstall
+ debugknown
+ debugobsolete
+ debugpushkey
+ debugpvec
+ debugrebuildstate
+ debugrename
+ debugrevlog
+ debugrevspec
+ debugsetparents
+ debugstate
+ debugsub
+ debugwalk
+ debugwireargs
+
+Do not show the alias of a debug command if there are other candidates
+(this should hide rawcommit)
+ $ hg debugcomplete r
+ recover
+ remove
+ rename
+ resolve
+ revert
+ rollback
+ root
+Show the alias of a debug command if there are no other candidates
+ $ hg debugcomplete rawc
+
+
+Show the global options
+ $ hg debugcomplete --options | sort
+ --config
+ --cwd
+ --debug
+ --debugger
+ --encoding
+ --encodingmode
+ --help
+ --noninteractive
+ --profile
+ --quiet
+ --repository
+ --time
+ --traceback
+ --verbose
+ --version
+ -R
+ -h
+ -q
+ -v
+ -y
+
+Show the options for the "serve" command
+ $ hg debugcomplete --options serve | sort
+ --accesslog
+ --address
+ --certificate
+ --cmdserver
+ --config
+ --cwd
+ --daemon
+ --daemon-pipefds
+ --debug
+ --debugger
+ --encoding
+ --encodingmode
+ --errorlog
+ --help
+ --ipv6
+ --name
+ --noninteractive
+ --pid-file
+ --port
+ --prefix
+ --profile
+ --quiet
+ --repository
+ --stdio
+ --style
+ --templates
+ --time
+ --traceback
+ --verbose
+ --version
+ --web-conf
+ -6
+ -A
+ -E
+ -R
+ -a
+ -d
+ -h
+ -n
+ -p
+ -q
+ -t
+ -v
+ -y
+
+Show an error if we use --options with an ambiguous abbreviation
+ $ hg debugcomplete --options s
+ hg: command 's' is ambiguous:
+ serve showconfig status summary
+ [255]
+
+Show all commands + options
+ $ hg debugcommands
+ add: include, exclude, subrepos, dry-run
+ annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude
+ clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
+ commit: addremove, close-branch, amend, include, exclude, message, logfile, date, user, subrepos
+ diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
+ export: output, switch-parent, rev, text, git, nodates
+ forget: include, exclude
+ init: ssh, remotecmd, insecure
+ log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, hidden, patch, git, limit, no-merges, stat, graph, style, template, include, exclude
+ merge: force, rev, preview, tool
+ phase: public, draft, secret, force, rev
+ pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure
+ push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure
+ remove: after, force, include, exclude
+ serve: accesslog, daemon, daemon-pipefds, errorlog, port, address, prefix, name, web-conf, webdir-conf, pid-file, stdio, cmdserver, templates, style, ipv6, certificate
+ status: all, modified, added, removed, deleted, clean, unknown, ignored, no-status, copies, print0, rev, change, include, exclude, subrepos
+ summary: remote
+ update: clean, check, date, rev
+ addremove: similarity, include, exclude, dry-run
+ archive: no-decode, prefix, rev, type, subrepos, include, exclude
+ backout: merge, parent, rev, tool, include, exclude, message, logfile, date, user
+ bisect: reset, good, bad, skip, extend, command, noupdate
+ bookmarks: force, rev, delete, rename, inactive
+ branch: force, clean
+ branches: active, closed
+ bundle: force, rev, branch, base, all, type, ssh, remotecmd, insecure
+ cat: output, rev, decode, include, exclude
+ copy: after, force, include, exclude, dry-run
+ debugancestor:
+ debugbuilddag: mergeable-file, overwritten-file, new-file
+ debugbundle: all
+ debugcheckstate:
+ debugcommands:
+ debugcomplete: options
+ debugdag: tags, branches, dots, spaces
+ debugdata: changelog, manifest
+ debugdate: extended
+ debugdiscovery: old, nonheads, ssh, remotecmd, insecure
+ debugfileset:
+ debugfsinfo:
+ debuggetbundle: head, common, type
+ debugignore:
+ debugindex: changelog, manifest, format
+ debugindexdot:
+ debuginstall:
+ debugknown:
+ debugobsolete: date, user
+ debugpushkey:
+ debugpvec:
+ debugrebuildstate: rev
+ debugrename: rev
+ debugrevlog: changelog, manifest, dump
+ debugrevspec:
+ debugsetparents:
+ debugstate: nodates, datesort
+ debugsub: rev
+ debugwalk: include, exclude
+ debugwireargs: three, four, five, ssh, remotecmd, insecure
+ graft: rev, continue, edit, log, currentdate, currentuser, date, user, tool, dry-run
+ grep: print0, all, text, follow, ignore-case, files-with-matches, line-number, rev, user, date, include, exclude
+ heads: rev, topo, active, closed, style, template
+ help: extension, command, keyword
+ identify: rev, num, id, branch, tags, bookmarks, ssh, remotecmd, insecure
+ import: strip, base, edit, force, no-commit, bypass, exact, import-branch, message, logfile, date, user, similarity
+ incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
+ locate: rev, print0, fullpath, include, exclude
+ manifest: rev, all
+ outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
+ parents: rev, style, template
+ paths:
+ recover:
+ rename: after, force, include, exclude, dry-run
+ resolve: all, list, mark, unmark, no-status, tool, include, exclude
+ revert: all, date, rev, no-backup, include, exclude, dry-run
+ rollback: dry-run, force
+ root:
+ showconfig: untrusted
+ tag: force, local, rev, remove, edit, message, date, user
+ tags:
+ tip: patch, git, style, template
+ unbundle: update
+ verify:
+ version:
diff --git a/tests/test-debugindexdot.t b/tests/test-debugindexdot.t
new file mode 100644
index 0000000..98ee015
--- /dev/null
+++ b/tests/test-debugindexdot.t
@@ -0,0 +1,25 @@
+Just exercize debugindexdot
+Create a short file history including a merge.
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg ci -qAm t1 -d '0 0'
+ $ echo a >> a
+ $ hg ci -m t2 -d '1 0'
+ $ hg up -qC 0
+ $ echo b >> a
+ $ hg ci -m t3 -d '2 0'
+ created new head
+ $ HGMERGE=true hg merge -q
+ $ hg ci -m merge -d '3 0'
+
+ $ hg debugindexdot .hg/store/data/a.i
+ digraph G {
+ -1 -> 0
+ 0 -> 1
+ 0 -> 2
+ 2 -> 3
+ 1 -> 3
+ }
+
+ $ cd ..
diff --git a/tests/test-debugrename.t b/tests/test-debugrename.t
new file mode 100644
index 0000000..59f3518
--- /dev/null
+++ b/tests/test-debugrename.t
@@ -0,0 +1,18 @@
+ $ hg init
+ $ echo a > a
+ $ hg ci -Am t
+ adding a
+
+ $ hg mv a b
+ $ hg ci -Am t1
+ $ hg debugrename b
+ b renamed from a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
+
+ $ hg mv b a
+ $ hg ci -Am t2
+ $ hg debugrename a
+ a renamed from b:37d9b5d994eab34eda9c16b195ace52c7b129980
+
+ $ hg debugrename --rev 1 b
+ b renamed from a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
+
diff --git a/tests/test-default-push.t b/tests/test-default-push.t
new file mode 100644
index 0000000..5c7d492
--- /dev/null
+++ b/tests/test-default-push.t
@@ -0,0 +1,38 @@
+ $ hg init a
+
+ $ echo a > a/a
+ $ hg --cwd a ci -Ama
+ adding a
+
+ $ hg clone a c
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo b >> b/a
+ $ hg --cwd b ci -mb
+
+Push should push to 'default' when 'default-push' not set:
+
+ $ hg --cwd b push
+ pushing to $TESTTMP/a (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Push should push to 'default-push' when set:
+
+ $ echo 'default-push = ../c' >> b/.hg/hgrc
+ $ hg --cwd b push
+ pushing to $TESTTMP/c (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
diff --git a/tests/test-demandimport.py b/tests/test-demandimport.py
new file mode 100644
index 0000000..59bc4f2
--- /dev/null
+++ b/tests/test-demandimport.py
@@ -0,0 +1,39 @@
+from mercurial import demandimport
+demandimport.enable()
+
+import re
+
+rsub = re.sub
+def f(obj):
+ l = repr(obj)
+ l = rsub("0x[0-9a-fA-F]+", "0x?", l)
+ l = rsub("from '.*'", "from '?'", l)
+ l = rsub("'<[a-z]*>'", "'<whatever>'", l)
+ return l
+
+import os
+
+print "os =", f(os)
+print "os.system =", f(os.system)
+print "os =", f(os)
+
+from mercurial import util
+
+print "util =", f(util)
+print "util.system =", f(util.system)
+print "util =", f(util)
+print "util.system =", f(util.system)
+
+import re as fred
+print "fred =", f(fred)
+
+import sys as re
+print "re =", f(re)
+
+print "fred =", f(fred)
+print "fred.sub =", f(fred.sub)
+print "fred =", f(fred)
+
+print "re =", f(re)
+print "re.stderr =", f(re.stderr)
+print "re =", f(re)
diff --git a/tests/test-demandimport.py.out b/tests/test-demandimport.py.out
new file mode 100644
index 0000000..c024e5d
--- /dev/null
+++ b/tests/test-demandimport.py.out
@@ -0,0 +1,15 @@
+os = <unloaded module 'os'>
+os.system = <built-in function system>
+os = <module 'os' from '?'>
+util = <unloaded module 'util'>
+util.system = <function system at 0x?>
+util = <module 'mercurial.util' from '?'>
+util.system = <function system at 0x?>
+fred = <unloaded module 're'>
+re = <unloaded module 'sys'>
+fred = <unloaded module 're'>
+fred.sub = <function sub at 0x?>
+fred = <proxied module 're'>
+re = <unloaded module 'sys'>
+re.stderr = <open file '<whatever>', mode 'w' at 0x?>
+re = <proxied module 'sys'>
diff --git a/tests/test-diff-binary-file.t b/tests/test-diff-binary-file.t
new file mode 100644
index 0000000..eac24c9
--- /dev/null
+++ b/tests/test-diff-binary-file.t
@@ -0,0 +1,40 @@
+ $ hg init a
+ $ cd a
+ $ cp "$TESTDIR/binfile.bin" .
+ $ hg add binfile.bin
+ $ hg ci -m 'add binfile.bin'
+
+ $ echo >> binfile.bin
+ $ hg ci -m 'change binfile.bin'
+
+ $ hg revert -r 0 binfile.bin
+ $ hg ci -m 'revert binfile.bin'
+
+ $ hg diff --nodates -r 0 -r 1
+ diff -r 48b371597640 -r acea2ab458c8 binfile.bin
+ Binary file binfile.bin has changed
+
+ $ hg diff --nodates -r 0 -r 2
+
+ $ hg diff --git -r 0 -r 1
+ diff --git a/binfile.bin b/binfile.bin
+ index 37ba3d1c6f17137d9c5f5776fa040caf5fe73ff9..58dc31a9e2f40f74ff3b45903f7d620b8e5b7356
+ GIT binary patch
+ literal 594
+ zc$@)J0<HatP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00009a7bBm000XU
+ z000XU0RWnu7ytkO2XskIMF-Uh9TW;VpMjwv0005-Nkl<ZD9@FWPs=e;7{<>W$NUkd
+ zX$nnYLt$-$V!?uy+1V%`z&Eh=ah|duER<4|QWhju3gb^nF*8iYobxWG-qqXl=2~5M
+ z*IoDB)sG^CfNuoBmqLTVU^<;@nwHP!1wrWd`{(mHo6VNXWtyh{alzqmsH*yYzpvLT
+ zLdY<T=ks|woh-`&01!ej#(xbV1f|pI*=%;d-%F*E*X#ZH`4I%6SS+$EJDE&ct=8po
+ ziN#{?_j|kD%Cd|oiqds`xm@;oJ-^?NG3Gdqrs?5u*zI;{nogxsx~^|Fn^Y?Gdc6<;
+ zfMJ+iF1J`LMx&A2?dEwNW8ClebzPTbIh{@$hS6*`kH@1d%Lo7fA#}N1)oN7`gm$~V
+ z+wDx#)OFqMcE{s!JN0-xhG8ItAjVkJwEcb`3WWlJfU2r?;Pd%dmR+q@mSri5q9_W-
+ zaR2~ECX?B2w+zELozC0s*6Z~|QG^f{3I#<`?)Q7U-JZ|q5W;9Q8i_=pBuSzunx=U;
+ z9C)5jBoYw9^?EHyQl(M}1OlQcCX>lXB*ODN003Z&P17_@)3Pi=i0wb04<W?v-u}7K
+ zXmmQA+wDgE!qR9o8jr`%=ab_&uh(l?R=r;Tjiqon91I2-hIu?57~@*4h7h9uORK#=
+ gQItJW-{SoTm)8|5##k|m00000NkvXXu0mjf3JwksH2?qr
+
+
+ $ hg diff --git -r 0 -r 2
+
+ $ cd ..
diff --git a/tests/test-diff-change.t b/tests/test-diff-change.t
new file mode 100644
index 0000000..05d34ad
--- /dev/null
+++ b/tests/test-diff-change.t
@@ -0,0 +1,93 @@
+Testing diff --change
+
+ $ hg init a
+ $ cd a
+
+ $ echo "first" > file.txt
+ $ hg add file.txt
+ $ hg commit -m 'first commit' # 0
+
+ $ echo "second" > file.txt
+ $ hg commit -m 'second commit' # 1
+
+ $ echo "third" > file.txt
+ $ hg commit -m 'third commit' # 2
+
+ $ hg diff --nodates --change 1
+ diff -r 4bb65dda5db4 -r e9b286083166 file.txt
+ --- a/file.txt
+ +++ b/file.txt
+ @@ -1,1 +1,1 @@
+ -first
+ +second
+
+ $ hg diff --change e9b286083166
+ diff -r 4bb65dda5db4 -r e9b286083166 file.txt
+ --- a/file.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -first
+ +second
+
+Test dumb revspecs (issue3474)
+
+ $ hg diff -r 2:2
+ $ hg diff -r "2 and 1"
+ abort: empty revision range
+ [255]
+
+Testing diff --change when merge:
+
+ $ for i in 1 2 3 4 5 6 7 8 9 10; do
+ > echo $i >> file.txt
+ > done
+ $ hg commit -m "lots of text" # 3
+
+ $ sed -e 's,^2$,x,' file.txt > file.txt.tmp
+ $ mv file.txt.tmp file.txt
+ $ hg commit -m "change 2 to x" # 4
+
+ $ hg up -r 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed -e 's,^8$,y,' file.txt > file.txt.tmp
+ $ mv file.txt.tmp file.txt
+ $ hg commit -m "change 8 to y"
+ created new head
+
+ $ hg up -C -r 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge -r 5
+ merging file.txt
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m "merge 8 to y" # 6
+
+ $ hg diff --change 5
+ diff -r ae119d680c82 -r 9085c5c02e52 file.txt
+ --- a/file.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -6,6 +6,6 @@
+ 5
+ 6
+ 7
+ -8
+ +y
+ 9
+ 10
+
+must be similar to 'hg diff --change 5':
+
+ $ hg diff -c 6
+ diff -r 273b50f17c6d -r 979ca961fd2e file.txt
+ --- a/file.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/file.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -6,6 +6,6 @@
+ 5
+ 6
+ 7
+ -8
+ +y
+ 9
+ 10
+
+ $ cd ..
diff --git a/tests/test-diff-color.t b/tests/test-diff-color.t
new file mode 100644
index 0000000..fe898d9
--- /dev/null
+++ b/tests/test-diff-color.t
@@ -0,0 +1,130 @@
+Setup
+
+ $ echo "[color]" >> $HGRCPATH
+ $ echo "mode = ansi" >> $HGRCPATH
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "color=" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+ $ cat > a <<EOF
+ > c
+ > c
+ > a
+ > a
+ > b
+ > a
+ > a
+ > c
+ > c
+ > EOF
+ $ hg ci -Am adda
+ adding a
+ $ cat > a <<EOF
+ > c
+ > c
+ > a
+ > a
+ > dd
+ > a
+ > a
+ > c
+ > c
+ > EOF
+
+default context
+
+ $ hg diff --nodates --color=always
+ \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
+ \x1b[0;31;1m--- a/a\x1b[0m (esc)
+ \x1b[0;32;1m+++ b/a\x1b[0m (esc)
+ \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
+ c
+ a
+ a
+ \x1b[0;31m-b\x1b[0m (esc)
+ \x1b[0;32m+dd\x1b[0m (esc)
+ a
+ a
+ c
+
+--unified=2
+
+ $ hg diff --nodates -U 2 --color=always
+ \x1b[0;1mdiff -r cf9f4ba66af2 a\x1b[0m (esc)
+ \x1b[0;31;1m--- a/a\x1b[0m (esc)
+ \x1b[0;32;1m+++ b/a\x1b[0m (esc)
+ \x1b[0;35m@@ -3,5 +3,5 @@\x1b[0m (esc)
+ a
+ a
+ \x1b[0;31m-b\x1b[0m (esc)
+ \x1b[0;32m+dd\x1b[0m (esc)
+ a
+ a
+
+diffstat
+
+ $ hg diff --stat --color=always
+ a | 2 \x1b[0;32m+\x1b[0m\x1b[0;31m-\x1b[0m (esc)
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+ $ echo "record=" >> $HGRCPATH
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "interactive=true" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "git=True" >> $HGRCPATH
+
+#if execbit
+
+record
+
+ $ chmod +x a
+ $ hg record --color=always -m moda a <<EOF
+ > y
+ > y
+ > EOF
+ \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
+ \x1b[0;36;1mold mode 100644\x1b[0m (esc)
+ \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
+ 1 hunks, 1 lines changed
+ \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m (esc)
+ \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
+ c
+ a
+ a
+ \x1b[0;31m-b\x1b[0m (esc)
+ \x1b[0;32m+dd\x1b[0m (esc)
+ a
+ a
+ c
+ \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m (esc)
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo commit)
+ working directory now based on revision 0
+
+qrecord
+
+ $ hg qrecord --color=always -m moda patch <<EOF
+ > y
+ > y
+ > EOF
+ \x1b[0;1mdiff --git a/a b/a\x1b[0m (esc)
+ \x1b[0;36;1mold mode 100644\x1b[0m (esc)
+ \x1b[0;36;1mnew mode 100755\x1b[0m (esc)
+ 1 hunks, 1 lines changed
+ \x1b[0;33mexamine changes to 'a'? [Ynesfdaq?]\x1b[0m (esc)
+ \x1b[0;35m@@ -2,7 +2,7 @@\x1b[0m (esc)
+ c
+ a
+ a
+ \x1b[0;31m-b\x1b[0m (esc)
+ \x1b[0;32m+dd\x1b[0m (esc)
+ a
+ a
+ c
+ \x1b[0;33mrecord this change to 'a'? [Ynesfdaq?]\x1b[0m (esc)
+
+#endif
+
+ $ cd ..
diff --git a/tests/test-diff-copy-depth.t b/tests/test-diff-copy-depth.t
new file mode 100644
index 0000000..6c7061f
--- /dev/null
+++ b/tests/test-diff-copy-depth.t
@@ -0,0 +1,51 @@
+ $ for i in aaa zzz; do
+ > hg init t
+ > cd t
+ >
+ > echo
+ > echo "-- With $i"
+ >
+ > touch file
+ > hg add file
+ > hg ci -m "Add"
+ >
+ > hg cp file $i
+ > hg ci -m "a -> $i"
+ >
+ > hg cp $i other-file
+ > echo "different" >> $i
+ > hg ci -m "$i -> other-file"
+ >
+ > hg cp other-file somename
+ >
+ > echo "Status":
+ > hg st -C
+ > echo
+ > echo "Diff:"
+ > hg diff -g
+ >
+ > cd ..
+ > rm -rf t
+ > done
+
+ -- With aaa
+ Status:
+ A somename
+ other-file
+
+ Diff:
+ diff --git a/other-file b/somename
+ copy from other-file
+ copy to somename
+
+ -- With zzz
+ Status:
+ A somename
+ other-file
+
+ Diff:
+ diff --git a/other-file b/somename
+ copy from other-file
+ copy to somename
+
+
diff --git a/tests/test-diff-hashes.t b/tests/test-diff-hashes.t
new file mode 100644
index 0000000..718f46e
--- /dev/null
+++ b/tests/test-diff-hashes.t
@@ -0,0 +1,46 @@
+ $ hg init a
+ $ cd a
+
+ $ hg diff inexistent1 inexistent2
+ inexistent1: * (glob)
+ inexistent2: * (glob)
+
+ $ echo bar > foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+
+ $ echo foobar > foo
+ $ hg ci -m 'change foo'
+
+ $ hg --quiet diff -r 0 -r 1
+ --- a/foo Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -bar
+ +foobar
+
+ $ hg diff -r 0 -r 1
+ diff -r a99fb63adac3 -r 9b8568d3af2f foo
+ --- a/foo Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -bar
+ +foobar
+
+ $ hg --verbose diff -r 0 -r 1
+ diff -r a99fb63adac3 -r 9b8568d3af2f foo
+ --- a/foo Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -bar
+ +foobar
+
+ $ hg --debug diff -r 0 -r 1
+ diff -r a99fb63adac3f31816a22f665bc3b7a7655b30f4 -r 9b8568d3af2f1749445eef03aede868a6f39f210 foo
+ --- a/foo Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -bar
+ +foobar
+
+ $ cd ..
diff --git a/tests/test-diff-ignore-whitespace.t b/tests/test-diff-ignore-whitespace.t
new file mode 100644
index 0000000..35ca98d
--- /dev/null
+++ b/tests/test-diff-ignore-whitespace.t
@@ -0,0 +1,500 @@
+GNU diff is the reference for all of these results.
+
+Prepare tests:
+
+ $ echo '[alias]' >> $HGRCPATH
+ $ echo 'ndiff = diff --nodates' >> $HGRCPATH
+
+ $ hg init
+ $ printf 'hello world\ngoodbye world\n' >foo
+ $ hg ci -Amfoo -ufoo
+ adding foo
+
+
+Test added blank lines:
+
+ $ printf '\nhello world\n\ngoodbye world\n\n' >foo
+
+>>> two diffs showing three added lines <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ +
+ hello world
+ +
+ goodbye world
+ +
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ +
+ hello world
+ +
+ goodbye world
+ +
+
+>>> no diffs <<<
+
+ $ hg ndiff -B
+ $ hg ndiff -Bb
+
+
+Test added horizontal space first on a line():
+
+ $ printf '\t hello world\ngoodbye world\n' >foo
+
+>>> four diffs showing added space first on the first line <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ + hello world
+ goodbye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ + hello world
+ goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ + hello world
+ goodbye world
+
+ $ hg ndiff -Bb
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ + hello world
+ goodbye world
+
+
+Test added horizontal space last on a line:
+
+ $ printf 'hello world\t \ngoodbye world\n' >foo
+
+>>> two diffs showing space appended to the first line <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ +hello world
+ goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ +hello world
+ goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -b
+ $ hg ndiff -Bb
+
+
+Test added horizontal space in the middle of a word:
+
+ $ printf 'hello world\ngood bye world\n' >foo
+
+>>> four diffs showing space inserted into "goodbye" <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +good bye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +good bye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +good bye world
+
+ $ hg ndiff -Bb
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +good bye world
+
+
+Test increased horizontal whitespace amount:
+
+ $ printf 'hello world\ngoodbye\t\t \tworld\n' >foo
+
+>>> two diffs showing changed whitespace amount in the last line <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ hello world
+ -goodbye world
+ +goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -b
+ $ hg ndiff -Bb
+
+
+Test added blank line with horizontal whitespace:
+
+ $ printf 'hello world\n \t\ngoodbye world\n' >foo
+
+>>> three diffs showing added blank line with horizontal space <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +
+ goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +
+ goodbye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +
+ goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -Bb
+
+
+Test added blank line with other whitespace:
+
+ $ printf 'hello world\n \t\ngoodbye world \n' >foo
+
+>>> three diffs showing added blank line with other space <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ -hello world
+ -goodbye world
+ +hello world
+ +
+ +goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ -hello world
+ -goodbye world
+ +hello world
+ +
+ +goodbye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +
+ goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -Bb
+
+
+Test whitespace changes:
+
+ $ printf 'helloworld\ngoodbye\tworld \n' >foo
+
+>>> four diffs showing changed whitespace <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ -goodbye world
+ +helloworld
+ +goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ -goodbye world
+ +helloworld
+ +goodbye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ +helloworld
+ goodbye world
+
+ $ hg ndiff -Bb
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,2 @@
+ -hello world
+ +helloworld
+ goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -w
+
+
+Test whitespace changes and blank lines:
+
+ $ printf 'helloworld\n\n\n\ngoodbye\tworld \n' >foo
+
+>>> five diffs showing changed whitespace <<<
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ -hello world
+ -goodbye world
+ +helloworld
+ +
+ +
+ +
+ +goodbye world
+
+ $ hg ndiff -B
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ -hello world
+ -goodbye world
+ +helloworld
+ +
+ +
+ +
+ +goodbye world
+
+ $ hg ndiff -b
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ -hello world
+ +helloworld
+ +
+ +
+ +
+ goodbye world
+
+ $ hg ndiff -Bb
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ -hello world
+ +helloworld
+ +
+ +
+ +
+ goodbye world
+
+ $ hg ndiff -w
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,5 @@
+ hello world
+ +
+ +
+ +
+ goodbye world
+
+>>> no diffs <<<
+
+ $ hg ndiff -wB
+
+
+Test \r (carriage return) as used in "DOS" line endings:
+
+ $ printf 'hello world\r\n\r\ngoodbye\rworld\n' >foo
+
+ $ hg ndiff
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ -hello world
+ -goodbye world
+ +hello world\r (esc)
+ +\r (esc)
+ +goodbye\rworld (esc)
+
+No completely blank lines to ignore:
+
+ $ hg ndiff --ignore-blank-lines
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ -hello world
+ -goodbye world
+ +hello world\r (esc)
+ +\r (esc)
+ +goodbye\rworld (esc)
+
+Only new line noticed:
+
+ $ hg ndiff --ignore-space-change
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +\r (esc)
+ goodbye world
+
+ $ hg ndiff --ignore-all-space
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ hello world
+ +\r (esc)
+ goodbye world
+
+New line not noticed when space change ignored:
+
+ $ hg ndiff --ignore-blank-lines --ignore-all-space
+
+Do not ignore all newlines, only blank lines
+
+ $ printf 'hello \nworld\ngoodbye world\n' > foo
+ $ hg ndiff --ignore-blank-lines
+ diff -r 540c40a65b78 foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,2 +1,3 @@
+ -hello world
+ +hello
+ +world
+ goodbye world
+
+Test hunk offsets adjustments with --ignore-blank-lines
+
+ $ hg revert -aC
+ reverting foo
+ $ printf '\nb\nx\nd\n' > a
+ $ printf 'b\ny\nd\n' > b
+ $ hg add a b
+ $ hg ci -m add
+ $ hg cat -r . a > b
+ $ hg cat -r . b > a
+ $ hg diff -B --nodates a > ../diffa
+ $ cat ../diffa
+ diff -r 0e66aa54f318 a
+ --- a/a
+ +++ b/a
+ @@ -1,4 +1,4 @@
+
+ b
+ -x
+ +y
+ d
+ $ hg diff -B --nodates b > ../diffb
+ $ cat ../diffb
+ diff -r 0e66aa54f318 b
+ --- a/b
+ +++ b/b
+ @@ -1,3 +1,3 @@
+ b
+ -y
+ +x
+ d
+ $ hg revert -aC
+ reverting a
+ reverting b
+ $ hg import --no-commit ../diffa
+ applying ../diffa
+ $ hg revert -aC
+ reverting a
+ $ hg import --no-commit ../diffb
+ applying ../diffb
+ $ hg revert -aC
+ reverting b
diff --git a/tests/test-diff-issue2761.t b/tests/test-diff-issue2761.t
new file mode 100644
index 0000000..55b2a85
--- /dev/null
+++ b/tests/test-diff-issue2761.t
@@ -0,0 +1,23 @@
+Test issue2761
+
+ $ hg init
+
+ $ touch to-be-deleted
+ $ hg add
+ adding to-be-deleted
+ $ hg ci -m first
+ $ echo a > to-be-deleted
+ $ hg ci -m second
+ $ rm to-be-deleted
+ $ hg diff -r 0
+
+Same issue, different code path
+
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ touch doesnt-exist-in-1
+ $ hg add
+ adding doesnt-exist-in-1
+ $ hg ci -m third
+ $ rm doesnt-exist-in-1
+ $ hg diff -r 1
diff --git a/tests/test-diff-newlines.t b/tests/test-diff-newlines.t
new file mode 100644
index 0000000..565b756
--- /dev/null
+++ b/tests/test-diff-newlines.t
@@ -0,0 +1,18 @@
+ $ hg init
+
+ $ python -c 'file("a", "wb").write("confuse str.splitlines\nembedded\rnewline\n")'
+ $ hg ci -Ama -d '1 0'
+ adding a
+
+ $ echo clean diff >> a
+ $ hg ci -mb -d '2 0'
+
+ $ hg diff -r0 -r1
+ diff -r 107ba6f817b5 -r 310ce7989cdc a
+ --- a/a Thu Jan 01 00:00:01 1970 +0000
+ +++ b/a Thu Jan 01 00:00:02 1970 +0000
+ @@ -1,2 +1,3 @@
+ confuse str.splitlines
+ embedded\rnewline (esc)
+ +clean diff
+
diff --git a/tests/test-diff-reverse.t b/tests/test-diff-reverse.t
new file mode 100644
index 0000000..20729c2
--- /dev/null
+++ b/tests/test-diff-reverse.t
@@ -0,0 +1,44 @@
+ $ hg init
+
+ $ cat > a <<EOF
+ > a
+ > b
+ > c
+ > EOF
+ $ hg ci -Am adda
+ adding a
+
+ $ cat > a <<EOF
+ > d
+ > e
+ > f
+ > EOF
+ $ hg ci -m moda
+
+ $ hg diff --reverse -r0 -r1
+ diff -r 2855cdcfcbb7 -r 8e1805a3cf6e a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,3 +1,3 @@
+ -d
+ -e
+ -f
+ +a
+ +b
+ +c
+
+ $ cat >> a <<EOF
+ > g
+ > h
+ > EOF
+ $ hg diff --reverse --nodates
+ diff -r 2855cdcfcbb7 a
+ --- a/a
+ +++ b/a
+ @@ -1,5 +1,3 @@
+ d
+ e
+ f
+ -g
+ -h
+
diff --git a/tests/test-diff-subdir.t b/tests/test-diff-subdir.t
new file mode 100644
index 0000000..e10a87c
--- /dev/null
+++ b/tests/test-diff-subdir.t
@@ -0,0 +1,47 @@
+ $ hg init
+
+ $ mkdir alpha
+ $ touch alpha/one
+ $ mkdir beta
+ $ touch beta/two
+
+ $ hg add alpha/one beta/two
+ $ hg ci -m "start"
+
+ $ echo 1 > alpha/one
+ $ echo 2 > beta/two
+
+everything
+
+ $ hg diff --nodates
+ diff -r 7d5ef1aea329 alpha/one
+ --- a/alpha/one
+ +++ b/alpha/one
+ @@ -0,0 +1,1 @@
+ +1
+ diff -r 7d5ef1aea329 beta/two
+ --- a/beta/two
+ +++ b/beta/two
+ @@ -0,0 +1,1 @@
+ +2
+
+beta only
+
+ $ hg diff --nodates beta
+ diff -r 7d5ef1aea329 beta/two
+ --- a/beta/two
+ +++ b/beta/two
+ @@ -0,0 +1,1 @@
+ +2
+
+inside beta
+
+ $ cd beta
+ $ hg diff --nodates .
+ diff -r 7d5ef1aea329 beta/two
+ --- a/beta/two
+ +++ b/beta/two
+ @@ -0,0 +1,1 @@
+ +2
+
+ $ cd ..
diff --git a/tests/test-diff-unified.t b/tests/test-diff-unified.t
new file mode 100644
index 0000000..a79d520
--- /dev/null
+++ b/tests/test-diff-unified.t
@@ -0,0 +1,198 @@
+ $ hg init repo
+ $ cd repo
+ $ cat > a <<EOF
+ > c
+ > c
+ > a
+ > a
+ > b
+ > a
+ > a
+ > c
+ > c
+ > EOF
+ $ hg ci -Am adda
+ adding a
+
+ $ cat > a <<EOF
+ > c
+ > c
+ > a
+ > a
+ > dd
+ > a
+ > a
+ > c
+ > c
+ > EOF
+
+default context
+
+ $ hg diff --nodates
+ diff -r cf9f4ba66af2 a
+ --- a/a
+ +++ b/a
+ @@ -2,7 +2,7 @@
+ c
+ a
+ a
+ -b
+ +dd
+ a
+ a
+ c
+
+invalid --unified
+
+ $ hg diff --nodates -U foo
+ abort: diff context lines count must be an integer, not 'foo'
+ [255]
+
+
+ $ hg diff --nodates -U 2
+ diff -r cf9f4ba66af2 a
+ --- a/a
+ +++ b/a
+ @@ -3,5 +3,5 @@
+ a
+ a
+ -b
+ +dd
+ a
+ a
+
+ $ hg --config diff.unified=2 diff --nodates
+ diff -r cf9f4ba66af2 a
+ --- a/a
+ +++ b/a
+ @@ -3,5 +3,5 @@
+ a
+ a
+ -b
+ +dd
+ a
+ a
+
+ $ hg diff --nodates -U 1
+ diff -r cf9f4ba66af2 a
+ --- a/a
+ +++ b/a
+ @@ -4,3 +4,3 @@
+ a
+ -b
+ +dd
+ a
+
+invalid diff.unified
+
+ $ hg --config diff.unified=foo diff --nodates
+ abort: diff context lines count must be an integer, not 'foo'
+ [255]
+
+ $ cd ..
+
+
+0 lines of context hunk header matches gnu diff hunk header
+
+ $ hg init diffzero
+ $ cd diffzero
+ $ cat > f1 << EOF
+ > c2
+ > c4
+ > c5
+ > EOF
+ $ hg commit -Am0
+ adding f1
+
+ $ cat > f2 << EOF
+ > c1
+ > c2
+ > c3
+ > c4
+ > EOF
+ $ mv f2 f1
+ $ hg diff -U0 --nodates
+ diff -r 55d8ff78db23 f1
+ --- a/f1
+ +++ b/f1
+ @@ -0,0 +1,1 @@
+ +c1
+ @@ -1,0 +3,1 @@
+ +c3
+ @@ -3,1 +4,0 @@
+ -c5
+
+ $ hg diff -U0 --nodates --git
+ diff --git a/f1 b/f1
+ --- a/f1
+ +++ b/f1
+ @@ -0,0 +1,1 @@
+ +c1
+ @@ -1,0 +3,1 @@
+ +c3
+ @@ -3,1 +4,0 @@
+ -c5
+
+ $ hg diff -U0 --nodates -p
+ diff -r 55d8ff78db23 f1
+ --- a/f1
+ +++ b/f1
+ @@ -0,0 +1,1 @@
+ +c1
+ @@ -1,0 +3,1 @@ c2
+ +c3
+ @@ -3,1 +4,0 @@ c4
+ -c5
+
+ $ echo a > f1
+ $ hg ci -m movef2
+
+Test diff headers terminating with TAB when necessary (issue3357)
+Regular diff --nodates, file creation
+
+ $ hg mv f1 'f 1'
+ $ echo b > 'f 1'
+ $ hg diff --nodates 'f 1'
+ diff -r 7574207d0d15 f 1
+ --- /dev/null
+ +++ b/f 1
+ @@ -0,0 +1,1 @@
+ +b
+
+Git diff, adding space
+
+ $ hg diff --git
+ diff --git a/f1 b/f 1
+ rename from f1
+ rename to f 1
+ --- a/f1
+ +++ b/f 1
+ @@ -1,1 +1,1 @@
+ -a
+ +b
+
+Regular diff --nodates, file deletion
+
+ $ hg ci -m addspace
+ $ hg mv 'f 1' f1
+ $ echo a > f1
+ $ hg diff --nodates 'f 1'
+ diff -r ca50fe67c9c7 f 1
+ --- a/f 1
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -b
+
+Git diff, removing space
+
+ $ hg diff --git
+ diff --git a/f 1 b/f1
+ rename from f 1
+ rename to f1
+ --- a/f 1
+ +++ b/f1
+ @@ -1,1 +1,1 @@
+ -b
+ +a
+
+ $ cd ..
diff --git a/tests/test-diff-upgrade.t b/tests/test-diff-upgrade.t
new file mode 100644
index 0000000..94c299a
--- /dev/null
+++ b/tests/test-diff-upgrade.t
@@ -0,0 +1,283 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "autodiff=$TESTDIR/autodiff.py" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+ $ hg init repo
+ $ cd repo
+
+
+
+make a combination of new, changed and deleted file
+
+ $ echo regular > regular
+ $ echo rmregular > rmregular
+ $ python -c "file('bintoregular', 'wb').write('\0')"
+ $ touch rmempty
+ $ echo exec > exec
+ $ chmod +x exec
+ $ echo rmexec > rmexec
+ $ chmod +x rmexec
+ $ echo setexec > setexec
+ $ echo unsetexec > unsetexec
+ $ chmod +x unsetexec
+ $ echo binary > binary
+ $ python -c "file('rmbinary', 'wb').write('\0')"
+ $ hg ci -Am addfiles
+ adding binary
+ adding bintoregular
+ adding exec
+ adding regular
+ adding rmbinary
+ adding rmempty
+ adding rmexec
+ adding rmregular
+ adding setexec
+ adding unsetexec
+ $ echo regular >> regular
+ $ echo newregular >> newregular
+ $ rm rmempty
+ $ touch newempty
+ $ rm rmregular
+ $ echo exec >> exec
+ $ echo newexec > newexec
+ $ echo bintoregular > bintoregular
+ $ chmod +x newexec
+ $ rm rmexec
+ $ chmod +x setexec
+ $ chmod -x unsetexec
+ $ python -c "file('binary', 'wb').write('\0\0')"
+ $ python -c "file('newbinary', 'wb').write('\0')"
+ $ rm rmbinary
+ $ hg addremove -s 0
+ adding newbinary
+ adding newempty
+ adding newexec
+ adding newregular
+ removing rmbinary
+ removing rmempty
+ removing rmexec
+ removing rmregular
+
+git=no: regular diff for all files
+
+ $ hg autodiff --git=no
+ diff -r a66d19b9302d binary
+ Binary file binary has changed
+ diff -r a66d19b9302d bintoregular
+ Binary file bintoregular has changed
+ diff -r a66d19b9302d exec
+ --- a/exec
+ +++ b/exec
+ @@ -1,1 +1,2 @@
+ exec
+ +exec
+ diff -r a66d19b9302d newbinary
+ Binary file newbinary has changed
+ diff -r a66d19b9302d newexec
+ --- /dev/null
+ +++ b/newexec
+ @@ -0,0 +1,1 @@
+ +newexec
+ diff -r a66d19b9302d newregular
+ --- /dev/null
+ +++ b/newregular
+ @@ -0,0 +1,1 @@
+ +newregular
+ diff -r a66d19b9302d regular
+ --- a/regular
+ +++ b/regular
+ @@ -1,1 +1,2 @@
+ regular
+ +regular
+ diff -r a66d19b9302d rmbinary
+ Binary file rmbinary has changed
+ diff -r a66d19b9302d rmexec
+ --- a/rmexec
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmexec
+ diff -r a66d19b9302d rmregular
+ --- a/rmregular
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmregular
+
+git=yes: git diff for single regular file
+
+ $ hg autodiff --git=yes regular
+ diff --git a/regular b/regular
+ --- a/regular
+ +++ b/regular
+ @@ -1,1 +1,2 @@
+ regular
+ +regular
+
+git=auto: regular diff for regular files and non-binary removals
+
+ $ hg autodiff --git=auto regular newregular rmregular rmexec
+ diff -r a66d19b9302d newregular
+ --- /dev/null
+ +++ b/newregular
+ @@ -0,0 +1,1 @@
+ +newregular
+ diff -r a66d19b9302d regular
+ --- a/regular
+ +++ b/regular
+ @@ -1,1 +1,2 @@
+ regular
+ +regular
+ diff -r a66d19b9302d rmexec
+ --- a/rmexec
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmexec
+ diff -r a66d19b9302d rmregular
+ --- a/rmregular
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmregular
+
+ $ for f in exec newexec setexec unsetexec binary newbinary newempty rmempty rmbinary bintoregular; do
+ > echo
+ > echo '% git=auto: git diff for' $f
+ > hg autodiff --git=auto $f
+ > done
+
+ % git=auto: git diff for exec
+ diff -r a66d19b9302d exec
+ --- a/exec
+ +++ b/exec
+ @@ -1,1 +1,2 @@
+ exec
+ +exec
+
+ % git=auto: git diff for newexec
+ diff --git a/newexec b/newexec
+ new file mode 100755
+ --- /dev/null
+ +++ b/newexec
+ @@ -0,0 +1,1 @@
+ +newexec
+
+ % git=auto: git diff for setexec
+ diff --git a/setexec b/setexec
+ old mode 100644
+ new mode 100755
+
+ % git=auto: git diff for unsetexec
+ diff --git a/unsetexec b/unsetexec
+ old mode 100755
+ new mode 100644
+
+ % git=auto: git diff for binary
+ diff --git a/binary b/binary
+ index a9128c283485202893f5af379dd9beccb6e79486..09f370e38f498a462e1ca0faa724559b6630c04f
+ GIT binary patch
+ literal 2
+ Jc${Nk0000200961
+
+
+ % git=auto: git diff for newbinary
+ diff --git a/newbinary b/newbinary
+ new file mode 100644
+ index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d
+ GIT binary patch
+ literal 1
+ Ic${MZ000310RR91
+
+
+ % git=auto: git diff for newempty
+ diff --git a/newempty b/newempty
+ new file mode 100644
+
+ % git=auto: git diff for rmempty
+ diff --git a/rmempty b/rmempty
+ deleted file mode 100644
+
+ % git=auto: git diff for rmbinary
+ diff --git a/rmbinary b/rmbinary
+ deleted file mode 100644
+ Binary file rmbinary has changed
+
+ % git=auto: git diff for bintoregular
+ diff --git a/bintoregular b/bintoregular
+ index f76dd238ade08917e6712764a16a22005a50573d..9c42f2b6427d8bf034b7bc23986152dc01bfd3ab
+ GIT binary patch
+ literal 13
+ Uc$`bh%qz(+N=+}#Ni5<5043uE82|tP
+
+
+git=warn: regular diff with data loss warnings
+
+ $ hg autodiff --git=warn
+ diff -r a66d19b9302d binary
+ Binary file binary has changed
+ diff -r a66d19b9302d bintoregular
+ Binary file bintoregular has changed
+ diff -r a66d19b9302d exec
+ --- a/exec
+ +++ b/exec
+ @@ -1,1 +1,2 @@
+ exec
+ +exec
+ diff -r a66d19b9302d newbinary
+ Binary file newbinary has changed
+ diff -r a66d19b9302d newexec
+ --- /dev/null
+ +++ b/newexec
+ @@ -0,0 +1,1 @@
+ +newexec
+ diff -r a66d19b9302d newregular
+ --- /dev/null
+ +++ b/newregular
+ @@ -0,0 +1,1 @@
+ +newregular
+ diff -r a66d19b9302d regular
+ --- a/regular
+ +++ b/regular
+ @@ -1,1 +1,2 @@
+ regular
+ +regular
+ diff -r a66d19b9302d rmbinary
+ Binary file rmbinary has changed
+ diff -r a66d19b9302d rmexec
+ --- a/rmexec
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmexec
+ diff -r a66d19b9302d rmregular
+ --- a/rmregular
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -rmregular
+ data lost for: binary
+ data lost for: bintoregular
+ data lost for: newbinary
+ data lost for: newempty
+ data lost for: newexec
+ data lost for: rmbinary
+ data lost for: rmempty
+ data lost for: setexec
+ data lost for: unsetexec
+
+git=abort: fail on execute bit change
+
+ $ hg autodiff --git=abort regular setexec
+ abort: losing data for setexec
+ [255]
+
+git=abort: succeed on regular file
+
+ $ hg autodiff --git=abort regular
+ diff -r a66d19b9302d regular
+ --- a/regular
+ +++ b/regular
+ @@ -1,1 +1,2 @@
+ regular
+ +regular
+
+ $ cd ..
+
diff --git a/tests/test-diffdir.t b/tests/test-diffdir.t
new file mode 100644
index 0000000..f13bdbf
--- /dev/null
+++ b/tests/test-diffdir.t
@@ -0,0 +1,40 @@
+ $ hg init
+ $ touch a
+ $ hg add a
+ $ hg ci -m "a"
+
+ $ echo 123 > b
+ $ hg add b
+ $ hg diff --nodates
+ diff -r 3903775176ed b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +123
+
+ $ hg diff --nodates -r tip
+ diff -r 3903775176ed b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +123
+
+ $ echo foo > a
+ $ hg diff --nodates
+ diff -r 3903775176ed a
+ --- a/a
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +foo
+ diff -r 3903775176ed b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +123
+
+ $ hg diff -r ""
+ hg: parse error: empty query
+ [255]
+ $ hg diff -r tip -r ""
+ hg: parse error: empty query
+ [255]
diff --git a/tests/test-diffstat.t b/tests/test-diffstat.t
new file mode 100644
index 0000000..5d03cdc
--- /dev/null
+++ b/tests/test-diffstat.t
@@ -0,0 +1,72 @@
+ $ hg init repo
+ $ cd repo
+ $ i=0; while [ "$i" -lt 213 ]; do echo a >> a; i=`expr $i + 1`; done
+ $ hg add a
+ $ cp a b
+ $ hg add b
+
+Wide diffstat:
+
+ $ hg diff --stat
+ a | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ b | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 426 insertions(+), 0 deletions(-)
+
+diffstat width:
+
+ $ COLUMNS=24 hg diff --config ui.interactive=true --stat
+ a | 213 ++++++++++++++
+ b | 213 ++++++++++++++
+ 2 files changed, 426 insertions(+), 0 deletions(-)
+
+ $ hg ci -m adda
+
+ $ cat >> a <<EOF
+ > a
+ > a
+ > a
+ > EOF
+
+Narrow diffstat:
+
+ $ hg diff --stat
+ a | 3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+ $ hg ci -m appenda
+
+ >>> open("c", "wb").write("\0")
+ $ touch d
+ $ hg add c d
+
+Binary diffstat:
+
+ $ hg diff --stat
+ c | Bin
+ 1 files changed, 0 insertions(+), 0 deletions(-)
+
+Binary git diffstat:
+
+ $ hg diff --stat --git
+ c | Bin
+ d | 0
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+ $ hg ci -m createb
+
+ >>> open("file with spaces", "wb").write("\0")
+ $ hg add "file with spaces"
+
+Filename with spaces diffstat:
+
+ $ hg diff --stat
+ file with spaces | Bin
+ 1 files changed, 0 insertions(+), 0 deletions(-)
+
+Filename with spaces git diffstat:
+
+ $ hg diff --stat --git
+ file with spaces | Bin
+ 1 files changed, 0 insertions(+), 0 deletions(-)
+
+ $ cd ..
diff --git a/tests/test-dirstate-race.t b/tests/test-dirstate-race.t
new file mode 100644
index 0000000..d9bd97c
--- /dev/null
+++ b/tests/test-dirstate-race.t
@@ -0,0 +1,33 @@
+ $ hg init
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m test
+
+Do we ever miss a sub-second change?:
+
+ $ for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do
+ > hg co -qC 0
+ > echo b > a
+ > hg st
+ > done
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+ M a
+
diff --git a/tests/test-dirstate.t b/tests/test-dirstate.t
new file mode 100644
index 0000000..6b65f59
--- /dev/null
+++ b/tests/test-dirstate.t
@@ -0,0 +1,56 @@
+------ Test dirstate._dirs refcounting
+
+ $ hg init t
+ $ cd t
+ $ mkdir -p a/b/c/d
+ $ touch a/b/c/d/x
+ $ touch a/b/c/d/y
+ $ touch a/b/c/d/z
+ $ hg ci -Am m
+ adding a/b/c/d/x
+ adding a/b/c/d/y
+ adding a/b/c/d/z
+ $ hg mv a z
+ moving a/b/c/d/x to z/b/c/d/x (glob)
+ moving a/b/c/d/y to z/b/c/d/y (glob)
+ moving a/b/c/d/z to z/b/c/d/z (glob)
+
+Test name collisions
+
+ $ rm z/b/c/d/x
+ $ mkdir z/b/c/d/x
+ $ touch z/b/c/d/x/y
+ $ hg add z/b/c/d/x/y
+ abort: file 'z/b/c/d/x' in dirstate clashes with 'z/b/c/d/x/y'
+ [255]
+ $ rm -rf z/b/c/d
+ $ touch z/b/c/d
+ $ hg add z/b/c/d
+ abort: directory 'z/b/c/d' already in dirstate
+ [255]
+
+ $ cd ..
+
+Issue1790: dirstate entry locked into unset if file mtime is set into
+the future
+
+Prepare test repo:
+
+ $ hg init u
+ $ cd u
+ $ echo a > a
+ $ hg add
+ adding a
+ $ hg ci -m1
+
+Set mtime of a into the future:
+
+ $ touch -t 202101011200 a
+
+Status must not set a's entry to unset (issue1790):
+
+ $ hg status
+ $ hg debugstate
+ n 644 2 2021-01-01 12:00:00 a
+ $ cd ..
+
diff --git a/tests/test-dispatch.py b/tests/test-dispatch.py
new file mode 100644
index 0000000..51ed4e8
--- /dev/null
+++ b/tests/test-dispatch.py
@@ -0,0 +1,33 @@
+import os
+from mercurial import dispatch
+
+def testdispatch(cmd):
+ """Simple wrapper around dispatch.dispatch()
+
+ Prints command and result value, but does not handle quoting.
+ """
+ print "running: %s" % (cmd,)
+ req = dispatch.request(cmd.split())
+ result = dispatch.dispatch(req)
+ print "result: %r" % (result,)
+
+
+testdispatch("init test1")
+os.chdir('test1')
+
+# create file 'foo', add and commit
+f = open('foo', 'wb')
+f.write('foo\n')
+f.close()
+testdispatch("add foo")
+testdispatch("commit -m commit1 -d 2000-01-01 foo")
+
+# append to file 'foo' and commit
+f = open('foo', 'ab')
+f.write('bar\n')
+f.close()
+testdispatch("commit -m commit2 -d 2000-01-02 foo")
+
+# check 88803a69b24 (fancyopts modified command table)
+testdispatch("log -r 0")
+testdispatch("log -r tip")
diff --git a/tests/test-dispatch.py.out b/tests/test-dispatch.py.out
new file mode 100644
index 0000000..2169f22
--- /dev/null
+++ b/tests/test-dispatch.py.out
@@ -0,0 +1,23 @@
+running: init test1
+result: None
+running: add foo
+result: 0
+running: commit -m commit1 -d 2000-01-01 foo
+result: None
+running: commit -m commit2 -d 2000-01-02 foo
+result: None
+running: log -r 0
+changeset: 0:0e4634943879
+user: test
+date: Sat Jan 01 00:00:00 2000 +0000
+summary: commit1
+
+result: None
+running: log -r tip
+changeset: 1:45589e459b2e
+tag: tip
+user: test
+date: Sun Jan 02 00:00:00 2000 +0000
+summary: commit2
+
+result: None
diff --git a/tests/test-dispatch.t b/tests/test-dispatch.t
new file mode 100644
index 0000000..3b11d14
--- /dev/null
+++ b/tests/test-dispatch.t
@@ -0,0 +1,58 @@
+test command parsing and dispatch
+
+ $ hg init a
+ $ cd a
+
+Redundant options used to crash (issue436):
+ $ hg -v log -v
+ $ hg -v log -v x
+
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+Missing arg:
+
+ $ hg cat
+ hg cat: invalid arguments
+ hg cat [OPTION]... FILE...
+
+ output the current or given revision of files
+
+ options:
+
+ -o --output FORMAT print output to file with formatted name
+ -r --rev REV print the given revision
+ --decode apply any matching decode filter
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+
+ [+] marked option can be specified multiple times
+
+ use "hg help cat" to show the full help text
+ [255]
+
+[defaults]
+
+ $ hg cat a
+ a
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > cat = -r null
+ > EOF
+ $ hg cat a
+ a: no such file in rev 000000000000
+ [1]
+
+ $ cd "$TESTTMP"
+
+#if no-outer-repo
+
+No repo:
+
+ $ cd $dir
+ $ hg cat
+ abort: no repository found in '$TESTTMP' (.hg not found)!
+ [255]
+
+#endif
diff --git a/tests/test-doctest.py b/tests/test-doctest.py
new file mode 100644
index 0000000..8f143c1
--- /dev/null
+++ b/tests/test-doctest.py
@@ -0,0 +1,44 @@
+# this is hack to make sure no escape characters are inserted into the output
+import os
+if 'TERM' in os.environ:
+ del os.environ['TERM']
+import doctest
+
+import mercurial.util
+doctest.testmod(mercurial.util)
+
+import mercurial.changelog
+doctest.testmod(mercurial.changelog)
+
+import mercurial.dagparser
+doctest.testmod(mercurial.dagparser, optionflags=doctest.NORMALIZE_WHITESPACE)
+
+import mercurial.match
+doctest.testmod(mercurial.match)
+
+import mercurial.store
+doctest.testmod(mercurial.store)
+
+import mercurial.ui
+doctest.testmod(mercurial.ui)
+
+import mercurial.url
+doctest.testmod(mercurial.url)
+
+import mercurial.encoding
+doctest.testmod(mercurial.encoding)
+
+import mercurial.hgweb.hgwebdir_mod
+doctest.testmod(mercurial.hgweb.hgwebdir_mod)
+
+import hgext.convert.cvsps
+doctest.testmod(hgext.convert.cvsps)
+
+import mercurial.revset
+doctest.testmod(mercurial.revset)
+
+import mercurial.minirst
+doctest.testmod(mercurial.minirst)
+
+import mercurial.templatefilters
+doctest.testmod(mercurial.templatefilters)
diff --git a/tests/test-double-merge.t b/tests/test-double-merge.t
new file mode 100644
index 0000000..a703c5b
--- /dev/null
+++ b/tests/test-double-merge.t
@@ -0,0 +1,67 @@
+ $ hg init repo
+ $ cd repo
+
+ $ echo line 1 > foo
+ $ hg ci -qAm 'add foo'
+
+copy foo to bar and change both files
+ $ hg cp foo bar
+ $ echo line 2-1 >> foo
+ $ echo line 2-2 >> bar
+ $ hg ci -m 'cp foo bar; change both'
+
+in another branch, change foo in a way that doesn't conflict with
+the other changes
+ $ hg up -qC 0
+ $ echo line 0 > foo
+ $ hg cat foo >> foo
+ $ hg ci -m 'change foo'
+ created new head
+
+we get conflicts that shouldn't be there
+ $ hg merge -P
+ changeset: 1:484bf6903104
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: cp foo bar; change both
+
+ $ hg merge --debug
+ searching for copies back to rev 1
+ unmatched files in other:
+ bar
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ bar -> foo *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: e6dc8efe11cc, local: 6a0df1dad128+, remote: 484bf6903104
+ foo: versions differ -> m
+ foo: remote copied to bar -> m
+ preserving foo for resolve of bar
+ preserving foo for resolve of foo
+ updating: foo 1/2 files (50.00%)
+ picked tool 'internal:merge' for bar (binary False symlink False)
+ merging foo and bar to bar
+ my bar@6a0df1dad128+ other bar@484bf6903104 ancestor foo@e6dc8efe11cc
+ premerge successful
+ updating: foo 2/2 files (100.00%)
+ picked tool 'internal:merge' for foo (binary False symlink False)
+ merging foo
+ my foo@6a0df1dad128+ other foo@484bf6903104 ancestor foo@e6dc8efe11cc
+ premerge successful
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+contents of foo
+ $ cat foo
+ line 0
+ line 1
+ line 2-1
+
+contents of bar
+ $ cat bar
+ line 0
+ line 1
+ line 2-2
+
+ $ cd ..
diff --git a/tests/test-duplicateoptions.py b/tests/test-duplicateoptions.py
new file mode 100644
index 0000000..22964c4
--- /dev/null
+++ b/tests/test-duplicateoptions.py
@@ -0,0 +1,36 @@
+import os
+from mercurial import ui, commands, extensions
+
+ignore = set(['highlight', 'inotify', 'win32text', 'factotum'])
+
+if os.name != 'nt':
+ ignore.add('win32mbcs')
+
+disabled = [ext for ext in extensions.disabled().keys() if ext not in ignore]
+
+hgrc = open(os.environ["HGRCPATH"], 'w')
+hgrc.write('[extensions]\n')
+
+for ext in disabled:
+ hgrc.write(ext + '=\n')
+
+hgrc.close()
+
+u = ui.ui()
+extensions.loadall(u)
+
+globalshort = set()
+globallong = set()
+for option in commands.globalopts:
+ option[0] and globalshort.add(option[0])
+ option[1] and globallong.add(option[1])
+
+for cmd, entry in commands.table.iteritems():
+ seenshort = globalshort.copy()
+ seenlong = globallong.copy()
+ for option in entry[1]:
+ if (option[0] and option[0] in seenshort) or \
+ (option[1] and option[1] in seenlong):
+ print "command '" + cmd + "' has duplicate option " + str(option)
+ seenshort.add(option[0])
+ seenlong.add(option[1])
diff --git a/tests/test-empty-dir.t b/tests/test-empty-dir.t
new file mode 100644
index 0000000..16a7a33
--- /dev/null
+++ b/tests/test-empty-dir.t
@@ -0,0 +1,23 @@
+ $ hg init
+
+ $ echo 123 > a
+ $ hg add a
+ $ hg commit -m "first" a
+
+ $ mkdir sub
+ $ echo 321 > sub/b
+ $ hg add sub/b
+ $ hg commit -m "second" sub/b
+
+ $ cat sub/b
+ 321
+
+ $ hg co 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ cat sub/b 2>/dev/null || echo "sub/b not present"
+ sub/b not present
+
+ $ test -d sub || echo "sub not present"
+ sub not present
+
diff --git a/tests/test-empty-file.t b/tests/test-empty-file.t
new file mode 100644
index 0000000..07e7c58
--- /dev/null
+++ b/tests/test-empty-file.t
@@ -0,0 +1,47 @@
+ $ hg init a
+ $ cd a
+ $ touch empty1
+ $ hg add empty1
+ $ hg commit -m 'add empty1'
+
+ $ touch empty2
+ $ hg add empty2
+ $ hg commit -m 'add empty2'
+
+ $ hg up -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ touch empty3
+ $ hg add empty3
+ $ hg commit -m 'add empty3'
+ created new head
+
+ $ hg heads
+ changeset: 2:a1cb177e0d44
+ tag: tip
+ parent: 0:1e1d9c4e5b64
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add empty3
+
+ changeset: 1:097d2b0e17f6
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add empty2
+
+
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Before changeset 05257fd28591, we didn't notice the
+empty file that came from rev 1:
+
+ $ hg status
+ M empty2
+ $ hg commit -m merge
+ $ hg manifest --debug tip
+ b80de5d138758541c5f05265ad144ab9fa86d1db 644 empty1
+ b80de5d138758541c5f05265ad144ab9fa86d1db 644 empty2
+ b80de5d138758541c5f05265ad144ab9fa86d1db 644 empty3
+
+ $ cd ..
diff --git a/tests/test-empty-group.t b/tests/test-empty-group.t
new file mode 100644
index 0000000..9dbb33d
--- /dev/null
+++ b/tests/test-empty-group.t
@@ -0,0 +1,127 @@
+# A B
+#
+# 3 4 3
+# |\/| |\
+# |/\| | \
+# 1 2 1 2
+# \ / \ /
+# 0 0
+#
+# if the result of the merge of 1 and 2
+# is the same in 3 and 4, no new manifest
+# will be created and the manifest group
+# will be empty during the pull
+#
+# (plus we test a failure where outgoing
+# wrongly reported the number of csets)
+
+ $ hg init a
+ $ cd a
+ $ touch init
+ $ hg ci -A -m 0
+ adding init
+ $ touch x y
+ $ hg ci -A -m 1
+ adding x
+ adding y
+
+ $ hg update 0
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ touch x y
+ $ hg ci -A -m 2
+ adding x
+ adding y
+ created new head
+
+ $ hg merge 1
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -A -m m1
+
+ $ hg update -C 1
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 2
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -A -m m2
+ created new head
+
+ $ cd ..
+
+ $ hg clone -r 3 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg clone -r 4 a c
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R a outgoing b
+ comparing with b
+ searching for changes
+ changeset: 4:1ec3c74fc0e0
+ tag: tip
+ parent: 1:79f9e10cd04e
+ parent: 2:8e1bb01c1a24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: m2
+
+ $ hg -R a outgoing c
+ comparing with c
+ searching for changes
+ changeset: 3:d15a0c284984
+ parent: 2:8e1bb01c1a24
+ parent: 1:79f9e10cd04e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: m1
+
+ $ hg -R b outgoing c
+ comparing with c
+ searching for changes
+ changeset: 3:d15a0c284984
+ tag: tip
+ parent: 2:8e1bb01c1a24
+ parent: 1:79f9e10cd04e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: m1
+
+ $ hg -R c outgoing b
+ comparing with b
+ searching for changes
+ changeset: 3:1ec3c74fc0e0
+ tag: tip
+ parent: 1:79f9e10cd04e
+ parent: 2:8e1bb01c1a24
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: m2
+
+
+ $ hg -R b pull a
+ pulling from a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg -R c pull a
+ pulling from a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
diff --git a/tests/test-empty.t b/tests/test-empty.t
new file mode 100644
index 0000000..5f25f36
--- /dev/null
+++ b/tests/test-empty.t
@@ -0,0 +1,55 @@
+Create an empty repo:
+
+ $ hg init a
+ $ cd a
+
+Try some commands:
+
+ $ hg log
+ $ hg grep wah
+ [1]
+ $ hg manifest
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 0 files, 0 changesets, 0 total revisions
+
+Check the basic files created:
+
+ $ ls .hg
+ 00changelog.i
+ requires
+ store
+
+Should be empty:
+
+ $ ls .hg/store
+
+Poke at a clone:
+
+ $ cd ..
+ $ hg clone a b
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd b
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 0 files, 0 changesets, 0 total revisions
+ $ ls .hg
+ 00changelog.i
+ branch
+ dirstate
+ hgrc
+ requires
+ store
+
+Should be empty:
+
+ $ ls .hg/store
+
+ $ cd ..
diff --git a/tests/test-encode.t b/tests/test-encode.t
new file mode 100644
index 0000000..863bba3
--- /dev/null
+++ b/tests/test-encode.t
@@ -0,0 +1,63 @@
+Test encode/decode filters
+
+ $ hg init
+ $ cat > .hg/hgrc <<EOF
+ > [encode]
+ > not.gz = tr [:lower:] [:upper:]
+ > *.gz = gzip -d
+ > [decode]
+ > not.gz = tr [:upper:] [:lower:]
+ > *.gz = gzip
+ > EOF
+ $ echo "this is a test" | gzip > a.gz
+ $ echo "this is a test" > not.gz
+ $ hg add *
+ $ hg ci -m "test"
+
+no changes
+
+ $ hg status
+ $ touch *
+
+no changes
+
+ $ hg status
+
+check contents in repo are encoded
+
+ $ hg debugdata a.gz 0
+ this is a test
+ $ hg debugdata not.gz 0
+ THIS IS A TEST
+
+check committed content was decoded
+
+ $ gunzip < a.gz
+ this is a test
+ $ cat not.gz
+ this is a test
+ $ rm *
+ $ hg co -C
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+check decoding of our new working dir copy
+
+ $ gunzip < a.gz
+ this is a test
+ $ cat not.gz
+ this is a test
+
+check hg cat operation
+
+ $ hg cat a.gz
+ this is a test
+ $ hg cat --decode a.gz | gunzip
+ this is a test
+ $ mkdir subdir
+ $ cd subdir
+ $ hg -R .. cat ../a.gz
+ this is a test
+ $ hg -R .. cat --decode ../a.gz | gunzip
+ this is a test
+
+ $ cd ..
diff --git a/tests/test-encoding-align.t b/tests/test-encoding-align.t
new file mode 100644
index 0000000..b0ce561
--- /dev/null
+++ b/tests/test-encoding-align.t
@@ -0,0 +1,145 @@
+Test alignment of multibyte characters
+
+ $ HGENCODING=utf-8
+ $ export HGENCODING
+ $ hg init t
+ $ cd t
+ $ python << EOF
+ > # (byte, width) = (6, 4)
+ > s = "\xe7\x9f\xad\xe5\x90\x8d"
+ > # (byte, width) = (7, 7): odd width is good for alignment test
+ > m = "MIDDLE_"
+ > # (byte, width) = (18, 12)
+ > l = "\xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d"
+ > f = file('s', 'w'); f.write(s); f.close()
+ > f = file('m', 'w'); f.write(m); f.close()
+ > f = file('l', 'w'); f.write(l); f.close()
+ > # instant extension to show list of options
+ > f = file('showoptlist.py', 'w'); f.write("""# encoding: utf-8
+ > def showoptlist(ui, repo, *pats, **opts):
+ > '''dummy command to show option descriptions'''
+ > return 0
+ > cmdtable = {
+ > 'showoptlist':
+ > (showoptlist,
+ > [('s', 'opt1', '', 'short width' + ' %(s)s' * 8, '%(s)s'),
+ > ('m', 'opt2', '', 'middle width' + ' %(m)s' * 8, '%(m)s'),
+ > ('l', 'opt3', '', 'long width' + ' %(l)s' * 8, '%(l)s')
+ > ],
+ > ""
+ > )
+ > }
+ > """ % globals())
+ > f.close()
+ > EOF
+ $ S=`cat s`
+ $ M=`cat m`
+ $ L=`cat l`
+
+alignment of option descriptions in help
+
+ $ cat <<EOF > .hg/hgrc
+ > [extensions]
+ > ja_ext = `pwd`/showoptlist.py
+ > EOF
+
+check alignment of option descriptions in help
+
+ $ hg help showoptlist
+ hg showoptlist
+
+ dummy command to show option descriptions
+
+ options:
+
+ -s --opt1 \xe7\x9f\xad\xe5\x90\x8d short width \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d \xe7\x9f\xad\xe5\x90\x8d (esc)
+ -m --opt2 MIDDLE_ middle width MIDDLE_ MIDDLE_ MIDDLE_ MIDDLE_ MIDDLE_
+ MIDDLE_ MIDDLE_ MIDDLE_
+ -l --opt3 \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d long width \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
+
+ use "hg -v help showoptlist" to show more info
+
+
+ $ rm -f s; touch s
+ $ rm -f m; touch m
+ $ rm -f l; touch l
+
+add files
+
+ $ cp s $S
+ $ hg add $S
+ $ cp m $M
+ $ hg add $M
+ $ cp l $L
+ $ hg add $L
+
+commit(1)
+
+ $ echo 'first line(1)' >> s; cp s $S
+ $ echo 'first line(2)' >> m; cp m $M
+ $ echo 'first line(3)' >> l; cp l $L
+ $ hg commit -m 'first commit' -u $S
+
+commit(2)
+
+ $ echo 'second line(1)' >> s; cp s $S
+ $ echo 'second line(2)' >> m; cp m $M
+ $ echo 'second line(3)' >> l; cp l $L
+ $ hg commit -m 'second commit' -u $M
+
+commit(3)
+
+ $ echo 'third line(1)' >> s; cp s $S
+ $ echo 'third line(2)' >> m; cp m $M
+ $ echo 'third line(3)' >> l; cp l $L
+ $ hg commit -m 'third commit' -u $L
+
+check alignment of user names in annotate
+
+ $ hg annotate -u $M
+ \xe7\x9f\xad\xe5\x90\x8d: first line(2) (esc)
+ MIDDLE_: second line(2)
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d: third line(2) (esc)
+
+check alignment of filenames in diffstat
+
+ $ hg diff -c tip --stat
+ MIDDLE_ | 1 +
+ \xe7\x9f\xad\xe5\x90\x8d | 1 + (esc)
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d | 1 + (esc)
+ 3 files changed, 3 insertions(+), 0 deletions(-)
+
+add branches/tags
+
+ $ hg branch $S
+ marked working directory as branch \xe7\x9f\xad\xe5\x90\x8d (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg tag $S
+ $ hg branch $M
+ marked working directory as branch MIDDLE_
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg tag $M
+ $ hg branch $L
+ marked working directory as branch \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg tag $L
+
+check alignment of branches
+
+ $ hg tags
+ tip 5:d745ff46155b
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19 (esc)
+ MIDDLE_ 3:b06c5b6def9e
+ \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8 (esc)
+
+check alignment of tags
+
+ $ hg tags
+ tip 5:d745ff46155b
+ \xe9\x95\xb7\xe3\x81\x84\xe9\x95\xb7\xe3\x81\x84\xe5\x90\x8d\xe5\x89\x8d 4:9259be597f19 (esc)
+ MIDDLE_ 3:b06c5b6def9e
+ \xe7\x9f\xad\xe5\x90\x8d 2:64a70663cee8 (esc)
+
+ $ cd ..
diff --git a/tests/test-encoding-textwrap.t b/tests/test-encoding-textwrap.t
new file mode 100644
index 0000000..67b0488
--- /dev/null
+++ b/tests/test-encoding-textwrap.t
@@ -0,0 +1,259 @@
+Test text wrapping for multibyte characters
+
+ $ mkdir t
+ $ cd t
+
+define commands to display help text
+
+ $ cat << EOF > show.py
+ > # Japanese full-width characters:
+ > def show_full_ja(ui, **opts):
+ > u'''\u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051 \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051 \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051
+ >
+ > \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051 \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051 \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051 \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051
+ >
+ > \u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051\u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051\u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051\u3042\u3044\u3046\u3048\u304a\u304b\u304d\u304f\u3051
+ > '''
+ >
+ > # Japanese half-width characters:
+ > def show_half_ja(ui, *opts):
+ > u'''\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79
+ >
+ > \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79 \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79
+ >
+ > \uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79
+ > '''
+ >
+ > # Japanese ambiguous-width characters:
+ > def show_ambig_ja(ui, **opts):
+ > u'''\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb
+ >
+ > \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb
+ >
+ > \u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb\u03b1\u03b2\u03b3\u03b4\u03c5\u03b6\u03b7\u03b8\u25cb
+ > '''
+ >
+ > # Russian ambiguous-width characters:
+ > def show_ambig_ru(ui, **opts):
+ > u'''\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
+ >
+ > \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
+ >
+ > \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
+ > '''
+ >
+ > cmdtable = {
+ > 'show_full_ja': (show_full_ja, [], ""),
+ > 'show_half_ja': (show_half_ja, [], ""),
+ > 'show_ambig_ja': (show_ambig_ja, [], ""),
+ > 'show_ambig_ru': (show_ambig_ru, [], ""),
+ > }
+ > EOF
+
+"COLUMNS=60" means that there is no lines which has grater than 58 width
+
+(1) test text wrapping for non-ambiguous-width characters
+
+(1-1) display Japanese full-width characters in cp932
+
+ $ COLUMNS=60 hg --encoding cp932 --config extensions.show=./show.py help show_full_ja
+ hg show_full_ja
+
+ \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf (esc)
+
+ \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf (esc)
+ \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf (esc)
+
+ \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf (esc)
+ \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x82\xa9\x82\xab\x82\xad\x82\xaf (esc)
+
+ use "hg -v help show_full_ja" to show more info
+
+(1-2) display Japanese full-width characters in utf-8
+
+ $ COLUMNS=60 hg --encoding utf-8 --config extensions.show=./show.py help show_full_ja
+ hg show_full_ja
+
+ \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 (esc)
+
+ \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 (esc)
+ \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 (esc)
+
+ \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 (esc)
+ \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91 (esc)
+
+ use "hg -v help show_full_ja" to show more info
+
+
+(1-3) display Japanese half-width characters in cp932
+
+ $ COLUMNS=60 hg --encoding cp932 --config extensions.show=./show.py help show_half_ja
+ hg show_half_ja
+
+ \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 (esc)
+
+ \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 (esc)
+ \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 (esc)
+
+ \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 (esc)
+ \xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9 (esc)
+
+ use "hg -v help show_half_ja" to show more info
+
+(1-4) display Japanese half-width characters in utf-8
+
+ $ COLUMNS=60 hg --encoding utf-8 --config extensions.show=./show.py help show_half_ja
+ hg show_half_ja
+
+ \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 (esc)
+
+ \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 (esc)
+ \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 (esc)
+
+ \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 (esc)
+ \xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9\xef\xbd\xb1\xef\xbd\xb2\xef\xbd\xb3\xef\xbd\xb4\xef\xbd\xb5\xef\xbd\xb6\xef\xbd\xb7\xef\xbd\xb8\xef\xbd\xb9 (esc)
+
+ use "hg -v help show_half_ja" to show more info
+
+
+
+(2) test text wrapping for ambiguous-width characters
+
+(2-1) treat width of ambiguous characters as narrow (default)
+
+(2-1-1) display Japanese ambiguous-width characters in cp932
+
+ $ COLUMNS=60 hg --encoding cp932 --config extensions.show=./show.py help show_ambig_ja
+ hg show_ambig_ja
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ use "hg -v help show_ambig_ja" to show more info
+
+(2-1-2) display Japanese ambiguous-width characters in utf-8
+
+ $ COLUMNS=60 hg --encoding utf-8 --config extensions.show=./show.py help show_ambig_ja
+ hg show_ambig_ja
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ use "hg -v help show_ambig_ja" to show more info
+
+(2-1-3) display Russian ambiguous-width characters in cp1251
+
+ $ COLUMNS=60 hg --encoding cp1251 --config extensions.show=./show.py help show_ambig_ru
+ hg show_ambig_ru
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ use "hg -v help show_ambig_ru" to show more info
+
+(2-1-4) display Russian ambiguous-width characters in utf-8
+
+ $ COLUMNS=60 hg --encoding utf-8 --config extensions.show=./show.py help show_ambig_ru
+ hg show_ambig_ru
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ use "hg -v help show_ambig_ru" to show more info
+
+
+(2-2) treat width of ambiguous characters as wide
+
+(2-2-1) display Japanese ambiguous-width characters in cp932
+
+ $ COLUMNS=60 HGENCODINGAMBIGUOUS=wide hg --encoding cp932 --config extensions.show=./show.py help show_ambig_ja
+ hg show_ambig_ja
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b\x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+ \x83\xbf\x83\xc0\x83\xc1\x83\xc2\x83\xd2\x83\xc4\x83\xc5\x83\xc6\x81\x9b (esc)
+
+ use "hg -v help show_ambig_ja" to show more info
+
+(2-2-2) display Japanese ambiguous-width characters in utf-8
+
+ $ COLUMNS=60 HGENCODINGAMBIGUOUS=wide hg --encoding utf-8 --config extensions.show=./show.py help show_ambig_ja
+ hg show_ambig_ja
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b\xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+ \xce\xb1\xce\xb2\xce\xb3\xce\xb4\xcf\x85\xce\xb6\xce\xb7\xce\xb8\xe2\x97\x8b (esc)
+
+ use "hg -v help show_ambig_ja" to show more info
+
+(2-2-3) display Russian ambiguous-width characters in cp1251
+
+ $ COLUMNS=60 HGENCODINGAMBIGUOUS=wide hg --encoding cp1251 --config extensions.show=./show.py help show_ambig_ru
+ hg show_ambig_ru
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8\xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+ \xcd\xe0\xf1\xf2\xf0\xee\xe9\xea\xe8 (esc)
+
+ use "hg -v help show_ambig_ru" to show more info
+
+(2-2-4) display Russian ambiguous-width charactes in utf-8
+
+ $ COLUMNS=60 HGENCODINGAMBIGUOUS=wide hg --encoding utf-8 --config extensions.show=./show.py help show_ambig_ru
+ hg show_ambig_ru
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8\xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+ \xd0\x9d\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xb9\xd0\xba\xd0\xb8 (esc)
+
+ use "hg -v help show_ambig_ru" to show more info
+
+ $ cd ..
diff --git a/tests/test-encoding.t b/tests/test-encoding.t
new file mode 100644
index 0000000..ee884ba
--- /dev/null
+++ b/tests/test-encoding.t
@@ -0,0 +1,252 @@
+Test character encoding
+
+ $ hg init t
+ $ cd t
+
+we need a repo with some legacy latin-1 changesets
+
+ $ hg unbundle "$TESTDIR/bundles/legacy-encoding.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg co
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ python << EOF
+ > f = file('latin-1', 'w'); f.write("latin-1 e' encoded: \xe9"); f.close()
+ > f = file('utf-8', 'w'); f.write("utf-8 e' encoded: \xc3\xa9"); f.close()
+ > f = file('latin-1-tag', 'w'); f.write("\xe9"); f.close()
+ > EOF
+
+should fail with encoding error
+
+ $ echo "plain old ascii" > a
+ $ hg st
+ M a
+ ? latin-1
+ ? latin-1-tag
+ ? utf-8
+ $ HGENCODING=ascii hg ci -l latin-1
+ transaction abort!
+ rollback completed
+ abort: decoding near ' encoded: \xe9': 'ascii' codec can't decode byte 0xe9 in position 20: ordinal not in range(128)! (esc)
+ [255]
+
+these should work
+
+ $ echo "latin-1" > a
+ $ HGENCODING=latin-1 hg ci -l latin-1
+ $ echo "utf-8" > a
+ $ HGENCODING=utf-8 hg ci -l utf-8
+ $ HGENCODING=latin-1 hg tag `cat latin-1-tag`
+ $ HGENCODING=latin-1 hg branch `cat latin-1-tag`
+ marked working directory as branch \xe9 (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ HGENCODING=latin-1 hg ci -m 'latin1 branch'
+ $ rm .hg/branch
+
+hg log (ascii)
+
+ $ hg --encoding ascii log
+ changeset: 5:a52c0692f24a
+ branch: ?
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin1 branch
+
+ changeset: 4:94db611b4196
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag ? for changeset ca661e7520de
+
+ changeset: 3:ca661e7520de
+ tag: ?
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: utf-8 e' encoded: ?
+
+ changeset: 2:650c6f3d55dd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin-1 e' encoded: ?
+
+ changeset: 1:0e5b7e3f9c4a
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: koi8-r: ????? = u'\u0440\u0442\u0443\u0442\u044c'
+
+ changeset: 0:1e78a93102a3
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: latin-1 e': ? = u'\xe9'
+
+
+hg log (latin-1)
+
+ $ hg --encoding latin-1 log
+ changeset: 5:a52c0692f24a
+ branch: \xe9 (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin1 branch
+
+ changeset: 4:94db611b4196
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag \xe9 for changeset ca661e7520de (esc)
+
+ changeset: 3:ca661e7520de
+ tag: \xe9 (esc)
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: utf-8 e' encoded: \xe9 (esc)
+
+ changeset: 2:650c6f3d55dd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin-1 e' encoded: \xe9 (esc)
+
+ changeset: 1:0e5b7e3f9c4a
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: koi8-r: \xd2\xd4\xd5\xd4\xd8 = u'\\u0440\\u0442\\u0443\\u0442\\u044c' (esc)
+
+ changeset: 0:1e78a93102a3
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: latin-1 e': \xe9 = u'\\xe9' (esc)
+
+
+hg log (utf-8)
+
+ $ hg --encoding utf-8 log
+ changeset: 5:a52c0692f24a
+ branch: \xc3\xa9 (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin1 branch
+
+ changeset: 4:94db611b4196
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag \xc3\xa9 for changeset ca661e7520de (esc)
+
+ changeset: 3:ca661e7520de
+ tag: \xc3\xa9 (esc)
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: utf-8 e' encoded: \xc3\xa9 (esc)
+
+ changeset: 2:650c6f3d55dd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin-1 e' encoded: \xc3\xa9 (esc)
+
+ changeset: 1:0e5b7e3f9c4a
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: koi8-r: \xc3\x92\xc3\x94\xc3\x95\xc3\x94\xc3\x98 = u'\\u0440\\u0442\\u0443\\u0442\\u044c' (esc)
+
+ changeset: 0:1e78a93102a3
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: latin-1 e': \xc3\xa9 = u'\\xe9' (esc)
+
+
+hg tags (ascii)
+
+ $ HGENCODING=ascii hg tags
+ tip 5:a52c0692f24a
+ ? 3:ca661e7520de
+
+hg tags (latin-1)
+
+ $ HGENCODING=latin-1 hg tags
+ tip 5:a52c0692f24a
+ \xe9 3:ca661e7520de (esc)
+
+hg tags (utf-8)
+
+ $ HGENCODING=utf-8 hg tags
+ tip 5:a52c0692f24a
+ \xc3\xa9 3:ca661e7520de (esc)
+
+hg branches (ascii)
+
+ $ HGENCODING=ascii hg branches
+ ? 5:a52c0692f24a
+ default 4:94db611b4196 (inactive)
+
+hg branches (latin-1)
+
+ $ HGENCODING=latin-1 hg branches
+ \xe9 5:a52c0692f24a (esc)
+ default 4:94db611b4196 (inactive)
+
+hg branches (utf-8)
+
+ $ HGENCODING=utf-8 hg branches
+ \xc3\xa9 5:a52c0692f24a (esc)
+ default 4:94db611b4196 (inactive)
+ $ echo '[ui]' >> .hg/hgrc
+ $ echo 'fallbackencoding = koi8-r' >> .hg/hgrc
+
+hg log (utf-8)
+
+ $ HGENCODING=utf-8 hg log
+ changeset: 5:a52c0692f24a
+ branch: \xc3\xa9 (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin1 branch
+
+ changeset: 4:94db611b4196
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag \xc3\xa9 for changeset ca661e7520de (esc)
+
+ changeset: 3:ca661e7520de
+ tag: \xc3\xa9 (esc)
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: utf-8 e' encoded: \xc3\xa9 (esc)
+
+ changeset: 2:650c6f3d55dd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: latin-1 e' encoded: \xc3\xa9 (esc)
+
+ changeset: 1:0e5b7e3f9c4a
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: koi8-r: \xd1\x80\xd1\x82\xd1\x83\xd1\x82\xd1\x8c = u'\\u0440\\u0442\\u0443\\u0442\\u044c' (esc)
+
+ changeset: 0:1e78a93102a3
+ user: test
+ date: Mon Jan 12 13:46:40 1970 +0000
+ summary: latin-1 e': \xd0\x98 = u'\\xe9' (esc)
+
+
+hg log (dolphin)
+
+ $ HGENCODING=dolphin hg log
+ abort: unknown encoding: dolphin
+ (please check your locale settings)
+ [255]
+ $ HGENCODING=ascii hg branch `cat latin-1-tag`
+ abort: decoding near '\xe9': 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)! (esc)
+ [255]
+ $ cp latin-1-tag .hg/branch
+ $ HGENCODING=latin-1 hg ci -m 'auto-promote legacy name'
+
+Test roundtrip encoding of lookup tables when not using UTF-8 (issue2763)
+
+ $ HGENCODING=latin-1 hg up `cat latin-1-tag`
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ cd ..
diff --git a/tests/test-eol-add.t b/tests/test-eol-add.t
new file mode 100644
index 0000000..aa06fed
--- /dev/null
+++ b/tests/test-eol-add.t
@@ -0,0 +1,125 @@
+Test adding .hgeol
+
+ $ cat >> $HGRCPATH <<EOF
+ > [diff]
+ > git = 1
+ > EOF
+ $ seteol () {
+ > if [ $1 = "LF" ]; then
+ > EOL='\n'
+ > else
+ > EOL='\r\n'
+ > fi
+ > }
+ $ makerepo () {
+ > echo
+ > echo "# ==== setup repository ===="
+ > echo '% hg init'
+ > hg init repo
+ > cd repo
+ > printf "first\nsecond\nthird\n" > a.txt
+ > hg commit -d '100 0' --addremove -m 'LF commit'
+ > cd ..
+ > }
+ $ dotest () {
+ > seteol $1
+ > echo
+ > echo "% hg clone repo repo-$1"
+ > hg clone repo repo-$1
+ > cd repo-$1
+ > cat > .hg/hgrc <<EOF
+ > [extensions]
+ > eol =
+ > [eol]
+ > native = LF
+ > EOF
+ > cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = native
+ > [repository]
+ > native = $1
+ > EOF
+ > echo '% hg add .hgeol'
+ > hg add .hgeol
+ > echo '% hg status'
+ > hg status
+ > echo '% hg commit'
+ > hg commit -d '200 0' -m 'Added .hgeol file'
+ > echo '% hg status'
+ > hg status
+ > echo '% hg tip -p'
+ > hg tip -p
+ > cd ..
+ > rm -r repo-$1
+ > }
+ $ makerepo
+
+ # ==== setup repository ====
+ % hg init
+ adding a.txt
+ $ dotest LF
+
+ % hg clone repo repo-LF
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg add .hgeol
+ % hg status
+ A .hgeol
+ % hg commit
+ % hg status
+ % hg tip -p
+ changeset: 1:33503edb53b0
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:03:20 1970 +0000
+ summary: Added .hgeol file
+
+ diff --git a/.hgeol b/.hgeol
+ new file mode 100644
+ --- /dev/null
+ +++ b/.hgeol
+ @@ -0,0 +1,4 @@
+ +[patterns]
+ +**.txt = native
+ +[repository]
+ +native = LF
+
+ $ dotest CRLF
+
+ % hg clone repo repo-CRLF
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg add .hgeol
+ % hg status
+ M a.txt
+ A .hgeol
+ % hg commit
+ % hg status
+ % hg tip -p
+ changeset: 1:6e64eaa9eb23
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:03:20 1970 +0000
+ summary: Added .hgeol file
+
+ diff --git a/.hgeol b/.hgeol
+ new file mode 100644
+ --- /dev/null
+ +++ b/.hgeol
+ @@ -0,0 +1,4 @@
+ +[patterns]
+ +**.txt = native
+ +[repository]
+ +native = CRLF
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,3 @@
+ -first
+ -second
+ -third
+ +first\r (esc)
+ +second\r (esc)
+ +third\r (esc)
+
+ $ rm -r repo
diff --git a/tests/test-eol-clone.t b/tests/test-eol-clone.t
new file mode 100644
index 0000000..b9b4358
--- /dev/null
+++ b/tests/test-eol-clone.t
@@ -0,0 +1,76 @@
+Testing cloning with the EOL extension
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > eol =
+ >
+ > [eol]
+ > native = CRLF
+ > EOF
+
+setup repository
+
+ $ hg init repo
+ $ cd repo
+ $ cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = native
+ > EOF
+ $ printf "first\r\nsecond\r\nthird\r\n" > a.txt
+ $ hg commit --addremove -m 'checkin'
+ adding .hgeol
+ adding a.txt
+
+Clone
+
+ $ cd ..
+ $ hg clone repo repo-2
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo-2
+ $ cat a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ $ hg cat a.txt
+ first
+ second
+ third
+ $ hg remove .hgeol
+ $ hg commit -m 'remove eol'
+ $ hg push --quiet
+ $ cd ..
+
+Test clone of repo with .hgeol in working dir, but no .hgeol in tip
+
+ $ hg clone repo repo-3
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo-3
+
+ $ cat a.txt
+ first
+ second
+ third
+
+Test clone of revision with .hgeol
+
+ $ cd ..
+ $ hg clone -r 0 repo repo-4
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo-4
+ $ cat .hgeol
+ [patterns]
+ **.txt = native
+
+ $ cat a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+
+ $ cd ..
diff --git a/tests/test-eol-hook.t b/tests/test-eol-hook.t
new file mode 100644
index 0000000..9fdfe5e
--- /dev/null
+++ b/tests/test-eol-hook.t
@@ -0,0 +1,218 @@
+Test the EOL hook
+
+ $ hg init main
+ $ cat > main/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup = python:hgext.eol.hook
+ > EOF
+ $ hg clone main fork
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd fork
+
+Create repo
+ $ cat > .hgeol <<EOF
+ > [patterns]
+ > mixed.txt = BIN
+ > crlf.txt = CRLF
+ > **.txt = native
+ > EOF
+ $ hg add .hgeol
+ $ hg commit -m 'Commit .hgeol'
+
+ $ printf "first\nsecond\nthird\n" > a.txt
+ $ hg add a.txt
+ $ hg commit -m 'LF a.txt'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
+ $ printf "first\r\nsecond\r\nthird\n" > a.txt
+ $ hg commit -m 'CRLF a.txt'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ a.txt in a8ee6548cd86 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ a.txt in a8ee6548cd86 should not have CRLF line endings
+ [255]
+
+ $ printf "first\nsecond\nthird\n" > a.txt
+ $ hg commit -m 'LF a.txt (fixed)'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+
+ $ printf "first\nsecond\nthird\n" > crlf.txt
+ $ hg add crlf.txt
+ $ hg commit -m 'LF crlf.txt'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ crlf.txt in 004ba2132725 should not have LF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ crlf.txt in 004ba2132725 should not have LF line endings
+ [255]
+
+ $ printf "first\r\nsecond\r\nthird\r\n" > crlf.txt
+ $ hg commit -m 'CRLF crlf.txt (fixed)'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+
+ $ printf "first\r\nsecond" > b.txt
+ $ hg add b.txt
+ $ hg commit -m 'CRLF b.txt'
+ $ hg push ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ [255]
+
+ $ hg up -r -2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ printf "some\nother\nfile" > c.txt
+ $ hg add c.txt
+ $ hg commit -m "LF c.txt, b.txt doesn't exist here"
+ created new head
+ $ hg push -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files (+1 heads)
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ [255]
+
+Test checkheadshook alias
+
+ $ cat > ../main/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup = python:hgext.eol.checkheadshook
+ > EOF
+ $ hg push -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files (+1 heads)
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ [255]
+
+We can fix the head and push again
+
+ $ hg up 6
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ printf "first\nsecond" > b.txt
+ $ hg ci -m "remove CRLF from b.txt"
+ $ hg push -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files (+1 heads)
+ $ hg -R ../main rollback
+ repository tip rolled back to revision 5 (undo push)
+
+Test it still fails with checkallhook
+
+ $ cat > ../main/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup = python:hgext.eol.checkallhook
+ > EOF
+ $ hg push -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files (+1 heads)
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ [255]
+
+But we can push the clean head
+
+ $ hg push -r7 -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Test multiple files/revisions output
+
+ $ printf "another\r\nbad\r\none" > d.txt
+ $ hg add d.txt
+ $ hg ci -m "add d.txt"
+ $ hg push -f ../main
+ pushing to ../main
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files (+1 heads)
+ error: pretxnchangegroup hook failed: end-of-line check failed:
+ d.txt in a7040e68714f should not have CRLF line endings
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ transaction abort!
+ rollback completed
+ abort: end-of-line check failed:
+ d.txt in a7040e68714f should not have CRLF line endings
+ b.txt in fbcf9b1025f5 should not have CRLF line endings
+ [255]
+
+ $ cd ..
diff --git a/tests/test-eol-patch.t b/tests/test-eol-patch.t
new file mode 100644
index 0000000..e2786f8
--- /dev/null
+++ b/tests/test-eol-patch.t
@@ -0,0 +1,400 @@
+Test EOL patching
+
+ $ cat >> $HGRCPATH <<EOF
+ > [diff]
+ > git = 1
+ > EOF
+
+Set up helpers
+
+ $ seteol () {
+ > if [ $1 = "LF" ]; then
+ > EOL='\n'
+ > else
+ > EOL='\r\n'
+ > fi
+ > }
+
+ $ makerepo () {
+ > seteol $1
+ > echo
+ > echo "# ==== setup $1 repository ===="
+ > echo '% hg init'
+ > hg init repo
+ > cd repo
+ > cat > .hgeol <<EOF
+ > [repository]
+ > native = $1
+ > [patterns]
+ > unix.txt = LF
+ > win.txt = CRLF
+ > **.txt = native
+ > EOF
+ > printf "first\r\nsecond\r\nthird\r\n" > win.txt
+ > printf "first\nsecond\nthird\n" > unix.txt
+ > printf "first${EOL}second${EOL}third${EOL}" > native.txt
+ > hg commit --addremove -m 'checkin'
+ > cd ..
+ > }
+
+ $ dotest () {
+ > seteol $1
+ > echo
+ > echo "% hg clone repo repo-$1"
+ > hg clone --noupdate repo repo-$1
+ > cd repo-$1
+ > cat > .hg/hgrc <<EOF
+ > [extensions]
+ > eol =
+ > [eol]
+ > native = $1
+ > EOF
+ > hg update
+ > echo '% native.txt'
+ > cat native.txt
+ > echo '% unix.txt'
+ > cat unix.txt
+ > echo '% win.txt'
+ > cat win.txt
+ > printf "first${EOL}third${EOL}" > native.txt
+ > printf "first\r\nthird\r\n" > win.txt
+ > printf "first\nthird\n" > unix.txt
+ > echo '% hg diff'
+ > hg diff > p
+ > cat p
+ > echo '% hg revert'
+ > hg revert --all
+ > echo '% hg import'
+ > hg import -m 'patch' p
+ > echo '% native.txt'
+ > cat native.txt
+ > echo '% unix.txt'
+ > cat unix.txt
+ > echo '% win.txt'
+ > cat win.txt
+ > echo '% hg diff -c tip'
+ > hg diff -c tip
+ > cd ..
+ > rm -r repo-$1
+ > }
+
+Run tests
+
+ $ makerepo LF
+
+ # ==== setup LF repository ====
+ % hg init
+ adding .hgeol
+ adding native.txt
+ adding unix.txt
+ adding win.txt
+ $ dotest LF
+
+ % hg clone repo repo-LF
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % native.txt
+ first
+ second
+ third
+ % unix.txt
+ first
+ second
+ third
+ % win.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg diff
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg revert
+ reverting native.txt
+ reverting unix.txt
+ reverting win.txt
+ % hg import
+ applying p
+ % native.txt
+ first
+ third
+ % unix.txt
+ first
+ third
+ % win.txt
+ first\r (esc)
+ third\r (esc)
+ % hg diff -c tip
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ $ dotest CRLF
+
+ % hg clone repo repo-CRLF
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % native.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % unix.txt
+ first
+ second
+ third
+ % win.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg diff
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg revert
+ reverting native.txt
+ reverting unix.txt
+ reverting win.txt
+ % hg import
+ applying p
+ % native.txt
+ first\r (esc)
+ third\r (esc)
+ % unix.txt
+ first
+ third
+ % win.txt
+ first\r (esc)
+ third\r (esc)
+ % hg diff -c tip
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ $ rm -r repo
+ $ makerepo CRLF
+
+ # ==== setup CRLF repository ====
+ % hg init
+ adding .hgeol
+ adding native.txt
+ adding unix.txt
+ adding win.txt
+ $ dotest LF
+
+ % hg clone repo repo-LF
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % native.txt
+ first
+ second
+ third
+ % unix.txt
+ first
+ second
+ third
+ % win.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg diff
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg revert
+ reverting native.txt
+ reverting unix.txt
+ reverting win.txt
+ % hg import
+ applying p
+ % native.txt
+ first
+ third
+ % unix.txt
+ first
+ third
+ % win.txt
+ first\r (esc)
+ third\r (esc)
+ % hg diff -c tip
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ $ dotest CRLF
+
+ % hg clone repo repo-CRLF
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % native.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % unix.txt
+ first
+ second
+ third
+ % win.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg diff
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg revert
+ reverting native.txt
+ reverting unix.txt
+ reverting win.txt
+ % hg import
+ applying p
+ % native.txt
+ first\r (esc)
+ third\r (esc)
+ % unix.txt
+ first
+ third
+ % win.txt
+ first\r (esc)
+ third\r (esc)
+ % hg diff -c tip
+ diff --git a/native.txt b/native.txt
+ --- a/native.txt
+ +++ b/native.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ diff --git a/unix.txt b/unix.txt
+ --- a/unix.txt
+ +++ b/unix.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ diff --git a/win.txt b/win.txt
+ --- a/win.txt
+ +++ b/win.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ $ rm -r repo
diff --git a/tests/test-eol-tag.t b/tests/test-eol-tag.t
new file mode 100644
index 0000000..56fad6b
--- /dev/null
+++ b/tests/test-eol-tag.t
@@ -0,0 +1,39 @@
+http://mercurial.selenic.com/bts/issue2493
+
+Testing tagging with the EOL extension
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > eol =
+ >
+ > [eol]
+ > native = CRLF
+ > EOF
+
+setup repository
+
+ $ hg init repo
+ $ cd repo
+ $ cat > .hgeol <<EOF
+ > [patterns]
+ > ** = native
+ > EOF
+ $ printf "first\r\nsecond\r\nthird\r\n" > a.txt
+ $ hg commit --addremove -m 'checkin'
+ adding .hgeol
+ adding a.txt
+
+Tag:
+
+ $ hg tag 1.0
+
+Rewrite .hgtags file as it would look on a new checkout:
+
+ $ hg update -q null
+ $ hg update -q
+
+Touch .hgtags file again:
+
+ $ hg tag 2.0
+
+ $ cd ..
diff --git a/tests/test-eol-update.t b/tests/test-eol-update.t
new file mode 100644
index 0000000..2189cfa
--- /dev/null
+++ b/tests/test-eol-update.t
@@ -0,0 +1,152 @@
+Test EOL update
+
+ $ cat >> $HGRCPATH <<EOF
+ > [diff]
+ > git = 1
+ > EOF
+
+ $ seteol () {
+ > if [ $1 = "LF" ]; then
+ > EOL='\n'
+ > else
+ > EOL='\r\n'
+ > fi
+ > }
+
+ $ makerepo () {
+ > echo
+ > echo "# ==== setup repository ===="
+ > echo '% hg init'
+ > hg init repo
+ > cd repo
+ >
+ > cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = LF
+ > EOF
+ >
+ > printf "first\nsecond\nthird\n" > a.txt
+ > hg commit --addremove -m 'LF commit'
+ >
+ > cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = CRLF
+ > EOF
+ >
+ > printf "first\r\nsecond\r\nthird\r\n" > a.txt
+ > hg commit -m 'CRLF commit'
+ >
+ > cd ..
+ > }
+
+ $ dotest () {
+ > seteol $1
+ >
+ > echo
+ > echo "% hg clone repo repo-$1"
+ > hg clone --noupdate repo repo-$1
+ > cd repo-$1
+ >
+ > cat > .hg/hgrc <<EOF
+ > [extensions]
+ > eol =
+ > EOF
+ >
+ > hg update
+ >
+ > echo '% a.txt (before)'
+ > cat a.txt
+ >
+ > printf "first${EOL}third${EOL}" > a.txt
+ >
+ > echo '% a.txt (after)'
+ > cat a.txt
+ > echo '% hg diff'
+ > hg diff
+ >
+ > echo '% hg update 0'
+ > hg update 0
+ >
+ > echo '% a.txt'
+ > cat a.txt
+ > echo '% hg diff'
+ > hg diff
+ >
+ >
+ > cd ..
+ > rm -r repo-$1
+ > }
+
+ $ makerepo
+
+ # ==== setup repository ====
+ % hg init
+ adding .hgeol
+ adding a.txt
+ $ dotest LF
+
+ % hg clone repo repo-LF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt (before)
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % a.txt (after)
+ first
+ third
+ % hg diff
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg update 0
+ merging a.txt
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first
+ third
+ % hg diff
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ $ dotest CRLF
+
+ % hg clone repo repo-CRLF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt (before)
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % a.txt (after)
+ first\r (esc)
+ third\r (esc)
+ % hg diff
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,2 @@
+ first\r (esc)
+ -second\r (esc)
+ third\r (esc)
+ % hg update 0
+ merging a.txt
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first
+ third
+ % hg diff
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,2 @@
+ first
+ -second
+ third
+ $ rm -r repo
diff --git a/tests/test-eol.t b/tests/test-eol.t
new file mode 100644
index 0000000..2b8f585
--- /dev/null
+++ b/tests/test-eol.t
@@ -0,0 +1,528 @@
+Test EOL extension
+
+ $ cat >> $HGRCPATH <<EOF
+ > [diff]
+ > git = True
+ > EOF
+
+Set up helpers
+
+ $ cat > switch-eol.py <<EOF
+ > import sys
+ > try:
+ > import os, msvcrt
+ > msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
+ > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ > except ImportError:
+ > pass
+ > (old, new) = sys.argv[1] == 'LF' and ('\n', '\r\n') or ('\r\n', '\n')
+ > print "%% switching encoding from %r to %r" % (old, new)
+ > for path in sys.argv[2:]:
+ > data = file(path, 'rb').read()
+ > data = data.replace(old, new)
+ > file(path, 'wb').write(data)
+ > EOF
+
+ $ seteol () {
+ > if [ $1 = "LF" ]; then
+ > EOL='\n'
+ > else
+ > EOL='\r\n'
+ > fi
+ > }
+
+ $ makerepo () {
+ > seteol $1
+ > echo "% setup $1 repository"
+ > hg init repo
+ > cd repo
+ > cat > .hgeol <<EOF
+ > [repository]
+ > native = $1
+ > [patterns]
+ > mixed.txt = BIN
+ > **.txt = native
+ > EOF
+ > printf "first${EOL}second${EOL}third${EOL}" > a.txt
+ > hg commit --addremove -m 'checkin'
+ > echo
+ > cd ..
+ > }
+
+ $ dotest () {
+ > seteol $1
+ > echo "% hg clone repo repo-$1"
+ > hg clone --noupdate repo repo-$1
+ > cd repo-$1
+ > cat > .hg/hgrc <<EOF
+ > [extensions]
+ > eol =
+ > [eol]
+ > native = $1
+ > EOF
+ > hg update
+ > echo '% a.txt'
+ > cat a.txt
+ > echo '% hg cat a.txt'
+ > hg cat a.txt
+ > printf "fourth${EOL}" >> a.txt
+ > echo '% a.txt'
+ > cat a.txt
+ > hg diff
+ > python ../switch-eol.py $1 a.txt
+ > echo '% hg diff only reports a single changed line:'
+ > hg diff
+ > echo "% reverting back to $1 format"
+ > hg revert a.txt
+ > cat a.txt
+ > printf "first\r\nsecond\n" > mixed.txt
+ > hg add mixed.txt
+ > echo "% hg commit of inconsistent .txt file marked as binary (should work)"
+ > hg commit -m 'binary file'
+ > echo "% hg commit of inconsistent .txt file marked as native (should fail)"
+ > printf "first\nsecond\r\nthird\nfourth\r\n" > a.txt
+ > hg commit -m 'inconsistent file'
+ > echo "% hg commit --config eol.only-consistent=False (should work)"
+ > hg commit --config eol.only-consistent=False -m 'inconsistent file'
+ > echo "% hg commit of binary .txt file marked as native (binary files always okay)"
+ > printf "first${EOL}\0${EOL}third${EOL}" > a.txt
+ > hg commit -m 'binary file'
+ > cd ..
+ > rm -r repo-$1
+ > }
+
+ $ makemixedrepo () {
+ > echo
+ > echo "# setup $1 repository"
+ > hg init mixed
+ > cd mixed
+ > printf "foo\r\nbar\r\nbaz\r\n" > win.txt
+ > printf "foo\nbar\nbaz\n" > unix.txt
+ > #printf "foo\r\nbar\nbaz\r\n" > mixed.txt
+ > hg commit --addremove -m 'created mixed files'
+ > echo "# setting repository-native EOLs to $1"
+ > cat > .hgeol <<EOF
+ > [repository]
+ > native = $1
+ > [patterns]
+ > **.txt = native
+ > EOF
+ > hg commit --addremove -m 'added .hgeol'
+ > cd ..
+ > }
+
+ $ testmixed () {
+ > echo
+ > echo "% hg clone mixed mixed-$1"
+ > hg clone mixed mixed-$1
+ > cd mixed-$1
+ > echo '% hg status (eol extension not yet activated)'
+ > hg status
+ > cat > .hg/hgrc <<EOF
+ > [extensions]
+ > eol =
+ > [eol]
+ > native = $1
+ > EOF
+ > echo '% hg status (eol activated)'
+ > hg status
+ > echo '% hg commit'
+ > hg commit -m 'synchronized EOLs'
+ > echo '% hg status'
+ > hg status
+ > cd ..
+ > rm -r mixed-$1
+ > }
+
+Basic tests
+
+ $ makerepo LF
+ % setup LF repository
+ adding .hgeol
+ adding a.txt
+
+ $ dotest LF
+ % hg clone repo repo-LF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first
+ second
+ third
+ % hg cat a.txt
+ first
+ second
+ third
+ % a.txt
+ first
+ second
+ third
+ fourth
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first
+ second
+ third
+ +fourth
+ % switching encoding from '\n' to '\r\n'
+ % hg diff only reports a single changed line:
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first
+ second
+ third
+ +fourth
+ % reverting back to LF format
+ first
+ second
+ third
+ % hg commit of inconsistent .txt file marked as binary (should work)
+ % hg commit of inconsistent .txt file marked as native (should fail)
+ abort: inconsistent newline style in a.txt
+
+ % hg commit --config eol.only-consistent=False (should work)
+ % hg commit of binary .txt file marked as native (binary files always okay)
+ $ dotest CRLF
+ % hg clone repo repo-CRLF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg cat a.txt
+ first
+ second
+ third
+ % a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ fourth\r (esc)
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first
+ second
+ third
+ +fourth
+ % switching encoding from '\r\n' to '\n'
+ % hg diff only reports a single changed line:
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first
+ second
+ third
+ +fourth
+ % reverting back to CRLF format
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg commit of inconsistent .txt file marked as binary (should work)
+ % hg commit of inconsistent .txt file marked as native (should fail)
+ abort: inconsistent newline style in a.txt
+
+ % hg commit --config eol.only-consistent=False (should work)
+ % hg commit of binary .txt file marked as native (binary files always okay)
+ $ rm -r repo
+ $ makerepo CRLF
+ % setup CRLF repository
+ adding .hgeol
+ adding a.txt
+
+ $ dotest LF
+ % hg clone repo repo-LF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first
+ second
+ third
+ % hg cat a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % a.txt
+ first
+ second
+ third
+ fourth
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ +fourth\r (esc)
+ % switching encoding from '\n' to '\r\n'
+ % hg diff only reports a single changed line:
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ +fourth\r (esc)
+ % reverting back to LF format
+ first
+ second
+ third
+ % hg commit of inconsistent .txt file marked as binary (should work)
+ % hg commit of inconsistent .txt file marked as native (should fail)
+ abort: inconsistent newline style in a.txt
+
+ % hg commit --config eol.only-consistent=False (should work)
+ % hg commit of binary .txt file marked as native (binary files always okay)
+ $ dotest CRLF
+ % hg clone repo repo-CRLF
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg cat a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % a.txt
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ fourth\r (esc)
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ +fourth\r (esc)
+ % switching encoding from '\r\n' to '\n'
+ % hg diff only reports a single changed line:
+ diff --git a/a.txt b/a.txt
+ --- a/a.txt
+ +++ b/a.txt
+ @@ -1,3 +1,4 @@
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ +fourth\r (esc)
+ % reverting back to CRLF format
+ first\r (esc)
+ second\r (esc)
+ third\r (esc)
+ % hg commit of inconsistent .txt file marked as binary (should work)
+ % hg commit of inconsistent .txt file marked as native (should fail)
+ abort: inconsistent newline style in a.txt
+
+ % hg commit --config eol.only-consistent=False (should work)
+ % hg commit of binary .txt file marked as native (binary files always okay)
+ $ rm -r repo
+
+Mixed tests
+
+ $ makemixedrepo LF
+
+ # setup LF repository
+ adding unix.txt
+ adding win.txt
+ # setting repository-native EOLs to LF
+ adding .hgeol
+ $ testmixed LF
+
+ % hg clone mixed mixed-LF
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg status (eol extension not yet activated)
+ % hg status (eol activated)
+ M win.txt
+ % hg commit
+ % hg status
+ $ testmixed CRLF
+
+ % hg clone mixed mixed-CRLF
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg status (eol extension not yet activated)
+ % hg status (eol activated)
+ M win.txt
+ % hg commit
+ % hg status
+ $ rm -r mixed
+ $ makemixedrepo CRLF
+
+ # setup CRLF repository
+ adding unix.txt
+ adding win.txt
+ # setting repository-native EOLs to CRLF
+ adding .hgeol
+ $ testmixed LF
+
+ % hg clone mixed mixed-LF
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg status (eol extension not yet activated)
+ % hg status (eol activated)
+ M unix.txt
+ % hg commit
+ % hg status
+ $ testmixed CRLF
+
+ % hg clone mixed mixed-CRLF
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % hg status (eol extension not yet activated)
+ % hg status (eol activated)
+ M unix.txt
+ % hg commit
+ % hg status
+ $ rm -r mixed
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'eol =' >> $HGRCPATH
+
+#if unix-permissions
+
+Test issue2569 -- eol extension takes write lock on reading:
+
+ $ hg init repo
+ $ cd repo
+ $ touch .hgeol
+ $ hg status
+ ? .hgeol
+ $ chmod -R -w .hg
+ $ sleep 1
+ $ touch .hgeol
+ $ hg status --traceback
+ ? .hgeol
+ $ chmod -R u+w .hg
+ $ cd ..
+
+#endif
+
+Test cleverencode: and cleverdecode: aliases for win32text extension
+
+ $ echo '[encode]' >> $HGRCPATH
+ $ echo '**.txt = cleverencode:' >> $HGRCPATH
+ $ echo '[decode]' >> $HGRCPATH
+ $ echo '**.txt = cleverdecode:' >> $HGRCPATH
+
+ $ hg init win32compat
+ $ cd win32compat
+ $ printf "foo\r\nbar\r\nbaz\r\n" > win.txt
+ $ printf "foo\nbar\nbaz\n" > unix.txt
+ $ hg add
+ adding unix.txt
+ adding win.txt
+ $ hg commit -m checkin
+
+Check that both files have LF line-endings in the repository:
+
+ $ hg cat win.txt
+ foo
+ bar
+ baz
+ $ hg cat unix.txt
+ foo
+ bar
+ baz
+
+Test handling of a broken .hgeol file:
+
+ $ touch .hgeol
+ $ hg add .hgeol
+ $ hg commit -m 'clean version'
+ $ echo "bad" > .hgeol
+ $ hg status
+ warning: ignoring .hgeol file due to parse error at .hgeol:1: bad
+ M .hgeol
+ $ hg revert .hgeol
+ warning: ignoring .hgeol file due to parse error at .hgeol:1: bad
+ $ hg status
+ ? .hgeol.orig
+
+Test eol.only-consistent can be specified in .hgeol
+
+ $ cd $TESTTMP
+ $ hg init only-consistent
+ $ cd only-consistent
+ $ printf "first\nsecond\r\n" > a.txt
+ $ hg add a.txt
+ $ cat > .hgeol << EOF
+ > [eol]
+ > only-consistent = True
+ > EOF
+ $ hg commit -m 'inconsistent'
+ abort: inconsistent newline style in a.txt
+
+ [255]
+ $ cat > .hgeol << EOF
+ > [eol]
+ > only-consistent = False
+ > EOF
+ $ hg commit -m 'consistent'
+
+
+Test trailing newline
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > eol=
+ > EOF
+
+setup repository
+
+ $ cd $TESTTMP
+ $ hg init trailing
+ $ cd trailing
+ $ cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = native
+ > [eol]
+ > fix-trailing-newline = False
+ > EOF
+
+add text without trailing newline
+
+ $ printf "first\nsecond" > a.txt
+ $ hg commit --addremove -m 'checking in'
+ adding .hgeol
+ adding a.txt
+ $ rm a.txt
+ $ hg update -C -q
+ $ cat a.txt
+ first
+ second (no-eol)
+
+ $ cat > .hgeol <<EOF
+ > [patterns]
+ > **.txt = native
+ > [eol]
+ > fix-trailing-newline = True
+ > EOF
+ $ printf "third\nfourth" > a.txt
+ $ hg commit -m 'checking in with newline fix'
+ $ rm a.txt
+ $ hg update -C -q
+ $ cat a.txt
+ third
+ fourth
+
+append a line without trailing newline
+
+ $ printf "fifth" >> a.txt
+ $ hg commit -m 'adding another line line'
+ $ rm a.txt
+ $ hg update -C -q
+ $ cat a.txt
+ third
+ fourth
+ fifth
+
+ $ cd ..
diff --git a/tests/test-eolfilename.t b/tests/test-eolfilename.t
new file mode 100644
index 0000000..632d0c0
--- /dev/null
+++ b/tests/test-eolfilename.t
@@ -0,0 +1,72 @@
+http://mercurial.selenic.com/bts/issue352
+
+ $ "$TESTDIR/hghave" eol-in-paths || exit 80
+
+test issue352
+
+ $ hg init foo
+ $ cd foo
+ $ A=`printf 'he\rllo'`
+ $ echo foo > "$A"
+ $ hg add
+ adding he\rllo (esc)
+ abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
+ [255]
+ $ hg ci -A -m m
+ adding he\rllo (esc)
+ abort: '\n' and '\r' disallowed in filenames: 'he\rllo'
+ [255]
+ $ rm "$A"
+ $ echo foo > "hell
+ > o"
+ $ hg add
+ adding hell
+ o
+ abort: '\n' and '\r' disallowed in filenames: 'hell\no'
+ [255]
+ $ hg ci -A -m m
+ adding hell
+ o
+ abort: '\n' and '\r' disallowed in filenames: 'hell\no'
+ [255]
+ $ echo foo > "$A"
+ $ hg debugwalk
+ f he\rllo he\rllo (esc)
+ f hell
+ o hell
+ o
+
+ $ echo bla > quickfox
+ $ hg add quickfox
+ $ hg ci -m 2
+ $ A=`printf 'quick\rfox'`
+ $ hg cp quickfox "$A"
+ abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
+ [255]
+ $ hg mv quickfox "$A"
+ abort: '\n' and '\r' disallowed in filenames: 'quick\rfox'
+ [255]
+
+http://mercurial.selenic.com/bts/issue2036
+
+ $ cd ..
+
+test issue2039
+
+ $ hg init bar
+ $ cd bar
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "color=" >> $HGRCPATH
+ $ echo "[color]" >> $HGRCPATH
+ $ echo "mode = ansi" >> $HGRCPATH
+ $ A=`printf 'foo\nbar'`
+ $ B=`printf 'foo\nbar.baz'`
+ $ touch "$A"
+ $ touch "$B"
+ $ hg status --color=always
+ \x1b[0;35;1;4m? foo\x1b[0m (esc)
+ \x1b[0;35;1;4mbar\x1b[0m (esc)
+ \x1b[0;35;1;4m? foo\x1b[0m (esc)
+ \x1b[0;35;1;4mbar.baz\x1b[0m (esc)
+
+ $ cd ..
diff --git a/tests/test-excessive-merge.t b/tests/test-excessive-merge.t
new file mode 100644
index 0000000..8d324b8
--- /dev/null
+++ b/tests/test-excessive-merge.t
@@ -0,0 +1,101 @@
+ $ hg init
+
+ $ echo foo > a
+ $ echo foo > b
+ $ hg add a b
+
+ $ hg ci -m "test"
+
+ $ echo blah > a
+
+ $ hg ci -m "branch a"
+
+ $ hg co 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo blah > b
+
+ $ hg ci -m "branch b"
+ created new head
+ $ HGMERGE=true hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg ci -m "merge b/a -> blah"
+
+ $ hg co 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ HGMERGE=true hg merge 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "merge a/b -> blah"
+ created new head
+
+ $ hg log
+ changeset: 4:2ee31f665a86
+ tag: tip
+ parent: 1:96155394af80
+ parent: 2:92cc4c306b19
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge a/b -> blah
+
+ changeset: 3:e16a66a37edd
+ parent: 2:92cc4c306b19
+ parent: 1:96155394af80
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge b/a -> blah
+
+ changeset: 2:92cc4c306b19
+ parent: 0:5e0375449e74
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: branch b
+
+ changeset: 1:96155394af80
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: branch a
+
+ changeset: 0:5e0375449e74
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+ $ hg debugindex --changelog
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 60 ..... 0 5e0375449e74 000000000000 000000000000 (re)
+ 1 60 62 ..... 1 96155394af80 5e0375449e74 000000000000 (re)
+ 2 122 62 ..... 2 92cc4c306b19 5e0375449e74 000000000000 (re)
+ 3 184 69 ..... 3 e16a66a37edd 92cc4c306b19 96155394af80 (re)
+ 4 253 29 ..... 4 2ee31f665a86 96155394af80 92cc4c306b19 (re)
+
+revision 1
+ $ hg manifest --debug 1
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 a
+ 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 b
+revision 2
+ $ hg manifest --debug 2
+ 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 a
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 b
+revision 3
+ $ hg manifest --debug 3
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 a
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 b
+revision 4
+ $ hg manifest --debug 4
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 a
+ 79d7492df40aa0fa093ec4209be78043c181f094 644 b
+
+ $ hg debugindex a
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re)
+ 1 5 6 ..... 1 79d7492df40a 2ed2a3912a0b 000000000000 (re)
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 4 total revisions
diff --git a/tests/test-execute-bit.t b/tests/test-execute-bit.t
new file mode 100644
index 0000000..ad49bb2
--- /dev/null
+++ b/tests/test-execute-bit.t
@@ -0,0 +1,28 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ hg init
+ $ echo a > a
+ $ hg ci -Am'not executable'
+ adding a
+
+ $ chmod +x a
+ $ hg ci -m'executable'
+ $ hg id
+ 79abf14474dc tip
+
+Make sure we notice the change of mode if the cached size == -1:
+
+ $ hg rm a
+ $ hg revert -r 0 a
+ $ hg debugstate
+ n 0 -1 unset a
+ $ hg status
+ M a
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ d69afc33ff8a
+ $ test -x a && echo executable -- bad || echo not executable -- good
+ not executable -- good
+
diff --git a/tests/test-export.t b/tests/test-export.t
new file mode 100644
index 0000000..a371f7b
--- /dev/null
+++ b/tests/test-export.t
@@ -0,0 +1,147 @@
+ $ hg init repo
+ $ cd repo
+ $ touch foo
+ $ hg add foo
+ $ for i in 0 1 2 3 4 5 6 7 8 9 10 11; do
+ > echo "foo-$i" >> foo
+ > hg ci -m "foo-$i"
+ > done
+
+ $ for out in "%nof%N" "%%%H" "%b-%R" "%h" "%r" "%m"; do
+ > echo
+ > echo "# foo-$out.patch"
+ > hg export -v -o "foo-$out.patch" 2:tip
+ > done
+
+ # foo-%nof%N.patch
+ exporting patches:
+ foo-01of10.patch
+ foo-02of10.patch
+ foo-03of10.patch
+ foo-04of10.patch
+ foo-05of10.patch
+ foo-06of10.patch
+ foo-07of10.patch
+ foo-08of10.patch
+ foo-09of10.patch
+ foo-10of10.patch
+
+ # foo-%%%H.patch
+ exporting patches:
+ foo-%617188a1c80f869a7b66c85134da88a6fb145f67.patch
+ foo-%dd41a5ff707a5225204105611ba49cc5c229d55f.patch
+ foo-%f95a5410f8664b6e1490a4af654e4b7d41a7b321.patch
+ foo-%4346bcfde53b4d9042489078bcfa9c3e28201db2.patch
+ foo-%afda8c3a009cc99449a05ad8aa4655648c4ecd34.patch
+ foo-%35284ce2b6b99c9d2ac66268fe99e68e1974e1aa.patch
+ foo-%9688c41894e6931305fa7165a37f6568050b4e9b.patch
+ foo-%747d3c68f8ec44bb35816bfcd59aeb50b9654c2f.patch
+ foo-%5f17a83f5fbd9414006a5e563eab4c8a00729efd.patch
+ foo-%f3acbafac161ec68f1598af38f794f28847ca5d3.patch
+
+ # foo-%b-%R.patch
+ exporting patches:
+ foo-repo-2.patch
+ foo-repo-3.patch
+ foo-repo-4.patch
+ foo-repo-5.patch
+ foo-repo-6.patch
+ foo-repo-7.patch
+ foo-repo-8.patch
+ foo-repo-9.patch
+ foo-repo-10.patch
+ foo-repo-11.patch
+
+ # foo-%h.patch
+ exporting patches:
+ foo-617188a1c80f.patch
+ foo-dd41a5ff707a.patch
+ foo-f95a5410f866.patch
+ foo-4346bcfde53b.patch
+ foo-afda8c3a009c.patch
+ foo-35284ce2b6b9.patch
+ foo-9688c41894e6.patch
+ foo-747d3c68f8ec.patch
+ foo-5f17a83f5fbd.patch
+ foo-f3acbafac161.patch
+
+ # foo-%r.patch
+ exporting patches:
+ foo-02.patch
+ foo-03.patch
+ foo-04.patch
+ foo-05.patch
+ foo-06.patch
+ foo-07.patch
+ foo-08.patch
+ foo-09.patch
+ foo-10.patch
+ foo-11.patch
+
+ # foo-%m.patch
+ exporting patches:
+ foo-foo_2.patch
+ foo-foo_3.patch
+ foo-foo_4.patch
+ foo-foo_5.patch
+ foo-foo_6.patch
+ foo-foo_7.patch
+ foo-foo_8.patch
+ foo-foo_9.patch
+ foo-foo_10.patch
+ foo-foo_11.patch
+
+Exporting 4 changesets to a file:
+
+ $ hg export -o export_internal 1 2 3 4
+ $ grep HG export_internal | wc -l
+ \s*4 (re)
+
+Exporting 4 changesets to a file:
+
+ $ hg export 1 2 3 4 | grep HG | wc -l
+ \s*4 (re)
+
+Exporting revision -2 to a file:
+
+ $ hg export -- -2
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 5f17a83f5fbd9414006a5e563eab4c8a00729efd
+ # Parent 747d3c68f8ec44bb35816bfcd59aeb50b9654c2f
+ foo-10
+
+ diff -r 747d3c68f8ec -r 5f17a83f5fbd foo
+ --- a/foo Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -8,3 +8,4 @@
+ foo-7
+ foo-8
+ foo-9
+ +foo-10
+
+Checking if only alphanumeric characters are used in the file name (%m option):
+
+ $ echo "line" >> foo
+ $ hg commit -m " !\"#$%&(,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}~"
+ $ hg export -v -o %m.patch tip
+ exporting patch:
+ ____________0123456789_______ABCDEFGHIJKLMNOPQRSTUVWXYZ______abcdefghijklmnopqrstuvwxyz____.patch
+
+Catch exporting unknown revisions (especially empty revsets, see issue3353)
+
+ $ hg export
+ abort: export requires at least one changeset
+ [255]
+ $ hg export ""
+ hg: parse error: empty query
+ [255]
+ $ hg export 999
+ abort: unknown revision '999'!
+ [255]
+ $ hg export "not all()"
+ abort: export requires at least one changeset
+ [255]
+
+ $ cd ..
diff --git a/tests/test-extdiff.t b/tests/test-extdiff.t
new file mode 100644
index 0000000..d4190c4
--- /dev/null
+++ b/tests/test-extdiff.t
@@ -0,0 +1,204 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "extdiff=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ echo b > b
+ $ hg add
+ adding a
+ adding b
+
+Should diff cloned directories:
+
+ $ hg extdiff -o -r $opt
+ Only in a: a
+ Only in a: b
+ [1]
+
+ $ echo "[extdiff]" >> $HGRCPATH
+ $ echo "cmd.falabala=echo" >> $HGRCPATH
+ $ echo "opts.falabala=diffing" >> $HGRCPATH
+
+ $ hg falabala
+ diffing a.000000000000 a
+ [1]
+
+ $ hg help falabala
+ hg falabala [OPTION]... [FILE]...
+
+ use 'echo' to diff repository (or selected files)
+
+ Show differences between revisions for the specified files, using the
+ 'echo' program.
+
+ When two revision arguments are given, then changes are shown between
+ those revisions. If only one revision is specified then that revision is
+ compared to the working directory, and, when no revisions are specified,
+ the working directory files are compared to its parent.
+
+ options:
+
+ -o --option OPT [+] pass option to comparison program
+ -r --rev REV [+] revision
+ -c --change REV change made by revision
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help falabala" to show more info
+
+ $ hg ci -d '0 0' -mtest1
+
+ $ echo b >> a
+ $ hg ci -d '1 0' -mtest2
+
+Should diff cloned files directly:
+
+ $ hg falabala -r 0:1
+ diffing */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+Test diff during merge:
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo c >> c
+ $ hg add c
+ $ hg ci -m "new branch" -d '1 0'
+ created new head
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Should diff cloned file against wc file:
+
+ $ hg falabala
+ diffing */extdiff.*/a.2a13a4d2da36/a */a/a (glob)
+ [1]
+
+
+Test --change option:
+
+ $ hg ci -d '2 0' -mtest3
+ $ hg falabala -c 1
+ diffing */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+Check diff are made from the first parent:
+
+ $ hg falabala -c 3 || echo "diff-like tools yield a non-zero exit code"
+ diffing */extdiff.*/a.2a13a4d2da36/a a.46c0e4daeb72/a (glob)
+ diff-like tools yield a non-zero exit code
+
+#if execbit
+
+Test extdiff of multiple files in tmp dir:
+
+ $ hg update -C 0 > /dev/null
+ $ echo changed > a
+ $ echo changed > b
+ $ chmod +x b
+
+Diff in working directory, before:
+
+ $ hg diff --git
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -a
+ +changed
+ diff --git a/b b/b
+ old mode 100644
+ new mode 100755
+ --- a/b
+ +++ b/b
+ @@ -1,1 +1,1 @@
+ -b
+ +changed
+
+
+Edit with extdiff -p:
+
+Prepare custom diff/edit tool:
+
+ $ cat > 'diff tool.py' << EOT
+ > #!/usr/bin/env python
+ > import time
+ > time.sleep(1) # avoid unchanged-timestamp problems
+ > file('a/a', 'ab').write('edited\n')
+ > file('a/b', 'ab').write('edited\n')
+ > EOT
+
+ $ chmod +x 'diff tool.py'
+
+will change to /tmp/extdiff.TMP and populate directories a.TMP and a
+and start tool
+
+ $ hg extdiff -p "`pwd`/diff tool.py"
+ [1]
+
+Diff in working directory, after:
+
+ $ hg diff --git
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ -a
+ +changed
+ +edited
+ diff --git a/b b/b
+ old mode 100644
+ new mode 100755
+ --- a/b
+ +++ b/b
+ @@ -1,1 +1,2 @@
+ -b
+ +changed
+ +edited
+
+Test extdiff with --option:
+
+ $ hg extdiff -p echo -o this -c 1
+ this */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+ $ hg falabala -o this -c 1
+ diffing this */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+Test with revsets:
+
+ $ hg extdif -p echo -c "rev(1)"
+ */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+ $ hg extdif -p echo -r "0::1"
+ */extdiff.*/a.8a5febb7f867/a a.34eed99112ab/a (glob)
+ [1]
+
+ $ cd ..
+
+#endif
+
+#if symlink
+
+Test symlinks handling (issue1909)
+
+ $ hg init testsymlinks
+ $ cd testsymlinks
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo a >> a
+ $ ln -s missing linka
+ $ hg add linka
+ $ hg falabala -r 0 --traceback
+ diffing testsymlinks.07f494440405 testsymlinks
+ [1]
+ $ cd ..
+
+#endif
diff --git a/tests/test-extension.t b/tests/test-extension.t
new file mode 100644
index 0000000..0f4be50
--- /dev/null
+++ b/tests/test-extension.t
@@ -0,0 +1,561 @@
+Test basic extension support
+
+ $ cat > foobar.py <<EOF
+ > import os
+ > from mercurial import commands
+ >
+ > def uisetup(ui):
+ > ui.write("uisetup called\\n")
+ >
+ > def reposetup(ui, repo):
+ > ui.write("reposetup called for %s\\n" % os.path.basename(repo.root))
+ > ui.write("ui %s= repo.ui\\n" % (ui == repo.ui and "=" or "!"))
+ >
+ > def foo(ui, *args, **kwargs):
+ > ui.write("Foo\\n")
+ >
+ > def bar(ui, *args, **kwargs):
+ > ui.write("Bar\\n")
+ >
+ > cmdtable = {
+ > "foo": (foo, [], "hg foo"),
+ > "bar": (bar, [], "hg bar"),
+ > }
+ >
+ > commands.norepo += ' bar'
+ > EOF
+ $ abspath=`pwd`/foobar.py
+
+ $ mkdir barfoo
+ $ cp foobar.py barfoo/__init__.py
+ $ barfoopath=`pwd`/barfoo
+
+ $ hg init a
+ $ cd a
+ $ echo foo > file
+ $ hg add file
+ $ hg commit -m 'add file'
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "foobar = $abspath" >> $HGRCPATH
+ $ hg foo
+ uisetup called
+ reposetup called for a
+ ui == repo.ui
+ Foo
+
+ $ cd ..
+ $ hg clone a b
+ uisetup called
+ reposetup called for a
+ ui == repo.ui
+ reposetup called for b
+ ui == repo.ui
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg bar
+ uisetup called
+ Bar
+ $ echo 'foobar = !' >> $HGRCPATH
+
+module/__init__.py-style
+
+ $ echo "barfoo = $barfoopath" >> $HGRCPATH
+ $ cd a
+ $ hg foo
+ uisetup called
+ reposetup called for a
+ ui == repo.ui
+ Foo
+ $ echo 'barfoo = !' >> $HGRCPATH
+
+Check that extensions are loaded in phases:
+
+ $ cat > foo.py <<EOF
+ > import os
+ > name = os.path.basename(__file__).rsplit('.', 1)[0]
+ > print "1) %s imported" % name
+ > def uisetup(ui):
+ > print "2) %s uisetup" % name
+ > def extsetup():
+ > print "3) %s extsetup" % name
+ > def reposetup(ui, repo):
+ > print "4) %s reposetup" % name
+ > EOF
+
+ $ cp foo.py bar.py
+ $ echo 'foo = foo.py' >> $HGRCPATH
+ $ echo 'bar = bar.py' >> $HGRCPATH
+
+Command with no output, we just want to see the extensions loaded:
+
+ $ hg paths
+ 1) foo imported
+ 1) bar imported
+ 2) foo uisetup
+ 2) bar uisetup
+ 3) foo extsetup
+ 3) bar extsetup
+ 4) foo reposetup
+ 4) bar reposetup
+
+Check hgweb's load order:
+
+ $ cat > hgweb.cgi <<EOF
+ > #!/usr/bin/env python
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgweb
+ > from mercurial.hgweb import wsgicgi
+ >
+ > application = hgweb('.', 'test repo')
+ > wsgicgi.launch(application)
+ > EOF
+
+ $ SCRIPT_NAME='/' SERVER_PORT='80' SERVER_NAME='localhost' python hgweb.cgi \
+ > | grep '^[0-9]) ' # ignores HTML output
+ 1) foo imported
+ 1) bar imported
+ 2) foo uisetup
+ 2) bar uisetup
+ 3) foo extsetup
+ 3) bar extsetup
+ 4) foo reposetup
+ 4) bar reposetup
+ 4) foo reposetup
+ 4) bar reposetup
+
+ $ echo 'foo = !' >> $HGRCPATH
+ $ echo 'bar = !' >> $HGRCPATH
+
+ $ cd ..
+
+hide outer repo
+ $ hg init
+
+ $ cat > empty.py <<EOF
+ > '''empty cmdtable
+ > '''
+ > cmdtable = {}
+ > EOF
+ $ emptypath=`pwd`/empty.py
+ $ echo "empty = $emptypath" >> $HGRCPATH
+ $ hg help empty
+ empty extension - empty cmdtable
+
+ no commands defined
+
+ $ echo 'empty = !' >> $HGRCPATH
+
+ $ cat > debugextension.py <<EOF
+ > '''only debugcommands
+ > '''
+ > def debugfoobar(ui, repo, *args, **opts):
+ > "yet another debug command"
+ > pass
+ >
+ > def foo(ui, repo, *args, **opts):
+ > """yet another foo command
+ >
+ > This command has been DEPRECATED since forever.
+ > """
+ > pass
+ >
+ > cmdtable = {
+ > "debugfoobar": (debugfoobar, (), "hg debugfoobar"),
+ > "foo": (foo, (), "hg foo")
+ > }
+ > EOF
+ $ debugpath=`pwd`/debugextension.py
+ $ echo "debugextension = $debugpath" >> $HGRCPATH
+
+ $ hg help debugextension
+ debugextension extension - only debugcommands
+
+ no commands defined
+
+ $ hg --verbose help debugextension
+ debugextension extension - only debugcommands
+
+ list of commands:
+
+ foo yet another foo command
+
+ global options:
+
+ -R --repository REPO repository root directory or name of overlay bundle
+ file
+ --cwd DIR change working directory
+ -y --noninteractive do not prompt, automatically pick the first choice for
+ all prompts
+ -q --quiet suppress output
+ -v --verbose enable additional output
+ --config CONFIG [+] set/override config option (use 'section.name=value')
+ --debug enable debugging output
+ --debugger start debugger
+ --encoding ENCODE set the charset encoding (default: ascii)
+ --encodingmode MODE set the charset encoding mode (default: strict)
+ --traceback always print a traceback on exception
+ --time time how long the command takes
+ --profile print command execution profile
+ --version output version information and exit
+ -h --help display help and exit
+
+ [+] marked option can be specified multiple times
+
+ $ hg --debug help debugextension
+ debugextension extension - only debugcommands
+
+ list of commands:
+
+ debugfoobar yet another debug command
+ foo yet another foo command
+
+ global options:
+
+ -R --repository REPO repository root directory or name of overlay bundle
+ file
+ --cwd DIR change working directory
+ -y --noninteractive do not prompt, automatically pick the first choice for
+ all prompts
+ -q --quiet suppress output
+ -v --verbose enable additional output
+ --config CONFIG [+] set/override config option (use 'section.name=value')
+ --debug enable debugging output
+ --debugger start debugger
+ --encoding ENCODE set the charset encoding (default: ascii)
+ --encodingmode MODE set the charset encoding mode (default: strict)
+ --traceback always print a traceback on exception
+ --time time how long the command takes
+ --profile print command execution profile
+ --version output version information and exit
+ -h --help display help and exit
+
+ [+] marked option can be specified multiple times
+ $ echo 'debugextension = !' >> $HGRCPATH
+
+Extension module help vs command help:
+
+ $ echo 'extdiff =' >> $HGRCPATH
+ $ hg help extdiff
+ hg extdiff [OPT]... [FILE]...
+
+ use external program to diff repository (or selected files)
+
+ Show differences between revisions for the specified files, using an
+ external program. The default program used is diff, with default options
+ "-Npru".
+
+ To select a different program, use the -p/--program option. The program
+ will be passed the names of two directories to compare. To pass additional
+ options to the program, use -o/--option. These will be passed before the
+ names of the directories to compare.
+
+ When two revision arguments are given, then changes are shown between
+ those revisions. If only one revision is specified then that revision is
+ compared to the working directory, and, when no revisions are specified,
+ the working directory files are compared to its parent.
+
+ use "hg help -e extdiff" to show help for the extdiff extension
+
+ options:
+
+ -p --program CMD comparison program to run
+ -o --option OPT [+] pass option to comparison program
+ -r --rev REV [+] revision
+ -c --change REV change made by revision
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help extdiff" to show more info
+
+ $ hg help --extension extdiff
+ extdiff extension - command to allow external programs to compare revisions
+
+ The extdiff Mercurial extension allows you to use external programs to compare
+ revisions, or revision with working directory. The external diff programs are
+ called with a configurable set of options and two non-option arguments: paths
+ to directories containing snapshots of files to compare.
+
+ The extdiff extension also allows you to configure new diff commands, so you
+ do not need to type "hg extdiff -p kdiff3" always.
+
+ [extdiff]
+ # add new command that runs GNU diff(1) in 'context diff' mode
+ cdiff = gdiff -Nprc5
+ ## or the old way:
+ #cmd.cdiff = gdiff
+ #opts.cdiff = -Nprc5
+
+ # add new command called vdiff, runs kdiff3
+ vdiff = kdiff3
+
+ # add new command called meld, runs meld (no need to name twice)
+ meld =
+
+ # add new command called vimdiff, runs gvimdiff with DirDiff plugin
+ # (see http://www.vim.org/scripts/script.php?script_id=102) Non
+ # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
+ # your .vimrc
+ vimdiff = gvim -f "+next" \
+ "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
+
+ Tool arguments can include variables that are expanded at runtime:
+
+ $parent1, $plabel1 - filename, descriptive label of first parent
+ $child, $clabel - filename, descriptive label of child revision
+ $parent2, $plabel2 - filename, descriptive label of second parent
+ $root - repository root
+ $parent is an alias for $parent1.
+
+ The extdiff extension will look in your [diff-tools] and [merge-tools]
+ sections for diff tool arguments, when none are specified in [extdiff].
+
+ [extdiff]
+ kdiff3 =
+
+ [diff-tools]
+ kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
+
+ You can use -I/-X and list of file or directory names like normal "hg diff"
+ command. The extdiff extension makes snapshots of only needed files, so
+ running the external diff program will actually be pretty fast (at least
+ faster than having to compare the entire tree).
+
+ list of commands:
+
+ extdiff use external program to diff repository (or selected files)
+
+ use "hg -v help extdiff" to show builtin aliases and global options
+
+ $ echo 'extdiff = !' >> $HGRCPATH
+
+Test help topic with same name as extension
+
+ $ cat > multirevs.py <<EOF
+ > from mercurial import commands
+ > """multirevs extension
+ > Big multi-line module docstring."""
+ > def multirevs(ui, repo, arg, *args, **opts):
+ > """multirevs command"""
+ > pass
+ > cmdtable = {
+ > "multirevs": (multirevs, [], 'ARG')
+ > }
+ > commands.norepo += ' multirevs'
+ > EOF
+ $ echo "multirevs = multirevs.py" >> $HGRCPATH
+
+ $ hg help multirevs
+ Specifying Multiple Revisions
+
+ When Mercurial accepts more than one revision, they may be specified
+ individually, or provided as a topologically continuous range, separated
+ by the ":" character.
+
+ The syntax of range notation is [BEGIN]:[END], where BEGIN and END are
+ revision identifiers. Both BEGIN and END are optional. If BEGIN is not
+ specified, it defaults to revision number 0. If END is not specified, it
+ defaults to the tip. The range ":" thus means "all revisions".
+
+ If BEGIN is greater than END, revisions are treated in reverse order.
+
+ A range acts as a closed interval. This means that a range of 3:5 gives 3,
+ 4 and 5. Similarly, a range of 9:6 gives 9, 8, 7, and 6.
+
+ use "hg help -c multirevs" to see help for the multirevs command
+
+ $ hg help -c multirevs
+ hg multirevs ARG
+
+ multirevs command
+
+ use "hg -v help multirevs" to show more info
+
+ $ hg multirevs
+ hg multirevs: invalid arguments
+ hg multirevs ARG
+
+ multirevs command
+
+ use "hg help multirevs" to show the full help text
+ [255]
+
+ $ echo "multirevs = !" >> $HGRCPATH
+
+Issue811: Problem loading extensions twice (by site and by user)
+
+ $ debugpath=`pwd`/debugissue811.py
+ $ cat > debugissue811.py <<EOF
+ > '''show all loaded extensions
+ > '''
+ > from mercurial import extensions, commands
+ >
+ > def debugextensions(ui):
+ > "yet another debug command"
+ > ui.write("%s\n" % '\n'.join([x for x, y in extensions.extensions()]))
+ >
+ > cmdtable = {"debugextensions": (debugextensions, (), "hg debugextensions")}
+ > commands.norepo += " debugextensions"
+ > EOF
+ $ echo "debugissue811 = $debugpath" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "hgext.mq=" >> $HGRCPATH
+ $ echo "hgext/mq=" >> $HGRCPATH
+
+Show extensions:
+
+ $ hg debugextensions
+ debugissue811
+ mq
+
+Disabled extension commands:
+
+ $ HGRCPATH=
+ $ export HGRCPATH
+ $ hg help email
+ 'email' is provided by the following extension:
+
+ patchbomb command to send changesets as (a series of) patch emails
+
+ use "hg help extensions" for information on enabling extensions
+ $ hg qdel
+ hg: unknown command 'qdel'
+ 'qdelete' is provided by the following extension:
+
+ mq manage a stack of patches
+
+ use "hg help extensions" for information on enabling extensions
+ [255]
+ $ hg churn
+ hg: unknown command 'churn'
+ 'churn' is provided by the following extension:
+
+ churn command to display statistics about repository history
+
+ use "hg help extensions" for information on enabling extensions
+ [255]
+
+Disabled extensions:
+
+ $ hg help churn
+ churn extension - command to display statistics about repository history
+
+ use "hg help extensions" for information on enabling extensions
+ $ hg help patchbomb
+ patchbomb extension - command to send changesets as (a series of) patch emails
+
+ use "hg help extensions" for information on enabling extensions
+
+Broken disabled extension and command:
+
+ $ mkdir hgext
+ $ echo > hgext/__init__.py
+ $ cat > hgext/broken.py <<EOF
+ > "broken extension'
+ > EOF
+ $ cat > path.py <<EOF
+ > import os, sys
+ > sys.path.insert(0, os.environ['HGEXTPATH'])
+ > EOF
+ $ HGEXTPATH=`pwd`
+ $ export HGEXTPATH
+
+ $ hg --config extensions.path=./path.py help broken
+ broken extension - (no help text available)
+
+ use "hg help extensions" for information on enabling extensions
+
+ $ cat > hgext/forest.py <<EOF
+ > cmdtable = None
+ > EOF
+ $ hg --config extensions.path=./path.py help foo > /dev/null
+ warning: error finding commands in $TESTTMP/hgext/forest.py (glob)
+ hg: unknown command 'foo'
+ warning: error finding commands in $TESTTMP/hgext/forest.py (glob)
+ [255]
+
+ $ cat > throw.py <<EOF
+ > from mercurial import cmdutil, commands
+ > cmdtable = {}
+ > command = cmdutil.command(cmdtable)
+ > class Bogon(Exception): pass
+ >
+ > @command('throw', [], 'hg throw')
+ > def throw(ui, **opts):
+ > """throws an exception"""
+ > raise Bogon()
+ > commands.norepo += " throw"
+ > EOF
+No declared supported version, extension complains:
+ $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*'
+ ** Unknown exception encountered with possibly-broken third-party extension throw
+ ** which supports versions unknown of Mercurial.
+ ** Please disable throw and try your action again.
+ ** If that fixes the bug please report it to the extension author.
+ ** Python * (glob)
+ ** Mercurial Distributed SCM * (glob)
+ ** Extensions loaded: throw
+If the extension specifies a buglink, show that:
+ $ echo 'buglink = "http://example.com/bts"' >> throw.py
+ $ rm -f throw.pyc throw.pyo
+ $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*'
+ ** Unknown exception encountered with possibly-broken third-party extension throw
+ ** which supports versions unknown of Mercurial.
+ ** Please disable throw and try your action again.
+ ** If that fixes the bug please report it to http://example.com/bts
+ ** Python * (glob)
+ ** Mercurial Distributed SCM (*) (glob)
+ ** Extensions loaded: throw
+If the extensions declare outdated versions, accuse the older extension first:
+ $ echo "from mercurial import util" >> older.py
+ $ echo "util.version = lambda:'2.2'" >> older.py
+ $ echo "testedwith = '1.9.3'" >> older.py
+ $ echo "testedwith = '2.1.1'" >> throw.py
+ $ rm -f throw.pyc throw.pyo
+ $ hg --config extensions.throw=throw.py --config extensions.older=older.py \
+ > throw 2>&1 | egrep '^\*\*'
+ ** Unknown exception encountered with possibly-broken third-party extension older
+ ** which supports versions 1.9.3 of Mercurial.
+ ** Please disable older and try your action again.
+ ** If that fixes the bug please report it to the extension author.
+ ** Python * (glob)
+ ** Mercurial Distributed SCM (version 2.2)
+ ** Extensions loaded: throw, older
+One extension only tested with older, one only with newer versions:
+ $ echo "util.version = lambda:'2.1.0'" >> older.py
+ $ rm -f older.pyc older.pyo
+ $ hg --config extensions.throw=throw.py --config extensions.older=older.py \
+ > throw 2>&1 | egrep '^\*\*'
+ ** Unknown exception encountered with possibly-broken third-party extension older
+ ** which supports versions 1.9.3 of Mercurial.
+ ** Please disable older and try your action again.
+ ** If that fixes the bug please report it to the extension author.
+ ** Python * (glob)
+ ** Mercurial Distributed SCM (version 2.1.0)
+ ** Extensions loaded: throw, older
+Older extension is tested with current version, the other only with newer:
+ $ echo "util.version = lambda:'1.9.3'" >> older.py
+ $ rm -f older.pyc older.pyo
+ $ hg --config extensions.throw=throw.py --config extensions.older=older.py \
+ > throw 2>&1 | egrep '^\*\*'
+ ** Unknown exception encountered with possibly-broken third-party extension throw
+ ** which supports versions 2.1.1 of Mercurial.
+ ** Please disable throw and try your action again.
+ ** If that fixes the bug please report it to http://example.com/bts
+ ** Python * (glob)
+ ** Mercurial Distributed SCM (version 1.9.3)
+ ** Extensions loaded: throw, older
+
+Declare the version as supporting this hg version, show regular bts link:
+ $ hgver=`python -c 'from mercurial import util; print util.version().split("+")[0]'`
+ $ echo 'testedwith = """'"$hgver"'"""' >> throw.py
+ $ rm -f throw.pyc throw.pyo
+ $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*'
+ ** unknown exception encountered, please report by visiting
+ ** http://mercurial.selenic.com/wiki/BugTracker
+ ** Python * (glob)
+ ** Mercurial Distributed SCM (*) (glob)
+ ** Extensions loaded: throw
diff --git a/tests/test-extra-filelog-entry.t b/tests/test-extra-filelog-entry.t
new file mode 100644
index 0000000..701e23b
--- /dev/null
+++ b/tests/test-extra-filelog-entry.t
@@ -0,0 +1,21 @@
+Issue351: mq: qrefresh can create extra revlog entry
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init
+ $ hg qinit
+
+ $ echo b > b
+ $ hg ci -A -m foo
+ adding b
+
+ $ echo cc > b
+ $ hg qnew -f foo.diff
+ $ echo b > b
+ $ hg qrefresh
+
+ $ hg debugindex b
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 1e88685f5dde 000000000000 000000000000 (re)
+
diff --git a/tests/test-fetch.t b/tests/test-fetch.t
new file mode 100644
index 0000000..d52742f
--- /dev/null
+++ b/tests/test-fetch.t
@@ -0,0 +1,414 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "fetch=" >> $HGRCPATH
+
+test fetch with default branches only
+
+ $ hg init a
+ $ echo a > a/a
+ $ hg --cwd a commit -Ama
+ adding a
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone a c
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > a/b
+ $ hg --cwd a commit -Amb
+ adding b
+ $ hg --cwd a parents -q
+ 1:d2ae7f538514
+
+should pull one change
+
+ $ hg --cwd b fetch ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b parents -q
+ 1:d2ae7f538514
+ $ echo c > c/c
+ $ hg --cwd c commit -Amc
+ adding c
+ $ hg clone c d
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone c e
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+We cannot use the default commit message if fetching from a local
+repo, because the path of the repo will be included in the commit
+message, making every commit appear different.
+should merge c into a
+
+ $ hg --cwd c fetch -d '0 0' -m 'automated merge' ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ updating to 2:d2ae7f538514
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ merging with 1:d36c0562f908
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ new changeset 3:a323a0c43ec4 merges remote changes with local
+ $ ls c
+ a
+ b
+ c
+ $ hg --cwd a serve -a localhost -p $HGPORT -d --pid-file=hg.pid
+ $ cat a/hg.pid >> "$DAEMON_PIDS"
+
+fetch over http, no auth
+
+ $ hg --cwd d fetch http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ updating to 2:d2ae7f538514
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ merging with 1:d36c0562f908
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ new changeset 3:* merges remote changes with local (glob)
+ $ hg --cwd d tip --template '{desc}\n'
+ Automated merge with http://localhost:$HGPORT/
+
+fetch over http with auth (should be hidden in desc)
+
+ $ hg --cwd e fetch http://user:password@localhost:$HGPORT/
+ pulling from http://user:***@localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ updating to 2:d2ae7f538514
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ merging with 1:d36c0562f908
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ new changeset 3:* merges remote changes with local (glob)
+ $ hg --cwd e tip --template '{desc}\n'
+ Automated merge with http://localhost:$HGPORT/
+ $ hg clone a f
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone a g
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo f > f/f
+ $ hg --cwd f ci -Amf
+ adding f
+ $ echo g > g/g
+ $ hg --cwd g ci -Amg
+ adding g
+ $ hg clone -q f h
+ $ hg clone -q g i
+
+should merge f into g
+
+ $ hg --cwd g fetch -d '0 0' --switch -m 'automated merge' ../f
+ pulling from ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ merging with 3:6343ca3eff20
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ new changeset 4:f7faa0b7d3c6 merges remote changes with local
+ $ rm i/g
+
+should abort, because i is modified
+
+ $ hg --cwd i fetch ../h
+ abort: working directory is missing some files
+ [255]
+
+test fetch with named branches
+
+ $ hg init nbase
+ $ echo base > nbase/a
+ $ hg -R nbase ci -Am base
+ adding a
+ $ hg -R nbase branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a > nbase/a
+ $ hg -R nbase ci -m a
+ $ hg -R nbase up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R nbase branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > nbase/b
+ $ hg -R nbase ci -Am b
+ adding b
+
+pull in change on foreign branch
+
+ $ hg clone nbase n1
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone nbase n2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n1 up -C a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo aa > n1/a
+ $ hg -R n1 ci -m a1
+ $ hg -R n2 up -C b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n2 fetch -m 'merge' n1
+ pulling from n1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+parent should be 2 (no automatic update)
+
+ $ hg -R n2 parents --template '{rev}\n'
+ 2
+ $ rm -fr n1 n2
+
+pull in changes on both foreign and local branches
+
+ $ hg clone nbase n1
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone nbase n2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n1 up -C a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo aa > n1/a
+ $ hg -R n1 ci -m a1
+ $ hg -R n1 up -C b
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo bb > n1/b
+ $ hg -R n1 ci -m b1
+ $ hg -R n2 up -C b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n2 fetch -m 'merge' n1
+ pulling from n1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+parent should be 4 (fast forward)
+
+ $ hg -R n2 parents --template '{rev}\n'
+ 4
+ $ rm -fr n1 n2
+
+pull changes on foreign (2 new heads) and local (1 new head) branches
+with a local change
+
+ $ hg clone nbase n1
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone nbase n2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n1 up -C a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a1 > n1/a
+ $ hg -R n1 ci -m a1
+ $ hg -R n1 up -C b
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo bb > n1/b
+ $ hg -R n1 ci -m b1
+ $ hg -R n1 up -C 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a2 > n1/a
+ $ hg -R n1 ci -m a2
+ created new head
+ $ hg -R n2 up -C b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo change >> n2/c
+ $ hg -R n2 ci -A -m local
+ adding c
+ $ hg -R n2 fetch -d '0 0' -m 'merge' n1
+ pulling from n1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files (+2 heads)
+ updating to 5:3c4a837a864f
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ merging with 3:1267f84a9ea5
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ new changeset 7:2cf2a1261f21 merges remote changes with local
+
+parent should be 7 (new merge changeset)
+
+ $ hg -R n2 parents --template '{rev}\n'
+ 7
+ $ rm -fr n1 n2
+
+pull in changes on foreign (merge of local branch) and local (2 new
+heads) with a local change
+
+ $ hg clone nbase n1
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone nbase n2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n1 up -C a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R n1 merge b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg -R n1 ci -m merge
+ $ hg -R n1 up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo c > n1/a
+ $ hg -R n1 ci -m c
+ $ hg -R n1 up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo cc > n1/a
+ $ hg -R n1 ci -m cc
+ created new head
+ $ hg -R n2 up -C b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo change >> n2/b
+ $ hg -R n2 ci -A -m local
+ $ hg -R n2 fetch -m 'merge' n1
+ pulling from n1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 1 files (+2 heads)
+ not merging with 1 other new branch heads (use "hg heads ." and "hg merge" to merge them)
+ [1]
+
+parent should be 3 (fetch did not merge anything)
+
+ $ hg -R n2 parents --template '{rev}\n'
+ 3
+ $ rm -fr n1 n2
+
+pull in change on different branch than dirstate
+
+ $ hg init n1
+ $ echo a > n1/a
+ $ hg -R n1 ci -Am initial
+ adding a
+ $ hg clone n1 n2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > n1/a
+ $ hg -R n1 ci -m next
+ $ hg -R n2 branch topic
+ marked working directory as branch topic
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg -R n2 fetch -m merge n1
+ abort: working dir not at branch tip (use "hg update" to check out branch tip)
+ [255]
+
+parent should be 0 (fetch did not update or merge anything)
+
+ $ hg -R n2 parents --template '{rev}\n'
+ 0
+ $ rm -fr n1 n2
+
+test fetch with inactive branches
+
+ $ hg init ib1
+ $ echo a > ib1/a
+ $ hg --cwd ib1 ci -Am base
+ adding a
+ $ hg --cwd ib1 branch second
+ marked working directory as branch second
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > ib1/b
+ $ hg --cwd ib1 ci -Am onsecond
+ adding b
+ $ hg --cwd ib1 branch -f default
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo c > ib1/c
+ $ hg --cwd ib1 ci -Am newdefault
+ adding c
+ created new head
+ $ hg clone ib1 ib2
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+fetch should succeed
+
+ $ hg --cwd ib2 fetch ../ib1
+ pulling from ../ib1
+ searching for changes
+ no changes found
+ $ rm -fr ib1 ib2
+
+test issue1726
+
+ $ hg init i1726r1
+ $ echo a > i1726r1/a
+ $ hg --cwd i1726r1 ci -Am base
+ adding a
+ $ hg clone i1726r1 i1726r2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > i1726r1/a
+ $ hg --cwd i1726r1 ci -m second
+ $ echo c > i1726r2/a
+ $ hg --cwd i1726r2 ci -m third
+ $ HGMERGE=true hg --cwd i1726r2 fetch ../i1726r1
+ pulling from ../i1726r1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ updating to 2:7837755a2789
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ merging with 1:d1f0c6c48ebd
+ merging a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ new changeset 3:* merges remote changes with local (glob)
+ $ hg --cwd i1726r2 heads default --template '{rev}\n'
+ 3
+
+test issue2047
+
+ $ hg -q init i2047a
+ $ cd i2047a
+ $ echo a > a
+ $ hg -q ci -Am a
+ $ hg -q branch stable
+ $ echo b > b
+ $ hg -q ci -Am b
+ $ cd ..
+ $ hg -q clone -r 0 i2047a i2047b
+ $ cd i2047b
+ $ hg fetch ../i2047a
+ pulling from ../i2047a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ $ cd ..
diff --git a/tests/test-filebranch.t b/tests/test-filebranch.t
new file mode 100644
index 0000000..5558fb0
--- /dev/null
+++ b/tests/test-filebranch.t
@@ -0,0 +1,149 @@
+This test makes sure that we don't mark a file as merged with its ancestor
+when we do a merge.
+
+ $ cat <<EOF > merge
+ > import sys, os
+ > print "merging for", os.path.basename(sys.argv[1])
+ > EOF
+ $ HGMERGE="python ../merge"; export HGMERGE
+
+Creating base:
+
+ $ hg init a
+ $ cd a
+ $ echo 1 > foo
+ $ echo 1 > bar
+ $ echo 1 > baz
+ $ echo 1 > quux
+ $ hg add foo bar baz quux
+ $ hg commit -m "base"
+
+ $ cd ..
+ $ hg clone a b
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Creating branch a:
+
+ $ cd a
+ $ echo 2a > foo
+ $ echo 2a > bar
+ $ hg commit -m "branch a"
+
+Creating branch b:
+
+ $ cd ..
+ $ cd b
+ $ echo 2b > foo
+ $ echo 2b > baz
+ $ hg commit -m "branch b"
+
+We shouldn't have anything but n state here:
+
+ $ hg debugstate --nodates | grep -v "^n"
+ [1]
+
+Merging:
+
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg merge -v
+ resolving manifests
+ getting bar
+ merging foo
+ merging for foo
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ echo 2m > foo
+ $ echo 2b > baz
+ $ echo new > quux
+
+We shouldn't have anything but foo in merge state here:
+
+ $ hg debugstate --nodates | grep "^m"
+ m 644 3 foo
+
+ $ hg ci -m "merge"
+
+main: we should have a merge here:
+
+ $ hg debugindex --changelog
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 73 ..... 0 cdca01651b96 000000000000 000000000000 (re)
+ 1 73 68 ..... 1 f6718a9cb7f3 cdca01651b96 000000000000 (re)
+ 2 141 68 ..... 2 bdd988058d16 cdca01651b96 000000000000 (re)
+ 3 209 66 ..... 3 d8a521142a3c f6718a9cb7f3 bdd988058d16 (re)
+
+log should show foo and quux changed:
+
+ $ hg log -v -r tip
+ changeset: 3:d8a521142a3c
+ tag: tip
+ parent: 1:f6718a9cb7f3
+ parent: 2:bdd988058d16
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: foo quux
+ description:
+ merge
+
+
+
+foo: we should have a merge here:
+
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 4 ..... 1 2ffeddde1b65 b8e02f643373 000000000000 (re)
+ 2 7 4 ..... 2 33d1fb69067a b8e02f643373 000000000000 (re)
+ 3 11 4 ..... 3 aa27919ee430 2ffeddde1b65 33d1fb69067a (re)
+
+bar: we should not have a merge here:
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 4 ..... 2 33d1fb69067a b8e02f643373 000000000000 (re)
+
+baz: we should not have a merge here:
+
+ $ hg debugindex baz
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 4 ..... 1 2ffeddde1b65 b8e02f643373 000000000000 (re)
+
+quux: we should not have a merge here:
+
+ $ hg debugindex quux
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 5 ..... 3 6128c0f33108 b8e02f643373 000000000000 (re)
+
+Manifest entries should match tips of all files:
+
+ $ hg manifest --debug
+ 33d1fb69067a0139622a3fa3b7ba1cdb1367972e 644 bar
+ 2ffeddde1b65b4827f6746174a145474129fa2ce 644 baz
+ aa27919ee4303cfd575e1fb932dd64d75aa08be4 644 foo
+ 6128c0f33108e8cfbb4e0824d13ae48b466d7280 644 quux
+
+Everything should be clean now:
+
+ $ hg status
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 4 changesets, 10 total revisions
+
+ $ cd ..
diff --git a/tests/test-filecache.py b/tests/test-filecache.py
new file mode 100644
index 0000000..552a62a
--- /dev/null
+++ b/tests/test-filecache.py
@@ -0,0 +1,95 @@
+import sys, os, subprocess
+
+if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
+ 'cacheable']):
+ sys.exit(80)
+
+from mercurial import util, scmutil, extensions
+
+filecache = scmutil.filecache
+
+class fakerepo(object):
+ def __init__(self):
+ self._filecache = {}
+
+ def join(self, p):
+ return p
+
+ def sjoin(self, p):
+ return p
+
+ @filecache('x')
+ def cached(self):
+ print 'creating'
+
+ def invalidate(self):
+ for k in self._filecache:
+ try:
+ delattr(self, k)
+ except AttributeError:
+ pass
+
+def basic(repo):
+ # file doesn't exist, calls function
+ repo.cached
+
+ repo.invalidate()
+ # file still doesn't exist, uses cache
+ repo.cached
+
+ # create empty file
+ f = open('x', 'w')
+ f.close()
+ repo.invalidate()
+ # should recreate the object
+ repo.cached
+
+ f = open('x', 'w')
+ f.write('a')
+ f.close()
+ repo.invalidate()
+ # should recreate the object
+ repo.cached
+
+ repo.invalidate()
+ # stats file again, nothing changed, reuses object
+ repo.cached
+
+ # atomic replace file, size doesn't change
+ # hopefully st_mtime doesn't change as well so this doesn't use the cache
+ # because of inode change
+ f = scmutil.opener('.')('x', 'w', atomictemp=True)
+ f.write('b')
+ f.close()
+
+ repo.invalidate()
+ repo.cached
+
+def fakeuncacheable():
+ def wrapcacheable(orig, *args, **kwargs):
+ return False
+
+ def wrapinit(orig, *args, **kwargs):
+ pass
+
+ originit = extensions.wrapfunction(util.cachestat, '__init__', wrapinit)
+ origcacheable = extensions.wrapfunction(util.cachestat, 'cacheable',
+ wrapcacheable)
+
+ try:
+ os.remove('x')
+ except OSError:
+ pass
+
+ basic(fakerepo())
+
+ util.cachestat.cacheable = origcacheable
+ util.cachestat.__init__ = originit
+
+print 'basic:'
+print
+basic(fakerepo())
+print
+print 'fakeuncacheable:'
+print
+fakeuncacheable()
diff --git a/tests/test-filecache.py.out b/tests/test-filecache.py.out
new file mode 100644
index 0000000..dc386fe
--- /dev/null
+++ b/tests/test-filecache.py.out
@@ -0,0 +1,15 @@
+basic:
+
+creating
+creating
+creating
+creating
+
+fakeuncacheable:
+
+creating
+creating
+creating
+creating
+creating
+creating
diff --git a/tests/test-filelog.py b/tests/test-filelog.py
new file mode 100755
index 0000000..bf9f437
--- /dev/null
+++ b/tests/test-filelog.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+"""
+Tests the behaviour of filelog w.r.t. data starting with '\1\n'
+"""
+from mercurial import ui, hg
+from mercurial.node import nullid, hex
+
+myui = ui.ui()
+repo = hg.repository(myui, path='.', create=True)
+
+fl = repo.file('foobar')
+
+def addrev(text, renamed=False):
+ if renamed:
+ # data doesnt matter. Just make sure filelog.renamed() returns True
+ meta = dict(copyrev=hex(nullid), copy='bar')
+ else:
+ meta = {}
+
+ lock = t = None
+ try:
+ lock = repo.lock()
+ t = repo.transaction('commit')
+ node = fl.add(text, meta, t, 0, nullid, nullid)
+ return node
+ finally:
+ if t:
+ t.close()
+ if lock:
+ lock.release()
+
+def error(text):
+ print 'ERROR: ' + text
+
+textwith = '\1\nfoo'
+without = 'foo'
+
+node = addrev(textwith)
+if not textwith == fl.read(node):
+ error('filelog.read for data starting with \\1\\n')
+if fl.cmp(node, textwith) or not fl.cmp(node, without):
+ error('filelog.cmp for data starting with \\1\\n')
+if fl.size(0) != len(textwith):
+ error('FIXME: This is a known failure of filelog.size for data starting '
+ 'with \\1\\n')
+
+node = addrev(textwith, renamed=True)
+if not textwith == fl.read(node):
+ error('filelog.read for a renaming + data starting with \\1\\n')
+if fl.cmp(node, textwith) or not fl.cmp(node, without):
+ error('filelog.cmp for a renaming + data starting with \\1\\n')
+if fl.size(1) != len(textwith):
+ error('filelog.size for a renaming + data starting with \\1\\n')
+
+print 'OK.'
diff --git a/tests/test-filelog.py.out b/tests/test-filelog.py.out
new file mode 100644
index 0000000..d9ecd51
--- /dev/null
+++ b/tests/test-filelog.py.out
@@ -0,0 +1,2 @@
+ERROR: FIXME: This is a known failure of filelog.size for data starting with \1\n
+OK.
diff --git a/tests/test-flags.t b/tests/test-flags.t
new file mode 100644
index 0000000..0c4d11f
--- /dev/null
+++ b/tests/test-flags.t
@@ -0,0 +1,151 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ umask 027
+
+ $ hg init test1
+ $ cd test1
+ $ touch a b
+ $ hg add a b
+ $ hg ci -m "added a b"
+
+ $ cd ..
+ $ hg clone test1 test3
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg init test2
+ $ cd test2
+ $ hg pull ../test1
+ pulling from ../test1
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg co
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ chmod +x a
+ $ hg ci -m "chmod +x a"
+
+the changelog should mention file a:
+
+ $ hg tip --template '{files}\n'
+ a
+
+ $ cd ../test1
+ $ echo 123 >>a
+ $ hg ci -m "a updated"
+
+ $ hg pull ../test2
+ pulling from ../test2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg heads
+ changeset: 2:7f4313b42a34
+ tag: tip
+ parent: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: chmod +x a
+
+ changeset: 1:c6ecefc45368
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a updated
+
+ $ hg history
+ changeset: 2:7f4313b42a34
+ tag: tip
+ parent: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: chmod +x a
+
+ changeset: 1:c6ecefc45368
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a updated
+
+ changeset: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: added a b
+
+
+ $ hg -v merge
+ resolving manifests
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cd ../test3
+ $ echo 123 >>b
+ $ hg ci -m "b updated"
+
+ $ hg pull ../test2
+ pulling from ../test2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg heads
+ changeset: 2:7f4313b42a34
+ tag: tip
+ parent: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: chmod +x a
+
+ changeset: 1:dc57ead75f79
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b updated
+
+ $ hg history
+ changeset: 2:7f4313b42a34
+ tag: tip
+ parent: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: chmod +x a
+
+ changeset: 1:dc57ead75f79
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b updated
+
+ changeset: 0:22a449e20da5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: added a b
+
+
+ $ hg -v merge
+ resolving manifests
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ ls -l ../test[123]/a > foo
+ $ cut -b 1-10 < foo
+ -rwxr-x---
+ -rwxr-x---
+ -rwxr-x---
+
+ $ hg debugindex a
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
+ $ hg debugindex -R ../test2 a
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
+ $ hg debugindex -R ../test1 a
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
+ 1 0 5 ..... 1 7fe919cc0336 b80de5d13875 000000000000 (re)
+
+ $ cd ..
diff --git a/tests/test-fncache.t b/tests/test-fncache.t
new file mode 100644
index 0000000..643088c
--- /dev/null
+++ b/tests/test-fncache.t
@@ -0,0 +1,119 @@
+Init repo1:
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo "some text" > a
+ $ hg add
+ adding a
+ $ hg ci -m first
+ $ cat .hg/store/fncache | sort
+ data/a.i
+
+Testing a.i/b:
+
+ $ mkdir a.i
+ $ echo "some other text" > a.i/b
+ $ hg add
+ adding a.i/b (glob)
+ $ hg ci -m second
+ $ cat .hg/store/fncache | sort
+ data/a.i
+ data/a.i.hg/b.i
+
+Testing a.i.hg/c:
+
+ $ mkdir a.i.hg
+ $ echo "yet another text" > a.i.hg/c
+ $ hg add
+ adding a.i.hg/c (glob)
+ $ hg ci -m third
+ $ cat .hg/store/fncache | sort
+ data/a.i
+ data/a.i.hg.hg/c.i
+ data/a.i.hg/b.i
+
+Testing verify:
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 3 changesets, 3 total revisions
+
+ $ rm .hg/store/fncache
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ data/a.i@0: missing revlog!
+ data/a.i.hg/c.i@2: missing revlog!
+ data/a.i/b.i@1: missing revlog!
+ 3 files, 3 changesets, 3 total revisions
+ 3 integrity errors encountered!
+ (first damaged changeset appears to be 0)
+ [1]
+ $ cd ..
+
+Non store repo:
+
+ $ hg --config format.usestore=False init foo
+ $ cd foo
+ $ mkdir tst.d
+ $ echo foo > tst.d/foo
+ $ hg ci -Amfoo
+ adding tst.d/foo
+ $ find .hg | sort
+ .hg
+ .hg/00changelog.i
+ .hg/00manifest.i
+ .hg/cache
+ .hg/cache/branchheads
+ .hg/data
+ .hg/data/tst.d.hg
+ .hg/data/tst.d.hg/foo.i
+ .hg/dirstate
+ .hg/last-message.txt
+ .hg/phaseroots
+ .hg/requires
+ .hg/undo
+ .hg/undo.bookmarks
+ .hg/undo.branch
+ .hg/undo.desc
+ .hg/undo.dirstate
+ .hg/undo.phaseroots
+ $ cd ..
+
+Non fncache repo:
+
+ $ hg --config format.usefncache=False init bar
+ $ cd bar
+ $ mkdir tst.d
+ $ echo foo > tst.d/Foo
+ $ hg ci -Amfoo
+ adding tst.d/Foo
+ $ find .hg | sort
+ .hg
+ .hg/00changelog.i
+ .hg/cache
+ .hg/cache/branchheads
+ .hg/dirstate
+ .hg/last-message.txt
+ .hg/requires
+ .hg/store
+ .hg/store/00changelog.i
+ .hg/store/00manifest.i
+ .hg/store/data
+ .hg/store/data/tst.d.hg
+ .hg/store/data/tst.d.hg/_foo.i
+ .hg/store/phaseroots
+ .hg/store/undo
+ .hg/store/undo.phaseroots
+ .hg/undo.bookmarks
+ .hg/undo.branch
+ .hg/undo.desc
+ .hg/undo.dirstate
+ $ cd ..
+
diff --git a/tests/test-gendoc.t b/tests/test-gendoc.t
new file mode 100644
index 0000000..63a67d7
--- /dev/null
+++ b/tests/test-gendoc.t
@@ -0,0 +1,57 @@
+Test document extraction
+
+ $ "$TESTDIR/hghave" docutils || exit 80
+ $ HGENCODING=UTF-8
+ $ export HGENCODING
+ $ { echo C; find "$TESTDIR/../i18n" -name "*.po" | sort; } | while read PO; do
+ > LOCALE=`basename "$PO" .po`
+ > echo
+ > echo "% extracting documentation from $LOCALE"
+ > echo ".. -*- coding: utf-8 -*-" > gendoc-$LOCALE.txt
+ > echo "" >> gendoc-$LOCALE.txt
+ > LC_ALL=$LOCALE python "$TESTDIR/../doc/gendoc.py" >> gendoc-$LOCALE.txt 2> /dev/null || exit
+ >
+ > # We call runrst without adding "--halt warning" to make it report
+ > # all errors instead of stopping on the first one.
+ > echo "checking for parse errors"
+ > python "$TESTDIR/../doc/runrst" html gendoc-$LOCALE.txt /dev/null
+ > done
+
+ % extracting documentation from C
+ checking for parse errors
+
+ % extracting documentation from da
+ checking for parse errors
+
+ % extracting documentation from de
+ checking for parse errors
+
+ % extracting documentation from el
+ checking for parse errors
+
+ % extracting documentation from fr
+ checking for parse errors
+
+ % extracting documentation from it
+ checking for parse errors
+
+ % extracting documentation from ja
+ checking for parse errors
+
+ % extracting documentation from pt_BR
+ checking for parse errors
+
+ % extracting documentation from ro
+ checking for parse errors
+
+ % extracting documentation from ru
+ checking for parse errors
+
+ % extracting documentation from sv
+ checking for parse errors
+
+ % extracting documentation from zh_CN
+ checking for parse errors
+
+ % extracting documentation from zh_TW
+ checking for parse errors
diff --git a/tests/test-getbundle.t b/tests/test-getbundle.t
new file mode 100644
index 0000000..83feda6
--- /dev/null
+++ b/tests/test-getbundle.t
@@ -0,0 +1,254 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+= Test the getbundle() protocol function =
+
+Enable graphlog extension:
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+Create a test repository:
+
+ $ hg init repo
+ $ cd repo
+ $ hg debugbuilddag -n -m '+2 :fork +5 :p1 *fork +6 :p2 /p1 :m1 +3' > /dev/null
+ $ hg glog --template '{node}\n'
+ o 10c14a2cc935e1d8c31f9e98587dcf27fb08a6da
+ |
+ o 4801a72e5d88cb515b0c7e40fae34180f3f837f2
+ |
+ o 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ |
+ o 8365676dbab05860ce0d9110f2af51368b961bbd
+ |\
+ | o 5686dbbd9fc46cb806599c878d02fe1cb56b83d3
+ | |
+ | o 13c0170174366b441dc68e8e33757232fa744458
+ | |
+ | o 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ | |
+ | o 700b7e19db54103633c4bf4a6a6b6d55f4d50c03
+ | |
+ | o 928b5f94cdb278bb536eba552de348a4e92ef24d
+ | |
+ | o f34414c64173e0ecb61b25dc55e116dbbcc89bee
+ | |
+ | o 8931463777131cd73923e560b760061f2aa8a4bc
+ | |
+ o | 6621d79f61b23ec74cf4b69464343d9e0980ec8b
+ | |
+ o | bac16991d12ff45f9dc43c52da1946dfadb83e80
+ | |
+ o | ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ | |
+ o | d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ | |
+ o | 713346a995c363120712aed1aee7e04afd867638
+ |/
+ o 29a4d1f17bd3f0779ca0525bebb1cfb51067c738
+ |
+ o 7704483d56b2a7b5db54dcee7c62378ac629b348
+
+ $ cd ..
+
+
+= Test locally =
+
+Get everything:
+
+ $ hg debuggetbundle repo bundle
+ $ hg debugbundle bundle
+ 7704483d56b2a7b5db54dcee7c62378ac629b348
+ 29a4d1f17bd3f0779ca0525bebb1cfb51067c738
+ 713346a995c363120712aed1aee7e04afd867638
+ d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 6621d79f61b23ec74cf4b69464343d9e0980ec8b
+ 8931463777131cd73923e560b760061f2aa8a4bc
+ f34414c64173e0ecb61b25dc55e116dbbcc89bee
+ 928b5f94cdb278bb536eba552de348a4e92ef24d
+ 700b7e19db54103633c4bf4a6a6b6d55f4d50c03
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ 13c0170174366b441dc68e8e33757232fa744458
+ 5686dbbd9fc46cb806599c878d02fe1cb56b83d3
+ 8365676dbab05860ce0d9110f2af51368b961bbd
+ 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ 4801a72e5d88cb515b0c7e40fae34180f3f837f2
+ 10c14a2cc935e1d8c31f9e98587dcf27fb08a6da
+
+Get part of linear run:
+
+ $ hg debuggetbundle repo bundle -H 4801a72e5d88cb515b0c7e40fae34180f3f837f2 -C 8365676dbab05860ce0d9110f2af51368b961bbd
+ $ hg debugbundle bundle
+ 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ 4801a72e5d88cb515b0c7e40fae34180f3f837f2
+
+Get missing branch and merge:
+
+ $ hg debuggetbundle repo bundle -H 4801a72e5d88cb515b0c7e40fae34180f3f837f2 -C 13c0170174366b441dc68e8e33757232fa744458
+ $ hg debugbundle bundle
+ 713346a995c363120712aed1aee7e04afd867638
+ d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 6621d79f61b23ec74cf4b69464343d9e0980ec8b
+ 5686dbbd9fc46cb806599c878d02fe1cb56b83d3
+ 8365676dbab05860ce0d9110f2af51368b961bbd
+ 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ 4801a72e5d88cb515b0c7e40fae34180f3f837f2
+
+Get from only one head:
+
+ $ hg debuggetbundle repo bundle -H 928b5f94cdb278bb536eba552de348a4e92ef24d -C 29a4d1f17bd3f0779ca0525bebb1cfb51067c738
+ $ hg debugbundle bundle
+ 8931463777131cd73923e560b760061f2aa8a4bc
+ f34414c64173e0ecb61b25dc55e116dbbcc89bee
+ 928b5f94cdb278bb536eba552de348a4e92ef24d
+
+Get parts of two branches:
+
+ $ hg debuggetbundle repo bundle -H 13c0170174366b441dc68e8e33757232fa744458 -C 700b7e19db54103633c4bf4a6a6b6d55f4d50c03 -H bac16991d12ff45f9dc43c52da1946dfadb83e80 -C d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ $ hg debugbundle bundle
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ 13c0170174366b441dc68e8e33757232fa744458
+
+Check that we get all needed file changes:
+
+ $ hg debugbundle bundle --all
+ format: id, p1, p2, cset, delta base, len(delta)
+
+ changelog
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2 d5f6e1ea452285324836a49d7d3c2a63cfed1d31 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 d5f6e1ea452285324836a49d7d3c2a63cfed1d31 99
+ bac16991d12ff45f9dc43c52da1946dfadb83e80 ff42371d57168345fdf1a3aac66a51f6a45d41d2 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 ff42371d57168345fdf1a3aac66a51f6a45d41d2 99
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 700b7e19db54103633c4bf4a6a6b6d55f4d50c03 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 bac16991d12ff45f9dc43c52da1946dfadb83e80 102
+ 13c0170174366b441dc68e8e33757232fa744458 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 102
+
+ manifest
+ dac7984588fc4eea7acbf39693a9c1b06f5b175d 591f732a3faf1fb903815273f3c199a514a61ccb 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 591f732a3faf1fb903815273f3c199a514a61ccb 113
+ 0772616e6b48a76afb6c1458e193cbb3dae2e4ff dac7984588fc4eea7acbf39693a9c1b06f5b175d 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 dac7984588fc4eea7acbf39693a9c1b06f5b175d 113
+ eb498cd9af6c44108e43041e951ce829e29f6c80 bff2f4817ced57b386caf7c4e3e36a4bc9af7e93 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0772616e6b48a76afb6c1458e193cbb3dae2e4ff 295
+ b15709c071ddd2d93188508ba156196ab4f19620 eb498cd9af6c44108e43041e951ce829e29f6c80 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 eb498cd9af6c44108e43041e951ce829e29f6c80 114
+
+ mf
+ 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 301ca08d026bb72cb4258a9d211bdf7ca0bcd810 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 301ca08d026bb72cb4258a9d211bdf7ca0bcd810 17
+ c7b583de053293870e145f45bd2d61643563fd06 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 18
+ 266ee3c0302a5a18f1cf96817ac79a51836179e9 edc0f6b8db80d68ae6aff2b19f7e5347ab68fa63 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 c7b583de053293870e145f45bd2d61643563fd06 149
+ 698c6a36220548cd3903ca7dada27c59aa500c52 266ee3c0302a5a18f1cf96817ac79a51836179e9 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 266ee3c0302a5a18f1cf96817ac79a51836179e9 19
+
+ nf11
+ 33fbc651630ffa7ccbebfe4eb91320a873e7291c 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0000000000000000000000000000000000000000 16
+
+ nf12
+ ddce0544363f037e9fb889faca058f52dc01c0a5 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 0000000000000000000000000000000000000000 16
+
+ nf4
+ 3c1407305701051cbed9f9cb9a68bdfb5997c235 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 0000000000000000000000000000000000000000 15
+
+ nf5
+ 0dbd89c185f53a1727c54cd1ce256482fa23968e 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 0000000000000000000000000000000000000000 15
+
+Get branch and merge:
+
+ $ hg debuggetbundle repo bundle -C 7704483d56b2a7b5db54dcee7c62378ac629b348 -H 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ $ hg debugbundle bundle
+ 29a4d1f17bd3f0779ca0525bebb1cfb51067c738
+ 713346a995c363120712aed1aee7e04afd867638
+ d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 6621d79f61b23ec74cf4b69464343d9e0980ec8b
+ 8931463777131cd73923e560b760061f2aa8a4bc
+ f34414c64173e0ecb61b25dc55e116dbbcc89bee
+ 928b5f94cdb278bb536eba552de348a4e92ef24d
+ 700b7e19db54103633c4bf4a6a6b6d55f4d50c03
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ 13c0170174366b441dc68e8e33757232fa744458
+ 5686dbbd9fc46cb806599c878d02fe1cb56b83d3
+ 8365676dbab05860ce0d9110f2af51368b961bbd
+ 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+
+
+= Test via HTTP =
+
+Get everything:
+
+ $ hg serve -R repo -p $HGPORT -d --pid-file=hg.pid -E error.log -A access.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg debuggetbundle http://localhost:$HGPORT/ bundle
+ $ hg debugbundle bundle
+ 7704483d56b2a7b5db54dcee7c62378ac629b348
+ 29a4d1f17bd3f0779ca0525bebb1cfb51067c738
+ 713346a995c363120712aed1aee7e04afd867638
+ d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 6621d79f61b23ec74cf4b69464343d9e0980ec8b
+ 8931463777131cd73923e560b760061f2aa8a4bc
+ f34414c64173e0ecb61b25dc55e116dbbcc89bee
+ 928b5f94cdb278bb536eba552de348a4e92ef24d
+ 700b7e19db54103633c4bf4a6a6b6d55f4d50c03
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ 13c0170174366b441dc68e8e33757232fa744458
+ 5686dbbd9fc46cb806599c878d02fe1cb56b83d3
+ 8365676dbab05860ce0d9110f2af51368b961bbd
+ 0b2f73f04880d9cb6a5cd8a757f0db0ad01e32c3
+ 4801a72e5d88cb515b0c7e40fae34180f3f837f2
+ 10c14a2cc935e1d8c31f9e98587dcf27fb08a6da
+
+Get parts of two branches:
+
+ $ hg debuggetbundle http://localhost:$HGPORT/ bundle -H 13c0170174366b441dc68e8e33757232fa744458 -C 700b7e19db54103633c4bf4a6a6b6d55f4d50c03 -H bac16991d12ff45f9dc43c52da1946dfadb83e80 -C d5f6e1ea452285324836a49d7d3c2a63cfed1d31
+ $ hg debugbundle bundle
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2
+ bac16991d12ff45f9dc43c52da1946dfadb83e80
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043
+ 13c0170174366b441dc68e8e33757232fa744458
+
+Check that we get all needed file changes:
+
+ $ hg debugbundle bundle --all
+ format: id, p1, p2, cset, delta base, len(delta)
+
+ changelog
+ ff42371d57168345fdf1a3aac66a51f6a45d41d2 d5f6e1ea452285324836a49d7d3c2a63cfed1d31 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 d5f6e1ea452285324836a49d7d3c2a63cfed1d31 99
+ bac16991d12ff45f9dc43c52da1946dfadb83e80 ff42371d57168345fdf1a3aac66a51f6a45d41d2 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 ff42371d57168345fdf1a3aac66a51f6a45d41d2 99
+ 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 700b7e19db54103633c4bf4a6a6b6d55f4d50c03 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 bac16991d12ff45f9dc43c52da1946dfadb83e80 102
+ 13c0170174366b441dc68e8e33757232fa744458 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 102
+
+ manifest
+ dac7984588fc4eea7acbf39693a9c1b06f5b175d 591f732a3faf1fb903815273f3c199a514a61ccb 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 591f732a3faf1fb903815273f3c199a514a61ccb 113
+ 0772616e6b48a76afb6c1458e193cbb3dae2e4ff dac7984588fc4eea7acbf39693a9c1b06f5b175d 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 dac7984588fc4eea7acbf39693a9c1b06f5b175d 113
+ eb498cd9af6c44108e43041e951ce829e29f6c80 bff2f4817ced57b386caf7c4e3e36a4bc9af7e93 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0772616e6b48a76afb6c1458e193cbb3dae2e4ff 295
+ b15709c071ddd2d93188508ba156196ab4f19620 eb498cd9af6c44108e43041e951ce829e29f6c80 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 eb498cd9af6c44108e43041e951ce829e29f6c80 114
+
+ mf
+ 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 301ca08d026bb72cb4258a9d211bdf7ca0bcd810 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 301ca08d026bb72cb4258a9d211bdf7ca0bcd810 17
+ c7b583de053293870e145f45bd2d61643563fd06 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 4f73f97080266ab8e0c0561ca8d0da3eaf65b695 18
+ 266ee3c0302a5a18f1cf96817ac79a51836179e9 edc0f6b8db80d68ae6aff2b19f7e5347ab68fa63 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 c7b583de053293870e145f45bd2d61643563fd06 149
+ 698c6a36220548cd3903ca7dada27c59aa500c52 266ee3c0302a5a18f1cf96817ac79a51836179e9 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 266ee3c0302a5a18f1cf96817ac79a51836179e9 19
+
+ nf11
+ 33fbc651630ffa7ccbebfe4eb91320a873e7291c 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 63476832d8ec6558cf9bbe3cbe0c757e5cf18043 0000000000000000000000000000000000000000 16
+
+ nf12
+ ddce0544363f037e9fb889faca058f52dc01c0a5 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 13c0170174366b441dc68e8e33757232fa744458 0000000000000000000000000000000000000000 16
+
+ nf4
+ 3c1407305701051cbed9f9cb9a68bdfb5997c235 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 ff42371d57168345fdf1a3aac66a51f6a45d41d2 0000000000000000000000000000000000000000 15
+
+ nf5
+ 0dbd89c185f53a1727c54cd1ce256482fa23968e 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 bac16991d12ff45f9dc43c52da1946dfadb83e80 0000000000000000000000000000000000000000 15
+
+Verify we hit the HTTP server:
+
+ $ cat access.log
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=getbundle HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:common=700b7e19db54103633c4bf4a6a6b6d55f4d50c03+d5f6e1ea452285324836a49d7d3c2a63cfed1d31&heads=13c0170174366b441dc68e8e33757232fa744458+bac16991d12ff45f9dc43c52da1946dfadb83e80 (glob)
+
+ $ cat error.log
+
diff --git a/tests/test-git-export.t b/tests/test-git-export.t
new file mode 100644
index 0000000..3efdc16
--- /dev/null
+++ b/tests/test-git-export.t
@@ -0,0 +1,362 @@
+ $ hg init
+ $ echo start > start
+ $ hg ci -Amstart
+ adding start
+
+New file:
+
+ $ echo new > new
+ $ hg ci -Amnew
+ adding new
+ $ hg diff --git -r 0
+ diff --git a/new b/new
+ new file mode 100644
+ --- /dev/null
+ +++ b/new
+ @@ -0,0 +1,1 @@
+ +new
+
+Copy:
+
+ $ hg cp new copy
+ $ hg ci -mcopy
+ $ hg diff --git -r 1:tip
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+
+Rename:
+
+ $ hg mv copy rename
+ $ hg ci -mrename
+ $ hg diff --git -r 2:tip
+ diff --git a/copy b/rename
+ rename from copy
+ rename to rename
+
+Delete:
+
+ $ hg rm rename
+ $ hg ci -mdelete
+ $ hg diff --git -r 3:tip
+ diff --git a/rename b/rename
+ deleted file mode 100644
+ --- a/rename
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -new
+
+ $ cat > src <<EOF
+ > 1
+ > 2
+ > 3
+ > 4
+ > 5
+ > EOF
+ $ hg ci -Amsrc
+ adding src
+
+#if execbit
+
+chmod 644:
+
+ $ chmod +x src
+ $ hg ci -munexec
+ $ hg diff --git -r 5:tip
+ diff --git a/src b/src
+ old mode 100644
+ new mode 100755
+
+Rename+mod+chmod:
+
+ $ hg mv src dst
+ $ chmod -x dst
+ $ echo a >> dst
+ $ hg ci -mrenamemod
+ $ hg diff --git -r 6:tip
+ diff --git a/src b/dst
+ old mode 100755
+ new mode 100644
+ rename from src
+ rename to dst
+ --- a/src
+ +++ b/dst
+ @@ -3,3 +3,4 @@
+ 3
+ 4
+ 5
+ +a
+
+Nonexistent in tip+chmod:
+
+ $ hg diff --git -r 5:6
+ diff --git a/src b/src
+ old mode 100644
+ new mode 100755
+
+#else
+
+Dummy changes when no exec bit, mocking the execbit commit structure
+
+ $ echo change >> src
+ $ hg ci -munexec
+ $ hg mv src dst
+ $ hg ci -mrenamemod
+
+#endif
+
+Binary diff:
+
+ $ cp "$TESTDIR/binfile.bin" .
+ $ hg add binfile.bin
+ $ hg diff --git > b.diff
+ $ cat b.diff
+ diff --git a/binfile.bin b/binfile.bin
+ new file mode 100644
+ index 0000000000000000000000000000000000000000..37ba3d1c6f17137d9c5f5776fa040caf5fe73ff9
+ GIT binary patch
+ literal 593
+ zc$@)I0<QguP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00009a7bBm000XU
+ z000XU0RWnu7ytkO2XskIMF-Uh9TW;VpMjwv0005-Nkl<ZD9@FWPs=e;7{<>W$NUkd
+ zX$nnYLt$-$V!?uy+1V%`z&Eh=ah|duER<4|QWhju3gb^nF*8iYobxWG-qqXl=2~5M
+ z*IoDB)sG^CfNuoBmqLTVU^<;@nwHP!1wrWd`{(mHo6VNXWtyh{alzqmsH*yYzpvLT
+ zLdY<T=ks|woh-`&01!ej#(xbV1f|pI*=%;d-%F*E*X#ZH`4I%6SS+$EJDE&ct=8po
+ ziN#{?_j|kD%Cd|oiqds`xm@;oJ-^?NG3Gdqrs?5u*zI;{nogxsx~^|Fn^Y?Gdc6<;
+ zfMJ+iF1J`LMx&A2?dEwNW8ClebzPTbIh{@$hS6*`kH@1d%Lo7fA#}N1)oN7`gm$~V
+ z+wDx#)OFqMcE{s!JN0-xhG8ItAjVkJwEcb`3WWlJfU2r?;Pd%dmR+q@mSri5q9_W-
+ zaR2~ECX?B2w+zELozC0s*6Z~|QG^f{3I#<`?)Q7U-JZ|q5W;9Q8i_=pBuSzunx=U;
+ z9C)5jBoYw9^?EHyQl(M}1OlQcCX>lXB*ODN003Z&P17_@)3Pi=i0wb04<W?v-u}7K
+ zXmmQA+wDgE!qR9o8jr`%=ab_&uh(l?R=r;Tjiqon91I2-hIu?57~@*4h7h9uORK#=
+ fQItJW-{SoTm)8|5##k|m00000NkvXXu0mjf{mKw4
+
+
+Import binary diff:
+
+ $ hg revert binfile.bin
+ $ rm binfile.bin
+ $ hg import -mfoo b.diff
+ applying b.diff
+ $ cmp binfile.bin "$TESTDIR/binfile.bin"
+
+Rename binary file:
+
+ $ hg mv binfile.bin renamed.bin
+ $ hg diff --git
+ diff --git a/binfile.bin b/renamed.bin
+ rename from binfile.bin
+ rename to renamed.bin
+
+Diff across many revisions:
+
+ $ hg mv dst dst2
+ $ hg ci -m 'mv dst dst2'
+
+ $ echo >> start
+ $ hg ci -m 'change start'
+
+ $ hg revert -r -2 start
+ $ hg mv dst2 dst3
+ $ hg ci -m 'mv dst2 dst3; revert start'
+
+ $ hg diff --git -r 9:11
+ diff --git a/dst2 b/dst3
+ rename from dst2
+ rename to dst3
+
+Reversed:
+
+ $ hg diff --git -r 11:9
+ diff --git a/dst3 b/dst2
+ rename from dst3
+ rename to dst2
+
+
+ $ echo a >> foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+ $ echo b >> foo
+ $ hg ci -m 'change foo'
+ $ hg mv foo bar
+ $ hg ci -m 'mv foo bar'
+ $ echo c >> bar
+ $ hg ci -m 'change bar'
+
+File created before r1 and renamed before r2:
+
+ $ hg diff --git -r -3:-1
+ diff --git a/foo b/bar
+ rename from foo
+ rename to bar
+ --- a/foo
+ +++ b/bar
+ @@ -1,2 +1,3 @@
+ a
+ b
+ +c
+
+Reversed:
+
+ $ hg diff --git -r -1:-3
+ diff --git a/bar b/foo
+ rename from bar
+ rename to foo
+ --- a/bar
+ +++ b/foo
+ @@ -1,3 +1,2 @@
+ a
+ b
+ -c
+
+File created in r1 and renamed before r2:
+
+ $ hg diff --git -r -4:-1
+ diff --git a/foo b/bar
+ rename from foo
+ rename to bar
+ --- a/foo
+ +++ b/bar
+ @@ -1,1 +1,3 @@
+ a
+ +b
+ +c
+
+Reversed:
+
+ $ hg diff --git -r -1:-4
+ diff --git a/bar b/foo
+ rename from bar
+ rename to foo
+ --- a/bar
+ +++ b/foo
+ @@ -1,3 +1,1 @@
+ a
+ -b
+ -c
+
+File created after r1 and renamed before r2:
+
+ $ hg diff --git -r -5:-1
+ diff --git a/bar b/bar
+ new file mode 100644
+ --- /dev/null
+ +++ b/bar
+ @@ -0,0 +1,3 @@
+ +a
+ +b
+ +c
+
+Reversed:
+
+ $ hg diff --git -r -1:-5
+ diff --git a/bar b/bar
+ deleted file mode 100644
+ --- a/bar
+ +++ /dev/null
+ @@ -1,3 +0,0 @@
+ -a
+ -b
+ -c
+
+
+Comparing with the working dir:
+
+ $ echo >> start
+ $ hg ci -m 'change start again'
+
+ $ echo > created
+ $ hg add created
+ $ hg ci -m 'add created'
+
+ $ hg mv created created2
+ $ hg ci -m 'mv created created2'
+
+ $ hg mv created2 created3
+
+There's a copy in the working dir:
+
+ $ hg diff --git
+ diff --git a/created2 b/created3
+ rename from created2
+ rename to created3
+
+There's another copy between the original rev and the wd:
+
+ $ hg diff --git -r -2
+ diff --git a/created b/created3
+ rename from created
+ rename to created3
+
+The source of the copy was created after the original rev:
+
+ $ hg diff --git -r -3
+ diff --git a/created3 b/created3
+ new file mode 100644
+ --- /dev/null
+ +++ b/created3
+ @@ -0,0 +1,1 @@
+ +
+ $ hg ci -m 'mv created2 created3'
+
+
+ $ echo > brand-new
+ $ hg add brand-new
+ $ hg ci -m 'add brand-new'
+ $ hg mv brand-new brand-new2
+
+Created in parent of wd; renamed in the wd:
+
+ $ hg diff --git
+ diff --git a/brand-new b/brand-new2
+ rename from brand-new
+ rename to brand-new2
+
+Created between r1 and parent of wd; renamed in the wd:
+
+ $ hg diff --git -r -2
+ diff --git a/brand-new2 b/brand-new2
+ new file mode 100644
+ --- /dev/null
+ +++ b/brand-new2
+ @@ -0,0 +1,1 @@
+ +
+ $ hg ci -m 'mv brand-new brand-new2'
+
+One file is copied to many destinations and removed:
+
+ $ hg cp brand-new2 brand-new3
+ $ hg mv brand-new2 brand-new3-2
+ $ hg ci -m 'multiple renames/copies'
+ $ hg diff --git -r -2 -r -1
+ diff --git a/brand-new2 b/brand-new3
+ rename from brand-new2
+ rename to brand-new3
+ diff --git a/brand-new2 b/brand-new3-2
+ copy from brand-new2
+ copy to brand-new3-2
+
+Reversed:
+
+ $ hg diff --git -r -1 -r -2
+ diff --git a/brand-new3 b/brand-new2
+ rename from brand-new3
+ rename to brand-new2
+ diff --git a/brand-new3-2 b/brand-new3-2
+ deleted file mode 100644
+ --- a/brand-new3-2
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -
+
+There should be a trailing TAB if there are spaces in the file name:
+
+ $ echo foo > 'with spaces'
+ $ hg add 'with spaces'
+ $ hg diff --git
+ diff --git a/with spaces b/with spaces
+ new file mode 100644
+ --- /dev/null
+ +++ b/with spaces
+ @@ -0,0 +1,1 @@
+ +foo
+ $ hg ci -m 'add filename with spaces'
+
diff --git a/tests/test-globalopts.t b/tests/test-globalopts.t
new file mode 100644
index 0000000..53716cd
--- /dev/null
+++ b/tests/test-globalopts.t
@@ -0,0 +1,449 @@
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -A -d'1 0' -m a
+ adding a
+
+ $ cd ..
+
+ $ hg init b
+ $ cd b
+ $ echo b > b
+ $ hg ci -A -d'1 0' -m b
+ adding b
+
+ $ cd ..
+
+ $ hg clone a c
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd c
+ $ cat >> .hg/hgrc <<EOF
+ > [paths]
+ > relative = ../a
+ > EOF
+ $ hg pull -f ../b
+ pulling from ../b
+ searching for changes
+ warning: repository is unrelated
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cd ..
+
+Testing -R/--repository:
+
+ $ hg -R a tip
+ changeset: 0:8580ff50825a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+ $ hg --repository b tip
+ changeset: 0:b6c483daf290
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b
+
+
+-R with a URL:
+
+ $ hg -R file:a identify
+ 8580ff50825a tip
+ $ hg -R file://localhost/`pwd`/a/ identify
+ 8580ff50825a tip
+
+-R with path aliases:
+
+ $ cd c
+ $ hg -R default identify
+ 8580ff50825a tip
+ $ hg -R relative identify
+ 8580ff50825a tip
+ $ echo '[paths]' >> $HGRCPATH
+ $ echo 'relativetohome = a' >> $HGRCPATH
+ $ HOME=`pwd`/../ hg -R relativetohome identify
+ 8580ff50825a tip
+ $ cd ..
+
+#if no-outer-repo
+
+Implicit -R:
+
+ $ hg ann a/a
+ 0: a
+ $ hg ann a/a a/a
+ 0: a
+ $ hg ann a/a b/b
+ abort: no repository found in '$TESTTMP' (.hg not found)!
+ [255]
+ $ hg -R b ann a/a
+ abort: a/a not under root
+ [255]
+ $ hg log
+ abort: no repository found in '$TESTTMP' (.hg not found)!
+ [255]
+
+#endif
+
+Abbreviation of long option:
+
+ $ hg --repo c tip
+ changeset: 1:b6c483daf290
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b
+
+
+earlygetopt with duplicate options (36d23de02da1):
+
+ $ hg --cwd a --cwd b --cwd c tip
+ changeset: 1:b6c483daf290
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b
+
+ $ hg --repo c --repository b -R a tip
+ changeset: 0:8580ff50825a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+earlygetopt short option without following space:
+
+ $ hg -q -Rb tip
+ 0:b6c483daf290
+
+earlygetopt with illegal abbreviations:
+
+ $ hg --confi "foo.bar=baz"
+ abort: option --config may not be abbreviated!
+ [255]
+ $ hg --cw a tip
+ abort: option --cwd may not be abbreviated!
+ [255]
+ $ hg --rep a tip
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ [255]
+ $ hg --repositor a tip
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ [255]
+ $ hg -qR a tip
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ [255]
+ $ hg -qRa tip
+ abort: option -R has to be separated from other options (e.g. not -qR) and --repository may only be abbreviated as --repo!
+ [255]
+
+Testing --cwd:
+
+ $ hg --cwd a parents
+ changeset: 0:8580ff50825a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+Testing -y/--noninteractive - just be sure it is parsed:
+
+ $ hg --cwd a tip -q --noninteractive
+ 0:8580ff50825a
+ $ hg --cwd a tip -q -y
+ 0:8580ff50825a
+
+Testing -q/--quiet:
+
+ $ hg -R a -q tip
+ 0:8580ff50825a
+ $ hg -R b -q tip
+ 0:b6c483daf290
+ $ hg -R c --quiet parents
+ 0:8580ff50825a
+ 1:b6c483daf290
+
+Testing -v/--verbose:
+
+ $ hg --cwd c head -v
+ changeset: 1:b6c483daf290
+ tag: tip
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: b
+ description:
+ b
+
+
+ changeset: 0:8580ff50825a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a
+ description:
+ a
+
+
+ $ hg --cwd b tip --verbose
+ changeset: 0:b6c483daf290
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: b
+ description:
+ b
+
+
+
+Testing --config:
+
+ $ hg --cwd c --config paths.quuxfoo=bar paths | grep quuxfoo > /dev/null && echo quuxfoo
+ quuxfoo
+ $ hg --cwd c --config '' tip -q
+ abort: malformed --config option: '' (use --config section.name=value)
+ [255]
+ $ hg --cwd c --config a.b tip -q
+ abort: malformed --config option: 'a.b' (use --config section.name=value)
+ [255]
+ $ hg --cwd c --config a tip -q
+ abort: malformed --config option: 'a' (use --config section.name=value)
+ [255]
+ $ hg --cwd c --config a.= tip -q
+ abort: malformed --config option: 'a.=' (use --config section.name=value)
+ [255]
+ $ hg --cwd c --config .b= tip -q
+ abort: malformed --config option: '.b=' (use --config section.name=value)
+ [255]
+
+Testing --debug:
+
+ $ hg --cwd c log --debug
+ changeset: 1:b6c483daf2907ce5825c0bb50f5716226281cc1a
+ tag: tip
+ parent: -1:0000000000000000000000000000000000000000
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 1:23226e7a252cacdc2d99e4fbdc3653441056de49
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files+: b
+ extra: branch=default
+ description:
+ b
+
+
+ changeset: 0:8580ff50825a50c8f716709acdf8de0deddcd6ab
+ parent: -1:0000000000000000000000000000000000000000
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 0:a0c8bcbbb45c63b90b70ad007bf38961f64f2af0
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files+: a
+ extra: branch=default
+ description:
+ a
+
+
+
+Testing --traceback:
+
+ $ hg --cwd c --config x --traceback id 2>&1 | grep -i 'traceback'
+ Traceback (most recent call last):
+
+Testing --time:
+
+ $ hg --cwd a --time id
+ 8580ff50825a tip
+ time: real * (glob)
+
+Testing --version:
+
+ $ hg --version -q
+ Mercurial Distributed SCM * (glob)
+
+hide outer repo
+ $ hg init
+
+Testing -h/--help:
+
+ $ hg -h
+ Mercurial Distributed SCM
+
+ list of commands:
+
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+ annotate show changeset information by line for each file
+ archive create an unversioned archive of a repository revision
+ backout reverse effect of earlier changeset
+ bisect subdivision search of changesets
+ bookmarks track a line of development with movable markers
+ branch set or show the current branch name
+ branches list repository named branches
+ bundle create a changegroup file
+ cat output the current or given revision of files
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ copy mark files as copied for the next commit
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ graft copy changes from other branches onto the current branch
+ grep search for a pattern in specified files and revisions
+ heads show current repository heads or show branch heads
+ help show help for a given topic or a help overview
+ identify identify the working copy or specified revision
+ import import an ordered set of patches
+ incoming show new changesets found in source
+ init create a new repository in the given directory
+ locate locate files matching specific patterns
+ log show revision history of entire repository or files
+ manifest output the current or given revision of the project manifest
+ merge merge working directory with another revision
+ outgoing show changesets not found in the destination
+ parents show the parents of the working directory or revision
+ paths show aliases for remote repositories
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ recover roll back an interrupted transaction
+ remove remove the specified files on the next commit
+ rename rename files; equivalent of copy + remove
+ resolve redo merges or set/view the merge status of files
+ revert restore files to their checkout state
+ rollback roll back the last transaction (dangerous)
+ root print the root (top) of the current working directory
+ serve start stand-alone webserver
+ showconfig show combined config settings from all hgrc files
+ status show changed files in the working directory
+ summary summarize working directory state
+ tag add one or more tags for the current or given revision
+ tags list repository tags
+ tip show the tip revision
+ unbundle apply one or more changegroup files
+ update update working directory (or switch revisions)
+ verify verify the integrity of the repository
+ version output version and copyright information
+
+ additional help topics:
+
+ config Configuration Files
+ dates Date Formats
+ diffs Diff Formats
+ environment Environment Variables
+ extensions Using Additional Features
+ filesets Specifying File Sets
+ glossary Glossary
+ hgignore Syntax for Mercurial Ignore Files
+ hgweb Configuring hgweb
+ merge-tools Merge Tools
+ multirevs Specifying Multiple Revisions
+ patterns File Name Patterns
+ phases Working with Phases
+ revisions Specifying Single Revisions
+ revsets Specifying Revision Sets
+ subrepos Subrepositories
+ templating Template Usage
+ urls URL Paths
+
+ use "hg -v help" to show builtin aliases and global options
+
+
+
+ $ hg --help
+ Mercurial Distributed SCM
+
+ list of commands:
+
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+ annotate show changeset information by line for each file
+ archive create an unversioned archive of a repository revision
+ backout reverse effect of earlier changeset
+ bisect subdivision search of changesets
+ bookmarks track a line of development with movable markers
+ branch set or show the current branch name
+ branches list repository named branches
+ bundle create a changegroup file
+ cat output the current or given revision of files
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ copy mark files as copied for the next commit
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ graft copy changes from other branches onto the current branch
+ grep search for a pattern in specified files and revisions
+ heads show current repository heads or show branch heads
+ help show help for a given topic or a help overview
+ identify identify the working copy or specified revision
+ import import an ordered set of patches
+ incoming show new changesets found in source
+ init create a new repository in the given directory
+ locate locate files matching specific patterns
+ log show revision history of entire repository or files
+ manifest output the current or given revision of the project manifest
+ merge merge working directory with another revision
+ outgoing show changesets not found in the destination
+ parents show the parents of the working directory or revision
+ paths show aliases for remote repositories
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ recover roll back an interrupted transaction
+ remove remove the specified files on the next commit
+ rename rename files; equivalent of copy + remove
+ resolve redo merges or set/view the merge status of files
+ revert restore files to their checkout state
+ rollback roll back the last transaction (dangerous)
+ root print the root (top) of the current working directory
+ serve start stand-alone webserver
+ showconfig show combined config settings from all hgrc files
+ status show changed files in the working directory
+ summary summarize working directory state
+ tag add one or more tags for the current or given revision
+ tags list repository tags
+ tip show the tip revision
+ unbundle apply one or more changegroup files
+ update update working directory (or switch revisions)
+ verify verify the integrity of the repository
+ version output version and copyright information
+
+ additional help topics:
+
+ config Configuration Files
+ dates Date Formats
+ diffs Diff Formats
+ environment Environment Variables
+ extensions Using Additional Features
+ filesets Specifying File Sets
+ glossary Glossary
+ hgignore Syntax for Mercurial Ignore Files
+ hgweb Configuring hgweb
+ merge-tools Merge Tools
+ multirevs Specifying Multiple Revisions
+ patterns File Name Patterns
+ phases Working with Phases
+ revisions Specifying Single Revisions
+ revsets Specifying Revision Sets
+ subrepos Subrepositories
+ templating Template Usage
+ urls URL Paths
+
+ use "hg -v help" to show builtin aliases and global options
+
+Not tested: --debugger
+
diff --git a/tests/test-glog.t b/tests/test-glog.t
new file mode 100644
index 0000000..25d3fcc
--- /dev/null
+++ b/tests/test-glog.t
@@ -0,0 +1,2088 @@
+@ (34) head
+|
+| o (33) head
+| |
+o | (32) expand
+|\ \
+| o \ (31) expand
+| |\ \
+| | o \ (30) expand
+| | |\ \
+| | | o | (29) regular commit
+| | | | |
+| | o | | (28) merge zero known
+| | |\ \ \
+o | | | | | (27) collapse
+|/ / / / /
+| | o---+ (26) merge one known; far right
+| | | | |
++---o | | (25) merge one known; far left
+| | | | |
+| | o | | (24) merge one known; immediate right
+| | |\| |
+| | o | | (23) merge one known; immediate left
+| |/| | |
++---o---+ (22) merge two known; one far left, one far right
+| | / /
+o | | | (21) expand
+|\ \ \ \
+| o---+-+ (20) merge two known; two far right
+| / / /
+o | | | (19) expand
+|\ \ \ \
++---+---o (18) merge two known; two far left
+| | | |
+| o | | (17) expand
+| |\ \ \
+| | o---+ (16) merge two known; one immediate right, one near right
+| | |/ /
+o | | | (15) expand
+|\ \ \ \
+| o-----+ (14) merge two known; one immediate right, one far right
+| |/ / /
+o | | | (13) expand
+|\ \ \ \
++---o | | (12) merge two known; one immediate right, one far left
+| | |/ /
+| o | | (11) expand
+| |\ \ \
+| | o---+ (10) merge two known; one immediate left, one near right
+| |/ / /
+o | | | (9) expand
+|\ \ \ \
+| o-----+ (8) merge two known; one immediate left, one far right
+|/ / / /
+o | | | (7) expand
+|\ \ \ \
++---o | | (6) merge two known; one immediate left, one far left
+| |/ / /
+| o | | (5) expand
+| |\ \ \
+| | o | | (4) merge two known; one immediate left, one immediate right
+| |/|/ /
+| o / / (3) collapse
+|/ / /
+o / / (2) collapse
+|/ /
+o / (1) collapse
+|/
+o (0) root
+
+
+ $ commit()
+ > {
+ > rev=$1
+ > msg=$2
+ > shift 2
+ > if [ "$#" -gt 0 ]; then
+ > hg debugsetparents "$@"
+ > fi
+ > echo $rev > a
+ > hg commit -Aqd "$rev 0" -m "($rev) $msg"
+ > }
+
+ $ cat > printrevset.py <<EOF
+ > from mercurial import extensions, revset, commands, cmdutil
+ >
+ > def uisetup(ui):
+ > def printrevset(orig, ui, repo, *pats, **opts):
+ > if opts.get('print_revset'):
+ > expr = cmdutil.getgraphlogrevs(repo, pats, opts)[1]
+ > if expr:
+ > tree = revset.parse(expr)[0]
+ > else:
+ > tree = []
+ > ui.write('%r\n' % (opts.get('rev', []),))
+ > ui.write(revset.prettyformat(tree) + '\n')
+ > return 0
+ > return orig(ui, repo, *pats, **opts)
+ > entry = extensions.wrapcommand(commands.table, 'log', printrevset)
+ > entry[1].append(('', 'print-revset', False,
+ > 'print generated revset and exit (DEPRECATED)'))
+ > EOF
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+ $ echo "printrevset=`pwd`/printrevset.py" >> $HGRCPATH
+
+ $ hg init repo
+ $ cd repo
+
+Empty repo:
+
+ $ hg glog
+
+
+Building DAG:
+
+ $ commit 0 "root"
+ $ commit 1 "collapse" 0
+ $ commit 2 "collapse" 1
+ $ commit 3 "collapse" 2
+ $ commit 4 "merge two known; one immediate left, one immediate right" 1 3
+ $ commit 5 "expand" 3 4
+ $ commit 6 "merge two known; one immediate left, one far left" 2 5
+ $ commit 7 "expand" 2 5
+ $ commit 8 "merge two known; one immediate left, one far right" 0 7
+ $ commit 9 "expand" 7 8
+ $ commit 10 "merge two known; one immediate left, one near right" 0 6
+ $ commit 11 "expand" 6 10
+ $ commit 12 "merge two known; one immediate right, one far left" 1 9
+ $ commit 13 "expand" 9 11
+ $ commit 14 "merge two known; one immediate right, one far right" 0 12
+ $ commit 15 "expand" 13 14
+ $ commit 16 "merge two known; one immediate right, one near right" 0 1
+ $ commit 17 "expand" 12 16
+ $ commit 18 "merge two known; two far left" 1 15
+ $ commit 19 "expand" 15 17
+ $ commit 20 "merge two known; two far right" 0 18
+ $ commit 21 "expand" 19 20
+ $ commit 22 "merge two known; one far left, one far right" 18 21
+ $ commit 23 "merge one known; immediate left" 1 22
+ $ commit 24 "merge one known; immediate right" 0 23
+ $ commit 25 "merge one known; far left" 21 24
+ $ commit 26 "merge one known; far right" 18 25
+ $ commit 27 "collapse" 21
+ $ commit 28 "merge zero known" 1 26
+ $ commit 29 "regular commit" 0
+ $ commit 30 "expand" 28 29
+ $ commit 31 "expand" 21 30
+ $ commit 32 "expand" 27 31
+ $ commit 33 "head" 18
+ $ commit 34 "head" 32
+
+
+ $ hg glog -q
+ @ 34:fea3ac5810e0
+ |
+ | o 33:68608f5145f9
+ | |
+ o | 32:d06dffa21a31
+ |\ \
+ | o \ 31:621d83e11f67
+ | |\ \
+ | | o \ 30:6e11cd4b648f
+ | | |\ \
+ | | | o | 29:cd9bb2be7593
+ | | | | |
+ | | o | | 28:44ecd0b9ae99
+ | | |\ \ \
+ o | | | | | 27:886ed638191b
+ |/ / / / /
+ | | o---+ 26:7f25b6c2f0b9
+ | | | | |
+ +---o | | 25:91da8ed57247
+ | | | | |
+ | | o | | 24:a9c19a3d96b7
+ | | |\| |
+ | | o | | 23:a01cddf0766d
+ | |/| | |
+ +---o---+ 22:e0d9cccacb5d
+ | | / /
+ o | | | 21:d42a756af44d
+ |\ \ \ \
+ | o---+-+ 20:d30ed6450e32
+ | / / /
+ o | | | 19:31ddc2c1573b
+ |\ \ \ \
+ +---+---o 18:1aa84d96232a
+ | | | |
+ | o | | 17:44765d7c06e0
+ | |\ \ \
+ | | o---+ 16:3677d192927d
+ | | |/ /
+ o | | | 15:1dda3f72782d
+ |\ \ \ \
+ | o-----+ 14:8eac370358ef
+ | |/ / /
+ o | | | 13:22d8966a97e3
+ |\ \ \ \
+ +---o | | 12:86b91144a6e9
+ | | |/ /
+ | o | | 11:832d76e6bdf2
+ | |\ \ \
+ | | o---+ 10:74c64d036d72
+ | |/ / /
+ o | | | 9:7010c0af0a35
+ |\ \ \ \
+ | o-----+ 8:7a0b11f71937
+ |/ / / /
+ o | | | 7:b632bb1b1224
+ |\ \ \ \
+ +---o | | 6:b105a072e251
+ | |/ / /
+ | o | | 5:4409d547b708
+ | |\ \ \
+ | | o | | 4:26a8bac39d9f
+ | |/|/ /
+ | o / / 3:27eef8ed80b4
+ |/ / /
+ o / / 2:3d9a33b8d1e1
+ |/ /
+ o / 1:6db2ef61d156
+ |/
+ o 0:e6eb3150255d
+
+
+ $ hg glog
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+ o | changeset: 32:d06dffa21a31
+ |\ \ parent: 27:886ed638191b
+ | | | parent: 31:621d83e11f67
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | | summary: (32) expand
+ | | |
+ | o | changeset: 31:621d83e11f67
+ | |\ \ parent: 21:d42a756af44d
+ | | | | parent: 30:6e11cd4b648f
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:31 1970 +0000
+ | | | | summary: (31) expand
+ | | | |
+ | | o | changeset: 30:6e11cd4b648f
+ | | |\ \ parent: 28:44ecd0b9ae99
+ | | | | | parent: 29:cd9bb2be7593
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:30 1970 +0000
+ | | | | | summary: (30) expand
+ | | | | |
+ | | | o | changeset: 29:cd9bb2be7593
+ | | | | | parent: 0:e6eb3150255d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:29 1970 +0000
+ | | | | | summary: (29) regular commit
+ | | | | |
+ | | o | | changeset: 28:44ecd0b9ae99
+ | | |\ \ \ parent: 1:6db2ef61d156
+ | | | | | | parent: 26:7f25b6c2f0b9
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
+ | | | | | | summary: (28) merge zero known
+ | | | | | |
+ o | | | | | changeset: 27:886ed638191b
+ |/ / / / / parent: 21:d42a756af44d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:27 1970 +0000
+ | | | | | summary: (27) collapse
+ | | | | |
+ | | o---+ changeset: 26:7f25b6c2f0b9
+ | | | | | parent: 18:1aa84d96232a
+ | | | | | parent: 25:91da8ed57247
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:26 1970 +0000
+ | | | | | summary: (26) merge one known; far right
+ | | | | |
+ +---o | | changeset: 25:91da8ed57247
+ | | | | | parent: 21:d42a756af44d
+ | | | | | parent: 24:a9c19a3d96b7
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:25 1970 +0000
+ | | | | | summary: (25) merge one known; far left
+ | | | | |
+ | | o | | changeset: 24:a9c19a3d96b7
+ | | |\| | parent: 0:e6eb3150255d
+ | | | | | parent: 23:a01cddf0766d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:24 1970 +0000
+ | | | | | summary: (24) merge one known; immediate right
+ | | | | |
+ | | o | | changeset: 23:a01cddf0766d
+ | |/| | | parent: 1:6db2ef61d156
+ | | | | | parent: 22:e0d9cccacb5d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:23 1970 +0000
+ | | | | | summary: (23) merge one known; immediate left
+ | | | | |
+ +---o---+ changeset: 22:e0d9cccacb5d
+ | | | | parent: 18:1aa84d96232a
+ | | / / parent: 21:d42a756af44d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:22 1970 +0000
+ | | | | summary: (22) merge two known; one far left, one far right
+ | | | |
+ o | | | changeset: 21:d42a756af44d
+ |\ \ \ \ parent: 19:31ddc2c1573b
+ | | | | | parent: 20:d30ed6450e32
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:21 1970 +0000
+ | | | | | summary: (21) expand
+ | | | | |
+ | o---+-+ changeset: 20:d30ed6450e32
+ | | | | parent: 0:e6eb3150255d
+ | / / / parent: 18:1aa84d96232a
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:20 1970 +0000
+ | | | | summary: (20) merge two known; two far right
+ | | | |
+ o | | | changeset: 19:31ddc2c1573b
+ |\ \ \ \ parent: 15:1dda3f72782d
+ | | | | | parent: 17:44765d7c06e0
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:19 1970 +0000
+ | | | | | summary: (19) expand
+ | | | | |
+ +---+---o changeset: 18:1aa84d96232a
+ | | | | parent: 1:6db2ef61d156
+ | | | | parent: 15:1dda3f72782d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:18 1970 +0000
+ | | | | summary: (18) merge two known; two far left
+ | | | |
+ | o | | changeset: 17:44765d7c06e0
+ | |\ \ \ parent: 12:86b91144a6e9
+ | | | | | parent: 16:3677d192927d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:17 1970 +0000
+ | | | | | summary: (17) expand
+ | | | | |
+ | | o---+ changeset: 16:3677d192927d
+ | | | | | parent: 0:e6eb3150255d
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:16 1970 +0000
+ | | | | summary: (16) merge two known; one immediate right, one near right
+ | | | |
+ o | | | changeset: 15:1dda3f72782d
+ |\ \ \ \ parent: 13:22d8966a97e3
+ | | | | | parent: 14:8eac370358ef
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:15 1970 +0000
+ | | | | | summary: (15) expand
+ | | | | |
+ | o-----+ changeset: 14:8eac370358ef
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 12:86b91144a6e9
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:14 1970 +0000
+ | | | | summary: (14) merge two known; one immediate right, one far right
+ | | | |
+ o | | | changeset: 13:22d8966a97e3
+ |\ \ \ \ parent: 9:7010c0af0a35
+ | | | | | parent: 11:832d76e6bdf2
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:13 1970 +0000
+ | | | | | summary: (13) expand
+ | | | | |
+ +---o | | changeset: 12:86b91144a6e9
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | parent: 9:7010c0af0a35
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:12 1970 +0000
+ | | | | summary: (12) merge two known; one immediate right, one far left
+ | | | |
+ | o | | changeset: 11:832d76e6bdf2
+ | |\ \ \ parent: 6:b105a072e251
+ | | | | | parent: 10:74c64d036d72
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:11 1970 +0000
+ | | | | | summary: (11) expand
+ | | | | |
+ | | o---+ changeset: 10:74c64d036d72
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 6:b105a072e251
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:10 1970 +0000
+ | | | | summary: (10) merge two known; one immediate left, one near right
+ | | | |
+ o | | | changeset: 9:7010c0af0a35
+ |\ \ \ \ parent: 7:b632bb1b1224
+ | | | | | parent: 8:7a0b11f71937
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:09 1970 +0000
+ | | | | | summary: (9) expand
+ | | | | |
+ | o-----+ changeset: 8:7a0b11f71937
+ | | | | | parent: 0:e6eb3150255d
+ |/ / / / parent: 7:b632bb1b1224
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:08 1970 +0000
+ | | | | summary: (8) merge two known; one immediate left, one far right
+ | | | |
+ o | | | changeset: 7:b632bb1b1224
+ |\ \ \ \ parent: 2:3d9a33b8d1e1
+ | | | | | parent: 5:4409d547b708
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:07 1970 +0000
+ | | | | | summary: (7) expand
+ | | | | |
+ +---o | | changeset: 6:b105a072e251
+ | |/ / / parent: 2:3d9a33b8d1e1
+ | | | | parent: 5:4409d547b708
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:06 1970 +0000
+ | | | | summary: (6) merge two known; one immediate left, one far left
+ | | | |
+ | o | | changeset: 5:4409d547b708
+ | |\ \ \ parent: 3:27eef8ed80b4
+ | | | | | parent: 4:26a8bac39d9f
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:05 1970 +0000
+ | | | | | summary: (5) expand
+ | | | | |
+ | | o | | changeset: 4:26a8bac39d9f
+ | |/|/ / parent: 1:6db2ef61d156
+ | | | | parent: 3:27eef8ed80b4
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:04 1970 +0000
+ | | | | summary: (4) merge two known; one immediate left, one immediate right
+ | | | |
+ | o | | changeset: 3:27eef8ed80b4
+ |/ / / user: test
+ | | | date: Thu Jan 01 00:00:03 1970 +0000
+ | | | summary: (3) collapse
+ | | |
+ o | | changeset: 2:3d9a33b8d1e1
+ |/ / user: test
+ | | date: Thu Jan 01 00:00:02 1970 +0000
+ | | summary: (2) collapse
+ | |
+ o | changeset: 1:6db2ef61d156
+ |/ user: test
+ | date: Thu Jan 01 00:00:01 1970 +0000
+ | summary: (1) collapse
+ |
+ o changeset: 0:e6eb3150255d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: (0) root
+
+
+File glog:
+ $ hg glog a
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+ o | changeset: 32:d06dffa21a31
+ |\ \ parent: 27:886ed638191b
+ | | | parent: 31:621d83e11f67
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | | summary: (32) expand
+ | | |
+ | o | changeset: 31:621d83e11f67
+ | |\ \ parent: 21:d42a756af44d
+ | | | | parent: 30:6e11cd4b648f
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:31 1970 +0000
+ | | | | summary: (31) expand
+ | | | |
+ | | o | changeset: 30:6e11cd4b648f
+ | | |\ \ parent: 28:44ecd0b9ae99
+ | | | | | parent: 29:cd9bb2be7593
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:30 1970 +0000
+ | | | | | summary: (30) expand
+ | | | | |
+ | | | o | changeset: 29:cd9bb2be7593
+ | | | | | parent: 0:e6eb3150255d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:29 1970 +0000
+ | | | | | summary: (29) regular commit
+ | | | | |
+ | | o | | changeset: 28:44ecd0b9ae99
+ | | |\ \ \ parent: 1:6db2ef61d156
+ | | | | | | parent: 26:7f25b6c2f0b9
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
+ | | | | | | summary: (28) merge zero known
+ | | | | | |
+ o | | | | | changeset: 27:886ed638191b
+ |/ / / / / parent: 21:d42a756af44d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:27 1970 +0000
+ | | | | | summary: (27) collapse
+ | | | | |
+ | | o---+ changeset: 26:7f25b6c2f0b9
+ | | | | | parent: 18:1aa84d96232a
+ | | | | | parent: 25:91da8ed57247
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:26 1970 +0000
+ | | | | | summary: (26) merge one known; far right
+ | | | | |
+ +---o | | changeset: 25:91da8ed57247
+ | | | | | parent: 21:d42a756af44d
+ | | | | | parent: 24:a9c19a3d96b7
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:25 1970 +0000
+ | | | | | summary: (25) merge one known; far left
+ | | | | |
+ | | o | | changeset: 24:a9c19a3d96b7
+ | | |\| | parent: 0:e6eb3150255d
+ | | | | | parent: 23:a01cddf0766d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:24 1970 +0000
+ | | | | | summary: (24) merge one known; immediate right
+ | | | | |
+ | | o | | changeset: 23:a01cddf0766d
+ | |/| | | parent: 1:6db2ef61d156
+ | | | | | parent: 22:e0d9cccacb5d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:23 1970 +0000
+ | | | | | summary: (23) merge one known; immediate left
+ | | | | |
+ +---o---+ changeset: 22:e0d9cccacb5d
+ | | | | parent: 18:1aa84d96232a
+ | | / / parent: 21:d42a756af44d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:22 1970 +0000
+ | | | | summary: (22) merge two known; one far left, one far right
+ | | | |
+ o | | | changeset: 21:d42a756af44d
+ |\ \ \ \ parent: 19:31ddc2c1573b
+ | | | | | parent: 20:d30ed6450e32
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:21 1970 +0000
+ | | | | | summary: (21) expand
+ | | | | |
+ | o---+-+ changeset: 20:d30ed6450e32
+ | | | | parent: 0:e6eb3150255d
+ | / / / parent: 18:1aa84d96232a
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:20 1970 +0000
+ | | | | summary: (20) merge two known; two far right
+ | | | |
+ o | | | changeset: 19:31ddc2c1573b
+ |\ \ \ \ parent: 15:1dda3f72782d
+ | | | | | parent: 17:44765d7c06e0
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:19 1970 +0000
+ | | | | | summary: (19) expand
+ | | | | |
+ +---+---o changeset: 18:1aa84d96232a
+ | | | | parent: 1:6db2ef61d156
+ | | | | parent: 15:1dda3f72782d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:18 1970 +0000
+ | | | | summary: (18) merge two known; two far left
+ | | | |
+ | o | | changeset: 17:44765d7c06e0
+ | |\ \ \ parent: 12:86b91144a6e9
+ | | | | | parent: 16:3677d192927d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:17 1970 +0000
+ | | | | | summary: (17) expand
+ | | | | |
+ | | o---+ changeset: 16:3677d192927d
+ | | | | | parent: 0:e6eb3150255d
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:16 1970 +0000
+ | | | | summary: (16) merge two known; one immediate right, one near right
+ | | | |
+ o | | | changeset: 15:1dda3f72782d
+ |\ \ \ \ parent: 13:22d8966a97e3
+ | | | | | parent: 14:8eac370358ef
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:15 1970 +0000
+ | | | | | summary: (15) expand
+ | | | | |
+ | o-----+ changeset: 14:8eac370358ef
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 12:86b91144a6e9
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:14 1970 +0000
+ | | | | summary: (14) merge two known; one immediate right, one far right
+ | | | |
+ o | | | changeset: 13:22d8966a97e3
+ |\ \ \ \ parent: 9:7010c0af0a35
+ | | | | | parent: 11:832d76e6bdf2
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:13 1970 +0000
+ | | | | | summary: (13) expand
+ | | | | |
+ +---o | | changeset: 12:86b91144a6e9
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | parent: 9:7010c0af0a35
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:12 1970 +0000
+ | | | | summary: (12) merge two known; one immediate right, one far left
+ | | | |
+ | o | | changeset: 11:832d76e6bdf2
+ | |\ \ \ parent: 6:b105a072e251
+ | | | | | parent: 10:74c64d036d72
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:11 1970 +0000
+ | | | | | summary: (11) expand
+ | | | | |
+ | | o---+ changeset: 10:74c64d036d72
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 6:b105a072e251
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:10 1970 +0000
+ | | | | summary: (10) merge two known; one immediate left, one near right
+ | | | |
+ o | | | changeset: 9:7010c0af0a35
+ |\ \ \ \ parent: 7:b632bb1b1224
+ | | | | | parent: 8:7a0b11f71937
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:09 1970 +0000
+ | | | | | summary: (9) expand
+ | | | | |
+ | o-----+ changeset: 8:7a0b11f71937
+ | | | | | parent: 0:e6eb3150255d
+ |/ / / / parent: 7:b632bb1b1224
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:08 1970 +0000
+ | | | | summary: (8) merge two known; one immediate left, one far right
+ | | | |
+ o | | | changeset: 7:b632bb1b1224
+ |\ \ \ \ parent: 2:3d9a33b8d1e1
+ | | | | | parent: 5:4409d547b708
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:07 1970 +0000
+ | | | | | summary: (7) expand
+ | | | | |
+ +---o | | changeset: 6:b105a072e251
+ | |/ / / parent: 2:3d9a33b8d1e1
+ | | | | parent: 5:4409d547b708
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:06 1970 +0000
+ | | | | summary: (6) merge two known; one immediate left, one far left
+ | | | |
+ | o | | changeset: 5:4409d547b708
+ | |\ \ \ parent: 3:27eef8ed80b4
+ | | | | | parent: 4:26a8bac39d9f
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:05 1970 +0000
+ | | | | | summary: (5) expand
+ | | | | |
+ | | o | | changeset: 4:26a8bac39d9f
+ | |/|/ / parent: 1:6db2ef61d156
+ | | | | parent: 3:27eef8ed80b4
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:04 1970 +0000
+ | | | | summary: (4) merge two known; one immediate left, one immediate right
+ | | | |
+ | o | | changeset: 3:27eef8ed80b4
+ |/ / / user: test
+ | | | date: Thu Jan 01 00:00:03 1970 +0000
+ | | | summary: (3) collapse
+ | | |
+ o | | changeset: 2:3d9a33b8d1e1
+ |/ / user: test
+ | | date: Thu Jan 01 00:00:02 1970 +0000
+ | | summary: (2) collapse
+ | |
+ o | changeset: 1:6db2ef61d156
+ |/ user: test
+ | date: Thu Jan 01 00:00:01 1970 +0000
+ | summary: (1) collapse
+ |
+ o changeset: 0:e6eb3150255d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: (0) root
+
+
+File glog per revset:
+
+ $ hg glog -r 'file("a")'
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+ o | changeset: 32:d06dffa21a31
+ |\ \ parent: 27:886ed638191b
+ | | | parent: 31:621d83e11f67
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | | summary: (32) expand
+ | | |
+ | o | changeset: 31:621d83e11f67
+ | |\ \ parent: 21:d42a756af44d
+ | | | | parent: 30:6e11cd4b648f
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:31 1970 +0000
+ | | | | summary: (31) expand
+ | | | |
+ | | o | changeset: 30:6e11cd4b648f
+ | | |\ \ parent: 28:44ecd0b9ae99
+ | | | | | parent: 29:cd9bb2be7593
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:30 1970 +0000
+ | | | | | summary: (30) expand
+ | | | | |
+ | | | o | changeset: 29:cd9bb2be7593
+ | | | | | parent: 0:e6eb3150255d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:29 1970 +0000
+ | | | | | summary: (29) regular commit
+ | | | | |
+ | | o | | changeset: 28:44ecd0b9ae99
+ | | |\ \ \ parent: 1:6db2ef61d156
+ | | | | | | parent: 26:7f25b6c2f0b9
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:28 1970 +0000
+ | | | | | | summary: (28) merge zero known
+ | | | | | |
+ o | | | | | changeset: 27:886ed638191b
+ |/ / / / / parent: 21:d42a756af44d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:27 1970 +0000
+ | | | | | summary: (27) collapse
+ | | | | |
+ | | o---+ changeset: 26:7f25b6c2f0b9
+ | | | | | parent: 18:1aa84d96232a
+ | | | | | parent: 25:91da8ed57247
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:26 1970 +0000
+ | | | | | summary: (26) merge one known; far right
+ | | | | |
+ +---o | | changeset: 25:91da8ed57247
+ | | | | | parent: 21:d42a756af44d
+ | | | | | parent: 24:a9c19a3d96b7
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:25 1970 +0000
+ | | | | | summary: (25) merge one known; far left
+ | | | | |
+ | | o | | changeset: 24:a9c19a3d96b7
+ | | |\| | parent: 0:e6eb3150255d
+ | | | | | parent: 23:a01cddf0766d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:24 1970 +0000
+ | | | | | summary: (24) merge one known; immediate right
+ | | | | |
+ | | o | | changeset: 23:a01cddf0766d
+ | |/| | | parent: 1:6db2ef61d156
+ | | | | | parent: 22:e0d9cccacb5d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:23 1970 +0000
+ | | | | | summary: (23) merge one known; immediate left
+ | | | | |
+ +---o---+ changeset: 22:e0d9cccacb5d
+ | | | | parent: 18:1aa84d96232a
+ | | / / parent: 21:d42a756af44d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:22 1970 +0000
+ | | | | summary: (22) merge two known; one far left, one far right
+ | | | |
+ o | | | changeset: 21:d42a756af44d
+ |\ \ \ \ parent: 19:31ddc2c1573b
+ | | | | | parent: 20:d30ed6450e32
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:21 1970 +0000
+ | | | | | summary: (21) expand
+ | | | | |
+ | o---+-+ changeset: 20:d30ed6450e32
+ | | | | parent: 0:e6eb3150255d
+ | / / / parent: 18:1aa84d96232a
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:20 1970 +0000
+ | | | | summary: (20) merge two known; two far right
+ | | | |
+ o | | | changeset: 19:31ddc2c1573b
+ |\ \ \ \ parent: 15:1dda3f72782d
+ | | | | | parent: 17:44765d7c06e0
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:19 1970 +0000
+ | | | | | summary: (19) expand
+ | | | | |
+ +---+---o changeset: 18:1aa84d96232a
+ | | | | parent: 1:6db2ef61d156
+ | | | | parent: 15:1dda3f72782d
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:18 1970 +0000
+ | | | | summary: (18) merge two known; two far left
+ | | | |
+ | o | | changeset: 17:44765d7c06e0
+ | |\ \ \ parent: 12:86b91144a6e9
+ | | | | | parent: 16:3677d192927d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:17 1970 +0000
+ | | | | | summary: (17) expand
+ | | | | |
+ | | o---+ changeset: 16:3677d192927d
+ | | | | | parent: 0:e6eb3150255d
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:16 1970 +0000
+ | | | | summary: (16) merge two known; one immediate right, one near right
+ | | | |
+ o | | | changeset: 15:1dda3f72782d
+ |\ \ \ \ parent: 13:22d8966a97e3
+ | | | | | parent: 14:8eac370358ef
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:15 1970 +0000
+ | | | | | summary: (15) expand
+ | | | | |
+ | o-----+ changeset: 14:8eac370358ef
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 12:86b91144a6e9
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:14 1970 +0000
+ | | | | summary: (14) merge two known; one immediate right, one far right
+ | | | |
+ o | | | changeset: 13:22d8966a97e3
+ |\ \ \ \ parent: 9:7010c0af0a35
+ | | | | | parent: 11:832d76e6bdf2
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:13 1970 +0000
+ | | | | | summary: (13) expand
+ | | | | |
+ +---o | | changeset: 12:86b91144a6e9
+ | | |/ / parent: 1:6db2ef61d156
+ | | | | parent: 9:7010c0af0a35
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:12 1970 +0000
+ | | | | summary: (12) merge two known; one immediate right, one far left
+ | | | |
+ | o | | changeset: 11:832d76e6bdf2
+ | |\ \ \ parent: 6:b105a072e251
+ | | | | | parent: 10:74c64d036d72
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:11 1970 +0000
+ | | | | | summary: (11) expand
+ | | | | |
+ | | o---+ changeset: 10:74c64d036d72
+ | | | | | parent: 0:e6eb3150255d
+ | |/ / / parent: 6:b105a072e251
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:10 1970 +0000
+ | | | | summary: (10) merge two known; one immediate left, one near right
+ | | | |
+ o | | | changeset: 9:7010c0af0a35
+ |\ \ \ \ parent: 7:b632bb1b1224
+ | | | | | parent: 8:7a0b11f71937
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:09 1970 +0000
+ | | | | | summary: (9) expand
+ | | | | |
+ | o-----+ changeset: 8:7a0b11f71937
+ | | | | | parent: 0:e6eb3150255d
+ |/ / / / parent: 7:b632bb1b1224
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:08 1970 +0000
+ | | | | summary: (8) merge two known; one immediate left, one far right
+ | | | |
+ o | | | changeset: 7:b632bb1b1224
+ |\ \ \ \ parent: 2:3d9a33b8d1e1
+ | | | | | parent: 5:4409d547b708
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:07 1970 +0000
+ | | | | | summary: (7) expand
+ | | | | |
+ +---o | | changeset: 6:b105a072e251
+ | |/ / / parent: 2:3d9a33b8d1e1
+ | | | | parent: 5:4409d547b708
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:06 1970 +0000
+ | | | | summary: (6) merge two known; one immediate left, one far left
+ | | | |
+ | o | | changeset: 5:4409d547b708
+ | |\ \ \ parent: 3:27eef8ed80b4
+ | | | | | parent: 4:26a8bac39d9f
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:05 1970 +0000
+ | | | | | summary: (5) expand
+ | | | | |
+ | | o | | changeset: 4:26a8bac39d9f
+ | |/|/ / parent: 1:6db2ef61d156
+ | | | | parent: 3:27eef8ed80b4
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:04 1970 +0000
+ | | | | summary: (4) merge two known; one immediate left, one immediate right
+ | | | |
+ | o | | changeset: 3:27eef8ed80b4
+ |/ / / user: test
+ | | | date: Thu Jan 01 00:00:03 1970 +0000
+ | | | summary: (3) collapse
+ | | |
+ o | | changeset: 2:3d9a33b8d1e1
+ |/ / user: test
+ | | date: Thu Jan 01 00:00:02 1970 +0000
+ | | summary: (2) collapse
+ | |
+ o | changeset: 1:6db2ef61d156
+ |/ user: test
+ | date: Thu Jan 01 00:00:01 1970 +0000
+ | summary: (1) collapse
+ |
+ o changeset: 0:e6eb3150255d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: (0) root
+
+
+
+File glog per revset (only merges):
+
+ $ hg log -G -r 'file("a")' -m
+ o changeset: 32:d06dffa21a31
+ |\ parent: 27:886ed638191b
+ | | parent: 31:621d83e11f67
+ | | user: test
+ | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | summary: (32) expand
+ | |
+ o | changeset: 31:621d83e11f67
+ |\| parent: 21:d42a756af44d
+ | | parent: 30:6e11cd4b648f
+ | | user: test
+ | | date: Thu Jan 01 00:00:31 1970 +0000
+ | | summary: (31) expand
+ | |
+ o | changeset: 30:6e11cd4b648f
+ |\ \ parent: 28:44ecd0b9ae99
+ | | | parent: 29:cd9bb2be7593
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:30 1970 +0000
+ | | | summary: (30) expand
+ | | |
+ o | | changeset: 28:44ecd0b9ae99
+ |\ \ \ parent: 1:6db2ef61d156
+ | | | | parent: 26:7f25b6c2f0b9
+ | | | | user: test
+ | | | | date: Thu Jan 01 00:00:28 1970 +0000
+ | | | | summary: (28) merge zero known
+ | | | |
+ o | | | changeset: 26:7f25b6c2f0b9
+ |\ \ \ \ parent: 18:1aa84d96232a
+ | | | | | parent: 25:91da8ed57247
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:26 1970 +0000
+ | | | | | summary: (26) merge one known; far right
+ | | | | |
+ | o-----+ changeset: 25:91da8ed57247
+ | | | | | parent: 21:d42a756af44d
+ | | | | | parent: 24:a9c19a3d96b7
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:25 1970 +0000
+ | | | | | summary: (25) merge one known; far left
+ | | | | |
+ | o | | | changeset: 24:a9c19a3d96b7
+ | |\ \ \ \ parent: 0:e6eb3150255d
+ | | | | | | parent: 23:a01cddf0766d
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:24 1970 +0000
+ | | | | | | summary: (24) merge one known; immediate right
+ | | | | | |
+ | o---+ | | changeset: 23:a01cddf0766d
+ | | | | | | parent: 1:6db2ef61d156
+ | | | | | | parent: 22:e0d9cccacb5d
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:23 1970 +0000
+ | | | | | | summary: (23) merge one known; immediate left
+ | | | | | |
+ | o-------+ changeset: 22:e0d9cccacb5d
+ | | | | | | parent: 18:1aa84d96232a
+ |/ / / / / parent: 21:d42a756af44d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:22 1970 +0000
+ | | | | | summary: (22) merge two known; one far left, one far right
+ | | | | |
+ | | | | o changeset: 21:d42a756af44d
+ | | | | |\ parent: 19:31ddc2c1573b
+ | | | | | | parent: 20:d30ed6450e32
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:21 1970 +0000
+ | | | | | | summary: (21) expand
+ | | | | | |
+ +-+-------o changeset: 20:d30ed6450e32
+ | | | | | parent: 0:e6eb3150255d
+ | | | | | parent: 18:1aa84d96232a
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:20 1970 +0000
+ | | | | | summary: (20) merge two known; two far right
+ | | | | |
+ | | | | o changeset: 19:31ddc2c1573b
+ | | | | |\ parent: 15:1dda3f72782d
+ | | | | | | parent: 17:44765d7c06e0
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:19 1970 +0000
+ | | | | | | summary: (19) expand
+ | | | | | |
+ o---+---+ | changeset: 18:1aa84d96232a
+ | | | | | parent: 1:6db2ef61d156
+ / / / / / parent: 15:1dda3f72782d
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:18 1970 +0000
+ | | | | | summary: (18) merge two known; two far left
+ | | | | |
+ | | | | o changeset: 17:44765d7c06e0
+ | | | | |\ parent: 12:86b91144a6e9
+ | | | | | | parent: 16:3677d192927d
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:17 1970 +0000
+ | | | | | | summary: (17) expand
+ | | | | | |
+ +-+-------o changeset: 16:3677d192927d
+ | | | | | parent: 0:e6eb3150255d
+ | | | | | parent: 1:6db2ef61d156
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:16 1970 +0000
+ | | | | | summary: (16) merge two known; one immediate right, one near right
+ | | | | |
+ | | | o | changeset: 15:1dda3f72782d
+ | | | |\ \ parent: 13:22d8966a97e3
+ | | | | | | parent: 14:8eac370358ef
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:15 1970 +0000
+ | | | | | | summary: (15) expand
+ | | | | | |
+ +-------o | changeset: 14:8eac370358ef
+ | | | | |/ parent: 0:e6eb3150255d
+ | | | | | parent: 12:86b91144a6e9
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:14 1970 +0000
+ | | | | | summary: (14) merge two known; one immediate right, one far right
+ | | | | |
+ | | | o | changeset: 13:22d8966a97e3
+ | | | |\ \ parent: 9:7010c0af0a35
+ | | | | | | parent: 11:832d76e6bdf2
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:13 1970 +0000
+ | | | | | | summary: (13) expand
+ | | | | | |
+ | +---+---o changeset: 12:86b91144a6e9
+ | | | | | parent: 1:6db2ef61d156
+ | | | | | parent: 9:7010c0af0a35
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:12 1970 +0000
+ | | | | | summary: (12) merge two known; one immediate right, one far left
+ | | | | |
+ | | | | o changeset: 11:832d76e6bdf2
+ | | | | |\ parent: 6:b105a072e251
+ | | | | | | parent: 10:74c64d036d72
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:11 1970 +0000
+ | | | | | | summary: (11) expand
+ | | | | | |
+ +---------o changeset: 10:74c64d036d72
+ | | | | |/ parent: 0:e6eb3150255d
+ | | | | | parent: 6:b105a072e251
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:10 1970 +0000
+ | | | | | summary: (10) merge two known; one immediate left, one near right
+ | | | | |
+ | | | o | changeset: 9:7010c0af0a35
+ | | | |\ \ parent: 7:b632bb1b1224
+ | | | | | | parent: 8:7a0b11f71937
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:09 1970 +0000
+ | | | | | | summary: (9) expand
+ | | | | | |
+ +-------o | changeset: 8:7a0b11f71937
+ | | | |/ / parent: 0:e6eb3150255d
+ | | | | | parent: 7:b632bb1b1224
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:08 1970 +0000
+ | | | | | summary: (8) merge two known; one immediate left, one far right
+ | | | | |
+ | | | o | changeset: 7:b632bb1b1224
+ | | | |\ \ parent: 2:3d9a33b8d1e1
+ | | | | | | parent: 5:4409d547b708
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:07 1970 +0000
+ | | | | | | summary: (7) expand
+ | | | | | |
+ | | | +---o changeset: 6:b105a072e251
+ | | | | |/ parent: 2:3d9a33b8d1e1
+ | | | | | parent: 5:4409d547b708
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:06 1970 +0000
+ | | | | | summary: (6) merge two known; one immediate left, one far left
+ | | | | |
+ | | | o | changeset: 5:4409d547b708
+ | | | |\ \ parent: 3:27eef8ed80b4
+ | | | | | | parent: 4:26a8bac39d9f
+ | | | | | | user: test
+ | | | | | | date: Thu Jan 01 00:00:05 1970 +0000
+ | | | | | | summary: (5) expand
+ | | | | | |
+ | +---o | | changeset: 4:26a8bac39d9f
+ | | | |/ / parent: 1:6db2ef61d156
+ | | | | | parent: 3:27eef8ed80b4
+ | | | | | user: test
+ | | | | | date: Thu Jan 01 00:00:04 1970 +0000
+ | | | | | summary: (4) merge two known; one immediate left, one immediate right
+ | | | | |
+
+
+Empty revision range - display nothing:
+ $ hg glog -r 1..0
+
+ $ cd ..
+
+#if no-outer-repo
+
+From outer space:
+ $ hg glog -l1 repo
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ $ hg glog -l1 repo/a
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ $ hg glog -l1 repo/missing
+
+#endif
+
+File log with revs != cset revs:
+ $ hg init flog
+ $ cd flog
+ $ echo one >one
+ $ hg add one
+ $ hg commit -mone
+ $ echo two >two
+ $ hg add two
+ $ hg commit -mtwo
+ $ echo more >two
+ $ hg commit -mmore
+ $ hg glog two
+ @ changeset: 2:12c28321755b
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: more
+ |
+ o changeset: 1:5ac72c0599bf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: two
+ |
+
+Issue1896: File log with explicit style
+ $ hg glog --style=default one
+ o changeset: 0:3d578b4a1f53
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: one
+
+Issue2395: glog --style header and footer
+ $ hg glog --style=xml one
+ <?xml version="1.0"?>
+ <log>
+ o <logentry revision="0" node="3d578b4a1f537d5fcf7301bfa9c0b97adfaa6fb1">
+ <author email="test">test</author>
+ <date>1970-01-01T00:00:00+00:00</date>
+ <msg xml:space="preserve">one</msg>
+ </logentry>
+ </log>
+
+ $ cd ..
+
+Incoming and outgoing:
+
+ $ hg clone -U -r31 repo repo2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 31 changesets with 31 changes to 1 files
+ $ cd repo2
+
+ $ hg incoming --graph ../repo
+ comparing with ../repo
+ searching for changes
+ o changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | parent: 18:1aa84d96232a
+ | user: test
+ | date: Thu Jan 01 00:00:33 1970 +0000
+ | summary: (33) head
+ |
+ o changeset: 32:d06dffa21a31
+ | parent: 27:886ed638191b
+ | parent: 31:621d83e11f67
+ | user: test
+ | date: Thu Jan 01 00:00:32 1970 +0000
+ | summary: (32) expand
+ |
+ o changeset: 27:886ed638191b
+ parent: 21:d42a756af44d
+ user: test
+ date: Thu Jan 01 00:00:27 1970 +0000
+ summary: (27) collapse
+
+ $ cd ..
+
+ $ hg -R repo outgoing --graph repo2
+ comparing with repo2
+ searching for changes
+ @ changeset: 34:fea3ac5810e0
+ | tag: tip
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | parent: 18:1aa84d96232a
+ | user: test
+ | date: Thu Jan 01 00:00:33 1970 +0000
+ | summary: (33) head
+ |
+ o changeset: 32:d06dffa21a31
+ | parent: 27:886ed638191b
+ | parent: 31:621d83e11f67
+ | user: test
+ | date: Thu Jan 01 00:00:32 1970 +0000
+ | summary: (32) expand
+ |
+ o changeset: 27:886ed638191b
+ parent: 21:d42a756af44d
+ user: test
+ date: Thu Jan 01 00:00:27 1970 +0000
+ summary: (27) collapse
+
+
+File + limit with revs != cset revs:
+ $ cd repo
+ $ touch b
+ $ hg ci -Aqm0
+ $ hg glog -l2 a
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+
+File + limit + -ra:b, (b - a) < limit:
+ $ hg glog -l3000 -r32:tip a
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+ o | changeset: 32:d06dffa21a31
+ |\ \ parent: 27:886ed638191b
+ | | | parent: 31:621d83e11f67
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | | summary: (32) expand
+ | | |
+
+Point out a common and an uncommon unshown parent
+
+ $ hg glog -r 'rev(8) or rev(9)'
+ o changeset: 9:7010c0af0a35
+ |\ parent: 7:b632bb1b1224
+ | | parent: 8:7a0b11f71937
+ | | user: test
+ | | date: Thu Jan 01 00:00:09 1970 +0000
+ | | summary: (9) expand
+ | |
+ o | changeset: 8:7a0b11f71937
+ |\| parent: 0:e6eb3150255d
+ | | parent: 7:b632bb1b1224
+ | | user: test
+ | | date: Thu Jan 01 00:00:08 1970 +0000
+ | | summary: (8) merge two known; one immediate left, one far right
+ | |
+
+File + limit + -ra:b, b < tip:
+
+ $ hg glog -l1 -r32:34 a
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+
+file(File) + limit + -ra:b, b < tip:
+
+ $ hg glog -l1 -r32:34 -r 'file("a")'
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+
+limit(file(File) and a::b), b < tip:
+
+ $ hg glog -r 'limit(file("a") and 32::34, 1)'
+ o changeset: 32:d06dffa21a31
+ |\ parent: 27:886ed638191b
+ | | parent: 31:621d83e11f67
+ | | user: test
+ | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | summary: (32) expand
+ | |
+
+File + limit + -ra:b, b < tip:
+
+ $ hg glog -r 'limit(file("a") and 34::32, 1)'
+
+File + limit + -ra:b, b < tip, (b - a) < limit:
+
+ $ hg glog -l10 -r33:34 a
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+
+Do not crash or produce strange graphs if history is buggy
+
+ $ hg branch branch
+ marked working directory as branch branch
+ (branches are permanent and global, did you want a bookmark?)
+ $ commit 36 "buggy merge: identical parents" 35 35
+ $ hg glog -l5
+ @ changeset: 36:08a19a744424
+ | branch: branch
+ | tag: tip
+ | parent: 35:9159c3644c5e
+ | parent: 35:9159c3644c5e
+ | user: test
+ | date: Thu Jan 01 00:00:36 1970 +0000
+ | summary: (36) buggy merge: identical parents
+ |
+ o changeset: 35:9159c3644c5e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: 0
+ |
+ o changeset: 34:fea3ac5810e0
+ | parent: 32:d06dffa21a31
+ | user: test
+ | date: Thu Jan 01 00:00:34 1970 +0000
+ | summary: (34) head
+ |
+ | o changeset: 33:68608f5145f9
+ | | parent: 18:1aa84d96232a
+ | | user: test
+ | | date: Thu Jan 01 00:00:33 1970 +0000
+ | | summary: (33) head
+ | |
+ o | changeset: 32:d06dffa21a31
+ |\ \ parent: 27:886ed638191b
+ | | | parent: 31:621d83e11f67
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:32 1970 +0000
+ | | | summary: (32) expand
+ | | |
+
+Test log -G options
+
+ $ testlog() {
+ > hg log -G --print-revset "$@"
+ > hg log --template 'nodetag {rev}\n' "$@" | grep nodetag \
+ > | sed 's/.*nodetag/nodetag/' > log.nodes
+ > hg log -G --template 'nodetag {rev}\n' "$@" | grep nodetag \
+ > | sed 's/.*nodetag/nodetag/' > glog.nodes
+ > diff -u log.nodes glog.nodes | grep '^[-+@ ]' || :
+ > }
+
+glog always reorders nodes which explains the difference with log
+
+ $ testlog -r 27 -r 25 -r 21 -r 34 -r 32 -r 31
+ ['27', '25', '21', '34', '32', '31']
+ []
+ --- log.nodes * (glob)
+ +++ glog.nodes * (glob)
+ @@ -1,6 +1,6 @@
+ -nodetag 27
+ -nodetag 25
+ -nodetag 21
+ nodetag 34
+ nodetag 32
+ nodetag 31
+ +nodetag 27
+ +nodetag 25
+ +nodetag 21
+ $ testlog -u test -u not-a-user
+ []
+ (group
+ (group
+ (or
+ (func
+ ('symbol', 'user')
+ ('string', 'test'))
+ (func
+ ('symbol', 'user')
+ ('string', 'not-a-user')))))
+ $ testlog -b not-a-branch
+ abort: unknown revision 'not-a-branch'!
+ abort: unknown revision 'not-a-branch'!
+ abort: unknown revision 'not-a-branch'!
+ $ testlog -b 35 -b 36 --only-branch branch
+ []
+ (group
+ (group
+ (or
+ (or
+ (func
+ ('symbol', 'branch')
+ ('string', 'default'))
+ (func
+ ('symbol', 'branch')
+ ('string', 'branch')))
+ (func
+ ('symbol', 'branch')
+ ('string', 'branch')))))
+ $ testlog -k expand -k merge
+ []
+ (group
+ (group
+ (or
+ (func
+ ('symbol', 'keyword')
+ ('string', 'expand'))
+ (func
+ ('symbol', 'keyword')
+ ('string', 'merge')))))
+ $ testlog --only-merges
+ []
+ (group
+ (func
+ ('symbol', 'merge')
+ None))
+ $ testlog --no-merges
+ []
+ (group
+ (not
+ (func
+ ('symbol', 'merge')
+ None)))
+ $ testlog --date '2 0 to 4 0'
+ []
+ (group
+ (func
+ ('symbol', 'date')
+ ('string', '2 0 to 4 0')))
+ $ hg log -G -d 'brace ) in a date'
+ abort: invalid date: 'brace ) in a date'
+ [255]
+ $ testlog --prune 31 --prune 32
+ []
+ (group
+ (group
+ (and
+ (not
+ (group
+ (or
+ ('string', '31')
+ (func
+ ('symbol', 'ancestors')
+ ('string', '31')))))
+ (not
+ (group
+ (or
+ ('string', '32')
+ (func
+ ('symbol', 'ancestors')
+ ('string', '32'))))))))
+
+Dedicated repo for --follow and paths filtering. The g is crafted to
+have 2 filelog topological heads in a linear changeset graph.
+
+ $ cd ..
+ $ hg init follow
+ $ cd follow
+ $ testlog --follow
+ []
+ []
+ $ echo a > a
+ $ echo aa > aa
+ $ echo f > f
+ $ hg ci -Am "add a" a aa f
+ $ hg cp a b
+ $ hg cp f g
+ $ hg ci -m "copy a b"
+ $ mkdir dir
+ $ hg mv b dir
+ $ echo g >> g
+ $ echo f >> f
+ $ hg ci -m "mv b dir/b"
+ $ hg mv a b
+ $ hg cp -f f g
+ $ echo a > d
+ $ hg add d
+ $ hg ci -m "mv a b; add d"
+ $ hg mv dir/b e
+ $ hg ci -m "mv dir/b e"
+ $ hg glog --template '({rev}) {desc|firstline}\n'
+ @ (4) mv dir/b e
+ |
+ o (3) mv a b; add d
+ |
+ o (2) mv b dir/b
+ |
+ o (1) copy a b
+ |
+ o (0) add a
+
+
+ $ testlog a
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'filelog')
+ ('string', 'a'))))
+ $ testlog a b
+ []
+ (group
+ (group
+ (or
+ (func
+ ('symbol', 'filelog')
+ ('string', 'a'))
+ (func
+ ('symbol', 'filelog')
+ ('string', 'b')))))
+
+Test falling back to slow path for non-existing files
+
+ $ testlog a c
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'p:a'))
+ ('string', 'p:c'))))
+
+Test multiple --include/--exclude/paths
+
+ $ testlog --include a --include e --exclude b --exclude e a e
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ (list
+ (list
+ (list
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'p:a'))
+ ('string', 'p:e'))
+ ('string', 'i:a'))
+ ('string', 'i:e'))
+ ('string', 'x:b'))
+ ('string', 'x:e'))))
+
+Test glob expansion of pats
+
+ $ expandglobs=`python -c "import mercurial.util; \
+ > print mercurial.util.expandglobs and 'true' or 'false'"`
+ $ if [ $expandglobs = "true" ]; then
+ > testlog 'a*';
+ > else
+ > testlog a*;
+ > fi;
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'filelog')
+ ('string', 'aa'))))
+
+Test --follow on a directory
+
+ $ testlog -f dir
+ abort: cannot follow file not in parent revision: "dir"
+ abort: cannot follow file not in parent revision: "dir"
+ abort: cannot follow file not in parent revision: "dir"
+
+Test --follow on file not in parent revision
+
+ $ testlog -f a
+ abort: cannot follow file not in parent revision: "a"
+ abort: cannot follow file not in parent revision: "a"
+ abort: cannot follow file not in parent revision: "a"
+
+Test --follow and patterns
+
+ $ testlog -f 'glob:*'
+ abort: can only follow copies/renames for explicit filenames
+ abort: can only follow copies/renames for explicit filenames
+ abort: can only follow copies/renames for explicit filenames
+
+Test --follow on a single rename
+
+ $ hg up -q 2
+ $ testlog -f a
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'follow')
+ ('string', 'a'))))
+
+Test --follow and multiple renames
+
+ $ hg up -q tip
+ $ testlog -f e
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'follow')
+ ('string', 'e'))))
+
+Test --follow and multiple filelog heads
+
+ $ hg up -q 2
+ $ testlog -f g
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'follow')
+ ('string', 'g'))))
+ $ cat log.nodes
+ nodetag 2
+ nodetag 1
+ nodetag 0
+ $ hg up -q tip
+ $ testlog -f g
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'follow')
+ ('string', 'g'))))
+ $ cat log.nodes
+ nodetag 3
+ nodetag 2
+ nodetag 0
+
+Test --follow and multiple files
+
+ $ testlog -f g e
+ []
+ (group
+ (group
+ (or
+ (func
+ ('symbol', 'follow')
+ ('string', 'g'))
+ (func
+ ('symbol', 'follow')
+ ('string', 'e')))))
+ $ cat log.nodes
+ nodetag 4
+ nodetag 3
+ nodetag 2
+ nodetag 1
+ nodetag 0
+
+Test --follow-first
+
+ $ hg up -q 3
+ $ echo ee > e
+ $ hg ci -Am "add another e" e
+ created new head
+ $ hg merge --tool internal:other 4
+ 0 files updated, 1 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ echo merge > e
+ $ hg ci -m "merge 5 and 4"
+ $ testlog --follow-first
+ []
+ (group
+ (func
+ ('symbol', '_firstancestors')
+ ('symbol', '6')))
+
+Cannot compare with log --follow-first FILE as it never worked
+
+ $ hg log -G --print-revset --follow-first e
+ []
+ (group
+ (group
+ (func
+ ('symbol', '_followfirst')
+ ('string', 'e'))))
+ $ hg log -G --follow-first e --template '{rev} {desc|firstline}\n'
+ @ 6 merge 5 and 4
+ |\
+ o | 5 add another e
+ | |
+
+Test --copies
+
+ $ hg log -G --copies --template "{rev} {desc|firstline} \
+ > copies: {file_copies_switch}\n"
+ @ 6 merge 5 and 4 copies:
+ |\
+ | o 5 add another e copies:
+ | |
+ o | 4 mv dir/b e copies: e (dir/b)
+ |/
+ o 3 mv a b; add d copies: b (a)g (f)
+ |
+ o 2 mv b dir/b copies: dir/b (b)
+ |
+ o 1 copy a b copies: b (a)g (f)
+ |
+ o 0 add a copies:
+
+Test "set:..." and parent revision
+
+ $ hg up -q 4
+ $ testlog "set:copied()"
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'p:set:copied()'))))
+ $ testlog --include "set:copied()"
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'i:set:copied()'))))
+ $ testlog -r "sort(file('set:copied()'), -rev)"
+ ["sort(file('set:copied()'), -rev)"]
+ []
+
+Test --removed
+
+ $ testlog --removed
+ []
+ []
+ $ testlog --removed a
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'p:a'))))
+ $ testlog --removed --follow a
+ abort: can only follow copies/renames for explicit filenames
+ abort: can only follow copies/renames for explicit filenames
+ abort: can only follow copies/renames for explicit filenames
+
+Test --patch and --stat with --follow and --follow-first
+
+ $ hg up -q 3
+ $ hg log -G --git --patch b
+ o changeset: 1:216d4c92cf98
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: copy a b
+ |
+ | diff --git a/a b/b
+ | copy from a
+ | copy to b
+ |
+
+ $ hg log -G --git --stat b
+ o changeset: 1:216d4c92cf98
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: copy a b
+ |
+ | a | 0
+ | 1 files changed, 0 insertions(+), 0 deletions(-)
+ |
+
+ $ hg log -G --git --patch --follow b
+ o changeset: 1:216d4c92cf98
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: copy a b
+ |
+ | diff --git a/a b/b
+ | copy from a
+ | copy to b
+ |
+ o changeset: 0:f8035bb17114
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+
+
+ $ hg log -G --git --stat --follow b
+ o changeset: 1:216d4c92cf98
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: copy a b
+ |
+ | a | 0
+ | 1 files changed, 0 insertions(+), 0 deletions(-)
+ |
+ o changeset: 0:f8035bb17114
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+
+ $ hg up -q 6
+ $ hg log -G --git --patch --follow-first e
+ @ changeset: 6:fc281d8ff18d
+ |\ tag: tip
+ | | parent: 5:99b31f1c2782
+ | | parent: 4:17d952250a9d
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: merge 5 and 4
+ | |
+ | | diff --git a/e b/e
+ | | --- a/e
+ | | +++ b/e
+ | | @@ -1,1 +1,1 @@
+ | | -ee
+ | | +merge
+ | |
+ o | changeset: 5:99b31f1c2782
+ | | parent: 3:5918b8d165d1
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: add another e
+ | |
+ | | diff --git a/e b/e
+ | | new file mode 100644
+ | | --- /dev/null
+ | | +++ b/e
+ | | @@ -0,0 +1,1 @@
+ | | +ee
+ | |
+
+Test old-style --rev
+
+ $ hg tag 'foo-bar'
+ $ testlog -r 'foo-bar'
+ ['foo-bar']
+ []
+
+Test --follow and forward --rev
+
+ $ hg up -q 6
+ $ echo g > g
+ $ hg ci -Am 'add g' g
+ created new head
+ $ hg up -q 2
+ $ hg log -G --template "{rev} {desc|firstline}\n"
+ o 8 add g
+ |
+ | o 7 Added tag foo-bar for changeset fc281d8ff18d
+ |/
+ o 6 merge 5 and 4
+ |\
+ | o 5 add another e
+ | |
+ o | 4 mv dir/b e
+ |/
+ o 3 mv a b; add d
+ |
+ @ 2 mv b dir/b
+ |
+ o 1 copy a b
+ |
+ o 0 add a
+
+ $ testlog --follow -r6 -r8 -r5 -r7 -r4
+ ['6', '8', '5', '7', '4']
+ (group
+ (func
+ ('symbol', 'descendants')
+ ('symbol', '6')))
+ --- log.nodes * (glob)
+ +++ glog.nodes * (glob)
+ @@ -1,3 +1,3 @@
+ -nodetag 6
+ nodetag 8
+ nodetag 7
+ +nodetag 6
+
+Test --follow-first and forward --rev
+
+ $ testlog --follow-first -r6 -r8 -r5 -r7 -r4
+ ['6', '8', '5', '7', '4']
+ (group
+ (func
+ ('symbol', '_firstdescendants')
+ ('symbol', '6')))
+ --- log.nodes * (glob)
+ +++ glog.nodes * (glob)
+ @@ -1,3 +1,3 @@
+ -nodetag 6
+ nodetag 8
+ nodetag 7
+ +nodetag 6
+
+Test --follow and backward --rev
+
+ $ testlog --follow -r6 -r5 -r7 -r8 -r4
+ ['6', '5', '7', '8', '4']
+ (group
+ (func
+ ('symbol', 'ancestors')
+ ('symbol', '6')))
+
+Test --follow-first and backward --rev
+
+ $ testlog --follow-first -r6 -r5 -r7 -r8 -r4
+ ['6', '5', '7', '8', '4']
+ (group
+ (func
+ ('symbol', '_firstancestors')
+ ('symbol', '6')))
+
+Test subdir
+
+ $ hg up -q 3
+ $ cd dir
+ $ testlog .
+ []
+ (group
+ (func
+ ('symbol', '_matchfiles')
+ (list
+ (list
+ ('string', 'r:')
+ ('string', 'd:relpath'))
+ ('string', 'p:.'))))
+ $ testlog ../b
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'filelog')
+ ('string', '../b'))))
+ $ testlog -f ../b
+ []
+ (group
+ (group
+ (func
+ ('symbol', 'follow')
+ ('string', 'b'))))
+ $ cd ..
+
+Test --hidden
+
+ $ cat > $HGTMP/testhidden.py << EOF
+ > def reposetup(ui, repo):
+ > for line in repo.opener('hidden'):
+ > ctx = repo[line.strip()]
+ > repo.hiddenrevs.add(ctx.rev())
+ > EOF
+ $ echo '[extensions]' >> .hg/hgrc
+ $ echo "hidden=$HGTMP/testhidden.py" >> .hg/hgrc
+ $ hg id --debug -i -r 0 > .hg/hidden
+ $ testlog
+ []
+ []
+ $ testlog --hidden
+ []
+ []
+
+A template without trailing newline should do something sane
+
+ $ hg glog -r ::2 --template '{rev} {desc}'
+ o 2 mv b dir/b
+ |
+ o 1 copy a b
+ |
+
+Extra newlines must be preserved
+
+ $ hg glog -r ::2 --template '\n{rev} {desc}\n\n'
+ o
+ | 2 mv b dir/b
+ |
+ o
+ | 1 copy a b
+ |
+
+The almost-empty template should do something sane too ...
+
+ $ hg glog -r ::2 --template '\n'
+ o
+ |
+ o
+ |
+
+ $ cd ..
diff --git a/tests/test-gpg.t b/tests/test-gpg.t
new file mode 100644
index 0000000..5ec6fa0
--- /dev/null
+++ b/tests/test-gpg.t
@@ -0,0 +1,34 @@
+Test the GPG extension
+
+ $ "$TESTDIR/hghave" gpg || exit 80
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > gpg=
+ >
+ > [gpg]
+ > cmd=gpg --no-permission-warning --no-secmem-warning --no-auto-check-trustdb --homedir "$TESTDIR/gpg"
+ > EOF
+ $ hg init r
+ $ cd r
+ $ echo foo > foo
+ $ hg ci -Amfoo
+ adding foo
+
+ $ hg sigs
+
+ $ hg sign 0
+ signing 0:e63c23eaa88a
+
+ $ hg sigs
+ hgtest 0:e63c23eaa88ae77967edcf4ea194d31167c478b0
+
+ $ hg sigcheck 0
+ e63c23eaa88a is signed by:
+ hgtest
+
+verify that this test has not modified the trustdb.gpg file back in
+the main hg working dir
+ $ "$TESTDIR/md5sum.py" "$TESTDIR/gpg/trustdb.gpg"
+ f6b9c78c65fa9536e7512bb2ceb338ae */gpg/trustdb.gpg (glob)
+
+ $ cd ..
diff --git a/tests/test-graft.t b/tests/test-graft.t
new file mode 100644
index 0000000..6ec5aec
--- /dev/null
+++ b/tests/test-graft.t
@@ -0,0 +1,535 @@
+Create a repo with some stuff in it:
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ echo a > d
+ $ echo a > e
+ $ hg ci -qAm0
+ $ echo b > a
+ $ hg ci -m1 -u bar
+ $ hg mv a b
+ $ hg ci -m2
+ $ hg cp b c
+ $ hg ci -m3 -u baz
+ $ echo b > d
+ $ echo f > e
+ $ hg ci -m4
+ $ hg up -q 3
+ $ echo b > e
+ $ hg branch -q stable
+ $ hg ci -m5
+ $ hg merge -q default --tool internal:local
+ $ hg branch -q default
+ $ hg ci -m6
+ $ hg phase --public 3
+ $ hg phase --force --secret 6
+
+ $ hg --config extensions.graphlog= log -G --template '{author}@{rev}.{phase}: {desc}\n'
+ @ test@6.secret: 6
+ |\
+ | o test@5.draft: 5
+ | |
+ o | test@4.draft: 4
+ |/
+ o baz@3.public: 3
+ |
+ o test@2.public: 2
+ |
+ o bar@1.public: 1
+ |
+ o test@0.public: 0
+
+
+Need to specify a rev:
+
+ $ hg graft
+ abort: no revisions specified
+ [255]
+
+Can't graft ancestor:
+
+ $ hg graft 1 2
+ skipping ancestor revision 1
+ skipping ancestor revision 2
+ [255]
+
+Specify revisions with -r:
+
+ $ hg graft -r 1 -r 2
+ skipping ancestor revision 1
+ skipping ancestor revision 2
+ [255]
+
+ $ hg graft -r 1 2
+ skipping ancestor revision 2
+ skipping ancestor revision 1
+ [255]
+
+Can't graft with dirty wd:
+
+ $ hg up -q 0
+ $ echo foo > a
+ $ hg graft 1
+ abort: outstanding uncommitted changes
+ [255]
+ $ hg revert a
+
+Graft a rename:
+
+ $ hg graft 2 -u foo
+ grafting revision 2
+ merging a and b to b
+ $ hg export tip --git
+ # HG changeset patch
+ # User foo
+ # Date 0 0
+ # Node ID ef0ef43d49e79e81ddafdc7997401ba0041efc82
+ # Parent 68795b066622ca79a25816a662041d8f78f3cd9e
+ 2
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+
+Look for extra:source
+
+ $ hg log --debug -r tip
+ changeset: 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
+ tag: tip
+ phase: draft
+ parent: 0:68795b066622ca79a25816a662041d8f78f3cd9e
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 7:e59b6b228f9cbf9903d5e9abf996e083a1f533eb
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: b
+ files-: a
+ extra: branch=default
+ extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
+ description:
+ 2
+
+
+
+Graft out of order, skipping a merge and a duplicate
+
+ $ hg graft 1 5 4 3 'merge()' 2 -n
+ skipping ungraftable merge revision 6
+ skipping already grafted revision 2
+ grafting revision 1
+ grafting revision 5
+ grafting revision 4
+ grafting revision 3
+
+ $ hg graft 1 5 4 3 'merge()' 2 --debug
+ skipping ungraftable merge revision 6
+ scanning for duplicate grafts
+ skipping already grafted revision 2
+ grafting revision 1
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 68795b066622, local: ef0ef43d49e7+, remote: 5d205f8b35b6
+ b: local copied/moved to a -> m
+ preserving b for resolve of b
+ updating: b 1/1 files (100.00%)
+ picked tool 'internal:merge' for b (binary False symlink False)
+ merging b and a to b
+ my b@ef0ef43d49e7+ other a@5d205f8b35b6 ancestor a@68795b066622
+ premerge successful
+ b
+ grafting revision 5
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746
+ e: remote is newer -> g
+ updating: e 1/1 files (100.00%)
+ getting e
+ e
+ grafting revision 4
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 4c60f11aa304, local: 1905859650ec+, remote: 9c233e8e184d
+ e: versions differ -> m
+ d: remote is newer -> g
+ preserving e for resolve of e
+ updating: d 1/2 files (50.00%)
+ getting d
+ updating: e 2/2 files (100.00%)
+ picked tool 'internal:merge' for e (binary False symlink False)
+ merging e
+ my e@1905859650ec+ other e@9c233e8e184d ancestor e@68795b066622
+ warning: conflicts during merge.
+ merging e incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts, can't continue
+ (use hg resolve and hg graft --continue)
+ [255]
+
+Continue without resolve should fail:
+
+ $ hg graft -c
+ grafting revision 4
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+
+Fix up:
+
+ $ echo b > e
+ $ hg resolve -m e
+
+Continue with a revision should fail:
+
+ $ hg graft -c 6
+ abort: can't specify --continue and revisions
+ [255]
+
+ $ hg graft -c -r 6
+ abort: can't specify --continue and revisions
+ [255]
+
+Continue for real, clobber usernames
+
+ $ hg graft -c -U
+ grafting revision 4
+ grafting revision 3
+
+Compare with original:
+
+ $ hg diff -r 6
+ $ hg status --rev 0:. -C
+ M d
+ M e
+ A b
+ a
+ A c
+ a
+ R a
+
+View graph:
+
+ $ hg --config extensions.graphlog= log -G --template '{author}@{rev}.{phase}: {desc}\n'
+ @ test@11.draft: 3
+ |
+ o test@10.draft: 4
+ |
+ o test@9.draft: 5
+ |
+ o bar@8.draft: 1
+ |
+ o foo@7.draft: 2
+ |
+ | o test@6.secret: 6
+ | |\
+ | | o test@5.draft: 5
+ | | |
+ | o | test@4.draft: 4
+ | |/
+ | o baz@3.public: 3
+ | |
+ | o test@2.public: 2
+ | |
+ | o bar@1.public: 1
+ |/
+ o test@0.public: 0
+
+Graft again onto another branch should preserve the original source
+ $ hg up -q 0
+ $ echo 'g'>g
+ $ hg add g
+ $ hg ci -m 7
+ created new head
+ $ hg graft 7
+ grafting revision 7
+
+ $ hg log -r 7 --template '{rev}:{node}\n'
+ 7:ef0ef43d49e79e81ddafdc7997401ba0041efc82
+ $ hg log -r 2 --template '{rev}:{node}\n'
+ 2:5c095ad7e90f871700f02dd1fa5012cb4498a2d4
+
+ $ hg log --debug -r tip
+ changeset: 13:9db0f28fd3747e92c57d015f53b5593aeec53c2d
+ tag: tip
+ phase: draft
+ parent: 12:b592ea63bb0c19a6c5c44685ee29a2284f9f1b8f
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 13:dc313617b8c32457c0d589e0dbbedfe71f3cd637
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: b
+ files-: a
+ extra: branch=default
+ extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4
+ description:
+ 2
+
+
+Disallow grafting an already grafted cset onto its original branch
+ $ hg up -q 6
+ $ hg graft 7
+ skipping already grafted revision 7 (was grafted from 2)
+ [255]
+
+Disallow grafting already grafted csets with the same origin onto each other
+ $ hg up -q 13
+ $ hg graft 2
+ skipping already grafted revision 2
+ [255]
+ $ hg graft 7
+ skipping already grafted revision 7 (same origin 2)
+ [255]
+
+ $ hg up -q 7
+ $ hg graft 2
+ skipping already grafted revision 2
+ [255]
+ $ hg graft tip
+ skipping already grafted revision 13 (same origin 2)
+ [255]
+
+Graft with --log
+
+ $ hg up -Cq 1
+ $ hg graft 3 --log -u foo
+ grafting revision 3
+ warning: can't find ancestor for 'c' copied from 'b'!
+ $ hg log --template '{rev} {parents} {desc}\n' -r tip
+ 14 1:5d205f8b35b6 3
+ (grafted from 4c60f11aa304a54ae1c199feb94e7fc771e51ed8)
+
+Resolve conflicted graft
+ $ hg up -q 0
+ $ echo b > a
+ $ hg ci -m 8
+ created new head
+ $ echo a > a
+ $ hg ci -m 9
+ $ hg graft 1 --tool internal:fail
+ grafting revision 1
+ abort: unresolved conflicts, can't continue
+ (use hg resolve and hg graft --continue)
+ [255]
+ $ hg resolve --all
+ merging a
+ $ hg graft -c
+ grafting revision 1
+ $ hg export tip --git
+ # HG changeset patch
+ # User bar
+ # Date 0 0
+ # Node ID 64ecd9071ce83c6e62f538d8ce7709d53f32ebf7
+ # Parent 4bdb9a9d0b84ffee1d30f0dfc7744cade17aa19c
+ 1
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -a
+ +b
+
+Resolve conflicted graft with rename
+ $ echo c > a
+ $ hg ci -m 10
+ $ hg graft 2 --tool internal:fail
+ grafting revision 2
+ abort: unresolved conflicts, can't continue
+ (use hg resolve and hg graft --continue)
+ [255]
+ $ hg resolve --all
+ merging a and b to b
+ $ hg graft -c
+ grafting revision 2
+ $ hg export tip --git
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 2e80e1351d6ed50302fe1e05f8bd1d4d412b6e11
+ # Parent e5a51ae854a8bbaaf25cc5c6a57ff46042dadbb4
+ 2
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+
+Test simple origin(), with and without args
+ $ hg log -r 'origin()'
+ changeset: 1:5d205f8b35b6
+ user: bar
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:5c095ad7e90f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:4c60f11aa304
+ user: baz
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:9c233e8e184d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 5:97f8bfe72746
+ branch: stable
+ parent: 3:4c60f11aa304
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ $ hg log -r 'origin(7)'
+ changeset: 2:5c095ad7e90f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+Now transplant a graft to test following through copies
+ $ hg up -q 0
+ $ hg branch -q dev
+ $ hg ci -qm "dev branch"
+ $ hg --config extensions.transplant= transplant -q 7
+ $ hg log -r 'origin(.)'
+ changeset: 2:5c095ad7e90f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+Test simple destination
+ $ hg log -r 'destination()'
+ changeset: 7:ef0ef43d49e7
+ parent: 0:68795b066622
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 8:6b9e5368ca4e
+ user: bar
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 9:1905859650ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ changeset: 10:52dc0b4c6907
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 11:882b35362a6b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 13:9db0f28fd374
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 14:f64defefacee
+ parent: 1:5d205f8b35b6
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 17:64ecd9071ce8
+ user: bar
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 19:2e80e1351d6e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 21:7e61b508e709
+ branch: dev
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ $ hg log -r 'destination(2)'
+ changeset: 7:ef0ef43d49e7
+ parent: 0:68795b066622
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 13:9db0f28fd374
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 19:2e80e1351d6e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 21:7e61b508e709
+ branch: dev
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+Transplants of grafts can find a destination...
+ $ hg log -r 'destination(7)'
+ changeset: 21:7e61b508e709
+ branch: dev
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+... grafts of grafts unfortunately can't
+ $ hg graft -q 13
+ $ hg log -r 'destination(13)'
+All copies of a cset
+ $ hg log -r 'origin(13) or destination(origin(13))'
+ changeset: 2:5c095ad7e90f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 7:ef0ef43d49e7
+ parent: 0:68795b066622
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 13:9db0f28fd374
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 19:2e80e1351d6e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 21:7e61b508e709
+ branch: dev
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 22:1313d0a825e2
+ branch: dev
+ tag: tip
+ user: foo
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
diff --git a/tests/test-grep.t b/tests/test-grep.t
new file mode 100644
index 0000000..0b4c3f2
--- /dev/null
+++ b/tests/test-grep.t
@@ -0,0 +1,176 @@
+ $ hg init t
+ $ cd t
+ $ echo import > port
+ $ hg add port
+ $ hg commit -m 0 -u spam -d '0 0'
+ $ echo export >> port
+ $ hg commit -m 1 -u eggs -d '1 0'
+ $ echo export > port
+ $ echo vaportight >> port
+ $ echo 'import/export' >> port
+ $ hg commit -m 2 -u spam -d '2 0'
+ $ echo 'import/export' >> port
+ $ hg commit -m 3 -u eggs -d '3 0'
+ $ head -n 3 port > port1
+ $ mv port1 port
+ $ hg commit -m 4 -u spam -d '4 0'
+
+pattern error
+
+ $ hg grep '**test**'
+ grep: invalid match pattern: nothing to repeat
+ [1]
+
+simple
+
+ $ hg grep port port
+ port:4:export
+ port:4:vaportight
+ port:4:import/export
+
+simple with color
+
+ $ hg --config extensions.color= grep --config color.mode=ansi \
+ > --color=always port port
+ port:4:ex\x1b[0;31;1mport\x1b[0m (esc)
+ port:4:va\x1b[0;31;1mport\x1b[0might (esc)
+ port:4:im\x1b[0;31;1mport\x1b[0m/export (esc)
+
+all
+
+ $ hg grep --traceback --all -nu port port
+ port:4:4:-:spam:import/export
+ port:3:4:+:eggs:import/export
+ port:2:1:-:spam:import
+ port:2:2:-:spam:export
+ port:2:1:+:spam:export
+ port:2:2:+:spam:vaportight
+ port:2:3:+:spam:import/export
+ port:1:2:+:eggs:export
+ port:0:1:+:spam:import
+
+other
+
+ $ hg grep import port
+ port:4:import/export
+
+ $ hg cp port port2
+ $ hg commit -m 4 -u spam -d '5 0'
+
+follow
+
+ $ hg grep --traceback -f 'import\n\Z' port2
+ port:0:import
+
+ $ echo deport >> port2
+ $ hg commit -m 5 -u eggs -d '6 0'
+ $ hg grep -f --all -nu port port2
+ port2:6:4:+:eggs:deport
+ port:4:4:-:spam:import/export
+ port:3:4:+:eggs:import/export
+ port:2:1:-:spam:import
+ port:2:2:-:spam:export
+ port:2:1:+:spam:export
+ port:2:2:+:spam:vaportight
+ port:2:3:+:spam:import/export
+ port:1:2:+:eggs:export
+ port:0:1:+:spam:import
+
+ $ cd ..
+ $ hg init t2
+ $ cd t2
+ $ hg grep foobar foo
+ [1]
+ $ hg grep foobar
+ [1]
+ $ echo blue >> color
+ $ echo black >> color
+ $ hg add color
+ $ hg ci -m 0
+ $ echo orange >> color
+ $ hg ci -m 1
+ $ echo black > color
+ $ hg ci -m 2
+ $ echo orange >> color
+ $ echo blue >> color
+ $ hg ci -m 3
+ $ hg grep orange
+ color:3:orange
+ $ hg grep --all orange
+ color:3:+:orange
+ color:2:-:orange
+ color:1:+:orange
+
+
+match in last "line" without newline
+
+ $ python -c 'fp = open("noeol", "wb"); fp.write("no infinite loop"); fp.close();'
+ $ hg ci -Amnoeol
+ adding noeol
+ $ hg grep loop
+ noeol:4:no infinite loop
+
+ $ cd ..
+
+Issue685: trackback in grep -r after rename
+
+Got a traceback when using grep on a single
+revision with renamed files.
+
+ $ hg init issue685
+ $ cd issue685
+ $ echo octarine > color
+ $ hg ci -Amcolor
+ adding color
+ $ hg rename color colour
+ $ hg ci -Am rename
+ $ hg grep octarine
+ colour:1:octarine
+ color:0:octarine
+
+Used to crash here
+
+ $ hg grep -r 1 octarine
+ colour:1:octarine
+ $ cd ..
+
+
+Issue337: test that grep follows parent-child relationships instead
+of just using revision numbers.
+
+ $ hg init issue337
+ $ cd issue337
+
+ $ echo white > color
+ $ hg commit -A -m "0 white"
+ adding color
+
+ $ echo red > color
+ $ hg commit -A -m "1 red"
+
+ $ hg update 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo black > color
+ $ hg commit -A -m "2 black"
+ created new head
+
+ $ hg update --clean 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo blue > color
+ $ hg commit -A -m "3 blue"
+
+ $ hg grep --all red
+ color:3:-:red
+ color:1:+:red
+
+ $ cd ..
+
+ $ hg init a
+ $ cd a
+ $ cp "$TESTDIR/binfile.bin" .
+ $ hg add binfile.bin
+ $ hg ci -m 'add binfile.bin'
+ $ hg grep "MaCam" --all
+ binfile.bin:0:+: Binary file matches
+
+ $ cd ..
diff --git a/tests/test-hardlinks.t b/tests/test-hardlinks.t
new file mode 100644
index 0000000..65978e1
--- /dev/null
+++ b/tests/test-hardlinks.t
@@ -0,0 +1,352 @@
+ $ "$TESTDIR/hghave" hardlink || exit 80
+
+ $ cat > nlinks.py <<EOF
+ > import sys
+ > from mercurial import util
+ > for f in sorted(sys.stdin.readlines()):
+ > f = f[:-1]
+ > print util.nlinks(f), f
+ > EOF
+
+ $ nlinksdir()
+ > {
+ > find $1 -type f | python $TESTTMP/nlinks.py
+ > }
+
+Some implementations of cp can't create hardlinks (replaces 'cp -al' on Linux):
+
+ $ cat > linkcp.py <<EOF
+ > from mercurial import util
+ > import sys
+ > util.copyfiles(sys.argv[1], sys.argv[2], hardlink=True)
+ > EOF
+
+ $ linkcp()
+ > {
+ > python $TESTTMP/linkcp.py $1 $2
+ > }
+
+Prepare repo r1:
+
+ $ hg init r1
+ $ cd r1
+
+ $ echo c1 > f1
+ $ hg add f1
+ $ hg ci -m0
+
+ $ mkdir d1
+ $ cd d1
+ $ echo c2 > f2
+ $ hg add f2
+ $ hg ci -m1
+ $ cd ../..
+
+ $ nlinksdir r1/.hg/store
+ 1 r1/.hg/store/00changelog.i
+ 1 r1/.hg/store/00manifest.i
+ 1 r1/.hg/store/data/d1/f2.i
+ 1 r1/.hg/store/data/f1.i
+ 1 r1/.hg/store/fncache
+ 1 r1/.hg/store/phaseroots
+ 1 r1/.hg/store/undo
+ 1 r1/.hg/store/undo.phaseroots
+
+
+Create hardlinked clone r2:
+
+ $ hg clone -U --debug r1 r2
+ linked 7 files
+ listing keys for "bookmarks"
+
+Create non-hardlinked clone r3:
+
+ $ hg clone --pull r1 r3
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+Repos r1 and r2 should now contain hardlinked files:
+
+ $ nlinksdir r1/.hg/store
+ 2 r1/.hg/store/00changelog.i
+ 2 r1/.hg/store/00manifest.i
+ 2 r1/.hg/store/data/d1/f2.i
+ 2 r1/.hg/store/data/f1.i
+ 2 r1/.hg/store/fncache
+ 1 r1/.hg/store/phaseroots
+ 1 r1/.hg/store/undo
+ 1 r1/.hg/store/undo.phaseroots
+
+ $ nlinksdir r2/.hg/store
+ 2 r2/.hg/store/00changelog.i
+ 2 r2/.hg/store/00manifest.i
+ 2 r2/.hg/store/data/d1/f2.i
+ 2 r2/.hg/store/data/f1.i
+ 2 r2/.hg/store/fncache
+
+Repo r3 should not be hardlinked:
+
+ $ nlinksdir r3/.hg/store
+ 1 r3/.hg/store/00changelog.i
+ 1 r3/.hg/store/00manifest.i
+ 1 r3/.hg/store/data/d1/f2.i
+ 1 r3/.hg/store/data/f1.i
+ 1 r3/.hg/store/fncache
+ 1 r3/.hg/store/phaseroots
+ 1 r3/.hg/store/undo
+ 1 r3/.hg/store/undo.phaseroots
+
+
+Create a non-inlined filelog in r3:
+
+ $ cd r3/d1
+ >>> f = open('data1', 'wb')
+ >>> for x in range(10000):
+ ... f.write("%s\n" % str(x))
+ >>> f.close()
+ $ for j in 0 1 2 3 4 5 6 7 8 9; do
+ > cat data1 >> f2
+ > hg commit -m$j
+ > done
+ $ cd ../..
+
+ $ nlinksdir r3/.hg/store
+ 1 r3/.hg/store/00changelog.i
+ 1 r3/.hg/store/00manifest.i
+ 1 r3/.hg/store/data/d1/f2.d
+ 1 r3/.hg/store/data/d1/f2.i
+ 1 r3/.hg/store/data/f1.i
+ 1 r3/.hg/store/fncache
+ 1 r3/.hg/store/phaseroots
+ 1 r3/.hg/store/undo
+ 1 r3/.hg/store/undo.phaseroots
+
+Push to repo r1 should break up most hardlinks in r2:
+
+ $ hg -R r2 verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+
+ $ cd r3
+ $ hg push
+ pushing to $TESTTMP/r1 (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 10 changesets with 10 changes to 1 files
+
+ $ cd ..
+
+ $ nlinksdir r2/.hg/store
+ 1 r2/.hg/store/00changelog.i
+ 1 r2/.hg/store/00manifest.i
+ 1 r2/.hg/store/data/d1/f2.i
+ 2 r2/.hg/store/data/f1.i
+ 1 r2/.hg/store/fncache
+
+ $ hg -R r2 verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+
+
+ $ cd r1
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Committing a change to f1 in r1 must break up hardlink f1.i in r2:
+
+ $ echo c1c1 >> f1
+ $ hg ci -m00
+ $ cd ..
+
+ $ nlinksdir r2/.hg/store
+ 1 r2/.hg/store/00changelog.i
+ 1 r2/.hg/store/00manifest.i
+ 1 r2/.hg/store/data/d1/f2.i
+ 1 r2/.hg/store/data/f1.i
+ 1 r2/.hg/store/fncache
+
+
+ $ cd r3
+ $ hg tip --template '{rev}:{node|short}\n'
+ 11:a6451b6bc41f
+ $ echo bla > f1
+ $ hg ci -m1
+ $ cd ..
+
+Create hardlinked copy r4 of r3 (on Linux, we would call 'cp -al'):
+
+ $ linkcp r3 r4
+
+r4 has hardlinks in the working dir (not just inside .hg):
+
+ $ nlinksdir r4
+ 2 r4/.hg/00changelog.i
+ 2 r4/.hg/branch
+ 2 r4/.hg/cache/branchheads
+ 2 r4/.hg/cache/tags
+ 2 r4/.hg/dirstate
+ 2 r4/.hg/hgrc
+ 2 r4/.hg/last-message.txt
+ 2 r4/.hg/requires
+ 2 r4/.hg/store/00changelog.i
+ 2 r4/.hg/store/00manifest.i
+ 2 r4/.hg/store/data/d1/f2.d
+ 2 r4/.hg/store/data/d1/f2.i
+ 2 r4/.hg/store/data/f1.i
+ 2 r4/.hg/store/fncache
+ 2 r4/.hg/store/phaseroots
+ 2 r4/.hg/store/undo
+ 2 r4/.hg/store/undo.phaseroots
+ 2 r4/.hg/undo.bookmarks
+ 2 r4/.hg/undo.branch
+ 2 r4/.hg/undo.desc
+ 2 r4/.hg/undo.dirstate
+ 2 r4/d1/data1
+ 2 r4/d1/f2
+ 2 r4/f1
+
+Update back to revision 11 in r4 should break hardlink of file f1:
+
+ $ hg -R r4 up 11
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ nlinksdir r4
+ 2 r4/.hg/00changelog.i
+ 1 r4/.hg/branch
+ 2 r4/.hg/cache/branchheads
+ 2 r4/.hg/cache/tags
+ 1 r4/.hg/dirstate
+ 2 r4/.hg/hgrc
+ 2 r4/.hg/last-message.txt
+ 2 r4/.hg/requires
+ 2 r4/.hg/store/00changelog.i
+ 2 r4/.hg/store/00manifest.i
+ 2 r4/.hg/store/data/d1/f2.d
+ 2 r4/.hg/store/data/d1/f2.i
+ 2 r4/.hg/store/data/f1.i
+ 2 r4/.hg/store/fncache
+ 2 r4/.hg/store/phaseroots
+ 2 r4/.hg/store/undo
+ 2 r4/.hg/store/undo.phaseroots
+ 2 r4/.hg/undo.bookmarks
+ 2 r4/.hg/undo.branch
+ 2 r4/.hg/undo.desc
+ 2 r4/.hg/undo.dirstate
+ 2 r4/d1/data1
+ 2 r4/d1/f2
+ 1 r4/f1
+
+
+Test hardlinking outside hg:
+
+ $ mkdir x
+ $ echo foo > x/a
+
+ $ linkcp x y
+ $ echo bar >> y/a
+
+No diff if hardlink:
+
+ $ diff x/a y/a
+
+Test mq hardlinking:
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+ $ hg qimport -n foo - << EOF
+ > # HG changeset patch
+ > # Date 1 0
+ > diff -r 2588a8b53d66 a
+ > --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/a Wed Jul 23 15:54:29 2008 +0200
+ > @@ -0,0 +1,1 @@
+ > +a
+ > EOF
+ adding foo to series file
+
+ $ hg qpush
+ applying foo
+ now at: foo
+
+ $ cd ..
+ $ linkcp a b
+ $ cd b
+
+ $ hg qimport -n bar - << EOF
+ > # HG changeset patch
+ > # Date 2 0
+ > diff -r 2588a8b53d66 a
+ > --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/b Wed Jul 23 15:54:29 2008 +0200
+ > @@ -0,0 +1,1 @@
+ > +b
+ > EOF
+ adding bar to series file
+
+ $ hg qpush
+ applying bar
+ now at: bar
+
+ $ cat .hg/patches/status
+ 430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
+ 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c:bar
+
+ $ cat .hg/patches/series
+ foo
+ bar
+
+ $ cat ../a/.hg/patches/status
+ 430ed4828a74fa4047bc816a25500f7472ab4bfe:foo
+
+ $ cat ../a/.hg/patches/series
+ foo
+
+Test tags hardlinking:
+
+ $ hg qdel -r qbase:qtip
+ patch foo finalized without changeset message
+ patch bar finalized without changeset message
+
+ $ hg tag -l lfoo
+ $ hg tag foo
+
+ $ cd ..
+ $ linkcp b c
+ $ cd c
+
+ $ hg tag -l -r 0 lbar
+ $ hg tag -r 0 bar
+
+ $ cat .hgtags
+ 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
+ 430ed4828a74fa4047bc816a25500f7472ab4bfe bar
+
+ $ cat .hg/localtags
+ 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo
+ 430ed4828a74fa4047bc816a25500f7472ab4bfe lbar
+
+ $ cat ../b/.hgtags
+ 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c foo
+
+ $ cat ../b/.hg/localtags
+ 4e7abb4840c46a910f6d7b4d3c3fc7e5209e684c lfoo
+
+ $ cd ..
diff --git a/tests/test-help.t b/tests/test-help.t
new file mode 100644
index 0000000..fe1eb25
--- /dev/null
+++ b/tests/test-help.t
@@ -0,0 +1,804 @@
+Short help:
+
+ $ hg
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+
+ $ hg -q
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ $ hg help
+ Mercurial Distributed SCM
+
+ list of commands:
+
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+ annotate show changeset information by line for each file
+ archive create an unversioned archive of a repository revision
+ backout reverse effect of earlier changeset
+ bisect subdivision search of changesets
+ bookmarks track a line of development with movable markers
+ branch set or show the current branch name
+ branches list repository named branches
+ bundle create a changegroup file
+ cat output the current or given revision of files
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ copy mark files as copied for the next commit
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ graft copy changes from other branches onto the current branch
+ grep search for a pattern in specified files and revisions
+ heads show current repository heads or show branch heads
+ help show help for a given topic or a help overview
+ identify identify the working copy or specified revision
+ import import an ordered set of patches
+ incoming show new changesets found in source
+ init create a new repository in the given directory
+ locate locate files matching specific patterns
+ log show revision history of entire repository or files
+ manifest output the current or given revision of the project manifest
+ merge merge working directory with another revision
+ outgoing show changesets not found in the destination
+ parents show the parents of the working directory or revision
+ paths show aliases for remote repositories
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ recover roll back an interrupted transaction
+ remove remove the specified files on the next commit
+ rename rename files; equivalent of copy + remove
+ resolve redo merges or set/view the merge status of files
+ revert restore files to their checkout state
+ rollback roll back the last transaction (dangerous)
+ root print the root (top) of the current working directory
+ serve start stand-alone webserver
+ showconfig show combined config settings from all hgrc files
+ status show changed files in the working directory
+ summary summarize working directory state
+ tag add one or more tags for the current or given revision
+ tags list repository tags
+ tip show the tip revision
+ unbundle apply one or more changegroup files
+ update update working directory (or switch revisions)
+ verify verify the integrity of the repository
+ version output version and copyright information
+
+ additional help topics:
+
+ config Configuration Files
+ dates Date Formats
+ diffs Diff Formats
+ environment Environment Variables
+ extensions Using Additional Features
+ filesets Specifying File Sets
+ glossary Glossary
+ hgignore Syntax for Mercurial Ignore Files
+ hgweb Configuring hgweb
+ merge-tools Merge Tools
+ multirevs Specifying Multiple Revisions
+ patterns File Name Patterns
+ phases Working with Phases
+ revisions Specifying Single Revisions
+ revsets Specifying Revision Sets
+ subrepos Subrepositories
+ templating Template Usage
+ urls URL Paths
+
+ use "hg -v help" to show builtin aliases and global options
+
+ $ hg -q help
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+ annotate show changeset information by line for each file
+ archive create an unversioned archive of a repository revision
+ backout reverse effect of earlier changeset
+ bisect subdivision search of changesets
+ bookmarks track a line of development with movable markers
+ branch set or show the current branch name
+ branches list repository named branches
+ bundle create a changegroup file
+ cat output the current or given revision of files
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ copy mark files as copied for the next commit
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ graft copy changes from other branches onto the current branch
+ grep search for a pattern in specified files and revisions
+ heads show current repository heads or show branch heads
+ help show help for a given topic or a help overview
+ identify identify the working copy or specified revision
+ import import an ordered set of patches
+ incoming show new changesets found in source
+ init create a new repository in the given directory
+ locate locate files matching specific patterns
+ log show revision history of entire repository or files
+ manifest output the current or given revision of the project manifest
+ merge merge working directory with another revision
+ outgoing show changesets not found in the destination
+ parents show the parents of the working directory or revision
+ paths show aliases for remote repositories
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ recover roll back an interrupted transaction
+ remove remove the specified files on the next commit
+ rename rename files; equivalent of copy + remove
+ resolve redo merges or set/view the merge status of files
+ revert restore files to their checkout state
+ rollback roll back the last transaction (dangerous)
+ root print the root (top) of the current working directory
+ serve start stand-alone webserver
+ showconfig show combined config settings from all hgrc files
+ status show changed files in the working directory
+ summary summarize working directory state
+ tag add one or more tags for the current or given revision
+ tags list repository tags
+ tip show the tip revision
+ unbundle apply one or more changegroup files
+ update update working directory (or switch revisions)
+ verify verify the integrity of the repository
+ version output version and copyright information
+
+ additional help topics:
+
+ config Configuration Files
+ dates Date Formats
+ diffs Diff Formats
+ environment Environment Variables
+ extensions Using Additional Features
+ filesets Specifying File Sets
+ glossary Glossary
+ hgignore Syntax for Mercurial Ignore Files
+ hgweb Configuring hgweb
+ merge-tools Merge Tools
+ multirevs Specifying Multiple Revisions
+ patterns File Name Patterns
+ phases Working with Phases
+ revisions Specifying Single Revisions
+ revsets Specifying Revision Sets
+ subrepos Subrepositories
+ templating Template Usage
+ urls URL Paths
+
+Test short command list with verbose option
+
+ $ hg -v help shortlist
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate, blame
+ show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit, ci commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log, history show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove, rm remove the specified files on the next commit
+ serve start stand-alone webserver
+ status, st show changed files in the working directory
+ summary, sum summarize working directory state
+ update, up, checkout, co
+ update working directory (or switch revisions)
+
+ global options:
+
+ -R --repository REPO repository root directory or name of overlay bundle
+ file
+ --cwd DIR change working directory
+ -y --noninteractive do not prompt, automatically pick the first choice for
+ all prompts
+ -q --quiet suppress output
+ -v --verbose enable additional output
+ --config CONFIG [+] set/override config option (use 'section.name=value')
+ --debug enable debugging output
+ --debugger start debugger
+ --encoding ENCODE set the charset encoding (default: ascii)
+ --encodingmode MODE set the charset encoding mode (default: strict)
+ --traceback always print a traceback on exception
+ --time time how long the command takes
+ --profile print command execution profile
+ --version output version information and exit
+ -h --help display help and exit
+
+ [+] marked option can be specified multiple times
+
+ use "hg help" for the full list of commands
+
+ $ hg add -h
+ hg add [OPTION]... [FILE]...
+
+ add the specified files on the next commit
+
+ Schedule files to be version controlled and added to the repository.
+
+ The files will be added to the repository at the next commit. To undo an
+ add before that, see "hg forget".
+
+ If no names are given, add all files to the repository.
+
+ Returns 0 if all files are successfully added.
+
+ options:
+
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
+ -n --dry-run do not perform actions, just print output
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help add" to show more info
+
+Verbose help for add
+
+ $ hg add -hv
+ hg add [OPTION]... [FILE]...
+
+ add the specified files on the next commit
+
+ Schedule files to be version controlled and added to the repository.
+
+ The files will be added to the repository at the next commit. To undo an
+ add before that, see "hg forget".
+
+ If no names are given, add all files to the repository.
+
+ An example showing how new (unknown) files are added automatically by "hg
+ add":
+
+ $ ls
+ foo.c
+ $ hg status
+ ? foo.c
+ $ hg add
+ adding foo.c
+ $ hg status
+ A foo.c
+
+ Returns 0 if all files are successfully added.
+
+ options:
+
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
+ -n --dry-run do not perform actions, just print output
+
+ [+] marked option can be specified multiple times
+
+ global options:
+
+ -R --repository REPO repository root directory or name of overlay bundle
+ file
+ --cwd DIR change working directory
+ -y --noninteractive do not prompt, automatically pick the first choice for
+ all prompts
+ -q --quiet suppress output
+ -v --verbose enable additional output
+ --config CONFIG [+] set/override config option (use 'section.name=value')
+ --debug enable debugging output
+ --debugger start debugger
+ --encoding ENCODE set the charset encoding (default: ascii)
+ --encodingmode MODE set the charset encoding mode (default: strict)
+ --traceback always print a traceback on exception
+ --time time how long the command takes
+ --profile print command execution profile
+ --version output version information and exit
+ -h --help display help and exit
+
+ [+] marked option can be specified multiple times
+
+Test help option with version option
+
+ $ hg add -h --version
+ Mercurial Distributed SCM (version *) (glob)
+ (see http://mercurial.selenic.com for more information)
+
+ Copyright (C) 2005-2012 Matt Mackall and others
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ $ hg add --skjdfks
+ hg add: option --skjdfks not recognized
+ hg add [OPTION]... [FILE]...
+
+ add the specified files on the next commit
+
+ options:
+
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
+ -n --dry-run do not perform actions, just print output
+
+ [+] marked option can be specified multiple times
+
+ use "hg help add" to show the full help text
+ [255]
+
+Test ambiguous command help
+
+ $ hg help ad
+ list of commands:
+
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+
+ use "hg -v help ad" to show builtin aliases and global options
+
+Test command without options
+
+ $ hg help verify
+ hg verify
+
+ verify the integrity of the repository
+
+ Verify the integrity of the current repository.
+
+ This will perform an extensive check of the repository's integrity,
+ validating the hashes and checksums of each entry in the changelog,
+ manifest, and tracked files, as well as the integrity of their crosslinks
+ and indices.
+
+ Returns 0 on success, 1 if errors are encountered.
+
+ use "hg -v help verify" to show more info
+
+ $ hg help diff
+ hg diff [OPTION]... ([-c REV] | [-r REV1 [-r REV2]]) [FILE]...
+
+ diff repository (or selected files)
+
+ Show differences between revisions for the specified files.
+
+ Differences between files are shown using the unified diff format.
+
+ Note:
+ diff may generate unexpected results for merges, as it will default to
+ comparing against the working directory's first parent changeset if no
+ revisions are specified.
+
+ When two revision arguments are given, then changes are shown between
+ those revisions. If only one revision is specified then that revision is
+ compared to the working directory, and, when no revisions are specified,
+ the working directory files are compared to its parent.
+
+ Alternatively you can specify -c/--change with a revision to see the
+ changes in that changeset relative to its first parent.
+
+ Without the -a/--text option, diff will avoid generating diffs of files it
+ detects as binary. With -a, diff will generate a diff anyway, probably
+ with undesirable results.
+
+ Use the -g/--git option to generate diffs in the git extended diff format.
+ For more information, read "hg help diffs".
+
+ Returns 0 on success.
+
+ options:
+
+ -r --rev REV [+] revision
+ -c --change REV change made by revision
+ -a --text treat all files as text
+ -g --git use git extended diff format
+ --nodates omit dates from diff headers
+ -p --show-function show which function each change is in
+ --reverse produce a diff that undoes the changes
+ -w --ignore-all-space ignore white space when comparing lines
+ -b --ignore-space-change ignore changes in the amount of white space
+ -B --ignore-blank-lines ignore changes whose lines are all blank
+ -U --unified NUM number of lines of context to show
+ --stat output diffstat-style summary of changes
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help diff" to show more info
+
+ $ hg help status
+ hg status [OPTION]... [FILE]...
+
+ aliases: st
+
+ show changed files in the working directory
+
+ Show status of files in the repository. If names are given, only files
+ that match are shown. Files that are clean or ignored or the source of a
+ copy/move operation, are not listed unless -c/--clean, -i/--ignored,
+ -C/--copies or -A/--all are given. Unless options described with "show
+ only ..." are given, the options -mardu are used.
+
+ Option -q/--quiet hides untracked (unknown and ignored) files unless
+ explicitly requested with -u/--unknown or -i/--ignored.
+
+ Note:
+ status may appear to disagree with diff if permissions have changed or
+ a merge has occurred. The standard diff format does not report
+ permission changes and diff only reports changes relative to one merge
+ parent.
+
+ If one revision is given, it is used as the base revision. If two
+ revisions are given, the differences between them are shown. The --change
+ option can also be used as a shortcut to list the changed files of a
+ revision from its first parent.
+
+ The codes used to show the status of files are:
+
+ M = modified
+ A = added
+ R = removed
+ C = clean
+ ! = missing (deleted by non-hg command, but still tracked)
+ ? = not tracked
+ I = ignored
+ = origin of the previous file listed as A (added)
+
+ Returns 0 on success.
+
+ options:
+
+ -A --all show status of all files
+ -m --modified show only modified files
+ -a --added show only added files
+ -r --removed show only removed files
+ -d --deleted show only deleted (but tracked) files
+ -c --clean show only files without changes
+ -u --unknown show only unknown (not tracked) files
+ -i --ignored show only ignored files
+ -n --no-status hide status prefix
+ -C --copies show source of copied files
+ -0 --print0 end filenames with NUL, for use with xargs
+ --rev REV [+] show difference from revision
+ --change REV list the changed files of a revision
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -S --subrepos recurse into subrepositories
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help status" to show more info
+
+ $ hg -q help status
+ hg status [OPTION]... [FILE]...
+
+ show changed files in the working directory
+
+ $ hg help foo
+ hg: unknown command 'foo'
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+
+ $ hg skjdfks
+ hg: unknown command 'skjdfks'
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+
+ $ cat > helpext.py <<EOF
+ > import os
+ > from mercurial import commands
+ >
+ > def nohelp(ui, *args, **kwargs):
+ > pass
+ >
+ > cmdtable = {
+ > "nohelp": (nohelp, [], "hg nohelp"),
+ > }
+ >
+ > commands.norepo += ' nohelp'
+ > EOF
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "helpext = `pwd`/helpext.py" >> $HGRCPATH
+
+Test command with no help text
+
+ $ hg help nohelp
+ hg nohelp
+
+ (no help text available)
+
+ use "hg -v help nohelp" to show more info
+
+ $ hg help -k nohelp
+ Commands:
+
+ nohelp hg nohelp
+
+ Extension Commands:
+
+ nohelp (no help text available)
+
+Test that default list of commands omits extension commands
+
+ $ hg help
+ Mercurial Distributed SCM
+
+ list of commands:
+
+ add add the specified files on the next commit
+ addremove add all new files, delete all missing files
+ annotate show changeset information by line for each file
+ archive create an unversioned archive of a repository revision
+ backout reverse effect of earlier changeset
+ bisect subdivision search of changesets
+ bookmarks track a line of development with movable markers
+ branch set or show the current branch name
+ branches list repository named branches
+ bundle create a changegroup file
+ cat output the current or given revision of files
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ copy mark files as copied for the next commit
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ graft copy changes from other branches onto the current branch
+ grep search for a pattern in specified files and revisions
+ heads show current repository heads or show branch heads
+ help show help for a given topic or a help overview
+ identify identify the working copy or specified revision
+ import import an ordered set of patches
+ incoming show new changesets found in source
+ init create a new repository in the given directory
+ locate locate files matching specific patterns
+ log show revision history of entire repository or files
+ manifest output the current or given revision of the project manifest
+ merge merge working directory with another revision
+ outgoing show changesets not found in the destination
+ parents show the parents of the working directory or revision
+ paths show aliases for remote repositories
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ recover roll back an interrupted transaction
+ remove remove the specified files on the next commit
+ rename rename files; equivalent of copy + remove
+ resolve redo merges or set/view the merge status of files
+ revert restore files to their checkout state
+ rollback roll back the last transaction (dangerous)
+ root print the root (top) of the current working directory
+ serve start stand-alone webserver
+ showconfig show combined config settings from all hgrc files
+ status show changed files in the working directory
+ summary summarize working directory state
+ tag add one or more tags for the current or given revision
+ tags list repository tags
+ tip show the tip revision
+ unbundle apply one or more changegroup files
+ update update working directory (or switch revisions)
+ verify verify the integrity of the repository
+ version output version and copyright information
+
+ enabled extensions:
+
+ helpext (no help text available)
+
+ additional help topics:
+
+ config Configuration Files
+ dates Date Formats
+ diffs Diff Formats
+ environment Environment Variables
+ extensions Using Additional Features
+ filesets Specifying File Sets
+ glossary Glossary
+ hgignore Syntax for Mercurial Ignore Files
+ hgweb Configuring hgweb
+ merge-tools Merge Tools
+ multirevs Specifying Multiple Revisions
+ patterns File Name Patterns
+ phases Working with Phases
+ revisions Specifying Single Revisions
+ revsets Specifying Revision Sets
+ subrepos Subrepositories
+ templating Template Usage
+ urls URL Paths
+
+ use "hg -v help" to show builtin aliases and global options
+
+
+
+Test list of commands with command with no help text
+
+ $ hg help helpext
+ helpext extension - no help text available
+
+ list of commands:
+
+ nohelp (no help text available)
+
+ use "hg -v help helpext" to show builtin aliases and global options
+
+Test a help topic
+
+ $ hg help revs
+ Specifying Single Revisions
+
+ Mercurial supports several ways to specify individual revisions.
+
+ A plain integer is treated as a revision number. Negative integers are
+ treated as sequential offsets from the tip, with -1 denoting the tip, -2
+ denoting the revision prior to the tip, and so forth.
+
+ A 40-digit hexadecimal string is treated as a unique revision identifier.
+
+ A hexadecimal string less than 40 characters long is treated as a unique
+ revision identifier and is referred to as a short-form identifier. A
+ short-form identifier is only valid if it is the prefix of exactly one
+ full-length identifier.
+
+ Any other string is treated as a bookmark, tag, or branch name. A bookmark
+ is a movable pointer to a revision. A tag is a permanent name associated
+ with a revision. A branch name denotes the tipmost revision of that
+ branch. Bookmark, tag, and branch names must not contain the ":"
+ character.
+
+ The reserved name "tip" always identifies the most recent revision.
+
+ The reserved name "null" indicates the null revision. This is the revision
+ of an empty repository, and the parent of revision 0.
+
+ The reserved name "." indicates the working directory parent. If no
+ working directory is checked out, it is equivalent to null. If an
+ uncommitted merge is in progress, "." is the revision of the first parent.
+
+Test templating help
+
+ $ hg help templating | egrep '(desc|diffstat|firstline|nonempty) '
+ desc String. The text of the changeset description.
+ diffstat String. Statistics of changes with the following format:
+ firstline Any text. Returns the first line of text.
+ nonempty Any text. Returns '(none)' if the string is empty.
+
+Test help hooks
+
+ $ cat > helphook1.py <<EOF
+ > from mercurial import help
+ >
+ > def rewrite(topic, doc):
+ > return doc + '\nhelphook1\n'
+ >
+ > def extsetup(ui):
+ > help.addtopichook('revsets', rewrite)
+ > EOF
+ $ cat > helphook2.py <<EOF
+ > from mercurial import help
+ >
+ > def rewrite(topic, doc):
+ > return doc + '\nhelphook2\n'
+ >
+ > def extsetup(ui):
+ > help.addtopichook('revsets', rewrite)
+ > EOF
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "helphook1 = `pwd`/helphook1.py" >> $HGRCPATH
+ $ echo "helphook2 = `pwd`/helphook2.py" >> $HGRCPATH
+ $ hg help revsets | grep helphook
+ helphook1
+ helphook2
+
+Test keyword search help
+
+ $ hg help -k clone
+ Topics:
+
+ config Configuration Files
+ extensions Using Additional Features
+ glossary Glossary
+ phases Working with Phases
+ subrepos Subrepositories
+ urls URL Paths
+
+ Commands:
+
+ clone make a copy of an existing repository
+ paths show aliases for remote repositories
+ update update working directory (or switch revisions)
+
+ Extensions:
+
+ relink recreates hardlinks between repository clones
+
+ Extension Commands:
+
+ qclone clone main and patch repository at same time
+
diff --git a/tests/test-hg-parseurl.py b/tests/test-hg-parseurl.py
new file mode 100644
index 0000000..83c4832
--- /dev/null
+++ b/tests/test-hg-parseurl.py
@@ -0,0 +1,13 @@
+from mercurial.hg import parseurl
+
+def testparse(url, branch=[]):
+ print '%s, branches: %r' % parseurl(url, branch)
+
+testparse('http://example.com/no/anchor')
+testparse('http://example.com/an/anchor#foo')
+testparse('http://example.com/no/anchor/branches', branch=['foo'])
+testparse('http://example.com/an/anchor/branches#bar', branch=['foo'])
+testparse('http://example.com/an/anchor/branches-None#foo', branch=None)
+testparse('http://example.com/')
+testparse('http://example.com')
+testparse('http://example.com#foo')
diff --git a/tests/test-hg-parseurl.py.out b/tests/test-hg-parseurl.py.out
new file mode 100644
index 0000000..dd19f30
--- /dev/null
+++ b/tests/test-hg-parseurl.py.out
@@ -0,0 +1,8 @@
+http://example.com/no/anchor, branches: (None, [])
+http://example.com/an/anchor, branches: ('foo', [])
+http://example.com/no/anchor/branches, branches: (None, ['foo'])
+http://example.com/an/anchor/branches, branches: ('bar', ['foo'])
+http://example.com/an/anchor/branches-None, branches: ('foo', [])
+http://example.com/, branches: (None, [])
+http://example.com/, branches: (None, [])
+http://example.com/, branches: ('foo', [])
diff --git a/tests/test-hgcia.t b/tests/test-hgcia.t
new file mode 100644
index 0000000..10e9418
--- /dev/null
+++ b/tests/test-hgcia.t
@@ -0,0 +1,94 @@
+Test the CIA extension
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > hgcia=
+ >
+ > [hooks]
+ > changegroup.cia = python:hgext.hgcia.hook
+ >
+ > [web]
+ > baseurl = http://hgserver/
+ >
+ > [cia]
+ > user = testuser
+ > project = testproject
+ > test = True
+ > EOF
+
+ $ hg init src
+ $ hg init cia
+ $ cd src
+ $ echo foo > foo
+ $ hg ci -Amfoo
+ adding foo
+ $ hg push ../cia
+ pushing to ../cia
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ <message>
+ <generator>
+ <name>Mercurial (hgcia)</name>
+ <version>0.1</version>
+ <url>http://hg.kublai.com/mercurial/hgcia</url>
+ <user>testuser</user>
+ </generator>
+ <source>
+ <project>testproject</project>
+ <branch>default</branch>
+ </source>
+ <body>
+ <commit>
+ <author>test</author>
+ <version>0:e63c23eaa88a</version>
+ <log>foo</log>
+ <url>http://hgserver/rev/e63c23eaa88a</url>
+ <files><file uri="http://hgserver/file/e63c23eaa88a/foo" action="add">foo</file></files>
+ </commit>
+ </body>
+ <timestamp>0</timestamp>
+ </message>
+
+ $ cat >> $HGRCPATH <<EOF
+ > strip = 0
+ > EOF
+
+ $ echo bar > bar
+ $ hg ci -Ambar
+ adding bar
+ $ hg push ../cia
+ pushing to ../cia
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ <message>
+ <generator>
+ <name>Mercurial (hgcia)</name>
+ <version>0.1</version>
+ <url>http://hg.kublai.com/mercurial/hgcia</url>
+ <user>testuser</user>
+ </generator>
+ <source>
+ <project>testproject</project>
+ <branch>default</branch>
+ </source>
+ <body>
+ <commit>
+ <author>test</author>
+ <version>1:c0c7cf58edc5</version>
+ <log>bar</log>
+ <url>http://hgserver/$TESTTMP/cia/rev/c0c7cf58edc5</url>
+ <files><file uri="http://hgserver/$TESTTMP/cia/file/c0c7cf58edc5/bar" action="add">bar</file></files>
+ </commit>
+ </body>
+ <timestamp>0</timestamp>
+ </message>
+
+ $ cd ..
diff --git a/tests/test-hghave.t b/tests/test-hghave.t
new file mode 100644
index 0000000..a9af241
--- /dev/null
+++ b/tests/test-hghave.t
@@ -0,0 +1,3 @@
+Testing that hghave does not crash when checking features
+
+ $ "$TESTDIR/hghave" --test-features 2>/dev/null
diff --git a/tests/test-hgignore.t b/tests/test-hgignore.t
new file mode 100644
index 0000000..3b4a9aa
--- /dev/null
+++ b/tests/test-hgignore.t
@@ -0,0 +1,126 @@
+ $ hg init
+
+Issue562: .hgignore requires newline at end:
+
+ $ touch foo
+ $ touch bar
+ $ touch baz
+ $ cat > makeignore.py <<EOF
+ > f = open(".hgignore", "w")
+ > f.write("ignore\n")
+ > f.write("foo\n")
+ > # No EOL here
+ > f.write("bar")
+ > f.close()
+ > EOF
+
+ $ python makeignore.py
+
+Should display baz only:
+
+ $ hg status
+ ? baz
+
+ $ rm foo bar baz .hgignore makeignore.py
+
+ $ touch a.o
+ $ touch a.c
+ $ touch syntax
+ $ mkdir dir
+ $ touch dir/a.o
+ $ touch dir/b.o
+ $ touch dir/c.o
+
+ $ hg add dir/a.o
+ $ hg commit -m 0
+ $ hg add dir/b.o
+
+ $ hg status
+ A dir/b.o
+ ? a.c
+ ? a.o
+ ? dir/c.o
+ ? syntax
+
+ $ echo "*.o" > .hgignore
+ $ hg status
+ abort: $TESTTMP/.hgignore: invalid pattern (relre): *.o (glob)
+ [255]
+
+ $ echo ".*\.o" > .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? syntax
+
+Check it does not ignore the current directory '.':
+
+ $ echo "^\." > .hgignore
+ $ hg status
+ A dir/b.o
+ ? a.c
+ ? a.o
+ ? dir/c.o
+ ? syntax
+
+ $ echo "glob:**.o" > .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? syntax
+
+ $ echo "glob:*.o" > .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? syntax
+
+ $ echo "syntax: glob" > .hgignore
+ $ echo "re:.*\.o" >> .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? syntax
+
+ $ echo "syntax: invalid" > .hgignore
+ $ hg status
+ $TESTTMP/.hgignore: ignoring invalid syntax 'invalid' (glob)
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? a.o
+ ? dir/c.o
+ ? syntax
+
+ $ echo "syntax: glob" > .hgignore
+ $ echo "*.o" >> .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? syntax
+
+ $ echo "relglob:syntax*" > .hgignore
+ $ hg status
+ A dir/b.o
+ ? .hgignore
+ ? a.c
+ ? a.o
+ ? dir/c.o
+
+ $ echo "relglob:*" > .hgignore
+ $ hg status
+ A dir/b.o
+
+ $ cd dir
+ $ hg status .
+ A b.o
+
+ $ hg debugignore
+ (?:(?:|.*/)[^/]*(?:/|$))
+
+ $ cd ..
diff --git a/tests/test-hgk.t b/tests/test-hgk.t
new file mode 100644
index 0000000..acdbd06
--- /dev/null
+++ b/tests/test-hgk.t
@@ -0,0 +1,20 @@
+Minimal hgk check
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "hgk=" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg debug-cat-file commit 0
+ tree a0c8bcbbb45c
+ parent 000000000000
+ author test 0 0
+ committer test 0 0
+ revision 0
+ branch default
+
+ adda
+
+ $ cd ..
diff --git a/tests/test-hgrc.t b/tests/test-hgrc.t
new file mode 100644
index 0000000..65434ac
--- /dev/null
+++ b/tests/test-hgrc.t
@@ -0,0 +1,203 @@
+hide outer repo
+ $ hg init
+
+Use hgrc within $TESTTMP
+
+ $ HGRCPATH=`pwd`/hgrc
+ $ export HGRCPATH
+
+Use an alternate var for scribbling on hgrc to keep check-code from
+complaining about the important settings we may be overwriting:
+
+ $ HGRC=`pwd`/hgrc
+ $ export HGRC
+
+Basic syntax error
+
+ $ echo "invalid" > $HGRC
+ $ hg version
+ hg: parse error at $TESTTMP/hgrc:1: invalid
+ [255]
+ $ echo "" > $HGRC
+
+Issue1199: Can't use '%' in hgrc (eg url encoded username)
+
+ $ hg init "foo%bar"
+ $ hg clone "foo%bar" foobar
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd foobar
+ $ cat .hg/hgrc
+ [paths]
+ default = $TESTTMP/foo%bar (glob)
+ $ hg paths
+ default = $TESTTMP/foo%bar (glob)
+ $ hg showconfig
+ bundle.mainreporoot=$TESTTMP/foobar (glob)
+ paths.default=$TESTTMP/foo%bar (glob)
+ $ cd ..
+
+issue1829: wrong indentation
+
+ $ echo '[foo]' > $HGRC
+ $ echo ' x = y' >> $HGRC
+ $ hg version
+ hg: parse error at $TESTTMP/hgrc:2: x = y
+ [255]
+
+ $ python -c "print '[foo]\nbar = a\n b\n c \n de\n fg \nbaz = bif cb \n'" \
+ > > $HGRC
+ $ hg showconfig foo
+ foo.bar=a\nb\nc\nde\nfg
+ foo.baz=bif cb
+
+ $ FAKEPATH=/path/to/nowhere
+ $ export FAKEPATH
+ $ echo '%include $FAKEPATH/no-such-file' > $HGRC
+ $ hg version
+ Mercurial Distributed SCM (version *) (glob)
+ (see http://mercurial.selenic.com for more information)
+
+ Copyright (C) 2005-2012 Matt Mackall and others
+ This is free software; see the source for copying conditions. There is NO
+ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ $ unset FAKEPATH
+
+make sure global options given on the cmdline take precedence
+
+ $ hg showconfig --config ui.verbose=True --quiet
+ bundle.mainreporoot=$TESTTMP
+ ui.verbose=False
+ ui.debug=False
+ ui.quiet=True
+
+ $ touch foobar/untracked
+ $ cat >> foobar/.hg/hgrc <<EOF
+ > [ui]
+ > verbose=True
+ > EOF
+ $ hg -R foobar st -q
+
+username expansion
+
+ $ olduser=$HGUSER
+ $ unset HGUSER
+
+ $ FAKEUSER='John Doe'
+ $ export FAKEUSER
+ $ echo '[ui]' > $HGRC
+ $ echo 'username = $FAKEUSER' >> $HGRC
+
+ $ hg init usertest
+ $ cd usertest
+ $ touch bar
+ $ hg commit --addremove --quiet -m "added bar"
+ $ hg log --template "{author}\n"
+ John Doe
+ $ cd ..
+
+ $ hg showconfig
+ bundle.mainreporoot=$TESTTMP
+ ui.username=$FAKEUSER
+
+ $ unset FAKEUSER
+ $ HGUSER=$olduser
+ $ export HGUSER
+
+showconfig with multiple arguments
+
+ $ echo "[alias]" > $HGRC
+ $ echo "log = log -g" >> $HGRC
+ $ echo "[defaults]" >> $HGRC
+ $ echo "identify = -n" >> $HGRC
+ $ hg showconfig alias defaults
+ alias.log=log -g
+ defaults.identify=-n
+ $ hg showconfig alias defaults.identify
+ abort: only one config item permitted
+ [255]
+ $ hg showconfig alias.log defaults.identify
+ abort: only one config item permitted
+ [255]
+
+HGPLAIN
+
+ $ echo "[ui]" > $HGRC
+ $ echo "debug=true" >> $HGRC
+ $ echo "fallbackencoding=ASCII" >> $HGRC
+ $ echo "quiet=true" >> $HGRC
+ $ echo "slash=true" >> $HGRC
+ $ echo "traceback=true" >> $HGRC
+ $ echo "verbose=true" >> $HGRC
+ $ echo "style=~/.hgstyle" >> $HGRC
+ $ echo "logtemplate={node}" >> $HGRC
+ $ echo "[defaults]" >> $HGRC
+ $ echo "identify=-n" >> $HGRC
+ $ echo "[alias]" >> $HGRC
+ $ echo "log=log -g" >> $HGRC
+
+customized hgrc
+
+ $ hg showconfig
+ read config from: $TESTTMP/hgrc
+ $TESTTMP/hgrc:13: alias.log=log -g
+ none: bundle.mainreporoot=$TESTTMP
+ $TESTTMP/hgrc:11: defaults.identify=-n
+ $TESTTMP/hgrc:2: ui.debug=true
+ $TESTTMP/hgrc:3: ui.fallbackencoding=ASCII
+ $TESTTMP/hgrc:4: ui.quiet=true
+ $TESTTMP/hgrc:5: ui.slash=true
+ $TESTTMP/hgrc:6: ui.traceback=true
+ $TESTTMP/hgrc:7: ui.verbose=true
+ $TESTTMP/hgrc:8: ui.style=~/.hgstyle
+ $TESTTMP/hgrc:9: ui.logtemplate={node}
+
+plain hgrc
+
+ $ HGPLAIN=; export HGPLAIN
+ $ hg showconfig --config ui.traceback=True --debug
+ read config from: $TESTTMP/hgrc
+ none: bundle.mainreporoot=$TESTTMP
+ none: ui.traceback=True
+ none: ui.verbose=False
+ none: ui.debug=True
+ none: ui.quiet=False
+
+plain mode with exceptions
+
+ $ cat > plain.py <<EOF
+ > def uisetup(ui):
+ > ui.write('plain: %r\n' % ui.plain())
+ > EOF
+ $ echo "[extensions]" >> $HGRC
+ $ echo "plain=./plain.py" >> $HGRC
+ $ HGPLAINEXCEPT=; export HGPLAINEXCEPT
+ $ hg showconfig --config ui.traceback=True --debug
+ plain: True
+ read config from: $TESTTMP/hgrc
+ none: bundle.mainreporoot=$TESTTMP
+ $TESTTMP/hgrc:15: extensions.plain=./plain.py
+ none: ui.traceback=True
+ none: ui.verbose=False
+ none: ui.debug=True
+ none: ui.quiet=False
+ $ unset HGPLAIN
+ $ hg showconfig --config ui.traceback=True --debug
+ plain: True
+ read config from: $TESTTMP/hgrc
+ none: bundle.mainreporoot=$TESTTMP
+ $TESTTMP/hgrc:15: extensions.plain=./plain.py
+ none: ui.traceback=True
+ none: ui.verbose=False
+ none: ui.debug=True
+ none: ui.quiet=False
+ $ HGPLAINEXCEPT=i18n; export HGPLAINEXCEPT
+ $ hg showconfig --config ui.traceback=True --debug
+ plain: True
+ read config from: $TESTTMP/hgrc
+ none: bundle.mainreporoot=$TESTTMP
+ $TESTTMP/hgrc:15: extensions.plain=./plain.py
+ none: ui.traceback=True
+ none: ui.verbose=False
+ none: ui.debug=True
+ none: ui.quiet=False
diff --git a/tests/test-hgweb-auth.py b/tests/test-hgweb-auth.py
new file mode 100644
index 0000000..8b1f78a
--- /dev/null
+++ b/tests/test-hgweb-auth.py
@@ -0,0 +1,107 @@
+from mercurial import demandimport; demandimport.enable()
+import urllib2
+from mercurial import ui, util
+from mercurial import url
+from mercurial.error import Abort
+
+class myui(ui.ui):
+ def interactive(self):
+ return False
+
+origui = myui()
+
+def writeauth(items):
+ ui = origui.copy()
+ for name, value in items.iteritems():
+ ui.setconfig('auth', name, value)
+ return ui
+
+def dumpdict(dict):
+ return '{' + ', '.join(['%s: %s' % (k, dict[k])
+ for k in sorted(dict.iterkeys())]) + '}'
+
+def test(auth, urls=None):
+ print 'CFG:', dumpdict(auth)
+ prefixes = set()
+ for k in auth:
+ prefixes.add(k.split('.', 1)[0])
+ for p in prefixes:
+ for name in ('.username', '.password'):
+ if (p + name) not in auth:
+ auth[p + name] = p
+ auth = dict((k, v) for k, v in auth.iteritems() if v is not None)
+
+ ui = writeauth(auth)
+
+ def _test(uri):
+ print 'URI:', uri
+ try:
+ pm = url.passwordmgr(ui)
+ u, authinfo = util.url(uri).authinfo()
+ if authinfo is not None:
+ pm.add_password(*authinfo)
+ print ' ', pm.find_user_password('test', u)
+ except Abort, e:
+ print 'abort'
+
+ if not urls:
+ urls = [
+ 'http://example.org/foo',
+ 'http://example.org/foo/bar',
+ 'http://example.org/bar',
+ 'https://example.org/foo',
+ 'https://example.org/foo/bar',
+ 'https://example.org/bar',
+ 'https://x@example.org/bar',
+ 'https://y@example.org/bar',
+ ]
+ for u in urls:
+ _test(u)
+
+
+print '\n*** Test in-uri schemes\n'
+test({'x.prefix': 'http://example.org'})
+test({'x.prefix': 'https://example.org'})
+test({'x.prefix': 'http://example.org', 'x.schemes': 'https'})
+test({'x.prefix': 'https://example.org', 'x.schemes': 'http'})
+
+print '\n*** Test separately configured schemes\n'
+test({'x.prefix': 'example.org', 'x.schemes': 'http'})
+test({'x.prefix': 'example.org', 'x.schemes': 'https'})
+test({'x.prefix': 'example.org', 'x.schemes': 'http https'})
+
+print '\n*** Test prefix matching\n'
+test({'x.prefix': 'http://example.org/foo',
+ 'y.prefix': 'http://example.org/bar'})
+test({'x.prefix': 'http://example.org/foo',
+ 'y.prefix': 'http://example.org/foo/bar'})
+test({'x.prefix': '*', 'y.prefix': 'https://example.org/bar'})
+
+print '\n*** Test user matching\n'
+test({'x.prefix': 'http://example.org/foo',
+ 'x.username': None,
+ 'x.password': 'xpassword'},
+ urls=['http://y@example.org/foo'])
+test({'x.prefix': 'http://example.org/foo',
+ 'x.username': None,
+ 'x.password': 'xpassword',
+ 'y.prefix': 'http://example.org/foo',
+ 'y.username': 'y',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo'])
+test({'x.prefix': 'http://example.org/foo/bar',
+ 'x.username': None,
+ 'x.password': 'xpassword',
+ 'y.prefix': 'http://example.org/foo',
+ 'y.username': 'y',
+ 'y.password': 'ypassword'},
+ urls=['http://y@example.org/foo/bar'])
+
+def testauthinfo(fullurl, authurl):
+ print 'URIs:', fullurl, authurl
+ pm = urllib2.HTTPPasswordMgrWithDefaultRealm()
+ pm.add_password(*util.url(fullurl).authinfo()[1])
+ print pm.find_user_password('test', authurl)
+
+print '\n*** Test urllib2 and util.url\n'
+testauthinfo('http://user@example.com:8080/foo', 'http://example.com:8080/foo')
diff --git a/tests/test-hgweb-auth.py.out b/tests/test-hgweb-auth.py.out
new file mode 100644
index 0000000..f82bb3e
--- /dev/null
+++ b/tests/test-hgweb-auth.py.out
@@ -0,0 +1,196 @@
+
+*** Test in-uri schemes
+
+CFG: {x.prefix: http://example.org}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('x', 'x')
+URI: http://example.org/bar
+ ('x', 'x')
+URI: https://example.org/foo
+ abort
+URI: https://example.org/foo/bar
+ abort
+URI: https://example.org/bar
+ abort
+URI: https://x@example.org/bar
+ abort
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: https://example.org}
+URI: http://example.org/foo
+ abort
+URI: http://example.org/foo/bar
+ abort
+URI: http://example.org/bar
+ abort
+URI: https://example.org/foo
+ ('x', 'x')
+URI: https://example.org/foo/bar
+ ('x', 'x')
+URI: https://example.org/bar
+ ('x', 'x')
+URI: https://x@example.org/bar
+ ('x', 'x')
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: http://example.org, x.schemes: https}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('x', 'x')
+URI: http://example.org/bar
+ ('x', 'x')
+URI: https://example.org/foo
+ abort
+URI: https://example.org/foo/bar
+ abort
+URI: https://example.org/bar
+ abort
+URI: https://x@example.org/bar
+ abort
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: https://example.org, x.schemes: http}
+URI: http://example.org/foo
+ abort
+URI: http://example.org/foo/bar
+ abort
+URI: http://example.org/bar
+ abort
+URI: https://example.org/foo
+ ('x', 'x')
+URI: https://example.org/foo/bar
+ ('x', 'x')
+URI: https://example.org/bar
+ ('x', 'x')
+URI: https://x@example.org/bar
+ ('x', 'x')
+URI: https://y@example.org/bar
+ abort
+
+*** Test separately configured schemes
+
+CFG: {x.prefix: example.org, x.schemes: http}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('x', 'x')
+URI: http://example.org/bar
+ ('x', 'x')
+URI: https://example.org/foo
+ abort
+URI: https://example.org/foo/bar
+ abort
+URI: https://example.org/bar
+ abort
+URI: https://x@example.org/bar
+ abort
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: example.org, x.schemes: https}
+URI: http://example.org/foo
+ abort
+URI: http://example.org/foo/bar
+ abort
+URI: http://example.org/bar
+ abort
+URI: https://example.org/foo
+ ('x', 'x')
+URI: https://example.org/foo/bar
+ ('x', 'x')
+URI: https://example.org/bar
+ ('x', 'x')
+URI: https://x@example.org/bar
+ ('x', 'x')
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: example.org, x.schemes: http https}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('x', 'x')
+URI: http://example.org/bar
+ ('x', 'x')
+URI: https://example.org/foo
+ ('x', 'x')
+URI: https://example.org/foo/bar
+ ('x', 'x')
+URI: https://example.org/bar
+ ('x', 'x')
+URI: https://x@example.org/bar
+ ('x', 'x')
+URI: https://y@example.org/bar
+ abort
+
+*** Test prefix matching
+
+CFG: {x.prefix: http://example.org/foo, y.prefix: http://example.org/bar}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('x', 'x')
+URI: http://example.org/bar
+ ('y', 'y')
+URI: https://example.org/foo
+ abort
+URI: https://example.org/foo/bar
+ abort
+URI: https://example.org/bar
+ abort
+URI: https://x@example.org/bar
+ abort
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: http://example.org/foo, y.prefix: http://example.org/foo/bar}
+URI: http://example.org/foo
+ ('x', 'x')
+URI: http://example.org/foo/bar
+ ('y', 'y')
+URI: http://example.org/bar
+ abort
+URI: https://example.org/foo
+ abort
+URI: https://example.org/foo/bar
+ abort
+URI: https://example.org/bar
+ abort
+URI: https://x@example.org/bar
+ abort
+URI: https://y@example.org/bar
+ abort
+CFG: {x.prefix: *, y.prefix: https://example.org/bar}
+URI: http://example.org/foo
+ abort
+URI: http://example.org/foo/bar
+ abort
+URI: http://example.org/bar
+ abort
+URI: https://example.org/foo
+ ('x', 'x')
+URI: https://example.org/foo/bar
+ ('x', 'x')
+URI: https://example.org/bar
+ ('y', 'y')
+URI: https://x@example.org/bar
+ ('x', 'x')
+URI: https://y@example.org/bar
+ ('y', 'y')
+
+*** Test user matching
+
+CFG: {x.password: xpassword, x.prefix: http://example.org/foo, x.username: None}
+URI: http://y@example.org/foo
+ ('y', 'xpassword')
+CFG: {x.password: xpassword, x.prefix: http://example.org/foo, x.username: None, y.password: ypassword, y.prefix: http://example.org/foo, y.username: y}
+URI: http://y@example.org/foo
+ ('y', 'ypassword')
+CFG: {x.password: xpassword, x.prefix: http://example.org/foo/bar, x.username: None, y.password: ypassword, y.prefix: http://example.org/foo, y.username: y}
+URI: http://y@example.org/foo/bar
+ ('y', 'xpassword')
+
+*** Test urllib2 and util.url
+
+URIs: http://user@example.com:8080/foo http://example.com:8080/foo
+('user', '')
diff --git a/tests/test-hgweb-commands.t b/tests/test-hgweb-commands.t
new file mode 100644
index 0000000..acf337e
--- /dev/null
+++ b/tests/test-hgweb-commands.t
@@ -0,0 +1,1363 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+An attempt at more fully testing the hgweb web interface.
+The following things are tested elsewhere and are therefore omitted:
+- archive, tested in test-archive
+- unbundle, tested in test-push-http
+- changegroupsubset, tested in test-pull
+
+Set up the repo
+
+ $ hg init test
+ $ cd test
+ $ mkdir da
+ $ echo foo > da/foo
+ $ echo foo > foo
+ $ hg ci -Ambase
+ adding da/foo
+ adding foo
+ $ hg tag 1.0
+ $ hg bookmark something
+ $ hg bookmark -r0 anotherthing
+ $ echo another > foo
+ $ hg branch stable
+ marked working directory as branch stable
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Ambranch
+ $ hg branch unstable
+ marked working directory as branch unstable
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Ambranch
+ $ echo [graph] >> .hg/hgrc
+ $ echo default.width = 3 >> .hg/hgrc
+ $ echo stable.width = 3 >> .hg/hgrc
+ $ echo stable.color = FF0000 >> .hg/hgrc
+ $ hg serve --config server.uncompressed=False -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg log -G --template '{rev}:{node|short} {desc}\n'
+ @ 3:ba87b23d29ca branch
+ |
+ o 2:1d22e65f027e branch
+ |
+ o 1:a4f92ed23982 Added tag 1.0 for changeset 2ef0ac749a14
+ |
+ o 0:2ef0ac749a14 base
+
+
+Logs and changes
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/?style=atom'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://*:$HGPORT/</id> (glob)
+ <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
+ <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
+ <title>test Changelog</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>branch</title>
+ <id>http://*:$HGPORT/#changeset-ba87b23d29ca67a305625d81a20ac279c1e3f444</id> (glob)
+ <link href="http://*:$HGPORT/rev/ba87b23d29ca"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">branch</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>branch</title>
+ <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
+ <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">branch</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
+ <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
+ <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>base</title>
+ <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
+ <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">base</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/1/?style=atom'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://*:$HGPORT/</id> (glob)
+ <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
+ <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
+ <title>test Changelog</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>branch</title>
+ <id>http://*:$HGPORT/#changeset-ba87b23d29ca67a305625d81a20ac279c1e3f444</id> (glob)
+ <link href="http://*:$HGPORT/rev/ba87b23d29ca"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">branch</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>branch</title>
+ <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
+ <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">branch</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
+ <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
+ <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>base</title>
+ <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
+ <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">base</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log/1/foo/?style=atom'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <id>http://*:$HGPORT/atom-log/tip/foo</id> (glob)
+ <link rel="self" href="http://*:$HGPORT/atom-log/tip/foo"/> (glob)
+ <title>test: foo history</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>base</title>
+ <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
+ <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">base</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'shortlog/'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: log</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li class="active">log</li>
+ <li><a href="/graph/ba87b23d29ca">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/ba87b23d29ca">changeset</a></li>
+ <li><a href="/file/ba87b23d29ca">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/shortlog/3?revcount=30">less</a>
+ <a href="/shortlog/3?revcount=120">more</a>
+ | rev 3: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/ba87b23d29ca">branch</a><span class="branchhead">unstable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/shortlog/3?revcount=30">less</a>
+ <a href="/shortlog/3?revcount=120">more</a>
+ | rev 3: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/0/'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 2ef0ac749a14</title>
+ </head>
+ <body>
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/2ef0ac749a14">log</a></li>
+ <li><a href="/graph/2ef0ac749a14">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li class="active">changeset</li>
+ <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
+ <li><a href="/file/2ef0ac749a14">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> <span class="tag">anotherthing</span> </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">base</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
+ </tr>
+ <tr>
+ <th class="files">files</th>
+ <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
+ </tr>
+ <tr>
+ <th class="diffstat">diffstat</th>
+ <td class="diffstat">
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+
+ <a id="diffstatexpand" href="javascript:showDiffstat()"/>[<tt>+</tt>]</a>
+ <div id="diffstatdetails" style="display:none;">
+ <a href="javascript:hideDiffstat()"/>[<tt>-</tt>]</a>
+ <p>
+ <table> <tr class="parity0">
+ <td class="diffstat-file"><a href="#l1.1">da/foo</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="diffstat-file"><a href="#l2.1">foo</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
+ </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
+ </span></pre></div>
+ </div>
+
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'rev/1/?style=raw'
+ 200 Script output follows
+
+
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
+ # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
+ Added tag 1.0 for changeset 2ef0ac749a14
+
+ diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'log?rev=base'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: searching for base</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog">log</a></li>
+ <li><a href="/graph">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>searching for 'base'</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30"></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/search/?rev=base&revcount=5">less</a>
+ <a href="/search/?rev=base&revcount=20">more</a>
+ </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/search/?rev=base&revcount=5">less</a>
+ <a href="/search/?rev=base&revcount=20">more</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+File-related
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/1/foo/?style=raw'
+ 200 Script output follows
+
+ foo
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'annotate/1/foo/?style=raw'
+ 200 Script output follows
+
+
+ test@0: foo
+
+
+
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/1/?style=raw'
+ 200 Script output follows
+
+
+ drwxr-xr-x da
+ -rw-r--r-- 45 .hgtags
+ -rw-r--r-- 4 foo
+
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/1/foo'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a4f92ed23982 foo</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/a4f92ed23982">log</a></li>
+ <li><a href="/graph/a4f92ed23982">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/a4f92ed23982">changeset</a></li>
+ <li><a href="/file/a4f92ed23982/">browse</a></li>
+ </ul>
+ <ul>
+ <li class="active">file</li>
+ <li><a href="/file/tip/foo">latest</a></li>
+ <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
+ <li><a href="/comparison/a4f92ed23982/foo">comparison</a></li>
+ <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
+ <li><a href="/log/a4f92ed23982/foo">file log</a></li>
+ <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>view foo @ 1:a4f92ed23982</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line source</div>
+
+ <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
+ </div>
+ <div class="sourcelast"></div>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'filediff/0/foo/?style=raw'
+ 200 Script output follows
+
+
+ diff -r 000000000000 -r 2ef0ac749a14 foo
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/foo Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +foo
+
+
+
+
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'filediff/1/foo/?style=raw'
+ 200 Script output follows
+
+
+
+
+
+
+
+Overviews
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'raw-tags'
+ 200 Script output follows
+
+ tip ba87b23d29ca67a305625d81a20ac279c1e3f444
+ 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'raw-branches'
+ 200 Script output follows
+
+ unstable ba87b23d29ca67a305625d81a20ac279c1e3f444 open
+ stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe inactive
+ default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'raw-bookmarks'
+ 200 Script output follows
+
+ anotherthing 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
+ something ba87b23d29ca67a305625d81a20ac279c1e3f444
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'summary/?style=gitweb'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow"/>
+ <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: Summary</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test"/>
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test"/>
+ </head>
+ <body>
+
+ <div class="page_header">
+ <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
+
+ <form action="/log">
+ <input type="hidden" name="style" value="gitweb" />
+ <div class="search">
+ <input type="text" name="rev" />
+ </div>
+ </form>
+ </div>
+
+ <div class="page_nav">
+ summary |
+ <a href="/shortlog?style=gitweb">shortlog</a> |
+ <a href="/log?style=gitweb">changelog</a> |
+ <a href="/graph?style=gitweb">graph</a> |
+ <a href="/tags?style=gitweb">tags</a> |
+ <a href="/bookmarks?style=gitweb">bookmarks</a> |
+ <a href="/branches?style=gitweb">branches</a> |
+ <a href="/file/ba87b23d29ca?style=gitweb">files</a> |
+ <a href="/help?style=gitweb">help</a>
+ <br/>
+ </div>
+
+ <div class="title">&nbsp;</div>
+ <table cellspacing="0">
+ <tr><td>description</td><td>unknown</td></tr>
+ <tr><td>owner</td><td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td></tr>
+ <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
+ </table>
+
+ <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
+ <table cellspacing="0">
+
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><i>test</i></td>
+ <td>
+ <a class="list" href="/rev/ba87b23d29ca?style=gitweb">
+ <b>branch</b>
+ <span class="logtags"><span class="branchtag" title="unstable">unstable</span> <span class="tagtag" title="tip">tip</span> <span class="bookmarktag" title="something">something</span> </span>
+ </a>
+ </td>
+ <td class="link" nowrap>
+ <a href="/rev/ba87b23d29ca?style=gitweb">changeset</a> |
+ <a href="/file/ba87b23d29ca?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><i>test</i></td>
+ <td>
+ <a class="list" href="/rev/1d22e65f027e?style=gitweb">
+ <b>branch</b>
+ <span class="logtags"><span class="branchtag" title="stable">stable</span> </span>
+ </a>
+ </td>
+ <td class="link" nowrap>
+ <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
+ <a href="/file/1d22e65f027e?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><i>test</i></td>
+ <td>
+ <a class="list" href="/rev/a4f92ed23982?style=gitweb">
+ <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
+ <span class="logtags"><span class="branchtag" title="default">default</span> </span>
+ </a>
+ </td>
+ <td class="link" nowrap>
+ <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
+ <a href="/file/a4f92ed23982?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><i>test</i></td>
+ <td>
+ <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
+ <b>base</b>
+ <span class="logtags"><span class="tagtag" title="1.0">1.0</span> <span class="bookmarktag" title="anotherthing">anotherthing</span> </span>
+ </a>
+ </td>
+ <td class="link" nowrap>
+ <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
+ <a href="/file/2ef0ac749a14?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
+ </table>
+
+ <div><a class="title" href="/tags?style=gitweb">tags</a></div>
+ <table cellspacing="0">
+
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
+ <td class="link">
+ <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
+ <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
+ <a href="/file/2ef0ac749a14?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
+ </table>
+
+ <div><a class="title" href="/bookmarks?style=gitweb">bookmarks</a></div>
+ <table cellspacing="0">
+
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>anotherthing</b></a></td>
+ <td class="link">
+ <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
+ <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
+ <a href="/file/2ef0ac749a14?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/rev/ba87b23d29ca?style=gitweb"><b>something</b></a></td>
+ <td class="link">
+ <a href="/rev/ba87b23d29ca?style=gitweb">changeset</a> |
+ <a href="/log/ba87b23d29ca?style=gitweb">changelog</a> |
+ <a href="/file/ba87b23d29ca?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="light"><td colspan="3"><a class="list" href="/bookmarks?style=gitweb">...</a></td></tr>
+ </table>
+
+ <div><a class="title" href="/branches?style=gitweb">branches</a></div>
+ <table cellspacing="0">
+
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/shortlog/ba87b23d29ca?style=gitweb"><b>ba87b23d29ca</b></a></td>
+ <td class="">unstable</td>
+ <td class="link">
+ <a href="/changeset/ba87b23d29ca?style=gitweb">changeset</a> |
+ <a href="/log/ba87b23d29ca?style=gitweb">changelog</a> |
+ <a href="/file/ba87b23d29ca?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
+ <td class="">stable</td>
+ <td class="link">
+ <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
+ <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
+ <a href="/file/1d22e65f027e?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="parity0">
+ <td class="age"><i class="age">Thu, 01 Jan 1970 00:00:00 +0000</i></td>
+ <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
+ <td class="">default</td>
+ <td class="link">
+ <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
+ <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
+ <a href="/file/a4f92ed23982?style=gitweb">files</a>
+ </td>
+ </tr>
+ <tr class="light">
+ <td colspan="4"><a class="list" href="/branches?style=gitweb">...</a></td>
+ </tr>
+ </table>
+ <script type="text/javascript">process_dates()</script>
+ <div class="page_footer">
+ <div class="page_footer_text">test</div>
+ <div class="rss_logo">
+ <a href="/rss-log">RSS</a>
+ <a href="/atom-log">Atom</a>
+ </div>
+ <br />
+
+ </div>
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/?style=gitweb'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow"/>
+ <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: Graph</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test"/>
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test"/>
+ <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
+ </head>
+ <body>
+
+ <div class="page_header">
+ <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
+ </div>
+
+ <form action="/log">
+ <input type="hidden" name="style" value="gitweb" />
+ <div class="search">
+ <input type="text" name="rev" />
+ </div>
+ </form>
+ <div class="page_nav">
+ <a href="/summary?style=gitweb">summary</a> |
+ <a href="/shortlog?style=gitweb">shortlog</a> |
+ <a href="/log/3?style=gitweb">changelog</a> |
+ graph |
+ <a href="/tags?style=gitweb">tags</a> |
+ <a href="/bookmarks?style=gitweb">bookmarks</a> |
+ <a href="/branches?style=gitweb">branches</a> |
+ <a href="/file/ba87b23d29ca?style=gitweb">files</a> |
+ <a href="/help?style=gitweb">help</a>
+ <br/>
+ <a href="/graph/3?style=gitweb&revcount=30">less</a>
+ <a href="/graph/3?style=gitweb&revcount=120">more</a>
+ | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
+ </div>
+
+ <div class="title">&nbsp;</div>
+
+ <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
+
+ <div id="wrapper">
+ <ul id="nodebgs"></ul>
+ <canvas id="graph" width="480" height="168"></canvas>
+ <ul id="graphnodes"></ul>
+ </div>
+
+ <script>
+ <!-- hide script content
+
+ var data = [["ba87b23d29ca", [0, 1], [[0, 0, 1, 3, "FF0000"]], "branch", "test", "1970-01-01", ["unstable", true], ["tip"], ["something"]], ["1d22e65f027e", [0, 1], [[0, 0, 1, 3, ""]], "branch", "test", "1970-01-01", ["stable", true], [], []], ["a4f92ed23982", [0, 1], [[0, 0, 1, 3, ""]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
+ var graph = new Graph();
+ graph.scale(39);
+
+ var revlink = '<li style="_STYLE"><span class="desc">';
+ revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
+ revlink += '</span> _TAGS';
+ revlink += '<span class="info">_DATE, by _USER</span></li>';
+
+ graph.vertex = function(x, y, color, parity, cur) {
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ var tagspan = '';
+ if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
+ tagspan = '<span class="logtags">';
+ if (cur[6][1]) {
+ tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ } else if (!cur[6][1] && cur[6][0] != 'default') {
+ tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ }
+ if (cur[7].length) {
+ for (var t in cur[7]) {
+ var tag = cur[7][t];
+ tagspan += '<span class="tagtag">' + tag + '</span> ';
+ }
+ }
+ if (cur[8].length) {
+ for (var t in cur[8]) {
+ var bookmark = cur[8][t];
+ tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
+ }
+ }
+ tagspan += '</span>';
+ }
+
+ item = item.replace(/_TAGS/, tagspan);
+ return [bg, item];
+
+ }
+
+ graph.render(data);
+
+ // stop hiding script -->
+ </script>
+
+ <div class="page_nav">
+ <a href="/graph/3?style=gitweb&revcount=30">less</a>
+ <a href="/graph/3?style=gitweb&revcount=120">more</a>
+ | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/tip?style=gitweb">tip</a>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+ <div class="page_footer">
+ <div class="page_footer_text">test</div>
+ <div class="rss_logo">
+ <a href="/rss-log">RSS</a>
+ <a href="/atom-log">Atom</a>
+ </div>
+ <br />
+
+ </div>
+ </body>
+ </html>
+
+raw graph
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/?style=raw'
+ 200 Script output follows
+
+
+ # HG graph
+ # Node ID ba87b23d29ca67a305625d81a20ac279c1e3f444
+ # Rows shown 4
+
+ changeset: ba87b23d29ca
+ user: test
+ date: 1970-01-01
+ summary: branch
+ branch: unstable
+ tag: tip
+ bookmark: something
+
+ node: (0, 0) (color 1)
+ edge: (0, 0) -> (0, 1) (color 1)
+
+ changeset: 1d22e65f027e
+ user: test
+ date: 1970-01-01
+ summary: branch
+ branch: stable
+
+ node: (0, 1) (color 1)
+ edge: (0, 1) -> (0, 2) (color 1)
+
+ changeset: a4f92ed23982
+ user: test
+ date: 1970-01-01
+ summary: Added tag 1.0 for changeset 2ef0ac749a14
+ branch: default
+
+ node: (0, 2) (color 1)
+ edge: (0, 2) -> (0, 3) (color 1)
+
+ changeset: 2ef0ac749a14
+ user: test
+ date: 1970-01-01
+ summary: base
+ tag: 1.0
+ bookmark: anotherthing
+
+ node: (0, 3) (color 1)
+
+
+
+capabilities
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
+ 200 Script output follows
+
+ lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
+
+heads
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads'
+ 200 Script output follows
+
+ ba87b23d29ca67a305625d81a20ac279c1e3f444
+
+branches
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000'
+ 200 Script output follows
+
+ 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
+
+changegroup
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup&roots=0000000000000000000000000000000000000000'
+ 200 Script output follows
+
+ x\x9c\xbdTMHTQ\x14\x1e\xfc\xef\xd9&\x10\x11*x\x88\x81\x9aN\xf7\xddw\xdf{\xf7Y\x0efR\xb4\x11\xb1U\x82\xc5\xfd\x9d!c\x06\x9c'd\xa0\x99X\x82\x92i\xablUZ-*\x08\x84\x82\x02KkQ\xf8\x13\xe4\xaa\x8dn\x94\x906)\xd5B\x02\xeb\xbe\x9c\x01\x85\xc9\x996\x1d\xf8x\x97{\xefy\xe7;\xe7|\xe7\x06\x02\x81\xb1\xe0\xda\x13\xefN\xd1\xca\x8f\xcb-\xbde\xfc\xeepU\xecJ\xc3\xcd@\x86\x96\xc6\xb7^`\xe9"[H\xe4\x18T\x1a\x16p]\xc3\x96\x14\x13\xcbt\xa1tM\x0c\x1c\x0b2,M\xcd\x13qO\x03:\xd089"c1\xcd\x87FI\\\xa8\xbf|\xbc\xbf\x11\\p{_\xe5\xb6\xddn^j\xdd\xec\x0f=z\xb7\xb6\x94)\xebT\xbe\x89\xa3 (esc)
+ \x1f6!6p\x00\xc4H`L\x18\x83\xdc\xa6\x8c\x0b\x84\x01\x06\x06s\xb84\x1cn2F4u\x19*\xd4*\x14\x04#a\x8f\x84\xe3\xfe^\xc8OS\xa1\xfc8\xe7\x82\xebj[7\x82@\x97\xb1v\x9dEH4,\xe2\xc2\xd3\xa1\x90\x800\x07\xb9\xc4@\xea\xee\xe4\xc1\xd2\xcf\xe7\xb3\xba[\xf2\xf6X\xdd]C\x1d\x05\xf3\x87\x1f,l\xeeBt\x87\xa5\xf2\xdd\x9e\x90*\xa9kC\xac"!\x17\x12)!c\x000\xd7\x05&\xb5\xa9\xc5\xa8-Ln (esc)
+ \x0c|\xf2A\x85\x1a\x85bUy\x9d\xb6\x93(\x8b\xd4\xc4=B/\x8a?\rP'G\x15\x98B\xde\xd6\xa9Zy/\xfb'j+f\xc2\xe3\xb9\xb4\xf5\xea\x98\xf6\xa6sz\xf9{\xc3.\xa4vX*\xdf\x04\x0f\xff[\xb4\x8dGG4\xc1$\xe1:\xb9\xbaq\xf2\xeb\xa9\xfd\xebM\xa3\xc5?\x07\xce\xdc\xda\xc0\xf9\xcd\xef\xbf\xa5\xd3g\xd2\xd2\xa8\xa5uKu\x01(8$\xa6k@\x02(D\x16\x80\x00\x99\x82\x08\xa5\r\x81(t\\f`\xea\x02\xce\xb5\x7f\xba\xac\x02\x8c\\x\x98\x9f\xd5\xb7:0W\xdd6\xbf\xd2\xd3s\xa0k\xbd\xeb\xd8L\xa6 \xa5Q\x86\x91Pc\x80\x98\x8cB,L\x07#\x80\x04\x82\xb6\x8d)\xa3\x08X\x02\x00\xear\x0c-`b\x9b\x18>\xa1\x1b\xf9g\xe9@\xd1\xe9\xca_US{G\xb3\x9f?\x9b\x8d\xd6\x86zR\x91LE\xe8/\xdd& (esc)
+ C
+ \xd5~u\xb0e#\x08\r\x8c\xd5\xf83\x93\x01B\x95\xe8\x1c\x03\xdb\x92s*\x99`\xcc0\x88\xb4d\xb2\xbd\x85\xc9,\x14\xb7\xf1\xd9\xf2\xe5Ku\x8d\xf5rp\xb6\xee\\\xe0\xc5\xa7C\xd9\xd7\xefe\xda\xe94\xc5\xaa\xde>\x8a\x02I\xcb!\x16\xc1\x10"\x1b\x11\xe0\x02\xc8l\xe9H\x84\xb0\xf4\xa78\xc9-\xf1(\xa9\x15\x0f.\x8c\x8fT\x16\x965\xe9'\xbe\xac6\xaeLtN\x0f\x0e/fJ-\x8d\x08s\x12#\xe7[\xfe\xff\x0b\x17\xb9\xc6KK\xfa\xa2o\xa7\x1e\x87\xfaKb\x8b\xaf?\xcc\xed{z>\xd3\xb8\xbb\xcc}\x8eB\x01\x89\xc6\xbc\x88hO\xa6\x15\xf8\rr4\xb3\xe5 (no-eol) (esc)
+
+stream_out
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=stream_out'
+ 200 Script output follows
+
+ 1
+
+failing unbundle, requires POST request
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=unbundle'
+ 405 push requires POST request
+
+ 0
+ push requires POST request
+ [1]
+
+Static files
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'static/style.css'
+ 200 Script output follows
+
+ a { text-decoration:none; }
+ .age { white-space:nowrap; }
+ .date { white-space:nowrap; }
+ .indexlinks { white-space:nowrap; }
+ .parity0 { background-color: #ddd; }
+ .parity1 { background-color: #eee; }
+ .lineno { width: 60px; color: #aaa; font-size: smaller;
+ text-align: right; }
+ .plusline { color: green; }
+ .minusline { color: red; }
+ .atline { color: purple; }
+ .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
+ .buttons a {
+ background-color: #666;
+ padding: 2pt;
+ color: white;
+ font-family: sans;
+ font-weight: bold;
+ }
+ .navigate a {
+ background-color: #ccc;
+ padding: 2pt;
+ font-family: sans;
+ color: black;
+ }
+
+ .metatag {
+ background-color: #888;
+ color: white;
+ text-align: right;
+ }
+
+ /* Common */
+ pre { margin: 0; }
+
+ .logo {
+ float: right;
+ clear: right;
+ }
+
+ /* Changelog/Filelog entries */
+ .logEntry { width: 100%; }
+ .logEntry .age { width: 15%; }
+ .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
+ .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
+ .logEntry th.firstline { text-align: left; width: inherit; }
+
+ /* Shortlog entries */
+ .slogEntry { width: 100%; }
+ .slogEntry .age { width: 8em; }
+ .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
+ .slogEntry td.author { width: 15em; }
+
+ /* Tag entries */
+ #tagEntries { list-style: none; margin: 0; padding: 0; }
+ #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
+
+ /* Changeset entry */
+ #changesetEntry { }
+ #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+ #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
+
+ /* File diff view */
+ #filediffEntry { }
+ #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
+
+ /* Graph */
+ div#wrapper {
+ position: relative;
+ margin: 0;
+ padding: 0;
+ }
+
+ canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.6em;
+ margin: 0;
+ }
+
+ ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+ }
+
+ ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+ }
+
+ ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -0.85em;
+ list-style: none inside none;
+ padding: 0;
+ }
+
+ ul#graphnodes li .info {
+ display: block;
+ font-size: 70%;
+ position: relative;
+ top: -1px;
+ }
+
+Stop and restart with HGENCODING=cp932 and preferuncompressed
+
+ $ "$TESTDIR/killdaemons.py"
+ $ HGENCODING=cp932 hg serve --config server.preferuncompressed=True -n test \
+ > -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+commit message with Japanese Kanji 'Noh', which ends with '\x5c'
+
+ $ echo foo >> foo
+ $ HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'`
+
+Graph json escape of multibyte character
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'graph/' \
+ > | grep '^var data ='
+ var data = [["548001d11f45", [0, 1], [[0, 0, 1, -1, ""]], "\u80fd", "test", "1970-01-01", ["unstable", true], ["tip"], ["something"]], ["ba87b23d29ca", [0, 1], [[0, 0, 1, 3, "FF0000"]], "branch", "test", "1970-01-01", ["unstable", false], [], []], ["1d22e65f027e", [0, 1], [[0, 0, 1, 3, ""]], "branch", "test", "1970-01-01", ["stable", true], [], []], ["a4f92ed23982", [0, 1], [[0, 0, 1, 3, ""]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
+
+capabilities
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
+ 200 Script output follows
+
+ lookup changegroupsubset branchmap pushkey known getbundle unbundlehash batch stream-preferred stream unbundle=HG10GZ,HG10BZ,HG10UN httpheader=1024
+
+heads
+
+ERRORS ENCOUNTERED
+
+ $ cat errors.log
+ $ "$TESTDIR/killdaemons.py"
+
+ $ cd ..
+
+Test graph paging
+
+ $ mkcommit() {
+ > echo $1 >> a
+ > hg ci -Am $1 a
+ > }
+
+ $ hg init graph
+ $ cd graph
+ $ mkcommit 0
+ $ mkcommit 1
+ $ mkcommit 2
+ $ mkcommit 3
+ $ mkcommit 4
+ $ mkcommit 5
+ $ hg serve --config server.uncompressed=False \
+ > --config web.maxshortchanges=2 \
+ > -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg log -G --template '{rev}:{node|short} {desc}\n'
+ @ 5:aed2d9c1d0e7 5
+ |
+ o 4:b60a39a85a01 4
+ |
+ o 3:ada793dcc118 3
+ |
+ o 2:ab4f1438558b 2
+ |
+ o 1:e06180cbfb0c 1
+ |
+ o 0:b4e73ffab476 0
+
+
+Test paging
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT \
+ > 'graph/?style=raw' | grep changeset
+ changeset: aed2d9c1d0e7
+ changeset: b60a39a85a01
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT \
+ > 'graph/?style=raw&revcount=3' | grep changeset
+ changeset: aed2d9c1d0e7
+ changeset: b60a39a85a01
+ changeset: ada793dcc118
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT \
+ > 'graph/e06180cbfb0?style=raw&revcount=3' | grep changeset
+ changeset: ab4f1438558b
+ changeset: e06180cbfb0c
+ changeset: b4e73ffab476
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT \
+ > 'graph/b4e73ffab47?style=raw&revcount=3' | grep changeset
+ changeset: ab4f1438558b
+ changeset: e06180cbfb0c
+ changeset: b4e73ffab476
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-hgweb-descend-empties.t b/tests/test-hgweb-descend-empties.t
new file mode 100644
index 0000000..b97c018
--- /dev/null
+++ b/tests/test-hgweb-descend-empties.t
@@ -0,0 +1,144 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Test chains of near empty directories, terminating 3 different ways:
+- a1: file at level 4 (deepest)
+- b1: two dirs at level 3
+- e1: file at level 2
+
+Set up the repo
+
+ $ hg init test
+ $ cd test
+ $ mkdir -p a1/a2/a3/a4
+ $ mkdir -p b1/b2/b3/b4
+ $ mkdir -p b1/b2/c3/c4
+ $ mkdir -p d1/d2/d3/d4
+ $ echo foo > a1/a2/a3/a4/foo
+ $ echo foo > b1/b2/b3/b4/foo
+ $ echo foo > b1/b2/c3/c4/foo
+ $ echo foo > d1/d2/d3/d4/foo
+ $ echo foo > d1/d2/foo
+ $ hg ci -Ama
+ adding a1/a2/a3/a4/foo
+ adding b1/b2/b3/b4/foo
+ adding b1/b2/c3/c4/foo
+ adding d1/d2/d3/d4/foo
+ adding d1/d2/foo
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+manifest with descending
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 9087c84a0f5d /</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/9087c84a0f5d">log</a></li>
+ <li><a href="/graph/9087c84a0f5d">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/9087c84a0f5d">changeset</a></li>
+ <li class="active">browse</li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>directory / @ 0:9087c84a0f5d <span class="tag">tip</span> </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <table class="bigtable">
+ <tr>
+ <th class="name">name</th>
+ <th class="size">size</th>
+ <th class="permissions">permissions</th>
+ </tr>
+ <tr class="fileline parity0">
+ <td class="name"><a href="/file/9087c84a0f5d/">[up]</a></td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+
+ <tr class="fileline parity1">
+ <td class="name">
+ <a href="/file/9087c84a0f5d/a1">
+ <img src="/static/coal-folder.png" alt="dir."/> a1/
+ </a>
+ <a href="/file/9087c84a0f5d/a1/a2/a3/a4">
+ a2/a3/a4
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+ <tr class="fileline parity0">
+ <td class="name">
+ <a href="/file/9087c84a0f5d/b1">
+ <img src="/static/coal-folder.png" alt="dir."/> b1/
+ </a>
+ <a href="/file/9087c84a0f5d/b1/b2">
+ b2
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+ <tr class="fileline parity1">
+ <td class="name">
+ <a href="/file/9087c84a0f5d/d1">
+ <img src="/static/coal-folder.png" alt="dir."/> d1/
+ </a>
+ <a href="/file/9087c84a0f5d/d1/d2">
+ d2
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-hgweb-diffs.t b/tests/test-hgweb-diffs.t
new file mode 100644
index 0000000..f96f42b
--- /dev/null
+++ b/tests/test-hgweb-diffs.t
@@ -0,0 +1,986 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+setting up repo
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Ama
+ adding a
+ adding b
+
+change permissions for git diffs
+
+ $ hg import -q --bypass - <<EOF
+ > # HG changeset patch
+ > # User test
+ > # Date 0 0
+ > b
+ >
+ > diff --git a/a b/a
+ > old mode 100644
+ > new mode 100755
+ > diff --git a/b b/b
+ > deleted file mode 100644
+ > --- a/b
+ > +++ /dev/null
+ > @@ -1,1 +0,0 @@
+ > -b
+ > EOF
+
+set up hgweb
+
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/0'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 0cd96de13884</title>
+ </head>
+ <body>
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/0cd96de13884">log</a></li>
+ <li><a href="/graph/0cd96de13884">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li class="active">changeset</li>
+ <li><a href="/raw-rev/0cd96de13884">raw</a></li>
+ <li><a href="/file/0cd96de13884">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>changeset 0:0cd96de13884 </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">a</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"> <a href="/rev/559edbd9ed20">559edbd9ed20</a></td>
+ </tr>
+ <tr>
+ <th class="files">files</th>
+ <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
+ </tr>
+ <tr>
+ <th class="diffstat">diffstat</th>
+ <td class="diffstat">
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+
+ <a id="diffstatexpand" href="javascript:showDiffstat()"/>[<tt>+</tt>]</a>
+ <div id="diffstatdetails" style="display:none;">
+ <a href="javascript:hideDiffstat()"/>[<tt>-</tt>]</a>
+ <p>
+ <table> <tr class="parity0">
+ <td class="diffstat-file"><a href="#l1.1">a</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="diffstat-file"><a href="#l2.1">b</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/a Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+a
+ </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/b Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+b
+ </span></pre></div>
+ </div>
+
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+raw revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'raw-rev/0'
+ 200 Script output follows
+
+
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
+
+ a
+
+ diff -r 000000000000 -r 0cd96de13884 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+ diff -r 000000000000 -r 0cd96de13884 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+diff removed file
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/tip/b'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: b diff</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/559edbd9ed20">log</a></li>
+ <li><a href="/graph/559edbd9ed20">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/559edbd9ed20">changeset</a></li>
+ <li><a href="/file/559edbd9ed20">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/559edbd9ed20/b">file</a></li>
+ <li><a href="/file/tip/b">latest</a></li>
+ <li class="active">diff</li>
+ <li><a href="/comparison/559edbd9ed20/b">comparison</a></li>
+ <li><a href="/annotate/559edbd9ed20/b">annotate</a></li>
+ <li><a href="/log/559edbd9ed20/b">file log</a></li>
+ <li><a href="/raw-file/559edbd9ed20/b">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>diff b @ 1:559edbd9ed20</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">b</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td><a href="/file/0cd96de13884/b">0cd96de13884</a> </td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/b Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-b
+ </span></pre></div>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+set up hgweb with git diffs
+
+ $ "$TESTDIR/killdaemons.py"
+ $ hg serve --config 'diff.git=1' -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/0'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 0cd96de13884</title>
+ </head>
+ <body>
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/0cd96de13884">log</a></li>
+ <li><a href="/graph/0cd96de13884">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li class="active">changeset</li>
+ <li><a href="/raw-rev/0cd96de13884">raw</a></li>
+ <li><a href="/file/0cd96de13884">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>changeset 0:0cd96de13884 </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">a</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"> <a href="/rev/559edbd9ed20">559edbd9ed20</a></td>
+ </tr>
+ <tr>
+ <th class="files">files</th>
+ <td class="files"><a href="/file/0cd96de13884/a">a</a> <a href="/file/0cd96de13884/b">b</a> </td>
+ </tr>
+ <tr>
+ <th class="diffstat">diffstat</th>
+ <td class="diffstat">
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+
+ <a id="diffstatexpand" href="javascript:showDiffstat()"/>[<tt>+</tt>]</a>
+ <div id="diffstatdetails" style="display:none;">
+ <a href="javascript:hideDiffstat()"/>[<tt>-</tt>]</a>
+ <p>
+ <table> <tr class="parity0">
+ <td class="diffstat-file"><a href="#l1.1">a</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ <tr class="parity1">
+ <td class="diffstat-file"><a href="#l2.1">b</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:100.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:0.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> new file mode 100644
+ <a href="#l1.2" id="l1.2"> 1.2</a> <span class="minusline">--- /dev/null
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="plusline">+++ b/a
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l1.5" id="l1.5"> 1.5</a> <span class="plusline">+a
+ </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> new file mode 100644
+ <a href="#l2.2" id="l2.2"> 2.2</a> <span class="minusline">--- /dev/null
+ </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="plusline">+++ b/b
+ </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="atline">@@ -0,0 +1,1 @@
+ </span><a href="#l2.5" id="l2.5"> 2.5</a> <span class="plusline">+b
+ </span></pre></div>
+ </div>
+
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'raw-rev/0'
+ 200 Script output follows
+
+
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 0cd96de13884b090099512d4794ae87ad067ea8e
+
+ a
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+ diff --git a/b b/b
+ new file mode 100644
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +b
+
+
+diff removed file
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/tip/a'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a diff</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/559edbd9ed20">log</a></li>
+ <li><a href="/graph/559edbd9ed20">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/559edbd9ed20">changeset</a></li>
+ <li><a href="/file/559edbd9ed20">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/559edbd9ed20/a">file</a></li>
+ <li><a href="/file/tip/a">latest</a></li>
+ <li class="active">diff</li>
+ <li><a href="/comparison/559edbd9ed20/a">comparison</a></li>
+ <li><a href="/annotate/559edbd9ed20/a">annotate</a></li>
+ <li><a href="/log/559edbd9ed20/a">file log</a></li>
+ <li><a href="/raw-file/559edbd9ed20/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>diff a @ 1:559edbd9ed20</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">b</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td></td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> old mode 100644
+ <a href="#l1.2" id="l1.2"> 1.2</a> new mode 100755
+ </pre></div>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+comparison new file
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'comparison/0/a'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a comparison</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/0cd96de13884">log</a></li>
+ <li><a href="/graph/0cd96de13884">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/0cd96de13884">changeset</a></li>
+ <li><a href="/file/0cd96de13884">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/0cd96de13884/a">file</a></li>
+ <li><a href="/file/tip/a">latest</a></li>
+ <li><a href="/diff/0cd96de13884/a">diff</a></li>
+ <li class="active">comparison</li>
+ <li><a href="/annotate/0cd96de13884/a">annotate</a></li>
+ <li><a href="/log/0cd96de13884/a">file log</a></li>
+ <li><a href="/raw-file/0cd96de13884/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>comparison a @ 0:0cd96de13884</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">a</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td></td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> comparison</div>
+ <div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+ </div>
+
+ <table class="bigtable">
+ <thead class="header">
+ <tr>
+ <th>-1:000000000000</th>
+ <th>0:b789fdd96dc2</th>
+ </tr>
+ </thead>
+
+ <tbody class="block">
+
+ <tr>
+ <td class="source insert"><a href="#r1" id="r1"> </a> </td>
+ <td class="source insert"><a href="#r1" id="r1"> 1</a> a</td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+comparison existing file
+
+ $ hg up
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg ci -mc
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'comparison/tip/a'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a comparison</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/d73db4d812ff">log</a></li>
+ <li><a href="/graph/d73db4d812ff">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/d73db4d812ff">changeset</a></li>
+ <li><a href="/file/d73db4d812ff">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/d73db4d812ff/a">file</a></li>
+ <li><a href="/file/tip/a">latest</a></li>
+ <li><a href="/diff/d73db4d812ff/a">diff</a></li>
+ <li class="active">comparison</li>
+ <li><a href="/annotate/d73db4d812ff/a">annotate</a></li>
+ <li><a href="/log/d73db4d812ff/a">file log</a></li>
+ <li><a href="/raw-file/d73db4d812ff/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>comparison a @ 2:d73db4d812ff</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">c</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td><a href="/file/0cd96de13884/a">0cd96de13884</a> </td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> comparison</div>
+ <div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+ </div>
+
+ <table class="bigtable">
+ <thead class="header">
+ <tr>
+ <th>0:b789fdd96dc2</th>
+ <th>1:a80d06849b33</th>
+ </tr>
+ </thead>
+
+ <tbody class="block">
+
+ <tr>
+ <td class="source equal"><a href="#l1r1" id="l1r1"> 1</a> a</td>
+ <td class="source equal"><a href="#l1r1" id="l1r1"> 1</a> a</td>
+ </tr>
+ <tr>
+ <td class="source insert"><a href="#r2" id="r2"> </a> </td>
+ <td class="source insert"><a href="#r2" id="r2"> 2</a> a</td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+comparison removed file
+
+ $ hg rm a
+ $ hg ci -md
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'comparison/tip/a'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a comparison</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/20e80271eb7a">log</a></li>
+ <li><a href="/graph/20e80271eb7a">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/20e80271eb7a">changeset</a></li>
+ <li><a href="/file/20e80271eb7a">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/20e80271eb7a/a">file</a></li>
+ <li><a href="/file/tip/a">latest</a></li>
+ <li><a href="/diff/20e80271eb7a/a">diff</a></li>
+ <li class="active">comparison</li>
+ <li><a href="/annotate/20e80271eb7a/a">annotate</a></li>
+ <li><a href="/log/20e80271eb7a/a">file log</a></li>
+ <li><a href="/raw-file/20e80271eb7a/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>comparison a @ 3:20e80271eb7a</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">d</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td><a href="/file/0cd96de13884/a">0cd96de13884</a> </td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> comparison</div>
+ <div class="legend">
+ <span class="legendinfo equal">equal</span>
+ <span class="legendinfo delete">deleted</span>
+ <span class="legendinfo insert">inserted</span>
+ <span class="legendinfo replace">replaced</span>
+ </div>
+
+ <table class="bigtable">
+ <thead class="header">
+ <tr>
+ <th>1:a80d06849b33</th>
+ <th>-1:000000000000</th>
+ </tr>
+ </thead>
+
+ <tbody class="block">
+
+ <tr>
+ <td class="source delete"><a href="#l1" id="l1"> 1</a> a</td>
+ <td class="source delete"><a href="#l1" id="l1"> </a> </td>
+ </tr>
+ <tr>
+ <td class="source delete"><a href="#l2" id="l2"> 2</a> a</td>
+ <td class="source delete"><a href="#l2" id="l2"> </a> </td>
+ </tr>
+ </tbody>
+ </table>
+
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+ $ cd ..
+
+test import rev as raw-rev
+
+ $ hg clone -r0 test test1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test1
+ $ hg import -q --bypass --exact http://localhost:$HGPORT/rev/1
+
+raw revision with diff block numbers
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat <<EOF > .hg/hgrc
+ > [web]
+ > templates = rawdiff
+ > EOF
+ $ mkdir rawdiff
+ $ cat <<EOF > rawdiff/map
+ > mimetype = 'text/plain; charset={encoding}'
+ > changeset = '{diff}'
+ > difflineplus = '{line}'
+ > difflineminus = '{line}'
+ > difflineat = '{line}'
+ > diffline = '{line}'
+ > filenodelink = ''
+ > filenolink = ''
+ > fileline = '{line}'
+ > diffblock = 'Block: {blockno}\n{lines}\n'
+ > EOF
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'raw-rev/0'
+ 200 Script output follows
+
+ Block: 1
+ diff -r 000000000000 -r 0cd96de13884 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ Block: 2
+ diff -r 000000000000 -r 0cd96de13884 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ $ "$TESTDIR/killdaemons.py"
+ $ rm .hg/hgrc rawdiff/map
+ $ rmdir rawdiff
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+errors
+
+ $ cat ../test/errors.log
+
+ $ cd ..
diff --git a/tests/test-hgweb-empty.t b/tests/test-hgweb-empty.t
new file mode 100644
index 0000000..33d6cfd
--- /dev/null
+++ b/tests/test-hgweb-empty.t
@@ -0,0 +1,399 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Some tests for hgweb in an empty repository
+
+ $ hg init test
+ $ cd test
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'shortlog')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: log</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li class="active">log</li>
+ <li><a href="/graph/000000000000">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/000000000000">changeset</a></li>
+ <li><a href="/file/000000000000">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/shortlog/-1?revcount=30">less</a>
+ <a href="/shortlog/-1?revcount=120">more</a>
+ | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/shortlog/-1?revcount=30">less</a>
+ <a href="/shortlog/-1?revcount=120">more</a>
+ | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: log</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li class="active">log</li>
+ <li><a href="/graph/000000000000">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/000000000000">changeset</a></li>
+ <li><a href="/file/000000000000">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/shortlog/-1?revcount=5">less</a>
+ <a href="/shortlog/-1?revcount=20">more</a>
+ | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/shortlog/-1?revcount=5">less</a>
+ <a href="/shortlog/-1?revcount=20">more</a>
+ | rev -1: <a href="/shortlog/000000000000">(0)</a> <a href="/shortlog/tip">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'graph')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: revision graph</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log" title="Atom feed for test: log" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log" title="RSS feed for test: log" />
+ <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/000000000000">log</a></li>
+ <li class="active">graph</li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/000000000000">changeset</a></li>
+ <li><a href="/file/000000000000">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>graph</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/graph/-1?revcount=30">less</a>
+ <a href="/graph/-1?revcount=120">more</a>
+ | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
+ </div>
+
+ <noscript><p>The revision graph only works with JavaScript-enabled browsers.</p></noscript>
+
+ <div id="wrapper">
+ <ul id="nodebgs"></ul>
+ <canvas id="graph" width="480" height="12"></canvas>
+ <ul id="graphnodes"></ul>
+ </div>
+
+ <script type="text/javascript">
+ <!-- hide script content
+
+ var data = [];
+ var graph = new Graph();
+ graph.scale(39);
+
+ var revlink = '<li style="_STYLE"><span class="desc">';
+ revlink += '<a href="/rev/_NODEID" title="_NODEID">_DESC</a>';
+ revlink += '</span>_TAGS<span class="info">_DATE, by _USER</span></li>';
+
+ graph.vertex = function(x, y, color, parity, cur) {
+
+ this.ctx.beginPath();
+ color = this.setColor(color, 0.25, 0.75);
+ this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
+ this.ctx.fill();
+
+ var bg = '<li class="bg parity' + parity + '"></li>';
+ var left = (this.columns + 1) * this.bg_height;
+ var nstyle = 'padding-left: ' + left + 'px;';
+ var item = revlink.replace(/_STYLE/, nstyle);
+ item = item.replace(/_PARITY/, 'parity' + parity);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_NODEID/, cur[0]);
+ item = item.replace(/_DESC/, cur[3]);
+ item = item.replace(/_USER/, cur[4]);
+ item = item.replace(/_DATE/, cur[5]);
+
+ var tagspan = '';
+ if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
+ tagspan = '<span class="logtags">';
+ if (cur[6][1]) {
+ tagspan += '<span class="branchhead" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ } else if (!cur[6][1] && cur[6][0] != 'default') {
+ tagspan += '<span class="branchname" title="' + cur[6][0] + '">';
+ tagspan += cur[6][0] + '</span> ';
+ }
+ if (cur[7].length) {
+ for (var t in cur[7]) {
+ var tag = cur[7][t];
+ tagspan += '<span class="tag">' + tag + '</span> ';
+ }
+ }
+ if (cur[8].length) {
+ for (var b in cur[8]) {
+ var bookmark = cur[8][b];
+ tagspan += '<span class="tag">' + bookmark + '</span> ';
+ }
+ }
+ tagspan += '</span>';
+ }
+
+ item = item.replace(/_TAGS/, tagspan);
+ return [bg, item];
+
+ }
+
+ graph.render(data);
+
+ // stop hiding script -->
+ </script>
+
+ <div class="navigate">
+ <a href="/graph/-1?revcount=30">less</a>
+ <a href="/graph/-1?revcount=120">more</a>
+ | rev -1: <a href="/graph/000000000000">(0)</a> <a href="/graph/tip">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 000000000000 /</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/000000000000">log</a></li>
+ <li><a href="/graph/000000000000">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/000000000000">changeset</a></li>
+ <li class="active">browse</li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>directory / @ -1:000000000000 <span class="tag">tip</span> </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <table class="bigtable">
+ <tr>
+ <th class="name">name</th>
+ <th class="size">size</th>
+ <th class="permissions">permissions</th>
+ </tr>
+ <tr class="fileline parity0">
+ <td class="name"><a href="/file/000000000000/">[up]</a></td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+
+
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+ $ cd ..
diff --git a/tests/test-hgweb-filelog.t b/tests/test-hgweb-filelog.t
new file mode 100644
index 0000000..95d7f9e
--- /dev/null
+++ b/tests/test-hgweb-filelog.t
@@ -0,0 +1,765 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ echo b > b
+ $ hg ci -Am "b"
+ adding b
+ $ echo a > a
+ $ hg ci -Am "first a"
+ adding a
+ $ hg rm a
+ $ hg ci -m "del a"
+ $ echo b > a
+ $ hg ci -Am "second a"
+ adding a
+ $ hg rm a
+ $ hg ci -m "del2 a"
+ $ hg mv b c
+ $ hg ci -m "mv b"
+ $ echo c >> c
+ $ hg ci -m "change c"
+ $ hg log -p
+ changeset: 6:b7682196df1c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change c
+
+ diff -r 1a6696706df2 -r b7682196df1c c
+ --- a/c Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,2 @@
+ b
+ +c
+
+ changeset: 5:1a6696706df2
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: mv b
+
+ diff -r 52e848cdcd88 -r 1a6696706df2 b
+ --- a/b Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +0,0 @@
+ -b
+ diff -r 52e848cdcd88 -r 1a6696706df2 c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ changeset: 4:52e848cdcd88
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: del2 a
+
+ diff -r 01de2d66a28d -r 52e848cdcd88 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +0,0 @@
+ -b
+
+ changeset: 3:01de2d66a28d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: second a
+
+ diff -r be3ebcc91739 -r 01de2d66a28d a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ changeset: 2:be3ebcc91739
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: del a
+
+ diff -r 5ed941583260 -r be3ebcc91739 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +0,0 @@
+ -a
+
+ changeset: 1:5ed941583260
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: first a
+
+ diff -r 6563da9dcf87 -r 5ed941583260 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ changeset: 0:6563da9dcf87
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ diff -r 000000000000 -r 6563da9dcf87 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+tip - two revisions
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/tip/a')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a history</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log/tip/a" title="Atom feed for test:a" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log/tip/a" title="RSS feed for test:a" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/01de2d66a28d">log</a></li>
+ <li><a href="/graph/01de2d66a28d">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/01de2d66a28d">changeset</a></li>
+ <li><a href="/file/01de2d66a28d">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/01de2d66a28d/a">file</a></li>
+ <li><a href="/diff/01de2d66a28d/a">diff</a></li>
+ <li><a href="/comparison/01de2d66a28d/a">comparison</a></li>
+ <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
+ <li class="active">file log</li>
+ <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log a</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/log/01de2d66a28d/a?revcount=30">less</a>
+ <a href="/log/01de2d66a28d/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
+ </tr>
+ <tr class="parity1">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/5ed941583260">first a</a></td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/log/01de2d66a28d/a?revcount=30">less</a>
+ <a href="/log/01de2d66a28d/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+second version - two revisions
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/3/a')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a history</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log/tip/a" title="Atom feed for test:a" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log/tip/a" title="RSS feed for test:a" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/01de2d66a28d">log</a></li>
+ <li><a href="/graph/01de2d66a28d">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/01de2d66a28d">changeset</a></li>
+ <li><a href="/file/01de2d66a28d">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/01de2d66a28d/a">file</a></li>
+ <li><a href="/diff/01de2d66a28d/a">diff</a></li>
+ <li><a href="/comparison/01de2d66a28d/a">comparison</a></li>
+ <li><a href="/annotate/01de2d66a28d/a">annotate</a></li>
+ <li class="active">file log</li>
+ <li><a href="/raw-file/01de2d66a28d/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log a</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/log/01de2d66a28d/a?revcount=30">less</a>
+ <a href="/log/01de2d66a28d/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/01de2d66a28d">second a</a></td>
+ </tr>
+ <tr class="parity1">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/5ed941583260">first a</a></td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/log/01de2d66a28d/a?revcount=30">less</a>
+ <a href="/log/01de2d66a28d/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+first deleted - one revision
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/2/a')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a history</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log/tip/a" title="Atom feed for test:a" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log/tip/a" title="RSS feed for test:a" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/5ed941583260">log</a></li>
+ <li><a href="/graph/5ed941583260">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/5ed941583260">changeset</a></li>
+ <li><a href="/file/5ed941583260">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/5ed941583260/a">file</a></li>
+ <li><a href="/diff/5ed941583260/a">diff</a></li>
+ <li><a href="/comparison/5ed941583260/a">comparison</a></li>
+ <li><a href="/annotate/5ed941583260/a">annotate</a></li>
+ <li class="active">file log</li>
+ <li><a href="/raw-file/5ed941583260/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log a</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/log/5ed941583260/a?revcount=30">less</a>
+ <a href="/log/5ed941583260/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/5ed941583260">first a</a></td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/log/5ed941583260/a?revcount=30">less</a>
+ <a href="/log/5ed941583260/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+first version - one revision
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/1/a')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a history</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log/tip/a" title="Atom feed for test:a" />
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log/tip/a" title="RSS feed for test:a" />
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/5ed941583260">log</a></li>
+ <li><a href="/graph/5ed941583260">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/5ed941583260">changeset</a></li>
+ <li><a href="/file/5ed941583260">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/5ed941583260/a">file</a></li>
+ <li><a href="/diff/5ed941583260/a">diff</a></li>
+ <li><a href="/comparison/5ed941583260/a">comparison</a></li>
+ <li><a href="/annotate/5ed941583260/a">annotate</a></li>
+ <li class="active">file log</li>
+ <li><a href="/raw-file/5ed941583260/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>log a</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="navigate">
+ <a href="/log/5ed941583260/a?revcount=30">less</a>
+ <a href="/log/5ed941583260/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a> </div>
+
+ <table class="bigtable">
+ <tr>
+ <th class="age">age</th>
+ <th class="author">author</th>
+ <th class="description">description</th>
+ </tr>
+ <tr class="parity0">
+ <td class="age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ <td class="author">test</td>
+ <td class="description"><a href="/rev/5ed941583260">first a</a></td>
+ </tr>
+
+ </table>
+
+ <div class="navigate">
+ <a href="/log/5ed941583260/a?revcount=30">less</a>
+ <a href="/log/5ed941583260/a?revcount=120">more</a>
+ | <a href="/log/5ed941583260/a">(0)</a> <a href="/log/tip/a">tip</a>
+ </div>
+
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+before addition - error
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/0/a')
+ 404 Not Found
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: error</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog">log</a></li>
+ <li><a href="/graph">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>error</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30"></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">
+ <p>
+ An error occurred while processing your request:
+ </p>
+ <p>
+ a@6563da9dcf87: not found in manifest
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ [1]
+
+should show base link, use spartan because it shows it
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'log/tip/c?style=spartan')
+ 200 Script output follows
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+ <html>
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png">
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: c history</title>
+ <link rel="alternate" type="application/atom+xml"
+ href="/atom-log/tip/c" title="Atom feed for test:c">
+ <link rel="alternate" type="application/rss+xml"
+ href="/rss-log/tip/c" title="RSS feed for test:c">
+ </head>
+ <body>
+
+ <div class="buttons">
+ <a href="/log?style=spartan">changelog</a>
+ <a href="/shortlog?style=spartan">shortlog</a>
+ <a href="/graph?style=spartan">graph</a>
+ <a href="/tags?style=spartan">tags</a>
+ <a href="/branches?style=spartan">branches</a>
+ <a href="/file/b7682196df1c/c?style=spartan">file</a>
+ <a href="/annotate/b7682196df1c/c?style=spartan">annotate</a>
+ <a href="/help?style=spartan">help</a>
+ <a type="application/rss+xml" href="/rss-log/tip/c">rss</a>
+ <a type="application/atom+xml" href="/atom-log/tip/c" title="Atom feed for test:c">atom</a>
+ </div>
+
+ <h2>c revision history</h2>
+
+ <p>navigate: <small class="navigate"><a href="/log/1a6696706df2/c?style=spartan">(0)</a> <a href="/log/tip/c?style=spartan">tip</a> </small></p>
+
+ <table class="logEntry parity0">
+ <tr>
+ <th><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
+ <th class="firstline"><a href="/rev/b7682196df1c?style=spartan">change c</a></th>
+ </tr>
+ <tr>
+ <th class="revision">revision 1:</td>
+ <td class="node">
+ <a href="/file/b7682196df1c/c?style=spartan">b7682196df1c</a>
+ <a href="/diff/b7682196df1c/c?style=spartan">(diff)</a>
+ <a href="/annotate/b7682196df1c/c?style=spartan">(annotate)</a>
+ </td>
+ </tr>
+
+ <tr>
+ <th class="author">author:</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date:</th>
+ <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ </table>
+
+
+ <table class="logEntry parity1">
+ <tr>
+ <th><span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span>:</th>
+ <th class="firstline"><a href="/rev/1a6696706df2?style=spartan">mv b</a></th>
+ </tr>
+ <tr>
+ <th class="revision">revision 0:</td>
+ <td class="node">
+ <a href="/file/1a6696706df2/c?style=spartan">1a6696706df2</a>
+ <a href="/diff/1a6696706df2/c?style=spartan">(diff)</a>
+ <a href="/annotate/1a6696706df2/c?style=spartan">(annotate)</a>
+ </td>
+ </tr>
+
+ <tr>
+ <th>base:</th>
+ <td>
+ <a href="/file/1e88685f5dde/b?style=spartan">
+ b@1e88685f5dde
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <th class="author">author:</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date:</th>
+ <td class="date">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ </table>
+
+
+
+
+ <script type="text/javascript">process_dates()</script>
+
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
+ </div>
+
+ </body>
+ </html>
+
+
+rss log
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rss-log/tip/a')
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <rss version="2.0">
+ <channel>
+ <link>http://*:$HGPORT/</link> (glob)
+ <language>en-us</language>
+
+ <title>test: a history</title>
+ <description>a revision history</description>
+ <item>
+ <title>second a</title>
+ <link>http://*:$HGPORT/log01de2d66a28d/a</link> (glob)
+ <description><![CDATA[second a]]></description>
+ <author>&#116;&#101;&#115;&#116;</author>
+ <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
+ </item>
+ <item>
+ <title>first a</title>
+ <link>http://*:$HGPORT/log5ed941583260/a</link> (glob)
+ <description><![CDATA[first a]]></description>
+ <author>&#116;&#101;&#115;&#116;</author>
+ <pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate>
+ </item>
+
+ </channel>
+ </rss>
+
+atom log
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'atom-log/tip/a')
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <id>http://*:$HGPORT/atom-log/tip/a</id> (glob)
+ <link rel="self" href="http://*:$HGPORT/atom-log/tip/a"/> (glob)
+ <title>test: a history</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>second a</title>
+ <id>http://*:$HGPORT/#changeset-01de2d66a28df5549090991dccda788726948517</id> (glob)
+ <link href="http://*:$HGPORT/rev/01de2d66a28d"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">second a</pre>
+ </div>
+ </content>
+ </entry>
+ <entry>
+ <title>first a</title>
+ <id>http://*:$HGPORT/#changeset-5ed941583260248620985524192fdc382ef57c36</id> (glob)
+ <link href="http://*:$HGPORT/rev/5ed941583260"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">first a</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+
+errors
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-hgweb-no-path-info.t b/tests/test-hgweb-no-path-info.t
new file mode 100644
index 0000000..dfcc571
--- /dev/null
+++ b/tests/test-hgweb-no-path-info.t
@@ -0,0 +1,109 @@
+This tests if hgweb and hgwebdir still work if the REQUEST_URI variable is
+no longer passed with the request. Instead, SCRIPT_NAME and PATH_INFO
+should be used from d74fc8dec2b4 onward to route the request.
+
+ $ hg init repo
+ $ cd repo
+ $ echo foo > bar
+ $ hg add bar
+ $ hg commit -m "test"
+ $ hg tip
+ changeset: 0:61c9426e69fe
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+ $ cat > request.py <<EOF
+ > from mercurial.hgweb import hgweb, hgwebdir
+ > from StringIO import StringIO
+ > import os, sys
+ >
+ > errors = StringIO()
+ > input = StringIO()
+ >
+ > def startrsp(status, headers):
+ > print '---- STATUS'
+ > print status
+ > print '---- HEADERS'
+ > print [i for i in headers if i[0] != 'ETag']
+ > print '---- DATA'
+ > return output.write
+ >
+ > env = {
+ > 'wsgi.version': (1, 0),
+ > 'wsgi.url_scheme': 'http',
+ > 'wsgi.errors': errors,
+ > 'wsgi.input': input,
+ > 'wsgi.multithread': False,
+ > 'wsgi.multiprocess': False,
+ > 'wsgi.run_once': False,
+ > 'REQUEST_METHOD': 'GET',
+ > 'SCRIPT_NAME': '',
+ > 'SERVER_NAME': '127.0.0.1',
+ > 'SERVER_PORT': os.environ['HGPORT'],
+ > 'SERVER_PROTOCOL': 'HTTP/1.0'
+ > }
+ >
+ > def process(app):
+ > content = app(env, startrsp)
+ > sys.stdout.write(output.getvalue())
+ > sys.stdout.write(''.join(content))
+ > print '---- ERRORS'
+ > print errors.getvalue()
+ >
+ > output = StringIO()
+ > env['QUERY_STRING'] = 'style=atom'
+ > process(hgweb('.', name='repo'))
+ >
+ > output = StringIO()
+ > env['QUERY_STRING'] = 'style=raw'
+ > process(hgwebdir({'repo': '.'}))
+ > EOF
+ $ python request.py
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'application/atom+xml; charset=ascii')]
+ ---- DATA
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://127.0.0.1:$HGPORT/</id>
+ <link rel="self" href="http://127.0.0.1:$HGPORT/atom-log"/>
+ <link rel="alternate" href="http://127.0.0.1:$HGPORT/"/>
+ <title>repo Changelog</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>test</title>
+ <id>http://127.0.0.1:$HGPORT/#changeset-61c9426e69fef294feed5e2bbfc97d39944a5b1c</id>
+ <link href="http://127.0.0.1:$HGPORT/rev/61c9426e69fe"/>
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">test</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ ---- ERRORS
+
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'text/plain; charset=ascii')]
+ ---- DATA
+
+ repo/
+
+ ---- ERRORS
+
+
+ $ cd ..
diff --git a/tests/test-hgweb-no-request-uri.t b/tests/test-hgweb-no-request-uri.t
new file mode 100644
index 0000000..e6fb1f8
--- /dev/null
+++ b/tests/test-hgweb-no-request-uri.t
@@ -0,0 +1,143 @@
+This tests if hgweb and hgwebdir still work if the REQUEST_URI variable is
+no longer passed with the request. Instead, SCRIPT_NAME and PATH_INFO
+should be used from d74fc8dec2b4 onward to route the request.
+
+ $ hg init repo
+ $ cd repo
+ $ echo foo > bar
+ $ hg add bar
+ $ hg commit -m "test"
+ $ hg tip
+ changeset: 0:61c9426e69fe
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+ $ cat > request.py <<EOF
+ > from mercurial.hgweb import hgweb, hgwebdir
+ > from StringIO import StringIO
+ > import os, sys
+ >
+ > errors = StringIO()
+ > input = StringIO()
+ >
+ > def startrsp(status, headers):
+ > print '---- STATUS'
+ > print status
+ > print '---- HEADERS'
+ > print [i for i in headers if i[0] != 'ETag']
+ > print '---- DATA'
+ > return output.write
+ >
+ > env = {
+ > 'wsgi.version': (1, 0),
+ > 'wsgi.url_scheme': 'http',
+ > 'wsgi.errors': errors,
+ > 'wsgi.input': input,
+ > 'wsgi.multithread': False,
+ > 'wsgi.multiprocess': False,
+ > 'wsgi.run_once': False,
+ > 'REQUEST_METHOD': 'GET',
+ > 'SCRIPT_NAME': '',
+ > 'SERVER_NAME': '127.0.0.1',
+ > 'SERVER_PORT': os.environ['HGPORT'],
+ > 'SERVER_PROTOCOL': 'HTTP/1.0'
+ > }
+ >
+ > def process(app):
+ > content = app(env, startrsp)
+ > sys.stdout.write(output.getvalue())
+ > sys.stdout.write(''.join(content))
+ > print '---- ERRORS'
+ > print errors.getvalue()
+ >
+ > output = StringIO()
+ > env['PATH_INFO'] = '/'
+ > env['QUERY_STRING'] = 'style=atom'
+ > process(hgweb('.', name = 'repo'))
+ >
+ > output = StringIO()
+ > env['PATH_INFO'] = '/file/tip/'
+ > env['QUERY_STRING'] = 'style=raw'
+ > process(hgweb('.', name = 'repo'))
+ >
+ > output = StringIO()
+ > env['PATH_INFO'] = '/'
+ > env['QUERY_STRING'] = 'style=raw'
+ > process(hgwebdir({'repo': '.'}))
+ >
+ > output = StringIO()
+ > env['PATH_INFO'] = '/repo/file/tip/'
+ > env['QUERY_STRING'] = 'style=raw'
+ > process(hgwebdir({'repo': '.'}))
+ > EOF
+ $ python request.py
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'application/atom+xml; charset=ascii')]
+ ---- DATA
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://127.0.0.1:$HGPORT/</id>
+ <link rel="self" href="http://127.0.0.1:$HGPORT/atom-log"/>
+ <link rel="alternate" href="http://127.0.0.1:$HGPORT/"/>
+ <title>repo Changelog</title>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+
+ <entry>
+ <title>test</title>
+ <id>http://127.0.0.1:$HGPORT/#changeset-61c9426e69fef294feed5e2bbfc97d39944a5b1c</id>
+ <link href="http://127.0.0.1:$HGPORT/rev/61c9426e69fe"/>
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:00+00:00</updated>
+ <published>1970-01-01T00:00:00+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">test</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ ---- ERRORS
+
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'text/plain; charset=ascii')]
+ ---- DATA
+
+ -rw-r--r-- 4 bar
+
+
+ ---- ERRORS
+
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'text/plain; charset=ascii')]
+ ---- DATA
+
+ /repo/
+
+ ---- ERRORS
+
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'text/plain; charset=ascii')]
+ ---- DATA
+
+ -rw-r--r-- 4 bar
+
+
+ ---- ERRORS
+
+
+ $ cd ..
diff --git a/tests/test-hgweb-non-interactive.t b/tests/test-hgweb-non-interactive.t
new file mode 100644
index 0000000..da04036
--- /dev/null
+++ b/tests/test-hgweb-non-interactive.t
@@ -0,0 +1,82 @@
+Tests if hgweb can run without touching sys.stdin, as is required
+by the WSGI standard and strictly implemented by mod_wsgi.
+
+ $ hg init repo
+ $ cd repo
+ $ echo foo > bar
+ $ hg add bar
+ $ hg commit -m "test"
+ $ cat > request.py <<EOF
+ > from mercurial import dispatch
+ > from mercurial.hgweb.hgweb_mod import hgweb
+ > from mercurial.ui import ui
+ > from mercurial import hg
+ > from StringIO import StringIO
+ > import os, sys
+ >
+ > class FileLike(object):
+ > def __init__(self, real):
+ > self.real = real
+ > def fileno(self):
+ > print >> sys.__stdout__, 'FILENO'
+ > return self.real.fileno()
+ > def read(self):
+ > print >> sys.__stdout__, 'READ'
+ > return self.real.read()
+ > def readline(self):
+ > print >> sys.__stdout__, 'READLINE'
+ > return self.real.readline()
+ >
+ > sys.stdin = FileLike(sys.stdin)
+ > errors = StringIO()
+ > input = StringIO()
+ > output = StringIO()
+ >
+ > def startrsp(status, headers):
+ > print '---- STATUS'
+ > print status
+ > print '---- HEADERS'
+ > print [i for i in headers if i[0] != 'ETag']
+ > print '---- DATA'
+ > return output.write
+ >
+ > env = {
+ > 'wsgi.version': (1, 0),
+ > 'wsgi.url_scheme': 'http',
+ > 'wsgi.errors': errors,
+ > 'wsgi.input': input,
+ > 'wsgi.multithread': False,
+ > 'wsgi.multiprocess': False,
+ > 'wsgi.run_once': False,
+ > 'REQUEST_METHOD': 'GET',
+ > 'SCRIPT_NAME': '',
+ > 'PATH_INFO': '',
+ > 'QUERY_STRING': '',
+ > 'SERVER_NAME': '127.0.0.1',
+ > 'SERVER_PORT': os.environ['HGPORT'],
+ > 'SERVER_PROTOCOL': 'HTTP/1.0'
+ > }
+ >
+ > i = hgweb('.')
+ > i(env, startrsp)
+ > print '---- ERRORS'
+ > print errors.getvalue()
+ > print '---- OS.ENVIRON wsgi variables'
+ > print sorted([x for x in os.environ if x.startswith('wsgi')])
+ > print '---- request.ENVIRON wsgi variables'
+ > print sorted([x for x in i.repo.ui.environ if x.startswith('wsgi')])
+ > EOF
+ $ python request.py
+ ---- STATUS
+ 200 Script output follows
+ ---- HEADERS
+ [('Content-Type', 'text/html; charset=ascii')]
+ ---- DATA
+ ---- ERRORS
+
+ ---- OS.ENVIRON wsgi variables
+ []
+ ---- request.ENVIRON wsgi variables
+ ['wsgi.errors', 'wsgi.input', 'wsgi.multiprocess', 'wsgi.multithread', 'wsgi.run_once', 'wsgi.url_scheme', 'wsgi.version']
+
+ $ cd ..
diff --git a/tests/test-hgweb-raw.t b/tests/test-hgweb-raw.t
new file mode 100644
index 0000000..b982ba3
--- /dev/null
+++ b/tests/test-hgweb-raw.t
@@ -0,0 +1,58 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Test raw style of hgweb
+
+ $ hg init test
+ $ cd test
+ $ mkdir sub
+ $ cat >'sub/some text%.txt' <<ENDSOME
+ > This is just some random text
+ > that will go inside the file and take a few lines.
+ > It is very boring to read, but computers don't
+ > care about things like that.
+ > ENDSOME
+ $ hg add 'sub/some text%.txt'
+ $ hg commit -d "1 0" -m "Just some text"
+
+ $ hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid
+
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
+
+ $ while kill `cat hg.pid` 2>/dev/null; do sleep 0; done
+
+ $ cat getoutput.txt
+ 200 Script output follows
+ content-type: application/binary
+ content-length: 157
+ content-disposition: inline; filename="some text%.txt"
+
+ This is just some random text
+ that will go inside the file and take a few lines.
+ It is very boring to read, but computers don't
+ care about things like that.
+ $ cat access.log error.log
+ 127.0.0.1 - - [*] "GET /?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw HTTP/1.1" 200 - (glob)
+
+ $ rm access.log error.log
+ $ hg serve -p $HGPORT -A access.log -E error.log -d --pid-file=hg.pid \
+ > --config web.guessmime=True
+
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw' content-type content-length content-disposition) >getoutput.txt
+ $ while kill `cat hg.pid` 2>/dev/null; do sleep 0; done
+
+ $ cat getoutput.txt
+ 200 Script output follows
+ content-type: text/plain; charset="ascii"
+ content-length: 157
+ content-disposition: inline; filename="some text%.txt"
+
+ This is just some random text
+ that will go inside the file and take a few lines.
+ It is very boring to read, but computers don't
+ care about things like that.
+ $ cat access.log error.log
+ 127.0.0.1 - - [*] "GET /?f=bf0ff59095c9;file=sub/some%20text%25.txt;style=raw HTTP/1.1" 200 - (glob)
+
+ $ cd ..
diff --git a/tests/test-hgweb-removed.t b/tests/test-hgweb-removed.t
new file mode 100644
index 0000000..d96997c
--- /dev/null
+++ b/tests/test-hgweb-removed.t
@@ -0,0 +1,236 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+setting up repo
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ hg rm a
+ $ hg ci -mdel
+
+set up hgweb
+
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/tip'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: c78f6c5cbea9</title>
+ </head>
+ <body>
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
+ <li><a href="/graph/c78f6c5cbea9">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li class="active">changeset</li>
+ <li><a href="/raw-rev/c78f6c5cbea9">raw</a></li>
+ <li><a href="/file/c78f6c5cbea9">browse</a></li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>changeset 1:c78f6c5cbea9 <span class="tag">tip</span> </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">del</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"><a href="/rev/cb9a9f314b8b">cb9a9f314b8b</a> </td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="files">files</th>
+ <td class="files">a </td>
+ </tr>
+ <tr>
+ <th class="diffstat">diffstat</th>
+ <td class="diffstat">
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+ <a id="diffstatexpand" href="javascript:showDiffstat()"/>[<tt>+</tt>]</a>
+ <div id="diffstatdetails" style="display:none;">
+ <a href="javascript:hideDiffstat()"/>[<tt>-</tt>]</a>
+ <p>
+ <table> <tr class="parity0">
+ <td class="diffstat-file"><a href="#l1.1">a</a></td>
+ <td class="diffstat-total" align="right">1</td>
+ <td class="diffstat-graph">
+ <span class="diffstat-add" style="width:0.0%;">&nbsp;</span>
+ <span class="diffstat-remove" style="width:100.0%;">&nbsp;</span>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
+ </span></pre></div>
+ </div>
+
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+diff removed file
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/tip/a'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: a diff</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/c78f6c5cbea9">log</a></li>
+ <li><a href="/graph/c78f6c5cbea9">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/c78f6c5cbea9">changeset</a></li>
+ <li><a href="/file/c78f6c5cbea9">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/c78f6c5cbea9/a">file</a></li>
+ <li><a href="/file/tip/a">latest</a></li>
+ <li class="active">diff</li>
+ <li><a href="/comparison/c78f6c5cbea9/a">comparison</a></li>
+ <li><a href="/annotate/c78f6c5cbea9/a">annotate</a></li>
+ <li><a href="/log/c78f6c5cbea9/a">file log</a></li>
+ <li><a href="/raw-file/c78f6c5cbea9/a">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>diff a @ 1:c78f6c5cbea9</h3>
+
+ <form class="search" action="/log">
+ <p></p>
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">del</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th>author</th>
+ <td>&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th>date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th>parents</th>
+ <td><a href="/file/cb9a9f314b8b/a">cb9a9f314b8b</a> </td>
+ </tr>
+ <tr>
+ <th>children</th>
+ <td></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line diff</div>
+
+ <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- a/a Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -1,1 +0,0 @@
+ </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="minusline">-a
+ </span></pre></div>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+ $ cd ..
diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
new file mode 100644
index 0000000..e8846a3
--- /dev/null
+++ b/tests/test-hgweb.t
@@ -0,0 +1,492 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Some tests for hgweb. Tests static files, plain files and different 404's.
+
+ $ hg init test
+ $ cd test
+ $ mkdir da
+ $ echo foo > da/foo
+ $ echo foo > foo
+ $ hg ci -Ambase
+ adding da/foo
+ adding foo
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+manifest
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/?style=raw')
+ 200 Script output follows
+
+
+ drwxr-xr-x da
+ -rw-r--r-- 4 foo
+
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/da?style=raw')
+ 200 Script output follows
+
+
+ -rw-r--r-- 4 foo
+
+
+
+plain file
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/foo?style=raw'
+ 200 Script output follows
+
+ foo
+
+should give a 404 - static file that does not exist
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'static/bogus'
+ 404 Not Found
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: error</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog">log</a></li>
+ <li><a href="/graph">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>error</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30"></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">
+ <p>
+ An error occurred while processing your request:
+ </p>
+ <p>
+ Not Found
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ [1]
+
+should give a 404 - bad revision
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/spam/foo?style=raw'
+ 404 Not Found
+
+
+ error: revision not found: spam
+ [1]
+
+should give a 400 - bad command
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/foo?cmd=spam&style=raw'
+ 400* (glob)
+
+
+ error: no such method: spam
+ [1]
+
+should give a 404 - file does not exist
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/bork?style=raw'
+ 404 Not Found
+
+
+ error: bork@2ef0ac749a14: not found in manifest
+ [1]
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/bork'
+ 404 Not Found
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: error</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog">log</a></li>
+ <li><a href="/graph">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+
+ <h2><a href="/">test</a></h2>
+ <h3>error</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30"></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">
+ <p>
+ An error occurred while processing your request:
+ </p>
+ <p>
+ bork@2ef0ac749a14: not found in manifest
+ </p>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ [1]
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/tip/bork?style=raw'
+ 404 Not Found
+
+
+ error: bork@2ef0ac749a14: not found in manifest
+ [1]
+
+try bad style
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/?style=foobar')
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>test: 2ef0ac749a14 /</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/2ef0ac749a14">log</a></li>
+ <li><a href="/graph/2ef0ac749a14">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/2ef0ac749a14">changeset</a></li>
+ <li class="active">browse</li>
+ </ul>
+ <ul>
+
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>directory / @ 0:2ef0ac749a14 <span class="tag">tip</span> </h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <table class="bigtable">
+ <tr>
+ <th class="name">name</th>
+ <th class="size">size</th>
+ <th class="permissions">permissions</th>
+ </tr>
+ <tr class="fileline parity0">
+ <td class="name"><a href="/file/2ef0ac749a14/">[up]</a></td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+
+ <tr class="fileline parity1">
+ <td class="name">
+ <a href="/file/2ef0ac749a14/da">
+ <img src="/static/coal-folder.png" alt="dir."/> da/
+ </a>
+ <a href="/file/2ef0ac749a14/da/">
+
+ </a>
+ </td>
+ <td class="size"></td>
+ <td class="permissions">drwxr-xr-x</td>
+ </tr>
+
+ <tr class="fileline parity0">
+ <td class="filename">
+ <a href="/file/2ef0ac749a14/foo">
+ <img src="/static/coal-file.png" alt="file"/> foo
+ </a>
+ </td>
+ <td class="size">4</td>
+ <td class="permissions">-rw-r--r--</td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+stop and restart
+
+ $ "$TESTDIR/killdaemons.py"
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+Test the access/error files are opened in append mode
+
+ $ python -c "print len(file('access.log').readlines()), 'log lines written'"
+ 10 log lines written
+
+static file
+
+ $ "$TESTDIR/get-with-headers.py" --twice localhost:$HGPORT 'static/style-gitweb.css'
+ 200 Script output follows
+
+ body { font-family: sans-serif; font-size: 12px; margin:0px; border:solid #d9d8d1; border-width:1px; margin:10px; }
+ a { color:#0000cc; }
+ a:hover, a:visited, a:active { color:#880000; }
+ div.page_header { height:25px; padding:8px; font-size:18px; font-weight:bold; background-color:#d9d8d1; }
+ div.page_header a:visited { color:#0000cc; }
+ div.page_header a:hover { color:#880000; }
+ div.page_nav { padding:8px; }
+ div.page_nav a:visited { color:#0000cc; }
+ div.page_path { padding:8px; border:solid #d9d8d1; border-width:0px 0px 1px}
+ div.page_footer { padding:4px 8px; background-color: #d9d8d1; }
+ div.page_footer_text { float:left; color:#555555; font-style:italic; }
+ div.page_body { padding:8px; }
+ div.title, a.title {
+ display:block; padding:6px 8px;
+ font-weight:bold; background-color:#edece6; text-decoration:none; color:#000000;
+ }
+ a.title:hover { background-color: #d9d8d1; }
+ div.title_text { padding:6px 0px; border: solid #d9d8d1; border-width:0px 0px 1px; }
+ div.log_body { padding:8px 8px 8px 150px; }
+ .age { white-space:nowrap; }
+ span.age { position:relative; float:left; width:142px; font-style:italic; }
+ div.log_link {
+ padding:0px 8px;
+ font-size:10px; font-family:sans-serif; font-style:normal;
+ position:relative; float:left; width:136px;
+ }
+ div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
+ a.list { text-decoration:none; color:#000000; }
+ a.list:hover { text-decoration:underline; color:#880000; }
+ table { padding:8px 4px; }
+ th { padding:2px 5px; font-size:12px; text-align:left; }
+ tr.light:hover, .parity0:hover { background-color:#edece6; }
+ tr.dark, .parity1 { background-color:#f6f6f0; }
+ tr.dark:hover, .parity1:hover { background-color:#edece6; }
+ td { padding:2px 5px; font-size:12px; vertical-align:top; }
+ td.closed { background-color: #99f; }
+ td.link { padding:2px 5px; font-family:sans-serif; font-size:10px; }
+ td.indexlinks { white-space: nowrap; }
+ td.indexlinks a {
+ padding: 2px 5px; line-height: 10px;
+ border: 1px solid;
+ color: #ffffff; background-color: #7777bb;
+ border-color: #aaaadd #333366 #333366 #aaaadd;
+ font-weight: bold; text-align: center; text-decoration: none;
+ font-size: 10px;
+ }
+ td.indexlinks a:hover { background-color: #6666aa; }
+ div.pre { font-family:monospace; font-size:12px; white-space:pre; }
+ div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
+ div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
+ div.search { margin:4px 8px; position:absolute; top:56px; right:12px }
+ .linenr { color:#999999; text-decoration:none }
+ div.rss_logo { float: right; white-space: nowrap; }
+ div.rss_logo a {
+ padding:3px 6px; line-height:10px;
+ border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
+ color:#ffffff; background-color:#ff6600;
+ font-weight:bold; font-family:sans-serif; font-size:10px;
+ text-align:center; text-decoration:none;
+ }
+ div.rss_logo a:hover { background-color:#ee5500; }
+ pre { margin: 0; }
+ span.logtags span {
+ padding: 0px 4px;
+ font-size: 10px;
+ font-weight: normal;
+ border: 1px solid;
+ background-color: #ffaaff;
+ border-color: #ffccff #ff00ee #ff00ee #ffccff;
+ }
+ span.logtags span.tagtag {
+ background-color: #ffffaa;
+ border-color: #ffffcc #ffee00 #ffee00 #ffffcc;
+ }
+ span.logtags span.branchtag {
+ background-color: #aaffaa;
+ border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+ }
+ span.logtags span.inbranchtag {
+ background-color: #d5dde6;
+ border-color: #e3ecf4 #9398f4 #9398f4 #e3ecf4;
+ }
+ span.logtags span.bookmarktag {
+ background-color: #afdffa;
+ border-color: #ccecff #46ace6 #46ace6 #ccecff;
+ }
+
+ /* Graph */
+ div#wrapper {
+ position: relative;
+ margin: 0;
+ padding: 0;
+ margin-top: 3px;
+ }
+
+ canvas {
+ position: absolute;
+ z-index: 5;
+ top: -0.9em;
+ margin: 0;
+ }
+
+ ul#nodebgs {
+ list-style: none inside none;
+ padding: 0;
+ margin: 0;
+ top: -0.7em;
+ }
+
+ ul#graphnodes li, ul#nodebgs li {
+ height: 39px;
+ }
+
+ ul#graphnodes {
+ position: absolute;
+ z-index: 10;
+ top: -0.8em;
+ list-style: none inside none;
+ padding: 0;
+ }
+
+ ul#graphnodes li .info {
+ display: block;
+ font-size: 100%;
+ position: relative;
+ top: -3px;
+ font-style: italic;
+ }
+
+ /* Comparison */
+ .legend {
+ padding: 1.5% 0 1.5% 0;
+ }
+
+ .legendinfo {
+ border: 1px solid #d9d8d1;
+ font-size: 80%;
+ text-align: center;
+ padding: 0.5%;
+ }
+
+ .equal {
+ background-color: #ffffff;
+ }
+
+ .delete {
+ background-color: #faa;
+ color: #333;
+ }
+
+ .insert {
+ background-color: #ffa;
+ }
+
+ .replace {
+ background-color: #e8e8e8;
+ }
+
+ .comparison {
+ overflow-x: auto;
+ }
+
+ .header th {
+ text-align: center;
+ }
+
+ .block {
+ border-top: 1px solid #d9d8d1;
+ }
+ 304 Not Modified
+
+
+errors
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-hgwebdir-paths.py b/tests/test-hgwebdir-paths.py
new file mode 100644
index 0000000..b9118b3
--- /dev/null
+++ b/tests/test-hgwebdir-paths.py
@@ -0,0 +1,40 @@
+import os
+from mercurial import hg, ui
+from mercurial.hgweb.hgwebdir_mod import hgwebdir
+
+os.mkdir('webdir')
+os.chdir('webdir')
+
+webdir = os.path.realpath('.')
+
+u = ui.ui()
+hg.repository(u, 'a', create=1)
+hg.repository(u, 'b', create=1)
+os.chdir('b')
+hg.repository(u, 'd', create=1)
+os.chdir('..')
+hg.repository(u, 'c', create=1)
+os.chdir('..')
+
+paths = {'t/a/': '%s/a' % webdir,
+ 'b': '%s/b' % webdir,
+ 'coll': '%s/*' % webdir,
+ 'rcoll': '%s/**' % webdir}
+
+config = os.path.join(webdir, 'hgwebdir.conf')
+configfile = open(config, 'w')
+configfile.write('[paths]\n')
+for k, v in paths.items():
+ configfile.write('%s = %s\n' % (k, v))
+configfile.close()
+
+confwd = hgwebdir(config)
+dictwd = hgwebdir(paths)
+
+assert len(confwd.repos) == len(dictwd.repos), 'different numbers'
+assert len(confwd.repos) == 9, 'expected 9 repos, found %d' % len(confwd.repos)
+
+found = dict(confwd.repos)
+for key, path in dictwd.repos:
+ assert key in found, 'repository %s was not found' % key
+ assert found[key] == path, 'different paths for repo %s' % key
diff --git a/tests/test-hgwebdir.t b/tests/test-hgwebdir.t
new file mode 100644
index 0000000..4e3a58b
--- /dev/null
+++ b/tests/test-hgwebdir.t
@@ -0,0 +1,1015 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+hide outer repo and work in dir without '.hg'
+ $ hg init
+ $ mkdir dir
+ $ cd dir
+
+Tests some basic hgwebdir functionality. Tests setting up paths and
+collection, different forms of 404s and the subdirectory support.
+
+ $ mkdir webdir
+ $ cd webdir
+ $ hg init a
+ $ echo a > a/a
+ $ hg --cwd a ci -Ama -d'1 0'
+ adding a
+
+create a mercurial queue repository
+
+ $ hg --cwd a qinit --config extensions.hgext.mq= -c
+ $ hg init b
+ $ echo b > b/b
+ $ hg --cwd b ci -Amb -d'2 0'
+ adding b
+
+create a nested repository
+
+ $ cd b
+ $ hg init d
+ $ echo d > d/d
+ $ hg --cwd d ci -Amd -d'3 0'
+ adding d
+ $ cd ..
+ $ hg init c
+ $ echo c > c/c
+ $ hg --cwd c ci -Amc -d'3 0'
+ adding c
+
+create a subdirectory containing repositories and subrepositories
+
+ $ mkdir notrepo
+ $ cd notrepo
+ $ hg init e
+ $ echo e > e/e
+ $ hg --cwd e ci -Ame -d'4 0'
+ adding e
+ $ hg init e/e2
+ $ echo e2 > e/e2/e2
+ $ hg --cwd e/e2 ci -Ame2 -d '4 0'
+ adding e2
+ $ hg init f
+ $ echo f > f/f
+ $ hg --cwd f ci -Amf -d'4 0'
+ adding f
+ $ hg init f/f2
+ $ echo f2 > f/f2/f2
+ $ hg --cwd f/f2 ci -Amf2 -d '4 0'
+ adding f2
+ $ cd ..
+
+create repository without .hg/store
+
+ $ hg init nostore
+ $ rm -R nostore/.hg/store
+ $ root=`pwd`
+ $ cd ..
+
+serve
+ $ cat > paths.conf <<EOF
+ > [paths]
+ > a=$root/a
+ > b=$root/b
+ > EOF
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-1.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+should give a 404 - file does not exist
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/bork?style=raw'
+ 404 Not Found
+
+
+ error: bork@8580ff50825a: not found in manifest
+ [1]
+
+should succeed
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /b/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'b/file/tip/b?style=raw'
+ 200 Script output follows
+
+ b
+
+should give a 404 - repo is not published
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'c/file/tip/c?style=raw'
+ 404 Not Found
+
+
+ error: repository c/file/tip/c not found
+ [1]
+
+atom-log without basedir
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/atom-log' | grep '<link'
+ <link rel="self" href="http://*:$HGPORT/a/atom-log"/> (glob)
+ <link rel="alternate" href="http://*:$HGPORT/a/"/> (glob)
+ <link href="http://*:$HGPORT/a/rev/8580ff50825a"/> (glob)
+
+rss-log without basedir
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/rss-log' | grep '<guid'
+ <guid isPermaLink="true">http://*:$HGPORT/a/rev/8580ff50825a</guid> (glob)
+ $ cat > paths.conf <<EOF
+ > [paths]
+ > t/a/=$root/a
+ > b=$root/b
+ > coll=$root/*
+ > rcoll=$root/**
+ > star=*
+ > starstar=**
+ > astar=webdir/a/*
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-2.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+should succeed, slashy names
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+ /b/
+ /coll/a/
+ /coll/a/.hg/patches/
+ /coll/b/
+ /coll/c/
+ /coll/notrepo/e/
+ /coll/notrepo/f/
+ /rcoll/a/
+ /rcoll/a/.hg/patches/
+ /rcoll/b/
+ /rcoll/b/d/
+ /rcoll/c/
+ /rcoll/notrepo/e/
+ /rcoll/notrepo/e/e2/
+ /rcoll/notrepo/f/
+ /rcoll/notrepo/f/f2/
+ /star/webdir/a/
+ /star/webdir/a/.hg/patches/
+ /star/webdir/b/
+ /star/webdir/c/
+ /star/webdir/notrepo/e/
+ /star/webdir/notrepo/f/
+ /starstar/webdir/a/
+ /starstar/webdir/a/.hg/patches/
+ /starstar/webdir/b/
+ /starstar/webdir/b/d/
+ /starstar/webdir/c/
+ /starstar/webdir/notrepo/e/
+ /starstar/webdir/notrepo/e/e2/
+ /starstar/webdir/notrepo/f/
+ /starstar/webdir/notrepo/f/f2/
+ /astar/
+ /astar/.hg/patches/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=paper'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>Mercurial repositories index</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <div class="main">
+ <h2>Mercurial Repositories</h2>
+
+ <table class="bigtable">
+ <tr>
+ <th><a href="?sort=name">Name</a></th>
+ <th><a href="?sort=description">Description</a></th>
+ <th><a href="?sort=contact">Contact</a></th>
+ <th><a href="?sort=lastchange">Last modified</a></th>
+ <th>&nbsp;</th>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/t/a/?style=paper">t/a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/b/?style=paper">b</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/coll/a/?style=paper">coll/a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/coll/b/?style=paper">coll/b</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/coll/c/?style=paper">coll/c</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/coll/notrepo/e/?style=paper">coll/notrepo/e</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/coll/notrepo/f/?style=paper">coll/notrepo/f</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/rcoll/notrepo/e/?style=paper">rcoll/notrepo/e</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/rcoll/notrepo/e/e2/?style=paper">rcoll/notrepo/e/e2</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/rcoll/notrepo/f/?style=paper">rcoll/notrepo/f</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/rcoll/notrepo/f/f2/?style=paper">rcoll/notrepo/f/f2</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/star/webdir/notrepo/e/?style=paper">star/webdir/notrepo/e</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/star/webdir/notrepo/f/?style=paper">star/webdir/notrepo/f</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/starstar/webdir/notrepo/e/?style=paper">starstar/webdir/notrepo/e</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/starstar/webdir/notrepo/e/e2/?style=paper">starstar/webdir/notrepo/e/e2</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/starstar/webdir/notrepo/f/?style=paper">starstar/webdir/notrepo/f</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/starstar/webdir/notrepo/f/f2/?style=paper">starstar/webdir/notrepo/f/f2</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/astar/?style=paper">astar</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ <tr class="parity1">
+ <td><a href="/astar/.hg/patches/?style=paper">astar/.hg/patches</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=paper'
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>Mercurial repositories index</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <div class="main">
+ <h2>Mercurial Repositories</h2>
+
+ <table class="bigtable">
+ <tr>
+ <th><a href="?sort=name">Name</a></th>
+ <th><a href="?sort=description">Description</a></th>
+ <th><a href="?sort=contact">Contact</a></th>
+ <th><a href="?sort=lastchange">Last modified</a></th>
+ <th>&nbsp;</th>
+ </tr>
+
+ <tr class="parity0">
+ <td><a href="/t/a/?style=paper">a</a></td>
+ <td>unknown</td>
+ <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
+ <td class="age">*</td> (glob)
+ <td class="indexlinks"></td>
+ </tr>
+
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a?style=atom'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://*:$HGPORT1/t/a/</id> (glob)
+ <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
+ <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
+ <title>t/a Changelog</title>
+ <updated>1970-01-01T00:00:01+00:00</updated>
+
+ <entry>
+ <title>a</title>
+ <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
+ <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:01+00:00</updated>
+ <published>1970-01-01T00:00:01+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">a</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/?style=atom'
+ 200 Script output follows
+
+ <?xml version="1.0" encoding="ascii"?>
+ <feed xmlns="http://www.w3.org/2005/Atom">
+ <!-- Changelog -->
+ <id>http://*:$HGPORT1/t/a/</id> (glob)
+ <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
+ <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
+ <title>t/a Changelog</title>
+ <updated>1970-01-01T00:00:01+00:00</updated>
+
+ <entry>
+ <title>a</title>
+ <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
+ <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
+ <author>
+ <name>test</name>
+ <email>&#116;&#101;&#115;&#116;</email>
+ </author>
+ <updated>1970-01-01T00:00:01+00:00</updated>
+ <published>1970-01-01T00:00:01+00:00</published>
+ <content type="xhtml">
+ <div xmlns="http://www.w3.org/1999/xhtml">
+ <pre xml:space="preserve">a</pre>
+ </div>
+ </content>
+ </entry>
+
+ </feed>
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+
+Test [paths] '*' extension
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
+ 200 Script output follows
+
+
+ /coll/a/
+ /coll/a/.hg/patches/
+ /coll/b/
+ /coll/c/
+ /coll/notrepo/e/
+ /coll/notrepo/f/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+
+Test [paths] '**' extension
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
+ 200 Script output follows
+
+
+ /rcoll/a/
+ /rcoll/a/.hg/patches/
+ /rcoll/b/
+ /rcoll/b/d/
+ /rcoll/c/
+ /rcoll/notrepo/e/
+ /rcoll/notrepo/e/e2/
+ /rcoll/notrepo/f/
+ /rcoll/notrepo/f/f2/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
+ 200 Script output follows
+
+ d
+
+Test collapse = True
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat >> paths.conf <<EOF
+ > [web]
+ > collapse=true
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-3.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
+ 200 Script output follows
+
+
+ /coll/a/
+ /coll/a/.hg/patches/
+ /coll/b/
+ /coll/c/
+ /coll/notrepo/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
+ 200 Script output follows
+
+
+ /rcoll/a/
+ /rcoll/a/.hg/patches/
+ /rcoll/b/
+ /rcoll/b/d/
+ /rcoll/c/
+ /rcoll/notrepo/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
+ 200 Script output follows
+
+ d
+
+Test intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
+ 200 Script output follows
+
+
+ /rcoll/notrepo/e/
+ /rcoll/notrepo/e/e2/
+ /rcoll/notrepo/f/
+ /rcoll/notrepo/f/f2/
+
+
+Test repositories inside intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
+ 200 Script output follows
+
+ e
+
+Test subrepositories inside intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
+ 200 Script output follows
+
+ f2
+
+Test descend = False
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat >> paths.conf <<EOF
+ > descend=false
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-4.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
+ 200 Script output follows
+
+
+ /coll/a/
+ /coll/b/
+ /coll/c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
+ 200 Script output follows
+
+
+ /rcoll/a/
+ /rcoll/b/
+ /rcoll/c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
+ 200 Script output follows
+
+ d
+
+Test intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
+ 200 Script output follows
+
+
+ /rcoll/notrepo/e/
+ /rcoll/notrepo/f/
+
+
+Test repositories inside intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
+ 200 Script output follows
+
+ e
+
+Test subrepositories inside intermediate directories
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
+ 200 Script output follows
+
+ f2
+
+Test [paths] '*' in a repo root
+
+ $ hg id http://localhost:$HGPORT1/astar
+ 8580ff50825a
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat > paths.conf <<EOF
+ > [paths]
+ > t/a = $root/a
+ > t/b = $root/b
+ > c = $root/c
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-5.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+ /t/b/
+ /c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+ /t/b/
+
+
+Test collapse = True
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat >> paths.conf <<EOF
+ > [web]
+ > collapse=true
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-6.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /t/
+ /c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+ /t/b/
+
+
+test descend = False
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat >> paths.conf <<EOF
+ > descend=false
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-7.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
+ 200 Script output follows
+
+
+ /t/a/
+ /t/b/
+
+ $ "$TESTDIR/killdaemons.py"
+ $ cat > paths.conf <<EOF
+ > [paths]
+ > nostore = $root/nostore
+ > inexistent = $root/inexistent
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
+ > -A access-paths.log -E error-paths-8.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+test inexistent and inaccessible repo should be ignored silently
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 ''
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <title>Mercurial repositories index</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+ </div>
+ <div class="main">
+ <h2>Mercurial Repositories</h2>
+
+ <table class="bigtable">
+ <tr>
+ <th><a href="?sort=name">Name</a></th>
+ <th><a href="?sort=description">Description</a></th>
+ <th><a href="?sort=contact">Contact</a></th>
+ <th><a href="?sort=lastchange">Last modified</a></th>
+ <th>&nbsp;</th>
+ </tr>
+
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+ $ cat > collections.conf <<EOF
+ > [collections]
+ > $root=$root
+ > EOF
+ $ hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
+ > --pid-file=hg.pid --webdir-conf collections.conf \
+ > -A access-collections.log -E error-collections.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+collections: should succeed
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /a/.hg/patches/
+ /b/
+ /c/
+ /notrepo/e/
+ /notrepo/f/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'b/file/tip/b?style=raw'
+ 200 Script output follows
+
+ b
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'c/file/tip/c?style=raw'
+ 200 Script output follows
+
+ c
+
+atom-log with basedir /
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
+ <link rel="self" href="http://hg.example.com:8080/a/atom-log"/>
+ <link rel="alternate" href="http://hg.example.com:8080/a/"/>
+ <link href="http://hg.example.com:8080/a/rev/8580ff50825a"/>
+
+rss-log with basedir /
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
+ <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
+ $ "$TESTDIR/killdaemons.py"
+ $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
+ > --pid-file=hg.pid --webdir-conf collections.conf \
+ > -A access-collections-2.log -E error-collections-2.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+atom-log with basedir /foo/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
+ <link rel="self" href="http://hg.example.com:8080/foo/a/atom-log"/>
+ <link rel="alternate" href="http://hg.example.com:8080/foo/a/"/>
+ <link href="http://hg.example.com:8080/foo/a/rev/8580ff50825a"/>
+
+rss-log with basedir /foo/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
+ <guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
+
+paths errors 1
+
+ $ cat error-paths-1.log
+
+paths errors 2
+
+ $ cat error-paths-2.log
+
+paths errors 3
+
+ $ cat error-paths-3.log
+
+paths errors 4
+
+ $ cat error-paths-4.log
+
+paths errors 5
+
+ $ cat error-paths-5.log
+
+paths errors 6
+
+ $ cat error-paths-6.log
+
+paths errors 7
+
+ $ cat error-paths-7.log
+
+paths errors 8
+
+ $ cat error-paths-8.log
+
+collections errors
+
+ $ cat error-collections.log
+
+collections errors 2
+
+ $ cat error-collections-2.log
diff --git a/tests/test-hgwebdirsym.t b/tests/test-hgwebdirsym.t
new file mode 100644
index 0000000..ee479e2
--- /dev/null
+++ b/tests/test-hgwebdirsym.t
@@ -0,0 +1,80 @@
+Tests whether or not hgwebdir properly handles various symlink topologies.
+
+ $ "$TESTDIR/hghave" serve symlink || exit 80
+
+hide outer repo
+ $ hg init
+
+ $ hg init a
+ $ echo a > a/a
+ $ hg --cwd a ci -Ama -d'1 0'
+ adding a
+ $ mkdir webdir
+ $ cd webdir
+ $ hg init b
+ $ echo b > b/b
+ $ hg --cwd b ci -Amb -d'2 0'
+ adding b
+ $ hg init c
+ $ echo c > c/c
+ $ hg --cwd c ci -Amc -d'3 0'
+ adding c
+ $ ln -s ../a al
+ $ ln -s ../webdir circle
+ $ root=`pwd`
+ $ cd ..
+ $ cat > collections.conf <<EOF
+ > [collections]
+ > $root=$root
+ > EOF
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf collections.conf \
+ > -A access-collections.log -E error-collections.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+should succeed
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '?style=raw'
+ 200 Script output follows
+
+
+ /al/
+ /b/
+ /c/
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'al/file/tip/a?style=raw'
+ 200 Script output follows
+
+ a
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'b/file/tip/b?style=raw'
+ 200 Script output follows
+
+ b
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'c/file/tip/c?style=raw'
+ 200 Script output follows
+
+ c
+
+should fail
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'circle/al/file/tip/a?style=raw'
+ 404 Not Found
+
+
+ error: repository circle/al/file/tip/a not found
+ [1]
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'circle/b/file/tip/a?style=raw'
+ 404 Not Found
+
+
+ error: repository circle/b/file/tip/a not found
+ [1]
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'circle/c/file/tip/a?style=raw'
+ 404 Not Found
+
+
+ error: repository circle/c/file/tip/a not found
+ [1]
+
+collections errors
+
+ $ cat error-collections.log
diff --git a/tests/test-highlight.t b/tests/test-highlight.t
new file mode 100644
index 0000000..53ea7e1
--- /dev/null
+++ b/tests/test-highlight.t
@@ -0,0 +1,609 @@
+
+ $ "$TESTDIR/hghave" pygments serve || exit 80
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > highlight =
+ > [web]
+ > pygments_style = friendly
+ > EOF
+ $ hg init test
+ $ cd test
+
+create random Python file to exercise Pygments
+
+ $ cat <<EOF > primes.py
+ > #!/usr/bin/env python
+ >
+ > """Fun with generators. Corresponding Haskell implementation:
+ >
+ > primes = 2 : sieve [3, 5..]
+ > where sieve (p:ns) = p : sieve [n | n <- ns, mod n p /= 0]
+ > """
+ >
+ > from itertools import dropwhile, ifilter, islice, count, chain
+ >
+ > def primes():
+ > """Generate all primes."""
+ > def sieve(ns):
+ > p = ns.next()
+ > # It is important to yield *here* in order to stop the
+ > # infinite recursion.
+ > yield p
+ > ns = ifilter(lambda n: n % p != 0, ns)
+ > for n in sieve(ns):
+ > yield n
+ >
+ > odds = ifilter(lambda i: i % 2 == 1, count())
+ > return chain([2], sieve(dropwhile(lambda n: n < 3, odds)))
+ >
+ > if __name__ == "__main__":
+ > import sys
+ > try:
+ > n = int(sys.argv[1])
+ > except (ValueError, IndexError):
+ > n = 10
+ > p = primes()
+ > print "The first %d primes: %s" % (n, list(islice(p, n)))
+ > EOF
+ $ hg ci -Ama
+ adding primes.py
+
+hg serve
+
+ $ hg serve -p $HGPORT -d -n test --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+hgweb filerevision, html
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/primes.py') \
+ > | sed "s/class=\"k\"/class=\"kn\"/g" | sed "s/class=\"mf\"/class=\"mi\"/g"
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <link rel="stylesheet" href="/highlightcss" type="text/css" />
+ <title>test: 853dcd4de2a6 primes.py</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/853dcd4de2a6">log</a></li>
+ <li><a href="/graph/853dcd4de2a6">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+ <ul>
+ <li><a href="/rev/853dcd4de2a6">changeset</a></li>
+ <li><a href="/file/853dcd4de2a6/">browse</a></li>
+ </ul>
+ <ul>
+ <li class="active">file</li>
+ <li><a href="/file/tip/primes.py">latest</a></li>
+ <li><a href="/diff/853dcd4de2a6/primes.py">diff</a></li>
+ <li><a href="/comparison/853dcd4de2a6/primes.py">comparison</a></li>
+ <li><a href="/annotate/853dcd4de2a6/primes.py">annotate</a></li>
+ <li><a href="/log/853dcd4de2a6/primes.py">file log</a></li>
+ <li><a href="/raw-file/853dcd4de2a6/primes.py">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>view primes.py @ 0:853dcd4de2a6</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">a</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <div class="sourcefirst"> line source</div>
+
+ <div class="parity0 source"><a href="#l1" id="l1"> 1</a> <span class="c">#!/usr/bin/env python</span></div>
+ <div class="parity1 source"><a href="#l2" id="l2"> 2</a> </div>
+ <div class="parity0 source"><a href="#l3" id="l3"> 3</a> <span class="sd">&quot;&quot;&quot;Fun with generators. Corresponding Haskell implementation:</span></div>
+ <div class="parity1 source"><a href="#l4" id="l4"> 4</a> </div>
+ <div class="parity0 source"><a href="#l5" id="l5"> 5</a> <span class="sd">primes = 2 : sieve [3, 5..]</span></div>
+ <div class="parity1 source"><a href="#l6" id="l6"> 6</a> <span class="sd"> where sieve (p:ns) = p : sieve [n | n &lt;- ns, mod n p /= 0]</span></div>
+ <div class="parity0 source"><a href="#l7" id="l7"> 7</a> <span class="sd">&quot;&quot;&quot;</span></div>
+ <div class="parity1 source"><a href="#l8" id="l8"> 8</a> </div>
+ <div class="parity0 source"><a href="#l9" id="l9"> 9</a> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">dropwhile</span><span class="p">,</span> <span class="n">ifilter</span><span class="p">,</span> <span class="n">islice</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">chain</span></div>
+ <div class="parity1 source"><a href="#l10" id="l10"> 10</a> </div>
+ <div class="parity0 source"><a href="#l11" id="l11"> 11</a> <span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></div>
+ <div class="parity1 source"><a href="#l12" id="l12"> 12</a> <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></div>
+ <div class="parity0 source"><a href="#l13" id="l13"> 13</a> <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></div>
+ <div class="parity1 source"><a href="#l14" id="l14"> 14</a> <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></div>
+ <div class="parity0 source"><a href="#l15" id="l15"> 15</a> <span class="c"># It is important to yield *here* in order to stop the</span></div>
+ <div class="parity1 source"><a href="#l16" id="l16"> 16</a> <span class="c"># infinite recursion.</span></div>
+ <div class="parity0 source"><a href="#l17" id="l17"> 17</a> <span class="kn">yield</span> <span class="n">p</span></div>
+ <div class="parity1 source"><a href="#l18" id="l18"> 18</a> <span class="n">ns</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span></div>
+ <div class="parity0 source"><a href="#l19" id="l19"> 19</a> <span class="kn">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></div>
+ <div class="parity1 source"><a href="#l20" id="l20"> 20</a> <span class="kn">yield</span> <span class="n">n</span></div>
+ <div class="parity0 source"><a href="#l21" id="l21"> 21</a> </div>
+ <div class="parity1 source"><a href="#l22" id="l22"> 22</a> <span class="n">odds</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span></div>
+ <div class="parity0 source"><a href="#l23" id="l23"> 23</a> <span class="kn">return</span> <span class="n">chain</span><span class="p">([</span><span class="mi">2</span><span class="p">],</span> <span class="n">sieve</span><span class="p">(</span><span class="n">dropwhile</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">,</span> <span class="n">odds</span><span class="p">)))</span></div>
+ <div class="parity1 source"><a href="#l24" id="l24"> 24</a> </div>
+ <div class="parity0 source"><a href="#l25" id="l25"> 25</a> <span class="kn">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span></div>
+ <div class="parity1 source"><a href="#l26" id="l26"> 26</a> <span class="kn">import</span> <span class="nn">sys</span></div>
+ <div class="parity0 source"><a href="#l27" id="l27"> 27</a> <span class="kn">try</span><span class="p">:</span></div>
+ <div class="parity1 source"><a href="#l28" id="l28"> 28</a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></div>
+ <div class="parity0 source"><a href="#l29" id="l29"> 29</a> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></div>
+ <div class="parity1 source"><a href="#l30" id="l30"> 30</a> <span class="n">n</span> <span class="o">=</span> <span class="mi">10</span></div>
+ <div class="parity0 source"><a href="#l31" id="l31"> 31</a> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></div>
+ <div class="parity1 source"><a href="#l32" id="l32"> 32</a> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></div>
+ <div class="sourcelast"></div>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+hgweb fileannotate, html
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'annotate/tip/primes.py') \
+ > | sed "s/class=\"k\"/class=\"kn\"/g" | sed "s/class=\"mi\"/class=\"mf\"/g"
+ 200 Script output follows
+
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <link rel="icon" href="/static/hgicon.png" type="image/png" />
+ <meta name="robots" content="index, nofollow" />
+ <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+ <script type="text/javascript" src="/static/mercurial.js"></script>
+
+ <link rel="stylesheet" href="/highlightcss" type="text/css" />
+ <title>test: primes.py annotate</title>
+ </head>
+ <body>
+
+ <div class="container">
+ <div class="menu">
+ <div class="logo">
+ <a href="http://mercurial.selenic.com/">
+ <img src="/static/hglogo.png" alt="mercurial" /></a>
+ </div>
+ <ul>
+ <li><a href="/shortlog/853dcd4de2a6">log</a></li>
+ <li><a href="/graph/853dcd4de2a6">graph</a></li>
+ <li><a href="/tags">tags</a></li>
+ <li><a href="/bookmarks">bookmarks</a></li>
+ <li><a href="/branches">branches</a></li>
+ </ul>
+
+ <ul>
+ <li><a href="/rev/853dcd4de2a6">changeset</a></li>
+ <li><a href="/file/853dcd4de2a6/">browse</a></li>
+ </ul>
+ <ul>
+ <li><a href="/file/853dcd4de2a6/primes.py">file</a></li>
+ <li><a href="/file/tip/primes.py">latest</a></li>
+ <li><a href="/diff/853dcd4de2a6/primes.py">diff</a></li>
+ <li><a href="/comparison/853dcd4de2a6/primes.py">comparison</a></li>
+ <li class="active">annotate</li>
+ <li><a href="/log/853dcd4de2a6/primes.py">file log</a></li>
+ <li><a href="/raw-annotate/853dcd4de2a6/primes.py">raw</a></li>
+ </ul>
+ <ul>
+ <li><a href="/help">help</a></li>
+ </ul>
+ </div>
+
+ <div class="main">
+ <h2><a href="/">test</a></h2>
+ <h3>annotate primes.py @ 0:853dcd4de2a6</h3>
+
+ <form class="search" action="/log">
+
+ <p><input name="rev" id="search1" type="text" size="30" /></p>
+ <div id="hint">find changesets by author, revision,
+ files, or words in the commit message</div>
+ </form>
+
+ <div class="description">a</div>
+
+ <table id="changesetEntry">
+ <tr>
+ <th class="author">author</th>
+ <td class="author">&#116;&#101;&#115;&#116;</td>
+ </tr>
+ <tr>
+ <th class="date">date</th>
+ <td class="date age">Thu, 01 Jan 1970 00:00:00 +0000</td>
+ </tr>
+ <tr>
+ <th class="author">parents</th>
+ <td class="author"></td>
+ </tr>
+ <tr>
+ <th class="author">children</th>
+ <td class="author"></td>
+ </tr>
+
+ </table>
+
+ <div class="overflow">
+ <table class="bigtable">
+ <tr>
+ <th class="annotate">rev</th>
+ <th class="line">&nbsp;&nbsp;line source</th>
+ </tr>
+
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l1"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l1" id="l1"> 1</a> <span class="c">#!/usr/bin/env python</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l2"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l2" id="l2"> 2</a> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l3"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l3" id="l3"> 3</a> <span class="sd">&quot;&quot;&quot;Fun with generators. Corresponding Haskell implementation:</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l4"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l4" id="l4"> 4</a> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l5"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l5" id="l5"> 5</a> <span class="sd">primes = 2 : sieve [3, 5..]</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l6"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l6" id="l6"> 6</a> <span class="sd"> where sieve (p:ns) = p : sieve [n | n &lt;- ns, mod n p /= 0]</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l7"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l7" id="l7"> 7</a> <span class="sd">&quot;&quot;&quot;</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l8"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l8" id="l8"> 8</a> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l9"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l9" id="l9"> 9</a> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">dropwhile</span><span class="p">,</span> <span class="n">ifilter</span><span class="p">,</span> <span class="n">islice</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">chain</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l10"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l10" id="l10"> 10</a> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l11"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l11" id="l11"> 11</a> <span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l12"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l12" id="l12"> 12</a> <span class="sd">&quot;&quot;&quot;Generate all primes.&quot;&quot;&quot;</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l13"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l13" id="l13"> 13</a> <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l14"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l14" id="l14"> 14</a> <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l15"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l15" id="l15"> 15</a> <span class="c"># It is important to yield *here* in order to stop the</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l16"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l16" id="l16"> 16</a> <span class="c"># infinite recursion.</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l17"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l17" id="l17"> 17</a> <span class="kn">yield</span> <span class="n">p</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l18"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l18" id="l18"> 18</a> <span class="n">ns</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mf">0</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l19"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l19" id="l19"> 19</a> <span class="kn">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l20"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l20" id="l20"> 20</a> <span class="kn">yield</span> <span class="n">n</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l21"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l21" id="l21"> 21</a> </td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l22"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l22" id="l22"> 22</a> <span class="n">odds</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">i</span> <span class="o">%</span> <span class="mf">2</span> <span class="o">==</span> <span class="mf">1</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l23"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l23" id="l23"> 23</a> <span class="kn">return</span> <span class="n">chain</span><span class="p">([</span><span class="mf">2</span><span class="p">],</span> <span class="n">sieve</span><span class="p">(</span><span class="n">dropwhile</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mf">3</span><span class="p">,</span> <span class="n">odds</span><span class="p">)))</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l24"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l24" id="l24"> 24</a> </td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l25"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l25" id="l25"> 25</a> <span class="kn">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l26"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l26" id="l26"> 26</a> <span class="kn">import</span> <span class="nn">sys</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l27"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l27" id="l27"> 27</a> <span class="kn">try</span><span class="p">:</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l28"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l28" id="l28"> 28</a> <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mf">1</span><span class="p">])</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l29"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l29" id="l29"> 29</a> <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l30"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l30" id="l30"> 30</a> <span class="n">n</span> <span class="o">=</span> <span class="mf">10</span></td>
+ </tr>
+ <tr class="parity0">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l31"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l31" id="l31"> 31</a> <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></td>
+ </tr>
+ <tr class="parity1">
+ <td class="annotate">
+ <a href="/annotate/853dcd4de2a6/primes.py#l32"
+ title="853dcd4de2a6: a">test@0</a>
+ </td>
+ <td class="source"><a href="#l32" id="l32"> 32</a> <span class="kn">print</span> <span class="s">&quot;The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ </div>
+
+ <script type="text/javascript">process_dates()</script>
+
+
+ </body>
+ </html>
+
+
+hgweb fileannotate, raw
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'annotate/tip/primes.py?style=raw') \
+ > | sed "s/test@//" > a
+ $ echo "200 Script output follows" > b
+ $ echo "" >> b
+ $ echo "" >> b
+ $ hg annotate "primes.py" >> b
+ $ echo "" >> b
+ $ echo "" >> b
+ $ echo "" >> b
+ $ echo "" >> b
+ $ diff -u b a
+
+hgweb filerevision, raw
+
+ $ ("$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/primes.py?style=raw') \
+ > > a
+ $ echo "200 Script output follows" > b
+ $ echo "" >> b
+ $ hg cat primes.py >> b
+ $ diff -u b a
+
+hgweb highlightcss friendly
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'highlightcss' > out
+ $ head -n 4 out
+ 200 Script output follows
+
+ /* pygments_style = friendly */
+
+ $ rm out
+
+errors encountered
+
+ $ cat errors.log
+ $ "$TESTDIR/killdaemons.py"
+
+Change the pygments style
+
+ $ cat > .hg/hgrc <<EOF
+ > [web]
+ > pygments_style = fruity
+ > EOF
+
+hg serve again
+
+ $ hg serve -p $HGPORT -d -n test --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+hgweb highlightcss fruity
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'highlightcss' > out
+ $ head -n 4 out
+ 200 Script output follows
+
+ /* pygments_style = fruity */
+
+ $ rm out
+
+errors encountered
+
+ $ cat errors.log
+ $ cd ..
+ $ hg init eucjp
+ $ cd eucjp
+ $ python -c 'print("\265\376")' >> eucjp.txt # Japanese kanji "Kyo"
+ $ hg ci -Ama
+ adding eucjp.txt
+ $ hgserveget () {
+ > "$TESTDIR/killdaemons.py"
+ > echo % HGENCODING="$1" hg serve
+ > HGENCODING="$1" hg serve -p $HGPORT -d -n test --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ >
+ > echo % hgweb filerevision, html
+ > "$TESTDIR/get-with-headers.py" localhost:$HGPORT "file/tip/$2" \
+ > | grep '<div class="parity0 source">'
+ > echo % errors encountered
+ > cat errors.log
+ > }
+ $ hgserveget euc-jp eucjp.txt
+ % HGENCODING=euc-jp hg serve
+ % hgweb filerevision, html
+ <div class="parity0 source"><a href="#l1" id="l1"> 1</a> \xb5\xfe</div> (esc)
+ % errors encountered
+ $ hgserveget utf-8 eucjp.txt
+ % HGENCODING=utf-8 hg serve
+ % hgweb filerevision, html
+ <div class="parity0 source"><a href="#l1" id="l1"> 1</a> \xef\xbf\xbd\xef\xbf\xbd</div> (esc)
+ % errors encountered
+ $ hgserveget us-ascii eucjp.txt
+ % HGENCODING=us-ascii hg serve
+ % hgweb filerevision, html
+ <div class="parity0 source"><a href="#l1" id="l1"> 1</a> ??</div>
+ % errors encountered
+
+ $ cd ..
diff --git a/tests/test-histedit-bookmark-motion.t b/tests/test-histedit-bookmark-motion.t
new file mode 100644
index 0000000..8ab9907
--- /dev/null
+++ b/tests/test-histedit-bookmark-motion.t
@@ -0,0 +1,187 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ hg init r
+ $ cd r
+
+ $ for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+
+ $ hg book -r 1 will-move-backwards
+ $ hg book -r 2 two
+ $ hg book -r 2 also-two
+ $ hg book -r 3 three
+ $ hg book -r 4 four
+ $ hg book -r tip five
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | bookmark: five
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | bookmark: four
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | bookmark: three
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | bookmark: also-two
+ | bookmark: two
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | bookmark: will-move-backwards
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ HGEDITOR=cat hg histedit 1
+ pick d2ae7f538514 1 b
+ pick 177f92b77385 2 c
+ pick 055a42cdd887 3 d
+ pick e860deea161a 4 e
+ pick 652413bf663e 5 f
+
+ # Edit history between d2ae7f538514 and 652413bf663e
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat >> commands.txt <<EOF
+ > pick 177f92b77385 2 c
+ > drop d2ae7f538514 1 b
+ > pick 055a42cdd887 3 d
+ > fold e860deea161a 4 e
+ > pick 652413bf663e 5 f
+ > EOF
+ $ hg histedit 1 --commands commands.txt --verbose | grep histedit
+ histedit: Should update metadata for the following changes:
+ histedit: 055a42cdd887 to ae467701c500
+ histedit: moving bookmarks three
+ histedit: 177f92b77385 to d36c0562f908
+ histedit: moving bookmarks also-two, two
+ histedit: 652413bf663e to 0efacef7cb48
+ histedit: moving bookmarks five
+ histedit: d2ae7f538514 to cb9a9f314b8b
+ histedit: moving bookmarks will-move-backwards
+ histedit: e860deea161a to ae467701c500
+ histedit: moving bookmarks four
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/d2ae7f538514-backup.hg (glob)
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/34a9919932c1-backup.hg (glob)
+ $ hg log --graph
+ @ changeset: 3:0efacef7cb48
+ | bookmark: five
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 2:ae467701c500
+ | bookmark: four
+ | bookmark: three
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:d36c0562f908
+ | bookmark: also-two
+ | bookmark: two
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 0:cb9a9f314b8b
+ bookmark: will-move-backwards
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ HGEDITOR=cat hg histedit 1
+ pick d36c0562f908 1 c
+ pick ae467701c500 2 d
+ pick 0efacef7cb48 3 f
+
+ # Edit history between d36c0562f908 and 0efacef7cb48
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat > commands.txt << EOF
+ > pick d36c0562f908 1 c
+ > pick 0efacef7cb48 3 f
+ > pick ae467701c500 2 d
+ > EOF
+ $ hg histedit 1 --commands commands.txt --verbose | grep histedit
+ histedit: Should update metadata for the following changes:
+ histedit: 0efacef7cb48 to 1be9c35b4cb2
+ histedit: moving bookmarks five
+ histedit: 0efacef7cb48 to 7c044e3e33a9
+ histedit: ae467701c500 to 1be9c35b4cb2
+ histedit: moving bookmarks four, three
+ saved backup bundle to $TESTTMP/r/.hg/strip-backup/ae467701c500-backup.hg (glob)
+
+We expect 'five' to stay at tip, since the tipmost bookmark is most
+likely the useful signal.
+
+ $ hg log --graph
+ @ changeset: 3:1be9c35b4cb2
+ | bookmark: five
+ | bookmark: four
+ | bookmark: three
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:7c044e3e33a9
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 1:d36c0562f908
+ | bookmark: also-two
+ | bookmark: two
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 0:cb9a9f314b8b
+ bookmark: will-move-backwards
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
diff --git a/tests/test-histedit-commute.t b/tests/test-histedit-commute.t
new file mode 100644
index 0000000..7c1257b
--- /dev/null
+++ b/tests/test-histedit-commute.t
@@ -0,0 +1,359 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > pick 055a42cdd887 d
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > }
+
+ $ initrepo
+
+log before edit
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+show the edit commands offered
+ $ HGEDITOR=cat hg histedit 177f92b77385
+ pick 177f92b77385 2 c
+ pick 055a42cdd887 3 d
+ pick e860deea161a 4 e
+ pick 652413bf663e 5 f
+
+ # Edit history between 177f92b77385 and 652413bf663e
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+rules should end up in .hg/histedit-last-edit.txt:
+ $ cat .hg/histedit-last-edit.txt
+ pick 177f92b77385 c
+ pick e860deea161a e
+ pick 652413bf663e f
+ pick 055a42cdd887 d
+
+log after edit
+ $ hg log --graph
+ @ changeset: 5:853c68da763f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 4:26f6a030ae82
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 3:b069cc29fb22
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+put things back
+
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 853c68da763f d
+ > pick b069cc29fb22 e
+ > pick 26f6a030ae82 f
+ > EOF
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+slightly different this time
+
+ $ cat > $EDITED <<EOF
+ > pick 055a42cdd887 d
+ > pick 652413bf663e f
+ > pick e860deea161a e
+ > pick 177f92b77385 c
+ > EOF
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log --graph
+ @ changeset: 5:99a62755c625
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 4:7c6fdd608667
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:c4f52e213402
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 2:bfe4a5a76b37
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+keep prevents stripping dead revs
+ $ cat > $EDITED <<EOF
+ > pick bfe4a5a76b37 d
+ > pick c4f52e213402 f
+ > pick 99a62755c625 c
+ > pick 7c6fdd608667 e
+ > EOF
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit bfe4a5a76b37 --keep 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log --graph
+ > cat > $EDITED <<EOF
+ > pick 7c6fdd608667 e
+ > pick 99a62755c625 c
+ > EOF
+ @ changeset: 7:99e266581538
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 6:5ad36efb0653
+ | parent: 3:c4f52e213402
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ | o changeset: 5:99a62755c625
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c
+ | |
+ | o changeset: 4:7c6fdd608667
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:c4f52e213402
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 2:bfe4a5a76b37
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+try with --rev
+ $ hg histedit --commands "$EDITED" --rev -2 2>&1 | fixbundle
+ abort: may not use changesets other than the ones listed
+ $ hg log --graph
+ @ changeset: 7:99e266581538
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 6:5ad36efb0653
+ | parent: 3:c4f52e213402
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ | o changeset: 5:99a62755c625
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: c
+ | |
+ | o changeset: 4:7c6fdd608667
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:c4f52e213402
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 2:bfe4a5a76b37
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+should also work if a commit message is missing
+ $ BUNDLE="$TESTDIR/missing-comment.hg"
+ $ hg init missing
+ $ cd missing
+ $ hg unbundle $BUNDLE
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg co tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg log --graph
+ @ changeset: 2:bd22688093b3
+ | tag: tip
+ | user: Robert Altman <robert.altman@telventDTN.com>
+ | date: Mon Nov 28 16:40:04 2011 +0000
+ | summary: Update file.
+ |
+ o changeset: 1:3b3e956f9171
+ | user: Robert Altman <robert.altman@telventDTN.com>
+ | date: Mon Nov 28 16:37:57 2011 +0000
+ |
+ o changeset: 0:141947992243
+ user: Robert Altman <robert.altman@telventDTN.com>
+ date: Mon Nov 28 16:35:28 2011 +0000
+ summary: Checked in text file
+
+ $ hg histedit 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
diff --git a/tests/test-histedit-drop.t b/tests/test-histedit-drop.t
new file mode 100644
index 0000000..f425263
--- /dev/null
+++ b/tests/test-histedit-drop.t
@@ -0,0 +1,107 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > drop 177f92b77385 c
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > pick 055a42cdd887 d
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > }
+
+ $ initrepo
+
+log before edit
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+log after edit
+ $ hg log --graph
+ @ changeset: 4:708943196e52
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 3:75cbdffecadb
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 2:493dc0964412
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+manifest after edit
+ $ hg manifest
+ a
+ b
+ d
+ e
+ f
+
+ $ cd ..
diff --git a/tests/test-histedit-edit.t b/tests/test-histedit-edit.t
new file mode 100644
index 0000000..0ebe620
--- /dev/null
+++ b/tests/test-histedit-edit.t
@@ -0,0 +1,178 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > edit e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > }
+
+ $ initrepo
+
+log before edit
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ abort: Make changes as needed, you may commit or record as needed now.
+ When you are finished, run hg histedit --continue to resume.
+
+commit, then edit the revision
+ $ hg ci -m 'wat'
+ created new head
+ $ echo a > e
+ $ HGEDITOR='echo foobaz > ' hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg log --graph
+ @ changeset: 6:bf757c081cd0
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 5:d6b15fed32d4
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: foobaz
+ |
+ o changeset: 4:1a60820cd1f6
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: wat
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ hg cat e
+ a
+
+ $ cat > $EDITED <<EOF
+ > edit bf757c081cd0 f
+ > EOF
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit tip 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ abort: Make changes as needed, you may commit or record as needed now.
+ When you are finished, run hg histedit --continue to resume.
+ $ hg status
+ A f
+ $ HGEDITOR='true' hg histedit --continue
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status
+
+log after edit
+ $ hg log --limit 1
+ changeset: 6:bf757c081cd0
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: f
+
+
+say we'll change the message, but don't.
+ $ cat > ../edit.sh <<EOF
+ > cat "\$1" | sed s/pick/mess/ > tmp
+ > mv tmp "\$1"
+ > EOF
+ $ HGEDITOR="sh ../edit.sh" hg histedit tip 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status
+ $ hg log --limit 1
+ changeset: 6:bf757c081cd0
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: f
+
+
+modify the message
+ $ cat > $EDITED <<EOF
+ > mess bf757c081cd0 f
+ > EOF
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit tip 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status
+ $ hg log --limit 1
+ changeset: 6:0b16746f8e89
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: mess bf757c081cd0 f
+
+
+rollback should not work after a histedit
+ $ hg rollback
+ no rollback information available
+ [1]
+
+ $ cd ..
diff --git a/tests/test-histedit-fold-non-commute.t b/tests/test-histedit-fold-non-commute.t
new file mode 100644
index 0000000..502446b
--- /dev/null
+++ b/tests/test-histedit-fold-non-commute.t
@@ -0,0 +1,147 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > fold bfa474341cc9 does not commute with e
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init $1
+ > cd $1
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > echo a >> e
+ > hg ci -m 'does not commute with e'
+ > cd ..
+ > }
+
+ $ initrepo r
+ $ cd r
+
+log before edit
+ $ hg log --graph
+ @ changeset: 6:bfa474341cc9
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 5:652413bf663e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+fix up
+ $ echo a > e
+ $ hg add e
+ $ cat > cat.py <<EOF
+ > import sys
+ > print open(sys.argv[1]).read()
+ > print
+ > print
+ > EOF
+ $ HGEDITOR="python cat.py" hg histedit --continue 2>&1 | fixbundle | grep -v '2 files removed'
+ d
+ ***
+ does not commute with e
+
+
+
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ file e already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+just continue this time
+ $ hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+log after edit
+ $ hg log --graph
+ @ changeset: 4:f768fd60ca34
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 3:671efe372e33
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+contents of e
+ $ hg cat e
+ a
+
+manifest
+ $ hg manifest
+ a
+ b
+ c
+ d
+ e
+ f
+
+ $ cd ..
diff --git a/tests/test-histedit-fold.t b/tests/test-histedit-fold.t
new file mode 100644
index 0000000..645cbc2
--- /dev/null
+++ b/tests/test-histedit-fold.t
@@ -0,0 +1,238 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > fold 177f92b77385 c
+ > pick 055a42cdd887 d
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > }
+
+ $ initrepo
+
+log before edit
+ $ hg log --graph
+ @ changeset: 5:652413bf663e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+log after edit
+ $ hg log --graph
+ @ changeset: 4:82b0c1ff1777
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 3:150aafb44a91
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: pick e860deea161a e
+ |
+ o changeset: 2:493dc0964412
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+post-fold manifest
+ $ hg manifest
+ a
+ b
+ c
+ d
+ e
+ f
+
+ $ cd ..
+
+folding and creating no new change doesn't break:
+ $ mkdir fold-to-empty-test
+ $ cd fold-to-empty-test
+ $ hg init
+ $ printf "1\n2\n3\n" > file
+ $ hg add file
+ $ hg commit -m '1+2+3'
+ $ echo 4 >> file
+ $ hg commit -m '+4'
+ $ echo 5 >> file
+ $ hg commit -m '+5'
+ $ echo 6 >> file
+ $ hg commit -m '+6'
+ $ hg log --graph
+ @ changeset: 3:251d831eeec5
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: +6
+ |
+ o changeset: 2:888f9082bf99
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: +5
+ |
+ o changeset: 1:617f94f13c0f
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: +4
+ |
+ o changeset: 0:0189ba417d34
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1+2+3
+
+
+ $ cat > editor.py <<EOF
+ > import re, sys
+ > rules = sys.argv[1]
+ > data = open(rules).read()
+ > data = re.sub(r'pick ([0-9a-f]{12} 2 \+5)', r'drop \1', data)
+ > data = re.sub(r'pick ([0-9a-f]{12} 2 \+6)', r'fold \1', data)
+ > open(rules, 'w').write(data)
+ > EOF
+
+ $ HGEDITOR='python editor.py' hg histedit 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ patching file file
+ Hunk #1 FAILED at 2
+ 1 out of 1 hunks FAILED -- saving rejects to file file.rej
+ abort: Fix up the change and run hg histedit --continue
+ [255]
+There were conflicts, but we'll continue without resolving. This
+should effectively drop the changes from +6.
+ $ hg status
+ ? editor.py
+ ? file.rej
+ $ hg histedit --continue
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/*-backup.hg (glob)
+ $ hg log --graph
+ @ changeset: 1:617f94f13c0f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: +4
+ |
+ o changeset: 0:0189ba417d34
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1+2+3
+
+
+ $ cd ..
+
+Test corner case where folded revision is separated from its parent by a
+dropped revision.
+
+
+ $ hg init fold-with-dropped
+ $ cd fold-with-dropped
+ $ printf "1\n2\n3\n" > file
+ $ hg commit -Am '1+2+3'
+ adding file
+ $ echo 4 >> file
+ $ hg commit -m '+4'
+ $ echo 5 >> file
+ $ hg commit -m '+5'
+ $ echo 6 >> file
+ $ hg commit -m '+6'
+ $ hg log -G --template '{rev}:{node|short} {desc|firstline}\n'
+ @ 3:251d831eeec5 +6
+ |
+ o 2:888f9082bf99 +5
+ |
+ o 1:617f94f13c0f +4
+ |
+ o 0:0189ba417d34 1+2+3
+
+ $ EDITED="$TESTTMP/editcommands"
+ $ cat > $EDITED <<EOF
+ > pick 617f94f13c0f 1 +4
+ > drop 888f9082bf99 2 +5
+ > fold 251d831eeec5 3 +6
+ > EOF
+ $ HGEDITOR="cat $EDITED >" hg histedit 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ patching file file
+ Hunk #1 FAILED at 2
+ 1 out of 1 hunks FAILED -- saving rejects to file file.rej
+ abort: Fix up the change and run hg histedit --continue
+ [255]
+ $ echo 5 >> file
+ $ hg commit -m '+5.2'
+ created new head
+ $ echo 6 >> file
+ $ HGEDITOR=cat hg histedit --continue
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ +4
+ ***
+ +5.2
+ ***
+ +6
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/fold-with-dropped/.hg/strip-backup/617f94f13c0f-backup.hg (glob)
+ $ cd ..
+
diff --git a/tests/test-histedit-no-change.t b/tests/test-histedit-no-change.t
new file mode 100644
index 0000000..6d9ce27
--- /dev/null
+++ b/tests/test-histedit-no-change.t
@@ -0,0 +1,187 @@
+test for old histedit issue #6:
+editing a changeset without any actual change would corrupt the repository
+
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ initrepo ()
+ > {
+ > dir="$1"
+ > comment="$2"
+ > if [ -n "${comment}" ]; then
+ > echo % ${comment}
+ > echo % ${comment} | sed 's:.:-:g'
+ > fi
+ > hg init ${dir}
+ > cd ${dir}
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > cd ..
+ > }
+
+ $ geneditor ()
+ > {
+ > # generate an editor script for selecting changesets to be edited
+ > choice=$1 # changesets that should be edited (using sed line ranges)
+ > cat <<EOF | sed 's:^....::'
+ > # editing the rules, replacing 'pick' with 'edit' for the chosen lines
+ > sed '${choice}s:^pick:edit:' "\$1" > "\${1}.tmp"
+ > mv "\${1}.tmp" "\$1"
+ > # displaying the resulting rules, minus comments and empty lines
+ > sed '/^#/d;/^$/d;s:^:| :' "\$1" >&2
+ > EOF
+ > }
+
+ $ startediting ()
+ > {
+ > # begin an editing session
+ > choice="$1" # changesets that should be edited
+ > number="$2" # number of changesets considered (from tip)
+ > comment="$3"
+ > geneditor "${choice}" > edit.sh
+ > echo % start editing the history ${comment}
+ > HGEDITOR="sh ./edit.sh" hg histedit -- -${number} 2>&1 | fixbundle
+ > }
+
+ $ continueediting ()
+ > {
+ > # continue an edit already in progress
+ > editor="$1" # message editor when finalizing editing
+ > comment="$2"
+ > echo % finalize changeset editing ${comment}
+ > HGEDITOR=${editor} hg histedit --continue 2>&1 | fixbundle
+ > }
+
+ $ graphlog ()
+ > {
+ > comment="${1:-log}"
+ > echo % "${comment}"
+ > hg glog --template '{rev} {node} \"{desc|firstline}\"\n'
+ > }
+
+
+ $ initrepo r1 "test editing with no change"
+ % test editing with no change
+ -----------------------------
+ $ cd r1
+ $ graphlog "log before editing"
+ % log before editing
+ @ 5 652413bf663ef2a641cab26574e46d5f5a64a55a "f"
+ |
+ o 4 e860deea161a2f77de56603b340ebbb4536308ae "e"
+ |
+ o 3 055a42cdd88768532f9cf79daa407fc8d138de9b "d"
+ |
+ o 2 177f92b773850b59254aa5e923436f921b55483b "c"
+ |
+ o 1 d2ae7f538514cd87c17547b0de4cea71fe1af9fb "b"
+ |
+ o 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b "a"
+
+ $ startediting 2 3 "(not changing anything)" # edit the 2nd of 3 changesets
+ % start editing the history (not changing anything)
+ | pick 055a42cdd887 3 d
+ | edit e860deea161a 4 e
+ | pick 652413bf663e 5 f
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ abort: Make changes as needed, you may commit or record as needed now.
+ When you are finished, run hg histedit --continue to resume.
+ $ continueediting true "(leaving commit message unaltered)"
+ % finalize changeset editing (leaving commit message unaltered)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+check state of working copy
+ $ hg id
+ 652413bf663e tip
+
+ $ graphlog "log after history editing"
+ % log after history editing
+ @ 5 652413bf663ef2a641cab26574e46d5f5a64a55a "f"
+ |
+ o 4 e860deea161a2f77de56603b340ebbb4536308ae "e"
+ |
+ o 3 055a42cdd88768532f9cf79daa407fc8d138de9b "d"
+ |
+ o 2 177f92b773850b59254aa5e923436f921b55483b "c"
+ |
+ o 1 d2ae7f538514cd87c17547b0de4cea71fe1af9fb "b"
+ |
+ o 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b "a"
+
+
+ $ cd ..
+
+ $ initrepo r2 "test editing with no change, then abort"
+ % test editing with no change, then abort
+ -----------------------------------------
+ $ cd r2
+ $ graphlog "log before editing"
+ % log before editing
+ @ 5 652413bf663ef2a641cab26574e46d5f5a64a55a "f"
+ |
+ o 4 e860deea161a2f77de56603b340ebbb4536308ae "e"
+ |
+ o 3 055a42cdd88768532f9cf79daa407fc8d138de9b "d"
+ |
+ o 2 177f92b773850b59254aa5e923436f921b55483b "c"
+ |
+ o 1 d2ae7f538514cd87c17547b0de4cea71fe1af9fb "b"
+ |
+ o 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b "a"
+
+ $ startediting 1,2 3 "(not changing anything)" # edit the 1st two of 3 changesets
+ % start editing the history (not changing anything)
+ | edit 055a42cdd887 3 d
+ | edit e860deea161a 4 e
+ | pick 652413bf663e 5 f
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ abort: Make changes as needed, you may commit or record as needed now.
+ When you are finished, run hg histedit --continue to resume.
+ $ continueediting true "(leaving commit message unaltered)"
+ % finalize changeset editing (leaving commit message unaltered)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ abort: Make changes as needed, you may commit or record as needed now.
+ When you are finished, run hg histedit --continue to resume.
+ $ graphlog "log after first edit"
+ % log after first edit
+ o 5 652413bf663ef2a641cab26574e46d5f5a64a55a "f"
+ |
+ o 4 e860deea161a2f77de56603b340ebbb4536308ae "e"
+ |
+ @ 3 055a42cdd88768532f9cf79daa407fc8d138de9b "d"
+ |
+ o 2 177f92b773850b59254aa5e923436f921b55483b "c"
+ |
+ o 1 d2ae7f538514cd87c17547b0de4cea71fe1af9fb "b"
+ |
+ o 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b "a"
+
+
+abort editing session
+ $ hg histedit --abort 2>&1 | fixbundle
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ graphlog "log after abort"
+ % log after abort
+ @ 5 652413bf663ef2a641cab26574e46d5f5a64a55a "f"
+ |
+ o 4 e860deea161a2f77de56603b340ebbb4536308ae "e"
+ |
+ o 3 055a42cdd88768532f9cf79daa407fc8d138de9b "d"
+ |
+ o 2 177f92b773850b59254aa5e923436f921b55483b "c"
+ |
+ o 1 d2ae7f538514cd87c17547b0de4cea71fe1af9fb "b"
+ |
+ o 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b "a"
+
+
+ $ cd ..
diff --git a/tests/test-histedit-non-commute-abort.t b/tests/test-histedit-non-commute-abort.t
new file mode 100644
index 0000000..925a624
--- /dev/null
+++ b/tests/test-histedit-non-commute-abort.t
@@ -0,0 +1,131 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > pick bfa474341cc9 does not commute with e
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > echo a >> e
+ > hg ci -m 'does not commute with e'
+ > cd ..
+ > }
+
+ $ initrepo
+ $ cd r
+
+log before edit
+ $ hg log --graph
+ @ changeset: 6:bfa474341cc9
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 5:652413bf663e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+fix up (pre abort)
+ $ echo a > e
+ $ hg add e
+ $ hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ file e already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+abort the edit
+ $ hg histedit --abort 2>&1 | fixbundle
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+log after abort
+ $ hg log --graph
+ @ changeset: 6:bfa474341cc9
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 5:652413bf663e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ cd ..
diff --git a/tests/test-histedit-non-commute.t b/tests/test-histedit-non-commute.t
new file mode 100644
index 0000000..31d6096
--- /dev/null
+++ b/tests/test-histedit-non-commute.t
@@ -0,0 +1,244 @@
+ $ . "$TESTDIR/histedit-helpers.sh"
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ EDITED="$TESTTMP/editedhistory"
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > pick bfa474341cc9 does not commute with e
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+ $ initrepo ()
+ > {
+ > hg init $1
+ > cd $1
+ > for x in a b c d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > echo a >> e
+ > hg ci -m 'does not commute with e'
+ > cd ..
+ > }
+
+ $ initrepo r1
+ $ cd r1
+
+log before edit
+ $ hg log --graph
+ @ changeset: 6:bfa474341cc9
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 5:652413bf663e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+abort the edit
+ $ hg histedit --abort 2>&1 | fixbundle
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+second edit set
+
+ $ hg log --graph
+ @ changeset: 6:bfa474341cc9
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 5:652413bf663e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:e860deea161a
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+edit the history
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+fix up
+ $ echo a > e
+ $ hg add e
+ $ hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ file e already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+just continue this time
+ $ hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+log after edit
+ $ hg log --graph
+ @ changeset: 5:9ab84894b459
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:1fff3ae8199d
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: does not commute with e
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+start over
+
+ $ cd ..
+
+ $ initrepo r2
+ $ cd r2
+ $ cat > $EDITED <<EOF
+ > pick 177f92b77385 c
+ > pick 055a42cdd887 d
+ > mess bfa474341cc9 does not commute with e
+ > pick e860deea161a e
+ > pick 652413bf663e f
+ > EOF
+
+edit the history, this time with a fold action
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit 177f92b77385 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+
+ $ echo a > e
+ $ hg add e
+ $ HGEDITOR="cat \"$EDITED\" > " hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ file e already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ abort: Fix up the change and run hg histedit --continue
+second edit also fails, but just continue
+ $ hg histedit --continue 2>&1 | fixbundle
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+post message fix
+ $ hg log --graph
+ @ changeset: 5:6459970fb49b
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: f
+ |
+ o changeset: 4:556f27c874b0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: pick 177f92b77385 c
+ |
+ o changeset: 3:055a42cdd887
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 2:177f92b77385
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:d2ae7f538514
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ cd ..
diff --git a/tests/test-histedit-outgoing.t b/tests/test-histedit-outgoing.t
new file mode 100644
index 0000000..8025891
--- /dev/null
+++ b/tests/test-histedit-outgoing.t
@@ -0,0 +1,84 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+ $ initrepos ()
+ > {
+ > hg init r
+ > cd r
+ > for x in a b c ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > cd ..
+ > hg clone r r2 | grep -v updating
+ > cd r2
+ > for x in d e f ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > cd ..
+ > hg init r3
+ > cd r3
+ > for x in g h i ; do
+ > echo $x > $x
+ > hg add $x
+ > hg ci -m $x
+ > done
+ > cd ..
+ > }
+
+ $ initrepos
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+show the edit commands offered by outgoing
+ $ cd r2
+ $ HGEDITOR=cat hg histedit --outgoing ../r | grep -v comparing | grep -v searching
+ pick 055a42cdd887 3 d
+ pick e860deea161a 4 e
+ pick 652413bf663e 5 f
+
+ # Edit history between 055a42cdd887 and 652413bf663e
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+show the error from unrelated repos
+ $ cd r3
+ $ HGEDITOR=cat hg histedit --outgoing ../r | grep -v comparing | grep -v searching
+ abort: repository is unrelated
+ [1]
+ $ cd ..
+
+show the error from unrelated repos
+ $ cd r3
+ $ HGEDITOR=cat hg histedit --force --outgoing ../r
+ comparing with ../r
+ searching for changes
+ warning: repository is unrelated
+ pick 2a4042b45417 0 g
+ pick 68c46b4927ce 1 h
+ pick 51281e65ba79 2 i
+
+ # Edit history between 2a4042b45417 and 51281e65ba79
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
diff --git a/tests/test-histedit-revspec.t b/tests/test-histedit-revspec.t
new file mode 100644
index 0000000..06601d3
--- /dev/null
+++ b/tests/test-histedit-revspec.t
@@ -0,0 +1,62 @@
+This test requires parentrevspec support in revsets, so check for that
+and skip the test if we're on an unusual hg that supports .t tests but
+not parentrevspec.
+ $ python -c 'from mercurial import revset ; revset.methods["parentpost"]' || exit 80
+
+Enable extensions used by this test.
+ $ cat >>$HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > histedit=
+ > EOF
+
+Repo setup.
+ $ hg init foo
+ $ cd foo
+ $ echo alpha >> alpha
+ $ hg addr
+ adding alpha
+ $ hg ci -m one
+ $ echo alpha >> alpha
+ $ hg ci -m two
+ $ echo alpha >> alpha
+ $ hg ci -m three
+ $ echo alpha >> alpha
+ $ hg ci -m four
+ $ echo alpha >> alpha
+ $ hg ci -m five
+
+ $ hg log --style compact --graph
+ @ 4[tip] 08d98a8350f3 1970-01-01 00:00 +0000 test
+ | five
+ |
+ o 3 c8e68270e35a 1970-01-01 00:00 +0000 test
+ | four
+ |
+ o 2 eb57da33312f 1970-01-01 00:00 +0000 test
+ | three
+ |
+ o 1 579e40513370 1970-01-01 00:00 +0000 test
+ | two
+ |
+ o 0 6058cbb6cfd7 1970-01-01 00:00 +0000 test
+ one
+
+
+Run a dummy edit to make sure we get tip^^ correctly via revsingle.
+ $ HGEDITOR=cat hg histedit "tip^^"
+ pick eb57da33312f 2 three
+ pick c8e68270e35a 3 four
+ pick 08d98a8350f3 4 five
+
+ # Edit history between eb57da33312f and 08d98a8350f3
+ #
+ # Commands:
+ # p, pick = use commit
+ # e, edit = use commit, but stop for amending
+ # f, fold = use commit, but fold into previous commit (combines N and N-1)
+ # d, drop = remove commit from history
+ # m, mess = edit message without changing commit content
+ #
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
diff --git a/tests/test-hook.t b/tests/test-hook.t
new file mode 100644
index 0000000..8b0b12c
--- /dev/null
+++ b/tests/test-hook.t
@@ -0,0 +1,644 @@
+commit hooks can see env vars
+
+ $ hg init a
+ $ cd a
+ $ cat > .hg/hgrc <<EOF
+ > [hooks]
+ > commit = sh -c "HG_LOCAL= HG_TAG= python \"$TESTDIR/printenv.py\" commit"
+ > commit.b = sh -c "HG_LOCAL= HG_TAG= python \"$TESTDIR/printenv.py\" commit.b"
+ > precommit = sh -c "HG_LOCAL= HG_NODE= HG_TAG= python \"$TESTDIR/printenv.py\" precommit"
+ > pretxncommit = sh -c "HG_LOCAL= HG_TAG= python \"$TESTDIR/printenv.py\" pretxncommit"
+ > pretxncommit.tip = hg -q tip
+ > pre-identify = python "$TESTDIR/printenv.py" pre-identify 1
+ > pre-cat = python "$TESTDIR/printenv.py" pre-cat
+ > post-cat = python "$TESTDIR/printenv.py" post-cat
+ > EOF
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m a
+ precommit hook: HG_PARENT1=0000000000000000000000000000000000000000
+ pretxncommit hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000 HG_PENDING=$TESTTMP/a
+ 0:cb9a9f314b8b
+ commit hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
+ commit.b hook: HG_NODE=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PARENT1=0000000000000000000000000000000000000000
+
+ $ hg clone . ../b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../b
+
+changegroup hooks can see env vars
+
+ $ cat > .hg/hgrc <<EOF
+ > [hooks]
+ > prechangegroup = python "$TESTDIR/printenv.py" prechangegroup
+ > changegroup = python "$TESTDIR/printenv.py" changegroup
+ > incoming = python "$TESTDIR/printenv.py" incoming
+ > EOF
+
+pretxncommit and commit hooks can see both parents of merge
+
+ $ cd ../a
+ $ echo b >> a
+ $ hg commit -m a1 -d "1 0"
+ precommit hook: HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ pretxncommit hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
+ 1:ab228980c14d
+ commit hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ commit.b hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m b -d '1 0'
+ precommit hook: HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ pretxncommit hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b HG_PENDING=$TESTTMP/a
+ 2:ee9deb46ab31
+ commit hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ commit.b hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT1=cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b
+ created new head
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m merge -d '2 0'
+ precommit hook: HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
+ pretxncommit hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd HG_PENDING=$TESTTMP/a
+ 3:07f3376c1e65
+ commit hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
+ commit.b hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PARENT1=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_PARENT2=ab228980c14deea8b9555d91c9581127383e40fd
+
+test generic hooks
+
+ $ hg id
+ pre-identify hook: HG_ARGS=id HG_OPTS={'bookmarks': None, 'branch': None, 'id': None, 'insecure': None, 'num': None, 'remotecmd': '', 'rev': '', 'ssh': '', 'tags': None} HG_PATS=[]
+ warning: pre-identify hook exited with status 1
+ [1]
+ $ hg cat b
+ pre-cat hook: HG_ARGS=cat b HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b']
+ b
+ post-cat hook: HG_ARGS=cat b HG_OPTS={'decode': None, 'exclude': [], 'include': [], 'output': '', 'rev': ''} HG_PATS=['b'] HG_RESULT=0
+
+ $ cd ../b
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ prechangegroup hook: HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 2 files
+ changegroup hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ incoming hook: HG_NODE=ab228980c14deea8b9555d91c9581127383e40fd HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ incoming hook: HG_NODE=ee9deb46ab31e4cc3310f3cf0c3d668e4d8fffc2 HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ incoming hook: HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ (run 'hg update' to get a working copy)
+
+tag hooks can see env vars
+
+ $ cd ../a
+ $ cat >> .hg/hgrc <<EOF
+ > pretag = python "$TESTDIR/printenv.py" pretag
+ > tag = sh -c "HG_PARENT1= HG_PARENT2= python \"$TESTDIR/printenv.py\" tag"
+ > EOF
+ $ hg tag -d '3 0' a
+ pretag hook: HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
+ precommit hook: HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
+ pretxncommit hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2 HG_PENDING=$TESTTMP/a
+ 4:539e4b31b6dc
+ tag hook: HG_LOCAL=0 HG_NODE=07f3376c1e655977439df2a814e3cc14b27abac2 HG_TAG=a
+ commit hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
+ commit.b hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PARENT1=07f3376c1e655977439df2a814e3cc14b27abac2
+ $ hg tag -l la
+ pretag hook: HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
+ tag hook: HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=la
+
+pretag hook can forbid tagging
+
+ $ echo "pretag.forbid = python \"$TESTDIR/printenv.py\" pretag.forbid 1" >> .hg/hgrc
+ $ hg tag -d '4 0' fa
+ pretag hook: HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
+ pretag.forbid hook: HG_LOCAL=0 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fa
+ abort: pretag.forbid hook exited with status 1
+ [255]
+ $ hg tag -l fla
+ pretag hook: HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
+ pretag.forbid hook: HG_LOCAL=1 HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_TAG=fla
+ abort: pretag.forbid hook exited with status 1
+ [255]
+
+pretxncommit hook can see changeset, can roll back txn, changeset no
+more there after
+
+ $ echo "pretxncommit.forbid0 = hg tip -q" >> .hg/hgrc
+ $ echo "pretxncommit.forbid1 = python \"$TESTDIR/printenv.py\" pretxncommit.forbid 1" >> .hg/hgrc
+ $ echo z > z
+ $ hg add z
+ $ hg -q tip
+ 4:539e4b31b6dc
+ $ hg commit -m 'fail' -d '4 0'
+ precommit hook: HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
+ pretxncommit hook: HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
+ 5:6f611f8018c1
+ 5:6f611f8018c1
+ pretxncommit.forbid hook: HG_NODE=6f611f8018c10e827fee6bd2bc807f937e761567 HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/a
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.forbid1 hook exited with status 1
+ [255]
+ $ hg -q tip
+ 4:539e4b31b6dc
+
+precommit hook can prevent commit
+
+ $ echo "precommit.forbid = python \"$TESTDIR/printenv.py\" precommit.forbid 1" >> .hg/hgrc
+ $ hg commit -m 'fail' -d '4 0'
+ precommit hook: HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
+ precommit.forbid hook: HG_PARENT1=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10
+ abort: precommit.forbid hook exited with status 1
+ [255]
+ $ hg -q tip
+ 4:539e4b31b6dc
+
+preupdate hook can prevent update
+
+ $ echo "preupdate = python \"$TESTDIR/printenv.py\" preupdate" >> .hg/hgrc
+ $ hg update 1
+ preupdate hook: HG_PARENT1=ab228980c14d
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+update hook
+
+ $ echo "update = python \"$TESTDIR/printenv.py\" update" >> .hg/hgrc
+ $ hg update
+ preupdate hook: HG_PARENT1=539e4b31b6dc
+ update hook: HG_ERROR=0 HG_PARENT1=539e4b31b6dc
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+pushkey hook
+
+ $ echo "pushkey = python \"$TESTDIR/printenv.py\" pushkey" >> .hg/hgrc
+ $ cd ../b
+ $ hg bookmark -r null foo
+ $ hg push -B foo ../a
+ pushing to ../a
+ searching for changes
+ no changes found
+ exporting bookmark foo
+ pushkey hook: HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1
+ [1]
+ $ cd ../a
+
+listkeys hook
+
+ $ echo "listkeys = python \"$TESTDIR/printenv.py\" listkeys" >> .hg/hgrc
+ $ hg bookmark -r null bar
+ $ cd ../b
+ $ hg pull -B bar ../a
+ pulling from ../a
+ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
+ no changes found
+ listkeys hook: HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'}
+ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
+ adding remote bookmark bar
+ importing bookmark bar
+ $ cd ../a
+
+test that prepushkey can prevent incoming keys
+
+ $ echo "prepushkey = python \"$TESTDIR/printenv.py\" prepushkey.forbid 1" >> .hg/hgrc
+ $ cd ../b
+ $ hg bookmark -r null baz
+ $ hg push -B baz ../a
+ pushing to ../a
+ searching for changes
+ no changes found
+ listkeys hook: HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'}
+ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
+ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'}
+ exporting bookmark baz
+ prepushkey.forbid hook: HG_KEY=baz HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000
+ abort: prepushkey hook exited with status 1
+ [255]
+ $ cd ../a
+
+test that prelistkeys can prevent listing keys
+
+ $ echo "prelistkeys = python \"$TESTDIR/printenv.py\" prelistkeys.forbid 1" >> .hg/hgrc
+ $ hg bookmark -r null quux
+ $ cd ../b
+ $ hg pull -B quux ../a
+ pulling from ../a
+ prelistkeys.forbid hook: HG_NAMESPACE=bookmarks
+ abort: prelistkeys hook exited with status 1
+ [255]
+ $ cd ../a
+
+prechangegroup hook can prevent incoming changes
+
+ $ cd ../b
+ $ hg -q tip
+ 3:07f3376c1e65
+ $ cat > .hg/hgrc <<EOF
+ > [hooks]
+ > prechangegroup.forbid = python "$TESTDIR/printenv.py" prechangegroup.forbid 1
+ > EOF
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ prechangegroup.forbid hook: HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ abort: prechangegroup.forbid hook exited with status 1
+ [255]
+
+pretxnchangegroup hook can see incoming changes, can roll back txn,
+incoming changes no longer there after
+
+ $ cat > .hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup.forbid0 = hg tip -q
+ > pretxnchangegroup.forbid1 = python "$TESTDIR/printenv.py" pretxnchangegroup.forbid 1
+ > EOF
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 4:539e4b31b6dc
+ pretxnchangegroup.forbid hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_PENDING=$TESTTMP/b HG_SOURCE=pull HG_URL=file:$TESTTMP/a
+ transaction abort!
+ rollback completed
+ abort: pretxnchangegroup.forbid1 hook exited with status 1
+ [255]
+ $ hg -q tip
+ 3:07f3376c1e65
+
+outgoing hooks can see env vars
+
+ $ rm .hg/hgrc
+ $ cat > ../a/.hg/hgrc <<EOF
+ > [hooks]
+ > preoutgoing = python "$TESTDIR/printenv.py" preoutgoing
+ > outgoing = python "$TESTDIR/printenv.py" outgoing
+ > EOF
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ preoutgoing hook: HG_SOURCE=pull
+ adding changesets
+ outgoing hook: HG_NODE=539e4b31b6dc99b3cfbaa6b53cbc1c1f9a1e3a10 HG_SOURCE=pull
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ adding remote bookmark quux
+ (run 'hg update' to get a working copy)
+ $ hg rollback
+ repository tip rolled back to revision 3 (undo pull)
+
+preoutgoing hook can prevent outgoing changes
+
+ $ echo "preoutgoing.forbid = python \"$TESTDIR/printenv.py\" preoutgoing.forbid 1" >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ preoutgoing hook: HG_SOURCE=pull
+ preoutgoing.forbid hook: HG_SOURCE=pull
+ abort: preoutgoing.forbid hook exited with status 1
+ [255]
+
+outgoing hooks work for local clones
+
+ $ cd ..
+ $ cat > a/.hg/hgrc <<EOF
+ > [hooks]
+ > preoutgoing = python "$TESTDIR/printenv.py" preoutgoing
+ > outgoing = python "$TESTDIR/printenv.py" outgoing
+ > EOF
+ $ hg clone a c
+ preoutgoing hook: HG_SOURCE=clone
+ outgoing hook: HG_NODE=0000000000000000000000000000000000000000 HG_SOURCE=clone
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf c
+
+preoutgoing hook can prevent outgoing changes for local clones
+
+ $ echo "preoutgoing.forbid = python \"$TESTDIR/printenv.py\" preoutgoing.forbid 1" >> a/.hg/hgrc
+ $ hg clone a zzz
+ preoutgoing hook: HG_SOURCE=clone
+ preoutgoing.forbid hook: HG_SOURCE=clone
+ abort: preoutgoing.forbid hook exited with status 1
+ [255]
+
+ $ cd "$TESTTMP/b"
+
+ $ cat > hooktests.py <<EOF
+ > from mercurial import util
+ >
+ > uncallable = 0
+ >
+ > def printargs(args):
+ > args.pop('ui', None)
+ > args.pop('repo', None)
+ > a = list(args.items())
+ > a.sort()
+ > print 'hook args:'
+ > for k, v in a:
+ > print ' ', k, v
+ >
+ > def passhook(**args):
+ > printargs(args)
+ >
+ > def failhook(**args):
+ > printargs(args)
+ > return True
+ >
+ > class LocalException(Exception):
+ > pass
+ >
+ > def raisehook(**args):
+ > raise LocalException('exception from hook')
+ >
+ > def aborthook(**args):
+ > raise util.Abort('raise abort from hook')
+ >
+ > def brokenhook(**args):
+ > return 1 + {}
+ >
+ > def verbosehook(ui, **args):
+ > ui.note('verbose output from hook\n')
+ >
+ > def printtags(ui, repo, **args):
+ > print repo.tags().keys()
+ >
+ > class container:
+ > unreachable = 1
+ > EOF
+
+test python hooks
+
+#if windows
+ $ PYTHONPATH="$TESTTMP/b;$PYTHONPATH"
+#else
+ $ PYTHONPATH="$TESTTMP/b:$PYTHONPATH"
+#endif
+ $ export PYTHONPATH
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.broken = python:hooktests.brokenhook' >> ../a/.hg/hgrc
+ $ hg pull ../a 2>&1 | grep 'raised an exception'
+ error: preoutgoing.broken hook raised an exception: unsupported operand type(s) for +: 'int' and 'dict'
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.raise = python:hooktests.raisehook' >> ../a/.hg/hgrc
+ $ hg pull ../a 2>&1 | grep 'raised an exception'
+ error: preoutgoing.raise hook raised an exception: exception from hook
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.abort = python:hooktests.aborthook' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ error: preoutgoing.abort hook failed: raise abort from hook
+ abort: raise abort from hook
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.fail = python:hooktests.failhook' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ hook args:
+ hooktype preoutgoing
+ source pull
+ abort: preoutgoing.fail hook failed
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.uncallable = python:hooktests.uncallable' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: preoutgoing.uncallable hook is invalid ("hooktests.uncallable" is not callable)
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.nohook = python:hooktests.nohook' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: preoutgoing.nohook hook is invalid ("hooktests.nohook" is not defined)
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.nomodule = python:nomodule' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: preoutgoing.nomodule hook is invalid ("nomodule" not in a module)
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.badmodule = python:nomodule.nowhere' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: preoutgoing.badmodule hook is invalid (import of "nomodule" failed)
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.unreachable = python:hooktests.container.unreachable' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: preoutgoing.unreachable hook is invalid (import of "hooktests.container" failed)
+ [255]
+
+ $ echo '[hooks]' > ../a/.hg/hgrc
+ $ echo 'preoutgoing.pass = python:hooktests.passhook' >> ../a/.hg/hgrc
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ hook args:
+ hooktype preoutgoing
+ source pull
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ adding remote bookmark quux
+ (run 'hg update' to get a working copy)
+
+make sure --traceback works
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo 'commit.abort = python:hooktests.aborthook' >> .hg/hgrc
+
+ $ echo aa > a
+ $ hg --traceback commit -d '0 0' -ma 2>&1 | grep '^Traceback'
+ Traceback (most recent call last):
+
+ $ cd ..
+ $ hg init c
+ $ cd c
+
+ $ cat > hookext.py <<EOF
+ > def autohook(**args):
+ > print "Automatically installed hook"
+ >
+ > def reposetup(ui, repo):
+ > repo.ui.setconfig("hooks", "commit.auto", autohook)
+ > EOF
+ $ echo '[extensions]' >> .hg/hgrc
+ $ echo 'hookext = hookext.py' >> .hg/hgrc
+
+ $ touch foo
+ $ hg add foo
+ $ hg ci -d '0 0' -m 'add foo'
+ Automatically installed hook
+ $ echo >> foo
+ $ hg ci --debug -d '0 0' -m 'change foo'
+ foo
+ calling hook commit.auto: <function autohook at *> (glob)
+ Automatically installed hook
+ committed changeset 1:52998019f6252a2b893452765fcb0a47351a5708
+
+ $ hg showconfig hooks
+ hooks.commit.auto=<function autohook at *> (glob)
+
+test python hook configured with python:[file]:[hook] syntax
+
+ $ cd ..
+ $ mkdir d
+ $ cd d
+ $ hg init repo
+ $ mkdir hooks
+
+ $ cd hooks
+ $ cat > testhooks.py <<EOF
+ > def testhook(**args):
+ > print 'hook works'
+ > EOF
+ $ echo '[hooks]' > ../repo/.hg/hgrc
+ $ echo "pre-commit.test = python:`pwd`/testhooks.py:testhook" >> ../repo/.hg/hgrc
+
+ $ cd ../repo
+ $ hg commit -d '0 0'
+ hook works
+ nothing changed
+ [1]
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo "update.ne = python:`pwd`/nonexisting.py:testhook" >> .hg/hgrc
+ $ echo "pre-identify.npmd = python:`pwd`/:no_python_module_dir" >> .hg/hgrc
+
+ $ hg up null
+ loading update.ne hook failed:
+ abort: No such file or directory: $TESTTMP/d/repo/nonexisting.py
+ [255]
+
+ $ hg id
+ loading pre-identify.npmd hook failed:
+ abort: No module named repo!
+ [255]
+
+ $ cd ../../b
+
+make sure --traceback works on hook import failure
+
+ $ cat > importfail.py <<EOF
+ > import somebogusmodule
+ > # dereference something in the module to force demandimport to load it
+ > somebogusmodule.whatever
+ > EOF
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo 'precommit.importfail = python:importfail.whatever' >> .hg/hgrc
+
+ $ echo a >> a
+ $ hg --traceback commit -ma 2>&1 | egrep -v '^( +File| [a-zA-Z(])'
+ exception from first failed import attempt:
+ Traceback (most recent call last):
+ ImportError: No module named somebogusmodule
+ exception from second failed import attempt:
+ Traceback (most recent call last):
+ ImportError: No module named hgext_importfail
+ Traceback (most recent call last):
+ Abort: precommit.importfail hook is invalid (import of "importfail" failed)
+ abort: precommit.importfail hook is invalid (import of "importfail" failed)
+
+Issue1827: Hooks Update & Commit not completely post operation
+
+commit and update hooks should run after command completion
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo 'commit = hg id' >> .hg/hgrc
+ $ echo 'update = hg id' >> .hg/hgrc
+ $ echo bb > a
+ $ hg ci -ma
+ 223eafe2750c tip
+ $ hg up 0
+ cb9a9f314b8b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+make sure --verbose (and --quiet/--debug etc.) are propogated to the local ui
+that is passed to pre/post hooks
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo 'pre-identify = python:hooktests.verbosehook' >> .hg/hgrc
+ $ hg id
+ cb9a9f314b8b
+ $ hg id --verbose
+ calling hook pre-identify: hooktests.verbosehook
+ verbose output from hook
+ cb9a9f314b8b
+
+Ensure hooks can be prioritized
+
+ $ echo '[hooks]' > .hg/hgrc
+ $ echo 'pre-identify.a = python:hooktests.verbosehook' >> .hg/hgrc
+ $ echo 'pre-identify.b = python:hooktests.verbosehook' >> .hg/hgrc
+ $ echo 'priority.pre-identify.b = 1' >> .hg/hgrc
+ $ echo 'pre-identify.c = python:hooktests.verbosehook' >> .hg/hgrc
+ $ hg id --verbose
+ calling hook pre-identify.b: hooktests.verbosehook
+ verbose output from hook
+ calling hook pre-identify.a: hooktests.verbosehook
+ verbose output from hook
+ calling hook pre-identify.c: hooktests.verbosehook
+ verbose output from hook
+ cb9a9f314b8b
+
+new tags must be visible in pretxncommit (issue3210)
+
+ $ echo 'pretxncommit.printtags = python:hooktests.printtags' >> .hg/hgrc
+ $ hg tag -f foo
+ ['a', 'foo', 'tip']
+
+new commits must be visible in pretxnchangegroup (issue3428)
+
+ $ cd ..
+ $ hg init to
+ $ echo '[hooks]' >> to/.hg/hgrc
+ $ echo 'pretxnchangegroup = hg --traceback tip' >> to/.hg/hgrc
+ $ echo a >> to/a
+ $ hg --cwd to ci -Ama
+ adding a
+ $ hg clone to from
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo aa >> from/a
+ $ hg --cwd from ci -mb
+ $ hg --cwd from push
+ pushing to $TESTTMP/to (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ changeset: 1:9836a07b9b9d
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
diff --git a/tests/test-http-branchmap.t b/tests/test-http-branchmap.t
new file mode 100644
index 0000000..1f0b95a
--- /dev/null
+++ b/tests/test-http-branchmap.t
@@ -0,0 +1,94 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hgserve() {
+ > hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid -E errors.log -v $@
+ > cat hg.pid >> "$DAEMON_PIDS"
+ > }
+ $ hg init a
+ $ hg --encoding utf-8 -R a branch æ
+ marked working directory as branch \xc3\xa6 (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo foo > a/foo
+ $ hg -R a ci -Am foo
+ adding foo
+ $ hgserve -R a --config web.push_ssl=False --config web.allow_push=* --encoding latin1
+ listening at http://*:$HGPORT1/ (bound to 127.0.0.1:$HGPORT1) (glob)
+ $ hg --encoding utf-8 clone http://localhost:$HGPORT1 b
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch \xc3\xa6 (esc)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --encoding utf-8 -R b log
+ changeset: 0:867c11ce77b8
+ branch: \xc3\xa6 (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: foo
+
+ $ echo bar >> b/foo
+ $ hg -R b ci -m bar
+ $ hg --encoding utf-8 -R b push
+ pushing to http://localhost:$HGPORT1/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ hg -R a --encoding utf-8 log
+ changeset: 1:58e7c90d67cb
+ branch: \xc3\xa6 (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: bar
+
+ changeset: 0:867c11ce77b8
+ branch: \xc3\xa6 (esc)
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: foo
+
+ $ kill `cat hg.pid`
+
+verify 7e7d56fe4833 (encoding fallback in branchmap to maintain compatibility with 1.3.x)
+
+ $ cat <<EOF > oldhg
+ > import sys
+ > from mercurial import ui, hg, commands
+ >
+ > class StdoutWrapper(object):
+ > def __init__(self, stdout):
+ > self._file = stdout
+ >
+ > def write(self, data):
+ > if data == '47\n':
+ > # latin1 encoding is one %xx (3 bytes) shorter
+ > data = '44\n'
+ > elif data.startswith('%C3%A6 '):
+ > # translate to latin1 encoding
+ > data = '%%E6 %s' % data[7:]
+ > self._file.write(data)
+ >
+ > def __getattr__(self, name):
+ > return getattr(self._file, name)
+ >
+ > sys.stdout = StdoutWrapper(sys.stdout)
+ > sys.stderr = StdoutWrapper(sys.stderr)
+ >
+ > myui = ui.ui()
+ > repo = hg.repository(myui, 'a')
+ > commands.serve(myui, repo, stdio=True, cmdserver=False)
+ > EOF
+ $ echo baz >> b/foo
+ $ hg -R b ci -m baz
+ $ hg push -R b -e 'python oldhg' ssh://dummy/ --encoding latin1
+ pushing to ssh://dummy/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
diff --git a/tests/test-http-clone-r.t b/tests/test-http-clone-r.t
new file mode 100644
index 0000000..454fd3b
--- /dev/null
+++ b/tests/test-http-clone-r.t
@@ -0,0 +1,200 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+creating 'remote
+
+ $ hg init remote
+ $ cd remote
+ $ hg unbundle "$TESTDIR/bundles/remote.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Starting server
+
+ $ hg serve -p $HGPORT -E ../error.log -d --pid-file=../hg1.pid
+ $ cd ..
+ $ cat hg1.pid >> $DAEMON_PIDS
+
+clone remote via stream
+
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > hg clone -r "$i" http://localhost:$HGPORT/ test-"$i"
+ > if cd test-"$i"; then
+ > hg verify
+ > cd ..
+ > fi
+ > done
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 4 changesets, 4 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 4 changesets, 5 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 3 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 6 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 2 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+ $ cd test-8
+ $ hg pull ../test-7
+ pulling from ../test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 2 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ cd ..
+ $ cd test-1
+ $ hg pull -r 4 http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 2 total revisions
+ $ hg pull http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 5 changes to 4 files
+ (run 'hg update' to get a working copy)
+ $ cd ..
+ $ cd test-2
+ $ hg pull -r 5 http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 5 changesets, 3 total revisions
+ $ hg pull http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files
+ (run 'hg update' to get a working copy)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ cd ..
+ $ cat error.log
diff --git a/tests/test-http-proxy.t b/tests/test-http-proxy.t
new file mode 100644
index 0000000..a8d6890
--- /dev/null
+++ b/tests/test-http-proxy.t
@@ -0,0 +1,124 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Ama -d '1123456789 0'
+ adding a
+ $ hg --config server.uncompressed=True serve -p $HGPORT -d --pid-file=hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ cd ..
+ $ "$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log 2>&1 </dev/null &
+ $ while [ ! -f proxy.pid ]; do sleep 0; done
+ $ cat proxy.pid >> $DAEMON_PIDS
+
+url for proxy, stream
+
+ $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone --uncompressed http://localhost:$HGPORT/ b
+ streaming all changes
+ 3 files to transfer, 303 bytes of data
+ transferred * bytes in * seconds (*/sec) (glob)
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd b
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ $ cd ..
+
+url for proxy, pull
+
+ $ http_proxy=http://localhost:$HGPORT1/ hg --config http_proxy.always=True clone http://localhost:$HGPORT/ b-pull
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd b-pull
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ $ cd ..
+
+host:port for proxy
+
+ $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ c
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+proxy url with user name and password
+
+ $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ d
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+url with user name and password
+
+ $ http_proxy=http://user:passwd@localhost:$HGPORT1 hg clone --config http_proxy.always=True http://user:passwd@localhost:$HGPORT/ e
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+bad host:port for proxy
+
+ $ http_proxy=localhost:$HGPORT2 hg clone --config http_proxy.always=True http://localhost:$HGPORT/ f
+ abort: error: Connection refused
+ [255]
+
+do not use the proxy if it is in the no list
+
+ $ http_proxy=localhost:$HGPORT1 hg clone --config http_proxy.no=localhost http://localhost:$HGPORT/ g
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat proxy.log
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=stream_out HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=capabilities HTTP/1.1" - - (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=batch HTTP/1.1" - - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=getbundle HTTP/1.1" - - x-hgarg-1:common=0000000000000000000000000000000000000000&heads=83180e7845de420a1bb46896fd5fe05294f8d629 (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=phases (glob)
+ * - - [*] "GET http://localhost:$HGPORT/?cmd=listkeys HTTP/1.1" - - x-hgarg-1:namespace=bookmarks (glob)
+
diff --git a/tests/test-http.t b/tests/test-http.t
new file mode 100644
index 0000000..6c3f6b4
--- /dev/null
+++ b/tests/test-http.t
@@ -0,0 +1,207 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ echo foo>foo
+ $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
+ $ echo foo>foo.d/foo
+ $ echo bar>foo.d/bAr.hg.d/BaR
+ $ echo bar>foo.d/baR.d.hg/bAR
+ $ hg commit -A -m 1
+ adding foo
+ adding foo.d/bAr.hg.d/BaR
+ adding foo.d/baR.d.hg/bAR
+ adding foo.d/foo
+ $ hg serve -p $HGPORT -d --pid-file=../hg1.pid -E ../error.log
+ $ hg --config server.uncompressed=False serve -p $HGPORT1 -d --pid-file=../hg2.pid
+
+Test server address cannot be reused
+
+#if windows
+ $ hg serve -p $HGPORT1 2>&1
+ abort: cannot start server at ':$HGPORT1': * (glob)
+ [255]
+#else
+ $ hg serve -p $HGPORT1 2>&1
+ abort: cannot start server at ':$HGPORT1': Address already in use
+ [255]
+#endif
+ $ cd ..
+ $ cat hg1.pid hg2.pid >> $DAEMON_PIDS
+
+clone via stream
+
+ $ hg clone --uncompressed http://localhost:$HGPORT/ copy 2>&1
+ streaming all changes
+ 6 files to transfer, 606 bytes of data
+ transferred * bytes in * seconds (*/sec) (glob)
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg verify -R copy
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 1 changesets, 4 total revisions
+
+try to clone via stream, should use pull instead
+
+ $ hg clone --uncompressed http://localhost:$HGPORT1/ copy2
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 4 changes to 4 files
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+clone via pull
+
+ $ hg clone http://localhost:$HGPORT1/ copy-pull
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 4 changes to 4 files
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg verify -R copy-pull
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 1 changesets, 4 total revisions
+ $ cd test
+ $ echo bar > bar
+ $ hg commit -A -d '1 0' -m 2
+ adding bar
+ $ cd ..
+
+incoming via HTTP
+
+ $ hg clone http://localhost:$HGPORT1/ --rev 0 partial
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 4 changes to 4 files
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd partial
+ $ touch LOCAL
+ $ hg ci -qAm LOCAL
+ $ hg incoming http://localhost:$HGPORT1/ --template '{desc}\n'
+ comparing with http://localhost:$HGPORT1/
+ searching for changes
+ 2
+ $ cd ..
+
+pull
+
+ $ cd copy-pull
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup" >> .hg/hgrc
+ $ hg pull
+ pulling from http://localhost:$HGPORT1/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ changegroup hook: HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_URL=http://localhost:$HGPORT1/
+ (run 'hg update' to get a working copy)
+ $ cd ..
+
+clone from invalid URL
+
+ $ hg clone http://localhost:$HGPORT/bad
+ abort: HTTP Error 404: Not Found
+ [255]
+
+test http authentication
++ use the same server to test server side streaming preference
+
+ $ cd test
+ $ cat << EOT > userpass.py
+ > import base64
+ > from mercurial.hgweb import common
+ > def perform_authentication(hgweb, req, op):
+ > auth = req.env.get('HTTP_AUTHORIZATION')
+ > if not auth:
+ > raise common.ErrorResponse(common.HTTP_UNAUTHORIZED, 'who',
+ > [('WWW-Authenticate', 'Basic Realm="mercurial"')])
+ > if base64.b64decode(auth.split()[1]).split(':', 1) != ['user', 'pass']:
+ > raise common.ErrorResponse(common.HTTP_FORBIDDEN, 'no')
+ > def extsetup():
+ > common.permhooks.insert(0, perform_authentication)
+ > EOT
+ $ hg --config extensions.x=userpass.py serve -p $HGPORT2 -d --pid-file=pid \
+ > --config server.preferuncompressed=True
+ $ cat pid >> $DAEMON_PIDS
+
+ $ hg id http://localhost:$HGPORT2/
+ abort: http authorization required
+ [255]
+ $ hg id http://user@localhost:$HGPORT2/
+ abort: http authorization required
+ [255]
+ $ hg id http://user:pass@localhost:$HGPORT2/
+ 5fed3813f7f5
+ $ echo '[auth]' >> .hg/hgrc
+ $ echo 'l.schemes=http' >> .hg/hgrc
+ $ echo 'l.prefix=lo' >> .hg/hgrc
+ $ echo 'l.username=user' >> .hg/hgrc
+ $ echo 'l.password=pass' >> .hg/hgrc
+ $ hg id http://localhost:$HGPORT2/
+ 5fed3813f7f5
+ $ hg id http://localhost:$HGPORT2/
+ 5fed3813f7f5
+ $ hg id http://user@localhost:$HGPORT2/
+ 5fed3813f7f5
+ $ hg clone http://user:pass@localhost:$HGPORT2/ dest 2>&1
+ streaming all changes
+ 7 files to transfer, 916 bytes of data
+ transferred * bytes in * seconds (*/sec) (glob)
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg id http://user2@localhost:$HGPORT2/
+ abort: http authorization required
+ [255]
+ $ hg id http://user:pass2@localhost:$HGPORT2/
+ abort: HTTP Error 403: no
+ [255]
+
+ $ cd ..
+
+clone of serve with repo in root and unserved subrepo (issue2970)
+
+ $ hg --cwd test init sub
+ $ echo empty > test/sub/empty
+ $ hg --cwd test/sub add empty
+ $ hg --cwd test/sub commit -qm 'add empty'
+ $ hg --cwd test/sub tag -r 0 something
+ $ echo sub = sub > test/.hgsub
+ $ hg --cwd test add .hgsub
+ $ hg --cwd test commit -qm 'add subrepo'
+ $ hg clone http://localhost:$HGPORT noslash-clone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 7 changes to 7 files
+ updating to branch default
+ abort: HTTP Error 404: Not Found
+ [255]
+ $ hg clone http://localhost:$HGPORT/ slash-clone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 7 changes to 7 files
+ updating to branch default
+ abort: HTTP Error 404: Not Found
+ [255]
+
+check error log
+
+ $ cat error.log
diff --git a/tests/test-https.t b/tests/test-https.t
new file mode 100644
index 0000000..c702de8
--- /dev/null
+++ b/tests/test-https.t
@@ -0,0 +1,281 @@
+Proper https client requires the built-in ssl from Python 2.6.
+
+ $ "$TESTDIR/hghave" serve ssl || exit 80
+
+Certificates created with:
+ printf '.\n.\n.\n.\n.\nlocalhost\nhg@localhost\n' | \
+ openssl req -newkey rsa:512 -keyout priv.pem -nodes -x509 -days 9000 -out pub.pem
+Can be dumped with:
+ openssl x509 -in pub.pem -text
+
+ $ cat << EOT > priv.pem
+ > -----BEGIN PRIVATE KEY-----
+ > MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApjCWeYGrIa/Vo7LH
+ > aRF8ou0tbgHKE33Use/whCnKEUm34rDaXQd4lxxX6aDWg06n9tiVStAKTgQAHJY8
+ > j/xgSwIDAQABAkBxHC6+Qlf0VJXGlb6NL16yEVVTQxqDS6hA9zqu6TZjrr0YMfzc
+ > EGNIiZGt7HCBL0zO+cPDg/LeCZc6HQhf0KrhAiEAzlJq4hWWzvguWFIJWSoBeBUG
+ > MF1ACazQO7PYE8M0qfECIQDONHHP0SKZzz/ZwBZcAveC5K61f/v9hONFwbeYulzR
+ > +wIgc9SvbtgB/5Yzpp//4ZAEnR7oh5SClCvyB+KSx52K3nECICbhQphhoXmI10wy
+ > aMTellaq0bpNMHFDziqH9RsqAHhjAiEAgYGxfzkftt5IUUn/iFK89aaIpyrpuaAh
+ > HY8gUVkVRVs=
+ > -----END PRIVATE KEY-----
+ > EOT
+
+ $ cat << EOT > pub.pem
+ > -----BEGIN CERTIFICATE-----
+ > MIIBqzCCAVWgAwIBAgIJANAXFFyWjGnRMA0GCSqGSIb3DQEBBQUAMDExEjAQBgNV
+ > BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTEw
+ > MTAxNDIwMzAxNFoXDTM1MDYwNTIwMzAxNFowMTESMBAGA1UEAwwJbG9jYWxob3N0
+ > MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwXDANBgkqhkiG9w0BAQEFAANL
+ > ADBIAkEApjCWeYGrIa/Vo7LHaRF8ou0tbgHKE33Use/whCnKEUm34rDaXQd4lxxX
+ > 6aDWg06n9tiVStAKTgQAHJY8j/xgSwIDAQABo1AwTjAdBgNVHQ4EFgQUE6sA+amm
+ > r24dGX0kpjxOgO45hzQwHwYDVR0jBBgwFoAUE6sA+ammr24dGX0kpjxOgO45hzQw
+ > DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAFArvQFiAZJgQczRsbYlG1xl
+ > t+truk37w5B3m3Ick1ntRcQrqs+hf0CO1q6Squ144geYaQ8CDirSR92fICELI1c=
+ > -----END CERTIFICATE-----
+ > EOT
+ $ cat priv.pem pub.pem >> server.pem
+ $ PRIV=`pwd`/server.pem
+
+ $ cat << EOT > pub-other.pem
+ > -----BEGIN CERTIFICATE-----
+ > MIIBqzCCAVWgAwIBAgIJALwZS731c/ORMA0GCSqGSIb3DQEBBQUAMDExEjAQBgNV
+ > BAMMCWxvY2FsaG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTEw
+ > MTAxNDIwNDUxNloXDTM1MDYwNTIwNDUxNlowMTESMBAGA1UEAwwJbG9jYWxob3N0
+ > MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhvc3QwXDANBgkqhkiG9w0BAQEFAANL
+ > ADBIAkEAsxsapLbHrqqUKuQBxdpK4G3m2LjtyrTSdpzzzFlecxd5yhNP6AyWrufo
+ > K4VMGo2xlu9xOo88nDSUNSKPuD09MwIDAQABo1AwTjAdBgNVHQ4EFgQUoIB1iMhN
+ > y868rpQ2qk9dHnU6ebswHwYDVR0jBBgwFoAUoIB1iMhNy868rpQ2qk9dHnU6ebsw
+ > DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAJ544f125CsE7J2t55PdFaF6
+ > bBlNBb91FCywBgSjhBjf+GG3TNPwrPdc3yqeq+hzJiuInqbOBv9abmMyq8Wsoig=
+ > -----END CERTIFICATE-----
+ > EOT
+
+pub.pem patched with other notBefore / notAfter:
+
+ $ cat << EOT > pub-not-yet.pem
+ > -----BEGIN CERTIFICATE-----
+ > MIIBqzCCAVWgAwIBAgIJANAXFFyWjGnRMA0GCSqGSIb3DQEBBQUAMDExEjAQBgNVBAMMCWxvY2Fs
+ > aG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTM1MDYwNTIwMzAxNFoXDTM1MDYw
+ > NTIwMzAxNFowMTESMBAGA1UEAwwJbG9jYWxob3N0MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhv
+ > c3QwXDANBgkqhkiG9w0BAQEFAANLADBIAkEApjCWeYGrIa/Vo7LHaRF8ou0tbgHKE33Use/whCnK
+ > EUm34rDaXQd4lxxX6aDWg06n9tiVStAKTgQAHJY8j/xgSwIDAQABo1AwTjAdBgNVHQ4EFgQUE6sA
+ > +ammr24dGX0kpjxOgO45hzQwHwYDVR0jBBgwFoAUE6sA+ammr24dGX0kpjxOgO45hzQwDAYDVR0T
+ > BAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAJXV41gWnkgC7jcpPpFRSUSZaxyzrXmD1CIqQf0WgVDb
+ > /12E0vR2DuZitgzUYtBaofM81aTtc0a2/YsrmqePGm0=
+ > -----END CERTIFICATE-----
+ > EOT
+ $ cat priv.pem pub-not-yet.pem > server-not-yet.pem
+
+ $ cat << EOT > pub-expired.pem
+ > -----BEGIN CERTIFICATE-----
+ > MIIBqzCCAVWgAwIBAgIJANAXFFyWjGnRMA0GCSqGSIb3DQEBBQUAMDExEjAQBgNVBAMMCWxvY2Fs
+ > aG9zdDEbMBkGCSqGSIb3DQEJARYMaGdAbG9jYWxob3N0MB4XDTEwMTAxNDIwMzAxNFoXDTEwMTAx
+ > NDIwMzAxNFowMTESMBAGA1UEAwwJbG9jYWxob3N0MRswGQYJKoZIhvcNAQkBFgxoZ0Bsb2NhbGhv
+ > c3QwXDANBgkqhkiG9w0BAQEFAANLADBIAkEApjCWeYGrIa/Vo7LHaRF8ou0tbgHKE33Use/whCnK
+ > EUm34rDaXQd4lxxX6aDWg06n9tiVStAKTgQAHJY8j/xgSwIDAQABo1AwTjAdBgNVHQ4EFgQUE6sA
+ > +ammr24dGX0kpjxOgO45hzQwHwYDVR0jBBgwFoAUE6sA+ammr24dGX0kpjxOgO45hzQwDAYDVR0T
+ > BAUwAwEB/zANBgkqhkiG9w0BAQUFAANBAJfk57DTRf2nUbYaMSlVAARxMNbFGOjQhAUtY400GhKt
+ > 2uiKCNGKXVXD3AHWe13yHc5KttzbHQStE5Nm/DlWBWQ=
+ > -----END CERTIFICATE-----
+ > EOT
+ $ cat priv.pem pub-expired.pem > server-expired.pem
+
+ $ hg init test
+ $ cd test
+ $ echo foo>foo
+ $ mkdir foo.d foo.d/bAr.hg.d foo.d/baR.d.hg
+ $ echo foo>foo.d/foo
+ $ echo bar>foo.d/bAr.hg.d/BaR
+ $ echo bar>foo.d/baR.d.hg/bAR
+ $ hg commit -A -m 1
+ adding foo
+ adding foo.d/bAr.hg.d/BaR
+ adding foo.d/baR.d.hg/bAR
+ adding foo.d/foo
+ $ hg serve -p $HGPORT -d --pid-file=../hg0.pid --certificate=$PRIV
+ $ cat ../hg0.pid >> $DAEMON_PIDS
+
+cacert not found
+
+ $ hg in --config web.cacerts=no-such.pem https://localhost:$HGPORT/
+ abort: could not find web.cacerts: no-such.pem
+ [255]
+
+Test server address cannot be reused
+
+#if windows
+ $ hg serve -p $HGPORT --certificate=$PRIV 2>&1
+ abort: cannot start server at ':$HGPORT': (glob)
+ [255]
+#else
+ $ hg serve -p $HGPORT --certificate=$PRIV 2>&1
+ abort: cannot start server at ':$HGPORT': Address already in use
+ [255]
+#endif
+ $ cd ..
+
+clone via pull
+
+ $ hg clone https://localhost:$HGPORT/ copy-pull
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 4 changes to 4 files
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg verify -R copy-pull
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 1 changesets, 4 total revisions
+ $ cd test
+ $ echo bar > bar
+ $ hg commit -A -d '1 0' -m 2
+ adding bar
+ $ cd ..
+
+pull without cacert
+
+ $ cd copy-pull
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup" >> .hg/hgrc
+ $ hg pull
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ changegroup hook: HG_NODE=5fed3813f7f5e1824344fdc9cf8f63bb662c292d HG_SOURCE=pull HG_URL=https://localhost:$HGPORT/
+ (run 'hg update' to get a working copy)
+ $ cd ..
+
+cacert configured in local repo
+
+ $ cp copy-pull/.hg/hgrc copy-pull/.hg/hgrc.bu
+ $ echo "[web]" >> copy-pull/.hg/hgrc
+ $ echo "cacerts=`pwd`/pub.pem" >> copy-pull/.hg/hgrc
+ $ hg -R copy-pull pull --traceback
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ mv copy-pull/.hg/hgrc.bu copy-pull/.hg/hgrc
+
+cacert configured globally, also testing expansion of environment
+variables in the filename
+
+ $ echo "[web]" >> $HGRCPATH
+ $ echo 'cacerts=$P/pub.pem' >> $HGRCPATH
+ $ P=`pwd` hg -R copy-pull pull
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ P=`pwd` hg -R copy-pull pull --insecure
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+cacert mismatch
+
+ $ hg -R copy-pull pull --config web.cacerts=pub.pem https://127.0.0.1:$HGPORT/
+ abort: 127.0.0.1 certificate error: certificate is for localhost
+ (configure hostfingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca or use --insecure to connect insecurely)
+ [255]
+ $ hg -R copy-pull pull --config web.cacerts=pub.pem https://127.0.0.1:$HGPORT/ --insecure
+ warning: 127.0.0.1 certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ pulling from https://127.0.0.1:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg -R copy-pull pull --config web.cacerts=pub-other.pem
+ abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob)
+ [255]
+ $ hg -R copy-pull pull --config web.cacerts=pub-other.pem --insecure
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+Test server cert which isn't valid yet
+
+ $ hg -R test serve -p $HGPORT1 -d --pid-file=hg1.pid --certificate=server-not-yet.pem
+ $ cat hg1.pid >> $DAEMON_PIDS
+ $ hg -R copy-pull pull --config web.cacerts=pub-not-yet.pem https://localhost:$HGPORT1/
+ abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob)
+ [255]
+
+Test server cert which no longer is valid
+
+ $ hg -R test serve -p $HGPORT2 -d --pid-file=hg2.pid --certificate=server-expired.pem
+ $ cat hg2.pid >> $DAEMON_PIDS
+ $ hg -R copy-pull pull --config web.cacerts=pub-expired.pem https://localhost:$HGPORT2/
+ abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob)
+ [255]
+
+Fingerprints
+
+ $ echo "[hostfingerprints]" >> copy-pull/.hg/hgrc
+ $ echo "localhost = 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca" >> copy-pull/.hg/hgrc
+ $ echo "127.0.0.1 = 914f1aff87249c09b6859b88b1906d30756491ca" >> copy-pull/.hg/hgrc
+
+- works without cacerts
+ $ hg -R copy-pull id https://localhost:$HGPORT/ --config web.cacerts=
+ 5fed3813f7f5
+
+- fails when cert doesn't match hostname (port is ignored)
+ $ hg -R copy-pull id https://localhost:$HGPORT1/
+ abort: certificate for localhost has unexpected fingerprint 28:ff:71:bf:65:31:14:23:ad:62:92:b4:0e:31:99:18:fc:83:e3:9b
+ (check hostfingerprint configuration)
+ [255]
+
+- ignores that certificate doesn't match hostname
+ $ hg -R copy-pull id https://127.0.0.1:$HGPORT/
+ 5fed3813f7f5
+
+ $ while kill `cat hg1.pid` 2>/dev/null; do sleep 0; done
+
+Prepare for connecting through proxy
+
+ $ "$TESTDIR/tinyproxy.py" $HGPORT1 localhost >proxy.log </dev/null 2>&1 &
+ $ while [ ! -f proxy.pid ]; do sleep 0; done
+ $ cat proxy.pid >> $DAEMON_PIDS
+
+ $ echo "[http_proxy]" >> copy-pull/.hg/hgrc
+ $ echo "always=True" >> copy-pull/.hg/hgrc
+ $ echo "[hostfingerprints]" >> copy-pull/.hg/hgrc
+ $ echo "localhost =" >> copy-pull/.hg/hgrc
+
+Test unvalidated https through proxy
+
+ $ http_proxy=http://localhost:$HGPORT1/ hg -R copy-pull pull --insecure --traceback
+ warning: localhost certificate with fingerprint 91:4f:1a:ff:87:24:9c:09:b6:85:9b:88:b1:90:6d:30:75:64:91:ca not verified (check hostfingerprints or web.cacerts config setting)
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+Test https with cacert and fingerprint through proxy
+
+ $ http_proxy=http://localhost:$HGPORT1/ hg -R copy-pull pull --config web.cacerts=pub.pem
+ pulling from https://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ http_proxy=http://localhost:$HGPORT1/ hg -R copy-pull pull https://127.0.0.1:$HGPORT/
+ pulling from https://127.0.0.1:$HGPORT/
+ searching for changes
+ no changes found
+
+Test https with cert problems through proxy
+
+ $ http_proxy=http://localhost:$HGPORT1/ hg -R copy-pull pull --config web.cacerts=pub-other.pem
+ abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob)
+ [255]
+ $ http_proxy=http://localhost:$HGPORT1/ hg -R copy-pull pull --config web.cacerts=pub-expired.pem https://localhost:$HGPORT2/
+ abort: error: *:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed (glob)
+ [255]
diff --git a/tests/test-hup.t b/tests/test-hup.t
new file mode 100644
index 0000000..9745643
--- /dev/null
+++ b/tests/test-hup.t
@@ -0,0 +1,28 @@
+Test hangup signal in the middle of transaction
+
+ $ "$TESTDIR/hghave" serve fifo || exit 80
+ $ hg init
+ $ mkfifo p
+ $ hg serve --stdio < p 1>out 2>&1 &
+ $ P=$!
+
+Do test while holding fifo open
+
+ $ (
+ > echo lock
+ > echo addchangegroup
+ > while [ ! -s .hg/store/journal ]; do sleep 0; done
+ > kill -HUP $P
+ > ) > p
+
+ $ wait
+ $ cat out
+ 0
+ 0
+ adding changesets
+ transaction abort!
+ rollback completed
+ killed!
+
+ $ echo .hg/* .hg/store/*
+ .hg/00changelog.i .hg/journal.bookmarks .hg/journal.branch .hg/journal.desc .hg/journal.dirstate .hg/requires .hg/store .hg/store/00changelog.i .hg/store/00changelog.i.a .hg/store/journal.phaseroots
diff --git a/tests/test-hybridencode.py b/tests/test-hybridencode.py
new file mode 100644
index 0000000..e727276
--- /dev/null
+++ b/tests/test-hybridencode.py
@@ -0,0 +1,27 @@
+from mercurial import store
+
+auxencode = lambda f: store._auxencode(f, True)
+hybridencode = lambda f: store._hybridencode(f, auxencode)
+
+enc = hybridencode # used for 'dotencode' repo format
+
+def show(s):
+ print "A = '%s'" % s
+ print "B = '%s'" % enc(s)
+ print
+
+show('data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i')
+
+show('data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/'
+ 'TENTH/ELEVENTH/LOREMIPSUM.TXT.i')
+show('data/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/'
+ 'wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules'
+ '.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider.i')
+show('data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-QUICK-'
+ 'BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i')
+show('data/Project Planning/Resources/AnotherLongDirectoryName/'
+ 'Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt')
+show('data/Project.Planning/Resources/AnotherLongDirectoryName/'
+ 'Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt')
+show('data/foo.../foo / /a./_. /__/.x../ bla/.FOO/something.i')
+
diff --git a/tests/test-hybridencode.py.out b/tests/test-hybridencode.py.out
new file mode 100644
index 0000000..0c4dd9a
--- /dev/null
+++ b/tests/test-hybridencode.py.out
@@ -0,0 +1,21 @@
+A = 'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i'
+B = 'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3/nu~6c/coma/foo._n_u_l/normal.c.i'
+
+A = 'data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/TENTH/ELEVENTH/LOREMIPSUM.TXT.i'
+B = 'dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i'
+
+A = 'data/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider.i'
+B = 'dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i'
+
+A = 'data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-QUICK-BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i'
+B = 'dh/au~78.the-quick-brown-fox-ju~3amps-over-the-lazy-dog-the-quick-brown-fox-jud4dcadd033000ab2b26eb66bae1906bcb15d4a70.i'
+
+A = 'data/Project Planning/Resources/AnotherLongDirectoryName/Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'
+B = 'dh/project_/resource/anotherl/followed/andanoth/andthenanextremelylongfilenaf93030515d9849cfdca52937c2204d19f83913e5.txt'
+
+A = 'data/Project.Planning/Resources/AnotherLongDirectoryName/Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'
+B = 'dh/project_/resource/anotherl/followed/andanoth/andthenanextremelylongfilena0fd7c506f5c9d58204444fc67e9499006bd2d445.txt'
+
+A = 'data/foo.../foo / /a./_. /__/.x../ bla/.FOO/something.i'
+B = 'data/foo..~2e/foo ~20/~20/a~2e/__.~20/____/~2ex.~2e/~20 bla/~2e_f_o_o/something.i'
+
diff --git a/tests/test-i18n.t b/tests/test-i18n.t
new file mode 100644
index 0000000..ec90fd0
--- /dev/null
+++ b/tests/test-i18n.t
@@ -0,0 +1,40 @@
+Translations are optional:
+
+ $ "$TESTDIR/hghave" gettext || exit 80
+
+#if no-outer-repo
+
+Test that translations are compiled and installed correctly.
+
+Default encoding in tests is "ascii" and the translation is encoded
+using the "replace" error handler:
+
+ $ LANGUAGE=pt_BR hg tip
+ abortado: n?o foi encontrado um reposit?rio em '$TESTTMP' (.hg n?o encontrado)!
+ [255]
+
+Using a more accomodating encoding:
+
+ $ HGENCODING=UTF-8 LANGUAGE=pt_BR hg tip
+ abortado: n\xc3\xa3o foi encontrado um reposit\xc3\xb3rio em '$TESTTMP' (.hg n\xc3\xa3o encontrado)! (esc)
+ [255]
+
+Different encoding:
+
+ $ HGENCODING=Latin-1 LANGUAGE=pt_BR hg tip
+ abortado: n\xe3o foi encontrado um reposit\xf3rio em '$TESTTMP' (.hg n\xe3o encontrado)! (esc)
+ [255]
+
+#endif
+
+Test keyword search in translated help text:
+
+ $ HGENCODING=UTF-8 LANGUAGE=de hg help -k blättern
+ Topics:
+
+ extensions Benutzung erweiterter Funktionen
+
+ Erweiterungen:
+
+ pager Verwendet einen externen Pager zum Bl\xc3\xa4ttern in der Ausgabe von Befehlen (esc)
+
diff --git a/tests/test-identify.t b/tests/test-identify.t
new file mode 100644
index 0000000..823badb
--- /dev/null
+++ b/tests/test-identify.t
@@ -0,0 +1,124 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+#if no-outer-repo
+
+no repo
+
+ $ hg id
+ abort: there is no Mercurial repository here (.hg not found)
+ [255]
+
+#endif
+
+create repo
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+basic id usage
+
+ $ hg id
+ cb9a9f314b8b tip
+ $ hg id --debug
+ cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b tip
+ $ hg id -q
+ cb9a9f314b8b
+ $ hg id -v
+ cb9a9f314b8b tip
+
+with options
+
+ $ hg id -r.
+ cb9a9f314b8b tip
+ $ hg id -n
+ 0
+ $ hg id -t
+ tip
+ $ hg id -b
+ default
+ $ hg id -i
+ cb9a9f314b8b
+ $ hg id -n -t -b -i
+ cb9a9f314b8b 0 default tip
+
+with modifications
+
+ $ echo b > a
+ $ hg id -n -t -b -i
+ cb9a9f314b8b+ 0+ default tip
+
+other local repo
+
+ $ cd ..
+ $ hg -R test id
+ cb9a9f314b8b+ tip
+#if no-outer-repo
+ $ hg id test
+ cb9a9f314b8b+ tip
+#endif
+
+with remote http repo
+
+ $ cd test
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg id http://localhost:$HGPORT1/
+ cb9a9f314b8b
+
+remote with rev number?
+
+ $ hg id -n http://localhost:$HGPORT1/
+ abort: can't query remote revision number, branch, or tags
+ [255]
+
+remote with tags?
+
+ $ hg id -t http://localhost:$HGPORT1/
+ abort: can't query remote revision number, branch, or tags
+ [255]
+
+remote with branch?
+
+ $ hg id -b http://localhost:$HGPORT1/
+ abort: can't query remote revision number, branch, or tags
+ [255]
+
+test bookmark support
+
+ $ hg bookmark Y
+ $ hg bookmark Z
+ $ hg bookmarks
+ Y 0:cb9a9f314b8b
+ * Z 0:cb9a9f314b8b
+ $ hg id
+ cb9a9f314b8b+ tip Y/Z
+ $ hg id --bookmarks
+ Y Z
+
+test remote identify with bookmarks
+
+ $ hg id http://localhost:$HGPORT1/
+ cb9a9f314b8b Y/Z
+ $ hg id --bookmarks http://localhost:$HGPORT1/
+ Y Z
+ $ hg id -r . http://localhost:$HGPORT1/
+ cb9a9f314b8b Y/Z
+ $ hg id --bookmarks -r . http://localhost:$HGPORT1/
+ Y Z
+
+Make sure we do not obscure unknown requires file entries (issue2649)
+
+ $ echo fake >> .hg/requires
+ $ hg id
+ abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
+ [255]
+
+ $ cd ..
+#if no-outer-repo
+ $ hg id test
+ abort: unknown repository format: requires features 'fake' (upgrade Mercurial)!
+ [255]
+#endif
diff --git a/tests/test-impexp-branch.t b/tests/test-impexp-branch.t
new file mode 100644
index 0000000..c089a46
--- /dev/null
+++ b/tests/test-impexp-branch.t
@@ -0,0 +1,73 @@
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'mq =' >> $HGRCPATH
+
+ $ cat >findbranch.py <<EOF
+ > import re, sys
+ >
+ > head_re = re.compile('^#(?:(?:\\s+([A-Za-z][A-Za-z0-9_]*)(?:\\s.*)?)|(?:\\s*))$')
+ >
+ > for line in sys.stdin:
+ > hmatch = head_re.match(line)
+ > if not hmatch:
+ > sys.exit(1)
+ > if hmatch.group(1) == 'Branch':
+ > sys.exit(0)
+ > sys.exit(1)
+ > EOF
+
+ $ hg init a
+ $ cd a
+ $ echo "Rev 1" >rev
+ $ hg add rev
+ $ hg commit -m "No branch."
+ $ hg branch abranch
+ marked working directory as branch abranch
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo "Rev 2" >rev
+ $ hg commit -m "With branch."
+
+ $ hg export 0 > ../r0.patch
+ $ hg export 1 > ../r1.patch
+ $ cd ..
+
+ $ if python findbranch.py < r0.patch; then
+ > echo "Export of default branch revision has Branch header" 1>&2
+ > exit 1
+ > fi
+
+ $ if python findbranch.py < r1.patch; then
+ > : # Do nothing
+ > else
+ > echo "Export of branch revision is missing Branch header" 1>&2
+ > exit 1
+ > fi
+
+Make sure import still works with branch information in patches.
+
+ $ hg init b
+ $ cd b
+ $ hg import ../r0.patch
+ applying ../r0.patch
+ $ hg import ../r1.patch
+ applying ../r1.patch
+ $ cd ..
+
+ $ hg init c
+ $ cd c
+ $ hg import --exact ../r0.patch
+ applying ../r0.patch
+ $ hg import --exact ../r1.patch
+ applying ../r1.patch
+
+Test --exact and patch header separators (issue3356)
+
+ $ hg strip --no-backup .
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ >>> import re
+ >>> p = file('../r1.patch', 'rb').read()
+ >>> p = re.sub(r'Parent\s+', 'Parent ', p)
+ >>> file('../r1-ws.patch', 'wb').write(p)
+ $ hg import --exact ../r1-ws.patch
+ applying ../r1-ws.patch
+
+ $ cd ..
diff --git a/tests/test-import-bypass.t b/tests/test-import-bypass.t
new file mode 100644
index 0000000..bbee13b
--- /dev/null
+++ b/tests/test-import-bypass.t
@@ -0,0 +1,270 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "purge=" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+ $ shortlog() {
+ > hg glog --template '{rev}:{node|short} {author} {date|hgdate} - {branch} - {desc|firstline}\n'
+ > }
+
+Test --bypass with other options
+
+ $ hg init repo-options
+ $ cd repo-options
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo a >> a
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Am changea
+ $ hg export . > ../test.diff
+ $ hg up null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Test importing an existing revision
+
+ $ hg import --bypass --exact ../test.diff
+ applying ../test.diff
+ $ shortlog
+ o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |
+ o 0:07f494440405 test 0 0 - default - adda
+
+
+Test failure without --exact
+
+ $ hg import --bypass ../test.diff
+ applying ../test.diff
+ unable to find 'a' for patching
+ abort: patch failed to apply
+ [255]
+ $ hg st
+ $ shortlog
+ o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |
+ o 0:07f494440405 test 0 0 - default - adda
+
+
+Test --user, --date and --message
+
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import --bypass --u test2 -d '1 0' -m patch2 ../test.diff
+ applying ../test.diff
+ $ cat .hg/last-message.txt
+ patch2 (no-eol)
+ $ shortlog
+ o 2:2e127d1da504 test2 1 0 - default - patch2
+ |
+ | o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |/
+ @ 0:07f494440405 test 0 0 - default - adda
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo import)
+
+Test --import-branch
+
+ $ hg import --bypass --import-branch ../test.diff
+ applying ../test.diff
+ $ shortlog
+ o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |
+ @ 0:07f494440405 test 0 0 - default - adda
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo import)
+
+Test --strip
+
+ $ hg import --bypass --strip 0 - <<EOF
+ > # HG changeset patch
+ > # User test
+ > # Date 0 0
+ > # Branch foo
+ > # Node ID 4e322f7ce8e3e4203950eac9ece27bf7e45ffa6c
+ > # Parent 07f4944404050f47db2e5c5071e0e84e7a27bba9
+ > changea
+ >
+ > diff -r 07f494440405 -r 4e322f7ce8e3 a
+ > --- a Thu Jan 01 00:00:00 1970 +0000
+ > +++ a Thu Jan 01 00:00:00 1970 +0000
+ > @@ -1,1 +1,2 @@
+ > a
+ > +a
+ > EOF
+ applying patch from stdin
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo import)
+
+Test unsupported combinations
+
+ $ hg import --bypass --no-commit ../test.diff
+ abort: cannot use --no-commit with --bypass
+ [255]
+ $ hg import --bypass --similarity 50 ../test.diff
+ abort: cannot use --similarity with --bypass
+ [255]
+
+Test commit editor
+
+ $ cat > ../test.diff <<EOF
+ > diff -r 07f494440405 -r 4e322f7ce8e3 a
+ > --- a/a Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ > @@ -1,1 +1,2 @@
+ > -a
+ > +b
+ > +c
+ > EOF
+ $ HGEDITOR=cat hg import --bypass ../test.diff
+ applying ../test.diff
+
+
+ HG: Enter commit message. Lines beginning with 'HG:' are removed.
+ HG: Leave message empty to abort commit.
+ HG: --
+ HG: user: test
+ HG: branch 'default'
+ HG: changed a
+ abort: empty commit message
+ [255]
+
+Test patch.eol is handled
+
+ $ python -c 'file("a", "wb").write("a\r\n")'
+ $ hg ci -m makeacrlf
+ $ hg import -m 'should fail because of eol' --bypass ../test.diff
+ applying ../test.diff
+ patching file a
+ Hunk #1 FAILED at 0
+ abort: patch failed to apply
+ [255]
+ $ hg --config patch.eol=auto import -d '0 0' -m 'test patch.eol' --bypass ../test.diff
+ applying ../test.diff
+ $ shortlog
+ o 3:c606edafba99 test 0 0 - default - test patch.eol
+ |
+ @ 2:872023de769d test 0 0 - default - makeacrlf
+ |
+ | o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |/
+ o 0:07f494440405 test 0 0 - default - adda
+
+
+Test applying multiple patches
+
+ $ hg up -qC 0
+ $ echo e > e
+ $ hg ci -Am adde
+ adding e
+ created new head
+ $ hg export . > ../patch1.diff
+ $ hg up -qC 1
+ $ echo f > f
+ $ hg ci -Am addf
+ adding f
+ $ hg export . > ../patch2.diff
+ $ cd ..
+ $ hg clone -r1 repo-options repo-multi1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo-multi1
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import --bypass ../patch1.diff ../patch2.diff
+ applying ../patch1.diff
+ applying ../patch2.diff
+ $ shortlog
+ o 3:bc8ca3f8a7c4 test 0 0 - default - addf
+ |
+ o 2:16581080145e test 0 0 - default - adde
+ |
+ | o 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |/
+ @ 0:07f494440405 test 0 0 - default - adda
+
+
+Test applying multiple patches with --exact
+
+ $ cd ..
+ $ hg clone -r1 repo-options repo-multi2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo-multi2
+ $ hg import --bypass --exact ../patch1.diff ../patch2.diff
+ applying ../patch1.diff
+ applying ../patch2.diff
+ $ shortlog
+ o 3:d60cb8989666 test 0 0 - foo - addf
+ |
+ | o 2:16581080145e test 0 0 - default - adde
+ | |
+ @ | 1:4e322f7ce8e3 test 0 0 - foo - changea
+ |/
+ o 0:07f494440405 test 0 0 - default - adda
+
+
+ $ cd ..
+
+#if symlink execbit
+
+Test complicated patch with --exact
+
+ $ hg init repo-exact
+ $ cd repo-exact
+ $ echo a > a
+ $ echo c > c
+ $ echo d > d
+ $ echo e > e
+ $ echo f > f
+ $ chmod +x f
+ $ ln -s c linkc
+ $ hg ci -Am t
+ adding a
+ adding c
+ adding d
+ adding e
+ adding f
+ adding linkc
+ $ hg cp a aa1
+ $ echo b >> a
+ $ echo b > b
+ $ hg add b
+ $ hg cp a aa2
+ $ echo aa >> aa2
+ $ chmod +x e
+ $ chmod -x f
+ $ ln -s a linka
+ $ hg rm d
+ $ hg rm linkc
+ $ hg mv c cc
+ $ hg ci -m patch
+ $ hg export --git . > ../test.diff
+ $ hg up -C null
+ 0 files updated, 0 files merged, 7 files removed, 0 files unresolved
+ $ hg purge
+ $ hg st
+ $ hg import --bypass --exact ../test.diff
+ applying ../test.diff
+
+The patch should have matched the exported revision and generated no additional
+data. If not, diff both heads to debug it.
+
+ $ shortlog
+ o 1:2978fd5c8aa4 test 0 0 - default - patch
+ |
+ o 0:a0e19e636a43 test 0 0 - default - t
+
+#endif
+
+ $ cd ..
diff --git a/tests/test-import-context.t b/tests/test-import-context.t
new file mode 100644
index 0000000..848cd41
--- /dev/null
+++ b/tests/test-import-context.t
@@ -0,0 +1,126 @@
+Test applying context diffs
+
+ $ cat > writepatterns.py <<EOF
+ > import sys
+ >
+ > path = sys.argv[1]
+ > lasteol = sys.argv[2] == '1'
+ > patterns = sys.argv[3:]
+ >
+ > fp = file(path, 'wb')
+ > for i, pattern in enumerate(patterns):
+ > count = int(pattern[0:-1])
+ > char = pattern[-1] + '\n'
+ > if not lasteol and i == len(patterns) - 1:
+ > fp.write((char*count)[:-1])
+ > else:
+ > fp.write(char*count)
+ > fp.close()
+ > EOF
+ $ cat > cat.py <<EOF
+ > import sys
+ > sys.stdout.write(repr(file(sys.argv[1], 'rb').read()) + '\n')
+ > EOF
+
+Initialize the test repository
+
+ $ hg init repo
+ $ cd repo
+ $ python ../writepatterns.py a 0 5A 1B 5C 1D
+ $ python ../writepatterns.py b 1 1A 1B
+ $ python ../writepatterns.py c 1 5A
+ $ python ../writepatterns.py d 1 5A 1B
+ $ hg add
+ adding a
+ adding b
+ adding c
+ adding d
+ $ hg ci -m addfiles
+
+Add file, missing a last end of line
+
+ $ hg import --no-commit - <<EOF
+ > *** /dev/null 2010-10-16 18:05:49.000000000 +0200
+ > --- b/newnoeol 2010-10-16 18:23:26.000000000 +0200
+ > ***************
+ > *** 0 ****
+ > --- 1,2 ----
+ > + a
+ > + b
+ > \ No newline at end of file
+ > *** a/a Sat Oct 16 16:35:51 2010
+ > --- b/a Sat Oct 16 16:35:51 2010
+ > ***************
+ > *** 3,12 ****
+ > A
+ > A
+ > A
+ > ! B
+ > C
+ > C
+ > C
+ > C
+ > C
+ > ! D
+ > \ No newline at end of file
+ > --- 3,13 ----
+ > A
+ > A
+ > A
+ > ! E
+ > C
+ > C
+ > C
+ > C
+ > C
+ > ! F
+ > ! F
+ >
+ > *** a/b 2010-10-16 18:40:38.000000000 +0200
+ > --- /dev/null 2010-10-16 18:05:49.000000000 +0200
+ > ***************
+ > *** 1,2 ****
+ > - A
+ > - B
+ > --- 0 ----
+ > *** a/c Sat Oct 16 21:34:26 2010
+ > --- b/c Sat Oct 16 21:34:27 2010
+ > ***************
+ > *** 3,5 ****
+ > --- 3,7 ----
+ > A
+ > A
+ > A
+ > + B
+ > + B
+ > *** a/d Sat Oct 16 21:47:20 2010
+ > --- b/d Sat Oct 16 21:47:22 2010
+ > ***************
+ > *** 2,6 ****
+ > A
+ > A
+ > A
+ > - A
+ > - B
+ > --- 2,4 ----
+ > EOF
+ applying patch from stdin
+ $ hg st
+ M a
+ M c
+ M d
+ A newnoeol
+ R b
+
+What's in a
+
+ $ python ../cat.py a
+ 'A\nA\nA\nA\nA\nE\nC\nC\nC\nC\nC\nF\nF\n'
+ $ python ../cat.py newnoeol
+ 'a\nb'
+ $ python ../cat.py c
+ 'A\nA\nA\nA\nA\nB\nB\n'
+ $ python ../cat.py d
+ 'A\nA\nA\nA\n'
+
+ $ cd ..
diff --git a/tests/test-import-eol.t b/tests/test-import-eol.t
new file mode 100644
index 0000000..dd2a69f
--- /dev/null
+++ b/tests/test-import-eol.t
@@ -0,0 +1,146 @@
+ $ cat > makepatch.py <<EOF
+ > f = file('eol.diff', 'wb')
+ > w = f.write
+ > w('test message\n')
+ > w('diff --git a/a b/a\n')
+ > w('--- a/a\n')
+ > w('+++ b/a\n')
+ > w('@@ -1,5 +1,5 @@\n')
+ > w(' a\n')
+ > w('-bbb\r\n')
+ > w('+yyyy\r\n')
+ > w(' cc\r\n')
+ > w(' \n')
+ > w(' d\n')
+ > w('-e\n')
+ > w('\ No newline at end of file\n')
+ > w('+z\r\n')
+ > w('\ No newline at end of file\r\n')
+ > EOF
+
+ $ hg init repo
+ $ cd repo
+ $ echo '\.diff' > .hgignore
+
+
+Test different --eol values
+
+ $ python -c 'file("a", "wb").write("a\nbbb\ncc\n\nd\ne")'
+ $ hg ci -Am adda
+ adding .hgignore
+ adding a
+ $ python ../makepatch.py
+
+
+invalid eol
+
+ $ hg --config patch.eol='LFCR' import eol.diff
+ applying eol.diff
+ abort: unsupported line endings type: LFCR
+ [255]
+ $ hg revert -a
+
+
+force LF
+
+ $ hg --traceback --config patch.eol='LF' import eol.diff
+ applying eol.diff
+ $ cat a
+ a
+ yyyy
+ cc
+
+ d
+ e (no-eol)
+ $ hg st
+
+
+force CRLF
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --traceback --config patch.eol='CRLF' import eol.diff
+ applying eol.diff
+ $ cat a
+ a\r (esc)
+ yyyy\r (esc)
+ cc\r (esc)
+ \r (esc)
+ d\r (esc)
+ e (no-eol)
+ $ hg st
+
+
+auto EOL on LF file
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --traceback --config patch.eol='auto' import eol.diff
+ applying eol.diff
+ $ cat a
+ a
+ yyyy
+ cc
+
+ d
+ e (no-eol)
+ $ hg st
+
+
+auto EOL on CRLF file
+
+ $ python -c 'file("a", "wb").write("a\r\nbbb\r\ncc\r\n\r\nd\r\ne")'
+ $ hg commit -m 'switch EOLs in a'
+ $ hg --traceback --config patch.eol='auto' import eol.diff
+ applying eol.diff
+ $ cat a
+ a\r (esc)
+ yyyy\r (esc)
+ cc\r (esc)
+ \r (esc)
+ d\r (esc)
+ e (no-eol)
+ $ hg st
+
+
+auto EOL on new file or source without any EOL
+
+ $ python -c 'file("noeol", "wb").write("noeol")'
+ $ hg add noeol
+ $ hg commit -m 'add noeol'
+ $ python -c 'file("noeol", "wb").write("noeol\r\nnoeol\n")'
+ $ python -c 'file("neweol", "wb").write("neweol\nneweol\r\n")'
+ $ hg add neweol
+ $ hg diff --git > noeol.diff
+ $ hg revert --no-backup noeol neweol
+ $ rm neweol
+ $ hg --traceback --config patch.eol='auto' import -m noeol noeol.diff
+ applying noeol.diff
+ $ cat noeol
+ noeol\r (esc)
+ noeol
+ $ cat neweol
+ neweol
+ neweol\r (esc)
+ $ hg st
+
+
+Test --eol and binary patches
+
+ $ python -c 'file("b", "wb").write("a\x00\nb\r\nd")'
+ $ hg ci -Am addb
+ adding b
+ $ python -c 'file("b", "wb").write("a\x00\nc\r\nd")'
+ $ hg diff --git > bin.diff
+ $ hg revert --no-backup b
+
+binary patch with --eol
+
+ $ hg import --config patch.eol='CRLF' -m changeb bin.diff
+ applying bin.diff
+ $ cat b
+ a\x00 (esc)
+ c\r (esc)
+ d (no-eol)
+ $ hg st
+ $ cd ..
diff --git a/tests/test-import-git.t b/tests/test-import-git.t
new file mode 100644
index 0000000..caba23b
--- /dev/null
+++ b/tests/test-import-git.t
@@ -0,0 +1,611 @@
+ $ hg init repo
+ $ cd repo
+
+New file:
+
+ $ hg import -d "1000000 0" -mnew - <<EOF
+ > diff --git a/new b/new
+ > new file mode 100644
+ > index 0000000..7898192
+ > --- /dev/null
+ > +++ b/new
+ > @@ -0,0 +1 @@
+ > +a
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 0:ae3ee40d2079
+
+New empty file:
+
+ $ hg import -d "1000000 0" -mempty - <<EOF
+ > diff --git a/empty b/empty
+ > new file mode 100644
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 1:ab199dc869b5
+
+ $ hg locate empty
+ empty
+
+chmod +x:
+
+ $ hg import -d "1000000 0" -msetx - <<EOF
+ > diff --git a/new b/new
+ > old mode 100644
+ > new mode 100755
+ > EOF
+ applying patch from stdin
+
+#if execbit
+ $ hg tip -q
+ 2:3a34410f282e
+ $ test -x new
+ $ hg rollback -q
+#else
+ $ hg tip -q
+ 1:ab199dc869b5
+#endif
+
+Copy and removing x bit:
+
+ $ hg import -f -d "1000000 0" -mcopy - <<EOF
+ > diff --git a/new b/copy
+ > old mode 100755
+ > new mode 100644
+ > similarity index 100%
+ > copy from new
+ > copy to copy
+ > diff --git a/new b/copyx
+ > similarity index 100%
+ > copy from new
+ > copy to copyx
+ > EOF
+ applying patch from stdin
+
+ $ test -f copy
+#if execbit
+ $ test ! -x copy
+ $ test -x copyx
+ $ hg tip -q
+ 2:21dfaae65c71
+#else
+ $ hg tip -q
+ 2:0efdaa8e3bf3
+#endif
+
+ $ hg up -qCr1
+ $ hg rollback -q
+
+Copy (like above but independent of execbit):
+
+ $ hg import -d "1000000 0" -mcopy - <<EOF
+ > diff --git a/new b/copy
+ > similarity index 100%
+ > copy from new
+ > copy to copy
+ > diff --git a/new b/copyx
+ > similarity index 100%
+ > copy from new
+ > copy to copyx
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 2:0efdaa8e3bf3
+ $ test -f copy
+
+ $ cat copy
+ a
+
+ $ hg cat copy
+ a
+
+Rename:
+
+ $ hg import -d "1000000 0" -mrename - <<EOF
+ > diff --git a/copy b/rename
+ > similarity index 100%
+ > rename from copy
+ > rename to rename
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 3:b1f57753fad2
+
+ $ hg locate
+ copyx
+ empty
+ new
+ rename
+
+Delete:
+
+ $ hg import -d "1000000 0" -mdelete - <<EOF
+ > diff --git a/copyx b/copyx
+ > deleted file mode 100755
+ > index 7898192..0000000
+ > --- a/copyx
+ > +++ /dev/null
+ > @@ -1 +0,0 @@
+ > -a
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 4:1bd1da94b9b2
+
+ $ hg locate
+ empty
+ new
+ rename
+
+ $ test -f copyx
+ [1]
+
+Regular diff:
+
+ $ hg import -d "1000000 0" -mregular - <<EOF
+ > diff --git a/rename b/rename
+ > index 7898192..72e1fe3 100644
+ > --- a/rename
+ > +++ b/rename
+ > @@ -1 +1,5 @@
+ > a
+ > +a
+ > +a
+ > +a
+ > +a
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 5:46fe99cb3035
+
+Copy and modify:
+
+ $ hg import -d "1000000 0" -mcopymod - <<EOF
+ > diff --git a/rename b/copy2
+ > similarity index 80%
+ > copy from rename
+ > copy to copy2
+ > index 72e1fe3..b53c148 100644
+ > --- a/rename
+ > +++ b/copy2
+ > @@ -1,5 +1,5 @@
+ > a
+ > a
+ > -a
+ > +b
+ > a
+ > a
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 6:ffeb3197c12d
+
+ $ hg cat copy2
+ a
+ a
+ b
+ a
+ a
+
+Rename and modify:
+
+ $ hg import -d "1000000 0" -mrenamemod - <<EOF
+ > diff --git a/copy2 b/rename2
+ > similarity index 80%
+ > rename from copy2
+ > rename to rename2
+ > index b53c148..8f81e29 100644
+ > --- a/copy2
+ > +++ b/rename2
+ > @@ -1,5 +1,5 @@
+ > a
+ > a
+ > b
+ > -a
+ > +c
+ > a
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 7:401aede9e6bb
+
+ $ hg locate copy2
+ [1]
+ $ hg cat rename2
+ a
+ a
+ b
+ c
+ a
+
+One file renamed multiple times:
+
+ $ hg import -d "1000000 0" -mmultirenames - <<EOF
+ > diff --git a/rename2 b/rename3
+ > rename from rename2
+ > rename to rename3
+ > diff --git a/rename2 b/rename3-2
+ > rename from rename2
+ > rename to rename3-2
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 8:2ef727e684e8
+
+ $ hg log -vr. --template '{rev} {files} / {file_copies}\n'
+ 8 rename2 rename3 rename3-2 / rename3 (rename2)rename3-2 (rename2)
+
+ $ hg locate rename2 rename3 rename3-2
+ rename3
+ rename3-2
+
+ $ hg cat rename3
+ a
+ a
+ b
+ c
+ a
+
+ $ hg cat rename3-2
+ a
+ a
+ b
+ c
+ a
+
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+
+Binary files and regular patch hunks:
+
+ $ hg import -d "1000000 0" -m binaryregular - <<EOF
+ > diff --git a/binary b/binary
+ > new file mode 100644
+ > index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4
+ > GIT binary patch
+ > literal 4
+ > Lc\${NkU|;|M00aO5
+ >
+ > diff --git a/foo b/foo2
+ > rename from foo
+ > rename to foo2
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 10:27377172366e
+
+ $ cat foo2
+ foo
+
+ $ hg manifest --debug | grep binary
+ 045c85ba38952325e126c70962cc0f9d9077bc67 644 binary
+
+Multiple binary files:
+
+ $ hg import -d "1000000 0" -m multibinary - <<EOF
+ > diff --git a/mbinary1 b/mbinary1
+ > new file mode 100644
+ > index 0000000000000000000000000000000000000000..593f4708db84ac8fd0f5cc47c634f38c013fe9e4
+ > GIT binary patch
+ > literal 4
+ > Lc\${NkU|;|M00aO5
+ >
+ > diff --git a/mbinary2 b/mbinary2
+ > new file mode 100644
+ > index 0000000000000000000000000000000000000000..112363ac1917b417ffbd7f376ca786a1e5fa7490
+ > GIT binary patch
+ > literal 5
+ > Mc\${NkU|\`?^000jF3jhEB
+ >
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 11:18b73a84b4ab
+
+ $ hg manifest --debug | grep mbinary
+ 045c85ba38952325e126c70962cc0f9d9077bc67 644 mbinary1
+ a874b471193996e7cb034bb301cac7bdaf3e3f46 644 mbinary2
+
+Filenames with spaces:
+
+ $ hg import -d "1000000 0" -m spaces - <<EOF
+ > diff --git a/foo bar b/foo bar
+ > new file mode 100644
+ > index 0000000..257cc56
+ > --- /dev/null
+ > +++ b/foo bar
+ > @@ -0,0 +1 @@
+ > +foo
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 12:47500ce1614e
+
+ $ cat "foo bar"
+ foo
+
+Copy then modify the original file:
+
+ $ hg import -d "1000000 0" -m copy-mod-orig - <<EOF
+ > diff --git a/foo2 b/foo2
+ > index 257cc56..fe08ec6 100644
+ > --- a/foo2
+ > +++ b/foo2
+ > @@ -1 +1,2 @@
+ > foo
+ > +new line
+ > diff --git a/foo2 b/foo3
+ > similarity index 100%
+ > copy from foo2
+ > copy to foo3
+ > EOF
+ applying patch from stdin
+
+ $ hg tip -q
+ 13:6757efb07ea9
+
+ $ cat foo3
+ foo
+
+Move text file and patch as binary
+
+ $ echo a > text2
+ $ hg ci -Am0
+ adding text2
+ $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > literal 5
+ > Mc$`b*O5$Pw00T?_*Z=?k
+ >
+ > EOF
+ applying patch from stdin
+
+ $ cat binary2
+ a
+ b
+ \x00 (no-eol) (esc)
+
+ $ hg st --copies --change .
+ A binary2
+ text2
+ R text2
+
+Invalid base85 content
+
+ $ hg rollback
+ repository tip rolled back to revision 14 (undo import)
+ working directory now based on revision 14
+ $ hg revert -aq
+ $ hg import -d "1000000 0" -m invalid-binary - <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > literal 5
+ > Mc$`b*O.$Pw00T?_*Z=?k
+ >
+ > EOF
+ applying patch from stdin
+ abort: could not decode "binary2" binary patch: bad base85 character at position 6
+ [255]
+
+ $ hg revert -aq
+ $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > literal 6
+ > Mc$`b*O5$Pw00T?_*Z=?k
+ >
+ > EOF
+ applying patch from stdin
+ abort: "binary2" length is 5 bytes, should be 6
+ [255]
+
+ $ hg revert -aq
+ $ hg import -d "1000000 0" -m rename-as-binary - <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > Mc$`b*O5$Pw00T?_*Z=?k
+ >
+ > EOF
+ applying patch from stdin
+ abort: could not extract "binary2" binary data
+ [255]
+
+Simulate a copy/paste turning LF into CRLF (issue2870)
+
+ $ hg revert -aq
+ $ cat > binary.diff <<"EOF"
+ > diff --git a/text2 b/binary2
+ > rename from text2
+ > rename to binary2
+ > index 78981922613b2afb6025042ff6bd878ac1994e85..10efcb362e9f3b3420fcfbfc0e37f3dc16e29757
+ > GIT binary patch
+ > literal 5
+ > Mc$`b*O5$Pw00T?_*Z=?k
+ >
+ > EOF
+ >>> fp = file('binary.diff', 'rb')
+ >>> data = fp.read()
+ >>> fp.close()
+ >>> file('binary.diff', 'wb').write(data.replace('\n', '\r\n'))
+ $ rm binary2
+ $ hg import --no-commit binary.diff
+ applying binary.diff
+
+ $ cd ..
+
+Consecutive import with renames (issue2459)
+
+ $ hg init issue2459
+ $ cd issue2459
+ $ hg import --no-commit --force - <<EOF
+ > diff --git a/a b/a
+ > new file mode 100644
+ > EOF
+ applying patch from stdin
+ $ hg import --no-commit --force - <<EOF
+ > diff --git a/a b/b
+ > rename from a
+ > rename to b
+ > EOF
+ applying patch from stdin
+ a has not been committed yet, so no copy data will be stored for b.
+ $ hg debugstate
+ a 0 -1 unset b
+ $ hg ci -m done
+ $ cd ..
+
+Renames and strip
+
+ $ hg init renameandstrip
+ $ cd renameandstrip
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg import --no-commit -p2 - <<EOF
+ > diff --git a/foo/a b/foo/b
+ > rename from foo/a
+ > rename to foo/b
+ > EOF
+ applying patch from stdin
+ $ hg st --copies
+ A b
+ a
+ R a
+
+Renames, similarity and git diff
+
+ $ hg revert -aC
+ undeleting a
+ forgetting b
+ $ rm b
+ $ hg import --similarity 90 --no-commit - <<EOF
+ > diff --git a/a b/b
+ > rename from a
+ > rename to b
+ > EOF
+ applying patch from stdin
+ $ hg st --copies
+ A b
+ a
+ R a
+ $ cd ..
+
+Pure copy with existing destination
+
+ $ hg init copytoexisting
+ $ cd copytoexisting
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Am add
+ adding a
+ adding b
+ $ hg import --no-commit - <<EOF
+ > diff --git a/a b/b
+ > copy from a
+ > copy to b
+ > EOF
+ applying patch from stdin
+ abort: cannot create b: destination already exists
+ [255]
+ $ cat b
+ b
+
+Copy and changes with existing destination
+
+ $ hg import --no-commit - <<EOF
+ > diff --git a/a b/b
+ > copy from a
+ > copy to b
+ > --- a/a
+ > +++ b/b
+ > @@ -1,1 +1,2 @@
+ > a
+ > +b
+ > EOF
+ applying patch from stdin
+ cannot create b: destination already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file b.rej
+ abort: patch failed to apply
+ [255]
+ $ cat b
+ b
+
+#if symlink
+
+ $ ln -s b linkb
+ $ hg add linkb
+ $ hg ci -m addlinkb
+ $ hg import --no-commit - <<EOF
+ > diff --git a/linkb b/linkb
+ > deleted file mode 120000
+ > --- a/linkb
+ > +++ /dev/null
+ > @@ -1,1 +0,0 @@
+ > -badhunk
+ > \ No newline at end of file
+ > EOF
+ applying patch from stdin
+ patching file linkb
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file linkb.rej
+ abort: patch failed to apply
+ [255]
+ $ hg st
+ ? b.rej
+ ? linkb.rej
+
+#endif
+
+Test corner case involving copies and multiple hunks (issue3384)
+
+ $ hg revert -qa
+ $ hg import --no-commit - <<EOF
+ > diff --git a/a b/c
+ > copy from a
+ > copy to c
+ > --- a/a
+ > +++ b/c
+ > @@ -1,1 +1,2 @@
+ > a
+ > +a
+ > @@ -2,1 +2,2 @@
+ > a
+ > +a
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -1,1 +1,2 @@
+ > a
+ > +b
+ > EOF
+ applying patch from stdin
+
+ $ cd ..
diff --git a/tests/test-import-merge.t b/tests/test-import-merge.t
new file mode 100644
index 0000000..924f076
--- /dev/null
+++ b/tests/test-import-merge.t
@@ -0,0 +1,115 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ tipparents() {
+ > hg parents --template "{rev}:{node|short} {desc|firstline}\n" -r tip
+ > }
+
+Test import and merge diffs
+
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo a >> a
+ $ hg ci -m changea
+ $ echo c > c
+ $ hg ci -Am addc
+ adding c
+ $ hg up 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+ created new head
+ $ hg up 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ hg export . > ../merge.diff
+ $ cd ..
+ $ hg clone -r2 repo repo2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo2
+ $ hg pull -r3 ../repo
+ pulling from ../repo
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+Test without --exact and diff.p1 == workingdir.p1
+
+ $ hg up 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg import ../merge.diff
+ applying ../merge.diff
+ $ tipparents
+ 1:540395c44225 changea
+ 3:102a90ea7b4a addb
+ $ hg strip --no-backup tip
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Test without --exact and diff.p1 != workingdir.p1
+
+ $ hg up 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import ../merge.diff
+ applying ../merge.diff
+ $ tipparents
+ 2:890ecaa90481 addc
+ $ hg strip --no-backup tip
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Test with --exact
+
+ $ hg import --exact ../merge.diff
+ applying ../merge.diff
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ tipparents
+ 1:540395c44225 changea
+ 3:102a90ea7b4a addb
+ $ hg strip --no-backup tip
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Test with --bypass and diff.p1 == workingdir.p1
+
+ $ hg up 1
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import --bypass ../merge.diff
+ applying ../merge.diff
+ $ tipparents
+ 1:540395c44225 changea
+ 3:102a90ea7b4a addb
+ $ hg strip --no-backup tip
+
+Test with --bypass and diff.p1 != workingdir.p1
+
+ $ hg up 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import --bypass ../merge.diff
+ applying ../merge.diff
+ $ tipparents
+ 2:890ecaa90481 addc
+ $ hg strip --no-backup tip
+
+Test with --bypass and --exact
+
+ $ hg import --bypass --exact ../merge.diff
+ applying ../merge.diff
+ $ tipparents
+ 1:540395c44225 changea
+ 3:102a90ea7b4a addb
+ $ hg strip --no-backup tip
+
+ $ cd ..
diff --git a/tests/test-import-unknown.t b/tests/test-import-unknown.t
new file mode 100644
index 0000000..a143676
--- /dev/null
+++ b/tests/test-import-unknown.t
@@ -0,0 +1,69 @@
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > purge =
+ > EOF
+
+ $ hg init test
+ $ cd test
+ $ echo a > changed
+ $ echo a > removed
+ $ echo a > source
+ $ hg ci -Am addfiles
+ adding changed
+ adding removed
+ adding source
+ $ echo a >> changed
+ $ echo a > added
+ $ hg add added
+ $ hg rm removed
+ $ hg cp source copied
+ $ hg diff --git > ../unknown.diff
+
+Test adding on top of an unknown file
+
+ $ hg up -qC 0
+ $ hg purge
+ $ echo a > added
+ $ hg import --no-commit ../unknown.diff
+ applying ../unknown.diff
+ file added already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file added.rej
+ abort: patch failed to apply
+ [255]
+
+Test modifying an unknown file
+
+ $ hg revert -aq
+ $ hg purge
+ $ hg rm changed
+ $ hg ci -m removechanged
+ $ echo a > changed
+ $ hg import --no-commit ../unknown.diff
+ applying ../unknown.diff
+ abort: cannot patch changed: file is not tracked
+ [255]
+
+Test removing an unknown file
+
+ $ hg up -qC 0
+ $ hg purge
+ $ hg rm removed
+ $ hg ci -m removeremoved
+ created new head
+ $ echo a > removed
+ $ hg import --no-commit ../unknown.diff
+ applying ../unknown.diff
+ abort: cannot patch removed: file is not tracked
+ [255]
+
+Test copying onto an unknown file
+
+ $ hg up -qC 0
+ $ hg purge
+ $ echo a > copied
+ $ hg import --no-commit ../unknown.diff
+ applying ../unknown.diff
+ abort: cannot create copied: destination already exists
+ [255]
+
+ $ cd ..
diff --git a/tests/test-import.t b/tests/test-import.t
new file mode 100644
index 0000000..ccd35cc
--- /dev/null
+++ b/tests/test-import.t
@@ -0,0 +1,1155 @@
+ $ hg init a
+ $ mkdir a/d1
+ $ mkdir a/d1/d2
+ $ echo line 1 > a/a
+ $ echo line 1 > a/d1/d2/a
+ $ hg --cwd a ci -Ama
+ adding a
+ adding d1/d2/a
+
+ $ echo line 2 >> a/a
+ $ hg --cwd a ci -u someone -d '1 0' -m'second change'
+
+import with no args:
+
+ $ hg --cwd a import
+ abort: need at least one patch to import
+ [255]
+
+generate patches for the test
+
+ $ hg --cwd a export tip > exported-tip.patch
+ $ hg --cwd a diff -r0:1 > diffed-tip.patch
+
+
+import exported patch
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import ../exported-tip.patch
+ applying ../exported-tip.patch
+
+message and committer should be same
+
+ $ hg --cwd b tip
+ changeset: 1:1d4bd90af0e4
+ tag: tip
+ user: someone
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: second change
+
+ $ rm -r b
+
+
+import exported patch with external patcher
+
+ $ cat > dummypatch.py <<EOF
+ > print 'patching file a'
+ > file('a', 'wb').write('line2\n')
+ > EOF
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --config ui.patch='python ../dummypatch.py' --cwd b import ../exported-tip.patch
+ applying ../exported-tip.patch
+ $ cat b/a
+ line2
+ $ rm -r b
+
+
+import of plain diff should fail without message
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import ../diffed-tip.patch
+ applying ../diffed-tip.patch
+ abort: empty commit message
+ [255]
+ $ rm -r b
+
+
+import of plain diff should be ok with message
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import -mpatch ../diffed-tip.patch
+ applying ../diffed-tip.patch
+ $ rm -r b
+
+
+import of plain diff with specific date and user
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import -mpatch -d '1 0' -u 'user@nowhere.net' ../diffed-tip.patch
+ applying ../diffed-tip.patch
+ $ hg -R b tip -pv
+ changeset: 1:ca68f19f3a40
+ tag: tip
+ user: user@nowhere.net
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a
+ description:
+ patch
+
+
+ diff -r 80971e65b431 -r ca68f19f3a40 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -1,1 +1,2 @@
+ line 1
+ +line 2
+
+ $ rm -r b
+
+
+import of plain diff should be ok with --no-commit
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import --no-commit ../diffed-tip.patch
+ applying ../diffed-tip.patch
+ $ hg --cwd b diff --nodates
+ diff -r 80971e65b431 a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ line 1
+ +line 2
+ $ rm -r b
+
+
+import of malformed plain diff should fail
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed 's/1,1/foo/' < diffed-tip.patch > broken.patch
+ $ hg --cwd b import -mpatch ../broken.patch
+ applying ../broken.patch
+ abort: bad hunk #1
+ [255]
+ $ rm -r b
+
+
+hg -R repo import
+put the clone in a subdir - having a directory named "a"
+used to hide a bug.
+
+ $ mkdir dir
+ $ hg clone -r0 a dir/b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd dir
+ $ hg -R b import ../exported-tip.patch
+ applying ../exported-tip.patch
+ $ cd ..
+ $ rm -r dir
+
+
+import from stdin
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import - < exported-tip.patch
+ applying patch from stdin
+ $ rm -r b
+
+
+import two patches in one stream
+
+ $ hg init b
+ $ hg --cwd a export 0:tip | hg --cwd b import -
+ applying patch from stdin
+ $ hg --cwd a id
+ 1d4bd90af0e4 tip
+ $ hg --cwd b id
+ 1d4bd90af0e4 tip
+ $ rm -r b
+
+
+override commit message
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b import -m 'override' - < exported-tip.patch
+ applying patch from stdin
+ $ hg --cwd b tip | grep override
+ summary: override
+ $ rm -r b
+
+ $ cat > mkmsg.py <<EOF
+ > import email.Message, sys
+ > msg = email.Message.Message()
+ > patch = open(sys.argv[1], 'rb').read()
+ > msg.set_payload('email commit message\n' + patch)
+ > msg['Subject'] = 'email patch'
+ > msg['From'] = 'email patcher'
+ > file(sys.argv[2], 'wb').write(msg.as_string())
+ > EOF
+
+
+plain diff in email, subject, message body
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ python mkmsg.py diffed-tip.patch msg.patch
+ $ hg --cwd b import ../msg.patch
+ applying ../msg.patch
+ $ hg --cwd b tip | grep email
+ user: email patcher
+ summary: email patch
+ $ rm -r b
+
+
+plain diff in email, no subject, message body
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ grep -v '^Subject:' msg.patch | hg --cwd b import -
+ applying patch from stdin
+ $ rm -r b
+
+
+plain diff in email, subject, no message body
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ grep -v '^email ' msg.patch | hg --cwd b import -
+ applying patch from stdin
+ $ rm -r b
+
+
+plain diff in email, no subject, no message body, should fail
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ egrep -v '^(Subject|email)' msg.patch | hg --cwd b import -
+ applying patch from stdin
+ abort: empty commit message
+ [255]
+ $ rm -r b
+
+
+hg export in email, should use patch header
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ python mkmsg.py exported-tip.patch msg.patch
+ $ cat msg.patch | hg --cwd b import -
+ applying patch from stdin
+ $ hg --cwd b tip | grep second
+ summary: second change
+ $ rm -r b
+
+
+subject: duplicate detection, removal of [PATCH]
+The '---' tests the gitsendmail handling without proper mail headers
+
+ $ cat > mkmsg2.py <<EOF
+ > import email.Message, sys
+ > msg = email.Message.Message()
+ > patch = open(sys.argv[1], 'rb').read()
+ > msg.set_payload('email patch\n\nnext line\n---\n' + patch)
+ > msg['Subject'] = '[PATCH] email patch'
+ > msg['From'] = 'email patcher'
+ > file(sys.argv[2], 'wb').write(msg.as_string())
+ > EOF
+
+
+plain diff in email, [PATCH] subject, message body with subject
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ python mkmsg2.py diffed-tip.patch msg.patch
+ $ cat msg.patch | hg --cwd b import -
+ applying patch from stdin
+ $ hg --cwd b tip --template '{desc}\n'
+ email patch
+
+ next line
+ ---
+ $ rm -r b
+
+
+Issue963: Parent of working dir incorrect after import of multiple
+patches and rollback
+
+We weren't backing up the correct dirstate file when importing many
+patches: import patch1 patch2; rollback
+
+ $ echo line 3 >> a/a
+ $ hg --cwd a ci -m'third change'
+ $ hg --cwd a export -o '../patch%R' 1 2
+ $ hg clone -qr0 a b
+ $ hg --cwd b parents --template 'parent: {rev}\n'
+ parent: 0
+ $ hg --cwd b import -v ../patch1 ../patch2
+ applying ../patch1
+ patching file a
+ a
+ created 1d4bd90af0e4
+ applying ../patch2
+ patching file a
+ a
+ created 6d019af21222
+ $ hg --cwd b rollback
+ repository tip rolled back to revision 0 (undo import)
+ working directory now based on revision 0
+ $ hg --cwd b parents --template 'parent: {rev}\n'
+ parent: 0
+ $ rm -r b
+
+
+importing a patch in a subdirectory failed at the commit stage
+
+ $ echo line 2 >> a/d1/d2/a
+ $ hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change'
+
+hg import in a subdirectory
+
+ $ hg clone -r0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd a export tip > tmp
+ $ sed -e 's/d1\/d2\///' < tmp > subdir-tip.patch
+ $ dir=`pwd`
+ $ cd b/d1/d2 2>&1 > /dev/null
+ $ hg import ../../../subdir-tip.patch
+ applying ../../../subdir-tip.patch
+ $ cd "$dir"
+
+message should be 'subdir change'
+committer should be 'someoneelse'
+
+ $ hg --cwd b tip
+ changeset: 1:3577f5aea227
+ tag: tip
+ user: someoneelse
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: subdir change
+
+
+should be empty
+
+ $ hg --cwd b status
+
+
+Test fuzziness (ambiguous patch location, fuzz=2)
+
+ $ hg init fuzzy
+ $ cd fuzzy
+ $ echo line1 > a
+ $ echo line0 >> a
+ $ echo line3 >> a
+ $ hg ci -Am adda
+ adding a
+ $ echo line1 > a
+ $ echo line2 >> a
+ $ echo line0 >> a
+ $ echo line3 >> a
+ $ hg ci -m change a
+ $ hg export tip > fuzzy-tip.patch
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo line1 > a
+ $ echo line0 >> a
+ $ echo line1 >> a
+ $ echo line0 >> a
+ $ hg ci -m brancha
+ created new head
+ $ hg import --no-commit -v fuzzy-tip.patch
+ applying fuzzy-tip.patch
+ patching file a
+ Hunk #1 succeeded at 2 with fuzz 1 (offset 0 lines).
+ applied to working directory
+ $ hg revert -a
+ reverting a
+
+
+import with --no-commit should have written .hg/last-message.txt
+
+ $ cat .hg/last-message.txt
+ change (no-eol)
+
+
+test fuzziness with eol=auto
+
+ $ hg --config patch.eol=auto import --no-commit -v fuzzy-tip.patch
+ applying fuzzy-tip.patch
+ patching file a
+ Hunk #1 succeeded at 2 with fuzz 1 (offset 0 lines).
+ applied to working directory
+ $ cd ..
+
+
+Test hunk touching empty files (issue906)
+
+ $ hg init empty
+ $ cd empty
+ $ touch a
+ $ touch b1
+ $ touch c1
+ $ echo d > d
+ $ hg ci -Am init
+ adding a
+ adding b1
+ adding c1
+ adding d
+ $ echo a > a
+ $ echo b > b1
+ $ hg mv b1 b2
+ $ echo c > c1
+ $ hg copy c1 c2
+ $ rm d
+ $ touch d
+ $ hg diff --git
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+ diff --git a/b1 b/b2
+ rename from b1
+ rename to b2
+ --- a/b1
+ +++ b/b2
+ @@ -0,0 +1,1 @@
+ +b
+ diff --git a/c1 b/c1
+ --- a/c1
+ +++ b/c1
+ @@ -0,0 +1,1 @@
+ +c
+ diff --git a/c1 b/c2
+ copy from c1
+ copy to c2
+ --- a/c1
+ +++ b/c2
+ @@ -0,0 +1,1 @@
+ +c
+ diff --git a/d b/d
+ --- a/d
+ +++ b/d
+ @@ -1,1 +0,0 @@
+ -d
+ $ hg ci -m empty
+ $ hg export --git tip > empty.diff
+ $ hg up -C 0
+ 4 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg import empty.diff
+ applying empty.diff
+ $ for name in a b1 b2 c1 c2 d; do
+ > echo % $name file
+ > test -f $name && cat $name
+ > done
+ % a file
+ a
+ % b1 file
+ % b2 file
+ b
+ % c1 file
+ c
+ % c2 file
+ c
+ % d file
+ $ cd ..
+
+
+Test importing a patch ending with a binary file removal
+
+ $ hg init binaryremoval
+ $ cd binaryremoval
+ $ echo a > a
+ $ python -c "file('b', 'wb').write('a\x00b')"
+ $ hg ci -Am addall
+ adding a
+ adding b
+ $ hg rm a
+ $ hg rm b
+ $ hg st
+ R a
+ R b
+ $ hg ci -m remove
+ $ hg export --git . > remove.diff
+ $ cat remove.diff | grep git
+ diff --git a/a b/a
+ diff --git a/b b/b
+ $ hg up -C 0
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg import remove.diff
+ applying remove.diff
+ $ hg manifest
+ $ cd ..
+
+
+Issue927: test update+rename with common name
+
+ $ hg init t
+ $ cd t
+ $ touch a
+ $ hg ci -Am t
+ adding a
+ $ echo a > a
+
+Here, bfile.startswith(afile)
+
+ $ hg copy a a2
+ $ hg ci -m copya
+ $ hg export --git tip > copy.diff
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg import copy.diff
+ applying copy.diff
+
+a should contain an 'a'
+
+ $ cat a
+ a
+
+and a2 should have duplicated it
+
+ $ cat a2
+ a
+ $ cd ..
+
+
+test -p0
+
+ $ hg init p0
+ $ cd p0
+ $ echo a > a
+ $ hg ci -Am t
+ adding a
+ $ hg import -p0 - << EOF
+ > foobar
+ > --- a Sat Apr 12 22:43:58 2008 -0400
+ > +++ a Sat Apr 12 22:44:05 2008 -0400
+ > @@ -1,1 +1,1 @@
+ > -a
+ > +bb
+ > EOF
+ applying patch from stdin
+ $ hg status
+ $ cat a
+ bb
+ $ cd ..
+
+
+test paths outside repo root
+
+ $ mkdir outside
+ $ touch outside/foo
+ $ hg init inside
+ $ cd inside
+ $ hg import - <<EOF
+ > diff --git a/a b/b
+ > rename from ../outside/foo
+ > rename to bar
+ > EOF
+ applying patch from stdin
+ abort: path contains illegal component: ../outside/foo (glob)
+ [255]
+ $ cd ..
+
+
+test import with similarity and git and strip (issue295 et al.)
+
+ $ hg init sim
+ $ cd sim
+ $ echo 'this is a test' > a
+ $ hg ci -Ama
+ adding a
+ $ cat > ../rename.diff <<EOF
+ > diff --git a/foo/a b/foo/a
+ > deleted file mode 100644
+ > --- a/foo/a
+ > +++ /dev/null
+ > @@ -1,1 +0,0 @@
+ > -this is a test
+ > diff --git a/foo/b b/foo/b
+ > new file mode 100644
+ > --- /dev/null
+ > +++ b/foo/b
+ > @@ -0,0 +1,2 @@
+ > +this is a test
+ > +foo
+ > EOF
+ $ hg import --no-commit -v -s 1 ../rename.diff -p2
+ applying ../rename.diff
+ patching file a
+ patching file b
+ adding b
+ recording removal of a as rename to b (88% similar)
+ applied to working directory
+ $ hg st -C
+ A b
+ a
+ R a
+ $ hg revert -a
+ undeleting a
+ forgetting b
+ $ rm b
+ $ hg import --no-commit -v -s 100 ../rename.diff -p2
+ applying ../rename.diff
+ patching file a
+ patching file b
+ adding b
+ applied to working directory
+ $ hg st -C
+ A b
+ R a
+ $ cd ..
+
+
+Issue1495: add empty file from the end of patch
+
+ $ hg init addemptyend
+ $ cd addemptyend
+ $ touch a
+ $ hg addremove
+ adding a
+ $ hg ci -m "commit"
+ $ cat > a.patch <<EOF
+ > add a, b
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -0,0 +1,1 @@
+ > +a
+ > diff --git a/b b/b
+ > new file mode 100644
+ > EOF
+ $ hg import --no-commit a.patch
+ applying a.patch
+
+apply a good patch followed by an empty patch (mainly to ensure
+that dirstate is *not* updated when import crashes)
+ $ hg update -q -C .
+ $ rm b
+ $ touch empty.patch
+ $ hg import a.patch empty.patch
+ applying a.patch
+ applying empty.patch
+ transaction abort!
+ rollback completed
+ abort: empty.patch: no diffs found
+ [255]
+ $ hg tip --template '{rev} {desc|firstline}\n'
+ 0 commit
+ $ hg -q status
+ M a
+ $ cd ..
+
+create file when source is not /dev/null
+
+ $ cat > create.patch <<EOF
+ > diff -Naur proj-orig/foo proj-new/foo
+ > --- proj-orig/foo 1969-12-31 16:00:00.000000000 -0800
+ > +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700
+ > @@ -0,0 +1,1 @@
+ > +a
+ > EOF
+
+some people have patches like the following too
+
+ $ cat > create2.patch <<EOF
+ > diff -Naur proj-orig/foo proj-new/foo
+ > --- proj-orig/foo.orig 1969-12-31 16:00:00.000000000 -0800
+ > +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700
+ > @@ -0,0 +1,1 @@
+ > +a
+ > EOF
+ $ hg init oddcreate
+ $ cd oddcreate
+ $ hg import --no-commit ../create.patch
+ applying ../create.patch
+ $ cat foo
+ a
+ $ rm foo
+ $ hg revert foo
+ $ hg import --no-commit ../create2.patch
+ applying ../create2.patch
+ $ cat foo
+ a
+
+ $ cd ..
+
+Issue1859: first line mistaken for email headers
+
+ $ hg init emailconfusion
+ $ cd emailconfusion
+ $ cat > a.patch <<EOF
+ > module: summary
+ >
+ > description
+ >
+ >
+ > diff -r 000000000000 -r 9b4c1e343b55 test.txt
+ > --- /dev/null
+ > +++ b/a
+ > @@ -0,0 +1,1 @@
+ > +a
+ > EOF
+ $ hg import -d '0 0' a.patch
+ applying a.patch
+ $ hg parents -v
+ changeset: 0:5a681217c0ad
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ module: summary
+
+ description
+
+
+ $ cd ..
+
+
+in commit message
+
+ $ hg init commitconfusion
+ $ cd commitconfusion
+ $ cat > a.patch <<EOF
+ > module: summary
+ >
+ > --- description
+ >
+ > diff --git a/a b/a
+ > new file mode 100644
+ > --- /dev/null
+ > +++ b/a
+ > @@ -0,0 +1,1 @@
+ > +a
+ > EOF
+ > hg import -d '0 0' a.patch
+ > hg parents -v
+ > cd ..
+ >
+ > echo '% tricky header splitting'
+ > cat > trickyheaders.patch <<EOF
+ > From: User A <user@a>
+ > Subject: [PATCH] from: tricky!
+ >
+ > # HG changeset patch
+ > # User User B
+ > # Date 1266264441 18000
+ > # Branch stable
+ > # Node ID f2be6a1170ac83bf31cb4ae0bad00d7678115bc0
+ > # Parent 0000000000000000000000000000000000000000
+ > from: tricky!
+ >
+ > That is not a header.
+ >
+ > diff -r 000000000000 -r f2be6a1170ac foo
+ > --- /dev/null
+ > +++ b/foo
+ > @@ -0,0 +1,1 @@
+ > +foo
+ > EOF
+ applying a.patch
+ changeset: 0:f34d9187897d
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ module: summary
+
+
+ % tricky header splitting
+
+ $ hg init trickyheaders
+ $ cd trickyheaders
+ $ hg import -d '0 0' ../trickyheaders.patch
+ applying ../trickyheaders.patch
+ $ hg export --git tip
+ # HG changeset patch
+ # User User B
+ # Date 0 0
+ # Node ID eb56ab91903632294ac504838508cb370c0901d2
+ # Parent 0000000000000000000000000000000000000000
+ from: tricky!
+
+ That is not a header.
+
+ diff --git a/foo b/foo
+ new file mode 100644
+ --- /dev/null
+ +++ b/foo
+ @@ -0,0 +1,1 @@
+ +foo
+ $ cd ..
+
+
+Issue2102: hg export and hg import speak different languages
+
+ $ hg init issue2102
+ $ cd issue2102
+ $ mkdir -p src/cmd/gc
+ $ touch src/cmd/gc/mksys.bash
+ $ hg ci -Am init
+ adding src/cmd/gc/mksys.bash
+ $ hg import - <<EOF
+ > # HG changeset patch
+ > # User Rob Pike
+ > # Date 1216685449 25200
+ > # Node ID 03aa2b206f499ad6eb50e6e207b9e710d6409c98
+ > # Parent 93d10138ad8df586827ca90b4ddb5033e21a3a84
+ > help management of empty pkg and lib directories in perforce
+ >
+ > R=gri
+ > DELTA=4 (4 added, 0 deleted, 0 changed)
+ > OCL=13328
+ > CL=13328
+ >
+ > diff --git a/lib/place-holder b/lib/place-holder
+ > new file mode 100644
+ > --- /dev/null
+ > +++ b/lib/place-holder
+ > @@ -0,0 +1,2 @@
+ > +perforce does not maintain empty directories.
+ > +this file helps.
+ > diff --git a/pkg/place-holder b/pkg/place-holder
+ > new file mode 100644
+ > --- /dev/null
+ > +++ b/pkg/place-holder
+ > @@ -0,0 +1,2 @@
+ > +perforce does not maintain empty directories.
+ > +this file helps.
+ > diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash
+ > old mode 100644
+ > new mode 100755
+ > EOF
+ applying patch from stdin
+
+#if execbit
+
+ $ hg sum
+ parent: 1:d59915696727 tip
+ help management of empty pkg and lib directories in perforce
+ branch: default
+ commit: (clean)
+ update: (current)
+
+ $ hg diff --git -c tip
+ diff --git a/lib/place-holder b/lib/place-holder
+ new file mode 100644
+ --- /dev/null
+ +++ b/lib/place-holder
+ @@ -0,0 +1,2 @@
+ +perforce does not maintain empty directories.
+ +this file helps.
+ diff --git a/pkg/place-holder b/pkg/place-holder
+ new file mode 100644
+ --- /dev/null
+ +++ b/pkg/place-holder
+ @@ -0,0 +1,2 @@
+ +perforce does not maintain empty directories.
+ +this file helps.
+ diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash
+ old mode 100644
+ new mode 100755
+
+#else
+
+ $ hg sum
+ parent: 1:28f089cc9ccc tip
+ help management of empty pkg and lib directories in perforce
+ branch: default
+ commit: (clean)
+ update: (current)
+
+ $ hg diff --git -c tip
+ diff --git a/lib/place-holder b/lib/place-holder
+ new file mode 100644
+ --- /dev/null
+ +++ b/lib/place-holder
+ @@ -0,0 +1,2 @@
+ +perforce does not maintain empty directories.
+ +this file helps.
+ diff --git a/pkg/place-holder b/pkg/place-holder
+ new file mode 100644
+ --- /dev/null
+ +++ b/pkg/place-holder
+ @@ -0,0 +1,2 @@
+ +perforce does not maintain empty directories.
+ +this file helps.
+
+/* The mode change for mksys.bash is missing here, because on platforms */
+/* that don't support execbits, mode changes in patches are ignored when */
+/* they are imported. This is obviously also the reason for why the hash */
+/* in the created changeset is different to the one you see above the */
+/* #else clause */
+
+#endif
+ $ cd ..
+
+
+diff lines looking like headers
+
+ $ hg init difflineslikeheaders
+ $ cd difflineslikeheaders
+ $ echo a >a
+ $ echo b >b
+ $ echo c >c
+ $ hg ci -Am1
+ adding a
+ adding b
+ adding c
+
+ $ echo "key: value" >>a
+ $ echo "key: value" >>b
+ $ echo "foo" >>c
+ $ hg ci -m2
+
+ $ hg up -C 0
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff --git -c1 >want
+ $ hg diff -c1 | hg import --no-commit -
+ applying patch from stdin
+ $ hg diff --git >have
+ $ diff want have
+ $ cd ..
+
+import a unified diff with no lines of context (diff -U0)
+
+ $ hg init diffzero
+ $ cd diffzero
+ $ cat > f << EOF
+ > c2
+ > c4
+ > c5
+ > EOF
+ $ hg commit -Am0
+ adding f
+
+ $ hg import --no-commit - << EOF
+ > # HG changeset patch
+ > # User test
+ > # Date 0 0
+ > # Node ID f4974ab632f3dee767567b0576c0ec9a4508575c
+ > # Parent 8679a12a975b819fae5f7ad3853a2886d143d794
+ > 1
+ > diff -r 8679a12a975b -r f4974ab632f3 f
+ > --- a/f Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/f Thu Jan 01 00:00:00 1970 +0000
+ > @@ -0,0 +1,1 @@
+ > +c1
+ > @@ -1,0 +3,1 @@
+ > +c3
+ > @@ -3,1 +4,0 @@
+ > -c5
+ > EOF
+ applying patch from stdin
+
+ $ cat f
+ c1
+ c2
+ c3
+ c4
+
+ $ cd ..
+
+no segfault while importing a unified diff which start line is zero but chunk
+size is non-zero
+
+ $ hg init startlinezero
+ $ cd startlinezero
+ $ echo foo > foo
+ $ hg commit -Amfoo
+ adding foo
+
+ $ hg import --no-commit - << EOF
+ > diff a/foo b/foo
+ > --- a/foo
+ > +++ b/foo
+ > @@ -0,1 +0,1 @@
+ > foo
+ > EOF
+ applying patch from stdin
+
+ $ cd ..
+
+Test corner case involving fuzz and skew
+
+ $ hg init morecornercases
+ $ cd morecornercases
+
+ $ cat > 01-no-context-beginning-of-file.diff <<EOF
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -1,0 +1,1 @@
+ > +line
+ > EOF
+
+ $ cat > 02-no-context-middle-of-file.diff <<EOF
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -1,1 +1,1 @@
+ > -2
+ > +add some skew
+ > @@ -2,0 +2,1 @@
+ > +line
+ > EOF
+
+ $ cat > 03-no-context-end-of-file.diff <<EOF
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -10,0 +10,1 @@
+ > +line
+ > EOF
+
+ $ cat > 04-middle-of-file-completely-fuzzed.diff <<EOF
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -1,1 +1,1 @@
+ > -2
+ > +add some skew
+ > @@ -2,2 +2,3 @@
+ > not matching, should fuzz
+ > ... a bit
+ > +line
+ > EOF
+
+ $ cat > a <<EOF
+ > 1
+ > 2
+ > 3
+ > 4
+ > EOF
+ $ hg ci -Am adda a
+ $ for p in *.diff; do
+ > hg import -v --no-commit $p
+ > cat a
+ > hg revert -aqC a
+ > # patch -p1 < $p
+ > # cat a
+ > # hg revert -aC a
+ > done
+ applying 01-no-context-beginning-of-file.diff
+ patching file a
+ applied to working directory
+ 1
+ line
+ 2
+ 3
+ 4
+ applying 02-no-context-middle-of-file.diff
+ patching file a
+ Hunk #1 succeeded at 2 (offset 1 lines).
+ Hunk #2 succeeded at 4 (offset 1 lines).
+ applied to working directory
+ 1
+ add some skew
+ 3
+ line
+ 4
+ applying 03-no-context-end-of-file.diff
+ patching file a
+ Hunk #1 succeeded at 5 (offset -6 lines).
+ applied to working directory
+ 1
+ 2
+ 3
+ 4
+ line
+ applying 04-middle-of-file-completely-fuzzed.diff
+ patching file a
+ Hunk #1 succeeded at 2 (offset 1 lines).
+ Hunk #2 succeeded at 5 with fuzz 2 (offset 1 lines).
+ applied to working directory
+ 1
+ add some skew
+ 3
+ 4
+ line
+
+ $ cd ..
diff --git a/tests/test-incoming-outgoing.t b/tests/test-incoming-outgoing.t
new file mode 100644
index 0000000..03deeac
--- /dev/null
+++ b/tests/test-incoming-outgoing.t
@@ -0,0 +1,491 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > echo $i >> foo
+ > hg commit -A -m $i
+ > done
+ adding foo
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 9 changesets, 9 total revisions
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ cd ..
+
+ $ hg init new
+
+http incoming
+
+ $ hg -R new incoming http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 5:ad284ee3b5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ changeset: 6:e9229f2de384
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 6
+
+ changeset: 7:d152815bb8db
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 7
+
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+ $ hg -R new incoming -r 4 http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+
+local incoming
+
+ $ hg -R new incoming test
+ comparing with test
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 5:ad284ee3b5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ changeset: 6:e9229f2de384
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 6
+
+ changeset: 7:d152815bb8db
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 7
+
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+ $ hg -R new incoming -r 4 test
+ comparing with test
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+
+limit to 2 changesets
+
+ $ hg -R new incoming -l 2 test
+ comparing with test
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+
+limit to 2 changesets, test with -p --git
+
+ $ hg -R new incoming -l 2 -p --git test
+ comparing with test
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ diff --git a/foo b/foo
+ new file mode 100644
+ --- /dev/null
+ +++ b/foo
+ @@ -0,0 +1,1 @@
+ +0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ diff --git a/foo b/foo
+ --- a/foo
+ +++ b/foo
+ @@ -1,1 +1,2 @@
+ 0
+ +1
+
+
+test with --bundle
+
+ $ hg -R new incoming --bundle test.hg http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 5:ad284ee3b5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ changeset: 6:e9229f2de384
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 6
+
+ changeset: 7:d152815bb8db
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 7
+
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+ $ hg -R new incoming --bundle test2.hg test
+ comparing with test
+ changeset: 0:00a43fa82f62
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 0
+
+ changeset: 1:5460a410df01
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ changeset: 2:d9f42cd1a1ec
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 3:376476025137
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ changeset: 4:70d7eb252d49
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+ changeset: 5:ad284ee3b5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 5
+
+ changeset: 6:e9229f2de384
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 6
+
+ changeset: 7:d152815bb8db
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 7
+
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+
+
+test the resulting bundles
+
+ $ hg init temp
+ $ hg init temp2
+ $ hg -R temp unbundle test.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 9 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg -R temp2 unbundle test2.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 9 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg -R temp tip
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+ $ hg -R temp2 tip
+ changeset: 8:e4feb4ac9035
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 8
+
+
+ $ rm -r temp temp2 new
+
+test outgoing
+
+ $ hg clone test test-dev
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test-dev
+ $ for i in 9 10 11 12 13; do
+ > echo $i >> foo
+ > hg commit -A -m $i
+ > done
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 14 changesets, 14 total revisions
+ $ cd ..
+ $ hg -R test-dev outgoing test
+ comparing with test
+ searching for changes
+ changeset: 9:d89d4abea5bc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 9
+
+ changeset: 10:820095aa7158
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 10
+
+ changeset: 11:09ede2f3a638
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 11
+
+ changeset: 12:e576b1bed305
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 12
+
+ changeset: 13:96bbff09a7cc
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 13
+
+test outgoing with secret changesets
+
+ $ hg -R test-dev phase --force --secret 9
+ $ hg -R test-dev outgoing test
+ comparing with test
+ searching for changes
+ no changes found (ignored 5 secret changesets)
+ [1]
+ $ hg -R test-dev phase --draft -r 'head()'
+
+limit to 3 changesets
+
+ $ hg -R test-dev outgoing -l 3 test
+ comparing with test
+ searching for changes
+ changeset: 9:d89d4abea5bc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 9
+
+ changeset: 10:820095aa7158
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 10
+
+ changeset: 11:09ede2f3a638
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 11
+
+ $ hg -R test-dev outgoing http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ changeset: 9:d89d4abea5bc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 9
+
+ changeset: 10:820095aa7158
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 10
+
+ changeset: 11:09ede2f3a638
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 11
+
+ changeset: 12:e576b1bed305
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 12
+
+ changeset: 13:96bbff09a7cc
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 13
+
+ $ hg -R test-dev outgoing -r 11 http://localhost:$HGPORT/
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ changeset: 9:d89d4abea5bc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 9
+
+ changeset: 10:820095aa7158
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 10
+
+ changeset: 11:09ede2f3a638
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 11
+
+
+incoming from empty remote repository
+
+ $ hg init r1
+ $ hg init r2
+ $ echo a > r1/foo
+ $ hg -R r1 ci -Ama
+ adding foo
+ $ hg -R r1 incoming r2 --bundle x.hg
+ comparing with r2
+ searching for changes
+ no changes found
+ [1]
diff --git a/tests/test-inherit-mode.t b/tests/test-inherit-mode.t
new file mode 100644
index 0000000..cf6c9e5
--- /dev/null
+++ b/tests/test-inherit-mode.t
@@ -0,0 +1,152 @@
+test that new files created in .hg inherit the permissions from .hg/store
+
+
+ $ "$TESTDIR/hghave" unix-permissions || exit 80
+
+ $ mkdir dir
+
+just in case somebody has a strange $TMPDIR
+
+ $ chmod g-s dir
+ $ cd dir
+
+ $ cat >printmodes.py <<EOF
+ > import os, sys
+ >
+ > allnames = []
+ > isdir = {}
+ > for root, dirs, files in os.walk(sys.argv[1]):
+ > for d in dirs:
+ > name = os.path.join(root, d)
+ > isdir[name] = 1
+ > allnames.append(name)
+ > for f in files:
+ > name = os.path.join(root, f)
+ > allnames.append(name)
+ > allnames.sort()
+ > for name in allnames:
+ > suffix = name in isdir and '/' or ''
+ > print '%05o %s%s' % (os.lstat(name).st_mode & 07777, name, suffix)
+ > EOF
+
+ $ cat >mode.py <<EOF
+ > import sys
+ > import os
+ > print '%05o' % os.lstat(sys.argv[1]).st_mode
+ > EOF
+
+ $ umask 077
+
+ $ hg init repo
+ $ cd repo
+
+ $ chmod 0770 .hg/store
+
+before commit
+store can be written by the group, other files cannot
+store is setgid
+
+ $ python ../printmodes.py .
+ 00700 ./.hg/
+ 00600 ./.hg/00changelog.i
+ 00600 ./.hg/requires
+ 00770 ./.hg/store/
+
+ $ mkdir dir
+ $ touch foo dir/bar
+ $ hg ci -qAm 'add files'
+
+after commit
+working dir files can only be written by the owner
+files created in .hg can be written by the group
+(in particular, store/**, dirstate, branch cache file, undo files)
+new directories are setgid
+
+ $ python ../printmodes.py .
+ 00700 ./.hg/
+ 00600 ./.hg/00changelog.i
+ 00770 ./.hg/cache/
+ 00660 ./.hg/cache/branchheads
+ 00660 ./.hg/dirstate
+ 00660 ./.hg/last-message.txt
+ 00600 ./.hg/requires
+ 00770 ./.hg/store/
+ 00660 ./.hg/store/00changelog.i
+ 00660 ./.hg/store/00manifest.i
+ 00770 ./.hg/store/data/
+ 00770 ./.hg/store/data/dir/
+ 00660 ./.hg/store/data/dir/bar.i
+ 00660 ./.hg/store/data/foo.i
+ 00660 ./.hg/store/fncache
+ 00660 ./.hg/store/phaseroots
+ 00660 ./.hg/store/undo
+ 00660 ./.hg/store/undo.phaseroots
+ 00660 ./.hg/undo.bookmarks
+ 00660 ./.hg/undo.branch
+ 00660 ./.hg/undo.desc
+ 00660 ./.hg/undo.dirstate
+ 00700 ./dir/
+ 00600 ./dir/bar
+ 00600 ./foo
+
+ $ umask 007
+ $ hg init ../push
+
+before push
+group can write everything
+
+ $ python ../printmodes.py ../push
+ 00770 ../push/.hg/
+ 00660 ../push/.hg/00changelog.i
+ 00660 ../push/.hg/requires
+ 00770 ../push/.hg/store/
+
+ $ umask 077
+ $ hg -q push ../push
+
+after push
+group can still write everything
+
+ $ python ../printmodes.py ../push
+ 00770 ../push/.hg/
+ 00660 ../push/.hg/00changelog.i
+ 00770 ../push/.hg/cache/
+ 00660 ../push/.hg/cache/branchheads
+ 00660 ../push/.hg/requires
+ 00770 ../push/.hg/store/
+ 00660 ../push/.hg/store/00changelog.i
+ 00660 ../push/.hg/store/00manifest.i
+ 00770 ../push/.hg/store/data/
+ 00770 ../push/.hg/store/data/dir/
+ 00660 ../push/.hg/store/data/dir/bar.i
+ 00660 ../push/.hg/store/data/foo.i
+ 00660 ../push/.hg/store/fncache
+ 00660 ../push/.hg/store/phaseroots
+ 00660 ../push/.hg/store/undo
+ 00660 ../push/.hg/store/undo.phaseroots
+ 00660 ../push/.hg/undo.bookmarks
+ 00660 ../push/.hg/undo.branch
+ 00660 ../push/.hg/undo.desc
+ 00660 ../push/.hg/undo.dirstate
+
+
+Test that we don't lose the setgid bit when we call chmod.
+Not all systems support setgid directories (e.g. HFS+), so
+just check that directories have the same mode.
+
+ $ cd ..
+ $ hg init setgid
+ $ cd setgid
+ $ chmod g+rwx .hg/store
+ $ chmod g+s .hg/store 2> /dev/null || true
+ $ mkdir dir
+ $ touch dir/file
+ $ hg ci -qAm 'add dir/file'
+ $ storemode=`python ../mode.py .hg/store`
+ $ dirmode=`python ../mode.py .hg/store/data/dir`
+ $ if [ "$storemode" != "$dirmode" ]; then
+ > echo "$storemode != $dirmode"
+ > fi
+ $ cd ..
+
+ $ cd .. # g-s dir
diff --git a/tests/test-init.t b/tests/test-init.t
new file mode 100644
index 0000000..aa4610b
--- /dev/null
+++ b/tests/test-init.t
@@ -0,0 +1,199 @@
+This test tries to exercise the ssh functionality with a dummy script
+
+ $ checknewrepo()
+ > {
+ > name=$1
+ > if [ -d "$name"/.hg/store ]; then
+ > echo store created
+ > fi
+ > if [ -f "$name"/.hg/00changelog.i ]; then
+ > echo 00changelog.i created
+ > fi
+ > cat "$name"/.hg/requires
+ > }
+
+creating 'local'
+
+ $ hg init local
+ $ checknewrepo local
+ store created
+ 00changelog.i created
+ revlogv1
+ fncache
+ store
+ dotencode
+ $ echo this > local/foo
+ $ hg ci --cwd local -A -m "init"
+ adding foo
+
+creating repo with format.usestore=false
+
+ $ hg --config format.usestore=false init old
+ $ checknewrepo old
+ revlogv1
+
+creating repo with format.usefncache=false
+
+ $ hg --config format.usefncache=false init old2
+ $ checknewrepo old2
+ store created
+ 00changelog.i created
+ revlogv1
+ store
+
+creating repo with format.dotencode=false
+
+ $ hg --config format.dotencode=false init old3
+ $ checknewrepo old3
+ store created
+ 00changelog.i created
+ revlogv1
+ fncache
+ store
+
+test failure
+
+ $ hg init local
+ abort: repository local already exists!
+ [255]
+
+init+push to remote2
+
+ $ hg init -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote2
+ $ hg incoming -R remote2 local
+ comparing with local
+ changeset: 0:08b9e9f63b32
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: init
+
+
+ $ hg push -R local -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote2
+ pushing to ssh://user@dummy/remote2
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+
+clone to remote1
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote1
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+
+init to existing repo
+
+ $ hg init -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote1
+ abort: repository remote1 already exists!
+ abort: could not create remote repo!
+ [255]
+
+clone to existing repo
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote1
+ abort: repository remote1 already exists!
+ abort: could not create remote repo!
+ [255]
+
+output of dummyssh
+
+ $ cat dummylog
+ Got arguments 1:user@dummy 2:hg init remote2
+ Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote2 serve --stdio
+ Got arguments 1:user@dummy 2:hg init remote1
+ Got arguments 1:user@dummy 2:hg -R remote1 serve --stdio
+ Got arguments 1:user@dummy 2:hg init remote1
+ Got arguments 1:user@dummy 2:hg init remote1
+
+comparing repositories
+
+ $ hg tip -q -R local
+ 0:08b9e9f63b32
+ $ hg tip -q -R remote1
+ 0:08b9e9f63b32
+ $ hg tip -q -R remote2
+ 0:08b9e9f63b32
+
+check names for repositories (clashes with URL schemes, special chars)
+
+ $ for i in bundle file hg http https old-http ssh static-http "with space"; do
+ > printf "hg init \"$i\"... "
+ > hg init "$i"
+ > test -d "$i" -a -d "$i/.hg" && echo "ok" || echo "failed"
+ > done
+ hg init "bundle"... ok
+ hg init "file"... ok
+ hg init "hg"... ok
+ hg init "http"... ok
+ hg init "https"... ok
+ hg init "old-http"... ok
+ hg init "ssh"... ok
+ hg init "static-http"... ok
+ hg init "with space"... ok
+#if eol-in-paths
+/* " " is not a valid name for a directory on Windows */
+ $ hg init " "
+ $ test -d " "
+ $ test -d " /.hg"
+#endif
+
+creating 'local/sub/repo'
+
+ $ hg init local/sub/repo
+ $ checknewrepo local/sub/repo
+ store created
+ 00changelog.i created
+ revlogv1
+ fncache
+ store
+ dotencode
+
+prepare test of init of url configured from paths
+
+ $ echo '[paths]' >> $HGRCPATH
+ $ echo "somewhere = `pwd`/url from paths" >> $HGRCPATH
+ $ echo "elsewhere = `pwd`/another paths url" >> $HGRCPATH
+
+init should (for consistency with clone) expand the url
+
+ $ hg init somewhere
+ $ checknewrepo "url from paths"
+ store created
+ 00changelog.i created
+ revlogv1
+ fncache
+ store
+ dotencode
+
+verify that clone also expand urls
+
+ $ hg clone somewhere elsewhere
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ checknewrepo "another paths url"
+ store created
+ 00changelog.i created
+ revlogv1
+ fncache
+ store
+ dotencode
+
+clone bookmarks
+
+ $ hg -R local bookmark test
+ $ hg -R local bookmarks
+ * test 0:08b9e9f63b32
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" local ssh://user@dummy/remote-bookmarks
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ hg -R remote-bookmarks bookmarks
+ test 0:08b9e9f63b32
diff --git a/tests/test-inotify-debuginotify.t b/tests/test-inotify-debuginotify.t
new file mode 100644
index 0000000..f0118f6
--- /dev/null
+++ b/tests/test-inotify-debuginotify.t
@@ -0,0 +1,41 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid
+ $ cat hg.pid >> "$DAEMON_PIDS"
+
+let the daemon finish its stuff
+
+ $ sleep 1
+
+empty
+
+ $ hg debuginotify
+ directories being watched:
+ /
+ .hg/
+ $ mkdir a
+ $ sleep 1
+
+only 'a
+
+ $ hg debuginotify
+ directories being watched:
+ /
+ .hg/
+ a/
+ $ rmdir a
+ $ sleep 1
+
+empty again
+
+ $ hg debuginotify
+ directories being watched:
+ /
+ .hg/
+ $ kill `cat hg.pid`
diff --git a/tests/test-inotify-dirty-dirstate.t b/tests/test-inotify-dirty-dirstate.t
new file mode 100644
index 0000000..af9bd8e
--- /dev/null
+++ b/tests/test-inotify-dirty-dirstate.t
@@ -0,0 +1,72 @@
+issues when status queries are issued when dirstate is dirty
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+ $ echo "fetch=" >> $HGRCPATH
+
+issue1810: inotify and fetch
+
+ $ hg init test; cd test
+ $ hg inserve -d --pid-file=../hg.pid
+ $ cat ../hg.pid >> "$DAEMON_PIDS"
+ $ echo foo > foo
+ $ hg add
+ adding foo
+ $ hg ci -m foo
+ $ cd ..
+ $ hg --config "inotify.pidfile=../hg2.pid" clone test test2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat ../hg2.pid >> "$DAEMON_PIDS"
+ $ cd test2
+ $ echo bar > bar
+ $ hg add
+ adding bar
+ $ hg ci -m bar
+ $ cd ../test
+ $ echo spam > spam
+ $ hg add
+ adding spam
+ $ hg ci -m spam
+ $ cd ../test2
+ $ hg st
+
+abort, outstanding changes
+
+ $ hg fetch -q
+ $ hg st
+ $ cd ..
+
+issue1719: inotify and mq
+
+ $ echo "mq=" >> $HGRCPATH
+ $ hg init test-1719
+ $ cd test-1719
+
+inserve
+
+ $ hg inserve -d --pid-file=../hg-test-1719.pid
+ $ cat ../hg-test-1719.pid >> "$DAEMON_PIDS"
+ $ echo content > file
+ $ hg add file
+ $ hg qnew -f test.patch
+ $ hg status
+ $ hg qpop
+ popping test.patch
+ patch queue now empty
+
+st should not output anything
+
+ $ hg status
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+
+st should not output anything
+
+ $ hg status
+ $ hg qrefresh
+ $ hg status
+
+ $ cd ..
diff --git a/tests/test-inotify-issue1208.t b/tests/test-inotify-issue1208.t
new file mode 100644
index 0000000..e8e5237
--- /dev/null
+++ b/tests/test-inotify-issue1208.t
@@ -0,0 +1,38 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+ $ p="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+ $ hg init $p
+ $ cd $p
+
+fail
+
+ $ ln -sf doesnotexist .hg/inotify.sock
+ $ hg st
+ abort: inotify-server: cannot start: .hg/inotify.sock is a broken symlink
+ inotify-client: could not start inotify server: child process failed to start
+ $ hg inserve
+ abort: inotify-server: cannot start: .hg/inotify.sock is a broken symlink
+ [255]
+ $ rm .hg/inotify.sock
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid
+ $ cat hg.pid >> "$DAEMON_PIDS"
+
+status
+
+ $ hg status
+ ? hg.pid
+
+if we try to start twice the server, make sure we get a correct error
+
+ $ hg inserve -d --pid-file=hg2.pid
+ abort: inotify-server: cannot start: socket is already bound
+ abort: child process failed to start
+ [255]
+ $ kill `cat hg.pid`
+
+ $ cd ..
diff --git a/tests/test-inotify-issue1371.t b/tests/test-inotify-issue1371.t
new file mode 100644
index 0000000..2a12757
--- /dev/null
+++ b/tests/test-inotify-issue1371.t
@@ -0,0 +1,44 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init
+ $ touch a b c d e f
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid 2>&1
+ $ cat hg.pid >> "$DAEMON_PIDS"
+ $ hg ci -Am m
+ adding a
+ adding b
+ adding c
+ adding d
+ adding e
+ adding f
+ adding hg.pid
+
+let the daemon finish its stuff
+
+ $ sleep 1
+
+eed to test all file opperations
+
+ $ hg rm a
+ $ rm b
+ $ echo c >> c
+ $ touch g
+ $ hg add g
+ $ hg mv e h
+ $ hg status
+ M c
+ A g
+ A h
+ R a
+ R e
+ ! b
+ $ sleep 1
+
+Are we able to kill the service? if not, the service died on some error
+
+ $ kill `cat hg.pid`
diff --git a/tests/test-inotify-issue1542.t b/tests/test-inotify-issue1542.t
new file mode 100644
index 0000000..fa3d5cd
--- /dev/null
+++ b/tests/test-inotify-issue1542.t
@@ -0,0 +1,36 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init
+ $ touch a
+ $ mkdir dir
+ $ touch dir/b
+ $ touch dir/c
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+ $ hg add dir/c
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid 2>&1
+ $ cat hg.pid >> "$DAEMON_PIDS"
+ $ hg st
+ A dir/c
+ ? a
+ ? dir/b
+ ? hg.pid
+
+moving dir out
+
+ $ mv dir ../tmp-test-inotify-issue1542
+
+status
+
+ $ hg st
+ ! dir/c
+ ? a
+ ? hg.pid
+ $ sleep 1
+
+Are we able to kill the service? if not, the service died on some error
+
+ $ kill `cat hg.pid`
diff --git a/tests/test-inotify-issue1556.t b/tests/test-inotify-issue1556.t
new file mode 100644
index 0000000..ade628f
--- /dev/null
+++ b/tests/test-inotify-issue1556.t
@@ -0,0 +1,31 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init
+ $ touch a b
+ $ hg add a b
+ $ rm b
+
+status without inotify
+
+ $ hg st
+ A a
+ ! b
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid 2>&1
+ $ cat hg.pid >> "$DAEMON_PIDS"
+
+status
+
+ $ hg st
+ A a
+ ! b
+ ? hg.pid
+ $ sleep 1
+
+Are we able to kill the service? if not, the service died on some error
+
+ $ kill `cat hg.pid`
diff --git a/tests/test-inotify-lookup.t b/tests/test-inotify-lookup.t
new file mode 100644
index 0000000..c5fca69
--- /dev/null
+++ b/tests/test-inotify-lookup.t
@@ -0,0 +1,14 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init
+ $ echo "[extensions]" > .hg/hgrc
+ $ echo "inotify=" >> .hg/hgrc
+ $ hg inserve -d --pid-file .hg/inotify.pid
+ $ echo a > a
+ $ hg ci -Aqm0
+ $ hg co -q null
+ $ hg co -q
+ $ hg st
+ $ cat a
+ a
+ $ kill `cat .hg/inotify.pid`
diff --git a/tests/test-inotify.t b/tests/test-inotify.t
new file mode 100644
index 0000000..34be779
--- /dev/null
+++ b/tests/test-inotify.t
@@ -0,0 +1,162 @@
+
+ $ "$TESTDIR/hghave" inotify || exit 80
+ $ hg init repo1
+ $ cd repo1
+ $ touch a b c d e
+ $ mkdir dir
+ $ mkdir dir/bar
+ $ touch dir/x dir/y dir/bar/foo
+ $ hg ci -Am m
+ adding a
+ adding b
+ adding c
+ adding d
+ adding dir/bar/foo
+ adding dir/x
+ adding dir/y
+ adding e
+ $ cd ..
+ $ hg clone repo1 repo2
+ updating to branch default
+ 8 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "inotify=" >> $HGRCPATH
+ $ cd repo2
+ $ echo b >> a
+
+check that daemon started automatically works correctly
+and make sure that inotify.pidfile works
+
+ $ hg --config "inotify.pidfile=../hg2.pid" status
+ M a
+
+make sure that pidfile worked. Output should be silent.
+
+ $ kill `cat ../hg2.pid`
+ $ cd ../repo1
+
+inserve
+
+ $ hg inserve -d --pid-file=hg.pid
+ $ cat hg.pid >> "$DAEMON_PIDS"
+
+let the daemon finish its stuff
+
+ $ sleep 1
+
+cannot start, already bound
+
+ $ hg inserve
+ abort: inotify-server: cannot start: socket is already bound
+ [255]
+
+issue907
+
+ $ hg status
+ ? hg.pid
+
+clean
+
+ $ hg status -c
+ C a
+ C b
+ C c
+ C d
+ C dir/bar/foo
+ C dir/x
+ C dir/y
+ C e
+
+all
+
+ $ hg status -A
+ ? hg.pid
+ C a
+ C b
+ C c
+ C d
+ C dir/bar/foo
+ C dir/x
+ C dir/y
+ C e
+
+path patterns
+
+ $ echo x > dir/x
+ $ hg status .
+ M dir/x
+ ? hg.pid
+ $ hg status dir
+ M dir/x
+ $ cd dir
+ $ hg status .
+ M x
+ $ cd ..
+
+issue 1375
+testing that we can remove a folder and then add a file with the same name
+issue 1375
+
+ $ mkdir h
+ $ echo h > h/h
+ $ hg ci -Am t
+ adding h/h
+ adding hg.pid
+ $ hg rm h
+ removing h/h
+ $ echo h >h
+ $ hg add h
+ $ hg status
+ A h
+ R h/h
+ $ hg ci -m0
+
+Test for issue1735: inotify watches files in .hg/merge
+
+ $ hg st
+ $ echo a > a
+ $ hg ci -Am a
+ $ hg st
+ $ echo b >> a
+ $ hg ci -m ab
+ $ hg st
+ $ echo c >> a
+ $ hg st
+ M a
+ $ HGMERGE=internal:local hg up 0
+ 1 files updated, 1 files merged, 2 files removed, 0 files unresolved
+ $ hg st
+ M a
+ $ HGMERGE=internal:local hg up
+ 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+ M a
+
+Test for 1844: "hg ci folder" will not commit all changes beneath "folder"
+
+ $ mkdir 1844
+ $ echo a > 1844/foo
+ $ hg add 1844
+ adding 1844/foo
+ $ hg ci -m 'working'
+ $ echo b >> 1844/foo
+ $ hg ci 1844 -m 'broken'
+
+Test for issue884: "Build products not ignored until .hgignore is touched"
+
+ $ echo '^build$' > .hgignore
+ $ hg add .hgignore
+ $ hg ci .hgignore -m 'ignorelist'
+
+Now, lets add some build products...
+
+ $ mkdir build
+ $ touch build/x
+ $ touch build/y
+
+build/x & build/y shouldn't appear in "hg st"
+
+ $ hg st
+ $ kill `cat hg.pid`
+
+ $ cd ..
diff --git a/tests/test-install.t b/tests/test-install.t
new file mode 100644
index 0000000..5d7741d
--- /dev/null
+++ b/tests/test-install.t
@@ -0,0 +1,20 @@
+hg debuginstall
+ $ hg debuginstall
+ checking encoding (ascii)...
+ checking installed modules (*mercurial)... (glob)
+ checking templates (*mercurial?templates)... (glob)
+ checking commit editor...
+ checking username...
+ no problems detected
+
+hg debuginstall with no username
+ $ HGUSER= hg debuginstall
+ checking encoding (ascii)...
+ checking installed modules (*mercurial)... (glob)
+ checking templates (*mercurial?templates)... (glob)
+ checking commit editor...
+ checking username...
+ no username supplied (see "hg help config")
+ (specify a username in your configuration file)
+ 1 problems detected, please check your install!
+ [1]
diff --git a/tests/test-interhg.t b/tests/test-interhg.t
new file mode 100644
index 0000000..ee08846
--- /dev/null
+++ b/tests/test-interhg.t
@@ -0,0 +1,33 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+
+ $ cat > .hg/hgrc <<EOF
+ > [extensions]
+ > interhg =
+ >
+ > [interhg]
+ > issues = s|Issue(\d+)|<a href="http://bts.example.org/issue\1">Issue\1</a>|
+ >
+ > # yes, 'x' is a weird delimiter...
+ > markbugs = sxbugx<i class="\x">bug</i>x
+ > EOF
+
+ $ touch foo
+ $ hg add foo
+ $ hg commit -d '1 0' -m 'Issue123: fixed the bug!'
+
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+log
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '' | grep bts
+ <td class="description"><a href="/rev/1b0e7ece6bd6"><a href="http://bts.example.org/issue123">Issue123</a>: fixed the <i class="x">bug</i>!</a><span class="branchhead">default</span> <span class="tag">tip</span> </td>
+
+errors
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-issue1089.t b/tests/test-issue1089.t
new file mode 100644
index 0000000..2bdd3d0
--- /dev/null
+++ b/tests/test-issue1089.t
@@ -0,0 +1,26 @@
+http://mercurial.selenic.com/bts/issue1089
+
+ $ hg init
+ $ mkdir a
+ $ echo a > a/b
+ $ hg ci -Am m
+ adding a/b
+
+ $ hg rm a
+ removing a/b (glob)
+ $ hg ci -m m a
+
+ $ mkdir a b
+ $ echo a > a/b
+ $ hg ci -Am m
+ adding a/b
+
+ $ hg rm a
+ removing a/b (glob)
+ $ cd b
+
+Relative delete:
+
+ $ hg ci -m m ../a
+
+ $ cd ..
diff --git a/tests/test-issue1175.t b/tests/test-issue1175.t
new file mode 100644
index 0000000..563c2df
--- /dev/null
+++ b/tests/test-issue1175.t
@@ -0,0 +1,53 @@
+http://mercurial.selenic.com/bts/issue1175
+
+ $ hg init
+ $ touch a
+ $ hg ci -Am0
+ adding a
+
+ $ hg mv a a1
+ $ hg ci -m1
+
+ $ hg co 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg mv a a2
+ $ hg up
+ note: possible conflict - a was renamed multiple times to:
+ a2
+ a1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg ci -m2
+
+ $ touch a
+ $ hg ci -Am3
+ adding a
+
+ $ hg mv a b
+ $ hg ci -Am4 a
+
+ $ hg ci --debug --traceback -Am5 b
+ b
+ b: searching for copy revision for a
+ b: copy a:b80de5d138758541c5f05265ad144ab9fa86d1db
+ committed changeset 5:89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 6 changesets, 4 total revisions
+
+ $ hg export --git tip
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 89e8e4be0de296fa3d6dd7825ccc44d7dc0f1f3b
+ # Parent 7fc86ba705e717a721dbc361bf8c9bc05a18ca2f
+ 5
+
+ diff --git a/b b/b
+ new file mode 100644
+
diff --git a/tests/test-issue1306.t b/tests/test-issue1306.t
new file mode 100644
index 0000000..a176284
--- /dev/null
+++ b/tests/test-issue1306.t
@@ -0,0 +1,96 @@
+http://mercurial.selenic.com/bts/issue1306
+
+Initialize remote repo with branches:
+
+ $ hg init remote
+ $ cd remote
+
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg branch br
+ marked working directory as branch br
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Amb
+
+ $ echo c > c
+ $ hg ci -Amc
+ adding c
+
+ $ hg log
+ changeset: 2:ae3d9c30ec50
+ branch: br
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 1:3f7f930ca414
+ branch: br
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ cd ..
+
+Try cloning -r branch:
+
+ $ hg clone -rbr remote local1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 2 files
+ updating to branch br
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R local1 parents
+ changeset: 2:ae3d9c30ec50
+ branch: br
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+
+Try cloning -rother clone#branch:
+
+ $ hg clone -r0 remote#br local2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 2 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R local2 parents
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+Try cloning -r1 clone#branch:
+
+ $ hg clone -r1 remote#br local3
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 2 files
+ updating to branch br
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R local3 parents
+ changeset: 1:3f7f930ca414
+ branch: br
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+
diff --git a/tests/test-issue1438.t b/tests/test-issue1438.t
new file mode 100644
index 0000000..3832625
--- /dev/null
+++ b/tests/test-issue1438.t
@@ -0,0 +1,23 @@
+http://mercurial.selenic.com/bts/issue1438
+
+ $ "$TESTDIR/hghave" symlink || exit 80
+
+ $ hg init
+
+ $ ln -s foo link
+ $ hg add link
+ $ hg ci -mbad link
+ $ hg rm link
+ $ hg ci -mok
+ $ hg diff -g -r 0:1 > bad.patch
+
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg import --no-commit bad.patch
+ applying bad.patch
+
+ $ hg status
+ R link
+ ? bad.patch
+
diff --git a/tests/test-issue1502.t b/tests/test-issue1502.t
new file mode 100644
index 0000000..4963502
--- /dev/null
+++ b/tests/test-issue1502.t
@@ -0,0 +1,41 @@
+http://mercurial.selenic.com/bts/issue1502
+
+Initialize repository
+
+ $ hg init foo
+ $ touch foo/a && hg -R foo commit -A -m "added a"
+ adding a
+
+ $ hg clone foo foo1
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo "bar" > foo1/a && hg -R foo1 commit -m "edit a in foo1"
+ $ echo "hi" > foo/a && hg -R foo commit -m "edited a foo"
+ $ hg -R foo1 pull -u
+ pulling from $TESTTMP/foo (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ not updating: crosses branches (merge branches or update --check to force update)
+
+ $ hg -R foo1 book branchy
+ $ hg -R foo1 book
+ * branchy 1:e3e522925eff
+
+Pull. Bookmark should not jump to new head.
+
+ $ echo "there" >> foo/a && hg -R foo commit -m "edited a again"
+ $ hg -R foo1 pull
+ pulling from $TESTTMP/foo (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+ $ hg -R foo1 book
+ * branchy 1:e3e522925eff
diff --git a/tests/test-issue1802.t b/tests/test-issue1802.t
new file mode 100644
index 0000000..9b3268a
--- /dev/null
+++ b/tests/test-issue1802.t
@@ -0,0 +1,73 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+Create extension that can disable exec checks:
+
+ $ cat > noexec.py <<EOF
+ > from mercurial import extensions, util
+ > def setflags(orig, f, l, x):
+ > pass
+ > def checkexec(orig, path):
+ > return False
+ > def extsetup(ui):
+ > extensions.wrapfunction(util, 'setflags', setflags)
+ > extensions.wrapfunction(util, 'checkexec', checkexec)
+ > EOF
+
+ $ hg init unix-repo
+ $ cd unix-repo
+ $ touch a
+ $ hg add a
+ $ hg commit -m 'unix: add a'
+ $ hg clone . ../win-repo
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ chmod +x a
+ $ hg commit -m 'unix: chmod a'
+ $ hg manifest -v
+ 755 * a
+
+ $ cd ../win-repo
+
+ $ touch b
+ $ hg add b
+ $ hg commit -m 'win: add b'
+
+ $ hg manifest -v
+ 644 a
+ 644 b
+
+ $ hg pull
+ pulling from $TESTTMP/unix-repo
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg manifest -v -r tip
+ 755 * a
+
+Simulate a Windows merge:
+
+ $ hg --config extensions.n=$TESTTMP/noexec.py merge --debug
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: a03b0deabf2b, local: d6fa54f68ae1+, remote: 2d8bcf2dda39
+ a: update permissions -> e
+ updating: a 1/1 files (100.00%)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Simulate a Windows commit:
+
+ $ hg --config extensions.n=$TESTTMP/noexec.py commit -m 'win: merge'
+
+ $ hg manifest -v
+ 755 * a
+ 644 b
+
+ $ cd ..
diff --git a/tests/test-issue1877.t b/tests/test-issue1877.t
new file mode 100644
index 0000000..aa3083a
--- /dev/null
+++ b/tests/test-issue1877.t
@@ -0,0 +1,46 @@
+http://mercurial.selenic.com/bts/issue1877
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg add a
+ $ hg ci -m 'a'
+ $ echo b > a
+ $ hg ci -m'b'
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg book main
+ $ hg book
+ * main 0:cb9a9f314b8b
+ $ echo c > c
+ $ hg add c
+ $ hg ci -m'c'
+ created new head
+ $ hg book
+ * main 2:d36c0562f908
+ $ hg heads
+ changeset: 2:d36c0562f908
+ bookmark: main
+ tag: tip
+ parent: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 1:1e6c11564562
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ $ hg up 1e6c11564562
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge main
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg book
+ main 2:d36c0562f908
+ $ hg ci -m'merge'
+ $ hg book
+ main 2:d36c0562f908
+
+ $ cd ..
diff --git a/tests/test-issue2137.t b/tests/test-issue2137.t
new file mode 100644
index 0000000..99b41f4
--- /dev/null
+++ b/tests/test-issue2137.t
@@ -0,0 +1,56 @@
+http://mercurial.selenic.com/bts/issue2137
+
+Setup:
+
+create a little extension that has 3 side-effects:
+1) ensure changelog data is not inlined
+2) make revlog to use lazyparser
+3) test that repo.lookup() works
+1 and 2 are preconditions for the bug; 3 is the bug.
+
+ $ cat > commitwrapper.py <<EOF
+ > from mercurial import extensions, node, revlog
+ >
+ > def reposetup(ui, repo):
+ > def wrapcommit(orig, *args, **kwargs):
+ > result = orig(*args, **kwargs)
+ > tip1 = node.short(repo.changelog.tip())
+ > tip2 = node.short(repo.lookup(tip1))
+ > assert tip1 == tip2
+ > ui.write('new tip: %s\n' % tip1)
+ > return result
+ >
+ > extensions.wrapfunction(repo, 'commit', wrapcommit)
+ >
+ > def extsetup(ui):
+ > revlog._maxinline = 8 # split out 00changelog.d early
+ > revlog._prereadsize = 8 # use revlog.lazyparser
+ > EOF
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > commitwrapper = `pwd`/commitwrapper.py
+ > EOF
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo a > a
+ $ hg commit -A -m'add a with a long commit message to make the changelog a bit bigger'
+ adding a
+ new tip: 553596fad57b
+
+Test that new changesets are visible to repo.lookup():
+
+ $ echo a >> a
+ $ hg commit -m'one more commit to demonstrate the bug'
+ new tip: 799ae3599e0e
+
+ $ hg tip
+ changeset: 1:799ae3599e0e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: one more commit to demonstrate the bug
+
+
+ $ cd ..
diff --git a/tests/test-issue3084.t b/tests/test-issue3084.t
new file mode 100644
index 0000000..43945b1
--- /dev/null
+++ b/tests/test-issue3084.t
@@ -0,0 +1,110 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "largefiles =" >> $HGRCPATH
+
+Create the repository outside $HOME since largefiles write to
+$HOME/.cache/largefiles.
+
+ $ hg init test
+ $ cd test
+ $ echo "root" > root
+ $ hg add root
+ $ hg commit -m "Root commit"
+
+ $ echo "large" > foo
+ $ hg add --large foo
+ $ hg commit -m "Add foo as a largefile"
+
+ $ hg update -r 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ getting changed largefiles
+ 0 largefiles updated, 1 removed
+
+ $ echo "normal" > foo
+ $ hg add foo
+ $ hg commit -m "Add foo as normal file"
+ created new head
+
+Normal file in the working copy, keeping the normal version:
+
+ $ echo "n" | hg merge --config ui.interactive=Yes
+ foo has been turned into a largefile
+ use (l)argefile or keep as (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg status
+ $ cat foo
+ normal
+
+Normal file in the working copy, keeping the largefile version:
+
+ $ hg update -q -C
+ $ echo "l" | hg merge --config ui.interactive=Yes
+ foo has been turned into a largefile
+ use (l)argefile or keep as (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+
+ $ hg status
+ M foo
+
+ $ hg diff --nodates
+ diff -r fa129ab6b5a7 .hglf/foo
+ --- /dev/null
+ +++ b/.hglf/foo
+ @@ -0,0 +1,1 @@
+ +7f7097b041ccf68cc5561e9600da4655d21c6d18
+ diff -r fa129ab6b5a7 foo
+ --- a/foo
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -normal
+
+ $ cat foo
+ large
+
+Largefile in the working copy, keeping the normal version:
+
+ $ hg update -q -C -r 1
+ $ echo "n" | hg merge --config ui.interactive=Yes
+ foo has been turned into a normal file
+ keep as (l)argefile or use (n)ormal file? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ 0 largefiles updated, 0 removed
+
+ $ hg status
+ M foo
+
+ $ hg diff --nodates
+ diff -r ff521236428a .hglf/foo
+ --- a/.hglf/foo
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -7f7097b041ccf68cc5561e9600da4655d21c6d18
+ diff -r ff521236428a foo
+ --- /dev/null
+ +++ b/foo
+ @@ -0,0 +1,1 @@
+ +normal
+
+ $ cat foo
+ normal
+
+Largefile in the working copy, keeping the largefile version:
+
+ $ hg update -q -C -r 1
+ $ echo "l" | hg merge --config ui.interactive=Yes
+ foo has been turned into a normal file
+ keep as (l)argefile or use (n)ormal file? 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+
+ $ hg status
+
+ $ cat foo
+ large
+
+ $ cd ..
diff --git a/tests/test-issue522.t b/tests/test-issue522.t
new file mode 100644
index 0000000..a21f23b
--- /dev/null
+++ b/tests/test-issue522.t
@@ -0,0 +1,56 @@
+http://mercurial.selenic.com/bts/issue522
+
+In the merge below, the file "foo" has the same contents in both
+parents, but if we look at the file-level history, we'll notice that
+the version in p1 is an ancestor of the version in p2. This test makes
+sure that we'll use the version from p2 in the manifest of the merge
+revision.
+
+ $ hg init
+
+ $ echo foo > foo
+ $ hg ci -qAm 'add foo'
+
+ $ echo bar >> foo
+ $ hg ci -m 'change foo'
+
+ $ hg backout -r tip -m 'backout changed foo'
+ reverting foo
+ changeset 2:4d9e78aaceee backs out changeset 1:b515023e500e
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ touch bar
+ $ hg ci -qAm 'add bar'
+
+ $ hg merge --debug
+ searching for copies back to rev 1
+ unmatched files in local:
+ bar
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: bbd179dfa0a7, local: 71766447bdbb+, remote: 4d9e78aaceee
+ foo: remote is newer -> g
+ updating: foo 1/1 files (100.00%)
+ getting foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg debugstate | grep foo
+ n 0 -2 unset foo
+
+ $ hg st -A foo
+ M foo
+
+ $ hg ci -m 'merge'
+
+ $ hg manifest --debug | grep foo
+ c6fc755d7e68f49f880599da29f15add41f42f5a 644 foo
+
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 5 ..... 0 2ed2a3912a0b 000000000000 000000000000 (re)
+ 1 5 9 ..... 1 6f4310b00b9a 2ed2a3912a0b 000000000000 (re)
+ 2 14 5 ..... 2 c6fc755d7e68 6f4310b00b9a 000000000000 (re)
+
diff --git a/tests/test-issue612.t b/tests/test-issue612.t
new file mode 100644
index 0000000..2985abb
--- /dev/null
+++ b/tests/test-issue612.t
@@ -0,0 +1,34 @@
+http://mercurial.selenic.com/bts/issue612
+
+ $ hg init
+ $ mkdir src
+ $ echo a > src/a.c
+ $ hg ci -Ama
+ adding src/a.c
+
+ $ hg mv src source
+ moving src/a.c to source/a.c (glob)
+
+ $ hg ci -Ammove
+
+ $ hg co -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo new > src/a.c
+ $ echo compiled > src/a.o
+ $ hg ci -mupdate
+ created new head
+
+ $ hg status
+ ? src/a.o
+
+ $ hg merge
+ merging src/a.c and source/a.c to source/a.c
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg status
+ M source/a.c
+ R src/a.c
+ ? src/a.o
+
diff --git a/tests/test-issue619.t b/tests/test-issue619.t
new file mode 100644
index 0000000..e53e4df
--- /dev/null
+++ b/tests/test-issue619.t
@@ -0,0 +1,30 @@
+http://mercurial.selenic.com/bts/issue619
+
+ $ hg init
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ echo b > b
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Amb
+ adding b
+
+ $ hg co -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Fast-forward:
+
+ $ hg merge b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -Ammerge
+
+Bogus fast-forward should fail:
+
+ $ hg merge b
+ abort: merging with a working directory ancestor has no effect
+ [255]
+
diff --git a/tests/test-issue660.t b/tests/test-issue660.t
new file mode 100644
index 0000000..850eb3f
--- /dev/null
+++ b/tests/test-issue660.t
@@ -0,0 +1,145 @@
+http://mercurial.selenic.com/bts/issue660 and:
+http://mercurial.selenic.com/bts/issue322
+
+ $ hg init
+ $ echo a > a
+ $ mkdir b
+ $ echo b > b/b
+ $ hg commit -A -m "a is file, b is dir"
+ adding a
+ adding b/b
+
+File replaced with directory:
+
+ $ rm a
+ $ mkdir a
+ $ echo a > a/a
+
+Should fail - would corrupt dirstate:
+
+ $ hg add a/a
+ abort: file 'a' in dirstate clashes with 'a/a'
+ [255]
+
+Removing shadow:
+
+ $ hg rm --after a
+
+Should succeed - shadow removed:
+
+ $ hg add a/a
+
+Directory replaced with file:
+
+ $ rm -r b
+ $ echo b > b
+
+Should fail - would corrupt dirstate:
+
+ $ hg add b
+ abort: directory 'b' already in dirstate
+ [255]
+
+Removing shadow:
+
+ $ hg rm --after b/b
+
+Should succeed - shadow removed:
+
+ $ hg add b
+
+Look what we got:
+
+ $ hg st
+ A a/a
+ A b
+ R a
+ R b/b
+
+Revert reintroducing shadow - should fail:
+
+ $ rm -r a b
+ $ hg revert b/b
+ abort: file 'b' in dirstate clashes with 'b/b'
+ [255]
+
+Revert all - should succeed:
+
+ $ hg revert --all
+ undeleting a
+ forgetting a/a (glob)
+ forgetting b
+ undeleting b/b (glob)
+
+ $ hg st
+
+addremove:
+
+ $ rm -r a b
+ $ mkdir a
+ $ echo a > a/a
+ $ echo b > b
+
+ $ hg addremove -s 0
+ removing a
+ adding a/a
+ adding b
+ removing b/b
+
+ $ hg st
+ A a/a
+ A b
+ R a
+ R b/b
+
+commit:
+
+ $ hg ci -A -m "a is dir, b is file"
+ $ hg st --all
+ C a/a
+ C b
+
+Long directory replaced with file:
+
+ $ mkdir d
+ $ mkdir d/d
+ $ echo d > d/d/d
+ $ hg commit -A -m "d is long directory"
+ adding d/d/d
+
+ $ rm -r d
+ $ echo d > d
+
+Should fail - would corrupt dirstate:
+
+ $ hg add d
+ abort: directory 'd' already in dirstate
+ [255]
+
+Removing shadow:
+
+ $ hg rm --after d/d/d
+
+Should succeed - shadow removed:
+
+ $ hg add d
+ $ hg ci -md
+
+Update should work at least with clean working directory:
+
+ $ rm -r a b d
+ $ hg up -r 0
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg st --all
+ C a
+ C b/b
+
+ $ rm -r a b
+ $ hg up -r 1
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg st --all
+ C a/a
+ C b
+
diff --git a/tests/test-issue672.t b/tests/test-issue672.t
new file mode 100644
index 0000000..a6e4fcb
--- /dev/null
+++ b/tests/test-issue672.t
@@ -0,0 +1,101 @@
+http://mercurial.selenic.com/bts/issue672
+
+# 0-2-4
+# \ \ \
+# 1-3-5
+#
+# rename in #1, content change in #4.
+
+ $ hg init
+
+ $ touch 1
+ $ touch 2
+ $ hg commit -Am init # 0
+ adding 1
+ adding 2
+
+ $ hg rename 1 1a
+ $ hg commit -m rename # 1
+
+ $ hg co -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo unrelated >> 2
+ $ hg ci -m unrelated1 # 2
+ created new head
+
+ $ hg merge --debug 1
+ searching for copies back to rev 1
+ unmatched files in other:
+ 1a
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ 1a -> 1
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 81f4b099af3d, local: c64f439569a9+, remote: c12dcd37c90a
+ 1: other deleted -> r
+ 1a: remote created -> g
+ updating: 1 1/2 files (50.00%)
+ removing 1
+ updating: 1a 2/2 files (100.00%)
+ getting 1a
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg ci -m merge1 # 3
+
+ $ hg co -C 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo hello >> 1
+ $ hg ci -m unrelated2 # 4
+ created new head
+
+ $ hg co -C 3
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg merge -y --debug 4
+ searching for copies back to rev 1
+ unmatched files in local:
+ 1a
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ 1a -> 1 *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c64f439569a9, local: e327dca35ac8+, remote: 746e9549ea96
+ 1a: local copied/moved to 1 -> m
+ preserving 1a for resolve of 1a
+ updating: 1a 1/1 files (100.00%)
+ picked tool 'internal:merge' for 1a (binary False symlink False)
+ merging 1a and 1 to 1a
+ my 1a@e327dca35ac8+ other 1@746e9549ea96 ancestor 1@81f4b099af3d
+ premerge successful
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg co -C 4
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg merge -y --debug 3
+ searching for copies back to rev 1
+ unmatched files in other:
+ 1a
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ 1a -> 1 *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c64f439569a9, local: 746e9549ea96+, remote: e327dca35ac8
+ 1: remote moved to 1a -> m
+ preserving 1 for resolve of 1a
+ removing 1
+ updating: 1 1/1 files (100.00%)
+ picked tool 'internal:merge' for 1a (binary False symlink False)
+ merging 1 and 1a to 1a
+ my 1a@746e9549ea96+ other 1a@e327dca35ac8 ancestor 1@81f4b099af3d
+ premerge successful
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
diff --git a/tests/test-issue842.t b/tests/test-issue842.t
new file mode 100644
index 0000000..6cf9b9d
--- /dev/null
+++ b/tests/test-issue842.t
@@ -0,0 +1,39 @@
+http://mercurial.selenic.com/bts/issue842
+
+ $ hg init
+ $ echo foo > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg up -r0000
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo bar > a
+
+Should issue new head warning:
+
+ $ hg ci -Amb
+ adding a
+ created new head
+
+ $ hg up -r0000
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo stuffy > a
+
+Should not issue new head warning:
+
+ $ hg ci -q -Amc
+
+ $ hg up -r0000
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo crap > a
+ $ hg branch testing
+ marked working directory as branch testing
+ (branches are permanent and global, did you want a bookmark?)
+
+Should not issue warning:
+
+ $ hg ci -q -Amd
+
diff --git a/tests/test-journal-exists.t b/tests/test-journal-exists.t
new file mode 100644
index 0000000..4cc908f
--- /dev/null
+++ b/tests/test-journal-exists.t
@@ -0,0 +1,36 @@
+ $ hg init
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+
+ $ hg -q clone . foo
+
+ $ touch .hg/store/journal
+
+ $ echo foo > a
+ $ hg ci -Am0
+ abort: abandoned transaction found - run hg recover!
+ [255]
+
+ $ hg recover
+ rolling back interrupted transaction
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+Check that zero-size journals are correctly aborted:
+
+#if unix-permissions
+ $ hg bundle -qa repo.hg
+ $ chmod -w foo/.hg/store/00changelog.i
+
+ $ hg -R foo unbundle repo.hg
+ adding changesets
+ abort: Permission denied: $TESTTMP/foo/.hg/store/.00changelog.i-* (glob)
+ [255]
+
+ $ if test -f foo/.hg/store/journal; then echo 'journal exists :-('; fi
+#endif
+
diff --git a/tests/test-keyword.t b/tests/test-keyword.t
new file mode 100644
index 0000000..56fb4ba
--- /dev/null
+++ b/tests/test-keyword.t
@@ -0,0 +1,1139 @@
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > keyword =
+ > mq =
+ > notify =
+ > record =
+ > transplant =
+ > [ui]
+ > interactive = true
+ > EOF
+
+hide outer repo
+ $ hg init
+
+Run kwdemo before [keyword] files are set up
+as it would succeed without uisetup otherwise
+
+ $ hg --quiet kwdemo
+ [extensions]
+ keyword =
+ [keyword]
+ demo.txt =
+ [keywordset]
+ svn = False
+ [keywordmaps]
+ Author = {author|user}
+ Date = {date|utcdate}
+ Header = {root}/{file},v {node|short} {date|utcdate} {author|user}
+ Id = {file|basename},v {node|short} {date|utcdate} {author|user}
+ RCSFile = {file|basename},v
+ RCSfile = {file|basename},v
+ Revision = {node|short}
+ Source = {root}/{file},v
+ $Author: test $
+ $Date: ????/??/?? ??:??:?? $ (glob)
+ $Header: */demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
+ $Id: demo.txt,v ???????????? ????/??/?? ??:??:?? test $ (glob)
+ $RCSFile: demo.txt,v $
+ $RCSfile: demo.txt,v $
+ $Revision: ???????????? $ (glob)
+ $Source: */demo.txt,v $ (glob)
+
+ $ hg --quiet kwdemo "Branch = {branches}"
+ [extensions]
+ keyword =
+ [keyword]
+ demo.txt =
+ [keywordset]
+ svn = False
+ [keywordmaps]
+ Branch = {branches}
+ $Branch: demobranch $
+
+ $ cat <<EOF >> $HGRCPATH
+ > [keyword]
+ > ** =
+ > b = ignore
+ > i = ignore
+ > [hooks]
+ > EOF
+ $ cp $HGRCPATH $HGRCPATH.nohooks
+ > cat <<EOF >> $HGRCPATH
+ > commit=
+ > commit.test=cp a hooktest
+ > EOF
+
+ $ hg init Test-bndl
+ $ cd Test-bndl
+
+kwshrink should exit silently in empty/invalid repo
+
+ $ hg kwshrink
+
+Symlinks cannot be created on Windows.
+A bundle to test this was made with:
+ hg init t
+ cd t
+ echo a > a
+ ln -s a sym
+ hg add sym
+ hg ci -m addsym -u mercurial
+ hg bundle --base null ../test-keyword.hg
+
+ $ hg pull -u "$TESTDIR"/bundles/test-keyword.hg
+ pulling from *test-keyword.hg (glob)
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo 'expand $Id$' > a
+ $ echo 'do not process $Id:' >> a
+ $ echo 'xxx $' >> a
+ $ echo 'ignore $Id$' > b
+
+Output files as they were created
+
+ $ cat a b
+ expand $Id$
+ do not process $Id:
+ xxx $
+ ignore $Id$
+
+no kwfiles
+
+ $ hg kwfiles
+
+untracked candidates
+
+ $ hg -v kwfiles --unknown
+ k a
+
+Add files and check status
+
+ $ hg addremove
+ adding a
+ adding b
+ $ hg status
+ A a
+ A b
+
+
+Default keyword expansion including commit hook
+Interrupted commit should not change state or run commit hook
+
+ $ hg --debug commit
+ abort: empty commit message
+ [255]
+ $ hg status
+ A a
+ A b
+
+Commit with several checks
+
+ $ hg --debug commit -mabsym -u 'User Name <user@example.com>'
+ a
+ b
+ overwriting a expanding keywords
+ running hook commit.test: cp a hooktest
+ committed changeset 1:ef63ca68695bc9495032c6fda1350c71e6d256e9
+ $ hg status
+ ? hooktest
+ $ hg debugrebuildstate
+ $ hg --quiet identify
+ ef63ca68695b
+
+cat files in working directory with keywords expanded
+
+ $ cat a b
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ ignore $Id$
+
+hg cat files and symlink, no expansion
+
+ $ hg cat sym a b && echo
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ ignore $Id$
+ a
+
+ $ diff a hooktest
+
+ $ cp $HGRCPATH.nohooks $HGRCPATH
+ $ rm hooktest
+
+hg status of kw-ignored binary file starting with '\1\n'
+
+ >>> open("i", "wb").write("\1\nfoo")
+ $ hg -q commit -Am metasep i
+ $ hg status
+ >>> open("i", "wb").write("\1\nbar")
+ $ hg status
+ M i
+ $ hg -q commit -m "modify metasep" i
+ $ hg status --rev 2:3
+ M i
+ $ touch empty
+ $ hg -q commit -A -m "another file"
+ $ hg status -A --rev 3:4 i
+ C i
+
+ $ hg -q strip -n 2
+
+Test hook execution
+
+bundle
+
+ $ hg bundle --base null ../kw.hg
+ 2 changesets found
+ $ cd ..
+ $ hg init Test
+ $ cd Test
+
+Notify on pull to check whether keywords stay as is in email
+ie. if patch.diff wrapper acts as it should
+
+ $ cat <<EOF >> $HGRCPATH
+ > [hooks]
+ > incoming.notify = python:hgext.notify.hook
+ > [notify]
+ > sources = pull
+ > diffstat = False
+ > maxsubject = 15
+ > [reposubs]
+ > * = Test
+ > EOF
+
+Pull from bundle and trigger notify
+
+ $ hg pull -u ../kw.hg
+ pulling from ../kw.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 3 changes to 3 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date: * (glob)
+ Subject: changeset in...
+ From: mercurial
+ X-Hg-Notification: changeset a2392c293916
+ Message-Id: <hg.a2392c293916*> (glob)
+ To: Test
+
+ changeset a2392c293916 in $TESTTMP/Test (glob)
+ details: $TESTTMP/Test?cmd=changeset;node=a2392c293916
+ description:
+ addsym
+
+ diffs (6 lines):
+
+ diff -r 000000000000 -r a2392c293916 sym
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/sym Sat Feb 09 20:25:47 2008 +0100
+ @@ -0,0 +1,1 @@
+ +a
+ \ No newline at end of file
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date:* (glob)
+ Subject: changeset in...
+ From: User Name <user@example.com>
+ X-Hg-Notification: changeset ef63ca68695b
+ Message-Id: <hg.ef63ca68695b*> (glob)
+ To: Test
+
+ changeset ef63ca68695b in $TESTTMP/Test (glob)
+ details: $TESTTMP/Test?cmd=changeset;node=ef63ca68695b
+ description:
+ absym
+
+ diffs (12 lines):
+
+ diff -r a2392c293916 -r ef63ca68695b a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,3 @@
+ +expand $Id$
+ +do not process $Id:
+ +xxx $
+ diff -r a2392c293916 -r ef63ca68695b b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +ignore $Id$
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cp $HGRCPATH.nohooks $HGRCPATH
+
+Touch files and check with status
+
+ $ touch a b
+ $ hg status
+
+Update and expand
+
+ $ rm sym a b
+ $ hg update -C
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat a b
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ ignore $Id$
+
+Check whether expansion is filewise and file mode is preserved
+
+ $ echo '$Id$' > c
+ $ echo 'tests for different changenodes' >> c
+#if unix-permissions
+ $ chmod 600 c
+ $ ls -l c | cut -b 1-10
+ -rw-------
+#endif
+
+commit file c
+
+ $ hg commit -A -mcndiff -d '1 0' -u 'User Name <user@example.com>'
+ adding c
+#if unix-permissions
+ $ ls -l c | cut -b 1-10
+ -rw-------
+#endif
+
+force expansion
+
+ $ hg -v kwexpand
+ overwriting a expanding keywords
+ overwriting c expanding keywords
+
+compare changenodes in a and c
+
+ $ cat a c
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
+ tests for different changenodes
+
+record
+
+ $ echo '$Id$' > r
+ $ hg add r
+
+record chunk
+
+ >>> lines = open('a', 'rb').readlines()
+ >>> lines.insert(1, 'foo\n')
+ >>> lines.append('bar\n')
+ >>> open('a', 'wb').writelines(lines)
+ $ hg record -d '10 1' -m rectest a<<EOF
+ > y
+ > y
+ > n
+ > EOF
+ diff --git a/a b/a
+ 2 hunks, 2 lines changed
+ examine changes to 'a'? [Ynesfdaq?]
+ @@ -1,3 +1,4 @@
+ expand $Id$
+ +foo
+ do not process $Id:
+ xxx $
+ record change 1/2 to 'a'? [Ynesfdaq?]
+ @@ -2,2 +3,3 @@
+ do not process $Id:
+ xxx $
+ +bar
+ record change 2/2 to 'a'? [Ynesfdaq?]
+
+ $ hg identify
+ 5f5eb23505c3+ tip
+ $ hg status
+ M a
+ A r
+
+Cat modified file a
+
+ $ cat a
+ expand $Id: a,v 5f5eb23505c3 1970/01/01 00:00:10 test $
+ foo
+ do not process $Id:
+ xxx $
+ bar
+
+Diff remaining chunk
+
+ $ hg diff a
+ diff -r 5f5eb23505c3 a
+ --- a/a Thu Jan 01 00:00:09 1970 -0000
+ +++ b/a * (glob)
+ @@ -2,3 +2,4 @@
+ foo
+ do not process $Id:
+ xxx $
+ +bar
+
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+
+Record all chunks in file a
+
+ $ echo foo > msg
+
+ - do not use "hg record -m" here!
+
+ $ hg record -l msg -d '11 1' a<<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/a b/a
+ 2 hunks, 2 lines changed
+ examine changes to 'a'? [Ynesfdaq?]
+ @@ -1,3 +1,4 @@
+ expand $Id$
+ +foo
+ do not process $Id:
+ xxx $
+ record change 1/2 to 'a'? [Ynesfdaq?]
+ @@ -2,2 +3,3 @@
+ do not process $Id:
+ xxx $
+ +bar
+ record change 2/2 to 'a'? [Ynesfdaq?]
+
+File a should be clean
+
+ $ hg status -A a
+ C a
+
+rollback and revert expansion
+
+ $ cat a
+ expand $Id: a,v 78e0a02d76aa 1970/01/01 00:00:11 test $
+ foo
+ do not process $Id:
+ xxx $
+ bar
+ $ hg --verbose rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+ overwriting a expanding keywords
+ $ hg status a
+ M a
+ $ cat a
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ foo
+ do not process $Id:
+ xxx $
+ bar
+ $ echo '$Id$' > y
+ $ echo '$Id$' > z
+ $ hg add y
+ $ hg commit -Am "rollback only" z
+ $ cat z
+ $Id: z,v 45a5d3adce53 1970/01/01 00:00:00 test $
+ $ hg --verbose rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+ overwriting z shrinking keywords
+
+Only z should be overwritten
+
+ $ hg status a y z
+ M a
+ A y
+ A z
+ $ cat z
+ $Id$
+ $ hg forget y z
+ $ rm y z
+
+record added file alone
+
+ $ hg -v record -l msg -d '12 2' r<<EOF
+ > y
+ > EOF
+ diff --git a/r b/r
+ new file mode 100644
+ examine changes to 'r'? [Ynesfdaq?]
+ r
+ committed changeset 3:82a2f715724d
+ overwriting r expanding keywords
+ - status call required for dirstate.normallookup() check
+ $ hg status r
+ $ hg --verbose rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+ overwriting r shrinking keywords
+ $ hg forget r
+ $ rm msg r
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+record added keyword ignored file
+
+ $ echo '$Id$' > i
+ $ hg add i
+ $ hg --verbose record -d '13 1' -m recignored<<EOF
+ > y
+ > EOF
+ diff --git a/i b/i
+ new file mode 100644
+ examine changes to 'i'? [Ynesfdaq?]
+ i
+ committed changeset 3:9f40ceb5a072
+ $ cat i
+ $Id$
+ $ hg -q rollback
+ $ hg forget i
+ $ rm i
+
+amend
+
+ $ echo amend >> a
+ $ echo amend >> b
+ $ hg -q commit -d '14 1' -m 'prepare amend'
+
+ $ hg --debug commit --amend -d '15 1' -m 'amend without changes' | grep keywords
+ overwriting a expanding keywords
+ $ hg -q id
+ 577e60613a88
+ $ head -1 a
+ expand $Id: a,v 577e60613a88 1970/01/01 00:00:15 test $
+
+ $ hg -q strip -n tip
+
+Test patch queue repo
+
+ $ hg init --mq
+ $ hg qimport -r tip -n mqtest.diff
+ $ hg commit --mq -m mqtest
+
+Keywords should not be expanded in patch
+
+ $ cat .hg/patches/mqtest.diff
+ # HG changeset patch
+ # User User Name <user@example.com>
+ # Date 1 0
+ # Node ID 40a904bbbe4cd4ab0a1f28411e35db26341a40ad
+ # Parent ef63ca68695bc9495032c6fda1350c71e6d256e9
+ cndiff
+
+ diff -r ef63ca68695b -r 40a904bbbe4c c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,2 @@
+ +$Id$
+ +tests for different changenodes
+
+ $ hg qpop
+ popping mqtest.diff
+ patch queue now empty
+
+qgoto, implying qpush, should expand
+
+ $ hg qgoto mqtest.diff
+ applying mqtest.diff
+ now at: mqtest.diff
+ $ cat c
+ $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
+ tests for different changenodes
+ $ hg cat c
+ $Id: c,v 40a904bbbe4c 1970/01/01 00:00:01 user $
+ tests for different changenodes
+
+Keywords should not be expanded in filelog
+
+ $ hg --config 'extensions.keyword=!' cat c
+ $Id$
+ tests for different changenodes
+
+qpop and move on
+
+ $ hg qpop
+ popping mqtest.diff
+ patch queue now empty
+
+Copy and show added kwfiles
+
+ $ hg cp a c
+ $ hg kwfiles
+ a
+ c
+
+Commit and show expansion in original and copy
+
+ $ hg --debug commit -ma2c -d '1 0' -u 'User Name <user@example.com>'
+ c
+ c: copy a:0045e12f6c5791aac80ca6cbfd97709a88307292
+ removing unknown node 40a904bbbe4c from 1-phase boundary
+ overwriting c expanding keywords
+ committed changeset 2:25736cf2f5cbe41f6be4e6784ef6ecf9f3bbcc7d
+ $ cat a c
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ expand $Id: c,v 25736cf2f5cb 1970/01/01 00:00:01 user $
+ do not process $Id:
+ xxx $
+
+Touch copied c and check its status
+
+ $ touch c
+ $ hg status
+
+Copy kwfile to keyword ignored file unexpanding keywords
+
+ $ hg --verbose copy a i
+ copying a to i
+ overwriting i shrinking keywords
+ $ head -n 1 i
+ expand $Id$
+ $ hg forget i
+ $ rm i
+
+Copy ignored file to ignored file: no overwriting
+
+ $ hg --verbose copy b i
+ copying b to i
+ $ hg forget i
+ $ rm i
+
+cp symlink file; hg cp -A symlink file (part1)
+- copied symlink points to kwfile: overwrite
+
+#if symlink
+ $ cp sym i
+ $ ls -l i
+ -rw-r--r--* (glob)
+ $ head -1 i
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ $ hg copy --after --verbose sym i
+ copying sym to i
+ overwriting i shrinking keywords
+ $ head -1 i
+ expand $Id$
+ $ hg forget i
+ $ rm i
+#endif
+
+Test different options of hg kwfiles
+
+ $ hg kwfiles
+ a
+ c
+ $ hg -v kwfiles --ignore
+ I b
+ I sym
+ $ hg kwfiles --all
+ K a
+ K c
+ I b
+ I sym
+
+Diff specific revision
+
+ $ hg diff --rev 1
+ diff -r ef63ca68695b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c * (glob)
+ @@ -0,0 +1,3 @@
+ +expand $Id$
+ +do not process $Id:
+ +xxx $
+
+Status after rollback:
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo commit)
+ working directory now based on revision 1
+ $ hg status
+ A c
+ $ hg update --clean
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+#if symlink
+
+cp symlink file; hg cp -A symlink file (part2)
+- copied symlink points to kw ignored file: do not overwrite
+
+ $ cat a > i
+ $ ln -s i symignored
+ $ hg commit -Am 'fake expansion in ignored and symlink' i symignored
+ $ cp symignored x
+ $ hg copy --after --verbose symignored x
+ copying symignored to x
+ $ head -n 1 x
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ $ hg forget x
+ $ rm x
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo commit)
+ working directory now based on revision 1
+ $ hg update --clean
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm i symignored
+
+#endif
+
+Custom keywordmaps as argument to kwdemo
+
+ $ hg --quiet kwdemo "Xinfo = {author}: {desc}"
+ [extensions]
+ keyword =
+ [keyword]
+ ** =
+ b = ignore
+ demo.txt =
+ i = ignore
+ [keywordset]
+ svn = False
+ [keywordmaps]
+ Xinfo = {author}: {desc}
+ $Xinfo: test: hg keyword configuration and expansion example $
+
+Configure custom keywordmaps
+
+ $ cat <<EOF >>$HGRCPATH
+ > [keywordmaps]
+ > Id = {file} {node|short} {date|rfc822date} {author|user}
+ > Xinfo = {author}: {desc}
+ > EOF
+
+Cat and hg cat files before custom expansion
+
+ $ cat a b
+ expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+ do not process $Id:
+ xxx $
+ ignore $Id$
+ $ hg cat sym a b && echo
+ expand $Id: a ef63ca68695b Thu, 01 Jan 1970 00:00:00 +0000 user $
+ do not process $Id:
+ xxx $
+ ignore $Id$
+ a
+
+Write custom keyword and prepare multiline commit message
+
+ $ echo '$Xinfo$' >> a
+ $ cat <<EOF >> log
+ > firstline
+ > secondline
+ > EOF
+
+Interrupted commit should not change state
+
+ $ hg commit
+ abort: empty commit message
+ [255]
+ $ hg status
+ M a
+ ? c
+ ? log
+
+Commit with multiline message and custom expansion
+
+ $ hg --debug commit -l log -d '2 0' -u 'User Name <user@example.com>'
+ a
+ removing unknown node 40a904bbbe4c from 1-phase boundary
+ overwriting a expanding keywords
+ committed changeset 2:bb948857c743469b22bbf51f7ec8112279ca5d83
+ $ rm log
+
+Stat, verify and show custom expansion (firstline)
+
+ $ hg status
+ ? c
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 3 changesets, 4 total revisions
+ $ cat a b
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+ ignore $Id$
+ $ hg cat sym a b && echo
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+ ignore $Id$
+ a
+
+annotate
+
+ $ hg annotate a
+ 1: expand $Id$
+ 1: do not process $Id:
+ 1: xxx $
+ 2: $Xinfo$
+
+remove with status checks
+
+ $ hg debugrebuildstate
+ $ hg remove a
+ $ hg --debug commit -m rma
+ committed changeset 3:d14c712653769de926994cf7fbb06c8fbd68f012
+ $ hg status
+ ? c
+
+Rollback, revert, and check expansion
+
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revision 2
+ $ hg status
+ R a
+ ? c
+ $ hg revert --no-backup --rev tip a
+ $ cat a
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+
+Clone to test global and local configurations
+
+ $ cd ..
+
+Expansion in destinaton with global configuration
+
+ $ hg --quiet clone Test globalconf
+ $ cat globalconf/a
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+
+No expansion in destination with local configuration in origin only
+
+ $ hg --quiet --config 'keyword.**=ignore' clone Test localconf
+ $ cat localconf/a
+ expand $Id$
+ do not process $Id:
+ xxx $
+ $Xinfo$
+
+Clone to test incoming
+
+ $ hg clone -r1 Test Test-a
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd Test-a
+ $ cat <<EOF >> .hg/hgrc
+ > [paths]
+ > default = ../Test
+ > EOF
+ $ hg incoming
+ comparing with $TESTTMP/Test (glob)
+ searching for changes
+ changeset: 2:bb948857c743
+ tag: tip
+ user: User Name <user@example.com>
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: firstline
+
+Imported patch should not be rejected
+
+ >>> import re
+ >>> text = re.sub(r'(Id.*)', r'\1 rejecttest', open('a').read())
+ >>> open('a', 'wb').write(text)
+ $ hg --debug commit -m'rejects?' -d '3 0' -u 'User Name <user@example.com>'
+ a
+ overwriting a expanding keywords
+ committed changeset 2:85e279d709ffc28c9fdd1b868570985fc3d87082
+ $ hg export -o ../rejecttest.diff tip
+ $ cd ../Test
+ $ hg import ../rejecttest.diff
+ applying ../rejecttest.diff
+ $ cat a b
+ expand $Id: a 4e0994474d25 Thu, 01 Jan 1970 00:00:03 +0000 user $ rejecttest
+ do not process $Id: rejecttest
+ xxx $
+ $Xinfo: User Name <user@example.com>: rejects? $
+ ignore $Id$
+
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo import)
+ working directory now based on revision 2
+ $ hg update --clean
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+kwexpand/kwshrink on selected files
+
+ $ mkdir x
+ $ hg copy a x/a
+ $ hg --verbose kwshrink a
+ overwriting a shrinking keywords
+ - sleep required for dirstate.normal() check
+ $ sleep 1
+ $ hg status a
+ $ hg --verbose kwexpand a
+ overwriting a expanding keywords
+ $ hg status a
+
+kwexpand x/a should abort
+
+ $ hg --verbose kwexpand x/a
+ abort: outstanding uncommitted changes
+ [255]
+ $ cd x
+ $ hg --debug commit -m xa -d '3 0' -u 'User Name <user@example.com>'
+ x/a
+ x/a: copy a:779c764182ce5d43e2b1eb66ce06d7b47bfe342e
+ overwriting x/a expanding keywords
+ committed changeset 3:b4560182a3f9a358179fd2d835c15e9da379c1e4
+ $ cat a
+ expand $Id: x/a b4560182a3f9 Thu, 01 Jan 1970 00:00:03 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: xa $
+
+kwshrink a inside directory x
+
+ $ hg --verbose kwshrink a
+ overwriting x/a shrinking keywords
+ $ cat a
+ expand $Id$
+ do not process $Id:
+ xxx $
+ $Xinfo$
+ $ cd ..
+
+kwexpand nonexistent
+
+ $ hg kwexpand nonexistent
+ nonexistent:* (glob)
+
+
+#if serve
+hg serve
+ - expand with hgweb file
+ - no expansion with hgweb annotate/changeset/filediff
+ - check errors
+
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'file/tip/a/?style=raw'
+ 200 Script output follows
+
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'annotate/tip/a/?style=raw'
+ 200 Script output follows
+
+
+ user@1: expand $Id$
+ user@1: do not process $Id:
+ user@1: xxx $
+ user@2: $Xinfo$
+
+
+
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'rev/tip/?style=raw'
+ 200 Script output follows
+
+
+ # HG changeset patch
+ # User User Name <user@example.com>
+ # Date 3 0
+ # Node ID b4560182a3f9a358179fd2d835c15e9da379c1e4
+ # Parent bb948857c743469b22bbf51f7ec8112279ca5d83
+ xa
+
+ diff -r bb948857c743 -r b4560182a3f9 x/a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/x/a Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,4 @@
+ +expand $Id$
+ +do not process $Id:
+ +xxx $
+ +$Xinfo$
+
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'diff/bb948857c743/a?style=raw'
+ 200 Script output follows
+
+
+ diff -r ef63ca68695b -r bb948857c743 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:02 1970 +0000
+ @@ -1,3 +1,4 @@
+ expand $Id$
+ do not process $Id:
+ xxx $
+ +$Xinfo$
+
+
+
+
+ $ cat errors.log
+#endif
+
+Prepare merge and resolve tests
+
+ $ echo '$Id$' > m
+ $ hg add m
+ $ hg commit -m 4kw
+ $ echo foo >> m
+ $ hg commit -m 5foo
+
+simplemerge
+
+ $ hg update 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo foo >> m
+ $ hg commit -m 6foo
+ created new head
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m simplemerge
+ $ cat m
+ $Id: m 27d48ee14f67 Thu, 01 Jan 1970 00:00:00 +0000 test $
+ foo
+
+conflict: keyword should stay outside conflict zone
+
+ $ hg update 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo bar >> m
+ $ hg commit -m 8bar
+ created new head
+ $ hg merge
+ merging m
+ warning: conflicts during merge.
+ merging m incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ cat m
+ $Id$
+ <<<<<<< local
+ bar
+ =======
+ foo
+ >>>>>>> other
+
+resolve to local
+
+ $ HGMERGE=internal:local hg resolve -a
+ $ hg commit -m localresolve
+ $ cat m
+ $Id: m 800511b3a22d Thu, 01 Jan 1970 00:00:00 +0000 test $
+ bar
+
+Test restricted mode with transplant -b
+
+ $ hg update 6
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ mv a a.bak
+ $ echo foobranch > a
+ $ cat a.bak >> a
+ $ rm a.bak
+ $ hg commit -m 9foobranch
+ $ hg update default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -y transplant -b foo tip
+ applying 4aa30d025d50
+ 4aa30d025d50 transplanted to e00abbf63521
+
+Expansion in changeset but not in file
+
+ $ hg tip -p
+ changeset: 11:e00abbf63521
+ tag: tip
+ parent: 9:800511b3a22d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 9foobranch
+
+ diff -r 800511b3a22d -r e00abbf63521 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,3 +1,4 @@
+ +foobranch
+ expand $Id$
+ do not process $Id:
+ xxx $
+
+ $ head -n 2 a
+ foobranch
+ expand $Id: a e00abbf63521 Thu, 01 Jan 1970 00:00:00 +0000 test $
+
+Turn off expansion
+
+ $ hg -q rollback
+ $ hg -q update -C
+
+kwshrink with unknown file u
+
+ $ cp a u
+ $ hg --verbose kwshrink
+ overwriting a shrinking keywords
+ overwriting m shrinking keywords
+ overwriting x/a shrinking keywords
+
+Keywords shrunk in working directory, but not yet disabled
+ - cat shows unexpanded keywords
+ - hg cat shows expanded keywords
+
+ $ cat a b
+ expand $Id$
+ do not process $Id:
+ xxx $
+ $Xinfo$
+ ignore $Id$
+ $ hg cat sym a b && echo
+ expand $Id: a bb948857c743 Thu, 01 Jan 1970 00:00:02 +0000 user $
+ do not process $Id:
+ xxx $
+ $Xinfo: User Name <user@example.com>: firstline $
+ ignore $Id$
+ a
+
+Now disable keyword expansion
+
+ $ rm "$HGRCPATH"
+ $ cat a b
+ expand $Id$
+ do not process $Id:
+ xxx $
+ $Xinfo$
+ ignore $Id$
+ $ hg cat sym a b && echo
+ expand $Id$
+ do not process $Id:
+ xxx $
+ $Xinfo$
+ ignore $Id$
+ a
+
+ $ cd ..
diff --git a/tests/test-known.t b/tests/test-known.t
new file mode 100644
index 0000000..3c19ebe
--- /dev/null
+++ b/tests/test-known.t
@@ -0,0 +1,38 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+= Test the known() protocol function =
+
+Create a test repository:
+
+ $ hg init repo
+ $ cd repo
+ $ touch a ; hg add a ; hg ci -ma
+ $ touch b ; hg add b ; hg ci -mb
+ $ touch c ; hg add c ; hg ci -mc
+ $ hg log --template '{node}\n'
+ 991a3460af53952d10ec8a295d3d2cc2e5fa9690
+ 0e067c57feba1a5694ca4844f05588bb1bf82342
+ 3903775176ed42b1458a6281db4a0ccf4d9f287a
+ $ cd ..
+
+Test locally:
+
+ $ hg debugknown repo 991a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 3903775176ed42b1458a6281db4a0ccf4d9f287a
+ 111
+ $ hg debugknown repo 000a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 0003775176ed42b1458a6281db4a0ccf4d9f287a
+ 010
+ $ hg debugknown repo
+
+
+Test via HTTP:
+
+ $ hg serve -R repo -p $HGPORT -d --pid-file=hg.pid -E error.log -A access.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg debugknown http://localhost:$HGPORT/ 991a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 3903775176ed42b1458a6281db4a0ccf4d9f287a
+ 111
+ $ hg debugknown http://localhost:$HGPORT/ 000a3460af53952d10ec8a295d3d2cc2e5fa9690 0e067c57feba1a5694ca4844f05588bb1bf82342 0003775176ed42b1458a6281db4a0ccf4d9f287a
+ 010
+ $ hg debugknown http://localhost:$HGPORT/
+
+ $ cat error.log
+
diff --git a/tests/test-largefiles-cache.t b/tests/test-largefiles-cache.t
new file mode 100644
index 0000000..ae6631c
--- /dev/null
+++ b/tests/test-largefiles-cache.t
@@ -0,0 +1,125 @@
+Create user cache directory
+
+ $ USERCACHE=`pwd`/cache; export USERCACHE
+ $ cat <<EOF >> ${HGRCPATH}
+ > [extensions]
+ > hgext.largefiles=
+ > [largefiles]
+ > usercache=${USERCACHE}
+ > EOF
+ $ mkdir -p ${USERCACHE}
+
+Create source repo, and commit adding largefile.
+
+ $ hg init src
+ $ cd src
+ $ echo large > large
+ $ hg add --large large
+ $ hg commit -m 'add largefile'
+ $ cd ..
+
+Discard all cached largefiles in USERCACHE
+
+ $ rm -rf ${USERCACHE}
+
+Create mirror repo, and pull from source without largefile:
+"pull" is used instead of "clone" for suppression of (1) updating to
+tip (= cahcing largefile from source repo), and (2) recording source
+repo as "default" path in .hg/hgrc.
+
+ $ hg init mirror
+ $ cd mirror
+ $ hg pull ../src
+ pulling from ../src
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ caching new largefiles
+ 0 largefiles cached
+
+Update working directory to "tip", which requires largefile("large"),
+but there is no cache file for it. So, hg must treat it as
+"missing"(!) file.
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ large: can't get file locally
+ (no default or default-push path set in hgrc)
+ 0 largefiles updated, 0 removed
+ $ hg status
+ ! large
+
+Update working directory to null: this cleanup .hg/largefiles/dirstate
+
+ $ hg update null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ getting changed largefiles
+ 0 largefiles updated, 0 removed
+
+Update working directory to tip, again.
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ large: can't get file locally
+ (no default or default-push path set in hgrc)
+ 0 largefiles updated, 0 removed
+ $ hg status
+ ! large
+ $ cd ..
+
+#if unix-permissions
+
+Portable way to print file permissions:
+
+ $ cat > ls-l.py <<EOF
+ > #!/usr/bin/env python
+ > import sys, os
+ > path = sys.argv[1]
+ > print '%03o' % (os.lstat(path).st_mode & 0777)
+ > EOF
+ $ chmod +x ls-l.py
+
+Test that files in .hg/largefiles inherit mode from .hg/store, not
+from file in working copy:
+
+ $ cd src
+ $ chmod 750 .hg/store
+ $ chmod 660 large
+ $ echo change >> large
+ $ hg commit -m change
+ $ ../ls-l.py .hg/largefiles/e151b474069de4ca6898f67ce2f2a7263adf8fea
+ 640
+
+Test permission of with files in .hg/largefiles created by update:
+
+ $ cd ../mirror
+ $ rm -r "$USERCACHE" .hg/largefiles # avoid links
+ $ chmod 750 .hg/store
+ $ hg pull ../src --update -q
+ $ ../ls-l.py .hg/largefiles/e151b474069de4ca6898f67ce2f2a7263adf8fea
+ 640
+
+Test permission of files created by push:
+
+ $ hg serve -R ../src -d -p $HGPORT --pid-file hg.pid \
+ > --config "web.allow_push=*" --config web.push_ssl=no
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ echo change >> large
+ $ hg commit -m change
+
+ $ rm -r "$USERCACHE"
+
+ $ hg push -q http://localhost:$HGPORT/
+
+ $ ../ls-l.py ../src/.hg/largefiles/b734e14a0971e370408ab9bce8d56d8485e368a9
+ 640
+
+ $ cd ..
+
+#endif
diff --git a/tests/test-largefiles-small-disk.t b/tests/test-largefiles-small-disk.t
new file mode 100644
index 0000000..feb11e3
--- /dev/null
+++ b/tests/test-largefiles-small-disk.t
@@ -0,0 +1,67 @@
+Test how largefiles abort in case the disk runs full
+
+ $ cat > criple.py <<EOF
+ > import os, errno, shutil
+ > from mercurial import util
+ > #
+ > # this makes the original largefiles code abort:
+ > def copyfileobj(fsrc, fdst, length=16*1024):
+ > fdst.write(fsrc.read(4))
+ > raise IOError(errno.ENOSPC, os.strerror(errno.ENOSPC))
+ > shutil.copyfileobj = copyfileobj
+ > #
+ > # this makes the rewritten code abort:
+ > def filechunkiter(f, size=65536, limit=None):
+ > yield f.read(4)
+ > raise IOError(errno.ENOSPC, os.strerror(errno.ENOSPC))
+ > util.filechunkiter = filechunkiter
+ > #
+ > def oslink(src, dest):
+ > raise OSError("no hardlinks, try copying instead")
+ > util.oslink = oslink
+ > EOF
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "largefiles =" >> $HGRCPATH
+
+ $ hg init alice
+ $ cd alice
+ $ echo "this is a very big file" > big
+ $ hg add --large big
+ $ hg commit --config extensions.criple=$TESTTMP/criple.py -m big
+ abort: No space left on device
+ [255]
+
+The largefile is not created in .hg/largefiles:
+
+ $ ls .hg/largefiles
+ dirstate
+
+The user cache is not even created:
+
+ >>> import os; os.path.exists("$HOME/.cache/largefiles/")
+ False
+
+Make the commit with space on the device:
+
+ $ hg commit -m big
+
+Now make a clone with a full disk, and make sure lfutil.link function
+makes copies instead of hardlinks:
+
+ $ cd ..
+ $ hg --config extensions.criple=$TESTTMP/criple.py clone --pull alice bob
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ abort: No space left on device
+ [255]
+
+The largefile is not created in .hg/largefiles:
+
+ $ ls bob/.hg/largefiles
diff --git a/tests/test-largefiles.t b/tests/test-largefiles.t
new file mode 100644
index 0000000..c64dd73
--- /dev/null
+++ b/tests/test-largefiles.t
@@ -0,0 +1,1447 @@
+ $ USERCACHE="$TESTTMP/cache"; export USERCACHE
+ $ mkdir "${USERCACHE}"
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > largefiles=
+ > purge=
+ > rebase=
+ > transplant=
+ > [phases]
+ > publish=False
+ > [largefiles]
+ > minsize=2
+ > patterns=glob:**.dat
+ > usercache=${USERCACHE}
+ > [hooks]
+ > precommit=sh -c "echo \"Invoking status precommit hook\"; hg status"
+ > EOF
+
+Create the repo with a couple of revisions of both large and normal
+files, testing that status correctly shows largefiles and that summary output
+is correct.
+
+ $ hg init a
+ $ cd a
+ $ mkdir sub
+ $ echo normal1 > normal1
+ $ echo normal2 > sub/normal2
+ $ echo large1 > large1
+ $ echo large2 > sub/large2
+ $ hg add normal1 sub/normal2
+ $ hg add --large large1 sub/large2
+ $ hg commit -m "add files"
+ Invoking status precommit hook
+ A large1
+ A normal1
+ A sub/large2
+ A sub/normal2
+ $ echo normal11 > normal1
+ $ echo normal22 > sub/normal2
+ $ echo large11 > large1
+ $ echo large22 > sub/large2
+ $ hg commit -m "edit files"
+ Invoking status precommit hook
+ M large1
+ M normal1
+ M sub/large2
+ M sub/normal2
+ $ hg sum --large
+ parent: 1:ce8896473775 tip
+ edit files
+ branch: default
+ commit: (clean)
+ update: (current)
+ largefiles: No remote repo
+
+Commit preserved largefile contents.
+
+ $ cat normal1
+ normal11
+ $ cat large1
+ large11
+ $ cat sub/normal2
+ normal22
+ $ cat sub/large2
+ large22
+
+Test status, subdir and unknown files
+
+ $ echo unknown > sub/unknown
+ $ hg st --all
+ ? sub/unknown
+ C large1
+ C normal1
+ C sub/large2
+ C sub/normal2
+ $ hg st --all sub
+ ? sub/unknown
+ C sub/large2
+ C sub/normal2
+ $ rm sub/unknown
+
+Remove both largefiles and normal files.
+
+ $ hg remove normal1 large1
+ $ hg status large1
+ R large1
+ $ hg commit -m "remove files"
+ Invoking status precommit hook
+ R large1
+ R normal1
+ $ ls
+ sub
+ $ echo "testlargefile" > large1-test
+ $ hg add --large large1-test
+ $ hg st
+ A large1-test
+ $ hg rm large1-test
+ not removing large1-test: file has been marked for add (use forget to undo)
+ $ hg st
+ A large1-test
+ $ hg forget large1-test
+ $ hg st
+ ? large1-test
+ $ rm large1-test
+
+Copy both largefiles and normal files (testing that status output is correct).
+
+ $ hg cp sub/normal2 normal1
+ $ hg cp sub/large2 large1
+ $ hg commit -m "copy files"
+ Invoking status precommit hook
+ A large1
+ A normal1
+ $ cat normal1
+ normal22
+ $ cat large1
+ large22
+
+Test moving largefiles and verify that normal files are also unaffected.
+
+ $ hg mv normal1 normal3
+ $ hg mv large1 large3
+ $ hg mv sub/normal2 sub/normal4
+ $ hg mv sub/large2 sub/large4
+ $ hg commit -m "move files"
+ Invoking status precommit hook
+ A large3
+ A normal3
+ A sub/large4
+ A sub/normal4
+ R large1
+ R normal1
+ R sub/large2
+ R sub/normal2
+ $ cat normal3
+ normal22
+ $ cat large3
+ large22
+ $ cat sub/normal4
+ normal22
+ $ cat sub/large4
+ large22
+
+Test copies and moves from a directory other than root (issue3516)
+
+ $ cd ..
+ $ hg init lf_cpmv
+ $ cd lf_cpmv
+ $ mkdir dira
+ $ mkdir dira/dirb
+ $ touch dira/dirb/largefile
+ $ hg add --large dira/dirb/largefile
+ $ hg commit -m "added"
+ Invoking status precommit hook
+ A dira/dirb/largefile
+ $ cd dira
+ $ hg cp dirb/largefile foo/largefile
+ $ hg ci -m "deep copy"
+ Invoking status precommit hook
+ A dira/foo/largefile
+ $ find . | sort
+ .
+ ./dirb
+ ./dirb/largefile
+ ./foo
+ ./foo/largefile
+ $ hg mv foo/largefile baz/largefile
+ $ hg ci -m "moved"
+ Invoking status precommit hook
+ A dira/baz/largefile
+ R dira/foo/largefile
+ $ find . | sort
+ .
+ ./baz
+ ./baz/largefile
+ ./dirb
+ ./dirb/largefile
+ ./foo
+ $ cd ../../a
+
+#if hgweb
+Test display of largefiles in hgweb
+
+ $ hg serve -d -p $HGPORT --pid-file ../hg.pid
+ $ cat ../hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/?style=raw'
+ 200 Script output follows
+
+
+ drwxr-xr-x sub
+ -rw-r--r-- 41 large3
+ -rw-r--r-- 9 normal3
+
+
+ $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/sub/?style=raw'
+ 200 Script output follows
+
+
+ -rw-r--r-- 41 large4
+ -rw-r--r-- 9 normal4
+
+
+ $ "$TESTDIR/killdaemons.py"
+#endif
+
+Test archiving the various revisions. These hit corner cases known with
+archiving.
+
+ $ hg archive -r 0 ../archive0
+ $ hg archive -r 1 ../archive1
+ $ hg archive -r 2 ../archive2
+ $ hg archive -r 3 ../archive3
+ $ hg archive -r 4 ../archive4
+ $ cd ../archive0
+ $ cat normal1
+ normal1
+ $ cat large1
+ large1
+ $ cat sub/normal2
+ normal2
+ $ cat sub/large2
+ large2
+ $ cd ../archive1
+ $ cat normal1
+ normal11
+ $ cat large1
+ large11
+ $ cat sub/normal2
+ normal22
+ $ cat sub/large2
+ large22
+ $ cd ../archive2
+ $ ls
+ sub
+ $ cat sub/normal2
+ normal22
+ $ cat sub/large2
+ large22
+ $ cd ../archive3
+ $ cat normal1
+ normal22
+ $ cat large1
+ large22
+ $ cat sub/normal2
+ normal22
+ $ cat sub/large2
+ large22
+ $ cd ../archive4
+ $ cat normal3
+ normal22
+ $ cat large3
+ large22
+ $ cat sub/normal4
+ normal22
+ $ cat sub/large4
+ large22
+
+Commit corner case: specify files to commit.
+
+ $ cd ../a
+ $ echo normal3 > normal3
+ $ echo large3 > large3
+ $ echo normal4 > sub/normal4
+ $ echo large4 > sub/large4
+ $ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again"
+ Invoking status precommit hook
+ M large3
+ M normal3
+ M sub/large4
+ M sub/normal4
+ $ cat normal3
+ normal3
+ $ cat large3
+ large3
+ $ cat sub/normal4
+ normal4
+ $ cat sub/large4
+ large4
+
+One more commit corner case: commit from a subdirectory.
+
+ $ cd ../a
+ $ echo normal33 > normal3
+ $ echo large33 > large3
+ $ echo normal44 > sub/normal4
+ $ echo large44 > sub/large4
+ $ cd sub
+ $ hg commit -m "edit files yet again"
+ Invoking status precommit hook
+ M large3
+ M normal3
+ M sub/large4
+ M sub/normal4
+ $ cat ../normal3
+ normal33
+ $ cat ../large3
+ large33
+ $ cat normal4
+ normal44
+ $ cat large4
+ large44
+
+Committing standins is not allowed.
+
+ $ cd ..
+ $ echo large3 > large3
+ $ hg commit .hglf/large3 -m "try to commit standin"
+ abort: file ".hglf/large3" is a largefile standin
+ (commit the largefile itself instead)
+ [255]
+
+Corner cases for adding largefiles.
+
+ $ echo large5 > large5
+ $ hg add --large large5
+ $ hg add --large large5
+ large5 already a largefile
+ $ mkdir sub2
+ $ echo large6 > sub2/large6
+ $ echo large7 > sub2/large7
+ $ hg add --large sub2
+ adding sub2/large6 as a largefile (glob)
+ adding sub2/large7 as a largefile (glob)
+ $ hg st
+ M large3
+ A large5
+ A sub2/large6
+ A sub2/large7
+
+Test "hg status" with combination of 'file pattern' and 'directory
+pattern' for largefiles:
+
+ $ hg status sub2/large6 sub2
+ A sub2/large6
+ A sub2/large7
+
+Config settings (pattern **.dat, minsize 2 MB) are respected.
+
+ $ echo testdata > test.dat
+ $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
+ $ hg add
+ adding reallylarge as a largefile
+ adding test.dat as a largefile
+
+Test that minsize and --lfsize handle float values;
+also tests that --lfsize overrides largefiles.minsize.
+(0.250 MB = 256 kB = 262144 B)
+
+ $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null
+ $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null
+ $ hg --config largefiles.minsize=.25 add
+ adding ratherlarge as a largefile
+ adding medium
+ $ hg forget medium
+ $ hg --config largefiles.minsize=.25 add --lfsize=.125
+ adding medium as a largefile
+ $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null
+ $ hg --config largefiles.minsize=.25 add --lfsize=.125
+ adding notlarge
+ $ hg forget notlarge
+
+Test forget on largefiles.
+
+ $ hg forget large3 large5 test.dat reallylarge ratherlarge medium
+ $ hg commit -m "add/edit more largefiles"
+ Invoking status precommit hook
+ A sub2/large6
+ A sub2/large7
+ R large3
+ ? large5
+ ? medium
+ ? notlarge
+ ? ratherlarge
+ ? reallylarge
+ ? test.dat
+ $ hg st
+ ? large3
+ ? large5
+ ? medium
+ ? notlarge
+ ? ratherlarge
+ ? reallylarge
+ ? test.dat
+
+Purge with largefiles: verify that largefiles are still in the working
+dir after a purge.
+
+ $ hg purge --all
+ $ cat sub/large4
+ large44
+ $ cat sub2/large6
+ large6
+ $ cat sub2/large7
+ large7
+
+Test addremove: verify that files that should be added as largfiles are added as
+such and that already-existing largfiles are not added as normal files by
+accident.
+
+ $ rm normal3
+ $ rm sub/large4
+ $ echo "testing addremove with patterns" > testaddremove.dat
+ $ echo "normaladdremove" > normaladdremove
+ $ hg addremove
+ removing sub/large4
+ adding testaddremove.dat as a largefile
+ removing normal3
+ adding normaladdremove
+
+Test addremove with -R
+
+ $ hg up -C
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ rm normal3
+ $ rm sub/large4
+ $ echo "testing addremove with patterns" > testaddremove.dat
+ $ echo "normaladdremove" > normaladdremove
+ $ cd ..
+ $ hg -R a addremove
+ removing sub/large4
+ adding a/testaddremove.dat as a largefile (glob)
+ removing normal3
+ adding normaladdremove
+ $ cd a
+
+Test 3364
+ $ hg clone . ../addrm
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ cd ../addrm
+ $ cat >> .hg/hgrc <<EOF
+ > [hooks]
+ > post-commit.stat=sh -c "echo \"Invoking status postcommit hook\"; hg status -A"
+ > EOF
+ $ touch foo
+ $ hg add --large foo
+ $ hg ci -m "add foo"
+ Invoking status precommit hook
+ A foo
+ Invoking status postcommit hook
+ C foo
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ $ rm foo
+ $ hg st
+ ! foo
+hmm.. no precommit invoked, but there is a postcommit??
+ $ hg ci -m "will not checkin"
+ nothing changed
+ Invoking status postcommit hook
+ ! foo
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ [1]
+ $ hg addremove
+ removing foo
+ $ hg st
+ R foo
+ $ hg ci -m "used to say nothing changed"
+ Invoking status precommit hook
+ R foo
+ Invoking status postcommit hook
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ $ hg st
+
+Test 3507 (both normal files and largefiles were a problem)
+
+ $ touch normal
+ $ touch large
+ $ hg add normal
+ $ hg add --large large
+ $ hg ci -m "added"
+ Invoking status precommit hook
+ A large
+ A normal
+ Invoking status postcommit hook
+ C large
+ C normal
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ $ hg remove normal
+ $ hg addremove --traceback
+ $ hg ci -m "addremoved normal"
+ Invoking status precommit hook
+ R normal
+ Invoking status postcommit hook
+ C large
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ $ hg up -C '.^'
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 0 largefiles updated, 0 removed
+ $ hg remove large
+ $ hg addremove --traceback
+ $ hg ci -m "removed large"
+ Invoking status precommit hook
+ R large
+ created new head
+ Invoking status postcommit hook
+ C normal
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+
+Test that a standin can't be added as a large file
+
+ $ touch large
+ $ hg add --large large
+ $ hg ci -m "add"
+ Invoking status precommit hook
+ A large
+ Invoking status postcommit hook
+ C large
+ C normal
+ C normal3
+ C sub/large4
+ C sub/normal4
+ C sub2/large6
+ C sub2/large7
+ $ hg remove large
+ $ touch large
+ $ hg addremove --config largefiles.patterns=**large --traceback
+ adding large as a largefile
+
+Test that outgoing --large works (with revsets too)
+ $ hg outgoing --rev '.^' --large
+ comparing with $TESTTMP/a (glob)
+ searching for changes
+ changeset: 8:c02fd3b77ec4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ changeset: 9:289dd08c9bbb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: used to say nothing changed
+
+ changeset: 10:34f23ac6ac12
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: added
+
+ changeset: 12:710c1b2f523c
+ parent: 10:34f23ac6ac12
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: removed large
+
+ searching for changes
+ largefiles to upload:
+ large
+ foo
+
+ $ cd ../a
+
+Clone a largefiles repo.
+
+ $ hg clone . ../b
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ cd ../b
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat normal3
+ normal33
+ $ cat sub/normal4
+ normal44
+ $ cat sub/large4
+ large44
+ $ cat sub2/large6
+ large6
+ $ cat sub2/large7
+ large7
+ $ cd ..
+ $ hg clone a -r 3 c
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 10 changes to 4 files
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 2 largefiles updated, 0 removed
+ $ cd c
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat normal1
+ normal22
+ $ cat large1
+ large22
+ $ cat sub/normal2
+ normal22
+ $ cat sub/large2
+ large22
+
+Old revisions of a clone have correct largefiles content (this also
+tests update).
+
+ $ hg update -r 1
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ cat large1
+ large11
+ $ cat sub/large2
+ large22
+ $ cd ..
+
+Test cloning with --all-largefiles flag
+
+ $ rm "${USERCACHE}"/*
+ $ hg clone --all-largefiles a a-backup
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ 8 additional largefiles cached
+
+ $ hg clone --all-largefiles a ssh://localhost/a
+ abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
+ [255]
+
+Test pulling with --all-largefiles flag
+
+ $ rm -Rf a-backup
+ $ hg clone -r 1 a a-backup
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 8 changes to 4 files
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 2 largefiles updated, 0 removed
+ $ rm "${USERCACHE}"/*
+ $ cd a-backup
+ $ hg pull --all-largefiles
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 16 changes to 8 files
+ (run 'hg update' to get a working copy)
+ caching new largefiles
+ 3 largefiles cached
+ 3 additional largefiles cached
+ $ cd ..
+
+Rebasing between two repositories does not revert largefiles to old
+revisions (this was a very bad bug that took a lot of work to fix).
+
+ $ hg clone a d
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ cd b
+ $ echo large4-modified > sub/large4
+ $ echo normal3-modified > normal3
+ $ hg commit -m "modify normal file and largefile in repo b"
+ Invoking status precommit hook
+ M normal3
+ M sub/large4
+ $ cd ../d
+ $ echo large6-modified > sub2/large6
+ $ echo normal4-modified > sub/normal4
+ $ hg commit -m "modify normal file largefile in repo d"
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
+ $ cd ..
+ $ hg clone d e
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ cd d
+ $ hg pull --rebase ../b
+ pulling from ../b
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files (+1 heads)
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
+ saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
+ nothing to rebase
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat normal3
+ normal3-modified
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-modified
+ $ cat sub2/large6
+ large6-modified
+ $ cat sub2/large7
+ large7
+ $ cd ../e
+ $ hg pull ../b
+ pulling from ../b
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ caching new largefiles
+ 0 largefiles cached
+ $ hg rebase
+ Invoking status precommit hook
+ M sub/normal4
+ M sub2/large6
+ saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat normal3
+ normal3-modified
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-modified
+ $ cat sub2/large6
+ large6-modified
+ $ cat sub2/large7
+ large7
+
+Rollback on largefiles.
+
+ $ echo large4-modified-again > sub/large4
+ $ hg commit -m "Modify large4 again"
+ Invoking status precommit hook
+ M sub/large4
+ $ hg rollback
+ repository tip rolled back to revision 9 (undo commit)
+ working directory now based on revision 9
+ $ hg st
+ M sub/large4
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat sub/large4
+ large4-modified-again
+
+"update --check" refuses to update with uncommitted changes.
+ $ hg update --check 8
+ abort: uncommitted local changes
+ [255]
+
+"update --clean" leaves correct largefiles in working copy.
+
+ $ hg update --clean
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ cat normal3
+ normal3-modified
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-modified
+ $ cat sub2/large6
+ large6-modified
+ $ cat sub2/large7
+ large7
+
+Now "update check" is happy.
+ $ hg update --check 8
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ hg update --check
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+
+Test removing empty largefiles directories on update
+ $ test -d sub2 && echo "sub2 exists"
+ sub2 exists
+ $ hg update -q null
+ $ test -d sub2 && echo "error: sub2 should not exist anymore"
+ [1]
+ $ hg update -q
+
+Test hg remove removes empty largefiles directories
+ $ test -d sub2 && echo "sub2 exists"
+ sub2 exists
+ $ hg remove sub2/*
+ $ test -d sub2 && echo "error: sub2 should not exist anymore"
+ [1]
+ $ hg revert sub2/large6 sub2/large7
+
+"revert" works on largefiles (and normal files too).
+ $ echo hack3 >> normal3
+ $ echo hack4 >> sub/normal4
+ $ echo hack4 >> sub/large4
+ $ rm sub2/large6
+ $ hg revert sub2/large6
+ $ hg rm sub2/large6
+ $ echo new >> sub2/large8
+ $ hg add --large sub2/large8
+# XXX we don't really want to report that we're reverting the standin;
+# that's just an implementation detail. But I don't see an obvious fix. ;-(
+ $ hg revert sub
+ reverting .hglf/sub/large4 (glob)
+ reverting sub/normal4 (glob)
+ $ hg status
+ M normal3
+ A sub2/large8
+ R sub2/large6
+ ? sub/large4.orig
+ ? sub/normal4.orig
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-modified
+ $ hg revert -a --no-backup
+ undeleting .hglf/sub2/large6 (glob)
+ forgetting .hglf/sub2/large8 (glob)
+ reverting normal3
+ $ hg status
+ ? sub/large4.orig
+ ? sub/normal4.orig
+ ? sub2/large8
+ $ cat normal3
+ normal3-modified
+ $ cat sub2/large6
+ large6-modified
+ $ rm sub/*.orig sub2/large8
+
+revert some files to an older revision
+ $ hg revert --no-backup -r 8 sub2
+ reverting .hglf/sub2/large6 (glob)
+ $ cat sub2/large6
+ large6
+ $ hg revert --no-backup -C -r '.^' sub2
+ reverting .hglf/sub2/large6 (glob)
+ $ hg revert --no-backup sub2
+ reverting .hglf/sub2/large6 (glob)
+ $ hg status
+
+"verify --large" actually verifies largefiles
+
+ $ hg verify --large
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 10 files, 10 changesets, 28 total revisions
+ searching 1 changesets for largefiles
+ verified existence of 3 revisions of 3 largefiles
+
+Merging does not revert to old versions of largefiles and also check
+that merging after having pulled from a non-default remote works
+correctly.
+
+ $ cd ..
+ $ hg clone -r 7 e temp
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 24 changes to 10 files
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ hg clone temp f
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+# Delete the largefiles in the largefiles system cache so that we have an
+# opportunity to test that caching after a pull works.
+ $ rm "${USERCACHE}"/*
+ $ cd f
+ $ echo "large4-merge-test" > sub/large4
+ $ hg commit -m "Modify large4 to test merge"
+ Invoking status precommit hook
+ M sub/large4
+ $ hg pull ../e
+ pulling from ../e
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 4 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ caching new largefiles
+ 2 largefiles cached
+ $ hg merge
+ merging sub/large4
+ largefile sub/large4 has a merge conflict
+ keep (l)ocal or take (o)ther? l
+ 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ hg commit -m "Merge repos e and f"
+ Invoking status precommit hook
+ M normal3
+ M sub/normal4
+ M sub2/large6
+ $ cat normal3
+ normal3-modified
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-merge-test
+ $ cat sub2/large6
+ large6-modified
+ $ cat sub2/large7
+ large7
+
+Test status after merging with a branch that introduces a new largefile:
+
+ $ echo large > large
+ $ hg add --large large
+ $ hg commit -m 'add largefile'
+ Invoking status precommit hook
+ A large
+ $ hg update -q ".^"
+ $ echo change >> normal3
+ $ hg commit -m 'some change'
+ Invoking status precommit hook
+ M normal3
+ created new head
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ hg status
+ M large
+
+Test that a normal file and a largefile with the same name and path cannot
+coexist.
+
+ $ rm sub2/large7
+ $ echo "largeasnormal" > sub2/large7
+ $ hg add sub2/large7
+ sub2/large7 already a largefile
+
+Test that transplanting a largefile change works correctly.
+
+ $ cd ..
+ $ hg clone -r 8 d g
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 26 changes to 10 files
+ updating to branch default
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 3 largefiles updated, 0 removed
+ $ cd g
+ $ hg transplant -s ../d 598410d3eb9a
+ searching for changes
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
+ 9:598410d3eb9a modify normal file largefile in repo d
+ 8:a381d2c8c80e modify normal file and largefile in repo b
+ 7:daea875e9014 add/edit more largefiles
+ 6:4355d653f84f edit files yet again
+ 5:9d5af5072dbd edit files again
+ 4:74c02385b94c move files
+ 3:9e8fbc4bce62 copy files
+ 2:51a0ae4d5864 remove files
+ 1:ce8896473775 edit files
+ 0:30d30fe6a5be add files
+ $ cat normal3
+ normal3-modified
+ $ cat sub/normal4
+ normal4-modified
+ $ cat sub/large4
+ large4-modified
+ $ cat sub2/large6
+ large6-modified
+ $ cat sub2/large7
+ large7
+
+Cat a largefile
+ $ hg cat normal3
+ normal3-modified
+ $ hg cat sub/large4
+ large4-modified
+ $ rm "${USERCACHE}"/*
+ $ hg cat -r a381d2c8c80e -o cat.out sub/large4
+ $ cat cat.out
+ large4-modified
+ $ rm cat.out
+ $ hg cat -r a381d2c8c80e normal3
+ normal3-modified
+ $ hg cat -r '.^' normal3
+ normal3-modified
+ $ hg cat -r '.^' sub/large4
+ large4-modified
+
+Test that renaming a largefile results in correct output for status
+
+ $ hg rename sub/large4 large4-renamed
+ $ hg commit -m "test rename output"
+ Invoking status precommit hook
+ A large4-renamed
+ R sub/large4
+ $ cat large4-renamed
+ large4-modified
+ $ cd sub2
+ $ hg rename large6 large6-renamed
+ $ hg st
+ A sub2/large6-renamed
+ R sub2/large6
+ $ cd ..
+
+Test --normal flag
+
+ $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
+ $ hg add --normal --large new-largefile
+ abort: --normal cannot be used with --large
+ [255]
+ $ hg add --normal new-largefile
+ new-largefile: up to 69 MB of RAM may be required to manage this file
+ (use 'hg revert new-largefile' to cancel the pending addition)
+ $ cd ..
+
+#if serve
+vanilla clients not locked out from largefiles servers on vanilla repos
+ $ mkdir r1
+ $ cd r1
+ $ hg init
+ $ echo c1 > f1
+ $ hg add f1
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
+ $ cd ..
+ $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+largefiles clients still work with vanilla servers
+ $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg clone http://localhost:$HGPORT1 r3
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+#endif
+
+
+vanilla clients locked out from largefiles http repos
+ $ mkdir r4
+ $ cd r4
+ $ hg init
+ $ echo c1 > f1
+ $ hg add --large f1
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
+ $ cd ..
+
+#if serve
+ $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
+ abort: remote error:
+
+ This repository uses the largefiles extension.
+
+ Please enable it in your Mercurial config file.
+ [255]
+
+used all HGPORTs, kill all daemons
+ $ "$TESTDIR/killdaemons.py"
+#endif
+
+vanilla clients locked out from largefiles ssh repos
+ $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
+ abort: remote error:
+
+ This repository uses the largefiles extension.
+
+ Please enable it in your Mercurial config file.
+ [255]
+
+#if serve
+
+largefiles clients refuse to push largefiles repos to vanilla servers
+ $ mkdir r6
+ $ cd r6
+ $ hg init
+ $ echo c1 > f1
+ $ hg add f1
+ $ hg commit -m "m1"
+ Invoking status precommit hook
+ A f1
+ $ cat >> .hg/hgrc <<!
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > !
+ $ cd ..
+ $ hg clone r6 r7
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd r7
+ $ echo c2 > f2
+ $ hg add --large f2
+ $ hg commit -m "m2"
+ Invoking status precommit hook
+ A f2
+ $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
+ $ cat ../hg.pid >> $DAEMON_PIDS
+ $ hg push http://localhost:$HGPORT
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: http://localhost:$HGPORT/ does not appear to be a largefile store
+ [255]
+ $ cd ..
+
+putlfile errors are shown (issue3123)
+Corrupt the cached largefile in r7 and in the usercache (required for testing on vfat)
+ $ echo corruption > "$TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8"
+ $ echo corruption > "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
+ $ hg init empty
+ $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
+ > --config 'web.allow_push=*' --config web.push_ssl=False
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg push -R r7 http://localhost:$HGPORT1
+ pushing to http://localhost:$HGPORT1/
+ searching for changes
+ remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
+ abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
+ [255]
+ $ rm -rf empty
+
+Push a largefiles repository to a served empty repository
+ $ hg init r8
+ $ echo c3 > r8/f1
+ $ hg add --large r8/f1 -R r8
+ $ hg commit -m "m1" -R r8
+ Invoking status precommit hook
+ A f1
+ $ hg init empty
+ $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
+ > --config 'web.allow_push=*' --config web.push_ssl=False
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ rm "${USERCACHE}"/*
+ $ hg push -R r8 http://localhost:$HGPORT2
+ pushing to http://localhost:$HGPORT2/
+ searching for changes
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ rm -rf empty
+
+used all HGPORTs, kill all daemons
+ $ "$TESTDIR/killdaemons.py"
+
+#endif
+
+
+#if unix-permissions
+
+Clone a local repository owned by another user
+We have to simulate that here by setting $HOME and removing write permissions
+ $ ORIGHOME="$HOME"
+ $ mkdir alice
+ $ HOME="`pwd`/alice"
+ $ cd alice
+ $ hg init pubrepo
+ $ cd pubrepo
+ $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
+ $ hg add --large a-large-file
+ $ hg commit -m "Add a large file"
+ Invoking status precommit hook
+ A a-large-file
+ $ cd ..
+ $ chmod -R a-w pubrepo
+ $ cd ..
+ $ mkdir bob
+ $ HOME="`pwd`/bob"
+ $ cd bob
+ $ hg clone --pull ../alice/pubrepo pubrepo
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ cd ..
+ $ chmod -R u+w alice/pubrepo
+ $ HOME="$ORIGHOME"
+
+#endif
+
+#if symlink
+
+Symlink to a large largefile should behave the same as a symlink to a normal file
+ $ hg init largesymlink
+ $ cd largesymlink
+ $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
+ $ hg add --large largefile
+ $ hg commit -m "commit a large file"
+ Invoking status precommit hook
+ A largefile
+ $ ln -s largefile largelink
+ $ hg add largelink
+ $ hg commit -m "commit a large symlink"
+ Invoking status precommit hook
+ A largelink
+ $ rm -f largelink
+ $ hg up >/dev/null
+ $ test -f largelink
+ [1]
+ $ test -L largelink
+ [1]
+ $ rm -f largelink # make next part of the test independent of the previous
+ $ hg up -C >/dev/null
+ $ test -f largelink
+ $ test -L largelink
+ $ cd ..
+
+#endif
+
+test for pattern matching on 'hg status':
+to boost performance, largefiles checks whether specified patterns are
+related to largefiles in working directory (NOT to STANDIN) or not.
+
+ $ hg init statusmatch
+ $ cd statusmatch
+
+ $ mkdir -p a/b/c/d
+ $ echo normal > a/b/c/d/e.normal.txt
+ $ hg add a/b/c/d/e.normal.txt
+ $ echo large > a/b/c/d/e.large.txt
+ $ hg add --large a/b/c/d/e.large.txt
+ $ mkdir -p a/b/c/x
+ $ echo normal > a/b/c/x/y.normal.txt
+ $ hg add a/b/c/x/y.normal.txt
+ $ hg commit -m 'add files'
+ Invoking status precommit hook
+ A a/b/c/d/e.large.txt
+ A a/b/c/d/e.normal.txt
+ A a/b/c/x/y.normal.txt
+
+(1) no pattern: no performance boost
+ $ hg status -A
+ C a/b/c/d/e.large.txt
+ C a/b/c/d/e.normal.txt
+ C a/b/c/x/y.normal.txt
+
+(2) pattern not related to largefiles: performance boost
+ $ hg status -A a/b/c/x
+ C a/b/c/x/y.normal.txt
+
+(3) pattern related to largefiles: no performance boost
+ $ hg status -A a/b/c/d
+ C a/b/c/d/e.large.txt
+ C a/b/c/d/e.normal.txt
+
+(4) pattern related to STANDIN (not to largefiles): performance boost
+ $ hg status -A .hglf/a
+ C .hglf/a/b/c/d/e.large.txt
+
+(5) mixed case: no performance boost
+ $ hg status -A a/b/c/x a/b/c/d
+ C a/b/c/d/e.large.txt
+ C a/b/c/d/e.normal.txt
+ C a/b/c/x/y.normal.txt
+
+verify that largefiles doesn't break filesets
+
+ $ hg log --rev . --exclude "set:binary()"
+ changeset: 0:41bd42f10efa
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add files
+
+verify that large files in subrepos handled properly
+ $ hg init subrepo
+ $ echo "subrepo = subrepo" > .hgsub
+ $ hg add .hgsub
+ $ hg ci -m "add subrepo"
+ Invoking status precommit hook
+ A .hgsub
+ ? .hgsubstate
+ $ echo "rev 1" > subrepo/large.txt
+ $ hg -R subrepo add --large subrepo/large.txt
+ $ hg sum
+ parent: 1:8ee150ea2e9c tip
+ add subrepo
+ branch: default
+ commit: 1 subrepos
+ update: (current)
+ $ hg st
+ $ hg st -S
+ A subrepo/large.txt
+ $ hg ci -S -m "commit top repo"
+ committing subrepository subrepo
+ Invoking status precommit hook
+ A large.txt
+ Invoking status precommit hook
+ M .hgsubstate
+# No differences
+ $ hg st -S
+ $ hg sum
+ parent: 2:ce4cd0c527a6 tip
+ commit top repo
+ branch: default
+ commit: (clean)
+ update: (current)
+ $ echo "rev 2" > subrepo/large.txt
+ $ hg st -S
+ M subrepo/large.txt
+ $ hg sum
+ parent: 2:ce4cd0c527a6 tip
+ commit top repo
+ branch: default
+ commit: 1 subrepos
+ update: (current)
+ $ hg ci -m "this commit should fail without -S"
+ abort: uncommitted changes in subrepo subrepo
+ (use --subrepos for recursive commit)
+ [255]
+
+Add a normal file to the subrepo, then test archiving
+
+ $ echo 'normal file' > subrepo/normal.txt
+ $ hg -R subrepo add subrepo/normal.txt
+
+Lock in subrepo, otherwise the change isn't archived
+
+ $ hg ci -S -m "add normal file to top level"
+ committing subrepository subrepo
+ Invoking status precommit hook
+ M large.txt
+ A normal.txt
+ Invoking status precommit hook
+ M .hgsubstate
+ $ hg archive -S lf_subrepo_archive
+ $ find lf_subrepo_archive | sort
+ lf_subrepo_archive
+ lf_subrepo_archive/.hg_archival.txt
+ lf_subrepo_archive/.hgsub
+ lf_subrepo_archive/.hgsubstate
+ lf_subrepo_archive/a
+ lf_subrepo_archive/a/b
+ lf_subrepo_archive/a/b/c
+ lf_subrepo_archive/a/b/c/d
+ lf_subrepo_archive/a/b/c/d/e.large.txt
+ lf_subrepo_archive/a/b/c/d/e.normal.txt
+ lf_subrepo_archive/a/b/c/x
+ lf_subrepo_archive/a/b/c/x/y.normal.txt
+ lf_subrepo_archive/subrepo
+ lf_subrepo_archive/subrepo/large.txt
+ lf_subrepo_archive/subrepo/normal.txt
+
+ $ cd ..
diff --git a/tests/test-lfconvert.t b/tests/test-lfconvert.t
new file mode 100644
index 0000000..50330eb
--- /dev/null
+++ b/tests/test-lfconvert.t
@@ -0,0 +1,272 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > largefiles =
+ > share =
+ > graphlog =
+ > mq =
+ > [largefiles]
+ > minsize = 0.5
+ > patterns = **.other
+ > **.dat
+ > EOF
+
+"lfconvert" works
+ $ hg init bigfile-repo
+ $ cd bigfile-repo
+ $ cat >> .hg/hgrc <<EOF
+ > [extensions]
+ > largefiles = !
+ > EOF
+ $ mkdir sub
+ $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
+ $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
+ $ echo normal > normal1
+ $ echo alsonormal > sub/normal2
+ $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
+ $ hg addremove
+ adding large
+ adding large2
+ adding normal1
+ adding sub/maybelarge.dat
+ adding sub/normal2
+ $ hg commit -m"add large, normal1" large normal1
+ $ hg commit -m"add sub/*" sub
+
+Test tag parsing
+ $ cat >> .hgtags <<EOF
+ > IncorrectlyFormattedTag!
+ > invalidhash sometag
+ > 0123456789abcdef anothertag
+ > EOF
+ $ hg add .hgtags
+ $ hg commit -m"add large2" large2 .hgtags
+
+Test link+rename largefile codepath
+ $ [ -d .hg/largefiles ] && echo fail || echo pass
+ pass
+ $ cd ..
+ $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
+ initializing destination largefiles-repo
+ skipping incorrectly formatted tag IncorrectlyFormattedTag!
+ skipping incorrectly formatted id invalidhash
+ no mapping for id 0123456789abcdef
+#if symlink
+ $ hg --cwd bigfile-repo rename large2 large3
+ $ ln -sf large bigfile-repo/large3
+ $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
+ $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
+ initializing destination largefiles-repo-symlink
+ skipping incorrectly formatted tag IncorrectlyFormattedTag!
+ skipping incorrectly formatted id invalidhash
+ no mapping for id 0123456789abcdef
+ abort: renamed/copied largefile large3 becomes symlink
+ [255]
+#endif
+ $ cd bigfile-repo
+ $ hg strip --no-backup 2
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ cd ..
+ $ rm -rf largefiles-repo largefiles-repo-symlink
+
+ $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
+ initializing destination largefiles-repo
+
+"lfconvert" converts content correctly
+ $ cd largefiles-repo
+ $ hg up
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 2 largefiles updated, 0 removed
+ $ hg locate
+ .hglf/large
+ .hglf/sub/maybelarge.dat
+ normal1
+ sub/normal2
+ $ cat normal1
+ normal
+ $ cat sub/normal2
+ alsonormal
+ $ "$TESTDIR/md5sum.py" large sub/maybelarge.dat
+ ec87a838931d4d5d2e94a04644788a55 large
+ 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
+
+"lfconvert" adds 'largefiles' to .hg/requires.
+ $ cat .hg/requires
+ largefiles
+ revlogv1
+ fncache
+ store
+ dotencode
+
+"lfconvert" includes a newline at the end of the standin files.
+ $ cat .hglf/large .hglf/sub/maybelarge.dat
+ 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
+ 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
+ $ cd ..
+
+add some changesets to rename/remove/merge
+ $ cd bigfile-repo
+ $ hg mv -q sub stuff
+ $ hg commit -m"rename sub/ to stuff/"
+ $ hg update -q 1
+ $ echo blah >> normal3
+ $ echo blah >> sub/normal2
+ $ echo blah >> sub/maybelarge.dat
+ $ "$TESTDIR/md5sum.py" sub/maybelarge.dat
+ 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
+ $ hg commit -A -m"add normal3, modify sub/*"
+ adding normal3
+ created new head
+ $ hg rm large normal3
+ $ hg commit -q -m"remove large, normal3"
+ $ hg merge
+ merging sub/maybelarge.dat and stuff/maybelarge.dat to stuff/maybelarge.dat
+ warning: $TESTTMP/bigfile-repo/stuff/maybelarge.dat looks like a binary file. (glob)
+ merging stuff/maybelarge.dat incomplete! (edit conflicts, then use 'hg resolve --mark')
+ merging sub/normal2 and stuff/normal2 to stuff/normal2
+ 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
+ $ hg resolve -m stuff/maybelarge.dat
+ $ hg commit -m"merge"
+ $ hg glog --template "{rev}:{node|short} {desc|firstline}\n"
+ @ 5:4884f215abda merge
+ |\
+ | o 4:7285f817b77e remove large, normal3
+ | |
+ | o 3:67e3892e3534 add normal3, modify sub/*
+ | |
+ o | 2:c96c8beb5d56 rename sub/ to stuff/
+ |/
+ o 1:020c65d24e11 add sub/*
+ |
+ o 0:117b8328f97a add large, normal1
+
+ $ cd ..
+
+lfconvert with rename, merge, and remove
+ $ rm -rf largefiles-repo
+ $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
+ initializing destination largefiles-repo
+ $ cd largefiles-repo
+ $ hg glog --template "{rev}:{node|short} {desc|firstline}\n"
+ o 5:8e05f5f2b77e merge
+ |\
+ | o 4:a5a02de7a8e4 remove large, normal3
+ | |
+ | o 3:55759520c76f add normal3, modify sub/*
+ | |
+ o | 2:261ad3f3f037 rename sub/ to stuff/
+ |/
+ o 1:334e5237836d add sub/*
+ |
+ o 0:d4892ec57ce2 add large, normal1
+
+ $ hg locate -r 2
+ .hglf/large
+ .hglf/stuff/maybelarge.dat
+ normal1
+ stuff/normal2
+ $ hg locate -r 3
+ .hglf/large
+ .hglf/sub/maybelarge.dat
+ normal1
+ normal3
+ sub/normal2
+ $ hg locate -r 4
+ .hglf/sub/maybelarge.dat
+ normal1
+ sub/normal2
+ $ hg locate -r 5
+ .hglf/stuff/maybelarge.dat
+ normal1
+ stuff/normal2
+ $ hg update
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ getting changed largefiles
+ 1 largefiles updated, 0 removed
+ $ cat stuff/normal2
+ alsonormal
+ blah
+ $ "$TESTDIR/md5sum.py" stuff/maybelarge.dat
+ 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
+ $ cat .hglf/stuff/maybelarge.dat
+ 76236b6a2c6102826c61af4297dd738fb3b1de38
+ $ cd ..
+
+"lfconvert" error cases
+ $ hg lfconvert http://localhost/foo foo
+ abort: http://localhost/foo is not a local Mercurial repo
+ [255]
+ $ hg lfconvert foo ssh://localhost/foo
+ abort: ssh://localhost/foo is not a local Mercurial repo
+ [255]
+ $ hg lfconvert nosuchrepo foo
+ abort: repository nosuchrepo not found!
+ [255]
+ $ hg share -q -U bigfile-repo shared
+ $ printf 'bogus' > shared/.hg/sharedpath
+ $ hg lfconvert shared foo
+ abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus! (glob)
+ [255]
+ $ hg lfconvert bigfile-repo largefiles-repo
+ initializing destination largefiles-repo
+ abort: repository largefiles-repo already exists!
+ [255]
+
+add another largefile to the new largefiles repo
+ $ cd largefiles-repo
+ $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
+ $ hg add --lfsize=1 anotherlarge
+ $ hg commit -m "add anotherlarge (should be a largefile)"
+ $ cat .hglf/anotherlarge
+ 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
+ $ cd ..
+
+round-trip: converting back to a normal (non-largefiles) repo with
+"lfconvert --to-normal" should give the same as ../bigfile-repo
+ $ cd largefiles-repo
+ $ hg lfconvert --to-normal . ../normal-repo
+ initializing destination ../normal-repo
+ $ cd ../normal-repo
+ $ cat >> .hg/hgrc <<EOF
+ > [extensions]
+ > largefiles = !
+ > EOF
+
+# Hmmm: the changeset ID for rev 5 is different from the original
+# normal repo (../bigfile-repo), because the changelog filelist
+# differs between the two incarnations of rev 5: this repo includes
+# 'large' in the list, but ../bigfile-repo does not. Since rev 5
+# removes 'large' relative to the first parent in both repos, it seems
+# to me that lfconvert is doing a *better* job than
+# "hg remove" + "hg merge" + "hg commit".
+# $ hg -R ../bigfile-repo debugdata -c 5
+# $ hg debugdata -c 5
+ $ hg glog --template "{rev}:{node|short} {desc|firstline}\n"
+ o 6:1635824e6f59 add anotherlarge (should be a largefile)
+ |
+ o 5:7215f8deeaaf merge
+ |\
+ | o 4:7285f817b77e remove large, normal3
+ | |
+ | o 3:67e3892e3534 add normal3, modify sub/*
+ | |
+ o | 2:c96c8beb5d56 rename sub/ to stuff/
+ |/
+ o 1:020c65d24e11 add sub/*
+ |
+ o 0:117b8328f97a add large, normal1
+
+ $ hg update
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg locate
+ anotherlarge
+ normal1
+ stuff/maybelarge.dat
+ stuff/normal2
+ $ [ -d .hg/largefiles ] && echo fail || echo pass
+ pass
+
+ $ cd ..
diff --git a/tests/test-locate.t b/tests/test-locate.t
new file mode 100644
index 0000000..9d18a3e
--- /dev/null
+++ b/tests/test-locate.t
@@ -0,0 +1,121 @@
+ $ hg init repo
+ $ cd repo
+ $ echo 0 > a
+ $ echo 0 > b
+ $ echo 0 > t.h
+ $ mkdir t
+ $ echo 0 > t/x
+ $ echo 0 > t/b
+ $ echo 0 > t/e.h
+ $ mkdir dir.h
+ $ echo 0 > dir.h/foo
+
+ $ hg ci -A -m m
+ adding a
+ adding b
+ adding dir.h/foo
+ adding t.h
+ adding t/b
+ adding t/e.h
+ adding t/x
+
+ $ touch nottracked
+
+ $ hg locate a
+ a
+
+ $ hg locate NONEXISTENT
+ [1]
+
+ $ hg locate
+ a
+ b
+ dir.h/foo
+ t.h
+ t/b
+ t/e.h
+ t/x
+
+ $ hg rm a
+ $ hg ci -m m
+
+ $ hg locate a
+ [1]
+ $ hg locate NONEXISTENT
+ [1]
+ $ hg locate relpath:NONEXISTENT
+ [1]
+ $ hg locate
+ b
+ dir.h/foo
+ t.h
+ t/b
+ t/e.h
+ t/x
+ $ hg locate -r 0 a
+ a
+ $ hg locate -r 0 NONEXISTENT
+ [1]
+ $ hg locate -r 0 relpath:NONEXISTENT
+ [1]
+ $ hg locate -r 0
+ a
+ b
+ dir.h/foo
+ t.h
+ t/b
+ t/e.h
+ t/x
+
+-I/-X with relative path should work:
+
+ $ cd t
+ $ hg locate
+ b
+ dir.h/foo
+ t.h
+ t/b
+ t/e.h
+ t/x
+ $ hg locate -I ../t
+ t/b
+ t/e.h
+ t/x
+
+Issue294: hg remove --after dir fails when dir.* also exists
+
+ $ cd ..
+ $ rm -r t
+
+ $ hg locate 't/**'
+ t/b (glob)
+ t/e.h (glob)
+ t/x (glob)
+
+ $ mkdir otherdir
+ $ cd otherdir
+
+ $ hg locate b
+ ../b (glob)
+ ../t/b (glob)
+ $ hg locate '*.h'
+ ../t.h (glob)
+ ../t/e.h (glob)
+ $ hg locate path:t/x
+ ../t/x (glob)
+ $ hg locate 're:.*\.h$'
+ ../t.h (glob)
+ ../t/e.h (glob)
+ $ hg locate -r 0 b
+ ../b (glob)
+ ../t/b (glob)
+ $ hg locate -r 0 '*.h'
+ ../t.h (glob)
+ ../t/e.h (glob)
+ $ hg locate -r 0 path:t/x
+ ../t/x (glob)
+ $ hg locate -r 0 're:.*\.h$'
+ ../t.h (glob)
+ ../t/e.h (glob)
+
+ $ cd ../..
diff --git a/tests/test-lock-badness.t b/tests/test-lock-badness.t
new file mode 100644
index 0000000..9c3319c
--- /dev/null
+++ b/tests/test-lock-badness.t
@@ -0,0 +1,24 @@
+ $ "$TESTDIR/hghave" unix-permissions || exit 80
+
+ $ hg init a
+ $ echo a > a/a
+ $ hg -R a ci -A -m a
+ adding a
+
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo b > b/b
+ $ hg -R b ci -A -m b
+ adding b
+
+ $ chmod 100 a/.hg/store
+
+ $ hg -R b push a
+ pushing to a
+ abort: could not lock repository a: Permission denied
+ [255]
+
+ $ chmod 700 a/.hg/store
+
diff --git a/tests/test-log.t b/tests/test-log.t
new file mode 100644
index 0000000..0a4248e
--- /dev/null
+++ b/tests/test-log.t
@@ -0,0 +1,1215 @@
+The g is crafted to have 2 filelog topological heads in a linear
+changeset graph
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ echo f > f
+ $ hg ci -Ama -d '1 0'
+ adding a
+ adding f
+
+ $ hg cp a b
+ $ hg cp f g
+ $ hg ci -mb -d '2 0'
+
+ $ mkdir dir
+ $ hg mv b dir
+ $ echo g >> g
+ $ echo f >> f
+ $ hg ci -mc -d '3 0'
+
+ $ hg mv a b
+ $ hg cp -f f g
+ $ echo a > d
+ $ hg add d
+ $ hg ci -md -d '4 0'
+
+ $ hg mv dir/b e
+ $ hg ci -me -d '5 0'
+
+ $ hg log a
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+-f, directory
+
+ $ hg log -f dir
+ abort: cannot follow file not in parent revision: "dir"
+ [255]
+
+-f, but no args
+
+ $ hg log -f
+ changeset: 4:7e4639b4691b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: e
+
+ changeset: 3:2ca5ba701980
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: d
+
+ changeset: 2:f8954cd4dc1f
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: c
+
+ changeset: 1:d89b0a12d229
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b
+
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+one rename
+
+ $ hg up -q 2
+ $ hg log -vf a
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a f
+ description:
+ a
+
+
+
+many renames
+
+ $ hg up -q tip
+ $ hg log -vf e
+ changeset: 4:7e4639b4691b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ files: dir/b e
+ description:
+ e
+
+
+ changeset: 2:f8954cd4dc1f
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ files: b dir/b f g
+ description:
+ c
+
+
+ changeset: 1:d89b0a12d229
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ files: b g
+ description:
+ b
+
+
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a f
+ description:
+ a
+
+
+
+
+log -pf dir/b
+
+ $ hg up -q 3
+ $ hg log -pf dir/b
+ changeset: 2:f8954cd4dc1f
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: c
+
+ diff -r d89b0a12d229 -r f8954cd4dc1f dir/b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/dir/b Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ changeset: 1:d89b0a12d229
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b
+
+ diff -r 9161b9aeaf16 -r d89b0a12d229 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+ diff -r 000000000000 -r 9161b9aeaf16 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+log -vf dir/b
+
+ $ hg log -vf dir/b
+ changeset: 2:f8954cd4dc1f
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ files: b dir/b f g
+ description:
+ c
+
+
+ changeset: 1:d89b0a12d229
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ files: b g
+ description:
+ b
+
+
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a f
+ description:
+ a
+
+
+
+
+-f and multiple filelog heads
+
+ $ hg up -q 2
+ $ hg log -f g --template '{rev}\n'
+ 2
+ 1
+ 0
+ $ hg up -q tip
+ $ hg log -f g --template '{rev}\n'
+ 3
+ 2
+ 0
+
+
+log copies with --copies
+
+ $ hg log -vC --template '{rev} {file_copies}\n'
+ 4 e (dir/b)
+ 3 b (a)g (f)
+ 2 dir/b (b)
+ 1 b (a)g (f)
+ 0
+
+log copies switch without --copies, with old filecopy template
+
+ $ hg log -v --template '{rev} {file_copies_switch%filecopy}\n'
+ 4
+ 3
+ 2
+ 1
+ 0
+
+log copies switch with --copies
+
+ $ hg log -vC --template '{rev} {file_copies_switch}\n'
+ 4 e (dir/b)
+ 3 b (a)g (f)
+ 2 dir/b (b)
+ 1 b (a)g (f)
+ 0
+
+
+log copies with hardcoded style and with --style=default
+
+ $ hg log -vC -r4
+ changeset: 4:7e4639b4691b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ files: dir/b e
+ copies: e (dir/b)
+ description:
+ e
+
+
+ $ hg log -vC -r4 --style=default
+ changeset: 4:7e4639b4691b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ files: dir/b e
+ copies: e (dir/b)
+ description:
+ e
+
+
+
+
+log copies, non-linear manifest
+
+ $ hg up -C 3
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg mv dir/b e
+ $ echo foo > foo
+ $ hg ci -Ame2 -d '6 0'
+ adding foo
+ created new head
+ $ hg log -v --template '{rev} {file_copies}\n' -r 5
+ 5 e (dir/b)
+
+
+log copies, execute bit set
+
+#if execbit
+ $ chmod +x e
+ $ hg ci -me3 -d '7 0'
+ $ hg log -v --template '{rev} {file_copies}\n' -r 6
+ 6
+#endif
+
+
+log -p d
+
+ $ hg log -pv d
+ changeset: 3:2ca5ba701980
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ files: a b d g
+ description:
+ d
+
+
+ diff -r f8954cd4dc1f -r 2ca5ba701980 d
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/d Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+
+log --removed file
+
+ $ hg log --removed -v a
+ changeset: 3:2ca5ba701980
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ files: a b d g
+ description:
+ d
+
+
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a f
+ description:
+ a
+
+
+
+log --removed revrange file
+
+ $ hg log --removed -v -r0:2 a
+ changeset: 0:9161b9aeaf16
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ files: a f
+ description:
+ a
+
+
+ $ cd ..
+
+log --follow tests
+
+ $ hg init follow
+ $ cd follow
+
+ $ echo base > base
+ $ hg ci -Ambase -d '1 0'
+ adding base
+
+ $ echo r1 >> base
+ $ hg ci -Amr1 -d '1 0'
+ $ echo r2 >> base
+ $ hg ci -Amr2 -d '1 0'
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b1 > b1
+ $ hg ci -Amb1 -d '1 0'
+ adding b1
+ created new head
+
+
+log -f
+
+ $ hg log -f
+ changeset: 3:e62f78d544b4
+ tag: tip
+ parent: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1
+
+ changeset: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: r1
+
+ changeset: 0:67e992f2c4f3
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: base
+
+
+
+log -f -r 1:tip
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b2 > b2
+ $ hg ci -Amb2 -d '1 0'
+ adding b2
+ created new head
+ $ hg log -f -r 1:tip
+ changeset: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: r1
+
+ changeset: 2:60c670bf5b30
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: r2
+
+ changeset: 3:e62f78d544b4
+ parent: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1
+
+
+
+log -r . with two parents
+
+ $ hg up -C 3
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg log -r .
+ changeset: 3:e62f78d544b4
+ parent: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1
+
+
+
+log -r . with one parent
+
+ $ hg ci -mm12 -d '1 0'
+ $ hg log -r .
+ changeset: 5:302e9dd6890d
+ tag: tip
+ parent: 3:e62f78d544b4
+ parent: 4:ddb82e70d1a1
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: m12
+
+
+ $ echo postm >> b1
+ $ hg ci -Amb1.1 -d'1 0'
+
+
+log --follow-first
+
+ $ hg log --follow-first
+ changeset: 6:2404bbcab562
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1.1
+
+ changeset: 5:302e9dd6890d
+ parent: 3:e62f78d544b4
+ parent: 4:ddb82e70d1a1
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: m12
+
+ changeset: 3:e62f78d544b4
+ parent: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1
+
+ changeset: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: r1
+
+ changeset: 0:67e992f2c4f3
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: base
+
+
+
+log -P 2
+
+ $ hg log -P 2
+ changeset: 6:2404bbcab562
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1.1
+
+ changeset: 5:302e9dd6890d
+ parent: 3:e62f78d544b4
+ parent: 4:ddb82e70d1a1
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: m12
+
+ changeset: 4:ddb82e70d1a1
+ parent: 0:67e992f2c4f3
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b2
+
+ changeset: 3:e62f78d544b4
+ parent: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1
+
+
+
+log -r tip -p --git
+
+ $ hg log -r tip -p --git
+ changeset: 6:2404bbcab562
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1.1
+
+ diff --git a/b1 b/b1
+ --- a/b1
+ +++ b/b1
+ @@ -1,1 +1,2 @@
+ b1
+ +postm
+
+
+
+log -r ""
+
+ $ hg log -r ''
+ hg: parse error: empty query
+ [255]
+
+log -r <some unknown node id>
+
+ $ hg log -r 1000000000000000000000000000000000000000
+ abort: unknown revision '1000000000000000000000000000000000000000'!
+ [255]
+
+log -k r1
+
+ $ hg log -k r1
+ changeset: 1:3d5bf5654eda
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: r1
+
+log -p -l2 --color=always
+
+ $ hg --config extensions.color= --config color.mode=ansi \
+ > log -p -l2 --color=always
+ \x1b[0;33mchangeset: 6:2404bbcab562\x1b[0m (esc)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1.1
+
+ \x1b[0;1mdiff -r 302e9dd6890d -r 2404bbcab562 b1\x1b[0m (esc)
+ \x1b[0;31;1m--- a/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
+ \x1b[0;32;1m+++ b/b1 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
+ \x1b[0;35m@@ -1,1 +1,2 @@\x1b[0m (esc)
+ b1
+ \x1b[0;32m+postm\x1b[0m (esc)
+
+ \x1b[0;33mchangeset: 5:302e9dd6890d\x1b[0m (esc)
+ parent: 3:e62f78d544b4
+ parent: 4:ddb82e70d1a1
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: m12
+
+ \x1b[0;1mdiff -r e62f78d544b4 -r 302e9dd6890d b2\x1b[0m (esc)
+ \x1b[0;31;1m--- /dev/null Thu Jan 01 00:00:00 1970 +0000\x1b[0m (esc)
+ \x1b[0;32;1m+++ b/b2 Thu Jan 01 00:00:01 1970 +0000\x1b[0m (esc)
+ \x1b[0;35m@@ -0,0 +1,1 @@\x1b[0m (esc)
+ \x1b[0;32m+b2\x1b[0m (esc)
+
+
+
+log -r tip --stat
+
+ $ hg log -r tip --stat
+ changeset: 6:2404bbcab562
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b1.1
+
+ b1 | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+
+ $ cd ..
+
+
+User
+
+ $ hg init usertest
+ $ cd usertest
+
+ $ echo a > a
+ $ hg ci -A -m "a" -u "User One <user1@example.org>"
+ adding a
+ $ echo b > b
+ $ hg ci -A -m "b" -u "User Two <user2@example.org>"
+ adding b
+
+ $ hg log -u "User One <user1@example.org>"
+ changeset: 0:29a4c94f1924
+ user: User One <user1@example.org>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg log -u "user1" -u "user2"
+ changeset: 1:e834b5e69c0e
+ tag: tip
+ user: User Two <user2@example.org>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ changeset: 0:29a4c94f1924
+ user: User One <user1@example.org>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg log -u "user3"
+
+ $ cd ..
+
+ $ hg init branches
+ $ cd branches
+
+ $ echo a > a
+ $ hg ci -A -m "commit on default"
+ adding a
+ $ hg branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > b
+ $ hg ci -A -m "commit on test"
+ adding b
+
+ $ hg up default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -A -m "commit on default"
+ adding c
+ $ hg up test
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -A -m "commit on test"
+ adding c
+
+
+log -b default
+
+ $ hg log -b default
+ changeset: 2:c3a4f03cc9a7
+ parent: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+
+
+log -b test
+
+ $ hg log -b test
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+
+
+log -b dummy
+
+ $ hg log -b dummy
+ abort: unknown revision 'dummy'!
+ [255]
+
+
+log -b .
+
+ $ hg log -b .
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+
+
+log -b default -b test
+
+ $ hg log -b default -b test
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 2:c3a4f03cc9a7
+ parent: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+
+
+log -b default -b .
+
+ $ hg log -b default -b .
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 2:c3a4f03cc9a7
+ parent: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+
+
+log -b . -b test
+
+ $ hg log -b . -b test
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+
+
+log -b 2
+
+ $ hg log -b 2
+ changeset: 2:c3a4f03cc9a7
+ parent: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+
+
+log -p --cwd dir (in subdir)
+
+ $ mkdir dir
+ $ hg log -p --cwd dir
+ changeset: 3:f5d8de11c2e2
+ branch: test
+ tag: tip
+ parent: 1:d32277701ccb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ diff -r d32277701ccb -r f5d8de11c2e2 c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ changeset: 2:c3a4f03cc9a7
+ parent: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ diff -r 24427303d56f -r c3a4f03cc9a7 c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ changeset: 1:d32277701ccb
+ branch: test
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on test
+
+ diff -r 24427303d56f -r d32277701ccb b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ diff -r 000000000000 -r 24427303d56f a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+
+log -p -R repo
+
+ $ cd dir
+ $ hg log -p -R .. ../a
+ changeset: 0:24427303d56f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit on default
+
+ diff -r 000000000000 -r 24427303d56f a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+ $ cd ../..
+
+ $ hg init follow2
+ $ cd follow2
+
+# Build the following history:
+# tip - o - x - o - x - x
+# \ /
+# o - o - o - x
+# \ /
+# o
+#
+# Where "o" is a revision containing "foo" and
+# "x" is a revision without "foo"
+
+ $ touch init
+ $ hg ci -A -m "init, unrelated"
+ adding init
+ $ echo 'foo' > init
+ $ hg ci -m "change, unrelated"
+ $ echo 'foo' > foo
+ $ hg ci -A -m "add unrelated old foo"
+ adding foo
+ $ hg rm foo
+ $ hg ci -m "delete foo, unrelated"
+ $ echo 'related' > foo
+ $ hg ci -A -m "add foo, related"
+ adding foo
+
+ $ hg up 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ touch branch
+ $ hg ci -A -m "first branch, unrelated"
+ adding branch
+ created new head
+ $ touch foo
+ $ hg ci -A -m "create foo, related"
+ adding foo
+ $ echo 'change' > foo
+ $ hg ci -m "change foo, related"
+
+ $ hg up 6
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 'change foo in branch' > foo
+ $ hg ci -m "change foo in branch, related"
+ created new head
+ $ hg merge 7
+ merging foo
+ warning: conflicts during merge.
+ merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ echo 'merge 1' > foo
+ $ hg resolve -m foo
+ $ hg ci -m "First merge, related"
+
+ $ hg merge 4
+ merging foo
+ warning: conflicts during merge.
+ merging foo incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ echo 'merge 2' > foo
+ $ hg resolve -m foo
+ $ hg ci -m "Last merge, related"
+
+ $ hg log --graph
+ @ changeset: 10:4dae8563d2c5
+ |\ tag: tip
+ | | parent: 9:7b35701b003e
+ | | parent: 4:88176d361b69
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: Last merge, related
+ | |
+ | o changeset: 9:7b35701b003e
+ | |\ parent: 8:e5416ad8a855
+ | | | parent: 7:87fe3144dcfa
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | | summary: First merge, related
+ | | |
+ | | o changeset: 8:e5416ad8a855
+ | | | parent: 6:dc6c325fe5ee
+ | | | user: test
+ | | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | | summary: change foo in branch, related
+ | | |
+ | o | changeset: 7:87fe3144dcfa
+ | |/ user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: change foo, related
+ | |
+ | o changeset: 6:dc6c325fe5ee
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: create foo, related
+ | |
+ | o changeset: 5:73db34516eb9
+ | | parent: 0:e87515fd044a
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: first branch, unrelated
+ | |
+ o | changeset: 4:88176d361b69
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: add foo, related
+ | |
+ o | changeset: 3:dd78ae4afb56
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: delete foo, unrelated
+ | |
+ o | changeset: 2:c4c64aedf0f7
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: add unrelated old foo
+ | |
+ o | changeset: 1:e5faa7440653
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: change, unrelated
+ |
+ o changeset: 0:e87515fd044a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: init, unrelated
+
+
+ $ hg --traceback log -f foo
+ changeset: 10:4dae8563d2c5
+ tag: tip
+ parent: 9:7b35701b003e
+ parent: 4:88176d361b69
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Last merge, related
+
+ changeset: 9:7b35701b003e
+ parent: 8:e5416ad8a855
+ parent: 7:87fe3144dcfa
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: First merge, related
+
+ changeset: 8:e5416ad8a855
+ parent: 6:dc6c325fe5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo in branch, related
+
+ changeset: 7:87fe3144dcfa
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo, related
+
+ changeset: 6:dc6c325fe5ee
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: create foo, related
+
+ changeset: 4:88176d361b69
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo, related
+
+
+Also check when maxrev < lastrevfilelog
+
+ $ hg --traceback log -f -r4 foo
+ changeset: 4:88176d361b69
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo, related
+
+ $ cd ..
+
+Issue2383: hg log showing _less_ differences than hg diff
+
+ $ hg init issue2383
+ $ cd issue2383
+
+Create a test repo:
+
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+ $ echo b > b
+ $ hg ci -Am1
+ adding b
+ $ hg co 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b > a
+ $ hg ci -m2
+ created new head
+
+Merge:
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Make sure there's a file listed in the merge to trigger the bug:
+
+ $ echo c > a
+ $ hg ci -m3
+
+Two files shown here in diff:
+
+ $ hg diff --rev 2:3
+ diff -r b09be438c43a -r 8e07aafe1edc a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -b
+ +c
+ diff -r b09be438c43a -r 8e07aafe1edc b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+Diff here should be the same:
+
+ $ hg log -vpr 3
+ changeset: 3:8e07aafe1edc
+ tag: tip
+ parent: 2:b09be438c43a
+ parent: 1:925d80f479bb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ 3
+
+
+ diff -r b09be438c43a -r 8e07aafe1edc a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,1 @@
+ -b
+ +c
+ diff -r b09be438c43a -r 8e07aafe1edc b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ $ cd ..
+
+'hg log -r rev fn' when last(filelog(fn)) != rev
+
+ $ hg init simplelog
+ $ cd simplelog
+ $ echo f > a
+ $ hg ci -Am'a' -d '0 0'
+ adding a
+ $ echo f >> a
+ $ hg ci -Am'a bis' -d '1 0'
+
+ $ hg log -r0 a
+ changeset: 0:9f758d63dcde
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ cat > $HGTMP/testhidden.py << EOF
+ > def reposetup(ui, repo):
+ > for line in repo.opener('hidden'):
+ > ctx = repo[line.strip()]
+ > repo.hiddenrevs.add(ctx.rev())
+ > EOF
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "hidden=$HGTMP/testhidden.py" >> $HGRCPATH
+ $ touch .hg/hidden
+ $ hg log --template='{rev}:{node}\n'
+ 1:a765632148dc55d38c35c4f247c618701886cb2f
+ 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+ $ echo a765632148dc55d38c35c4f247c618701886cb2f > .hg/hidden
+ $ hg log --template='{rev}:{node}\n'
+ 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+ $ hg log --template='{rev}:{node}\n' --hidden
+ 1:a765632148dc55d38c35c4f247c618701886cb2f
+ 0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+
+clear extensions configuration
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "hidden=!" >> $HGRCPATH
+ $ cd ..
+
+test -u/-k for problematic encoding
+# unicode: cp932:
+# u30A2 0x83 0x41(= 'A')
+# u30C2 0x83 0x61(= 'a')
+
+ $ hg init problematicencoding
+ $ cd problematicencoding
+
+ $ python > setup.sh <<EOF
+ > print u'''
+ > echo a > text
+ > hg add text
+ > hg --encoding utf-8 commit -u '\u30A2' -m none
+ > echo b > text
+ > hg --encoding utf-8 commit -u '\u30C2' -m none
+ > echo c > text
+ > hg --encoding utf-8 commit -u none -m '\u30A2'
+ > echo d > text
+ > hg --encoding utf-8 commit -u none -m '\u30C2'
+ > '''.encode('utf-8')
+ > EOF
+ $ sh < setup.sh
+
+test in problematic encoding
+ $ python > test.sh <<EOF
+ > print u'''
+ > hg --encoding cp932 log --template '{rev}\\n' -u '\u30A2'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -u '\u30C2'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -k '\u30A2'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -k '\u30C2'
+ > '''.encode('cp932')
+ > EOF
+ $ sh < test.sh
+ 0
+ ====
+ 1
+ ====
+ 2
+ 0
+ ====
+ 3
+ 1
+
+ $ cd ..
diff --git a/tests/test-mactext.t b/tests/test-mactext.t
new file mode 100644
index 0000000..efbd4d2
--- /dev/null
+++ b/tests/test-mactext.t
@@ -0,0 +1,38 @@
+
+ $ cat > unix2mac.py <<EOF
+ > import sys
+ >
+ > for path in sys.argv[1:]:
+ > data = file(path, 'rb').read()
+ > data = data.replace('\n', '\r')
+ > file(path, 'wb').write(data)
+ > EOF
+ $ cat > print.py <<EOF
+ > import sys
+ > print(sys.stdin.read().replace('\n', '<LF>').replace('\r', '<CR>').replace('\0', '<NUL>'))
+ > EOF
+ $ hg init
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo 'pretxncommit.cr = python:hgext.win32text.forbidcr' >> .hg/hgrc
+ $ echo 'pretxnchangegroup.cr = python:hgext.win32text.forbidcr' >> .hg/hgrc
+ $ cat .hg/hgrc
+ [hooks]
+ pretxncommit.cr = python:hgext.win32text.forbidcr
+ pretxnchangegroup.cr = python:hgext.win32text.forbidcr
+
+ $ echo hello > f
+ $ hg add f
+ $ hg ci -m 1
+
+ $ python unix2mac.py f
+ $ hg ci -m 2
+ attempt to commit or push text file(s) using CR line endings
+ in dea860dc51ec: f
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.cr hook failed
+ [255]
+ $ hg cat f | python print.py
+ hello<LF>
+ $ cat f | python print.py
+ hello<CR>
diff --git a/tests/test-manifest-merging.t b/tests/test-manifest-merging.t
new file mode 100644
index 0000000..aa91cf0
--- /dev/null
+++ b/tests/test-manifest-merging.t
@@ -0,0 +1,37 @@
+ $ hg init base
+
+ $ cd base
+ $ echo 'alpha' > alpha
+ $ hg ci -A -m 'add alpha'
+ adding alpha
+ $ cd ..
+
+ $ hg clone base work
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd work
+ $ echo 'beta' > beta
+ $ hg ci -A -m 'add beta'
+ adding beta
+ $ cd ..
+
+ $ cd base
+ $ echo 'gamma' > gamma
+ $ hg ci -A -m 'add gamma'
+ adding gamma
+ $ cd ..
+
+ $ cd work
+ $ hg pull -q
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Update --clean to revision 1 to simulate a failed merge:
+
+ $ rm alpha beta gamma
+ $ hg update --clean 1
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
diff --git a/tests/test-manifest.t b/tests/test-manifest.t
new file mode 100644
index 0000000..f334b23
--- /dev/null
+++ b/tests/test-manifest.t
@@ -0,0 +1,69 @@
+Source bundle was generated with the following script:
+
+# hg init
+# echo a > a
+# ln -s a l
+# hg ci -Ama -d'0 0'
+# mkdir b
+# echo a > b/a
+# chmod +x b/a
+# hg ci -Amb -d'1 0'
+
+ $ hg init
+ $ hg -q pull "$TESTDIR/bundles/test-manifest.hg"
+
+The next call is expected to return nothing:
+
+ $ hg manifest
+
+ $ hg co
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg manifest
+ a
+ b/a
+ l
+
+ $ hg manifest -v
+ 644 a
+ 755 * b/a
+ 644 @ l
+
+ $ hg manifest --debug
+ b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 644 a
+ b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 755 * b/a
+ 047b75c6d7a3ef6a2243bd0e99f94f6ea6683597 644 @ l
+
+ $ hg manifest -r 0
+ a
+ l
+
+ $ hg manifest -r 1
+ a
+ b/a
+ l
+
+ $ hg manifest -r tip
+ a
+ b/a
+ l
+
+ $ hg manifest tip
+ a
+ b/a
+ l
+
+ $ hg manifest --all
+ a
+ b/a
+ l
+
+The next two calls are expected to abort:
+
+ $ hg manifest -r 2
+ abort: unknown revision '2'!
+ [255]
+
+ $ hg manifest -r tip tip
+ abort: please specify just one revision
+ [255]
diff --git a/tests/test-merge-closedheads.t b/tests/test-merge-closedheads.t
new file mode 100644
index 0000000..ad78c1e
--- /dev/null
+++ b/tests/test-merge-closedheads.t
@@ -0,0 +1,87 @@
+ $ hgcommit() {
+ > hg commit -u user "$@"
+ > }
+
+ $ hg init clhead
+ $ cd clhead
+
+ $ touch foo && hg add && hgcommit -m 'foo'
+ adding foo
+ $ touch bar && hg add && hgcommit -m 'bar'
+ adding bar
+ $ touch baz && hg add && hgcommit -m 'baz'
+ adding baz
+
+ $ echo "flub" > foo
+ $ hgcommit -m "flub"
+ $ echo "nub" > foo
+ $ hgcommit -m "nub"
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo "c1" > c1
+ $ hg add c1
+ $ hgcommit -m "c1"
+ created new head
+ $ echo "c2" > c1
+ $ hgcommit -m "c2"
+
+ $ hg up -C 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo "d1" > d1
+ $ hg add d1
+ $ hgcommit -m "d1"
+ created new head
+ $ echo "d2" > d1
+ $ hgcommit -m "d2"
+ $ hg tag -l good
+
+fail with three heads
+ $ hg up -C good
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge
+ abort: branch 'default' has 3 heads - please merge with an explicit rev
+ (run 'hg heads .' to see heads)
+ [255]
+
+close one of the heads
+ $ hg up -C 6
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hgcommit -m 'close this head' --close-branch
+
+succeed with two open heads
+ $ hg up -C good
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg up -C good
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hgcommit -m 'merged heads'
+
+hg update -C 8
+ $ hg update -C 8
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+hg branch some-branch
+ $ hg branch some-branch
+ marked working directory as branch some-branch
+ (branches are permanent and global, did you want a bookmark?)
+hg commit
+ $ hgcommit -m 'started some-branch'
+hg commit --close-branch
+ $ hgcommit --close-branch -m 'closed some-branch'
+
+hg update default
+ $ hg update default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+hg merge some-branch
+ $ hg merge some-branch
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+hg commit (no reopening of some-branch)
+ $ hgcommit -m 'merge with closed branch'
+
+ $ cd ..
diff --git a/tests/test-merge-commit.t b/tests/test-merge-commit.t
new file mode 100644
index 0000000..23a6e16
--- /dev/null
+++ b/tests/test-merge-commit.t
@@ -0,0 +1,184 @@
+Check that renames are correctly saved by a commit after a merge
+
+Test with the merge on 3 having the rename on the local parent
+
+ $ hg init a
+ $ cd a
+
+ $ echo line1 > foo
+ $ hg add foo
+ $ hg ci -m '0: add foo'
+
+ $ echo line2 >> foo
+ $ hg ci -m '1: change foo'
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg mv foo bar
+ $ rm bar
+ $ echo line0 > bar
+ $ echo line1 >> bar
+ $ hg ci -m '2: mv foo bar; change bar'
+ created new head
+
+ $ hg merge 1
+ merging bar and foo to bar
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat bar
+ line0
+ line1
+ line2
+
+ $ hg ci -m '3: merge with local rename'
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 77 ..... 2 d35118874825 000000000000 000000000000 (re)
+ 1 77 76 ..... 3 5345f5ab8abd 000000000000 d35118874825 (re)
+
+ $ hg debugrename bar
+ bar renamed from foo:9e25c27b87571a1edee5ae4dddee5687746cc8e2
+
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 7 ..... 0 690b295714ae 000000000000 000000000000 (re)
+ 1 7 13 ..... 1 9e25c27b8757 690b295714ae 000000000000 (re)
+
+
+Revert the content change from rev 2:
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm bar
+ $ echo line1 > bar
+ $ hg ci -m '4: revert content change from rev 2'
+ created new head
+
+ $ hg log --template '{rev}:{node|short} {parents}\n'
+ 4:2263c1be0967 2:0f2ff26688b9
+ 3:0555950ead28 2:0f2ff26688b9 1:5cd961e4045d
+ 2:0f2ff26688b9 0:2665aaee66e9
+ 1:5cd961e4045d
+ 0:2665aaee66e9
+
+This should use bar@rev2 as the ancestor:
+
+ $ hg --debug merge 3
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 0f2ff26688b9, local: 2263c1be0967+, remote: 0555950ead28
+ bar: versions differ -> m
+ preserving bar for resolve of bar
+ updating: bar 1/1 files (100.00%)
+ picked tool 'internal:merge' for bar (binary False symlink False)
+ merging bar
+ my bar@2263c1be0967+ other bar@0555950ead28 ancestor bar@0f2ff26688b9
+ premerge successful
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat bar
+ line1
+ line2
+
+ $ hg ci -m '5: merge'
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 77 ..... 2 d35118874825 000000000000 000000000000 (re)
+ 1 77 76 ..... 3 5345f5ab8abd 000000000000 d35118874825 (re)
+ 2 153 7 ..... 4 ff4b45017382 d35118874825 000000000000 (re)
+ 3 160 13 ..... 5 3701b4893544 ff4b45017382 5345f5ab8abd (re)
+
+
+Same thing, but with the merge on 3 having the rename
+on the remote parent:
+
+ $ cd ..
+ $ hg clone -U -r 1 -r 2 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files (+1 heads)
+ $ cd b
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg merge 2
+ merging foo and bar to bar
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat bar
+ line0
+ line1
+ line2
+
+ $ hg ci -m '3: merge with remote rename'
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 77 ..... 2 d35118874825 000000000000 000000000000 (re)
+ 1 77 76 ..... 3 5345f5ab8abd 000000000000 d35118874825 (re)
+
+ $ hg debugrename bar
+ bar renamed from foo:9e25c27b87571a1edee5ae4dddee5687746cc8e2
+
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 7 ..... 0 690b295714ae 000000000000 000000000000 (re)
+ 1 7 13 ..... 1 9e25c27b8757 690b295714ae 000000000000 (re)
+
+
+Revert the content change from rev 2:
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm bar
+ $ echo line1 > bar
+ $ hg ci -m '4: revert content change from rev 2'
+ created new head
+
+ $ hg log --template '{rev}:{node|short} {parents}\n'
+ 4:2263c1be0967 2:0f2ff26688b9
+ 3:3ffa6b9e35f0 1:5cd961e4045d 2:0f2ff26688b9
+ 2:0f2ff26688b9 0:2665aaee66e9
+ 1:5cd961e4045d
+ 0:2665aaee66e9
+
+This should use bar@rev2 as the ancestor:
+
+ $ hg --debug merge 3
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 0f2ff26688b9, local: 2263c1be0967+, remote: 3ffa6b9e35f0
+ bar: versions differ -> m
+ preserving bar for resolve of bar
+ updating: bar 1/1 files (100.00%)
+ picked tool 'internal:merge' for bar (binary False symlink False)
+ merging bar
+ my bar@2263c1be0967+ other bar@3ffa6b9e35f0 ancestor bar@0f2ff26688b9
+ premerge successful
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat bar
+ line1
+ line2
+
+ $ hg ci -m '5: merge'
+
+ $ hg debugindex bar
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 77 ..... 2 d35118874825 000000000000 000000000000 (re)
+ 1 77 76 ..... 3 5345f5ab8abd 000000000000 d35118874825 (re)
+ 2 153 7 ..... 4 ff4b45017382 d35118874825 000000000000 (re)
+ 3 160 13 ..... 5 3701b4893544 ff4b45017382 5345f5ab8abd (re)
+
+ $ cd ..
diff --git a/tests/test-merge-default.t b/tests/test-merge-default.t
new file mode 100644
index 0000000..64f64d3
--- /dev/null
+++ b/tests/test-merge-default.t
@@ -0,0 +1,111 @@
+ $ hg init
+ $ echo a > a
+ $ hg commit -A -ma
+ adding a
+
+ $ echo b >> a
+ $ hg commit -mb
+
+ $ echo c >> a
+ $ hg commit -mc
+
+ $ hg up 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo d >> a
+ $ hg commit -md
+ created new head
+
+ $ hg up 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo e >> a
+ $ hg commit -me
+ created new head
+
+ $ hg up 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Should fail because not at a head:
+
+ $ hg merge
+ abort: branch 'default' has 3 heads - please merge with an explicit rev
+ (run 'hg heads .' to see heads)
+ [255]
+
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Should fail because > 2 heads:
+
+ $ HGMERGE=internal:other; export HGMERGE
+ $ hg merge
+ abort: branch 'default' has 3 heads - please merge with an explicit rev
+ (run 'hg heads .' to see heads)
+ [255]
+
+Should succeed:
+
+ $ hg merge 2
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -mm1
+
+Should succeed - 2 heads:
+
+ $ hg merge -P
+ changeset: 3:ea9ff125ff88
+ parent: 1:1846eede8b68
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ $ hg merge
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -mm2
+
+Should fail because at tip:
+
+ $ hg merge
+ abort: nothing to merge
+ [255]
+
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Should fail because there is only one head:
+
+ $ hg merge
+ abort: nothing to merge
+ (use 'hg update' instead)
+ [255]
+
+ $ hg up 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo f >> a
+ $ hg branch foobranch
+ marked working directory as branch foobranch
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg commit -mf
+
+Should fail because merge with other branch:
+
+ $ hg merge
+ abort: branch 'foobranch' has one head - please merge with an explicit rev
+ (run 'hg heads' to see all heads)
+ [255]
+
+
+Test for issue2043: ensure that 'merge -P' shows ancestors of 6 that
+are not ancestors of 7, regardless of where their least common
+ancestor is.
+
+Merge preview not affected by common ancestor:
+
+ $ hg up -q 7
+ $ hg merge -q -P 6
+ 2:2d95304fed5d
+ 4:f25cbe84d8b3
+ 5:a431fabd6039
+ 6:e88e33f3bf62
+
diff --git a/tests/test-merge-force.t b/tests/test-merge-force.t
new file mode 100644
index 0000000..7a13f66
--- /dev/null
+++ b/tests/test-merge-force.t
@@ -0,0 +1,45 @@
+ $ hg init
+
+ $ echo a > a
+ $ hg ci -qAm 'add a'
+
+ $ echo b > b
+ $ hg ci -qAm 'add b'
+
+ $ hg up -qC 0
+ $ hg rm a
+ $ hg ci -m 'rm a'
+ created new head
+
+ $ hg up -qC 1
+ $ rm a
+
+Local deleted a file, remote removed
+
+Should fail, since there are deleted files:
+
+ $ hg merge
+ abort: outstanding uncommitted changes
+ (use 'hg status' to list changes)
+ [255]
+
+Should succeed with --force:
+
+ $ hg -v merge --force
+ resolving manifests
+ removing a
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Should show 'a' as removed:
+
+ $ hg status
+ R a
+
+ $ hg ci -m merge
+
+Should not show 'a':
+
+ $ hg manifest
+ b
+
diff --git a/tests/test-merge-internal-tools-pattern.t b/tests/test-merge-internal-tools-pattern.t
new file mode 100644
index 0000000..ee4a359
--- /dev/null
+++ b/tests/test-merge-internal-tools-pattern.t
@@ -0,0 +1,112 @@
+Make sure that the internal merge tools (internal:fail, internal:local, and
+internal:other) are used when matched by a merge-pattern in hgrc
+
+Make sure HGMERGE doesn't interfere with the test:
+
+ $ unset HGMERGE
+
+ $ hg init
+
+Initial file contents:
+
+ $ echo "line 1" > f
+ $ echo "line 2" >> f
+ $ echo "line 3" >> f
+ $ hg ci -Am "revision 0"
+ adding f
+
+ $ cat f
+ line 1
+ line 2
+ line 3
+
+Branch 1: editing line 1:
+
+ $ sed 's/line 1/first line/' f > f.new
+ $ mv f.new f
+ $ hg ci -Am "edited first line"
+
+Branch 2: editing line 3:
+
+ $ hg update 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed 's/line 3/third line/' f > f.new
+ $ mv f.new f
+ $ hg ci -Am "edited third line"
+ created new head
+
+Merge using internal:fail tool:
+
+ $ echo "[merge-patterns]" > .hg/hgrc
+ $ echo "* = internal:fail" >> .hg/hgrc
+
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+ $ cat f
+ line 1
+ line 2
+ third line
+
+ $ hg stat
+ M f
+
+Merge using internal:local tool:
+
+ $ hg update -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed 's/internal:fail/internal:local/' .hg/hgrc > .hg/hgrc.new
+ $ mv .hg/hgrc.new .hg/hgrc
+
+ $ hg merge
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat f
+ line 1
+ line 2
+ third line
+
+ $ hg stat
+ M f
+
+Merge using internal:other tool:
+
+ $ hg update -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed 's/internal:local/internal:other/' .hg/hgrc > .hg/hgrc.new
+ $ mv .hg/hgrc.new .hg/hgrc
+
+ $ hg merge
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat f
+ first line
+ line 2
+ line 3
+
+ $ hg stat
+ M f
+
+Merge using default tool:
+
+ $ hg update -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm .hg/hgrc
+
+ $ hg merge
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat f
+ first line
+ line 2
+ third line
+
+ $ hg stat
+ M f
+
diff --git a/tests/test-merge-local.t b/tests/test-merge-local.t
new file mode 100644
index 0000000..8e1e5b1
--- /dev/null
+++ b/tests/test-merge-local.t
@@ -0,0 +1,138 @@
+ $ hg init
+
+Revision 0:
+
+ $ echo "unchanged" > unchanged
+ $ echo "remove me" > remove
+ $ echo "copy me" > copy
+ $ echo "move me" > move
+ $ for i in 1 2 3 4 5 6 7 8 9; do
+ > echo "merge ok $i" >> zzz1_merge_ok
+ > done
+ $ echo "merge bad" > zzz2_merge_bad
+ $ hg ci -Am "revision 0"
+ adding copy
+ adding move
+ adding remove
+ adding unchanged
+ adding zzz1_merge_ok
+ adding zzz2_merge_bad
+
+Revision 1:
+
+ $ hg rm remove
+ $ hg mv move moved
+ $ hg cp copy copied
+ $ echo "added" > added
+ $ hg add added
+ $ echo "new first line" > zzz1_merge_ok
+ $ hg cat zzz1_merge_ok >> zzz1_merge_ok
+ $ echo "new last line" >> zzz2_merge_bad
+ $ hg ci -m "revision 1"
+
+Local changes to revision 0:
+
+ $ hg co 0
+ 4 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ echo "new last line" >> zzz1_merge_ok
+ $ echo "another last line" >> zzz2_merge_bad
+
+ $ hg diff --nodates | grep "^[+-][^<>]"
+ --- a/zzz1_merge_ok
+ +++ b/zzz1_merge_ok
+ +new last line
+ --- a/zzz2_merge_bad
+ +++ b/zzz2_merge_bad
+ +another last line
+
+ $ hg st
+ M zzz1_merge_ok
+ M zzz2_merge_bad
+
+Local merge with bad merge tool:
+
+ $ HGMERGE=false hg co
+ merging zzz1_merge_ok
+ merging zzz2_merge_bad
+ merging zzz2_merge_bad failed!
+ 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+
+ $ hg co 0
+ merging zzz1_merge_ok
+ merging zzz2_merge_bad
+ warning: conflicts during merge.
+ merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 2 files updated, 1 files merged, 3 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+
+ $ hg diff --nodates | grep "^[+-][^<>]"
+ --- a/zzz1_merge_ok
+ +++ b/zzz1_merge_ok
+ +new last line
+ --- a/zzz2_merge_bad
+ +++ b/zzz2_merge_bad
+ +another last line
+ +=======
+
+ $ hg st
+ M zzz1_merge_ok
+ M zzz2_merge_bad
+ ? zzz2_merge_bad.orig
+
+Local merge with conflicts:
+
+ $ hg co
+ merging zzz1_merge_ok
+ merging zzz2_merge_bad
+ warning: conflicts during merge.
+ merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 3 files updated, 1 files merged, 2 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+
+ $ hg co 0
+ merging zzz1_merge_ok
+ merging zzz2_merge_bad
+ warning: conflicts during merge.
+ merging zzz2_merge_bad incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 2 files updated, 1 files merged, 3 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+
+ $ hg diff --nodates | grep "^[+-][^<>]"
+ --- a/zzz1_merge_ok
+ +++ b/zzz1_merge_ok
+ +new last line
+ --- a/zzz2_merge_bad
+ +++ b/zzz2_merge_bad
+ +another last line
+ +=======
+ +=======
+ +new last line
+ +=======
+
+ $ hg st
+ M zzz1_merge_ok
+ M zzz2_merge_bad
+ ? zzz2_merge_bad.orig
+
+Local merge without conflicts:
+
+ $ hg revert zzz2_merge_bad
+
+ $ hg co
+ merging zzz1_merge_ok
+ 4 files updated, 1 files merged, 2 files removed, 0 files unresolved
+
+ $ hg diff --nodates | grep "^[+-][^<>]"
+ --- a/zzz1_merge_ok
+ +++ b/zzz1_merge_ok
+ +new last line
+
+ $ hg st
+ M zzz1_merge_ok
+ ? zzz2_merge_bad.orig
+
diff --git a/tests/test-merge-prompt.t b/tests/test-merge-prompt.t
new file mode 100644
index 0000000..43f39c2
--- /dev/null
+++ b/tests/test-merge-prompt.t
@@ -0,0 +1,142 @@
+Test for
+b5605d88dc27: Make ui.prompt repeat on "unrecognized response" again
+ (issue897)
+
+840e2b315c1f: Fix misleading error and prompts during update/merge
+ (issue556)
+
+ $ status() {
+ > echo "--- status ---"
+ > hg st -A file1 file2
+ > for file in file1 file2; do
+ > if [ -f $file ]; then
+ > echo "--- $file ---"
+ > cat $file
+ > else
+ > echo "*** $file does not exist"
+ > fi
+ > done
+ > }
+
+ $ hg init
+
+ $ echo 1 > file1
+ $ echo 2 > file2
+ $ hg ci -Am 'added file1 and file2'
+ adding file1
+ adding file2
+
+ $ hg rm file1
+ $ echo changed >> file2
+ $ hg ci -m 'removed file1, changed file2'
+
+ $ hg co 0
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo changed >> file1
+ $ hg rm file2
+ $ hg ci -m 'changed file1, removed file2'
+ created new head
+
+
+Non-interactive merge:
+
+ $ hg merge -y
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? c
+ remote changed file2 which local deleted
+ use (c)hanged version or leave (d)eleted? c
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ status
+ --- status ---
+ M file2
+ C file1
+ --- file1 ---
+ 1
+ changed
+ --- file2 ---
+ 2
+ changed
+
+
+Interactive merge:
+
+ $ hg co -C
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg merge --config ui.interactive=true <<EOF
+ > c
+ > d
+ > EOF
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? remote changed file2 which local deleted
+ use (c)hanged version or leave (d)eleted? 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ status
+ --- status ---
+ file2: * (glob)
+ C file1
+ --- file1 ---
+ 1
+ changed
+ *** file2 does not exist
+
+
+Interactive merge with bad input:
+
+ $ hg co -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg merge --config ui.interactive=true <<EOF
+ > foo
+ > bar
+ > d
+ > baz
+ > c
+ > EOF
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? unrecognized response
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? unrecognized response
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? remote changed file2 which local deleted
+ use (c)hanged version or leave (d)eleted? unrecognized response
+ remote changed file2 which local deleted
+ use (c)hanged version or leave (d)eleted? 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ status
+ --- status ---
+ M file2
+ R file1
+ *** file1 does not exist
+ --- file2 ---
+ 2
+ changed
+
+
+Interactive merge with not enough input:
+
+ $ hg co -C
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg merge --config ui.interactive=true <<EOF
+ > d
+ > EOF
+ local changed file1 which remote deleted
+ use (c)hanged version or (d)elete? remote changed file2 which local deleted
+ use (c)hanged version or leave (d)eleted? abort: response expected
+ [255]
+
+ $ status
+ --- status ---
+ file2: * (glob)
+ C file1
+ --- file1 ---
+ 1
+ changed
+ *** file2 does not exist
+
diff --git a/tests/test-merge-remove.t b/tests/test-merge-remove.t
new file mode 100644
index 0000000..d30f86f
--- /dev/null
+++ b/tests/test-merge-remove.t
@@ -0,0 +1,87 @@
+ $ hg init
+
+ $ echo foo > foo
+ $ echo bar > bar
+ $ hg ci -qAm 'add foo bar'
+
+ $ echo foo2 >> foo
+ $ echo bleh > bar
+ $ hg ci -m 'change foo bar'
+
+ $ hg up -qC 0
+ $ hg mv foo foo1
+ $ echo foo1 > foo1
+ $ hg cat foo >> foo1
+ $ hg ci -m 'mv foo foo1'
+ created new head
+
+ $ hg merge
+ merging foo1 and foo to foo1
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg debugstate --nodates
+ n 0 -2 bar
+ m 644 14 foo1
+ copy: foo -> foo1
+
+ $ hg st -q
+ M bar
+ M foo1
+
+
+Removing foo1 and bar:
+
+ $ cp foo1 F
+ $ cp bar B
+ $ hg rm -f foo1 bar
+
+ $ hg debugstate --nodates
+ r 0 -2 bar
+ r 0 -1 foo1
+ copy: foo -> foo1
+
+ $ hg st -qC
+ R bar
+ R foo1
+
+
+Re-adding foo1 and bar:
+
+ $ cp F foo1
+ $ cp B bar
+ $ hg add -v foo1 bar
+ adding bar
+ adding foo1
+
+ $ hg debugstate --nodates
+ n 0 -2 bar
+ m 644 14 foo1
+ copy: foo -> foo1
+
+ $ hg st -qC
+ M bar
+ M foo1
+ foo
+
+
+Reverting foo1 and bar:
+
+ $ hg revert -vr . foo1 bar
+ saving current version of bar as bar.orig
+ reverting bar
+ saving current version of foo1 as foo1.orig
+ reverting foo1
+
+ $ hg debugstate --nodates
+ n 0 -2 bar
+ m 644 14 foo1
+ copy: foo -> foo1
+
+ $ hg st -qC
+ M bar
+ M foo1
+ foo
+
+ $ hg diff
+
diff --git a/tests/test-merge-revert.t b/tests/test-merge-revert.t
new file mode 100644
index 0000000..991699b
--- /dev/null
+++ b/tests/test-merge-revert.t
@@ -0,0 +1,74 @@
+ $ hg init
+
+ $ echo "added file1" > file1
+ $ echo "added file2" > file2
+ $ hg add file1 file2
+ $ hg commit -m "added file1 and file2"
+
+ $ echo "changed file1" >> file1
+ $ hg commit -m "changed file1"
+
+ $ hg -q log
+ 1:08a16e8e4408
+ 0:d29c767a4b52
+ $ hg id
+ 08a16e8e4408 tip
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ d29c767a4b52
+ $ echo "changed file1" >> file1
+ $ hg id
+ d29c767a4b52+
+
+ $ hg revert --all
+ reverting file1
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ d29c767a4b52
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ 08a16e8e4408 tip
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "changed file1" >> file1
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ 08a16e8e4408 tip
+
+ $ hg revert --all
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ 08a16e8e4408 tip
+
+ $ hg revert -r tip --all
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ 08a16e8e4408 tip
+
+ $ hg update -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ 08a16e8e4408 tip
+
diff --git a/tests/test-merge-revert2.t b/tests/test-merge-revert2.t
new file mode 100644
index 0000000..4025e56
--- /dev/null
+++ b/tests/test-merge-revert2.t
@@ -0,0 +1,94 @@
+ $ hg init
+
+ $ echo "added file1" > file1
+ $ echo "another line of text" >> file1
+ $ echo "added file2" > file2
+ $ hg add file1 file2
+ $ hg commit -m "added file1 and file2"
+
+ $ echo "changed file1" >> file1
+ $ hg commit -m "changed file1"
+
+ $ hg -q log
+ 1:dfab7f3c2efb
+ 0:c3fa057dd86f
+ $ hg id
+ dfab7f3c2efb tip
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ c3fa057dd86f
+
+ $ echo "changed file1" >> file1
+ $ hg id
+ c3fa057dd86f+
+
+ $ hg revert --no-backup --all
+ reverting file1
+ $ hg diff
+ $ hg status
+ $ hg id
+ c3fa057dd86f
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff
+ $ hg status
+ $ hg id
+ dfab7f3c2efb tip
+
+ $ hg update -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "changed file1 different" >> file1
+
+ $ hg update
+ merging file1
+ warning: conflicts during merge.
+ merging file1 incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
+
+ $ hg diff --nodates
+ diff -r dfab7f3c2efb file1
+ --- a/file1
+ +++ b/file1
+ @@ -1,3 +1,7 @@
+ added file1
+ another line of text
+ +<<<<<<< local
+ +changed file1 different
+ +=======
+ changed file1
+ +>>>>>>> other
+
+ $ hg status
+ M file1
+ ? file1.orig
+ $ hg id
+ dfab7f3c2efb+ tip
+
+ $ hg revert --no-backup --all
+ reverting file1
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ dfab7f3c2efb tip
+
+ $ hg revert -r tip --no-backup --all
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ dfab7f3c2efb tip
+
+ $ hg update -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg diff
+ $ hg status
+ ? file1.orig
+ $ hg id
+ dfab7f3c2efb tip
+
diff --git a/tests/test-merge-subrepos.t b/tests/test-merge-subrepos.t
new file mode 100644
index 0000000..2bff401
--- /dev/null
+++ b/tests/test-merge-subrepos.t
@@ -0,0 +1,25 @@
+ $ hg init
+
+ $ echo a > a
+ $ hg ci -qAm 'add a'
+
+ $ hg init subrepo
+ $ echo 'subrepo = http://example.net/libfoo' > .hgsub
+ $ hg ci -qAm 'added subrepo'
+
+ $ hg up -qC 0
+ $ echo ax > a
+ $ hg ci -m 'changed a'
+ created new head
+
+ $ hg up -qC 1
+ $ cd subrepo
+ $ echo b > b
+ $ hg add b
+ $ cd ..
+
+Should fail, since there are added files to subrepo:
+
+ $ hg merge
+ abort: outstanding uncommitted changes in subrepository 'subrepo'
+ [255]
diff --git a/tests/test-merge-symlinks.t b/tests/test-merge-symlinks.t
new file mode 100644
index 0000000..9d50146
--- /dev/null
+++ b/tests/test-merge-symlinks.t
@@ -0,0 +1,63 @@
+ $ cat > echo.py <<EOF
+ > #!/usr/bin/env python
+ > import os, sys
+ > try:
+ > import msvcrt
+ > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ > msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
+ > except ImportError:
+ > pass
+ >
+ > for k in ('HG_FILE', 'HG_MY_ISLINK', 'HG_OTHER_ISLINK', 'HG_BASE_ISLINK'):
+ > print k, os.environ[k]
+ > EOF
+
+Create 2 heads containing the same file, once as
+a file, once as a link. Bundle was generated with:
+
+# hg init t
+# cd t
+# echo a > a
+# hg ci -qAm t0 -d '0 0'
+# echo l > l
+# hg ci -qAm t1 -d '1 0'
+# hg up -C 0
+# ln -s a l
+# hg ci -qAm t2 -d '2 0'
+# echo l2 > l2
+# hg ci -qAm t3 -d '3 0'
+
+ $ hg init t
+ $ cd t
+ $ hg -q pull "$TESTDIR/bundles/test-merge-symlinks.hg"
+ $ hg up -C 3
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Merge them and display *_ISLINK vars
+merge heads
+
+ $ hg merge --tool="python ../echo.py"
+ merging l
+ HG_FILE l
+ HG_MY_ISLINK 1
+ HG_OTHER_ISLINK 0
+ HG_BASE_ISLINK 0
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+Test working directory symlink bit calculation wrt copies,
+especially on non-supporting systems.
+merge working directory
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg copy l l2
+ $ HGMERGE="python ../echo.py" hg up 3
+ merging l2
+ HG_FILE l2
+ HG_MY_ISLINK 1
+ HG_OTHER_ISLINK 0
+ HG_BASE_ISLINK 0
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
diff --git a/tests/test-merge-tools.t b/tests/test-merge-tools.t
new file mode 100644
index 0000000..cee56cd
--- /dev/null
+++ b/tests/test-merge-tools.t
@@ -0,0 +1,806 @@
+test merge-tools configuration - mostly exercising filemerge.py
+
+ $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
+ $ hg init
+
+revision 0
+
+ $ echo "revision 0" > f
+ $ echo "space" >> f
+ $ hg commit -Am "revision 0"
+ adding f
+
+revision 1
+
+ $ echo "revision 1" > f
+ $ echo "space" >> f
+ $ hg commit -Am "revision 1"
+ $ hg update 0 > /dev/null
+
+revision 2
+
+ $ echo "revision 2" > f
+ $ echo "space" >> f
+ $ hg commit -Am "revision 2"
+ created new head
+ $ hg update 0 > /dev/null
+
+revision 3 - simple to merge
+
+ $ echo "revision 3" >> f
+ $ hg commit -Am "revision 3"
+ created new head
+ $ echo "[merge-tools]" > .hg/hgrc
+
+ $ beforemerge() {
+ > cat .hg/hgrc
+ > echo "# hg update -C 1"
+ > hg update -C 1 > /dev/null
+ > }
+ $ aftermerge() {
+ > echo "# cat f"
+ > cat f
+ > echo "# hg stat"
+ > hg stat
+ > rm -f f.orig
+ > }
+
+Tool selection
+
+default is internal merge:
+
+ $ beforemerge
+ [merge-tools]
+ # hg update -C 1
+
+hg merge -r 2
+override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
+running from a devel copy, not a temp installation
+
+ $ PATH="$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2
+ merging f
+ warning: conflicts during merge.
+ merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ <<<<<<< local
+ revision 1
+ =======
+ revision 2
+ >>>>>>> other
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+simplest hgrc using false for merge:
+
+ $ echo "false.whatever=" >> .hg/hgrc
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ # hg update -C 1
+ $ hg merge -r 2
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+unexecutable file in $PATH shouldn't be found:
+
+ $ touch false
+ $ hg up -qC 1
+ $ PATH="`pwd`:$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2
+ merging f
+ warning: conflicts during merge.
+ merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ rm false
+
+executable directory in $PATH shouldn't be found:
+
+ $ mkdir false
+ $ hg up -qC 1
+ $ PATH="`pwd`:$BINDIR" $PYTHON "$BINDIR"/hg merge -r 2
+ merging f
+ warning: conflicts during merge.
+ merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ rmdir false
+
+true with higher .priority gets precedence:
+
+ $ echo "true.priority=1" >> .hg/hgrc
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ # hg update -C 1
+ $ hg merge -r 2
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+unless lowered on command line:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.priority=-7
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+or false set higher on command line:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.false.priority=117
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+or true.executable not found in PATH:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=nonexistingmergetool
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+or true.executable with bogus path:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=/nonexisting/mergetool
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+but true.executable set to cat found in PATH works:
+
+ $ echo "true.executable=cat" >> .hg/hgrc
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2
+ merging f
+ revision 1
+ space
+ revision 0
+ space
+ revision 2
+ space
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+and true.executable set to cat with path works:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=cat
+ merging f
+ revision 1
+ space
+ revision 0
+ space
+ revision 2
+ space
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+#if unix-permissions
+
+environment variables in true.executable are handled:
+
+ $ echo 'echo "custom merge tool"' > "$HGTMP/merge.sh"
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg --config merge-tools.true.executable='sh' \
+ > --config merge-tools.true.args="$HGTMP/merge.sh" \
+ > merge -r 2
+ merging f
+ custom merge tool
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+#endif
+
+Tool selection and merge-patterns
+
+merge-patterns specifies new tool false:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-patterns.f=false
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+merge-patterns specifies executable not found in PATH and gets warning:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistingmergetool
+ couldn't find merge tool true specified for f
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+merge-patterns specifies executable with bogus path and gets warning:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexisting/mergetool
+ couldn't find merge tool true specified for f
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+ui.merge overrules priority
+
+ui.merge specifies false:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=false
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+ui.merge specifies internal:fail:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:fail
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+ui.merge specifies internal:local:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:local
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+ui.merge specifies internal:other:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:other
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 2
+ space
+ # hg stat
+ M f
+
+ui.merge specifies internal:prompt:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:prompt
+ no tool found to merge f
+ keep (l)ocal or take (o)ther? l
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+ui.merge specifies internal:dump:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:dump
+ merging f
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.base
+ ? f.local
+ ? f.orig
+ ? f.other
+
+f.base:
+
+ $ cat f.base
+ revision 0
+ space
+
+f.local:
+
+ $ cat f.local
+ revision 1
+ space
+
+f.other:
+
+ $ cat f.other
+ revision 2
+ space
+ $ rm f.base f.local f.other
+
+ui.merge specifies internal:other but is overruled by pattern for false:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+Premerge
+
+ui.merge specifies internal:other but is overruled by --tool=false
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config ui.merge=internal:other --tool=false
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+HGMERGE specifies internal:other but is overruled by --tool=false
+
+ $ HGMERGE=internal:other ; export HGMERGE
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --tool=false
+ merging f
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
+
+ $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
+
+Default is silent simplemerge:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 3
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ revision 3
+ # hg stat
+ M f
+
+.premerge=True is same:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 3 --config merge-tools.true.premerge=True
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ revision 3
+ # hg stat
+ M f
+
+.premerge=False executes merge-tool:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 3 --config merge-tools.true.premerge=False
+ merging f
+ revision 1
+ space
+ revision 0
+ space
+ revision 0
+ space
+ revision 3
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+Tool execution
+
+set tools.args explicit to include $base $local $other $output:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
+ > | sed 's,==> .* <==,==> ... <==,g'
+ merging f
+ ==> ... <==
+ revision 0
+ space
+
+ ==> ... <==
+ revision 1
+ space
+
+ ==> ... <==
+ revision 2
+ space
+
+ ==> ... <==
+ revision 1
+ space
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+
+Merge with "echo mergeresult > $local":
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ mergeresult
+ # hg stat
+ M f
+
+- and $local is the file f:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ mergeresult
+ # hg stat
+ M f
+
+Merge with "echo mergeresult > $output" - the variable is a bit magic:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ aftermerge
+ # cat f
+ mergeresult
+ # hg stat
+ M f
+
+Merge using tool with a path that must be quoted:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ cat <<EOF > 'my merge tool'
+ > cat "\$1" "\$2" "\$3" > "\$4"
+ > EOF
+ $ hg --config merge-tools.true.executable='sh' \
+ > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
+ > merge -r 2
+ merging f
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ rm -f 'my merge tool'
+ $ aftermerge
+ # cat f
+ revision 0
+ space
+ revision 1
+ space
+ revision 2
+ space
+ # hg stat
+ M f
+
+Merge post-processing
+
+cat is a bad merge-tool and doesn't change:
+
+ $ beforemerge
+ [merge-tools]
+ false.whatever=
+ true.priority=1
+ true.executable=cat
+ # hg update -C 1
+ $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
+ merging f
+ revision 1
+ space
+ revision 0
+ space
+ revision 2
+ space
+ output file f appears unchanged
+ was merge successful (yn)? n
+ merging f failed!
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ aftermerge
+ # cat f
+ revision 1
+ space
+ # hg stat
+ M f
+ ? f.orig
diff --git a/tests/test-merge-types.t b/tests/test-merge-types.t
new file mode 100644
index 0000000..c51a029
--- /dev/null
+++ b/tests/test-merge-types.t
@@ -0,0 +1,110 @@
+ $ "$TESTDIR/hghave" symlink execbit || exit 80
+
+ $ hg init
+
+ $ echo a > a
+ $ hg ci -Amadd
+ adding a
+
+ $ chmod +x a
+ $ hg ci -mexecutable
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm a
+ $ ln -s symlink a
+ $ hg ci -msymlink
+ created new head
+
+ $ hg merge --debug
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
+ conflicting flags for a
+ (n)one, e(x)ec or sym(l)ink? n
+ a: update permissions -> e
+ updating: a 1/1 files (100.00%)
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+
+Symlink is local parent, executable is other:
+
+ $ if [ -h a ]; then
+ > echo a is a symlink
+ > $TESTDIR/readlink.py a
+ > elif [ -x a ]; then
+ > echo a is executable
+ > else
+ > echo "a has no flags (default for conflicts)"
+ > fi
+ a has no flags (default for conflicts)
+
+ $ hg update -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg merge --debug
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
+ conflicting flags for a
+ (n)one, e(x)ec or sym(l)ink? n
+ a: remote is newer -> g
+ updating: a 1/1 files (100.00%)
+ getting a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+
+Symlink is other parent, executable is local:
+
+ $ if [ -h a ]; then
+ > echo a is a symlink
+ > $TESTDIR/readlink.py a
+ > elif [ -x a ]; then
+ > echo a is executable
+ > else
+ > echo "a has no flags (default for conflicts)"
+ > fi
+ a has no flags (default for conflicts)
+
+Update to link without local change should get us a symlink (issue3316):
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+
+Update to link with local change should cause a merge prompt (issue3200):
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo data > a
+ $ HGMERGE= hg up -y --debug
+ searching for copies back to rev 2
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
+ a: versions differ -> m
+ preserving a for resolve of a
+ updating: a 1/1 files (100.00%)
+ (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
+ picked tool 'internal:prompt' for a (binary False symlink True)
+ no tool found to merge a
+ keep (l)ocal or take (o)ther? l
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg diff --git
+ diff --git a/a b/a
+ old mode 120000
+ new mode 100644
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -symlink
+ \ No newline at end of file
+ +data
+
+
diff --git a/tests/test-merge1.t b/tests/test-merge1.t
new file mode 100644
index 0000000..e0303c9
--- /dev/null
+++ b/tests/test-merge1.t
@@ -0,0 +1,176 @@
+ $ cat <<EOF > merge
+ > import sys, os
+ >
+ > try:
+ > import msvcrt
+ > msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
+ > msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
+ > except ImportError:
+ > pass
+ >
+ > print "merging for", os.path.basename(sys.argv[1])
+ > EOF
+ $ HGMERGE="python ../merge"; export HGMERGE
+
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+
+ $ hg update 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo This is file c1 > c
+ $ hg add c
+ $ hg commit -m "commit #2"
+ created new head
+ $ echo This is file b1 > b
+no merges expected
+ $ hg merge -P 1
+ changeset: 1:b8bb4a988f25
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: commit #1
+
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg diff --nodates
+ diff -r 49035e18a8e6 b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +This is file b1
+ $ hg status
+ M b
+ $ cd ..; rm -r t
+
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+
+ $ hg update 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo This is file c1 > c
+ $ hg add c
+ $ hg commit -m "commit #2"
+ created new head
+ $ echo This is file b2 > b
+merge should fail
+ $ hg merge 1
+ b: untracked file differs
+ abort: untracked files in working directory differ from files in requested revision
+ [255]
+merge of b expected
+ $ hg merge -f 1
+ merging b
+ merging for b
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg diff --nodates
+ diff -r 49035e18a8e6 b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +This is file b2
+ $ hg status
+ M b
+ $ cd ..; rm -r t
+
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ echo This is file b22 > b
+ $ hg commit -m "commit #2"
+ $ hg update 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo This is file c1 > c
+ $ hg add c
+ $ hg commit -m "commit #3"
+ created new head
+
+Contents of b should be "this is file b1"
+ $ cat b
+ This is file b1
+
+ $ echo This is file b22 > b
+merge fails
+ $ hg merge 2
+ abort: outstanding uncommitted changes
+ (use 'hg status' to list changes)
+ [255]
+merge expected!
+ $ hg merge -f 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg diff --nodates
+ diff -r 85de557015a8 b
+ --- a/b
+ +++ b/b
+ @@ -1,1 +1,1 @@
+ -This is file b1
+ +This is file b22
+ $ hg status
+ M b
+ $ cd ..; rm -r t
+
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ echo This is file b22 > b
+ $ hg commit -m "commit #2"
+ $ hg update 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo This is file c1 > c
+ $ hg add c
+ $ hg commit -m "commit #3"
+ created new head
+ $ echo This is file b33 > b
+merge of b should fail
+ $ hg merge 2
+ abort: outstanding uncommitted changes
+ (use 'hg status' to list changes)
+ [255]
+merge of b expected
+ $ hg merge -f 2
+ merging b
+ merging for b
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg diff --nodates
+ diff -r 85de557015a8 b
+ --- a/b
+ +++ b/b
+ @@ -1,1 +1,1 @@
+ -This is file b1
+ +This is file b33
+ $ hg status
+ M b
+
+Test for issue2364
+
+ $ hg up -qC .
+ $ hg rm b
+ $ hg ci -md
+ $ hg revert -r -2 b
+ $ hg up -q -- -2
+
+ $ cd ..
diff --git a/tests/test-merge10.t b/tests/test-merge10.t
new file mode 100644
index 0000000..0ac57f4
--- /dev/null
+++ b/tests/test-merge10.t
@@ -0,0 +1,53 @@
+Test for changeset 9fe267f77f56ff127cf7e65dc15dd9de71ce8ceb
+(merge correctly when all the files in a directory are moved
+but then local changes are added in the same directory)
+
+ $ hg init a
+ $ cd a
+ $ mkdir -p testdir
+ $ echo a > testdir/a
+ $ hg add testdir/a
+ $ hg commit -m a
+ $ cd ..
+
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd a
+ $ echo alpha > testdir/a
+ $ hg commit -m remote-change
+ $ cd ..
+
+ $ cd b
+ $ mkdir testdir/subdir
+ $ hg mv testdir/a testdir/subdir/a
+ $ hg commit -m move
+ $ mkdir newdir
+ $ echo beta > newdir/beta
+ $ hg add newdir/beta
+ $ hg commit -m local-addition
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up -C 2
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge
+ merging testdir/subdir/a and testdir/a to testdir/subdir/a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg stat
+ M testdir/subdir/a
+ $ hg diff --nodates
+ diff -r bc21c9773bfa testdir/subdir/a
+ --- a/testdir/subdir/a
+ +++ b/testdir/subdir/a
+ @@ -1,1 +1,1 @@
+ -a
+ +alpha
+
+ $ cd ..
diff --git a/tests/test-merge2.t b/tests/test-merge2.t
new file mode 100644
index 0000000..4b6d566
--- /dev/null
+++ b/tests/test-merge2.t
@@ -0,0 +1,53 @@
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ rm b
+ $ hg update 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo This is file b2 > b
+ $ hg add b
+ $ hg commit -m "commit #2"
+ created new head
+ $ cd ..; rm -r t
+
+ $ mkdir t
+ $ cd t
+ $ hg init
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ rm b
+ $ hg update 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo This is file b2 > b
+ $ hg commit -A -m "commit #2"
+ adding b
+ created new head
+ $ cd ..; rm -r t
+
+ $ hg init t
+ $ cd t
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ rm b
+ $ hg remove b
+ $ hg update 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo This is file b2 > b
+ $ hg commit -A -m "commit #2"
+ adding b
+ created new head
+
+ $ cd ..
diff --git a/tests/test-merge4.t b/tests/test-merge4.t
new file mode 100644
index 0000000..d0c27d1
--- /dev/null
+++ b/tests/test-merge4.t
@@ -0,0 +1,25 @@
+ $ hg init
+ $ echo This is file a1 > a
+ $ hg add a
+ $ hg commit -m "commit #0"
+ $ echo This is file b1 > b
+ $ hg add b
+ $ hg commit -m "commit #1"
+ $ hg update 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo This is file c1 > c
+ $ hg add c
+ $ hg commit -m "commit #2"
+ created new head
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ rm b
+ $ echo This is file c22 > c
+
+Test hg behaves when committing with a missing file added by a merge
+
+ $ hg commit -m "commit #3"
+ abort: cannot commit merge with missing files
+ [255]
+
diff --git a/tests/test-merge5.t b/tests/test-merge5.t
new file mode 100644
index 0000000..fbc89b6
--- /dev/null
+++ b/tests/test-merge5.t
@@ -0,0 +1,37 @@
+ $ hg init
+ $ echo This is file a1 > a
+ $ echo This is file b1 > b
+ $ hg add a b
+ $ hg commit -m "commit #0"
+ $ echo This is file b22 > b
+ $ hg commit -m "comment #1"
+ $ hg update 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm b
+ $ hg commit -A -m "comment #2"
+ removing b
+ created new head
+ $ hg update 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg update
+ abort: crosses branches (merge branches or update --check to force update)
+ [255]
+ $ hg update -c
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mv a c
+
+In theory, we shouldn't need the "-y" below, but it prevents this test
+from hanging when "hg update" erroneously prompts the user for "keep
+or delete".
+
+Should abort:
+
+ $ hg update -y 1
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ [255]
+ $ mv c a
+
+Should succeed:
+
+ $ hg update -y 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff --git a/tests/test-merge6.t b/tests/test-merge6.t
new file mode 100644
index 0000000..8aee05e
--- /dev/null
+++ b/tests/test-merge6.t
@@ -0,0 +1,70 @@
+ $ cat <<EOF > merge
+ > import sys, os
+ > print "merging for", os.path.basename(sys.argv[1])
+ > EOF
+ $ HGMERGE="python ../merge"; export HGMERGE
+
+ $ hg init A1
+ $ cd A1
+ $ echo This is file foo1 > foo
+ $ echo This is file bar1 > bar
+ $ hg add foo bar
+ $ hg commit -m "commit text"
+
+ $ cd ..
+ $ hg clone A1 B1
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd A1
+ $ rm bar
+ $ hg remove bar
+ $ hg commit -m "commit test"
+
+ $ cd ../B1
+ $ echo This is file foo22 > foo
+ $ hg commit -m "commit test"
+
+ $ cd ..
+ $ hg clone A1 A2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone B1 B2
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd A1
+ $ hg pull ../B1
+ pulling from ../B1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m "commit test"
+bar should remain deleted.
+ $ hg manifest --debug
+ f9b0e817f6a48de3564c6b2957687c5e7297c5a0 644 foo
+
+ $ cd ../B2
+ $ hg pull ../A2
+ pulling from ../A2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m "commit test"
+bar should remain deleted.
+ $ hg manifest --debug
+ f9b0e817f6a48de3564c6b2957687c5e7297c5a0 644 foo
+
+ $ cd ..
diff --git a/tests/test-merge7.t b/tests/test-merge7.t
new file mode 100644
index 0000000..10eed9a
--- /dev/null
+++ b/tests/test-merge7.t
@@ -0,0 +1,147 @@
+initial
+ $ hg init test-a
+ $ cd test-a
+ $ cat >test.txt <<"EOF"
+ > 1
+ > 2
+ > 3
+ > EOF
+ $ hg add test.txt
+ $ hg commit -m "Initial"
+
+clone
+ $ cd ..
+ $ hg clone test-a test-b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+change test-a
+ $ cd test-a
+ $ cat >test.txt <<"EOF"
+ > one
+ > two
+ > three
+ > EOF
+ $ hg commit -m "Numbers as words"
+
+change test-b
+ $ cd ../test-b
+ $ cat >test.txt <<"EOF"
+ > 1
+ > 2.5
+ > 3
+ > EOF
+ $ hg commit -m "2 -> 2.5"
+
+now pull and merge from test-a
+ $ hg pull ../test-a
+ pulling from ../test-a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge
+ merging test.txt
+ warning: conflicts during merge.
+ merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+resolve conflict
+ $ cat >test.txt <<"EOF"
+ > one
+ > two-point-five
+ > three
+ > EOF
+ $ rm -f *.orig
+ $ hg resolve -m test.txt
+ $ hg commit -m "Merge 1"
+
+change test-a again
+ $ cd ../test-a
+ $ cat >test.txt <<"EOF"
+ > one
+ > two-point-one
+ > three
+ > EOF
+ $ hg commit -m "two -> two-point-one"
+
+pull and merge from test-a again
+ $ cd ../test-b
+ $ hg pull ../test-a
+ pulling from ../test-a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge --debug
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 96b70246a118, local: 50c3a7e29886+, remote: 40d11a4173a8
+ test.txt: versions differ -> m
+ preserving test.txt for resolve of test.txt
+ updating: test.txt 1/1 files (100.00%)
+ picked tool 'internal:merge' for test.txt (binary False symlink False)
+ merging test.txt
+ my test.txt@50c3a7e29886+ other test.txt@40d11a4173a8 ancestor test.txt@96b70246a118
+ warning: conflicts during merge.
+ merging test.txt incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+ $ cat test.txt
+ one
+ <<<<<<< local
+ two-point-five
+ =======
+ two-point-one
+ >>>>>>> other
+ three
+
+ $ hg debugindex test.txt
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 7 ..... 0 01365c4cca56 000000000000 000000000000 (re)
+ 1 7 9 ..... 1 7b013192566a 01365c4cca56 000000000000 (re)
+ 2 16 15 ..... 2 8fe46a3eb557 01365c4cca56 000000000000 (re)
+ 3 31 2. ..... 3 fc3148072371 7b013192566a 8fe46a3eb557 (re)
+ 4 5. 25 ..... 4 d40249267ae3 8fe46a3eb557 000000000000 (re)
+
+ $ hg log
+ changeset: 4:40d11a4173a8
+ tag: tip
+ parent: 2:96b70246a118
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: two -> two-point-one
+
+ changeset: 3:50c3a7e29886
+ parent: 1:d1e159716d41
+ parent: 2:96b70246a118
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Merge 1
+
+ changeset: 2:96b70246a118
+ parent: 0:b1832b9d912a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Numbers as words
+
+ changeset: 1:d1e159716d41
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2 -> 2.5
+
+ changeset: 0:b1832b9d912a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Initial
+
+
+ $ cd ..
diff --git a/tests/test-merge8.t b/tests/test-merge8.t
new file mode 100644
index 0000000..9a3a2cd
--- /dev/null
+++ b/tests/test-merge8.t
@@ -0,0 +1,29 @@
+Test for changeset ba7c74081861
+(update dirstate correctly for non-branchmerge updates)
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m a
+ $ cd ..
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd a
+ $ hg mv a b
+ $ hg commit -m move
+ $ echo b >> b
+ $ hg commit -m b
+ $ cd ../b
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg update
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ cd ..
diff --git a/tests/test-merge9.t b/tests/test-merge9.t
new file mode 100644
index 0000000..85e06f0
--- /dev/null
+++ b/tests/test-merge9.t
@@ -0,0 +1,94 @@
+test that we don't interrupt the merge session if
+a file-level merge failed
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo foo > foo
+ $ echo a > bar
+ $ hg ci -Am 'add foo'
+ adding bar
+ adding foo
+
+ $ hg mv foo baz
+ $ echo b >> bar
+ $ echo quux > quux1
+ $ hg ci -Am 'mv foo baz'
+ adding quux1
+
+ $ hg up -qC 0
+ $ echo >> foo
+ $ echo c >> bar
+ $ echo quux > quux2
+ $ hg ci -Am 'change foo'
+ adding quux2
+ created new head
+
+test with the rename on the remote side
+ $ HGMERGE=false hg merge
+ merging bar
+ merging bar failed!
+ merging foo and baz to baz
+ 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ hg resolve -l
+ U bar
+ R baz
+
+test with the rename on the local side
+ $ hg up -C 1
+ 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ HGMERGE=false hg merge
+ merging bar
+ merging bar failed!
+ merging baz and foo to baz
+ 1 files updated, 1 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+show unresolved
+ $ hg resolve -l
+ U bar
+ R baz
+
+unmark baz
+ $ hg resolve -u baz
+
+show
+ $ hg resolve -l
+ U bar
+ U baz
+ $ hg st
+ M bar
+ M baz
+ M quux2
+ ? bar.orig
+
+re-resolve baz
+ $ hg resolve baz
+ merging baz and foo to baz
+
+after resolve
+ $ hg resolve -l
+ U bar
+ R baz
+
+resolve all warning
+ $ hg resolve
+ abort: no files or directories specified; use --all to remerge all files
+ [255]
+
+resolve all
+ $ hg resolve -a
+ merging bar
+ warning: conflicts during merge.
+ merging bar incomplete! (edit conflicts, then use 'hg resolve --mark')
+ [1]
+
+after
+ $ hg resolve -l
+ U bar
+ R baz
+
+ $ cd ..
diff --git a/tests/test-minirst.py b/tests/test-minirst.py
new file mode 100644
index 0000000..df5fbb6
--- /dev/null
+++ b/tests/test-minirst.py
@@ -0,0 +1,245 @@
+from pprint import pprint
+from mercurial import minirst
+
+def debugformat(text, form, **kwargs):
+ if form == 'html':
+ print "html format:"
+ out = minirst.format(text, style=form, **kwargs)
+ else:
+ print "%d column format:" % form
+ out = minirst.format(text, width=form, **kwargs)
+
+ print "-" * 70
+ if type(out) == tuple:
+ print out[0][:-1]
+ print "-" * 70
+ pprint(out[1])
+ else:
+ print out[:-1]
+ print "-" * 70
+ print
+
+def debugformats(title, text, **kwargs):
+ print "== %s ==" % title
+ debugformat(text, 60, **kwargs)
+ debugformat(text, 30, **kwargs)
+ debugformat(text, 'html', **kwargs)
+
+paragraphs = """
+This is some text in the first paragraph.
+
+ A small indented paragraph.
+ It is followed by some lines
+ containing random whitespace.
+ \n \n \nThe third and final paragraph.
+"""
+
+debugformats('paragraphs', paragraphs)
+
+definitions = """
+A Term
+ Definition. The indented
+ lines make up the definition.
+Another Term
+ Another definition. The final line in the
+ definition determines the indentation, so
+ this will be indented with four spaces.
+
+ A Nested/Indented Term
+ Definition.
+"""
+
+debugformats('definitions', definitions)
+
+literals = r"""
+The fully minimized form is the most
+convenient form::
+
+ Hello
+ literal
+ world
+
+In the partially minimized form a paragraph
+simply ends with space-double-colon. ::
+
+ ////////////////////////////////////////
+ long un-wrapped line in a literal block
+ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+::
+
+ This literal block is started with '::',
+ the so-called expanded form. The paragraph
+ with '::' disappears in the final output.
+"""
+
+debugformats('literals', literals)
+
+lists = """
+- This is the first list item.
+
+ Second paragraph in the first list item.
+
+- List items need not be separated
+ by a blank line.
+- And will be rendered without
+ one in any case.
+
+We can have indented lists:
+
+ - This is an indented list item
+
+ - Another indented list item::
+
+ - A literal block in the middle
+ of an indented list.
+
+ (The above is not a list item since we are in the literal block.)
+
+::
+
+ Literal block with no indentation (apart from
+ the two spaces added to all literal blocks).
+
+1. This is an enumerated list (first item).
+2. Continuing with the second item.
+
+(1) foo
+(2) bar
+
+1) Another
+2) List
+
+Line blocks are also a form of list:
+
+| This is the first line.
+ The line continues here.
+| This is the second line.
+"""
+
+debugformats('lists', lists)
+
+options = """
+There is support for simple option lists,
+but only with long options:
+
+-X, --exclude filter an option with a short and long option with an argument
+-I, --include an option with both a short option and a long option
+--all Output all.
+--both Output both (this description is
+ quite long).
+--long Output all day long.
+
+--par This option has two paragraphs in its description.
+ This is the first.
+
+ This is the second. Blank lines may be omitted between
+ options (as above) or left in (as here).
+
+
+The next paragraph looks like an option list, but lacks the two-space
+marker after the option. It is treated as a normal paragraph:
+
+--foo bar baz
+"""
+
+debugformats('options', options)
+
+fields = """
+:a: First item.
+:ab: Second item. Indentation and wrapping
+ is handled automatically.
+
+Next list:
+
+:small: The larger key below triggers full indentation here.
+:much too large: This key is big enough to get its own line.
+"""
+
+debugformats('fields', fields)
+
+containers = """
+Normal output.
+
+.. container:: debug
+
+ Initial debug output.
+
+.. container:: verbose
+
+ Verbose output.
+
+ .. container:: debug
+
+ Debug output.
+"""
+
+debugformats('containers (normal)', containers)
+debugformats('containers (verbose)', containers, keep=['verbose'])
+debugformats('containers (debug)', containers, keep=['debug'])
+debugformats('containers (verbose debug)', containers,
+ keep=['verbose', 'debug'])
+
+roles = """Please see :hg:`add`."""
+debugformats('roles', roles)
+
+
+sections = """
+Title
+=====
+
+Section
+-------
+
+Subsection
+''''''''''
+
+Markup: ``foo`` and :hg:`help`
+------------------------------
+"""
+debugformats('sections', sections)
+
+
+admonitions = """
+.. note::
+ This is a note
+
+ - Bullet 1
+ - Bullet 2
+
+ .. warning:: This is a warning Second
+ input line of warning
+
+.. danger::
+ This is danger
+"""
+
+debugformats('admonitions', admonitions)
+
+comments = """
+Some text.
+
+.. A comment
+
+ .. An indented comment
+
+ Some indented text.
+
+..
+
+Empty comment above
+"""
+
+debugformats('comments', comments)
+
+
+data = [['a', 'b', 'c'],
+ ['1', '2', '3'],
+ ['foo', 'bar', 'baz this list is very very very long man']]
+
+rst = minirst.maketable(data, 2, True)
+table = ''.join(rst)
+
+print table
+
+debugformats('table', table)
diff --git a/tests/test-minirst.py.out b/tests/test-minirst.py.out
new file mode 100644
index 0000000..c2562ac
--- /dev/null
+++ b/tests/test-minirst.py.out
@@ -0,0 +1,766 @@
+== paragraphs ==
+60 column format:
+----------------------------------------------------------------------
+This is some text in the first paragraph.
+
+ A small indented paragraph. It is followed by some lines
+ containing random whitespace.
+
+The third and final paragraph.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+This is some text in the first
+paragraph.
+
+ A small indented paragraph.
+ It is followed by some lines
+ containing random
+ whitespace.
+
+The third and final paragraph.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+This is some text in the first paragraph.
+</p>
+<p>
+A small indented paragraph.
+It is followed by some lines
+containing random whitespace.
+</p>
+<p>
+The third and final paragraph.
+</p>
+----------------------------------------------------------------------
+
+== definitions ==
+60 column format:
+----------------------------------------------------------------------
+A Term
+ Definition. The indented lines make up the definition.
+
+Another Term
+ Another definition. The final line in the definition
+ determines the indentation, so this will be indented
+ with four spaces.
+
+ A Nested/Indented Term
+ Definition.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+A Term
+ Definition. The indented
+ lines make up the
+ definition.
+
+Another Term
+ Another definition. The
+ final line in the
+ definition determines the
+ indentation, so this will
+ be indented with four
+ spaces.
+
+ A Nested/Indented Term
+ Definition.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<dl>
+ <dt>A Term
+ <dd>Definition. The indented lines make up the definition.
+ <dt>Another Term
+ <dd>Another definition. The final line in the definition determines the indentation, so this will be indented with four spaces.
+ <dt>A Nested/Indented Term
+ <dd>Definition.
+</dl>
+----------------------------------------------------------------------
+
+== literals ==
+60 column format:
+----------------------------------------------------------------------
+The fully minimized form is the most convenient form:
+
+ Hello
+ literal
+ world
+
+In the partially minimized form a paragraph simply ends with
+space-double-colon.
+
+ ////////////////////////////////////////
+ long un-wrapped line in a literal block
+ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+ This literal block is started with '::',
+ the so-called expanded form. The paragraph
+ with '::' disappears in the final output.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+The fully minimized form is
+the most convenient form:
+
+ Hello
+ literal
+ world
+
+In the partially minimized
+form a paragraph simply ends
+with space-double-colon.
+
+ ////////////////////////////////////////
+ long un-wrapped line in a literal block
+ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+
+ This literal block is started with '::',
+ the so-called expanded form. The paragraph
+ with '::' disappears in the final output.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+The fully minimized form is the most
+convenient form:
+</p>
+<pre>
+Hello
+ literal
+ world
+</pre>
+<p>
+In the partially minimized form a paragraph
+simply ends with space-double-colon.
+</p>
+<pre>
+////////////////////////////////////////
+long un-wrapped line in a literal block
+\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
+</pre>
+<pre>
+This literal block is started with '::',
+ the so-called expanded form. The paragraph
+ with '::' disappears in the final output.
+</pre>
+----------------------------------------------------------------------
+
+== lists ==
+60 column format:
+----------------------------------------------------------------------
+- This is the first list item.
+
+ Second paragraph in the first list item.
+
+- List items need not be separated by a blank line.
+- And will be rendered without one in any case.
+
+We can have indented lists:
+
+ - This is an indented list item
+ - Another indented list item:
+
+ - A literal block in the middle
+ of an indented list.
+
+ (The above is not a list item since we are in the literal block.)
+
+ Literal block with no indentation (apart from
+ the two spaces added to all literal blocks).
+
+1. This is an enumerated list (first item).
+2. Continuing with the second item.
+(1) foo
+(2) bar
+1) Another
+2) List
+
+Line blocks are also a form of list:
+
+This is the first line. The line continues here.
+This is the second line.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+- This is the first list item.
+
+ Second paragraph in the
+ first list item.
+
+- List items need not be
+ separated by a blank line.
+- And will be rendered without
+ one in any case.
+
+We can have indented lists:
+
+ - This is an indented list
+ item
+ - Another indented list
+ item:
+
+ - A literal block in the middle
+ of an indented list.
+
+ (The above is not a list item since we are in the literal block.)
+
+ Literal block with no indentation (apart from
+ the two spaces added to all literal blocks).
+
+1. This is an enumerated list
+ (first item).
+2. Continuing with the second
+ item.
+(1) foo
+(2) bar
+1) Another
+2) List
+
+Line blocks are also a form of
+list:
+
+This is the first line. The
+line continues here.
+This is the second line.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<ul>
+ <li> This is the first list item.
+<p>
+Second paragraph in the first list item.
+</p>
+ <li> List items need not be separated by a blank line.
+ <li> And will be rendered without one in any case.
+</ul>
+<p>
+We can have indented lists:
+</p>
+<ul>
+ <li> This is an indented list item
+ <li> Another indented list item:
+<pre>
+- A literal block in the middle
+ of an indented list.
+</pre>
+<pre>
+(The above is not a list item since we are in the literal block.)
+</pre>
+</ul>
+<pre>
+Literal block with no indentation (apart from
+the two spaces added to all literal blocks).
+</pre>
+<ol>
+ <li> This is an enumerated list (first item).
+ <li> Continuing with the second item.
+ <li> foo
+ <li> bar
+ <li> Another
+ <li> List
+</ol>
+<p>
+Line blocks are also a form of list:
+</p>
+<ol>
+ <li> This is the first line. The line continues here.
+ <li> This is the second line.
+</ol>
+----------------------------------------------------------------------
+
+== options ==
+60 column format:
+----------------------------------------------------------------------
+There is support for simple option lists, but only with long
+options:
+
+ -X --exclude filter an option with a short and long option
+ with an argument
+ -I --include an option with both a short option and
+ a long option
+ --all Output all.
+ --both Output both (this description is quite
+ long).
+ --long Output all day long.
+ --par This option has two paragraphs in its
+ description. This is the first.
+
+ This is the second. Blank lines may
+ be omitted between options (as above)
+ or left in (as here).
+
+The next paragraph looks like an option list, but lacks the
+two-space marker after the option. It is treated as a normal
+paragraph:
+
+--foo bar baz
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+There is support for simple
+option lists, but only with
+long options:
+
+ -X --exclude filter an
+ option
+ with a
+ short
+ and
+ long
+ option
+ with an
+ argumen
+ t
+ -I --include an
+ option
+ with
+ both a
+ short
+ option
+ and a
+ long
+ option
+ --all Output
+ all.
+ --both Output
+ both
+ (this d
+ escript
+ ion is
+ quite
+ long).
+ --long Output
+ all day
+ long.
+ --par This
+ option
+ has two
+ paragra
+ phs in
+ its des
+ criptio
+ n. This
+ is the
+ first.
+
+ This is
+ the
+ second.
+ Blank
+ lines
+ may be
+ omitted
+ between
+ options
+ (as
+ above)
+ or left
+ in (as
+ here).
+
+The next paragraph looks like
+an option list, but lacks the
+two-space marker after the
+option. It is treated as a
+normal paragraph:
+
+--foo bar baz
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+There is support for simple option lists,
+but only with long options:
+</p>
+<dl>
+ <dt>-X --exclude filter
+ <dd>an option with a short and long option with an argument
+ <dt>-I --include
+ <dd>an option with both a short option and a long option
+ <dt> --all
+ <dd>Output all.
+ <dt> --both
+ <dd>Output both (this description is quite long).
+ <dt> --long
+ <dd>Output all day long.
+ <dt> --par
+ <dd>This option has two paragraphs in its description. This is the first.
+<p>
+This is the second. Blank lines may be omitted between
+options (as above) or left in (as here).
+</p>
+</dl>
+<p>
+The next paragraph looks like an option list, but lacks the two-space
+marker after the option. It is treated as a normal paragraph:
+</p>
+<p>
+--foo bar baz
+</p>
+----------------------------------------------------------------------
+
+== fields ==
+60 column format:
+----------------------------------------------------------------------
+a First item.
+ab Second item. Indentation and wrapping is
+ handled automatically.
+
+Next list:
+
+small The larger key below triggers full indentation
+ here.
+much too large
+ This key is big enough to get its own line.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+a First item.
+ab Second item.
+ Indentation and
+ wrapping is
+ handled
+ automatically.
+
+Next list:
+
+small The larger key
+ below triggers
+ full indentation
+ here.
+much too large
+ This key is big
+ enough to get
+ its own line.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<dl>
+ <dt>a
+ <dd>First item.
+ <dt>ab
+ <dd>Second item. Indentation and wrapping is handled automatically.
+</dl>
+<p>
+Next list:
+</p>
+<dl>
+ <dt>small
+ <dd>The larger key below triggers full indentation here.
+ <dt>much too large
+ <dd>This key is big enough to get its own line.
+</dl>
+----------------------------------------------------------------------
+
+== containers (normal) ==
+60 column format:
+----------------------------------------------------------------------
+Normal output.
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Normal output.
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Normal output.
+</p>
+----------------------------------------------------------------------
+
+== containers (verbose) ==
+60 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Verbose output.
+----------------------------------------------------------------------
+['debug', 'debug']
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Verbose output.
+----------------------------------------------------------------------
+['debug', 'debug']
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Normal output.
+</p>
+<p>
+Verbose output.
+</p>
+----------------------------------------------------------------------
+['debug', 'debug']
+----------------------------------------------------------------------
+
+== containers (debug) ==
+60 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Initial debug output.
+----------------------------------------------------------------------
+['verbose']
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Initial debug output.
+----------------------------------------------------------------------
+['verbose']
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Normal output.
+</p>
+<p>
+Initial debug output.
+</p>
+----------------------------------------------------------------------
+['verbose']
+----------------------------------------------------------------------
+
+== containers (verbose debug) ==
+60 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Initial debug output.
+
+Verbose output.
+
+Debug output.
+----------------------------------------------------------------------
+[]
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Normal output.
+
+Initial debug output.
+
+Verbose output.
+
+Debug output.
+----------------------------------------------------------------------
+[]
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Normal output.
+</p>
+<p>
+Initial debug output.
+</p>
+<p>
+Verbose output.
+</p>
+<p>
+Debug output.
+</p>
+----------------------------------------------------------------------
+[]
+----------------------------------------------------------------------
+
+== roles ==
+60 column format:
+----------------------------------------------------------------------
+Please see "hg add".
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Please see "hg add".
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Please see "hg add".
+</p>
+----------------------------------------------------------------------
+
+== sections ==
+60 column format:
+----------------------------------------------------------------------
+Title
+=====
+
+Section
+-------
+
+Subsection
+''''''''''
+
+Markup: "foo" and "hg help"
+---------------------------
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Title
+=====
+
+Section
+-------
+
+Subsection
+''''''''''
+
+Markup: "foo" and "hg help"
+---------------------------
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<h1>Title</h1>
+<h2>Section</h2>
+<h3>Subsection</h3>
+<h2>Markup: "foo" and "hg help"</h2>
+----------------------------------------------------------------------
+
+== admonitions ==
+60 column format:
+----------------------------------------------------------------------
+Note:
+ This is a note
+
+ - Bullet 1
+ - Bullet 2
+
+ Warning!
+ This is a warning Second input line of warning
+
+!Danger!
+ This is danger
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Note:
+ This is a note
+
+ - Bullet 1
+ - Bullet 2
+
+ Warning!
+ This is a warning Second
+ input line of warning
+
+!Danger!
+ This is danger
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+<b>Note:</b> This is a note
+</p>
+<ul>
+ <li> Bullet 1
+ <li> Bullet 2
+</ul>
+<p>
+<b>Warning!</b> This is a warning Second input line of warning
+</p>
+<p>
+<b>!Danger!</b> This is danger
+</p>
+----------------------------------------------------------------------
+
+== comments ==
+60 column format:
+----------------------------------------------------------------------
+Some text.
+
+ Some indented text.
+
+Empty comment above
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+Some text.
+
+ Some indented text.
+
+Empty comment above
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<p>
+Some text.
+</p>
+<p>
+Some indented text.
+</p>
+<p>
+Empty comment above
+</p>
+----------------------------------------------------------------------
+
+ === === ========================================
+ a b c
+ === === ========================================
+ 1 2 3
+ foo bar baz this list is very very very long man
+ === === ========================================
+
+== table ==
+60 column format:
+----------------------------------------------------------------------
+ a b c
+ ------------------------------------------------
+ 1 2 3
+ foo bar baz this list is very very very long man
+----------------------------------------------------------------------
+
+30 column format:
+----------------------------------------------------------------------
+ a b c
+ ------------------------------
+ 1 2 3
+ foo bar baz this list is
+ very very very long
+ man
+----------------------------------------------------------------------
+
+html format:
+----------------------------------------------------------------------
+<table>
+ <tr><th>a</th><th>b</th><th>c</th></tr>
+ <tr><td>1</td><td>2</td><td>3</td></tr>
+ <tr><td>foo</td><td>bar</td><td>baz this list is very very very long man</td></tr>
+</table>
+----------------------------------------------------------------------
+
diff --git a/tests/test-mq-caches.t b/tests/test-mq-caches.t
new file mode 100644
index 0000000..f74a528
--- /dev/null
+++ b/tests/test-mq-caches.t
@@ -0,0 +1,126 @@
+ $ branches=.hg/cache/branchheads
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'mq =' >> $HGRCPATH
+
+ $ show_branch_cache()
+ > {
+ > # force cache (re)generation
+ > hg log -r does-not-exist 2> /dev/null
+ > hg log -r tip --template 'tip: {rev}\n'
+ > if [ -f $branches ]; then
+ > sort $branches
+ > else
+ > echo No branch cache
+ > fi
+ > if [ "$1" = 1 ]; then
+ > for b in foo bar; do
+ > hg log -r $b --template "branch $b: "'{rev}\n'
+ > done
+ > fi
+ > }
+
+ $ hg init a
+ $ cd a
+ $ hg qinit -c
+
+
+mq patch on an empty repo
+
+ $ hg qnew -d '0 0' p1
+ $ show_branch_cache
+ tip: 0
+ No branch cache
+
+ $ echo > pfile
+ $ hg add pfile
+ $ hg qrefresh -m 'patch 1'
+ $ show_branch_cache
+ tip: 0
+ d986d5caac23a7d44a46efc0ddaf5eb9665844cf 0
+ d986d5caac23a7d44a46efc0ddaf5eb9665844cf default
+
+some regular revisions
+
+ $ hg qpop
+ popping p1
+ patch queue now empty
+ $ echo foo > foo
+ $ hg add foo
+ $ echo foo > .hg/branch
+ $ hg ci -m 'branch foo'
+
+ $ echo bar > bar
+ $ hg add bar
+ $ echo bar > .hg/branch
+ $ hg ci -m 'branch bar'
+ $ show_branch_cache
+ tip: 1
+ c229711f16da3d7591f89b1b8d963b79bda22714 1
+ c229711f16da3d7591f89b1b8d963b79bda22714 bar
+ dc25e3827021582e979f600811852e36cbe57341 foo
+
+add some mq patches
+
+ $ hg qpush
+ applying p1
+ now at: p1
+ $ show_branch_cache
+ tip: 2
+ c229711f16da3d7591f89b1b8d963b79bda22714 1
+ c229711f16da3d7591f89b1b8d963b79bda22714 bar
+ dc25e3827021582e979f600811852e36cbe57341 foo
+
+ $ hg qnew -d '0 0' p2
+ $ echo foo > .hg/branch
+ $ echo foo2 >> foo
+ $ hg qrefresh -m 'patch 2'
+ $ show_branch_cache 1
+ tip: 3
+ 982611f6955f9c48d3365decea203217c945ef0d 2
+ 982611f6955f9c48d3365decea203217c945ef0d bar
+ dc25e3827021582e979f600811852e36cbe57341 foo
+ branch foo: 3
+ branch bar: 2
+
+removing the cache
+
+ $ rm $branches
+ $ show_branch_cache 1
+ tip: 3
+ c229711f16da3d7591f89b1b8d963b79bda22714 1
+ c229711f16da3d7591f89b1b8d963b79bda22714 bar
+ dc25e3827021582e979f600811852e36cbe57341 foo
+ branch foo: 3
+ branch bar: 2
+
+importing rev 1 (the cache now ends in one of the patches)
+
+ $ hg qimport -r 1 -n p0
+ $ show_branch_cache 1
+ tip: 3
+ c229711f16da3d7591f89b1b8d963b79bda22714 1
+ c229711f16da3d7591f89b1b8d963b79bda22714 bar
+ dc25e3827021582e979f600811852e36cbe57341 foo
+ branch foo: 3
+ branch bar: 2
+ $ hg log -r qbase --template 'qbase: {rev}\n'
+ qbase: 1
+
+detect an invalid cache
+
+ $ hg qpop -a
+ popping p2
+ popping p1
+ popping p0
+ patch queue now empty
+ $ hg qpush -a
+ applying p0
+ applying p1
+ applying p2
+ now at: p2
+ $ show_branch_cache
+ tip: 3
+ dc25e3827021582e979f600811852e36cbe57341 0
+ dc25e3827021582e979f600811852e36cbe57341 foo
+
+ $ cd ..
diff --git a/tests/test-mq-eol.t b/tests/test-mq-eol.t
new file mode 100644
index 0000000..3566340
--- /dev/null
+++ b/tests/test-mq-eol.t
@@ -0,0 +1,207 @@
+
+Test interactions between mq and patch.eol
+
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+ $ cat > makepatch.py <<EOF
+ > f = file('eol.diff', 'wb')
+ > w = f.write
+ > w('test message\n')
+ > w('diff --git a/a b/a\n')
+ > w('--- a/a\n')
+ > w('+++ b/a\n')
+ > w('@@ -1,5 +1,5 @@\n')
+ > w(' a\n')
+ > w('-b\r\n')
+ > w('+y\r\n')
+ > w(' c\r\n')
+ > w(' d\n')
+ > w('-e\n')
+ > w('\ No newline at end of file\n')
+ > w('+z\r\n')
+ > w('\ No newline at end of file\r\n')
+ > EOF
+
+ $ cat > cateol.py <<EOF
+ > import sys
+ > for line in file(sys.argv[1], 'rb'):
+ > line = line.replace('\r', '<CR>')
+ > line = line.replace('\n', '<LF>')
+ > print line
+ > EOF
+
+ $ hg init repo
+ $ cd repo
+ $ echo '\.diff' > .hgignore
+ $ echo '\.rej' >> .hgignore
+
+
+Test different --eol values
+
+ $ python -c 'file("a", "wb").write("a\nb\nc\nd\ne")'
+ $ hg ci -Am adda
+ adding .hgignore
+ adding a
+ $ python ../makepatch.py
+ $ hg qimport eol.diff
+ adding eol.diff to series file
+
+should fail in strict mode
+
+ $ hg qpush
+ applying eol.diff
+ patching file a
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file a.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh eol.diff
+ [2]
+ $ hg qpop
+ popping eol.diff
+ patch queue now empty
+
+invalid eol
+
+ $ hg --config patch.eol='LFCR' qpush
+ applying eol.diff
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh eol.diff
+ [2]
+ $ hg qpop
+ popping eol.diff
+ patch queue now empty
+
+force LF
+
+ $ hg --config patch.eol='CRLF' qpush
+ applying eol.diff
+ now at: eol.diff
+ $ hg qrefresh
+ $ python ../cateol.py .hg/patches/eol.diff
+ test message<LF>
+ <LF>
+ diff -r 0d0bf99a8b7a a<LF>
+ --- a/a<LF>
+ +++ b/a<LF>
+ @@ -1,5 +1,5 @@<LF>
+ -a<LF>
+ -b<LF>
+ -c<LF>
+ -d<LF>
+ -e<LF>
+ \ No newline at end of file<LF>
+ +a<CR><LF>
+ +y<CR><LF>
+ +c<CR><LF>
+ +d<CR><LF>
+ +z<LF>
+ \ No newline at end of file<LF>
+ $ python ../cateol.py a
+ a<CR><LF>
+ y<CR><LF>
+ c<CR><LF>
+ d<CR><LF>
+ z
+ $ hg qpop
+ popping eol.diff
+ patch queue now empty
+
+push again forcing LF and compare revisions
+
+ $ hg --config patch.eol='CRLF' qpush
+ applying eol.diff
+ now at: eol.diff
+ $ python ../cateol.py a
+ a<CR><LF>
+ y<CR><LF>
+ c<CR><LF>
+ d<CR><LF>
+ z
+ $ hg qpop
+ popping eol.diff
+ patch queue now empty
+
+push again without LF and compare revisions
+
+ $ hg qpush
+ applying eol.diff
+ now at: eol.diff
+ $ python ../cateol.py a
+ a<CR><LF>
+ y<CR><LF>
+ c<CR><LF>
+ d<CR><LF>
+ z
+ $ hg qpop
+ popping eol.diff
+ patch queue now empty
+ $ cd ..
+
+
+Test .rej file EOL are left unchanged
+
+ $ hg init testeol
+ $ cd testeol
+ $ python -c "file('a', 'wb').write('1\r\n2\r\n3\r\n4')"
+ $ hg ci -Am adda
+ adding a
+ $ python -c "file('a', 'wb').write('1\r\n2\r\n33\r\n4')"
+ $ hg qnew patch1
+ $ hg qpop
+ popping patch1
+ patch queue now empty
+ $ python -c "file('a', 'wb').write('1\r\n22\r\n33\r\n4')"
+ $ hg ci -m changea
+
+ $ hg --config 'patch.eol=LF' qpush
+ applying patch1
+ patching file a
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file a.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh patch1
+ [2]
+ $ hg qpop
+ popping patch1
+ patch queue now empty
+ $ cat a.rej
+ --- a
+ +++ a
+ @@ -1,4 +1,4 @@
+ 1\r (esc)
+ 2\r (esc)
+ -3\r (esc)
+ +33\r (esc)
+ 4
+ \ No newline at end of file
+
+ $ hg --config 'patch.eol=auto' qpush
+ applying patch1
+ patching file a
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file a.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh patch1
+ [2]
+ $ hg qpop
+ popping patch1
+ patch queue now empty
+ $ cat a.rej
+ --- a
+ +++ a
+ @@ -1,4 +1,4 @@
+ 1\r (esc)
+ 2\r (esc)
+ -3\r (esc)
+ +33\r (esc)
+ 4
+ \ No newline at end of file
+ $ cd ..
diff --git a/tests/test-mq-git.t b/tests/test-mq-git.t
new file mode 100644
index 0000000..f5fcf79
--- /dev/null
+++ b/tests/test-mq-git.t
@@ -0,0 +1,210 @@
+# Test the plumbing of mq.git option
+# Automatic upgrade itself is tested elsewhere.
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+ $ hg init repo-auto
+ $ cd repo-auto
+
+git=auto: regular patch creation:
+
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -d '0 0' -f adda
+
+ $ cat .hg/patches/adda
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ # Date 0 0
+
+ diff -r 000000000000 -r ef8dafc9fa4c a
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+
+git=auto: git patch creation with copy:
+
+ $ hg cp a b
+ $ hg qnew -d '0 0' -f copy
+
+ $ cat .hg/patches/copy
+ # HG changeset patch
+ # Parent ef8dafc9fa4caff80f6e243eb0171bcd60c455b4
+ # Date 0 0
+
+ diff --git a/a b/b
+ copy from a
+ copy to b
+
+git=auto: git patch when using --git:
+
+ $ echo regular > regular
+ $ hg add regular
+ $ hg qnew -d '0 0' --git -f git
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 99586d5f048c399e20f81cee41fbb3809c0e735d
+ # Date 0 0
+
+ diff --git a/regular b/regular
+ new file mode 100644
+ --- /dev/null
+ +++ b/regular
+ @@ -0,0 +1,1 @@
+ +regular
+
+git=auto: regular patch after qrefresh without --git:
+
+ $ hg qrefresh -d '0 0'
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 99586d5f048c399e20f81cee41fbb3809c0e735d
+ # Date 0 0
+
+ diff -r 99586d5f048c regular
+ --- /dev/null
+ +++ b/regular
+ @@ -0,0 +1,1 @@
+ +regular
+
+ $ cd ..
+
+ $ hg init repo-keep
+ $ cd repo-keep
+ $ echo '[mq]' > .hg/hgrc
+ $ echo 'git = KEEP' >> .hg/hgrc
+
+git=keep: git patch with --git:
+
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -d '0 0' -f --git git
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ # Date 0 0
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+
+git=keep: git patch after qrefresh without --git:
+
+ $ echo a >> a
+ $ hg qrefresh -d '0 0'
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ # Date 0 0
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,2 @@
+ +a
+ +a
+ $ cd ..
+
+ $ hg init repo-yes
+ $ cd repo-yes
+ $ echo '[mq]' > .hg/hgrc
+ $ echo 'git = yes' >> .hg/hgrc
+
+git=yes: git patch:
+
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -d '0 0' -f git
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ # Date 0 0
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,1 @@
+ +a
+
+git=yes: git patch after qrefresh:
+
+ $ echo a >> a
+ $ hg qrefresh -d '0 0'
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ # Date 0 0
+
+ diff --git a/a b/a
+ new file mode 100644
+ --- /dev/null
+ +++ b/a
+ @@ -0,0 +1,2 @@
+ +a
+ +a
+ $ cd ..
+
+ $ hg init repo-no
+ $ cd repo-no
+ $ echo '[diff]' > .hg/hgrc
+ $ echo 'git = True' >> .hg/hgrc
+ $ echo '[mq]' > .hg/hgrc
+ $ echo 'git = False' >> .hg/hgrc
+
+git=no: regular patch with copy:
+
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -d '0 0' -f adda
+ $ hg cp a b
+ $ hg qnew -d '0 0' -f regular
+
+ $ cat .hg/patches/regular
+ # HG changeset patch
+ # Parent ef8dafc9fa4caff80f6e243eb0171bcd60c455b4
+ # Date 0 0
+
+ diff -r ef8dafc9fa4c -r a70404f79ba3 b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +a
+
+git=no: regular patch after qrefresh with copy:
+
+ $ hg cp a c
+ $ hg qrefresh -d '0 0'
+
+ $ cat .hg/patches/regular
+ # HG changeset patch
+ # Parent ef8dafc9fa4caff80f6e243eb0171bcd60c455b4
+ # Date 0 0
+
+ diff -r ef8dafc9fa4c b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +a
+ diff -r ef8dafc9fa4c c
+ --- /dev/null
+ +++ b/c
+ @@ -0,0 +1,1 @@
+ +a
+
+ $ cd ..
+
diff --git a/tests/test-mq-guards.t b/tests/test-mq-guards.t
new file mode 100644
index 0000000..4ab4ac9
--- /dev/null
+++ b/tests/test-mq-guards.t
@@ -0,0 +1,509 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init
+ $ hg qinit
+
+ $ echo x > x
+ $ hg ci -Ama
+ adding x
+
+ $ hg qnew a.patch
+ $ echo a > a
+ $ hg add a
+ $ hg qrefresh
+
+ $ hg qnew b.patch
+ $ echo b > b
+ $ hg add b
+ $ hg qrefresh
+
+ $ hg qnew c.patch
+ $ echo c > c
+ $ hg add c
+ $ hg qrefresh
+
+ $ hg qpop -a
+ popping c.patch
+ popping b.patch
+ popping a.patch
+ patch queue now empty
+
+
+should fail
+
+ $ hg qguard does-not-exist.patch +bleh
+ abort: no patch named does-not-exist.patch
+ [255]
+
+
+should fail
+
+ $ hg qguard +fail
+ abort: no patches applied
+ [255]
+
+ $ hg qpush
+ applying a.patch
+ now at: a.patch
+
+should guard a.patch
+
+ $ hg qguard +a
+
+should print +a
+
+ $ hg qguard
+ a.patch: +a
+ $ hg qpop
+ popping a.patch
+ patch queue now empty
+
+
+should fail
+
+ $ hg qpush a.patch
+ cannot push 'a.patch' - guarded by '+a'
+ [1]
+
+ $ hg qguard a.patch
+ a.patch: +a
+
+should push b.patch
+
+ $ hg qpush
+ applying b.patch
+ now at: b.patch
+
+ $ hg qpop
+ popping b.patch
+ patch queue now empty
+
+test selection of an empty guard
+
+ $ hg qselect ""
+ abort: guard cannot be an empty string
+ [255]
+ $ hg qselect a
+ number of unguarded, unapplied patches has changed from 2 to 3
+
+should push a.patch
+
+ $ hg qpush
+ applying a.patch
+ now at: a.patch
+
+ $ hg qguard -- c.patch -a
+
+should print -a
+
+ $ hg qguard c.patch
+ c.patch: -a
+
+
+should skip c.patch
+
+ $ hg qpush -a
+ applying b.patch
+ skipping c.patch - guarded by '-a'
+ now at: b.patch
+ $ hg qnext
+ all patches applied
+ [1]
+
+should display b.patch
+
+ $ hg qtop
+ b.patch
+
+ $ hg qguard -n c.patch
+
+should push c.patch
+
+ $ hg qpush -a
+ applying c.patch
+ now at: c.patch
+
+ $ hg qpop -a
+ popping c.patch
+ popping b.patch
+ popping a.patch
+ patch queue now empty
+ $ hg qselect -n
+ guards deactivated
+ number of unguarded, unapplied patches has changed from 3 to 2
+
+should push all
+
+ $ hg qpush -a
+ applying b.patch
+ applying c.patch
+ now at: c.patch
+
+ $ hg qpop -a
+ popping c.patch
+ popping b.patch
+ patch queue now empty
+ $ hg qguard a.patch +1
+ $ hg qguard b.patch +2
+ $ hg qselect 1
+ number of unguarded, unapplied patches has changed from 1 to 2
+
+should push a.patch, not b.patch
+
+ $ hg qpush
+ applying a.patch
+ now at: a.patch
+ $ hg qpush
+ applying c.patch
+ now at: c.patch
+ $ hg qpop -a
+ popping c.patch
+ popping a.patch
+ patch queue now empty
+
+ $ hg qselect 2
+
+should push b.patch
+
+ $ hg qpush
+ applying b.patch
+ now at: b.patch
+ $ hg qpush -a
+ applying c.patch
+ now at: c.patch
+ $ hg qprev
+ b.patch
+
+Used to be an issue with holes in the patch sequence
+So, put one hole on the base and ask for topmost patch.
+
+ $ hg qtop
+ c.patch
+ $ hg qpop -a
+ popping c.patch
+ popping b.patch
+ patch queue now empty
+
+ $ hg qselect 1 2
+ number of unguarded, unapplied patches has changed from 2 to 3
+
+should push a.patch, b.patch
+
+ $ hg qpush
+ applying a.patch
+ now at: a.patch
+ $ hg qpush
+ applying b.patch
+ now at: b.patch
+ $ hg qpop -a
+ popping b.patch
+ popping a.patch
+ patch queue now empty
+
+ $ hg qguard -- a.patch +1 +2 -3
+ $ hg qselect 1 2 3
+ number of unguarded, unapplied patches has changed from 3 to 2
+
+
+list patches and guards
+
+ $ hg qguard -l
+ a.patch: +1 +2 -3
+ b.patch: +2
+ c.patch: unguarded
+
+have at least one patch applied to test coloring
+
+ $ hg qpush
+ applying b.patch
+ now at: b.patch
+
+list patches and guards with color
+
+ $ hg --config extensions.color= qguard --config color.mode=ansi \
+ > -l --color=always
+ \x1b[0;30;1ma.patch\x1b[0m: \x1b[0;33m+1\x1b[0m \x1b[0;33m+2\x1b[0m \x1b[0;31m-3\x1b[0m (esc)
+ \x1b[0;34;1;4mb.patch\x1b[0m: \x1b[0;33m+2\x1b[0m (esc)
+ \x1b[0;30;1mc.patch\x1b[0m: \x1b[0;32munguarded\x1b[0m (esc)
+
+should pop b.patch
+
+ $ hg qpop
+ popping b.patch
+ patch queue now empty
+
+list series
+
+ $ hg qseries -v
+ 0 G a.patch
+ 1 U b.patch
+ 2 U c.patch
+
+list guards
+
+ $ hg qselect
+ 1
+ 2
+ 3
+
+should push b.patch
+
+ $ hg qpush
+ applying b.patch
+ now at: b.patch
+
+ $ hg qpush -a
+ applying c.patch
+ now at: c.patch
+ $ hg qselect -n --reapply
+ guards deactivated
+ popping guarded patches
+ popping c.patch
+ popping b.patch
+ patch queue now empty
+ reapplying unguarded patches
+ applying c.patch
+ now at: c.patch
+
+guards in series file: +1 +2 -3
+
+ $ hg qselect -s
+ +1
+ +2
+ -3
+
+should show c.patch
+
+ $ hg qapplied
+ c.patch
+
+ $ hg qrename a.patch new.patch
+
+should show :
+
+
+new.patch: +1 +2 -3
+
+
+b.patch: +2
+
+
+c.patch: unguarded
+
+ $ hg qguard -l
+ new.patch: +1 +2 -3
+ b.patch: +2
+ c.patch: unguarded
+
+ $ hg qnew d.patch
+ $ hg qpop
+ popping d.patch
+ now at: c.patch
+
+should show new.patch and b.patch as Guarded, c.patch as Applied
+
+
+and d.patch as Unapplied
+
+ $ hg qseries -v
+ 0 G new.patch
+ 1 G b.patch
+ 2 A c.patch
+ 3 U d.patch
+
+qseries again, but with color
+
+ $ hg --config extensions.color= --config color.mode=ansi qseries -v --color=always
+ 0 G \x1b[0;30;1mnew.patch\x1b[0m (esc)
+ 1 G \x1b[0;30;1mb.patch\x1b[0m (esc)
+ 2 A \x1b[0;34;1;4mc.patch\x1b[0m (esc)
+ 3 U \x1b[0;30;1md.patch\x1b[0m (esc)
+
+ $ hg qguard d.patch +2
+
+new.patch, b.patch: Guarded. c.patch: Applied. d.patch: Guarded.
+
+ $ hg qseries -v
+ 0 G new.patch
+ 1 G b.patch
+ 2 A c.patch
+ 3 G d.patch
+
+ $ qappunappv()
+ > {
+ > for command in qapplied "qapplied -v" qunapplied "qunapplied -v"; do
+ > echo % hg $command
+ > hg $command
+ > done
+ > }
+
+ $ hg qpop -a
+ popping c.patch
+ patch queue now empty
+ $ hg qguard -l
+ new.patch: +1 +2 -3
+ b.patch: +2
+ c.patch: unguarded
+ d.patch: +2
+ $ qappunappv
+ % hg qapplied
+ % hg qapplied -v
+ % hg qunapplied
+ c.patch
+ % hg qunapplied -v
+ 0 G new.patch
+ 1 G b.patch
+ 2 U c.patch
+ 3 G d.patch
+ $ hg qselect 1
+ number of unguarded, unapplied patches has changed from 1 to 2
+ $ qappunappv
+ % hg qapplied
+ % hg qapplied -v
+ % hg qunapplied
+ new.patch
+ c.patch
+ % hg qunapplied -v
+ 0 U new.patch
+ 1 G b.patch
+ 2 U c.patch
+ 3 G d.patch
+ $ hg qpush -a
+ applying new.patch
+ skipping b.patch - guarded by '+2'
+ applying c.patch
+ skipping d.patch - guarded by '+2'
+ now at: c.patch
+ $ qappunappv
+ % hg qapplied
+ new.patch
+ c.patch
+ % hg qapplied -v
+ 0 A new.patch
+ 1 G b.patch
+ 2 A c.patch
+ % hg qunapplied
+ % hg qunapplied -v
+ 3 G d.patch
+ $ hg qselect 2
+ number of unguarded, unapplied patches has changed from 0 to 1
+ number of guarded, applied patches has changed from 1 to 0
+ $ qappunappv
+ % hg qapplied
+ new.patch
+ c.patch
+ % hg qapplied -v
+ 0 A new.patch
+ 1 U b.patch
+ 2 A c.patch
+ % hg qunapplied
+ d.patch
+ % hg qunapplied -v
+ 3 U d.patch
+
+ $ for patch in `hg qseries`; do
+ > echo % hg qapplied $patch
+ > hg qapplied $patch
+ > echo % hg qunapplied $patch
+ > hg qunapplied $patch
+ > done
+ % hg qapplied new.patch
+ new.patch
+ % hg qunapplied new.patch
+ b.patch
+ d.patch
+ % hg qapplied b.patch
+ new.patch
+ % hg qunapplied b.patch
+ d.patch
+ % hg qapplied c.patch
+ new.patch
+ c.patch
+ % hg qunapplied c.patch
+ d.patch
+ % hg qapplied d.patch
+ new.patch
+ c.patch
+ % hg qunapplied d.patch
+
+
+hg qseries -m: only b.patch should be shown
+the guards file was not ignored in the past
+
+ $ hg qdelete -k b.patch
+ $ hg qseries -m
+ b.patch
+
+hg qseries -m with color
+
+ $ hg --config extensions.color= --config color.mode=ansi qseries -m --color=always
+ \x1b[0;31;1mb.patch\x1b[0m (esc)
+
+
+excercise cornercases in "qselect --reapply"
+
+ $ hg qpop -a
+ popping c.patch
+ popping new.patch
+ patch queue now empty
+ $ hg qguard -- new.patch -not-new
+ $ hg qguard -- c.patch -not-c
+ $ hg qguard -- d.patch -not-d
+ $ hg qpush -a
+ applying new.patch
+ applying c.patch
+ applying d.patch
+ patch d.patch is empty
+ now at: d.patch
+ $ hg qguard -l
+ new.patch: -not-new
+ c.patch: -not-c
+ d.patch: -not-d
+ $ hg qselect --reapply not-d
+ popping guarded patches
+ popping d.patch
+ now at: c.patch
+ reapplying unguarded patches
+ cannot push 'd.patch' - guarded by '-not-d'
+ $ hg qser -v
+ 0 A new.patch
+ 1 A c.patch
+ 2 G d.patch
+ $ hg qselect --reapply -n
+ guards deactivated
+ $ hg qpush
+ applying d.patch
+ patch d.patch is empty
+ now at: d.patch
+ $ hg qser -v
+ 0 A new.patch
+ 1 A c.patch
+ 2 A d.patch
+ $ hg qselect --reapply not-c
+ popping guarded patches
+ popping d.patch
+ popping c.patch
+ now at: new.patch
+ reapplying unguarded patches
+ applying d.patch
+ patch d.patch is empty
+ now at: d.patch
+ $ hg qser -v
+ 0 A new.patch
+ 1 G c.patch
+ 2 A d.patch
+ $ hg qselect --reapply not-new
+ popping guarded patches
+ popping d.patch
+ popping new.patch
+ patch queue now empty
+ reapplying unguarded patches
+ applying c.patch
+ applying d.patch
+ patch d.patch is empty
+ now at: d.patch
+ $ hg qser -v
+ 0 G new.patch
+ 1 A c.patch
+ 2 A d.patch
diff --git a/tests/test-mq-header-date.t b/tests/test-mq-header-date.t
new file mode 100644
index 0000000..820d511
--- /dev/null
+++ b/tests/test-mq-header-date.t
@@ -0,0 +1,902 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=true" >> $HGRCPATH
+ $ catpatch() {
+ > cat .hg/patches/$1.patch | sed -e "s/^diff \-r [0-9a-f]* /diff -r ... /" \
+ > -e "s/^\(# Parent \).*/\1/"
+ > }
+ $ catlog() {
+ > catpatch $1
+ > hg log --template "{rev}: {desc} - {author}\n"
+ > }
+ $ catlogd() {
+ > catpatch $1
+ > hg log --template "{rev}: {desc} - {author} - {date}\n"
+ > }
+ $ drop() {
+ > hg qpop
+ > hg qdel $1.patch
+ > }
+ $ runtest() {
+ > echo ==== init
+ > hg init a
+ > cd a
+ > hg qinit
+ >
+ >
+ > echo ==== qnew -d
+ > hg qnew -d '3 0' 1.patch
+ > catlogd 1
+ >
+ > echo ==== qref
+ > echo "1" >1
+ > hg add
+ > hg qref
+ > catlogd 1
+ >
+ > echo ==== qref -d
+ > hg qref -d '4 0'
+ > catlogd 1
+ >
+ >
+ > echo ==== qnew
+ > hg qnew 2.patch
+ > echo "2" >2
+ > hg add
+ > hg qref
+ > catlog 2
+ >
+ > echo ==== qref -d
+ > hg qref -d '5 0'
+ > catlog 2
+ >
+ > drop 2
+ >
+ >
+ > echo ==== qnew -d -m
+ > hg qnew -d '6 0' -m "Three" 3.patch
+ > catlogd 3
+ >
+ > echo ==== qref
+ > echo "3" >3
+ > hg add
+ > hg qref
+ > catlogd 3
+ >
+ > echo ==== qref -m
+ > hg qref -m "Drei"
+ > catlogd 3
+ >
+ > echo ==== qref -d
+ > hg qref -d '7 0'
+ > catlogd 3
+ >
+ > echo ==== qref -d -m
+ > hg qref -d '8 0' -m "Three (again)"
+ > catlogd 3
+ >
+ >
+ > echo ==== qnew -m
+ > hg qnew -m "Four" 4.patch
+ > echo "4" >4
+ > hg add
+ > hg qref
+ > catlog 4
+ >
+ > echo ==== qref -d
+ > hg qref -d '9 0'
+ > catlog 4
+ >
+ > drop 4
+ >
+ >
+ > echo ==== qnew with HG header
+ > hg qnew --config 'mq.plain=true' 5.patch
+ > hg qpop
+ > echo "# HG changeset patch" >>.hg/patches/5.patch
+ > echo "# Date 10 0" >>.hg/patches/5.patch
+ > hg qpush 2>&1 | grep 'Now at'
+ > catlogd 5
+ >
+ > echo ==== hg qref
+ > echo "5" >5
+ > hg add
+ > hg qref
+ > catlogd 5
+ >
+ > echo ==== hg qref -d
+ > hg qref -d '11 0'
+ > catlogd 5
+ >
+ >
+ > echo ==== qnew with plain header
+ > hg qnew --config 'mq.plain=true' -d '12 0' 6.patch
+ > hg qpop
+ > hg qpush 2>&1 | grep 'now at'
+ > catlog 6
+ >
+ > echo ==== hg qref
+ > echo "6" >6
+ > hg add
+ > hg qref
+ > catlogd 6
+ >
+ > echo ==== hg qref -d
+ > hg qref -d '13 0'
+ > catlogd 6
+ >
+ > drop 6
+ >
+ >
+ > echo ==== qnew -u
+ > hg qnew -u jane 6.patch
+ > echo "6" >6
+ > hg add
+ > hg qref
+ > catlog 6
+ >
+ > echo ==== qref -d
+ > hg qref -d '12 0'
+ > catlog 6
+ >
+ > drop 6
+ >
+ >
+ > echo ==== qnew -d
+ > hg qnew -d '13 0' 7.patch
+ > echo "7" >7
+ > hg add
+ > hg qref
+ > catlog 7
+ >
+ > echo ==== qref -u
+ > hg qref -u john
+ > catlogd 7
+ >
+ >
+ > echo ==== qnew
+ > hg qnew 8.patch
+ > echo "8" >8
+ > hg add
+ > hg qref
+ > catlog 8
+ >
+ > echo ==== qref -u -d
+ > hg qref -u john -d '14 0'
+ > catlog 8
+ >
+ > drop 8
+ >
+ >
+ > echo ==== qnew -m
+ > hg qnew -m "Nine" 9.patch
+ > echo "9" >9
+ > hg add
+ > hg qref
+ > catlog 9
+ >
+ > echo ==== qref -u -d
+ > hg qref -u john -d '15 0'
+ > catlog 9
+ >
+ > drop 9
+ >
+ >
+ > echo ==== "qpop -a / qpush -a"
+ > hg qpop -a
+ > hg qpush -a
+ > hg log --template "{rev}: {desc} - {author} - {date}\n"
+ > }
+
+======= plain headers
+
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "plain=true" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ ==== init
+ ==== qnew -d
+ Date: 3 0
+
+ 0: [mq]: 1.patch - test - 3.00
+ ==== qref
+ adding 1
+ Date: 3 0
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test - 3.00
+ ==== qref -d
+ Date: 4 0
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew
+ adding 2
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ Date: 5 0
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - test
+ popping 2.patch
+ now at: 1.patch
+ ==== qnew -d -m
+ Date: 6 0
+
+ Three
+
+ 1: Three - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref
+ adding 3
+ Date: 6 0
+
+ Three
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Three - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -m
+ Date: 6 0
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Drei - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -d
+ Date: 7 0
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Drei - test - 7.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -d -m
+ Date: 8 0
+
+ Three (again)
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew -m
+ adding 4
+ Four
+
+ diff -r ... 4
+ --- /dev/null
+ +++ b/4
+ @@ -0,0 +1,1 @@
+ +4
+ 2: Four - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ Date: 9 0
+ Four
+
+ diff -r ... 4
+ --- /dev/null
+ +++ b/4
+ @@ -0,0 +1,1 @@
+ +4
+ 2: Four - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 4.patch
+ now at: 3.patch
+ ==== qnew with HG header
+ popping 5.patch
+ now at: 3.patch
+ # HG changeset patch
+ # Date 10 0
+ 2: imported patch 5.patch - test - 10.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref
+ adding 5
+ # HG changeset patch
+ # Parent
+ # Date 10 0
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 2: [mq]: 5.patch - test - 10.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref -d
+ # HG changeset patch
+ # Parent
+ # Date 11 0
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew with plain header
+ popping 6.patch
+ now at: 5.patch
+ now at: 6.patch
+ Date: 12 0
+
+ 3: imported patch 6.patch - test
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== hg qref
+ adding 6
+ Date: 12 0
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - test - 12.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref -d
+ Date: 13 0
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - test - 13.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ popping 6.patch
+ now at: 5.patch
+ ==== qnew -u
+ adding 6
+ From: jane
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - jane
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ Date: 12 0
+ From: jane
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - jane
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 6.patch
+ now at: 5.patch
+ ==== qnew -d
+ adding 7
+ Date: 13 0
+
+ diff -r ... 7
+ --- /dev/null
+ +++ b/7
+ @@ -0,0 +1,1 @@
+ +7
+ 3: [mq]: 7.patch - test
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u
+ From: john
+ Date: 13 0
+
+ diff -r ... 7
+ --- /dev/null
+ +++ b/7
+ @@ -0,0 +1,1 @@
+ +7
+ 3: [mq]: 7.patch - john - 13.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew
+ adding 8
+ diff -r ... 8
+ --- /dev/null
+ +++ b/8
+ @@ -0,0 +1,1 @@
+ +8
+ 4: [mq]: 8.patch - test
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u -d
+ Date: 14 0
+ From: john
+
+ diff -r ... 8
+ --- /dev/null
+ +++ b/8
+ @@ -0,0 +1,1 @@
+ +8
+ 4: [mq]: 8.patch - john
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 8.patch
+ now at: 7.patch
+ ==== qnew -m
+ adding 9
+ Nine
+
+ diff -r ... 9
+ --- /dev/null
+ +++ b/9
+ @@ -0,0 +1,1 @@
+ +9
+ 4: Nine - test
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u -d
+ Date: 15 0
+ From: john
+ Nine
+
+ diff -r ... 9
+ --- /dev/null
+ +++ b/9
+ @@ -0,0 +1,1 @@
+ +9
+ 4: Nine - john
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 9.patch
+ now at: 7.patch
+ ==== qpop -a / qpush -a
+ popping 7.patch
+ popping 5.patch
+ popping 3.patch
+ popping 1.patch
+ patch queue now empty
+ applying 1.patch
+ applying 3.patch
+ applying 5.patch
+ applying 7.patch
+ now at: 7.patch
+ 3: imported patch 7.patch - john - 13.00
+ 2: imported patch 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: imported patch 1.patch - test - 4.00
+ $ rm -r sandbox
+
+======= hg headers
+
+ $ echo "plain=false" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ ==== init
+ ==== qnew -d
+ # HG changeset patch
+ # Parent
+ # Date 3 0
+
+ 0: [mq]: 1.patch - test - 3.00
+ ==== qref
+ adding 1
+ # HG changeset patch
+ # Parent
+ # Date 3 0
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test - 3.00
+ ==== qref -d
+ # HG changeset patch
+ # Parent
+ # Date 4 0
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew
+ adding 2
+ # HG changeset patch
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ # HG changeset patch
+ # Date 5 0
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - test
+ popping 2.patch
+ now at: 1.patch
+ ==== qnew -d -m
+ # HG changeset patch
+ # Parent
+ # Date 6 0
+
+ Three
+
+ 1: Three - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref
+ adding 3
+ # HG changeset patch
+ # Parent
+ # Date 6 0
+
+ Three
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Three - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -m
+ # HG changeset patch
+ # Parent
+ # Date 6 0
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Drei - test - 6.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -d
+ # HG changeset patch
+ # Parent
+ # Date 7 0
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Drei - test - 7.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qref -d -m
+ # HG changeset patch
+ # Parent
+ # Date 8 0
+
+ Three (again)
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew -m
+ adding 4
+ # HG changeset patch
+ # Parent
+ Four
+
+ diff -r ... 4
+ --- /dev/null
+ +++ b/4
+ @@ -0,0 +1,1 @@
+ +4
+ 2: Four - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ # HG changeset patch
+ # Date 9 0
+ # Parent
+ Four
+
+ diff -r ... 4
+ --- /dev/null
+ +++ b/4
+ @@ -0,0 +1,1 @@
+ +4
+ 2: Four - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 4.patch
+ now at: 3.patch
+ ==== qnew with HG header
+ popping 5.patch
+ now at: 3.patch
+ # HG changeset patch
+ # Date 10 0
+ 2: imported patch 5.patch - test - 10.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref
+ adding 5
+ # HG changeset patch
+ # Parent
+ # Date 10 0
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 2: [mq]: 5.patch - test - 10.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref -d
+ # HG changeset patch
+ # Parent
+ # Date 11 0
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew with plain header
+ popping 6.patch
+ now at: 5.patch
+ now at: 6.patch
+ Date: 12 0
+
+ 3: imported patch 6.patch - test
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== hg qref
+ adding 6
+ Date: 12 0
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - test - 12.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== hg qref -d
+ Date: 13 0
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - test - 13.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ popping 6.patch
+ now at: 5.patch
+ ==== qnew -u
+ adding 6
+ # HG changeset patch
+ # Parent
+ # User jane
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - jane
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -d
+ # HG changeset patch
+ # Date 12 0
+ # Parent
+ # User jane
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 3: [mq]: 6.patch - jane
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 6.patch
+ now at: 5.patch
+ ==== qnew -d
+ adding 7
+ # HG changeset patch
+ # Parent
+ # Date 13 0
+
+ diff -r ... 7
+ --- /dev/null
+ +++ b/7
+ @@ -0,0 +1,1 @@
+ +7
+ 3: [mq]: 7.patch - test
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u
+ # HG changeset patch
+ # User john
+ # Parent
+ # Date 13 0
+
+ diff -r ... 7
+ --- /dev/null
+ +++ b/7
+ @@ -0,0 +1,1 @@
+ +7
+ 3: [mq]: 7.patch - john - 13.00
+ 2: [mq]: 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: [mq]: 1.patch - test - 4.00
+ ==== qnew
+ adding 8
+ # HG changeset patch
+ # Parent
+
+ diff -r ... 8
+ --- /dev/null
+ +++ b/8
+ @@ -0,0 +1,1 @@
+ +8
+ 4: [mq]: 8.patch - test
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u -d
+ # HG changeset patch
+ # Date 14 0
+ # User john
+ # Parent
+
+ diff -r ... 8
+ --- /dev/null
+ +++ b/8
+ @@ -0,0 +1,1 @@
+ +8
+ 4: [mq]: 8.patch - john
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 8.patch
+ now at: 7.patch
+ ==== qnew -m
+ adding 9
+ # HG changeset patch
+ # Parent
+ Nine
+
+ diff -r ... 9
+ --- /dev/null
+ +++ b/9
+ @@ -0,0 +1,1 @@
+ +9
+ 4: Nine - test
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ ==== qref -u -d
+ # HG changeset patch
+ # Date 15 0
+ # User john
+ # Parent
+ Nine
+
+ diff -r ... 9
+ --- /dev/null
+ +++ b/9
+ @@ -0,0 +1,1 @@
+ +9
+ 4: Nine - john
+ 3: [mq]: 7.patch - john
+ 2: [mq]: 5.patch - test
+ 1: Three (again) - test
+ 0: [mq]: 1.patch - test
+ popping 9.patch
+ now at: 7.patch
+ ==== qpop -a / qpush -a
+ popping 7.patch
+ popping 5.patch
+ popping 3.patch
+ popping 1.patch
+ patch queue now empty
+ applying 1.patch
+ applying 3.patch
+ applying 5.patch
+ applying 7.patch
+ now at: 7.patch
+ 3: imported patch 7.patch - john - 13.00
+ 2: imported patch 5.patch - test - 11.00
+ 1: Three (again) - test - 8.00
+ 0: imported patch 1.patch - test - 4.00
+ $ rm -r sandbox
diff --git a/tests/test-mq-header-from.t b/tests/test-mq-header-from.t
new file mode 100644
index 0000000..64668ec
--- /dev/null
+++ b/tests/test-mq-header-from.t
@@ -0,0 +1,971 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=true" >> $HGRCPATH
+ $ catlog() {
+ > cat .hg/patches/$1.patch | sed -e "s/^diff \-r [0-9a-f]* /diff -r ... /" \
+ > -e "s/^\(# Parent \).*/\1/"
+ > hg log --template "{rev}: {desc} - {author}\n"
+ > }
+ $ runtest() {
+ > echo ==== init
+ > hg init a
+ > cd a
+ > hg qinit
+ >
+ >
+ > echo ==== qnew -U
+ > hg qnew -U 1.patch
+ > catlog 1
+ >
+ > echo ==== qref
+ > echo "1" >1
+ > hg add
+ > hg qref
+ > catlog 1
+ >
+ > echo ==== qref -u
+ > hg qref -u mary
+ > catlog 1
+ >
+ > echo ==== qnew
+ > hg qnew 2.patch
+ > echo "2" >2
+ > hg add
+ > hg qref
+ > catlog 2
+ >
+ > echo ==== qref -u
+ > hg qref -u jane
+ > catlog 2
+ >
+ >
+ > echo ==== qnew -U -m
+ > hg qnew -U -m "Three" 3.patch
+ > catlog 3
+ >
+ > echo ==== qref
+ > echo "3" >3
+ > hg add
+ > hg qref
+ > catlog 3
+ >
+ > echo ==== qref -m
+ > hg qref -m "Drei"
+ > catlog 3
+ >
+ > echo ==== qref -u
+ > hg qref -u mary
+ > catlog 3
+ >
+ > echo ==== qref -u -m
+ > hg qref -u maria -m "Three (again)"
+ > catlog 3
+ >
+ > echo ==== qnew -m
+ > hg qnew -m "Four" 4.patch
+ > echo "4" >4of t
+ > hg add
+ > hg qref
+ > catlog 4
+ >
+ > echo ==== qref -u
+ > hg qref -u jane
+ > catlog 4
+ >
+ >
+ > echo ==== qnew with HG header
+ > hg qnew --config 'mq.plain=true' 5.patch
+ > hg qpop
+ > echo "# HG changeset patch" >>.hg/patches/5.patch
+ > echo "# User johndoe" >>.hg/patches/5.patch
+ > hg qpush 2>&1 | grep 'now at'
+ > catlog 5
+ >
+ > echo ==== hg qref
+ > echo "5" >5
+ > hg add
+ > hg qref
+ > catlog 5
+ >
+ > echo ==== hg qref -U
+ > hg qref -U
+ > catlog 5
+ >
+ > echo ==== hg qref -u
+ > hg qref -u johndeere
+ > catlog 5
+ >
+ >
+ > echo ==== qnew with plain header
+ > hg qnew --config 'mq.plain=true' -U 6.patch
+ > hg qpop
+ > hg qpush 2>&1 | grep 'now at'
+ > catlog 6
+ >
+ > echo ==== hg qref
+ > echo "6" >6
+ > hg add
+ > hg qref
+ > catlog 6
+ >
+ > echo ==== hg qref -U
+ > hg qref -U
+ > catlog 6
+ >
+ > echo ==== hg qref -u
+ > hg qref -u johndeere
+ > catlog 6
+ >
+ >
+ > echo ==== "qpop -a / qpush -a"
+ > hg qpop -a
+ > hg qpush -a
+ > hg log --template "{rev}: {desc} - {author}\n"
+ > }
+
+======= plain headers
+
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "plain=true" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ ==== init
+ ==== qnew -U
+ From: test
+
+ 0: [mq]: 1.patch - test
+ ==== qref
+ adding 1
+ From: test
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test
+ ==== qref -u
+ From: mary
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - mary
+ ==== qnew
+ adding 2
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ From: jane
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -U -m
+ From: test
+
+ Three
+
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref
+ adding 3
+ From: test
+
+ Three
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -m
+ From: test
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ From: mary
+
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - mary
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u -m
+ From: maria
+
+ Three (again)
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -m
+ adding 4of
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - test
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ From: jane
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with HG header
+ popping 5.patch
+ now at: 4.patch
+ now at: 5.patch
+ # HG changeset patch
+ # User johndoe
+ 4: imported patch 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 5
+ # HG changeset patch
+ # Parent
+ # User johndoe
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ # HG changeset patch
+ # Parent
+ # User test
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - test
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ # HG changeset patch
+ # Parent
+ # User johndeere
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with plain header
+ popping 6.patch
+ now at: 5.patch
+ now at: 6.patch
+ From: test
+
+ 5: imported patch 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 6
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ From: johndeere
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - johndeere
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qpop -a / qpush -a
+ popping 6.patch
+ popping 5.patch
+ popping 4.patch
+ popping 3.patch
+ popping 2.patch
+ popping 1.patch
+ patch queue now empty
+ applying 1.patch
+ applying 2.patch
+ applying 3.patch
+ applying 4.patch
+ applying 5.patch
+ applying 6.patch
+ now at: 6.patch
+ 5: imported patch 6.patch - johndeere
+ 4: imported patch 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: imported patch 2.patch - jane
+ 0: imported patch 1.patch - mary
+ $ rm -r sandbox
+
+======= hg headers
+
+ $ echo "plain=false" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ ==== init
+ ==== qnew -U
+ # HG changeset patch
+ # Parent
+ # User test
+ 0: [mq]: 1.patch - test
+ ==== qref
+ adding 1
+ # HG changeset patch
+ # Parent
+ # User test
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test
+ ==== qref -u
+ # HG changeset patch
+ # Parent
+ # User mary
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - mary
+ ==== qnew
+ adding 2
+ # HG changeset patch
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # User jane
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -U -m
+ # HG changeset patch
+ # Parent
+ # User test
+ Three
+
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref
+ adding 3
+ # HG changeset patch
+ # Parent
+ # User test
+ Three
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -m
+ # HG changeset patch
+ # Parent
+ # User test
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # Parent
+ # User mary
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - mary
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u -m
+ # HG changeset patch
+ # Parent
+ # User maria
+ Three (again)
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -m
+ adding 4of
+ # HG changeset patch
+ # Parent
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - test
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # User jane
+ # Parent
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with HG header
+ popping 5.patch
+ now at: 4.patch
+ now at: 5.patch
+ # HG changeset patch
+ # User johndoe
+ 4: imported patch 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 5
+ # HG changeset patch
+ # Parent
+ # User johndoe
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ # HG changeset patch
+ # Parent
+ # User test
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - test
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ # HG changeset patch
+ # Parent
+ # User johndeere
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with plain header
+ popping 6.patch
+ now at: 5.patch
+ now at: 6.patch
+ From: test
+
+ 5: imported patch 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 6
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ From: johndeere
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - johndeere
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qpop -a / qpush -a
+ popping 6.patch
+ popping 5.patch
+ popping 4.patch
+ popping 3.patch
+ popping 2.patch
+ popping 1.patch
+ patch queue now empty
+ applying 1.patch
+ applying 2.patch
+ applying 3.patch
+ applying 4.patch
+ applying 5.patch
+ applying 6.patch
+ now at: 6.patch
+ 5: imported patch 6.patch - johndeere
+ 4: imported patch 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: imported patch 2.patch - jane
+ 0: imported patch 1.patch - mary
+ $ rm -r sandbox
+ $ runtest
+ ==== init
+ ==== qnew -U
+ # HG changeset patch
+ # Parent
+ # User test
+ 0: [mq]: 1.patch - test
+ ==== qref
+ adding 1
+ # HG changeset patch
+ # Parent
+ # User test
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - test
+ ==== qref -u
+ # HG changeset patch
+ # Parent
+ # User mary
+
+ diff -r ... 1
+ --- /dev/null
+ +++ b/1
+ @@ -0,0 +1,1 @@
+ +1
+ 0: [mq]: 1.patch - mary
+ ==== qnew
+ adding 2
+ # HG changeset patch
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - test
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # User jane
+ # Parent
+
+ diff -r ... 2
+ --- /dev/null
+ +++ b/2
+ @@ -0,0 +1,1 @@
+ +2
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -U -m
+ # HG changeset patch
+ # Parent
+ # User test
+ Three
+
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref
+ adding 3
+ # HG changeset patch
+ # Parent
+ # User test
+ Three
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -m
+ # HG changeset patch
+ # Parent
+ # User test
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - test
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # Parent
+ # User mary
+ Drei
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Drei - mary
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u -m
+ # HG changeset patch
+ # Parent
+ # User maria
+ Three (again)
+
+ diff -r ... 3
+ --- /dev/null
+ +++ b/3
+ @@ -0,0 +1,1 @@
+ +3
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew -m
+ adding 4of
+ # HG changeset patch
+ # Parent
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - test
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qref -u
+ # HG changeset patch
+ # User jane
+ # Parent
+ Four
+
+ diff -r ... 4of
+ --- /dev/null
+ +++ b/4of
+ @@ -0,0 +1,1 @@
+ +4 t
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with HG header
+ popping 5.patch
+ now at: 4.patch
+ now at: 5.patch
+ # HG changeset patch
+ # User johndoe
+ 4: imported patch 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 5
+ # HG changeset patch
+ # Parent
+ # User johndoe
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndoe
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ # HG changeset patch
+ # Parent
+ # User test
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - test
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ # HG changeset patch
+ # Parent
+ # User johndeere
+
+ diff -r ... 5
+ --- /dev/null
+ +++ b/5
+ @@ -0,0 +1,1 @@
+ +5
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qnew with plain header
+ popping 6.patch
+ now at: 5.patch
+ now at: 6.patch
+ From: test
+
+ 5: imported patch 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref
+ adding 6
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -U
+ From: test
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - test
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== hg qref -u
+ From: johndeere
+
+ diff -r ... 6
+ --- /dev/null
+ +++ b/6
+ @@ -0,0 +1,1 @@
+ +6
+ 5: [mq]: 6.patch - johndeere
+ 4: [mq]: 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: [mq]: 2.patch - jane
+ 0: [mq]: 1.patch - mary
+ ==== qpop -a / qpush -a
+ popping 6.patch
+ popping 5.patch
+ popping 4.patch
+ popping 3.patch
+ popping 2.patch
+ popping 1.patch
+ patch queue now empty
+ applying 1.patch
+ applying 2.patch
+ applying 3.patch
+ applying 4.patch
+ applying 5.patch
+ applying 6.patch
+ now at: 6.patch
+ 5: imported patch 6.patch - johndeere
+ 4: imported patch 5.patch - johndeere
+ 3: Four - jane
+ 2: Three (again) - maria
+ 1: imported patch 2.patch - jane
+ 0: imported patch 1.patch - mary
+
+ $ cd ..
diff --git a/tests/test-mq-merge.t b/tests/test-mq-merge.t
new file mode 100644
index 0000000..955134a
--- /dev/null
+++ b/tests/test-mq-merge.t
@@ -0,0 +1,173 @@
+Setup extension:
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq =" >> $HGRCPATH
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "git = keep" >> $HGRCPATH
+
+Test merge with mq changeset as the second parent:
+
+ $ hg init m
+ $ cd m
+ $ touch a b c
+ $ hg add a
+ $ hg commit -m a
+ $ hg add b
+ $ hg qnew -d "0 0" b
+ $ hg update 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg add c
+ $ hg commit -m c
+ created new head
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg commit -m merge
+ abort: cannot commit over an applied mq patch
+ [255]
+ $ cd ..
+
+Issue529: mq aborts when merging patch deleting files
+
+ $ checkundo()
+ > {
+ > if [ -f .hg/store/undo ]; then
+ > echo ".hg/store/undo still exists"
+ > fi
+ > }
+
+Commit two dummy files in "init" changeset:
+
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Am init
+ adding a
+ adding b
+ $ hg tag -l init
+
+Create a patch removing a:
+
+ $ hg qnew rm_a
+ $ hg rm a
+ $ hg qrefresh -m "rm a"
+
+Save the patch queue so we can merge it later:
+
+ $ hg qsave -c -e
+ copy $TESTTMP/t/.hg/patches to $TESTTMP/t/.hg/patches.1 (glob)
+ $ checkundo
+
+Update b and commit in an "update" changeset:
+
+ $ hg up -C init
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b >> b
+ $ hg st
+ M b
+ $ hg ci -m update
+ created new head
+
+# Here, qpush used to abort with :
+# The system cannot find the file specified => a
+ $ hg manifest
+ a
+ b
+
+ $ hg qpush -a -m
+ merging with queue at: $TESTTMP/t/.hg/patches.1 (glob)
+ applying rm_a
+ now at: rm_a
+
+ $ checkundo
+ $ hg manifest
+ b
+
+Ensure status is correct after merge:
+
+ $ hg qpop -a
+ popping rm_a
+ popping .hg.patches.merge.marker
+ patch queue now empty
+
+ $ cd ..
+
+Classic MQ merge sequence *with an explicit named queue*:
+
+ $ hg init t2
+ $ cd t2
+ $ echo '[diff]' > .hg/hgrc
+ $ echo 'nodates = 1' >> .hg/hgrc
+ $ echo a > a
+ $ hg ci -Am init
+ adding a
+ $ echo b > a
+ $ hg ci -m changea
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg cp a aa
+ $ echo c >> a
+ $ hg qnew --git -f -e patcha
+ $ echo d >> a
+ $ hg qnew -d '0 0' -f -e patcha2
+
+Create the reference queue:
+
+ $ hg qsave -c -e -n refqueue
+ copy $TESTTMP/t2/.hg/patches to $TESTTMP/t2/.hg/refqueue (glob)
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Merge:
+
+ $ HGMERGE=internal:other hg qpush -a -m -n refqueue
+ merging with queue at: $TESTTMP/t2/.hg/refqueue (glob)
+ applying patcha
+ patching file a
+ Hunk #1 succeeded at 2 with fuzz 1 (offset 0 lines).
+ fuzz found when applying patch, stopping
+ patch didn't work out, merging patcha
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ applying patcha2
+ now at: patcha2
+
+Check patcha is still a git patch:
+
+ $ cat .hg/patches/patcha
+ # HG changeset patch
+ # Parent d3873e73d99ef67873dac33fbcc66268d5d2b6f4
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ -b
+ +a
+ +c
+ diff --git a/aa b/aa
+ new file mode 100644
+ --- /dev/null
+ +++ b/aa
+ @@ -0,0 +1,1 @@
+ +a
+
+Check patcha2 is still a regular patch:
+
+ $ cat .hg/patches/patcha2
+ # HG changeset patch
+ # Parent ???????????????????????????????????????? (glob)
+ # Date 0 0
+
+ diff -r ???????????? -r ???????????? a (glob)
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ c
+ +d
+
+ $ cd ..
+
diff --git a/tests/test-mq-missingfiles.t b/tests/test-mq-missingfiles.t
new file mode 100644
index 0000000..6897ff0
--- /dev/null
+++ b/tests/test-mq-missingfiles.t
@@ -0,0 +1,195 @@
+
+Issue835: qpush fails immediately when patching a missing file, but
+remaining added files are still created empty which will trick a
+future qrefresh.
+
+ $ cat > writelines.py <<EOF
+ > import sys
+ > path = sys.argv[1]
+ > args = sys.argv[2:]
+ > assert (len(args) % 2) == 0
+ >
+ > f = file(path, 'wb')
+ > for i in xrange(len(args)/2):
+ > count, s = args[2*i:2*i+2]
+ > count = int(count)
+ > s = s.decode('string_escape')
+ > f.write(s*count)
+ > f.close()
+ > EOF
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init normal
+ $ cd normal
+ $ python ../writelines.py b 10 'a\n'
+ $ hg ci -Am addb
+ adding b
+ $ echo a > a
+ $ python ../writelines.py b 2 'b\n' 10 'a\n' 2 'c\n'
+ $ echo c > c
+ $ hg add a c
+ $ hg qnew -f changeb
+ $ hg qpop
+ popping changeb
+ patch queue now empty
+ $ hg rm b
+ $ hg ci -Am rmb
+
+Push patch with missing target:
+
+ $ hg qpush
+ applying changeb
+ unable to find 'b' for patching
+ 2 out of 2 hunks FAILED -- saving rejects to file b.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh changeb
+ [2]
+
+Display added files:
+
+ $ cat a
+ a
+ $ cat c
+ c
+
+Display rejections:
+
+ $ cat b.rej
+ --- b
+ +++ b
+ @@ -1,3 +1,5 @@
+ +b
+ +b
+ a
+ a
+ a
+ @@ -8,3 +10,5 @@
+ a
+ a
+ a
+ +c
+ +c
+
+Test missing renamed file
+
+ $ hg qpop
+ popping changeb
+ patch queue now empty
+ $ hg up -qC 0
+ $ echo a > a
+ $ hg mv b bb
+ $ python ../writelines.py bb 2 'b\n' 10 'a\n' 2 'c\n'
+ $ echo c > c
+ $ hg add a c
+ $ hg qnew changebb
+ $ hg qpop
+ popping changebb
+ patch queue now empty
+ $ hg up -qC 1
+ $ hg qpush
+ applying changebb
+ patching file bb
+ Hunk #1 FAILED at 0
+ Hunk #2 FAILED at 7
+ 2 out of 2 hunks FAILED -- saving rejects to file bb.rej
+ b not tracked!
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh changebb
+ [2]
+ $ cat a
+ a
+ $ cat c
+ c
+ $ cat bb.rej
+ --- bb
+ +++ bb
+ @@ -1,3 +1,5 @@
+ +b
+ +b
+ a
+ a
+ a
+ @@ -8,3 +10,5 @@
+ a
+ a
+ a
+ +c
+ +c
+
+ $ cd ..
+
+
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "git=1" >> $HGRCPATH
+
+ $ hg init git
+ $ cd git
+ $ python ../writelines.py b 1 '\x00'
+ $ hg ci -Am addb
+ adding b
+ $ echo a > a
+ $ python ../writelines.py b 1 '\x01' 1 '\x00'
+ $ echo c > c
+ $ hg add a c
+ $ hg qnew -f changeb
+ $ hg qpop
+ popping changeb
+ patch queue now empty
+ $ hg rm b
+ $ hg ci -Am rmb
+
+Push git patch with missing target:
+
+ $ hg qpush
+ applying changeb
+ unable to find 'b' for patching
+ 1 out of 1 hunks FAILED -- saving rejects to file b.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh changeb
+ [2]
+ $ hg st
+ ? b.rej
+
+Display added files:
+
+ $ cat a
+ a
+ $ cat c
+ c
+
+Display rejections:
+
+ $ cat b.rej
+ --- b
+ +++ b
+ GIT binary patch
+ literal 2
+ Jc${No0000400IC2
+
+ $ cd ..
+
+Test push creating directory during git copy or rename:
+
+ $ hg init missingdir
+ $ cd missingdir
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ mkdir d
+ $ hg copy a d/a2
+ $ hg mv a d/a
+ $ hg qnew -g -f patch
+ $ hg qpop
+ popping patch
+ patch queue now empty
+ $ hg qpush
+ applying patch
+ now at: patch
+
+ $ cd ..
+
diff --git a/tests/test-mq-pull-from-bundle.t b/tests/test-mq-pull-from-bundle.t
new file mode 100644
index 0000000..45fb076
--- /dev/null
+++ b/tests/test-mq-pull-from-bundle.t
@@ -0,0 +1,135 @@
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > mq=
+ > [alias]
+ > tlog = log --template "{rev}: {desc}\\n"
+ > theads = heads --template "{rev}: {desc}\\n"
+ > tincoming = incoming --template "{rev}: {desc}\\n"
+ > EOF
+
+Setup main:
+
+ $ hg init base
+ $ cd base
+ $ echo "One" > one
+ $ hg add
+ adding one
+ $ hg ci -m "main: one added"
+ $ echo "++" >> one
+ $ hg ci -m "main: one updated"
+
+Bundle main:
+
+ $ hg bundle --base=null ../main.hg
+ 2 changesets found
+
+ $ cd ..
+
+Incoming to fresh repo:
+
+ $ hg init fresh
+
+ $ hg -R fresh tincoming main.hg
+ comparing with main.hg
+ 0: main: one added
+ 1: main: one updated
+ $ test -f ./fresh/.hg/hg-bundle* && echo 'temp. bundle file remained' || true
+
+ $ hg -R fresh tincoming bundle:fresh+main.hg
+ comparing with bundle:fresh+main.hg
+ 0: main: one added
+ 1: main: one updated
+
+
+Setup queue:
+
+ $ cd base
+ $ hg qinit -c
+ $ hg qnew -m "patch: two added" two.patch
+ $ echo two > two
+ $ hg add
+ adding two
+ $ hg qrefresh
+ $ hg qcommit -m "queue: two.patch added"
+ $ hg qpop -a
+ popping two.patch
+ patch queue now empty
+
+Bundle queue:
+
+ $ hg -R .hg/patches bundle --base=null ../queue.hgq
+ 1 changesets found
+ $ test -f ./fresh/.hg/hg-bundle* && echo 'temp. bundle file remained' || true
+
+ $ cd ..
+
+
+Clone base:
+
+ $ hg clone base copy
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd copy
+ $ hg qinit -c
+
+Incoming queue bundle:
+
+ $ hg -R .hg/patches tincoming ../queue.hgq
+ comparing with ../queue.hgq
+ 0: queue: two.patch added
+ $ test -f .hg/hg-bundle* && echo 'temp. bundle file remained' || true
+
+Pull queue bundle:
+
+ $ hg -R .hg/patches pull --update ../queue.hgq
+ pulling from ../queue.hgq
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ merging series
+ 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ test -f .hg/patches/hg-bundle* && echo 'temp. bundle file remained' || true
+
+ $ hg -R .hg/patches theads
+ 0: queue: two.patch added
+
+ $ hg -R .hg/patches tlog
+ 0: queue: two.patch added
+
+ $ hg qseries
+ two.patch
+
+ $ cd ..
+
+
+Clone base again:
+
+ $ hg clone base copy2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd copy2
+ $ hg qinit -c
+
+Unbundle queue bundle:
+
+ $ hg -R .hg/patches unbundle --update ../queue.hgq
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ merging series
+ 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R .hg/patches theads
+ 0: queue: two.patch added
+
+ $ hg -R .hg/patches tlog
+ 0: queue: two.patch added
+
+ $ hg qseries
+ two.patch
+
+ $ cd ..
+
diff --git a/tests/test-mq-qclone-http.t b/tests/test-mq-qclone-http.t
new file mode 100644
index 0000000..4c92f4a
--- /dev/null
+++ b/tests/test-mq-qclone-http.t
@@ -0,0 +1,153 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+hide outer repo
+ $ hg init
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ mkdir webdir
+ $ cd webdir
+ $ hg init a
+ $ hg --cwd a qinit -c
+ $ echo a > a/a
+ $ hg --cwd a ci -A -m a
+ adding a
+ $ echo b > a/b
+ $ hg --cwd a addremove
+ adding b
+ $ hg --cwd a qnew -f b.patch
+ $ hg --cwd a qcommit -m b.patch
+ $ hg --cwd a log --template "{desc}\n"
+ [mq]: b.patch
+ a
+ $ hg --cwd a/.hg/patches log --template "{desc}\n"
+ b.patch
+ $ root=`pwd`
+ $ cd ..
+
+test with recursive collection
+
+ $ cat > collections.conf <<EOF
+ > [paths]
+ > /=$root/**
+ > EOF
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf collections.conf \
+ > -A access-paths.log -E error-paths-1.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /a/.hg/patches/
+
+ $ hg qclone http://localhost:$HGPORT/a b
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd b log --template "{desc}\n"
+ a
+ $ hg --cwd b qpush -a
+ applying b.patch
+ now at: b.patch
+ $ hg --cwd b log --template "{desc}\n"
+ imported patch b.patch
+ a
+
+test with normal collection
+
+ $ cat > collections1.conf <<EOF
+ > [paths]
+ > /=$root/*
+ > EOF
+ $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf collections1.conf \
+ > -A access-paths.log -E error-paths-1.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /a/.hg/patches/
+
+ $ hg qclone http://localhost:$HGPORT1/a c
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd c log --template "{desc}\n"
+ a
+ $ hg --cwd c qpush -a
+ applying b.patch
+ now at: b.patch
+ $ hg --cwd c log --template "{desc}\n"
+ imported patch b.patch
+ a
+
+test with old-style collection
+
+ $ cat > collections2.conf <<EOF
+ > [collections]
+ > $root=$root
+ > EOF
+ $ hg serve -p $HGPORT2 -d --pid-file=hg.pid --webdir-conf collections2.conf \
+ > -A access-paths.log -E error-paths-1.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '?style=raw'
+ 200 Script output follows
+
+
+ /a/
+ /a/.hg/patches/
+
+ $ hg qclone http://localhost:$HGPORT2/a d
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg --cwd d log --template "{desc}\n"
+ a
+ $ hg --cwd d qpush -a
+ applying b.patch
+ now at: b.patch
+ $ hg --cwd d log --template "{desc}\n"
+ imported patch b.patch
+ a
+
+test --mq works and uses correct repository config
+
+ $ hg --cwd d outgoing --mq
+ comparing with http://localhost:$HGPORT2/a/.hg/patches
+ searching for changes
+ no changes found
+ [1]
+ $ hg --cwd d log --mq --template '{rev} {desc|firstline}\n'
+ 0 b.patch
diff --git a/tests/test-mq-qdelete.t b/tests/test-mq-qdelete.t
new file mode 100644
index 0000000..2729a4d
--- /dev/null
+++ b/tests/test-mq-qdelete.t
@@ -0,0 +1,197 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+ $ echo 'base' > base
+ $ hg ci -Ambase -d '1 0'
+ adding base
+
+ $ hg qnew -d '1 0' pa
+ $ hg qnew -d '1 0' pb
+ $ hg qnew -d '1 0' pc
+
+ $ hg qdel
+ abort: qdelete requires at least one revision or patch name
+ [255]
+
+ $ hg qdel pc
+ abort: cannot delete applied patch pc
+ [255]
+
+ $ hg qpop
+ popping pc
+ now at: pb
+
+Delete the same patch twice in one command (issue2427)
+
+ $ hg qdel pc pc
+
+ $ hg qseries
+ pa
+ pb
+
+ $ ls .hg/patches
+ pa
+ pb
+ series
+ status
+
+ $ hg qpop
+ popping pb
+ now at: pa
+
+ $ hg qdel -k 1
+
+ $ ls .hg/patches
+ pa
+ pb
+ series
+ status
+
+ $ hg qdel -r pa
+ patch pa finalized without changeset message
+
+ $ hg qapplied
+
+ $ hg log --template '{rev} {desc}\n'
+ 1 [mq]: pa
+ 0 base
+
+ $ hg qnew pd
+ $ hg qnew pe
+ $ hg qnew pf
+
+ $ hg qdel -r pe
+ abort: cannot delete revision 3 above applied patches
+ [255]
+
+ $ hg qdel -r qbase:pe
+ patch pd finalized without changeset message
+ patch pe finalized without changeset message
+
+ $ hg qapplied
+ pf
+
+ $ hg log --template '{rev} {desc}\n'
+ 4 [mq]: pf
+ 3 [mq]: pe
+ 2 [mq]: pd
+ 1 [mq]: pa
+ 0 base
+
+ $ cd ..
+
+ $ hg init b
+ $ cd b
+
+ $ echo 'base' > base
+ $ hg ci -Ambase -d '1 0'
+ adding base
+
+ $ hg qfinish
+ abort: no revisions specified
+ [255]
+
+ $ hg qfinish -a
+ no patches applied
+
+ $ hg qnew -d '1 0' pa
+ $ hg qnew -d '1 0' pb
+ $ hg qnew pc # XXX fails to apply by /usr/bin/patch if we put a date
+
+ $ hg qfinish 0
+ abort: revision 0 is not managed
+ [255]
+
+ $ hg qfinish pb
+ abort: cannot delete revision 2 above applied patches
+ [255]
+
+ $ hg qpop
+ popping pc
+ now at: pb
+
+ $ hg qfinish -a pc
+ abort: unknown revision 'pc'!
+ [255]
+
+ $ hg qpush
+ applying pc
+ patch pc is empty
+ now at: pc
+
+ $ hg qfinish qbase:pb
+ patch pa finalized without changeset message
+ patch pb finalized without changeset message
+
+ $ hg qapplied
+ pc
+
+ $ hg log --template '{rev} {desc}\n'
+ 3 imported patch pc
+ 2 [mq]: pb
+ 1 [mq]: pa
+ 0 base
+
+ $ hg qfinish -a pc
+ patch pc finalized without changeset message
+
+ $ hg qapplied
+
+ $ hg log --template '{rev} {desc}\n'
+ 3 imported patch pc
+ 2 [mq]: pb
+ 1 [mq]: pa
+ 0 base
+
+ $ ls .hg/patches
+ series
+ status
+
+qdel -k X && hg qimp -e X used to trigger spurious output with versioned queues
+
+ $ hg init --mq
+ $ hg qimport -r 3
+ $ hg qpop
+ popping 3.diff
+ patch queue now empty
+ $ hg qdel -k 3.diff
+ $ hg qimp -e 3.diff
+ adding 3.diff to series file
+ $ hg qfinish -a
+ no patches applied
+
+
+resilience to inconsistency: qfinish -a with applied patches not in series
+
+ $ hg qser
+ 3.diff
+ $ hg qapplied
+ $ hg qpush
+ applying 3.diff
+ patch 3.diff is empty
+ now at: 3.diff
+ $ echo next >> base
+ $ hg qrefresh -d '1 0'
+ $ echo > .hg/patches/series # remove 3.diff from series to confuse mq
+ $ hg qfinish -a
+ revision 47dfa8501675 refers to unknown patches: 3.diff
+
+more complex state 'both known and unknown patches
+
+ $ echo hip >> base
+ $ hg qnew -f -d '1 0' -m 4 4.diff
+ $ echo hop >> base
+ $ hg qnew -f -d '1 0' -m 5 5.diff
+ $ echo > .hg/patches/series # remove 4.diff and 5.diff from series to confuse mq
+ $ echo hup >> base
+ $ hg qnew -f -d '1 0' -m 6 6.diff
+ $ echo pup > base
+ $ hg qfinish -a
+ warning: uncommitted changes in the working directory
+ revision 2b1c98802260 refers to unknown patches: 5.diff
+ revision 33a6861311c0 refers to unknown patches: 4.diff
+
+ $ cd ..
diff --git a/tests/test-mq-qdiff.t b/tests/test-mq-qdiff.t
new file mode 100644
index 0000000..905a970
--- /dev/null
+++ b/tests/test-mq-qdiff.t
@@ -0,0 +1,177 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "git=keep" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+ $ echo 'base' > base
+ $ hg ci -Ambase
+ adding base
+
+ $ hg qnew -mmqbase mqbase
+
+ $ echo 'patched' > base
+ $ hg qrefresh
+
+qdiff:
+
+ $ hg qdiff
+ diff -r d20a80d4def3 base
+ --- a/base Thu Jan 01 00:00:00 1970 +0000
+ +++ b/base* (glob)
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+qdiff dirname:
+
+ $ hg qdiff --nodates .
+ diff -r d20a80d4def3 base
+ --- a/base
+ +++ b/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+qdiff filename:
+
+ $ hg qdiff --nodates base
+ diff -r d20a80d4def3 base
+ --- a/base
+ +++ b/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg revert -a
+
+ $ hg qpop
+ popping mqbase
+ patch queue now empty
+
+ $ hg qdelete mqbase
+
+ $ printf '1\n2\n3\n4\nhello world\ngoodbye world\n7\n8\n9\n' > lines
+ $ hg ci -Amlines -d '2 0'
+ adding lines
+
+ $ hg qnew -mmqbase2 mqbase2
+ $ printf '\n\n1\n2\n3\n4\nhello world\n goodbye world\n7\n8\n9\n' > lines
+
+ $ hg qdiff --nodates -U 1
+ diff -r b0c220e1cf43 lines
+ --- a/lines
+ +++ b/lines
+ @@ -1,1 +1,3 @@
+ +
+ +
+ 1
+ @@ -4,4 +6,4 @@
+ 4
+ -hello world
+ -goodbye world
+ +hello world
+ + goodbye world
+ 7
+
+ $ hg qdiff --nodates -b
+ diff -r b0c220e1cf43 lines
+ --- a/lines
+ +++ b/lines
+ @@ -1,9 +1,11 @@
+ +
+ +
+ 1
+ 2
+ 3
+ 4
+ hello world
+ -goodbye world
+ + goodbye world
+ 7
+ 8
+ 9
+
+ $ hg qdiff --nodates -U 1 -B
+ diff -r b0c220e1cf43 lines
+ --- a/lines
+ +++ b/lines
+ @@ -4,4 +4,4 @@
+ 4
+ -hello world
+ -goodbye world
+ +hello world
+ + goodbye world
+ 7
+
+ $ hg qdiff --nodates -w
+ diff -r b0c220e1cf43 lines
+ --- a/lines
+ +++ b/lines
+ @@ -1,3 +1,5 @@
+ +
+ +
+ 1
+ 2
+ 3
+
+ $ hg qdiff --nodates --reverse
+ diff -r b0c220e1cf43 lines
+ --- a/lines
+ +++ b/lines
+ @@ -1,11 +1,9 @@
+ -
+ -
+ 1
+ 2
+ 3
+ 4
+ -hello world
+ - goodbye world
+ +hello world
+ +goodbye world
+ 7
+ 8
+ 9
+
+qdiff preserve existing git flag:
+
+ $ hg qrefresh --git
+ $ echo a >> lines
+ $ hg qdiff
+ diff --git a/lines b/lines
+ --- a/lines
+ +++ b/lines
+ @@ -1,9 +1,12 @@
+ +
+ +
+ 1
+ 2
+ 3
+ 4
+ -hello world
+ -goodbye world
+ +hello world
+ + goodbye world
+ 7
+ 8
+ 9
+ +a
+
+ $ hg qdiff --stat
+ lines | 7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+ $ hg qrefresh
+
+qdiff when file deleted (but not removed) in working dir:
+
+ $ hg qnew deleted-file
+ $ echo a > newfile
+ $ hg add newfile
+ $ hg qrefresh
+ $ rm newfile
+ $ hg qdiff
+
+ $ cd ..
diff --git a/tests/test-mq-qfold.t b/tests/test-mq-qfold.t
new file mode 100644
index 0000000..1345ab5
--- /dev/null
+++ b/tests/test-mq-qfold.t
@@ -0,0 +1,144 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "git=keep" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+init:
+
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo a >> a
+ $ hg qnew -f p1
+ $ echo b >> a
+ $ hg qnew -f p2
+ $ echo c >> a
+ $ hg qnew -f p3
+
+Fold in the middle of the queue:
+
+ $ hg qpop p1
+ popping p3
+ popping p2
+ now at: p1
+
+ $ hg qdiff
+ diff -r 07f494440405 a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+ $ hg qfold p2
+ $ grep git .hg/patches/p1 && echo 'git patch found!'
+ [1]
+
+ $ hg qser
+ p1
+ p3
+
+ $ hg qdiff
+ diff -r 07f494440405 a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,3 @@
+ a
+ +a
+ +b
+
+Fold with local changes:
+
+ $ echo d >> a
+ $ hg qfold p3
+ abort: local changes found, refresh first
+ [255]
+
+ $ hg diff -c .
+ diff -r 07f494440405 -r ???????????? a (glob)
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,3 @@
+ a
+ +a
+ +b
+
+ $ hg revert -a --no-backup
+ reverting a
+
+Fold git patch into a regular patch, expect git patch:
+
+ $ echo a >> a
+ $ hg qnew -f regular
+ $ hg cp a aa
+ $ hg qnew --git -f git
+
+ $ hg qpop
+ popping git
+ now at: regular
+
+ $ hg qfold git
+
+ $ cat .hg/patches/regular
+ # HG changeset patch
+ # Parent ???????????????????????????????????????? (glob)
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,4 @@
+ a
+ a
+ b
+ +a
+ diff --git a/a b/aa
+ copy from a
+ copy to aa
+ --- a/a
+ +++ b/aa
+ @@ -1,3 +1,4 @@
+ a
+ a
+ b
+ +a
+
+ $ hg qpop
+ popping regular
+ now at: p1
+
+ $ hg qdel regular
+
+Fold regular patch into a git patch, expect git patch:
+
+ $ hg cp a aa
+ $ hg qnew --git -f git
+ $ echo b >> aa
+ $ hg qnew -f regular
+
+ $ hg qpop
+ popping regular
+ now at: git
+
+ $ hg qfold regular
+
+ $ cat .hg/patches/git
+ # HG changeset patch
+ # Parent ???????????????????????????????????????? (glob)
+
+ diff --git a/a b/aa
+ copy from a
+ copy to aa
+ --- a/a
+ +++ b/aa
+ @@ -1,3 +1,4 @@
+ a
+ a
+ b
+ +b
+
+ $ cd ..
+
diff --git a/tests/test-mq-qgoto.t b/tests/test-mq-qgoto.t
new file mode 100644
index 0000000..891b3dd
--- /dev/null
+++ b/tests/test-mq-qgoto.t
@@ -0,0 +1,78 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg qnew a.patch
+ $ echo a >> a
+ $ hg qrefresh
+
+ $ hg qnew b.patch
+ $ echo b > b
+ $ hg add b
+ $ hg qrefresh
+
+ $ hg qnew c.patch
+ $ echo c > c
+ $ hg add c
+ $ hg qrefresh
+
+ $ hg qgoto a.patch
+ popping c.patch
+ popping b.patch
+ now at: a.patch
+
+ $ hg qgoto c.patch
+ applying b.patch
+ applying c.patch
+ now at: c.patch
+
+ $ hg qgoto b.patch
+ popping c.patch
+ now at: b.patch
+
+Using index:
+
+ $ hg qgoto 0
+ popping b.patch
+ now at: a.patch
+
+ $ hg qgoto 2
+ applying b.patch
+ applying c.patch
+ now at: c.patch
+
+No warnings when using index:
+
+ $ hg qnew bug314159
+ $ echo d >> c
+ $ hg qrefresh
+ $ hg qnew bug141421
+ $ echo e >> c
+ $ hg qrefresh
+
+ $ hg qgoto 1
+ popping bug141421
+ popping bug314159
+ popping c.patch
+ now at: b.patch
+
+ $ hg qgoto 3
+ applying c.patch
+ applying bug314159
+ now at: bug314159
+
+Detect ambiguous non-index:
+
+ $ hg qgoto 14
+ patch name "14" is ambiguous:
+ bug314159
+ bug141421
+ abort: patch 14 not in series
+ [255]
+
+ $ cd ..
diff --git a/tests/test-mq-qimport-fail-cleanup.t b/tests/test-mq-qimport-fail-cleanup.t
new file mode 100644
index 0000000..a4ae565
--- /dev/null
+++ b/tests/test-mq-qimport-fail-cleanup.t
@@ -0,0 +1,42 @@
+Failed qimport of patches from files should cleanup by recording successfully
+imported patches in series file.
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am'add a'
+ adding a
+ $ cat >b.patch<<EOF
+ > diff --git a/a b/a
+ > --- a/a
+ > +++ b/a
+ > @@ -1,1 +1,2 @@
+ > a
+ > +b
+ > EOF
+
+empty series
+
+ $ hg qseries
+
+qimport valid patch followed by invalid patch
+
+ $ hg qimport b.patch fakepatch
+ adding b.patch to series file
+ abort: unable to read file fakepatch
+ [255]
+
+valid patches before fail added to series
+
+ $ hg qseries
+ b.patch
+
+ $ hg pull -q -r 0 . # update phase
+ $ hg qimport -r 0
+ abort: revision 0 is not mutable
+ (see "hg help phases" for details)
+ [255]
+
+ $ cd ..
diff --git a/tests/test-mq-qimport.t b/tests/test-mq-qimport.t
new file mode 100644
index 0000000..52b3568
--- /dev/null
+++ b/tests/test-mq-qimport.t
@@ -0,0 +1,280 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ cat > writelines.py <<EOF
+ > import sys
+ > path = sys.argv[1]
+ > args = sys.argv[2:]
+ > assert (len(args) % 2) == 0
+ >
+ > f = file(path, 'wb')
+ > for i in xrange(len(args)/2):
+ > count, s = args[2*i:2*i+2]
+ > count = int(count)
+ > s = s.decode('string_escape')
+ > f.write(s*count)
+ > f.close()
+ >
+ > EOF
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "git=1" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+
+qimport without file or revision
+
+ $ hg qimport
+ abort: no files or revisions specified
+ [255]
+
+qimport non-existing-file
+
+ $ hg qimport non-existing-file
+ abort: unable to read file non-existing-file
+ [255]
+
+qimport null revision
+
+ $ hg qimport -r null
+ abort: revision -1 is not mutable
+ (see "hg help phases" for details)
+ [255]
+ $ hg qseries
+
+import email
+
+ $ hg qimport --push -n email - <<EOF
+ > From: Username in email <test@example.net>
+ > Subject: [PATCH] Message in email
+ > Date: Fri, 02 Jan 1970 00:00:00 +0000
+ >
+ > Text before patch.
+ >
+ > # HG changeset patch
+ > # User Username in patch <test@example.net>
+ > # Date 0 0
+ > # Node ID 1a706973a7d84cb549823634a821d9bdf21c6220
+ > # Parent 0000000000000000000000000000000000000000
+ > First line of commit message.
+ >
+ > More text in commit message.
+ > --- confuse the diff detection
+ >
+ > diff --git a/x b/x
+ > new file mode 100644
+ > --- /dev/null
+ > +++ b/x
+ > @@ -0,0 +1,1 @@
+ > +new file
+ > Text after patch.
+ >
+ > EOF
+ adding email to series file
+ applying email
+ now at: email
+
+hg tip -v
+
+ $ hg tip -v
+ changeset: 0:1a706973a7d8
+ tag: email
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: Username in patch <test@example.net>
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: x
+ description:
+ First line of commit message.
+
+ More text in commit message.
+
+
+ $ hg qpop
+ popping email
+ patch queue now empty
+ $ hg qdelete email
+
+import URL
+
+ $ echo foo >> foo
+ $ hg add foo
+ $ hg diff > url.diff
+ $ hg revert --no-backup foo
+ $ rm foo
+
+Under unix: file:///foobar/blah
+Under windows: file:///c:/foobar/blah
+
+ $ patchurl=`pwd | tr '\\\\' /`/url.diff
+ $ expr "$patchurl" : "\/" > /dev/null || patchurl="/$patchurl"
+ $ hg qimport file://"$patchurl"
+ adding url.diff to series file
+ $ rm url.diff
+ $ hg qun
+ url.diff
+
+import patch that already exists
+
+ $ echo foo2 >> foo
+ $ hg add foo
+ $ hg diff > ../url.diff
+ $ hg revert --no-backup foo
+ $ rm foo
+ $ hg qimport ../url.diff
+ abort: patch "url.diff" already exists
+ [255]
+ $ hg qpush
+ applying url.diff
+ now at: url.diff
+ $ cat foo
+ foo
+ $ hg qpop
+ popping url.diff
+ patch queue now empty
+
+qimport -f
+
+ $ hg qimport -f ../url.diff
+ adding url.diff to series file
+ $ hg qpush
+ applying url.diff
+ now at: url.diff
+ $ cat foo
+ foo2
+ $ hg qpop
+ popping url.diff
+ patch queue now empty
+
+build diff with CRLF
+
+ $ python ../writelines.py b 5 'a\n' 5 'a\r\n'
+ $ hg ci -Am addb
+ adding b
+ $ python ../writelines.py b 2 'a\n' 10 'b\n' 2 'a\r\n'
+ $ hg diff > b.diff
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+qimport CRLF diff
+
+ $ hg qimport b.diff
+ adding b.diff to series file
+ $ hg qpush
+ applying b.diff
+ now at: b.diff
+
+try to import --push
+
+ $ cat > appendfoo.diff <<EOF
+ > append foo
+ >
+ > diff -r 07f494440405 -r 261500830e46 baz
+ > --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/baz Thu Jan 01 00:00:00 1970 +0000
+ > @@ -0,0 +1,1 @@
+ > +foo
+ > EOF
+
+ $ cat > appendbar.diff <<EOF
+ > append bar
+ >
+ > diff -r 07f494440405 -r 261500830e46 baz
+ > --- a/baz Thu Jan 01 00:00:00 1970 +0000
+ > +++ b/baz Thu Jan 01 00:00:00 1970 +0000
+ > @@ -1,1 +1,2 @@
+ > foo
+ > +bar
+ > EOF
+
+ $ hg qimport --push appendfoo.diff appendbar.diff
+ adding appendfoo.diff to series file
+ adding appendbar.diff to series file
+ applying appendfoo.diff
+ applying appendbar.diff
+ now at: appendbar.diff
+ $ hg qfin -a
+ patch b.diff finalized without changeset message
+ $ hg qimport -r 'p1(.)::' -P
+ $ hg qpop -a
+ popping 3.diff
+ popping 2.diff
+ patch queue now empty
+ $ hg qdel 3.diff
+ $ hg qdel -k 2.diff
+
+qimport -e
+
+ $ hg qimport -e 2.diff
+ adding 2.diff to series file
+ $ hg qdel -k 2.diff
+
+qimport -e --name newname oldexisitingpatch
+
+ $ hg qimport -e --name this-name-is-better 2.diff
+ renaming 2.diff to this-name-is-better
+ adding this-name-is-better to series file
+ $ hg qser
+ this-name-is-better
+ url.diff
+
+qimport -e --name without --force
+
+ $ cp .hg/patches/this-name-is-better .hg/patches/3.diff
+ $ hg qimport -e --name this-name-is-better 3.diff
+ abort: patch "this-name-is-better" already exists
+ [255]
+ $ hg qser
+ this-name-is-better
+ url.diff
+
+qimport -e --name with --force
+
+ $ hg qimport --force -e --name this-name-is-better 3.diff
+ renaming 3.diff to this-name-is-better
+ adding this-name-is-better to series file
+ $ hg qser
+ this-name-is-better
+ url.diff
+
+qimport with bad name, should abort before reading file
+
+ $ hg qimport non-existant-file --name .hg
+ abort: patch name cannot begin with ".hg"
+ [255]
+
+qimport http:// patch with leading slashes in url
+
+set up hgweb
+
+ $ cd ..
+ $ hg init served
+ $ cd served
+ $ echo a > a
+ $ hg ci -Am patch
+ adding a
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+
+ $ cd ../repo
+ $ hg qimport http://localhost:$HGPORT/raw-rev/0///
+ adding 0 to series file
+
+check qimport phase:
+
+ $ hg -q qpush
+ now at: 0
+ $ hg phase qparent
+ 1: draft
+ $ hg qimport -r qparent
+ $ hg phase qbase
+ 1: draft
+ $ hg qfinish qbase
+ $ echo '[mq]' >> $HGRCPATH
+ $ echo 'secret=true' >> $HGRCPATH
+ $ hg qimport -r qparent
+ $ hg phase qbase
+ 1: secret
+
+ $ cd ..
diff --git a/tests/test-mq-qnew.t b/tests/test-mq-qnew.t
new file mode 100644
index 0000000..7400cad
--- /dev/null
+++ b/tests/test-mq-qnew.t
@@ -0,0 +1,235 @@
+
+ $ catpatch() {
+ > cat $1 | sed -e "s/^\(# Parent \).*/\1/"
+ > }
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ runtest() {
+ > hg init mq
+ > cd mq
+ >
+ > echo a > a
+ > hg ci -Ama
+ >
+ > echo '% qnew should refuse bad patch names'
+ > hg qnew series
+ > hg qnew status
+ > hg qnew guards
+ > hg qnew .
+ > hg qnew ..
+ > hg qnew .hgignore
+ > hg qnew .mqfoo
+ > hg qnew 'foo#bar'
+ > hg qnew 'foo:bar'
+ >
+ > hg qinit -c
+ >
+ > echo '% qnew with name containing slash'
+ > hg qnew foo/
+ > hg qnew foo/bar.patch
+ > hg qnew foo
+ > hg qseries
+ > hg qpop
+ > hg qdelete foo/bar.patch
+ >
+ > echo '% qnew with uncommitted changes'
+ > echo a > somefile
+ > hg add somefile
+ > hg qnew uncommitted.patch
+ > hg st
+ > hg qseries
+ >
+ > echo '% qnew implies add'
+ > hg -R .hg/patches st
+ >
+ > echo '% qnew missing'
+ > hg qnew missing.patch missing
+ >
+ > echo '% qnew -m'
+ > hg qnew -m 'foo bar' mtest.patch
+ > catpatch .hg/patches/mtest.patch
+ >
+ > echo '% qnew twice'
+ > hg qnew first.patch
+ > hg qnew first.patch
+ >
+ > touch ../first.patch
+ > hg qimport ../first.patch
+ >
+ > echo '% qnew -f from a subdirectory'
+ > hg qpop -a
+ > mkdir d
+ > cd d
+ > echo b > b
+ > hg ci -Am t
+ > echo b >> b
+ > hg st
+ > hg qnew -g -f p
+ > catpatch ../.hg/patches/p
+ >
+ > echo '% qnew -u with no username configured'
+ > HGUSER= hg qnew -u blue red
+ > catpatch ../.hg/patches/red
+ >
+ > echo '% qnew -e -u with no username configured'
+ > HGUSER= hg qnew -e -u chartreuse fucsia
+ > catpatch ../.hg/patches/fucsia
+ >
+ > echo '% fail when trying to import a merge'
+ > hg init merge
+ > cd merge
+ > touch a
+ > hg ci -Am null
+ > echo a >> a
+ > hg ci -m a
+ > hg up -r 0
+ > echo b >> a
+ > hg ci -m b
+ > hg merge -f 1
+ > hg resolve --mark a
+ > hg qnew -f merge
+ >
+ > cd ../../..
+ > rm -r mq
+ > }
+
+plain headers
+
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "plain=true" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ adding a
+ % qnew should refuse bad patch names
+ abort: "series" cannot be used as the name of a patch
+ abort: "status" cannot be used as the name of a patch
+ abort: "guards" cannot be used as the name of a patch
+ abort: "." cannot be used as the name of a patch
+ abort: ".." cannot be used as the name of a patch
+ abort: patch name cannot begin with ".hg"
+ abort: patch name cannot begin with ".mq"
+ abort: "#" cannot be used in the name of a patch
+ abort: ":" cannot be used in the name of a patch
+ % qnew with name containing slash
+ abort: path ends in directory separator: foo/ (glob)
+ abort: "foo" already exists as a directory
+ foo/bar.patch
+ popping foo/bar.patch
+ patch queue now empty
+ % qnew with uncommitted changes
+ uncommitted.patch
+ % qnew implies add
+ A .hgignore
+ A series
+ A uncommitted.patch
+ % qnew missing
+ abort: missing: * (glob)
+ % qnew -m
+ foo bar
+
+ % qnew twice
+ abort: patch "first.patch" already exists
+ abort: patch "first.patch" already exists
+ % qnew -f from a subdirectory
+ popping first.patch
+ popping mtest.patch
+ popping uncommitted.patch
+ patch queue now empty
+ adding d/b
+ M d/b
+ diff --git a/d/b b/d/b
+ --- a/d/b
+ +++ b/d/b
+ @@ -1,1 +1,2 @@
+ b
+ +b
+ % qnew -u with no username configured
+ From: blue
+
+ % qnew -e -u with no username configured
+ From: chartreuse
+
+ % fail when trying to import a merge
+ adding a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ abort: cannot manage merge changesets
+ $ rm -r sandbox
+
+hg headers
+
+ $ echo "plain=false" >> $HGRCPATH
+ $ mkdir sandbox
+ $ (cd sandbox ; runtest)
+ adding a
+ % qnew should refuse bad patch names
+ abort: "series" cannot be used as the name of a patch
+ abort: "status" cannot be used as the name of a patch
+ abort: "guards" cannot be used as the name of a patch
+ abort: "." cannot be used as the name of a patch
+ abort: ".." cannot be used as the name of a patch
+ abort: patch name cannot begin with ".hg"
+ abort: patch name cannot begin with ".mq"
+ abort: "#" cannot be used in the name of a patch
+ abort: ":" cannot be used in the name of a patch
+ % qnew with name containing slash
+ abort: path ends in directory separator: foo/ (glob)
+ abort: "foo" already exists as a directory
+ foo/bar.patch
+ popping foo/bar.patch
+ patch queue now empty
+ % qnew with uncommitted changes
+ uncommitted.patch
+ % qnew implies add
+ A .hgignore
+ A series
+ A uncommitted.patch
+ % qnew missing
+ abort: missing: * (glob)
+ % qnew -m
+ # HG changeset patch
+ # Parent
+ foo bar
+
+ % qnew twice
+ abort: patch "first.patch" already exists
+ abort: patch "first.patch" already exists
+ % qnew -f from a subdirectory
+ popping first.patch
+ popping mtest.patch
+ popping uncommitted.patch
+ patch queue now empty
+ adding d/b
+ M d/b
+ # HG changeset patch
+ # Parent
+ diff --git a/d/b b/d/b
+ --- a/d/b
+ +++ b/d/b
+ @@ -1,1 +1,2 @@
+ b
+ +b
+ % qnew -u with no username configured
+ # HG changeset patch
+ # Parent
+ # User blue
+ % qnew -e -u with no username configured
+ # HG changeset patch
+ # Parent
+ # User chartreuse
+ % fail when trying to import a merge
+ adding a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ abort: cannot manage merge changesets
+ $ rm -r sandbox
diff --git a/tests/test-mq-qpush-exact.t b/tests/test-mq-qpush-exact.t
new file mode 100644
index 0000000..99fb74e
--- /dev/null
+++ b/tests/test-mq-qpush-exact.t
@@ -0,0 +1,289 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+make a test repository that looks like this:
+
+o 2:28bc7b1afd6a
+|
+| @ 1:d7fe2034f71b
+|/
+o 0/62ecad8b70e5
+
+ $ hg init r0
+ $ cd r0
+ $ touch f0
+ $ hg ci -m0 -Aq
+ $ touch f1
+ $ hg ci -m1 -Aq
+
+ $ hg update 0 -q
+ $ touch f2
+ $ hg ci -m2 -Aq
+ $ hg update 1 -q
+
+make some patches with a parent: 1:d7fe2034f71b -> p0 -> p1
+
+ $ echo cp0 >> fp0
+ $ hg add fp0
+ $ hg ci -m p0 -d "0 0"
+ $ hg export -r. > p0
+ $ hg strip -qn .
+ $ hg qimport p0
+ adding p0 to series file
+ $ hg qpush
+ applying p0
+ now at: p0
+
+ $ echo cp1 >> fp1
+ $ hg add fp1
+ $ hg qnew p1 -d "0 0"
+
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact when at the parent
+
+ $ hg update 1 -q
+ $ hg qpush -e
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg qpush -e p0
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg qpush -e p1
+ applying p0
+ applying p1
+ now at: p1
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact when at another rev
+
+ $ hg update 0 -q
+ $ hg qpush -e
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 0 -q
+ $ hg qpush -e p0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 0 -q
+ $ hg qpush -e p1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ applying p0
+ applying p1
+ now at: p1
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 0 -q
+ $ hg qpush -ea
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ applying p0
+ applying p1
+ now at: p1
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact while crossing branches
+
+ $ hg update 2 -q
+ $ hg qpush -e
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 2 -q
+ $ hg qpush -e p0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ applying p0
+ now at: p0
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 2 -q
+ $ hg qpush -e p1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ applying p0
+ applying p1
+ now at: p1
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 2 -q
+ $ hg qpush -ea
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ applying p0
+ applying p1
+ now at: p1
+ $ hg parents -qr qbase
+ 1:d7fe2034f71b
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact --force with changes to an unpatched file
+
+ $ hg update 1 -q
+ $ echo c0 >> f0
+ $ hg qpush -e
+ abort: local changes found
+ [255]
+ $ hg qpush -ef
+ applying p0
+ now at: p0
+ $ cat f0
+ c0
+ $ rm f0
+ $ touch f0
+ $ hg qpop -aq
+ patch queue now empty
+
+ $ hg update 1 -q
+ $ echo c0 >> f0
+ $ hg qpush -e p1
+ abort: local changes found
+ [255]
+ $ hg qpush -e p1 -f
+ applying p0
+ applying p1
+ now at: p1
+ $ cat f0
+ c0
+ $ rm f0
+ $ touch f0
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact --force with changes to a patched file
+
+ $ hg update 1 -q
+ $ echo cp0-bad >> fp0
+ $ hg add fp0
+ $ hg qpush -e
+ abort: local changes found
+ [255]
+ $ hg qpush -ef
+ applying p0
+ file fp0 already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file fp0.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh p0
+ [2]
+ $ cat fp0
+ cp0-bad
+ $ cat fp0.rej
+ --- fp0
+ +++ fp0
+ @@ -0,0 +1,1 @@
+ +cp0
+ $ hg qpop -aqf
+ patch queue now empty
+ $ rm fp0
+ $ rm fp0.rej
+
+ $ hg update 1 -q
+ $ echo cp1-bad >> fp1
+ $ hg add fp1
+ $ hg qpush -e p1
+ abort: local changes found
+ [255]
+ $ hg qpush -e p1 -f
+ applying p0
+ applying p1
+ file fp1 already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file fp1.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh p1
+ [2]
+ $ cat fp1
+ cp1-bad
+ $ cat fp1.rej
+ --- fp1
+ +++ fp1
+ @@ -0,0 +1,1 @@
+ +cp1
+ $ hg qpop -aqf
+ patch queue now empty
+ $ rm fp1
+ $ rm fp1.rej
+
+qpush --exact when already at a patch
+
+ $ hg update 1
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg qpush -e p0
+ applying p0
+ now at: p0
+ $ hg qpush -e p1
+ abort: cannot push --exact with applied patches
+ [255]
+ $ hg qpop -aq
+ patch queue now empty
+
+qpush --exact --move should fail
+
+ $ hg qpush -e --move p1
+ abort: cannot use --exact and --move together
+ [255]
+
+qpush --exact a patch without a parent recorded
+
+ $ hg qpush -q
+ now at: p0
+ $ grep -v '# Parent' .hg/patches/p0 > p0.new
+ $ mv p0.new .hg/patches/p0
+ $ hg qpop -aq
+ patch queue now empty
+ $ hg qpush -e
+ abort: p0 does not have a parent recorded
+ [255]
+ $ hg qpush -e p0
+ abort: p0 does not have a parent recorded
+ [255]
+ $ hg qpush -e p1
+ abort: p0 does not have a parent recorded
+ [255]
+ $ hg qpush -ea
+ abort: p0 does not have a parent recorded
+ [255]
+
+ $ cd ..
diff --git a/tests/test-mq-qpush-fail.t b/tests/test-mq-qpush-fail.t
new file mode 100644
index 0000000..44379cd
--- /dev/null
+++ b/tests/test-mq-qpush-fail.t
@@ -0,0 +1,426 @@
+Test that qpush cleans things up if it doesn't complete
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ hg init repo
+ $ cd repo
+ $ echo foo > foo
+ $ hg ci -Am 'add foo'
+ adding foo
+ $ touch untracked-file
+ $ echo 'syntax: glob' > .hgignore
+ $ echo '.hgignore' >> .hgignore
+ $ hg qinit
+
+test qpush on empty series
+
+ $ hg qpush
+ no patches in series
+ $ hg qnew patch1
+ $ echo >> foo
+ $ hg qrefresh -m 'patch 1'
+ $ hg qnew patch2
+ $ echo bar > bar
+ $ hg add bar
+ $ hg qrefresh -m 'patch 2'
+ $ hg qnew --config 'mq.plain=true' bad-patch
+ $ echo >> foo
+ $ hg qrefresh
+ $ hg qpop -a
+ popping bad-patch
+ popping patch2
+ popping patch1
+ patch queue now empty
+ $ python -c 'print "\xe9"' > message
+ $ cat .hg/patches/bad-patch >> message
+ $ mv message .hg/patches/bad-patch
+ $ hg qpush -a && echo 'qpush succeded?!'
+ applying patch1
+ applying patch2
+ applying bad-patch
+ transaction abort!
+ rollback completed
+ cleaning up working directory...done
+ abort: decoding near '\xe9': 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)! (esc)
+ [255]
+ $ hg parents
+ changeset: 0:bbd179dfa0a7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+
+test corrupt status file
+ $ hg qpush
+ applying patch1
+ now at: patch1
+ $ cp .hg/patches/status .hg/patches/status.orig
+ $ hg qpop
+ popping patch1
+ patch queue now empty
+ $ cp .hg/patches/status.orig .hg/patches/status
+ $ hg qpush
+ mq status file refers to unknown node * (glob)
+ abort: working directory revision is not qtip
+ [255]
+ $ rm .hg/patches/status .hg/patches/status.orig
+
+
+bar should be gone; other unknown/ignored files should still be around
+
+ $ hg status -A
+ ? untracked-file
+ I .hgignore
+ C foo
+
+preparing qpush of a missing patch
+
+ $ hg qpop -a
+ no patches applied
+ $ hg qpush
+ applying patch1
+ now at: patch1
+ $ rm .hg/patches/patch2
+
+now we expect the push to fail, but it should NOT complain about patch1
+
+ $ hg qpush
+ applying patch2
+ unable to read patch2
+ now at: patch1
+ [1]
+
+preparing qpush of missing patch with no patch applied
+
+ $ hg qpop -a
+ popping patch1
+ patch queue now empty
+ $ rm .hg/patches/patch1
+
+qpush should fail the same way as below
+
+ $ hg qpush
+ applying patch1
+ unable to read patch1
+ [1]
+
+Test qpush to a patch below the currently applied patch.
+
+ $ hg qq -c guardedseriesorder
+ $ hg qnew a
+ $ hg qguard +block
+ $ hg qnew b
+ $ hg qnew c
+
+ $ hg qpop -a
+ popping c
+ popping b
+ popping a
+ patch queue now empty
+
+try to push and pop while a is guarded
+
+ $ hg qpush a
+ cannot push 'a' - guarded by '+block'
+ [1]
+ $ hg qpush -a
+ applying b
+ patch b is empty
+ applying c
+ patch c is empty
+ now at: c
+
+now try it when a is unguarded, and we're at the top of the queue
+ $ hg qsel block
+ number of guarded, applied patches has changed from 1 to 0
+ $ hg qpush b
+ abort: cannot push to a previous patch: b
+ [255]
+ $ hg qpush a
+ abort: cannot push to a previous patch: a
+ [255]
+
+and now we try it one more time with a unguarded, while we're not at the top of the queue
+
+ $ hg qpop b
+ popping c
+ now at: b
+ $ hg qpush a
+ abort: cannot push to a previous patch: a
+ [255]
+
+test qpop --force and backup files
+
+ $ hg qpop -a
+ popping b
+ patch queue now empty
+ $ hg qq --create force
+ $ echo a > a
+ $ echo b > b
+ $ echo c > c
+ $ hg ci -Am add a b c
+ $ echo a >> a
+ $ hg rm b
+ $ hg rm c
+ $ hg qnew p1
+ $ echo a >> a
+ $ echo bb > b
+ $ hg add b
+ $ echo cc > c
+ $ hg add c
+ $ hg qpop --force --verbose
+ saving current version of a as a.orig
+ saving current version of b as b.orig
+ saving current version of c as c.orig
+ popping p1
+ patch queue now empty
+ $ hg st
+ ? a.orig
+ ? b.orig
+ ? c.orig
+ ? untracked-file
+ $ cat a.orig
+ a
+ a
+ a
+ $ cat b.orig
+ bb
+ $ cat c.orig
+ cc
+
+test qpop --force --no-backup
+
+ $ hg qpush
+ applying p1
+ now at: p1
+ $ rm a.orig
+ $ echo a >> a
+ $ hg qpop --force --no-backup --verbose
+ popping p1
+ patch queue now empty
+ $ test -f a.orig && echo 'error: backup with --no-backup'
+ [1]
+
+test qpop --keep-changes
+
+ $ hg qpush
+ applying p1
+ now at: p1
+ $ hg qpop --keep-changes --force
+ abort: cannot use both --force and --keep-changes
+ [255]
+ $ echo a >> a
+ $ hg qpop --keep-changes
+ abort: local changes found, refresh first
+ [255]
+ $ hg revert -qa a
+ $ rm a
+ $ hg qpop --keep-changes
+ abort: local changes found, refresh first
+ [255]
+ $ hg rm -A a
+ $ hg qpop --keep-changes
+ abort: local changes found, refresh first
+ [255]
+ $ hg revert -qa a
+ $ echo b > b
+ $ hg add b
+ $ hg qpop --keep-changes
+ abort: local changes found, refresh first
+ [255]
+ $ hg forget b
+ $ echo d > d
+ $ hg add d
+ $ hg qpop --keep-changes
+ popping p1
+ patch queue now empty
+ $ hg forget d
+ $ rm d
+
+test qpush --force and backup files
+
+ $ echo a >> a
+ $ hg qnew p2
+ $ echo b >> b
+ $ echo d > d
+ $ echo e > e
+ $ hg add d e
+ $ hg rm c
+ $ hg qnew p3
+ $ hg qpop -a
+ popping p3
+ popping p2
+ patch queue now empty
+ $ echo a >> a
+ $ echo b1 >> b
+ $ echo d1 > d
+ $ hg add d
+ $ echo e1 > e
+ $ hg qpush -a --force --verbose
+ applying p2
+ saving current version of a as a.orig
+ patching file a
+ a
+ applying p3
+ saving current version of b as b.orig
+ saving current version of d as d.orig
+ patching file b
+ patching file c
+ patching file d
+ file d already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file d.rej
+ patching file e
+ file e already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file e.rej
+ patch failed to apply
+ b
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh p3
+ [2]
+ $ cat a.orig
+ a
+ a
+ $ cat b.orig
+ b
+ b1
+ $ cat d.orig
+ d1
+
+test qpush --force --no-backup
+
+ $ hg revert -qa
+ $ hg qpop -a
+ popping p3
+ popping p2
+ patch queue now empty
+ $ echo a >> a
+ $ rm a.orig
+ $ hg qpush --force --no-backup --verbose
+ applying p2
+ patching file a
+ a
+ now at: p2
+ $ test -f a.orig && echo 'error: backup with --no-backup'
+ [1]
+
+test qgoto --force --no-backup
+
+ $ hg qpop
+ popping p2
+ patch queue now empty
+ $ echo a >> a
+ $ hg qgoto --force --no-backup p2 --verbose
+ applying p2
+ patching file a
+ a
+ now at: p2
+ $ test -f a.orig && echo 'error: backup with --no-backup'
+ [1]
+
+test qpush --keep-changes
+
+ $ hg qpush --keep-changes --force
+ abort: cannot use both --force and --keep-changes
+ [255]
+ $ hg qpush --keep-changes --exact
+ abort: cannot use --exact and --keep-changes together
+ [255]
+ $ echo b >> b
+ $ hg qpush --keep-changes
+ applying p3
+ errors during apply, please fix and refresh p2
+ [2]
+ $ rm b
+ $ hg qpush --keep-changes
+ applying p3
+ errors during apply, please fix and refresh p2
+ [2]
+ $ hg rm -A b
+ $ hg qpush --keep-changes
+ applying p3
+ errors during apply, please fix and refresh p2
+ [2]
+ $ hg revert -aq b
+ $ echo d > d
+ $ hg add d
+ $ hg qpush --keep-changes
+ applying p3
+ errors during apply, please fix and refresh p2
+ [2]
+ $ hg forget d
+ $ rm d
+ $ hg qpop
+ popping p2
+ patch queue now empty
+ $ echo b >> b
+ $ hg qpush -a --keep-changes
+ applying p2
+ applying p3
+ errors during apply, please fix and refresh p2
+ [2]
+ $ hg qtop
+ p2
+ $ hg parents --template "{rev} {desc}\n"
+ 2 imported patch p2
+ $ hg st b
+ M b
+ $ cat b
+ b
+ b
+
+test qgoto --keep-changes
+
+ $ hg revert -aq b
+ $ rm e
+ $ hg qgoto --keep-changes --force p3
+ abort: cannot use both --force and --keep-changes
+ [255]
+ $ echo a >> a
+ $ hg qgoto --keep-changes p3
+ applying p3
+ now at: p3
+ $ hg st a
+ M a
+ $ hg qgoto --keep-changes p2
+ popping p3
+ now at: p2
+ $ hg st a
+ M a
+
+test mq.keepchanges setting
+
+ $ hg --config mq.keepchanges=1 qpush
+ applying p3
+ now at: p3
+ $ hg st a
+ M a
+ $ hg --config mq.keepchanges=1 qpop
+ popping p3
+ now at: p2
+ $ hg st a
+ M a
+ $ hg --config mq.keepchanges=1 qgoto p3
+ applying p3
+ now at: p3
+ $ hg st a
+ M a
+ $ echo b >> b
+ $ hg --config mq.keepchanges=1 qpop --force
+ popping p3
+ now at: p2
+ $ hg st b
+ $ hg --config mq.keepchanges=1 qpush --exact
+ abort: local changes found, refresh first
+ [255]
+ $ hg revert -qa a
+ $ hg qpop
+ popping p2
+ patch queue now empty
+ $ echo a >> a
+ $ hg --config mq.keepchanges=1 qpush --force
+ applying p2
+ now at: p2
+ $ hg st a
+
+ $ cd ..
diff --git a/tests/test-mq-qqueue.t b/tests/test-mq-qqueue.t
new file mode 100644
index 0000000..00d3299
--- /dev/null
+++ b/tests/test-mq-qqueue.t
@@ -0,0 +1,188 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init foo
+ $ cd foo
+ $ echo a > a
+ $ hg ci -qAm a
+
+Default queue:
+
+ $ hg qqueue
+ patches (active)
+
+ $ echo b > a
+ $ hg qnew -fgDU somestuff
+
+Applied patches in default queue:
+
+ $ hg qap
+ somestuff
+
+Try to change patch (create succeeds, switch fails):
+
+ $ hg qqueue foo --create
+ abort: patches applied - cannot set new queue active
+ [255]
+
+ $ hg qqueue
+ foo
+ patches (active)
+
+Empty default queue:
+
+ $ hg qpop
+ popping somestuff
+ patch queue now empty
+
+Switch queue:
+
+ $ hg qqueue foo
+ $ hg qqueue
+ foo (active)
+ patches
+
+List queues, quiet:
+
+ $ hg qqueue --quiet
+ foo
+ patches
+
+Fail creating queue with already existing name:
+
+ $ hg qqueue --create foo
+ abort: queue "foo" already exists
+ [255]
+
+ $ hg qqueue
+ foo (active)
+ patches
+
+Create new queue for rename:
+
+ $ hg qqueue --create bar
+
+ $ hg qqueue
+ bar (active)
+ foo
+ patches
+
+Rename queue, same name:
+
+ $ hg qqueue --rename bar
+ abort: can't rename "bar" to its current name
+ [255]
+
+Rename queue to existing:
+
+ $ hg qqueue --rename foo
+ abort: queue "foo" already exists
+ [255]
+
+Rename queue:
+
+ $ hg qqueue --rename buz
+
+ $ hg qqueue
+ buz (active)
+ foo
+ patches
+
+Switch back to previous queue:
+
+ $ hg qqueue foo
+ $ hg qqueue --delete buz
+
+ $ hg qqueue
+ foo (active)
+ patches
+
+Create queue for purge:
+
+ $ hg qqueue --create purge-me
+
+ $ hg qqueue
+ foo
+ patches
+ purge-me (active)
+
+Create patch for purge:
+
+ $ hg qnew patch-purge-me
+
+ $ ls -1d .hg/patches-purge-me 2>/dev/null || true
+ .hg/patches-purge-me
+
+ $ hg qpop -a
+ popping patch-purge-me
+ patch queue now empty
+
+Purge queue:
+
+ $ hg qqueue foo
+ $ hg qqueue --purge purge-me
+
+ $ hg qqueue
+ foo (active)
+ patches
+
+ $ ls -1d .hg/patches-purge-me 2>/dev/null || true
+
+Unapplied patches:
+
+ $ hg qun
+ $ echo c > a
+ $ hg qnew -fgDU otherstuff
+
+Fail switching back:
+
+ $ hg qqueue patches
+ abort: patches applied - cannot set new queue active
+ [255]
+
+Fail deleting current:
+
+ $ hg qqueue foo --delete
+ abort: cannot delete currently active queue
+ [255]
+
+Switch back and delete foo:
+
+ $ hg qpop -a
+ popping otherstuff
+ patch queue now empty
+
+ $ hg qqueue patches
+ $ hg qqueue foo --delete
+ $ hg qqueue
+ patches (active)
+
+Tricky cases:
+
+ $ hg qqueue store --create
+ $ hg qnew journal
+
+ $ hg qqueue
+ patches
+ store (active)
+
+ $ hg qpop -a
+ popping journal
+ patch queue now empty
+
+ $ hg qqueue patches
+ $ hg qun
+ somestuff
+
+Invalid names:
+
+ $ hg qqueue test/../../bar --create
+ abort: invalid queue name, may not contain the characters ":\/."
+ [255]
+
+ $ hg qqueue . --create
+ abort: invalid queue name, may not contain the characters ":\/."
+ [255]
+
+ $ cd ..
+
diff --git a/tests/test-mq-qrefresh-interactive.t b/tests/test-mq-qrefresh-interactive.t
new file mode 100644
index 0000000..41c27ce
--- /dev/null
+++ b/tests/test-mq-qrefresh-interactive.t
@@ -0,0 +1,350 @@
+Create configuration
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "interactive=true" >> $HGRCPATH
+
+help qrefresh (no record)
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ hg help qrefresh
+ hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...
+
+ update the current patch
+
+ If any file patterns are provided, the refreshed patch will contain only
+ the modifications that match those patterns; the remaining modifications
+ will remain in the working directory.
+
+ If -s/--short is specified, files currently included in the patch will be
+ refreshed just like matched files and remain in the patch.
+
+ If -e/--edit is specified, Mercurial will start your configured editor for
+ you to enter a message. In case qrefresh fails, you will find a backup of
+ your message in ".hg/last-message.txt".
+
+ hg add/remove/copy/rename work as usual, though you might want to use git-
+ style patches (-g/--git or [diff] git=1) to track copies and renames. See
+ the diffs help topic for more information on the git diff format.
+
+ Returns 0 on success.
+
+ options:
+
+ -e --edit edit commit message
+ -g --git use git extended diff format
+ -s --short refresh only files already in the patch and
+ specified files
+ -U --currentuser add/update author field in patch with current user
+ -u --user USER add/update author field in patch with given user
+ -D --currentdate add/update date field in patch with current date
+ -d --date DATE add/update date field in patch with given date
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -m --message TEXT use text as commit message
+ -l --logfile FILE read commit message from file
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help qrefresh" to show more info
+
+help qrefresh (record)
+
+ $ echo "record=" >> $HGRCPATH
+ $ hg help qrefresh
+ hg qrefresh [-I] [-X] [-e] [-m TEXT] [-l FILE] [-s] [FILE]...
+
+ update the current patch
+
+ If any file patterns are provided, the refreshed patch will contain only
+ the modifications that match those patterns; the remaining modifications
+ will remain in the working directory.
+
+ If -s/--short is specified, files currently included in the patch will be
+ refreshed just like matched files and remain in the patch.
+
+ If -e/--edit is specified, Mercurial will start your configured editor for
+ you to enter a message. In case qrefresh fails, you will find a backup of
+ your message in ".hg/last-message.txt".
+
+ hg add/remove/copy/rename work as usual, though you might want to use git-
+ style patches (-g/--git or [diff] git=1) to track copies and renames. See
+ the diffs help topic for more information on the git diff format.
+
+ Returns 0 on success.
+
+ options:
+
+ -e --edit edit commit message
+ -g --git use git extended diff format
+ -s --short refresh only files already in the patch and
+ specified files
+ -U --currentuser add/update author field in patch with current user
+ -u --user USER add/update author field in patch with given user
+ -D --currentdate add/update date field in patch with current date
+ -d --date DATE add/update date field in patch with given date
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -m --message TEXT use text as commit message
+ -l --logfile FILE read commit message from file
+ -i --interactive interactively select changes to refresh
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help qrefresh" to show more info
+
+ $ hg init a
+ $ cd a
+
+Base commit
+
+ $ cat > 1.txt <<EOF
+ > 1
+ > 2
+ > 3
+ > 4
+ > 5
+ > EOF
+ $ cat > 2.txt <<EOF
+ > a
+ > b
+ > c
+ > d
+ > e
+ > f
+ > EOF
+
+ $ mkdir dir
+ $ cat > dir/a.txt <<EOF
+ > hello world
+ >
+ > someone
+ > up
+ > there
+ > loves
+ > me
+ > EOF
+
+ $ hg add 1.txt 2.txt dir/a.txt
+ $ hg commit -m aaa
+ $ hg qnew -d '0 0' patch
+
+Changing files
+
+ $ sed -e 's/2/2 2/;s/4/4 4/' 1.txt > 1.txt.new
+ $ sed -e 's/b/b b/' 2.txt > 2.txt.new
+ $ sed -e 's/hello world/hello world!/' dir/a.txt > dir/a.txt.new
+
+ $ mv -f 1.txt.new 1.txt
+ $ mv -f 2.txt.new 2.txt
+ $ mv -f dir/a.txt.new dir/a.txt
+
+Whole diff
+
+ $ hg diff --nodates
+ diff -r ed27675cb5df 1.txt
+ --- a/1.txt
+ +++ b/1.txt
+ @@ -1,5 +1,5 @@
+ 1
+ -2
+ +2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r ed27675cb5df 2.txt
+ --- a/2.txt
+ +++ b/2.txt
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+ diff -r ed27675cb5df dir/a.txt
+ --- a/dir/a.txt
+ +++ b/dir/a.txt
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+partial qrefresh
+
+ $ hg qrefresh -i -d '0 0' <<EOF
+ > y
+ > y
+ > n
+ > y
+ > y
+ > n
+ > EOF
+ diff --git a/1.txt b/1.txt
+ 2 hunks, 2 lines changed
+ examine changes to '1.txt'? [Ynesfdaq?]
+ @@ -1,3 +1,3 @@
+ 1
+ -2
+ +2 2
+ 3
+ record change 1/4 to '1.txt'? [Ynesfdaq?]
+ @@ -3,3 +3,3 @@
+ 3
+ -4
+ +4 4
+ 5
+ record change 2/4 to '1.txt'? [Ynesfdaq?]
+ diff --git a/2.txt b/2.txt
+ 1 hunks, 1 lines changed
+ examine changes to '2.txt'? [Ynesfdaq?]
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+ record change 3/4 to '2.txt'? [Ynesfdaq?]
+ diff --git a/dir/a.txt b/dir/a.txt
+ 1 hunks, 1 lines changed
+ examine changes to 'dir/a.txt'? [Ynesfdaq?]
+
+After partial qrefresh 'tip'
+
+ $ hg tip -p
+ changeset: 1:0738af1a8211
+ tag: patch
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: [mq]: patch
+
+ diff -r 1fd39ab63a33 -r 0738af1a8211 1.txt
+ --- a/1.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ 1
+ -2
+ +2 2
+ 3
+ 4
+ 5
+ diff -r 1fd39ab63a33 -r 0738af1a8211 2.txt
+ --- a/2.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/2.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+
+After partial qrefresh 'diff'
+
+ $ hg diff --nodates
+ diff -r 0738af1a8211 1.txt
+ --- a/1.txt
+ +++ b/1.txt
+ @@ -1,5 +1,5 @@
+ 1
+ 2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r 0738af1a8211 dir/a.txt
+ --- a/dir/a.txt
+ +++ b/dir/a.txt
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+qrefresh interactively everything else
+
+ $ hg qrefresh -i -d '0 0' <<EOF
+ > y
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/1.txt b/1.txt
+ 1 hunks, 1 lines changed
+ examine changes to '1.txt'? [Ynesfdaq?]
+ @@ -1,5 +1,5 @@
+ 1
+ 2 2
+ 3
+ -4
+ +4 4
+ 5
+ record change 1/2 to '1.txt'? [Ynesfdaq?]
+ diff --git a/dir/a.txt b/dir/a.txt
+ 1 hunks, 1 lines changed
+ examine changes to 'dir/a.txt'? [Ynesfdaq?]
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+ record change 2/2 to 'dir/a.txt'? [Ynesfdaq?]
+
+After final qrefresh 'tip'
+
+ $ hg tip -p
+ changeset: 1:2c3f66afeed9
+ tag: patch
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: [mq]: patch
+
+ diff -r 1fd39ab63a33 -r 2c3f66afeed9 1.txt
+ --- a/1.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ 1
+ -2
+ +2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r 1fd39ab63a33 -r 2c3f66afeed9 2.txt
+ --- a/2.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/2.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+ diff -r 1fd39ab63a33 -r 2c3f66afeed9 dir/a.txt
+ --- a/dir/a.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/dir/a.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+
+After qrefresh 'diff'
+
+ $ hg diff --nodates
+
+ $ cd ..
diff --git a/tests/test-mq-qrefresh-replace-log-message.t b/tests/test-mq-qrefresh-replace-log-message.t
new file mode 100644
index 0000000..40ffa29
--- /dev/null
+++ b/tests/test-mq-qrefresh-replace-log-message.t
@@ -0,0 +1,61 @@
+Environement setup for MQ
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ hg init
+ $ hg qinit
+
+Should fail if no patches applied
+
+ $ hg qrefresh
+ no patches applied
+ [1]
+ $ hg qrefresh -e
+ no patches applied
+ [1]
+ $ hg qnew -m "First commit message" first-patch
+ $ echo aaaa > file
+ $ hg add file
+ $ hg qrefresh
+
+Should display 'First commit message'
+
+ $ hg log -l1 --template "{desc}\n"
+ First commit message
+
+Testing changing message with -m
+
+ $ echo bbbb > file
+ $ hg qrefresh -m "Second commit message"
+
+Should display 'Second commit message'
+
+ $ hg log -l1 --template "{desc}\n"
+ Second commit message
+
+Testing changing message with -l
+
+ $ echo "Third commit message" > logfile
+ $ echo " This is the 3rd log message" >> logfile
+ $ echo bbbb > file
+ $ hg qrefresh -l logfile
+
+Should display 'Third commit message\\\n This is the 3rd log message'
+
+ $ hg log -l1 --template "{desc}\n"
+ Third commit message
+ This is the 3rd log message
+
+Testing changing message with -l-
+
+ $ hg qnew -m "First commit message" second-patch
+ $ echo aaaa > file2
+ $ hg add file2
+ $ echo bbbb > file2
+ $ (echo "Fifth commit message"; echo " This is the 5th log message") | hg qrefresh -l-
+
+Should display 'Fifth commit message\\\n This is the 5th log message'
+
+ $ hg log -l1 --template "{desc}\n"
+ Fifth commit message
+ This is the 5th log message
diff --git a/tests/test-mq-qrefresh.t b/tests/test-mq-qrefresh.t
new file mode 100644
index 0000000..700380e
--- /dev/null
+++ b/tests/test-mq-qrefresh.t
@@ -0,0 +1,546 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+ $ mkdir 1 2
+ $ echo 'base' > 1/base
+ $ echo 'base' > 2/base
+ $ hg ci -Ambase
+ adding 1/base
+ adding 2/base
+
+ $ hg qnew -mmqbase mqbase
+
+ $ echo 'patched' > 1/base
+ $ echo 'patched' > 2/base
+ $ hg qrefresh
+
+ $ hg qdiff
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg qdiff .
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ echo 'patched again' > base
+ $ hg qrefresh 1
+
+ $ hg qdiff
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg qdiff .
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+qrefresh . in subdir:
+
+ $ ( cd 1 ; hg qrefresh . )
+
+ $ hg qdiff
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg qdiff .
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+qrefresh in hg-root again:
+
+ $ hg qrefresh
+
+ $ hg qdiff
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg qdiff .
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+
+qrefresh --short tests:
+
+ $ echo 'orphan' > orphanchild
+ $ hg add orphanchild
+ $ hg qrefresh nonexistingfilename # clear patch
+ $ hg qrefresh --short 1/base
+ $ hg qrefresh --short 2/base
+
+ $ hg qdiff
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 orphanchild
+ --- /dev/null
+ +++ b/orphanchild
+ @@ -0,0 +1,1 @@
+ +orphan
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ hg st
+ A orphanchild
+ ? base
+
+diff shows what is not in patch:
+
+ $ hg diff
+ diff -r ???????????? orphanchild (glob)
+ --- /dev/null
+ +++ b/orphanchild
+ @@ -0,0 +1,1 @@
+ +orphan
+
+Before starting exclusive tests:
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+Exclude 2/base:
+
+ $ hg qref -s -X 2/base
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+status shows 2/base as dirty:
+
+ $ hg status
+ M 2/base
+ A orphanchild
+ ? base
+
+Remove 1/base and add 2/base again but not orphanchild:
+
+ $ hg qref -s -X orphanchild -X 1/base 2/base orphanchild
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 2/base
+ --- a/2/base
+ +++ b/2/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+Add 1/base with include filter - and thus remove 2/base from patch:
+
+ $ hg qref -s -I 1/ o* */*
+
+ $ cat .hg/patches/mqbase
+ # HG changeset patch
+ # Parent e7af5904b465cd1f4f3cf6b26fe14e8db6f63eaa
+ mqbase
+
+ diff -r e7af5904b465 1/base
+ --- a/1/base
+ +++ b/1/base
+ @@ -1,1 +1,1 @@
+ -base
+ +patched
+
+ $ cd ..
+
+
+Test qrefresh --git losing copy metadata:
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo "[diff]" >> .hg/hgrc
+ $ echo "git=True" >> .hg/hgrc
+ $ echo a > a
+
+ $ hg ci -Am adda
+ adding a
+ $ hg copy a ab
+ $ echo b >> ab
+ $ hg copy a ac
+ $ echo c >> ac
+
+Capture changes:
+
+ $ hg qnew -f p1
+
+ $ hg qdiff
+ diff --git a/a b/ab
+ copy from a
+ copy to ab
+ --- a/a
+ +++ b/ab
+ @@ -1,1 +1,2 @@
+ a
+ +b
+ diff --git a/a b/ac
+ copy from a
+ copy to ac
+ --- a/a
+ +++ b/ac
+ @@ -1,1 +1,2 @@
+ a
+ +c
+
+Refresh and check changes again:
+
+ $ hg qrefresh
+
+ $ hg qdiff
+ diff --git a/a b/ab
+ copy from a
+ copy to ab
+ --- a/a
+ +++ b/ab
+ @@ -1,1 +1,2 @@
+ a
+ +b
+ diff --git a/a b/ac
+ copy from a
+ copy to ac
+ --- a/a
+ +++ b/ac
+ @@ -1,1 +1,2 @@
+ a
+ +c
+
+ $ cd ..
+
+
+Issue1441: qrefresh confused after hg rename:
+
+ $ hg init repo-1441
+ $ cd repo-1441
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -f p
+ $ hg mv a b
+ $ hg qrefresh
+
+ $ hg qdiff
+ diff -r 000000000000 b
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +a
+
+ $ cd ..
+
+
+Issue2025: qrefresh does not honor filtering options when tip !=
+qtip:
+
+ $ hg init repo-2025
+ $ cd repo-2025
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -qAm addab
+ $ echo a >> a
+ $ echo b >> b
+ $ hg qnew -f patch
+ $ hg up -qC 0
+ $ echo c > c
+ $ hg ci -qAm addc
+ $ hg up -qC 1
+
+refresh with tip != qtip:
+
+ $ hg --config diff.nodates=1 qrefresh -I b
+
+ $ hg st
+ M a
+
+ $ cat b
+ b
+ b
+
+ $ cat .hg/patches/patch
+ # HG changeset patch
+ # Parent 1a60229be7ac3e4a7f647508e99b87bef1f03593
+
+ diff -r 1a60229be7ac b
+ --- a/b
+ +++ b/b
+ @@ -1,1 +1,2 @@
+ b
+ +b
+
+ $ cd ..
+
+
+Issue1441 with git patches:
+
+ $ hg init repo-1441-git
+ $ cd repo-1441-git
+
+ $ echo "[diff]" >> .hg/hgrc
+ $ echo "git=True" >> .hg/hgrc
+
+ $ echo a > a
+ $ hg add a
+ $ hg qnew -f p
+ $ hg mv a b
+ $ hg qrefresh
+
+ $ hg qdiff --nodates
+ diff --git a/b b/b
+ new file mode 100644
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +a
+
+ $ cd ..
+
+Refresh with bad usernames. Mercurial used to abort on bad usernames,
+but only after writing the bad name into the patch.
+
+ $ hg init bad-usernames
+ $ cd bad-usernames
+ $ touch a
+ $ hg add a
+ $ hg qnew a
+ $ hg qrefresh -u 'foo
+ > bar'
+ transaction abort!
+ rollback completed
+ refresh interrupted while patch was popped! (revert --all, qpush to recover)
+ abort: username 'foo\nbar' contains a newline!
+ [255]
+ $ rm a
+ $ cat .hg/patches/a
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ diff --git a/a b/a
+ new file mode 100644
+ $ hg qpush
+ applying a
+ now at: a
+ $ hg qrefresh -u ' '
+ transaction abort!
+ rollback completed
+ refresh interrupted while patch was popped! (revert --all, qpush to recover)
+ abort: empty username!
+ [255]
+ $ cat .hg/patches/a
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+ diff --git a/a b/a
+ new file mode 100644
+ $ cd ..
+
+Refresh with phase data:
+
+
+
+ $ cd repo
+ $ echo 'babar' >> a
+ $ hg qnew -m 'update a' p2.diff
+ $ hg phase p2.diff
+ 2: draft
+ $ echo 'beber' >> a
+ $ hg qref
+ $ hg phase p2.diff
+ 2: draft
+ $ hg phase --force --secret p2.diff
+ $ echo 'bibir' >> a
+ $ hg qref
+ $ hg phase p2.diff
+ 2: secret
+
+ $ cd ..
diff --git a/tests/test-mq-qrename.t b/tests/test-mq-qrename.t
new file mode 100644
index 0000000..6baf88c
--- /dev/null
+++ b/tests/test-mq-qrename.t
@@ -0,0 +1,125 @@
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+ $ echo 'base' > base
+ $ hg ci -Ambase
+ adding base
+
+ $ hg qnew -mmqbase mqbase
+
+ $ hg qrename mqbase renamed
+ $ mkdir .hg/patches/foo
+ $ hg qrename renamed foo
+
+ $ hg qseries
+ foo/renamed
+
+ $ ls .hg/patches/foo
+ renamed
+
+ $ mkdir .hg/patches/bar
+ $ hg qrename foo/renamed bar
+
+ $ hg qseries
+ bar/renamed
+
+ $ ls .hg/patches/bar
+ renamed
+
+ $ hg qrename bar/renamed baz
+
+ $ hg qseries
+ baz
+
+ $ ls .hg/patches/baz
+ .hg/patches/baz
+
+ $ hg qrename baz new/dir
+
+ $ hg qseries
+ new/dir
+
+ $ ls .hg/patches/new/dir
+ .hg/patches/new/dir
+
+ $ cd ..
+
+Test patch being renamed before committed:
+
+ $ hg init b
+ $ cd b
+ $ hg qinit -c
+ $ hg qnew x
+ $ hg qrename y
+ $ hg qcommit -m rename
+
+ $ cd ..
+
+Test overlapping renames (issue2388)
+
+ $ hg init c
+ $ cd c
+ $ hg qinit -c
+ $ echo a > a
+ $ hg add
+ adding a
+ $ hg qnew patcha
+ $ echo b > b
+ $ hg add
+ adding b
+ $ hg qnew patchb
+ $ hg ci --mq -m c1
+ $ hg qrename patchb patchc
+ $ hg qrename patcha patchb
+ $ hg st --mq
+ M series
+ A patchb
+ A patchc
+ R patcha
+ $ cd ..
+
+Test renames with mq repo (issue2097)
+
+ $ hg init issue2097
+ $ cd issue2097
+ $ hg qnew p0
+ $ (cd .hg/patches && hg init)
+ $ hg qren p0 p1
+ $ hg debugstate --mq
+ $ hg ci --mq -mq0
+ nothing changed
+ [1]
+ $ cd ..
+
+Test renaming to a folded patch (issue3058)
+
+ $ hg init issue3058
+ $ cd issue3058
+ $ hg init --mq
+ $ echo a > a
+ $ hg add a
+ $ hg qnew adda
+ $ echo b >> a
+ $ hg qnew addb
+ $ hg qpop
+ popping addb
+ now at: adda
+ $ hg ci --mq -m "save mq"
+ $ hg qfold addb
+ $ hg qmv addb
+ $ cat .hg/patches/addb
+ # HG changeset patch
+ # Parent 0000000000000000000000000000000000000000
+
+ diff -r 000000000000 a
+ --- /dev/null * (glob)
+ +++ b/a * (glob)
+ @@ -0,0 +1,2 @@
+ +a
+ +b
+ $ cd ..
+
diff --git a/tests/test-mq-qsave.t b/tests/test-mq-qsave.t
new file mode 100644
index 0000000..9754de1
--- /dev/null
+++ b/tests/test-mq-qsave.t
@@ -0,0 +1,15 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init
+
+ $ echo 'base' > base
+ $ hg ci -Ambase
+ adding base
+
+ $ hg qnew -mmqbase mqbase
+
+ $ hg qsave
+ $ hg qrestore 2
+ restoring status: hg patches saved state
+
diff --git a/tests/test-mq-safety.t b/tests/test-mq-safety.t
new file mode 100644
index 0000000..d6fe35d
--- /dev/null
+++ b/tests/test-mq-safety.t
@@ -0,0 +1,216 @@
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'hgext.mq =' >> $HGRCPATH
+ $ echo 'hgext.graphlog =' >> $HGRCPATH
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo foo > foo
+ $ hg ci -qAm 'add a file'
+
+ $ hg qinit
+
+ $ hg qnew foo
+ $ echo foo >> foo
+ $ hg qrefresh -m 'append foo'
+
+ $ hg qnew bar
+ $ echo bar >> foo
+ $ hg qrefresh -m 'append bar'
+
+Try to operate on public mq changeset
+
+ $ hg qpop
+ popping bar
+ now at: foo
+ $ hg phase --public qbase
+ $ echo babar >> foo
+ $ hg qref
+ abort: cannot refresh immutable revision
+ (see "hg help phases" for details)
+ [255]
+ $ hg revert -a
+ reverting foo
+ $ hg qpop
+ abort: popping would remove an immutable revision
+ (see "hg help phases" for details)
+ [255]
+ $ hg qfold bar
+ abort: cannot refresh immutable revision
+ (see "hg help phases" for details)
+ [255]
+ $ hg revert -a
+ reverting foo
+
+restore state for remaining test
+
+ $ hg qpush
+ applying bar
+ now at: bar
+
+try to commit on top of a patch
+
+ $ echo quux >> foo
+ $ hg ci -m 'append quux'
+ abort: cannot commit over an applied mq patch
+ [255]
+
+
+cheat a bit...
+
+ $ mv .hg/patches .hg/patches2
+ $ hg ci -m 'append quux'
+ $ mv .hg/patches2 .hg/patches
+
+
+qpop/qrefresh on the wrong revision
+
+ $ hg qpop
+ abort: popping would remove a revision not managed by this patch queue
+ [255]
+ $ hg qpop -n patches
+ using patch queue: $TESTTMP/repo/.hg/patches (glob)
+ abort: popping would remove a revision not managed by this patch queue
+ [255]
+ $ hg qrefresh
+ abort: working directory revision is not qtip
+ [255]
+
+ $ hg up -C qtip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg qpop
+ abort: popping would remove a revision not managed by this patch queue
+ [255]
+ $ hg qrefresh
+ abort: cannot refresh a revision with children
+ [255]
+ $ hg tip --template '{rev} {desc}\n'
+ 3 append quux
+
+
+qpush warning branchheads
+
+ $ cd ..
+ $ hg init branchy
+ $ cd branchy
+ $ echo q > q
+ $ hg add q
+ $ hg qnew -f qp
+ $ hg qpop
+ popping qp
+ patch queue now empty
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ hg up null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo c > c
+ $ hg ci -Amc
+ adding c
+ $ hg merge default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -mmerge
+ $ hg up default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg log
+ changeset: 2:65309210bf4e
+ branch: b
+ tag: tip
+ parent: 1:707adb4c8ae1
+ parent: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge
+
+ changeset: 1:707adb4c8ae1
+ branch: b
+ parent: -1:000000000000
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg qpush
+ applying qp
+ now at: qp
+
+Testing applied patches, push and --force
+
+ $ cd ..
+ $ hg init forcepush
+ $ cd forcepush
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo a >> a
+ $ hg ci -m changea
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch branch
+ marked working directory as branch branch
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg --cwd .. clone -r 0 forcepush forcepush2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg qnew patch
+
+Pushing applied patch with --rev without --force
+
+ $ hg push -r . ../forcepush2
+ pushing to ../forcepush2
+ abort: source has mq patches applied
+ [255]
+
+Pushing applied patch with branchhash, without --force
+
+ $ hg push ../forcepush2#default
+ pushing to ../forcepush2
+ abort: source has mq patches applied
+ [255]
+
+Pushing revs excluding applied patch
+
+ $ hg push --new-branch -r 'branch(branch)' -r 2 ../forcepush2
+ pushing to ../forcepush2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Pushing applied patch with --force
+
+ $ hg phase --force --secret 'mq()'
+ $ hg push --force -r default ../forcepush2
+ pushing to ../forcepush2
+ searching for changes
+ no changes found (ignored 1 secret changesets)
+ [1]
+ $ hg phase --draft 'mq()'
+ $ hg push --force -r default ../forcepush2
+ pushing to ../forcepush2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+ $ cd ..
diff --git a/tests/test-mq-strip.t b/tests/test-mq-strip.t
new file mode 100644
index 0000000..70fffb1
--- /dev/null
+++ b/tests/test-mq-strip.t
@@ -0,0 +1,468 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+ $ restore() {
+ > hg unbundle -q .hg/strip-backup/*
+ > rm .hg/strip-backup/*
+ > }
+ $ teststrip() {
+ > hg up -C $1
+ > echo % before update $1, strip $2
+ > hg parents
+ > hg --traceback strip $2
+ > echo % after update $1, strip $2
+ > hg parents
+ > restore
+ > }
+
+ $ hg init test
+ $ cd test
+
+ $ echo foo > bar
+ $ hg ci -Ama
+ adding bar
+
+ $ echo more >> bar
+ $ hg ci -Amb
+
+ $ echo blah >> bar
+ $ hg ci -Amc
+
+ $ hg up 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo blah >> bar
+ $ hg ci -Amd
+ created new head
+
+ $ echo final >> bar
+ $ hg ci -Ame
+
+ $ hg log
+ changeset: 4:443431ffac4f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ changeset: 3:65bd5f99a4a3
+ parent: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ changeset: 2:264128213d29
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ teststrip 4 4
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % before update 4, strip 4
+ changeset: 4:443431ffac4f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update 4, strip 4
+ changeset: 3:65bd5f99a4a3
+ tag: tip
+ parent: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ $ teststrip 4 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % before update 4, strip 3
+ changeset: 4:443431ffac4f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update 4, strip 3
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ $ teststrip 1 4
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % before update 1, strip 4
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update 1, strip 4
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ $ teststrip 4 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % before update 4, strip 2
+ changeset: 4:443431ffac4f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update 4, strip 2
+ changeset: 3:443431ffac4f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ $ teststrip 4 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ % before update 4, strip 1
+ changeset: 4:264128213d29
+ tag: tip
+ parent: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update 4, strip 1
+ changeset: 0:9ab35a2d17cb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ teststrip null 4
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ % before update null, strip 4
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ % after update null, strip 4
+
+ $ hg log
+ changeset: 4:264128213d29
+ tag: tip
+ parent: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 3:443431ffac4f
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ changeset: 2:65bd5f99a4a3
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 4
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+before strip of merge parent
+
+ $ hg parents
+ changeset: 2:65bd5f99a4a3
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ changeset: 4:264128213d29
+ tag: tip
+ parent: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ $ hg strip 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+
+after strip of merge parent
+
+ $ hg parents
+ changeset: 1:ef3a871183d7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ $ restore
+
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg glog
+ @ changeset: 4:264128213d29
+ | tag: tip
+ | parent: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ | o changeset: 3:443431ffac4f
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: e
+ | |
+ | o changeset: 2:65bd5f99a4a3
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+2 is parent of 3, only one strip should happen
+
+ $ hg strip "roots(2)" 3
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ $ hg glog
+ @ changeset: 2:264128213d29
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ restore
+ $ hg glog
+ o changeset: 4:443431ffac4f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: e
+ |
+ o changeset: 3:65bd5f99a4a3
+ | parent: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ | @ changeset: 2:264128213d29
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: c
+ |
+ o changeset: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+2 different branches: 2 strips
+
+ $ hg strip 2 4
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ $ hg glog
+ @ changeset: 2:65bd5f99a4a3
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: d
+ |
+ o changeset: 1:ef3a871183d7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ restore
+
+2 different branches and a common ancestor: 1 strip
+
+ $ hg strip 1 "2|4"
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ $ restore
+
+stripping an empty revset
+
+ $ hg strip "1 and not 1"
+ abort: empty revision set
+ [255]
+
+remove branchy history for qimport tests
+
+ $ hg strip 3
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+
+
+strip of applied mq should cleanup status file
+
+ $ hg up -C 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo fooagain >> bar
+ $ hg ci -mf
+ $ hg qimport -r tip:2
+
+applied patches before strip
+
+ $ hg qapplied
+ 2.diff
+ 3.diff
+ 4.diff
+
+stripping revision in queue
+
+ $ hg strip 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+
+applied patches after stripping rev in queue
+
+ $ hg qapplied
+ 2.diff
+
+stripping ancestor of queue
+
+ $ hg strip 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+
+applied patches after stripping ancestor of queue
+
+ $ hg qapplied
+
+Verify strip protects against stripping wc parent when there are uncommited mods
+
+ $ echo b > b
+ $ hg add b
+ $ hg ci -m 'b'
+ $ hg log --graph
+ @ changeset: 1:7519abd79d14
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b
+ |
+ o changeset: 0:9ab35a2d17cb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+
+ $ echo c > b
+ $ echo c > bar
+ $ hg strip tip
+ abort: local changes found
+ [255]
+ $ hg strip tip --keep
+ saved backup bundle to $TESTTMP/test/.hg/strip-backup/*-backup.hg (glob)
+ $ hg log --graph
+ @ changeset: 0:9ab35a2d17cb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg status
+ M bar
+ ? b
+ $ cd ..
+
+stripping many nodes on a complex graph (issue3299)
+
+ $ hg init issue3299
+ $ cd issue3299
+ $ hg debugbuilddag '@a.:a@b.:b.:x<a@a.:a<b@b.:b<a@a.:a'
+ $ hg strip 'not ancestors(x)'
+ saved backup bundle to $TESTTMP/issue3299/.hg/strip-backup/*-backup.hg (glob)
+
+test hg strip -B bookmark
+
+ $ cd ..
+ $ hg init bookmarks
+ $ cd bookmarks
+ $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b'
+ $ hg bookmark -r 'a' 'todelete'
+ $ hg bookmark -r 'b' 'B'
+ $ hg bookmark -r 'b' 'nostrip'
+ $ hg bookmark -r 'c' 'delete'
+ $ hg up -C todelete
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg strip -B nostrip
+ bookmark 'nostrip' deleted
+ abort: empty revision set
+ [255]
+ $ hg strip -B todelete
+ bookmark 'todelete' deleted
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
+ $ hg id -ir dcbb326fdec2
+ abort: unknown revision 'dcbb326fdec2'!
+ [255]
+ $ hg id -ir d62d843c9a01
+ d62d843c9a01
+ $ hg bookmarks
+ B 9:ff43616e5d0f
+ delete 6:2702dd0c91e7
+ $ hg strip -B delete
+ bookmark 'delete' deleted
+ saved backup bundle to $TESTTMP/bookmarks/.hg/strip-backup/*-backup.hg (glob)
+ $ hg id -ir 6:2702dd0c91e7
+ abort: unknown revision '2702dd0c91e7'!
+ [255]
+
+ $ cd ..
diff --git a/tests/test-mq-subrepo-svn.t b/tests/test-mq-subrepo-svn.t
new file mode 100644
index 0000000..39e5c0b
--- /dev/null
+++ b/tests/test-mq-subrepo-svn.t
@@ -0,0 +1,54 @@
+ $ "$TESTDIR/hghave" svn13 || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+fn to create new repository, and cd into it
+ $ mkrepo() {
+ > hg init $1
+ > cd $1
+ > hg qinit
+ > }
+
+
+handle svn subrepos safely
+
+ $ svnadmin create svn-repo-2499
+
+ $ SVNREPOPATH=`pwd`/svn-repo-2499/project
+#if windows
+ $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#else
+ $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#endif
+
+ $ mkdir -p svn-project-2499/trunk
+ $ svn import -m 'init project' svn-project-2499 "$SVNREPOURL"
+ Adding svn-project-2499/trunk (glob)
+
+ Committed revision 1.
+
+qnew on repo w/svn subrepo
+ $ mkrepo repo-2499-svn-subrepo
+ $ svn co "$SVNREPOURL"/trunk sub
+ Checked out revision 1.
+ $ echo 'sub = [svn]sub' >> .hgsub
+ $ hg add .hgsub
+ $ hg status -S -X '**/format'
+ A .hgsub
+ $ hg qnew -m0 0.diff
+ $ cd sub
+ $ echo a > a
+ $ svn add a
+ A a
+ $ svn st
+ A* a (glob)
+ $ cd ..
+ $ hg status -S # doesn't show status for svn subrepos (yet)
+ $ hg qnew -m1 1.diff
+ abort: uncommitted changes in subrepository sub
+ [255]
+
+ $ cd ..
diff --git a/tests/test-mq-subrepo.t b/tests/test-mq-subrepo.t
new file mode 100644
index 0000000..948006a
--- /dev/null
+++ b/tests/test-mq-subrepo.t
@@ -0,0 +1,514 @@
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "commitsubrepos = Yes" >> $HGRCPATH
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+ $ echo "record=" >> $HGRCPATH
+ $ echo "[diff]" >> $HGRCPATH
+ $ echo "nodates=1" >> $HGRCPATH
+
+ $ stdin=`pwd`/stdin.tmp
+
+fn to create new repository w/dirty subrepo, and cd into it
+ $ mkrepo() {
+ > hg init $1
+ > cd $1
+ > hg qinit
+ > }
+
+fn to create dirty subrepo
+ $ mksubrepo() {
+ > hg init $1
+ > cd $1
+ > echo a > a
+ > hg add
+ > cd ..
+ > }
+
+ $ testadd() {
+ > cat - > "$stdin"
+ > mksubrepo sub
+ > echo sub = sub >> .hgsub
+ > hg add .hgsub
+ > echo % abort when adding .hgsub w/dirty subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > echo [$?]
+ > hg -R sub ci -m0sub
+ > echo % update substate when adding .hgsub w/clean updated subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > hg debugsub
+ > }
+
+ $ testmod() {
+ > cat - > "$stdin"
+ > mksubrepo sub2
+ > echo sub2 = sub2 >> .hgsub
+ > echo % abort when modifying .hgsub w/dirty subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > echo [$?]
+ > hg -R sub2 ci -m0sub2
+ > echo % update substate when modifying .hgsub w/clean updated subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > hg debugsub
+ > }
+
+ $ testrm1() {
+ > cat - > "$stdin"
+ > mksubrepo sub3
+ > echo sub3 = sub3 >> .hgsub
+ > hg ci -Aqmsub3
+ > $EXTRA
+ > echo b >> sub3/a
+ > hg rm .hgsub
+ > echo % update substate when removing .hgsub w/dirty subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > echo % debugsub should be empty
+ > hg debugsub
+ > }
+
+ $ testrm2() {
+ > cat - > "$stdin"
+ > mksubrepo sub4
+ > echo sub4 = sub4 >> .hgsub
+ > hg ci -Aqmsub4
+ > $EXTRA
+ > hg rm .hgsub
+ > echo % update substate when removing .hgsub w/clean updated subrepo
+ > hg status -S
+ > echo '%' $*
+ > cat "$stdin" | hg $*
+ > echo % debugsub should be empty
+ > hg debugsub
+ > }
+
+
+handle subrepos safely on qnew
+
+ $ mkrepo repo-2499-qnew
+ $ testadd qnew -m0 0.diff
+ adding a
+ % abort when adding .hgsub w/dirty subrepo
+ A .hgsub
+ A sub/a
+ % qnew -m0 0.diff
+ abort: uncommitted changes in subrepository sub
+ [255]
+ % update substate when adding .hgsub w/clean updated subrepo
+ A .hgsub
+ % qnew -m0 0.diff
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+
+ $ testmod qnew -m1 1.diff
+ adding a
+ % abort when modifying .hgsub w/dirty subrepo
+ M .hgsub
+ A sub2/a
+ % qnew -m1 1.diff
+ abort: uncommitted changes in subrepository sub2
+ [255]
+ % update substate when modifying .hgsub w/clean updated subrepo
+ M .hgsub
+ % qnew -m1 1.diff
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+ path sub2
+ source sub2
+ revision 1f94c7611cc6b74f5a17b16121a1170d44776845
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ testrm1 qnew -m2 2.diff
+ adding a
+ % update substate when removing .hgsub w/dirty subrepo
+ M sub3/a
+ R .hgsub
+ % qnew -m2 2.diff
+ % debugsub should be empty
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ testrm2 qnew -m3 3.diff
+ adding a
+ % update substate when removing .hgsub w/clean updated subrepo
+ R .hgsub
+ % qnew -m3 3.diff
+ % debugsub should be empty
+
+ $ cd ..
+
+
+handle subrepos safely on qrefresh
+
+ $ mkrepo repo-2499-qrefresh
+ $ hg qnew -m0 0.diff
+ $ testadd qrefresh
+ adding a
+ % abort when adding .hgsub w/dirty subrepo
+ A .hgsub
+ A sub/a
+ % qrefresh
+ abort: uncommitted changes in subrepository sub
+ [255]
+ % update substate when adding .hgsub w/clean updated subrepo
+ A .hgsub
+ % qrefresh
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+
+ $ hg qnew -m1 1.diff
+ $ testmod qrefresh
+ adding a
+ % abort when modifying .hgsub w/dirty subrepo
+ M .hgsub
+ A sub2/a
+ % qrefresh
+ abort: uncommitted changes in subrepository sub2
+ [255]
+ % update substate when modifying .hgsub w/clean updated subrepo
+ M .hgsub
+ % qrefresh
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+ path sub2
+ source sub2
+ revision 1f94c7611cc6b74f5a17b16121a1170d44776845
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ EXTRA='hg qnew -m2 2.diff'
+ $ testrm1 qrefresh
+ adding a
+ % update substate when removing .hgsub w/dirty subrepo
+ M sub3/a
+ R .hgsub
+ % qrefresh
+ % debugsub should be empty
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ EXTRA='hg qnew -m3 3.diff'
+ $ testrm2 qrefresh
+ adding a
+ % update substate when removing .hgsub w/clean updated subrepo
+ R .hgsub
+ % qrefresh
+ % debugsub should be empty
+ $ EXTRA=
+
+ $ cd ..
+
+
+handle subrepos safely on qpush/qpop
+
+ $ mkrepo repo-2499-qpush
+ $ mksubrepo sub
+ adding a
+ $ hg -R sub ci -m0sub
+ $ echo sub = sub > .hgsub
+ $ hg add .hgsub
+ $ hg qnew -m0 0.diff
+ $ hg debugsub
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+
+qpop
+ $ hg qpop
+ popping 0.diff
+ patch queue now empty
+ $ hg status -AS
+ $ hg debugsub
+
+qpush
+ $ hg qpush
+ applying 0.diff
+ now at: 0.diff
+ $ hg status -AS
+ C .hgsub
+ C .hgsubstate
+ C sub/a
+ $ hg debugsub
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+
+ $ cd ..
+
+
+handle subrepos safely on qrecord
+
+ $ mkrepo repo-2499-qrecord
+ $ testadd qrecord --config ui.interactive=1 -m0 0.diff <<EOF
+ > y
+ > y
+ > EOF
+ adding a
+ % abort when adding .hgsub w/dirty subrepo
+ A .hgsub
+ A sub/a
+ % qrecord --config ui.interactive=1 -m0 0.diff
+ diff --git a/.hgsub b/.hgsub
+ new file mode 100644
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ abort: uncommitted changes in subrepository sub
+ [255]
+ % update substate when adding .hgsub w/clean updated subrepo
+ A .hgsub
+ % qrecord --config ui.interactive=1 -m0 0.diff
+ diff --git a/.hgsub b/.hgsub
+ new file mode 100644
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+
+ $ testmod qrecord --config ui.interactive=1 -m1 1.diff <<EOF
+ > y
+ > y
+ > EOF
+ adding a
+ % abort when modifying .hgsub w/dirty subrepo
+ M .hgsub
+ A sub2/a
+ % qrecord --config ui.interactive=1 -m1 1.diff
+ diff --git a/.hgsub b/.hgsub
+ 1 hunks, 1 lines changed
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ @@ -1,1 +1,2 @@
+ sub = sub
+ +sub2 = sub2
+ record this change to '.hgsub'? [Ynesfdaq?]
+ abort: uncommitted changes in subrepository sub2
+ [255]
+ % update substate when modifying .hgsub w/clean updated subrepo
+ M .hgsub
+ % qrecord --config ui.interactive=1 -m1 1.diff
+ diff --git a/.hgsub b/.hgsub
+ 1 hunks, 1 lines changed
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ @@ -1,1 +1,2 @@
+ sub = sub
+ +sub2 = sub2
+ record this change to '.hgsub'? [Ynesfdaq?]
+ path sub
+ source sub
+ revision b2fdb12cd82b021c3b7053d67802e77b6eeaee31
+ path sub2
+ source sub2
+ revision 1f94c7611cc6b74f5a17b16121a1170d44776845
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ testrm1 qrecord --config ui.interactive=1 -m2 2.diff <<EOF
+ > y
+ > y
+ > EOF
+ adding a
+ % update substate when removing .hgsub w/dirty subrepo
+ M sub3/a
+ R .hgsub
+ % qrecord --config ui.interactive=1 -m2 2.diff
+ diff --git a/.hgsub b/.hgsub
+ deleted file mode 100644
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ % debugsub should be empty
+
+ $ hg qpop -qa
+ patch queue now empty
+ $ testrm2 qrecord --config ui.interactive=1 -m3 3.diff <<EOF
+ > y
+ > y
+ > EOF
+ adding a
+ % update substate when removing .hgsub w/clean updated subrepo
+ R .hgsub
+ % qrecord --config ui.interactive=1 -m3 3.diff
+ diff --git a/.hgsub b/.hgsub
+ deleted file mode 100644
+ examine changes to '.hgsub'? [Ynesfdaq?]
+ % debugsub should be empty
+
+ $ cd ..
+
+
+correctly handle subrepos with patch queues
+ $ mkrepo repo-subrepo-with-queue
+ $ mksubrepo sub
+ adding a
+ $ hg -R sub qnew sub0.diff
+ $ echo sub = sub >> .hgsub
+ $ hg add .hgsub
+ $ hg qnew 0.diff
+
+ $ cd ..
+
+check whether MQ operations can import updated .hgsubstate correctly
+both into 'revision' and 'patch file under .hg/patches':
+
+ $ hg init importing-hgsubstate
+ $ cd importing-hgsubstate
+
+ $ echo a > a
+ $ hg commit -u test -d '0 0' -Am '#0 in parent'
+ adding a
+ $ hg init sub
+ $ echo sa > sub/sa
+ $ hg -R sub commit -u test -d '0 0' -Am '#0 in sub'
+ adding sa
+ $ echo 'sub = sub' > .hgsub
+ $ touch .hgsubstate
+ $ hg add .hgsub .hgsubstate
+
+ $ hg qnew -u test -d '0 0' import-at-qnew
+ $ hg -R sub parents --template '{node} sub\n'
+ b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ $ cat .hgsubstate
+ b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ $ hg diff -c tip
+ diff -r f499373e340c -r b20ffac88564 .hgsub
+ --- /dev/null
+ +++ b/.hgsub
+ @@ -0,0 +1,1 @@
+ +sub = sub
+ diff -r f499373e340c -r b20ffac88564 .hgsubstate
+ --- /dev/null
+ +++ b/.hgsubstate
+ @@ -0,0 +1,1 @@
+ +b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ $ cat .hg/patches/import-at-qnew
+ # HG changeset patch
+ # Parent f499373e340cdca5d01dee904aeb42dd2a325e71
+ # User test
+ # Date 0 0
+
+ diff -r f499373e340c -r b20ffac88564 .hgsub
+ --- /dev/null
+ +++ b/.hgsub
+ @@ -0,0 +1,1 @@
+ +sub = sub
+ diff -r f499373e340c -r b20ffac88564 .hgsubstate
+ --- /dev/null
+ +++ b/.hgsubstate
+ @@ -0,0 +1,1 @@
+ +b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ $ hg qpop
+ popping import-at-qnew
+ patch queue now empty
+ $ hg qpush
+ applying import-at-qnew
+ now at: import-at-qnew
+
+ $ hg qnew import-at-qrefresh
+ $ echo sb > sub/sb
+ $ hg -R sub commit -u test -d '0 0' -Am '#1 in sub'
+ adding sb
+ $ hg qrefresh -u test -d '0 0'
+ $ hg -R sub parents --template '{node} sub\n'
+ 88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ cat .hgsubstate
+ 88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ hg diff -c tip
+ diff -r 44f846335325 -r b3e8c5fa3aaa .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ cat .hg/patches/import-at-qrefresh
+ # HG changeset patch
+ # Date 0 0
+ # User test
+ # Parent 44f846335325209be6be35dc2c9a4be107278c09
+
+ diff -r 44f846335325 .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+
+ $ hg qrefresh -u test -d '0 0'
+ $ cat .hgsubstate
+ 88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ hg diff -c tip
+ diff -r 44f846335325 -r b3e8c5fa3aaa .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ cat .hg/patches/import-at-qrefresh
+ # HG changeset patch
+ # Date 0 0
+ # User test
+ # Parent 44f846335325209be6be35dc2c9a4be107278c09
+
+ diff -r 44f846335325 .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+
+ $ hg update -C tip
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg qpop -a
+ popping import-at-qrefresh
+ popping import-at-qnew
+ patch queue now empty
+
+ $ hg -R sub update -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo 'sub = sub' > .hgsub
+ $ hg commit -Am '#1 in parent'
+ adding .hgsub
+ $ hg -R sub update -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg commit -Am '#2 in parent (but be rollbacked soon)'
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo commit)
+ working directory now based on revision 1
+ $ hg status
+ M .hgsubstate
+ $ hg qnew -u test -d '0 0' checkstate-at-qnew
+ $ hg -R sub parents --template '{node} sub\n'
+ 88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ cat .hgsubstate
+ 88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ hg diff -c tip
+ diff -r 4d91eb2fa1d1 -r 1259c112d884 .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+ $ cat .hg/patches/checkstate-at-qnew
+ # HG changeset patch
+ # Parent 4d91eb2fa1d1b22ec513347b9cd06f6b49d470fa
+ # User test
+ # Date 0 0
+
+ diff -r 4d91eb2fa1d1 -r 1259c112d884 .hgsubstate
+ --- a/.hgsubstate
+ +++ b/.hgsubstate
+ @@ -1,1 +1,1 @@
+ -b6f6e9c41f3dfd374a6d2ed4535c87951cf979cf sub
+ +88ac1bef5ed43b689d1d200b59886b675dec474b sub
+
+ $ cd ..
+
+ $ cd ..
diff --git a/tests/test-mq-symlinks.t b/tests/test-mq-symlinks.t
new file mode 100644
index 0000000..ffbc790
--- /dev/null
+++ b/tests/test-mq-symlinks.t
@@ -0,0 +1,108 @@
+ $ "$TESTDIR/hghave" symlink || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ hg init
+ $ hg qinit
+ $ hg qnew base.patch
+ $ echo aaa > a
+ $ echo bbb > b
+ $ echo ccc > c
+ $ hg add a b c
+ $ hg qrefresh
+ $ "$TESTDIR/readlink.py" a
+ a -> a not a symlink
+
+
+test replacing a file with a symlink
+
+ $ hg qnew symlink.patch
+ $ rm a
+ $ ln -s b a
+ $ hg qrefresh --git
+ $ "$TESTDIR/readlink.py" a
+ a -> b
+
+ $ hg qpop
+ popping symlink.patch
+ now at: base.patch
+ $ hg qpush
+ applying symlink.patch
+ now at: symlink.patch
+ $ "$TESTDIR/readlink.py" a
+ a -> b
+
+
+test updating a symlink
+
+ $ rm a
+ $ ln -s c a
+ $ hg qnew --git -f updatelink
+ $ "$TESTDIR/readlink.py" a
+ a -> c
+ $ hg qpop
+ popping updatelink
+ now at: symlink.patch
+ $ hg qpush --debug
+ applying updatelink
+ patching file a
+ a
+ now at: updatelink
+ $ "$TESTDIR/readlink.py" a
+ a -> c
+ $ hg st
+
+
+test replacing a symlink with a file
+
+ $ ln -s c s
+ $ hg add s
+ $ hg qnew --git -f addlink
+ $ rm s
+ $ echo sss > s
+ $ hg qnew --git -f replacelinkwithfile
+ $ hg qpop
+ popping replacelinkwithfile
+ now at: addlink
+ $ hg qpush
+ applying replacelinkwithfile
+ now at: replacelinkwithfile
+ $ cat s
+ sss
+ $ hg st
+
+
+test symlink removal
+
+ $ hg qnew removesl.patch
+ $ hg rm a
+ $ hg qrefresh --git
+ $ hg qpop
+ popping removesl.patch
+ now at: replacelinkwithfile
+ $ hg qpush
+ applying removesl.patch
+ now at: removesl.patch
+ $ hg st -c
+ C b
+ C c
+ C s
+
+replace broken symlink with another broken symlink
+
+ $ ln -s linka linka
+ $ hg add linka
+ $ hg qnew link
+ $ hg mv linka linkb
+ $ rm linkb
+ $ ln -s linkb linkb
+ $ hg qnew movelink
+ $ hg qpop
+ popping movelink
+ now at: link
+ $ hg qpush
+ applying movelink
+ now at: movelink
+ $ "$TESTDIR/readlink.py" linkb
+ linkb -> linkb
diff --git a/tests/test-mq.t b/tests/test-mq.t
new file mode 100644
index 0000000..7e31845
--- /dev/null
+++ b/tests/test-mq.t
@@ -0,0 +1,1552 @@
+ $ checkundo()
+ > {
+ > if [ -f .hg/store/undo ]; then
+ > echo ".hg/store/undo still exists after $1"
+ > fi
+ > }
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=" >> $HGRCPATH
+
+ $ echo "[mq]" >> $HGRCPATH
+ $ echo "plain=true" >> $HGRCPATH
+
+
+help
+
+ $ hg help mq
+ mq extension - manage a stack of patches
+
+ This extension lets you work with a stack of patches in a Mercurial
+ repository. It manages two stacks of patches - all known patches, and applied
+ patches (subset of known patches).
+
+ Known patches are represented as patch files in the .hg/patches directory.
+ Applied patches are both patch files and changesets.
+
+ Common tasks (use "hg help command" for more details):
+
+ create new patch qnew
+ import existing patch qimport
+
+ print patch series qseries
+ print applied patches qapplied
+
+ add known patch to applied stack qpush
+ remove patch from applied stack qpop
+ refresh contents of top applied patch qrefresh
+
+ By default, mq will automatically use git patches when required to avoid
+ losing file mode changes, copy records, binary files or empty files creations
+ or deletions. This behaviour can be configured with:
+
+ [mq]
+ git = auto/keep/yes/no
+
+ If set to 'keep', mq will obey the [diff] section configuration while
+ preserving existing git patches upon qrefresh. If set to 'yes' or 'no', mq
+ will override the [diff] section and always generate git or regular patches,
+ possibly losing data in the second case.
+
+ It may be desirable for mq changesets to be kept in the secret phase (see "hg
+ help phases"), which can be enabled with the following setting:
+
+ [mq]
+ secret = True
+
+ You will by default be managing a patch queue named "patches". You can create
+ other, independent patch queues with the "hg qqueue" command.
+
+ If the working directory contains uncommitted files, qpush, qpop and qgoto
+ abort immediately. If -f/--force is used, the changes are discarded. Setting:
+
+ [mq]
+ keepchanges = True
+
+ make them behave as if --keep-changes were passed, and non-conflicting local
+ changes will be tolerated and preserved. If incompatible options such as
+ -f/--force or --exact are passed, this setting is ignored.
+
+ list of commands:
+
+ qapplied print the patches already applied
+ qclone clone main and patch repository at same time
+ qdelete remove patches from queue
+ qdiff diff of the current patch and subsequent modifications
+ qfinish move applied patches into repository history
+ qfold fold the named patches into the current patch
+ qgoto push or pop patches until named patch is at top of stack
+ qguard set or print guards for a patch
+ qheader print the header of the topmost or specified patch
+ qimport import a patch or existing changeset
+ qnew create a new patch
+ qnext print the name of the next pushable patch
+ qpop pop the current patch off the stack
+ qprev print the name of the preceding applied patch
+ qpush push the next patch onto the stack
+ qqueue manage multiple patch queues
+ qrefresh update the current patch
+ qrename rename a patch
+ qselect set or print guarded patches to push
+ qseries print the entire series file
+ qtop print the name of the current patch
+ qunapplied print the patches not yet applied
+ strip strip changesets and all their descendants from the repository
+
+ use "hg -v help mq" to show builtin aliases and global options
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg clone . ../k
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ mkdir b
+ $ echo z > b/z
+ $ hg ci -Ama
+ adding b/z
+
+
+qinit
+
+ $ hg qinit
+
+ $ cd ..
+ $ hg init b
+
+
+-R qinit
+
+ $ hg -R b qinit
+
+ $ hg init c
+
+
+qinit -c
+
+ $ hg --cwd c qinit -c
+ $ hg -R c/.hg/patches st
+ A .hgignore
+ A series
+
+
+qinit; qinit -c
+
+ $ hg init d
+ $ cd d
+ $ hg qinit
+ $ hg qinit -c
+
+qinit -c should create both files if they don't exist
+
+ $ cat .hg/patches/.hgignore
+ ^\.hg
+ ^\.mq
+ syntax: glob
+ status
+ guards
+ $ cat .hg/patches/series
+ $ hg qinit -c
+ abort: repository $TESTTMP/d/.hg/patches already exists! (glob)
+ [255]
+ $ cd ..
+
+ $ echo '% qinit; <stuff>; qinit -c'
+ % qinit; <stuff>; qinit -c
+ $ hg init e
+ $ cd e
+ $ hg qnew A
+ $ checkundo qnew
+ $ echo foo > foo
+ $ hg phase -r qbase
+ 0: draft
+ $ hg add foo
+ $ hg qrefresh
+ $ hg phase -r qbase
+ 0: draft
+ $ hg qnew B
+ $ echo >> foo
+ $ hg qrefresh
+ $ echo status >> .hg/patches/.hgignore
+ $ echo bleh >> .hg/patches/.hgignore
+ $ hg qinit -c
+ adding .hg/patches/A (glob)
+ adding .hg/patches/B (glob)
+ $ hg -R .hg/patches status
+ A .hgignore
+ A A
+ A B
+ A series
+
+qinit -c shouldn't touch these files if they already exist
+
+ $ cat .hg/patches/.hgignore
+ status
+ bleh
+ $ cat .hg/patches/series
+ A
+ B
+
+add an untracked file
+
+ $ echo >> .hg/patches/flaf
+
+status --mq with color (issue2096)
+
+ $ hg status --mq --config extensions.color= --config color.mode=ansi --color=always
+ \x1b[0;32;1mA .hgignore\x1b[0m (esc)
+ \x1b[0;32;1mA A\x1b[0m (esc)
+ \x1b[0;32;1mA B\x1b[0m (esc)
+ \x1b[0;32;1mA series\x1b[0m (esc)
+ \x1b[0;35;1;4m? flaf\x1b[0m (esc)
+
+try the --mq option on a command provided by an extension
+
+ $ hg purge --mq --verbose --config extensions.purge=
+ removing file flaf
+
+ $ cd ..
+
+#if no-outer-repo
+
+init --mq without repo
+
+ $ mkdir f
+ $ cd f
+ $ hg init --mq
+ abort: there is no Mercurial repository here (.hg not found)
+ [255]
+ $ cd ..
+
+#endif
+
+init --mq with repo path
+
+ $ hg init g
+ $ hg init --mq g
+ $ test -d g/.hg/patches/.hg
+
+init --mq with nonexistent directory
+
+ $ hg init --mq nonexistentdir
+ abort: repository nonexistentdir not found!
+ [255]
+
+
+init --mq with bundle (non "local")
+
+ $ hg -R a bundle --all a.bundle >/dev/null
+ $ hg init --mq a.bundle
+ abort: only a local queue repository may be initialized
+ [255]
+
+ $ cd a
+
+ $ hg qnew -m 'foo bar' test.patch
+
+ $ echo '# comment' > .hg/patches/series.tmp
+ $ echo >> .hg/patches/series.tmp # empty line
+ $ cat .hg/patches/series >> .hg/patches/series.tmp
+ $ mv .hg/patches/series.tmp .hg/patches/series
+
+
+qrefresh
+
+ $ echo a >> a
+ $ hg qrefresh
+ $ cat .hg/patches/test.patch
+ foo bar
+
+ diff -r [a-f0-9]* a (re)
+ --- a/a\t(?P<date>.*) (re)
+ \+\+\+ b/a\t(?P<date2>.*) (re)
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+empty qrefresh
+
+ $ hg qrefresh -X a
+
+revision:
+
+ $ hg diff -r -2 -r -1
+
+patch:
+
+ $ cat .hg/patches/test.patch
+ foo bar
+
+
+working dir diff:
+
+ $ hg diff --nodates -q
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+restore things
+
+ $ hg qrefresh
+ $ checkundo qrefresh
+
+
+qpop
+
+ $ hg qpop
+ popping test.patch
+ patch queue now empty
+ $ checkundo qpop
+
+
+qpush with dump of tag cache
+Dump the tag cache to ensure that it has exactly one head after qpush.
+
+ $ rm -f .hg/cache/tags
+ $ hg tags > /dev/null
+
+.hg/cache/tags (pre qpush):
+
+ $ cat .hg/cache/tags
+ 1 [\da-f]{40} (re)
+
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+ $ hg phase -r qbase
+ 2: draft
+ $ hg tags > /dev/null
+
+.hg/cache/tags (post qpush):
+
+ $ cat .hg/cache/tags
+ 2 [\da-f]{40} (re)
+
+ $ checkundo qpush
+ $ cd ..
+
+
+pop/push outside repo
+ $ hg -R a qpop
+ popping test.patch
+ patch queue now empty
+ $ hg -R a qpush
+ applying test.patch
+ now at: test.patch
+
+ $ cd a
+ $ hg qnew test2.patch
+
+qrefresh in subdir
+
+ $ cd b
+ $ echo a > a
+ $ hg add a
+ $ hg qrefresh
+
+pop/push -a in subdir
+
+ $ hg qpop -a
+ popping test2.patch
+ popping test.patch
+ patch queue now empty
+ $ hg --traceback qpush -a
+ applying test.patch
+ applying test2.patch
+ now at: test2.patch
+
+
+setting columns & formatted tests truncating (issue1912)
+
+ $ COLUMNS=4 hg qseries --config ui.formatted=true
+ test.patch
+ test2.patch
+ $ COLUMNS=20 hg qseries --config ui.formatted=true -vs
+ 0 A test.patch: f...
+ 1 A test2.patch:
+ $ hg qpop
+ popping test2.patch
+ now at: test.patch
+ $ hg qseries -vs
+ 0 A test.patch: foo bar
+ 1 U test2.patch:
+ $ hg sum | grep mq
+ mq: 1 applied, 1 unapplied
+ $ hg qpush
+ applying test2.patch
+ now at: test2.patch
+ $ hg sum | grep mq
+ mq: 2 applied
+ $ hg qapplied
+ test.patch
+ test2.patch
+ $ hg qtop
+ test2.patch
+
+
+prev
+
+ $ hg qapp -1
+ test.patch
+
+next
+
+ $ hg qunapp -1
+ all patches applied
+ [1]
+
+ $ hg qpop
+ popping test2.patch
+ now at: test.patch
+
+commit should fail
+
+ $ hg commit
+ abort: cannot commit over an applied mq patch
+ [255]
+
+push should fail if draft
+
+ $ hg push ../../k
+ pushing to ../../k
+ abort: source has mq patches applied
+ [255]
+
+
+import should fail
+
+ $ hg st .
+ $ echo foo >> ../a
+ $ hg diff > ../../import.diff
+ $ hg revert --no-backup ../a
+ $ hg import ../../import.diff
+ abort: cannot import over an applied patch
+ [255]
+ $ hg st
+
+import --no-commit should succeed
+
+ $ hg import --no-commit ../../import.diff
+ applying ../../import.diff
+ $ hg st
+ M a
+ $ hg revert --no-backup ../a
+
+
+qunapplied
+
+ $ hg qunapplied
+ test2.patch
+
+
+qpush/qpop with index
+
+ $ hg qnew test1b.patch
+ $ echo 1b > 1b
+ $ hg add 1b
+ $ hg qrefresh
+ $ hg qpush 2
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpop 0
+ popping test2.patch
+ popping test1b.patch
+ now at: test.patch
+ $ hg qpush test.patch+1
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush test.patch+2
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpop test2.patch-1
+ popping test2.patch
+ now at: test1b.patch
+ $ hg qpop test2.patch-2
+ popping test1b.patch
+ now at: test.patch
+ $ hg qpush test1b.patch+1
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+
+
+qpush --move
+
+ $ hg qpop -a
+ popping test2.patch
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+ $ hg qguard test1b.patch -- -negguard
+ $ hg qguard test2.patch -- +posguard
+ $ hg qpush --move test2.patch # can't move guarded patch
+ cannot push 'test2.patch' - guarded by '+posguard'
+ [1]
+ $ hg qselect posguard
+ number of unguarded, unapplied patches has changed from 2 to 3
+ $ hg qpush --move test2.patch # move to front
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpush --move test1b.patch # negative guard unselected
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush --move test.patch # noop move
+ applying test.patch
+ now at: test.patch
+ $ hg qseries -v
+ 0 A test2.patch
+ 1 A test1b.patch
+ 2 A test.patch
+ $ hg qpop -a
+ popping test.patch
+ popping test1b.patch
+ popping test2.patch
+ patch queue now empty
+
+cleaning up
+
+ $ hg qselect --none
+ guards deactivated
+ number of unguarded, unapplied patches has changed from 3 to 2
+ $ hg qguard --none test1b.patch
+ $ hg qguard --none test2.patch
+ $ hg qpush --move test.patch
+ applying test.patch
+ now at: test.patch
+ $ hg qpush --move test1b.patch
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush --move bogus # nonexistent patch
+ abort: patch bogus not in series
+ [255]
+ $ hg qpush --move # no patch
+ abort: please specify the patch to move
+ [255]
+ $ hg qpush --move test.patch # already applied
+ abort: cannot push to a previous patch: test.patch
+ [255]
+ $ sed '2i\
+ > # make qtip index different in series and fullseries
+ > ' `hg root`/.hg/patches/series > $TESTTMP/sedtmp
+ $ cp $TESTTMP/sedtmp `hg root`/.hg/patches/series
+ $ cat `hg root`/.hg/patches/series
+ # comment
+ # make qtip index different in series and fullseries
+
+ test.patch
+ test1b.patch
+ test2.patch
+ $ hg qpush --move test2.patch
+ applying test2.patch
+ now at: test2.patch
+
+
+series after move
+
+ $ cat `hg root`/.hg/patches/series
+ # comment
+ # make qtip index different in series and fullseries
+
+ test.patch
+ test1b.patch
+ test2.patch
+
+
+pop, qapplied, qunapplied
+
+ $ hg qseries -v
+ 0 A test.patch
+ 1 A test1b.patch
+ 2 A test2.patch
+
+qapplied -1 test.patch
+
+ $ hg qapplied -1 test.patch
+ only one patch applied
+ [1]
+
+qapplied -1 test1b.patch
+
+ $ hg qapplied -1 test1b.patch
+ test.patch
+
+qapplied -1 test2.patch
+
+ $ hg qapplied -1 test2.patch
+ test1b.patch
+
+qapplied -1
+
+ $ hg qapplied -1
+ test1b.patch
+
+qapplied
+
+ $ hg qapplied
+ test.patch
+ test1b.patch
+ test2.patch
+
+qapplied test1b.patch
+
+ $ hg qapplied test1b.patch
+ test.patch
+ test1b.patch
+
+qunapplied -1
+
+ $ hg qunapplied -1
+ all patches applied
+ [1]
+
+qunapplied
+
+ $ hg qunapplied
+
+popping
+
+ $ hg qpop
+ popping test2.patch
+ now at: test1b.patch
+
+qunapplied -1
+
+ $ hg qunapplied -1
+ test2.patch
+
+qunapplied
+
+ $ hg qunapplied
+ test2.patch
+
+qunapplied test2.patch
+
+ $ hg qunapplied test2.patch
+
+qunapplied -1 test2.patch
+
+ $ hg qunapplied -1 test2.patch
+ all patches applied
+ [1]
+
+popping -a
+
+ $ hg qpop -a
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+
+qapplied
+
+ $ hg qapplied
+
+qapplied -1
+
+ $ hg qapplied -1
+ no patches applied
+ [1]
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+
+
+push should succeed
+
+ $ hg qpop -a
+ popping test.patch
+ patch queue now empty
+ $ hg push ../../k
+ pushing to ../../k
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+
+we want to start with some patches applied
+
+ $ hg qpush -a
+ applying test.patch
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+
+% pops all patches and succeeds
+
+ $ hg qpop -a
+ popping test2.patch
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+
+% does nothing and succeeds
+
+ $ hg qpop -a
+ no patches applied
+
+% fails - nothing else to pop
+
+ $ hg qpop
+ no patches applied
+ [1]
+
+% pushes a patch and succeeds
+
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+
+% pops a patch and succeeds
+
+ $ hg qpop
+ popping test.patch
+ patch queue now empty
+
+% pushes up to test1b.patch and succeeds
+
+ $ hg qpush test1b.patch
+ applying test.patch
+ applying test1b.patch
+ now at: test1b.patch
+
+% does nothing and succeeds
+
+ $ hg qpush test1b.patch
+ qpush: test1b.patch is already at the top
+
+% does nothing and succeeds
+
+ $ hg qpop test1b.patch
+ qpop: test1b.patch is already at the top
+
+% fails - can't push to this patch
+
+ $ hg qpush test.patch
+ abort: cannot push to a previous patch: test.patch
+ [255]
+
+% fails - can't pop to this patch
+
+ $ hg qpop test2.patch
+ abort: patch test2.patch is not applied
+ [255]
+
+% pops up to test.patch and succeeds
+
+ $ hg qpop test.patch
+ popping test1b.patch
+ now at: test.patch
+
+% pushes all patches and succeeds
+
+ $ hg qpush -a
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+
+% does nothing and succeeds
+
+ $ hg qpush -a
+ all patches are currently applied
+
+% fails - nothing else to push
+
+ $ hg qpush
+ patch series already fully applied
+ [1]
+
+% does nothing and succeeds
+
+ $ hg qpush test2.patch
+ qpush: test2.patch is already at the top
+
+strip
+
+ $ cd ../../b
+ $ echo x>x
+ $ hg ci -Ama
+ adding x
+ $ hg strip tip
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+ $ hg unbundle .hg/strip-backup/*
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+
+strip with local changes, should complain
+
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo y>y
+ $ hg add y
+ $ hg strip tip
+ abort: local changes found
+ [255]
+
+--force strip with local changes
+
+ $ hg strip -f tip
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+ $ cd ..
+
+
+cd b; hg qrefresh
+
+ $ hg init refresh
+ $ cd refresh
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ hg qnew -mfoo foo
+ $ echo a >> a
+ $ hg qrefresh
+ $ mkdir b
+ $ cd b
+ $ echo f > f
+ $ hg add f
+ $ hg qrefresh
+ $ cat ../.hg/patches/foo
+ foo
+
+ diff -r cb9a9f314b8b a
+ --- a/a\t(?P<date>.*) (re)
+ \+\+\+ b/a\t(?P<date>.*) (re)
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ diff -r cb9a9f314b8b b/f
+ --- /dev/null\t(?P<date>.*) (re)
+ \+\+\+ b/b/f\t(?P<date>.*) (re)
+ @@ -0,0 +1,1 @@
+ +f
+
+hg qrefresh .
+
+ $ hg qrefresh .
+ $ cat ../.hg/patches/foo
+ foo
+
+ diff -r cb9a9f314b8b b/f
+ --- /dev/null\t(?P<date>.*) (re)
+ \+\+\+ b/b/f\t(?P<date>.*) (re)
+ @@ -0,0 +1,1 @@
+ +f
+ $ hg status
+ M a
+
+
+qpush failure
+
+ $ cd ..
+ $ hg qrefresh
+ $ hg qnew -mbar bar
+ $ echo foo > foo
+ $ echo bar > bar
+ $ hg add foo bar
+ $ hg qrefresh
+ $ hg qpop -a
+ popping bar
+ popping foo
+ patch queue now empty
+ $ echo bar > foo
+ $ hg qpush -a
+ applying foo
+ applying bar
+ file foo already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file foo.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh bar
+ [2]
+ $ hg st
+ ? foo
+ ? foo.rej
+
+
+mq tags
+
+ $ hg log --template '{rev} {tags}\n' -r qparent:qtip
+ 0 qparent
+ 1 foo qbase
+ 2 bar qtip tip
+
+mq revset
+
+ $ hg log -r 'mq()' --template '{rev}\n'
+ 1
+ 2
+ $ hg help revsets | grep -i mq
+ "mq()"
+ Changesets managed by MQ.
+
+bad node in status
+
+ $ hg qpop
+ popping bar
+ now at: foo
+ $ hg strip -qn tip
+ $ hg tip
+ changeset: 0:cb9a9f314b8b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg branches
+ default 0:cb9a9f314b8b
+ $ hg qpop
+ no patches applied
+ [1]
+
+ $ cd ..
+
+
+git patches
+
+ $ cat >>$HGRCPATH <<EOF
+ > [diff]
+ > git = True
+ > EOF
+ $ hg init git
+ $ cd git
+ $ hg qinit
+
+ $ hg qnew -m'new file' new
+ $ echo foo > new
+#if execbit
+ $ chmod +x new
+#endif
+ $ hg add new
+ $ hg qrefresh
+#if execbit
+ $ cat .hg/patches/new
+ new file
+
+ diff --git a/new b/new
+ new file mode 100755
+ --- /dev/null
+ +++ b/new
+ @@ -0,0 +1,1 @@
+ +foo
+#else
+ $ cat .hg/patches/new
+ new file
+
+ diff --git a/new b/new
+ new file mode 100644
+ --- /dev/null
+ +++ b/new
+ @@ -0,0 +1,1 @@
+ +foo
+#endif
+
+ $ hg qnew -m'copy file' copy
+ $ hg cp new copy
+ $ hg qrefresh
+ $ cat .hg/patches/copy
+ copy file
+
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+
+ $ hg qpop
+ popping copy
+ now at: new
+ $ hg qpush
+ applying copy
+ now at: copy
+ $ hg qdiff
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+ $ cat >>$HGRCPATH <<EOF
+ > [diff]
+ > git = False
+ > EOF
+ $ hg qdiff --git
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+ $ cd ..
+
+empty lines in status
+
+ $ hg init emptystatus
+ $ cd emptystatus
+ $ hg qinit
+ $ printf '\n\n' > .hg/patches/status
+ $ hg qser
+ $ cd ..
+
+bad line in status (without ":")
+
+ $ hg init badstatus
+ $ cd badstatus
+ $ hg qinit
+ $ printf 'babar has no colon in this line\n' > .hg/patches/status
+ $ hg qser
+ malformated mq status line: ['babar has no colon in this line']
+ $ cd ..
+
+
+test file addition in slow path
+
+ $ hg init slow
+ $ cd slow
+ $ hg qinit
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+ $ hg qnew bar
+ $ echo bar > bar
+ $ hg add bar
+ $ hg mv foo baz
+ $ hg qrefresh --git
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+ created new head
+ $ hg up -C 1
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/bar b/bar
+ new file mode 100644
+ --- /dev/null
+ +++ b/bar
+ @@ -0,0 +1,1 @@
+ +bar
+ diff --git a/foo b/baz
+ rename from foo
+ rename to baz
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 2 baz (foo)
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/bar b/bar
+ new file mode 100644
+ --- /dev/null
+ +++ b/bar
+ @@ -0,0 +1,1 @@
+ +bar
+ diff --git a/foo b/baz
+ rename from foo
+ rename to baz
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 2 baz (foo)
+ $ hg qrefresh
+ $ grep 'diff --git' .hg/patches/bar
+ diff --git a/bar b/bar
+ diff --git a/foo b/baz
+
+
+test file move chains in the slow path
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo again'
+ $ hg up -C 2
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg mv bar quux
+ $ hg mv baz bleh
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/foo b/bleh
+ rename from foo
+ rename to bleh
+ diff --git a/quux b/quux
+ new file mode 100644
+ --- /dev/null
+ +++ b/quux
+ @@ -0,0 +1,1 @@
+ +bar
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 3 bleh (foo)
+ $ hg mv quux fred
+ $ hg mv bleh barney
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/foo b/barney
+ rename from foo
+ rename to barney
+ diff --git a/fred b/fred
+ new file mode 100644
+ --- /dev/null
+ +++ b/fred
+ @@ -0,0 +1,1 @@
+ +bar
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 3 barney (foo)
+
+
+refresh omitting an added file
+
+ $ hg qnew baz
+ $ echo newfile > newfile
+ $ hg add newfile
+ $ hg qrefresh
+ $ hg st -A newfile
+ C newfile
+ $ hg qrefresh -X newfile
+ $ hg st -A newfile
+ A newfile
+ $ hg revert newfile
+ $ rm newfile
+ $ hg qpop
+ popping baz
+ now at: bar
+ $ hg qdel baz
+
+
+create a git patch
+
+ $ echo a > alexander
+ $ hg add alexander
+ $ hg qnew -f --git addalexander
+ $ grep diff .hg/patches/addalexander
+ diff --git a/alexander b/alexander
+
+
+create a git binary patch
+
+ $ cat > writebin.py <<EOF
+ > import sys
+ > path = sys.argv[1]
+ > open(path, 'wb').write('BIN\x00ARY')
+ > EOF
+ $ python writebin.py bucephalus
+
+ $ python "$TESTDIR/md5sum.py" bucephalus
+ 8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
+ $ hg add bucephalus
+ $ hg qnew -f --git addbucephalus
+ $ grep diff .hg/patches/addbucephalus
+ diff --git a/bucephalus b/bucephalus
+
+
+check binary patches can be popped and pushed
+
+ $ hg qpop
+ popping addbucephalus
+ now at: addalexander
+ $ test -f bucephalus && echo % bucephalus should not be there
+ [1]
+ $ hg qpush
+ applying addbucephalus
+ now at: addbucephalus
+ $ test -f bucephalus
+ $ python "$TESTDIR/md5sum.py" bucephalus
+ 8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
+
+
+
+strip again
+
+ $ cd ..
+ $ hg init strip
+ $ cd strip
+ $ touch foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+ $ echo >> foo
+ $ hg ci -m 'change foo 1'
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 1 >> foo
+ $ hg ci -m 'change foo 2'
+ created new head
+ $ HGMERGE=true hg merge
+ merging foo
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ hg log
+ changeset: 3:99615015637b
+ tag: tip
+ parent: 2:20cbbe65cff7
+ parent: 1:d2871fc282d4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge
+
+ changeset: 2:20cbbe65cff7
+ parent: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 2
+
+ changeset: 1:d2871fc282d4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 1
+
+ changeset: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ hg strip 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/strip/.hg/strip-backup/*-backup.hg (glob)
+ $ checkundo strip
+ $ hg log
+ changeset: 1:20cbbe65cff7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 2
+
+ changeset: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ cd ..
+
+
+qclone
+
+ $ qlog()
+ > {
+ > echo 'main repo:'
+ > hg log --template ' rev {rev}: {desc}\n'
+ > echo 'patch repo:'
+ > hg -R .hg/patches log --template ' rev {rev}: {desc}\n'
+ > }
+ $ hg init qclonesource
+ $ cd qclonesource
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo'
+ $ hg qinit
+ $ hg qnew patch1
+ $ echo bar >> foo
+ $ hg qrefresh -m 'change foo'
+ $ cd ..
+
+
+repo with unversioned patch dir
+
+ $ hg qclone qclonesource failure
+ abort: versioned patch repository not found (see init --mq)
+ [255]
+
+ $ cd qclonesource
+ $ hg qinit -c
+ adding .hg/patches/patch1 (glob)
+ $ hg qci -m checkpoint
+ $ qlog
+ main repo:
+ rev 1: change foo
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+repo with patches applied
+
+ $ hg qclone qclonesource qclonedest
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd qclonedest
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+repo with patches unapplied
+
+ $ cd qclonesource
+ $ hg qpop -a
+ popping patch1
+ patch queue now empty
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+ $ hg qclone qclonesource qclonedest2
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd qclonedest2
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+Issue1033: test applying on an empty file
+
+ $ hg init empty
+ $ cd empty
+ $ touch a
+ $ hg ci -Am addempty
+ adding a
+ $ echo a > a
+ $ hg qnew -f -e changea
+ $ hg qpop
+ popping changea
+ patch queue now empty
+ $ hg qpush
+ applying changea
+ now at: changea
+ $ cd ..
+
+test qpush with --force, issue1087
+
+ $ hg init forcepush
+ $ cd forcepush
+ $ echo hello > hello.txt
+ $ echo bye > bye.txt
+ $ hg ci -Ama
+ adding bye.txt
+ adding hello.txt
+ $ hg qnew -d '0 0' empty
+ $ hg qpop
+ popping empty
+ patch queue now empty
+ $ echo world >> hello.txt
+
+
+qpush should fail, local changes
+
+ $ hg qpush
+ abort: local changes found
+ [255]
+
+
+apply force, should not discard changes with empty patch
+
+ $ hg qpush -f
+ applying empty
+ patch empty is empty
+ now at: empty
+ $ hg diff --config diff.nodates=True
+ diff -r d58265112590 hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,2 @@
+ hello
+ +world
+ $ hg qdiff --config diff.nodates=True
+ diff -r 9ecee4f634e3 hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,2 @@
+ hello
+ +world
+ $ hg log -l1 -p
+ changeset: 1:d58265112590
+ tag: empty
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: imported patch empty
+
+
+ $ hg qref -d '0 0'
+ $ hg qpop
+ popping empty
+ patch queue now empty
+ $ echo universe >> hello.txt
+ $ echo universe >> bye.txt
+
+
+qpush should fail, local changes
+
+ $ hg qpush
+ abort: local changes found
+ [255]
+
+
+apply force, should discard changes in hello, but not bye
+
+ $ hg qpush -f --verbose
+ applying empty
+ saving current version of hello.txt as hello.txt.orig
+ patching file hello.txt
+ hello.txt
+ now at: empty
+ $ hg st
+ M bye.txt
+ ? hello.txt.orig
+ $ hg diff --config diff.nodates=True
+ diff -r ba252371dbc1 bye.txt
+ --- a/bye.txt
+ +++ b/bye.txt
+ @@ -1,1 +1,2 @@
+ bye
+ +universe
+ $ hg qdiff --config diff.nodates=True
+ diff -r 9ecee4f634e3 bye.txt
+ --- a/bye.txt
+ +++ b/bye.txt
+ @@ -1,1 +1,2 @@
+ bye
+ +universe
+ diff -r 9ecee4f634e3 hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,3 @@
+ hello
+ +world
+ +universe
+
+
+test popping revisions not in working dir ancestry
+
+ $ hg qseries -v
+ 0 A empty
+ $ hg up qparent
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg qpop
+ popping empty
+ patch queue now empty
+
+ $ cd ..
+ $ hg init deletion-order
+ $ cd deletion-order
+
+ $ touch a
+ $ hg ci -Aqm0
+
+ $ hg qnew rename-dir
+ $ hg rm a
+ $ hg qrefresh
+
+ $ mkdir a b
+ $ touch a/a b/b
+ $ hg add -q a b
+ $ hg qrefresh
+
+
+test popping must remove files added in subdirectories first
+
+ $ hg qpop
+ popping rename-dir
+ patch queue now empty
+ $ cd ..
+
+
+test case preservation through patch pushing especially on case
+insensitive filesystem
+
+ $ hg init casepreserve
+ $ cd casepreserve
+
+ $ hg qnew add-file1
+ $ echo a > TeXtFiLe.TxT
+ $ hg add TeXtFiLe.TxT
+ $ hg qrefresh
+
+ $ hg qnew add-file2
+ $ echo b > AnOtHeRFiLe.TxT
+ $ hg add AnOtHeRFiLe.TxT
+ $ hg qrefresh
+
+ $ hg qnew modify-file
+ $ echo c >> AnOtHeRFiLe.TxT
+ $ hg qrefresh
+
+ $ hg qapplied
+ add-file1
+ add-file2
+ modify-file
+ $ hg qpop -a
+ popping modify-file
+ popping add-file2
+ popping add-file1
+ patch queue now empty
+
+this qpush causes problems below, if case preservation on case
+insensitive filesystem is not enough:
+(1) unexpected "adding ..." messages are shown
+(2) patching fails in modification of (1) files
+
+ $ hg qpush -a
+ applying add-file1
+ applying add-file2
+ applying modify-file
+ now at: modify-file
+
+Proper phase default with mq:
+
+1. mq.secret=false
+
+ $ rm .hg/store/phaseroots
+ $ hg phase 'qparent::'
+ 0: draft
+ 1: draft
+ 2: draft
+ $ echo '[mq]' >> $HGRCPATH
+ $ echo 'secret=true' >> $HGRCPATH
+ $ rm -f .hg/store/phaseroots
+ $ hg phase 'qparent::'
+ 0: secret
+ 1: secret
+ 2: secret
+
+Test that qfinish change phase when mq.secret=true
+
+ $ hg qfinish qbase
+ patch add-file1 finalized without changeset message
+ $ hg phase 'all()'
+ 0: draft
+ 1: secret
+ 2: secret
+
+Test that qfinish respect phases.new-commit setting
+
+ $ echo '[phases]' >> $HGRCPATH
+ $ echo 'new-commit=secret' >> $HGRCPATH
+ $ hg qfinish qbase
+ patch add-file2 finalized without changeset message
+ $ hg phase 'all()'
+ 0: draft
+ 1: secret
+ 2: secret
+
+(restore env for next test)
+
+ $ sed -e 's/new-commit=secret//' $HGRCPATH > $TESTTMP/sedtmp
+ $ cp $TESTTMP/sedtmp $HGRCPATH
+ $ hg qimport -r 1 --name add-file2
+
+Test that qfinish preserve phase when mq.secret=false
+
+ $ sed -e 's/secret=true/secret=false/' $HGRCPATH > $TESTTMP/sedtmp
+ $ cp $TESTTMP/sedtmp $HGRCPATH
+ $ hg qfinish qbase
+ patch add-file2 finalized without changeset message
+ $ hg phase 'all()'
+ 0: draft
+ 1: secret
+ 2: secret
+
+ $ cd ..
diff --git a/tests/test-mv-cp-st-diff.t b/tests/test-mv-cp-st-diff.t
new file mode 100644
index 0000000..5342fea
--- /dev/null
+++ b/tests/test-mv-cp-st-diff.t
@@ -0,0 +1,1348 @@
+
+ $ add()
+ > {
+ > echo $2 >> $1
+ > }
+ $ hg init t
+ $ cd t
+
+set up a boring main branch
+
+ $ add a a
+ $ hg add a
+ $ mkdir x
+ $ add x/x x
+ $ hg add x/x
+ $ hg ci -m0
+ $ add a m1
+ $ hg ci -m1
+ $ add a m2
+ $ add x/y y1
+ $ hg add x/y
+ $ hg ci -m2
+ $ cd ..
+ $ show()
+ > {
+ > echo "- $2: $1"
+ > hg st -C $1
+ > echo
+ > hg diff --git $1
+ > echo
+ > }
+ $ count=0
+
+make a new branch and get diff/status output
+$1 - first commit
+$2 - second commit
+$3 - working dir action
+$4 - test description
+
+ $ tb()
+ > {
+ > hg clone t t2 ; cd t2
+ > hg co -q -C 0
+ >
+ > add a $count
+ > count=`expr $count + 1`
+ > hg ci -m "t0"
+ > $1
+ > hg ci -m "t1"
+ > $2
+ > hg ci -m "t2"
+ > $3
+ >
+ > echo "** $4 **"
+ > echo "** $1 / $2 / $3"
+ > show "" "working to parent"
+ > show "--rev 0" "working to root"
+ > show "--rev 2" "working to branch"
+ > show "--rev 0 --rev ." "root to parent"
+ > show "--rev . --rev 0" "parent to root"
+ > show "--rev 2 --rev ." "branch to parent"
+ > show "--rev . --rev 2" "parent to branch"
+ > echo
+ > cd ..
+ > rm -rf t2
+ > }
+ $ tb "add a a1" "add a a2" "hg mv a b" "rename in working dir"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** rename in working dir **
+ ** add a a1 / add a a2 / hg mv a b
+ - working to parent:
+ A b
+ a
+ R a
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+
+ - working to root: --rev 0
+ A b
+ a
+ R a
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,4 @@
+ a
+ +0
+ +a1
+ +a2
+
+ - working to branch: --rev 2
+ A b
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +0
+ +a1
+ +a2
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,4 @@
+ a
+ +0
+ +a1
+ +a2
+
+ - parent to root: --rev . --rev 0
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,4 +1,1 @@
+ a
+ -0
+ -a1
+ -a2
+
+ - branch to parent: --rev 2 --rev .
+ M a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +0
+ +a1
+ +a2
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ M a
+ A x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,4 +1,3 @@
+ a
+ -0
+ -a1
+ -a2
+ +m1
+ +m2
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "add a a1" "add a a2" "hg cp a b" "copy in working dir"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** copy in working dir **
+ ** add a a1 / add a a2 / hg cp a b
+ - working to parent:
+ A b
+ a
+
+ diff --git a/a b/b
+ copy from a
+ copy to b
+
+ - working to root: --rev 0
+ M a
+ A b
+ a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,4 @@
+ a
+ +1
+ +a1
+ +a2
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,4 @@
+ a
+ +1
+ +a1
+ +a2
+
+ - working to branch: --rev 2
+ M a
+ A b
+ a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +1
+ +a1
+ +a2
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +1
+ +a1
+ +a2
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,4 @@
+ a
+ +1
+ +a1
+ +a2
+
+ - parent to root: --rev . --rev 0
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,4 +1,1 @@
+ a
+ -1
+ -a1
+ -a2
+
+ - branch to parent: --rev 2 --rev .
+ M a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +1
+ +a1
+ +a2
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ M a
+ A x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,4 +1,3 @@
+ a
+ -1
+ -a1
+ -a2
+ +m1
+ +m2
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "hg mv a b" "add b b1" "add b w" "single rename"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** single rename **
+ ** hg mv a b / add b b1 / add b w
+ - working to parent:
+ M b
+
+ diff --git a/b b/b
+ --- a/b
+ +++ b/b
+ @@ -1,3 +1,4 @@
+ a
+ 2
+ b1
+ +w
+
+ - working to root: --rev 0
+ A b
+ a
+ R a
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,4 @@
+ a
+ +2
+ +b1
+ +w
+
+ - working to branch: --rev 2
+ A b
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,4 @@
+ a
+ -m1
+ -m2
+ +2
+ +b1
+ +w
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ A b
+ a
+ R a
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,3 @@
+ a
+ +2
+ +b1
+
+ - parent to root: --rev . --rev 0
+ A a
+ b
+ R b
+
+ diff --git a/b b/a
+ rename from b
+ rename to a
+ --- a/b
+ +++ b/a
+ @@ -1,3 +1,1 @@
+ a
+ -2
+ -b1
+
+ - branch to parent: --rev 2 --rev .
+ A b
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +2
+ +b1
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ A a
+ b
+ A x/y
+ R b
+
+ diff --git a/b b/a
+ rename from b
+ rename to a
+ --- a/b
+ +++ b/a
+ @@ -1,3 +1,3 @@
+ a
+ -2
+ -b1
+ +m1
+ +m2
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "hg cp a b" "add b b1" "add a w" "single copy"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** single copy **
+ ** hg cp a b / add b b1 / add a w
+ - working to parent:
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ 3
+ +w
+
+ - working to root: --rev 0
+ M a
+ A b
+ a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,3 @@
+ a
+ +3
+ +w
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,3 @@
+ a
+ +3
+ +b1
+
+ - working to branch: --rev 2
+ M a
+ A b
+ a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +3
+ +w
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +3
+ +b1
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ M a
+ A b
+ a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +3
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,3 @@
+ a
+ +3
+ +b1
+
+ - parent to root: --rev . --rev 0
+ M a
+ b
+ R b
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,1 @@
+ a
+ -3
+ diff --git a/b b/b
+ deleted file mode 100644
+ --- a/b
+ +++ /dev/null
+ @@ -1,3 +0,0 @@
+ -a
+ -3
+ -b1
+
+ - branch to parent: --rev 2 --rev .
+ M a
+ A b
+ a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +3
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +3
+ +b1
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ M a
+ b
+ A x/y
+ R b
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ -3
+ +m1
+ +m2
+ diff --git a/b b/b
+ deleted file mode 100644
+ --- a/b
+ +++ /dev/null
+ @@ -1,3 +0,0 @@
+ -a
+ -3
+ -b1
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "hg mv a b" "hg mv b c" "hg mv c d" "rename chain"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** rename chain **
+ ** hg mv a b / hg mv b c / hg mv c d
+ - working to parent:
+ A d
+ c
+ R c
+
+ diff --git a/c b/d
+ rename from c
+ rename to d
+
+ - working to root: --rev 0
+ A d
+ a
+ R a
+
+ diff --git a/a b/d
+ rename from a
+ rename to d
+ --- a/a
+ +++ b/d
+ @@ -1,1 +1,2 @@
+ a
+ +4
+
+ - working to branch: --rev 2
+ A d
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/d
+ rename from a
+ rename to d
+ --- a/a
+ +++ b/d
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +4
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ A c
+ a
+ R a
+
+ diff --git a/a b/c
+ rename from a
+ rename to c
+ --- a/a
+ +++ b/c
+ @@ -1,1 +1,2 @@
+ a
+ +4
+
+ - parent to root: --rev . --rev 0
+ A a
+ c
+ R c
+
+ diff --git a/c b/a
+ rename from c
+ rename to a
+ --- a/c
+ +++ b/a
+ @@ -1,2 +1,1 @@
+ a
+ -4
+
+ - branch to parent: --rev 2 --rev .
+ A c
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/c
+ rename from a
+ rename to c
+ --- a/a
+ +++ b/c
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +4
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ A a
+ c
+ A x/y
+ R c
+
+ diff --git a/c b/a
+ rename from c
+ rename to a
+ --- a/c
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ -4
+ +m1
+ +m2
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "hg cp a b" "hg cp b c" "hg cp c d" "copy chain"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** copy chain **
+ ** hg cp a b / hg cp b c / hg cp c d
+ - working to parent:
+ A d
+ c
+
+ diff --git a/c b/d
+ copy from c
+ copy to d
+
+ - working to root: --rev 0
+ M a
+ A b
+ a
+ A c
+ a
+ A d
+ a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +5
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,2 @@
+ a
+ +5
+ diff --git a/a b/c
+ copy from a
+ copy to c
+ --- a/a
+ +++ b/c
+ @@ -1,1 +1,2 @@
+ a
+ +5
+ diff --git a/a b/d
+ copy from a
+ copy to d
+ --- a/a
+ +++ b/d
+ @@ -1,1 +1,2 @@
+ a
+ +5
+
+ - working to branch: --rev 2
+ M a
+ A b
+ a
+ A c
+ a
+ A d
+ a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/a b/c
+ copy from a
+ copy to c
+ --- a/a
+ +++ b/c
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/a b/d
+ copy from a
+ copy to d
+ --- a/a
+ +++ b/d
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ M a
+ A b
+ a
+ A c
+ a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +5
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,2 @@
+ a
+ +5
+ diff --git a/a b/c
+ copy from a
+ copy to c
+ --- a/a
+ +++ b/c
+ @@ -1,1 +1,2 @@
+ a
+ +5
+
+ - parent to root: --rev . --rev 0
+ M a
+ b
+ R b
+ R c
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,1 @@
+ a
+ -5
+ diff --git a/b b/b
+ deleted file mode 100644
+ --- a/b
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -a
+ -5
+ diff --git a/c b/c
+ deleted file mode 100644
+ --- a/c
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -a
+ -5
+
+ - branch to parent: --rev 2 --rev .
+ M a
+ A b
+ a
+ A c
+ a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/a b/b
+ copy from a
+ copy to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/a b/c
+ copy from a
+ copy to c
+ --- a/a
+ +++ b/c
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +5
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ M a
+ b
+ A x/y
+ R b
+ R c
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ -5
+ +m1
+ +m2
+ diff --git a/b b/b
+ deleted file mode 100644
+ --- a/b
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -a
+ -5
+ diff --git a/c b/c
+ deleted file mode 100644
+ --- a/c
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -a
+ -5
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "add a a1" "hg mv a b" "hg mv b a" "circular rename"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ ** circular rename **
+ ** add a a1 / hg mv a b / hg mv b a
+ - working to parent:
+ A a
+ b
+ R b
+
+ diff --git a/b b/a
+ rename from b
+ rename to a
+
+ - working to root: --rev 0
+ M a
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,3 @@
+ a
+ +6
+ +a1
+
+ - working to branch: --rev 2
+ M a
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +6
+ +a1
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - root to parent: --rev 0 --rev .
+ A b
+ a
+ R a
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,1 +1,3 @@
+ a
+ +6
+ +a1
+
+ - parent to root: --rev . --rev 0
+ A a
+ b
+ R b
+
+ diff --git a/b b/a
+ rename from b
+ rename to a
+ --- a/b
+ +++ b/a
+ @@ -1,3 +1,1 @@
+ a
+ -6
+ -a1
+
+ - branch to parent: --rev 2 --rev .
+ A b
+ a
+ R a
+ R x/y
+
+ diff --git a/a b/b
+ rename from a
+ rename to b
+ --- a/a
+ +++ b/b
+ @@ -1,3 +1,3 @@
+ a
+ -m1
+ -m2
+ +6
+ +a1
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+
+ - parent to branch: --rev . --rev 2
+ A a
+ b
+ A x/y
+ R b
+
+ diff --git a/b b/a
+ rename from b
+ rename to a
+ --- a/b
+ +++ b/a
+ @@ -1,3 +1,3 @@
+ a
+ -6
+ -a1
+ +m1
+ +m2
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+ $ tb "hg mv x y" "add y/x x1" "add y/x x2" "directory move"
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ moving x/x to y/x (glob)
+ ** directory move **
+ ** hg mv x y / add y/x x1 / add y/x x2
+ - working to parent:
+ M y/x
+
+ diff --git a/y/x b/y/x
+ --- a/y/x
+ +++ b/y/x
+ @@ -1,2 +1,3 @@
+ x
+ x1
+ +x2
+
+ - working to root: --rev 0
+ M a
+ A y/x
+ x/x
+ R x/x
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +7
+ diff --git a/x/x b/y/x
+ rename from x/x
+ rename to y/x
+ --- a/x/x
+ +++ b/y/x
+ @@ -1,1 +1,3 @@
+ x
+ +x1
+ +x2
+
+ - working to branch: --rev 2
+ M a
+ A y/x
+ x/x
+ R x/x
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +7
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+ diff --git a/x/x b/y/x
+ rename from x/x
+ rename to y/x
+ --- a/x/x
+ +++ b/y/x
+ @@ -1,1 +1,3 @@
+ x
+ +x1
+ +x2
+
+ - root to parent: --rev 0 --rev .
+ M a
+ A y/x
+ x/x
+ R x/x
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +7
+ diff --git a/x/x b/y/x
+ rename from x/x
+ rename to y/x
+ --- a/x/x
+ +++ b/y/x
+ @@ -1,1 +1,2 @@
+ x
+ +x1
+
+ - parent to root: --rev . --rev 0
+ M a
+ A x/x
+ y/x
+ R y/x
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,1 @@
+ a
+ -7
+ diff --git a/y/x b/x/x
+ rename from y/x
+ rename to x/x
+ --- a/y/x
+ +++ b/x/x
+ @@ -1,2 +1,1 @@
+ x
+ -x1
+
+ - branch to parent: --rev 2 --rev .
+ M a
+ A y/x
+ x/x
+ R x/x
+ R x/y
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,3 +1,2 @@
+ a
+ -m1
+ -m2
+ +7
+ diff --git a/x/y b/x/y
+ deleted file mode 100644
+ --- a/x/y
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -y1
+ diff --git a/x/x b/y/x
+ rename from x/x
+ rename to y/x
+ --- a/x/x
+ +++ b/y/x
+ @@ -1,1 +1,2 @@
+ x
+ +x1
+
+ - parent to branch: --rev . --rev 2
+ M a
+ A x/x
+ y/x
+ A x/y
+ R y/x
+
+ diff --git a/a b/a
+ --- a/a
+ +++ b/a
+ @@ -1,2 +1,3 @@
+ a
+ -7
+ +m1
+ +m2
+ diff --git a/y/x b/x/x
+ rename from y/x
+ rename to x/x
+ --- a/y/x
+ +++ b/x/x
+ @@ -1,2 +1,1 @@
+ x
+ -x1
+ diff --git a/x/y b/x/y
+ new file mode 100644
+ --- /dev/null
+ +++ b/x/y
+ @@ -0,0 +1,1 @@
+ +y1
+
+
+
+Cannot implement unrelated branch with tb
+testing copies with unrelated branch
+
+ $ hg init unrelated
+ $ cd unrelated
+ $ add a a
+ $ hg ci -Am adda
+ adding a
+ $ hg mv a b
+ $ hg ci -m movea
+ $ hg up -C null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ add a a
+ $ hg ci -Am addunrelateda
+ adding a
+ created new head
+
+unrelated branch diff
+
+ $ hg diff --git -r 2 -r 1
+ diff --git a/a b/a
+ deleted file mode 100644
+ --- a/a
+ +++ /dev/null
+ @@ -1,1 +0,0 @@
+ -a
+ diff --git a/b b/b
+ new file mode 100644
+ --- /dev/null
+ +++ b/b
+ @@ -0,0 +1,1 @@
+ +a
+ $ cd ..
diff --git a/tests/test-nested-repo.t b/tests/test-nested-repo.t
new file mode 100644
index 0000000..ddea413
--- /dev/null
+++ b/tests/test-nested-repo.t
@@ -0,0 +1,41 @@
+ $ hg init a
+ $ cd a
+ $ hg init b
+ $ echo x > b/x
+
+Should print nothing:
+
+ $ hg add b
+ $ hg st
+
+Should fail:
+
+ $ hg st b/x
+ abort: path 'b/x' is inside nested repo 'b' (glob)
+ [255]
+ $ hg add b/x
+ abort: path 'b/x' is inside nested repo 'b' (glob)
+ [255]
+
+Should fail:
+
+ $ hg add b b/x
+ abort: path 'b/x' is inside nested repo 'b' (glob)
+ [255]
+ $ hg st
+
+Should arguably print nothing:
+
+ $ hg st b
+
+ $ echo a > a
+ $ hg ci -Ama a
+
+Should fail:
+
+ $ hg mv a b
+ abort: path 'b/a' is inside nested repo 'b' (glob)
+ [255]
+ $ hg st
+
+ $ cd ..
diff --git a/tests/test-newbranch.t b/tests/test-newbranch.t
new file mode 100644
index 0000000..f1099b8
--- /dev/null
+++ b/tests/test-newbranch.t
@@ -0,0 +1,330 @@
+ $ branchcache=.hg/cache/branchheads
+
+ $ hg init t
+ $ cd t
+
+ $ hg branches
+ $ echo foo > a
+ $ hg add a
+ $ hg ci -m "initial"
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg branch
+ foo
+ $ hg ci -m "add branch name"
+ $ hg branch bar
+ marked working directory as branch bar
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m "change branch name"
+
+Branch shadowing:
+
+ $ hg branch default
+ abort: a branch of the same name already exists
+ (use 'hg update' to switch to it)
+ [255]
+
+ $ hg branch -f default
+ marked working directory as branch default
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ hg ci -m "clear branch name"
+ created new head
+
+There should be only one default branch head
+
+ $ hg heads .
+ changeset: 3:1c28f494dae6
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: clear branch name
+
+
+ $ hg co foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch
+ foo
+ $ echo bleah > a
+ $ hg ci -m "modify a branch"
+
+ $ hg merge default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg branch
+ foo
+ $ hg ci -m "merge"
+
+ $ hg log
+ changeset: 5:530046499edf
+ branch: foo
+ tag: tip
+ parent: 4:adf1a74a7f7b
+ parent: 3:1c28f494dae6
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge
+
+ changeset: 4:adf1a74a7f7b
+ branch: foo
+ parent: 1:6c0e42da283a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: modify a branch
+
+ changeset: 3:1c28f494dae6
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: clear branch name
+
+ changeset: 2:c21617b13b22
+ branch: bar
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change branch name
+
+ changeset: 1:6c0e42da283a
+ branch: foo
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add branch name
+
+ changeset: 0:db01e8ea3388
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: initial
+
+ $ hg branches
+ foo 5:530046499edf
+ default 3:1c28f494dae6 (inactive)
+ bar 2:c21617b13b22 (inactive)
+
+ $ hg branches -q
+ foo
+ default
+ bar
+
+Test for invalid branch cache:
+
+ $ hg rollback
+ repository tip rolled back to revision 4 (undo commit)
+ working directory now based on revisions 4 and 3
+
+ $ cp $branchcache .hg/bc-invalid
+
+ $ hg log -r foo
+ changeset: 4:adf1a74a7f7b
+ branch: foo
+ tag: tip
+ parent: 1:6c0e42da283a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: modify a branch
+
+ $ cp .hg/bc-invalid $branchcache
+
+ $ hg --debug log -r foo
+ invalidating branch cache (tip differs)
+ changeset: 4:adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6
+ branch: foo
+ tag: tip
+ phase: draft
+ parent: 1:6c0e42da283a56b5edc5b4fadb491365ec7f5fa8
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 1:8c342a37dfba0b3d3ce073562a00d8a813c54ffe
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ extra: branch=foo
+ description:
+ modify a branch
+
+
+ $ rm $branchcache
+ $ echo corrupted > $branchcache
+
+ $ hg log -qr foo
+ 4:adf1a74a7f7b
+
+ $ cat $branchcache
+ adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4
+ 1c28f494dae69a2f8fc815059d257eccf3fcfe75 default
+ adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo
+ c21617b13b220988e7a2e26290fbe4325ffa7139 bar
+
+Push should update the branch cache:
+
+ $ hg init ../target
+
+Pushing just rev 0:
+
+ $ hg push -qr 0 ../target
+
+ $ cat ../target/$branchcache
+ db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 0
+ db01e8ea3388fd3c7c94e1436ea2bd6a53d581c5 default
+
+Pushing everything:
+
+ $ hg push -qf ../target
+
+ $ cat ../target/$branchcache
+ adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 4
+ 1c28f494dae69a2f8fc815059d257eccf3fcfe75 default
+ adf1a74a7f7b4cd193d12992f5d0d6a004ed21d6 foo
+ c21617b13b220988e7a2e26290fbe4325ffa7139 bar
+
+Update with no arguments: tipmost revision of the current branch:
+
+ $ hg up -q -C 0
+ $ hg up -q
+ $ hg id
+ 1c28f494dae6
+
+ $ hg up -q 1
+ $ hg up -q
+ $ hg id
+ adf1a74a7f7b (foo) tip
+
+ $ hg branch foobar
+ marked working directory as branch foobar
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ hg up
+ abort: branch foobar not found
+ [255]
+
+Fastforward merge:
+
+ $ hg branch ff
+ marked working directory as branch ff
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ echo ff > ff
+ $ hg ci -Am'fast forward'
+ adding ff
+
+ $ hg up foo
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ hg merge ff
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg branch
+ foo
+ $ hg commit -m'Merge ff into foo'
+ $ hg parents
+ changeset: 6:185ffbfefa30
+ branch: foo
+ tag: tip
+ parent: 4:adf1a74a7f7b
+ parent: 5:1a3c27dc5e11
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Merge ff into foo
+
+ $ hg manifest
+ a
+ ff
+
+
+Test merging, add 3 default heads and one test head:
+
+ $ cd ..
+ $ hg init merges
+ $ cd merges
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ echo b > b
+ $ hg ci -Amb
+ adding b
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -Amc
+ adding c
+ created new head
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo d > d
+ $ hg ci -Amd
+ adding d
+ created new head
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo e >> e
+ $ hg ci -Ame
+ adding e
+
+ $ hg log
+ changeset: 4:3a1e01ed1df4
+ branch: test
+ tag: tip
+ parent: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: e
+
+ changeset: 3:980f7dc84c29
+ parent: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: d
+
+ changeset: 2:d36c0562f908
+ parent: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: c
+
+ changeset: 1:d2ae7f538514
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+Implicit merge with test branch as parent:
+
+ $ hg merge
+ abort: branch 'test' has one head - please merge with an explicit rev
+ (run 'hg heads' to see all heads)
+ [255]
+ $ hg up -C default
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Implicit merge with default branch as parent:
+
+ $ hg merge
+ abort: branch 'default' has 3 heads - please merge with an explicit rev
+ (run 'hg heads .' to see heads)
+ [255]
+
+3 branch heads, explicit merge required:
+
+ $ hg merge 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+
+2 branch heads, implicit merge works:
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cd ..
diff --git a/tests/test-newcgi.t b/tests/test-newcgi.t
new file mode 100644
index 0000000..fb4f541
--- /dev/null
+++ b/tests/test-newcgi.t
@@ -0,0 +1,66 @@
+ $ "$TESTDIR/hghave" no-msys || exit 80 # MSYS will translate web paths as if they were file paths
+
+This tests if CGI files from after d0db3462d568 but
+before d74fc8dec2b4 still work.
+
+ $ hg init test
+ $ cat >hgweb.cgi <<HGWEB
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to use hgweb, edit as necessary
+ >
+ > import cgitb
+ > cgitb.enable()
+ >
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgweb
+ > from mercurial.hgweb import wsgicgi
+ > from mercurial.hgweb.request import wsgiapplication
+ >
+ > def make_web_app():
+ > return hgweb("test", "Empty test repository")
+ >
+ > wsgicgi.launch(wsgiapplication(make_web_app))
+ > HGWEB
+
+ $ chmod 755 hgweb.cgi
+
+ $ cat >hgweb.config <<HGWEBDIRCONF
+ > [paths]
+ > test = test
+ > HGWEBDIRCONF
+
+ $ cat >hgwebdir.cgi <<HGWEBDIR
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to export multiple hgweb repos, edit as necessary
+ >
+ > import cgitb
+ > cgitb.enable()
+ >
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgwebdir
+ > from mercurial.hgweb import wsgicgi
+ > from mercurial.hgweb.request import wsgiapplication
+ >
+ > def make_web_app():
+ > return hgwebdir("hgweb.config")
+ >
+ > wsgicgi.launch(wsgiapplication(make_web_app))
+ > HGWEBDIR
+
+ $ chmod 755 hgwebdir.cgi
+
+ $ . "$TESTDIR/cgienv"
+ $ python hgweb.cgi > page1
+ $ python hgwebdir.cgi > page2
+
+ $ PATH_INFO="/test/"
+ $ PATH_TRANSLATED="/var/something/test.cgi"
+ $ REQUEST_URI="/test/test/"
+ $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
+ $ SCRIPT_URL="/test/test/"
+ $ python hgwebdir.cgi > page3
+
+ $ grep -i error page1 page2 page3
+ [1]
diff --git a/tests/test-newercgi.t b/tests/test-newercgi.t
new file mode 100644
index 0000000..b6771fc
--- /dev/null
+++ b/tests/test-newercgi.t
@@ -0,0 +1,60 @@
+ $ "$TESTDIR/hghave" no-msys || exit 80 # MSYS will translate web paths as if they were file paths
+
+This is a rudimentary test of the CGI files as of d74fc8dec2b4.
+
+ $ hg init test
+
+ $ cat >hgweb.cgi <<HGWEB
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to use hgweb, edit as necessary
+ >
+ > import cgitb
+ > cgitb.enable()
+ >
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgweb
+ > from mercurial.hgweb import wsgicgi
+ >
+ > application = hgweb("test", "Empty test repository")
+ > wsgicgi.launch(application)
+ > HGWEB
+
+ $ chmod 755 hgweb.cgi
+
+ $ cat >hgweb.config <<HGWEBDIRCONF
+ > [paths]
+ > test = test
+ > HGWEBDIRCONF
+
+ $ cat >hgwebdir.cgi <<HGWEBDIR
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to export multiple hgweb repos, edit as necessary
+ >
+ > import cgitb
+ > cgitb.enable()
+ >
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgwebdir
+ > from mercurial.hgweb import wsgicgi
+ >
+ > application = hgwebdir("hgweb.config")
+ > wsgicgi.launch(application)
+ > HGWEBDIR
+
+ $ chmod 755 hgwebdir.cgi
+
+ $ . "$TESTDIR/cgienv"
+ $ python hgweb.cgi > page1
+ $ python hgwebdir.cgi > page2
+
+ $ PATH_INFO="/test/"
+ $ PATH_TRANSLATED="/var/something/test.cgi"
+ $ REQUEST_URI="/test/test/"
+ $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
+ $ SCRIPT_URL="/test/test/"
+ $ python hgwebdir.cgi > page3
+
+ $ grep -i error page1 page2 page3
+ [1]
diff --git a/tests/test-no-symlinks.t b/tests/test-no-symlinks.t
new file mode 100644
index 0000000..e569067
--- /dev/null
+++ b/tests/test-no-symlinks.t
@@ -0,0 +1,59 @@
+ $ "$TESTDIR/hghave" no-symlink || exit 80
+
+# The following script was used to create the bundle:
+#
+# hg init symlinks
+# cd symlinks
+# echo a > a
+# mkdir d
+# echo b > d/b
+# ln -s a a.lnk
+# ln -s d/b d/b.lnk
+# hg ci -Am t
+# hg bundle --base null ../test-no-symlinks.hg
+
+Extract a symlink on a platform not supporting them
+
+ $ hg init t
+ $ cd t
+ $ hg pull -q "$TESTDIR/bundles/test-no-symlinks.hg"
+ $ hg update
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat a.lnk && echo
+ a
+ $ cat d/b.lnk && echo
+ d/b
+
+Copy a symlink and move another
+
+ $ hg copy a.lnk d/a2.lnk
+ $ hg mv d/b.lnk b2.lnk
+ $ hg ci -Am copy
+ $ cat d/a2.lnk && echo
+ a
+ $ cat b2.lnk && echo
+ d/b
+
+Bundle and extract again
+
+ $ hg bundle --base null ../symlinks.hg
+ 2 changesets found
+ $ cd ..
+ $ hg init t2
+ $ cd t2
+ $ hg pull ../symlinks.hg
+ pulling from ../symlinks.hg
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 6 changes to 6 files
+ (run 'hg update' to get a working copy)
+ $ hg update
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat a.lnk && echo
+ a
+ $ cat d/a2.lnk && echo
+ a
+ $ cat b2.lnk && echo
+ d/b
diff --git a/tests/test-notify-changegroup.t b/tests/test-notify-changegroup.t
new file mode 100644
index 0000000..d317adb
--- /dev/null
+++ b/tests/test-notify-changegroup.t
@@ -0,0 +1,214 @@
+
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > notify=
+ >
+ > [hooks]
+ > changegroup.notify = python:hgext.notify.hook
+ >
+ > [notify]
+ > sources = push
+ > diffstat = False
+ > maxsubject = 10
+ >
+ > [usersubs]
+ > foo@bar = *
+ >
+ > [reposubs]
+ > * = baz
+ > EOF
+ $ hg init a
+
+clone
+
+ $ hg --traceback clone a b
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a > b/a
+
+commit
+
+ $ hg --traceback --cwd b commit -Ama
+ adding a
+ $ echo a >> b/a
+
+commit
+
+ $ hg --traceback --cwd b commit -Amb
+
+push
+
+ $ hg --traceback --cwd b push ../a 2>&1 |
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date: * (glob)
+ Subject: * (glob)
+ From: test
+ X-Hg-Notification: changeset cb9a9f314b8b
+ Message-Id: <*> (glob)
+ To: baz, foo@bar
+
+ changeset cb9a9f314b8b in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=cb9a9f314b8b
+ summary: a
+
+ changeset ba677d0156c1 in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=ba677d0156c1
+ summary: b
+
+ diffs (6 lines):
+
+ diff -r 000000000000 -r ba677d0156c1 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,2 @@
+ +a
+ +a
+ $ hg --cwd a rollback
+ repository tip rolled back to revision -1 (undo push)
+
+unbundle with unrelated source
+
+ $ hg --cwd b bundle ../test.hg ../a
+ searching for changes
+ 2 changesets found
+ $ hg --cwd a unbundle ../test.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg --cwd a rollback
+ repository tip rolled back to revision -1 (undo unbundle)
+
+unbundle with correct source
+
+ $ hg --config notify.sources=unbundle --cwd a unbundle ../test.hg 2>&1 |
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date: * (glob)
+ Subject: * (glob)
+ From: test
+ X-Hg-Notification: changeset cb9a9f314b8b
+ Message-Id: <*> (glob)
+ To: baz, foo@bar
+
+ changeset cb9a9f314b8b in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=cb9a9f314b8b
+ summary: a
+
+ changeset ba677d0156c1 in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=ba677d0156c1
+ summary: b
+
+ diffs (6 lines):
+
+ diff -r 000000000000 -r ba677d0156c1 a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,2 @@
+ +a
+ +a
+ (run 'hg update' to get a working copy)
+
+Check that using the first committer as the author of a changeset works:
+Check that the config option works.
+Check that the first committer is indeed used for "From:".
+Check that the merge user is NOT used for "From:"
+
+Create new file
+
+ $ echo a > b/b
+ $ echo b >> b/b
+ $ echo c >> b/b
+ $ hg --traceback --cwd b commit -Amnewfile -u committer_1
+ adding b
+
+commit as one user
+
+ $ echo x > b/b
+ $ echo b >> b/b
+ $ echo c >> b/b
+ $ hg --traceback --cwd b commit -Amx -u committer_2
+
+commit as other user, change file so we can do an (automatic) merge
+
+ $ hg --cwd b up 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a > b/b
+ $ echo b >> b/b
+ $ echo y >> b/b
+ $ hg --traceback --cwd b commit -Amy -u committer_3
+ created new head
+
+merge as a different user
+
+ $ hg --cwd b merge --config notify.fromauthor=True
+ merging b
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg --traceback --cwd b commit -Am "merged"
+
+push
+
+ $ hg --traceback --cwd b --config notify.fromauthor=True push ../a 2>&1 |
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date: * (glob)
+ Subject: * (glob)
+ From: committer_1
+ X-Hg-Notification: changeset 84e487dddc58
+ Message-Id: <*> (glob)
+ To: baz, foo@bar
+
+ changeset 84e487dddc58 in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=84e487dddc58
+ summary: newfile
+
+ changeset b29c7a2b6b0c in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=b29c7a2b6b0c
+ summary: x
+
+ changeset 0957c7d64886 in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=0957c7d64886
+ summary: y
+
+ changeset 485b4e6b0249 in $TESTTMP/a (glob)
+ details: $TESTTMP/a?cmd=changeset;node=485b4e6b0249
+ summary: merged
+
+ diffs (7 lines):
+
+ diff -r ba677d0156c1 -r 485b4e6b0249 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,3 @@
+ +x
+ +b
+ +y
+ $ hg --cwd a rollback
+ repository tip rolled back to revision 1 (undo push)
+
diff --git a/tests/test-notify.t b/tests/test-notify.t
new file mode 100644
index 0000000..543ceba
--- /dev/null
+++ b/tests/test-notify.t
@@ -0,0 +1,475 @@
+
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > notify=
+ >
+ > [hooks]
+ > incoming.notify = python:hgext.notify.hook
+ >
+ > [notify]
+ > sources = pull
+ > diffstat = False
+ >
+ > [usersubs]
+ > foo@bar = *
+ >
+ > [reposubs]
+ > * = baz
+ > EOF
+ $ hg help notify
+ notify extension - hooks for sending email push notifications
+
+ This extension implements hooks to send email notifications when changesets
+ are sent from or received by the local repository.
+
+ First, enable the extension as explained in "hg help extensions", and register
+ the hook you want to run. "incoming" and "changegroup" hooks are run when
+ changesets are received, while "outgoing" hooks are for changesets sent to
+ another repository:
+
+ [hooks]
+ # one email for each incoming changeset
+ incoming.notify = python:hgext.notify.hook
+ # one email for all incoming changesets
+ changegroup.notify = python:hgext.notify.hook
+
+ # one email for all outgoing changesets
+ outgoing.notify = python:hgext.notify.hook
+
+ This registers the hooks. To enable notification, subscribers must be assigned
+ to repositories. The "[usersubs]" section maps multiple repositories to a
+ given recipient. The "[reposubs]" section maps multiple recipients to a single
+ repository:
+
+ [usersubs]
+ # key is subscriber email, value is a comma-separated list of repo glob
+ # patterns
+ user@host = pattern
+
+ [reposubs]
+ # key is glob pattern, value is a comma-separated list of subscriber
+ # emails
+ pattern = user@host
+
+ Glob patterns are matched against absolute path to repository root.
+
+ In order to place them under direct user management, "[usersubs]" and
+ "[reposubs]" sections may be placed in a separate "hgrc" file and incorporated
+ by reference:
+
+ [notify]
+ config = /path/to/subscriptionsfile
+
+ Notifications will not be sent until the "notify.test" value is set to
+ "False"; see below.
+
+ Notifications content can be tweaked with the following configuration entries:
+
+ notify.test
+ If "True", print messages to stdout instead of sending them. Default: True.
+
+ notify.sources
+ Space-separated list of change sources. Notifications are activated only
+ when a changeset's source is in this list. Sources may be:
+
+ "serve" changesets received via http or ssh
+ "pull" changesets received via "hg pull"
+ "unbundle" changesets received via "hg unbundle"
+ "push" changesets sent or received via "hg push"
+ "bundle" changesets sent via "hg unbundle"
+
+ Default: serve.
+
+ notify.strip
+ Number of leading slashes to strip from url paths. By default, notifications
+ reference repositories with their absolute path. "notify.strip" lets you
+ turn them into relative paths. For example, "notify.strip=3" will change
+ "/long/path/repository" into "repository". Default: 0.
+
+ notify.domain
+ Default email domain for sender or recipients with no explicit domain.
+
+ notify.style
+ Style file to use when formatting emails.
+
+ notify.template
+ Template to use when formatting emails.
+
+ notify.incoming
+ Template to use when run as an incoming hook, overriding "notify.template".
+
+ notify.outgoing
+ Template to use when run as an outgoing hook, overriding "notify.template".
+
+ notify.changegroup
+ Template to use when running as a changegroup hook, overriding
+ "notify.template".
+
+ notify.maxdiff
+ Maximum number of diff lines to include in notification email. Set to 0 to
+ disable the diff, or -1 to include all of it. Default: 300.
+
+ notify.maxsubject
+ Maximum number of characters in email's subject line. Default: 67.
+
+ notify.diffstat
+ Set to True to include a diffstat before diff content. Default: True.
+
+ notify.merge
+ If True, send notifications for merge changesets. Default: True.
+
+ notify.mbox
+ If set, append mails to this mbox file instead of sending. Default: None.
+
+ notify.fromauthor
+ If set, use the committer of the first changeset in a changegroup for the
+ "From" field of the notification mail. If not set, take the user from the
+ pushing repo. Default: False.
+
+ If set, the following entries will also be used to customize the
+ notifications:
+
+ email.from
+ Email "From" address to use if none can be found in the generated email
+ content.
+
+ web.baseurl
+ Root repository URL to combine with repository paths when making references.
+ See also "notify.strip".
+
+ no commands defined
+ $ hg init a
+ $ echo a > a/a
+
+commit
+
+ $ hg --cwd a commit -Ama -d '0 0'
+ adding a
+
+
+clone
+
+ $ hg --traceback clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a >> a/a
+
+commit
+
+ $ hg --traceback --cwd a commit -Amb -d '1 0'
+
+on Mac OS X 10.5 the tmp path is very long so would get stripped in the subject line
+
+ $ cat <<EOF >> $HGRCPATH
+ > [notify]
+ > maxsubject = 200
+ > EOF
+
+the python call below wraps continuation lines, which appear on Mac OS X 10.5 because
+of the very long subject line
+pull (minimal config)
+
+ $ hg --traceback --cwd b pull ../a | \
+ > python -c 'import sys,re; print re.sub("\n[\t ]", " ", sys.stdin.read()),'
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Date: * (glob)
+ Subject: changeset in $TESTTMP/b: b
+ From: test
+ X-Hg-Notification: changeset 0647d048b600
+ Message-Id: <*> (glob)
+ To: baz, foo@bar
+
+ changeset 0647d048b600 in $TESTTMP/b (glob)
+ details: $TESTTMP/b?cmd=changeset;node=0647d048b600
+ description: b
+
+ diffs (6 lines):
+
+ diff -r cb9a9f314b8b -r 0647d048b600 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -1,1 +1,2 @@ a
+ +a
+ (run 'hg update' to get a working copy)
+ $ cat <<EOF >> $HGRCPATH
+ > [notify]
+ > config = `pwd`/.notify.conf
+ > domain = test.com
+ > strip = 42
+ > template = Subject: {desc|firstline|strip}\nFrom: {author}\nX-Test: foo\n\nchangeset {node|short} in {webroot}\ndescription:\n\t{desc|tabindent|strip}
+ >
+ > [web]
+ > baseurl = http://test/
+ > EOF
+
+fail for config file is missing
+
+ $ hg --cwd b rollback
+ repository tip rolled back to revision 0 (undo pull)
+ $ hg --cwd b pull ../a 2>&1 | grep 'error.*\.notify\.conf' > /dev/null && echo pull failed
+ pull failed
+ $ touch ".notify.conf"
+
+pull
+
+ $ hg --cwd b rollback
+ repository tip rolled back to revision 0 (undo pull)
+ $ hg --traceback --cwd b pull ../a | \
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ X-Test: foo
+ Date: * (glob)
+ Subject: b
+ From: test@test.com
+ X-Hg-Notification: changeset 0647d048b600
+ Message-Id: <*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset 0647d048b600 in b
+ description: b
+ diffs (6 lines):
+
+ diff -r cb9a9f314b8b -r 0647d048b600 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ (run 'hg update' to get a working copy)
+
+ $ cat << EOF >> $HGRCPATH
+ > [hooks]
+ > incoming.notify = python:hgext.notify.hook
+ >
+ > [notify]
+ > sources = pull
+ > diffstat = True
+ > EOF
+
+pull
+
+ $ hg --cwd b rollback
+ repository tip rolled back to revision 0 (undo pull)
+ $ hg --traceback --cwd b pull ../a | \
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ X-Test: foo
+ Date: * (glob)
+ Subject: b
+ From: test@test.com
+ X-Hg-Notification: changeset 0647d048b600
+ Message-Id: <*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset 0647d048b600 in b
+ description: b
+ diffstat:
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ diffs (6 lines):
+
+ diff -r cb9a9f314b8b -r 0647d048b600 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ (run 'hg update' to get a working copy)
+
+test merge
+
+ $ cd a
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg ci -Am adda2 -d '2 0'
+ created new head
+ $ hg merge
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge -d '3 0'
+ $ cd ..
+ $ hg --traceback --cwd b pull ../a | \
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 0 changes to 0 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ X-Test: foo
+ Date: * (glob)
+ Subject: adda2
+ From: test@test.com
+ X-Hg-Notification: changeset 0a184ce6067f
+ Message-Id: <*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset 0a184ce6067f in b
+ description: adda2
+ diffstat:
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ diffs (6 lines):
+
+ diff -r cb9a9f314b8b -r 0a184ce6067f a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:02 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ X-Test: foo
+ Date: * (glob)
+ Subject: merge
+ From: test@test.com
+ X-Hg-Notification: changeset 6a0cf76b2701
+ Message-Id: <*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset 6a0cf76b2701 in b
+ description: merge
+ (run 'hg update' to get a working copy)
+
+non-ascii content and truncation of multi-byte subject
+
+ $ cat <<EOF >> $HGRCPATH
+ > [notify]
+ > maxsubject = 4
+ > EOF
+ $ echo a >> a/a
+ $ hg --cwd a --encoding utf-8 commit -A -d '0 0' \
+ > -m `python -c 'print "\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4"'`
+ $ hg --traceback --cwd b --encoding utf-8 pull ../a | \
+ > python -c 'import sys,re; print re.sub("\n\t", " ", sys.stdin.read()),'
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 8bit
+ X-Test: foo
+ Date: * (glob)
+ Subject: \xc3\xa0... (esc)
+ From: test@test.com
+ X-Hg-Notification: changeset 7ea05ad269dc
+ Message-Id: <*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset 7ea05ad269dc in b
+ description: \xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4 (esc)
+ diffstat:
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ diffs (7 lines):
+
+ diff -r 6a0cf76b2701 -r 7ea05ad269dc a
+ --- a/a Thu Jan 01 00:00:03 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,2 +1,3 @@
+ a
+ a
+ +a
+ (run 'hg update' to get a working copy)
+
+long lines
+
+ $ cat <<EOF >> $HGRCPATH
+ > [notify]
+ > maxsubject = 67
+ > test = False
+ > mbox = mbox
+ > EOF
+ $ python -c 'file("a/a", "ab").write("no" * 500 + "\n")'
+ $ hg --cwd a commit -A -m "long line"
+ $ hg --traceback --cwd b pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ notify: sending 2 subscribers 1 changes
+ (run 'hg update' to get a working copy)
+ $ python -c 'import sys,re; print re.sub("\n\t", " ", file("b/mbox").read()),'
+ From test@test.com ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ X-Test: foo
+ Date: * (glob)
+ Subject: long line
+ From: test@test.com
+ X-Hg-Notification: changeset e0be44cf638b
+ Message-Id: <hg.e0be44cf638b.*.*@*> (glob)
+ To: baz@test.com, foo@bar
+
+ changeset e0be44cf638b in b
+ description: long line
+ diffstat:
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ diffs (8 lines):
+
+ diff -r 7ea05ad269dc -r e0be44cf638b a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,3 +1,4 @@
+ a
+ a
+ a
+ +nonononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nononononononononononononononononononononononononononononononononononononon=
+ ononononononononononononononononononononononononononononononononononononono=
+ nonononononononononononono
+
diff --git a/tests/test-obsolete-changeset-exchange.t b/tests/test-obsolete-changeset-exchange.t
new file mode 100644
index 0000000..861556e
--- /dev/null
+++ b/tests/test-obsolete-changeset-exchange.t
@@ -0,0 +1,55 @@
+Test changesets filtering during exchanges (some tests are still in
+test-obsolete.t)
+
+ $ cat > obs.py << EOF
+ > import mercurial.obsolete
+ > mercurial.obsolete._enabled = True
+ > EOF
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+
+Push does not corrupt remote
+----------------------------
+
+Create a DAG where a changeset reuses a revision from a file first used in an
+extinct changeset.
+
+ $ hg init local
+ $ cd local
+ $ echo 'base' > base
+ $ hg commit -Am base
+ adding base
+ $ echo 'A' > A
+ $ hg commit -Am A
+ adding A
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg revert -ar 1
+ adding A
+ $ hg commit -Am "A'"
+ created new head
+ $ hg log -G --template='{desc} {node}'
+ @ A' f89bcc95eba5174b1ccc3e33a82e84c96e8338ee
+ |
+ | o A 9d73aac1b2ed7d53835eaeec212ed41ea47da53a
+ |/
+ o base d20a80d4def38df63a4b330b7fb688f3d4cae1e3
+
+ $ hg debugobsolete 9d73aac1b2ed7d53835eaeec212ed41ea47da53a f89bcc95eba5174b1ccc3e33a82e84c96e8338ee
+
+Push it. The bundle should not refer to the extinct changeset.
+
+ $ hg init ../other
+ $ hg push ../other
+ pushing to ../other
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ $ hg -R ../other verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
diff --git a/tests/test-obsolete.t b/tests/test-obsolete.t
new file mode 100644
index 0000000..40abaca
--- /dev/null
+++ b/tests/test-obsolete.t
@@ -0,0 +1,508 @@
+ $ cat >> $HGRCPATH << EOF
+ > [extensions]
+ > graphlog=
+ > [phases]
+ > # public changeset are not obsolete
+ > publish=false
+ > EOF
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+ $ getid() {
+ > hg id --debug -ir "desc('$1')"
+ > }
+
+ $ cat > debugkeys.py <<EOF
+ > def reposetup(ui, repo):
+ > class debugkeysrepo(repo.__class__):
+ > def listkeys(self, namespace):
+ > ui.write('listkeys %s\n' % (namespace,))
+ > return super(debugkeysrepo, self).listkeys(namespace)
+ >
+ > if repo.local():
+ > repo.__class__ = debugkeysrepo
+ > EOF
+
+ $ hg init tmpa
+ $ cd tmpa
+ $ mkcommit kill_me
+
+Checking that the feature is properly disabled
+
+ $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
+ abort: obsolete feature is not enabled on this repo
+ [255]
+
+Enabling it
+
+ $ cat > ../obs.py << EOF
+ > import mercurial.obsolete
+ > mercurial.obsolete._enabled = True
+ > EOF
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "obs=${TESTTMP}/obs.py" >> $HGRCPATH
+
+Killing a single changeset without replacement
+
+ $ hg debugobsolete 0
+ abort: changeset references must be full hexadecimal node identifiers
+ [255]
+ $ hg debugobsolete '00'
+ abort: changeset references must be full hexadecimal node identifiers
+ [255]
+ $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
+ $ hg debugobsolete
+ 97b7c2d76b1845ed3eb988cd612611e72406cef0 0 {'date': '0 0', 'user': 'babar'}
+ $ cd ..
+
+Killing a single changeset with replacement
+
+ $ hg init tmpb
+ $ cd tmpb
+ $ mkcommit a
+ $ mkcommit b
+ $ mkcommit original_c
+ $ hg up "desc('b')"
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_c
+ created new head
+ $ hg debugobsolete `getid original_c` `getid new_c` -d '56 12'
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+
+do it again (it read the obsstore before adding new changeset)
+
+ $ hg up '.^'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_2_c
+ created new head
+ $ hg debugobsolete -d '1337 0' `getid new_c` `getid new_2_c`
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+
+Register two markers with a missing node
+
+ $ hg up '.^'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit new_3_c
+ created new head
+ $ hg debugobsolete -d '1338 0' `getid new_2_c` 1337133713371337133713371337133713371337
+ $ hg debugobsolete -d '1339 0' 1337133713371337133713371337133713371337 `getid new_3_c`
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+Check that graphlog detect that a changeset is obsolete:
+
+ $ hg glog
+ @ changeset: 5:5601fb93a350
+ | tag: tip
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+
+Check that public changeset are not accounted as obsolete:
+
+ $ hg phase --public 2
+ $ hg --config 'extensions.graphlog=' glog
+ @ changeset: 5:5601fb93a350
+ | tag: tip
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ | o changeset: 2:245bde4270cd
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+
+ $ cd ..
+
+Exchange Test
+============================
+
+Destination repo does not have any data
+---------------------------------------
+
+Try to pull markers
+(extinct changeset are excluded but marker are pushed)
+
+ $ hg init tmpc
+ $ cd tmpc
+ $ hg pull ../tmpb
+ pulling from ../tmpb
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+Rollback//Transaction support
+
+ $ hg debugobsolete -d '1340 0' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 {'date': '1340 0', 'user': 'test'}
+ $ hg rollback -n
+ repository tip rolled back to revision 3 (undo debugobsolete)
+ $ hg rollback
+ repository tip rolled back to revision 3 (undo debugobsolete)
+ $ hg debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+ $ cd ..
+
+Try to pull markers
+
+ $ hg init tmpd
+ $ hg -R tmpb push tmpd
+ pushing to tmpd
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ $ hg -R tmpd debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+Check obsolete keys are exchanged only if source has an obsolete store
+
+ $ hg init empty
+ $ hg --config extensions.debugkeys=debugkeys.py -R empty push tmpd
+ pushing to tmpd
+ no changes found
+ listkeys phases
+ listkeys bookmarks
+ [1]
+
+clone support
+(markers are copied and extinct changesets are included to allow hardlinks)
+
+ $ hg clone tmpb clone-dest
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R clone-dest log -G --hidden
+ @ changeset: 5:5601fb93a350
+ | tag: tip
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ | x changeset: 4:ca819180edb9
+ |/ parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_2_c
+ |
+ | x changeset: 3:cdbce2fbb163
+ |/ parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_c
+ |
+ | o changeset: 2:245bde4270cd
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg -R clone-dest debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+
+Destination repo have existing data
+---------------------------------------
+
+On pull
+
+ $ hg init tmpe
+ $ cd tmpe
+ $ hg debugobsolete -d '1339 0' 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339
+ $ hg pull ../tmpb
+ pulling from ../tmpb
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg debugobsolete
+ 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 0 {'date': '1339 0', 'user': 'test'}
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+
+
+On push
+
+ $ hg push ../tmpc
+ pushing to ../tmpc
+ searching for changes
+ no changes found
+ [1]
+ $ hg -R ../tmpc debugobsolete
+ 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f 0 {'date': '56 12', 'user': 'test'}
+ cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 {'date': '1337 0', 'user': 'test'}
+ ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 {'date': '1338 0', 'user': 'test'}
+ 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 {'date': '1339 0', 'user': 'test'}
+ 2448244824482448244824482448244824482448 1339133913391339133913391339133913391339 0 {'date': '1339 0', 'user': 'test'}
+
+detect outgoing obsolete and unstable
+---------------------------------------
+
+
+ $ hg glog
+ o changeset: 3:5601fb93a350
+ | tag: tip
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ | o changeset: 2:245bde4270cd
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg up 'desc("new_3_c")'
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkcommit original_d
+ $ mkcommit original_e
+ $ hg debugobsolete `getid original_d` -d '0 0'
+ $ hg log -r 'obsolete()'
+ changeset: 4:7c694bff0650
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add original_d
+
+ $ hg glog -r '::unstable()'
+ @ changeset: 5:6e572121998e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_e
+ |
+ x changeset: 4:7c694bff0650
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_d
+ |
+ o changeset: 3:5601fb93a350
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+
+refuse to push obsolete changeset
+
+ $ hg push ../tmpc/ -r 'desc("original_d")'
+ pushing to ../tmpc/
+ searching for changes
+ abort: push includes an obsolete changeset: 7c694bff0650!
+ [255]
+
+refuse to push unstable changeset
+
+ $ hg push ../tmpc/
+ pushing to ../tmpc/
+ searching for changes
+ abort: push includes an unstable changeset: 6e572121998e!
+ [255]
+
+Test that extinct changeset are properly detected
+
+ $ hg log -r 'extinct()'
+
+Don't try to push extinct changeset
+
+ $ hg init ../tmpf
+ $ hg out ../tmpf
+ comparing with ../tmpf
+ searching for changes
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ changeset: 1:7c3bad9141dc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add b
+
+ changeset: 2:245bde4270cd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add original_c
+
+ changeset: 3:5601fb93a350
+ parent: 1:7c3bad9141dc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add new_3_c
+
+ changeset: 4:7c694bff0650
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add original_d
+
+ changeset: 5:6e572121998e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add original_e
+
+ $ hg push ../tmpf -f # -f because be push unstable too
+ pushing to ../tmpf
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 6 changes to 6 files (+1 heads)
+
+no warning displayed
+
+ $ hg push ../tmpf
+ pushing to ../tmpf
+ searching for changes
+ no changes found
+ [1]
+
+Do not warn about new head when the new head is a successors of a remote one
+
+ $ hg glog
+ @ changeset: 5:6e572121998e
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_e
+ |
+ x changeset: 4:7c694bff0650
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_d
+ |
+ o changeset: 3:5601fb93a350
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add new_3_c
+ |
+ | o changeset: 2:245bde4270cd
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add original_c
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg up -q 'desc(new_3_c)'
+ $ mkcommit obsolete_e
+ created new head
+ $ hg debugobsolete `getid 'original_e'` `getid 'obsolete_e'`
+ $ hg push ../tmpf
+ pushing to ../tmpf
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+Checking _enable=False warning if obsolete marker exists
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo "obs=!" >> $HGRCPATH
+ $ hg log -r tip
+ obsolete feature not enabled but 7 markers found!
+ changeset: 6:d6a026544050
+ tag: tip
+ parent: 3:5601fb93a350
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add obsolete_e
+
diff --git a/tests/test-oldcgi.t b/tests/test-oldcgi.t
new file mode 100644
index 0000000..2651a9c
--- /dev/null
+++ b/tests/test-oldcgi.t
@@ -0,0 +1,76 @@
+ $ "$TESTDIR/hghave" no-msys || exit 80 # MSYS will translate web paths as if they were file paths
+
+This tests if CGI files from before d0db3462d568 still work.
+
+ $ hg init test
+ $ cat >hgweb.cgi <<HGWEB
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to use hgweb, edit as necessary
+ >
+ > import cgitb, os, sys
+ > cgitb.enable()
+ >
+ > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
+ > from mercurial import hgweb
+ >
+ > h = hgweb.hgweb("test", "Empty test repository")
+ > h.run()
+ > HGWEB
+
+ $ chmod 755 hgweb.cgi
+
+ $ cat >hgweb.config <<HGWEBDIRCONF
+ > [paths]
+ > test = test
+ > HGWEBDIRCONF
+
+ $ cat >hgwebdir.cgi <<HGWEBDIR
+ > #!/usr/bin/env python
+ > #
+ > # An example CGI script to export multiple hgweb repos, edit as necessary
+ >
+ > import cgitb, sys
+ > cgitb.enable()
+ >
+ > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
+ > from mercurial import hgweb
+ >
+ > # The config file looks like this. You can have paths to individual
+ > # repos, collections of repos in a directory tree, or both.
+ > #
+ > # [paths]
+ > # virtual/path = /real/path
+ > # virtual/path = /real/path
+ > #
+ > # [collections]
+ > # /prefix/to/strip/off = /root/of/tree/full/of/repos
+ > #
+ > # collections example: say directory tree /foo contains repos /foo/bar,
+ > # /foo/quux/baz. Give this config section:
+ > # [collections]
+ > # /foo = /foo
+ > # Then repos will list as bar and quux/baz.
+ >
+ > # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
+ > # or use a dictionary with entries like 'virtual/path': '/real/path'
+ >
+ > h = hgweb.hgwebdir("hgweb.config")
+ > h.run()
+ > HGWEBDIR
+
+ $ chmod 755 hgwebdir.cgi
+
+ $ . "$TESTDIR/cgienv"
+ $ python hgweb.cgi > page1
+ $ python hgwebdir.cgi > page2
+
+ $ PATH_INFO="/test/"
+ $ PATH_TRANSLATED="/var/something/test.cgi"
+ $ REQUEST_URI="/test/test/"
+ $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
+ $ SCRIPT_URL="/test/test/"
+ $ python hgwebdir.cgi > page3
+
+ $ grep -i error page1 page2 page3
+ [1]
diff --git a/tests/test-parents.t b/tests/test-parents.t
new file mode 100644
index 0000000..36f7c65
--- /dev/null
+++ b/tests/test-parents.t
@@ -0,0 +1,154 @@
+test parents command
+
+ $ hg init repo
+ $ cd repo
+
+no working directory
+
+ $ hg parents
+
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Amab -d '0 0'
+ adding a
+ adding b
+ $ echo a >> a
+ $ hg ci -Ama -d '1 0'
+ $ echo b >> b
+ $ hg ci -Amb -d '2 0'
+ $ echo c > c
+ $ hg ci -Amc -d '3 0'
+ adding c
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo d > c
+ $ hg ci -Amc2 -d '4 0'
+ adding c
+ created new head
+ $ hg up -C 3
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+ $ hg parents
+ changeset: 3:02d851b7e549
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: c
+
+
+ $ hg parents a
+ changeset: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+hg parents c, single revision
+
+ $ hg parents c
+ changeset: 3:02d851b7e549
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: c
+
+
+ $ hg parents -r 3 c
+ abort: 'c' not found in manifest!
+ [255]
+
+ $ hg parents -r 2
+ changeset: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+ $ hg parents -r 2 a
+ changeset: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+
+ $ hg parents -r 2 ../a
+ abort: ../a not under root
+ [255]
+
+
+cd dir; hg parents -r 2 ../a
+
+ $ mkdir dir
+ $ cd dir
+ $ hg parents -r 2 ../a
+ changeset: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+ $ hg parents -r 2 path:a
+ changeset: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: a
+
+ $ cd ..
+
+ $ hg parents -r 2 glob:a
+ abort: can only specify an explicit filename
+ [255]
+
+
+merge working dir with 2 parents, hg parents c
+
+ $ HGMERGE=true hg merge
+ merging c
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg parents c
+ changeset: 3:02d851b7e549
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: c
+
+ changeset: 4:48cee28d4b4e
+ tag: tip
+ parent: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: c2
+
+
+
+merge working dir with 1 parent, hg parents
+
+ $ hg up -C 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ HGMERGE=true hg merge -r 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg parents
+ changeset: 2:6cfac479f009
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b
+
+ changeset: 4:48cee28d4b4e
+ tag: tip
+ parent: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: c2
+
+
+merge working dir with 1 parent, hg parents c
+
+ $ hg parents c
+ changeset: 4:48cee28d4b4e
+ tag: tip
+ parent: 1:d786049f033a
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: c2
+
+
+ $ cd ..
diff --git a/tests/test-parse-date.t b/tests/test-parse-date.t
new file mode 100644
index 0000000..c08b27c
--- /dev/null
+++ b/tests/test-parse-date.t
@@ -0,0 +1,236 @@
+This runs with TZ="GMT"
+
+ $ hg init
+ $ echo "test-parse-date" > a
+ $ hg add a
+ $ hg ci -d "2006-02-01 13:00:30" -m "rev 0"
+ $ echo "hi!" >> a
+ $ hg ci -d "2006-02-01 13:00:30 -0500" -m "rev 1"
+ $ hg tag -d "2006-04-15 13:30" "Hi"
+ $ hg backout --merge -d "2006-04-15 13:30 +0200" -m "rev 3" 1
+ reverting a
+ created new head
+ changeset 3:107ce1ee2b43 backs out changeset 1:25a1420a55f8
+ merging with changeset 3:107ce1ee2b43
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -d "1150000000 14400" -m "rev 4 (merge)"
+ $ echo "fail" >> a
+ $ hg ci -d "should fail" -m "fail"
+ abort: invalid date: 'should fail'
+ [255]
+ $ hg ci -d "100000000000000000 1400" -m "fail"
+ abort: date exceeds 32 bits: 100000000000000000
+ [255]
+ $ hg ci -d "100000 1400000" -m "fail"
+ abort: impossible time zone offset: 1400000
+ [255]
+
+Check with local timezone other than GMT and with DST
+
+ $ TZ="PST+8PDT"
+ $ export TZ
+
+PST=UTC-8 / PDT=UTC-7
+
+ $ hg debugrebuildstate
+ $ echo "a" > a
+ $ hg ci -d "2006-07-15 13:30" -m "summer@UTC-7"
+ $ hg debugrebuildstate
+ $ echo "b" > a
+ $ hg ci -d "2006-07-15 13:30 +0500" -m "summer@UTC+5"
+ $ hg debugrebuildstate
+ $ echo "c" > a
+ $ hg ci -d "2006-01-15 13:30" -m "winter@UTC-8"
+ $ hg debugrebuildstate
+ $ echo "d" > a
+ $ hg ci -d "2006-01-15 13:30 +0500" -m "winter@UTC+5"
+ $ hg log --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+Test issue1014 (fractional timezones)
+
+ $ hg debugdate "1000000000 -16200" # 0430
+ internal: 1000000000 -16200
+ standard: Sun Sep 09 06:16:40 2001 +0430
+ $ hg debugdate "1000000000 -15300" # 0415
+ internal: 1000000000 -15300
+ standard: Sun Sep 09 06:01:40 2001 +0415
+ $ hg debugdate "1000000000 -14400" # 0400
+ internal: 1000000000 -14400
+ standard: Sun Sep 09 05:46:40 2001 +0400
+ $ hg debugdate "1000000000 0" # GMT
+ internal: 1000000000 0
+ standard: Sun Sep 09 01:46:40 2001 +0000
+ $ hg debugdate "1000000000 14400" # -0400
+ internal: 1000000000 14400
+ standard: Sat Sep 08 21:46:40 2001 -0400
+ $ hg debugdate "1000000000 15300" # -0415
+ internal: 1000000000 15300
+ standard: Sat Sep 08 21:31:40 2001 -0415
+ $ hg debugdate "1000000000 16200" # -0430
+ internal: 1000000000 16200
+ standard: Sat Sep 08 21:16:40 2001 -0430
+ $ hg debugdate "Sat Sep 08 21:16:40 2001 +0430"
+ internal: 999967600 -16200
+ standard: Sat Sep 08 21:16:40 2001 +0430
+ $ hg debugdate "Sat Sep 08 21:16:40 2001 -0430"
+ internal: 1000000000 16200
+ standard: Sat Sep 08 21:16:40 2001 -0430
+
+Test 12-hours times
+
+ $ hg debugdate "2006-02-01 1:00:30PM +0000"
+ internal: 1138798830 0
+ standard: Wed Feb 01 13:00:30 2006 +0000
+ $ hg debugdate "1:00:30PM" > /dev/null
+
+Normal range
+
+ $ hg log -d -1
+
+Negative range
+
+ $ hg log -d "--2"
+ abort: -2 must be nonnegative (see 'hg help dates')
+ [255]
+
+Whitespace only
+
+ $ hg log -d " "
+ abort: dates cannot consist entirely of whitespace
+ [255]
+
+Test date formats with '>' or '<' accompanied by space characters
+
+ $ hg log -d '>' --template '{date|date}\n'
+ abort: invalid day spec, use '>DATE'
+ [255]
+ $ hg log -d '<' --template '{date|date}\n'
+ abort: invalid day spec, use '<DATE'
+ [255]
+
+ $ hg log -d ' >' --template '{date|date}\n'
+ abort: invalid day spec, use '>DATE'
+ [255]
+ $ hg log -d ' <' --template '{date|date}\n'
+ abort: invalid day spec, use '<DATE'
+ [255]
+
+ $ hg log -d '> ' --template '{date|date}\n'
+ abort: invalid day spec, use '>DATE'
+ [255]
+ $ hg log -d '< ' --template '{date|date}\n'
+ abort: invalid day spec, use '<DATE'
+ [255]
+
+ $ hg log -d ' > ' --template '{date|date}\n'
+ abort: invalid day spec, use '>DATE'
+ [255]
+ $ hg log -d ' < ' --template '{date|date}\n'
+ abort: invalid day spec, use '<DATE'
+ [255]
+
+ $ hg log -d '>02/01' --template '{date|date}\n'
+ $ hg log -d '<02/01' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d ' >02/01' --template '{date|date}\n'
+ $ hg log -d ' <02/01' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d '> 02/01' --template '{date|date}\n'
+ $ hg log -d '< 02/01' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d ' > 02/01' --template '{date|date}\n'
+ $ hg log -d ' < 02/01' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d '>02/01 ' --template '{date|date}\n'
+ $ hg log -d '<02/01 ' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d ' >02/01 ' --template '{date|date}\n'
+ $ hg log -d ' <02/01 ' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d '> 02/01 ' --template '{date|date}\n'
+ $ hg log -d '< 02/01 ' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
+
+ $ hg log -d ' > 02/01 ' --template '{date|date}\n'
+ $ hg log -d ' < 02/01 ' --template '{date|date}\n'
+ Sun Jan 15 13:30:00 2006 +0500
+ Sun Jan 15 13:30:00 2006 -0800
+ Sat Jul 15 13:30:00 2006 +0500
+ Sat Jul 15 13:30:00 2006 -0700
+ Sun Jun 11 00:26:40 2006 -0400
+ Sat Apr 15 13:30:00 2006 +0200
+ Sat Apr 15 13:30:00 2006 +0000
+ Wed Feb 01 13:00:30 2006 -0500
+ Wed Feb 01 13:00:30 2006 +0000
diff --git a/tests/test-parseindex.t b/tests/test-parseindex.t
new file mode 100644
index 0000000..6807f50
--- /dev/null
+++ b/tests/test-parseindex.t
@@ -0,0 +1,61 @@
+revlog.parseindex must be able to parse the index file even if
+an index entry is split between two 64k blocks. The ideal test
+would be to create an index file with inline data where
+64k < size < 64k + 64 (64k is the size of the read buffer, 64 is
+the size of an index entry) and with an index entry starting right
+before the 64k block boundary, and try to read it.
+We approximate that by reducing the read buffer to 1 byte.
+
+ $ hg init a
+ $ cd a
+ $ echo abc > foo
+ $ hg add foo
+ $ hg commit -m 'add foo'
+ $ echo >> foo
+ $ hg commit -m 'change foo'
+ $ hg log -r 0:
+ changeset: 0:7c31755bf9b5
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ changeset: 1:26333235a41c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo
+
+ $ cat >> test.py << EOF
+ > from mercurial import changelog, scmutil
+ > from mercurial.node import *
+ >
+ > class singlebyteread(object):
+ > def __init__(self, real):
+ > self.real = real
+ >
+ > def read(self, size=-1):
+ > if size == 65536:
+ > size = 1
+ > return self.real.read(size)
+ >
+ > def __getattr__(self, key):
+ > return getattr(self.real, key)
+ >
+ > def opener(*args):
+ > o = scmutil.opener(*args)
+ > def wrapper(*a):
+ > f = o(*a)
+ > return singlebyteread(f)
+ > return wrapper
+ >
+ > cl = changelog.changelog(opener('.hg/store'))
+ > print len(cl), 'revisions:'
+ > for r in cl:
+ > print short(cl.node(r))
+ > EOF
+ $ python test.py
+ 2 revisions:
+ 7c31755bf9b5
+ 26333235a41c
+
+ $ cd ..
diff --git a/tests/test-parseindex2.py b/tests/test-parseindex2.py
new file mode 100644
index 0000000..1098226
--- /dev/null
+++ b/tests/test-parseindex2.py
@@ -0,0 +1,126 @@
+from mercurial import parsers
+from mercurial.node import nullid, nullrev
+import struct
+
+# This unit test compares the return value of the original Python
+# implementation of parseindex and the new C implementation for
+# an index file with and without inlined data
+
+# original python implementation
+def gettype(q):
+ return int(q & 0xFFFF)
+
+def offset_type(offset, type):
+ return long(long(offset) << 16 | type)
+
+indexformatng = ">Qiiiiii20s12x"
+
+def py_parseindex(data, inline) :
+ s = 64
+ cache = None
+ index = []
+ nodemap = {nullid: nullrev}
+ n = off = 0
+
+ l = len(data) - s
+ append = index.append
+ if inline:
+ cache = (0, data)
+ while off <= l:
+ e = struct.unpack(indexformatng, data[off:off + s])
+ nodemap[e[7]] = n
+ append(e)
+ n += 1
+ if e[1] < 0:
+ break
+ off += e[1] + s
+ else:
+ while off <= l:
+ e = struct.unpack(indexformatng, data[off:off + s])
+ nodemap[e[7]] = n
+ append(e)
+ n += 1
+ off += s
+
+ e = list(index[0])
+ type = gettype(e[0])
+ e[0] = offset_type(0, type)
+ index[0] = tuple(e)
+
+ # add the magic null revision at -1
+ index.append((0, 0, 0, -1, -1, -1, -1, nullid))
+
+ return index, cache
+
+data_inlined = '\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x8c' \
+ '\x00\x00\x04\x07\x00\x00\x00\x00\x00\x00\x15\x15\xff\xff\xff' \
+ '\xff\xff\xff\xff\xff\xebG\x97\xb7\x1fB\x04\xcf\x13V\x81\tw\x1b' \
+ 'w\xdduR\xda\xc6\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
+ 'x\x9c\x9d\x93?O\xc30\x10\xc5\xf7|\x8a\xdb\x9a\xa8m\x06\xd8*\x95' \
+ '\x81B\xa1\xa2\xa2R\xcb\x86Pd\x9a\x0b5$vd_\x04\xfd\xf6\x9c\xff@' \
+ '\x11!\x0b\xd9\xec\xf7\xbbw\xe7gG6\xad6\x04\xdaN\xc0\x92\xa0$)' \
+ '\xb1\x82\xa2\xd1%\x16\xa4\x8b7\xa9\xca\xd4-\xb2Y\x02\xfc\xc9' \
+ '\xcaS\xf9\xaeX\xed\xb6\xd77Q\x02\x83\xd4\x19\xf5--Y\xea\xe1W' \
+ '\xab\xed\x10\xceR\x0f_\xdf\xdf\r\xe1,\xf5\xf0\xcb\xf5 \xceR\x0f' \
+ '_\xdc\x0e\x0e\xc3R\x0f_\xae\x96\x9b!\x9e\xa5\x1e\xbf\xdb,\x06' \
+ '\xc7q\x9a/\x88\x82\xc3B\xea\xb5\xb4TJ\x93\xb6\x82\x0e\xe16\xe6' \
+ 'KQ\xdb\xaf\xecG\xa3\xd1 \x01\xd3\x0b_^\xe8\xaa\xa0\xae\xad\xd1' \
+ '&\xbef\x1bz\x08\xb0|\xc9Xz\x06\xf6Z\x91\x90J\xaa\x17\x90\xaa' \
+ '\xd2\xa6\x11$5C\xcf\xba#\xa0\x03\x02*2\x92-\xfc\xb1\x94\xdf\xe2' \
+ '\xae\xb8\'m\x8ey0^\x85\xd3\x82\xb4\xf0`:\x9c\x00\x8a\xfd\x01' \
+ '\xb0\xc6\x86\x8b\xdd\xae\x80\xf3\xa9\x9fd\x16\n\x00R%\x1a\x06' \
+ '\xe9\xd8b\x98\x1d\xf4\xf3+\x9bf\x01\xd8p\x1b\xf3.\xed\x9f^g\xc3' \
+ '^\xd9W81T\xdb\xd5\x04sx|\xf2\xeb\xd6`%?x\xed"\x831\xbf\xf3\xdc' \
+ 'b\xeb%gaY\xe1\xad\x9f\xb9f\'1w\xa9\xa5a\x83s\x82J\xb98\xbc4\x8b' \
+ '\x83\x00\x9f$z\xb8#\xa5\xb1\xdf\x98\xd9\xec\x1b\x89O\xe3Ts\x9a4' \
+ '\x17m\x8b\xfc\x8f\xa5\x95\x9a\xfc\xfa\xed,\xe5|\xa1\xfe\x15\xb9' \
+ '\xbc\xb2\x93\x1f\xf2\x95\xff\xdf,\x1a\xc5\xe7\x17*\x93Oz:>\x0e'
+
+data_non_inlined = '\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01D\x19' \
+ '\x00\x07e\x12\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff' \
+ '\xff\xff\xff\xff\xd1\xf4\xbb\xb0\xbe\xfc\x13\xbd\x8c\xd3\x9d' \
+ '\x0f\xcd\xd9;\x8c\x07\x8cJ/\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
+ '\x00\x00\x00\x00\x00\x00\x01D\x19\x00\x00\x00\x00\x00\xdf\x00' \
+ '\x00\x01q\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\xff' \
+ '\xff\xff\xff\xc1\x12\xb9\x04\x96\xa4Z1t\x91\xdfsJ\x90\xf0\x9bh' \
+ '\x07l&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' \
+ '\x00\x01D\xf8\x00\x00\x00\x00\x01\x1b\x00\x00\x01\xb8\x00\x00' \
+ '\x00\x01\x00\x00\x00\x02\x00\x00\x00\x01\xff\xff\xff\xff\x02\n' \
+ '\x0e\xc6&\xa1\x92\xae6\x0b\x02i\xfe-\xe5\xbao\x05\xd1\xe7\x00' \
+ '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01F' \
+ '\x13\x00\x00\x00\x00\x01\xec\x00\x00\x03\x06\x00\x00\x00\x01' \
+ '\x00\x00\x00\x03\x00\x00\x00\x02\xff\xff\xff\xff\x12\xcb\xeby1' \
+ '\xb6\r\x98B\xcb\x07\xbd`\x8f\x92\xd9\xc4\x84\xbdK\x00\x00\x00' \
+ '\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+
+def parse_index2(data, inline):
+ index, chunkcache = parsers.parse_index2(data, inline)
+ return list(index), chunkcache
+
+def runtest() :
+ py_res_1 = py_parseindex(data_inlined, True)
+ c_res_1 = parse_index2(data_inlined, True)
+
+ py_res_2 = py_parseindex(data_non_inlined, False)
+ c_res_2 = parse_index2(data_non_inlined, False)
+
+ if py_res_1 != c_res_1:
+ print "Parse index result (with inlined data) differs!"
+
+ if py_res_2 != c_res_2:
+ print "Parse index result (no inlined data) differs!"
+
+ ix = parsers.parse_index2(data_inlined, True)[0]
+ for i, r in enumerate(ix):
+ if r[7] == nullid:
+ i = -1
+ try:
+ if ix[r[7]] != i:
+ print 'Reverse lookup inconsistent for %r' % r[7].encode('hex')
+ except TypeError:
+ # pure version doesn't support this
+ break
+
+ print "done"
+
+runtest()
diff --git a/tests/test-parseindex2.py.out b/tests/test-parseindex2.py.out
new file mode 100644
index 0000000..19f86f4
--- /dev/null
+++ b/tests/test-parseindex2.py.out
@@ -0,0 +1 @@
+done
diff --git a/tests/test-patch-offset.t b/tests/test-patch-offset.t
new file mode 100644
index 0000000..02508c5
--- /dev/null
+++ b/tests/test-patch-offset.t
@@ -0,0 +1,79 @@
+
+ $ cat > writepatterns.py <<EOF
+ > import sys
+ >
+ > path = sys.argv[1]
+ > patterns = sys.argv[2:]
+ >
+ > fp = file(path, 'wb')
+ > for pattern in patterns:
+ > count = int(pattern[0:-1])
+ > char = pattern[-1] + '\n'
+ > fp.write(char*count)
+ > fp.close()
+ > EOF
+
+prepare repo
+
+ $ hg init a
+ $ cd a
+
+These initial lines of Xs were not in the original file used to generate
+the patch. So all the patch hunks need to be applied to a constant offset
+within this file. If the offset isn't tracked then the hunks can be
+applied to the wrong lines of this file.
+
+ $ python ../writepatterns.py a 34X 10A 1B 10A 1C 10A 1B 10A 1D 10A 1B 10A 1E 10A 1B 10A
+ $ hg commit -Am adda
+ adding a
+
+This is a cleaner patch generated via diff
+In this case it reproduces the problem when
+the output of hg export does not
+import patch
+
+ $ hg import -v -m 'b' -d '2 0' - <<EOF
+ > --- a/a 2009-12-08 19:26:17.000000000 -0800
+ > +++ b/a 2009-12-08 19:26:17.000000000 -0800
+ > @@ -9,7 +9,7 @@
+ > A
+ > A
+ > B
+ > -A
+ > +a
+ > A
+ > A
+ > A
+ > @@ -53,7 +53,7 @@
+ > A
+ > A
+ > B
+ > -A
+ > +a
+ > A
+ > A
+ > A
+ > @@ -75,7 +75,7 @@
+ > A
+ > A
+ > B
+ > -A
+ > +a
+ > A
+ > A
+ > A
+ > EOF
+ applying patch from stdin
+ patching file a
+ Hunk #1 succeeded at 43 (offset 34 lines).
+ Hunk #2 succeeded at 87 (offset 34 lines).
+ Hunk #3 succeeded at 109 (offset 34 lines).
+ a
+ created 189885cecb41
+
+compare imported changes against reference file
+
+ $ python ../writepatterns.py aref 34X 10A 1B 1a 9A 1C 10A 1B 10A 1D 10A 1B 1a 9A 1E 10A 1B 1a 9A
+ $ diff aref a
+
+ $ cd ..
diff --git a/tests/test-patch.t b/tests/test-patch.t
new file mode 100644
index 0000000..6528ce0
--- /dev/null
+++ b/tests/test-patch.t
@@ -0,0 +1,89 @@
+ $ cat > patchtool.py <<EOF
+ > import sys
+ > print 'Using custom patch'
+ > if '--binary' in sys.argv:
+ > print '--binary found !'
+ > EOF
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "patch=python ../patchtool.py" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg commit -Ama -d '1 0'
+ adding a
+ $ echo b >> a
+ $ hg commit -Amb -d '2 0'
+ $ cd ..
+
+This test checks that:
+ - custom patch commands with arguments actually work
+ - patch code does not try to add weird arguments like
+ --binary when custom patch commands are used. For instance
+ --binary is added by default under win32.
+
+check custom patch options are honored
+
+ $ hg --cwd a export -o ../a.diff tip
+ $ hg clone -r 0 a b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg --cwd b import -v ../a.diff
+ applying ../a.diff
+ Using custom patch
+ applied to working directory
+
+Issue2417: hg import with # comments in description
+
+Prepare source repo and patch:
+
+ $ rm $HGRCPATH
+ $ hg init c
+ $ cd c
+ $ printf "a\rc" > a
+ $ hg ci -A -m 0 a -d '0 0'
+ $ printf "a\rb\rc" > a
+ $ cat << eof > log
+ > first line which can't start with '# '
+ > # second line is a comment but that shouldn't be a problem.
+ > A patch marker like this was more problematic even after d7452292f9d3:
+ > # HG changeset patch
+ > # User lines looks like this - but it _is_ just a comment
+ > eof
+ $ hg ci -l log -d '0 0'
+ $ hg export -o p 1
+ $ cd ..
+
+Clone and apply patch:
+
+ $ hg clone -r 0 c d
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd d
+ $ hg import ../c/p
+ applying ../c/p
+ $ hg log -v -r 1
+ changeset: 1:cd0bde79c428
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ first line which can't start with '# '
+ # second line is a comment but that shouldn't be a problem.
+ A patch marker like this was more problematic even after d7452292f9d3:
+ # HG changeset patch
+ # User lines looks like this - but it _is_ just a comment
+
+
+ $ cd ..
diff --git a/tests/test-patchbomb.t b/tests/test-patchbomb.t
new file mode 100644
index 0000000..3ce7407
--- /dev/null
+++ b/tests/test-patchbomb.t
@@ -0,0 +1,2351 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "patchbomb=" >> $HGRCPATH
+
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg commit -Ama -d '1 0'
+ adding a
+
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -r tip
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+ $ hg --config ui.interactive=1 email --confirm -n -f quux -t foo -c bar -r tip<<EOF
+ > n
+ > EOF
+ this patch series consists of 1 patches.
+
+
+ Final summary:
+
+ From: quux
+ To: foo
+ Cc: bar
+ Subject: [PATCH] a
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ are you sure you want to send (yn)? abort: patchbomb canceled
+ [255]
+
+ $ echo b > b
+ $ hg commit -Amb -d '2 0'
+ adding b
+
+ $ hg email --date '1970-1-1 0:2' -n -f quux -t foo -c bar -s test -r 0:tip
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2] test
+ Message-Id: <patchbomb.120@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:02:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.121@*> (glob)
+ In-Reply-To: <patchbomb.120@*> (glob)
+ References: <patchbomb.120@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:02:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.122@*> (glob)
+ In-Reply-To: <patchbomb.120@*> (glob)
+ References: <patchbomb.120@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:02:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+.hg/last-email.txt
+
+ $ cat > editor.sh << '__EOF__'
+ > echo "a precious introductory message" > "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg email -n -t foo -s test -r 0:tip > /dev/null
+ $ cat .hg/last-email.txt
+ a precious introductory message
+
+ $ hg email -m test.mbox -f quux -t foo -c bar -s test 0:tip \
+ > --config extensions.progress= --config progress.assume-tty=1 \
+ > --config progress.delay=0 --config progress.refresh=0 \
+ > --config progress.width=60 2>&1 | \
+ > python "$TESTDIR/filtercr.py"
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ sending [ ] 0/3
+ sending [ ] 0/3
+
+
+ sending [==============> ] 1/3
+ sending [==============> ] 1/3
+
+
+ sending [=============================> ] 2/3
+ sending [=============================> ] 2/3
+ \r (esc)
+ sending [PATCH 0 of 2] test ...
+ sending [PATCH 1 of 2] a ...
+ sending [PATCH 2 of 2] b ...
+
+
+ $ cd ..
+
+ $ hg clone -q t t2
+ $ cd t2
+ $ echo c > c
+ $ hg commit -Amc -d '3 0'
+ adding c
+
+ $ cat > description <<EOF
+ > a multiline
+ >
+ > description
+ > EOF
+
+
+test bundle and description:
+ $ hg email --date '1970-1-1 0:3' -n -f quux -t foo \
+ > -c bar -s test -r tip -b --desc description
+ searching for changes
+ 1 changesets found
+
+ displaying test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: test
+ Message-Id: <patchbomb.180@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:03:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ a multiline
+
+ description
+
+ --===* (glob)
+ Content-Type: application/x-mercurial-bundle
+ MIME-Version: 1.0
+ Content-Disposition: attachment; filename="bundle.hg"
+ Content-Transfer-Encoding: base64
+
+ SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
+ 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
+ oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
+ Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
+ SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
+ sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
+ Q70eyNw=
+ --===*-- (glob)
+
+utf-8 patch:
+ $ python -c 'fp = open("utf", "wb"); fp.write("h\xC3\xB6mma!\n"); fp.close();'
+ $ hg commit -A -d '4 0' -m 'utf-8 content'
+ adding description
+ adding utf
+
+no mime encoding for email --test:
+ $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] utf-8 content ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 8bit
+ Subject: [PATCH] utf-8 content
+ X-Mercurial-Node: 909a00e13e9d78b575aeee23dddbada46d5a143f
+ Message-Id: <909a00e13e9d78b575ae.240@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:04:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID 909a00e13e9d78b575aeee23dddbada46d5a143f
+ # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ utf-8 content
+
+ diff -r ff2c9fa2018b -r 909a00e13e9d description
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/description Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,3 @@
+ +a multiline
+ +
+ +description
+ diff -r ff2c9fa2018b -r 909a00e13e9d utf
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/utf Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +h\xc3\xb6mma! (esc)
+
+
+mime encoded mbox (base64):
+ $ hg email --date '1970-1-1 0:4' -f 'Q <quux>' -t foo -c bar -r tip -m mbox
+ this patch series consists of 1 patches.
+
+
+ sending [PATCH] utf-8 content ...
+
+ $ cat mbox
+ From quux ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="utf-8"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: base64
+ Subject: [PATCH] utf-8 content
+ X-Mercurial-Node: 909a00e13e9d78b575aeee23dddbada46d5a143f
+ Message-Id: <909a00e13e9d78b575ae.240@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:04:00 +0000
+ From: Q <quux>
+ To: foo
+ Cc: bar
+
+ IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgOTA5
+ YTAwZTEzZTlkNzhiNTc1YWVlZTIzZGRkYmFkYTQ2ZDVhMTQzZgojIFBhcmVudCAgZmYyYzlmYTIw
+ MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5Zgp1dGYtOCBjb250ZW50CgpkaWZmIC1yIGZm
+ MmM5ZmEyMDE4YiAtciA5MDlhMDBlMTNlOWQgZGVzY3JpcHRpb24KLS0tIC9kZXYvbnVsbAlUaHUg
+ SmFuIDAxIDAwOjAwOjAwIDE5NzAgKzAwMDAKKysrIGIvZGVzY3JpcHRpb24JVGh1IEphbiAwMSAw
+ MDowMDowNCAxOTcwICswMDAwCkBAIC0wLDAgKzEsMyBAQAorYSBtdWx0aWxpbmUKKworZGVzY3Jp
+ cHRpb24KZGlmZiAtciBmZjJjOWZhMjAxOGIgLXIgOTA5YTAwZTEzZTlkIHV0ZgotLS0gL2Rldi9u
+ dWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi91dGYJVGh1IEphbiAwMSAw
+ MDowMDowNCAxOTcwICswMDAwCkBAIC0wLDAgKzEsMSBAQAoraMO2bW1hIQo=
+
+
+ $ python -c 'print open("mbox").read().split("\n\n")[1].decode("base64")'
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID 909a00e13e9d78b575aeee23dddbada46d5a143f
+ # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ utf-8 content
+
+ diff -r ff2c9fa2018b -r 909a00e13e9d description
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/description Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,3 @@
+ +a multiline
+ +
+ +description
+ diff -r ff2c9fa2018b -r 909a00e13e9d utf
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/utf Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +h\xc3\xb6mma! (esc)
+
+ $ rm mbox
+
+mime encoded mbox (quoted-printable):
+ $ python -c 'fp = open("long", "wb"); fp.write("%s\nfoo\n\nbar\n" % ("x" * 1024)); fp.close();'
+ $ hg commit -A -d '4 0' -m 'long line'
+ adding long
+
+no mime encoding for email --test:
+ $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] long line ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Subject: [PATCH] long line
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.240@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:04:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+
+mime encoded mbox (quoted-printable):
+ $ hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
+ this patch series consists of 1 patches.
+
+
+ sending [PATCH] long line ...
+ $ cat mbox
+ From quux ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Subject: [PATCH] long line
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.240@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:04:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+
+
+ $ rm mbox
+
+iso-8859-1 patch:
+ $ python -c 'fp = open("isolatin", "wb"); fp.write("h\xF6mma!\n"); fp.close();'
+ $ hg commit -A -d '5 0' -m 'isolatin 8-bit encoding'
+ adding isolatin
+
+fake ascii mbox:
+ $ hg email --date '1970-1-1 0:5' -f quux -t foo -c bar -r tip -m mbox
+ this patch series consists of 1 patches.
+
+
+ sending [PATCH] isolatin 8-bit encoding ...
+ $ cat mbox
+ From quux ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 8bit
+ Subject: [PATCH] isolatin 8-bit encoding
+ X-Mercurial-Node: 240fb913fc1b7ff15ddb9f33e73d82bf5277c720
+ Message-Id: <240fb913fc1b7ff15ddb.300@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:05:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 5 0
+ # Node ID 240fb913fc1b7ff15ddb9f33e73d82bf5277c720
+ # Parent a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ isolatin 8-bit encoding
+
+ diff -r a2ea8fc83dd8 -r 240fb913fc1b isolatin
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
+ @@ -0,0 +1,1 @@
+ +h\xf6mma! (esc)
+
+
+
+test diffstat for single patch:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y -r 2
+ this patch series consists of 1 patches.
+
+
+ Final summary:
+
+ From: quux
+ To: foo
+ Cc: bar
+ Subject: [PATCH] test
+ c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ are you sure you want to send (yn)? y
+
+ displaying [PATCH] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ c | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test diffstat for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y \
+ > -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ Final summary:
+
+ From: quux
+ To: foo
+ Cc: bar
+ Subject: [PATCH 0 of 2] test
+ a | 1 +
+ b | 1 +
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+ Subject: [PATCH 1 of 2] a
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+ Subject: [PATCH 2 of 2] b
+ b | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ are you sure you want to send (yn)? y
+
+ displaying [PATCH 0 of 2] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ a | 1 +
+ b | 1 +
+ 2 files changed, 2 insertions(+), 0 deletions(-)
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ a | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ b | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+test inline for single patch:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=t2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ --===*-- (glob)
+
+
+test inline for single patch (quoted-printable):
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 4
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Content-Disposition: inline; filename=t2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+ --===*-- (glob)
+
+test inline for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i \
+ > -r 0:1 -r 4
+ this patch series consists of 3 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 3] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 3] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 3] a ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 1 of 3] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=t2-1.patch
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ --===*-- (glob)
+ displaying [PATCH 2 of 3] b ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 2 of 3] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=t2-2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ --===*-- (glob)
+ displaying [PATCH 3 of 3] long line ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 3 of 3] long line
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.63@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:03 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Content-Disposition: inline; filename=t2-3.patch
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+ --===*-- (glob)
+
+test attach for single patch:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ Patch subject is complete summary.
+
+
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename=t2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ --===*-- (glob)
+
+test attach for single patch (quoted-printable):
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a -r 4
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ Patch subject is complete summary.
+
+
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Content-Disposition: attachment; filename=t2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+ --===*-- (glob)
+
+test attach and body for single patch:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a --body -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename=t2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ --===*-- (glob)
+
+test attach for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a \
+ > -r 0:1 -r 4
+ this patch series consists of 3 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 3] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 3] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 3] a ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 1 of 3] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ Patch subject is complete summary.
+
+
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename=t2-1.patch
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ --===*-- (glob)
+ displaying [PATCH 2 of 3] b ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 2 of 3] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ Patch subject is complete summary.
+
+
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename=t2-2.patch
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ --===*-- (glob)
+ displaying [PATCH 3 of 3] long line ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 3 of 3] long line
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.63@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:03 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+
+ Patch subject is complete summary.
+
+
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Content-Disposition: attachment; filename=t2-3.patch
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+ --===*-- (glob)
+
+test intro for single patch:
+ $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
+ > -r 2
+ this patch series consists of 1 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 1] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 1] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 1] c ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 1] c
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test --desc without --intro for a single patch:
+ $ echo foo > intro.text
+ $ hg email --date '1970-1-1 0:1' -n --desc intro.text -f quux -t foo -c bar \
+ > -s test -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH 0 of 1] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 1] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ foo
+
+ displaying [PATCH 1 of 1] c ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 1] c
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test intro for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test \
+ > -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+test reply-to via config:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
+ > --config patchbomb.reply-to='baz@example.com'
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+ Reply-To: baz@example.com
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test reply-to via command line:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -r 2 \
+ > --reply-to baz --reply-to fred
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+ Reply-To: baz, fred
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+tagging csets:
+ $ hg tag -r0 zero zero.foo
+ $ hg tag -r1 one one.patch
+ $ hg tag -r2 two two.diff
+
+test inline for single named patch:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] test ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=two.diff
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ --===*-- (glob)
+
+test inline for multiple named/unnamed patches:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=t2-1.patch
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ --===*-- (glob)
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: multipart/mixed; boundary="===*" (glob)
+ MIME-Version: 1.0
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ --===* (glob)
+ Content-Type: text/x-patch; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: inline; filename=one.patch
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+ --===*-- (glob)
+
+
+test inreplyto:
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
+ > -r tip
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] Added tag two, two.diff for changeset ff2c9fa2018b
+ X-Mercurial-Node: 7aead2484924c445ad8ce2613df91f52f9e502ed
+ Message-Id: <7aead2484924c445ad8c.60@*> (glob)
+ In-Reply-To: <baz>
+ References: <baz>
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 7aead2484924c445ad8ce2613df91f52f9e502ed
+ # Parent 045ca29b1ea20e4940411e695e20e521f2f0f98e
+ Added tag two, two.diff for changeset ff2c9fa2018b
+
+ diff -r 045ca29b1ea2 -r 7aead2484924 .hgtags
+ --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ @@ -2,3 +2,5 @@
+ 8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
+ 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one
+ 97d72e5f12c7e84f85064aa72e5a297142c36ed9 one.patch
+ +ff2c9fa2018b15fa74b33363bda9527323e2a99f two
+ +ff2c9fa2018b15fa74b33363bda9527323e2a99f two.diff
+
+no intro message in non-interactive mode
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
+ > -r 0:1
+ this patch series consists of 2 patches.
+
+ (optional) Subject: [PATCH 0 of 2]
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.60@*> (glob)
+ In-Reply-To: <baz>
+ References: <baz>
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.61@*> (glob)
+ In-Reply-To: <8580ff50825a50c8f716.60@*> (glob)
+ References: <8580ff50825a50c8f716.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+
+
+ $ hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar --in-reply-to baz \
+ > -s test -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2] test
+ Message-Id: <patchbomb.60@*> (glob)
+ In-Reply-To: <baz>
+ References: <baz>
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+test single flag for single patch:
+ $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
+ > -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH fooFlag] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH fooFlag] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test single flag for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n --flag fooFlag -f quux -t foo -c bar -s test \
+ > -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2 fooFlag] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2 fooFlag] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2 fooFlag] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2 fooFlag] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2 fooFlag] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2 fooFlag] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+test mutiple flags for single patch:
+ $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
+ > -c bar -s test -r 2
+ this patch series consists of 1 patches.
+
+
+ displaying [PATCH fooFlag barFlag] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH fooFlag barFlag] test
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+
+test multiple flags for multiple patches:
+ $ hg email --date '1970-1-1 0:1' -n --flag fooFlag --flag barFlag -f quux -t foo \
+ > -c bar -s test -r 0:1
+ this patch series consists of 2 patches.
+
+
+ Write the introductory message for the patch series.
+
+
+ displaying [PATCH 0 of 2 fooFlag barFlag] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 2 fooFlag barFlag] test
+ Message-Id: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:00 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+
+ displaying [PATCH 1 of 2 fooFlag barFlag] a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 2 fooFlag barFlag] a
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.61@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:01 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+ displaying [PATCH 2 of 2 fooFlag barFlag] b ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 2 of 2 fooFlag barFlag] b
+ X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ Message-Id: <97d72e5f12c7e84f8506.62@*> (glob)
+ In-Reply-To: <patchbomb.60@*> (glob)
+ References: <patchbomb.60@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Thu, 01 Jan 1970 00:01:02 +0000
+ From: quux
+ To: foo
+ Cc: bar
+
+ # HG changeset patch
+ # User test
+ # Date 2 0
+ # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ b
+
+ diff -r 8580ff50825a -r 97d72e5f12c7 b
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/b Thu Jan 01 00:00:02 1970 +0000
+ @@ -0,0 +1,1 @@
+ +b
+
+
+test multi-address parsing:
+ $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t 'spam<spam><eggs>' \
+ > -t toast -c 'foo,bar@example.com' -c '"A, B <>" <a@example.com>' -s test -r 0 \
+ > --config email.bcc='"Quux, A." <quux>'
+ this patch series consists of 1 patches.
+
+
+ sending [PATCH] test ...
+ $ cat < tmp.mbox
+ From quux ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:00 +0000
+ From: quux
+ To: spam <spam>, eggs, toast
+ Cc: foo, bar@example.com, "A, B <>" <a@example.com>
+ Bcc: "Quux, A." <quux>
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+
+test multi-byte domain parsing:
+ $ UUML=`python -c 'import sys; sys.stdout.write("\374")'`
+ $ HGENCODING=iso-8859-1
+ $ export HGENCODING
+ $ hg email --date '1980-1-1 0:1' -m tmp.mbox -f quux -t "bar@${UUML}nicode.com" -s test -r 0
+ this patch series consists of 1 patches.
+
+ Cc:
+
+ sending [PATCH] test ...
+
+ $ cat tmp.mbox
+ From quux ... ... .. ..:..:.. .... (re)
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ Message-Id: <8580ff50825a50c8f716.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:00 +0000
+ From: quux
+ To: bar@xn--nicode-2ya.com
+
+ # HG changeset patch
+ # User test
+ # Date 1 0
+ # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
+ # Parent 0000000000000000000000000000000000000000
+ a
+
+ diff -r 000000000000 -r 8580ff50825a a
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:01 1970 +0000
+ @@ -0,0 +1,1 @@
+ +a
+
+
+
+test outgoing:
+ $ hg up 1
+ 0 files updated, 0 files merged, 6 files removed, 0 files unresolved
+
+ $ hg branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ echo d > d
+ $ hg add d
+ $ hg ci -md -d '4 0'
+ $ echo d >> d
+ $ hg ci -mdd -d '5 0'
+ $ hg --config extensions.graphlog= glog --template "{rev}:{node|short} {desc|firstline}\n"
+ @ 10:3b6f1ec9dde9 dd
+ |
+ o 9:2f9fa9b998c5 d
+ |
+ | o 8:7aead2484924 Added tag two, two.diff for changeset ff2c9fa2018b
+ | |
+ | o 7:045ca29b1ea2 Added tag one, one.patch for changeset 97d72e5f12c7
+ | |
+ | o 6:5d5ef15dfe5e Added tag zero, zero.foo for changeset 8580ff50825a
+ | |
+ | o 5:240fb913fc1b isolatin 8-bit encoding
+ | |
+ | o 4:a2ea8fc83dd8 long line
+ | |
+ | o 3:909a00e13e9d utf-8 content
+ | |
+ | o 2:ff2c9fa2018b c
+ |/
+ o 1:97d72e5f12c7 b
+ |
+ o 0:8580ff50825a a
+
+ $ hg phase --force --secret -r 10
+ $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t -r 'rev(10) or rev(6)'
+ comparing with ../t
+ From [test]: test
+ this patch series consists of 6 patches.
+
+
+ Write the introductory message for the patch series.
+
+ Cc:
+
+ displaying [PATCH 0 of 6] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 0 of 6] test
+ Message-Id: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:00 +0000
+ From: test
+ To: foo
+
+
+ displaying [PATCH 1 of 6] c ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 1 of 6] c
+ X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ Message-Id: <ff2c9fa2018b15fa74b3.315532861@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:01 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 3 0
+ # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ c
+
+ diff -r 97d72e5f12c7 -r ff2c9fa2018b c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/c Thu Jan 01 00:00:03 1970 +0000
+ @@ -0,0 +1,1 @@
+ +c
+
+ displaying [PATCH 2 of 6] utf-8 content ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 8bit
+ Subject: [PATCH 2 of 6] utf-8 content
+ X-Mercurial-Node: 909a00e13e9d78b575aeee23dddbada46d5a143f
+ Message-Id: <909a00e13e9d78b575ae.315532862@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:02 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID 909a00e13e9d78b575aeee23dddbada46d5a143f
+ # Parent ff2c9fa2018b15fa74b33363bda9527323e2a99f
+ utf-8 content
+
+ diff -r ff2c9fa2018b -r 909a00e13e9d description
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/description Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,3 @@
+ +a multiline
+ +
+ +description
+ diff -r ff2c9fa2018b -r 909a00e13e9d utf
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/utf Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +h\xc3\xb6mma! (esc)
+
+ displaying [PATCH 3 of 6] long line ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: quoted-printable
+ Subject: [PATCH 3 of 6] long line
+ X-Mercurial-Node: a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ Message-Id: <a2ea8fc83dd8b93cfd86.315532863@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:03 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Node ID a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ # Parent 909a00e13e9d78b575aeee23dddbada46d5a143f
+ long line
+
+ diff -r 909a00e13e9d -r a2ea8fc83dd8 long
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/long Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,4 @@
+ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ +foo
+ +
+ +bar
+
+ displaying [PATCH 4 of 6] isolatin 8-bit encoding ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 8bit
+ Subject: [PATCH 4 of 6] isolatin 8-bit encoding
+ X-Mercurial-Node: 240fb913fc1b7ff15ddb9f33e73d82bf5277c720
+ Message-Id: <240fb913fc1b7ff15ddb.315532864@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:04 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 5 0
+ # Node ID 240fb913fc1b7ff15ddb9f33e73d82bf5277c720
+ # Parent a2ea8fc83dd8b93cfd86ac97b28287204ab806e1
+ isolatin 8-bit encoding
+
+ diff -r a2ea8fc83dd8 -r 240fb913fc1b isolatin
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/isolatin Thu Jan 01 00:00:05 1970 +0000
+ @@ -0,0 +1,1 @@
+ +h\xf6mma! (esc)
+
+ displaying [PATCH 5 of 6] Added tag zero, zero.foo for changeset 8580ff50825a ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 5 of 6] Added tag zero, zero.foo for changeset 8580ff50825a
+ X-Mercurial-Node: 5d5ef15dfe5e7bd3a4ee154b5fff76c7945ec433
+ Message-Id: <5d5ef15dfe5e7bd3a4ee.315532865@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:05 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Node ID 5d5ef15dfe5e7bd3a4ee154b5fff76c7945ec433
+ # Parent 240fb913fc1b7ff15ddb9f33e73d82bf5277c720
+ Added tag zero, zero.foo for changeset 8580ff50825a
+
+ diff -r 240fb913fc1b -r 5d5ef15dfe5e .hgtags
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,2 @@
+ +8580ff50825a50c8f716709acdf8de0deddcd6ab zero
+ +8580ff50825a50c8f716709acdf8de0deddcd6ab zero.foo
+
+ displaying [PATCH 6 of 6] d ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH 6 of 6] d
+ X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
+ Message-Id: <2f9fa9b998c5fe3ac2bd.315532866@*> (glob)
+ In-Reply-To: <patchbomb.315532860@*> (glob)
+ References: <patchbomb.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:06 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Branch test
+ # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ d
+
+ diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/d Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +d
+
+
+dest#branch URIs:
+ $ hg email --date '1980-1-1 0:1' -n -t foo -s test -o ../t#test
+ comparing with ../t
+ From [test]: test
+ this patch series consists of 1 patches.
+
+ Cc:
+
+ displaying [PATCH] test ...
+ Content-Type: text/plain; charset="us-ascii"
+ MIME-Version: 1.0
+ Content-Transfer-Encoding: 7bit
+ Subject: [PATCH] test
+ X-Mercurial-Node: 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
+ Message-Id: <2f9fa9b998c5fe3ac2bd.315532860@*> (glob)
+ User-Agent: Mercurial-patchbomb/* (glob)
+ Date: Tue, 01 Jan 1980 00:01:00 +0000
+ From: test
+ To: foo
+
+ # HG changeset patch
+ # User test
+ # Date 4 0
+ # Branch test
+ # Node ID 2f9fa9b998c5fe3ac2bd9a2b14bfcbeecbc7c268
+ # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
+ d
+
+ diff -r 97d72e5f12c7 -r 2f9fa9b998c5 d
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/d Thu Jan 01 00:00:04 1970 +0000
+ @@ -0,0 +1,1 @@
+ +d
+
+
+ $ cd ..
diff --git a/tests/test-paths.t b/tests/test-paths.t
new file mode 100644
index 0000000..99a45aa
--- /dev/null
+++ b/tests/test-paths.t
@@ -0,0 +1,65 @@
+ $ hg init a
+ $ hg clone a b
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd a
+ $ echo '[paths]' >> .hg/hgrc
+ $ echo 'dupe = ../b' >> .hg/hgrc
+ $ echo 'expand = $SOMETHING/bar' >> .hg/hgrc
+ $ hg in dupe
+ comparing with $TESTTMP/b (glob)
+ no changes found
+ [1]
+ $ cd ..
+ $ hg -R a in dupe
+ comparing with $TESTTMP/b (glob)
+ no changes found
+ [1]
+ $ cd a
+ $ hg paths
+ dupe = $TESTTMP/b (glob)
+ expand = $TESTTMP/a/$SOMETHING/bar (glob)
+ $ SOMETHING=foo hg paths
+ dupe = $TESTTMP/b (glob)
+ expand = $TESTTMP/a/foo/bar (glob)
+#if msys
+ $ SOMETHING=//foo hg paths
+ dupe = $TESTTMP/b (glob)
+ expand = /foo/bar
+#else
+ $ SOMETHING=/foo hg paths
+ dupe = $TESTTMP/b (glob)
+ expand = /foo/bar
+#endif
+ $ hg paths -q
+ dupe
+ expand
+ $ hg paths dupe
+ $TESTTMP/b (glob)
+ $ hg paths -q dupe
+ $ hg paths unknown
+ not found!
+ [1]
+ $ hg paths -q unknown
+ [1]
+ $ cd ..
+
+'file:' disables [paths] entries for clone destination
+
+ $ cat >> $HGRCPATH <<EOF
+ > [paths]
+ > gpath1 = http://hg.example.com
+ > EOF
+
+ $ hg clone a gpath1
+ abort: cannot create new http repository
+ [255]
+
+ $ hg clone a file:gpath1
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd gpath1
+ $ hg -q id
+ 000000000000
+
+ $ cd ..
diff --git a/tests/test-pending.t b/tests/test-pending.t
new file mode 100644
index 0000000..d449d29
--- /dev/null
+++ b/tests/test-pending.t
@@ -0,0 +1,115 @@
+Verify that pending changesets are seen by pretxn* hooks but not by other
+processes that access the destination repo while the hooks are running.
+
+The hooks (python and external) both reject changesets after some think time,
+during which another process runs pull. Each hook creates a file ('notify') to
+indicate to the controlling process that it is running; the process removes the
+file to indicate the hook can terminate.
+
+init env vars
+
+ $ d=`pwd`
+ $ maxwait=20
+
+utility to run the test - start a push in the background and run pull
+
+ $ dotest() {
+ > rm -f notify
+ > printf 'push '; hg -R child-push tip --template '{node}\n'
+ > hg -R child-push -q push > push.out 2>&1 &
+ >
+ > # wait for hook to create the notify file
+ > i=$maxwait
+ > while [ ! -f notify -a $i != 0 ]; do
+ > sleep 1
+ > i=`expr $i - 1`
+ > done
+ >
+ > # run pull
+ > hg -R child-pull -q pull
+ > rc=$?
+ >
+ > # tell hook to finish; notify should exist.
+ > rm notify
+ > wait
+ >
+ > cat push.out
+ > printf 'pull '; hg -R child-pull tip --template '{node}\n'
+ > return $rc
+ > }
+
+python hook
+
+ $ cat <<EOF > reject.py
+ > import os, time
+ > from mercurial import ui, localrepo
+ > def rejecthook(ui, repo, hooktype, node, **opts):
+ > ui.write('hook %s\\n' % repo['tip'].hex())
+ > # create the notify file so caller knows we're running
+ > fpath = os.path.join('$d', 'notify')
+ > f = open(fpath, 'w')
+ > f.close()
+ > # wait for ack - caller should delete the notify file
+ > i = $maxwait
+ > while os.path.exists(fpath) and i > 0:
+ > time.sleep(1)
+ > i -= 1
+ > return True # reject the changesets
+ > EOF
+
+external hook
+
+ $ cat <<EOF > reject.sh
+ > printf 'hook '; hg tip --template '{node}\\n'
+ > # create the notify file so caller knows we're running
+ > fpath=$d/notify
+ > touch \$fpath
+ > # wait for ack - caller should delete the notify file
+ > i=$maxwait
+ > while [ -f \$fpath -a \$i != 0 ]; do
+ > sleep 1
+ > i=\`expr \$i - 1\`
+ > done
+ > exit 1 # reject the changesets
+ > EOF
+
+create repos
+
+ $ hg init parent
+ $ hg clone -q parent child-push
+ $ hg clone -q parent child-pull
+ $ echo a > child-push/a
+ $ hg -R child-push add child-push/a
+ $ hg -R child-push commit -m a -d '1000000 0'
+
+test python hook
+
+ $ cat <<EOF > parent/.hg/hgrc
+ > [extensions]
+ > reject = $d/reject.py
+ > [hooks]
+ > pretxnchangegroup = python:reject.rejecthook
+ > EOF
+
+ $ dotest
+ push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
+ hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
+ transaction abort!
+ rollback completed
+ abort: pretxnchangegroup hook failed
+ pull 0000000000000000000000000000000000000000
+
+test external hook
+
+ $ cat <<EOF > parent/.hg/hgrc
+ > [hooks]
+ > pretxnchangegroup = sh $d/reject.sh
+ > EOF
+
+ $ dotest
+ push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
+ hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
+ transaction abort!
+ rollback completed
+ abort: pretxnchangegroup hook exited with status 1
+ pull 0000000000000000000000000000000000000000
diff --git a/tests/test-permissions.t b/tests/test-permissions.t
new file mode 100644
index 0000000..88f0637
--- /dev/null
+++ b/tests/test-permissions.t
@@ -0,0 +1,72 @@
+ $ "$TESTDIR/hghave" unix-permissions || exit 80
+
+ $ hg init t
+ $ cd t
+
+ $ echo foo > a
+ $ hg add a
+
+ $ hg commit -m "1"
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ chmod -r .hg/store/data/a.i
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ abort: Permission denied: $TESTTMP/t/.hg/store/data/a.i
+ [255]
+
+ $ chmod +r .hg/store/data/a.i
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ chmod -w .hg/store/data/a.i
+
+ $ echo barber > a
+ $ hg commit -m "2"
+ trouble committing a!
+ abort: Permission denied: $TESTTMP/t/.hg/store/data/a.i
+ [255]
+
+ $ chmod -w .
+
+ $ hg diff --nodates
+ diff -r 2a18120dc1c9 a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -foo
+ +barber
+
+ $ chmod +w .
+
+ $ chmod +w .hg/store/data/a.i
+ $ mkdir dir
+ $ touch dir/a
+ $ hg status
+ M a
+ ? dir/a
+ $ chmod -rx dir
+ $ hg status
+ dir: Permission denied
+ M a
+
+Reenable perm to allow deletion:
+
+ $ chmod +rx dir
+
+ $ cd ..
diff --git a/tests/test-phases-exchange.t b/tests/test-phases-exchange.t
new file mode 100644
index 0000000..a8a4483
--- /dev/null
+++ b/tests/test-phases-exchange.t
@@ -0,0 +1,1065 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > EOF
+ $ hgph() { hg log -G --template "{rev} {phase} {desc} - {node|short}\n" $*; }
+
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > message="$1"
+ > shift
+ > hg ci -m "$message" $*
+ > }
+
+ $ hg init alpha
+ $ cd alpha
+ $ mkcommit a-A
+ $ mkcommit a-B
+ $ mkcommit a-C
+ $ mkcommit a-D
+ $ hgph
+ @ 3 draft a-D - b555f63b6063
+ |
+ o 2 draft a-C - 54acac6f23ab
+ |
+ o 1 draft a-B - 548a3d25dbf0
+ |
+ o 0 draft a-A - 054250a37db4
+
+
+ $ hg init ../beta
+ $ hg push -r 1 ../beta
+ pushing to ../beta
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ $ hgph
+ @ 3 draft a-D - b555f63b6063
+ |
+ o 2 draft a-C - 54acac6f23ab
+ |
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+ $ cd ../beta
+ $ hgph
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg up -q
+ $ mkcommit b-A
+ $ hgph
+ @ 2 draft b-A - f54f1bb90ff3
+ |
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg pull ../alpha
+ pulling from ../alpha
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hgph
+ o 4 public a-D - b555f63b6063
+ |
+ o 3 public a-C - 54acac6f23ab
+ |
+ | @ 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+pull did not updated ../alpha state.
+push from alpha to beta should update phase even if nothing is transfered
+
+ $ cd ../alpha
+ $ hgph # not updated by remote pull
+ @ 3 draft a-D - b555f63b6063
+ |
+ o 2 draft a-C - 54acac6f23ab
+ |
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg push ../beta
+ pushing to ../beta
+ searching for changes
+ no changes found
+ [1]
+ $ hgph
+ @ 3 public a-D - b555f63b6063
+ |
+ o 2 public a-C - 54acac6f23ab
+ |
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+update must update phase of common changeset too
+
+ $ hg pull ../beta # getting b-A
+ pulling from ../beta
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ cd ../beta
+ $ hgph # not updated by remote pull
+ o 4 public a-D - b555f63b6063
+ |
+ o 3 public a-C - 54acac6f23ab
+ |
+ | @ 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg pull ../alpha
+ pulling from ../alpha
+ searching for changes
+ no changes found
+ $ hgph
+ o 4 public a-D - b555f63b6063
+ |
+ o 3 public a-C - 54acac6f23ab
+ |
+ | @ 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Publish configuration option
+----------------------------
+
+Pull
+````
+
+changegroup are added without phase movement
+
+ $ hg bundle -a ../base.bundle
+ 5 changesets found
+ $ cd ..
+ $ hg init mu
+ $ cd mu
+ $ cat > .hg/hgrc << EOF
+ > [phases]
+ > publish=0
+ > EOF
+ $ hg unbundle ../base.bundle
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 5 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hgph
+ o 4 draft a-D - b555f63b6063
+ |
+ o 3 draft a-C - 54acac6f23ab
+ |
+ | o 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 draft a-B - 548a3d25dbf0
+ |
+ o 0 draft a-A - 054250a37db4
+
+ $ cd ..
+
+Pulling from publish=False to publish=False does not move boundary.
+
+ $ hg init nu
+ $ cd nu
+ $ cat > .hg/hgrc << EOF
+ > [phases]
+ > publish=0
+ > EOF
+ $ hg pull ../mu -r 54acac6f23ab
+ pulling from ../mu
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 3 files
+ (run 'hg update' to get a working copy)
+ $ hgph
+ o 2 draft a-C - 54acac6f23ab
+ |
+ o 1 draft a-B - 548a3d25dbf0
+ |
+ o 0 draft a-A - 054250a37db4
+
+
+Even for common
+
+ $ hg pull ../mu -r f54f1bb90ff3
+ pulling from ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hgph
+ o 3 draft b-A - f54f1bb90ff3
+ |
+ | o 2 draft a-C - 54acac6f23ab
+ |/
+ o 1 draft a-B - 548a3d25dbf0
+ |
+ o 0 draft a-A - 054250a37db4
+
+
+
+Pulling from Publish=True to Publish=False move boundary in common set.
+we are in nu
+
+ $ hg pull ../alpha -r b555f63b6063
+ pulling from ../alpha
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hgph # f54f1bb90ff3 stay draft, not ancestor of -r
+ o 4 public a-D - b555f63b6063
+ |
+ | o 3 draft b-A - f54f1bb90ff3
+ | |
+ o | 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+pulling from Publish=False to publish=False with some public
+
+ $ hg up -q f54f1bb90ff3
+ $ mkcommit n-A
+ $ mkcommit n-B
+ $ hgph
+ @ 6 draft n-B - 145e75495359
+ |
+ o 5 draft n-A - d6bcb4f74035
+ |
+ | o 4 public a-D - b555f63b6063
+ | |
+ o | 3 draft b-A - f54f1bb90ff3
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ cd ../mu
+ $ hg pull ../nu
+ pulling from ../nu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hgph
+ o 6 draft n-B - 145e75495359
+ |
+ o 5 draft n-A - d6bcb4f74035
+ |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ cd ..
+
+pulling into publish=True
+
+ $ cd alpha
+ $ hgph
+ o 4 public b-A - f54f1bb90ff3
+ |
+ | @ 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg pull ../mu
+ pulling from ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hgph
+ o 6 draft n-B - 145e75495359
+ |
+ o 5 draft n-A - d6bcb4f74035
+ |
+ o 4 public b-A - f54f1bb90ff3
+ |
+ | @ 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ cd ..
+
+pulling back into original repo
+
+ $ cd nu
+ $ hg pull ../alpha
+ pulling from ../alpha
+ searching for changes
+ no changes found
+ $ hgph
+ @ 6 public n-B - 145e75495359
+ |
+ o 5 public n-A - d6bcb4f74035
+ |
+ | o 4 public a-D - b555f63b6063
+ | |
+ o | 3 public b-A - f54f1bb90ff3
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Push
+````
+
+(inserted)
+
+Test that phase are pushed even when they are nothing to pus
+(this might be tested later bu are very convenient to not alter too much test)
+
+Push back to alpha
+
+ $ hg push ../alpha # from nu
+ pushing to ../alpha
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+ $ cd alpha
+ $ hgph
+ o 6 public n-B - 145e75495359
+ |
+ o 5 public n-A - d6bcb4f74035
+ |
+ o 4 public b-A - f54f1bb90ff3
+ |
+ | @ 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+(end insertion)
+
+
+initial setup
+
+ $ hg glog # of alpha
+ o changeset: 6:145e75495359
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: n-B
+ |
+ o changeset: 5:d6bcb4f74035
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: n-A
+ |
+ o changeset: 4:f54f1bb90ff3
+ | parent: 1:548a3d25dbf0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: b-A
+ |
+ | @ changeset: 3:b555f63b6063
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: a-D
+ | |
+ | o changeset: 2:54acac6f23ab
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: a-C
+ |
+ o changeset: 1:548a3d25dbf0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: a-B
+ |
+ o changeset: 0:054250a37db4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a-A
+
+ $ mkcommit a-E
+ $ mkcommit a-F
+ $ mkcommit a-G
+ $ hg up d6bcb4f74035 -q
+ $ mkcommit a-H
+ created new head
+ $ hgph
+ @ 10 draft a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 draft a-F - b740e3e5c05d
+ | |
+ | o 7 draft a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Pulling from bundle does not alter phases of changeset not present in the bundle
+
+ $ hg bundle --base 1 -r 6 -r 3 ../partial-bundle.hg
+ 5 changesets found
+ $ hg pull ../partial-bundle.hg
+ pulling from ../partial-bundle.hg
+ searching for changes
+ no changes found
+ $ hgph
+ @ 10 draft a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 draft a-F - b740e3e5c05d
+ | |
+ | o 7 draft a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Pushing to Publish=False (unknown changeset)
+
+ $ hg push ../mu -r b740e3e5c05d # a-F
+ pushing to ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ $ hgph
+ @ 10 draft a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 draft a-F - b740e3e5c05d
+ | |
+ | o 7 draft a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+ $ cd ../mu
+ $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
+ > # not ancestor of -r
+ o 8 draft a-F - b740e3e5c05d
+ |
+ o 7 draft a-E - e9f537e46dea
+ |
+ | o 6 draft n-B - 145e75495359
+ | |
+ | o 5 draft n-A - d6bcb4f74035
+ | |
+ o | 4 public a-D - b555f63b6063
+ | |
+ o | 3 public a-C - 54acac6f23ab
+ | |
+ | o 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Pushing to Publish=True (unknown changeset)
+
+ $ hg push ../beta -r b740e3e5c05d
+ pushing to ../beta
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ $ hgph # again f54f1bb90ff3, d6bcb4f74035 and 145e75495359 stay draft,
+ > # not ancestor of -r
+ o 8 public a-F - b740e3e5c05d
+ |
+ o 7 public a-E - e9f537e46dea
+ |
+ | o 6 draft n-B - 145e75495359
+ | |
+ | o 5 draft n-A - d6bcb4f74035
+ | |
+ o | 4 public a-D - b555f63b6063
+ | |
+ o | 3 public a-C - 54acac6f23ab
+ | |
+ | o 2 draft b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Pushing to Publish=True (common changeset)
+
+ $ cd ../beta
+ $ hg push ../alpha
+ pushing to ../alpha
+ searching for changes
+ no changes found
+ [1]
+ $ hgph
+ o 6 public a-F - b740e3e5c05d
+ |
+ o 5 public a-E - e9f537e46dea
+ |
+ o 4 public a-D - b555f63b6063
+ |
+ o 3 public a-C - 54acac6f23ab
+ |
+ | @ 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ cd ../alpha
+ $ hgph
+ @ 10 draft a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Pushing to Publish=False (common changeset that change phase + unknown one)
+
+ $ hg push ../mu -r 967b449fbc94 -f
+ pushing to ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ $ hgph
+ @ 10 draft a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ cd ../mu
+ $ hgph # d6bcb4f74035 should have changed phase
+ > # 145e75495359 is still draft. not ancestor of -r
+ o 9 draft a-H - 967b449fbc94
+ |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 draft n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+
+Pushing to Publish=True (common changeset from publish=False)
+
+(in mu)
+ $ hg push ../alpha
+ pushing to ../alpha
+ searching for changes
+ no changes found
+ [1]
+ $ hgph
+ o 9 public a-H - 967b449fbc94
+ |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hgph -R ../alpha # a-H should have been synced to 0
+ @ 10 public a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+
+Discovery locally secret changeset on a remote repository:
+
+- should make it non-secret
+
+ $ cd ../alpha
+ $ mkcommit A-secret --config phases.new-commit=2
+ $ hgph
+ @ 11 secret A-secret - 435b5d83910c
+ |
+ o 10 public a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg bundle --base 'parents(.)' -r . ../secret-bundle.hg
+ 1 changesets found
+ $ hg -R ../mu unbundle ../secret-bundle.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hgph -R ../mu
+ o 10 draft A-secret - 435b5d83910c
+ |
+ o 9 public a-H - 967b449fbc94
+ |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+ $ hg pull ../mu
+ pulling from ../mu
+ searching for changes
+ no changes found
+ $ hgph
+ @ 11 draft A-secret - 435b5d83910c
+ |
+ o 10 public a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+pushing a locally public and draft changesets remotly secret should make them
+appear on the remote side.
+
+
+ $ hg -R ../mu phase --secret --force 967b449fbc94
+ $ hg push -r 435b5d83910c ../mu
+ pushing to ../mu
+ searching for changes
+ abort: push creates new remote head 435b5d83910c!
+ (did you forget to merge? use push -f to force)
+ [255]
+ $ hg push -fr 435b5d83910c ../mu # because the push will create new visible head
+ pushing to ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 0 changesets with 0 changes to 2 files
+ $ hgph -R ../mu
+ o 10 draft A-secret - 435b5d83910c
+ |
+ o 9 public a-H - 967b449fbc94
+ |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+pull new changeset with common draft locally
+
+ $ hg up -q 967b449fbc94 # create a new root for draft
+ $ mkcommit 'alpha-more'
+ created new head
+ $ hg push -fr . ../mu
+ pushing to ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ $ cd ../mu
+ $ hg phase --secret --force 1c5cfd894796
+ $ hg up -q 435b5d83910c
+ $ mkcommit 'mu-more'
+ $ cd ../alpha
+ $ hg pull ../mu
+ pulling from ../mu
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hgph
+ o 13 draft mu-more - 5237fb433fc8
+ |
+ | @ 12 draft alpha-more - 1c5cfd894796
+ | |
+ o | 11 draft A-secret - 435b5d83910c
+ |/
+ o 10 public a-H - 967b449fbc94
+ |
+ | o 9 draft a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+Test that test are properly ignored on remote event when existing locally
+
+ $ cd ..
+ $ hg clone -qU -r b555f63b6063 -r f54f1bb90ff3 beta gamma
+
+# pathological case are
+#
+# * secret remotely
+# * known locally
+# * repo have uncommon changeset
+
+ $ hg -R beta phase --secret --force f54f1bb90ff3
+ $ hg -R gamma phase --draft --force f54f1bb90ff3
+
+ $ cd gamma
+ $ hg pull ../beta
+ pulling from ../beta
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg phase f54f1bb90ff3
+ 2: draft
+
+same over the wire
+
+ $ cd ../beta
+ $ hg serve -p $HGPORT -d --pid-file=../beta.pid -E ../beta-error.log
+ $ cat ../beta.pid >> $DAEMON_PIDS
+ $ cd ../gamma
+
+ $ hg pull http://localhost:$HGPORT/
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg phase f54f1bb90ff3
+ 2: draft
+
+check that secret local on both side are not synced to public
+
+ $ hg push -r b555f63b6063 http://localhost:$HGPORT/
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg phase f54f1bb90ff3
+ 2: draft
+
+put the changeset in the draft state again
+(first test after this one expect to be able to copy)
+
+ $ cd ..
+
+
+Test Clone behavior
+
+A. Clone without secret changeset
+
+1. cloning non-publishing repository
+(Phase should be preserved)
+
+# make sure there is no secret so we can use a copy clone
+
+ $ hg -R mu phase --draft 'secret()'
+
+ $ hg clone -U mu Tau
+ $ hgph -R Tau
+ o 12 draft mu-more - 5237fb433fc8
+ |
+ | o 11 draft alpha-more - 1c5cfd894796
+ | |
+ o | 10 draft A-secret - 435b5d83910c
+ |/
+ o 9 public a-H - 967b449fbc94
+ |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ | o 4 public a-D - b555f63b6063
+ | |
+ | o 3 public a-C - 54acac6f23ab
+ | |
+ o | 2 public b-A - f54f1bb90ff3
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
+2. cloning publishing repository
+
+(everything should be public)
+
+ $ hg clone -U alpha Upsilon
+ $ hgph -R Upsilon
+ o 13 public mu-more - 5237fb433fc8
+ |
+ | o 12 public alpha-more - 1c5cfd894796
+ | |
+ o | 11 public A-secret - 435b5d83910c
+ |/
+ o 10 public a-H - 967b449fbc94
+ |
+ | o 9 public a-G - 3e27b6f1eee1
+ | |
+ | o 8 public a-F - b740e3e5c05d
+ | |
+ | o 7 public a-E - e9f537e46dea
+ | |
+ +---o 6 public n-B - 145e75495359
+ | |
+ o | 5 public n-A - d6bcb4f74035
+ | |
+ o | 4 public b-A - f54f1bb90ff3
+ | |
+ | o 3 public a-D - b555f63b6063
+ | |
+ | o 2 public a-C - 54acac6f23ab
+ |/
+ o 1 public a-B - 548a3d25dbf0
+ |
+ o 0 public a-A - 054250a37db4
+
+
diff --git a/tests/test-phases.t b/tests/test-phases.t
new file mode 100644
index 0000000..28e7dab
--- /dev/null
+++ b/tests/test-phases.t
@@ -0,0 +1,479 @@
+ $ hglog() { hg log --template "{rev} {phaseidx} {desc}\n" $*; }
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > message="$1"
+ > shift
+ > hg ci -m "$message" $*
+ > }
+
+ $ hg init initialrepo
+ $ cd initialrepo
+
+Cannot change null revision phase
+
+ $ hg phase --force --secret null
+ abort: cannot change null revision phase
+ [255]
+ $ hg phase null
+ -1: public
+
+ $ mkcommit A
+
+New commit are draft by default
+
+ $ hglog
+ 0 1 A
+
+Following commit are draft too
+
+ $ mkcommit B
+
+ $ hglog
+ 1 1 B
+ 0 1 A
+
+Draft commit are properly created over public one:
+
+ $ hg phase --public .
+ $ hglog
+ 1 0 B
+ 0 0 A
+
+ $ mkcommit C
+ $ mkcommit D
+
+ $ hglog
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+
+Test creating changeset as secret
+
+ $ mkcommit E --config phases.new-commit='secret'
+ $ hglog
+ 4 2 E
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+
+Test the secret property is inherited
+
+ $ mkcommit H
+ $ hglog
+ 5 2 H
+ 4 2 E
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+
+Even on merge
+
+ $ hg up -q 1
+ $ mkcommit "B'"
+ created new head
+ $ hglog
+ 6 1 B'
+ 5 2 H
+ 4 2 E
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+ $ hg merge 4 # E
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "merge B' and E"
+ $ hglog
+ 7 2 merge B' and E
+ 6 1 B'
+ 5 2 H
+ 4 2 E
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+
+Test secret changeset are not pushed
+
+ $ hg init ../push-dest
+ $ cat > ../push-dest/.hg/hgrc << EOF
+ > [phases]
+ > publish=False
+ > EOF
+ $ hg outgoing ../push-dest --template='{rev} {phase} {desc|firstline}\n'
+ comparing with ../push-dest
+ searching for changes
+ 0 public A
+ 1 public B
+ 2 draft C
+ 3 draft D
+ 6 draft B'
+ $ hg outgoing -r 'branch(default)' ../push-dest --template='{rev} {phase} {desc|firstline}\n'
+ comparing with ../push-dest
+ searching for changes
+ 0 public A
+ 1 public B
+ 2 draft C
+ 3 draft D
+ 6 draft B'
+
+ $ hg push ../push-dest -f # force because we push multiple heads
+ pushing to ../push-dest
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 5 files (+1 heads)
+ $ hglog
+ 7 2 merge B' and E
+ 6 1 B'
+ 5 2 H
+ 4 2 E
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+ $ cd ../push-dest
+ $ hglog
+ 4 1 B'
+ 3 1 D
+ 2 1 C
+ 1 0 B
+ 0 0 A
+
+(Issue3303)
+Check that remote secret changeset are ignore when checking creation of remote heads
+
+We add a secret head into the push destination. This secreat head shadow a
+visible shared between the initial repo and the push destination.
+
+ $ hg up -q 4 # B'
+ $ mkcommit Z --config phases.new-commit=secret
+ $ hg phase .
+ 5: secret
+
+# We now try to push a new public changeset that descend from the common public
+# head shadowed by the remote secret head.
+
+ $ cd ../initialrepo
+ $ hg up -q 6 #B'
+ $ mkcommit I
+ created new head
+ $ hg push ../push-dest
+ pushing to ../push-dest
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+:note: The "(+1 heads)" is wrong as we do not had any visible head
+
+
+Restore condition prior extra insertion.
+ $ hg -q --config extensions.mq= strip .
+ $ hg up -q 7
+ $ cd ..
+
+Test secret changeset are not pull
+
+ $ hg init pull-dest
+ $ cd pull-dest
+ $ hg pull ../initialrepo
+ pulling from ../initialrepo
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 5 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hglog
+ 4 0 B'
+ 3 0 D
+ 2 0 C
+ 1 0 B
+ 0 0 A
+ $ cd ..
+
+But secret can still be bundled explicitly
+
+ $ cd initialrepo
+ $ hg bundle --base '4^' -r 'children(4)' ../secret-bundle.hg
+ 4 changesets found
+ $ cd ..
+
+Test secret changeset are not cloned
+(during local clone)
+
+ $ hg clone -qU initialrepo clone-dest
+ $ hglog -R clone-dest
+ 4 0 B'
+ 3 0 D
+ 2 0 C
+ 1 0 B
+ 0 0 A
+
+Test revset
+
+ $ cd initialrepo
+ $ hglog -r 'public()'
+ 0 0 A
+ 1 0 B
+ $ hglog -r 'draft()'
+ 2 1 C
+ 3 1 D
+ 6 1 B'
+ $ hglog -r 'secret()'
+ 4 2 E
+ 5 2 H
+ 7 2 merge B' and E
+
+test that phase are displayed in log at debug level
+
+ $ hg log --debug
+ changeset: 7:17a481b3bccb796c0521ae97903d81c52bfee4af
+ tag: tip
+ phase: secret
+ parent: 6:cf9fe039dfd67e829edf6522a45de057b5c86519
+ parent: 4:a603bfb5a83e312131cebcd05353c217d4d21dde
+ manifest: 7:5e724ffacba267b2ab726c91fc8b650710deaaa8
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: C D E
+ extra: branch=default
+ description:
+ merge B' and E
+
+
+ changeset: 6:cf9fe039dfd67e829edf6522a45de057b5c86519
+ phase: draft
+ parent: 1:27547f69f25460a52fff66ad004e58da7ad3fb56
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 6:ab8bfef2392903058bf4ebb9e7746e8d7026b27a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: B'
+ extra: branch=default
+ description:
+ B'
+
+
+ changeset: 5:a030c6be5127abc010fcbff1851536552e6951a8
+ phase: secret
+ parent: 4:a603bfb5a83e312131cebcd05353c217d4d21dde
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 5:5c710aa854874fe3d5fa7192e77bdb314cc08b5a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: H
+ extra: branch=default
+ description:
+ H
+
+
+ changeset: 4:a603bfb5a83e312131cebcd05353c217d4d21dde
+ phase: secret
+ parent: 3:b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 4:7173fd1c27119750b959e3a0f47ed78abe75d6dc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: E
+ extra: branch=default
+ description:
+ E
+
+
+ changeset: 3:b3325c91a4d916bcc4cdc83ea3fe4ece46a42f6e
+ phase: draft
+ parent: 2:f838bfaca5c7226600ebcfd84f3c3c13a28d3757
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 3:6e1f4c47ecb533ffd0c8e52cdc88afb6cd39e20c
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: D
+ extra: branch=default
+ description:
+ D
+
+
+ changeset: 2:f838bfaca5c7226600ebcfd84f3c3c13a28d3757
+ phase: draft
+ parent: 1:27547f69f25460a52fff66ad004e58da7ad3fb56
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 2:66a5a01817fdf5239c273802b5b7618d051c89e4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: C
+ extra: branch=default
+ description:
+ C
+
+
+ changeset: 1:27547f69f25460a52fff66ad004e58da7ad3fb56
+ parent: 0:4a2df7238c3b48766b5e22fafbb8a2f506ec8256
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 1:cb5cbbc1bfbf24cc34b9e8c16914e9caa2d2a7fd
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: B
+ extra: branch=default
+ description:
+ B
+
+
+ changeset: 0:4a2df7238c3b48766b5e22fafbb8a2f506ec8256
+ parent: -1:0000000000000000000000000000000000000000
+ parent: -1:0000000000000000000000000000000000000000
+ manifest: 0:007d8c9d88841325f5c6b06371b35b4e8a2b1a83
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files+: A
+ extra: branch=default
+ description:
+ A
+
+
+
+Test phase command
+===================
+
+initial picture
+
+ $ cat >> $HGRCPATH << EOF
+ > [extensions]
+ > hgext.graphlog=
+ > EOF
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+display changesets phase
+
+(mixing -r and plain rev specification)
+
+ $ hg phase 1::4 -r 7
+ 1: public
+ 2: draft
+ 3: draft
+ 4: secret
+ 7: secret
+
+
+move changeset forward
+
+(with -r option)
+
+ $ hg phase --public -r 2
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 public C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+move changeset backward
+
+(without -r option)
+
+ $ hg phase --draft --force 2
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+move changeset forward and backward
+
+ $ hg phase --draft --force 1::4
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 draft E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 draft B
+ |
+ o 0 public A
+
+test partial failure
+
+ $ hg phase --public 7
+ $ hg phase --draft '5 or 7'
+ cannot move 1 changesets to a more permissive phase, use --force
+ phase changed for 1 changesets
+ [1]
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 public merge B' and E
+ |\
+ | o 6 public B'
+ | |
+ +---o 5 draft H
+ | |
+ o | 4 public E
+ | |
+ o | 3 public D
+ | |
+ o | 2 public C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+test complete failure
+
+ $ hg phase --draft 7
+ cannot move 1 changesets to a more permissive phase, use --force
+ no phases changed
+ [1]
+
+ $ cd ..
diff --git a/tests/test-profile.t b/tests/test-profile.t
new file mode 100644
index 0000000..f05a8dd
--- /dev/null
+++ b/tests/test-profile.t
@@ -0,0 +1,31 @@
+test --time
+
+ $ hg --time help -q help 2>&1 | grep time > /dev/null
+ $ hg init a
+ $ cd a
+
+#if lsprof
+
+test --profile
+
+ $ hg --profile st 2>../out
+ $ grep CallCount ../out > /dev/null || cat ../out
+
+ $ hg --profile --config profiling.output=../out st
+ $ grep CallCount ../out > /dev/null || cat ../out
+
+ $ hg --profile --config profiling.format=text st 2>../out
+ $ grep CallCount ../out > /dev/null || cat ../out
+
+ $ echo "[profiling]" >> $HGRCPATH
+ $ echo "format=kcachegrind" >> $HGRCPATH
+
+ $ hg --profile st 2>../out
+ $ grep 'events: Ticks' ../out > /dev/null || cat ../out
+
+ $ hg --profile --config profiling.output=../out st
+ $ grep 'events: Ticks' ../out > /dev/null || cat ../out
+
+#endif
+
+ $ cd ..
diff --git a/tests/test-progress.t b/tests/test-progress.t
new file mode 100644
index 0000000..5fa0a62
--- /dev/null
+++ b/tests/test-progress.t
@@ -0,0 +1,216 @@
+
+ $ cat > loop.py <<EOF
+ > from mercurial import commands
+ >
+ > def loop(ui, loops, **opts):
+ > loops = int(loops)
+ > total = None
+ > if loops >= 0:
+ > total = loops
+ > if opts.get('total', None):
+ > total = int(opts.get('total'))
+ > nested = False
+ > if opts.get('nested', None):
+ > nested = True
+ > loops = abs(loops)
+ >
+ > for i in range(loops):
+ > ui.progress('loop', i, 'loop.%d' % i, 'loopnum', total)
+ > if opts.get('parallel'):
+ > ui.progress('other', i, 'other.%d' % i, 'othernum', total)
+ > if nested:
+ > for j in range(2):
+ > ui.progress('nested', j, 'nested.%d' % j, 'nestnum', 2)
+ > ui.progress('nested', None, 'nested.done', 'nestnum', 2)
+ > ui.progress('loop', None, 'loop.done', 'loopnum', total)
+ >
+ > commands.norepo += " loop"
+ >
+ > cmdtable = {
+ > "loop": (loop, [('', 'total', '', 'override for total'),
+ > ('', 'nested', False, 'show nested results'),
+ > ('', 'parallel', False, 'show parallel sets of results'),
+ > ],
+ > 'hg loop LOOPS'),
+ > }
+ > EOF
+
+ $ cp $HGRCPATH $HGRCPATH.orig
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "progress=" >> $HGRCPATH
+ $ echo "loop=`pwd`/loop.py" >> $HGRCPATH
+ $ echo "[progress]" >> $HGRCPATH
+ $ echo "format = topic bar number" >> $HGRCPATH
+ $ echo "assume-tty=1" >> $HGRCPATH
+ $ echo "width=60" >> $HGRCPATH
+
+test default params, display nothing because of delay
+
+ $ hg -y loop 3 2>&1 | "$TESTDIR/filtercr.py"
+
+ $ echo "delay=0" >> $HGRCPATH
+ $ echo "refresh=0" >> $HGRCPATH
+
+test with delay=0, refresh=0
+
+ $ hg -y loop 3 2>&1 | "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/3
+ loop [===============> ] 1/3
+ loop [===============================> ] 2/3
+ \r (esc)
+
+
+test nested short-lived topics (which shouldn't display with nestdelay):
+
+ $ hg -y loop 3 --nested 2>&1 | \
+ > python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/3
+ loop [===============> ] 1/3
+ loop [===============================> ] 2/3
+ \r (esc)
+
+
+ $ hg --config progress.changedelay=0 -y loop 3 --nested 2>&1 | \
+ > python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ loop [===============> ] 1/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ loop [===============================> ] 2/3
+ nested [ ] 0/2
+ nested [======================> ] 1/2
+ \r (esc)
+
+
+test two topics being printed in parallel (as when we're doing a local
+--pull clone, where you get the unbundle and bundle progress at the
+same time):
+ $ hg loop 3 --parallel 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/3
+ loop [===============> ] 1/3
+ loop [===============================> ] 2/3
+ \r (esc)
+test refresh is taken in account
+
+ $ hg -y --config progress.refresh=100 loop 3 2>&1 | "$TESTDIR/filtercr.py"
+
+
+test format options 1
+
+ $ hg -y --config 'progress.format=number topic item+2' loop 2 2>&1 \
+ > | "$TESTDIR/filtercr.py"
+
+ 0/2 loop lo
+ 1/2 loop lo
+ \r (esc)
+
+test format options 2
+
+ $ hg -y --config 'progress.format=number item-3 bar' loop 2 2>&1 \
+ > | "$TESTDIR/filtercr.py"
+
+ 0/2 p.0 [ ]
+ 1/2 p.1 [=======================> ]
+ \r (esc)
+
+test format options and indeterminate progress
+
+ $ hg -y --config 'progress.format=number item bar' loop -- -2 2>&1 \
+ > | "$TESTDIR/filtercr.py"
+
+ 0 loop.0 [ <=> ]
+ 1 loop.1 [ <=> ]
+ \r (esc)
+
+make sure things don't fall over if count > total
+
+ $ hg -y loop --total 4 6 2>&1 | "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/4
+ loop [===========> ] 1/4
+ loop [=======================> ] 2/4
+ loop [===================================> ] 3/4
+ loop [===============================================>] 4/4
+ loop [ <=> ] 5/4
+ \r (esc)
+
+test immediate progress completion
+
+ $ hg -y loop 0 2>&1 | "$TESTDIR/filtercr.py"
+
+
+test delay time estimates
+
+ $ cat > mocktime.py <<EOF
+ > import os
+ > import time
+ >
+ > class mocktime(object):
+ > def __init__(self, increment):
+ > self.time = 0
+ > self.increment = increment
+ > def __call__(self):
+ > self.time += self.increment
+ > return self.time
+ >
+ > def uisetup(ui):
+ > time.time = mocktime(int(os.environ.get('MOCKTIME', '11')))
+ > EOF
+
+ $ cp $HGRCPATH.orig $HGRCPATH
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mocktime=`pwd`/mocktime.py" >> $HGRCPATH
+ $ echo "progress=" >> $HGRCPATH
+ $ echo "loop=`pwd`/loop.py" >> $HGRCPATH
+ $ echo "[progress]" >> $HGRCPATH
+ $ echo "assume-tty=1" >> $HGRCPATH
+ $ echo "delay=25" >> $HGRCPATH
+ $ echo "width=60" >> $HGRCPATH
+
+ $ hg -y loop 8 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [=========> ] 2/8 1m07s
+ loop [===============> ] 3/8 56s
+ loop [=====================> ] 4/8 45s
+ loop [==========================> ] 5/8 34s
+ loop [================================> ] 6/8 23s
+ loop [=====================================> ] 7/8 12s
+ \r (esc)
+
+ $ MOCKTIME=10000 hg -y loop 4 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/4
+ loop [=========> ] 1/4 8h21m
+ loop [====================> ] 2/4 5h34m
+ loop [==============================> ] 3/4 2h47m
+ \r (esc)
+
+ $ MOCKTIME=1000000 hg -y loop 4 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/4
+ loop [=========> ] 1/4 5w00d
+ loop [====================> ] 2/4 3w03d
+ loop [=============================> ] 3/4 11d14h
+ \r (esc)
+
+
+ $ MOCKTIME=14000000 hg -y loop 4 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [ ] 0/4
+ loop [=========> ] 1/4 1y18w
+ loop [===================> ] 2/4 46w03d
+ loop [=============================> ] 3/4 23w02d
+ \r (esc)
+
+Time estimates should not fail when there's no end point:
+ $ hg -y loop -- -4 2>&1 | python "$TESTDIR/filtercr.py"
+
+ loop [ <=> ] 2
+ loop [ <=> ] 3
+ \r (esc)
diff --git a/tests/test-pull-branch.t b/tests/test-pull-branch.t
new file mode 100644
index 0000000..a9545cf
--- /dev/null
+++ b/tests/test-pull-branch.t
@@ -0,0 +1,216 @@
+ $ hg init t
+ $ cd t
+ $ echo 1 > foo
+ $ hg ci -Am1 # 0
+ adding foo
+ $ hg branch branchA
+ marked working directory as branch branchA
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a1 > foo
+ $ hg ci -ma1 # 1
+
+ $ cd ..
+ $ hg init tt
+ $ cd tt
+ $ hg pull ../t
+ pulling from ../t
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg up branchA
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ../t
+ $ echo a2 > foo
+ $ hg ci -ma2 # 2
+
+Create branch B:
+
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch branchB
+ marked working directory as branch branchB
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b1 > foo
+ $ hg ci -mb1 # 3
+
+ $ cd ../tt
+
+A new branch is there
+
+ $ hg pull -u ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files (+1 heads)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Develop both branches:
+
+ $ cd ../t
+ $ hg up branchA
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a3 > foo
+ $ hg ci -ma3 # 4
+ $ hg up branchB
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b2 > foo
+ $ hg ci -mb2 # 5
+
+ $ cd ../tt
+
+Should succeed, no new heads:
+
+ $ hg pull -u ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Add a head on other branch:
+
+ $ cd ../t
+ $ hg up branchA
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a4 > foo
+ $ hg ci -ma4 # 6
+ $ hg up branchB
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b3.1 > foo
+ $ hg ci -m b3.1 # 7
+ $ hg up 5
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b3.2 > foo
+ $ hg ci -m b3.2 # 8
+ created new head
+
+ $ cd ../tt
+
+Should succeed because there is only one head on our branch:
+
+ $ hg pull -u ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files (+1 heads)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ../t
+ $ hg up -C branchA
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a5.1 > foo
+ $ hg ci -ma5.1 # 9
+ $ hg up 6
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a5.2 > foo
+ $ hg ci -ma5.2 # 10
+ created new head
+ $ hg up 7
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b4.1 > foo
+ $ hg ci -m b4.1 # 11
+ $ hg up -C 8
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b4.2 > foo
+ $ hg ci -m b4.2 # 12
+
+ $ cd ../tt
+
+ $ hg pull -u ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files (+1 heads)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Make changes on new branch on tt
+
+ $ hg up 6
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch branchC
+ marked working directory as branch branchC
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b1 > bar
+ $ hg ci -Am "commit on branchC on tt"
+ adding bar
+
+Make changes on default branch on t
+
+ $ cd ../t
+ $ hg up -C default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a1 > bar
+ $ hg ci -Am "commit on default on t"
+ adding bar
+
+Pull branchC from tt
+
+ $ hg pull ../tt
+ pulling from ../tt
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads)
+
+Make changes on default and branchC on tt
+
+ $ cd ../tt
+ $ hg pull ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads)
+ $ hg up -C default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a1 > bar1
+ $ hg ci -Am "commit on default on tt"
+ adding bar1
+ $ hg up branchC
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a1 > bar2
+ $ hg ci -Am "commit on branchC on tt"
+ adding bar2
+
+Make changes on default and branchC on t
+
+ $ cd ../t
+ $ hg up default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a1 > bar3
+ $ hg ci -Am "commit on default on t"
+ adding bar3
+ $ hg up branchC
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a1 > bar4
+ $ hg ci -Am "commit on branchC on tt"
+ adding bar4
+
+Pull from tt
+
+ $ hg pull ../tt
+ pulling from ../tt
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files (+2 heads)
+ (run 'hg heads .' to see heads, 'hg merge' to merge)
+
+ $ cd ..
diff --git a/tests/test-pull-http.t b/tests/test-pull-http.t
new file mode 100644
index 0000000..7c53682
--- /dev/null
+++ b/tests/test-pull-http.t
@@ -0,0 +1,65 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ cd ..
+ $ hg clone test test2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test2
+ $ echo a >> a
+ $ hg ci -mb
+
+Cloning with a password in the URL should not save the password in .hg/hgrc:
+
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg clone http://foo:xyzzy@localhost:$HGPORT/ test3
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat test3/.hg/hgrc
+ [paths]
+ default = http://foo@localhost:$HGPORT/
+ $ "$TESTDIR/killdaemons.py"
+
+expect error, cloning not allowed
+
+ $ echo '[web]' > .hg/hgrc
+ $ echo 'allowpull = false' >> .hg/hgrc
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg clone http://localhost:$HGPORT/ test4
+ requesting all changes
+ abort: authorization failed
+ [255]
+ $ "$TESTDIR/killdaemons.py"
+
+serve errors
+
+ $ cat errors.log
+ $ req() {
+ > hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ > hg --cwd ../test pull http://localhost:$HGPORT/
+ > kill `cat hg.pid`
+ > echo % serve errors
+ > cat errors.log
+ > }
+
+expect error, pulling not allowed
+
+ $ req
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ abort: authorization failed
+ % serve errors
+
+ $ cd ..
diff --git a/tests/test-pull-permission.t b/tests/test-pull-permission.t
new file mode 100644
index 0000000..8df5527
--- /dev/null
+++ b/tests/test-pull-permission.t
@@ -0,0 +1,32 @@
+ $ "$TESTDIR/hghave" unix-permissions || exit 80
+
+ $ hg init a
+ $ cd a
+ $ echo foo > b
+ $ hg add b
+ $ hg ci -m "b"
+
+ $ chmod -w .hg/store
+
+ $ cd ..
+
+ $ hg clone a b
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ chmod +w a/.hg/store # let test clean up
+
+ $ cd b
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ cd ..
diff --git a/tests/test-pull-pull-corruption.t b/tests/test-pull-pull-corruption.t
new file mode 100644
index 0000000..4df2984
--- /dev/null
+++ b/tests/test-pull-pull-corruption.t
@@ -0,0 +1,72 @@
+Corrupt an hg repo with two pulls.
+create one repo with a long history
+
+ $ hg init source1
+ $ cd source1
+ $ touch foo
+ $ hg add foo
+ $ for i in 1 2 3 4 5 6 7 8 9 10; do
+ > echo $i >> foo
+ > hg ci -m $i
+ > done
+ $ cd ..
+
+create one repo with a shorter history
+
+ $ hg clone -r 0 source1 source2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd source2
+ $ echo a >> foo
+ $ hg ci -m a
+ $ cd ..
+
+create a third repo to pull both other repos into it
+
+ $ hg init corrupted
+ $ cd corrupted
+
+use a hook to make the second pull start while the first one is still running
+
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo 'prechangegroup = sleep 5' >> .hg/hgrc
+
+start a pull...
+
+ $ hg pull ../source1 > pull.out 2>&1 &
+
+... and start another pull before the first one has finished
+
+ $ sleep 1
+ $ hg pull ../source2 2>/dev/null
+ pulling from ../source2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ cat pull.out
+ pulling from ../source1
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 10 changesets with 10 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+see the result
+
+ $ wait
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 11 changesets, 11 total revisions
+
+ $ cd ..
diff --git a/tests/test-pull-r.t b/tests/test-pull-r.t
new file mode 100644
index 0000000..af91b6d
--- /dev/null
+++ b/tests/test-pull-r.t
@@ -0,0 +1,104 @@
+ $ hg init repo
+ $ cd repo
+ $ echo foo > foo
+ $ hg ci -qAm 'add foo'
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+ $ hg up -qC 0
+ $ echo bar > bar
+ $ hg ci -qAm 'add bar'
+
+ $ hg log
+ changeset: 2:effea6de0384
+ tag: tip
+ parent: 0:bbd179dfa0a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add bar
+
+ changeset: 1:ed1b79f46b9a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo
+
+ changeset: 0:bbd179dfa0a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ cd ..
+
+don't show "(+1 heads)" message when pulling closed head
+
+ $ hg clone -q repo repo2
+ $ hg clone -q repo2 repo3
+ $ cd repo2
+ $ hg up -q 0
+ $ echo hello >> foo
+ $ hg ci -mx1
+ created new head
+ $ hg ci -mx2 --close-branch
+ $ cd ../repo3
+ $ hg heads -q --closed
+ 2:effea6de0384
+ 1:ed1b79f46b9a
+ $ hg pull
+ pulling from $TESTTMP/repo2 (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg heads -q --closed
+ 4:00cfe9073916
+ 2:effea6de0384
+ 1:ed1b79f46b9a
+
+ $ cd ..
+
+ $ hg init copy
+ $ cd copy
+
+Pull a missing revision:
+
+ $ hg pull -qr missing ../repo
+ abort: unknown revision 'missing'!
+ [255]
+
+Pull multiple revisions with update:
+
+ $ hg pull -qu -r 0 -r 1 ../repo
+ $ hg -q parents
+ 0:bbd179dfa0a7
+ $ hg rollback
+ repository tip rolled back to revision -1 (undo pull)
+ working directory now based on revision -1
+
+ $ hg pull -qr 0 ../repo
+ $ hg log
+ changeset: 0:bbd179dfa0a7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ hg pull -qr 1 ../repo
+ $ hg log
+ changeset: 1:ed1b79f46b9a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo
+
+ changeset: 0:bbd179dfa0a7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+
+This used to abort: received changelog group is empty:
+
+ $ hg pull -qr 1 ../repo
+
+ $ cd ..
diff --git a/tests/test-pull-update.t b/tests/test-pull-update.t
new file mode 100644
index 0000000..3aa5a49
--- /dev/null
+++ b/tests/test-pull-update.t
@@ -0,0 +1,62 @@
+ $ hg init t
+ $ cd t
+ $ echo 1 > foo
+ $ hg ci -Am m
+ adding foo
+
+ $ cd ..
+ $ hg clone t tt
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd tt
+ $ echo 1.1 > foo
+ $ hg ci -Am m
+
+ $ cd ../t
+ $ echo 1.2 > foo
+ $ hg ci -Am m
+
+Should not update:
+
+ $ hg pull -u ../tt
+ pulling from ../tt
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ not updating: crosses branches (merge branches or update --check to force update)
+
+ $ cd ../tt
+
+Should not update:
+
+ $ hg pull -u ../t
+ pulling from ../t
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ not updating: crosses branches (merge branches or update --check to force update)
+
+ $ HGMERGE=true hg merge
+ merging foo
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -mm
+
+ $ cd ../t
+
+Should work:
+
+ $ hg pull -u ../tt
+ pulling from ../tt
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (-1 heads)
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
diff --git a/tests/test-pull.t b/tests/test-pull.t
new file mode 100644
index 0000000..b14d7f7
--- /dev/null
+++ b/tests/test-pull.t
@@ -0,0 +1,92 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+
+ $ echo foo>foo
+ $ hg addremove
+ adding foo
+ $ hg commit -m 1
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ cd ..
+
+ $ hg clone --pull http://foo:bar@localhost:$HGPORT/ copy
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd copy
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ hg co
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat foo
+ foo
+
+ $ hg manifest --debug
+ 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 foo
+
+ $ hg pull
+ pulling from http://foo@localhost:$HGPORT/
+ searching for changes
+ no changes found
+
+ $ hg rollback --dry-run --verbose
+ repository tip rolled back to revision -1 (undo pull: http://foo:***@localhost:$HGPORT/)
+
+Issue622: hg init && hg pull -u URL doesn't checkout default branch
+
+ $ cd ..
+ $ hg init empty
+ $ cd empty
+ $ hg pull -u ../test
+ pulling from ../test
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Test 'file:' uri handling:
+
+ $ hg pull -q file://../test-doesnt-exist
+ abort: file:// URLs can only refer to localhost
+ [255]
+
+ $ hg pull -q file://../test
+ abort: file:// URLs can only refer to localhost
+ [255]
+
+ $ hg pull -q file:../test
+
+It's tricky to make file:// URLs working on every platform with
+regular shell commands.
+
+ $ URL=`python -c "import os; print 'file://foobar' + ('/' + os.getcwd().replace(os.sep, '/')).replace('//', '/') + '/../test'"`
+ $ hg pull -q "$URL"
+ abort: file:// URLs can only refer to localhost
+ [255]
+
+ $ URL=`python -c "import os; print 'file://localhost' + ('/' + os.getcwd().replace(os.sep, '/')).replace('//', '/') + '/../test'"`
+ $ hg pull -q "$URL"
+
+ $ cd ..
diff --git a/tests/test-purge.t b/tests/test-purge.t
new file mode 100644
index 0000000..75f9f90
--- /dev/null
+++ b/tests/test-purge.t
@@ -0,0 +1,218 @@
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > purge =
+ > EOF
+
+init
+
+ $ hg init t
+ $ cd t
+
+setup
+
+ $ echo r1 > r1
+ $ hg ci -qAmr1 -d'0 0'
+ $ mkdir directory
+ $ echo r2 > directory/r2
+ $ hg ci -qAmr2 -d'1 0'
+ $ echo 'ignored' > .hgignore
+ $ hg ci -qAmr3 -d'2 0'
+
+delete an empty directory
+
+ $ mkdir empty_dir
+ $ hg purge -p
+ empty_dir
+ $ hg purge -v
+ removing directory empty_dir
+ $ ls
+ directory
+ r1
+
+delete an untracked directory
+
+ $ mkdir untracked_dir
+ $ touch untracked_dir/untracked_file1
+ $ touch untracked_dir/untracked_file2
+ $ hg purge -p
+ untracked_dir/untracked_file1
+ untracked_dir/untracked_file2
+ $ hg purge -v
+ removing file untracked_dir/untracked_file1
+ removing file untracked_dir/untracked_file2
+ removing directory untracked_dir
+ $ ls
+ directory
+ r1
+
+delete an untracked file
+
+ $ touch untracked_file
+ $ touch untracked_file_readonly
+ $ python <<EOF
+ > import os, stat
+ > f= 'untracked_file_readonly'
+ > os.chmod(f, stat.S_IMODE(os.stat(f).st_mode) & ~stat.S_IWRITE)
+ > EOF
+ $ hg purge -p
+ untracked_file
+ untracked_file_readonly
+ $ hg purge -v
+ removing file untracked_file
+ removing file untracked_file_readonly
+ $ ls
+ directory
+ r1
+
+delete an untracked file in a tracked directory
+
+ $ touch directory/untracked_file
+ $ hg purge -p
+ directory/untracked_file
+ $ hg purge -v
+ removing file directory/untracked_file
+ $ ls
+ directory
+ r1
+
+delete nested directories
+
+ $ mkdir -p untracked_directory/nested_directory
+ $ hg purge -p
+ untracked_directory/nested_directory
+ $ hg purge -v
+ removing directory untracked_directory/nested_directory
+ removing directory untracked_directory
+ $ ls
+ directory
+ r1
+
+delete nested directories from a subdir
+
+ $ mkdir -p untracked_directory/nested_directory
+ $ cd directory
+ $ hg purge -p
+ untracked_directory/nested_directory
+ $ hg purge -v
+ removing directory untracked_directory/nested_directory
+ removing directory untracked_directory
+ $ cd ..
+ $ ls
+ directory
+ r1
+
+delete only part of the tree
+
+ $ mkdir -p untracked_directory/nested_directory
+ $ touch directory/untracked_file
+ $ cd directory
+ $ hg purge -p ../untracked_directory
+ untracked_directory/nested_directory
+ $ hg purge -v ../untracked_directory
+ removing directory untracked_directory/nested_directory
+ removing directory untracked_directory
+ $ cd ..
+ $ ls
+ directory
+ r1
+ $ ls directory/untracked_file
+ directory/untracked_file
+ $ rm directory/untracked_file
+
+skip ignored files if --all not specified
+
+ $ touch ignored
+ $ hg purge -p
+ $ hg purge -v
+ $ ls
+ directory
+ ignored
+ r1
+ $ hg purge -p --all
+ ignored
+ $ hg purge -v --all
+ removing file ignored
+ $ ls
+ directory
+ r1
+
+abort with missing files until we support name mangling filesystems
+
+ $ touch untracked_file
+ $ rm r1
+
+hide error messages to avoid changing the output when the text changes
+
+ $ hg purge -p 2> /dev/null
+ untracked_file
+ $ hg st
+ ! r1
+ ? untracked_file
+
+ $ hg purge -p
+ untracked_file
+ $ hg purge -v 2> /dev/null
+ removing file untracked_file
+ $ hg st
+ ! r1
+
+ $ hg purge -v
+ $ hg revert --all --quiet
+ $ hg st -a
+
+tracked file in ignored directory (issue621)
+
+ $ echo directory >> .hgignore
+ $ hg ci -m 'ignore directory'
+ $ touch untracked_file
+ $ hg purge -p
+ untracked_file
+ $ hg purge -v
+ removing file untracked_file
+
+skip excluded files
+
+ $ touch excluded_file
+ $ hg purge -p -X excluded_file
+ $ hg purge -v -X excluded_file
+ $ ls
+ directory
+ excluded_file
+ r1
+ $ rm excluded_file
+
+skip files in excluded dirs
+
+ $ mkdir excluded_dir
+ $ touch excluded_dir/file
+ $ hg purge -p -X excluded_dir
+ $ hg purge -v -X excluded_dir
+ $ ls
+ directory
+ excluded_dir
+ r1
+ $ ls excluded_dir
+ file
+ $ rm -R excluded_dir
+
+skip excluded empty dirs
+
+ $ mkdir excluded_dir
+ $ hg purge -p -X excluded_dir
+ $ hg purge -v -X excluded_dir
+ $ ls
+ directory
+ excluded_dir
+ r1
+ $ rmdir excluded_dir
+
+skip patterns
+
+ $ mkdir .svn
+ $ touch .svn/foo
+ $ mkdir directory/.svn
+ $ touch directory/.svn/foo
+ $ hg purge -p -X .svn -X '*/.svn'
+ $ hg purge -p -X re:.*.svn
+
+ $ cd ..
diff --git a/tests/test-push-cgi.t b/tests/test-push-cgi.t
new file mode 100644
index 0000000..365a73a
--- /dev/null
+++ b/tests/test-push-cgi.t
@@ -0,0 +1,92 @@
+ $ "$TESTDIR/hghave" no-msys || exit 80 # MSYS will translate web paths as if they were file paths
+
+This is a test of the push wire protocol over CGI-based hgweb.
+
+initialize repository
+
+ $ hg init r
+ $ cd r
+ $ echo a > a
+ $ hg ci -A -m "0"
+ adding a
+ $ echo '[web]' > .hg/hgrc
+ $ echo 'allow_push = *' >> .hg/hgrc
+ $ echo 'push_ssl = false' >> .hg/hgrc
+
+create hgweb invocation script
+
+ $ cat >hgweb.cgi <<HGWEB
+ > import cgitb
+ > cgitb.enable()
+ > from mercurial import demandimport; demandimport.enable()
+ > from mercurial.hgweb import hgweb
+ > from mercurial.hgweb import wsgicgi
+ > application = hgweb('.', 'test repository')
+ > wsgicgi.launch(application)
+ > HGWEB
+ $ chmod 755 hgweb.cgi
+
+test preparation
+
+ $ . "$TESTDIR/cgienv"
+ $ REQUEST_METHOD="POST"; export REQUEST_METHOD
+ $ CONTENT_TYPE="application/octet-stream"; export CONTENT_TYPE
+ $ hg bundle --all bundle.hg
+ 1 changesets found
+ $ CONTENT_LENGTH=279; export CONTENT_LENGTH;
+
+expect unsynced changes
+
+ $ QUERY_STRING="cmd=unbundle&heads=0000000000000000000000000000000000000000"; export QUERY_STRING
+ $ python hgweb.cgi <bundle.hg >page1 2>&1
+ $ cat page1
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ Content-Length: 19\r (esc)
+ \r (esc)
+ 0
+ unsynced changes
+
+successful force push
+
+ $ QUERY_STRING="cmd=unbundle&heads=666f726365"; export QUERY_STRING
+ $ python hgweb.cgi <bundle.hg >page2 2>&1
+ $ cat page2
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ \r (esc)
+ 1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 0 changesets with 0 changes to 1 files
+
+successful push, list of heads
+
+ $ QUERY_STRING="cmd=unbundle&heads=f7b1eb17ad24730a1651fccd46c43826d1bbc2ac"; export QUERY_STRING
+ $ python hgweb.cgi <bundle.hg >page3 2>&1
+ $ cat page3
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ \r (esc)
+ 1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 0 changesets with 0 changes to 1 files
+
+successful push, SHA1 hash of heads (unbundlehash capability)
+
+ $ QUERY_STRING="cmd=unbundle&heads=686173686564 5a785a5f9e0d433b88ed862b206b011b0c3a9d13"; export QUERY_STRING
+ $ python hgweb.cgi <bundle.hg >page4 2>&1
+ $ cat page4
+ Status: 200 Script output follows\r (esc)
+ Content-Type: application/mercurial-0.1\r (esc)
+ \r (esc)
+ 1
+ adding changesets
+ adding manifests
+ adding file changes
+ added 0 changesets with 0 changes to 1 files
+
+ $ cd ..
diff --git a/tests/test-push-hook-lock.t b/tests/test-push-hook-lock.t
new file mode 100644
index 0000000..0a5ec47
--- /dev/null
+++ b/tests/test-push-hook-lock.t
@@ -0,0 +1,31 @@
+ $ hg init 1
+
+ $ echo '[ui]' >> 1/.hg/hgrc
+ $ echo 'timeout = 10' >> 1/.hg/hgrc
+
+ $ echo foo > 1/foo
+ $ hg --cwd 1 ci -A -m foo
+ adding foo
+
+ $ hg clone 1 2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg clone 2 3
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo '[hooks]' >> 2/.hg/hgrc
+ $ echo 'changegroup.push = hg push -qf ../1' >> 2/.hg/hgrc
+
+ $ echo bar >> 3/foo
+ $ hg --cwd 3 ci -m bar
+
+ $ hg --cwd 3 push ../2
+ pushing to ../2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
diff --git a/tests/test-push-http.t b/tests/test-push-http.t
new file mode 100644
index 0000000..7f3c6d6
--- /dev/null
+++ b/tests/test-push-http.t
@@ -0,0 +1,123 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ cd ..
+ $ hg clone test test2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd test2
+ $ echo a >> a
+ $ hg ci -mb
+ $ req() {
+ > hg serve -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ > hg --cwd ../test2 push http://localhost:$HGPORT/
+ > "$TESTDIR/killdaemons.py"
+ > echo % serve errors
+ > cat errors.log
+ > }
+ $ cd ../test
+
+expect ssl error
+
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: ssl required
+ remote: ssl required
+ updating cb9a9f314b8b to public failed!
+ % serve errors
+
+expect authorization error
+
+ $ echo '[web]' > .hg/hgrc
+ $ echo 'push_ssl = false' >> .hg/hgrc
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: authorization failed
+ % serve errors
+
+expect authorization error: must have authorized user
+
+ $ echo 'allow_push = unperson' >> .hg/hgrc
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: authorization failed
+ % serve errors
+
+expect success
+
+ $ echo 'allow_push = *' >> .hg/hgrc
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup 0" >> .hg/hgrc
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ remote: changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http:*: (glob)
+ % serve errors
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo serve)
+
+expect success, server lacks the httpheader capability
+
+ $ CAP=httpheader
+ $ . "$TESTDIR/notcapable"
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ remote: changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http:*: (glob)
+ % serve errors
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo serve)
+
+expect success, server lacks the unbundlehash capability
+
+ $ CAP=unbundlehash
+ $ . "$TESTDIR/notcapable"
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ remote: changegroup hook: HG_NODE=ba677d0156c1196c1a699fa53f390dcfc3ce3872 HG_SOURCE=serve HG_URL=remote:http:*: (glob)
+ % serve errors
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo serve)
+
+expect authorization error: all users denied
+
+ $ echo '[web]' > .hg/hgrc
+ $ echo 'push_ssl = false' >> .hg/hgrc
+ $ echo 'deny_push = *' >> .hg/hgrc
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: authorization failed
+ % serve errors
+
+expect authorization error: some users denied, users must be authenticated
+
+ $ echo 'deny_push = unperson' >> .hg/hgrc
+ $ req
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: authorization failed
+ % serve errors
+
+ $ cd ..
diff --git a/tests/test-push-r.t b/tests/test-push-r.t
new file mode 100644
index 0000000..d6e541b
--- /dev/null
+++ b/tests/test-push-r.t
@@ -0,0 +1,149 @@
+ $ hg init test
+ $ cd test
+ $ hg unbundle "$TESTDIR/bundles/remote.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > echo
+ > mkdir test-"$i"
+ > hg --cwd test-"$i" init
+ > hg -R test push -r "$i" test-"$i"
+ > cd test-"$i"
+ > hg verify
+ > cd ..
+ > done
+
+ pushing to test-0
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ pushing to test-1
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ pushing to test-2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+ pushing to test-3
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 4 changesets, 4 total revisions
+
+ pushing to test-4
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ pushing to test-5
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+
+ pushing to test-6
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 2 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 4 changesets, 5 total revisions
+
+ pushing to test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 3 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 6 total revisions
+
+ pushing to test-8
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 2 files
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+
+ $ cd test-8
+
+ $ hg pull ../test-7
+ pulling from ../test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 2 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+
+ $ cd ..
diff --git a/tests/test-push-validation.t b/tests/test-push-validation.t
new file mode 100644
index 0000000..a4b49de
--- /dev/null
+++ b/tests/test-push-validation.t
@@ -0,0 +1,53 @@
+ $ hg init test
+ $ cd test
+
+ $ cat > .hg/hgrc <<EOF
+ > [server]
+ > validate=1
+ > EOF
+
+ $ echo alpha > alpha
+ $ echo beta > beta
+ $ hg addr
+ adding alpha
+ adding beta
+ $ hg ci -m 1
+
+ $ cd ..
+ $ hg clone test test-clone
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd test-clone
+ $ cp .hg/store/data/beta.i tmp
+ $ echo blah >> beta
+ $ hg ci -m '2 (corrupt)'
+ $ mv tmp .hg/store/data/beta.i
+
+Expected to fail:
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ beta@1: dddc47b3ba30 in manifests not found
+ 2 files, 2 changesets, 2 total revisions
+ 1 integrity errors encountered!
+ (first damaged changeset appears to be 1)
+ [1]
+
+Expected to fail:
+
+ $ hg push
+ pushing to $TESTTMP/test (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ transaction abort!
+ rollback completed
+ abort: missing file data for beta:dddc47b3ba30e54484720ce0f4f768a0f4b6efb9 - run hg verify
+ [255]
+
+ $ cd ..
diff --git a/tests/test-push-warn.t b/tests/test-push-warn.t
new file mode 100644
index 0000000..37c1589
--- /dev/null
+++ b/tests/test-push-warn.t
@@ -0,0 +1,732 @@
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "graphlog=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+ $ echo foo > t1
+ $ hg add t1
+ $ hg commit -m "1"
+
+ $ cd ..
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd a
+ $ echo foo > t2
+ $ hg add t2
+ $ hg commit -m "2"
+
+ $ cd ../b
+ $ echo foo > t3
+ $ hg add t3
+ $ hg commit -m "3"
+
+ $ hg push ../a
+ pushing to ../a
+ searching for changes
+ abort: push creates new remote head 1e108cc5548c!
+ (you should pull and merge or use push -f to force)
+ [255]
+
+ $ hg push --debug ../a
+ pushing to ../a
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 1, sample size is: 1
+ 2 total queries
+ listing keys for "bookmarks"
+ new remote heads on branch 'default'
+ new remote head 1e108cc5548c
+ abort: push creates new remote head 1e108cc5548c!
+ (you should pull and merge or use push -f to force)
+ [255]
+
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg push ../a
+ pushing to ../a
+ searching for changes
+ abort: push creates new remote head 1e108cc5548c!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg commit -m "4"
+ $ hg push ../a
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 1 changes to 1 files
+
+ $ cd ..
+
+ $ hg init c
+ $ cd c
+ $ for i in 0 1 2; do
+ > echo $i >> foo
+ > hg ci -Am $i
+ > done
+ adding foo
+ $ cd ..
+
+ $ hg clone c d
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd d
+ $ for i in 0 1; do
+ > hg co -C $i
+ > echo d-$i >> foo
+ > hg ci -m d-$i
+ > done
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ created new head
+
+ $ HGMERGE=true hg merge 3
+ merging foo
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg ci -m c-d
+
+ $ hg push ../c
+ pushing to ../c
+ searching for changes
+ abort: push creates new remote head 6346d66eb9f5!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg push -r 2 ../c
+ pushing to ../c
+ searching for changes
+ no changes found
+ [1]
+
+ $ hg push -r 3 ../c
+ pushing to ../c
+ searching for changes
+ abort: push creates new remote head a5dda829a167!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg push -v -r 3 -r 4 ../c
+ pushing to ../c
+ searching for changes
+ new remote heads on branch 'default'
+ new remote head a5dda829a167
+ new remote head ee8fbc7a0295
+ abort: push creates new remote head a5dda829a167!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg push -v -f -r 3 -r 4 ../c
+ pushing to ../c
+ searching for changes
+ 2 changesets found
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files (+2 heads)
+
+ $ hg push -r 5 ../c
+ pushing to ../c
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (-1 heads)
+
+ $ hg in ../c
+ comparing with ../c
+ searching for changes
+ no changes found
+ [1]
+
+
+Issue450: push -r warns about remote head creation even if no heads
+will be created
+
+ $ hg init ../e
+ $ hg push -r 0 ../e
+ pushing to ../e
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ $ hg push -r 1 ../e
+ pushing to ../e
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ $ cd ..
+
+
+Issue736: named branches are not considered for detection of
+unmerged heads in "hg push"
+
+ $ hg init f
+ $ cd f
+ $ hg -q branch a
+ $ echo 0 > foo
+ $ hg -q ci -Am 0
+ $ echo 1 > foo
+ $ hg -q ci -m 1
+ $ hg -q up 0
+ $ echo 2 > foo
+ $ hg -q ci -m 2
+ $ hg -q up 0
+ $ hg -q branch b
+ $ echo 3 > foo
+ $ hg -q ci -m 3
+ $ cd ..
+
+ $ hg -q clone f g
+ $ cd g
+
+Push on existing branch and new branch:
+
+ $ hg -q up 1
+ $ echo 4 > foo
+ $ hg -q ci -m 4
+ $ hg -q up 0
+ $ echo 5 > foo
+ $ hg -q branch c
+ $ hg -q ci -m 5
+
+ $ hg push ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote branches: c!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+ $ hg push -r 4 -r 5 ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote branches: c!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+
+Multiple new branches:
+
+ $ hg -q branch d
+ $ echo 6 > foo
+ $ hg -q ci -m 6
+
+ $ hg push ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote branches: c, d!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+ $ hg push -r 4 -r 6 ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote branches: c, d!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+ $ cd ../g
+
+
+Fail on multiple head push:
+
+ $ hg -q up 1
+ $ echo 7 > foo
+ $ hg -q ci -m 7
+
+ $ hg push -r 4 -r 7 ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote head 0b715ef6ff8f on branch 'a'!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+Push replacement head on existing branches:
+
+ $ hg -q up 3
+ $ echo 8 > foo
+ $ hg -q ci -m 8
+
+ $ hg push -r 7 -r 8 ../f
+ pushing to ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+
+
+Merge of branch a to other branch b followed by unrelated push
+on branch a:
+
+ $ hg -q up 7
+ $ HGMERGE=true hg -q merge 8
+ $ hg -q ci -m 9
+ $ hg -q up 8
+ $ echo 10 > foo
+ $ hg -q ci -m 10
+
+ $ hg push -r 9 ../f
+ pushing to ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (-1 heads)
+
+ $ hg push -r 10 ../f
+ pushing to ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+
+Cheating the counting algorithm:
+
+ $ hg -q up 9
+ $ HGMERGE=true hg -q merge 2
+ $ hg -q ci -m 11
+ $ hg -q up 1
+ $ echo 12 > foo
+ $ hg -q ci -m 12
+
+ $ hg push -r 11 -r 12 ../f
+ pushing to ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+
+
+Failed push of new named branch:
+
+ $ echo 12 > foo
+ $ hg -q ci -m 12a
+ [1]
+ $ hg -q up 11
+ $ echo 13 > foo
+ $ hg -q branch e
+ $ hg -q ci -m 13d
+
+ $ hg push -r 12 -r 13 ../f
+ pushing to ../f
+ searching for changes
+ abort: push creates new remote branches: e!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+
+Using --new-branch to push new named branch:
+
+ $ hg push --new-branch -r 12 -r 13 ../f
+ pushing to ../f
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+
+Checking prepush logic does not allow silently pushing
+multiple new heads:
+
+ $ cd ..
+ $ hg init h
+ $ echo init > h/init
+ $ hg -R h ci -Am init
+ adding init
+ $ echo a > h/a
+ $ hg -R h ci -Am a
+ adding a
+ $ hg clone h i
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R h up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b > h/b
+ $ hg -R h ci -Am b
+ adding b
+ created new head
+ $ hg -R i up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > i/c
+ $ hg -R i ci -Am c
+ adding c
+ created new head
+
+ $ hg -R i push h
+ pushing to h
+ searching for changes
+ abort: push creates new remote head 97bd0c84d346!
+ (you should pull and merge or use push -f to force)
+ [255]
+
+
+Check prepush logic with merged branches:
+
+ $ hg init j
+ $ hg -R j branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo init > j/foo
+ $ hg -R j ci -Am init
+ adding foo
+ $ hg clone j k
+ updating to branch a
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a1 > j/foo
+ $ hg -R j ci -m a1
+ $ hg -R k branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > k/foo
+ $ hg -R k ci -m b
+ $ hg -R k up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R k merge b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg -R k ci -m merge
+
+ $ hg -R k push -r a j
+ pushing to j
+ searching for changes
+ abort: push creates new remote branches: b!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+
+
+Prepush -r should not allow you to sneak in new heads:
+
+ $ hg init l
+ $ cd l
+ $ echo a >> foo
+ $ hg -q add foo
+ $ hg -q branch a
+ $ hg -q ci -ma
+ $ hg -q up null
+ $ echo a >> foo
+ $ hg -q add foo
+ $ hg -q branch b
+ $ hg -q ci -mb
+ $ cd ..
+ $ hg -q clone l m -u a
+ $ cd m
+ $ hg -q merge b
+ $ hg -q ci -mmb
+ $ hg -q up 0
+ $ echo a >> foo
+ $ hg -q ci -ma2
+ $ hg -q up 2
+ $ echo a >> foo
+ $ hg -q branch -f b
+ $ hg -q ci -mb2
+ $ hg -q merge 3
+ $ hg -q ci -mma
+
+ $ hg push ../l -b b
+ pushing to ../l
+ searching for changes
+ abort: push creates new remote head e7e31d71180f on branch 'a'!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ cd ..
+
+
+Check prepush with new branch head on former topo non-head:
+
+ $ hg init n
+ $ cd n
+ $ hg branch A
+ marked working directory as branch A
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >a
+ $ hg ci -Ama
+ adding a
+ $ hg branch B
+ marked working directory as branch B
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b >b
+ $ hg ci -Amb
+ adding b
+
+b is now branch head of B, and a topological head
+a is now branch head of A, but not a topological head
+
+ $ hg clone . inner
+ updating to branch B
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd inner
+ $ hg up B
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b1 >b1
+ $ hg ci -Amb1
+ adding b1
+
+in the clone b1 is now the head of B
+
+ $ cd ..
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a2 >a2
+ $ hg ci -Ama2
+ adding a2
+
+a2 is now the new branch head of A, and a new topological head
+it replaces a former inner branch head, so it should at most warn about
+A, not B
+
+glog of local:
+
+ $ hg glog --template "{rev}: {branches} {desc}\n"
+ @ 2: A a2
+ |
+ | o 1: B b
+ |/
+ o 0: A a
+
+glog of remote:
+
+ $ hg glog -R inner --template "{rev}: {branches} {desc}\n"
+ @ 2: B b1
+ |
+ o 1: B b
+ |
+ o 0: A a
+
+outgoing:
+
+ $ hg out inner --template "{rev}: {branches} {desc}\n"
+ comparing with inner
+ searching for changes
+ 2: A a2
+
+ $ hg push inner
+ pushing to inner
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+
+ $ cd ..
+
+
+Check prepush with new branch head on former topo head:
+
+ $ hg init o
+ $ cd o
+ $ hg branch A
+ marked working directory as branch A
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >a
+ $ hg ci -Ama
+ adding a
+ $ hg branch B
+ marked working directory as branch B
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b >b
+ $ hg ci -Amb
+ adding b
+
+b is now branch head of B, and a topological head
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a1 >a1
+ $ hg ci -Ama1
+ adding a1
+
+a1 is now branch head of A, and a topological head
+
+ $ hg clone . inner
+ updating to branch A
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd inner
+ $ hg up B
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b1 >b1
+ $ hg ci -Amb1
+ adding b1
+
+in the clone b1 is now the head of B
+
+ $ cd ..
+ $ echo a2 >a2
+ $ hg ci -Ama2
+ adding a2
+
+a2 is now the new branch head of A, and a topological head
+it replaces a former topological and branch head, so this should not warn
+
+glog of local:
+
+ $ hg glog --template "{rev}: {branches} {desc}\n"
+ @ 3: A a2
+ |
+ o 2: A a1
+ |
+ | o 1: B b
+ |/
+ o 0: A a
+
+glog of remote:
+
+ $ hg glog -R inner --template "{rev}: {branches} {desc}\n"
+ @ 3: B b1
+ |
+ | o 2: A a1
+ | |
+ o | 1: B b
+ |/
+ o 0: A a
+
+outgoing:
+
+ $ hg out inner --template "{rev}: {branches} {desc}\n"
+ comparing with inner
+ searching for changes
+ 3: A a2
+
+ $ hg push inner
+ pushing to inner
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+ $ cd ..
+
+
+Check prepush with new branch head and new child of former branch head
+but child is on different branch:
+
+ $ hg init p
+ $ cd p
+ $ hg branch A
+ marked working directory as branch A
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a0 >a
+ $ hg ci -Ama0
+ adding a
+ $ echo a1 >a
+ $ hg ci -ma1
+ $ hg up null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch B
+ marked working directory as branch B
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b0 >b
+ $ hg ci -Amb0
+ adding b
+ $ echo b1 >b
+ $ hg ci -mb1
+
+ $ hg clone . inner
+ updating to branch B
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg up A
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch -f B
+ marked working directory as branch B
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a3 >a
+ $ hg ci -ma3
+ created new head
+ $ hg up 3
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg branch -f A
+ marked working directory as branch A
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b3 >b
+ $ hg ci -mb3
+ created new head
+
+glog of local:
+
+ $ hg glog --template "{rev}: {branches} {desc}\n"
+ @ 5: A b3
+ |
+ | o 4: B a3
+ | |
+ o | 3: B b1
+ | |
+ o | 2: B b0
+ /
+ o 1: A a1
+ |
+ o 0: A a0
+
+glog of remote:
+
+ $ hg glog -R inner --template "{rev}: {branches} {desc}\n"
+ @ 3: B b1
+ |
+ o 2: B b0
+
+ o 1: A a1
+ |
+ o 0: A a0
+
+outgoing:
+
+ $ hg out inner --template "{rev}: {branches} {desc}\n"
+ comparing with inner
+ searching for changes
+ 4: B a3
+ 5: A b3
+
+ $ hg push inner
+ pushing to inner
+ searching for changes
+ abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg push inner -r4 -r5
+ pushing to inner
+ searching for changes
+ abort: push creates new remote head 7d0f4fb6cf04 on branch 'A'!
+ (did you forget to merge? use push -f to force)
+ [255]
+
+ $ hg in inner
+ comparing with inner
+ searching for changes
+ no changes found
+ [1]
+
+ $ cd ..
diff --git a/tests/test-qrecord.t b/tests/test-qrecord.t
new file mode 100644
index 0000000..ca218f3
--- /dev/null
+++ b/tests/test-qrecord.t
@@ -0,0 +1,402 @@
+Create configuration
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "interactive=true" >> $HGRCPATH
+
+help record (no record)
+
+ $ hg help record
+ record extension - commands to interactively select changes for
+ commit/qrefresh
+
+ use "hg help extensions" for information on enabling extensions
+
+help qrecord (no record)
+
+ $ hg help qrecord
+ 'qrecord' is provided by the following extension:
+
+ record commands to interactively select changes for commit/qrefresh
+
+ use "hg help extensions" for information on enabling extensions
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "record=" >> $HGRCPATH
+
+help record (record)
+
+ $ hg help record
+ hg record [OPTION]... [FILE]...
+
+ interactively select changes to commit
+
+ If a list of files is omitted, all changes reported by "hg status" will be
+ candidates for recording.
+
+ See "hg help dates" for a list of formats valid for -d/--date.
+
+ You will be prompted for whether to record changes to each modified file,
+ and for files with multiple changes, for each change to use. For each
+ query, the following responses are possible:
+
+ y - record this change
+ n - skip this change
+ e - edit this change manually
+
+ s - skip remaining changes to this file
+ f - record remaining changes to this file
+
+ d - done, skip remaining changes and files
+ a - record all changes to all remaining files
+ q - quit, recording no changes
+
+ ? - display help
+
+ This command is not available when committing a merge.
+
+ options:
+
+ -A --addremove mark new/missing files as added/removed before
+ committing
+ --close-branch mark a branch as closed, hiding it from the branch
+ list
+ --amend amend the parent of the working dir
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -m --message TEXT use text as commit message
+ -l --logfile FILE read commit message from file
+ -d --date DATE record the specified date as commit date
+ -u --user USER record the specified user as committer
+ -S --subrepos recurse into subrepositories
+ -w --ignore-all-space ignore white space when comparing lines
+ -b --ignore-space-change ignore changes in the amount of white space
+ -B --ignore-blank-lines ignore changes whose lines are all blank
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help record" to show more info
+
+help (no mq, so no qrecord)
+
+ $ hg help qrecord
+ hg qrecord [OPTION]... PATCH [FILE]...
+
+ interactively record a new patch
+
+ See "hg help qnew" & "hg help record" for more information and usage.
+
+ use "hg -v help qrecord" to show more info
+
+ $ hg init a
+
+qrecord (mq not present)
+
+ $ hg -R a qrecord
+ hg qrecord: invalid arguments
+ hg qrecord [OPTION]... PATCH [FILE]...
+
+ interactively record a new patch
+
+ use "hg help qrecord" to show the full help text
+ [255]
+
+qrecord patch (mq not present)
+
+ $ hg -R a qrecord patch
+ abort: 'mq' extension not loaded
+ [255]
+
+help (bad mq)
+
+ $ echo "mq=nonexistant" >> $HGRCPATH
+ $ hg help qrecord
+ *** failed to import extension mq from nonexistant: [Errno 2] * (glob)
+ hg qrecord [OPTION]... PATCH [FILE]...
+
+ interactively record a new patch
+
+ See "hg help qnew" & "hg help record" for more information and usage.
+
+ use "hg -v help qrecord" to show more info
+
+help (mq present)
+
+ $ sed 's/mq=nonexistant/mq=/' $HGRCPATH > hgrc.tmp
+ $ mv hgrc.tmp $HGRCPATH
+
+ $ hg help qrecord
+ hg qrecord [OPTION]... PATCH [FILE]...
+
+ interactively record a new patch
+
+ See "hg help qnew" & "hg help record" for more information and usage.
+
+ options:
+
+ -e --edit edit commit message
+ -g --git use git extended diff format
+ -U --currentuser add "From: <current user>" to patch
+ -u --user USER add "From: <USER>" to patch
+ -D --currentdate add "Date: <current date>" to patch
+ -d --date DATE add "Date: <DATE>" to patch
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+ -m --message TEXT use text as commit message
+ -l --logfile FILE read commit message from file
+ -w --ignore-all-space ignore white space when comparing lines
+ -b --ignore-space-change ignore changes in the amount of white space
+ -B --ignore-blank-lines ignore changes whose lines are all blank
+ --mq operate on patch repository
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help qrecord" to show more info
+
+ $ cd a
+
+Base commit
+
+ $ cat > 1.txt <<EOF
+ > 1
+ > 2
+ > 3
+ > 4
+ > 5
+ > EOF
+ $ cat > 2.txt <<EOF
+ > a
+ > b
+ > c
+ > d
+ > e
+ > f
+ > EOF
+
+ $ mkdir dir
+ $ cat > dir/a.txt <<EOF
+ > hello world
+ >
+ > someone
+ > up
+ > there
+ > loves
+ > me
+ > EOF
+
+ $ hg add 1.txt 2.txt dir/a.txt
+ $ hg commit -m 'initial checkin'
+
+Changing files
+
+ $ sed -e 's/2/2 2/;s/4/4 4/' 1.txt > 1.txt.new
+ $ sed -e 's/b/b b/' 2.txt > 2.txt.new
+ $ sed -e 's/hello world/hello world!/' dir/a.txt > dir/a.txt.new
+
+ $ mv -f 1.txt.new 1.txt
+ $ mv -f 2.txt.new 2.txt
+ $ mv -f dir/a.txt.new dir/a.txt
+
+Whole diff
+
+ $ hg diff --nodates
+ diff -r 1057167b20ef 1.txt
+ --- a/1.txt
+ +++ b/1.txt
+ @@ -1,5 +1,5 @@
+ 1
+ -2
+ +2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r 1057167b20ef 2.txt
+ --- a/2.txt
+ +++ b/2.txt
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+ diff -r 1057167b20ef dir/a.txt
+ --- a/dir/a.txt
+ +++ b/dir/a.txt
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+qrecord with bad patch name, should abort before prompting
+
+ $ hg qrecord .hg
+ abort: patch name cannot begin with ".hg"
+ [255]
+
+qrecord a.patch
+
+ $ hg qrecord -d '0 0' -m aaa a.patch <<EOF
+ > y
+ > y
+ > n
+ > y
+ > y
+ > n
+ > EOF
+ diff --git a/1.txt b/1.txt
+ 2 hunks, 2 lines changed
+ examine changes to '1.txt'? [Ynesfdaq?]
+ @@ -1,3 +1,3 @@
+ 1
+ -2
+ +2 2
+ 3
+ record change 1/4 to '1.txt'? [Ynesfdaq?]
+ @@ -3,3 +3,3 @@
+ 3
+ -4
+ +4 4
+ 5
+ record change 2/4 to '1.txt'? [Ynesfdaq?]
+ diff --git a/2.txt b/2.txt
+ 1 hunks, 1 lines changed
+ examine changes to '2.txt'? [Ynesfdaq?]
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+ record change 3/4 to '2.txt'? [Ynesfdaq?]
+ diff --git a/dir/a.txt b/dir/a.txt
+ 1 hunks, 1 lines changed
+ examine changes to 'dir/a.txt'? [Ynesfdaq?]
+
+After qrecord a.patch 'tip'"
+
+ $ hg tip -p
+ changeset: 1:5d1ca63427ee
+ tag: a.patch
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: aaa
+
+ diff -r 1057167b20ef -r 5d1ca63427ee 1.txt
+ --- a/1.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ 1
+ -2
+ +2 2
+ 3
+ 4
+ 5
+ diff -r 1057167b20ef -r 5d1ca63427ee 2.txt
+ --- a/2.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/2.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ a
+ -b
+ +b b
+ c
+ d
+ e
+
+
+After qrecord a.patch 'diff'"
+
+ $ hg diff --nodates
+ diff -r 5d1ca63427ee 1.txt
+ --- a/1.txt
+ +++ b/1.txt
+ @@ -1,5 +1,5 @@
+ 1
+ 2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r 5d1ca63427ee dir/a.txt
+ --- a/dir/a.txt
+ +++ b/dir/a.txt
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+qrecord b.patch
+
+ $ hg qrecord -d '0 0' -m bbb b.patch <<EOF
+ > y
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/1.txt b/1.txt
+ 1 hunks, 1 lines changed
+ examine changes to '1.txt'? [Ynesfdaq?]
+ @@ -1,5 +1,5 @@
+ 1
+ 2 2
+ 3
+ -4
+ +4 4
+ 5
+ record change 1/2 to '1.txt'? [Ynesfdaq?]
+ diff --git a/dir/a.txt b/dir/a.txt
+ 1 hunks, 1 lines changed
+ examine changes to 'dir/a.txt'? [Ynesfdaq?]
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+ record change 2/2 to 'dir/a.txt'? [Ynesfdaq?]
+
+After qrecord b.patch 'tip'
+
+ $ hg tip -p
+ changeset: 2:b056198bf878
+ tag: b.patch
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: bbb
+
+ diff -r 5d1ca63427ee -r b056198bf878 1.txt
+ --- a/1.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/1.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,5 +1,5 @@
+ 1
+ 2 2
+ 3
+ -4
+ +4 4
+ 5
+ diff -r 5d1ca63427ee -r b056198bf878 dir/a.txt
+ --- a/dir/a.txt Thu Jan 01 00:00:00 1970 +0000
+ +++ b/dir/a.txt Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,4 +1,4 @@
+ -hello world
+ +hello world!
+
+ someone
+ up
+
+
+After qrecord b.patch 'diff'
+
+ $ hg diff --nodates
+
+ $ cd ..
diff --git a/tests/test-rebase-abort.t b/tests/test-rebase-abort.t
new file mode 100644
index 0000000..3be364e
--- /dev/null
+++ b/tests/test-rebase-abort.t
@@ -0,0 +1,158 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo c1 > common
+ $ hg add common
+ $ hg ci -m C1
+
+ $ echo c2 >> common
+ $ hg ci -m C2
+
+ $ echo c3 >> common
+ $ hg ci -m C3
+
+ $ hg up -q -C 1
+
+ $ echo l1 >> extra
+ $ hg add extra
+ $ hg ci -m L1
+ created new head
+
+ $ sed -e 's/c2/l2/' common > common.new
+ $ mv common.new common
+ $ hg ci -m L2
+
+ $ hg phase --force --secret 2
+
+ $ hg tglog
+ @ 4:draft 'L2'
+ |
+ o 3:draft 'L1'
+ |
+ | o 2:secret 'C3'
+ |/
+ o 1:draft 'C2'
+ |
+ o 0:draft 'C1'
+
+
+Conflicting rebase:
+
+ $ hg rebase -s 3 -d 2
+ merging common
+ warning: conflicts during merge.
+ merging common incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Abort:
+
+ $ hg rebase --abort
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+ rebase aborted
+
+ $ hg tglog
+ @ 4:draft 'L2'
+ |
+ o 3:draft 'L1'
+ |
+ | o 2:secret 'C3'
+ |/
+ o 1:draft 'C2'
+ |
+ o 0:draft 'C1'
+
+ $ cd ..
+
+
+Constrcut new repo:
+
+ $ hg init b
+ $ cd b
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+
+ $ echo c > c
+ $ hg ci -Am C
+ adding c
+
+ $ hg up -q 0
+
+ $ echo b > b
+ $ hg ci -Am 'B bis'
+ adding b
+ created new head
+
+ $ echo c1 > c
+ $ hg ci -Am C1
+ adding c
+
+ $ hg phase --force --secret 1
+ $ hg phase --public 1
+
+Rebase and abort without generating new changesets:
+
+ $ hg tglog
+ @ 4:draft 'C1'
+ |
+ o 3:draft 'B bis'
+ |
+ | o 2:secret 'C'
+ | |
+ | o 1:public 'B'
+ |/
+ o 0:public 'A'
+
+ $ hg rebase -b 4 -d 2
+ merging c
+ warning: conflicts during merge.
+ merging c incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+ $ hg tglog
+ @ 4:draft 'C1'
+ |
+ o 3:draft 'B bis'
+ |
+ | @ 2:secret 'C'
+ | |
+ | o 1:public 'B'
+ |/
+ o 0:public 'A'
+
+ $ hg rebase -a
+ rebase aborted
+
+ $ hg tglog
+ @ 4:draft 'C1'
+ |
+ o 3:draft 'B bis'
+ |
+ | o 2:secret 'C'
+ | |
+ | o 1:public 'B'
+ |/
+ o 0:public 'A'
+
+
+ $ cd ..
diff --git a/tests/test-rebase-bookmarks.t b/tests/test-rebase-bookmarks.t
new file mode 100644
index 0000000..fe5a251
--- /dev/null
+++ b/tests/test-rebase-bookmarks.t
@@ -0,0 +1,113 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' bookmarks: {bookmarks}\n"
+ > EOF
+
+Create a repo with several bookmarks
+ $ hg init a
+ $ cd a
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+ $ hg book 'X'
+ $ hg book 'Y'
+
+ $ echo c > c
+ $ hg ci -Am C
+ adding c
+ $ hg book 'Z'
+
+ $ hg up -q 0
+
+ $ echo d > d
+ $ hg ci -Am D
+ adding d
+ created new head
+
+ $ hg book W
+
+ $ hg tglog
+ @ 3: 'D' bookmarks: W
+ |
+ | o 2: 'C' bookmarks: Y Z
+ | |
+ | o 1: 'B' bookmarks: X
+ |/
+ o 0: 'A' bookmarks:
+
+
+Move only rebased bookmarks
+
+ $ cd ..
+ $ hg clone -q a a1
+
+ $ cd a1
+ $ hg up -q Z
+
+ $ hg rebase -s Y -d 3
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'C' bookmarks: Y Z
+ |
+ o 2: 'D' bookmarks: W
+ |
+ | o 1: 'B' bookmarks: X
+ |/
+ o 0: 'A' bookmarks:
+
+Keep bookmarks to the correct rebased changeset
+
+ $ cd ..
+ $ hg clone -q a a2
+
+ $ cd a2
+ $ hg up -q Z
+
+ $ hg rebase -s 1 -d 3
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'C' bookmarks: Y Z
+ |
+ o 2: 'B' bookmarks: X
+ |
+ o 1: 'D' bookmarks: W
+ |
+ o 0: 'A' bookmarks:
+
+
+Keep active bookmark on the correct changeset
+
+ $ cd ..
+ $ hg clone -q a a3
+
+ $ cd a3
+ $ hg up -q X
+
+ $ hg rebase -d W
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'C' bookmarks: Y Z
+ |
+ o 2: 'B' bookmarks: X
+ |
+ o 1: 'D' bookmarks: W
+ |
+ o 0: 'A' bookmarks:
+
+
+ $ cd ..
diff --git a/tests/test-rebase-cache.t b/tests/test-rebase-cache.t
new file mode 100644
index 0000000..81fa012
--- /dev/null
+++ b/tests/test-rebase-cache.t
@@ -0,0 +1,387 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ > mq=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > theads = heads --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+ $ hg init a
+ $ cd a
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+
+ $ hg branch branch1
+ marked working directory as branch branch1
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'branch1'
+
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+
+ $ hg up -q 0
+
+ $ hg branch branch2
+ marked working directory as branch branch2
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'branch2'
+
+ $ echo c > C
+ $ hg ci -Am C
+ adding C
+
+ $ hg up -q 2
+
+ $ hg branch -f branch2
+ marked working directory as branch branch2
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo d > d
+ $ hg ci -Am D
+ adding d
+ created new head
+
+ $ echo e > e
+ $ hg ci -Am E
+ adding e
+
+ $ hg update default
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+
+ $ hg branch branch3
+ marked working directory as branch branch3
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'branch3'
+
+ $ echo f > f
+ $ hg ci -Am F
+ adding f
+
+ $ cd ..
+
+
+Rebase part of branch2 (5-6) onto branch3 (8):
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+
+ $ hg tglog
+ @ 8: 'F' branch3
+ |
+ o 7: 'branch3' branch3
+ |
+ | o 6: 'E' branch2
+ | |
+ | o 5: 'D' branch2
+ | |
+ | | o 4: 'C' branch2
+ | | |
+ +---o 3: 'branch2' branch2
+ | |
+ | o 2: 'B' branch1
+ | |
+ | o 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ hg branches
+ branch3 8:4666b71e8e32
+ branch2 6:5097051d331d
+ branch1 2:0a03079c47fd (inactive)
+ default 0:1994f17a630e (inactive)
+
+ $ hg theads
+ 8: 'F' branch3
+ 6: 'E' branch2
+ 4: 'C' branch2
+ 2: 'B' branch1
+ 0: 'A'
+
+ $ hg rebase -s 5 -d 8
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg branches
+ branch3 8:466cdfb14b62
+ branch2 4:e4fdb121d036
+ branch1 2:0a03079c47fd
+ default 0:1994f17a630e (inactive)
+
+ $ hg theads
+ 8: 'E' branch3
+ 4: 'C' branch2
+ 2: 'B' branch1
+ 0: 'A'
+
+ $ hg tglog
+ @ 8: 'E' branch3
+ |
+ o 7: 'D' branch3
+ |
+ o 6: 'F' branch3
+ |
+ o 5: 'branch3' branch3
+ |
+ | o 4: 'C' branch2
+ | |
+ | o 3: 'branch2' branch2
+ |/
+ | o 2: 'B' branch1
+ | |
+ | o 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebase head of branch3 (8) onto branch2 (6):
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+
+ $ hg tglog
+ @ 8: 'F' branch3
+ |
+ o 7: 'branch3' branch3
+ |
+ | o 6: 'E' branch2
+ | |
+ | o 5: 'D' branch2
+ | |
+ | | o 4: 'C' branch2
+ | | |
+ +---o 3: 'branch2' branch2
+ | |
+ | o 2: 'B' branch1
+ | |
+ | o 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 8 -d 6
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg branches
+ branch2 8:6b4bdc1b5ac0
+ branch3 7:653b9feb4616
+ branch1 2:0a03079c47fd (inactive)
+ default 0:1994f17a630e (inactive)
+
+ $ hg theads
+ 8: 'F' branch2
+ 7: 'branch3' branch3
+ 4: 'C' branch2
+ 2: 'B' branch1
+ 0: 'A'
+
+ $ hg tglog
+ @ 8: 'F' branch2
+ |
+ | o 7: 'branch3' branch3
+ | |
+ o | 6: 'E' branch2
+ | |
+ o | 5: 'D' branch2
+ | |
+ | | o 4: 'C' branch2
+ | | |
+ | | o 3: 'branch2' branch2
+ | |/
+ o | 2: 'B' branch1
+ | |
+ o | 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ hg verify -q
+
+ $ cd ..
+
+
+Rebase entire branch3 (7-8) onto branch2 (6):
+
+ $ hg clone -q -u . a a3
+ $ cd a3
+
+ $ hg tglog
+ @ 8: 'F' branch3
+ |
+ o 7: 'branch3' branch3
+ |
+ | o 6: 'E' branch2
+ | |
+ | o 5: 'D' branch2
+ | |
+ | | o 4: 'C' branch2
+ | | |
+ +---o 3: 'branch2' branch2
+ | |
+ | o 2: 'B' branch1
+ | |
+ | o 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 7 -d 6
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg branches
+ branch2 7:6b4bdc1b5ac0
+ branch1 2:0a03079c47fd (inactive)
+ default 0:1994f17a630e (inactive)
+
+ $ hg theads
+ 7: 'F' branch2
+ 4: 'C' branch2
+ 2: 'B' branch1
+ 0: 'A'
+
+ $ hg tglog
+ @ 7: 'F' branch2
+ |
+ o 6: 'E' branch2
+ |
+ o 5: 'D' branch2
+ |
+ | o 4: 'C' branch2
+ | |
+ | o 3: 'branch2' branch2
+ | |
+ o | 2: 'B' branch1
+ | |
+ o | 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+ $ hg verify -q
+
+Stripping multiple branches in one go bypasses the fast-case code to
+update the branch cache.
+
+ $ hg strip 2
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ o 3: 'C' branch2
+ |
+ o 2: 'branch2' branch2
+ |
+ | @ 1: 'branch1' branch1
+ |/
+ o 0: 'A'
+
+
+ $ hg branches
+ branch2 3:e4fdb121d036
+ branch1 1:63379ac49655
+ default 0:1994f17a630e (inactive)
+
+ $ hg theads
+ 3: 'C' branch2
+ 1: 'branch1' branch1
+ 0: 'A'
+
+Fast path branchcache code should not be invoked if branches stripped is not
+the same as branches remaining.
+
+ $ hg init b
+ $ cd b
+
+ $ hg branch branch1
+ marked working directory as branch branch1
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'branch1'
+
+ $ hg branch branch2
+ marked working directory as branch branch2
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'branch2'
+
+ $ hg branch -f branch1
+ marked working directory as branch branch1
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ echo a > A
+ $ hg ci -Am A
+ adding A
+ created new head
+
+ $ hg tglog
+ @ 2: 'A' branch1
+ |
+ o 1: 'branch2' branch2
+ |
+ o 0: 'branch1' branch1
+
+
+ $ hg theads
+ 2: 'A' branch1
+ 1: 'branch2' branch2
+
+ $ hg strip 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/a3/b/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg theads
+ 1: 'branch2' branch2
+ 0: 'branch1' branch1
+
+
+Make sure requesting to strip a revision already stripped does not confuse things.
+Try both orders.
+
+ $ cd ..
+
+ $ hg init c
+ $ cd c
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+ $ echo c > c
+ $ hg ci -Am C
+ adding c
+ $ echo d > d
+ $ hg ci -Am D
+ adding d
+ $ echo e > e
+ $ hg ci -Am E
+ adding e
+
+ $ hg tglog
+ @ 4: 'E'
+ |
+ o 3: 'D'
+ |
+ o 2: 'C'
+ |
+ o 1: 'B'
+ |
+ o 0: 'A'
+
+
+ $ hg strip 3 4
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg theads
+ 2: 'C'
+
+ $ hg strip 2 1
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/a3/c/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg theads
+ 0: 'A'
diff --git a/tests/test-rebase-check-restore.t b/tests/test-rebase-check-restore.t
new file mode 100644
index 0000000..c664725
--- /dev/null
+++ b/tests/test-rebase-check-restore.t
@@ -0,0 +1,150 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo A > A
+ $ hg add A
+ $ hg ci -m A
+
+ $ echo 'B' > B
+ $ hg add B
+ $ hg ci -m B
+
+ $ echo C >> A
+ $ hg ci -m C
+
+ $ hg up -q -C 0
+
+ $ echo D >> A
+ $ hg ci -m D
+ created new head
+
+ $ echo E > E
+ $ hg add E
+ $ hg ci -m E
+
+ $ hg up -q -C 0
+
+ $ hg branch 'notdefault'
+ marked working directory as branch notdefault
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo F >> A
+ $ hg ci -m F
+
+ $ cd ..
+
+
+Rebasing B onto E - check keep: and phases
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+ $ hg phase --force --secret 2
+
+ $ hg tglog
+ @ 5:draft 'F' notdefault
+ |
+ | o 4:draft 'E'
+ | |
+ | o 3:draft 'D'
+ |/
+ | o 2:secret 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ hg rebase -s 1 -d 4 --keep
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Solve the conflict and go on:
+
+ $ echo 'conflict solved' > A
+ $ rm A.orig
+ $ hg resolve -m A
+ $ hg rebase --continue
+
+ $ hg tglog
+ @ 7:secret 'C'
+ |
+ o 6:draft 'B'
+ |
+ | o 5:draft 'F' notdefault
+ | |
+ o | 4:draft 'E'
+ | |
+ o | 3:draft 'D'
+ |/
+ | o 2:secret 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ cd ..
+
+
+Rebase F onto E - check keepbranches:
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+ $ hg phase --force --secret 2
+
+ $ hg tglog
+ @ 5:draft 'F' notdefault
+ |
+ | o 4:draft 'E'
+ | |
+ | o 3:draft 'D'
+ |/
+ | o 2:secret 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ hg rebase -s 5 -d 4 --keepbranches
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Solve the conflict and go on:
+
+ $ echo 'conflict solved' > A
+ $ rm A.orig
+ $ hg resolve -m A
+ $ hg rebase --continue
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 5:draft 'F' notdefault
+ |
+ o 4:draft 'E'
+ |
+ o 3:draft 'D'
+ |
+ | o 2:secret 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+
+ $ cd ..
diff --git a/tests/test-rebase-collapse.t b/tests/test-rebase-collapse.t
new file mode 100644
index 0000000..a89b8fe
--- /dev/null
+++ b/tests/test-rebase-collapse.t
@@ -0,0 +1,722 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ > mq=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ > EOF
+
+Create repo a:
+
+ $ hg init a
+ $ cd a
+ $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 7 changes to 7 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebasing B onto H and collapsing changesets with different phases:
+
+
+ $ hg clone -q -u 3 a a1
+ $ cd a1
+
+ $ hg phase --force --secret 3
+
+ $ hg rebase --collapse --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglogp
+ @ 5:secret 'Collapsed revision
+ | * B
+ | * C
+ | * D'
+ o 4:draft 'H'
+ |
+ | o 3:draft 'G'
+ |/|
+ o | 2:draft 'F'
+ | |
+ | o 1:draft 'E'
+ |/
+ o 0:draft 'A'
+
+ $ hg manifest
+ A
+ B
+ C
+ D
+ F
+ H
+
+ $ cd ..
+
+
+Rebasing E onto H:
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+
+ $ hg phase --force --secret 6
+ $ hg rebase --source 4 --collapse
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 6: 'Collapsed revision
+ | * E
+ | * G'
+ o 5: 'H'
+ |
+ o 4: 'F'
+ |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ E
+ F
+ H
+
+ $ cd ..
+
+Rebasing G onto H with custom message:
+
+ $ hg clone -q -u . a a3
+ $ cd a3
+
+ $ hg rebase --base 6 -m 'custom message'
+ abort: message can only be specified with collapse
+ [255]
+
+ $ hg rebase --source 4 --collapse -m 'custom message'
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 6: 'custom message'
+ |
+ o 5: 'H'
+ |
+ o 4: 'F'
+ |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ E
+ F
+ H
+
+ $ cd ..
+
+Create repo b:
+
+ $ hg init b
+ $ cd b
+
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+
+ $ hg up -q 0
+
+ $ echo C > C
+ $ hg ci -Am C
+ adding C
+ created new head
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ echo D > D
+ $ hg ci -Am D
+ adding D
+
+ $ hg up -q 1
+
+ $ echo E > E
+ $ hg ci -Am E
+ adding E
+ created new head
+
+ $ echo F > F
+ $ hg ci -Am F
+ adding F
+
+ $ hg merge
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m G
+
+ $ hg up -q 0
+
+ $ echo H > H
+ $ hg ci -Am H
+ adding H
+ created new head
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ | |\
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | | |
+ | o | 3: 'D'
+ | |\|
+ | o | 2: 'C'
+ |/ /
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebase and collapse - more than one external (fail):
+
+ $ hg clone -q -u . b b1
+ $ cd b1
+
+ $ hg rebase -s 2 --collapse
+ abort: unable to collapse, there is more than one external parent
+ [255]
+
+Rebase and collapse - E onto H:
+
+ $ hg rebase -s 4 --collapse # root (4) is not a merge
+ saved backup bundle to $TESTTMP/b1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 5: 'Collapsed revision
+ |\ * E
+ | | * F
+ | | * G'
+ | o 4: 'H'
+ | |
+ o | 3: 'D'
+ |\ \
+ | o | 2: 'C'
+ | |/
+ o / 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ C
+ D
+ E
+ F
+ H
+
+ $ cd ..
+
+
+
+
+Test that branchheads cache is updated correctly when doing a strip in which
+the parent of the ancestor node to be stripped does not become a head and
+also, the parent of a node that is a child of the node stripped becomes a head
+(node 3).
+
+ $ hg clone -q -u . b b2
+ $ cd b2
+
+ $ hg heads --template="{rev}:{node} {branch}\n"
+ 7:c65502d4178782309ce0574c5ae6ee9485a9bafa default
+ 6:c772a8b2dc17629cec88a19d09c926c4814b12c7 default
+
+ $ cat $TESTTMP/b2/.hg/cache/branchheads
+ c65502d4178782309ce0574c5ae6ee9485a9bafa 7
+ c772a8b2dc17629cec88a19d09c926c4814b12c7 default
+ c65502d4178782309ce0574c5ae6ee9485a9bafa default
+
+ $ hg strip 4
+ saved backup bundle to $TESTTMP/b2/.hg/strip-backup/8a5212ebc852-backup.hg (glob)
+
+ $ cat $TESTTMP/b2/.hg/cache/branchheads
+ c65502d4178782309ce0574c5ae6ee9485a9bafa 4
+ 2870ad076e541e714f3c2bc32826b5c6a6e5b040 default
+ c65502d4178782309ce0574c5ae6ee9485a9bafa default
+
+ $ hg heads --template="{rev}:{node} {branch}\n"
+ 4:c65502d4178782309ce0574c5ae6ee9485a9bafa default
+ 3:2870ad076e541e714f3c2bc32826b5c6a6e5b040 default
+
+ $ cd ..
+
+
+
+
+
+
+Create repo c:
+
+ $ hg init c
+ $ cd c
+
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+
+ $ hg up -q 0
+
+ $ echo C > C
+ $ hg ci -Am C
+ adding C
+ created new head
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ echo D > D
+ $ hg ci -Am D
+ adding D
+
+ $ hg up -q 1
+
+ $ echo E > E
+ $ hg ci -Am E
+ adding E
+ created new head
+ $ echo F > E
+ $ hg ci -m 'F'
+
+ $ echo G > G
+ $ hg ci -Am G
+ adding G
+
+ $ hg merge
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg ci -m H
+
+ $ hg up -q 0
+
+ $ echo I > I
+ $ hg ci -Am I
+ adding I
+ created new head
+
+ $ hg tglog
+ @ 8: 'I'
+ |
+ | o 7: 'H'
+ | |\
+ | | o 6: 'G'
+ | | |
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | | |
+ | o | 3: 'D'
+ | |\|
+ | o | 2: 'C'
+ |/ /
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebase and collapse - E onto I:
+
+ $ hg clone -q -u . c c1
+ $ cd c1
+
+ $ hg rebase -s 4 --collapse # root (4) is not a merge
+ merging E
+ saved backup bundle to $TESTTMP/c1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 5: 'Collapsed revision
+ |\ * E
+ | | * F
+ | | * G
+ | | * H'
+ | o 4: 'I'
+ | |
+ o | 3: 'D'
+ |\ \
+ | o | 2: 'C'
+ | |/
+ o / 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ C
+ D
+ E
+ G
+ I
+
+ $ cat E
+ F
+
+ $ cd ..
+
+
+Create repo d:
+
+ $ hg init d
+ $ cd d
+
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+ $ echo C > C
+ $ hg ci -Am C
+ adding C
+
+ $ hg up -q 1
+
+ $ echo D > D
+ $ hg ci -Am D
+ adding D
+ created new head
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg ci -m E
+
+ $ hg up -q 0
+
+ $ echo F > F
+ $ hg ci -Am F
+ adding F
+ created new head
+
+ $ hg tglog
+ @ 5: 'F'
+ |
+ | o 4: 'E'
+ | |\
+ | | o 3: 'D'
+ | | |
+ | o | 2: 'C'
+ | |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebase and collapse - B onto F:
+
+ $ hg clone -q -u . d d1
+ $ cd d1
+
+ $ hg rebase -s 1 --collapse
+ saved backup bundle to $TESTTMP/d1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 2: 'Collapsed revision
+ | * B
+ | * C
+ | * D
+ | * E'
+ o 1: 'F'
+ |
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ B
+ C
+ D
+ F
+
+Interactions between collapse and keepbranches
+ $ cd ..
+ $ hg init e
+ $ cd e
+ $ echo 'a' > a
+ $ hg ci -Am 'A'
+ adding a
+
+ $ hg branch '1'
+ marked working directory as branch 1
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 'b' > b
+ $ hg ci -Am 'B'
+ adding b
+
+ $ hg branch '2'
+ marked working directory as branch 2
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo 'c' > c
+ $ hg ci -Am 'C'
+ adding c
+
+ $ hg up -q 0
+ $ echo 'd' > d
+ $ hg ci -Am 'D'
+ adding d
+
+ $ hg tglog
+ @ 3: 'D'
+ |
+ | o 2: 'C' 2
+ | |
+ | o 1: 'B' 1
+ |/
+ o 0: 'A'
+
+ $ hg rebase --keepbranches --collapse -s 1 -d 3
+ abort: cannot collapse multiple named branches
+ [255]
+
+ $ repeatchange() {
+ > hg checkout $1
+ > hg cp d z
+ > echo blah >> z
+ > hg commit -Am "$2" --user "$3"
+ > }
+ $ repeatchange 3 "E" "user1"
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ repeatchange 3 "E" "user2"
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ created new head
+ $ hg tglog
+ @ 5: 'E'
+ |
+ | o 4: 'E'
+ |/
+ o 3: 'D'
+ |
+ | o 2: 'C' 2
+ | |
+ | o 1: 'B' 1
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 5 -d 4
+ saved backup bundle to $TESTTMP/e/.hg/strip-backup/*-backup.hg (glob)
+ $ hg tglog
+ @ 4: 'E'
+ |
+ o 3: 'D'
+ |
+ | o 2: 'C' 2
+ | |
+ | o 1: 'B' 1
+ |/
+ o 0: 'A'
+
+ $ hg export tip
+ # HG changeset patch
+ # User user1
+ # Date 0 0
+ # Node ID f338eb3c2c7cc5b5915676a2376ba7ac558c5213
+ # Parent 41acb9dca9eb976e84cd21fcb756b4afa5a35c09
+ E
+
+ diff -r 41acb9dca9eb -r f338eb3c2c7c z
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/z Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,2 @@
+ +d
+ +blah
+
+ $ cd ..
+
+Rebase, collapse and copies
+
+ $ hg init copies
+ $ cd copies
+ $ hg unbundle "$TESTDIR/bundles/renames.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 11 changes to 7 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up -q tip
+ $ hg tglog
+ @ 3: 'move2'
+ |
+ o 2: 'move1'
+ |
+ | o 1: 'change'
+ |/
+ o 0: 'add'
+
+ $ hg rebase --collapse -d 1
+ merging a and d to d
+ merging b and e to e
+ merging c and f to f
+ merging e and g to g
+ merging f and c to c
+ saved backup bundle to $TESTTMP/copies/.hg/strip-backup/*-backup.hg (glob)
+ $ hg st
+ $ hg st --copies --change .
+ A d
+ a
+ A g
+ b
+ R b
+ $ cat c
+ c
+ c
+ $ cat d
+ a
+ a
+ $ cat g
+ b
+ b
+ $ hg log -r . --template "{file_copies}\n"
+ d (a)g (b)
+
+Test collapsing a middle revision in-place
+
+ $ hg tglog
+ @ 2: 'Collapsed revision
+ | * move1
+ | * move2'
+ o 1: 'change'
+ |
+ o 0: 'add'
+
+ $ hg rebase --collapse -r 1 -d 0
+ abort: can't remove original changesets with unrebased descendants
+ (use --keep to keep original changesets)
+ [255]
+
+Test collapsing in place
+
+ $ hg rebase --collapse -b . -d 0
+ saved backup bundle to $TESTTMP/copies/.hg/strip-backup/*-backup.hg (glob)
+ $ hg st --change . --copies
+ M a
+ M c
+ A d
+ a
+ A g
+ b
+ R b
+ $ cat a
+ a
+ a
+ $ cat c
+ c
+ c
+ $ cat d
+ a
+ a
+ $ cat g
+ b
+ b
+ $ cd ..
+
+
+Test stripping a revision with another child
+
+ $ hg init f
+ $ cd f
+
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+
+ $ hg up -q 0
+
+ $ echo C > C
+ $ hg ci -Am C
+ adding C
+ created new head
+
+ $ hg tglog
+ @ 2: 'C'
+ |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+
+ $ hg heads --template="{rev}:{node} {branch}: {desc}\n"
+ 2:c5cefa58fd557f84b72b87f970135984337acbc5 default: C
+ 1:27547f69f25460a52fff66ad004e58da7ad3fb56 default: B
+
+ $ hg strip 2
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to $TESTTMP/f/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ o 1: 'B'
+ |
+ @ 0: 'A'
+
+
+
+ $ hg heads --template="{rev}:{node} {branch}: {desc}\n"
+ 1:27547f69f25460a52fff66ad004e58da7ad3fb56 default: B
+
+ $ cd ..
+
+
+
+
diff --git a/tests/test-rebase-conflicts.t b/tests/test-rebase-conflicts.t
new file mode 100644
index 0000000..9d0a156
--- /dev/null
+++ b/tests/test-rebase-conflicts.t
@@ -0,0 +1,121 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ > EOF
+
+ $ hg init a
+ $ cd a
+ $ echo c1 >common
+ $ hg add common
+ $ hg ci -m C1
+
+ $ echo c2 >>common
+ $ hg ci -m C2
+
+ $ echo c3 >>common
+ $ hg ci -m C3
+
+ $ hg up -q -C 1
+
+ $ echo l1 >>extra
+ $ hg add extra
+ $ hg ci -m L1
+ created new head
+
+ $ sed -e 's/c2/l2/' common > common.new
+ $ mv common.new common
+ $ hg ci -m L2
+
+ $ echo l3 >> extra2
+ $ hg add extra2
+ $ hg ci -m L3
+
+ $ hg phase --force --secret 4
+
+ $ hg tglog
+ @ 5:secret 'L3'
+ |
+ o 4:secret 'L2'
+ |
+ o 3:draft 'L1'
+ |
+ | o 2:draft 'C3'
+ |/
+ o 1:draft 'C2'
+ |
+ o 0:draft 'C1'
+
+Try to call --continue:
+
+ $ hg rebase --continue
+ abort: no rebase in progress
+ [255]
+
+Conflicting rebase:
+
+ $ hg rebase -s 3 -d 2
+ merging common
+ warning: conflicts during merge.
+ merging common incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Try to continue without solving the conflict:
+
+ $ hg rebase --continue
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+
+Conclude rebase:
+
+ $ echo 'resolved merge' >common
+ $ hg resolve -m common
+ $ hg rebase --continue
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 5:secret 'L3'
+ |
+ o 4:secret 'L2'
+ |
+ o 3:draft 'L1'
+ |
+ o 2:draft 'C3'
+ |
+ o 1:draft 'C2'
+ |
+ o 0:draft 'C1'
+
+Check correctness:
+
+ $ hg cat -r 0 common
+ c1
+
+ $ hg cat -r 1 common
+ c1
+ c2
+
+ $ hg cat -r 2 common
+ c1
+ c2
+ c3
+
+ $ hg cat -r 3 common
+ c1
+ c2
+ c3
+
+ $ hg cat -r 4 common
+ resolved merge
+
+ $ hg cat -r 5 common
+ resolved merge
+
+ $ cd ..
diff --git a/tests/test-rebase-detach.t b/tests/test-rebase-detach.t
new file mode 100644
index 0000000..cacc754
--- /dev/null
+++ b/tests/test-rebase-detach.t
@@ -0,0 +1,400 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+ $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 7 changes to 7 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
+
+
+Rebasing D onto H detaching from C:
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg phase --force --secret 3
+ $ hg rebase -s 3 -d 7
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ @ 7:secret 'D'
+ |
+ o 6:draft 'H'
+ |
+ | o 5:draft 'G'
+ |/|
+ o | 4:draft 'F'
+ | |
+ | o 3:draft 'E'
+ |/
+ | o 2:draft 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ hg manifest
+ A
+ D
+ F
+ H
+
+ $ cd ..
+
+
+Rebasing C onto H detaching from B:
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 2 -d 7
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'D'
+ |
+ o 6: 'C'
+ |
+ o 5: 'H'
+ |
+ | o 4: 'G'
+ |/|
+ o | 3: 'F'
+ | |
+ | o 2: 'E'
+ |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ C
+ D
+ F
+ H
+
+ $ cd ..
+
+
+Rebasing B onto H using detach (same as not using it):
+
+ $ hg clone -q -u . a a3
+ $ cd a3
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 1 -d 7
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'D'
+ |
+ o 6: 'C'
+ |
+ o 5: 'B'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ hg manifest
+ A
+ B
+ C
+ D
+ F
+ H
+
+ $ cd ..
+
+
+Rebasing C onto H detaching from B and collapsing:
+
+ $ hg clone -q -u . a a4
+ $ cd a4
+ $ hg phase --force --secret 3
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase --collapse -s 2 -d 7
+ saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ @ 6:secret 'Collapsed revision
+ | * C
+ | * D'
+ o 5:draft 'H'
+ |
+ | o 4:draft 'G'
+ |/|
+ o | 3:draft 'F'
+ | |
+ | o 2:draft 'E'
+ |/
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ hg manifest
+ A
+ C
+ D
+ F
+ H
+
+ $ cd ..
+
+Rebasing across null as ancestor
+ $ hg clone -q -U a a5
+
+ $ cd a5
+
+ $ echo x > x
+
+ $ hg add x
+
+ $ hg ci -m "extra branch"
+ created new head
+
+ $ hg tglog
+ @ 8: 'extra branch'
+
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 1 -d tip
+ saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'extra branch'
+
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+
+ $ hg rebase -d 5 -s 7
+ saved backup bundle to $TESTTMP/a5/.hg/strip-backup/13547172c9c0-backup.hg (glob)
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ | o 6: 'B'
+ |/
+ o 5: 'extra branch'
+
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+Verify that target is not selected as external rev (issue3085)
+
+ $ hg clone -q -U a a6
+ $ cd a6
+ $ hg up -q 6
+
+ $ echo "I" >> E
+ $ hg ci -m "I"
+ $ hg merge 7
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m "Merge"
+ $ echo "J" >> F
+ $ hg ci -m "J"
+
+ $ hg rebase -s 8 -d 7 --collapse --config ui.merge=internal:other
+ remote changed E which local deleted
+ use (c)hanged version or leave (d)eleted? c
+ saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'Collapsed revision
+ | * I
+ | * Merge
+ | * J'
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ hg parents
+ changeset: 8:9472f4b1d736
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Collapsed revision
+
+
+ $ cd ..
+
+Ensure --continue restores a correct state (issue3046) and phase:
+ $ hg clone -q a a7
+ $ cd a7
+ $ hg up -q 3
+ $ echo 'H2' > H
+ $ hg ci -A -m 'H2'
+ adding H
+ $ hg phase --force --secret 8
+ $ hg rebase -s 8 -d 7 --config ui.merge=internal:fail
+ merging H
+ warning: conflicts during merge.
+ merging H incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+ $ hg resolve --all -t internal:local
+ $ hg rebase -c
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6215fafa5447-backup.hg (glob)
+ $ hg log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ @ 7:draft 'H'
+ |
+ | o 6:draft 'G'
+ |/|
+ o | 5:draft 'F'
+ | |
+ | o 4:draft 'E'
+ |/
+ | o 3:draft 'D'
+ | |
+ | o 2:draft 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+
+ $ cd ..
diff --git a/tests/test-rebase-interruptions.t b/tests/test-rebase-interruptions.t
new file mode 100644
index 0000000..28fd76e
--- /dev/null
+++ b/tests/test-rebase-interruptions.t
@@ -0,0 +1,268 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > tglogp = log -G --template "{rev}:{phase} '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+
+ $ echo C >> A
+ $ hg ci -m C
+
+ $ hg up -q -C 0
+
+ $ echo D >> A
+ $ hg ci -m D
+ created new head
+
+ $ echo E > E
+ $ hg ci -Am E
+ adding E
+
+ $ cd ..
+
+
+Changes during an interruption - continue:
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+
+ $ hg tglog
+ @ 4: 'E'
+ |
+ o 3: 'D'
+ |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+Rebasing B onto E:
+
+ $ hg rebase -s 1 -d 4
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Force a commit on C during the interruption:
+
+ $ hg up -q -C 2
+
+ $ echo 'Extra' > Extra
+ $ hg add Extra
+ $ hg ci -m 'Extra'
+
+Force this commit onto secret phase
+
+ $ hg phase --force --secret 6
+
+ $ hg tglogp
+ @ 6:secret 'Extra'
+ |
+ | o 5:draft 'B'
+ | |
+ | o 4:draft 'E'
+ | |
+ | o 3:draft 'D'
+ | |
+ o | 2:draft 'C'
+ | |
+ o | 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+Resume the rebasing:
+
+ $ hg rebase --continue
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Solve the conflict and go on:
+
+ $ echo 'conflict solved' > A
+ $ rm A.orig
+ $ hg resolve -m A
+
+ $ hg rebase --continue
+ warning: new changesets detected on source branch, not stripping
+
+ $ hg tglogp
+ @ 7:draft 'C'
+ |
+ | o 6:secret 'Extra'
+ | |
+ o | 5:draft 'B'
+ | |
+ o | 4:draft 'E'
+ | |
+ o | 3:draft 'D'
+ | |
+ | o 2:draft 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+ $ cd ..
+
+
+Changes during an interruption - abort:
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+
+ $ hg tglog
+ @ 4: 'E'
+ |
+ o 3: 'D'
+ |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+Rebasing B onto E:
+
+ $ hg rebase -s 1 -d 4
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Force a commit on B' during the interruption:
+
+ $ hg up -q -C 5
+
+ $ echo 'Extra' > Extra
+ $ hg add Extra
+ $ hg ci -m 'Extra'
+
+ $ hg tglog
+ @ 6: 'Extra'
+ |
+ o 5: 'B'
+ |
+ o 4: 'E'
+ |
+ o 3: 'D'
+ |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+Abort the rebasing:
+
+ $ hg rebase --abort
+ warning: new changesets detected on target branch, can't abort
+ [255]
+
+ $ hg tglog
+ @ 6: 'Extra'
+ |
+ o 5: 'B'
+ |
+ o 4: 'E'
+ |
+ o 3: 'D'
+ |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+Changes during an interruption - abort (again):
+
+ $ hg clone -q -u . a a3
+ $ cd a3
+
+ $ hg tglogp
+ @ 4:draft 'E'
+ |
+ o 3:draft 'D'
+ |
+ | o 2:draft 'C'
+ | |
+ | o 1:draft 'B'
+ |/
+ o 0:draft 'A'
+
+Rebasing B onto E:
+
+ $ hg rebase -s 1 -d 4
+ merging A
+ warning: conflicts during merge.
+ merging A incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Change phase on B and B'
+
+ $ hg up -q -C 5
+ $ hg phase --public 1
+ $ hg phase --public 5
+ $ hg phase --secret -f 2
+
+ $ hg tglogp
+ @ 5:public 'B'
+ |
+ o 4:public 'E'
+ |
+ o 3:public 'D'
+ |
+ | o 2:secret 'C'
+ | |
+ | o 1:public 'B'
+ |/
+ o 0:public 'A'
+
+Abort the rebasing:
+
+ $ hg rebase --abort
+ abort: can't abort rebase due to immutable changesets 45396c49d53b
+ (see hg help phases for details)
+ [255]
+
+ $ hg tglogp
+ @ 5:public 'B'
+ |
+ o 4:public 'E'
+ |
+ o 3:public 'D'
+ |
+ | o 2:secret 'C'
+ | |
+ | o 1:public 'B'
+ |/
+ o 0:public 'A'
+
+ $ cd ..
diff --git a/tests/test-rebase-issue-noparam-single-rev.t b/tests/test-rebase-issue-noparam-single-rev.t
new file mode 100644
index 0000000..6e96ee7
--- /dev/null
+++ b/tests/test-rebase-issue-noparam-single-rev.t
@@ -0,0 +1,128 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo c1 > c1
+ $ hg ci -Am c1
+ adding c1
+
+ $ echo c2 > c2
+ $ hg ci -Am c2
+ adding c2
+
+ $ echo l1 > l1
+ $ hg ci -Am l1
+ adding l1
+
+ $ hg up -q -C 1
+
+ $ echo r1 > r1
+ $ hg ci -Am r1
+ adding r1
+ created new head
+
+ $ echo r2 > r2
+ $ hg ci -Am r2
+ adding r2
+
+ $ hg tglog
+ @ 4: 'r2'
+ |
+ o 3: 'r1'
+ |
+ | o 2: 'l1'
+ |/
+ o 1: 'c2'
+ |
+ o 0: 'c1'
+
+Rebase with no arguments - single revision in source branch:
+
+ $ hg up -q -C 2
+
+ $ hg rebase
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 4: 'l1'
+ |
+ o 3: 'r2'
+ |
+ o 2: 'r1'
+ |
+ o 1: 'c2'
+ |
+ o 0: 'c1'
+
+ $ cd ..
+
+
+ $ hg init b
+ $ cd b
+
+ $ echo c1 > c1
+ $ hg ci -Am c1
+ adding c1
+
+ $ echo c2 > c2
+ $ hg ci -Am c2
+ adding c2
+
+ $ echo l1 > l1
+ $ hg ci -Am l1
+ adding l1
+
+ $ echo l2 > l2
+ $ hg ci -Am l2
+ adding l2
+
+ $ hg up -q -C 1
+
+ $ echo r1 > r1
+ $ hg ci -Am r1
+ adding r1
+ created new head
+
+ $ hg tglog
+ @ 4: 'r1'
+ |
+ | o 3: 'l2'
+ | |
+ | o 2: 'l1'
+ |/
+ o 1: 'c2'
+ |
+ o 0: 'c1'
+
+Rebase with no arguments - single revision in target branch:
+
+ $ hg up -q -C 3
+
+ $ hg rebase
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 4: 'l2'
+ |
+ o 3: 'l1'
+ |
+ o 2: 'r1'
+ |
+ o 1: 'c2'
+ |
+ o 0: 'c1'
+
+
+ $ cd ..
diff --git a/tests/test-rebase-mq-skip.t b/tests/test-rebase-mq-skip.t
new file mode 100644
index 0000000..8d70458
--- /dev/null
+++ b/tests/test-rebase-mq-skip.t
@@ -0,0 +1,139 @@
+This emulates the effects of an hg pull --rebase in which the remote repo
+already has one local mq patch
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ > mq=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+ $ hg qinit -c
+
+ $ echo c1 > c1
+ $ hg add c1
+ $ hg ci -m C1
+
+ $ echo r1 > r1
+ $ hg add r1
+ $ hg ci -m R1
+
+ $ hg up -q 0
+
+ $ hg qnew p0.patch
+ $ echo p0 > p0
+ $ hg add p0
+ $ hg qref -m P0
+
+ $ hg qnew p1.patch
+ $ echo p1 > p1
+ $ hg add p1
+ $ hg qref -m P1
+
+ $ hg export qtip > p1.patch
+
+ $ hg up -q -C 1
+
+ $ hg import p1.patch
+ applying p1.patch
+
+ $ rm p1.patch
+
+ $ hg up -q -C qtip
+
+ $ hg rebase
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'P0' tags: p0.patch qbase qtip tip
+ |
+ o 2: 'P1' tags: qparent
+ |
+ o 1: 'R1' tags:
+ |
+ o 0: 'C1' tags:
+
+ $ cd ..
+
+
+ $ hg init b
+ $ cd b
+ $ hg qinit -c
+
+ $ for i in r0 r1 r2 r3 r4 r5 r6;
+ > do
+ > echo $i > $i
+ > hg ci -Am $i
+ > done
+ adding r0
+ adding r1
+ adding r2
+ adding r3
+ adding r4
+ adding r5
+ adding r6
+
+ $ hg qimport -r 1:tip
+
+ $ hg up -q 0
+
+ $ for i in r1 r3 r7 r8;
+ > do
+ > echo $i > $i
+ > hg ci -Am branch2-$i
+ > done
+ adding r1
+ created new head
+ adding r3
+ adding r7
+ adding r8
+
+ $ echo somethingelse > r4
+ $ hg ci -Am branch2-r4
+ adding r4
+
+ $ echo r6 > r6
+ $ hg ci -Am branch2-r6
+ adding r6
+
+ $ hg up -q qtip
+
+ $ HGMERGE=internal:fail hg rebase
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+ $ HGMERGE=internal:local hg resolve --all
+
+ $ hg rebase --continue
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'r5' tags: 5.diff qtip tip
+ |
+ o 7: 'r2' tags: 2.diff qbase
+ |
+ o 6: 'branch2-r6' tags: qparent
+ |
+ o 5: 'branch2-r4' tags:
+ |
+ o 4: 'branch2-r8' tags:
+ |
+ o 3: 'branch2-r7' tags:
+ |
+ o 2: 'branch2-r3' tags:
+ |
+ o 1: 'branch2-r1' tags:
+ |
+ o 0: 'r0' tags:
+
+
+ $ cd ..
diff --git a/tests/test-rebase-mq.t b/tests/test-rebase-mq.t
new file mode 100644
index 0000000..7301ebe
--- /dev/null
+++ b/tests/test-rebase-mq.t
@@ -0,0 +1,343 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ > mq=
+ >
+ > [mq]
+ > plain=true
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' tags: {tags}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+ $ hg qinit -c
+
+ $ echo c1 > f
+ $ hg add f
+ $ hg ci -m C1
+
+ $ echo r1 > f
+ $ hg ci -m R1
+
+ $ hg up -q 0
+
+ $ hg qnew f.patch
+ $ echo mq1 > f
+ $ hg qref -m P0
+
+ $ hg qnew f2.patch
+ $ echo mq2 > f
+ $ hg qref -m P1
+
+ $ hg tglog
+ @ 3: 'P1' tags: f2.patch qtip tip
+ |
+ o 2: 'P0' tags: f.patch qbase
+ |
+ | o 1: 'R1' tags:
+ |/
+ o 0: 'C1' tags: qparent
+
+
+Rebase - try to rebase on an applied mq patch:
+
+ $ hg rebase -s 1 -d 3
+ abort: cannot rebase onto an applied mq patch
+ [255]
+
+Rebase - same thing, but mq patch is default dest:
+
+ $ hg up -q 1
+ $ hg rebase
+ abort: cannot rebase onto an applied mq patch
+ [255]
+ $ hg up -q qtip
+
+Rebase - generate a conflict:
+
+ $ hg rebase -s 2 -d 1
+ merging f
+ warning: conflicts during merge.
+ merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Fix the 1st conflict:
+
+ $ echo mq1r1 > f
+ $ hg resolve -m f
+ $ hg rebase -c
+ merging f
+ warning: conflicts during merge.
+ merging f incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+Fix the 2nd conflict:
+
+ $ echo mq1r1mq2 > f
+ $ hg resolve -m f
+ $ hg rebase -c
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'P1' tags: f2.patch qtip tip
+ |
+ o 2: 'P0' tags: f.patch qbase
+ |
+ o 1: 'R1' tags: qparent
+ |
+ o 0: 'C1' tags:
+
+ $ hg up -q qbase
+
+ $ cat f
+ mq1r1
+
+ $ cat .hg/patches/f.patch
+ # HG changeset patch
+ # User test
+ # Date ?????????? ? (glob)
+ # Node ID ???????????????????????????????????????? (glob)
+ # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
+ P0
+
+ diff -r bac9ed9960d8 -r ???????????? f (glob)
+ --- a/f Thu Jan 01 00:00:00 1970 +0000
+ +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
+ @@ -1,1 +1,1 @@
+ -r1
+ +mq1r1
+
+Update to qtip:
+
+ $ hg up -q qtip
+
+ $ cat f
+ mq1r1mq2
+
+ $ cat .hg/patches/f2.patch
+ # HG changeset patch
+ # User test
+ # Date ?????????? ? (glob)
+ # Node ID ???????????????????????????????????????? (glob)
+ # Parent ???????????????????????????????????????? (glob)
+ P1
+
+ diff -r ???????????? -r ???????????? f (glob)
+ --- a/f ??? ??? ?? ??:??:?? ???? ????? (glob)
+ +++ b/f ??? ??? ?? ??:??:?? ???? ????? (glob)
+ @@ -1,1 +1,1 @@
+ -mq1r1
+ +mq1r1mq2
+
+Adding one git-style patch and one normal:
+
+ $ hg qpop -a
+ popping f2.patch
+ popping f.patch
+ patch queue now empty
+
+ $ rm -fr .hg/patches
+ $ hg qinit -c
+
+ $ hg up -q 0
+
+ $ hg qnew --git f_git.patch
+ $ echo mq1 > p
+ $ hg add p
+ $ hg qref --git -m 'P0 (git)'
+
+ $ hg qnew f.patch
+ $ echo mq2 > p
+ $ hg qref -m P1
+ $ hg qci -m 'save patch state'
+
+ $ hg qseries -s
+ f_git.patch: P0 (git)
+ f.patch: P1
+
+ $ hg -R .hg/patches manifest
+ .hgignore
+ f.patch
+ f_git.patch
+ series
+
+ $ cat .hg/patches/f_git.patch
+ P0 (git)
+
+ diff --git a/p b/p
+ new file mode 100644
+ --- /dev/null
+ +++ b/p
+ @@ -0,0 +1,1 @@
+ +mq1
+
+ $ cat .hg/patches/f.patch
+ P1
+
+ diff -r ???????????? p (glob)
+ --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
+ +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
+ @@ -1,1 +1,1 @@
+ -mq1
+ +mq2
+
+
+Rebase the applied mq patches:
+
+ $ hg rebase -s 2 -d 1
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg qci -m 'save patch state'
+
+ $ hg qseries -s
+ f_git.patch: P0 (git)
+ f.patch: P1
+
+ $ hg -R .hg/patches manifest
+ .hgignore
+ f.patch
+ f_git.patch
+ series
+
+ $ cat .hg/patches/f_git.patch
+ # HG changeset patch
+ # User test
+ # Date ?????????? ? (glob)
+ # Node ID ???????????????????????????????????????? (glob)
+ # Parent bac9ed9960d8992bcad75864a879fa76cadaf1b0
+ P0 (git)
+
+ diff --git a/p b/p
+ new file mode 100644
+ --- /dev/null
+ +++ b/p
+ @@ -0,0 +1,1 @@
+ +mq1
+
+ $ cat .hg/patches/f.patch
+ # HG changeset patch
+ # User test
+ # Date ?????????? ? (glob)
+ # Node ID ???????????????????????????????????????? (glob)
+ # Parent ???????????????????????????????????????? (glob)
+ P1
+
+ diff -r ???????????? -r ???????????? p (glob)
+ --- a/p ??? ??? ?? ??:??:?? ???? ????? (glob)
+ +++ b/p ??? ??? ?? ??:??:?? ???? ????? (glob)
+ @@ -1,1 +1,1 @@
+ -mq1
+ +mq2
+
+ $ cd ..
+
+Rebase with guards
+
+ $ hg init foo
+ $ cd foo
+ $ echo a > a
+ $ hg ci -Am a
+ adding a
+
+Create mq repo with guarded patches foo and bar and empty patch:
+
+ $ hg qinit
+ $ echo guarded > guarded
+ $ hg add guarded
+ $ hg qnew guarded
+ $ hg qnew empty-important -m 'important commit message'
+ $ echo bar > bar
+ $ hg add bar
+ $ hg qnew bar
+ $ echo foo > foo
+ $ hg add foo
+ $ hg qnew foo
+ $ hg qpop -a
+ popping foo
+ popping bar
+ popping empty-important
+ popping guarded
+ patch queue now empty
+ $ hg qguard guarded +guarded
+ $ hg qguard bar +baz
+ $ hg qguard foo +baz
+ $ hg qselect baz
+ number of unguarded, unapplied patches has changed from 1 to 3
+ $ hg qpush bar
+ applying empty-important
+ patch empty-important is empty
+ applying bar
+ now at: bar
+
+ $ hg qguard -l
+ guarded: +guarded
+ empty-important: unguarded
+ bar: +baz
+ foo: +baz
+
+ $ hg tglog
+ @ 2: 'imported patch bar' tags: bar qtip tip
+ |
+ o 1: 'important commit message' tags: empty-important qbase
+ |
+ o 0: 'a' tags: qparent
+
+Create new head to rebase bar onto:
+
+ $ hg up -C 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b > b
+ $ hg add b
+ $ hg ci -m b
+ created new head
+ $ hg up -C 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg qref
+
+ $ hg tglog
+ @ 3: '[mq]: bar' tags: bar qtip tip
+ |
+ | o 2: 'b' tags:
+ | |
+ o | 1: 'important commit message' tags: empty-important qbase
+ |/
+ o 0: 'a' tags: qparent
+
+
+Rebase bar (make sure series order is preserved and empty-important also is
+removed from the series):
+
+ $ hg qseries
+ guarded
+ empty-important
+ bar
+ foo
+ $ [ -f .hg/patches/empty-important ]
+ $ hg -q rebase -d 2
+ $ hg qseries
+ guarded
+ bar
+ foo
+ $ [ -f .hg/patches/empty-important ]
+ [1]
+
+ $ hg qguard -l
+ guarded: +guarded
+ bar: +baz
+ foo: +baz
+
+ $ hg tglog
+ @ 2:* '[mq]: bar' tags: bar qbase qtip tip (glob)
+ |
+ o 1:* 'b' tags: qparent (glob)
+ |
+ o 0:* 'a' tags: (glob)
+
+ $ cd ..
diff --git a/tests/test-rebase-named-branches.t b/tests/test-rebase-named-branches.t
new file mode 100644
index 0000000..0f2f904
--- /dev/null
+++ b/tests/test-rebase-named-branches.t
@@ -0,0 +1,243 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+ $ hg init a
+ $ cd a
+ $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 7 changes to 7 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+ $ hg clone -q -u . a a1
+
+ $ cd a1
+
+ $ hg update 3
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg branch dev-one
+ marked working directory as branch dev-one
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'dev-one named branch'
+
+ $ hg update 7
+ 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg branch dev-two
+ marked working directory as branch dev-two
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ echo x > x
+
+ $ hg add x
+
+ $ hg ci -m 'dev-two named branch'
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ | o 8: 'dev-one named branch' dev-one
+ | |
+ o | 7: 'H'
+ | |
+ +---o 6: 'G'
+ | | |
+ o | | 5: 'F'
+ | | |
+ +---o 4: 'E'
+ | |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+Branch name containing a dash (issue3181)
+
+ $ hg rebase -b dev-two -d dev-one --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ o 8: 'H'
+ |
+ | o 7: 'G'
+ |/|
+ o | 6: 'F'
+ | |
+ o | 5: 'dev-one named branch' dev-one
+ | |
+ | o 4: 'E'
+ | |
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s dev-one -d 0 --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'dev-two named branch' dev-two
+ |
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg update 3
+ 3 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg branch dev-one
+ marked working directory as branch dev-one
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m 'dev-one named branch'
+
+ $ hg tglog
+ @ 9: 'dev-one named branch' dev-one
+ |
+ | o 8: 'dev-two named branch' dev-two
+ | |
+ | o 7: 'H'
+ | |
+ | | o 6: 'G'
+ | |/|
+ | o | 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -b 'max(branch("dev-two"))' -d dev-one --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 9: 'dev-two named branch' dev-two
+ |
+ o 8: 'H'
+ |
+ | o 7: 'G'
+ |/|
+ o | 6: 'F'
+ | |
+ o | 5: 'dev-one named branch' dev-one
+ | |
+ | o 4: 'E'
+ | |
+ o | 3: 'D'
+ | |
+ o | 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 'max(branch("dev-one"))' -d 0 --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'dev-two named branch' dev-two
+ |
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+Rebasing descendant onto ancestor across different named branches
+
+ $ hg rebase -s 1 -d 8 --keepbranches
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'dev-two named branch' dev-two
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 4 -d 5
+ abort: source is ancestor of destination
+ [255]
+
+ $ hg rebase -s 5 -d 4
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'dev-two named branch'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
diff --git a/tests/test-rebase-newancestor.t b/tests/test-rebase-newancestor.t
new file mode 100644
index 0000000..949c5d2
--- /dev/null
+++ b/tests/test-rebase-newancestor.t
@@ -0,0 +1,56 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo A > a
+ $ echo >> a
+ $ hg ci -Am A
+ adding a
+
+ $ echo B > a
+ $ echo >> a
+ $ hg ci -m B
+
+ $ echo C > a
+ $ echo >> a
+ $ hg ci -m C
+
+ $ hg up -q -C 0
+
+ $ echo D >> a
+ $ hg ci -Am AD
+ created new head
+
+ $ hg tglog
+ @ 3: 'AD'
+ |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ hg rebase -s 1 -d 3
+ merging a
+ merging a
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'C'
+ |
+ o 2: 'B'
+ |
+ o 1: 'AD'
+ |
+ o 0: 'A'
+
+
+ $ cd ..
diff --git a/tests/test-rebase-parameters.t b/tests/test-rebase-parameters.t
new file mode 100644
index 0000000..6597f75
--- /dev/null
+++ b/tests/test-rebase-parameters.t
@@ -0,0 +1,430 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+ $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 7 changes to 7 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ echo I > I
+ $ hg ci -AmI
+ adding I
+
+ $ hg tglog
+ @ 8: 'I'
+ |
+ o 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+These fail:
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+
+ $ hg rebase -s 8 -d 7
+ nothing to rebase
+ [1]
+
+ $ hg rebase --continue --abort
+ abort: cannot use both abort and continue
+ [255]
+
+ $ hg rebase --continue --collapse
+ abort: cannot use collapse with continue or abort
+ [255]
+
+ $ hg rebase --continue --dest 4
+ abort: abort and continue do not allow specifying revisions
+ [255]
+
+ $ hg rebase --base 5 --source 4
+ abort: cannot specify both a source and a base
+ [255]
+
+ $ hg rebase --rev 5 --source 4
+ abort: cannot specify both a revision and a source
+ [255]
+ $ hg rebase --base 5 --rev 4
+ abort: cannot specify both a revision and a base
+ [255]
+
+ $ hg rebase
+ nothing to rebase
+ [1]
+
+ $ hg up -q 7
+
+ $ hg rebase --traceback
+ nothing to rebase
+ [1]
+
+
+These work:
+
+Rebase with no arguments (from 3 onto 8):
+
+ $ hg up -q -C 3
+
+ $ hg rebase
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'I'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+Try to rollback after a rebase (fail):
+
+ $ hg rollback
+ no rollback information available
+ [1]
+
+ $ cd ..
+
+
+Rebase with base == '.' => same as no arguments (from 3 onto 8):
+
+ $ hg clone -q -u 3 a a2
+ $ cd a2
+
+ $ hg rebase --base .
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'I'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Rebase with dest == branch(.) => same as no arguments (from 3 onto 8):
+
+ $ hg clone -q -u 3 a a3
+ $ cd a3
+
+ $ hg rebase --dest 'branch(.)'
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'I'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify only source (from 2 onto 8):
+
+ $ hg clone -q -u . a a4
+ $ cd a4
+
+ $ hg rebase --source 'desc("C")'
+ saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'I'
+ |
+ o 5: 'H'
+ |
+ | o 4: 'G'
+ |/|
+ o | 3: 'F'
+ | |
+ | o 2: 'E'
+ |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify only dest (from 3 onto 6):
+
+ $ hg clone -q -u 3 a a5
+ $ cd a5
+
+ $ hg rebase --dest 6
+ saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ | o 5: 'I'
+ | |
+ | o 4: 'H'
+ | |
+ o | 3: 'G'
+ |\|
+ | o 2: 'F'
+ | |
+ o | 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify only base (from 1 onto 8):
+
+ $ hg clone -q -u . a a6
+ $ cd a6
+
+ $ hg rebase --base 'desc("D")'
+ saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ o 5: 'I'
+ |
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify source and dest (from 2 onto 7):
+
+ $ hg clone -q -u . a a7
+ $ cd a7
+
+ $ hg rebase --source 2 --dest 7
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ | o 6: 'I'
+ |/
+ o 5: 'H'
+ |
+ | o 4: 'G'
+ |/|
+ o | 3: 'F'
+ | |
+ | o 2: 'E'
+ |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify base and dest (from 1 onto 7):
+
+ $ hg clone -q -u . a a8
+ $ cd a8
+
+ $ hg rebase --base 3 --dest 7
+ saved backup bundle to $TESTTMP/a8/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'B'
+ |
+ | o 5: 'I'
+ |/
+ o 4: 'H'
+ |
+ | o 3: 'G'
+ |/|
+ o | 2: 'F'
+ | |
+ | o 1: 'E'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Specify only revs (from 2 onto 8)
+
+ $ hg clone -q -u . a a9
+ $ cd a9
+
+ $ hg rebase --rev 'desc("C")::'
+ saved backup bundle to $TESTTMP/a9/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 8: 'D'
+ |
+ o 7: 'C'
+ |
+ o 6: 'I'
+ |
+ o 5: 'H'
+ |
+ | o 4: 'G'
+ |/|
+ o | 3: 'F'
+ | |
+ | o 2: 'E'
+ |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+Test --tool parameter:
+
+ $ hg init b
+ $ cd b
+
+ $ echo c1 > c1
+ $ hg ci -Am c1
+ adding c1
+
+ $ echo c2 > c2
+ $ hg ci -Am c2
+ adding c2
+
+ $ hg up -q 0
+ $ echo c2b > c2
+ $ hg ci -Am c2b
+ adding c2
+ created new head
+
+ $ cd ..
+
+ $ hg clone -q -u . b b1
+ $ cd b1
+
+ $ hg rebase -s 2 -d 1 --tool internal:local
+ saved backup bundle to $TESTTMP/b1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg cat c2
+ c2
+
+ $ cd ..
+
+
+ $ hg clone -q -u . b b2
+ $ cd b2
+
+ $ hg rebase -s 2 -d 1 --tool internal:other
+ saved backup bundle to $TESTTMP/b2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg cat c2
+ c2b
+
+ $ cd ..
+
+
+ $ hg clone -q -u . b b3
+ $ cd b3
+
+ $ hg rebase -s 2 -d 1 --tool internal:fail
+ abort: unresolved conflicts (see hg resolve, then hg rebase --continue)
+ [255]
+
+ $ hg resolve -l
+ U c2
+
+ $ hg resolve -m c2
+ $ hg rebase -c --tool internal:fail
+ tool option will be ignored
+ saved backup bundle to $TESTTMP/b3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ cd ..
diff --git a/tests/test-rebase-pull.t b/tests/test-rebase-pull.t
new file mode 100644
index 0000000..07388d5
--- /dev/null
+++ b/tests/test-rebase-pull.t
@@ -0,0 +1,116 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo C1 > C1
+ $ hg ci -Am C1
+ adding C1
+
+ $ echo C2 > C2
+ $ hg ci -Am C2
+ adding C2
+
+ $ cd ..
+
+ $ hg clone a b
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg clone a c
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd b
+
+ $ echo L1 > L1
+ $ hg ci -Am L1
+ adding L1
+
+
+ $ cd ../a
+
+ $ echo R1 > R1
+ $ hg ci -Am R1
+ adding R1
+
+
+ $ cd ../b
+
+Now b has one revision to be pulled from a:
+
+ $ hg pull --rebase
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 3: 'L1'
+ |
+ o 2: 'R1'
+ |
+ o 1: 'C2'
+ |
+ o 0: 'C1'
+
+Re-run:
+
+ $ hg pull --rebase
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ no changes found
+
+
+Invoke pull --rebase and nothing to rebase:
+
+ $ cd ../c
+
+ $ hg book norebase
+ $ hg pull --rebase
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ nothing to rebase
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ updating bookmark norebase
+
+ $ hg tglog -l 1
+ @ 2: 'R1'
+ |
+
+pull --rebase --update should ignore --update:
+
+ $ hg pull --rebase --update
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ no changes found
+
+pull --rebase doesn't update if nothing has been pulled:
+
+ $ hg up -q 1
+
+ $ hg pull --rebase
+ pulling from $TESTTMP/a (glob)
+ searching for changes
+ no changes found
+
+ $ hg tglog -l 1
+ o 2: 'R1'
+ |
+
+ $ cd ..
diff --git a/tests/test-rebase-rename.t b/tests/test-rebase-rename.t
new file mode 100644
index 0000000..c46f7c7
--- /dev/null
+++ b/tests/test-rebase-rename.t
@@ -0,0 +1,171 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [alias]
+ > tlog = log --template "{rev}: '{desc}' {branches}\n"
+ > tglog = tlog --graph
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+
+ $ hg up -q -C 0
+
+ $ hg mv a a-renamed
+
+ $ hg ci -m 'rename A'
+ created new head
+
+ $ hg tglog
+ @ 2: 'rename A'
+ |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+Rename is tracked:
+
+ $ hg tlog -p --git -r tip
+ 2: 'rename A'
+ diff --git a/a b/a-renamed
+ rename from a
+ rename to a-renamed
+
+Rebase the revision containing the rename:
+
+ $ hg rebase -s 2 -d 1
+ saved backup bundle to $TESTTMP/a/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 2: 'rename A'
+ |
+ o 1: 'B'
+ |
+ o 0: 'A'
+
+
+Rename is not lost:
+
+ $ hg tlog -p --git -r tip
+ 2: 'rename A'
+ diff --git a/a b/a-renamed
+ rename from a
+ rename to a-renamed
+
+ $ cd ..
+
+
+ $ hg init b
+ $ cd b
+
+ $ echo a > a
+ $ hg ci -Am A
+ adding a
+
+ $ echo b > b
+ $ hg ci -Am B
+ adding b
+
+ $ hg up -q -C 0
+
+ $ hg cp a a-copied
+ $ hg ci -m 'copy A'
+ created new head
+
+ $ hg tglog
+ @ 2: 'copy A'
+ |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+Copy is tracked:
+
+ $ hg tlog -p --git -r tip
+ 2: 'copy A'
+ diff --git a/a b/a-copied
+ copy from a
+ copy to a-copied
+
+Rebase the revision containing the copy:
+
+ $ hg rebase -s 2 -d 1
+ saved backup bundle to $TESTTMP/b/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 2: 'copy A'
+ |
+ o 1: 'B'
+ |
+ o 0: 'A'
+
+Copy is not lost:
+
+ $ hg tlog -p --git -r tip
+ 2: 'copy A'
+ diff --git a/a b/a-copied
+ copy from a
+ copy to a-copied
+
+ $ cd ..
+
+
+Test rebase across repeating renames:
+
+ $ hg init repo
+
+ $ cd repo
+
+ $ echo testing > file1.txt
+ $ hg add file1.txt
+ $ hg ci -m "Adding file1"
+
+ $ hg rename file1.txt file2.txt
+ $ hg ci -m "Rename file1 to file2"
+
+ $ echo Unrelated change > unrelated.txt
+ $ hg add unrelated.txt
+ $ hg ci -m "Unrelated change"
+
+ $ hg rename file2.txt file1.txt
+ $ hg ci -m "Rename file2 back to file1"
+
+ $ hg update -r -2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo Another unrelated change >> unrelated.txt
+ $ hg ci -m "Another unrelated change"
+ created new head
+
+ $ hg tglog
+ @ 4: 'Another unrelated change'
+ |
+ | o 3: 'Rename file2 back to file1'
+ |/
+ o 2: 'Unrelated change'
+ |
+ o 1: 'Rename file1 to file2'
+ |
+ o 0: 'Adding file1'
+
+
+ $ hg rebase -s 4 -d 3
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg diff --stat -c .
+ unrelated.txt | 1 +
+ 1 files changed, 1 insertions(+), 0 deletions(-)
+
+ $ cd ..
diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
new file mode 100644
index 0000000..7cb6e8d
--- /dev/null
+++ b/tests/test-rebase-scenario-global.t
@@ -0,0 +1,547 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ > rebase=
+ >
+ > [phases]
+ > publish=False
+ >
+ > [alias]
+ > tglog = log -G --template "{rev}: '{desc}' {branches}\n"
+ > EOF
+
+
+ $ hg init a
+ $ cd a
+ $ hg unbundle "$TESTDIR/bundles/rebase.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 8 changesets with 7 changes to 7 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+
+Rebasing
+D onto H - simple rebase:
+
+ $ hg clone -q -u . a a1
+ $ cd a1
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ hg rebase -s 3 -d 7
+ saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'D'
+ |
+ o 6: 'H'
+ |
+ | o 5: 'G'
+ |/|
+ o | 4: 'F'
+ | |
+ | o 3: 'E'
+ |/
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+D onto F - intermediate point:
+
+ $ hg clone -q -u . a a2
+ $ cd a2
+
+ $ hg rebase -s 3 -d 5
+ saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'D'
+ |
+ | o 6: 'H'
+ |/
+ | o 5: 'G'
+ |/|
+ o | 4: 'F'
+ | |
+ | o 3: 'E'
+ |/
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+E onto H - skip of G:
+
+ $ hg clone -q -u . a a3
+ $ cd a3
+
+ $ hg rebase -s 4 -d 7
+ saved backup bundle to $TESTTMP/a3/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 6: 'E'
+ |
+ o 5: 'H'
+ |
+ o 4: 'F'
+ |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+F onto E - rebase of a branching point (skip G):
+
+ $ hg clone -q -u . a a4
+ $ cd a4
+
+ $ hg rebase -s 5 -d 4
+ saved backup bundle to $TESTTMP/a4/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 6: 'H'
+ |
+ o 5: 'F'
+ |
+ o 4: 'E'
+ |
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+G onto H - merged revision having a parent in ancestors of target:
+
+ $ hg clone -q -u . a a5
+ $ cd a5
+
+ $ hg rebase -s 6 -d 7
+ saved backup bundle to $TESTTMP/a5/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'G'
+ |\
+ | o 6: 'H'
+ | |
+ | o 5: 'F'
+ | |
+ o | 4: 'E'
+ |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+F onto B - G maintains E as parent:
+
+ $ hg clone -q -u . a a6
+ $ cd a6
+
+ $ hg rebase -s 5 -d 1
+ saved backup bundle to $TESTTMP/a6/.hg/strip-backup/*-backup.hg (glob)
+
+ $ hg tglog
+ @ 7: 'H'
+ |
+ | o 6: 'G'
+ |/|
+ o | 5: 'F'
+ | |
+ | o 4: 'E'
+ | |
+ | | o 3: 'D'
+ | | |
+ +---o 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+These will fail (using --source):
+
+G onto F - rebase onto an ancestor:
+
+ $ hg clone -q -u . a a7
+ $ cd a7
+
+ $ hg rebase -s 6 -d 5
+ nothing to rebase
+ [1]
+
+F onto G - rebase onto a descendant:
+
+ $ hg rebase -s 5 -d 6
+ abort: source is ancestor of destination
+ [255]
+
+G onto B - merge revision with both parents not in ancestors of target:
+
+ $ hg rebase -s 6 -d 1
+ abort: cannot use revision 6 as base, result would have 3 parents
+ [255]
+
+
+These will abort gracefully (using --base):
+
+G onto G - rebase onto same changeset:
+
+ $ hg rebase -b 6 -d 6
+ nothing to rebase
+ [1]
+
+G onto F - rebase onto an ancestor:
+
+ $ hg rebase -b 6 -d 5
+ nothing to rebase
+ [1]
+
+F onto G - rebase onto a descendant:
+
+ $ hg rebase -b 5 -d 6
+ nothing to rebase
+ [1]
+
+C onto A - rebase onto an ancestor:
+
+ $ hg rebase -d 0 -s 2
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/5fddd98957c8-backup.hg (glob)
+ $ hg tglog
+ @ 7: 'D'
+ |
+ o 6: 'C'
+ |
+ | o 5: 'H'
+ | |
+ | | o 4: 'G'
+ | |/|
+ | o | 3: 'F'
+ |/ /
+ | o 2: 'E'
+ |/
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+
+Check rebasing public changeset
+
+ $ hg pull --config phases.publish=True -q -r 6 . # update phase of 6
+ $ hg rebase -d 5 -b 6
+ abort: can't rebase immutable changeset e1c4361dd923
+ (see hg help phases for details)
+ [255]
+
+ $ hg rebase -d 5 -b 6 --keep
+
+Check rebasing mutable changeset
+Source phase greater or equal to destination phase: new changeset get the phase of source:
+ $ hg rebase -s9 -d0
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2b23e52411f4-backup.hg (glob)
+ $ hg log --template "{phase}\n" -r 9
+ draft
+ $ hg rebase -s9 -d1
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2cb10d0cfc6c-backup.hg (glob)
+ $ hg log --template "{phase}\n" -r 9
+ draft
+ $ hg phase --force --secret 9
+ $ hg rebase -s9 -d0
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/c5b12b67163a-backup.hg (glob)
+ $ hg log --template "{phase}\n" -r 9
+ secret
+ $ hg rebase -s9 -d1
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/2a0524f868ac-backup.hg (glob)
+ $ hg log --template "{phase}\n" -r 9
+ secret
+Source phase lower than destination phase: new changeset get the phase of destination:
+ $ hg rebase -s8 -d9
+ saved backup bundle to $TESTTMP/a7/.hg/strip-backup/6d4f22462821-backup.hg (glob)
+ $ hg log --template "{phase}\n" -r 'rev(9)'
+ secret
+
+ $ cd ..
+
+Test for revset
+
+We need a bit different graph
+All destination are B
+
+ $ hg init ah
+ $ cd ah
+ $ hg unbundle "$TESTDIR/bundles/rebase-revset.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 9 changes to 9 files (+2 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg tglog
+ o 8: 'I'
+ |
+ o 7: 'H'
+ |
+ o 6: 'G'
+ |
+ | o 5: 'F'
+ | |
+ | o 4: 'E'
+ |/
+ o 3: 'D'
+ |
+ o 2: 'C'
+ |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+Simple case with keep:
+
+Source on have two descendant heads but ask for one
+
+ $ hg clone -q -u . ah ah1
+ $ cd ah1
+ $ hg rebase -r '2::8' -d 1
+ abort: can't remove original changesets with unrebased descendants
+ (use --keep to keep original changesets)
+ [255]
+ $ hg rebase -r '2::8' -d 1 --keep
+ $ hg tglog
+ @ 13: 'I'
+ |
+ o 12: 'H'
+ |
+ o 11: 'G'
+ |
+ o 10: 'D'
+ |
+ o 9: 'C'
+ |
+ | o 8: 'I'
+ | |
+ | o 7: 'H'
+ | |
+ | o 6: 'G'
+ | |
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ cd ..
+
+Base on have one descendant heads we ask for but common ancestor have two
+
+ $ hg clone -q -u . ah ah2
+ $ cd ah2
+ $ hg rebase -r '3::8' -d 1
+ abort: can't remove original changesets with unrebased descendants
+ (use --keep to keep original changesets)
+ [255]
+ $ hg rebase -r '3::8' -d 1 --keep
+ $ hg tglog
+ @ 12: 'I'
+ |
+ o 11: 'H'
+ |
+ o 10: 'G'
+ |
+ o 9: 'D'
+ |
+ | o 8: 'I'
+ | |
+ | o 7: 'H'
+ | |
+ | o 6: 'G'
+ | |
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ cd ..
+
+rebase subset
+
+ $ hg clone -q -u . ah ah3
+ $ cd ah3
+ $ hg rebase -r '3::7' -d 1
+ abort: can't remove original changesets with unrebased descendants
+ (use --keep to keep original changesets)
+ [255]
+ $ hg rebase -r '3::7' -d 1 --keep
+ $ hg tglog
+ @ 11: 'H'
+ |
+ o 10: 'G'
+ |
+ o 9: 'D'
+ |
+ | o 8: 'I'
+ | |
+ | o 7: 'H'
+ | |
+ | o 6: 'G'
+ | |
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ cd ..
+
+rebase subset with multiple head
+
+ $ hg clone -q -u . ah ah4
+ $ cd ah4
+ $ hg rebase -r '3::(7+5)' -d 1
+ abort: can't remove original changesets with unrebased descendants
+ (use --keep to keep original changesets)
+ [255]
+ $ hg rebase -r '3::(7+5)' -d 1 --keep
+ $ hg tglog
+ @ 13: 'H'
+ |
+ o 12: 'G'
+ |
+ | o 11: 'F'
+ | |
+ | o 10: 'E'
+ |/
+ o 9: 'D'
+ |
+ | o 8: 'I'
+ | |
+ | o 7: 'H'
+ | |
+ | o 6: 'G'
+ | |
+ | | o 5: 'F'
+ | | |
+ | | o 4: 'E'
+ | |/
+ | o 3: 'D'
+ | |
+ | o 2: 'C'
+ | |
+ o | 1: 'B'
+ |/
+ o 0: 'A'
+
+
+ $ cd ..
+
+More advanced tests
+
+rebase on ancestor with revset
+
+ $ hg clone -q -u . ah ah5
+ $ cd ah5
+ $ hg rebase -r '6::' -d 2
+ saved backup bundle to $TESTTMP/ah5/.hg/strip-backup/3d8a618087a7-backup.hg (glob)
+ $ hg tglog
+ @ 8: 'I'
+ |
+ o 7: 'H'
+ |
+ o 6: 'G'
+ |
+ | o 5: 'F'
+ | |
+ | o 4: 'E'
+ | |
+ | o 3: 'D'
+ |/
+ o 2: 'C'
+ |
+ | o 1: 'B'
+ |/
+ o 0: 'A'
+
+ $ cd ..
+
+
+rebase with multiple root.
+We rebase E and G on B
+We would expect heads are I, F if it was supported
+
+ $ hg clone -q -u . ah ah6
+ $ cd ah6
+ $ hg rebase -r '(4+6)::' -d 1
+ abort: can't rebase multiple roots
+ [255]
+ $ cd ..
diff --git a/tests/test-rebuildstate.t b/tests/test-rebuildstate.t
new file mode 100644
index 0000000..954d343
--- /dev/null
+++ b/tests/test-rebuildstate.t
@@ -0,0 +1,30 @@
+basic test for hg debugrebuildstate
+
+ $ hg init repo
+ $ cd repo
+
+ $ touch foo bar
+ $ hg ci -Am 'add foo bar'
+ adding bar
+ adding foo
+
+ $ touch baz
+ $ hg add baz
+ $ hg rm bar
+
+ $ hg debugrebuildstate
+
+state dump after
+
+ $ hg debugstate --nodates | sort
+ n 644 -1 bar
+ n 644 -1 foo
+
+status
+
+ $ hg st -A
+ ! bar
+ ? baz
+ C foo
+
+ $ cd ..
diff --git a/tests/test-record.t b/tests/test-record.t
new file mode 100644
index 0000000..833b290
--- /dev/null
+++ b/tests/test-record.t
@@ -0,0 +1,1221 @@
+Set up a repo
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "interactive=true" >> $HGRCPATH
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "record=" >> $HGRCPATH
+
+ $ hg init a
+ $ cd a
+
+Select no files
+
+ $ touch empty-rw
+ $ hg add empty-rw
+
+ $ hg record empty-rw<<EOF
+ > n
+ > EOF
+ diff --git a/empty-rw b/empty-rw
+ new file mode 100644
+ examine changes to 'empty-rw'? [Ynesfdaq?]
+ no changes to record
+
+ $ hg tip -p
+ changeset: -1:000000000000
+ tag: tip
+ user:
+ date: Thu Jan 01 00:00:00 1970 +0000
+
+
+
+Select files but no hunks
+
+ $ hg record empty-rw<<EOF
+ > y
+ > n
+ > EOF
+ diff --git a/empty-rw b/empty-rw
+ new file mode 100644
+ examine changes to 'empty-rw'? [Ynesfdaq?]
+ abort: empty commit message
+ [255]
+
+ $ hg tip -p
+ changeset: -1:000000000000
+ tag: tip
+ user:
+ date: Thu Jan 01 00:00:00 1970 +0000
+
+
+
+Record empty file
+
+ $ hg record -d '0 0' -m empty empty-rw<<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/empty-rw b/empty-rw
+ new file mode 100644
+ examine changes to 'empty-rw'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 0:c0708cf4e46e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: empty
+
+
+
+Summary shows we updated to the new cset
+
+ $ hg summary
+ parent: 0:c0708cf4e46e tip
+ empty
+ branch: default
+ commit: (clean)
+ update: (current)
+
+Rename empty file
+
+ $ hg mv empty-rw empty-rename
+ $ hg record -d '1 0' -m rename<<EOF
+ > y
+ > EOF
+ diff --git a/empty-rw b/empty-rename
+ rename from empty-rw
+ rename to empty-rename
+ examine changes to 'empty-rw' and 'empty-rename'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 1:d695e8dcb197
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: rename
+
+
+
+Copy empty file
+
+ $ hg cp empty-rename empty-copy
+ $ hg record -d '2 0' -m copy<<EOF
+ > y
+ > EOF
+ diff --git a/empty-rename b/empty-copy
+ copy from empty-rename
+ copy to empty-copy
+ examine changes to 'empty-rename' and 'empty-copy'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 2:1d4b90bea524
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: copy
+
+
+
+Delete empty file
+
+ $ hg rm empty-copy
+ $ hg record -d '3 0' -m delete<<EOF
+ > y
+ > EOF
+ diff --git a/empty-copy b/empty-copy
+ deleted file mode 100644
+ examine changes to 'empty-copy'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 3:b39a238f01a1
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:03 1970 +0000
+ summary: delete
+
+
+
+Add binary file
+
+ $ hg bundle --base -2 tip.bundle
+ 1 changesets found
+ $ hg add tip.bundle
+ $ hg record -d '4 0' -m binary<<EOF
+ > y
+ > EOF
+ diff --git a/tip.bundle b/tip.bundle
+ new file mode 100644
+ this is a binary file
+ examine changes to 'tip.bundle'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 4:ad816da3711e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:04 1970 +0000
+ summary: binary
+
+ diff -r b39a238f01a1 -r ad816da3711e tip.bundle
+ Binary file tip.bundle has changed
+
+
+Change binary file
+
+ $ hg bundle --base -2 tip.bundle
+ 1 changesets found
+ $ hg record -d '5 0' -m binary-change<<EOF
+ > y
+ > EOF
+ diff --git a/tip.bundle b/tip.bundle
+ this modifies a binary file (all or nothing)
+ examine changes to 'tip.bundle'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 5:dccd6f3eb485
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:05 1970 +0000
+ summary: binary-change
+
+ diff -r ad816da3711e -r dccd6f3eb485 tip.bundle
+ Binary file tip.bundle has changed
+
+
+Rename and change binary file
+
+ $ hg mv tip.bundle top.bundle
+ $ hg bundle --base -2 top.bundle
+ 1 changesets found
+ $ hg record -d '6 0' -m binary-change-rename<<EOF
+ > y
+ > EOF
+ diff --git a/tip.bundle b/top.bundle
+ rename from tip.bundle
+ rename to top.bundle
+ this modifies a binary file (all or nothing)
+ examine changes to 'tip.bundle' and 'top.bundle'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 6:7fa44105f5b3
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:06 1970 +0000
+ summary: binary-change-rename
+
+ diff -r dccd6f3eb485 -r 7fa44105f5b3 tip.bundle
+ Binary file tip.bundle has changed
+ diff -r dccd6f3eb485 -r 7fa44105f5b3 top.bundle
+ Binary file top.bundle has changed
+
+
+Add plain file
+
+ $ for i in 1 2 3 4 5 6 7 8 9 10; do
+ > echo $i >> plain
+ > done
+
+ $ hg add plain
+ $ hg record -d '7 0' -m plain plain<<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ new file mode 100644
+ examine changes to 'plain'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 7:11fb457c1be4
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:07 1970 +0000
+ summary: plain
+
+ diff -r 7fa44105f5b3 -r 11fb457c1be4 plain
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:07 1970 +0000
+ @@ -0,0 +1,10 @@
+ +1
+ +2
+ +3
+ +4
+ +5
+ +6
+ +7
+ +8
+ +9
+ +10
+
+
+Modify end of plain file
+
+ $ echo 11 >> plain
+ $ hg record -d '8 0' -m end plain <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 1 hunks, 1 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -8,3 +8,4 @@
+ 8
+ 9
+ 10
+ +11
+ record this change to 'plain'? [Ynesfdaq?]
+
+Modify end of plain file, no EOL
+
+ $ hg tip --template '{node}' >> plain
+ $ hg record -d '9 0' -m noeol plain <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 1 hunks, 1 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -9,3 +9,4 @@
+ 9
+ 10
+ 11
+ +7264f99c5f5ff3261504828afa4fb4d406c3af54
+ \ No newline at end of file
+ record this change to 'plain'? [Ynesfdaq?]
+
+Modify end of plain file, add EOL
+
+ $ echo >> plain
+ $ echo 1 > plain2
+ $ hg add plain2
+ $ hg record -d '10 0' -m eol plain plain2 <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 1 hunks, 1 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -9,4 +9,4 @@
+ 9
+ 10
+ 11
+ -7264f99c5f5ff3261504828afa4fb4d406c3af54
+ \ No newline at end of file
+ +7264f99c5f5ff3261504828afa4fb4d406c3af54
+ record change 1/2 to 'plain'? [Ynesfdaq?]
+ diff --git a/plain2 b/plain2
+ new file mode 100644
+ examine changes to 'plain2'? [Ynesfdaq?]
+
+Modify beginning, trim end, record both, add another file to test
+changes numbering
+
+ $ rm plain
+ $ for i in 2 2 3 4 5 6 7 8 9 10; do
+ > echo $i >> plain
+ > done
+ $ echo 2 >> plain2
+
+ $ hg record -d '10 0' -m begin-and-end plain plain2 <<EOF
+ > y
+ > y
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 2 hunks, 3 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -1,4 +1,4 @@
+ -1
+ +2
+ 2
+ 3
+ 4
+ record change 1/3 to 'plain'? [Ynesfdaq?]
+ @@ -8,5 +8,3 @@
+ 8
+ 9
+ 10
+ -11
+ -7264f99c5f5ff3261504828afa4fb4d406c3af54
+ record change 2/3 to 'plain'? [Ynesfdaq?]
+ diff --git a/plain2 b/plain2
+ 1 hunks, 1 lines changed
+ examine changes to 'plain2'? [Ynesfdaq?]
+ @@ -1,1 +1,2 @@
+ 1
+ +2
+ record change 3/3 to 'plain2'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 11:21df83db12b8
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:10 1970 +0000
+ summary: begin-and-end
+
+ diff -r ddb8b281c3ff -r 21df83db12b8 plain
+ --- a/plain Thu Jan 01 00:00:10 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:10 1970 +0000
+ @@ -1,4 +1,4 @@
+ -1
+ +2
+ 2
+ 3
+ 4
+ @@ -8,5 +8,3 @@
+ 8
+ 9
+ 10
+ -11
+ -7264f99c5f5ff3261504828afa4fb4d406c3af54
+ diff -r ddb8b281c3ff -r 21df83db12b8 plain2
+ --- a/plain2 Thu Jan 01 00:00:10 1970 +0000
+ +++ b/plain2 Thu Jan 01 00:00:10 1970 +0000
+ @@ -1,1 +1,2 @@
+ 1
+ +2
+
+
+Trim beginning, modify end
+
+ $ rm plain
+ > for i in 4 5 6 7 8 9 10.new; do
+ > echo $i >> plain
+ > done
+
+Record end
+
+ $ hg record -d '11 0' -m end-only plain <<EOF
+ > y
+ > n
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 2 hunks, 4 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -1,9 +1,6 @@
+ -2
+ -2
+ -3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ record change 1/2 to 'plain'? [Ynesfdaq?]
+ @@ -4,7 +1,7 @@
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ -10
+ +10.new
+ record change 2/2 to 'plain'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 12:99337501826f
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:11 1970 +0000
+ summary: end-only
+
+ diff -r 21df83db12b8 -r 99337501826f plain
+ --- a/plain Thu Jan 01 00:00:10 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:11 1970 +0000
+ @@ -7,4 +7,4 @@
+ 7
+ 8
+ 9
+ -10
+ +10.new
+
+
+Record beginning
+
+ $ hg record -d '12 0' -m begin-only plain <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 1 hunks, 3 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -1,6 +1,3 @@
+ -2
+ -2
+ -3
+ 4
+ 5
+ 6
+ record this change to 'plain'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 13:bbd45465d540
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:12 1970 +0000
+ summary: begin-only
+
+ diff -r 99337501826f -r bbd45465d540 plain
+ --- a/plain Thu Jan 01 00:00:11 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:12 1970 +0000
+ @@ -1,6 +1,3 @@
+ -2
+ -2
+ -3
+ 4
+ 5
+ 6
+
+
+Add to beginning, trim from end
+
+ $ rm plain
+ $ for i in 1 2 3 4 5 6 7 8 9; do
+ > echo $i >> plain
+ > done
+
+Record end
+
+ $ hg record --traceback -d '13 0' -m end-again plain<<EOF
+ > y
+ > n
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 2 hunks, 4 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -1,6 +1,9 @@
+ +1
+ +2
+ +3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ record change 1/2 to 'plain'? [Ynesfdaq?]
+ @@ -1,7 +4,6 @@
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ -10.new
+ record change 2/2 to 'plain'? [Ynesfdaq?]
+
+Add to beginning, middle, end
+
+ $ rm plain
+ $ for i in 1 2 3 4 5 5.new 5.reallynew 6 7 8 9 10 11; do
+ > echo $i >> plain
+ > done
+
+Record beginning, middle
+
+ $ hg record -d '14 0' -m middle-only plain <<EOF
+ > y
+ > y
+ > y
+ > n
+ > EOF
+ diff --git a/plain b/plain
+ 3 hunks, 7 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -1,2 +1,5 @@
+ +1
+ +2
+ +3
+ 4
+ 5
+ record change 1/3 to 'plain'? [Ynesfdaq?]
+ @@ -1,6 +4,8 @@
+ 4
+ 5
+ +5.new
+ +5.reallynew
+ 6
+ 7
+ 8
+ 9
+ record change 2/3 to 'plain'? [Ynesfdaq?]
+ @@ -3,4 +8,6 @@
+ 6
+ 7
+ 8
+ 9
+ +10
+ +11
+ record change 3/3 to 'plain'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 15:f34a7937ec33
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:14 1970 +0000
+ summary: middle-only
+
+ diff -r 82c065d0b850 -r f34a7937ec33 plain
+ --- a/plain Thu Jan 01 00:00:13 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:14 1970 +0000
+ @@ -1,5 +1,10 @@
+ +1
+ +2
+ +3
+ 4
+ 5
+ +5.new
+ +5.reallynew
+ 6
+ 7
+ 8
+
+
+Record end
+
+ $ hg record -d '15 0' -m end-only plain <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/plain b/plain
+ 1 hunks, 2 lines changed
+ examine changes to 'plain'? [Ynesfdaq?]
+ @@ -9,3 +9,5 @@
+ 7
+ 8
+ 9
+ +10
+ +11
+ record this change to 'plain'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 16:f9900b71a04c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:15 1970 +0000
+ summary: end-only
+
+ diff -r f34a7937ec33 -r f9900b71a04c plain
+ --- a/plain Thu Jan 01 00:00:14 1970 +0000
+ +++ b/plain Thu Jan 01 00:00:15 1970 +0000
+ @@ -9,3 +9,5 @@
+ 7
+ 8
+ 9
+ +10
+ +11
+
+
+ $ mkdir subdir
+ $ cd subdir
+ $ echo a > a
+ $ hg ci -d '16 0' -Amsubdir
+ adding subdir/a
+
+ $ echo a >> a
+ $ hg record -d '16 0' -m subdir-change a <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/a b/subdir/a
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/a'? [Ynesfdaq?]
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ record this change to 'subdir/a'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 18:61be427a9deb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:16 1970 +0000
+ summary: subdir-change
+
+ diff -r a7ffae4d61cb -r 61be427a9deb subdir/a
+ --- a/subdir/a Thu Jan 01 00:00:16 1970 +0000
+ +++ b/subdir/a Thu Jan 01 00:00:16 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+
+ $ echo a > f1
+ $ echo b > f2
+ $ hg add f1 f2
+
+ $ hg ci -mz -d '17 0'
+
+ $ echo a >> f1
+ $ echo b >> f2
+
+Help, quit
+
+ $ hg record <<EOF
+ > ?
+ > q
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ y - record this change
+ n - skip this change
+ e - edit this change manually
+ s - skip remaining changes to this file
+ f - record remaining changes to this file
+ d - done, skip remaining changes and files
+ a - record all changes to all remaining files
+ q - quit, recording no changes
+ ? - display help
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ abort: user quit
+ [255]
+
+Skip
+
+ $ hg record <<EOF
+ > s
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ diff --git a/subdir/f2 b/subdir/f2
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f2'? [Ynesfdaq?] abort: response expected
+ [255]
+
+No
+
+ $ hg record <<EOF
+ > n
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ diff --git a/subdir/f2 b/subdir/f2
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f2'? [Ynesfdaq?] abort: response expected
+ [255]
+
+f, quit
+
+ $ hg record <<EOF
+ > f
+ > q
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ diff --git a/subdir/f2 b/subdir/f2
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f2'? [Ynesfdaq?]
+ abort: user quit
+ [255]
+
+s, all
+
+ $ hg record -d '18 0' -mx <<EOF
+ > s
+ > a
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ diff --git a/subdir/f2 b/subdir/f2
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f2'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 20:b3df3dda369a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:18 1970 +0000
+ summary: x
+
+ diff -r 6e02d6c9906d -r b3df3dda369a subdir/f2
+ --- a/subdir/f2 Thu Jan 01 00:00:17 1970 +0000
+ +++ b/subdir/f2 Thu Jan 01 00:00:18 1970 +0000
+ @@ -1,1 +1,2 @@
+ b
+ +b
+
+
+f
+
+ $ hg record -d '19 0' -my <<EOF
+ > f
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 21:38ec577f126b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:19 1970 +0000
+ summary: y
+
+ diff -r b3df3dda369a -r 38ec577f126b subdir/f1
+ --- a/subdir/f1 Thu Jan 01 00:00:18 1970 +0000
+ +++ b/subdir/f1 Thu Jan 01 00:00:19 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+
+#if execbit
+
+Preserve chmod +x
+
+ $ chmod +x f1
+ $ echo a >> f1
+ $ hg record -d '20 0' -mz <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ old mode 100644
+ new mode 100755
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -1,2 +1,3 @@
+ a
+ a
+ +a
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 22:3261adceb075
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:20 1970 +0000
+ summary: z
+
+ diff --git a/subdir/f1 b/subdir/f1
+ old mode 100644
+ new mode 100755
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -1,2 +1,3 @@
+ a
+ a
+ +a
+
+
+Preserve execute permission on original
+
+ $ echo b >> f1
+ $ hg record -d '21 0' -maa <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -1,3 +1,4 @@
+ a
+ a
+ a
+ +b
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 23:b429867550db
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:21 1970 +0000
+ summary: aa
+
+ diff --git a/subdir/f1 b/subdir/f1
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -1,3 +1,4 @@
+ a
+ a
+ a
+ +b
+
+
+Preserve chmod -x
+
+ $ chmod -x f1
+ $ echo c >> f1
+ $ hg record -d '22 0' -mab <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ old mode 100755
+ new mode 100644
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -2,3 +2,4 @@
+ a
+ a
+ b
+ +c
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 24:0b082130c20a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:22 1970 +0000
+ summary: ab
+
+ diff --git a/subdir/f1 b/subdir/f1
+ old mode 100755
+ new mode 100644
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -2,3 +2,4 @@
+ a
+ a
+ b
+ +c
+
+
+#else
+
+Slightly bogus tests to get almost same repo structure as when x bit is used
+- but with different hashes.
+
+Mock "Preserve chmod +x"
+
+ $ echo a >> f1
+ $ hg record -d '20 0' -mz <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -1,2 +1,3 @@
+ a
+ a
+ +a
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 22:0d463bd428f5
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:20 1970 +0000
+ summary: z
+
+ diff --git a/subdir/f1 b/subdir/f1
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -1,2 +1,3 @@
+ a
+ a
+ +a
+
+
+Mock "Preserve execute permission on original"
+
+ $ echo b >> f1
+ $ hg record -d '21 0' -maa <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -1,3 +1,4 @@
+ a
+ a
+ a
+ +b
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 23:0eab41a3e524
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:21 1970 +0000
+ summary: aa
+
+ diff --git a/subdir/f1 b/subdir/f1
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -1,3 +1,4 @@
+ a
+ a
+ a
+ +b
+
+
+Mock "Preserve chmod -x"
+
+ $ chmod -x f1
+ $ echo c >> f1
+ $ hg record -d '22 0' -mab <<EOF
+ > y
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -2,3 +2,4 @@
+ a
+ a
+ b
+ +c
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip --config diff.git=True -p
+ changeset: 24:f4f718f27b7c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:22 1970 +0000
+ summary: ab
+
+ diff --git a/subdir/f1 b/subdir/f1
+ --- a/subdir/f1
+ +++ b/subdir/f1
+ @@ -2,3 +2,4 @@
+ a
+ a
+ b
+ +c
+
+
+#endif
+
+ $ cd ..
+
+
+Abort early when a merge is in progress
+
+ $ hg up 4
+ 1 files updated, 0 files merged, 6 files removed, 0 files unresolved
+
+ $ touch iwillmergethat
+ $ hg add iwillmergethat
+
+ $ hg branch thatbranch
+ marked working directory as branch thatbranch
+ (branches are permanent and global, did you want a bookmark?)
+
+ $ hg ci -m'new head'
+
+ $ hg up default
+ 6 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ hg merge thatbranch
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg record -m'will abort'
+ abort: cannot partially commit a merge (use "hg commit" instead)
+ [255]
+
+ $ hg up -C
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Editing patch
+
+ $ cat > editor.sh << '__EOF__'
+ > sed -e 7d -e '5s/^-/ /' "$1" > tmp
+ > mv tmp "$1"
+ > __EOF__
+ $ cat > editedfile << '__EOF__'
+ > This is the first line
+ > This is the second line
+ > This is the third line
+ > __EOF__
+ $ hg add editedfile
+ $ hg commit -medit-patch-1
+ $ cat > editedfile << '__EOF__'
+ > This line has changed
+ > This change will be committed
+ > This is the third line
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg record -d '23 0' -medit-patch-2 <<EOF
+ > y
+ > e
+ > EOF
+ diff --git a/editedfile b/editedfile
+ 1 hunks, 2 lines changed
+ examine changes to 'editedfile'? [Ynesfdaq?]
+ @@ -1,3 +1,3 @@
+ -This is the first line
+ -This is the second line
+ +This line has changed
+ +This change will be committed
+ This is the third line
+ record this change to 'editedfile'? [Ynesfdaq?]
+ $ cat editedfile
+ This line has changed
+ This change will be committed
+ This is the third line
+ $ hg cat -r tip editedfile
+ This is the first line
+ This change will be committed
+ This is the third line
+ $ hg revert editedfile
+
+Trying to edit patch for whole file
+
+ $ echo "This is the fourth line" >> editedfile
+ $ hg record <<EOF
+ > e
+ > q
+ > EOF
+ diff --git a/editedfile b/editedfile
+ 1 hunks, 1 lines changed
+ examine changes to 'editedfile'? [Ynesfdaq?]
+ cannot edit patch for whole file
+ examine changes to 'editedfile'? [Ynesfdaq?]
+ abort: user quit
+ [255]
+ $ hg revert editedfile
+
+Removing changes from patch
+
+ $ sed -e '3s/third/second/' -e '2s/will/will not/' -e 1d editedfile > tmp
+ $ mv tmp editedfile
+ $ echo "This line has been added" >> editedfile
+ $ cat > editor.sh << '__EOF__'
+ > sed -e 's/^[-+]/ /' "$1" > tmp
+ > mv tmp "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg record <<EOF
+ > y
+ > e
+ > EOF
+ diff --git a/editedfile b/editedfile
+ 1 hunks, 3 lines changed
+ examine changes to 'editedfile'? [Ynesfdaq?]
+ @@ -1,3 +1,3 @@
+ -This is the first line
+ -This change will be committed
+ -This is the third line
+ +This change will not be committed
+ +This is the second line
+ +This line has been added
+ record this change to 'editedfile'? [Ynesfdaq?]
+ no changes to record
+ $ cat editedfile
+ This change will not be committed
+ This is the second line
+ This line has been added
+ $ hg cat -r tip editedfile
+ This is the first line
+ This change will be committed
+ This is the third line
+ $ hg revert editedfile
+
+Invalid patch
+
+ $ sed -e '3s/third/second/' -e '2s/will/will not/' -e 1d editedfile > tmp
+ $ mv tmp editedfile
+ $ echo "This line has been added" >> editedfile
+ $ cat > editor.sh << '__EOF__'
+ > sed s/This/That/ "$1" > tmp
+ > mv tmp "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg record <<EOF
+ > y
+ > e
+ > EOF
+ diff --git a/editedfile b/editedfile
+ 1 hunks, 3 lines changed
+ examine changes to 'editedfile'? [Ynesfdaq?]
+ @@ -1,3 +1,3 @@
+ -This is the first line
+ -This change will be committed
+ -This is the third line
+ +This change will not be committed
+ +This is the second line
+ +This line has been added
+ record this change to 'editedfile'? [Ynesfdaq?]
+ patching file editedfile
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file editedfile.rej
+ abort: patch failed to apply
+ [255]
+ $ cat editedfile
+ This change will not be committed
+ This is the second line
+ This line has been added
+ $ hg cat -r tip editedfile
+ This is the first line
+ This change will be committed
+ This is the third line
+ $ cat editedfile.rej
+ --- editedfile
+ +++ editedfile
+ @@ -1,3 +1,3 @@
+ -That is the first line
+ -That change will be committed
+ -That is the third line
+ +That change will not be committed
+ +That is the second line
+ +That line has been added
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+With win32text
+
+ $ echo '[extensions]' >> .hg/hgrc
+ $ echo 'win32text = ' >> .hg/hgrc
+ $ echo '[decode]' >> .hg/hgrc
+ $ echo '** = cleverdecode:' >> .hg/hgrc
+ $ echo '[encode]' >> .hg/hgrc
+ $ echo '** = cleverencode:' >> .hg/hgrc
+ $ echo '[patch]' >> .hg/hgrc
+ $ echo 'eol = crlf' >> .hg/hgrc
+
+Ignore win32text deprecation warning for now:
+
+ $ echo '[win32text]' >> .hg/hgrc
+ $ echo 'warn = no' >> .hg/hgrc
+
+ $ echo d >> subdir/f1
+ $ hg record -d '24 0' -mw1 <<EOF
+ > y
+ > y
+ > EOF
+ diff --git a/subdir/f1 b/subdir/f1
+ 1 hunks, 1 lines changed
+ examine changes to 'subdir/f1'? [Ynesfdaq?]
+ @@ -3,3 +3,4 @@
+ a
+ b
+ c
+ +d
+ record this change to 'subdir/f1'? [Ynesfdaq?]
+
+ $ hg tip -p
+ changeset: 28:* (glob)
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:24 1970 +0000
+ summary: w1
+
+ diff -r ???????????? -r ???????????? subdir/f1 (glob)
+ --- a/subdir/f1 Thu Jan 01 00:00:23 1970 +0000
+ +++ b/subdir/f1 Thu Jan 01 00:00:24 1970 +0000
+ @@ -3,3 +3,4 @@
+ a
+ b
+ c
+ +d
+
+
+ $ cd ..
diff --git a/tests/test-relink.t b/tests/test-relink.t
new file mode 100644
index 0000000..2b0bc2b
--- /dev/null
+++ b/tests/test-relink.t
@@ -0,0 +1,100 @@
+ $ "$TESTDIR/hghave" hardlink || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "relink=" >> $HGRCPATH
+
+ $ fix_path() {
+ > tr '\\' /
+ > }
+
+ $ cat > arelinked.py <<EOF
+ > import sys, os
+ > from mercurial import util
+ > path1, path2 = sys.argv[1:3]
+ > if util.samefile(path1, path2):
+ > print '%s == %s' % (path1, path2)
+ > else:
+ > print '%s != %s' % (path1, path2)
+ > EOF
+
+
+create source repository
+
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ echo b > b
+ $ hg ci -Am addfile
+ adding a
+ adding b
+ $ cat "$TESTDIR/binfile.bin" >> a
+ $ cat "$TESTDIR/binfile.bin" >> b
+ $ hg ci -Am changefiles
+
+make another commit to create files larger than 1 KB to test
+formatting of final byte count
+
+ $ cat "$TESTDIR/binfile.bin" >> a
+ $ cat "$TESTDIR/binfile.bin" >> b
+ $ hg ci -m anotherchange
+
+don't sit forever trying to double-lock the source repo
+
+ $ hg relink .
+ relinking $TESTTMP/repo/.hg/store to $TESTTMP/repo/.hg/store (glob)
+ there is nothing to relink
+
+
+Test files are read in binary mode
+
+ $ python -c "file('.hg/store/data/dummy.i', 'wb').write('a\r\nb\n')"
+ $ cd ..
+
+
+clone and pull to break links
+
+ $ hg clone --pull -r0 repo clone
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd clone
+ $ hg pull -q
+ $ echo b >> b
+ $ hg ci -m changeb
+ created new head
+ $ python -c "file('.hg/store/data/dummy.i', 'wb').write('a\nb\r\n')"
+
+
+relink
+
+ $ hg relink --debug | fix_path
+ relinking $TESTTMP/repo/.hg/store to $TESTTMP/clone/.hg/store
+ tip has 2 files, estimated total number of files: 3
+ collecting: 00changelog.i 1/3 files (33.33%)
+ collecting: 00manifest.i 2/3 files (66.67%)
+ collecting: a.i 3/3 files (100.00%)
+ collecting: b.i 4/3 files (133.33%)
+ collecting: dummy.i 5/3 files (166.67%)
+ collected 5 candidate storage files
+ not linkable: 00changelog.i
+ not linkable: 00manifest.i
+ pruning: data/a.i 3/5 files (60.00%)
+ not linkable: data/b.i
+ pruning: data/dummy.i 5/5 files (100.00%)
+ pruned down to 2 probably relinkable files
+ relinking: data/a.i 1/2 files (50.00%)
+ not linkable: data/dummy.i
+ relinked 1 files (1.37 KB reclaimed)
+ $ cd ..
+
+
+check hardlinks
+
+ $ python arelinked.py repo/.hg/store/data/a.i clone/.hg/store/data/a.i
+ repo/.hg/store/data/a.i == clone/.hg/store/data/a.i
+ $ python arelinked.py repo/.hg/store/data/b.i clone/.hg/store/data/b.i
+ repo/.hg/store/data/b.i != clone/.hg/store/data/b.i
+
diff --git a/tests/test-remove.t b/tests/test-remove.t
new file mode 100644
index 0000000..f67146e
--- /dev/null
+++ b/tests/test-remove.t
@@ -0,0 +1,268 @@
+ $ remove() {
+ > hg rm $@
+ > echo "exit code: $?" # no-check-code
+ > hg st
+ > # do not use ls -R, which recurses in .hg subdirs on Mac OS X 10.5
+ > find . -name .hg -prune -o -type f -print | sort
+ > hg up -C
+ > }
+
+ $ hg init a
+ $ cd a
+ $ echo a > foo
+
+file not managed
+
+ $ remove foo
+ not removing foo: file is untracked
+ exit code: 1
+ ? foo
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg add foo
+ $ hg commit -m1
+
+the table cases
+00 state added, options none
+
+ $ echo b > bar
+ $ hg add bar
+ $ remove bar
+ not removing bar: file has been marked for add (use forget to undo)
+ exit code: 1
+ A bar
+ ./bar
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+01 state clean, options none
+
+ $ remove foo
+ exit code: 0
+ R foo
+ ? bar
+ ./bar
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+02 state modified, options none
+
+ $ echo b >> foo
+ $ remove foo
+ not removing foo: file is modified (use -f to force removal)
+ exit code: 1
+ M foo
+ ? bar
+ ./bar
+ ./foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+03 state missing, options none
+
+ $ rm foo
+ $ remove foo
+ exit code: 0
+ R foo
+ ? bar
+ ./bar
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+10 state added, options -f
+
+ $ echo b > bar
+ $ hg add bar
+ $ remove -f bar
+ exit code: 0
+ ? bar
+ ./bar
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm bar
+
+11 state clean, options -f
+
+ $ remove -f foo
+ exit code: 0
+ R foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+12 state modified, options -f
+
+ $ echo b >> foo
+ $ remove -f foo
+ exit code: 0
+ R foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+13 state missing, options -f
+
+ $ rm foo
+ $ remove -f foo
+ exit code: 0
+ R foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+20 state added, options -A
+
+ $ echo b > bar
+ $ hg add bar
+ $ remove -A bar
+ not removing bar: file still exists (use -f to force removal)
+ exit code: 1
+ A bar
+ ./bar
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+21 state clean, options -A
+
+ $ remove -A foo
+ not removing foo: file still exists (use -f to force removal)
+ exit code: 1
+ ? bar
+ ./bar
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+22 state modified, options -A
+
+ $ echo b >> foo
+ $ remove -A foo
+ not removing foo: file still exists (use -f to force removal)
+ exit code: 1
+ M foo
+ ? bar
+ ./bar
+ ./foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+23 state missing, options -A
+
+ $ rm foo
+ $ remove -A foo
+ exit code: 0
+ R foo
+ ? bar
+ ./bar
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+30 state added, options -Af
+
+ $ echo b > bar
+ $ hg add bar
+ $ remove -Af bar
+ exit code: 0
+ ? bar
+ ./bar
+ ./foo
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm bar
+
+31 state clean, options -Af
+
+ $ remove -Af foo
+ exit code: 0
+ R foo
+ ./foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+32 state modified, options -Af
+
+ $ echo b >> foo
+ $ remove -Af foo
+ exit code: 0
+ R foo
+ ./foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+33 state missing, options -Af
+
+ $ rm foo
+ $ remove -Af foo
+ exit code: 0
+ R foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test some directory stuff
+
+ $ mkdir test
+ $ echo a > test/foo
+ $ echo b > test/bar
+ $ hg ci -Am2
+ adding test/bar
+ adding test/foo
+
+dir, options none
+
+ $ rm test/bar
+ $ remove test
+ removing test/bar (glob)
+ removing test/foo (glob)
+ exit code: 0
+ R test/bar
+ R test/foo
+ ./foo
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+dir, options -f
+
+ $ rm test/bar
+ $ remove -f test
+ removing test/bar (glob)
+ removing test/foo (glob)
+ exit code: 0
+ R test/bar
+ R test/foo
+ ./foo
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+dir, options -A
+
+ $ rm test/bar
+ $ remove -A test
+ not removing test/foo: file still exists (use -f to force removal) (glob)
+ removing test/bar (glob)
+ exit code: 1
+ R test/bar
+ ./foo
+ ./test/foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+dir, options -Af
+
+ $ rm test/bar
+ $ remove -Af test
+ removing test/bar (glob)
+ removing test/foo (glob)
+ exit code: 0
+ R test/bar
+ R test/foo
+ ./foo
+ ./test/foo
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test remove dropping empty trees (issue1861)
+
+ $ mkdir -p issue1861/b/c
+ $ echo x > issue1861/x
+ $ echo y > issue1861/b/c/y
+ $ hg ci -Am add
+ adding issue1861/b/c/y
+ adding issue1861/x
+ $ hg rm issue1861/b
+ removing issue1861/b/c/y (glob)
+ $ hg ci -m remove
+ $ ls issue1861
+ x
+
+test that commit does not crash if the user removes a newly added file
+
+ $ touch f1
+ $ hg add f1
+ $ rm f1
+ $ hg ci -A -mx
+ removing f1
+ nothing changed
+ [1]
+
+ $ cd ..
diff --git a/tests/test-rename-after-merge.t b/tests/test-rename-after-merge.t
new file mode 100644
index 0000000..8c6bd49
--- /dev/null
+++ b/tests/test-rename-after-merge.t
@@ -0,0 +1,121 @@
+Issue746: renaming files brought by the second parent of a merge was
+broken.
+
+Create source repository:
+
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg ci -Am a
+ adding a
+ $ cd ..
+
+Fork source repository:
+
+ $ hg clone t t2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd t2
+ $ echo b > b
+ $ hg ci -Am b
+ adding b
+
+Update source repository:
+
+ $ cd ../t
+ $ echo a >> a
+ $ hg ci -m a2
+
+Merge repositories:
+
+ $ hg pull ../t2
+ pulling from ../t2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg st
+ M b
+
+Rename b as c:
+
+ $ hg mv b c
+ $ hg st
+ A c
+ R b
+
+Rename back c as b:
+
+ $ hg mv c b
+ $ hg st
+ M b
+
+ $ cd ..
+
+Issue 1476: renaming a first parent file into another first parent
+file while none of them belong to the second parent was broken
+
+ $ hg init repo1476
+ $ cd repo1476
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo b1 > b1
+ $ echo b2 > b2
+ $ hg ci -Am changea
+ adding b1
+ adding b2
+ $ hg up -C 0
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo c1 > c1
+ $ echo c2 > c2
+ $ hg ci -Am addcandd
+ adding c1
+ adding c2
+ created new head
+
+Merge heads:
+
+ $ hg merge
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg mv -Af c1 c2
+
+Commit issue 1476:
+
+ $ hg ci -m merge
+
+ $ hg log -r tip -C -v | grep copies
+ copies: c2 (c1)
+
+ $ hg rollback
+ repository tip rolled back to revision 2 (undo commit)
+ working directory now based on revisions 2 and 1
+
+ $ hg up -C .
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+Merge heads again:
+
+ $ hg merge
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg mv -Af b1 b2
+
+Commit issue 1476 with a rename on the other side:
+
+ $ hg ci -m merge
+
+ $ hg log -r tip -C -v | grep copies
+ copies: b2 (b1)
+
+ $ cd ..
diff --git a/tests/test-rename-dir-merge.t b/tests/test-rename-dir-merge.t
new file mode 100644
index 0000000..b115c26
--- /dev/null
+++ b/tests/test-rename-dir-merge.t
@@ -0,0 +1,159 @@
+ $ hg init t
+ $ cd t
+
+ $ mkdir a
+ $ echo foo > a/a
+ $ echo bar > a/b
+ $ hg ci -Am "0"
+ adding a/a
+ adding a/b
+
+ $ hg co -C 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg mv a b
+ moving a/a to b/a (glob)
+ moving a/b to b/b (glob)
+ $ hg ci -m "1 mv a/ b/"
+
+ $ hg co -C 0
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo baz > a/c
+ $ echo quux > a/d
+ $ hg add a/c
+ $ hg ci -m "2 add a/c"
+ created new head
+
+ $ hg merge --debug 1
+ searching for copies back to rev 1
+ unmatched files in local:
+ a/c
+ unmatched files in other:
+ b/a
+ b/b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b/a -> a/a
+ b/b -> a/b
+ checking for directory renames
+ dir a/ -> b/
+ file a/c -> b/c
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: f9b20c0d4c51, local: ce36d17b18fb+, remote: 397f8b00a740
+ a/c: remote renamed directory to b/c -> d
+ a/b: other deleted -> r
+ a/a: other deleted -> r
+ b/a: remote created -> g
+ b/b: remote created -> g
+ updating: a/a 1/5 files (20.00%)
+ removing a/a
+ updating: a/b 2/5 files (40.00%)
+ removing a/b
+ updating: a/c 3/5 files (60.00%)
+ moving a/c to b/c
+ updating: b/a 4/5 files (80.00%)
+ getting b/a
+ updating: b/b 5/5 files (100.00%)
+ getting b/b
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ echo a/* b/*
+ a/d b/a b/b b/c
+ $ hg st -C
+ M b/a
+ M b/b
+ A b/c
+ a/c
+ R a/a
+ R a/b
+ R a/c
+ ? a/d
+ $ hg ci -m "3 merge 2+1"
+ $ hg debugrename b/c
+ b/c renamed from a/c:354ae8da6e890359ef49ade27b68bbc361f3ca88 (glob)
+
+ $ hg co -C 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge --debug 2
+ searching for copies back to rev 1
+ unmatched files in local:
+ b/a
+ b/b
+ unmatched files in other:
+ a/c
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b/a -> a/a
+ b/b -> a/b
+ checking for directory renames
+ dir a/ -> b/
+ file a/c -> b/c
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: f9b20c0d4c51, local: 397f8b00a740+, remote: ce36d17b18fb
+ None: local renamed directory to b/c -> d
+ updating:None 1/1 files (100.00%)
+ getting a/c to b/c
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ echo a/* b/*
+ a/d b/a b/b b/c
+ $ hg st -C
+ A b/c
+ a/c
+ ? a/d
+ $ hg ci -m "4 merge 1+2"
+ created new head
+ $ hg debugrename b/c
+ b/c renamed from a/c:354ae8da6e890359ef49ade27b68bbc361f3ca88 (glob)
+
+
+Second scenario with two repos:
+
+ $ cd ..
+ $ hg init r1
+ $ cd r1
+ $ mkdir a
+ $ echo foo > a/f
+ $ hg add a
+ adding a/f (glob)
+ $ hg ci -m "a/f == foo"
+ $ cd ..
+
+ $ hg clone r1 r2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd r2
+ $ hg mv a b
+ moving a/f to b/f (glob)
+ $ echo foo1 > b/f
+ $ hg ci -m" a -> b, b/f == foo1"
+ $ cd ..
+
+ $ cd r1
+ $ mkdir a/aa
+ $ echo bar > a/aa/g
+ $ hg add a/aa
+ adding a/aa/g (glob)
+ $ hg ci -m "a/aa/g"
+ $ hg pull ../r2
+ pulling from ../r2
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg merge
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg st -C
+ M b/f
+ A b/aa/g
+ a/aa/g
+ R a/aa/g
+ R a/f
+
+ $ cd ..
diff --git a/tests/test-rename-merge1.t b/tests/test-rename-merge1.t
new file mode 100644
index 0000000..f6b5f52
--- /dev/null
+++ b/tests/test-rename-merge1.t
@@ -0,0 +1,195 @@
+ $ hg init
+
+ $ echo "[merge]" >> .hg/hgrc
+ $ echo "followcopies = 1" >> .hg/hgrc
+
+ $ echo foo > a
+ $ echo foo > a2
+ $ hg add a a2
+ $ hg ci -m "start"
+
+ $ hg mv a b
+ $ hg mv a2 b2
+ $ hg ci -m "rename"
+
+ $ hg co 0
+ 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ echo blahblah > a
+ $ echo blahblah > a2
+ $ hg mv a2 c2
+ $ hg ci -m "modify"
+ created new head
+
+ $ hg merge -y --debug
+ searching for copies back to rev 1
+ unmatched files in local:
+ c2
+ unmatched files in other:
+ b
+ b2
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ c2 -> a2 !
+ b -> a *
+ b2 -> a2 !
+ checking for directory renames
+ a2: divergent renames -> dr
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: af1939970a1c, local: 044f8520aeeb+, remote: 85c198ef2f6c
+ a: remote moved to b -> m
+ b2: remote created -> g
+ preserving a for resolve of b
+ removing a
+ updating: a 1/3 files (33.33%)
+ picked tool 'internal:merge' for b (binary False symlink False)
+ merging a and b to b
+ my b@044f8520aeeb+ other b@85c198ef2f6c ancestor a@af1939970a1c
+ premerge successful
+ updating: a2 2/3 files (66.67%)
+ note: possible conflict - a2 was renamed multiple times to:
+ c2
+ b2
+ updating: b2 3/3 files (100.00%)
+ getting b2
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg status -AC
+ M b
+ a
+ M b2
+ R a
+ C c2
+
+ $ cat b
+ blahblah
+
+ $ hg ci -m "merge"
+
+ $ hg debugindex b
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 67 ..... 1 57eacc201a7f 000000000000 000000000000 (re)
+ 1 67 72 ..... 3 4727ba907962 000000000000 57eacc201a7f (re)
+
+ $ hg debugrename b
+ b renamed from a:dd03b83622e78778b403775d0d074b9ac7387a66
+
+This used to trigger a "divergent renames" warning, despite no renames
+
+ $ hg cp b b3
+ $ hg cp b b4
+ $ hg ci -A -m 'copy b twice'
+ $ hg up eb92d88a9712
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg up
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg rm b3 b4
+ $ hg ci -m 'clean up a bit of our mess'
+
+We'd rather not warn on divergent renames done in the same changeset (issue2113)
+
+ $ hg cp b b3
+ $ hg mv b b4
+ $ hg ci -A -m 'divergent renames in same changeset'
+ $ hg up c761c6948de0
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg up
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+Check for issue2642
+
+ $ hg init t
+ $ cd t
+
+ $ echo c0 > f1
+ $ hg ci -Aqm0
+
+ $ hg up null -q
+ $ echo c1 > f1 # backport
+ $ hg ci -Aqm1
+ $ hg mv f1 f2
+ $ hg ci -qm2
+
+ $ hg up 0 -q
+ $ hg merge 1 -q --tool internal:local
+ $ hg ci -qm3
+
+ $ hg merge 2
+ merging f1 and f2 to f2
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat f2
+ c0
+
+ $ cd ..
+
+Check for issue2089
+
+ $ hg init repo2089
+ $ cd repo2089
+
+ $ echo c0 > f1
+ $ hg ci -Aqm0
+
+ $ hg up null -q
+ $ echo c1 > f1
+ $ hg ci -Aqm1
+
+ $ hg up 0 -q
+ $ hg merge 1 -q --tool internal:local
+ $ echo c2 > f1
+ $ hg ci -qm2
+
+ $ hg up 1 -q
+ $ hg mv f1 f2
+ $ hg ci -Aqm3
+
+ $ hg up 2 -q
+ $ hg merge 3
+ merging f1 and f2 to f2
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ cat f2
+ c2
+
+ $ cd ..
+
+Check for issue3074
+
+ $ hg init repo3074
+ $ cd repo3074
+ $ echo foo > file
+ $ hg add file
+ $ hg commit -m "added file"
+ $ hg mv file newfile
+ $ hg commit -m "renamed file"
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg rm file
+ $ hg commit -m "deleted file"
+ created new head
+ $ hg merge --debug
+ searching for copies back to rev 1
+ unmatched files in other:
+ newfile
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ newfile -> file %
+ checking for directory renames
+ file: rename and delete -> rd
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 19d7f95df299, local: 0084274f6b67+, remote: 5d32493049f0
+ newfile: remote created -> g
+ updating: file 1/2 files (50.00%)
+ note: possible conflict - file was deleted and renamed to:
+ newfile
+ updating: newfile 2/2 files (100.00%)
+ getting newfile
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg status
+ M newfile
+ $ cd ..
diff --git a/tests/test-rename-merge2.t b/tests/test-rename-merge2.t
new file mode 100644
index 0000000..e5ba1d5
--- /dev/null
+++ b/tests/test-rename-merge2.t
@@ -0,0 +1,754 @@
+
+ $ mkdir -p t
+ $ cd t
+ $ cat <<EOF > merge
+ > import sys, os
+ > f = open(sys.argv[1], "wb")
+ > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
+ > f.close()
+ > EOF
+
+perform a test merge with possible renaming
+args:
+$1 = action in local branch
+$2 = action in remote branch
+$3 = action in working dir
+$4 = expected result
+
+ $ tm()
+ > {
+ > hg init t
+ > cd t
+ > echo "[merge]" >> .hg/hgrc
+ > echo "followcopies = 1" >> .hg/hgrc
+ >
+ > # base
+ > echo base > a
+ > echo base > rev # used to force commits
+ > hg add a rev
+ > hg ci -m "base"
+ >
+ > # remote
+ > echo remote > rev
+ > if [ "$2" != "" ] ; then $2 ; fi
+ > hg ci -m "remote"
+ >
+ > # local
+ > hg co -q 0
+ > echo local > rev
+ > if [ "$1" != "" ] ; then $1 ; fi
+ > hg ci -m "local"
+ >
+ > # working dir
+ > echo local > rev
+ > if [ "$3" != "" ] ; then $3 ; fi
+ >
+ > # merge
+ > echo "--------------"
+ > echo "test L:$1 R:$2 W:$3 - $4"
+ > echo "--------------"
+ > hg merge -y --debug --traceback --tool="python ../merge"
+ >
+ > echo "--------------"
+ > hg status -camC -X rev
+ >
+ > hg ci -m "merge"
+ >
+ > echo "--------------"
+ > echo
+ >
+ > cd ..
+ > rm -r t
+ > }
+ $ up() {
+ > cp rev $1
+ > hg add $1 2> /dev/null
+ > if [ "$2" != "" ] ; then
+ > cp rev $2
+ > hg add $2 2> /dev/null
+ > fi
+ > }
+ $ uc() { up $1; hg cp $1 $2; } # update + copy
+ $ um() { up $1; hg mv $1 $2; }
+ $ nc() { hg cp $1 $2; } # just copy
+ $ nm() { hg mv $1 $2; } # just move
+ $ tm "up a " "nc a b" " " "1 get local a to b"
+ created new head
+ --------------
+ test L:up a R:nc a b W: - 1 get local a to b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
+ rev: versions differ -> m
+ a: remote copied to b -> m
+ preserving a for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging a and b to b
+ my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
+ premerge successful
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ C a
+ --------------
+
+ $ tm "nc a b" "up a " " " "2 get rem change to a and b"
+ created new head
+ --------------
+ test L:nc a b R:up a W: - 2 get rem change to a and b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
+ a: remote is newer -> g
+ b: local copied/moved to a -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ getting a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b and a to b
+ my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
+ premerge successful
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
+ 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M a
+ M b
+ a
+ --------------
+
+ $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
+ created new head
+ --------------
+ test L:up a R:nm a b W: - 3 get local a change to b, remove a
+ --------------
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
+ rev: versions differ -> m
+ a: remote moved to b -> m
+ preserving a for resolve of b
+ preserving rev for resolve of rev
+ removing a
+ updating: a 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging a and b to b
+ my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
+ premerge successful
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ --------------
+
+ $ tm "nm a b" "up a " " " "4 get remote change to b"
+ created new head
+ --------------
+ test L:nm a b R:up a W: - 4 get remote change to b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
+ b: local copied/moved to a -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b and a to b
+ my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
+ premerge successful
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ --------------
+
+ $ tm " " "nc a b" " " "5 get b"
+ created new head
+ --------------
+ test L: R:nc a b W: - 5 get b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
+ rev: versions differ -> m
+ b: remote created -> g
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ getting b
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ C a
+ --------------
+
+ $ tm "nc a b" " " " " "6 nothing"
+ created new head
+ --------------
+ test L:nc a b R: W: - 6 nothing
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
+ rev: versions differ -> m
+ preserving rev for resolve of rev
+ updating: rev 1/1 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ C a
+ C b
+ --------------
+
+ $ tm " " "nm a b" " " "7 get b"
+ created new head
+ --------------
+ test L: R:nm a b W: - 7 get b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
+ a: other deleted -> r
+ rev: versions differ -> m
+ b: remote created -> g
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ removing a
+ updating: b 2/3 files (66.67%)
+ getting b
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
+ 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ --------------
+
+ $ tm "nm a b" " " " " "8 nothing"
+ created new head
+ --------------
+ test L:nm a b R: W: - 8 nothing
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
+ rev: versions differ -> m
+ preserving rev for resolve of rev
+ updating: rev 1/1 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ C b
+ --------------
+
+ $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
+ created new head
+ --------------
+ test L:um a b R:um a b W: - 9 do merge with ancestor in a
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ --------------
+
+
+m "um a c" "um x c" " " "10 do merge with no ancestor"
+
+ $ tm "nm a b" "nm a c" " " "11 get c, keep b"
+ created new head
+ --------------
+ test L:nm a b R:nm a c W: - 11 get c, keep b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ unmatched files in other:
+ c
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ c -> a !
+ b -> a !
+ checking for directory renames
+ a: divergent renames -> dr
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
+ rev: versions differ -> m
+ c: remote created -> g
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ note: possible conflict - a was renamed multiple times to:
+ b
+ c
+ updating: c 2/3 files (66.67%)
+ getting c
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M c
+ C b
+ --------------
+
+ $ tm "nc a b" "up b " " " "12 merge b no ancestor"
+ created new head
+ --------------
+ test L:nc a b R:up b W: - 12 merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ C a
+ --------------
+
+ $ tm "up b " "nm a b" " " "13 merge b no ancestor"
+ created new head
+ --------------
+ test L:up b R:nm a b W: - 13 merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
+ a: other deleted -> r
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ removing a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ --------------
+
+ $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
+ created new head
+ --------------
+ test L:nc a b R:up a b W: - 14 merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
+ a: remote is newer -> g
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ getting a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
+ 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M a
+ M b
+ --------------
+
+ $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
+ created new head
+ --------------
+ test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
+ a: other deleted -> r
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ removing a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ --------------
+
+ $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
+ created new head
+ --------------
+ test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
+ a: remote is newer -> g
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ getting a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
+ 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M a
+ M b
+ --------------
+
+ $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
+ created new head
+ --------------
+ test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ C a
+ --------------
+
+ $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
+ created new head
+ --------------
+ test L:nm a b R:up a b W: - 18 merge b no ancestor
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
+ b: versions differ -> m
+ rev: versions differ -> m
+ remote changed a which local deleted
+ use (c)hanged version or leave (d)eleted? c
+ a: prompt recreating -> g
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ getting a
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
+ 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M a
+ M b
+ --------------
+
+ $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
+ created new head
+ --------------
+ test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
+ --------------
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
+ local changed a which remote deleted
+ use (c)hanged version or (d)elete? c
+ a: prompt keep -> a
+ b: versions differ -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: a 1/3 files (33.33%)
+ updating: b 2/3 files (66.67%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b
+ my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ C a
+ --------------
+
+ $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
+ created new head
+ --------------
+ test L:up a R:um a b W: - 20 merge a and b to b, remove a
+ --------------
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
+ rev: versions differ -> m
+ a: remote moved to b -> m
+ preserving a for resolve of b
+ preserving rev for resolve of rev
+ removing a
+ updating: a 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging a and b to b
+ my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ --------------
+
+ $ tm "um a b" "up a " " " "21 merge a and b to b"
+ created new head
+ --------------
+ test L:um a b R:up a W: - 21 merge a and b to b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
+ b: local copied/moved to a -> m
+ rev: versions differ -> m
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/2 files (50.00%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b and a to b
+ my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
+ updating: rev 2/2 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ --------------
+
+
+m "nm a b" "um x a" " " "22 get a, keep b"
+
+ $ tm "nm a b" "up a c" " " "23 get c, keep b"
+ created new head
+ --------------
+ test L:nm a b R:up a c W: - 23 get c, keep b
+ --------------
+ searching for copies back to rev 1
+ unmatched files in local:
+ b
+ unmatched files in other:
+ c
+ all copies found (* = to merge, ! = divergent, % = renamed and deleted):
+ b -> a *
+ checking for directory renames
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
+ b: local copied/moved to a -> m
+ rev: versions differ -> m
+ c: remote created -> g
+ preserving b for resolve of b
+ preserving rev for resolve of rev
+ updating: b 1/3 files (33.33%)
+ picked tool 'python ../merge' for b (binary False symlink False)
+ merging b and a to b
+ my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
+ premerge successful
+ updating: c 2/3 files (66.67%)
+ getting c
+ updating: rev 3/3 files (100.00%)
+ picked tool 'python ../merge' for rev (binary False symlink False)
+ merging rev
+ my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
+ 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ --------------
+ M b
+ a
+ M c
+ --------------
+
+
+ $ cd ..
diff --git a/tests/test-rename.t b/tests/test-rename.t
new file mode 100644
index 0000000..059f569
--- /dev/null
+++ b/tests/test-rename.t
@@ -0,0 +1,637 @@
+ $ hg init
+ $ mkdir d1 d1/d11 d2
+ $ echo d1/a > d1/a
+ $ echo d1/ba > d1/ba
+ $ echo d1/a1 > d1/d11/a1
+ $ echo d1/b > d1/b
+ $ echo d2/b > d2/b
+ $ hg add d1/a d1/b d1/ba d1/d11/a1 d2/b
+ $ hg commit -m "1"
+
+rename a single file
+
+ $ hg rename d1/d11/a1 d2/c
+ $ hg --config ui.portablefilenames=abort rename d1/a d1/con.xml
+ abort: filename contains 'con', which is reserved on Windows: 'd1/con.xml'
+ [255]
+ $ hg sum
+ parent: 0:9b4b6e7b2c26 tip
+ 1
+ branch: default
+ commit: 1 renamed
+ update: (current)
+ $ hg status -C
+ A d2/c
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/c
+
+rename a single file using absolute paths
+
+ $ hg rename `pwd`/d1/d11/a1 `pwd`/d2/c
+ $ hg status -C
+ A d2/c
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/c
+
+rename --after a single file
+
+ $ mv d1/d11/a1 d2/c
+ $ hg rename --after d1/d11/a1 d2/c
+ $ hg status -C
+ A d2/c
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/c
+
+rename --after a single file when src and tgt already tracked
+
+ $ mv d1/d11/a1 d2/c
+ $ hg addrem -s 0
+ removing d1/d11/a1
+ adding d2/c
+ $ hg rename --after d1/d11/a1 d2/c
+ $ hg status -C
+ A d2/c
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/c
+
+rename --after a single file to a nonexistant target filename
+
+ $ hg rename --after d1/a dummy
+ d1/a: not recording move - dummy does not exist (glob)
+
+move a single file to an existing directory
+
+ $ hg rename d1/d11/a1 d2
+ $ hg status -C
+ A d2/a1
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/a1
+
+move --after a single file to an existing directory
+
+ $ mv d1/d11/a1 d2
+ $ hg rename --after d1/d11/a1 d2
+ $ hg status -C
+ A d2/a1
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/a1
+
+rename a file using a relative path
+
+ $ (cd d1/d11; hg rename ../../d2/b e)
+ $ hg status -C
+ A d1/d11/e
+ d2/b
+ R d2/b
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/d11/e
+
+rename --after a file using a relative path
+
+ $ (cd d1/d11; mv ../../d2/b e; hg rename --after ../../d2/b e)
+ $ hg status -C
+ A d1/d11/e
+ d2/b
+ R d2/b
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/d11/e
+
+rename directory d1 as d3
+
+ $ hg rename d1/ d3
+ moving d1/a to d3/a (glob)
+ moving d1/b to d3/b (glob)
+ moving d1/ba to d3/ba (glob)
+ moving d1/d11/a1 to d3/d11/a1 (glob)
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/b
+ d1/b
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+rename --after directory d1 as d3
+
+ $ mv d1 d3
+ $ hg rename --after d1 d3
+ moving d1/a to d3/a (glob)
+ moving d1/b to d3/b (glob)
+ moving d1/ba to d3/ba (glob)
+ moving d1/d11/a1 to d3/d11/a1 (glob)
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/b
+ d1/b
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move a directory using a relative path
+
+ $ (cd d2; mkdir d3; hg rename ../d1/d11 d3)
+ moving ../d1/d11/a1 to d3/d11/a1 (glob)
+ $ hg status -C
+ A d2/d3/d11/a1
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d3
+
+move --after a directory using a relative path
+
+ $ (cd d2; mkdir d3; mv ../d1/d11 d3; hg rename --after ../d1/d11 d3)
+ moving ../d1/d11/a1 to d3/d11/a1 (glob)
+ $ hg status -C
+ A d2/d3/d11/a1
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d3
+
+move directory d1/d11 to an existing directory d2 (removes empty d1)
+
+ $ hg rename d1/d11/ d2
+ moving d1/d11/a1 to d2/d11/a1 (glob)
+ $ hg status -C
+ A d2/d11/a1
+ d1/d11/a1
+ R d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d11
+
+move directories d1 and d2 to a new directory d3
+
+ $ mkdir d3
+ $ hg rename d1 d2 d3
+ moving d1/a to d3/d1/a (glob)
+ moving d1/b to d3/d1/b (glob)
+ moving d1/ba to d3/d1/ba (glob)
+ moving d1/d11/a1 to d3/d1/d11/a1 (glob)
+ moving d2/b to d3/d2/b (glob)
+ $ hg status -C
+ A d3/d1/a
+ d1/a
+ A d3/d1/b
+ d1/b
+ A d3/d1/ba
+ d1/ba
+ A d3/d1/d11/a1
+ d1/d11/a1
+ A d3/d2/b
+ d2/b
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ R d2/b
+ $ hg update -C
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move --after directories d1 and d2 to a new directory d3
+
+ $ mkdir d3
+ $ mv d1 d2 d3
+ $ hg rename --after d1 d2 d3
+ moving d1/a to d3/d1/a (glob)
+ moving d1/b to d3/d1/b (glob)
+ moving d1/ba to d3/d1/ba (glob)
+ moving d1/d11/a1 to d3/d1/d11/a1 (glob)
+ moving d2/b to d3/d2/b (glob)
+ $ hg status -C
+ A d3/d1/a
+ d1/a
+ A d3/d1/b
+ d1/b
+ A d3/d1/ba
+ d1/ba
+ A d3/d1/d11/a1
+ d1/d11/a1
+ A d3/d2/b
+ d2/b
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ R d2/b
+ $ hg update -C
+ 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move everything under directory d1 to existing directory d2, do not
+overwrite existing files (d2/b)
+
+ $ hg rename d1/* d2
+ d2/b: not overwriting - file exists
+ moving d1/d11/a1 to d2/d11/a1 (glob)
+ $ hg status -C
+ A d2/a
+ d1/a
+ A d2/ba
+ d1/ba
+ A d2/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/ba
+ R d1/d11/a1
+ $ diff -u d1/b d2/b
+ --- d1/b * (glob)
+ +++ d2/b * (glob)
+ @@ * (glob)
+ -d1/b
+ +d2/b
+ [1]
+ $ hg update -C
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d2/a d2/ba d2/d11/a1
+
+attempt to move one file into a non-existent directory
+
+ $ hg rename d1/a dx/
+ abort: destination dx/ is not a directory
+ [255]
+ $ hg status -C
+ $ hg update -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+attempt to move potentially more than one file into a non-existent directory
+
+ $ hg rename 'glob:d1/**' dx
+ abort: with multiple sources, destination must be an existing directory
+ [255]
+
+move every file under d1 to d2/d21 (glob)
+
+ $ mkdir d2/d21
+ $ hg rename 'glob:d1/**' d2/d21
+ moving d1/a to d2/d21/a (glob)
+ moving d1/b to d2/d21/b (glob)
+ moving d1/ba to d2/d21/ba (glob)
+ moving d1/d11/a1 to d2/d21/a1 (glob)
+ $ hg status -C
+ A d2/d21/a
+ d1/a
+ A d2/d21/a1
+ d1/d11/a1
+ A d2/d21/b
+ d1/b
+ A d2/d21/ba
+ d1/ba
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d21
+
+move --after some files under d1 to d2/d21 (glob)
+
+ $ mkdir d2/d21
+ $ mv d1/a d1/d11/a1 d2/d21
+ $ hg rename --after 'glob:d1/**' d2/d21
+ moving d1/a to d2/d21/a (glob)
+ d1/b: not recording move - d2/d21/b does not exist (glob)
+ d1/ba: not recording move - d2/d21/ba does not exist (glob)
+ moving d1/d11/a1 to d2/d21/a1 (glob)
+ $ hg status -C
+ A d2/d21/a
+ d1/a
+ A d2/d21/a1
+ d1/d11/a1
+ R d1/a
+ R d1/d11/a1
+ $ hg update -C
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d21
+
+move every file under d1 starting with an 'a' to d2/d21 (regexp)
+
+ $ mkdir d2/d21
+ $ hg rename 're:d1/([^a][^/]*/)*a.*' d2/d21
+ moving d1/a to d2/d21/a (glob)
+ moving d1/d11/a1 to d2/d21/a1 (glob)
+ $ hg status -C
+ A d2/d21/a
+ d1/a
+ A d2/d21/a1
+ d1/d11/a1
+ R d1/a
+ R d1/d11/a1
+ $ hg update -C
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d2/d21
+
+attempt to overwrite an existing file
+
+ $ echo "ca" > d1/ca
+ $ hg rename d1/ba d1/ca
+ d1/ca: not overwriting - file exists
+ $ hg status -C
+ ? d1/ca
+ $ hg update -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+forced overwrite of an existing file
+
+ $ echo "ca" > d1/ca
+ $ hg rename --force d1/ba d1/ca
+ $ hg status -C
+ A d1/ca
+ d1/ba
+ R d1/ba
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/ca
+
+attempt to overwrite an existing broken symlink
+
+#if symlink
+ $ ln -s ba d1/ca
+ $ hg rename --traceback d1/ba d1/ca
+ d1/ca: not overwriting - file exists
+ $ hg status -C
+ ? d1/ca
+ $ hg update -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/ca
+
+replace a symlink with a file
+
+ $ ln -s ba d1/ca
+ $ hg rename --force d1/ba d1/ca
+ $ hg status -C
+ A d1/ca
+ d1/ba
+ R d1/ba
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/ca
+#endif
+
+do not copy more than one source file to the same destination file
+
+ $ mkdir d3
+ $ hg rename d1/* d2/* d3
+ moving d1/d11/a1 to d3/d11/a1 (glob)
+ d3/b: not overwriting - d2/b collides with d1/b
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/b
+ d1/b
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move a whole subtree with "hg rename ."
+
+ $ mkdir d3
+ $ (cd d1; hg rename . ../d3)
+ moving a to ../d3/d1/a
+ moving b to ../d3/d1/b
+ moving ba to ../d3/d1/ba
+ moving d11/a1 to ../d3/d1/d11/a1 (glob)
+ $ hg status -C
+ A d3/d1/a
+ d1/a
+ A d3/d1/b
+ d1/b
+ A d3/d1/ba
+ d1/ba
+ A d3/d1/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move a whole subtree with "hg rename --after ."
+
+ $ mkdir d3
+ $ mv d1/* d3
+ $ (cd d1; hg rename --after . ../d3)
+ moving a to ../d3/a
+ moving b to ../d3/b
+ moving ba to ../d3/ba
+ moving d11/a1 to ../d3/d11/a1 (glob)
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/b
+ d1/b
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+move the parent tree with "hg rename .."
+
+ $ (cd d1/d11; hg rename .. ../../d3)
+ moving ../a to ../../d3/a (glob)
+ moving ../b to ../../d3/b (glob)
+ moving ../ba to ../../d3/ba (glob)
+ moving a1 to ../../d3/d11/a1
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/b
+ d1/b
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+skip removed files
+
+ $ hg remove d1/b
+ $ hg rename d1 d3
+ moving d1/a to d3/a (glob)
+ moving d1/ba to d3/ba (glob)
+ moving d1/d11/a1 to d3/d11/a1 (glob)
+ $ hg status -C
+ A d3/a
+ d1/a
+ A d3/ba
+ d1/ba
+ A d3/d11/a1
+ d1/d11/a1
+ R d1/a
+ R d1/b
+ R d1/ba
+ R d1/d11/a1
+ $ hg update -C
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf d3
+
+transitive rename
+
+ $ hg rename d1/b d1/bb
+ $ hg rename d1/bb d1/bc
+ $ hg status -C
+ A d1/bc
+ d1/b
+ R d1/b
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/bc
+
+transitive rename --after
+
+ $ hg rename d1/b d1/bb
+ $ mv d1/bb d1/bc
+ $ hg rename --after d1/bb d1/bc
+ $ hg status -C
+ A d1/bc
+ d1/b
+ R d1/b
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm d1/bc
+
+ $ echo "# idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)"
+ # idempotent renames (d1/b -> d1/bb followed by d1/bb -> d1/b)
+ $ hg rename d1/b d1/bb
+ $ echo "some stuff added to d1/bb" >> d1/bb
+ $ hg rename d1/bb d1/b
+ $ hg status -C
+ M d1/b
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+overwriting with renames (issue1959)
+
+ $ hg rename d1/a d1/c
+ $ hg rename d1/b d1/a
+ $ hg status -C
+ A d1/a
+ d1/b
+ A d1/c
+ d1/a
+ R d1/b
+ $ hg diff --git
+ diff --git a/d1/b b/d1/a
+ rename from d1/b
+ rename to d1/a
+ diff --git a/d1/a b/d1/c
+ copy from d1/a
+ copy to d1/c
+ $ hg update -C
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+check illegal path components
+
+ $ hg rename d1/d11/a1 .hg/foo
+ abort: path contains illegal component: .hg/foo (glob)
+ [255]
+ $ hg status -C
+ $ hg rename d1/d11/a1 ../foo
+ abort: ../foo not under root
+ [255]
+ $ hg status -C
+
+ $ mv d1/d11/a1 .hg/foo
+ $ hg rename --after d1/d11/a1 .hg/foo
+ abort: path contains illegal component: .hg/foo (glob)
+ [255]
+ $ hg status -C
+ ! d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm .hg/foo
+
+ $ hg rename d1/d11/a1 .hg
+ abort: path contains illegal component: .hg/a1 (glob)
+ [255]
+ $ hg status -C
+ $ hg rename d1/d11/a1 ..
+ abort: ../a1 not under root (glob)
+ [255]
+ $ hg status -C
+
+ $ mv d1/d11/a1 .hg
+ $ hg rename --after d1/d11/a1 .hg
+ abort: path contains illegal component: .hg/a1 (glob)
+ [255]
+ $ hg status -C
+ ! d1/d11/a1
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm .hg/a1
+
+ $ (cd d1/d11; hg rename ../../d2/b ../../.hg/foo)
+ abort: path contains illegal component: .hg/foo (glob)
+ [255]
+ $ hg status -C
+ $ (cd d1/d11; hg rename ../../d2/b ../../../foo)
+ abort: ../../../foo not under root
+ [255]
+ $ hg status -C
+
diff --git a/tests/test-repair-strip.t b/tests/test-repair-strip.t
new file mode 100644
index 0000000..6393ea2
--- /dev/null
+++ b/tests/test-repair-strip.t
@@ -0,0 +1,132 @@
+ $ "$TESTDIR/hghave" unix-permissions || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "mq=">> $HGRCPATH
+
+ $ teststrip() {
+ > hg -q up -C $1
+ > echo % before update $1, strip $2
+ > hg parents
+ > chmod -$3 $4
+ > hg strip $2 2>&1 | sed 's/\(bundle\).*/\1/' | sed 's/Permission denied.*\.hg\/store\/\(.*\)/Permission denied \.hg\/store\/\1/'
+ > echo % after update $1, strip $2
+ > chmod +$3 $4
+ > hg verify
+ > echo % journal contents
+ > if [ -f .hg/store/journal ]; then
+ > sed -e 's/\.i[^\n]*/\.i/' .hg/store/journal
+ > else
+ > echo "(no journal)"
+ > fi
+ > ls .hg/store/journal >/dev/null 2>&1 && hg recover
+ > ls .hg/strip-backup/* >/dev/null 2>&1 && hg unbundle -q .hg/strip-backup/*
+ > rm -rf .hg/strip-backup
+ > }
+
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg -q ci -m "a" -A
+ $ echo b > b
+ $ hg -q ci -m "b" -A
+ $ echo b2 >> b
+ $ hg -q ci -m "b2" -A
+ $ echo c > c
+ $ hg -q ci -m "c" -A
+ $ teststrip 0 2 w .hg/store/data/b.i
+ % before update 0, strip 2
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ saved backup bundle
+ transaction abort!
+ failed to truncate data/b.i
+ rollback failed - please run hg recover
+ strip failed, full bundle
+ abort: Permission denied .hg/store/data/b.i
+ % after update 0, strip 2
+ abandoned transaction found - run hg recover
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ b@?: rev 1 points to nonexistent changeset 2
+ (expected 1)
+ b@?: 736c29771fba not in manifests
+ warning: orphan revlog 'data/c.i'
+ 2 files, 2 changesets, 3 total revisions
+ 2 warnings encountered!
+ 2 integrity errors encountered!
+ % journal contents
+ 00changelog.i
+ 00manifest.i
+ data/b.i
+ data/c.i
+ rolling back interrupted transaction
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+ $ teststrip 0 2 r .hg/store/data/b.i
+ % before update 0, strip 2
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ abort: Permission denied .hg/store/data/b.i
+ % after update 0, strip 2
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 4 changesets, 4 total revisions
+ % journal contents
+ (no journal)
+ $ teststrip 0 2 w .hg/store/00manifest.i
+ % before update 0, strip 2
+ changeset: 0:cb9a9f314b8b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ saved backup bundle
+ transaction abort!
+ failed to truncate 00manifest.i
+ rollback failed - please run hg recover
+ strip failed, full bundle
+ abort: Permission denied .hg/store/00manifest.i
+ % after update 0, strip 2
+ abandoned transaction found - run hg recover
+ checking changesets
+ checking manifests
+ manifest@?: rev 2 points to nonexistent changeset 2
+ manifest@?: 3362547cdf64 not in changesets
+ manifest@?: rev 3 points to nonexistent changeset 3
+ manifest@?: 265a85892ecb not in changesets
+ crosschecking files in changesets and manifests
+ c@3: in manifest but not in changeset
+ checking files
+ b@?: rev 1 points to nonexistent changeset 2
+ (expected 1)
+ c@?: rev 0 points to nonexistent changeset 3
+ 3 files, 2 changesets, 4 total revisions
+ 1 warnings encountered!
+ 7 integrity errors encountered!
+ (first damaged changeset appears to be 3)
+ % journal contents
+ 00changelog.i
+ 00manifest.i
+ data/b.i
+ data/c.i
+ rolling back interrupted transaction
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+
+ $ cd ..
diff --git a/tests/test-requires.t b/tests/test-requires.t
new file mode 100644
index 0000000..ff3427d
--- /dev/null
+++ b/tests/test-requires.t
@@ -0,0 +1,19 @@
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m test
+ $ rm .hg/requires
+ $ hg tip
+ abort: index 00changelog.i unknown format 2!
+ [255]
+ $ echo indoor-pool > .hg/requires
+ $ hg tip
+ abort: unknown repository format: requires features 'indoor-pool' (upgrade Mercurial)!
+ [255]
+ $ echo outdoor-pool >> .hg/requires
+ $ hg tip
+ abort: unknown repository format: requires features 'indoor-pool', 'outdoor-pool' (upgrade Mercurial)!
+ [255]
+
+ $ cd ..
diff --git a/tests/test-resolve.t b/tests/test-resolve.t
new file mode 100644
index 0000000..86dc9ea
--- /dev/null
+++ b/tests/test-resolve.t
@@ -0,0 +1,46 @@
+test that a commit clears the merge state.
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo foo > file
+ $ hg commit -Am 'add file'
+ adding file
+
+ $ echo bar >> file
+ $ hg commit -Am 'append bar'
+
+
+create a second head
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo baz >> file
+ $ hg commit -Am 'append baz'
+ created new head
+
+failing merge
+
+ $ hg merge --tool=internal:fail
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+
+ $ echo resolved > file
+ $ hg resolve -m file
+ $ hg commit -m 'resolved'
+
+resolve -l, should be empty
+
+ $ hg resolve -l
+
+test crashed merge with empty mergestate
+
+ $ mkdir .hg/merge
+ $ touch .hg/merge/state
+
+resolve -l, should be empty
+
+ $ hg resolve -l
+
+ $ cd ..
diff --git a/tests/test-revert-flags.t b/tests/test-revert-flags.t
new file mode 100644
index 0000000..890e590
--- /dev/null
+++ b/tests/test-revert-flags.t
@@ -0,0 +1,23 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ hg init repo
+ $ cd repo
+ $ echo foo > foo
+ $ chmod 644 foo
+ $ hg ci -qAm '644'
+
+ $ chmod 755 foo
+ $ hg ci -qAm '755'
+
+reverting to rev 0
+
+ $ hg revert -a -r 0
+ reverting foo
+ $ hg st
+ M foo
+ $ hg diff --git
+ diff --git a/foo b/foo
+ old mode 100755
+ new mode 100644
+
+ $ cd ..
diff --git a/tests/test-revert-unknown.t b/tests/test-revert-unknown.t
new file mode 100644
index 0000000..67eb717
--- /dev/null
+++ b/tests/test-revert-unknown.t
@@ -0,0 +1,29 @@
+ $ hg init
+ $ touch unknown
+
+ $ touch a
+ $ hg add a
+ $ hg ci -m "1"
+
+ $ touch b
+ $ hg add b
+ $ hg ci -m "2"
+
+Should show unknown
+
+ $ hg status
+ ? unknown
+ $ hg revert -r 0 --all
+ removing b
+
+Should show unknown and b removed
+
+ $ hg status
+ R b
+ ? unknown
+
+Should show a and unknown
+
+ $ ls
+ a
+ unknown
diff --git a/tests/test-revert.t b/tests/test-revert.t
new file mode 100644
index 0000000..c2b085f
--- /dev/null
+++ b/tests/test-revert.t
@@ -0,0 +1,278 @@
+ $ hg init repo
+ $ cd repo
+ $ echo 123 > a
+ $ echo 123 > c
+ $ echo 123 > e
+ $ hg add a c e
+ $ hg commit -m "first" a c e
+
+nothing changed
+
+ $ hg revert
+ abort: no files or directories specified
+ (use --all to revert all files)
+ [255]
+ $ hg revert --all
+
+ $ echo 123 > b
+
+should show b unknown
+
+ $ hg status
+ ? b
+ $ echo 12 > c
+
+should show b unknown and c modified
+
+ $ hg status
+ M c
+ ? b
+ $ hg add b
+
+should show b added and c modified
+
+ $ hg status
+ M c
+ A b
+ $ hg rm a
+
+should show a removed, b added and c modified
+
+ $ hg status
+ M c
+ A b
+ R a
+ $ hg revert a
+
+should show b added, copy saved, and c modified
+
+ $ hg status
+ M c
+ A b
+ $ hg revert b
+
+should show b unknown, and c modified
+
+ $ hg status
+ M c
+ ? b
+ $ hg revert --no-backup c
+
+should show unknown: b
+
+ $ hg status
+ ? b
+ $ hg add b
+
+should show b added
+
+ $ hg status b
+ A b
+ $ rm b
+
+should show b deleted
+
+ $ hg status b
+ ! b
+ $ hg revert -v b
+ forgetting b
+
+should not find b
+
+ $ hg status b
+ b: * (glob)
+
+should show a c e
+
+ $ ls
+ a
+ c
+ e
+
+should verbosely save backup to e.orig
+
+ $ echo z > e
+ $ hg revert --all -v
+ saving current version of e as e.orig
+ reverting e
+
+should say no changes needed
+
+ $ hg revert a
+ no changes needed to a
+
+should say file not managed
+
+ $ echo q > q
+ $ hg revert q
+ file not managed: q
+ $ rm q
+
+should say file not found
+
+ $ hg revert notfound
+ notfound: no such file in rev 334a9e57682c
+ $ touch d
+ $ hg add d
+ $ hg rm a
+ $ hg commit -m "second"
+ $ echo z > z
+ $ hg add z
+ $ hg st
+ A z
+ ? e.orig
+
+should add a, remove d, forget z
+
+ $ hg revert --all -r0
+ adding a
+ removing d
+ forgetting z
+
+should forget a, undelete d
+
+ $ hg revert --all -rtip
+ forgetting a
+ undeleting d
+ $ rm a *.orig
+
+should silently add a
+
+ $ hg revert -r0 a
+ $ hg st a
+ A a
+ $ hg rm d
+ $ hg st d
+ R d
+
+should silently keep d removed
+
+ $ hg revert -r0 d
+ $ hg st d
+ R d
+
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+#if execbit
+ $ chmod +x c
+ $ hg revert --all
+ reverting c
+
+should print non-executable
+
+ $ test -x c || echo non-executable
+ non-executable
+
+ $ chmod +x c
+ $ hg commit -m exe
+
+ $ chmod -x c
+ $ hg revert --all
+ reverting c
+
+should print executable
+
+ $ test -x c && echo executable
+ executable
+#endif
+
+ $ cd ..
+
+
+Issue241: update and revert produces inconsistent repositories
+
+ $ hg init a
+ $ cd a
+ $ echo a >> a
+ $ hg commit -A -d '1 0' -m a
+ adding a
+ $ echo a >> a
+ $ hg commit -d '2 0' -m a
+ $ hg update 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkdir b
+ $ echo b > b/b
+
+should fail - no arguments
+
+ $ hg revert -rtip
+ abort: no files or directories specified
+ (use --all to revert all files, or 'hg update 1' to update)
+ [255]
+
+should succeed
+
+ $ hg revert --all -rtip
+ reverting a
+
+
+Issue332: confusing message when reverting directory
+
+ $ hg ci -A -m b
+ adding b/b
+ created new head
+ $ echo foobar > b/b
+ $ mkdir newdir
+ $ echo foo > newdir/newfile
+ $ hg add newdir/newfile
+ $ hg revert b newdir
+ reverting b/b (glob)
+ forgetting newdir/newfile (glob)
+ $ echo foobar > b/b
+ $ hg revert .
+ reverting b/b (glob)
+
+
+reverting a rename target should revert the source
+
+ $ hg mv a newa
+ $ hg revert newa
+ $ hg st a newa
+ ? newa
+
+ $ cd ..
+
+ $ hg init ignored
+ $ cd ignored
+ $ echo '^ignored$' > .hgignore
+ $ echo '^ignoreddir$' >> .hgignore
+ $ echo '^removed$' >> .hgignore
+
+ $ mkdir ignoreddir
+ $ touch ignoreddir/file
+ $ touch ignoreddir/removed
+ $ touch ignored
+ $ touch removed
+
+4 ignored files (we will add/commit everything)
+
+ $ hg st -A -X .hgignore
+ I ignored
+ I ignoreddir/file
+ I ignoreddir/removed
+ I removed
+ $ hg ci -qAm 'add files' ignored ignoreddir/file ignoreddir/removed removed
+
+ $ echo >> ignored
+ $ echo >> ignoreddir/file
+ $ hg rm removed ignoreddir/removed
+
+should revert ignored* and undelete *removed
+
+ $ hg revert -a --no-backup
+ reverting ignored
+ reverting ignoreddir/file (glob)
+ undeleting ignoreddir/removed (glob)
+ undeleting removed
+ $ hg st -mardi
+
+ $ hg up -qC
+ $ echo >> ignored
+ $ hg rm removed
+
+should silently revert the named files
+
+ $ hg revert --no-backup ignored removed
+ $ hg st -mardi
+
+ $ cd ..
diff --git a/tests/test-revlog-ancestry.py b/tests/test-revlog-ancestry.py
new file mode 100644
index 0000000..0834646
--- /dev/null
+++ b/tests/test-revlog-ancestry.py
@@ -0,0 +1,77 @@
+import os
+from mercurial import hg, ui, merge
+
+u = ui.ui()
+
+repo = hg.repository(u, 'test1', create=1)
+os.chdir('test1')
+
+def commit(text, time):
+ repo.commit(text=text, date="%d 0" % time)
+
+def addcommit(name, time):
+ f = open(name, 'w')
+ f.write('%s\n' % name)
+ f.close()
+ repo[None].add([name])
+ commit(name, time)
+
+def update(rev):
+ merge.update(repo, rev, False, True, False)
+
+def merge_(rev):
+ merge.update(repo, rev, True, False, False)
+
+if __name__ == '__main__':
+ addcommit("A", 0)
+ addcommit("B", 1)
+
+ update(0)
+ addcommit("C", 2)
+
+ merge_(1)
+ commit("D", 3)
+
+ update(2)
+ addcommit("E", 4)
+ addcommit("F", 5)
+
+ update(3)
+ addcommit("G", 6)
+
+ merge_(5)
+ commit("H", 7)
+
+ update(5)
+ addcommit("I", 8)
+
+ # Ancestors
+ print 'Ancestors of 5'
+ for r in repo.changelog.ancestors([5]):
+ print r,
+
+ print '\nAncestors of 6 and 5'
+ for r in repo.changelog.ancestors([6, 5]):
+ print r,
+
+ print '\nAncestors of 5 and 4'
+ for r in repo.changelog.ancestors([5, 4]):
+ print r,
+
+ print '\nAncestors of 7, stop at 6'
+ for r in repo.changelog.ancestors([7], 6):
+ print r,
+
+ # Descendants
+ print '\n\nDescendants of 5'
+ for r in repo.changelog.descendants([5]):
+ print r,
+
+ print '\nDescendants of 5 and 3'
+ for r in repo.changelog.descendants([5, 3]):
+ print r,
+
+ print '\nDescendants of 5 and 4'
+ for r in repo.changelog.descendants([5, 4]):
+ print r,
+
diff --git a/tests/test-revlog-ancestry.py.out b/tests/test-revlog-ancestry.py.out
new file mode 100644
index 0000000..d5c167a
--- /dev/null
+++ b/tests/test-revlog-ancestry.py.out
@@ -0,0 +1,15 @@
+Ancestors of 5
+4 2 0
+Ancestors of 6 and 5
+3 4 2 1 0
+Ancestors of 5 and 4
+4 2 0
+Ancestors of 7, stop at 6
+6
+
+Descendants of 5
+7 8
+Descendants of 5 and 3
+6 7 8
+Descendants of 5 and 4
+5 7 8
diff --git a/tests/test-revlog-group-emptyiter.t b/tests/test-revlog-group-emptyiter.t
new file mode 100644
index 0000000..905a6e0
--- /dev/null
+++ b/tests/test-revlog-group-emptyiter.t
@@ -0,0 +1,35 @@
+Issue1678: IndexError when pushing
+
+setting up base repo
+ $ hg init a
+ $ cd a
+ $ touch a
+ $ hg ci -Am a
+ adding a
+ $ cd ..
+
+cloning base repo
+ $ hg clone a b
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd b
+
+setting up cset to push
+ $ hg up null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ touch a
+different msg so we get a clog new entry
+ $ hg ci -Am b
+ adding a
+ created new head
+
+pushing
+ $ hg push -f ../a
+ pushing to ../a
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+
+ $ cd ..
diff --git a/tests/test-revlog-packentry.t b/tests/test-revlog-packentry.t
new file mode 100644
index 0000000..4bcb3f9
--- /dev/null
+++ b/tests/test-revlog-packentry.t
@@ -0,0 +1,23 @@
+ $ hg init repo
+ $ cd repo
+
+ $ touch foo
+ $ hg ci -Am 'add foo'
+ adding foo
+
+ $ hg up -C null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+this should be stored as a delta against rev 0
+
+ $ echo foo bar baz > foo
+ $ hg ci -Am 'add foo again'
+ adding foo
+ created new head
+
+ $ hg debugindex foo
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
+ 1 0 24 ..... 1 0376abec49b8 000000000000 000000000000 (re)
+
+ $ cd ..
diff --git a/tests/test-revset-dirstate-parents.t b/tests/test-revset-dirstate-parents.t
new file mode 100644
index 0000000..0582bc7
--- /dev/null
+++ b/tests/test-revset-dirstate-parents.t
@@ -0,0 +1,60 @@
+ $ HGENCODING=utf-8
+ $ export HGENCODING
+
+ $ try() {
+ > hg debugrevspec --debug $@
+ > }
+
+ $ log() {
+ > hg log --template '{rev}\n' -r "$1"
+ > }
+
+ $ hg init repo
+ $ cd repo
+
+ $ try 'p1()'
+ (func
+ ('symbol', 'p1')
+ None)
+ $ try 'p2()'
+ (func
+ ('symbol', 'p2')
+ None)
+ $ try 'parents()'
+ (func
+ ('symbol', 'parents')
+ None)
+
+null revision
+ $ log 'p1()'
+ $ log 'p2()'
+ $ log 'parents()'
+
+working dir with a single parent
+ $ echo a > a
+ $ hg ci -Aqm0
+ $ log 'p1()'
+ 0
+ $ log 'tag() and p1()'
+ $ log 'p2()'
+ $ log 'parents()'
+ 0
+ $ log 'tag() and parents()'
+
+merge in progress
+ $ echo b > b
+ $ hg ci -Aqm1
+ $ hg up -q 0
+ $ echo c > c
+ $ hg ci -Aqm2
+ $ hg merge -q
+ $ log 'p1()'
+ 2
+ $ log 'p2()'
+ 1
+ $ log 'tag() and p2()'
+ $ log 'parents()'
+ 1
+ 2
+
+ $ cd ..
diff --git a/tests/test-revset-outgoing.t b/tests/test-revset-outgoing.t
new file mode 100644
index 0000000..18d36f2
--- /dev/null
+++ b/tests/test-revset-outgoing.t
@@ -0,0 +1,94 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > graphlog=
+ >
+ > [alias]
+ > tlog = log --template "{rev}:{node|short}: '{desc}' {branches}\n"
+ > tglog = tlog -G
+ > tout = out --template "{rev}:{node|short}: '{desc}' {branches}\n"
+ > EOF
+
+ $ hg init a
+ $ cd a
+
+ $ echo a > a
+ $ hg ci -Aqm0
+
+ $ echo foo >> a
+ $ hg ci -Aqm1
+
+ $ hg up -q 0
+
+ $ hg branch stable
+ marked working directory as branch stable
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo bar >> a
+ $ hg ci -qm2
+
+ $ hg tglog
+ @ 2:7bee6c3bea3a: '2' stable
+ |
+ | o 1:3560197d8331: '1'
+ |/
+ o 0:f7b1eb17ad24: '0'
+
+
+ $ cd ..
+
+ $ hg clone -q a#stable b
+
+ $ cd b
+ $ cat .hg/hgrc
+ [paths]
+ default = $TESTTMP/a#stable (glob)
+
+ $ echo red >> a
+ $ hg ci -qm3
+
+ $ hg up -q default
+
+ $ echo blue >> a
+ $ hg ci -qm4
+
+ $ hg tglog
+ @ 3:f0461977a3db: '4'
+ |
+ | o 2:1d4099801a4e: '3' stable
+ | |
+ | o 1:7bee6c3bea3a: '2' stable
+ |/
+ o 0:f7b1eb17ad24: '0'
+
+
+ $ hg tout
+ comparing with $TESTTMP/a (glob)
+ searching for changes
+ 2:1d4099801a4e: '3' stable
+
+ $ hg tlog -r 'outgoing()'
+ 2:1d4099801a4e: '3' stable
+
+ $ hg tout ../a#default
+ comparing with ../a
+ searching for changes
+ 3:f0461977a3db: '4'
+
+ $ hg tlog -r 'outgoing("../a#default")'
+ 3:f0461977a3db: '4'
+
+ $ echo "green = ../a#default" >> .hg/hgrc
+
+ $ cat .hg/hgrc
+ [paths]
+ default = $TESTTMP/a#stable (glob)
+ green = ../a#default
+
+ $ hg tout green
+ comparing with $TESTTMP/a (glob)
+ searching for changes
+ 3:f0461977a3db: '4'
+
+ $ hg tlog -r 'outgoing("green")'
+ 3:f0461977a3db: '4'
+
+ $ cd ..
diff --git a/tests/test-revset.t b/tests/test-revset.t
new file mode 100644
index 0000000..2a41901
--- /dev/null
+++ b/tests/test-revset.t
@@ -0,0 +1,817 @@
+ $ HGENCODING=utf-8
+ $ export HGENCODING
+
+ $ try() {
+ > hg debugrevspec --debug "$@"
+ > }
+
+ $ log() {
+ > hg log --template '{rev}\n' -r "$1"
+ > }
+
+ $ hg init repo
+ $ cd repo
+
+ $ echo a > a
+ $ hg branch a
+ marked working directory as branch a
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm0
+
+ $ echo b > b
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm1
+
+ $ rm a
+ $ hg branch a-b-c-
+ marked working directory as branch a-b-c-
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm2 -u Bob
+
+ $ hg log -r "extra('branch', 'a-b-c-')" --template '{rev}\n'
+ 2
+ $ hg log -r "extra('branch')" --template '{rev}\n'
+ 0
+ 1
+ 2
+ $ hg log -r "extra('branch', 're:a')" --template '{rev} {branch}\n'
+ 0 a
+ 2 a-b-c-
+
+ $ hg co 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch +a+b+c+
+ marked working directory as branch +a+b+c+
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm3
+
+ $ hg co 2 # interleave
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo bb > b
+ $ hg branch -- -a-b-c-
+ marked working directory as branch -a-b-c-
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm4 -d "May 12 2005"
+
+ $ hg co 3
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch !a/b/c/
+ marked working directory as branch !a/b/c/
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm"5 bug"
+
+ $ hg merge 4
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg branch _a_b_c_
+ marked working directory as branch _a_b_c_
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm"6 issue619"
+
+ $ hg branch .a.b.c.
+ marked working directory as branch .a.b.c.
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm7
+
+ $ hg branch all
+ marked working directory as branch all
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci --close-branch -Aqm8
+ abort: can only close branch heads
+ [255]
+
+ $ hg co 4
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg branch é
+ marked working directory as branch \xc3\xa9 (esc)
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -Aqm9
+
+ $ hg tag -r6 1.0
+
+ $ hg clone --quiet -U -r 7 . ../remote1
+ $ hg clone --quiet -U -r 8 . ../remote2
+ $ echo "[paths]" >> .hg/hgrc
+ $ echo "default = ../remote1" >> .hg/hgrc
+
+names that should work without quoting
+
+ $ try a
+ ('symbol', 'a')
+ 0
+ $ try b-a
+ (minus
+ ('symbol', 'b')
+ ('symbol', 'a'))
+ 1
+ $ try _a_b_c_
+ ('symbol', '_a_b_c_')
+ 6
+ $ try _a_b_c_-a
+ (minus
+ ('symbol', '_a_b_c_')
+ ('symbol', 'a'))
+ 6
+ $ try .a.b.c.
+ ('symbol', '.a.b.c.')
+ 7
+ $ try .a.b.c.-a
+ (minus
+ ('symbol', '.a.b.c.')
+ ('symbol', 'a'))
+ 7
+ $ try -- '-a-b-c-' # complains
+ hg: parse error at 7: not a prefix: end
+ [255]
+ $ log -a-b-c- # succeeds with fallback
+ 4
+ $ try -- -a-b-c--a # complains
+ (minus
+ (minus
+ (minus
+ (negate
+ ('symbol', 'a'))
+ ('symbol', 'b'))
+ ('symbol', 'c'))
+ (negate
+ ('symbol', 'a')))
+ abort: unknown revision '-a'!
+ [255]
+ $ try é
+ ('symbol', '\xc3\xa9')
+ 9
+
+quoting needed
+
+ $ try '"-a-b-c-"-a'
+ (minus
+ ('string', '-a-b-c-')
+ ('symbol', 'a'))
+ 4
+
+ $ log '1 or 2'
+ 1
+ 2
+ $ log '1|2'
+ 1
+ 2
+ $ log '1 and 2'
+ $ log '1&2'
+ $ try '1&2|3' # precedence - and is higher
+ (or
+ (and
+ ('symbol', '1')
+ ('symbol', '2'))
+ ('symbol', '3'))
+ 3
+ $ try '1|2&3'
+ (or
+ ('symbol', '1')
+ (and
+ ('symbol', '2')
+ ('symbol', '3')))
+ 1
+ $ try '1&2&3' # associativity
+ (and
+ (and
+ ('symbol', '1')
+ ('symbol', '2'))
+ ('symbol', '3'))
+ $ try '1|(2|3)'
+ (or
+ ('symbol', '1')
+ (group
+ (or
+ ('symbol', '2')
+ ('symbol', '3'))))
+ 1
+ 2
+ 3
+ $ log '1.0' # tag
+ 6
+ $ log 'a' # branch
+ 0
+ $ log '2785f51ee'
+ 0
+ $ log 'date(2005)'
+ 4
+ $ log 'date(this is a test)'
+ hg: parse error at 10: unexpected token: symbol
+ [255]
+ $ log 'date()'
+ hg: parse error: date requires a string
+ [255]
+ $ log 'date'
+ hg: parse error: can't use date here
+ [255]
+ $ log 'date('
+ hg: parse error at 5: not a prefix: end
+ [255]
+ $ log 'date(tip)'
+ abort: invalid date: 'tip'
+ [255]
+ $ log '"date"'
+ abort: unknown revision 'date'!
+ [255]
+ $ log 'date(2005) and 1::'
+ 4
+
+ $ log 'ancestor(1)'
+ hg: parse error: ancestor requires two arguments
+ [255]
+ $ log 'ancestor(4,5)'
+ 1
+ $ log 'ancestor(4,5) and 4'
+ $ log 'ancestors(5)'
+ 0
+ 1
+ 3
+ 5
+ $ log 'author(bob)'
+ 2
+ $ log 'author("re:bob|test")'
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ $ log 'branch(é)'
+ 8
+ 9
+ $ log 'branch(a)'
+ 0
+ $ hg log -r 'branch("re:a")' --template '{rev} {branch}\n'
+ 0 a
+ 2 a-b-c-
+ 3 +a+b+c+
+ 4 -a-b-c-
+ 5 !a/b/c/
+ 6 _a_b_c_
+ 7 .a.b.c.
+ $ log 'children(ancestor(4,5))'
+ 2
+ 3
+ $ log 'closed()'
+ $ log 'contains(a)'
+ 0
+ 1
+ 3
+ 5
+ $ log 'desc(B)'
+ 5
+ $ log 'descendants(2 or 3)'
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ $ log 'file("b*")'
+ 1
+ 4
+ $ log 'follow()'
+ 0
+ 1
+ 2
+ 4
+ 8
+ 9
+ $ log 'grep("issue\d+")'
+ 6
+ $ try 'grep("(")' # invalid regular expression
+ (func
+ ('symbol', 'grep')
+ ('string', '('))
+ hg: parse error: invalid match pattern: unbalanced parenthesis
+ [255]
+ $ try 'grep("\bissue\d+")'
+ (func
+ ('symbol', 'grep')
+ ('string', '\x08issue\\d+'))
+ $ try 'grep(r"\bissue\d+")'
+ (func
+ ('symbol', 'grep')
+ ('string', '\\bissue\\d+'))
+ 6
+ $ try 'grep(r"\")'
+ hg: parse error at 7: unterminated string
+ [255]
+ $ log 'head()'
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 9
+ $ log 'heads(6::)'
+ 7
+ $ log 'keyword(issue)'
+ 6
+ $ log 'limit(head(), 1)'
+ 0
+ $ log 'matching(6)'
+ 6
+ $ log 'matching(6:7, "phase parents user date branch summary files description substate")'
+ 6
+ 7
+ $ log 'max(contains(a))'
+ 5
+ $ log 'min(contains(a))'
+ 0
+ $ log 'merge()'
+ 6
+ $ log 'modifies(b)'
+ 4
+ $ log 'modifies("path:b")'
+ 4
+ $ log 'modifies("*")'
+ 4
+ 6
+ $ log 'modifies("set:modified()")'
+ 4
+ $ log 'id(5)'
+ 2
+ $ log 'outgoing()'
+ 8
+ 9
+ $ log 'outgoing("../remote1")'
+ 8
+ 9
+ $ log 'outgoing("../remote2")'
+ 3
+ 5
+ 6
+ 7
+ 9
+ $ log 'p1(merge())'
+ 5
+ $ log 'p2(merge())'
+ 4
+ $ log 'parents(merge())'
+ 4
+ 5
+ $ log 'removes(a)'
+ 2
+ 6
+ $ log 'roots(all())'
+ 0
+ $ log 'reverse(2 or 3 or 4 or 5)'
+ 5
+ 4
+ 3
+ 2
+ $ log 'reverse(all())'
+ 9
+ 8
+ 7
+ 6
+ 5
+ 4
+ 3
+ 2
+ 1
+ 0
+ $ log 'rev(5)'
+ 5
+ $ log 'sort(limit(reverse(all()), 3))'
+ 7
+ 8
+ 9
+ $ log 'sort(2 or 3 or 4 or 5, date)'
+ 2
+ 3
+ 5
+ 4
+ $ log 'tagged()'
+ 6
+ $ log 'tag()'
+ 6
+ $ log 'tag(1.0)'
+ 6
+ $ log 'tag(tip)'
+ 9
+
+we can use patterns when searching for tags
+
+ $ log 'tag("1..*")'
+ abort: tag '1..*' does not exist
+ [255]
+ $ log 'tag("re:1..*")'
+ 6
+ $ log 'tag("re:[0-9].[0-9]")'
+ 6
+ $ log 'tag("literal:1.0")'
+ 6
+ $ log 'tag("re:0..*")'
+ abort: no tags exist that match '0..*'
+ [255]
+
+ $ log 'tag(unknown)'
+ abort: tag 'unknown' does not exist
+ [255]
+ $ log 'branch(unknown)'
+ abort: unknown revision 'unknown'!
+ [255]
+ $ log 'user(bob)'
+ 2
+
+ $ log '4::8'
+ 4
+ 8
+ $ log '4:8'
+ 4
+ 5
+ 6
+ 7
+ 8
+
+ $ log 'sort(!merge() & (modifies(b) | user(bob) | keyword(bug) | keyword(issue) & 1::9), "-date")'
+ 4
+ 2
+ 5
+
+ $ log 'not 0 and 0:2'
+ 1
+ 2
+ $ log 'not 1 and 0:2'
+ 0
+ 2
+ $ log 'not 2 and 0:2'
+ 0
+ 1
+ $ log '(1 and 2)::'
+ $ log '(1 and 2):'
+ $ log '(1 and 2):3'
+ $ log 'sort(head(), -rev)'
+ 9
+ 7
+ 6
+ 5
+ 4
+ 3
+ 2
+ 1
+ 0
+ $ log '4::8 - 8'
+ 4
+ $ log 'matching(1 or 2 or 3) and (2 or 3 or 1)'
+ 2
+ 3
+ 1
+
+issue2437
+
+ $ log '3 and p1(5)'
+ 3
+ $ log '4 and p2(6)'
+ 4
+ $ log '1 and parents(:2)'
+ 1
+ $ log '2 and children(1:)'
+ 2
+ $ log 'roots(all()) or roots(all())'
+ 0
+ $ hg debugrevspec 'roots(all()) or roots(all())'
+ 0
+ $ log 'heads(branch(é)) or heads(branch(é))'
+ 9
+ $ log 'ancestors(8) and (heads(branch("-a-b-c-")) or heads(branch(é)))'
+ 4
+
+issue2654: report a parse error if the revset was not completely parsed
+
+ $ log '1 OR 2'
+ hg: parse error at 2: invalid token
+ [255]
+
+or operator should preserve ordering:
+ $ log 'reverse(2::4) or tip'
+ 4
+ 2
+ 9
+
+parentrevspec
+
+ $ log 'merge()^0'
+ 6
+ $ log 'merge()^'
+ 5
+ $ log 'merge()^1'
+ 5
+ $ log 'merge()^2'
+ 4
+ $ log 'merge()^^'
+ 3
+ $ log 'merge()^1^'
+ 3
+ $ log 'merge()^^^'
+ 1
+
+ $ log 'merge()~0'
+ 6
+ $ log 'merge()~1'
+ 5
+ $ log 'merge()~2'
+ 3
+ $ log 'merge()~2^1'
+ 1
+ $ log 'merge()~3'
+ 1
+
+ $ log '(-3:tip)^'
+ 4
+ 6
+ 8
+
+ $ log 'tip^foo'
+ hg: parse error: ^ expects a number 0, 1, or 2
+ [255]
+
+aliases:
+
+ $ echo '[revsetalias]' >> .hg/hgrc
+ $ echo 'm = merge()' >> .hg/hgrc
+ $ echo 'sincem = descendants(m)' >> .hg/hgrc
+ $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc
+ $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
+ $ echo 'rs4(ARG1, ARGA, ARGB, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc
+
+ $ try m
+ ('symbol', 'm')
+ (func
+ ('symbol', 'merge')
+ None)
+ 6
+
+test alias recursion
+
+ $ try sincem
+ ('symbol', 'sincem')
+ (func
+ ('symbol', 'descendants')
+ (func
+ ('symbol', 'merge')
+ None))
+ 6
+ 7
+
+test infinite recursion
+
+ $ echo 'recurse1 = recurse2' >> .hg/hgrc
+ $ echo 'recurse2 = recurse1' >> .hg/hgrc
+ $ try recurse1
+ ('symbol', 'recurse1')
+ hg: parse error: infinite expansion of revset alias "recurse1" detected
+ [255]
+
+ $ echo 'level1($1, $2) = $1 or $2' >> .hg/hgrc
+ $ echo 'level2($1, $2) = level1($2, $1)' >> .hg/hgrc
+ $ try "level2(level1(1, 2), 3)"
+ (func
+ ('symbol', 'level2')
+ (list
+ (func
+ ('symbol', 'level1')
+ (list
+ ('symbol', '1')
+ ('symbol', '2')))
+ ('symbol', '3')))
+ (or
+ ('symbol', '3')
+ (or
+ ('symbol', '1')
+ ('symbol', '2')))
+ 3
+ 1
+ 2
+
+test nesting and variable passing
+
+ $ echo 'nested($1) = nested2($1)' >> .hg/hgrc
+ $ echo 'nested2($1) = nested3($1)' >> .hg/hgrc
+ $ echo 'nested3($1) = max($1)' >> .hg/hgrc
+ $ try 'nested(2:5)'
+ (func
+ ('symbol', 'nested')
+ (range
+ ('symbol', '2')
+ ('symbol', '5')))
+ (func
+ ('symbol', 'max')
+ (range
+ ('symbol', '2')
+ ('symbol', '5')))
+ 5
+
+test variable isolation, variable placeholders are rewritten as string
+then parsed and matched again as string. Check they do not leak too
+far away.
+
+ $ echo 'injectparamasstring = max("$1")' >> .hg/hgrc
+ $ echo 'callinjection($1) = descendants(injectparamasstring)' >> .hg/hgrc
+ $ try 'callinjection(2:5)'
+ (func
+ ('symbol', 'callinjection')
+ (range
+ ('symbol', '2')
+ ('symbol', '5')))
+ (func
+ ('symbol', 'descendants')
+ (func
+ ('symbol', 'max')
+ ('string', '$1')))
+ abort: unknown revision '$1'!
+ [255]
+
+ $ echo 'injectparamasstring2 = max(_aliasarg("$1"))' >> .hg/hgrc
+ $ echo 'callinjection2($1) = descendants(injectparamasstring2)' >> .hg/hgrc
+ $ try 'callinjection2(2:5)'
+ (func
+ ('symbol', 'callinjection2')
+ (range
+ ('symbol', '2')
+ ('symbol', '5')))
+ hg: parse error: not a function: _aliasarg
+ [255]
+ >>> data = file('.hg/hgrc', 'rb').read()
+ >>> file('.hg/hgrc', 'wb').write(data.replace('_aliasarg', ''))
+
+ $ try 'd(2:5)'
+ (func
+ ('symbol', 'd')
+ (range
+ ('symbol', '2')
+ ('symbol', '5')))
+ (func
+ ('symbol', 'reverse')
+ (func
+ ('symbol', 'sort')
+ (list
+ (range
+ ('symbol', '2')
+ ('symbol', '5'))
+ ('symbol', 'date'))))
+ 4
+ 5
+ 3
+ 2
+ $ try 'rs(2 or 3, date)'
+ (func
+ ('symbol', 'rs')
+ (list
+ (or
+ ('symbol', '2')
+ ('symbol', '3'))
+ ('symbol', 'date')))
+ (func
+ ('symbol', 'reverse')
+ (func
+ ('symbol', 'sort')
+ (list
+ (or
+ ('symbol', '2')
+ ('symbol', '3'))
+ ('symbol', 'date'))))
+ 3
+ 2
+ $ try 'rs()'
+ (func
+ ('symbol', 'rs')
+ None)
+ hg: parse error: invalid number of arguments: 0
+ [255]
+ $ try 'rs(2)'
+ (func
+ ('symbol', 'rs')
+ ('symbol', '2'))
+ hg: parse error: invalid number of arguments: 1
+ [255]
+ $ try 'rs(2, data, 7)'
+ (func
+ ('symbol', 'rs')
+ (list
+ (list
+ ('symbol', '2')
+ ('symbol', 'data'))
+ ('symbol', '7')))
+ hg: parse error: invalid number of arguments: 3
+ [255]
+ $ try 'rs4(2 or 3, x, x, date)'
+ (func
+ ('symbol', 'rs4')
+ (list
+ (list
+ (list
+ (or
+ ('symbol', '2')
+ ('symbol', '3'))
+ ('symbol', 'x'))
+ ('symbol', 'x'))
+ ('symbol', 'date')))
+ (func
+ ('symbol', 'reverse')
+ (func
+ ('symbol', 'sort')
+ (list
+ (or
+ ('symbol', '2')
+ ('symbol', '3'))
+ ('symbol', 'date'))))
+ 3
+ 2
+
+issue2549 - correct optimizations
+
+ $ log 'limit(1 or 2 or 3, 2) and not 2'
+ 1
+ $ log 'max(1 or 2) and not 2'
+ $ log 'min(1 or 2) and not 1'
+ $ log 'last(1 or 2, 1) and not 2'
+
+tests for 'remote()' predicate:
+#. (csets in remote) (id) (remote)
+1. less than local current branch "default"
+2. same with local specified "default"
+3. more than local specified specified
+
+ $ hg clone --quiet -U . ../remote3
+ $ cd ../remote3
+ $ hg update -q 7
+ $ echo r > r
+ $ hg ci -Aqm 10
+ $ log 'remote()'
+ 7
+ $ log 'remote("a-b-c-")'
+ 2
+ $ cd ../repo
+ $ log 'remote(".a.b.c.", "../remote3")'
+
+ $ cd ..
+
+test author/desc/keyword in problematic encoding
+# unicode: cp932:
+# u30A2 0x83 0x41(= 'A')
+# u30C2 0x83 0x61(= 'a')
+
+ $ hg init problematicencoding
+ $ cd problematicencoding
+
+ $ python > setup.sh <<EOF
+ > print u'''
+ > echo a > text
+ > hg add text
+ > hg --encoding utf-8 commit -u '\u30A2' -m none
+ > echo b > text
+ > hg --encoding utf-8 commit -u '\u30C2' -m none
+ > echo c > text
+ > hg --encoding utf-8 commit -u none -m '\u30A2'
+ > echo d > text
+ > hg --encoding utf-8 commit -u none -m '\u30C2'
+ > '''.encode('utf-8')
+ > EOF
+ $ sh < setup.sh
+
+test in problematic encoding
+ $ python > test.sh <<EOF
+ > print u'''
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'author(\u30A2)'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'author(\u30C2)'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'desc(\u30A2)'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'desc(\u30C2)'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'keyword(\u30A2)'
+ > echo ====
+ > hg --encoding cp932 log --template '{rev}\\n' -r 'keyword(\u30C2)'
+ > '''.encode('cp932')
+ > EOF
+ $ sh < test.sh
+ 0
+ ====
+ 1
+ ====
+ 2
+ ====
+ 3
+ ====
+ 0
+ 2
+ ====
+ 1
+ 3
+
+ $ cd ..
diff --git a/tests/test-rollback.t b/tests/test-rollback.t
new file mode 100644
index 0000000..305555b
--- /dev/null
+++ b/tests/test-rollback.t
@@ -0,0 +1,187 @@
+setup repo
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg commit -Am'add a'
+ adding a
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ $ hg parents
+ changeset: 0:1f0dee641bb7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+
+rollback to null revision
+ $ hg status
+ $ hg rollback
+ repository tip rolled back to revision -1 (undo commit)
+ working directory now based on revision -1
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 0 files, 0 changesets, 0 total revisions
+ $ hg parents
+ $ hg status
+ A a
+
+Two changesets this time so we rollback to a real changeset
+ $ hg commit -m'add a again'
+ $ echo a >> a
+ $ hg commit -m'modify a'
+
+Test issue 902 (current branch is preserved)
+ $ hg branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo commit)
+ working directory now based on revision 0
+ $ hg branch
+ default
+
+Test issue 1635 (commit message saved)
+ $ cat .hg/last-message.txt ; echo
+ modify a
+
+Test rollback of hg before issue 902 was fixed
+
+ $ hg commit -m "test3"
+ $ hg branch test
+ marked working directory as branch test
+ (branches are permanent and global, did you want a bookmark?)
+ $ rm .hg/undo.branch
+ $ hg rollback
+ repository tip rolled back to revision 0 (undo commit)
+ named branch could not be reset: current branch is still 'test'
+ working directory now based on revision 0
+ $ hg branch
+ test
+
+working dir unaffected by rollback: do not restore dirstate et. al.
+ $ hg log --template '{rev} {branch} {desc|firstline}\n'
+ 0 default add a again
+ $ hg status
+ M a
+ $ hg bookmark foo
+ $ hg commit -m'modify a again'
+ $ echo b > b
+ $ hg commit -Am'add b'
+ adding b
+ $ hg log --template '{rev} {branch} {desc|firstline}\n'
+ 2 test add b
+ 1 test modify a again
+ 0 default add a again
+ $ hg update default
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg bookmark bar
+ $ cat .hg/undo.branch ; echo
+ test
+ $ hg rollback -f
+ repository tip rolled back to revision 1 (undo commit)
+ $ hg id -n
+ 0
+ $ hg branch
+ default
+ $ cat .hg/bookmarks.current ; echo
+ bar
+ $ hg bookmark --delete foo
+
+rollback by pretxncommit saves commit message (issue 1635)
+
+ $ echo a >> a
+ $ hg --config hooks.pretxncommit=false commit -m"precious commit message"
+ transaction abort!
+ rollback completed
+ abort: pretxncommit hook exited with status * (glob)
+ [255]
+ $ cat .hg/last-message.txt ; echo
+ precious commit message
+
+same thing, but run $EDITOR
+
+ $ cat > editor.sh << '__EOF__'
+ > echo "another precious commit message" > "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg --config hooks.pretxncommit=false commit 2>&1
+ transaction abort!
+ rollback completed
+ note: commit message saved in .hg/last-message.txt
+ abort: pretxncommit hook exited with status * (glob)
+ [255]
+ $ cat .hg/last-message.txt
+ another precious commit message
+
+test rollback on served repository
+
+#if serve
+ $ hg commit -m "precious commit message"
+ $ hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ cd ..
+ $ hg clone http://localhost:$HGPORT u
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 2 changes to 1 files (+1 heads)
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd u
+ $ hg id default
+ 068774709090
+
+now rollback and observe that 'hg serve' reloads the repository and
+presents the correct tip changeset:
+
+ $ hg -R ../t rollback
+ repository tip rolled back to revision 1 (undo commit)
+ working directory now based on revision 0
+ $ hg id default
+ 791dd2169706
+#endif
+
+update to older changeset and then refuse rollback, because
+that would lose data (issue2998)
+ $ cd ../t
+ $ hg -q update
+ $ rm `hg status -un`
+ $ template='{rev}:{node|short} [{branch}] {desc|firstline}\n'
+ $ echo 'valuable new file' > b
+ $ echo 'valuable modification' >> a
+ $ hg commit -A -m'a valuable change'
+ adding b
+ $ hg update 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg rollback
+ abort: rollback of last commit while not checked out may lose data
+ (use -f to force)
+ [255]
+ $ hg tip -q
+ 2:4d9cd3795eea
+ $ hg rollback -f
+ repository tip rolled back to revision 1 (undo commit)
+ $ hg status
+ $ hg log --removed b # yep, it's gone
+
+same again, but emulate an old client that doesn't write undo.desc
+ $ hg -q update
+ $ echo 'valuable modification redux' >> a
+ $ hg commit -m'a valuable change redux'
+ $ rm .hg/undo.desc
+ $ hg update 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg rollback
+ rolling back unknown transaction
+ $ cat a
+ a
+
+ $ cd ..
diff --git a/tests/test-run-tests.t b/tests/test-run-tests.t
new file mode 100644
index 0000000..68b60cf
--- /dev/null
+++ b/tests/test-run-tests.t
@@ -0,0 +1,99 @@
+Simple commands:
+
+ $ echo foo
+ foo
+ $ printf 'oh no'
+ oh no (no-eol)
+ $ printf 'bar\nbaz\n' | cat
+ bar
+ baz
+
+Multi-line command:
+
+ $ foo() {
+ > echo bar
+ > }
+ $ foo
+ bar
+
+Return codes before inline python:
+
+ $ sh -c 'exit 1'
+ [1]
+
+Doctest commands:
+
+ >>> print 'foo'
+ foo
+ $ echo interleaved
+ interleaved
+ >>> for c in 'xyz':
+ ... print c
+ x
+ y
+ z
+ >>> print
+
+
+Regular expressions:
+
+ $ echo foobarbaz
+ foobar.* (re)
+ $ echo barbazquux
+ .*quux.* (re)
+
+Globs:
+
+ $ printf '* \\foobarbaz {10}\n'
+ \* \\fo?bar* {10} (glob)
+
+Literal match ending in " (re)":
+
+ $ echo 'foo (re)'
+ foo (re)
+
+testing hghave
+
+ $ "$TESTDIR/hghave" true
+ $ "$TESTDIR/hghave" false
+ skipped: missing feature: nail clipper
+ [1]
+ $ "$TESTDIR/hghave" no-true
+ skipped: system supports yak shaving
+ [1]
+ $ "$TESTDIR/hghave" no-false
+
+Conditional sections based on hghave:
+
+#if true
+ $ echo tested
+ tested
+#else
+ $ echo skipped
+#endif
+
+#if false
+ $ echo skipped
+#else
+ $ echo tested
+ tested
+#endif
+
+#if no-false
+ $ echo tested
+ tested
+#else
+ $ echo skipped
+#endif
+
+#if no-true
+ $ echo skipped
+#else
+ $ echo tested
+ tested
+#endif
+
+Exit code:
+
+ $ (exit 1)
+ [1]
diff --git a/tests/test-schemes.t b/tests/test-schemes.t
new file mode 100644
index 0000000..a31ae80
--- /dev/null
+++ b/tests/test-schemes.t
@@ -0,0 +1,50 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > schemes=
+ >
+ > [schemes]
+ > l = http://localhost:$HGPORT/
+ > parts = http://{1}:$HGPORT/
+ > z = file:\$PWD/
+ > EOF
+ $ hg init test
+ $ cd test
+ $ echo a > a
+ $ hg ci -Am initial
+ adding a
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ hg incoming l://
+ comparing with l://
+ searching for changes
+ no changes found
+ [1]
+
+check that {1} syntax works
+
+ $ hg incoming --debug parts://localhost
+ using http://localhost:$HGPORT/
+ sending capabilities command
+ comparing with parts://localhost/
+ query 1; heads
+ sending batch command
+ searching for changes
+ all remote heads known locally
+ no changes found
+ [1]
+
+check that paths are expanded
+
+ $ PWD=`pwd` hg incoming z://
+ comparing with z://
+ searching for changes
+ no changes found
+ [1]
+
+errors
+
+ $ cat errors.log
+
+ $ cd ..
diff --git a/tests/test-serve.t b/tests/test-serve.t
new file mode 100644
index 0000000..8ae4a86
--- /dev/null
+++ b/tests/test-serve.t
@@ -0,0 +1,84 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ hgserve()
+ > {
+ > hg serve -a localhost -d --pid-file=hg.pid -E errors.log -v $@ \
+ > | sed -e "s/:$HGPORT1\\([^0-9]\\)/:HGPORT1\1/g" \
+ > -e "s/:$HGPORT2\\([^0-9]\\)/:HGPORT2\1/g" \
+ > -e 's/http:\/\/[^/]*\//http:\/\/localhost\//'
+ > cat hg.pid >> "$DAEMON_PIDS"
+ > echo % errors
+ > cat errors.log
+ > if [ "$KILLQUIETLY" = "Y" ]; then
+ > kill `cat hg.pid` 2>/dev/null
+ > else
+ > kill `cat hg.pid`
+ > fi
+ > while kill -0 `cat hg.pid` 2>/dev/null; do sleep 0; done
+ > }
+
+ $ hg init test
+ $ cd test
+ $ echo '[web]' > .hg/hgrc
+ $ echo 'accesslog = access.log' >> .hg/hgrc
+ $ echo "port = $HGPORT1" >> .hg/hgrc
+
+Without -v
+
+ $ hg serve -a localhost -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ $ cat hg.pid >> "$DAEMON_PIDS"
+ $ if [ -f access.log ]; then
+ > echo 'access log created - .hg/hgrc respected'
+ > fi
+ access log created - .hg/hgrc respected
+
+errors
+
+ $ cat errors.log
+
+With -v
+
+ $ hgserve
+ listening at http://localhost/ (bound to 127.0.0.1:HGPORT1)
+ % errors
+
+With -v and -p HGPORT2
+
+ $ hgserve -p "$HGPORT2"
+ listening at http://localhost/ (bound to 127.0.0.1:HGPORT2)
+ % errors
+
+With -v and -p daytime (should fail because low port)
+
+ $ KILLQUIETLY=Y
+ $ hgserve -p daytime
+ abort: cannot start server at 'localhost:13': Permission denied
+ abort: child process failed to start
+ % errors
+ $ KILLQUIETLY=N
+
+With --prefix foo
+
+ $ hgserve --prefix foo
+ listening at http://localhost/foo/ (bound to 127.0.0.1:HGPORT1)
+ % errors
+
+With --prefix /foo
+
+ $ hgserve --prefix /foo
+ listening at http://localhost/foo/ (bound to 127.0.0.1:HGPORT1)
+ % errors
+
+With --prefix foo/
+
+ $ hgserve --prefix foo/
+ listening at http://localhost/foo/ (bound to 127.0.0.1:HGPORT1)
+ % errors
+
+With --prefix /foo/
+
+ $ hgserve --prefix /foo/
+ listening at http://localhost/foo/ (bound to 127.0.0.1:HGPORT1)
+ % errors
+
+ $ cd ..
diff --git a/tests/test-setdiscovery.t b/tests/test-setdiscovery.t
new file mode 100644
index 0000000..cca197d
--- /dev/null
+++ b/tests/test-setdiscovery.t
@@ -0,0 +1,327 @@
+
+Function to test discovery between two repos in both directions, using both the local shortcut
+(which is currently not activated by default) and the full remotable protocol:
+
+ $ testdesc() { # revs_a, revs_b, dagdesc
+ > if [ -d foo ]; then rm -rf foo; fi
+ > hg init foo
+ > cd foo
+ > hg debugbuilddag "$3"
+ > hg clone . a $1 --quiet
+ > hg clone . b $2 --quiet
+ > echo
+ > echo "% -- a -> b tree"
+ > hg -R a debugdiscovery b --verbose --old
+ > echo
+ > echo "% -- a -> b set"
+ > hg -R a debugdiscovery b --verbose --debug
+ > echo
+ > echo "% -- b -> a tree"
+ > hg -R b debugdiscovery a --verbose --old
+ > echo
+ > echo "% -- b -> a set"
+ > hg -R b debugdiscovery a --verbose --debug
+ > cd ..
+ > }
+
+
+Small superset:
+
+ $ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
+ > +2:f +1:a1:b1
+ > <f +4 :a2
+ > +5 :b2
+ > <f +3 :b3'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: b5714e113bc0 66f7d451a68b 01241442b3c2
+ common heads: b5714e113bc0 01241442b3c2
+ local is subset
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ all local heads known remotely
+ common heads: b5714e113bc0 01241442b3c2
+ local is subset
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: b5714e113bc0 01241442b3c2
+ common heads: b5714e113bc0 01241442b3c2
+ remote is subset
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ all remote heads known locally
+ common heads: b5714e113bc0 01241442b3c2
+ remote is subset
+
+
+Many new:
+
+ $ testdesc '-ra1 -ra2' '-rb' '
+ > +2:f +3:a1 +3:b
+ > <f +30 :a2'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: bebd167eb94d
+ common heads: bebd167eb94d
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking initial sample
+ searching: 2 queries
+ query 2; still undecided: 29, sample size is: 29
+ 2 total queries
+ common heads: bebd167eb94d
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: bebd167eb94d 66f7d451a68b
+ common heads: bebd167eb94d
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ taking initial sample
+ searching: 2 queries
+ query 2; still undecided: 2, sample size is: 2
+ 2 total queries
+ common heads: bebd167eb94d
+
+
+Both sides many new with stub:
+
+ $ testdesc '-ra1 -ra2' '-rb' '
+ > +2:f +2:a1 +30 :b
+ > <f +30 :a2'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: 2dc09a01254d
+ common heads: 2dc09a01254d
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking initial sample
+ searching: 2 queries
+ query 2; still undecided: 29, sample size is: 29
+ 2 total queries
+ common heads: 2dc09a01254d
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: 66f7d451a68b 2dc09a01254d
+ common heads: 2dc09a01254d
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ taking initial sample
+ searching: 2 queries
+ query 2; still undecided: 29, sample size is: 29
+ 2 total queries
+ common heads: 2dc09a01254d
+
+
+Both many new:
+
+ $ testdesc '-ra' '-rb' '
+ > +2:f +30 :b
+ > <f +30 :a'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: 66f7d451a68b
+ common heads: 66f7d451a68b
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 31, sample size is: 31
+ 2 total queries
+ common heads: 66f7d451a68b
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: 66f7d451a68b
+ common heads: 66f7d451a68b
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 31, sample size is: 31
+ 2 total queries
+ common heads: 66f7d451a68b
+
+
+Both many new skewed:
+
+ $ testdesc '-ra' '-rb' '
+ > +2:f +30 :b
+ > <f +50 :a'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: 66f7d451a68b
+ common heads: 66f7d451a68b
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 51, sample size is: 51
+ 2 total queries
+ common heads: 66f7d451a68b
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: 66f7d451a68b
+ common heads: 66f7d451a68b
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 31, sample size is: 31
+ 2 total queries
+ common heads: 66f7d451a68b
+
+
+Both many new on top of long history:
+
+ $ testdesc '-ra' '-rb' '
+ > +1000:f +30 :b
+ > <f +50 :a'
+
+ % -- a -> b tree
+ comparing with b
+ searching for changes
+ unpruned common: 7ead0cba2838
+ common heads: 7ead0cba2838
+
+ % -- a -> b set
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 1049, sample size is: 11
+ sampling from both directions
+ searching: 3 queries
+ query 3; still undecided: 31, sample size is: 31
+ 3 total queries
+ common heads: 7ead0cba2838
+
+ % -- b -> a tree
+ comparing with a
+ searching for changes
+ unpruned common: 7ead0cba2838
+ common heads: 7ead0cba2838
+
+ % -- b -> a set
+ comparing with a
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 1029, sample size is: 11
+ sampling from both directions
+ searching: 3 queries
+ query 3; still undecided: 15, sample size is: 15
+ 3 total queries
+ common heads: 7ead0cba2838
+
+
+One with >200 heads, which used to use up all of the sample:
+
+ $ hg init manyheads
+ $ cd manyheads
+ $ echo "+300:r @a" >dagdesc
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3 *r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3*r+3" >>dagdesc # 20 heads
+ $ echo "@b *r+3" >>dagdesc # one more head
+ $ hg debugbuilddag <dagdesc
+ reading DAG from stdin
+
+ $ hg heads -t --template . | wc -c
+ \s*261 (re)
+
+ $ hg clone -b a . a
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1340 changesets with 0 changes to 0 files (+259 heads)
+ updating to branch a
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg clone -b b . b
+ adding changesets
+ adding manifests
+ adding file changes
+ added 304 changesets with 0 changes to 0 files
+ updating to branch b
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R a debugdiscovery b --debug --verbose
+ comparing with b
+ query 1; heads
+ searching for changes
+ taking quick initial sample
+ searching: 2 queries
+ query 2; still undecided: 1080, sample size is: 260
+ sampling from both directions
+ searching: 3 queries
+ query 3; still undecided: 820, sample size is: 260
+ sampling from both directions
+ searching: 4 queries
+ query 4; still undecided: 560, sample size is: 260
+ sampling from both directions
+ searching: 5 queries
+ query 5; still undecided: 300, sample size is: 200
+ 5 total queries
+ common heads: 3ee37d65064a
+
+ $ cd ..
diff --git a/tests/test-share.t b/tests/test-share.t
new file mode 100644
index 0000000..0eb755f
--- /dev/null
+++ b/tests/test-share.t
@@ -0,0 +1,129 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "share = " >> $HGRCPATH
+
+prepare repo1
+
+ $ hg init repo1
+ $ cd repo1
+ $ echo a > a
+ $ hg commit -A -m'init'
+ adding a
+
+share it
+
+ $ cd ..
+ $ hg share repo1 repo2
+ updating working directory
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+share shouldn't have a store dir
+
+ $ cd repo2
+ $ test -d .hg/store
+ [1]
+
+Some sed versions appends newline, some don't, and some just fails
+
+ $ cat .hg/sharedpath; echo
+ $TESTTMP/repo1/.hg (glob)
+
+trailing newline on .hg/sharedpath is ok
+ $ hg tip -q
+ 0:d3873e73d99e
+ $ echo '' >> .hg/sharedpath
+ $ cat .hg/sharedpath
+ $TESTTMP/repo1/.hg (glob)
+ $ hg tip -q
+ 0:d3873e73d99e
+
+commit in shared clone
+
+ $ echo a >> a
+ $ hg commit -m'change in shared clone'
+
+check original
+
+ $ cd ../repo1
+ $ hg log
+ changeset: 1:8af4dc49db9e
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change in shared clone
+
+ changeset: 0:d3873e73d99e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: init
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat a # should be two lines of "a"
+ a
+ a
+
+commit in original
+
+ $ echo b > b
+ $ hg commit -A -m'another file'
+ adding b
+
+check in shared clone
+
+ $ cd ../repo2
+ $ hg log
+ changeset: 2:c2e0ac586386
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: another file
+
+ changeset: 1:8af4dc49db9e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change in shared clone
+
+ changeset: 0:d3873e73d99e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: init
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat b # should exist with one "b"
+ b
+
+hg serve shared clone
+
+ $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'raw-file/'
+ 200 Script output follows
+
+
+ -rw-r--r-- 4 a
+ -rw-r--r-- 2 b
+
+
+
+test unshare command
+
+ $ hg unshare
+ $ test -d .hg/store
+ $ test -f .hg/sharedpath
+ [1]
+ $ hg unshare
+ abort: this is not a shared repo
+ [255]
+
+check that a change does not propagate
+
+ $ echo b >> b
+ $ hg commit -m'change in unshared'
+ $ cd ../repo1
+ $ hg id -r tip
+ c2e0ac586386 tip
+
+ $ cd ..
diff --git a/tests/test-simple-update.t b/tests/test-simple-update.t
new file mode 100644
index 0000000..080bdc7
--- /dev/null
+++ b/tests/test-simple-update.t
@@ -0,0 +1,58 @@
+ $ hg init test
+ $ cd test
+ $ echo foo>foo
+ $ hg addremove
+ adding foo
+ $ hg commit -m "1"
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+
+ $ hg clone . ../branch
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../branch
+ $ hg co
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo bar>>foo
+ $ hg commit -m "2"
+
+ $ cd ../test
+
+ $ hg pull ../branch
+ pulling from ../branch
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+
+ $ hg co
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cat foo
+ foo
+ bar
+
+ $ hg manifest --debug
+ 6f4310b00b9a147241b071a60c28a650827fb03d 644 foo
+
+update to rev 0 with a date
+
+ $ hg upd -d foo 0
+ abort: you can't specify a revision and a date
+ [255]
+
+ $ cd ..
diff --git a/tests/test-simplemerge.py b/tests/test-simplemerge.py
new file mode 100644
index 0000000..fb6add0
--- /dev/null
+++ b/tests/test-simplemerge.py
@@ -0,0 +1,415 @@
+# Copyright (C) 2004, 2005 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+
+import unittest
+from unittest import TestCase
+from mercurial import util, simplemerge
+
+# bzr compatible interface, for the tests
+class Merge3(simplemerge.Merge3Text):
+ """3-way merge of texts.
+
+ Given BASE, OTHER, THIS, tries to produce a combined text
+ incorporating the changes from both BASE->OTHER and BASE->THIS.
+ All three will typically be sequences of lines."""
+ def __init__(self, base, a, b):
+ basetext = '\n'.join([i.strip('\n') for i in base] + [''])
+ atext = '\n'.join([i.strip('\n') for i in a] + [''])
+ btext = '\n'.join([i.strip('\n') for i in b] + [''])
+ if util.binary(basetext) or util.binary(atext) or util.binary(btext):
+ raise util.Abort("don't know how to merge binary files")
+ simplemerge.Merge3Text.__init__(self, basetext, atext, btext,
+ base, a, b)
+
+CantReprocessAndShowBase = simplemerge.CantReprocessAndShowBase
+
+def split_lines(t):
+ from cStringIO import StringIO
+ return StringIO(t).readlines()
+
+############################################################
+# test case data from the gnu diffutils manual
+# common base
+TZU = split_lines(""" The Nameless is the origin of Heaven and Earth;
+ The named is the mother of all things.
+
+ Therefore let there always be non-being,
+ so we may see their subtlety,
+ And let there always be being,
+ so we may see their outcome.
+ The two are the same,
+ But after they are produced,
+ they have different names.
+ They both may be called deep and profound.
+ Deeper and more profound,
+ The door of all subtleties!
+""")
+
+LAO = split_lines(""" The Way that can be told of is not the eternal Way;
+ The name that can be named is not the eternal name.
+ The Nameless is the origin of Heaven and Earth;
+ The Named is the mother of all things.
+ Therefore let there always be non-being,
+ so we may see their subtlety,
+ And let there always be being,
+ so we may see their outcome.
+ The two are the same,
+ But after they are produced,
+ they have different names.
+""")
+
+
+TAO = split_lines(""" The Way that can be told of is not the eternal Way;
+ The name that can be named is not the eternal name.
+ The Nameless is the origin of Heaven and Earth;
+ The named is the mother of all things.
+
+ Therefore let there always be non-being,
+ so we may see their subtlety,
+ And let there always be being,
+ so we may see their result.
+ The two are the same,
+ But after they are produced,
+ they have different names.
+
+ -- The Way of Lao-Tzu, tr. Wing-tsit Chan
+
+""")
+
+MERGED_RESULT = split_lines("""\
+ The Way that can be told of is not the eternal Way;
+ The name that can be named is not the eternal name.
+ The Nameless is the origin of Heaven and Earth;
+ The Named is the mother of all things.
+ Therefore let there always be non-being,
+ so we may see their subtlety,
+ And let there always be being,
+ so we may see their result.
+ The two are the same,
+ But after they are produced,
+ they have different names.
+<<<<<<< LAO
+=======
+
+ -- The Way of Lao-Tzu, tr. Wing-tsit Chan
+
+>>>>>>> TAO
+""")
+
+class TestMerge3(TestCase):
+ def log(self, msg):
+ pass
+
+ def test_no_changes(self):
+ """No conflicts because nothing changed"""
+ m3 = Merge3(['aaa', 'bbb'],
+ ['aaa', 'bbb'],
+ ['aaa', 'bbb'])
+
+ self.assertEquals(m3.find_unconflicted(),
+ [(0, 2)])
+
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 2,
+ 0, 2,
+ 0, 2),
+ (2, 2, 2, 2, 2, 2)])
+
+ self.assertEquals(list(m3.merge_regions()),
+ [('unchanged', 0, 2)])
+
+ self.assertEquals(list(m3.merge_groups()),
+ [('unchanged', ['aaa', 'bbb'])])
+
+ def test_front_insert(self):
+ m3 = Merge3(['zz'],
+ ['aaa', 'bbb', 'zz'],
+ ['zz'])
+
+ # todo: should use a sentinal at end as from get_matching_blocks
+ # to match without zz
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 1, 2, 3, 0, 1),
+ (1, 1, 3, 3, 1, 1)])
+
+ self.assertEquals(list(m3.merge_regions()),
+ [('a', 0, 2),
+ ('unchanged', 0, 1)])
+
+ self.assertEquals(list(m3.merge_groups()),
+ [('a', ['aaa', 'bbb']),
+ ('unchanged', ['zz'])])
+
+ def test_null_insert(self):
+ m3 = Merge3([],
+ ['aaa', 'bbb'],
+ [])
+ # todo: should use a sentinal at end as from get_matching_blocks
+ # to match without zz
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 0, 2, 2, 0, 0)])
+
+ self.assertEquals(list(m3.merge_regions()),
+ [('a', 0, 2)])
+
+ self.assertEquals(list(m3.merge_lines()),
+ ['aaa', 'bbb'])
+
+ def test_no_conflicts(self):
+ """No conflicts because only one side changed"""
+ m3 = Merge3(['aaa', 'bbb'],
+ ['aaa', '111', 'bbb'],
+ ['aaa', 'bbb'])
+
+ self.assertEquals(m3.find_unconflicted(),
+ [(0, 1), (1, 2)])
+
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 1, 0, 1, 0, 1),
+ (1, 2, 2, 3, 1, 2),
+ (2, 2, 3, 3, 2, 2)])
+
+ self.assertEquals(list(m3.merge_regions()),
+ [('unchanged', 0, 1),
+ ('a', 1, 2),
+ ('unchanged', 1, 2)])
+
+ def test_append_a(self):
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', 'bbb\n', '222\n'],
+ ['aaa\n', 'bbb\n'])
+
+ self.assertEquals(''.join(m3.merge_lines()),
+ 'aaa\nbbb\n222\n')
+
+ def test_append_b(self):
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', 'bbb\n'],
+ ['aaa\n', 'bbb\n', '222\n'])
+
+ self.assertEquals(''.join(m3.merge_lines()),
+ 'aaa\nbbb\n222\n')
+
+ def test_append_agreement(self):
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', 'bbb\n', '222\n'],
+ ['aaa\n', 'bbb\n', '222\n'])
+
+ self.assertEquals(''.join(m3.merge_lines()),
+ 'aaa\nbbb\n222\n')
+
+ def test_append_clash(self):
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', 'bbb\n', '222\n'],
+ ['aaa\n', 'bbb\n', '333\n'])
+
+ ml = m3.merge_lines(name_a='a',
+ name_b='b',
+ start_marker='<<',
+ mid_marker='--',
+ end_marker='>>')
+ self.assertEquals(''.join(ml),
+ 'aaa\n'
+ 'bbb\n'
+ '<< a\n'
+ '222\n'
+ '--\n'
+ '333\n'
+ '>> b\n'
+ )
+
+ def test_insert_agreement(self):
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', '222\n', 'bbb\n'],
+ ['aaa\n', '222\n', 'bbb\n'])
+
+ ml = m3.merge_lines(name_a='a',
+ name_b='b',
+ start_marker='<<',
+ mid_marker='--',
+ end_marker='>>')
+ self.assertEquals(''.join(ml), 'aaa\n222\nbbb\n')
+
+
+ def test_insert_clash(self):
+ """Both try to insert lines in the same place."""
+ m3 = Merge3(['aaa\n', 'bbb\n'],
+ ['aaa\n', '111\n', 'bbb\n'],
+ ['aaa\n', '222\n', 'bbb\n'])
+
+ self.assertEquals(m3.find_unconflicted(),
+ [(0, 1), (1, 2)])
+
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 1, 0, 1, 0, 1),
+ (1, 2, 2, 3, 2, 3),
+ (2, 2, 3, 3, 3, 3)])
+
+ self.assertEquals(list(m3.merge_regions()),
+ [('unchanged', 0, 1),
+ ('conflict', 1, 1, 1, 2, 1, 2),
+ ('unchanged', 1, 2)])
+
+ self.assertEquals(list(m3.merge_groups()),
+ [('unchanged', ['aaa\n']),
+ ('conflict', [], ['111\n'], ['222\n']),
+ ('unchanged', ['bbb\n']),
+ ])
+
+ ml = m3.merge_lines(name_a='a',
+ name_b='b',
+ start_marker='<<',
+ mid_marker='--',
+ end_marker='>>')
+ self.assertEquals(''.join(ml),
+'''aaa
+<< a
+111
+--
+222
+>> b
+bbb
+''')
+
+ def test_replace_clash(self):
+ """Both try to insert lines in the same place."""
+ m3 = Merge3(['aaa', '000', 'bbb'],
+ ['aaa', '111', 'bbb'],
+ ['aaa', '222', 'bbb'])
+
+ self.assertEquals(m3.find_unconflicted(),
+ [(0, 1), (2, 3)])
+
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 1, 0, 1, 0, 1),
+ (2, 3, 2, 3, 2, 3),
+ (3, 3, 3, 3, 3, 3)])
+
+ def test_replace_multi(self):
+ """Replacement with regions of different size."""
+ m3 = Merge3(['aaa', '000', '000', 'bbb'],
+ ['aaa', '111', '111', '111', 'bbb'],
+ ['aaa', '222', '222', '222', '222', 'bbb'])
+
+ self.assertEquals(m3.find_unconflicted(),
+ [(0, 1), (3, 4)])
+
+
+ self.assertEquals(list(m3.find_sync_regions()),
+ [(0, 1, 0, 1, 0, 1),
+ (3, 4, 4, 5, 5, 6),
+ (4, 4, 5, 5, 6, 6)])
+
+ def test_merge_poem(self):
+ """Test case from diff3 manual"""
+ m3 = Merge3(TZU, LAO, TAO)
+ ml = list(m3.merge_lines('LAO', 'TAO'))
+ self.log('merge result:')
+ self.log(''.join(ml))
+ self.assertEquals(ml, MERGED_RESULT)
+
+ def test_minimal_conflicts_common(self):
+ """Reprocessing"""
+ base_text = ("a\n" * 20).splitlines(True)
+ this_text = ("a\n"*10+"b\n" * 10).splitlines(True)
+ other_text = ("a\n"*10+"c\n"+"b\n" * 8 + "c\n").splitlines(True)
+ m3 = Merge3(base_text, other_text, this_text)
+ m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
+ merged_text = "".join(list(m_lines))
+ optimal_text = ("a\n" * 10 + "<<<<<<< OTHER\nc\n=======\n"
+ + ">>>>>>> THIS\n"
+ + 8* "b\n" + "<<<<<<< OTHER\nc\n=======\n"
+ + 2* "b\n" + ">>>>>>> THIS\n")
+ self.assertEquals(optimal_text, merged_text)
+
+ def test_minimal_conflicts_unique(self):
+ def add_newline(s):
+ """Add a newline to each entry in the string"""
+ return [(x+'\n') for x in s]
+
+ base_text = add_newline("abcdefghijklm")
+ this_text = add_newline("abcdefghijklmNOPQRSTUVWXYZ")
+ other_text = add_newline("abcdefghijklm1OPQRSTUVWXY2")
+ m3 = Merge3(base_text, other_text, this_text)
+ m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
+ merged_text = "".join(list(m_lines))
+ optimal_text = ''.join(add_newline("abcdefghijklm")
+ + ["<<<<<<< OTHER\n1\n=======\nN\n>>>>>>> THIS\n"]
+ + add_newline('OPQRSTUVWXY')
+ + ["<<<<<<< OTHER\n2\n=======\nZ\n>>>>>>> THIS\n"]
+ )
+ self.assertEquals(optimal_text, merged_text)
+
+ def test_minimal_conflicts_nonunique(self):
+ def add_newline(s):
+ """Add a newline to each entry in the string"""
+ return [(x+'\n') for x in s]
+
+ base_text = add_newline("abacddefgghij")
+ this_text = add_newline("abacddefgghijkalmontfprz")
+ other_text = add_newline("abacddefgghijknlmontfprd")
+ m3 = Merge3(base_text, other_text, this_text)
+ m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True)
+ merged_text = "".join(list(m_lines))
+ optimal_text = ''.join(add_newline("abacddefgghijk")
+ + ["<<<<<<< OTHER\nn\n=======\na\n>>>>>>> THIS\n"]
+ + add_newline('lmontfpr')
+ + ["<<<<<<< OTHER\nd\n=======\nz\n>>>>>>> THIS\n"]
+ )
+ self.assertEquals(optimal_text, merged_text)
+
+ def test_reprocess_and_base(self):
+ """Reprocessing and showing base breaks correctly"""
+ base_text = ("a\n" * 20).splitlines(True)
+ this_text = ("a\n"*10+"b\n" * 10).splitlines(True)
+ other_text = ("a\n"*10+"c\n"+"b\n" * 8 + "c\n").splitlines(True)
+ m3 = Merge3(base_text, other_text, this_text)
+ m_lines = m3.merge_lines('OTHER', 'THIS', reprocess=True,
+ base_marker='|||||||')
+ self.assertRaises(CantReprocessAndShowBase, list, m_lines)
+
+ def test_binary(self):
+ self.assertRaises(util.Abort, Merge3, ['\x00'], ['a'], ['b'])
+
+ def test_dos_text(self):
+ base_text = 'a\r\n'
+ this_text = 'b\r\n'
+ other_text = 'c\r\n'
+ m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
+ this_text.splitlines(True))
+ m_lines = m3.merge_lines('OTHER', 'THIS')
+ self.assertEqual('<<<<<<< OTHER\r\nc\r\n=======\r\nb\r\n'
+ '>>>>>>> THIS\r\n'.splitlines(True), list(m_lines))
+
+ def test_mac_text(self):
+ base_text = 'a\r'
+ this_text = 'b\r'
+ other_text = 'c\r'
+ m3 = Merge3(base_text.splitlines(True), other_text.splitlines(True),
+ this_text.splitlines(True))
+ m_lines = m3.merge_lines('OTHER', 'THIS')
+ self.assertEqual('<<<<<<< OTHER\rc\r=======\rb\r'
+ '>>>>>>> THIS\r'.splitlines(True), list(m_lines))
+
+if __name__ == '__main__':
+ # hide the timer
+ import time
+ orig = time.time
+ try:
+ time.time = lambda: 0
+ unittest.main()
+ finally:
+ time.time = orig
+
diff --git a/tests/test-simplemerge.py.out b/tests/test-simplemerge.py.out
new file mode 100644
index 0000000..953572f
--- /dev/null
+++ b/tests/test-simplemerge.py.out
@@ -0,0 +1,5 @@
+....................
+----------------------------------------------------------------------
+Ran 20 tests in 0.000s
+
+OK
diff --git a/tests/test-ssh-clone-r.t b/tests/test-ssh-clone-r.t
new file mode 100644
index 0000000..4c1dff2
--- /dev/null
+++ b/tests/test-ssh-clone-r.t
@@ -0,0 +1,195 @@
+This test tries to exercise the ssh functionality with a dummy script
+
+creating 'remote' repo
+
+ $ hg init remote
+ $ cd remote
+ $ hg unbundle "$TESTDIR/bundles/remote.hg"
+ adding changesets
+ adding manifests
+ adding file changes
+ added 9 changesets with 7 changes to 4 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg up tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+
+clone remote via stream
+
+ $ for i in 0 1 2 3 4 5 6 7 8; do
+ > hg clone -e "python \"$TESTDIR/dummyssh\"" --uncompressed -r "$i" ssh://user@dummy/remote test-"$i"
+ > if cd test-"$i"; then
+ > hg verify
+ > cd ..
+ > fi
+ > done
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 4 changesets, 4 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 2 changesets, 2 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 3 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 4 changesets, 5 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 6 changes to 3 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 5 changesets, 6 total revisions
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 2 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 5 changesets, 5 total revisions
+ $ cd test-8
+ $ hg pull ../test-7
+ pulling from ../test-7
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 2 changes to 3 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+ $ cd ..
+ $ cd test-1
+ $ hg pull -e "python \"$TESTDIR/dummyssh\"" -r 4 ssh://user@dummy/remote
+ pulling from ssh://user@dummy/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 3 changesets, 2 total revisions
+ $ hg pull -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote
+ pulling from ssh://user@dummy/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 5 changes to 4 files
+ (run 'hg update' to get a working copy)
+ $ cd ..
+ $ cd test-2
+ $ hg pull -e "python \"$TESTDIR/dummyssh\"" -r 5 ssh://user@dummy/remote
+ pulling from ssh://user@dummy/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 0 changes to 0 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 5 changesets, 3 total revisions
+ $ hg pull -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote
+ pulling from ssh://user@dummy/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files
+ (run 'hg update' to get a working copy)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 4 files, 9 changesets, 7 total revisions
+
+ $ cd ..
diff --git a/tests/test-ssh.t b/tests/test-ssh.t
new file mode 100644
index 0000000..169473d
--- /dev/null
+++ b/tests/test-ssh.t
@@ -0,0 +1,376 @@
+
+
+This test tries to exercise the ssh functionality with a dummy script
+
+creating 'remote' repo
+
+ $ hg init remote
+ $ cd remote
+ $ echo this > foo
+ $ echo this > fooO
+ $ hg ci -A -m "init" foo fooO
+ $ cat <<EOF > .hg/hgrc
+ > [server]
+ > uncompressed = True
+ >
+ > [hooks]
+ > changegroup = python "$TESTDIR/printenv.py" changegroup-in-remote 0 ../dummylog
+ > EOF
+ $ cd ..
+
+repo not found error
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/nonexistent local
+ remote: abort: there is no Mercurial repository here (.hg not found)!
+ abort: no suitable response from remote hg!
+ [255]
+
+non-existent absolute path
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy//`pwd`/nonexistent local
+ remote: abort: there is no Mercurial repository here (.hg not found)!
+ abort: no suitable response from remote hg!
+ [255]
+
+clone remote via stream
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" --uncompressed ssh://user@dummy/remote local-stream
+ streaming all changes
+ 4 files to transfer, 392 bytes of data
+ transferred 392 bytes in * seconds (*/sec) (glob)
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd local-stream
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 1 changesets, 2 total revisions
+ $ cd ..
+
+clone remote via pull
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+verify
+
+ $ cd local
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 1 changesets, 2 total revisions
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup-in-local 0 ../dummylog" >> .hg/hgrc
+
+empty default pull
+
+ $ hg paths
+ default = ssh://user@dummy/remote
+ $ hg pull -e "python \"$TESTDIR/dummyssh\""
+ pulling from ssh://user@dummy/remote
+ searching for changes
+ no changes found
+
+local change
+
+ $ echo bleah > foo
+ $ hg ci -m "add"
+
+updating rc
+
+ $ echo "default-push = ssh://user@dummy/remote" >> .hg/hgrc
+ $ echo "[ui]" >> .hg/hgrc
+ $ echo "ssh = python \"$TESTDIR/dummyssh\"" >> .hg/hgrc
+
+find outgoing
+
+ $ hg out ssh://user@dummy/remote
+ comparing with ssh://user@dummy/remote
+ searching for changes
+ changeset: 1:a28a9d1a809c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add
+
+
+find incoming on the remote side
+
+ $ hg incoming -R ../remote -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/local
+ comparing with ssh://user@dummy/local
+ searching for changes
+ changeset: 1:a28a9d1a809c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add
+
+
+find incoming on the remote side (using absolute path)
+
+ $ hg incoming -R ../remote -e "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/`pwd`"
+ comparing with ssh://user@dummy/$TESTTMP/local
+ searching for changes
+ changeset: 1:a28a9d1a809c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add
+
+
+push
+
+ $ hg push
+ pushing to ssh://user@dummy/remote
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ cd ../remote
+
+check remote tip
+
+ $ hg tip
+ changeset: 1:a28a9d1a809c
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 3 total revisions
+ $ hg cat -r tip foo
+ bleah
+ $ echo z > z
+ $ hg ci -A -m z z
+ created new head
+
+test pushkeys and bookmarks
+
+ $ cd ../local
+ $ hg debugpushkey --config ui.ssh="python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote namespaces
+ bookmarks
+ phases
+ namespaces
+ $ hg book foo -r 0
+ $ hg out -B
+ comparing with ssh://user@dummy/remote
+ searching for changed bookmarks
+ foo 1160648e36ce
+ $ hg push -B foo
+ pushing to ssh://user@dummy/remote
+ searching for changes
+ no changes found
+ exporting bookmark foo
+ [1]
+ $ hg debugpushkey --config ui.ssh="python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote bookmarks
+ foo 1160648e36cec0054048a7edc4110c6f84fde594
+ $ hg book -f foo
+ $ hg push --traceback
+ pushing to ssh://user@dummy/remote
+ searching for changes
+ no changes found
+ updating bookmark foo
+ [1]
+ $ hg book -d foo
+ $ hg in -B
+ comparing with ssh://user@dummy/remote
+ searching for changed bookmarks
+ foo a28a9d1a809c
+ $ hg book -f -r 0 foo
+ $ hg pull -B foo
+ pulling from ssh://user@dummy/remote
+ no changes found
+ updating bookmark foo
+ importing bookmark foo
+ $ hg book -d foo
+ $ hg push -B foo
+ pushing to ssh://user@dummy/remote
+ searching for changes
+ no changes found
+ deleting remote bookmark foo
+ [1]
+
+a bad, evil hook that prints to stdout
+
+ $ cat <<EOF > $TESTTMP/badhook
+ > import sys
+ > sys.stdout.write("KABOOM\n")
+ > EOF
+
+ $ echo '[hooks]' >> ../remote/.hg/hgrc
+ $ echo "changegroup.stdout = python $TESTTMP/badhook" >> ../remote/.hg/hgrc
+ $ echo r > r
+ $ hg ci -A -m z r
+
+push should succeed even though it has an unexpected response
+
+ $ hg push
+ pushing to ssh://user@dummy/remote
+ searching for changes
+ note: unsynced remote changes!
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ remote: KABOOM
+ $ hg -R ../remote heads
+ changeset: 3:1383141674ec
+ tag: tip
+ parent: 1:a28a9d1a809c
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: z
+
+ changeset: 2:6c0482d977a3
+ parent: 0:1160648e36ce
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: z
+
+
+clone bookmarks
+
+ $ hg -R ../remote bookmark test
+ $ hg -R ../remote bookmarks
+ * test 2:6c0482d977a3
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/remote local-bookmarks
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 4 files (+1 heads)
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -R local-bookmarks bookmarks
+ test 2:6c0482d977a3
+
+passwords in ssh urls are not supported
+(we use a glob here because different Python versions give different
+results here)
+
+ $ hg push ssh://user:erroneouspwd@dummy/remote
+ pushing to ssh://user:*@dummy/remote (glob)
+ abort: password in URL not supported!
+ [255]
+
+ $ cd ..
+
+hide outer repo
+ $ hg init
+
+Test remote paths with spaces (issue2983):
+
+ $ hg init --ssh "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
+ $ touch "$TESTTMP/a repo/test"
+ $ hg -R 'a repo' commit -A -m "test"
+ adding test
+ $ hg -R 'a repo' tag tag
+ $ hg id --ssh "python \"$TESTDIR/dummyssh\"" "ssh://user@dummy/a repo"
+ 73649e48688a
+
+Test hg-ssh using a helper script that will restore PYTHONPATH (which might
+have been cleared by a hg.exe wrapper) and invoke hg-ssh with the right
+parameters:
+
+ $ cat > ssh.sh << EOF
+ > userhost="\$1"
+ > SSH_ORIGINAL_COMMAND="\$2"
+ > export SSH_ORIGINAL_COMMAND
+ > PYTHONPATH="$PYTHONPATH"
+ > export PYTHONPATH
+ > python "$TESTDIR/../contrib/hg-ssh" "$TESTTMP/a repo"
+ > EOF
+
+ $ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a repo"
+ 73649e48688a
+
+ $ hg id --ssh "sh ssh.sh" "ssh://user@dummy/a'repo"
+ remote: Illegal repository "$TESTTMP/a'repo" (glob)
+ abort: no suitable response from remote hg!
+ [255]
+
+ $ hg id --ssh "sh ssh.sh" --remotecmd hacking "ssh://user@dummy/a'repo"
+ remote: Illegal command "hacking -R 'a'\''repo' serve --stdio"
+ abort: no suitable response from remote hg!
+ [255]
+
+ $ SSH_ORIGINAL_COMMAND="'hg' -R 'a'repo' serve --stdio" python "$TESTDIR/../contrib/hg-ssh"
+ Illegal command "'hg' -R 'a'repo' serve --stdio": No closing quotation
+ [255]
+
+Test hg-ssh in read-only mode:
+
+ $ cat > ssh.sh << EOF
+ > userhost="\$1"
+ > SSH_ORIGINAL_COMMAND="\$2"
+ > export SSH_ORIGINAL_COMMAND
+ > PYTHONPATH="$PYTHONPATH"
+ > export PYTHONPATH
+ > python "$TESTDIR/../contrib/hg-ssh" --read-only "$TESTTMP/remote"
+ > EOF
+
+ $ hg clone --ssh "sh ssh.sh" "ssh://user@dummy/$TESTTMP/remote" read-only-local
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 5 changes to 4 files (+1 heads)
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd read-only-local
+ $ echo "baz" > bar
+ $ hg ci -A -m "unpushable commit" bar
+ $ hg push --ssh "sh ../ssh.sh"
+ pushing to ssh://user@dummy/*/remote (glob)
+ searching for changes
+ remote: Permission denied
+ remote: abort: prechangegroup.hg-ssh hook failed
+ remote: Permission denied
+ remote: abort: prepushkey.hg-ssh hook failed
+ abort: unexpected response: empty string
+ [255]
+
+ $ cd ..
+
+ $ cat dummylog
+ Got arguments 1:user@dummy 2:hg -R nonexistent serve --stdio
+ Got arguments 1:user@dummy 2:hg -R /$TESTTMP/nonexistent serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R local serve --stdio
+ Got arguments 1:user@dummy 2:hg -R $TESTTMP/local serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ changegroup-in-remote hook: HG_NODE=a28a9d1a809cab7d4e2fde4bee738a9ede948b60 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ changegroup-in-remote hook: HG_NODE=1383141674ec756a6056f6a9097618482fe0f4a6 HG_SOURCE=serve HG_URL=remote:ssh:127.0.0.1
+ Got arguments 1:user@dummy 2:hg -R remote serve --stdio
+ Got arguments 1:user@dummy 2:hg init 'a repo'
+ Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
+ Got arguments 1:user@dummy 2:hg -R 'a repo' serve --stdio
diff --git a/tests/test-static-http.t b/tests/test-static-http.t
new file mode 100644
index 0000000..ed9ab54
--- /dev/null
+++ b/tests/test-static-http.t
@@ -0,0 +1,174 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+#if windows
+ $ hg clone http://localhost:$HGPORT/ copy
+ abort: * (glob)
+ [255]
+#else
+ $ hg clone http://localhost:$HGPORT/ copy
+ abort: error: Connection refused
+ [255]
+#endif
+ $ test -d copy
+ [1]
+
+This server doesn't do range requests so it's basically only good for
+one pull
+
+ $ cat > dumb.py <<EOF
+ > import BaseHTTPServer, SimpleHTTPServer, os, signal, sys
+ >
+ > def run(server_class=BaseHTTPServer.HTTPServer,
+ > handler_class=SimpleHTTPServer.SimpleHTTPRequestHandler):
+ > server_address = ('localhost', int(os.environ['HGPORT']))
+ > httpd = server_class(server_address, handler_class)
+ > httpd.serve_forever()
+ >
+ > signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))
+ > run()
+ > EOF
+ $ python dumb.py 2>/dev/null &
+ $ echo $! >> $DAEMON_PIDS
+ $ hg init remote
+ $ cd remote
+ $ echo foo > bar
+ $ echo c2 > '.dotfile with spaces'
+ $ hg add
+ adding .dotfile with spaces
+ adding bar
+ $ hg commit -m"test"
+ $ hg tip
+ changeset: 0:02770d679fb8
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+ $ cd ..
+ $ hg clone static-http://localhost:$HGPORT/remote local
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd local
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 1 changesets, 2 total revisions
+ $ cat bar
+ foo
+ $ cd ../remote
+ $ echo baz > quux
+ $ hg commit -A -mtest2
+ adding quux
+
+check for HTTP opener failures when cachefile does not exist
+
+ $ rm .hg/cache/*
+ $ cd ../local
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo "changegroup = python \"$TESTDIR/printenv.py\" changegroup" >> .hg/hgrc
+ $ hg pull
+ pulling from static-http://localhost:$HGPORT/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ changegroup hook: HG_NODE=4ac2e3648604439c580c69b09ec9d93a88d93432 HG_SOURCE=pull HG_URL=http://localhost:$HGPORT/remote
+ (run 'hg update' to get a working copy)
+
+trying to push
+
+ $ hg update
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo more foo >> bar
+ $ hg commit -m"test"
+ $ hg push
+ pushing to static-http://localhost:$HGPORT/remote
+ abort: destination does not support push
+ [255]
+
+trying clone -r
+
+ $ cd ..
+ $ hg clone -r donotexist static-http://localhost:$HGPORT/remote local0
+ abort: unknown revision 'donotexist'!
+ [255]
+ $ hg clone -r 0 static-http://localhost:$HGPORT/remote local0
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+test with "/" URI (issue 747) and subrepo
+
+ $ hg init
+ $ hg init sub
+ $ touch sub/test
+ $ hg -R sub commit -A -m "test"
+ adding test
+ $ hg -R sub tag not-empty
+ $ echo sub=sub > .hgsub
+ $ echo a > a
+ $ hg add a .hgsub
+ $ hg -q ci -ma
+ $ hg clone static-http://localhost:$HGPORT/ local2
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ cloning subrepo sub from static-http://localhost:$HGPORT/sub
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd local2
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 1 changesets, 3 total revisions
+ $ cat a
+ a
+ $ hg paths
+ default = static-http://localhost:$HGPORT/
+
+test with empty repo (issue965)
+
+ $ cd ..
+ $ hg init remotempty
+ $ hg clone static-http://localhost:$HGPORT/remotempty local3
+ no changes found
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd local3
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 0 files, 0 changesets, 0 total revisions
+ $ hg paths
+ default = static-http://localhost:$HGPORT/remotempty
+
+test with non-repo
+
+ $ cd ..
+ $ mkdir notarepo
+ $ hg clone static-http://localhost:$HGPORT/notarepo local3
+ abort: 'http://localhost:$HGPORT/notarepo' does not appear to be an hg repository!
+ [255]
+ $ kill $!
diff --git a/tests/test-status-color.t b/tests/test-status-color.t
new file mode 100644
index 0000000..f7917f7
--- /dev/null
+++ b/tests/test-status-color.t
@@ -0,0 +1,300 @@
+ $ "$TESTDIR/hghave" tic || exit 80
+
+ $ echo "[extensions]" >> $HGRCPATH
+ $ echo "color=" >> $HGRCPATH
+ $ echo "[color]" >> $HGRCPATH
+ $ echo "mode=ansi" >> $HGRCPATH
+Terminfo codes compatibility fix
+ $ echo "color.none=0" >> $HGRCPATH
+
+ $ hg init repo1
+ $ cd repo1
+ $ mkdir a b a/1 b/1 b/2
+ $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2
+
+hg status in repo root:
+
+ $ hg status --color=always
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+
+hg status . in repo root:
+
+ $ hg status --color=always .
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+
+ $ hg status --color=always --cwd a
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+ $ hg status --color=always --cwd a .
+ \x1b[0;35;1;4m? 1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_a\x1b[0m (esc)
+ $ hg status --color=always --cwd a ..
+ \x1b[0;35;1;4m? 1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../in_root\x1b[0m (esc)
+
+ $ hg status --color=always --cwd b
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+ $ hg status --color=always --cwd b .
+ \x1b[0;35;1;4m? 1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? 2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_b\x1b[0m (esc)
+ $ hg status --color=always --cwd b ..
+ \x1b[0;35;1;4m? ../a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? 1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? 2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../in_root\x1b[0m (esc)
+
+ $ hg status --color=always --cwd a/1
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+ $ hg status --color=always --cwd a/1 .
+ \x1b[0;35;1;4m? in_a_1\x1b[0m (esc)
+ $ hg status --color=always --cwd a/1 ..
+ \x1b[0;35;1;4m? in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../in_a\x1b[0m (esc)
+
+ $ hg status --color=always --cwd b/1
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+ $ hg status --color=always --cwd b/1 .
+ \x1b[0;35;1;4m? in_b_1\x1b[0m (esc)
+ $ hg status --color=always --cwd b/1 ..
+ \x1b[0;35;1;4m? in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../in_b\x1b[0m (esc)
+
+ $ hg status --color=always --cwd b/2
+ \x1b[0;35;1;4m? a/1/in_a_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? a/in_a\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/2/in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? b/in_b\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_root\x1b[0m (esc)
+ $ hg status --color=always --cwd b/2 .
+ \x1b[0;35;1;4m? in_b_2\x1b[0m (esc)
+ $ hg status --color=always --cwd b/2 ..
+ \x1b[0;35;1;4m? ../1/in_b_1\x1b[0m (esc)
+ \x1b[0;35;1;4m? in_b_2\x1b[0m (esc)
+ \x1b[0;35;1;4m? ../in_b\x1b[0m (esc)
+ $ cd ..
+
+ $ hg init repo2
+ $ cd repo2
+ $ touch modified removed deleted ignored
+ $ echo "^ignored$" > .hgignore
+ $ hg ci -A -m 'initial checkin'
+ adding .hgignore
+ adding deleted
+ adding modified
+ adding removed
+ $ touch modified added unknown ignored
+ $ hg add added
+ $ hg remove removed
+ $ rm deleted
+
+hg status:
+
+ $ hg status --color=always
+ \x1b[0;32;1mA added\x1b[0m (esc)
+ \x1b[0;31;1mR removed\x1b[0m (esc)
+ \x1b[0;36;1;4m! deleted\x1b[0m (esc)
+ \x1b[0;35;1;4m? unknown\x1b[0m (esc)
+
+hg status modified added removed deleted unknown never-existed ignored:
+
+ $ hg status --color=always modified added removed deleted unknown never-existed ignored
+ never-existed: * (glob)
+ \x1b[0;32;1mA added\x1b[0m (esc)
+ \x1b[0;31;1mR removed\x1b[0m (esc)
+ \x1b[0;36;1;4m! deleted\x1b[0m (esc)
+ \x1b[0;35;1;4m? unknown\x1b[0m (esc)
+
+ $ hg copy modified copied
+
+hg status -C:
+
+ $ hg status --color=always -C
+ \x1b[0;32;1mA added\x1b[0m (esc)
+ \x1b[0;32;1mA copied\x1b[0m (esc)
+ \x1b[0;0m modified\x1b[0m (esc)
+ \x1b[0;31;1mR removed\x1b[0m (esc)
+ \x1b[0;36;1;4m! deleted\x1b[0m (esc)
+ \x1b[0;35;1;4m? unknown\x1b[0m (esc)
+
+hg status -A:
+
+ $ hg status --color=always -A
+ \x1b[0;32;1mA added\x1b[0m (esc)
+ \x1b[0;32;1mA copied\x1b[0m (esc)
+ \x1b[0;0m modified\x1b[0m (esc)
+ \x1b[0;31;1mR removed\x1b[0m (esc)
+ \x1b[0;36;1;4m! deleted\x1b[0m (esc)
+ \x1b[0;35;1;4m? unknown\x1b[0m (esc)
+ \x1b[0;30;1mI ignored\x1b[0m (esc)
+ \x1b[0;0mC .hgignore\x1b[0m (esc)
+ \x1b[0;0mC modified\x1b[0m (esc)
+
+hg status -A (with terminfo color):
+
+ $ mkdir "$TESTTMP/terminfo"
+ $ TERMINFO="$TESTTMP/terminfo" tic "$TESTDIR/hgterm.ti"
+ $ TERM=hgterm TERMINFO="$TESTTMP/terminfo" hg status --config color.mode=terminfo --color=always -A
+ \x1b[30m\x1b[32m\x1b[1mA added\x1b[30m (esc)
+ \x1b[30m\x1b[32m\x1b[1mA copied\x1b[30m (esc)
+ \x1b[30m\x1b[30m modified\x1b[30m (esc)
+ \x1b[30m\x1b[31m\x1b[1mR removed\x1b[30m (esc)
+ \x1b[30m\x1b[36m\x1b[1m\x1b[4m! deleted\x1b[30m (esc)
+ \x1b[30m\x1b[35m\x1b[1m\x1b[4m? unknown\x1b[30m (esc)
+ \x1b[30m\x1b[30m\x1b[1mI ignored\x1b[30m (esc)
+ \x1b[30m\x1b[30mC .hgignore\x1b[30m (esc)
+ \x1b[30m\x1b[30mC modified\x1b[30m (esc)
+
+
+ $ echo "^ignoreddir$" > .hgignore
+ $ mkdir ignoreddir
+ $ touch ignoreddir/file
+
+hg status ignoreddir/file:
+
+ $ hg status --color=always ignoreddir/file
+
+hg status -i ignoreddir/file:
+
+ $ hg status --color=always -i ignoreddir/file
+ \x1b[0;30;1mI ignoreddir/file\x1b[0m (esc)
+ $ cd ..
+
+check 'status -q' and some combinations
+
+ $ hg init repo3
+ $ cd repo3
+ $ touch modified removed deleted ignored
+ $ echo "^ignored$" > .hgignore
+ $ hg commit -A -m 'initial checkin'
+ adding .hgignore
+ adding deleted
+ adding modified
+ adding removed
+ $ touch added unknown ignored
+ $ hg add added
+ $ echo "test" >> modified
+ $ hg remove removed
+ $ rm deleted
+ $ hg copy modified copied
+
+test unknown color
+
+ $ hg --config color.status.modified=periwinkle status --color=always
+ ignoring unknown color/effect 'periwinkle' (configured in color.status.modified)
+ M modified
+ \x1b[0;32;1mA added\x1b[0m (esc)
+ \x1b[0;32;1mA copied\x1b[0m (esc)
+ \x1b[0;31;1mR removed\x1b[0m (esc)
+ \x1b[0;36;1;4m! deleted\x1b[0m (esc)
+ \x1b[0;35;1;4m? unknown\x1b[0m (esc)
+
+Run status with 2 different flags.
+Check if result is the same or different.
+If result is not as expected, raise error
+
+ $ assert() {
+ > hg status --color=always $1 > ../a
+ > hg status --color=always $2 > ../b
+ > if diff ../a ../b > /dev/null; then
+ > out=0
+ > else
+ > out=1
+ > fi
+ > if [ $3 -eq 0 ]; then
+ > df="same"
+ > else
+ > df="different"
+ > fi
+ > if [ $out -ne $3 ]; then
+ > echo "Error on $1 and $2, should be $df."
+ > fi
+ > }
+
+assert flag1 flag2 [0-same | 1-different]
+
+ $ assert "-q" "-mard" 0
+ $ assert "-A" "-marduicC" 0
+ $ assert "-qA" "-mardcC" 0
+ $ assert "-qAui" "-A" 0
+ $ assert "-qAu" "-marducC" 0
+ $ assert "-qAi" "-mardicC" 0
+ $ assert "-qu" "-u" 0
+ $ assert "-q" "-u" 1
+ $ assert "-m" "-a" 1
+ $ assert "-r" "-d" 1
+ $ cd ..
+
+test 'resolve -l'
+
+ $ hg init repo4
+ $ cd repo4
+ $ echo "file a" > a
+ $ echo "file b" > b
+ $ hg add a b
+ $ hg commit -m "initial"
+ $ echo "file a change 1" > a
+ $ echo "file b change 1" > b
+ $ hg commit -m "head 1"
+ $ hg update 0
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "file a change 2" > a
+ $ echo "file b change 2" > b
+ $ hg commit -m "head 2"
+ created new head
+ $ hg merge
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ merging b
+ warning: conflicts during merge.
+ merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ hg resolve -m b
+
+hg resolve with one unresolved, one resolved:
+
+ $ hg resolve --color=always -l
+ \x1b[0;31;1mU a\x1b[0m (esc)
+ \x1b[0;32;1mR b\x1b[0m (esc)
+
+ $ cd ..
diff --git a/tests/test-status-inprocess.py b/tests/test-status-inprocess.py
new file mode 100755
index 0000000..8aadaa2
--- /dev/null
+++ b/tests/test-status-inprocess.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+from mercurial.ui import ui
+from mercurial.localrepo import localrepository
+from mercurial.commands import add, commit, status
+
+u = ui()
+
+print '% creating repo'
+repo = localrepository(u, '.', create=True)
+
+f = open('test.py', 'w')
+try:
+ f.write('foo\n')
+finally:
+ f.close
+
+print '% add and commit'
+add(u, repo, 'test.py')
+commit(u, repo, message='*')
+status(u, repo, clean=True)
+
+
+print '% change'
+f = open('test.py', 'w')
+try:
+ f.write('bar\n')
+finally:
+ f.close()
+
+# this would return clean instead of changed before the fix
+status(u, repo, clean=True, modified=True)
diff --git a/tests/test-status-inprocess.py.out b/tests/test-status-inprocess.py.out
new file mode 100644
index 0000000..f94bd06
--- /dev/null
+++ b/tests/test-status-inprocess.py.out
@@ -0,0 +1,5 @@
+% creating repo
+% add and commit
+C test.py
+% change
+M test.py
diff --git a/tests/test-status.t b/tests/test-status.t
new file mode 100644
index 0000000..8de94a1
--- /dev/null
+++ b/tests/test-status.t
@@ -0,0 +1,333 @@
+ $ hg init repo1
+ $ cd repo1
+ $ mkdir a b a/1 b/1 b/2
+ $ touch in_root a/in_a b/in_b a/1/in_a_1 b/1/in_b_1 b/2/in_b_2
+
+hg status in repo root:
+
+ $ hg status
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+
+hg status . in repo root:
+
+ $ hg status .
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+
+ $ hg status --cwd a
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+ $ hg status --cwd a .
+ ? 1/in_a_1
+ ? in_a
+ $ hg status --cwd a ..
+ ? 1/in_a_1
+ ? in_a
+ ? ../b/1/in_b_1
+ ? ../b/2/in_b_2
+ ? ../b/in_b
+ ? ../in_root
+
+ $ hg status --cwd b
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+ $ hg status --cwd b .
+ ? 1/in_b_1
+ ? 2/in_b_2
+ ? in_b
+ $ hg status --cwd b ..
+ ? ../a/1/in_a_1
+ ? ../a/in_a
+ ? 1/in_b_1
+ ? 2/in_b_2
+ ? in_b
+ ? ../in_root
+
+ $ hg status --cwd a/1
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+ $ hg status --cwd a/1 .
+ ? in_a_1
+ $ hg status --cwd a/1 ..
+ ? in_a_1
+ ? ../in_a
+
+ $ hg status --cwd b/1
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+ $ hg status --cwd b/1 .
+ ? in_b_1
+ $ hg status --cwd b/1 ..
+ ? in_b_1
+ ? ../2/in_b_2
+ ? ../in_b
+
+ $ hg status --cwd b/2
+ ? a/1/in_a_1
+ ? a/in_a
+ ? b/1/in_b_1
+ ? b/2/in_b_2
+ ? b/in_b
+ ? in_root
+ $ hg status --cwd b/2 .
+ ? in_b_2
+ $ hg status --cwd b/2 ..
+ ? ../1/in_b_1
+ ? in_b_2
+ ? ../in_b
+ $ cd ..
+
+ $ hg init repo2
+ $ cd repo2
+ $ touch modified removed deleted ignored
+ $ echo "^ignored$" > .hgignore
+ $ hg ci -A -m 'initial checkin'
+ adding .hgignore
+ adding deleted
+ adding modified
+ adding removed
+ $ touch modified added unknown ignored
+ $ hg add added
+ $ hg remove removed
+ $ rm deleted
+
+hg status:
+
+ $ hg status
+ A added
+ R removed
+ ! deleted
+ ? unknown
+
+hg status modified added removed deleted unknown never-existed ignored:
+
+ $ hg status modified added removed deleted unknown never-existed ignored
+ never-existed: * (glob)
+ A added
+ R removed
+ ! deleted
+ ? unknown
+
+ $ hg copy modified copied
+
+hg status -C:
+
+ $ hg status -C
+ A added
+ A copied
+ modified
+ R removed
+ ! deleted
+ ? unknown
+
+hg status -A:
+
+ $ hg status -A
+ A added
+ A copied
+ modified
+ R removed
+ ! deleted
+ ? unknown
+ I ignored
+ C .hgignore
+ C modified
+
+
+ $ echo "^ignoreddir$" > .hgignore
+ $ mkdir ignoreddir
+ $ touch ignoreddir/file
+
+hg status ignoreddir/file:
+
+ $ hg status ignoreddir/file
+
+hg status -i ignoreddir/file:
+
+ $ hg status -i ignoreddir/file
+ I ignoreddir/file
+ $ cd ..
+
+Check 'status -q' and some combinations
+
+ $ hg init repo3
+ $ cd repo3
+ $ touch modified removed deleted ignored
+ $ echo "^ignored$" > .hgignore
+ $ hg commit -A -m 'initial checkin'
+ adding .hgignore
+ adding deleted
+ adding modified
+ adding removed
+ $ touch added unknown ignored
+ $ hg add added
+ $ echo "test" >> modified
+ $ hg remove removed
+ $ rm deleted
+ $ hg copy modified copied
+
+Run status with 2 different flags.
+Check if result is the same or different.
+If result is not as expected, raise error
+
+ $ assert() {
+ > hg status $1 > ../a
+ > hg status $2 > ../b
+ > if diff ../a ../b > /dev/null; then
+ > out=0
+ > else
+ > out=1
+ > fi
+ > if [ $3 -eq 0 ]; then
+ > df="same"
+ > else
+ > df="different"
+ > fi
+ > if [ $out -ne $3 ]; then
+ > echo "Error on $1 and $2, should be $df."
+ > fi
+ > }
+
+Assert flag1 flag2 [0-same | 1-different]
+
+ $ assert "-q" "-mard" 0
+ $ assert "-A" "-marduicC" 0
+ $ assert "-qA" "-mardcC" 0
+ $ assert "-qAui" "-A" 0
+ $ assert "-qAu" "-marducC" 0
+ $ assert "-qAi" "-mardicC" 0
+ $ assert "-qu" "-u" 0
+ $ assert "-q" "-u" 1
+ $ assert "-m" "-a" 1
+ $ assert "-r" "-d" 1
+ $ cd ..
+
+ $ hg init repo4
+ $ cd repo4
+ $ touch modified removed deleted
+ $ hg ci -q -A -m 'initial checkin'
+ $ touch added unknown
+ $ hg add added
+ $ hg remove removed
+ $ rm deleted
+ $ echo x > modified
+ $ hg copy modified copied
+ $ hg ci -m 'test checkin' -d "1000001 0"
+ $ rm *
+ $ touch unrelated
+ $ hg ci -q -A -m 'unrelated checkin' -d "1000002 0"
+
+hg status --change 1:
+
+ $ hg status --change 1
+ M modified
+ A added
+ A copied
+ R removed
+
+hg status --change 1 unrelated:
+
+ $ hg status --change 1 unrelated
+
+hg status -C --change 1 added modified copied removed deleted:
+
+ $ hg status -C --change 1 added modified copied removed deleted
+ M modified
+ A added
+ A copied
+ modified
+ R removed
+
+hg status -A --change 1 and revset:
+
+ $ hg status -A --change '1|1'
+ M modified
+ A added
+ A copied
+ modified
+ R removed
+ C deleted
+
+ $ cd ..
+
+hg status of binary file starting with '\1\n', a separator for metadata:
+
+ $ hg init repo5
+ $ cd repo5
+ >>> open("010a", "wb").write("\1\nfoo")
+ $ hg ci -q -A -m 'initial checkin'
+ $ hg status -A
+ C 010a
+
+ >>> open("010a", "wb").write("\1\nbar")
+ $ hg status -A
+ M 010a
+ $ hg ci -q -m 'modify 010a'
+ $ hg status -A --rev 0:1
+ M 010a
+
+ $ touch empty
+ $ hg ci -q -A -m 'add another file'
+ $ hg status -A --rev 1:2 010a
+ C 010a
+
+ $ cd ..
+
+test "hg status" with "directory pattern" which matches against files
+only known on target revision.
+
+ $ hg init repo6
+ $ cd repo6
+
+ $ echo a > a.txt
+ $ hg add a.txt
+ $ hg commit -m '#0'
+ $ mkdir -p 1/2/3/4/5
+ $ echo b > 1/2/3/4/5/b.txt
+ $ hg add 1/2/3/4/5/b.txt
+ $ hg commit -m '#1'
+
+ $ hg update -C 0 > /dev/null
+ $ hg status -A
+ C a.txt
+
+the directory matching against specified pattern should be removed,
+because directory existence prevents 'dirstate.walk()' from showing
+warning message about such pattern.
+
+ $ test ! -d 1
+ $ hg status -A --rev 1 1/2/3/4/5/b.txt
+ R 1/2/3/4/5/b.txt
+ $ hg status -A --rev 1 1/2/3/4/5
+ R 1/2/3/4/5/b.txt
+ $ hg status -A --rev 1 1/2/3
+ R 1/2/3/4/5/b.txt
+ $ hg status -A --rev 1 1
+ R 1/2/3/4/5/b.txt
+
+ $ cd ..
diff --git a/tests/test-strict.t b/tests/test-strict.t
new file mode 100644
index 0000000..0e108cb
--- /dev/null
+++ b/tests/test-strict.t
@@ -0,0 +1,49 @@
+ $ hg init
+
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg an a
+ 0: a
+
+ $ hg --config ui.strict=False an a
+ 0: a
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "strict=True" >> $HGRCPATH
+
+ $ hg an a
+ hg: unknown command 'an'
+ Mercurial Distributed SCM
+
+ basic commands:
+
+ add add the specified files on the next commit
+ annotate show changeset information by line for each file
+ clone make a copy of an existing repository
+ commit commit the specified files or all outstanding changes
+ diff diff repository (or selected files)
+ export dump the header and diffs for one or more changesets
+ forget forget the specified files on the next commit
+ init create a new repository in the given directory
+ log show revision history of entire repository or files
+ merge merge working directory with another revision
+ phase set or show the current phase name
+ pull pull changes from the specified source
+ push push changes to the specified destination
+ remove remove the specified files on the next commit
+ serve start stand-alone webserver
+ status show changed files in the working directory
+ summary summarize working directory state
+ update update working directory (or switch revisions)
+
+ use "hg help" for the full list of commands or "hg -v" for details
+ [255]
+ $ hg annotate a
+ 0: a
+
+should succeed - up is an alias, not an abbreviation
+
+ $ hg up
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff --git a/tests/test-strip-cross.t b/tests/test-strip-cross.t
new file mode 100644
index 0000000..95bc17b
--- /dev/null
+++ b/tests/test-strip-cross.t
@@ -0,0 +1,143 @@
+test stripping of filelogs where the linkrev doesn't always increase
+
+ $ echo '[extensions]' >> $HGRCPATH
+ $ echo 'hgext.mq =' >> $HGRCPATH
+ $ hg init orig
+ $ cd orig
+ $ commit()
+ > {
+ > hg up -qC null
+ > count=1
+ > for i in "$@"; do
+ > for f in $i; do
+ > echo $count > $f
+ > done
+ > count=`expr $count + 1`
+ > done
+ > hg commit -qAm "$*"
+ > }
+
+2 1 0 2 0 1 2
+
+ $ commit '201 210'
+ $ commit '102 120' '210'
+ $ commit '021'
+ $ commit '201' '021 120'
+ $ commit '012 021' '102 201' '120 210'
+ $ commit 'manifest-file'
+ $ commit '102 120' '012 210' '021 201'
+ $ commit '201 210' '021 120' '012 102'
+ $ HGUSER=another-user; export HGUSER
+ $ commit 'manifest-file'
+ $ commit '012' 'manifest-file'
+ $ cd ..
+ $ hg clone -q -U -r -1 -r -2 -r -3 -r -4 -r -6 orig crossed
+ $ cd crossed
+ $ hg debugindex --manifest
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 112 ..... 0 6f105cbb914d 000000000000 000000000000 (re)
+ 1 112 56 ..... 3 1b55917b3699 000000000000 000000000000 (re)
+ 2 168 123 ..... 1 8f3d04e263e5 000000000000 000000000000 (re)
+ 3 291 122 ..... 2 f0ef8726ac4f 000000000000 000000000000 (re)
+ 4 413 87 ..... 4 0b76e38b4070 000000000000 000000000000 (re)
+
+ $ for i in 012 021 102 120 201 210 manifest-file; do
+ > echo $i
+ > hg debugindex $i
+ > echo
+ > done
+ 012
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 1 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 2 2661d26c6496 000000000000 000000000000 (re)
+
+ 021
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 0 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 2 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 1 2661d26c6496 000000000000 000000000000 (re)
+
+ 102
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 1 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 0 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 2 2661d26c6496 000000000000 000000000000 (re)
+
+ 120
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 1 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 2 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 0 2661d26c6496 000000000000 000000000000 (re)
+
+ 201
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 2 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 0 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 1 2661d26c6496 000000000000 000000000000 (re)
+
+ 210
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 2 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 1 5d9299349fc0 000000000000 000000000000 (re)
+ 2 6 3 ..... 0 2661d26c6496 000000000000 000000000000 (re)
+
+ manifest-file
+ rev offset length ..... linkrev nodeid p1 p2 (re)
+ 0 0 3 ..... 3 b8e02f643373 000000000000 000000000000 (re)
+ 1 3 3 ..... 4 5d9299349fc0 000000000000 000000000000 (re)
+
+ $ cd ..
+ $ for i in 0 1 2 3 4; do
+ > hg clone -q -U --pull crossed $i
+ > echo "% Trying to strip revision $i"
+ > hg --cwd $i strip $i
+ > echo "% Verifying"
+ > hg --cwd $i verify
+ > echo
+ > done
+ % Trying to strip revision 0
+ saved backup bundle to $TESTTMP/0/.hg/strip-backup/*-backup.hg (glob)
+ % Verifying
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 7 files, 4 changesets, 15 total revisions
+
+ % Trying to strip revision 1
+ saved backup bundle to $TESTTMP/1/.hg/strip-backup/*-backup.hg (glob)
+ % Verifying
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 7 files, 4 changesets, 14 total revisions
+
+ % Trying to strip revision 2
+ saved backup bundle to $TESTTMP/2/.hg/strip-backup/*-backup.hg (glob)
+ % Verifying
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 7 files, 4 changesets, 14 total revisions
+
+ % Trying to strip revision 3
+ saved backup bundle to $TESTTMP/3/.hg/strip-backup/*-backup.hg (glob)
+ % Verifying
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 7 files, 4 changesets, 19 total revisions
+
+ % Trying to strip revision 4
+ saved backup bundle to $TESTTMP/4/.hg/strip-backup/*-backup.hg (glob)
+ % Verifying
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 7 files, 4 changesets, 19 total revisions
+
diff --git a/tests/test-subrepo-deep-nested-change.t b/tests/test-subrepo-deep-nested-change.t
new file mode 100644
index 0000000..aa79c87
--- /dev/null
+++ b/tests/test-subrepo-deep-nested-change.t
@@ -0,0 +1,264 @@
+Preparing the subrepository 'sub2'
+
+ $ hg init sub2
+ $ echo sub2 > sub2/sub2
+ $ hg add -R sub2
+ adding sub2/sub2 (glob)
+ $ hg commit -R sub2 -m "sub2 import"
+
+Preparing the 'sub1' repo which depends on the subrepo 'sub2'
+
+ $ hg init sub1
+ $ echo sub1 > sub1/sub1
+ $ echo "sub2 = ../sub2" > sub1/.hgsub
+ $ hg clone sub2 sub1/sub2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg add -R sub1
+ adding sub1/.hgsub (glob)
+ adding sub1/sub1 (glob)
+ $ hg commit -R sub1 -m "sub1 import"
+
+Preparing the 'main' repo which depends on the subrepo 'sub1'
+
+ $ hg init main
+ $ echo main > main/main
+ $ echo "sub1 = ../sub1" > main/.hgsub
+ $ hg clone sub1 main/sub1
+ updating to branch default
+ cloning subrepo sub2 from $TESTTMP/sub2
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg add -R main
+ adding main/.hgsub (glob)
+ adding main/main (glob)
+ $ hg commit -R main -m "main import"
+
+Cleaning both repositories, just as a clone -U
+
+ $ hg up -C -R sub2 null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg up -C -R sub1 null
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ hg up -C -R main null
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ rm -rf main/sub1
+ $ rm -rf sub1/sub2
+
+Clone main
+
+ $ hg clone main cloned
+ updating to branch default
+ cloning subrepo sub1 from $TESTTMP/sub1
+ cloning subrepo sub1/sub2 from $TESTTMP/sub2 (glob)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Checking cloned repo ids
+
+ $ printf "cloned " ; hg id -R cloned
+ cloned 7f491f53a367 tip
+ $ printf "cloned/sub1 " ; hg id -R cloned/sub1
+ cloned/sub1 fc3b4ce2696f tip
+ $ printf "cloned/sub1/sub2 " ; hg id -R cloned/sub1/sub2
+ cloned/sub1/sub2 c57a0840e3ba tip
+
+debugsub output for main and sub1
+
+ $ hg debugsub -R cloned
+ path sub1
+ source ../sub1
+ revision fc3b4ce2696f7741438c79207583768f2ce6b0dd
+ $ hg debugsub -R cloned/sub1
+ path sub2
+ source ../sub2
+ revision c57a0840e3badd667ef3c3ef65471609acb2ba3c
+
+Modifying deeply nested 'sub2'
+
+ $ echo modified > cloned/sub1/sub2/sub2
+ $ hg commit --subrepos -m "deep nested modif should trigger a commit" -R cloned
+ committing subrepository sub1
+ committing subrepository sub1/sub2 (glob)
+
+Checking modified node ids
+
+ $ printf "cloned " ; hg id -R cloned
+ cloned ffe6649062fe tip
+ $ printf "cloned/sub1 " ; hg id -R cloned/sub1
+ cloned/sub1 2ecb03bf44a9 tip
+ $ printf "cloned/sub1/sub2 " ; hg id -R cloned/sub1/sub2
+ cloned/sub1/sub2 53dd3430bcaf tip
+
+debugsub output for main and sub1
+
+ $ hg debugsub -R cloned
+ path sub1
+ source ../sub1
+ revision 2ecb03bf44a94e749e8669481dd9069526ce7cb9
+ $ hg debugsub -R cloned/sub1
+ path sub2
+ source ../sub2
+ revision 53dd3430bcaf5ab4a7c48262bcad6d441f510487
+
+Check that deep archiving works
+
+ $ cd cloned
+ $ echo 'test' > sub1/sub2/test.txt
+ $ hg --config extensions.largefiles=! add sub1/sub2/test.txt
+ $ mkdir sub1/sub2/folder
+ $ echo 'subfolder' > sub1/sub2/folder/test.txt
+ $ hg --config extensions.largefiles=! add sub1/sub2/folder/test.txt
+ $ hg ci -Sm "add test.txt"
+ committing subrepository sub1
+ committing subrepository sub1/sub2 (glob)
+ $ hg --config extensions.largefiles=! archive -S ../archive_all
+ $ find ../archive_all | sort
+ ../archive_all
+ ../archive_all/.hg_archival.txt
+ ../archive_all/.hgsub
+ ../archive_all/.hgsubstate
+ ../archive_all/main
+ ../archive_all/sub1
+ ../archive_all/sub1/.hgsub
+ ../archive_all/sub1/.hgsubstate
+ ../archive_all/sub1/sub1
+ ../archive_all/sub1/sub2
+ ../archive_all/sub1/sub2/folder
+ ../archive_all/sub1/sub2/folder/test.txt
+ ../archive_all/sub1/sub2/sub2
+ ../archive_all/sub1/sub2/test.txt
+
+Check that archive -X works in deep subrepos
+
+ $ hg --config extensions.largefiles=! archive -S -X '**test*' ../archive_exclude
+ $ find ../archive_exclude | sort
+ ../archive_exclude
+ ../archive_exclude/.hg_archival.txt
+ ../archive_exclude/.hgsub
+ ../archive_exclude/.hgsubstate
+ ../archive_exclude/main
+ ../archive_exclude/sub1
+ ../archive_exclude/sub1/.hgsub
+ ../archive_exclude/sub1/.hgsubstate
+ ../archive_exclude/sub1/sub1
+ ../archive_exclude/sub1/sub2
+ ../archive_exclude/sub1/sub2/sub2
+
+ $ hg --config extensions.largefiles=! archive -S -I '**test*' ../archive_include
+ $ find ../archive_include | sort
+ ../archive_include
+ ../archive_include/sub1
+ ../archive_include/sub1/sub2
+ ../archive_include/sub1/sub2/folder
+ ../archive_include/sub1/sub2/folder/test.txt
+ ../archive_include/sub1/sub2/test.txt
+
+Check that deep archive works with largefiles (which overrides hgsubrepo impl)
+This also tests the repo.ui regression in 43fb170a23bd, and that lf subrepo
+subrepos are archived properly.
+Note that add --large through a subrepo currently adds the file as a normal file
+
+ $ echo "large" > sub1/sub2/large.bin
+ $ hg --config extensions.largefiles= add --large -R sub1/sub2 sub1/sub2/large.bin
+ $ echo "large" > large.bin
+ $ hg --config extensions.largefiles= add --large large.bin
+ $ hg --config extensions.largefiles= ci -S -m "add large files"
+ committing subrepository sub1
+ committing subrepository sub1/sub2 (glob)
+
+ $ hg --config extensions.largefiles= archive -S ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/.hg_archival.txt
+ ../archive_lf/.hgsub
+ ../archive_lf/.hgsubstate
+ ../archive_lf/large.bin
+ ../archive_lf/main
+ ../archive_lf/sub1
+ ../archive_lf/sub1/.hgsub
+ ../archive_lf/sub1/.hgsubstate
+ ../archive_lf/sub1/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/folder
+ ../archive_lf/sub1/sub2/folder/test.txt
+ ../archive_lf/sub1/sub2/large.bin
+ ../archive_lf/sub1/sub2/sub2
+ ../archive_lf/sub1/sub2/test.txt
+ $ rm -rf ../archive_lf
+
+Exclude large files from main and sub-sub repo
+
+ $ hg --config extensions.largefiles= archive -S -X '**.bin' ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/.hg_archival.txt
+ ../archive_lf/.hgsub
+ ../archive_lf/.hgsubstate
+ ../archive_lf/main
+ ../archive_lf/sub1
+ ../archive_lf/sub1/.hgsub
+ ../archive_lf/sub1/.hgsubstate
+ ../archive_lf/sub1/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/folder
+ ../archive_lf/sub1/sub2/folder/test.txt
+ ../archive_lf/sub1/sub2/sub2
+ ../archive_lf/sub1/sub2/test.txt
+ $ rm -rf ../archive_lf
+
+Exclude normal files from main and sub-sub repo
+
+ $ hg --config extensions.largefiles= archive -S -X '**.txt' ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/.hgsub
+ ../archive_lf/.hgsubstate
+ ../archive_lf/large.bin
+ ../archive_lf/main
+ ../archive_lf/sub1
+ ../archive_lf/sub1/.hgsub
+ ../archive_lf/sub1/.hgsubstate
+ ../archive_lf/sub1/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/large.bin
+ ../archive_lf/sub1/sub2/sub2
+ $ rm -rf ../archive_lf
+
+Include normal files from within a largefiles subrepo
+
+ $ hg --config extensions.largefiles= archive -S -I '**.txt' ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/.hg_archival.txt
+ ../archive_lf/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/folder
+ ../archive_lf/sub1/sub2/folder/test.txt
+ ../archive_lf/sub1/sub2/test.txt
+ $ rm -rf ../archive_lf
+
+Include large files from within a largefiles subrepo
+
+ $ hg --config extensions.largefiles= archive -S -I '**.bin' ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/large.bin
+ ../archive_lf/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/large.bin
+ $ rm -rf ../archive_lf
+
+Find an exact largefile match in a largefiles subrepo
+
+ $ hg --config extensions.largefiles= archive -S -I 'sub1/sub2/large.bin' ../archive_lf
+ $ find ../archive_lf | sort
+ ../archive_lf
+ ../archive_lf/sub1
+ ../archive_lf/sub1/sub2
+ ../archive_lf/sub1/sub2/large.bin
+ $ rm -rf ../archive_lf
+
+Find an exact match to a standin (should archive nothing)
+ $ hg --config extensions.largefiles= archive -S -I 'sub/sub2/.hglf/large.bin' ../archive_lf
+ $ find ../archive_lf 2> /dev/null | sort
+
+ $ cd ..
diff --git a/tests/test-subrepo-git.t b/tests/test-subrepo-git.t
new file mode 100644
index 0000000..3f06a46
--- /dev/null
+++ b/tests/test-subrepo-git.t
@@ -0,0 +1,534 @@
+ $ "$TESTDIR/hghave" git || exit 80
+
+make git commits repeatable
+
+ $ echo "[core]" >> $HOME/.gitconfig
+ $ echo "autocrlf = false" >> $HOME/.gitconfig
+ $ GIT_AUTHOR_NAME='test'; export GIT_AUTHOR_NAME
+ $ GIT_AUTHOR_EMAIL='test@example.org'; export GIT_AUTHOR_EMAIL
+ $ GIT_AUTHOR_DATE='1234567891 +0000'; export GIT_AUTHOR_DATE
+ $ GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; export GIT_COMMITTER_NAME
+ $ GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"; export GIT_COMMITTER_EMAIL
+ $ GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"; export GIT_COMMITTER_DATE
+
+root hg repo
+
+ $ hg init t
+ $ cd t
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m a
+ $ cd ..
+
+new external git repo
+
+ $ mkdir gitroot
+ $ cd gitroot
+ $ git init -q
+ $ echo g > g
+ $ git add g
+ $ git commit -q -m g
+
+add subrepo clone
+
+ $ cd ../t
+ $ echo 's = [git]../gitroot' > .hgsub
+ $ git clone -q ../gitroot s
+ $ hg add .hgsub
+ $ hg commit -m 'new git subrepo'
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+
+record a new commit from upstream from a different branch
+
+ $ cd ../gitroot
+ $ git checkout -q -b testing
+ $ echo gg >> g
+ $ git commit -q -a -m gg
+
+ $ cd ../t/s
+ $ git pull -q >/dev/null 2>/dev/null
+ $ git checkout -q -b testing origin/testing >/dev/null
+
+ $ cd ..
+ $ hg status --subrepos
+ M s/g
+ $ hg commit -m 'update git subrepo'
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision 126f2a14290cd5ce061fdedc430170e8d39e1c5a
+
+make $GITROOT pushable, by replacing it with a clone with nothing checked out
+
+ $ cd ..
+ $ git clone gitroot gitrootbare --bare -q
+ $ rm -rf gitroot
+ $ mv gitrootbare gitroot
+
+clone root
+
+ $ cd t
+ $ hg clone . ../tc
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../tc
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision 126f2a14290cd5ce061fdedc430170e8d39e1c5a
+
+update to previous substate
+
+ $ hg update 1 -q
+ $ cat s/g
+ g
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+
+clone root, make local change
+
+ $ cd ../t
+ $ hg clone . ../ta
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ../ta
+ $ echo ggg >> s/g
+ $ hg status --subrepos
+ M s/g
+ $ hg commit --subrepos -m ggg
+ committing subrepository s
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision 79695940086840c99328513acbe35f90fcd55e57
+
+clone root separately, make different local change
+
+ $ cd ../t
+ $ hg clone . ../tb
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ../tb/s
+ $ echo f > f
+ $ git add f
+ $ cd ..
+
+ $ hg status --subrepos
+ A s/f
+ $ hg commit --subrepos -m f
+ committing subrepository s
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision aa84837ccfbdfedcdcdeeedc309d73e6eb069edc
+
+user b push changes
+
+ $ hg push 2>/dev/null
+ pushing to $TESTTMP/t (glob)
+ pushing branch testing of subrepo s
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+user a pulls, merges, commits
+
+ $ cd ../ta
+ $ hg pull
+ pulling from $TESTTMP/t (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ $ hg merge 2>/dev/null
+ pulling subrepo s from $TESTTMP/gitroot
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ cat s/f
+ f
+ $ cat s/g
+ g
+ gg
+ ggg
+ $ hg commit --subrepos -m 'merge'
+ committing subrepository s
+ $ hg status --subrepos --rev 1:5
+ M .hgsubstate
+ M s/g
+ A s/f
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision f47b465e1bce645dbf37232a00574aa1546ca8d3
+ $ hg push 2>/dev/null
+ pushing to $TESTTMP/t (glob)
+ pushing branch testing of subrepo s
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+
+make upstream git changes
+
+ $ cd ..
+ $ git clone -q gitroot gitclone
+ $ cd gitclone
+ $ echo ff >> f
+ $ git commit -q -a -m ff
+ $ echo fff >> f
+ $ git commit -q -a -m fff
+ $ git push origin testing 2>/dev/null
+
+make and push changes to hg without updating the subrepo
+
+ $ cd ../t
+ $ hg clone . ../td
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ checking out detached HEAD in subrepo s
+ check out a git branch if you intend to make changes
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../td
+ $ echo aa >> a
+ $ hg commit -m aa
+ $ hg push
+ pushing to $TESTTMP/t (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+sync to upstream git, distribute changes
+
+ $ cd ../ta
+ $ hg pull -u -q
+ $ cd s
+ $ git pull -q >/dev/null 2>/dev/null
+ $ cd ..
+ $ hg commit -m 'git upstream sync'
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+ $ hg push -q
+
+ $ cd ../tb
+ $ hg pull -q
+ $ hg update 2>/dev/null
+ pulling subrepo s from $TESTTMP/gitroot
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg debugsub
+ path s
+ source ../gitroot
+ revision 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+
+update to a revision without the subrepo, keeping the local git repository
+
+ $ cd ../t
+ $ hg up 0
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ ls -a s
+ .
+ ..
+ .git
+
+ $ hg up 2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ ls -a s
+ .
+ ..
+ .git
+ g
+
+archive subrepos
+
+ $ cd ../tc
+ $ hg pull -q
+ $ hg archive --subrepos -r 5 ../archive 2>/dev/null
+ pulling subrepo s from $TESTTMP/gitroot
+ $ cd ../archive
+ $ cat s/f
+ f
+ $ cat s/g
+ g
+ gg
+ ggg
+
+ $ hg -R ../tc archive --subrepo -r 5 -X ../tc/**f ../archive_x 2>/dev/null
+ $ find ../archive_x | sort | grep -v pax_global_header
+ ../archive_x
+ ../archive_x/.hg_archival.txt
+ ../archive_x/.hgsub
+ ../archive_x/.hgsubstate
+ ../archive_x/a
+ ../archive_x/s
+ ../archive_x/s/g
+
+create nested repo
+
+ $ cd ..
+ $ hg init outer
+ $ cd outer
+ $ echo b>b
+ $ hg add b
+ $ hg commit -m b
+
+ $ hg clone ../t inner
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo inner = inner > .hgsub
+ $ hg add .hgsub
+ $ hg commit -m 'nested sub'
+
+nested commit
+
+ $ echo ffff >> inner/s/f
+ $ hg status --subrepos
+ M inner/s/f
+ $ hg commit --subrepos -m nested
+ committing subrepository inner
+ committing subrepository inner/s (glob)
+
+nested archive
+
+ $ hg archive --subrepos ../narchive
+ $ ls ../narchive/inner/s | grep -v pax_global_header
+ f
+ g
+
+relative source expansion
+
+ $ cd ..
+ $ mkdir d
+ $ hg clone t d/t
+ updating to branch default
+ cloning subrepo s from $TESTTMP/gitroot
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Don't crash if the subrepo is missing
+
+ $ hg clone t missing -q
+ $ cd missing
+ $ rm -rf s
+ $ hg status -S
+ $ hg sum | grep commit
+ commit: 1 subrepos
+ $ hg push -q
+ abort: subrepo s is missing
+ [255]
+ $ hg commit --subrepos -qm missing
+ abort: subrepo s is missing
+ [255]
+ $ hg update -C
+ cloning subrepo s from $TESTTMP/gitroot
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg sum | grep commit
+ commit: (clean)
+
+Don't crash if the .hgsubstate entry is missing
+
+ $ hg update 1 -q
+ $ hg rm .hgsubstate
+ $ hg commit .hgsubstate -m 'no substate'
+ nothing changed
+ [1]
+ $ hg tag -l nosubstate
+ $ hg manifest
+ .hgsub
+ .hgsubstate
+ a
+
+ $ hg status -S
+ R .hgsubstate
+ $ hg sum | grep commit
+ commit: 1 removed, 1 subrepos (new branch head)
+
+ $ hg commit -m 'restore substate'
+ nothing changed
+ [1]
+ $ hg manifest
+ .hgsub
+ .hgsubstate
+ a
+ $ hg sum | grep commit
+ commit: 1 removed, 1 subrepos (new branch head)
+
+ $ hg update -qC nosubstate
+ $ ls s
+ g
+
+issue3109: false positives in git diff-index
+
+ $ hg update -q
+ $ touch -t 200001010000 s/g
+ $ hg status --subrepos
+ $ touch -t 200001010000 s/g
+ $ hg sum | grep commit
+ commit: (clean)
+
+Check hg update --clean
+ $ cd $TESTTMP/ta
+ $ echo > s/g
+ $ cd s
+ $ echo c1 > f1
+ $ echo c1 > f2
+ $ git add f1
+ $ cd ..
+ $ hg status -S
+ M s/g
+ A s/f1
+ $ ls s
+ f
+ f1
+ f2
+ g
+ $ hg update --clean
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status -S
+ $ ls s
+ f
+ f1
+ f2
+ g
+
+Sticky subrepositories, no changes
+ $ cd $TESTTMP/ta
+ $ hg id -n
+ 7
+ $ cd s
+ $ git rev-parse HEAD
+ 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+ $ cd ..
+ $ hg update 1 > /dev/null 2>&1
+ $ hg id -n
+ 1
+ $ cd s
+ $ git rev-parse HEAD
+ da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+ $ cd ..
+
+Sticky subrepositorys, file changes
+ $ touch s/f1
+ $ cd s
+ $ git add f1
+ $ cd ..
+ $ hg id -n
+ 1+
+ $ cd s
+ $ git rev-parse HEAD
+ da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+ $ cd ..
+ $ hg update 4
+ subrepository sources for s differ
+ use (l)ocal source (da5f5b1) or (r)emote source (aa84837)?
+ l
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 4+
+ $ cd s
+ $ git rev-parse HEAD
+ da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+ $ cd ..
+ $ hg update --clean tip > /dev/null 2>&1
+
+Sticky subrepository, revision updates
+ $ hg id -n
+ 7
+ $ cd s
+ $ git rev-parse HEAD
+ 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+ $ cd ..
+ $ cd s
+ $ git checkout aa84837ccfbdfedcdcdeeedc309d73e6eb069edc
+ Previous HEAD position was 32a3438... fff
+ HEAD is now at aa84837... f
+ $ cd ..
+ $ hg update 1
+ subrepository sources for s differ (in checked out version)
+ use (l)ocal source (32a3438) or (r)emote source (da5f5b1)?
+ l
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 1+
+ $ cd s
+ $ git rev-parse HEAD
+ aa84837ccfbdfedcdcdeeedc309d73e6eb069edc
+ $ cd ..
+
+Sticky subrepository, file changes and revision updates
+ $ touch s/f1
+ $ cd s
+ $ git add f1
+ $ git rev-parse HEAD
+ aa84837ccfbdfedcdcdeeedc309d73e6eb069edc
+ $ cd ..
+ $ hg id -n
+ 1+
+ $ hg update 7
+ subrepository sources for s differ
+ use (l)ocal source (32a3438) or (r)emote source (32a3438)?
+ l
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 7+
+ $ cd s
+ $ git rev-parse HEAD
+ aa84837ccfbdfedcdcdeeedc309d73e6eb069edc
+ $ cd ..
+
+Sticky repository, update --clean
+ $ hg update --clean tip 2>/dev/null
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 7
+ $ cd s
+ $ git rev-parse HEAD
+ 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+ $ cd ..
+
+Test subrepo already at intended revision:
+ $ cd s
+ $ git checkout 32a343883b74769118bb1d3b4b1fbf9156f4dddc
+ HEAD is now at 32a3438... fff
+ $ cd ..
+ $ hg update 1
+ Previous HEAD position was 32a3438... fff
+ HEAD is now at da5f5b1... g
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 1
+ $ cd s
+ $ git rev-parse HEAD
+ da5f5b1d8ffcf62fb8327bcd3c89a4367a6018e7
+ $ cd ..
+
+Test forgetting files, not implemented in git subrepo, used to
+traceback
+#if no-windows
+ $ hg forget 'notafile*'
+ notafile*: No such file or directory
+ [1]
+#else
+ $ hg forget 'notafile'
+ notafile: * (glob)
+ [1]
+#endif
+
+ $ cd ..
diff --git a/tests/test-subrepo-missing.t b/tests/test-subrepo-missing.t
new file mode 100644
index 0000000..fb6bca9
--- /dev/null
+++ b/tests/test-subrepo-missing.t
@@ -0,0 +1,71 @@
+ $ hg init repo
+ $ cd repo
+ $ hg init subrepo
+ $ echo a > subrepo/a
+ $ hg -R subrepo ci -Am adda
+ adding a
+ $ echo 'subrepo = subrepo' > .hgsub
+ $ hg ci -Am addsubrepo
+ adding .hgsub
+ $ echo b > subrepo/b
+ $ hg -R subrepo ci -Am addb
+ adding b
+ $ hg ci -m updatedsub
+
+ignore blanklines in .hgsubstate
+
+ >>> file('.hgsubstate', 'wb').write('\n\n \t \n \n')
+ $ hg st --subrepos
+ M .hgsubstate
+ $ hg revert -qC .hgsubstate
+
+abort more gracefully on .hgsubstate parsing error
+
+ $ cp .hgsubstate .hgsubstate.old
+ >>> file('.hgsubstate', 'wb').write('\ninvalid')
+ $ hg st --subrepos
+ abort: invalid subrepository revision specifier in .hgsubstate line 2
+ [255]
+ $ mv .hgsubstate.old .hgsubstate
+
+delete .hgsub and revert it
+
+ $ rm .hgsub
+ $ hg revert .hgsub
+ warning: subrepo spec file .hgsub not found
+ warning: subrepo spec file .hgsub not found
+
+delete .hgsubstate and revert it
+
+ $ rm .hgsubstate
+ $ hg revert .hgsubstate
+
+delete .hgsub and update
+
+ $ rm .hgsub
+ $ hg up 0
+ warning: subrepo spec file .hgsub not found
+ warning: subrepo spec file .hgsub not found
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+ warning: subrepo spec file .hgsub not found
+ ! .hgsub
+ $ ls subrepo
+ a
+
+delete .hgsubstate and update
+
+ $ hg up -C
+ warning: subrepo spec file .hgsub not found
+ warning: subrepo spec file .hgsub not found
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm .hgsubstate
+ $ hg up 0
+ remote changed .hgsubstate which local deleted
+ use (c)hanged version or leave (d)eleted? c
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+ $ ls subrepo
+ a
+
+ $ cd ..
diff --git a/tests/test-subrepo-paths.t b/tests/test-subrepo-paths.t
new file mode 100644
index 0000000..fd5c9c9
--- /dev/null
+++ b/tests/test-subrepo-paths.t
@@ -0,0 +1,61 @@
+ $ hg init outer
+ $ cd outer
+
+ $ echo '[paths]' >> .hg/hgrc
+ $ echo 'default = http://example.net/' >> .hg/hgrc
+
+hg debugsub with no remapping
+
+ $ echo 'sub = libfoo' > .hgsub
+ $ hg add .hgsub
+
+ $ hg debugsub
+ path sub
+ source libfoo
+ revision
+
+hg debugsub with remapping
+
+ $ echo '[subpaths]' >> .hg/hgrc
+ $ printf 'http://example.net/lib(.*) = C:\\libs\\\\1-lib\\\n' >> .hg/hgrc # no-check-code
+
+ $ hg debugsub
+ path sub
+ source C:\libs\foo-lib\
+ revision
+
+test cumulative remapping, the $HGRCPATH file is loaded first
+
+ $ echo '[subpaths]' >> $HGRCPATH
+ $ echo 'libfoo = libbar' >> $HGRCPATH
+ $ hg debugsub
+ path sub
+ source C:\libs\bar-lib\
+ revision
+
+test absolute source path -- testing with a URL is important since
+standard os.path.join wont treat that as an absolute path
+
+ $ echo 'abs = http://example.net/abs' > .hgsub
+ $ hg debugsub
+ path abs
+ source http://example.net/abs
+ revision
+
+ $ echo 'abs = /abs' > .hgsub
+ $ hg debugsub
+ path abs
+ source /abs
+ revision
+
+test bad subpaths pattern
+
+ $ cat > .hg/hgrc <<EOF
+ > [subpaths]
+ > .* = \1
+ > EOF
+ $ hg debugsub
+ abort: bad subrepository pattern in $TESTTMP/outer/.hg/hgrc:2: invalid group reference (glob)
+ [255]
+
+ $ cd ..
diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t
new file mode 100644
index 0000000..fa419b3
--- /dev/null
+++ b/tests/test-subrepo-recursion.t
@@ -0,0 +1,494 @@
+Create test repository:
+
+ $ hg init repo
+ $ cd repo
+ $ echo x1 > x.txt
+
+ $ hg init foo
+ $ cd foo
+ $ echo y1 > y.txt
+
+ $ hg init bar
+ $ cd bar
+ $ echo z1 > z.txt
+
+ $ cd ..
+ $ echo 'bar = bar' > .hgsub
+
+ $ cd ..
+ $ echo 'foo = foo' > .hgsub
+
+Add files --- .hgsub files must go first to trigger subrepos:
+
+ $ hg add -S .hgsub
+ $ hg add -S foo/.hgsub
+ $ hg add -S foo/bar
+ adding foo/bar/z.txt (glob)
+ $ hg add -S
+ adding x.txt
+ adding foo/y.txt (glob)
+
+Test recursive status without committing anything:
+
+ $ hg status -S
+ A .hgsub
+ A foo/.hgsub
+ A foo/bar/z.txt
+ A foo/y.txt
+ A x.txt
+
+Test recursive diff without committing anything:
+
+ $ hg diff --nodates -S foo
+ diff -r 000000000000 foo/.hgsub
+ --- /dev/null
+ +++ b/foo/.hgsub
+ @@ -0,0 +1,1 @@
+ +bar = bar
+ diff -r 000000000000 foo/y.txt
+ --- /dev/null
+ +++ b/foo/y.txt
+ @@ -0,0 +1,1 @@
+ +y1
+ diff -r 000000000000 foo/bar/z.txt
+ --- /dev/null
+ +++ b/foo/bar/z.txt
+ @@ -0,0 +1,1 @@
+ +z1
+
+Commits:
+
+ $ hg commit -m fails
+ abort: uncommitted changes in subrepo foo
+ (use --subrepos for recursive commit)
+ [255]
+
+The --subrepos flag overwrite the config setting:
+
+ $ hg commit -m 0-0-0 --config ui.commitsubrepos=No --subrepos
+ committing subrepository foo
+ committing subrepository foo/bar (glob)
+
+ $ cd foo
+ $ echo y2 >> y.txt
+ $ hg commit -m 0-1-0
+
+ $ cd bar
+ $ echo z2 >> z.txt
+ $ hg commit -m 0-1-1
+
+ $ cd ..
+ $ hg commit -m 0-2-1
+
+ $ cd ..
+ $ hg commit -m 1-2-1
+
+Change working directory:
+
+ $ echo y3 >> foo/y.txt
+ $ echo z3 >> foo/bar/z.txt
+ $ hg status -S
+ M foo/bar/z.txt
+ M foo/y.txt
+ $ hg diff --nodates -S
+ diff -r d254738c5f5e foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,2 +1,3 @@
+ y1
+ y2
+ +y3
+ diff -r 9647f22de499 foo/bar/z.txt
+ --- a/foo/bar/z.txt
+ +++ b/foo/bar/z.txt
+ @@ -1,2 +1,3 @@
+ z1
+ z2
+ +z3
+
+Status call crossing repository boundaries:
+
+ $ hg status -S foo/bar/z.txt
+ M foo/bar/z.txt
+ $ hg status -S -I 'foo/?.txt'
+ M foo/y.txt
+ $ hg status -S -I '**/?.txt'
+ M foo/bar/z.txt
+ M foo/y.txt
+ $ hg diff --nodates -S -I '**/?.txt'
+ diff -r d254738c5f5e foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,2 +1,3 @@
+ y1
+ y2
+ +y3
+ diff -r 9647f22de499 foo/bar/z.txt
+ --- a/foo/bar/z.txt
+ +++ b/foo/bar/z.txt
+ @@ -1,2 +1,3 @@
+ z1
+ z2
+ +z3
+
+Status from within a subdirectory:
+
+ $ mkdir dir
+ $ cd dir
+ $ echo a1 > a.txt
+ $ hg status -S
+ M foo/bar/z.txt
+ M foo/y.txt
+ ? dir/a.txt
+ $ hg diff --nodates -S
+ diff -r d254738c5f5e foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,2 +1,3 @@
+ y1
+ y2
+ +y3
+ diff -r 9647f22de499 foo/bar/z.txt
+ --- a/foo/bar/z.txt
+ +++ b/foo/bar/z.txt
+ @@ -1,2 +1,3 @@
+ z1
+ z2
+ +z3
+
+Status with relative path:
+
+ $ hg status -S ..
+ M ../foo/bar/z.txt
+ M ../foo/y.txt
+ ? a.txt
+ $ hg diff --nodates -S ..
+ diff -r d254738c5f5e foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,2 +1,3 @@
+ y1
+ y2
+ +y3
+ diff -r 9647f22de499 foo/bar/z.txt
+ --- a/foo/bar/z.txt
+ +++ b/foo/bar/z.txt
+ @@ -1,2 +1,3 @@
+ z1
+ z2
+ +z3
+ $ cd ..
+
+Cleanup and final commit:
+
+ $ rm -r dir
+ $ hg commit --subrepos -m 2-3-2
+ committing subrepository foo
+ committing subrepository foo/bar (glob)
+
+Test explicit path commands within subrepos: add/forget
+ $ echo z1 > foo/bar/z2.txt
+ $ hg status -S
+ ? foo/bar/z2.txt
+ $ hg add foo/bar/z2.txt
+ $ hg status -S
+ A foo/bar/z2.txt
+ $ hg forget foo/bar/z2.txt
+ $ hg status -S
+ ? foo/bar/z2.txt
+ $ hg forget foo/bar/z2.txt
+ not removing foo/bar/z2.txt: file is already untracked (glob)
+ [1]
+ $ hg status -S
+ ? foo/bar/z2.txt
+ $ rm foo/bar/z2.txt
+
+Log with the relationships between repo and its subrepo:
+
+ $ hg log --template '{rev}:{node|short} {desc}\n'
+ 2:1326fa26d0c0 2-3-2
+ 1:4b3c9ff4f66b 1-2-1
+ 0:23376cbba0d8 0-0-0
+
+ $ hg -R foo log --template '{rev}:{node|short} {desc}\n'
+ 3:65903cebad86 2-3-2
+ 2:d254738c5f5e 0-2-1
+ 1:8629ce7dcc39 0-1-0
+ 0:af048e97ade2 0-0-0
+
+ $ hg -R foo/bar log --template '{rev}:{node|short} {desc}\n'
+ 2:31ecbdafd357 2-3-2
+ 1:9647f22de499 0-1-1
+ 0:4904098473f9 0-0-0
+
+Status between revisions:
+
+ $ hg status -S
+ $ hg status -S --rev 0:1
+ M .hgsubstate
+ M foo/.hgsubstate
+ M foo/bar/z.txt
+ M foo/y.txt
+ $ hg diff --nodates -S -I '**/?.txt' --rev 0:1
+ diff -r af048e97ade2 -r d254738c5f5e foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,1 +1,2 @@
+ y1
+ +y2
+ diff -r 4904098473f9 -r 9647f22de499 foo/bar/z.txt
+ --- a/foo/bar/z.txt
+ +++ b/foo/bar/z.txt
+ @@ -1,1 +1,2 @@
+ z1
+ +z2
+
+Enable progress extension for archive tests:
+
+ $ cp $HGRCPATH $HGRCPATH.no-progress
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > progress =
+ > [progress]
+ > assume-tty = 1
+ > delay = 0
+ > format = topic bar number
+ > refresh = 0
+ > width = 60
+ > EOF
+
+Test archiving to a directory tree (the doubled lines in the output
+only show up in the test output, not in real usage):
+
+ $ hg archive --subrepos ../archive 2>&1 | "$TESTDIR/filtercr.py"
+
+ archiving [ ] 0/3
+ archiving [ ] 0/3
+ archiving [=============> ] 1/3
+ archiving [=============> ] 1/3
+ archiving [===========================> ] 2/3
+ archiving [===========================> ] 2/3
+ archiving [==========================================>] 3/3
+ archiving [==========================================>] 3/3
+
+ archiving (foo) [ ] 0/3
+ archiving (foo) [ ] 0/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [====================================>] 3/3
+ archiving (foo) [====================================>] 3/3
+
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+ \r (esc)
+ $ find ../archive | sort
+ ../archive
+ ../archive/.hg_archival.txt
+ ../archive/.hgsub
+ ../archive/.hgsubstate
+ ../archive/foo
+ ../archive/foo/.hgsub
+ ../archive/foo/.hgsubstate
+ ../archive/foo/bar
+ ../archive/foo/bar/z.txt
+ ../archive/foo/y.txt
+ ../archive/x.txt
+
+Test archiving to zip file (unzip output is unstable):
+
+ $ hg archive --subrepos ../archive.zip 2>&1 | "$TESTDIR/filtercr.py"
+
+ archiving [ ] 0/3
+ archiving [ ] 0/3
+ archiving [=============> ] 1/3
+ archiving [=============> ] 1/3
+ archiving [===========================> ] 2/3
+ archiving [===========================> ] 2/3
+ archiving [==========================================>] 3/3
+ archiving [==========================================>] 3/3
+
+ archiving (foo) [ ] 0/3
+ archiving (foo) [ ] 0/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [====================================>] 3/3
+ archiving (foo) [====================================>] 3/3
+
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+ \r (esc)
+
+Test archiving a revision that references a subrepo that is not yet
+cloned:
+
+ $ hg clone -U . ../empty
+ $ cd ../empty
+ $ hg archive --subrepos -r tip ../archive.tar.gz 2>&1 | "$TESTDIR/filtercr.py"
+
+ archiving [ ] 0/3
+ archiving [ ] 0/3
+ archiving [=============> ] 1/3
+ archiving [=============> ] 1/3
+ archiving [===========================> ] 2/3
+ archiving [===========================> ] 2/3
+ archiving [==========================================>] 3/3
+ archiving [==========================================>] 3/3
+
+ archiving (foo) [ ] 0/3
+ archiving (foo) [ ] 0/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [===========> ] 1/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [=======================> ] 2/3
+ archiving (foo) [====================================>] 3/3
+ archiving (foo) [====================================>] 3/3
+
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [ ] 0/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+ archiving (foo/bar) [================================>] 1/1 (glob)
+
+ cloning subrepo foo from $TESTTMP/repo/foo
+ cloning subrepo foo/bar from $TESTTMP/repo/foo/bar (glob)
+
+The newly cloned subrepos contain no working copy:
+
+ $ hg -R foo summary
+ parent: -1:000000000000 (no revision checked out)
+ branch: default
+ commit: (clean)
+ update: 4 new changesets (update)
+
+Disable progress extension and cleanup:
+
+ $ mv $HGRCPATH.no-progress $HGRCPATH
+
+Test archiving when there is a directory in the way for a subrepo
+created by archive:
+
+ $ hg clone -U . ../almost-empty
+ $ cd ../almost-empty
+ $ mkdir foo
+ $ echo f > foo/f
+ $ hg archive --subrepos -r tip archive
+ cloning subrepo foo from $TESTTMP/empty/foo
+ abort: destination '$TESTTMP/almost-empty/foo' is not empty (glob)
+ [255]
+
+Clone and test outgoing:
+
+ $ cd ..
+ $ hg clone repo repo2
+ updating to branch default
+ cloning subrepo foo from $TESTTMP/repo/foo
+ cloning subrepo foo/bar from $TESTTMP/repo/foo/bar (glob)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd repo2
+ $ hg outgoing -S
+ comparing with $TESTTMP/repo (glob)
+ searching for changes
+ no changes found
+ comparing with $TESTTMP/repo/foo
+ searching for changes
+ no changes found
+ comparing with $TESTTMP/repo/foo/bar
+ searching for changes
+ no changes found
+ [1]
+
+Make nested change:
+
+ $ echo y4 >> foo/y.txt
+ $ hg diff --nodates -S
+ diff -r 65903cebad86 foo/y.txt
+ --- a/foo/y.txt
+ +++ b/foo/y.txt
+ @@ -1,3 +1,4 @@
+ y1
+ y2
+ y3
+ +y4
+ $ hg commit --subrepos -m 3-4-2
+ committing subrepository foo
+ $ hg outgoing -S
+ comparing with $TESTTMP/repo (glob)
+ searching for changes
+ changeset: 3:2655b8ecc4ee
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3-4-2
+
+ comparing with $TESTTMP/repo/foo
+ searching for changes
+ changeset: 4:e96193d6cb36
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3-4-2
+
+ comparing with $TESTTMP/repo/foo/bar
+ searching for changes
+ no changes found
+
+
+Switch to original repo and setup default path:
+
+ $ cd ../repo
+ $ echo '[paths]' >> .hg/hgrc
+ $ echo 'default = ../repo2' >> .hg/hgrc
+
+Test incoming:
+
+ $ hg incoming -S
+ comparing with $TESTTMP/repo2 (glob)
+ searching for changes
+ changeset: 3:2655b8ecc4ee
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3-4-2
+
+ comparing with $TESTTMP/repo2/foo
+ searching for changes
+ changeset: 4:e96193d6cb36
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3-4-2
+
+ comparing with $TESTTMP/repo2/foo/bar
+ searching for changes
+ no changes found
+
+ $ hg incoming -S --bundle incoming.hg
+ abort: cannot combine --bundle and --subrepos
+ [255]
+
+Test missing subrepo:
+
+ $ rm -r foo
+ $ hg status -S
+ warning: error "unknown revision '65903cebad86f1a84bd4f1134f62fa7dcb7a1c98'" in subrepository "foo"
+
+Issue2619: IndexError: list index out of range on hg add with subrepos
+The subrepo must sorts after the explicit filename.
+
+ $ cd ..
+ $ hg init test
+ $ cd test
+ $ hg init x
+ $ echo "x = x" >> .hgsub
+ $ hg add .hgsub
+ $ touch a x/a
+ $ hg add a x/a
+
+ $ cd ..
diff --git a/tests/test-subrepo-relative-path.t b/tests/test-subrepo-relative-path.t
new file mode 100644
index 0000000..e101511
--- /dev/null
+++ b/tests/test-subrepo-relative-path.t
@@ -0,0 +1,105 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Preparing the subrepository 'sub'
+
+ $ hg init sub
+ $ echo sub > sub/sub
+ $ hg add -R sub
+ adding sub/sub (glob)
+ $ hg commit -R sub -m "sub import"
+
+Preparing the 'main' repo which depends on the subrepo 'sub'
+
+ $ hg init main
+ $ echo main > main/main
+ $ echo "sub = ../sub" > main/.hgsub
+ $ hg clone sub main/sub
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg add -R main
+ adding main/.hgsub (glob)
+ adding main/main (glob)
+ $ hg commit -R main -m "main import"
+
+Cleaning both repositories, just as a clone -U
+
+ $ hg up -C -R sub null
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg up -C -R main null
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ rm -rf main/sub
+
+hide outer repo
+ $ hg init
+
+Serving them both using hgweb
+
+ $ printf '[paths]\n/main = main\nsub = sub\n' > webdir.conf
+ $ hg serve --webdir-conf webdir.conf -a localhost -p $HGPORT \
+ > -A /dev/null -E /dev/null --pid-file hg.pid -d
+ $ cat hg.pid >> $DAEMON_PIDS
+
+Clone main from hgweb
+
+ $ hg clone "http://localhost:$HGPORT/main" cloned
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ cloning subrepo sub from http://localhost:$HGPORT/sub
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Checking cloned repo ids
+
+ $ hg id -R cloned
+ fdfeeb3e979e tip
+ $ hg id -R cloned/sub
+ 863c1745b441 tip
+
+subrepo debug for 'main' clone
+
+ $ hg debugsub -R cloned
+ path sub
+ source ../sub
+ revision 863c1745b441bd97a8c4a096e87793073f4fb215
+
+ $ "$TESTDIR/killdaemons.py"
+
+subrepo paths with ssh urls
+
+ $ hg clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/cloned sshclone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 3 changes to 3 files
+ updating to branch default
+ cloning subrepo sub from ssh://user@dummy/sub
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg -R sshclone push -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/`pwd`/cloned
+ pushing to ssh://user@dummy/$TESTTMP/cloned
+ pushing subrepo sub to ssh://user@dummy/$TESTTMP/sub
+ searching for changes
+ no changes found
+ searching for changes
+ no changes found
+ [1]
+
+ $ cat dummylog
+ Got arguments 1:user@dummy 2:hg -R cloned serve --stdio
+ Got arguments 1:user@dummy 2:hg -R sub serve --stdio
+ Got arguments 1:user@dummy 2:hg -R $TESTTMP/cloned serve --stdio
+ Got arguments 1:user@dummy 2:hg -R $TESTTMP/sub serve --stdio
diff --git a/tests/test-subrepo-svn.t b/tests/test-subrepo-svn.t
new file mode 100644
index 0000000..ba9611d
--- /dev/null
+++ b/tests/test-subrepo-svn.t
@@ -0,0 +1,625 @@
+ $ "$TESTDIR/hghave" svn15 || exit 80
+
+ $ SVNREPOPATH=`pwd`/svn-repo
+#if windows
+ $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#else
+ $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"`
+#endif
+
+create subversion repo
+
+ $ WCROOT="`pwd`/svn-wc"
+ $ svnadmin create svn-repo
+ $ svn co "$SVNREPOURL" svn-wc
+ Checked out revision 0.
+ $ cd svn-wc
+ $ mkdir src
+ $ echo alpha > src/alpha
+ $ svn add src
+ A src
+ A src/alpha (glob)
+ $ mkdir externals
+ $ echo other > externals/other
+ $ svn add externals
+ A externals
+ A externals/other (glob)
+ $ svn ci -m 'Add alpha'
+ Adding externals
+ Adding externals/other (glob)
+ Adding src
+ Adding src/alpha (glob)
+ Transmitting file data ..
+ Committed revision 1.
+ $ svn up -q
+ $ echo "externals -r1 $SVNREPOURL/externals" > extdef
+ $ svn propset -F extdef svn:externals src
+ property 'svn:externals' set on 'src'
+ $ svn ci -m 'Setting externals'
+ Sending src
+
+ Committed revision 2.
+ $ cd ..
+
+create hg repo
+
+ $ mkdir sub
+ $ cd sub
+ $ hg init t
+ $ cd t
+
+first revision, no sub
+
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+
+add first svn sub with leading whitespaces
+
+ $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub
+ $ echo "subdir/s = [svn] $SVNREPOURL/src" >> .hgsub
+ $ svn co --quiet "$SVNREPOURL"/src s
+ $ mkdir subdir
+ $ svn co --quiet "$SVNREPOURL"/src subdir/s
+ $ hg add .hgsub
+ $ hg ci -m1
+
+make sure we avoid empty commits (issue2445)
+
+ $ hg sum
+ parent: 1:* tip (glob)
+ 1
+ branch: default
+ commit: (clean)
+ update: (current)
+ $ hg ci -moops
+ nothing changed
+ [1]
+
+debugsub
+
+ $ hg debugsub
+ path s
+ source file://*/svn-repo/src (glob)
+ revision 2
+ path subdir/s
+ source file://*/svn-repo/src (glob)
+ revision 2
+
+change file in svn and hg, commit
+
+ $ echo a >> a
+ $ echo alpha >> s/alpha
+ $ hg sum
+ parent: 1:* tip (glob)
+ 1
+ branch: default
+ commit: 1 modified, 1 subrepos
+ update: (current)
+ $ hg commit --subrepos -m 'Message!' | grep -v Updating
+ committing subrepository s
+ Sending*s/alpha (glob)
+ Transmitting file data .
+ Committed revision 3.
+
+ Fetching external item into '*s/externals'* (glob)
+ External at revision 1.
+
+ At revision 3.
+ $ hg debugsub
+ path s
+ source file://*/svn-repo/src (glob)
+ revision 3
+ path subdir/s
+ source file://*/svn-repo/src (glob)
+ revision 2
+
+missing svn file, commit should fail
+
+ $ rm s/alpha
+ $ hg commit --subrepos -m 'abort on missing file'
+ committing subrepository s
+ abort: cannot commit missing svn entries
+ [255]
+ $ svn revert s/alpha > /dev/null
+
+add an unrelated revision in svn and update the subrepo to without
+bringing any changes.
+
+ $ svn mkdir "$SVNREPOURL/unrelated" -m 'create unrelated'
+
+ Committed revision 4.
+ $ svn up -q s
+ $ hg sum
+ parent: 2:* tip (glob)
+ Message!
+ branch: default
+ commit: (clean)
+ update: (current)
+
+ $ echo a > s/a
+
+should be empty despite change to s/a
+
+ $ hg st
+
+add a commit from svn
+
+ $ cd "$WCROOT/src"
+ $ svn up -q
+ $ echo xyz >> alpha
+ $ svn propset svn:mime-type 'text/xml' alpha
+ property 'svn:mime-type' set on 'alpha'
+ $ svn ci -m 'amend a from svn'
+ Sending *alpha (glob)
+ Transmitting file data .
+ Committed revision 5.
+ $ cd ../../sub/t
+
+this commit from hg will fail
+
+ $ echo zzz >> s/alpha
+ $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date'
+ committing subrepository s
+ abort: svn:*Commit failed (details follow): (glob)
+ [255]
+ $ svn revert -q s/alpha
+
+this commit fails because of meta changes
+
+ $ svn propset svn:mime-type 'text/html' s/alpha
+ property 'svn:mime-type' set on 's/alpha' (glob)
+ $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date'
+ committing subrepository s
+ abort: svn:*Commit failed (details follow): (glob)
+ [255]
+ $ svn revert -q s/alpha
+
+this commit fails because of externals changes
+
+ $ echo zzz > s/externals/other
+ $ hg ci --subrepos -m 'amend externals from hg'
+ committing subrepository s
+ abort: cannot commit svn externals
+ [255]
+ $ hg diff --subrepos -r 1:2 | grep -v diff
+ --- a/.hgsubstate Thu Jan 01 00:00:00 1970 +0000
+ +++ b/.hgsubstate Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,2 +1,2 @@
+ -2 s
+ +3 s
+ 2 subdir/s
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ $ svn revert -q s/externals/other
+
+this commit fails because of externals meta changes
+
+ $ svn propset svn:mime-type 'text/html' s/externals/other
+ property 'svn:mime-type' set on 's/externals/other' (glob)
+ $ hg ci --subrepos -m 'amend externals from hg'
+ committing subrepository s
+ abort: cannot commit svn externals
+ [255]
+ $ svn revert -q s/externals/other
+
+clone
+
+ $ cd ..
+ $ hg clone t tc
+ updating to branch default
+ A tc/s/alpha (glob)
+ U tc/s (glob)
+
+ Fetching external item into 'tc/s/externals'* (glob)
+ A tc/s/externals/other (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 3.
+ A tc/subdir/s/alpha (glob)
+ U tc/subdir/s (glob)
+
+ Fetching external item into 'tc/subdir/s/externals'* (glob)
+ A tc/subdir/s/externals/other (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 2.
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd tc
+
+debugsub in clone
+
+ $ hg debugsub
+ path s
+ source file://*/svn-repo/src (glob)
+ revision 3
+ path subdir/s
+ source file://*/svn-repo/src (glob)
+ revision 2
+
+verify subrepo is contained within the repo directory
+
+ $ python -c "import os.path; print os.path.exists('s')"
+ True
+
+update to nullrev (must delete the subrepo)
+
+ $ hg up null
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ ls
+
+Check hg update --clean
+ $ cd "$TESTTMP/sub/t"
+ $ cd s
+ $ echo c0 > alpha
+ $ echo c1 > f1
+ $ echo c1 > f2
+ $ svn add f1 -q
+ $ svn status | sort
+
+ ? * a (glob)
+ ? * f2 (glob)
+ A * f1 (glob)
+ M * alpha (glob)
+ Performing status on external item at 'externals'* (glob)
+ X * externals (glob)
+ $ cd ../..
+ $ hg -R t update -C
+
+ Fetching external item into 't/s/externals'* (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 3.
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd t/s
+ $ svn status | sort
+
+ ? * a (glob)
+ ? * f1 (glob)
+ ? * f2 (glob)
+ Performing status on external item at 'externals'* (glob)
+ X * externals (glob)
+
+Sticky subrepositories, no changes
+ $ cd "$TESTTMP/sub/t"
+ $ hg id -n
+ 2
+ $ cd s
+ $ svnversion
+ 3
+ $ cd ..
+ $ hg update 1
+ U *s/alpha (glob)
+
+ Fetching external item into '*s/externals'* (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 2.
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 1
+ $ cd s
+ $ svnversion
+ 2
+ $ cd ..
+
+Sticky subrepositorys, file changes
+ $ touch s/f1
+ $ cd s
+ $ svn add f1
+ A f1
+ $ cd ..
+ $ hg id -n
+ 1+
+ $ cd s
+ $ svnversion
+ 2M
+ $ cd ..
+ $ hg update tip
+ subrepository sources for s differ
+ use (l)ocal source (2) or (r)emote source (3)?
+ l
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 2+
+ $ cd s
+ $ svnversion
+ 2M
+ $ cd ..
+ $ hg update --clean tip
+ U *s/alpha (glob)
+
+ Fetching external item into '*s/externals'* (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 3.
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Sticky subrepository, revision updates
+ $ hg id -n
+ 2
+ $ cd s
+ $ svnversion
+ 3
+ $ cd ..
+ $ cd s
+ $ svn update -qr 1
+ $ cd ..
+ $ hg update 1
+ subrepository sources for s differ (in checked out version)
+ use (l)ocal source (1) or (r)emote source (2)?
+ l
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 1+
+ $ cd s
+ $ svnversion
+ 1
+ $ cd ..
+
+Sticky subrepository, file changes and revision updates
+ $ touch s/f1
+ $ cd s
+ $ svn add f1
+ A f1
+ $ svnversion
+ 1M
+ $ cd ..
+ $ hg id -n
+ 1+
+ $ hg update tip
+ subrepository sources for s differ
+ use (l)ocal source (1) or (r)emote source (3)?
+ l
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 2+
+ $ cd s
+ $ svnversion
+ 1M
+ $ cd ..
+
+Sticky repository, update --clean
+ $ hg update --clean tip | grep -v 's[/\]externals[/\]other'
+ U *s/alpha (glob)
+ U *s (glob)
+
+ Fetching external item into '*s/externals'* (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 3.
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 2
+ $ cd s
+ $ svnversion
+ 3
+ $ cd ..
+
+Test subrepo already at intended revision:
+ $ cd s
+ $ svn update -qr 2
+ $ cd ..
+ $ hg update 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 1+
+ $ cd s
+ $ svnversion
+ 2
+ $ cd ..
+
+Test case where subversion would fail to update the subrepo because there
+are unknown directories being replaced by tracked ones (happens with rebase).
+
+ $ cd "$WCROOT/src"
+ $ mkdir dir
+ $ echo epsilon.py > dir/epsilon.py
+ $ svn add dir
+ A dir
+ A dir/epsilon.py (glob)
+ $ svn ci -m 'Add dir/epsilon.py'
+ Adding *dir (glob)
+ Adding *dir/epsilon.py (glob)
+ Transmitting file data .
+ Committed revision 6.
+ $ cd ../..
+ $ hg init rebaserepo
+ $ cd rebaserepo
+ $ svn co -r5 --quiet "$SVNREPOURL"/src s
+ $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub
+ $ hg add .hgsub
+ $ hg ci -m addsub
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ svn up -qr6 s
+ $ hg ci -m updatesub
+ created new head
+ $ echo pyc > s/dir/epsilon.pyc
+ $ hg up 1
+ D *s/dir (glob)
+
+ Fetching external item into '*s/externals'* (glob)
+ Checked out external at revision 1.
+
+ Checked out revision 5.
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg up -q 2
+
+Modify one of the externals to point to a different path so we can
+test having obstructions when switching branches on checkout:
+ $ hg checkout tip
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "obstruct = [svn] $SVNREPOURL/externals" >> .hgsub
+ $ svn co -r5 --quiet "$SVNREPOURL"/externals obstruct
+ $ hg commit -m 'Start making obstructed working copy'
+ $ hg book other
+ $ hg co -r 'p1(tip)'
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo "obstruct = [svn] $SVNREPOURL/src" >> .hgsub
+ $ svn co -r5 --quiet "$SVNREPOURL"/src obstruct
+ $ hg commit -m 'Other branch which will be obstructed'
+ created new head
+
+Switching back to the head where we have another path mapped to the
+same subrepo should work if the subrepo is clean.
+ $ hg co other
+ A *obstruct/other (glob)
+ Checked out revision 1.
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+This is surprising, but is also correct based on the current code:
+ $ echo "updating should (maybe) fail" > obstruct/other
+ $ hg co tip
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ [255]
+
+Point to a Subversion branch which has since been deleted and recreated
+First, create that condition in the repository.
+
+ $ hg ci --subrepos -m cleanup | grep -v Updating
+ committing subrepository obstruct
+ Sending obstruct/other (glob)
+ Transmitting file data .
+ Committed revision 7.
+ At revision 7.
+ $ svn mkdir -m "baseline" $SVNREPOURL/trunk
+
+ Committed revision 8.
+ $ svn copy -m "initial branch" $SVNREPOURL/trunk $SVNREPOURL/branch
+
+ Committed revision 9.
+ $ svn co --quiet "$SVNREPOURL"/branch tempwc
+ $ cd tempwc
+ $ echo "something old" > somethingold
+ $ svn add somethingold
+ A somethingold
+ $ svn ci -m 'Something old'
+ Adding somethingold
+ Transmitting file data .
+ Committed revision 10.
+ $ svn rm -m "remove branch" $SVNREPOURL/branch
+
+ Committed revision 11.
+ $ svn copy -m "recreate branch" $SVNREPOURL/trunk $SVNREPOURL/branch
+
+ Committed revision 12.
+ $ svn up -q
+ $ echo "something new" > somethingnew
+ $ svn add somethingnew
+ A somethingnew
+ $ svn ci -m 'Something new'
+ Adding somethingnew
+ Transmitting file data .
+ Committed revision 13.
+ $ cd ..
+ $ rm -rf tempwc
+ $ svn co "$SVNREPOURL/branch"@10 recreated
+ A recreated/somethingold (glob)
+ Checked out revision 10.
+ $ echo "recreated = [svn] $SVNREPOURL/branch" >> .hgsub
+ $ hg ci -m addsub
+ $ cd recreated
+ $ svn up -q
+ $ cd ..
+ $ hg ci -m updatesub
+ $ hg up -r-2
+ D *recreated/somethingnew (glob)
+ A *recreated/somethingold (glob)
+ Checked out revision 10.
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ test -f recreated/somethingold
+
+Test archive
+
+ $ hg archive -S ../archive-all --debug
+ archiving: 0/2 files (0.00%)
+ archiving: .hgsub 1/2 files (50.00%)
+ archiving: .hgsubstate 2/2 files (100.00%)
+ archiving (obstruct): 0/1 files (0.00%)
+ archiving (obstruct): 1/1 files (100.00%)
+ archiving (s): 0/2 files (0.00%)
+ archiving (s): 1/2 files (50.00%)
+ archiving (s): 2/2 files (100.00%)
+ archiving (recreated): 0/1 files (0.00%)
+ archiving (recreated): 1/1 files (100.00%)
+
+ $ hg archive -S ../archive-exclude --debug -X **old
+ archiving: 0/2 files (0.00%)
+ archiving: .hgsub 1/2 files (50.00%)
+ archiving: .hgsubstate 2/2 files (100.00%)
+ archiving (obstruct): 0/1 files (0.00%)
+ archiving (obstruct): 1/1 files (100.00%)
+ archiving (s): 0/2 files (0.00%)
+ archiving (s): 1/2 files (50.00%)
+ archiving (s): 2/2 files (100.00%)
+ archiving (recreated): 0 files
+ $ find ../archive-exclude | sort
+ ../archive-exclude
+ ../archive-exclude/.hg_archival.txt
+ ../archive-exclude/.hgsub
+ ../archive-exclude/.hgsubstate
+ ../archive-exclude/obstruct
+ ../archive-exclude/obstruct/other
+ ../archive-exclude/s
+ ../archive-exclude/s/alpha
+ ../archive-exclude/s/dir
+ ../archive-exclude/s/dir/epsilon.py
+
+Test forgetting files, not implemented in svn subrepo, used to
+traceback
+
+#if no-windows
+ $ hg forget 'notafile*'
+ notafile*: No such file or directory
+ [1]
+#else
+ $ hg forget 'notafile'
+ notafile: * (glob)
+ [1]
+#endif
+
+Test a subrepo referencing a just moved svn path. Last commit rev will
+be different from the revision, and the path will be different as
+well.
+
+ $ cd "$WCROOT"
+ $ svn up > /dev/null
+ $ mkdir trunk/subdir branches
+ $ echo a > trunk/subdir/a
+ $ svn add trunk/subdir branches
+ A trunk/subdir (glob)
+ A trunk/subdir/a (glob)
+ A branches
+ $ svn ci -m addsubdir
+ Adding branches
+ Adding trunk/subdir (glob)
+ Adding trunk/subdir/a (glob)
+ Transmitting file data .
+ Committed revision 14.
+ $ svn cp -m branchtrunk $SVNREPOURL/trunk $SVNREPOURL/branches/somebranch
+
+ Committed revision 15.
+ $ cd ..
+
+ $ hg init repo2
+ $ cd repo2
+ $ svn co $SVNREPOURL/branches/somebranch/subdir
+ A subdir/a (glob)
+ Checked out revision 15.
+ $ echo "subdir = [svn] $SVNREPOURL/branches/somebranch/subdir" > .hgsub
+ $ hg add .hgsub
+ $ hg ci -m addsub
+ $ hg up null
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg up
+ A *subdir/a (glob)
+ Checked out revision 15.
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
diff --git a/tests/test-subrepo.t b/tests/test-subrepo.t
new file mode 100644
index 0000000..bb58c2f
--- /dev/null
+++ b/tests/test-subrepo.t
@@ -0,0 +1,1023 @@
+Let commit recurse into subrepos by default to match pre-2.0 behavior:
+
+ $ echo "[ui]" >> $HGRCPATH
+ $ echo "commitsubrepos = Yes" >> $HGRCPATH
+
+ $ hg init t
+ $ cd t
+
+first revision, no sub
+
+ $ echo a > a
+ $ hg ci -Am0
+ adding a
+
+add first sub
+
+ $ echo s = s > .hgsub
+ $ hg add .hgsub
+ $ hg init s
+ $ echo a > s/a
+
+Issue2232: committing a subrepo without .hgsub
+
+ $ hg ci -mbad s
+ abort: can't commit subrepos without .hgsub
+ [255]
+
+ $ hg -R s ci -Ams0
+ adding a
+ $ hg sum
+ parent: 0:f7b1eb17ad24 tip
+ 0
+ branch: default
+ commit: 1 added, 1 subrepos
+ update: (current)
+ $ hg ci -m1
+
+Revert subrepo and test subrepo fileset keyword:
+
+ $ echo b > s/a
+ $ hg revert "set:subrepo('glob:s*')"
+ reverting subrepo s
+ reverting s/a (glob)
+ $ rm s/a.orig
+
+Revert subrepo with no backup. The "reverting s/a" line is gone since
+we're really running 'hg update' in the subrepo:
+
+ $ echo b > s/a
+ $ hg revert --no-backup s
+ reverting subrepo s
+
+Issue2022: update -C
+
+ $ echo b > s/a
+ $ hg sum
+ parent: 1:7cf8cfea66e4 tip
+ 1
+ branch: default
+ commit: 1 subrepos
+ update: (current)
+ $ hg co -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg sum
+ parent: 1:7cf8cfea66e4 tip
+ 1
+ branch: default
+ commit: (clean)
+ update: (current)
+
+commands that require a clean repo should respect subrepos
+
+ $ echo b >> s/a
+ $ hg backout tip
+ abort: uncommitted changes in subrepo s
+ [255]
+ $ hg revert -C -R s s/a
+
+add sub sub
+
+ $ echo ss = ss > s/.hgsub
+ $ hg init s/ss
+ $ echo a > s/ss/a
+ $ hg -R s add s/.hgsub
+ $ hg -R s/ss add s/ss/a
+ $ hg sum
+ parent: 1:7cf8cfea66e4 tip
+ 1
+ branch: default
+ commit: 1 subrepos
+ update: (current)
+ $ hg ci -m2
+ committing subrepository s
+ committing subrepository s/ss (glob)
+ $ hg sum
+ parent: 2:df30734270ae tip
+ 2
+ branch: default
+ commit: (clean)
+ update: (current)
+
+bump sub rev (and check it is ignored by ui.commitsubrepos)
+
+ $ echo b > s/a
+ $ hg -R s ci -ms1
+ $ hg --config ui.commitsubrepos=no ci -m3
+
+leave sub dirty (and check ui.commitsubrepos=no aborts the commit)
+
+ $ echo c > s/a
+ $ hg --config ui.commitsubrepos=no ci -m4
+ abort: uncommitted changes in subrepo s
+ (use --subrepos for recursive commit)
+ [255]
+ $ hg id
+ f6affe3fbfaa+ tip
+ $ hg -R s ci -mc
+ $ hg id
+ f6affe3fbfaa+ tip
+ $ echo d > s/a
+ $ hg ci -m4
+ committing subrepository s
+ $ hg tip -R s
+ changeset: 4:02dcf1d70411
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 4
+
+
+check caching
+
+ $ hg co 0
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg debugsub
+
+restore
+
+ $ hg co
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg debugsub
+ path s
+ source s
+ revision 02dcf1d704118aee3ee306ccfa1910850d5b05ef
+
+new branch for merge tests
+
+ $ hg co 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo t = t >> .hgsub
+ $ hg init t
+ $ echo t > t/t
+ $ hg -R t add t
+ adding t/t (glob)
+
+5
+
+ $ hg ci -m5 # add sub
+ committing subrepository t
+ created new head
+ $ echo t2 > t/t
+
+6
+
+ $ hg st -R s
+ $ hg ci -m6 # change sub
+ committing subrepository t
+ $ hg debugsub
+ path s
+ source s
+ revision e4ece1bf43360ddc8f6a96432201a37b7cd27ae4
+ path t
+ source t
+ revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
+ $ echo t3 > t/t
+
+7
+
+ $ hg ci -m7 # change sub again for conflict test
+ committing subrepository t
+ $ hg rm .hgsub
+
+8
+
+ $ hg ci -m8 # remove sub
+
+merge tests
+
+ $ hg co -C 3
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 5 # test adding
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg debugsub
+ path s
+ source s
+ revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
+ path t
+ source t
+ revision 60ca1237c19474e7a3978b0dc1ca4e6f36d51382
+ $ hg ci -m9
+ created new head
+ $ hg merge 6 --debug # test change
+ searching for copies back to rev 2
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 1f14a2e2d3ec, local: f0d2028bf86d+, remote: 1831e14459c4
+ .hgsubstate: versions differ -> m
+ updating: .hgsubstate 1/1 files (100.00%)
+ subrepo merge f0d2028bf86d+ 1831e14459c4 1f14a2e2d3ec
+ subrepo t: other changed, get t:6747d179aa9a688023c4b0cad32e4c92bb7f34ad:hg
+ getting subrepo t
+ resolving manifests
+ overwrite: True, partial: False
+ ancestor: 60ca1237c194+, local: 60ca1237c194+, remote: 6747d179aa9a
+ t: remote is newer -> g
+ updating: t 1/1 files (100.00%)
+ getting t
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg debugsub
+ path s
+ source s
+ revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
+ path t
+ source t
+ revision 6747d179aa9a688023c4b0cad32e4c92bb7f34ad
+ $ echo conflict > t/t
+ $ hg ci -m10
+ committing subrepository t
+ $ HGMERGE=internal:merge hg merge --debug 7 # test conflict
+ searching for copies back to rev 2
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 1831e14459c4, local: e45c8b14af55+, remote: f94576341bcf
+ .hgsubstate: versions differ -> m
+ updating: .hgsubstate 1/1 files (100.00%)
+ subrepo merge e45c8b14af55+ f94576341bcf 1831e14459c4
+ subrepo t: both sides changed, merge with t:7af322bc1198a32402fe903e0b7ebcfc5c9bf8f4:hg
+ merging subrepo t
+ searching for copies back to rev 2
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 6747d179aa9a, local: 20a0db6fbf6c+, remote: 7af322bc1198
+ t: versions differ -> m
+ preserving t for resolve of t
+ updating: t 1/1 files (100.00%)
+ picked tool 'internal:merge' for t (binary False symlink False)
+ merging t
+ my t@20a0db6fbf6c+ other t@7af322bc1198 ancestor t@6747d179aa9a
+ warning: conflicts during merge.
+ merging t incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+should conflict
+
+ $ cat t/t
+ <<<<<<< local
+ conflict
+ =======
+ t3
+ >>>>>>> other
+
+clone
+
+ $ cd ..
+ $ hg clone t tc
+ updating to branch default
+ cloning subrepo s from $TESTTMP/t/s (glob)
+ cloning subrepo s/ss from $TESTTMP/t/s/ss (glob)
+ cloning subrepo t from $TESTTMP/t/t (glob)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd tc
+ $ hg debugsub
+ path s
+ source s
+ revision fc627a69481fcbe5f1135069e8a3881c023e4cf5
+ path t
+ source t
+ revision 20a0db6fbf6c3d2836e6519a642ae929bfc67c0e
+
+push
+
+ $ echo bah > t/t
+ $ hg ci -m11
+ committing subrepository t
+ $ hg push
+ pushing to $TESTTMP/t (glob)
+ pushing subrepo s/ss to $TESTTMP/t/s/ss (glob)
+ searching for changes
+ no changes found
+ pushing subrepo s to $TESTTMP/t/s (glob)
+ searching for changes
+ no changes found
+ pushing subrepo t to $TESTTMP/t/t (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+push -f
+
+ $ echo bah > s/a
+ $ hg ci -m12
+ committing subrepository s
+ $ hg push
+ pushing to $TESTTMP/t (glob)
+ pushing subrepo s/ss to $TESTTMP/t/s/ss (glob)
+ searching for changes
+ no changes found
+ pushing subrepo s to $TESTTMP/t/s (glob)
+ searching for changes
+ abort: push creates new remote head 12a213df6fa9!
+ (did you forget to merge? use push -f to force)
+ [255]
+ $ hg push -f
+ pushing to $TESTTMP/t (glob)
+ pushing subrepo s/ss to $TESTTMP/t/s/ss (glob)
+ searching for changes
+ no changes found
+ pushing subrepo s to $TESTTMP/t/s (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ pushing subrepo t to $TESTTMP/t/t (glob)
+ searching for changes
+ no changes found
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+update
+
+ $ cd ../t
+ $ hg up -C # discard our earlier merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo blah > t/t
+ $ hg ci -m13
+ committing subrepository t
+
+pull
+
+ $ cd ../tc
+ $ hg pull
+ pulling from $TESTTMP/t (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+should pull t
+
+ $ hg up
+ pulling subrepo t from $TESTTMP/t/t (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat t/t
+ blah
+
+bogus subrepo path aborts
+
+ $ echo 'bogus=[boguspath' >> .hgsub
+ $ hg ci -m 'bogus subrepo path'
+ abort: missing ] in subrepo source
+ [255]
+
+Issue1986: merge aborts when trying to merge a subrepo that
+shouldn't need merging
+
+# subrepo layout
+#
+# o 5 br
+# /|
+# o | 4 default
+# | |
+# | o 3 br
+# |/|
+# o | 2 default
+# | |
+# | o 1 br
+# |/
+# o 0 default
+
+ $ cd ..
+ $ rm -rf sub
+ $ hg init main
+ $ cd main
+ $ hg init s
+ $ cd s
+ $ echo a > a
+ $ hg ci -Am1
+ adding a
+ $ hg branch br
+ marked working directory as branch br
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo a >> a
+ $ hg ci -m1
+ $ hg up default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo b > b
+ $ hg ci -Am1
+ adding b
+ $ hg up br
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m1
+ $ hg up 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -Am1
+ adding c
+ $ hg up 3
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m1
+
+# main repo layout:
+#
+# * <-- try to merge default into br again
+# .`|
+# . o 5 br --> substate = 5
+# . |
+# o | 4 default --> substate = 4
+# | |
+# | o 3 br --> substate = 2
+# |/|
+# o | 2 default --> substate = 2
+# | |
+# | o 1 br --> substate = 3
+# |/
+# o 0 default --> substate = 2
+
+ $ cd ..
+ $ echo 's = s' > .hgsub
+ $ hg -R s up 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg ci -Am1
+ adding .hgsub
+ $ hg branch br
+ marked working directory as branch br
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo b > b
+ $ hg -R s up 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg ci -Am1
+ adding b
+ $ hg up default
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -Am1
+ adding c
+ $ hg up 1
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m1
+ $ hg up 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg -R s up 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo d > d
+ $ hg ci -Am1
+ adding d
+ $ hg up 3
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg -R s up 5
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo e > e
+ $ hg ci -Am1
+ adding e
+
+ $ hg up 5
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge 4 # try to merge default into br again
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ cd ..
+
+test subrepo delete from .hgsubstate
+
+ $ hg init testdelete
+ $ mkdir testdelete/nested testdelete/nested2
+ $ hg init testdelete/nested
+ $ hg init testdelete/nested2
+ $ echo test > testdelete/nested/foo
+ $ echo test > testdelete/nested2/foo
+ $ hg -R testdelete/nested add
+ adding testdelete/nested/foo (glob)
+ $ hg -R testdelete/nested2 add
+ adding testdelete/nested2/foo (glob)
+ $ hg -R testdelete/nested ci -m test
+ $ hg -R testdelete/nested2 ci -m test
+ $ echo nested = nested > testdelete/.hgsub
+ $ echo nested2 = nested2 >> testdelete/.hgsub
+ $ hg -R testdelete add
+ adding testdelete/.hgsub (glob)
+ $ hg -R testdelete ci -m "nested 1 & 2 added"
+ $ echo nested = nested > testdelete/.hgsub
+ $ hg -R testdelete ci -m "nested 2 deleted"
+ $ cat testdelete/.hgsubstate
+ bdf5c9a3103743d900b12ae0db3ffdcfd7b0d878 nested
+ $ hg -R testdelete remove testdelete/.hgsub
+ $ hg -R testdelete ci -m ".hgsub deleted"
+ $ cat testdelete/.hgsubstate
+ bdf5c9a3103743d900b12ae0db3ffdcfd7b0d878 nested
+
+test repository cloning
+
+ $ mkdir mercurial mercurial2
+ $ hg init nested_absolute
+ $ echo test > nested_absolute/foo
+ $ hg -R nested_absolute add
+ adding nested_absolute/foo (glob)
+ $ hg -R nested_absolute ci -mtest
+ $ cd mercurial
+ $ hg init nested_relative
+ $ echo test2 > nested_relative/foo2
+ $ hg -R nested_relative add
+ adding nested_relative/foo2 (glob)
+ $ hg -R nested_relative ci -mtest2
+ $ hg init main
+ $ echo "nested_relative = ../nested_relative" > main/.hgsub
+ $ echo "nested_absolute = `pwd`/nested_absolute" >> main/.hgsub
+ $ hg -R main add
+ adding main/.hgsub (glob)
+ $ hg -R main ci -m "add subrepos"
+ $ cd ..
+ $ hg clone mercurial/main mercurial2/main
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat mercurial2/main/nested_absolute/.hg/hgrc \
+ > mercurial2/main/nested_relative/.hg/hgrc
+ [paths]
+ default = $TESTTMP/mercurial/nested_absolute
+ [paths]
+ default = $TESTTMP/mercurial/nested_relative
+ $ rm -rf mercurial mercurial2
+
+Issue1977: multirepo push should fail if subrepo push fails
+
+ $ hg init repo
+ $ hg init repo/s
+ $ echo a > repo/s/a
+ $ hg -R repo/s ci -Am0
+ adding a
+ $ echo s = s > repo/.hgsub
+ $ hg -R repo ci -Am1
+ adding .hgsub
+ $ hg clone repo repo2
+ updating to branch default
+ cloning subrepo s from $TESTTMP/repo/s (glob)
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg -q -R repo2 pull -u
+ $ echo 1 > repo2/s/a
+ $ hg -R repo2/s ci -m2
+ $ hg -q -R repo2/s push
+ $ hg -R repo2/s up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 2 > repo2/s/a
+ $ hg -R repo2/s ci -m3
+ created new head
+ $ hg -R repo2 ci -m3
+ $ hg -q -R repo2 push
+ abort: push creates new remote head 9d66565e64e1!
+ (did you forget to merge? use push -f to force)
+ [255]
+ $ hg -R repo update
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm -rf repo2 repo
+
+
+Issue1852 subrepos with relative paths always push/pull relative to default
+
+Prepare a repo with subrepo
+
+ $ hg init issue1852a
+ $ cd issue1852a
+ $ hg init sub/repo
+ $ echo test > sub/repo/foo
+ $ hg -R sub/repo add sub/repo/foo
+ $ echo sub/repo = sub/repo > .hgsub
+ $ hg add .hgsub
+ $ hg ci -mtest
+ committing subrepository sub/repo (glob)
+ $ echo test >> sub/repo/foo
+ $ hg ci -mtest
+ committing subrepository sub/repo (glob)
+ $ cd ..
+
+Create repo without default path, pull top repo, and see what happens on update
+
+ $ hg init issue1852b
+ $ hg -R issue1852b pull issue1852a
+ pulling from issue1852a
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 3 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg -R issue1852b update
+ abort: default path for subrepository sub/repo not found (glob)
+ [255]
+
+Pull -u now doesn't help
+
+ $ hg -R issue1852b pull -u issue1852a
+ pulling from issue1852a
+ searching for changes
+ no changes found
+
+Try the same, but with pull -u
+
+ $ hg init issue1852c
+ $ hg -R issue1852c pull -r0 -u issue1852a
+ pulling from issue1852a
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ cloning subrepo sub/repo from issue1852a/sub/repo (glob)
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Try to push from the other side
+
+ $ hg -R issue1852a push `pwd`/issue1852c
+ pushing to $TESTTMP/issue1852c
+ pushing subrepo sub/repo to $TESTTMP/issue1852c/sub/repo (glob)
+ searching for changes
+ no changes found
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Incoming and outgoing should not use the default path:
+
+ $ hg clone -q issue1852a issue1852d
+ $ hg -R issue1852d outgoing --subrepos issue1852c
+ comparing with issue1852c
+ searching for changes
+ no changes found
+ comparing with issue1852c/sub/repo
+ searching for changes
+ no changes found
+ [1]
+ $ hg -R issue1852d incoming --subrepos issue1852c
+ comparing with issue1852c
+ searching for changes
+ no changes found
+ comparing with issue1852c/sub/repo
+ searching for changes
+ no changes found
+ [1]
+
+Check status of files when none of them belong to the first
+subrepository:
+
+ $ hg init subrepo-status
+ $ cd subrepo-status
+ $ hg init subrepo-1
+ $ hg init subrepo-2
+ $ cd subrepo-2
+ $ touch file
+ $ hg add file
+ $ cd ..
+ $ echo subrepo-1 = subrepo-1 > .hgsub
+ $ echo subrepo-2 = subrepo-2 >> .hgsub
+ $ hg add .hgsub
+ $ hg ci -m 'Added subrepos'
+ committing subrepository subrepo-2
+ $ hg st subrepo-2/file
+
+Check hg update --clean
+ $ cd $TESTTMP/t
+ $ rm -r t/t.orig
+ $ hg status -S --all
+ C .hgsub
+ C .hgsubstate
+ C a
+ C s/.hgsub
+ C s/.hgsubstate
+ C s/a
+ C s/ss/a
+ C t/t
+ $ echo c1 > s/a
+ $ cd s
+ $ echo c1 > b
+ $ echo c1 > c
+ $ hg add b
+ $ cd ..
+ $ hg status -S
+ M s/a
+ A s/b
+ ? s/c
+ $ hg update -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg status -S
+ ? s/b
+ ? s/c
+
+Sticky subrepositories, no changes
+ $ cd $TESTTMP/t
+ $ hg id
+ 925c17564ef8 tip
+ $ hg -R s id
+ 12a213df6fa9 tip
+ $ hg -R t id
+ 52c0adc0515a tip
+ $ hg update 11
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ 365661e5936a
+ $ hg -R s id
+ fc627a69481f
+ $ hg -R t id
+ e95bcfa18a35
+
+Sticky subrepositorys, file changes
+ $ touch s/f1
+ $ touch t/f1
+ $ hg add -S s/f1
+ $ hg add -S t/f1
+ $ hg id
+ 365661e5936a+
+ $ hg -R s id
+ fc627a69481f+
+ $ hg -R t id
+ e95bcfa18a35+
+ $ hg update tip
+ subrepository sources for s differ
+ use (l)ocal source (fc627a69481f) or (r)emote source (12a213df6fa9)?
+ l
+ subrepository sources for t differ
+ use (l)ocal source (e95bcfa18a35) or (r)emote source (52c0adc0515a)?
+ l
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ 925c17564ef8+ tip
+ $ hg -R s id
+ fc627a69481f+
+ $ hg -R t id
+ e95bcfa18a35+
+ $ hg update --clean tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Sticky subrepository, revision updates
+ $ hg id
+ 925c17564ef8 tip
+ $ hg -R s id
+ 12a213df6fa9 tip
+ $ hg -R t id
+ 52c0adc0515a tip
+ $ cd s
+ $ hg update -r -2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../t
+ $ hg update -r 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+ $ hg update 10
+ subrepository sources for t differ (in checked out version)
+ use (l)ocal source (7af322bc1198) or (r)emote source (20a0db6fbf6c)?
+ l
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ e45c8b14af55+
+ $ hg -R s id
+ 02dcf1d70411
+ $ hg -R t id
+ 7af322bc1198
+
+Sticky subrepository, file changes and revision updates
+ $ touch s/f1
+ $ touch t/f1
+ $ hg add -S s/f1
+ $ hg add -S t/f1
+ $ hg id
+ e45c8b14af55+
+ $ hg -R s id
+ 02dcf1d70411+
+ $ hg -R t id
+ 7af322bc1198+
+ $ hg update tip
+ subrepository sources for s differ
+ use (l)ocal source (02dcf1d70411) or (r)emote source (12a213df6fa9)?
+ l
+ subrepository sources for t differ
+ use (l)ocal source (7af322bc1198) or (r)emote source (52c0adc0515a)?
+ l
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ 925c17564ef8+ tip
+ $ hg -R s id
+ 02dcf1d70411+
+ $ hg -R t id
+ 7af322bc1198+
+
+Sticky repository, update --clean
+ $ hg update --clean tip
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id
+ 925c17564ef8 tip
+ $ hg -R s id
+ 12a213df6fa9 tip
+ $ hg -R t id
+ 52c0adc0515a tip
+
+Test subrepo already at intended revision:
+ $ cd s
+ $ hg update fc627a69481f
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ..
+ $ hg update 11
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 11+
+ $ hg -R s id
+ fc627a69481f
+ $ hg -R t id
+ e95bcfa18a35
+
+Test that removing .hgsubstate doesn't break anything:
+
+ $ hg rm -f .hgsubstate
+ $ hg ci -mrm
+ nothing changed
+ [1]
+ $ hg log -vr tip
+ changeset: 13:925c17564ef8
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: .hgsubstate
+ description:
+ 13
+
+
+
+Test that removing .hgsub removes .hgsubstate:
+
+ $ hg rm .hgsub
+ $ hg ci -mrm2
+ created new head
+ $ hg log -vr tip
+ changeset: 14:2400bccd50af
+ tag: tip
+ parent: 11:365661e5936a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: .hgsub .hgsubstate
+ description:
+ rm2
+
+
+Test issue3153: diff -S with deleted subrepos
+
+ $ hg diff --nodates -S -c .
+ diff -r 365661e5936a -r 2400bccd50af .hgsub
+ --- a/.hgsub
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -s = s
+ -t = t
+ diff -r 365661e5936a -r 2400bccd50af .hgsubstate
+ --- a/.hgsubstate
+ +++ /dev/null
+ @@ -1,2 +0,0 @@
+ -fc627a69481fcbe5f1135069e8a3881c023e4cf5 s
+ -e95bcfa18a358dc4936da981ebf4147b4cad1362 t
+
+Test behavior of add for explicit path in subrepo:
+ $ cd ..
+ $ hg init explicit
+ $ cd explicit
+ $ echo s = s > .hgsub
+ $ hg add .hgsub
+ $ hg init s
+ $ hg ci -m0
+Adding with an explicit path in a subrepo adds the file
+ $ echo c1 > f1
+ $ echo c2 > s/f2
+ $ hg st -S
+ ? f1
+ ? s/f2
+ $ hg add s/f2
+ $ hg st -S
+ A s/f2
+ ? f1
+ $ hg ci -R s -m0
+ $ hg ci -Am1
+ adding f1
+Adding with an explicit path in a subrepo with -S has the same behavior
+ $ echo c3 > f3
+ $ echo c4 > s/f4
+ $ hg st -S
+ ? f3
+ ? s/f4
+ $ hg add -S s/f4
+ $ hg st -S
+ A s/f4
+ ? f3
+ $ hg ci -R s -m1
+ $ hg ci -Ama2
+ adding f3
+Adding without a path or pattern silently ignores subrepos
+ $ echo c5 > f5
+ $ echo c6 > s/f6
+ $ echo c7 > s/f7
+ $ hg st -S
+ ? f5
+ ? s/f6
+ ? s/f7
+ $ hg add
+ adding f5
+ $ hg st -S
+ A f5
+ ? s/f6
+ ? s/f7
+ $ hg ci -R s -Am2
+ adding f6
+ adding f7
+ $ hg ci -m3
+Adding without a path or pattern with -S also adds files in subrepos
+ $ echo c8 > f8
+ $ echo c9 > s/f9
+ $ echo c10 > s/f10
+ $ hg st -S
+ ? f8
+ ? s/f10
+ ? s/f9
+ $ hg add -S
+ adding f8
+ adding s/f10 (glob)
+ adding s/f9 (glob)
+ $ hg st -S
+ A f8
+ A s/f10
+ A s/f9
+ $ hg ci -R s -m3
+ $ hg ci -m4
+Adding with a pattern silently ignores subrepos
+ $ echo c11 > fm11
+ $ echo c12 > fn12
+ $ echo c13 > s/fm13
+ $ echo c14 > s/fn14
+ $ hg st -S
+ ? fm11
+ ? fn12
+ ? s/fm13
+ ? s/fn14
+ $ hg add 'glob:**fm*'
+ adding fm11
+ $ hg st -S
+ A fm11
+ ? fn12
+ ? s/fm13
+ ? s/fn14
+ $ hg ci -R s -Am4
+ adding fm13
+ adding fn14
+ $ hg ci -Am5
+ adding fn12
+Adding with a pattern with -S also adds matches in subrepos
+ $ echo c15 > fm15
+ $ echo c16 > fn16
+ $ echo c17 > s/fm17
+ $ echo c18 > s/fn18
+ $ hg st -S
+ ? fm15
+ ? fn16
+ ? s/fm17
+ ? s/fn18
+ $ hg add -S 'glob:**fm*'
+ adding fm15
+ adding s/fm17 (glob)
+ $ hg st -S
+ A fm15
+ A s/fm17
+ ? fn16
+ ? s/fn18
+ $ hg ci -R s -Am5
+ adding fn18
+ $ hg ci -Am6
+ adding fn16
+
+Test behavior of forget for explicit path in subrepo:
+Forgetting an explicit path in a subrepo untracks the file
+ $ echo c19 > s/f19
+ $ hg add s/f19
+ $ hg st -S
+ A s/f19
+ $ hg forget s/f19
+ $ hg st -S
+ ? s/f19
+ $ rm s/f19
+ $ cd ..
diff --git a/tests/test-symlink-os-yes-fs-no.py b/tests/test-symlink-os-yes-fs-no.py
new file mode 100644
index 0000000..e122d60
--- /dev/null
+++ b/tests/test-symlink-os-yes-fs-no.py
@@ -0,0 +1,45 @@
+import os, sys, time
+from mercurial import hg, ui, commands, util
+
+TESTDIR = os.environ["TESTDIR"]
+BUNDLEPATH = os.path.join(TESTDIR, 'bundles', 'test-no-symlinks.hg')
+
+# only makes sense to test on os which supports symlinks
+if not getattr(os, "symlink", False):
+ sys.exit(80) # SKIPPED_STATUS defined in run-tests.py
+
+u = ui.ui()
+# hide outer repo
+hg.peer(u, {}, '.', create=True)
+
+# clone with symlink support
+hg.clone(u, {}, BUNDLEPATH, 'test0')
+
+repo = hg.repository(u, 'test0')
+
+# wait a bit, or the status call wont update the dirstate
+time.sleep(1)
+commands.status(u, repo)
+
+# now disable symlink support -- this is what os.symlink would do on a
+# non-symlink file system
+def symlink_failure(src, dst):
+ raise OSError, (1, "Operation not permitted")
+os.symlink = symlink_failure
+
+# dereference links as if a Samba server has exported this to a
+# Windows client
+for f in 'test0/a.lnk', 'test0/d/b.lnk':
+ os.unlink(f)
+ fp = open(f, 'wb')
+ fp.write(util.readfile(f[:-4]))
+ fp.close()
+
+# reload repository
+u = ui.ui()
+repo = hg.repository(u, 'test0')
+commands.status(u, repo)
+
+# try cloning a repo which contains symlinks
+u = ui.ui()
+hg.clone(u, {}, BUNDLEPATH, 'test1')
diff --git a/tests/test-symlink-os-yes-fs-no.py.out b/tests/test-symlink-os-yes-fs-no.py.out
new file mode 100644
index 0000000..700d56c
--- /dev/null
+++ b/tests/test-symlink-os-yes-fs-no.py.out
@@ -0,0 +1,14 @@
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 4 changes to 4 files
+updating to branch default
+4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+requesting all changes
+adding changesets
+adding manifests
+adding file changes
+added 1 changesets with 4 changes to 4 files
+updating to branch default
+4 files updated, 0 files merged, 0 files removed, 0 files unresolved
diff --git a/tests/test-symlink-placeholder.t b/tests/test-symlink-placeholder.t
new file mode 100644
index 0000000..501b62b
--- /dev/null
+++ b/tests/test-symlink-placeholder.t
@@ -0,0 +1,72 @@
+ $ "$TESTDIR/hghave" symlink || exit 80
+
+Create extension that can disable symlink support:
+
+ $ cat > nolink.py <<EOF
+ > from mercurial import extensions, util
+ > def setflags(orig, f, l, x):
+ > pass
+ > def checklink(orig, path):
+ > return False
+ > def extsetup(ui):
+ > extensions.wrapfunction(util, 'setflags', setflags)
+ > extensions.wrapfunction(util, 'checklink', checklink)
+ > EOF
+
+ $ hg init unix-repo
+ $ cd unix-repo
+ $ echo foo > a
+ $ ln -s a b
+ $ hg ci -Am0
+ adding a
+ adding b
+ $ cd ..
+
+Simulate a checkout shared on NFS/Samba:
+
+ $ hg clone -q unix-repo shared
+ $ cd shared
+ $ rm b
+ $ echo foo > b
+ $ hg --config extensions.n=$TESTTMP/nolink.py status --debug
+ ignoring suspect symlink placeholder "b"
+
+Make a clone using placeholders:
+
+ $ hg --config extensions.n=$TESTTMP/nolink.py clone . ../win-repo
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../win-repo
+ $ cat b
+ a (no-eol)
+ $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+
+Write binary data to the placeholder:
+
+ >>> open('b', 'w').write('this is a binary\0')
+ $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+ ignoring suspect symlink placeholder "b"
+
+Write a long string to the placeholder:
+
+ >>> open('b', 'w').write('this' * 1000)
+ $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+ ignoring suspect symlink placeholder "b"
+
+Commit shouldn't succeed:
+
+ $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
+ nothing changed
+ [1]
+
+Write a valid string to the placeholder:
+
+ >>> open('b', 'w').write('this')
+ $ hg --config extensions.n=$TESTTMP/nolink.py st --debug
+ M b
+ $ hg --config extensions.n=$TESTTMP/nolink.py ci -m1
+ $ hg manifest tip --verbose
+ 644 a
+ 644 @ b
+
+ $ cd ..
diff --git a/tests/test-symlinks.t b/tests/test-symlinks.t
new file mode 100644
index 0000000..660ab91
--- /dev/null
+++ b/tests/test-symlinks.t
@@ -0,0 +1,256 @@
+ $ "$TESTDIR/hghave" symlink || exit 80
+
+== tests added in 0.7 ==
+
+ $ hg init test-symlinks-0.7; cd test-symlinks-0.7;
+ $ touch foo; ln -s foo bar;
+
+import with addremove -- symlink walking should _not_ screwup.
+
+ $ hg addremove
+ adding bar
+ adding foo
+
+commit -- the symlink should _not_ appear added to dir state
+
+ $ hg commit -m 'initial'
+
+ $ touch bomb
+
+again, symlink should _not_ show up on dir state
+
+ $ hg addremove
+ adding bomb
+
+Assert screamed here before, should go by without consequence
+
+ $ hg commit -m 'is there a bug?'
+ $ cd ..
+
+
+== fifo & ignore ==
+
+ $ hg init test; cd test;
+
+ $ mkdir dir
+ $ touch a.c dir/a.o dir/b.o
+
+test what happens if we want to trick hg
+
+ $ hg commit -A -m 0
+ adding a.c
+ adding dir/a.o
+ adding dir/b.o
+ $ echo "relglob:*.o" > .hgignore
+ $ rm a.c
+ $ rm dir/a.o
+ $ rm dir/b.o
+ $ mkdir dir/a.o
+ $ ln -s nonexist dir/b.o
+ $ mkfifo a.c
+
+it should show a.c, dir/a.o and dir/b.o deleted
+
+ $ hg status
+ M dir/b.o
+ ! a.c
+ ! dir/a.o
+ ? .hgignore
+ $ hg status a.c
+ a.c: unsupported file type (type is fifo)
+ ! a.c
+ $ cd ..
+
+
+== symlinks from outside the tree ==
+
+test absolute path through symlink outside repo
+
+ $ p=`pwd`
+ $ hg init x
+ $ ln -s x y
+ $ cd x
+ $ touch f
+ $ hg add f
+ $ hg status "$p"/y/f
+ A f
+
+try symlink outside repo to file inside
+
+ $ ln -s x/f ../z
+
+this should fail
+
+ $ hg status ../z && { echo hg mistakenly exited with status 0; exit 1; } || :
+ abort: ../z not under root
+ $ cd ..
+
+
+== cloning symlinks ==
+ $ hg init clone; cd clone;
+
+try cloning symlink in a subdir
+1. commit a symlink
+
+ $ mkdir -p a/b/c
+ $ cd a/b/c
+ $ ln -s /path/to/symlink/source demo
+ $ cd ../../..
+ $ hg stat
+ ? a/b/c/demo
+ $ hg commit -A -m 'add symlink in a/b/c subdir'
+ adding a/b/c/demo
+
+2. clone it
+
+ $ cd ..
+ $ hg clone clone clonedest
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+
+== symlink and git diffs ==
+
+git symlink diff
+
+ $ cd clonedest
+ $ hg diff --git -r null:tip
+ diff --git a/a/b/c/demo b/a/b/c/demo
+ new file mode 120000
+ --- /dev/null
+ +++ b/a/b/c/demo
+ @@ -0,0 +1,1 @@
+ +/path/to/symlink/source
+ \ No newline at end of file
+ $ hg export --git tip > ../sl.diff
+
+import git symlink diff
+
+ $ hg rm a/b/c/demo
+ $ hg commit -m'remove link'
+ $ hg import ../sl.diff
+ applying ../sl.diff
+ $ hg diff --git -r 1:tip
+ diff --git a/a/b/c/demo b/a/b/c/demo
+ new file mode 120000
+ --- /dev/null
+ +++ b/a/b/c/demo
+ @@ -0,0 +1,1 @@
+ +/path/to/symlink/source
+ \ No newline at end of file
+
+== symlinks and addremove ==
+
+directory moved and symlinked
+
+ $ mkdir foo
+ $ touch foo/a
+ $ hg ci -Ama
+ adding foo/a
+ $ mv foo bar
+ $ ln -s bar foo
+
+now addremove should remove old files
+
+ $ hg addremove
+ adding bar/a
+ adding foo
+ removing foo/a
+ $ cd ..
+
+== root of repository is symlinked ==
+
+ $ hg init root
+ $ ln -s root link
+ $ cd root
+ $ echo foo > foo
+ $ hg status
+ ? foo
+ $ hg status ../link
+ ? foo
+ $ hg add foo
+ $ hg cp foo "$TESTTMP/link/bar"
+ foo has not been committed yet, so no copy data will be stored for bar.
+ $ cd ..
+
+
+ $ hg init b
+ $ cd b
+ $ ln -s nothing dangling
+ $ hg commit -m 'commit symlink without adding' dangling
+ abort: dangling: file not tracked!
+ [255]
+ $ hg add dangling
+ $ hg commit -m 'add symlink'
+
+ $ hg tip -v
+ changeset: 0:cabd88b706fc
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: dangling
+ description:
+ add symlink
+
+
+ $ hg manifest --debug
+ 2564acbe54bbbedfbf608479340b359f04597f80 644 @ dangling
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> nothing
+
+ $ rm dangling
+ $ ln -s void dangling
+ $ hg commit -m 'change symlink'
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> void
+
+
+modifying link
+
+ $ rm dangling
+ $ ln -s empty dangling
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> empty
+
+
+reverting to rev 0:
+
+ $ hg revert -r 0 -a
+ reverting dangling
+ $ "$TESTDIR/readlink.py" dangling
+ dangling -> nothing
+
+
+backups:
+
+ $ "$TESTDIR/readlink.py" *.orig
+ dangling.orig -> empty
+ $ rm *.orig
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+copies
+
+ $ hg cp -v dangling dangling2
+ copying dangling to dangling2
+ $ hg st -Cmard
+ A dangling2
+ dangling
+ $ "$TESTDIR/readlink.py" dangling dangling2
+ dangling -> void
+ dangling2 -> void
+
+
+Issue995: hg copy -A incorrectly handles symbolic links
+
+ $ hg up -C
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ mkdir dir
+ $ ln -s dir dirlink
+ $ hg ci -qAm 'add dirlink'
+ $ mkdir newdir
+ $ mv dir newdir/dir
+ $ mv dirlink newdir/dirlink
+ $ hg mv -A dirlink newdir/dirlink
+
+ $ cd ..
diff --git a/tests/test-tag.t b/tests/test-tag.t
new file mode 100644
index 0000000..3731802
--- /dev/null
+++ b/tests/test-tag.t
@@ -0,0 +1,319 @@
+ $ hg init test
+ $ cd test
+
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m "test"
+ $ hg history
+ changeset: 0:acb14030fe0a
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+ $ hg tag ' '
+ abort: tag names cannot consist entirely of whitespace
+ [255]
+
+ $ hg tag "bleah"
+ $ hg history
+ changeset: 1:d4f0d2909abc
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag bleah for changeset acb14030fe0a
+
+ changeset: 0:acb14030fe0a
+ tag: bleah
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+
+ $ echo foo >> .hgtags
+ $ hg tag "bleah2"
+ abort: working copy of .hgtags is changed (please commit .hgtags manually)
+ [255]
+
+ $ hg revert .hgtags
+ $ hg tag -r 0 x y z y y z
+ abort: tag names must be unique
+ [255]
+ $ hg tag tap nada dot tip null .
+ abort: the name 'tip' is reserved
+ [255]
+ $ hg tag "bleah"
+ abort: tag 'bleah' already exists (use -f to force)
+ [255]
+ $ hg tag "blecch" "bleah"
+ abort: tag 'bleah' already exists (use -f to force)
+ [255]
+
+ $ hg tag --remove "blecch"
+ abort: tag 'blecch' does not exist
+ [255]
+ $ hg tag --remove "bleah" "blecch" "blough"
+ abort: tag 'blecch' does not exist
+ [255]
+
+ $ hg tag -r 0 "bleah0"
+ $ hg tag -l -r 1 "bleah1"
+ $ hg tag gack gawk gorp
+ $ hg tag -f gack
+ $ hg tag --remove gack gorp
+
+ $ hg tag "bleah "
+ abort: tag 'bleah' already exists (use -f to force)
+ [255]
+ $ hg tag " bleah"
+ abort: tag 'bleah' already exists (use -f to force)
+ [255]
+ $ hg tag " bleah"
+ abort: tag 'bleah' already exists (use -f to force)
+ [255]
+ $ hg tag -r 0 " bleahbleah "
+ $ hg tag -r 0 " bleah bleah "
+
+ $ cat .hgtags
+ acb14030fe0a21b60322c440ad2d20cf7685a376 bleah
+ acb14030fe0a21b60322c440ad2d20cf7685a376 bleah0
+ 336fccc858a4eb69609a291105009e484a6b6b8d gack
+ 336fccc858a4eb69609a291105009e484a6b6b8d gawk
+ 336fccc858a4eb69609a291105009e484a6b6b8d gorp
+ 336fccc858a4eb69609a291105009e484a6b6b8d gack
+ 799667b6f2d9b957f73fa644a918c2df22bab58f gack
+ 799667b6f2d9b957f73fa644a918c2df22bab58f gack
+ 0000000000000000000000000000000000000000 gack
+ 336fccc858a4eb69609a291105009e484a6b6b8d gorp
+ 0000000000000000000000000000000000000000 gorp
+ acb14030fe0a21b60322c440ad2d20cf7685a376 bleahbleah
+ acb14030fe0a21b60322c440ad2d20cf7685a376 bleah bleah
+
+ $ cat .hg/localtags
+ d4f0d2909abc9290e2773c08837d70c1794e3f5a bleah1
+
+tagging on a non-head revision
+
+ $ hg update 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg tag -l localblah
+ $ hg tag "foobar"
+ abort: not at a branch head (use -f to force)
+ [255]
+ $ hg tag -f "foobar"
+ $ cat .hgtags
+ acb14030fe0a21b60322c440ad2d20cf7685a376 foobar
+ $ cat .hg/localtags
+ d4f0d2909abc9290e2773c08837d70c1794e3f5a bleah1
+ acb14030fe0a21b60322c440ad2d20cf7685a376 localblah
+
+ $ hg tag -l 'xx
+ > newline'
+ abort: '\n' cannot be used in a tag name
+ [255]
+ $ hg tag -l 'xx:xx'
+ abort: ':' cannot be used in a tag name
+ [255]
+
+cloning local tags
+
+ $ cd ..
+ $ hg -R test log -r0:5
+ changeset: 0:acb14030fe0a
+ tag: bleah
+ tag: bleah bleah
+ tag: bleah0
+ tag: bleahbleah
+ tag: foobar
+ tag: localblah
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: test
+
+ changeset: 1:d4f0d2909abc
+ tag: bleah1
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag bleah for changeset acb14030fe0a
+
+ changeset: 2:336fccc858a4
+ tag: gawk
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag bleah0 for changeset acb14030fe0a
+
+ changeset: 3:799667b6f2d9
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag gack, gawk, gorp for changeset 336fccc858a4
+
+ changeset: 4:154eeb7c0138
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added tag gack for changeset 799667b6f2d9
+
+ changeset: 5:b4bb47aaff09
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Removed tag gack, gorp
+
+ $ hg clone -q -rbleah1 test test1
+ $ hg -R test1 parents --style=compact
+ 1[tip] d4f0d2909abc 1970-01-01 00:00 +0000 test
+ Added tag bleah for changeset acb14030fe0a
+
+ $ hg clone -q -r5 test#bleah1 test2
+ $ hg -R test2 parents --style=compact
+ 5[tip] b4bb47aaff09 1970-01-01 00:00 +0000 test
+ Removed tag gack, gorp
+
+ $ hg clone -q -U test#bleah1 test3
+ $ hg -R test3 parents --style=compact
+
+ $ cd test
+
+Issue601: hg tag doesn't do the right thing if .hgtags or localtags
+doesn't end with EOL
+
+ $ python << EOF
+ > f = file('.hg/localtags'); last = f.readlines()[-1][:-1]; f.close()
+ > f = file('.hg/localtags', 'w'); f.write(last); f.close()
+ > EOF
+ $ cat .hg/localtags; echo
+ acb14030fe0a21b60322c440ad2d20cf7685a376 localblah
+ $ hg tag -l localnewline
+ $ cat .hg/localtags; echo
+ acb14030fe0a21b60322c440ad2d20cf7685a376 localblah
+ c2899151f4e76890c602a2597a650a72666681bf localnewline
+
+
+ $ python << EOF
+ > f = file('.hgtags'); last = f.readlines()[-1][:-1]; f.close()
+ > f = file('.hgtags', 'w'); f.write(last); f.close()
+ > EOF
+ $ hg ci -m'broken manual edit of .hgtags'
+ $ cat .hgtags; echo
+ acb14030fe0a21b60322c440ad2d20cf7685a376 foobar
+ $ hg tag newline
+ $ cat .hgtags; echo
+ acb14030fe0a21b60322c440ad2d20cf7685a376 foobar
+ a0eea09de1eeec777b46f2085260a373b2fbc293 newline
+
+
+tag and branch using same name
+
+ $ hg branch tag-and-branch-same-name
+ marked working directory as branch tag-and-branch-same-name
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m"discouraged"
+ $ hg tag tag-and-branch-same-name
+ warning: tag tag-and-branch-same-name conflicts with existing branch name
+
+test custom commit messages
+
+ $ cat > editor.sh << '__EOF__'
+ > echo "custom tag message" > "$1"
+ > echo "second line" >> "$1"
+ > __EOF__
+ $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg tag custom-tag -e
+ $ hg log -l1 --template "{desc}\n"
+ custom tag message
+ second line
+
+
+local tag with .hgtags modified
+
+ $ hg tag hgtags-modified
+ $ hg rollback
+ repository tip rolled back to revision 13 (undo commit)
+ working directory now based on revision 13
+ $ hg st
+ M .hgtags
+ ? .hgtags.orig
+ ? editor.sh
+ $ hg tag --local baz
+ $ hg revert --no-backup .hgtags
+
+
+tagging when at named-branch-head that's not a topo-head
+
+ $ hg up default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge -t internal:local
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m 'merge named branch'
+ $ hg up 13
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg tag new-topo-head
+
+tagging on null rev
+
+ $ hg up null
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg tag nullrev
+ abort: not at a branch head (use -f to force)
+ [255]
+
+ $ hg init empty
+ $ hg tag -R empty nullrev
+ abort: null revision specified
+ [255]
+
+ $ hg tag -R empty -r 00000000000 -f nulltag
+ abort: null revision specified
+ [255]
+
+ $ cd ..
+
+tagging on an uncommitted merge (issue2542)
+
+ $ hg init repo-tag-uncommitted-merge
+ $ cd repo-tag-uncommitted-merge
+ $ echo c1 > f1
+ $ hg ci -Am0
+ adding f1
+ $ echo c2 > f2
+ $ hg ci -Am1
+ adding f2
+ $ hg co -q 0
+ $ hg branch b1
+ marked working directory as branch b1
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m2
+ $ hg up default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg merge b1
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+
+ $ hg tag t1
+ abort: uncommitted merge
+ [255]
+ $ hg status
+ $ hg tag --rev 1 t2
+ abort: uncommitted merge
+ [255]
+ $ hg tag --rev 1 --local t3
+ $ hg tags -v
+ tip 2:2a156e8887cc
+ t3 1:c3adabd1a5f4 local
+
+ $ cd ..
+
+commit hook on tag used to be run without write lock - issue3344
+
+ $ hg init repo-tag
+ $ touch repo-tag/test
+ $ hg -R repo-tag commit -A -m "test"
+ adding test
+ $ hg init repo-tag-target
+ $ hg -R repo-tag --config hooks.commit="\"hg\" push \"`pwd`/repo-tag-target\"" tag tag
+ pushing to $TESTTMP/repo-tag-target
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
diff --git a/tests/test-tags.t b/tests/test-tags.t
new file mode 100644
index 0000000..557c076
--- /dev/null
+++ b/tests/test-tags.t
@@ -0,0 +1,384 @@
+Helper functions:
+
+ $ cacheexists() {
+ > [ -f .hg/cache/tags ] && echo "tag cache exists" || echo "no tag cache"
+ > }
+
+ $ dumptags() {
+ > rev=$1
+ > echo "rev $rev: .hgtags:"
+ > hg cat -r$rev .hgtags
+ > }
+
+# XXX need to test that the tag cache works when we strip an old head
+# and add a new one rooted off non-tip: i.e. node and rev of tip are the
+# same, but stuff has changed behind tip.
+
+Setup:
+
+ $ hg init t
+ $ cd t
+ $ cacheexists
+ no tag cache
+ $ hg id
+ 000000000000 tip
+ $ cacheexists
+ no tag cache
+ $ echo a > a
+ $ hg add a
+ $ hg commit -m "test"
+ $ hg co
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg identify
+ acb14030fe0a tip
+ $ cacheexists
+ tag cache exists
+
+Try corrupting the cache
+
+ $ printf 'a b' > .hg/cache/tags
+ $ hg identify
+ .hg/cache/tags is corrupt, rebuilding it
+ acb14030fe0a tip
+ $ cacheexists
+ tag cache exists
+ $ hg identify
+ acb14030fe0a tip
+
+Create local tag with long name:
+
+ $ T=`hg identify --debug --id`
+ $ hg tag -l "This is a local tag with a really long name!"
+ $ hg tags
+ tip 0:acb14030fe0a
+ This is a local tag with a really long name! 0:acb14030fe0a
+ $ rm .hg/localtags
+
+Create a tag behind hg's back:
+
+ $ echo "$T first" > .hgtags
+ $ cat .hgtags
+ acb14030fe0a21b60322c440ad2d20cf7685a376 first
+ $ hg add .hgtags
+ $ hg commit -m "add tags"
+ $ hg tags
+ tip 1:b9154636be93
+ first 0:acb14030fe0a
+ $ hg identify
+ b9154636be93 tip
+
+Repeat with cold tag cache:
+
+ $ rm -f .hg/cache/tags
+ $ hg identify
+ b9154636be93 tip
+
+And again, but now unable to write tag cache:
+
+#if unix-permissions
+ $ rm -f .hg/cache/tags
+ $ chmod 555 .hg
+ $ hg identify
+ b9154636be93 tip
+ $ chmod 755 .hg
+#endif
+
+Create a branch:
+
+ $ echo bb > a
+ $ hg status
+ M a
+ $ hg identify
+ b9154636be93+ tip
+ $ hg co first
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg id
+ acb14030fe0a+ first
+ $ hg -v id
+ acb14030fe0a+ first
+ $ hg status
+ M a
+ $ echo 1 > b
+ $ hg add b
+ $ hg commit -m "branch"
+ created new head
+ $ hg id
+ c8edf04160c7 tip
+
+Merge the two heads:
+
+ $ hg merge 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg id
+ c8edf04160c7+b9154636be93+ tip
+ $ hg status
+ M .hgtags
+ $ hg commit -m "merge"
+
+Create a fake head, make sure tag not visible afterwards:
+
+ $ cp .hgtags tags
+ $ hg tag last
+ $ hg rm .hgtags
+ $ hg commit -m "remove"
+
+ $ mv tags .hgtags
+ $ hg add .hgtags
+ $ hg commit -m "readd"
+ $
+ $ hg tags
+ tip 6:35ff301afafe
+ first 0:acb14030fe0a
+
+Add invalid tags:
+
+ $ echo "spam" >> .hgtags
+ $ echo >> .hgtags
+ $ echo "foo bar" >> .hgtags
+ $ echo "a5a5 invalid" >> .hg/localtags
+ $ cat .hgtags
+ acb14030fe0a21b60322c440ad2d20cf7685a376 first
+ spam
+
+ foo bar
+ $ hg commit -m "tags"
+
+Report tag parse error on other head:
+
+ $ hg up 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 'x y' >> .hgtags
+ $ hg commit -m "head"
+ created new head
+
+ $ hg tags
+ .hgtags@75d9f02dfe28, line 2: cannot parse entry
+ .hgtags@75d9f02dfe28, line 4: node 'foo' is not well formed
+ .hgtags@c4be69a18c11, line 2: node 'x' is not well formed
+ tip 8:c4be69a18c11
+ first 0:acb14030fe0a
+ $ hg tip
+ changeset: 8:c4be69a18c11
+ tag: tip
+ parent: 3:ac5e980c4dc0
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: head
+
+
+Test tag precedence rules:
+
+ $ cd ..
+ $ hg init t2
+ $ cd t2
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo' # rev 0
+ $ hg tag bar # rev 1
+ $ echo >> foo
+ $ hg ci -m 'change foo 1' # rev 2
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg tag -r 1 -f bar # rev 3
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo 2' # rev 4
+ created new head
+ $ hg tags
+ tip 4:0c192d7d5e6b
+ bar 1:78391a272241
+
+Repeat in case of cache effects:
+
+ $ hg tags
+ tip 4:0c192d7d5e6b
+ bar 1:78391a272241
+
+Detailed dump of tag info:
+
+ $ hg heads -q # expect 4, 3, 2
+ 4:0c192d7d5e6b
+ 3:6fa450212aeb
+ 2:7a94127795a3
+ $ dumptags 2
+ rev 2: .hgtags:
+ bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar
+ $ dumptags 3
+ rev 3: .hgtags:
+ bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar
+ bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar
+ 78391a272241d70354aa14c874552cad6b51bb42 bar
+ $ dumptags 4
+ rev 4: .hgtags:
+ bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar
+
+Dump cache:
+
+ $ cat .hg/cache/tags
+ 4 0c192d7d5e6b78a714de54a2e9627952a877e25a 0c04f2a8af31de17fab7422878ee5a2dadbc943d
+ 3 6fa450212aeb2a21ed616a54aea39a4a27894cd7 7d3b718c964ef37b89e550ebdafd5789e76ce1b0
+ 2 7a94127795a33c10a370c93f731fd9fea0b79af6 0c04f2a8af31de17fab7422878ee5a2dadbc943d
+
+ 78391a272241d70354aa14c874552cad6b51bb42 bar
+
+Test tag removal:
+
+ $ hg tag --remove bar # rev 5
+ $ hg tip -vp
+ changeset: 5:5f6e8655b1c7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: .hgtags
+ description:
+ Removed tag bar
+
+
+ diff -r 0c192d7d5e6b -r 5f6e8655b1c7 .hgtags
+ --- a/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,3 @@
+ bbd179dfa0a71671c253b3ae0aa1513b60d199fa bar
+ +78391a272241d70354aa14c874552cad6b51bb42 bar
+ +0000000000000000000000000000000000000000 bar
+
+ $ hg tags
+ tip 5:5f6e8655b1c7
+ $ hg tags # again, try to expose cache bugs
+ tip 5:5f6e8655b1c7
+
+Remove nonexistent tag:
+
+ $ hg tag --remove foobar
+ abort: tag 'foobar' does not exist
+ [255]
+ $ hg tip
+ changeset: 5:5f6e8655b1c7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Removed tag bar
+
+
+Undo a tag with rollback:
+
+ $ hg rollback # destroy rev 5 (restore bar)
+ repository tip rolled back to revision 4 (undo commit)
+ working directory now based on revision 4
+ $ hg tags
+ tip 4:0c192d7d5e6b
+ bar 1:78391a272241
+ $ hg tags
+ tip 4:0c192d7d5e6b
+ bar 1:78391a272241
+
+Test tag rank:
+
+ $ cd ..
+ $ hg init t3
+ $ cd t3
+ $ echo foo > foo
+ $ hg add foo
+ $ hg ci -m 'add foo' # rev 0
+ $ hg tag -f bar # rev 1 bar -> 0
+ $ hg tag -f bar # rev 2 bar -> 1
+ $ hg tag -fr 0 bar # rev 3 bar -> 0
+ $ hg tag -fr 1 bar # rev 4 bar -> 1
+ $ hg tag -fr 0 bar # rev 5 bar -> 0
+ $ hg tags
+ tip 5:85f05169d91d
+ bar 0:bbd179dfa0a7
+ $ hg co 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo barbar > foo
+ $ hg ci -m 'change foo' # rev 6
+ created new head
+ $ hg tags
+ tip 6:735c3ca72986
+ bar 0:bbd179dfa0a7
+
+Don't allow moving tag without -f:
+
+ $ hg tag -r 3 bar
+ abort: tag 'bar' already exists (use -f to force)
+ [255]
+ $ hg tags
+ tip 6:735c3ca72986
+ bar 0:bbd179dfa0a7
+
+Strip 1: expose an old head:
+
+ $ hg --config extensions.mq= strip 5
+ saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob)
+ $ hg tags # partly stale cache
+ tip 5:735c3ca72986
+ bar 1:78391a272241
+ $ hg tags # up-to-date cache
+ tip 5:735c3ca72986
+ bar 1:78391a272241
+
+Strip 2: destroy whole branch, no old head exposed
+
+ $ hg --config extensions.mq= strip 4
+ saved backup bundle to $TESTTMP/t3/.hg/strip-backup/*-backup.hg (glob)
+ $ hg tags # partly stale
+ tip 4:735c3ca72986
+ bar 0:bbd179dfa0a7
+ $ rm -f .hg/cache/tags
+ $ hg tags # cold cache
+ tip 4:735c3ca72986
+ bar 0:bbd179dfa0a7
+
+Test tag rank with 3 heads:
+
+ $ cd ..
+ $ hg init t4
+ $ cd t4
+ $ echo foo > foo
+ $ hg add
+ adding foo
+ $ hg ci -m 'add foo' # rev 0
+ $ hg tag bar # rev 1 bar -> 0
+ $ hg tag -f bar # rev 2 bar -> 1
+ $ hg up -qC 0
+ $ hg tag -fr 2 bar # rev 3 bar -> 2
+ $ hg tags
+ tip 3:197c21bbbf2c
+ bar 2:6fa450212aeb
+ $ hg up -qC 0
+ $ hg tag -m 'retag rev 0' -fr 0 bar # rev 4 bar -> 0, but bar stays at 2
+
+Bar should still point to rev 2:
+
+ $ hg tags
+ tip 4:3b4b14ed0202
+ bar 2:6fa450212aeb
+
+Test that removing global/local tags does not get confused when trying
+to remove a tag of type X which actually only exists as a type Y:
+
+ $ cd ..
+ $ hg init t5
+ $ cd t5
+ $ echo foo > foo
+ $ hg add
+ adding foo
+ $ hg ci -m 'add foo' # rev 0
+
+ $ hg tag -r 0 -l localtag
+ $ hg tag --remove localtag
+ abort: tag 'localtag' is not a global tag
+ [255]
+ $
+ $ hg tag -r 0 globaltag
+ $ hg tag --remove -l globaltag
+ abort: tag 'globaltag' is not a local tag
+ [255]
+ $ hg tags -v
+ tip 1:a0b6fe111088
+ localtag 0:bbd179dfa0a7 local
+ globaltag 0:bbd179dfa0a7
+
+ $ cd ..
diff --git a/tests/test-template-engine.t b/tests/test-template-engine.t
new file mode 100644
index 0000000..9dafebf
--- /dev/null
+++ b/tests/test-template-engine.t
@@ -0,0 +1,39 @@
+
+ $ cat > engine.py << EOF
+ >
+ > from mercurial import templater
+ >
+ > class mytemplater(object):
+ > def __init__(self, loader, filters, defaults):
+ > self.loader = loader
+ >
+ > def process(self, t, map):
+ > tmpl = self.loader(t)
+ > for k, v in map.iteritems():
+ > if k in ('templ', 'ctx', 'repo', 'revcache', 'cache'):
+ > continue
+ > if hasattr(v, '__call__'):
+ > v = v(**map)
+ > v = templater.stringify(v)
+ > tmpl = tmpl.replace('{{%s}}' % k, v)
+ > yield tmpl
+ >
+ > templater.engines['my'] = mytemplater
+ > EOF
+ $ hg init test
+ $ echo '[extensions]' > test/.hg/hgrc
+ $ echo "engine = `pwd`/engine.py" >> test/.hg/hgrc
+ $ cd test
+ $ cat > mymap << EOF
+ > changeset = my:changeset.txt
+ > EOF
+ $ cat > changeset.txt << EOF
+ > {{rev}} {{node}} {{author}}
+ > EOF
+ $ hg ci -Ama
+ adding changeset.txt
+ adding mymap
+ $ hg log --style=./mymap
+ 0 97e5f848f0936960273bbf75be6388cd0350a32b test
+
+ $ cd ..
diff --git a/tests/test-transplant.t b/tests/test-transplant.t
new file mode 100644
index 0000000..36a61f7
--- /dev/null
+++ b/tests/test-transplant.t
@@ -0,0 +1,634 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+ $ cat <<EOF >> $HGRCPATH
+ > [extensions]
+ > transplant=
+ > EOF
+
+ $ hg init t
+ $ cd t
+ $ echo r1 > r1
+ $ hg ci -Amr1 -d'0 0'
+ adding r1
+ $ echo r2 > r2
+ $ hg ci -Amr2 -d'1 0'
+ adding r2
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+ $ echo b1 > b1
+ $ hg ci -Amb1 -d '0 0'
+ adding b1
+ created new head
+ $ echo b2 > b2
+ $ hg ci -Amb2 -d '1 0'
+ adding b2
+ $ echo b3 > b3
+ $ hg ci -Amb3 -d '2 0'
+ adding b3
+
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 4 b3
+ 3 b2
+ 2 0:17ab29e464c6 b1
+ 1 r2
+ 0 r1
+
+ $ hg clone . ../rebase
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../rebase
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 3 files removed, 0 files unresolved
+
+rebase b onto r1
+
+ $ hg transplant -a -b tip
+ applying 37a1297eb21b
+ 37a1297eb21b transplanted to e234d668f844
+ applying 722f4667af76
+ 722f4667af76 transplanted to 539f377d78df
+ applying a53251cdf717
+ a53251cdf717 transplanted to ffd6818a3975
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 7 b3
+ 6 b2
+ 5 1:d11e3596cc1a b1
+ 4 b3
+ 3 b2
+ 2 0:17ab29e464c6 b1
+ 1 r2
+ 0 r1
+
+test transplanted revset
+
+ $ hg log -r 'transplanted()' --template '{rev} {parents} {desc}\n'
+ 5 1:d11e3596cc1a b1
+ 6 b2
+ 7 b3
+ $ hg help revsets | grep transplanted
+ "transplanted([set])"
+ Transplanted changesets in set, or all transplanted changesets.
+
+test tranplanted keyword
+
+ $ hg log --template '{rev} {transplanted}\n'
+ 7 a53251cdf717679d1907b289f991534be05c997a
+ 6 722f4667af767100cb15b6a79324bf8abbfe1ef4
+ 5 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21
+ 4
+ 3
+ 2
+ 1
+ 0
+
+test destination() revset predicate with a transplant of a transplant; new
+clone so subsequent rollback isn't affected
+ $ hg clone -q . ../destination
+ $ cd ../destination
+ $ hg up -Cq 0
+ $ hg branch -q b4
+ $ hg ci -qm "b4"
+ $ hg transplant 7
+ applying ffd6818a3975
+ ffd6818a3975 transplanted to 502236fa76bb
+
+
+ $ hg log -r 'destination()'
+ changeset: 5:e234d668f844
+ parent: 1:d11e3596cc1a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b1
+
+ changeset: 6:539f377d78df
+ user: test
+ date: Thu Jan 01 00:00:01 1970 +0000
+ summary: b2
+
+ changeset: 7:ffd6818a3975
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+ changeset: 9:502236fa76bb
+ branch: b4
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+ $ hg log -r 'destination(a53251cdf717)'
+ changeset: 7:ffd6818a3975
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+ changeset: 9:502236fa76bb
+ branch: b4
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+
+test subset parameter in reverse order
+ $ hg log -r 'reverse(all()) and destination(a53251cdf717)'
+ changeset: 9:502236fa76bb
+ branch: b4
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+ changeset: 7:ffd6818a3975
+ user: test
+ date: Thu Jan 01 00:00:02 1970 +0000
+ summary: b3
+
+
+back to the original dir
+ $ cd ../rebase
+
+rollback the transplant
+ $ hg rollback
+ repository tip rolled back to revision 4 (undo transplant)
+ working directory now based on revision 1
+ $ hg tip -q
+ 4:a53251cdf717
+ $ hg parents -q
+ 1:d11e3596cc1a
+ $ hg status
+ ? b1
+ ? b2
+ ? b3
+
+ $ hg clone ../t ../prune
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../prune
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 3 files removed, 0 files unresolved
+
+rebase b onto r1, skipping b2
+
+ $ hg transplant -a -b tip -p 3
+ applying 37a1297eb21b
+ 37a1297eb21b transplanted to e234d668f844
+ applying a53251cdf717
+ a53251cdf717 transplanted to 7275fda4d04f
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 6 b3
+ 5 1:d11e3596cc1a b1
+ 4 b3
+ 3 b2
+ 2 0:17ab29e464c6 b1
+ 1 r2
+ 0 r1
+
+test same-parent transplant with --log
+
+ $ hg clone -r 1 ../t ../sameparent
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../sameparent
+ $ hg transplant --log -s ../prune 5
+ searching for changes
+ applying e234d668f844
+ e234d668f844 transplanted to e07aea8ecf9c
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 2 b1
+ (transplanted from e234d668f844e1b1a765f01db83a32c0c7bfa170)
+ 1 r2
+ 0 r1
+remote transplant
+
+ $ hg clone -r 1 ../t ../remote
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../remote
+ $ hg transplant --log -s ../t 2 4
+ searching for changes
+ applying 37a1297eb21b
+ 37a1297eb21b transplanted to c19cf0ccb069
+ applying a53251cdf717
+ a53251cdf717 transplanted to f7fe5bf98525
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 3 b3
+ (transplanted from a53251cdf717679d1907b289f991534be05c997a)
+ 2 b1
+ (transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21)
+ 1 r2
+ 0 r1
+
+skip previous transplants
+
+ $ hg transplant -s ../t -a -b 4
+ searching for changes
+ applying 722f4667af76
+ 722f4667af76 transplanted to 47156cd86c0b
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 4 b2
+ 3 b3
+ (transplanted from a53251cdf717679d1907b289f991534be05c997a)
+ 2 b1
+ (transplanted from 37a1297eb21b3ef5c5d2ffac22121a0988ed9f21)
+ 1 r2
+ 0 r1
+
+skip local changes transplanted to the source
+
+ $ echo b4 > b4
+ $ hg ci -Amb4 -d '3 0'
+ adding b4
+ $ hg clone ../t ../pullback
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../pullback
+ $ hg transplant -s ../remote -a -b tip
+ searching for changes
+ applying 4333daefcb15
+ 4333daefcb15 transplanted to 5f42c04e07cc
+
+
+remote transplant with pull
+
+ $ hg -R ../t serve -p $HGPORT -d --pid-file=../t.pid
+ $ cat ../t.pid >> $DAEMON_PIDS
+
+ $ hg clone -r 0 ../t ../rp
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../rp
+ $ hg transplant -s http://localhost:$HGPORT/ 2 4
+ searching for changes
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ applying a53251cdf717
+ a53251cdf717 transplanted to 8d9279348abb
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 2 b3
+ 1 b1
+ 0 r1
+
+transplant --continue
+
+ $ hg init ../tc
+ $ cd ../tc
+ $ cat <<EOF > foo
+ > foo
+ > bar
+ > baz
+ > EOF
+ $ echo toremove > toremove
+ $ echo baz > baz
+ $ hg ci -Amfoo
+ adding baz
+ adding foo
+ adding toremove
+ $ cat <<EOF > foo
+ > foo2
+ > bar2
+ > baz2
+ > EOF
+ $ rm toremove
+ $ echo added > added
+ $ hg ci -Amfoo2
+ adding added
+ removing toremove
+ $ echo bar > bar
+ $ cat > baz <<EOF
+ > before baz
+ > baz
+ > after baz
+ > EOF
+ $ hg ci -Ambar
+ adding bar
+ $ echo bar2 >> bar
+ $ hg ci -mbar2
+ $ hg up 0
+ 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo foobar > foo
+ $ hg ci -mfoobar
+ created new head
+ $ hg transplant 1:3
+ applying 46ae92138f3c
+ patching file foo
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file foo.rej
+ patch failed to apply
+ abort: fix up the merge and run hg transplant --continue
+ [255]
+
+transplant -c shouldn't use an old changeset
+
+ $ hg up -C
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ rm added
+ $ hg transplant 1
+ applying 46ae92138f3c
+ patching file foo
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file foo.rej
+ patch failed to apply
+ abort: fix up the merge and run hg transplant --continue
+ [255]
+ $ hg transplant --continue
+ 46ae92138f3c transplanted as 9159dada197d
+ $ hg transplant 1:3
+ skipping already applied revision 1:46ae92138f3c
+ applying 9d6d6b5a8275
+ 9d6d6b5a8275 transplanted to 2d17a10c922f
+ applying 1dab759070cf
+ 1dab759070cf transplanted to e06a69927eb0
+ $ hg locate
+ added
+ bar
+ baz
+ foo
+
+test multiple revisions and --continue
+
+ $ hg up -qC 0
+ $ echo bazbaz > baz
+ $ hg ci -Am anotherbaz baz
+ created new head
+ $ hg transplant 1:3
+ applying 46ae92138f3c
+ 46ae92138f3c transplanted to 1024233ea0ba
+ applying 9d6d6b5a8275
+ patching file baz
+ Hunk #1 FAILED at 0
+ 1 out of 1 hunks FAILED -- saving rejects to file baz.rej
+ patch failed to apply
+ abort: fix up the merge and run hg transplant --continue
+ [255]
+ $ echo fixed > baz
+ $ hg transplant --continue
+ 9d6d6b5a8275 transplanted as d80c49962290
+ applying 1dab759070cf
+ 1dab759070cf transplanted to aa0ffe6bd5ae
+
+ $ cd ..
+
+Issue1111: Test transplant --merge
+
+ $ hg init t1111
+ $ cd t1111
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo b >> a
+ $ hg ci -m appendb
+ $ echo c >> a
+ $ hg ci -m appendc
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo d >> a
+ $ hg ci -m appendd
+ created new head
+
+tranplant
+
+ $ hg transplant -m 1
+ applying 42dc4432fd35
+ 1:42dc4432fd35 merged at a9f4acbac129
+ $ cd ..
+
+test transplant into empty repository
+
+ $ hg init empty
+ $ cd empty
+ $ hg transplant -s ../t -b tip -a
+ adding changesets
+ adding manifests
+ adding file changes
+ added 4 changesets with 4 changes to 4 files
+ $ cd ..
+
+
+#if unix-permissions system-sh
+
+test filter
+
+ $ hg init filter
+ $ cd filter
+ $ cat <<'EOF' >test-filter
+ > #!/bin/sh
+ > sed 's/r1/r2/' $1 > $1.new
+ > mv $1.new $1
+ > EOF
+ $ chmod +x test-filter
+ $ hg transplant -s ../t -b tip -a --filter ./test-filter
+ filtering * (glob)
+ applying 17ab29e464c6
+ 17ab29e464c6 transplanted to e9ffc54ea104
+ filtering * (glob)
+ applying 37a1297eb21b
+ 37a1297eb21b transplanted to 348b36d0b6a5
+ filtering * (glob)
+ applying 722f4667af76
+ 722f4667af76 transplanted to 0aa6979afb95
+ filtering * (glob)
+ applying a53251cdf717
+ a53251cdf717 transplanted to 14f8512272b5
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 3 b3
+ 2 b2
+ 1 b1
+ 0 r2
+ $ cd ..
+
+
+test filter with failed patch
+
+ $ cd filter
+ $ hg up 0
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ $ echo foo > b1
+ $ hg ci -Am foo
+ adding b1
+ adding test-filter
+ created new head
+ $ hg transplant 1 --filter ./test-filter
+ filtering * (glob)
+ applying 348b36d0b6a5
+ file b1 already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file b1.rej
+ patch failed to apply
+ abort: fix up the merge and run hg transplant --continue
+ [255]
+ $ cd ..
+
+test environment passed to filter
+
+ $ hg init filter-environment
+ $ cd filter-environment
+ $ cat <<'EOF' >test-filter-environment
+ > #!/bin/sh
+ > echo "Transplant by $HGUSER" >> $1
+ > echo "Transplant from rev $HGREVISION" >> $1
+ > EOF
+ $ chmod +x test-filter-environment
+ $ hg transplant -s ../t --filter ./test-filter-environment 0
+ filtering * (glob)
+ applying 17ab29e464c6
+ 17ab29e464c6 transplanted to 5190e68026a0
+
+ $ hg log --template '{rev} {parents} {desc}\n'
+ 0 r1
+ Transplant by test
+ Transplant from rev 17ab29e464c6ca53e329470efe2a9918ac617a6f
+ $ cd ..
+
+test transplant with filter handles invalid changelog
+
+ $ hg init filter-invalid-log
+ $ cd filter-invalid-log
+ $ cat <<'EOF' >test-filter-invalid-log
+ > #!/bin/sh
+ > echo "" > $1
+ > EOF
+ $ chmod +x test-filter-invalid-log
+ $ hg transplant -s ../t --filter ./test-filter-invalid-log 0
+ filtering * (glob)
+ abort: filter corrupted changeset (no user or date)
+ [255]
+ $ cd ..
+
+#endif
+
+
+test with a win32ext like setup (differing EOLs)
+
+ $ hg init twin1
+ $ cd twin1
+ $ echo a > a
+ $ echo b > b
+ $ echo b >> b
+ $ hg ci -Am t
+ adding a
+ adding b
+ $ echo a > b
+ $ echo b >> b
+ $ hg ci -m changeb
+ $ cd ..
+
+ $ hg init twin2
+ $ cd twin2
+ $ echo '[patch]' >> .hg/hgrc
+ $ echo 'eol = crlf' >> .hg/hgrc
+ $ python -c "file('b', 'wb').write('b\r\nb\r\n')"
+ $ hg ci -Am addb
+ adding b
+ $ hg transplant -s ../twin1 tip
+ searching for changes
+ warning: repository is unrelated
+ applying 2e849d776c17
+ 2e849d776c17 transplanted to 8e65bebc063e
+ $ cat b
+ a\r (esc)
+ b\r (esc)
+ $ cd ..
+
+test transplant with merge changeset is skipped
+
+ $ hg init merge1a
+ $ cd merge1a
+ $ echo a > a
+ $ hg ci -Am a
+ adding a
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m branchb
+ $ echo b > b
+ $ hg ci -Am b
+ adding b
+ $ hg update default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m mergeb
+ $ cd ..
+
+ $ hg init merge1b
+ $ cd merge1b
+ $ hg transplant -s ../merge1a tip
+ $ cd ..
+
+test transplant with merge changeset accepts --parent
+
+ $ hg init merge2a
+ $ cd merge2a
+ $ echo a > a
+ $ hg ci -Am a
+ adding a
+ $ hg branch b
+ marked working directory as branch b
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg ci -m branchb
+ $ echo b > b
+ $ hg ci -Am b
+ adding b
+ $ hg update default
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg merge b
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m mergeb
+ $ cd ..
+
+ $ hg init merge2b
+ $ cd merge2b
+ $ hg transplant -s ../merge2a --parent 0 tip
+ applying be9f9b39483f
+ be9f9b39483f transplanted to 9959e51f94d1
+ $ cd ..
+
+test transplanting a patch turning into a no-op
+
+ $ hg init binarysource
+ $ cd binarysource
+ $ echo a > a
+ $ hg ci -Am adda a
+ >>> file('b', 'wb').write('\0b1')
+ $ hg ci -Am addb b
+ >>> file('b', 'wb').write('\0b2')
+ $ hg ci -m changeb b
+ $ cd ..
+
+ $ hg clone -r0 binarysource binarydest
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd binarydest
+ $ cp ../binarysource/b b
+ $ hg ci -Am addb2 b
+ $ hg transplant -s ../binarysource 2
+ searching for changes
+ applying 7a7d57e15850
+ skipping emptied changeset 7a7d57e15850
+ $ cd ..
+
diff --git a/tests/test-treediscovery-legacy.t b/tests/test-treediscovery-legacy.t
new file mode 100644
index 0000000..bc3563c
--- /dev/null
+++ b/tests/test-treediscovery-legacy.t
@@ -0,0 +1,371 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Tests discovery against servers without getbundle support:
+
+ $ cat >> $HGRCPATH <<EOF
+ > [ui]
+ > logtemplate="{rev} {node|short}: {desc} {branches}\n"
+ > [extensions]
+ > graphlog=
+ > EOF
+ $ cp $HGRCPATH $HGRCPATH-withcap
+
+ $ CAP="getbundle known changegroupsubset"
+ $ . "$TESTDIR/notcapable"
+ $ cp $HGRCPATH $HGRCPATH-nocap
+ $ cp $HGRCPATH-withcap $HGRCPATH
+
+Prep for test server without branchmap support
+
+ $ CAP="branchmap"
+ $ . "$TESTDIR/notcapable"
+ $ cp $HGRCPATH $HGRCPATH-nocap-branchmap
+ $ cp $HGRCPATH-withcap $HGRCPATH
+
+Setup HTTP server control:
+
+ $ remote=http://localhost:$HGPORT/
+ $ export remote
+ $ tstart() {
+ > echo '[web]' > $1/.hg/hgrc
+ > echo 'push_ssl = false' >> $1/.hg/hgrc
+ > echo 'allow_push = *' >> $1/.hg/hgrc
+ > cp $HGRCPATH-nocap $HGRCPATH
+ > hg serve -R $1 -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ > }
+ $ tstop() {
+ > "$TESTDIR/killdaemons.py"
+ > cp $HGRCPATH-withcap $HGRCPATH
+ > }
+
+Both are empty:
+
+ $ hg init empty1
+ $ hg init empty2
+ $ tstart empty2
+ $ hg incoming -R empty1 $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg outgoing -R empty1 $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg pull -R empty1 $remote
+ pulling from http://localhost:$HGPORT/
+ no changes found
+ $ hg push -R empty1 $remote
+ pushing to http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ tstop
+
+Base repo:
+
+ $ hg init main
+ $ cd main
+ $ hg debugbuilddag -mo '+2:tbase @name1 +3:thead1 <tbase @name2 +4:thead2 @both /thead1 +2:tmaintip'
+ $ hg glog
+ o 11 a19bfa7e7328: r11 both
+ |
+ o 10 8b6bad1512e1: r10 both
+ |
+ o 9 025829e08038: r9 both
+ |\
+ | o 8 d8f638ac69e9: r8 name2
+ | |
+ | o 7 b6b4d315a2ac: r7 name2
+ | |
+ | o 6 6c6f5d5f3c11: r6 name2
+ | |
+ | o 5 70314b29987d: r5 name2
+ | |
+ o | 4 e71dbbc70e03: r4 name1
+ | |
+ o | 3 2c8d5d5ec612: r3 name1
+ | |
+ o | 2 a7892891da29: r2 name1
+ |/
+ o 1 0019a3b924fd: r1
+ |
+ o 0 d57206cc072a: r0
+
+ $ cd ..
+ $ tstart main
+
+Full clone:
+
+ $ hg clone main full
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd full
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is empty:
+
+ $ cd empty1
+ $ hg incoming $remote --rev name1
+ comparing with http://localhost:$HGPORT/
+ abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability!
+ [255]
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ 0 d57206cc072a: r0
+ 1 0019a3b924fd: r1
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 5 70314b29987d: r5 name2
+ 6 6c6f5d5f3c11: r6 name2
+ 7 b6b4d315a2ac: r7 name2
+ 8 d8f638ac69e9: r8 name2
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 12 changesets with 24 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is subset:
+
+ $ cp $HGRCPATH-withcap $HGRCPATH
+ $ hg clone main subset --rev name2 ; cd subset
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ updating to branch name2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cp $HGRCPATH-nocap $HGRCPATH
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Remote is empty:
+
+ $ tstop ; tstart empty2
+ $ cd main
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 0 d57206cc072a: r0
+ 1 0019a3b924fd: r1
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 5 70314b29987d: r5 name2
+ 6 6c6f5d5f3c11: r6 name2
+ 7 b6b4d315a2ac: r7 name2
+ 8 d8f638ac69e9: r8 name2
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 12 changesets with 24 changes to 2 files
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is superset:
+
+ $ tstop
+ $ hg clone main subset2 --rev name2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ updating to branch name2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ tstart subset2
+ $ cd main
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: push creates new remote branches: both, name1!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 6 changesets with 12 changes to 2 files
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Partial pull:
+
+ $ tstop ; tstart main
+ $ hg clone $remote partial --rev name2
+ abort: partial pull cannot be done because other repository doesn't support changegroupsubset.
+ [255]
+ $ hg init partial; cd partial
+ $ hg incoming $remote --rev name2
+ comparing with http://localhost:$HGPORT/
+ abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability!
+ [255]
+ $ hg pull $remote --rev name2
+ pulling from http://localhost:$HGPORT/
+ abort: partial pull cannot be done because other repository doesn't support changegroupsubset.
+ [255]
+ $ cd ..
+
+ $ tstop
+
+Exercise pushing to server without branchmap capability
+
+ $ cp $HGRCPATH-nocap-branchmap $HGRCPATH-nocap
+ $ hg init rlocal
+ $ cd rlocal
+ $ echo A > A
+ $ hg ci -Am A
+ adding A
+ $ cd ..
+ $ hg clone rlocal rremote
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd rlocal
+ $ echo B > B
+ $ hg ci -Am B
+ adding B
+ $ cd ..
+ $ tstart rremote
+
+ $ cd rlocal
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 1 27547f69f254: B
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+ $ tstop
diff --git a/tests/test-treediscovery.t b/tests/test-treediscovery.t
new file mode 100644
index 0000000..1f59d0b
--- /dev/null
+++ b/tests/test-treediscovery.t
@@ -0,0 +1,504 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Tests discovery against servers without getbundle support:
+
+ $ CAP=getbundle
+ $ . "$TESTDIR/notcapable"
+ $ cat >> $HGRCPATH <<EOF
+ > [ui]
+ > logtemplate="{rev} {node|short}: {desc} {branches}\n"
+ > [extensions]
+ > graphlog=
+ > EOF
+
+Setup HTTP server control:
+
+ $ remote=http://localhost:$HGPORT/
+ $ export remote
+ $ tstart() {
+ > echo '[web]' > $1/.hg/hgrc
+ > echo 'push_ssl = false' >> $1/.hg/hgrc
+ > echo 'allow_push = *' >> $1/.hg/hgrc
+ > hg serve -R $1 -p $HGPORT -d --pid-file=hg.pid -E errors.log
+ > cat hg.pid >> $DAEMON_PIDS
+ > }
+ $ tstop() {
+ > "$TESTDIR/killdaemons.py"
+ > }
+
+Both are empty:
+
+ $ hg init empty1
+ $ hg init empty2
+ $ tstart empty2
+ $ hg incoming -R empty1 $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg outgoing -R empty1 $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg pull -R empty1 $remote
+ pulling from http://localhost:$HGPORT/
+ no changes found
+ $ hg push -R empty1 $remote
+ pushing to http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ tstop
+
+Base repo:
+
+ $ hg init main
+ $ cd main
+ $ hg debugbuilddag -mo '+2:tbase @name1 +3:thead1 <tbase @name2 +4:thead2 @both /thead1 +2:tmaintip'
+ $ hg glog
+ o 11 a19bfa7e7328: r11 both
+ |
+ o 10 8b6bad1512e1: r10 both
+ |
+ o 9 025829e08038: r9 both
+ |\
+ | o 8 d8f638ac69e9: r8 name2
+ | |
+ | o 7 b6b4d315a2ac: r7 name2
+ | |
+ | o 6 6c6f5d5f3c11: r6 name2
+ | |
+ | o 5 70314b29987d: r5 name2
+ | |
+ o | 4 e71dbbc70e03: r4 name1
+ | |
+ o | 3 2c8d5d5ec612: r3 name1
+ | |
+ o | 2 a7892891da29: r2 name1
+ |/
+ o 1 0019a3b924fd: r1
+ |
+ o 0 d57206cc072a: r0
+
+ $ cd ..
+ $ tstart main
+
+Full clone:
+
+ $ hg clone main full
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd full
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is empty:
+
+ $ cd empty1
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ 0 d57206cc072a: r0
+ 1 0019a3b924fd: r1
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 5 70314b29987d: r5 name2
+ 6 6c6f5d5f3c11: r6 name2
+ 7 b6b4d315a2ac: r7 name2
+ 8 d8f638ac69e9: r8 name2
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 12 changesets with 24 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is subset:
+
+ $ hg clone main subset --rev name2 ; cd subset
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ updating to branch name2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Remote is empty:
+
+ $ tstop ; tstart empty2
+ $ cd main
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 0 d57206cc072a: r0
+ 1 0019a3b924fd: r1
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 5 70314b29987d: r5 name2
+ 6 6c6f5d5f3c11: r6 name2
+ 7 b6b4d315a2ac: r7 name2
+ 8 d8f638ac69e9: r8 name2
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 12 changesets with 24 changes to 2 files
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Local is superset:
+
+ $ tstop
+ $ hg clone main subset2 --rev name2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ updating to branch name2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ tstart subset2
+ $ cd main
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 2 a7892891da29: r2 name1
+ 3 2c8d5d5ec612: r3 name1
+ 4 e71dbbc70e03: r4 name1
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ $ hg push $remote
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ abort: push creates new remote branches: both, name1!
+ (use 'hg push --new-branch' to create new remote branches)
+ [255]
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 6 changesets with 12 changes to 2 files
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Partial pull:
+
+ $ tstop ; tstart main
+ $ hg clone $remote partial --rev name2
+ adding changesets
+ adding manifests
+ adding file changes
+ added 6 changesets with 12 changes to 2 files
+ updating to branch name2
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd partial
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ hg incoming $remote --rev name1
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ $ hg pull $remote --rev name1
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 6 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 9 025829e08038: r9 both
+ 10 8b6bad1512e1: r10 both
+ 11 a19bfa7e7328: r11 both
+ $ cd ..
+
+Both have new stuff in new named branches:
+
+ $ tstop
+ $ hg clone main repo1a --rev name1 -q
+ $ hg clone repo1a repo1b -q
+ $ hg clone main repo2a --rev name2 -q
+ $ hg clone repo2a repo2b -q
+ $ tstart repo1a
+
+ $ cd repo2a
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 2 70314b29987d: r5 name2
+ 3 6c6f5d5f3c11: r6 name2
+ 4 b6b4d315a2ac: r7 name2
+ 5 d8f638ac69e9: r8 name2
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 4 changesets with 8 changes to 2 files (+1 heads)
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 6 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+ $ tstop ; tstart repo1b
+ $ cd repo2b
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 6 a7892891da29: r2 name1
+ 7 2c8d5d5ec612: r3 name1
+ 8 e71dbbc70e03: r4 name1
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 2 70314b29987d: r5 name2
+ 3 6c6f5d5f3c11: r6 name2
+ 4 b6b4d315a2ac: r7 name2
+ 5 d8f638ac69e9: r8 name2
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 6 changes to 2 files (+1 heads)
+ (run 'hg heads' to see heads)
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 4 changesets with 8 changes to 2 files (+1 heads)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+Both have new stuff in existing named branches:
+
+ $ tstop
+ $ rm -r repo1a repo1b repo2a repo2b
+ $ hg clone main repo1a --rev 3 --rev 8 -q
+ $ hg clone repo1a repo1b -q
+ $ hg clone main repo2a --rev 4 --rev 7 -q
+ $ hg clone repo2a repo2b -q
+ $ tstart repo1a
+
+ $ cd repo2a
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 8 d8f638ac69e9: r8 name2
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 4 e71dbbc70e03: r4 name1
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 2 changes to 2 files
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+ $ tstop ; tstart repo1b
+ $ cd repo2b
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 8 d8f638ac69e9: r8 name2
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ 4 e71dbbc70e03: r4 name1
+ $ hg pull $remote
+ pulling from http://localhost:$HGPORT/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ (run 'hg update' to get a working copy)
+ $ hg push $remote --new-branch
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 2 changes to 2 files
+ $ hg incoming $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ hg outgoing $remote
+ comparing with http://localhost:$HGPORT/
+ searching for changes
+ no changes found
+ [1]
+ $ cd ..
+
+ $ tstop
+
diff --git a/tests/test-trusted.py b/tests/test-trusted.py
new file mode 100644
index 0000000..3999a0b
--- /dev/null
+++ b/tests/test-trusted.py
@@ -0,0 +1,197 @@
+# Since it's not easy to write a test that portably deals
+# with files from different users/groups, we cheat a bit by
+# monkey-patching some functions in the util module
+
+import os
+from mercurial import ui, util, error
+
+hgrc = os.environ['HGRCPATH']
+f = open(hgrc)
+basehgrc = f.read()
+f.close()
+
+def testui(user='foo', group='bar', tusers=(), tgroups=(),
+ cuser='foo', cgroup='bar', debug=False, silent=False,
+ report=True):
+ # user, group => owners of the file
+ # tusers, tgroups => trusted users/groups
+ # cuser, cgroup => user/group of the current process
+
+ # write a global hgrc with the list of trusted users/groups and
+ # some setting so that we can be sure it was read
+ f = open(hgrc, 'w')
+ f.write(basehgrc)
+ f.write('\n[paths]\n')
+ f.write('global = /some/path\n\n')
+
+ if tusers or tgroups:
+ f.write('[trusted]\n')
+ if tusers:
+ f.write('users = %s\n' % ', '.join(tusers))
+ if tgroups:
+ f.write('groups = %s\n' % ', '.join(tgroups))
+ f.close()
+
+ # override the functions that give names to uids and gids
+ def username(uid=None):
+ if uid is None:
+ return cuser
+ return user
+ util.username = username
+
+ def groupname(gid=None):
+ if gid is None:
+ return 'bar'
+ return group
+ util.groupname = groupname
+
+ def isowner(st):
+ return user == cuser
+ util.isowner = isowner
+
+ # try to read everything
+ #print '# File belongs to user %s, group %s' % (user, group)
+ #print '# trusted users = %s; trusted groups = %s' % (tusers, tgroups)
+ kind = ('different', 'same')
+ who = ('', 'user', 'group', 'user and the group')
+ trusted = who[(user in tusers) + 2*(group in tgroups)]
+ if trusted:
+ trusted = ', but we trust the ' + trusted
+ print '# %s user, %s group%s' % (kind[user == cuser], kind[group == cgroup],
+ trusted)
+
+ u = ui.ui()
+ u.setconfig('ui', 'debug', str(bool(debug)))
+ u.setconfig('ui', 'report_untrusted', str(bool(report)))
+ u.readconfig('.hg/hgrc')
+ if silent:
+ return u
+ print 'trusted'
+ for name, path in u.configitems('paths'):
+ print ' ', name, '=', path
+ print 'untrusted'
+ for name, path in u.configitems('paths', untrusted=True):
+ print '.',
+ u.config('paths', name) # warning with debug=True
+ print '.',
+ u.config('paths', name, untrusted=True) # no warnings
+ print name, '=', path
+ print
+
+ return u
+
+os.mkdir('repo')
+os.chdir('repo')
+os.mkdir('.hg')
+f = open('.hg/hgrc', 'w')
+f.write('[paths]\n')
+f.write('local = /another/path\n\n')
+f.close()
+
+#print '# Everything is run by user foo, group bar\n'
+
+# same user, same group
+testui()
+# same user, different group
+testui(group='def')
+# different user, same group
+testui(user='abc')
+# ... but we trust the group
+testui(user='abc', tgroups=['bar'])
+# different user, different group
+testui(user='abc', group='def')
+# ... but we trust the user
+testui(user='abc', group='def', tusers=['abc'])
+# ... but we trust the group
+testui(user='abc', group='def', tgroups=['def'])
+# ... but we trust the user and the group
+testui(user='abc', group='def', tusers=['abc'], tgroups=['def'])
+# ... but we trust all users
+print '# we trust all users'
+testui(user='abc', group='def', tusers=['*'])
+# ... but we trust all groups
+print '# we trust all groups'
+testui(user='abc', group='def', tgroups=['*'])
+# ... but we trust the whole universe
+print '# we trust all users and groups'
+testui(user='abc', group='def', tusers=['*'], tgroups=['*'])
+# ... check that users and groups are in different namespaces
+print "# we don't get confused by users and groups with the same name"
+testui(user='abc', group='def', tusers=['def'], tgroups=['abc'])
+# ... lists of user names work
+print "# list of user names"
+testui(user='abc', group='def', tusers=['foo', 'xyz', 'abc', 'bleh'],
+ tgroups=['bar', 'baz', 'qux'])
+# ... lists of group names work
+print "# list of group names"
+testui(user='abc', group='def', tusers=['foo', 'xyz', 'bleh'],
+ tgroups=['bar', 'def', 'baz', 'qux'])
+
+print "# Can't figure out the name of the user running this process"
+testui(user='abc', group='def', cuser=None)
+
+print "# prints debug warnings"
+u = testui(user='abc', group='def', cuser='foo', debug=True)
+
+print "# report_untrusted enabled without debug hides warnings"
+u = testui(user='abc', group='def', cuser='foo', report=False)
+
+print "# report_untrusted enabled with debug shows warnings"
+u = testui(user='abc', group='def', cuser='foo', debug=True, report=False)
+
+print "# ui.readconfig sections"
+filename = 'foobar'
+f = open(filename, 'w')
+f.write('[foobar]\n')
+f.write('baz = quux\n')
+f.close()
+u.readconfig(filename, sections = ['foobar'])
+print u.config('foobar', 'baz')
+
+print
+print "# read trusted, untrusted, new ui, trusted"
+u = ui.ui()
+u.setconfig('ui', 'debug', 'on')
+u.readconfig(filename)
+u2 = u.copy()
+def username(uid=None):
+ return 'foo'
+util.username = username
+u2.readconfig('.hg/hgrc')
+print 'trusted:'
+print u2.config('foobar', 'baz')
+print 'untrusted:'
+print u2.config('foobar', 'baz', untrusted=True)
+
+print
+print "# error handling"
+
+def assertraises(f, exc=util.Abort):
+ try:
+ f()
+ except exc, inst:
+ print 'raised', inst.__class__.__name__
+ else:
+ print 'no exception?!'
+
+print "# file doesn't exist"
+os.unlink('.hg/hgrc')
+assert not os.path.exists('.hg/hgrc')
+testui(debug=True, silent=True)
+testui(user='abc', group='def', debug=True, silent=True)
+
+print
+print "# parse error"
+f = open('.hg/hgrc', 'w')
+f.write('foo')
+f.close()
+
+try:
+ testui(user='abc', group='def', silent=True)
+except error.ParseError, inst:
+ print inst
+
+try:
+ testui(debug=True, silent=True)
+except error.ParseError, inst:
+ print inst
diff --git a/tests/test-trusted.py.out b/tests/test-trusted.py.out
new file mode 100644
index 0000000..8774db3
--- /dev/null
+++ b/tests/test-trusted.py.out
@@ -0,0 +1,179 @@
+# same user, same group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# same user, different group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, same group
+not trusting file .hg/hgrc from untrusted user abc, group bar
+trusted
+ global = /some/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, same group, but we trust the group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+trusted
+ global = /some/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, different group, but we trust the user
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, different group, but we trust the group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# different user, different group, but we trust the user and the group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# we trust all users
+# different user, different group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# we trust all groups
+# different user, different group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# we trust all users and groups
+# different user, different group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# we don't get confused by users and groups with the same name
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+trusted
+ global = /some/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# list of user names
+# different user, different group, but we trust the user
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# list of group names
+# different user, different group, but we trust the group
+trusted
+ global = /some/path
+ local = /another/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# Can't figure out the name of the user running this process
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+trusted
+ global = /some/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# prints debug warnings
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+trusted
+ignoring untrusted configuration option paths.local = /another/path
+ global = /some/path
+untrusted
+. . global = /some/path
+.ignoring untrusted configuration option paths.local = /another/path
+. local = /another/path
+
+# report_untrusted enabled without debug hides warnings
+# different user, different group
+trusted
+ global = /some/path
+untrusted
+. . global = /some/path
+. . local = /another/path
+
+# report_untrusted enabled with debug shows warnings
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+trusted
+ignoring untrusted configuration option paths.local = /another/path
+ global = /some/path
+untrusted
+. . global = /some/path
+.ignoring untrusted configuration option paths.local = /another/path
+. local = /another/path
+
+# ui.readconfig sections
+quux
+
+# read trusted, untrusted, new ui, trusted
+not trusting file foobar from untrusted user abc, group def
+trusted:
+ignoring untrusted configuration option foobar.baz = quux
+None
+untrusted:
+quux
+
+# error handling
+# file doesn't exist
+# same user, same group
+# different user, different group
+
+# parse error
+# different user, different group
+not trusting file .hg/hgrc from untrusted user abc, group def
+('foo', '.hg/hgrc:1')
+# same user, same group
+('foo', '.hg/hgrc:1')
diff --git a/tests/test-ui-color.py b/tests/test-ui-color.py
new file mode 100644
index 0000000..e20bcbc
--- /dev/null
+++ b/tests/test-ui-color.py
@@ -0,0 +1,33 @@
+import os, sys
+from hgext import color
+from mercurial import dispatch, ui
+
+# ensure errors aren't buffered
+testui = color.colorui()
+testui.pushbuffer()
+testui.write('buffered\n')
+testui.warn('warning\n')
+testui.write_err('error\n')
+print repr(testui.popbuffer())
+
+# test dispatch.dispatch with the same ui object
+hgrc = open(os.environ["HGRCPATH"], 'w')
+hgrc.write('[extensions]\n')
+hgrc.write('color=\n')
+hgrc.close()
+
+ui_ = ui.ui()
+ui_.setconfig('ui', 'formatted', 'True')
+
+# we're not interested in the output, so write that to devnull
+ui_.fout = open(os.devnull, 'w')
+
+# call some arbitrary command just so we go through
+# color's wrapped _runcommand twice.
+def runcmd():
+ dispatch.dispatch(dispatch.request(['version', '-q'], ui_))
+
+runcmd()
+print "colored? " + str(issubclass(ui_.__class__, color.colorui))
+runcmd()
+print "colored? " + str(issubclass(ui_.__class__, color.colorui))
diff --git a/tests/test-ui-color.py.out b/tests/test-ui-color.py.out
new file mode 100644
index 0000000..b4ea116
--- /dev/null
+++ b/tests/test-ui-color.py.out
@@ -0,0 +1,5 @@
+warning
+error
+'buffered\n'
+colored? True
+colored? True
diff --git a/tests/test-ui-config.py b/tests/test-ui-config.py
new file mode 100644
index 0000000..95dfc9d
--- /dev/null
+++ b/tests/test-ui-config.py
@@ -0,0 +1,98 @@
+from mercurial import ui, dispatch, error
+
+testui = ui.ui()
+parsed = dispatch._parseconfig(testui, [
+ 'values.string=string value',
+ 'values.bool1=true',
+ 'values.bool2=false',
+ 'values.boolinvalid=foo',
+ 'values.int1=42',
+ 'values.int2=-42',
+ 'values.intinvalid=foo',
+ 'lists.list1=foo',
+ 'lists.list2=foo bar baz',
+ 'lists.list3=alice, bob',
+ 'lists.list4=foo bar baz alice, bob',
+ 'lists.list5=abc d"ef"g "hij def"',
+ 'lists.list6="hello world", "how are you?"',
+ 'lists.list7=Do"Not"Separate',
+ 'lists.list8="Do"Separate',
+ 'lists.list9="Do\\"NotSeparate"',
+ 'lists.list10=string "with extraneous" quotation mark"',
+ 'lists.list11=x, y',
+ 'lists.list12="x", "y"',
+ 'lists.list13=""" key = "x", "y" """',
+ 'lists.list14=,,,, ',
+ 'lists.list15=" just with starting quotation',
+ 'lists.list16="longer quotation" with "no ending quotation',
+ 'lists.list17=this is \\" "not a quotation mark"',
+ 'lists.list18=\n \n\nding\ndong',
+ ])
+
+print repr(testui.configitems('values'))
+print repr(testui.configitems('lists'))
+print "---"
+print repr(testui.config('values', 'string'))
+print repr(testui.config('values', 'bool1'))
+print repr(testui.config('values', 'bool2'))
+print repr(testui.config('values', 'unknown'))
+print "---"
+try:
+ print repr(testui.configbool('values', 'string'))
+except error.ConfigError, inst:
+ print inst
+print repr(testui.configbool('values', 'bool1'))
+print repr(testui.configbool('values', 'bool2'))
+print repr(testui.configbool('values', 'bool2', True))
+print repr(testui.configbool('values', 'unknown'))
+print repr(testui.configbool('values', 'unknown', True))
+print "---"
+print repr(testui.configint('values', 'int1'))
+print repr(testui.configint('values', 'int2'))
+print "---"
+print repr(testui.configlist('lists', 'list1'))
+print repr(testui.configlist('lists', 'list2'))
+print repr(testui.configlist('lists', 'list3'))
+print repr(testui.configlist('lists', 'list4'))
+print repr(testui.configlist('lists', 'list4', ['foo']))
+print repr(testui.configlist('lists', 'list5'))
+print repr(testui.configlist('lists', 'list6'))
+print repr(testui.configlist('lists', 'list7'))
+print repr(testui.configlist('lists', 'list8'))
+print repr(testui.configlist('lists', 'list9'))
+print repr(testui.configlist('lists', 'list10'))
+print repr(testui.configlist('lists', 'list11'))
+print repr(testui.configlist('lists', 'list12'))
+print repr(testui.configlist('lists', 'list13'))
+print repr(testui.configlist('lists', 'list14'))
+print repr(testui.configlist('lists', 'list15'))
+print repr(testui.configlist('lists', 'list16'))
+print repr(testui.configlist('lists', 'list17'))
+print repr(testui.configlist('lists', 'list18'))
+print repr(testui.configlist('lists', 'unknown'))
+print repr(testui.configlist('lists', 'unknown', ''))
+print repr(testui.configlist('lists', 'unknown', 'foo'))
+print repr(testui.configlist('lists', 'unknown', ['foo']))
+print repr(testui.configlist('lists', 'unknown', 'foo bar'))
+print repr(testui.configlist('lists', 'unknown', 'foo, bar'))
+print repr(testui.configlist('lists', 'unknown', ['foo bar']))
+print repr(testui.configlist('lists', 'unknown', ['foo', 'bar']))
+
+print repr(testui.config('values', 'String'))
+
+def function():
+ pass
+
+# values that aren't strings should work
+testui.setconfig('hook', 'commit', function)
+print function == testui.config('hook', 'commit')
+
+# invalid values
+try:
+ testui.configbool('values', 'boolinvalid')
+except error.ConfigError:
+ print 'boolinvalid'
+try:
+ testui.configint('values', 'intinvalid')
+except error.ConfigError:
+ print 'intinvalid'
diff --git a/tests/test-ui-config.py.out b/tests/test-ui-config.py.out
new file mode 100644
index 0000000..6be87d1
--- /dev/null
+++ b/tests/test-ui-config.py.out
@@ -0,0 +1,49 @@
+[('string', 'string value'), ('bool1', 'true'), ('bool2', 'false'), ('boolinvalid', 'foo'), ('int1', '42'), ('int2', '-42'), ('intinvalid', 'foo')]
+[('list1', 'foo'), ('list2', 'foo bar baz'), ('list3', 'alice, bob'), ('list4', 'foo bar baz alice, bob'), ('list5', 'abc d"ef"g "hij def"'), ('list6', '"hello world", "how are you?"'), ('list7', 'Do"Not"Separate'), ('list8', '"Do"Separate'), ('list9', '"Do\\"NotSeparate"'), ('list10', 'string "with extraneous" quotation mark"'), ('list11', 'x, y'), ('list12', '"x", "y"'), ('list13', '""" key = "x", "y" """'), ('list14', ',,,, '), ('list15', '" just with starting quotation'), ('list16', '"longer quotation" with "no ending quotation'), ('list17', 'this is \\" "not a quotation mark"'), ('list18', '\n \n\nding\ndong')]
+---
+'string value'
+'true'
+'false'
+None
+---
+values.string is not a boolean ('string value')
+True
+False
+False
+False
+True
+---
+42
+-42
+---
+['foo']
+['foo', 'bar', 'baz']
+['alice', 'bob']
+['foo', 'bar', 'baz', 'alice', 'bob']
+['foo', 'bar', 'baz', 'alice', 'bob']
+['abc', 'd"ef"g', 'hij def']
+['hello world', 'how are you?']
+['Do"Not"Separate']
+['Do', 'Separate']
+['Do"NotSeparate']
+['string', 'with extraneous', 'quotation', 'mark"']
+['x', 'y']
+['x', 'y']
+['', ' key = ', 'x"', 'y', '', '"']
+[]
+['"', 'just', 'with', 'starting', 'quotation']
+['longer quotation', 'with', '"no', 'ending', 'quotation']
+['this', 'is', '"', 'not a quotation mark']
+['ding', 'dong']
+[]
+[]
+['foo']
+['foo']
+['foo', 'bar']
+['foo', 'bar']
+['foo bar']
+['foo', 'bar']
+None
+True
+boolinvalid
+intinvalid
diff --git a/tests/test-ui-verbosity.py b/tests/test-ui-verbosity.py
new file mode 100644
index 0000000..8daf7ab
--- /dev/null
+++ b/tests/test-ui-verbosity.py
@@ -0,0 +1,47 @@
+import os
+from mercurial import ui
+
+hgrc = os.environ['HGRCPATH']
+f = open(hgrc)
+basehgrc = f.read()
+f.close()
+
+print ' hgrc settings command line options final result '
+print ' quiet verbo debug quiet verbo debug quiet verbo debug'
+
+for i in xrange(64):
+ hgrc_quiet = bool(i & 1<<0)
+ hgrc_verbose = bool(i & 1<<1)
+ hgrc_debug = bool(i & 1<<2)
+ cmd_quiet = bool(i & 1<<3)
+ cmd_verbose = bool(i & 1<<4)
+ cmd_debug = bool(i & 1<<5)
+
+ f = open(hgrc, 'w')
+ f.write(basehgrc)
+ f.write('\n[ui]\n')
+ if hgrc_quiet:
+ f.write('quiet = True\n')
+ if hgrc_verbose:
+ f.write('verbose = True\n')
+ if hgrc_debug:
+ f.write('debug = True\n')
+ f.close()
+
+ u = ui.ui()
+ if cmd_quiet or cmd_debug or cmd_verbose:
+ u.setconfig('ui', 'quiet', str(bool(cmd_quiet)))
+ u.setconfig('ui', 'verbose', str(bool(cmd_verbose)))
+ u.setconfig('ui', 'debug', str(bool(cmd_debug)))
+
+ check = ''
+ if u.debugflag:
+ if not u.verbose or u.quiet:
+ check = ' *'
+ elif u.verbose and u.quiet:
+ check = ' +'
+
+ print ('%2d %5s %5s %5s %5s %5s %5s -> %5s %5s %5s%s'
+ % (i, hgrc_quiet, hgrc_verbose, hgrc_debug,
+ cmd_quiet, cmd_verbose, cmd_debug,
+ u.quiet, u.verbose, u.debugflag, check))
diff --git a/tests/test-ui-verbosity.py.out b/tests/test-ui-verbosity.py.out
new file mode 100644
index 0000000..960ac37
--- /dev/null
+++ b/tests/test-ui-verbosity.py.out
@@ -0,0 +1,66 @@
+ hgrc settings command line options final result
+ quiet verbo debug quiet verbo debug quiet verbo debug
+ 0 False False False False False False -> False False False
+ 1 True False False False False False -> True False False
+ 2 False True False False False False -> False True False
+ 3 True True False False False False -> False False False
+ 4 False False True False False False -> False True True
+ 5 True False True False False False -> False True True
+ 6 False True True False False False -> False True True
+ 7 True True True False False False -> False True True
+ 8 False False False True False False -> True False False
+ 9 True False False True False False -> True False False
+10 False True False True False False -> True False False
+11 True True False True False False -> True False False
+12 False False True True False False -> True False False
+13 True False True True False False -> True False False
+14 False True True True False False -> True False False
+15 True True True True False False -> True False False
+16 False False False False True False -> False True False
+17 True False False False True False -> False True False
+18 False True False False True False -> False True False
+19 True True False False True False -> False True False
+20 False False True False True False -> False True False
+21 True False True False True False -> False True False
+22 False True True False True False -> False True False
+23 True True True False True False -> False True False
+24 False False False True True False -> False False False
+25 True False False True True False -> False False False
+26 False True False True True False -> False False False
+27 True True False True True False -> False False False
+28 False False True True True False -> False False False
+29 True False True True True False -> False False False
+30 False True True True True False -> False False False
+31 True True True True True False -> False False False
+32 False False False False False True -> False True True
+33 True False False False False True -> False True True
+34 False True False False False True -> False True True
+35 True True False False False True -> False True True
+36 False False True False False True -> False True True
+37 True False True False False True -> False True True
+38 False True True False False True -> False True True
+39 True True True False False True -> False True True
+40 False False False True False True -> False True True
+41 True False False True False True -> False True True
+42 False True False True False True -> False True True
+43 True True False True False True -> False True True
+44 False False True True False True -> False True True
+45 True False True True False True -> False True True
+46 False True True True False True -> False True True
+47 True True True True False True -> False True True
+48 False False False False True True -> False True True
+49 True False False False True True -> False True True
+50 False True False False True True -> False True True
+51 True True False False True True -> False True True
+52 False False True False True True -> False True True
+53 True False True False True True -> False True True
+54 False True True False True True -> False True True
+55 True True True False True True -> False True True
+56 False False False True True True -> False True True
+57 True False False True True True -> False True True
+58 False True False True True True -> False True True
+59 True True False True True True -> False True True
+60 False False True True True True -> False True True
+61 True False True True True True -> False True True
+62 False True True True True True -> False True True
+63 True True True True True True -> False True True
diff --git a/tests/test-unbundlehash.t b/tests/test-unbundlehash.t
new file mode 100644
index 0000000..e55e1b7
--- /dev/null
+++ b/tests/test-unbundlehash.t
@@ -0,0 +1,32 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Test wire protocol unbundle with hashed heads (capability: unbundlehash)
+
+Create a remote repository.
+
+ $ hg init remote
+ $ hg serve -R remote --config web.push_ssl=False --config web.allow_push=* -p $HGPORT -d --pid-file=hg1.pid -E error.log -A access.log
+ $ cat hg1.pid >> $DAEMON_PIDS
+
+Clone the repository and push a change.
+
+ $ hg clone http://localhost:$HGPORT/ local
+ no changes found
+ updating to branch default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ touch local/README
+ $ hg ci -R local -A -m hoge
+ adding README
+ $ hg push -R local
+ pushing to http://localhost:$HGPORT/
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+
+Ensure hashed heads format is used.
+The hash here is always the same since the remote repository only has the null head.
+
+ $ cat access.log | grep unbundle
+ * - - [*] "POST /?cmd=unbundle HTTP/1.1" 200 - x-hgarg-1:heads=686173686564+6768033e216468247bd031a0a2d9876d79818f8f (glob)
diff --git a/tests/test-unrelated-pull.t b/tests/test-unrelated-pull.t
new file mode 100644
index 0000000..5779905
--- /dev/null
+++ b/tests/test-unrelated-pull.t
@@ -0,0 +1,45 @@
+ $ hg init a
+ $ cd a
+ $ echo 123 > a
+ $ hg add a
+ $ hg commit -m "a" -u a
+
+ $ cd ..
+ $ hg init b
+ $ cd b
+ $ echo 321 > b
+ $ hg add b
+ $ hg commit -m "b" -u b
+
+ $ hg pull ../a
+ pulling from ../a
+ searching for changes
+ abort: repository is unrelated
+ [255]
+
+ $ hg pull -f ../a
+ pulling from ../a
+ searching for changes
+ warning: repository is unrelated
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+ $ hg heads
+ changeset: 1:9a79c33a9db3
+ tag: tip
+ parent: -1:000000000000
+ user: a
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ changeset: 0:01f8062b2de5
+ user: b
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: b
+
+
+ $ cd ..
diff --git a/tests/test-up-local-change.t b/tests/test-up-local-change.t
new file mode 100644
index 0000000..815f9fb
--- /dev/null
+++ b/tests/test-up-local-change.t
@@ -0,0 +1,238 @@
+ $ HGMERGE=true; export HGMERGE
+
+ $ hg init r1
+ $ cd r1
+ $ echo a > a
+ $ hg addremove
+ adding a
+ $ hg commit -m "1"
+
+ $ hg clone . ../r2
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd ../r2
+ $ hg up
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo abc > a
+ $ hg diff --nodates
+ diff -r c19d34741b0a a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -a
+ +abc
+
+ $ cd ../r1
+ $ echo b > b
+ $ echo a2 > a
+ $ hg addremove
+ adding b
+ $ hg commit -m "2"
+
+ $ cd ../r2
+ $ hg -q pull ../r1
+ $ hg status
+ M a
+ $ hg parents
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg --debug up
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c19d34741b0a, local: c19d34741b0a+, remote: 1e71731e6fbb
+ a: versions differ -> m
+ b: remote created -> g
+ preserving a for resolve of a
+ updating: a 1/2 files (50.00%)
+ picked tool 'true' for a (binary False symlink False)
+ merging a
+ my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
+ updating: b 2/2 files (100.00%)
+ getting b
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 1:1e71731e6fbb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ $ hg --debug up 0
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: 1e71731e6fbb, local: 1e71731e6fbb+, remote: c19d34741b0a
+ a: versions differ -> m
+ b: other deleted -> r
+ preserving a for resolve of a
+ updating: b 1/2 files (50.00%)
+ removing b
+ updating: a 2/2 files (100.00%)
+ picked tool 'true' for a (binary False symlink False)
+ merging a
+ my a@1e71731e6fbb+ other a@c19d34741b0a ancestor a@1e71731e6fbb
+ 0 files updated, 1 files merged, 1 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg --debug merge
+ abort: nothing to merge
+ (use 'hg update' instead)
+ [255]
+ $ hg parents
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 1
+
+ $ hg --debug up
+ searching for copies back to rev 1
+ unmatched files in other:
+ b
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c19d34741b0a, local: c19d34741b0a+, remote: 1e71731e6fbb
+ a: versions differ -> m
+ b: remote created -> g
+ preserving a for resolve of a
+ updating: a 1/2 files (50.00%)
+ picked tool 'true' for a (binary False symlink False)
+ merging a
+ my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
+ updating: b 2/2 files (100.00%)
+ getting b
+ 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ $ hg parents
+ changeset: 1:1e71731e6fbb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ $ hg -v history
+ changeset: 1:1e71731e6fbb
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a b
+ description:
+ 2
+
+
+ changeset: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ 1
+
+
+ $ hg diff --nodates
+ diff -r 1e71731e6fbb a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -a2
+ +abc
+
+
+create a second head
+
+ $ cd ../r1
+ $ hg up 0
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b2 > b
+ $ echo a3 > a
+ $ hg addremove
+ adding b
+ $ hg commit -m "3"
+ created new head
+
+ $ cd ../r2
+ $ hg -q pull ../r1
+ $ hg status
+ M a
+ $ hg parents
+ changeset: 1:1e71731e6fbb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ $ hg --debug up
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ [255]
+ $ hg --debug merge
+ abort: outstanding uncommitted changes
+ (use 'hg status' to list changes)
+ [255]
+ $ hg --debug merge -f
+ searching for copies back to rev 1
+ resolving manifests
+ overwrite: False, partial: False
+ ancestor: c19d34741b0a, local: 1e71731e6fbb+, remote: 83c51d0caff4
+ a: versions differ -> m
+ b: versions differ -> m
+ preserving a for resolve of a
+ preserving b for resolve of b
+ updating: a 1/2 files (50.00%)
+ picked tool 'true' for a (binary False symlink False)
+ merging a
+ my a@1e71731e6fbb+ other a@83c51d0caff4 ancestor a@c19d34741b0a
+ updating: b 2/2 files (100.00%)
+ picked tool 'true' for b (binary False symlink False)
+ merging b
+ my b@1e71731e6fbb+ other b@83c51d0caff4 ancestor b@000000000000
+ 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg parents
+ changeset: 1:1e71731e6fbb
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 2
+
+ changeset: 2:83c51d0caff4
+ tag: tip
+ parent: 0:c19d34741b0a
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: 3
+
+ $ hg diff --nodates
+ diff -r 1e71731e6fbb a
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,1 @@
+ -a2
+ +abc
+
+
+test a local add
+
+ $ cd ..
+ $ hg init a
+ $ hg init b
+ $ echo a > a/a
+ $ echo a > b/a
+ $ hg --cwd a commit -A -m a
+ adding a
+ $ cd b
+ $ hg add a
+ $ hg pull -u ../a
+ pulling from ../a
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+
+ $ cd ..
diff --git a/tests/test-update-branches.t b/tests/test-update-branches.t
new file mode 100644
index 0000000..e6a578e
--- /dev/null
+++ b/tests/test-update-branches.t
@@ -0,0 +1,156 @@
+# Construct the following history tree:
+#
+# @ 5:e1bb631146ca b1
+# |
+# o 4:a4fdb3b883c4 0:b608b9236435 b1
+# |
+# | o 3:4b57d2520816 1:44592833ba9f
+# | |
+# | | o 2:063f31070f65
+# | |/
+# | o 1:44592833ba9f
+# |/
+# o 0:b608b9236435
+
+ $ hg init
+ $ echo foo > foo
+ $ echo zero > a
+ $ hg init sub
+ $ echo suba > sub/suba
+ $ hg --cwd sub ci -Am addsuba
+ adding suba
+ $ echo 'sub = sub' > .hgsub
+ $ hg ci -qAm0
+ $ echo one > a ; hg ci -m1
+ $ echo two > a ; hg ci -m2
+ $ hg up -q 1
+ $ echo three > a ; hg ci -qm3
+ $ hg up -q 0
+ $ hg branch -q b1
+ $ echo four > a ; hg ci -qm4
+ $ echo five > a ; hg ci -qm5
+
+Initial repo state:
+
+ $ hg --config 'extensions.graphlog=' \
+ > glog --template '{rev}:{node|short} {parents} {branches}\n'
+ @ 5:ff252e8273df b1
+ |
+ o 4:d047485b3896 0:60829823a42a b1
+ |
+ | o 3:6efa171f091b 1:0786582aa4b1
+ | |
+ | | o 2:bd10386d478c
+ | |/
+ | o 1:0786582aa4b1
+ |/
+ o 0:60829823a42a
+
+
+Test helper functions:
+
+ $ revtest () {
+ > msg=$1
+ > dirtyflag=$2 # 'clean', 'dirty' or 'dirtysub'
+ > startrev=$3
+ > targetrev=$4
+ > opt=$5
+ > hg up -qC $startrev
+ > test $dirtyflag = dirty && echo dirty > foo
+ > test $dirtyflag = dirtysub && echo dirty > sub/suba
+ > hg up $opt $targetrev
+ > hg parent --template 'parent={rev}\n'
+ > hg stat -S
+ > }
+
+ $ norevtest () {
+ > msg=$1
+ > dirtyflag=$2 # 'clean', 'dirty' or 'dirtysub'
+ > startrev=$3
+ > opt=$4
+ > hg up -qC $startrev
+ > test $dirtyflag = dirty && echo dirty > foo
+ > test $dirtyflag = dirtysub && echo dirty > sub/suba
+ > hg up $opt
+ > hg parent --template 'parent={rev}\n'
+ > hg stat -S
+ > }
+
+Test cases are documented in a table in the update function of merge.py.
+Cases are run as shown in that table, row by row.
+
+ $ norevtest 'none clean linear' clean 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=5
+
+ $ norevtest 'none clean same' clean 2
+ abort: crosses branches (merge branches or update --check to force update)
+ parent=2
+
+
+ $ revtest 'none clean linear' clean 1 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=2
+
+ $ revtest 'none clean same' clean 2 3
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=3
+
+ $ revtest 'none clean cross' clean 3 4
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=4
+
+
+ $ revtest 'none dirty linear' dirty 1 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=2
+ M foo
+
+ $ revtest 'none dirtysub linear' dirtysub 1 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=2
+ M sub/suba
+
+ $ revtest 'none dirty same' dirty 2 3
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ parent=2
+ M foo
+
+ $ revtest 'none dirtysub same' dirtysub 2 3
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ parent=2
+ M sub/suba
+
+ $ revtest 'none dirty cross' dirty 3 4
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ parent=3
+ M foo
+
+ $ revtest 'none dirtysub cross' dirtysub 3 4
+ abort: crosses branches (merge branches or use --clean to discard changes)
+ parent=3
+ M sub/suba
+
+ $ revtest '-C dirty linear' dirty 1 2 -C
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=2
+
+ $ revtest '-c dirty linear' dirty 1 2 -c
+ abort: uncommitted local changes
+ parent=1
+ M foo
+
+ $ revtest '-c dirtysub linear' dirtysub 1 2 -c
+ abort: uncommitted local changes
+ parent=1
+ M sub/suba
+
+ $ norevtest '-c clean same' clean 2 -c
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ parent=3
+
+ $ revtest '-cC dirty linear' dirty 1 2 -cC
+ abort: cannot specify both -c/--check and -C/--clean
+ parent=1
+ M foo
+
diff --git a/tests/test-update-issue1456.t b/tests/test-update-issue1456.t
new file mode 100644
index 0000000..e6c8f23
--- /dev/null
+++ b/tests/test-update-issue1456.t
@@ -0,0 +1,36 @@
+ $ "$TESTDIR/hghave" execbit || exit 80
+
+ $ rm -rf a
+ $ hg init a
+ $ cd a
+
+ $ echo foo > foo
+ $ hg ci -qAm0
+ $ chmod +x foo
+ $ hg ci -m1
+ $ hg co -q 0
+ $ echo dirty > foo
+ $ hg up -c
+ abort: uncommitted local changes
+ [255]
+ $ hg up -q
+ $ cat foo
+ dirty
+ $ hg st -A
+ M foo
+
+Validate update of standalone execute bit change:
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ chmod -x foo
+ $ hg ci -m removeexec
+ nothing changed
+ [1]
+ $ hg up -C 0
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg up
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg st
+
+ $ cd ..
diff --git a/tests/test-update-renames.t b/tests/test-update-renames.t
new file mode 100644
index 0000000..829317a
--- /dev/null
+++ b/tests/test-update-renames.t
@@ -0,0 +1,27 @@
+Test update logic when there are renames
+
+Update with local changes across a file rename
+
+ $ hg init
+
+ $ echo a > a
+ $ hg add a
+ $ hg ci -m a
+
+ $ hg mv a b
+ $ hg ci -m rename
+
+ $ echo b > b
+ $ hg ci -m change
+
+ $ hg up -q 0
+
+ $ echo c > a
+
+ $ hg up
+ merging a and b to b
+ warning: conflicts during merge.
+ merging b incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges
+ [1]
diff --git a/tests/test-update-reverse.t b/tests/test-update-reverse.t
new file mode 100644
index 0000000..4d1dd26
--- /dev/null
+++ b/tests/test-update-reverse.t
@@ -0,0 +1,85 @@
+ $ hg init
+
+ $ touch a
+ $ hg add a
+ $ hg commit -m "Added a"
+
+ $ touch main
+ $ hg add main
+ $ hg commit -m "Added main"
+ $ hg checkout 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+
+'main' should be gone:
+
+ $ ls
+ a
+
+ $ touch side1
+ $ hg add side1
+ $ hg commit -m "Added side1"
+ created new head
+ $ touch side2
+ $ hg add side2
+ $ hg commit -m "Added side2"
+
+ $ hg log
+ changeset: 3:91ebc10ed028
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added side2
+
+ changeset: 2:b932d7dbb1e1
+ parent: 0:c2eda428b523
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added side1
+
+ changeset: 1:71a760306caf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added main
+
+ changeset: 0:c2eda428b523
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added a
+
+
+ $ hg heads
+ changeset: 3:91ebc10ed028
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added side2
+
+ changeset: 1:71a760306caf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: Added main
+
+ $ ls
+ a
+ side1
+ side2
+
+ $ hg update --debug -C 1
+ resolving manifests
+ overwrite: True, partial: False
+ ancestor: 91ebc10ed028+, local: 91ebc10ed028+, remote: 71a760306caf
+ side2: other deleted -> r
+ side1: other deleted -> r
+ main: remote created -> g
+ updating: side1 1/3 files (33.33%)
+ removing side1
+ updating: side2 2/3 files (66.67%)
+ removing side2
+ updating: main 3/3 files (100.00%)
+ getting main
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+
+ $ ls
+ a
+ main
+
diff --git a/tests/test-url-rev.t b/tests/test-url-rev.t
new file mode 100644
index 0000000..517b83b
--- /dev/null
+++ b/tests/test-url-rev.t
@@ -0,0 +1,210 @@
+Test basic functionality of url#rev syntax
+
+ $ hg init repo
+ $ cd repo
+ $ echo a > a
+ $ hg ci -qAm 'add a'
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ echo >> a
+ $ hg ci -m 'change a'
+ $ cd ..
+
+ $ hg clone 'repo#foo' clone
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files
+ updating to branch foo
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg --cwd clone heads
+ changeset: 1:cd2a86ecc814
+ branch: foo
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change a
+
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg --cwd clone parents
+ changeset: 1:cd2a86ecc814
+ branch: foo
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change a
+
+ $ cat clone/.hg/hgrc
+ [paths]
+ default = $TESTTMP/repo#foo (glob)
+
+Changing original repo:
+
+ $ cd repo
+
+ $ echo >> a
+ $ hg ci -m 'new head of branch foo'
+
+ $ hg up -qC default
+ $ echo bar > bar
+ $ hg ci -qAm 'add bar'
+
+ $ hg log
+ changeset: 3:4cd725637392
+ tag: tip
+ parent: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add bar
+
+ changeset: 2:faba9097cad4
+ branch: foo
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: new head of branch foo
+
+ changeset: 1:cd2a86ecc814
+ branch: foo
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change a
+
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg -q outgoing '../clone#foo'
+ 2:faba9097cad4
+
+ $ hg -q push '../clone#foo'
+
+ $ hg --cwd ../clone heads
+ changeset: 2:faba9097cad4
+ branch: foo
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: new head of branch foo
+
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ cd ..
+
+ $ cd clone
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo push)
+
+ $ hg -q incoming
+ 2:faba9097cad4
+
+ $ hg -q pull
+
+ $ hg heads
+ changeset: 2:faba9097cad4
+ branch: foo
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: new head of branch foo
+
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+Pull should not have updated:
+
+ $ hg parents -q
+ 1:cd2a86ecc814
+
+Going back to the default branch:
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg parents
+ changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+No new revs, no update:
+
+ $ hg pull -qu
+
+ $ hg parents -q
+ 0:1f0dee641bb7
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo pull)
+
+ $ hg parents -q
+ 0:1f0dee641bb7
+
+Pull -u takes us back to branch foo:
+
+ $ hg pull -qu
+
+ $ hg parents
+ changeset: 2:faba9097cad4
+ branch: foo
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: new head of branch foo
+
+ $ hg rollback
+ repository tip rolled back to revision 1 (undo pull)
+ working directory now based on revision 0
+
+ $ hg up -C 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ hg parents -q
+ 0:1f0dee641bb7
+
+ $ hg heads -q
+ 1:cd2a86ecc814
+ 0:1f0dee641bb7
+
+ $ hg pull -qur default default
+
+ $ hg parents
+ changeset: 3:4cd725637392
+ tag: tip
+ parent: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add bar
+
+ $ hg heads
+ changeset: 3:4cd725637392
+ tag: tip
+ parent: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add bar
+
+ changeset: 2:faba9097cad4
+ branch: foo
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: new head of branch foo
+
+Test handling of invalid urls
+
+ $ hg id http://foo/?bar
+ abort: unsupported URL component: "bar"
+ [255]
+
+ $ cd ..
diff --git a/tests/test-url.py b/tests/test-url.py
new file mode 100644
index 0000000..0cf2ad6
--- /dev/null
+++ b/tests/test-url.py
@@ -0,0 +1,246 @@
+import os
+
+def check(a, b):
+ if a != b:
+ print (a, b)
+
+def cert(cn):
+ return dict(subject=((('commonName', cn),),))
+
+from mercurial.sslutil import _verifycert
+
+# Test non-wildcard certificates
+check(_verifycert(cert('example.com'), 'example.com'),
+ None)
+check(_verifycert(cert('example.com'), 'www.example.com'),
+ 'certificate is for example.com')
+check(_verifycert(cert('www.example.com'), 'example.com'),
+ 'certificate is for www.example.com')
+
+# Test wildcard certificates
+check(_verifycert(cert('*.example.com'), 'www.example.com'),
+ None)
+check(_verifycert(cert('*.example.com'), 'example.com'),
+ 'certificate is for *.example.com')
+check(_verifycert(cert('*.example.com'), 'w.w.example.com'),
+ 'certificate is for *.example.com')
+
+# Test subjectAltName
+san_cert = {'subject': ((('commonName', 'example.com'),),),
+ 'subjectAltName': (('DNS', '*.example.net'),
+ ('DNS', 'example.net'))}
+check(_verifycert(san_cert, 'example.net'),
+ None)
+check(_verifycert(san_cert, 'foo.example.net'),
+ None)
+# no fallback to subject commonName when subjectAltName has DNS
+check(_verifycert(san_cert, 'example.com'),
+ 'certificate is for *.example.net, example.net')
+# fallback to subject commonName when no DNS in subjectAltName
+san_cert = {'subject': ((('commonName', 'example.com'),),),
+ 'subjectAltName': (('IP Address', '8.8.8.8'),)}
+check(_verifycert(san_cert, 'example.com'), None)
+
+# Avoid some pitfalls
+check(_verifycert(cert('*.foo'), 'foo'),
+ 'certificate is for *.foo')
+check(_verifycert(cert('*o'), 'foo'),
+ 'certificate is for *o')
+
+check(_verifycert({'subject': ()},
+ 'example.com'),
+ 'no commonName or subjectAltName found in certificate')
+check(_verifycert(None, 'example.com'),
+ 'no certificate received')
+
+# Unicode (IDN) certname isn't supported
+check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
+ 'IDN in certificate not supported')
+
+import doctest
+
+def test_url():
+ """
+ >>> from mercurial.util import url
+
+ This tests for edge cases in url.URL's parsing algorithm. Most of
+ these aren't useful for documentation purposes, so they aren't
+ part of the class's doc tests.
+
+ Query strings and fragments:
+
+ >>> url('http://host/a?b#c')
+ <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
+ >>> url('http://host/a?')
+ <url scheme: 'http', host: 'host', path: 'a'>
+ >>> url('http://host/a#b#c')
+ <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
+ >>> url('http://host/a#b?c')
+ <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
+ >>> url('http://host/?a#b')
+ <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
+ >>> url('http://host/?a#b', parsequery=False)
+ <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
+ >>> url('http://host/?a#b', parsefragment=False)
+ <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
+ >>> url('http://host/?a#b', parsequery=False, parsefragment=False)
+ <url scheme: 'http', host: 'host', path: '?a#b'>
+
+ IPv6 addresses:
+
+ >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one')
+ <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
+ query: 'objectClass?one'>
+ >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
+ <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
+ port: '80', path: 'c=GB', query: 'objectClass?one'>
+
+ Missing scheme, host, etc.:
+
+ >>> url('://192.0.2.16:80/')
+ <url path: '://192.0.2.16:80/'>
+ >>> url('http://mercurial.selenic.com')
+ <url scheme: 'http', host: 'mercurial.selenic.com'>
+ >>> url('/foo')
+ <url path: '/foo'>
+ >>> url('bundle:/foo')
+ <url scheme: 'bundle', path: '/foo'>
+ >>> url('a?b#c')
+ <url path: 'a?b', fragment: 'c'>
+ >>> url('http://x.com?arg=/foo')
+ <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
+ >>> url('http://joe:xxx@/foo')
+ <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
+
+ Just a scheme and a path:
+
+ >>> url('mailto:John.Doe@example.com')
+ <url scheme: 'mailto', path: 'John.Doe@example.com'>
+ >>> url('a:b:c:d')
+ <url path: 'a:b:c:d'>
+ >>> url('aa:bb:cc:dd')
+ <url scheme: 'aa', path: 'bb:cc:dd'>
+
+ SSH examples:
+
+ >>> url('ssh://joe@host//home/joe')
+ <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
+ >>> url('ssh://joe:xxx@host/src')
+ <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
+ >>> url('ssh://joe:xxx@host')
+ <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
+ >>> url('ssh://joe@host')
+ <url scheme: 'ssh', user: 'joe', host: 'host'>
+ >>> url('ssh://host')
+ <url scheme: 'ssh', host: 'host'>
+ >>> url('ssh://')
+ <url scheme: 'ssh'>
+ >>> url('ssh:')
+ <url scheme: 'ssh'>
+
+ Non-numeric port:
+
+ >>> url('http://example.com:dd')
+ <url scheme: 'http', host: 'example.com', port: 'dd'>
+ >>> url('ssh://joe:xxx@host:ssh/foo')
+ <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
+ path: 'foo'>
+
+ Bad authentication credentials:
+
+ >>> url('http://joe@joeville:123@4:@host/a?b#c')
+ <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
+ host: 'host', path: 'a', query: 'b', fragment: 'c'>
+ >>> url('http://!*#?/@!*#?/:@host/a?b#c')
+ <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
+ >>> url('http://!*#?@!*#?:@host/a?b#c')
+ <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
+ >>> url('http://!*@:!*@@host/a?b#c')
+ <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
+ path: 'a', query: 'b', fragment: 'c'>
+
+ File paths:
+
+ >>> url('a/b/c/d.g.f')
+ <url path: 'a/b/c/d.g.f'>
+ >>> url('/x///z/y/')
+ <url path: '/x///z/y/'>
+ >>> url('/foo:bar')
+ <url path: '/foo:bar'>
+ >>> url('\\\\foo:bar')
+ <url path: '\\\\foo:bar'>
+ >>> url('./foo:bar')
+ <url path: './foo:bar'>
+
+ Non-localhost file URL:
+
+ >>> u = url('file://mercurial.selenic.com/foo')
+ Traceback (most recent call last):
+ File "<stdin>", line 1, in ?
+ Abort: file:// URLs can only refer to localhost
+
+ Empty URL:
+
+ >>> u = url('')
+ >>> u
+ <url path: ''>
+ >>> str(u)
+ ''
+
+ Empty path with query string:
+
+ >>> str(url('http://foo/?bar'))
+ 'http://foo/?bar'
+
+ Invalid path:
+
+ >>> u = url('http://foo/bar')
+ >>> u.path = 'bar'
+ >>> str(u)
+ 'http://foo/bar'
+
+ >>> u = url('file:/foo/bar/baz')
+ >>> u
+ <url scheme: 'file', path: '/foo/bar/baz'>
+ >>> str(u)
+ 'file:///foo/bar/baz'
+ >>> u.localpath()
+ '/foo/bar/baz'
+
+ >>> u = url('file:///foo/bar/baz')
+ >>> u
+ <url scheme: 'file', path: '/foo/bar/baz'>
+ >>> str(u)
+ 'file:///foo/bar/baz'
+ >>> u.localpath()
+ '/foo/bar/baz'
+
+ >>> u = url('file:///f:oo/bar/baz')
+ >>> u
+ <url scheme: 'file', path: 'f:oo/bar/baz'>
+ >>> str(u)
+ 'file:///f:oo/bar/baz'
+ >>> u.localpath()
+ 'f:oo/bar/baz'
+
+ >>> u = url('file://localhost/f:oo/bar/baz')
+ >>> u
+ <url scheme: 'file', host: 'localhost', path: 'f:oo/bar/baz'>
+ >>> str(u)
+ 'file://localhost/f:oo/bar/baz'
+ >>> u.localpath()
+ 'f:oo/bar/baz'
+
+ >>> u = url('file:foo/bar/baz')
+ >>> u
+ <url scheme: 'file', path: 'foo/bar/baz'>
+ >>> str(u)
+ 'file:foo/bar/baz'
+ >>> u.localpath()
+ 'foo/bar/baz'
+ """
+
+if 'TERM' in os.environ:
+ del os.environ['TERM']
+
+doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)
diff --git a/tests/test-username-newline.t b/tests/test-username-newline.t
new file mode 100644
index 0000000..6f3bc5c
--- /dev/null
+++ b/tests/test-username-newline.t
@@ -0,0 +1,25 @@
+ $ hg init
+ $ touch a
+
+ $ unset HGUSER
+ $ echo "[ui]" >> .hg/hgrc
+ $ echo "username= foo" >> .hg/hgrc
+ $ echo " bar1" >> .hg/hgrc
+
+ $ hg ci -Am m
+ adding a
+ abort: username 'foo\nbar1' contains a newline
+
+ [255]
+ $ rm .hg/hgrc
+
+ $ HGUSER=`(echo foo; echo bar2)` hg ci -Am m
+ abort: username 'foo\nbar2' contains a newline
+
+ [255]
+ $ hg ci -Am m -u "`(echo foo; echo bar3)`"
+ transaction abort!
+ rollback completed
+ abort: username 'foo\nbar3' contains a newline!
+ [255]
+
diff --git a/tests/test-verify.t b/tests/test-verify.t
new file mode 100644
index 0000000..5f3d7a7
--- /dev/null
+++ b/tests/test-verify.t
@@ -0,0 +1,103 @@
+prepare repo
+
+ $ hg init a
+ $ cd a
+ $ echo "some text" > FOO.txt
+ $ echo "another text" > bar.txt
+ $ echo "more text" > QUICK.txt
+ $ hg add
+ adding FOO.txt
+ adding QUICK.txt
+ adding bar.txt
+ $ hg ci -mtest1
+
+verify
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 1 changesets, 3 total revisions
+
+verify with journal
+
+ $ touch .hg/store/journal
+ $ hg verify
+ abandoned transaction found - run hg recover
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 1 changesets, 3 total revisions
+ $ rm .hg/store/journal
+
+introduce some bugs in repo
+
+ $ cd .hg/store/data
+ $ mv _f_o_o.txt.i X_f_o_o.txt.i
+ $ mv bar.txt.i xbar.txt.i
+ $ rm _q_u_i_c_k.txt.i
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ data/FOO.txt.i@0: missing revlog!
+ 0: empty or missing FOO.txt
+ FOO.txt@0: f62022d3d590 in manifests not found
+ data/QUICK.txt.i@0: missing revlog!
+ 0: empty or missing QUICK.txt
+ QUICK.txt@0: 88b857db8eba in manifests not found
+ data/bar.txt.i@0: missing revlog!
+ 0: empty or missing bar.txt
+ bar.txt@0: 256559129457 in manifests not found
+ 3 files, 1 changesets, 0 total revisions
+ 9 integrity errors encountered!
+ (first damaged changeset appears to be 0)
+ [1]
+
+ $ cd ../../..
+ $ cd ..
+
+test revlog corruption
+
+ $ hg init b
+ $ cd b
+
+ $ touch a
+ $ hg add a
+ $ hg ci -m a
+
+ $ echo 'corrupted' > b
+ $ dd if=.hg/store/data/a.i of=start bs=1 count=20 2>/dev/null
+ $ cat start b > .hg/store/data/a.i
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ a@0: broken revlog! (index data/a.i is corrupted)
+ warning: orphan revlog 'data/a.i'
+ 1 files, 1 changesets, 0 total revisions
+ 1 warnings encountered!
+ 1 integrity errors encountered!
+ (first damaged changeset appears to be 0)
+ [1]
+
+ $ cd ..
+
+test revlog format 0
+
+ $ "$TESTDIR/revlog-formatv0.py"
+ $ cd formatv0
+ $ hg verify
+ repository uses revlog format 0
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 1 files, 1 changesets, 1 total revisions
+ $ cd ..
diff --git a/tests/test-walk.t b/tests/test-walk.t
new file mode 100644
index 0000000..52de65e
--- /dev/null
+++ b/tests/test-walk.t
@@ -0,0 +1,333 @@
+ $ hg init t
+ $ cd t
+ $ mkdir -p beans
+ $ for b in kidney navy turtle borlotti black pinto; do
+ > echo $b > beans/$b
+ $ done
+ $ mkdir -p mammals/Procyonidae
+ $ for m in cacomistle coatimundi raccoon; do
+ > echo $m > mammals/Procyonidae/$m
+ $ done
+ $ echo skunk > mammals/skunk
+ $ echo fennel > fennel
+ $ echo fenugreek > fenugreek
+ $ echo fiddlehead > fiddlehead
+ $ hg addremove
+ adding beans/black
+ adding beans/borlotti
+ adding beans/kidney
+ adding beans/navy
+ adding beans/pinto
+ adding beans/turtle
+ adding fennel
+ adding fenugreek
+ adding fiddlehead
+ adding mammals/Procyonidae/cacomistle
+ adding mammals/Procyonidae/coatimundi
+ adding mammals/Procyonidae/raccoon
+ adding mammals/skunk
+ $ hg commit -m "commit #0"
+
+ $ hg debugwalk
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ f beans/kidney beans/kidney
+ f beans/navy beans/navy
+ f beans/pinto beans/pinto
+ f beans/turtle beans/turtle
+ f fennel fennel
+ f fenugreek fenugreek
+ f fiddlehead fiddlehead
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk -I.
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ f beans/kidney beans/kidney
+ f beans/navy beans/navy
+ f beans/pinto beans/pinto
+ f beans/turtle beans/turtle
+ f fennel fennel
+ f fenugreek fenugreek
+ f fiddlehead fiddlehead
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ f mammals/skunk mammals/skunk
+
+ $ cd mammals
+ $ hg debugwalk
+ f beans/black ../beans/black
+ f beans/borlotti ../beans/borlotti
+ f beans/kidney ../beans/kidney
+ f beans/navy ../beans/navy
+ f beans/pinto ../beans/pinto
+ f beans/turtle ../beans/turtle
+ f fennel ../fennel
+ f fenugreek ../fenugreek
+ f fiddlehead ../fiddlehead
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+ f mammals/skunk skunk
+ $ hg debugwalk -X ../beans
+ f fennel ../fennel
+ f fenugreek ../fenugreek
+ f fiddlehead ../fiddlehead
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+ f mammals/skunk skunk
+ $ hg debugwalk -I '*k'
+ f mammals/skunk skunk
+ $ hg debugwalk -I 'glob:*k'
+ f mammals/skunk skunk
+ $ hg debugwalk -I 'relglob:*k'
+ f beans/black ../beans/black
+ f fenugreek ../fenugreek
+ f mammals/skunk skunk
+ $ hg debugwalk -I 'relglob:*k' .
+ f mammals/skunk skunk
+ $ hg debugwalk -I 're:.*k$'
+ f beans/black ../beans/black
+ f fenugreek ../fenugreek
+ f mammals/skunk skunk
+ $ hg debugwalk -I 'relre:.*k$'
+ f beans/black ../beans/black
+ f fenugreek ../fenugreek
+ f mammals/skunk skunk
+ $ hg debugwalk -I 'path:beans'
+ f beans/black ../beans/black
+ f beans/borlotti ../beans/borlotti
+ f beans/kidney ../beans/kidney
+ f beans/navy ../beans/navy
+ f beans/pinto ../beans/pinto
+ f beans/turtle ../beans/turtle
+ $ hg debugwalk -I 'relpath:detour/../../beans'
+ f beans/black ../beans/black
+ f beans/borlotti ../beans/borlotti
+ f beans/kidney ../beans/kidney
+ f beans/navy ../beans/navy
+ f beans/pinto ../beans/pinto
+ f beans/turtle ../beans/turtle
+ $ hg debugwalk .
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+ f mammals/skunk skunk
+ $ hg debugwalk -I.
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+ f mammals/skunk skunk
+ $ hg debugwalk Procyonidae
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+
+ $ cd Procyonidae
+ $ hg debugwalk .
+ f mammals/Procyonidae/cacomistle cacomistle
+ f mammals/Procyonidae/coatimundi coatimundi
+ f mammals/Procyonidae/raccoon raccoon
+ $ hg debugwalk ..
+ f mammals/Procyonidae/cacomistle cacomistle
+ f mammals/Procyonidae/coatimundi coatimundi
+ f mammals/Procyonidae/raccoon raccoon
+ f mammals/skunk ../skunk
+ $ cd ..
+
+ $ hg debugwalk ../beans
+ f beans/black ../beans/black
+ f beans/borlotti ../beans/borlotti
+ f beans/kidney ../beans/kidney
+ f beans/navy ../beans/navy
+ f beans/pinto ../beans/pinto
+ f beans/turtle ../beans/turtle
+ $ hg debugwalk .
+ f mammals/Procyonidae/cacomistle Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon Procyonidae/raccoon
+ f mammals/skunk skunk
+ $ hg debugwalk .hg
+ abort: path 'mammals/.hg' is inside nested repo 'mammals' (glob)
+ [255]
+ $ hg debugwalk ../.hg
+ abort: path contains illegal component: .hg (glob)
+ [255]
+ $ cd ..
+
+ $ hg debugwalk -Ibeans
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ f beans/kidney beans/kidney
+ f beans/navy beans/navy
+ f beans/pinto beans/pinto
+ f beans/turtle beans/turtle
+ $ hg debugwalk -I '{*,{b,m}*/*}k'
+ f beans/black beans/black
+ f fenugreek fenugreek
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk 'glob:mammals/../beans/b*'
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ $ hg debugwalk '-X*/Procyonidae' mammals
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk path:mammals
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk ..
+ abort: .. not under root
+ [255]
+ $ hg debugwalk beans/../..
+ abort: beans/../.. not under root
+ [255]
+ $ hg debugwalk .hg
+ abort: path contains illegal component: .hg (glob)
+ [255]
+ $ hg debugwalk beans/../.hg
+ abort: path contains illegal component: .hg (glob)
+ [255]
+ $ hg debugwalk beans/../.hg/data
+ abort: path contains illegal component: .hg/data (glob)
+ [255]
+ $ hg debugwalk beans/.hg
+ abort: path 'beans/.hg' is inside nested repo 'beans' (glob)
+ [255]
+
+Test absolute paths:
+
+ $ hg debugwalk `pwd`/beans
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ f beans/kidney beans/kidney
+ f beans/navy beans/navy
+ f beans/pinto beans/pinto
+ f beans/turtle beans/turtle
+ $ hg debugwalk `pwd`/..
+ abort: $TESTTMP/t/.. not under root
+ [255]
+
+Test patterns:
+
+ $ hg debugwalk glob:\*
+ f fennel fennel
+ f fenugreek fenugreek
+ f fiddlehead fiddlehead
+#if eol-in-paths
+ $ echo glob:glob > glob:glob
+ $ hg addremove
+ adding glob:glob
+ warning: filename contains ':', which is reserved on Windows: 'glob:glob'
+ $ hg debugwalk glob:\*
+ f fennel fennel
+ f fenugreek fenugreek
+ f fiddlehead fiddlehead
+ f glob:glob glob:glob
+ $ hg debugwalk glob:glob
+ glob: No such file or directory
+ $ hg debugwalk glob:glob:glob
+ f glob:glob glob:glob exact
+ $ hg debugwalk path:glob:glob
+ f glob:glob glob:glob exact
+ $ rm glob:glob
+ $ hg addremove
+ removing glob:glob
+#endif
+
+ $ hg debugwalk 'glob:**e'
+ f beans/turtle beans/turtle
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+
+ $ hg debugwalk 're:.*[kb]$'
+ f beans/black beans/black
+ f fenugreek fenugreek
+ f mammals/skunk mammals/skunk
+
+ $ hg debugwalk path:beans/black
+ f beans/black beans/black exact
+ $ hg debugwalk path:beans//black
+ f beans/black beans/black exact
+
+ $ hg debugwalk relglob:Procyonidae
+ $ hg debugwalk 'relglob:Procyonidae/**'
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ $ hg debugwalk 'relglob:Procyonidae/**' fennel
+ f fennel fennel exact
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ $ hg debugwalk beans 'glob:beans/*'
+ f beans/black beans/black
+ f beans/borlotti beans/borlotti
+ f beans/kidney beans/kidney
+ f beans/navy beans/navy
+ f beans/pinto beans/pinto
+ f beans/turtle beans/turtle
+ $ hg debugwalk 'glob:mamm**'
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk 'glob:mamm**' fennel
+ f fennel fennel exact
+ f mammals/Procyonidae/cacomistle mammals/Procyonidae/cacomistle
+ f mammals/Procyonidae/coatimundi mammals/Procyonidae/coatimundi
+ f mammals/Procyonidae/raccoon mammals/Procyonidae/raccoon
+ f mammals/skunk mammals/skunk
+ $ hg debugwalk 'glob:j*'
+ $ hg debugwalk NOEXIST
+ NOEXIST: * (glob)
+
+#if fifo
+ $ mkfifo fifo
+ $ hg debugwalk fifo
+ fifo: unsupported file type (type is fifo)
+#endif
+
+ $ rm fenugreek
+ $ hg debugwalk fenugreek
+ f fenugreek fenugreek exact
+ $ hg rm fenugreek
+ $ hg debugwalk fenugreek
+ f fenugreek fenugreek exact
+ $ touch new
+ $ hg debugwalk new
+ f new new exact
+
+ $ mkdir ignored
+ $ touch ignored/file
+ $ echo '^ignored$' > .hgignore
+ $ hg debugwalk ignored
+ $ hg debugwalk ignored/file
+ f ignored/file ignored/file exact
+
+Test listfile and listfile0
+
+ $ python -c "file('listfile0', 'wb').write('fenugreek\0new\0')"
+ $ hg debugwalk -I 'listfile0:listfile0'
+ f fenugreek fenugreek
+ f new new
+ $ python -c "file('listfile', 'wb').write('fenugreek\nnew\r\nmammals/skunk\n')"
+ $ hg debugwalk -I 'listfile:listfile'
+ f fenugreek fenugreek
+ f mammals/skunk mammals/skunk
+ f new new
+
+ $ cd ..
+ $ hg debugwalk -R t t/mammals/skunk
+ f mammals/skunk t/mammals/skunk exact
+ $ mkdir t2
+ $ cd t2
+ $ hg debugwalk -R ../t ../t/mammals/skunk
+ f mammals/skunk ../t/mammals/skunk exact
+ $ hg debugwalk --cwd ../t mammals/skunk
+ f mammals/skunk mammals/skunk exact
+
+ $ cd ..
diff --git a/tests/test-walkrepo.py b/tests/test-walkrepo.py
new file mode 100644
index 0000000..bbeebd4
--- /dev/null
+++ b/tests/test-walkrepo.py
@@ -0,0 +1,55 @@
+import os
+from mercurial import hg, ui
+from mercurial.scmutil import walkrepos
+from mercurial.util import checklink
+from os import mkdir, chdir
+from os.path import join as pjoin
+
+u = ui.ui()
+sym = checklink('.')
+
+hg.repository(u, 'top1', create=1)
+mkdir('subdir')
+chdir('subdir')
+hg.repository(u, 'sub1', create=1)
+mkdir('subsubdir')
+chdir('subsubdir')
+hg.repository(u, 'subsub1', create=1)
+chdir(os.path.pardir)
+if sym:
+ os.symlink(os.path.pardir, 'circle')
+ os.symlink(pjoin('subsubdir', 'subsub1'), 'subsub1')
+
+def runtest():
+ reposet = frozenset(walkrepos('.', followsym=True))
+ if sym and (len(reposet) != 3):
+ print "reposet = %r" % (reposet,)
+ print ("Found %d repositories when I should have found 3"
+ % (len(reposet),))
+ if (not sym) and (len(reposet) != 2):
+ print "reposet = %r" % (reposet,)
+ print ("Found %d repositories when I should have found 2"
+ % (len(reposet),))
+ sub1set = frozenset((pjoin('.', 'sub1'),
+ pjoin('.', 'circle', 'subdir', 'sub1')))
+ if len(sub1set & reposet) != 1:
+ print "sub1set = %r" % (sub1set,)
+ print "reposet = %r" % (reposet,)
+ print "sub1set and reposet should have exactly one path in common."
+ sub2set = frozenset((pjoin('.', 'subsub1'),
+ pjoin('.', 'subsubdir', 'subsub1')))
+ if len(sub2set & reposet) != 1:
+ print "sub2set = %r" % (sub2set,)
+ print "reposet = %r" % (reposet,)
+ print "sub1set and reposet should have exactly one path in common."
+ sub3 = pjoin('.', 'circle', 'top1')
+ if sym and sub3 not in reposet:
+ print "reposet = %r" % (reposet,)
+ print "Symbolic links are supported and %s is not in reposet" % (sub3,)
+
+runtest()
+if sym:
+ # Simulate not having symlinks.
+ del os.path.samestat
+ sym = False
+ runtest()
diff --git a/tests/test-win32text.t b/tests/test-win32text.t
new file mode 100644
index 0000000..edbe842
--- /dev/null
+++ b/tests/test-win32text.t
@@ -0,0 +1,426 @@
+
+ $ hg init t
+ $ cd t
+ $ cat > unix2dos.py <<EOF
+ > import sys
+ >
+ > for path in sys.argv[1:]:
+ > data = file(path, 'rb').read()
+ > data = data.replace('\n', '\r\n')
+ > file(path, 'wb').write(data)
+ > EOF
+ $ echo '[hooks]' >> .hg/hgrc
+ $ echo 'pretxncommit.crlf = python:hgext.win32text.forbidcrlf' >> .hg/hgrc
+ $ echo 'pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf' >> .hg/hgrc
+ $ cat .hg/hgrc
+ [hooks]
+ pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+ pretxnchangegroup.crlf = python:hgext.win32text.forbidcrlf
+
+ $ echo hello > f
+ $ hg add f
+
+commit should succeed
+
+ $ hg ci -m 1
+
+ $ hg clone . ../zoz
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cp .hg/hgrc ../zoz/.hg
+ $ python unix2dos.py f
+
+commit should fail
+
+ $ hg ci -m 2.1
+ attempt to commit or push text file(s) using CRLF line endings
+ in f583ea08d42a: f
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.crlf hook failed
+ [255]
+
+ $ mv .hg/hgrc .hg/hgrc.bak
+
+commits should succeed
+
+ $ hg ci -m 2
+ $ hg cp f g
+ $ hg ci -m 2.2
+
+push should fail
+
+ $ hg push ../zoz
+ pushing to ../zoz
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ attempt to commit or push text file(s) using CRLF line endings
+ in bc2d09796734: g
+ in b1aa5cde7ff4: f
+
+ To prevent this mistake in your local repository,
+ add to Mercurial.ini or .hg/hgrc:
+
+ [hooks]
+ pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+
+ and also consider adding:
+
+ [extensions]
+ win32text =
+ [encode]
+ ** = cleverencode:
+ [decode]
+ ** = cleverdecode:
+ transaction abort!
+ rollback completed
+ abort: pretxnchangegroup.crlf hook failed
+ [255]
+
+ $ mv .hg/hgrc.bak .hg/hgrc
+ $ echo hello > f
+ $ hg rm g
+
+commit should succeed
+
+ $ hg ci -m 2.3
+
+push should succeed
+
+ $ hg push ../zoz
+ pushing to ../zoz
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 2 files
+
+and now for something completely different
+
+ $ mkdir d
+ $ echo hello > d/f2
+ $ python unix2dos.py d/f2
+ $ hg add d/f2
+ $ hg ci -m 3
+ attempt to commit or push text file(s) using CRLF line endings
+ in 053ba1a3035a: d/f2
+ transaction abort!
+ rollback completed
+ abort: pretxncommit.crlf hook failed
+ [255]
+ $ hg revert -a
+ forgetting d/f2 (glob)
+ $ rm d/f2
+
+ $ hg rem f
+ $ hg ci -m 4
+
+ $ python -c 'file("bin", "wb").write("hello\x00\x0D\x0A")'
+ $ hg add bin
+ $ hg ci -m 5
+ $ hg log -v
+ changeset: 5:f0b1c8d75fce
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: bin
+ description:
+ 5
+
+
+ changeset: 4:77796dbcd4ad
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 4
+
+
+ changeset: 3:7c1b5430b350
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f g
+ description:
+ 2.3
+
+
+ changeset: 2:bc2d09796734
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: g
+ description:
+ 2.2
+
+
+ changeset: 1:b1aa5cde7ff4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 2
+
+
+ changeset: 0:fcf06d5c4e1d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 1
+
+
+ $ hg clone . dupe
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ for x in a b c d; do echo content > dupe/$x; done
+ $ hg -R dupe add
+ adding dupe/a (glob)
+ adding dupe/b (glob)
+ adding dupe/c (glob)
+ adding dupe/d (glob)
+ $ python unix2dos.py dupe/b dupe/c dupe/d
+ $ hg -R dupe ci -m a dupe/a
+ $ hg -R dupe ci -m b/c dupe/[bc]
+ $ hg -R dupe ci -m d dupe/d
+ $ hg -R dupe log -v
+ changeset: 8:67ac5962ab43
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: d
+ description:
+ d
+
+
+ changeset: 7:68c127d1834e
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: b c
+ description:
+ b/c
+
+
+ changeset: 6:adbf8bf7f31d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: a
+ description:
+ a
+
+
+ changeset: 5:f0b1c8d75fce
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: bin
+ description:
+ 5
+
+
+ changeset: 4:77796dbcd4ad
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 4
+
+
+ changeset: 3:7c1b5430b350
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f g
+ description:
+ 2.3
+
+
+ changeset: 2:bc2d09796734
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: g
+ description:
+ 2.2
+
+
+ changeset: 1:b1aa5cde7ff4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 2
+
+
+ changeset: 0:fcf06d5c4e1d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 1
+
+
+ $ hg pull dupe
+ pulling from dupe
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 4 changes to 4 files
+ attempt to commit or push text file(s) using CRLF line endings
+ in 67ac5962ab43: d
+ in 68c127d1834e: b
+ in 68c127d1834e: c
+
+ To prevent this mistake in your local repository,
+ add to Mercurial.ini or .hg/hgrc:
+
+ [hooks]
+ pretxncommit.crlf = python:hgext.win32text.forbidcrlf
+
+ and also consider adding:
+
+ [extensions]
+ win32text =
+ [encode]
+ ** = cleverencode:
+ [decode]
+ ** = cleverdecode:
+ transaction abort!
+ rollback completed
+ abort: pretxnchangegroup.crlf hook failed
+ [255]
+
+ $ hg log -v
+ changeset: 5:f0b1c8d75fce
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: bin
+ description:
+ 5
+
+
+ changeset: 4:77796dbcd4ad
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 4
+
+
+ changeset: 3:7c1b5430b350
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f g
+ description:
+ 2.3
+
+
+ changeset: 2:bc2d09796734
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: g
+ description:
+ 2.2
+
+
+ changeset: 1:b1aa5cde7ff4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 2
+
+
+ changeset: 0:fcf06d5c4e1d
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ files: f
+ description:
+ 1
+
+
+ $ rm .hg/hgrc
+ $ (echo some; echo text) > f3
+ $ python -c 'file("f4.bat", "wb").write("rem empty\x0D\x0A")'
+ $ hg add f3 f4.bat
+ $ hg ci -m 6
+ $ cat bin
+ hello\x00\r (esc)
+ $ cat f3
+ some
+ text
+ $ cat f4.bat
+ rem empty\r (esc)
+
+ $ echo '[extensions]' >> .hg/hgrc
+ $ echo 'win32text = ' >> .hg/hgrc
+ $ echo '[decode]' >> .hg/hgrc
+ $ echo '** = cleverdecode:' >> .hg/hgrc
+ $ echo '[encode]' >> .hg/hgrc
+ $ echo '** = cleverencode:' >> .hg/hgrc
+ $ cat .hg/hgrc
+ [extensions]
+ win32text =
+ [decode]
+ ** = cleverdecode:
+ [encode]
+ ** = cleverencode:
+
+Trigger deprecation warning:
+
+ $ hg id -t
+ win32text is deprecated: http://mercurial.selenic.com/wiki/Win32TextExtension
+ tip
+
+Disable warning:
+
+ $ echo '[win32text]' >> .hg/hgrc
+ $ echo 'warn = no' >> .hg/hgrc
+ $ hg id -t
+ tip
+
+ $ rm f3 f4.bat bin
+ $ hg co -C
+ WARNING: f4.bat already has CRLF line endings
+ and does not need EOL conversion by the win32text plugin.
+ Before your next commit, please reconsider your encode/decode settings in
+ Mercurial.ini or $TESTTMP/t/.hg/hgrc. (glob)
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat bin
+ hello\x00\r (esc)
+ $ cat f3
+ some\r (esc)
+ text\r (esc)
+ $ cat f4.bat
+ rem empty\r (esc)
+
+ $ python -c 'file("f5.sh", "wb").write("# empty\x0D\x0A")'
+ $ hg add f5.sh
+ $ hg ci -m 7
+ $ cat f5.sh
+ # empty\r (esc)
+ $ hg cat f5.sh
+ # empty
+ $ echo '% just linefeed' > linefeed
+ $ hg ci -qAm 8 linefeed
+ $ cat linefeed
+ % just linefeed
+ $ hg cat linefeed
+ % just linefeed
+ $ hg st -q
+ $ hg revert -a linefeed
+ no changes needed to linefeed
+ $ cat linefeed
+ % just linefeed
+ $ hg st -q
+ $ echo modified >> linefeed
+ $ hg st -q
+ M linefeed
+ $ hg revert -a
+ reverting linefeed
+ $ hg st -q
+ $ cat linefeed
+ % just linefeed\r (esc)
+
+ $ cd ..
diff --git a/tests/test-wireproto.py b/tests/test-wireproto.py
new file mode 100644
index 0000000..82f7f0b
--- /dev/null
+++ b/tests/test-wireproto.py
@@ -0,0 +1,45 @@
+from mercurial import wireproto
+
+class proto(object):
+ def __init__(self, args):
+ self.args = args
+ def getargs(self, spec):
+ args = self.args
+ args.setdefault('*', {})
+ names = spec.split()
+ return [args[n] for n in names]
+
+class clientpeer(wireproto.wirepeer):
+ def __init__(self, serverrepo):
+ self.serverrepo = serverrepo
+ def _call(self, cmd, **args):
+ return wireproto.dispatch(self.serverrepo, proto(args), cmd)
+
+ @wireproto.batchable
+ def greet(self, name):
+ f = wireproto.future()
+ yield wireproto.todict(name=mangle(name)), f
+ yield unmangle(f.value)
+
+class serverrepo(object):
+ def greet(self, name):
+ return "Hello, " + name
+
+def mangle(s):
+ return ''.join(chr(ord(c) + 1) for c in s)
+def unmangle(s):
+ return ''.join(chr(ord(c) - 1) for c in s)
+
+def greet(repo, proto, name):
+ return mangle(repo.greet(unmangle(name)))
+
+wireproto.commands['greet'] = (greet, 'name',)
+
+srv = serverrepo()
+clt = clientpeer(srv)
+
+print clt.greet("Foobar")
+b = clt.batch()
+fs = [b.greet(s) for s in ["Fo, =;o", "Bar"]]
+b.submit()
+print [f.value for f in fs]
diff --git a/tests/test-wireproto.py.out b/tests/test-wireproto.py.out
new file mode 100644
index 0000000..348d247
--- /dev/null
+++ b/tests/test-wireproto.py.out
@@ -0,0 +1,2 @@
+Hello, Foobar
+['Hello, Fo, =;o', 'Hello, Bar']
diff --git a/tests/test-wireproto.t b/tests/test-wireproto.t
new file mode 100644
index 0000000..c8a81ea
--- /dev/null
+++ b/tests/test-wireproto.t
@@ -0,0 +1,114 @@
+ $ "$TESTDIR/hghave" serve || exit 80
+
+Test wire protocol argument passing
+
+Setup repo:
+
+ $ hg init repo
+
+Local:
+
+ $ hg debugwireargs repo eins zwei --three drei --four vier
+ eins zwei drei vier None
+ $ hg debugwireargs repo eins zwei --four vier
+ eins zwei None vier None
+ $ hg debugwireargs repo eins zwei
+ eins zwei None None None
+ $ hg debugwireargs repo eins zwei --five fuenf
+ eins zwei None None fuenf
+
+HTTP:
+
+ $ hg serve -R repo -p $HGPORT -d --pid-file=hg1.pid -E error.log -A access.log
+ $ cat hg1.pid >> $DAEMON_PIDS
+
+ $ hg debugwireargs http://localhost:$HGPORT/ un deux trois quatre
+ un deux trois quatre None
+ $ hg debugwireargs http://localhost:$HGPORT/ \ un deux trois\ qu\ \ atre
+ un deux trois qu atre None
+ $ hg debugwireargs http://localhost:$HGPORT/ eins zwei --four vier
+ eins zwei None vier None
+ $ hg debugwireargs http://localhost:$HGPORT/ eins zwei
+ eins zwei None None None
+ $ hg debugwireargs http://localhost:$HGPORT/ eins zwei --five fuenf
+ eins zwei None None None
+ $ hg debugwireargs http://localhost:$HGPORT/ un deux trois onethousandcharactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+ un deux trois onethousandcharactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx None
+ $ cat error.log
+ $ cat access.log
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=quatre&one=un&three=trois&two=deux (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=quatre&one=un&three=trois&two=deux (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=qu++atre&one=+un&three=trois+&two=deux (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=qu++atre&one=+un&three=trois+&two=deux (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=vier&one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=vier&one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:one=eins&two=zwei (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=onethousandcharactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&one x-hgarg-2:=un&three=trois&two=deux (glob)
+ * - - [*] "GET /?cmd=debugwireargs HTTP/1.1" 200 - x-hgarg-1:four=onethousandcharactersxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&one x-hgarg-2:=un&three=trois&two=deux (glob)
+
+HTTP without the httpheader capability:
+
+ $ HGRCPATH="`pwd`/repo/.hgrc"
+ $ export HGRCPATH
+ $ CAP=httpheader
+ $ . "$TESTDIR/notcapable"
+
+ $ hg serve -R repo -p $HGPORT2 -d --pid-file=hg2.pid -E error2.log -A access2.log
+ $ cat hg2.pid >> $DAEMON_PIDS
+
+ $ hg debugwireargs http://localhost:$HGPORT2/ un deux trois quatre
+ un deux trois quatre None
+ $ hg debugwireargs http://localhost:$HGPORT2/ eins zwei --four vier
+ eins zwei None vier None
+ $ hg debugwireargs http://localhost:$HGPORT2/ eins zwei
+ eins zwei None None None
+ $ hg debugwireargs http://localhost:$HGPORT2/ eins zwei --five fuenf
+ eins zwei None None None
+ $ cat error2.log
+ $ cat access2.log
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&four=quatre&one=un&three=trois&two=deux HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&four=quatre&one=un&three=trois&two=deux HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&four=vier&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&four=vier&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=debugwireargs&one=eins&two=zwei HTTP/1.1" 200 - (glob)
+
+SSH (try to exercise the ssh functionality with a dummy script):
+
+ $ cat <<EOF > dummyssh
+ > import sys
+ > import os
+ > os.chdir(os.path.dirname(sys.argv[0]))
+ > if sys.argv[1] != "user@dummy":
+ > sys.exit(-1)
+ > if not os.path.exists("dummyssh"):
+ > sys.exit(-1)
+ > os.environ["SSH_CLIENT"] = "127.0.0.1 1 2"
+ > r = os.system(sys.argv[2])
+ > sys.exit(bool(r))
+ > EOF
+
+ $ hg debugwireargs --ssh "python ./dummyssh" ssh://user@dummy/repo uno due tre quattro
+ uno due tre quattro None
+ $ hg debugwireargs --ssh "python ./dummyssh" ssh://user@dummy/repo eins zwei --four vier
+ eins zwei None vier None
+ $ hg debugwireargs --ssh "python ./dummyssh" ssh://user@dummy/repo eins zwei
+ eins zwei None None None
+ $ hg debugwireargs --ssh "python ./dummyssh" ssh://user@dummy/repo eins zwei --five fuenf
+ eins zwei None None None
+
diff --git a/tests/tinyproxy.py b/tests/tinyproxy.py
new file mode 100755
index 0000000..044eba2
--- /dev/null
+++ b/tests/tinyproxy.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+
+__doc__ = """Tiny HTTP Proxy.
+
+This module implements GET, HEAD, POST, PUT and DELETE methods
+on BaseHTTPServer, and behaves as an HTTP proxy. The CONNECT
+method is also implemented experimentally, but has not been
+tested yet.
+
+Any help will be greatly appreciated. SUZUKI Hisao
+"""
+
+__version__ = "0.2.1"
+
+import BaseHTTPServer, select, socket, SocketServer, urlparse, os
+
+class ProxyHandler (BaseHTTPServer.BaseHTTPRequestHandler):
+ __base = BaseHTTPServer.BaseHTTPRequestHandler
+ __base_handle = __base.handle
+
+ server_version = "TinyHTTPProxy/" + __version__
+ rbufsize = 0 # self.rfile Be unbuffered
+
+ def handle(self):
+ (ip, port) = self.client_address
+ allowed = getattr(self, 'allowed_clients', None)
+ if allowed is not None and ip not in allowed:
+ self.raw_requestline = self.rfile.readline()
+ if self.parse_request():
+ self.send_error(403)
+ else:
+ self.__base_handle()
+
+ def log_request(self, code='-', size='-'):
+ xheaders = [h for h in self.headers.items() if h[0].startswith('x-')]
+ self.log_message('"%s" %s %s%s',
+ self.requestline, str(code), str(size),
+ ''.join([' %s:%s' % h for h in sorted(xheaders)]))
+
+ def _connect_to(self, netloc, soc):
+ i = netloc.find(':')
+ if i >= 0:
+ host_port = netloc[:i], int(netloc[i + 1:])
+ else:
+ host_port = netloc, 80
+ print "\t" "connect to %s:%d" % host_port
+ try: soc.connect(host_port)
+ except socket.error, arg:
+ try: msg = arg[1]
+ except (IndexError, TypeError): msg = arg
+ self.send_error(404, msg)
+ return 0
+ return 1
+
+ def do_CONNECT(self):
+ soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ if self._connect_to(self.path, soc):
+ self.log_request(200)
+ self.wfile.write(self.protocol_version +
+ " 200 Connection established\r\n")
+ self.wfile.write("Proxy-agent: %s\r\n" % self.version_string())
+ self.wfile.write("\r\n")
+ self._read_write(soc, 300)
+ finally:
+ print "\t" "bye"
+ soc.close()
+ self.connection.close()
+
+ def do_GET(self):
+ (scm, netloc, path, params, query, fragment) = urlparse.urlparse(
+ self.path, 'http')
+ if scm != 'http' or fragment or not netloc:
+ self.send_error(400, "bad url %s" % self.path)
+ return
+ soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ try:
+ if self._connect_to(netloc, soc):
+ self.log_request()
+ soc.send("%s %s %s\r\n" % (
+ self.command,
+ urlparse.urlunparse(('', '', path, params, query, '')),
+ self.request_version))
+ self.headers['Connection'] = 'close'
+ del self.headers['Proxy-Connection']
+ for key_val in self.headers.items():
+ soc.send("%s: %s\r\n" % key_val)
+ soc.send("\r\n")
+ self._read_write(soc)
+ finally:
+ print "\t" "bye"
+ soc.close()
+ self.connection.close()
+
+ def _read_write(self, soc, max_idling=20):
+ iw = [self.connection, soc]
+ ow = []
+ count = 0
+ while True:
+ count += 1
+ (ins, _, exs) = select.select(iw, ow, iw, 3)
+ if exs:
+ break
+ if ins:
+ for i in ins:
+ if i is soc:
+ out = self.connection
+ else:
+ out = soc
+ data = i.recv(8192)
+ if data:
+ out.send(data)
+ count = 0
+ else:
+ print "\t" "idle", count
+ if count == max_idling:
+ break
+
+ do_HEAD = do_GET
+ do_POST = do_GET
+ do_PUT = do_GET
+ do_DELETE = do_GET
+
+class ThreadingHTTPServer (SocketServer.ThreadingMixIn,
+ BaseHTTPServer.HTTPServer):
+ def __init__(self, *args, **kwargs):
+ BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
+ a = open("proxy.pid", "w")
+ a.write(str(os.getpid()) + "\n")
+ a.close()
+
+if __name__ == '__main__':
+ from sys import argv
+ if argv[1:] and argv[1] in ('-h', '--help'):
+ print argv[0], "[port [allowed_client_name ...]]"
+ else:
+ if argv[2:]:
+ allowed = []
+ for name in argv[2:]:
+ client = socket.gethostbyname(name)
+ allowed.append(client)
+ print "Accept: %s (%s)" % (client, name)
+ ProxyHandler.allowed_clients = allowed
+ del argv[2:]
+ else:
+ print "Any clients will be served..."
+ BaseHTTPServer.test(ProxyHandler, ThreadingHTTPServer)